Skip to content

Commit 106f7d3

Browse files
authored
Update read/written registers for x87 comparison instructions (#2680)
1 parent ebe3ef2 commit 106f7d3

File tree

3 files changed

+119
-37
lines changed

3 files changed

+119
-37
lines changed

arch/X86/X86MappingInsn.inc

+22-22
Original file line numberDiff line numberDiff line change
@@ -4031,28 +4031,28 @@
40314031
{
40324032
X86_COMP_FST0r, X86_INS_FCOMP, 0,
40334033
#ifndef CAPSTONE_DIET
4034-
{ 0 }, { 0 }, { X86_GRP_FPU, 0 }, 0, 0
4034+
{ X86_REG_ST0, 0 }, { X86_REG_FPSW, 0 }, { X86_GRP_FPU, 0 }, 0, 0
40354035
#endif
40364036
},
40374037

40384038
{
40394039
X86_COM_FIPr, X86_INS_FCOMPI, 0,
40404040
#ifndef CAPSTONE_DIET
4041-
{ 0 }, { X86_REG_EFLAGS, X86_REG_FPSW, 0 }, { X86_GRP_FPU, 0 }, 0, 0
4041+
{ X86_REG_ST0, 0 }, { X86_REG_EFLAGS, 0 }, { X86_GRP_FPU, 0 }, 0, 0
40424042
#endif
40434043
},
40444044

40454045
{
40464046
X86_COM_FIr, X86_INS_FCOMI, 0,
40474047
#ifndef CAPSTONE_DIET
4048-
{ 0 }, { X86_REG_EFLAGS, X86_REG_FPSW, 0 }, { X86_GRP_FPU, 0 }, 0, 0
4048+
{ X86_REG_ST0, 0 }, { X86_REG_EFLAGS, 0 }, { X86_GRP_FPU, 0 }, 0, 0
40494049
#endif
40504050
},
40514051

40524052
{
40534053
X86_COM_FST0r, X86_INS_FCOM, 0,
40544054
#ifndef CAPSTONE_DIET
4055-
{ 0 }, { 0 }, { X86_GRP_FPU, 0 }, 0, 0
4055+
{ X86_REG_ST0, 0 }, { X86_REG_FPSW, 0 }, { X86_GRP_FPU, 0 }, 0, 0
40564056
#endif
40574057
},
40584058

@@ -5326,35 +5326,35 @@
53265326
{
53275327
X86_FCOM32m, X86_INS_FCOM, 0,
53285328
#ifndef CAPSTONE_DIET
5329-
{ 0 }, { 0 }, { X86_GRP_FPU, 0 }, 0, 0
5329+
{ X86_REG_ST0, 0 }, { X86_REG_FPSW, 0 }, { X86_GRP_FPU, 0 }, 0, 0
53305330
#endif
53315331
},
53325332

53335333
{
53345334
X86_FCOM64m, X86_INS_FCOM, 1,
53355335
#ifndef CAPSTONE_DIET
5336-
{ 0 }, { 0 }, { X86_GRP_FPU, 0 }, 0, 0
5336+
{ X86_REG_ST0, 0 }, { X86_REG_FPSW, 0 }, { X86_GRP_FPU, 0 }, 0, 0
53375337
#endif
53385338
},
53395339

53405340
{
53415341
X86_FCOMP32m, X86_INS_FCOMP, 0,
53425342
#ifndef CAPSTONE_DIET
5343-
{ 0 }, { 0 }, { X86_GRP_FPU, 0 }, 0, 0
5343+
{ X86_REG_ST0, 0 }, { X86_REG_FPSW, 0 }, { X86_GRP_FPU, 0 }, 0, 0
53445344
#endif
53455345
},
53465346

53475347
{
53485348
X86_FCOMP64m, X86_INS_FCOMP, 1,
53495349
#ifndef CAPSTONE_DIET
5350-
{ 0 }, { 0 }, { X86_GRP_FPU, 0 }, 0, 0
5350+
{ X86_REG_ST0, 0 }, { X86_REG_FPSW, 0 }, { X86_GRP_FPU, 0 }, 0, 0
53515351
#endif
53525352
},
53535353

53545354
{
53555355
X86_FCOMPP, X86_INS_FCOMPP, 0,
53565356
#ifndef CAPSTONE_DIET
5357-
{ 0 }, { 0 }, { X86_GRP_FPU, 0 }, 0, 0
5357+
{ X86_REG_ST0, X86_REG_ST1, 0 }, { X86_REG_FPSW, 0 }, { X86_GRP_FPU, 0 }, 0, 0
53585358
#endif
53595359
},
53605360

@@ -5403,28 +5403,28 @@
54035403
{
54045404
X86_FICOM16m, X86_INS_FICOM, 0,
54055405
#ifndef CAPSTONE_DIET
5406-
{ 0 }, { 0 }, { X86_GRP_FPU, 0 }, 0, 0
5406+
{ X86_REG_ST0, 0 }, { X86_REG_FPSW, 0 }, { X86_GRP_FPU, 0 }, 0, 0
54075407
#endif
54085408
},
54095409

54105410
{
54115411
X86_FICOM32m, X86_INS_FICOM, 0,
54125412
#ifndef CAPSTONE_DIET
5413-
{ 0 }, { 0 }, { X86_GRP_FPU, 0 }, 0, 0
5413+
{ X86_REG_ST0, 0 }, { X86_REG_FPSW, 0 }, { X86_GRP_FPU, 0 }, 0, 0
54145414
#endif
54155415
},
54165416

54175417
{
54185418
X86_FICOMP16m, X86_INS_FICOMP, 0,
54195419
#ifndef CAPSTONE_DIET
5420-
{ 0 }, { 0 }, { X86_GRP_FPU, 0 }, 0, 0
5420+
{ X86_REG_ST0, 0 }, { X86_REG_FPSW, 0 }, { X86_GRP_FPU, 0 }, 0, 0
54215421
#endif
54225422
},
54235423

54245424
{
54255425
X86_FICOMP32m, X86_INS_FICOMP, 0,
54265426
#ifndef CAPSTONE_DIET
5427-
{ 0 }, { 0 }, { X86_GRP_FPU, 0 }, 0, 0
5427+
{ X86_REG_ST0, 0 }, { X86_REG_FPSW, 0 }, { X86_GRP_FPU, 0 }, 0, 0
54285428
#endif
54295429
},
54305430

@@ -19046,21 +19046,21 @@
1904619046
{
1904719047
X86_UCOM_FIPr, X86_INS_FUCOMPI, 0,
1904819048
#ifndef CAPSTONE_DIET
19049-
{ X86_REG_ST0, 0 }, { X86_REG_EFLAGS, X86_REG_FPSW, 0 }, { X86_GRP_FPU, 0 }, 0, 0
19049+
{ X86_REG_ST0, 0 }, { X86_REG_EFLAGS, 0 }, { X86_GRP_FPU, 0 }, 0, 0
1905019050
#endif
1905119051
},
1905219052

1905319053
{
1905419054
X86_UCOM_FIr, X86_INS_FUCOMI, 0,
1905519055
#ifndef CAPSTONE_DIET
19056-
{ X86_REG_ST0, 0 }, { X86_REG_EFLAGS, X86_REG_FPSW, 0 }, { X86_GRP_FPU, 0 }, 0, 0
19056+
{ X86_REG_ST0, 0 }, { X86_REG_EFLAGS, 0 }, { X86_GRP_FPU, 0 }, 0, 0
1905719057
#endif
1905819058
},
1905919059

1906019060
{
1906119061
X86_UCOM_FPPr, X86_INS_FUCOMPP, 0,
1906219062
#ifndef CAPSTONE_DIET
19063-
{ X86_REG_ST0, 0 }, { X86_REG_FPSW, 0 }, { X86_GRP_FPU, 0 }, 0, 0
19063+
{ X86_REG_ST0, X86_REG_ST1, 0 }, { X86_REG_FPSW, 0 }, { X86_GRP_FPU, 0 }, 0, 0
1906419064
#endif
1906519065
},
1906619066

@@ -19074,42 +19074,42 @@
1907419074
{
1907519075
X86_UCOM_FpIr32, X86_INS_FUCOMP, 0,
1907619076
#ifndef CAPSTONE_DIET
19077-
{ 0 }, { 0 }, { 0 }, 0, 0
19077+
{ X86_REG_ST0, 0 }, { X86_REG_FPSW, 0 }, { X86_GRP_FPU, 0 }, 0, 0
1907819078
#endif
1907919079
},
1908019080

1908119081
{
1908219082
X86_UCOM_FpIr64, X86_INS_FUCOMP, 1,
1908319083
#ifndef CAPSTONE_DIET
19084-
{ 0 }, { 0 }, { 0 }, 0, 0
19084+
{ X86_REG_ST0, 0 }, { X86_REG_FPSW, 0 }, { X86_GRP_FPU, 0 }, 0, 0
1908519085
#endif
1908619086
},
1908719087

1908819088
{
1908919089
X86_UCOM_FpIr80, X86_INS_FUCOMP, 0,
1909019090
#ifndef CAPSTONE_DIET
19091-
{ 0 }, { 0 }, { 0 }, 0, 0
19091+
{ X86_REG_ST0, 0 }, { X86_REG_FPSW, 0 }, { X86_GRP_FPU, 0 }, 0, 0
1909219092
#endif
1909319093
},
1909419094

1909519095
{
1909619096
X86_UCOM_Fpr32, X86_INS_FUCOMP, 0,
1909719097
#ifndef CAPSTONE_DIET
19098-
{ 0 }, { 0 }, { 0 }, 0, 0
19098+
{ X86_REG_ST0, 0 }, { X86_REG_FPSW, 0 }, { X86_GRP_FPU, 0 }, 0, 0
1909919099
#endif
1910019100
},
1910119101

1910219102
{
1910319103
X86_UCOM_Fpr64, X86_INS_FUCOMP, 1,
1910419104
#ifndef CAPSTONE_DIET
19105-
{ 0 }, { 0 }, { 0 }, 0, 0
19105+
{ X86_REG_ST0, 0 }, { X86_REG_FPSW, 0 }, { X86_GRP_FPU, 0 }, 0, 0
1910619106
#endif
1910719107
},
1910819108

1910919109
{
1911019110
X86_UCOM_Fpr80, X86_INS_FUCOMP, 0,
1911119111
#ifndef CAPSTONE_DIET
19112-
{ 0 }, { 0 }, { 0 }, 0, 0
19112+
{ X86_REG_ST0, 0 }, { X86_REG_FPSW, 0 }, { X86_GRP_FPU, 0 }, 0, 0
1911319113
#endif
1911419114
},
1911519115

arch/X86/X86MappingInsnOp.inc

+15-15
Original file line numberDiff line numberDiff line change
@@ -2884,12 +2884,12 @@
28842884
},
28852885

28862886
{ /* X86_COM_FIPr, X86_INS_FCOMPI: fcompi */
2887-
X86_FPU_FLAGS_RESET_C1 | X86_FPU_FLAGS_UNDEFINED_C0 | X86_FPU_FLAGS_UNDEFINED_C2 | X86_FPU_FLAGS_UNDEFINED_C3,
2887+
0,
28882888
{ CS_AC_READ, 0 }
28892889
},
28902890

28912891
{ /* X86_COM_FIr, X86_INS_FCOMI: fcomi */
2892-
X86_FPU_FLAGS_RESET_C1 | X86_FPU_FLAGS_UNDEFINED_C0 | X86_FPU_FLAGS_UNDEFINED_C2 | X86_FPU_FLAGS_UNDEFINED_C3,
2892+
0,
28932893
{ CS_AC_READ, 0 }
28942894
},
28952895

@@ -13609,7 +13609,7 @@
1360913609
},
1361013610

1361113611
{ /* X86_UCOM_FIr, X86_INS_FUCOMI: fucomi */
13612-
X86_FPU_FLAGS_RESET_C1 | X86_FPU_FLAGS_UNDEFINED_C0 | X86_FPU_FLAGS_UNDEFINED_C2 | X86_FPU_FLAGS_UNDEFINED_C3,
13612+
0,
1361313613
{ CS_AC_READ, 0 }
1361413614
},
1361513615

@@ -13624,33 +13624,33 @@
1362413624
},
1362513625

1362613626
{ /* X86_UCOM_FpIr32, X86_INS_FUCOMP: fucomp */
13627-
0,
13628-
{ 0 }
13627+
X86_FPU_FLAGS_MODIFY_C1 | X86_FPU_FLAGS_MODIFY_C0 | X86_FPU_FLAGS_MODIFY_C2 | X86_FPU_FLAGS_MODIFY_C3,
13628+
{ CS_AC_READ, 0 }
1362913629
},
1363013630

1363113631
{ /* X86_UCOM_FpIr64, X86_INS_FUCOMP: fucomp */
13632-
0,
13633-
{ 0 }
13632+
X86_FPU_FLAGS_MODIFY_C1 | X86_FPU_FLAGS_MODIFY_C0 | X86_FPU_FLAGS_MODIFY_C2 | X86_FPU_FLAGS_MODIFY_C3,
13633+
{ CS_AC_READ, 0 }
1363413634
},
1363513635

1363613636
{ /* X86_UCOM_FpIr80, X86_INS_FUCOMP: fucomp */
13637-
0,
13638-
{ 0 }
13637+
X86_FPU_FLAGS_MODIFY_C1 | X86_FPU_FLAGS_MODIFY_C0 | X86_FPU_FLAGS_MODIFY_C2 | X86_FPU_FLAGS_MODIFY_C3,
13638+
{ CS_AC_READ, 0 }
1363913639
},
1364013640

1364113641
{ /* X86_UCOM_Fpr32, X86_INS_FUCOMP: fucomp */
13642-
0,
13643-
{ 0 }
13642+
X86_FPU_FLAGS_MODIFY_C1 | X86_FPU_FLAGS_MODIFY_C0 | X86_FPU_FLAGS_MODIFY_C2 | X86_FPU_FLAGS_MODIFY_C3,
13643+
{ CS_AC_READ, 0 }
1364413644
},
1364513645

1364613646
{ /* X86_UCOM_Fpr64, X86_INS_FUCOMP: fucomp */
13647-
0,
13648-
{ 0 }
13647+
X86_FPU_FLAGS_MODIFY_C1 | X86_FPU_FLAGS_MODIFY_C0 | X86_FPU_FLAGS_MODIFY_C2 | X86_FPU_FLAGS_MODIFY_C3,
13648+
{ CS_AC_READ, 0 }
1364913649
},
1365013650

1365113651
{ /* X86_UCOM_Fpr80, X86_INS_FUCOMP: fucomp */
13652-
0,
13653-
{ 0 }
13652+
X86_FPU_FLAGS_MODIFY_C1 | X86_FPU_FLAGS_MODIFY_C0 | X86_FPU_FLAGS_MODIFY_C2 | X86_FPU_FLAGS_MODIFY_C3,
13653+
{ CS_AC_READ, 0 }
1365413654
},
1365513655

1365613656
{ /* X86_UCOM_Fr, X86_INS_FUCOM: fucom */

tests/details/x86.yaml

+82
Original file line numberDiff line numberDiff line change
@@ -1240,3 +1240,85 @@ test_cases:
12401240
size: 8
12411241
eflags: [ X86_EFLAGS_TEST_ZF ]
12421242
regs_read: [ rflags ]
1243+
-
1244+
input:
1245+
bytes: [ 0xdb, 0xe8 ]
1246+
arch: "x86"
1247+
options: [ CS_OPT_DETAIL, CS_MODE_64 ]
1248+
address: 0x1000
1249+
expected:
1250+
insns:
1251+
-
1252+
asm_text: "fucomi st(0)"
1253+
details:
1254+
x86:
1255+
prefix: [ X86_PREFIX_0, X86_PREFIX_0, X86_PREFIX_0, X86_PREFIX_0 ]
1256+
opcode: [ 0xdb, 0x00, 0x00, 0x00 ]
1257+
rex: 0x0
1258+
addr_size: 8
1259+
modrm: 0xe8
1260+
disp: 0x0
1261+
sib: 0x0
1262+
operands:
1263+
-
1264+
type: X86_OP_REG
1265+
reg: st(0)
1266+
size: 10
1267+
access: CS_AC_READ
1268+
regs_read: [ st(0) ]
1269+
regs_write: [ rflags ]
1270+
-
1271+
input:
1272+
bytes: [ 0xd8, 0xd1 ]
1273+
arch: "x86"
1274+
options: [ CS_OPT_DETAIL, CS_MODE_64 ]
1275+
address: 0x1000
1276+
expected:
1277+
insns:
1278+
-
1279+
asm_text: "fcom st(1)"
1280+
details:
1281+
x86:
1282+
prefix: [ X86_PREFIX_0, X86_PREFIX_0, X86_PREFIX_0, X86_PREFIX_0 ]
1283+
opcode: [ 0xd8, 0x00, 0x00, 0x00 ]
1284+
rex: 0x0
1285+
addr_size: 8
1286+
modrm: 0xd1
1287+
disp: 0x0
1288+
sib: 0x0
1289+
operands:
1290+
-
1291+
type: X86_OP_REG
1292+
reg: st(1)
1293+
size: 10
1294+
access: CS_AC_READ
1295+
regs_read: [ st(0), st(1) ]
1296+
regs_write: [ fpsw ]
1297+
-
1298+
input:
1299+
bytes: [ 0xde, 0x14, 0x25, 0x34, 0x12, 0x00, 0x00 ]
1300+
arch: "x86"
1301+
options: [ CS_OPT_DETAIL, CS_MODE_64 ]
1302+
address: 0x1000
1303+
expected:
1304+
insns:
1305+
-
1306+
asm_text: "ficom word ptr [0x1234]"
1307+
details:
1308+
x86:
1309+
prefix: [ X86_PREFIX_0, X86_PREFIX_0, X86_PREFIX_0, X86_PREFIX_0 ]
1310+
opcode: [ 0xde, 0x00, 0x00, 0x00 ]
1311+
rex: 0x0
1312+
addr_size: 8
1313+
modrm: 0x14
1314+
disp: 0x1234
1315+
sib: 0x25
1316+
sib_scale: 1
1317+
operands:
1318+
-
1319+
type: X86_OP_MEM
1320+
mem_disp: 0x1234
1321+
size: 2
1322+
access: CS_AC_READ
1323+
regs_read: [ st(0) ]
1324+
regs_write: [ fpsw ]

0 commit comments

Comments
 (0)