fix hierarchy of struct access in parser

This commit is contained in:
EDiasAlberto 2024-06-06 17:54:35 +01:00
parent 1fa33798bf
commit 34060c3fad

View File

@ -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.