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
[] = {
711 static bitfield operand_types
[] =
720 BITFIELD (BaseIndex
),
726 BITFIELD (JumpAbsolute
),
737 BITFIELD (Unspecified
),
744 static const char *filename
;
745 static i386_cpu_flags active_cpu_flags
;
746 static int active_isstring
;
749 compare (const void *x
, const void *y
)
751 const bitfield
*xp
= (const bitfield
*) x
;
752 const bitfield
*yp
= (const bitfield
*) y
;
753 return xp
->position
- yp
->position
;
757 fail (const char *message
, ...)
761 va_start (args
, message
);
762 fprintf (stderr
, _("%s: error: "), program_name
);
763 vfprintf (stderr
, message
, args
);
769 process_copyright (FILE *fp
)
771 fprintf (fp
, "/* This file is automatically generated by i386-gen. Do not edit! */\n\
772 /* Copyright (C) 2007-2019 Free Software Foundation, Inc.\n\
774 This file is part of the GNU opcodes library.\n\
776 This library is free software; you can redistribute it and/or modify\n\
777 it under the terms of the GNU General Public License as published by\n\
778 the Free Software Foundation; either version 3, or (at your option)\n\
779 any later version.\n\
781 It is distributed in the hope that it will be useful, but WITHOUT\n\
782 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n\
783 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public\n\
784 License for more details.\n\
786 You should have received a copy of the GNU General Public License\n\
787 along with this program; if not, write to the Free Software\n\
788 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,\n\
789 MA 02110-1301, USA. */\n");
792 /* Remove leading white spaces. */
795 remove_leading_whitespaces (char *str
)
797 while (ISSPACE (*str
))
802 /* Remove trailing white spaces. */
805 remove_trailing_whitespaces (char *str
)
807 size_t last
= strlen (str
);
815 if (ISSPACE (str
[last
]))
823 /* Find next field separated by SEP and terminate it. Return a
824 pointer to the one after it. */
827 next_field (char *str
, char sep
, char **next
, char *last
)
831 p
= remove_leading_whitespaces (str
);
832 for (str
= p
; *str
!= sep
&& *str
!= '\0'; str
++);
835 remove_trailing_whitespaces (p
);
845 static void set_bitfield (char *, bitfield
*, int, unsigned int, int);
848 set_bitfield_from_cpu_flag_init (char *f
, bitfield
*array
, unsigned int size
,
851 char *str
, *next
, *last
;
854 for (i
= 0; i
< ARRAY_SIZE (cpu_flag_init
); i
++)
855 if (strcmp (cpu_flag_init
[i
].name
, f
) == 0)
857 /* Turn on selective bits. */
858 char *init
= xstrdup (cpu_flag_init
[i
].init
);
859 last
= init
+ strlen (init
);
860 for (next
= init
; next
&& next
< last
; )
862 str
= next_field (next
, '|', &next
, last
);
864 set_bitfield (str
, array
, 1, size
, lineno
);
874 set_bitfield (char *f
, bitfield
*array
, int value
,
875 unsigned int size
, int lineno
)
879 if (strcmp (f
, "CpuFP") == 0)
881 set_bitfield("Cpu387", array
, value
, size
, lineno
);
882 set_bitfield("Cpu287", array
, value
, size
, lineno
);
885 else if (strcmp (f
, "Mmword") == 0)
887 else if (strcmp (f
, "Oword") == 0)
890 for (i
= 0; i
< size
; i
++)
891 if (strcasecmp (array
[i
].name
, f
) == 0)
893 array
[i
].value
= value
;
899 const char *v
= strchr (f
, '=');
906 for (i
= 0; i
< size
; i
++)
907 if (strncasecmp (array
[i
].name
, f
, n
) == 0)
909 value
= strtol (v
+ 1, &end
, 0);
912 array
[i
].value
= value
;
920 /* Handle CPU_XXX_FLAGS. */
921 if (value
== 1 && !set_bitfield_from_cpu_flag_init (f
, array
, size
, lineno
))
925 fail (_("%s: %d: unknown bitfield: %s\n"), filename
, lineno
, f
);
927 fail (_("unknown bitfield: %s\n"), f
);
931 output_cpu_flags (FILE *table
, bitfield
*flags
, unsigned int size
,
932 int macro
, const char *comma
, const char *indent
)
936 memset (&active_cpu_flags
, 0, sizeof(active_cpu_flags
));
938 fprintf (table
, "%s{ { ", indent
);
940 for (i
= 0; i
< size
- 1; i
++)
942 if (((i
+ 1) % 20) != 0)
943 fprintf (table
, "%d, ", flags
[i
].value
);
945 fprintf (table
, "%d,", flags
[i
].value
);
946 if (((i
+ 1) % 20) == 0)
948 /* We need \\ for macro. */
950 fprintf (table
, " \\\n %s", indent
);
952 fprintf (table
, "\n %s", indent
);
955 active_cpu_flags
.array
[i
/ 32] |= 1U << (i
% 32);
958 fprintf (table
, "%d } }%s\n", flags
[i
].value
, comma
);
962 process_i386_cpu_flag (FILE *table
, char *flag
, int macro
,
963 const char *comma
, const char *indent
,
966 char *str
, *next
, *last
;
968 bitfield flags
[ARRAY_SIZE (cpu_flags
)];
970 /* Copy the default cpu flags. */
971 memcpy (flags
, cpu_flags
, sizeof (cpu_flags
));
973 if (strcasecmp (flag
, "unknown") == 0)
975 /* We turn on everything except for cpu64 in case of
976 CPU_UNKNOWN_FLAGS. */
977 for (i
= 0; i
< ARRAY_SIZE (flags
); i
++)
978 if (flags
[i
].position
!= Cpu64
)
981 else if (flag
[0] == '~')
983 last
= flag
+ strlen (flag
);
990 fail (_("%s: %d: missing `)' in bitfield: %s\n"), filename
,
997 /* First we turn on everything except for cpu64. */
998 for (i
= 0; i
< ARRAY_SIZE (flags
); i
++)
999 if (flags
[i
].position
!= Cpu64
)
1002 /* Turn off selective bits. */
1003 for (; next
&& next
< last
; )
1005 str
= next_field (next
, '|', &next
, last
);
1007 set_bitfield (str
, flags
, 0, ARRAY_SIZE (flags
), lineno
);
1010 else if (strcmp (flag
, "0"))
1012 /* Turn on selective bits. */
1013 last
= flag
+ strlen (flag
);
1014 for (next
= flag
; next
&& next
< last
; )
1016 str
= next_field (next
, '|', &next
, last
);
1018 set_bitfield (str
, flags
, 1, ARRAY_SIZE (flags
), lineno
);
1022 output_cpu_flags (table
, flags
, ARRAY_SIZE (flags
), macro
,
1027 output_opcode_modifier (FILE *table
, bitfield
*modifier
, unsigned int size
)
1031 fprintf (table
, " { ");
1033 for (i
= 0; i
< size
- 1; i
++)
1035 if (((i
+ 1) % 20) != 0)
1036 fprintf (table
, "%d, ", modifier
[i
].value
);
1038 fprintf (table
, "%d,", modifier
[i
].value
);
1039 if (((i
+ 1) % 20) == 0)
1040 fprintf (table
, "\n ");
1043 fprintf (table
, "%d },\n", modifier
[i
].value
);
1047 adjust_broadcast_modifier (char **opnd
)
1049 char *str
, *next
, *last
, *op
;
1050 int bcst_type
= INT_MAX
;
1052 /* Skip the immediate operand. */
1054 if (strcasecmp(op
, "Imm8") == 0)
1058 last
= op
+ strlen (op
);
1059 for (next
= op
; next
&& next
< last
; )
1061 str
= next_field (next
, '|', &next
, last
);
1064 if (strcasecmp(str
, "Byte") == 0)
1066 /* The smalest broadcast type, no need to check
1068 bcst_type
= BYTE_BROADCAST
;
1071 else if (strcasecmp(str
, "Word") == 0)
1073 if (bcst_type
> WORD_BROADCAST
)
1074 bcst_type
= WORD_BROADCAST
;
1076 else if (strcasecmp(str
, "Dword") == 0)
1078 if (bcst_type
> DWORD_BROADCAST
)
1079 bcst_type
= DWORD_BROADCAST
;
1081 else if (strcasecmp(str
, "Qword") == 0)
1083 if (bcst_type
> QWORD_BROADCAST
)
1084 bcst_type
= QWORD_BROADCAST
;
1090 if (bcst_type
== INT_MAX
)
1091 fail (_("unknown broadcast operand: %s\n"), op
);
1097 process_i386_opcode_modifier (FILE *table
, char *mod
, char **opnd
, int lineno
)
1099 char *str
, *next
, *last
;
1100 bitfield modifiers
[ARRAY_SIZE (opcode_modifiers
)];
1102 active_isstring
= 0;
1104 /* Copy the default opcode modifier. */
1105 memcpy (modifiers
, opcode_modifiers
, sizeof (modifiers
));
1107 if (strcmp (mod
, "0"))
1109 unsigned int have_w
= 0, bwlq_suf
= 0xf;
1111 last
= mod
+ strlen (mod
);
1112 for (next
= mod
; next
&& next
< last
; )
1114 str
= next_field (next
, '|', &next
, last
);
1118 if (strcasecmp(str
, "Broadcast") == 0)
1119 val
= adjust_broadcast_modifier (opnd
);
1120 set_bitfield (str
, modifiers
, val
, ARRAY_SIZE (modifiers
),
1122 if (strcasecmp(str
, "IsString") == 0)
1123 active_isstring
= 1;
1125 if (strcasecmp(str
, "W") == 0)
1128 if (strcasecmp(str
, "No_bSuf") == 0)
1130 if (strcasecmp(str
, "No_wSuf") == 0)
1132 if (strcasecmp(str
, "No_lSuf") == 0)
1134 if (strcasecmp(str
, "No_qSuf") == 0)
1139 if (have_w
&& !bwlq_suf
)
1140 fail ("%s: %d: stray W modifier\n", filename
, lineno
);
1141 if (have_w
&& !(bwlq_suf
& 1))
1142 fprintf (stderr
, "%s: %d: W modifier without Byte operand(s)\n",
1144 if (have_w
&& !(bwlq_suf
& ~1))
1146 "%s: %d: W modifier without Word/Dword/Qword operand(s)\n",
1149 output_opcode_modifier (table
, modifiers
, ARRAY_SIZE (modifiers
));
1159 output_operand_type (FILE *table
, enum operand_class
class,
1160 enum operand_instance instance
,
1161 const bitfield
*types
, unsigned int size
,
1162 enum stage stage
, const char *indent
)
1166 fprintf (table
, "{ { %d, %d, ", class, instance
);
1168 for (i
= 0; i
< size
- 1; i
++)
1170 if (((i
+ 3) % 20) != 0)
1171 fprintf (table
, "%d, ", types
[i
].value
);
1173 fprintf (table
, "%d,", types
[i
].value
);
1174 if (((i
+ 3) % 20) == 0)
1176 /* We need \\ for macro. */
1177 if (stage
== stage_macros
)
1178 fprintf (table
, " \\\n%s", indent
);
1180 fprintf (table
, "\n%s", indent
);
1184 fprintf (table
, "%d } }", types
[i
].value
);
1188 process_i386_operand_type (FILE *table
, char *op
, enum stage stage
,
1189 const char *indent
, int lineno
)
1191 char *str
, *next
, *last
;
1192 enum operand_class
class = ClassNone
;
1193 enum operand_instance instance
= InstanceNone
;
1194 bitfield types
[ARRAY_SIZE (operand_types
)];
1196 /* Copy the default operand type. */
1197 memcpy (types
, operand_types
, sizeof (types
));
1199 if (strcmp (op
, "0"))
1203 last
= op
+ strlen (op
);
1204 for (next
= op
; next
&& next
< last
; )
1206 str
= next_field (next
, '|', &next
, last
);
1211 if (!strncmp(str
, "Class=", 6))
1213 for (i
= 0; i
< ARRAY_SIZE(operand_classes
); ++i
)
1214 if (!strcmp(str
+ 6, operand_classes
[i
].name
))
1216 class = operand_classes
[i
].value
;
1222 if (str
&& !strncmp(str
, "Instance=", 9))
1224 for (i
= 0; i
< ARRAY_SIZE(operand_instances
); ++i
)
1225 if (!strcmp(str
+ 9, operand_instances
[i
].name
))
1227 instance
= operand_instances
[i
].value
;
1235 set_bitfield (str
, types
, 1, ARRAY_SIZE (types
), lineno
);
1236 if (strcasecmp(str
, "BaseIndex") == 0)
1241 if (stage
== stage_opcodes
&& baseindex
&& !active_isstring
)
1243 set_bitfield("Disp8", types
, 1, ARRAY_SIZE (types
), lineno
);
1244 if (!active_cpu_flags
.bitfield
.cpu64
1245 && !active_cpu_flags
.bitfield
.cpumpx
)
1246 set_bitfield("Disp16", types
, 1, ARRAY_SIZE (types
), lineno
);
1247 set_bitfield("Disp32", types
, 1, ARRAY_SIZE (types
), lineno
);
1248 if (!active_cpu_flags
.bitfield
.cpuno64
)
1249 set_bitfield("Disp32S", types
, 1, ARRAY_SIZE (types
), lineno
);
1252 output_operand_type (table
, class, instance
, types
, ARRAY_SIZE (types
),
1257 output_i386_opcode (FILE *table
, const char *name
, char *str
,
1258 char *last
, int lineno
)
1261 char *operands
, *base_opcode
, *extension_opcode
, *opcode_length
;
1262 char *cpu_flags
, *opcode_modifier
, *operand_types
[MAX_OPERANDS
];
1264 /* Find number of operands. */
1265 operands
= next_field (str
, ',', &str
, last
);
1267 /* Find base_opcode. */
1268 base_opcode
= next_field (str
, ',', &str
, last
);
1270 /* Find extension_opcode. */
1271 extension_opcode
= next_field (str
, ',', &str
, last
);
1273 /* Find opcode_length. */
1274 opcode_length
= next_field (str
, ',', &str
, last
);
1276 /* Find cpu_flags. */
1277 cpu_flags
= next_field (str
, ',', &str
, last
);
1279 /* Find opcode_modifier. */
1280 opcode_modifier
= next_field (str
, ',', &str
, last
);
1282 /* Remove the first {. */
1283 str
= remove_leading_whitespaces (str
);
1286 str
= remove_leading_whitespaces (str
+ 1);
1290 /* There are at least "X}". */
1294 /* Remove trailing white spaces and }. */
1298 if (ISSPACE (str
[i
]) || str
[i
] == '}')
1307 /* Find operand_types. */
1308 for (i
= 0; i
< ARRAY_SIZE (operand_types
); i
++)
1312 operand_types
[i
] = NULL
;
1316 operand_types
[i
] = next_field (str
, ',', &str
, last
);
1317 if (*operand_types
[i
] == '0')
1320 operand_types
[i
] = NULL
;
1325 fprintf (table
, " { \"%s\", %s, %s, %s, %s,\n",
1326 name
, base_opcode
, extension_opcode
, opcode_length
, operands
);
1328 process_i386_cpu_flag (table
, cpu_flags
, 0, ",", " ", lineno
);
1330 process_i386_opcode_modifier (table
, opcode_modifier
, operand_types
, lineno
);
1332 fprintf (table
, " { ");
1334 for (i
= 0; i
< ARRAY_SIZE (operand_types
); i
++)
1336 if (operand_types
[i
] == NULL
|| *operand_types
[i
] == '0')
1339 process_i386_operand_type (table
, "0", stage_opcodes
, "\t ",
1345 fprintf (table
, ",\n ");
1347 process_i386_operand_type (table
, operand_types
[i
], stage_opcodes
,
1350 fprintf (table
, " } },\n");
1353 struct opcode_hash_entry
1355 struct opcode_hash_entry
*next
;
1361 /* Calculate the hash value of an opcode hash entry P. */
1364 opcode_hash_hash (const void *p
)
1366 struct opcode_hash_entry
*entry
= (struct opcode_hash_entry
*) p
;
1367 return htab_hash_string (entry
->name
);
1370 /* Compare a string Q against an opcode hash entry P. */
1373 opcode_hash_eq (const void *p
, const void *q
)
1375 struct opcode_hash_entry
*entry
= (struct opcode_hash_entry
*) p
;
1376 const char *name
= (const char *) q
;
1377 return strcmp (name
, entry
->name
) == 0;
1381 process_i386_opcodes (FILE *table
)
1386 char *str
, *p
, *last
, *name
;
1387 struct opcode_hash_entry
**hash_slot
, **entry
, *next
;
1388 htab_t opcode_hash_table
;
1389 struct opcode_hash_entry
**opcode_array
;
1390 unsigned int opcode_array_size
= 1024;
1391 int lineno
= 0, marker
= 0;
1393 filename
= "i386-opc.tbl";
1397 opcode_array
= (struct opcode_hash_entry
**)
1398 xmalloc (sizeof (*opcode_array
) * opcode_array_size
);
1400 opcode_hash_table
= htab_create_alloc (16, opcode_hash_hash
,
1401 opcode_hash_eq
, NULL
,
1404 fprintf (table
, "\n/* i386 opcode table. */\n\n");
1405 fprintf (table
, "const insn_template i386_optab[] =\n{\n");
1407 /* Put everything on opcode array. */
1410 if (fgets (buf
, sizeof (buf
), fp
) == NULL
)
1415 p
= remove_leading_whitespaces (buf
);
1417 /* Skip comments. */
1418 str
= strstr (p
, "//");
1422 /* Remove trailing white spaces. */
1423 remove_trailing_whitespaces (p
);
1428 if (!strcmp("### MARKER ###", buf
))
1432 /* Since we ignore all included files (we only care about their
1433 #define-s here), we don't need to monitor filenames. The final
1434 line number directive is going to refer to the main source file
1439 p
= remove_leading_whitespaces (p
+ 1);
1440 if (!strncmp(p
, "line", 4))
1442 ln
= strtoul (p
, &end
, 10);
1443 if (ln
> 1 && ln
< INT_MAX
1444 && *remove_leading_whitespaces (end
) == '"')
1447 /* Ignore comments. */
1457 last
= p
+ strlen (p
);
1460 name
= next_field (p
, ',', &str
, last
);
1462 /* Get the slot in hash table. */
1463 hash_slot
= (struct opcode_hash_entry
**)
1464 htab_find_slot_with_hash (opcode_hash_table
, name
,
1465 htab_hash_string (name
),
1468 if (*hash_slot
== NULL
)
1470 /* It is the new one. Put it on opcode array. */
1471 if (i
>= opcode_array_size
)
1473 /* Grow the opcode array when needed. */
1474 opcode_array_size
+= 1024;
1475 opcode_array
= (struct opcode_hash_entry
**)
1476 xrealloc (opcode_array
,
1477 sizeof (*opcode_array
) * opcode_array_size
);
1480 opcode_array
[i
] = (struct opcode_hash_entry
*)
1481 xmalloc (sizeof (struct opcode_hash_entry
));
1482 opcode_array
[i
]->next
= NULL
;
1483 opcode_array
[i
]->name
= xstrdup (name
);
1484 opcode_array
[i
]->opcode
= xstrdup (str
);
1485 opcode_array
[i
]->lineno
= lineno
;
1486 *hash_slot
= opcode_array
[i
];
1491 /* Append it to the existing one. */
1493 while ((*entry
) != NULL
)
1494 entry
= &(*entry
)->next
;
1495 *entry
= (struct opcode_hash_entry
*)
1496 xmalloc (sizeof (struct opcode_hash_entry
));
1497 (*entry
)->next
= NULL
;
1498 (*entry
)->name
= (*hash_slot
)->name
;
1499 (*entry
)->opcode
= xstrdup (str
);
1500 (*entry
)->lineno
= lineno
;
1504 /* Process opcode array. */
1505 for (j
= 0; j
< i
; j
++)
1507 for (next
= opcode_array
[j
]; next
; next
= next
->next
)
1511 lineno
= next
->lineno
;
1512 last
= str
+ strlen (str
);
1513 output_i386_opcode (table
, name
, str
, last
, lineno
);
1519 fprintf (table
, " { NULL, 0, 0, 0, 0,\n");
1521 process_i386_cpu_flag (table
, "0", 0, ",", " ", -1);
1523 process_i386_opcode_modifier (table
, "0", NULL
, -1);
1525 fprintf (table
, " { ");
1526 process_i386_operand_type (table
, "0", stage_opcodes
, "\t ", -1);
1527 fprintf (table
, " } }\n");
1529 fprintf (table
, "};\n");
1533 process_i386_registers (FILE *table
)
1537 char *str
, *p
, *last
;
1538 char *reg_name
, *reg_type
, *reg_flags
, *reg_num
;
1539 char *dw2_32_num
, *dw2_64_num
;
1542 filename
= "i386-reg.tbl";
1543 fp
= fopen (filename
, "r");
1545 fail (_("can't find i386-reg.tbl for reading, errno = %s\n"),
1548 fprintf (table
, "\n/* i386 register table. */\n\n");
1549 fprintf (table
, "const reg_entry i386_regtab[] =\n{\n");
1553 if (fgets (buf
, sizeof (buf
), fp
) == NULL
)
1558 p
= remove_leading_whitespaces (buf
);
1560 /* Skip comments. */
1561 str
= strstr (p
, "//");
1565 /* Remove trailing white spaces. */
1566 remove_trailing_whitespaces (p
);
1571 fprintf (table
, "%s\n", p
);
1579 last
= p
+ strlen (p
);
1581 /* Find reg_name. */
1582 reg_name
= next_field (p
, ',', &str
, last
);
1584 /* Find reg_type. */
1585 reg_type
= next_field (str
, ',', &str
, last
);
1587 /* Find reg_flags. */
1588 reg_flags
= next_field (str
, ',', &str
, last
);
1591 reg_num
= next_field (str
, ',', &str
, last
);
1593 fprintf (table
, " { \"%s\",\n ", reg_name
);
1595 process_i386_operand_type (table
, reg_type
, stage_registers
, "\t",
1598 /* Find 32-bit Dwarf2 register number. */
1599 dw2_32_num
= next_field (str
, ',', &str
, last
);
1601 /* Find 64-bit Dwarf2 register number. */
1602 dw2_64_num
= next_field (str
, ',', &str
, last
);
1604 fprintf (table
, ",\n %s, %s, { %s, %s } },\n",
1605 reg_flags
, reg_num
, dw2_32_num
, dw2_64_num
);
1610 fprintf (table
, "};\n");
1612 fprintf (table
, "\nconst unsigned int i386_regtab_size = ARRAY_SIZE (i386_regtab);\n");
1616 process_i386_initializers (void)
1619 FILE *fp
= fopen ("i386-init.h", "w");
1623 fail (_("can't create i386-init.h, errno = %s\n"),
1626 process_copyright (fp
);
1628 for (i
= 0; i
< ARRAY_SIZE (cpu_flag_init
); i
++)
1630 fprintf (fp
, "\n#define %s \\\n", cpu_flag_init
[i
].name
);
1631 init
= xstrdup (cpu_flag_init
[i
].init
);
1632 process_i386_cpu_flag (fp
, init
, 1, "", " ", -1);
1636 for (i
= 0; i
< ARRAY_SIZE (operand_type_init
); i
++)
1638 fprintf (fp
, "\n\n#define %s \\\n ", operand_type_init
[i
].name
);
1639 init
= xstrdup (operand_type_init
[i
].init
);
1640 process_i386_operand_type (fp
, init
, stage_macros
, " ", -1);
1648 /* Program options. */
1649 #define OPTION_SRCDIR 200
1651 struct option long_options
[] =
1653 {"srcdir", required_argument
, NULL
, OPTION_SRCDIR
},
1654 {"debug", no_argument
, NULL
, 'd'},
1655 {"version", no_argument
, NULL
, 'V'},
1656 {"help", no_argument
, NULL
, 'h'},
1657 {0, no_argument
, NULL
, 0}
1661 print_version (void)
1663 printf ("%s: version 1.0\n", program_name
);
1668 usage (FILE * stream
, int status
)
1670 fprintf (stream
, "Usage: %s [-V | --version] [-d | --debug] [--srcdir=dirname] [--help]\n",
1676 main (int argc
, char **argv
)
1678 extern int chdir (char *);
1679 char *srcdir
= NULL
;
1681 unsigned int i
, cpumax
;
1684 program_name
= *argv
;
1685 xmalloc_set_program_name (program_name
);
1687 while ((c
= getopt_long (argc
, argv
, "vVdh", long_options
, 0)) != EOF
)
1712 if (chdir (srcdir
) != 0)
1713 fail (_("unable to change directory to \"%s\", errno = %s\n"),
1714 srcdir
, xstrerror (errno
));
1716 /* cpu_flags isn't sorted by position. */
1718 for (i
= 0; i
< ARRAY_SIZE (cpu_flags
); i
++)
1719 if (cpu_flags
[i
].position
> cpumax
)
1720 cpumax
= cpu_flags
[i
].position
;
1722 /* Check the unused bitfield in i386_cpu_flags. */
1724 static_assert (ARRAY_SIZE (cpu_flags
) == CpuMax
+ 2);
1726 if ((cpumax
- 1) != CpuMax
)
1727 fail (_("CpuMax != %d!\n"), cpumax
);
1729 static_assert (ARRAY_SIZE (cpu_flags
) == CpuMax
+ 1);
1731 if (cpumax
!= CpuMax
)
1732 fail (_("CpuMax != %d!\n"), cpumax
);
1734 c
= CpuNumOfBits
- CpuMax
- 1;
1736 fail (_("%d unused bits in i386_cpu_flags.\n"), c
);
1739 static_assert (ARRAY_SIZE (opcode_modifiers
) == Opcode_Modifier_Num
);
1741 /* Check the unused bitfield in i386_operand_type. */
1743 static_assert (ARRAY_SIZE (operand_types
) + CLASS_WIDTH
+ INSTANCE_WIDTH
1746 static_assert (ARRAY_SIZE (operand_types
) + CLASS_WIDTH
+ INSTANCE_WIDTH
1749 c
= OTNumOfBits
- OTMax
- 1;
1751 fail (_("%d unused bits in i386_operand_type.\n"), c
);
1754 qsort (cpu_flags
, ARRAY_SIZE (cpu_flags
), sizeof (cpu_flags
[0]),
1757 qsort (opcode_modifiers
, ARRAY_SIZE (opcode_modifiers
),
1758 sizeof (opcode_modifiers
[0]), compare
);
1760 qsort (operand_types
, ARRAY_SIZE (operand_types
),
1761 sizeof (operand_types
[0]), compare
);
1763 table
= fopen ("i386-tbl.h", "w");
1765 fail (_("can't create i386-tbl.h, errno = %s\n"),
1768 process_copyright (table
);
1770 process_i386_opcodes (table
);
1771 process_i386_registers (table
);
1772 process_i386_initializers ();