From ffa798b2663d944ae9a9e2dcae4d33807c2e45e8 Mon Sep 17 00:00:00 2001 From: sBubshait Date: Fri, 14 Jun 2024 21:01:51 +0100 Subject: [PATCH] Update parser to correctly classify branch types --- src/parser.c | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/src/parser.c b/src/parser.c index daa2519..2ffc104 100644 --- a/src/parser.c +++ b/src/parser.c @@ -269,30 +269,29 @@ void calculateAddressFormat(a64inst_instruction *instr, char *tokens[], int tok instr->data.SingleTransferData.processOpData.singleDataTransferData.base = baseRegister; - if(unsplitString[strlen(unsplitString)-1] == '!') { - instr->data.SingleTransferData.processOpData.singleDataTransferData.addressingMode = a64inst_PRE_INDEXED; - instr->data.SingleTransferData.processOpData.singleDataTransferData.a64inst_addressingModeData.indexedOffset = getOperandNumber(operands[1]); - - } else if(operandCount==2) { - if((isOperandRegister(*operands[0]) == 1) - && (isOperandRegister(*operands[1]) == 1)){ - //register - instr->data.SingleTransferData.processOpData.singleDataTransferData.addressingMode = a64inst_REGISTER_OFFSET; - instr->data.SingleTransferData.processOpData.singleDataTransferData.a64inst_addressingModeData.offsetReg = getOperandNumber(operands[1]); - } - } else if(unsplitString[strlen(unsplitString)-1] == ']') { - // POST_INDEXED + if (tokenCount >= 4) { instr->data.SingleTransferData.processOpData.singleDataTransferData.addressingMode = a64inst_POST_INDEXED; instr->data.SingleTransferData.processOpData.singleDataTransferData.a64inst_addressingModeData.indexedOffset = getOperandNumber(tokens[3]); - } else { + } else if(unsplitString[strlen(unsplitString)-1] == '!') { + instr->data.SingleTransferData.processOpData.singleDataTransferData.addressingMode = a64inst_PRE_INDEXED; + instr->data.SingleTransferData.processOpData.singleDataTransferData.a64inst_addressingModeData.indexedOffset = getOperandNumber(operands[1]); + + } else if (operandCount == 1 || (!isOperandRegister(*operands[1]))) { instr->data.SingleTransferData.processOpData.singleDataTransferData.addressingMode = a64inst_UNSIGNED_OFFSET; if(operandCount > 1){ int offset = getOperandNumber(operands[1]); instr->data.SingleTransferData.processOpData.singleDataTransferData.a64inst_addressingModeData.unsignedOffset = offset/8; //NEED TO SCALE IMMEDIATE VALUE BASED ON REGISTER TYPE IN ASSEMBLER } - } + } else { + if((isOperandRegister(*operands[0]) == 1) + && (isOperandRegister(*operands[1]) == 1)){ + //register + instr->data.SingleTransferData.processOpData.singleDataTransferData.addressingMode = a64inst_REGISTER_OFFSET; + instr->data.SingleTransferData.processOpData.singleDataTransferData.a64inst_addressingModeData.offsetReg = getOperandNumber(operands[1]); + } + } } static int parseRegisterType(char *operand) {