From ae763f1ade0fecc40c838b44232be57faa1761e7 Mon Sep 17 00:00:00 2001 From: Luke Date: Mon, 7 Jun 2021 19:16:04 +0100 Subject: [PATCH] LibJS: Add bytecode ops for &, | and ^ --- .../Libraries/LibJS/Bytecode/ASTCodegen.cpp | 9 +++ .../Libraries/LibJS/Bytecode/Instruction.h | 5 +- Userland/Libraries/LibJS/Bytecode/Op.cpp | 30 ++++++++++ Userland/Libraries/LibJS/Bytecode/Op.h | 57 +++++++++++++++++++ 4 files changed, 100 insertions(+), 1 deletion(-) diff --git a/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp b/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp index 7e21322583b..0bfe99bef96 100644 --- a/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp +++ b/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp @@ -79,6 +79,15 @@ Optional BinaryExpression::generate_bytecode(Bytecode::Gener case BinaryOp::AbstractEquals: generator.emit(dst_reg, *lhs_reg, *rhs_reg); return dst_reg; + case BinaryOp::BitwiseAnd: + generator.emit(dst_reg, *lhs_reg, *rhs_reg); + return dst_reg; + case BinaryOp::BitwiseOr: + generator.emit(dst_reg, *lhs_reg, *rhs_reg); + return dst_reg; + case BinaryOp::BitwiseXor: + generator.emit(dst_reg, *lhs_reg, *rhs_reg); + return dst_reg; default: TODO(); } diff --git a/Userland/Libraries/LibJS/Bytecode/Instruction.h b/Userland/Libraries/LibJS/Bytecode/Instruction.h index f38d6d03e60..ccf58871e07 100644 --- a/Userland/Libraries/LibJS/Bytecode/Instruction.h +++ b/Userland/Libraries/LibJS/Bytecode/Instruction.h @@ -34,7 +34,10 @@ O(JumpIfTrue) \ O(Call) \ O(EnterScope) \ - O(Return) + O(Return) \ + O(BitwiseAnd) \ + O(BitwiseOr) \ + O(BitwiseXor) namespace JS::Bytecode { diff --git a/Userland/Libraries/LibJS/Bytecode/Op.cpp b/Userland/Libraries/LibJS/Bytecode/Op.cpp index 9ca9dac5b51..711ce8a3c63 100644 --- a/Userland/Libraries/LibJS/Bytecode/Op.cpp +++ b/Userland/Libraries/LibJS/Bytecode/Op.cpp @@ -112,6 +112,21 @@ void AbstractEquals::execute(Bytecode::Interpreter& interpreter) const interpreter.reg(m_dst) = Value(abstract_eq(interpreter.global_object(), interpreter.reg(m_src1), interpreter.reg(m_src2))); } +void BitwiseAnd::execute(Bytecode::Interpreter& interpreter) const +{ + interpreter.reg(m_dst) = Value(bitwise_and(interpreter.global_object(), interpreter.reg(m_src1), interpreter.reg(m_src2))); +} + +void BitwiseOr::execute(Bytecode::Interpreter& interpreter) const +{ + interpreter.reg(m_dst) = Value(bitwise_or(interpreter.global_object(), interpreter.reg(m_src1), interpreter.reg(m_src2))); +} + +void BitwiseXor::execute(Bytecode::Interpreter& interpreter) const +{ + interpreter.reg(m_dst) = Value(bitwise_xor(interpreter.global_object(), interpreter.reg(m_src1), interpreter.reg(m_src2))); +} + void NewString::execute(Bytecode::Interpreter& interpreter) const { interpreter.reg(m_dst) = js_string(interpreter.vm(), m_string); @@ -278,6 +293,21 @@ String AbstractEquals::to_string() const return String::formatted("AbstractEquals dst:{}, src1:{}, src2:{}", m_dst, m_src1, m_src2); } +String BitwiseAnd::to_string() const +{ + return String::formatted("BitwiseAnd dst:{}, src1:{}, src2:{}", m_dst, m_src1, m_src2); +} + +String BitwiseOr::to_string() const +{ + return String::formatted("BitwiseOr dst:{}, src1:{}, src2:{}", m_dst, m_src1, m_src2); +} + +String BitwiseXor::to_string() const +{ + return String::formatted("BitwiseXor dst:{}, src1:{}, src2:{}", m_dst, m_src1, m_src2); +} + String NewString::to_string() const { return String::formatted("NewString dst:{}, string:\"{}\"", m_dst, m_string); diff --git a/Userland/Libraries/LibJS/Bytecode/Op.h b/Userland/Libraries/LibJS/Bytecode/Op.h index 127e3085bfc..f153440c3fb 100644 --- a/Userland/Libraries/LibJS/Bytecode/Op.h +++ b/Userland/Libraries/LibJS/Bytecode/Op.h @@ -260,6 +260,63 @@ private: Register m_src2; }; +class BitwiseAnd final : public Instruction { +public: + BitwiseAnd(Register dst, Register src1, Register src2) + : Instruction(Type::BitwiseAnd) + , m_dst(dst) + , m_src1(src1) + , m_src2(src2) + { + } + + void execute(Bytecode::Interpreter&) const; + String to_string() const; + +private: + Register m_dst; + Register m_src1; + Register m_src2; +}; + +class BitwiseOr final : public Instruction { +public: + BitwiseOr(Register dst, Register src1, Register src2) + : Instruction(Type::BitwiseOr) + , m_dst(dst) + , m_src1(src1) + , m_src2(src2) + { + } + + void execute(Bytecode::Interpreter&) const; + String to_string() const; + +private: + Register m_dst; + Register m_src1; + Register m_src2; +}; + +class BitwiseXor final : public Instruction { +public: + BitwiseXor(Register dst, Register src1, Register src2) + : Instruction(Type::BitwiseXor) + , m_dst(dst) + , m_src1(src1) + , m_src2(src2) + { + } + + void execute(Bytecode::Interpreter&) const; + String to_string() const; + +private: + Register m_dst; + Register m_src1; + Register m_src2; +}; + class NewString final : public Instruction { public: NewString(Register dst, String string)