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