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