fix hierarchy of struct access in parser
This commit is contained in:
parent
1fa33798bf
commit
34060c3fad
25
src/parser.c
25
src/parser.c
@ -14,21 +14,22 @@
|
|||||||
// - match opcode to a64 struct types (DONE)
|
// - match opcode to a64 struct types (DONE)
|
||||||
// - count operands and match type/values
|
// - count operands and match type/values
|
||||||
// - generate final a64inst and return
|
// - generate final a64inst and return
|
||||||
|
// - CREATE FUNC TO TIDY UP OPERANDS IN DP
|
||||||
|
|
||||||
//calculate offsets from string
|
//calculate offsets from string
|
||||||
void calcluateAddressFormat(a64inst_instruction *instr, char *operandList[]){
|
void calcluateAddressFormat(a64inst_instruction *instr, char *operandList[]){
|
||||||
|
|
||||||
if(strcmp(operandList[2][strlen(operandList[1])-1], "!")==0){
|
if(strcmp(operandList[2][strlen(operandList[1])-1], "!")==0){
|
||||||
instr->data.processOpData.addressingMode = a64inst_PRE_INDEXED;
|
instr->data.SingleTransferData.processOpData.singleDataTransferData.addressingMode = a64inst_PRE_INDEXED;
|
||||||
} else if(strcmp(operandList[1][strlen(operandList[0])-1], "]") == 0) {
|
} else if(strcmp(operandList[1][strlen(operandList[0])-1], "]") == 0) {
|
||||||
//post-indexed
|
//post-indexed
|
||||||
instr->data.processOpData.addressingMode = a64inst_POST_INDEXED;
|
instr->data.SingleTransferData.processOpData.singleDataTransferData.addressingMode = a64inst_POST_INDEXED;
|
||||||
} else if( (strcmp(operandList[2][strlen(operandList[1])-1], "x") == 0)
|
} else if( (strcmp(operandList[2][strlen(operandList[1])-1], "x") == 0)
|
||||||
|| (strcmp(operandList[2][strlen(operandList[1])-1], "w") == 0)){
|
|| (strcmp(operandList[2][strlen(operandList[1])-1], "w") == 0)){
|
||||||
//register
|
//register
|
||||||
instr->data.SingleTransferData.singleDataTransferData.processOpData.addressingMode = a64inst_REGISTER_OFFSET;
|
instr->data.SingleTransferData.processOpData.singleDataTransferData.processOpData.addressingMode = a64inst_REGISTER_OFFSET;
|
||||||
} else {
|
} else {
|
||||||
instr->data.processOpData.addressingMode = a64inst_UNSIGNED_OFFSET;
|
instr->data.SingleTransferData.processOpData.singleDataTransferData.addressingMode = a64inst_UNSIGNED_OFFSET;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -59,25 +60,25 @@ void generateBranchOperands(a64inst_instruction *instr, char* opcode, char *oper
|
|||||||
break;
|
break;
|
||||||
case a64inst_REGISTER:
|
case a64inst_REGISTER:
|
||||||
char *endptr;
|
char *endptr;
|
||||||
instr->data.BranchData.processOpData.src = strtol(operandList[0] + 1, endptr, 2)
|
instr->data.BranchData.processOpData.registerData.src = strtol(operandList[0] + 1, endptr, 2)
|
||||||
break;
|
break;
|
||||||
case a64inst_CONDITIONAL:
|
case a64inst_CONDITIONAL:
|
||||||
char* condition = strtok(strdup(opcode), "b.");
|
char* condition = strtok(strdup(opcode), "b.");
|
||||||
condition = strtok(NULL, "");
|
condition = strtok(NULL, "");
|
||||||
if(strcmp(condition, "eq")==0){
|
if(strcmp(condition, "eq")==0){
|
||||||
instr->data.branchData.processOpData.cond = EQ;
|
instr->data.branchData.processOpData.conditionalData.cond = EQ;
|
||||||
} else if (strcmp(condition, "ne")==0){
|
} else if (strcmp(condition, "ne")==0){
|
||||||
instr->data.branchData.processOpData.cond = NE;
|
instr->data.branchData.processOpData.conditionalData.cond = NE;
|
||||||
} else if (strcmp(condition, "ge")==0){
|
} else if (strcmp(condition, "ge")==0){
|
||||||
instr->data.branchData.processOpData.cond = GE;
|
instr->data.branchData.processOpData.conditionalData.cond = GE;
|
||||||
} else if (strcmp(condition, "lt")==0){
|
} else if (strcmp(condition, "lt")==0){
|
||||||
instr->data.branchData.processOpData.cond = LT;
|
instr->data.branchData.processOpData.conditionalData.cond = LT;
|
||||||
} else if (strcmp(condition, "gt")==0){
|
} else if (strcmp(condition, "gt")==0){
|
||||||
instr->data.branchData.processOpData.cond = GT;
|
instr->data.branchData.processOpData.conditionalData.cond = GT;
|
||||||
} else if (strcmp(condition, "le")==0){
|
} else if (strcmp(condition, "le")==0){
|
||||||
instr->data.branchData.processOpData.cond = LE;
|
instr->data.branchData.processOpData.conditionalData.cond = LE;
|
||||||
} else if (srtcmp(condition, "al")==0){
|
} else if (srtcmp(condition, "al")==0){
|
||||||
instr->data.branchData.processOpData.cond = AL;
|
instr->data.branchData.processOpData.conditionalData.cond = AL;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
//calculate offset from symbol table.
|
//calculate offset from symbol table.
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user