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