OSDN Git Service

2009-10-16 H.J. Lu <hongjiu.lu@intel.com>
authorH.J. Lu <hjl@lucon.org>
Fri, 16 Oct 2009 15:50:51 +0000 (15:50 +0000)
committerH.J. Lu <hjl@lucon.org>
Fri, 16 Oct 2009 15:50:51 +0000 (15:50 +0000)
* i386-opc.h: Use enum instead of nested macros.

opcodes/ChangeLog
opcodes/i386-opc.h

index 3fef5ca..2b6cf20 100644 (file)
@@ -1,5 +1,9 @@
 2009-10-16  H.J. Lu  <hongjiu.lu@intel.com>
 
+       * i386-opc.h: Use enum instead of nested macros.
+
+2009-10-16  H.J. Lu  <hongjiu.lu@intel.com>
+
        * i386-dis.c: Simplify enums.
 
 2009-10-15  H.J. Lu  <hongjiu.lu@intel.com>
index df71da7..6c48dbc 100644 (file)
 
 /* 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
+enum
+{
+  /* i186 or better required */
+  Cpu186 = 0,
+  /* i286 or better required */
+  Cpu286,
+  /* i386 or better required */
+  Cpu386,
+  /* i486 or better required */
+  Cpu486,
+  /* i585 or better required */
+  Cpu586,
+  /* i686 or better required */
+  Cpu686,
+  /* CLFLUSH Instuction support required */
+  CpuClflush,
+  /* SYSCALL Instuctions support required */
+  CpuSYSCALL,
+  /* Floating point support required */
+  Cpu8087,
+  /* i287 support required */
+  Cpu287,
+  /* i387 support required */
+  Cpu387,
+  /* i686 and floating point support required */
+  Cpu687,
+  /* SSE3 and floating point support required */
+  CpuFISTTP,
+  /* MMX support required */
+  CpuMMX,
+  /* SSE support required */
+  CpuSSE,
+  /* SSE2 support required */
+  CpuSSE2,
+  /* 3dnow! support required */
+  Cpu3dnow,
+  /* 3dnow! Extensions support required */
+  Cpu3dnowA,
+  /* SSE3 support required */
+  CpuSSE3,
+  /* VIA PadLock required */
+  CpuPadLock,
+  /* AMD Secure Virtual Machine Ext-s required */
+  CpuSVME,
+  /* VMX Instructions required */
+  CpuVMX,
+  /* SMX Instructions required */
+  CpuSMX,
+  /* SSSE3 support required */
+  CpuSSSE3,
+  /* SSE4a support required */
+  CpuSSE4a,
+  /* ABM New Instructions required */
+  CpuABM,
+  /* SSE4.1 support required */
+  CpuSSE4_1,
+  /* SSE4.2 support required */
+  CpuSSE4_2,
+  /* AVX support required */
+  CpuAVX,
+  /* Intel L1OM support required */
+  CpuL1OM,
+  /* Xsave/xrstor New Instuctions support required */
+  CpuXsave,
+  /* AES support required */
+  CpuAES,
+  /* PCLMUL support required */
+  CpuPCLMUL,
+  /* FMA support required */
+  CpuFMA,
+  /* FMA4 support required */
+  CpuFMA4,
+  /* MOVBE Instuction support required */
+  CpuMovbe,
+  /* EPT Instructions required */
+  CpuEPT,
+  /* RDTSCP Instuction support required */
+  CpuRdtscp,
+  /* 64bit support available, used by -march= in assembler.  */
+  CpuLM,
+  /* 64bit support required  */
+  Cpu64,
+  /* Not supported in the 64bit mode  */
+  CpuNo64,
+  /* The last bitfield in i386_cpu_flags.  */
+  CpuMax = CpuNo64
+};
 
 #define CpuNumOfUints \
   (CpuMax / sizeof (unsigned int) / CHAR_BIT + 1)
@@ -180,123 +183,125 @@ typedef union 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:
+enum
+{
+  /* has direction bit. */
+  D = 0,
+  /* set if operands can be words or dwords encoded the canonical way */
+  W,
+  /* Skip the current insn and use the next insn in i386-opc.tbl to swap
+     operand in encoding.  */
+  S,
+  /* insn has a modrm byte. */
+  Modrm,
+  /* register is in low 3 bits of opcode */
+  ShortForm,
+  /* special case for jump insns.  */
+  Jump,
+  /* call and jump */
+  JumpDword,
+  /* loop and jecxz */
+  JumpByte,
+  /* special case for intersegment leaps/calls */
+  JumpInterSegment,
+  /* FP insn memory format bit, sized by 0x4 */
+  FloatMF,
+  /* src/dest swap for floats. */
+  FloatR,
+  /* has float insn direction bit. */
+  FloatD,
+  /* needs size prefix if in 32-bit mode */
+  Size16,
+  /* needs size prefix if in 16-bit mode */
+  Size32,
+  /* needs size prefix if in 64-bit mode */
+  Size64,
+  /* instruction ignores operand size prefix and in Intel mode ignores
+     mnemonic size suffix check.  */
+  IgnoreSize,
+  /* default insn size depends on mode */
+  DefaultSize,
+  /* b suffix on instruction illegal */
+  No_bSuf,
+  /* w suffix on instruction illegal */
+  No_wSuf,
+  /* l suffix on instruction illegal */
+  No_lSuf,
+  /* s suffix on instruction illegal */
+  No_sSuf,
+  /* q suffix on instruction illegal */
+  No_qSuf,
+  /* long double suffix on instruction illegal */
+  No_ldSuf,
+  /* instruction needs FWAIT */
+  FWait,
+  /* quick test for string instructions */
+  IsString,
+  /* fake an extra reg operand for clr, imul and special register
+     processing for some instructions.  */
+  RegKludge,
+  /* The first operand must be xmm0 */
+  FirstXmm0,
+  /* An implicit xmm0 as the first operand */
+  Implicit1stXmm0,
+  /* BYTE is OK in Intel syntax. */
+  ByteOkIntel,
+  /* Convert to DWORD */
+  ToDword,
+  /* Convert to QWORD */
+  ToQword,
+  /* Address prefix changes operand 0 */
+  AddrPrefixOp0,
+  /* opcode is a prefix */
+  IsPrefix,
+  /* instruction has extension in 8 bit imm */
+  ImmExt,
+  /* instruction don't need Rex64 prefix.  */
+  NoRex64,
+  /* instruction require Rex64 prefix.  */
+  Rex64,
+  /* deprecated fp insn, gets a warning */
+  Ugh,
+  /* insn has VEX prefix:
        1: 128bit VEX prefix.
        2: 256bit VEX prefix.
- */
-#define Vex                    (Ugh + 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                 (Vex + 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
  */
+  Vex,
+  /* 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.  */
+  VexNDS,
+  /* insn has VEX NDD. Register destination is encoded in Vex prefix. */
+  VexNDD,
+  /* insn has VEX W0. */
+  VexW0,
+  /* insn has VEX W1. */
+  VexW1,
+  /* insn has VEX 0x0F opcode prefix. */
+  Vex0F,
+  /* insn has VEX 0x0F38 opcode prefix. */
+  Vex0F38,
+  /* insn has VEX 0x0F3A opcode prefix. */
+  Vex0F3A,
+  /* insn has VEX prefix with 3 soures. */
+  Vex3Sources,
+  /* instruction has VEX 8 bit imm */
+  VexImmExt,
+  /* SSE to AVX support required */
+  SSE2AVX,
+  /* No AVX equivalent */
+  NoAVX,
+  /* Compatible with old (<= 2.8.1) versions of gcc  */
+  OldGcc,
+  /* AT&T mnemonic.  */
+  ATTMnemonic,
+  /* AT&T syntax.  */
+  ATTSyntax,
+  /* Intel syntax.  */
+  IntelSyntax,
+  /* The last bitfield in i386_opcode_modifier.  */
+  Opcode_Modifier_Max
+};
 
 typedef struct i386_opcode_modifier
 {
@@ -357,108 +362,111 @@ typedef struct 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
+enum
+{
+  /* 8bit register */
+  Reg8 = 0,
+  /* 16bit register */
+  Reg16,
+  /* 32bit register */
+  Reg32,
+  /* 64bit register */
+  Reg64,
+  /* Floating pointer stack register */
+  FloatReg,
+  /* MMX register */
+  RegMMX,
+  /* SSE register */
+  RegXMM,
+  /* AVX registers */
+  RegYMM,
+  /* Control register */
+  Control,
+  /* Debug register */
+  Debug,
+  /* Test register */
+  Test,
+  /* 2 bit segment register */
+  SReg2,
+  /* 3 bit segment register */
+  SReg3,
+  /* 1 bit immediate */
+  Imm1,
+  /* 8 bit immediate */
+  Imm8,
+  /* 8 bit immediate sign extended */
+  Imm8S,
+  /* 16 bit immediate */
+  Imm16,
+  /* 32 bit immediate */
+  Imm32,
+  /* 32 bit immediate sign extended */
+  Imm32S,
+  /* 64 bit immediate */
+  Imm64,
+  /* 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 */
+  Disp8,
+  /* 16 bit displacement */
+  Disp16,
+  /* 32 bit displacement */
+  Disp32,
+  /* 32 bit signed displacement */
+  Disp32S,
+  /* 64 bit displacement */
+  Disp64,
+  /* Accumulator %al/%ax/%eax/%rax */
+  Acc,
+  /* Floating pointer top stack register %st(0) */
+  FloatAcc,
+  /* Register which can be used for base or index in memory operand.  */
+  BaseIndex,
+  /* Register to hold in/out port addr = dx */
+  InOutPortReg,
+  /* Register to hold shift count = cl */
+  ShiftCount,
+  /* Absolute address for jump.  */
+  JumpAbsolute,
+  /* String insn operand with fixed es segment */
+  EsSeg,
+  /* 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.  */
+  RegMem,
+  /* Memory.  */
+  Mem,
+  /* BYTE memory. */
+  Byte,
+  /* WORD memory. 2 byte */
+  Word,
+  /* DWORD memory. 4 byte */
+  Dword,
+  /* FWORD memory. 6 byte */
+  Fword,
+  /* QWORD memory. 8 byte */
+  Qword,
+  /* TBYTE memory. 10 byte */
+  Tbyte,
+  /* XMMWORD memory. */
+  Xmmword,
+  /* YMMWORD memory. */
+  Ymmword,
+  /* Unspecified memory size.  */
+  Unspecified,
+  /* Any memory size.  */
+  Anysize,
+
+  /* The last bitfield in i386_operand_type.  */
+  OTMax
+};
 
 #define OTNumOfUints \
   (OTMax / sizeof (unsigned int) / CHAR_BIT + 1)