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)
// - count operands and match type/values
// - generate final a64inst and return
// - CREATE FUNC TO TIDY UP OPERANDS IN DP
//calculate offsets from string
void calcluateAddressFormat(a64inst_instruction *instr, char *operandList[]){
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) {
//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)
|| (strcmp(operandList[2][strlen(operandList[1])-1], "w") == 0)){
//register
instr->data.SingleTransferData.singleDataTransferData.processOpData.addressingMode = a64inst_REGISTER_OFFSET;
instr->data.SingleTransferData.processOpData.singleDataTransferData.processOpData.addressingMode = a64inst_REGISTER_OFFSET;
} 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;
case a64inst_REGISTER:
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;
case a64inst_CONDITIONAL:
char* condition = strtok(strdup(opcode), "b.");
condition = strtok(NULL, "");
if(strcmp(condition, "eq")==0){
instr->data.branchData.processOpData.cond = EQ;
instr->data.branchData.processOpData.conditionalData.cond = EQ;
} 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){
instr->data.branchData.processOpData.cond = GE;
instr->data.branchData.processOpData.conditionalData.cond = GE;
} 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){
instr->data.branchData.processOpData.cond = GT;
instr->data.branchData.processOpData.conditionalData.cond = GT;
} 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){
instr->data.branchData.processOpData.cond = AL;
instr->data.branchData.processOpData.conditionalData.cond = AL;
}
break;
//calculate offset from symbol table.