From 28b38f4a80b70c41e45fd46fdad886f1a17ed037 Mon Sep 17 00:00:00 2001 From: GDBWNV <93523315+GDBWNV@users.noreply.github.com> Date: Wed, 12 Jun 2024 16:31:09 +0100 Subject: [PATCH 1/8] small update, sync helper function --- src/parser.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/parser.c b/src/parser.c index 97eef8d..75df4a9 100644 --- a/src/parser.c +++ b/src/parser.c @@ -176,6 +176,25 @@ void classifyOpcode(char* opcode, a64inst_instruction *instr, char *operandList[ instr->type = a64inst_DPREGISTER; } else { instr->type = a64inst_DPIMMEDIATE; + a64inst_DPImmediateData data = instr->data.DPImmediateData; + char t = operandList[0][0]; + char *immOffset = NULL; + immOffset = strcpy(immOffset, operandList[0]); + immOffset++; + char *endptr = NULL; + int reg = strtol(immOffset, &endptr, 10); + data.dest=reg; + if (t == 'w') { + data.regType=0; + } + else { + data.regType=1; + } + // add + if (opcode[1] == 'd') { + data.DPIOpType = 0; + + } } } From 3290896f6e975caf1e25091ead0bac252ec5909f Mon Sep 17 00:00:00 2001 From: GDBWNV <93523315+GDBWNV@users.noreply.github.com> Date: Wed, 12 Jun 2024 16:55:30 +0100 Subject: [PATCH 2/8] add, adds, cmn --- src/parser.c | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/src/parser.c b/src/parser.c index 75df4a9..a11766e 100644 --- a/src/parser.c +++ b/src/parser.c @@ -178,11 +178,7 @@ void classifyOpcode(char* opcode, a64inst_instruction *instr, char *operandList[ instr->type = a64inst_DPIMMEDIATE; a64inst_DPImmediateData data = instr->data.DPImmediateData; char t = operandList[0][0]; - char *immOffset = NULL; - immOffset = strcpy(immOffset, operandList[0]); - immOffset++; - char *endptr = NULL; - int reg = strtol(immOffset, &endptr, 10); + int reg = getOperandNumber(operandList[0]); data.dest=reg; if (t == 'w') { data.regType=0; @@ -190,10 +186,25 @@ void classifyOpcode(char* opcode, a64inst_instruction *instr, char *operandList[ else { data.regType=1; } - // add + // add, adds if (opcode[1] == 'd') { data.DPIOpType = 0; - + data.processOpData.arithmData.src = getOperandNumber(operandList[1]); + data.processOpData.arithmData.immediate = getOperandNumber(operandList[2]); + if (opcode[-1] == 's') { + data.processOpData.arithmData.shiftImmediate = true; + + } + else { + data.processOpData.arithmData.shiftImmediate = false; + } + } + // cmn + else if (opcode == "cmn") { + data.DPIOpType = 0; + data.processOpData.arithmData.src = ZERO_REGISTER; + data.processOpData.arithmData.immediate = getOperandNumber(operandList[1]); + data.processOpData.arithmData.shiftImmediate = true; } } From f5dabe26b2d7a7449e1f95d0af1503d4ebb8fb92 Mon Sep 17 00:00:00 2001 From: GDBWNV <93523315+GDBWNV@users.noreply.github.com> Date: Wed, 12 Jun 2024 17:06:20 +0100 Subject: [PATCH 3/8] DPI arithmetic --- src/parser.c | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/parser.c b/src/parser.c index a11766e..0cdccb5 100644 --- a/src/parser.c +++ b/src/parser.c @@ -186,6 +186,7 @@ void classifyOpcode(char* opcode, a64inst_instruction *instr, char *operandList[ else { data.regType=1; } + // arithmetic // add, adds if (opcode[1] == 'd') { data.DPIOpType = 0; @@ -193,10 +194,11 @@ void classifyOpcode(char* opcode, a64inst_instruction *instr, char *operandList[ data.processOpData.arithmData.immediate = getOperandNumber(operandList[2]); if (opcode[-1] == 's') { data.processOpData.arithmData.shiftImmediate = true; - + data.processOp = 1; } else { data.processOpData.arithmData.shiftImmediate = false; + data.processOp = 0; } } // cmn @@ -205,7 +207,31 @@ void classifyOpcode(char* opcode, a64inst_instruction *instr, char *operandList[ data.processOpData.arithmData.src = ZERO_REGISTER; data.processOpData.arithmData.immediate = getOperandNumber(operandList[1]); data.processOpData.arithmData.shiftImmediate = true; + data.processOp = 1; } + // sub, subs + else if (opcode[0] == 's') { + data.DPIOpType = 0; + data.processOpData.arithmData.src = getOperandNumber(operandList[1]); + data.processOpData.arithmData.immediate = getOperandNumber(operandList[2]); + if (opcode[-1] == 's') { + data.processOpData.arithmData.shiftImmediate = true; + data.processOp = 3; + } + else { + data.processOpData.arithmData.shiftImmediate = false; + data.processOp = 2; + } + } + // cmp + else if (opcode == 'cmp') { + data.DPIOpType = 0; + data.processOpData.arithmData.src = ZERO_REGISTER; + data.processOpData.arithmData.immediate = getOperandNumber(operandList[1]); + data.processOpData.arithmData.shiftImmediate = true; + data.processOp = 3; + } + // wide move } } From 31b5174b20ffc36f76495cea2f7b36bb0a36c60e Mon Sep 17 00:00:00 2001 From: GDBWNV <93523315+GDBWNV@users.noreply.github.com> Date: Wed, 12 Jun 2024 17:13:48 +0100 Subject: [PATCH 4/8] corrections to arithmetic DPI --- src/parser.c | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/src/parser.c b/src/parser.c index 0cdccb5..c5bc66f 100644 --- a/src/parser.c +++ b/src/parser.c @@ -178,8 +178,6 @@ void classifyOpcode(char* opcode, a64inst_instruction *instr, char *operandList[ instr->type = a64inst_DPIMMEDIATE; a64inst_DPImmediateData data = instr->data.DPImmediateData; char t = operandList[0][0]; - int reg = getOperandNumber(operandList[0]); - data.dest=reg; if (t == 'w') { data.regType=0; } @@ -190,6 +188,7 @@ void classifyOpcode(char* opcode, a64inst_instruction *instr, char *operandList[ // add, adds if (opcode[1] == 'd') { data.DPIOpType = 0; + data.dest = getOperandNumber(operandList[0]); data.processOpData.arithmData.src = getOperandNumber(operandList[1]); data.processOpData.arithmData.immediate = getOperandNumber(operandList[2]); if (opcode[-1] == 's') { @@ -204,7 +203,8 @@ void classifyOpcode(char* opcode, a64inst_instruction *instr, char *operandList[ // cmn else if (opcode == "cmn") { data.DPIOpType = 0; - data.processOpData.arithmData.src = ZERO_REGISTER; + data.dest = ZERO_REGISTER; + data.processOpData.arithmData.src = getOperandNumber(operandList[0]); data.processOpData.arithmData.immediate = getOperandNumber(operandList[1]); data.processOpData.arithmData.shiftImmediate = true; data.processOp = 1; @@ -212,6 +212,7 @@ void classifyOpcode(char* opcode, a64inst_instruction *instr, char *operandList[ // sub, subs else if (opcode[0] == 's') { data.DPIOpType = 0; + data.dest = getOperandNumber(operandList[0]); data.processOpData.arithmData.src = getOperandNumber(operandList[1]); data.processOpData.arithmData.immediate = getOperandNumber(operandList[2]); if (opcode[-1] == 's') { @@ -226,11 +227,27 @@ void classifyOpcode(char* opcode, a64inst_instruction *instr, char *operandList[ // cmp else if (opcode == 'cmp') { data.DPIOpType = 0; - data.processOpData.arithmData.src = ZERO_REGISTER; + data.dest = ZERO_REGISTER; + data.processOpData.arithmData.src = getOperandNumber(operandList[0]); data.processOpData.arithmData.immediate = getOperandNumber(operandList[1]); data.processOpData.arithmData.shiftImmediate = true; data.processOp = 3; } + // neg, negs + else if (opcode[0] == 'n') { + data.DPIOpType = 0; + data.dest = getOperandNumber(operandList[1]); + data.processOpData.arithmData.src = ZERO_REGISTER; + data.processOpData.arithmData.immediate = getOperandNumber(operandList[2]); + if (opcode[-1] == 's') { + data.processOpData.arithmData.shiftImmediate = true; + data.processOp = 3; + } + else { + data.processOpData.arithmData.shiftImmediate = false; + data.processOp = 2; + } + } // wide move } From 18df8e0fe4c051b32de95f0d12260c7837aa5709 Mon Sep 17 00:00:00 2001 From: GDBWNV <93523315+GDBWNV@users.noreply.github.com> Date: Wed, 12 Jun 2024 17:26:49 +0100 Subject: [PATCH 5/8] DPI wide move --- src/parser.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/parser.c b/src/parser.c index c5bc66f..2d71001 100644 --- a/src/parser.c +++ b/src/parser.c @@ -249,6 +249,28 @@ void classifyOpcode(char* opcode, a64inst_instruction *instr, char *operandList[ } } // wide move + else { + data.DPIOpType = 1; + data.dest = getOperandNumber(operandList[0]); + switch (opcode[3]) { + case 'k': + data.processOp = 3; + break; + case 'n': + data.processOp = 0; + break; + case 'z': + data.processOp = 2; + break; + default: + data.processOp = 1; + break; + } + data.processOpData.wideMovData.immediate = getOperandNumber(operandList[1]); + if (numOperands == 3){ + data.processOpData.wideMovData.shiftScalar = getOperandNumber(strtok(operandList[2], ' ')[1]); + } + } } } From b8f3ded0af912a46caf19a0798df61ced4e51647 Mon Sep 17 00:00:00 2001 From: GDBWNV <93523315+GDBWNV@users.noreply.github.com> Date: Wed, 12 Jun 2024 17:39:37 +0100 Subject: [PATCH 6/8] DPR multiplication --- src/parser.c | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/src/parser.c b/src/parser.c index 2d71001..9f3cc21 100644 --- a/src/parser.c +++ b/src/parser.c @@ -174,6 +174,49 @@ void classifyOpcode(char* opcode, a64inst_instruction *instr, char *operandList[ } else { if(classifyDPInst(operandList)){ instr->type = a64inst_DPREGISTER; + a64inst_DPRegisterData data = instr->data.DPRegisterData; + char t = operandList[0][0]; + if (t == 'w') { + data.regType=0; + } + else { + data.regType=1; + } + // multiply + // mul, mneg, madd, msub + if (opcode[0] == 'm') { + data.DPROpType = 1; + data.dest = getOperandNumber(operandList[0]); + data.src1 = getOperandNumber(operandList[1]); + data.src2 = getOperandNumber(operandList[2]); + switch (opcode[1]) { + // madd + case 'a': + data.processOpData.multiplydata.summand = getOperandNumber(operandList[3]); + data.processOpData.multiplydata.negProd = false; + break; + // mneg + case 'n': + data.processOpData.multiplydata.summand = ZERO_REGISTER; + data.processOpData.multiplydata.negProd = true; + break; + // msub + case 's': + data.processOpData.multiplydata.summand = getOperandNumber(operandList[3]); + data.processOpData.multiplydata.negProd = true; + break; + // mul + default: + data.processOpData.multiplydata.summand = ZERO_REGISTER; + data.processOpData.multiplydata.negProd = false; + break; + } + } + // arithmlogic + else { + + } + } else { instr->type = a64inst_DPIMMEDIATE; a64inst_DPImmediateData data = instr->data.DPImmediateData; From 51283891bdd42188bfde8ffe3b96494a630b1062 Mon Sep 17 00:00:00 2001 From: GDBWNV <93523315+GDBWNV@users.noreply.github.com> Date: Wed, 12 Jun 2024 18:28:49 +0100 Subject: [PATCH 7/8] DPR logic --- src/parser.c | 146 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 141 insertions(+), 5 deletions(-) diff --git a/src/parser.c b/src/parser.c index 9f3cc21..27932c1 100644 --- a/src/parser.c +++ b/src/parser.c @@ -182,13 +182,14 @@ void classifyOpcode(char* opcode, a64inst_instruction *instr, char *operandList[ else { data.regType=1; } + data.dest = getOperandNumber(operandList[0]); + data.src1 = getOperandNumber(operandList[1]); + data.src2 = getOperandNumber(operandList[2]); // multiply // mul, mneg, madd, msub if (opcode[0] == 'm') { data.DPROpType = 1; - data.dest = getOperandNumber(operandList[0]); - data.src1 = getOperandNumber(operandList[1]); - data.src2 = getOperandNumber(operandList[2]); + switch (opcode[1]) { // madd case 'a': @@ -214,9 +215,144 @@ void classifyOpcode(char* opcode, a64inst_instruction *instr, char *operandList[ } // arithmlogic else { - + data.DPROpType = 0; + data.processOpData.arithmLogicData.negShiftedSrc2 = 0; + // logical + data.processOpData.arithmLogicData.type = 0; + // three special cases + if (opcode == 'tst') { + data.dest = ZERO_REGISTER; + data.src1 = getOperandNumber(operandList[0]); + data.src2 = getOperandNumber(operandList[1]); + data.processOp = 3; + if (strlen(operandList) == 3) { + char *split[] = strtok(operandList[2], ' '); + switch (split[1][0]) { + case 'L': + // LSR + if (split[1][2] == 'R') { + data.processOpData.arithmLogicData.shiftType = 1; + } + // LSL + else { + data.processOpData.arithmLogicData.shiftType = 0; + } + break; + // ROR + case 'R': + data.processOpData.arithmLogicData.shiftType = 3; + break; + // ASR + default: + data.processOpData.arithmLogicData.shiftType = 2; + break; + } + } + } + else if (opcode == 'mvn') { + data.dest = getOperandNumber(operandList[0]); + data.src1 = ZERO_REGISTER; + data.src2 = getOperandNumber(operandList[1]); + data.processOp = 1; + data.processOpData.arithmLogicData.negShiftedSrc2 = 1; + if (strlen(operandList) == 3) { + char *split[] = strtok(operandList[2], ' '); + switch (split[1][0]) { + case 'L': + // LSR + if (split[1][2] == 'R') { + data.processOpData.arithmLogicData.shiftType = 1; + } + // LSL + else { + data.processOpData.arithmLogicData.shiftType = 0; + } + break; + // ROR + case 'R': + data.processOpData.arithmLogicData.shiftType = 3; + break; + // ASR + default: + data.processOpData.arithmLogicData.shiftType = 2; + break; + } + } + } + else if (opcode == 'mov') { + data.dest = getOperandNumber(operandList[0]); + data.src1 = ZERO_REGISTER; + data.src2 = getOperandNumber(operandList[1]); + data.processOp = 1; + } + else { + // handles shifts + if (strlen(operandList) == 4) { + char *split[] = strtok(operandList[3], ' '); + switch (split[1][0]) { + case 'L': + // LSR + if (split[1][2] == 'R') { + data.processOpData.arithmLogicData.shiftType = 1; + } + // LSL + else { + data.processOpData.arithmLogicData.shiftType = 0; + } + break; + // ROR + case 'R': + data.processOpData.arithmLogicData.shiftType = 3; + break; + // ASR + default: + data.processOpData.arithmLogicData.shiftType = 2; + break; + } + } + switch (opcode[0]) { + // and, ands + case 'a': + // ands + if (strlen(opcode) == 4) { + data.processOp = 3; + } + // and + else { + data.processOp = 0; + } + break; + // bic, bics + case 'b': + data.processOpData.arithmLogicData.negShiftedSrc2 = 1; + // bics + if (strlen(opcode) == 4) { + data.processOp = 3; + } + // bic + else { + data.processOp = 0; + } + break; + // orr, orn + case 'o': + data.processOp = 1; + // orn + if (opcode[2] == 'n') { + data.processOpData.arithmLogicData.negShiftedSrc2 = 1; + } + break; + // eor, eon + default: + data.processOp = 2; + // eon + if (opcode[2] == 'n') { + data.processOpData.arithmLogicData.negShiftedSrc2 = 1; + } + break; + } + } } - } else { instr->type = a64inst_DPIMMEDIATE; a64inst_DPImmediateData data = instr->data.DPImmediateData; From 27148301175ed20d3ab52766a2ef83169bbaffaa Mon Sep 17 00:00:00 2001 From: GDBWNV <93523315+GDBWNV@users.noreply.github.com> Date: Wed, 12 Jun 2024 18:58:54 +0100 Subject: [PATCH 8/8] DPR arithmetic --- src/parser.c | 421 +++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 307 insertions(+), 114 deletions(-) diff --git a/src/parser.c b/src/parser.c index 27932c1..594d477 100644 --- a/src/parser.c +++ b/src/parser.c @@ -184,12 +184,11 @@ void classifyOpcode(char* opcode, a64inst_instruction *instr, char *operandList[ } data.dest = getOperandNumber(operandList[0]); data.src1 = getOperandNumber(operandList[1]); - data.src2 = getOperandNumber(operandList[2]); // multiply // mul, mneg, madd, msub if (opcode[0] == 'm') { data.DPROpType = 1; - + data.src2 = getOperandNumber(operandList[2]); switch (opcode[1]) { // madd case 'a': @@ -216,76 +215,19 @@ void classifyOpcode(char* opcode, a64inst_instruction *instr, char *operandList[ // arithmlogic else { data.DPROpType = 0; + // overridden when neccesary data.processOpData.arithmLogicData.negShiftedSrc2 = 0; - // logical - data.processOpData.arithmLogicData.type = 0; - // three special cases - if (opcode == 'tst') { - data.dest = ZERO_REGISTER; - data.src1 = getOperandNumber(operandList[0]); - data.src2 = getOperandNumber(operandList[1]); - data.processOp = 3; - if (strlen(operandList) == 3) { - char *split[] = strtok(operandList[2], ' '); - switch (split[1][0]) { - case 'L': - // LSR - if (split[1][2] == 'R') { - data.processOpData.arithmLogicData.shiftType = 1; - } - // LSL - else { - data.processOpData.arithmLogicData.shiftType = 0; - } - break; - // ROR - case 'R': - data.processOpData.arithmLogicData.shiftType = 3; - break; - // ASR - default: - data.processOpData.arithmLogicData.shiftType = 2; - break; - } + // arithmetic + // add, adds + if (opcode[1] == 'd') { + data.processOpData.arithmLogicData.type = 1; + data.src2 = getOperandNumber(operandList[2]); + if (strlen(opcode) == 4) { + data.processOp = 1; } - } - else if (opcode == 'mvn') { - data.dest = getOperandNumber(operandList[0]); - data.src1 = ZERO_REGISTER; - data.src2 = getOperandNumber(operandList[1]); - data.processOp = 1; - data.processOpData.arithmLogicData.negShiftedSrc2 = 1; - if (strlen(operandList) == 3) { - char *split[] = strtok(operandList[2], ' '); - switch (split[1][0]) { - case 'L': - // LSR - if (split[1][2] == 'R') { - data.processOpData.arithmLogicData.shiftType = 1; - } - // LSL - else { - data.processOpData.arithmLogicData.shiftType = 0; - } - break; - // ROR - case 'R': - data.processOpData.arithmLogicData.shiftType = 3; - break; - // ASR - default: - data.processOpData.arithmLogicData.shiftType = 2; - break; - } + else { + data.processOp = 0; } - } - else if (opcode == 'mov') { - data.dest = getOperandNumber(operandList[0]); - data.src1 = ZERO_REGISTER; - data.src2 = getOperandNumber(operandList[1]); - data.processOp = 1; - } - else { // handles shifts if (strlen(operandList) == 4) { char *split[] = strtok(operandList[3], ' '); @@ -310,46 +252,278 @@ void classifyOpcode(char* opcode, a64inst_instruction *instr, char *operandList[ break; } } - switch (opcode[0]) { - // and, ands - case 'a': - // ands - if (strlen(opcode) == 4) { - data.processOp = 3; + } + // cmn + else if (opcode == 'cmn') { + data.dest = ZERO_REGISTER; + data.src1 = getOperandNumber(operandList[0]); + data.src2 = getOperandNumber(operandList[1]); + data.processOpData.arithmLogicData.type = 1; + data.processOp = 1; + // handles shifts + if (strlen(operandList) == 3) { + char *split[] = strtok(operandList[2], ' '); + switch (split[1][0]) { + case 'L': + // LSR + if (split[1][2] == 'R') { + data.processOpData.arithmLogicData.shiftType = 1; + } + // LSL + else { + data.processOpData.arithmLogicData.shiftType = 0; + } + break; + // ROR + case 'R': + data.processOpData.arithmLogicData.shiftType = 3; + break; + // ASR + default: + data.processOpData.arithmLogicData.shiftType = 2; + break; + } + } + } + // sub, subs + else if (opcode[2] == 'b') { + data.src2 = getOperandNumber(operandList[2]); + data.processOpData.arithmLogicData.type = 1; + if (strlen(opcode) == 4) { + data.processOp = 3; + } + else { + data.processOp = 2; + } + // handles shifts + if (strlen(operandList) == 4) { + char *split[] = strtok(operandList[3], ' '); + switch (split[1][0]) { + case 'L': + // LSR + if (split[1][2] == 'R') { + data.processOpData.arithmLogicData.shiftType = 1; + } + // LSL + else { + data.processOpData.arithmLogicData.shiftType = 0; + } + break; + // ROR + case 'R': + data.processOpData.arithmLogicData.shiftType = 3; + break; + // ASR + default: + data.processOpData.arithmLogicData.shiftType = 2; + break; + } + } + } + // cmp + else if (opcode == 'cmp') { + data.dest = ZERO_REGISTER; + data.src1 = getOperandNumber(operandList[0]); + data.src2 = getOperandNumber(operandList[1]); + data.processOpData.arithmLogicData.type = 1; + data.processOp = 3; + // handles shifts + if (strlen(operandList) == 3) { + char *split[] = strtok(operandList[2], ' '); + switch (split[1][0]) { + case 'L': + // LSR + if (split[1][2] == 'R') { + data.processOpData.arithmLogicData.shiftType = 1; + } + // LSL + else { + data.processOpData.arithmLogicData.shiftType = 0; + } + break; + // ROR + case 'R': + data.processOpData.arithmLogicData.shiftType = 3; + break; + // ASR + default: + data.processOpData.arithmLogicData.shiftType = 2; + break; + } + } + } + // neg, negs + else if (opcode[0] == 'n') { + data.src1 = ZERO_REGISTER; + data.src2 = getOperandNumber(operandList[1]); + data.processOpData.arithmLogicData.type = 1; + if (strlen(opcode) == 4) { + data.processOp = 3; + } + else { + data.processOp = 2; + } + // handles shifts + if (strlen(operandList) == 3) { + char *split[] = strtok(operandList[2], ' '); + switch (split[1][0]) { + case 'L': + // LSR + if (split[1][2] == 'R') { + data.processOpData.arithmLogicData.shiftType = 1; + } + // LSL + else { + data.processOpData.arithmLogicData.shiftType = 0; + } + break; + // ROR + case 'R': + data.processOpData.arithmLogicData.shiftType = 3; + break; + // ASR + default: + data.processOpData.arithmLogicData.shiftType = 2; + break; + } + } + } + else { + // logical + data.processOpData.arithmLogicData.type = 0; + // three special cases + if (opcode == 'tst') { + data.dest = ZERO_REGISTER; + data.src1 = getOperandNumber(operandList[0]); + data.src2 = getOperandNumber(operandList[1]); + data.processOp = 3; + if (strlen(operandList) == 3) { + char *split[] = strtok(operandList[2], ' '); + switch (split[1][0]) { + case 'L': + // LSR + if (split[1][2] == 'R') { + data.processOpData.arithmLogicData.shiftType = 1; + } + // LSL + else { + data.processOpData.arithmLogicData.shiftType = 0; + } + break; + // ROR + case 'R': + data.processOpData.arithmLogicData.shiftType = 3; + break; + // ASR + default: + data.processOpData.arithmLogicData.shiftType = 2; + break; } - // and - else { - data.processOp = 0; + } + } + else if (opcode == 'mvn') { + data.dest = getOperandNumber(operandList[0]); + data.src1 = ZERO_REGISTER; + data.src2 = getOperandNumber(operandList[1]); + data.processOp = 1; + data.processOpData.arithmLogicData.negShiftedSrc2 = 1; + if (strlen(operandList) == 3) { + char *split[] = strtok(operandList[2], ' '); + switch (split[1][0]) { + case 'L': + // LSR + if (split[1][2] == 'R') { + data.processOpData.arithmLogicData.shiftType = 1; + } + // LSL + else { + data.processOpData.arithmLogicData.shiftType = 0; + } + break; + // ROR + case 'R': + data.processOpData.arithmLogicData.shiftType = 3; + break; + // ASR + default: + data.processOpData.arithmLogicData.shiftType = 2; + break; } - break; - // bic, bics - case 'b': - data.processOpData.arithmLogicData.negShiftedSrc2 = 1; - // bics - if (strlen(opcode) == 4) { - data.processOp = 3; + } + } + else if (opcode == 'mov') { + data.dest = getOperandNumber(operandList[0]); + data.src1 = ZERO_REGISTER; + data.src2 = getOperandNumber(operandList[1]); + data.processOp = 1; + } + else { + data.src2 = getOperandNumber(operandList[2]); + // handles shifts + if (strlen(operandList) == 4) { + char *split[] = strtok(operandList[3], ' '); + switch (split[1][0]) { + case 'L': + // LSR + if (split[1][2] == 'R') { + data.processOpData.arithmLogicData.shiftType = 1; + } + // LSL + else { + data.processOpData.arithmLogicData.shiftType = 0; + } + break; + // ROR + case 'R': + data.processOpData.arithmLogicData.shiftType = 3; + break; + // ASR + default: + data.processOpData.arithmLogicData.shiftType = 2; + break; } - // bic - else { - data.processOp = 0; - } - break; - // orr, orn - case 'o': - data.processOp = 1; - // orn - if (opcode[2] == 'n') { + } + switch (opcode[0]) { + // and, ands + case 'a': + // ands + if (strlen(opcode) == 4) { + data.processOp = 3; + } + // and + else { + data.processOp = 0; + } + break; + // bic, bics + case 'b': data.processOpData.arithmLogicData.negShiftedSrc2 = 1; - } - break; - // eor, eon - default: - data.processOp = 2; - // eon - if (opcode[2] == 'n') { - data.processOpData.arithmLogicData.negShiftedSrc2 = 1; - } - break; + // bics + if (strlen(opcode) == 4) { + data.processOp = 3; + } + // bic + else { + data.processOp = 0; + } + break; + // orr, orn + case 'o': + data.processOp = 1; + // orn + if (opcode[2] == 'n') { + data.processOpData.arithmLogicData.negShiftedSrc2 = 1; + } + break; + // eor, eon + default: + data.processOp = 2; + // eon + if (opcode[2] == 'n') { + data.processOpData.arithmLogicData.negShiftedSrc2 = 1; + } + break; + } } } } @@ -364,18 +538,23 @@ void classifyOpcode(char* opcode, a64inst_instruction *instr, char *operandList[ data.regType=1; } // arithmetic + // can be overwritten later + data.processOpData.arithmData.shiftImmediate = false; // add, adds if (opcode[1] == 'd') { data.DPIOpType = 0; data.dest = getOperandNumber(operandList[0]); data.processOpData.arithmData.src = getOperandNumber(operandList[1]); data.processOpData.arithmData.immediate = getOperandNumber(operandList[2]); - if (opcode[-1] == 's') { - data.processOpData.arithmData.shiftImmediate = true; + if (strlen(operandList) == 4) { + if (strlen(operandList[3]) == 8) { + data.processOpData.arithmData.shiftImmediate = true; + } + } + if (strlen(opcode) == 4) { data.processOp = 1; } else { - data.processOpData.arithmData.shiftImmediate = false; data.processOp = 0; } } @@ -385,8 +564,12 @@ void classifyOpcode(char* opcode, a64inst_instruction *instr, char *operandList[ data.dest = ZERO_REGISTER; data.processOpData.arithmData.src = getOperandNumber(operandList[0]); data.processOpData.arithmData.immediate = getOperandNumber(operandList[1]); - data.processOpData.arithmData.shiftImmediate = true; data.processOp = 1; + if (strlen(operandList) == 3) { + if (strlen(operandList[2]) == 8) { + data.processOpData.arithmData.shiftImmediate = true; + } + } } // sub, subs else if (opcode[0] == 's') { @@ -394,12 +577,15 @@ void classifyOpcode(char* opcode, a64inst_instruction *instr, char *operandList[ data.dest = getOperandNumber(operandList[0]); data.processOpData.arithmData.src = getOperandNumber(operandList[1]); data.processOpData.arithmData.immediate = getOperandNumber(operandList[2]); + if (strlen(operandList) == 4) { + if (strlen(operandList[3]) == 8) { + data.processOpData.arithmData.shiftImmediate = true; + } + } if (opcode[-1] == 's') { - data.processOpData.arithmData.shiftImmediate = true; data.processOp = 3; } else { - data.processOpData.arithmData.shiftImmediate = false; data.processOp = 2; } } @@ -409,8 +595,12 @@ void classifyOpcode(char* opcode, a64inst_instruction *instr, char *operandList[ data.dest = ZERO_REGISTER; data.processOpData.arithmData.src = getOperandNumber(operandList[0]); data.processOpData.arithmData.immediate = getOperandNumber(operandList[1]); - data.processOpData.arithmData.shiftImmediate = true; data.processOp = 3; + if (strlen(operandList) == 3) { + if (strlen(operandList[2]) == 8) { + data.processOpData.arithmData.shiftImmediate = true; + } + } } // neg, negs else if (opcode[0] == 'n') { @@ -418,12 +608,15 @@ void classifyOpcode(char* opcode, a64inst_instruction *instr, char *operandList[ data.dest = getOperandNumber(operandList[1]); data.processOpData.arithmData.src = ZERO_REGISTER; data.processOpData.arithmData.immediate = getOperandNumber(operandList[2]); + if (strlen(operandList) == 3) { + if (strlen(operandList[2]) == 8) { + data.processOpData.arithmData.shiftImmediate = true; + } + } if (opcode[-1] == 's') { - data.processOpData.arithmData.shiftImmediate = true; data.processOp = 3; } else { - data.processOpData.arithmData.shiftImmediate = false; data.processOp = 2; } }