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