Bug Summary

File:src/gnu/usr.bin/binutils-2.17/opcodes/i386-dis.c
Warning:line 4446, column 7
Value stored to 'mask' is never read

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple amd64-unknown-openbsd7.0 -analyze -disable-free -disable-llvm-verifier -discard-value-names -main-file-name i386-dis.c -analyzer-store=region -analyzer-opt-analyze-nested-blocks -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 1 -pic-is-pie -mframe-pointer=all -relaxed-aliasing -fno-rounding-math -mconstructor-aliases -munwind-tables -target-cpu x86-64 -target-feature +retpoline-indirect-calls -target-feature +retpoline-indirect-branches -tune-cpu generic -debugger-tuning=gdb -fcoverage-compilation-dir=/usr/src/gnu/usr.bin/binutils-2.17/obj/opcodes -resource-dir /usr/local/lib/clang/13.0.0 -D HAVE_CONFIG_H -I . -I /usr/src/gnu/usr.bin/binutils-2.17/opcodes -I . -D _GNU_SOURCE -I . -I /usr/src/gnu/usr.bin/binutils-2.17/opcodes -I ../bfd -I /usr/src/gnu/usr.bin/binutils-2.17/opcodes/../include -I /usr/src/gnu/usr.bin/binutils-2.17/opcodes/../bfd -I /usr/src/gnu/usr.bin/binutils-2.17/opcodes/../intl -I ../intl -D PIE_DEFAULT=1 -internal-isystem /usr/local/lib/clang/13.0.0/include -internal-externc-isystem /usr/include -O2 -fdebug-compilation-dir=/usr/src/gnu/usr.bin/binutils-2.17/obj/opcodes -ferror-limit 19 -fwrapv -D_RET_PROTECTOR -ret-protector -fgnuc-version=4.2.1 -vectorize-loops -vectorize-slp -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-valloc -fno-builtin-free -fno-builtin-strdup -fno-builtin-strndup -analyzer-output=html -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /home/ben/Projects/vmm/scan-build/2022-01-12-194120-40624-1 -x c /usr/src/gnu/usr.bin/binutils-2.17/opcodes/i386-dis.c
1/* Print i386 instructions for GDB, the GNU debugger.
2 Copyright 1988, 1989, 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
20
21/* 80386 instruction printer by Pace Willisson (pace@prep.ai.mit.edu)
22 July 1988
23 modified by John Hassey (hassey@dg-rtp.dg.com)
24 x86-64 support added by Jan Hubicka (jh@suse.cz)
25 VIA PadLock support by Michal Ludvig (mludvig@suse.cz). */
26
27/* The main tables describing the instructions is essentially a copy
28 of the "Opcode Map" chapter (Appendix A) of the Intel 80386
29 Programmers Manual. Usually, there is a capital letter, followed
30 by a small letter. The capital letter tell the addressing mode,
31 and the small letter tells about the operand size. Refer to
32 the Intel manual for details. */
33
34#include "dis-asm.h"
35#include "sysdep.h"
36#include "opintl.h"
37
38#define MAXLEN15 15
39
40#include <setjmp.h>
41
42#ifndef UNIXWARE_COMPAT1
43/* Set non-zero for broken, compatible instructions. Set to zero for
44 non-broken opcodes. */
45#define UNIXWARE_COMPAT1 1
46#endif
47
48static int fetch_data (struct disassemble_info *, bfd_byte *);
49static void ckprefix (void);
50static const char *prefix_name (int, int);
51static int print_insn (bfd_vma, disassemble_info *);
52static void dofloat (int);
53static void OP_ST (int, int);
54static void OP_STi (int, int);
55static int putop (const char *, int);
56static void oappend (const char *);
57static void append_seg (void);
58static void OP_indirE (int, int);
59static void print_operand_value (char *, int, bfd_vma);
60static void OP_E (int, int);
61static void OP_G (int, int);
62static bfd_vma get64 (void);
63static bfd_signed_vma get32 (void);
64static bfd_signed_vma get32s (void);
65static int get16 (void);
66static void set_op (bfd_vma, int);
67static void OP_REG (int, int);
68static void OP_IMREG (int, int);
69static void OP_I (int, int);
70static void OP_I64 (int, int);
71static void OP_sI (int, int);
72static void OP_J (int, int);
73static void OP_SEG (int, int);
74static void OP_DIR (int, int);
75static void OP_OFF (int, int);
76static void OP_OFF64 (int, int);
77static void ptr_reg (int, int);
78static void OP_ESreg (int, int);
79static void OP_DSreg (int, int);
80static void OP_C (int, int);
81static void OP_D (int, int);
82static void OP_T (int, int);
83static void OP_Rd (int, int);
84static void OP_MMX (int, int);
85static void OP_XMM (int, int);
86static void OP_EM (int, int);
87static void OP_EX (int, int);
88static void OP_MS (int, int);
89static void OP_XS (int, int);
90static void OP_M (int, int);
91static void OP_VMX (int, int);
92static void OP_VMX2 (int, int);
93static void OP_0fae (int, int);
94static void OP_0f07 (int, int);
95static void NOP_Fixup (int, int);
96static void OP_3DNowSuffix (int, int);
97static void OP_SIMD_Suffix (int, int);
98static void SIMD_Fixup (int, int);
99static void PNI_Fixup (int, int);
100static void XCR_Fixup (int, int);
101static void SVME_Fixup (int, int);
102static void INVLPG_Fixup (int, int);
103static void BadOp (void);
104static void SEG_Fixup (int, int);
105static void VMX_Fixup (int, int);
106static void REP_Fixup (int, int);
107static void OP_0f38 (int, int);
108static void OP_0f3a (int, int);
109static void OP_data (int, int);
110
111struct dis_private {
112 /* Points to first byte not fetched. */
113 bfd_byte *max_fetched;
114 bfd_byte the_buffer[MAXLEN15];
115 bfd_vma insn_start;
116 int orig_sizeflag;
117 jmp_buf bailout;
118};
119
120/* The opcode for the fwait instruction, which we treat as a prefix
121 when we can. */
122#define FWAIT_OPCODE(0x9b) (0x9b)
123
124enum address_mode
125{
126 mode_16bit,
127 mode_32bit,
128 mode_64bit
129};
130
131enum address_mode address_mode;
132
133/* Flags for the prefixes for the current instruction. See below. */
134static int prefixes;
135
136/* REX prefix the current instruction. See below. */
137static int rex;
138/* Bits of REX we've already used. */
139static int rex_used;
140#define REX_MODE648 8
141#define REX_EXTX4 4
142#define REX_EXTY2 2
143#define REX_EXTZ1 1
144/* Mark parts used in the REX prefix. When we are testing for
145 empty prefix (for 8bit register REX extension), just mask it
146 out. Otherwise test for REX bit is excuse for existence of REX
147 only in case value is nonzero. */
148#define USED_REX(value){ if (value) rex_used |= (rex & value) ? (value) | 0x40 :
0; else rex_used |= 0x40; }
\
149 { \
150 if (value) \
151 rex_used |= (rex & value) ? (value) | 0x40 : 0; \
152 else \
153 rex_used |= 0x40; \
154 }
155
156/* Flags for prefixes which we somehow handled when printing the
157 current instruction. */
158static int used_prefixes;
159
160/* Flags stored in PREFIXES. */
161#define PREFIX_REPZ1 1
162#define PREFIX_REPNZ2 2
163#define PREFIX_LOCK4 4
164#define PREFIX_CS8 8
165#define PREFIX_SS0x10 0x10
166#define PREFIX_DS0x20 0x20
167#define PREFIX_ES0x40 0x40
168#define PREFIX_FS0x80 0x80
169#define PREFIX_GS0x100 0x100
170#define PREFIX_DATA0x200 0x200
171#define PREFIX_ADDR0x400 0x400
172#define PREFIX_FWAIT0x800 0x800
173
174/* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
175 to ADDR (exclusive) are valid. Returns 1 for success, longjmps
176 on error. */
177#define FETCH_DATA(info, addr)((addr) <= ((struct dis_private *) (info->private_data)
)->max_fetched ? 1 : fetch_data ((info), (addr)))
\
178 ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \
179 ? 1 : fetch_data ((info), (addr)))
180
181static int
182fetch_data (struct disassemble_info *info, bfd_byte *addr)
183{
184 int status;
185 struct dis_private *priv = (struct dis_private *) info->private_data;
186 bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer);
187
188 if (addr <= priv->the_buffer + MAXLEN15)
189 status = (*info->read_memory_func) (start,
190 priv->max_fetched,
191 addr - priv->max_fetched,
192 info);
193 else
194 status = -1;
195 if (status != 0)
196 {
197 /* If we did manage to read at least one byte, then
198 print_insn_i386 will do something sensible. Otherwise, print
199 an error. We do that here because this is where we know
200 STATUS. */
201 if (priv->max_fetched == priv->the_buffer)
202 (*info->memory_error_func) (status, start, info);
203 longjmp (priv->bailout, 1);
204 }
205 else
206 priv->max_fetched = addr;
207 return 1;
208}
209
210#define XX((void *)0), 0 NULL((void *)0), 0
211
212#define EbOP_E, 1 OP_E, b_mode1
213#define EvOP_E, 2 OP_E, v_mode2
214#define EdOP_E, 4 OP_E, d_mode4
215#define EqOP_E, 5 OP_E, q_mode5
216#define EdqOP_E, 11 OP_E, dq_mode11
217#define EdqwOP_E, 12 OP_E, dqw_mode12
218#define indirEvOP_indirE, 15 OP_indirE, stack_v_mode15
219#define indirEpOP_indirE, 13 OP_indirE, f_mode13
220#define stackEvOP_E, 15 OP_E, stack_v_mode15
221#define EmOP_E, 8 OP_E, m_mode8
222#define EwOP_E, 3 OP_E, w_mode3
223#define MaOP_E, 2 OP_E, v_mode2
224#define MOP_M, 0 OP_M, 0 /* lea, lgdt, etc. */
225#define MpOP_M, 13 OP_M, f_mode13 /* 32 or 48 bit memory operand for LDS, LES etc */
226#define MqOP_M, 5 OP_M, q_mode5 /* 128 bit memory operand for INV{EPT,VPID,PCID} */
227#define GbOP_G, 1 OP_G, b_mode1
228#define GvOP_G, 2 OP_G, v_mode2
229#define GdOP_G, 4 OP_G, d_mode4
230#define GdqOP_G, 11 OP_G, dq_mode11
231#define GmOP_G, 8 OP_G, m_mode8
232#define GwOP_G, 3 OP_G, w_mode3
233#define RdOP_Rd, 4 OP_Rd, d_mode4
234#define RmOP_Rd, 8 OP_Rd, m_mode8
235#define IbOP_I, 1 OP_I, b_mode1
236#define sIbOP_sI, 1 OP_sI, b_mode1 /* sign extened byte */
237#define IvOP_I, 2 OP_I, v_mode2
238#define IqOP_I, 5 OP_I, q_mode5
239#define Iv64OP_I64, 2 OP_I64, v_mode2
240#define IwOP_I, 3 OP_I, w_mode3
241#define I1OP_I, 14 OP_I, const_1_mode14
242#define JbOP_J, 1 OP_J, b_mode1
243#define JvOP_J, 2 OP_J, v_mode2
244#define CmOP_C, 8 OP_C, m_mode8
245#define DmOP_D, 8 OP_D, m_mode8
246#define TdOP_T, 4 OP_T, d_mode4
247#define SvSEG_Fixup, 2 SEG_Fixup, v_mode2
248
249#define RMeAXOP_REG, 108 OP_REG, eAX_reg108
250#define RMeBXOP_REG, 111 OP_REG, eBX_reg111
251#define RMeCXOP_REG, 109 OP_REG, eCX_reg109
252#define RMeDXOP_REG, 110 OP_REG, eDX_reg110
253#define RMeSPOP_REG, 112 OP_REG, eSP_reg112
254#define RMeBPOP_REG, 113 OP_REG, eBP_reg113
255#define RMeSIOP_REG, 114 OP_REG, eSI_reg114
256#define RMeDIOP_REG, 115 OP_REG, eDI_reg115
257#define RMrAXOP_REG, 132 OP_REG, rAX_reg132
258#define RMrBXOP_REG, 135 OP_REG, rBX_reg135
259#define RMrCXOP_REG, 133 OP_REG, rCX_reg133
260#define RMrDXOP_REG, 134 OP_REG, rDX_reg134
261#define RMrSPOP_REG, 136 OP_REG, rSP_reg136
262#define RMrBPOP_REG, 137 OP_REG, rBP_reg137
263#define RMrSIOP_REG, 138 OP_REG, rSI_reg138
264#define RMrDIOP_REG, 139 OP_REG, rDI_reg139
265#define RMALOP_REG, 116 OP_REG, al_reg116
266#define RMALOP_REG, 116 OP_REG, al_reg116
267#define RMCLOP_REG, 117 OP_REG, cl_reg117
268#define RMDLOP_REG, 118 OP_REG, dl_reg118
269#define RMBLOP_REG, 119 OP_REG, bl_reg119
270#define RMAHOP_REG, 120 OP_REG, ah_reg120
271#define RMCHOP_REG, 121 OP_REG, ch_reg121
272#define RMDHOP_REG, 122 OP_REG, dh_reg122
273#define RMBHOP_REG, 123 OP_REG, bh_reg123
274#define RMAXOP_REG, 124 OP_REG, ax_reg124
275#define RMDXOP_REG, 126 OP_REG, dx_reg126
276
277#define eAXOP_IMREG, 108 OP_IMREG, eAX_reg108
278#define eBXOP_IMREG, 111 OP_IMREG, eBX_reg111
279#define eCXOP_IMREG, 109 OP_IMREG, eCX_reg109
280#define eDXOP_IMREG, 110 OP_IMREG, eDX_reg110
281#define eSPOP_IMREG, 112 OP_IMREG, eSP_reg112
282#define eBPOP_IMREG, 113 OP_IMREG, eBP_reg113
283#define eSIOP_IMREG, 114 OP_IMREG, eSI_reg114
284#define eDIOP_IMREG, 115 OP_IMREG, eDI_reg115
285#define ALOP_IMREG, 116 OP_IMREG, al_reg116
286#define CLOP_IMREG, 117 OP_IMREG, cl_reg117
287#define DLOP_IMREG, 118 OP_IMREG, dl_reg118
288#define BLOP_IMREG, 119 OP_IMREG, bl_reg119
289#define AHOP_IMREG, 120 OP_IMREG, ah_reg120
290#define CHOP_IMREG, 121 OP_IMREG, ch_reg121
291#define DHOP_IMREG, 122 OP_IMREG, dh_reg122
292#define BHOP_IMREG, 123 OP_IMREG, bh_reg123
293#define AXOP_IMREG, 124 OP_IMREG, ax_reg124
294#define DXOP_IMREG, 126 OP_IMREG, dx_reg126
295#define indirDXOP_IMREG, 150 OP_IMREG, indir_dx_reg150
296
297#define SwOP_SEG, 3 OP_SEG, w_mode3
298#define ApOP_DIR, 0 OP_DIR, 0
299#define ObOP_OFF64, 1 OP_OFF64, b_mode1
300#define OvOP_OFF64, 2 OP_OFF64, v_mode2
301#define XbOP_DSreg, 114 OP_DSreg, eSI_reg114
302#define XvOP_DSreg, 114 OP_DSreg, eSI_reg114
303#define YbOP_ESreg, 115 OP_ESreg, eDI_reg115
304#define YvOP_ESreg, 115 OP_ESreg, eDI_reg115
305#define DSBXOP_DSreg, 111 OP_DSreg, eBX_reg111
306
307#define esOP_REG, 100 OP_REG, es_reg100
308#define ssOP_REG, 102 OP_REG, ss_reg102
309#define csOP_REG, 101 OP_REG, cs_reg101
310#define dsOP_REG, 103 OP_REG, ds_reg103
311#define fsOP_REG, 104 OP_REG, fs_reg104
312#define gsOP_REG, 105 OP_REG, gs_reg105
313
314#define MXOP_MMX, 0 OP_MMX, 0
315#define XMOP_XMM, 0 OP_XMM, 0
316#define EMOP_EM, 2 OP_EM, v_mode2
317#define EXOP_EX, 2 OP_EX, v_mode2
318#define MSOP_MS, 2 OP_MS, v_mode2
319#define XSOP_XS, 2 OP_XS, v_mode2
320#define VMOP_VMX, 5 OP_VMX, q_mode5
321#define VM2OP_VMX2, 5 OP_VMX2, q_mode5
322#define OPSUFOP_3DNowSuffix, 0 OP_3DNowSuffix, 0
323#define OPSIMDOP_SIMD_Suffix, 0 OP_SIMD_Suffix, 0
324#define OP0FAEOP_0fae, 2 OP_0fae, v_mode2
325#define OP0F38OP_0f38, 0 OP_0f38, 0
326#define OP0F3AOP_0f3a, 0 OP_0f3a, 0
327#define OPDATAOP_data, 0 OP_data, 0
328
329/* Used handle "rep" prefix for string instructions. */
330#define XbrREP_Fixup, 114 REP_Fixup, eSI_reg114
331#define XvrREP_Fixup, 114 REP_Fixup, eSI_reg114
332#define YbrREP_Fixup, 115 REP_Fixup, eDI_reg115
333#define YvrREP_Fixup, 115 REP_Fixup, eDI_reg115
334#define indirDXrREP_Fixup, 150 REP_Fixup, indir_dx_reg150
335#define ALrREP_Fixup, 116 REP_Fixup, al_reg116
336#define eAXrREP_Fixup, 108 REP_Fixup, eAX_reg108
337
338#define cond_jump_flag((void *)0), 9 NULL((void *)0), cond_jump_mode9
339#define loop_jcxz_flag((void *)0), 10 NULL((void *)0), loop_jcxz_mode10
340
341/* bits in sizeflag */
342#define SUFFIX_ALWAYS4 4
343#define AFLAG2 2
344#define DFLAG1 1
345
346#define b_mode1 1 /* byte operand */
347#define v_mode2 2 /* operand size depends on prefixes */
348#define w_mode3 3 /* word operand */
349#define d_mode4 4 /* double word operand */
350#define q_mode5 5 /* quad word operand */
351#define t_mode6 6 /* ten-byte operand */
352#define x_mode7 7 /* 16-byte XMM operand */
353#define m_mode8 8 /* d_mode in 32bit, q_mode in 64bit mode. */
354#define cond_jump_mode9 9
355#define loop_jcxz_mode10 10
356#define dq_mode11 11 /* operand size depends on REX prefixes. */
357#define dqw_mode12 12 /* registers like dq_mode, memory like w_mode. */
358#define f_mode13 13 /* 4- or 6-byte pointer operand */
359#define const_1_mode14 14
360#define stack_v_mode15 15 /* v_mode for stack-related opcodes. */
361
362#define es_reg100 100
363#define cs_reg101 101
364#define ss_reg102 102
365#define ds_reg103 103
366#define fs_reg104 104
367#define gs_reg105 105
368
369#define eAX_reg108 108
370#define eCX_reg109 109
371#define eDX_reg110 110
372#define eBX_reg111 111
373#define eSP_reg112 112
374#define eBP_reg113 113
375#define eSI_reg114 114
376#define eDI_reg115 115
377
378#define al_reg116 116
379#define cl_reg117 117
380#define dl_reg118 118
381#define bl_reg119 119
382#define ah_reg120 120
383#define ch_reg121 121
384#define dh_reg122 122
385#define bh_reg123 123
386
387#define ax_reg124 124
388#define cx_reg125 125
389#define dx_reg126 126
390#define bx_reg127 127
391#define sp_reg128 128
392#define bp_reg129 129
393#define si_reg130 130
394#define di_reg131 131
395
396#define rAX_reg132 132
397#define rCX_reg133 133
398#define rDX_reg134 134
399#define rBX_reg135 135
400#define rSP_reg136 136
401#define rBP_reg137 137
402#define rSI_reg138 138
403#define rDI_reg139 139
404
405#define indir_dx_reg150 150
406
407#define FLOATCODE1 1
408#define USE_GROUPS2 2
409#define USE_PREFIX_USER_TABLE3 3
410#define X86_64_SPECIAL4 4
411#define IS_3BYTE_OPCODE5 5
412
413#define FLOAT((void *)0), ((void *)0), 1, ((void *)0), 0, ((void *)0), 0 NULL((void *)0), NULL((void *)0), FLOATCODE1, NULL((void *)0), 0, NULL((void *)0), 0
414
415#define GRP1b((void *)0), ((void *)0), 2, ((void *)0), 0, ((void *)0), 0 NULL((void *)0), NULL((void *)0), USE_GROUPS2, NULL((void *)0), 0, NULL((void *)0), 0
416#define GRP1S((void *)0), ((void *)0), 2, ((void *)0), 1, ((void *)0), 0 NULL((void *)0), NULL((void *)0), USE_GROUPS2, NULL((void *)0), 1, NULL((void *)0), 0
417#define GRP1Ss((void *)0), ((void *)0), 2, ((void *)0), 2, ((void *)0), 0 NULL((void *)0), NULL((void *)0), USE_GROUPS2, NULL((void *)0), 2, NULL((void *)0), 0
418#define GRP2b((void *)0), ((void *)0), 2, ((void *)0), 3, ((void *)0), 0 NULL((void *)0), NULL((void *)0), USE_GROUPS2, NULL((void *)0), 3, NULL((void *)0), 0
419#define GRP2S((void *)0), ((void *)0), 2, ((void *)0), 4, ((void *)0), 0 NULL((void *)0), NULL((void *)0), USE_GROUPS2, NULL((void *)0), 4, NULL((void *)0), 0
420#define GRP2b_one((void *)0), ((void *)0), 2, ((void *)0), 5, ((void *)0), 0 NULL((void *)0), NULL((void *)0), USE_GROUPS2, NULL((void *)0), 5, NULL((void *)0), 0
421#define GRP2S_one((void *)0), ((void *)0), 2, ((void *)0), 6, ((void *)0), 0 NULL((void *)0), NULL((void *)0), USE_GROUPS2, NULL((void *)0), 6, NULL((void *)0), 0
422#define GRP2b_cl((void *)0), ((void *)0), 2, ((void *)0), 7, ((void *)0), 0 NULL((void *)0), NULL((void *)0), USE_GROUPS2, NULL((void *)0), 7, NULL((void *)0), 0
423#define GRP2S_cl((void *)0), ((void *)0), 2, ((void *)0), 8, ((void *)0), 0 NULL((void *)0), NULL((void *)0), USE_GROUPS2, NULL((void *)0), 8, NULL((void *)0), 0
424#define GRP3b((void *)0), ((void *)0), 2, ((void *)0), 9, ((void *)0), 0 NULL((void *)0), NULL((void *)0), USE_GROUPS2, NULL((void *)0), 9, NULL((void *)0), 0
425#define GRP3S((void *)0), ((void *)0), 2, ((void *)0), 10, ((void *)0), 0 NULL((void *)0), NULL((void *)0), USE_GROUPS2, NULL((void *)0), 10, NULL((void *)0), 0
426#define GRP4((void *)0), ((void *)0), 2, ((void *)0), 11, ((void *)0), 0 NULL((void *)0), NULL((void *)0), USE_GROUPS2, NULL((void *)0), 11, NULL((void *)0), 0
427#define GRP5((void *)0), ((void *)0), 2, ((void *)0), 12, ((void *)0), 0 NULL((void *)0), NULL((void *)0), USE_GROUPS2, NULL((void *)0), 12, NULL((void *)0), 0
428#define GRP6((void *)0), ((void *)0), 2, ((void *)0), 13, ((void *)0), 0 NULL((void *)0), NULL((void *)0), USE_GROUPS2, NULL((void *)0), 13, NULL((void *)0), 0
429#define GRP7((void *)0), ((void *)0), 2, ((void *)0), 14, ((void *)0), 0 NULL((void *)0), NULL((void *)0), USE_GROUPS2, NULL((void *)0), 14, NULL((void *)0), 0
430#define GRP8((void *)0), ((void *)0), 2, ((void *)0), 15, ((void *)0), 0 NULL((void *)0), NULL((void *)0), USE_GROUPS2, NULL((void *)0), 15, NULL((void *)0), 0
431#define GRP9((void *)0), ((void *)0), 2, ((void *)0), 16, ((void *)0), 0 NULL((void *)0), NULL((void *)0), USE_GROUPS2, NULL((void *)0), 16, NULL((void *)0), 0
432#define GRP10((void *)0), ((void *)0), 2, ((void *)0), 17, ((void *)0), 0 NULL((void *)0), NULL((void *)0), USE_GROUPS2, NULL((void *)0), 17, NULL((void *)0), 0
433#define GRP11((void *)0), ((void *)0), 2, ((void *)0), 18, ((void *)0), 0 NULL((void *)0), NULL((void *)0), USE_GROUPS2, NULL((void *)0), 18, NULL((void *)0), 0
434#define GRP12((void *)0), ((void *)0), 2, ((void *)0), 19, ((void *)0), 0 NULL((void *)0), NULL((void *)0), USE_GROUPS2, NULL((void *)0), 19, NULL((void *)0), 0
435#define GRP13((void *)0), ((void *)0), 2, ((void *)0), 20, ((void *)0), 0 NULL((void *)0), NULL((void *)0), USE_GROUPS2, NULL((void *)0), 20, NULL((void *)0), 0
436#define GRP14((void *)0), ((void *)0), 2, ((void *)0), 21, ((void *)0), 0 NULL((void *)0), NULL((void *)0), USE_GROUPS2, NULL((void *)0), 21, NULL((void *)0), 0
437#define GRPAMD((void *)0), ((void *)0), 2, ((void *)0), 22, ((void *)0), 0 NULL((void *)0), NULL((void *)0), USE_GROUPS2, NULL((void *)0), 22, NULL((void *)0), 0
438#define GRPPADLCK1((void *)0), ((void *)0), 2, ((void *)0), 23, ((void *)0), 0 NULL((void *)0), NULL((void *)0), USE_GROUPS2, NULL((void *)0), 23, NULL((void *)0), 0
439#define GRPPADLCK2((void *)0), ((void *)0), 2, ((void *)0), 24, ((void *)0), 0 NULL((void *)0), NULL((void *)0), USE_GROUPS2, NULL((void *)0), 24, NULL((void *)0), 0
440
441#define PREGRP0((void *)0), ((void *)0), 3, ((void *)0), 0, ((void *)0), 0 NULL((void *)0), NULL((void *)0), USE_PREFIX_USER_TABLE3, NULL((void *)0), 0, NULL((void *)0), 0
442#define PREGRP1((void *)0), ((void *)0), 3, ((void *)0), 1, ((void *)0), 0 NULL((void *)0), NULL((void *)0), USE_PREFIX_USER_TABLE3, NULL((void *)0), 1, NULL((void *)0), 0
443#define PREGRP2((void *)0), ((void *)0), 3, ((void *)0), 2, ((void *)0), 0 NULL((void *)0), NULL((void *)0), USE_PREFIX_USER_TABLE3, NULL((void *)0), 2, NULL((void *)0), 0
444#define PREGRP3((void *)0), ((void *)0), 3, ((void *)0), 3, ((void *)0), 0 NULL((void *)0), NULL((void *)0), USE_PREFIX_USER_TABLE3, NULL((void *)0), 3, NULL((void *)0), 0
445#define PREGRP4((void *)0), ((void *)0), 3, ((void *)0), 4, ((void *)0), 0 NULL((void *)0), NULL((void *)0), USE_PREFIX_USER_TABLE3, NULL((void *)0), 4, NULL((void *)0), 0
446#define PREGRP5((void *)0), ((void *)0), 3, ((void *)0), 5, ((void *)0), 0 NULL((void *)0), NULL((void *)0), USE_PREFIX_USER_TABLE3, NULL((void *)0), 5, NULL((void *)0), 0
447#define PREGRP6((void *)0), ((void *)0), 3, ((void *)0), 6, ((void *)0), 0 NULL((void *)0), NULL((void *)0), USE_PREFIX_USER_TABLE3, NULL((void *)0), 6, NULL((void *)0), 0
448#define PREGRP7((void *)0), ((void *)0), 3, ((void *)0), 7, ((void *)0), 0 NULL((void *)0), NULL((void *)0), USE_PREFIX_USER_TABLE3, NULL((void *)0), 7, NULL((void *)0), 0
449#define PREGRP8((void *)0), ((void *)0), 3, ((void *)0), 8, ((void *)0), 0 NULL((void *)0), NULL((void *)0), USE_PREFIX_USER_TABLE3, NULL((void *)0), 8, NULL((void *)0), 0
450#define PREGRP9((void *)0), ((void *)0), 3, ((void *)0), 9, ((void *)0), 0 NULL((void *)0), NULL((void *)0), USE_PREFIX_USER_TABLE3, NULL((void *)0), 9, NULL((void *)0), 0
451#define PREGRP10((void *)0), ((void *)0), 3, ((void *)0), 10, ((void *)0), 0 NULL((void *)0), NULL((void *)0), USE_PREFIX_USER_TABLE3, NULL((void *)0), 10, NULL((void *)0), 0
452#define PREGRP11((void *)0), ((void *)0), 3, ((void *)0), 11, ((void *)0), 0 NULL((void *)0), NULL((void *)0), USE_PREFIX_USER_TABLE3, NULL((void *)0), 11, NULL((void *)0), 0
453#define PREGRP12((void *)0), ((void *)0), 3, ((void *)0), 12, ((void *)0), 0 NULL((void *)0), NULL((void *)0), USE_PREFIX_USER_TABLE3, NULL((void *)0), 12, NULL((void *)0), 0
454#define PREGRP13((void *)0), ((void *)0), 3, ((void *)0), 13, ((void *)0), 0 NULL((void *)0), NULL((void *)0), USE_PREFIX_USER_TABLE3, NULL((void *)0), 13, NULL((void *)0), 0
455#define PREGRP14((void *)0), ((void *)0), 3, ((void *)0), 14, ((void *)0), 0 NULL((void *)0), NULL((void *)0), USE_PREFIX_USER_TABLE3, NULL((void *)0), 14, NULL((void *)0), 0
456#define PREGRP15((void *)0), ((void *)0), 3, ((void *)0), 15, ((void *)0), 0 NULL((void *)0), NULL((void *)0), USE_PREFIX_USER_TABLE3, NULL((void *)0), 15, NULL((void *)0), 0
457#define PREGRP16((void *)0), ((void *)0), 3, ((void *)0), 16, ((void *)0), 0 NULL((void *)0), NULL((void *)0), USE_PREFIX_USER_TABLE3, NULL((void *)0), 16, NULL((void *)0), 0
458#define PREGRP17((void *)0), ((void *)0), 3, ((void *)0), 17, ((void *)0), 0 NULL((void *)0), NULL((void *)0), USE_PREFIX_USER_TABLE3, NULL((void *)0), 17, NULL((void *)0), 0
459#define PREGRP18((void *)0), ((void *)0), 3, ((void *)0), 18, ((void *)0), 0 NULL((void *)0), NULL((void *)0), USE_PREFIX_USER_TABLE3, NULL((void *)0), 18, NULL((void *)0), 0
460#define PREGRP19((void *)0), ((void *)0), 3, ((void *)0), 19, ((void *)0), 0 NULL((void *)0), NULL((void *)0), USE_PREFIX_USER_TABLE3, NULL((void *)0), 19, NULL((void *)0), 0
461#define PREGRP20((void *)0), ((void *)0), 3, ((void *)0), 20, ((void *)0), 0 NULL((void *)0), NULL((void *)0), USE_PREFIX_USER_TABLE3, NULL((void *)0), 20, NULL((void *)0), 0
462#define PREGRP21((void *)0), ((void *)0), 3, ((void *)0), 21, ((void *)0), 0 NULL((void *)0), NULL((void *)0), USE_PREFIX_USER_TABLE3, NULL((void *)0), 21, NULL((void *)0), 0
463#define PREGRP22((void *)0), ((void *)0), 3, ((void *)0), 22, ((void *)0), 0 NULL((void *)0), NULL((void *)0), USE_PREFIX_USER_TABLE3, NULL((void *)0), 22, NULL((void *)0), 0
464#define PREGRP23((void *)0), ((void *)0), 3, ((void *)0), 23, ((void *)0), 0 NULL((void *)0), NULL((void *)0), USE_PREFIX_USER_TABLE3, NULL((void *)0), 23, NULL((void *)0), 0
465#define PREGRP24((void *)0), ((void *)0), 3, ((void *)0), 24, ((void *)0), 0 NULL((void *)0), NULL((void *)0), USE_PREFIX_USER_TABLE3, NULL((void *)0), 24, NULL((void *)0), 0
466#define PREGRP25((void *)0), ((void *)0), 3, ((void *)0), 25, ((void *)0), 0 NULL((void *)0), NULL((void *)0), USE_PREFIX_USER_TABLE3, NULL((void *)0), 25, NULL((void *)0), 0
467#define PREGRP26((void *)0), ((void *)0), 3, ((void *)0), 26, ((void *)0), 0 NULL((void *)0), NULL((void *)0), USE_PREFIX_USER_TABLE3, NULL((void *)0), 26, NULL((void *)0), 0
468#define PREGRP27((void *)0), ((void *)0), 3, ((void *)0), 27, ((void *)0), 0 NULL((void *)0), NULL((void *)0), USE_PREFIX_USER_TABLE3, NULL((void *)0), 27, NULL((void *)0), 0
469#define PREGRP28((void *)0), ((void *)0), 3, ((void *)0), 28, ((void *)0), 0 NULL((void *)0), NULL((void *)0), USE_PREFIX_USER_TABLE3, NULL((void *)0), 28, NULL((void *)0), 0
470#define PREGRP29((void *)0), ((void *)0), 3, ((void *)0), 29, ((void *)0), 0 NULL((void *)0), NULL((void *)0), USE_PREFIX_USER_TABLE3, NULL((void *)0), 29, NULL((void *)0), 0
471#define PREGRP30((void *)0), ((void *)0), 3, ((void *)0), 30, ((void *)0), 0 NULL((void *)0), NULL((void *)0), USE_PREFIX_USER_TABLE3, NULL((void *)0), 30, NULL((void *)0), 0
472#define PREGRP31((void *)0), ((void *)0), 3, ((void *)0), 31, ((void *)0), 0 NULL((void *)0), NULL((void *)0), USE_PREFIX_USER_TABLE3, NULL((void *)0), 31, NULL((void *)0), 0
473#define PREGRP32((void *)0), ((void *)0), 3, ((void *)0), 32, ((void *)0), 0 NULL((void *)0), NULL((void *)0), USE_PREFIX_USER_TABLE3, NULL((void *)0), 32, NULL((void *)0), 0
474
475#define X86_64_0((void *)0), ((void *)0), 4, ((void *)0), 0, ((void *)0), 0 NULL((void *)0), NULL((void *)0), X86_64_SPECIAL4, NULL((void *)0), 0, NULL((void *)0), 0
476
477#define THREE_BYTE_0((void *)0), ((void *)0), 5, ((void *)0), 0, ((void *)0), 0 NULL((void *)0), NULL((void *)0), IS_3BYTE_OPCODE5, NULL((void *)0), 0, NULL((void *)0), 0
478#define THREE_BYTE_1((void *)0), ((void *)0), 5, ((void *)0), 1, ((void *)0), 0 NULL((void *)0), NULL((void *)0), IS_3BYTE_OPCODE5, NULL((void *)0), 1, NULL((void *)0), 0
479
480typedef void (*op_rtn) (int bytemode, int sizeflag);
481
482struct dis386 {
483 const char *name;
484 op_rtn op1;
485 int bytemode1;
486 op_rtn op2;
487 int bytemode2;
488 op_rtn op3;
489 int bytemode3;
490};
491
492/* Upper case letters in the instruction names here are macros.
493 'A' => print 'b' if no register operands or suffix_always is true
494 'B' => print 'b' if suffix_always is true
495 'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
496 . size prefix
497 'E' => print 'e' if 32-bit form of jcxz
498 'F' => print 'w' or 'l' depending on address size prefix (loop insns)
499 'H' => print ",pt" or ",pn" branch hint
500 'I' => honor following macro letter even in Intel mode (implemented only
501 . for some of the macro letters)
502 'J' => print 'l'
503 'L' => print 'l' if suffix_always is true
504 'N' => print 'n' if instruction has no wait "prefix"
505 'O' => print 'd', or 'o'
506 'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix,
507 . or suffix_always is true. print 'q' if rex prefix is present.
508 'Q' => print 'w', 'l' or 'q' if no register operands or suffix_always
509 . is true
510 'R' => print 'w', 'l' or 'q' ("wd" or "dq" in intel mode)
511 'S' => print 'w', 'l' or 'q' if suffix_always is true
512 'T' => print 'q' in 64bit mode and behave as 'P' otherwise
513 'U' => print 'q' in 64bit mode and behave as 'Q' otherwise
514 'V' => print 'q' in 64bit mode and behave as 'S' otherwise
515 'W' => print 'b' or 'w' ("w" or "de" in intel mode)
516 'X' => print 's', 'd' depending on data16 prefix (for XMM)
517 'Y' => 'q' if instruction has an REX 64bit overwrite prefix
518 'Z' => print 'q' in 64bit mode and behave as 'L' otherwise
519
520 Many of the above letters print nothing in Intel mode. See "putop"
521 for the details.
522
523 Braces '{' and '}', and vertical bars '|', indicate alternative
524 mnemonic strings for AT&T, Intel, X86_64 AT&T, and X86_64 Intel
525 modes. In cases where there are only two alternatives, the X86_64
526 instruction is reserved, and "(bad)" is printed.
527*/
528
529static const struct dis386 dis386[] = {
530 /* 00 */
531 { "addB", EbOP_E, 1, GbOP_G, 1, XX((void *)0), 0 },
532 { "addS", EvOP_E, 2, GvOP_G, 2, XX((void *)0), 0 },
533 { "addB", GbOP_G, 1, EbOP_E, 1, XX((void *)0), 0 },
534 { "addS", GvOP_G, 2, EvOP_E, 2, XX((void *)0), 0 },
535 { "addB", ALOP_IMREG, 116, IbOP_I, 1, XX((void *)0), 0 },
536 { "addS", eAXOP_IMREG, 108, IvOP_I, 2, XX((void *)0), 0 },
537 { "push{T|}", esOP_REG, 100, XX((void *)0), 0, XX((void *)0), 0 },
538 { "pop{T|}", esOP_REG, 100, XX((void *)0), 0, XX((void *)0), 0 },
539 /* 08 */
540 { "orB", EbOP_E, 1, GbOP_G, 1, XX((void *)0), 0 },
541 { "orS", EvOP_E, 2, GvOP_G, 2, XX((void *)0), 0 },
542 { "orB", GbOP_G, 1, EbOP_E, 1, XX((void *)0), 0 },
543 { "orS", GvOP_G, 2, EvOP_E, 2, XX((void *)0), 0 },
544 { "orB", ALOP_IMREG, 116, IbOP_I, 1, XX((void *)0), 0 },
545 { "orS", eAXOP_IMREG, 108, IvOP_I, 2, XX((void *)0), 0 },
546 { "push{T|}", csOP_REG, 101, XX((void *)0), 0, XX((void *)0), 0 },
547 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 }, /* 0x0f extended opcode escape */
548 /* 10 */
549 { "adcB", EbOP_E, 1, GbOP_G, 1, XX((void *)0), 0 },
550 { "adcS", EvOP_E, 2, GvOP_G, 2, XX((void *)0), 0 },
551 { "adcB", GbOP_G, 1, EbOP_E, 1, XX((void *)0), 0 },
552 { "adcS", GvOP_G, 2, EvOP_E, 2, XX((void *)0), 0 },
553 { "adcB", ALOP_IMREG, 116, IbOP_I, 1, XX((void *)0), 0 },
554 { "adcS", eAXOP_IMREG, 108, IvOP_I, 2, XX((void *)0), 0 },
555 { "push{T|}", ssOP_REG, 102, XX((void *)0), 0, XX((void *)0), 0 },
556 { "pop{T|}", ssOP_REG, 102, XX((void *)0), 0, XX((void *)0), 0 },
557 /* 18 */
558 { "sbbB", EbOP_E, 1, GbOP_G, 1, XX((void *)0), 0 },
559 { "sbbS", EvOP_E, 2, GvOP_G, 2, XX((void *)0), 0 },
560 { "sbbB", GbOP_G, 1, EbOP_E, 1, XX((void *)0), 0 },
561 { "sbbS", GvOP_G, 2, EvOP_E, 2, XX((void *)0), 0 },
562 { "sbbB", ALOP_IMREG, 116, IbOP_I, 1, XX((void *)0), 0 },
563 { "sbbS", eAXOP_IMREG, 108, IvOP_I, 2, XX((void *)0), 0 },
564 { "push{T|}", dsOP_REG, 103, XX((void *)0), 0, XX((void *)0), 0 },
565 { "pop{T|}", dsOP_REG, 103, XX((void *)0), 0, XX((void *)0), 0 },
566 /* 20 */
567 { "andB", EbOP_E, 1, GbOP_G, 1, XX((void *)0), 0 },
568 { "andS", EvOP_E, 2, GvOP_G, 2, XX((void *)0), 0 },
569 { "andB", GbOP_G, 1, EbOP_E, 1, XX((void *)0), 0 },
570 { "andS", GvOP_G, 2, EvOP_E, 2, XX((void *)0), 0 },
571 { "andB", ALOP_IMREG, 116, IbOP_I, 1, XX((void *)0), 0 },
572 { "andS", eAXOP_IMREG, 108, IvOP_I, 2, XX((void *)0), 0 },
573 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 }, /* SEG ES prefix */
574 { "daa{|}", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
575 /* 28 */
576 { "subB", EbOP_E, 1, GbOP_G, 1, XX((void *)0), 0 },
577 { "subS", EvOP_E, 2, GvOP_G, 2, XX((void *)0), 0 },
578 { "subB", GbOP_G, 1, EbOP_E, 1, XX((void *)0), 0 },
579 { "subS", GvOP_G, 2, EvOP_E, 2, XX((void *)0), 0 },
580 { "subB", ALOP_IMREG, 116, IbOP_I, 1, XX((void *)0), 0 },
581 { "subS", eAXOP_IMREG, 108, IvOP_I, 2, XX((void *)0), 0 },
582 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 }, /* SEG CS prefix */
583 { "das{|}", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
584 /* 30 */
585 { "xorB", EbOP_E, 1, GbOP_G, 1, XX((void *)0), 0 },
586 { "xorS", EvOP_E, 2, GvOP_G, 2, XX((void *)0), 0 },
587 { "xorB", GbOP_G, 1, EbOP_E, 1, XX((void *)0), 0 },
588 { "xorS", GvOP_G, 2, EvOP_E, 2, XX((void *)0), 0 },
589 { "xorB", ALOP_IMREG, 116, IbOP_I, 1, XX((void *)0), 0 },
590 { "xorS", eAXOP_IMREG, 108, IvOP_I, 2, XX((void *)0), 0 },
591 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 }, /* SEG SS prefix */
592 { "aaa{|}", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
593 /* 38 */
594 { "cmpB", EbOP_E, 1, GbOP_G, 1, XX((void *)0), 0 },
595 { "cmpS", EvOP_E, 2, GvOP_G, 2, XX((void *)0), 0 },
596 { "cmpB", GbOP_G, 1, EbOP_E, 1, XX((void *)0), 0 },
597 { "cmpS", GvOP_G, 2, EvOP_E, 2, XX((void *)0), 0 },
598 { "cmpB", ALOP_IMREG, 116, IbOP_I, 1, XX((void *)0), 0 },
599 { "cmpS", eAXOP_IMREG, 108, IvOP_I, 2, XX((void *)0), 0 },
600 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 }, /* SEG DS prefix */
601 { "aas{|}", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
602 /* 40 */
603 { "inc{S|}", RMeAXOP_REG, 108, XX((void *)0), 0, XX((void *)0), 0 },
604 { "inc{S|}", RMeCXOP_REG, 109, XX((void *)0), 0, XX((void *)0), 0 },
605 { "inc{S|}", RMeDXOP_REG, 110, XX((void *)0), 0, XX((void *)0), 0 },
606 { "inc{S|}", RMeBXOP_REG, 111, XX((void *)0), 0, XX((void *)0), 0 },
607 { "inc{S|}", RMeSPOP_REG, 112, XX((void *)0), 0, XX((void *)0), 0 },
608 { "inc{S|}", RMeBPOP_REG, 113, XX((void *)0), 0, XX((void *)0), 0 },
609 { "inc{S|}", RMeSIOP_REG, 114, XX((void *)0), 0, XX((void *)0), 0 },
610 { "inc{S|}", RMeDIOP_REG, 115, XX((void *)0), 0, XX((void *)0), 0 },
611 /* 48 */
612 { "dec{S|}", RMeAXOP_REG, 108, XX((void *)0), 0, XX((void *)0), 0 },
613 { "dec{S|}", RMeCXOP_REG, 109, XX((void *)0), 0, XX((void *)0), 0 },
614 { "dec{S|}", RMeDXOP_REG, 110, XX((void *)0), 0, XX((void *)0), 0 },
615 { "dec{S|}", RMeBXOP_REG, 111, XX((void *)0), 0, XX((void *)0), 0 },
616 { "dec{S|}", RMeSPOP_REG, 112, XX((void *)0), 0, XX((void *)0), 0 },
617 { "dec{S|}", RMeBPOP_REG, 113, XX((void *)0), 0, XX((void *)0), 0 },
618 { "dec{S|}", RMeSIOP_REG, 114, XX((void *)0), 0, XX((void *)0), 0 },
619 { "dec{S|}", RMeDIOP_REG, 115, XX((void *)0), 0, XX((void *)0), 0 },
620 /* 50 */
621 { "pushV", RMrAXOP_REG, 132, XX((void *)0), 0, XX((void *)0), 0 },
622 { "pushV", RMrCXOP_REG, 133, XX((void *)0), 0, XX((void *)0), 0 },
623 { "pushV", RMrDXOP_REG, 134, XX((void *)0), 0, XX((void *)0), 0 },
624 { "pushV", RMrBXOP_REG, 135, XX((void *)0), 0, XX((void *)0), 0 },
625 { "pushV", RMrSPOP_REG, 136, XX((void *)0), 0, XX((void *)0), 0 },
626 { "pushV", RMrBPOP_REG, 137, XX((void *)0), 0, XX((void *)0), 0 },
627 { "pushV", RMrSIOP_REG, 138, XX((void *)0), 0, XX((void *)0), 0 },
628 { "pushV", RMrDIOP_REG, 139, XX((void *)0), 0, XX((void *)0), 0 },
629 /* 58 */
630 { "popV", RMrAXOP_REG, 132, XX((void *)0), 0, XX((void *)0), 0 },
631 { "popV", RMrCXOP_REG, 133, XX((void *)0), 0, XX((void *)0), 0 },
632 { "popV", RMrDXOP_REG, 134, XX((void *)0), 0, XX((void *)0), 0 },
633 { "popV", RMrBXOP_REG, 135, XX((void *)0), 0, XX((void *)0), 0 },
634 { "popV", RMrSPOP_REG, 136, XX((void *)0), 0, XX((void *)0), 0 },
635 { "popV", RMrBPOP_REG, 137, XX((void *)0), 0, XX((void *)0), 0 },
636 { "popV", RMrSIOP_REG, 138, XX((void *)0), 0, XX((void *)0), 0 },
637 { "popV", RMrDIOP_REG, 139, XX((void *)0), 0, XX((void *)0), 0 },
638 /* 60 */
639 { "pusha{P|}", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
640 { "popa{P|}", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
641 { "bound{S|}", GvOP_G, 2, MaOP_E, 2, XX((void *)0), 0 },
642 { X86_64_0((void *)0), ((void *)0), 4, ((void *)0), 0, ((void *)0), 0 },
643 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 }, /* seg fs */
644 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 }, /* seg gs */
645 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 }, /* op size prefix */
646 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 }, /* adr size prefix */
647 /* 68 */
648 { "pushT", IqOP_I, 5, XX((void *)0), 0, XX((void *)0), 0 },
649 { "imulS", GvOP_G, 2, EvOP_E, 2, IvOP_I, 2 },
650 { "pushT", sIbOP_sI, 1, XX((void *)0), 0, XX((void *)0), 0 },
651 { "imulS", GvOP_G, 2, EvOP_E, 2, sIbOP_sI, 1 },
652 { "ins{b||b|}", YbrREP_Fixup, 115, indirDXOP_IMREG, 150, XX((void *)0), 0 },
653 { "ins{R||R|}", YvrREP_Fixup, 115, indirDXOP_IMREG, 150, XX((void *)0), 0 },
654 { "outs{b||b|}", indirDXrREP_Fixup, 150, XbOP_DSreg, 114, XX((void *)0), 0 },
655 { "outs{R||R|}", indirDXrREP_Fixup, 150, XvOP_DSreg, 114, XX((void *)0), 0 },
656 /* 70 */
657 { "joH", JbOP_J, 1, XX((void *)0), 0, cond_jump_flag((void *)0), 9 },
658 { "jnoH", JbOP_J, 1, XX((void *)0), 0, cond_jump_flag((void *)0), 9 },
659 { "jbH", JbOP_J, 1, XX((void *)0), 0, cond_jump_flag((void *)0), 9 },
660 { "jaeH", JbOP_J, 1, XX((void *)0), 0, cond_jump_flag((void *)0), 9 },
661 { "jeH", JbOP_J, 1, XX((void *)0), 0, cond_jump_flag((void *)0), 9 },
662 { "jneH", JbOP_J, 1, XX((void *)0), 0, cond_jump_flag((void *)0), 9 },
663 { "jbeH", JbOP_J, 1, XX((void *)0), 0, cond_jump_flag((void *)0), 9 },
664 { "jaH", JbOP_J, 1, XX((void *)0), 0, cond_jump_flag((void *)0), 9 },
665 /* 78 */
666 { "jsH", JbOP_J, 1, XX((void *)0), 0, cond_jump_flag((void *)0), 9 },
667 { "jnsH", JbOP_J, 1, XX((void *)0), 0, cond_jump_flag((void *)0), 9 },
668 { "jpH", JbOP_J, 1, XX((void *)0), 0, cond_jump_flag((void *)0), 9 },
669 { "jnpH", JbOP_J, 1, XX((void *)0), 0, cond_jump_flag((void *)0), 9 },
670 { "jlH", JbOP_J, 1, XX((void *)0), 0, cond_jump_flag((void *)0), 9 },
671 { "jgeH", JbOP_J, 1, XX((void *)0), 0, cond_jump_flag((void *)0), 9 },
672 { "jleH", JbOP_J, 1, XX((void *)0), 0, cond_jump_flag((void *)0), 9 },
673 { "jgH", JbOP_J, 1, XX((void *)0), 0, cond_jump_flag((void *)0), 9 },
674 /* 80 */
675 { GRP1b((void *)0), ((void *)0), 2, ((void *)0), 0, ((void *)0), 0 },
676 { GRP1S((void *)0), ((void *)0), 2, ((void *)0), 1, ((void *)0), 0 },
677 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
678 { GRP1Ss((void *)0), ((void *)0), 2, ((void *)0), 2, ((void *)0), 0 },
679 { "testB", EbOP_E, 1, GbOP_G, 1, XX((void *)0), 0 },
680 { "testS", EvOP_E, 2, GvOP_G, 2, XX((void *)0), 0 },
681 { "xchgB", EbOP_E, 1, GbOP_G, 1, XX((void *)0), 0 },
682 { "xchgS", EvOP_E, 2, GvOP_G, 2, XX((void *)0), 0 },
683 /* 88 */
684 { "movB", EbOP_E, 1, GbOP_G, 1, XX((void *)0), 0 },
685 { "movS", EvOP_E, 2, GvOP_G, 2, XX((void *)0), 0 },
686 { "movB", GbOP_G, 1, EbOP_E, 1, XX((void *)0), 0 },
687 { "movS", GvOP_G, 2, EvOP_E, 2, XX((void *)0), 0 },
688 { "movQ", SvSEG_Fixup, 2, SwOP_SEG, 3, XX((void *)0), 0 },
689 { "leaS", GvOP_G, 2, MOP_M, 0, XX((void *)0), 0 },
690 { "movQ", SwOP_SEG, 3, SvSEG_Fixup, 2, XX((void *)0), 0 },
691 { "popU", stackEvOP_E, 15, XX((void *)0), 0, XX((void *)0), 0 },
692 /* 90 */
693 { "nop", NOP_Fixup, 0, XX((void *)0), 0, XX((void *)0), 0 },
694 { "xchgS", RMeCXOP_REG, 109, eAXOP_IMREG, 108, XX((void *)0), 0 },
695 { "xchgS", RMeDXOP_REG, 110, eAXOP_IMREG, 108, XX((void *)0), 0 },
696 { "xchgS", RMeBXOP_REG, 111, eAXOP_IMREG, 108, XX((void *)0), 0 },
697 { "xchgS", RMeSPOP_REG, 112, eAXOP_IMREG, 108, XX((void *)0), 0 },
698 { "xchgS", RMeBPOP_REG, 113, eAXOP_IMREG, 108, XX((void *)0), 0 },
699 { "xchgS", RMeSIOP_REG, 114, eAXOP_IMREG, 108, XX((void *)0), 0 },
700 { "xchgS", RMeDIOP_REG, 115, eAXOP_IMREG, 108, XX((void *)0), 0 },
701 /* 98 */
702 { "cW{tR||tR|}", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
703 { "cR{tO||tO|}", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
704 { "Jcall{T|}", ApOP_DIR, 0, XX((void *)0), 0, XX((void *)0), 0 },
705 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 }, /* fwait */
706 { "pushfT", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
707 { "popfT", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
708 { "sahf{|}", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
709 { "lahf{|}", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
710 /* a0 */
711 { "movB", ALOP_IMREG, 116, ObOP_OFF64, 1, XX((void *)0), 0 },
712 { "movS", eAXOP_IMREG, 108, OvOP_OFF64, 2, XX((void *)0), 0 },
713 { "movB", ObOP_OFF64, 1, ALOP_IMREG, 116, XX((void *)0), 0 },
714 { "movS", OvOP_OFF64, 2, eAXOP_IMREG, 108, XX((void *)0), 0 },
715 { "movs{b||b|}", YbrREP_Fixup, 115, XbOP_DSreg, 114, XX((void *)0), 0 },
716 { "movs{R||R|}", YvrREP_Fixup, 115, XvOP_DSreg, 114, XX((void *)0), 0 },
717 { "cmps{b||b|}", XbOP_DSreg, 114, YbOP_ESreg, 115, XX((void *)0), 0 },
718 { "cmps{R||R|}", XvOP_DSreg, 114, YvOP_ESreg, 115, XX((void *)0), 0 },
719 /* a8 */
720 { "testB", ALOP_IMREG, 116, IbOP_I, 1, XX((void *)0), 0 },
721 { "testS", eAXOP_IMREG, 108, IvOP_I, 2, XX((void *)0), 0 },
722 { "stosB", YbrREP_Fixup, 115, ALOP_IMREG, 116, XX((void *)0), 0 },
723 { "stosS", YvrREP_Fixup, 115, eAXOP_IMREG, 108, XX((void *)0), 0 },
724 { "lodsB", ALrREP_Fixup, 116, XbOP_DSreg, 114, XX((void *)0), 0 },
725 { "lodsS", eAXrREP_Fixup, 108, XvOP_DSreg, 114, XX((void *)0), 0 },
726 { "scasB", ALOP_IMREG, 116, YbOP_ESreg, 115, XX((void *)0), 0 },
727 { "scasS", eAXOP_IMREG, 108, YvOP_ESreg, 115, XX((void *)0), 0 },
728 /* b0 */
729 { "movB", RMALOP_REG, 116, IbOP_I, 1, XX((void *)0), 0 },
730 { "movB", RMCLOP_REG, 117, IbOP_I, 1, XX((void *)0), 0 },
731 { "movB", RMDLOP_REG, 118, IbOP_I, 1, XX((void *)0), 0 },
732 { "movB", RMBLOP_REG, 119, IbOP_I, 1, XX((void *)0), 0 },
733 { "movB", RMAHOP_REG, 120, IbOP_I, 1, XX((void *)0), 0 },
734 { "movB", RMCHOP_REG, 121, IbOP_I, 1, XX((void *)0), 0 },
735 { "movB", RMDHOP_REG, 122, IbOP_I, 1, XX((void *)0), 0 },
736 { "movB", RMBHOP_REG, 123, IbOP_I, 1, XX((void *)0), 0 },
737 /* b8 */
738 { "movS", RMeAXOP_REG, 108, Iv64OP_I64, 2, XX((void *)0), 0 },
739 { "movS", RMeCXOP_REG, 109, Iv64OP_I64, 2, XX((void *)0), 0 },
740 { "movS", RMeDXOP_REG, 110, Iv64OP_I64, 2, XX((void *)0), 0 },
741 { "movS", RMeBXOP_REG, 111, Iv64OP_I64, 2, XX((void *)0), 0 },
742 { "movS", RMeSPOP_REG, 112, Iv64OP_I64, 2, XX((void *)0), 0 },
743 { "movS", RMeBPOP_REG, 113, Iv64OP_I64, 2, XX((void *)0), 0 },
744 { "movS", RMeSIOP_REG, 114, Iv64OP_I64, 2, XX((void *)0), 0 },
745 { "movS", RMeDIOP_REG, 115, Iv64OP_I64, 2, XX((void *)0), 0 },
746 /* c0 */
747 { GRP2b((void *)0), ((void *)0), 2, ((void *)0), 3, ((void *)0), 0 },
748 { GRP2S((void *)0), ((void *)0), 2, ((void *)0), 4, ((void *)0), 0 },
749 { "retT", IwOP_I, 3, XX((void *)0), 0, XX((void *)0), 0 },
750 { "retT", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
751 { "les{S|}", GvOP_G, 2, MpOP_M, 13, XX((void *)0), 0 },
752 { "ldsS", GvOP_G, 2, MpOP_M, 13, XX((void *)0), 0 },
753 { "movA", EbOP_E, 1, IbOP_I, 1, XX((void *)0), 0 },
754 { "movQ", EvOP_E, 2, IvOP_I, 2, XX((void *)0), 0 },
755 /* c8 */
756 { "enterT", IwOP_I, 3, IbOP_I, 1, XX((void *)0), 0 },
757 { "leaveT", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
758 { "lretP", IwOP_I, 3, XX((void *)0), 0, XX((void *)0), 0 },
759 { "lretP", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
760 { "int3", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
761 { "int", IbOP_I, 1, XX((void *)0), 0, XX((void *)0), 0 },
762 { "into{|}", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
763 { "iretP", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
764 /* d0 */
765 { GRP2b_one((void *)0), ((void *)0), 2, ((void *)0), 5, ((void *)0), 0 },
766 { GRP2S_one((void *)0), ((void *)0), 2, ((void *)0), 6, ((void *)0), 0 },
767 { GRP2b_cl((void *)0), ((void *)0), 2, ((void *)0), 7, ((void *)0), 0 },
768 { GRP2S_cl((void *)0), ((void *)0), 2, ((void *)0), 8, ((void *)0), 0 },
769 { "aam{|}", sIbOP_sI, 1, XX((void *)0), 0, XX((void *)0), 0 },
770 { "aad{|}", sIbOP_sI, 1, XX((void *)0), 0, XX((void *)0), 0 },
771 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
772 { "xlat", DSBXOP_DSreg, 111, XX((void *)0), 0, XX((void *)0), 0 },
773 /* d8 */
774 { FLOAT((void *)0), ((void *)0), 1, ((void *)0), 0, ((void *)0), 0 },
775 { FLOAT((void *)0), ((void *)0), 1, ((void *)0), 0, ((void *)0), 0 },
776 { FLOAT((void *)0), ((void *)0), 1, ((void *)0), 0, ((void *)0), 0 },
777 { FLOAT((void *)0), ((void *)0), 1, ((void *)0), 0, ((void *)0), 0 },
778 { FLOAT((void *)0), ((void *)0), 1, ((void *)0), 0, ((void *)0), 0 },
779 { FLOAT((void *)0), ((void *)0), 1, ((void *)0), 0, ((void *)0), 0 },
780 { FLOAT((void *)0), ((void *)0), 1, ((void *)0), 0, ((void *)0), 0 },
781 { FLOAT((void *)0), ((void *)0), 1, ((void *)0), 0, ((void *)0), 0 },
782 /* e0 */
783 { "loopneFH", JbOP_J, 1, XX((void *)0), 0, loop_jcxz_flag((void *)0), 10 },
784 { "loopeFH", JbOP_J, 1, XX((void *)0), 0, loop_jcxz_flag((void *)0), 10 },
785 { "loopFH", JbOP_J, 1, XX((void *)0), 0, loop_jcxz_flag((void *)0), 10 },
786 { "jEcxzH", JbOP_J, 1, XX((void *)0), 0, loop_jcxz_flag((void *)0), 10 },
787 { "inB", ALOP_IMREG, 116, IbOP_I, 1, XX((void *)0), 0 },
788 { "inS", eAXOP_IMREG, 108, IbOP_I, 1, XX((void *)0), 0 },
789 { "outB", IbOP_I, 1, ALOP_IMREG, 116, XX((void *)0), 0 },
790 { "outS", IbOP_I, 1, eAXOP_IMREG, 108, XX((void *)0), 0 },
791 /* e8 */
792 { "callT", JvOP_J, 2, XX((void *)0), 0, XX((void *)0), 0 },
793 { "jmpT", JvOP_J, 2, XX((void *)0), 0, XX((void *)0), 0 },
794 { "Jjmp{T|}", ApOP_DIR, 0, XX((void *)0), 0, XX((void *)0), 0 },
795 { "jmp", JbOP_J, 1, XX((void *)0), 0, XX((void *)0), 0 },
796 { "inB", ALOP_IMREG, 116, indirDXOP_IMREG, 150, XX((void *)0), 0 },
797 { "inS", eAXOP_IMREG, 108, indirDXOP_IMREG, 150, XX((void *)0), 0 },
798 { "outB", indirDXOP_IMREG, 150, ALOP_IMREG, 116, XX((void *)0), 0 },
799 { "outS", indirDXOP_IMREG, 150, eAXOP_IMREG, 108, XX((void *)0), 0 },
800 /* f0 */
801 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 }, /* lock prefix */
802 { "icebp", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
803 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 }, /* repne */
804 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 }, /* repz */
805 { "hlt", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
806 { "cmc", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
807 { GRP3b((void *)0), ((void *)0), 2, ((void *)0), 9, ((void *)0), 0 },
808 { GRP3S((void *)0), ((void *)0), 2, ((void *)0), 10, ((void *)0), 0 },
809 /* f8 */
810 { "clc", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
811 { "stc", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
812 { "cli", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
813 { "sti", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
814 { "cld", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
815 { "std", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
816 { GRP4((void *)0), ((void *)0), 2, ((void *)0), 11, ((void *)0), 0 },
817 { GRP5((void *)0), ((void *)0), 2, ((void *)0), 12, ((void *)0), 0 },
818};
819
820static const struct dis386 dis386_twobyte[] = {
821 /* 00 */
822 { GRP6((void *)0), ((void *)0), 2, ((void *)0), 13, ((void *)0), 0 },
823 { GRP7((void *)0), ((void *)0), 2, ((void *)0), 14, ((void *)0), 0 },
824 { "larS", GvOP_G, 2, EwOP_E, 3, XX((void *)0), 0 },
825 { "lslS", GvOP_G, 2, EwOP_E, 3, XX((void *)0), 0 },
826 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
827 { "syscall", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
828 { "clts", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
829 { "sysretP", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
830 /* 08 */
831 { "invd", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
832 { "wbinvd", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
833 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
834 { "ud2a", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
835 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
836 { GRPAMD((void *)0), ((void *)0), 2, ((void *)0), 22, ((void *)0), 0 },
837 { "femms", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
838 { "", MXOP_MMX, 0, EMOP_EM, 2, OPSUFOP_3DNowSuffix, 0 }, /* See OP_3DNowSuffix. */
839 /* 10 */
840 { PREGRP8((void *)0), ((void *)0), 3, ((void *)0), 8, ((void *)0), 0 },
841 { PREGRP9((void *)0), ((void *)0), 3, ((void *)0), 9, ((void *)0), 0 },
842 { PREGRP30((void *)0), ((void *)0), 3, ((void *)0), 30, ((void *)0), 0 },
843 { "movlpX", EXOP_EX, 2, XMOP_XMM, 0, SIMD_Fixup, 'h' },
844 { "unpcklpX", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
845 { "unpckhpX", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
846 { PREGRP31((void *)0), ((void *)0), 3, ((void *)0), 31, ((void *)0), 0 },
847 { "movhpX", EXOP_EX, 2, XMOP_XMM, 0, SIMD_Fixup, 'l' },
848 /* 18 */
849 { GRP14((void *)0), ((void *)0), 2, ((void *)0), 21, ((void *)0), 0 },
850 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
851 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
852 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
853 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
854 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
855 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
856 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
857 /* 20 */
858 { "movZ", RmOP_Rd, 8, CmOP_C, 8, XX((void *)0), 0 },
859 { "movZ", RmOP_Rd, 8, DmOP_D, 8, XX((void *)0), 0 },
860 { "movZ", CmOP_C, 8, RmOP_Rd, 8, XX((void *)0), 0 },
861 { "movZ", DmOP_D, 8, RmOP_Rd, 8, XX((void *)0), 0 },
862 { "movL", RdOP_Rd, 4, TdOP_T, 4, XX((void *)0), 0 },
863 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
864 { "movL", TdOP_T, 4, RdOP_Rd, 4, XX((void *)0), 0 },
865 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
866 /* 28 */
867 { "movapX", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
868 { "movapX", EXOP_EX, 2, XMOP_XMM, 0, XX((void *)0), 0 },
869 { PREGRP2((void *)0), ((void *)0), 3, ((void *)0), 2, ((void *)0), 0 },
870 { "movntpX", EvOP_E, 2, XMOP_XMM, 0, XX((void *)0), 0 },
871 { PREGRP4((void *)0), ((void *)0), 3, ((void *)0), 4, ((void *)0), 0 },
872 { PREGRP3((void *)0), ((void *)0), 3, ((void *)0), 3, ((void *)0), 0 },
873 { "ucomisX", XMOP_XMM, 0,EXOP_EX, 2, XX((void *)0), 0 },
874 { "comisX", XMOP_XMM, 0,EXOP_EX, 2, XX((void *)0), 0 },
875 /* 30 */
876 { "wrmsr", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
877 { "rdtsc", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
878 { "rdmsr", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
879 { "rdpmc", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
880 { "sysenter", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
881 { "sysexit", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
882 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
883 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
884 /* 38 */
885 { THREE_BYTE_0((void *)0), ((void *)0), 5, ((void *)0), 0, ((void *)0), 0 },
886 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
887 { THREE_BYTE_1((void *)0), ((void *)0), 5, ((void *)0), 1, ((void *)0), 0 },
888 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
889 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
890 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
891 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
892 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
893 /* 40 */
894 { "cmovo", GvOP_G, 2, EvOP_E, 2, XX((void *)0), 0 },
895 { "cmovno", GvOP_G, 2, EvOP_E, 2, XX((void *)0), 0 },
896 { "cmovb", GvOP_G, 2, EvOP_E, 2, XX((void *)0), 0 },
897 { "cmovae", GvOP_G, 2, EvOP_E, 2, XX((void *)0), 0 },
898 { "cmove", GvOP_G, 2, EvOP_E, 2, XX((void *)0), 0 },
899 { "cmovne", GvOP_G, 2, EvOP_E, 2, XX((void *)0), 0 },
900 { "cmovbe", GvOP_G, 2, EvOP_E, 2, XX((void *)0), 0 },
901 { "cmova", GvOP_G, 2, EvOP_E, 2, XX((void *)0), 0 },
902 /* 48 */
903 { "cmovs", GvOP_G, 2, EvOP_E, 2, XX((void *)0), 0 },
904 { "cmovns", GvOP_G, 2, EvOP_E, 2, XX((void *)0), 0 },
905 { "cmovp", GvOP_G, 2, EvOP_E, 2, XX((void *)0), 0 },
906 { "cmovnp", GvOP_G, 2, EvOP_E, 2, XX((void *)0), 0 },
907 { "cmovl", GvOP_G, 2, EvOP_E, 2, XX((void *)0), 0 },
908 { "cmovge", GvOP_G, 2, EvOP_E, 2, XX((void *)0), 0 },
909 { "cmovle", GvOP_G, 2, EvOP_E, 2, XX((void *)0), 0 },
910 { "cmovg", GvOP_G, 2, EvOP_E, 2, XX((void *)0), 0 },
911 /* 50 */
912 { "movmskpX", GdqOP_G, 11, XSOP_XS, 2, XX((void *)0), 0 },
913 { PREGRP13((void *)0), ((void *)0), 3, ((void *)0), 13, ((void *)0), 0 },
914 { PREGRP12((void *)0), ((void *)0), 3, ((void *)0), 12, ((void *)0), 0 },
915 { PREGRP11((void *)0), ((void *)0), 3, ((void *)0), 11, ((void *)0), 0 },
916 { "andpX", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
917 { "andnpX", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
918 { "orpX", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
919 { "xorpX", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
920 /* 58 */
921 { PREGRP0((void *)0), ((void *)0), 3, ((void *)0), 0, ((void *)0), 0 },
922 { PREGRP10((void *)0), ((void *)0), 3, ((void *)0), 10, ((void *)0), 0 },
923 { PREGRP17((void *)0), ((void *)0), 3, ((void *)0), 17, ((void *)0), 0 },
924 { PREGRP16((void *)0), ((void *)0), 3, ((void *)0), 16, ((void *)0), 0 },
925 { PREGRP14((void *)0), ((void *)0), 3, ((void *)0), 14, ((void *)0), 0 },
926 { PREGRP7((void *)0), ((void *)0), 3, ((void *)0), 7, ((void *)0), 0 },
927 { PREGRP5((void *)0), ((void *)0), 3, ((void *)0), 5, ((void *)0), 0 },
928 { PREGRP6((void *)0), ((void *)0), 3, ((void *)0), 6, ((void *)0), 0 },
929 /* 60 */
930 { "punpcklbw", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
931 { "punpcklwd", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
932 { "punpckldq", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
933 { "packsswb", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
934 { "pcmpgtb", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
935 { "pcmpgtw", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
936 { "pcmpgtd", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
937 { "packuswb", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
938 /* 68 */
939 { "punpckhbw", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
940 { "punpckhwd", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
941 { "punpckhdq", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
942 { "packssdw", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
943 { PREGRP26((void *)0), ((void *)0), 3, ((void *)0), 26, ((void *)0), 0 },
944 { PREGRP24((void *)0), ((void *)0), 3, ((void *)0), 24, ((void *)0), 0 },
945 { "movd", MXOP_MMX, 0, EdqOP_E, 11, XX((void *)0), 0 },
946 { PREGRP19((void *)0), ((void *)0), 3, ((void *)0), 19, ((void *)0), 0 },
947 /* 70 */
948 { PREGRP22((void *)0), ((void *)0), 3, ((void *)0), 22, ((void *)0), 0 },
949 { GRP10((void *)0), ((void *)0), 2, ((void *)0), 17, ((void *)0), 0 },
950 { GRP11((void *)0), ((void *)0), 2, ((void *)0), 18, ((void *)0), 0 },
951 { GRP12((void *)0), ((void *)0), 2, ((void *)0), 19, ((void *)0), 0 },
952 { "pcmpeqb", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
953 { "pcmpeqw", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
954 { "pcmpeqd", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
955 { "emms", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
956 /* 78 */
957 { "vmread", EmOP_E, 8, GmOP_G, 8, XX((void *)0), 0 },
958 { "vmwrite", GmOP_G, 8, EmOP_E, 8, XX((void *)0), 0 },
959 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
960 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
961 { PREGRP28((void *)0), ((void *)0), 3, ((void *)0), 28, ((void *)0), 0 },
962 { PREGRP29((void *)0), ((void *)0), 3, ((void *)0), 29, ((void *)0), 0 },
963 { PREGRP23((void *)0), ((void *)0), 3, ((void *)0), 23, ((void *)0), 0 },
964 { PREGRP20((void *)0), ((void *)0), 3, ((void *)0), 20, ((void *)0), 0 },
965 /* 80 */
966 { "joH", JvOP_J, 2, XX((void *)0), 0, cond_jump_flag((void *)0), 9 },
967 { "jnoH", JvOP_J, 2, XX((void *)0), 0, cond_jump_flag((void *)0), 9 },
968 { "jbH", JvOP_J, 2, XX((void *)0), 0, cond_jump_flag((void *)0), 9 },
969 { "jaeH", JvOP_J, 2, XX((void *)0), 0, cond_jump_flag((void *)0), 9 },
970 { "jeH", JvOP_J, 2, XX((void *)0), 0, cond_jump_flag((void *)0), 9 },
971 { "jneH", JvOP_J, 2, XX((void *)0), 0, cond_jump_flag((void *)0), 9 },
972 { "jbeH", JvOP_J, 2, XX((void *)0), 0, cond_jump_flag((void *)0), 9 },
973 { "jaH", JvOP_J, 2, XX((void *)0), 0, cond_jump_flag((void *)0), 9 },
974 /* 88 */
975 { "jsH", JvOP_J, 2, XX((void *)0), 0, cond_jump_flag((void *)0), 9 },
976 { "jnsH", JvOP_J, 2, XX((void *)0), 0, cond_jump_flag((void *)0), 9 },
977 { "jpH", JvOP_J, 2, XX((void *)0), 0, cond_jump_flag((void *)0), 9 },
978 { "jnpH", JvOP_J, 2, XX((void *)0), 0, cond_jump_flag((void *)0), 9 },
979 { "jlH", JvOP_J, 2, XX((void *)0), 0, cond_jump_flag((void *)0), 9 },
980 { "jgeH", JvOP_J, 2, XX((void *)0), 0, cond_jump_flag((void *)0), 9 },
981 { "jleH", JvOP_J, 2, XX((void *)0), 0, cond_jump_flag((void *)0), 9 },
982 { "jgH", JvOP_J, 2, XX((void *)0), 0, cond_jump_flag((void *)0), 9 },
983 /* 90 */
984 { "seto", EbOP_E, 1, XX((void *)0), 0, XX((void *)0), 0 },
985 { "setno", EbOP_E, 1, XX((void *)0), 0, XX((void *)0), 0 },
986 { "setb", EbOP_E, 1, XX((void *)0), 0, XX((void *)0), 0 },
987 { "setae", EbOP_E, 1, XX((void *)0), 0, XX((void *)0), 0 },
988 { "sete", EbOP_E, 1, XX((void *)0), 0, XX((void *)0), 0 },
989 { "setne", EbOP_E, 1, XX((void *)0), 0, XX((void *)0), 0 },
990 { "setbe", EbOP_E, 1, XX((void *)0), 0, XX((void *)0), 0 },
991 { "seta", EbOP_E, 1, XX((void *)0), 0, XX((void *)0), 0 },
992 /* 98 */
993 { "sets", EbOP_E, 1, XX((void *)0), 0, XX((void *)0), 0 },
994 { "setns", EbOP_E, 1, XX((void *)0), 0, XX((void *)0), 0 },
995 { "setp", EbOP_E, 1, XX((void *)0), 0, XX((void *)0), 0 },
996 { "setnp", EbOP_E, 1, XX((void *)0), 0, XX((void *)0), 0 },
997 { "setl", EbOP_E, 1, XX((void *)0), 0, XX((void *)0), 0 },
998 { "setge", EbOP_E, 1, XX((void *)0), 0, XX((void *)0), 0 },
999 { "setle", EbOP_E, 1, XX((void *)0), 0, XX((void *)0), 0 },
1000 { "setg", EbOP_E, 1, XX((void *)0), 0, XX((void *)0), 0 },
1001 /* a0 */
1002 { "pushT", fsOP_REG, 104, XX((void *)0), 0, XX((void *)0), 0 },
1003 { "popT", fsOP_REG, 104, XX((void *)0), 0, XX((void *)0), 0 },
1004 { "cpuid", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1005 { "btS", EvOP_E, 2, GvOP_G, 2, XX((void *)0), 0 },
1006 { "shldS", EvOP_E, 2, GvOP_G, 2, IbOP_I, 1 },
1007 { "shldS", EvOP_E, 2, GvOP_G, 2, CLOP_IMREG, 117 },
1008 { GRPPADLCK2((void *)0), ((void *)0), 2, ((void *)0), 24, ((void *)0), 0 },
1009 { GRPPADLCK1((void *)0), ((void *)0), 2, ((void *)0), 23, ((void *)0), 0 },
1010 /* a8 */
1011 { "pushT", gsOP_REG, 105, XX((void *)0), 0, XX((void *)0), 0 },
1012 { "popT", gsOP_REG, 105, XX((void *)0), 0, XX((void *)0), 0 },
1013 { "rsm", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1014 { "btsS", EvOP_E, 2, GvOP_G, 2, XX((void *)0), 0 },
1015 { "shrdS", EvOP_E, 2, GvOP_G, 2, IbOP_I, 1 },
1016 { "shrdS", EvOP_E, 2, GvOP_G, 2, CLOP_IMREG, 117 },
1017 { GRP13((void *)0), ((void *)0), 2, ((void *)0), 20, ((void *)0), 0 },
1018 { "imulS", GvOP_G, 2, EvOP_E, 2, XX((void *)0), 0 },
1019 /* b0 */
1020 { "cmpxchgB", EbOP_E, 1, GbOP_G, 1, XX((void *)0), 0 },
1021 { "cmpxchgS", EvOP_E, 2, GvOP_G, 2, XX((void *)0), 0 },
1022 { "lssS", GvOP_G, 2, MpOP_M, 13, XX((void *)0), 0 },
1023 { "btrS", EvOP_E, 2, GvOP_G, 2, XX((void *)0), 0 },
1024 { "lfsS", GvOP_G, 2, MpOP_M, 13, XX((void *)0), 0 },
1025 { "lgsS", GvOP_G, 2, MpOP_M, 13, XX((void *)0), 0 },
1026 { "movz{bR|x|bR|x}", GvOP_G, 2, EbOP_E, 1, XX((void *)0), 0 },
1027 { "movz{wR|x|wR|x}", GvOP_G, 2, EwOP_E, 3, XX((void *)0), 0 }, /* yes, there really is movzww ! */
1028 /* b8 */
1029 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1030 { "ud2b", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1031 { GRP8((void *)0), ((void *)0), 2, ((void *)0), 15, ((void *)0), 0 },
1032 { "btcS", EvOP_E, 2, GvOP_G, 2, XX((void *)0), 0 },
1033 { "bsfS", GvOP_G, 2, EvOP_E, 2, XX((void *)0), 0 },
1034 { "bsrS", GvOP_G, 2, EvOP_E, 2, XX((void *)0), 0 },
1035 { "movs{bR|x|bR|x}", GvOP_G, 2, EbOP_E, 1, XX((void *)0), 0 },
1036 { "movs{wR|x|wR|x}", GvOP_G, 2, EwOP_E, 3, XX((void *)0), 0 }, /* yes, there really is movsww ! */
1037 /* c0 */
1038 { "xaddB", EbOP_E, 1, GbOP_G, 1, XX((void *)0), 0 },
1039 { "xaddS", EvOP_E, 2, GvOP_G, 2, XX((void *)0), 0 },
1040 { PREGRP1((void *)0), ((void *)0), 3, ((void *)0), 1, ((void *)0), 0 },
1041 { "movntiS", EvOP_E, 2, GvOP_G, 2, XX((void *)0), 0 },
1042 { "pinsrw", MXOP_MMX, 0, EdqwOP_E, 12, IbOP_I, 1 },
1043 { "pextrw", GdqOP_G, 11, MSOP_MS, 2, IbOP_I, 1 },
1044 { "shufpX", XMOP_XMM, 0, EXOP_EX, 2, IbOP_I, 1 },
1045 { GRP9((void *)0), ((void *)0), 2, ((void *)0), 16, ((void *)0), 0 },
1046 /* c8 */
1047 { "bswap", RMeAXOP_REG, 108, XX((void *)0), 0, XX((void *)0), 0 },
1048 { "bswap", RMeCXOP_REG, 109, XX((void *)0), 0, XX((void *)0), 0 },
1049 { "bswap", RMeDXOP_REG, 110, XX((void *)0), 0, XX((void *)0), 0 },
1050 { "bswap", RMeBXOP_REG, 111, XX((void *)0), 0, XX((void *)0), 0 },
1051 { "bswap", RMeSPOP_REG, 112, XX((void *)0), 0, XX((void *)0), 0 },
1052 { "bswap", RMeBPOP_REG, 113, XX((void *)0), 0, XX((void *)0), 0 },
1053 { "bswap", RMeSIOP_REG, 114, XX((void *)0), 0, XX((void *)0), 0 },
1054 { "bswap", RMeDIOP_REG, 115, XX((void *)0), 0, XX((void *)0), 0 },
1055 /* d0 */
1056 { PREGRP27((void *)0), ((void *)0), 3, ((void *)0), 27, ((void *)0), 0 },
1057 { "psrlw", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
1058 { "psrld", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
1059 { "psrlq", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
1060 { "paddq", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
1061 { "pmullw", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
1062 { PREGRP21((void *)0), ((void *)0), 3, ((void *)0), 21, ((void *)0), 0 },
1063 { "pmovmskb", GdqOP_G, 11, MSOP_MS, 2, XX((void *)0), 0 },
1064 /* d8 */
1065 { "psubusb", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
1066 { "psubusw", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
1067 { "pminub", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
1068 { "pand", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
1069 { "paddusb", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
1070 { "paddusw", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
1071 { "pmaxub", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
1072 { "pandn", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
1073 /* e0 */
1074 { "pavgb", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
1075 { "psraw", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
1076 { "psrad", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
1077 { "pavgw", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
1078 { "pmulhuw", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
1079 { "pmulhw", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
1080 { PREGRP15((void *)0), ((void *)0), 3, ((void *)0), 15, ((void *)0), 0 },
1081 { PREGRP25((void *)0), ((void *)0), 3, ((void *)0), 25, ((void *)0), 0 },
1082 /* e8 */
1083 { "psubsb", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
1084 { "psubsw", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
1085 { "pminsw", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
1086 { "por", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
1087 { "paddsb", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
1088 { "paddsw", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
1089 { "pmaxsw", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
1090 { "pxor", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
1091 /* f0 */
1092 { PREGRP32((void *)0), ((void *)0), 3, ((void *)0), 32, ((void *)0), 0 },
1093 { "psllw", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
1094 { "pslld", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
1095 { "psllq", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
1096 { "pmuludq", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
1097 { "pmaddwd", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
1098 { "psadbw", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
1099 { PREGRP18((void *)0), ((void *)0), 3, ((void *)0), 18, ((void *)0), 0 },
1100 /* f8 */
1101 { "psubb", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
1102 { "psubw", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
1103 { "psubd", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
1104 { "psubq", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
1105 { "paddb", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
1106 { "paddw", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
1107 { "paddd", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
1108 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 }
1109};
1110
1111static const unsigned char onebyte_has_modrm[256] = {
1112 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
1113 /* ------------------------------- */
1114 /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
1115 /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
1116 /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
1117 /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
1118 /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
1119 /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
1120 /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
1121 /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
1122 /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
1123 /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
1124 /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
1125 /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
1126 /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
1127 /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
1128 /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
1129 /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1 /* f0 */
1130 /* ------------------------------- */
1131 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
1132};
1133
1134static const unsigned char twobyte_has_modrm[256] = {
1135 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
1136 /* ------------------------------- */
1137 /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
1138 /* 10 */ 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0, /* 1f */
1139 /* 20 */ 1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1, /* 2f */
1140 /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
1141 /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
1142 /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
1143 /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
1144 /* 70 */ 1,1,1,1,1,1,1,0,1,1,0,0,1,1,1,1, /* 7f */
1145 /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
1146 /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
1147 /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
1148 /* b0 */ 1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1, /* bf */
1149 /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
1150 /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
1151 /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
1152 /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0 /* ff */
1153 /* ------------------------------- */
1154 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
1155};
1156
1157static const unsigned char twobyte_uses_SSE_prefix[256] = {
1158 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
1159 /* ------------------------------- */
1160 /* 00 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0f */
1161 /* 10 */ 1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0, /* 1f */
1162 /* 20 */ 0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0, /* 2f */
1163 /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
1164 /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 4f */
1165 /* 50 */ 0,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* 5f */
1166 /* 60 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1, /* 6f */
1167 /* 70 */ 1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1, /* 7f */
1168 /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
1169 /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 9f */
1170 /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* af */
1171 /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* bf */
1172 /* c0 */ 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, /* cf */
1173 /* d0 */ 1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, /* df */
1174 /* e0 */ 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, /* ef */
1175 /* f0 */ 1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0 /* ff */
1176 /* ------------------------------- */
1177 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
1178};
1179
1180static char obuf[100];
1181static char *obufp;
1182static char scratchbuf[100];
1183static unsigned char *start_codep;
1184static unsigned char *insn_codep;
1185static unsigned char *codep;
1186static disassemble_info *the_info;
1187static int mod;
1188static int rm;
1189static int reg;
1190static unsigned char need_modrm;
1191
1192/* If we are accessing mod/rm/reg without need_modrm set, then the
1193 values are stale. Hitting this abort likely indicates that you
1194 need to update onebyte_has_modrm or twobyte_has_modrm. */
1195#define MODRM_CHECKif (!need_modrm) abort () if (!need_modrm) abort ()
1196
1197static const char **names64;
1198static const char **names32;
1199static const char **names16;
1200static const char **names8;
1201static const char **names8rex;
1202static const char **names_seg;
1203static const char **index16;
1204
1205static const char *intel_names64[] = {
1206 "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
1207 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
1208};
1209static const char *intel_names32[] = {
1210 "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
1211 "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
1212};
1213static const char *intel_names16[] = {
1214 "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
1215 "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
1216};
1217static const char *intel_names8[] = {
1218 "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
1219};
1220static const char *intel_names8rex[] = {
1221 "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
1222 "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
1223};
1224static const char *intel_names_seg[] = {
1225 "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
1226};
1227static const char *intel_index16[] = {
1228 "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
1229};
1230
1231static const char *att_names64[] = {
1232 "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
1233 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
1234};
1235static const char *att_names32[] = {
1236 "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
1237 "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
1238};
1239static const char *att_names16[] = {
1240 "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
1241 "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
1242};
1243static const char *att_names8[] = {
1244 "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
1245};
1246static const char *att_names8rex[] = {
1247 "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
1248 "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
1249};
1250static const char *att_names_seg[] = {
1251 "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
1252};
1253static const char *att_index16[] = {
1254 "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
1255};
1256
1257static const struct dis386 grps[][8] = {
1258 /* GRP1b */
1259 {
1260 { "addA", EbOP_E, 1, IbOP_I, 1, XX((void *)0), 0 },
1261 { "orA", EbOP_E, 1, IbOP_I, 1, XX((void *)0), 0 },
1262 { "adcA", EbOP_E, 1, IbOP_I, 1, XX((void *)0), 0 },
1263 { "sbbA", EbOP_E, 1, IbOP_I, 1, XX((void *)0), 0 },
1264 { "andA", EbOP_E, 1, IbOP_I, 1, XX((void *)0), 0 },
1265 { "subA", EbOP_E, 1, IbOP_I, 1, XX((void *)0), 0 },
1266 { "xorA", EbOP_E, 1, IbOP_I, 1, XX((void *)0), 0 },
1267 { "cmpA", EbOP_E, 1, IbOP_I, 1, XX((void *)0), 0 }
1268 },
1269 /* GRP1S */
1270 {
1271 { "addQ", EvOP_E, 2, IvOP_I, 2, XX((void *)0), 0 },
1272 { "orQ", EvOP_E, 2, IvOP_I, 2, XX((void *)0), 0 },
1273 { "adcQ", EvOP_E, 2, IvOP_I, 2, XX((void *)0), 0 },
1274 { "sbbQ", EvOP_E, 2, IvOP_I, 2, XX((void *)0), 0 },
1275 { "andQ", EvOP_E, 2, IvOP_I, 2, XX((void *)0), 0 },
1276 { "subQ", EvOP_E, 2, IvOP_I, 2, XX((void *)0), 0 },
1277 { "xorQ", EvOP_E, 2, IvOP_I, 2, XX((void *)0), 0 },
1278 { "cmpQ", EvOP_E, 2, IvOP_I, 2, XX((void *)0), 0 }
1279 },
1280 /* GRP1Ss */
1281 {
1282 { "addQ", EvOP_E, 2, sIbOP_sI, 1, XX((void *)0), 0 },
1283 { "orQ", EvOP_E, 2, sIbOP_sI, 1, XX((void *)0), 0 },
1284 { "adcQ", EvOP_E, 2, sIbOP_sI, 1, XX((void *)0), 0 },
1285 { "sbbQ", EvOP_E, 2, sIbOP_sI, 1, XX((void *)0), 0 },
1286 { "andQ", EvOP_E, 2, sIbOP_sI, 1, XX((void *)0), 0 },
1287 { "subQ", EvOP_E, 2, sIbOP_sI, 1, XX((void *)0), 0 },
1288 { "xorQ", EvOP_E, 2, sIbOP_sI, 1, XX((void *)0), 0 },
1289 { "cmpQ", EvOP_E, 2, sIbOP_sI, 1, XX((void *)0), 0 }
1290 },
1291 /* GRP2b */
1292 {
1293 { "rolA", EbOP_E, 1, IbOP_I, 1, XX((void *)0), 0 },
1294 { "rorA", EbOP_E, 1, IbOP_I, 1, XX((void *)0), 0 },
1295 { "rclA", EbOP_E, 1, IbOP_I, 1, XX((void *)0), 0 },
1296 { "rcrA", EbOP_E, 1, IbOP_I, 1, XX((void *)0), 0 },
1297 { "shlA", EbOP_E, 1, IbOP_I, 1, XX((void *)0), 0 },
1298 { "shrA", EbOP_E, 1, IbOP_I, 1, XX((void *)0), 0 },
1299 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1300 { "sarA", EbOP_E, 1, IbOP_I, 1, XX((void *)0), 0 },
1301 },
1302 /* GRP2S */
1303 {
1304 { "rolQ", EvOP_E, 2, IbOP_I, 1, XX((void *)0), 0 },
1305 { "rorQ", EvOP_E, 2, IbOP_I, 1, XX((void *)0), 0 },
1306 { "rclQ", EvOP_E, 2, IbOP_I, 1, XX((void *)0), 0 },
1307 { "rcrQ", EvOP_E, 2, IbOP_I, 1, XX((void *)0), 0 },
1308 { "shlQ", EvOP_E, 2, IbOP_I, 1, XX((void *)0), 0 },
1309 { "shrQ", EvOP_E, 2, IbOP_I, 1, XX((void *)0), 0 },
1310 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1311 { "sarQ", EvOP_E, 2, IbOP_I, 1, XX((void *)0), 0 },
1312 },
1313 /* GRP2b_one */
1314 {
1315 { "rolA", EbOP_E, 1, I1OP_I, 14, XX((void *)0), 0 },
1316 { "rorA", EbOP_E, 1, I1OP_I, 14, XX((void *)0), 0 },
1317 { "rclA", EbOP_E, 1, I1OP_I, 14, XX((void *)0), 0 },
1318 { "rcrA", EbOP_E, 1, I1OP_I, 14, XX((void *)0), 0 },
1319 { "shlA", EbOP_E, 1, I1OP_I, 14, XX((void *)0), 0 },
1320 { "shrA", EbOP_E, 1, I1OP_I, 14, XX((void *)0), 0 },
1321 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1322 { "sarA", EbOP_E, 1, I1OP_I, 14, XX((void *)0), 0 },
1323 },
1324 /* GRP2S_one */
1325 {
1326 { "rolQ", EvOP_E, 2, I1OP_I, 14, XX((void *)0), 0 },
1327 { "rorQ", EvOP_E, 2, I1OP_I, 14, XX((void *)0), 0 },
1328 { "rclQ", EvOP_E, 2, I1OP_I, 14, XX((void *)0), 0 },
1329 { "rcrQ", EvOP_E, 2, I1OP_I, 14, XX((void *)0), 0 },
1330 { "shlQ", EvOP_E, 2, I1OP_I, 14, XX((void *)0), 0 },
1331 { "shrQ", EvOP_E, 2, I1OP_I, 14, XX((void *)0), 0 },
1332 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0},
1333 { "sarQ", EvOP_E, 2, I1OP_I, 14, XX((void *)0), 0 },
1334 },
1335 /* GRP2b_cl */
1336 {
1337 { "rolA", EbOP_E, 1, CLOP_IMREG, 117, XX((void *)0), 0 },
1338 { "rorA", EbOP_E, 1, CLOP_IMREG, 117, XX((void *)0), 0 },
1339 { "rclA", EbOP_E, 1, CLOP_IMREG, 117, XX((void *)0), 0 },
1340 { "rcrA", EbOP_E, 1, CLOP_IMREG, 117, XX((void *)0), 0 },
1341 { "shlA", EbOP_E, 1, CLOP_IMREG, 117, XX((void *)0), 0 },
1342 { "shrA", EbOP_E, 1, CLOP_IMREG, 117, XX((void *)0), 0 },
1343 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1344 { "sarA", EbOP_E, 1, CLOP_IMREG, 117, XX((void *)0), 0 },
1345 },
1346 /* GRP2S_cl */
1347 {
1348 { "rolQ", EvOP_E, 2, CLOP_IMREG, 117, XX((void *)0), 0 },
1349 { "rorQ", EvOP_E, 2, CLOP_IMREG, 117, XX((void *)0), 0 },
1350 { "rclQ", EvOP_E, 2, CLOP_IMREG, 117, XX((void *)0), 0 },
1351 { "rcrQ", EvOP_E, 2, CLOP_IMREG, 117, XX((void *)0), 0 },
1352 { "shlQ", EvOP_E, 2, CLOP_IMREG, 117, XX((void *)0), 0 },
1353 { "shrQ", EvOP_E, 2, CLOP_IMREG, 117, XX((void *)0), 0 },
1354 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1355 { "sarQ", EvOP_E, 2, CLOP_IMREG, 117, XX((void *)0), 0 }
1356 },
1357 /* GRP3b */
1358 {
1359 { "testA", EbOP_E, 1, IbOP_I, 1, XX((void *)0), 0 },
1360 { "(bad)", EbOP_E, 1, XX((void *)0), 0, XX((void *)0), 0 },
1361 { "notA", EbOP_E, 1, XX((void *)0), 0, XX((void *)0), 0 },
1362 { "negA", EbOP_E, 1, XX((void *)0), 0, XX((void *)0), 0 },
1363 { "mulA", EbOP_E, 1, XX((void *)0), 0, XX((void *)0), 0 }, /* Don't print the implicit %al register, */
1364 { "imulA", EbOP_E, 1, XX((void *)0), 0, XX((void *)0), 0 }, /* to distinguish these opcodes from other */
1365 { "divA", EbOP_E, 1, XX((void *)0), 0, XX((void *)0), 0 }, /* mul/imul opcodes. Do the same for div */
1366 { "idivA", EbOP_E, 1, XX((void *)0), 0, XX((void *)0), 0 } /* and idiv for consistency. */
1367 },
1368 /* GRP3S */
1369 {
1370 { "testQ", EvOP_E, 2, IvOP_I, 2, XX((void *)0), 0 },
1371 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1372 { "notQ", EvOP_E, 2, XX((void *)0), 0, XX((void *)0), 0 },
1373 { "negQ", EvOP_E, 2, XX((void *)0), 0, XX((void *)0), 0 },
1374 { "mulQ", EvOP_E, 2, XX((void *)0), 0, XX((void *)0), 0 }, /* Don't print the implicit register. */
1375 { "imulQ", EvOP_E, 2, XX((void *)0), 0, XX((void *)0), 0 },
1376 { "divQ", EvOP_E, 2, XX((void *)0), 0, XX((void *)0), 0 },
1377 { "idivQ", EvOP_E, 2, XX((void *)0), 0, XX((void *)0), 0 },
1378 },
1379 /* GRP4 */
1380 {
1381 { "incA", EbOP_E, 1, XX((void *)0), 0, XX((void *)0), 0 },
1382 { "decA", EbOP_E, 1, XX((void *)0), 0, XX((void *)0), 0 },
1383 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1384 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1385 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1386 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1387 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1388 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1389 },
1390 /* GRP5 */
1391 {
1392 { "incQ", EvOP_E, 2, XX((void *)0), 0, XX((void *)0), 0 },
1393 { "decQ", EvOP_E, 2, XX((void *)0), 0, XX((void *)0), 0 },
1394 { "callT", indirEvOP_indirE, 15, XX((void *)0), 0, XX((void *)0), 0 },
1395 { "JcallT", indirEpOP_indirE, 13, XX((void *)0), 0, XX((void *)0), 0 },
1396 { "jmpT", indirEvOP_indirE, 15, XX((void *)0), 0, XX((void *)0), 0 },
1397 { "JjmpT", indirEpOP_indirE, 13, XX((void *)0), 0, XX((void *)0), 0 },
1398 { "pushU", stackEvOP_E, 15, XX((void *)0), 0, XX((void *)0), 0 },
1399 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1400 },
1401 /* GRP6 */
1402 {
1403 { "sldtQ", EvOP_E, 2, XX((void *)0), 0, XX((void *)0), 0 },
1404 { "strQ", EvOP_E, 2, XX((void *)0), 0, XX((void *)0), 0 },
1405 { "lldt", EwOP_E, 3, XX((void *)0), 0, XX((void *)0), 0 },
1406 { "ltr", EwOP_E, 3, XX((void *)0), 0, XX((void *)0), 0 },
1407 { "verr", EwOP_E, 3, XX((void *)0), 0, XX((void *)0), 0 },
1408 { "verw", EwOP_E, 3, XX((void *)0), 0, XX((void *)0), 0 },
1409 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1410 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 }
1411 },
1412 /* GRP7 */
1413 {
1414 { "sgdtIQ", VMX_Fixup, 0, XX((void *)0), 0, XX((void *)0), 0 },
1415 { "sidtIQ", PNI_Fixup, 0, XX((void *)0), 0, XX((void *)0), 0 },
1416 { "lgdt{Q|Q||}", XCR_Fixup, 0, XX((void *)0), 0, XX((void *)0), 0 },
1417 { "lidt{Q|Q||}", SVME_Fixup, 0, XX((void *)0), 0, XX((void *)0), 0 },
1418 { "smswQ", EvOP_E, 2, XX((void *)0), 0, XX((void *)0), 0 },
1419 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1420 { "lmsw", EwOP_E, 3, XX((void *)0), 0, XX((void *)0), 0 },
1421 { "invlpg", INVLPG_Fixup, w_mode3, XX((void *)0), 0, XX((void *)0), 0 },
1422 },
1423 /* GRP8 */
1424 {
1425 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1426 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1427 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1428 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1429 { "btQ", EvOP_E, 2, IbOP_I, 1, XX((void *)0), 0 },
1430 { "btsQ", EvOP_E, 2, IbOP_I, 1, XX((void *)0), 0 },
1431 { "btrQ", EvOP_E, 2, IbOP_I, 1, XX((void *)0), 0 },
1432 { "btcQ", EvOP_E, 2, IbOP_I, 1, XX((void *)0), 0 },
1433 },
1434 /* GRP9 */
1435 {
1436 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1437 { "cmpxchg8b", EqOP_E, 5, XX((void *)0), 0, XX((void *)0), 0 },
1438 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1439 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1440 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1441 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1442 { "", VMOP_VMX, 5, XX((void *)0), 0, XX((void *)0), 0 }, /* See OP_VMX. */
1443 { "", VM2OP_VMX2, 5, XX((void *)0), 0, XX((void *)0), 0 },
1444 },
1445 /* GRP10 */
1446 {
1447 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1448 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1449 { "psrlw", MSOP_MS, 2, IbOP_I, 1, XX((void *)0), 0 },
1450 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1451 { "psraw", MSOP_MS, 2, IbOP_I, 1, XX((void *)0), 0 },
1452 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1453 { "psllw", MSOP_MS, 2, IbOP_I, 1, XX((void *)0), 0 },
1454 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1455 },
1456 /* GRP11 */
1457 {
1458 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1459 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1460 { "psrld", MSOP_MS, 2, IbOP_I, 1, XX((void *)0), 0 },
1461 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1462 { "psrad", MSOP_MS, 2, IbOP_I, 1, XX((void *)0), 0 },
1463 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1464 { "pslld", MSOP_MS, 2, IbOP_I, 1, XX((void *)0), 0 },
1465 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1466 },
1467 /* GRP12 */
1468 {
1469 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1470 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1471 { "psrlq", MSOP_MS, 2, IbOP_I, 1, XX((void *)0), 0 },
1472 { "psrldq", MSOP_MS, 2, IbOP_I, 1, XX((void *)0), 0 },
1473 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1474 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1475 { "psllq", MSOP_MS, 2, IbOP_I, 1, XX((void *)0), 0 },
1476 { "pslldq", MSOP_MS, 2, IbOP_I, 1, XX((void *)0), 0 },
1477 },
1478 /* GRP13 */
1479 {
1480 { "fxsave", OP0FAEOP_0fae, 2, XX((void *)0), 0, XX((void *)0), 0 },
1481 { "fxrstor", OP0FAEOP_0fae, 2, XX((void *)0), 0, XX((void *)0), 0 },
1482 { "ldmxcsr", OP0FAEOP_0fae, 2, XX((void *)0), 0, XX((void *)0), 0 },
1483 { "stmxcsr", OP0FAEOP_0fae, 2, XX((void *)0), 0, XX((void *)0), 0 },
1484 { "xsave", EvOP_E, 2, XX((void *)0), 0, XX((void *)0), 0 },
1485 { "xrstor", OP0FAEOP_0fae, 2, XX((void *)0), 0, XX((void *)0), 0 },
1486 { "xsaveopt", OP0FAEOP_0fae, 2, XX((void *)0), 0, XX((void *)0), 0 },
1487 { "clflush", OP0FAEOP_0fae, 2, XX((void *)0), 0, XX((void *)0), 0 },
1488 },
1489 /* GRP14 */
1490 {
1491 { "prefetchnta", EvOP_E, 2, XX((void *)0), 0, XX((void *)0), 0 },
1492 { "prefetcht0", EvOP_E, 2, XX((void *)0), 0, XX((void *)0), 0 },
1493 { "prefetcht1", EvOP_E, 2, XX((void *)0), 0, XX((void *)0), 0 },
1494 { "prefetcht2", EvOP_E, 2, XX((void *)0), 0, XX((void *)0), 0 },
1495 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1496 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1497 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1498 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1499 },
1500 /* GRPAMD */
1501 {
1502 { "prefetch", EbOP_E, 1, XX((void *)0), 0, XX((void *)0), 0 },
1503 { "prefetchw", EbOP_E, 1, XX((void *)0), 0, XX((void *)0), 0 },
1504 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1505 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1506 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1507 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1508 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1509 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1510 },
1511 /* GRPPADLCK1 */
1512 {
1513 { "xstore-rng", OP_0f07, 0, XX((void *)0), 0, XX((void *)0), 0 },
1514 { "xcrypt-ecb", OP_0f07, 0, XX((void *)0), 0, XX((void *)0), 0 },
1515 { "xcrypt-cbc", OP_0f07, 0, XX((void *)0), 0, XX((void *)0), 0 },
1516 { "xcrypt-ctr", OP_0f07, 0, XX((void *)0), 0, XX((void *)0), 0 },
1517 { "xcrypt-cfb", OP_0f07, 0, XX((void *)0), 0, XX((void *)0), 0 },
1518 { "xcrypt-ofb", OP_0f07, 0, XX((void *)0), 0, XX((void *)0), 0 },
1519 { "(bad)", OP_0f07, 0, XX((void *)0), 0, XX((void *)0), 0 },
1520 { "(bad)", OP_0f07, 0, XX((void *)0), 0, XX((void *)0), 0 },
1521 },
1522 /* GRPPADLCK2 */
1523 {
1524 { "montmul", OP_0f07, 0, XX((void *)0), 0, XX((void *)0), 0 },
1525 { "xsha1", OP_0f07, 0, XX((void *)0), 0, XX((void *)0), 0 },
1526 { "xsha256", OP_0f07, 0, XX((void *)0), 0, XX((void *)0), 0 },
1527 { "(bad)", OP_0f07, 0, XX((void *)0), 0, XX((void *)0), 0 },
1528 { "(bad)", OP_0f07, 0, XX((void *)0), 0, XX((void *)0), 0 },
1529 { "(bad)", OP_0f07, 0, XX((void *)0), 0, XX((void *)0), 0 },
1530 { "(bad)", OP_0f07, 0, XX((void *)0), 0, XX((void *)0), 0 },
1531 { "(bad)", OP_0f07, 0, XX((void *)0), 0, XX((void *)0), 0 },
1532 }
1533};
1534
1535static const struct dis386 prefix_user_table[][4] = {
1536 /* PREGRP0 */
1537 {
1538 { "addps", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1539 { "addss", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1540 { "addpd", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1541 { "addsd", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1542 },
1543 /* PREGRP1 */
1544 {
1545 { "", XMOP_XMM, 0, EXOP_EX, 2, OPSIMDOP_SIMD_Suffix, 0 }, /* See OP_SIMD_SUFFIX. */
1546 { "", XMOP_XMM, 0, EXOP_EX, 2, OPSIMDOP_SIMD_Suffix, 0 },
1547 { "", XMOP_XMM, 0, EXOP_EX, 2, OPSIMDOP_SIMD_Suffix, 0 },
1548 { "", XMOP_XMM, 0, EXOP_EX, 2, OPSIMDOP_SIMD_Suffix, 0 },
1549 },
1550 /* PREGRP2 */
1551 {
1552 { "cvtpi2ps", XMOP_XMM, 0, EMOP_EM, 2, XX((void *)0), 0 },
1553 { "cvtsi2ssY", XMOP_XMM, 0, EvOP_E, 2, XX((void *)0), 0 },
1554 { "cvtpi2pd", XMOP_XMM, 0, EMOP_EM, 2, XX((void *)0), 0 },
1555 { "cvtsi2sdY", XMOP_XMM, 0, EvOP_E, 2, XX((void *)0), 0 },
1556 },
1557 /* PREGRP3 */
1558 {
1559 { "cvtps2pi", MXOP_MMX, 0, EXOP_EX, 2, XX((void *)0), 0 },
1560 { "cvtss2siY", GvOP_G, 2, EXOP_EX, 2, XX((void *)0), 0 },
1561 { "cvtpd2pi", MXOP_MMX, 0, EXOP_EX, 2, XX((void *)0), 0 },
1562 { "cvtsd2siY", GvOP_G, 2, EXOP_EX, 2, XX((void *)0), 0 },
1563 },
1564 /* PREGRP4 */
1565 {
1566 { "cvttps2pi", MXOP_MMX, 0, EXOP_EX, 2, XX((void *)0), 0 },
1567 { "cvttss2siY", GvOP_G, 2, EXOP_EX, 2, XX((void *)0), 0 },
1568 { "cvttpd2pi", MXOP_MMX, 0, EXOP_EX, 2, XX((void *)0), 0 },
1569 { "cvttsd2siY", GvOP_G, 2, EXOP_EX, 2, XX((void *)0), 0 },
1570 },
1571 /* PREGRP5 */
1572 {
1573 { "divps", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1574 { "divss", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1575 { "divpd", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1576 { "divsd", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1577 },
1578 /* PREGRP6 */
1579 {
1580 { "maxps", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1581 { "maxss", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1582 { "maxpd", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1583 { "maxsd", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1584 },
1585 /* PREGRP7 */
1586 {
1587 { "minps", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1588 { "minss", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1589 { "minpd", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1590 { "minsd", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1591 },
1592 /* PREGRP8 */
1593 {
1594 { "movups", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1595 { "movss", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1596 { "movupd", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1597 { "movsd", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1598 },
1599 /* PREGRP9 */
1600 {
1601 { "movups", EXOP_EX, 2, XMOP_XMM, 0, XX((void *)0), 0 },
1602 { "movss", EXOP_EX, 2, XMOP_XMM, 0, XX((void *)0), 0 },
1603 { "movupd", EXOP_EX, 2, XMOP_XMM, 0, XX((void *)0), 0 },
1604 { "movsd", EXOP_EX, 2, XMOP_XMM, 0, XX((void *)0), 0 },
1605 },
1606 /* PREGRP10 */
1607 {
1608 { "mulps", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1609 { "mulss", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1610 { "mulpd", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1611 { "mulsd", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1612 },
1613 /* PREGRP11 */
1614 {
1615 { "rcpps", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1616 { "rcpss", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1617 { "(bad)", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1618 { "(bad)", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1619 },
1620 /* PREGRP12 */
1621 {
1622 { "rsqrtps", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1623 { "rsqrtss", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1624 { "(bad)", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1625 { "(bad)", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1626 },
1627 /* PREGRP13 */
1628 {
1629 { "sqrtps", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1630 { "sqrtss", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1631 { "sqrtpd", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1632 { "sqrtsd", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1633 },
1634 /* PREGRP14 */
1635 {
1636 { "subps", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1637 { "subss", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1638 { "subpd", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1639 { "subsd", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1640 },
1641 /* PREGRP15 */
1642 {
1643 { "(bad)", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1644 { "cvtdq2pd", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1645 { "cvttpd2dq", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1646 { "cvtpd2dq", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1647 },
1648 /* PREGRP16 */
1649 {
1650 { "cvtdq2ps", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1651 { "cvttps2dq",XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1652 { "cvtps2dq",XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1653 { "(bad)", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1654 },
1655 /* PREGRP17 */
1656 {
1657 { "cvtps2pd", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1658 { "cvtss2sd", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1659 { "cvtpd2ps", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1660 { "cvtsd2ss", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1661 },
1662 /* PREGRP18 */
1663 {
1664 { "maskmovq", MXOP_MMX, 0, MSOP_MS, 2, XX((void *)0), 0 },
1665 { "(bad)", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1666 { "maskmovdqu", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1667 { "(bad)", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1668 },
1669 /* PREGRP19 */
1670 {
1671 { "movq", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
1672 { "movdqu", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1673 { "movdqa", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1674 { "(bad)", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1675 },
1676 /* PREGRP20 */
1677 {
1678 { "movq", EMOP_EM, 2, MXOP_MMX, 0, XX((void *)0), 0 },
1679 { "movdqu", EXOP_EX, 2, XMOP_XMM, 0, XX((void *)0), 0 },
1680 { "movdqa", EXOP_EX, 2, XMOP_XMM, 0, XX((void *)0), 0 },
1681 { "(bad)", EXOP_EX, 2, XMOP_XMM, 0, XX((void *)0), 0 },
1682 },
1683 /* PREGRP21 */
1684 {
1685 { "(bad)", EXOP_EX, 2, XMOP_XMM, 0, XX((void *)0), 0 },
1686 { "movq2dq", XMOP_XMM, 0, MSOP_MS, 2, XX((void *)0), 0 },
1687 { "movq", EXOP_EX, 2, XMOP_XMM, 0, XX((void *)0), 0 },
1688 { "movdq2q", MXOP_MMX, 0, XSOP_XS, 2, XX((void *)0), 0 },
1689 },
1690 /* PREGRP22 */
1691 {
1692 { "pshufw", MXOP_MMX, 0, EMOP_EM, 2, IbOP_I, 1 },
1693 { "pshufhw", XMOP_XMM, 0, EXOP_EX, 2, IbOP_I, 1 },
1694 { "pshufd", XMOP_XMM, 0, EXOP_EX, 2, IbOP_I, 1 },
1695 { "pshuflw", XMOP_XMM, 0, EXOP_EX, 2, IbOP_I, 1 },
1696 },
1697 /* PREGRP23 */
1698 {
1699 { "movd", EdqOP_E, 11, MXOP_MMX, 0, XX((void *)0), 0 },
1700 { "movq", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1701 { "movd", EdqOP_E, 11, XMOP_XMM, 0, XX((void *)0), 0 },
1702 { "(bad)", EdOP_E, 4, XMOP_XMM, 0, XX((void *)0), 0 },
1703 },
1704 /* PREGRP24 */
1705 {
1706 { "(bad)", MXOP_MMX, 0, EXOP_EX, 2, XX((void *)0), 0 },
1707 { "(bad)", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1708 { "punpckhqdq", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1709 { "(bad)", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1710 },
1711 /* PREGRP25 */
1712 {
1713 { "movntq", EMOP_EM, 2, MXOP_MMX, 0, XX((void *)0), 0 },
1714 { "(bad)", EMOP_EM, 2, XMOP_XMM, 0, XX((void *)0), 0 },
1715 { "movntdq", EMOP_EM, 2, XMOP_XMM, 0, XX((void *)0), 0 },
1716 { "(bad)", EMOP_EM, 2, XMOP_XMM, 0, XX((void *)0), 0 },
1717 },
1718 /* PREGRP26 */
1719 {
1720 { "(bad)", MXOP_MMX, 0, EXOP_EX, 2, XX((void *)0), 0 },
1721 { "(bad)", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1722 { "punpcklqdq", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1723 { "(bad)", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1724 },
1725 /* PREGRP27 */
1726 {
1727 { "(bad)", MXOP_MMX, 0, EXOP_EX, 2, XX((void *)0), 0 },
1728 { "(bad)", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1729 { "addsubpd", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1730 { "addsubps", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1731 },
1732 /* PREGRP28 */
1733 {
1734 { "(bad)", MXOP_MMX, 0, EXOP_EX, 2, XX((void *)0), 0 },
1735 { "(bad)", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1736 { "haddpd", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1737 { "haddps", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1738 },
1739 /* PREGRP29 */
1740 {
1741 { "(bad)", MXOP_MMX, 0, EXOP_EX, 2, XX((void *)0), 0 },
1742 { "(bad)", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1743 { "hsubpd", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1744 { "hsubps", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1745 },
1746 /* PREGRP30 */
1747 {
1748 { "movlpX", XMOP_XMM, 0, EXOP_EX, 2, SIMD_Fixup, 'h' }, /* really only 2 operands */
1749 { "movsldup", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1750 { "movlpd", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1751 { "movddup", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1752 },
1753 /* PREGRP31 */
1754 {
1755 { "movhpX", XMOP_XMM, 0, EXOP_EX, 2, SIMD_Fixup, 'l' },
1756 { "movshdup", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1757 { "movhpd", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1758 { "(bad)", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1759 },
1760 /* PREGRP32 */
1761 {
1762 { "(bad)", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1763 { "(bad)", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1764 { "(bad)", XMOP_XMM, 0, EXOP_EX, 2, XX((void *)0), 0 },
1765 { "lddqu", XMOP_XMM, 0, MOP_M, 0, XX((void *)0), 0 },
1766 },
1767};
1768
1769static const struct dis386 x86_64_table[][2] = {
1770 {
1771 { "arpl", EwOP_E, 3, GwOP_G, 3, XX((void *)0), 0 },
1772 { "movs{||lq|xd}", GvOP_G, 2, EdOP_E, 4, XX((void *)0), 0 },
1773 },
1774};
1775
1776static const struct dis386 three_byte_table[][256] = {
1777 /* THREE_BYTE_0 */
1778 {
1779 /* 00 */
1780 { "pshufb", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
1781 { "phaddw", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
1782 { "phaddd", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
1783 { "phaddsw", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
1784 { "pmaddubsw", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
1785 { "phsubw", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
1786 { "phsubd", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
1787 { "phsubsw", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
1788 { "psignb", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
1789 { "psignw", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
1790 { "psignd", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
1791 { "pmulhrsw", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
1792 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1793 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1794 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1795 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1796 /* 10 */
1797 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1798 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1799 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1800 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1801 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1802 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1803 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1804 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1805 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1806 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1807 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1808 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1809 { "pabsb", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
1810 { "pabsw", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
1811 { "pabsd", MXOP_MMX, 0, EMOP_EM, 2, XX((void *)0), 0 },
1812 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1813 /* 20 */
1814 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1815 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1816 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1817 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1818 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1819 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1820 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1821 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1822 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1823 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1824 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1825 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1826 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1827 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1828 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1829 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1830 /* 30 */
1831 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1832 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1833 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1834 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1835 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1836 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1837 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1838 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1839 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1840 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1841 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1842 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1843 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1844 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1845 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1846 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1847 /* 40 */
1848 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1849 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1850 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1851 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1852 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1853 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1854 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1855 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1856 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1857 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1858 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1859 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1860 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1861 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1862 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1863 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1864 /* 50 */
1865 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1866 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1867 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1868 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1869 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1870 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1871 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1872 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1873 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1874 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1875 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1876 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1877 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1878 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1879 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1880 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1881 /* 60 */
1882 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1883 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1884 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1885 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1886 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1887 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1888 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1889 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1890 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1891 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1892 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1893 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1894 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1895 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1896 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1897 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1898 /* 70 */
1899 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1900 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1901 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1902 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1903 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1904 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1905 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1906 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1907 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1908 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1909 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1910 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1911 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1912 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1913 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1914 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1915 /* 80 */
1916 { "invept", OPDATAOP_data, 0, GmOP_G, 8, MqOP_M, 5 },
1917 { "invvpid", OPDATAOP_data, 0, GmOP_G, 8, MqOP_M, 5 },
1918 { "invpcid", OPDATAOP_data, 0, GmOP_G, 8, MqOP_M, 5 },
1919 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1920 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1921 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1922 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1923 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1924 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1925 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1926 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1927 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1928 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1929 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1930 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1931 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1932 /* 90 */
1933 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1934 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1935 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1936 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1937 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1938 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1939 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1940 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1941 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1942 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1943 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1944 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1945 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1946 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1947 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1948 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1949 /* a0 */
1950 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1951 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1952 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1953 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1954 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1955 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1956 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1957 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1958 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1959 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1960 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1961 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1962 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1963 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1964 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1965 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1966 /* b0 */
1967 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1968 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1969 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1970 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1971 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1972 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1973 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1974 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1975 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1976 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1977 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1978 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1979 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1980 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1981 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1982 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1983 /* c0 */
1984 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1985 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1986 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1987 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1988 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1989 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1990 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1991 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1992 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1993 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1994 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1995 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1996 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1997 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1998 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
1999 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2000 /* d0 */
2001 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2002 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2003 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2004 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2005 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2006 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2007 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2008 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2009 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2010 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2011 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2012 { "aesimc", OP0F38OP_0f38, 0, XX((void *)0), 0, XX((void *)0), 0 },
2013 { "aesenc", OP0F38OP_0f38, 0, XX((void *)0), 0, XX((void *)0), 0 },
2014 { "aesdec", OP0F38OP_0f38, 0, XX((void *)0), 0, XX((void *)0), 0 },
2015 { "aesenclast", OP0F38OP_0f38, 0, XX((void *)0), 0, XX((void *)0), 0 },
2016 { "aesdeclast", OP0F38OP_0f38, 0, XX((void *)0), 0, XX((void *)0), 0 },
2017 /* e0 */
2018 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2019 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2020 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2021 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2022 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2023 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2024 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2025 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2026 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2027 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2028 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2029 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2030 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2031 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2032 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2033 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2034 /* f0 */
2035 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2036 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2037 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2038 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2039 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2040 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2041 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2042 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2043 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2044 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2045 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2046 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2047 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2048 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2049 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2050 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 }
2051 },
2052 /* THREE_BYTE_1 */
2053 {
2054 /* 00 */
2055 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2056 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2057 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2058 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2059 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2060 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2061 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2062 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2063 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2064 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2065 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2066 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2067 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2068 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2069 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2070 { "palignr", MXOP_MMX, 0, EMOP_EM, 2, IbOP_I, 1 },
2071 /* 10 */
2072 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2073 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2074 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2075 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2076 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2077 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2078 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2079 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2080 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2081 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2082 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2083 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2084 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2085 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2086 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2087 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2088 /* 20 */
2089 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2090 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2091 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2092 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2093 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2094 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2095 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2096 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2097 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2098 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2099 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2100 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2101 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2102 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2103 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2104 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2105 /* 30 */
2106 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2107 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2108 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2109 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2110 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2111 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2112 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2113 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2114 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2115 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2116 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2117 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2118 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2119 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2120 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2121 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2122 /* 40 */
2123 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2124 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2125 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2126 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2127 { "", OP0F3AOP_0f3a, 0, XX((void *)0), 0, XX((void *)0), 0 }, /* pclmul */
2128 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2129 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2130 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2131 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2132 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2133 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2134 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2135 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2136 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2137 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2138 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2139 /* 50 */
2140 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2141 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2142 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2143 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2144 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2145 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2146 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2147 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2148 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2149 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2150 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2151 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2152 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2153 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2154 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2155 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2156 /* 60 */
2157 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2158 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2159 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2160 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2161 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2162 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2163 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2164 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2165 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2166 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2167 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2168 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2169 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2170 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2171 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2172 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2173 /* 70 */
2174 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2175 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2176 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2177 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2178 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2179 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2180 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2181 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2182 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2183 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2184 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2185 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2186 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2187 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2188 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2189 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2190 /* 80 */
2191 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2192 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2193 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2194 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2195 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2196 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2197 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2198 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2199 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2200 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2201 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2202 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2203 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2204 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2205 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2206 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2207 /* 90 */
2208 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2209 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2210 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2211 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2212 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2213 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2214 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2215 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2216 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2217 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2218 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2219 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2220 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2221 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2222 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2223 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2224 /* a0 */
2225 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2226 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2227 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2228 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2229 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2230 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2231 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2232 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2233 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2234 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2235 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2236 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2237 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2238 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2239 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2240 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2241 /* b0 */
2242 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2243 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2244 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2245 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2246 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2247 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2248 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2249 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2250 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2251 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2252 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2253 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2254 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2255 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2256 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2257 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2258 /* c0 */
2259 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2260 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2261 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2262 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2263 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2264 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2265 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2266 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2267 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2268 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2269 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2270 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2271 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2272 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2273 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2274 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2275 /* d0 */
2276 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2277 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2278 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2279 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2280 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2281 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2282 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2283 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2284 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2285 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2286 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2287 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2288 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2289 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2290 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2291 { "", OP0F3AOP_0f3a, 0, XX((void *)0), 0, XX((void *)0), 0 }, /* aeskeygenassist */
2292 /* e0 */
2293 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2294 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2295 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2296 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2297 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2298 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2299 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2300 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2301 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2302 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2303 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2304 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2305 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2306 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2307 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2308 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2309 /* f0 */
2310 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2311 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2312 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2313 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2314 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2315 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2316 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2317 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2318 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2319 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2320 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2321 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2322 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2323 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2324 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
2325 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 }
2326 },
2327};
2328
2329#define INTERNAL_DISASSEMBLER_ERROR("<internal disassembler error>") _("<internal disassembler error>")("<internal disassembler error>")
2330
2331static void
2332ckprefix (void)
2333{
2334 int newrex;
2335 rex = 0;
2336 prefixes = 0;
2337 used_prefixes = 0;
2338 rex_used = 0;
2339 while (1)
2340 {
2341 FETCH_DATA (the_info, codep + 1)((codep + 1) <= ((struct dis_private *) (the_info->private_data
))->max_fetched ? 1 : fetch_data ((the_info), (codep + 1))
)
;
2342 newrex = 0;
2343 switch (*codep)
2344 {
2345 /* REX prefixes family. */
2346 case 0x40:
2347 case 0x41:
2348 case 0x42:
2349 case 0x43:
2350 case 0x44:
2351 case 0x45:
2352 case 0x46:
2353 case 0x47:
2354 case 0x48:
2355 case 0x49:
2356 case 0x4a:
2357 case 0x4b:
2358 case 0x4c:
2359 case 0x4d:
2360 case 0x4e:
2361 case 0x4f:
2362 if (address_mode == mode_64bit)
2363 newrex = *codep;
2364 else
2365 return;
2366 break;
2367 case 0xf3:
2368 prefixes |= PREFIX_REPZ1;
2369 break;
2370 case 0xf2:
2371 prefixes |= PREFIX_REPNZ2;
2372 break;
2373 case 0xf0:
2374 prefixes |= PREFIX_LOCK4;
2375 break;
2376 case 0x2e:
2377 prefixes |= PREFIX_CS8;
2378 break;
2379 case 0x36:
2380 prefixes |= PREFIX_SS0x10;
2381 break;
2382 case 0x3e:
2383 prefixes |= PREFIX_DS0x20;
2384 break;
2385 case 0x26:
2386 prefixes |= PREFIX_ES0x40;
2387 break;
2388 case 0x64:
2389 prefixes |= PREFIX_FS0x80;
2390 break;
2391 case 0x65:
2392 prefixes |= PREFIX_GS0x100;
2393 break;
2394 case 0x66:
2395 prefixes |= PREFIX_DATA0x200;
2396 break;
2397 case 0x67:
2398 prefixes |= PREFIX_ADDR0x400;
2399 break;
2400 case FWAIT_OPCODE(0x9b):
2401 /* fwait is really an instruction. If there are prefixes
2402 before the fwait, they belong to the fwait, *not* to the
2403 following instruction. */
2404 if (prefixes || rex)
2405 {
2406 prefixes |= PREFIX_FWAIT0x800;
2407 codep++;
2408 return;
2409 }
2410 prefixes = PREFIX_FWAIT0x800;
2411 break;
2412 default:
2413 return;
2414 }
2415 /* Rex is ignored when followed by another prefix. */
2416 if (rex)
2417 {
2418 rex_used = rex;
2419 return;
2420 }
2421 rex = newrex;
2422 codep++;
2423 }
2424}
2425
2426/* Return the name of the prefix byte PREF, or NULL if PREF is not a
2427 prefix byte. */
2428
2429static const char *
2430prefix_name (int pref, int sizeflag)
2431{
2432 switch (pref)
2433 {
2434 /* REX prefixes family. */
2435 case 0x40:
2436 return "rex";
2437 case 0x41:
2438 return "rexZ";
2439 case 0x42:
2440 return "rexY";
2441 case 0x43:
2442 return "rexYZ";
2443 case 0x44:
2444 return "rexX";
2445 case 0x45:
2446 return "rexXZ";
2447 case 0x46:
2448 return "rexXY";
2449 case 0x47:
2450 return "rexXYZ";
2451 case 0x48:
2452 return "rex64";
2453 case 0x49:
2454 return "rex64Z";
2455 case 0x4a:
2456 return "rex64Y";
2457 case 0x4b:
2458 return "rex64YZ";
2459 case 0x4c:
2460 return "rex64X";
2461 case 0x4d:
2462 return "rex64XZ";
2463 case 0x4e:
2464 return "rex64XY";
2465 case 0x4f:
2466 return "rex64XYZ";
2467 case 0xf3:
2468 return "repz";
2469 case 0xf2:
2470 return "repnz";
2471 case 0xf0:
2472 return "lock";
2473 case 0x2e:
2474 return "cs";
2475 case 0x36:
2476 return "ss";
2477 case 0x3e:
2478 return "ds";
2479 case 0x26:
2480 return "es";
2481 case 0x64:
2482 return "fs";
2483 case 0x65:
2484 return "gs";
2485 case 0x66:
2486 return (sizeflag & DFLAG1) ? "data16" : "data32";
2487 case 0x67:
2488 if (address_mode == mode_64bit)
2489 return (sizeflag & AFLAG2) ? "addr32" : "addr64";
2490 else
2491 return (sizeflag & AFLAG2) ? "addr16" : "addr32";
2492 case FWAIT_OPCODE(0x9b):
2493 return "fwait";
2494 default:
2495 return NULL((void *)0);
2496 }
2497}
2498
2499static char op1out[100], op2out[100], op3out[100];
2500static int op_ad, op_index[3];
2501static int two_source_ops;
2502static bfd_vma op_address[3];
2503static bfd_vma op_riprel[3];
2504static bfd_vma start_pc;
2505
2506/*
2507 * On the 386's of 1988, the maximum length of an instruction is 15 bytes.
2508 * (see topic "Redundant prefixes" in the "Differences from 8086"
2509 * section of the "Virtual 8086 Mode" chapter.)
2510 * 'pc' should be the address of this instruction, it will
2511 * be used to print the target address if this is a relative jump or call
2512 * The function returns the length of this instruction in bytes.
2513 */
2514
2515static int intel_syntax;
2516static char open_char;
2517static char close_char;
2518static char separator_char;
2519static char scale_char;
2520
2521/* Here for backwards compatibility. When gdb stops using
2522 print_insn_i386_att and print_insn_i386_intel these functions can
2523 disappear, and print_insn_i386 be merged into print_insn. */
2524int
2525print_insn_i386_att (bfd_vma pc, disassemble_info *info)
2526{
2527 intel_syntax = 0;
2528
2529 return print_insn (pc, info);
2530}
2531
2532int
2533print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
2534{
2535 intel_syntax = 1;
2536
2537 return print_insn (pc, info);
2538}
2539
2540int
2541print_insn_i386 (bfd_vma pc, disassemble_info *info)
2542{
2543 intel_syntax = -1;
2544
2545 return print_insn (pc, info);
2546}
2547
2548static int
2549print_insn (bfd_vma pc, disassemble_info *info)
2550{
2551 const struct dis386 *dp;
2552 int i;
2553 char *first, *second, *third;
2554 int needcomma;
2555 unsigned char uses_SSE_prefix, uses_LOCK_prefix;
2556 int sizeflag;
2557 const char *p;
2558 struct dis_private priv;
2559
2560 if (info->mach == bfd_mach_x86_64_intel_syntax65
2561 || info->mach == bfd_mach_x86_6464)
2562 address_mode = mode_64bit;
2563 else
2564 address_mode = mode_32bit;
2565
2566 if (intel_syntax == -1)
2567 intel_syntax = (info->mach == bfd_mach_i386_i386_intel_syntax3
2568 || info->mach == bfd_mach_x86_64_intel_syntax65);
2569
2570 if (info->mach == bfd_mach_i386_i3861
2571 || info->mach == bfd_mach_x86_6464
2572 || info->mach == bfd_mach_i386_i386_intel_syntax3
2573 || info->mach == bfd_mach_x86_64_intel_syntax65)
2574 priv.orig_sizeflag = AFLAG2 | DFLAG1;
2575 else if (info->mach == bfd_mach_i386_i80862)
2576 priv.orig_sizeflag = 0;
2577 else
2578 abort ();
2579
2580 for (p = info->disassembler_options; p != NULL((void *)0); )
2581 {
2582 if (strncmp (p, "x86-64", 6) == 0)
2583 {
2584 address_mode = mode_64bit;
2585 priv.orig_sizeflag = AFLAG2 | DFLAG1;
2586 }
2587 else if (strncmp (p, "i386", 4) == 0)
2588 {
2589 address_mode = mode_32bit;
2590 priv.orig_sizeflag = AFLAG2 | DFLAG1;
2591 }
2592 else if (strncmp (p, "i8086", 5) == 0)
2593 {
2594 address_mode = mode_16bit;
2595 priv.orig_sizeflag = 0;
2596 }
2597 else if (strncmp (p, "intel", 5) == 0)
2598 {
2599 intel_syntax = 1;
2600 }
2601 else if (strncmp (p, "att", 3) == 0)
2602 {
2603 intel_syntax = 0;
2604 }
2605 else if (strncmp (p, "addr", 4) == 0)
2606 {
2607 if (p[4] == '1' && p[5] == '6')
2608 priv.orig_sizeflag &= ~AFLAG2;
2609 else if (p[4] == '3' && p[5] == '2')
2610 priv.orig_sizeflag |= AFLAG2;
2611 }
2612 else if (strncmp (p, "data", 4) == 0)
2613 {
2614 if (p[4] == '1' && p[5] == '6')
2615 priv.orig_sizeflag &= ~DFLAG1;
2616 else if (p[4] == '3' && p[5] == '2')
2617 priv.orig_sizeflag |= DFLAG1;
2618 }
2619 else if (strncmp (p, "suffix", 6) == 0)
2620 priv.orig_sizeflag |= SUFFIX_ALWAYS4;
2621
2622 p = strchr (p, ',');
2623 if (p != NULL((void *)0))
2624 p++;
2625 }
2626
2627 if (intel_syntax)
2628 {
2629 names64 = intel_names64;
2630 names32 = intel_names32;
2631 names16 = intel_names16;
2632 names8 = intel_names8;
2633 names8rex = intel_names8rex;
2634 names_seg = intel_names_seg;
2635 index16 = intel_index16;
2636 open_char = '[';
2637 close_char = ']';
2638 separator_char = '+';
2639 scale_char = '*';
2640 }
2641 else
2642 {
2643 names64 = att_names64;
2644 names32 = att_names32;
2645 names16 = att_names16;
2646 names8 = att_names8;
2647 names8rex = att_names8rex;
2648 names_seg = att_names_seg;
2649 index16 = att_index16;
2650 open_char = '(';
2651 close_char = ')';
2652 separator_char = ',';
2653 scale_char = ',';
2654 }
2655
2656 /* The output looks better if we put 7 bytes on a line, since that
2657 puts most long word instructions on a single line. */
2658 info->bytes_per_line = 7;
2659
2660 info->private_data = &priv;
2661 priv.max_fetched = priv.the_buffer;
2662 priv.insn_start = pc;
2663
2664 obuf[0] = 0;
2665 op1out[0] = 0;
2666 op2out[0] = 0;
2667 op3out[0] = 0;
2668
2669 op_index[0] = op_index[1] = op_index[2] = -1;
2670
2671 the_info = info;
2672 start_pc = pc;
2673 start_codep = priv.the_buffer;
2674 codep = priv.the_buffer;
2675
2676 if (setjmp (priv.bailout) != 0)
2677 {
2678 const char *name;
2679
2680 /* Getting here means we tried for data but didn't get it. That
2681 means we have an incomplete instruction of some sort. Just
2682 print the first byte as a prefix or a .byte pseudo-op. */
2683 if (codep > priv.the_buffer)
2684 {
2685 name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
2686 if (name != NULL((void *)0))
2687 (*info->fprintf_func) (info->stream, "%s", name);
2688 else
2689 {
2690 /* Just print the first byte as a .byte instruction. */
2691 (*info->fprintf_func) (info->stream, ".byte 0x%x",
2692 (unsigned int) priv.the_buffer[0]);
2693 }
2694
2695 return 1;
2696 }
2697
2698 return -1;
2699 }
2700
2701 obufp = obuf;
2702 ckprefix ();
2703
2704 insn_codep = codep;
2705 sizeflag = priv.orig_sizeflag;
2706
2707 FETCH_DATA (info, codep + 1)((codep + 1) <= ((struct dis_private *) (info->private_data
))->max_fetched ? 1 : fetch_data ((info), (codep + 1)))
;
2708 two_source_ops = (*codep == 0x62) || (*codep == 0xc8);
2709
2710 if (((prefixes & PREFIX_FWAIT0x800)
2711 && ((*codep < 0xd8) || (*codep > 0xdf)))
2712 || (rex && rex_used))
2713 {
2714 const char *name;
2715
2716 /* fwait not followed by floating point instruction, or rex followed
2717 by other prefixes. Print the first prefix. */
2718 name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
2719 if (name == NULL((void *)0))
2720 name = INTERNAL_DISASSEMBLER_ERROR("<internal disassembler error>");
2721 (*info->fprintf_func) (info->stream, "%s", name);
2722 return 1;
2723 }
2724
2725 if (*codep == 0x0f)
2726 {
2727 FETCH_DATA (info, codep + 2)((codep + 2) <= ((struct dis_private *) (info->private_data
))->max_fetched ? 1 : fetch_data ((info), (codep + 2)))
;
2728 dp = &dis386_twobyte[*++codep];
2729 need_modrm = twobyte_has_modrm[*codep];
2730 uses_SSE_prefix = twobyte_uses_SSE_prefix[*codep];
2731 uses_LOCK_prefix = (*codep & ~0x02) == 0x20;
2732 }
2733 else
2734 {
2735 dp = &dis386[*codep];
2736 need_modrm = onebyte_has_modrm[*codep];
2737 uses_SSE_prefix = 0;
2738 uses_LOCK_prefix = 0;
2739 }
2740 codep++;
2741
2742 if (!uses_SSE_prefix && (prefixes & PREFIX_REPZ1))
2743 {
2744 oappend ("repz ");
2745 used_prefixes |= PREFIX_REPZ1;
2746 }
2747 if (!uses_SSE_prefix && (prefixes & PREFIX_REPNZ2))
2748 {
2749 oappend ("repnz ");
2750 used_prefixes |= PREFIX_REPNZ2;
2751 }
2752 if (!uses_LOCK_prefix && (prefixes & PREFIX_LOCK4))
2753 {
2754 oappend ("lock ");
2755 used_prefixes |= PREFIX_LOCK4;
2756 }
2757
2758 if (prefixes & PREFIX_ADDR0x400)
2759 {
2760 sizeflag ^= AFLAG2;
2761 if (dp->bytemode3 != loop_jcxz_mode10 || intel_syntax)
2762 {
2763 if ((sizeflag & AFLAG2) || address_mode == mode_64bit)
2764 oappend ("addr32 ");
2765 else
2766 oappend ("addr16 ");
2767 used_prefixes |= PREFIX_ADDR0x400;
2768 }
2769 }
2770
2771 if (!uses_SSE_prefix && (prefixes & PREFIX_DATA0x200))
2772 {
2773 sizeflag ^= DFLAG1;
2774 if (dp->bytemode3 == cond_jump_mode9
2775 && dp->bytemode1 == v_mode2
2776 && !intel_syntax)
2777 {
2778 if (sizeflag & DFLAG1)
2779 oappend ("data32 ");
2780 else
2781 oappend ("data16 ");
2782 used_prefixes |= PREFIX_DATA0x200;
2783 }
2784 }
2785
2786 if (dp->name == NULL((void *)0) && dp->bytemode1 == IS_3BYTE_OPCODE5)
2787 {
2788 FETCH_DATA (info, codep + 2)((codep + 2) <= ((struct dis_private *) (info->private_data
))->max_fetched ? 1 : fetch_data ((info), (codep + 2)))
;
2789 dp = &three_byte_table[dp->bytemode2][*codep++];
2790 mod = (*codep >> 6) & 3;
2791 reg = (*codep >> 3) & 7;
2792 rm = *codep & 7;
2793 }
2794 else if (need_modrm)
2795 {
2796 FETCH_DATA (info, codep + 1)((codep + 1) <= ((struct dis_private *) (info->private_data
))->max_fetched ? 1 : fetch_data ((info), (codep + 1)))
;
2797 mod = (*codep >> 6) & 3;
2798 reg = (*codep >> 3) & 7;
2799 rm = *codep & 7;
2800 }
2801
2802 if (dp->name == NULL((void *)0) && dp->bytemode1 == FLOATCODE1)
2803 {
2804 dofloat (sizeflag);
2805 }
2806 else
2807 {
2808 int index;
2809 if (dp->name == NULL((void *)0))
2810 {
2811 switch (dp->bytemode1)
2812 {
2813 case USE_GROUPS2:
2814 dp = &grps[dp->bytemode2][reg];
2815 break;
2816
2817 case USE_PREFIX_USER_TABLE3:
2818 index = 0;
2819 used_prefixes |= (prefixes & PREFIX_REPZ1);
2820 if (prefixes & PREFIX_REPZ1)
2821 index = 1;
2822 else
2823 {
2824 used_prefixes |= (prefixes & PREFIX_DATA0x200);
2825 if (prefixes & PREFIX_DATA0x200)
2826 index = 2;
2827 else
2828 {
2829 used_prefixes |= (prefixes & PREFIX_REPNZ2);
2830 if (prefixes & PREFIX_REPNZ2)
2831 index = 3;
2832 }
2833 }
2834 dp = &prefix_user_table[dp->bytemode2][index];
2835 break;
2836
2837 case X86_64_SPECIAL4:
2838 index = address_mode == mode_64bit ? 1 : 0;
2839 dp = &x86_64_table[dp->bytemode2][index];
2840 break;
2841
2842 default:
2843 oappend (INTERNAL_DISASSEMBLER_ERROR("<internal disassembler error>"));
2844 break;
2845 }
2846 }
2847
2848 if (putop (dp->name, sizeflag) == 0)
2849 {
2850 obufp = op1out;
2851 op_ad = 2;
2852 if (dp->op1)
2853 (*dp->op1) (dp->bytemode1, sizeflag);
2854
2855 obufp = op2out;
2856 op_ad = 1;
2857 if (dp->op2)
2858 (*dp->op2) (dp->bytemode2, sizeflag);
2859
2860 obufp = op3out;
2861 op_ad = 0;
2862 if (dp->op3)
2863 (*dp->op3) (dp->bytemode3, sizeflag);
2864 }
2865 }
2866
2867 /* See if any prefixes were not used. If so, print the first one
2868 separately. If we don't do this, we'll wind up printing an
2869 instruction stream which does not precisely correspond to the
2870 bytes we are disassembling. */
2871 if ((prefixes & ~used_prefixes) != 0)
2872 {
2873 const char *name;
2874
2875 name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
2876 if (name == NULL((void *)0))
2877 name = INTERNAL_DISASSEMBLER_ERROR("<internal disassembler error>");
2878 (*info->fprintf_func) (info->stream, "%s", name);
2879 return 1;
2880 }
2881 if (rex & ~rex_used)
2882 {
2883 const char *name;
2884 name = prefix_name (rex | 0x40, priv.orig_sizeflag);
2885 if (name == NULL((void *)0))
2886 name = INTERNAL_DISASSEMBLER_ERROR("<internal disassembler error>");
2887 (*info->fprintf_func) (info->stream, "%s ", name);
2888 }
2889
2890 obufp = obuf + strlen (obuf);
2891 for (i = strlen (obuf); i < 6; i++)
2892 oappend (" ");
2893 oappend (" ");
2894 (*info->fprintf_func) (info->stream, "%s", obuf);
2895
2896 /* The enter and bound instructions are printed with operands in the same
2897 order as the intel book; everything else is printed in reverse order. */
2898 if (intel_syntax || two_source_ops)
2899 {
2900 first = op1out;
2901 second = op2out;
2902 third = op3out;
2903 op_ad = op_index[0];
2904 op_index[0] = op_index[2];
2905 op_index[2] = op_ad;
2906 }
2907 else
2908 {
2909 first = op3out;
2910 second = op2out;
2911 third = op1out;
2912 }
2913 needcomma = 0;
2914 if (*first)
2915 {
2916 if (op_index[0] != -1 && !op_riprel[0])
2917 (*info->print_address_func) ((bfd_vma) op_address[op_index[0]], info);
2918 else
2919 (*info->fprintf_func) (info->stream, "%s", first);
2920 needcomma = 1;
2921 }
2922 if (*second)
2923 {
2924 if (needcomma)
2925 (*info->fprintf_func) (info->stream, ",");
2926 if (op_index[1] != -1 && !op_riprel[1])
2927 (*info->print_address_func) ((bfd_vma) op_address[op_index[1]], info);
2928 else
2929 (*info->fprintf_func) (info->stream, "%s", second);
2930 needcomma = 1;
2931 }
2932 if (*third)
2933 {
2934 if (needcomma)
2935 (*info->fprintf_func) (info->stream, ",");
2936 if (op_index[2] != -1 && !op_riprel[2])
2937 (*info->print_address_func) ((bfd_vma) op_address[op_index[2]], info);
2938 else
2939 (*info->fprintf_func) (info->stream, "%s", third);
2940 }
2941 for (i = 0; i < 3; i++)
2942 if (op_index[i] != -1 && op_riprel[i])
2943 {
2944 (*info->fprintf_func) (info->stream, " # ");
2945 (*info->print_address_func) ((bfd_vma) (start_pc + codep - start_codep
2946 + op_address[op_index[i]]), info);
2947 }
2948 return codep - priv.the_buffer;
2949}
2950
2951static const char *float_mem[] = {
2952 /* d8 */
2953 "fadd{s||s|}",
2954 "fmul{s||s|}",
2955 "fcom{s||s|}",
2956 "fcomp{s||s|}",
2957 "fsub{s||s|}",
2958 "fsubr{s||s|}",
2959 "fdiv{s||s|}",
2960 "fdivr{s||s|}",
2961 /* d9 */
2962 "fld{s||s|}",
2963 "(bad)",
2964 "fst{s||s|}",
2965 "fstp{s||s|}",
2966 "fldenvIC",
2967 "fldcw",
2968 "fNstenvIC",
2969 "fNstcw",
2970 /* da */
2971 "fiadd{l||l|}",
2972 "fimul{l||l|}",
2973 "ficom{l||l|}",
2974 "ficomp{l||l|}",
2975 "fisub{l||l|}",
2976 "fisubr{l||l|}",
2977 "fidiv{l||l|}",
2978 "fidivr{l||l|}",
2979 /* db */
2980 "fild{l||l|}",
2981 "fisttp{l||l|}",
2982 "fist{l||l|}",
2983 "fistp{l||l|}",
2984 "(bad)",
2985 "fld{t||t|}",
2986 "(bad)",
2987 "fstp{t||t|}",
2988 /* dc */
2989 "fadd{l||l|}",
2990 "fmul{l||l|}",
2991 "fcom{l||l|}",
2992 "fcomp{l||l|}",
2993 "fsub{l||l|}",
2994 "fsubr{l||l|}",
2995 "fdiv{l||l|}",
2996 "fdivr{l||l|}",
2997 /* dd */
2998 "fld{l||l|}",
2999 "fisttp{ll||ll|}",
3000 "fst{l||l|}",
3001 "fstp{l||l|}",
3002 "frstorIC",
3003 "(bad)",
3004 "fNsaveIC",
3005 "fNstsw",
3006 /* de */
3007 "fiadd",
3008 "fimul",
3009 "ficom",
3010 "ficomp",
3011 "fisub",
3012 "fisubr",
3013 "fidiv",
3014 "fidivr",
3015 /* df */
3016 "fild",
3017 "fisttp",
3018 "fist",
3019 "fistp",
3020 "fbld",
3021 "fild{ll||ll|}",
3022 "fbstp",
3023 "fistp{ll||ll|}",
3024};
3025
3026static const unsigned char float_mem_mode[] = {
3027 /* d8 */
3028 d_mode4,
3029 d_mode4,
3030 d_mode4,
3031 d_mode4,
3032 d_mode4,
3033 d_mode4,
3034 d_mode4,
3035 d_mode4,
3036 /* d9 */
3037 d_mode4,
3038 0,
3039 d_mode4,
3040 d_mode4,
3041 0,
3042 w_mode3,
3043 0,
3044 w_mode3,
3045 /* da */
3046 d_mode4,
3047 d_mode4,
3048 d_mode4,
3049 d_mode4,
3050 d_mode4,
3051 d_mode4,
3052 d_mode4,
3053 d_mode4,
3054 /* db */
3055 d_mode4,
3056 d_mode4,
3057 d_mode4,
3058 d_mode4,
3059 0,
3060 t_mode6,
3061 0,
3062 t_mode6,
3063 /* dc */
3064 q_mode5,
3065 q_mode5,
3066 q_mode5,
3067 q_mode5,
3068 q_mode5,
3069 q_mode5,
3070 q_mode5,
3071 q_mode5,
3072 /* dd */
3073 q_mode5,
3074 q_mode5,
3075 q_mode5,
3076 q_mode5,
3077 0,
3078 0,
3079 0,
3080 w_mode3,
3081 /* de */
3082 w_mode3,
3083 w_mode3,
3084 w_mode3,
3085 w_mode3,
3086 w_mode3,
3087 w_mode3,
3088 w_mode3,
3089 w_mode3,
3090 /* df */
3091 w_mode3,
3092 w_mode3,
3093 w_mode3,
3094 w_mode3,
3095 t_mode6,
3096 q_mode5,
3097 t_mode6,
3098 q_mode5
3099};
3100
3101#define STOP_ST, 0 OP_ST, 0
3102#define STiOP_STi, 0 OP_STi, 0
3103
3104#define FGRPd9_2((void *)0), ((void *)0), 0, ((void *)0), 0, ((void *)0), 0 NULL((void *)0), NULL((void *)0), 0, NULL((void *)0), 0, NULL((void *)0), 0
3105#define FGRPd9_4((void *)0), ((void *)0), 1, ((void *)0), 0, ((void *)0), 0 NULL((void *)0), NULL((void *)0), 1, NULL((void *)0), 0, NULL((void *)0), 0
3106#define FGRPd9_5((void *)0), ((void *)0), 2, ((void *)0), 0, ((void *)0), 0 NULL((void *)0), NULL((void *)0), 2, NULL((void *)0), 0, NULL((void *)0), 0
3107#define FGRPd9_6((void *)0), ((void *)0), 3, ((void *)0), 0, ((void *)0), 0 NULL((void *)0), NULL((void *)0), 3, NULL((void *)0), 0, NULL((void *)0), 0
3108#define FGRPd9_7((void *)0), ((void *)0), 4, ((void *)0), 0, ((void *)0), 0 NULL((void *)0), NULL((void *)0), 4, NULL((void *)0), 0, NULL((void *)0), 0
3109#define FGRPda_5((void *)0), ((void *)0), 5, ((void *)0), 0, ((void *)0), 0 NULL((void *)0), NULL((void *)0), 5, NULL((void *)0), 0, NULL((void *)0), 0
3110#define FGRPdb_4((void *)0), ((void *)0), 6, ((void *)0), 0, ((void *)0), 0 NULL((void *)0), NULL((void *)0), 6, NULL((void *)0), 0, NULL((void *)0), 0
3111#define FGRPde_3((void *)0), ((void *)0), 7, ((void *)0), 0, ((void *)0), 0 NULL((void *)0), NULL((void *)0), 7, NULL((void *)0), 0, NULL((void *)0), 0
3112#define FGRPdf_4((void *)0), ((void *)0), 8, ((void *)0), 0, ((void *)0), 0 NULL((void *)0), NULL((void *)0), 8, NULL((void *)0), 0, NULL((void *)0), 0
3113
3114static const struct dis386 float_reg[][8] = {
3115 /* d8 */
3116 {
3117 { "fadd", STOP_ST, 0, STiOP_STi, 0, XX((void *)0), 0 },
3118 { "fmul", STOP_ST, 0, STiOP_STi, 0, XX((void *)0), 0 },
3119 { "fcom", STiOP_STi, 0, XX((void *)0), 0, XX((void *)0), 0 },
3120 { "fcomp", STiOP_STi, 0, XX((void *)0), 0, XX((void *)0), 0 },
3121 { "fsub", STOP_ST, 0, STiOP_STi, 0, XX((void *)0), 0 },
3122 { "fsubr", STOP_ST, 0, STiOP_STi, 0, XX((void *)0), 0 },
3123 { "fdiv", STOP_ST, 0, STiOP_STi, 0, XX((void *)0), 0 },
3124 { "fdivr", STOP_ST, 0, STiOP_STi, 0, XX((void *)0), 0 },
3125 },
3126 /* d9 */
3127 {
3128 { "fld", STiOP_STi, 0, XX((void *)0), 0, XX((void *)0), 0 },
3129 { "fxch", STiOP_STi, 0, XX((void *)0), 0, XX((void *)0), 0 },
3130 { FGRPd9_2((void *)0), ((void *)0), 0, ((void *)0), 0, ((void *)0), 0 },
3131 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
3132 { FGRPd9_4((void *)0), ((void *)0), 1, ((void *)0), 0, ((void *)0), 0 },
3133 { FGRPd9_5((void *)0), ((void *)0), 2, ((void *)0), 0, ((void *)0), 0 },
3134 { FGRPd9_6((void *)0), ((void *)0), 3, ((void *)0), 0, ((void *)0), 0 },
3135 { FGRPd9_7((void *)0), ((void *)0), 4, ((void *)0), 0, ((void *)0), 0 },
3136 },
3137 /* da */
3138 {
3139 { "fcmovb", STOP_ST, 0, STiOP_STi, 0, XX((void *)0), 0 },
3140 { "fcmove", STOP_ST, 0, STiOP_STi, 0, XX((void *)0), 0 },
3141 { "fcmovbe",STOP_ST, 0, STiOP_STi, 0, XX((void *)0), 0 },
3142 { "fcmovu", STOP_ST, 0, STiOP_STi, 0, XX((void *)0), 0 },
3143 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
3144 { FGRPda_5((void *)0), ((void *)0), 5, ((void *)0), 0, ((void *)0), 0 },
3145 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
3146 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
3147 },
3148 /* db */
3149 {
3150 { "fcmovnb",STOP_ST, 0, STiOP_STi, 0, XX((void *)0), 0 },
3151 { "fcmovne",STOP_ST, 0, STiOP_STi, 0, XX((void *)0), 0 },
3152 { "fcmovnbe",STOP_ST, 0, STiOP_STi, 0, XX((void *)0), 0 },
3153 { "fcmovnu",STOP_ST, 0, STiOP_STi, 0, XX((void *)0), 0 },
3154 { FGRPdb_4((void *)0), ((void *)0), 6, ((void *)0), 0, ((void *)0), 0 },
3155 { "fucomi", STOP_ST, 0, STiOP_STi, 0, XX((void *)0), 0 },
3156 { "fcomi", STOP_ST, 0, STiOP_STi, 0, XX((void *)0), 0 },
3157 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
3158 },
3159 /* dc */
3160 {
3161 { "fadd", STiOP_STi, 0, STOP_ST, 0, XX((void *)0), 0 },
3162 { "fmul", STiOP_STi, 0, STOP_ST, 0, XX((void *)0), 0 },
3163 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
3164 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
3165#if UNIXWARE_COMPAT1
3166 { "fsub", STiOP_STi, 0, STOP_ST, 0, XX((void *)0), 0 },
3167 { "fsubr", STiOP_STi, 0, STOP_ST, 0, XX((void *)0), 0 },
3168 { "fdiv", STiOP_STi, 0, STOP_ST, 0, XX((void *)0), 0 },
3169 { "fdivr", STiOP_STi, 0, STOP_ST, 0, XX((void *)0), 0 },
3170#else
3171 { "fsubr", STiOP_STi, 0, STOP_ST, 0, XX((void *)0), 0 },
3172 { "fsub", STiOP_STi, 0, STOP_ST, 0, XX((void *)0), 0 },
3173 { "fdivr", STiOP_STi, 0, STOP_ST, 0, XX((void *)0), 0 },
3174 { "fdiv", STiOP_STi, 0, STOP_ST, 0, XX((void *)0), 0 },
3175#endif
3176 },
3177 /* dd */
3178 {
3179 { "ffree", STiOP_STi, 0, XX((void *)0), 0, XX((void *)0), 0 },
3180 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
3181 { "fst", STiOP_STi, 0, XX((void *)0), 0, XX((void *)0), 0 },
3182 { "fstp", STiOP_STi, 0, XX((void *)0), 0, XX((void *)0), 0 },
3183 { "fucom", STiOP_STi, 0, XX((void *)0), 0, XX((void *)0), 0 },
3184 { "fucomp", STiOP_STi, 0, XX((void *)0), 0, XX((void *)0), 0 },
3185 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
3186 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
3187 },
3188 /* de */
3189 {
3190 { "faddp", STiOP_STi, 0, STOP_ST, 0, XX((void *)0), 0 },
3191 { "fmulp", STiOP_STi, 0, STOP_ST, 0, XX((void *)0), 0 },
3192 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
3193 { FGRPde_3((void *)0), ((void *)0), 7, ((void *)0), 0, ((void *)0), 0 },
3194#if UNIXWARE_COMPAT1
3195 { "fsubp", STiOP_STi, 0, STOP_ST, 0, XX((void *)0), 0 },
3196 { "fsubrp", STiOP_STi, 0, STOP_ST, 0, XX((void *)0), 0 },
3197 { "fdivp", STiOP_STi, 0, STOP_ST, 0, XX((void *)0), 0 },
3198 { "fdivrp", STiOP_STi, 0, STOP_ST, 0, XX((void *)0), 0 },
3199#else
3200 { "fsubrp", STiOP_STi, 0, STOP_ST, 0, XX((void *)0), 0 },
3201 { "fsubp", STiOP_STi, 0, STOP_ST, 0, XX((void *)0), 0 },
3202 { "fdivrp", STiOP_STi, 0, STOP_ST, 0, XX((void *)0), 0 },
3203 { "fdivp", STiOP_STi, 0, STOP_ST, 0, XX((void *)0), 0 },
3204#endif
3205 },
3206 /* df */
3207 {
3208 { "ffreep", STiOP_STi, 0, XX((void *)0), 0, XX((void *)0), 0 },
3209 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
3210 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
3211 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
3212 { FGRPdf_4((void *)0), ((void *)0), 8, ((void *)0), 0, ((void *)0), 0 },
3213 { "fucomip",STOP_ST, 0, STiOP_STi, 0, XX((void *)0), 0 },
3214 { "fcomip", STOP_ST, 0, STiOP_STi, 0, XX((void *)0), 0 },
3215 { "(bad)", XX((void *)0), 0, XX((void *)0), 0, XX((void *)0), 0 },
3216 },
3217};
3218
3219static char *fgrps[][8] = {
3220 /* d9_2 0 */
3221 {
3222 "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
3223 },
3224
3225 /* d9_4 1 */
3226 {
3227 "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
3228 },
3229
3230 /* d9_5 2 */
3231 {
3232 "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
3233 },
3234
3235 /* d9_6 3 */
3236 {
3237 "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
3238 },
3239
3240 /* d9_7 4 */
3241 {
3242 "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
3243 },
3244
3245 /* da_5 5 */
3246 {
3247 "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
3248 },
3249
3250 /* db_4 6 */
3251 {
3252 "feni(287 only)","fdisi(287 only)","fNclex","fNinit",
3253 "fNsetpm(287 only)","(bad)","(bad)","(bad)",
3254 },
3255
3256 /* de_3 7 */
3257 {
3258 "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
3259 },
3260
3261 /* df_4 8 */
3262 {
3263 "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
3264 },
3265};
3266
3267static void
3268dofloat (int sizeflag)
3269{
3270 const struct dis386 *dp;
3271 unsigned char floatop;
3272
3273 floatop = codep[-1];
3274
3275 if (mod != 3)
3276 {
3277 int fp_indx = (floatop - 0xd8) * 8 + reg;
3278
3279 putop (float_mem[fp_indx], sizeflag);
3280 obufp = op1out;
3281 op_ad = 2;
3282 OP_E (float_mem_mode[fp_indx], sizeflag);
3283 return;
3284 }
3285 /* Skip mod/rm byte. */
3286 MODRM_CHECKif (!need_modrm) abort ();
3287 codep++;
3288
3289 dp = &float_reg[floatop - 0xd8][reg];
3290 if (dp->name == NULL((void *)0))
3291 {
3292 putop (fgrps[dp->bytemode1][rm], sizeflag);
3293
3294 /* Instruction fnstsw is only one with strange arg. */
3295 if (floatop == 0xdf && codep[-1] == 0xe0)
3296 strcpy (op1out, names16[0]);
3297 }
3298 else
3299 {
3300 putop (dp->name, sizeflag);
3301
3302 obufp = op1out;
3303 op_ad = 2;
3304 if (dp->op1)
3305 (*dp->op1) (dp->bytemode1, sizeflag);
3306
3307 obufp = op2out;
3308 op_ad = 1;
3309 if (dp->op2)
3310 (*dp->op2) (dp->bytemode2, sizeflag);
3311 }
3312}
3313
3314static void
3315OP_ST (int bytemode ATTRIBUTE_UNUSED__attribute__ ((__unused__)), int sizeflag ATTRIBUTE_UNUSED__attribute__ ((__unused__)))
3316{
3317 oappend (&"%st"[intel_syntax]);
3318}
3319
3320static void
3321OP_STi (int bytemode ATTRIBUTE_UNUSED__attribute__ ((__unused__)), int sizeflag ATTRIBUTE_UNUSED__attribute__ ((__unused__)))
3322{
3323 sprintf (scratchbuf, "%%st(%d)", rm);
3324 oappend (scratchbuf + intel_syntax);
3325}
3326
3327/* Capital letters in template are macros. */
3328static int
3329putop (const char *template, int sizeflag)
3330{
3331 const char *p;
3332 int alt = 0;
3333
3334 for (p = template; *p; p++)
3335 {
3336 switch (*p)
3337 {
3338 default:
3339 *obufp++ = *p;
3340 break;
3341 case '{':
3342 alt = 0;
3343 if (intel_syntax)
3344 alt += 1;
3345 if (address_mode == mode_64bit)
3346 alt += 2;
3347 while (alt != 0)
3348 {
3349 while (*++p != '|')
3350 {
3351 if (*p == '}')
3352 {
3353 /* Alternative not valid. */
3354 strcpy (obuf, "(bad)");
3355 obufp = obuf + 5;
3356 return 1;
3357 }
3358 else if (*p == '\0')
3359 abort ();
3360 }
3361 alt--;
3362 }
3363 /* Fall through. */
3364 case 'I':
3365 alt = 1;
3366 continue;
3367 case '|':
3368 while (*++p != '}')
3369 {
3370 if (*p == '\0')
3371 abort ();
3372 }
3373 break;
3374 case '}':
3375 break;
3376 case 'A':
3377 if (intel_syntax)
3378 break;
3379 if (mod != 3 || (sizeflag & SUFFIX_ALWAYS4))
3380 *obufp++ = 'b';
3381 break;
3382 case 'B':
3383 if (intel_syntax)
3384 break;
3385 if (sizeflag & SUFFIX_ALWAYS4)
3386 *obufp++ = 'b';
3387 break;
3388 case 'C':
3389 if (intel_syntax && !alt)
3390 break;
3391 if ((prefixes & PREFIX_DATA0x200) || (sizeflag & SUFFIX_ALWAYS4))
3392 {
3393 if (sizeflag & DFLAG1)
3394 *obufp++ = intel_syntax ? 'd' : 'l';
3395 else
3396 *obufp++ = intel_syntax ? 'w' : 's';
3397 used_prefixes |= (prefixes & PREFIX_DATA0x200);
3398 }
3399 break;
3400 case 'E': /* For jcxz/jecxz */
3401 if (address_mode == mode_64bit)
3402 {
3403 if (sizeflag & AFLAG2)
3404 *obufp++ = 'r';
3405 else
3406 *obufp++ = 'e';
3407 }
3408 else
3409 if (sizeflag & AFLAG2)
3410 *obufp++ = 'e';
3411 used_prefixes |= (prefixes & PREFIX_ADDR0x400);
3412 break;
3413 case 'F':
3414 if (intel_syntax)
3415 break;
3416 if ((prefixes & PREFIX_ADDR0x400) || (sizeflag & SUFFIX_ALWAYS4))
3417 {
3418 if (sizeflag & AFLAG2)
3419 *obufp++ = address_mode == mode_64bit ? 'q' : 'l';
3420 else
3421 *obufp++ = address_mode == mode_64bit ? 'l' : 'w';
3422 used_prefixes |= (prefixes & PREFIX_ADDR0x400);
3423 }
3424 break;
3425 case 'H':
3426 if (intel_syntax)
3427 break;
3428 if ((prefixes & (PREFIX_CS8 | PREFIX_DS0x20)) == PREFIX_CS8
3429 || (prefixes & (PREFIX_CS8 | PREFIX_DS0x20)) == PREFIX_DS0x20)
3430 {
3431 used_prefixes |= prefixes & (PREFIX_CS8 | PREFIX_DS0x20);
3432 *obufp++ = ',';
3433 *obufp++ = 'p';
3434 if (prefixes & PREFIX_DS0x20)
3435 *obufp++ = 't';
3436 else
3437 *obufp++ = 'n';
3438 }
3439 break;
3440 case 'J':
3441 if (intel_syntax)
3442 break;
3443 *obufp++ = 'l';
3444 break;
3445 case 'Z':
3446 if (intel_syntax)
3447 break;
3448 if (address_mode == mode_64bit && (sizeflag & SUFFIX_ALWAYS4))
3449 {
3450 *obufp++ = 'q';
3451 break;
3452 }
3453 /* Fall through. */
3454 case 'L':
3455 if (intel_syntax)
3456 break;
3457 if (sizeflag & SUFFIX_ALWAYS4)
3458 *obufp++ = 'l';
3459 break;
3460 case 'N':
3461 if ((prefixes & PREFIX_FWAIT0x800) == 0)
3462 *obufp++ = 'n';
3463 else
3464 used_prefixes |= PREFIX_FWAIT0x800;
3465 break;
3466 case 'O':
3467 USED_REX (REX_MODE64){ if (8) rex_used |= (rex & 8) ? (8) | 0x40 : 0; else rex_used
|= 0x40; }
;
3468 if (rex & REX_MODE648)
3469 *obufp++ = 'o';
3470 else
3471 *obufp++ = 'd';
3472 break;
3473 case 'T':
3474 if (intel_syntax)
3475 break;
3476 if (address_mode == mode_64bit && (sizeflag & DFLAG1))
3477 {
3478 *obufp++ = 'q';
3479 break;
3480 }
3481 /* Fall through. */
3482 case 'P':
3483 if (intel_syntax)
3484 break;
3485 if ((prefixes & PREFIX_DATA0x200)
3486 || (rex & REX_MODE648)
3487 || (sizeflag & SUFFIX_ALWAYS4))
3488 {
3489 USED_REX (REX_MODE64){ if (8) rex_used |= (rex & 8) ? (8) | 0x40 : 0; else rex_used
|= 0x40; }
;
3490 if (rex & REX_MODE648)
3491 *obufp++ = 'q';
3492 else
3493 {
3494 if (sizeflag & DFLAG1)
3495 *obufp++ = 'l';
3496 else
3497 *obufp++ = 'w';
3498 }
3499 used_prefixes |= (prefixes & PREFIX_DATA0x200);
3500 }
3501 break;
3502 case 'U':
3503 if (intel_syntax)
3504 break;
3505 if (address_mode == mode_64bit && (sizeflag & DFLAG1))
3506 {
3507 if (mod != 3 || (sizeflag & SUFFIX_ALWAYS4))
3508 *obufp++ = 'q';
3509 break;
3510 }
3511 /* Fall through. */
3512 case 'Q':
3513 if (intel_syntax && !alt)
3514 break;
3515 USED_REX (REX_MODE64){ if (8) rex_used |= (rex & 8) ? (8) | 0x40 : 0; else rex_used
|= 0x40; }
;
3516 if (mod != 3 || (sizeflag & SUFFIX_ALWAYS4))
3517 {
3518 if (rex & REX_MODE648)
3519 *obufp++ = 'q';
3520 else
3521 {
3522 if (sizeflag & DFLAG1)
3523 *obufp++ = intel_syntax ? 'd' : 'l';
3524 else
3525 *obufp++ = 'w';
3526 }
3527 used_prefixes |= (prefixes & PREFIX_DATA0x200);
3528 }
3529 break;
3530 case 'R':
3531 USED_REX (REX_MODE64){ if (8) rex_used |= (rex & 8) ? (8) | 0x40 : 0; else rex_used
|= 0x40; }
;
3532 if (intel_syntax)
3533 {
3534 if (rex & REX_MODE648)
3535 {
3536 *obufp++ = 'q';
3537 *obufp++ = 't';
3538 }
3539 else if (sizeflag & DFLAG1)
3540 {
3541 *obufp++ = 'd';
3542 *obufp++ = 'q';
3543 }
3544 else
3545 {
3546 *obufp++ = 'w';
3547 *obufp++ = 'd';
3548 }
3549 }
3550 else
3551 {
3552 if (rex & REX_MODE648)
3553 *obufp++ = 'q';
3554 else if (sizeflag & DFLAG1)
3555 *obufp++ = 'l';
3556 else
3557 *obufp++ = 'w';
3558 }
3559 if (!(rex & REX_MODE648))
3560 used_prefixes |= (prefixes & PREFIX_DATA0x200);
3561 break;
3562 case 'V':
3563 if (intel_syntax)
3564 break;
3565 if (address_mode == mode_64bit && (sizeflag & DFLAG1))
3566 {
3567 if (sizeflag & SUFFIX_ALWAYS4)
3568 *obufp++ = 'q';
3569 break;
3570 }
3571 /* Fall through. */
3572 case 'S':
3573 if (intel_syntax)
3574 break;
3575 if (sizeflag & SUFFIX_ALWAYS4)
3576 {
3577 if (rex & REX_MODE648)
3578 *obufp++ = 'q';
3579 else
3580 {
3581 if (sizeflag & DFLAG1)
3582 *obufp++ = 'l';
3583 else
3584 *obufp++ = 'w';
3585 used_prefixes |= (prefixes & PREFIX_DATA0x200);
3586 }
3587 }
3588 break;
3589 case 'X':
3590 if (prefixes & PREFIX_DATA0x200)
3591 *obufp++ = 'd';
3592 else
3593 *obufp++ = 's';
3594 used_prefixes |= (prefixes & PREFIX_DATA0x200);
3595 break;
3596 case 'Y':
3597 if (intel_syntax)
3598 break;
3599 if (rex & REX_MODE648)
3600 {
3601 USED_REX (REX_MODE64){ if (8) rex_used |= (rex & 8) ? (8) | 0x40 : 0; else rex_used
|= 0x40; }
;
3602 *obufp++ = 'q';
3603 }
3604 break;
3605 /* implicit operand size 'l' for i386 or 'q' for x86-64 */
3606 case 'W':
3607 /* operand size flag for cwtl, cbtw */
3608 USED_REX (0){ if (0) rex_used |= (rex & 0) ? (0) | 0x40 : 0; else rex_used
|= 0x40; }
;
3609 if (rex)
3610 *obufp++ = 'l';
3611 else if (sizeflag & DFLAG1)
3612 *obufp++ = 'w';
3613 else
3614 *obufp++ = 'b';
3615 if (intel_syntax)
3616 {
3617 if (rex)
3618 {
3619 *obufp++ = 'q';
3620 *obufp++ = 'e';
3621 }
3622 if (sizeflag & DFLAG1)
3623 {
3624 *obufp++ = 'd';
3625 *obufp++ = 'e';
3626 }
3627 else
3628 {
3629 *obufp++ = 'w';
3630 }
3631 }
3632 if (!rex)
3633 used_prefixes |= (prefixes & PREFIX_DATA0x200);
3634 break;
3635 }
3636 alt = 0;
3637 }
3638 *obufp = 0;
3639 return 0;
3640}
3641
3642static void
3643oappend (const char *s)
3644{
3645 strcpy (obufp, s);
3646 obufp += strlen (s);
3647}
3648
3649static void
3650append_seg (void)
3651{
3652 if (prefixes & PREFIX_CS8)
3653 {
3654 used_prefixes |= PREFIX_CS8;
3655 oappend (&"%cs:"[intel_syntax]);
3656 }
3657 if (prefixes & PREFIX_DS0x20)
3658 {
3659 used_prefixes |= PREFIX_DS0x20;
3660 oappend (&"%ds:"[intel_syntax]);
3661 }
3662 if (prefixes & PREFIX_SS0x10)
3663 {
3664 used_prefixes |= PREFIX_SS0x10;
3665 oappend (&"%ss:"[intel_syntax]);
3666 }
3667 if (prefixes & PREFIX_ES0x40)
3668 {
3669 used_prefixes |= PREFIX_ES0x40;
3670 oappend (&"%es:"[intel_syntax]);
3671 }
3672 if (prefixes & PREFIX_FS0x80)
3673 {
3674 used_prefixes |= PREFIX_FS0x80;
3675 oappend (&"%fs:"[intel_syntax]);
3676 }
3677 if (prefixes & PREFIX_GS0x100)
3678 {
3679 used_prefixes |= PREFIX_GS0x100;
3680 oappend (&"%gs:"[intel_syntax]);
3681 }
3682}
3683
3684static void
3685OP_indirE (int bytemode, int sizeflag)
3686{
3687 if (!intel_syntax)
3688 oappend ("*");
3689 OP_E (bytemode, sizeflag);
3690}
3691
3692static void
3693print_operand_value (char *buf, int hex, bfd_vma disp)
3694{
3695 if (address_mode == mode_64bit)
3696 {
3697 if (hex)
3698 {
3699 char tmp[30];
3700 int i;
3701 buf[0] = '0';
3702 buf[1] = 'x';
3703 sprintf_vma (tmp, disp)sprintf (tmp, "%016lx", disp);
3704 for (i = 0; tmp[i] == '0' && tmp[i + 1]; i++);
3705 strcpy (buf + 2, tmp + i);
3706 }
3707 else
3708 {
3709 bfd_signed_vma v = disp;
3710 char tmp[30];
3711 int i;
3712 if (v < 0)
3713 {
3714 *(buf++) = '-';
3715 v = -disp;
3716 /* Check for possible overflow on 0x8000000000000000. */
3717 if (v < 0)
3718 {
3719 strcpy (buf, "9223372036854775808");
3720 return;
3721 }
3722 }
3723 if (!v)
3724 {
3725 strcpy (buf, "0");
3726 return;
3727 }
3728
3729 i = 0;
3730 tmp[29] = 0;
3731 while (v)
3732 {
3733 tmp[28 - i] = (v % 10) + '0';
3734 v /= 10;
3735 i++;
3736 }
3737 strcpy (buf, tmp + 29 - i);
3738 }
3739 }
3740 else
3741 {
3742 if (hex)
3743 sprintf (buf, "0x%x", (unsigned int) disp);
3744 else
3745 sprintf (buf, "%d", (int) disp);
3746 }
3747}
3748
3749static void
3750intel_operand_size (int bytemode, int sizeflag)
3751{
3752 switch (bytemode)
3753 {
3754 case b_mode1:
3755 oappend ("BYTE PTR ");
3756 break;
3757 case w_mode3:
3758 case dqw_mode12:
3759 oappend ("WORD PTR ");
3760 break;
3761 case stack_v_mode15:
3762 if (address_mode == mode_64bit && (sizeflag & DFLAG1))
3763 {
3764 oappend ("QWORD PTR ");
3765 used_prefixes |= (prefixes & PREFIX_DATA0x200);
3766 break;
3767 }
3768 /* FALLTHRU */
3769 case v_mode2:
3770 case dq_mode11:
3771 USED_REX (REX_MODE64){ if (8) rex_used |= (rex & 8) ? (8) | 0x40 : 0; else rex_used
|= 0x40; }
;
3772 if (rex & REX_MODE648)
3773 oappend ("QWORD PTR ");
3774 else if ((sizeflag & DFLAG1) || bytemode == dq_mode11)
3775 oappend ("DWORD PTR ");
3776 else
3777 oappend ("WORD PTR ");
3778 used_prefixes |= (prefixes & PREFIX_DATA0x200);
3779 break;
3780 case d_mode4:
3781 oappend ("DWORD PTR ");
3782 break;
3783 case q_mode5:
3784 oappend ("QWORD PTR ");
3785 break;
3786 case m_mode8:
3787 if (address_mode == mode_64bit)
3788 oappend ("QWORD PTR ");
3789 else
3790 oappend ("DWORD PTR ");
3791 break;
3792 case f_mode13:
3793 if (sizeflag & DFLAG1)
3794 oappend ("FWORD PTR ");
3795 else
3796 oappend ("DWORD PTR ");
3797 used_prefixes |= (prefixes & PREFIX_DATA0x200);
3798 break;
3799 case t_mode6:
3800 oappend ("TBYTE PTR ");
3801 break;
3802 case x_mode7:
3803 oappend ("XMMWORD PTR ");
3804 break;
3805 default:
3806 break;
3807 }
3808}
3809
3810static void
3811OP_E (int bytemode, int sizeflag)
3812{
3813 bfd_vma disp;
3814 int add = 0;
3815 int riprel = 0;
3816 USED_REX (REX_EXTZ){ if (1) rex_used |= (rex & 1) ? (1) | 0x40 : 0; else rex_used
|= 0x40; }
;
3817 if (rex & REX_EXTZ1)
3818 add += 8;
3819
3820 /* Skip mod/rm byte. */
3821 MODRM_CHECKif (!need_modrm) abort ();
3822 codep++;
3823
3824 if (mod == 3)
3825 {
3826 switch (bytemode)
3827 {
3828 case b_mode1:
3829 USED_REX (0){ if (0) rex_used |= (rex & 0) ? (0) | 0x40 : 0; else rex_used
|= 0x40; }
;
3830 if (rex)
3831 oappend (names8rex[rm + add]);
3832 else
3833 oappend (names8[rm + add]);
3834 break;
3835 case w_mode3:
3836 oappend (names16[rm + add]);
3837 break;
3838 case d_mode4:
3839 oappend (names32[rm + add]);
3840 break;
3841 case q_mode5:
3842 oappend (names64[rm + add]);
3843 break;
3844 case m_mode8:
3845 if (address_mode == mode_64bit)
3846 oappend (names64[rm + add]);
3847 else
3848 oappend (names32[rm + add]);
3849 break;
3850 case stack_v_mode15:
3851 if (address_mode == mode_64bit && (sizeflag & DFLAG1))
3852 {
3853 oappend (names64[rm + add]);
3854 used_prefixes |= (prefixes & PREFIX_DATA0x200);
3855 break;
3856 }
3857 bytemode = v_mode2;
3858 /* FALLTHRU */
3859 case v_mode2:
3860 case dq_mode11:
3861 case dqw_mode12:
3862 USED_REX (REX_MODE64){ if (8) rex_used |= (rex & 8) ? (8) | 0x40 : 0; else rex_used
|= 0x40; }
;
3863 if (rex & REX_MODE648)
3864 oappend (names64[rm + add]);
3865 else if ((sizeflag & DFLAG1) || bytemode != v_mode2)
3866 oappend (names32[rm + add]);
3867 else
3868 oappend (names16[rm + add]);
3869 used_prefixes |= (prefixes & PREFIX_DATA0x200);
3870 break;
3871 case 0:
3872 break;
3873 default:
3874 oappend (INTERNAL_DISASSEMBLER_ERROR("<internal disassembler error>"));
3875 break;
3876 }
3877 return;
3878 }
3879
3880 disp = 0;
3881 if (intel_syntax)
3882 intel_operand_size (bytemode, sizeflag);
3883 append_seg ();
3884
3885 if ((sizeflag & AFLAG2) || address_mode == mode_64bit) /* 32 bit address mode */
3886 {
3887 int havesib;
3888 int havebase;
3889 int base;
3890 int index = 0;
3891 int scale = 0;
3892
3893 havesib = 0;
3894 havebase = 1;
3895 base = rm;
3896
3897 if (base == 4)
3898 {
3899 havesib = 1;
3900 FETCH_DATA (the_info, codep + 1)((codep + 1) <= ((struct dis_private *) (the_info->private_data
))->max_fetched ? 1 : fetch_data ((the_info), (codep + 1))
)
;
3901 index = (*codep >> 3) & 7;
3902 if (address_mode == mode_64bit || index != 0x4)
3903 /* When INDEX == 0x4 in 32 bit mode, SCALE is ignored. */
3904 scale = (*codep >> 6) & 3;
3905 base = *codep & 7;
3906 USED_REX (REX_EXTY){ if (2) rex_used |= (rex & 2) ? (2) | 0x40 : 0; else rex_used
|= 0x40; }
;
3907 if (rex & REX_EXTY2)
3908 index += 8;
3909 codep++;
3910 }
3911 base += add;
3912
3913 switch (mod)
3914 {
3915 case 0:
3916 if ((base & 7) == 5)
3917 {
3918 havebase = 0;
3919 if (address_mode == mode_64bit && !havesib)
3920 riprel = 1;
3921 disp = get32s ();
3922 }
3923 break;
3924 case 1:
3925 FETCH_DATA (the_info, codep + 1)((codep + 1) <= ((struct dis_private *) (the_info->private_data
))->max_fetched ? 1 : fetch_data ((the_info), (codep + 1))
)
;
3926 disp = *codep++;
3927 if ((disp & 0x80) != 0)
3928 disp -= 0x100;
3929 break;
3930 case 2:
3931 disp = get32s ();
3932 break;
3933 }
3934
3935 if (!intel_syntax)
3936 if (mod != 0 || (base & 7) == 5)
3937 {
3938 print_operand_value (scratchbuf, !riprel, disp);
3939 oappend (scratchbuf);
3940 if (riprel)
3941 {
3942 set_op (disp, 1);
3943 oappend ("(%rip)");
3944 }
3945 }
3946
3947 if (havebase || (havesib && (index != 4 || scale != 0)))
3948 {
3949 *obufp++ = open_char;
3950 if (intel_syntax && riprel)
3951 oappend ("rip + ");
3952 *obufp = '\0';
3953 if (havebase)
3954 oappend (address_mode == mode_64bit && (sizeflag & AFLAG2)
3955 ? names64[base] : names32[base]);
3956 if (havesib)
3957 {
3958 if (index != 4)
3959 {
3960 if (!intel_syntax || havebase)
3961 {
3962 *obufp++ = separator_char;
3963 *obufp = '\0';
3964 }
3965 oappend (address_mode == mode_64bit && (sizeflag & AFLAG2)
3966 ? names64[index] : names32[index]);
3967 }
3968 if (scale != 0 || (!intel_syntax && index != 4))
3969 {
3970 *obufp++ = scale_char;
3971 *obufp = '\0';
3972 sprintf (scratchbuf, "%d", 1 << scale);
3973 oappend (scratchbuf);
3974 }
3975 }
3976 if (intel_syntax && disp)
3977 {
3978 if ((bfd_signed_vma) disp > 0)
3979 {
3980 *obufp++ = '+';
3981 *obufp = '\0';
3982 }
3983 else if (mod != 1)
3984 {
3985 *obufp++ = '-';
3986 *obufp = '\0';
3987 disp = - (bfd_signed_vma) disp;
3988 }
3989
3990 print_operand_value (scratchbuf, mod != 1, disp);
3991 oappend (scratchbuf);
3992 }
3993
3994 *obufp++ = close_char;
3995 *obufp = '\0';
3996 }
3997 else if (intel_syntax)
3998 {
3999 if (mod != 0 || (base & 7) == 5)
4000 {
4001 if (prefixes & (PREFIX_CS8 | PREFIX_SS0x10 | PREFIX_DS0x20
4002 | PREFIX_ES0x40 | PREFIX_FS0x80 | PREFIX_GS0x100))
4003 ;
4004 else
4005 {
4006 oappend (names_seg[ds_reg103 - es_reg100]);
4007 oappend (":");
4008 }
4009 print_operand_value (scratchbuf, 1, disp);
4010 oappend (scratchbuf);
4011 }
4012 }
4013 }
4014 else
4015 { /* 16 bit address mode */
4016 switch (mod)
4017 {
4018 case 0:
4019 if (rm == 6)
4020 {
4021 disp = get16 ();
4022 if ((disp & 0x8000) != 0)
4023 disp -= 0x10000;
4024 }
4025 break;
4026 case 1:
4027 FETCH_DATA (the_info, codep + 1)((codep + 1) <= ((struct dis_private *) (the_info->private_data
))->max_fetched ? 1 : fetch_data ((the_info), (codep + 1))
)
;
4028 disp = *codep++;
4029 if ((disp & 0x80) != 0)
4030 disp -= 0x100;
4031 break;
4032 case 2:
4033 disp = get16 ();
4034 if ((disp & 0x8000) != 0)
4035 disp -= 0x10000;
4036 break;
4037 }
4038
4039 if (!intel_syntax)
4040 if (mod != 0 || rm == 6)
4041 {
4042 print_operand_value (scratchbuf, 0, disp);
4043 oappend (scratchbuf);
4044 }
4045
4046 if (mod != 0 || rm != 6)
4047 {
4048 *obufp++ = open_char;
4049 *obufp = '\0';
4050 oappend (index16[rm]);
4051 if (intel_syntax && disp)
4052 {
4053 if ((bfd_signed_vma) disp > 0)
4054 {
4055 *obufp++ = '+';
4056 *obufp = '\0';
4057 }
4058 else if (mod != 1)
4059 {
4060 *obufp++ = '-';
4061 *obufp = '\0';
4062 disp = - (bfd_signed_vma) disp;
4063 }
4064
4065 print_operand_value (scratchbuf, mod != 1, disp);
4066 oappend (scratchbuf);
4067 }
4068
4069 *obufp++ = close_char;
4070 *obufp = '\0';
4071 }
4072 else if (intel_syntax)
4073 {
4074 if (prefixes & (PREFIX_CS8 | PREFIX_SS0x10 | PREFIX_DS0x20
4075 | PREFIX_ES0x40 | PREFIX_FS0x80 | PREFIX_GS0x100))
4076 ;
4077 else
4078 {
4079 oappend (names_seg[ds_reg103 - es_reg100]);
4080 oappend (":");
4081 }
4082 print_operand_value (scratchbuf, 1, disp & 0xffff);
4083 oappend (scratchbuf);
4084 }
4085 }
4086}
4087
4088static void
4089OP_G (int bytemode, int sizeflag)
4090{
4091 int add = 0;
4092 USED_REX (REX_EXTX){ if (4) rex_used |= (rex & 4) ? (4) | 0x40 : 0; else rex_used
|= 0x40; }
;
4093 if (rex & REX_EXTX4)
4094 add += 8;
4095 switch (bytemode)
4096 {
4097 case b_mode1:
4098 USED_REX (0){ if (0) rex_used |= (rex & 0) ? (0) | 0x40 : 0; else rex_used
|= 0x40; }
;
4099 if (rex)
4100 oappend (names8rex[reg + add]);
4101 else
4102 oappend (names8[reg + add]);
4103 break;
4104 case w_mode3:
4105 oappend (names16[reg + add]);
4106 break;
4107 case d_mode4:
4108 oappend (names32[reg + add]);
4109 break;
4110 case q_mode5:
4111 oappend (names64[reg + add]);
4112 break;
4113 case v_mode2:
4114 case dq_mode11:
4115 case dqw_mode12:
4116 USED_REX (REX_MODE64){ if (8) rex_used |= (rex & 8) ? (8) | 0x40 : 0; else rex_used
|= 0x40; }
;
4117 if (rex & REX_MODE648)
4118 oappend (names64[reg + add]);
4119 else if ((sizeflag & DFLAG1) || bytemode != v_mode2)
4120 oappend (names32[reg + add]);
4121 else
4122 oappend (names16[reg + add]);
4123 used_prefixes |= (prefixes & PREFIX_DATA0x200);
4124 break;
4125 case m_mode8:
4126 if (address_mode == mode_64bit)
4127 oappend (names64[reg + add]);
4128 else
4129 oappend (names32[reg + add]);
4130 break;
4131 default:
4132 oappend (INTERNAL_DISASSEMBLER_ERROR("<internal disassembler error>"));
4133 break;
4134 }
4135}
4136
4137static bfd_vma
4138get64 (void)
4139{
4140 bfd_vma x;
4141#ifdef BFD64
4142 unsigned int a;
4143 unsigned int b;
4144
4145 FETCH_DATA (the_info, codep + 8)((codep + 8) <= ((struct dis_private *) (the_info->private_data
))->max_fetched ? 1 : fetch_data ((the_info), (codep + 8))
)
;
4146 a = *codep++ & 0xff;
4147 a |= (*codep++ & 0xff) << 8;
4148 a |= (*codep++ & 0xff) << 16;
4149 a |= (*codep++ & 0xff) << 24;
4150 b = *codep++ & 0xff;
4151 b |= (*codep++ & 0xff) << 8;
4152 b |= (*codep++ & 0xff) << 16;
4153 b |= (*codep++ & 0xff) << 24;
4154 x = a + ((bfd_vma) b << 32);
4155#else
4156 abort ();
4157 x = 0;
4158#endif
4159 return x;
4160}
4161
4162static bfd_signed_vma
4163get32 (void)
4164{
4165 bfd_signed_vma x = 0;
4166
4167 FETCH_DATA (the_info, codep + 4)((codep + 4) <= ((struct dis_private *) (the_info->private_data
))->max_fetched ? 1 : fetch_data ((the_info), (codep + 4))
)
;
4168 x = *codep++ & (bfd_signed_vma) 0xff;
4169 x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
4170 x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
4171 x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
4172 return x;
4173}
4174
4175static bfd_signed_vma
4176get32s (void)
4177{
4178 bfd_signed_vma x = 0;
4179
4180 FETCH_DATA (the_info, codep + 4)((codep + 4) <= ((struct dis_private *) (the_info->private_data
))->max_fetched ? 1 : fetch_data ((the_info), (codep + 4))
)
;
4181 x = *codep++ & (bfd_signed_vma) 0xff;
4182 x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
4183 x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
4184 x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
4185
4186 x = (x ^ ((bfd_signed_vma) 1 << 31)) - ((bfd_signed_vma) 1 << 31);
4187
4188 return x;
4189}
4190
4191static int
4192get16 (void)
4193{
4194 int x = 0;
4195
4196 FETCH_DATA (the_info, codep + 2)((codep + 2) <= ((struct dis_private *) (the_info->private_data
))->max_fetched ? 1 : fetch_data ((the_info), (codep + 2))
)
;
4197 x = *codep++ & 0xff;
4198 x |= (*codep++ & 0xff) << 8;
4199 return x;
4200}
4201
4202static void
4203set_op (bfd_vma op, int riprel)
4204{
4205 op_index[op_ad] = op_ad;
4206 if (address_mode == mode_64bit)
4207 {
4208 op_address[op_ad] = op;
4209 op_riprel[op_ad] = riprel;
4210 }
4211 else
4212 {
4213 /* Mask to get a 32-bit address. */
4214 op_address[op_ad] = op & 0xffffffff;
4215 op_riprel[op_ad] = riprel & 0xffffffff;
4216 }
4217}
4218
4219static void
4220OP_REG (int code, int sizeflag)
4221{
4222 const char *s;
4223 int add = 0;
4224 USED_REX (REX_EXTZ){ if (1) rex_used |= (rex & 1) ? (1) | 0x40 : 0; else rex_used
|= 0x40; }
;
4225 if (rex & REX_EXTZ1)
4226 add = 8;
4227
4228 switch (code)
4229 {
4230 case indir_dx_reg150:
4231 if (intel_syntax)
4232 s = "[dx]";
4233 else
4234 s = "(%dx)";
4235 break;
4236 case ax_reg124: case cx_reg125: case dx_reg126: case bx_reg127:
4237 case sp_reg128: case bp_reg129: case si_reg130: case di_reg131:
4238 s = names16[code - ax_reg124 + add];
4239 break;
4240 case es_reg100: case ss_reg102: case cs_reg101:
4241 case ds_reg103: case fs_reg104: case gs_reg105:
4242 s = names_seg[code - es_reg100 + add];
4243 break;
4244 case al_reg116: case ah_reg120: case cl_reg117: case ch_reg121:
4245 case dl_reg118: case dh_reg122: case bl_reg119: case bh_reg123:
4246 USED_REX (0){ if (0) rex_used |= (rex & 0) ? (0) | 0x40 : 0; else rex_used
|= 0x40; }
;
4247 if (rex)
4248 s = names8rex[code - al_reg116 + add];
4249 else
4250 s = names8[code - al_reg116];
4251 break;
4252 case rAX_reg132: case rCX_reg133: case rDX_reg134: case rBX_reg135:
4253 case rSP_reg136: case rBP_reg137: case rSI_reg138: case rDI_reg139:
4254 if (address_mode == mode_64bit && (sizeflag & DFLAG1))
4255 {
4256 s = names64[code - rAX_reg132 + add];
4257 break;
4258 }
4259 code += eAX_reg108 - rAX_reg132;
4260 /* Fall through. */
4261 case eAX_reg108: case eCX_reg109: case eDX_reg110: case eBX_reg111:
4262 case eSP_reg112: case eBP_reg113: case eSI_reg114: case eDI_reg115:
4263 USED_REX (REX_MODE64){ if (8) rex_used |= (rex & 8) ? (8) | 0x40 : 0; else rex_used
|= 0x40; }
;
4264 if (rex & REX_MODE648)
4265 s = names64[code - eAX_reg108 + add];
4266 else if (sizeflag & DFLAG1)
4267 s = names32[code - eAX_reg108 + add];
4268 else
4269 s = names16[code - eAX_reg108 + add];
4270 used_prefixes |= (prefixes & PREFIX_DATA0x200);
4271 break;
4272 default:
4273 s = INTERNAL_DISASSEMBLER_ERROR("<internal disassembler error>");
4274 break;
4275 }
4276 oappend (s);
4277}
4278
4279static void
4280OP_IMREG (int code, int sizeflag)
4281{
4282 const char *s;
4283
4284 switch (code)
4285 {
4286 case indir_dx_reg150:
4287 if (intel_syntax)
4288 s = "[dx]";
4289 else
4290 s = "(%dx)";
4291 break;
4292 case ax_reg124: case cx_reg125: case dx_reg126: case bx_reg127:
4293 case sp_reg128: case bp_reg129: case si_reg130: case di_reg131:
4294 s = names16[code - ax_reg124];
4295 break;
4296 case es_reg100: case ss_reg102: case cs_reg101:
4297 case ds_reg103: case fs_reg104: case gs_reg105:
4298 s = names_seg[code - es_reg100];
4299 break;
4300 case al_reg116: case ah_reg120: case cl_reg117: case ch_reg121:
4301 case dl_reg118: case dh_reg122: case bl_reg119: case bh_reg123:
4302 USED_REX (0){ if (0) rex_used |= (rex & 0) ? (0) | 0x40 : 0; else rex_used
|= 0x40; }
;
4303 if (rex)
4304 s = names8rex[code - al_reg116];
4305 else
4306 s = names8[code - al_reg116];
4307 break;
4308 case eAX_reg108: case eCX_reg109: case eDX_reg110: case eBX_reg111:
4309 case eSP_reg112: case eBP_reg113: case eSI_reg114: case eDI_reg115:
4310 USED_REX (REX_MODE64){ if (8) rex_used |= (rex & 8) ? (8) | 0x40 : 0; else rex_used
|= 0x40; }
;
4311 if (rex & REX_MODE648)
4312 s = names64[code - eAX_reg108];
4313 else if (sizeflag & DFLAG1)
4314 s = names32[code - eAX_reg108];
4315 else
4316 s = names16[code - eAX_reg108];
4317 used_prefixes |= (prefixes & PREFIX_DATA0x200);
4318 break;
4319 default:
4320 s = INTERNAL_DISASSEMBLER_ERROR("<internal disassembler error>");
4321 break;
4322 }
4323 oappend (s);
4324}
4325
4326static void
4327OP_I (int bytemode, int sizeflag)
4328{
4329 bfd_signed_vma op;
4330 bfd_signed_vma mask = -1;
4331
4332 switch (bytemode)
4333 {
4334 case b_mode1:
4335 FETCH_DATA (the_info, codep + 1)((codep + 1) <= ((struct dis_private *) (the_info->private_data
))->max_fetched ? 1 : fetch_data ((the_info), (codep + 1))
)
;
4336 op = *codep++;
4337 mask = 0xff;
4338 break;
4339 case q_mode5:
4340 if (address_mode == mode_64bit)
4341 {
4342 op = get32s ();
4343 break;
4344 }
4345 /* Fall through. */
4346 case v_mode2:
4347 USED_REX (REX_MODE64){ if (8) rex_used |= (rex & 8) ? (8) | 0x40 : 0; else rex_used
|= 0x40; }
;
4348 if (rex & REX_MODE648)
4349 op = get32s ();
4350 else if (sizeflag & DFLAG1)
4351 {
4352 op = get32 ();
4353 mask = 0xffffffff;
4354 }
4355 else
4356 {
4357 op = get16 ();
4358 mask = 0xfffff;
4359 }
4360 used_prefixes |= (prefixes & PREFIX_DATA0x200);
4361 break;
4362 case w_mode3:
4363 mask = 0xfffff;
4364 op = get16 ();
4365 break;
4366 case const_1_mode14:
4367 if (intel_syntax)
4368 oappend ("1");
4369 return;
4370 default:
4371 oappend (INTERNAL_DISASSEMBLER_ERROR("<internal disassembler error>"));
4372 return;
4373 }
4374
4375 op &= mask;
4376 scratchbuf[0] = '$';
4377 print_operand_value (scratchbuf + 1, 1, op);
4378 oappend (scratchbuf + intel_syntax);
4379 scratchbuf[0] = '\0';
4380}
4381
4382static void
4383OP_I64 (int bytemode, int sizeflag)
4384{
4385 bfd_signed_vma op;
4386 bfd_signed_vma mask = -1;
4387
4388 if (address_mode != mode_64bit)
4389 {
4390 OP_I (bytemode, sizeflag);
4391 return;
4392 }
4393
4394 switch (bytemode)
4395 {
4396 case b_mode1:
4397 FETCH_DATA (the_info, codep + 1)((codep + 1) <= ((struct dis_private *) (the_info->private_data
))->max_fetched ? 1 : fetch_data ((the_info), (codep + 1))
)
;
4398 op = *codep++;
4399 mask = 0xff;
4400 break;
4401 case v_mode2:
4402 USED_REX (REX_MODE64){ if (8) rex_used |= (rex & 8) ? (8) | 0x40 : 0; else rex_used
|= 0x40; }
;
4403 if (rex & REX_MODE648)
4404 op = get64 ();
4405 else if (sizeflag & DFLAG1)
4406 {
4407 op = get32 ();
4408 mask = 0xffffffff;
4409 }
4410 else
4411 {
4412 op = get16 ();
4413 mask = 0xfffff;
4414 }
4415 used_prefixes |= (prefixes & PREFIX_DATA0x200);
4416 break;
4417 case w_mode3:
4418 mask = 0xfffff;
4419 op = get16 ();
4420 break;
4421 default:
4422 oappend (INTERNAL_DISASSEMBLER_ERROR("<internal disassembler error>"));
4423 return;
4424 }
4425
4426 op &= mask;
4427 scratchbuf[0] = '$';
4428 print_operand_value (scratchbuf + 1, 1, op);
4429 oappend (&scratchbuf[intel_syntax]);
4430 scratchbuf[0] = '\0';
4431}
4432
4433static void
4434OP_sI (int bytemode, int sizeflag)
4435{
4436 bfd_signed_vma op;
4437 bfd_signed_vma mask = -1;
4438
4439 switch (bytemode)
4440 {
4441 case b_mode1:
4442 FETCH_DATA (the_info, codep + 1)((codep + 1) <= ((struct dis_private *) (the_info->private_data
))->max_fetched ? 1 : fetch_data ((the_info), (codep + 1))
)
;
4443 op = *codep++;
4444 if ((op & 0x80) != 0)
4445 op -= 0x100;
4446 mask = 0xffffffff;
Value stored to 'mask' is never read
4447 break;
4448 case v_mode2:
4449 USED_REX (REX_MODE64){ if (8) rex_used |= (rex & 8) ? (8) | 0x40 : 0; else rex_used
|= 0x40; }
;
4450 if (rex & REX_MODE648)
4451 op = get32s ();
4452 else if (sizeflag & DFLAG1)
4453 {
4454 op = get32s ();
4455 mask = 0xffffffff;
4456 }
4457 else
4458 {
4459 mask = 0xffffffff;
4460 op = get16 ();
4461 if ((op & 0x8000) != 0)
4462 op -= 0x10000;
4463 }
4464 used_prefixes |= (prefixes & PREFIX_DATA0x200);
4465 break;
4466 case w_mode3:
4467 op = get16 ();
4468 mask = 0xffffffff;
4469 if ((op & 0x8000) != 0)
4470 op -= 0x10000;
4471 break;
4472 default:
4473 oappend (INTERNAL_DISASSEMBLER_ERROR("<internal disassembler error>"));
4474 return;
4475 }
4476
4477 scratchbuf[0] = '$';
4478 print_operand_value (scratchbuf + 1, 1, op);
4479 oappend (&scratchbuf[intel_syntax]);
4480}
4481
4482static void
4483OP_J (int bytemode, int sizeflag)
4484{
4485 bfd_vma disp;
4486 bfd_vma mask = -1;
4487
4488 switch (bytemode)
4489 {
4490 case b_mode1:
4491 FETCH_DATA (the_info, codep + 1)((codep + 1) <= ((struct dis_private *) (the_info->private_data
))->max_fetched ? 1 : fetch_data ((the_info), (codep + 1))
)
;
4492 disp = *codep++;
4493 if ((disp & 0x80) != 0)
4494 disp -= 0x100;
4495 break;
4496 case v_mode2:
4497 if ((sizeflag & DFLAG1) || (rex & REX_MODE648))
4498 disp = get32s ();
4499 else
4500 {
4501 disp = get16 ();
4502 /* For some reason, a data16 prefix on a jump instruction
4503 means that the pc is masked to 16 bits after the
4504 displacement is added! */
4505 mask = 0xffff;
4506 }
4507 break;
4508 default:
4509 oappend (INTERNAL_DISASSEMBLER_ERROR("<internal disassembler error>"));
4510 return;
4511 }
4512 disp = (start_pc + codep - start_codep + disp) & mask;
4513 set_op (disp, 0);
4514 print_operand_value (scratchbuf, 1, disp);
4515 oappend (scratchbuf);
4516}
4517
4518static void
4519OP_SEG (int dummy ATTRIBUTE_UNUSED__attribute__ ((__unused__)), int sizeflag ATTRIBUTE_UNUSED__attribute__ ((__unused__)))
4520{
4521 oappend (names_seg[reg]);
4522}
4523
4524static void
4525OP_DIR (int dummy ATTRIBUTE_UNUSED__attribute__ ((__unused__)), int sizeflag)
4526{
4527 int seg, offset;
4528
4529 if (sizeflag & DFLAG1)
4530 {
4531 offset = get32 ();
4532 seg = get16 ();
4533 }
4534 else
4535 {
4536 offset = get16 ();
4537 seg = get16 ();
4538 }
4539 used_prefixes |= (prefixes & PREFIX_DATA0x200);
4540 if (intel_syntax)
4541 sprintf (scratchbuf, "0x%x:0x%x", seg, offset);
4542 else
4543 sprintf (scratchbuf, "$0x%x,$0x%x", seg, offset);
4544 oappend (scratchbuf);
4545}
4546
4547static void
4548OP_OFF (int bytemode, int sizeflag)
4549{
4550 bfd_vma off;
4551
4552 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS4))
4553 intel_operand_size (bytemode, sizeflag);
4554 append_seg ();
4555
4556 if ((sizeflag & AFLAG2) || address_mode == mode_64bit)
4557 off = get32 ();
4558 else
4559 off = get16 ();
4560
4561 if (intel_syntax)
4562 {
4563 if (!(prefixes & (PREFIX_CS8 | PREFIX_SS0x10 | PREFIX_DS0x20
4564 | PREFIX_ES0x40 | PREFIX_FS0x80 | PREFIX_GS0x100)))
4565 {
4566 oappend (names_seg[ds_reg103 - es_reg100]);
4567 oappend (":");
4568 }
4569 }
4570 print_operand_value (scratchbuf, 1, off);
4571 oappend (scratchbuf);
4572}
4573
4574static void
4575OP_OFF64 (int bytemode, int sizeflag)
4576{
4577 bfd_vma off;
4578
4579 if (address_mode != mode_64bit)
4580 {
4581 OP_OFF (bytemode, sizeflag);
4582 return;
4583 }
4584
4585 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS4))
4586 intel_operand_size (bytemode, sizeflag);
4587 append_seg ();
4588
4589 off = get64 ();
4590
4591 if (intel_syntax)
4592 {
4593 if (!(prefixes & (PREFIX_CS8 | PREFIX_SS0x10 | PREFIX_DS0x20
4594 | PREFIX_ES0x40 | PREFIX_FS0x80 | PREFIX_GS0x100)))
4595 {
4596 oappend (names_seg[ds_reg103 - es_reg100]);
4597 oappend (":");
4598 }
4599 }
4600 print_operand_value (scratchbuf, 1, off);
4601 oappend (scratchbuf);
4602}
4603
4604static void
4605ptr_reg (int code, int sizeflag)
4606{
4607 const char *s;
4608
4609 *obufp++ = open_char;
4610 used_prefixes |= (prefixes & PREFIX_ADDR0x400);
4611 if (address_mode == mode_64bit)
4612 {
4613 if (!(sizeflag & AFLAG2))
4614 s = names32[code - eAX_reg108];
4615 else
4616 s = names64[code - eAX_reg108];
4617 }
4618 else if (sizeflag & AFLAG2)
4619 s = names32[code - eAX_reg108];
4620 else
4621 s = names16[code - eAX_reg108];
4622 oappend (s);
4623 *obufp++ = close_char;
4624 *obufp = 0;
4625}
4626
4627static void
4628OP_ESreg (int code, int sizeflag)
4629{
4630 if (intel_syntax)
4631 intel_operand_size (codep[-1] & 1 ? v_mode2 : b_mode1, sizeflag);
4632 oappend (&"%es:"[intel_syntax]);
4633 ptr_reg (code, sizeflag);
4634}
4635
4636static void
4637OP_DSreg (int code, int sizeflag)
4638{
4639 if (intel_syntax)
4640 intel_operand_size (codep[-1] != 0xd7 && (codep[-1] & 1)
4641 ? v_mode2
4642 : b_mode1,
4643 sizeflag);
4644 if ((prefixes
4645 & (PREFIX_CS8
4646 | PREFIX_DS0x20
4647 | PREFIX_SS0x10
4648 | PREFIX_ES0x40
4649 | PREFIX_FS0x80
4650 | PREFIX_GS0x100)) == 0)
4651 prefixes |= PREFIX_DS0x20;
4652 append_seg ();
4653 ptr_reg (code, sizeflag);
4654}
4655
4656static void
4657OP_C (int dummy ATTRIBUTE_UNUSED__attribute__ ((__unused__)), int sizeflag ATTRIBUTE_UNUSED__attribute__ ((__unused__)))
4658{
4659 int add = 0;
4660 if (rex & REX_EXTX4)
4661 {
4662 USED_REX (REX_EXTX){ if (4) rex_used |= (rex & 4) ? (4) | 0x40 : 0; else rex_used
|= 0x40; }
;
4663 add = 8;
4664 }
4665 else if (address_mode != mode_64bit && (prefixes & PREFIX_LOCK4))
4666 {
4667 used_prefixes |= PREFIX_LOCK4;
4668 add = 8;
4669 }
4670 sprintf (scratchbuf, "%%cr%d", reg + add);
4671 oappend (scratchbuf + intel_syntax);
4672}
4673
4674static void
4675OP_D (int dummy ATTRIBUTE_UNUSED__attribute__ ((__unused__)), int sizeflag ATTRIBUTE_UNUSED__attribute__ ((__unused__)))
4676{
4677 int add = 0;
4678 USED_REX (REX_EXTX){ if (4) rex_used |= (rex & 4) ? (4) | 0x40 : 0; else rex_used
|= 0x40; }
;
4679 if (rex & REX_EXTX4)
4680 add = 8;
4681 if (intel_syntax)
4682 sprintf (scratchbuf, "db%d", reg + add);
4683 else
4684 sprintf (scratchbuf, "%%db%d", reg + add);
4685 oappend (scratchbuf);
4686}
4687
4688static void
4689OP_T (int dummy ATTRIBUTE_UNUSED__attribute__ ((__unused__)), int sizeflag ATTRIBUTE_UNUSED__attribute__ ((__unused__)))
4690{
4691 sprintf (scratchbuf, "%%tr%d", reg);
4692 oappend (scratchbuf + intel_syntax);
4693}
4694
4695static void
4696OP_Rd (int bytemode, int sizeflag)
4697{
4698 if (mod == 3)
4699 OP_E (bytemode, sizeflag);
4700 else
4701 BadOp ();
4702}
4703
4704static void
4705OP_MMX (int bytemode ATTRIBUTE_UNUSED__attribute__ ((__unused__)), int sizeflag ATTRIBUTE_UNUSED__attribute__ ((__unused__)))
4706{
4707 used_prefixes |= (prefixes & PREFIX_DATA0x200);
4708 if (prefixes & PREFIX_DATA0x200)
4709 {
4710 int add = 0;
4711 USED_REX (REX_EXTX){ if (4) rex_used |= (rex & 4) ? (4) | 0x40 : 0; else rex_used
|= 0x40; }
;
4712 if (rex & REX_EXTX4)
4713 add = 8;
4714 sprintf (scratchbuf, "%%xmm%d", reg + add);
4715 }
4716 else
4717 sprintf (scratchbuf, "%%mm%d", reg);
4718 oappend (scratchbuf + intel_syntax);
4719}
4720
4721static void
4722OP_XMM (int bytemode ATTRIBUTE_UNUSED__attribute__ ((__unused__)), int sizeflag ATTRIBUTE_UNUSED__attribute__ ((__unused__)))
4723{
4724 int add = 0;
4725 USED_REX (REX_EXTX){ if (4) rex_used |= (rex & 4) ? (4) | 0x40 : 0; else rex_used
|= 0x40; }
;
4726 if (rex & REX_EXTX4)
4727 add = 8;
4728 sprintf (scratchbuf, "%%xmm%d", reg + add);
4729 oappend (scratchbuf + intel_syntax);
4730}
4731
4732static void
4733OP_EM (int bytemode, int sizeflag)
4734{
4735 if (mod != 3)
4736 {
4737 if (intel_syntax && bytemode == v_mode2)
4738 {
4739 bytemode = (prefixes & PREFIX_DATA0x200) ? x_mode7 : q_mode5;
4740 used_prefixes |= (prefixes & PREFIX_DATA0x200);
4741 }
4742 OP_E (bytemode, sizeflag);
4743 return;
4744 }
4745
4746 /* Skip mod/rm byte. */
4747 MODRM_CHECKif (!need_modrm) abort ();
4748 codep++;
4749 used_prefixes |= (prefixes & PREFIX_DATA0x200);
4750 if (prefixes & PREFIX_DATA0x200)
4751 {
4752 int add = 0;
4753
4754 USED_REX (REX_EXTZ){ if (1) rex_used |= (rex & 1) ? (1) | 0x40 : 0; else rex_used
|= 0x40; }
;
4755 if (rex & REX_EXTZ1)
4756 add = 8;
4757 sprintf (scratchbuf, "%%xmm%d", rm + add);
4758 }
4759 else
4760 sprintf (scratchbuf, "%%mm%d", rm);
4761 oappend (scratchbuf + intel_syntax);
4762}
4763
4764static void
4765OP_EX (int bytemode, int sizeflag)
4766{
4767 int add = 0;
4768 if (mod != 3)
4769 {
4770 if (intel_syntax && bytemode == v_mode2)
4771 {
4772 switch (prefixes & (PREFIX_DATA0x200|PREFIX_REPZ1|PREFIX_REPNZ2))
4773 {
4774 case 0: bytemode = x_mode7; break;
4775 case PREFIX_REPZ1: bytemode = d_mode4; used_prefixes |= PREFIX_REPZ1; break;
4776 case PREFIX_DATA0x200: bytemode = x_mode7; used_prefixes |= PREFIX_DATA0x200; break;
4777 case PREFIX_REPNZ2: bytemode = q_mode5; used_prefixes |= PREFIX_REPNZ2; break;
4778 default: bytemode = 0; break;
4779 }
4780 }
4781 OP_E (bytemode, sizeflag);
4782 return;
4783 }
4784 USED_REX (REX_EXTZ){ if (1) rex_used |= (rex & 1) ? (1) | 0x40 : 0; else rex_used
|= 0x40; }
;
4785 if (rex & REX_EXTZ1)
4786 add = 8;
4787
4788 /* Skip mod/rm byte. */
4789 MODRM_CHECKif (!need_modrm) abort ();
4790 codep++;
4791 sprintf (scratchbuf, "%%xmm%d", rm + add);
4792 oappend (scratchbuf + intel_syntax);
4793}
4794
4795static void
4796OP_MS (int bytemode, int sizeflag)
4797{
4798 if (mod == 3)
4799 OP_EM (bytemode, sizeflag);
4800 else
4801 BadOp ();
4802}
4803
4804static void
4805OP_XS (int bytemode, int sizeflag)
4806{
4807 if (mod == 3)
4808 OP_EX (bytemode, sizeflag);
4809 else
4810 BadOp ();
4811}
4812
4813static void
4814OP_M (int bytemode, int sizeflag)
4815{
4816 if (mod == 3)
4817 BadOp (); /* bad lea,lds,les,lfs,lgs,lss modrm */
4818 else
4819 OP_E (bytemode, sizeflag);
4820}
4821
4822static void
4823OP_0f07 (int bytemode, int sizeflag)
4824{
4825 if (mod != 3 || rm != 0)
4826 BadOp ();
4827 else
4828 OP_E (bytemode, sizeflag);
4829}
4830
4831static void
4832OP_0fae (int bytemode, int sizeflag)
4833{
4834 if (mod == 3)
4835 {
4836 if (reg == 7)
4837 strcpy (obuf + strlen (obuf) - sizeof ("clflush") + 1, "sfence");
4838 else if (reg == 6)
4839 strcpy (obuf + strlen (obuf) - sizeof ("xsaveopt") + 1, "mfence");
4840 else if (reg == 5)
4841 strcpy (obuf + strlen (obuf) - sizeof ("xrstor") + 1, "lfence");
4842
4843 if (reg < 4 && prefixes == PREFIX_REPZ1)
4844 {
4845 if (reg == 0)
4846 strcpy (obuf, "rdfsbase");
4847 else if (reg == 1)
4848 strcpy (obuf, "rdgsbase");
4849 else if (reg == 2)
4850 strcpy (obuf, "wrfsbase");
4851 else
4852 strcpy (obuf, "wrgsbase");
4853 }
4854 else if (reg < 5 || rm != 0)
4855 {
4856 BadOp (); /* bad sfence, mfence, or lfence */
4857 return;
4858 }
4859 }
4860
4861 OP_E (bytemode, sizeflag);
4862}
4863
4864static void
4865NOP_Fixup (int bytemode ATTRIBUTE_UNUSED__attribute__ ((__unused__)), int sizeflag ATTRIBUTE_UNUSED__attribute__ ((__unused__)))
4866{
4867 /* NOP with REPZ prefix is called PAUSE. */
4868 if (prefixes == PREFIX_REPZ1)
4869 strcpy (obuf, "pause");
4870}
4871
4872static const char *const Suffix3DNow[] = {
4873/* 00 */ NULL((void *)0), NULL((void *)0), NULL((void *)0), NULL((void *)0),
4874/* 04 */ NULL((void *)0), NULL((void *)0), NULL((void *)0), NULL((void *)0),
4875/* 08 */ NULL((void *)0), NULL((void *)0), NULL((void *)0), NULL((void *)0),
4876/* 0C */ "pi2fw", "pi2fd", NULL((void *)0), NULL((void *)0),
4877/* 10 */ NULL((void *)0), NULL((void *)0), NULL((void *)0), NULL((void *)0),
4878/* 14 */ NULL((void *)0), NULL((void *)0), NULL((void *)0), NULL((void *)0),
4879/* 18 */ NULL((void *)0), NULL((void *)0), NULL((void *)0), NULL((void *)0),
4880/* 1C */ "pf2iw", "pf2id", NULL((void *)0), NULL((void *)0),
4881/* 20 */ NULL((void *)0), NULL((void *)0), NULL((void *)0), NULL((void *)0),
4882/* 24 */ NULL((void *)0), NULL((void *)0), NULL((void *)0), NULL((void *)0),
4883/* 28 */ NULL((void *)0), NULL((void *)0), NULL((void *)0), NULL((void *)0),
4884/* 2C */ NULL((void *)0), NULL((void *)0), NULL((void *)0), NULL((void *)0),
4885/* 30 */ NULL((void *)0), NULL((void *)0), NULL((void *)0), NULL((void *)0),
4886/* 34 */ NULL((void *)0), NULL((void *)0), NULL((void *)0), NULL((void *)0),
4887/* 38 */ NULL((void *)0), NULL((void *)0), NULL((void *)0), NULL((void *)0),
4888/* 3C */ NULL((void *)0), NULL((void *)0), NULL((void *)0), NULL((void *)0),
4889/* 40 */ NULL((void *)0), NULL((void *)0), NULL((void *)0), NULL((void *)0),
4890/* 44 */ NULL((void *)0), NULL((void *)0), NULL((void *)0), NULL((void *)0),
4891/* 48 */ NULL((void *)0), NULL((void *)0), NULL((void *)0), NULL((void *)0),
4892/* 4C */ NULL((void *)0), NULL((void *)0), NULL((void *)0), NULL((void *)0),
4893/* 50 */ NULL((void *)0), NULL((void *)0), NULL((void *)0), NULL((void *)0),
4894/* 54 */ NULL((void *)0), NULL((void *)0), NULL((void *)0), NULL((void *)0),
4895/* 58 */ NULL((void *)0), NULL((void *)0), NULL((void *)0), NULL((void *)0),
4896/* 5C */ NULL((void *)0), NULL((void *)0), NULL((void *)0), NULL((void *)0),
4897/* 60 */ NULL((void *)0), NULL((void *)0), NULL((void *)0), NULL((void *)0),
4898/* 64 */ NULL((void *)0), NULL((void *)0), NULL((void *)0), NULL((void *)0),
4899/* 68 */ NULL((void *)0), NULL((void *)0), NULL((void *)0), NULL((void *)0),
4900/* 6C */ NULL((void *)0), NULL((void *)0), NULL((void *)0), NULL((void *)0),
4901/* 70 */ NULL((void *)0), NULL((void *)0), NULL((void *)0), NULL((void *)0),
4902/* 74 */ NULL((void *)0), NULL((void *)0), NULL((void *)0), NULL((void *)0),
4903/* 78 */ NULL((void *)0), NULL((void *)0), NULL((void *)0), NULL((void *)0),
4904/* 7C */ NULL((void *)0), NULL((void *)0), NULL((void *)0), NULL((void *)0),
4905/* 80 */ NULL((void *)0), NULL((void *)0), NULL((void *)0), NULL((void *)0),
4906/* 84 */ NULL((void *)0), NULL((void *)0), NULL((void *)0), NULL((void *)0),
4907/* 88 */ NULL((void *)0), NULL((void *)0), "pfnacc", NULL((void *)0),
4908/* 8C */ NULL((void *)0), NULL((void *)0), "pfpnacc", NULL((void *)0),
4909/* 90 */ "pfcmpge", NULL((void *)0), NULL((void *)0), NULL((void *)0),
4910/* 94 */ "pfmin", NULL((void *)0), "pfrcp", "pfrsqrt",
4911/* 98 */ NULL((void *)0), NULL((void *)0), "pfsub", NULL((void *)0),
4912/* 9C */ NULL((void *)0), NULL((void *)0), "pfadd", NULL((void *)0),
4913/* A0 */ "pfcmpgt", NULL((void *)0), NULL((void *)0), NULL((void *)0),
4914/* A4 */ "pfmax", NULL((void *)0), "pfrcpit1", "pfrsqit1",
4915/* A8 */ NULL((void *)0), NULL((void *)0), "pfsubr", NULL((void *)0),
4916/* AC */ NULL((void *)0), NULL((void *)0), "pfacc", NULL((void *)0),
4917/* B0 */ "pfcmpeq", NULL((void *)0), NULL((void *)0), NULL((void *)0),
4918/* B4 */ "pfmul", NULL((void *)0), "pfrcpit2", "pfmulhrw",
4919/* B8 */ NULL((void *)0), NULL((void *)0), NULL((void *)0), "pswapd",
4920/* BC */ NULL((void *)0), NULL((void *)0), NULL((void *)0), "pavgusb",
4921/* C0 */ NULL((void *)0), NULL((void *)0), NULL((void *)0), NULL((void *)0),
4922/* C4 */ NULL((void *)0), NULL((void *)0), NULL((void *)0), NULL((void *)0),
4923/* C8 */ NULL((void *)0), NULL((void *)0), NULL((void *)0), NULL((void *)0),
4924/* CC */ NULL((void *)0), NULL((void *)0), NULL((void *)0), NULL((void *)0),
4925/* D0 */ NULL((void *)0), NULL((void *)0), NULL((void *)0), NULL((void *)0),
4926/* D4 */ NULL((void *)0), NULL((void *)0), NULL((void *)0), NULL((void *)0),
4927/* D8 */ NULL((void *)0), NULL((void *)0), NULL((void *)0), NULL((void *)0),
4928/* DC */ NULL((void *)0), NULL((void *)0), NULL((void *)0), NULL((void *)0),
4929/* E0 */ NULL((void *)0), NULL((void *)0), NULL((void *)0), NULL((void *)0),
4930/* E4 */ NULL((void *)0), NULL((void *)0), NULL((void *)0), NULL((void *)0),
4931/* E8 */ NULL((void *)0), NULL((void *)0), NULL((void *)0), NULL((void *)0),
4932/* EC */ NULL((void *)0), NULL((void *)0), NULL((void *)0), NULL((void *)0),
4933/* F0 */ NULL((void *)0), NULL((void *)0), NULL((void *)0), NULL((void *)0),
4934/* F4 */ NULL((void *)0), NULL((void *)0), NULL((void *)0), NULL((void *)0),
4935/* F8 */ NULL((void *)0), NULL((void *)0), NULL((void *)0), NULL((void *)0),
4936/* FC */ NULL((void *)0), NULL((void *)0), NULL((void *)0), NULL((void *)0),
4937};
4938
4939static void
4940OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED__attribute__ ((__unused__)), int sizeflag ATTRIBUTE_UNUSED__attribute__ ((__unused__)))
4941{
4942 const char *mnemonic;
4943
4944 FETCH_DATA (the_info, codep + 1)((codep + 1) <= ((struct dis_private *) (the_info->private_data
))->max_fetched ? 1 : fetch_data ((the_info), (codep + 1))
)
;
4945 /* AMD 3DNow! instructions are specified by an opcode suffix in the
4946 place where an 8-bit immediate would normally go. ie. the last
4947 byte of the instruction. */
4948 obufp = obuf + strlen (obuf);
4949 mnemonic = Suffix3DNow[*codep++ & 0xff];
4950 if (mnemonic)
4951 oappend (mnemonic);
4952 else
4953 {
4954 /* Since a variable sized modrm/sib chunk is between the start
4955 of the opcode (0x0f0f) and the opcode suffix, we need to do
4956 all the modrm processing first, and don't know until now that
4957 we have a bad opcode. This necessitates some cleaning up. */
4958 op1out[0] = '\0';
4959 op2out[0] = '\0';
4960 BadOp ();
4961 }
4962}
4963
4964static const char *simd_cmp_op[] = {
4965 "eq",
4966 "lt",
4967 "le",
4968 "unord",
4969 "neq",
4970 "nlt",
4971 "nle",
4972 "ord"
4973};
4974
4975static void
4976OP_SIMD_Suffix (int bytemode ATTRIBUTE_UNUSED__attribute__ ((__unused__)), int sizeflag ATTRIBUTE_UNUSED__attribute__ ((__unused__)))
4977{
4978 unsigned int cmp_type;
4979
4980 FETCH_DATA (the_info, codep + 1)((codep + 1) <= ((struct dis_private *) (the_info->private_data
))->max_fetched ? 1 : fetch_data ((the_info), (codep + 1))
)
;
4981 obufp = obuf + strlen (obuf);
4982 cmp_type = *codep++ & 0xff;
4983 if (cmp_type < 8)
4984 {
4985 char suffix1 = 'p', suffix2 = 's';
4986 used_prefixes |= (prefixes & PREFIX_REPZ1);
4987 if (prefixes & PREFIX_REPZ1)
4988 suffix1 = 's';
4989 else
4990 {
4991 used_prefixes |= (prefixes & PREFIX_DATA0x200);
4992 if (prefixes & PREFIX_DATA0x200)
4993 suffix2 = 'd';
4994 else
4995 {
4996 used_prefixes |= (prefixes & PREFIX_REPNZ2);
4997 if (prefixes & PREFIX_REPNZ2)
4998 suffix1 = 's', suffix2 = 'd';
4999 }
5000 }
5001 sprintf (scratchbuf, "cmp%s%c%c",
5002 simd_cmp_op[cmp_type], suffix1, suffix2);
5003 used_prefixes |= (prefixes & PREFIX_REPZ1);
5004 oappend (scratchbuf);
5005 }
5006 else
5007 {
5008 /* We have a bad extension byte. Clean up. */
5009 op1out[0] = '\0';
5010 op2out[0] = '\0';
5011 BadOp ();
5012 }
5013}
5014
5015static void
5016SIMD_Fixup (int extrachar, int sizeflag ATTRIBUTE_UNUSED__attribute__ ((__unused__)))
5017{
5018 /* Change movlps/movhps to movhlps/movlhps for 2 register operand
5019 forms of these instructions. */
5020 if (mod == 3)
5021 {
5022 char *p = obuf + strlen (obuf);
5023 *(p + 1) = '\0';
5024 *p = *(p - 1);
5025 *(p - 1) = *(p - 2);
5026 *(p - 2) = *(p - 3);
5027 *(p - 3) = extrachar;
5028 }
5029}
5030
5031static void
5032PNI_Fixup (int extrachar ATTRIBUTE_UNUSED__attribute__ ((__unused__)), int sizeflag)
5033{
5034 if (mod == 3 && reg == 1 && rm <= 1)
5035 {
5036 /* Override "sidt". */
5037 size_t olen = strlen (obuf);
5038 char *p = obuf + olen - 4;
5039 const char **names = (address_mode == mode_64bit
5040 ? names64 : names32);
5041
5042 /* We might have a suffix when disassembling with -Msuffix. */
5043 if (*p == 'i')
5044 --p;
5045
5046 /* Remove "addr16/addr32" if we aren't in Intel mode. */
5047 if (!intel_syntax
5048 && (prefixes & PREFIX_ADDR0x400)
5049 && olen >= (4 + 7)
5050 && *(p - 1) == ' '
5051 && strncmp (p - 7, "addr", 4) == 0
5052 && (strncmp (p - 3, "16", 2) == 0
5053 || strncmp (p - 3, "32", 2) == 0))
5054 p -= 7;
5055
5056 if (rm)
5057 {
5058 /* mwait %eax,%ecx */
5059 strcpy (p, "mwait");
5060 if (!intel_syntax)
5061 strcpy (op1out, names[0]);
5062 }
5063 else
5064 {
5065 /* monitor %eax,%ecx,%edx" */
5066 strcpy (p, "monitor");
5067 if (!intel_syntax)
5068 {
5069 const char **op1_names;
5070 if (!(prefixes & PREFIX_ADDR0x400))
5071 op1_names = (address_mode == mode_16bit
5072 ? names16 : names);
5073 else
5074 {
5075 op1_names = (address_mode != mode_32bit
5076 ? names32 : names16);
5077 used_prefixes |= PREFIX_ADDR0x400;
5078 }
5079 strcpy (op1out, op1_names[0]);
5080 strcpy (op3out, names[2]);
5081 }
5082 }
5083 if (!intel_syntax)
5084 {
5085 strcpy (op2out, names[1]);
5086 two_source_ops = 1;
5087 }
5088
5089 codep++;
5090 }
5091 else if (mod == 3 && reg == 1 && rm <= 3)
5092 {
5093 size_t olen = strlen (obuf);
5094 char *p = obuf + olen - 4;
5095 if (*codep == 0xca)
5096 strcpy (p, "clac");
5097 else if (*codep == 0xcb)
5098 strcpy (p, "stac");
5099 codep++;
5100 }
5101 else
5102 OP_M (0, sizeflag);
5103}
5104
5105static void
5106XCR_Fixup (int extrachar ATTRIBUTE_UNUSED__attribute__ ((__unused__)), int sizeflag)
5107{
5108 if (mod == 3 && reg == 2 && rm <= 1)
5109 {
5110 /* Override "lgdt". */
5111 size_t olen = strlen (obuf);
5112 char *p = obuf + olen - 4;
5113
5114 /* We might have a suffix when disassembling with -Msuffix. */
5115 if (*p == 'i')
5116 --p;
5117
5118 /* Remove "addr16/addr32" if we aren't in Intel mode. */
5119 if (!intel_syntax
5120 && (prefixes & PREFIX_ADDR0x400)
5121 && olen >= (4 + 7)
5122 && *(p - 1) == ' '
5123 && strncmp (p - 7, "addr", 4) == 0
5124 && (strncmp (p - 3, "16", 2) == 0
5125 || strncmp (p - 3, "32", 2) == 0))
5126 p -= 7;
5127
5128 if (rm)
5129 {
5130 strcpy (p, "xsetbv");
5131 }
5132 else
5133 {
5134 strcpy (p, "xgetbv");
5135 }
5136
5137 codep++;
5138 }
5139 else
5140 OP_M (0, sizeflag);
5141}
5142
5143static void
5144SVME_Fixup (int bytemode, int sizeflag)
5145{
5146 const char *alt;
5147 char *p;
5148
5149 switch (*codep)
5150 {
5151 case 0xd8:
5152 alt = "vmrun";
5153 break;
5154 case 0xd9:
5155 alt = "vmmcall";
5156 break;
5157 case 0xda:
5158 alt = "vmload";
5159 break;
5160 case 0xdb:
5161 alt = "vmsave";
5162 break;
5163 case 0xdc:
5164 alt = "stgi";
5165 break;
5166 case 0xdd:
5167 alt = "clgi";
5168 break;
5169 case 0xde:
5170 alt = "skinit";
5171 break;
5172 case 0xdf:
5173 alt = "invlpga";
5174 break;
5175 default:
5176 OP_M (bytemode, sizeflag);
5177 return;
5178 }
5179 /* Override "lidt". */
5180 p = obuf + strlen (obuf) - 4;
5181 /* We might have a suffix. */
5182 if (*p == 'i')
5183 --p;
5184 strcpy (p, alt);
5185 if (!(prefixes & PREFIX_ADDR0x400))
5186 {
5187 ++codep;
5188 return;
5189 }
5190 used_prefixes |= PREFIX_ADDR0x400;
5191 switch (*codep++)
5192 {
5193 case 0xdf:
5194 strcpy (op2out, names32[1]);
5195 two_source_ops = 1;
5196 /* Fall through. */
5197 case 0xd8:
5198 case 0xda:
5199 case 0xdb:
5200 *obufp++ = open_char;
5201 if (address_mode == mode_64bit || (sizeflag & AFLAG2))
5202 alt = names32[0];
5203 else
5204 alt = names16[0];
5205 strcpy (obufp, alt);
5206 obufp += strlen (alt);
5207 *obufp++ = close_char;
5208 *obufp = '\0';
5209 break;
5210 }
5211}
5212
5213static void
5214INVLPG_Fixup (int bytemode, int sizeflag)
5215{
5216 const char *alt;
5217
5218 switch (*codep)
5219 {
5220 case 0xf8:
5221 alt = "swapgs";
5222 break;
5223 case 0xf9:
5224 alt = "rdtscp";
5225 break;
5226 default:
5227 OP_M (bytemode, sizeflag);
5228 return;
5229 }
5230 /* Override "invlpg". */
5231 strcpy (obuf + strlen (obuf) - 6, alt);
5232 codep++;
5233}
5234
5235static void
5236BadOp (void)
5237{
5238 /* Throw away prefixes and 1st. opcode byte. */
5239 codep = insn_codep + 1;
5240 oappend ("(bad)");
5241}
5242
5243static void
5244SEG_Fixup (int extrachar, int sizeflag)
5245{
5246 if (mod == 3)
5247 {
5248 /* We need to add a proper suffix with
5249
5250 movw %ds,%ax
5251 movl %ds,%eax
5252 movq %ds,%rax
5253 movw %ax,%ds
5254 movl %eax,%ds
5255 movq %rax,%ds
5256 */
5257 const char *suffix;
5258
5259 if (prefixes & PREFIX_DATA0x200)
5260 suffix = "w";
5261 else
5262 {
5263 USED_REX (REX_MODE64){ if (8) rex_used |= (rex & 8) ? (8) | 0x40 : 0; else rex_used
|= 0x40; }
;
5264 if (rex & REX_MODE648)
5265 suffix = "q";
5266 else
5267 suffix = "l";
5268 }
5269 strcat (obuf, suffix);
5270 }
5271 else
5272 {
5273 /* We need to fix the suffix for
5274
5275 movw %ds,(%eax)
5276 movw %ds,(%rax)
5277 movw (%eax),%ds
5278 movw (%rax),%ds
5279
5280 Override "mov[l|q]". */
5281 char *p = obuf + strlen (obuf) - 1;
5282
5283 /* We might not have a suffix. */
5284 if (*p == 'v')
5285 ++p;
5286 *p = 'w';
5287 }
5288
5289 OP_E (extrachar, sizeflag);
5290}
5291
5292static void
5293VMX_Fixup (int extrachar ATTRIBUTE_UNUSED__attribute__ ((__unused__)), int sizeflag)
5294{
5295 if (mod == 3 && reg == 0 && rm >=1 && rm <= 4)
5296 {
5297 /* Override "sgdt". */
5298 char *p = obuf + strlen (obuf) - 4;
5299
5300 /* We might have a suffix when disassembling with -Msuffix. */
5301 if (*p == 'g')
5302 --p;
5303
5304 switch (rm)
5305 {
5306 case 1:
5307 strcpy (p, "vmcall");
5308 break;
5309 case 2:
5310 strcpy (p, "vmlaunch");
5311 break;
5312 case 3:
5313 strcpy (p, "vmresume");
5314 break;
5315 case 4:
5316 strcpy (p, "vmxoff");
5317 break;
5318 }
5319
5320 codep++;
5321 }
5322 else
5323 OP_E (0, sizeflag);
5324}
5325
5326static void
5327OP_VMX (int bytemode, int sizeflag)
5328{
5329 if (mod == 3)
5330 {
5331 strcpy (obuf, "rdrand");
5332 OP_E (v_mode2, sizeflag);
5333 }
5334 else
5335 {
5336 used_prefixes |= (prefixes & (PREFIX_DATA0x200 | PREFIX_REPZ1));
5337 if (prefixes & PREFIX_DATA0x200)
5338 strcpy (obuf, "vmclear");
5339 else if (prefixes & PREFIX_REPZ1)
5340 strcpy (obuf, "vmxon");
5341 else
5342 strcpy (obuf, "vmptrld");
5343 OP_E (bytemode, sizeflag);
5344 }
5345}
5346
5347static void
5348OP_VMX2 (int bytemode ATTRIBUTE_UNUSED__attribute__ ((__unused__)), int sizeflag)
5349{
5350 if (mod == 3)
5351 {
5352 strcpy (obuf, "rdseed");
5353 OP_E (v_mode2, sizeflag);
5354 }
5355 else
5356 {
5357 strcpy (obuf, "vmptrst");
5358 OP_E (q_mode5, sizeflag);
5359 }
5360}
5361
5362static void
5363REP_Fixup (int bytemode, int sizeflag)
5364{
5365 /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
5366 lods and stos. */
5367 size_t ilen = 0;
5368
5369 if (prefixes & PREFIX_REPZ1)
5370 switch (*insn_codep)
5371 {
5372 case 0x6e: /* outsb */
5373 case 0x6f: /* outsw/outsl */
5374 case 0xa4: /* movsb */
5375 case 0xa5: /* movsw/movsl/movsq */
5376 if (!intel_syntax)
5377 ilen = 5;
5378 else
5379 ilen = 4;
5380 break;
5381 case 0xaa: /* stosb */
5382 case 0xab: /* stosw/stosl/stosq */
5383 case 0xac: /* lodsb */
5384 case 0xad: /* lodsw/lodsl/lodsq */
5385 if (!intel_syntax && (sizeflag & SUFFIX_ALWAYS4))
5386 ilen = 5;
5387 else
5388 ilen = 4;
5389 break;
5390 case 0x6c: /* insb */
5391 case 0x6d: /* insl/insw */
5392 if (!intel_syntax)
5393 ilen = 4;
5394 else
5395 ilen = 3;
5396 break;
5397 default:
5398 abort ();
5399 break;
5400 }
5401
5402 if (ilen != 0)
5403 {
5404 size_t olen;
5405 char *p;
5406
5407 olen = strlen (obuf);
5408 p = obuf + olen - ilen - 1 - 4;
5409 /* Handle "repz [addr16|addr32]". */
5410 if ((prefixes & PREFIX_ADDR0x400))
5411 p -= 1 + 6;
5412
5413 memmove (p + 3, p + 4, olen - (p + 3 - obuf));
5414 }
5415
5416 switch (bytemode)
5417 {
5418 case al_reg116:
5419 case eAX_reg108:
5420 case indir_dx_reg150:
5421 OP_IMREG (bytemode, sizeflag);
5422 break;
5423 case eDI_reg115:
5424 OP_ESreg (bytemode, sizeflag);
5425 break;
5426 case eSI_reg114:
5427 OP_DSreg (bytemode, sizeflag);
5428 break;
5429 default:
5430 abort ();
5431 break;
5432 }
5433}
5434
5435#define XMM_DST(rex, modrm)(((((rex) & ~0x40) & 0x4) ? 8 : 0) | (((modrm) & ~
0xc0) >> 3))
\
5436 (((((rex) & ~0x40) & 0x4) ? 8 : 0) | (((modrm) & ~0xc0) >> 3))
5437#define XMM_SRC(rex, modrm)(((((rex) & ~0x40) & 0x1) ? 8 : 0) | (((modrm) & ~
0xc0) & 7))
\
5438 (((((rex) & ~0x40) & 0x1) ? 8 : 0) | (((modrm) & ~0xc0) & 7))
5439
5440static struct {
5441 unsigned char opc;
5442 char *name;
5443} pclmul[] = {
5444 { 0x00, "pclmullqlqdq" },
5445 { 0x01, "pclmulhqlqdq" },
5446 { 0x10, "pclmullqhqdq" },
5447 { 0x11, "pclmulhqhqdq" },
5448};
5449
5450static void
5451OP_0f3a (bytemode, sizeflag)
5452 int bytemode ATTRIBUTE_UNUSED__attribute__ ((__unused__));
5453 int sizeflag ATTRIBUTE_UNUSED__attribute__ ((__unused__));
5454{
5455 const char *mnemonic = NULL((void *)0);
5456 unsigned int i, xmms;
5457 unsigned char op, imm;
5458
5459 obufp = obuf + strlen (obuf);
5460
5461 /* the last byte of the opcode has already been consumed by the caller */
5462 codep--;
5463 op = *codep;
5464 codep++;
5465
5466 FETCH_DATA (the_info, codep + 2)((codep + 2) <= ((struct dis_private *) (the_info->private_data
))->max_fetched ? 1 : fetch_data ((the_info), (codep + 2))
)
;
5467
5468 /* save xmm pair */
5469 xmms = XMM_DST (rex, *codep)(((((rex) & ~0x40) & 0x4) ? 8 : 0) | (((*codep) &
~0xc0) >> 3))
<< 8;
5470 xmms |= XMM_SRC (rex, *codep)(((((rex) & ~0x40) & 0x1) ? 8 : 0) | (((*codep) &
~0xc0) & 7))
;
5471 codep++;
5472
5473 /* save immediate field */
5474 imm = *codep;
5475 codep++;
5476
5477 if (op != 0x44 && op != 0xdf)
5478 {
5479 BadOp();
5480 return;
5481 }
5482
5483 switch (op)
5484 {
5485 case 0x44:
5486 for (i = 0; i < sizeof(pclmul) / sizeof(pclmul[0]); i++)
5487 if (pclmul[i].opc == imm)
5488 mnemonic = pclmul[i].name;
5489
5490 if (!mnemonic)
5491 {
5492 oappend ("pclmulqdq");
5493 sprintf (scratchbuf, " $%#x,", imm);
5494 oappend (scratchbuf);
5495 }
5496 else
5497 {
5498 oappend (mnemonic);
5499 oappend (" ");
5500 }
5501 break;
5502 case 0xdf:
5503 oappend ("aeskeygenassist ");
5504 sprintf (scratchbuf, " $%#x,", imm);
5505 oappend (scratchbuf);
5506 break;
5507 }
5508
5509 sprintf (scratchbuf, "%%xmm%d,", xmms & 0xff);
5510 oappend (scratchbuf);
5511 sprintf (scratchbuf, "%%xmm%d", xmms >> 8);
5512 oappend (scratchbuf);
5513
5514 used_prefixes |= (prefixes & PREFIX_DATA0x200);
5515 USED_REX(rex){ if (rex) rex_used |= (rex & rex) ? (rex) | 0x40 : 0; else
rex_used |= 0x40; }
;
5516}
5517
5518static void
5519OP_0f38 (int bytemode ATTRIBUTE_UNUSED__attribute__ ((__unused__)), int sizeflag ATTRIBUTE_UNUSED__attribute__ ((__unused__)))
5520{
5521 unsigned int xmms;
5522
5523 FETCH_DATA (the_info, codep + 1)((codep + 1) <= ((struct dis_private *) (the_info->private_data
))->max_fetched ? 1 : fetch_data ((the_info), (codep + 1))
)
;
5524
5525 /* save xmm pair */
5526 xmms = XMM_DST (rex, *codep)(((((rex) & ~0x40) & 0x4) ? 8 : 0) | (((*codep) &
~0xc0) >> 3))
<< 8;
5527 xmms |= XMM_SRC (rex, *codep)(((((rex) & ~0x40) & 0x1) ? 8 : 0) | (((*codep) &
~0xc0) & 7))
;
5528 codep++;
5529
5530 sprintf (scratchbuf, "%%xmm%d,", xmms & 0xff);
5531 oappend (scratchbuf);
5532 sprintf (scratchbuf, "%%xmm%d", xmms >> 8);
5533 oappend (scratchbuf);
5534
5535 /* Consume mandatory prefix */
5536 used_prefixes |= (prefixes & PREFIX_DATA0x200);
5537 USED_REX(rex){ if (rex) rex_used |= (rex & rex) ? (rex) | 0x40 : 0; else
rex_used |= 0x40; }
;
5538}
5539
5540/* suppress/require a mandatory 0x66 data size prefix */
5541static void
5542OP_data (int bytemode ATTRIBUTE_UNUSED__attribute__ ((__unused__)), int sizeflag ATTRIBUTE_UNUSED__attribute__ ((__unused__)))
5543{
5544 if (prefixes & PREFIX_DATA0x200)
5545 used_prefixes |= PREFIX_DATA0x200;
5546 else
5547 {
5548 BadOp();
5549 return;
5550 }
5551}