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