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