From c4a98361b15f1ef8d6143e00154866d6513b48be Mon Sep 17 00:00:00 2001 From: WeebDataHoarder <57538841+weebdatahoarder@users.noreply.github.com> Date: Tue, 3 Aug 2021 17:54:27 +0200 Subject: [PATCH] Implement XOR (without offsets) --- src/instructions/Instruction.cpp | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/instructions/Instruction.cpp b/src/instructions/Instruction.cpp index 7aeda5e..4e932c3 100644 --- a/src/instructions/Instruction.cpp +++ b/src/instructions/Instruction.cpp @@ -111,6 +111,35 @@ namespace Instruction { return std::move(i); }); + //XOR P1, P2 = A, P3 = B + addOperator("XOR", 3, [](const parseOperatorResult &op, const std::vector &tokens) -> std::unique_ptr { + if(op.offset1 != 0){ + throw std::runtime_error("XOR cannot use addressing offsets"); + } + auto c = std::make_unique("XOR op = a + b - (a & b) - (a & b)"); + + /* + * Non-offset version + * AND S1, A, B + * ADD S0, A, B + * SUB S0, S0, S1 + * SUB P1, S0, S1 + */ + + if(tokens.at(2).getType() == Token::Type::Immediate){ + c->addInstruction(std::make_unique(Calc::Operation::AND, 0, (uint32_t) MgmtRegisters::std_SCRATCH_1, tokens.at(1).getNumericValue(), tokens.at(2).getNumericValue()), "XOR, s1 = a & b"); + c->addInstruction(std::make_unique(Calc::Operation::ADD, 0, (uint32_t) MgmtRegisters::std_SCRATCH_0, tokens.at(1).getNumericValue(), tokens.at(2).getNumericValue()), "XOR, s0 = a + b"); + }else{ + c->addInstruction(std::make_unique(Calc::Operation::AND, 0, (uint32_t) MgmtRegisters::std_SCRATCH_1, tokens.at(1).getNumericValue(), tokens.at(2).getNumericValue()), "XOR, s1 = a & b"); + c->addInstruction(std::make_unique(Calc::Operation::ADD, 0, (uint32_t) MgmtRegisters::std_SCRATCH_0, tokens.at(1).getNumericValue(), tokens.at(2).getNumericValue()), "XOR, s0 = a + b"); + } + + c->addInstruction(std::make_unique(Calc::Operation::SUB, 0, (uint32_t) MgmtRegisters::std_SCRATCH_0, (uint32_t) MgmtRegisters::std_SCRATCH_0, (uint32_t) MgmtRegisters::std_SCRATCH_1), "XOR, s0 = s0 - s1"); + c->addInstruction(std::make_unique(Calc::Operation::SUB, 0, tokens.at(0).getNumericValue(), (uint32_t) MgmtRegisters::std_SCRATCH_0, (uint32_t) MgmtRegisters::std_SCRATCH_1), "XOR, result = s0 - s1"); + + return std::move(c); + }); + addOperator("AND", 3, CalcImm::fromAndTokens); addOperator("OR", 3, CalcImm::fromOrTokens);