Add execution of Multiply DP Register Instructions, w/ T

This commit is contained in:
sBubshait 2024-06-05 20:25:47 +01:00
parent 9ea494acfc
commit 379dedc6ce

View File

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