1 /* Copyright (C) 2007-2020 Free Software Foundation, Inc.
3 This file is part of the GNU opcodes library.
5 This library is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 3, or (at your option)
10 It is distributed in the hope that it will be useful, but WITHOUT
11 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
12 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
13 License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
18 MA 02110-1301, USA. */
24 #include "libiberty.h"
26 #include "safe-ctype.h"
31 #define _(String) gettext (String)
33 /* Build-time checks are preferrable over runtime ones. Use this construct
34 in preference where possible. */
35 #define static_assert(e) ((void)sizeof (struct { int _:1 - 2 * !(e); }))
37 static const char *program_name
= NULL
;
40 typedef struct initializer
46 static initializer cpu_flag_init
[] =
48 { "CPU_UNKNOWN_FLAGS",
49 "~(CpuL1OM|CpuK1OM)" },
50 { "CPU_GENERIC32_FLAGS",
51 "Cpu186|Cpu286|Cpu386" },
52 { "CPU_GENERIC64_FLAGS",
53 "CPU_PENTIUMPRO_FLAGS|CpuClflush|CpuSYSCALL|CPU_MMX_FLAGS|CPU_SSE2_FLAGS|CpuLM" },
59 "CPU_I186_FLAGS|Cpu286" },
61 "CPU_I286_FLAGS|Cpu386" },
63 "CPU_I386_FLAGS|Cpu486" },
65 "CPU_I486_FLAGS|Cpu387|Cpu586" },
67 "CPU_I586_FLAGS|Cpu686|Cpu687|CpuCMOV|CpuFXSR" },
68 { "CPU_PENTIUMPRO_FLAGS",
69 "CPU_I686_FLAGS|CpuNop" },
71 "CPU_PENTIUMPRO_FLAGS|CPU_MMX_FLAGS" },
73 "CPU_P2_FLAGS|CPU_SSE_FLAGS" },
75 "CPU_P3_FLAGS|CpuClflush|CPU_SSE2_FLAGS" },
77 "CPU_GENERIC64_FLAGS|CpuFISTTP|CPU_SSE3_FLAGS|CpuCX16" },
79 "CPU_P4_FLAGS|CpuFISTTP|CPU_SSE3_FLAGS|CpuCX16" },
81 "CPU_NOCONA_FLAGS|CPU_SSSE3_FLAGS" },
83 "CPU_CORE2_FLAGS|CPU_SSE4_2_FLAGS|CpuRdtscp" },
85 "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|CpuSYSCALL|Cpu387|CPU_MMX_FLAGS" },
87 "CPU_K6_FLAGS|Cpu3dnow" },
89 "CPU_K6_2_FLAGS|Cpu686|Cpu687|CpuNop|Cpu3dnowA" },
91 "CPU_ATHLON_FLAGS|CpuRdtscp|CPU_SSE2_FLAGS|CpuLM" },
92 { "CPU_AMDFAM10_FLAGS",
93 "CPU_K8_FLAGS|CpuFISTTP|CPU_SSE4A_FLAGS|CpuLZCNT|CpuPOPCNT" },
95 "CPU_GENERIC64_FLAGS|CpuFISTTP|CpuRdtscp|CpuCX16|CPU_XOP_FLAGS|CpuLZCNT|CpuPOPCNT|CpuLWP|CpuSVME|CpuAES|CpuPCLMUL|CpuPRFCHW" },
97 "CPU_BDVER1_FLAGS|CpuFMA|CpuBMI|CpuTBM|CpuF16C" },
99 "CPU_BDVER2_FLAGS|CpuXsaveopt|CpuFSGSBase" },
100 { "CPU_BDVER4_FLAGS",
101 "CPU_BDVER3_FLAGS|CpuAVX2|CpuMovbe|CpuBMI2|CpuRdRnd|CpuMWAITX" },
102 { "CPU_ZNVER1_FLAGS",
103 "CPU_GENERIC64_FLAGS|CpuFISTTP|CpuRdtscp|CpuCX16|CPU_AVX2_FLAGS|CpuSSE4A|CpuLZCNT|CpuPOPCNT|CpuSVME|CpuAES|CpuPCLMUL|CpuPRFCHW|CpuFMA|CpuBMI|CpuF16C|CpuXsaveopt|CpuFSGSBase|CpuMovbe|CpuBMI2|CpuRdRnd|CpuADX|CpuRdSeed|CpuSMAP|CpuSHA|CpuXSAVEC|CpuXSAVES|CpuClflushOpt|CpuCLZERO|CpuMWAITX" },
104 { "CPU_ZNVER2_FLAGS",
105 "CPU_ZNVER1_FLAGS|CpuCLWB|CpuRDPID|CpuRDPRU|CpuMCOMMIT|CpuWBNOINVD" },
106 { "CPU_BTVER1_FLAGS",
107 "CPU_GENERIC64_FLAGS|CpuFISTTP|CpuCX16|CpuRdtscp|CPU_SSSE3_FLAGS|CpuSSE4A|CpuLZCNT|CpuPOPCNT|CpuPRFCHW|CpuCX16|CpuClflush|CpuFISTTP|CpuSVME" },
108 { "CPU_BTVER2_FLAGS",
109 "CPU_BTVER1_FLAGS|CPU_AVX_FLAGS|CpuBMI|CpuF16C|CpuAES|CpuPCLMUL|CpuMovbe|CpuXsaveopt|CpuPRFCHW" },
117 "CPU_387_FLAGS|Cpu687" },
122 { "CPU_CLFLUSH_FLAGS",
126 { "CPU_SYSCALL_FLAGS",
133 "CPU_SSE_FLAGS|CpuSSE2" },
135 "CPU_SSE2_FLAGS|CpuSSE3" },
137 "CPU_SSE3_FLAGS|CpuSSSE3" },
138 { "CPU_SSE4_1_FLAGS",
139 "CPU_SSSE3_FLAGS|CpuSSE4_1" },
140 { "CPU_SSE4_2_FLAGS",
141 "CPU_SSE4_1_FLAGS|CpuSSE4_2|CpuPOPCNT" },
148 { "CPU_XSAVEOPT_FLAGS",
149 "CPU_XSAVE_FLAGS|CpuXsaveopt" },
151 "CPU_SSE2_FLAGS|CpuAES" },
152 { "CPU_PCLMUL_FLAGS",
153 "CPU_SSE2_FLAGS|CpuPCLMUL" },
155 "CPU_AVX_FLAGS|CpuFMA" },
157 "CPU_AVX_FLAGS|CpuFMA4" },
159 "CPU_SSE4A_FLAGS|CPU_FMA4_FLAGS|CpuXOP" },
161 "CPU_XSAVE_FLAGS|CpuLWP" },
170 { "CPU_RDTSCP_FLAGS",
174 { "CPU_FSGSBASE_FLAGS",
179 "CPU_AVX_FLAGS|CpuF16C" },
184 { "CPU_POPCNT_FLAGS",
190 { "CPU_INVPCID_FLAGS",
192 { "CPU_VMFUNC_FLAGS",
195 "CPU_MMX_FLAGS|Cpu3dnow" },
196 { "CPU_3DNOWA_FLAGS",
197 "CPU_3DNOW_FLAGS|Cpu3dnowA" },
198 { "CPU_PADLOCK_FLAGS",
203 "CPU_SSE3_FLAGS|CpuSSE4a" },
205 "CpuLZCNT|CpuPOPCNT" },
207 "CPU_SSE4_2_FLAGS|CPU_XSAVE_FLAGS|CpuAVX" },
209 "CPU_AVX_FLAGS|CpuAVX2" },
210 { "CPU_AVX512F_FLAGS",
211 "CPU_AVX2_FLAGS|CpuAVX512F" },
212 { "CPU_AVX512CD_FLAGS",
213 "CPU_AVX512F_FLAGS|CpuAVX512CD" },
214 { "CPU_AVX512ER_FLAGS",
215 "CPU_AVX512F_FLAGS|CpuAVX512ER" },
216 { "CPU_AVX512PF_FLAGS",
217 "CPU_AVX512F_FLAGS|CpuAVX512PF" },
218 { "CPU_AVX512DQ_FLAGS",
219 "CPU_AVX512F_FLAGS|CpuAVX512DQ" },
220 { "CPU_AVX512BW_FLAGS",
221 "CPU_AVX512F_FLAGS|CpuAVX512BW" },
222 { "CPU_AVX512VL_FLAGS",
223 "CPU_AVX512F_FLAGS|CpuAVX512VL" },
224 { "CPU_AVX512IFMA_FLAGS",
225 "CPU_AVX512F_FLAGS|CpuAVX512IFMA" },
226 { "CPU_AVX512VBMI_FLAGS",
227 "CPU_AVX512F_FLAGS|CpuAVX512VBMI" },
228 { "CPU_AVX512_4FMAPS_FLAGS",
229 "CPU_AVX512F_FLAGS|CpuAVX512_4FMAPS" },
230 { "CPU_AVX512_4VNNIW_FLAGS",
231 "CPU_AVX512F_FLAGS|CpuAVX512_4VNNIW" },
232 { "CPU_AVX512_VPOPCNTDQ_FLAGS",
233 "CPU_AVX512F_FLAGS|CpuAVX512_VPOPCNTDQ" },
234 { "CPU_AVX512_VBMI2_FLAGS",
235 "CPU_AVX512F_FLAGS|CpuAVX512_VBMI2" },
236 { "CPU_AVX512_VNNI_FLAGS",
237 "CPU_AVX512F_FLAGS|CpuAVX512_VNNI" },
238 { "CPU_AVX512_BITALG_FLAGS",
239 "CPU_AVX512F_FLAGS|CpuAVX512_BITALG" },
240 { "CPU_AVX512_BF16_FLAGS",
241 "CPU_AVX512F_FLAGS|CpuAVX512_BF16" },
247 "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586" },
250 { "CPU_RDSEED_FLAGS",
252 { "CPU_PRFCHW_FLAGS",
257 "CPU_XSAVE_FLAGS|CpuMPX" },
259 "CPU_SSE2_FLAGS|CpuSHA" },
260 { "CPU_CLFLUSHOPT_FLAGS",
262 { "CPU_XSAVES_FLAGS",
263 "CPU_XSAVE_FLAGS|CpuXSAVES" },
264 { "CPU_XSAVEC_FLAGS",
265 "CPU_XSAVE_FLAGS|CpuXSAVEC" },
266 { "CPU_PREFETCHWT1_FLAGS",
272 { "CPU_CLZERO_FLAGS",
274 { "CPU_MWAITX_FLAGS",
277 "CPU_XSAVE_FLAGS|CpuOSPKE" },
280 { "CPU_PTWRITE_FLAGS",
290 { "CPU_VPCLMULQDQ_FLAGS",
292 { "CPU_WBNOINVD_FLAGS",
294 { "CPU_PCONFIG_FLAGS",
296 { "CPU_WAITPKG_FLAGS",
298 { "CPU_CLDEMOTE_FLAGS",
300 { "CPU_MOVDIRI_FLAGS",
302 { "CPU_MOVDIR64B_FLAGS",
304 { "CPU_ENQCMD_FLAGS",
306 { "CPU_AVX512_VP2INTERSECT_FLAGS",
307 "CpuAVX512_VP2INTERSECT" },
310 { "CPU_MCOMMIT_FLAGS",
312 { "CPU_SEV_ES_FLAGS",
314 { "CPU_ANY_X87_FLAGS",
315 "CPU_ANY_287_FLAGS|Cpu8087" },
316 { "CPU_ANY_287_FLAGS",
317 "CPU_ANY_387_FLAGS|Cpu287" },
318 { "CPU_ANY_387_FLAGS",
319 "CPU_ANY_687_FLAGS|Cpu387" },
320 { "CPU_ANY_687_FLAGS",
321 "Cpu687|CpuFISTTP" },
322 { "CPU_ANY_CMOV_FLAGS",
324 { "CPU_ANY_FXSR_FLAGS",
326 { "CPU_ANY_MMX_FLAGS",
327 "CPU_3DNOWA_FLAGS" },
328 { "CPU_ANY_SSE_FLAGS",
329 "CPU_ANY_SSE2_FLAGS|CpuSSE" },
330 { "CPU_ANY_SSE2_FLAGS",
331 "CPU_ANY_SSE3_FLAGS|CpuSSE2" },
332 { "CPU_ANY_SSE3_FLAGS",
333 "CPU_ANY_SSSE3_FLAGS|CpuSSE3|CpuSSE4a" },
334 { "CPU_ANY_SSSE3_FLAGS",
335 "CPU_ANY_SSE4_1_FLAGS|CpuSSSE3" },
336 { "CPU_ANY_SSE4_1_FLAGS",
337 "CPU_ANY_SSE4_2_FLAGS|CpuSSE4_1" },
338 { "CPU_ANY_SSE4_2_FLAGS",
340 { "CPU_ANY_SSE4A_FLAGS",
342 { "CPU_ANY_AVX_FLAGS",
343 "CPU_ANY_AVX2_FLAGS|CpuF16C|CpuFMA|CpuFMA4|CpuXOP|CpuAVX" },
344 { "CPU_ANY_AVX2_FLAGS",
345 "CPU_ANY_AVX512F_FLAGS|CpuAVX2" },
346 { "CPU_ANY_AVX512F_FLAGS",
347 "CpuAVX512F|CpuAVX512CD|CpuAVX512ER|CpuAVX512PF|CpuAVX512DQ|CpuAVX512BW|CpuAVX512VL|CpuAVX512IFMA|CpuAVX512VBMI|CpuAVX512_4FMAPS|CpuAVX512_4VNNIW|CpuAVX512_VPOPCNTDQ|CpuAVX512_VBMI2|CpuAVX512_VNNI|CpuAVX512_BITALG|CpuAVX512_BF16|CpuAVX512_VP2INTERSECT" },
348 { "CPU_ANY_AVX512CD_FLAGS",
350 { "CPU_ANY_AVX512ER_FLAGS",
352 { "CPU_ANY_AVX512PF_FLAGS",
354 { "CPU_ANY_AVX512DQ_FLAGS",
356 { "CPU_ANY_AVX512BW_FLAGS",
358 { "CPU_ANY_AVX512VL_FLAGS",
360 { "CPU_ANY_AVX512IFMA_FLAGS",
362 { "CPU_ANY_AVX512VBMI_FLAGS",
364 { "CPU_ANY_AVX512_4FMAPS_FLAGS",
365 "CpuAVX512_4FMAPS" },
366 { "CPU_ANY_AVX512_4VNNIW_FLAGS",
367 "CpuAVX512_4VNNIW" },
368 { "CPU_ANY_AVX512_VPOPCNTDQ_FLAGS",
369 "CpuAVX512_VPOPCNTDQ" },
370 { "CPU_ANY_IBT_FLAGS",
372 { "CPU_ANY_SHSTK_FLAGS",
374 { "CPU_ANY_AVX512_VBMI2_FLAGS",
376 { "CPU_ANY_AVX512_VNNI_FLAGS",
378 { "CPU_ANY_AVX512_BITALG_FLAGS",
379 "CpuAVX512_BITALG" },
380 { "CPU_ANY_AVX512_BF16_FLAGS",
382 { "CPU_ANY_MOVDIRI_FLAGS",
384 { "CPU_ANY_MOVDIR64B_FLAGS",
386 { "CPU_ANY_ENQCMD_FLAGS",
388 { "CPU_ANY_AVX512_VP2INTERSECT_FLAGS",
389 "CpuAVX512_VP2INTERSECT" },
392 static initializer operand_type_init
[] =
394 { "OPERAND_TYPE_NONE",
396 { "OPERAND_TYPE_REG8",
398 { "OPERAND_TYPE_REG16",
400 { "OPERAND_TYPE_REG32",
402 { "OPERAND_TYPE_REG64",
404 { "OPERAND_TYPE_IMM1",
406 { "OPERAND_TYPE_IMM8",
408 { "OPERAND_TYPE_IMM8S",
410 { "OPERAND_TYPE_IMM16",
412 { "OPERAND_TYPE_IMM32",
414 { "OPERAND_TYPE_IMM32S",
416 { "OPERAND_TYPE_IMM64",
418 { "OPERAND_TYPE_BASEINDEX",
420 { "OPERAND_TYPE_DISP8",
422 { "OPERAND_TYPE_DISP16",
424 { "OPERAND_TYPE_DISP32",
426 { "OPERAND_TYPE_DISP32S",
428 { "OPERAND_TYPE_DISP64",
430 { "OPERAND_TYPE_INOUTPORTREG",
431 "Instance=RegD|Word" },
432 { "OPERAND_TYPE_SHIFTCOUNT",
433 "Instance=RegC|Byte" },
434 { "OPERAND_TYPE_CONTROL",
436 { "OPERAND_TYPE_TEST",
438 { "OPERAND_TYPE_DEBUG",
440 { "OPERAND_TYPE_FLOATREG",
442 { "OPERAND_TYPE_FLOATACC",
443 "Instance=Accum|Tbyte" },
444 { "OPERAND_TYPE_SREG",
446 { "OPERAND_TYPE_REGMMX",
448 { "OPERAND_TYPE_REGXMM",
449 "Class=RegSIMD|Xmmword" },
450 { "OPERAND_TYPE_REGYMM",
451 "Class=RegSIMD|Ymmword" },
452 { "OPERAND_TYPE_REGZMM",
453 "Class=RegSIMD|Zmmword" },
454 { "OPERAND_TYPE_REGMASK",
456 { "OPERAND_TYPE_REGBND",
458 { "OPERAND_TYPE_ACC8",
459 "Instance=Accum|Byte" },
460 { "OPERAND_TYPE_ACC16",
461 "Instance=Accum|Word" },
462 { "OPERAND_TYPE_ACC32",
463 "Instance=Accum|Dword" },
464 { "OPERAND_TYPE_ACC64",
465 "Instance=Accum|Qword" },
466 { "OPERAND_TYPE_DISP16_32",
468 { "OPERAND_TYPE_ANYDISP",
469 "Disp8|Disp16|Disp32|Disp32S|Disp64" },
470 { "OPERAND_TYPE_IMM16_32",
472 { "OPERAND_TYPE_IMM16_32S",
474 { "OPERAND_TYPE_IMM16_32_32S",
475 "Imm16|Imm32|Imm32S" },
476 { "OPERAND_TYPE_IMM32_64",
478 { "OPERAND_TYPE_IMM32_32S_DISP32",
479 "Imm32|Imm32S|Disp32" },
480 { "OPERAND_TYPE_IMM64_DISP64",
482 { "OPERAND_TYPE_IMM32_32S_64_DISP32",
483 "Imm32|Imm32S|Imm64|Disp32" },
484 { "OPERAND_TYPE_IMM32_32S_64_DISP32_64",
485 "Imm32|Imm32S|Imm64|Disp32|Disp64" },
486 { "OPERAND_TYPE_ANYIMM",
487 "Imm1|Imm8|Imm8S|Imm16|Imm32|Imm32S|Imm64" },
490 typedef struct bitfield
497 #define BITFIELD(n) { n, 0, #n }
499 static bitfield cpu_flags
[] =
509 BITFIELD (CpuClflush
),
511 BITFIELD (CpuSYSCALL
),
516 BITFIELD (CpuFISTTP
),
522 BITFIELD (CpuSSE4_1
),
523 BITFIELD (CpuSSE4_2
),
526 BITFIELD (CpuAVX512F
),
527 BITFIELD (CpuAVX512CD
),
528 BITFIELD (CpuAVX512ER
),
529 BITFIELD (CpuAVX512PF
),
530 BITFIELD (CpuAVX512VL
),
531 BITFIELD (CpuAVX512DQ
),
532 BITFIELD (CpuAVX512BW
),
538 BITFIELD (Cpu3dnowA
),
539 BITFIELD (CpuPadLock
),
544 BITFIELD (CpuXsaveopt
),
546 BITFIELD (CpuPCLMUL
),
557 BITFIELD (CpuRdtscp
),
558 BITFIELD (CpuFSGSBase
),
563 BITFIELD (CpuPOPCNT
),
566 BITFIELD (CpuINVPCID
),
567 BITFIELD (CpuVMFUNC
),
568 BITFIELD (CpuRDSEED
),
570 BITFIELD (CpuPRFCHW
),
573 BITFIELD (CpuClflushOpt
),
574 BITFIELD (CpuXSAVES
),
575 BITFIELD (CpuXSAVEC
),
576 BITFIELD (CpuPREFETCHWT1
),
582 BITFIELD (CpuAVX512IFMA
),
583 BITFIELD (CpuAVX512VBMI
),
584 BITFIELD (CpuAVX512_4FMAPS
),
585 BITFIELD (CpuAVX512_4VNNIW
),
586 BITFIELD (CpuAVX512_VPOPCNTDQ
),
587 BITFIELD (CpuAVX512_VBMI2
),
588 BITFIELD (CpuAVX512_VNNI
),
589 BITFIELD (CpuAVX512_BITALG
),
590 BITFIELD (CpuAVX512_BF16
),
591 BITFIELD (CpuAVX512_VP2INTERSECT
),
592 BITFIELD (CpuMWAITX
),
593 BITFIELD (CpuCLZERO
),
596 BITFIELD (CpuPTWRITE
),
601 BITFIELD (CpuVPCLMULQDQ
),
602 BITFIELD (CpuWBNOINVD
),
603 BITFIELD (CpuPCONFIG
),
604 BITFIELD (CpuWAITPKG
),
605 BITFIELD (CpuCLDEMOTE
),
606 BITFIELD (CpuMOVDIRI
),
607 BITFIELD (CpuMOVDIR64B
),
608 BITFIELD (CpuENQCMD
),
610 BITFIELD (CpuMCOMMIT
),
611 BITFIELD (CpuSEV_ES
),
613 BITFIELD (CpuUnused
),
617 static bitfield opcode_modifiers
[] =
627 BITFIELD (CheckRegSize
),
628 BITFIELD (MnemonicSize
),
639 BITFIELD (BNDPrefixOk
),
640 BITFIELD (NoTrackPrefixOk
),
641 BITFIELD (IsLockable
),
642 BITFIELD (RegKludge
),
643 BITFIELD (Implicit1stXmm0
),
644 BITFIELD (RepPrefixOk
),
645 BITFIELD (HLEPrefixOk
),
648 BITFIELD (AddrPrefixOpReg
),
656 BITFIELD (VexOpcode
),
657 BITFIELD (VexSources
),
663 BITFIELD (Broadcast
),
664 BITFIELD (StaticRounding
),
666 BITFIELD (Disp8MemShift
),
667 BITFIELD (NoDefMask
),
668 BITFIELD (ImplicitQuadGroup
),
670 BITFIELD (ATTMnemonic
),
671 BITFIELD (ATTSyntax
),
672 BITFIELD (IntelSyntax
),
676 #define CLASS(n) #n, n
678 static const struct {
680 enum operand_class value
;
681 } operand_classes
[] = {
695 #define INSTANCE(n) #n, n
697 static const struct {
699 enum operand_instance value
;
700 } operand_instances
[] = {
709 static bitfield operand_types
[] =
718 BITFIELD (BaseIndex
),
733 BITFIELD (Unspecified
),
739 static const char *filename
;
740 static i386_cpu_flags active_cpu_flags
;
741 static int active_isstring
;
744 compare (const void *x
, const void *y
)
746 const bitfield
*xp
= (const bitfield
*) x
;
747 const bitfield
*yp
= (const bitfield
*) y
;
748 return xp
->position
- yp
->position
;
752 fail (const char *message
, ...)
756 va_start (args
, message
);
757 fprintf (stderr
, _("%s: error: "), program_name
);
758 vfprintf (stderr
, message
, args
);
764 process_copyright (FILE *fp
)
766 fprintf (fp
, "/* This file is automatically generated by i386-gen. Do not edit! */\n\
767 /* Copyright (C) 2007-2020 Free Software Foundation, Inc.\n\
769 This file is part of the GNU opcodes library.\n\
771 This library is free software; you can redistribute it and/or modify\n\
772 it under the terms of the GNU General Public License as published by\n\
773 the Free Software Foundation; either version 3, or (at your option)\n\
774 any later version.\n\
776 It is distributed in the hope that it will be useful, but WITHOUT\n\
777 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n\
778 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public\n\
779 License for more details.\n\
781 You should have received a copy of the GNU General Public License\n\
782 along with this program; if not, write to the Free Software\n\
783 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,\n\
784 MA 02110-1301, USA. */\n");
787 /* Remove leading white spaces. */
790 remove_leading_whitespaces (char *str
)
792 while (ISSPACE (*str
))
797 /* Remove trailing white spaces. */
800 remove_trailing_whitespaces (char *str
)
802 size_t last
= strlen (str
);
810 if (ISSPACE (str
[last
]))
818 /* Find next field separated by SEP and terminate it. Return a
819 pointer to the one after it. */
822 next_field (char *str
, char sep
, char **next
, char *last
)
826 p
= remove_leading_whitespaces (str
);
827 for (str
= p
; *str
!= sep
&& *str
!= '\0'; str
++);
830 remove_trailing_whitespaces (p
);
840 static void set_bitfield (char *, bitfield
*, int, unsigned int, int);
843 set_bitfield_from_cpu_flag_init (char *f
, bitfield
*array
, unsigned int size
,
846 char *str
, *next
, *last
;
849 for (i
= 0; i
< ARRAY_SIZE (cpu_flag_init
); i
++)
850 if (strcmp (cpu_flag_init
[i
].name
, f
) == 0)
852 /* Turn on selective bits. */
853 char *init
= xstrdup (cpu_flag_init
[i
].init
);
854 last
= init
+ strlen (init
);
855 for (next
= init
; next
&& next
< last
; )
857 str
= next_field (next
, '|', &next
, last
);
859 set_bitfield (str
, array
, 1, size
, lineno
);
869 set_bitfield (char *f
, bitfield
*array
, int value
,
870 unsigned int size
, int lineno
)
874 if (strcmp (f
, "CpuFP") == 0)
876 set_bitfield("Cpu387", array
, value
, size
, lineno
);
877 set_bitfield("Cpu287", array
, value
, size
, lineno
);
880 else if (strcmp (f
, "Mmword") == 0)
882 else if (strcmp (f
, "Oword") == 0)
885 for (i
= 0; i
< size
; i
++)
886 if (strcasecmp (array
[i
].name
, f
) == 0)
888 array
[i
].value
= value
;
894 const char *v
= strchr (f
, '=');
901 for (i
= 0; i
< size
; i
++)
902 if (strncasecmp (array
[i
].name
, f
, n
) == 0)
904 value
= strtol (v
+ 1, &end
, 0);
907 array
[i
].value
= value
;
915 /* Handle CPU_XXX_FLAGS. */
916 if (value
== 1 && !set_bitfield_from_cpu_flag_init (f
, array
, size
, lineno
))
920 fail (_("%s: %d: unknown bitfield: %s\n"), filename
, lineno
, f
);
922 fail (_("unknown bitfield: %s\n"), f
);
926 output_cpu_flags (FILE *table
, bitfield
*flags
, unsigned int size
,
927 int macro
, const char *comma
, const char *indent
)
931 memset (&active_cpu_flags
, 0, sizeof(active_cpu_flags
));
933 fprintf (table
, "%s{ { ", indent
);
935 for (i
= 0; i
< size
- 1; i
++)
937 if (((i
+ 1) % 20) != 0)
938 fprintf (table
, "%d, ", flags
[i
].value
);
940 fprintf (table
, "%d,", flags
[i
].value
);
941 if (((i
+ 1) % 20) == 0)
943 /* We need \\ for macro. */
945 fprintf (table
, " \\\n %s", indent
);
947 fprintf (table
, "\n %s", indent
);
950 active_cpu_flags
.array
[i
/ 32] |= 1U << (i
% 32);
953 fprintf (table
, "%d } }%s\n", flags
[i
].value
, comma
);
957 process_i386_cpu_flag (FILE *table
, char *flag
, int macro
,
958 const char *comma
, const char *indent
,
961 char *str
, *next
, *last
;
963 bitfield flags
[ARRAY_SIZE (cpu_flags
)];
965 /* Copy the default cpu flags. */
966 memcpy (flags
, cpu_flags
, sizeof (cpu_flags
));
968 if (strcasecmp (flag
, "unknown") == 0)
970 /* We turn on everything except for cpu64 in case of
971 CPU_UNKNOWN_FLAGS. */
972 for (i
= 0; i
< ARRAY_SIZE (flags
); i
++)
973 if (flags
[i
].position
!= Cpu64
)
976 else if (flag
[0] == '~')
978 last
= flag
+ strlen (flag
);
985 fail (_("%s: %d: missing `)' in bitfield: %s\n"), filename
,
992 /* First we turn on everything except for cpu64. */
993 for (i
= 0; i
< ARRAY_SIZE (flags
); i
++)
994 if (flags
[i
].position
!= Cpu64
)
997 /* Turn off selective bits. */
998 for (; next
&& next
< last
; )
1000 str
= next_field (next
, '|', &next
, last
);
1002 set_bitfield (str
, flags
, 0, ARRAY_SIZE (flags
), lineno
);
1005 else if (strcmp (flag
, "0"))
1007 /* Turn on selective bits. */
1008 last
= flag
+ strlen (flag
);
1009 for (next
= flag
; next
&& next
< last
; )
1011 str
= next_field (next
, '|', &next
, last
);
1013 set_bitfield (str
, flags
, 1, ARRAY_SIZE (flags
), lineno
);
1017 output_cpu_flags (table
, flags
, ARRAY_SIZE (flags
), macro
,
1022 output_opcode_modifier (FILE *table
, bitfield
*modifier
, unsigned int size
)
1026 fprintf (table
, " { ");
1028 for (i
= 0; i
< size
- 1; i
++)
1030 if (((i
+ 1) % 20) != 0)
1031 fprintf (table
, "%d, ", modifier
[i
].value
);
1033 fprintf (table
, "%d,", modifier
[i
].value
);
1034 if (((i
+ 1) % 20) == 0)
1035 fprintf (table
, "\n ");
1038 fprintf (table
, "%d },\n", modifier
[i
].value
);
1042 adjust_broadcast_modifier (char **opnd
)
1044 char *str
, *next
, *last
, *op
;
1045 int bcst_type
= INT_MAX
;
1047 /* Skip the immediate operand. */
1049 if (strcasecmp(op
, "Imm8") == 0)
1053 last
= op
+ strlen (op
);
1054 for (next
= op
; next
&& next
< last
; )
1056 str
= next_field (next
, '|', &next
, last
);
1059 if (strcasecmp(str
, "Byte") == 0)
1061 /* The smalest broadcast type, no need to check
1063 bcst_type
= BYTE_BROADCAST
;
1066 else if (strcasecmp(str
, "Word") == 0)
1068 if (bcst_type
> WORD_BROADCAST
)
1069 bcst_type
= WORD_BROADCAST
;
1071 else if (strcasecmp(str
, "Dword") == 0)
1073 if (bcst_type
> DWORD_BROADCAST
)
1074 bcst_type
= DWORD_BROADCAST
;
1076 else if (strcasecmp(str
, "Qword") == 0)
1078 if (bcst_type
> QWORD_BROADCAST
)
1079 bcst_type
= QWORD_BROADCAST
;
1085 if (bcst_type
== INT_MAX
)
1086 fail (_("unknown broadcast operand: %s\n"), op
);
1092 process_i386_opcode_modifier (FILE *table
, char *mod
, char **opnd
, int lineno
)
1094 char *str
, *next
, *last
;
1095 bitfield modifiers
[ARRAY_SIZE (opcode_modifiers
)];
1097 active_isstring
= 0;
1099 /* Copy the default opcode modifier. */
1100 memcpy (modifiers
, opcode_modifiers
, sizeof (modifiers
));
1102 if (strcmp (mod
, "0"))
1104 unsigned int have_w
= 0, bwlq_suf
= 0xf;
1106 last
= mod
+ strlen (mod
);
1107 for (next
= mod
; next
&& next
< last
; )
1109 str
= next_field (next
, '|', &next
, last
);
1113 if (strcasecmp(str
, "Broadcast") == 0)
1114 val
= adjust_broadcast_modifier (opnd
);
1115 set_bitfield (str
, modifiers
, val
, ARRAY_SIZE (modifiers
),
1117 if (strcasecmp(str
, "IsString") == 0)
1118 active_isstring
= 1;
1120 if (strcasecmp(str
, "W") == 0)
1123 if (strcasecmp(str
, "No_bSuf") == 0)
1125 if (strcasecmp(str
, "No_wSuf") == 0)
1127 if (strcasecmp(str
, "No_lSuf") == 0)
1129 if (strcasecmp(str
, "No_qSuf") == 0)
1134 if (have_w
&& !bwlq_suf
)
1135 fail ("%s: %d: stray W modifier\n", filename
, lineno
);
1136 if (have_w
&& !(bwlq_suf
& 1))
1137 fprintf (stderr
, "%s: %d: W modifier without Byte operand(s)\n",
1139 if (have_w
&& !(bwlq_suf
& ~1))
1141 "%s: %d: W modifier without Word/Dword/Qword operand(s)\n",
1144 output_opcode_modifier (table
, modifiers
, ARRAY_SIZE (modifiers
));
1154 output_operand_type (FILE *table
, enum operand_class
class,
1155 enum operand_instance instance
,
1156 const bitfield
*types
, unsigned int size
,
1157 enum stage stage
, const char *indent
)
1161 fprintf (table
, "{ { %d, %d, ", class, instance
);
1163 for (i
= 0; i
< size
- 1; i
++)
1165 if (((i
+ 3) % 20) != 0)
1166 fprintf (table
, "%d, ", types
[i
].value
);
1168 fprintf (table
, "%d,", types
[i
].value
);
1169 if (((i
+ 3) % 20) == 0)
1171 /* We need \\ for macro. */
1172 if (stage
== stage_macros
)
1173 fprintf (table
, " \\\n%s", indent
);
1175 fprintf (table
, "\n%s", indent
);
1179 fprintf (table
, "%d } }", types
[i
].value
);
1183 process_i386_operand_type (FILE *table
, char *op
, enum stage stage
,
1184 const char *indent
, int lineno
)
1186 char *str
, *next
, *last
;
1187 enum operand_class
class = ClassNone
;
1188 enum operand_instance instance
= InstanceNone
;
1189 bitfield types
[ARRAY_SIZE (operand_types
)];
1191 /* Copy the default operand type. */
1192 memcpy (types
, operand_types
, sizeof (types
));
1194 if (strcmp (op
, "0"))
1198 last
= op
+ strlen (op
);
1199 for (next
= op
; next
&& next
< last
; )
1201 str
= next_field (next
, '|', &next
, last
);
1206 if (!strncmp(str
, "Class=", 6))
1208 for (i
= 0; i
< ARRAY_SIZE(operand_classes
); ++i
)
1209 if (!strcmp(str
+ 6, operand_classes
[i
].name
))
1211 class = operand_classes
[i
].value
;
1217 if (str
&& !strncmp(str
, "Instance=", 9))
1219 for (i
= 0; i
< ARRAY_SIZE(operand_instances
); ++i
)
1220 if (!strcmp(str
+ 9, operand_instances
[i
].name
))
1222 instance
= operand_instances
[i
].value
;
1230 set_bitfield (str
, types
, 1, ARRAY_SIZE (types
), lineno
);
1231 if (strcasecmp(str
, "BaseIndex") == 0)
1236 if (stage
== stage_opcodes
&& baseindex
&& !active_isstring
)
1238 set_bitfield("Disp8", types
, 1, ARRAY_SIZE (types
), lineno
);
1239 if (!active_cpu_flags
.bitfield
.cpu64
1240 && !active_cpu_flags
.bitfield
.cpumpx
)
1241 set_bitfield("Disp16", types
, 1, ARRAY_SIZE (types
), lineno
);
1242 if (!active_cpu_flags
.bitfield
.cpu64
)
1243 set_bitfield("Disp32", types
, 1, ARRAY_SIZE (types
), lineno
);
1244 if (!active_cpu_flags
.bitfield
.cpuno64
)
1245 set_bitfield("Disp32S", types
, 1, ARRAY_SIZE (types
), lineno
);
1248 output_operand_type (table
, class, instance
, types
, ARRAY_SIZE (types
),
1253 output_i386_opcode (FILE *table
, const char *name
, char *str
,
1254 char *last
, int lineno
)
1257 char *operands
, *base_opcode
, *extension_opcode
, *opcode_length
;
1258 char *cpu_flags
, *opcode_modifier
, *operand_types
[MAX_OPERANDS
];
1260 /* Find number of operands. */
1261 operands
= next_field (str
, ',', &str
, last
);
1263 /* Find base_opcode. */
1264 base_opcode
= next_field (str
, ',', &str
, last
);
1266 /* Find extension_opcode. */
1267 extension_opcode
= next_field (str
, ',', &str
, last
);
1269 /* Find opcode_length. */
1270 opcode_length
= next_field (str
, ',', &str
, last
);
1272 /* Find cpu_flags. */
1273 cpu_flags
= next_field (str
, ',', &str
, last
);
1275 /* Find opcode_modifier. */
1276 opcode_modifier
= next_field (str
, ',', &str
, last
);
1278 /* Remove the first {. */
1279 str
= remove_leading_whitespaces (str
);
1282 str
= remove_leading_whitespaces (str
+ 1);
1286 /* There are at least "X}". */
1290 /* Remove trailing white spaces and }. */
1294 if (ISSPACE (str
[i
]) || str
[i
] == '}')
1303 /* Find operand_types. */
1304 for (i
= 0; i
< ARRAY_SIZE (operand_types
); i
++)
1308 operand_types
[i
] = NULL
;
1312 operand_types
[i
] = next_field (str
, ',', &str
, last
);
1313 if (*operand_types
[i
] == '0')
1316 operand_types
[i
] = NULL
;
1321 fprintf (table
, " { \"%s\", %s, %s, %s, %s,\n",
1322 name
, base_opcode
, extension_opcode
, opcode_length
, operands
);
1324 process_i386_cpu_flag (table
, cpu_flags
, 0, ",", " ", lineno
);
1326 process_i386_opcode_modifier (table
, opcode_modifier
, operand_types
, lineno
);
1328 fprintf (table
, " { ");
1330 for (i
= 0; i
< ARRAY_SIZE (operand_types
); i
++)
1332 if (operand_types
[i
] == NULL
|| *operand_types
[i
] == '0')
1335 process_i386_operand_type (table
, "0", stage_opcodes
, "\t ",
1341 fprintf (table
, ",\n ");
1343 process_i386_operand_type (table
, operand_types
[i
], stage_opcodes
,
1346 fprintf (table
, " } },\n");
1349 struct opcode_hash_entry
1351 struct opcode_hash_entry
*next
;
1357 /* Calculate the hash value of an opcode hash entry P. */
1360 opcode_hash_hash (const void *p
)
1362 struct opcode_hash_entry
*entry
= (struct opcode_hash_entry
*) p
;
1363 return htab_hash_string (entry
->name
);
1366 /* Compare a string Q against an opcode hash entry P. */
1369 opcode_hash_eq (const void *p
, const void *q
)
1371 struct opcode_hash_entry
*entry
= (struct opcode_hash_entry
*) p
;
1372 const char *name
= (const char *) q
;
1373 return strcmp (name
, entry
->name
) == 0;
1377 process_i386_opcodes (FILE *table
)
1382 char *str
, *p
, *last
, *name
;
1383 struct opcode_hash_entry
**hash_slot
, **entry
, *next
;
1384 htab_t opcode_hash_table
;
1385 struct opcode_hash_entry
**opcode_array
;
1386 unsigned int opcode_array_size
= 1024;
1387 int lineno
= 0, marker
= 0;
1389 filename
= "i386-opc.tbl";
1393 opcode_array
= (struct opcode_hash_entry
**)
1394 xmalloc (sizeof (*opcode_array
) * opcode_array_size
);
1396 opcode_hash_table
= htab_create_alloc (16, opcode_hash_hash
,
1397 opcode_hash_eq
, NULL
,
1400 fprintf (table
, "\n/* i386 opcode table. */\n\n");
1401 fprintf (table
, "const insn_template i386_optab[] =\n{\n");
1403 /* Put everything on opcode array. */
1406 if (fgets (buf
, sizeof (buf
), fp
) == NULL
)
1411 p
= remove_leading_whitespaces (buf
);
1413 /* Skip comments. */
1414 str
= strstr (p
, "//");
1418 /* Remove trailing white spaces. */
1419 remove_trailing_whitespaces (p
);
1424 if (!strcmp("### MARKER ###", buf
))
1428 /* Since we ignore all included files (we only care about their
1429 #define-s here), we don't need to monitor filenames. The final
1430 line number directive is going to refer to the main source file
1435 p
= remove_leading_whitespaces (p
+ 1);
1436 if (!strncmp(p
, "line", 4))
1438 ln
= strtoul (p
, &end
, 10);
1439 if (ln
> 1 && ln
< INT_MAX
1440 && *remove_leading_whitespaces (end
) == '"')
1443 /* Ignore comments. */
1453 last
= p
+ strlen (p
);
1456 name
= next_field (p
, ',', &str
, last
);
1458 /* Get the slot in hash table. */
1459 hash_slot
= (struct opcode_hash_entry
**)
1460 htab_find_slot_with_hash (opcode_hash_table
, name
,
1461 htab_hash_string (name
),
1464 if (*hash_slot
== NULL
)
1466 /* It is the new one. Put it on opcode array. */
1467 if (i
>= opcode_array_size
)
1469 /* Grow the opcode array when needed. */
1470 opcode_array_size
+= 1024;
1471 opcode_array
= (struct opcode_hash_entry
**)
1472 xrealloc (opcode_array
,
1473 sizeof (*opcode_array
) * opcode_array_size
);
1476 opcode_array
[i
] = (struct opcode_hash_entry
*)
1477 xmalloc (sizeof (struct opcode_hash_entry
));
1478 opcode_array
[i
]->next
= NULL
;
1479 opcode_array
[i
]->name
= xstrdup (name
);
1480 opcode_array
[i
]->opcode
= xstrdup (str
);
1481 opcode_array
[i
]->lineno
= lineno
;
1482 *hash_slot
= opcode_array
[i
];
1487 /* Append it to the existing one. */
1489 while ((*entry
) != NULL
)
1490 entry
= &(*entry
)->next
;
1491 *entry
= (struct opcode_hash_entry
*)
1492 xmalloc (sizeof (struct opcode_hash_entry
));
1493 (*entry
)->next
= NULL
;
1494 (*entry
)->name
= (*hash_slot
)->name
;
1495 (*entry
)->opcode
= xstrdup (str
);
1496 (*entry
)->lineno
= lineno
;
1500 /* Process opcode array. */
1501 for (j
= 0; j
< i
; j
++)
1503 for (next
= opcode_array
[j
]; next
; next
= next
->next
)
1507 lineno
= next
->lineno
;
1508 last
= str
+ strlen (str
);
1509 output_i386_opcode (table
, name
, str
, last
, lineno
);
1515 fprintf (table
, " { NULL, 0, 0, 0, 0,\n");
1517 process_i386_cpu_flag (table
, "0", 0, ",", " ", -1);
1519 process_i386_opcode_modifier (table
, "0", NULL
, -1);
1521 fprintf (table
, " { ");
1522 process_i386_operand_type (table
, "0", stage_opcodes
, "\t ", -1);
1523 fprintf (table
, " } }\n");
1525 fprintf (table
, "};\n");
1529 process_i386_registers (FILE *table
)
1533 char *str
, *p
, *last
;
1534 char *reg_name
, *reg_type
, *reg_flags
, *reg_num
;
1535 char *dw2_32_num
, *dw2_64_num
;
1538 filename
= "i386-reg.tbl";
1539 fp
= fopen (filename
, "r");
1541 fail (_("can't find i386-reg.tbl for reading, errno = %s\n"),
1544 fprintf (table
, "\n/* i386 register table. */\n\n");
1545 fprintf (table
, "const reg_entry i386_regtab[] =\n{\n");
1549 if (fgets (buf
, sizeof (buf
), fp
) == NULL
)
1554 p
= remove_leading_whitespaces (buf
);
1556 /* Skip comments. */
1557 str
= strstr (p
, "//");
1561 /* Remove trailing white spaces. */
1562 remove_trailing_whitespaces (p
);
1567 fprintf (table
, "%s\n", p
);
1575 last
= p
+ strlen (p
);
1577 /* Find reg_name. */
1578 reg_name
= next_field (p
, ',', &str
, last
);
1580 /* Find reg_type. */
1581 reg_type
= next_field (str
, ',', &str
, last
);
1583 /* Find reg_flags. */
1584 reg_flags
= next_field (str
, ',', &str
, last
);
1587 reg_num
= next_field (str
, ',', &str
, last
);
1589 fprintf (table
, " { \"%s\",\n ", reg_name
);
1591 process_i386_operand_type (table
, reg_type
, stage_registers
, "\t",
1594 /* Find 32-bit Dwarf2 register number. */
1595 dw2_32_num
= next_field (str
, ',', &str
, last
);
1597 /* Find 64-bit Dwarf2 register number. */
1598 dw2_64_num
= next_field (str
, ',', &str
, last
);
1600 fprintf (table
, ",\n %s, %s, { %s, %s } },\n",
1601 reg_flags
, reg_num
, dw2_32_num
, dw2_64_num
);
1606 fprintf (table
, "};\n");
1608 fprintf (table
, "\nconst unsigned int i386_regtab_size = ARRAY_SIZE (i386_regtab);\n");
1612 process_i386_initializers (void)
1615 FILE *fp
= fopen ("i386-init.h", "w");
1619 fail (_("can't create i386-init.h, errno = %s\n"),
1622 process_copyright (fp
);
1624 for (i
= 0; i
< ARRAY_SIZE (cpu_flag_init
); i
++)
1626 fprintf (fp
, "\n#define %s \\\n", cpu_flag_init
[i
].name
);
1627 init
= xstrdup (cpu_flag_init
[i
].init
);
1628 process_i386_cpu_flag (fp
, init
, 1, "", " ", -1);
1632 for (i
= 0; i
< ARRAY_SIZE (operand_type_init
); i
++)
1634 fprintf (fp
, "\n\n#define %s \\\n ", operand_type_init
[i
].name
);
1635 init
= xstrdup (operand_type_init
[i
].init
);
1636 process_i386_operand_type (fp
, init
, stage_macros
, " ", -1);
1644 /* Program options. */
1645 #define OPTION_SRCDIR 200
1647 struct option long_options
[] =
1649 {"srcdir", required_argument
, NULL
, OPTION_SRCDIR
},
1650 {"debug", no_argument
, NULL
, 'd'},
1651 {"version", no_argument
, NULL
, 'V'},
1652 {"help", no_argument
, NULL
, 'h'},
1653 {0, no_argument
, NULL
, 0}
1657 print_version (void)
1659 printf ("%s: version 1.0\n", program_name
);
1664 usage (FILE * stream
, int status
)
1666 fprintf (stream
, "Usage: %s [-V | --version] [-d | --debug] [--srcdir=dirname] [--help]\n",
1672 main (int argc
, char **argv
)
1674 extern int chdir (char *);
1675 char *srcdir
= NULL
;
1677 unsigned int i
, cpumax
;
1680 program_name
= *argv
;
1681 xmalloc_set_program_name (program_name
);
1683 while ((c
= getopt_long (argc
, argv
, "vVdh", long_options
, 0)) != EOF
)
1708 if (chdir (srcdir
) != 0)
1709 fail (_("unable to change directory to \"%s\", errno = %s\n"),
1710 srcdir
, xstrerror (errno
));
1712 /* cpu_flags isn't sorted by position. */
1714 for (i
= 0; i
< ARRAY_SIZE (cpu_flags
); i
++)
1715 if (cpu_flags
[i
].position
> cpumax
)
1716 cpumax
= cpu_flags
[i
].position
;
1718 /* Check the unused bitfield in i386_cpu_flags. */
1720 static_assert (ARRAY_SIZE (cpu_flags
) == CpuMax
+ 2);
1722 if ((cpumax
- 1) != CpuMax
)
1723 fail (_("CpuMax != %d!\n"), cpumax
);
1725 static_assert (ARRAY_SIZE (cpu_flags
) == CpuMax
+ 1);
1727 if (cpumax
!= CpuMax
)
1728 fail (_("CpuMax != %d!\n"), cpumax
);
1730 c
= CpuNumOfBits
- CpuMax
- 1;
1732 fail (_("%d unused bits in i386_cpu_flags.\n"), c
);
1735 static_assert (ARRAY_SIZE (opcode_modifiers
) == Opcode_Modifier_Num
);
1737 /* Check the unused bitfield in i386_operand_type. */
1739 static_assert (ARRAY_SIZE (operand_types
) + CLASS_WIDTH
+ INSTANCE_WIDTH
1742 static_assert (ARRAY_SIZE (operand_types
) + CLASS_WIDTH
+ INSTANCE_WIDTH
1745 c
= OTNumOfBits
- OTNum
;
1747 fail (_("%d unused bits in i386_operand_type.\n"), c
);
1750 qsort (cpu_flags
, ARRAY_SIZE (cpu_flags
), sizeof (cpu_flags
[0]),
1753 qsort (opcode_modifiers
, ARRAY_SIZE (opcode_modifiers
),
1754 sizeof (opcode_modifiers
[0]), compare
);
1756 qsort (operand_types
, ARRAY_SIZE (operand_types
),
1757 sizeof (operand_types
[0]), compare
);
1759 table
= fopen ("i386-tbl.h", "w");
1761 fail (_("can't create i386-tbl.h, errno = %s\n"),
1764 process_copyright (table
);
1766 process_i386_opcodes (table
);
1767 process_i386_registers (table
);
1768 process_i386_initializers ();