calculate base register from input
This commit is contained in:
parent
34060c3fad
commit
04dda33987
15
src/parser.c
15
src/parser.c
@ -18,14 +18,21 @@
|
||||
|
||||
//calculate offsets from string
|
||||
void calcluateAddressFormat(a64inst_instruction *instr, char *operandList[]){
|
||||
char *baseRegister = operandList[1];
|
||||
baseRegister++;
|
||||
baseRegister++;
|
||||
char *endptr;
|
||||
uint8_t base = strtol(baseRegister, endptr, 10);
|
||||
instr->data.SingleTransferData.processOpData.singleDataTransferData.base = base;
|
||||
|
||||
if(strcmp(operandList[2][strlen(operandList[1])-1], "!")==0){
|
||||
instr->data.SingleTransferData.processOpData.singleDataTransferData.addressingMode = a64inst_PRE_INDEXED;
|
||||
|
||||
} else if(strcmp(operandList[1][strlen(operandList[0])-1], "]") == 0) {
|
||||
//post-indexed
|
||||
instr->data.SingleTransferData.processOpData.singleDataTransferData.addressingMode = a64inst_POST_INDEXED;
|
||||
} else if( (strcmp(operandList[2][strlen(operandList[1])-1], "x") == 0)
|
||||
|| (strcmp(operandList[2][strlen(operandList[1])-1], "w") == 0)){
|
||||
} else if( (strcmp(operandList[2][0], "x") == 0)
|
||||
|| (strcmp(operandList[2][0], "w") == 0)){
|
||||
//register
|
||||
instr->data.SingleTransferData.processOpData.singleDataTransferData.processOpData.addressingMode = a64inst_REGISTER_OFFSET;
|
||||
} else {
|
||||
@ -43,7 +50,7 @@ void generateLoadStoreOperands(a64inst_instruction *instr, char *opcode, char *o
|
||||
instr->data.SingleTransferData.regType = 0;
|
||||
}
|
||||
char *endptr;
|
||||
instr->data.SingleTransferData.target = strtol(operandList[0][0]+1, endptr, 2);
|
||||
instr->data.SingleTransferData.target = strtol(operandList[0][0]+1, endptr, 10);
|
||||
calcluateAddressFormat(instr, operandList);
|
||||
break;
|
||||
case a64inst_LOADLITERAL:
|
||||
@ -60,7 +67,7 @@ void generateBranchOperands(a64inst_instruction *instr, char* opcode, char *oper
|
||||
break;
|
||||
case a64inst_REGISTER:
|
||||
char *endptr;
|
||||
instr->data.BranchData.processOpData.registerData.src = strtol(operandList[0] + 1, endptr, 2)
|
||||
instr->data.BranchData.processOpData.registerData.src = strtol(operandList[0] + 1, endptr, 10)
|
||||
break;
|
||||
case a64inst_CONDITIONAL:
|
||||
char* condition = strtok(strdup(opcode), "b.");
|
||||
|
||||
Loading…
Reference in New Issue
Block a user