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