Home | History | Annotate | Download | only in opcodes
      1 /* Copyright (C) 2007-2014 Free Software Foundation, Inc.
      2 
      3    This file is part of the GNU opcodes library.
      4 
      5    This library is free software; you can redistribute it and/or modify
      6    it under the terms of the GNU General Public License as published by
      7    the Free Software Foundation; either version 3, or (at your option)
      8    any later version.
      9 
     10    It is distributed in the hope that it will be useful, but WITHOUT
     11    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
     12    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
     13    License for more details.
     14 
     15    You should have received a copy of the GNU General Public License
     16    along with this program; if not, write to the Free Software
     17    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
     18    MA 02110-1301, USA.  */
     19 
     20 #include "sysdep.h"
     21 #include <stdio.h>
     22 #include <errno.h>
     23 #include "getopt.h"
     24 #include "libiberty.h"
     25 #include "hashtab.h"
     26 #include "safe-ctype.h"
     27 
     28 #include "i386-opc.h"
     29 
     30 #include <libintl.h>
     31 #define _(String) gettext (String)
     32 
     33 static const char *program_name = NULL;
     34 static int debug = 0;
     35 
     36 typedef struct initializer
     37 {
     38   const char *name;
     39   const char *init;
     40 } initializer;
     41 
     42 static initializer cpu_flag_init[] =
     43 {
     44   { "CPU_UNKNOWN_FLAGS",
     45     "~(CpuL1OM|CpuK1OM)" },
     46   { "CPU_GENERIC32_FLAGS",
     47     "Cpu186|Cpu286|Cpu386" },
     48   { "CPU_GENERIC64_FLAGS",
     49     "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuClflush|Cpu387|Cpu687|CpuNop|CpuMMX|CpuSSE|CpuSSE2|CpuLM" },
     50   { "CPU_NONE_FLAGS",
     51    "0" },
     52   { "CPU_I186_FLAGS",
     53     "Cpu186" },
     54   { "CPU_I286_FLAGS",
     55     "Cpu186|Cpu286" },
     56   { "CPU_I386_FLAGS",
     57     "Cpu186|Cpu286|Cpu386" },
     58   { "CPU_I486_FLAGS",
     59     "Cpu186|Cpu286|Cpu386|Cpu486" },
     60   { "CPU_I586_FLAGS",
     61     "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu387" },
     62   { "CPU_I686_FLAGS",
     63     "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|Cpu387|Cpu687" },
     64   { "CPU_PENTIUMPRO_FLAGS",
     65     "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|Cpu387|Cpu687|CpuNop" },
     66   { "CPU_P2_FLAGS",
     67     "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|Cpu387|Cpu687|CpuNop|CpuMMX" },
     68   { "CPU_P3_FLAGS",
     69     "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|Cpu387|Cpu687|CpuNop|CpuMMX|CpuSSE" },
     70   { "CPU_P4_FLAGS",
     71     "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuClflush|Cpu387|Cpu687|CpuNop|CpuMMX|CpuSSE|CpuSSE2" },
     72   { "CPU_NOCONA_FLAGS",
     73     "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuClflush|Cpu387|Cpu687|CpuFISTTP|CpuNop|CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuLM|CpuCX16" },
     74   { "CPU_CORE_FLAGS",
     75     "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuClflush|Cpu387|Cpu687|CpuFISTTP|CpuNop|CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuCX16" },
     76   { "CPU_CORE2_FLAGS",
     77     "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuClflush|Cpu387|Cpu687|CpuFISTTP|CpuNop|CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuLM|CpuCX16" },
     78   { "CPU_COREI7_FLAGS",
     79     "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuClflush|Cpu387|Cpu687|CpuFISTTP|CpuNop|CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuRdtscp|CpuLM|CpuCX16" },
     80   { "CPU_K6_FLAGS",
     81     "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|CpuSYSCALL|Cpu387|CpuMMX" },
     82   { "CPU_K6_2_FLAGS",
     83     "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|CpuSYSCALL|Cpu387|CpuMMX|Cpu3dnow" },
     84   { "CPU_ATHLON_FLAGS",
     85     "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuSYSCALL|Cpu387|Cpu687|CpuNop|CpuMMX|Cpu3dnow|Cpu3dnowA" },
     86   { "CPU_K8_FLAGS",
     87     "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuSYSCALL|CpuRdtscp|Cpu387|Cpu687|CpuNop|CpuMMX|Cpu3dnow|Cpu3dnowA|CpuSSE|CpuSSE2|CpuLM" },
     88   { "CPU_AMDFAM10_FLAGS",
     89     "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuSYSCALL|CpuRdtscp|Cpu387|Cpu687|CpuFISTTP|CpuNop|CpuMMX|Cpu3dnow|Cpu3dnowA|CpuSSE|CpuSSE2|CpuSSE3|CpuSSE4a|CpuABM|CpuLM" },
     90   { "CPU_BDVER1_FLAGS",
     91     "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuSYSCALL|CpuRdtscp|Cpu387|Cpu687|CpuFISTTP|CpuNop|CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSE4a|CpuABM|CpuLM|CpuFMA4|CpuXOP|CpuLWP|CpuCX16|CpuClflush|CpuSSSE3|CpuSVME|CpuSSE4_1|CpuSSE4_2|CpuXsave|CpuAES|CpuAVX|CpuPCLMUL|CpuLZCNT|CpuPRFCHW" },
     92   { "CPU_BDVER2_FLAGS",
     93     "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuSYSCALL|CpuRdtscp|Cpu387|Cpu687|CpuFISTTP|CpuNop|CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSE4a|CpuABM|CpuLM|CpuFMA|CpuFMA4|CpuXOP|CpuLWP|CpuBMI|CpuTBM|CpuF16C|CpuCX16|CpuClflush|CpuSSSE3|CpuSVME|CpuSSE4_1|CpuSSE4_2|CpuXsave|CpuAES|CpuAVX|CpuPCLMUL|CpuLZCNT|CpuPRFCHW" },
     94   { "CPU_BDVER3_FLAGS",
     95     "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuSYSCALL|CpuRdtscp|Cpu387|Cpu687|CpuFISTTP|CpuNop|CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSE4a|CpuABM|CpuLM|CpuFMA|CpuFMA4|CpuXOP|CpuLWP|CpuBMI|CpuTBM|CpuF16C|CpuCX16|CpuClflush|CpuSSSE3|CpuSVME|CpuSSE4_1|CpuSSE4_2|CpuAES|CpuAVX|CpuPCLMUL|CpuLZCNT|CpuPRFCHW|CpuXsave|CpuXsaveopt|CpuFSGSBase" },
     96   { "CPU_BDVER4_FLAGS",
     97     "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuSYSCALL|CpuRdtscp|Cpu387|Cpu687|CpuFISTTP|CpuNop|CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSE4a|CpuABM|CpuLM|CpuFMA|CpuFMA4|CpuXOP|CpuLWP|CpuBMI|CpuTBM|CpuF16C|CpuCX16|CpuClflush|CpuSSSE3|CpuSVME|CpuSSE4_1|CpuSSE4_2|CpuAES|CpuAVX|CpuPCLMUL|CpuLZCNT|CpuPRFCHW|CpuXsave|CpuXsaveopt|CpuFSGSBase|CpuAVX2|CpuMovbe|CpuBMI2|CpuRdRnd" },
     98   { "CPU_BTVER1_FLAGS",
     99     "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuSYSCALL|CpuRdtscp|Cpu387|Cpu687|CpuNop|CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4a|CpuABM|CpuLM|CpuPRFCHW|CpuCX16|CpuClflush|CpuFISTTP|CpuSVME|CpuLZCNT" },
    100   { "CPU_BTVER2_FLAGS",
    101     "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuSYSCALL|CpuRdtscp|Cpu387|Cpu687|CpuNop|CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4a|CpuSSE4_1|CpuSSE4_2|CpuABM|CpuLM|CpuBMI|CpuF16C|CpuAES|CpuPCLMUL|CpuAVX|CpuMovbe|CpuXsave|CpuXsaveopt|CpuPRFCHW|CpuCX16|CpuClflush|CpuFISTTP|CpuSVME|CpuLZCNT" },
    102   { "CPU_8087_FLAGS",
    103     "Cpu8087" },
    104   { "CPU_287_FLAGS",
    105     "Cpu287" },
    106   { "CPU_387_FLAGS",
    107     "Cpu387" },
    108   { "CPU_ANY87_FLAGS",
    109     "Cpu8087|Cpu287|Cpu387|Cpu687|CpuFISTTP" },
    110   { "CPU_CLFLUSH_FLAGS",
    111     "CpuClflush" },
    112   { "CPU_NOP_FLAGS",
    113     "CpuNop" },
    114   { "CPU_SYSCALL_FLAGS",
    115     "CpuSYSCALL" },
    116   { "CPU_MMX_FLAGS",
    117     "CpuMMX" },
    118   { "CPU_SSE_FLAGS",
    119     "CpuMMX|CpuSSE" },
    120   { "CPU_SSE2_FLAGS",
    121     "CpuMMX|CpuSSE|CpuSSE2" },
    122   { "CPU_SSE3_FLAGS",
    123     "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3" },
    124   { "CPU_SSSE3_FLAGS",
    125     "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3" },
    126   { "CPU_SSE4_1_FLAGS",
    127     "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1" },
    128   { "CPU_SSE4_2_FLAGS",
    129     "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2" },
    130   { "CPU_ANY_SSE_FLAGS",
    131     "CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuSSE4a|CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512CD|CpuAVX512ER|CpuAVX512PF" },
    132   { "CPU_VMX_FLAGS",
    133     "CpuVMX" },
    134   { "CPU_SMX_FLAGS",
    135     "CpuSMX" },
    136   { "CPU_XSAVE_FLAGS",
    137     "CpuXsave" },
    138   { "CPU_XSAVEOPT_FLAGS",
    139     "CpuXsaveopt" },
    140   { "CPU_AES_FLAGS",
    141     "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAES" },
    142   { "CPU_PCLMUL_FLAGS",
    143     "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuPCLMUL" },
    144   { "CPU_FMA_FLAGS",
    145     "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuFMA" },
    146   { "CPU_FMA4_FLAGS",
    147     "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuFMA4" },
    148   { "CPU_XOP_FLAGS",
    149     "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuSSE4a|CpuABM|CpuAVX|CpuFMA4|CpuXOP" },
    150   { "CPU_LWP_FLAGS",
    151     "CpuLWP" },
    152   { "CPU_BMI_FLAGS",
    153     "CpuBMI" },
    154   { "CPU_TBM_FLAGS",
    155     "CpuTBM" },
    156   { "CPU_MOVBE_FLAGS",
    157     "CpuMovbe" },
    158   { "CPU_CX16_FLAGS",
    159     "CpuCX16" },
    160   { "CPU_RDTSCP_FLAGS",
    161     "CpuRdtscp" },
    162   { "CPU_EPT_FLAGS",
    163     "CpuEPT" },
    164   { "CPU_FSGSBASE_FLAGS",
    165     "CpuFSGSBase" },
    166   { "CPU_RDRND_FLAGS",
    167     "CpuRdRnd" },
    168   { "CPU_F16C_FLAGS",
    169     "CpuF16C" },
    170   { "CPU_BMI2_FLAGS",
    171     "CpuBMI2" },
    172   { "CPU_LZCNT_FLAGS",
    173     "CpuLZCNT" },
    174   { "CPU_HLE_FLAGS",
    175     "CpuHLE" },
    176   { "CPU_RTM_FLAGS",
    177     "CpuRTM" },
    178   { "CPU_INVPCID_FLAGS",
    179     "CpuINVPCID" },
    180   { "CPU_VMFUNC_FLAGS",
    181     "CpuVMFUNC" },
    182   { "CPU_3DNOW_FLAGS",
    183     "CpuMMX|Cpu3dnow" },
    184   { "CPU_3DNOWA_FLAGS",
    185     "CpuMMX|Cpu3dnow|Cpu3dnowA" },
    186   { "CPU_PADLOCK_FLAGS",
    187     "CpuPadLock" },
    188   { "CPU_SVME_FLAGS",
    189     "CpuSVME" },
    190   { "CPU_SSE4A_FLAGS",
    191     "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSE4a" },
    192   { "CPU_ABM_FLAGS",
    193     "CpuABM" },
    194   { "CPU_AVX_FLAGS",
    195     "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX" },
    196   { "CPU_AVX2_FLAGS",
    197     "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2" },
    198   { "CPU_AVX512F_FLAGS",
    199     "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2|CpuAVX512F" },
    200   { "CPU_AVX512CD_FLAGS",
    201     "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512CD" },
    202   { "CPU_AVX512ER_FLAGS",
    203     "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512ER" },
    204   { "CPU_AVX512PF_FLAGS",
    205     "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512PF" },
    206   { "CPU_ANY_AVX_FLAGS",
    207     "CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512CD|CpuAVX512ER|CpuAVX512PF" },
    208   { "CPU_L1OM_FLAGS",
    209     "unknown" },
    210   { "CPU_K1OM_FLAGS",
    211     "unknown" },
    212   { "CPU_ADX_FLAGS",
    213     "CpuADX" },
    214   { "CPU_RDSEED_FLAGS",
    215     "CpuRdSeed" },
    216   { "CPU_PRFCHW_FLAGS",
    217     "CpuPRFCHW" },
    218   { "CPU_SMAP_FLAGS",
    219     "CpuSMAP" },
    220   { "CPU_MPX_FLAGS",
    221     "CpuMPX" },
    222   { "CPU_SHA_FLAGS",
    223     "CpuSHA" },
    224   { "CPU_CLFLUSHOPT_FLAGS",
    225     "CpuClflushOpt" },
    226   { "CPU_XSAVES_FLAGS",
    227     "CpuXSAVES" },
    228   { "CPU_XSAVEC_FLAGS",
    229     "CpuXSAVEC" },
    230   { "CPU_PREFETCHWT1_FLAGS",
    231     "CpuPREFETCHWT1" },
    232   { "CPU_SE1_FLAGS",
    233     "CpuSE1" },
    234   { "CPU_AVX512DQ_FLAGS",
    235     "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512DQ" },
    236   { "CPU_AVX512BW_FLAGS",
    237     "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512BW" },
    238   { "CPU_AVX512VL_FLAGS",
    239     "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512VL" },
    240   { "CPU_CLWB_FLAGS",
    241     "CpuCLWB" },
    242   { "CPU_PCOMMIT_FLAGS",
    243     "CpuPCOMMIT" },
    244   { "CPU_AVX512IFMA_FLAGS",
    245     "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512IFMA" },
    246   { "CPU_AVX512VBMI_FLAGS",
    247     "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512VBMI" },
    248 };
    249 
    250 static initializer operand_type_init[] =
    251 {
    252   { "OPERAND_TYPE_NONE",
    253     "0" },
    254   { "OPERAND_TYPE_REG8",
    255     "Reg8" },
    256   { "OPERAND_TYPE_REG16",
    257     "Reg16" },
    258   { "OPERAND_TYPE_REG32",
    259     "Reg32" },
    260   { "OPERAND_TYPE_REG64",
    261     "Reg64" },
    262   { "OPERAND_TYPE_IMM1",
    263     "Imm1" },
    264   { "OPERAND_TYPE_IMM8",
    265     "Imm8" },
    266   { "OPERAND_TYPE_IMM8S",
    267     "Imm8S" },
    268   { "OPERAND_TYPE_IMM16",
    269     "Imm16" },
    270   { "OPERAND_TYPE_IMM32",
    271     "Imm32" },
    272   { "OPERAND_TYPE_IMM32S",
    273     "Imm32S" },
    274   { "OPERAND_TYPE_IMM64",
    275     "Imm64" },
    276   { "OPERAND_TYPE_BASEINDEX",
    277     "BaseIndex" },
    278   { "OPERAND_TYPE_DISP8",
    279     "Disp8" },
    280   { "OPERAND_TYPE_DISP16",
    281     "Disp16" },
    282   { "OPERAND_TYPE_DISP32",
    283     "Disp32" },
    284   { "OPERAND_TYPE_DISP32S",
    285     "Disp32S" },
    286   { "OPERAND_TYPE_DISP64",
    287     "Disp64" },
    288   { "OPERAND_TYPE_INOUTPORTREG",
    289     "InOutPortReg" },
    290   { "OPERAND_TYPE_SHIFTCOUNT",
    291     "ShiftCount" },
    292   { "OPERAND_TYPE_CONTROL",
    293     "Control" },
    294   { "OPERAND_TYPE_TEST",
    295     "Test" },
    296   { "OPERAND_TYPE_DEBUG",
    297     "FloatReg" },
    298   { "OPERAND_TYPE_FLOATREG",
    299     "FloatReg" },
    300   { "OPERAND_TYPE_FLOATACC",
    301     "FloatAcc" },
    302   { "OPERAND_TYPE_SREG2",
    303     "SReg2" },
    304   { "OPERAND_TYPE_SREG3",
    305     "SReg3" },
    306   { "OPERAND_TYPE_ACC",
    307     "Acc" },
    308   { "OPERAND_TYPE_JUMPABSOLUTE",
    309     "JumpAbsolute" },
    310   { "OPERAND_TYPE_REGMMX",
    311     "RegMMX" },
    312   { "OPERAND_TYPE_REGXMM",
    313     "RegXMM" },
    314   { "OPERAND_TYPE_REGYMM",
    315     "RegYMM" },
    316   { "OPERAND_TYPE_REGZMM",
    317     "RegZMM" },
    318   { "OPERAND_TYPE_REGMASK",
    319     "RegMask" },
    320   { "OPERAND_TYPE_ESSEG",
    321     "EsSeg" },
    322   { "OPERAND_TYPE_ACC32",
    323     "Reg32|Acc|Dword" },
    324   { "OPERAND_TYPE_ACC64",
    325     "Reg64|Acc|Qword" },
    326   { "OPERAND_TYPE_INOUTPORTREG",
    327     "InOutPortReg" },
    328   { "OPERAND_TYPE_REG16_INOUTPORTREG",
    329     "Reg16|InOutPortReg" },
    330   { "OPERAND_TYPE_DISP16_32",
    331     "Disp16|Disp32" },
    332   { "OPERAND_TYPE_ANYDISP",
    333     "Disp8|Disp16|Disp32|Disp32S|Disp64" },
    334   { "OPERAND_TYPE_IMM16_32",
    335     "Imm16|Imm32" },
    336   { "OPERAND_TYPE_IMM16_32S",
    337     "Imm16|Imm32S" },
    338   { "OPERAND_TYPE_IMM16_32_32S",
    339     "Imm16|Imm32|Imm32S" },
    340   { "OPERAND_TYPE_IMM32_64",
    341     "Imm32|Imm64" },
    342   { "OPERAND_TYPE_IMM32_32S_DISP32",
    343     "Imm32|Imm32S|Disp32" },
    344   { "OPERAND_TYPE_IMM64_DISP64",
    345     "Imm64|Disp64" },
    346   { "OPERAND_TYPE_IMM32_32S_64_DISP32",
    347     "Imm32|Imm32S|Imm64|Disp32" },
    348   { "OPERAND_TYPE_IMM32_32S_64_DISP32_64",
    349     "Imm32|Imm32S|Imm64|Disp32|Disp64" },
    350   { "OPERAND_TYPE_VEC_IMM4",
    351     "Vec_Imm4" },
    352   { "OPERAND_TYPE_REGBND",
    353     "RegBND" },
    354   { "OPERAND_TYPE_VEC_DISP8",
    355     "Vec_Disp8" },
    356 };
    357 
    358 typedef struct bitfield
    359 {
    360   int position;
    361   int value;
    362   const char *name;
    363 } bitfield;
    364 
    365 #define BITFIELD(n) { n, 0, #n }
    366 
    367 static bitfield cpu_flags[] =
    368 {
    369   BITFIELD (Cpu186),
    370   BITFIELD (Cpu286),
    371   BITFIELD (Cpu386),
    372   BITFIELD (Cpu486),
    373   BITFIELD (Cpu586),
    374   BITFIELD (Cpu686),
    375   BITFIELD (CpuClflush),
    376   BITFIELD (CpuNop),
    377   BITFIELD (CpuSYSCALL),
    378   BITFIELD (Cpu8087),
    379   BITFIELD (Cpu287),
    380   BITFIELD (Cpu387),
    381   BITFIELD (Cpu687),
    382   BITFIELD (CpuFISTTP),
    383   BITFIELD (CpuMMX),
    384   BITFIELD (CpuSSE),
    385   BITFIELD (CpuSSE2),
    386   BITFIELD (CpuSSE3),
    387   BITFIELD (CpuSSSE3),
    388   BITFIELD (CpuSSE4_1),
    389   BITFIELD (CpuSSE4_2),
    390   BITFIELD (CpuAVX),
    391   BITFIELD (CpuAVX2),
    392   BITFIELD (CpuAVX512F),
    393   BITFIELD (CpuAVX512CD),
    394   BITFIELD (CpuAVX512ER),
    395   BITFIELD (CpuAVX512PF),
    396   BITFIELD (CpuAVX512VL),
    397   BITFIELD (CpuAVX512DQ),
    398   BITFIELD (CpuAVX512BW),
    399   BITFIELD (CpuL1OM),
    400   BITFIELD (CpuK1OM),
    401   BITFIELD (CpuSSE4a),
    402   BITFIELD (Cpu3dnow),
    403   BITFIELD (Cpu3dnowA),
    404   BITFIELD (CpuPadLock),
    405   BITFIELD (CpuSVME),
    406   BITFIELD (CpuVMX),
    407   BITFIELD (CpuSMX),
    408   BITFIELD (CpuABM),
    409   BITFIELD (CpuXsave),
    410   BITFIELD (CpuXsaveopt),
    411   BITFIELD (CpuAES),
    412   BITFIELD (CpuPCLMUL),
    413   BITFIELD (CpuFMA),
    414   BITFIELD (CpuFMA4),
    415   BITFIELD (CpuXOP),
    416   BITFIELD (CpuLWP),
    417   BITFIELD (CpuBMI),
    418   BITFIELD (CpuTBM),
    419   BITFIELD (CpuLM),
    420   BITFIELD (CpuMovbe),
    421   BITFIELD (CpuCX16),
    422   BITFIELD (CpuEPT),
    423   BITFIELD (CpuRdtscp),
    424   BITFIELD (CpuFSGSBase),
    425   BITFIELD (CpuRdRnd),
    426   BITFIELD (CpuF16C),
    427   BITFIELD (CpuBMI2),
    428   BITFIELD (CpuLZCNT),
    429   BITFIELD (CpuHLE),
    430   BITFIELD (CpuRTM),
    431   BITFIELD (CpuINVPCID),
    432   BITFIELD (CpuVMFUNC),
    433   BITFIELD (CpuRDSEED),
    434   BITFIELD (CpuADX),
    435   BITFIELD (CpuPRFCHW),
    436   BITFIELD (CpuSMAP),
    437   BITFIELD (CpuSHA),
    438   BITFIELD (CpuVREX),
    439   BITFIELD (CpuClflushOpt),
    440   BITFIELD (CpuXSAVES),
    441   BITFIELD (CpuXSAVEC),
    442   BITFIELD (CpuPREFETCHWT1),
    443   BITFIELD (CpuSE1),
    444   BITFIELD (CpuCLWB),
    445   BITFIELD (CpuPCOMMIT),
    446   BITFIELD (Cpu64),
    447   BITFIELD (CpuNo64),
    448   BITFIELD (CpuMPX),
    449   BITFIELD (CpuAVX512IFMA),
    450   BITFIELD (CpuAVX512VBMI),
    451 #ifdef CpuUnused
    452   BITFIELD (CpuUnused),
    453 #endif
    454 };
    455 
    456 static bitfield opcode_modifiers[] =
    457 {
    458   BITFIELD (D),
    459   BITFIELD (W),
    460   BITFIELD (S),
    461   BITFIELD (Modrm),
    462   BITFIELD (ShortForm),
    463   BITFIELD (Jump),
    464   BITFIELD (JumpDword),
    465   BITFIELD (JumpByte),
    466   BITFIELD (JumpInterSegment),
    467   BITFIELD (FloatMF),
    468   BITFIELD (FloatR),
    469   BITFIELD (FloatD),
    470   BITFIELD (Size16),
    471   BITFIELD (Size32),
    472   BITFIELD (Size64),
    473   BITFIELD (CheckRegSize),
    474   BITFIELD (IgnoreSize),
    475   BITFIELD (DefaultSize),
    476   BITFIELD (No_bSuf),
    477   BITFIELD (No_wSuf),
    478   BITFIELD (No_lSuf),
    479   BITFIELD (No_sSuf),
    480   BITFIELD (No_qSuf),
    481   BITFIELD (No_ldSuf),
    482   BITFIELD (FWait),
    483   BITFIELD (IsString),
    484   BITFIELD (BNDPrefixOk),
    485   BITFIELD (IsLockable),
    486   BITFIELD (RegKludge),
    487   BITFIELD (FirstXmm0),
    488   BITFIELD (Implicit1stXmm0),
    489   BITFIELD (RepPrefixOk),
    490   BITFIELD (HLEPrefixOk),
    491   BITFIELD (ToDword),
    492   BITFIELD (ToQword),
    493   BITFIELD (AddrPrefixOp0),
    494   BITFIELD (IsPrefix),
    495   BITFIELD (ImmExt),
    496   BITFIELD (NoRex64),
    497   BITFIELD (Rex64),
    498   BITFIELD (Ugh),
    499   BITFIELD (Vex),
    500   BITFIELD (VexVVVV),
    501   BITFIELD (VexW),
    502   BITFIELD (VexOpcode),
    503   BITFIELD (VexSources),
    504   BITFIELD (VexImmExt),
    505   BITFIELD (VecSIB),
    506   BITFIELD (SSE2AVX),
    507   BITFIELD (NoAVX),
    508   BITFIELD (EVex),
    509   BITFIELD (Masking),
    510   BITFIELD (VecESize),
    511   BITFIELD (Broadcast),
    512   BITFIELD (StaticRounding),
    513   BITFIELD (SAE),
    514   BITFIELD (Disp8MemShift),
    515   BITFIELD (NoDefMask),
    516   BITFIELD (OldGcc),
    517   BITFIELD (ATTMnemonic),
    518   BITFIELD (ATTSyntax),
    519   BITFIELD (IntelSyntax),
    520 };
    521 
    522 static bitfield operand_types[] =
    523 {
    524   BITFIELD (Reg8),
    525   BITFIELD (Reg16),
    526   BITFIELD (Reg32),
    527   BITFIELD (Reg64),
    528   BITFIELD (FloatReg),
    529   BITFIELD (RegMMX),
    530   BITFIELD (RegXMM),
    531   BITFIELD (RegYMM),
    532   BITFIELD (RegZMM),
    533   BITFIELD (RegMask),
    534   BITFIELD (Imm1),
    535   BITFIELD (Imm8),
    536   BITFIELD (Imm8S),
    537   BITFIELD (Imm16),
    538   BITFIELD (Imm32),
    539   BITFIELD (Imm32S),
    540   BITFIELD (Imm64),
    541   BITFIELD (BaseIndex),
    542   BITFIELD (Disp8),
    543   BITFIELD (Disp16),
    544   BITFIELD (Disp32),
    545   BITFIELD (Disp32S),
    546   BITFIELD (Disp64),
    547   BITFIELD (InOutPortReg),
    548   BITFIELD (ShiftCount),
    549   BITFIELD (Control),
    550   BITFIELD (Debug),
    551   BITFIELD (Test),
    552   BITFIELD (SReg2),
    553   BITFIELD (SReg3),
    554   BITFIELD (Acc),
    555   BITFIELD (FloatAcc),
    556   BITFIELD (JumpAbsolute),
    557   BITFIELD (EsSeg),
    558   BITFIELD (RegMem),
    559   BITFIELD (Mem),
    560   BITFIELD (Byte),
    561   BITFIELD (Word),
    562   BITFIELD (Dword),
    563   BITFIELD (Fword),
    564   BITFIELD (Qword),
    565   BITFIELD (Tbyte),
    566   BITFIELD (Xmmword),
    567   BITFIELD (Ymmword),
    568   BITFIELD (Zmmword),
    569   BITFIELD (Unspecified),
    570   BITFIELD (Anysize),
    571   BITFIELD (Vec_Imm4),
    572   BITFIELD (RegBND),
    573   BITFIELD (Vec_Disp8),
    574 #ifdef OTUnused
    575   BITFIELD (OTUnused),
    576 #endif
    577 };
    578 
    579 static const char *filename;
    580 
    581 static int
    582 compare (const void *x, const void *y)
    583 {
    584   const bitfield *xp = (const bitfield *) x;
    585   const bitfield *yp = (const bitfield *) y;
    586   return xp->position - yp->position;
    587 }
    588 
    589 static void
    590 fail (const char *message, ...)
    591 {
    592   va_list args;
    593 
    594   va_start (args, message);
    595   fprintf (stderr, _("%s: Error: "), program_name);
    596   vfprintf (stderr, message, args);
    597   va_end (args);
    598   xexit (1);
    599 }
    600 
    601 static void
    602 process_copyright (FILE *fp)
    603 {
    604   fprintf (fp, "/* This file is automatically generated by i386-gen.  Do not edit!  */\n\
    605 /* Copyright (C) 2007-2014 Free Software Foundation, Inc.\n\
    606 \n\
    607    This file is part of the GNU opcodes library.\n\
    608 \n\
    609    This library is free software; you can redistribute it and/or modify\n\
    610    it under the terms of the GNU General Public License as published by\n\
    611    the Free Software Foundation; either version 3, or (at your option)\n\
    612    any later version.\n\
    613 \n\
    614    It is distributed in the hope that it will be useful, but WITHOUT\n\
    615    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n\
    616    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public\n\
    617    License for more details.\n\
    618 \n\
    619    You should have received a copy of the GNU General Public License\n\
    620    along with this program; if not, write to the Free Software\n\
    621    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,\n\
    622    MA 02110-1301, USA.  */\n");
    623 }
    624 
    625 /* Remove leading white spaces.  */
    626 
    627 static char *
    628 remove_leading_whitespaces (char *str)
    629 {
    630   while (ISSPACE (*str))
    631     str++;
    632   return str;
    633 }
    634 
    635 /* Remove trailing white spaces.  */
    636 
    637 static void
    638 remove_trailing_whitespaces (char *str)
    639 {
    640   size_t last = strlen (str);
    641 
    642   if (last == 0)
    643     return;
    644 
    645   do
    646     {
    647       last--;
    648       if (ISSPACE (str [last]))
    649 	str[last] = '\0';
    650       else
    651 	break;
    652     }
    653   while (last != 0);
    654 }
    655 
    656 /* Find next field separated by SEP and terminate it. Return a
    657    pointer to the one after it.  */
    658 
    659 static char *
    660 next_field (char *str, char sep, char **next, char *last)
    661 {
    662   char *p;
    663 
    664   p = remove_leading_whitespaces (str);
    665   for (str = p; *str != sep && *str != '\0'; str++);
    666 
    667   *str = '\0';
    668   remove_trailing_whitespaces (p);
    669 
    670   *next = str + 1;
    671 
    672   if (p >= last)
    673     abort ();
    674 
    675   return p;
    676 }
    677 
    678 static void
    679 set_bitfield (const char *f, bitfield *array, int value,
    680 	      unsigned int size, int lineno)
    681 {
    682   unsigned int i;
    683 
    684   if (strcmp (f, "CpuFP") == 0)
    685     {
    686       set_bitfield("Cpu387", array, value, size, lineno);
    687       set_bitfield("Cpu287", array, value, size, lineno);
    688       f = "Cpu8087";
    689     }
    690   else if (strcmp (f, "Mmword") == 0)
    691     f= "Qword";
    692   else if (strcmp (f, "Oword") == 0)
    693     f= "Xmmword";
    694 
    695   for (i = 0; i < size; i++)
    696     if (strcasecmp (array[i].name, f) == 0)
    697       {
    698 	array[i].value = value;
    699 	return;
    700       }
    701 
    702   if (value)
    703     {
    704       const char *v = strchr (f, '=');
    705 
    706       if (v)
    707 	{
    708 	  size_t n = v - f;
    709 	  char *end;
    710 
    711 	  for (i = 0; i < size; i++)
    712 	    if (strncasecmp (array[i].name, f, n) == 0)
    713 	      {
    714 		value = strtol (v + 1, &end, 0);
    715 		if (*end == '\0')
    716 		  {
    717 		    array[i].value = value;
    718 		    return;
    719 		  }
    720 		break;
    721 	      }
    722 	}
    723     }
    724 
    725   if (lineno != -1)
    726     fail (_("%s: %d: Unknown bitfield: %s\n"), filename, lineno, f);
    727   else
    728     fail (_("Unknown bitfield: %s\n"), f);
    729 }
    730 
    731 static void
    732 output_cpu_flags (FILE *table, bitfield *flags, unsigned int size,
    733 		  int macro, const char *comma, const char *indent)
    734 {
    735   unsigned int i;
    736 
    737   fprintf (table, "%s{ { ", indent);
    738 
    739   for (i = 0; i < size - 1; i++)
    740     {
    741       if (((i + 1) % 20) != 0)
    742 	fprintf (table, "%d, ", flags[i].value);
    743       else
    744 	fprintf (table, "%d,", flags[i].value);
    745       if (((i + 1) % 20) == 0)
    746 	{
    747 	  /* We need \\ for macro.  */
    748 	  if (macro)
    749 	    fprintf (table, " \\\n    %s", indent);
    750 	  else
    751 	    fprintf (table, "\n    %s", indent);
    752 	}
    753     }
    754 
    755   fprintf (table, "%d } }%s\n", flags[i].value, comma);
    756 }
    757 
    758 static void
    759 process_i386_cpu_flag (FILE *table, char *flag, int macro,
    760 		       const char *comma, const char *indent,
    761 		       int lineno)
    762 {
    763   char *str, *next, *last;
    764   unsigned int i;
    765   bitfield flags [ARRAY_SIZE (cpu_flags)];
    766 
    767   /* Copy the default cpu flags.  */
    768   memcpy (flags, cpu_flags, sizeof (cpu_flags));
    769 
    770   if (strcasecmp (flag, "unknown") == 0)
    771     {
    772       /* We turn on everything except for cpu64 in case of
    773 	 CPU_UNKNOWN_FLAGS.  */
    774       for (i = 0; i < ARRAY_SIZE (flags); i++)
    775 	if (flags[i].position != Cpu64)
    776 	  flags[i].value = 1;
    777     }
    778   else if (flag[0] == '~')
    779     {
    780       last = flag + strlen (flag);
    781 
    782       if (flag[1] == '(')
    783 	{
    784 	  last -= 1;
    785 	  next = flag + 2;
    786 	  if (*last != ')')
    787 	    fail (_("%s: %d: Missing `)' in bitfield: %s\n"), filename,
    788 		  lineno, flag);
    789 	  *last = '\0';
    790 	}
    791       else
    792 	next = flag + 1;
    793 
    794       /* First we turn on everything except for cpu64.  */
    795       for (i = 0; i < ARRAY_SIZE (flags); i++)
    796 	if (flags[i].position != Cpu64)
    797 	  flags[i].value = 1;
    798 
    799       /* Turn off selective bits.  */
    800       for (; next && next < last; )
    801 	{
    802 	  str = next_field (next, '|', &next, last);
    803 	  if (str)
    804 	    set_bitfield (str, flags, 0, ARRAY_SIZE (flags), lineno);
    805 	}
    806     }
    807   else if (strcmp (flag, "0"))
    808     {
    809       /* Turn on selective bits.  */
    810       last = flag + strlen (flag);
    811       for (next = flag; next && next < last; )
    812 	{
    813 	  str = next_field (next, '|', &next, last);
    814 	  if (str)
    815 	    set_bitfield (str, flags, 1, ARRAY_SIZE (flags), lineno);
    816 	}
    817     }
    818 
    819   output_cpu_flags (table, flags, ARRAY_SIZE (flags), macro,
    820 		    comma, indent);
    821 }
    822 
    823 static void
    824 output_opcode_modifier (FILE *table, bitfield *modifier, unsigned int size)
    825 {
    826   unsigned int i;
    827 
    828   fprintf (table, "    { ");
    829 
    830   for (i = 0; i < size - 1; i++)
    831     {
    832       if (((i + 1) % 20) != 0)
    833         fprintf (table, "%d, ", modifier[i].value);
    834       else
    835         fprintf (table, "%d,", modifier[i].value);
    836       if (((i + 1) % 20) == 0)
    837 	fprintf (table, "\n      ");
    838     }
    839 
    840   fprintf (table, "%d },\n", modifier[i].value);
    841 }
    842 
    843 static void
    844 process_i386_opcode_modifier (FILE *table, char *mod, int lineno)
    845 {
    846   char *str, *next, *last;
    847   bitfield modifiers [ARRAY_SIZE (opcode_modifiers)];
    848 
    849   /* Copy the default opcode modifier.  */
    850   memcpy (modifiers, opcode_modifiers, sizeof (modifiers));
    851 
    852   if (strcmp (mod, "0"))
    853     {
    854       last = mod + strlen (mod);
    855       for (next = mod; next && next < last; )
    856 	{
    857 	  str = next_field (next, '|', &next, last);
    858 	  if (str)
    859 	    set_bitfield (str, modifiers, 1, ARRAY_SIZE (modifiers),
    860 			  lineno);
    861 	}
    862     }
    863   output_opcode_modifier (table, modifiers, ARRAY_SIZE (modifiers));
    864 }
    865 
    866 static void
    867 output_operand_type (FILE *table, bitfield *types, unsigned int size,
    868 		     int macro, const char *indent)
    869 {
    870   unsigned int i;
    871 
    872   fprintf (table, "{ { ");
    873 
    874   for (i = 0; i < size - 1; i++)
    875     {
    876       if (((i + 1) % 20) != 0)
    877 	fprintf (table, "%d, ", types[i].value);
    878       else
    879 	fprintf (table, "%d,", types[i].value);
    880       if (((i + 1) % 20) == 0)
    881 	{
    882 	  /* We need \\ for macro.  */
    883 	  if (macro)
    884 	    fprintf (table, " \\\n%s", indent);
    885 	  else
    886 	    fprintf (table, "\n%s", indent);
    887 	}
    888     }
    889 
    890   fprintf (table, "%d } }", types[i].value);
    891 }
    892 
    893 static void
    894 process_i386_operand_type (FILE *table, char *op, int macro,
    895 			   const char *indent, int lineno)
    896 {
    897   char *str, *next, *last;
    898   bitfield types [ARRAY_SIZE (operand_types)];
    899 
    900   /* Copy the default operand type.  */
    901   memcpy (types, operand_types, sizeof (types));
    902 
    903   if (strcmp (op, "0"))
    904     {
    905       last = op + strlen (op);
    906       for (next = op; next && next < last; )
    907 	{
    908 	  str = next_field (next, '|', &next, last);
    909 	  if (str)
    910 	    set_bitfield (str, types, 1, ARRAY_SIZE (types), lineno);
    911 	}
    912     }
    913   output_operand_type (table, types, ARRAY_SIZE (types), macro,
    914 		       indent);
    915 }
    916 
    917 static void
    918 output_i386_opcode (FILE *table, const char *name, char *str,
    919 		    char *last, int lineno)
    920 {
    921   unsigned int i;
    922   char *operands, *base_opcode, *extension_opcode, *opcode_length;
    923   char *cpu_flags, *opcode_modifier, *operand_types [MAX_OPERANDS];
    924 
    925   /* Find number of operands.  */
    926   operands = next_field (str, ',', &str, last);
    927 
    928   /* Find base_opcode.  */
    929   base_opcode = next_field (str, ',', &str, last);
    930 
    931   /* Find extension_opcode.  */
    932   extension_opcode = next_field (str, ',', &str, last);
    933 
    934   /* Find opcode_length.  */
    935   opcode_length = next_field (str, ',', &str, last);
    936 
    937   /* Find cpu_flags.  */
    938   cpu_flags = next_field (str, ',', &str, last);
    939 
    940   /* Find opcode_modifier.  */
    941   opcode_modifier = next_field (str, ',', &str, last);
    942 
    943   /* Remove the first {.  */
    944   str = remove_leading_whitespaces (str);
    945   if (*str != '{')
    946     abort ();
    947   str = remove_leading_whitespaces (str + 1);
    948 
    949   i = strlen (str);
    950 
    951   /* There are at least "X}".  */
    952   if (i < 2)
    953     abort ();
    954 
    955   /* Remove trailing white spaces and }. */
    956   do
    957     {
    958       i--;
    959       if (ISSPACE (str[i]) || str[i] == '}')
    960 	str[i] = '\0';
    961       else
    962 	break;
    963     }
    964   while (i != 0);
    965 
    966   last = str + i;
    967 
    968   /* Find operand_types.  */
    969   for (i = 0; i < ARRAY_SIZE (operand_types); i++)
    970     {
    971       if (str >= last)
    972 	{
    973 	  operand_types [i] = NULL;
    974 	  break;
    975 	}
    976 
    977       operand_types [i] = next_field (str, ',', &str, last);
    978       if (*operand_types[i] == '0')
    979 	{
    980 	  if (i != 0)
    981 	    operand_types[i] = NULL;
    982 	  break;
    983 	}
    984     }
    985 
    986   fprintf (table, "  { \"%s\", %s, %s, %s, %s,\n",
    987 	   name, operands, base_opcode, extension_opcode,
    988 	   opcode_length);
    989 
    990   process_i386_cpu_flag (table, cpu_flags, 0, ",", "    ", lineno);
    991 
    992   process_i386_opcode_modifier (table, opcode_modifier, lineno);
    993 
    994   fprintf (table, "    { ");
    995 
    996   for (i = 0; i < ARRAY_SIZE (operand_types); i++)
    997     {
    998       if (operand_types[i] == NULL || *operand_types[i] == '0')
    999 	{
   1000 	  if (i == 0)
   1001 	    process_i386_operand_type (table, "0", 0, "\t  ", lineno);
   1002 	  break;
   1003 	}
   1004 
   1005       if (i != 0)
   1006 	fprintf (table, ",\n      ");
   1007 
   1008       process_i386_operand_type (table, operand_types[i], 0,
   1009 				 "\t  ", lineno);
   1010     }
   1011   fprintf (table, " } },\n");
   1012 }
   1013 
   1014 struct opcode_hash_entry
   1015 {
   1016   struct opcode_hash_entry *next;
   1017   char *name;
   1018   char *opcode;
   1019   int lineno;
   1020 };
   1021 
   1022 /* Calculate the hash value of an opcode hash entry P.  */
   1023 
   1024 static hashval_t
   1025 opcode_hash_hash (const void *p)
   1026 {
   1027   struct opcode_hash_entry *entry = (struct opcode_hash_entry *) p;
   1028   return htab_hash_string (entry->name);
   1029 }
   1030 
   1031 /* Compare a string Q against an opcode hash entry P.  */
   1032 
   1033 static int
   1034 opcode_hash_eq (const void *p, const void *q)
   1035 {
   1036   struct opcode_hash_entry *entry = (struct opcode_hash_entry *) p;
   1037   const char *name = (const char *) q;
   1038   return strcmp (name, entry->name) == 0;
   1039 }
   1040 
   1041 static void
   1042 process_i386_opcodes (FILE *table)
   1043 {
   1044   FILE *fp;
   1045   char buf[2048];
   1046   unsigned int i, j;
   1047   char *str, *p, *last, *name;
   1048   struct opcode_hash_entry **hash_slot, **entry, *next;
   1049   htab_t opcode_hash_table;
   1050   struct opcode_hash_entry **opcode_array;
   1051   unsigned int opcode_array_size = 1024;
   1052   int lineno = 0;
   1053 
   1054   filename = "i386-opc.tbl";
   1055   fp = fopen (filename, "r");
   1056 
   1057   if (fp == NULL)
   1058     fail (_("can't find i386-opc.tbl for reading, errno = %s\n"),
   1059 	  xstrerror (errno));
   1060 
   1061   i = 0;
   1062   opcode_array = (struct opcode_hash_entry **)
   1063     xmalloc (sizeof (*opcode_array) * opcode_array_size);
   1064 
   1065   opcode_hash_table = htab_create_alloc (16, opcode_hash_hash,
   1066 					 opcode_hash_eq, NULL,
   1067 					 xcalloc, free);
   1068 
   1069   fprintf (table, "\n/* i386 opcode table.  */\n\n");
   1070   fprintf (table, "const insn_template i386_optab[] =\n{\n");
   1071 
   1072   /* Put everything on opcode array.  */
   1073   while (!feof (fp))
   1074     {
   1075       if (fgets (buf, sizeof (buf), fp) == NULL)
   1076 	break;
   1077 
   1078       lineno++;
   1079 
   1080       p = remove_leading_whitespaces (buf);
   1081 
   1082       /* Skip comments.  */
   1083       str = strstr (p, "//");
   1084       if (str != NULL)
   1085 	str[0] = '\0';
   1086 
   1087       /* Remove trailing white spaces.  */
   1088       remove_trailing_whitespaces (p);
   1089 
   1090       switch (p[0])
   1091 	{
   1092 	case '#':
   1093 	  /* Ignore comments.  */
   1094 	case '\0':
   1095 	  continue;
   1096 	  break;
   1097 	default:
   1098 	  break;
   1099 	}
   1100 
   1101       last = p + strlen (p);
   1102 
   1103       /* Find name.  */
   1104       name = next_field (p, ',', &str, last);
   1105 
   1106       /* Get the slot in hash table.  */
   1107       hash_slot = (struct opcode_hash_entry **)
   1108 	htab_find_slot_with_hash (opcode_hash_table, name,
   1109 				  htab_hash_string (name),
   1110 				  INSERT);
   1111 
   1112       if (*hash_slot == NULL)
   1113 	{
   1114 	  /* It is the new one.  Put it on opcode array.  */
   1115 	  if (i >= opcode_array_size)
   1116 	    {
   1117 	      /* Grow the opcode array when needed.  */
   1118 	      opcode_array_size += 1024;
   1119 	      opcode_array = (struct opcode_hash_entry **)
   1120 		xrealloc (opcode_array,
   1121 			  sizeof (*opcode_array) * opcode_array_size);
   1122 	    }
   1123 
   1124 	  opcode_array[i] = (struct opcode_hash_entry *)
   1125 	    xmalloc (sizeof (struct opcode_hash_entry));
   1126 	  opcode_array[i]->next = NULL;
   1127 	  opcode_array[i]->name = xstrdup (name);
   1128 	  opcode_array[i]->opcode = xstrdup (str);
   1129 	  opcode_array[i]->lineno = lineno;
   1130 	  *hash_slot = opcode_array[i];
   1131 	  i++;
   1132 	}
   1133       else
   1134 	{
   1135 	  /* Append it to the existing one.  */
   1136 	  entry = hash_slot;
   1137 	  while ((*entry) != NULL)
   1138 	    entry = &(*entry)->next;
   1139 	  *entry = (struct opcode_hash_entry *)
   1140 	    xmalloc (sizeof (struct opcode_hash_entry));
   1141 	  (*entry)->next = NULL;
   1142 	  (*entry)->name = (*hash_slot)->name;
   1143 	  (*entry)->opcode = xstrdup (str);
   1144 	  (*entry)->lineno = lineno;
   1145 	}
   1146     }
   1147 
   1148   /* Process opcode array.  */
   1149   for (j = 0; j < i; j++)
   1150     {
   1151       for (next = opcode_array[j]; next; next = next->next)
   1152 	{
   1153 	  name = next->name;
   1154 	  str = next->opcode;
   1155 	  lineno = next->lineno;
   1156 	  last = str + strlen (str);
   1157 	  output_i386_opcode (table, name, str, last, lineno);
   1158 	}
   1159     }
   1160 
   1161   fclose (fp);
   1162 
   1163   fprintf (table, "  { NULL, 0, 0, 0, 0,\n");
   1164 
   1165   process_i386_cpu_flag (table, "0", 0, ",", "    ", -1);
   1166 
   1167   process_i386_opcode_modifier (table, "0", -1);
   1168 
   1169   fprintf (table, "    { ");
   1170   process_i386_operand_type (table, "0", 0, "\t  ", -1);
   1171   fprintf (table, " } }\n");
   1172 
   1173   fprintf (table, "};\n");
   1174 }
   1175 
   1176 static void
   1177 process_i386_registers (FILE *table)
   1178 {
   1179   FILE *fp;
   1180   char buf[2048];
   1181   char *str, *p, *last;
   1182   char *reg_name, *reg_type, *reg_flags, *reg_num;
   1183   char *dw2_32_num, *dw2_64_num;
   1184   int lineno = 0;
   1185 
   1186   filename = "i386-reg.tbl";
   1187   fp = fopen (filename, "r");
   1188   if (fp == NULL)
   1189     fail (_("can't find i386-reg.tbl for reading, errno = %s\n"),
   1190 	  xstrerror (errno));
   1191 
   1192   fprintf (table, "\n/* i386 register table.  */\n\n");
   1193   fprintf (table, "const reg_entry i386_regtab[] =\n{\n");
   1194 
   1195   while (!feof (fp))
   1196     {
   1197       if (fgets (buf, sizeof (buf), fp) == NULL)
   1198 	break;
   1199 
   1200       lineno++;
   1201 
   1202       p = remove_leading_whitespaces (buf);
   1203 
   1204       /* Skip comments.  */
   1205       str = strstr (p, "//");
   1206       if (str != NULL)
   1207 	str[0] = '\0';
   1208 
   1209       /* Remove trailing white spaces.  */
   1210       remove_trailing_whitespaces (p);
   1211 
   1212       switch (p[0])
   1213 	{
   1214 	case '#':
   1215 	  fprintf (table, "%s\n", p);
   1216 	case '\0':
   1217 	  continue;
   1218 	  break;
   1219 	default:
   1220 	  break;
   1221 	}
   1222 
   1223       last = p + strlen (p);
   1224 
   1225       /* Find reg_name.  */
   1226       reg_name = next_field (p, ',', &str, last);
   1227 
   1228       /* Find reg_type.  */
   1229       reg_type = next_field (str, ',', &str, last);
   1230 
   1231       /* Find reg_flags.  */
   1232       reg_flags = next_field (str, ',', &str, last);
   1233 
   1234       /* Find reg_num.  */
   1235       reg_num = next_field (str, ',', &str, last);
   1236 
   1237       fprintf (table, "  { \"%s\",\n    ", reg_name);
   1238 
   1239       process_i386_operand_type (table, reg_type, 0, "\t", lineno);
   1240 
   1241       /* Find 32-bit Dwarf2 register number.  */
   1242       dw2_32_num = next_field (str, ',', &str, last);
   1243 
   1244       /* Find 64-bit Dwarf2 register number.  */
   1245       dw2_64_num = next_field (str, ',', &str, last);
   1246 
   1247       fprintf (table, ",\n    %s, %s, { %s, %s } },\n",
   1248 	       reg_flags, reg_num, dw2_32_num, dw2_64_num);
   1249     }
   1250 
   1251   fclose (fp);
   1252 
   1253   fprintf (table, "};\n");
   1254 
   1255   fprintf (table, "\nconst unsigned int i386_regtab_size = ARRAY_SIZE (i386_regtab);\n");
   1256 }
   1257 
   1258 static void
   1259 process_i386_initializers (void)
   1260 {
   1261   unsigned int i;
   1262   FILE *fp = fopen ("i386-init.h", "w");
   1263   char *init;
   1264 
   1265   if (fp == NULL)
   1266     fail (_("can't create i386-init.h, errno = %s\n"),
   1267 	  xstrerror (errno));
   1268 
   1269   process_copyright (fp);
   1270 
   1271   for (i = 0; i < ARRAY_SIZE (cpu_flag_init); i++)
   1272     {
   1273       fprintf (fp, "\n#define %s \\\n", cpu_flag_init[i].name);
   1274       init = xstrdup (cpu_flag_init[i].init);
   1275       process_i386_cpu_flag (fp, init, 1, "", "  ", -1);
   1276       free (init);
   1277     }
   1278 
   1279   for (i = 0; i < ARRAY_SIZE (operand_type_init); i++)
   1280     {
   1281       fprintf (fp, "\n\n#define %s \\\n  ", operand_type_init[i].name);
   1282       init = xstrdup (operand_type_init[i].init);
   1283       process_i386_operand_type (fp, init, 1, "      ", -1);
   1284       free (init);
   1285     }
   1286   fprintf (fp, "\n");
   1287 
   1288   fclose (fp);
   1289 }
   1290 
   1291 /* Program options.  */
   1292 #define OPTION_SRCDIR	200
   1293 
   1294 struct option long_options[] =
   1295 {
   1296   {"srcdir",  required_argument, NULL, OPTION_SRCDIR},
   1297   {"debug",   no_argument,       NULL, 'd'},
   1298   {"version", no_argument,       NULL, 'V'},
   1299   {"help",    no_argument,       NULL, 'h'},
   1300   {0,         no_argument,       NULL, 0}
   1301 };
   1302 
   1303 static void
   1304 print_version (void)
   1305 {
   1306   printf ("%s: version 1.0\n", program_name);
   1307   xexit (0);
   1308 }
   1309 
   1310 static void
   1311 usage (FILE * stream, int status)
   1312 {
   1313   fprintf (stream, "Usage: %s [-V | --version] [-d | --debug] [--srcdir=dirname] [--help]\n",
   1314 	   program_name);
   1315   xexit (status);
   1316 }
   1317 
   1318 int
   1319 main (int argc, char **argv)
   1320 {
   1321   extern int chdir (char *);
   1322   char *srcdir = NULL;
   1323   int c;
   1324   FILE *table;
   1325 
   1326   program_name = *argv;
   1327   xmalloc_set_program_name (program_name);
   1328 
   1329   while ((c = getopt_long (argc, argv, "vVdh", long_options, 0)) != EOF)
   1330     switch (c)
   1331       {
   1332       case OPTION_SRCDIR:
   1333 	srcdir = optarg;
   1334 	break;
   1335       case 'V':
   1336       case 'v':
   1337 	print_version ();
   1338 	break;
   1339       case 'd':
   1340 	debug = 1;
   1341 	break;
   1342       case 'h':
   1343       case '?':
   1344 	usage (stderr, 0);
   1345       default:
   1346       case 0:
   1347 	break;
   1348       }
   1349 
   1350   if (optind != argc)
   1351     usage (stdout, 1);
   1352 
   1353   if (srcdir != NULL)
   1354     if (chdir (srcdir) != 0)
   1355       fail (_("unable to change directory to \"%s\", errno = %s\n"),
   1356 	    srcdir, xstrerror (errno));
   1357 
   1358   /* Check the unused bitfield in i386_cpu_flags.  */
   1359 #ifndef CpuUnused
   1360   c = CpuNumOfBits - CpuMax - 1;
   1361   if (c)
   1362     fail (_("%d unused bits in i386_cpu_flags.\n"), c);
   1363 #endif
   1364 
   1365   /* Check the unused bitfield in i386_operand_type.  */
   1366 #ifndef OTUnused
   1367   c = OTNumOfBits - OTMax - 1;
   1368   if (c)
   1369     fail (_("%d unused bits in i386_operand_type.\n"), c);
   1370 #endif
   1371 
   1372   qsort (cpu_flags, ARRAY_SIZE (cpu_flags), sizeof (cpu_flags [0]),
   1373 	 compare);
   1374 
   1375   qsort (opcode_modifiers, ARRAY_SIZE (opcode_modifiers),
   1376 	 sizeof (opcode_modifiers [0]), compare);
   1377 
   1378   qsort (operand_types, ARRAY_SIZE (operand_types),
   1379 	 sizeof (operand_types [0]), compare);
   1380 
   1381   table = fopen ("i386-tbl.h", "w");
   1382   if (table == NULL)
   1383     fail (_("can't create i386-tbl.h, errno = %s\n"),
   1384 	  xstrerror (errno));
   1385 
   1386   process_copyright (table);
   1387 
   1388   process_i386_opcodes (table);
   1389   process_i386_registers (table);
   1390   process_i386_initializers ();
   1391 
   1392   fclose (table);
   1393 
   1394   exit (0);
   1395 }
   1396