corrections to arithmetic DPI

This commit is contained in:
GDBWNV 2024-06-12 17:13:48 +01:00
parent f5dabe26b2
commit 31b5174b20

View File

@ -178,8 +178,6 @@ void classifyOpcode(char* opcode, a64inst_instruction *instr, char *operandList[
instr->type = a64inst_DPIMMEDIATE; instr->type = a64inst_DPIMMEDIATE;
a64inst_DPImmediateData data = instr->data.DPImmediateData; a64inst_DPImmediateData data = instr->data.DPImmediateData;
char t = operandList[0][0]; char t = operandList[0][0];
int reg = getOperandNumber(operandList[0]);
data.dest=reg;
if (t == 'w') { if (t == 'w') {
data.regType=0; data.regType=0;
} }
@ -190,6 +188,7 @@ void classifyOpcode(char* opcode, a64inst_instruction *instr, char *operandList[
// add, adds // add, adds
if (opcode[1] == 'd') { if (opcode[1] == 'd') {
data.DPIOpType = 0; data.DPIOpType = 0;
data.dest = getOperandNumber(operandList[0]);
data.processOpData.arithmData.src = getOperandNumber(operandList[1]); data.processOpData.arithmData.src = getOperandNumber(operandList[1]);
data.processOpData.arithmData.immediate = getOperandNumber(operandList[2]); data.processOpData.arithmData.immediate = getOperandNumber(operandList[2]);
if (opcode[-1] == 's') { if (opcode[-1] == 's') {
@ -204,7 +203,8 @@ void classifyOpcode(char* opcode, a64inst_instruction *instr, char *operandList[
// cmn // cmn
else if (opcode == "cmn") { else if (opcode == "cmn") {
data.DPIOpType = 0; data.DPIOpType = 0;
data.processOpData.arithmData.src = ZERO_REGISTER; data.dest = ZERO_REGISTER;
data.processOpData.arithmData.src = getOperandNumber(operandList[0]);
data.processOpData.arithmData.immediate = getOperandNumber(operandList[1]); data.processOpData.arithmData.immediate = getOperandNumber(operandList[1]);
data.processOpData.arithmData.shiftImmediate = true; data.processOpData.arithmData.shiftImmediate = true;
data.processOp = 1; data.processOp = 1;
@ -212,6 +212,7 @@ void classifyOpcode(char* opcode, a64inst_instruction *instr, char *operandList[
// sub, subs // sub, subs
else if (opcode[0] == 's') { else if (opcode[0] == 's') {
data.DPIOpType = 0; data.DPIOpType = 0;
data.dest = getOperandNumber(operandList[0]);
data.processOpData.arithmData.src = getOperandNumber(operandList[1]); data.processOpData.arithmData.src = getOperandNumber(operandList[1]);
data.processOpData.arithmData.immediate = getOperandNumber(operandList[2]); data.processOpData.arithmData.immediate = getOperandNumber(operandList[2]);
if (opcode[-1] == 's') { if (opcode[-1] == 's') {
@ -226,11 +227,27 @@ void classifyOpcode(char* opcode, a64inst_instruction *instr, char *operandList[
// cmp // cmp
else if (opcode == 'cmp') { else if (opcode == 'cmp') {
data.DPIOpType = 0; data.DPIOpType = 0;
data.processOpData.arithmData.src = ZERO_REGISTER; data.dest = ZERO_REGISTER;
data.processOpData.arithmData.src = getOperandNumber(operandList[0]);
data.processOpData.arithmData.immediate = getOperandNumber(operandList[1]); data.processOpData.arithmData.immediate = getOperandNumber(operandList[1]);
data.processOpData.arithmData.shiftImmediate = true; data.processOpData.arithmData.shiftImmediate = true;
data.processOp = 3; data.processOp = 3;
} }
// neg, negs
else if (opcode[0] == 'n') {
data.DPIOpType = 0;
data.dest = getOperandNumber(operandList[1]);
data.processOpData.arithmData.src = ZERO_REGISTER;
data.processOpData.arithmData.immediate = getOperandNumber(operandList[2]);
if (opcode[-1] == 's') {
data.processOpData.arithmData.shiftImmediate = true;
data.processOp = 3;
}
else {
data.processOpData.arithmData.shiftImmediate = false;
data.processOp = 2;
}
}
// wide move // wide move
} }