mirror of
https://github.com/radareorg/radare2.git
synced 2025-02-26 17:15:38 +00:00
Add FSUB/FSUBP/FISUB operator for x86 assembler (Subtract)
This commit is contained in:
parent
65a71bcaed
commit
ab3ff60f2e
@ -2979,6 +2979,89 @@ static int opfimul(RAsm *a, ut8 *data, const Opcode *op) {
|
||||
return l;
|
||||
}
|
||||
|
||||
static int opfsub(RAsm *a, ut8 *data, const Opcode *op) {
|
||||
int l = 0;
|
||||
switch (op->operands_count) {
|
||||
case 1:
|
||||
if ( op->operands[0].type & OT_MEMORY ) {
|
||||
if ( op->operands[0].type & OT_DWORD ) {
|
||||
data[l++] = 0xd8;
|
||||
data[l++] = 0x20 | op->operands[0].regs[0];
|
||||
} else if ( op->operands[0].type & OT_QWORD ) {
|
||||
data[l++] = 0xdc;
|
||||
data[l++] = 0x20 | op->operands[0].regs[0];
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if ( op->operands[0].type & OT_FPUREG & ~OT_REGALL && op->operands[0].reg == 0 &&
|
||||
op->operands[1].type & OT_FPUREG & ~OT_REGALL ) {
|
||||
data[l++] = 0xd8;
|
||||
data[l++] = 0xe0 | op->operands[1].reg;
|
||||
} else if ( op->operands[0].type & OT_FPUREG & ~OT_REGALL &&
|
||||
op->operands[1].type & OT_FPUREG & ~OT_REGALL && op->operands[1].reg == 0 ) {
|
||||
data[l++] = 0xdc;
|
||||
data[l++] = 0xe0 | op->operands[0].reg;
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
return l;
|
||||
}
|
||||
|
||||
static int opfsubp(RAsm *a, ut8 *data, const Opcode *op) {
|
||||
int l = 0;
|
||||
switch (op->operands_count) {
|
||||
case 0:
|
||||
data[l++] = 0xde;
|
||||
data[l++] = 0xe9;
|
||||
break;
|
||||
case 2:
|
||||
if ( op->operands[0].type & OT_FPUREG & ~OT_REGALL &&
|
||||
op->operands[1].type & OT_FPUREG & ~OT_REGALL && op->operands[1].reg == 0 ) {
|
||||
data[l++] = 0xde;
|
||||
data[l++] = 0xe8 | op->operands[0].reg;
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
return l;
|
||||
}
|
||||
|
||||
static int opfisub(RAsm *a, ut8 *data, const Opcode *op) {
|
||||
int l = 0;
|
||||
switch (op->operands_count) {
|
||||
case 1:
|
||||
if ( op->operands[0].type & OT_MEMORY ) {
|
||||
if ( op->operands[0].type & OT_DWORD ) {
|
||||
data[l++] = 0xda;
|
||||
data[l++] = 0x20 | op->operands[0].regs[0];
|
||||
} else if ( op->operands[0].type & OT_WORD ) {
|
||||
data[l++] = 0xde;
|
||||
data[l++] = 0x20 | op->operands[0].regs[0];
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
return l;
|
||||
}
|
||||
|
||||
typedef struct lookup_t {
|
||||
char mnemonic[12];
|
||||
int only_x32;
|
||||
@ -3087,6 +3170,7 @@ LookupTable oplookup[] = {
|
||||
{"fimul", 0, &opfimul, 0},
|
||||
{"fincstp", 0, NULL, 0xd9f7, 2},
|
||||
{"finit", 0, NULL, 0x9bdbe3, 3},
|
||||
{"fisub", 0, &opfisub, 0},
|
||||
{"fist", 0, &opfist, 0},
|
||||
{"fistp", 0, &opfistp, 0},
|
||||
{"fisttp", 0, &opfisttp, 0},
|
||||
@ -3116,6 +3200,8 @@ LookupTable oplookup[] = {
|
||||
{"fsincos", 0, NULL, 0xd9fb, 2},
|
||||
{"fsqrt", 0, NULL, 0xd9fa, 2},
|
||||
{"fstenv", 0, &opfstenv, 0},
|
||||
{"fsub", 0, &opfsub, 0},
|
||||
{"fsubp", 0, &opfsubp, 0},
|
||||
{"ftst", 0, NULL, 0xd9e4, 2},
|
||||
{"fucom", 0, &opfucom, 0},
|
||||
{"fucomp", 0, &opfucomp, 0},
|
||||
|
Loading…
x
Reference in New Issue
Block a user