begin formulating parser pipeline
This commit is contained in:
parent
4098ea5a5f
commit
44bb327b7d
26
src/parser.c
26
src/parser.c
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user