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