DPR multiplication

This commit is contained in:
GDBWNV 2024-06-12 17:39:37 +01:00
parent 18df8e0fe4
commit b8f3ded0af

View File

@ -174,6 +174,49 @@ void classifyOpcode(char* opcode, a64inst_instruction *instr, char *operandList[
} else { } else {
if(classifyDPInst(operandList)){ if(classifyDPInst(operandList)){
instr->type = a64inst_DPREGISTER; 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 { } else {
instr->type = a64inst_DPIMMEDIATE; instr->type = a64inst_DPIMMEDIATE;
a64inst_DPImmediateData data = instr->data.DPImmediateData; a64inst_DPImmediateData data = instr->data.DPImmediateData;