* dwarf2read.c (read_subroutine_type): Add the subroutine type to the
[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),
8cd7925b 367 BITFIELD (VexSources),
c0f3af97
L
368 BITFIELD (VexImmExt),
369 BITFIELD (SSE2AVX),
81f8a913 370 BITFIELD (NoAVX),
1efbbeb4
L
371 BITFIELD (OldGcc),
372 BITFIELD (ATTMnemonic),
e1d4d893 373 BITFIELD (ATTSyntax),
5c07affc 374 BITFIELD (IntelSyntax),
40fb9820
L
375};
376
377static bitfield operand_types[] =
378{
379 BITFIELD (Reg8),
380 BITFIELD (Reg16),
381 BITFIELD (Reg32),
382 BITFIELD (Reg64),
383 BITFIELD (FloatReg),
384 BITFIELD (RegMMX),
385 BITFIELD (RegXMM),
c0f3af97 386 BITFIELD (RegYMM),
40fb9820
L
387 BITFIELD (Imm8),
388 BITFIELD (Imm8S),
389 BITFIELD (Imm16),
390 BITFIELD (Imm32),
391 BITFIELD (Imm32S),
392 BITFIELD (Imm64),
393 BITFIELD (Imm1),
394 BITFIELD (BaseIndex),
395 BITFIELD (Disp8),
396 BITFIELD (Disp16),
397 BITFIELD (Disp32),
398 BITFIELD (Disp32S),
399 BITFIELD (Disp64),
400 BITFIELD (InOutPortReg),
401 BITFIELD (ShiftCount),
402 BITFIELD (Control),
403 BITFIELD (Debug),
404 BITFIELD (Test),
405 BITFIELD (SReg2),
406 BITFIELD (SReg3),
407 BITFIELD (Acc),
408 BITFIELD (FloatAcc),
409 BITFIELD (JumpAbsolute),
410 BITFIELD (EsSeg),
411 BITFIELD (RegMem),
5c07affc 412 BITFIELD (Mem),
7d5e4556
L
413 BITFIELD (Byte),
414 BITFIELD (Word),
415 BITFIELD (Dword),
416 BITFIELD (Fword),
417 BITFIELD (Qword),
418 BITFIELD (Tbyte),
419 BITFIELD (Xmmword),
c0f3af97 420 BITFIELD (Ymmword),
7d5e4556
L
421 BITFIELD (Unspecified),
422 BITFIELD (Anysize),
40fb9820
L
423#ifdef OTUnused
424 BITFIELD (OTUnused),
425#endif
426};
427
3d4d5afa
L
428static const char *filename;
429
40fb9820
L
430static int
431compare (const void *x, const void *y)
432{
433 const bitfield *xp = (const bitfield *) x;
434 const bitfield *yp = (const bitfield *) y;
435 return xp->position - yp->position;
436}
437
40b8e679
L
438static void
439fail (const char *message, ...)
440{
441 va_list args;
442
443 va_start (args, message);
444 fprintf (stderr, _("%s: Error: "), program_name);
445 vfprintf (stderr, message, args);
446 va_end (args);
447 xexit (1);
448}
449
72ffa0fb
L
450static void
451process_copyright (FILE *fp)
452{
453 fprintf (fp, "/* This file is automatically generated by i386-gen. Do not edit! */\n\
22da050b
L
454/* Copyright 2007, 2008, 2009\n\
455 Free Software Foundation, Inc.\n\
72ffa0fb
L
456\n\
457 This file is part of the GNU opcodes library.\n\
458\n\
459 This library is free software; you can redistribute it and/or modify\n\
460 it under the terms of the GNU General Public License as published by\n\
461 the Free Software Foundation; either version 3, or (at your option)\n\
462 any later version.\n\
463\n\
464 It is distributed in the hope that it will be useful, but WITHOUT\n\
465 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n\
466 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public\n\
467 License for more details.\n\
468\n\
469 You should have received a copy of the GNU General Public License\n\
470 along with this program; if not, write to the Free Software\n\
471 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,\n\
472 MA 02110-1301, USA. */\n");
473}
474
40b8e679
L
475/* Remove leading white spaces. */
476
477static char *
478remove_leading_whitespaces (char *str)
479{
480 while (ISSPACE (*str))
481 str++;
482 return str;
483}
484
485/* Remove trailing white spaces. */
486
487static void
488remove_trailing_whitespaces (char *str)
489{
490 size_t last = strlen (str);
491
492 if (last == 0)
493 return;
494
495 do
496 {
497 last--;
498 if (ISSPACE (str [last]))
499 str[last] = '\0';
500 else
501 break;
502 }
503 while (last != 0);
504}
505
93b1ec2c 506/* Find next field separated by SEP and terminate it. Return a
40b8e679
L
507 pointer to the one after it. */
508
509static char *
c587b3f9 510next_field (char *str, char sep, char **next, char *last)
40b8e679
L
511{
512 char *p;
513
514 p = remove_leading_whitespaces (str);
93b1ec2c 515 for (str = p; *str != sep && *str != '\0'; str++);
40b8e679
L
516
517 *str = '\0';
518 remove_trailing_whitespaces (p);
519
520 *next = str + 1;
521
c587b3f9
L
522 if (p >= last)
523 abort ();
524
40b8e679
L
525 return p;
526}
527
40fb9820 528static void
8a9036a4
L
529set_bitfield (const char *f, bitfield *array, int value,
530 unsigned int size, int lineno)
40fb9820
L
531{
532 unsigned int i;
533
309d3373
JB
534 if (strcmp (f, "CpuFP") == 0)
535 {
8a9036a4
L
536 set_bitfield("Cpu387", array, value, size, lineno);
537 set_bitfield("Cpu287", array, value, size, lineno);
309d3373
JB
538 f = "Cpu8087";
539 }
540 else if (strcmp (f, "Mmword") == 0)
7d5e4556
L
541 f= "Qword";
542 else if (strcmp (f, "Oword") == 0)
543 f= "Xmmword";
40fb9820
L
544
545 for (i = 0; i < size; i++)
546 if (strcasecmp (array[i].name, f) == 0)
547 {
8a9036a4 548 array[i].value = value;
40fb9820
L
549 return;
550 }
551
2bf05e57
L
552 if (value)
553 {
554 const char *v = strchr (f, '=');
555
556 if (v)
557 {
558 size_t n = v - f;
559 char *end;
560
561 for (i = 0; i < size; i++)
562 if (strncasecmp (array[i].name, f, n) == 0)
563 {
564 value = strtol (v + 1, &end, 0);
565 if (*end == '\0')
566 {
567 array[i].value = value;
568 return;
569 }
570 break;
571 }
572 }
573 }
574
bd5295b2
L
575 if (lineno != -1)
576 fail (_("%s: %d: Unknown bitfield: %s\n"), filename, lineno, f);
577 else
578 fail (_("Unknown bitfield: %s\n"), f);
40fb9820
L
579}
580
581static void
582output_cpu_flags (FILE *table, bitfield *flags, unsigned int size,
583 int macro, const char *comma, const char *indent)
584{
585 unsigned int i;
586
587 fprintf (table, "%s{ { ", indent);
588
589 for (i = 0; i < size - 1; i++)
590 {
591 fprintf (table, "%d, ", flags[i].value);
592 if (((i + 1) % 20) == 0)
593 {
594 /* We need \\ for macro. */
595 if (macro)
596 fprintf (table, " \\\n %s", indent);
597 else
598 fprintf (table, "\n %s", indent);
599 }
600 }
601
602 fprintf (table, "%d } }%s\n", flags[i].value, comma);
603}
604
605static void
606process_i386_cpu_flag (FILE *table, char *flag, int macro,
bd5295b2
L
607 const char *comma, const char *indent,
608 int lineno)
40fb9820
L
609{
610 char *str, *next, *last;
8a9036a4 611 unsigned int i;
40fb9820
L
612 bitfield flags [ARRAY_SIZE (cpu_flags)];
613
614 /* Copy the default cpu flags. */
615 memcpy (flags, cpu_flags, sizeof (cpu_flags));
616
617 if (strcasecmp (flag, "unknown") == 0)
618 {
40fb9820 619 /* We turn on everything except for cpu64 in case of
8a9036a4
L
620 CPU_UNKNOWN_FLAGS. */
621 for (i = 0; i < ARRAY_SIZE (flags); i++)
622 if (flags[i].position != Cpu64)
623 flags[i].value = 1;
624 }
625 else if (flag[0] == '~')
626 {
627 last = flag + strlen (flag);
628
629 if (flag[1] == '(')
630 {
631 last -= 1;
632 next = flag + 2;
633 if (*last != ')')
634 fail (_("%s: %d: Missing `)' in bitfield: %s\n"), filename,
635 lineno, flag);
636 *last = '\0';
637 }
638 else
639 next = flag + 1;
640
641 /* First we turn on everything except for cpu64. */
40fb9820
L
642 for (i = 0; i < ARRAY_SIZE (flags); i++)
643 if (flags[i].position != Cpu64)
644 flags[i].value = 1;
8a9036a4
L
645
646 /* Turn off selective bits. */
647 for (; next && next < last; )
648 {
649 str = next_field (next, '|', &next, last);
650 if (str)
651 set_bitfield (str, flags, 0, ARRAY_SIZE (flags), lineno);
652 }
40fb9820
L
653 }
654 else if (strcmp (flag, "0"))
655 {
8a9036a4 656 /* Turn on selective bits. */
40fb9820
L
657 last = flag + strlen (flag);
658 for (next = flag; next && next < last; )
659 {
c587b3f9 660 str = next_field (next, '|', &next, last);
40fb9820 661 if (str)
8a9036a4 662 set_bitfield (str, flags, 1, ARRAY_SIZE (flags), lineno);
40fb9820
L
663 }
664 }
665
666 output_cpu_flags (table, flags, ARRAY_SIZE (flags), macro,
667 comma, indent);
668}
669
670static void
671output_opcode_modifier (FILE *table, bitfield *modifier, unsigned int size)
672{
673 unsigned int i;
674
675 fprintf (table, " { ");
676
677 for (i = 0; i < size - 1; i++)
678 {
679 fprintf (table, "%d, ", modifier[i].value);
680 if (((i + 1) % 20) == 0)
681 fprintf (table, "\n ");
682 }
683
684 fprintf (table, "%d },\n", modifier[i].value);
685}
686
687static void
bd5295b2 688process_i386_opcode_modifier (FILE *table, char *mod, int lineno)
40fb9820
L
689{
690 char *str, *next, *last;
691 bitfield modifiers [ARRAY_SIZE (opcode_modifiers)];
692
693 /* Copy the default opcode modifier. */
694 memcpy (modifiers, opcode_modifiers, sizeof (modifiers));
695
696 if (strcmp (mod, "0"))
697 {
698 last = mod + strlen (mod);
699 for (next = mod; next && next < last; )
700 {
c587b3f9 701 str = next_field (next, '|', &next, last);
40fb9820 702 if (str)
8a9036a4
L
703 set_bitfield (str, modifiers, 1, ARRAY_SIZE (modifiers),
704 lineno);
40fb9820
L
705 }
706 }
707 output_opcode_modifier (table, modifiers, ARRAY_SIZE (modifiers));
708}
709
710static void
711output_operand_type (FILE *table, bitfield *types, unsigned int size,
712 int macro, const char *indent)
713{
714 unsigned int i;
715
716 fprintf (table, "{ { ");
717
718 for (i = 0; i < size - 1; i++)
719 {
720 fprintf (table, "%d, ", types[i].value);
721 if (((i + 1) % 20) == 0)
722 {
723 /* We need \\ for macro. */
724 if (macro)
725 fprintf (table, "\\\n%s", indent);
726 else
727 fprintf (table, "\n%s", indent);
728 }
729 }
730
731 fprintf (table, "%d } }", types[i].value);
732}
733
734static void
735process_i386_operand_type (FILE *table, char *op, int macro,
bd5295b2 736 const char *indent, int lineno)
40fb9820
L
737{
738 char *str, *next, *last;
739 bitfield types [ARRAY_SIZE (operand_types)];
740
741 /* Copy the default operand type. */
742 memcpy (types, operand_types, sizeof (types));
743
744 if (strcmp (op, "0"))
745 {
746 last = op + strlen (op);
747 for (next = op; next && next < last; )
748 {
c587b3f9 749 str = next_field (next, '|', &next, last);
40fb9820 750 if (str)
8a9036a4 751 set_bitfield (str, types, 1, ARRAY_SIZE (types), lineno);
40fb9820
L
752 }
753 }
754 output_operand_type (table, types, ARRAY_SIZE (types), macro,
755 indent);
756}
757
c587b3f9
L
758static void
759output_i386_opcode (FILE *table, const char *name, char *str,
bd5295b2 760 char *last, int lineno)
c587b3f9
L
761{
762 unsigned int i;
763 char *operands, *base_opcode, *extension_opcode, *opcode_length;
764 char *cpu_flags, *opcode_modifier, *operand_types [MAX_OPERANDS];
765
766 /* Find number of operands. */
767 operands = next_field (str, ',', &str, last);
768
769 /* Find base_opcode. */
770 base_opcode = next_field (str, ',', &str, last);
771
772 /* Find extension_opcode. */
773 extension_opcode = next_field (str, ',', &str, last);
774
775 /* Find opcode_length. */
776 opcode_length = next_field (str, ',', &str, last);
777
778 /* Find cpu_flags. */
779 cpu_flags = next_field (str, ',', &str, last);
780
781 /* Find opcode_modifier. */
782 opcode_modifier = next_field (str, ',', &str, last);
783
784 /* Remove the first {. */
785 str = remove_leading_whitespaces (str);
786 if (*str != '{')
787 abort ();
788 str = remove_leading_whitespaces (str + 1);
789
790 i = strlen (str);
791
792 /* There are at least "X}". */
793 if (i < 2)
794 abort ();
795
796 /* Remove trailing white spaces and }. */
797 do
798 {
799 i--;
800 if (ISSPACE (str[i]) || str[i] == '}')
801 str[i] = '\0';
802 else
803 break;
804 }
805 while (i != 0);
806
807 last = str + i;
808
809 /* Find operand_types. */
810 for (i = 0; i < ARRAY_SIZE (operand_types); i++)
811 {
812 if (str >= last)
813 {
814 operand_types [i] = NULL;
815 break;
816 }
817
818 operand_types [i] = next_field (str, ',', &str, last);
819 if (*operand_types[i] == '0')
820 {
821 if (i != 0)
822 operand_types[i] = NULL;
823 break;
824 }
825 }
826
827 fprintf (table, " { \"%s\", %s, %s, %s, %s,\n",
828 name, operands, base_opcode, extension_opcode,
829 opcode_length);
830
bd5295b2 831 process_i386_cpu_flag (table, cpu_flags, 0, ",", " ", lineno);
c587b3f9 832
bd5295b2 833 process_i386_opcode_modifier (table, opcode_modifier, lineno);
c587b3f9
L
834
835 fprintf (table, " { ");
836
837 for (i = 0; i < ARRAY_SIZE (operand_types); i++)
838 {
839 if (operand_types[i] == NULL || *operand_types[i] == '0')
840 {
841 if (i == 0)
bd5295b2 842 process_i386_operand_type (table, "0", 0, "\t ", lineno);
c587b3f9
L
843 break;
844 }
845
846 if (i != 0)
847 fprintf (table, ",\n ");
848
849 process_i386_operand_type (table, operand_types[i], 0,
bd5295b2 850 "\t ", lineno);
c587b3f9
L
851 }
852 fprintf (table, " } },\n");
853}
854
855struct opcode_hash_entry
856{
857 struct opcode_hash_entry *next;
858 char *name;
859 char *opcode;
bd5295b2 860 int lineno;
c587b3f9
L
861};
862
863/* Calculate the hash value of an opcode hash entry P. */
864
865static hashval_t
866opcode_hash_hash (const void *p)
867{
868 struct opcode_hash_entry *entry = (struct opcode_hash_entry *) p;
869 return htab_hash_string (entry->name);
870}
871
872/* Compare a string Q against an opcode hash entry P. */
873
874static int
875opcode_hash_eq (const void *p, const void *q)
876{
877 struct opcode_hash_entry *entry = (struct opcode_hash_entry *) p;
878 const char *name = (const char *) q;
879 return strcmp (name, entry->name) == 0;
880}
881
40b8e679 882static void
72ffa0fb 883process_i386_opcodes (FILE *table)
40b8e679 884{
3d4d5afa 885 FILE *fp;
40b8e679 886 char buf[2048];
c587b3f9
L
887 unsigned int i, j;
888 char *str, *p, *last, *name;
889 struct opcode_hash_entry **hash_slot, **entry, *next;
890 htab_t opcode_hash_table;
891 struct opcode_hash_entry **opcode_array;
892 unsigned int opcode_array_size = 1024;
bd5295b2 893 int lineno = 0;
40b8e679 894
3d4d5afa
L
895 filename = "i386-opc.tbl";
896 fp = fopen (filename, "r");
897
40b8e679 898 if (fp == NULL)
34edb9ad 899 fail (_("can't find i386-opc.tbl for reading, errno = %s\n"),
40fb9820 900 xstrerror (errno));
40b8e679 901
c587b3f9
L
902 i = 0;
903 opcode_array = (struct opcode_hash_entry **)
904 xmalloc (sizeof (*opcode_array) * opcode_array_size);
905
906 opcode_hash_table = htab_create_alloc (16, opcode_hash_hash,
907 opcode_hash_eq, NULL,
908 xcalloc, free);
909
34edb9ad 910 fprintf (table, "\n/* i386 opcode table. */\n\n");
d3ce72d0 911 fprintf (table, "const insn_template i386_optab[] =\n{\n");
40b8e679 912
c587b3f9 913 /* Put everything on opcode array. */
40b8e679
L
914 while (!feof (fp))
915 {
916 if (fgets (buf, sizeof (buf), fp) == NULL)
917 break;
918
3d4d5afa
L
919 lineno++;
920
40b8e679
L
921 p = remove_leading_whitespaces (buf);
922
923 /* Skip comments. */
924 str = strstr (p, "//");
925 if (str != NULL)
926 str[0] = '\0';
927
928 /* Remove trailing white spaces. */
929 remove_trailing_whitespaces (p);
930
931 switch (p[0])
932 {
933 case '#':
c587b3f9 934 /* Ignore comments. */
40b8e679
L
935 case '\0':
936 continue;
937 break;
938 default:
939 break;
940 }
941
942 last = p + strlen (p);
943
944 /* Find name. */
c587b3f9 945 name = next_field (p, ',', &str, last);
40b8e679 946
c587b3f9
L
947 /* Get the slot in hash table. */
948 hash_slot = (struct opcode_hash_entry **)
949 htab_find_slot_with_hash (opcode_hash_table, name,
950 htab_hash_string (name),
951 INSERT);
40b8e679 952
c587b3f9 953 if (*hash_slot == NULL)
40b8e679 954 {
c587b3f9
L
955 /* It is the new one. Put it on opcode array. */
956 if (i >= opcode_array_size)
40b8e679 957 {
c587b3f9
L
958 /* Grow the opcode array when needed. */
959 opcode_array_size += 1024;
960 opcode_array = (struct opcode_hash_entry **)
961 xrealloc (opcode_array,
962 sizeof (*opcode_array) * opcode_array_size);
40b8e679
L
963 }
964
c587b3f9
L
965 opcode_array[i] = (struct opcode_hash_entry *)
966 xmalloc (sizeof (struct opcode_hash_entry));
967 opcode_array[i]->next = NULL;
968 opcode_array[i]->name = xstrdup (name);
969 opcode_array[i]->opcode = xstrdup (str);
bd5295b2 970 opcode_array[i]->lineno = lineno;
c587b3f9
L
971 *hash_slot = opcode_array[i];
972 i++;
40b8e679 973 }
c587b3f9 974 else
40b8e679 975 {
c587b3f9
L
976 /* Append it to the existing one. */
977 entry = hash_slot;
978 while ((*entry) != NULL)
979 entry = &(*entry)->next;
980 *entry = (struct opcode_hash_entry *)
981 xmalloc (sizeof (struct opcode_hash_entry));
982 (*entry)->next = NULL;
983 (*entry)->name = (*hash_slot)->name;
984 (*entry)->opcode = xstrdup (str);
bd5295b2 985 (*entry)->lineno = lineno;
c587b3f9
L
986 }
987 }
40b8e679 988
c587b3f9
L
989 /* Process opcode array. */
990 for (j = 0; j < i; j++)
991 {
992 for (next = opcode_array[j]; next; next = next->next)
993 {
994 name = next->name;
995 str = next->opcode;
bd5295b2 996 lineno = next->lineno;
c587b3f9 997 last = str + strlen (str);
bd5295b2 998 output_i386_opcode (table, name, str, last, lineno);
40b8e679 999 }
40b8e679
L
1000 }
1001
34edb9ad
L
1002 fclose (fp);
1003
4dffcebc 1004 fprintf (table, " { NULL, 0, 0, 0, 0,\n");
40fb9820 1005
bd5295b2 1006 process_i386_cpu_flag (table, "0", 0, ",", " ", -1);
40fb9820 1007
bd5295b2 1008 process_i386_opcode_modifier (table, "0", -1);
40fb9820
L
1009
1010 fprintf (table, " { ");
bd5295b2 1011 process_i386_operand_type (table, "0", 0, "\t ", -1);
40fb9820
L
1012 fprintf (table, " } }\n");
1013
34edb9ad 1014 fprintf (table, "};\n");
40b8e679
L
1015}
1016
1017static void
72ffa0fb 1018process_i386_registers (FILE *table)
40b8e679 1019{
3d4d5afa 1020 FILE *fp;
40b8e679
L
1021 char buf[2048];
1022 char *str, *p, *last;
1023 char *reg_name, *reg_type, *reg_flags, *reg_num;
a60de03c 1024 char *dw2_32_num, *dw2_64_num;
bd5295b2 1025 int lineno = 0;
40b8e679 1026
3d4d5afa
L
1027 filename = "i386-reg.tbl";
1028 fp = fopen (filename, "r");
40b8e679 1029 if (fp == NULL)
34edb9ad 1030 fail (_("can't find i386-reg.tbl for reading, errno = %s\n"),
40fb9820 1031 xstrerror (errno));
40b8e679 1032
34edb9ad
L
1033 fprintf (table, "\n/* i386 register table. */\n\n");
1034 fprintf (table, "const reg_entry i386_regtab[] =\n{\n");
40b8e679
L
1035
1036 while (!feof (fp))
1037 {
1038 if (fgets (buf, sizeof (buf), fp) == NULL)
1039 break;
1040
3d4d5afa
L
1041 lineno++;
1042
40b8e679
L
1043 p = remove_leading_whitespaces (buf);
1044
1045 /* Skip comments. */
1046 str = strstr (p, "//");
1047 if (str != NULL)
1048 str[0] = '\0';
1049
1050 /* Remove trailing white spaces. */
1051 remove_trailing_whitespaces (p);
1052
1053 switch (p[0])
1054 {
1055 case '#':
34edb9ad 1056 fprintf (table, "%s\n", p);
40b8e679
L
1057 case '\0':
1058 continue;
1059 break;
1060 default:
1061 break;
1062 }
1063
1064 last = p + strlen (p);
1065
1066 /* Find reg_name. */
c587b3f9 1067 reg_name = next_field (p, ',', &str, last);
40b8e679
L
1068
1069 /* Find reg_type. */
c587b3f9 1070 reg_type = next_field (str, ',', &str, last);
40b8e679
L
1071
1072 /* Find reg_flags. */
c587b3f9 1073 reg_flags = next_field (str, ',', &str, last);
40b8e679
L
1074
1075 /* Find reg_num. */
c587b3f9 1076 reg_num = next_field (str, ',', &str, last);
a60de03c 1077
40fb9820
L
1078 fprintf (table, " { \"%s\",\n ", reg_name);
1079
bd5295b2 1080 process_i386_operand_type (table, reg_type, 0, "\t", lineno);
40fb9820 1081
a60de03c 1082 /* Find 32-bit Dwarf2 register number. */
c587b3f9 1083 dw2_32_num = next_field (str, ',', &str, last);
a60de03c
JB
1084
1085 /* Find 64-bit Dwarf2 register number. */
c587b3f9 1086 dw2_64_num = next_field (str, ',', &str, last);
a60de03c
JB
1087
1088 fprintf (table, ",\n %s, %s, { %s, %s } },\n",
1089 reg_flags, reg_num, dw2_32_num, dw2_64_num);
40b8e679
L
1090 }
1091
34edb9ad
L
1092 fclose (fp);
1093
1094 fprintf (table, "};\n");
40b8e679 1095
34edb9ad 1096 fprintf (table, "\nconst unsigned int i386_regtab_size = ARRAY_SIZE (i386_regtab);\n");
40b8e679
L
1097}
1098
40fb9820
L
1099static void
1100process_i386_initializers (void)
1101{
1102 unsigned int i;
1103 FILE *fp = fopen ("i386-init.h", "w");
1104 char *init;
1105
1106 if (fp == NULL)
1107 fail (_("can't create i386-init.h, errno = %s\n"),
1108 xstrerror (errno));
1109
1110 process_copyright (fp);
1111
1112 for (i = 0; i < ARRAY_SIZE (cpu_flag_init); i++)
1113 {
1114 fprintf (fp, "\n#define %s \\\n", cpu_flag_init[i].name);
1115 init = xstrdup (cpu_flag_init[i].init);
bd5295b2 1116 process_i386_cpu_flag (fp, init, 1, "", " ", -1);
40fb9820
L
1117 free (init);
1118 }
1119
1120 for (i = 0; i < ARRAY_SIZE (operand_type_init); i++)
1121 {
1122 fprintf (fp, "\n\n#define %s \\\n ", operand_type_init[i].name);
1123 init = xstrdup (operand_type_init[i].init);
bd5295b2 1124 process_i386_operand_type (fp, init, 1, " ", -1);
40fb9820
L
1125 free (init);
1126 }
1127 fprintf (fp, "\n");
1128
1129 fclose (fp);
1130}
1131
40b8e679
L
1132/* Program options. */
1133#define OPTION_SRCDIR 200
1134
1135struct option long_options[] =
1136{
1137 {"srcdir", required_argument, NULL, OPTION_SRCDIR},
1138 {"debug", no_argument, NULL, 'd'},
1139 {"version", no_argument, NULL, 'V'},
1140 {"help", no_argument, NULL, 'h'},
1141 {0, no_argument, NULL, 0}
1142};
1143
1144static void
1145print_version (void)
1146{
1147 printf ("%s: version 1.0\n", program_name);
1148 xexit (0);
1149}
1150
1151static void
1152usage (FILE * stream, int status)
1153{
1154 fprintf (stream, "Usage: %s [-V | --version] [-d | --debug] [--srcdir=dirname] [--help]\n",
1155 program_name);
1156 xexit (status);
1157}
1158
1159int
1160main (int argc, char **argv)
1161{
1162 extern int chdir (char *);
1163 char *srcdir = NULL;
8b40d594 1164 int c;
72ffa0fb 1165 FILE *table;
40b8e679
L
1166
1167 program_name = *argv;
1168 xmalloc_set_program_name (program_name);
1169
1170 while ((c = getopt_long (argc, argv, "vVdh", long_options, 0)) != EOF)
1171 switch (c)
1172 {
1173 case OPTION_SRCDIR:
1174 srcdir = optarg;
1175 break;
1176 case 'V':
1177 case 'v':
1178 print_version ();
1179 break;
1180 case 'd':
1181 debug = 1;
1182 break;
1183 case 'h':
1184 case '?':
1185 usage (stderr, 0);
1186 default:
1187 case 0:
1188 break;
1189 }
1190
1191 if (optind != argc)
1192 usage (stdout, 1);
1193
1194 if (srcdir != NULL)
1195 if (chdir (srcdir) != 0)
1196 fail (_("unable to change directory to \"%s\", errno = %s\n"),
40fb9820
L
1197 srcdir, xstrerror (errno));
1198
1199 /* Check the unused bitfield in i386_cpu_flags. */
1200#ifndef CpuUnused
8b40d594
L
1201 c = CpuNumOfBits - CpuMax - 1;
1202 if (c)
1203 fail (_("%d unused bits in i386_cpu_flags.\n"), c);
40fb9820
L
1204#endif
1205
1206 /* Check the unused bitfield in i386_operand_type. */
1207#ifndef OTUnused
8b40d594
L
1208 c = OTNumOfBits - OTMax - 1;
1209 if (c)
1210 fail (_("%d unused bits in i386_operand_type.\n"), c);
40fb9820
L
1211#endif
1212
1213 qsort (cpu_flags, ARRAY_SIZE (cpu_flags), sizeof (cpu_flags [0]),
1214 compare);
1215
1216 qsort (opcode_modifiers, ARRAY_SIZE (opcode_modifiers),
1217 sizeof (opcode_modifiers [0]), compare);
1218
1219 qsort (operand_types, ARRAY_SIZE (operand_types),
1220 sizeof (operand_types [0]), compare);
40b8e679 1221
34edb9ad
L
1222 table = fopen ("i386-tbl.h", "w");
1223 if (table == NULL)
40fb9820
L
1224 fail (_("can't create i386-tbl.h, errno = %s\n"),
1225 xstrerror (errno));
34edb9ad 1226
72ffa0fb 1227 process_copyright (table);
40b8e679 1228
72ffa0fb
L
1229 process_i386_opcodes (table);
1230 process_i386_registers (table);
40fb9820 1231 process_i386_initializers ();
40b8e679 1232
34edb9ad
L
1233 fclose (table);
1234
40b8e679
L
1235 exit (0);
1236}
This page took 0.309621 seconds and 4 git commands to generate.