diff --git a/src/parser.c b/src/parser.c index c3167f1..ba00c26 100644 --- a/src/parser.c +++ b/src/parser.c @@ -14,6 +14,36 @@ // - count operands and match type/values // - 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[]){ switch(instr->data.BranchType){ case a64inst_UNCONDITIONAL: