Update parser to correctly classify branch types

This commit is contained in:
sBubshait 2024-06-14 21:01:51 +01:00
parent f41c7cc749
commit ffa798b266

View File

@ -269,29 +269,28 @@ void calculateAddressFormat(a64inst_instruction *instr, char *tokens[], int tok
instr->data.SingleTransferData.processOpData.singleDataTransferData.base = baseRegister; instr->data.SingleTransferData.processOpData.singleDataTransferData.base = baseRegister;
if(unsplitString[strlen(unsplitString)-1] == '!') { if (tokenCount >= 4) {
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
instr->data.SingleTransferData.processOpData.singleDataTransferData.addressingMode = a64inst_POST_INDEXED; instr->data.SingleTransferData.processOpData.singleDataTransferData.addressingMode = a64inst_POST_INDEXED;
instr->data.SingleTransferData.processOpData.singleDataTransferData.a64inst_addressingModeData.indexedOffset = getOperandNumber(tokens[3]); 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; instr->data.SingleTransferData.processOpData.singleDataTransferData.addressingMode = a64inst_UNSIGNED_OFFSET;
if(operandCount > 1){ if(operandCount > 1){
int offset = getOperandNumber(operands[1]); int offset = getOperandNumber(operands[1]);
instr->data.SingleTransferData.processOpData.singleDataTransferData.a64inst_addressingModeData.unsignedOffset = offset/8; instr->data.SingleTransferData.processOpData.singleDataTransferData.a64inst_addressingModeData.unsignedOffset = offset/8;
//NEED TO SCALE IMMEDIATE VALUE BASED ON REGISTER TYPE IN ASSEMBLER //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]);
}
} }
} }