diff --git a/src/parser.c b/src/parser.c index 0cdccb5..c5bc66f 100644 --- a/src/parser.c +++ b/src/parser.c @@ -178,8 +178,6 @@ void classifyOpcode(char* opcode, a64inst_instruction *instr, char *operandList[ instr->type = a64inst_DPIMMEDIATE; a64inst_DPImmediateData data = instr->data.DPImmediateData; char t = operandList[0][0]; - int reg = getOperandNumber(operandList[0]); - data.dest=reg; if (t == 'w') { data.regType=0; } @@ -190,6 +188,7 @@ void classifyOpcode(char* opcode, a64inst_instruction *instr, char *operandList[ // add, adds if (opcode[1] == 'd') { data.DPIOpType = 0; + data.dest = getOperandNumber(operandList[0]); data.processOpData.arithmData.src = getOperandNumber(operandList[1]); data.processOpData.arithmData.immediate = getOperandNumber(operandList[2]); if (opcode[-1] == 's') { @@ -204,7 +203,8 @@ void classifyOpcode(char* opcode, a64inst_instruction *instr, char *operandList[ // cmn else if (opcode == "cmn") { 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.shiftImmediate = true; data.processOp = 1; @@ -212,6 +212,7 @@ void classifyOpcode(char* opcode, a64inst_instruction *instr, char *operandList[ // sub, subs else if (opcode[0] == 's') { data.DPIOpType = 0; + data.dest = getOperandNumber(operandList[0]); data.processOpData.arithmData.src = getOperandNumber(operandList[1]); data.processOpData.arithmData.immediate = getOperandNumber(operandList[2]); if (opcode[-1] == 's') { @@ -226,11 +227,27 @@ void classifyOpcode(char* opcode, a64inst_instruction *instr, char *operandList[ // cmp else if (opcode == 'cmp') { 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.shiftImmediate = true; 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 }