OpenCores
URL https://opencores.org/ocsvn/open8_urisc/open8_urisc/trunk

Subversion Repositories open8_urisc

[/] [open8_urisc/] [trunk/] [gnu/] [binutils/] [opcodes/] [i386-gen.c] - Blame information for rev 166

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.