diff --git a/src/parser.c b/src/parser.c index 6083cef..16fbdc1 100644 --- a/src/parser.c +++ b/src/parser.c @@ -23,6 +23,7 @@ static const char *WIDE_MOV_OPCODES[] = {"movn", "movz", "movz", "movk"}; static const char *ARITHMETIC_OPCODES[] = {"add", "adds", "sub", "subs"}; static const char *MULTIPLY_OPCODES[] = {"mul", "madd", "msub", "mneg"}; static const char *SHIFT_TYPE_OPCODES[] = {"lsl", "lsr", "asr", "ror"}; +static const char *LOGIC_OPCODES[] = {"and", "ands", "bic", "bics", "eor", "eon", "orr", "orn"}; a64inst_instruction *parse(char **asmLines, int lineCount) { a64inst_instruction *instructions = malloc(sizeof(a64inst_instruction) * lineCount); @@ -349,7 +350,52 @@ void parseDPRegister(a64inst_instruction *inst, char *tokens[], int tokensCount) } else { // Logic - + int opcodeCategory = indexStringIn(tokens[0], LOGIC_OPCODES, 8); + switch(opcodeCategory/2){ + case 0: + //and + if((tokens[0][strlen(tokens[0])-1]) == 's'){ + data->processOp = 3; + } else { + data->processOp = 0; + } + data->processOpData.arithmLogicData.negShiftedSrc2 = 0; + break; + case 1: + //negated AND + if((tokens[0][strlen(tokens[0])-1]) == 's'){ + data->processOp = 3; + } else { + data->processOp = 0; + } + data->processOpData.arithmLogicData.negShiftedSrc2 = 1; + break; + case 2: + //XOR + data->processOp = 2; + if(opcodeCategory==4){ + data->processOpData.arithmLogicData.negShiftedSrc2 = 0; + } else { + data->processOpData.arithmLogicData.negShiftedSrc2 = 1; + } + break; + case 3: + //OR + data->processOp = 1; + if(opcodeCategory==6){ + data->processOpData.arithmLogicData.negShiftedSrc2 = 0; + } else { + data->processOpData.arithmLogicData.negShiftedSrc2 = 1; + } + break; + } + if(tokensCount == 5) { + //has a shift + int numTokens = 0; + char **shiftOperands = tokenise(tokens[4], &numTokens); + data->processOpData.arithmLogicData.shiftType = indexStringIn(shiftOperands[0], SHIFT_TYPE_OPCODES, 4); + data->processOpData.arithmLogicData.shiftAmount = getOperandNumber(shiftOperands[1]); + } } } }