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