begin formulating parser pipeline

This commit is contained in:
EDiasAlberto 2024-06-09 22:54:27 +01:00
parent 4098ea5a5f
commit 44bb327b7d

View File

@ -36,8 +36,8 @@ void calcluateAddressFormat(a64inst_instruction *instr, char *operandList[], in
char *offsetParam = strdup(operandList[2]); char *offsetParam = strdup(operandList[2]);
offsetParam++; offsetParam++;
instr->data.SingleTransferData.processOpData.singleDataTransferData.a64inst_addressingModeData.indexedOffset = strtol(operandList[2], endptr, 10); instr->data.SingleTransferData.processOpData.singleDataTransferData.a64inst_addressingModeData.indexedOffset = strtol(operandList[2], endptr, 10);
} else if( (strcmp(operandList[2][0], "x") == 0) } else if( (isOperandRegister(operandList[2][0], "x") == 1)
|| (strcmp(operandList[2][0], "w") == 0)){ || (isOperandRegister(operandList[2][0], "w") == 1)){
//register //register
instr->data.SingleTransferData.processOpData.singleDataTransferData.addressingMode = a64inst_REGISTER_OFFSET; instr->data.SingleTransferData.processOpData.singleDataTransferData.addressingMode = a64inst_REGISTER_OFFSET;
char *offsetRegister = strdup(operandList[2]); 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; instr->data.SingleTransferData.processOpData.singleDataTransferData.a64inst_addressingModeData.unsignedOffset = offset/8;
} else { } else {
instr->data.SingleTransferData.processOpData.singleDataTransferData.a64inst_addressingModeData.unsignedOffset = offset/4; instr->data.SingleTransferData.processOpData.singleDataTransferData.a64inst_addressingModeData.unsignedOffset = offset/4;
} }
} }
} }
@ -218,6 +217,27 @@ a64inst_instruction *parser(char asmLine[]){
int operandCount = 0; int operandCount = 0;
const char *operandList[4]; const char *operandList[4];
tokeniseOperands(operands, &operandCount, operandList, &numOperands); 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;
}
} }