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); +}