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_ANY_X87_FLAGS",
313 "CPU_ANY_287_FLAGS|Cpu8087" },
314 { "CPU_ANY_287_FLAGS",
315 "CPU_ANY_387_FLAGS|Cpu287" },
316 { "CPU_ANY_387_FLAGS",
317 "CPU_ANY_687_FLAGS|Cpu387" },
318 { "CPU_ANY_687_FLAGS",
319 "Cpu687|CpuFISTTP" },
320 { "CPU_ANY_CMOV_FLAGS",
322 { "CPU_ANY_FXSR_FLAGS",
324 { "CPU_ANY_MMX_FLAGS",
325 "CPU_3DNOWA_FLAGS" },
326 { "CPU_ANY_SSE_FLAGS",
327 "CPU_ANY_SSE2_FLAGS|CpuSSE" },
328 { "CPU_ANY_SSE2_FLAGS",
329 "CPU_ANY_SSE3_FLAGS|CpuSSE2" },
330 { "CPU_ANY_SSE3_FLAGS",
331 "CPU_ANY_SSSE3_FLAGS|CpuSSE3|CpuSSE4a" },
332 { "CPU_ANY_SSSE3_FLAGS",
333 "CPU_ANY_SSE4_1_FLAGS|CpuSSSE3" },
334 { "CPU_ANY_SSE4_1_FLAGS",
335 "CPU_ANY_SSE4_2_FLAGS|CpuSSE4_1" },
336 { "CPU_ANY_SSE4_2_FLAGS",
338 { "CPU_ANY_SSE4A_FLAGS",
340 { "CPU_ANY_AVX_FLAGS",
341 "CPU_ANY_AVX2_FLAGS|CpuF16C|CpuFMA|CpuFMA4|CpuXOP|CpuAVX" },
342 { "CPU_ANY_AVX2_FLAGS",
343 "CPU_ANY_AVX512F_FLAGS|CpuAVX2" },
344 { "CPU_ANY_AVX512F_FLAGS",
345 "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" },
346 { "CPU_ANY_AVX512CD_FLAGS",
348 { "CPU_ANY_AVX512ER_FLAGS",
350 { "CPU_ANY_AVX512PF_FLAGS",
352 { "CPU_ANY_AVX512DQ_FLAGS",
354 { "CPU_ANY_AVX512BW_FLAGS",
356 { "CPU_ANY_AVX512VL_FLAGS",
358 { "CPU_ANY_AVX512IFMA_FLAGS",
360 { "CPU_ANY_AVX512VBMI_FLAGS",
362 { "CPU_ANY_AVX512_4FMAPS_FLAGS",
363 "CpuAVX512_4FMAPS" },
364 { "CPU_ANY_AVX512_4VNNIW_FLAGS",
365 "CpuAVX512_4VNNIW" },
366 { "CPU_ANY_AVX512_VPOPCNTDQ_FLAGS",
367 "CpuAVX512_VPOPCNTDQ" },
368 { "CPU_ANY_IBT_FLAGS",
370 { "CPU_ANY_SHSTK_FLAGS",
372 { "CPU_ANY_AVX512_VBMI2_FLAGS",
374 { "CPU_ANY_AVX512_VNNI_FLAGS",
376 { "CPU_ANY_AVX512_BITALG_FLAGS",
377 "CpuAVX512_BITALG" },
378 { "CPU_ANY_AVX512_BF16_FLAGS",
380 { "CPU_ANY_MOVDIRI_FLAGS",
382 { "CPU_ANY_MOVDIR64B_FLAGS",
384 { "CPU_ANY_ENQCMD_FLAGS",
386 { "CPU_ANY_AVX512_VP2INTERSECT_FLAGS",
387 "CpuAVX512_VP2INTERSECT" },
390 static initializer operand_type_init
[] =
392 { "OPERAND_TYPE_NONE",
394 { "OPERAND_TYPE_REG8",
396 { "OPERAND_TYPE_REG16",
398 { "OPERAND_TYPE_REG32",
400 { "OPERAND_TYPE_REG64",
402 { "OPERAND_TYPE_IMM1",
404 { "OPERAND_TYPE_IMM8",
406 { "OPERAND_TYPE_IMM8S",
408 { "OPERAND_TYPE_IMM16",
410 { "OPERAND_TYPE_IMM32",
412 { "OPERAND_TYPE_IMM32S",
414 { "OPERAND_TYPE_IMM64",
416 { "OPERAND_TYPE_BASEINDEX",
418 { "OPERAND_TYPE_DISP8",
420 { "OPERAND_TYPE_DISP16",
422 { "OPERAND_TYPE_DISP32",
424 { "OPERAND_TYPE_DISP32S",
426 { "OPERAND_TYPE_DISP64",
428 { "OPERAND_TYPE_INOUTPORTREG",
429 "Instance=RegD|Word" },
430 { "OPERAND_TYPE_SHIFTCOUNT",
431 "Instance=RegC|Byte" },
432 { "OPERAND_TYPE_CONTROL",
434 { "OPERAND_TYPE_TEST",
436 { "OPERAND_TYPE_DEBUG",
438 { "OPERAND_TYPE_FLOATREG",
440 { "OPERAND_TYPE_FLOATACC",
441 "Instance=Accum|Tbyte" },
442 { "OPERAND_TYPE_SREG",
444 { "OPERAND_TYPE_REGMMX",
446 { "OPERAND_TYPE_REGXMM",
447 "Class=RegSIMD|Xmmword" },
448 { "OPERAND_TYPE_REGYMM",
449 "Class=RegSIMD|Ymmword" },
450 { "OPERAND_TYPE_REGZMM",
451 "Class=RegSIMD|Zmmword" },
452 { "OPERAND_TYPE_REGMASK",
454 { "OPERAND_TYPE_REGBND",
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
),
542 BITFIELD (CpuXsaveopt
),
544 BITFIELD (CpuPCLMUL
),
555 BITFIELD (CpuRdtscp
),
556 BITFIELD (CpuFSGSBase
),
561 BITFIELD (CpuPOPCNT
),
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
[] =
624 BITFIELD (CheckRegSize
),
625 BITFIELD (MnemonicSize
),
636 BITFIELD (BNDPrefixOk
),
637 BITFIELD (NoTrackPrefixOk
),
638 BITFIELD (IsLockable
),
639 BITFIELD (RegKludge
),
640 BITFIELD (Implicit1stXmm0
),
641 BITFIELD (RepPrefixOk
),
642 BITFIELD (HLEPrefixOk
),
645 BITFIELD (AddrPrefixOpReg
),
654 BITFIELD (VexOpcode
),
655 BITFIELD (VexSources
),
661 BITFIELD (Broadcast
),
662 BITFIELD (StaticRounding
),
664 BITFIELD (Disp8MemShift
),
665 BITFIELD (NoDefMask
),
666 BITFIELD (ImplicitQuadGroup
),
668 BITFIELD (ATTMnemonic
),
669 BITFIELD (ATTSyntax
),
670 BITFIELD (IntelSyntax
),
674 #define CLASS(n) #n, n
676 static const struct {
678 enum operand_class value
;
679 } operand_classes
[] = {
693 #define INSTANCE(n) #n, n
695 static const struct {
697 enum operand_instance value
;
698 } operand_instances
[] = {
707 static bitfield operand_types
[] =
716 BITFIELD (BaseIndex
),
731 BITFIELD (Unspecified
),
737 static const char *filename
;
738 static i386_cpu_flags active_cpu_flags
;
739 static int active_isstring
;
742 compare (const void *x
, const void *y
)
744 const bitfield
*xp
= (const bitfield
*) x
;
745 const bitfield
*yp
= (const bitfield
*) y
;
746 return xp
->position
- yp
->position
;
750 fail (const char *message
, ...)
754 va_start (args
, message
);
755 fprintf (stderr
, _("%s: error: "), program_name
);
756 vfprintf (stderr
, message
, args
);
762 process_copyright (FILE *fp
)
764 fprintf (fp
, "/* This file is automatically generated by i386-gen. Do not edit! */\n\
765 /* Copyright (C) 2007-2020 Free Software Foundation, Inc.\n\
767 This file is part of the GNU opcodes library.\n\
769 This library is free software; you can redistribute it and/or modify\n\
770 it under the terms of the GNU General Public License as published by\n\
771 the Free Software Foundation; either version 3, or (at your option)\n\
772 any later version.\n\
774 It is distributed in the hope that it will be useful, but WITHOUT\n\
775 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n\
776 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public\n\
777 License for more details.\n\
779 You should have received a copy of the GNU General Public License\n\
780 along with this program; if not, write to the Free Software\n\
781 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,\n\
782 MA 02110-1301, USA. */\n");
785 /* Remove leading white spaces. */
788 remove_leading_whitespaces (char *str
)
790 while (ISSPACE (*str
))
795 /* Remove trailing white spaces. */
798 remove_trailing_whitespaces (char *str
)
800 size_t last
= strlen (str
);
808 if (ISSPACE (str
[last
]))
816 /* Find next field separated by SEP and terminate it. Return a
817 pointer to the one after it. */
820 next_field (char *str
, char sep
, char **next
, char *last
)
824 p
= remove_leading_whitespaces (str
);
825 for (str
= p
; *str
!= sep
&& *str
!= '\0'; str
++);
828 remove_trailing_whitespaces (p
);
838 static void set_bitfield (char *, bitfield
*, int, unsigned int, int);
841 set_bitfield_from_cpu_flag_init (char *f
, bitfield
*array
, unsigned int size
,
844 char *str
, *next
, *last
;
847 for (i
= 0; i
< ARRAY_SIZE (cpu_flag_init
); i
++)
848 if (strcmp (cpu_flag_init
[i
].name
, f
) == 0)
850 /* Turn on selective bits. */
851 char *init
= xstrdup (cpu_flag_init
[i
].init
);
852 last
= init
+ strlen (init
);
853 for (next
= init
; next
&& next
< last
; )
855 str
= next_field (next
, '|', &next
, last
);
857 set_bitfield (str
, array
, 1, size
, lineno
);
867 set_bitfield (char *f
, bitfield
*array
, int value
,
868 unsigned int size
, int lineno
)
872 if (strcmp (f
, "CpuFP") == 0)
874 set_bitfield("Cpu387", array
, value
, size
, lineno
);
875 set_bitfield("Cpu287", array
, value
, size
, lineno
);
878 else if (strcmp (f
, "Mmword") == 0)
880 else if (strcmp (f
, "Oword") == 0)
883 for (i
= 0; i
< size
; i
++)
884 if (strcasecmp (array
[i
].name
, f
) == 0)
886 array
[i
].value
= value
;
892 const char *v
= strchr (f
, '=');
899 for (i
= 0; i
< size
; i
++)
900 if (strncasecmp (array
[i
].name
, f
, n
) == 0)
902 value
= strtol (v
+ 1, &end
, 0);
905 array
[i
].value
= value
;
913 /* Handle CPU_XXX_FLAGS. */
914 if (value
== 1 && !set_bitfield_from_cpu_flag_init (f
, array
, size
, lineno
))
918 fail (_("%s: %d: unknown bitfield: %s\n"), filename
, lineno
, f
);
920 fail (_("unknown bitfield: %s\n"), f
);
924 output_cpu_flags (FILE *table
, bitfield
*flags
, unsigned int size
,
925 int macro
, const char *comma
, const char *indent
)
929 memset (&active_cpu_flags
, 0, sizeof(active_cpu_flags
));
931 fprintf (table
, "%s{ { ", indent
);
933 for (i
= 0; i
< size
- 1; i
++)
935 if (((i
+ 1) % 20) != 0)
936 fprintf (table
, "%d, ", flags
[i
].value
);
938 fprintf (table
, "%d,", flags
[i
].value
);
939 if (((i
+ 1) % 20) == 0)
941 /* We need \\ for macro. */
943 fprintf (table
, " \\\n %s", indent
);
945 fprintf (table
, "\n %s", indent
);
948 active_cpu_flags
.array
[i
/ 32] |= 1U << (i
% 32);
951 fprintf (table
, "%d } }%s\n", flags
[i
].value
, comma
);
955 process_i386_cpu_flag (FILE *table
, char *flag
, int macro
,
956 const char *comma
, const char *indent
,
959 char *str
, *next
, *last
;
961 bitfield flags
[ARRAY_SIZE (cpu_flags
)];
963 /* Copy the default cpu flags. */
964 memcpy (flags
, cpu_flags
, sizeof (cpu_flags
));
966 if (strcasecmp (flag
, "unknown") == 0)
968 /* We turn on everything except for cpu64 in case of
969 CPU_UNKNOWN_FLAGS. */
970 for (i
= 0; i
< ARRAY_SIZE (flags
); i
++)
971 if (flags
[i
].position
!= Cpu64
)
974 else if (flag
[0] == '~')
976 last
= flag
+ strlen (flag
);
983 fail (_("%s: %d: missing `)' in bitfield: %s\n"), filename
,
990 /* First we turn on everything except for cpu64. */
991 for (i
= 0; i
< ARRAY_SIZE (flags
); i
++)
992 if (flags
[i
].position
!= Cpu64
)
995 /* Turn off selective bits. */
996 for (; next
&& next
< last
; )
998 str
= next_field (next
, '|', &next
, last
);
1000 set_bitfield (str
, flags
, 0, ARRAY_SIZE (flags
), lineno
);
1003 else if (strcmp (flag
, "0"))
1005 /* Turn on selective bits. */
1006 last
= flag
+ strlen (flag
);
1007 for (next
= flag
; next
&& next
< last
; )
1009 str
= next_field (next
, '|', &next
, last
);
1011 set_bitfield (str
, flags
, 1, ARRAY_SIZE (flags
), lineno
);
1015 output_cpu_flags (table
, flags
, ARRAY_SIZE (flags
), macro
,
1020 output_opcode_modifier (FILE *table
, bitfield
*modifier
, unsigned int size
)
1024 fprintf (table
, " { ");
1026 for (i
= 0; i
< size
- 1; i
++)
1028 if (((i
+ 1) % 20) != 0)
1029 fprintf (table
, "%d, ", modifier
[i
].value
);
1031 fprintf (table
, "%d,", modifier
[i
].value
);
1032 if (((i
+ 1) % 20) == 0)
1033 fprintf (table
, "\n ");
1036 fprintf (table
, "%d },\n", modifier
[i
].value
);
1040 adjust_broadcast_modifier (char **opnd
)
1042 char *str
, *next
, *last
, *op
;
1043 int bcst_type
= INT_MAX
;
1045 /* Skip the immediate operand. */
1047 if (strcasecmp(op
, "Imm8") == 0)
1051 last
= op
+ strlen (op
);
1052 for (next
= op
; next
&& next
< last
; )
1054 str
= next_field (next
, '|', &next
, last
);
1057 if (strcasecmp(str
, "Byte") == 0)
1059 /* The smalest broadcast type, no need to check
1061 bcst_type
= BYTE_BROADCAST
;
1064 else if (strcasecmp(str
, "Word") == 0)
1066 if (bcst_type
> WORD_BROADCAST
)
1067 bcst_type
= WORD_BROADCAST
;
1069 else if (strcasecmp(str
, "Dword") == 0)
1071 if (bcst_type
> DWORD_BROADCAST
)
1072 bcst_type
= DWORD_BROADCAST
;
1074 else if (strcasecmp(str
, "Qword") == 0)
1076 if (bcst_type
> QWORD_BROADCAST
)
1077 bcst_type
= QWORD_BROADCAST
;
1083 if (bcst_type
== INT_MAX
)
1084 fail (_("unknown broadcast operand: %s\n"), op
);
1090 process_i386_opcode_modifier (FILE *table
, char *mod
, char **opnd
, int lineno
)
1092 char *str
, *next
, *last
;
1093 bitfield modifiers
[ARRAY_SIZE (opcode_modifiers
)];
1095 active_isstring
= 0;
1097 /* Copy the default opcode modifier. */
1098 memcpy (modifiers
, opcode_modifiers
, sizeof (modifiers
));
1100 if (strcmp (mod
, "0"))
1102 unsigned int have_w
= 0, bwlq_suf
= 0xf;
1104 last
= mod
+ strlen (mod
);
1105 for (next
= mod
; next
&& next
< last
; )
1107 str
= next_field (next
, '|', &next
, last
);
1111 if (strcasecmp(str
, "Broadcast") == 0)
1112 val
= adjust_broadcast_modifier (opnd
);
1113 set_bitfield (str
, modifiers
, val
, ARRAY_SIZE (modifiers
),
1115 if (strcasecmp(str
, "IsString") == 0)
1116 active_isstring
= 1;
1118 if (strcasecmp(str
, "W") == 0)
1121 if (strcasecmp(str
, "No_bSuf") == 0)
1123 if (strcasecmp(str
, "No_wSuf") == 0)
1125 if (strcasecmp(str
, "No_lSuf") == 0)
1127 if (strcasecmp(str
, "No_qSuf") == 0)
1132 if (have_w
&& !bwlq_suf
)
1133 fail ("%s: %d: stray W modifier\n", filename
, lineno
);
1134 if (have_w
&& !(bwlq_suf
& 1))
1135 fprintf (stderr
, "%s: %d: W modifier without Byte operand(s)\n",
1137 if (have_w
&& !(bwlq_suf
& ~1))
1139 "%s: %d: W modifier without Word/Dword/Qword operand(s)\n",
1142 output_opcode_modifier (table
, modifiers
, ARRAY_SIZE (modifiers
));
1152 output_operand_type (FILE *table
, enum operand_class
class,
1153 enum operand_instance instance
,
1154 const bitfield
*types
, unsigned int size
,
1155 enum stage stage
, const char *indent
)
1159 fprintf (table
, "{ { %d, %d, ", class, instance
);
1161 for (i
= 0; i
< size
- 1; i
++)
1163 if (((i
+ 3) % 20) != 0)
1164 fprintf (table
, "%d, ", types
[i
].value
);
1166 fprintf (table
, "%d,", types
[i
].value
);
1167 if (((i
+ 3) % 20) == 0)
1169 /* We need \\ for macro. */
1170 if (stage
== stage_macros
)
1171 fprintf (table
, " \\\n%s", indent
);
1173 fprintf (table
, "\n%s", indent
);
1177 fprintf (table
, "%d } }", types
[i
].value
);
1181 process_i386_operand_type (FILE *table
, char *op
, enum stage stage
,
1182 const char *indent
, int lineno
)
1184 char *str
, *next
, *last
;
1185 enum operand_class
class = ClassNone
;
1186 enum operand_instance instance
= InstanceNone
;
1187 bitfield types
[ARRAY_SIZE (operand_types
)];
1189 /* Copy the default operand type. */
1190 memcpy (types
, operand_types
, sizeof (types
));
1192 if (strcmp (op
, "0"))
1196 last
= op
+ strlen (op
);
1197 for (next
= op
; next
&& next
< last
; )
1199 str
= next_field (next
, '|', &next
, last
);
1204 if (!strncmp(str
, "Class=", 6))
1206 for (i
= 0; i
< ARRAY_SIZE(operand_classes
); ++i
)
1207 if (!strcmp(str
+ 6, operand_classes
[i
].name
))
1209 class = operand_classes
[i
].value
;
1215 if (str
&& !strncmp(str
, "Instance=", 9))
1217 for (i
= 0; i
< ARRAY_SIZE(operand_instances
); ++i
)
1218 if (!strcmp(str
+ 9, operand_instances
[i
].name
))
1220 instance
= operand_instances
[i
].value
;
1228 set_bitfield (str
, types
, 1, ARRAY_SIZE (types
), lineno
);
1229 if (strcasecmp(str
, "BaseIndex") == 0)
1234 if (stage
== stage_opcodes
&& baseindex
&& !active_isstring
)
1236 set_bitfield("Disp8", types
, 1, ARRAY_SIZE (types
), lineno
);
1237 if (!active_cpu_flags
.bitfield
.cpu64
1238 && !active_cpu_flags
.bitfield
.cpumpx
)
1239 set_bitfield("Disp16", types
, 1, ARRAY_SIZE (types
), lineno
);
1240 if (!active_cpu_flags
.bitfield
.cpu64
)
1241 set_bitfield("Disp32", types
, 1, ARRAY_SIZE (types
), lineno
);
1242 if (!active_cpu_flags
.bitfield
.cpuno64
)
1243 set_bitfield("Disp32S", types
, 1, ARRAY_SIZE (types
), lineno
);
1246 output_operand_type (table
, class, instance
, types
, ARRAY_SIZE (types
),
1251 output_i386_opcode (FILE *table
, const char *name
, char *str
,
1252 char *last
, int lineno
)
1255 char *operands
, *base_opcode
, *extension_opcode
, *opcode_length
;
1256 char *cpu_flags
, *opcode_modifier
, *operand_types
[MAX_OPERANDS
];
1258 /* Find number of operands. */
1259 operands
= next_field (str
, ',', &str
, last
);
1261 /* Find base_opcode. */
1262 base_opcode
= next_field (str
, ',', &str
, last
);
1264 /* Find extension_opcode. */
1265 extension_opcode
= next_field (str
, ',', &str
, last
);
1267 /* Find opcode_length. */
1268 opcode_length
= next_field (str
, ',', &str
, last
);
1270 /* Find cpu_flags. */
1271 cpu_flags
= next_field (str
, ',', &str
, last
);
1273 /* Find opcode_modifier. */
1274 opcode_modifier
= next_field (str
, ',', &str
, last
);
1276 /* Remove the first {. */
1277 str
= remove_leading_whitespaces (str
);
1280 str
= remove_leading_whitespaces (str
+ 1);
1284 /* There are at least "X}". */
1288 /* Remove trailing white spaces and }. */
1292 if (ISSPACE (str
[i
]) || str
[i
] == '}')
1301 /* Find operand_types. */
1302 for (i
= 0; i
< ARRAY_SIZE (operand_types
); i
++)
1306 operand_types
[i
] = NULL
;
1310 operand_types
[i
] = next_field (str
, ',', &str
, last
);
1311 if (*operand_types
[i
] == '0')
1314 operand_types
[i
] = NULL
;
1319 fprintf (table
, " { \"%s\", %s, %s, %s, %s,\n",
1320 name
, base_opcode
, extension_opcode
, opcode_length
, operands
);
1322 process_i386_cpu_flag (table
, cpu_flags
, 0, ",", " ", lineno
);
1324 process_i386_opcode_modifier (table
, opcode_modifier
, operand_types
, lineno
);
1326 fprintf (table
, " { ");
1328 for (i
= 0; i
< ARRAY_SIZE (operand_types
); i
++)
1330 if (operand_types
[i
] == NULL
|| *operand_types
[i
] == '0')
1333 process_i386_operand_type (table
, "0", stage_opcodes
, "\t ",
1339 fprintf (table
, ",\n ");
1341 process_i386_operand_type (table
, operand_types
[i
], stage_opcodes
,
1344 fprintf (table
, " } },\n");
1347 struct opcode_hash_entry
1349 struct opcode_hash_entry
*next
;
1355 /* Calculate the hash value of an opcode hash entry P. */
1358 opcode_hash_hash (const void *p
)
1360 struct opcode_hash_entry
*entry
= (struct opcode_hash_entry
*) p
;
1361 return htab_hash_string (entry
->name
);
1364 /* Compare a string Q against an opcode hash entry P. */
1367 opcode_hash_eq (const void *p
, const void *q
)
1369 struct opcode_hash_entry
*entry
= (struct opcode_hash_entry
*) p
;
1370 const char *name
= (const char *) q
;
1371 return strcmp (name
, entry
->name
) == 0;
1375 process_i386_opcodes (FILE *table
)
1380 char *str
, *p
, *last
, *name
;
1381 struct opcode_hash_entry
**hash_slot
, **entry
, *next
;
1382 htab_t opcode_hash_table
;
1383 struct opcode_hash_entry
**opcode_array
;
1384 unsigned int opcode_array_size
= 1024;
1385 int lineno
= 0, marker
= 0;
1387 filename
= "i386-opc.tbl";
1391 opcode_array
= (struct opcode_hash_entry
**)
1392 xmalloc (sizeof (*opcode_array
) * opcode_array_size
);
1394 opcode_hash_table
= htab_create_alloc (16, opcode_hash_hash
,
1395 opcode_hash_eq
, NULL
,
1398 fprintf (table
, "\n/* i386 opcode table. */\n\n");
1399 fprintf (table
, "const insn_template i386_optab[] =\n{\n");
1401 /* Put everything on opcode array. */
1404 if (fgets (buf
, sizeof (buf
), fp
) == NULL
)
1409 p
= remove_leading_whitespaces (buf
);
1411 /* Skip comments. */
1412 str
= strstr (p
, "//");
1416 /* Remove trailing white spaces. */
1417 remove_trailing_whitespaces (p
);
1422 if (!strcmp("### MARKER ###", buf
))
1426 /* Since we ignore all included files (we only care about their
1427 #define-s here), we don't need to monitor filenames. The final
1428 line number directive is going to refer to the main source file
1433 p
= remove_leading_whitespaces (p
+ 1);
1434 if (!strncmp(p
, "line", 4))
1436 ln
= strtoul (p
, &end
, 10);
1437 if (ln
> 1 && ln
< INT_MAX
1438 && *remove_leading_whitespaces (end
) == '"')
1441 /* Ignore comments. */
1451 last
= p
+ strlen (p
);
1454 name
= next_field (p
, ',', &str
, last
);
1456 /* Get the slot in hash table. */
1457 hash_slot
= (struct opcode_hash_entry
**)
1458 htab_find_slot_with_hash (opcode_hash_table
, name
,
1459 htab_hash_string (name
),
1462 if (*hash_slot
== NULL
)
1464 /* It is the new one. Put it on opcode array. */
1465 if (i
>= opcode_array_size
)
1467 /* Grow the opcode array when needed. */
1468 opcode_array_size
+= 1024;
1469 opcode_array
= (struct opcode_hash_entry
**)
1470 xrealloc (opcode_array
,
1471 sizeof (*opcode_array
) * opcode_array_size
);
1474 opcode_array
[i
] = (struct opcode_hash_entry
*)
1475 xmalloc (sizeof (struct opcode_hash_entry
));
1476 opcode_array
[i
]->next
= NULL
;
1477 opcode_array
[i
]->name
= xstrdup (name
);
1478 opcode_array
[i
]->opcode
= xstrdup (str
);
1479 opcode_array
[i
]->lineno
= lineno
;
1480 *hash_slot
= opcode_array
[i
];
1485 /* Append it to the existing one. */
1487 while ((*entry
) != NULL
)
1488 entry
= &(*entry
)->next
;
1489 *entry
= (struct opcode_hash_entry
*)
1490 xmalloc (sizeof (struct opcode_hash_entry
));
1491 (*entry
)->next
= NULL
;
1492 (*entry
)->name
= (*hash_slot
)->name
;
1493 (*entry
)->opcode
= xstrdup (str
);
1494 (*entry
)->lineno
= lineno
;
1498 /* Process opcode array. */
1499 for (j
= 0; j
< i
; j
++)
1501 for (next
= opcode_array
[j
]; next
; next
= next
->next
)
1505 lineno
= next
->lineno
;
1506 last
= str
+ strlen (str
);
1507 output_i386_opcode (table
, name
, str
, last
, lineno
);
1513 fprintf (table
, " { NULL, 0, 0, 0, 0,\n");
1515 process_i386_cpu_flag (table
, "0", 0, ",", " ", -1);
1517 process_i386_opcode_modifier (table
, "0", NULL
, -1);
1519 fprintf (table
, " { ");
1520 process_i386_operand_type (table
, "0", stage_opcodes
, "\t ", -1);
1521 fprintf (table
, " } }\n");
1523 fprintf (table
, "};\n");
1527 process_i386_registers (FILE *table
)
1531 char *str
, *p
, *last
;
1532 char *reg_name
, *reg_type
, *reg_flags
, *reg_num
;
1533 char *dw2_32_num
, *dw2_64_num
;
1536 filename
= "i386-reg.tbl";
1537 fp
= fopen (filename
, "r");
1539 fail (_("can't find i386-reg.tbl for reading, errno = %s\n"),
1542 fprintf (table
, "\n/* i386 register table. */\n\n");
1543 fprintf (table
, "const reg_entry i386_regtab[] =\n{\n");
1547 if (fgets (buf
, sizeof (buf
), fp
) == NULL
)
1552 p
= remove_leading_whitespaces (buf
);
1554 /* Skip comments. */
1555 str
= strstr (p
, "//");
1559 /* Remove trailing white spaces. */
1560 remove_trailing_whitespaces (p
);
1565 fprintf (table
, "%s\n", p
);
1573 last
= p
+ strlen (p
);
1575 /* Find reg_name. */
1576 reg_name
= next_field (p
, ',', &str
, last
);
1578 /* Find reg_type. */
1579 reg_type
= next_field (str
, ',', &str
, last
);
1581 /* Find reg_flags. */
1582 reg_flags
= next_field (str
, ',', &str
, last
);
1585 reg_num
= next_field (str
, ',', &str
, last
);
1587 fprintf (table
, " { \"%s\",\n ", reg_name
);
1589 process_i386_operand_type (table
, reg_type
, stage_registers
, "\t",
1592 /* Find 32-bit Dwarf2 register number. */
1593 dw2_32_num
= next_field (str
, ',', &str
, last
);
1595 /* Find 64-bit Dwarf2 register number. */
1596 dw2_64_num
= next_field (str
, ',', &str
, last
);
1598 fprintf (table
, ",\n %s, %s, { %s, %s } },\n",
1599 reg_flags
, reg_num
, dw2_32_num
, dw2_64_num
);
1604 fprintf (table
, "};\n");
1606 fprintf (table
, "\nconst unsigned int i386_regtab_size = ARRAY_SIZE (i386_regtab);\n");
1610 process_i386_initializers (void)
1613 FILE *fp
= fopen ("i386-init.h", "w");
1617 fail (_("can't create i386-init.h, errno = %s\n"),
1620 process_copyright (fp
);
1622 for (i
= 0; i
< ARRAY_SIZE (cpu_flag_init
); i
++)
1624 fprintf (fp
, "\n#define %s \\\n", cpu_flag_init
[i
].name
);
1625 init
= xstrdup (cpu_flag_init
[i
].init
);
1626 process_i386_cpu_flag (fp
, init
, 1, "", " ", -1);
1630 for (i
= 0; i
< ARRAY_SIZE (operand_type_init
); i
++)
1632 fprintf (fp
, "\n\n#define %s \\\n ", operand_type_init
[i
].name
);
1633 init
= xstrdup (operand_type_init
[i
].init
);
1634 process_i386_operand_type (fp
, init
, stage_macros
, " ", -1);
1642 /* Program options. */
1643 #define OPTION_SRCDIR 200
1645 struct option long_options
[] =
1647 {"srcdir", required_argument
, NULL
, OPTION_SRCDIR
},
1648 {"debug", no_argument
, NULL
, 'd'},
1649 {"version", no_argument
, NULL
, 'V'},
1650 {"help", no_argument
, NULL
, 'h'},
1651 {0, no_argument
, NULL
, 0}
1655 print_version (void)
1657 printf ("%s: version 1.0\n", program_name
);
1662 usage (FILE * stream
, int status
)
1664 fprintf (stream
, "Usage: %s [-V | --version] [-d | --debug] [--srcdir=dirname] [--help]\n",
1670 main (int argc
, char **argv
)
1672 extern int chdir (char *);
1673 char *srcdir
= NULL
;
1675 unsigned int i
, cpumax
;
1678 program_name
= *argv
;
1679 xmalloc_set_program_name (program_name
);
1681 while ((c
= getopt_long (argc
, argv
, "vVdh", long_options
, 0)) != EOF
)
1706 if (chdir (srcdir
) != 0)
1707 fail (_("unable to change directory to \"%s\", errno = %s\n"),
1708 srcdir
, xstrerror (errno
));
1710 /* cpu_flags isn't sorted by position. */
1712 for (i
= 0; i
< ARRAY_SIZE (cpu_flags
); i
++)
1713 if (cpu_flags
[i
].position
> cpumax
)
1714 cpumax
= cpu_flags
[i
].position
;
1716 /* Check the unused bitfield in i386_cpu_flags. */
1718 static_assert (ARRAY_SIZE (cpu_flags
) == CpuMax
+ 2);
1720 if ((cpumax
- 1) != CpuMax
)
1721 fail (_("CpuMax != %d!\n"), cpumax
);
1723 static_assert (ARRAY_SIZE (cpu_flags
) == CpuMax
+ 1);
1725 if (cpumax
!= CpuMax
)
1726 fail (_("CpuMax != %d!\n"), cpumax
);
1728 c
= CpuNumOfBits
- CpuMax
- 1;
1730 fail (_("%d unused bits in i386_cpu_flags.\n"), c
);
1733 static_assert (ARRAY_SIZE (opcode_modifiers
) == Opcode_Modifier_Num
);
1735 /* Check the unused bitfield in i386_operand_type. */
1737 static_assert (ARRAY_SIZE (operand_types
) + CLASS_WIDTH
+ INSTANCE_WIDTH
1740 static_assert (ARRAY_SIZE (operand_types
) + CLASS_WIDTH
+ INSTANCE_WIDTH
1743 c
= OTNumOfBits
- OTNum
;
1745 fail (_("%d unused bits in i386_operand_type.\n"), c
);
1748 qsort (cpu_flags
, ARRAY_SIZE (cpu_flags
), sizeof (cpu_flags
[0]),
1751 qsort (opcode_modifiers
, ARRAY_SIZE (opcode_modifiers
),
1752 sizeof (opcode_modifiers
[0]), compare
);
1754 qsort (operand_types
, ARRAY_SIZE (operand_types
),
1755 sizeof (operand_types
[0]), compare
);
1757 table
= fopen ("i386-tbl.h", "w");
1759 fail (_("can't create i386-tbl.h, errno = %s\n"),
1762 process_copyright (table
);
1764 process_i386_opcodes (table
);
1765 process_i386_registers (table
);
1766 process_i386_initializers ();