* gas/testsuite/gas/arm/thumb-eabi.d: Add case for divided syntax encoding of movs.
[deliverable/binutils-gdb.git] / opcodes / i386-gen.c
CommitLineData
c75ef631 1/* Copyright 2007, 2008, 2009, 2010
22da050b 2 Free Software Foundation, Inc.
40b8e679 3
9b201bb5 4 This file is part of the GNU opcodes library.
40b8e679 5
9b201bb5 6 This library is free software; you can redistribute it and/or modify
40b8e679 7 it under the terms of the GNU General Public License as published by
9b201bb5
NC
8 the Free Software Foundation; either version 3, or (at your option)
9 any later version.
40b8e679 10
9b201bb5
NC
11 It is distributed in the hope that it will be useful, but WITHOUT
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
14 License for more details.
40b8e679
L
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
9b201bb5
NC
18 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19 MA 02110-1301, USA. */
40b8e679 20
40fb9820 21#include "sysdep.h"
40b8e679 22#include <stdio.h>
40b8e679
L
23#include <errno.h>
24#include "getopt.h"
25#include "libiberty.h"
c587b3f9 26#include "hashtab.h"
40b8e679
L
27#include "safe-ctype.h"
28
29#include "i386-opc.h"
30
31#include <libintl.h>
32#define _(String) gettext (String)
33
34static const char *program_name = NULL;
35static int debug = 0;
36
40fb9820
L
37typedef struct initializer
38{
39 const char *name;
40 const char *init;
41} initializer;
42
8acd5377 43static initializer cpu_flag_init[] =
40fb9820
L
44{
45 { "CPU_UNKNOWN_FLAGS",
8a9036a4 46 "~CpuL1OM" },
40fb9820
L
47 { "CPU_GENERIC32_FLAGS",
48 "Cpu186|Cpu286|Cpu386" },
49 { "CPU_GENERIC64_FLAGS",
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 88 "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuSYSCALL|CpuRdtscp|Cpu387|Cpu687|CpuFISTTP|CpuMMX|Cpu3dnow|Cpu3dnowA|CpuSSE|CpuSSE2|CpuSSE3|CpuSSE4a|CpuABM|CpuLM" },
68339fdf 89 { "CPU_BDVER1_FLAGS",
69dd9865 90 "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuSYSCALL|CpuRdtscp|Cpu387|Cpu687|CpuFISTTP|CpuMMX|Cpu3dnow|Cpu3dnowA|CpuSSE|CpuSSE2|CpuSSE3|CpuSSE4a|CpuABM|CpuLM|CpuFMA4|CpuXOP|CpuLWP" },
309d3373
JB
91 { "CPU_8087_FLAGS",
92 "Cpu8087" },
93 { "CPU_287_FLAGS",
94 "Cpu287" },
95 { "CPU_387_FLAGS",
96 "Cpu387" },
97 { "CPU_ANY87_FLAGS",
98 "Cpu8087|Cpu287|Cpu387|Cpu687|CpuFISTTP" },
bd5295b2
L
99 { "CPU_CLFLUSH_FLAGS",
100 "CpuClflush" },
101 { "CPU_SYSCALL_FLAGS",
102 "CpuSYSCALL" },
40fb9820
L
103 { "CPU_MMX_FLAGS",
104 "CpuMMX" },
105 { "CPU_SSE_FLAGS",
115c7c25 106 "CpuMMX|CpuSSE" },
40fb9820 107 { "CPU_SSE2_FLAGS",
115c7c25 108 "CpuMMX|CpuSSE|CpuSSE2" },
40fb9820 109 { "CPU_SSE3_FLAGS",
115c7c25 110 "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3" },
40fb9820 111 { "CPU_SSSE3_FLAGS",
115c7c25 112 "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3" },
40fb9820 113 { "CPU_SSE4_1_FLAGS",
115c7c25 114 "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1" },
40fb9820 115 { "CPU_SSE4_2_FLAGS",
115c7c25 116 "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2" },
309d3373
JB
117 { "CPU_ANY_SSE_FLAGS",
118 "CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuSSE4a|CpuAVX" },
6305a203
L
119 { "CPU_VMX_FLAGS",
120 "CpuVMX" },
121 { "CPU_SMX_FLAGS",
122 "CpuSMX" },
f03fe4c1
L
123 { "CPU_XSAVE_FLAGS",
124 "CpuXsave" },
c0f3af97
L
125 { "CPU_AES_FLAGS",
126 "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAES" },
594ab6a3
L
127 { "CPU_PCLMUL_FLAGS",
128 "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuPCLMUL" },
c0f3af97
L
129 { "CPU_FMA_FLAGS",
130 "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuFMA" },
922d8de8
DR
131 { "CPU_FMA4_FLAGS",
132 "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuFMA4" },
5dd85c99 133 { "CPU_XOP_FLAGS",
f0ae4a24 134 "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuSSE4a|CpuABM|CpuAVX|CpuFMA4|CpuXOP" },
f88c9eb0
SP
135 { "CPU_LWP_FLAGS",
136 "CpuLWP" },
f1f8f695
L
137 { "CPU_MOVBE_FLAGS",
138 "CpuMovbe" },
1b7f3fb0
L
139 { "CPU_RDTSCP_FLAGS",
140 "CpuRdtscp" },
f1f8f695
L
141 { "CPU_EPT_FLAGS",
142 "CpuEPT" },
40fb9820
L
143 { "CPU_3DNOW_FLAGS",
144 "CpuMMX|Cpu3dnow" },
145 { "CPU_3DNOWA_FLAGS",
115c7c25 146 "CpuMMX|Cpu3dnow|Cpu3dnowA" },
40fb9820
L
147 { "CPU_PADLOCK_FLAGS",
148 "CpuPadLock" },
149 { "CPU_SVME_FLAGS",
150 "CpuSVME" },
151 { "CPU_SSE4A_FLAGS",
115c7c25 152 "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSE4a" },
40fb9820 153 { "CPU_ABM_FLAGS",
3629bb00 154 "CpuABM" },
c0f3af97
L
155 { "CPU_AVX_FLAGS",
156 "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX" },
309d3373
JB
157 { "CPU_ANY_AVX_FLAGS",
158 "CpuAVX" },
8a9036a4
L
159 { "CPU_L1OM_FLAGS",
160 "unknown" },
40fb9820
L
161};
162
8acd5377 163static initializer operand_type_init[] =
40fb9820
L
164{
165 { "OPERAND_TYPE_NONE",
166 "0" },
167 { "OPERAND_TYPE_REG8",
168 "Reg8" },
169 { "OPERAND_TYPE_REG16",
170 "Reg16" },
171 { "OPERAND_TYPE_REG32",
172 "Reg32" },
173 { "OPERAND_TYPE_REG64",
174 "Reg64" },
175 { "OPERAND_TYPE_IMM1",
176 "Imm1" },
177 { "OPERAND_TYPE_IMM8",
178 "Imm8" },
179 { "OPERAND_TYPE_IMM8S",
180 "Imm8S" },
181 { "OPERAND_TYPE_IMM16",
182 "Imm16" },
183 { "OPERAND_TYPE_IMM32",
184 "Imm32" },
185 { "OPERAND_TYPE_IMM32S",
186 "Imm32S" },
187 { "OPERAND_TYPE_IMM64",
188 "Imm64" },
189 { "OPERAND_TYPE_BASEINDEX",
190 "BaseIndex" },
191 { "OPERAND_TYPE_DISP8",
192 "Disp8" },
193 { "OPERAND_TYPE_DISP16",
194 "Disp16" },
195 { "OPERAND_TYPE_DISP32",
196 "Disp32" },
197 { "OPERAND_TYPE_DISP32S",
198 "Disp32S" },
199 { "OPERAND_TYPE_DISP64",
200 "Disp64" },
201 { "OPERAND_TYPE_INOUTPORTREG",
202 "InOutPortReg" },
203 { "OPERAND_TYPE_SHIFTCOUNT",
204 "ShiftCount" },
205 { "OPERAND_TYPE_CONTROL",
206 "Control" },
207 { "OPERAND_TYPE_TEST",
208 "Test" },
209 { "OPERAND_TYPE_DEBUG",
210 "FloatReg" },
211 { "OPERAND_TYPE_FLOATREG",
212 "FloatReg" },
213 { "OPERAND_TYPE_FLOATACC",
214 "FloatAcc" },
215 { "OPERAND_TYPE_SREG2",
216 "SReg2" },
217 { "OPERAND_TYPE_SREG3",
218 "SReg3" },
219 { "OPERAND_TYPE_ACC",
220 "Acc" },
221 { "OPERAND_TYPE_JUMPABSOLUTE",
222 "JumpAbsolute" },
223 { "OPERAND_TYPE_REGMMX",
224 "RegMMX" },
225 { "OPERAND_TYPE_REGXMM",
226 "RegXMM" },
c0f3af97
L
227 { "OPERAND_TYPE_REGYMM",
228 "RegYMM" },
40fb9820
L
229 { "OPERAND_TYPE_ESSEG",
230 "EsSeg" },
231 { "OPERAND_TYPE_ACC32",
7d5e4556 232 "Reg32|Acc|Dword" },
40fb9820 233 { "OPERAND_TYPE_ACC64",
7d5e4556 234 "Reg64|Acc|Qword" },
65da13b5
L
235 { "OPERAND_TYPE_INOUTPORTREG",
236 "InOutPortReg" },
40fb9820
L
237 { "OPERAND_TYPE_REG16_INOUTPORTREG",
238 "Reg16|InOutPortReg" },
239 { "OPERAND_TYPE_DISP16_32",
240 "Disp16|Disp32" },
241 { "OPERAND_TYPE_ANYDISP",
242 "Disp8|Disp16|Disp32|Disp32S|Disp64" },
243 { "OPERAND_TYPE_IMM16_32",
244 "Imm16|Imm32" },
245 { "OPERAND_TYPE_IMM16_32S",
246 "Imm16|Imm32S" },
247 { "OPERAND_TYPE_IMM16_32_32S",
248 "Imm16|Imm32|Imm32S" },
249 { "OPERAND_TYPE_IMM32_32S_DISP32",
250 "Imm32|Imm32S|Disp32" },
251 { "OPERAND_TYPE_IMM64_DISP64",
252 "Imm64|Disp64" },
253 { "OPERAND_TYPE_IMM32_32S_64_DISP32",
254 "Imm32|Imm32S|Imm64|Disp32" },
255 { "OPERAND_TYPE_IMM32_32S_64_DISP32_64",
256 "Imm32|Imm32S|Imm64|Disp32|Disp64" },
a683cc34
SP
257 { "OPERAND_TYPE_VEC_IMM4",
258 "Vec_Imm4" },
40fb9820
L
259};
260
261typedef struct bitfield
262{
263 int position;
264 int value;
265 const char *name;
266} bitfield;
267
268#define BITFIELD(n) { n, 0, #n }
269
270static bitfield cpu_flags[] =
271{
272 BITFIELD (Cpu186),
273 BITFIELD (Cpu286),
274 BITFIELD (Cpu386),
275 BITFIELD (Cpu486),
276 BITFIELD (Cpu586),
277 BITFIELD (Cpu686),
bd5295b2
L
278 BITFIELD (CpuClflush),
279 BITFIELD (CpuSYSCALL),
309d3373
JB
280 BITFIELD (Cpu8087),
281 BITFIELD (Cpu287),
282 BITFIELD (Cpu387),
283 BITFIELD (Cpu687),
284 BITFIELD (CpuFISTTP),
40fb9820 285 BITFIELD (CpuMMX),
40fb9820
L
286 BITFIELD (CpuSSE),
287 BITFIELD (CpuSSE2),
288 BITFIELD (CpuSSE3),
289 BITFIELD (CpuSSSE3),
290 BITFIELD (CpuSSE4_1),
291 BITFIELD (CpuSSE4_2),
c0f3af97 292 BITFIELD (CpuAVX),
8a9036a4 293 BITFIELD (CpuL1OM),
40fb9820
L
294 BITFIELD (CpuSSE4a),
295 BITFIELD (Cpu3dnow),
296 BITFIELD (Cpu3dnowA),
297 BITFIELD (CpuPadLock),
298 BITFIELD (CpuSVME),
299 BITFIELD (CpuVMX),
47dd174c 300 BITFIELD (CpuSMX),
40fb9820 301 BITFIELD (CpuABM),
475a2301 302 BITFIELD (CpuXsave),
c0f3af97 303 BITFIELD (CpuAES),
594ab6a3 304 BITFIELD (CpuPCLMUL),
c0f3af97 305 BITFIELD (CpuFMA),
f88c9eb0 306 BITFIELD (CpuFMA4),
5dd85c99 307 BITFIELD (CpuXOP),
f88c9eb0 308 BITFIELD (CpuLWP),
c0f3af97 309 BITFIELD (CpuLM),
f1f8f695
L
310 BITFIELD (CpuMovbe),
311 BITFIELD (CpuEPT),
1b7f3fb0 312 BITFIELD (CpuRdtscp),
40fb9820
L
313 BITFIELD (Cpu64),
314 BITFIELD (CpuNo64),
315#ifdef CpuUnused
316 BITFIELD (CpuUnused),
317#endif
318};
319
320static bitfield opcode_modifiers[] =
321{
322 BITFIELD (D),
323 BITFIELD (W),
b6169b20 324 BITFIELD (S),
40fb9820
L
325 BITFIELD (Modrm),
326 BITFIELD (ShortForm),
327 BITFIELD (Jump),
328 BITFIELD (JumpDword),
329 BITFIELD (JumpByte),
330 BITFIELD (JumpInterSegment),
331 BITFIELD (FloatMF),
332 BITFIELD (FloatR),
333 BITFIELD (FloatD),
334 BITFIELD (Size16),
335 BITFIELD (Size32),
336 BITFIELD (Size64),
337 BITFIELD (IgnoreSize),
338 BITFIELD (DefaultSize),
339 BITFIELD (No_bSuf),
340 BITFIELD (No_wSuf),
341 BITFIELD (No_lSuf),
342 BITFIELD (No_sSuf),
343 BITFIELD (No_qSuf),
7ce189b3 344 BITFIELD (No_ldSuf),
40fb9820
L
345 BITFIELD (FWait),
346 BITFIELD (IsString),
c32fa91d 347 BITFIELD (IsLockable),
40fb9820 348 BITFIELD (RegKludge),
e2ec9d29 349 BITFIELD (FirstXmm0),
c0f3af97 350 BITFIELD (Implicit1stXmm0),
ca61edf2
L
351 BITFIELD (ToDword),
352 BITFIELD (ToQword),
353 BITFIELD (AddrPrefixOp0),
40fb9820
L
354 BITFIELD (IsPrefix),
355 BITFIELD (ImmExt),
356 BITFIELD (NoRex64),
357 BITFIELD (Rex64),
358 BITFIELD (Ugh),
c0f3af97 359 BITFIELD (Vex),
2426c15f 360 BITFIELD (VexVVVV),
1ef99a7b 361 BITFIELD (VexW),
7f399153 362 BITFIELD (VexOpcode),
8cd7925b 363 BITFIELD (VexSources),
c0f3af97
L
364 BITFIELD (VexImmExt),
365 BITFIELD (SSE2AVX),
81f8a913 366 BITFIELD (NoAVX),
1efbbeb4
L
367 BITFIELD (OldGcc),
368 BITFIELD (ATTMnemonic),
e1d4d893 369 BITFIELD (ATTSyntax),
5c07affc 370 BITFIELD (IntelSyntax),
40fb9820
L
371};
372
373static bitfield operand_types[] =
374{
375 BITFIELD (Reg8),
376 BITFIELD (Reg16),
377 BITFIELD (Reg32),
378 BITFIELD (Reg64),
379 BITFIELD (FloatReg),
380 BITFIELD (RegMMX),
381 BITFIELD (RegXMM),
c0f3af97 382 BITFIELD (RegYMM),
94ff3a50 383 BITFIELD (Imm1),
40fb9820
L
384 BITFIELD (Imm8),
385 BITFIELD (Imm8S),
386 BITFIELD (Imm16),
387 BITFIELD (Imm32),
388 BITFIELD (Imm32S),
389 BITFIELD (Imm64),
40fb9820
L
390 BITFIELD (BaseIndex),
391 BITFIELD (Disp8),
392 BITFIELD (Disp16),
393 BITFIELD (Disp32),
394 BITFIELD (Disp32S),
395 BITFIELD (Disp64),
396 BITFIELD (InOutPortReg),
397 BITFIELD (ShiftCount),
398 BITFIELD (Control),
399 BITFIELD (Debug),
400 BITFIELD (Test),
401 BITFIELD (SReg2),
402 BITFIELD (SReg3),
403 BITFIELD (Acc),
404 BITFIELD (FloatAcc),
405 BITFIELD (JumpAbsolute),
406 BITFIELD (EsSeg),
407 BITFIELD (RegMem),
5c07affc 408 BITFIELD (Mem),
7d5e4556
L
409 BITFIELD (Byte),
410 BITFIELD (Word),
411 BITFIELD (Dword),
412 BITFIELD (Fword),
413 BITFIELD (Qword),
414 BITFIELD (Tbyte),
415 BITFIELD (Xmmword),
c0f3af97 416 BITFIELD (Ymmword),
7d5e4556
L
417 BITFIELD (Unspecified),
418 BITFIELD (Anysize),
a683cc34 419 BITFIELD (Vec_Imm4),
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\
c75ef631 451/* Copyright 2007, 2008, 2009, 2010\n\
22da050b 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.205728 seconds and 4 git commands to generate.