diff --git a/src/parser.c b/src/parser.c index 699bdb6..40e264f 100644 --- a/src/parser.c +++ b/src/parser.c @@ -36,8 +36,8 @@ void calcluateAddressFormat(a64inst_instruction *instr, char *operandList[], in char *offsetParam = strdup(operandList[2]); offsetParam++; instr->data.SingleTransferData.processOpData.singleDataTransferData.a64inst_addressingModeData.indexedOffset = strtol(operandList[2], endptr, 10); - } else if( (strcmp(operandList[2][0], "x") == 0) - || (strcmp(operandList[2][0], "w") == 0)){ + } else if( (isOperandRegister(operandList[2][0], "x") == 1) + || (isOperandRegister(operandList[2][0], "w") == 1)){ //register instr->data.SingleTransferData.processOpData.singleDataTransferData.addressingMode = a64inst_REGISTER_OFFSET; char *offsetRegister = strdup(operandList[2]); @@ -53,7 +53,6 @@ void calcluateAddressFormat(a64inst_instruction *instr, char *operandList[], in instr->data.SingleTransferData.processOpData.singleDataTransferData.a64inst_addressingModeData.unsignedOffset = offset/8; } else { instr->data.SingleTransferData.processOpData.singleDataTransferData.a64inst_addressingModeData.unsignedOffset = offset/4; - } } } @@ -218,6 +217,27 @@ a64inst_instruction *parser(char asmLine[]){ int operandCount = 0; const char *operandList[4]; tokeniseOperands(operands, &operandCount, operandList, &numOperands); + classifyOpcode(opcode, instr, operandList, operandCount); + switch(instr->type){ + case a64inst_BRANCH: + generateBranchOperands(instr, opcode, operandList); + break; + case a64inst_SINGLETRANSFER: + generateLoadStoreOperands(instr, opcode, operandList, numOperands); + break; + case a64inst_LOADLITERAL: + generateLoadStoreOperands(instr, opcode, operandList, numOperands); + break; + case a64inst_DPREGISTER: + //generate DP operands; + break; + case a64inst_DPIMMEDIATE: + //generate DP operands; + break; + default: + printf("INVALID INSTRUCTION"); + break; + } }