diff --git a/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp b/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp index 1f682453ab..4a1a00c0db 100644 --- a/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp +++ b/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp @@ -99,6 +99,15 @@ Optional BinaryExpression::generate_bytecode(Bytecode::Gener case BinaryOp::BitwiseXor: generator.emit(dst_reg, *lhs_reg, *rhs_reg); return dst_reg; + case BinaryOp::LeftShift: + generator.emit(dst_reg, *lhs_reg, *rhs_reg); + return dst_reg; + case BinaryOp::RightShift: + generator.emit(dst_reg, *lhs_reg, *rhs_reg); + return dst_reg; + case BinaryOp::UnsignedRightShift: + 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 1f40091ff2..87863be573 100644 --- a/Userland/Libraries/LibJS/Bytecode/Instruction.h +++ b/Userland/Libraries/LibJS/Bytecode/Instruction.h @@ -44,7 +44,10 @@ O(Not) \ O(UnaryPlus) \ O(UnaryMinus) \ - O(Typeof) + O(Typeof) \ + O(LeftShift) \ + O(RightShift) \ + O(UnsignedRightShift) namespace JS::Bytecode { diff --git a/Userland/Libraries/LibJS/Bytecode/Op.cpp b/Userland/Libraries/LibJS/Bytecode/Op.cpp index b2fea825fd..c15da0073b 100644 --- a/Userland/Libraries/LibJS/Bytecode/Op.cpp +++ b/Userland/Libraries/LibJS/Bytecode/Op.cpp @@ -142,6 +142,21 @@ void BitwiseNot::execute(Bytecode::Interpreter& interpreter) const interpreter.reg(m_dst) = bitwise_not(interpreter.global_object(), interpreter.reg(m_src)); } +void LeftShift::execute(Bytecode::Interpreter& interpreter) const +{ + interpreter.reg(m_dst) = left_shift(interpreter.global_object(), interpreter.reg(m_src1), interpreter.reg(m_src2)); +} + +void RightShift::execute(Bytecode::Interpreter& interpreter) const +{ + interpreter.reg(m_dst) = right_shift(interpreter.global_object(), interpreter.reg(m_src1), interpreter.reg(m_src2)); +} + +void UnsignedRightShift::execute(Bytecode::Interpreter& interpreter) const +{ + interpreter.reg(m_dst) = unsigned_right_shift(interpreter.global_object(), interpreter.reg(m_src1), interpreter.reg(m_src2)); +} + void Not::execute(Bytecode::Interpreter& interpreter) const { interpreter.reg(m_dst) = Value(!interpreter.reg(m_src).to_boolean()); @@ -354,6 +369,21 @@ String BitwiseXor::to_string() const return String::formatted("BitwiseXor dst:{}, src1:{}, src2:{}", m_dst, m_src1, m_src2); } +String LeftShift::to_string() const +{ + return String::formatted("LeftShift dst:{}, src1:{}, src2:{}", m_dst, m_src1, m_src2); +} + +String RightShift::to_string() const +{ + return String::formatted("RightShift dst:{}, src1:{}, src2:{}", m_dst, m_src1, m_src2); +} + +String UnsignedRightShift::to_string() const +{ + return String::formatted("UnsignedRightShift dst:{}, src1:{}, src2:{}", m_dst, m_src1, m_src2); +} + String BitwiseNot::to_string() const { return String::formatted("BitwiseNot dst:{}, src:{}", m_dst, m_src); diff --git a/Userland/Libraries/LibJS/Bytecode/Op.h b/Userland/Libraries/LibJS/Bytecode/Op.h index 3a4ad9236a..1d2bbe656f 100644 --- a/Userland/Libraries/LibJS/Bytecode/Op.h +++ b/Userland/Libraries/LibJS/Bytecode/Op.h @@ -355,6 +355,63 @@ private: Register m_src2; }; +class LeftShift final : public Instruction { +public: + LeftShift(Register dst, Register src1, Register src2) + : Instruction(Type::LeftShift) + , 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 RightShift final : public Instruction { +public: + RightShift(Register dst, Register src1, Register src2) + : Instruction(Type::RightShift) + , 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 UnsignedRightShift final : public Instruction { +public: + UnsignedRightShift(Register dst, Register src1, Register src2) + : Instruction(Type::UnsignedRightShift) + , 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 BitwiseNot final : public Instruction { public: BitwiseNot(Register dst, Register src)