1 /* Copyright (C) 2007-2019 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|CpuABM" },
95 "CPU_GENERIC64_FLAGS|CpuFISTTP|CpuRdtscp|CpuCX16|CPU_XOP_FLAGS|CpuABM|CpuLWP|CpuSVME|CpuAES|CpuPCLMUL|CpuLZCNT|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|CpuABM|CpuSVME|CpuAES|CpuPCLMUL|CpuLZCNT|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|CpuABM|CpuPRFCHW|CpuCX16|CpuClflush|CpuFISTTP|CpuSVME|CpuLZCNT" },
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" },
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" },
188 { "CPU_INVPCID_FLAGS",
190 { "CPU_VMFUNC_FLAGS",
193 "CPU_MMX_FLAGS|Cpu3dnow" },
194 { "CPU_3DNOWA_FLAGS",
195 "CPU_3DNOW_FLAGS|Cpu3dnowA" },
196 { "CPU_PADLOCK_FLAGS",
201 "CPU_SSE3_FLAGS|CpuSSE4a" },
205 "CPU_SSE4_2_FLAGS|CPU_XSAVE_FLAGS|CpuAVX" },
207 "CPU_AVX_FLAGS|CpuAVX2" },
208 { "CPU_AVX512F_FLAGS",
209 "CPU_AVX2_FLAGS|CpuAVX512F" },
210 { "CPU_AVX512CD_FLAGS",
211 "CPU_AVX512F_FLAGS|CpuAVX512CD" },
212 { "CPU_AVX512ER_FLAGS",
213 "CPU_AVX512F_FLAGS|CpuAVX512ER" },
214 { "CPU_AVX512PF_FLAGS",
215 "CPU_AVX512F_FLAGS|CpuAVX512PF" },
216 { "CPU_AVX512DQ_FLAGS",
217 "CPU_AVX512F_FLAGS|CpuAVX512DQ" },
218 { "CPU_AVX512BW_FLAGS",
219 "CPU_AVX512F_FLAGS|CpuAVX512BW" },
220 { "CPU_AVX512VL_FLAGS",
221 "CPU_AVX512F_FLAGS|CpuAVX512VL" },
222 { "CPU_AVX512IFMA_FLAGS",
223 "CPU_AVX512F_FLAGS|CpuAVX512IFMA" },
224 { "CPU_AVX512VBMI_FLAGS",
225 "CPU_AVX512F_FLAGS|CpuAVX512VBMI" },
226 { "CPU_AVX512_4FMAPS_FLAGS",
227 "CPU_AVX512F_FLAGS|CpuAVX512_4FMAPS" },
228 { "CPU_AVX512_4VNNIW_FLAGS",
229 "CPU_AVX512F_FLAGS|CpuAVX512_4VNNIW" },
230 { "CPU_AVX512_VPOPCNTDQ_FLAGS",
231 "CPU_AVX512F_FLAGS|CpuAVX512_VPOPCNTDQ" },
232 { "CPU_AVX512_VBMI2_FLAGS",
233 "CPU_AVX512F_FLAGS|CpuAVX512_VBMI2" },
234 { "CPU_AVX512_VNNI_FLAGS",
235 "CPU_AVX512F_FLAGS|CpuAVX512_VNNI" },
236 { "CPU_AVX512_BITALG_FLAGS",
237 "CPU_AVX512F_FLAGS|CpuAVX512_BITALG" },
238 { "CPU_AVX512_BF16_FLAGS",
239 "CPU_AVX512F_FLAGS|CpuAVX512_BF16" },
245 "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586" },
248 { "CPU_RDSEED_FLAGS",
250 { "CPU_PRFCHW_FLAGS",
255 "CPU_XSAVE_FLAGS|CpuMPX" },
257 "CPU_SSE2_FLAGS|CpuSHA" },
258 { "CPU_CLFLUSHOPT_FLAGS",
260 { "CPU_XSAVES_FLAGS",
261 "CPU_XSAVE_FLAGS|CpuXSAVES" },
262 { "CPU_XSAVEC_FLAGS",
263 "CPU_XSAVE_FLAGS|CpuXSAVEC" },
264 { "CPU_PREFETCHWT1_FLAGS",
270 { "CPU_CLZERO_FLAGS",
272 { "CPU_MWAITX_FLAGS",
275 "CPU_XSAVE_FLAGS|CpuOSPKE" },
278 { "CPU_PTWRITE_FLAGS",
288 { "CPU_VPCLMULQDQ_FLAGS",
290 { "CPU_WBNOINVD_FLAGS",
292 { "CPU_PCONFIG_FLAGS",
294 { "CPU_WAITPKG_FLAGS",
296 { "CPU_CLDEMOTE_FLAGS",
298 { "CPU_MOVDIRI_FLAGS",
300 { "CPU_MOVDIR64B_FLAGS",
302 { "CPU_ENQCMD_FLAGS",
304 { "CPU_AVX512_VP2INTERSECT_FLAGS",
305 "CpuAVX512_VP2INTERSECT" },
308 { "CPU_MCOMMIT_FLAGS",
310 { "CPU_ANY_X87_FLAGS",
311 "CPU_ANY_287_FLAGS|Cpu8087" },
312 { "CPU_ANY_287_FLAGS",
313 "CPU_ANY_387_FLAGS|Cpu287" },
314 { "CPU_ANY_387_FLAGS",
315 "CPU_ANY_687_FLAGS|Cpu387" },
316 { "CPU_ANY_687_FLAGS",
317 "Cpu687|CpuFISTTP" },
318 { "CPU_ANY_CMOV_FLAGS",
320 { "CPU_ANY_FXSR_FLAGS",
322 { "CPU_ANY_MMX_FLAGS",
323 "CPU_3DNOWA_FLAGS" },
324 { "CPU_ANY_SSE_FLAGS",
325 "CPU_ANY_SSE2_FLAGS|CpuSSE|CpuSSE4a" },
326 { "CPU_ANY_SSE2_FLAGS",
327 "CPU_ANY_SSE3_FLAGS|CpuSSE2" },
328 { "CPU_ANY_SSE3_FLAGS",
329 "CPU_ANY_SSSE3_FLAGS|CpuSSE3" },
330 { "CPU_ANY_SSSE3_FLAGS",
331 "CPU_ANY_SSE4_1_FLAGS|CpuSSSE3" },
332 { "CPU_ANY_SSE4_1_FLAGS",
333 "CPU_ANY_SSE4_2_FLAGS|CpuSSE4_1" },
334 { "CPU_ANY_SSE4_2_FLAGS",
336 { "CPU_ANY_AVX_FLAGS",
337 "CPU_ANY_AVX2_FLAGS|CpuF16C|CpuFMA|CpuFMA4|CpuXOP|CpuAVX" },
338 { "CPU_ANY_AVX2_FLAGS",
339 "CPU_ANY_AVX512F_FLAGS|CpuAVX2" },
340 { "CPU_ANY_AVX512F_FLAGS",
341 "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" },
342 { "CPU_ANY_AVX512CD_FLAGS",
344 { "CPU_ANY_AVX512ER_FLAGS",
346 { "CPU_ANY_AVX512PF_FLAGS",
348 { "CPU_ANY_AVX512DQ_FLAGS",
350 { "CPU_ANY_AVX512BW_FLAGS",
352 { "CPU_ANY_AVX512VL_FLAGS",
354 { "CPU_ANY_AVX512IFMA_FLAGS",
356 { "CPU_ANY_AVX512VBMI_FLAGS",
358 { "CPU_ANY_AVX512_4FMAPS_FLAGS",
359 "CpuAVX512_4FMAPS" },
360 { "CPU_ANY_AVX512_4VNNIW_FLAGS",
361 "CpuAVX512_4VNNIW" },
362 { "CPU_ANY_AVX512_VPOPCNTDQ_FLAGS",
363 "CpuAVX512_VPOPCNTDQ" },
364 { "CPU_ANY_IBT_FLAGS",
366 { "CPU_ANY_SHSTK_FLAGS",
368 { "CPU_ANY_AVX512_VBMI2_FLAGS",
370 { "CPU_ANY_AVX512_VNNI_FLAGS",
372 { "CPU_ANY_AVX512_BITALG_FLAGS",
373 "CpuAVX512_BITALG" },
374 { "CPU_ANY_AVX512_BF16_FLAGS",
376 { "CPU_ANY_MOVDIRI_FLAGS",
378 { "CPU_ANY_MOVDIR64B_FLAGS",
380 { "CPU_ANY_ENQCMD_FLAGS",
382 { "CPU_ANY_AVX512_VP2INTERSECT_FLAGS",
383 "CpuAVX512_VP2INTERSECT" },
386 static initializer operand_type_init
[] =
388 { "OPERAND_TYPE_NONE",
390 { "OPERAND_TYPE_REG8",
392 { "OPERAND_TYPE_REG16",
394 { "OPERAND_TYPE_REG32",
396 { "OPERAND_TYPE_REG64",
398 { "OPERAND_TYPE_IMM1",
400 { "OPERAND_TYPE_IMM8",
402 { "OPERAND_TYPE_IMM8S",
404 { "OPERAND_TYPE_IMM16",
406 { "OPERAND_TYPE_IMM32",
408 { "OPERAND_TYPE_IMM32S",
410 { "OPERAND_TYPE_IMM64",
412 { "OPERAND_TYPE_BASEINDEX",
414 { "OPERAND_TYPE_DISP8",
416 { "OPERAND_TYPE_DISP16",
418 { "OPERAND_TYPE_DISP32",
420 { "OPERAND_TYPE_DISP32S",
422 { "OPERAND_TYPE_DISP64",
424 { "OPERAND_TYPE_INOUTPORTREG",
425 "Instance=RegD|Word" },
426 { "OPERAND_TYPE_SHIFTCOUNT",
427 "Instance=RegC|Byte" },
428 { "OPERAND_TYPE_CONTROL",
430 { "OPERAND_TYPE_TEST",
432 { "OPERAND_TYPE_DEBUG",
434 { "OPERAND_TYPE_FLOATREG",
436 { "OPERAND_TYPE_FLOATACC",
437 "Instance=Accum|Tbyte" },
438 { "OPERAND_TYPE_SREG",
440 { "OPERAND_TYPE_JUMPABSOLUTE",
442 { "OPERAND_TYPE_REGMMX",
444 { "OPERAND_TYPE_REGXMM",
445 "Class=RegSIMD|Xmmword" },
446 { "OPERAND_TYPE_REGYMM",
447 "Class=RegSIMD|Ymmword" },
448 { "OPERAND_TYPE_REGZMM",
449 "Class=RegSIMD|Zmmword" },
450 { "OPERAND_TYPE_REGMASK",
452 { "OPERAND_TYPE_REGBND",
454 { "OPERAND_TYPE_ESSEG",
456 { "OPERAND_TYPE_ACC8",
457 "Instance=Accum|Byte" },
458 { "OPERAND_TYPE_ACC16",
459 "Instance=Accum|Word" },
460 { "OPERAND_TYPE_ACC32",
461 "Instance=Accum|Dword" },
462 { "OPERAND_TYPE_ACC64",
463 "Instance=Accum|Qword" },
464 { "OPERAND_TYPE_DISP16_32",
466 { "OPERAND_TYPE_ANYDISP",
467 "Disp8|Disp16|Disp32|Disp32S|Disp64" },
468 { "OPERAND_TYPE_IMM16_32",
470 { "OPERAND_TYPE_IMM16_32S",
472 { "OPERAND_TYPE_IMM16_32_32S",
473 "Imm16|Imm32|Imm32S" },
474 { "OPERAND_TYPE_IMM32_64",
476 { "OPERAND_TYPE_IMM32_32S_DISP32",
477 "Imm32|Imm32S|Disp32" },
478 { "OPERAND_TYPE_IMM64_DISP64",
480 { "OPERAND_TYPE_IMM32_32S_64_DISP32",
481 "Imm32|Imm32S|Imm64|Disp32" },
482 { "OPERAND_TYPE_IMM32_32S_64_DISP32_64",
483 "Imm32|Imm32S|Imm64|Disp32|Disp64" },
484 { "OPERAND_TYPE_ANYIMM",
485 "Imm1|Imm8|Imm8S|Imm16|Imm32|Imm32S|Imm64" },
488 typedef struct bitfield
495 #define BITFIELD(n) { n, 0, #n }
497 static bitfield cpu_flags
[] =
507 BITFIELD (CpuClflush
),
509 BITFIELD (CpuSYSCALL
),
514 BITFIELD (CpuFISTTP
),
520 BITFIELD (CpuSSE4_1
),
521 BITFIELD (CpuSSE4_2
),
524 BITFIELD (CpuAVX512F
),
525 BITFIELD (CpuAVX512CD
),
526 BITFIELD (CpuAVX512ER
),
527 BITFIELD (CpuAVX512PF
),
528 BITFIELD (CpuAVX512VL
),
529 BITFIELD (CpuAVX512DQ
),
530 BITFIELD (CpuAVX512BW
),
536 BITFIELD (Cpu3dnowA
),
537 BITFIELD (CpuPadLock
),
543 BITFIELD (CpuXsaveopt
),
545 BITFIELD (CpuPCLMUL
),
556 BITFIELD (CpuRdtscp
),
557 BITFIELD (CpuFSGSBase
),
564 BITFIELD (CpuINVPCID
),
565 BITFIELD (CpuVMFUNC
),
566 BITFIELD (CpuRDSEED
),
568 BITFIELD (CpuPRFCHW
),
571 BITFIELD (CpuClflushOpt
),
572 BITFIELD (CpuXSAVES
),
573 BITFIELD (CpuXSAVEC
),
574 BITFIELD (CpuPREFETCHWT1
),
580 BITFIELD (CpuAVX512IFMA
),
581 BITFIELD (CpuAVX512VBMI
),
582 BITFIELD (CpuAVX512_4FMAPS
),
583 BITFIELD (CpuAVX512_4VNNIW
),
584 BITFIELD (CpuAVX512_VPOPCNTDQ
),
585 BITFIELD (CpuAVX512_VBMI2
),
586 BITFIELD (CpuAVX512_VNNI
),
587 BITFIELD (CpuAVX512_BITALG
),
588 BITFIELD (CpuAVX512_BF16
),
589 BITFIELD (CpuAVX512_VP2INTERSECT
),
590 BITFIELD (CpuMWAITX
),
591 BITFIELD (CpuCLZERO
),
594 BITFIELD (CpuPTWRITE
),
599 BITFIELD (CpuVPCLMULQDQ
),
600 BITFIELD (CpuWBNOINVD
),
601 BITFIELD (CpuPCONFIG
),
602 BITFIELD (CpuWAITPKG
),
603 BITFIELD (CpuCLDEMOTE
),
604 BITFIELD (CpuMOVDIRI
),
605 BITFIELD (CpuMOVDIR64B
),
606 BITFIELD (CpuENQCMD
),
608 BITFIELD (CpuMCOMMIT
),
610 BITFIELD (CpuUnused
),
614 static bitfield opcode_modifiers
[] =
620 BITFIELD (ShortForm
),
622 BITFIELD (JumpDword
),
624 BITFIELD (JumpInterSegment
),
628 BITFIELD (CheckRegSize
),
629 BITFIELD (IgnoreSize
),
630 BITFIELD (DefaultSize
),
640 BITFIELD (BNDPrefixOk
),
641 BITFIELD (NoTrackPrefixOk
),
642 BITFIELD (IsLockable
),
643 BITFIELD (RegKludge
),
644 BITFIELD (Implicit1stXmm0
),
645 BITFIELD (RepPrefixOk
),
646 BITFIELD (HLEPrefixOk
),
649 BITFIELD (AddrPrefixOpReg
),
658 BITFIELD (VexOpcode
),
659 BITFIELD (VexSources
),
665 BITFIELD (Broadcast
),
666 BITFIELD (StaticRounding
),
668 BITFIELD (Disp8MemShift
),
669 BITFIELD (NoDefMask
),
670 BITFIELD (ImplicitQuadGroup
),
672 BITFIELD (ATTMnemonic
),
673 BITFIELD (ATTSyntax
),
674 BITFIELD (IntelSyntax
),
679 #define CLASS(n) #n, n
681 static const struct {
683 enum operand_class value
;
684 } operand_classes
[] = {
698 #define INSTANCE(n) #n, n
700 static const struct {
702 enum operand_instance value
;
703 } operand_instances
[] = {
712 static bitfield operand_types
[] =
721 BITFIELD (BaseIndex
),
727 BITFIELD (JumpAbsolute
),
738 BITFIELD (Unspecified
),
745 static const char *filename
;
746 static i386_cpu_flags active_cpu_flags
;
747 static int active_isstring
;
750 compare (const void *x
, const void *y
)
752 const bitfield
*xp
= (const bitfield
*) x
;
753 const bitfield
*yp
= (const bitfield
*) y
;
754 return xp
->position
- yp
->position
;
758 fail (const char *message
, ...)
762 va_start (args
, message
);
763 fprintf (stderr
, _("%s: error: "), program_name
);
764 vfprintf (stderr
, message
, args
);
770 process_copyright (FILE *fp
)
772 fprintf (fp
, "/* This file is automatically generated by i386-gen. Do not edit! */\n\
773 /* Copyright (C) 2007-2019 Free Software Foundation, Inc.\n\
775 This file is part of the GNU opcodes library.\n\
777 This library is free software; you can redistribute it and/or modify\n\
778 it under the terms of the GNU General Public License as published by\n\
779 the Free Software Foundation; either version 3, or (at your option)\n\
780 any later version.\n\
782 It is distributed in the hope that it will be useful, but WITHOUT\n\
783 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n\
784 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public\n\
785 License for more details.\n\
787 You should have received a copy of the GNU General Public License\n\
788 along with this program; if not, write to the Free Software\n\
789 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,\n\
790 MA 02110-1301, USA. */\n");
793 /* Remove leading white spaces. */
796 remove_leading_whitespaces (char *str
)
798 while (ISSPACE (*str
))
803 /* Remove trailing white spaces. */
806 remove_trailing_whitespaces (char *str
)
808 size_t last
= strlen (str
);
816 if (ISSPACE (str
[last
]))
824 /* Find next field separated by SEP and terminate it. Return a
825 pointer to the one after it. */
828 next_field (char *str
, char sep
, char **next
, char *last
)
832 p
= remove_leading_whitespaces (str
);
833 for (str
= p
; *str
!= sep
&& *str
!= '\0'; str
++);
836 remove_trailing_whitespaces (p
);
846 static void set_bitfield (char *, bitfield
*, int, unsigned int, int);
849 set_bitfield_from_cpu_flag_init (char *f
, bitfield
*array
, unsigned int size
,
852 char *str
, *next
, *last
;
855 for (i
= 0; i
< ARRAY_SIZE (cpu_flag_init
); i
++)
856 if (strcmp (cpu_flag_init
[i
].name
, f
) == 0)
858 /* Turn on selective bits. */
859 char *init
= xstrdup (cpu_flag_init
[i
].init
);
860 last
= init
+ strlen (init
);
861 for (next
= init
; next
&& next
< last
; )
863 str
= next_field (next
, '|', &next
, last
);
865 set_bitfield (str
, array
, 1, size
, lineno
);
875 set_bitfield (char *f
, bitfield
*array
, int value
,
876 unsigned int size
, int lineno
)
880 if (strcmp (f
, "CpuFP") == 0)
882 set_bitfield("Cpu387", array
, value
, size
, lineno
);
883 set_bitfield("Cpu287", array
, value
, size
, lineno
);
886 else if (strcmp (f
, "Mmword") == 0)
888 else if (strcmp (f
, "Oword") == 0)
891 for (i
= 0; i
< size
; i
++)
892 if (strcasecmp (array
[i
].name
, f
) == 0)
894 array
[i
].value
= value
;
900 const char *v
= strchr (f
, '=');
907 for (i
= 0; i
< size
; i
++)
908 if (strncasecmp (array
[i
].name
, f
, n
) == 0)
910 value
= strtol (v
+ 1, &end
, 0);
913 array
[i
].value
= value
;
921 /* Handle CPU_XXX_FLAGS. */
922 if (value
== 1 && !set_bitfield_from_cpu_flag_init (f
, array
, size
, lineno
))
926 fail (_("%s: %d: unknown bitfield: %s\n"), filename
, lineno
, f
);
928 fail (_("unknown bitfield: %s\n"), f
);
932 output_cpu_flags (FILE *table
, bitfield
*flags
, unsigned int size
,
933 int macro
, const char *comma
, const char *indent
)
937 memset (&active_cpu_flags
, 0, sizeof(active_cpu_flags
));
939 fprintf (table
, "%s{ { ", indent
);
941 for (i
= 0; i
< size
- 1; i
++)
943 if (((i
+ 1) % 20) != 0)
944 fprintf (table
, "%d, ", flags
[i
].value
);
946 fprintf (table
, "%d,", flags
[i
].value
);
947 if (((i
+ 1) % 20) == 0)
949 /* We need \\ for macro. */
951 fprintf (table
, " \\\n %s", indent
);
953 fprintf (table
, "\n %s", indent
);
956 active_cpu_flags
.array
[i
/ 32] |= 1U << (i
% 32);
959 fprintf (table
, "%d } }%s\n", flags
[i
].value
, comma
);
963 process_i386_cpu_flag (FILE *table
, char *flag
, int macro
,
964 const char *comma
, const char *indent
,
967 char *str
, *next
, *last
;
969 bitfield flags
[ARRAY_SIZE (cpu_flags
)];
971 /* Copy the default cpu flags. */
972 memcpy (flags
, cpu_flags
, sizeof (cpu_flags
));
974 if (strcasecmp (flag
, "unknown") == 0)
976 /* We turn on everything except for cpu64 in case of
977 CPU_UNKNOWN_FLAGS. */
978 for (i
= 0; i
< ARRAY_SIZE (flags
); i
++)
979 if (flags
[i
].position
!= Cpu64
)
982 else if (flag
[0] == '~')
984 last
= flag
+ strlen (flag
);
991 fail (_("%s: %d: missing `)' in bitfield: %s\n"), filename
,
998 /* First we turn on everything except for cpu64. */
999 for (i
= 0; i
< ARRAY_SIZE (flags
); i
++)
1000 if (flags
[i
].position
!= Cpu64
)
1003 /* Turn off selective bits. */
1004 for (; next
&& next
< last
; )
1006 str
= next_field (next
, '|', &next
, last
);
1008 set_bitfield (str
, flags
, 0, ARRAY_SIZE (flags
), lineno
);
1011 else if (strcmp (flag
, "0"))
1013 /* Turn on selective bits. */
1014 last
= flag
+ strlen (flag
);
1015 for (next
= flag
; next
&& next
< last
; )
1017 str
= next_field (next
, '|', &next
, last
);
1019 set_bitfield (str
, flags
, 1, ARRAY_SIZE (flags
), lineno
);
1023 output_cpu_flags (table
, flags
, ARRAY_SIZE (flags
), macro
,
1028 output_opcode_modifier (FILE *table
, bitfield
*modifier
, unsigned int size
)
1032 fprintf (table
, " { ");
1034 for (i
= 0; i
< size
- 1; i
++)
1036 if (((i
+ 1) % 20) != 0)
1037 fprintf (table
, "%d, ", modifier
[i
].value
);
1039 fprintf (table
, "%d,", modifier
[i
].value
);
1040 if (((i
+ 1) % 20) == 0)
1041 fprintf (table
, "\n ");
1044 fprintf (table
, "%d },\n", modifier
[i
].value
);
1048 adjust_broadcast_modifier (char **opnd
)
1050 char *str
, *next
, *last
, *op
;
1051 int bcst_type
= INT_MAX
;
1053 /* Skip the immediate operand. */
1055 if (strcasecmp(op
, "Imm8") == 0)
1059 last
= op
+ strlen (op
);
1060 for (next
= op
; next
&& next
< last
; )
1062 str
= next_field (next
, '|', &next
, last
);
1065 if (strcasecmp(str
, "Byte") == 0)
1067 /* The smalest broadcast type, no need to check
1069 bcst_type
= BYTE_BROADCAST
;
1072 else if (strcasecmp(str
, "Word") == 0)
1074 if (bcst_type
> WORD_BROADCAST
)
1075 bcst_type
= WORD_BROADCAST
;
1077 else if (strcasecmp(str
, "Dword") == 0)
1079 if (bcst_type
> DWORD_BROADCAST
)
1080 bcst_type
= DWORD_BROADCAST
;
1082 else if (strcasecmp(str
, "Qword") == 0)
1084 if (bcst_type
> QWORD_BROADCAST
)
1085 bcst_type
= QWORD_BROADCAST
;
1091 if (bcst_type
== INT_MAX
)
1092 fail (_("unknown broadcast operand: %s\n"), op
);
1098 process_i386_opcode_modifier (FILE *table
, char *mod
, char **opnd
, int lineno
)
1100 char *str
, *next
, *last
;
1101 bitfield modifiers
[ARRAY_SIZE (opcode_modifiers
)];
1103 active_isstring
= 0;
1105 /* Copy the default opcode modifier. */
1106 memcpy (modifiers
, opcode_modifiers
, sizeof (modifiers
));
1108 if (strcmp (mod
, "0"))
1110 unsigned int have_w
= 0, bwlq_suf
= 0xf;
1112 last
= mod
+ strlen (mod
);
1113 for (next
= mod
; next
&& next
< last
; )
1115 str
= next_field (next
, '|', &next
, last
);
1119 if (strcasecmp(str
, "Broadcast") == 0)
1120 val
= adjust_broadcast_modifier (opnd
);
1121 set_bitfield (str
, modifiers
, val
, ARRAY_SIZE (modifiers
),
1123 if (strcasecmp(str
, "IsString") == 0)
1124 active_isstring
= 1;
1126 if (strcasecmp(str
, "W") == 0)
1129 if (strcasecmp(str
, "No_bSuf") == 0)
1131 if (strcasecmp(str
, "No_wSuf") == 0)
1133 if (strcasecmp(str
, "No_lSuf") == 0)
1135 if (strcasecmp(str
, "No_qSuf") == 0)
1140 if (have_w
&& !bwlq_suf
)
1141 fail ("%s: %d: stray W modifier\n", filename
, lineno
);
1142 if (have_w
&& !(bwlq_suf
& 1))
1143 fprintf (stderr
, "%s: %d: W modifier without Byte operand(s)\n",
1145 if (have_w
&& !(bwlq_suf
& ~1))
1147 "%s: %d: W modifier without Word/Dword/Qword operand(s)\n",
1150 output_opcode_modifier (table
, modifiers
, ARRAY_SIZE (modifiers
));
1160 output_operand_type (FILE *table
, enum operand_class
class,
1161 enum operand_instance instance
,
1162 const bitfield
*types
, unsigned int size
,
1163 enum stage stage
, const char *indent
)
1167 fprintf (table
, "{ { %d, %d, ", class, instance
);
1169 for (i
= 0; i
< size
- 1; i
++)
1171 if (((i
+ 3) % 20) != 0)
1172 fprintf (table
, "%d, ", types
[i
].value
);
1174 fprintf (table
, "%d,", types
[i
].value
);
1175 if (((i
+ 3) % 20) == 0)
1177 /* We need \\ for macro. */
1178 if (stage
== stage_macros
)
1179 fprintf (table
, " \\\n%s", indent
);
1181 fprintf (table
, "\n%s", indent
);
1185 fprintf (table
, "%d } }", types
[i
].value
);
1189 process_i386_operand_type (FILE *table
, char *op
, enum stage stage
,
1190 const char *indent
, int lineno
)
1192 char *str
, *next
, *last
;
1193 enum operand_class
class = ClassNone
;
1194 enum operand_instance instance
= InstanceNone
;
1195 bitfield types
[ARRAY_SIZE (operand_types
)];
1197 /* Copy the default operand type. */
1198 memcpy (types
, operand_types
, sizeof (types
));
1200 if (strcmp (op
, "0"))
1204 last
= op
+ strlen (op
);
1205 for (next
= op
; next
&& next
< last
; )
1207 str
= next_field (next
, '|', &next
, last
);
1212 if (!strncmp(str
, "Class=", 6))
1214 for (i
= 0; i
< ARRAY_SIZE(operand_classes
); ++i
)
1215 if (!strcmp(str
+ 6, operand_classes
[i
].name
))
1217 class = operand_classes
[i
].value
;
1223 if (str
&& !strncmp(str
, "Instance=", 9))
1225 for (i
= 0; i
< ARRAY_SIZE(operand_instances
); ++i
)
1226 if (!strcmp(str
+ 9, operand_instances
[i
].name
))
1228 instance
= operand_instances
[i
].value
;
1236 set_bitfield (str
, types
, 1, ARRAY_SIZE (types
), lineno
);
1237 if (strcasecmp(str
, "BaseIndex") == 0)
1242 if (stage
== stage_opcodes
&& baseindex
&& !active_isstring
)
1244 set_bitfield("Disp8", types
, 1, ARRAY_SIZE (types
), lineno
);
1245 if (!active_cpu_flags
.bitfield
.cpu64
1246 && !active_cpu_flags
.bitfield
.cpumpx
)
1247 set_bitfield("Disp16", types
, 1, ARRAY_SIZE (types
), lineno
);
1248 set_bitfield("Disp32", types
, 1, ARRAY_SIZE (types
), lineno
);
1249 if (!active_cpu_flags
.bitfield
.cpuno64
)
1250 set_bitfield("Disp32S", types
, 1, ARRAY_SIZE (types
), lineno
);
1253 output_operand_type (table
, class, instance
, types
, ARRAY_SIZE (types
),
1258 output_i386_opcode (FILE *table
, const char *name
, char *str
,
1259 char *last
, int lineno
)
1262 char *operands
, *base_opcode
, *extension_opcode
, *opcode_length
;
1263 char *cpu_flags
, *opcode_modifier
, *operand_types
[MAX_OPERANDS
];
1265 /* Find number of operands. */
1266 operands
= next_field (str
, ',', &str
, last
);
1268 /* Find base_opcode. */
1269 base_opcode
= next_field (str
, ',', &str
, last
);
1271 /* Find extension_opcode. */
1272 extension_opcode
= next_field (str
, ',', &str
, last
);
1274 /* Find opcode_length. */
1275 opcode_length
= next_field (str
, ',', &str
, last
);
1277 /* Find cpu_flags. */
1278 cpu_flags
= next_field (str
, ',', &str
, last
);
1280 /* Find opcode_modifier. */
1281 opcode_modifier
= next_field (str
, ',', &str
, last
);
1283 /* Remove the first {. */
1284 str
= remove_leading_whitespaces (str
);
1287 str
= remove_leading_whitespaces (str
+ 1);
1291 /* There are at least "X}". */
1295 /* Remove trailing white spaces and }. */
1299 if (ISSPACE (str
[i
]) || str
[i
] == '}')
1308 /* Find operand_types. */
1309 for (i
= 0; i
< ARRAY_SIZE (operand_types
); i
++)
1313 operand_types
[i
] = NULL
;
1317 operand_types
[i
] = next_field (str
, ',', &str
, last
);
1318 if (*operand_types
[i
] == '0')
1321 operand_types
[i
] = NULL
;
1326 fprintf (table
, " { \"%s\", %s, %s, %s, %s,\n",
1327 name
, base_opcode
, extension_opcode
, opcode_length
, operands
);
1329 process_i386_cpu_flag (table
, cpu_flags
, 0, ",", " ", lineno
);
1331 process_i386_opcode_modifier (table
, opcode_modifier
, operand_types
, lineno
);
1333 fprintf (table
, " { ");
1335 for (i
= 0; i
< ARRAY_SIZE (operand_types
); i
++)
1337 if (operand_types
[i
] == NULL
|| *operand_types
[i
] == '0')
1340 process_i386_operand_type (table
, "0", stage_opcodes
, "\t ",
1346 fprintf (table
, ",\n ");
1348 process_i386_operand_type (table
, operand_types
[i
], stage_opcodes
,
1351 fprintf (table
, " } },\n");
1354 struct opcode_hash_entry
1356 struct opcode_hash_entry
*next
;
1362 /* Calculate the hash value of an opcode hash entry P. */
1365 opcode_hash_hash (const void *p
)
1367 struct opcode_hash_entry
*entry
= (struct opcode_hash_entry
*) p
;
1368 return htab_hash_string (entry
->name
);
1371 /* Compare a string Q against an opcode hash entry P. */
1374 opcode_hash_eq (const void *p
, const void *q
)
1376 struct opcode_hash_entry
*entry
= (struct opcode_hash_entry
*) p
;
1377 const char *name
= (const char *) q
;
1378 return strcmp (name
, entry
->name
) == 0;
1382 process_i386_opcodes (FILE *table
)
1387 char *str
, *p
, *last
, *name
;
1388 struct opcode_hash_entry
**hash_slot
, **entry
, *next
;
1389 htab_t opcode_hash_table
;
1390 struct opcode_hash_entry
**opcode_array
;
1391 unsigned int opcode_array_size
= 1024;
1392 int lineno
= 0, marker
= 0;
1394 filename
= "i386-opc.tbl";
1398 opcode_array
= (struct opcode_hash_entry
**)
1399 xmalloc (sizeof (*opcode_array
) * opcode_array_size
);
1401 opcode_hash_table
= htab_create_alloc (16, opcode_hash_hash
,
1402 opcode_hash_eq
, NULL
,
1405 fprintf (table
, "\n/* i386 opcode table. */\n\n");
1406 fprintf (table
, "const insn_template i386_optab[] =\n{\n");
1408 /* Put everything on opcode array. */
1411 if (fgets (buf
, sizeof (buf
), fp
) == NULL
)
1416 p
= remove_leading_whitespaces (buf
);
1418 /* Skip comments. */
1419 str
= strstr (p
, "//");
1423 /* Remove trailing white spaces. */
1424 remove_trailing_whitespaces (p
);
1429 if (!strcmp("### MARKER ###", buf
))
1433 /* Since we ignore all included files (we only care about their
1434 #define-s here), we don't need to monitor filenames. The final
1435 line number directive is going to refer to the main source file
1440 p
= remove_leading_whitespaces (p
+ 1);
1441 if (!strncmp(p
, "line", 4))
1443 ln
= strtoul (p
, &end
, 10);
1444 if (ln
> 1 && ln
< INT_MAX
1445 && *remove_leading_whitespaces (end
) == '"')
1448 /* Ignore comments. */
1458 last
= p
+ strlen (p
);
1461 name
= next_field (p
, ',', &str
, last
);
1463 /* Get the slot in hash table. */
1464 hash_slot
= (struct opcode_hash_entry
**)
1465 htab_find_slot_with_hash (opcode_hash_table
, name
,
1466 htab_hash_string (name
),
1469 if (*hash_slot
== NULL
)
1471 /* It is the new one. Put it on opcode array. */
1472 if (i
>= opcode_array_size
)
1474 /* Grow the opcode array when needed. */
1475 opcode_array_size
+= 1024;
1476 opcode_array
= (struct opcode_hash_entry
**)
1477 xrealloc (opcode_array
,
1478 sizeof (*opcode_array
) * opcode_array_size
);
1481 opcode_array
[i
] = (struct opcode_hash_entry
*)
1482 xmalloc (sizeof (struct opcode_hash_entry
));
1483 opcode_array
[i
]->next
= NULL
;
1484 opcode_array
[i
]->name
= xstrdup (name
);
1485 opcode_array
[i
]->opcode
= xstrdup (str
);
1486 opcode_array
[i
]->lineno
= lineno
;
1487 *hash_slot
= opcode_array
[i
];
1492 /* Append it to the existing one. */
1494 while ((*entry
) != NULL
)
1495 entry
= &(*entry
)->next
;
1496 *entry
= (struct opcode_hash_entry
*)
1497 xmalloc (sizeof (struct opcode_hash_entry
));
1498 (*entry
)->next
= NULL
;
1499 (*entry
)->name
= (*hash_slot
)->name
;
1500 (*entry
)->opcode
= xstrdup (str
);
1501 (*entry
)->lineno
= lineno
;
1505 /* Process opcode array. */
1506 for (j
= 0; j
< i
; j
++)
1508 for (next
= opcode_array
[j
]; next
; next
= next
->next
)
1512 lineno
= next
->lineno
;
1513 last
= str
+ strlen (str
);
1514 output_i386_opcode (table
, name
, str
, last
, lineno
);
1520 fprintf (table
, " { NULL, 0, 0, 0, 0,\n");
1522 process_i386_cpu_flag (table
, "0", 0, ",", " ", -1);
1524 process_i386_opcode_modifier (table
, "0", NULL
, -1);
1526 fprintf (table
, " { ");
1527 process_i386_operand_type (table
, "0", stage_opcodes
, "\t ", -1);
1528 fprintf (table
, " } }\n");
1530 fprintf (table
, "};\n");
1534 process_i386_registers (FILE *table
)
1538 char *str
, *p
, *last
;
1539 char *reg_name
, *reg_type
, *reg_flags
, *reg_num
;
1540 char *dw2_32_num
, *dw2_64_num
;
1543 filename
= "i386-reg.tbl";
1544 fp
= fopen (filename
, "r");
1546 fail (_("can't find i386-reg.tbl for reading, errno = %s\n"),
1549 fprintf (table
, "\n/* i386 register table. */\n\n");
1550 fprintf (table
, "const reg_entry i386_regtab[] =\n{\n");
1554 if (fgets (buf
, sizeof (buf
), fp
) == NULL
)
1559 p
= remove_leading_whitespaces (buf
);
1561 /* Skip comments. */
1562 str
= strstr (p
, "//");
1566 /* Remove trailing white spaces. */
1567 remove_trailing_whitespaces (p
);
1572 fprintf (table
, "%s\n", p
);
1580 last
= p
+ strlen (p
);
1582 /* Find reg_name. */
1583 reg_name
= next_field (p
, ',', &str
, last
);
1585 /* Find reg_type. */
1586 reg_type
= next_field (str
, ',', &str
, last
);
1588 /* Find reg_flags. */
1589 reg_flags
= next_field (str
, ',', &str
, last
);
1592 reg_num
= next_field (str
, ',', &str
, last
);
1594 fprintf (table
, " { \"%s\",\n ", reg_name
);
1596 process_i386_operand_type (table
, reg_type
, stage_registers
, "\t",
1599 /* Find 32-bit Dwarf2 register number. */
1600 dw2_32_num
= next_field (str
, ',', &str
, last
);
1602 /* Find 64-bit Dwarf2 register number. */
1603 dw2_64_num
= next_field (str
, ',', &str
, last
);
1605 fprintf (table
, ",\n %s, %s, { %s, %s } },\n",
1606 reg_flags
, reg_num
, dw2_32_num
, dw2_64_num
);
1611 fprintf (table
, "};\n");
1613 fprintf (table
, "\nconst unsigned int i386_regtab_size = ARRAY_SIZE (i386_regtab);\n");
1617 process_i386_initializers (void)
1620 FILE *fp
= fopen ("i386-init.h", "w");
1624 fail (_("can't create i386-init.h, errno = %s\n"),
1627 process_copyright (fp
);
1629 for (i
= 0; i
< ARRAY_SIZE (cpu_flag_init
); i
++)
1631 fprintf (fp
, "\n#define %s \\\n", cpu_flag_init
[i
].name
);
1632 init
= xstrdup (cpu_flag_init
[i
].init
);
1633 process_i386_cpu_flag (fp
, init
, 1, "", " ", -1);
1637 for (i
= 0; i
< ARRAY_SIZE (operand_type_init
); i
++)
1639 fprintf (fp
, "\n\n#define %s \\\n ", operand_type_init
[i
].name
);
1640 init
= xstrdup (operand_type_init
[i
].init
);
1641 process_i386_operand_type (fp
, init
, stage_macros
, " ", -1);
1649 /* Program options. */
1650 #define OPTION_SRCDIR 200
1652 struct option long_options
[] =
1654 {"srcdir", required_argument
, NULL
, OPTION_SRCDIR
},
1655 {"debug", no_argument
, NULL
, 'd'},
1656 {"version", no_argument
, NULL
, 'V'},
1657 {"help", no_argument
, NULL
, 'h'},
1658 {0, no_argument
, NULL
, 0}
1662 print_version (void)
1664 printf ("%s: version 1.0\n", program_name
);
1669 usage (FILE * stream
, int status
)
1671 fprintf (stream
, "Usage: %s [-V | --version] [-d | --debug] [--srcdir=dirname] [--help]\n",
1677 main (int argc
, char **argv
)
1679 extern int chdir (char *);
1680 char *srcdir
= NULL
;
1682 unsigned int i
, cpumax
;
1685 program_name
= *argv
;
1686 xmalloc_set_program_name (program_name
);
1688 while ((c
= getopt_long (argc
, argv
, "vVdh", long_options
, 0)) != EOF
)
1713 if (chdir (srcdir
) != 0)
1714 fail (_("unable to change directory to \"%s\", errno = %s\n"),
1715 srcdir
, xstrerror (errno
));
1717 /* cpu_flags isn't sorted by position. */
1719 for (i
= 0; i
< ARRAY_SIZE (cpu_flags
); i
++)
1720 if (cpu_flags
[i
].position
> cpumax
)
1721 cpumax
= cpu_flags
[i
].position
;
1723 /* Check the unused bitfield in i386_cpu_flags. */
1725 static_assert (ARRAY_SIZE (cpu_flags
) == CpuMax
+ 2);
1727 if ((cpumax
- 1) != CpuMax
)
1728 fail (_("CpuMax != %d!\n"), cpumax
);
1730 static_assert (ARRAY_SIZE (cpu_flags
) == CpuMax
+ 1);
1732 if (cpumax
!= CpuMax
)
1733 fail (_("CpuMax != %d!\n"), cpumax
);
1735 c
= CpuNumOfBits
- CpuMax
- 1;
1737 fail (_("%d unused bits in i386_cpu_flags.\n"), c
);
1740 static_assert (ARRAY_SIZE (opcode_modifiers
) == Opcode_Modifier_Num
);
1742 /* Check the unused bitfield in i386_operand_type. */
1744 static_assert (ARRAY_SIZE (operand_types
) + CLASS_WIDTH
+ INSTANCE_WIDTH
1747 static_assert (ARRAY_SIZE (operand_types
) + CLASS_WIDTH
+ INSTANCE_WIDTH
1750 c
= OTNumOfBits
- OTMax
- 1;
1752 fail (_("%d unused bits in i386_operand_type.\n"), c
);
1755 qsort (cpu_flags
, ARRAY_SIZE (cpu_flags
), sizeof (cpu_flags
[0]),
1758 qsort (opcode_modifiers
, ARRAY_SIZE (opcode_modifiers
),
1759 sizeof (opcode_modifiers
[0]), compare
);
1761 qsort (operand_types
, ARRAY_SIZE (operand_types
),
1762 sizeof (operand_types
[0]), compare
);
1764 table
= fopen ("i386-tbl.h", "w");
1766 fail (_("can't create i386-tbl.h, errno = %s\n"),
1769 process_copyright (table
);
1771 process_i386_opcodes (table
);
1772 process_i386_registers (table
);
1773 process_i386_initializers ();