From c52de918db2d1f0c842055b95624dae63da4fad5 Mon Sep 17 00:00:00 2001 From: EDiasAlberto Date: Wed, 12 Jun 2024 20:22:08 +0100 Subject: [PATCH] build struct for loadstore instructions --- src/parser.c | 57 +++++++++++++++++++++++++++------------------------- 1 file changed, 30 insertions(+), 27 deletions(-) diff --git a/src/parser.c b/src/parser.c index 682373d..8696230 100644 --- a/src/parser.c +++ b/src/parser.c @@ -34,34 +34,32 @@ int isOperandRegister(char regStartChar){ //calculate offsets from string void calcluateAddressFormat(a64inst_instruction *instr, char *operandList[], int numOperands){ - char *endptr; char baseRegParam[strlen(operandList[1])]; strcpy(baseRegParam, operandList[1]); char *startptr = &baseRegParam[1]; int base = getOperandNumber(startptr); instr->data.SingleTransferData.processOpData.singleDataTransferData.base = base; - if(operandList[2][strlen(operandList[2])-1] == '!'){ + if(operandList[2][strlen(operandList[2])-2] == '!'){ instr->data.SingleTransferData.processOpData.singleDataTransferData.addressingMode = a64inst_PRE_INDEXED; - instr->data.SingleTransferData.processOpData.singleDataTransferData.a64inst_addressingModeData.indexedOffset = strtol(&(operandList[2][1]), &endptr, 10); - } else if(operandList[1][strlen(operandList[1])-1] == ']') { + instr->data.SingleTransferData.processOpData.singleDataTransferData.a64inst_addressingModeData.indexedOffset = getOperandNumber(operandList[2]); + } else if(operandList[1][strlen(operandList[1])-2] == ']') { //post-indexed + char immOffset[strlen(operandList[2])+1]; + strcpy(immOffset, operandList[2]); instr->data.SingleTransferData.processOpData.singleDataTransferData.addressingMode = a64inst_POST_INDEXED; - instr->data.SingleTransferData.processOpData.singleDataTransferData.a64inst_addressingModeData.indexedOffset = strtol(&(operandList[2][1]), &endptr, 10); + instr->data.SingleTransferData.processOpData.singleDataTransferData.a64inst_addressingModeData.indexedOffset = getOperandNumber(immOffset); } else if( (isOperandRegister(operandList[1][0]) == 1) || (isOperandRegister(operandList[2][0]) == 1)){ //register instr->data.SingleTransferData.processOpData.singleDataTransferData.addressingMode = a64inst_REGISTER_OFFSET; - instr->data.SingleTransferData.processOpData.singleDataTransferData.a64inst_addressingModeData.offsetReg = strtol(&(operandList[2][1]), &endptr, 10); + instr->data.SingleTransferData.processOpData.singleDataTransferData.a64inst_addressingModeData.offsetReg = getOperandNumber(operandList[2]); } else { instr->data.SingleTransferData.processOpData.singleDataTransferData.addressingMode = a64inst_UNSIGNED_OFFSET; if(numOperands==3){ - int offset = strtol(&(operandList[2][1]), &endptr, 10); - if(instr->data.SingleTransferData.regType == 1){ - instr->data.SingleTransferData.processOpData.singleDataTransferData.a64inst_addressingModeData.unsignedOffset = offset/8; - } else { - instr->data.SingleTransferData.processOpData.singleDataTransferData.a64inst_addressingModeData.unsignedOffset = offset/4; - } + int offset = getOperandNumber(operandList[2]); + instr->data.SingleTransferData.processOpData.singleDataTransferData.a64inst_addressingModeData.unsignedOffset = offset/8; + //NEED TO SCALE IMMEDIATE VALUE BASED ON REGISTER TYPE IN ASSEMBLER } } } @@ -79,6 +77,19 @@ void generateLoadStoreOperands(a64inst_instruction *instr, char *opcode, char *o break; } case a64inst_LOADLITERAL: + if(operandList[0][0] == 'x') { + instr->data.SingleTransferData.regType = 1; + } else { + instr->data.SingleTransferData.regType = 0; + } + instr->data.SingleTransferData.target = getOperandNumber(operandList[0]); + if(operandList[1][0] =='#'){ + //offset is immediate + int offset = getOperandNumber(operandList[1]); + instr->data.SingleTransferData.processOpData.loadLiteralData.offset = offset; + } else { + //offset is literal, use symbol table and calculate difference + } break; default: break; @@ -87,7 +98,6 @@ void generateLoadStoreOperands(a64inst_instruction *instr, char *opcode, char *o } void generateBranchOperands(a64inst_instruction *instr, char* opcode, char *operandList[]){ - char *endptr; switch(instr->data.BranchData.BranchType){ case a64inst_UNCONDITIONAL: //define and sign extend immediate offset @@ -95,7 +105,7 @@ void generateBranchOperands(a64inst_instruction *instr, char* opcode, char *oper printf("unconditional"); break; case a64inst_REGISTER: - instr->data.BranchData.processOpData.registerData.src = strtol(operandList[0] + 1, &endptr, 10); + instr->data.BranchData.processOpData.registerData.src = getOperandNumber(operandList[0]); break; case a64inst_CONDITIONAL: { @@ -138,10 +148,10 @@ void classifyOpcode(char* opcode, a64inst_instruction *instr, char *operandList[ isRegister == 0 || strncmp(opcode, "b.", 2) == 0){ instr->type = a64inst_BRANCH; - if(isUnconditional){ - instr->data.BranchData.BranchType = a64inst_UNCONDITIONAL; - } else if (isRegister){ + if(isRegister == 0){ instr->data.BranchData.BranchType = a64inst_REGISTER; + } else if (isUnconditional == 0){ + instr->data.BranchData.BranchType = a64inst_UNCONDITIONAL; } else { instr->data.BranchData.BranchType = a64inst_CONDITIONAL; } @@ -152,19 +162,12 @@ void classifyOpcode(char* opcode, a64inst_instruction *instr, char *operandList[ instr->type = a64inst_SINGLETRANSFER; instr->data.SingleTransferData.SingleTransferOpType = a64inst_SINGLE_TRANSFER_SINGLE_DATA_TRANSFER; if(isLoad == 0){ - instr->data.SingleTransferData.processOpData.singleDataTransferData.transferType = a64inst_STORE; - } else { instr->data.SingleTransferData.processOpData.singleDataTransferData.transferType = a64inst_LOAD; + } else { + instr->data.SingleTransferData.processOpData.singleDataTransferData.transferType = a64inst_STORE; } } else { instr->type = a64inst_LOADLITERAL; - if(operandList[0][0] =='#'){ - //offset is immediate - int offset = getOperandNumber(operandList[0]); - instr->data.SingleTransferData.processOpData.loadLiteralData.offset = offset; - } else { - //offset is literal, use symbol table and calculate difference - } } } else { @@ -190,7 +193,7 @@ void tokeniseOperands(char* str, int *operandCount, char *operands[], int *numOp operand = strtok(NULL, OPERAND_DELIMITER); operands[*(operandCount)] = operand; } - *(numOperands) = *(operandCount)+1; + *(numOperands) = *(operandCount); } //takes inputted assembly line and returns a