Skip to content

Commit 36b7c30

Browse files
authored
[X86, MC] Recognize OSIZE=64b when EVEX.W = 1, EVEX.pp = 01 (#103816)
In the legacy space, if both the 66 prefix and REX.W=1 are present, the REX.W=1 takes precedence and makes OSIZE=64b. EVEX map 4 inherits this convention, with EVEX.pp=01 and EVEX.W playing the roles of the 66 prefix and REX.W. So if EVEX.pp=00, the OSIZE can only be 64b or 32b, depending on whether EVEX.W=1 or not. But if EVEX.pp=01, then OSIZE is either 64b or 16b depending on whether EVEX.W=1 or not.
1 parent fcb3a04 commit 36b7c30

File tree

2 files changed

+118
-0
lines changed

2 files changed

+118
-0
lines changed
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
# RUN: llvm-mc -triple x86_64 -disassemble %s | FileCheck %s --check-prefix=ATT
2+
# RUN: llvm-mc -triple x86_64 -disassemble -output-asm-variant=1 %s | FileCheck %s --check-prefix=INTEL
3+
4+
## This test is to check OSIZE=64b when EVEX.W=1 and EVEX.pp = 01.
5+
6+
## adc
7+
# ATT: {evex} adcq $123, %r9
8+
# INTEL: {evex} adc r9, 123
9+
0x62,0xd4,0xfd,0x08,0x83,0xd1,0x7b
10+
11+
# ATT: adcq $123, %r9, %r10
12+
# INTEL: adc r10, r9, 123
13+
0x62,0xd4,0xad,0x18,0x83,0xd1,0x7b
14+
15+
## add
16+
# ATT: {evex} addq $123, %r9
17+
# INTEL: {evex} add r9, 123
18+
0x62,0xd4,0xfd,0x08,0x83,0xc1,0x7b
19+
20+
# ATT: addq $123, %r9, %r10
21+
# INTEL: add r10, r9, 123
22+
0x62,0xd4,0xad,0x18,0x83,0xc1,0x7b
23+
24+
# ATT: {nf} addq $123, %r9
25+
# INTEL: {nf} add r9, 123
26+
0x62,0xd4,0xfd,0x0c,0x83,0xc1,0x7b
27+
28+
# ATT: {nf} addq $123, %r9, %r10
29+
# INTEL: {nf} add r10, r9, 123
30+
0x62,0xd4,0xad,0x1c,0x83,0xc1,0x7b
31+
32+
## sbb
33+
# ATT: {evex} sbbq $123, %r9
34+
# INTEL: {evex} sbb r9, 123
35+
0x62,0xd4,0xfd,0x08,0x83,0xd9,0x7b
36+
37+
# ATT: sbbq $123, %r9, %r10
38+
# INTEL: sbb r10, r9, 123
39+
0x62,0xd4,0xad,0x18,0x83,0xd9,0x7b
40+
41+
## sub
42+
# ATT: {evex} subq $123, %r9
43+
# INTEL: {evex} sub r9, 123
44+
0x62,0xd4,0xfd,0x08,0x83,0xe9,0x7b
45+
46+
# ATT: subq $123, %r9, %r10
47+
# INTEL: sub r10, r9, 123
48+
0x62,0xd4,0xad,0x18,0x83,0xe9,0x7b
49+
50+
# ATT: {nf} subq $123, %r9
51+
# INTEL: {nf} sub r9, 123
52+
0x62,0xd4,0xfd,0x0c,0x83,0xe9,0x7b
53+
54+
# ATT: {nf} subq $123, %r9, %r10
55+
# INTEL: {nf} sub r10, r9, 123
56+
0x62,0xd4,0xad,0x1c,0x83,0xe9,0x7b
57+
58+
## imul
59+
# ATT: {evex} imulq $123, %r9, %r10
60+
# INTEL: {evex} imul r10, r9, 123
61+
0x62,0x54,0xfd,0x08,0x6b,0xd1,0x7b
62+
63+
# ATT: {nf} imulq $123, %r9, %r10
64+
# INTEL: {nf} imul r10, r9, 123
65+
0x62,0x54,0xfd,0x0c,0x6b,0xd1,0x7b
66+
67+
## and
68+
# ATT: {evex} andq $123, %r9
69+
# INTEL: {evex} and r9, 123
70+
0x62,0xd4,0xfd,0x08,0x83,0xe1,0x7b
71+
72+
# ATT: andq $123, %r9, %r10
73+
# INTEL: and r10, r9, 123
74+
0x62,0xd4,0xad,0x18,0x83,0xe1,0x7b
75+
76+
# ATT: {nf} andq $123, %r9
77+
# INTEL: {nf} and r9, 123
78+
0x62,0xd4,0xfd,0x0c,0x83,0xe1,0x7b
79+
80+
# ATT: {nf} andq $123, %r9, %r10
81+
# INTEL: {nf} and r10, r9, 123
82+
0x62,0xd4,0xad,0x1c,0x83,0xe1,0x7b
83+
84+
## or
85+
# ATT: {evex} orq $123, %r9
86+
# INTEL: {evex} or r9, 123
87+
0x62,0xd4,0xfd,0x08,0x83,0xc9,0x7b
88+
89+
# ATT: orq $123, %r9, %r10
90+
# INTEL: or r10, r9, 123
91+
0x62,0xd4,0xad,0x18,0x83,0xc9,0x7b
92+
93+
# ATT: {nf} orq $123, %r9
94+
# INTEL: {nf} or r9, 123
95+
0x62,0xd4,0xfd,0x0c,0x83,0xc9,0x7b
96+
97+
# ATT: {nf} orq $123, %r9, %r10
98+
# INTEL: {nf} or r10, r9, 123
99+
0x62,0xd4,0xad,0x1c,0x83,0xc9,0x7b
100+
101+
## xor
102+
# ATT: {evex} xorq $123, %r9
103+
# INTEL: {evex} xor r9, 123
104+
0x62,0xd4,0xfd,0x08,0x83,0xf1,0x7b
105+
106+
# ATT: xorq $123, %r9, %r10
107+
# INTEL: xor r10, r9, 123
108+
0x62,0xd4,0xad,0x18,0x83,0xf1,0x7b
109+
110+
# ATT: {nf} xorq $123, %r9
111+
# INTEL: {nf} xor r9, 123
112+
0x62,0xd4,0xfd,0x0c,0x83,0xf1,0x7b
113+
114+
# ATT: {nf} xorq $123, %r9, %r10
115+
# INTEL: {nf} xor r10, r9, 123
116+
0x62,0xd4,0xad,0x1c,0x83,0xf1,0x7b

llvm/utils/TableGen/X86DisassemblerTables.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,7 @@ static inline bool inheritsFrom(InstructionContext child,
268268
(VEX_LIG && inheritsFrom(child, IC_EVEX_L2_OPSIZE_KZ));
269269
case IC_EVEX_W:
270270
return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W)) ||
271+
inheritsFrom(child, IC_EVEX_W_OPSIZE) ||
271272
(VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W));
272273
case IC_EVEX_W_XS:
273274
return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_XS)) ||
@@ -454,6 +455,7 @@ static inline bool inheritsFrom(InstructionContext child,
454455
(VEX_LIG && inheritsFrom(child, IC_EVEX_L2_OPSIZE_KZ_B));
455456
case IC_EVEX_W_B:
456457
return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_B)) ||
458+
inheritsFrom(child, IC_EVEX_W_OPSIZE_B) ||
457459
(VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W_B));
458460
case IC_EVEX_W_XS_B:
459461
return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_XS_B)) ||

0 commit comments

Comments
 (0)