DPR arithmetic
This commit is contained in:
parent
51283891bd
commit
2714830117
213
src/parser.c
213
src/parser.c
@ -184,12 +184,11 @@ void classifyOpcode(char* opcode, a64inst_instruction *instr, char *operandList[
|
|||||||
}
|
}
|
||||||
data.dest = getOperandNumber(operandList[0]);
|
data.dest = getOperandNumber(operandList[0]);
|
||||||
data.src1 = getOperandNumber(operandList[1]);
|
data.src1 = getOperandNumber(operandList[1]);
|
||||||
data.src2 = getOperandNumber(operandList[2]);
|
|
||||||
// multiply
|
// multiply
|
||||||
// mul, mneg, madd, msub
|
// mul, mneg, madd, msub
|
||||||
if (opcode[0] == 'm') {
|
if (opcode[0] == 'm') {
|
||||||
data.DPROpType = 1;
|
data.DPROpType = 1;
|
||||||
|
data.src2 = getOperandNumber(operandList[2]);
|
||||||
switch (opcode[1]) {
|
switch (opcode[1]) {
|
||||||
// madd
|
// madd
|
||||||
case 'a':
|
case 'a':
|
||||||
@ -216,7 +215,180 @@ void classifyOpcode(char* opcode, a64inst_instruction *instr, char *operandList[
|
|||||||
// arithmlogic
|
// arithmlogic
|
||||||
else {
|
else {
|
||||||
data.DPROpType = 0;
|
data.DPROpType = 0;
|
||||||
|
// overridden when neccesary
|
||||||
data.processOpData.arithmLogicData.negShiftedSrc2 = 0;
|
data.processOpData.arithmLogicData.negShiftedSrc2 = 0;
|
||||||
|
// 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 {
|
||||||
|
data.processOp = 0;
|
||||||
|
}
|
||||||
|
// 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 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
|
// logical
|
||||||
data.processOpData.arithmLogicData.type = 0;
|
data.processOpData.arithmLogicData.type = 0;
|
||||||
// three special cases
|
// three special cases
|
||||||
@ -286,6 +458,7 @@ void classifyOpcode(char* opcode, a64inst_instruction *instr, char *operandList[
|
|||||||
data.processOp = 1;
|
data.processOp = 1;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
data.src2 = getOperandNumber(operandList[2]);
|
||||||
// handles shifts
|
// handles shifts
|
||||||
if (strlen(operandList) == 4) {
|
if (strlen(operandList) == 4) {
|
||||||
char *split[] = strtok(operandList[3], ' ');
|
char *split[] = strtok(operandList[3], ' ');
|
||||||
@ -353,6 +526,7 @@ void classifyOpcode(char* opcode, a64inst_instruction *instr, char *operandList[
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
instr->type = a64inst_DPIMMEDIATE;
|
instr->type = a64inst_DPIMMEDIATE;
|
||||||
a64inst_DPImmediateData data = instr->data.DPImmediateData;
|
a64inst_DPImmediateData data = instr->data.DPImmediateData;
|
||||||
@ -364,18 +538,23 @@ void classifyOpcode(char* opcode, a64inst_instruction *instr, char *operandList[
|
|||||||
data.regType=1;
|
data.regType=1;
|
||||||
}
|
}
|
||||||
// arithmetic
|
// arithmetic
|
||||||
|
// can be overwritten later
|
||||||
|
data.processOpData.arithmData.shiftImmediate = false;
|
||||||
// add, adds
|
// add, adds
|
||||||
if (opcode[1] == 'd') {
|
if (opcode[1] == 'd') {
|
||||||
data.DPIOpType = 0;
|
data.DPIOpType = 0;
|
||||||
data.dest = getOperandNumber(operandList[0]);
|
data.dest = getOperandNumber(operandList[0]);
|
||||||
data.processOpData.arithmData.src = getOperandNumber(operandList[1]);
|
data.processOpData.arithmData.src = getOperandNumber(operandList[1]);
|
||||||
data.processOpData.arithmData.immediate = getOperandNumber(operandList[2]);
|
data.processOpData.arithmData.immediate = getOperandNumber(operandList[2]);
|
||||||
if (opcode[-1] == 's') {
|
if (strlen(operandList) == 4) {
|
||||||
|
if (strlen(operandList[3]) == 8) {
|
||||||
data.processOpData.arithmData.shiftImmediate = true;
|
data.processOpData.arithmData.shiftImmediate = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (strlen(opcode) == 4) {
|
||||||
data.processOp = 1;
|
data.processOp = 1;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
data.processOpData.arithmData.shiftImmediate = false;
|
|
||||||
data.processOp = 0;
|
data.processOp = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -385,8 +564,12 @@ void classifyOpcode(char* opcode, a64inst_instruction *instr, char *operandList[
|
|||||||
data.dest = ZERO_REGISTER;
|
data.dest = ZERO_REGISTER;
|
||||||
data.processOpData.arithmData.src = getOperandNumber(operandList[0]);
|
data.processOpData.arithmData.src = getOperandNumber(operandList[0]);
|
||||||
data.processOpData.arithmData.immediate = getOperandNumber(operandList[1]);
|
data.processOpData.arithmData.immediate = getOperandNumber(operandList[1]);
|
||||||
data.processOpData.arithmData.shiftImmediate = true;
|
|
||||||
data.processOp = 1;
|
data.processOp = 1;
|
||||||
|
if (strlen(operandList) == 3) {
|
||||||
|
if (strlen(operandList[2]) == 8) {
|
||||||
|
data.processOpData.arithmData.shiftImmediate = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// sub, subs
|
// sub, subs
|
||||||
else if (opcode[0] == 's') {
|
else if (opcode[0] == 's') {
|
||||||
@ -394,12 +577,15 @@ void classifyOpcode(char* opcode, a64inst_instruction *instr, char *operandList[
|
|||||||
data.dest = getOperandNumber(operandList[0]);
|
data.dest = getOperandNumber(operandList[0]);
|
||||||
data.processOpData.arithmData.src = getOperandNumber(operandList[1]);
|
data.processOpData.arithmData.src = getOperandNumber(operandList[1]);
|
||||||
data.processOpData.arithmData.immediate = getOperandNumber(operandList[2]);
|
data.processOpData.arithmData.immediate = getOperandNumber(operandList[2]);
|
||||||
if (opcode[-1] == 's') {
|
if (strlen(operandList) == 4) {
|
||||||
|
if (strlen(operandList[3]) == 8) {
|
||||||
data.processOpData.arithmData.shiftImmediate = true;
|
data.processOpData.arithmData.shiftImmediate = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (opcode[-1] == 's') {
|
||||||
data.processOp = 3;
|
data.processOp = 3;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
data.processOpData.arithmData.shiftImmediate = false;
|
|
||||||
data.processOp = 2;
|
data.processOp = 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -409,8 +595,12 @@ void classifyOpcode(char* opcode, a64inst_instruction *instr, char *operandList[
|
|||||||
data.dest = ZERO_REGISTER;
|
data.dest = ZERO_REGISTER;
|
||||||
data.processOpData.arithmData.src = getOperandNumber(operandList[0]);
|
data.processOpData.arithmData.src = getOperandNumber(operandList[0]);
|
||||||
data.processOpData.arithmData.immediate = getOperandNumber(operandList[1]);
|
data.processOpData.arithmData.immediate = getOperandNumber(operandList[1]);
|
||||||
data.processOpData.arithmData.shiftImmediate = true;
|
|
||||||
data.processOp = 3;
|
data.processOp = 3;
|
||||||
|
if (strlen(operandList) == 3) {
|
||||||
|
if (strlen(operandList[2]) == 8) {
|
||||||
|
data.processOpData.arithmData.shiftImmediate = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// neg, negs
|
// neg, negs
|
||||||
else if (opcode[0] == 'n') {
|
else if (opcode[0] == 'n') {
|
||||||
@ -418,12 +608,15 @@ void classifyOpcode(char* opcode, a64inst_instruction *instr, char *operandList[
|
|||||||
data.dest = getOperandNumber(operandList[1]);
|
data.dest = getOperandNumber(operandList[1]);
|
||||||
data.processOpData.arithmData.src = ZERO_REGISTER;
|
data.processOpData.arithmData.src = ZERO_REGISTER;
|
||||||
data.processOpData.arithmData.immediate = getOperandNumber(operandList[2]);
|
data.processOpData.arithmData.immediate = getOperandNumber(operandList[2]);
|
||||||
if (opcode[-1] == 's') {
|
if (strlen(operandList) == 3) {
|
||||||
|
if (strlen(operandList[2]) == 8) {
|
||||||
data.processOpData.arithmData.shiftImmediate = true;
|
data.processOpData.arithmData.shiftImmediate = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (opcode[-1] == 's') {
|
||||||
data.processOp = 3;
|
data.processOp = 3;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
data.processOpData.arithmData.shiftImmediate = false;
|
|
||||||
data.processOp = 2;
|
data.processOp = 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user