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|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
),
621 BITFIELD (CheckRegSize
),
622 BITFIELD (IgnoreSize
),
623 BITFIELD (DefaultSize
),
634 BITFIELD (BNDPrefixOk
),
635 BITFIELD (NoTrackPrefixOk
),
636 BITFIELD (IsLockable
),
637 BITFIELD (RegKludge
),
638 BITFIELD (Implicit1stXmm0
),
639 BITFIELD (RepPrefixOk
),
640 BITFIELD (HLEPrefixOk
),
643 BITFIELD (AddrPrefixOpReg
),
652 BITFIELD (VexOpcode
),
653 BITFIELD (VexSources
),
659 BITFIELD (Broadcast
),
660 BITFIELD (StaticRounding
),
662 BITFIELD (Disp8MemShift
),
663 BITFIELD (NoDefMask
),
664 BITFIELD (ImplicitQuadGroup
),
666 BITFIELD (ATTMnemonic
),
667 BITFIELD (ATTSyntax
),
668 BITFIELD (IntelSyntax
),
673 #define CLASS(n) #n, n
675 static const struct {
677 enum operand_class value
;
678 } operand_classes
[] = {
692 #define INSTANCE(n) #n, n
694 static const struct {
696 enum operand_instance value
;
697 } operand_instances
[] = {
706 static bitfield operand_types
[] =
715 BITFIELD (BaseIndex
),
730 BITFIELD (Unspecified
),
736 static const char *filename
;
737 static i386_cpu_flags active_cpu_flags
;
738 static int active_isstring
;
741 compare (const void *x
, const void *y
)
743 const bitfield
*xp
= (const bitfield
*) x
;
744 const bitfield
*yp
= (const bitfield
*) y
;
745 return xp
->position
- yp
->position
;
749 fail (const char *message
, ...)
753 va_start (args
, message
);
754 fprintf (stderr
, _("%s: error: "), program_name
);
755 vfprintf (stderr
, message
, args
);
761 process_copyright (FILE *fp
)
763 fprintf (fp
, "/* This file is automatically generated by i386-gen. Do not edit! */\n\
764 /* Copyright (C) 2007-2020 Free Software Foundation, Inc.\n\
766 This file is part of the GNU opcodes library.\n\
768 This library is free software; you can redistribute it and/or modify\n\
769 it under the terms of the GNU General Public License as published by\n\
770 the Free Software Foundation; either version 3, or (at your option)\n\
771 any later version.\n\
773 It is distributed in the hope that it will be useful, but WITHOUT\n\
774 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n\
775 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public\n\
776 License for more details.\n\
778 You should have received a copy of the GNU General Public License\n\
779 along with this program; if not, write to the Free Software\n\
780 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,\n\
781 MA 02110-1301, USA. */\n");
784 /* Remove leading white spaces. */
787 remove_leading_whitespaces (char *str
)
789 while (ISSPACE (*str
))
794 /* Remove trailing white spaces. */
797 remove_trailing_whitespaces (char *str
)
799 size_t last
= strlen (str
);
807 if (ISSPACE (str
[last
]))
815 /* Find next field separated by SEP and terminate it. Return a
816 pointer to the one after it. */
819 next_field (char *str
, char sep
, char **next
, char *last
)
823 p
= remove_leading_whitespaces (str
);
824 for (str
= p
; *str
!= sep
&& *str
!= '\0'; str
++);
827 remove_trailing_whitespaces (p
);
837 static void set_bitfield (char *, bitfield
*, int, unsigned int, int);
840 set_bitfield_from_cpu_flag_init (char *f
, bitfield
*array
, unsigned int size
,
843 char *str
, *next
, *last
;
846 for (i
= 0; i
< ARRAY_SIZE (cpu_flag_init
); i
++)
847 if (strcmp (cpu_flag_init
[i
].name
, f
) == 0)
849 /* Turn on selective bits. */
850 char *init
= xstrdup (cpu_flag_init
[i
].init
);
851 last
= init
+ strlen (init
);
852 for (next
= init
; next
&& next
< last
; )
854 str
= next_field (next
, '|', &next
, last
);
856 set_bitfield (str
, array
, 1, size
, lineno
);
866 set_bitfield (char *f
, bitfield
*array
, int value
,
867 unsigned int size
, int lineno
)
871 if (strcmp (f
, "CpuFP") == 0)
873 set_bitfield("Cpu387", array
, value
, size
, lineno
);
874 set_bitfield("Cpu287", array
, value
, size
, lineno
);
877 else if (strcmp (f
, "Mmword") == 0)
879 else if (strcmp (f
, "Oword") == 0)
882 for (i
= 0; i
< size
; i
++)
883 if (strcasecmp (array
[i
].name
, f
) == 0)
885 array
[i
].value
= value
;
891 const char *v
= strchr (f
, '=');
898 for (i
= 0; i
< size
; i
++)
899 if (strncasecmp (array
[i
].name
, f
, n
) == 0)
901 value
= strtol (v
+ 1, &end
, 0);
904 array
[i
].value
= value
;
912 /* Handle CPU_XXX_FLAGS. */
913 if (value
== 1 && !set_bitfield_from_cpu_flag_init (f
, array
, size
, lineno
))
917 fail (_("%s: %d: unknown bitfield: %s\n"), filename
, lineno
, f
);
919 fail (_("unknown bitfield: %s\n"), f
);
923 output_cpu_flags (FILE *table
, bitfield
*flags
, unsigned int size
,
924 int macro
, const char *comma
, const char *indent
)
928 memset (&active_cpu_flags
, 0, sizeof(active_cpu_flags
));
930 fprintf (table
, "%s{ { ", indent
);
932 for (i
= 0; i
< size
- 1; i
++)
934 if (((i
+ 1) % 20) != 0)
935 fprintf (table
, "%d, ", flags
[i
].value
);
937 fprintf (table
, "%d,", flags
[i
].value
);
938 if (((i
+ 1) % 20) == 0)
940 /* We need \\ for macro. */
942 fprintf (table
, " \\\n %s", indent
);
944 fprintf (table
, "\n %s", indent
);
947 active_cpu_flags
.array
[i
/ 32] |= 1U << (i
% 32);
950 fprintf (table
, "%d } }%s\n", flags
[i
].value
, comma
);
954 process_i386_cpu_flag (FILE *table
, char *flag
, int macro
,
955 const char *comma
, const char *indent
,
958 char *str
, *next
, *last
;
960 bitfield flags
[ARRAY_SIZE (cpu_flags
)];
962 /* Copy the default cpu flags. */
963 memcpy (flags
, cpu_flags
, sizeof (cpu_flags
));
965 if (strcasecmp (flag
, "unknown") == 0)
967 /* We turn on everything except for cpu64 in case of
968 CPU_UNKNOWN_FLAGS. */
969 for (i
= 0; i
< ARRAY_SIZE (flags
); i
++)
970 if (flags
[i
].position
!= Cpu64
)
973 else if (flag
[0] == '~')
975 last
= flag
+ strlen (flag
);
982 fail (_("%s: %d: missing `)' in bitfield: %s\n"), filename
,
989 /* First we turn on everything except for cpu64. */
990 for (i
= 0; i
< ARRAY_SIZE (flags
); i
++)
991 if (flags
[i
].position
!= Cpu64
)
994 /* Turn off selective bits. */
995 for (; next
&& next
< last
; )
997 str
= next_field (next
, '|', &next
, last
);
999 set_bitfield (str
, flags
, 0, ARRAY_SIZE (flags
), lineno
);
1002 else if (strcmp (flag
, "0"))
1004 /* Turn on selective bits. */
1005 last
= flag
+ strlen (flag
);
1006 for (next
= flag
; next
&& next
< last
; )
1008 str
= next_field (next
, '|', &next
, last
);
1010 set_bitfield (str
, flags
, 1, ARRAY_SIZE (flags
), lineno
);
1014 output_cpu_flags (table
, flags
, ARRAY_SIZE (flags
), macro
,
1019 output_opcode_modifier (FILE *table
, bitfield
*modifier
, unsigned int size
)
1023 fprintf (table
, " { ");
1025 for (i
= 0; i
< size
- 1; i
++)
1027 if (((i
+ 1) % 20) != 0)
1028 fprintf (table
, "%d, ", modifier
[i
].value
);
1030 fprintf (table
, "%d,", modifier
[i
].value
);
1031 if (((i
+ 1) % 20) == 0)
1032 fprintf (table
, "\n ");
1035 fprintf (table
, "%d },\n", modifier
[i
].value
);
1039 adjust_broadcast_modifier (char **opnd
)
1041 char *str
, *next
, *last
, *op
;
1042 int bcst_type
= INT_MAX
;
1044 /* Skip the immediate operand. */
1046 if (strcasecmp(op
, "Imm8") == 0)
1050 last
= op
+ strlen (op
);
1051 for (next
= op
; next
&& next
< last
; )
1053 str
= next_field (next
, '|', &next
, last
);
1056 if (strcasecmp(str
, "Byte") == 0)
1058 /* The smalest broadcast type, no need to check
1060 bcst_type
= BYTE_BROADCAST
;
1063 else if (strcasecmp(str
, "Word") == 0)
1065 if (bcst_type
> WORD_BROADCAST
)
1066 bcst_type
= WORD_BROADCAST
;
1068 else if (strcasecmp(str
, "Dword") == 0)
1070 if (bcst_type
> DWORD_BROADCAST
)
1071 bcst_type
= DWORD_BROADCAST
;
1073 else if (strcasecmp(str
, "Qword") == 0)
1075 if (bcst_type
> QWORD_BROADCAST
)
1076 bcst_type
= QWORD_BROADCAST
;
1082 if (bcst_type
== INT_MAX
)
1083 fail (_("unknown broadcast operand: %s\n"), op
);
1089 process_i386_opcode_modifier (FILE *table
, char *mod
, char **opnd
, int lineno
)
1091 char *str
, *next
, *last
;
1092 bitfield modifiers
[ARRAY_SIZE (opcode_modifiers
)];
1094 active_isstring
= 0;
1096 /* Copy the default opcode modifier. */
1097 memcpy (modifiers
, opcode_modifiers
, sizeof (modifiers
));
1099 if (strcmp (mod
, "0"))
1101 unsigned int have_w
= 0, bwlq_suf
= 0xf;
1103 last
= mod
+ strlen (mod
);
1104 for (next
= mod
; next
&& next
< last
; )
1106 str
= next_field (next
, '|', &next
, last
);
1110 if (strcasecmp(str
, "Broadcast") == 0)
1111 val
= adjust_broadcast_modifier (opnd
);
1112 set_bitfield (str
, modifiers
, val
, ARRAY_SIZE (modifiers
),
1114 if (strcasecmp(str
, "IsString") == 0)
1115 active_isstring
= 1;
1117 if (strcasecmp(str
, "W") == 0)
1120 if (strcasecmp(str
, "No_bSuf") == 0)
1122 if (strcasecmp(str
, "No_wSuf") == 0)
1124 if (strcasecmp(str
, "No_lSuf") == 0)
1126 if (strcasecmp(str
, "No_qSuf") == 0)
1131 if (have_w
&& !bwlq_suf
)
1132 fail ("%s: %d: stray W modifier\n", filename
, lineno
);
1133 if (have_w
&& !(bwlq_suf
& 1))
1134 fprintf (stderr
, "%s: %d: W modifier without Byte operand(s)\n",
1136 if (have_w
&& !(bwlq_suf
& ~1))
1138 "%s: %d: W modifier without Word/Dword/Qword operand(s)\n",
1141 output_opcode_modifier (table
, modifiers
, ARRAY_SIZE (modifiers
));
1151 output_operand_type (FILE *table
, enum operand_class
class,
1152 enum operand_instance instance
,
1153 const bitfield
*types
, unsigned int size
,
1154 enum stage stage
, const char *indent
)
1158 fprintf (table
, "{ { %d, %d, ", class, instance
);
1160 for (i
= 0; i
< size
- 1; i
++)
1162 if (((i
+ 3) % 20) != 0)
1163 fprintf (table
, "%d, ", types
[i
].value
);
1165 fprintf (table
, "%d,", types
[i
].value
);
1166 if (((i
+ 3) % 20) == 0)
1168 /* We need \\ for macro. */
1169 if (stage
== stage_macros
)
1170 fprintf (table
, " \\\n%s", indent
);
1172 fprintf (table
, "\n%s", indent
);
1176 fprintf (table
, "%d } }", types
[i
].value
);
1180 process_i386_operand_type (FILE *table
, char *op
, enum stage stage
,
1181 const char *indent
, int lineno
)
1183 char *str
, *next
, *last
;
1184 enum operand_class
class = ClassNone
;
1185 enum operand_instance instance
= InstanceNone
;
1186 bitfield types
[ARRAY_SIZE (operand_types
)];
1188 /* Copy the default operand type. */
1189 memcpy (types
, operand_types
, sizeof (types
));
1191 if (strcmp (op
, "0"))
1195 last
= op
+ strlen (op
);
1196 for (next
= op
; next
&& next
< last
; )
1198 str
= next_field (next
, '|', &next
, last
);
1203 if (!strncmp(str
, "Class=", 6))
1205 for (i
= 0; i
< ARRAY_SIZE(operand_classes
); ++i
)
1206 if (!strcmp(str
+ 6, operand_classes
[i
].name
))
1208 class = operand_classes
[i
].value
;
1214 if (str
&& !strncmp(str
, "Instance=", 9))
1216 for (i
= 0; i
< ARRAY_SIZE(operand_instances
); ++i
)
1217 if (!strcmp(str
+ 9, operand_instances
[i
].name
))
1219 instance
= operand_instances
[i
].value
;
1227 set_bitfield (str
, types
, 1, ARRAY_SIZE (types
), lineno
);
1228 if (strcasecmp(str
, "BaseIndex") == 0)
1233 if (stage
== stage_opcodes
&& baseindex
&& !active_isstring
)
1235 set_bitfield("Disp8", types
, 1, ARRAY_SIZE (types
), lineno
);
1236 if (!active_cpu_flags
.bitfield
.cpu64
1237 && !active_cpu_flags
.bitfield
.cpumpx
)
1238 set_bitfield("Disp16", types
, 1, ARRAY_SIZE (types
), lineno
);
1239 if (!active_cpu_flags
.bitfield
.cpu64
)
1240 set_bitfield("Disp32", types
, 1, ARRAY_SIZE (types
), lineno
);
1241 if (!active_cpu_flags
.bitfield
.cpuno64
)
1242 set_bitfield("Disp32S", types
, 1, ARRAY_SIZE (types
), lineno
);
1245 output_operand_type (table
, class, instance
, types
, ARRAY_SIZE (types
),
1250 output_i386_opcode (FILE *table
, const char *name
, char *str
,
1251 char *last
, int lineno
)
1254 char *operands
, *base_opcode
, *extension_opcode
, *opcode_length
;
1255 char *cpu_flags
, *opcode_modifier
, *operand_types
[MAX_OPERANDS
];
1257 /* Find number of operands. */
1258 operands
= next_field (str
, ',', &str
, last
);
1260 /* Find base_opcode. */
1261 base_opcode
= next_field (str
, ',', &str
, last
);
1263 /* Find extension_opcode. */
1264 extension_opcode
= next_field (str
, ',', &str
, last
);
1266 /* Find opcode_length. */
1267 opcode_length
= next_field (str
, ',', &str
, last
);
1269 /* Find cpu_flags. */
1270 cpu_flags
= next_field (str
, ',', &str
, last
);
1272 /* Find opcode_modifier. */
1273 opcode_modifier
= next_field (str
, ',', &str
, last
);
1275 /* Remove the first {. */
1276 str
= remove_leading_whitespaces (str
);
1279 str
= remove_leading_whitespaces (str
+ 1);
1283 /* There are at least "X}". */
1287 /* Remove trailing white spaces and }. */
1291 if (ISSPACE (str
[i
]) || str
[i
] == '}')
1300 /* Find operand_types. */
1301 for (i
= 0; i
< ARRAY_SIZE (operand_types
); i
++)
1305 operand_types
[i
] = NULL
;
1309 operand_types
[i
] = next_field (str
, ',', &str
, last
);
1310 if (*operand_types
[i
] == '0')
1313 operand_types
[i
] = NULL
;
1318 fprintf (table
, " { \"%s\", %s, %s, %s, %s,\n",
1319 name
, base_opcode
, extension_opcode
, opcode_length
, operands
);
1321 process_i386_cpu_flag (table
, cpu_flags
, 0, ",", " ", lineno
);
1323 process_i386_opcode_modifier (table
, opcode_modifier
, operand_types
, lineno
);
1325 fprintf (table
, " { ");
1327 for (i
= 0; i
< ARRAY_SIZE (operand_types
); i
++)
1329 if (operand_types
[i
] == NULL
|| *operand_types
[i
] == '0')
1332 process_i386_operand_type (table
, "0", stage_opcodes
, "\t ",
1338 fprintf (table
, ",\n ");
1340 process_i386_operand_type (table
, operand_types
[i
], stage_opcodes
,
1343 fprintf (table
, " } },\n");
1346 struct opcode_hash_entry
1348 struct opcode_hash_entry
*next
;
1354 /* Calculate the hash value of an opcode hash entry P. */
1357 opcode_hash_hash (const void *p
)
1359 struct opcode_hash_entry
*entry
= (struct opcode_hash_entry
*) p
;
1360 return htab_hash_string (entry
->name
);
1363 /* Compare a string Q against an opcode hash entry P. */
1366 opcode_hash_eq (const void *p
, const void *q
)
1368 struct opcode_hash_entry
*entry
= (struct opcode_hash_entry
*) p
;
1369 const char *name
= (const char *) q
;
1370 return strcmp (name
, entry
->name
) == 0;
1374 process_i386_opcodes (FILE *table
)
1379 char *str
, *p
, *last
, *name
;
1380 struct opcode_hash_entry
**hash_slot
, **entry
, *next
;
1381 htab_t opcode_hash_table
;
1382 struct opcode_hash_entry
**opcode_array
;
1383 unsigned int opcode_array_size
= 1024;
1384 int lineno
= 0, marker
= 0;
1386 filename
= "i386-opc.tbl";
1390 opcode_array
= (struct opcode_hash_entry
**)
1391 xmalloc (sizeof (*opcode_array
) * opcode_array_size
);
1393 opcode_hash_table
= htab_create_alloc (16, opcode_hash_hash
,
1394 opcode_hash_eq
, NULL
,
1397 fprintf (table
, "\n/* i386 opcode table. */\n\n");
1398 fprintf (table
, "const insn_template i386_optab[] =\n{\n");
1400 /* Put everything on opcode array. */
1403 if (fgets (buf
, sizeof (buf
), fp
) == NULL
)
1408 p
= remove_leading_whitespaces (buf
);
1410 /* Skip comments. */
1411 str
= strstr (p
, "//");
1415 /* Remove trailing white spaces. */
1416 remove_trailing_whitespaces (p
);
1421 if (!strcmp("### MARKER ###", buf
))
1425 /* Since we ignore all included files (we only care about their
1426 #define-s here), we don't need to monitor filenames. The final
1427 line number directive is going to refer to the main source file
1432 p
= remove_leading_whitespaces (p
+ 1);
1433 if (!strncmp(p
, "line", 4))
1435 ln
= strtoul (p
, &end
, 10);
1436 if (ln
> 1 && ln
< INT_MAX
1437 && *remove_leading_whitespaces (end
) == '"')
1440 /* Ignore comments. */
1450 last
= p
+ strlen (p
);
1453 name
= next_field (p
, ',', &str
, last
);
1455 /* Get the slot in hash table. */
1456 hash_slot
= (struct opcode_hash_entry
**)
1457 htab_find_slot_with_hash (opcode_hash_table
, name
,
1458 htab_hash_string (name
),
1461 if (*hash_slot
== NULL
)
1463 /* It is the new one. Put it on opcode array. */
1464 if (i
>= opcode_array_size
)
1466 /* Grow the opcode array when needed. */
1467 opcode_array_size
+= 1024;
1468 opcode_array
= (struct opcode_hash_entry
**)
1469 xrealloc (opcode_array
,
1470 sizeof (*opcode_array
) * opcode_array_size
);
1473 opcode_array
[i
] = (struct opcode_hash_entry
*)
1474 xmalloc (sizeof (struct opcode_hash_entry
));
1475 opcode_array
[i
]->next
= NULL
;
1476 opcode_array
[i
]->name
= xstrdup (name
);
1477 opcode_array
[i
]->opcode
= xstrdup (str
);
1478 opcode_array
[i
]->lineno
= lineno
;
1479 *hash_slot
= opcode_array
[i
];
1484 /* Append it to the existing one. */
1486 while ((*entry
) != NULL
)
1487 entry
= &(*entry
)->next
;
1488 *entry
= (struct opcode_hash_entry
*)
1489 xmalloc (sizeof (struct opcode_hash_entry
));
1490 (*entry
)->next
= NULL
;
1491 (*entry
)->name
= (*hash_slot
)->name
;
1492 (*entry
)->opcode
= xstrdup (str
);
1493 (*entry
)->lineno
= lineno
;
1497 /* Process opcode array. */
1498 for (j
= 0; j
< i
; j
++)
1500 for (next
= opcode_array
[j
]; next
; next
= next
->next
)
1504 lineno
= next
->lineno
;
1505 last
= str
+ strlen (str
);
1506 output_i386_opcode (table
, name
, str
, last
, lineno
);
1512 fprintf (table
, " { NULL, 0, 0, 0, 0,\n");
1514 process_i386_cpu_flag (table
, "0", 0, ",", " ", -1);
1516 process_i386_opcode_modifier (table
, "0", NULL
, -1);
1518 fprintf (table
, " { ");
1519 process_i386_operand_type (table
, "0", stage_opcodes
, "\t ", -1);
1520 fprintf (table
, " } }\n");
1522 fprintf (table
, "};\n");
1526 process_i386_registers (FILE *table
)
1530 char *str
, *p
, *last
;
1531 char *reg_name
, *reg_type
, *reg_flags
, *reg_num
;
1532 char *dw2_32_num
, *dw2_64_num
;
1535 filename
= "i386-reg.tbl";
1536 fp
= fopen (filename
, "r");
1538 fail (_("can't find i386-reg.tbl for reading, errno = %s\n"),
1541 fprintf (table
, "\n/* i386 register table. */\n\n");
1542 fprintf (table
, "const reg_entry i386_regtab[] =\n{\n");
1546 if (fgets (buf
, sizeof (buf
), fp
) == NULL
)
1551 p
= remove_leading_whitespaces (buf
);
1553 /* Skip comments. */
1554 str
= strstr (p
, "//");
1558 /* Remove trailing white spaces. */
1559 remove_trailing_whitespaces (p
);
1564 fprintf (table
, "%s\n", p
);
1572 last
= p
+ strlen (p
);
1574 /* Find reg_name. */
1575 reg_name
= next_field (p
, ',', &str
, last
);
1577 /* Find reg_type. */
1578 reg_type
= next_field (str
, ',', &str
, last
);
1580 /* Find reg_flags. */
1581 reg_flags
= next_field (str
, ',', &str
, last
);
1584 reg_num
= next_field (str
, ',', &str
, last
);
1586 fprintf (table
, " { \"%s\",\n ", reg_name
);
1588 process_i386_operand_type (table
, reg_type
, stage_registers
, "\t",
1591 /* Find 32-bit Dwarf2 register number. */
1592 dw2_32_num
= next_field (str
, ',', &str
, last
);
1594 /* Find 64-bit Dwarf2 register number. */
1595 dw2_64_num
= next_field (str
, ',', &str
, last
);
1597 fprintf (table
, ",\n %s, %s, { %s, %s } },\n",
1598 reg_flags
, reg_num
, dw2_32_num
, dw2_64_num
);
1603 fprintf (table
, "};\n");
1605 fprintf (table
, "\nconst unsigned int i386_regtab_size = ARRAY_SIZE (i386_regtab);\n");
1609 process_i386_initializers (void)
1612 FILE *fp
= fopen ("i386-init.h", "w");
1616 fail (_("can't create i386-init.h, errno = %s\n"),
1619 process_copyright (fp
);
1621 for (i
= 0; i
< ARRAY_SIZE (cpu_flag_init
); i
++)
1623 fprintf (fp
, "\n#define %s \\\n", cpu_flag_init
[i
].name
);
1624 init
= xstrdup (cpu_flag_init
[i
].init
);
1625 process_i386_cpu_flag (fp
, init
, 1, "", " ", -1);
1629 for (i
= 0; i
< ARRAY_SIZE (operand_type_init
); i
++)
1631 fprintf (fp
, "\n\n#define %s \\\n ", operand_type_init
[i
].name
);
1632 init
= xstrdup (operand_type_init
[i
].init
);
1633 process_i386_operand_type (fp
, init
, stage_macros
, " ", -1);
1641 /* Program options. */
1642 #define OPTION_SRCDIR 200
1644 struct option long_options
[] =
1646 {"srcdir", required_argument
, NULL
, OPTION_SRCDIR
},
1647 {"debug", no_argument
, NULL
, 'd'},
1648 {"version", no_argument
, NULL
, 'V'},
1649 {"help", no_argument
, NULL
, 'h'},
1650 {0, no_argument
, NULL
, 0}
1654 print_version (void)
1656 printf ("%s: version 1.0\n", program_name
);
1661 usage (FILE * stream
, int status
)
1663 fprintf (stream
, "Usage: %s [-V | --version] [-d | --debug] [--srcdir=dirname] [--help]\n",
1669 main (int argc
, char **argv
)
1671 extern int chdir (char *);
1672 char *srcdir
= NULL
;
1674 unsigned int i
, cpumax
;
1677 program_name
= *argv
;
1678 xmalloc_set_program_name (program_name
);
1680 while ((c
= getopt_long (argc
, argv
, "vVdh", long_options
, 0)) != EOF
)
1705 if (chdir (srcdir
) != 0)
1706 fail (_("unable to change directory to \"%s\", errno = %s\n"),
1707 srcdir
, xstrerror (errno
));
1709 /* cpu_flags isn't sorted by position. */
1711 for (i
= 0; i
< ARRAY_SIZE (cpu_flags
); i
++)
1712 if (cpu_flags
[i
].position
> cpumax
)
1713 cpumax
= cpu_flags
[i
].position
;
1715 /* Check the unused bitfield in i386_cpu_flags. */
1717 static_assert (ARRAY_SIZE (cpu_flags
) == CpuMax
+ 2);
1719 if ((cpumax
- 1) != CpuMax
)
1720 fail (_("CpuMax != %d!\n"), cpumax
);
1722 static_assert (ARRAY_SIZE (cpu_flags
) == CpuMax
+ 1);
1724 if (cpumax
!= CpuMax
)
1725 fail (_("CpuMax != %d!\n"), cpumax
);
1727 c
= CpuNumOfBits
- CpuMax
- 1;
1729 fail (_("%d unused bits in i386_cpu_flags.\n"), c
);
1732 static_assert (ARRAY_SIZE (opcode_modifiers
) == Opcode_Modifier_Num
);
1734 /* Check the unused bitfield in i386_operand_type. */
1736 static_assert (ARRAY_SIZE (operand_types
) + CLASS_WIDTH
+ INSTANCE_WIDTH
1739 static_assert (ARRAY_SIZE (operand_types
) + CLASS_WIDTH
+ INSTANCE_WIDTH
1742 c
= OTNumOfBits
- OTNum
;
1744 fail (_("%d unused bits in i386_operand_type.\n"), c
);
1747 qsort (cpu_flags
, ARRAY_SIZE (cpu_flags
), sizeof (cpu_flags
[0]),
1750 qsort (opcode_modifiers
, ARRAY_SIZE (opcode_modifiers
),
1751 sizeof (opcode_modifiers
[0]), compare
);
1753 qsort (operand_types
, ARRAY_SIZE (operand_types
),
1754 sizeof (operand_types
[0]), compare
);
1756 table
= fopen ("i386-tbl.h", "w");
1758 fail (_("can't create i386-tbl.h, errno = %s\n"),
1761 process_copyright (table
);
1763 process_i386_opcodes (table
);
1764 process_i386_registers (table
);
1765 process_i386_initializers ();