]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - opcodes/i386-opc.h
2.41 Release sources
[thirdparty/binutils-gdb.git] / opcodes / i386-opc.h
CommitLineData
0b1cf022 1/* Declarations for Intel 80386 opcode table
d87bef3a 2 Copyright (C) 2007-2023 Free Software Foundation, Inc.
0b1cf022 3
9b201bb5 4 This file is part of the GNU opcodes library.
0b1cf022 5
9b201bb5 6 This library is free software; you can redistribute it and/or modify
0b1cf022 7 it under the terms of the GNU General Public License as published by
9b201bb5 8 the Free Software Foundation; either version 3, or (at your option)
0b1cf022
L
9 any later version.
10
9b201bb5
NC
11 It is distributed in the hope that it will be useful, but WITHOUT
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
14 License for more details.
0b1cf022
L
15
16 You should have received a copy of the GNU General Public License
17 along with GAS; see the file COPYING. If not, write to the Free
18 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
19 02110-1301, USA. */
20
21#include "opcode/i386.h"
40fb9820 22#include <limits.h>
40fb9820
L
23#ifndef CHAR_BIT
24#define CHAR_BIT 8
25#endif
26
27/* Position of cpu flags bitfiled. */
28
52a6c1fe
L
29enum
30{
31 /* i186 or better required */
32 Cpu186 = 0,
33 /* i286 or better required */
34 Cpu286,
35 /* i386 or better required */
36 Cpu386,
37 /* i486 or better required */
38 Cpu486,
39 /* i585 or better required */
40 Cpu586,
41 /* i686 or better required */
42 Cpu686,
d871f3f4
L
43 /* CMOV Instruction support required */
44 CpuCMOV,
45 /* FXSR Instruction support required */
46 CpuFXSR,
b49dfb4a 47 /* CLFLUSH Instruction support required */
52a6c1fe 48 CpuClflush,
22109423
L
49 /* NOP Instruction support required */
50 CpuNop,
b49dfb4a 51 /* SYSCALL Instructions support required */
52a6c1fe
L
52 CpuSYSCALL,
53 /* Floating point support required */
54 Cpu8087,
55 /* i287 support required */
56 Cpu287,
57 /* i387 support required */
58 Cpu387,
59 /* i686 and floating point support required */
60 Cpu687,
61 /* SSE3 and floating point support required */
62 CpuFISTTP,
63 /* MMX support required */
64 CpuMMX,
65 /* SSE support required */
66 CpuSSE,
67 /* SSE2 support required */
68 CpuSSE2,
69 /* 3dnow! support required */
70 Cpu3dnow,
71 /* 3dnow! Extensions support required */
72 Cpu3dnowA,
73 /* SSE3 support required */
74 CpuSSE3,
75 /* VIA PadLock required */
76 CpuPadLock,
77 /* AMD Secure Virtual Machine Ext-s required */
78 CpuSVME,
79 /* VMX Instructions required */
80 CpuVMX,
81 /* SMX Instructions required */
82 CpuSMX,
83 /* SSSE3 support required */
84 CpuSSSE3,
85 /* SSE4a support required */
86 CpuSSE4a,
272a84b1
L
87 /* LZCNT support required */
88 CpuLZCNT,
89 /* POPCNT support required */
90 CpuPOPCNT,
cafa5ef7
JB
91 /* MONITOR support required */
92 CpuMONITOR,
52a6c1fe
L
93 /* SSE4.1 support required */
94 CpuSSE4_1,
95 /* SSE4.2 support required */
96 CpuSSE4_2,
97 /* AVX support required */
98 CpuAVX,
6c30d220
L
99 /* AVX2 support required */
100 CpuAVX2,
43234a1e
L
101 /* Intel AVX-512 Foundation Instructions support required */
102 CpuAVX512F,
103 /* Intel AVX-512 Conflict Detection Instructions support required */
104 CpuAVX512CD,
105 /* Intel AVX-512 Exponential and Reciprocal Instructions support
106 required */
107 CpuAVX512ER,
108 /* Intel AVX-512 Prefetch Instructions support required */
109 CpuAVX512PF,
b28d1bda
IT
110 /* Intel AVX-512 VL Instructions support required. */
111 CpuAVX512VL,
90a915bf
IT
112 /* Intel AVX-512 DQ Instructions support required. */
113 CpuAVX512DQ,
1ba585e8
IT
114 /* Intel AVX-512 BW Instructions support required. */
115 CpuAVX512BW,
7b6d09fb
L
116 /* Intel IAMCU support required */
117 CpuIAMCU,
b49dfb4a 118 /* Xsave/xrstor New Instructions support required */
52a6c1fe 119 CpuXsave,
b49dfb4a 120 /* Xsaveopt New Instructions support required */
c7b8aa3a 121 CpuXsaveopt,
52a6c1fe
L
122 /* AES support required */
123 CpuAES,
124 /* PCLMUL support required */
125 CpuPCLMUL,
126 /* FMA support required */
127 CpuFMA,
128 /* FMA4 support required */
129 CpuFMA4,
5dd85c99
SP
130 /* XOP support required */
131 CpuXOP,
f88c9eb0
SP
132 /* LWP support required */
133 CpuLWP,
f12dc422
L
134 /* BMI support required */
135 CpuBMI,
2a2a0f38
QN
136 /* TBM support required */
137 CpuTBM,
b49dfb4a 138 /* MOVBE Instruction support required */
52a6c1fe 139 CpuMovbe,
60aa667e
L
140 /* CMPXCHG16B instruction support required. */
141 CpuCX16,
c3bb24f5
JB
142 /* LAHF/SAHF instruction support required (in 64-bit mode). */
143 CpuLAHF_SAHF,
52a6c1fe
L
144 /* EPT Instructions required */
145 CpuEPT,
b49dfb4a 146 /* RDTSCP Instruction support required */
52a6c1fe 147 CpuRdtscp,
77321f53 148 /* FSGSBASE Instructions required */
c7b8aa3a
L
149 CpuFSGSBase,
150 /* RDRND Instructions required */
151 CpuRdRnd,
152 /* F16C Instructions required */
153 CpuF16C,
6c30d220
L
154 /* Intel BMI2 support required */
155 CpuBMI2,
42164a71
L
156 /* HLE support required */
157 CpuHLE,
158 /* RTM support required */
159 CpuRTM,
6c30d220
L
160 /* INVPCID Instructions required */
161 CpuINVPCID,
8729a6f6
L
162 /* VMFUNC Instruction required */
163 CpuVMFUNC,
7e8b059b
L
164 /* Intel MPX Instructions required */
165 CpuMPX,
52a6c1fe
L
166 /* 64bit support available, used by -march= in assembler. */
167 CpuLM,
e2e1fcde
L
168 /* RDRSEED instruction required. */
169 CpuRDSEED,
170 /* Multi-presisionn add-carry instructions are required. */
171 CpuADX,
7b458c12 172 /* Supports prefetchw and prefetch instructions. */
e2e1fcde 173 CpuPRFCHW,
5c111e37
L
174 /* SMAP instructions required. */
175 CpuSMAP,
a0046408
L
176 /* SHA instructions required. */
177 CpuSHA,
963f3586
IT
178 /* CLFLUSHOPT instruction required */
179 CpuClflushOpt,
180 /* XSAVES/XRSTORS instruction required */
181 CpuXSAVES,
182 /* XSAVEC instruction required */
183 CpuXSAVEC,
dcf893b5
IT
184 /* PREFETCHWT1 instruction required */
185 CpuPREFETCHWT1,
2cf200a4
IT
186 /* SE1 instruction required */
187 CpuSE1,
c5e7287a
IT
188 /* CLWB instruction required */
189 CpuCLWB,
2cc1b5aa
IT
190 /* Intel AVX-512 IFMA Instructions support required. */
191 CpuAVX512IFMA,
14f195c9
IT
192 /* Intel AVX-512 VBMI Instructions support required. */
193 CpuAVX512VBMI,
920d2ddc
IT
194 /* Intel AVX-512 4FMAPS Instructions support required. */
195 CpuAVX512_4FMAPS,
47acf0bd
IT
196 /* Intel AVX-512 4VNNIW Instructions support required. */
197 CpuAVX512_4VNNIW,
620214f7
IT
198 /* Intel AVX-512 VPOPCNTDQ Instructions support required. */
199 CpuAVX512_VPOPCNTDQ,
53467f57
IT
200 /* Intel AVX-512 VBMI2 Instructions support required. */
201 CpuAVX512_VBMI2,
8cfcb765
IT
202 /* Intel AVX-512 VNNI Instructions support required. */
203 CpuAVX512_VNNI,
ee6872be
IT
204 /* Intel AVX-512 BITALG Instructions support required. */
205 CpuAVX512_BITALG,
d6aab7a1
XG
206 /* Intel AVX-512 BF16 Instructions support required. */
207 CpuAVX512_BF16,
9186c494
L
208 /* Intel AVX-512 VP2INTERSECT Instructions support required. */
209 CpuAVX512_VP2INTERSECT,
81d54bb7
CL
210 /* TDX Instructions support required. */
211 CpuTDX,
58bf9b6a
L
212 /* Intel AVX VNNI Instructions support required. */
213 CpuAVX_VNNI,
0cc78721
CL
214 /* Intel AVX-512 FP16 Instructions support required. */
215 CpuAVX512_FP16,
ef07be45
CL
216 /* PREFETCHI instruction required */
217 CpuPREFETCHI,
4321af3e
HW
218 /* Intel AVX IFMA Instructions support required. */
219 CpuAVX_IFMA,
23ae61ad
CL
220 /* Intel AVX VNNI-INT8 Instructions support required. */
221 CpuAVX_VNNI_INT8,
a93e3234
HJ
222 /* Intel CMPccXADD instructions support required. */
223 CpuCMPCCXADD,
941f0833
HL
224 /* Intel WRMSRNS Instructions support required */
225 CpuWRMSRNS,
2188d6ea
HL
226 /* Intel MSRLIST Instructions support required. */
227 CpuMSRLIST,
01d8ce74 228 /* Intel AVX NE CONVERT Instructions support required. */
229 CpuAVX_NE_CONVERT,
b06311ad
KL
230 /* Intel RAO INT Instructions support required. */
231 CpuRAO_INT,
c88ed92f
ZJ
232 /* fred instruction required */
233 CpuFRED,
234 /* lkgs instruction required */
235 CpuLKGS,
9916071f
AP
236 /* mwaitx instruction required */
237 CpuMWAITX,
43e65147 238 /* Clzero instruction required */
029f3522 239 CpuCLZERO,
8eab4136
L
240 /* OSPKE instruction required */
241 CpuOSPKE,
8bc52696
AF
242 /* RDPID instruction required */
243 CpuRDPID,
6b40c462
L
244 /* PTWRITE instruction required */
245 CpuPTWRITE,
d777820b
IT
246 /* CET instructions support required */
247 CpuIBT,
248 CpuSHSTK,
260cd341
LC
249 /* AMX-INT8 instructions required */
250 CpuAMX_INT8,
251 /* AMX-BF16 instructions required */
252 CpuAMX_BF16,
68830fba
CL
253 /* AMX-FP16 instructions required */
254 CpuAMX_FP16,
d100d8c1
HJ
255 /* AMX-COMPLEX instructions required. */
256 CpuAMX_COMPLEX,
260cd341
LC
257 /* AMX-TILE instructions required */
258 CpuAMX_TILE,
48521003
IT
259 /* GFNI instructions required */
260 CpuGFNI,
8dcf1fad
IT
261 /* VAES instructions required */
262 CpuVAES,
ff1982d5
IT
263 /* VPCLMULQDQ instructions required */
264 CpuVPCLMULQDQ,
3233d7d0
IT
265 /* WBNOINVD instructions required */
266 CpuWBNOINVD,
be3a8dca
IT
267 /* PCONFIG instructions required */
268 CpuPCONFIG,
de89d0a3
IT
269 /* WAITPKG instructions required */
270 CpuWAITPKG,
f64c42a9
LC
271 /* UINTR instructions required */
272 CpuUINTR,
c48935d7
IT
273 /* CLDEMOTE instruction required */
274 CpuCLDEMOTE,
c0a30a9f
L
275 /* MOVDIRI instruction support required */
276 CpuMOVDIRI,
277 /* MOVDIRR64B instruction required */
278 CpuMOVDIR64B,
5d79adc4
L
279 /* ENQCMD instruction required */
280 CpuENQCMD,
4b27d27c
L
281 /* SERIALIZE instruction required */
282 CpuSERIALIZE,
142861df
JB
283 /* RDPRU instruction required */
284 CpuRDPRU,
285 /* MCOMMIT instruction required */
286 CpuMCOMMIT,
a847e322
JB
287 /* SEV-ES instruction(s) required */
288 CpuSEV_ES,
bb651e8b
CL
289 /* TSXLDTRK instruction required */
290 CpuTSXLDTRK,
c4694f17
TG
291 /* KL instruction support required */
292 CpuKL,
293 /* WideKL instruction support required */
294 CpuWideKL,
c1fa250a
LC
295 /* HRESET instruction required */
296 CpuHRESET,
646cc3e0
GG
297 /* INVLPGB instructions required */
298 CpuINVLPGB,
299 /* TLBSYNC instructions required */
300 CpuTLBSYNC,
301 /* SNP instructions required */
302 CpuSNP,
b0e8fa7f
TJ
303 /* RMPQUERY instruction required */
304 CpuRMPQUERY,
13ed231a
JB
305
306 /* NOTE: These last three items need to remain last and in this order. */
307
52a6c1fe
L
308 /* 64bit support required */
309 Cpu64,
310 /* Not supported in the 64bit mode */
311 CpuNo64,
312 /* The last bitfield in i386_cpu_flags. */
e92bae62 313 CpuMax = CpuNo64
52a6c1fe 314};
40fb9820
L
315
316#define CpuNumOfUints \
317 (CpuMax / sizeof (unsigned int) / CHAR_BIT + 1)
318#define CpuNumOfBits \
319 (CpuNumOfUints * sizeof (unsigned int) * CHAR_BIT)
320
321/* If you get a compiler error for zero width of the unused field,
322 comment it out. */
a93e3234 323#define CpuUnused (CpuMax + 1)
53467f57 324
40fb9820
L
325/* We can check if an instruction is available with array instead
326 of bitfield. */
327typedef union i386_cpu_flags
328{
329 struct
330 {
331 unsigned int cpui186:1;
332 unsigned int cpui286:1;
333 unsigned int cpui386:1;
334 unsigned int cpui486:1;
335 unsigned int cpui586:1;
336 unsigned int cpui686:1;
d871f3f4
L
337 unsigned int cpucmov:1;
338 unsigned int cpufxsr:1;
bd5295b2 339 unsigned int cpuclflush:1;
22109423 340 unsigned int cpunop:1;
bd5295b2 341 unsigned int cpusyscall:1;
309d3373
JB
342 unsigned int cpu8087:1;
343 unsigned int cpu287:1;
344 unsigned int cpu387:1;
345 unsigned int cpu687:1;
346 unsigned int cpufisttp:1;
40fb9820 347 unsigned int cpummx:1;
40fb9820
L
348 unsigned int cpusse:1;
349 unsigned int cpusse2:1;
350 unsigned int cpua3dnow:1;
351 unsigned int cpua3dnowa:1;
352 unsigned int cpusse3:1;
353 unsigned int cpupadlock:1;
354 unsigned int cpusvme:1;
355 unsigned int cpuvmx:1;
47dd174c 356 unsigned int cpusmx:1;
40fb9820
L
357 unsigned int cpussse3:1;
358 unsigned int cpusse4a:1;
272a84b1
L
359 unsigned int cpulzcnt:1;
360 unsigned int cpupopcnt:1;
cafa5ef7 361 unsigned int cpumonitor:1;
40fb9820
L
362 unsigned int cpusse4_1:1;
363 unsigned int cpusse4_2:1;
c0f3af97 364 unsigned int cpuavx:1;
6c30d220 365 unsigned int cpuavx2:1;
43234a1e
L
366 unsigned int cpuavx512f:1;
367 unsigned int cpuavx512cd:1;
368 unsigned int cpuavx512er:1;
369 unsigned int cpuavx512pf:1;
b28d1bda 370 unsigned int cpuavx512vl:1;
90a915bf 371 unsigned int cpuavx512dq:1;
1ba585e8 372 unsigned int cpuavx512bw:1;
7b6d09fb 373 unsigned int cpuiamcu:1;
475a2301 374 unsigned int cpuxsave:1;
c7b8aa3a 375 unsigned int cpuxsaveopt:1;
c0f3af97 376 unsigned int cpuaes:1;
594ab6a3 377 unsigned int cpupclmul:1;
c0f3af97 378 unsigned int cpufma:1;
922d8de8 379 unsigned int cpufma4:1;
5dd85c99 380 unsigned int cpuxop:1;
f88c9eb0 381 unsigned int cpulwp:1;
f12dc422 382 unsigned int cpubmi:1;
2a2a0f38 383 unsigned int cputbm:1;
f1f8f695 384 unsigned int cpumovbe:1;
60aa667e 385 unsigned int cpucx16:1;
c3bb24f5 386 unsigned int cpulahf_sahf:1;
f1f8f695 387 unsigned int cpuept:1;
1b7f3fb0 388 unsigned int cpurdtscp:1;
c7b8aa3a
L
389 unsigned int cpufsgsbase:1;
390 unsigned int cpurdrnd:1;
391 unsigned int cpuf16c:1;
6c30d220 392 unsigned int cpubmi2:1;
42164a71
L
393 unsigned int cpuhle:1;
394 unsigned int cpurtm:1;
6c30d220 395 unsigned int cpuinvpcid:1;
8729a6f6 396 unsigned int cpuvmfunc:1;
7e8b059b 397 unsigned int cpumpx:1;
40fb9820 398 unsigned int cpulm:1;
e2e1fcde
L
399 unsigned int cpurdseed:1;
400 unsigned int cpuadx:1;
401 unsigned int cpuprfchw:1;
5c111e37 402 unsigned int cpusmap:1;
a0046408 403 unsigned int cpusha:1;
963f3586
IT
404 unsigned int cpuclflushopt:1;
405 unsigned int cpuxsaves:1;
406 unsigned int cpuxsavec:1;
dcf893b5 407 unsigned int cpuprefetchwt1:1;
2cf200a4 408 unsigned int cpuse1:1;
c5e7287a 409 unsigned int cpuclwb:1;
2cc1b5aa 410 unsigned int cpuavx512ifma:1;
14f195c9 411 unsigned int cpuavx512vbmi:1;
920d2ddc 412 unsigned int cpuavx512_4fmaps:1;
47acf0bd 413 unsigned int cpuavx512_4vnniw:1;
620214f7 414 unsigned int cpuavx512_vpopcntdq:1;
53467f57 415 unsigned int cpuavx512_vbmi2:1;
8cfcb765 416 unsigned int cpuavx512_vnni:1;
ee6872be 417 unsigned int cpuavx512_bitalg:1;
d6aab7a1 418 unsigned int cpuavx512_bf16:1;
9186c494 419 unsigned int cpuavx512_vp2intersect:1;
81d54bb7 420 unsigned int cputdx:1;
58bf9b6a 421 unsigned int cpuavx_vnni:1;
0cc78721 422 unsigned int cpuavx512_fp16:1;
ef07be45 423 unsigned int cpuprefetchi:1;
4321af3e 424 unsigned int cpuavx_ifma:1;
23ae61ad 425 unsigned int cpuavx_vnni_int8:1;
a93e3234 426 unsigned int cpucmpccxadd:1;
941f0833 427 unsigned int cpuwrmsrns:1;
2188d6ea 428 unsigned int cpumsrlist:1;
01d8ce74 429 unsigned int cpuavx_ne_convert:1;
b06311ad 430 unsigned int cpurao_int:1;
c88ed92f
ZJ
431 unsigned int cpufred:1;
432 unsigned int cpulkgs:1;
9916071f 433 unsigned int cpumwaitx:1;
029f3522 434 unsigned int cpuclzero:1;
8eab4136 435 unsigned int cpuospke:1;
8bc52696 436 unsigned int cpurdpid:1;
6b40c462 437 unsigned int cpuptwrite:1;
d777820b
IT
438 unsigned int cpuibt:1;
439 unsigned int cpushstk:1;
260cd341
LC
440 unsigned int cpuamx_int8:1;
441 unsigned int cpuamx_bf16:1;
68830fba 442 unsigned int cpuamx_fp16:1;
d100d8c1 443 unsigned int cpuamx_complex:1;
260cd341 444 unsigned int cpuamx_tile:1;
48521003 445 unsigned int cpugfni:1;
8dcf1fad 446 unsigned int cpuvaes:1;
ff1982d5 447 unsigned int cpuvpclmulqdq:1;
3233d7d0 448 unsigned int cpuwbnoinvd:1;
be3a8dca 449 unsigned int cpupconfig:1;
de89d0a3 450 unsigned int cpuwaitpkg:1;
f64c42a9 451 unsigned int cpuuintr:1;
c48935d7 452 unsigned int cpucldemote:1;
c0a30a9f
L
453 unsigned int cpumovdiri:1;
454 unsigned int cpumovdir64b:1;
5d79adc4 455 unsigned int cpuenqcmd:1;
4b27d27c 456 unsigned int cpuserialize:1;
142861df
JB
457 unsigned int cpurdpru:1;
458 unsigned int cpumcommit:1;
a847e322 459 unsigned int cpusev_es:1;
bb651e8b 460 unsigned int cputsxldtrk:1;
c4694f17
TG
461 unsigned int cpukl:1;
462 unsigned int cpuwidekl:1;
c1fa250a 463 unsigned int cpuhreset:1;
646cc3e0
GG
464 unsigned int cpuinvlpgb:1;
465 unsigned int cputlbsync:1;
466 unsigned int cpusnp:1;
b0e8fa7f 467 unsigned int cpurmpquery:1;
13ed231a 468 /* NOTE: These last three fields need to remain last and in this order. */
40fb9820
L
469 unsigned int cpu64:1;
470 unsigned int cpuno64:1;
471#ifdef CpuUnused
472 unsigned int unused:(CpuNumOfBits - CpuUnused);
473#endif
474 } bitfield;
475 unsigned int array[CpuNumOfUints];
476} i386_cpu_flags;
477
478/* Position of opcode_modifier bits. */
479
52a6c1fe
L
480enum
481{
482 /* has direction bit. */
483 D = 0,
507916b8
JB
484 /* set if operands can be both bytes and words/dwords/qwords, encoded the
485 canonical way; the base_opcode field should hold the encoding for byte
486 operands */
52a6c1fe 487 W,
86fa6981
L
488 /* load form instruction. Must be placed before store form. */
489 Load,
52a6c1fe
L
490 /* insn has a modrm byte. */
491 Modrm,
0cfa3eb3
JB
492 /* special case for jump insns; value has to be 1 */
493#define JUMP 1
52a6c1fe 494 /* call and jump */
0cfa3eb3 495#define JUMP_DWORD 2
52a6c1fe 496 /* loop and jecxz */
0cfa3eb3 497#define JUMP_BYTE 3
52a6c1fe 498 /* special case for intersegment leaps/calls */
0cfa3eb3 499#define JUMP_INTERSEGMENT 4
6f2f06be 500 /* absolute address for jump */
0cfa3eb3
JB
501#define JUMP_ABSOLUTE 5
502 Jump,
52a6c1fe
L
503 /* FP insn memory format bit, sized by 0x4 */
504 FloatMF,
52a6c1fe 505 /* needs size prefix if in 32-bit mode */
673fe0f0 506#define SIZE16 1
52a6c1fe 507 /* needs size prefix if in 16-bit mode */
673fe0f0 508#define SIZE32 2
52a6c1fe 509 /* needs size prefix if in 64-bit mode */
673fe0f0
JB
510#define SIZE64 3
511 Size,
9c19e9ec
JB
512 /* Check that operand sizes match. */
513 CheckOperandSize,
255571cd
JB
514 /* any memory size */
515#define ANY_SIZE 1
516 /* fake an extra reg operand for clr, imul and special register
517 processing for some instructions. */
518#define REG_KLUDGE 2
519 /* deprecated fp insn, gets a warning */
520#define UGH 3
521 /* An implicit xmm0 as the first operand */
522#define IMPLICIT_1ST_XMM0 4
523 /* The second operand must be a vector register, {x,y,z}mmN, where N is a multiple of 4.
524 It implicitly denotes the register group of {x,y,z}mmN - {x,y,z}mm(N + 3).
525 */
526#define IMPLICIT_QUAD_GROUP 5
527 /* Two source operands are swapped. */
528#define SWAP_SOURCES 6
529 /* Default mask isn't allowed. */
530#define NO_DEFAULT_MASK 7
531 /* Address prefix changes register operand */
532#define ADDR_PREFIX_OP_REG 8
0cc78721
CL
533 /* Instrucion requires that destination must be distinct from source
534 registers. */
255571cd
JB
535#define DISTINCT_DEST 9
536 OperandConstraint,
52a6c1fe
L
537 /* instruction ignores operand size prefix and in Intel mode ignores
538 mnemonic size suffix check. */
3cd7f3e3 539#define IGNORESIZE 1
52a6c1fe 540 /* default insn size depends on mode */
3cd7f3e3
L
541#define DEFAULTSIZE 2
542 MnemonicSize,
52a6c1fe
L
543 /* b suffix on instruction illegal */
544 No_bSuf,
545 /* w suffix on instruction illegal */
546 No_wSuf,
547 /* l suffix on instruction illegal */
548 No_lSuf,
549 /* s suffix on instruction illegal */
550 No_sSuf,
551 /* q suffix on instruction illegal */
552 No_qSuf,
52a6c1fe
L
553 /* instruction needs FWAIT */
554 FWait,
51c8edf6
JB
555 /* IsString provides for a quick test for string instructions, and
556 its actual value also indicates which of the operands (if any)
557 requires use of the %es segment. */
558#define IS_STRING_ES_OP0 2
559#define IS_STRING_ES_OP1 3
52a6c1fe 560 IsString,
dfd69174
JB
561 /* RegMem is for instructions with a modrm byte where the register
562 destination operand should be encoded in the mod and regmem fields.
563 Normally, it will be encoded in the reg field. We add a RegMem
564 flag to indicate that it should be encoded in the regmem field. */
565 RegMem,
7e8b059b
L
566 /* quick test if branch instruction is MPX supported */
567 BNDPrefixOk,
742732c7
JB
568#define PrefixNone 0
569#define PrefixRep 1
570#define PrefixHLERelease 2 /* Okay with an XRELEASE (0xf3) prefix. */
571#define PrefixNoTrack 3
572 /* Prefixes implying "LOCK okay" must come after Lock. All others have
573 to come before. */
574#define PrefixLock 4
575#define PrefixHLELock 5 /* Okay with a LOCK prefix. */
576#define PrefixHLEAny 6 /* Okay with or without a LOCK prefix. */
577 PrefixOk,
52a6c1fe
L
578 /* opcode is a prefix */
579 IsPrefix,
580 /* instruction has extension in 8 bit imm */
581 ImmExt,
582 /* instruction don't need Rex64 prefix. */
583 NoRex64,
52a6c1fe 584 /* insn has VEX prefix:
10c17abd 585 1: 128bit VEX prefix (or operand dependent).
2bf05e57 586 2: 256bit VEX prefix.
712366da 587 3: Scalar VEX prefix.
52a6c1fe 588 */
712366da
L
589#define VEX128 1
590#define VEX256 2
591#define VEXScalar 3
52a6c1fe 592 Vex,
2426c15f
L
593 /* How to encode VEX.vvvv:
594 0: VEX.vvvv must be 1111b.
eea96d3f 595 1: VEX.vvvv encodes one of the register operands.
2426c15f 596 */
2426c15f 597 VexVVVV,
1ef99a7b
L
598 /* How the VEX.W bit is used:
599 0: Set by the REX.W bit.
600 1: VEX.W0. Should always be 0.
601 2: VEX.W1. Should always be 1.
6865c043 602 3: VEX.WIG. The VEX.W bit is ignored.
1ef99a7b
L
603 */
604#define VEXW0 1
605#define VEXW1 2
6865c043 606#define VEXWIG 3
1ef99a7b 607 VexW,
b933fa4b
JB
608 /* Opcode prefix (values chosen to be usable directly in
609 VEX/XOP/EVEX pp fields):
7b47a312
L
610 0: None
611 1: Add 0x66 opcode prefix.
b933fa4b
JB
612 2: Add 0xf3 opcode prefix.
613 3: Add 0xf2 opcode prefix.
7b47a312
L
614 */
615#define PREFIX_NONE 0
616#define PREFIX_0X66 1
b933fa4b
JB
617#define PREFIX_0XF3 2
618#define PREFIX_0XF2 3
7b47a312 619 OpcodePrefix,
63112cd6 620 /* Instruction with a mandatory SIB byte:
6c30d220
L
621 1: 128bit vector register.
622 2: 256bit vector register.
43234a1e 623 3: 512bit vector register.
6c30d220 624 */
63112cd6
L
625#define VECSIB128 1
626#define VECSIB256 2
627#define VECSIB512 3
260cd341 628#define SIBMEM 4
63112cd6 629 SIB,
260cd341 630
52a6c1fe
L
631 /* SSE to AVX support required */
632 SSE2AVX,
43234a1e
L
633
634 /* insn has EVEX prefix:
635 1: 512bit EVEX prefix.
636 2: 128bit EVEX prefix.
637 3: 256bit EVEX prefix.
638 4: Length-ignored (LIG) EVEX prefix.
e771e7c9 639 5: Length determined from actual operands.
d0c2e3ec 640 6: L'L = 3 (reserved, .insn only)
43234a1e
L
641 */
642#define EVEX512 1
643#define EVEX128 2
644#define EVEX256 3
645#define EVEXLIG 4
e771e7c9 646#define EVEXDYN 5
d0c2e3ec 647#define EVEX_L3 6
43234a1e
L
648 EVex,
649
b1c79256 650 /* AVX512 masking support */
43234a1e
L
651 Masking,
652
4a1b91ea
L
653 /* AVX512 broadcast support. The number of bytes to broadcast is
654 1 << (Broadcast - 1):
655 1: Byte broadcast.
656 2: Word broadcast.
657 3: Dword broadcast.
658 4: Qword broadcast.
659 */
660#define BYTE_BROADCAST 1
661#define WORD_BROADCAST 2
662#define DWORD_BROADCAST 3
663#define QWORD_BROADCAST 4
43234a1e
L
664 Broadcast,
665
666 /* Static rounding control is supported. */
667 StaticRounding,
668
669 /* Supress All Exceptions is supported. */
670 SAE,
671
7091c612
JB
672 /* Compressed Disp8*N attribute. */
673#define DISP8_SHIFT_VL 7
43234a1e
L
674 Disp8MemShift,
675
b6f8c7c4
L
676 /* Support encoding optimization. */
677 Optimize,
678
52a6c1fe
L
679 /* AT&T mnemonic. */
680 ATTMnemonic,
681 /* AT&T syntax. */
682 ATTSyntax,
683 /* Intel syntax. */
684 IntelSyntax,
4b5aaf5f
L
685 /* ISA64: Don't change the order without other code adjustments.
686 0: Common to AMD64 and Intel64.
687 1: AMD64.
688 2: Intel64.
689 3: Only in Intel64.
690 */
691#define AMD64 1
692#define INTEL64 2
693#define INTEL64ONLY 3
694 ISA64,
52a6c1fe 695 /* The last bitfield in i386_opcode_modifier. */
1d942ae9 696 Opcode_Modifier_Num
52a6c1fe 697};
40fb9820
L
698
699typedef struct i386_opcode_modifier
700{
701 unsigned int d:1;
702 unsigned int w:1;
86fa6981 703 unsigned int load:1;
40fb9820 704 unsigned int modrm:1;
0cfa3eb3 705 unsigned int jump:3;
40fb9820 706 unsigned int floatmf:1;
673fe0f0 707 unsigned int size:2;
9c19e9ec 708 unsigned int checkoperandsize:1;
255571cd 709 unsigned int operandconstraint:4;
3cd7f3e3 710 unsigned int mnemonicsize:2;
40fb9820
L
711 unsigned int no_bsuf:1;
712 unsigned int no_wsuf:1;
713 unsigned int no_lsuf:1;
714 unsigned int no_ssuf:1;
715 unsigned int no_qsuf:1;
40fb9820 716 unsigned int fwait:1;
51c8edf6 717 unsigned int isstring:2;
dfd69174 718 unsigned int regmem:1;
7e8b059b 719 unsigned int bndprefixok:1;
742732c7 720 unsigned int prefixok:3;
40fb9820
L
721 unsigned int isprefix:1;
722 unsigned int immext:1;
723 unsigned int norex64:1;
2bf05e57 724 unsigned int vex:2;
eea96d3f 725 unsigned int vexvvvv:1;
1ef99a7b 726 unsigned int vexw:2;
441f6aca 727 unsigned int opcodeprefix:2;
260cd341 728 unsigned int sib:3;
c0f3af97 729 unsigned int sse2avx:1;
43234a1e 730 unsigned int evex:3;
b1c79256 731 unsigned int masking:1;
4a1b91ea 732 unsigned int broadcast:3;
43234a1e
L
733 unsigned int staticrounding:1;
734 unsigned int sae:1;
735 unsigned int disp8memshift:3;
b6f8c7c4 736 unsigned int optimize:1;
1efbbeb4 737 unsigned int attmnemonic:1;
e1d4d893 738 unsigned int attsyntax:1;
5c07affc 739 unsigned int intelsyntax:1;
4b5aaf5f 740 unsigned int isa64:2;
40fb9820
L
741} i386_opcode_modifier;
742
bab6aec1
JB
743/* Operand classes. */
744
745#define CLASS_WIDTH 4
746enum operand_class
747{
748 ClassNone,
749 Reg, /* GPRs and FP regs, distinguished by operand size */
00cee14f 750 SReg, /* Segment register */
4a5c67ed
JB
751 RegCR, /* Control register */
752 RegDR, /* Debug register */
753 RegTR, /* Test register */
3528c362
JB
754 RegMMX, /* MMX register */
755 RegSIMD, /* XMM/YMM/ZMM registers, distinguished by operand size */
f74a6307
JB
756 RegMask, /* Vector Mask register */
757 RegBND, /* Bound register */
bab6aec1
JB
758};
759
75e5731b
JB
760/* Special operand instances. */
761
762#define INSTANCE_WIDTH 3
763enum operand_instance
764{
765 InstanceNone,
766 Accum, /* Accumulator %al/%ax/%eax/%rax/%st(0)/%xmm0 */
474da251
JB
767 RegC, /* %cl / %cx / %ecx / %rcx, e.g. register to hold shift count */
768 RegD, /* %dl / %dx / %edx / %rdx, e.g. register to hold I/O port addr */
769 RegB, /* %bl / %bx / %ebx / %rbx */
75e5731b
JB
770};
771
40fb9820
L
772/* Position of operand_type bits. */
773
52a6c1fe
L
774enum
775{
75e5731b
JB
776 /* Class and Instance */
777 ClassInstance = CLASS_WIDTH + INSTANCE_WIDTH - 1,
52a6c1fe
L
778 /* 1 bit immediate */
779 Imm1,
780 /* 8 bit immediate */
781 Imm8,
782 /* 8 bit immediate sign extended */
783 Imm8S,
784 /* 16 bit immediate */
785 Imm16,
786 /* 32 bit immediate */
787 Imm32,
788 /* 32 bit immediate sign extended */
789 Imm32S,
790 /* 64 bit immediate */
791 Imm64,
792 /* 8bit/16bit/32bit displacements are used in different ways,
793 depending on the instruction. For jumps, they specify the
794 size of the PC relative displacement, for instructions with
795 memory operand, they specify the size of the offset relative
796 to the base register, and for instructions with memory offset
797 such as `mov 1234,%al' they specify the size of the offset
798 relative to the segment base. */
799 /* 8 bit displacement */
800 Disp8,
801 /* 16 bit displacement */
802 Disp16,
a775efc8 803 /* 32 bit displacement (64-bit: sign-extended) */
52a6c1fe 804 Disp32,
52a6c1fe
L
805 /* 64 bit displacement */
806 Disp64,
52a6c1fe
L
807 /* Register which can be used for base or index in memory operand. */
808 BaseIndex,
11a322db 809 /* BYTE size. */
52a6c1fe 810 Byte,
11a322db 811 /* WORD size. 2 byte */
52a6c1fe 812 Word,
11a322db 813 /* DWORD size. 4 byte */
52a6c1fe 814 Dword,
11a322db 815 /* FWORD size. 6 byte */
52a6c1fe 816 Fword,
11a322db 817 /* QWORD size. 8 byte */
52a6c1fe 818 Qword,
11a322db 819 /* TBYTE size. 10 byte */
52a6c1fe 820 Tbyte,
11a322db 821 /* XMMWORD size. */
52a6c1fe 822 Xmmword,
11a322db 823 /* YMMWORD size. */
52a6c1fe 824 Ymmword,
11a322db 825 /* ZMMWORD size. */
43234a1e 826 Zmmword,
260cd341
LC
827 /* TMMWORD size. */
828 Tmmword,
52a6c1fe
L
829 /* Unspecified memory size. */
830 Unspecified,
40fb9820 831
bab6aec1 832 /* The number of bits in i386_operand_type. */
f0a85b07 833 OTNum
52a6c1fe 834};
40fb9820
L
835
836#define OTNumOfUints \
f0a85b07 837 ((OTNum - 1) / sizeof (unsigned int) / CHAR_BIT + 1)
40fb9820
L
838#define OTNumOfBits \
839 (OTNumOfUints * sizeof (unsigned int) * CHAR_BIT)
840
841/* If you get a compiler error for zero width of the unused field,
601e8564 842 comment it out. */
f0a85b07 843#define OTUnused OTNum
40fb9820
L
844
845typedef union i386_operand_type
846{
847 struct
848 {
bab6aec1 849 unsigned int class:CLASS_WIDTH;
75e5731b 850 unsigned int instance:INSTANCE_WIDTH;
7d5e4556 851 unsigned int imm1:1;
40fb9820
L
852 unsigned int imm8:1;
853 unsigned int imm8s:1;
854 unsigned int imm16:1;
855 unsigned int imm32:1;
856 unsigned int imm32s:1;
857 unsigned int imm64:1;
40fb9820
L
858 unsigned int disp8:1;
859 unsigned int disp16:1;
860 unsigned int disp32:1;
40fb9820 861 unsigned int disp64:1;
7d5e4556 862 unsigned int baseindex:1;
7d5e4556
L
863 unsigned int byte:1;
864 unsigned int word:1;
865 unsigned int dword:1;
866 unsigned int fword:1;
867 unsigned int qword:1;
868 unsigned int tbyte:1;
869 unsigned int xmmword:1;
c0f3af97 870 unsigned int ymmword:1;
43234a1e 871 unsigned int zmmword:1;
260cd341 872 unsigned int tmmword:1;
7d5e4556 873 unsigned int unspecified:1;
40fb9820
L
874#ifdef OTUnused
875 unsigned int unused:(OTNumOfBits - OTUnused);
876#endif
877 } bitfield;
878 unsigned int array[OTNumOfUints];
879} i386_operand_type;
0b1cf022 880
d3ce72d0 881typedef struct insn_template
0b1cf022
L
882{
883 /* instruction name sans width suffix ("mov" for movl insns) */
5c139202 884 unsigned int mnem_off;
0b1cf022 885
37cea588
JB
886 /* Bitfield arrangement is such that individual fields can be easily
887 extracted (in native builds at least) - either by at most a masking
888 operation (base_opcode, operands), or by just a (signed) right shift
889 (extension_opcode). Please try to maintain this property. */
890
0b1cf022
L
891 /* base_opcode is the fundamental opcode byte without optional
892 prefix(es). */
9df6f676 893 unsigned int base_opcode:16;
0b1cf022
L
894#define Opcode_D 0x2 /* Direction bit:
895 set if Reg --> Regmem;
896 unset if Regmem --> Reg. */
bd782808
JB
897#define Opcode_FloatR 0x8 /* ModR/M bit to swap src/dest for float insns. */
898#define Opcode_FloatD 0x4 /* Direction bit for float insns. */
2c735193 899#define Opcode_ExtD 0x1 /* Direction bit for extended opcode space insns. */
dbbc8b7e 900#define Opcode_SIMD_IntD 0x10 /* Direction bit for SIMD int insns. */
8bd915b7
JB
901/* The next value is arbitrary, as long as it's non-zero and distinct
902 from all other values above. */
903#define Opcode_VexW 0xf /* Operand order controlled by VEX.W. */
0b1cf022 904
37cea588
JB
905 /* how many operands */
906 unsigned int operands:3;
907
ddb62495
JB
908 /* opcode space */
909 unsigned int opcode_space:4;
910 /* Opcode encoding space (values chosen to be usable directly in
911 VEX/XOP mmmmm and EVEX mm fields):
912 0: Base opcode space.
913 1: 0F opcode prefix / space.
914 2: 0F38 opcode prefix / space.
915 3: 0F3A opcode prefix / space.
916 5: EVEXMAP5 opcode prefix / space.
917 6: EVEXMAP6 opcode prefix / space.
918 8: XOP 08 opcode space.
919 9: XOP 09 opcode space.
920 A: XOP 0A opcode space.
921 */
922#define SPACE_BASE 0
923#define SPACE_0F 1
924#define SPACE_0F38 2
925#define SPACE_0F3A 3
926#define SPACE_EVEXMAP5 5
927#define SPACE_EVEXMAP6 6
928#define SPACE_XOP08 8
929#define SPACE_XOP09 9
930#define SPACE_XOP0A 0xA
37cea588 931
31184569
JB
932/* (Fake) base opcode value for pseudo prefixes. */
933#define PSEUDO_PREFIX 0
934
935 /* extension_opcode is the 3 bit extension for group <n> insns.
936 This field is also used to store the 8-bit opcode suffix for the
937 AMD 3DNow! instructions.
938 If this template has no extension opcode (the usual case) use None
939 Instructions */
9df6f676
JB
940 signed int extension_opcode:9;
941#define None (-1) /* If no extension_opcode is possible. */
31184569 942
41eb8e88
L
943/* Pseudo prefixes. */
944#define Prefix_Disp8 0 /* {disp8} */
945#define Prefix_Disp16 1 /* {disp16} */
946#define Prefix_Disp32 2 /* {disp32} */
947#define Prefix_Load 3 /* {load} */
948#define Prefix_Store 4 /* {store} */
949#define Prefix_VEX 5 /* {vex} */
950#define Prefix_VEX3 6 /* {vex3} */
951#define Prefix_EVEX 7 /* {evex} */
952#define Prefix_REX 8 /* {rex} */
953#define Prefix_NoOptimize 9 /* {nooptimize} */
954
0b1cf022
L
955 /* the bits in opcode_modifier are used to generate the final opcode from
956 the base_opcode. These bits also are used to detect alternate forms of
957 the same instruction */
40fb9820 958 i386_opcode_modifier opcode_modifier;
0b1cf022 959
dac10fb0
JB
960 /* cpu feature flags */
961 i386_cpu_flags cpu_flags;
962
0b1cf022
L
963 /* operand_types[i] describes the type of operand i. This is made
964 by OR'ing together all of the possible type masks. (e.g.
965 'operand_types[i] = Reg|Imm' specifies that operand i can be
966 either a register or an immediate operand. */
40fb9820 967 i386_operand_type operand_types[MAX_OPERANDS];
0b1cf022 968}
d3ce72d0 969insn_template;
0b1cf022 970
0b1cf022
L
971/* these are for register name --> number & type hash lookup */
972typedef struct
973{
edf77258 974 char reg_name[8];
40fb9820 975 i386_operand_type reg_type;
a60de03c 976 unsigned char reg_flags;
0b1cf022
L
977#define RegRex 0x1 /* Extended register. */
978#define RegRex64 0x2 /* Extended 8 bit register. */
43234a1e 979#define RegVRex 0x4 /* Extended vector register. */
a60de03c 980 unsigned char reg_num;
e968fc9b 981#define RegIP ((unsigned char ) ~0)
db51cc60 982/* EIZ and RIZ are fake index registers. */
e968fc9b 983#define RegIZ (RegIP - 1)
b7240065
JB
984/* FLAT is a fake segment register (Intel mode). */
985#define RegFlat ((unsigned char) ~0)
a60de03c
JB
986 signed char dw2_regnum[2];
987#define Dw2Inval (-1)
0b1cf022
L
988}
989reg_entry;