x86: drop "mem" operand type attribute
[external/binutils.git] / opcodes / i386-opc.h
1 /* Declarations for Intel 80386 opcode table
2    Copyright (C) 2007-2018 Free Software Foundation, Inc.
3
4    This file is part of the GNU opcodes library.
5
6    This library is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 3, or (at your option)
9    any later version.
10
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.
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"
22 #ifdef HAVE_LIMITS_H
23 #include <limits.h>
24 #endif
25
26 #ifndef CHAR_BIT
27 #define CHAR_BIT 8
28 #endif
29
30 /* Position of cpu flags bitfiled.  */
31
32 enum
33 {
34   /* i186 or better required */
35   Cpu186 = 0,
36   /* i286 or better required */
37   Cpu286,
38   /* i386 or better required */
39   Cpu386,
40   /* i486 or better required */
41   Cpu486,
42   /* i585 or better required */
43   Cpu586,
44   /* i686 or better required */
45   Cpu686,
46   /* CLFLUSH Instruction support required */
47   CpuClflush,
48   /* NOP Instruction support required */
49   CpuNop,
50   /* SYSCALL Instructions support required */
51   CpuSYSCALL,
52   /* Floating point support required */
53   Cpu8087,
54   /* i287 support required */
55   Cpu287,
56   /* i387 support required */
57   Cpu387,
58   /* i686 and floating point support required */
59   Cpu687,
60   /* SSE3 and floating point support required */
61   CpuFISTTP,
62   /* MMX support required */
63   CpuMMX,
64   /* SSE support required */
65   CpuSSE,
66   /* SSE2 support required */
67   CpuSSE2,
68   /* 3dnow! support required */
69   Cpu3dnow,
70   /* 3dnow! Extensions support required */
71   Cpu3dnowA,
72   /* SSE3 support required */
73   CpuSSE3,
74   /* VIA PadLock required */
75   CpuPadLock,
76   /* AMD Secure Virtual Machine Ext-s required */
77   CpuSVME,
78   /* VMX Instructions required */
79   CpuVMX,
80   /* SMX Instructions required */
81   CpuSMX,
82   /* SSSE3 support required */
83   CpuSSSE3,
84   /* SSE4a support required */
85   CpuSSE4a,
86   /* ABM New Instructions required */
87   CpuABM,
88   /* SSE4.1 support required */
89   CpuSSE4_1,
90   /* SSE4.2 support required */
91   CpuSSE4_2,
92   /* AVX support required */
93   CpuAVX,
94   /* AVX2 support required */
95   CpuAVX2,
96   /* Intel AVX-512 Foundation Instructions support required */
97   CpuAVX512F,
98   /* Intel AVX-512 Conflict Detection Instructions support required */
99   CpuAVX512CD,
100   /* Intel AVX-512 Exponential and Reciprocal Instructions support
101      required */
102   CpuAVX512ER,
103   /* Intel AVX-512 Prefetch Instructions support required */
104   CpuAVX512PF,
105   /* Intel AVX-512 VL Instructions support required.  */
106   CpuAVX512VL,
107   /* Intel AVX-512 DQ Instructions support required.  */
108   CpuAVX512DQ,
109   /* Intel AVX-512 BW Instructions support required.  */
110   CpuAVX512BW,
111   /* Intel L1OM support required */
112   CpuL1OM,
113   /* Intel K1OM support required */
114   CpuK1OM,
115   /* Intel IAMCU support required */
116   CpuIAMCU,
117   /* Xsave/xrstor New Instructions support required */
118   CpuXsave,
119   /* Xsaveopt New Instructions support required */
120   CpuXsaveopt,
121   /* AES support required */
122   CpuAES,
123   /* PCLMUL support required */
124   CpuPCLMUL,
125   /* FMA support required */
126   CpuFMA,
127   /* FMA4 support required */
128   CpuFMA4,
129   /* XOP support required */
130   CpuXOP,
131   /* LWP support required */
132   CpuLWP,
133   /* BMI support required */
134   CpuBMI,
135   /* TBM support required */
136   CpuTBM,
137   /* MOVBE Instruction support required */
138   CpuMovbe,
139   /* CMPXCHG16B instruction support required.  */
140   CpuCX16,
141   /* EPT Instructions required */
142   CpuEPT,
143   /* RDTSCP Instruction support required */
144   CpuRdtscp,
145   /* FSGSBASE Instructions required */
146   CpuFSGSBase,
147   /* RDRND Instructions required */
148   CpuRdRnd,
149   /* F16C Instructions required */
150   CpuF16C,
151   /* Intel BMI2 support required */
152   CpuBMI2,
153   /* LZCNT support required */
154   CpuLZCNT,
155   /* HLE support required */
156   CpuHLE,
157   /* RTM support required */
158   CpuRTM,
159   /* INVPCID Instructions required */
160   CpuINVPCID,
161   /* VMFUNC Instruction required */
162   CpuVMFUNC,
163   /* Intel MPX Instructions required  */
164   CpuMPX,
165   /* 64bit support available, used by -march= in assembler.  */
166   CpuLM,
167   /* RDRSEED instruction required.  */
168   CpuRDSEED,
169   /* Multi-presisionn add-carry instructions are required.  */
170   CpuADX,
171   /* Supports prefetchw and prefetch instructions.  */
172   CpuPRFCHW,
173   /* SMAP instructions required.  */
174   CpuSMAP,
175   /* SHA instructions required.  */
176   CpuSHA,
177   /* CLFLUSHOPT instruction required */
178   CpuClflushOpt,
179   /* XSAVES/XRSTORS instruction required */
180   CpuXSAVES,
181   /* XSAVEC instruction required */
182   CpuXSAVEC,
183   /* PREFETCHWT1 instruction required */
184   CpuPREFETCHWT1,
185   /* SE1 instruction required */
186   CpuSE1,
187   /* CLWB instruction required */
188   CpuCLWB,
189   /* Intel AVX-512 IFMA Instructions support required.  */
190   CpuAVX512IFMA,
191   /* Intel AVX-512 VBMI Instructions support required.  */
192   CpuAVX512VBMI,
193   /* Intel AVX-512 4FMAPS Instructions support required.  */
194   CpuAVX512_4FMAPS,
195   /* Intel AVX-512 4VNNIW Instructions support required.  */
196   CpuAVX512_4VNNIW,
197   /* Intel AVX-512 VPOPCNTDQ Instructions support required.  */
198   CpuAVX512_VPOPCNTDQ,
199   /* Intel AVX-512 VBMI2 Instructions support required.  */
200   CpuAVX512_VBMI2,
201   /* Intel AVX-512 VNNI Instructions support required.  */
202   CpuAVX512_VNNI,
203   /* Intel AVX-512 BITALG Instructions support required.  */
204   CpuAVX512_BITALG,
205   /* mwaitx instruction required */
206   CpuMWAITX,
207   /* Clzero instruction required */
208   CpuCLZERO,
209   /* OSPKE instruction required */
210   CpuOSPKE,
211   /* RDPID instruction required */
212   CpuRDPID,
213   /* PTWRITE instruction required */
214   CpuPTWRITE,
215   /* CET instructions support required */
216   CpuIBT,
217   CpuSHSTK,
218   /* GFNI instructions required */
219   CpuGFNI,
220   /* VAES instructions required */
221   CpuVAES,
222   /* VPCLMULQDQ instructions required */
223   CpuVPCLMULQDQ,
224   /* WBNOINVD instructions required */
225   CpuWBNOINVD,
226   /* PCONFIG instructions required */
227   CpuPCONFIG,
228   /* WAITPKG instructions required */
229   CpuWAITPKG,
230   /* CLDEMOTE instruction required */
231   CpuCLDEMOTE,
232   /* MOVDIRI instruction support required */
233   CpuMOVDIRI,
234   /* MOVDIRR64B instruction required */
235   CpuMOVDIR64B,
236   /* 64bit support required  */
237   Cpu64,
238   /* Not supported in the 64bit mode  */
239   CpuNo64,
240   /* The last bitfield in i386_cpu_flags.  */
241   CpuMax = CpuNo64
242 };
243
244 #define CpuNumOfUints \
245   (CpuMax / sizeof (unsigned int) / CHAR_BIT + 1)
246 #define CpuNumOfBits \
247   (CpuNumOfUints * sizeof (unsigned int) * CHAR_BIT)
248
249 /* If you get a compiler error for zero width of the unused field,
250    comment it out.  */
251 #define CpuUnused       (CpuMax + 1)
252
253 /* We can check if an instruction is available with array instead
254    of bitfield. */
255 typedef union i386_cpu_flags
256 {
257   struct
258     {
259       unsigned int cpui186:1;
260       unsigned int cpui286:1;
261       unsigned int cpui386:1;
262       unsigned int cpui486:1;
263       unsigned int cpui586:1;
264       unsigned int cpui686:1;
265       unsigned int cpuclflush:1;
266       unsigned int cpunop:1;
267       unsigned int cpusyscall:1;
268       unsigned int cpu8087:1;
269       unsigned int cpu287:1;
270       unsigned int cpu387:1;
271       unsigned int cpu687:1;
272       unsigned int cpufisttp:1;
273       unsigned int cpummx:1;
274       unsigned int cpusse:1;
275       unsigned int cpusse2:1;
276       unsigned int cpua3dnow:1;
277       unsigned int cpua3dnowa:1;
278       unsigned int cpusse3:1;
279       unsigned int cpupadlock:1;
280       unsigned int cpusvme:1;
281       unsigned int cpuvmx:1;
282       unsigned int cpusmx:1;
283       unsigned int cpussse3:1;
284       unsigned int cpusse4a:1;
285       unsigned int cpuabm:1;
286       unsigned int cpusse4_1:1;
287       unsigned int cpusse4_2:1;
288       unsigned int cpuavx:1;
289       unsigned int cpuavx2:1;
290       unsigned int cpuavx512f:1;
291       unsigned int cpuavx512cd:1;
292       unsigned int cpuavx512er:1;
293       unsigned int cpuavx512pf:1;
294       unsigned int cpuavx512vl:1;
295       unsigned int cpuavx512dq:1;
296       unsigned int cpuavx512bw:1;
297       unsigned int cpul1om:1;
298       unsigned int cpuk1om:1;
299       unsigned int cpuiamcu:1;
300       unsigned int cpuxsave:1;
301       unsigned int cpuxsaveopt:1;
302       unsigned int cpuaes:1;
303       unsigned int cpupclmul:1;
304       unsigned int cpufma:1;
305       unsigned int cpufma4:1;
306       unsigned int cpuxop:1;
307       unsigned int cpulwp:1;
308       unsigned int cpubmi:1;
309       unsigned int cputbm:1;
310       unsigned int cpumovbe:1;
311       unsigned int cpucx16:1;
312       unsigned int cpuept:1;
313       unsigned int cpurdtscp:1;
314       unsigned int cpufsgsbase:1;
315       unsigned int cpurdrnd:1;
316       unsigned int cpuf16c:1;
317       unsigned int cpubmi2:1;
318       unsigned int cpulzcnt:1;
319       unsigned int cpuhle:1;
320       unsigned int cpurtm:1;
321       unsigned int cpuinvpcid:1;
322       unsigned int cpuvmfunc:1;
323       unsigned int cpumpx:1;
324       unsigned int cpulm:1;
325       unsigned int cpurdseed:1;
326       unsigned int cpuadx:1;
327       unsigned int cpuprfchw:1;
328       unsigned int cpusmap:1;
329       unsigned int cpusha:1;
330       unsigned int cpuclflushopt:1;
331       unsigned int cpuxsaves:1;
332       unsigned int cpuxsavec:1;
333       unsigned int cpuprefetchwt1:1;
334       unsigned int cpuse1:1;
335       unsigned int cpuclwb:1;
336       unsigned int cpuavx512ifma:1;
337       unsigned int cpuavx512vbmi:1;
338       unsigned int cpuavx512_4fmaps:1;
339       unsigned int cpuavx512_4vnniw:1;
340       unsigned int cpuavx512_vpopcntdq:1;
341       unsigned int cpuavx512_vbmi2:1;
342       unsigned int cpuavx512_vnni:1;
343       unsigned int cpuavx512_bitalg:1;
344       unsigned int cpumwaitx:1;
345       unsigned int cpuclzero:1;
346       unsigned int cpuospke:1;
347       unsigned int cpurdpid:1;
348       unsigned int cpuptwrite:1;
349       unsigned int cpuibt:1;
350       unsigned int cpushstk:1;
351       unsigned int cpugfni:1;
352       unsigned int cpuvaes:1;
353       unsigned int cpuvpclmulqdq:1;
354       unsigned int cpuwbnoinvd:1;
355       unsigned int cpupconfig:1;
356       unsigned int cpuwaitpkg:1;
357       unsigned int cpucldemote:1;
358       unsigned int cpumovdiri:1;
359       unsigned int cpumovdir64b:1;
360       unsigned int cpu64:1;
361       unsigned int cpuno64:1;
362 #ifdef CpuUnused
363       unsigned int unused:(CpuNumOfBits - CpuUnused);
364 #endif
365     } bitfield;
366   unsigned int array[CpuNumOfUints];
367 } i386_cpu_flags;
368
369 /* Position of opcode_modifier bits.  */
370
371 enum
372 {
373   /* has direction bit. */
374   D = 0,
375   /* set if operands can be words or dwords encoded the canonical way */
376   W,
377   /* load form instruction. Must be placed before store form.  */
378   Load,
379   /* insn has a modrm byte. */
380   Modrm,
381   /* register is in low 3 bits of opcode */
382   ShortForm,
383   /* special case for jump insns.  */
384   Jump,
385   /* call and jump */
386   JumpDword,
387   /* loop and jecxz */
388   JumpByte,
389   /* special case for intersegment leaps/calls */
390   JumpInterSegment,
391   /* FP insn memory format bit, sized by 0x4 */
392   FloatMF,
393   /* src/dest swap for floats. */
394   FloatR,
395   /* needs size prefix if in 32-bit mode */
396   Size16,
397   /* needs size prefix if in 16-bit mode */
398   Size32,
399   /* needs size prefix if in 64-bit mode */
400   Size64,
401   /* check register size.  */
402   CheckRegSize,
403   /* instruction ignores operand size prefix and in Intel mode ignores
404      mnemonic size suffix check.  */
405   IgnoreSize,
406   /* default insn size depends on mode */
407   DefaultSize,
408   /* b suffix on instruction illegal */
409   No_bSuf,
410   /* w suffix on instruction illegal */
411   No_wSuf,
412   /* l suffix on instruction illegal */
413   No_lSuf,
414   /* s suffix on instruction illegal */
415   No_sSuf,
416   /* q suffix on instruction illegal */
417   No_qSuf,
418   /* long double suffix on instruction illegal */
419   No_ldSuf,
420   /* instruction needs FWAIT */
421   FWait,
422   /* quick test for string instructions */
423   IsString,
424   /* quick test if branch instruction is MPX supported */
425   BNDPrefixOk,
426   /* quick test if NOTRACK prefix is supported */
427   NoTrackPrefixOk,
428   /* quick test for lockable instructions */
429   IsLockable,
430   /* fake an extra reg operand for clr, imul and special register
431      processing for some instructions.  */
432   RegKludge,
433   /* An implicit xmm0 as the first operand */
434   Implicit1stXmm0,
435   /* The HLE prefix is OK:
436      1. With a LOCK prefix.
437      2. With or without a LOCK prefix.
438      3. With a RELEASE (0xf3) prefix.
439    */
440 #define HLEPrefixNone           0
441 #define HLEPrefixLock           1
442 #define HLEPrefixAny            2
443 #define HLEPrefixRelease        3
444   HLEPrefixOk,
445   /* An instruction on which a "rep" prefix is acceptable.  */
446   RepPrefixOk,
447   /* Convert to DWORD */
448   ToDword,
449   /* Convert to QWORD */
450   ToQword,
451   /* Address prefix changes register operand */
452   AddrPrefixOpReg,
453   /* opcode is a prefix */
454   IsPrefix,
455   /* instruction has extension in 8 bit imm */
456   ImmExt,
457   /* instruction don't need Rex64 prefix.  */
458   NoRex64,
459   /* instruction require Rex64 prefix.  */
460   Rex64,
461   /* deprecated fp insn, gets a warning */
462   Ugh,
463   /* insn has VEX prefix:
464         1: 128bit VEX prefix (or operand dependent).
465         2: 256bit VEX prefix.
466         3: Scalar VEX prefix.
467    */
468 #define VEX128          1
469 #define VEX256          2
470 #define VEXScalar       3
471   Vex,
472   /* How to encode VEX.vvvv:
473      0: VEX.vvvv must be 1111b.
474      1: VEX.NDS.  Register-only source is encoded in VEX.vvvv where
475         the content of source registers will be preserved.
476         VEX.DDS.  The second register operand is encoded in VEX.vvvv
477         where the content of first source register will be overwritten
478         by the result.
479         VEX.NDD2.  The second destination register operand is encoded in
480         VEX.vvvv for instructions with 2 destination register operands.
481         For assembler, there are no difference between VEX.NDS, VEX.DDS
482         and VEX.NDD2.
483      2. VEX.NDD.  Register destination is encoded in VEX.vvvv for
484      instructions with 1 destination register operand.
485      3. VEX.LWP.  Register destination is encoded in VEX.vvvv and one
486         of the operands can access a memory location.
487    */
488 #define VEXXDS  1
489 #define VEXNDD  2
490 #define VEXLWP  3
491   VexVVVV,
492   /* How the VEX.W bit is used:
493      0: Set by the REX.W bit.
494      1: VEX.W0.  Should always be 0.
495      2: VEX.W1.  Should always be 1.
496    */
497 #define VEXW0   1
498 #define VEXW1   2
499   VexW,
500   /* VEX opcode prefix:
501      0: VEX 0x0F opcode prefix.
502      1: VEX 0x0F38 opcode prefix.
503      2: VEX 0x0F3A opcode prefix
504      3: XOP 0x08 opcode prefix.
505      4: XOP 0x09 opcode prefix
506      5: XOP 0x0A opcode prefix.
507    */
508 #define VEX0F           0
509 #define VEX0F38         1
510 #define VEX0F3A         2
511 #define XOP08           3
512 #define XOP09           4
513 #define XOP0A           5
514   VexOpcode,
515   /* number of VEX source operands:
516      0: <= 2 source operands.
517      1: 2 XOP source operands.
518      2: 3 source operands.
519    */
520 #define XOP2SOURCES     1
521 #define VEX3SOURCES     2
522   VexSources,
523   /* Instruction with vector SIB byte:
524         1: 128bit vector register.
525         2: 256bit vector register.
526         3: 512bit vector register.
527    */
528 #define VecSIB128       1
529 #define VecSIB256       2
530 #define VecSIB512       3
531   VecSIB,
532   /* SSE to AVX support required */
533   SSE2AVX,
534   /* No AVX equivalent */
535   NoAVX,
536
537   /* insn has EVEX prefix:
538         1: 512bit EVEX prefix.
539         2: 128bit EVEX prefix.
540         3: 256bit EVEX prefix.
541         4: Length-ignored (LIG) EVEX prefix.
542         5: Length determined from actual operands.
543    */
544 #define EVEX512                1
545 #define EVEX128                2
546 #define EVEX256                3
547 #define EVEXLIG                4
548 #define EVEXDYN                5
549   EVex,
550
551   /* AVX512 masking support:
552         1: Zeroing or merging masking depending on operands.
553         2: Merging-masking.
554         3: Both zeroing and merging masking.
555    */
556 #define DYNAMIC_MASKING 1
557 #define MERGING_MASKING 2
558 #define BOTH_MASKING    3
559   Masking,
560
561   /* AVX512 broadcast support.  The number of bytes to broadcast is
562      1 << (Broadcast - 1):
563         1: Byte broadcast.
564         2: Word broadcast.
565         3: Dword broadcast.
566         4: Qword broadcast.
567    */
568 #define BYTE_BROADCAST  1
569 #define WORD_BROADCAST  2
570 #define DWORD_BROADCAST 3
571 #define QWORD_BROADCAST 4
572   Broadcast,
573
574   /* Static rounding control is supported.  */
575   StaticRounding,
576
577   /* Supress All Exceptions is supported.  */
578   SAE,
579
580   /* Compressed Disp8*N attribute.  */
581 #define DISP8_SHIFT_VL 7
582   Disp8MemShift,
583
584   /* Default mask isn't allowed.  */
585   NoDefMask,
586
587   /* The second operand must be a vector register, {x,y,z}mmN, where N is a multiple of 4.
588      It implicitly denotes the register group of {x,y,z}mmN - {x,y,z}mm(N + 3).
589    */
590   ImplicitQuadGroup,
591
592   /* Support encoding optimization.  */
593   Optimize,
594
595   /* AT&T mnemonic.  */
596   ATTMnemonic,
597   /* AT&T syntax.  */
598   ATTSyntax,
599   /* Intel syntax.  */
600   IntelSyntax,
601   /* AMD64.  */
602   AMD64,
603   /* Intel64.  */
604   Intel64,
605   /* The last bitfield in i386_opcode_modifier.  */
606   Opcode_Modifier_Max
607 };
608
609 typedef struct i386_opcode_modifier
610 {
611   unsigned int d:1;
612   unsigned int w:1;
613   unsigned int load:1;
614   unsigned int modrm:1;
615   unsigned int shortform:1;
616   unsigned int jump:1;
617   unsigned int jumpdword:1;
618   unsigned int jumpbyte:1;
619   unsigned int jumpintersegment:1;
620   unsigned int floatmf:1;
621   unsigned int floatr:1;
622   unsigned int size16:1;
623   unsigned int size32:1;
624   unsigned int size64:1;
625   unsigned int checkregsize:1;
626   unsigned int ignoresize:1;
627   unsigned int defaultsize:1;
628   unsigned int no_bsuf:1;
629   unsigned int no_wsuf:1;
630   unsigned int no_lsuf:1;
631   unsigned int no_ssuf:1;
632   unsigned int no_qsuf:1;
633   unsigned int no_ldsuf:1;
634   unsigned int fwait:1;
635   unsigned int isstring:1;
636   unsigned int bndprefixok:1;
637   unsigned int notrackprefixok:1;
638   unsigned int islockable:1;
639   unsigned int regkludge:1;
640   unsigned int implicit1stxmm0:1;
641   unsigned int hleprefixok:2;
642   unsigned int repprefixok:1;
643   unsigned int todword:1;
644   unsigned int toqword:1;
645   unsigned int addrprefixopreg:1;
646   unsigned int isprefix:1;
647   unsigned int immext:1;
648   unsigned int norex64:1;
649   unsigned int rex64:1;
650   unsigned int ugh:1;
651   unsigned int vex:2;
652   unsigned int vexvvvv:2;
653   unsigned int vexw:2;
654   unsigned int vexopcode:3;
655   unsigned int vexsources:2;
656   unsigned int vecsib:2;
657   unsigned int sse2avx:1;
658   unsigned int noavx:1;
659   unsigned int evex:3;
660   unsigned int masking:2;
661   unsigned int broadcast:3;
662   unsigned int staticrounding:1;
663   unsigned int sae:1;
664   unsigned int disp8memshift:3;
665   unsigned int nodefmask:1;
666   unsigned int implicitquadgroup:1;
667   unsigned int optimize:1;
668   unsigned int attmnemonic:1;
669   unsigned int attsyntax:1;
670   unsigned int intelsyntax:1;
671   unsigned int amd64:1;
672   unsigned int intel64:1;
673 } i386_opcode_modifier;
674
675 /* Position of operand_type bits.  */
676
677 enum
678 {
679   /* Register (qualified by Byte, Word, etc) */
680   Reg = 0,
681   /* MMX register */
682   RegMMX,
683   /* Vector registers */
684   RegSIMD,
685   /* Vector Mask registers */
686   RegMask,
687   /* Control register */
688   Control,
689   /* Debug register */
690   Debug,
691   /* Test register */
692   Test,
693   /* 2 bit segment register */
694   SReg2,
695   /* 3 bit segment register */
696   SReg3,
697   /* 1 bit immediate */
698   Imm1,
699   /* 8 bit immediate */
700   Imm8,
701   /* 8 bit immediate sign extended */
702   Imm8S,
703   /* 16 bit immediate */
704   Imm16,
705   /* 32 bit immediate */
706   Imm32,
707   /* 32 bit immediate sign extended */
708   Imm32S,
709   /* 64 bit immediate */
710   Imm64,
711   /* 8bit/16bit/32bit displacements are used in different ways,
712      depending on the instruction.  For jumps, they specify the
713      size of the PC relative displacement, for instructions with
714      memory operand, they specify the size of the offset relative
715      to the base register, and for instructions with memory offset
716      such as `mov 1234,%al' they specify the size of the offset
717      relative to the segment base.  */
718   /* 8 bit displacement */
719   Disp8,
720   /* 16 bit displacement */
721   Disp16,
722   /* 32 bit displacement */
723   Disp32,
724   /* 32 bit signed displacement */
725   Disp32S,
726   /* 64 bit displacement */
727   Disp64,
728   /* Accumulator %al/%ax/%eax/%rax/%st(0)/%xmm0 */
729   Acc,
730   /* Register which can be used for base or index in memory operand.  */
731   BaseIndex,
732   /* Register to hold in/out port addr = dx */
733   InOutPortReg,
734   /* Register to hold shift count = cl */
735   ShiftCount,
736   /* Absolute address for jump.  */
737   JumpAbsolute,
738   /* String insn operand with fixed es segment */
739   EsSeg,
740   /* RegMem is for instructions with a modrm byte where the register
741      destination operand should be encoded in the mod and regmem fields.
742      Normally, it will be encoded in the reg field. We add a RegMem
743      flag to the destination register operand to indicate that it should
744      be encoded in the regmem field.  */
745   RegMem,
746   /* Memory.  */
747   Mem,
748   /* BYTE size. */
749   Byte,
750   /* WORD size. 2 byte */
751   Word,
752   /* DWORD size. 4 byte */
753   Dword,
754   /* FWORD size. 6 byte */
755   Fword,
756   /* QWORD size. 8 byte */
757   Qword,
758   /* TBYTE size. 10 byte */
759   Tbyte,
760   /* XMMWORD size. */
761   Xmmword,
762   /* YMMWORD size. */
763   Ymmword,
764   /* ZMMWORD size.  */
765   Zmmword,
766   /* Unspecified memory size.  */
767   Unspecified,
768   /* Any memory size.  */
769   Anysize,
770
771   /* Vector 4 bit immediate.  */
772   Vec_Imm4,
773
774   /* Bound register.  */
775   RegBND,
776
777   /* The number of bitfields in i386_operand_type.  */
778   OTNum
779 };
780
781 #define OTNumOfUints \
782   ((OTNum - 1) / sizeof (unsigned int) / CHAR_BIT + 1)
783 #define OTNumOfBits \
784   (OTNumOfUints * sizeof (unsigned int) * CHAR_BIT)
785
786 /* If you get a compiler error for zero width of the unused field,
787    comment it out.  */
788 #define OTUnused                OTNum
789
790 typedef union i386_operand_type
791 {
792   struct
793     {
794       unsigned int reg:1;
795       unsigned int regmmx:1;
796       unsigned int regsimd:1;
797       unsigned int regmask:1;
798       unsigned int control:1;
799       unsigned int debug:1;
800       unsigned int test:1;
801       unsigned int sreg2:1;
802       unsigned int sreg3:1;
803       unsigned int imm1:1;
804       unsigned int imm8:1;
805       unsigned int imm8s:1;
806       unsigned int imm16:1;
807       unsigned int imm32:1;
808       unsigned int imm32s:1;
809       unsigned int imm64:1;
810       unsigned int disp8:1;
811       unsigned int disp16:1;
812       unsigned int disp32:1;
813       unsigned int disp32s:1;
814       unsigned int disp64:1;
815       unsigned int acc:1;
816       unsigned int baseindex:1;
817       unsigned int inoutportreg:1;
818       unsigned int shiftcount:1;
819       unsigned int jumpabsolute:1;
820       unsigned int esseg:1;
821       unsigned int regmem:1;
822       unsigned int byte:1;
823       unsigned int word:1;
824       unsigned int dword:1;
825       unsigned int fword:1;
826       unsigned int qword:1;
827       unsigned int tbyte:1;
828       unsigned int xmmword:1;
829       unsigned int ymmword:1;
830       unsigned int zmmword:1;
831       unsigned int unspecified:1;
832       unsigned int anysize:1;
833       unsigned int vec_imm4:1;
834       unsigned int regbnd:1;
835 #ifdef OTUnused
836       unsigned int unused:(OTNumOfBits - OTUnused);
837 #endif
838     } bitfield;
839   unsigned int array[OTNumOfUints];
840 } i386_operand_type;
841
842 typedef struct insn_template
843 {
844   /* instruction name sans width suffix ("mov" for movl insns) */
845   char *name;
846
847   /* how many operands */
848   unsigned int operands;
849
850   /* base_opcode is the fundamental opcode byte without optional
851      prefix(es).  */
852   unsigned int base_opcode;
853 #define Opcode_D        0x2 /* Direction bit:
854                                set if Reg --> Regmem;
855                                unset if Regmem --> Reg. */
856 #define Opcode_FloatR   0x8 /* Bit to swap src/dest for float insns. */
857 #define Opcode_FloatD 0x400 /* Direction bit for float insns. */
858
859   /* extension_opcode is the 3 bit extension for group <n> insns.
860      This field is also used to store the 8-bit opcode suffix for the
861      AMD 3DNow! instructions.
862      If this template has no extension opcode (the usual case) use None
863      Instructions */
864   unsigned int extension_opcode;
865 #define None 0xffff             /* If no extension_opcode is possible.  */
866
867   /* Opcode length.  */
868   unsigned char opcode_length;
869
870   /* cpu feature flags */
871   i386_cpu_flags cpu_flags;
872
873   /* the bits in opcode_modifier are used to generate the final opcode from
874      the base_opcode.  These bits also are used to detect alternate forms of
875      the same instruction */
876   i386_opcode_modifier opcode_modifier;
877
878   /* operand_types[i] describes the type of operand i.  This is made
879      by OR'ing together all of the possible type masks.  (e.g.
880      'operand_types[i] = Reg|Imm' specifies that operand i can be
881      either a register or an immediate operand.  */
882   i386_operand_type operand_types[MAX_OPERANDS];
883 }
884 insn_template;
885
886 extern const insn_template i386_optab[];
887
888 /* these are for register name --> number & type hash lookup */
889 typedef struct
890 {
891   char *reg_name;
892   i386_operand_type reg_type;
893   unsigned char reg_flags;
894 #define RegRex      0x1  /* Extended register.  */
895 #define RegRex64    0x2  /* Extended 8 bit register.  */
896 #define RegVRex     0x4  /* Extended vector register.  */
897   unsigned char reg_num;
898 #define RegRip  ((unsigned char ) ~0)
899 #define RegEip  (RegRip - 1)
900 /* EIZ and RIZ are fake index registers.  */
901 #define RegEiz  (RegEip - 1)
902 #define RegRiz  (RegEiz - 1)
903 /* FLAT is a fake segment register (Intel mode).  */
904 #define RegFlat     ((unsigned char) ~0)
905   signed char dw2_regnum[2];
906 #define Dw2Inval (-1)
907 }
908 reg_entry;
909
910 /* Entries in i386_regtab.  */
911 #define REGNAM_AL 1
912 #define REGNAM_AX 25
913 #define REGNAM_EAX 41
914
915 extern const reg_entry i386_regtab[];
916 extern const unsigned int i386_regtab_size;
917
918 typedef struct
919 {
920   char *seg_name;
921   unsigned int seg_prefix;
922 }
923 seg_entry;
924
925 extern const seg_entry cs;
926 extern const seg_entry ds;
927 extern const seg_entry ss;
928 extern const seg_entry es;
929 extern const seg_entry fs;
930 extern const seg_entry gs;