Update parser to correctly classify branch types
This commit is contained in:
parent
f41c7cc749
commit
ffa798b266
27
src/parser.c
27
src/parser.c
@ -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]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user