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_REGMMX",
442 { "OPERAND_TYPE_REGXMM",
443 "Class=RegSIMD|Xmmword" },
444 { "OPERAND_TYPE_REGYMM",
445 "Class=RegSIMD|Ymmword" },
446 { "OPERAND_TYPE_REGZMM",
447 "Class=RegSIMD|Zmmword" },
448 { "OPERAND_TYPE_REGMASK",
450 { "OPERAND_TYPE_REGBND",
452 { "OPERAND_TYPE_ACC8",
453 "Instance=Accum|Byte" },
454 { "OPERAND_TYPE_ACC16",
455 "Instance=Accum|Word" },
456 { "OPERAND_TYPE_ACC32",
457 "Instance=Accum|Dword" },
458 { "OPERAND_TYPE_ACC64",
459 "Instance=Accum|Qword" },
460 { "OPERAND_TYPE_DISP16_32",
462 { "OPERAND_TYPE_ANYDISP",
463 "Disp8|Disp16|Disp32|Disp32S|Disp64" },
464 { "OPERAND_TYPE_IMM16_32",
466 { "OPERAND_TYPE_IMM16_32S",
468 { "OPERAND_TYPE_IMM16_32_32S",
469 "Imm16|Imm32|Imm32S" },
470 { "OPERAND_TYPE_IMM32_64",
472 { "OPERAND_TYPE_IMM32_32S_DISP32",
473 "Imm32|Imm32S|Disp32" },
474 { "OPERAND_TYPE_IMM64_DISP64",
476 { "OPERAND_TYPE_IMM32_32S_64_DISP32",
477 "Imm32|Imm32S|Imm64|Disp32" },
478 { "OPERAND_TYPE_IMM32_32S_64_DISP32_64",
479 "Imm32|Imm32S|Imm64|Disp32|Disp64" },
480 { "OPERAND_TYPE_ANYIMM",
481 "Imm1|Imm8|Imm8S|Imm16|Imm32|Imm32S|Imm64" },
484 typedef struct bitfield
491 #define BITFIELD(n) { n, 0, #n }
493 static bitfield cpu_flags
[] =
503 BITFIELD (CpuClflush
),
505 BITFIELD (CpuSYSCALL
),
510 BITFIELD (CpuFISTTP
),
516 BITFIELD (CpuSSE4_1
),
517 BITFIELD (CpuSSE4_2
),
520 BITFIELD (CpuAVX512F
),
521 BITFIELD (CpuAVX512CD
),
522 BITFIELD (CpuAVX512ER
),
523 BITFIELD (CpuAVX512PF
),
524 BITFIELD (CpuAVX512VL
),
525 BITFIELD (CpuAVX512DQ
),
526 BITFIELD (CpuAVX512BW
),
532 BITFIELD (Cpu3dnowA
),
533 BITFIELD (CpuPadLock
),
539 BITFIELD (CpuXsaveopt
),
541 BITFIELD (CpuPCLMUL
),
552 BITFIELD (CpuRdtscp
),
553 BITFIELD (CpuFSGSBase
),
560 BITFIELD (CpuINVPCID
),
561 BITFIELD (CpuVMFUNC
),
562 BITFIELD (CpuRDSEED
),
564 BITFIELD (CpuPRFCHW
),
567 BITFIELD (CpuClflushOpt
),
568 BITFIELD (CpuXSAVES
),
569 BITFIELD (CpuXSAVEC
),
570 BITFIELD (CpuPREFETCHWT1
),
576 BITFIELD (CpuAVX512IFMA
),
577 BITFIELD (CpuAVX512VBMI
),
578 BITFIELD (CpuAVX512_4FMAPS
),
579 BITFIELD (CpuAVX512_4VNNIW
),
580 BITFIELD (CpuAVX512_VPOPCNTDQ
),
581 BITFIELD (CpuAVX512_VBMI2
),
582 BITFIELD (CpuAVX512_VNNI
),
583 BITFIELD (CpuAVX512_BITALG
),
584 BITFIELD (CpuAVX512_BF16
),
585 BITFIELD (CpuAVX512_VP2INTERSECT
),
586 BITFIELD (CpuMWAITX
),
587 BITFIELD (CpuCLZERO
),
590 BITFIELD (CpuPTWRITE
),
595 BITFIELD (CpuVPCLMULQDQ
),
596 BITFIELD (CpuWBNOINVD
),
597 BITFIELD (CpuPCONFIG
),
598 BITFIELD (CpuWAITPKG
),
599 BITFIELD (CpuCLDEMOTE
),
600 BITFIELD (CpuMOVDIRI
),
601 BITFIELD (CpuMOVDIR64B
),
602 BITFIELD (CpuENQCMD
),
604 BITFIELD (CpuMCOMMIT
),
606 BITFIELD (CpuUnused
),
610 static bitfield opcode_modifiers
[] =
616 BITFIELD (ShortForm
),
618 BITFIELD (JumpDword
),
620 BITFIELD (JumpInterSegment
),
621 BITFIELD (JumpAbsolute
),
625 BITFIELD (CheckRegSize
),
626 BITFIELD (IgnoreSize
),
627 BITFIELD (DefaultSize
),
638 BITFIELD (BNDPrefixOk
),
639 BITFIELD (NoTrackPrefixOk
),
640 BITFIELD (IsLockable
),
641 BITFIELD (RegKludge
),
642 BITFIELD (Implicit1stXmm0
),
643 BITFIELD (RepPrefixOk
),
644 BITFIELD (HLEPrefixOk
),
647 BITFIELD (AddrPrefixOpReg
),
656 BITFIELD (VexOpcode
),
657 BITFIELD (VexSources
),
663 BITFIELD (Broadcast
),
664 BITFIELD (StaticRounding
),
666 BITFIELD (Disp8MemShift
),
667 BITFIELD (NoDefMask
),
668 BITFIELD (ImplicitQuadGroup
),
670 BITFIELD (ATTMnemonic
),
671 BITFIELD (ATTSyntax
),
672 BITFIELD (IntelSyntax
),
677 #define CLASS(n) #n, n
679 static const struct {
681 enum operand_class value
;
682 } operand_classes
[] = {
696 #define INSTANCE(n) #n, n
698 static const struct {
700 enum operand_instance value
;
701 } operand_instances
[] = {
710 static bitfield operand_types
[] =
719 BITFIELD (BaseIndex
),
734 BITFIELD (Unspecified
),
740 static const char *filename
;
741 static i386_cpu_flags active_cpu_flags
;
742 static int active_isstring
;
745 compare (const void *x
, const void *y
)
747 const bitfield
*xp
= (const bitfield
*) x
;
748 const bitfield
*yp
= (const bitfield
*) y
;
749 return xp
->position
- yp
->position
;
753 fail (const char *message
, ...)
757 va_start (args
, message
);
758 fprintf (stderr
, _("%s: error: "), program_name
);
759 vfprintf (stderr
, message
, args
);
765 process_copyright (FILE *fp
)
767 fprintf (fp
, "/* This file is automatically generated by i386-gen. Do not edit! */\n\
768 /* Copyright (C) 2007-2019 Free Software Foundation, Inc.\n\
770 This file is part of the GNU opcodes library.\n\
772 This library is free software; you can redistribute it and/or modify\n\
773 it under the terms of the GNU General Public License as published by\n\
774 the Free Software Foundation; either version 3, or (at your option)\n\
775 any later version.\n\
777 It is distributed in the hope that it will be useful, but WITHOUT\n\
778 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n\
779 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public\n\
780 License for more details.\n\
782 You should have received a copy of the GNU General Public License\n\
783 along with this program; if not, write to the Free Software\n\
784 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,\n\
785 MA 02110-1301, USA. */\n");
788 /* Remove leading white spaces. */
791 remove_leading_whitespaces (char *str
)
793 while (ISSPACE (*str
))
798 /* Remove trailing white spaces. */
801 remove_trailing_whitespaces (char *str
)
803 size_t last
= strlen (str
);
811 if (ISSPACE (str
[last
]))
819 /* Find next field separated by SEP and terminate it. Return a
820 pointer to the one after it. */
823 next_field (char *str
, char sep
, char **next
, char *last
)
827 p
= remove_leading_whitespaces (str
);
828 for (str
= p
; *str
!= sep
&& *str
!= '\0'; str
++);
831 remove_trailing_whitespaces (p
);
841 static void set_bitfield (char *, bitfield
*, int, unsigned int, int);
844 set_bitfield_from_cpu_flag_init (char *f
, bitfield
*array
, unsigned int size
,
847 char *str
, *next
, *last
;
850 for (i
= 0; i
< ARRAY_SIZE (cpu_flag_init
); i
++)
851 if (strcmp (cpu_flag_init
[i
].name
, f
) == 0)
853 /* Turn on selective bits. */
854 char *init
= xstrdup (cpu_flag_init
[i
].init
);
855 last
= init
+ strlen (init
);
856 for (next
= init
; next
&& next
< last
; )
858 str
= next_field (next
, '|', &next
, last
);
860 set_bitfield (str
, array
, 1, size
, lineno
);
870 set_bitfield (char *f
, bitfield
*array
, int value
,
871 unsigned int size
, int lineno
)
875 if (strcmp (f
, "CpuFP") == 0)
877 set_bitfield("Cpu387", array
, value
, size
, lineno
);
878 set_bitfield("Cpu287", array
, value
, size
, lineno
);
881 else if (strcmp (f
, "Mmword") == 0)
883 else if (strcmp (f
, "Oword") == 0)
886 for (i
= 0; i
< size
; i
++)
887 if (strcasecmp (array
[i
].name
, f
) == 0)
889 array
[i
].value
= value
;
895 const char *v
= strchr (f
, '=');
902 for (i
= 0; i
< size
; i
++)
903 if (strncasecmp (array
[i
].name
, f
, n
) == 0)
905 value
= strtol (v
+ 1, &end
, 0);
908 array
[i
].value
= value
;
916 /* Handle CPU_XXX_FLAGS. */
917 if (value
== 1 && !set_bitfield_from_cpu_flag_init (f
, array
, size
, lineno
))
921 fail (_("%s: %d: unknown bitfield: %s\n"), filename
, lineno
, f
);
923 fail (_("unknown bitfield: %s\n"), f
);
927 output_cpu_flags (FILE *table
, bitfield
*flags
, unsigned int size
,
928 int macro
, const char *comma
, const char *indent
)
932 memset (&active_cpu_flags
, 0, sizeof(active_cpu_flags
));
934 fprintf (table
, "%s{ { ", indent
);
936 for (i
= 0; i
< size
- 1; i
++)
938 if (((i
+ 1) % 20) != 0)
939 fprintf (table
, "%d, ", flags
[i
].value
);
941 fprintf (table
, "%d,", flags
[i
].value
);
942 if (((i
+ 1) % 20) == 0)
944 /* We need \\ for macro. */
946 fprintf (table
, " \\\n %s", indent
);
948 fprintf (table
, "\n %s", indent
);
951 active_cpu_flags
.array
[i
/ 32] |= 1U << (i
% 32);
954 fprintf (table
, "%d } }%s\n", flags
[i
].value
, comma
);
958 process_i386_cpu_flag (FILE *table
, char *flag
, int macro
,
959 const char *comma
, const char *indent
,
962 char *str
, *next
, *last
;
964 bitfield flags
[ARRAY_SIZE (cpu_flags
)];
966 /* Copy the default cpu flags. */
967 memcpy (flags
, cpu_flags
, sizeof (cpu_flags
));
969 if (strcasecmp (flag
, "unknown") == 0)
971 /* We turn on everything except for cpu64 in case of
972 CPU_UNKNOWN_FLAGS. */
973 for (i
= 0; i
< ARRAY_SIZE (flags
); i
++)
974 if (flags
[i
].position
!= Cpu64
)
977 else if (flag
[0] == '~')
979 last
= flag
+ strlen (flag
);
986 fail (_("%s: %d: missing `)' in bitfield: %s\n"), filename
,
993 /* First we turn on everything except for cpu64. */
994 for (i
= 0; i
< ARRAY_SIZE (flags
); i
++)
995 if (flags
[i
].position
!= Cpu64
)
998 /* Turn off selective bits. */
999 for (; next
&& next
< last
; )
1001 str
= next_field (next
, '|', &next
, last
);
1003 set_bitfield (str
, flags
, 0, ARRAY_SIZE (flags
), lineno
);
1006 else if (strcmp (flag
, "0"))
1008 /* Turn on selective bits. */
1009 last
= flag
+ strlen (flag
);
1010 for (next
= flag
; next
&& next
< last
; )
1012 str
= next_field (next
, '|', &next
, last
);
1014 set_bitfield (str
, flags
, 1, ARRAY_SIZE (flags
), lineno
);
1018 output_cpu_flags (table
, flags
, ARRAY_SIZE (flags
), macro
,
1023 output_opcode_modifier (FILE *table
, bitfield
*modifier
, unsigned int size
)
1027 fprintf (table
, " { ");
1029 for (i
= 0; i
< size
- 1; i
++)
1031 if (((i
+ 1) % 20) != 0)
1032 fprintf (table
, "%d, ", modifier
[i
].value
);
1034 fprintf (table
, "%d,", modifier
[i
].value
);
1035 if (((i
+ 1) % 20) == 0)
1036 fprintf (table
, "\n ");
1039 fprintf (table
, "%d },\n", modifier
[i
].value
);
1043 adjust_broadcast_modifier (char **opnd
)
1045 char *str
, *next
, *last
, *op
;
1046 int bcst_type
= INT_MAX
;
1048 /* Skip the immediate operand. */
1050 if (strcasecmp(op
, "Imm8") == 0)
1054 last
= op
+ strlen (op
);
1055 for (next
= op
; next
&& next
< last
; )
1057 str
= next_field (next
, '|', &next
, last
);
1060 if (strcasecmp(str
, "Byte") == 0)
1062 /* The smalest broadcast type, no need to check
1064 bcst_type
= BYTE_BROADCAST
;
1067 else if (strcasecmp(str
, "Word") == 0)
1069 if (bcst_type
> WORD_BROADCAST
)
1070 bcst_type
= WORD_BROADCAST
;
1072 else if (strcasecmp(str
, "Dword") == 0)
1074 if (bcst_type
> DWORD_BROADCAST
)
1075 bcst_type
= DWORD_BROADCAST
;
1077 else if (strcasecmp(str
, "Qword") == 0)
1079 if (bcst_type
> QWORD_BROADCAST
)
1080 bcst_type
= QWORD_BROADCAST
;
1086 if (bcst_type
== INT_MAX
)
1087 fail (_("unknown broadcast operand: %s\n"), op
);
1093 process_i386_opcode_modifier (FILE *table
, char *mod
, char **opnd
, int lineno
)
1095 char *str
, *next
, *last
;
1096 bitfield modifiers
[ARRAY_SIZE (opcode_modifiers
)];
1098 active_isstring
= 0;
1100 /* Copy the default opcode modifier. */
1101 memcpy (modifiers
, opcode_modifiers
, sizeof (modifiers
));
1103 if (strcmp (mod
, "0"))
1105 unsigned int have_w
= 0, bwlq_suf
= 0xf;
1107 last
= mod
+ strlen (mod
);
1108 for (next
= mod
; next
&& next
< last
; )
1110 str
= next_field (next
, '|', &next
, last
);
1114 if (strcasecmp(str
, "Broadcast") == 0)
1115 val
= adjust_broadcast_modifier (opnd
);
1116 set_bitfield (str
, modifiers
, val
, ARRAY_SIZE (modifiers
),
1118 if (strcasecmp(str
, "IsString") == 0)
1119 active_isstring
= 1;
1121 if (strcasecmp(str
, "W") == 0)
1124 if (strcasecmp(str
, "No_bSuf") == 0)
1126 if (strcasecmp(str
, "No_wSuf") == 0)
1128 if (strcasecmp(str
, "No_lSuf") == 0)
1130 if (strcasecmp(str
, "No_qSuf") == 0)
1135 if (have_w
&& !bwlq_suf
)
1136 fail ("%s: %d: stray W modifier\n", filename
, lineno
);
1137 if (have_w
&& !(bwlq_suf
& 1))
1138 fprintf (stderr
, "%s: %d: W modifier without Byte operand(s)\n",
1140 if (have_w
&& !(bwlq_suf
& ~1))
1142 "%s: %d: W modifier without Word/Dword/Qword operand(s)\n",
1145 output_opcode_modifier (table
, modifiers
, ARRAY_SIZE (modifiers
));
1155 output_operand_type (FILE *table
, enum operand_class
class,
1156 enum operand_instance instance
,
1157 const bitfield
*types
, unsigned int size
,
1158 enum stage stage
, const char *indent
)
1162 fprintf (table
, "{ { %d, %d, ", class, instance
);
1164 for (i
= 0; i
< size
- 1; i
++)
1166 if (((i
+ 3) % 20) != 0)
1167 fprintf (table
, "%d, ", types
[i
].value
);
1169 fprintf (table
, "%d,", types
[i
].value
);
1170 if (((i
+ 3) % 20) == 0)
1172 /* We need \\ for macro. */
1173 if (stage
== stage_macros
)
1174 fprintf (table
, " \\\n%s", indent
);
1176 fprintf (table
, "\n%s", indent
);
1180 fprintf (table
, "%d } }", types
[i
].value
);
1184 process_i386_operand_type (FILE *table
, char *op
, enum stage stage
,
1185 const char *indent
, int lineno
)
1187 char *str
, *next
, *last
;
1188 enum operand_class
class = ClassNone
;
1189 enum operand_instance instance
= InstanceNone
;
1190 bitfield types
[ARRAY_SIZE (operand_types
)];
1192 /* Copy the default operand type. */
1193 memcpy (types
, operand_types
, sizeof (types
));
1195 if (strcmp (op
, "0"))
1199 last
= op
+ strlen (op
);
1200 for (next
= op
; next
&& next
< last
; )
1202 str
= next_field (next
, '|', &next
, last
);
1207 if (!strncmp(str
, "Class=", 6))
1209 for (i
= 0; i
< ARRAY_SIZE(operand_classes
); ++i
)
1210 if (!strcmp(str
+ 6, operand_classes
[i
].name
))
1212 class = operand_classes
[i
].value
;
1218 if (str
&& !strncmp(str
, "Instance=", 9))
1220 for (i
= 0; i
< ARRAY_SIZE(operand_instances
); ++i
)
1221 if (!strcmp(str
+ 9, operand_instances
[i
].name
))
1223 instance
= operand_instances
[i
].value
;
1231 set_bitfield (str
, types
, 1, ARRAY_SIZE (types
), lineno
);
1232 if (strcasecmp(str
, "BaseIndex") == 0)
1237 if (stage
== stage_opcodes
&& baseindex
&& !active_isstring
)
1239 set_bitfield("Disp8", types
, 1, ARRAY_SIZE (types
), lineno
);
1240 if (!active_cpu_flags
.bitfield
.cpu64
1241 && !active_cpu_flags
.bitfield
.cpumpx
)
1242 set_bitfield("Disp16", types
, 1, ARRAY_SIZE (types
), lineno
);
1243 set_bitfield("Disp32", types
, 1, ARRAY_SIZE (types
), lineno
);
1244 if (!active_cpu_flags
.bitfield
.cpuno64
)
1245 set_bitfield("Disp32S", types
, 1, ARRAY_SIZE (types
), lineno
);
1248 output_operand_type (table
, class, instance
, types
, ARRAY_SIZE (types
),
1253 output_i386_opcode (FILE *table
, const char *name
, char *str
,
1254 char *last
, int lineno
)
1257 char *operands
, *base_opcode
, *extension_opcode
, *opcode_length
;
1258 char *cpu_flags
, *opcode_modifier
, *operand_types
[MAX_OPERANDS
];
1260 /* Find number of operands. */
1261 operands
= next_field (str
, ',', &str
, last
);
1263 /* Find base_opcode. */
1264 base_opcode
= next_field (str
, ',', &str
, last
);
1266 /* Find extension_opcode. */
1267 extension_opcode
= next_field (str
, ',', &str
, last
);
1269 /* Find opcode_length. */
1270 opcode_length
= next_field (str
, ',', &str
, last
);
1272 /* Find cpu_flags. */
1273 cpu_flags
= next_field (str
, ',', &str
, last
);
1275 /* Find opcode_modifier. */
1276 opcode_modifier
= next_field (str
, ',', &str
, last
);
1278 /* Remove the first {. */
1279 str
= remove_leading_whitespaces (str
);
1282 str
= remove_leading_whitespaces (str
+ 1);
1286 /* There are at least "X}". */
1290 /* Remove trailing white spaces and }. */
1294 if (ISSPACE (str
[i
]) || str
[i
] == '}')
1303 /* Find operand_types. */
1304 for (i
= 0; i
< ARRAY_SIZE (operand_types
); i
++)
1308 operand_types
[i
] = NULL
;
1312 operand_types
[i
] = next_field (str
, ',', &str
, last
);
1313 if (*operand_types
[i
] == '0')
1316 operand_types
[i
] = NULL
;
1321 fprintf (table
, " { \"%s\", %s, %s, %s, %s,\n",
1322 name
, base_opcode
, extension_opcode
, opcode_length
, operands
);
1324 process_i386_cpu_flag (table
, cpu_flags
, 0, ",", " ", lineno
);
1326 process_i386_opcode_modifier (table
, opcode_modifier
, operand_types
, lineno
);
1328 fprintf (table
, " { ");
1330 for (i
= 0; i
< ARRAY_SIZE (operand_types
); i
++)
1332 if (operand_types
[i
] == NULL
|| *operand_types
[i
] == '0')
1335 process_i386_operand_type (table
, "0", stage_opcodes
, "\t ",
1341 fprintf (table
, ",\n ");
1343 process_i386_operand_type (table
, operand_types
[i
], stage_opcodes
,
1346 fprintf (table
, " } },\n");
1349 struct opcode_hash_entry
1351 struct opcode_hash_entry
*next
;
1357 /* Calculate the hash value of an opcode hash entry P. */
1360 opcode_hash_hash (const void *p
)
1362 struct opcode_hash_entry
*entry
= (struct opcode_hash_entry
*) p
;
1363 return htab_hash_string (entry
->name
);
1366 /* Compare a string Q against an opcode hash entry P. */
1369 opcode_hash_eq (const void *p
, const void *q
)
1371 struct opcode_hash_entry
*entry
= (struct opcode_hash_entry
*) p
;
1372 const char *name
= (const char *) q
;
1373 return strcmp (name
, entry
->name
) == 0;
1377 process_i386_opcodes (FILE *table
)
1382 char *str
, *p
, *last
, *name
;
1383 struct opcode_hash_entry
**hash_slot
, **entry
, *next
;
1384 htab_t opcode_hash_table
;
1385 struct opcode_hash_entry
**opcode_array
;
1386 unsigned int opcode_array_size
= 1024;
1387 int lineno
= 0, marker
= 0;
1389 filename
= "i386-opc.tbl";
1393 opcode_array
= (struct opcode_hash_entry
**)
1394 xmalloc (sizeof (*opcode_array
) * opcode_array_size
);
1396 opcode_hash_table
= htab_create_alloc (16, opcode_hash_hash
,
1397 opcode_hash_eq
, NULL
,
1400 fprintf (table
, "\n/* i386 opcode table. */\n\n");
1401 fprintf (table
, "const insn_template i386_optab[] =\n{\n");
1403 /* Put everything on opcode array. */
1406 if (fgets (buf
, sizeof (buf
), fp
) == NULL
)
1411 p
= remove_leading_whitespaces (buf
);
1413 /* Skip comments. */
1414 str
= strstr (p
, "//");
1418 /* Remove trailing white spaces. */
1419 remove_trailing_whitespaces (p
);
1424 if (!strcmp("### MARKER ###", buf
))
1428 /* Since we ignore all included files (we only care about their
1429 #define-s here), we don't need to monitor filenames. The final
1430 line number directive is going to refer to the main source file
1435 p
= remove_leading_whitespaces (p
+ 1);
1436 if (!strncmp(p
, "line", 4))
1438 ln
= strtoul (p
, &end
, 10);
1439 if (ln
> 1 && ln
< INT_MAX
1440 && *remove_leading_whitespaces (end
) == '"')
1443 /* Ignore comments. */
1453 last
= p
+ strlen (p
);
1456 name
= next_field (p
, ',', &str
, last
);
1458 /* Get the slot in hash table. */
1459 hash_slot
= (struct opcode_hash_entry
**)
1460 htab_find_slot_with_hash (opcode_hash_table
, name
,
1461 htab_hash_string (name
),
1464 if (*hash_slot
== NULL
)
1466 /* It is the new one. Put it on opcode array. */
1467 if (i
>= opcode_array_size
)
1469 /* Grow the opcode array when needed. */
1470 opcode_array_size
+= 1024;
1471 opcode_array
= (struct opcode_hash_entry
**)
1472 xrealloc (opcode_array
,
1473 sizeof (*opcode_array
) * opcode_array_size
);
1476 opcode_array
[i
] = (struct opcode_hash_entry
*)
1477 xmalloc (sizeof (struct opcode_hash_entry
));
1478 opcode_array
[i
]->next
= NULL
;
1479 opcode_array
[i
]->name
= xstrdup (name
);
1480 opcode_array
[i
]->opcode
= xstrdup (str
);
1481 opcode_array
[i
]->lineno
= lineno
;
1482 *hash_slot
= opcode_array
[i
];
1487 /* Append it to the existing one. */
1489 while ((*entry
) != NULL
)
1490 entry
= &(*entry
)->next
;
1491 *entry
= (struct opcode_hash_entry
*)
1492 xmalloc (sizeof (struct opcode_hash_entry
));
1493 (*entry
)->next
= NULL
;
1494 (*entry
)->name
= (*hash_slot
)->name
;
1495 (*entry
)->opcode
= xstrdup (str
);
1496 (*entry
)->lineno
= lineno
;
1500 /* Process opcode array. */
1501 for (j
= 0; j
< i
; j
++)
1503 for (next
= opcode_array
[j
]; next
; next
= next
->next
)
1507 lineno
= next
->lineno
;
1508 last
= str
+ strlen (str
);
1509 output_i386_opcode (table
, name
, str
, last
, lineno
);
1515 fprintf (table
, " { NULL, 0, 0, 0, 0,\n");
1517 process_i386_cpu_flag (table
, "0", 0, ",", " ", -1);
1519 process_i386_opcode_modifier (table
, "0", NULL
, -1);
1521 fprintf (table
, " { ");
1522 process_i386_operand_type (table
, "0", stage_opcodes
, "\t ", -1);
1523 fprintf (table
, " } }\n");
1525 fprintf (table
, "};\n");
1529 process_i386_registers (FILE *table
)
1533 char *str
, *p
, *last
;
1534 char *reg_name
, *reg_type
, *reg_flags
, *reg_num
;
1535 char *dw2_32_num
, *dw2_64_num
;
1538 filename
= "i386-reg.tbl";
1539 fp
= fopen (filename
, "r");
1541 fail (_("can't find i386-reg.tbl for reading, errno = %s\n"),
1544 fprintf (table
, "\n/* i386 register table. */\n\n");
1545 fprintf (table
, "const reg_entry i386_regtab[] =\n{\n");
1549 if (fgets (buf
, sizeof (buf
), fp
) == NULL
)
1554 p
= remove_leading_whitespaces (buf
);
1556 /* Skip comments. */
1557 str
= strstr (p
, "//");
1561 /* Remove trailing white spaces. */
1562 remove_trailing_whitespaces (p
);
1567 fprintf (table
, "%s\n", p
);
1575 last
= p
+ strlen (p
);
1577 /* Find reg_name. */
1578 reg_name
= next_field (p
, ',', &str
, last
);
1580 /* Find reg_type. */
1581 reg_type
= next_field (str
, ',', &str
, last
);
1583 /* Find reg_flags. */
1584 reg_flags
= next_field (str
, ',', &str
, last
);
1587 reg_num
= next_field (str
, ',', &str
, last
);
1589 fprintf (table
, " { \"%s\",\n ", reg_name
);
1591 process_i386_operand_type (table
, reg_type
, stage_registers
, "\t",
1594 /* Find 32-bit Dwarf2 register number. */
1595 dw2_32_num
= next_field (str
, ',', &str
, last
);
1597 /* Find 64-bit Dwarf2 register number. */
1598 dw2_64_num
= next_field (str
, ',', &str
, last
);
1600 fprintf (table
, ",\n %s, %s, { %s, %s } },\n",
1601 reg_flags
, reg_num
, dw2_32_num
, dw2_64_num
);
1606 fprintf (table
, "};\n");
1608 fprintf (table
, "\nconst unsigned int i386_regtab_size = ARRAY_SIZE (i386_regtab);\n");
1612 process_i386_initializers (void)
1615 FILE *fp
= fopen ("i386-init.h", "w");
1619 fail (_("can't create i386-init.h, errno = %s\n"),
1622 process_copyright (fp
);
1624 for (i
= 0; i
< ARRAY_SIZE (cpu_flag_init
); i
++)
1626 fprintf (fp
, "\n#define %s \\\n", cpu_flag_init
[i
].name
);
1627 init
= xstrdup (cpu_flag_init
[i
].init
);
1628 process_i386_cpu_flag (fp
, init
, 1, "", " ", -1);
1632 for (i
= 0; i
< ARRAY_SIZE (operand_type_init
); i
++)
1634 fprintf (fp
, "\n\n#define %s \\\n ", operand_type_init
[i
].name
);
1635 init
= xstrdup (operand_type_init
[i
].init
);
1636 process_i386_operand_type (fp
, init
, stage_macros
, " ", -1);
1644 /* Program options. */
1645 #define OPTION_SRCDIR 200
1647 struct option long_options
[] =
1649 {"srcdir", required_argument
, NULL
, OPTION_SRCDIR
},
1650 {"debug", no_argument
, NULL
, 'd'},
1651 {"version", no_argument
, NULL
, 'V'},
1652 {"help", no_argument
, NULL
, 'h'},
1653 {0, no_argument
, NULL
, 0}
1657 print_version (void)
1659 printf ("%s: version 1.0\n", program_name
);
1664 usage (FILE * stream
, int status
)
1666 fprintf (stream
, "Usage: %s [-V | --version] [-d | --debug] [--srcdir=dirname] [--help]\n",
1672 main (int argc
, char **argv
)
1674 extern int chdir (char *);
1675 char *srcdir
= NULL
;
1677 unsigned int i
, cpumax
;
1680 program_name
= *argv
;
1681 xmalloc_set_program_name (program_name
);
1683 while ((c
= getopt_long (argc
, argv
, "vVdh", long_options
, 0)) != EOF
)
1708 if (chdir (srcdir
) != 0)
1709 fail (_("unable to change directory to \"%s\", errno = %s\n"),
1710 srcdir
, xstrerror (errno
));
1712 /* cpu_flags isn't sorted by position. */
1714 for (i
= 0; i
< ARRAY_SIZE (cpu_flags
); i
++)
1715 if (cpu_flags
[i
].position
> cpumax
)
1716 cpumax
= cpu_flags
[i
].position
;
1718 /* Check the unused bitfield in i386_cpu_flags. */
1720 static_assert (ARRAY_SIZE (cpu_flags
) == CpuMax
+ 2);
1722 if ((cpumax
- 1) != CpuMax
)
1723 fail (_("CpuMax != %d!\n"), cpumax
);
1725 static_assert (ARRAY_SIZE (cpu_flags
) == CpuMax
+ 1);
1727 if (cpumax
!= CpuMax
)
1728 fail (_("CpuMax != %d!\n"), cpumax
);
1730 c
= CpuNumOfBits
- CpuMax
- 1;
1732 fail (_("%d unused bits in i386_cpu_flags.\n"), c
);
1735 static_assert (ARRAY_SIZE (opcode_modifiers
) == Opcode_Modifier_Num
);
1737 /* Check the unused bitfield in i386_operand_type. */
1739 static_assert (ARRAY_SIZE (operand_types
) + CLASS_WIDTH
+ INSTANCE_WIDTH
1742 static_assert (ARRAY_SIZE (operand_types
) + CLASS_WIDTH
+ INSTANCE_WIDTH
1745 c
= OTNumOfBits
- OTNum
;
1747 fail (_("%d unused bits in i386_operand_type.\n"), c
);
1750 qsort (cpu_flags
, ARRAY_SIZE (cpu_flags
), sizeof (cpu_flags
[0]),
1753 qsort (opcode_modifiers
, ARRAY_SIZE (opcode_modifiers
),
1754 sizeof (opcode_modifiers
[0]), compare
);
1756 qsort (operand_types
, ARRAY_SIZE (operand_types
),
1757 sizeof (operand_types
[0]), compare
);
1759 table
= fopen ("i386-tbl.h", "w");
1761 fail (_("can't create i386-tbl.h, errno = %s\n"),
1764 process_copyright (table
);
1766 process_i386_opcodes (table
);
1767 process_i386_registers (table
);
1768 process_i386_initializers ();