fix dpregister to construct IR
This commit is contained in:
parent
228bfec612
commit
6bd993b29e
48
src/parser.c
48
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]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user