From 379dedc6ce4dfeaeef3c5287a904025e7fe33bdb Mon Sep 17 00:00:00 2001 From: sBubshait Date: Wed, 5 Jun 2024 20:25:47 +0100 Subject: [PATCH] Add execution of Multiply DP Register Instructions, w/ T --- src/execute.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/execute.c b/src/execute.c index 42846b3..9edeb74 100644 --- a/src/execute.c +++ b/src/execute.c @@ -17,6 +17,7 @@ // Prototypes void execute_SDT(Machine *state, a64inst_instruction *inst); void execute_Branch(Machine *state, a64inst_instruction *inst); +void executeMultiply(Machine *state, a64inst_instruction *inst); // Return maximum of two dwords static dword max(dword a, dword b) { @@ -328,7 +329,10 @@ void execute(Machine *state, a64inst_instruction *inst) { // Execute a data processing register instruction case a64inst_DPREGISTER: - executeDPRegister(state, inst); + if (inst->data.DPRegisterData.DPROpType == a64inst_DPR_MULTIPLY) + executeMultiply(state, inst); + else + executeDPRegister(state, inst); break; case a64inst_SINGLETRANSFER: @@ -426,3 +430,9 @@ void execute_Branch(Machine *state, a64inst_instruction *inst) { break; } } + +void executeMultiply(Machine *state, a64inst_instruction *inst) { + dword product = state->registers[inst->data.DPRegisterData.src1] * state->registers[inst->data.DPRegisterData.src2]; + dword sum = readRegister(state, inst->data.DPRegisterData.processOpData.multiplydata.summand, inst->data.DPRegisterData.regType) + (inst->data.DPRegisterData.processOpData.multiplydata.negProd ? -product : product); + writeRegister(state, inst->data.DPRegisterData.dest, inst->data.DPRegisterData.regType, sum); +}