From 2b9fbd10ed7cec26aafae01fee803bce23b83b27 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Thu, 3 Jun 2021 18:32:33 +0200 Subject: [PATCH] LibJS: Add Sub bytecode instruction (subtract values) --- Userland/Libraries/LibJS/AST.cpp | 9 ++++++--- Userland/Libraries/LibJS/Bytecode/Op.cpp | 10 ++++++++++ Userland/Libraries/LibJS/Bytecode/Op.h | 19 +++++++++++++++++++ 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/Userland/Libraries/LibJS/AST.cpp b/Userland/Libraries/LibJS/AST.cpp index fdd9bc60d0e..505cc5f8c11 100644 --- a/Userland/Libraries/LibJS/AST.cpp +++ b/Userland/Libraries/LibJS/AST.cpp @@ -2264,12 +2264,15 @@ Optional BinaryExpression::generate_bytecode(Bytecode::Gener VERIFY(lhs_reg.has_value()); VERIFY(rhs_reg.has_value()); + auto dst_reg = generator.allocate_register(); + switch (m_op) { - case BinaryOp::Addition: { - auto dst_reg = generator.allocate_register(); + case BinaryOp::Addition: generator.emit(dst_reg, *lhs_reg, *rhs_reg); return dst_reg; - } + case BinaryOp::Subtraction: + generator.emit(dst_reg, *lhs_reg, *rhs_reg); + return dst_reg; default: TODO(); } diff --git a/Userland/Libraries/LibJS/Bytecode/Op.cpp b/Userland/Libraries/LibJS/Bytecode/Op.cpp index b1feea00e4e..570bcff1122 100644 --- a/Userland/Libraries/LibJS/Bytecode/Op.cpp +++ b/Userland/Libraries/LibJS/Bytecode/Op.cpp @@ -21,6 +21,11 @@ void Add::execute(Bytecode::Interpreter& interpreter) const interpreter.reg(m_dst) = add(interpreter.global_object(), interpreter.reg(m_src1), interpreter.reg(m_src2)); } +void Sub::execute(Bytecode::Interpreter& interpreter) const +{ + interpreter.reg(m_dst) = sub(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); @@ -46,6 +51,11 @@ String Add::to_string() const return String::formatted("Add dst:{}, src1:{}, src2:{}", m_dst, m_src1, m_src2); } +String Sub::to_string() const +{ + return String::formatted("Sub 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 77f46f2a762..93fc9514834 100644 --- a/Userland/Libraries/LibJS/Bytecode/Op.h +++ b/Userland/Libraries/LibJS/Bytecode/Op.h @@ -50,6 +50,25 @@ private: Register m_src2; }; +class Sub final : public Instruction { +public: + Sub(Register dst, Register src1, Register src2) + : m_dst(dst) + , m_src1(src1) + , m_src2(src2) + { + } + + virtual ~Sub() override { } + virtual void execute(Bytecode::Interpreter&) const override; + virtual String to_string() const override; + +private: + Register m_dst; + Register m_src1; + Register m_src2; +}; + class NewString final : public Instruction { public: NewString(Register dst, String string)