From b8f3ded0af912a46caf19a0798df61ced4e51647 Mon Sep 17 00:00:00 2001 From: GDBWNV <93523315+GDBWNV@users.noreply.github.com> Date: Wed, 12 Jun 2024 17:39:37 +0100 Subject: [PATCH] DPR multiplication --- src/parser.c | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/src/parser.c b/src/parser.c index 2d71001..9f3cc21 100644 --- a/src/parser.c +++ b/src/parser.c @@ -174,6 +174,49 @@ void classifyOpcode(char* opcode, a64inst_instruction *instr, char *operandList[ } else { if(classifyDPInst(operandList)){ instr->type = a64inst_DPREGISTER; + a64inst_DPRegisterData data = instr->data.DPRegisterData; + char t = operandList[0][0]; + if (t == 'w') { + data.regType=0; + } + else { + data.regType=1; + } + // multiply + // mul, mneg, madd, msub + if (opcode[0] == 'm') { + data.DPROpType = 1; + data.dest = getOperandNumber(operandList[0]); + data.src1 = getOperandNumber(operandList[1]); + data.src2 = getOperandNumber(operandList[2]); + switch (opcode[1]) { + // madd + case 'a': + data.processOpData.multiplydata.summand = getOperandNumber(operandList[3]); + data.processOpData.multiplydata.negProd = false; + break; + // mneg + case 'n': + data.processOpData.multiplydata.summand = ZERO_REGISTER; + data.processOpData.multiplydata.negProd = true; + break; + // msub + case 's': + data.processOpData.multiplydata.summand = getOperandNumber(operandList[3]); + data.processOpData.multiplydata.negProd = true; + break; + // mul + default: + data.processOpData.multiplydata.summand = ZERO_REGISTER; + data.processOpData.multiplydata.negProd = false; + break; + } + } + // arithmlogic + else { + + } + } else { instr->type = a64inst_DPIMMEDIATE; a64inst_DPImmediateData data = instr->data.DPImmediateData;