1 /* Copyright 2007, 2008 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 static const char *program_name
= NULL
;
36 typedef struct initializer
42 static initializer cpu_flag_init
[] =
44 { "CPU_UNKNOWN_FLAGS",
46 { "CPU_GENERIC32_FLAGS",
47 "Cpu186|Cpu286|Cpu386" },
48 { "CPU_GENERIC64_FLAGS",
49 "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuP4|CpuMMX|CpuSSE|CpuSSE2|CpuLM" },
57 "Cpu186|Cpu286|Cpu386" },
59 "Cpu186|Cpu286|Cpu386|Cpu486" },
61 "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586" },
63 "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686" },
65 "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuMMX" },
67 "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuMMX|CpuSSE" },
69 "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuP4|CpuMMX|CpuSSE|CpuSSE2" },
71 "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuP4|CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuLM" },
73 "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuP4|CpuMMX|CpuSSE|CpuSSE2|CpuSSE3" },
75 "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuP4|CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuLM" },
77 "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|CpuK6|CpuMMX" },
79 "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|CpuK6|CpuMMX|Cpu3dnow" },
81 "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuK6|CpuMMX|Cpu3dnow|Cpu3dnowA" },
83 "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuK6|CpuK8|CpuMMX|Cpu3dnow|Cpu3dnowA|CpuSSE|CpuSSE2|CpuLM" },
84 { "CPU_AMDFAM10_FLAGS",
85 "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuK6|CpuK8|CpuMMX|Cpu3dnow|Cpu3dnowA|CpuSSE|CpuSSE2|CpuSSE3|CpuSSE4a|CpuABM|CpuLM" },
91 "CpuMMX|CpuSSE|CpuSSE2" },
93 "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3" },
95 "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3" },
97 "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1" },
99 "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2" },
107 "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAES" },
108 { "CPU_PCLMUL_FLAGS",
109 "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuPCLMUL" },
111 "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuFMA" },
118 { "CPU_3DNOWA_FLAGS",
119 "CpuMMX|Cpu3dnow|Cpu3dnowA" },
120 { "CPU_PADLOCK_FLAGS",
125 "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSE4a" },
129 "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSE4a|CpuABM|CpuSSE5"},
131 "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX" },
134 static initializer operand_type_init
[] =
136 { "OPERAND_TYPE_NONE",
138 { "OPERAND_TYPE_REG8",
140 { "OPERAND_TYPE_REG16",
142 { "OPERAND_TYPE_REG32",
144 { "OPERAND_TYPE_REG64",
146 { "OPERAND_TYPE_IMM1",
148 { "OPERAND_TYPE_IMM8",
150 { "OPERAND_TYPE_IMM8S",
152 { "OPERAND_TYPE_IMM16",
154 { "OPERAND_TYPE_IMM32",
156 { "OPERAND_TYPE_IMM32S",
158 { "OPERAND_TYPE_IMM64",
160 { "OPERAND_TYPE_BASEINDEX",
162 { "OPERAND_TYPE_DISP8",
164 { "OPERAND_TYPE_DISP16",
166 { "OPERAND_TYPE_DISP32",
168 { "OPERAND_TYPE_DISP32S",
170 { "OPERAND_TYPE_DISP64",
172 { "OPERAND_TYPE_INOUTPORTREG",
174 { "OPERAND_TYPE_SHIFTCOUNT",
176 { "OPERAND_TYPE_CONTROL",
178 { "OPERAND_TYPE_TEST",
180 { "OPERAND_TYPE_DEBUG",
182 { "OPERAND_TYPE_FLOATREG",
184 { "OPERAND_TYPE_FLOATACC",
186 { "OPERAND_TYPE_SREG2",
188 { "OPERAND_TYPE_SREG3",
190 { "OPERAND_TYPE_ACC",
192 { "OPERAND_TYPE_JUMPABSOLUTE",
194 { "OPERAND_TYPE_REGMMX",
196 { "OPERAND_TYPE_REGXMM",
198 { "OPERAND_TYPE_REGYMM",
200 { "OPERAND_TYPE_ESSEG",
202 { "OPERAND_TYPE_ACC32",
204 { "OPERAND_TYPE_ACC64",
206 { "OPERAND_TYPE_INOUTPORTREG",
208 { "OPERAND_TYPE_REG16_INOUTPORTREG",
209 "Reg16|InOutPortReg" },
210 { "OPERAND_TYPE_DISP16_32",
212 { "OPERAND_TYPE_ANYDISP",
213 "Disp8|Disp16|Disp32|Disp32S|Disp64" },
214 { "OPERAND_TYPE_IMM16_32",
216 { "OPERAND_TYPE_IMM16_32S",
218 { "OPERAND_TYPE_IMM16_32_32S",
219 "Imm16|Imm32|Imm32S" },
220 { "OPERAND_TYPE_IMM32_32S_DISP32",
221 "Imm32|Imm32S|Disp32" },
222 { "OPERAND_TYPE_IMM64_DISP64",
224 { "OPERAND_TYPE_IMM32_32S_64_DISP32",
225 "Imm32|Imm32S|Imm64|Disp32" },
226 { "OPERAND_TYPE_IMM32_32S_64_DISP32_64",
227 "Imm32|Imm32S|Imm64|Disp32|Disp64" },
228 { "OPERAND_TYPE_VEX_IMM4",
232 typedef struct bitfield
239 #define BITFIELD(n) { n, 0, #n }
241 static bitfield cpu_flags
[] =
257 BITFIELD (CpuSSE4_1
),
258 BITFIELD (CpuSSE4_2
),
263 BITFIELD (Cpu3dnowA
),
264 BITFIELD (CpuPadLock
),
271 BITFIELD (CpuPCLMUL
),
279 BITFIELD (CpuUnused
),
283 static bitfield opcode_modifiers
[] =
289 BITFIELD (ShortForm
),
291 BITFIELD (JumpDword
),
293 BITFIELD (JumpInterSegment
),
300 BITFIELD (IgnoreSize
),
301 BITFIELD (DefaultSize
),
310 BITFIELD (RegKludge
),
311 BITFIELD (FirstXmm0
),
312 BITFIELD (Implicit1stXmm0
),
313 BITFIELD (ByteOkIntel
),
316 BITFIELD (AddrPrefixOp0
),
334 BITFIELD (Vex3Sources
),
335 BITFIELD (VexImmExt
),
339 BITFIELD (ATTMnemonic
),
340 BITFIELD (ATTSyntax
),
341 BITFIELD (IntelSyntax
),
344 static bitfield operand_types
[] =
361 BITFIELD (BaseIndex
),
367 BITFIELD (InOutPortReg
),
368 BITFIELD (ShiftCount
),
376 BITFIELD (JumpAbsolute
),
388 BITFIELD (Unspecified
),
397 static const char *filename
;
400 compare (const void *x
, const void *y
)
402 const bitfield
*xp
= (const bitfield
*) x
;
403 const bitfield
*yp
= (const bitfield
*) y
;
404 return xp
->position
- yp
->position
;
408 fail (const char *message
, ...)
412 va_start (args
, message
);
413 fprintf (stderr
, _("%s: Error: "), program_name
);
414 vfprintf (stderr
, message
, args
);
420 process_copyright (FILE *fp
)
422 fprintf (fp
, "/* This file is automatically generated by i386-gen. Do not edit! */\n\
423 /* Copyright 2007, 2008 Free Software Foundation, Inc.\n\
425 This file is part of the GNU opcodes library.\n\
427 This library is free software; you can redistribute it and/or modify\n\
428 it under the terms of the GNU General Public License as published by\n\
429 the Free Software Foundation; either version 3, or (at your option)\n\
430 any later version.\n\
432 It is distributed in the hope that it will be useful, but WITHOUT\n\
433 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n\
434 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public\n\
435 License for more details.\n\
437 You should have received a copy of the GNU General Public License\n\
438 along with this program; if not, write to the Free Software\n\
439 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,\n\
440 MA 02110-1301, USA. */\n");
443 /* Remove leading white spaces. */
446 remove_leading_whitespaces (char *str
)
448 while (ISSPACE (*str
))
453 /* Remove trailing white spaces. */
456 remove_trailing_whitespaces (char *str
)
458 size_t last
= strlen (str
);
466 if (ISSPACE (str
[last
]))
474 /* Find next field separated by SEP and terminate it. Return a
475 pointer to the one after it. */
478 next_field (char *str
, char sep
, char **next
, char *last
)
482 p
= remove_leading_whitespaces (str
);
483 for (str
= p
; *str
!= sep
&& *str
!= '\0'; str
++);
486 remove_trailing_whitespaces (p
);
497 set_bitfield (const char *f
, bitfield
*array
, unsigned int size
)
501 if (strcmp (f
, "CpuSledgehammer") == 0)
503 else if (strcmp (f
, "Mmword") == 0)
505 else if (strcmp (f
, "Oword") == 0)
508 for (i
= 0; i
< size
; i
++)
509 if (strcasecmp (array
[i
].name
, f
) == 0)
515 fail (_("%s: %d: Unknown bitfield: %s\n"), filename
, lineno
, f
);
519 output_cpu_flags (FILE *table
, bitfield
*flags
, unsigned int size
,
520 int macro
, const char *comma
, const char *indent
)
524 fprintf (table
, "%s{ { ", indent
);
526 for (i
= 0; i
< size
- 1; i
++)
528 fprintf (table
, "%d, ", flags
[i
].value
);
529 if (((i
+ 1) % 20) == 0)
531 /* We need \\ for macro. */
533 fprintf (table
, " \\\n %s", indent
);
535 fprintf (table
, "\n %s", indent
);
539 fprintf (table
, "%d } }%s\n", flags
[i
].value
, comma
);
543 process_i386_cpu_flag (FILE *table
, char *flag
, int macro
,
544 const char *comma
, const char *indent
)
546 char *str
, *next
, *last
;
547 bitfield flags
[ARRAY_SIZE (cpu_flags
)];
549 /* Copy the default cpu flags. */
550 memcpy (flags
, cpu_flags
, sizeof (cpu_flags
));
552 if (strcasecmp (flag
, "unknown") == 0)
556 /* We turn on everything except for cpu64 in case of
557 CPU_UNKNOWN_FLAGS. */
558 for (i
= 0; i
< ARRAY_SIZE (flags
); i
++)
559 if (flags
[i
].position
!= Cpu64
)
562 else if (strcmp (flag
, "0"))
564 last
= flag
+ strlen (flag
);
565 for (next
= flag
; next
&& next
< last
; )
567 str
= next_field (next
, '|', &next
, last
);
569 set_bitfield (str
, flags
, ARRAY_SIZE (flags
));
573 output_cpu_flags (table
, flags
, ARRAY_SIZE (flags
), macro
,
578 output_opcode_modifier (FILE *table
, bitfield
*modifier
, unsigned int size
)
582 fprintf (table
, " { ");
584 for (i
= 0; i
< size
- 1; i
++)
586 fprintf (table
, "%d, ", modifier
[i
].value
);
587 if (((i
+ 1) % 20) == 0)
588 fprintf (table
, "\n ");
591 fprintf (table
, "%d },\n", modifier
[i
].value
);
595 process_i386_opcode_modifier (FILE *table
, char *mod
)
597 char *str
, *next
, *last
;
598 bitfield modifiers
[ARRAY_SIZE (opcode_modifiers
)];
600 /* Copy the default opcode modifier. */
601 memcpy (modifiers
, opcode_modifiers
, sizeof (modifiers
));
603 if (strcmp (mod
, "0"))
605 last
= mod
+ strlen (mod
);
606 for (next
= mod
; next
&& next
< last
; )
608 str
= next_field (next
, '|', &next
, last
);
610 set_bitfield (str
, modifiers
, ARRAY_SIZE (modifiers
));
613 output_opcode_modifier (table
, modifiers
, ARRAY_SIZE (modifiers
));
617 output_operand_type (FILE *table
, bitfield
*types
, unsigned int size
,
618 int macro
, const char *indent
)
622 fprintf (table
, "{ { ");
624 for (i
= 0; i
< size
- 1; i
++)
626 fprintf (table
, "%d, ", types
[i
].value
);
627 if (((i
+ 1) % 20) == 0)
629 /* We need \\ for macro. */
631 fprintf (table
, "\\\n%s", indent
);
633 fprintf (table
, "\n%s", indent
);
637 fprintf (table
, "%d } }", types
[i
].value
);
641 process_i386_operand_type (FILE *table
, char *op
, int macro
,
644 char *str
, *next
, *last
;
645 bitfield types
[ARRAY_SIZE (operand_types
)];
647 /* Copy the default operand type. */
648 memcpy (types
, operand_types
, sizeof (types
));
650 if (strcmp (op
, "0"))
652 last
= op
+ strlen (op
);
653 for (next
= op
; next
&& next
< last
; )
655 str
= next_field (next
, '|', &next
, last
);
657 set_bitfield (str
, types
, ARRAY_SIZE (types
));
660 output_operand_type (table
, types
, ARRAY_SIZE (types
), macro
,
665 output_i386_opcode (FILE *table
, const char *name
, char *str
,
669 char *operands
, *base_opcode
, *extension_opcode
, *opcode_length
;
670 char *cpu_flags
, *opcode_modifier
, *operand_types
[MAX_OPERANDS
];
672 /* Find number of operands. */
673 operands
= next_field (str
, ',', &str
, last
);
675 /* Find base_opcode. */
676 base_opcode
= next_field (str
, ',', &str
, last
);
678 /* Find extension_opcode. */
679 extension_opcode
= next_field (str
, ',', &str
, last
);
681 /* Find opcode_length. */
682 opcode_length
= next_field (str
, ',', &str
, last
);
684 /* Find cpu_flags. */
685 cpu_flags
= next_field (str
, ',', &str
, last
);
687 /* Find opcode_modifier. */
688 opcode_modifier
= next_field (str
, ',', &str
, last
);
690 /* Remove the first {. */
691 str
= remove_leading_whitespaces (str
);
694 str
= remove_leading_whitespaces (str
+ 1);
698 /* There are at least "X}". */
702 /* Remove trailing white spaces and }. */
706 if (ISSPACE (str
[i
]) || str
[i
] == '}')
715 /* Find operand_types. */
716 for (i
= 0; i
< ARRAY_SIZE (operand_types
); i
++)
720 operand_types
[i
] = NULL
;
724 operand_types
[i
] = next_field (str
, ',', &str
, last
);
725 if (*operand_types
[i
] == '0')
728 operand_types
[i
] = NULL
;
733 fprintf (table
, " { \"%s\", %s, %s, %s, %s,\n",
734 name
, operands
, base_opcode
, extension_opcode
,
737 process_i386_cpu_flag (table
, cpu_flags
, 0, ",", " ");
739 process_i386_opcode_modifier (table
, opcode_modifier
);
741 fprintf (table
, " { ");
743 for (i
= 0; i
< ARRAY_SIZE (operand_types
); i
++)
745 if (operand_types
[i
] == NULL
|| *operand_types
[i
] == '0')
748 process_i386_operand_type (table
, "0", 0, "\t ");
753 fprintf (table
, ",\n ");
755 process_i386_operand_type (table
, operand_types
[i
], 0,
758 fprintf (table
, " } },\n");
761 struct opcode_hash_entry
763 struct opcode_hash_entry
*next
;
768 /* Calculate the hash value of an opcode hash entry P. */
771 opcode_hash_hash (const void *p
)
773 struct opcode_hash_entry
*entry
= (struct opcode_hash_entry
*) p
;
774 return htab_hash_string (entry
->name
);
777 /* Compare a string Q against an opcode hash entry P. */
780 opcode_hash_eq (const void *p
, const void *q
)
782 struct opcode_hash_entry
*entry
= (struct opcode_hash_entry
*) p
;
783 const char *name
= (const char *) q
;
784 return strcmp (name
, entry
->name
) == 0;
788 process_i386_opcodes (FILE *table
)
793 char *str
, *p
, *last
, *name
;
794 struct opcode_hash_entry
**hash_slot
, **entry
, *next
;
795 htab_t opcode_hash_table
;
796 struct opcode_hash_entry
**opcode_array
;
797 unsigned int opcode_array_size
= 1024;
799 filename
= "i386-opc.tbl";
800 fp
= fopen (filename
, "r");
803 fail (_("can't find i386-opc.tbl for reading, errno = %s\n"),
807 opcode_array
= (struct opcode_hash_entry
**)
808 xmalloc (sizeof (*opcode_array
) * opcode_array_size
);
810 opcode_hash_table
= htab_create_alloc (16, opcode_hash_hash
,
811 opcode_hash_eq
, NULL
,
814 fprintf (table
, "\n/* i386 opcode table. */\n\n");
815 fprintf (table
, "const template i386_optab[] =\n{\n");
817 /* Put everything on opcode array. */
820 if (fgets (buf
, sizeof (buf
), fp
) == NULL
)
825 p
= remove_leading_whitespaces (buf
);
828 str
= strstr (p
, "//");
832 /* Remove trailing white spaces. */
833 remove_trailing_whitespaces (p
);
838 /* Ignore comments. */
846 last
= p
+ strlen (p
);
849 name
= next_field (p
, ',', &str
, last
);
851 /* Get the slot in hash table. */
852 hash_slot
= (struct opcode_hash_entry
**)
853 htab_find_slot_with_hash (opcode_hash_table
, name
,
854 htab_hash_string (name
),
857 if (*hash_slot
== NULL
)
859 /* It is the new one. Put it on opcode array. */
860 if (i
>= opcode_array_size
)
862 /* Grow the opcode array when needed. */
863 opcode_array_size
+= 1024;
864 opcode_array
= (struct opcode_hash_entry
**)
865 xrealloc (opcode_array
,
866 sizeof (*opcode_array
) * opcode_array_size
);
869 opcode_array
[i
] = (struct opcode_hash_entry
*)
870 xmalloc (sizeof (struct opcode_hash_entry
));
871 opcode_array
[i
]->next
= NULL
;
872 opcode_array
[i
]->name
= xstrdup (name
);
873 opcode_array
[i
]->opcode
= xstrdup (str
);
874 *hash_slot
= opcode_array
[i
];
879 /* Append it to the existing one. */
881 while ((*entry
) != NULL
)
882 entry
= &(*entry
)->next
;
883 *entry
= (struct opcode_hash_entry
*)
884 xmalloc (sizeof (struct opcode_hash_entry
));
885 (*entry
)->next
= NULL
;
886 (*entry
)->name
= (*hash_slot
)->name
;
887 (*entry
)->opcode
= xstrdup (str
);
891 /* Process opcode array. */
892 for (j
= 0; j
< i
; j
++)
894 for (next
= opcode_array
[j
]; next
; next
= next
->next
)
898 last
= str
+ strlen (str
);
899 output_i386_opcode (table
, name
, str
, last
);
905 fprintf (table
, " { NULL, 0, 0, 0, 0,\n");
907 process_i386_cpu_flag (table
, "0", 0, ",", " ");
909 process_i386_opcode_modifier (table
, "0");
911 fprintf (table
, " { ");
912 process_i386_operand_type (table
, "0", 0, "\t ");
913 fprintf (table
, " } }\n");
915 fprintf (table
, "};\n");
919 process_i386_registers (FILE *table
)
923 char *str
, *p
, *last
;
924 char *reg_name
, *reg_type
, *reg_flags
, *reg_num
;
925 char *dw2_32_num
, *dw2_64_num
;
927 filename
= "i386-reg.tbl";
928 fp
= fopen (filename
, "r");
930 fail (_("can't find i386-reg.tbl for reading, errno = %s\n"),
933 fprintf (table
, "\n/* i386 register table. */\n\n");
934 fprintf (table
, "const reg_entry i386_regtab[] =\n{\n");
938 if (fgets (buf
, sizeof (buf
), fp
) == NULL
)
943 p
= remove_leading_whitespaces (buf
);
946 str
= strstr (p
, "//");
950 /* Remove trailing white spaces. */
951 remove_trailing_whitespaces (p
);
956 fprintf (table
, "%s\n", p
);
964 last
= p
+ strlen (p
);
967 reg_name
= next_field (p
, ',', &str
, last
);
970 reg_type
= next_field (str
, ',', &str
, last
);
972 /* Find reg_flags. */
973 reg_flags
= next_field (str
, ',', &str
, last
);
976 reg_num
= next_field (str
, ',', &str
, last
);
978 fprintf (table
, " { \"%s\",\n ", reg_name
);
980 process_i386_operand_type (table
, reg_type
, 0, "\t");
982 /* Find 32-bit Dwarf2 register number. */
983 dw2_32_num
= next_field (str
, ',', &str
, last
);
985 /* Find 64-bit Dwarf2 register number. */
986 dw2_64_num
= next_field (str
, ',', &str
, last
);
988 fprintf (table
, ",\n %s, %s, { %s, %s } },\n",
989 reg_flags
, reg_num
, dw2_32_num
, dw2_64_num
);
994 fprintf (table
, "};\n");
996 fprintf (table
, "\nconst unsigned int i386_regtab_size = ARRAY_SIZE (i386_regtab);\n");
1000 process_i386_initializers (void)
1003 FILE *fp
= fopen ("i386-init.h", "w");
1007 fail (_("can't create i386-init.h, errno = %s\n"),
1010 process_copyright (fp
);
1012 for (i
= 0; i
< ARRAY_SIZE (cpu_flag_init
); i
++)
1014 fprintf (fp
, "\n#define %s \\\n", cpu_flag_init
[i
].name
);
1015 init
= xstrdup (cpu_flag_init
[i
].init
);
1016 process_i386_cpu_flag (fp
, init
, 1, "", " ");
1020 for (i
= 0; i
< ARRAY_SIZE (operand_type_init
); i
++)
1022 fprintf (fp
, "\n\n#define %s \\\n ", operand_type_init
[i
].name
);
1023 init
= xstrdup (operand_type_init
[i
].init
);
1024 process_i386_operand_type (fp
, init
, 1, " ");
1032 /* Program options. */
1033 #define OPTION_SRCDIR 200
1035 struct option long_options
[] =
1037 {"srcdir", required_argument
, NULL
, OPTION_SRCDIR
},
1038 {"debug", no_argument
, NULL
, 'd'},
1039 {"version", no_argument
, NULL
, 'V'},
1040 {"help", no_argument
, NULL
, 'h'},
1041 {0, no_argument
, NULL
, 0}
1045 print_version (void)
1047 printf ("%s: version 1.0\n", program_name
);
1052 usage (FILE * stream
, int status
)
1054 fprintf (stream
, "Usage: %s [-V | --version] [-d | --debug] [--srcdir=dirname] [--help]\n",
1060 main (int argc
, char **argv
)
1062 extern int chdir (char *);
1063 char *srcdir
= NULL
;
1067 program_name
= *argv
;
1068 xmalloc_set_program_name (program_name
);
1070 while ((c
= getopt_long (argc
, argv
, "vVdh", long_options
, 0)) != EOF
)
1095 if (chdir (srcdir
) != 0)
1096 fail (_("unable to change directory to \"%s\", errno = %s\n"),
1097 srcdir
, xstrerror (errno
));
1099 /* Check the unused bitfield in i386_cpu_flags. */
1101 c
= CpuNumOfBits
- CpuMax
- 1;
1103 fail (_("%d unused bits in i386_cpu_flags.\n"), c
);
1106 /* Check the unused bitfield in i386_operand_type. */
1108 c
= OTNumOfBits
- OTMax
- 1;
1110 fail (_("%d unused bits in i386_operand_type.\n"), c
);
1113 qsort (cpu_flags
, ARRAY_SIZE (cpu_flags
), sizeof (cpu_flags
[0]),
1116 qsort (opcode_modifiers
, ARRAY_SIZE (opcode_modifiers
),
1117 sizeof (opcode_modifiers
[0]), compare
);
1119 qsort (operand_types
, ARRAY_SIZE (operand_types
),
1120 sizeof (operand_types
[0]), compare
);
1122 table
= fopen ("i386-tbl.h", "w");
1124 fail (_("can't create i386-tbl.h, errno = %s\n"),
1127 process_copyright (table
);
1129 process_i386_opcodes (table
);
1130 process_i386_registers (table
);
1131 process_i386_initializers ();