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_ACC8",
455 "Instance=Accum|Byte" },
456 { "OPERAND_TYPE_ACC16",
457 "Instance=Accum|Word" },
458 { "OPERAND_TYPE_ACC32",
459 "Instance=Accum|Dword" },
460 { "OPERAND_TYPE_ACC64",
461 "Instance=Accum|Qword" },
462 { "OPERAND_TYPE_DISP16_32",
464 { "OPERAND_TYPE_ANYDISP",
465 "Disp8|Disp16|Disp32|Disp32S|Disp64" },
466 { "OPERAND_TYPE_IMM16_32",
468 { "OPERAND_TYPE_IMM16_32S",
470 { "OPERAND_TYPE_IMM16_32_32S",
471 "Imm16|Imm32|Imm32S" },
472 { "OPERAND_TYPE_IMM32_64",
474 { "OPERAND_TYPE_IMM32_32S_DISP32",
475 "Imm32|Imm32S|Disp32" },
476 { "OPERAND_TYPE_IMM64_DISP64",
478 { "OPERAND_TYPE_IMM32_32S_64_DISP32",
479 "Imm32|Imm32S|Imm64|Disp32" },
480 { "OPERAND_TYPE_IMM32_32S_64_DISP32_64",
481 "Imm32|Imm32S|Imm64|Disp32|Disp64" },
482 { "OPERAND_TYPE_ANYIMM",
483 "Imm1|Imm8|Imm8S|Imm16|Imm32|Imm32S|Imm64" },
486 typedef struct bitfield
493 #define BITFIELD(n) { n, 0, #n }
495 static bitfield cpu_flags
[] =
505 BITFIELD (CpuClflush
),
507 BITFIELD (CpuSYSCALL
),
512 BITFIELD (CpuFISTTP
),
518 BITFIELD (CpuSSE4_1
),
519 BITFIELD (CpuSSE4_2
),
522 BITFIELD (CpuAVX512F
),
523 BITFIELD (CpuAVX512CD
),
524 BITFIELD (CpuAVX512ER
),
525 BITFIELD (CpuAVX512PF
),
526 BITFIELD (CpuAVX512VL
),
527 BITFIELD (CpuAVX512DQ
),
528 BITFIELD (CpuAVX512BW
),
534 BITFIELD (Cpu3dnowA
),
535 BITFIELD (CpuPadLock
),
541 BITFIELD (CpuXsaveopt
),
543 BITFIELD (CpuPCLMUL
),
554 BITFIELD (CpuRdtscp
),
555 BITFIELD (CpuFSGSBase
),
562 BITFIELD (CpuINVPCID
),
563 BITFIELD (CpuVMFUNC
),
564 BITFIELD (CpuRDSEED
),
566 BITFIELD (CpuPRFCHW
),
569 BITFIELD (CpuClflushOpt
),
570 BITFIELD (CpuXSAVES
),
571 BITFIELD (CpuXSAVEC
),
572 BITFIELD (CpuPREFETCHWT1
),
578 BITFIELD (CpuAVX512IFMA
),
579 BITFIELD (CpuAVX512VBMI
),
580 BITFIELD (CpuAVX512_4FMAPS
),
581 BITFIELD (CpuAVX512_4VNNIW
),
582 BITFIELD (CpuAVX512_VPOPCNTDQ
),
583 BITFIELD (CpuAVX512_VBMI2
),
584 BITFIELD (CpuAVX512_VNNI
),
585 BITFIELD (CpuAVX512_BITALG
),
586 BITFIELD (CpuAVX512_BF16
),
587 BITFIELD (CpuAVX512_VP2INTERSECT
),
588 BITFIELD (CpuMWAITX
),
589 BITFIELD (CpuCLZERO
),
592 BITFIELD (CpuPTWRITE
),
597 BITFIELD (CpuVPCLMULQDQ
),
598 BITFIELD (CpuWBNOINVD
),
599 BITFIELD (CpuPCONFIG
),
600 BITFIELD (CpuWAITPKG
),
601 BITFIELD (CpuCLDEMOTE
),
602 BITFIELD (CpuMOVDIRI
),
603 BITFIELD (CpuMOVDIR64B
),
604 BITFIELD (CpuENQCMD
),
606 BITFIELD (CpuMCOMMIT
),
608 BITFIELD (CpuUnused
),
612 static bitfield opcode_modifiers
[] =
618 BITFIELD (ShortForm
),
620 BITFIELD (JumpDword
),
622 BITFIELD (JumpInterSegment
),
626 BITFIELD (CheckRegSize
),
627 BITFIELD (IgnoreSize
),
628 BITFIELD (DefaultSize
),
639 BITFIELD (BNDPrefixOk
),
640 BITFIELD (NoTrackPrefixOk
),
641 BITFIELD (IsLockable
),
642 BITFIELD (RegKludge
),
643 BITFIELD (Implicit1stXmm0
),
644 BITFIELD (RepPrefixOk
),
645 BITFIELD (HLEPrefixOk
),
648 BITFIELD (AddrPrefixOpReg
),
657 BITFIELD (VexOpcode
),
658 BITFIELD (VexSources
),
664 BITFIELD (Broadcast
),
665 BITFIELD (StaticRounding
),
667 BITFIELD (Disp8MemShift
),
668 BITFIELD (NoDefMask
),
669 BITFIELD (ImplicitQuadGroup
),
671 BITFIELD (ATTMnemonic
),
672 BITFIELD (ATTSyntax
),
673 BITFIELD (IntelSyntax
),
678 #define CLASS(n) #n, n
680 static const struct {
682 enum operand_class value
;
683 } operand_classes
[] = {
697 #define INSTANCE(n) #n, n
699 static const struct {
701 enum operand_instance value
;
702 } operand_instances
[] = {
711 static bitfield operand_types
[] =
720 BITFIELD (BaseIndex
),
726 BITFIELD (JumpAbsolute
),
736 BITFIELD (Unspecified
),
742 static const char *filename
;
743 static i386_cpu_flags active_cpu_flags
;
744 static int active_isstring
;
747 compare (const void *x
, const void *y
)
749 const bitfield
*xp
= (const bitfield
*) x
;
750 const bitfield
*yp
= (const bitfield
*) y
;
751 return xp
->position
- yp
->position
;
755 fail (const char *message
, ...)
759 va_start (args
, message
);
760 fprintf (stderr
, _("%s: error: "), program_name
);
761 vfprintf (stderr
, message
, args
);
767 process_copyright (FILE *fp
)
769 fprintf (fp
, "/* This file is automatically generated by i386-gen. Do not edit! */\n\
770 /* Copyright (C) 2007-2019 Free Software Foundation, Inc.\n\
772 This file is part of the GNU opcodes library.\n\
774 This library is free software; you can redistribute it and/or modify\n\
775 it under the terms of the GNU General Public License as published by\n\
776 the Free Software Foundation; either version 3, or (at your option)\n\
777 any later version.\n\
779 It is distributed in the hope that it will be useful, but WITHOUT\n\
780 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n\
781 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public\n\
782 License for more details.\n\
784 You should have received a copy of the GNU General Public License\n\
785 along with this program; if not, write to the Free Software\n\
786 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,\n\
787 MA 02110-1301, USA. */\n");
790 /* Remove leading white spaces. */
793 remove_leading_whitespaces (char *str
)
795 while (ISSPACE (*str
))
800 /* Remove trailing white spaces. */
803 remove_trailing_whitespaces (char *str
)
805 size_t last
= strlen (str
);
813 if (ISSPACE (str
[last
]))
821 /* Find next field separated by SEP and terminate it. Return a
822 pointer to the one after it. */
825 next_field (char *str
, char sep
, char **next
, char *last
)
829 p
= remove_leading_whitespaces (str
);
830 for (str
= p
; *str
!= sep
&& *str
!= '\0'; str
++);
833 remove_trailing_whitespaces (p
);
843 static void set_bitfield (char *, bitfield
*, int, unsigned int, int);
846 set_bitfield_from_cpu_flag_init (char *f
, bitfield
*array
, unsigned int size
,
849 char *str
, *next
, *last
;
852 for (i
= 0; i
< ARRAY_SIZE (cpu_flag_init
); i
++)
853 if (strcmp (cpu_flag_init
[i
].name
, f
) == 0)
855 /* Turn on selective bits. */
856 char *init
= xstrdup (cpu_flag_init
[i
].init
);
857 last
= init
+ strlen (init
);
858 for (next
= init
; next
&& next
< last
; )
860 str
= next_field (next
, '|', &next
, last
);
862 set_bitfield (str
, array
, 1, size
, lineno
);
872 set_bitfield (char *f
, bitfield
*array
, int value
,
873 unsigned int size
, int lineno
)
877 if (strcmp (f
, "CpuFP") == 0)
879 set_bitfield("Cpu387", array
, value
, size
, lineno
);
880 set_bitfield("Cpu287", array
, value
, size
, lineno
);
883 else if (strcmp (f
, "Mmword") == 0)
885 else if (strcmp (f
, "Oword") == 0)
888 for (i
= 0; i
< size
; i
++)
889 if (strcasecmp (array
[i
].name
, f
) == 0)
891 array
[i
].value
= value
;
897 const char *v
= strchr (f
, '=');
904 for (i
= 0; i
< size
; i
++)
905 if (strncasecmp (array
[i
].name
, f
, n
) == 0)
907 value
= strtol (v
+ 1, &end
, 0);
910 array
[i
].value
= value
;
918 /* Handle CPU_XXX_FLAGS. */
919 if (value
== 1 && !set_bitfield_from_cpu_flag_init (f
, array
, size
, lineno
))
923 fail (_("%s: %d: unknown bitfield: %s\n"), filename
, lineno
, f
);
925 fail (_("unknown bitfield: %s\n"), f
);
929 output_cpu_flags (FILE *table
, bitfield
*flags
, unsigned int size
,
930 int macro
, const char *comma
, const char *indent
)
934 memset (&active_cpu_flags
, 0, sizeof(active_cpu_flags
));
936 fprintf (table
, "%s{ { ", indent
);
938 for (i
= 0; i
< size
- 1; i
++)
940 if (((i
+ 1) % 20) != 0)
941 fprintf (table
, "%d, ", flags
[i
].value
);
943 fprintf (table
, "%d,", flags
[i
].value
);
944 if (((i
+ 1) % 20) == 0)
946 /* We need \\ for macro. */
948 fprintf (table
, " \\\n %s", indent
);
950 fprintf (table
, "\n %s", indent
);
953 active_cpu_flags
.array
[i
/ 32] |= 1U << (i
% 32);
956 fprintf (table
, "%d } }%s\n", flags
[i
].value
, comma
);
960 process_i386_cpu_flag (FILE *table
, char *flag
, int macro
,
961 const char *comma
, const char *indent
,
964 char *str
, *next
, *last
;
966 bitfield flags
[ARRAY_SIZE (cpu_flags
)];
968 /* Copy the default cpu flags. */
969 memcpy (flags
, cpu_flags
, sizeof (cpu_flags
));
971 if (strcasecmp (flag
, "unknown") == 0)
973 /* We turn on everything except for cpu64 in case of
974 CPU_UNKNOWN_FLAGS. */
975 for (i
= 0; i
< ARRAY_SIZE (flags
); i
++)
976 if (flags
[i
].position
!= Cpu64
)
979 else if (flag
[0] == '~')
981 last
= flag
+ strlen (flag
);
988 fail (_("%s: %d: missing `)' in bitfield: %s\n"), filename
,
995 /* First we turn on everything except for cpu64. */
996 for (i
= 0; i
< ARRAY_SIZE (flags
); i
++)
997 if (flags
[i
].position
!= Cpu64
)
1000 /* Turn off selective bits. */
1001 for (; next
&& next
< last
; )
1003 str
= next_field (next
, '|', &next
, last
);
1005 set_bitfield (str
, flags
, 0, ARRAY_SIZE (flags
), lineno
);
1008 else if (strcmp (flag
, "0"))
1010 /* Turn on selective bits. */
1011 last
= flag
+ strlen (flag
);
1012 for (next
= flag
; next
&& next
< last
; )
1014 str
= next_field (next
, '|', &next
, last
);
1016 set_bitfield (str
, flags
, 1, ARRAY_SIZE (flags
), lineno
);
1020 output_cpu_flags (table
, flags
, ARRAY_SIZE (flags
), macro
,
1025 output_opcode_modifier (FILE *table
, bitfield
*modifier
, unsigned int size
)
1029 fprintf (table
, " { ");
1031 for (i
= 0; i
< size
- 1; i
++)
1033 if (((i
+ 1) % 20) != 0)
1034 fprintf (table
, "%d, ", modifier
[i
].value
);
1036 fprintf (table
, "%d,", modifier
[i
].value
);
1037 if (((i
+ 1) % 20) == 0)
1038 fprintf (table
, "\n ");
1041 fprintf (table
, "%d },\n", modifier
[i
].value
);
1045 adjust_broadcast_modifier (char **opnd
)
1047 char *str
, *next
, *last
, *op
;
1048 int bcst_type
= INT_MAX
;
1050 /* Skip the immediate operand. */
1052 if (strcasecmp(op
, "Imm8") == 0)
1056 last
= op
+ strlen (op
);
1057 for (next
= op
; next
&& next
< last
; )
1059 str
= next_field (next
, '|', &next
, last
);
1062 if (strcasecmp(str
, "Byte") == 0)
1064 /* The smalest broadcast type, no need to check
1066 bcst_type
= BYTE_BROADCAST
;
1069 else if (strcasecmp(str
, "Word") == 0)
1071 if (bcst_type
> WORD_BROADCAST
)
1072 bcst_type
= WORD_BROADCAST
;
1074 else if (strcasecmp(str
, "Dword") == 0)
1076 if (bcst_type
> DWORD_BROADCAST
)
1077 bcst_type
= DWORD_BROADCAST
;
1079 else if (strcasecmp(str
, "Qword") == 0)
1081 if (bcst_type
> QWORD_BROADCAST
)
1082 bcst_type
= QWORD_BROADCAST
;
1088 if (bcst_type
== INT_MAX
)
1089 fail (_("unknown broadcast operand: %s\n"), op
);
1095 process_i386_opcode_modifier (FILE *table
, char *mod
, char **opnd
, int lineno
)
1097 char *str
, *next
, *last
;
1098 bitfield modifiers
[ARRAY_SIZE (opcode_modifiers
)];
1100 active_isstring
= 0;
1102 /* Copy the default opcode modifier. */
1103 memcpy (modifiers
, opcode_modifiers
, sizeof (modifiers
));
1105 if (strcmp (mod
, "0"))
1107 unsigned int have_w
= 0, bwlq_suf
= 0xf;
1109 last
= mod
+ strlen (mod
);
1110 for (next
= mod
; next
&& next
< last
; )
1112 str
= next_field (next
, '|', &next
, last
);
1116 if (strcasecmp(str
, "Broadcast") == 0)
1117 val
= adjust_broadcast_modifier (opnd
);
1118 set_bitfield (str
, modifiers
, val
, ARRAY_SIZE (modifiers
),
1120 if (strcasecmp(str
, "IsString") == 0)
1121 active_isstring
= 1;
1123 if (strcasecmp(str
, "W") == 0)
1126 if (strcasecmp(str
, "No_bSuf") == 0)
1128 if (strcasecmp(str
, "No_wSuf") == 0)
1130 if (strcasecmp(str
, "No_lSuf") == 0)
1132 if (strcasecmp(str
, "No_qSuf") == 0)
1137 if (have_w
&& !bwlq_suf
)
1138 fail ("%s: %d: stray W modifier\n", filename
, lineno
);
1139 if (have_w
&& !(bwlq_suf
& 1))
1140 fprintf (stderr
, "%s: %d: W modifier without Byte operand(s)\n",
1142 if (have_w
&& !(bwlq_suf
& ~1))
1144 "%s: %d: W modifier without Word/Dword/Qword operand(s)\n",
1147 output_opcode_modifier (table
, modifiers
, ARRAY_SIZE (modifiers
));
1157 output_operand_type (FILE *table
, enum operand_class
class,
1158 enum operand_instance instance
,
1159 const bitfield
*types
, unsigned int size
,
1160 enum stage stage
, const char *indent
)
1164 fprintf (table
, "{ { %d, %d, ", class, instance
);
1166 for (i
= 0; i
< size
- 1; i
++)
1168 if (((i
+ 3) % 20) != 0)
1169 fprintf (table
, "%d, ", types
[i
].value
);
1171 fprintf (table
, "%d,", types
[i
].value
);
1172 if (((i
+ 3) % 20) == 0)
1174 /* We need \\ for macro. */
1175 if (stage
== stage_macros
)
1176 fprintf (table
, " \\\n%s", indent
);
1178 fprintf (table
, "\n%s", indent
);
1182 fprintf (table
, "%d } }", types
[i
].value
);
1186 process_i386_operand_type (FILE *table
, char *op
, enum stage stage
,
1187 const char *indent
, int lineno
)
1189 char *str
, *next
, *last
;
1190 enum operand_class
class = ClassNone
;
1191 enum operand_instance instance
= InstanceNone
;
1192 bitfield types
[ARRAY_SIZE (operand_types
)];
1194 /* Copy the default operand type. */
1195 memcpy (types
, operand_types
, sizeof (types
));
1197 if (strcmp (op
, "0"))
1201 last
= op
+ strlen (op
);
1202 for (next
= op
; next
&& next
< last
; )
1204 str
= next_field (next
, '|', &next
, last
);
1209 if (!strncmp(str
, "Class=", 6))
1211 for (i
= 0; i
< ARRAY_SIZE(operand_classes
); ++i
)
1212 if (!strcmp(str
+ 6, operand_classes
[i
].name
))
1214 class = operand_classes
[i
].value
;
1220 if (str
&& !strncmp(str
, "Instance=", 9))
1222 for (i
= 0; i
< ARRAY_SIZE(operand_instances
); ++i
)
1223 if (!strcmp(str
+ 9, operand_instances
[i
].name
))
1225 instance
= operand_instances
[i
].value
;
1233 set_bitfield (str
, types
, 1, ARRAY_SIZE (types
), lineno
);
1234 if (strcasecmp(str
, "BaseIndex") == 0)
1239 if (stage
== stage_opcodes
&& baseindex
&& !active_isstring
)
1241 set_bitfield("Disp8", types
, 1, ARRAY_SIZE (types
), lineno
);
1242 if (!active_cpu_flags
.bitfield
.cpu64
1243 && !active_cpu_flags
.bitfield
.cpumpx
)
1244 set_bitfield("Disp16", types
, 1, ARRAY_SIZE (types
), lineno
);
1245 set_bitfield("Disp32", types
, 1, ARRAY_SIZE (types
), lineno
);
1246 if (!active_cpu_flags
.bitfield
.cpuno64
)
1247 set_bitfield("Disp32S", types
, 1, ARRAY_SIZE (types
), lineno
);
1250 output_operand_type (table
, class, instance
, types
, ARRAY_SIZE (types
),
1255 output_i386_opcode (FILE *table
, const char *name
, char *str
,
1256 char *last
, int lineno
)
1259 char *operands
, *base_opcode
, *extension_opcode
, *opcode_length
;
1260 char *cpu_flags
, *opcode_modifier
, *operand_types
[MAX_OPERANDS
];
1262 /* Find number of operands. */
1263 operands
= next_field (str
, ',', &str
, last
);
1265 /* Find base_opcode. */
1266 base_opcode
= next_field (str
, ',', &str
, last
);
1268 /* Find extension_opcode. */
1269 extension_opcode
= next_field (str
, ',', &str
, last
);
1271 /* Find opcode_length. */
1272 opcode_length
= next_field (str
, ',', &str
, last
);
1274 /* Find cpu_flags. */
1275 cpu_flags
= next_field (str
, ',', &str
, last
);
1277 /* Find opcode_modifier. */
1278 opcode_modifier
= next_field (str
, ',', &str
, last
);
1280 /* Remove the first {. */
1281 str
= remove_leading_whitespaces (str
);
1284 str
= remove_leading_whitespaces (str
+ 1);
1288 /* There are at least "X}". */
1292 /* Remove trailing white spaces and }. */
1296 if (ISSPACE (str
[i
]) || str
[i
] == '}')
1305 /* Find operand_types. */
1306 for (i
= 0; i
< ARRAY_SIZE (operand_types
); i
++)
1310 operand_types
[i
] = NULL
;
1314 operand_types
[i
] = next_field (str
, ',', &str
, last
);
1315 if (*operand_types
[i
] == '0')
1318 operand_types
[i
] = NULL
;
1323 fprintf (table
, " { \"%s\", %s, %s, %s, %s,\n",
1324 name
, base_opcode
, extension_opcode
, opcode_length
, operands
);
1326 process_i386_cpu_flag (table
, cpu_flags
, 0, ",", " ", lineno
);
1328 process_i386_opcode_modifier (table
, opcode_modifier
, operand_types
, lineno
);
1330 fprintf (table
, " { ");
1332 for (i
= 0; i
< ARRAY_SIZE (operand_types
); i
++)
1334 if (operand_types
[i
] == NULL
|| *operand_types
[i
] == '0')
1337 process_i386_operand_type (table
, "0", stage_opcodes
, "\t ",
1343 fprintf (table
, ",\n ");
1345 process_i386_operand_type (table
, operand_types
[i
], stage_opcodes
,
1348 fprintf (table
, " } },\n");
1351 struct opcode_hash_entry
1353 struct opcode_hash_entry
*next
;
1359 /* Calculate the hash value of an opcode hash entry P. */
1362 opcode_hash_hash (const void *p
)
1364 struct opcode_hash_entry
*entry
= (struct opcode_hash_entry
*) p
;
1365 return htab_hash_string (entry
->name
);
1368 /* Compare a string Q against an opcode hash entry P. */
1371 opcode_hash_eq (const void *p
, const void *q
)
1373 struct opcode_hash_entry
*entry
= (struct opcode_hash_entry
*) p
;
1374 const char *name
= (const char *) q
;
1375 return strcmp (name
, entry
->name
) == 0;
1379 process_i386_opcodes (FILE *table
)
1384 char *str
, *p
, *last
, *name
;
1385 struct opcode_hash_entry
**hash_slot
, **entry
, *next
;
1386 htab_t opcode_hash_table
;
1387 struct opcode_hash_entry
**opcode_array
;
1388 unsigned int opcode_array_size
= 1024;
1389 int lineno
= 0, marker
= 0;
1391 filename
= "i386-opc.tbl";
1395 opcode_array
= (struct opcode_hash_entry
**)
1396 xmalloc (sizeof (*opcode_array
) * opcode_array_size
);
1398 opcode_hash_table
= htab_create_alloc (16, opcode_hash_hash
,
1399 opcode_hash_eq
, NULL
,
1402 fprintf (table
, "\n/* i386 opcode table. */\n\n");
1403 fprintf (table
, "const insn_template i386_optab[] =\n{\n");
1405 /* Put everything on opcode array. */
1408 if (fgets (buf
, sizeof (buf
), fp
) == NULL
)
1413 p
= remove_leading_whitespaces (buf
);
1415 /* Skip comments. */
1416 str
= strstr (p
, "//");
1420 /* Remove trailing white spaces. */
1421 remove_trailing_whitespaces (p
);
1426 if (!strcmp("### MARKER ###", buf
))
1430 /* Since we ignore all included files (we only care about their
1431 #define-s here), we don't need to monitor filenames. The final
1432 line number directive is going to refer to the main source file
1437 p
= remove_leading_whitespaces (p
+ 1);
1438 if (!strncmp(p
, "line", 4))
1440 ln
= strtoul (p
, &end
, 10);
1441 if (ln
> 1 && ln
< INT_MAX
1442 && *remove_leading_whitespaces (end
) == '"')
1445 /* Ignore comments. */
1455 last
= p
+ strlen (p
);
1458 name
= next_field (p
, ',', &str
, last
);
1460 /* Get the slot in hash table. */
1461 hash_slot
= (struct opcode_hash_entry
**)
1462 htab_find_slot_with_hash (opcode_hash_table
, name
,
1463 htab_hash_string (name
),
1466 if (*hash_slot
== NULL
)
1468 /* It is the new one. Put it on opcode array. */
1469 if (i
>= opcode_array_size
)
1471 /* Grow the opcode array when needed. */
1472 opcode_array_size
+= 1024;
1473 opcode_array
= (struct opcode_hash_entry
**)
1474 xrealloc (opcode_array
,
1475 sizeof (*opcode_array
) * opcode_array_size
);
1478 opcode_array
[i
] = (struct opcode_hash_entry
*)
1479 xmalloc (sizeof (struct opcode_hash_entry
));
1480 opcode_array
[i
]->next
= NULL
;
1481 opcode_array
[i
]->name
= xstrdup (name
);
1482 opcode_array
[i
]->opcode
= xstrdup (str
);
1483 opcode_array
[i
]->lineno
= lineno
;
1484 *hash_slot
= opcode_array
[i
];
1489 /* Append it to the existing one. */
1491 while ((*entry
) != NULL
)
1492 entry
= &(*entry
)->next
;
1493 *entry
= (struct opcode_hash_entry
*)
1494 xmalloc (sizeof (struct opcode_hash_entry
));
1495 (*entry
)->next
= NULL
;
1496 (*entry
)->name
= (*hash_slot
)->name
;
1497 (*entry
)->opcode
= xstrdup (str
);
1498 (*entry
)->lineno
= lineno
;
1502 /* Process opcode array. */
1503 for (j
= 0; j
< i
; j
++)
1505 for (next
= opcode_array
[j
]; next
; next
= next
->next
)
1509 lineno
= next
->lineno
;
1510 last
= str
+ strlen (str
);
1511 output_i386_opcode (table
, name
, str
, last
, lineno
);
1517 fprintf (table
, " { NULL, 0, 0, 0, 0,\n");
1519 process_i386_cpu_flag (table
, "0", 0, ",", " ", -1);
1521 process_i386_opcode_modifier (table
, "0", NULL
, -1);
1523 fprintf (table
, " { ");
1524 process_i386_operand_type (table
, "0", stage_opcodes
, "\t ", -1);
1525 fprintf (table
, " } }\n");
1527 fprintf (table
, "};\n");
1531 process_i386_registers (FILE *table
)
1535 char *str
, *p
, *last
;
1536 char *reg_name
, *reg_type
, *reg_flags
, *reg_num
;
1537 char *dw2_32_num
, *dw2_64_num
;
1540 filename
= "i386-reg.tbl";
1541 fp
= fopen (filename
, "r");
1543 fail (_("can't find i386-reg.tbl for reading, errno = %s\n"),
1546 fprintf (table
, "\n/* i386 register table. */\n\n");
1547 fprintf (table
, "const reg_entry i386_regtab[] =\n{\n");
1551 if (fgets (buf
, sizeof (buf
), fp
) == NULL
)
1556 p
= remove_leading_whitespaces (buf
);
1558 /* Skip comments. */
1559 str
= strstr (p
, "//");
1563 /* Remove trailing white spaces. */
1564 remove_trailing_whitespaces (p
);
1569 fprintf (table
, "%s\n", p
);
1577 last
= p
+ strlen (p
);
1579 /* Find reg_name. */
1580 reg_name
= next_field (p
, ',', &str
, last
);
1582 /* Find reg_type. */
1583 reg_type
= next_field (str
, ',', &str
, last
);
1585 /* Find reg_flags. */
1586 reg_flags
= next_field (str
, ',', &str
, last
);
1589 reg_num
= next_field (str
, ',', &str
, last
);
1591 fprintf (table
, " { \"%s\",\n ", reg_name
);
1593 process_i386_operand_type (table
, reg_type
, stage_registers
, "\t",
1596 /* Find 32-bit Dwarf2 register number. */
1597 dw2_32_num
= next_field (str
, ',', &str
, last
);
1599 /* Find 64-bit Dwarf2 register number. */
1600 dw2_64_num
= next_field (str
, ',', &str
, last
);
1602 fprintf (table
, ",\n %s, %s, { %s, %s } },\n",
1603 reg_flags
, reg_num
, dw2_32_num
, dw2_64_num
);
1608 fprintf (table
, "};\n");
1610 fprintf (table
, "\nconst unsigned int i386_regtab_size = ARRAY_SIZE (i386_regtab);\n");
1614 process_i386_initializers (void)
1617 FILE *fp
= fopen ("i386-init.h", "w");
1621 fail (_("can't create i386-init.h, errno = %s\n"),
1624 process_copyright (fp
);
1626 for (i
= 0; i
< ARRAY_SIZE (cpu_flag_init
); i
++)
1628 fprintf (fp
, "\n#define %s \\\n", cpu_flag_init
[i
].name
);
1629 init
= xstrdup (cpu_flag_init
[i
].init
);
1630 process_i386_cpu_flag (fp
, init
, 1, "", " ", -1);
1634 for (i
= 0; i
< ARRAY_SIZE (operand_type_init
); i
++)
1636 fprintf (fp
, "\n\n#define %s \\\n ", operand_type_init
[i
].name
);
1637 init
= xstrdup (operand_type_init
[i
].init
);
1638 process_i386_operand_type (fp
, init
, stage_macros
, " ", -1);
1646 /* Program options. */
1647 #define OPTION_SRCDIR 200
1649 struct option long_options
[] =
1651 {"srcdir", required_argument
, NULL
, OPTION_SRCDIR
},
1652 {"debug", no_argument
, NULL
, 'd'},
1653 {"version", no_argument
, NULL
, 'V'},
1654 {"help", no_argument
, NULL
, 'h'},
1655 {0, no_argument
, NULL
, 0}
1659 print_version (void)
1661 printf ("%s: version 1.0\n", program_name
);
1666 usage (FILE * stream
, int status
)
1668 fprintf (stream
, "Usage: %s [-V | --version] [-d | --debug] [--srcdir=dirname] [--help]\n",
1674 main (int argc
, char **argv
)
1676 extern int chdir (char *);
1677 char *srcdir
= NULL
;
1679 unsigned int i
, cpumax
;
1682 program_name
= *argv
;
1683 xmalloc_set_program_name (program_name
);
1685 while ((c
= getopt_long (argc
, argv
, "vVdh", long_options
, 0)) != EOF
)
1710 if (chdir (srcdir
) != 0)
1711 fail (_("unable to change directory to \"%s\", errno = %s\n"),
1712 srcdir
, xstrerror (errno
));
1714 /* cpu_flags isn't sorted by position. */
1716 for (i
= 0; i
< ARRAY_SIZE (cpu_flags
); i
++)
1717 if (cpu_flags
[i
].position
> cpumax
)
1718 cpumax
= cpu_flags
[i
].position
;
1720 /* Check the unused bitfield in i386_cpu_flags. */
1722 static_assert (ARRAY_SIZE (cpu_flags
) == CpuMax
+ 2);
1724 if ((cpumax
- 1) != CpuMax
)
1725 fail (_("CpuMax != %d!\n"), cpumax
);
1727 static_assert (ARRAY_SIZE (cpu_flags
) == CpuMax
+ 1);
1729 if (cpumax
!= CpuMax
)
1730 fail (_("CpuMax != %d!\n"), cpumax
);
1732 c
= CpuNumOfBits
- CpuMax
- 1;
1734 fail (_("%d unused bits in i386_cpu_flags.\n"), c
);
1737 static_assert (ARRAY_SIZE (opcode_modifiers
) == Opcode_Modifier_Num
);
1739 /* Check the unused bitfield in i386_operand_type. */
1741 static_assert (ARRAY_SIZE (operand_types
) + CLASS_WIDTH
+ INSTANCE_WIDTH
1744 static_assert (ARRAY_SIZE (operand_types
) + CLASS_WIDTH
+ INSTANCE_WIDTH
1747 c
= OTNumOfBits
- OTNum
;
1749 fail (_("%d unused bits in i386_operand_type.\n"), c
);
1752 qsort (cpu_flags
, ARRAY_SIZE (cpu_flags
), sizeof (cpu_flags
[0]),
1755 qsort (opcode_modifiers
, ARRAY_SIZE (opcode_modifiers
),
1756 sizeof (opcode_modifiers
[0]), compare
);
1758 qsort (operand_types
, ARRAY_SIZE (operand_types
),
1759 sizeof (operand_types
[0]), compare
);
1761 table
= fopen ("i386-tbl.h", "w");
1763 fail (_("can't create i386-tbl.h, errno = %s\n"),
1766 process_copyright (table
);
1768 process_i386_opcodes (table
);
1769 process_i386_registers (table
);
1770 process_i386_initializers ();