classify load store addressing type

This commit is contained in:
EDiasAlberto 2024-06-06 14:14:10 +01:00
parent b93ab76b82
commit 1011d7be71

View File

@ -14,6 +14,36 @@
// - count operands and match type/values // - count operands and match type/values
// - generate final a64inst and return // - generate final a64inst and return
void calcluateAddressFormat(a64inst_instruction *instr, char *operandList[]){
if(strcmp(operandList[0][strlen(operandList[0])-1], "{") == 0) {
//unsigned immediate offset
instr->data.processOpData.addressingMode = a64inst_UNSIGNED_OFFSET;
} else if(strcmp(operandList[0][strlen(operandList[0])-1], "]") == 0) {
//post-indexed
instr->data.processOpData.addressingMode = a64inst_POST_INDEXED;
} else {
//check second operand to distinguish between pre-indexed and register
if(strcmp(operandList[1][0], "#")==0){
//pre-indexed
instr->data.processOpData.addressingMode = a64inst_PRE_INDEXED;
} else {
//register
instr->data.processOpData.addressingMode = a64inst_REGISTER_OFFSET;
}
}
}
void generateLoadStoreOperands(a64inst_instruction *instr, char *opcode, char *operandList[]){
switch(instr->data.type){
case a64inst_SINGLETRANSFER:
calcluateAddressFormat(instr, operandList);
break;
case a64inst_LOADLITERAL:
break;
}
}
void generateBranchOperands(a64inst_instruction *instr, char* opcode, char *operandList[]){ void generateBranchOperands(a64inst_instruction *instr, char* opcode, char *operandList[]){
switch(instr->data.BranchType){ switch(instr->data.BranchType){
case a64inst_UNCONDITIONAL: case a64inst_UNCONDITIONAL: