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 (IgnoreSize
),
626 BITFIELD (DefaultSize
),
637 BITFIELD (BNDPrefixOk
),
638 BITFIELD (NoTrackPrefixOk
),
639 BITFIELD (IsLockable
),
640 BITFIELD (RegKludge
),
641 BITFIELD (Implicit1stXmm0
),
642 BITFIELD (RepPrefixOk
),
643 BITFIELD (HLEPrefixOk
),
646 BITFIELD (AddrPrefixOpReg
),
655 BITFIELD (VexOpcode
),
656 BITFIELD (VexSources
),
662 BITFIELD (Broadcast
),
663 BITFIELD (StaticRounding
),
665 BITFIELD (Disp8MemShift
),
666 BITFIELD (NoDefMask
),
667 BITFIELD (ImplicitQuadGroup
),
669 BITFIELD (ATTMnemonic
),
670 BITFIELD (ATTSyntax
),
671 BITFIELD (IntelSyntax
),
675 #define CLASS(n) #n, n
677 static const struct {
679 enum operand_class value
;
680 } operand_classes
[] = {
694 #define INSTANCE(n) #n, n
696 static const struct {
698 enum operand_instance value
;
699 } operand_instances
[] = {
708 static bitfield operand_types
[] =
717 BITFIELD (BaseIndex
),
732 BITFIELD (Unspecified
),
738 static const char *filename
;
739 static i386_cpu_flags active_cpu_flags
;
740 static int active_isstring
;
743 compare (const void *x
, const void *y
)
745 const bitfield
*xp
= (const bitfield
*) x
;
746 const bitfield
*yp
= (const bitfield
*) y
;
747 return xp
->position
- yp
->position
;
751 fail (const char *message
, ...)
755 va_start (args
, message
);
756 fprintf (stderr
, _("%s: error: "), program_name
);
757 vfprintf (stderr
, message
, args
);
763 process_copyright (FILE *fp
)
765 fprintf (fp
, "/* This file is automatically generated by i386-gen. Do not edit! */\n\
766 /* Copyright (C) 2007-2020 Free Software Foundation, Inc.\n\
768 This file is part of the GNU opcodes library.\n\
770 This library is free software; you can redistribute it and/or modify\n\
771 it under the terms of the GNU General Public License as published by\n\
772 the Free Software Foundation; either version 3, or (at your option)\n\
773 any later version.\n\
775 It is distributed in the hope that it will be useful, but WITHOUT\n\
776 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n\
777 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public\n\
778 License for more details.\n\
780 You should have received a copy of the GNU General Public License\n\
781 along with this program; if not, write to the Free Software\n\
782 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,\n\
783 MA 02110-1301, USA. */\n");
786 /* Remove leading white spaces. */
789 remove_leading_whitespaces (char *str
)
791 while (ISSPACE (*str
))
796 /* Remove trailing white spaces. */
799 remove_trailing_whitespaces (char *str
)
801 size_t last
= strlen (str
);
809 if (ISSPACE (str
[last
]))
817 /* Find next field separated by SEP and terminate it. Return a
818 pointer to the one after it. */
821 next_field (char *str
, char sep
, char **next
, char *last
)
825 p
= remove_leading_whitespaces (str
);
826 for (str
= p
; *str
!= sep
&& *str
!= '\0'; str
++);
829 remove_trailing_whitespaces (p
);
839 static void set_bitfield (char *, bitfield
*, int, unsigned int, int);
842 set_bitfield_from_cpu_flag_init (char *f
, bitfield
*array
, unsigned int size
,
845 char *str
, *next
, *last
;
848 for (i
= 0; i
< ARRAY_SIZE (cpu_flag_init
); i
++)
849 if (strcmp (cpu_flag_init
[i
].name
, f
) == 0)
851 /* Turn on selective bits. */
852 char *init
= xstrdup (cpu_flag_init
[i
].init
);
853 last
= init
+ strlen (init
);
854 for (next
= init
; next
&& next
< last
; )
856 str
= next_field (next
, '|', &next
, last
);
858 set_bitfield (str
, array
, 1, size
, lineno
);
868 set_bitfield (char *f
, bitfield
*array
, int value
,
869 unsigned int size
, int lineno
)
873 if (strcmp (f
, "CpuFP") == 0)
875 set_bitfield("Cpu387", array
, value
, size
, lineno
);
876 set_bitfield("Cpu287", array
, value
, size
, lineno
);
879 else if (strcmp (f
, "Mmword") == 0)
881 else if (strcmp (f
, "Oword") == 0)
884 for (i
= 0; i
< size
; i
++)
885 if (strcasecmp (array
[i
].name
, f
) == 0)
887 array
[i
].value
= value
;
893 const char *v
= strchr (f
, '=');
900 for (i
= 0; i
< size
; i
++)
901 if (strncasecmp (array
[i
].name
, f
, n
) == 0)
903 value
= strtol (v
+ 1, &end
, 0);
906 array
[i
].value
= value
;
914 /* Handle CPU_XXX_FLAGS. */
915 if (value
== 1 && !set_bitfield_from_cpu_flag_init (f
, array
, size
, lineno
))
919 fail (_("%s: %d: unknown bitfield: %s\n"), filename
, lineno
, f
);
921 fail (_("unknown bitfield: %s\n"), f
);
925 output_cpu_flags (FILE *table
, bitfield
*flags
, unsigned int size
,
926 int macro
, const char *comma
, const char *indent
)
930 memset (&active_cpu_flags
, 0, sizeof(active_cpu_flags
));
932 fprintf (table
, "%s{ { ", indent
);
934 for (i
= 0; i
< size
- 1; i
++)
936 if (((i
+ 1) % 20) != 0)
937 fprintf (table
, "%d, ", flags
[i
].value
);
939 fprintf (table
, "%d,", flags
[i
].value
);
940 if (((i
+ 1) % 20) == 0)
942 /* We need \\ for macro. */
944 fprintf (table
, " \\\n %s", indent
);
946 fprintf (table
, "\n %s", indent
);
949 active_cpu_flags
.array
[i
/ 32] |= 1U << (i
% 32);
952 fprintf (table
, "%d } }%s\n", flags
[i
].value
, comma
);
956 process_i386_cpu_flag (FILE *table
, char *flag
, int macro
,
957 const char *comma
, const char *indent
,
960 char *str
, *next
, *last
;
962 bitfield flags
[ARRAY_SIZE (cpu_flags
)];
964 /* Copy the default cpu flags. */
965 memcpy (flags
, cpu_flags
, sizeof (cpu_flags
));
967 if (strcasecmp (flag
, "unknown") == 0)
969 /* We turn on everything except for cpu64 in case of
970 CPU_UNKNOWN_FLAGS. */
971 for (i
= 0; i
< ARRAY_SIZE (flags
); i
++)
972 if (flags
[i
].position
!= Cpu64
)
975 else if (flag
[0] == '~')
977 last
= flag
+ strlen (flag
);
984 fail (_("%s: %d: missing `)' in bitfield: %s\n"), filename
,
991 /* First we turn on everything except for cpu64. */
992 for (i
= 0; i
< ARRAY_SIZE (flags
); i
++)
993 if (flags
[i
].position
!= Cpu64
)
996 /* Turn off selective bits. */
997 for (; next
&& next
< last
; )
999 str
= next_field (next
, '|', &next
, last
);
1001 set_bitfield (str
, flags
, 0, ARRAY_SIZE (flags
), lineno
);
1004 else if (strcmp (flag
, "0"))
1006 /* Turn on selective bits. */
1007 last
= flag
+ strlen (flag
);
1008 for (next
= flag
; next
&& next
< last
; )
1010 str
= next_field (next
, '|', &next
, last
);
1012 set_bitfield (str
, flags
, 1, ARRAY_SIZE (flags
), lineno
);
1016 output_cpu_flags (table
, flags
, ARRAY_SIZE (flags
), macro
,
1021 output_opcode_modifier (FILE *table
, bitfield
*modifier
, unsigned int size
)
1025 fprintf (table
, " { ");
1027 for (i
= 0; i
< size
- 1; i
++)
1029 if (((i
+ 1) % 20) != 0)
1030 fprintf (table
, "%d, ", modifier
[i
].value
);
1032 fprintf (table
, "%d,", modifier
[i
].value
);
1033 if (((i
+ 1) % 20) == 0)
1034 fprintf (table
, "\n ");
1037 fprintf (table
, "%d },\n", modifier
[i
].value
);
1041 adjust_broadcast_modifier (char **opnd
)
1043 char *str
, *next
, *last
, *op
;
1044 int bcst_type
= INT_MAX
;
1046 /* Skip the immediate operand. */
1048 if (strcasecmp(op
, "Imm8") == 0)
1052 last
= op
+ strlen (op
);
1053 for (next
= op
; next
&& next
< last
; )
1055 str
= next_field (next
, '|', &next
, last
);
1058 if (strcasecmp(str
, "Byte") == 0)
1060 /* The smalest broadcast type, no need to check
1062 bcst_type
= BYTE_BROADCAST
;
1065 else if (strcasecmp(str
, "Word") == 0)
1067 if (bcst_type
> WORD_BROADCAST
)
1068 bcst_type
= WORD_BROADCAST
;
1070 else if (strcasecmp(str
, "Dword") == 0)
1072 if (bcst_type
> DWORD_BROADCAST
)
1073 bcst_type
= DWORD_BROADCAST
;
1075 else if (strcasecmp(str
, "Qword") == 0)
1077 if (bcst_type
> QWORD_BROADCAST
)
1078 bcst_type
= QWORD_BROADCAST
;
1084 if (bcst_type
== INT_MAX
)
1085 fail (_("unknown broadcast operand: %s\n"), op
);
1091 process_i386_opcode_modifier (FILE *table
, char *mod
, char **opnd
, int lineno
)
1093 char *str
, *next
, *last
;
1094 bitfield modifiers
[ARRAY_SIZE (opcode_modifiers
)];
1096 active_isstring
= 0;
1098 /* Copy the default opcode modifier. */
1099 memcpy (modifiers
, opcode_modifiers
, sizeof (modifiers
));
1101 if (strcmp (mod
, "0"))
1103 unsigned int have_w
= 0, bwlq_suf
= 0xf;
1105 last
= mod
+ strlen (mod
);
1106 for (next
= mod
; next
&& next
< last
; )
1108 str
= next_field (next
, '|', &next
, last
);
1112 if (strcasecmp(str
, "Broadcast") == 0)
1113 val
= adjust_broadcast_modifier (opnd
);
1114 set_bitfield (str
, modifiers
, val
, ARRAY_SIZE (modifiers
),
1116 if (strcasecmp(str
, "IsString") == 0)
1117 active_isstring
= 1;
1119 if (strcasecmp(str
, "W") == 0)
1122 if (strcasecmp(str
, "No_bSuf") == 0)
1124 if (strcasecmp(str
, "No_wSuf") == 0)
1126 if (strcasecmp(str
, "No_lSuf") == 0)
1128 if (strcasecmp(str
, "No_qSuf") == 0)
1133 if (have_w
&& !bwlq_suf
)
1134 fail ("%s: %d: stray W modifier\n", filename
, lineno
);
1135 if (have_w
&& !(bwlq_suf
& 1))
1136 fprintf (stderr
, "%s: %d: W modifier without Byte operand(s)\n",
1138 if (have_w
&& !(bwlq_suf
& ~1))
1140 "%s: %d: W modifier without Word/Dword/Qword operand(s)\n",
1143 output_opcode_modifier (table
, modifiers
, ARRAY_SIZE (modifiers
));
1153 output_operand_type (FILE *table
, enum operand_class
class,
1154 enum operand_instance instance
,
1155 const bitfield
*types
, unsigned int size
,
1156 enum stage stage
, const char *indent
)
1160 fprintf (table
, "{ { %d, %d, ", class, instance
);
1162 for (i
= 0; i
< size
- 1; i
++)
1164 if (((i
+ 3) % 20) != 0)
1165 fprintf (table
, "%d, ", types
[i
].value
);
1167 fprintf (table
, "%d,", types
[i
].value
);
1168 if (((i
+ 3) % 20) == 0)
1170 /* We need \\ for macro. */
1171 if (stage
== stage_macros
)
1172 fprintf (table
, " \\\n%s", indent
);
1174 fprintf (table
, "\n%s", indent
);
1178 fprintf (table
, "%d } }", types
[i
].value
);
1182 process_i386_operand_type (FILE *table
, char *op
, enum stage stage
,
1183 const char *indent
, int lineno
)
1185 char *str
, *next
, *last
;
1186 enum operand_class
class = ClassNone
;
1187 enum operand_instance instance
= InstanceNone
;
1188 bitfield types
[ARRAY_SIZE (operand_types
)];
1190 /* Copy the default operand type. */
1191 memcpy (types
, operand_types
, sizeof (types
));
1193 if (strcmp (op
, "0"))
1197 last
= op
+ strlen (op
);
1198 for (next
= op
; next
&& next
< last
; )
1200 str
= next_field (next
, '|', &next
, last
);
1205 if (!strncmp(str
, "Class=", 6))
1207 for (i
= 0; i
< ARRAY_SIZE(operand_classes
); ++i
)
1208 if (!strcmp(str
+ 6, operand_classes
[i
].name
))
1210 class = operand_classes
[i
].value
;
1216 if (str
&& !strncmp(str
, "Instance=", 9))
1218 for (i
= 0; i
< ARRAY_SIZE(operand_instances
); ++i
)
1219 if (!strcmp(str
+ 9, operand_instances
[i
].name
))
1221 instance
= operand_instances
[i
].value
;
1229 set_bitfield (str
, types
, 1, ARRAY_SIZE (types
), lineno
);
1230 if (strcasecmp(str
, "BaseIndex") == 0)
1235 if (stage
== stage_opcodes
&& baseindex
&& !active_isstring
)
1237 set_bitfield("Disp8", types
, 1, ARRAY_SIZE (types
), lineno
);
1238 if (!active_cpu_flags
.bitfield
.cpu64
1239 && !active_cpu_flags
.bitfield
.cpumpx
)
1240 set_bitfield("Disp16", types
, 1, ARRAY_SIZE (types
), lineno
);
1241 if (!active_cpu_flags
.bitfield
.cpu64
)
1242 set_bitfield("Disp32", types
, 1, ARRAY_SIZE (types
), lineno
);
1243 if (!active_cpu_flags
.bitfield
.cpuno64
)
1244 set_bitfield("Disp32S", types
, 1, ARRAY_SIZE (types
), lineno
);
1247 output_operand_type (table
, class, instance
, types
, ARRAY_SIZE (types
),
1252 output_i386_opcode (FILE *table
, const char *name
, char *str
,
1253 char *last
, int lineno
)
1256 char *operands
, *base_opcode
, *extension_opcode
, *opcode_length
;
1257 char *cpu_flags
, *opcode_modifier
, *operand_types
[MAX_OPERANDS
];
1259 /* Find number of operands. */
1260 operands
= next_field (str
, ',', &str
, last
);
1262 /* Find base_opcode. */
1263 base_opcode
= next_field (str
, ',', &str
, last
);
1265 /* Find extension_opcode. */
1266 extension_opcode
= next_field (str
, ',', &str
, last
);
1268 /* Find opcode_length. */
1269 opcode_length
= next_field (str
, ',', &str
, last
);
1271 /* Find cpu_flags. */
1272 cpu_flags
= next_field (str
, ',', &str
, last
);
1274 /* Find opcode_modifier. */
1275 opcode_modifier
= next_field (str
, ',', &str
, last
);
1277 /* Remove the first {. */
1278 str
= remove_leading_whitespaces (str
);
1281 str
= remove_leading_whitespaces (str
+ 1);
1285 /* There are at least "X}". */
1289 /* Remove trailing white spaces and }. */
1293 if (ISSPACE (str
[i
]) || str
[i
] == '}')
1302 /* Find operand_types. */
1303 for (i
= 0; i
< ARRAY_SIZE (operand_types
); i
++)
1307 operand_types
[i
] = NULL
;
1311 operand_types
[i
] = next_field (str
, ',', &str
, last
);
1312 if (*operand_types
[i
] == '0')
1315 operand_types
[i
] = NULL
;
1320 fprintf (table
, " { \"%s\", %s, %s, %s, %s,\n",
1321 name
, base_opcode
, extension_opcode
, opcode_length
, operands
);
1323 process_i386_cpu_flag (table
, cpu_flags
, 0, ",", " ", lineno
);
1325 process_i386_opcode_modifier (table
, opcode_modifier
, operand_types
, lineno
);
1327 fprintf (table
, " { ");
1329 for (i
= 0; i
< ARRAY_SIZE (operand_types
); i
++)
1331 if (operand_types
[i
] == NULL
|| *operand_types
[i
] == '0')
1334 process_i386_operand_type (table
, "0", stage_opcodes
, "\t ",
1340 fprintf (table
, ",\n ");
1342 process_i386_operand_type (table
, operand_types
[i
], stage_opcodes
,
1345 fprintf (table
, " } },\n");
1348 struct opcode_hash_entry
1350 struct opcode_hash_entry
*next
;
1356 /* Calculate the hash value of an opcode hash entry P. */
1359 opcode_hash_hash (const void *p
)
1361 struct opcode_hash_entry
*entry
= (struct opcode_hash_entry
*) p
;
1362 return htab_hash_string (entry
->name
);
1365 /* Compare a string Q against an opcode hash entry P. */
1368 opcode_hash_eq (const void *p
, const void *q
)
1370 struct opcode_hash_entry
*entry
= (struct opcode_hash_entry
*) p
;
1371 const char *name
= (const char *) q
;
1372 return strcmp (name
, entry
->name
) == 0;
1376 process_i386_opcodes (FILE *table
)
1381 char *str
, *p
, *last
, *name
;
1382 struct opcode_hash_entry
**hash_slot
, **entry
, *next
;
1383 htab_t opcode_hash_table
;
1384 struct opcode_hash_entry
**opcode_array
;
1385 unsigned int opcode_array_size
= 1024;
1386 int lineno
= 0, marker
= 0;
1388 filename
= "i386-opc.tbl";
1392 opcode_array
= (struct opcode_hash_entry
**)
1393 xmalloc (sizeof (*opcode_array
) * opcode_array_size
);
1395 opcode_hash_table
= htab_create_alloc (16, opcode_hash_hash
,
1396 opcode_hash_eq
, NULL
,
1399 fprintf (table
, "\n/* i386 opcode table. */\n\n");
1400 fprintf (table
, "const insn_template i386_optab[] =\n{\n");
1402 /* Put everything on opcode array. */
1405 if (fgets (buf
, sizeof (buf
), fp
) == NULL
)
1410 p
= remove_leading_whitespaces (buf
);
1412 /* Skip comments. */
1413 str
= strstr (p
, "//");
1417 /* Remove trailing white spaces. */
1418 remove_trailing_whitespaces (p
);
1423 if (!strcmp("### MARKER ###", buf
))
1427 /* Since we ignore all included files (we only care about their
1428 #define-s here), we don't need to monitor filenames. The final
1429 line number directive is going to refer to the main source file
1434 p
= remove_leading_whitespaces (p
+ 1);
1435 if (!strncmp(p
, "line", 4))
1437 ln
= strtoul (p
, &end
, 10);
1438 if (ln
> 1 && ln
< INT_MAX
1439 && *remove_leading_whitespaces (end
) == '"')
1442 /* Ignore comments. */
1452 last
= p
+ strlen (p
);
1455 name
= next_field (p
, ',', &str
, last
);
1457 /* Get the slot in hash table. */
1458 hash_slot
= (struct opcode_hash_entry
**)
1459 htab_find_slot_with_hash (opcode_hash_table
, name
,
1460 htab_hash_string (name
),
1463 if (*hash_slot
== NULL
)
1465 /* It is the new one. Put it on opcode array. */
1466 if (i
>= opcode_array_size
)
1468 /* Grow the opcode array when needed. */
1469 opcode_array_size
+= 1024;
1470 opcode_array
= (struct opcode_hash_entry
**)
1471 xrealloc (opcode_array
,
1472 sizeof (*opcode_array
) * opcode_array_size
);
1475 opcode_array
[i
] = (struct opcode_hash_entry
*)
1476 xmalloc (sizeof (struct opcode_hash_entry
));
1477 opcode_array
[i
]->next
= NULL
;
1478 opcode_array
[i
]->name
= xstrdup (name
);
1479 opcode_array
[i
]->opcode
= xstrdup (str
);
1480 opcode_array
[i
]->lineno
= lineno
;
1481 *hash_slot
= opcode_array
[i
];
1486 /* Append it to the existing one. */
1488 while ((*entry
) != NULL
)
1489 entry
= &(*entry
)->next
;
1490 *entry
= (struct opcode_hash_entry
*)
1491 xmalloc (sizeof (struct opcode_hash_entry
));
1492 (*entry
)->next
= NULL
;
1493 (*entry
)->name
= (*hash_slot
)->name
;
1494 (*entry
)->opcode
= xstrdup (str
);
1495 (*entry
)->lineno
= lineno
;
1499 /* Process opcode array. */
1500 for (j
= 0; j
< i
; j
++)
1502 for (next
= opcode_array
[j
]; next
; next
= next
->next
)
1506 lineno
= next
->lineno
;
1507 last
= str
+ strlen (str
);
1508 output_i386_opcode (table
, name
, str
, last
, lineno
);
1514 fprintf (table
, " { NULL, 0, 0, 0, 0,\n");
1516 process_i386_cpu_flag (table
, "0", 0, ",", " ", -1);
1518 process_i386_opcode_modifier (table
, "0", NULL
, -1);
1520 fprintf (table
, " { ");
1521 process_i386_operand_type (table
, "0", stage_opcodes
, "\t ", -1);
1522 fprintf (table
, " } }\n");
1524 fprintf (table
, "};\n");
1528 process_i386_registers (FILE *table
)
1532 char *str
, *p
, *last
;
1533 char *reg_name
, *reg_type
, *reg_flags
, *reg_num
;
1534 char *dw2_32_num
, *dw2_64_num
;
1537 filename
= "i386-reg.tbl";
1538 fp
= fopen (filename
, "r");
1540 fail (_("can't find i386-reg.tbl for reading, errno = %s\n"),
1543 fprintf (table
, "\n/* i386 register table. */\n\n");
1544 fprintf (table
, "const reg_entry i386_regtab[] =\n{\n");
1548 if (fgets (buf
, sizeof (buf
), fp
) == NULL
)
1553 p
= remove_leading_whitespaces (buf
);
1555 /* Skip comments. */
1556 str
= strstr (p
, "//");
1560 /* Remove trailing white spaces. */
1561 remove_trailing_whitespaces (p
);
1566 fprintf (table
, "%s\n", p
);
1574 last
= p
+ strlen (p
);
1576 /* Find reg_name. */
1577 reg_name
= next_field (p
, ',', &str
, last
);
1579 /* Find reg_type. */
1580 reg_type
= next_field (str
, ',', &str
, last
);
1582 /* Find reg_flags. */
1583 reg_flags
= next_field (str
, ',', &str
, last
);
1586 reg_num
= next_field (str
, ',', &str
, last
);
1588 fprintf (table
, " { \"%s\",\n ", reg_name
);
1590 process_i386_operand_type (table
, reg_type
, stage_registers
, "\t",
1593 /* Find 32-bit Dwarf2 register number. */
1594 dw2_32_num
= next_field (str
, ',', &str
, last
);
1596 /* Find 64-bit Dwarf2 register number. */
1597 dw2_64_num
= next_field (str
, ',', &str
, last
);
1599 fprintf (table
, ",\n %s, %s, { %s, %s } },\n",
1600 reg_flags
, reg_num
, dw2_32_num
, dw2_64_num
);
1605 fprintf (table
, "};\n");
1607 fprintf (table
, "\nconst unsigned int i386_regtab_size = ARRAY_SIZE (i386_regtab);\n");
1611 process_i386_initializers (void)
1614 FILE *fp
= fopen ("i386-init.h", "w");
1618 fail (_("can't create i386-init.h, errno = %s\n"),
1621 process_copyright (fp
);
1623 for (i
= 0; i
< ARRAY_SIZE (cpu_flag_init
); i
++)
1625 fprintf (fp
, "\n#define %s \\\n", cpu_flag_init
[i
].name
);
1626 init
= xstrdup (cpu_flag_init
[i
].init
);
1627 process_i386_cpu_flag (fp
, init
, 1, "", " ", -1);
1631 for (i
= 0; i
< ARRAY_SIZE (operand_type_init
); i
++)
1633 fprintf (fp
, "\n\n#define %s \\\n ", operand_type_init
[i
].name
);
1634 init
= xstrdup (operand_type_init
[i
].init
);
1635 process_i386_operand_type (fp
, init
, stage_macros
, " ", -1);
1643 /* Program options. */
1644 #define OPTION_SRCDIR 200
1646 struct option long_options
[] =
1648 {"srcdir", required_argument
, NULL
, OPTION_SRCDIR
},
1649 {"debug", no_argument
, NULL
, 'd'},
1650 {"version", no_argument
, NULL
, 'V'},
1651 {"help", no_argument
, NULL
, 'h'},
1652 {0, no_argument
, NULL
, 0}
1656 print_version (void)
1658 printf ("%s: version 1.0\n", program_name
);
1663 usage (FILE * stream
, int status
)
1665 fprintf (stream
, "Usage: %s [-V | --version] [-d | --debug] [--srcdir=dirname] [--help]\n",
1671 main (int argc
, char **argv
)
1673 extern int chdir (char *);
1674 char *srcdir
= NULL
;
1676 unsigned int i
, cpumax
;
1679 program_name
= *argv
;
1680 xmalloc_set_program_name (program_name
);
1682 while ((c
= getopt_long (argc
, argv
, "vVdh", long_options
, 0)) != EOF
)
1707 if (chdir (srcdir
) != 0)
1708 fail (_("unable to change directory to \"%s\", errno = %s\n"),
1709 srcdir
, xstrerror (errno
));
1711 /* cpu_flags isn't sorted by position. */
1713 for (i
= 0; i
< ARRAY_SIZE (cpu_flags
); i
++)
1714 if (cpu_flags
[i
].position
> cpumax
)
1715 cpumax
= cpu_flags
[i
].position
;
1717 /* Check the unused bitfield in i386_cpu_flags. */
1719 static_assert (ARRAY_SIZE (cpu_flags
) == CpuMax
+ 2);
1721 if ((cpumax
- 1) != CpuMax
)
1722 fail (_("CpuMax != %d!\n"), cpumax
);
1724 static_assert (ARRAY_SIZE (cpu_flags
) == CpuMax
+ 1);
1726 if (cpumax
!= CpuMax
)
1727 fail (_("CpuMax != %d!\n"), cpumax
);
1729 c
= CpuNumOfBits
- CpuMax
- 1;
1731 fail (_("%d unused bits in i386_cpu_flags.\n"), c
);
1734 static_assert (ARRAY_SIZE (opcode_modifiers
) == Opcode_Modifier_Num
);
1736 /* Check the unused bitfield in i386_operand_type. */
1738 static_assert (ARRAY_SIZE (operand_types
) + CLASS_WIDTH
+ INSTANCE_WIDTH
1741 static_assert (ARRAY_SIZE (operand_types
) + CLASS_WIDTH
+ INSTANCE_WIDTH
1744 c
= OTNumOfBits
- OTNum
;
1746 fail (_("%d unused bits in i386_operand_type.\n"), c
);
1749 qsort (cpu_flags
, ARRAY_SIZE (cpu_flags
), sizeof (cpu_flags
[0]),
1752 qsort (opcode_modifiers
, ARRAY_SIZE (opcode_modifiers
),
1753 sizeof (opcode_modifiers
[0]), compare
);
1755 qsort (operand_types
, ARRAY_SIZE (operand_types
),
1756 sizeof (operand_types
[0]), compare
);
1758 table
= fopen ("i386-tbl.h", "w");
1760 fail (_("can't create i386-tbl.h, errno = %s\n"),
1763 process_copyright (table
);
1765 process_i386_opcodes (table
);
1766 process_i386_registers (table
);
1767 process_i386_initializers ();