]> oss.titaniummirror.com Git - msp430-binutils.git/blobdiff - opcodes/i386-opc.h
Merge commit 'upstream/2.20'
[msp430-binutils.git] / opcodes / i386-opc.h
index 2c810179b958d1fb73ad027bc2eeb0a7d2b25a19..2dd8eeda66af2c4d1117fee60df9b3c2da9a57af 100644 (file)
@@ -1,5 +1,5 @@
 /* Declarations for Intel 80386 opcode table
-   Copyright 2007
+   Copyright 2007, 2008, 2009
    Free Software Foundation, Inc.
 
    This file is part of the GNU opcodes library.
    02110-1301, USA.  */
 
 #include "opcode/i386.h"
+#ifdef HAVE_LIMITS_H
+#include <limits.h>
+#endif
 
-typedef struct template
+#ifndef CHAR_BIT
+#define CHAR_BIT 8
+#endif
+
+/* Position of cpu flags bitfiled.  */
+
+/* i186 or better required */
+#define Cpu186         0
+/* i286 or better required */
+#define Cpu286         (Cpu186 + 1)
+/* i386 or better required */
+#define Cpu386         (Cpu286 + 1)
+/* i486 or better required */
+#define Cpu486         (Cpu386 + 1)
+/* i585 or better required */
+#define Cpu586         (Cpu486 + 1)
+/* i686 or better required */
+#define Cpu686         (Cpu586 + 1)
+/* CLFLUSH Instuction support required */
+#define CpuClflush     (Cpu686 + 1)
+/* SYSCALL Instuctions support required */
+#define CpuSYSCALL     (CpuClflush + 1)
+/* Floating point support required */
+#define Cpu8087                (CpuSYSCALL + 1)
+/* i287 support required */
+#define Cpu287         (Cpu8087 + 1)
+/* i387 support required */
+#define Cpu387         (Cpu287 + 1)
+/* i686 and floating point support required */
+#define Cpu687         (Cpu387 + 1)
+/* SSE3 and floating point support required */
+#define CpuFISTTP              (Cpu687 + 1)
+/* MMX support required */
+#define CpuMMX         (CpuFISTTP + 1)
+/* SSE support required */
+#define CpuSSE         (CpuMMX + 1)
+/* SSE2 support required */
+#define CpuSSE2                (CpuSSE + 1)
+/* 3dnow! support required */
+#define Cpu3dnow       (CpuSSE2 + 1)
+/* 3dnow! Extensions support required */
+#define Cpu3dnowA      (Cpu3dnow + 1)
+/* SSE3 support required */
+#define CpuSSE3                (Cpu3dnowA + 1)
+/* VIA PadLock required */
+#define CpuPadLock     (CpuSSE3 + 1)
+/* AMD Secure Virtual Machine Ext-s required */
+#define CpuSVME                (CpuPadLock + 1)
+/* VMX Instructions required */
+#define CpuVMX         (CpuSVME + 1)
+/* SMX Instructions required */
+#define CpuSMX         (CpuVMX + 1)
+/* SSSE3 support required */
+#define CpuSSSE3       (CpuSMX + 1)
+/* SSE4a support required */
+#define CpuSSE4a       (CpuSSSE3 + 1)
+/* ABM New Instructions required */
+#define CpuABM         (CpuSSE4a + 1)
+/* SSE4.1 support required */
+#define CpuSSE4_1      (CpuABM + 1)
+/* SSE4.2 support required */
+#define CpuSSE4_2      (CpuSSE4_1 + 1)
+/* AVX support required */
+#define CpuAVX         (CpuSSE4_2 + 1)
+/* Intel L1OM support required */
+#define CpuL1OM                (CpuAVX + 1)
+/* Xsave/xrstor New Instuctions support required */
+#define CpuXsave       (CpuL1OM + 1)
+/* AES support required */
+#define CpuAES         (CpuXsave + 1)
+/* PCLMUL support required */
+#define CpuPCLMUL      (CpuAES + 1)
+/* FMA support required */
+#define CpuFMA         (CpuPCLMUL + 1)
+/* FMA4 support required */
+#define CpuFMA4        (CpuFMA + 1)
+/* MOVBE Instuction support required */
+#define CpuMovbe       (CpuFMA4 + 1)
+/* EPT Instructions required */
+#define CpuEPT         (CpuMovbe + 1)
+/* RDTSCP Instuction support required */
+#define CpuRdtscp      (CpuEPT + 1)
+/* 64bit support available, used by -march= in assembler.  */
+#define CpuLM          (CpuRdtscp + 1)
+/* 64bit support required  */
+#define Cpu64          (CpuLM + 1)
+/* Not supported in the 64bit mode  */
+#define CpuNo64                (Cpu64 + 1)
+/* The last bitfield in i386_cpu_flags.  */
+#define CpuMax         CpuNo64
+
+#define CpuNumOfUints \
+  (CpuMax / sizeof (unsigned int) / CHAR_BIT + 1)
+#define CpuNumOfBits \
+  (CpuNumOfUints * sizeof (unsigned int) * CHAR_BIT)
+
+/* If you get a compiler error for zero width of the unused field,
+   comment it out.  */
+#define CpuUnused      (CpuMax + 1)
+
+/* We can check if an instruction is available with array instead
+   of bitfield. */
+typedef union i386_cpu_flags
+{
+  struct
+    {
+      unsigned int cpui186:1;
+      unsigned int cpui286:1;
+      unsigned int cpui386:1;
+      unsigned int cpui486:1;
+      unsigned int cpui586:1;
+      unsigned int cpui686:1;
+      unsigned int cpuclflush:1;
+      unsigned int cpusyscall:1;
+      unsigned int cpu8087:1;
+      unsigned int cpu287:1;
+      unsigned int cpu387:1;
+      unsigned int cpu687:1;
+      unsigned int cpufisttp:1;
+      unsigned int cpummx:1;
+      unsigned int cpusse:1;
+      unsigned int cpusse2:1;
+      unsigned int cpua3dnow:1;
+      unsigned int cpua3dnowa:1;
+      unsigned int cpusse3:1;
+      unsigned int cpupadlock:1;
+      unsigned int cpusvme:1;
+      unsigned int cpuvmx:1;
+      unsigned int cpusmx:1;
+      unsigned int cpussse3:1;
+      unsigned int cpusse4a:1;
+      unsigned int cpuabm:1;
+      unsigned int cpusse4_1:1;
+      unsigned int cpusse4_2:1;
+      unsigned int cpuavx:1;
+      unsigned int cpul1om:1;
+      unsigned int cpuxsave:1;
+      unsigned int cpuaes:1;
+      unsigned int cpupclmul:1;
+      unsigned int cpufma:1;
+      unsigned int cpufma4:1;
+      unsigned int cpumovbe:1;
+      unsigned int cpuept:1;
+      unsigned int cpurdtscp:1;
+      unsigned int cpulm:1;
+      unsigned int cpu64:1;
+      unsigned int cpuno64:1;
+#ifdef CpuUnused
+      unsigned int unused:(CpuNumOfBits - CpuUnused);
+#endif
+    } bitfield;
+  unsigned int array[CpuNumOfUints];
+} i386_cpu_flags;
+
+/* Position of opcode_modifier bits.  */
+
+/* has direction bit. */
+#define D                      0
+/* set if operands can be words or dwords encoded the canonical way */
+#define W                      (D + 1)
+/* Skip the current insn and use the next insn in i386-opc.tbl to swap
+   operand in encoding.  */
+#define S                      (W + 1)
+/* insn has a modrm byte. */
+#define Modrm                  (S + 1)
+/* register is in low 3 bits of opcode */
+#define ShortForm              (Modrm + 1)
+/* special case for jump insns.  */
+#define Jump                   (ShortForm + 1)
+/* call and jump */
+#define JumpDword              (Jump + 1)
+/* loop and jecxz */
+#define JumpByte               (JumpDword + 1)
+/* special case for intersegment leaps/calls */
+#define JumpInterSegment       (JumpByte + 1)
+/* FP insn memory format bit, sized by 0x4 */
+#define FloatMF                        (JumpInterSegment + 1)
+/* src/dest swap for floats. */
+#define FloatR                 (FloatMF + 1)
+/* has float insn direction bit. */
+#define FloatD                 (FloatR + 1)
+/* needs size prefix if in 32-bit mode */
+#define Size16                 (FloatD + 1)
+/* needs size prefix if in 16-bit mode */
+#define Size32                 (Size16 + 1)
+/* needs size prefix if in 64-bit mode */
+#define Size64                 (Size32 + 1)
+/* instruction ignores operand size prefix and in Intel mode ignores
+   mnemonic size suffix check.  */
+#define IgnoreSize             (Size64 + 1)
+/* default insn size depends on mode */
+#define DefaultSize            (IgnoreSize + 1)
+/* b suffix on instruction illegal */
+#define No_bSuf                        (DefaultSize + 1)
+/* w suffix on instruction illegal */
+#define No_wSuf                        (No_bSuf + 1)
+/* l suffix on instruction illegal */
+#define No_lSuf                        (No_wSuf + 1)
+/* s suffix on instruction illegal */
+#define No_sSuf                        (No_lSuf + 1)
+/* q suffix on instruction illegal */
+#define No_qSuf                        (No_sSuf + 1)
+/* long double suffix on instruction illegal */
+#define No_ldSuf               (No_qSuf + 1)
+/* instruction needs FWAIT */
+#define FWait                  (No_ldSuf + 1)
+/* quick test for string instructions */
+#define IsString               (FWait + 1)
+/* fake an extra reg operand for clr, imul and special register
+   processing for some instructions.  */
+#define RegKludge              (IsString + 1)
+/* The first operand must be xmm0 */
+#define FirstXmm0              (RegKludge + 1)
+/* An implicit xmm0 as the first operand */
+#define Implicit1stXmm0                (FirstXmm0 + 1)
+/* BYTE is OK in Intel syntax. */
+#define ByteOkIntel            (Implicit1stXmm0 + 1)
+/* Convert to DWORD */
+#define ToDword                        (ByteOkIntel + 1)
+/* Convert to QWORD */
+#define ToQword                        (ToDword + 1)
+/* Address prefix changes operand 0 */
+#define AddrPrefixOp0          (ToQword + 1)
+/* opcode is a prefix */
+#define IsPrefix               (AddrPrefixOp0 + 1)
+/* instruction has extension in 8 bit imm */
+#define ImmExt                 (IsPrefix + 1)
+/* instruction don't need Rex64 prefix.  */
+#define NoRex64                        (ImmExt + 1)
+/* instruction require Rex64 prefix.  */
+#define Rex64                  (NoRex64 + 1)
+/* deprecated fp insn, gets a warning */
+#define Ugh                    (Rex64 + 1)
+/* insn has VEX prefix. */
+#define Vex                    (Ugh + 1)
+/* insn has 256bit VEX prefix. */
+#define Vex256                 (Vex + 1)
+/* insn has VEX NDS. Register-only source is encoded in Vex prefix.
+   We use VexNDS on insns with VEX DDS since the register-only source
+   is the second source register.  */
+#define VexNDS                 (Vex256 + 1)
+/* insn has VEX NDD. Register destination is encoded in Vex
+   prefix. */
+#define VexNDD                 (VexNDS + 1)
+/* insn has VEX W0. */
+#define VexW0                  (VexNDD + 1)
+/* insn has VEX W1. */
+#define VexW1                  (VexW0 + 1)
+/* insn has VEX 0x0F opcode prefix. */
+#define Vex0F                  (VexW1 + 1)
+/* insn has VEX 0x0F38 opcode prefix. */
+#define Vex0F38                        (Vex0F + 1)
+/* insn has VEX 0x0F3A opcode prefix. */
+#define Vex0F3A                        (Vex0F38 + 1)
+/* insn has VEX prefix with 3 soures. */
+#define Vex3Sources            (Vex0F3A + 1)
+/* instruction has VEX 8 bit imm */
+#define VexImmExt              (Vex3Sources + 1)
+/* SSE to AVX support required */
+#define SSE2AVX                        (VexImmExt + 1)
+/* No AVX equivalent */
+#define NoAVX                  (SSE2AVX + 1)
+/* Compatible with old (<= 2.8.1) versions of gcc  */
+#define OldGcc                 (NoAVX + 1)
+/* AT&T mnemonic.  */
+#define ATTMnemonic            (OldGcc + 1)
+/* AT&T syntax.  */
+#define ATTSyntax              (ATTMnemonic + 1)
+/* Intel syntax.  */
+#define IntelSyntax            (ATTSyntax + 1)
+/* The last bitfield in i386_opcode_modifier.  */
+#define Opcode_Modifier_Max    IntelSyntax
+
+typedef struct i386_opcode_modifier
+{
+  unsigned int d:1;
+  unsigned int w:1;
+  unsigned int s:1;
+  unsigned int modrm:1;
+  unsigned int shortform:1;
+  unsigned int jump:1;
+  unsigned int jumpdword:1;
+  unsigned int jumpbyte:1;
+  unsigned int jumpintersegment:1;
+  unsigned int floatmf:1;
+  unsigned int floatr:1;
+  unsigned int floatd:1;
+  unsigned int size16:1;
+  unsigned int size32:1;
+  unsigned int size64:1;
+  unsigned int ignoresize:1;
+  unsigned int defaultsize:1;
+  unsigned int no_bsuf:1;
+  unsigned int no_wsuf:1;
+  unsigned int no_lsuf:1;
+  unsigned int no_ssuf:1;
+  unsigned int no_qsuf:1;
+  unsigned int no_ldsuf:1;
+  unsigned int fwait:1;
+  unsigned int isstring:1;
+  unsigned int regkludge:1;
+  unsigned int firstxmm0:1;
+  unsigned int implicit1stxmm0:1;
+  unsigned int byteokintel:1;
+  unsigned int todword:1;
+  unsigned int toqword:1;
+  unsigned int addrprefixop0:1;
+  unsigned int isprefix:1;
+  unsigned int immext:1;
+  unsigned int norex64:1;
+  unsigned int rex64:1;
+  unsigned int ugh:1;
+  unsigned int vex:1;
+  unsigned int vex256:1;
+  unsigned int vexnds:1;
+  unsigned int vexndd:1;
+  unsigned int vexw0:1;
+  unsigned int vexw1:1;
+  unsigned int vex0f:1;
+  unsigned int vex0f38:1;
+  unsigned int vex0f3a:1;
+  unsigned int vex3sources:1;
+  unsigned int veximmext:1;
+  unsigned int sse2avx:1;
+  unsigned int noavx:1;
+  unsigned int oldgcc:1;
+  unsigned int attmnemonic:1;
+  unsigned int attsyntax:1;
+  unsigned int intelsyntax:1;
+} i386_opcode_modifier;
+
+/* Position of operand_type bits.  */
+
+/* 8bit register */
+#define Reg8                   0
+/* 16bit register */
+#define Reg16                  (Reg8 + 1)
+/* 32bit register */
+#define Reg32                  (Reg16 + 1)
+/* 64bit register */
+#define Reg64                  (Reg32 + 1)
+/* Floating pointer stack register */
+#define FloatReg               (Reg64 + 1)
+/* MMX register */
+#define RegMMX                 (FloatReg + 1)
+/* SSE register */
+#define RegXMM                 (RegMMX + 1)
+/* AVX registers */
+#define RegYMM                 (RegXMM + 1)
+/* Control register */
+#define Control                        (RegYMM + 1)
+/* Debug register */
+#define Debug                  (Control + 1)
+/* Test register */
+#define Test                   (Debug + 1)
+/* 2 bit segment register */
+#define SReg2                  (Test + 1)
+/* 3 bit segment register */
+#define SReg3                  (SReg2 + 1)
+/* 1 bit immediate */
+#define Imm1                   (SReg3 + 1)
+/* 8 bit immediate */
+#define Imm8                   (Imm1 + 1)
+/* 8 bit immediate sign extended */
+#define Imm8S                  (Imm8 + 1)
+/* 16 bit immediate */
+#define Imm16                  (Imm8S + 1)
+/* 32 bit immediate */
+#define Imm32                  (Imm16 + 1)
+/* 32 bit immediate sign extended */
+#define Imm32S                 (Imm32 + 1)
+/* 64 bit immediate */
+#define Imm64                  (Imm32S + 1)
+/* 8bit/16bit/32bit displacements are used in different ways,
+   depending on the instruction.  For jumps, they specify the
+   size of the PC relative displacement, for instructions with
+   memory operand, they specify the size of the offset relative
+   to the base register, and for instructions with memory offset
+   such as `mov 1234,%al' they specify the size of the offset
+   relative to the segment base.  */
+/* 8 bit displacement */
+#define Disp8                  (Imm64 + 1)
+/* 16 bit displacement */
+#define Disp16                 (Disp8 + 1)
+/* 32 bit displacement */
+#define Disp32                 (Disp16 + 1)
+/* 32 bit signed displacement */
+#define Disp32S                        (Disp32 + 1)
+/* 64 bit displacement */
+#define Disp64                 (Disp32S + 1)
+/* Accumulator %al/%ax/%eax/%rax */
+#define Acc                    (Disp64 + 1)
+/* Floating pointer top stack register %st(0) */
+#define FloatAcc               (Acc + 1)
+/* Register which can be used for base or index in memory operand.  */
+#define BaseIndex              (FloatAcc + 1)
+/* Register to hold in/out port addr = dx */
+#define InOutPortReg           (BaseIndex + 1)
+/* Register to hold shift count = cl */
+#define ShiftCount             (InOutPortReg + 1)
+/* Absolute address for jump.  */
+#define JumpAbsolute           (ShiftCount + 1)
+/* String insn operand with fixed es segment */
+#define EsSeg                  (JumpAbsolute + 1)
+/* RegMem is for instructions with a modrm byte where the register
+   destination operand should be encoded in the mod and regmem fields.
+   Normally, it will be encoded in the reg field. We add a RegMem
+   flag to the destination register operand to indicate that it should
+   be encoded in the regmem field.  */
+#define RegMem                 (EsSeg + 1)
+/* Memory.  */
+#define Mem                    (RegMem + 1)
+/* BYTE memory. */
+#define Byte                   (Mem + 1)
+/* WORD memory. 2 byte */
+#define Word                   (Byte + 1)
+/* DWORD memory. 4 byte */
+#define Dword                  (Word + 1)
+/* FWORD memory. 6 byte */
+#define Fword                  (Dword + 1)
+/* QWORD memory. 8 byte */
+#define Qword                  (Fword + 1)
+/* TBYTE memory. 10 byte */
+#define Tbyte                  (Qword + 1)
+/* XMMWORD memory. */
+#define Xmmword                        (Tbyte + 1)
+/* YMMWORD memory. */
+#define Ymmword                        (Xmmword + 1)
+/* Unspecified memory size.  */
+#define Unspecified            (Ymmword + 1)
+/* Any memory size.  */
+#define Anysize                        (Unspecified  + 1)
+
+/* The last bitfield in i386_operand_type.  */
+#define OTMax                  Anysize
+
+#define OTNumOfUints \
+  (OTMax / sizeof (unsigned int) / CHAR_BIT + 1)
+#define OTNumOfBits \
+  (OTNumOfUints * sizeof (unsigned int) * CHAR_BIT)
+
+/* If you get a compiler error for zero width of the unused field,
+   comment it out.  */
+#define OTUnused               (OTMax + 1)
+
+typedef union i386_operand_type
+{
+  struct
+    {
+      unsigned int reg8:1;
+      unsigned int reg16:1;
+      unsigned int reg32:1;
+      unsigned int reg64:1;
+      unsigned int floatreg:1;
+      unsigned int regmmx:1;
+      unsigned int regxmm:1;
+      unsigned int regymm:1;
+      unsigned int control:1;
+      unsigned int debug:1;
+      unsigned int test:1;
+      unsigned int sreg2:1;
+      unsigned int sreg3:1;
+      unsigned int imm1:1;
+      unsigned int imm8:1;
+      unsigned int imm8s:1;
+      unsigned int imm16:1;
+      unsigned int imm32:1;
+      unsigned int imm32s:1;
+      unsigned int imm64:1;
+      unsigned int disp8:1;
+      unsigned int disp16:1;
+      unsigned int disp32:1;
+      unsigned int disp32s:1;
+      unsigned int disp64:1;
+      unsigned int acc:1;
+      unsigned int floatacc:1;
+      unsigned int baseindex:1;
+      unsigned int inoutportreg:1;
+      unsigned int shiftcount:1;
+      unsigned int jumpabsolute:1;
+      unsigned int esseg:1;
+      unsigned int regmem:1;
+      unsigned int mem:1;
+      unsigned int byte:1;
+      unsigned int word:1;
+      unsigned int dword:1;
+      unsigned int fword:1;
+      unsigned int qword:1;
+      unsigned int tbyte:1;
+      unsigned int xmmword:1;
+      unsigned int ymmword:1;
+      unsigned int unspecified:1;
+      unsigned int anysize:1;
+#ifdef OTUnused
+      unsigned int unused:(OTNumOfBits - OTUnused);
+#endif
+    } bitfield;
+  unsigned int array[OTNumOfUints];
+} i386_operand_type;
+
+typedef struct insn_template
 {
   /* instruction name sans width suffix ("mov" for movl insns) */
   char *name;
@@ -41,178 +544,50 @@ typedef struct template
   /* extension_opcode is the 3 bit extension for group <n> insns.
      This field is also used to store the 8-bit opcode suffix for the
      AMD 3DNow! instructions.
-     If this template has no extension opcode (the usual case) use None */
+     If this template has no extension opcode (the usual case) use None 
+     Instructions */
   unsigned int extension_opcode;
 #define None 0xffff            /* If no extension_opcode is possible.  */
 
+  /* Opcode length.  */
+  unsigned char opcode_length;
+
   /* cpu feature flags */
-  unsigned int cpu_flags;
-#define Cpu186           0x1   /* i186 or better required */
-#define Cpu286           0x2   /* i286 or better required */
-#define Cpu386           0x4   /* i386 or better required */
-#define Cpu486           0x8   /* i486 or better required */
-#define Cpu586          0x10   /* i585 or better required */
-#define Cpu686          0x20   /* i686 or better required */
-#define CpuP4           0x40   /* Pentium4 or better required */
-#define CpuK6           0x80   /* AMD K6 or better required*/
-#define CpuSledgehammer 0x100  /* Sledgehammer or better required */
-#define CpuMMX         0x200   /* MMX support required */
-#define CpuMMX2                0x400   /* extended MMX support (with SSE or 3DNow!Ext) required */
-#define CpuSSE         0x800   /* Streaming SIMD extensions required */
-#define CpuSSE2               0x1000   /* Streaming SIMD extensions 2 required */
-#define Cpu3dnow       0x2000  /* 3dnow! support required */
-#define Cpu3dnowA      0x4000  /* 3dnow!Extensions support required */
-#define CpuSSE3               0x8000   /* Streaming SIMD extensions 3 required */
-#define CpuPadLock    0x10000  /* VIA PadLock required */
-#define CpuSVME              0x20000   /* AMD Secure Virtual Machine Ext-s required */
-#define CpuVMX       0x40000   /* VMX Instructions required */
-#define CpuSSSE3      0x80000  /* Supplemental Streaming SIMD extensions 3 required */
-#define CpuSSE4a     0x100000   /* SSE4a New Instuctions required */
-#define CpuABM       0x200000   /* ABM New Instructions required */
-#define CpuSSE4_1    0x400000  /* SSE4.1 Instructions required */
-#define CpuSSE4_2    0x800000  /* SSE4.2 Instructions required */
-
-/* SSE4.1/4.2 Instructions required */
-#define CpuSSE4             (CpuSSE4_1|CpuSSE4_2)
-
-  /* These flags are set by gas depending on the flag_code.  */
-#define Cpu64       0x4000000   /* 64bit support required  */
-#define CpuNo64      0x8000000   /* Not supported in the 64bit mode  */
-
-  /* The default value for unknown CPUs - enable all features to avoid problems.  */
-#define CpuUnknownFlags (Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686 \
-       |CpuP4|CpuSledgehammer|CpuMMX|CpuMMX2|CpuSSE|CpuSSE2|CpuSSE3|CpuVMX \
-       |Cpu3dnow|Cpu3dnowA|CpuK6|CpuPadLock|CpuSVME|CpuSSSE3|CpuSSE4_1 \
-       |CpuSSE4_2|CpuABM|CpuSSE4a)
+  i386_cpu_flags cpu_flags;
 
   /* the bits in opcode_modifier are used to generate the final opcode from
      the base_opcode.  These bits also are used to detect alternate forms of
      the same instruction */
-  unsigned int opcode_modifier;
-
-  /* opcode_modifier bits: */
-#define D                 0x1  /* has direction bit. */
-#define W                 0x2  /* set if operands can be words or dwords
-                                  encoded the canonical way */
-#define Modrm             0x4  /* insn has a modrm byte. */
-#define ShortForm         0x8  /* register is in low 3 bits of opcode */
-#define Jump             0x10  /* special case for jump insns.  */
-#define JumpDword        0x20  /* call and jump */
-#define JumpByte         0x40  /* loop and jecxz */
-#define JumpInterSegment  0x80 /* special case for intersegment leaps/calls */
-#define FloatMF                 0x100  /* FP insn memory format bit, sized by 0x4 */
-#define FloatR          0x200  /* src/dest swap for floats. */
-#define FloatD          0x400  /* has float insn direction bit. */
-#define Size16          0x800  /* needs size prefix if in 32-bit mode */
-#define Size32         0x1000  /* needs size prefix if in 16-bit mode */
-#define Size64         0x2000  /* needs size prefix if in 64-bit mode */
-#define IgnoreSize      0x4000  /* instruction ignores operand size prefix */
-#define DefaultSize     0x8000  /* default insn size depends on mode */
-#define No_bSuf               0x10000  /* b suffix on instruction illegal */
-#define No_wSuf               0x20000  /* w suffix on instruction illegal */
-#define No_lSuf               0x40000  /* l suffix on instruction illegal */
-#define No_sSuf               0x80000  /* s suffix on instruction illegal */
-#define No_qSuf       0x100000  /* q suffix on instruction illegal */
-#define No_xSuf       0x200000  /* x suffix on instruction illegal */
-#define FWait        0x400000  /* instruction needs FWAIT */
-#define IsString      0x800000 /* quick test for string instructions */
-#define RegKludge    0x1000000 /* fake an extra reg operand for clr, imul
-                                  and special register processing for
-                                  some instructions.  */
-#define IsPrefix     0x2000000 /* opcode is a prefix */
-#define ImmExt      0x4000000  /* instruction has extension in 8 bit imm */
-#define NoRex64             0x8000000  /* instruction don't need Rex64 prefix.  */
-#define Rex64      0x10000000  /* instruction require Rex64 prefix.  */
-#define Ugh        0x20000000  /* deprecated fp insn, gets a warning */
+  i386_opcode_modifier opcode_modifier;
 
   /* operand_types[i] describes the type of operand i.  This is made
      by OR'ing together all of the possible type masks.  (e.g.
      'operand_types[i] = Reg|Imm' specifies that operand i can be
      either a register or an immediate operand.  */
-  unsigned int operand_types[MAX_OPERANDS];
-
-  /* operand_types[i] bits */
-  /* register */
-#define Reg8              0x1  /* 8 bit reg */
-#define Reg16             0x2  /* 16 bit reg */
-#define Reg32             0x4  /* 32 bit reg */
-#define Reg64             0x8  /* 64 bit reg */
-  /* immediate */
-#define Imm8             0x10  /* 8 bit immediate */
-#define Imm8S            0x20  /* 8 bit immediate sign extended */
-#define Imm16            0x40  /* 16 bit immediate */
-#define Imm32            0x80  /* 32 bit immediate */
-#define Imm32S          0x100  /* 32 bit immediate sign extended */
-#define Imm64           0x200  /* 64 bit immediate */
-#define Imm1            0x400  /* 1 bit immediate */
-  /* memory */
-#define BaseIndex       0x800
-  /* Disp8,16,32 are used in different ways, depending on the
-     instruction.  For jumps, they specify the size of the PC relative
-     displacement, for baseindex type instructions, they specify the
-     size of the offset relative to the base register, and for memory
-     offset instructions such as `mov 1234,%al' they specify the size of
-     the offset relative to the segment base.  */
-#define Disp8          0x1000  /* 8 bit displacement */
-#define Disp16         0x2000  /* 16 bit displacement */
-#define Disp32         0x4000  /* 32 bit displacement */
-#define Disp32S                0x8000  /* 32 bit signed displacement */
-#define Disp64        0x10000  /* 64 bit displacement */
-  /* specials */
-#define InOutPortReg   0x20000 /* register to hold in/out port addr = dx */
-#define ShiftCount     0x40000 /* register to hold shift count = cl */
-#define Control               0x80000  /* Control register */
-#define Debug        0x100000  /* Debug register */
-#define Test         0x200000  /* Test register */
-#define FloatReg      0x400000 /* Float register */
-#define FloatAcc      0x800000 /* Float stack top %st(0) */
-#define SReg2       0x1000000  /* 2 bit segment register */
-#define SReg3       0x2000000  /* 3 bit segment register */
-#define Acc         0x4000000  /* Accumulator %al or %ax or %eax */
-#define JumpAbsolute 0x8000000
-#define RegMMX     0x10000000  /* MMX register */
-#define RegXMM     0x20000000  /* XMM registers in PIII */
-#define EsSeg      0x40000000  /* String insn operand with fixed es segment */
-
-  /* RegMem is for instructions with a modrm byte where the register
-     destination operand should be encoded in the mod and regmem fields.
-     Normally, it will be encoded in the reg field. We add a RegMem
-     flag to the destination register operand to indicate that it should
-     be encoded in the regmem field.  */
-#define RegMem     0x80000000
-
-#define Reg    (Reg8|Reg16|Reg32|Reg64) /* gen'l register */
-#define WordReg (Reg16|Reg32|Reg64)
-#define ImplicitRegister (InOutPortReg|ShiftCount|Acc|FloatAcc)
-#define Imm    (Imm8|Imm8S|Imm16|Imm32S|Imm32|Imm64) /* gen'l immediate */
-#define EncImm (Imm8|Imm16|Imm32|Imm32S) /* Encodable gen'l immediate */
-#define Disp   (Disp8|Disp16|Disp32|Disp32S|Disp64) /* General displacement */
-#define AnyMem (Disp8|Disp16|Disp32|Disp32S|BaseIndex) /* General memory */
-  /* The following aliases are defined because the opcode table
-     carefully specifies the allowed memory types for each instruction.
-     At the moment we can only tell a memory reference size by the
-     instruction suffix, so there's not much point in defining Mem8,
-     Mem16, Mem32 and Mem64 opcode modifiers - We might as well just use
-     the suffix directly to check memory operands.  */
-#define LLongMem AnyMem                /* 64 bits (or more) */
-#define LongMem AnyMem         /* 32 bit memory ref */
-#define ShortMem AnyMem                /* 16 bit memory ref */
-#define WordMem AnyMem         /* 16, 32 or 64 bit memory ref */
-#define ByteMem AnyMem         /* 8 bit memory ref */
+  i386_operand_type operand_types[MAX_OPERANDS];
 }
-template;
+insn_template;
 
-extern const template i386_optab[];
+extern const insn_template i386_optab[];
 
 /* these are for register name --> number & type hash lookup */
 typedef struct
 {
   char *reg_name;
-  unsigned int reg_type;
-  unsigned int reg_flags;
+  i386_operand_type reg_type;
+  unsigned char reg_flags;
 #define RegRex     0x1  /* Extended register.  */
 #define RegRex64    0x2  /* Extended 8 bit register.  */
-  unsigned int reg_num;
+  unsigned char reg_num;
+#define RegRip ((unsigned char ) ~0)
+#define RegEip (RegRip - 1)
+/* EIZ and RIZ are fake index registers.  */
+#define RegEiz (RegEip - 1)
+#define RegRiz (RegEiz - 1)
+/* FLAT is a fake segment register (Intel mode).  */
+#define RegFlat     ((unsigned char) ~0)
+  signed char dw2_regnum[2];
+#define Dw2Inval (-1)
 }
 reg_entry;