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