ChangeLog rotatation and copyright year update
[deliverable/binutils-gdb.git] / opcodes / i386-gen.c
CommitLineData
b90efa5b 1/* Copyright (C) 2007-2015 Free Software Foundation, Inc.
40b8e679 2
9b201bb5 3 This file is part of the GNU opcodes library.
40b8e679 4
9b201bb5 5 This library is free software; you can redistribute it and/or modify
40b8e679 6 it under the terms of the GNU General Public License as published by
9b201bb5
NC
7 the Free Software Foundation; either version 3, or (at your option)
8 any later version.
40b8e679 9
9b201bb5
NC
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.
40b8e679
L
14
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
9b201bb5
NC
17 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
18 MA 02110-1301, USA. */
40b8e679 19
40fb9820 20#include "sysdep.h"
40b8e679 21#include <stdio.h>
40b8e679
L
22#include <errno.h>
23#include "getopt.h"
24#include "libiberty.h"
c587b3f9 25#include "hashtab.h"
40b8e679
L
26#include "safe-ctype.h"
27
28#include "i386-opc.h"
29
30#include <libintl.h>
31#define _(String) gettext (String)
32
33static const char *program_name = NULL;
34static int debug = 0;
35
40fb9820
L
36typedef struct initializer
37{
38 const char *name;
39 const char *init;
40} initializer;
41
8acd5377 42static initializer cpu_flag_init[] =
40fb9820
L
43{
44 { "CPU_UNKNOWN_FLAGS",
7a9068fe 45 "~(CpuL1OM|CpuK1OM)" },
40fb9820
L
46 { "CPU_GENERIC32_FLAGS",
47 "Cpu186|Cpu286|Cpu386" },
29c048b6 48 { "CPU_GENERIC64_FLAGS",
da98bb4c 49 "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuClflush|Cpu387|Cpu687|CpuNop|CpuMMX|CpuSSE|CpuSSE2|CpuLM" },
40fb9820
L
50 { "CPU_NONE_FLAGS",
51 "0" },
52 { "CPU_I186_FLAGS",
53 "Cpu186" },
54 { "CPU_I286_FLAGS",
55 "Cpu186|Cpu286" },
56 { "CPU_I386_FLAGS",
57 "Cpu186|Cpu286|Cpu386" },
58 { "CPU_I486_FLAGS",
59 "Cpu186|Cpu286|Cpu386|Cpu486" },
60 { "CPU_I586_FLAGS",
309d3373 61 "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu387" },
40fb9820 62 { "CPU_I686_FLAGS",
309d3373 63 "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|Cpu387|Cpu687" },
22109423
L
64 { "CPU_PENTIUMPRO_FLAGS",
65 "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|Cpu387|Cpu687|CpuNop" },
40fb9820 66 { "CPU_P2_FLAGS",
22109423 67 "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|Cpu387|Cpu687|CpuNop|CpuMMX" },
40fb9820 68 { "CPU_P3_FLAGS",
22109423 69 "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|Cpu387|Cpu687|CpuNop|CpuMMX|CpuSSE" },
40fb9820 70 { "CPU_P4_FLAGS",
22109423 71 "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuClflush|Cpu387|Cpu687|CpuNop|CpuMMX|CpuSSE|CpuSSE2" },
40fb9820 72 { "CPU_NOCONA_FLAGS",
60aa667e 73 "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuClflush|Cpu387|Cpu687|CpuFISTTP|CpuNop|CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuLM|CpuCX16" },
40fb9820 74 { "CPU_CORE_FLAGS",
60aa667e 75 "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuClflush|Cpu387|Cpu687|CpuFISTTP|CpuNop|CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuCX16" },
40fb9820 76 { "CPU_CORE2_FLAGS",
60aa667e 77 "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuClflush|Cpu387|Cpu687|CpuFISTTP|CpuNop|CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuLM|CpuCX16" },
bd5295b2 78 { "CPU_COREI7_FLAGS",
60aa667e 79 "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuClflush|Cpu387|Cpu687|CpuFISTTP|CpuNop|CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuRdtscp|CpuLM|CpuCX16" },
40fb9820 80 { "CPU_K6_FLAGS",
309d3373 81 "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|CpuSYSCALL|Cpu387|CpuMMX" },
40fb9820 82 { "CPU_K6_2_FLAGS",
d56da83e 83 "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|CpuSYSCALL|Cpu387|CpuMMX|Cpu3dnow" },
40fb9820 84 { "CPU_ATHLON_FLAGS",
22109423 85 "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuSYSCALL|Cpu387|Cpu687|CpuNop|CpuMMX|Cpu3dnow|Cpu3dnowA" },
40fb9820 86 { "CPU_K8_FLAGS",
22109423 87 "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuSYSCALL|CpuRdtscp|Cpu387|Cpu687|CpuNop|CpuMMX|Cpu3dnow|Cpu3dnowA|CpuSSE|CpuSSE2|CpuLM" },
40fb9820 88 { "CPU_AMDFAM10_FLAGS",
22109423 89 "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuSYSCALL|CpuRdtscp|Cpu387|Cpu687|CpuFISTTP|CpuNop|CpuMMX|Cpu3dnow|Cpu3dnowA|CpuSSE|CpuSSE2|CpuSSE3|CpuSSE4a|CpuABM|CpuLM" },
68339fdf 90 { "CPU_BDVER1_FLAGS",
160a30bb 91 "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuSYSCALL|CpuRdtscp|Cpu387|Cpu687|CpuFISTTP|CpuNop|CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSE4a|CpuABM|CpuLM|CpuFMA4|CpuXOP|CpuLWP|CpuCX16|CpuClflush|CpuSSSE3|CpuSVME|CpuSSE4_1|CpuSSE4_2|CpuXsave|CpuAES|CpuAVX|CpuPCLMUL|CpuLZCNT|CpuPRFCHW" },
4cab4add 92 { "CPU_BDVER2_FLAGS",
160a30bb 93 "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuSYSCALL|CpuRdtscp|Cpu387|Cpu687|CpuFISTTP|CpuNop|CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSE4a|CpuABM|CpuLM|CpuFMA|CpuFMA4|CpuXOP|CpuLWP|CpuBMI|CpuTBM|CpuF16C|CpuCX16|CpuClflush|CpuSSSE3|CpuSVME|CpuSSE4_1|CpuSSE4_2|CpuXsave|CpuAES|CpuAVX|CpuPCLMUL|CpuLZCNT|CpuPRFCHW" },
5e5c50d3 94 { "CPU_BDVER3_FLAGS",
6091d651 95 "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuSYSCALL|CpuRdtscp|Cpu387|Cpu687|CpuFISTTP|CpuNop|CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSE4a|CpuABM|CpuLM|CpuFMA|CpuFMA4|CpuXOP|CpuLWP|CpuBMI|CpuTBM|CpuF16C|CpuCX16|CpuClflush|CpuSSSE3|CpuSVME|CpuSSE4_1|CpuSSE4_2|CpuAES|CpuAVX|CpuPCLMUL|CpuLZCNT|CpuPRFCHW|CpuXsave|CpuXsaveopt|CpuFSGSBase" },
c7b0bd56
SE
96 { "CPU_BDVER4_FLAGS",
97 "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuSYSCALL|CpuRdtscp|Cpu387|Cpu687|CpuFISTTP|CpuNop|CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSE4a|CpuABM|CpuLM|CpuFMA|CpuFMA4|CpuXOP|CpuLWP|CpuBMI|CpuTBM|CpuF16C|CpuCX16|CpuClflush|CpuSSSE3|CpuSVME|CpuSSE4_1|CpuSSE4_2|CpuAES|CpuAVX|CpuPCLMUL|CpuLZCNT|CpuPRFCHW|CpuXsave|CpuXsaveopt|CpuFSGSBase|CpuAVX2|CpuMovbe|CpuBMI2|CpuRdRnd" },
7b458c12 98 { "CPU_BTVER1_FLAGS",
160a30bb 99 "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuSYSCALL|CpuRdtscp|Cpu387|Cpu687|CpuNop|CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4a|CpuABM|CpuLM|CpuPRFCHW|CpuCX16|CpuClflush|CpuFISTTP|CpuSVME|CpuLZCNT" },
7b458c12 100 { "CPU_BTVER2_FLAGS",
160a30bb 101 "Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuSYSCALL|CpuRdtscp|Cpu387|Cpu687|CpuNop|CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4a|CpuSSE4_1|CpuSSE4_2|CpuABM|CpuLM|CpuBMI|CpuF16C|CpuAES|CpuPCLMUL|CpuAVX|CpuMovbe|CpuXsave|CpuXsaveopt|CpuPRFCHW|CpuCX16|CpuClflush|CpuFISTTP|CpuSVME|CpuLZCNT" },
309d3373
JB
102 { "CPU_8087_FLAGS",
103 "Cpu8087" },
104 { "CPU_287_FLAGS",
105 "Cpu287" },
106 { "CPU_387_FLAGS",
107 "Cpu387" },
108 { "CPU_ANY87_FLAGS",
109 "Cpu8087|Cpu287|Cpu387|Cpu687|CpuFISTTP" },
bd5295b2
L
110 { "CPU_CLFLUSH_FLAGS",
111 "CpuClflush" },
22109423
L
112 { "CPU_NOP_FLAGS",
113 "CpuNop" },
bd5295b2
L
114 { "CPU_SYSCALL_FLAGS",
115 "CpuSYSCALL" },
40fb9820
L
116 { "CPU_MMX_FLAGS",
117 "CpuMMX" },
118 { "CPU_SSE_FLAGS",
115c7c25 119 "CpuMMX|CpuSSE" },
40fb9820 120 { "CPU_SSE2_FLAGS",
115c7c25 121 "CpuMMX|CpuSSE|CpuSSE2" },
40fb9820 122 { "CPU_SSE3_FLAGS",
115c7c25 123 "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3" },
40fb9820 124 { "CPU_SSSE3_FLAGS",
115c7c25 125 "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3" },
40fb9820 126 { "CPU_SSE4_1_FLAGS",
115c7c25 127 "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1" },
40fb9820 128 { "CPU_SSE4_2_FLAGS",
115c7c25 129 "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2" },
309d3373 130 { "CPU_ANY_SSE_FLAGS",
43234a1e 131 "CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuSSE4a|CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512CD|CpuAVX512ER|CpuAVX512PF" },
6305a203
L
132 { "CPU_VMX_FLAGS",
133 "CpuVMX" },
134 { "CPU_SMX_FLAGS",
135 "CpuSMX" },
f03fe4c1
L
136 { "CPU_XSAVE_FLAGS",
137 "CpuXsave" },
c7b8aa3a
L
138 { "CPU_XSAVEOPT_FLAGS",
139 "CpuXsaveopt" },
c0f3af97
L
140 { "CPU_AES_FLAGS",
141 "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAES" },
594ab6a3
L
142 { "CPU_PCLMUL_FLAGS",
143 "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuPCLMUL" },
c0f3af97
L
144 { "CPU_FMA_FLAGS",
145 "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuFMA" },
922d8de8
DR
146 { "CPU_FMA4_FLAGS",
147 "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuFMA4" },
5dd85c99 148 { "CPU_XOP_FLAGS",
f0ae4a24 149 "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuSSE4a|CpuABM|CpuAVX|CpuFMA4|CpuXOP" },
f88c9eb0
SP
150 { "CPU_LWP_FLAGS",
151 "CpuLWP" },
f12dc422
L
152 { "CPU_BMI_FLAGS",
153 "CpuBMI" },
2a2a0f38
QN
154 { "CPU_TBM_FLAGS",
155 "CpuTBM" },
f1f8f695
L
156 { "CPU_MOVBE_FLAGS",
157 "CpuMovbe" },
60aa667e
L
158 { "CPU_CX16_FLAGS",
159 "CpuCX16" },
1b7f3fb0
L
160 { "CPU_RDTSCP_FLAGS",
161 "CpuRdtscp" },
f1f8f695
L
162 { "CPU_EPT_FLAGS",
163 "CpuEPT" },
c7b8aa3a
L
164 { "CPU_FSGSBASE_FLAGS",
165 "CpuFSGSBase" },
166 { "CPU_RDRND_FLAGS",
167 "CpuRdRnd" },
168 { "CPU_F16C_FLAGS",
169 "CpuF16C" },
6c30d220
L
170 { "CPU_BMI2_FLAGS",
171 "CpuBMI2" },
172 { "CPU_LZCNT_FLAGS",
173 "CpuLZCNT" },
42164a71
L
174 { "CPU_HLE_FLAGS",
175 "CpuHLE" },
176 { "CPU_RTM_FLAGS",
177 "CpuRTM" },
6c30d220
L
178 { "CPU_INVPCID_FLAGS",
179 "CpuINVPCID" },
8729a6f6
L
180 { "CPU_VMFUNC_FLAGS",
181 "CpuVMFUNC" },
40fb9820
L
182 { "CPU_3DNOW_FLAGS",
183 "CpuMMX|Cpu3dnow" },
184 { "CPU_3DNOWA_FLAGS",
115c7c25 185 "CpuMMX|Cpu3dnow|Cpu3dnowA" },
40fb9820
L
186 { "CPU_PADLOCK_FLAGS",
187 "CpuPadLock" },
188 { "CPU_SVME_FLAGS",
189 "CpuSVME" },
190 { "CPU_SSE4A_FLAGS",
115c7c25 191 "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSE4a" },
40fb9820 192 { "CPU_ABM_FLAGS",
3629bb00 193 "CpuABM" },
c0f3af97
L
194 { "CPU_AVX_FLAGS",
195 "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX" },
6c30d220
L
196 { "CPU_AVX2_FLAGS",
197 "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2" },
43234a1e
L
198 { "CPU_AVX512F_FLAGS",
199 "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2|CpuAVX512F" },
200 { "CPU_AVX512CD_FLAGS",
201 "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512CD" },
202 { "CPU_AVX512ER_FLAGS",
203 "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512ER" },
204 { "CPU_AVX512PF_FLAGS",
205 "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512PF" },
309d3373 206 { "CPU_ANY_AVX_FLAGS",
43234a1e 207 "CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512CD|CpuAVX512ER|CpuAVX512PF" },
8a9036a4
L
208 { "CPU_L1OM_FLAGS",
209 "unknown" },
7a9068fe
L
210 { "CPU_K1OM_FLAGS",
211 "unknown" },
e2e1fcde
L
212 { "CPU_ADX_FLAGS",
213 "CpuADX" },
214 { "CPU_RDSEED_FLAGS",
215 "CpuRdSeed" },
216 { "CPU_PRFCHW_FLAGS",
217 "CpuPRFCHW" },
5c111e37
L
218 { "CPU_SMAP_FLAGS",
219 "CpuSMAP" },
7e8b059b
L
220 { "CPU_MPX_FLAGS",
221 "CpuMPX" },
a0046408
L
222 { "CPU_SHA_FLAGS",
223 "CpuSHA" },
963f3586
IT
224 { "CPU_CLFLUSHOPT_FLAGS",
225 "CpuClflushOpt" },
226 { "CPU_XSAVES_FLAGS",
227 "CpuXSAVES" },
228 { "CPU_XSAVEC_FLAGS",
229 "CpuXSAVEC" },
dcf893b5
IT
230 { "CPU_PREFETCHWT1_FLAGS",
231 "CpuPREFETCHWT1" },
2cf200a4
IT
232 { "CPU_SE1_FLAGS",
233 "CpuSE1" },
90a915bf
IT
234 { "CPU_AVX512DQ_FLAGS",
235 "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512DQ" },
1ba585e8
IT
236 { "CPU_AVX512BW_FLAGS",
237 "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512BW" },
b28d1bda
IT
238 { "CPU_AVX512VL_FLAGS",
239 "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512VL" },
c5e7287a
IT
240 { "CPU_CLWB_FLAGS",
241 "CpuCLWB" },
9d8596f0
IT
242 { "CPU_PCOMMIT_FLAGS",
243 "CpuPCOMMIT" },
2cc1b5aa
IT
244 { "CPU_AVX512IFMA_FLAGS",
245 "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512IFMA" },
14f195c9
IT
246 { "CPU_AVX512VBMI_FLAGS",
247 "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512VBMI" },
40fb9820
L
248};
249
8acd5377 250static initializer operand_type_init[] =
40fb9820
L
251{
252 { "OPERAND_TYPE_NONE",
253 "0" },
254 { "OPERAND_TYPE_REG8",
255 "Reg8" },
256 { "OPERAND_TYPE_REG16",
257 "Reg16" },
258 { "OPERAND_TYPE_REG32",
259 "Reg32" },
260 { "OPERAND_TYPE_REG64",
261 "Reg64" },
262 { "OPERAND_TYPE_IMM1",
263 "Imm1" },
264 { "OPERAND_TYPE_IMM8",
265 "Imm8" },
266 { "OPERAND_TYPE_IMM8S",
267 "Imm8S" },
268 { "OPERAND_TYPE_IMM16",
269 "Imm16" },
270 { "OPERAND_TYPE_IMM32",
271 "Imm32" },
272 { "OPERAND_TYPE_IMM32S",
273 "Imm32S" },
274 { "OPERAND_TYPE_IMM64",
275 "Imm64" },
276 { "OPERAND_TYPE_BASEINDEX",
277 "BaseIndex" },
278 { "OPERAND_TYPE_DISP8",
279 "Disp8" },
280 { "OPERAND_TYPE_DISP16",
281 "Disp16" },
282 { "OPERAND_TYPE_DISP32",
283 "Disp32" },
284 { "OPERAND_TYPE_DISP32S",
285 "Disp32S" },
286 { "OPERAND_TYPE_DISP64",
287 "Disp64" },
288 { "OPERAND_TYPE_INOUTPORTREG",
289 "InOutPortReg" },
290 { "OPERAND_TYPE_SHIFTCOUNT",
291 "ShiftCount" },
292 { "OPERAND_TYPE_CONTROL",
293 "Control" },
294 { "OPERAND_TYPE_TEST",
295 "Test" },
296 { "OPERAND_TYPE_DEBUG",
297 "FloatReg" },
298 { "OPERAND_TYPE_FLOATREG",
299 "FloatReg" },
300 { "OPERAND_TYPE_FLOATACC",
301 "FloatAcc" },
302 { "OPERAND_TYPE_SREG2",
303 "SReg2" },
304 { "OPERAND_TYPE_SREG3",
305 "SReg3" },
306 { "OPERAND_TYPE_ACC",
307 "Acc" },
308 { "OPERAND_TYPE_JUMPABSOLUTE",
309 "JumpAbsolute" },
310 { "OPERAND_TYPE_REGMMX",
311 "RegMMX" },
312 { "OPERAND_TYPE_REGXMM",
313 "RegXMM" },
c0f3af97
L
314 { "OPERAND_TYPE_REGYMM",
315 "RegYMM" },
43234a1e
L
316 { "OPERAND_TYPE_REGZMM",
317 "RegZMM" },
318 { "OPERAND_TYPE_REGMASK",
319 "RegMask" },
40fb9820
L
320 { "OPERAND_TYPE_ESSEG",
321 "EsSeg" },
322 { "OPERAND_TYPE_ACC32",
7d5e4556 323 "Reg32|Acc|Dword" },
40fb9820 324 { "OPERAND_TYPE_ACC64",
7d5e4556 325 "Reg64|Acc|Qword" },
65da13b5
L
326 { "OPERAND_TYPE_INOUTPORTREG",
327 "InOutPortReg" },
40fb9820
L
328 { "OPERAND_TYPE_REG16_INOUTPORTREG",
329 "Reg16|InOutPortReg" },
330 { "OPERAND_TYPE_DISP16_32",
331 "Disp16|Disp32" },
332 { "OPERAND_TYPE_ANYDISP",
333 "Disp8|Disp16|Disp32|Disp32S|Disp64" },
334 { "OPERAND_TYPE_IMM16_32",
335 "Imm16|Imm32" },
336 { "OPERAND_TYPE_IMM16_32S",
337 "Imm16|Imm32S" },
338 { "OPERAND_TYPE_IMM16_32_32S",
339 "Imm16|Imm32|Imm32S" },
2f81ff92
L
340 { "OPERAND_TYPE_IMM32_64",
341 "Imm32|Imm64" },
40fb9820
L
342 { "OPERAND_TYPE_IMM32_32S_DISP32",
343 "Imm32|Imm32S|Disp32" },
344 { "OPERAND_TYPE_IMM64_DISP64",
345 "Imm64|Disp64" },
346 { "OPERAND_TYPE_IMM32_32S_64_DISP32",
347 "Imm32|Imm32S|Imm64|Disp32" },
348 { "OPERAND_TYPE_IMM32_32S_64_DISP32_64",
349 "Imm32|Imm32S|Imm64|Disp32|Disp64" },
a683cc34
SP
350 { "OPERAND_TYPE_VEC_IMM4",
351 "Vec_Imm4" },
7e8b059b
L
352 { "OPERAND_TYPE_REGBND",
353 "RegBND" },
43234a1e
L
354 { "OPERAND_TYPE_VEC_DISP8",
355 "Vec_Disp8" },
40fb9820
L
356};
357
358typedef struct bitfield
359{
360 int position;
361 int value;
362 const char *name;
363} bitfield;
364
365#define BITFIELD(n) { n, 0, #n }
366
367static bitfield cpu_flags[] =
368{
369 BITFIELD (Cpu186),
370 BITFIELD (Cpu286),
371 BITFIELD (Cpu386),
372 BITFIELD (Cpu486),
373 BITFIELD (Cpu586),
374 BITFIELD (Cpu686),
bd5295b2 375 BITFIELD (CpuClflush),
22109423 376 BITFIELD (CpuNop),
bd5295b2 377 BITFIELD (CpuSYSCALL),
309d3373
JB
378 BITFIELD (Cpu8087),
379 BITFIELD (Cpu287),
380 BITFIELD (Cpu387),
381 BITFIELD (Cpu687),
382 BITFIELD (CpuFISTTP),
40fb9820 383 BITFIELD (CpuMMX),
40fb9820
L
384 BITFIELD (CpuSSE),
385 BITFIELD (CpuSSE2),
386 BITFIELD (CpuSSE3),
387 BITFIELD (CpuSSSE3),
388 BITFIELD (CpuSSE4_1),
389 BITFIELD (CpuSSE4_2),
c0f3af97 390 BITFIELD (CpuAVX),
6c30d220 391 BITFIELD (CpuAVX2),
43234a1e
L
392 BITFIELD (CpuAVX512F),
393 BITFIELD (CpuAVX512CD),
394 BITFIELD (CpuAVX512ER),
395 BITFIELD (CpuAVX512PF),
b28d1bda 396 BITFIELD (CpuAVX512VL),
90a915bf 397 BITFIELD (CpuAVX512DQ),
1ba585e8 398 BITFIELD (CpuAVX512BW),
8a9036a4 399 BITFIELD (CpuL1OM),
7a9068fe 400 BITFIELD (CpuK1OM),
40fb9820
L
401 BITFIELD (CpuSSE4a),
402 BITFIELD (Cpu3dnow),
403 BITFIELD (Cpu3dnowA),
404 BITFIELD (CpuPadLock),
405 BITFIELD (CpuSVME),
406 BITFIELD (CpuVMX),
47dd174c 407 BITFIELD (CpuSMX),
40fb9820 408 BITFIELD (CpuABM),
475a2301 409 BITFIELD (CpuXsave),
c7b8aa3a 410 BITFIELD (CpuXsaveopt),
c0f3af97 411 BITFIELD (CpuAES),
594ab6a3 412 BITFIELD (CpuPCLMUL),
c0f3af97 413 BITFIELD (CpuFMA),
f88c9eb0 414 BITFIELD (CpuFMA4),
5dd85c99 415 BITFIELD (CpuXOP),
f88c9eb0 416 BITFIELD (CpuLWP),
f12dc422 417 BITFIELD (CpuBMI),
2a2a0f38 418 BITFIELD (CpuTBM),
c0f3af97 419 BITFIELD (CpuLM),
f1f8f695 420 BITFIELD (CpuMovbe),
60aa667e 421 BITFIELD (CpuCX16),
f1f8f695 422 BITFIELD (CpuEPT),
1b7f3fb0 423 BITFIELD (CpuRdtscp),
c7b8aa3a
L
424 BITFIELD (CpuFSGSBase),
425 BITFIELD (CpuRdRnd),
426 BITFIELD (CpuF16C),
6c30d220
L
427 BITFIELD (CpuBMI2),
428 BITFIELD (CpuLZCNT),
42164a71
L
429 BITFIELD (CpuHLE),
430 BITFIELD (CpuRTM),
6c30d220 431 BITFIELD (CpuINVPCID),
8729a6f6 432 BITFIELD (CpuVMFUNC),
e2e1fcde
L
433 BITFIELD (CpuRDSEED),
434 BITFIELD (CpuADX),
435 BITFIELD (CpuPRFCHW),
5c111e37 436 BITFIELD (CpuSMAP),
a0046408 437 BITFIELD (CpuSHA),
43234a1e 438 BITFIELD (CpuVREX),
963f3586
IT
439 BITFIELD (CpuClflushOpt),
440 BITFIELD (CpuXSAVES),
441 BITFIELD (CpuXSAVEC),
dcf893b5 442 BITFIELD (CpuPREFETCHWT1),
2cf200a4 443 BITFIELD (CpuSE1),
c5e7287a 444 BITFIELD (CpuCLWB),
9d8596f0 445 BITFIELD (CpuPCOMMIT),
40fb9820
L
446 BITFIELD (Cpu64),
447 BITFIELD (CpuNo64),
7e8b059b 448 BITFIELD (CpuMPX),
2cc1b5aa 449 BITFIELD (CpuAVX512IFMA),
14f195c9 450 BITFIELD (CpuAVX512VBMI),
40fb9820
L
451#ifdef CpuUnused
452 BITFIELD (CpuUnused),
453#endif
454};
455
456static bitfield opcode_modifiers[] =
457{
458 BITFIELD (D),
459 BITFIELD (W),
b6169b20 460 BITFIELD (S),
40fb9820
L
461 BITFIELD (Modrm),
462 BITFIELD (ShortForm),
463 BITFIELD (Jump),
464 BITFIELD (JumpDword),
465 BITFIELD (JumpByte),
466 BITFIELD (JumpInterSegment),
467 BITFIELD (FloatMF),
468 BITFIELD (FloatR),
469 BITFIELD (FloatD),
470 BITFIELD (Size16),
471 BITFIELD (Size32),
472 BITFIELD (Size64),
56ffb741 473 BITFIELD (CheckRegSize),
40fb9820
L
474 BITFIELD (IgnoreSize),
475 BITFIELD (DefaultSize),
476 BITFIELD (No_bSuf),
477 BITFIELD (No_wSuf),
478 BITFIELD (No_lSuf),
479 BITFIELD (No_sSuf),
480 BITFIELD (No_qSuf),
7ce189b3 481 BITFIELD (No_ldSuf),
40fb9820
L
482 BITFIELD (FWait),
483 BITFIELD (IsString),
7e8b059b 484 BITFIELD (BNDPrefixOk),
c32fa91d 485 BITFIELD (IsLockable),
40fb9820 486 BITFIELD (RegKludge),
e2ec9d29 487 BITFIELD (FirstXmm0),
c0f3af97 488 BITFIELD (Implicit1stXmm0),
29c048b6 489 BITFIELD (RepPrefixOk),
42164a71 490 BITFIELD (HLEPrefixOk),
ca61edf2
L
491 BITFIELD (ToDword),
492 BITFIELD (ToQword),
493 BITFIELD (AddrPrefixOp0),
40fb9820
L
494 BITFIELD (IsPrefix),
495 BITFIELD (ImmExt),
496 BITFIELD (NoRex64),
497 BITFIELD (Rex64),
498 BITFIELD (Ugh),
c0f3af97 499 BITFIELD (Vex),
2426c15f 500 BITFIELD (VexVVVV),
1ef99a7b 501 BITFIELD (VexW),
7f399153 502 BITFIELD (VexOpcode),
8cd7925b 503 BITFIELD (VexSources),
c0f3af97 504 BITFIELD (VexImmExt),
6c30d220 505 BITFIELD (VecSIB),
c0f3af97 506 BITFIELD (SSE2AVX),
81f8a913 507 BITFIELD (NoAVX),
43234a1e
L
508 BITFIELD (EVex),
509 BITFIELD (Masking),
510 BITFIELD (VecESize),
511 BITFIELD (Broadcast),
512 BITFIELD (StaticRounding),
513 BITFIELD (SAE),
514 BITFIELD (Disp8MemShift),
515 BITFIELD (NoDefMask),
1efbbeb4
L
516 BITFIELD (OldGcc),
517 BITFIELD (ATTMnemonic),
e1d4d893 518 BITFIELD (ATTSyntax),
5c07affc 519 BITFIELD (IntelSyntax),
40fb9820
L
520};
521
522static bitfield operand_types[] =
523{
524 BITFIELD (Reg8),
525 BITFIELD (Reg16),
526 BITFIELD (Reg32),
527 BITFIELD (Reg64),
528 BITFIELD (FloatReg),
529 BITFIELD (RegMMX),
530 BITFIELD (RegXMM),
c0f3af97 531 BITFIELD (RegYMM),
43234a1e
L
532 BITFIELD (RegZMM),
533 BITFIELD (RegMask),
94ff3a50 534 BITFIELD (Imm1),
40fb9820
L
535 BITFIELD (Imm8),
536 BITFIELD (Imm8S),
537 BITFIELD (Imm16),
538 BITFIELD (Imm32),
539 BITFIELD (Imm32S),
540 BITFIELD (Imm64),
40fb9820
L
541 BITFIELD (BaseIndex),
542 BITFIELD (Disp8),
543 BITFIELD (Disp16),
544 BITFIELD (Disp32),
545 BITFIELD (Disp32S),
546 BITFIELD (Disp64),
547 BITFIELD (InOutPortReg),
548 BITFIELD (ShiftCount),
549 BITFIELD (Control),
550 BITFIELD (Debug),
551 BITFIELD (Test),
552 BITFIELD (SReg2),
553 BITFIELD (SReg3),
554 BITFIELD (Acc),
555 BITFIELD (FloatAcc),
556 BITFIELD (JumpAbsolute),
557 BITFIELD (EsSeg),
558 BITFIELD (RegMem),
5c07affc 559 BITFIELD (Mem),
7d5e4556
L
560 BITFIELD (Byte),
561 BITFIELD (Word),
562 BITFIELD (Dword),
563 BITFIELD (Fword),
564 BITFIELD (Qword),
565 BITFIELD (Tbyte),
566 BITFIELD (Xmmword),
c0f3af97 567 BITFIELD (Ymmword),
43234a1e 568 BITFIELD (Zmmword),
7d5e4556
L
569 BITFIELD (Unspecified),
570 BITFIELD (Anysize),
a683cc34 571 BITFIELD (Vec_Imm4),
7e8b059b 572 BITFIELD (RegBND),
43234a1e 573 BITFIELD (Vec_Disp8),
40fb9820
L
574#ifdef OTUnused
575 BITFIELD (OTUnused),
576#endif
577};
578
3d4d5afa
L
579static const char *filename;
580
40fb9820
L
581static int
582compare (const void *x, const void *y)
583{
584 const bitfield *xp = (const bitfield *) x;
585 const bitfield *yp = (const bitfield *) y;
586 return xp->position - yp->position;
587}
588
40b8e679
L
589static void
590fail (const char *message, ...)
591{
592 va_list args;
29c048b6 593
40b8e679
L
594 va_start (args, message);
595 fprintf (stderr, _("%s: Error: "), program_name);
596 vfprintf (stderr, message, args);
597 va_end (args);
598 xexit (1);
599}
600
72ffa0fb
L
601static void
602process_copyright (FILE *fp)
603{
604 fprintf (fp, "/* This file is automatically generated by i386-gen. Do not edit! */\n\
b90efa5b 605/* Copyright (C) 2007-2015 Free Software Foundation, Inc.\n\
72ffa0fb
L
606\n\
607 This file is part of the GNU opcodes library.\n\
608\n\
609 This library is free software; you can redistribute it and/or modify\n\
610 it under the terms of the GNU General Public License as published by\n\
611 the Free Software Foundation; either version 3, or (at your option)\n\
612 any later version.\n\
613\n\
614 It is distributed in the hope that it will be useful, but WITHOUT\n\
615 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n\
616 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public\n\
617 License for more details.\n\
618\n\
619 You should have received a copy of the GNU General Public License\n\
620 along with this program; if not, write to the Free Software\n\
621 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,\n\
622 MA 02110-1301, USA. */\n");
623}
624
40b8e679
L
625/* Remove leading white spaces. */
626
627static char *
628remove_leading_whitespaces (char *str)
629{
630 while (ISSPACE (*str))
631 str++;
632 return str;
633}
634
635/* Remove trailing white spaces. */
636
637static void
638remove_trailing_whitespaces (char *str)
639{
640 size_t last = strlen (str);
641
642 if (last == 0)
643 return;
644
645 do
646 {
647 last--;
648 if (ISSPACE (str [last]))
649 str[last] = '\0';
650 else
651 break;
652 }
653 while (last != 0);
654}
655
93b1ec2c 656/* Find next field separated by SEP and terminate it. Return a
40b8e679
L
657 pointer to the one after it. */
658
659static char *
c587b3f9 660next_field (char *str, char sep, char **next, char *last)
40b8e679
L
661{
662 char *p;
663
664 p = remove_leading_whitespaces (str);
93b1ec2c 665 for (str = p; *str != sep && *str != '\0'; str++);
40b8e679
L
666
667 *str = '\0';
668 remove_trailing_whitespaces (p);
669
29c048b6 670 *next = str + 1;
40b8e679 671
c587b3f9
L
672 if (p >= last)
673 abort ();
674
40b8e679
L
675 return p;
676}
677
40fb9820 678static void
8a9036a4
L
679set_bitfield (const char *f, bitfield *array, int value,
680 unsigned int size, int lineno)
40fb9820
L
681{
682 unsigned int i;
683
309d3373
JB
684 if (strcmp (f, "CpuFP") == 0)
685 {
8a9036a4
L
686 set_bitfield("Cpu387", array, value, size, lineno);
687 set_bitfield("Cpu287", array, value, size, lineno);
309d3373
JB
688 f = "Cpu8087";
689 }
690 else if (strcmp (f, "Mmword") == 0)
7d5e4556
L
691 f= "Qword";
692 else if (strcmp (f, "Oword") == 0)
693 f= "Xmmword";
40fb9820
L
694
695 for (i = 0; i < size; i++)
696 if (strcasecmp (array[i].name, f) == 0)
697 {
8a9036a4 698 array[i].value = value;
40fb9820
L
699 return;
700 }
701
2bf05e57
L
702 if (value)
703 {
704 const char *v = strchr (f, '=');
705
706 if (v)
707 {
708 size_t n = v - f;
709 char *end;
710
711 for (i = 0; i < size; i++)
712 if (strncasecmp (array[i].name, f, n) == 0)
713 {
714 value = strtol (v + 1, &end, 0);
715 if (*end == '\0')
716 {
717 array[i].value = value;
718 return;
719 }
720 break;
721 }
722 }
723 }
724
bd5295b2
L
725 if (lineno != -1)
726 fail (_("%s: %d: Unknown bitfield: %s\n"), filename, lineno, f);
727 else
728 fail (_("Unknown bitfield: %s\n"), f);
40fb9820
L
729}
730
731static void
732output_cpu_flags (FILE *table, bitfield *flags, unsigned int size,
733 int macro, const char *comma, const char *indent)
734{
735 unsigned int i;
736
737 fprintf (table, "%s{ { ", indent);
738
739 for (i = 0; i < size - 1; i++)
740 {
10632b79
L
741 if (((i + 1) % 20) != 0)
742 fprintf (table, "%d, ", flags[i].value);
743 else
744 fprintf (table, "%d,", flags[i].value);
40fb9820
L
745 if (((i + 1) % 20) == 0)
746 {
747 /* We need \\ for macro. */
748 if (macro)
749 fprintf (table, " \\\n %s", indent);
750 else
751 fprintf (table, "\n %s", indent);
752 }
753 }
754
755 fprintf (table, "%d } }%s\n", flags[i].value, comma);
756}
757
758static void
759process_i386_cpu_flag (FILE *table, char *flag, int macro,
bd5295b2
L
760 const char *comma, const char *indent,
761 int lineno)
40fb9820
L
762{
763 char *str, *next, *last;
8a9036a4 764 unsigned int i;
40fb9820
L
765 bitfield flags [ARRAY_SIZE (cpu_flags)];
766
767 /* Copy the default cpu flags. */
768 memcpy (flags, cpu_flags, sizeof (cpu_flags));
769
770 if (strcasecmp (flag, "unknown") == 0)
771 {
40fb9820 772 /* We turn on everything except for cpu64 in case of
8a9036a4
L
773 CPU_UNKNOWN_FLAGS. */
774 for (i = 0; i < ARRAY_SIZE (flags); i++)
775 if (flags[i].position != Cpu64)
776 flags[i].value = 1;
777 }
778 else if (flag[0] == '~')
779 {
780 last = flag + strlen (flag);
781
782 if (flag[1] == '(')
783 {
784 last -= 1;
785 next = flag + 2;
786 if (*last != ')')
787 fail (_("%s: %d: Missing `)' in bitfield: %s\n"), filename,
788 lineno, flag);
789 *last = '\0';
790 }
791 else
792 next = flag + 1;
793
794 /* First we turn on everything except for cpu64. */
40fb9820
L
795 for (i = 0; i < ARRAY_SIZE (flags); i++)
796 if (flags[i].position != Cpu64)
797 flags[i].value = 1;
8a9036a4
L
798
799 /* Turn off selective bits. */
800 for (; next && next < last; )
801 {
802 str = next_field (next, '|', &next, last);
803 if (str)
804 set_bitfield (str, flags, 0, ARRAY_SIZE (flags), lineno);
805 }
40fb9820
L
806 }
807 else if (strcmp (flag, "0"))
808 {
8a9036a4 809 /* Turn on selective bits. */
40fb9820
L
810 last = flag + strlen (flag);
811 for (next = flag; next && next < last; )
812 {
c587b3f9 813 str = next_field (next, '|', &next, last);
40fb9820 814 if (str)
8a9036a4 815 set_bitfield (str, flags, 1, ARRAY_SIZE (flags), lineno);
40fb9820
L
816 }
817 }
818
819 output_cpu_flags (table, flags, ARRAY_SIZE (flags), macro,
820 comma, indent);
821}
822
823static void
824output_opcode_modifier (FILE *table, bitfield *modifier, unsigned int size)
825{
826 unsigned int i;
827
828 fprintf (table, " { ");
829
830 for (i = 0; i < size - 1; i++)
831 {
10632b79
L
832 if (((i + 1) % 20) != 0)
833 fprintf (table, "%d, ", modifier[i].value);
834 else
835 fprintf (table, "%d,", modifier[i].value);
40fb9820
L
836 if (((i + 1) % 20) == 0)
837 fprintf (table, "\n ");
838 }
839
840 fprintf (table, "%d },\n", modifier[i].value);
841}
842
843static void
bd5295b2 844process_i386_opcode_modifier (FILE *table, char *mod, int lineno)
40fb9820
L
845{
846 char *str, *next, *last;
847 bitfield modifiers [ARRAY_SIZE (opcode_modifiers)];
848
849 /* Copy the default opcode modifier. */
850 memcpy (modifiers, opcode_modifiers, sizeof (modifiers));
851
852 if (strcmp (mod, "0"))
853 {
854 last = mod + strlen (mod);
855 for (next = mod; next && next < last; )
856 {
c587b3f9 857 str = next_field (next, '|', &next, last);
40fb9820 858 if (str)
8a9036a4
L
859 set_bitfield (str, modifiers, 1, ARRAY_SIZE (modifiers),
860 lineno);
40fb9820
L
861 }
862 }
863 output_opcode_modifier (table, modifiers, ARRAY_SIZE (modifiers));
864}
865
866static void
867output_operand_type (FILE *table, bitfield *types, unsigned int size,
868 int macro, const char *indent)
869{
870 unsigned int i;
871
872 fprintf (table, "{ { ");
873
874 for (i = 0; i < size - 1; i++)
875 {
10632b79
L
876 if (((i + 1) % 20) != 0)
877 fprintf (table, "%d, ", types[i].value);
878 else
879 fprintf (table, "%d,", types[i].value);
40fb9820
L
880 if (((i + 1) % 20) == 0)
881 {
882 /* We need \\ for macro. */
883 if (macro)
10632b79 884 fprintf (table, " \\\n%s", indent);
40fb9820
L
885 else
886 fprintf (table, "\n%s", indent);
887 }
888 }
889
890 fprintf (table, "%d } }", types[i].value);
891}
892
893static void
894process_i386_operand_type (FILE *table, char *op, int macro,
bd5295b2 895 const char *indent, int lineno)
40fb9820
L
896{
897 char *str, *next, *last;
898 bitfield types [ARRAY_SIZE (operand_types)];
899
900 /* Copy the default operand type. */
901 memcpy (types, operand_types, sizeof (types));
902
903 if (strcmp (op, "0"))
904 {
905 last = op + strlen (op);
906 for (next = op; next && next < last; )
907 {
c587b3f9 908 str = next_field (next, '|', &next, last);
40fb9820 909 if (str)
8a9036a4 910 set_bitfield (str, types, 1, ARRAY_SIZE (types), lineno);
40fb9820
L
911 }
912 }
913 output_operand_type (table, types, ARRAY_SIZE (types), macro,
914 indent);
915}
916
c587b3f9
L
917static void
918output_i386_opcode (FILE *table, const char *name, char *str,
bd5295b2 919 char *last, int lineno)
c587b3f9
L
920{
921 unsigned int i;
922 char *operands, *base_opcode, *extension_opcode, *opcode_length;
923 char *cpu_flags, *opcode_modifier, *operand_types [MAX_OPERANDS];
924
925 /* Find number of operands. */
926 operands = next_field (str, ',', &str, last);
927
928 /* Find base_opcode. */
929 base_opcode = next_field (str, ',', &str, last);
930
931 /* Find extension_opcode. */
932 extension_opcode = next_field (str, ',', &str, last);
933
934 /* Find opcode_length. */
935 opcode_length = next_field (str, ',', &str, last);
936
937 /* Find cpu_flags. */
938 cpu_flags = next_field (str, ',', &str, last);
939
940 /* Find opcode_modifier. */
941 opcode_modifier = next_field (str, ',', &str, last);
942
943 /* Remove the first {. */
944 str = remove_leading_whitespaces (str);
945 if (*str != '{')
946 abort ();
947 str = remove_leading_whitespaces (str + 1);
948
949 i = strlen (str);
950
951 /* There are at least "X}". */
952 if (i < 2)
953 abort ();
954
955 /* Remove trailing white spaces and }. */
956 do
957 {
958 i--;
959 if (ISSPACE (str[i]) || str[i] == '}')
960 str[i] = '\0';
961 else
962 break;
963 }
964 while (i != 0);
965
966 last = str + i;
967
968 /* Find operand_types. */
969 for (i = 0; i < ARRAY_SIZE (operand_types); i++)
970 {
971 if (str >= last)
972 {
973 operand_types [i] = NULL;
974 break;
975 }
976
977 operand_types [i] = next_field (str, ',', &str, last);
978 if (*operand_types[i] == '0')
979 {
980 if (i != 0)
981 operand_types[i] = NULL;
982 break;
983 }
984 }
985
986 fprintf (table, " { \"%s\", %s, %s, %s, %s,\n",
987 name, operands, base_opcode, extension_opcode,
988 opcode_length);
989
bd5295b2 990 process_i386_cpu_flag (table, cpu_flags, 0, ",", " ", lineno);
c587b3f9 991
bd5295b2 992 process_i386_opcode_modifier (table, opcode_modifier, lineno);
c587b3f9
L
993
994 fprintf (table, " { ");
995
996 for (i = 0; i < ARRAY_SIZE (operand_types); i++)
997 {
998 if (operand_types[i] == NULL || *operand_types[i] == '0')
999 {
1000 if (i == 0)
bd5295b2 1001 process_i386_operand_type (table, "0", 0, "\t ", lineno);
c587b3f9
L
1002 break;
1003 }
1004
1005 if (i != 0)
1006 fprintf (table, ",\n ");
1007
1008 process_i386_operand_type (table, operand_types[i], 0,
bd5295b2 1009 "\t ", lineno);
c587b3f9
L
1010 }
1011 fprintf (table, " } },\n");
1012}
1013
1014struct opcode_hash_entry
1015{
1016 struct opcode_hash_entry *next;
1017 char *name;
1018 char *opcode;
bd5295b2 1019 int lineno;
c587b3f9
L
1020};
1021
1022/* Calculate the hash value of an opcode hash entry P. */
1023
1024static hashval_t
1025opcode_hash_hash (const void *p)
1026{
1027 struct opcode_hash_entry *entry = (struct opcode_hash_entry *) p;
1028 return htab_hash_string (entry->name);
1029}
1030
1031/* Compare a string Q against an opcode hash entry P. */
1032
1033static int
1034opcode_hash_eq (const void *p, const void *q)
1035{
1036 struct opcode_hash_entry *entry = (struct opcode_hash_entry *) p;
1037 const char *name = (const char *) q;
1038 return strcmp (name, entry->name) == 0;
1039}
1040
40b8e679 1041static void
72ffa0fb 1042process_i386_opcodes (FILE *table)
40b8e679 1043{
3d4d5afa 1044 FILE *fp;
40b8e679 1045 char buf[2048];
c587b3f9
L
1046 unsigned int i, j;
1047 char *str, *p, *last, *name;
1048 struct opcode_hash_entry **hash_slot, **entry, *next;
1049 htab_t opcode_hash_table;
1050 struct opcode_hash_entry **opcode_array;
1051 unsigned int opcode_array_size = 1024;
bd5295b2 1052 int lineno = 0;
40b8e679 1053
3d4d5afa
L
1054 filename = "i386-opc.tbl";
1055 fp = fopen (filename, "r");
1056
40b8e679 1057 if (fp == NULL)
34edb9ad 1058 fail (_("can't find i386-opc.tbl for reading, errno = %s\n"),
40fb9820 1059 xstrerror (errno));
40b8e679 1060
c587b3f9
L
1061 i = 0;
1062 opcode_array = (struct opcode_hash_entry **)
1063 xmalloc (sizeof (*opcode_array) * opcode_array_size);
1064
1065 opcode_hash_table = htab_create_alloc (16, opcode_hash_hash,
1066 opcode_hash_eq, NULL,
1067 xcalloc, free);
1068
34edb9ad 1069 fprintf (table, "\n/* i386 opcode table. */\n\n");
d3ce72d0 1070 fprintf (table, "const insn_template i386_optab[] =\n{\n");
40b8e679 1071
c587b3f9 1072 /* Put everything on opcode array. */
40b8e679
L
1073 while (!feof (fp))
1074 {
1075 if (fgets (buf, sizeof (buf), fp) == NULL)
1076 break;
1077
3d4d5afa
L
1078 lineno++;
1079
40b8e679
L
1080 p = remove_leading_whitespaces (buf);
1081
1082 /* Skip comments. */
1083 str = strstr (p, "//");
1084 if (str != NULL)
1085 str[0] = '\0';
1086
1087 /* Remove trailing white spaces. */
1088 remove_trailing_whitespaces (p);
1089
1090 switch (p[0])
1091 {
1092 case '#':
c587b3f9 1093 /* Ignore comments. */
40b8e679
L
1094 case '\0':
1095 continue;
1096 break;
1097 default:
1098 break;
1099 }
1100
1101 last = p + strlen (p);
1102
1103 /* Find name. */
c587b3f9 1104 name = next_field (p, ',', &str, last);
40b8e679 1105
c587b3f9
L
1106 /* Get the slot in hash table. */
1107 hash_slot = (struct opcode_hash_entry **)
1108 htab_find_slot_with_hash (opcode_hash_table, name,
1109 htab_hash_string (name),
1110 INSERT);
40b8e679 1111
c587b3f9 1112 if (*hash_slot == NULL)
40b8e679 1113 {
c587b3f9
L
1114 /* It is the new one. Put it on opcode array. */
1115 if (i >= opcode_array_size)
40b8e679 1116 {
c587b3f9
L
1117 /* Grow the opcode array when needed. */
1118 opcode_array_size += 1024;
1119 opcode_array = (struct opcode_hash_entry **)
1120 xrealloc (opcode_array,
1121 sizeof (*opcode_array) * opcode_array_size);
40b8e679
L
1122 }
1123
c587b3f9
L
1124 opcode_array[i] = (struct opcode_hash_entry *)
1125 xmalloc (sizeof (struct opcode_hash_entry));
1126 opcode_array[i]->next = NULL;
1127 opcode_array[i]->name = xstrdup (name);
1128 opcode_array[i]->opcode = xstrdup (str);
bd5295b2 1129 opcode_array[i]->lineno = lineno;
c587b3f9
L
1130 *hash_slot = opcode_array[i];
1131 i++;
40b8e679 1132 }
c587b3f9 1133 else
40b8e679 1134 {
c587b3f9
L
1135 /* Append it to the existing one. */
1136 entry = hash_slot;
1137 while ((*entry) != NULL)
1138 entry = &(*entry)->next;
1139 *entry = (struct opcode_hash_entry *)
1140 xmalloc (sizeof (struct opcode_hash_entry));
1141 (*entry)->next = NULL;
1142 (*entry)->name = (*hash_slot)->name;
1143 (*entry)->opcode = xstrdup (str);
bd5295b2 1144 (*entry)->lineno = lineno;
c587b3f9
L
1145 }
1146 }
40b8e679 1147
c587b3f9
L
1148 /* Process opcode array. */
1149 for (j = 0; j < i; j++)
1150 {
1151 for (next = opcode_array[j]; next; next = next->next)
1152 {
1153 name = next->name;
1154 str = next->opcode;
bd5295b2 1155 lineno = next->lineno;
c587b3f9 1156 last = str + strlen (str);
bd5295b2 1157 output_i386_opcode (table, name, str, last, lineno);
40b8e679 1158 }
40b8e679
L
1159 }
1160
34edb9ad
L
1161 fclose (fp);
1162
4dffcebc 1163 fprintf (table, " { NULL, 0, 0, 0, 0,\n");
40fb9820 1164
bd5295b2 1165 process_i386_cpu_flag (table, "0", 0, ",", " ", -1);
40fb9820 1166
bd5295b2 1167 process_i386_opcode_modifier (table, "0", -1);
29c048b6 1168
40fb9820 1169 fprintf (table, " { ");
bd5295b2 1170 process_i386_operand_type (table, "0", 0, "\t ", -1);
40fb9820
L
1171 fprintf (table, " } }\n");
1172
34edb9ad 1173 fprintf (table, "};\n");
40b8e679
L
1174}
1175
1176static void
72ffa0fb 1177process_i386_registers (FILE *table)
40b8e679 1178{
3d4d5afa 1179 FILE *fp;
40b8e679
L
1180 char buf[2048];
1181 char *str, *p, *last;
1182 char *reg_name, *reg_type, *reg_flags, *reg_num;
a60de03c 1183 char *dw2_32_num, *dw2_64_num;
bd5295b2 1184 int lineno = 0;
40b8e679 1185
3d4d5afa
L
1186 filename = "i386-reg.tbl";
1187 fp = fopen (filename, "r");
40b8e679 1188 if (fp == NULL)
34edb9ad 1189 fail (_("can't find i386-reg.tbl for reading, errno = %s\n"),
40fb9820 1190 xstrerror (errno));
40b8e679 1191
34edb9ad
L
1192 fprintf (table, "\n/* i386 register table. */\n\n");
1193 fprintf (table, "const reg_entry i386_regtab[] =\n{\n");
40b8e679
L
1194
1195 while (!feof (fp))
1196 {
1197 if (fgets (buf, sizeof (buf), fp) == NULL)
1198 break;
1199
3d4d5afa
L
1200 lineno++;
1201
40b8e679
L
1202 p = remove_leading_whitespaces (buf);
1203
1204 /* Skip comments. */
1205 str = strstr (p, "//");
1206 if (str != NULL)
1207 str[0] = '\0';
1208
1209 /* Remove trailing white spaces. */
1210 remove_trailing_whitespaces (p);
1211
1212 switch (p[0])
1213 {
1214 case '#':
34edb9ad 1215 fprintf (table, "%s\n", p);
40b8e679
L
1216 case '\0':
1217 continue;
1218 break;
1219 default:
1220 break;
1221 }
1222
1223 last = p + strlen (p);
1224
1225 /* Find reg_name. */
c587b3f9 1226 reg_name = next_field (p, ',', &str, last);
40b8e679
L
1227
1228 /* Find reg_type. */
c587b3f9 1229 reg_type = next_field (str, ',', &str, last);
40b8e679
L
1230
1231 /* Find reg_flags. */
c587b3f9 1232 reg_flags = next_field (str, ',', &str, last);
40b8e679
L
1233
1234 /* Find reg_num. */
c587b3f9 1235 reg_num = next_field (str, ',', &str, last);
a60de03c 1236
40fb9820
L
1237 fprintf (table, " { \"%s\",\n ", reg_name);
1238
bd5295b2 1239 process_i386_operand_type (table, reg_type, 0, "\t", lineno);
40fb9820 1240
a60de03c 1241 /* Find 32-bit Dwarf2 register number. */
c587b3f9 1242 dw2_32_num = next_field (str, ',', &str, last);
a60de03c
JB
1243
1244 /* Find 64-bit Dwarf2 register number. */
c587b3f9 1245 dw2_64_num = next_field (str, ',', &str, last);
a60de03c
JB
1246
1247 fprintf (table, ",\n %s, %s, { %s, %s } },\n",
1248 reg_flags, reg_num, dw2_32_num, dw2_64_num);
40b8e679
L
1249 }
1250
34edb9ad
L
1251 fclose (fp);
1252
1253 fprintf (table, "};\n");
40b8e679 1254
34edb9ad 1255 fprintf (table, "\nconst unsigned int i386_regtab_size = ARRAY_SIZE (i386_regtab);\n");
40b8e679
L
1256}
1257
40fb9820
L
1258static void
1259process_i386_initializers (void)
1260{
1261 unsigned int i;
1262 FILE *fp = fopen ("i386-init.h", "w");
1263 char *init;
1264
1265 if (fp == NULL)
1266 fail (_("can't create i386-init.h, errno = %s\n"),
1267 xstrerror (errno));
1268
1269 process_copyright (fp);
1270
1271 for (i = 0; i < ARRAY_SIZE (cpu_flag_init); i++)
1272 {
1273 fprintf (fp, "\n#define %s \\\n", cpu_flag_init[i].name);
1274 init = xstrdup (cpu_flag_init[i].init);
bd5295b2 1275 process_i386_cpu_flag (fp, init, 1, "", " ", -1);
40fb9820
L
1276 free (init);
1277 }
1278
1279 for (i = 0; i < ARRAY_SIZE (operand_type_init); i++)
1280 {
1281 fprintf (fp, "\n\n#define %s \\\n ", operand_type_init[i].name);
1282 init = xstrdup (operand_type_init[i].init);
bd5295b2 1283 process_i386_operand_type (fp, init, 1, " ", -1);
40fb9820
L
1284 free (init);
1285 }
1286 fprintf (fp, "\n");
1287
1288 fclose (fp);
1289}
1290
40b8e679
L
1291/* Program options. */
1292#define OPTION_SRCDIR 200
1293
29c048b6 1294struct option long_options[] =
40b8e679
L
1295{
1296 {"srcdir", required_argument, NULL, OPTION_SRCDIR},
1297 {"debug", no_argument, NULL, 'd'},
1298 {"version", no_argument, NULL, 'V'},
1299 {"help", no_argument, NULL, 'h'},
1300 {0, no_argument, NULL, 0}
1301};
1302
1303static void
1304print_version (void)
1305{
1306 printf ("%s: version 1.0\n", program_name);
1307 xexit (0);
1308}
1309
1310static void
1311usage (FILE * stream, int status)
1312{
1313 fprintf (stream, "Usage: %s [-V | --version] [-d | --debug] [--srcdir=dirname] [--help]\n",
1314 program_name);
1315 xexit (status);
1316}
1317
1318int
1319main (int argc, char **argv)
1320{
1321 extern int chdir (char *);
1322 char *srcdir = NULL;
8b40d594 1323 int c;
72ffa0fb 1324 FILE *table;
29c048b6 1325
40b8e679
L
1326 program_name = *argv;
1327 xmalloc_set_program_name (program_name);
1328
1329 while ((c = getopt_long (argc, argv, "vVdh", long_options, 0)) != EOF)
1330 switch (c)
1331 {
1332 case OPTION_SRCDIR:
1333 srcdir = optarg;
1334 break;
1335 case 'V':
1336 case 'v':
1337 print_version ();
1338 break;
1339 case 'd':
1340 debug = 1;
1341 break;
1342 case 'h':
1343 case '?':
1344 usage (stderr, 0);
1345 default:
1346 case 0:
1347 break;
1348 }
1349
1350 if (optind != argc)
1351 usage (stdout, 1);
1352
29c048b6 1353 if (srcdir != NULL)
40b8e679
L
1354 if (chdir (srcdir) != 0)
1355 fail (_("unable to change directory to \"%s\", errno = %s\n"),
40fb9820
L
1356 srcdir, xstrerror (errno));
1357
1358 /* Check the unused bitfield in i386_cpu_flags. */
1359#ifndef CpuUnused
8b40d594
L
1360 c = CpuNumOfBits - CpuMax - 1;
1361 if (c)
1362 fail (_("%d unused bits in i386_cpu_flags.\n"), c);
40fb9820
L
1363#endif
1364
1365 /* Check the unused bitfield in i386_operand_type. */
1366#ifndef OTUnused
8b40d594
L
1367 c = OTNumOfBits - OTMax - 1;
1368 if (c)
1369 fail (_("%d unused bits in i386_operand_type.\n"), c);
40fb9820
L
1370#endif
1371
1372 qsort (cpu_flags, ARRAY_SIZE (cpu_flags), sizeof (cpu_flags [0]),
1373 compare);
1374
1375 qsort (opcode_modifiers, ARRAY_SIZE (opcode_modifiers),
1376 sizeof (opcode_modifiers [0]), compare);
1377
1378 qsort (operand_types, ARRAY_SIZE (operand_types),
1379 sizeof (operand_types [0]), compare);
40b8e679 1380
34edb9ad
L
1381 table = fopen ("i386-tbl.h", "w");
1382 if (table == NULL)
40fb9820
L
1383 fail (_("can't create i386-tbl.h, errno = %s\n"),
1384 xstrerror (errno));
34edb9ad 1385
72ffa0fb 1386 process_copyright (table);
40b8e679 1387
72ffa0fb
L
1388 process_i386_opcodes (table);
1389 process_i386_registers (table);
40fb9820 1390 process_i386_initializers ();
40b8e679 1391
34edb9ad
L
1392 fclose (table);
1393
40b8e679
L
1394 exit (0);
1395}
This page took 0.602222 seconds and 4 git commands to generate.