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