2009-12-11 H.J. Lu <hongjiu.lu@intel.com>
[deliverable/binutils-gdb.git] / opcodes / i386-dis.c
CommitLineData
252b5132 1/* Print i386 instructions for GDB, the GNU debugger.
060d22b0 2 Copyright 1988, 1989, 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
0bfee649 3 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
0af1713e 4 Free Software Foundation, Inc.
252b5132 5
9b201bb5 6 This file is part of the GNU opcodes library.
20f0a1fc 7
9b201bb5 8 This library is free software; you can redistribute it and/or modify
20f0a1fc 9 it under the terms of the GNU General Public License as published by
9b201bb5
NC
10 the Free Software Foundation; either version 3, or (at your option)
11 any later version.
20f0a1fc 12
9b201bb5
NC
13 It is distributed in the hope that it will be useful, but WITHOUT
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
16 License for more details.
20f0a1fc
NC
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
9b201bb5
NC
20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21 MA 02110-1301, USA. */
22
20f0a1fc
NC
23
24/* 80386 instruction printer by Pace Willisson (pace@prep.ai.mit.edu)
25 July 1988
26 modified by John Hassey (hassey@dg-rtp.dg.com)
27 x86-64 support added by Jan Hubicka (jh@suse.cz)
28 VIA PadLock support by Michal Ludvig (mludvig@suse.cz). */
29
30/* The main tables describing the instructions is essentially a copy
31 of the "Opcode Map" chapter (Appendix A) of the Intel 80386
32 Programmers Manual. Usually, there is a capital letter, followed
33 by a small letter. The capital letter tell the addressing mode,
34 and the small letter tells about the operand size. Refer to
35 the Intel manual for details. */
252b5132 36
252b5132 37#include "sysdep.h"
dabbade6 38#include "dis-asm.h"
252b5132 39#include "opintl.h"
0b1cf022 40#include "opcode/i386.h"
85f10a01 41#include "libiberty.h"
252b5132
RH
42
43#include <setjmp.h>
44
26ca5450
AJ
45static int print_insn (bfd_vma, disassemble_info *);
46static void dofloat (int);
47static void OP_ST (int, int);
48static void OP_STi (int, int);
49static int putop (const char *, int);
50static void oappend (const char *);
51static void append_seg (void);
52static void OP_indirE (int, int);
53static void print_operand_value (char *, int, bfd_vma);
c0f3af97 54static void OP_E_register (int, int);
c1e679ec 55static void OP_E_memory (int, int);
5d669648 56static void print_displacement (char *, bfd_vma);
26ca5450
AJ
57static void OP_E (int, int);
58static void OP_G (int, int);
59static bfd_vma get64 (void);
60static bfd_signed_vma get32 (void);
61static bfd_signed_vma get32s (void);
62static int get16 (void);
63static void set_op (bfd_vma, int);
b844680a 64static void OP_Skip_MODRM (int, int);
26ca5450
AJ
65static void OP_REG (int, int);
66static void OP_IMREG (int, int);
67static void OP_I (int, int);
68static void OP_I64 (int, int);
69static void OP_sI (int, int);
70static void OP_J (int, int);
71static void OP_SEG (int, int);
72static void OP_DIR (int, int);
73static void OP_OFF (int, int);
74static void OP_OFF64 (int, int);
75static void ptr_reg (int, int);
76static void OP_ESreg (int, int);
77static void OP_DSreg (int, int);
78static void OP_C (int, int);
79static void OP_D (int, int);
80static void OP_T (int, int);
6f74c397 81static void OP_R (int, int);
26ca5450
AJ
82static void OP_MMX (int, int);
83static void OP_XMM (int, int);
84static void OP_EM (int, int);
85static void OP_EX (int, int);
4d9567e0
MM
86static void OP_EMC (int,int);
87static void OP_MXC (int,int);
26ca5450
AJ
88static void OP_MS (int, int);
89static void OP_XS (int, int);
cc0ec051 90static void OP_M (int, int);
c0f3af97
L
91static void OP_VEX (int, int);
92static void OP_EX_Vex (int, int);
922d8de8 93static void OP_EX_VexW (int, int);
c0f3af97 94static void OP_XMM_Vex (int, int);
922d8de8 95static void OP_XMM_VexW (int, int);
c0f3af97
L
96static void OP_REG_VexI4 (int, int);
97static void PCLMUL_Fixup (int, int);
922d8de8 98static void VEXI4_Fixup (int, int);
c0f3af97
L
99static void VZERO_Fixup (int, int);
100static void VCMP_Fixup (int, int);
cc0ec051 101static void OP_0f07 (int, int);
b844680a
L
102static void OP_Monitor (int, int);
103static void OP_Mwait (int, int);
46e883c5
L
104static void NOP_Fixup1 (int, int);
105static void NOP_Fixup2 (int, int);
26ca5450 106static void OP_3DNowSuffix (int, int);
ad19981d 107static void CMP_Fixup (int, int);
26ca5450 108static void BadOp (void);
35c52694 109static void REP_Fixup (int, int);
f5804c90 110static void CMPXCHG8B_Fixup (int, int);
42903f7f 111static void XMM_Fixup (int, int);
381d071f 112static void CRC32_Fixup (int, int);
eacc9c89 113static void FXSAVE_Fixup (int, int);
f88c9eb0
SP
114static void OP_LWPCB_E (int, int);
115static void OP_LWP_E (int, int);
116static void OP_LWP_I (int, int);
5dd85c99
SP
117static void OP_Vex_2src_1 (int, int);
118static void OP_Vex_2src_2 (int, int);
c1e679ec 119
f1f8f695 120static void MOVBE_Fixup (int, int);
252b5132 121
6608db57 122struct dis_private {
252b5132
RH
123 /* Points to first byte not fetched. */
124 bfd_byte *max_fetched;
0b1cf022 125 bfd_byte the_buffer[MAX_MNEM_SIZE];
252b5132 126 bfd_vma insn_start;
e396998b 127 int orig_sizeflag;
252b5132
RH
128 jmp_buf bailout;
129};
130
cb712a9e
L
131enum address_mode
132{
133 mode_16bit,
134 mode_32bit,
135 mode_64bit
136};
137
138enum address_mode address_mode;
52b15da3 139
5076851f
ILT
140/* Flags for the prefixes for the current instruction. See below. */
141static int prefixes;
142
52b15da3
JH
143/* REX prefix the current instruction. See below. */
144static int rex;
145/* Bits of REX we've already used. */
146static int rex_used;
c0f3af97
L
147/* Original REX prefix. */
148static int rex_original;
149/* REX bits in original REX prefix ignored. It may not be the same
150 as rex_original since some bits may not be ignored. */
151static int rex_ignored;
52b15da3
JH
152/* Mark parts used in the REX prefix. When we are testing for
153 empty prefix (for 8bit register REX extension), just mask it
154 out. Otherwise test for REX bit is excuse for existence of REX
155 only in case value is nonzero. */
156#define USED_REX(value) \
157 { \
158 if (value) \
161a04f6
L
159 { \
160 if ((rex & value)) \
161 rex_used |= (value) | REX_OPCODE; \
162 } \
52b15da3 163 else \
161a04f6 164 rex_used |= REX_OPCODE; \
52b15da3
JH
165 }
166
7d421014
ILT
167/* Flags for prefixes which we somehow handled when printing the
168 current instruction. */
169static int used_prefixes;
170
5076851f
ILT
171/* Flags stored in PREFIXES. */
172#define PREFIX_REPZ 1
173#define PREFIX_REPNZ 2
174#define PREFIX_LOCK 4
175#define PREFIX_CS 8
176#define PREFIX_SS 0x10
177#define PREFIX_DS 0x20
178#define PREFIX_ES 0x40
179#define PREFIX_FS 0x80
180#define PREFIX_GS 0x100
181#define PREFIX_DATA 0x200
182#define PREFIX_ADDR 0x400
183#define PREFIX_FWAIT 0x800
184
252b5132
RH
185/* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
186 to ADDR (exclusive) are valid. Returns 1 for success, longjmps
187 on error. */
188#define FETCH_DATA(info, addr) \
6608db57 189 ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \
252b5132
RH
190 ? 1 : fetch_data ((info), (addr)))
191
192static int
26ca5450 193fetch_data (struct disassemble_info *info, bfd_byte *addr)
252b5132
RH
194{
195 int status;
6608db57 196 struct dis_private *priv = (struct dis_private *) info->private_data;
252b5132
RH
197 bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer);
198
0b1cf022 199 if (addr <= priv->the_buffer + MAX_MNEM_SIZE)
272c9217
JB
200 status = (*info->read_memory_func) (start,
201 priv->max_fetched,
202 addr - priv->max_fetched,
203 info);
204 else
205 status = -1;
252b5132
RH
206 if (status != 0)
207 {
7d421014 208 /* If we did manage to read at least one byte, then
db6eb5be
AM
209 print_insn_i386 will do something sensible. Otherwise, print
210 an error. We do that here because this is where we know
211 STATUS. */
7d421014 212 if (priv->max_fetched == priv->the_buffer)
5076851f 213 (*info->memory_error_func) (status, start, info);
252b5132
RH
214 longjmp (priv->bailout, 1);
215 }
216 else
217 priv->max_fetched = addr;
218 return 1;
219}
220
ce518a5f
L
221#define XX { NULL, 0 }
222
223#define Eb { OP_E, b_mode }
b6169b20 224#define EbS { OP_E, b_swap_mode }
ce518a5f 225#define Ev { OP_E, v_mode }
b6169b20 226#define EvS { OP_E, v_swap_mode }
ce518a5f
L
227#define Ed { OP_E, d_mode }
228#define Edq { OP_E, dq_mode }
229#define Edqw { OP_E, dqw_mode }
42903f7f
L
230#define Edqb { OP_E, dqb_mode }
231#define Edqd { OP_E, dqd_mode }
09335d05 232#define Eq { OP_E, q_mode }
ce518a5f
L
233#define indirEv { OP_indirE, stack_v_mode }
234#define indirEp { OP_indirE, f_mode }
235#define stackEv { OP_E, stack_v_mode }
236#define Em { OP_E, m_mode }
237#define Ew { OP_E, w_mode }
238#define M { OP_M, 0 } /* lea, lgdt, etc. */
34b772a6 239#define Ma { OP_M, a_mode }
b844680a 240#define Mb { OP_M, b_mode }
d9a5e5e5 241#define Md { OP_M, d_mode }
f1f8f695 242#define Mo { OP_M, o_mode }
ce518a5f
L
243#define Mp { OP_M, f_mode } /* 32 or 48 bit memory operand for LDS, LES etc */
244#define Mq { OP_M, q_mode }
4ee52178 245#define Mx { OP_M, x_mode }
c0f3af97 246#define Mxmm { OP_M, xmm_mode }
ce518a5f
L
247#define Gb { OP_G, b_mode }
248#define Gv { OP_G, v_mode }
249#define Gd { OP_G, d_mode }
250#define Gdq { OP_G, dq_mode }
251#define Gm { OP_G, m_mode }
252#define Gw { OP_G, w_mode }
6f74c397
L
253#define Rd { OP_R, d_mode }
254#define Rm { OP_R, m_mode }
ce518a5f
L
255#define Ib { OP_I, b_mode }
256#define sIb { OP_sI, b_mode } /* sign extened byte */
257#define Iv { OP_I, v_mode }
258#define Iq { OP_I, q_mode }
259#define Iv64 { OP_I64, v_mode }
260#define Iw { OP_I, w_mode }
261#define I1 { OP_I, const_1_mode }
262#define Jb { OP_J, b_mode }
263#define Jv { OP_J, v_mode }
264#define Cm { OP_C, m_mode }
265#define Dm { OP_D, m_mode }
266#define Td { OP_T, d_mode }
b844680a 267#define Skip_MODRM { OP_Skip_MODRM, 0 }
ce518a5f
L
268
269#define RMeAX { OP_REG, eAX_reg }
270#define RMeBX { OP_REG, eBX_reg }
271#define RMeCX { OP_REG, eCX_reg }
272#define RMeDX { OP_REG, eDX_reg }
273#define RMeSP { OP_REG, eSP_reg }
274#define RMeBP { OP_REG, eBP_reg }
275#define RMeSI { OP_REG, eSI_reg }
276#define RMeDI { OP_REG, eDI_reg }
277#define RMrAX { OP_REG, rAX_reg }
278#define RMrBX { OP_REG, rBX_reg }
279#define RMrCX { OP_REG, rCX_reg }
280#define RMrDX { OP_REG, rDX_reg }
281#define RMrSP { OP_REG, rSP_reg }
282#define RMrBP { OP_REG, rBP_reg }
283#define RMrSI { OP_REG, rSI_reg }
284#define RMrDI { OP_REG, rDI_reg }
285#define RMAL { OP_REG, al_reg }
286#define RMAL { OP_REG, al_reg }
287#define RMCL { OP_REG, cl_reg }
288#define RMDL { OP_REG, dl_reg }
289#define RMBL { OP_REG, bl_reg }
290#define RMAH { OP_REG, ah_reg }
291#define RMCH { OP_REG, ch_reg }
292#define RMDH { OP_REG, dh_reg }
293#define RMBH { OP_REG, bh_reg }
294#define RMAX { OP_REG, ax_reg }
295#define RMDX { OP_REG, dx_reg }
296
297#define eAX { OP_IMREG, eAX_reg }
298#define eBX { OP_IMREG, eBX_reg }
299#define eCX { OP_IMREG, eCX_reg }
300#define eDX { OP_IMREG, eDX_reg }
301#define eSP { OP_IMREG, eSP_reg }
302#define eBP { OP_IMREG, eBP_reg }
303#define eSI { OP_IMREG, eSI_reg }
304#define eDI { OP_IMREG, eDI_reg }
305#define AL { OP_IMREG, al_reg }
306#define CL { OP_IMREG, cl_reg }
307#define DL { OP_IMREG, dl_reg }
308#define BL { OP_IMREG, bl_reg }
309#define AH { OP_IMREG, ah_reg }
310#define CH { OP_IMREG, ch_reg }
311#define DH { OP_IMREG, dh_reg }
312#define BH { OP_IMREG, bh_reg }
313#define AX { OP_IMREG, ax_reg }
314#define DX { OP_IMREG, dx_reg }
315#define zAX { OP_IMREG, z_mode_ax_reg }
316#define indirDX { OP_IMREG, indir_dx_reg }
317
318#define Sw { OP_SEG, w_mode }
319#define Sv { OP_SEG, v_mode }
320#define Ap { OP_DIR, 0 }
321#define Ob { OP_OFF64, b_mode }
322#define Ov { OP_OFF64, v_mode }
323#define Xb { OP_DSreg, eSI_reg }
324#define Xv { OP_DSreg, eSI_reg }
325#define Xz { OP_DSreg, eSI_reg }
326#define Yb { OP_ESreg, eDI_reg }
327#define Yv { OP_ESreg, eDI_reg }
328#define DSBX { OP_DSreg, eBX_reg }
329
330#define es { OP_REG, es_reg }
331#define ss { OP_REG, ss_reg }
332#define cs { OP_REG, cs_reg }
333#define ds { OP_REG, ds_reg }
334#define fs { OP_REG, fs_reg }
335#define gs { OP_REG, gs_reg }
336
337#define MX { OP_MMX, 0 }
338#define XM { OP_XMM, 0 }
c0f3af97 339#define XMM { OP_XMM, xmm_mode }
ce518a5f 340#define EM { OP_EM, v_mode }
b6169b20 341#define EMS { OP_EM, v_swap_mode }
09a2c6cf 342#define EMd { OP_EM, d_mode }
14051056 343#define EMx { OP_EM, x_mode }
8976381e 344#define EXw { OP_EX, w_mode }
09a2c6cf 345#define EXd { OP_EX, d_mode }
fa99fab2 346#define EXdS { OP_EX, d_swap_mode }
09a2c6cf 347#define EXq { OP_EX, q_mode }
b6169b20 348#define EXqS { OP_EX, q_swap_mode }
09a2c6cf 349#define EXx { OP_EX, x_mode }
b6169b20 350#define EXxS { OP_EX, x_swap_mode }
c0f3af97
L
351#define EXxmm { OP_EX, xmm_mode }
352#define EXxmmq { OP_EX, xmmq_mode }
353#define EXymmq { OP_EX, ymmq_mode }
0bfee649 354#define EXVexWdq { OP_EX, vex_w_dq_mode }
ce518a5f
L
355#define MS { OP_MS, v_mode }
356#define XS { OP_XS, v_mode }
09335d05 357#define EMCq { OP_EMC, q_mode }
ce518a5f 358#define MXC { OP_MXC, 0 }
ce518a5f 359#define OPSUF { OP_3DNowSuffix, 0 }
ad19981d 360#define CMP { CMP_Fixup, 0 }
42903f7f 361#define XMM0 { XMM_Fixup, 0 }
eacc9c89 362#define FXSAVE { FXSAVE_Fixup, 0 }
5dd85c99
SP
363#define Vex_2src_1 { OP_Vex_2src_1, 0 }
364#define Vex_2src_2 { OP_Vex_2src_2, 0 }
252b5132 365
c0f3af97
L
366#define Vex { OP_VEX, vex_mode }
367#define Vex128 { OP_VEX, vex128_mode }
368#define Vex256 { OP_VEX, vex256_mode }
922d8de8 369#define VexI4 { VEXI4_Fixup, 0}
c0f3af97 370#define EXdVex { OP_EX_Vex, d_mode }
fa99fab2 371#define EXdVexS { OP_EX_Vex, d_swap_mode }
c0f3af97 372#define EXqVex { OP_EX_Vex, q_mode }
fa99fab2 373#define EXqVexS { OP_EX_Vex, q_swap_mode }
922d8de8
DR
374#define EXVexW { OP_EX_VexW, x_mode }
375#define EXdVexW { OP_EX_VexW, d_mode }
376#define EXqVexW { OP_EX_VexW, q_mode }
c0f3af97 377#define XMVex { OP_XMM_Vex, 0 }
922d8de8 378#define XMVexW { OP_XMM_VexW, 0 }
c0f3af97
L
379#define XMVexI4 { OP_REG_VexI4, x_mode }
380#define PCLMUL { PCLMUL_Fixup, 0 }
381#define VZERO { VZERO_Fixup, 0 }
382#define VCMP { VCMP_Fixup, 0 }
c0f3af97 383
35c52694 384/* Used handle "rep" prefix for string instructions. */
ce518a5f
L
385#define Xbr { REP_Fixup, eSI_reg }
386#define Xvr { REP_Fixup, eSI_reg }
387#define Ybr { REP_Fixup, eDI_reg }
388#define Yvr { REP_Fixup, eDI_reg }
389#define Yzr { REP_Fixup, eDI_reg }
390#define indirDXr { REP_Fixup, indir_dx_reg }
391#define ALr { REP_Fixup, al_reg }
392#define eAXr { REP_Fixup, eAX_reg }
393
394#define cond_jump_flag { NULL, cond_jump_mode }
395#define loop_jcxz_flag { NULL, loop_jcxz_mode }
3ffd33cf 396
252b5132 397/* bits in sizeflag */
252b5132 398#define SUFFIX_ALWAYS 4
252b5132
RH
399#define AFLAG 2
400#define DFLAG 1
401
51e7da1b
L
402enum
403{
404 /* byte operand */
405 b_mode = 1,
406 /* byte operand with operand swapped */
3873ba12 407 b_swap_mode,
51e7da1b 408 /* operand size depends on prefixes */
3873ba12 409 v_mode,
51e7da1b 410 /* operand size depends on prefixes with operand swapped */
3873ba12 411 v_swap_mode,
51e7da1b 412 /* word operand */
3873ba12 413 w_mode,
51e7da1b 414 /* double word operand */
3873ba12 415 d_mode,
51e7da1b 416 /* double word operand with operand swapped */
3873ba12 417 d_swap_mode,
51e7da1b 418 /* quad word operand */
3873ba12 419 q_mode,
51e7da1b 420 /* quad word operand with operand swapped */
3873ba12 421 q_swap_mode,
51e7da1b 422 /* ten-byte operand */
3873ba12 423 t_mode,
51e7da1b 424 /* 16-byte XMM or 32-byte YMM operand */
3873ba12 425 x_mode,
51e7da1b 426 /* 16-byte XMM or 32-byte YMM operand with operand swapped */
3873ba12 427 x_swap_mode,
51e7da1b 428 /* 16-byte XMM operand */
3873ba12 429 xmm_mode,
51e7da1b 430 /* 16-byte XMM or quad word operand */
3873ba12 431 xmmq_mode,
51e7da1b 432 /* 32-byte YMM or quad word operand */
3873ba12 433 ymmq_mode,
51e7da1b 434 /* d_mode in 32bit, q_mode in 64bit mode. */
3873ba12 435 m_mode,
51e7da1b 436 /* pair of v_mode operands */
3873ba12
L
437 a_mode,
438 cond_jump_mode,
439 loop_jcxz_mode,
51e7da1b 440 /* operand size depends on REX prefixes. */
3873ba12 441 dq_mode,
51e7da1b 442 /* registers like dq_mode, memory like w_mode. */
3873ba12 443 dqw_mode,
51e7da1b 444 /* 4- or 6-byte pointer operand */
3873ba12
L
445 f_mode,
446 const_1_mode,
51e7da1b 447 /* v_mode for stack-related opcodes. */
3873ba12 448 stack_v_mode,
51e7da1b 449 /* non-quad operand size depends on prefixes */
3873ba12 450 z_mode,
51e7da1b 451 /* 16-byte operand */
3873ba12 452 o_mode,
51e7da1b 453 /* registers like dq_mode, memory like b_mode. */
3873ba12 454 dqb_mode,
51e7da1b 455 /* registers like dq_mode, memory like d_mode. */
3873ba12 456 dqd_mode,
51e7da1b 457 /* normal vex mode */
3873ba12 458 vex_mode,
51e7da1b 459 /* 128bit vex mode */
3873ba12 460 vex128_mode,
51e7da1b 461 /* 256bit vex mode */
3873ba12 462 vex256_mode,
51e7da1b 463 /* operand size depends on the VEX.W bit. */
3873ba12 464 vex_w_dq_mode,
d55ee72f 465
3873ba12
L
466 es_reg,
467 cs_reg,
468 ss_reg,
469 ds_reg,
470 fs_reg,
471 gs_reg,
d55ee72f 472
3873ba12
L
473 eAX_reg,
474 eCX_reg,
475 eDX_reg,
476 eBX_reg,
477 eSP_reg,
478 eBP_reg,
479 eSI_reg,
480 eDI_reg,
d55ee72f 481
3873ba12
L
482 al_reg,
483 cl_reg,
484 dl_reg,
485 bl_reg,
486 ah_reg,
487 ch_reg,
488 dh_reg,
489 bh_reg,
d55ee72f 490
3873ba12
L
491 ax_reg,
492 cx_reg,
493 dx_reg,
494 bx_reg,
495 sp_reg,
496 bp_reg,
497 si_reg,
498 di_reg,
d55ee72f 499
3873ba12
L
500 rAX_reg,
501 rCX_reg,
502 rDX_reg,
503 rBX_reg,
504 rSP_reg,
505 rBP_reg,
506 rSI_reg,
507 rDI_reg,
d55ee72f 508
3873ba12
L
509 z_mode_ax_reg,
510 indir_dx_reg
51e7da1b 511};
252b5132 512
51e7da1b
L
513enum
514{
515 FLOATCODE = 1,
3873ba12
L
516 USE_REG_TABLE,
517 USE_MOD_TABLE,
518 USE_RM_TABLE,
519 USE_PREFIX_TABLE,
520 USE_X86_64_TABLE,
521 USE_3BYTE_TABLE,
f88c9eb0 522 USE_XOP_8F_TABLE,
3873ba12
L
523 USE_VEX_C4_TABLE,
524 USE_VEX_C5_TABLE,
525 USE_VEX_LEN_TABLE
51e7da1b 526};
6439fc28 527
1ceb70f8 528#define FLOAT NULL, { { NULL, FLOATCODE } }
4efba78c 529
4e7d34a6 530#define DIS386(T, I) NULL, { { NULL, (T)}, { NULL, (I) } }
1ceb70f8
L
531#define REG_TABLE(I) DIS386 (USE_REG_TABLE, (I))
532#define MOD_TABLE(I) DIS386 (USE_MOD_TABLE, (I))
533#define RM_TABLE(I) DIS386 (USE_RM_TABLE, (I))
534#define PREFIX_TABLE(I) DIS386 (USE_PREFIX_TABLE, (I))
4e7d34a6
L
535#define X86_64_TABLE(I) DIS386 (USE_X86_64_TABLE, (I))
536#define THREE_BYTE_TABLE(I) DIS386 (USE_3BYTE_TABLE, (I))
f88c9eb0 537#define XOP_8F_TABLE(I) DIS386 (USE_XOP_8F_TABLE, (I))
c0f3af97
L
538#define VEX_C4_TABLE(I) DIS386 (USE_VEX_C4_TABLE, (I))
539#define VEX_C5_TABLE(I) DIS386 (USE_VEX_C5_TABLE, (I))
540#define VEX_LEN_TABLE(I) DIS386 (USE_VEX_LEN_TABLE, (I))
1ceb70f8 541
51e7da1b
L
542enum
543{
544 REG_80 = 0,
3873ba12
L
545 REG_81,
546 REG_82,
547 REG_8F,
548 REG_C0,
549 REG_C1,
550 REG_C6,
551 REG_C7,
552 REG_D0,
553 REG_D1,
554 REG_D2,
555 REG_D3,
556 REG_F6,
557 REG_F7,
558 REG_FE,
559 REG_FF,
560 REG_0F00,
561 REG_0F01,
562 REG_0F0D,
563 REG_0F18,
564 REG_0F71,
565 REG_0F72,
566 REG_0F73,
567 REG_0FA6,
568 REG_0FA7,
569 REG_0FAE,
570 REG_0FBA,
571 REG_0FC7,
572 REG_VEX_71,
573 REG_VEX_72,
574 REG_VEX_73,
f88c9eb0
SP
575 REG_VEX_AE,
576 REG_XOP_LWPCB,
577 REG_XOP_LWP
51e7da1b 578};
1ceb70f8 579
51e7da1b
L
580enum
581{
582 MOD_8D = 0,
3873ba12
L
583 MOD_0F01_REG_0,
584 MOD_0F01_REG_1,
585 MOD_0F01_REG_2,
586 MOD_0F01_REG_3,
587 MOD_0F01_REG_7,
588 MOD_0F12_PREFIX_0,
589 MOD_0F13,
590 MOD_0F16_PREFIX_0,
591 MOD_0F17,
592 MOD_0F18_REG_0,
593 MOD_0F18_REG_1,
594 MOD_0F18_REG_2,
595 MOD_0F18_REG_3,
596 MOD_0F20,
597 MOD_0F21,
598 MOD_0F22,
599 MOD_0F23,
600 MOD_0F24,
601 MOD_0F26,
602 MOD_0F2B_PREFIX_0,
603 MOD_0F2B_PREFIX_1,
604 MOD_0F2B_PREFIX_2,
605 MOD_0F2B_PREFIX_3,
606 MOD_0F51,
607 MOD_0F71_REG_2,
608 MOD_0F71_REG_4,
609 MOD_0F71_REG_6,
610 MOD_0F72_REG_2,
611 MOD_0F72_REG_4,
612 MOD_0F72_REG_6,
613 MOD_0F73_REG_2,
614 MOD_0F73_REG_3,
615 MOD_0F73_REG_6,
616 MOD_0F73_REG_7,
617 MOD_0FAE_REG_0,
618 MOD_0FAE_REG_1,
619 MOD_0FAE_REG_2,
620 MOD_0FAE_REG_3,
621 MOD_0FAE_REG_4,
622 MOD_0FAE_REG_5,
623 MOD_0FAE_REG_6,
624 MOD_0FAE_REG_7,
625 MOD_0FB2,
626 MOD_0FB4,
627 MOD_0FB5,
628 MOD_0FC7_REG_6,
629 MOD_0FC7_REG_7,
630 MOD_0FD7,
631 MOD_0FE7_PREFIX_2,
632 MOD_0FF0_PREFIX_3,
633 MOD_0F382A_PREFIX_2,
634 MOD_62_32BIT,
635 MOD_C4_32BIT,
636 MOD_C5_32BIT,
637 MOD_VEX_12_PREFIX_0,
638 MOD_VEX_13,
639 MOD_VEX_16_PREFIX_0,
640 MOD_VEX_17,
641 MOD_VEX_2B,
642 MOD_VEX_51,
643 MOD_VEX_71_REG_2,
644 MOD_VEX_71_REG_4,
645 MOD_VEX_71_REG_6,
646 MOD_VEX_72_REG_2,
647 MOD_VEX_72_REG_4,
648 MOD_VEX_72_REG_6,
649 MOD_VEX_73_REG_2,
650 MOD_VEX_73_REG_3,
651 MOD_VEX_73_REG_6,
652 MOD_VEX_73_REG_7,
653 MOD_VEX_AE_REG_2,
654 MOD_VEX_AE_REG_3,
655 MOD_VEX_D7_PREFIX_2,
656 MOD_VEX_E7_PREFIX_2,
657 MOD_VEX_F0_PREFIX_3,
658 MOD_VEX_3818_PREFIX_2,
659 MOD_VEX_3819_PREFIX_2,
660 MOD_VEX_381A_PREFIX_2,
661 MOD_VEX_382A_PREFIX_2,
662 MOD_VEX_382C_PREFIX_2,
663 MOD_VEX_382D_PREFIX_2,
664 MOD_VEX_382E_PREFIX_2,
665 MOD_VEX_382F_PREFIX_2
51e7da1b 666};
1ceb70f8 667
51e7da1b
L
668enum
669{
670 RM_0F01_REG_0 = 0,
3873ba12
L
671 RM_0F01_REG_1,
672 RM_0F01_REG_2,
673 RM_0F01_REG_3,
674 RM_0F01_REG_7,
675 RM_0FAE_REG_5,
676 RM_0FAE_REG_6,
677 RM_0FAE_REG_7
51e7da1b 678};
1ceb70f8 679
51e7da1b
L
680enum
681{
682 PREFIX_90 = 0,
3873ba12
L
683 PREFIX_0F10,
684 PREFIX_0F11,
685 PREFIX_0F12,
686 PREFIX_0F16,
687 PREFIX_0F2A,
688 PREFIX_0F2B,
689 PREFIX_0F2C,
690 PREFIX_0F2D,
691 PREFIX_0F2E,
692 PREFIX_0F2F,
693 PREFIX_0F51,
694 PREFIX_0F52,
695 PREFIX_0F53,
696 PREFIX_0F58,
697 PREFIX_0F59,
698 PREFIX_0F5A,
699 PREFIX_0F5B,
700 PREFIX_0F5C,
701 PREFIX_0F5D,
702 PREFIX_0F5E,
703 PREFIX_0F5F,
704 PREFIX_0F60,
705 PREFIX_0F61,
706 PREFIX_0F62,
707 PREFIX_0F6C,
708 PREFIX_0F6D,
709 PREFIX_0F6F,
710 PREFIX_0F70,
711 PREFIX_0F73_REG_3,
712 PREFIX_0F73_REG_7,
713 PREFIX_0F78,
714 PREFIX_0F79,
715 PREFIX_0F7C,
716 PREFIX_0F7D,
717 PREFIX_0F7E,
718 PREFIX_0F7F,
719 PREFIX_0FB8,
720 PREFIX_0FBD,
721 PREFIX_0FC2,
722 PREFIX_0FC3,
723 PREFIX_0FC7_REG_6,
724 PREFIX_0FD0,
725 PREFIX_0FD6,
726 PREFIX_0FE6,
727 PREFIX_0FE7,
728 PREFIX_0FF0,
729 PREFIX_0FF7,
730 PREFIX_0F3810,
731 PREFIX_0F3814,
732 PREFIX_0F3815,
733 PREFIX_0F3817,
734 PREFIX_0F3820,
735 PREFIX_0F3821,
736 PREFIX_0F3822,
737 PREFIX_0F3823,
738 PREFIX_0F3824,
739 PREFIX_0F3825,
740 PREFIX_0F3828,
741 PREFIX_0F3829,
742 PREFIX_0F382A,
743 PREFIX_0F382B,
744 PREFIX_0F3830,
745 PREFIX_0F3831,
746 PREFIX_0F3832,
747 PREFIX_0F3833,
748 PREFIX_0F3834,
749 PREFIX_0F3835,
750 PREFIX_0F3837,
751 PREFIX_0F3838,
752 PREFIX_0F3839,
753 PREFIX_0F383A,
754 PREFIX_0F383B,
755 PREFIX_0F383C,
756 PREFIX_0F383D,
757 PREFIX_0F383E,
758 PREFIX_0F383F,
759 PREFIX_0F3840,
760 PREFIX_0F3841,
761 PREFIX_0F3880,
762 PREFIX_0F3881,
763 PREFIX_0F38DB,
764 PREFIX_0F38DC,
765 PREFIX_0F38DD,
766 PREFIX_0F38DE,
767 PREFIX_0F38DF,
768 PREFIX_0F38F0,
769 PREFIX_0F38F1,
770 PREFIX_0F3A08,
771 PREFIX_0F3A09,
772 PREFIX_0F3A0A,
773 PREFIX_0F3A0B,
774 PREFIX_0F3A0C,
775 PREFIX_0F3A0D,
776 PREFIX_0F3A0E,
777 PREFIX_0F3A14,
778 PREFIX_0F3A15,
779 PREFIX_0F3A16,
780 PREFIX_0F3A17,
781 PREFIX_0F3A20,
782 PREFIX_0F3A21,
783 PREFIX_0F3A22,
784 PREFIX_0F3A40,
785 PREFIX_0F3A41,
786 PREFIX_0F3A42,
787 PREFIX_0F3A44,
788 PREFIX_0F3A60,
789 PREFIX_0F3A61,
790 PREFIX_0F3A62,
791 PREFIX_0F3A63,
792 PREFIX_0F3ADF,
793 PREFIX_VEX_10,
794 PREFIX_VEX_11,
795 PREFIX_VEX_12,
796 PREFIX_VEX_16,
797 PREFIX_VEX_2A,
798 PREFIX_VEX_2C,
799 PREFIX_VEX_2D,
800 PREFIX_VEX_2E,
801 PREFIX_VEX_2F,
802 PREFIX_VEX_51,
803 PREFIX_VEX_52,
804 PREFIX_VEX_53,
805 PREFIX_VEX_58,
806 PREFIX_VEX_59,
807 PREFIX_VEX_5A,
808 PREFIX_VEX_5B,
809 PREFIX_VEX_5C,
810 PREFIX_VEX_5D,
811 PREFIX_VEX_5E,
812 PREFIX_VEX_5F,
813 PREFIX_VEX_60,
814 PREFIX_VEX_61,
815 PREFIX_VEX_62,
816 PREFIX_VEX_63,
817 PREFIX_VEX_64,
818 PREFIX_VEX_65,
819 PREFIX_VEX_66,
820 PREFIX_VEX_67,
821 PREFIX_VEX_68,
822 PREFIX_VEX_69,
823 PREFIX_VEX_6A,
824 PREFIX_VEX_6B,
825 PREFIX_VEX_6C,
826 PREFIX_VEX_6D,
827 PREFIX_VEX_6E,
828 PREFIX_VEX_6F,
829 PREFIX_VEX_70,
830 PREFIX_VEX_71_REG_2,
831 PREFIX_VEX_71_REG_4,
832 PREFIX_VEX_71_REG_6,
833 PREFIX_VEX_72_REG_2,
834 PREFIX_VEX_72_REG_4,
835 PREFIX_VEX_72_REG_6,
836 PREFIX_VEX_73_REG_2,
837 PREFIX_VEX_73_REG_3,
838 PREFIX_VEX_73_REG_6,
839 PREFIX_VEX_73_REG_7,
840 PREFIX_VEX_74,
841 PREFIX_VEX_75,
842 PREFIX_VEX_76,
843 PREFIX_VEX_77,
844 PREFIX_VEX_7C,
845 PREFIX_VEX_7D,
846 PREFIX_VEX_7E,
847 PREFIX_VEX_7F,
848 PREFIX_VEX_C2,
849 PREFIX_VEX_C4,
850 PREFIX_VEX_C5,
851 PREFIX_VEX_D0,
852 PREFIX_VEX_D1,
853 PREFIX_VEX_D2,
854 PREFIX_VEX_D3,
855 PREFIX_VEX_D4,
856 PREFIX_VEX_D5,
857 PREFIX_VEX_D6,
858 PREFIX_VEX_D7,
859 PREFIX_VEX_D8,
860 PREFIX_VEX_D9,
861 PREFIX_VEX_DA,
862 PREFIX_VEX_DB,
863 PREFIX_VEX_DC,
864 PREFIX_VEX_DD,
865 PREFIX_VEX_DE,
866 PREFIX_VEX_DF,
867 PREFIX_VEX_E0,
868 PREFIX_VEX_E1,
869 PREFIX_VEX_E2,
870 PREFIX_VEX_E3,
871 PREFIX_VEX_E4,
872 PREFIX_VEX_E5,
873 PREFIX_VEX_E6,
874 PREFIX_VEX_E7,
875 PREFIX_VEX_E8,
876 PREFIX_VEX_E9,
877 PREFIX_VEX_EA,
878 PREFIX_VEX_EB,
879 PREFIX_VEX_EC,
880 PREFIX_VEX_ED,
881 PREFIX_VEX_EE,
882 PREFIX_VEX_EF,
883 PREFIX_VEX_F0,
884 PREFIX_VEX_F1,
885 PREFIX_VEX_F2,
886 PREFIX_VEX_F3,
887 PREFIX_VEX_F4,
888 PREFIX_VEX_F5,
889 PREFIX_VEX_F6,
890 PREFIX_VEX_F7,
891 PREFIX_VEX_F8,
892 PREFIX_VEX_F9,
893 PREFIX_VEX_FA,
894 PREFIX_VEX_FB,
895 PREFIX_VEX_FC,
896 PREFIX_VEX_FD,
897 PREFIX_VEX_FE,
898 PREFIX_VEX_3800,
899 PREFIX_VEX_3801,
900 PREFIX_VEX_3802,
901 PREFIX_VEX_3803,
902 PREFIX_VEX_3804,
903 PREFIX_VEX_3805,
904 PREFIX_VEX_3806,
905 PREFIX_VEX_3807,
906 PREFIX_VEX_3808,
907 PREFIX_VEX_3809,
908 PREFIX_VEX_380A,
909 PREFIX_VEX_380B,
910 PREFIX_VEX_380C,
911 PREFIX_VEX_380D,
912 PREFIX_VEX_380E,
913 PREFIX_VEX_380F,
914 PREFIX_VEX_3817,
915 PREFIX_VEX_3818,
916 PREFIX_VEX_3819,
917 PREFIX_VEX_381A,
918 PREFIX_VEX_381C,
919 PREFIX_VEX_381D,
920 PREFIX_VEX_381E,
921 PREFIX_VEX_3820,
922 PREFIX_VEX_3821,
923 PREFIX_VEX_3822,
924 PREFIX_VEX_3823,
925 PREFIX_VEX_3824,
926 PREFIX_VEX_3825,
927 PREFIX_VEX_3828,
928 PREFIX_VEX_3829,
929 PREFIX_VEX_382A,
930 PREFIX_VEX_382B,
931 PREFIX_VEX_382C,
932 PREFIX_VEX_382D,
933 PREFIX_VEX_382E,
934 PREFIX_VEX_382F,
935 PREFIX_VEX_3830,
936 PREFIX_VEX_3831,
937 PREFIX_VEX_3832,
938 PREFIX_VEX_3833,
939 PREFIX_VEX_3834,
940 PREFIX_VEX_3835,
941 PREFIX_VEX_3837,
942 PREFIX_VEX_3838,
943 PREFIX_VEX_3839,
944 PREFIX_VEX_383A,
945 PREFIX_VEX_383B,
946 PREFIX_VEX_383C,
947 PREFIX_VEX_383D,
948 PREFIX_VEX_383E,
949 PREFIX_VEX_383F,
950 PREFIX_VEX_3840,
951 PREFIX_VEX_3841,
952 PREFIX_VEX_3896,
953 PREFIX_VEX_3897,
954 PREFIX_VEX_3898,
955 PREFIX_VEX_3899,
956 PREFIX_VEX_389A,
957 PREFIX_VEX_389B,
958 PREFIX_VEX_389C,
959 PREFIX_VEX_389D,
960 PREFIX_VEX_389E,
961 PREFIX_VEX_389F,
962 PREFIX_VEX_38A6,
963 PREFIX_VEX_38A7,
964 PREFIX_VEX_38A8,
965 PREFIX_VEX_38A9,
966 PREFIX_VEX_38AA,
967 PREFIX_VEX_38AB,
968 PREFIX_VEX_38AC,
969 PREFIX_VEX_38AD,
970 PREFIX_VEX_38AE,
971 PREFIX_VEX_38AF,
972 PREFIX_VEX_38B6,
973 PREFIX_VEX_38B7,
974 PREFIX_VEX_38B8,
975 PREFIX_VEX_38B9,
976 PREFIX_VEX_38BA,
977 PREFIX_VEX_38BB,
978 PREFIX_VEX_38BC,
979 PREFIX_VEX_38BD,
980 PREFIX_VEX_38BE,
981 PREFIX_VEX_38BF,
982 PREFIX_VEX_38DB,
983 PREFIX_VEX_38DC,
984 PREFIX_VEX_38DD,
985 PREFIX_VEX_38DE,
986 PREFIX_VEX_38DF,
987 PREFIX_VEX_3A04,
988 PREFIX_VEX_3A05,
989 PREFIX_VEX_3A06,
990 PREFIX_VEX_3A08,
991 PREFIX_VEX_3A09,
992 PREFIX_VEX_3A0A,
993 PREFIX_VEX_3A0B,
994 PREFIX_VEX_3A0C,
995 PREFIX_VEX_3A0D,
996 PREFIX_VEX_3A0E,
997 PREFIX_VEX_3A0F,
998 PREFIX_VEX_3A14,
999 PREFIX_VEX_3A15,
1000 PREFIX_VEX_3A16,
1001 PREFIX_VEX_3A17,
1002 PREFIX_VEX_3A18,
1003 PREFIX_VEX_3A19,
1004 PREFIX_VEX_3A20,
1005 PREFIX_VEX_3A21,
1006 PREFIX_VEX_3A22,
1007 PREFIX_VEX_3A40,
1008 PREFIX_VEX_3A41,
1009 PREFIX_VEX_3A42,
1010 PREFIX_VEX_3A44,
1011 PREFIX_VEX_3A4A,
1012 PREFIX_VEX_3A4B,
1013 PREFIX_VEX_3A4C,
1014 PREFIX_VEX_3A5C,
1015 PREFIX_VEX_3A5D,
1016 PREFIX_VEX_3A5E,
1017 PREFIX_VEX_3A5F,
1018 PREFIX_VEX_3A60,
1019 PREFIX_VEX_3A61,
1020 PREFIX_VEX_3A62,
1021 PREFIX_VEX_3A63,
1022 PREFIX_VEX_3A68,
1023 PREFIX_VEX_3A69,
1024 PREFIX_VEX_3A6A,
1025 PREFIX_VEX_3A6B,
1026 PREFIX_VEX_3A6C,
1027 PREFIX_VEX_3A6D,
1028 PREFIX_VEX_3A6E,
1029 PREFIX_VEX_3A6F,
1030 PREFIX_VEX_3A78,
1031 PREFIX_VEX_3A79,
1032 PREFIX_VEX_3A7A,
1033 PREFIX_VEX_3A7B,
1034 PREFIX_VEX_3A7C,
1035 PREFIX_VEX_3A7D,
1036 PREFIX_VEX_3A7E,
1037 PREFIX_VEX_3A7F,
1038 PREFIX_VEX_3ADF
51e7da1b 1039};
4e7d34a6 1040
51e7da1b
L
1041enum
1042{
1043 X86_64_06 = 0,
3873ba12
L
1044 X86_64_07,
1045 X86_64_0D,
1046 X86_64_16,
1047 X86_64_17,
1048 X86_64_1E,
1049 X86_64_1F,
1050 X86_64_27,
1051 X86_64_2F,
1052 X86_64_37,
1053 X86_64_3F,
1054 X86_64_60,
1055 X86_64_61,
1056 X86_64_62,
1057 X86_64_63,
1058 X86_64_6D,
1059 X86_64_6F,
1060 X86_64_9A,
1061 X86_64_C4,
1062 X86_64_C5,
1063 X86_64_CE,
1064 X86_64_D4,
1065 X86_64_D5,
1066 X86_64_EA,
1067 X86_64_0F01_REG_0,
1068 X86_64_0F01_REG_1,
1069 X86_64_0F01_REG_2,
1070 X86_64_0F01_REG_3
51e7da1b 1071};
4e7d34a6 1072
51e7da1b
L
1073enum
1074{
1075 THREE_BYTE_0F38 = 0,
3873ba12
L
1076 THREE_BYTE_0F3A,
1077 THREE_BYTE_0F7A
51e7da1b 1078};
4e7d34a6 1079
f88c9eb0
SP
1080enum
1081{
5dd85c99
SP
1082 XOP_08 = 0,
1083 XOP_09,
f88c9eb0
SP
1084 XOP_0A
1085};
1086
51e7da1b
L
1087enum
1088{
1089 VEX_0F = 0,
3873ba12
L
1090 VEX_0F38,
1091 VEX_0F3A
51e7da1b 1092};
c0f3af97 1093
51e7da1b
L
1094enum
1095{
1096 VEX_LEN_10_P_1 = 0,
3873ba12
L
1097 VEX_LEN_10_P_3,
1098 VEX_LEN_11_P_1,
1099 VEX_LEN_11_P_3,
1100 VEX_LEN_12_P_0_M_0,
1101 VEX_LEN_12_P_0_M_1,
1102 VEX_LEN_12_P_2,
1103 VEX_LEN_13_M_0,
1104 VEX_LEN_16_P_0_M_0,
1105 VEX_LEN_16_P_0_M_1,
1106 VEX_LEN_16_P_2,
1107 VEX_LEN_17_M_0,
1108 VEX_LEN_2A_P_1,
1109 VEX_LEN_2A_P_3,
1110 VEX_LEN_2C_P_1,
1111 VEX_LEN_2C_P_3,
1112 VEX_LEN_2D_P_1,
1113 VEX_LEN_2D_P_3,
1114 VEX_LEN_2E_P_0,
1115 VEX_LEN_2E_P_2,
1116 VEX_LEN_2F_P_0,
1117 VEX_LEN_2F_P_2,
1118 VEX_LEN_51_P_1,
1119 VEX_LEN_51_P_3,
1120 VEX_LEN_52_P_1,
1121 VEX_LEN_53_P_1,
1122 VEX_LEN_58_P_1,
1123 VEX_LEN_58_P_3,
1124 VEX_LEN_59_P_1,
1125 VEX_LEN_59_P_3,
1126 VEX_LEN_5A_P_1,
1127 VEX_LEN_5A_P_3,
1128 VEX_LEN_5C_P_1,
1129 VEX_LEN_5C_P_3,
1130 VEX_LEN_5D_P_1,
1131 VEX_LEN_5D_P_3,
1132 VEX_LEN_5E_P_1,
1133 VEX_LEN_5E_P_3,
1134 VEX_LEN_5F_P_1,
1135 VEX_LEN_5F_P_3,
1136 VEX_LEN_60_P_2,
1137 VEX_LEN_61_P_2,
1138 VEX_LEN_62_P_2,
1139 VEX_LEN_63_P_2,
1140 VEX_LEN_64_P_2,
1141 VEX_LEN_65_P_2,
1142 VEX_LEN_66_P_2,
1143 VEX_LEN_67_P_2,
1144 VEX_LEN_68_P_2,
1145 VEX_LEN_69_P_2,
1146 VEX_LEN_6A_P_2,
1147 VEX_LEN_6B_P_2,
1148 VEX_LEN_6C_P_2,
1149 VEX_LEN_6D_P_2,
1150 VEX_LEN_6E_P_2,
1151 VEX_LEN_70_P_1,
1152 VEX_LEN_70_P_2,
1153 VEX_LEN_70_P_3,
1154 VEX_LEN_71_R_2_P_2,
1155 VEX_LEN_71_R_4_P_2,
1156 VEX_LEN_71_R_6_P_2,
1157 VEX_LEN_72_R_2_P_2,
1158 VEX_LEN_72_R_4_P_2,
1159 VEX_LEN_72_R_6_P_2,
1160 VEX_LEN_73_R_2_P_2,
1161 VEX_LEN_73_R_3_P_2,
1162 VEX_LEN_73_R_6_P_2,
1163 VEX_LEN_73_R_7_P_2,
1164 VEX_LEN_74_P_2,
1165 VEX_LEN_75_P_2,
1166 VEX_LEN_76_P_2,
1167 VEX_LEN_7E_P_1,
1168 VEX_LEN_7E_P_2,
1169 VEX_LEN_AE_R_2_M_0,
1170 VEX_LEN_AE_R_3_M_0,
1171 VEX_LEN_C2_P_1,
1172 VEX_LEN_C2_P_3,
1173 VEX_LEN_C4_P_2,
1174 VEX_LEN_C5_P_2,
1175 VEX_LEN_D1_P_2,
1176 VEX_LEN_D2_P_2,
1177 VEX_LEN_D3_P_2,
1178 VEX_LEN_D4_P_2,
1179 VEX_LEN_D5_P_2,
1180 VEX_LEN_D6_P_2,
1181 VEX_LEN_D7_P_2_M_1,
1182 VEX_LEN_D8_P_2,
1183 VEX_LEN_D9_P_2,
1184 VEX_LEN_DA_P_2,
1185 VEX_LEN_DB_P_2,
1186 VEX_LEN_DC_P_2,
1187 VEX_LEN_DD_P_2,
1188 VEX_LEN_DE_P_2,
1189 VEX_LEN_DF_P_2,
1190 VEX_LEN_E0_P_2,
1191 VEX_LEN_E1_P_2,
1192 VEX_LEN_E2_P_2,
1193 VEX_LEN_E3_P_2,
1194 VEX_LEN_E4_P_2,
1195 VEX_LEN_E5_P_2,
1196 VEX_LEN_E8_P_2,
1197 VEX_LEN_E9_P_2,
1198 VEX_LEN_EA_P_2,
1199 VEX_LEN_EB_P_2,
1200 VEX_LEN_EC_P_2,
1201 VEX_LEN_ED_P_2,
1202 VEX_LEN_EE_P_2,
1203 VEX_LEN_EF_P_2,
1204 VEX_LEN_F1_P_2,
1205 VEX_LEN_F2_P_2,
1206 VEX_LEN_F3_P_2,
1207 VEX_LEN_F4_P_2,
1208 VEX_LEN_F5_P_2,
1209 VEX_LEN_F6_P_2,
1210 VEX_LEN_F7_P_2,
1211 VEX_LEN_F8_P_2,
1212 VEX_LEN_F9_P_2,
1213 VEX_LEN_FA_P_2,
1214 VEX_LEN_FB_P_2,
1215 VEX_LEN_FC_P_2,
1216 VEX_LEN_FD_P_2,
1217 VEX_LEN_FE_P_2,
1218 VEX_LEN_3800_P_2,
1219 VEX_LEN_3801_P_2,
1220 VEX_LEN_3802_P_2,
1221 VEX_LEN_3803_P_2,
1222 VEX_LEN_3804_P_2,
1223 VEX_LEN_3805_P_2,
1224 VEX_LEN_3806_P_2,
1225 VEX_LEN_3807_P_2,
1226 VEX_LEN_3808_P_2,
1227 VEX_LEN_3809_P_2,
1228 VEX_LEN_380A_P_2,
1229 VEX_LEN_380B_P_2,
1230 VEX_LEN_3819_P_2_M_0,
1231 VEX_LEN_381A_P_2_M_0,
1232 VEX_LEN_381C_P_2,
1233 VEX_LEN_381D_P_2,
1234 VEX_LEN_381E_P_2,
1235 VEX_LEN_3820_P_2,
1236 VEX_LEN_3821_P_2,
1237 VEX_LEN_3822_P_2,
1238 VEX_LEN_3823_P_2,
1239 VEX_LEN_3824_P_2,
1240 VEX_LEN_3825_P_2,
1241 VEX_LEN_3828_P_2,
1242 VEX_LEN_3829_P_2,
1243 VEX_LEN_382A_P_2_M_0,
1244 VEX_LEN_382B_P_2,
1245 VEX_LEN_3830_P_2,
1246 VEX_LEN_3831_P_2,
1247 VEX_LEN_3832_P_2,
1248 VEX_LEN_3833_P_2,
1249 VEX_LEN_3834_P_2,
1250 VEX_LEN_3835_P_2,
1251 VEX_LEN_3837_P_2,
1252 VEX_LEN_3838_P_2,
1253 VEX_LEN_3839_P_2,
1254 VEX_LEN_383A_P_2,
1255 VEX_LEN_383B_P_2,
1256 VEX_LEN_383C_P_2,
1257 VEX_LEN_383D_P_2,
1258 VEX_LEN_383E_P_2,
1259 VEX_LEN_383F_P_2,
1260 VEX_LEN_3840_P_2,
1261 VEX_LEN_3841_P_2,
1262 VEX_LEN_38DB_P_2,
1263 VEX_LEN_38DC_P_2,
1264 VEX_LEN_38DD_P_2,
1265 VEX_LEN_38DE_P_2,
1266 VEX_LEN_38DF_P_2,
1267 VEX_LEN_3A06_P_2,
1268 VEX_LEN_3A0A_P_2,
1269 VEX_LEN_3A0B_P_2,
1270 VEX_LEN_3A0E_P_2,
1271 VEX_LEN_3A0F_P_2,
1272 VEX_LEN_3A14_P_2,
1273 VEX_LEN_3A15_P_2,
1274 VEX_LEN_3A16_P_2,
1275 VEX_LEN_3A17_P_2,
1276 VEX_LEN_3A18_P_2,
1277 VEX_LEN_3A19_P_2,
1278 VEX_LEN_3A20_P_2,
1279 VEX_LEN_3A21_P_2,
1280 VEX_LEN_3A22_P_2,
1281 VEX_LEN_3A41_P_2,
1282 VEX_LEN_3A42_P_2,
1283 VEX_LEN_3A44_P_2,
1284 VEX_LEN_3A4C_P_2,
1285 VEX_LEN_3A60_P_2,
1286 VEX_LEN_3A61_P_2,
1287 VEX_LEN_3A62_P_2,
1288 VEX_LEN_3A63_P_2,
1289 VEX_LEN_3A6A_P_2,
1290 VEX_LEN_3A6B_P_2,
1291 VEX_LEN_3A6E_P_2,
1292 VEX_LEN_3A6F_P_2,
1293 VEX_LEN_3A7A_P_2,
1294 VEX_LEN_3A7B_P_2,
1295 VEX_LEN_3A7E_P_2,
1296 VEX_LEN_3A7F_P_2,
5dd85c99 1297 VEX_LEN_3ADF_P_2,
5dd85c99
SP
1298 VEX_LEN_XOP_09_80,
1299 VEX_LEN_XOP_09_81
51e7da1b 1300};
c0f3af97 1301
26ca5450 1302typedef void (*op_rtn) (int bytemode, int sizeflag);
252b5132
RH
1303
1304struct dis386 {
2da11e11 1305 const char *name;
ce518a5f
L
1306 struct
1307 {
1308 op_rtn rtn;
1309 int bytemode;
1310 } op[MAX_OPERANDS];
252b5132
RH
1311};
1312
1313/* Upper case letters in the instruction names here are macros.
1314 'A' => print 'b' if no register operands or suffix_always is true
1315 'B' => print 'b' if suffix_always is true
9306ca4a 1316 'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
98b528ac 1317 size prefix
ed7841b3 1318 'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
98b528ac 1319 suffix_always is true
252b5132 1320 'E' => print 'e' if 32-bit form of jcxz
3ffd33cf 1321 'F' => print 'w' or 'l' depending on address size prefix (loop insns)
52fd6d94 1322 'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
5dd0794d 1323 'H' => print ",pt" or ",pn" branch hint
9306ca4a 1324 'I' => honor following macro letter even in Intel mode (implemented only
98b528ac 1325 for some of the macro letters)
9306ca4a 1326 'J' => print 'l'
42903f7f 1327 'K' => print 'd' or 'q' if rex prefix is present.
252b5132 1328 'L' => print 'l' if suffix_always is true
9d141669 1329 'M' => print 'r' if intel_mnemonic is false.
252b5132 1330 'N' => print 'n' if instruction has no wait "prefix"
a35ca55a 1331 'O' => print 'd' or 'o' (or 'q' in Intel mode)
52b15da3 1332 'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix,
98b528ac
L
1333 or suffix_always is true. print 'q' if rex prefix is present.
1334 'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
1335 is true
a35ca55a 1336 'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
52b15da3 1337 'S' => print 'w', 'l' or 'q' if suffix_always is true
6439fc28
AM
1338 'T' => print 'q' in 64bit mode and behave as 'P' otherwise
1339 'U' => print 'q' in 64bit mode and behave as 'Q' otherwise
1a114b12 1340 'V' => print 'q' in 64bit mode and behave as 'S' otherwise
a35ca55a 1341 'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
9306ca4a 1342 'X' => print 's', 'd' depending on data16 prefix (for XMM)
8a72226a
L
1343 'Y' => 'q' if instruction has an REX 64bit overwrite prefix and
1344 suffix_always is true.
6dd5059a 1345 'Z' => print 'q' in 64bit mode and behave as 'L' otherwise
9d141669 1346 '!' => change condition from true to false or from false to true.
98b528ac
L
1347 '%' => add 1 upper case letter to the macro.
1348
1349 2 upper case letter macros:
c0f3af97
L
1350 "XY" => print 'x' or 'y' if no register operands or suffix_always
1351 is true.
4b06377f
L
1352 "XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
1353 "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand
98b528ac 1354 or suffix_always is true
4b06377f
L
1355 "LB" => print "abs" in 64bit mode and behave as 'B' otherwise
1356 "LS" => print "abs" in 64bit mode and behave as 'S' otherwise
1357 "LV" => print "abs" for 64bit operand and behave as 'S' otherwise
52b15da3 1358
6439fc28
AM
1359 Many of the above letters print nothing in Intel mode. See "putop"
1360 for the details.
52b15da3 1361
6439fc28 1362 Braces '{' and '}', and vertical bars '|', indicate alternative
7c52e0e8 1363 mnemonic strings for AT&T and Intel. */
252b5132 1364
6439fc28 1365static const struct dis386 dis386[] = {
252b5132 1366 /* 00 */
ce518a5f
L
1367 { "addB", { Eb, Gb } },
1368 { "addS", { Ev, Gv } },
c7532693
L
1369 { "addB", { Gb, EbS } },
1370 { "addS", { Gv, EvS } },
ce518a5f
L
1371 { "addB", { AL, Ib } },
1372 { "addS", { eAX, Iv } },
4e7d34a6
L
1373 { X86_64_TABLE (X86_64_06) },
1374 { X86_64_TABLE (X86_64_07) },
252b5132 1375 /* 08 */
ce518a5f
L
1376 { "orB", { Eb, Gb } },
1377 { "orS", { Ev, Gv } },
c7532693
L
1378 { "orB", { Gb, EbS } },
1379 { "orS", { Gv, EvS } },
ce518a5f
L
1380 { "orB", { AL, Ib } },
1381 { "orS", { eAX, Iv } },
4e7d34a6 1382 { X86_64_TABLE (X86_64_0D) },
ce518a5f 1383 { "(bad)", { XX } }, /* 0x0f extended opcode escape */
252b5132 1384 /* 10 */
ce518a5f
L
1385 { "adcB", { Eb, Gb } },
1386 { "adcS", { Ev, Gv } },
c7532693
L
1387 { "adcB", { Gb, EbS } },
1388 { "adcS", { Gv, EvS } },
ce518a5f
L
1389 { "adcB", { AL, Ib } },
1390 { "adcS", { eAX, Iv } },
4e7d34a6
L
1391 { X86_64_TABLE (X86_64_16) },
1392 { X86_64_TABLE (X86_64_17) },
252b5132 1393 /* 18 */
ce518a5f
L
1394 { "sbbB", { Eb, Gb } },
1395 { "sbbS", { Ev, Gv } },
c7532693
L
1396 { "sbbB", { Gb, EbS } },
1397 { "sbbS", { Gv, EvS } },
ce518a5f
L
1398 { "sbbB", { AL, Ib } },
1399 { "sbbS", { eAX, Iv } },
4e7d34a6
L
1400 { X86_64_TABLE (X86_64_1E) },
1401 { X86_64_TABLE (X86_64_1F) },
252b5132 1402 /* 20 */
ce518a5f
L
1403 { "andB", { Eb, Gb } },
1404 { "andS", { Ev, Gv } },
c7532693
L
1405 { "andB", { Gb, EbS } },
1406 { "andS", { Gv, EvS } },
ce518a5f
L
1407 { "andB", { AL, Ib } },
1408 { "andS", { eAX, Iv } },
1409 { "(bad)", { XX } }, /* SEG ES prefix */
4e7d34a6 1410 { X86_64_TABLE (X86_64_27) },
252b5132 1411 /* 28 */
ce518a5f
L
1412 { "subB", { Eb, Gb } },
1413 { "subS", { Ev, Gv } },
c7532693
L
1414 { "subB", { Gb, EbS } },
1415 { "subS", { Gv, EvS } },
ce518a5f
L
1416 { "subB", { AL, Ib } },
1417 { "subS", { eAX, Iv } },
1418 { "(bad)", { XX } }, /* SEG CS prefix */
4e7d34a6 1419 { X86_64_TABLE (X86_64_2F) },
252b5132 1420 /* 30 */
ce518a5f
L
1421 { "xorB", { Eb, Gb } },
1422 { "xorS", { Ev, Gv } },
c7532693
L
1423 { "xorB", { Gb, EbS } },
1424 { "xorS", { Gv, EvS } },
ce518a5f
L
1425 { "xorB", { AL, Ib } },
1426 { "xorS", { eAX, Iv } },
1427 { "(bad)", { XX } }, /* SEG SS prefix */
4e7d34a6 1428 { X86_64_TABLE (X86_64_37) },
252b5132 1429 /* 38 */
ce518a5f
L
1430 { "cmpB", { Eb, Gb } },
1431 { "cmpS", { Ev, Gv } },
c7532693
L
1432 { "cmpB", { Gb, EbS } },
1433 { "cmpS", { Gv, EvS } },
ce518a5f
L
1434 { "cmpB", { AL, Ib } },
1435 { "cmpS", { eAX, Iv } },
1436 { "(bad)", { XX } }, /* SEG DS prefix */
4e7d34a6 1437 { X86_64_TABLE (X86_64_3F) },
252b5132 1438 /* 40 */
ce518a5f
L
1439 { "inc{S|}", { RMeAX } },
1440 { "inc{S|}", { RMeCX } },
1441 { "inc{S|}", { RMeDX } },
1442 { "inc{S|}", { RMeBX } },
1443 { "inc{S|}", { RMeSP } },
1444 { "inc{S|}", { RMeBP } },
1445 { "inc{S|}", { RMeSI } },
1446 { "inc{S|}", { RMeDI } },
252b5132 1447 /* 48 */
ce518a5f
L
1448 { "dec{S|}", { RMeAX } },
1449 { "dec{S|}", { RMeCX } },
1450 { "dec{S|}", { RMeDX } },
1451 { "dec{S|}", { RMeBX } },
1452 { "dec{S|}", { RMeSP } },
1453 { "dec{S|}", { RMeBP } },
1454 { "dec{S|}", { RMeSI } },
1455 { "dec{S|}", { RMeDI } },
252b5132 1456 /* 50 */
ce518a5f
L
1457 { "pushV", { RMrAX } },
1458 { "pushV", { RMrCX } },
1459 { "pushV", { RMrDX } },
1460 { "pushV", { RMrBX } },
1461 { "pushV", { RMrSP } },
1462 { "pushV", { RMrBP } },
1463 { "pushV", { RMrSI } },
1464 { "pushV", { RMrDI } },
252b5132 1465 /* 58 */
ce518a5f
L
1466 { "popV", { RMrAX } },
1467 { "popV", { RMrCX } },
1468 { "popV", { RMrDX } },
1469 { "popV", { RMrBX } },
1470 { "popV", { RMrSP } },
1471 { "popV", { RMrBP } },
1472 { "popV", { RMrSI } },
1473 { "popV", { RMrDI } },
252b5132 1474 /* 60 */
4e7d34a6
L
1475 { X86_64_TABLE (X86_64_60) },
1476 { X86_64_TABLE (X86_64_61) },
1477 { X86_64_TABLE (X86_64_62) },
1478 { X86_64_TABLE (X86_64_63) },
ce518a5f
L
1479 { "(bad)", { XX } }, /* seg fs */
1480 { "(bad)", { XX } }, /* seg gs */
1481 { "(bad)", { XX } }, /* op size prefix */
1482 { "(bad)", { XX } }, /* adr size prefix */
252b5132 1483 /* 68 */
ce518a5f
L
1484 { "pushT", { Iq } },
1485 { "imulS", { Gv, Ev, Iv } },
1486 { "pushT", { sIb } },
1487 { "imulS", { Gv, Ev, sIb } },
7c52e0e8 1488 { "ins{b|}", { Ybr, indirDX } },
4e7d34a6 1489 { X86_64_TABLE (X86_64_6D) },
7c52e0e8 1490 { "outs{b|}", { indirDXr, Xb } },
4e7d34a6 1491 { X86_64_TABLE (X86_64_6F) },
252b5132 1492 /* 70 */
ce518a5f
L
1493 { "joH", { Jb, XX, cond_jump_flag } },
1494 { "jnoH", { Jb, XX, cond_jump_flag } },
1495 { "jbH", { Jb, XX, cond_jump_flag } },
1496 { "jaeH", { Jb, XX, cond_jump_flag } },
1497 { "jeH", { Jb, XX, cond_jump_flag } },
1498 { "jneH", { Jb, XX, cond_jump_flag } },
1499 { "jbeH", { Jb, XX, cond_jump_flag } },
1500 { "jaH", { Jb, XX, cond_jump_flag } },
252b5132 1501 /* 78 */
ce518a5f
L
1502 { "jsH", { Jb, XX, cond_jump_flag } },
1503 { "jnsH", { Jb, XX, cond_jump_flag } },
1504 { "jpH", { Jb, XX, cond_jump_flag } },
1505 { "jnpH", { Jb, XX, cond_jump_flag } },
1506 { "jlH", { Jb, XX, cond_jump_flag } },
1507 { "jgeH", { Jb, XX, cond_jump_flag } },
1508 { "jleH", { Jb, XX, cond_jump_flag } },
1509 { "jgH", { Jb, XX, cond_jump_flag } },
252b5132 1510 /* 80 */
1ceb70f8
L
1511 { REG_TABLE (REG_80) },
1512 { REG_TABLE (REG_81) },
ce518a5f 1513 { "(bad)", { XX } },
1ceb70f8 1514 { REG_TABLE (REG_82) },
ce518a5f
L
1515 { "testB", { Eb, Gb } },
1516 { "testS", { Ev, Gv } },
1517 { "xchgB", { Eb, Gb } },
1518 { "xchgS", { Ev, Gv } },
252b5132 1519 /* 88 */
ce518a5f
L
1520 { "movB", { Eb, Gb } },
1521 { "movS", { Ev, Gv } },
b6169b20
L
1522 { "movB", { Gb, EbS } },
1523 { "movS", { Gv, EvS } },
ce518a5f 1524 { "movD", { Sv, Sw } },
1ceb70f8 1525 { MOD_TABLE (MOD_8D) },
ce518a5f 1526 { "movD", { Sw, Sv } },
1ceb70f8 1527 { REG_TABLE (REG_8F) },
252b5132 1528 /* 90 */
1ceb70f8 1529 { PREFIX_TABLE (PREFIX_90) },
ce518a5f
L
1530 { "xchgS", { RMeCX, eAX } },
1531 { "xchgS", { RMeDX, eAX } },
1532 { "xchgS", { RMeBX, eAX } },
1533 { "xchgS", { RMeSP, eAX } },
1534 { "xchgS", { RMeBP, eAX } },
1535 { "xchgS", { RMeSI, eAX } },
1536 { "xchgS", { RMeDI, eAX } },
252b5132 1537 /* 98 */
7c52e0e8
L
1538 { "cW{t|}R", { XX } },
1539 { "cR{t|}O", { XX } },
4e7d34a6 1540 { X86_64_TABLE (X86_64_9A) },
ce518a5f
L
1541 { "(bad)", { XX } }, /* fwait */
1542 { "pushfT", { XX } },
1543 { "popfT", { XX } },
7c52e0e8
L
1544 { "sahf", { XX } },
1545 { "lahf", { XX } },
252b5132 1546 /* a0 */
4b06377f
L
1547 { "mov%LB", { AL, Ob } },
1548 { "mov%LS", { eAX, Ov } },
1549 { "mov%LB", { Ob, AL } },
1550 { "mov%LS", { Ov, eAX } },
7c52e0e8
L
1551 { "movs{b|}", { Ybr, Xb } },
1552 { "movs{R|}", { Yvr, Xv } },
1553 { "cmps{b|}", { Xb, Yb } },
1554 { "cmps{R|}", { Xv, Yv } },
252b5132 1555 /* a8 */
ce518a5f
L
1556 { "testB", { AL, Ib } },
1557 { "testS", { eAX, Iv } },
1558 { "stosB", { Ybr, AL } },
1559 { "stosS", { Yvr, eAX } },
1560 { "lodsB", { ALr, Xb } },
1561 { "lodsS", { eAXr, Xv } },
1562 { "scasB", { AL, Yb } },
1563 { "scasS", { eAX, Yv } },
252b5132 1564 /* b0 */
ce518a5f
L
1565 { "movB", { RMAL, Ib } },
1566 { "movB", { RMCL, Ib } },
1567 { "movB", { RMDL, Ib } },
1568 { "movB", { RMBL, Ib } },
1569 { "movB", { RMAH, Ib } },
1570 { "movB", { RMCH, Ib } },
1571 { "movB", { RMDH, Ib } },
1572 { "movB", { RMBH, Ib } },
252b5132 1573 /* b8 */
4b06377f
L
1574 { "mov%LV", { RMeAX, Iv64 } },
1575 { "mov%LV", { RMeCX, Iv64 } },
1576 { "mov%LV", { RMeDX, Iv64 } },
1577 { "mov%LV", { RMeBX, Iv64 } },
1578 { "mov%LV", { RMeSP, Iv64 } },
1579 { "mov%LV", { RMeBP, Iv64 } },
1580 { "mov%LV", { RMeSI, Iv64 } },
1581 { "mov%LV", { RMeDI, Iv64 } },
252b5132 1582 /* c0 */
1ceb70f8
L
1583 { REG_TABLE (REG_C0) },
1584 { REG_TABLE (REG_C1) },
ce518a5f
L
1585 { "retT", { Iw } },
1586 { "retT", { XX } },
4e7d34a6
L
1587 { X86_64_TABLE (X86_64_C4) },
1588 { X86_64_TABLE (X86_64_C5) },
1ceb70f8
L
1589 { REG_TABLE (REG_C6) },
1590 { REG_TABLE (REG_C7) },
252b5132 1591 /* c8 */
ce518a5f
L
1592 { "enterT", { Iw, Ib } },
1593 { "leaveT", { XX } },
ddab3d59
JB
1594 { "Jret{|f}P", { Iw } },
1595 { "Jret{|f}P", { XX } },
ce518a5f
L
1596 { "int3", { XX } },
1597 { "int", { Ib } },
4e7d34a6 1598 { X86_64_TABLE (X86_64_CE) },
ce518a5f 1599 { "iretP", { XX } },
252b5132 1600 /* d0 */
1ceb70f8
L
1601 { REG_TABLE (REG_D0) },
1602 { REG_TABLE (REG_D1) },
1603 { REG_TABLE (REG_D2) },
1604 { REG_TABLE (REG_D3) },
4e7d34a6
L
1605 { X86_64_TABLE (X86_64_D4) },
1606 { X86_64_TABLE (X86_64_D5) },
ce518a5f
L
1607 { "(bad)", { XX } },
1608 { "xlat", { DSBX } },
252b5132
RH
1609 /* d8 */
1610 { FLOAT },
1611 { FLOAT },
1612 { FLOAT },
1613 { FLOAT },
1614 { FLOAT },
1615 { FLOAT },
1616 { FLOAT },
1617 { FLOAT },
1618 /* e0 */
ce518a5f
L
1619 { "loopneFH", { Jb, XX, loop_jcxz_flag } },
1620 { "loopeFH", { Jb, XX, loop_jcxz_flag } },
1621 { "loopFH", { Jb, XX, loop_jcxz_flag } },
1622 { "jEcxzH", { Jb, XX, loop_jcxz_flag } },
1623 { "inB", { AL, Ib } },
1624 { "inG", { zAX, Ib } },
1625 { "outB", { Ib, AL } },
1626 { "outG", { Ib, zAX } },
252b5132 1627 /* e8 */
ce518a5f
L
1628 { "callT", { Jv } },
1629 { "jmpT", { Jv } },
4e7d34a6 1630 { X86_64_TABLE (X86_64_EA) },
ce518a5f
L
1631 { "jmp", { Jb } },
1632 { "inB", { AL, indirDX } },
1633 { "inG", { zAX, indirDX } },
1634 { "outB", { indirDX, AL } },
1635 { "outG", { indirDX, zAX } },
252b5132 1636 /* f0 */
ce518a5f
L
1637 { "(bad)", { XX } }, /* lock prefix */
1638 { "icebp", { XX } },
1639 { "(bad)", { XX } }, /* repne */
1640 { "(bad)", { XX } }, /* repz */
1641 { "hlt", { XX } },
1642 { "cmc", { XX } },
1ceb70f8
L
1643 { REG_TABLE (REG_F6) },
1644 { REG_TABLE (REG_F7) },
252b5132 1645 /* f8 */
ce518a5f
L
1646 { "clc", { XX } },
1647 { "stc", { XX } },
1648 { "cli", { XX } },
1649 { "sti", { XX } },
1650 { "cld", { XX } },
1651 { "std", { XX } },
1ceb70f8
L
1652 { REG_TABLE (REG_FE) },
1653 { REG_TABLE (REG_FF) },
252b5132
RH
1654};
1655
6439fc28 1656static const struct dis386 dis386_twobyte[] = {
252b5132 1657 /* 00 */
1ceb70f8
L
1658 { REG_TABLE (REG_0F00 ) },
1659 { REG_TABLE (REG_0F01 ) },
ce518a5f
L
1660 { "larS", { Gv, Ew } },
1661 { "lslS", { Gv, Ew } },
1662 { "(bad)", { XX } },
1663 { "syscall", { XX } },
1664 { "clts", { XX } },
1665 { "sysretP", { XX } },
252b5132 1666 /* 08 */
ce518a5f
L
1667 { "invd", { XX } },
1668 { "wbinvd", { XX } },
1669 { "(bad)", { XX } },
1670 { "ud2a", { XX } },
1671 { "(bad)", { XX } },
b5b1fc4f 1672 { REG_TABLE (REG_0F0D) },
ce518a5f
L
1673 { "femms", { XX } },
1674 { "", { MX, EM, OPSUF } }, /* See OP_3DNowSuffix. */
252b5132 1675 /* 10 */
1ceb70f8
L
1676 { PREFIX_TABLE (PREFIX_0F10) },
1677 { PREFIX_TABLE (PREFIX_0F11) },
1678 { PREFIX_TABLE (PREFIX_0F12) },
1679 { MOD_TABLE (MOD_0F13) },
f2a421c4
L
1680 { "unpcklpX", { XM, EXx } },
1681 { "unpckhpX", { XM, EXx } },
1ceb70f8
L
1682 { PREFIX_TABLE (PREFIX_0F16) },
1683 { MOD_TABLE (MOD_0F17) },
252b5132 1684 /* 18 */
1ceb70f8 1685 { REG_TABLE (REG_0F18) },
b5b1fc4f
L
1686 { "nopQ", { Ev } },
1687 { "nopQ", { Ev } },
1688 { "nopQ", { Ev } },
1689 { "nopQ", { Ev } },
1690 { "nopQ", { Ev } },
1691 { "nopQ", { Ev } },
ce518a5f 1692 { "nopQ", { Ev } },
252b5132 1693 /* 20 */
1ceb70f8
L
1694 { MOD_TABLE (MOD_0F20) },
1695 { MOD_TABLE (MOD_0F21) },
1696 { MOD_TABLE (MOD_0F22) },
1697 { MOD_TABLE (MOD_0F23) },
1698 { MOD_TABLE (MOD_0F24) },
c1e679ec 1699 { "(bad)", { XX } },
1ceb70f8 1700 { MOD_TABLE (MOD_0F26) },
ce518a5f 1701 { "(bad)", { XX } },
252b5132 1702 /* 28 */
09a2c6cf 1703 { "movapX", { XM, EXx } },
b6169b20 1704 { "movapX", { EXxS, XM } },
1ceb70f8
L
1705 { PREFIX_TABLE (PREFIX_0F2A) },
1706 { PREFIX_TABLE (PREFIX_0F2B) },
1707 { PREFIX_TABLE (PREFIX_0F2C) },
1708 { PREFIX_TABLE (PREFIX_0F2D) },
1709 { PREFIX_TABLE (PREFIX_0F2E) },
1710 { PREFIX_TABLE (PREFIX_0F2F) },
252b5132 1711 /* 30 */
ce518a5f
L
1712 { "wrmsr", { XX } },
1713 { "rdtsc", { XX } },
1714 { "rdmsr", { XX } },
1715 { "rdpmc", { XX } },
1716 { "sysenter", { XX } },
1717 { "sysexit", { XX } },
1718 { "(bad)", { XX } },
47dd174c 1719 { "getsec", { XX } },
252b5132 1720 /* 38 */
4e7d34a6 1721 { THREE_BYTE_TABLE (THREE_BYTE_0F38) },
ce518a5f 1722 { "(bad)", { XX } },
4e7d34a6 1723 { THREE_BYTE_TABLE (THREE_BYTE_0F3A) },
ce518a5f
L
1724 { "(bad)", { XX } },
1725 { "(bad)", { XX } },
1726 { "(bad)", { XX } },
1727 { "(bad)", { XX } },
1728 { "(bad)", { XX } },
252b5132 1729 /* 40 */
b19d5385
JB
1730 { "cmovoS", { Gv, Ev } },
1731 { "cmovnoS", { Gv, Ev } },
1732 { "cmovbS", { Gv, Ev } },
1733 { "cmovaeS", { Gv, Ev } },
1734 { "cmoveS", { Gv, Ev } },
1735 { "cmovneS", { Gv, Ev } },
1736 { "cmovbeS", { Gv, Ev } },
1737 { "cmovaS", { Gv, Ev } },
252b5132 1738 /* 48 */
b19d5385
JB
1739 { "cmovsS", { Gv, Ev } },
1740 { "cmovnsS", { Gv, Ev } },
1741 { "cmovpS", { Gv, Ev } },
1742 { "cmovnpS", { Gv, Ev } },
1743 { "cmovlS", { Gv, Ev } },
1744 { "cmovgeS", { Gv, Ev } },
1745 { "cmovleS", { Gv, Ev } },
1746 { "cmovgS", { Gv, Ev } },
252b5132 1747 /* 50 */
75c135a8 1748 { MOD_TABLE (MOD_0F51) },
1ceb70f8
L
1749 { PREFIX_TABLE (PREFIX_0F51) },
1750 { PREFIX_TABLE (PREFIX_0F52) },
1751 { PREFIX_TABLE (PREFIX_0F53) },
09a2c6cf
L
1752 { "andpX", { XM, EXx } },
1753 { "andnpX", { XM, EXx } },
1754 { "orpX", { XM, EXx } },
1755 { "xorpX", { XM, EXx } },
252b5132 1756 /* 58 */
1ceb70f8
L
1757 { PREFIX_TABLE (PREFIX_0F58) },
1758 { PREFIX_TABLE (PREFIX_0F59) },
1759 { PREFIX_TABLE (PREFIX_0F5A) },
1760 { PREFIX_TABLE (PREFIX_0F5B) },
1761 { PREFIX_TABLE (PREFIX_0F5C) },
1762 { PREFIX_TABLE (PREFIX_0F5D) },
1763 { PREFIX_TABLE (PREFIX_0F5E) },
1764 { PREFIX_TABLE (PREFIX_0F5F) },
252b5132 1765 /* 60 */
1ceb70f8
L
1766 { PREFIX_TABLE (PREFIX_0F60) },
1767 { PREFIX_TABLE (PREFIX_0F61) },
1768 { PREFIX_TABLE (PREFIX_0F62) },
ce518a5f
L
1769 { "packsswb", { MX, EM } },
1770 { "pcmpgtb", { MX, EM } },
1771 { "pcmpgtw", { MX, EM } },
1772 { "pcmpgtd", { MX, EM } },
1773 { "packuswb", { MX, EM } },
252b5132 1774 /* 68 */
ce518a5f
L
1775 { "punpckhbw", { MX, EM } },
1776 { "punpckhwd", { MX, EM } },
1777 { "punpckhdq", { MX, EM } },
1778 { "packssdw", { MX, EM } },
1ceb70f8
L
1779 { PREFIX_TABLE (PREFIX_0F6C) },
1780 { PREFIX_TABLE (PREFIX_0F6D) },
231af070 1781 { "movK", { MX, Edq } },
1ceb70f8 1782 { PREFIX_TABLE (PREFIX_0F6F) },
252b5132 1783 /* 70 */
1ceb70f8
L
1784 { PREFIX_TABLE (PREFIX_0F70) },
1785 { REG_TABLE (REG_0F71) },
1786 { REG_TABLE (REG_0F72) },
1787 { REG_TABLE (REG_0F73) },
ce518a5f
L
1788 { "pcmpeqb", { MX, EM } },
1789 { "pcmpeqw", { MX, EM } },
1790 { "pcmpeqd", { MX, EM } },
1791 { "emms", { XX } },
252b5132 1792 /* 78 */
1ceb70f8
L
1793 { PREFIX_TABLE (PREFIX_0F78) },
1794 { PREFIX_TABLE (PREFIX_0F79) },
4e7d34a6 1795 { THREE_BYTE_TABLE (THREE_BYTE_0F7A) },
c1e679ec 1796 { "(bad)", { XX } },
1ceb70f8
L
1797 { PREFIX_TABLE (PREFIX_0F7C) },
1798 { PREFIX_TABLE (PREFIX_0F7D) },
1799 { PREFIX_TABLE (PREFIX_0F7E) },
1800 { PREFIX_TABLE (PREFIX_0F7F) },
252b5132 1801 /* 80 */
ce518a5f
L
1802 { "joH", { Jv, XX, cond_jump_flag } },
1803 { "jnoH", { Jv, XX, cond_jump_flag } },
1804 { "jbH", { Jv, XX, cond_jump_flag } },
1805 { "jaeH", { Jv, XX, cond_jump_flag } },
1806 { "jeH", { Jv, XX, cond_jump_flag } },
1807 { "jneH", { Jv, XX, cond_jump_flag } },
1808 { "jbeH", { Jv, XX, cond_jump_flag } },
1809 { "jaH", { Jv, XX, cond_jump_flag } },
252b5132 1810 /* 88 */
ce518a5f
L
1811 { "jsH", { Jv, XX, cond_jump_flag } },
1812 { "jnsH", { Jv, XX, cond_jump_flag } },
1813 { "jpH", { Jv, XX, cond_jump_flag } },
1814 { "jnpH", { Jv, XX, cond_jump_flag } },
1815 { "jlH", { Jv, XX, cond_jump_flag } },
1816 { "jgeH", { Jv, XX, cond_jump_flag } },
1817 { "jleH", { Jv, XX, cond_jump_flag } },
1818 { "jgH", { Jv, XX, cond_jump_flag } },
252b5132 1819 /* 90 */
ce518a5f
L
1820 { "seto", { Eb } },
1821 { "setno", { Eb } },
1822 { "setb", { Eb } },
1823 { "setae", { Eb } },
1824 { "sete", { Eb } },
1825 { "setne", { Eb } },
1826 { "setbe", { Eb } },
1827 { "seta", { Eb } },
252b5132 1828 /* 98 */
ce518a5f
L
1829 { "sets", { Eb } },
1830 { "setns", { Eb } },
1831 { "setp", { Eb } },
1832 { "setnp", { Eb } },
1833 { "setl", { Eb } },
1834 { "setge", { Eb } },
1835 { "setle", { Eb } },
1836 { "setg", { Eb } },
252b5132 1837 /* a0 */
ce518a5f
L
1838 { "pushT", { fs } },
1839 { "popT", { fs } },
1840 { "cpuid", { XX } },
1841 { "btS", { Ev, Gv } },
1842 { "shldS", { Ev, Gv, Ib } },
1843 { "shldS", { Ev, Gv, CL } },
1ceb70f8
L
1844 { REG_TABLE (REG_0FA6) },
1845 { REG_TABLE (REG_0FA7) },
252b5132 1846 /* a8 */
ce518a5f
L
1847 { "pushT", { gs } },
1848 { "popT", { gs } },
1849 { "rsm", { XX } },
1850 { "btsS", { Ev, Gv } },
1851 { "shrdS", { Ev, Gv, Ib } },
1852 { "shrdS", { Ev, Gv, CL } },
1ceb70f8 1853 { REG_TABLE (REG_0FAE) },
ce518a5f 1854 { "imulS", { Gv, Ev } },
252b5132 1855 /* b0 */
ce518a5f
L
1856 { "cmpxchgB", { Eb, Gb } },
1857 { "cmpxchgS", { Ev, Gv } },
1ceb70f8 1858 { MOD_TABLE (MOD_0FB2) },
ce518a5f 1859 { "btrS", { Ev, Gv } },
1ceb70f8
L
1860 { MOD_TABLE (MOD_0FB4) },
1861 { MOD_TABLE (MOD_0FB5) },
7c52e0e8
L
1862 { "movz{bR|x}", { Gv, Eb } },
1863 { "movz{wR|x}", { Gv, Ew } }, /* yes, there really is movzww ! */
252b5132 1864 /* b8 */
1ceb70f8 1865 { PREFIX_TABLE (PREFIX_0FB8) },
ce518a5f 1866 { "ud2b", { XX } },
1ceb70f8 1867 { REG_TABLE (REG_0FBA) },
ce518a5f
L
1868 { "btcS", { Ev, Gv } },
1869 { "bsfS", { Gv, Ev } },
1ceb70f8 1870 { PREFIX_TABLE (PREFIX_0FBD) },
7c52e0e8
L
1871 { "movs{bR|x}", { Gv, Eb } },
1872 { "movs{wR|x}", { Gv, Ew } }, /* yes, there really is movsww ! */
252b5132 1873 /* c0 */
ce518a5f
L
1874 { "xaddB", { Eb, Gb } },
1875 { "xaddS", { Ev, Gv } },
1ceb70f8 1876 { PREFIX_TABLE (PREFIX_0FC2) },
4ee52178 1877 { PREFIX_TABLE (PREFIX_0FC3) },
ce518a5f
L
1878 { "pinsrw", { MX, Edqw, Ib } },
1879 { "pextrw", { Gdq, MS, Ib } },
09a2c6cf 1880 { "shufpX", { XM, EXx, Ib } },
1ceb70f8 1881 { REG_TABLE (REG_0FC7) },
252b5132 1882 /* c8 */
ce518a5f
L
1883 { "bswap", { RMeAX } },
1884 { "bswap", { RMeCX } },
1885 { "bswap", { RMeDX } },
1886 { "bswap", { RMeBX } },
1887 { "bswap", { RMeSP } },
1888 { "bswap", { RMeBP } },
1889 { "bswap", { RMeSI } },
1890 { "bswap", { RMeDI } },
252b5132 1891 /* d0 */
1ceb70f8 1892 { PREFIX_TABLE (PREFIX_0FD0) },
ce518a5f
L
1893 { "psrlw", { MX, EM } },
1894 { "psrld", { MX, EM } },
1895 { "psrlq", { MX, EM } },
1896 { "paddq", { MX, EM } },
1897 { "pmullw", { MX, EM } },
1ceb70f8 1898 { PREFIX_TABLE (PREFIX_0FD6) },
75c135a8 1899 { MOD_TABLE (MOD_0FD7) },
252b5132 1900 /* d8 */
ce518a5f
L
1901 { "psubusb", { MX, EM } },
1902 { "psubusw", { MX, EM } },
1903 { "pminub", { MX, EM } },
1904 { "pand", { MX, EM } },
1905 { "paddusb", { MX, EM } },
1906 { "paddusw", { MX, EM } },
1907 { "pmaxub", { MX, EM } },
1908 { "pandn", { MX, EM } },
252b5132 1909 /* e0 */
ce518a5f
L
1910 { "pavgb", { MX, EM } },
1911 { "psraw", { MX, EM } },
1912 { "psrad", { MX, EM } },
1913 { "pavgw", { MX, EM } },
1914 { "pmulhuw", { MX, EM } },
1915 { "pmulhw", { MX, EM } },
1ceb70f8
L
1916 { PREFIX_TABLE (PREFIX_0FE6) },
1917 { PREFIX_TABLE (PREFIX_0FE7) },
252b5132 1918 /* e8 */
ce518a5f
L
1919 { "psubsb", { MX, EM } },
1920 { "psubsw", { MX, EM } },
1921 { "pminsw", { MX, EM } },
1922 { "por", { MX, EM } },
1923 { "paddsb", { MX, EM } },
1924 { "paddsw", { MX, EM } },
1925 { "pmaxsw", { MX, EM } },
1926 { "pxor", { MX, EM } },
252b5132 1927 /* f0 */
1ceb70f8 1928 { PREFIX_TABLE (PREFIX_0FF0) },
ce518a5f
L
1929 { "psllw", { MX, EM } },
1930 { "pslld", { MX, EM } },
1931 { "psllq", { MX, EM } },
1932 { "pmuludq", { MX, EM } },
1933 { "pmaddwd", { MX, EM } },
1934 { "psadbw", { MX, EM } },
1ceb70f8 1935 { PREFIX_TABLE (PREFIX_0FF7) },
252b5132 1936 /* f8 */
ce518a5f
L
1937 { "psubb", { MX, EM } },
1938 { "psubw", { MX, EM } },
1939 { "psubd", { MX, EM } },
1940 { "psubq", { MX, EM } },
1941 { "paddb", { MX, EM } },
1942 { "paddw", { MX, EM } },
1943 { "paddd", { MX, EM } },
1944 { "(bad)", { XX } },
252b5132
RH
1945};
1946
1947static const unsigned char onebyte_has_modrm[256] = {
c608c12e
AM
1948 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
1949 /* ------------------------------- */
1950 /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
1951 /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
1952 /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
1953 /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
1954 /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
1955 /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
1956 /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
1957 /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
1958 /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
1959 /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
1960 /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
1961 /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
1962 /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
1963 /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
1964 /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
1965 /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1 /* f0 */
1966 /* ------------------------------- */
1967 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
252b5132
RH
1968};
1969
1970static const unsigned char twobyte_has_modrm[256] = {
c608c12e
AM
1971 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
1972 /* ------------------------------- */
252b5132 1973 /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
b5b1fc4f 1974 /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
85f10a01 1975 /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
331d2d0d 1976 /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
252b5132 1977 /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
4bba6815
AM
1978 /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
1979 /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
85f10a01 1980 /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
252b5132
RH
1981 /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
1982 /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
30d1c836 1983 /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
050dfa73 1984 /* b0 */ 1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1, /* bf */
252b5132 1985 /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
ca164297 1986 /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
4bba6815 1987 /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
ca164297 1988 /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0 /* ff */
c608c12e
AM
1989 /* ------------------------------- */
1990 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
1991};
1992
252b5132
RH
1993static char obuf[100];
1994static char *obufp;
ea397f5b 1995static char *mnemonicendp;
252b5132
RH
1996static char scratchbuf[100];
1997static unsigned char *start_codep;
1998static unsigned char *insn_codep;
1999static unsigned char *codep;
f16cd0d5
L
2000static int last_lock_prefix;
2001static int last_repz_prefix;
2002static int last_repnz_prefix;
2003static int last_data_prefix;
2004static int last_addr_prefix;
2005static int last_rex_prefix;
2006static int last_seg_prefix;
2007#define MAX_CODE_LENGTH 15
2008/* We can up to 14 prefixes since the maximum instruction length is
2009 15bytes. */
2010static int all_prefixes[MAX_CODE_LENGTH - 1];
252b5132 2011static disassemble_info *the_info;
7967e09e
L
2012static struct
2013 {
2014 int mod;
7967e09e 2015 int reg;
484c222e 2016 int rm;
7967e09e
L
2017 }
2018modrm;
4bba6815 2019static unsigned char need_modrm;
c0f3af97
L
2020static struct
2021 {
2022 int register_specifier;
2023 int length;
2024 int prefix;
2025 int w;
2026 }
2027vex;
2028static unsigned char need_vex;
2029static unsigned char need_vex_reg;
dae39acc 2030static unsigned char vex_w_done;
252b5132 2031
ea397f5b
L
2032struct op
2033 {
2034 const char *name;
2035 unsigned int len;
2036 };
2037
4bba6815
AM
2038/* If we are accessing mod/rm/reg without need_modrm set, then the
2039 values are stale. Hitting this abort likely indicates that you
2040 need to update onebyte_has_modrm or twobyte_has_modrm. */
2041#define MODRM_CHECK if (!need_modrm) abort ()
2042
d708bcba
AM
2043static const char **names64;
2044static const char **names32;
2045static const char **names16;
2046static const char **names8;
2047static const char **names8rex;
2048static const char **names_seg;
db51cc60
L
2049static const char *index64;
2050static const char *index32;
d708bcba
AM
2051static const char **index16;
2052
2053static const char *intel_names64[] = {
2054 "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
2055 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2056};
2057static const char *intel_names32[] = {
2058 "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
2059 "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
2060};
2061static const char *intel_names16[] = {
2062 "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
2063 "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
2064};
2065static const char *intel_names8[] = {
2066 "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
2067};
2068static const char *intel_names8rex[] = {
2069 "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
2070 "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
2071};
2072static const char *intel_names_seg[] = {
2073 "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
2074};
db51cc60
L
2075static const char *intel_index64 = "riz";
2076static const char *intel_index32 = "eiz";
d708bcba
AM
2077static const char *intel_index16[] = {
2078 "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
2079};
2080
2081static const char *att_names64[] = {
2082 "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
52b15da3
JH
2083 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
2084};
d708bcba
AM
2085static const char *att_names32[] = {
2086 "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
52b15da3 2087 "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
252b5132 2088};
d708bcba
AM
2089static const char *att_names16[] = {
2090 "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
52b15da3 2091 "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
252b5132 2092};
d708bcba
AM
2093static const char *att_names8[] = {
2094 "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
252b5132 2095};
d708bcba
AM
2096static const char *att_names8rex[] = {
2097 "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
52b15da3
JH
2098 "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
2099};
d708bcba
AM
2100static const char *att_names_seg[] = {
2101 "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
252b5132 2102};
db51cc60
L
2103static const char *att_index64 = "%riz";
2104static const char *att_index32 = "%eiz";
d708bcba
AM
2105static const char *att_index16[] = {
2106 "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
252b5132
RH
2107};
2108
1ceb70f8
L
2109static const struct dis386 reg_table[][8] = {
2110 /* REG_80 */
252b5132 2111 {
ce518a5f
L
2112 { "addA", { Eb, Ib } },
2113 { "orA", { Eb, Ib } },
2114 { "adcA", { Eb, Ib } },
2115 { "sbbA", { Eb, Ib } },
2116 { "andA", { Eb, Ib } },
2117 { "subA", { Eb, Ib } },
2118 { "xorA", { Eb, Ib } },
2119 { "cmpA", { Eb, Ib } },
252b5132 2120 },
1ceb70f8 2121 /* REG_81 */
252b5132 2122 {
ce518a5f
L
2123 { "addQ", { Ev, Iv } },
2124 { "orQ", { Ev, Iv } },
2125 { "adcQ", { Ev, Iv } },
2126 { "sbbQ", { Ev, Iv } },
2127 { "andQ", { Ev, Iv } },
2128 { "subQ", { Ev, Iv } },
2129 { "xorQ", { Ev, Iv } },
2130 { "cmpQ", { Ev, Iv } },
252b5132 2131 },
1ceb70f8 2132 /* REG_82 */
252b5132 2133 {
ce518a5f
L
2134 { "addQ", { Ev, sIb } },
2135 { "orQ", { Ev, sIb } },
2136 { "adcQ", { Ev, sIb } },
2137 { "sbbQ", { Ev, sIb } },
2138 { "andQ", { Ev, sIb } },
2139 { "subQ", { Ev, sIb } },
2140 { "xorQ", { Ev, sIb } },
2141 { "cmpQ", { Ev, sIb } },
252b5132 2142 },
1ceb70f8 2143 /* REG_8F */
4e7d34a6
L
2144 {
2145 { "popU", { stackEv } },
c48244a5 2146 { XOP_8F_TABLE (XOP_09) },
4e7d34a6
L
2147 { "(bad)", { XX } },
2148 { "(bad)", { XX } },
2149 { "(bad)", { XX } },
f88c9eb0 2150 { XOP_8F_TABLE (XOP_09) },
4e7d34a6
L
2151 { "(bad)", { XX } },
2152 { "(bad)", { XX } },
2153 },
1ceb70f8 2154 /* REG_C0 */
252b5132 2155 {
ce518a5f
L
2156 { "rolA", { Eb, Ib } },
2157 { "rorA", { Eb, Ib } },
2158 { "rclA", { Eb, Ib } },
2159 { "rcrA", { Eb, Ib } },
2160 { "shlA", { Eb, Ib } },
2161 { "shrA", { Eb, Ib } },
2162 { "(bad)", { XX } },
2163 { "sarA", { Eb, Ib } },
252b5132 2164 },
1ceb70f8 2165 /* REG_C1 */
252b5132 2166 {
ce518a5f
L
2167 { "rolQ", { Ev, Ib } },
2168 { "rorQ", { Ev, Ib } },
2169 { "rclQ", { Ev, Ib } },
2170 { "rcrQ", { Ev, Ib } },
2171 { "shlQ", { Ev, Ib } },
2172 { "shrQ", { Ev, Ib } },
2173 { "(bad)", { XX } },
2174 { "sarQ", { Ev, Ib } },
252b5132 2175 },
1ceb70f8 2176 /* REG_C6 */
4e7d34a6
L
2177 {
2178 { "movA", { Eb, Ib } },
2179 { "(bad)", { XX } },
2180 { "(bad)", { XX } },
2181 { "(bad)", { XX } },
2182 { "(bad)", { XX } },
2183 { "(bad)", { XX } },
2184 { "(bad)", { XX } },
2185 { "(bad)", { XX } },
2186 },
1ceb70f8 2187 /* REG_C7 */
4e7d34a6
L
2188 {
2189 { "movQ", { Ev, Iv } },
2190 { "(bad)", { XX } },
2191 { "(bad)", { XX } },
2192 { "(bad)", { XX } },
2193 { "(bad)", { XX } },
2194 { "(bad)", { XX } },
2195 { "(bad)", { XX } },
2196 { "(bad)", { XX } },
2197 },
1ceb70f8 2198 /* REG_D0 */
252b5132 2199 {
ce518a5f
L
2200 { "rolA", { Eb, I1 } },
2201 { "rorA", { Eb, I1 } },
2202 { "rclA", { Eb, I1 } },
2203 { "rcrA", { Eb, I1 } },
2204 { "shlA", { Eb, I1 } },
2205 { "shrA", { Eb, I1 } },
2206 { "(bad)", { XX } },
2207 { "sarA", { Eb, I1 } },
252b5132 2208 },
1ceb70f8 2209 /* REG_D1 */
252b5132 2210 {
ce518a5f
L
2211 { "rolQ", { Ev, I1 } },
2212 { "rorQ", { Ev, I1 } },
2213 { "rclQ", { Ev, I1 } },
2214 { "rcrQ", { Ev, I1 } },
2215 { "shlQ", { Ev, I1 } },
2216 { "shrQ", { Ev, I1 } },
2217 { "(bad)", { XX } },
2218 { "sarQ", { Ev, I1 } },
252b5132 2219 },
1ceb70f8 2220 /* REG_D2 */
252b5132 2221 {
ce518a5f
L
2222 { "rolA", { Eb, CL } },
2223 { "rorA", { Eb, CL } },
2224 { "rclA", { Eb, CL } },
2225 { "rcrA", { Eb, CL } },
2226 { "shlA", { Eb, CL } },
2227 { "shrA", { Eb, CL } },
2228 { "(bad)", { XX } },
2229 { "sarA", { Eb, CL } },
252b5132 2230 },
1ceb70f8 2231 /* REG_D3 */
252b5132 2232 {
ce518a5f
L
2233 { "rolQ", { Ev, CL } },
2234 { "rorQ", { Ev, CL } },
2235 { "rclQ", { Ev, CL } },
2236 { "rcrQ", { Ev, CL } },
2237 { "shlQ", { Ev, CL } },
2238 { "shrQ", { Ev, CL } },
2239 { "(bad)", { XX } },
2240 { "sarQ", { Ev, CL } },
252b5132 2241 },
1ceb70f8 2242 /* REG_F6 */
252b5132 2243 {
ce518a5f 2244 { "testA", { Eb, Ib } },
058f233b 2245 { "(bad)", { XX } },
ce518a5f
L
2246 { "notA", { Eb } },
2247 { "negA", { Eb } },
2248 { "mulA", { Eb } }, /* Don't print the implicit %al register, */
2249 { "imulA", { Eb } }, /* to distinguish these opcodes from other */
2250 { "divA", { Eb } }, /* mul/imul opcodes. Do the same for div */
2251 { "idivA", { Eb } }, /* and idiv for consistency. */
252b5132 2252 },
1ceb70f8 2253 /* REG_F7 */
252b5132 2254 {
ce518a5f
L
2255 { "testQ", { Ev, Iv } },
2256 { "(bad)", { XX } },
2257 { "notQ", { Ev } },
2258 { "negQ", { Ev } },
2259 { "mulQ", { Ev } }, /* Don't print the implicit register. */
2260 { "imulQ", { Ev } },
2261 { "divQ", { Ev } },
2262 { "idivQ", { Ev } },
252b5132 2263 },
1ceb70f8 2264 /* REG_FE */
252b5132 2265 {
ce518a5f
L
2266 { "incA", { Eb } },
2267 { "decA", { Eb } },
2268 { "(bad)", { XX } },
2269 { "(bad)", { XX } },
2270 { "(bad)", { XX } },
2271 { "(bad)", { XX } },
2272 { "(bad)", { XX } },
2273 { "(bad)", { XX } },
252b5132 2274 },
1ceb70f8 2275 /* REG_FF */
252b5132 2276 {
ce518a5f
L
2277 { "incQ", { Ev } },
2278 { "decQ", { Ev } },
2279 { "callT", { indirEv } },
2280 { "JcallT", { indirEp } },
2281 { "jmpT", { indirEv } },
2282 { "JjmpT", { indirEp } },
2283 { "pushU", { stackEv } },
2284 { "(bad)", { XX } },
252b5132 2285 },
1ceb70f8 2286 /* REG_0F00 */
252b5132 2287 {
ce518a5f
L
2288 { "sldtD", { Sv } },
2289 { "strD", { Sv } },
2290 { "lldt", { Ew } },
2291 { "ltr", { Ew } },
2292 { "verr", { Ew } },
2293 { "verw", { Ew } },
2294 { "(bad)", { XX } },
2295 { "(bad)", { XX } },
252b5132 2296 },
1ceb70f8 2297 /* REG_0F01 */
252b5132 2298 {
1ceb70f8
L
2299 { MOD_TABLE (MOD_0F01_REG_0) },
2300 { MOD_TABLE (MOD_0F01_REG_1) },
2301 { MOD_TABLE (MOD_0F01_REG_2) },
2302 { MOD_TABLE (MOD_0F01_REG_3) },
ce518a5f
L
2303 { "smswD", { Sv } },
2304 { "(bad)", { XX } },
2305 { "lmsw", { Ew } },
1ceb70f8 2306 { MOD_TABLE (MOD_0F01_REG_7) },
252b5132 2307 },
b5b1fc4f 2308 /* REG_0F0D */
252b5132 2309 {
4e7d34a6
L
2310 { "prefetch", { Eb } },
2311 { "prefetchw", { Eb } },
2312 { "(bad)", { XX } },
2313 { "(bad)", { XX } },
2314 { "(bad)", { XX } },
2315 { "(bad)", { XX } },
2316 { "(bad)", { XX } },
2317 { "(bad)", { XX } },
252b5132 2318 },
1ceb70f8 2319 /* REG_0F18 */
252b5132 2320 {
1ceb70f8
L
2321 { MOD_TABLE (MOD_0F18_REG_0) },
2322 { MOD_TABLE (MOD_0F18_REG_1) },
2323 { MOD_TABLE (MOD_0F18_REG_2) },
2324 { MOD_TABLE (MOD_0F18_REG_3) },
ce518a5f
L
2325 { "(bad)", { XX } },
2326 { "(bad)", { XX } },
2327 { "(bad)", { XX } },
2328 { "(bad)", { XX } },
252b5132 2329 },
1ceb70f8 2330 /* REG_0F71 */
a6bd098c 2331 {
ce518a5f
L
2332 { "(bad)", { XX } },
2333 { "(bad)", { XX } },
1ceb70f8 2334 { MOD_TABLE (MOD_0F71_REG_2) },
ce518a5f 2335 { "(bad)", { XX } },
1ceb70f8 2336 { MOD_TABLE (MOD_0F71_REG_4) },
ce518a5f 2337 { "(bad)", { XX } },
1ceb70f8 2338 { MOD_TABLE (MOD_0F71_REG_6) },
ce518a5f 2339 { "(bad)", { XX } },
a6bd098c 2340 },
1ceb70f8 2341 /* REG_0F72 */
a6bd098c 2342 {
ce518a5f
L
2343 { "(bad)", { XX } },
2344 { "(bad)", { XX } },
1ceb70f8 2345 { MOD_TABLE (MOD_0F72_REG_2) },
ce518a5f 2346 { "(bad)", { XX } },
1ceb70f8 2347 { MOD_TABLE (MOD_0F72_REG_4) },
ce518a5f 2348 { "(bad)", { XX } },
1ceb70f8 2349 { MOD_TABLE (MOD_0F72_REG_6) },
ce518a5f 2350 { "(bad)", { XX } },
a6bd098c 2351 },
1ceb70f8 2352 /* REG_0F73 */
252b5132 2353 {
ce518a5f
L
2354 { "(bad)", { XX } },
2355 { "(bad)", { XX } },
1ceb70f8
L
2356 { MOD_TABLE (MOD_0F73_REG_2) },
2357 { MOD_TABLE (MOD_0F73_REG_3) },
ce518a5f 2358 { "(bad)", { XX } },
ce518a5f 2359 { "(bad)", { XX } },
1ceb70f8
L
2360 { MOD_TABLE (MOD_0F73_REG_6) },
2361 { MOD_TABLE (MOD_0F73_REG_7) },
252b5132 2362 },
1ceb70f8 2363 /* REG_0FA6 */
252b5132 2364 {
4e7d34a6
L
2365 { "montmul", { { OP_0f07, 0 } } },
2366 { "xsha1", { { OP_0f07, 0 } } },
2367 { "xsha256", { { OP_0f07, 0 } } },
2368 { "(bad)", { { OP_0f07, 0 } } },
2369 { "(bad)", { { OP_0f07, 0 } } },
2370 { "(bad)", { { OP_0f07, 0 } } },
2371 { "(bad)", { { OP_0f07, 0 } } },
2372 { "(bad)", { { OP_0f07, 0 } } },
2373 },
1ceb70f8 2374 /* REG_0FA7 */
4e7d34a6
L
2375 {
2376 { "xstore-rng", { { OP_0f07, 0 } } },
2377 { "xcrypt-ecb", { { OP_0f07, 0 } } },
2378 { "xcrypt-cbc", { { OP_0f07, 0 } } },
2379 { "xcrypt-ctr", { { OP_0f07, 0 } } },
2380 { "xcrypt-cfb", { { OP_0f07, 0 } } },
2381 { "xcrypt-ofb", { { OP_0f07, 0 } } },
2382 { "(bad)", { { OP_0f07, 0 } } },
2383 { "(bad)", { { OP_0f07, 0 } } },
2384 },
1ceb70f8 2385 /* REG_0FAE */
4e7d34a6 2386 {
1ceb70f8
L
2387 { MOD_TABLE (MOD_0FAE_REG_0) },
2388 { MOD_TABLE (MOD_0FAE_REG_1) },
2389 { MOD_TABLE (MOD_0FAE_REG_2) },
2390 { MOD_TABLE (MOD_0FAE_REG_3) },
475a2301 2391 { MOD_TABLE (MOD_0FAE_REG_4) },
1ceb70f8
L
2392 { MOD_TABLE (MOD_0FAE_REG_5) },
2393 { MOD_TABLE (MOD_0FAE_REG_6) },
2394 { MOD_TABLE (MOD_0FAE_REG_7) },
252b5132 2395 },
1ceb70f8 2396 /* REG_0FBA */
252b5132 2397 {
ce518a5f
L
2398 { "(bad)", { XX } },
2399 { "(bad)", { XX } },
d8faab4e
L
2400 { "(bad)", { XX } },
2401 { "(bad)", { XX } },
4e7d34a6
L
2402 { "btQ", { Ev, Ib } },
2403 { "btsQ", { Ev, Ib } },
2404 { "btrQ", { Ev, Ib } },
2405 { "btcQ", { Ev, Ib } },
c608c12e 2406 },
1ceb70f8 2407 /* REG_0FC7 */
c608c12e 2408 {
b844680a 2409 { "(bad)", { XX } },
4e7d34a6 2410 { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } } },
d8faab4e 2411 { "(bad)", { XX } },
b844680a
L
2412 { "(bad)", { XX } },
2413 { "(bad)", { XX } },
2414 { "(bad)", { XX } },
1ceb70f8
L
2415 { MOD_TABLE (MOD_0FC7_REG_6) },
2416 { MOD_TABLE (MOD_0FC7_REG_7) },
252b5132 2417 },
c0f3af97
L
2418 /* REG_VEX_71 */
2419 {
2420 { "(bad)", { XX } },
2421 { "(bad)", { XX } },
2422 { MOD_TABLE (MOD_VEX_71_REG_2) },
2423 { "(bad)", { XX } },
2424 { MOD_TABLE (MOD_VEX_71_REG_4) },
2425 { "(bad)", { XX } },
2426 { MOD_TABLE (MOD_VEX_71_REG_6) },
2427 { "(bad)", { XX } },
2428 },
2429 /* REG_VEX_72 */
2430 {
2431 { "(bad)", { XX } },
2432 { "(bad)", { XX } },
2433 { MOD_TABLE (MOD_VEX_72_REG_2) },
2434 { "(bad)", { XX } },
2435 { MOD_TABLE (MOD_VEX_72_REG_4) },
2436 { "(bad)", { XX } },
2437 { MOD_TABLE (MOD_VEX_72_REG_6) },
2438 { "(bad)", { XX } },
2439 },
2440 /* REG_VEX_73 */
2441 {
2442 { "(bad)", { XX } },
2443 { "(bad)", { XX } },
2444 { MOD_TABLE (MOD_VEX_73_REG_2) },
2445 { MOD_TABLE (MOD_VEX_73_REG_3) },
2446 { "(bad)", { XX } },
2447 { "(bad)", { XX } },
2448 { MOD_TABLE (MOD_VEX_73_REG_6) },
2449 { MOD_TABLE (MOD_VEX_73_REG_7) },
2450 },
2451 /* REG_VEX_AE */
2452 {
2453 { "(bad)", { XX } },
2454 { "(bad)", { XX } },
2455 { MOD_TABLE (MOD_VEX_AE_REG_2) },
2456 { MOD_TABLE (MOD_VEX_AE_REG_3) },
2457 { "(bad)", { XX } },
2458 { "(bad)", { XX } },
2459 { "(bad)", { XX } },
2460 { "(bad)", { XX } },
2461 },
f88c9eb0
SP
2462 /* REG_XOP_LWPCB */
2463 {
2464 { "llwpcb", { { OP_LWPCB_E, 0 } } },
2465 { "slwpcb", { { OP_LWPCB_E, 0 } } },
2466 { "(bad)", { XX } },
2467 { "(bad)", { XX } },
2468 { "(bad)", { XX } },
2469 { "(bad)", { XX } },
2470 { "(bad)", { XX } },
2471 { "(bad)", { XX } },
2472 },
2473 /* REG_XOP_LWP */
2474 {
2475 { "lwpins", { { OP_LWP_E, 0 }, Ed, { OP_LWP_I, 0 } } },
2476 { "lwpval", { { OP_LWP_E, 0 }, Ed, { OP_LWP_I, 0 } } },
2477 { "(bad)", { XX } },
2478 { "(bad)", { XX } },
2479 { "(bad)", { XX } },
2480 { "(bad)", { XX } },
2481 { "(bad)", { XX } },
2482 { "(bad)", { XX } },
2483 },
4e7d34a6
L
2484};
2485
1ceb70f8
L
2486static const struct dis386 prefix_table[][4] = {
2487 /* PREFIX_90 */
252b5132 2488 {
4e7d34a6
L
2489 { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } } },
2490 { "pause", { XX } },
2491 { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } } },
2492 { "(bad)", { XX } },
0f10071e 2493 },
4e7d34a6 2494
1ceb70f8 2495 /* PREFIX_0F10 */
cc0ec051 2496 {
4e7d34a6
L
2497 { "movups", { XM, EXx } },
2498 { "movss", { XM, EXd } },
2499 { "movupd", { XM, EXx } },
2500 { "movsd", { XM, EXq } },
30d1c836 2501 },
4e7d34a6 2502
1ceb70f8 2503 /* PREFIX_0F11 */
30d1c836 2504 {
b6169b20 2505 { "movups", { EXxS, XM } },
fa99fab2 2506 { "movss", { EXdS, XM } },
b6169b20 2507 { "movupd", { EXxS, XM } },
fa99fab2 2508 { "movsd", { EXqS, XM } },
4e7d34a6 2509 },
252b5132 2510
1ceb70f8 2511 /* PREFIX_0F12 */
c608c12e 2512 {
1ceb70f8 2513 { MOD_TABLE (MOD_0F12_PREFIX_0) },
4e7d34a6
L
2514 { "movsldup", { XM, EXx } },
2515 { "movlpd", { XM, EXq } },
2516 { "movddup", { XM, EXq } },
c608c12e 2517 },
4e7d34a6 2518
1ceb70f8 2519 /* PREFIX_0F16 */
c608c12e 2520 {
1ceb70f8 2521 { MOD_TABLE (MOD_0F16_PREFIX_0) },
4e7d34a6
L
2522 { "movshdup", { XM, EXx } },
2523 { "movhpd", { XM, EXq } },
058f233b 2524 { "(bad)", { XX } },
c608c12e 2525 },
4e7d34a6 2526
1ceb70f8 2527 /* PREFIX_0F2A */
c608c12e 2528 {
09335d05 2529 { "cvtpi2ps", { XM, EMCq } },
98b528ac 2530 { "cvtsi2ss%LQ", { XM, Ev } },
09335d05 2531 { "cvtpi2pd", { XM, EMCq } },
98b528ac 2532 { "cvtsi2sd%LQ", { XM, Ev } },
c608c12e 2533 },
4e7d34a6 2534
1ceb70f8 2535 /* PREFIX_0F2B */
c608c12e 2536 {
75c135a8
L
2537 { MOD_TABLE (MOD_0F2B_PREFIX_0) },
2538 { MOD_TABLE (MOD_0F2B_PREFIX_1) },
2539 { MOD_TABLE (MOD_0F2B_PREFIX_2) },
2540 { MOD_TABLE (MOD_0F2B_PREFIX_3) },
c608c12e 2541 },
4e7d34a6 2542
1ceb70f8 2543 /* PREFIX_0F2C */
c608c12e 2544 {
09335d05
L
2545 { "cvttps2pi", { MXC, EXq } },
2546 { "cvttss2siY", { Gv, EXd } },
09a2c6cf 2547 { "cvttpd2pi", { MXC, EXx } },
09335d05 2548 { "cvttsd2siY", { Gv, EXq } },
c608c12e 2549 },
4e7d34a6 2550
1ceb70f8 2551 /* PREFIX_0F2D */
c608c12e 2552 {
4e7d34a6
L
2553 { "cvtps2pi", { MXC, EXq } },
2554 { "cvtss2siY", { Gv, EXd } },
2555 { "cvtpd2pi", { MXC, EXx } },
2556 { "cvtsd2siY", { Gv, EXq } },
c608c12e 2557 },
4e7d34a6 2558
1ceb70f8 2559 /* PREFIX_0F2E */
c608c12e 2560 {
4e7d34a6
L
2561 { "ucomiss",{ XM, EXd } },
2562 { "(bad)", { XX } },
2563 { "ucomisd",{ XM, EXq } },
2564 { "(bad)", { XX } },
c608c12e 2565 },
4e7d34a6 2566
1ceb70f8 2567 /* PREFIX_0F2F */
c608c12e 2568 {
4e7d34a6
L
2569 { "comiss", { XM, EXd } },
2570 { "(bad)", { XX } },
2571 { "comisd", { XM, EXq } },
2572 { "(bad)", { XX } },
c608c12e 2573 },
4e7d34a6 2574
1ceb70f8 2575 /* PREFIX_0F51 */
c608c12e 2576 {
4e7d34a6
L
2577 { "sqrtps", { XM, EXx } },
2578 { "sqrtss", { XM, EXd } },
2579 { "sqrtpd", { XM, EXx } },
2580 { "sqrtsd", { XM, EXq } },
c608c12e 2581 },
4e7d34a6 2582
1ceb70f8 2583 /* PREFIX_0F52 */
c608c12e 2584 {
4e7d34a6
L
2585 { "rsqrtps",{ XM, EXx } },
2586 { "rsqrtss",{ XM, EXd } },
058f233b
L
2587 { "(bad)", { XX } },
2588 { "(bad)", { XX } },
c608c12e 2589 },
4e7d34a6 2590
1ceb70f8 2591 /* PREFIX_0F53 */
c608c12e 2592 {
4e7d34a6
L
2593 { "rcpps", { XM, EXx } },
2594 { "rcpss", { XM, EXd } },
058f233b
L
2595 { "(bad)", { XX } },
2596 { "(bad)", { XX } },
c608c12e 2597 },
4e7d34a6 2598
1ceb70f8 2599 /* PREFIX_0F58 */
c608c12e 2600 {
4e7d34a6
L
2601 { "addps", { XM, EXx } },
2602 { "addss", { XM, EXd } },
2603 { "addpd", { XM, EXx } },
2604 { "addsd", { XM, EXq } },
c608c12e 2605 },
4e7d34a6 2606
1ceb70f8 2607 /* PREFIX_0F59 */
c608c12e 2608 {
4e7d34a6
L
2609 { "mulps", { XM, EXx } },
2610 { "mulss", { XM, EXd } },
2611 { "mulpd", { XM, EXx } },
2612 { "mulsd", { XM, EXq } },
041bd2e0 2613 },
4e7d34a6 2614
1ceb70f8 2615 /* PREFIX_0F5A */
041bd2e0 2616 {
4e7d34a6
L
2617 { "cvtps2pd", { XM, EXq } },
2618 { "cvtss2sd", { XM, EXd } },
2619 { "cvtpd2ps", { XM, EXx } },
2620 { "cvtsd2ss", { XM, EXq } },
041bd2e0 2621 },
4e7d34a6 2622
1ceb70f8 2623 /* PREFIX_0F5B */
041bd2e0 2624 {
09a2c6cf
L
2625 { "cvtdq2ps", { XM, EXx } },
2626 { "cvttps2dq", { XM, EXx } },
2627 { "cvtps2dq", { XM, EXx } },
058f233b 2628 { "(bad)", { XX } },
041bd2e0 2629 },
4e7d34a6 2630
1ceb70f8 2631 /* PREFIX_0F5C */
041bd2e0 2632 {
4e7d34a6
L
2633 { "subps", { XM, EXx } },
2634 { "subss", { XM, EXd } },
2635 { "subpd", { XM, EXx } },
2636 { "subsd", { XM, EXq } },
041bd2e0 2637 },
4e7d34a6 2638
1ceb70f8 2639 /* PREFIX_0F5D */
041bd2e0 2640 {
4e7d34a6
L
2641 { "minps", { XM, EXx } },
2642 { "minss", { XM, EXd } },
2643 { "minpd", { XM, EXx } },
2644 { "minsd", { XM, EXq } },
041bd2e0 2645 },
4e7d34a6 2646
1ceb70f8 2647 /* PREFIX_0F5E */
041bd2e0 2648 {
4e7d34a6
L
2649 { "divps", { XM, EXx } },
2650 { "divss", { XM, EXd } },
2651 { "divpd", { XM, EXx } },
2652 { "divsd", { XM, EXq } },
041bd2e0 2653 },
4e7d34a6 2654
1ceb70f8 2655 /* PREFIX_0F5F */
041bd2e0 2656 {
4e7d34a6
L
2657 { "maxps", { XM, EXx } },
2658 { "maxss", { XM, EXd } },
2659 { "maxpd", { XM, EXx } },
2660 { "maxsd", { XM, EXq } },
041bd2e0 2661 },
4e7d34a6 2662
1ceb70f8 2663 /* PREFIX_0F60 */
041bd2e0 2664 {
4e7d34a6
L
2665 { "punpcklbw",{ MX, EMd } },
2666 { "(bad)", { XX } },
2667 { "punpcklbw",{ MX, EMx } },
2668 { "(bad)", { XX } },
041bd2e0 2669 },
4e7d34a6 2670
1ceb70f8 2671 /* PREFIX_0F61 */
041bd2e0 2672 {
4e7d34a6
L
2673 { "punpcklwd",{ MX, EMd } },
2674 { "(bad)", { XX } },
2675 { "punpcklwd",{ MX, EMx } },
2676 { "(bad)", { XX } },
041bd2e0 2677 },
4e7d34a6 2678
1ceb70f8 2679 /* PREFIX_0F62 */
041bd2e0 2680 {
4e7d34a6
L
2681 { "punpckldq",{ MX, EMd } },
2682 { "(bad)", { XX } },
2683 { "punpckldq",{ MX, EMx } },
2684 { "(bad)", { XX } },
041bd2e0 2685 },
4e7d34a6 2686
1ceb70f8 2687 /* PREFIX_0F6C */
041bd2e0 2688 {
058f233b
L
2689 { "(bad)", { XX } },
2690 { "(bad)", { XX } },
4e7d34a6 2691 { "punpcklqdq", { XM, EXx } },
058f233b 2692 { "(bad)", { XX } },
0f17484f 2693 },
4e7d34a6 2694
1ceb70f8 2695 /* PREFIX_0F6D */
0f17484f 2696 {
058f233b
L
2697 { "(bad)", { XX } },
2698 { "(bad)", { XX } },
4e7d34a6 2699 { "punpckhqdq", { XM, EXx } },
058f233b 2700 { "(bad)", { XX } },
041bd2e0 2701 },
4e7d34a6 2702
1ceb70f8 2703 /* PREFIX_0F6F */
ca164297 2704 {
4e7d34a6
L
2705 { "movq", { MX, EM } },
2706 { "movdqu", { XM, EXx } },
2707 { "movdqa", { XM, EXx } },
058f233b 2708 { "(bad)", { XX } },
ca164297 2709 },
4e7d34a6 2710
1ceb70f8 2711 /* PREFIX_0F70 */
4e7d34a6
L
2712 {
2713 { "pshufw", { MX, EM, Ib } },
2714 { "pshufhw",{ XM, EXx, Ib } },
2715 { "pshufd", { XM, EXx, Ib } },
2716 { "pshuflw",{ XM, EXx, Ib } },
2717 },
2718
92fddf8e
L
2719 /* PREFIX_0F73_REG_3 */
2720 {
2721 { "(bad)", { XX } },
2722 { "(bad)", { XX } },
2723 { "psrldq", { XS, Ib } },
2724 { "(bad)", { XX } },
2725 },
2726
2727 /* PREFIX_0F73_REG_7 */
2728 {
2729 { "(bad)", { XX } },
2730 { "(bad)", { XX } },
2731 { "pslldq", { XS, Ib } },
2732 { "(bad)", { XX } },
2733 },
2734
1ceb70f8 2735 /* PREFIX_0F78 */
4e7d34a6
L
2736 {
2737 {"vmread", { Em, Gm } },
2738 {"(bad)", { XX } },
2739 {"extrq", { XS, Ib, Ib } },
2740 {"insertq", { XM, XS, Ib, Ib } },
2741 },
2742
1ceb70f8 2743 /* PREFIX_0F79 */
4e7d34a6
L
2744 {
2745 {"vmwrite", { Gm, Em } },
2746 {"(bad)", { XX } },
2747 {"extrq", { XM, XS } },
2748 {"insertq", { XM, XS } },
2749 },
2750
1ceb70f8 2751 /* PREFIX_0F7C */
ca164297 2752 {
058f233b
L
2753 { "(bad)", { XX } },
2754 { "(bad)", { XX } },
09a2c6cf
L
2755 { "haddpd", { XM, EXx } },
2756 { "haddps", { XM, EXx } },
ca164297 2757 },
4e7d34a6 2758
1ceb70f8 2759 /* PREFIX_0F7D */
ca164297 2760 {
058f233b
L
2761 { "(bad)", { XX } },
2762 { "(bad)", { XX } },
09a2c6cf
L
2763 { "hsubpd", { XM, EXx } },
2764 { "hsubps", { XM, EXx } },
ca164297 2765 },
4e7d34a6 2766
1ceb70f8 2767 /* PREFIX_0F7E */
ca164297 2768 {
4e7d34a6
L
2769 { "movK", { Edq, MX } },
2770 { "movq", { XM, EXq } },
2771 { "movK", { Edq, XM } },
058f233b 2772 { "(bad)", { XX } },
ca164297 2773 },
4e7d34a6 2774
1ceb70f8 2775 /* PREFIX_0F7F */
ca164297 2776 {
b6169b20
L
2777 { "movq", { EMS, MX } },
2778 { "movdqu", { EXxS, XM } },
2779 { "movdqa", { EXxS, XM } },
058f233b 2780 { "(bad)", { XX } },
ca164297 2781 },
4e7d34a6 2782
1ceb70f8 2783 /* PREFIX_0FB8 */
ca164297 2784 {
4e7d34a6
L
2785 { "(bad)", { XX } },
2786 { "popcntS", { Gv, Ev } },
2787 { "(bad)", { XX } },
2788 { "(bad)", { XX } },
ca164297 2789 },
4e7d34a6 2790
1ceb70f8 2791 /* PREFIX_0FBD */
050dfa73 2792 {
4e7d34a6
L
2793 { "bsrS", { Gv, Ev } },
2794 { "lzcntS", { Gv, Ev } },
2795 { "bsrS", { Gv, Ev } },
2796 { "(bad)", { XX } },
050dfa73
MM
2797 },
2798
1ceb70f8 2799 /* PREFIX_0FC2 */
050dfa73 2800 {
ad19981d
L
2801 { "cmpps", { XM, EXx, CMP } },
2802 { "cmpss", { XM, EXd, CMP } },
2803 { "cmppd", { XM, EXx, CMP } },
2804 { "cmpsd", { XM, EXq, CMP } },
050dfa73 2805 },
246c51aa 2806
4ee52178
L
2807 /* PREFIX_0FC3 */
2808 {
2809 { "movntiS", { Ma, Gv } },
2810 { "(bad)", { XX } },
2811 { "(bad)", { XX } },
2812 { "(bad)", { XX } },
2813 },
2814
92fddf8e
L
2815 /* PREFIX_0FC7_REG_6 */
2816 {
2817 { "vmptrld",{ Mq } },
2818 { "vmxon", { Mq } },
2819 { "vmclear",{ Mq } },
2820 { "(bad)", { XX } },
2821 },
2822
1ceb70f8 2823 /* PREFIX_0FD0 */
050dfa73 2824 {
058f233b
L
2825 { "(bad)", { XX } },
2826 { "(bad)", { XX } },
4e7d34a6
L
2827 { "addsubpd", { XM, EXx } },
2828 { "addsubps", { XM, EXx } },
246c51aa 2829 },
050dfa73 2830
1ceb70f8 2831 /* PREFIX_0FD6 */
050dfa73 2832 {
058f233b 2833 { "(bad)", { XX } },
4e7d34a6 2834 { "movq2dq",{ XM, MS } },
b6169b20 2835 { "movq", { EXqS, XM } },
4e7d34a6 2836 { "movdq2q",{ MX, XS } },
050dfa73
MM
2837 },
2838
1ceb70f8 2839 /* PREFIX_0FE6 */
7918206c 2840 {
058f233b 2841 { "(bad)", { XX } },
4e7d34a6
L
2842 { "cvtdq2pd", { XM, EXq } },
2843 { "cvttpd2dq", { XM, EXx } },
2844 { "cvtpd2dq", { XM, EXx } },
7918206c 2845 },
8b38ad71 2846
1ceb70f8 2847 /* PREFIX_0FE7 */
8b38ad71 2848 {
4ee52178 2849 { "movntq", { Mq, MX } },
058f233b 2850 { "(bad)", { XX } },
75c135a8 2851 { MOD_TABLE (MOD_0FE7_PREFIX_2) },
058f233b 2852 { "(bad)", { XX } },
4e7d34a6
L
2853 },
2854
1ceb70f8 2855 /* PREFIX_0FF0 */
4e7d34a6 2856 {
058f233b
L
2857 { "(bad)", { XX } },
2858 { "(bad)", { XX } },
2859 { "(bad)", { XX } },
1ceb70f8 2860 { MOD_TABLE (MOD_0FF0_PREFIX_3) },
4e7d34a6
L
2861 },
2862
1ceb70f8 2863 /* PREFIX_0FF7 */
4e7d34a6
L
2864 {
2865 { "maskmovq", { MX, MS } },
058f233b 2866 { "(bad)", { XX } },
4e7d34a6 2867 { "maskmovdqu", { XM, XS } },
058f233b 2868 { "(bad)", { XX } },
8b38ad71 2869 },
42903f7f 2870
1ceb70f8 2871 /* PREFIX_0F3810 */
42903f7f
L
2872 {
2873 { "(bad)", { XX } },
2874 { "(bad)", { XX } },
88a94849 2875 { "pblendvb", { XM, EXx, XMM0 } },
42903f7f
L
2876 { "(bad)", { XX } },
2877 },
2878
1ceb70f8 2879 /* PREFIX_0F3814 */
42903f7f
L
2880 {
2881 { "(bad)", { XX } },
2882 { "(bad)", { XX } },
88a94849 2883 { "blendvps", { XM, EXx, XMM0 } },
42903f7f
L
2884 { "(bad)", { XX } },
2885 },
2886
1ceb70f8 2887 /* PREFIX_0F3815 */
42903f7f
L
2888 {
2889 { "(bad)", { XX } },
2890 { "(bad)", { XX } },
09a2c6cf 2891 { "blendvpd", { XM, EXx, XMM0 } },
42903f7f
L
2892 { "(bad)", { XX } },
2893 },
2894
1ceb70f8 2895 /* PREFIX_0F3817 */
42903f7f
L
2896 {
2897 { "(bad)", { XX } },
2898 { "(bad)", { XX } },
09a2c6cf 2899 { "ptest", { XM, EXx } },
42903f7f
L
2900 { "(bad)", { XX } },
2901 },
2902
1ceb70f8 2903 /* PREFIX_0F3820 */
42903f7f
L
2904 {
2905 { "(bad)", { XX } },
2906 { "(bad)", { XX } },
8976381e 2907 { "pmovsxbw", { XM, EXq } },
42903f7f
L
2908 { "(bad)", { XX } },
2909 },
2910
1ceb70f8 2911 /* PREFIX_0F3821 */
42903f7f
L
2912 {
2913 { "(bad)", { XX } },
2914 { "(bad)", { XX } },
8976381e 2915 { "pmovsxbd", { XM, EXd } },
42903f7f
L
2916 { "(bad)", { XX } },
2917 },
2918
1ceb70f8 2919 /* PREFIX_0F3822 */
42903f7f
L
2920 {
2921 { "(bad)", { XX } },
2922 { "(bad)", { XX } },
8976381e 2923 { "pmovsxbq", { XM, EXw } },
42903f7f
L
2924 { "(bad)", { XX } },
2925 },
2926
1ceb70f8 2927 /* PREFIX_0F3823 */
42903f7f
L
2928 {
2929 { "(bad)", { XX } },
2930 { "(bad)", { XX } },
8976381e 2931 { "pmovsxwd", { XM, EXq } },
42903f7f
L
2932 { "(bad)", { XX } },
2933 },
2934
1ceb70f8 2935 /* PREFIX_0F3824 */
42903f7f
L
2936 {
2937 { "(bad)", { XX } },
2938 { "(bad)", { XX } },
8976381e 2939 { "pmovsxwq", { XM, EXd } },
42903f7f
L
2940 { "(bad)", { XX } },
2941 },
2942
1ceb70f8 2943 /* PREFIX_0F3825 */
42903f7f
L
2944 {
2945 { "(bad)", { XX } },
2946 { "(bad)", { XX } },
8976381e 2947 { "pmovsxdq", { XM, EXq } },
42903f7f
L
2948 { "(bad)", { XX } },
2949 },
2950
1ceb70f8 2951 /* PREFIX_0F3828 */
42903f7f
L
2952 {
2953 { "(bad)", { XX } },
2954 { "(bad)", { XX } },
09a2c6cf 2955 { "pmuldq", { XM, EXx } },
42903f7f
L
2956 { "(bad)", { XX } },
2957 },
2958
1ceb70f8 2959 /* PREFIX_0F3829 */
42903f7f
L
2960 {
2961 { "(bad)", { XX } },
2962 { "(bad)", { XX } },
09a2c6cf 2963 { "pcmpeqq", { XM, EXx } },
42903f7f
L
2964 { "(bad)", { XX } },
2965 },
2966
1ceb70f8 2967 /* PREFIX_0F382A */
42903f7f
L
2968 {
2969 { "(bad)", { XX } },
2970 { "(bad)", { XX } },
75c135a8 2971 { MOD_TABLE (MOD_0F382A_PREFIX_2) },
42903f7f
L
2972 { "(bad)", { XX } },
2973 },
2974
1ceb70f8 2975 /* PREFIX_0F382B */
42903f7f
L
2976 {
2977 { "(bad)", { XX } },
2978 { "(bad)", { XX } },
09a2c6cf 2979 { "packusdw", { XM, EXx } },
42903f7f
L
2980 { "(bad)", { XX } },
2981 },
2982
1ceb70f8 2983 /* PREFIX_0F3830 */
42903f7f
L
2984 {
2985 { "(bad)", { XX } },
2986 { "(bad)", { XX } },
8976381e 2987 { "pmovzxbw", { XM, EXq } },
42903f7f
L
2988 { "(bad)", { XX } },
2989 },
2990
1ceb70f8 2991 /* PREFIX_0F3831 */
42903f7f
L
2992 {
2993 { "(bad)", { XX } },
2994 { "(bad)", { XX } },
8976381e 2995 { "pmovzxbd", { XM, EXd } },
42903f7f
L
2996 { "(bad)", { XX } },
2997 },
2998
1ceb70f8 2999 /* PREFIX_0F3832 */
42903f7f
L
3000 {
3001 { "(bad)", { XX } },
3002 { "(bad)", { XX } },
8976381e 3003 { "pmovzxbq", { XM, EXw } },
42903f7f
L
3004 { "(bad)", { XX } },
3005 },
3006
1ceb70f8 3007 /* PREFIX_0F3833 */
42903f7f
L
3008 {
3009 { "(bad)", { XX } },
3010 { "(bad)", { XX } },
8976381e 3011 { "pmovzxwd", { XM, EXq } },
42903f7f
L
3012 { "(bad)", { XX } },
3013 },
3014
1ceb70f8 3015 /* PREFIX_0F3834 */
42903f7f
L
3016 {
3017 { "(bad)", { XX } },
3018 { "(bad)", { XX } },
8976381e 3019 { "pmovzxwq", { XM, EXd } },
42903f7f
L
3020 { "(bad)", { XX } },
3021 },
3022
1ceb70f8 3023 /* PREFIX_0F3835 */
42903f7f
L
3024 {
3025 { "(bad)", { XX } },
3026 { "(bad)", { XX } },
8976381e 3027 { "pmovzxdq", { XM, EXq } },
42903f7f
L
3028 { "(bad)", { XX } },
3029 },
3030
1ceb70f8 3031 /* PREFIX_0F3837 */
4e7d34a6
L
3032 {
3033 { "(bad)", { XX } },
3034 { "(bad)", { XX } },
3035 { "pcmpgtq", { XM, EXx } },
3036 { "(bad)", { XX } },
3037 },
3038
1ceb70f8 3039 /* PREFIX_0F3838 */
42903f7f
L
3040 {
3041 { "(bad)", { XX } },
3042 { "(bad)", { XX } },
09a2c6cf 3043 { "pminsb", { XM, EXx } },
42903f7f
L
3044 { "(bad)", { XX } },
3045 },
3046
1ceb70f8 3047 /* PREFIX_0F3839 */
42903f7f
L
3048 {
3049 { "(bad)", { XX } },
3050 { "(bad)", { XX } },
09a2c6cf 3051 { "pminsd", { XM, EXx } },
42903f7f
L
3052 { "(bad)", { XX } },
3053 },
3054
1ceb70f8 3055 /* PREFIX_0F383A */
42903f7f
L
3056 {
3057 { "(bad)", { XX } },
3058 { "(bad)", { XX } },
09a2c6cf 3059 { "pminuw", { XM, EXx } },
42903f7f
L
3060 { "(bad)", { XX } },
3061 },
3062
1ceb70f8 3063 /* PREFIX_0F383B */
42903f7f
L
3064 {
3065 { "(bad)", { XX } },
3066 { "(bad)", { XX } },
09a2c6cf 3067 { "pminud", { XM, EXx } },
42903f7f
L
3068 { "(bad)", { XX } },
3069 },
3070
1ceb70f8 3071 /* PREFIX_0F383C */
42903f7f
L
3072 {
3073 { "(bad)", { XX } },
3074 { "(bad)", { XX } },
09a2c6cf 3075 { "pmaxsb", { XM, EXx } },
42903f7f
L
3076 { "(bad)", { XX } },
3077 },
3078
1ceb70f8 3079 /* PREFIX_0F383D */
42903f7f
L
3080 {
3081 { "(bad)", { XX } },
3082 { "(bad)", { XX } },
09a2c6cf 3083 { "pmaxsd", { XM, EXx } },
42903f7f
L
3084 { "(bad)", { XX } },
3085 },
3086
1ceb70f8 3087 /* PREFIX_0F383E */
42903f7f
L
3088 {
3089 { "(bad)", { XX } },
3090 { "(bad)", { XX } },
09a2c6cf 3091 { "pmaxuw", { XM, EXx } },
42903f7f
L
3092 { "(bad)", { XX } },
3093 },
3094
1ceb70f8 3095 /* PREFIX_0F383F */
42903f7f
L
3096 {
3097 { "(bad)", { XX } },
3098 { "(bad)", { XX } },
09a2c6cf 3099 { "pmaxud", { XM, EXx } },
42903f7f
L
3100 { "(bad)", { XX } },
3101 },
3102
1ceb70f8 3103 /* PREFIX_0F3840 */
42903f7f
L
3104 {
3105 { "(bad)", { XX } },
3106 { "(bad)", { XX } },
09a2c6cf 3107 { "pmulld", { XM, EXx } },
42903f7f
L
3108 { "(bad)", { XX } },
3109 },
3110
1ceb70f8 3111 /* PREFIX_0F3841 */
42903f7f
L
3112 {
3113 { "(bad)", { XX } },
3114 { "(bad)", { XX } },
09a2c6cf 3115 { "phminposuw", { XM, EXx } },
42903f7f
L
3116 { "(bad)", { XX } },
3117 },
3118
f1f8f695
L
3119 /* PREFIX_0F3880 */
3120 {
3121 { "(bad)", { XX } },
3122 { "(bad)", { XX } },
3123 { "invept", { Gm, Mo } },
3124 { "(bad)", { XX } },
3125 },
3126
3127 /* PREFIX_0F3881 */
3128 {
3129 { "(bad)", { XX } },
3130 { "(bad)", { XX } },
3131 { "invvpid", { Gm, Mo } },
3132 { "(bad)", { XX } },
3133 },
3134
c0f3af97
L
3135 /* PREFIX_0F38DB */
3136 {
3137 { "(bad)", { XX } },
3138 { "(bad)", { XX } },
3139 { "aesimc", { XM, EXx } },
3140 { "(bad)", { XX } },
3141 },
3142
3143 /* PREFIX_0F38DC */
3144 {
3145 { "(bad)", { XX } },
3146 { "(bad)", { XX } },
3147 { "aesenc", { XM, EXx } },
3148 { "(bad)", { XX } },
3149 },
3150
3151 /* PREFIX_0F38DD */
3152 {
3153 { "(bad)", { XX } },
3154 { "(bad)", { XX } },
3155 { "aesenclast", { XM, EXx } },
3156 { "(bad)", { XX } },
3157 },
3158
3159 /* PREFIX_0F38DE */
3160 {
3161 { "(bad)", { XX } },
3162 { "(bad)", { XX } },
3163 { "aesdec", { XM, EXx } },
3164 { "(bad)", { XX } },
3165 },
3166
3167 /* PREFIX_0F38DF */
3168 {
3169 { "(bad)", { XX } },
3170 { "(bad)", { XX } },
3171 { "aesdeclast", { XM, EXx } },
3172 { "(bad)", { XX } },
3173 },
3174
1ceb70f8 3175 /* PREFIX_0F38F0 */
4e7d34a6 3176 {
f1f8f695 3177 { "movbeS", { Gv, { MOVBE_Fixup, v_mode } } },
4e7d34a6 3178 { "(bad)", { XX } },
f1f8f695 3179 { "movbeS", { Gv, { MOVBE_Fixup, v_mode } } },
4e7d34a6
L
3180 { "crc32", { Gdq, { CRC32_Fixup, b_mode } } },
3181 },
3182
1ceb70f8 3183 /* PREFIX_0F38F1 */
4e7d34a6 3184 {
f1f8f695 3185 { "movbeS", { { MOVBE_Fixup, v_mode }, Gv } },
4e7d34a6 3186 { "(bad)", { XX } },
f1f8f695 3187 { "movbeS", { { MOVBE_Fixup, v_mode }, Gv } },
4e7d34a6
L
3188 { "crc32", { Gdq, { CRC32_Fixup, v_mode } } },
3189 },
3190
1ceb70f8 3191 /* PREFIX_0F3A08 */
42903f7f
L
3192 {
3193 { "(bad)", { XX } },
3194 { "(bad)", { XX } },
09a2c6cf 3195 { "roundps", { XM, EXx, Ib } },
42903f7f
L
3196 { "(bad)", { XX } },
3197 },
3198
1ceb70f8 3199 /* PREFIX_0F3A09 */
42903f7f
L
3200 {
3201 { "(bad)", { XX } },
3202 { "(bad)", { XX } },
09a2c6cf 3203 { "roundpd", { XM, EXx, Ib } },
42903f7f
L
3204 { "(bad)", { XX } },
3205 },
3206
1ceb70f8 3207 /* PREFIX_0F3A0A */
42903f7f
L
3208 {
3209 { "(bad)", { XX } },
3210 { "(bad)", { XX } },
09335d05 3211 { "roundss", { XM, EXd, Ib } },
42903f7f
L
3212 { "(bad)", { XX } },
3213 },
3214
1ceb70f8 3215 /* PREFIX_0F3A0B */
42903f7f
L
3216 {
3217 { "(bad)", { XX } },
3218 { "(bad)", { XX } },
09335d05 3219 { "roundsd", { XM, EXq, Ib } },
42903f7f
L
3220 { "(bad)", { XX } },
3221 },
3222
1ceb70f8 3223 /* PREFIX_0F3A0C */
42903f7f
L
3224 {
3225 { "(bad)", { XX } },
3226 { "(bad)", { XX } },
09a2c6cf 3227 { "blendps", { XM, EXx, Ib } },
42903f7f
L
3228 { "(bad)", { XX } },
3229 },
3230
1ceb70f8 3231 /* PREFIX_0F3A0D */
42903f7f
L
3232 {
3233 { "(bad)", { XX } },
3234 { "(bad)", { XX } },
09a2c6cf 3235 { "blendpd", { XM, EXx, Ib } },
42903f7f
L
3236 { "(bad)", { XX } },
3237 },
3238
1ceb70f8 3239 /* PREFIX_0F3A0E */
42903f7f
L
3240 {
3241 { "(bad)", { XX } },
3242 { "(bad)", { XX } },
09a2c6cf 3243 { "pblendw", { XM, EXx, Ib } },
42903f7f
L
3244 { "(bad)", { XX } },
3245 },
3246
1ceb70f8 3247 /* PREFIX_0F3A14 */
42903f7f
L
3248 {
3249 { "(bad)", { XX } },
3250 { "(bad)", { XX } },
3251 { "pextrb", { Edqb, XM, Ib } },
3252 { "(bad)", { XX } },
3253 },
3254
1ceb70f8 3255 /* PREFIX_0F3A15 */
42903f7f
L
3256 {
3257 { "(bad)", { XX } },
3258 { "(bad)", { XX } },
3259 { "pextrw", { Edqw, XM, Ib } },
3260 { "(bad)", { XX } },
3261 },
3262
1ceb70f8 3263 /* PREFIX_0F3A16 */
42903f7f
L
3264 {
3265 { "(bad)", { XX } },
3266 { "(bad)", { XX } },
3267 { "pextrK", { Edq, XM, Ib } },
3268 { "(bad)", { XX } },
3269 },
3270
1ceb70f8 3271 /* PREFIX_0F3A17 */
42903f7f
L
3272 {
3273 { "(bad)", { XX } },
3274 { "(bad)", { XX } },
3275 { "extractps", { Edqd, XM, Ib } },
3276 { "(bad)", { XX } },
3277 },
3278
1ceb70f8 3279 /* PREFIX_0F3A20 */
42903f7f
L
3280 {
3281 { "(bad)", { XX } },
3282 { "(bad)", { XX } },
3283 { "pinsrb", { XM, Edqb, Ib } },
3284 { "(bad)", { XX } },
3285 },
3286
1ceb70f8 3287 /* PREFIX_0F3A21 */
42903f7f
L
3288 {
3289 { "(bad)", { XX } },
3290 { "(bad)", { XX } },
8976381e 3291 { "insertps", { XM, EXd, Ib } },
42903f7f
L
3292 { "(bad)", { XX } },
3293 },
3294
1ceb70f8 3295 /* PREFIX_0F3A22 */
42903f7f
L
3296 {
3297 { "(bad)", { XX } },
3298 { "(bad)", { XX } },
3299 { "pinsrK", { XM, Edq, Ib } },
3300 { "(bad)", { XX } },
3301 },
3302
1ceb70f8 3303 /* PREFIX_0F3A40 */
42903f7f
L
3304 {
3305 { "(bad)", { XX } },
3306 { "(bad)", { XX } },
09a2c6cf 3307 { "dpps", { XM, EXx, Ib } },
42903f7f
L
3308 { "(bad)", { XX } },
3309 },
3310
1ceb70f8 3311 /* PREFIX_0F3A41 */
42903f7f
L
3312 {
3313 { "(bad)", { XX } },
3314 { "(bad)", { XX } },
09a2c6cf 3315 { "dppd", { XM, EXx, Ib } },
42903f7f
L
3316 { "(bad)", { XX } },
3317 },
3318
1ceb70f8 3319 /* PREFIX_0F3A42 */
42903f7f
L
3320 {
3321 { "(bad)", { XX } },
3322 { "(bad)", { XX } },
09a2c6cf 3323 { "mpsadbw", { XM, EXx, Ib } },
42903f7f
L
3324 { "(bad)", { XX } },
3325 },
381d071f 3326
c0f3af97
L
3327 /* PREFIX_0F3A44 */
3328 {
3329 { "(bad)", { XX } },
3330 { "(bad)", { XX } },
3331 { "pclmulqdq", { XM, EXx, PCLMUL } },
3332 { "(bad)", { XX } },
3333 },
3334
1ceb70f8 3335 /* PREFIX_0F3A60 */
381d071f
L
3336 {
3337 { "(bad)", { XX } },
3338 { "(bad)", { XX } },
4e7d34a6 3339 { "pcmpestrm", { XM, EXx, Ib } },
381d071f
L
3340 { "(bad)", { XX } },
3341 },
3342
1ceb70f8 3343 /* PREFIX_0F3A61 */
381d071f
L
3344 {
3345 { "(bad)", { XX } },
3346 { "(bad)", { XX } },
4e7d34a6 3347 { "pcmpestri", { XM, EXx, Ib } },
381d071f 3348 { "(bad)", { XX } },
381d071f
L
3349 },
3350
1ceb70f8 3351 /* PREFIX_0F3A62 */
381d071f
L
3352 {
3353 { "(bad)", { XX } },
3354 { "(bad)", { XX } },
4e7d34a6 3355 { "pcmpistrm", { XM, EXx, Ib } },
381d071f 3356 { "(bad)", { XX } },
381d071f
L
3357 },
3358
1ceb70f8 3359 /* PREFIX_0F3A63 */
381d071f
L
3360 {
3361 { "(bad)", { XX } },
3362 { "(bad)", { XX } },
4e7d34a6 3363 { "pcmpistri", { XM, EXx, Ib } },
381d071f
L
3364 { "(bad)", { XX } },
3365 },
09a2c6cf 3366
c0f3af97 3367 /* PREFIX_0F3ADF */
09a2c6cf 3368 {
c0f3af97
L
3369 { "(bad)", { XX } },
3370 { "(bad)", { XX } },
3371 { "aeskeygenassist", { XM, EXx, Ib } },
3372 { "(bad)", { XX } },
09a2c6cf
L
3373 },
3374
c0f3af97 3375 /* PREFIX_VEX_10 */
09a2c6cf 3376 {
c0f3af97
L
3377 { "vmovups", { XM, EXx } },
3378 { VEX_LEN_TABLE (VEX_LEN_10_P_1) },
3379 { "vmovupd", { XM, EXx } },
3380 { VEX_LEN_TABLE (VEX_LEN_10_P_3) },
09a2c6cf
L
3381 },
3382
c0f3af97 3383 /* PREFIX_VEX_11 */
09a2c6cf 3384 {
b6169b20 3385 { "vmovups", { EXxS, XM } },
c0f3af97 3386 { VEX_LEN_TABLE (VEX_LEN_11_P_1) },
b6169b20 3387 { "vmovupd", { EXxS, XM } },
c0f3af97 3388 { VEX_LEN_TABLE (VEX_LEN_11_P_3) },
09a2c6cf
L
3389 },
3390
c0f3af97 3391 /* PREFIX_VEX_12 */
09a2c6cf 3392 {
c0f3af97
L
3393 { MOD_TABLE (MOD_VEX_12_PREFIX_0) },
3394 { "vmovsldup", { XM, EXx } },
3395 { VEX_LEN_TABLE (VEX_LEN_12_P_2) },
3396 { "vmovddup", { XM, EXymmq } },
09a2c6cf
L
3397 },
3398
c0f3af97 3399 /* PREFIX_VEX_16 */
09a2c6cf 3400 {
c0f3af97
L
3401 { MOD_TABLE (MOD_VEX_16_PREFIX_0) },
3402 { "vmovshdup", { XM, EXx } },
3403 { VEX_LEN_TABLE (VEX_LEN_16_P_2) },
3404 { "(bad)", { XX } },
5f754f58 3405 },
7c52e0e8 3406
c0f3af97 3407 /* PREFIX_VEX_2A */
5f754f58 3408 {
c0f3af97
L
3409 { "(bad)", { XX } },
3410 { VEX_LEN_TABLE (VEX_LEN_2A_P_1) },
3411 { "(bad)", { XX } },
3412 { VEX_LEN_TABLE (VEX_LEN_2A_P_3) },
5f754f58 3413 },
7c52e0e8 3414
c0f3af97 3415 /* PREFIX_VEX_2C */
5f754f58 3416 {
c0f3af97
L
3417 { "(bad)", { XX } },
3418 { VEX_LEN_TABLE (VEX_LEN_2C_P_1) },
3419 { "(bad)", { XX } },
3420 { VEX_LEN_TABLE (VEX_LEN_2C_P_3) },
5f754f58 3421 },
7c52e0e8 3422
c0f3af97 3423 /* PREFIX_VEX_2D */
7c52e0e8 3424 {
c0f3af97
L
3425 { "(bad)", { XX } },
3426 { VEX_LEN_TABLE (VEX_LEN_2D_P_1) },
3427 { "(bad)", { XX } },
3428 { VEX_LEN_TABLE (VEX_LEN_2D_P_3) },
7c52e0e8
L
3429 },
3430
c0f3af97 3431 /* PREFIX_VEX_2E */
7c52e0e8 3432 {
c0f3af97
L
3433 { VEX_LEN_TABLE (VEX_LEN_2E_P_0) },
3434 { "(bad)", { XX } },
3435 { VEX_LEN_TABLE (VEX_LEN_2E_P_2) },
3436 { "(bad)", { XX } },
7c52e0e8
L
3437 },
3438
c0f3af97 3439 /* PREFIX_VEX_2F */
7c52e0e8 3440 {
c0f3af97
L
3441 { VEX_LEN_TABLE (VEX_LEN_2F_P_0) },
3442 { "(bad)", { XX } },
3443 { VEX_LEN_TABLE (VEX_LEN_2F_P_2) },
3444 { "(bad)", { XX } },
7c52e0e8
L
3445 },
3446
c0f3af97 3447 /* PREFIX_VEX_51 */
7c52e0e8 3448 {
c0f3af97
L
3449 { "vsqrtps", { XM, EXx } },
3450 { VEX_LEN_TABLE (VEX_LEN_51_P_1) },
3451 { "vsqrtpd", { XM, EXx } },
3452 { VEX_LEN_TABLE (VEX_LEN_51_P_3) },
7c52e0e8
L
3453 },
3454
c0f3af97 3455 /* PREFIX_VEX_52 */
7c52e0e8 3456 {
c0f3af97
L
3457 { "vrsqrtps", { XM, EXx } },
3458 { VEX_LEN_TABLE (VEX_LEN_52_P_1) },
3459 { "(bad)", { XX } },
3460 { "(bad)", { XX } },
7c52e0e8
L
3461 },
3462
c0f3af97 3463 /* PREFIX_VEX_53 */
7c52e0e8 3464 {
c0f3af97
L
3465 { "vrcpps", { XM, EXx } },
3466 { VEX_LEN_TABLE (VEX_LEN_53_P_1) },
3467 { "(bad)", { XX } },
3468 { "(bad)", { XX } },
7c52e0e8
L
3469 },
3470
c0f3af97 3471 /* PREFIX_VEX_58 */
7c52e0e8 3472 {
c0f3af97
L
3473 { "vaddps", { XM, Vex, EXx } },
3474 { VEX_LEN_TABLE (VEX_LEN_58_P_1) },
3475 { "vaddpd", { XM, Vex, EXx } },
3476 { VEX_LEN_TABLE (VEX_LEN_58_P_3) },
7c52e0e8
L
3477 },
3478
c0f3af97 3479 /* PREFIX_VEX_59 */
7c52e0e8 3480 {
c0f3af97
L
3481 { "vmulps", { XM, Vex, EXx } },
3482 { VEX_LEN_TABLE (VEX_LEN_59_P_1) },
3483 { "vmulpd", { XM, Vex, EXx } },
3484 { VEX_LEN_TABLE (VEX_LEN_59_P_3) },
7c52e0e8
L
3485 },
3486
c0f3af97 3487 /* PREFIX_VEX_5A */
7c52e0e8 3488 {
c0f3af97
L
3489 { "vcvtps2pd", { XM, EXxmmq } },
3490 { VEX_LEN_TABLE (VEX_LEN_5A_P_1) },
3491 { "vcvtpd2ps%XY", { XMM, EXx } },
3492 { VEX_LEN_TABLE (VEX_LEN_5A_P_3) },
7c52e0e8
L
3493 },
3494
c0f3af97 3495 /* PREFIX_VEX_5B */
7c52e0e8 3496 {
c0f3af97
L
3497 { "vcvtdq2ps", { XM, EXx } },
3498 { "vcvttps2dq", { XM, EXx } },
3499 { "vcvtps2dq", { XM, EXx } },
3500 { "(bad)", { XX } },
7c52e0e8
L
3501 },
3502
c0f3af97 3503 /* PREFIX_VEX_5C */
7c52e0e8 3504 {
c0f3af97
L
3505 { "vsubps", { XM, Vex, EXx } },
3506 { VEX_LEN_TABLE (VEX_LEN_5C_P_1) },
3507 { "vsubpd", { XM, Vex, EXx } },
3508 { VEX_LEN_TABLE (VEX_LEN_5C_P_3) },
7c52e0e8
L
3509 },
3510
c0f3af97 3511 /* PREFIX_VEX_5D */
7c52e0e8 3512 {
c0f3af97
L
3513 { "vminps", { XM, Vex, EXx } },
3514 { VEX_LEN_TABLE (VEX_LEN_5D_P_1) },
3515 { "vminpd", { XM, Vex, EXx } },
3516 { VEX_LEN_TABLE (VEX_LEN_5D_P_3) },
7c52e0e8
L
3517 },
3518
c0f3af97 3519 /* PREFIX_VEX_5E */
7c52e0e8 3520 {
c0f3af97
L
3521 { "vdivps", { XM, Vex, EXx } },
3522 { VEX_LEN_TABLE (VEX_LEN_5E_P_1) },
3523 { "vdivpd", { XM, Vex, EXx } },
3524 { VEX_LEN_TABLE (VEX_LEN_5E_P_3) },
7c52e0e8
L
3525 },
3526
c0f3af97 3527 /* PREFIX_VEX_5F */
7c52e0e8 3528 {
c0f3af97
L
3529 { "vmaxps", { XM, Vex, EXx } },
3530 { VEX_LEN_TABLE (VEX_LEN_5F_P_1) },
3531 { "vmaxpd", { XM, Vex, EXx } },
3532 { VEX_LEN_TABLE (VEX_LEN_5F_P_3) },
7c52e0e8
L
3533 },
3534
c0f3af97 3535 /* PREFIX_VEX_60 */
7c52e0e8 3536 {
c0f3af97
L
3537 { "(bad)", { XX } },
3538 { "(bad)", { XX } },
3539 { VEX_LEN_TABLE (VEX_LEN_60_P_2) },
3540 { "(bad)", { XX } },
7c52e0e8
L
3541 },
3542
c0f3af97 3543 /* PREFIX_VEX_61 */
7c52e0e8 3544 {
c0f3af97
L
3545 { "(bad)", { XX } },
3546 { "(bad)", { XX } },
3547 { VEX_LEN_TABLE (VEX_LEN_61_P_2) },
3548 { "(bad)", { XX } },
7c52e0e8
L
3549 },
3550
c0f3af97 3551 /* PREFIX_VEX_62 */
7c52e0e8 3552 {
c0f3af97
L
3553 { "(bad)", { XX } },
3554 { "(bad)", { XX } },
3555 { VEX_LEN_TABLE (VEX_LEN_62_P_2) },
3556 { "(bad)", { XX } },
7c52e0e8
L
3557 },
3558
c0f3af97 3559 /* PREFIX_VEX_63 */
7c52e0e8 3560 {
c0f3af97
L
3561 { "(bad)", { XX } },
3562 { "(bad)", { XX } },
3563 { VEX_LEN_TABLE (VEX_LEN_63_P_2) },
3564 { "(bad)", { XX } },
7c52e0e8
L
3565 },
3566
c0f3af97 3567 /* PREFIX_VEX_64 */
7c52e0e8 3568 {
c0f3af97
L
3569 { "(bad)", { XX } },
3570 { "(bad)", { XX } },
3571 { VEX_LEN_TABLE (VEX_LEN_64_P_2) },
3572 { "(bad)", { XX } },
7c52e0e8
L
3573 },
3574
c0f3af97 3575 /* PREFIX_VEX_65 */
7c52e0e8 3576 {
c0f3af97
L
3577 { "(bad)", { XX } },
3578 { "(bad)", { XX } },
3579 { VEX_LEN_TABLE (VEX_LEN_65_P_2) },
3580 { "(bad)", { XX } },
7c52e0e8
L
3581 },
3582
c0f3af97 3583 /* PREFIX_VEX_66 */
7c52e0e8 3584 {
c0f3af97
L
3585 { "(bad)", { XX } },
3586 { "(bad)", { XX } },
3587 { VEX_LEN_TABLE (VEX_LEN_66_P_2) },
3588 { "(bad)", { XX } },
7c52e0e8 3589 },
6439fc28 3590
c0f3af97 3591 /* PREFIX_VEX_67 */
331d2d0d 3592 {
c0f3af97
L
3593 { "(bad)", { XX } },
3594 { "(bad)", { XX } },
3595 { VEX_LEN_TABLE (VEX_LEN_67_P_2) },
3596 { "(bad)", { XX } },
3597 },
3598
3599 /* PREFIX_VEX_68 */
3600 {
3601 { "(bad)", { XX } },
3602 { "(bad)", { XX } },
3603 { VEX_LEN_TABLE (VEX_LEN_68_P_2) },
3604 { "(bad)", { XX } },
3605 },
3606
3607 /* PREFIX_VEX_69 */
3608 {
3609 { "(bad)", { XX } },
3610 { "(bad)", { XX } },
3611 { VEX_LEN_TABLE (VEX_LEN_69_P_2) },
3612 { "(bad)", { XX } },
3613 },
3614
3615 /* PREFIX_VEX_6A */
3616 {
3617 { "(bad)", { XX } },
3618 { "(bad)", { XX } },
3619 { VEX_LEN_TABLE (VEX_LEN_6A_P_2) },
3620 { "(bad)", { XX } },
3621 },
3622
3623 /* PREFIX_VEX_6B */
3624 {
3625 { "(bad)", { XX } },
3626 { "(bad)", { XX } },
3627 { VEX_LEN_TABLE (VEX_LEN_6B_P_2) },
3628 { "(bad)", { XX } },
3629 },
3630
3631 /* PREFIX_VEX_6C */
3632 {
3633 { "(bad)", { XX } },
3634 { "(bad)", { XX } },
3635 { VEX_LEN_TABLE (VEX_LEN_6C_P_2) },
3636 { "(bad)", { XX } },
3637 },
3638
3639 /* PREFIX_VEX_6D */
3640 {
3641 { "(bad)", { XX } },
3642 { "(bad)", { XX } },
3643 { VEX_LEN_TABLE (VEX_LEN_6D_P_2) },
3644 { "(bad)", { XX } },
3645 },
3646
3647 /* PREFIX_VEX_6E */
3648 {
3649 { "(bad)", { XX } },
3650 { "(bad)", { XX } },
3651 { VEX_LEN_TABLE (VEX_LEN_6E_P_2) },
3652 { "(bad)", { XX } },
3653 },
3654
3655 /* PREFIX_VEX_6F */
3656 {
3657 { "(bad)", { XX } },
3658 { "vmovdqu", { XM, EXx } },
3659 { "vmovdqa", { XM, EXx } },
3660 { "(bad)", { XX } },
3661 },
3662
3663 /* PREFIX_VEX_70 */
3664 {
3665 { "(bad)", { XX } },
3666 { VEX_LEN_TABLE (VEX_LEN_70_P_1) },
3667 { VEX_LEN_TABLE (VEX_LEN_70_P_2) },
3668 { VEX_LEN_TABLE (VEX_LEN_70_P_3) },
3669 },
3670
3671 /* PREFIX_VEX_71_REG_2 */
3672 {
3673 { "(bad)", { XX } },
3674 { "(bad)", { XX } },
3675 { VEX_LEN_TABLE (VEX_LEN_71_R_2_P_2) },
3676 { "(bad)", { XX } },
3677 },
3678
3679 /* PREFIX_VEX_71_REG_4 */
3680 {
3681 { "(bad)", { XX } },
3682 { "(bad)", { XX } },
3683 { VEX_LEN_TABLE (VEX_LEN_71_R_4_P_2) },
3684 { "(bad)", { XX } },
3685 },
3686
3687 /* PREFIX_VEX_71_REG_6 */
3688 {
3689 { "(bad)", { XX } },
3690 { "(bad)", { XX } },
3691 { VEX_LEN_TABLE (VEX_LEN_71_R_6_P_2) },
3692 { "(bad)", { XX } },
3693 },
3694
3695 /* PREFIX_VEX_72_REG_2 */
3696 {
3697 { "(bad)", { XX } },
3698 { "(bad)", { XX } },
3699 { VEX_LEN_TABLE (VEX_LEN_72_R_2_P_2) },
3700 { "(bad)", { XX } },
3701 },
3702
3703 /* PREFIX_VEX_72_REG_4 */
3704 {
3705 { "(bad)", { XX } },
3706 { "(bad)", { XX } },
3707 { VEX_LEN_TABLE (VEX_LEN_72_R_4_P_2) },
3708 { "(bad)", { XX } },
3709 },
3710
3711 /* PREFIX_VEX_72_REG_6 */
3712 {
3713 { "(bad)", { XX } },
3714 { "(bad)", { XX } },
3715 { VEX_LEN_TABLE (VEX_LEN_72_R_6_P_2) },
3716 { "(bad)", { XX } },
3717 },
3718
3719 /* PREFIX_VEX_73_REG_2 */
3720 {
3721 { "(bad)", { XX } },
3722 { "(bad)", { XX } },
3723 { VEX_LEN_TABLE (VEX_LEN_73_R_2_P_2) },
3724 { "(bad)", { XX } },
3725 },
3726
3727 /* PREFIX_VEX_73_REG_3 */
3728 {
3729 { "(bad)", { XX } },
3730 { "(bad)", { XX } },
3731 { VEX_LEN_TABLE (VEX_LEN_73_R_3_P_2) },
3732 { "(bad)", { XX } },
3733 },
3734
3735 /* PREFIX_VEX_73_REG_6 */
3736 {
3737 { "(bad)", { XX } },
3738 { "(bad)", { XX } },
3739 { VEX_LEN_TABLE (VEX_LEN_73_R_6_P_2) },
3740 { "(bad)", { XX } },
3741 },
3742
3743 /* PREFIX_VEX_73_REG_7 */
3744 {
3745 { "(bad)", { XX } },
3746 { "(bad)", { XX } },
3747 { VEX_LEN_TABLE (VEX_LEN_73_R_7_P_2) },
3748 { "(bad)", { XX } },
3749 },
3750
3751 /* PREFIX_VEX_74 */
3752 {
3753 { "(bad)", { XX } },
3754 { "(bad)", { XX } },
3755 { VEX_LEN_TABLE (VEX_LEN_74_P_2) },
3756 { "(bad)", { XX } },
3757 },
3758
3759 /* PREFIX_VEX_75 */
3760 {
3761 { "(bad)", { XX } },
3762 { "(bad)", { XX } },
3763 { VEX_LEN_TABLE (VEX_LEN_75_P_2) },
3764 { "(bad)", { XX } },
3765 },
3766
3767 /* PREFIX_VEX_76 */
3768 {
3769 { "(bad)", { XX } },
3770 { "(bad)", { XX } },
3771 { VEX_LEN_TABLE (VEX_LEN_76_P_2) },
3772 { "(bad)", { XX } },
3773 },
3774
3775 /* PREFIX_VEX_77 */
3776 {
3777 { "", { VZERO } },
3778 { "(bad)", { XX } },
3779 { "(bad)", { XX } },
3780 { "(bad)", { XX } },
3781 },
3782
3783 /* PREFIX_VEX_7C */
3784 {
3785 { "(bad)", { XX } },
3786 { "(bad)", { XX } },
3787 { "vhaddpd", { XM, Vex, EXx } },
3788 { "vhaddps", { XM, Vex, EXx } },
3789 },
3790
3791 /* PREFIX_VEX_7D */
3792 {
3793 { "(bad)", { XX } },
3794 { "(bad)", { XX } },
3795 { "vhsubpd", { XM, Vex, EXx } },
3796 { "vhsubps", { XM, Vex, EXx } },
3797 },
3798
3799 /* PREFIX_VEX_7E */
3800 {
3801 { "(bad)", { XX } },
3802 { VEX_LEN_TABLE (VEX_LEN_7E_P_1) },
3803 { VEX_LEN_TABLE (VEX_LEN_7E_P_2) },
3804 { "(bad)", { XX } },
3805 },
3806
3807 /* PREFIX_VEX_7F */
3808 {
3809 { "(bad)", { XX } },
b6169b20
L
3810 { "vmovdqu", { EXxS, XM } },
3811 { "vmovdqa", { EXxS, XM } },
c0f3af97
L
3812 { "(bad)", { XX } },
3813 },
3814
3815 /* PREFIX_VEX_C2 */
3816 {
3817 { "vcmpps", { XM, Vex, EXx, VCMP } },
3818 { VEX_LEN_TABLE (VEX_LEN_C2_P_1) },
3819 { "vcmppd", { XM, Vex, EXx, VCMP } },
3820 { VEX_LEN_TABLE (VEX_LEN_C2_P_3) },
3821 },
3822
3823 /* PREFIX_VEX_C4 */
3824 {
3825 { "(bad)", { XX } },
3826 { "(bad)", { XX } },
3827 { VEX_LEN_TABLE (VEX_LEN_C4_P_2) },
3828 { "(bad)", { XX } },
3829 },
3830
3831 /* PREFIX_VEX_C5 */
3832 {
3833 { "(bad)", { XX } },
3834 { "(bad)", { XX } },
3835 { VEX_LEN_TABLE (VEX_LEN_C5_P_2) },
3836 { "(bad)", { XX } },
3837 },
3838
3839 /* PREFIX_VEX_D0 */
3840 {
3841 { "(bad)", { XX } },
3842 { "(bad)", { XX } },
3843 { "vaddsubpd", { XM, Vex, EXx } },
3844 { "vaddsubps", { XM, Vex, EXx } },
3845 },
3846
3847 /* PREFIX_VEX_D1 */
3848 {
3849 { "(bad)", { XX } },
3850 { "(bad)", { XX } },
3851 { VEX_LEN_TABLE (VEX_LEN_D1_P_2) },
3852 { "(bad)", { XX } },
3853 },
3854
3855 /* PREFIX_VEX_D2 */
3856 {
3857 { "(bad)", { XX } },
3858 { "(bad)", { XX } },
3859 { VEX_LEN_TABLE (VEX_LEN_D2_P_2) },
3860 { "(bad)", { XX } },
3861 },
3862
3863 /* PREFIX_VEX_D3 */
3864 {
3865 { "(bad)", { XX } },
3866 { "(bad)", { XX } },
3867 { VEX_LEN_TABLE (VEX_LEN_D3_P_2) },
3868 { "(bad)", { XX } },
3869 },
3870
3871 /* PREFIX_VEX_D4 */
3872 {
3873 { "(bad)", { XX } },
3874 { "(bad)", { XX } },
3875 { VEX_LEN_TABLE (VEX_LEN_D4_P_2) },
3876 { "(bad)", { XX } },
3877 },
3878
3879 /* PREFIX_VEX_D5 */
3880 {
3881 { "(bad)", { XX } },
3882 { "(bad)", { XX } },
3883 { VEX_LEN_TABLE (VEX_LEN_D5_P_2) },
3884 { "(bad)", { XX } },
3885 },
3886
3887 /* PREFIX_VEX_D6 */
3888 {
3889 { "(bad)", { XX } },
3890 { "(bad)", { XX } },
3891 { VEX_LEN_TABLE (VEX_LEN_D6_P_2) },
3892 { "(bad)", { XX } },
3893 },
3894
3895 /* PREFIX_VEX_D7 */
3896 {
3897 { "(bad)", { XX } },
3898 { "(bad)", { XX } },
3899 { MOD_TABLE (MOD_VEX_D7_PREFIX_2) },
3900 { "(bad)", { XX } },
3901 },
3902
3903 /* PREFIX_VEX_D8 */
3904 {
3905 { "(bad)", { XX } },
3906 { "(bad)", { XX } },
3907 { VEX_LEN_TABLE (VEX_LEN_D8_P_2) },
3908 { "(bad)", { XX } },
3909 },
3910
3911 /* PREFIX_VEX_D9 */
3912 {
3913 { "(bad)", { XX } },
3914 { "(bad)", { XX } },
3915 { VEX_LEN_TABLE (VEX_LEN_D9_P_2) },
3916 { "(bad)", { XX } },
3917 },
3918
3919 /* PREFIX_VEX_DA */
3920 {
3921 { "(bad)", { XX } },
3922 { "(bad)", { XX } },
3923 { VEX_LEN_TABLE (VEX_LEN_DA_P_2) },
3924 { "(bad)", { XX } },
3925 },
3926
3927 /* PREFIX_VEX_DB */
3928 {
3929 { "(bad)", { XX } },
3930 { "(bad)", { XX } },
3931 { VEX_LEN_TABLE (VEX_LEN_DB_P_2) },
3932 { "(bad)", { XX } },
3933 },
3934
3935 /* PREFIX_VEX_DC */
3936 {
3937 { "(bad)", { XX } },
3938 { "(bad)", { XX } },
3939 { VEX_LEN_TABLE (VEX_LEN_DC_P_2) },
3940 { "(bad)", { XX } },
3941 },
3942
3943 /* PREFIX_VEX_DD */
3944 {
3945 { "(bad)", { XX } },
3946 { "(bad)", { XX } },
3947 { VEX_LEN_TABLE (VEX_LEN_DD_P_2) },
3948 { "(bad)", { XX } },
3949 },
3950
3951 /* PREFIX_VEX_DE */
3952 {
3953 { "(bad)", { XX } },
3954 { "(bad)", { XX } },
3955 { VEX_LEN_TABLE (VEX_LEN_DE_P_2) },
3956 { "(bad)", { XX } },
3957 },
3958
3959 /* PREFIX_VEX_DF */
3960 {
3961 { "(bad)", { XX } },
3962 { "(bad)", { XX } },
3963 { VEX_LEN_TABLE (VEX_LEN_DF_P_2) },
3964 { "(bad)", { XX } },
3965 },
3966
3967 /* PREFIX_VEX_E0 */
3968 {
3969 { "(bad)", { XX } },
3970 { "(bad)", { XX } },
3971 { VEX_LEN_TABLE (VEX_LEN_E0_P_2) },
3972 { "(bad)", { XX } },
3973 },
3974
3975 /* PREFIX_VEX_E1 */
3976 {
3977 { "(bad)", { XX } },
3978 { "(bad)", { XX } },
3979 { VEX_LEN_TABLE (VEX_LEN_E1_P_2) },
3980 { "(bad)", { XX } },
3981 },
3982
3983 /* PREFIX_VEX_E2 */
3984 {
3985 { "(bad)", { XX } },
3986 { "(bad)", { XX } },
3987 { VEX_LEN_TABLE (VEX_LEN_E2_P_2) },
3988 { "(bad)", { XX } },
3989 },
3990
3991 /* PREFIX_VEX_E3 */
3992 {
3993 { "(bad)", { XX } },
3994 { "(bad)", { XX } },
3995 { VEX_LEN_TABLE (VEX_LEN_E3_P_2) },
3996 { "(bad)", { XX } },
3997 },
3998
3999 /* PREFIX_VEX_E4 */
4000 {
4001 { "(bad)", { XX } },
4002 { "(bad)", { XX } },
4003 { VEX_LEN_TABLE (VEX_LEN_E4_P_2) },
4004 { "(bad)", { XX } },
4005 },
4006
4007 /* PREFIX_VEX_E5 */
4008 {
4009 { "(bad)", { XX } },
4010 { "(bad)", { XX } },
4011 { VEX_LEN_TABLE (VEX_LEN_E5_P_2) },
4012 { "(bad)", { XX } },
4013 },
4014
4015 /* PREFIX_VEX_E6 */
4016 {
4017 { "(bad)", { XX } },
4018 { "vcvtdq2pd", { XM, EXxmmq } },
4019 { "vcvttpd2dq%XY", { XMM, EXx } },
4020 { "vcvtpd2dq%XY", { XMM, EXx } },
4021 },
4022
4023 /* PREFIX_VEX_E7 */
4024 {
4025 { "(bad)", { XX } },
4026 { "(bad)", { XX } },
4027 { MOD_TABLE (MOD_VEX_E7_PREFIX_2) },
4028 { "(bad)", { XX } },
4029 },
4030
4031 /* PREFIX_VEX_E8 */
4032 {
4033 { "(bad)", { XX } },
4034 { "(bad)", { XX } },
4035 { VEX_LEN_TABLE (VEX_LEN_E8_P_2) },
4036 { "(bad)", { XX } },
4037 },
4038
4039 /* PREFIX_VEX_E9 */
4040 {
4041 { "(bad)", { XX } },
4042 { "(bad)", { XX } },
4043 { VEX_LEN_TABLE (VEX_LEN_E9_P_2) },
4044 { "(bad)", { XX } },
4045 },
4046
4047 /* PREFIX_VEX_EA */
4048 {
4049 { "(bad)", { XX } },
4050 { "(bad)", { XX } },
4051 { VEX_LEN_TABLE (VEX_LEN_EA_P_2) },
4052 { "(bad)", { XX } },
4053 },
4054
4055 /* PREFIX_VEX_EB */
4056 {
4057 { "(bad)", { XX } },
4058 { "(bad)", { XX } },
4059 { VEX_LEN_TABLE (VEX_LEN_EB_P_2) },
4060 { "(bad)", { XX } },
4061 },
4062
4063 /* PREFIX_VEX_EC */
4064 {
4065 { "(bad)", { XX } },
4066 { "(bad)", { XX } },
4067 { VEX_LEN_TABLE (VEX_LEN_EC_P_2) },
4068 { "(bad)", { XX } },
4069 },
4070
4071 /* PREFIX_VEX_ED */
4072 {
4073 { "(bad)", { XX } },
4074 { "(bad)", { XX } },
4075 { VEX_LEN_TABLE (VEX_LEN_ED_P_2) },
4076 { "(bad)", { XX } },
4077 },
4078
4079 /* PREFIX_VEX_EE */
4080 {
4081 { "(bad)", { XX } },
4082 { "(bad)", { XX } },
4083 { VEX_LEN_TABLE (VEX_LEN_EE_P_2) },
4084 { "(bad)", { XX } },
4085 },
4086
4087 /* PREFIX_VEX_EF */
4088 {
4089 { "(bad)", { XX } },
4090 { "(bad)", { XX } },
4091 { VEX_LEN_TABLE (VEX_LEN_EF_P_2) },
4092 { "(bad)", { XX } },
4093 },
4094
4095 /* PREFIX_VEX_F0 */
4096 {
4097 { "(bad)", { XX } },
4098 { "(bad)", { XX } },
4099 { "(bad)", { XX } },
4100 { MOD_TABLE (MOD_VEX_F0_PREFIX_3) },
4101 },
4102
4103 /* PREFIX_VEX_F1 */
4104 {
4105 { "(bad)", { XX } },
4106 { "(bad)", { XX } },
4107 { VEX_LEN_TABLE (VEX_LEN_F1_P_2) },
4108 { "(bad)", { XX } },
4109 },
4110
4111 /* PREFIX_VEX_F2 */
4112 {
4113 { "(bad)", { XX } },
4114 { "(bad)", { XX } },
4115 { VEX_LEN_TABLE (VEX_LEN_F2_P_2) },
4116 { "(bad)", { XX } },
4117 },
4118
4119 /* PREFIX_VEX_F3 */
4120 {
4121 { "(bad)", { XX } },
4122 { "(bad)", { XX } },
4123 { VEX_LEN_TABLE (VEX_LEN_F3_P_2) },
4124 { "(bad)", { XX } },
4125 },
4126
4127 /* PREFIX_VEX_F4 */
4128 {
4129 { "(bad)", { XX } },
4130 { "(bad)", { XX } },
4131 { VEX_LEN_TABLE (VEX_LEN_F4_P_2) },
4132 { "(bad)", { XX } },
4133 },
4134
4135 /* PREFIX_VEX_F5 */
4136 {
4137 { "(bad)", { XX } },
4138 { "(bad)", { XX } },
4139 { VEX_LEN_TABLE (VEX_LEN_F5_P_2) },
4140 { "(bad)", { XX } },
4141 },
4142
4143 /* PREFIX_VEX_F6 */
4144 {
4145 { "(bad)", { XX } },
4146 { "(bad)", { XX } },
4147 { VEX_LEN_TABLE (VEX_LEN_F6_P_2) },
4148 { "(bad)", { XX } },
4149 },
4150
4151 /* PREFIX_VEX_F7 */
4152 {
4153 { "(bad)", { XX } },
4154 { "(bad)", { XX } },
4155 { VEX_LEN_TABLE (VEX_LEN_F7_P_2) },
4156 { "(bad)", { XX } },
4157 },
4158
4159 /* PREFIX_VEX_F8 */
4160 {
4161 { "(bad)", { XX } },
4162 { "(bad)", { XX } },
4163 { VEX_LEN_TABLE (VEX_LEN_F8_P_2) },
4164 { "(bad)", { XX } },
4165 },
4166
4167 /* PREFIX_VEX_F9 */
4168 {
4169 { "(bad)", { XX } },
4170 { "(bad)", { XX } },
4171 { VEX_LEN_TABLE (VEX_LEN_F9_P_2) },
4172 { "(bad)", { XX } },
4173 },
4174
4175 /* PREFIX_VEX_FA */
4176 {
4177 { "(bad)", { XX } },
4178 { "(bad)", { XX } },
4179 { VEX_LEN_TABLE (VEX_LEN_FA_P_2) },
4180 { "(bad)", { XX } },
4181 },
4182
4183 /* PREFIX_VEX_FB */
4184 {
4185 { "(bad)", { XX } },
4186 { "(bad)", { XX } },
4187 { VEX_LEN_TABLE (VEX_LEN_FB_P_2) },
4188 { "(bad)", { XX } },
4189 },
4190
4191 /* PREFIX_VEX_FC */
4192 {
4193 { "(bad)", { XX } },
4194 { "(bad)", { XX } },
4195 { VEX_LEN_TABLE (VEX_LEN_FC_P_2) },
4196 { "(bad)", { XX } },
4197 },
4198
4199 /* PREFIX_VEX_FD */
4200 {
4201 { "(bad)", { XX } },
4202 { "(bad)", { XX } },
4203 { VEX_LEN_TABLE (VEX_LEN_FD_P_2) },
4204 { "(bad)", { XX } },
4205 },
4206
4207 /* PREFIX_VEX_FE */
4208 {
4209 { "(bad)", { XX } },
4210 { "(bad)", { XX } },
4211 { VEX_LEN_TABLE (VEX_LEN_FE_P_2) },
4212 { "(bad)", { XX } },
4213 },
4214
4215 /* PREFIX_VEX_3800 */
4216 {
4217 { "(bad)", { XX } },
4218 { "(bad)", { XX } },
4219 { VEX_LEN_TABLE (VEX_LEN_3800_P_2) },
4220 { "(bad)", { XX } },
4221 },
4222
4223 /* PREFIX_VEX_3801 */
4224 {
4225 { "(bad)", { XX } },
4226 { "(bad)", { XX } },
4227 { VEX_LEN_TABLE (VEX_LEN_3801_P_2) },
4228 { "(bad)", { XX } },
4229 },
4230
4231 /* PREFIX_VEX_3802 */
4232 {
4233 { "(bad)", { XX } },
4234 { "(bad)", { XX } },
4235 { VEX_LEN_TABLE (VEX_LEN_3802_P_2) },
4236 { "(bad)", { XX } },
4237 },
4238
4239 /* PREFIX_VEX_3803 */
4240 {
4241 { "(bad)", { XX } },
4242 { "(bad)", { XX } },
4243 { VEX_LEN_TABLE (VEX_LEN_3803_P_2) },
4244 { "(bad)", { XX } },
4245 },
4246
4247 /* PREFIX_VEX_3804 */
4248 {
4249 { "(bad)", { XX } },
4250 { "(bad)", { XX } },
4251 { VEX_LEN_TABLE (VEX_LEN_3804_P_2) },
4252 { "(bad)", { XX } },
4253 },
4254
4255 /* PREFIX_VEX_3805 */
4256 {
4257 { "(bad)", { XX } },
4258 { "(bad)", { XX } },
4259 { VEX_LEN_TABLE (VEX_LEN_3805_P_2) },
4260 { "(bad)", { XX } },
4261 },
4262
4263 /* PREFIX_VEX_3806 */
4264 {
4265 { "(bad)", { XX } },
4266 { "(bad)", { XX } },
4267 { VEX_LEN_TABLE (VEX_LEN_3806_P_2) },
4268 { "(bad)", { XX } },
4269 },
4270
4271 /* PREFIX_VEX_3807 */
4272 {
4273 { "(bad)", { XX } },
4274 { "(bad)", { XX } },
4275 { VEX_LEN_TABLE (VEX_LEN_3807_P_2) },
4276 { "(bad)", { XX } },
4277 },
4278
4279 /* PREFIX_VEX_3808 */
4280 {
4281 { "(bad)", { XX } },
4282 { "(bad)", { XX } },
4283 { VEX_LEN_TABLE (VEX_LEN_3808_P_2) },
4284 { "(bad)", { XX } },
4285 },
4286
4287 /* PREFIX_VEX_3809 */
4288 {
4289 { "(bad)", { XX } },
4290 { "(bad)", { XX } },
4291 { VEX_LEN_TABLE (VEX_LEN_3809_P_2) },
4292 { "(bad)", { XX } },
4293 },
4294
4295 /* PREFIX_VEX_380A */
4296 {
4297 { "(bad)", { XX } },
4298 { "(bad)", { XX } },
4299 { VEX_LEN_TABLE (VEX_LEN_380A_P_2) },
4300 { "(bad)", { XX } },
4301 },
4302
4303 /* PREFIX_VEX_380B */
4304 {
4305 { "(bad)", { XX } },
4306 { "(bad)", { XX } },
4307 { VEX_LEN_TABLE (VEX_LEN_380B_P_2) },
4308 { "(bad)", { XX } },
4309 },
4310
4311 /* PREFIX_VEX_380C */
4312 {
4313 { "(bad)", { XX } },
4314 { "(bad)", { XX } },
4315 { "vpermilps", { XM, Vex, EXx } },
4316 { "(bad)", { XX } },
4317 },
4318
4319 /* PREFIX_VEX_380D */
4320 {
4321 { "(bad)", { XX } },
4322 { "(bad)", { XX } },
4323 { "vpermilpd", { XM, Vex, EXx } },
4324 { "(bad)", { XX } },
4325 },
4326
4327 /* PREFIX_VEX_380E */
4328 {
4329 { "(bad)", { XX } },
4330 { "(bad)", { XX } },
4331 { "vtestps", { XM, EXx } },
4332 { "(bad)", { XX } },
4333 },
4334
4335 /* PREFIX_VEX_380F */
4336 {
4337 { "(bad)", { XX } },
4338 { "(bad)", { XX } },
4339 { "vtestpd", { XM, EXx } },
4340 { "(bad)", { XX } },
4341 },
4342
4343 /* PREFIX_VEX_3817 */
4344 {
4345 { "(bad)", { XX } },
4346 { "(bad)", { XX } },
4347 { "vptest", { XM, EXx } },
4348 { "(bad)", { XX } },
4349 },
4350
4351 /* PREFIX_VEX_3818 */
4352 {
4353 { "(bad)", { XX } },
4354 { "(bad)", { XX } },
4355 { MOD_TABLE (MOD_VEX_3818_PREFIX_2) },
4356 { "(bad)", { XX } },
4357 },
4358
4359 /* PREFIX_VEX_3819 */
4360 {
4361 { "(bad)", { XX } },
4362 { "(bad)", { XX } },
4363 { MOD_TABLE (MOD_VEX_3819_PREFIX_2) },
4364 { "(bad)", { XX } },
4365 },
4366
4367 /* PREFIX_VEX_381A */
4368 {
4369 { "(bad)", { XX } },
4370 { "(bad)", { XX } },
4371 { MOD_TABLE (MOD_VEX_381A_PREFIX_2) },
4372 { "(bad)", { XX } },
4373 },
4374
4375 /* PREFIX_VEX_381C */
4376 {
4377 { "(bad)", { XX } },
4378 { "(bad)", { XX } },
4379 { VEX_LEN_TABLE (VEX_LEN_381C_P_2) },
4380 { "(bad)", { XX } },
4381 },
4382
4383 /* PREFIX_VEX_381D */
4384 {
4385 { "(bad)", { XX } },
4386 { "(bad)", { XX } },
4387 { VEX_LEN_TABLE (VEX_LEN_381D_P_2) },
4388 { "(bad)", { XX } },
4389 },
4390
4391 /* PREFIX_VEX_381E */
4392 {
4393 { "(bad)", { XX } },
4394 { "(bad)", { XX } },
4395 { VEX_LEN_TABLE (VEX_LEN_381E_P_2) },
4396 { "(bad)", { XX } },
4397 },
4398
4399 /* PREFIX_VEX_3820 */
4400 {
4401 { "(bad)", { XX } },
4402 { "(bad)", { XX } },
4403 { VEX_LEN_TABLE (VEX_LEN_3820_P_2) },
4404 { "(bad)", { XX } },
4405 },
4406
4407 /* PREFIX_VEX_3821 */
4408 {
4409 { "(bad)", { XX } },
4410 { "(bad)", { XX } },
4411 { VEX_LEN_TABLE (VEX_LEN_3821_P_2) },
4412 { "(bad)", { XX } },
4413 },
4414
4415 /* PREFIX_VEX_3822 */
4416 {
4417 { "(bad)", { XX } },
4418 { "(bad)", { XX } },
4419 { VEX_LEN_TABLE (VEX_LEN_3822_P_2) },
4420 { "(bad)", { XX } },
4421 },
4422
4423 /* PREFIX_VEX_3823 */
4424 {
4425 { "(bad)", { XX } },
4426 { "(bad)", { XX } },
4427 { VEX_LEN_TABLE (VEX_LEN_3823_P_2) },
4428 { "(bad)", { XX } },
4429 },
4430
4431 /* PREFIX_VEX_3824 */
4432 {
4433 { "(bad)", { XX } },
4434 { "(bad)", { XX } },
4435 { VEX_LEN_TABLE (VEX_LEN_3824_P_2) },
4436 { "(bad)", { XX } },
4437 },
4438
4439 /* PREFIX_VEX_3825 */
4440 {
4441 { "(bad)", { XX } },
4442 { "(bad)", { XX } },
4443 { VEX_LEN_TABLE (VEX_LEN_3825_P_2) },
4444 { "(bad)", { XX } },
4445 },
4446
4447 /* PREFIX_VEX_3828 */
4448 {
4449 { "(bad)", { XX } },
4450 { "(bad)", { XX } },
4451 { VEX_LEN_TABLE (VEX_LEN_3828_P_2) },
4452 { "(bad)", { XX } },
4453 },
4454
4455 /* PREFIX_VEX_3829 */
4456 {
4457 { "(bad)", { XX } },
4458 { "(bad)", { XX } },
4459 { VEX_LEN_TABLE (VEX_LEN_3829_P_2) },
4460 { "(bad)", { XX } },
4461 },
4462
4463 /* PREFIX_VEX_382A */
4464 {
4465 { "(bad)", { XX } },
4466 { "(bad)", { XX } },
4467 { MOD_TABLE (MOD_VEX_382A_PREFIX_2) },
4468 { "(bad)", { XX } },
4469 },
4470
4471 /* PREFIX_VEX_382B */
4472 {
4473 { "(bad)", { XX } },
4474 { "(bad)", { XX } },
4475 { VEX_LEN_TABLE (VEX_LEN_382B_P_2) },
4476 { "(bad)", { XX } },
4477 },
4478
4479 /* PREFIX_VEX_382C */
4480 {
4481 { "(bad)", { XX } },
4482 { "(bad)", { XX } },
4483 { MOD_TABLE (MOD_VEX_382C_PREFIX_2) },
4484 { "(bad)", { XX } },
4485 },
4486
4487 /* PREFIX_VEX_382D */
4488 {
4489 { "(bad)", { XX } },
4490 { "(bad)", { XX } },
4491 { MOD_TABLE (MOD_VEX_382D_PREFIX_2) },
4492 { "(bad)", { XX } },
4493 },
4494
4495 /* PREFIX_VEX_382E */
4496 {
4497 { "(bad)", { XX } },
4498 { "(bad)", { XX } },
4499 { MOD_TABLE (MOD_VEX_382E_PREFIX_2) },
4500 { "(bad)", { XX } },
4501 },
4502
4503 /* PREFIX_VEX_382F */
4504 {
4505 { "(bad)", { XX } },
4506 { "(bad)", { XX } },
4507 { MOD_TABLE (MOD_VEX_382F_PREFIX_2) },
4508 { "(bad)", { XX } },
4509 },
4510
4511 /* PREFIX_VEX_3830 */
4512 {
4513 { "(bad)", { XX } },
4514 { "(bad)", { XX } },
4515 { VEX_LEN_TABLE (VEX_LEN_3830_P_2) },
4516 { "(bad)", { XX } },
4517 },
4518
4519 /* PREFIX_VEX_3831 */
4520 {
4521 { "(bad)", { XX } },
4522 { "(bad)", { XX } },
4523 { VEX_LEN_TABLE (VEX_LEN_3831_P_2) },
4524 { "(bad)", { XX } },
4525 },
4526
4527 /* PREFIX_VEX_3832 */
4528 {
4529 { "(bad)", { XX } },
4530 { "(bad)", { XX } },
4531 { VEX_LEN_TABLE (VEX_LEN_3832_P_2) },
4532 { "(bad)", { XX } },
4533 },
4534
4535 /* PREFIX_VEX_3833 */
4536 {
4537 { "(bad)", { XX } },
4538 { "(bad)", { XX } },
4539 { VEX_LEN_TABLE (VEX_LEN_3833_P_2) },
4540 { "(bad)", { XX } },
4541 },
4542
4543 /* PREFIX_VEX_3834 */
4544 {
4545 { "(bad)", { XX } },
4546 { "(bad)", { XX } },
4547 { VEX_LEN_TABLE (VEX_LEN_3834_P_2) },
4548 { "(bad)", { XX } },
4549 },
4550
4551 /* PREFIX_VEX_3835 */
4552 {
4553 { "(bad)", { XX } },
4554 { "(bad)", { XX } },
4555 { VEX_LEN_TABLE (VEX_LEN_3835_P_2) },
4556 { "(bad)", { XX } },
4557 },
4558
4559 /* PREFIX_VEX_3837 */
4560 {
4561 { "(bad)", { XX } },
4562 { "(bad)", { XX } },
4563 { VEX_LEN_TABLE (VEX_LEN_3837_P_2) },
4564 { "(bad)", { XX } },
4565 },
4566
4567 /* PREFIX_VEX_3838 */
4568 {
4569 { "(bad)", { XX } },
4570 { "(bad)", { XX } },
4571 { VEX_LEN_TABLE (VEX_LEN_3838_P_2) },
4572 { "(bad)", { XX } },
4573 },
4574
4575 /* PREFIX_VEX_3839 */
4576 {
4577 { "(bad)", { XX } },
4578 { "(bad)", { XX } },
4579 { VEX_LEN_TABLE (VEX_LEN_3839_P_2) },
4580 { "(bad)", { XX } },
4581 },
4582
4583 /* PREFIX_VEX_383A */
4584 {
4585 { "(bad)", { XX } },
4586 { "(bad)", { XX } },
4587 { VEX_LEN_TABLE (VEX_LEN_383A_P_2) },
4588 { "(bad)", { XX } },
4589 },
4590
4591 /* PREFIX_VEX_383B */
4592 {
4593 { "(bad)", { XX } },
4594 { "(bad)", { XX } },
4595 { VEX_LEN_TABLE (VEX_LEN_383B_P_2) },
4596 { "(bad)", { XX } },
4597 },
4598
4599 /* PREFIX_VEX_383C */
4600 {
4601 { "(bad)", { XX } },
4602 { "(bad)", { XX } },
4603 { VEX_LEN_TABLE (VEX_LEN_383C_P_2) },
4604 { "(bad)", { XX } },
4605 },
4606
4607 /* PREFIX_VEX_383D */
4608 {
4609 { "(bad)", { XX } },
4610 { "(bad)", { XX } },
4611 { VEX_LEN_TABLE (VEX_LEN_383D_P_2) },
4612 { "(bad)", { XX } },
4613 },
4614
4615 /* PREFIX_VEX_383E */
4616 {
4617 { "(bad)", { XX } },
4618 { "(bad)", { XX } },
4619 { VEX_LEN_TABLE (VEX_LEN_383E_P_2) },
4620 { "(bad)", { XX } },
4621 },
4622
4623 /* PREFIX_VEX_383F */
4624 {
4625 { "(bad)", { XX } },
4626 { "(bad)", { XX } },
4627 { VEX_LEN_TABLE (VEX_LEN_383F_P_2) },
4628 { "(bad)", { XX } },
4629 },
4630
4631 /* PREFIX_VEX_3840 */
4632 {
4633 { "(bad)", { XX } },
4634 { "(bad)", { XX } },
4635 { VEX_LEN_TABLE (VEX_LEN_3840_P_2) },
4636 { "(bad)", { XX } },
4637 },
4638
4639 /* PREFIX_VEX_3841 */
4640 {
4641 { "(bad)", { XX } },
4642 { "(bad)", { XX } },
4643 { VEX_LEN_TABLE (VEX_LEN_3841_P_2) },
4644 { "(bad)", { XX } },
4645 },
4646
0bfee649 4647 /* PREFIX_VEX_3896 */
a5ff0eb2
L
4648 {
4649 { "(bad)", { XX } },
4650 { "(bad)", { XX } },
0bfee649 4651 { "vfmaddsub132p%XW", { XM, Vex, EXx } },
a5ff0eb2
L
4652 { "(bad)", { XX } },
4653 },
4654
0bfee649 4655 /* PREFIX_VEX_3897 */
a5ff0eb2
L
4656 {
4657 { "(bad)", { XX } },
4658 { "(bad)", { XX } },
0bfee649 4659 { "vfmsubadd132p%XW", { XM, Vex, EXx } },
a5ff0eb2
L
4660 { "(bad)", { XX } },
4661 },
4662
0bfee649 4663 /* PREFIX_VEX_3898 */
a5ff0eb2
L
4664 {
4665 { "(bad)", { XX } },
4666 { "(bad)", { XX } },
0bfee649 4667 { "vfmadd132p%XW", { XM, Vex, EXx } },
a5ff0eb2
L
4668 { "(bad)", { XX } },
4669 },
4670
0bfee649 4671 /* PREFIX_VEX_3899 */
a5ff0eb2
L
4672 {
4673 { "(bad)", { XX } },
4674 { "(bad)", { XX } },
0bfee649 4675 { "vfmadd132s%XW", { XM, Vex, EXVexWdq } },
a5ff0eb2
L
4676 { "(bad)", { XX } },
4677 },
4678
0bfee649 4679 /* PREFIX_VEX_389A */
a5ff0eb2
L
4680 {
4681 { "(bad)", { XX } },
4682 { "(bad)", { XX } },
0bfee649 4683 { "vfmsub132p%XW", { XM, Vex, EXx } },
a5ff0eb2
L
4684 { "(bad)", { XX } },
4685 },
4686
0bfee649 4687 /* PREFIX_VEX_389B */
c0f3af97
L
4688 {
4689 { "(bad)", { XX } },
4690 { "(bad)", { XX } },
0bfee649 4691 { "vfmsub132s%XW", { XM, Vex, EXVexWdq } },
c0f3af97
L
4692 { "(bad)", { XX } },
4693 },
4694
0bfee649 4695 /* PREFIX_VEX_389C */
c0f3af97
L
4696 {
4697 { "(bad)", { XX } },
4698 { "(bad)", { XX } },
0bfee649 4699 { "vfnmadd132p%XW", { XM, Vex, EXx } },
c0f3af97
L
4700 { "(bad)", { XX } },
4701 },
4702
0bfee649 4703 /* PREFIX_VEX_389D */
c0f3af97
L
4704 {
4705 { "(bad)", { XX } },
4706 { "(bad)", { XX } },
0bfee649 4707 { "vfnmadd132s%XW", { XM, Vex, EXVexWdq } },
c0f3af97
L
4708 { "(bad)", { XX } },
4709 },
4710
0bfee649 4711 /* PREFIX_VEX_389E */
c0f3af97
L
4712 {
4713 { "(bad)", { XX } },
4714 { "(bad)", { XX } },
0bfee649 4715 { "vfnmsub132p%XW", { XM, Vex, EXx } },
c0f3af97
L
4716 { "(bad)", { XX } },
4717 },
4718
0bfee649 4719 /* PREFIX_VEX_389F */
c0f3af97
L
4720 {
4721 { "(bad)", { XX } },
4722 { "(bad)", { XX } },
0bfee649 4723 { "vfnmsub132s%XW", { XM, Vex, EXVexWdq } },
c0f3af97
L
4724 { "(bad)", { XX } },
4725 },
4726
0bfee649 4727 /* PREFIX_VEX_38A6 */
c0f3af97
L
4728 {
4729 { "(bad)", { XX } },
4730 { "(bad)", { XX } },
0bfee649 4731 { "vfmaddsub213p%XW", { XM, Vex, EXx } },
c0f3af97
L
4732 { "(bad)", { XX } },
4733 },
4734
0bfee649 4735 /* PREFIX_VEX_38A7 */
c0f3af97
L
4736 {
4737 { "(bad)", { XX } },
4738 { "(bad)", { XX } },
0bfee649 4739 { "vfmsubadd213p%XW", { XM, Vex, EXx } },
c0f3af97
L
4740 { "(bad)", { XX } },
4741 },
4742
0bfee649 4743 /* PREFIX_VEX_38A8 */
c0f3af97
L
4744 {
4745 { "(bad)", { XX } },
4746 { "(bad)", { XX } },
0bfee649 4747 { "vfmadd213p%XW", { XM, Vex, EXx } },
c0f3af97
L
4748 { "(bad)", { XX } },
4749 },
4750
0bfee649 4751 /* PREFIX_VEX_38A9 */
c0f3af97
L
4752 {
4753 { "(bad)", { XX } },
4754 { "(bad)", { XX } },
0bfee649 4755 { "vfmadd213s%XW", { XM, Vex, EXVexWdq } },
c0f3af97
L
4756 { "(bad)", { XX } },
4757 },
4758
0bfee649 4759 /* PREFIX_VEX_38AA */
c0f3af97
L
4760 {
4761 { "(bad)", { XX } },
4762 { "(bad)", { XX } },
0bfee649 4763 { "vfmsub213p%XW", { XM, Vex, EXx } },
c0f3af97
L
4764 { "(bad)", { XX } },
4765 },
4766
0bfee649 4767 /* PREFIX_VEX_38AB */
c0f3af97
L
4768 {
4769 { "(bad)", { XX } },
4770 { "(bad)", { XX } },
0bfee649 4771 { "vfmsub213s%XW", { XM, Vex, EXVexWdq } },
c0f3af97
L
4772 { "(bad)", { XX } },
4773 },
4774
0bfee649 4775 /* PREFIX_VEX_38AC */
c0f3af97
L
4776 {
4777 { "(bad)", { XX } },
4778 { "(bad)", { XX } },
0bfee649 4779 { "vfnmadd213p%XW", { XM, Vex, EXx } },
c0f3af97
L
4780 { "(bad)", { XX } },
4781 },
4782
0bfee649 4783 /* PREFIX_VEX_38AD */
c0f3af97
L
4784 {
4785 { "(bad)", { XX } },
4786 { "(bad)", { XX } },
0bfee649 4787 { "vfnmadd213s%XW", { XM, Vex, EXVexWdq } },
c0f3af97
L
4788 { "(bad)", { XX } },
4789 },
4790
0bfee649 4791 /* PREFIX_VEX_38AE */
c0f3af97
L
4792 {
4793 { "(bad)", { XX } },
4794 { "(bad)", { XX } },
0bfee649 4795 { "vfnmsub213p%XW", { XM, Vex, EXx } },
c0f3af97
L
4796 { "(bad)", { XX } },
4797 },
4798
0bfee649 4799 /* PREFIX_VEX_38AF */
c0f3af97
L
4800 {
4801 { "(bad)", { XX } },
4802 { "(bad)", { XX } },
0bfee649 4803 { "vfnmsub213s%XW", { XM, Vex, EXVexWdq } },
c0f3af97
L
4804 { "(bad)", { XX } },
4805 },
4806
0bfee649 4807 /* PREFIX_VEX_38B6 */
c0f3af97
L
4808 {
4809 { "(bad)", { XX } },
4810 { "(bad)", { XX } },
0bfee649 4811 { "vfmaddsub231p%XW", { XM, Vex, EXx } },
c0f3af97
L
4812 { "(bad)", { XX } },
4813 },
4814
0bfee649 4815 /* PREFIX_VEX_38B7 */
c0f3af97
L
4816 {
4817 { "(bad)", { XX } },
4818 { "(bad)", { XX } },
0bfee649 4819 { "vfmsubadd231p%XW", { XM, Vex, EXx } },
c0f3af97
L
4820 { "(bad)", { XX } },
4821 },
4822
0bfee649 4823 /* PREFIX_VEX_38B8 */
c0f3af97
L
4824 {
4825 { "(bad)", { XX } },
4826 { "(bad)", { XX } },
0bfee649 4827 { "vfmadd231p%XW", { XM, Vex, EXx } },
c0f3af97
L
4828 { "(bad)", { XX } },
4829 },
4830
0bfee649 4831 /* PREFIX_VEX_38B9 */
c0f3af97
L
4832 {
4833 { "(bad)", { XX } },
4834 { "(bad)", { XX } },
0bfee649 4835 { "vfmadd231s%XW", { XM, Vex, EXVexWdq } },
c0f3af97
L
4836 { "(bad)", { XX } },
4837 },
4838
0bfee649 4839 /* PREFIX_VEX_38BA */
c0f3af97
L
4840 {
4841 { "(bad)", { XX } },
4842 { "(bad)", { XX } },
0bfee649 4843 { "vfmsub231p%XW", { XM, Vex, EXx } },
c0f3af97
L
4844 { "(bad)", { XX } },
4845 },
4846
0bfee649 4847 /* PREFIX_VEX_38BB */
c0f3af97
L
4848 {
4849 { "(bad)", { XX } },
4850 { "(bad)", { XX } },
0bfee649 4851 { "vfmsub231s%XW", { XM, Vex, EXVexWdq } },
c0f3af97
L
4852 { "(bad)", { XX } },
4853 },
4854
0bfee649 4855 /* PREFIX_VEX_38BC */
c0f3af97
L
4856 {
4857 { "(bad)", { XX } },
4858 { "(bad)", { XX } },
0bfee649 4859 { "vfnmadd231p%XW", { XM, Vex, EXx } },
c0f3af97
L
4860 { "(bad)", { XX } },
4861 },
4862
0bfee649 4863 /* PREFIX_VEX_38BD */
c0f3af97
L
4864 {
4865 { "(bad)", { XX } },
4866 { "(bad)", { XX } },
0bfee649 4867 { "vfnmadd231s%XW", { XM, Vex, EXVexWdq } },
c0f3af97
L
4868 { "(bad)", { XX } },
4869 },
4870
0bfee649 4871 /* PREFIX_VEX_38BE */
c0f3af97
L
4872 {
4873 { "(bad)", { XX } },
4874 { "(bad)", { XX } },
0bfee649 4875 { "vfnmsub231p%XW", { XM, Vex, EXx } },
c0f3af97
L
4876 { "(bad)", { XX } },
4877 },
4878
0bfee649 4879 /* PREFIX_VEX_38BF */
c0f3af97
L
4880 {
4881 { "(bad)", { XX } },
4882 { "(bad)", { XX } },
0bfee649 4883 { "vfnmsub231s%XW", { XM, Vex, EXVexWdq } },
c0f3af97
L
4884 { "(bad)", { XX } },
4885 },
4886
0bfee649 4887 /* PREFIX_VEX_38DB */
c0f3af97
L
4888 {
4889 { "(bad)", { XX } },
4890 { "(bad)", { XX } },
0bfee649 4891 { VEX_LEN_TABLE (VEX_LEN_38DB_P_2) },
c0f3af97
L
4892 { "(bad)", { XX } },
4893 },
4894
0bfee649 4895 /* PREFIX_VEX_38DC */
c0f3af97
L
4896 {
4897 { "(bad)", { XX } },
4898 { "(bad)", { XX } },
0bfee649 4899 { VEX_LEN_TABLE (VEX_LEN_38DC_P_2) },
c0f3af97
L
4900 { "(bad)", { XX } },
4901 },
4902
0bfee649 4903 /* PREFIX_VEX_38DD */
c0f3af97
L
4904 {
4905 { "(bad)", { XX } },
4906 { "(bad)", { XX } },
0bfee649 4907 { VEX_LEN_TABLE (VEX_LEN_38DD_P_2) },
c0f3af97
L
4908 { "(bad)", { XX } },
4909 },
4910
0bfee649 4911 /* PREFIX_VEX_38DE */
c0f3af97
L
4912 {
4913 { "(bad)", { XX } },
4914 { "(bad)", { XX } },
0bfee649 4915 { VEX_LEN_TABLE (VEX_LEN_38DE_P_2) },
c0f3af97
L
4916 { "(bad)", { XX } },
4917 },
4918
0bfee649 4919 /* PREFIX_VEX_38DF */
c0f3af97
L
4920 {
4921 { "(bad)", { XX } },
4922 { "(bad)", { XX } },
0bfee649 4923 { VEX_LEN_TABLE (VEX_LEN_38DF_P_2) },
c0f3af97
L
4924 { "(bad)", { XX } },
4925 },
4926
0bfee649 4927 /* PREFIX_VEX_3A04 */
c0f3af97
L
4928 {
4929 { "(bad)", { XX } },
4930 { "(bad)", { XX } },
0bfee649 4931 { "vpermilps", { XM, EXx, Ib } },
c0f3af97
L
4932 { "(bad)", { XX } },
4933 },
4934
0bfee649 4935 /* PREFIX_VEX_3A05 */
c0f3af97
L
4936 {
4937 { "(bad)", { XX } },
4938 { "(bad)", { XX } },
0bfee649 4939 { "vpermilpd", { XM, EXx, Ib } },
c0f3af97
L
4940 { "(bad)", { XX } },
4941 },
4942
0bfee649 4943 /* PREFIX_VEX_3A06 */
c0f3af97
L
4944 {
4945 { "(bad)", { XX } },
4946 { "(bad)", { XX } },
0bfee649 4947 { VEX_LEN_TABLE (VEX_LEN_3A06_P_2) },
c0f3af97
L
4948 { "(bad)", { XX } },
4949 },
4950
0bfee649 4951 /* PREFIX_VEX_3A08 */
c0f3af97
L
4952 {
4953 { "(bad)", { XX } },
4954 { "(bad)", { XX } },
0bfee649 4955 { "vroundps", { XM, EXx, Ib } },
c0f3af97
L
4956 { "(bad)", { XX } },
4957 },
4958
0bfee649 4959 /* PREFIX_VEX_3A09 */
c0f3af97
L
4960 {
4961 { "(bad)", { XX } },
4962 { "(bad)", { XX } },
0bfee649 4963 { "vroundpd", { XM, EXx, Ib } },
c0f3af97
L
4964 { "(bad)", { XX } },
4965 },
4966
0bfee649 4967 /* PREFIX_VEX_3A0A */
c0f3af97
L
4968 {
4969 { "(bad)", { XX } },
4970 { "(bad)", { XX } },
0bfee649
L
4971 { VEX_LEN_TABLE (VEX_LEN_3A0A_P_2) },
4972 { "(bad)", { XX } },
4973 },
4974
4975 /* PREFIX_VEX_3A0B */
4976 {
4977 { "(bad)", { XX } },
4978 { "(bad)", { XX } },
4979 { VEX_LEN_TABLE (VEX_LEN_3A0B_P_2) },
4980 { "(bad)", { XX } },
4981 },
4982
4983 /* PREFIX_VEX_3A0C */
4984 {
4985 { "(bad)", { XX } },
4986 { "(bad)", { XX } },
4987 { "vblendps", { XM, Vex, EXx, Ib } },
4988 { "(bad)", { XX } },
4989 },
4990
4991 /* PREFIX_VEX_3A0D */
4992 {
4993 { "(bad)", { XX } },
4994 { "(bad)", { XX } },
4995 { "vblendpd", { XM, Vex, EXx, Ib } },
c0f3af97
L
4996 { "(bad)", { XX } },
4997 },
4998
0bfee649
L
4999 /* PREFIX_VEX_3A0E */
5000 {
5001 { "(bad)", { XX } },
5002 { "(bad)", { XX } },
5003 { VEX_LEN_TABLE (VEX_LEN_3A0E_P_2) },
5004 { "(bad)", { XX } },
5005 },
5006
5007 /* PREFIX_VEX_3A0F */
5008 {
5009 { "(bad)", { XX } },
5010 { "(bad)", { XX } },
5011 { VEX_LEN_TABLE (VEX_LEN_3A0F_P_2) },
5012 { "(bad)", { XX } },
5013 },
5014
5015 /* PREFIX_VEX_3A14 */
5016 {
5017 { "(bad)", { XX } },
5018 { "(bad)", { XX } },
5019 { VEX_LEN_TABLE (VEX_LEN_3A14_P_2) },
5020 { "(bad)", { XX } },
5021 },
5022
5023 /* PREFIX_VEX_3A15 */
5024 {
5025 { "(bad)", { XX } },
5026 { "(bad)", { XX } },
5027 { VEX_LEN_TABLE (VEX_LEN_3A15_P_2) },
5028 { "(bad)", { XX } },
5029 },
5030
5031 /* PREFIX_VEX_3A16 */
c0f3af97
L
5032 {
5033 { "(bad)", { XX } },
5034 { "(bad)", { XX } },
0bfee649 5035 { VEX_LEN_TABLE (VEX_LEN_3A16_P_2) },
c0f3af97
L
5036 { "(bad)", { XX } },
5037 },
5038
0bfee649 5039 /* PREFIX_VEX_3A17 */
c0f3af97
L
5040 {
5041 { "(bad)", { XX } },
5042 { "(bad)", { XX } },
0bfee649 5043 { VEX_LEN_TABLE (VEX_LEN_3A17_P_2) },
c0f3af97
L
5044 { "(bad)", { XX } },
5045 },
5046
0bfee649 5047 /* PREFIX_VEX_3A18 */
c0f3af97
L
5048 {
5049 { "(bad)", { XX } },
5050 { "(bad)", { XX } },
0bfee649 5051 { VEX_LEN_TABLE (VEX_LEN_3A18_P_2) },
c0f3af97
L
5052 { "(bad)", { XX } },
5053 },
5054
0bfee649 5055 /* PREFIX_VEX_3A19 */
c0f3af97
L
5056 {
5057 { "(bad)", { XX } },
5058 { "(bad)", { XX } },
0bfee649 5059 { VEX_LEN_TABLE (VEX_LEN_3A19_P_2) },
c0f3af97
L
5060 { "(bad)", { XX } },
5061 },
5062
0bfee649 5063 /* PREFIX_VEX_3A20 */
c0f3af97
L
5064 {
5065 { "(bad)", { XX } },
5066 { "(bad)", { XX } },
0bfee649 5067 { VEX_LEN_TABLE (VEX_LEN_3A20_P_2) },
c0f3af97
L
5068 { "(bad)", { XX } },
5069 },
5070
0bfee649 5071 /* PREFIX_VEX_3A21 */
c0f3af97
L
5072 {
5073 { "(bad)", { XX } },
5074 { "(bad)", { XX } },
0bfee649 5075 { VEX_LEN_TABLE (VEX_LEN_3A21_P_2) },
c0f3af97
L
5076 { "(bad)", { XX } },
5077 },
5078
0bfee649
L
5079 /* PREFIX_VEX_3A22 */
5080 {
5081 { "(bad)", { XX } },
5082 { "(bad)", { XX } },
5083 { VEX_LEN_TABLE (VEX_LEN_3A22_P_2) },
5084 { "(bad)", { XX } },
5085 },
5086
5087 /* PREFIX_VEX_3A40 */
c0f3af97
L
5088 {
5089 { "(bad)", { XX } },
5090 { "(bad)", { XX } },
0bfee649 5091 { "vdpps", { XM, Vex, EXx, Ib } },
c0f3af97
L
5092 { "(bad)", { XX } },
5093 },
5094
0bfee649 5095 /* PREFIX_VEX_3A41 */
c0f3af97
L
5096 {
5097 { "(bad)", { XX } },
5098 { "(bad)", { XX } },
0bfee649 5099 { VEX_LEN_TABLE (VEX_LEN_3A41_P_2) },
c0f3af97
L
5100 { "(bad)", { XX } },
5101 },
5102
0bfee649 5103 /* PREFIX_VEX_3A42 */
c0f3af97
L
5104 {
5105 { "(bad)", { XX } },
5106 { "(bad)", { XX } },
0bfee649 5107 { VEX_LEN_TABLE (VEX_LEN_3A42_P_2) },
c0f3af97
L
5108 { "(bad)", { XX } },
5109 },
5110
ce2f5b3c
L
5111 /* PREFIX_VEX_3A44 */
5112 {
5113 { "(bad)", { XX } },
5114 { "(bad)", { XX } },
5115 { VEX_LEN_TABLE (VEX_LEN_3A44_P_2) },
5116 { "(bad)", { XX } },
5117 },
5118
0bfee649 5119 /* PREFIX_VEX_3A4A */
c0f3af97
L
5120 {
5121 { "(bad)", { XX } },
5122 { "(bad)", { XX } },
0bfee649 5123 { "vblendvps", { XM, Vex, EXx, XMVexI4 } },
c0f3af97
L
5124 { "(bad)", { XX } },
5125 },
5126
0bfee649 5127 /* PREFIX_VEX_3A4B */
c0f3af97
L
5128 {
5129 { "(bad)", { XX } },
5130 { "(bad)", { XX } },
0bfee649 5131 { "vblendvpd", { XM, Vex, EXx, XMVexI4 } },
c0f3af97
L
5132 { "(bad)", { XX } },
5133 },
5134
0bfee649 5135 /* PREFIX_VEX_3A4C */
c0f3af97
L
5136 {
5137 { "(bad)", { XX } },
5138 { "(bad)", { XX } },
0bfee649 5139 { VEX_LEN_TABLE (VEX_LEN_3A4C_P_2) },
c0f3af97
L
5140 { "(bad)", { XX } },
5141 },
5142
922d8de8
DR
5143 /* PREFIX_VEX_3A5C */
5144 {
5145 { "(bad)", { XX } },
5146 { "(bad)", { XX } },
206c2556 5147 { "vfmaddsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
922d8de8
DR
5148 { "(bad)", { XX } },
5149 },
5150
5151 /* PREFIX_VEX_3A5D */
5152 {
5153 { "(bad)", { XX } },
5154 { "(bad)", { XX } },
206c2556 5155 { "vfmaddsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
922d8de8
DR
5156 { "(bad)", { XX } },
5157 },
5158
5159 /* PREFIX_VEX_3A5E */
5160 {
5161 { "(bad)", { XX } },
5162 { "(bad)", { XX } },
206c2556 5163 { "vfmsubaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
922d8de8
DR
5164 { "(bad)", { XX } },
5165 },
5166
5167 /* PREFIX_VEX_3A5F */
5168 {
5169 { "(bad)", { XX } },
5170 { "(bad)", { XX } },
206c2556 5171 { "vfmsubaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
922d8de8
DR
5172 { "(bad)", { XX } },
5173 },
5174
0bfee649 5175 /* PREFIX_VEX_3A60 */
c0f3af97
L
5176 {
5177 { "(bad)", { XX } },
5178 { "(bad)", { XX } },
0bfee649 5179 { VEX_LEN_TABLE (VEX_LEN_3A60_P_2) },
c0f3af97
L
5180 { "(bad)", { XX } },
5181 },
5182
0bfee649 5183 /* PREFIX_VEX_3A61 */
c0f3af97
L
5184 {
5185 { "(bad)", { XX } },
5186 { "(bad)", { XX } },
0bfee649 5187 { VEX_LEN_TABLE (VEX_LEN_3A61_P_2) },
c0f3af97
L
5188 { "(bad)", { XX } },
5189 },
5190
0bfee649 5191 /* PREFIX_VEX_3A62 */
c0f3af97
L
5192 {
5193 { "(bad)", { XX } },
5194 { "(bad)", { XX } },
0bfee649 5195 { VEX_LEN_TABLE (VEX_LEN_3A62_P_2) },
c0f3af97
L
5196 { "(bad)", { XX } },
5197 },
5198
0bfee649 5199 /* PREFIX_VEX_3A63 */
c0f3af97
L
5200 {
5201 { "(bad)", { XX } },
5202 { "(bad)", { XX } },
0bfee649 5203 { VEX_LEN_TABLE (VEX_LEN_3A63_P_2) },
c0f3af97
L
5204 { "(bad)", { XX } },
5205 },
a5ff0eb2 5206
922d8de8
DR
5207 /* PREFIX_VEX_3A68 */
5208 {
5209 { "(bad)", { XX } },
5210 { "(bad)", { XX } },
206c2556 5211 { "vfmaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
922d8de8
DR
5212 { "(bad)", { XX } },
5213 },
5214
5215 /* PREFIX_VEX_3A69 */
5216 {
5217 { "(bad)", { XX } },
5218 { "(bad)", { XX } },
206c2556 5219 { "vfmaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
922d8de8
DR
5220 { "(bad)", { XX } },
5221 },
5222
5223 /* PREFIX_VEX_3A6A */
5224 {
5225 { "(bad)", { XX } },
5226 { "(bad)", { XX } },
5227 { VEX_LEN_TABLE (VEX_LEN_3A6A_P_2) },
5228 { "(bad)", { XX } },
5229 },
5230
5231 /* PREFIX_VEX_3A6B */
5232 {
5233 { "(bad)", { XX } },
5234 { "(bad)", { XX } },
5235 { VEX_LEN_TABLE (VEX_LEN_3A6B_P_2) },
5236 { "(bad)", { XX } },
5237 },
5238
5239 /* PREFIX_VEX_3A6C */
5240 {
5241 { "(bad)", { XX } },
5242 { "(bad)", { XX } },
206c2556 5243 { "vfmsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
922d8de8
DR
5244 { "(bad)", { XX } },
5245 },
5246
5247 /* PREFIX_VEX_3A6D */
5248 {
5249 { "(bad)", { XX } },
5250 { "(bad)", { XX } },
206c2556 5251 { "vfmsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
922d8de8
DR
5252 { "(bad)", { XX } },
5253 },
5254
5255 /* PREFIX_VEX_3A6E */
5256 {
5257 { "(bad)", { XX } },
5258 { "(bad)", { XX } },
5259 { VEX_LEN_TABLE (VEX_LEN_3A6E_P_2) },
5260 { "(bad)", { XX } },
5261 },
5262
5263 /* PREFIX_VEX_3A6F */
5264 {
5265 { "(bad)", { XX } },
5266 { "(bad)", { XX } },
5267 { VEX_LEN_TABLE (VEX_LEN_3A6F_P_2) },
5268 { "(bad)", { XX } },
5269 },
5270
5271 /* PREFIX_VEX_3A78 */
5272 {
5273 { "(bad)", { XX } },
5274 { "(bad)", { XX } },
206c2556 5275 { "vfnmaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
922d8de8
DR
5276 { "(bad)", { XX } },
5277 },
5278
5279 /* PREFIX_VEX_3A79 */
5280 {
5281 { "(bad)", { XX } },
5282 { "(bad)", { XX } },
206c2556 5283 { "vfnmaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
922d8de8
DR
5284 { "(bad)", { XX } },
5285 },
5286
5287 /* PREFIX_VEX_3A7A */
5288 {
5289 { "(bad)", { XX } },
5290 { "(bad)", { XX } },
5291 { VEX_LEN_TABLE (VEX_LEN_3A7A_P_2) },
5292 { "(bad)", { XX } },
5293 },
5294
5295 /* PREFIX_VEX_3A7B */
5296 {
5297 { "(bad)", { XX } },
5298 { "(bad)", { XX } },
5299 { VEX_LEN_TABLE (VEX_LEN_3A7B_P_2) },
5300 { "(bad)", { XX } },
5301 },
5302
5303 /* PREFIX_VEX_3A7C */
5304 {
5305 { "(bad)", { XX } },
5306 { "(bad)", { XX } },
206c2556 5307 { "vfnmsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
922d8de8
DR
5308 { "(bad)", { XX } },
5309 },
5310
5311 /* PREFIX_VEX_3A7D */
5312 {
5313 { "(bad)", { XX } },
5314 { "(bad)", { XX } },
206c2556 5315 { "vfnmsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
922d8de8
DR
5316 { "(bad)", { XX } },
5317 },
5318
5319 /* PREFIX_VEX_3A7E */
5320 {
5321 { "(bad)", { XX } },
5322 { "(bad)", { XX } },
5323 { VEX_LEN_TABLE (VEX_LEN_3A7E_P_2) },
5324 { "(bad)", { XX } },
5325 },
5326
5327 /* PREFIX_VEX_3A7F */
5328 {
5329 { "(bad)", { XX } },
5330 { "(bad)", { XX } },
5331 { VEX_LEN_TABLE (VEX_LEN_3A7F_P_2) },
5332 { "(bad)", { XX } },
5333 },
5334
a5ff0eb2
L
5335 /* PREFIX_VEX_3ADF */
5336 {
5337 { "(bad)", { XX } },
5338 { "(bad)", { XX } },
5339 { VEX_LEN_TABLE (VEX_LEN_3ADF_P_2) },
5340 { "(bad)", { XX } },
5341 },
c0f3af97
L
5342};
5343
5344static const struct dis386 x86_64_table[][2] = {
5345 /* X86_64_06 */
5346 {
5347 { "push{T|}", { es } },
5348 { "(bad)", { XX } },
5349 },
5350
5351 /* X86_64_07 */
5352 {
5353 { "pop{T|}", { es } },
5354 { "(bad)", { XX } },
5355 },
5356
5357 /* X86_64_0D */
5358 {
5359 { "push{T|}", { cs } },
5360 { "(bad)", { XX } },
5361 },
5362
5363 /* X86_64_16 */
5364 {
5365 { "push{T|}", { ss } },
5366 { "(bad)", { XX } },
5367 },
5368
5369 /* X86_64_17 */
5370 {
5371 { "pop{T|}", { ss } },
5372 { "(bad)", { XX } },
5373 },
5374
5375 /* X86_64_1E */
5376 {
5377 { "push{T|}", { ds } },
5378 { "(bad)", { XX } },
5379 },
5380
5381 /* X86_64_1F */
5382 {
5383 { "pop{T|}", { ds } },
5384 { "(bad)", { XX } },
5385 },
5386
5387 /* X86_64_27 */
5388 {
5389 { "daa", { XX } },
5390 { "(bad)", { XX } },
5391 },
5392
5393 /* X86_64_2F */
5394 {
5395 { "das", { XX } },
5396 { "(bad)", { XX } },
5397 },
5398
5399 /* X86_64_37 */
5400 {
5401 { "aaa", { XX } },
5402 { "(bad)", { XX } },
5403 },
5404
5405 /* X86_64_3F */
5406 {
5407 { "aas", { XX } },
5408 { "(bad)", { XX } },
5409 },
5410
5411 /* X86_64_60 */
5412 {
5413 { "pusha{P|}", { XX } },
5414 { "(bad)", { XX } },
5415 },
5416
5417 /* X86_64_61 */
5418 {
5419 { "popa{P|}", { XX } },
5420 { "(bad)", { XX } },
5421 },
5422
5423 /* X86_64_62 */
5424 {
5425 { MOD_TABLE (MOD_62_32BIT) },
5426 { "(bad)", { XX } },
5427 },
5428
5429 /* X86_64_63 */
5430 {
5431 { "arpl", { Ew, Gw } },
5432 { "movs{lq|xd}", { Gv, Ed } },
5433 },
5434
5435 /* X86_64_6D */
5436 {
5437 { "ins{R|}", { Yzr, indirDX } },
5438 { "ins{G|}", { Yzr, indirDX } },
5439 },
5440
5441 /* X86_64_6F */
5442 {
5443 { "outs{R|}", { indirDXr, Xz } },
5444 { "outs{G|}", { indirDXr, Xz } },
5445 },
5446
5447 /* X86_64_9A */
5448 {
5449 { "Jcall{T|}", { Ap } },
5450 { "(bad)", { XX } },
5451 },
5452
5453 /* X86_64_C4 */
5454 {
5455 { MOD_TABLE (MOD_C4_32BIT) },
5456 { VEX_C4_TABLE (VEX_0F) },
5457 },
5458
5459 /* X86_64_C5 */
5460 {
5461 { MOD_TABLE (MOD_C5_32BIT) },
5462 { VEX_C5_TABLE (VEX_0F) },
5463 },
5464
5465 /* X86_64_CE */
5466 {
5467 { "into", { XX } },
5468 { "(bad)", { XX } },
5469 },
5470
5471 /* X86_64_D4 */
5472 {
5473 { "aam", { sIb } },
5474 { "(bad)", { XX } },
5475 },
5476
5477 /* X86_64_D5 */
5478 {
5479 { "aad", { sIb } },
5480 { "(bad)", { XX } },
5481 },
5482
5483 /* X86_64_EA */
5484 {
5485 { "Jjmp{T|}", { Ap } },
5486 { "(bad)", { XX } },
5487 },
5488
5489 /* X86_64_0F01_REG_0 */
5490 {
5491 { "sgdt{Q|IQ}", { M } },
5492 { "sgdt", { M } },
5493 },
5494
5495 /* X86_64_0F01_REG_1 */
5496 {
5497 { "sidt{Q|IQ}", { M } },
5498 { "sidt", { M } },
5499 },
5500
5501 /* X86_64_0F01_REG_2 */
5502 {
5503 { "lgdt{Q|Q}", { M } },
5504 { "lgdt", { M } },
5505 },
5506
5507 /* X86_64_0F01_REG_3 */
5508 {
5509 { "lidt{Q|Q}", { M } },
5510 { "lidt", { M } },
5511 },
5512};
5513
5514static const struct dis386 three_byte_table[][256] = {
c1e679ec
DR
5515
5516 /* THREE_BYTE_0F38 */
c0f3af97
L
5517 {
5518 /* 00 */
c1e679ec
DR
5519 { "pshufb", { MX, EM } },
5520 { "phaddw", { MX, EM } },
5521 { "phaddd", { MX, EM } },
5522 { "phaddsw", { MX, EM } },
5523 { "pmaddubsw", { MX, EM } },
5524 { "phsubw", { MX, EM } },
5525 { "phsubd", { MX, EM } },
5526 { "phsubsw", { MX, EM } },
c0f3af97 5527 /* 08 */
c1e679ec
DR
5528 { "psignb", { MX, EM } },
5529 { "psignw", { MX, EM } },
5530 { "psignd", { MX, EM } },
5531 { "pmulhrsw", { MX, EM } },
c0f3af97
L
5532 { "(bad)", { XX } },
5533 { "(bad)", { XX } },
5534 { "(bad)", { XX } },
5535 { "(bad)", { XX } },
f88c9eb0
SP
5536 /* 10 */
5537 { PREFIX_TABLE (PREFIX_0F3810) },
5538 { "(bad)", { XX } },
5539 { "(bad)", { XX } },
5540 { "(bad)", { XX } },
5541 { PREFIX_TABLE (PREFIX_0F3814) },
5542 { PREFIX_TABLE (PREFIX_0F3815) },
5543 { "(bad)", { XX } },
5544 { PREFIX_TABLE (PREFIX_0F3817) },
5545 /* 18 */
5546 { "(bad)", { XX } },
5547 { "(bad)", { XX } },
5548 { "(bad)", { XX } },
5549 { "(bad)", { XX } },
5550 { "pabsb", { MX, EM } },
5551 { "pabsw", { MX, EM } },
5552 { "pabsd", { MX, EM } },
5553 { "(bad)", { XX } },
5554 /* 20 */
5555 { PREFIX_TABLE (PREFIX_0F3820) },
5556 { PREFIX_TABLE (PREFIX_0F3821) },
5557 { PREFIX_TABLE (PREFIX_0F3822) },
5558 { PREFIX_TABLE (PREFIX_0F3823) },
5559 { PREFIX_TABLE (PREFIX_0F3824) },
5560 { PREFIX_TABLE (PREFIX_0F3825) },
5561 { "(bad)", { XX } },
5562 { "(bad)", { XX } },
5563 /* 28 */
5564 { PREFIX_TABLE (PREFIX_0F3828) },
5565 { PREFIX_TABLE (PREFIX_0F3829) },
5566 { PREFIX_TABLE (PREFIX_0F382A) },
5567 { PREFIX_TABLE (PREFIX_0F382B) },
5568 { "(bad)", { XX } },
5569 { "(bad)", { XX } },
5570 { "(bad)", { XX } },
5571 { "(bad)", { XX } },
5572 /* 30 */
5573 { PREFIX_TABLE (PREFIX_0F3830) },
5574 { PREFIX_TABLE (PREFIX_0F3831) },
5575 { PREFIX_TABLE (PREFIX_0F3832) },
5576 { PREFIX_TABLE (PREFIX_0F3833) },
5577 { PREFIX_TABLE (PREFIX_0F3834) },
5578 { PREFIX_TABLE (PREFIX_0F3835) },
5579 { "(bad)", { XX } },
5580 { PREFIX_TABLE (PREFIX_0F3837) },
5581 /* 38 */
5582 { PREFIX_TABLE (PREFIX_0F3838) },
5583 { PREFIX_TABLE (PREFIX_0F3839) },
5584 { PREFIX_TABLE (PREFIX_0F383A) },
5585 { PREFIX_TABLE (PREFIX_0F383B) },
5586 { PREFIX_TABLE (PREFIX_0F383C) },
5587 { PREFIX_TABLE (PREFIX_0F383D) },
5588 { PREFIX_TABLE (PREFIX_0F383E) },
5589 { PREFIX_TABLE (PREFIX_0F383F) },
5590 /* 40 */
5591 { PREFIX_TABLE (PREFIX_0F3840) },
5592 { PREFIX_TABLE (PREFIX_0F3841) },
5593 { "(bad)", { XX } },
5594 { "(bad)", { XX } },
5595 { "(bad)", { XX } },
5596 { "(bad)", { XX } },
5597 { "(bad)", { XX } },
5598 { "(bad)", { XX } },
5599 /* 48 */
5600 { "(bad)", { XX } },
5601 { "(bad)", { XX } },
5602 { "(bad)", { XX } },
5603 { "(bad)", { XX } },
5604 { "(bad)", { XX } },
5605 { "(bad)", { XX } },
5606 { "(bad)", { XX } },
5607 { "(bad)", { XX } },
5608 /* 50 */
5609 { "(bad)", { XX } },
5610 { "(bad)", { XX } },
5611 { "(bad)", { XX } },
5612 { "(bad)", { XX } },
5613 { "(bad)", { XX } },
5614 { "(bad)", { XX } },
5615 { "(bad)", { XX } },
5616 { "(bad)", { XX } },
5617 /* 58 */
5618 { "(bad)", { XX } },
5619 { "(bad)", { XX } },
5620 { "(bad)", { XX } },
5621 { "(bad)", { XX } },
5622 { "(bad)", { XX } },
5623 { "(bad)", { XX } },
5624 { "(bad)", { XX } },
5625 { "(bad)", { XX } },
5626 /* 60 */
5627 { "(bad)", { XX } },
5628 { "(bad)", { XX } },
5629 { "(bad)", { XX } },
5630 { "(bad)", { XX } },
5631 { "(bad)", { XX } },
5632 { "(bad)", { XX } },
5633 { "(bad)", { XX } },
5634 { "(bad)", { XX } },
5635 /* 68 */
5636 { "(bad)", { XX } },
5637 { "(bad)", { XX } },
5638 { "(bad)", { XX } },
5639 { "(bad)", { XX } },
5640 { "(bad)", { XX } },
5641 { "(bad)", { XX } },
5642 { "(bad)", { XX } },
5643 { "(bad)", { XX } },
5644 /* 70 */
5645 { "(bad)", { XX } },
5646 { "(bad)", { XX } },
5647 { "(bad)", { XX } },
5648 { "(bad)", { XX } },
5649 { "(bad)", { XX } },
5650 { "(bad)", { XX } },
5651 { "(bad)", { XX } },
5652 { "(bad)", { XX } },
5653 /* 78 */
5654 { "(bad)", { XX } },
5655 { "(bad)", { XX } },
5656 { "(bad)", { XX } },
5657 { "(bad)", { XX } },
5658 { "(bad)", { XX } },
5659 { "(bad)", { XX } },
5660 { "(bad)", { XX } },
5661 { "(bad)", { XX } },
5662 /* 80 */
5663 { PREFIX_TABLE (PREFIX_0F3880) },
5664 { PREFIX_TABLE (PREFIX_0F3881) },
5665 { "(bad)", { XX } },
5666 { "(bad)", { XX } },
5667 { "(bad)", { XX } },
5668 { "(bad)", { XX } },
5669 { "(bad)", { XX } },
5670 { "(bad)", { XX } },
5671 /* 88 */
5672 { "(bad)", { XX } },
5673 { "(bad)", { XX } },
5674 { "(bad)", { XX } },
5675 { "(bad)", { XX } },
5676 { "(bad)", { XX } },
5677 { "(bad)", { XX } },
5678 { "(bad)", { XX } },
5679 { "(bad)", { XX } },
5680 /* 90 */
5681 { "(bad)", { XX } },
5682 { "(bad)", { XX } },
5683 { "(bad)", { XX } },
5684 { "(bad)", { XX } },
5685 { "(bad)", { XX } },
5686 { "(bad)", { XX } },
5687 { "(bad)", { XX } },
5688 { "(bad)", { XX } },
5689 /* 98 */
5690 { "(bad)", { XX } },
5691 { "(bad)", { XX } },
5692 { "(bad)", { XX } },
5693 { "(bad)", { XX } },
5694 { "(bad)", { XX } },
5695 { "(bad)", { XX } },
5696 { "(bad)", { XX } },
5697 { "(bad)", { XX } },
5698 /* a0 */
5699 { "(bad)", { XX } },
5700 { "(bad)", { XX } },
5701 { "(bad)", { XX } },
5702 { "(bad)", { XX } },
5703 { "(bad)", { XX } },
5704 { "(bad)", { XX } },
5705 { "(bad)", { XX } },
5706 { "(bad)", { XX } },
5707 /* a8 */
5708 { "(bad)", { XX } },
5709 { "(bad)", { XX } },
5710 { "(bad)", { XX } },
5711 { "(bad)", { XX } },
5712 { "(bad)", { XX } },
5713 { "(bad)", { XX } },
5714 { "(bad)", { XX } },
5715 { "(bad)", { XX } },
5716 /* b0 */
5717 { "(bad)", { XX } },
5718 { "(bad)", { XX } },
5719 { "(bad)", { XX } },
5720 { "(bad)", { XX } },
5721 { "(bad)", { XX } },
5722 { "(bad)", { XX } },
5723 { "(bad)", { XX } },
5724 { "(bad)", { XX } },
5725 /* b8 */
5726 { "(bad)", { XX } },
5727 { "(bad)", { XX } },
5728 { "(bad)", { XX } },
5729 { "(bad)", { XX } },
5730 { "(bad)", { XX } },
5731 { "(bad)", { XX } },
5732 { "(bad)", { XX } },
5733 { "(bad)", { XX } },
5734 /* c0 */
5735 { "(bad)", { XX } },
5736 { "(bad)", { XX } },
5737 { "(bad)", { XX } },
5738 { "(bad)", { XX } },
5739 { "(bad)", { XX } },
5740 { "(bad)", { XX } },
5741 { "(bad)", { XX } },
5742 { "(bad)", { XX } },
5743 /* c8 */
5744 { "(bad)", { XX } },
5745 { "(bad)", { XX } },
5746 { "(bad)", { XX } },
5747 { "(bad)", { XX } },
5748 { "(bad)", { XX } },
5749 { "(bad)", { XX } },
5750 { "(bad)", { XX } },
5751 { "(bad)", { XX } },
5752 /* d0 */
5753 { "(bad)", { XX } },
5754 { "(bad)", { XX } },
5755 { "(bad)", { XX } },
5756 { "(bad)", { XX } },
5757 { "(bad)", { XX } },
5758 { "(bad)", { XX } },
5759 { "(bad)", { XX } },
5760 { "(bad)", { XX } },
5761 /* d8 */
5762 { "(bad)", { XX } },
5763 { "(bad)", { XX } },
5764 { "(bad)", { XX } },
5765 { PREFIX_TABLE (PREFIX_0F38DB) },
5766 { PREFIX_TABLE (PREFIX_0F38DC) },
5767 { PREFIX_TABLE (PREFIX_0F38DD) },
5768 { PREFIX_TABLE (PREFIX_0F38DE) },
5769 { PREFIX_TABLE (PREFIX_0F38DF) },
5770 /* e0 */
5771 { "(bad)", { XX } },
5772 { "(bad)", { XX } },
5773 { "(bad)", { XX } },
5774 { "(bad)", { XX } },
5775 { "(bad)", { XX } },
5776 { "(bad)", { XX } },
5777 { "(bad)", { XX } },
5778 { "(bad)", { XX } },
5779 /* e8 */
5780 { "(bad)", { XX } },
5781 { "(bad)", { XX } },
5782 { "(bad)", { XX } },
5783 { "(bad)", { XX } },
5784 { "(bad)", { XX } },
5785 { "(bad)", { XX } },
5786 { "(bad)", { XX } },
5787 { "(bad)", { XX } },
5788 /* f0 */
5789 { PREFIX_TABLE (PREFIX_0F38F0) },
5790 { PREFIX_TABLE (PREFIX_0F38F1) },
5791 { "(bad)", { XX } },
5792 { "(bad)", { XX } },
5793 { "(bad)", { XX } },
5794 { "(bad)", { XX } },
5795 { "(bad)", { XX } },
5796 { "(bad)", { XX } },
5797 /* f8 */
5798 { "(bad)", { XX } },
5799 { "(bad)", { XX } },
5800 { "(bad)", { XX } },
5801 { "(bad)", { XX } },
5802 { "(bad)", { XX } },
5803 { "(bad)", { XX } },
5804 { "(bad)", { XX } },
5805 { "(bad)", { XX } },
5806 },
5807 /* THREE_BYTE_0F3A */
5808 {
5809 /* 00 */
5810 { "(bad)", { XX } },
5811 { "(bad)", { XX } },
5812 { "(bad)", { XX } },
5813 { "(bad)", { XX } },
5814 { "(bad)", { XX } },
5815 { "(bad)", { XX } },
5816 { "(bad)", { XX } },
5817 { "(bad)", { XX } },
5818 /* 08 */
5819 { PREFIX_TABLE (PREFIX_0F3A08) },
5820 { PREFIX_TABLE (PREFIX_0F3A09) },
5821 { PREFIX_TABLE (PREFIX_0F3A0A) },
5822 { PREFIX_TABLE (PREFIX_0F3A0B) },
5823 { PREFIX_TABLE (PREFIX_0F3A0C) },
5824 { PREFIX_TABLE (PREFIX_0F3A0D) },
5825 { PREFIX_TABLE (PREFIX_0F3A0E) },
5826 { "palignr", { MX, EM, Ib } },
5827 /* 10 */
5828 { "(bad)", { XX } },
5829 { "(bad)", { XX } },
5830 { "(bad)", { XX } },
5831 { "(bad)", { XX } },
5832 { PREFIX_TABLE (PREFIX_0F3A14) },
5833 { PREFIX_TABLE (PREFIX_0F3A15) },
5834 { PREFIX_TABLE (PREFIX_0F3A16) },
5835 { PREFIX_TABLE (PREFIX_0F3A17) },
5836 /* 18 */
5837 { "(bad)", { XX } },
5838 { "(bad)", { XX } },
5839 { "(bad)", { XX } },
5840 { "(bad)", { XX } },
5841 { "(bad)", { XX } },
5842 { "(bad)", { XX } },
5843 { "(bad)", { XX } },
5844 { "(bad)", { XX } },
5845 /* 20 */
5846 { PREFIX_TABLE (PREFIX_0F3A20) },
5847 { PREFIX_TABLE (PREFIX_0F3A21) },
5848 { PREFIX_TABLE (PREFIX_0F3A22) },
5849 { "(bad)", { XX } },
5850 { "(bad)", { XX } },
5851 { "(bad)", { XX } },
5852 { "(bad)", { XX } },
5853 { "(bad)", { XX } },
5854 /* 28 */
5855 { "(bad)", { XX } },
5856 { "(bad)", { XX } },
5857 { "(bad)", { XX } },
5858 { "(bad)", { XX } },
5859 { "(bad)", { XX } },
5860 { "(bad)", { XX } },
5861 { "(bad)", { XX } },
5862 { "(bad)", { XX } },
5863 /* 30 */
5864 { "(bad)", { XX } },
5865 { "(bad)", { XX } },
5866 { "(bad)", { XX } },
5867 { "(bad)", { XX } },
5868 { "(bad)", { XX } },
5869 { "(bad)", { XX } },
5870 { "(bad)", { XX } },
5871 { "(bad)", { XX } },
5872 /* 38 */
5873 { "(bad)", { XX } },
5874 { "(bad)", { XX } },
5875 { "(bad)", { XX } },
5876 { "(bad)", { XX } },
5877 { "(bad)", { XX } },
5878 { "(bad)", { XX } },
5879 { "(bad)", { XX } },
5880 { "(bad)", { XX } },
5881 /* 40 */
5882 { PREFIX_TABLE (PREFIX_0F3A40) },
5883 { PREFIX_TABLE (PREFIX_0F3A41) },
5884 { PREFIX_TABLE (PREFIX_0F3A42) },
5885 { "(bad)", { XX } },
5886 { PREFIX_TABLE (PREFIX_0F3A44) },
5887 { "(bad)", { XX } },
5888 { "(bad)", { XX } },
5889 { "(bad)", { XX } },
5890 /* 48 */
5891 { "(bad)", { XX } },
5892 { "(bad)", { XX } },
5893 { "(bad)", { XX } },
5894 { "(bad)", { XX } },
5895 { "(bad)", { XX } },
5896 { "(bad)", { XX } },
5897 { "(bad)", { XX } },
5898 { "(bad)", { XX } },
5899 /* 50 */
5900 { "(bad)", { XX } },
5901 { "(bad)", { XX } },
5902 { "(bad)", { XX } },
5903 { "(bad)", { XX } },
5904 { "(bad)", { XX } },
5905 { "(bad)", { XX } },
5906 { "(bad)", { XX } },
5907 { "(bad)", { XX } },
5908 /* 58 */
5909 { "(bad)", { XX } },
5910 { "(bad)", { XX } },
5911 { "(bad)", { XX } },
5912 { "(bad)", { XX } },
5913 { "(bad)", { XX } },
5914 { "(bad)", { XX } },
5915 { "(bad)", { XX } },
5916 { "(bad)", { XX } },
5917 /* 60 */
5918 { PREFIX_TABLE (PREFIX_0F3A60) },
5919 { PREFIX_TABLE (PREFIX_0F3A61) },
5920 { PREFIX_TABLE (PREFIX_0F3A62) },
5921 { PREFIX_TABLE (PREFIX_0F3A63) },
5922 { "(bad)", { XX } },
5923 { "(bad)", { XX } },
5924 { "(bad)", { XX } },
5925 { "(bad)", { XX } },
5926 /* 68 */
5927 { "(bad)", { XX } },
5928 { "(bad)", { XX } },
5929 { "(bad)", { XX } },
5930 { "(bad)", { XX } },
5931 { "(bad)", { XX } },
5932 { "(bad)", { XX } },
5933 { "(bad)", { XX } },
5934 { "(bad)", { XX } },
5935 /* 70 */
5936 { "(bad)", { XX } },
5937 { "(bad)", { XX } },
5938 { "(bad)", { XX } },
5939 { "(bad)", { XX } },
5940 { "(bad)", { XX } },
5941 { "(bad)", { XX } },
5942 { "(bad)", { XX } },
5943 { "(bad)", { XX } },
5944 /* 78 */
5945 { "(bad)", { XX } },
5946 { "(bad)", { XX } },
5947 { "(bad)", { XX } },
5948 { "(bad)", { XX } },
5949 { "(bad)", { XX } },
5950 { "(bad)", { XX } },
5951 { "(bad)", { XX } },
5952 { "(bad)", { XX } },
5953 /* 80 */
5954 { "(bad)", { XX } },
5955 { "(bad)", { XX } },
5956 { "(bad)", { XX } },
5957 { "(bad)", { XX } },
5958 { "(bad)", { XX } },
5959 { "(bad)", { XX } },
5960 { "(bad)", { XX } },
5961 { "(bad)", { XX } },
5962 /* 88 */
5963 { "(bad)", { XX } },
5964 { "(bad)", { XX } },
5965 { "(bad)", { XX } },
5966 { "(bad)", { XX } },
5967 { "(bad)", { XX } },
5968 { "(bad)", { XX } },
5969 { "(bad)", { XX } },
5970 { "(bad)", { XX } },
5971 /* 90 */
5972 { "(bad)", { XX } },
5973 { "(bad)", { XX } },
5974 { "(bad)", { XX } },
5975 { "(bad)", { XX } },
5976 { "(bad)", { XX } },
5977 { "(bad)", { XX } },
5978 { "(bad)", { XX } },
5979 { "(bad)", { XX } },
5980 /* 98 */
5981 { "(bad)", { XX } },
5982 { "(bad)", { XX } },
5983 { "(bad)", { XX } },
5984 { "(bad)", { XX } },
5985 { "(bad)", { XX } },
5986 { "(bad)", { XX } },
5987 { "(bad)", { XX } },
5988 { "(bad)", { XX } },
5989 /* a0 */
5990 { "(bad)", { XX } },
5991 { "(bad)", { XX } },
5992 { "(bad)", { XX } },
5993 { "(bad)", { XX } },
5994 { "(bad)", { XX } },
5995 { "(bad)", { XX } },
5996 { "(bad)", { XX } },
5997 { "(bad)", { XX } },
5998 /* a8 */
5999 { "(bad)", { XX } },
6000 { "(bad)", { XX } },
6001 { "(bad)", { XX } },
6002 { "(bad)", { XX } },
6003 { "(bad)", { XX } },
6004 { "(bad)", { XX } },
6005 { "(bad)", { XX } },
6006 { "(bad)", { XX } },
6007 /* b0 */
6008 { "(bad)", { XX } },
6009 { "(bad)", { XX } },
6010 { "(bad)", { XX } },
6011 { "(bad)", { XX } },
6012 { "(bad)", { XX } },
6013 { "(bad)", { XX } },
6014 { "(bad)", { XX } },
6015 { "(bad)", { XX } },
6016 /* b8 */
6017 { "(bad)", { XX } },
6018 { "(bad)", { XX } },
6019 { "(bad)", { XX } },
6020 { "(bad)", { XX } },
6021 { "(bad)", { XX } },
6022 { "(bad)", { XX } },
6023 { "(bad)", { XX } },
6024 { "(bad)", { XX } },
6025 /* c0 */
6026 { "(bad)", { XX } },
6027 { "(bad)", { XX } },
6028 { "(bad)", { XX } },
6029 { "(bad)", { XX } },
6030 { "(bad)", { XX } },
6031 { "(bad)", { XX } },
6032 { "(bad)", { XX } },
6033 { "(bad)", { XX } },
6034 /* c8 */
6035 { "(bad)", { XX } },
6036 { "(bad)", { XX } },
6037 { "(bad)", { XX } },
6038 { "(bad)", { XX } },
6039 { "(bad)", { XX } },
6040 { "(bad)", { XX } },
6041 { "(bad)", { XX } },
6042 { "(bad)", { XX } },
6043 /* d0 */
6044 { "(bad)", { XX } },
6045 { "(bad)", { XX } },
6046 { "(bad)", { XX } },
6047 { "(bad)", { XX } },
6048 { "(bad)", { XX } },
6049 { "(bad)", { XX } },
6050 { "(bad)", { XX } },
6051 { "(bad)", { XX } },
6052 /* d8 */
6053 { "(bad)", { XX } },
6054 { "(bad)", { XX } },
6055 { "(bad)", { XX } },
6056 { "(bad)", { XX } },
6057 { "(bad)", { XX } },
6058 { "(bad)", { XX } },
6059 { "(bad)", { XX } },
6060 { PREFIX_TABLE (PREFIX_0F3ADF) },
6061 /* e0 */
6062 { "(bad)", { XX } },
6063 { "(bad)", { XX } },
6064 { "(bad)", { XX } },
6065 { "(bad)", { XX } },
6066 { "(bad)", { XX } },
6067 { "(bad)", { XX } },
6068 { "(bad)", { XX } },
6069 { "(bad)", { XX } },
6070 /* e8 */
6071 { "(bad)", { XX } },
6072 { "(bad)", { XX } },
6073 { "(bad)", { XX } },
6074 { "(bad)", { XX } },
6075 { "(bad)", { XX } },
6076 { "(bad)", { XX } },
6077 { "(bad)", { XX } },
6078 { "(bad)", { XX } },
6079 /* f0 */
6080 { "(bad)", { XX } },
6081 { "(bad)", { XX } },
6082 { "(bad)", { XX } },
6083 { "(bad)", { XX } },
6084 { "(bad)", { XX } },
6085 { "(bad)", { XX } },
6086 { "(bad)", { XX } },
6087 { "(bad)", { XX } },
6088 /* f8 */
6089 { "(bad)", { XX } },
6090 { "(bad)", { XX } },
6091 { "(bad)", { XX } },
6092 { "(bad)", { XX } },
6093 { "(bad)", { XX } },
6094 { "(bad)", { XX } },
6095 { "(bad)", { XX } },
6096 { "(bad)", { XX } },
6097 },
6098
6099 /* THREE_BYTE_0F7A */
6100 {
6101 /* 00 */
6102 { "(bad)", { XX } },
6103 { "(bad)", { XX } },
6104 { "(bad)", { XX } },
6105 { "(bad)", { XX } },
6106 { "(bad)", { XX } },
6107 { "(bad)", { XX } },
6108 { "(bad)", { XX } },
6109 { "(bad)", { XX } },
6110 /* 08 */
6111 { "(bad)", { XX } },
6112 { "(bad)", { XX } },
6113 { "(bad)", { XX } },
6114 { "(bad)", { XX } },
6115 { "(bad)", { XX } },
6116 { "(bad)", { XX } },
6117 { "(bad)", { XX } },
6118 { "(bad)", { XX } },
6119 /* 10 */
6120 { "(bad)", { XX } },
6121 { "(bad)", { XX } },
6122 { "(bad)", { XX } },
6123 { "(bad)", { XX } },
6124 { "(bad)", { XX } },
6125 { "(bad)", { XX } },
6126 { "(bad)", { XX } },
6127 { "(bad)", { XX } },
6128 /* 18 */
6129 { "(bad)", { XX } },
6130 { "(bad)", { XX } },
6131 { "(bad)", { XX } },
6132 { "(bad)", { XX } },
6133 { "(bad)", { XX } },
6134 { "(bad)", { XX } },
6135 { "(bad)", { XX } },
6136 { "(bad)", { XX } },
6137 /* 20 */
6138 { "ptest", { XX } },
6139 { "(bad)", { XX } },
6140 { "(bad)", { XX } },
c0f3af97
L
6141 { "(bad)", { XX } },
6142 { "(bad)", { XX } },
6143 { "(bad)", { XX } },
6144 { "(bad)", { XX } },
6145 { "(bad)", { XX } },
f88c9eb0 6146 /* 28 */
c0f3af97
L
6147 { "(bad)", { XX } },
6148 { "(bad)", { XX } },
6149 { "(bad)", { XX } },
c0f3af97
L
6150 { "(bad)", { XX } },
6151 { "(bad)", { XX } },
6152 { "(bad)", { XX } },
6153 { "(bad)", { XX } },
6154 { "(bad)", { XX } },
f88c9eb0 6155 /* 30 */
c0f3af97
L
6156 { "(bad)", { XX } },
6157 { "(bad)", { XX } },
6158 { "(bad)", { XX } },
4e7d34a6
L
6159 { "(bad)", { XX } },
6160 { "(bad)", { XX } },
c0f3af97 6161 { "(bad)", { XX } },
c0f3af97
L
6162 { "(bad)", { XX } },
6163 { "(bad)", { XX } },
f88c9eb0 6164 /* 38 */
c0f3af97 6165 { "(bad)", { XX } },
4e7d34a6
L
6166 { "(bad)", { XX } },
6167 { "(bad)", { XX } },
6168 { "(bad)", { XX } },
6169 { "(bad)", { XX } },
4e7d34a6
L
6170 { "(bad)", { XX } },
6171 { "(bad)", { XX } },
6172 { "(bad)", { XX } },
f88c9eb0 6173 /* 40 */
4e7d34a6 6174 { "(bad)", { XX } },
f88c9eb0
SP
6175 { "phaddbw", { XM, EXq } },
6176 { "phaddbd", { XM, EXq } },
6177 { "phaddbq", { XM, EXq } },
4e7d34a6
L
6178 { "(bad)", { XX } },
6179 { "(bad)", { XX } },
f88c9eb0
SP
6180 { "phaddwd", { XM, EXq } },
6181 { "phaddwq", { XM, EXq } },
6182 /* 48 */
4e7d34a6
L
6183 { "(bad)", { XX } },
6184 { "(bad)", { XX } },
4e7d34a6 6185 { "(bad)", { XX } },
f88c9eb0 6186 { "phadddq", { XM, EXq } },
4e7d34a6
L
6187 { "(bad)", { XX } },
6188 { "(bad)", { XX } },
6189 { "(bad)", { XX } },
6190 { "(bad)", { XX } },
f88c9eb0 6191 /* 50 */
4e7d34a6 6192 { "(bad)", { XX } },
f88c9eb0
SP
6193 { "phaddubw", { XM, EXq } },
6194 { "phaddubd", { XM, EXq } },
6195 { "phaddubq", { XM, EXq } },
4e7d34a6
L
6196 { "(bad)", { XX } },
6197 { "(bad)", { XX } },
f88c9eb0
SP
6198 { "phadduwd", { XM, EXq } },
6199 { "phadduwq", { XM, EXq } },
6200 /* 58 */
4e7d34a6
L
6201 { "(bad)", { XX } },
6202 { "(bad)", { XX } },
6203 { "(bad)", { XX } },
f88c9eb0 6204 { "phaddudq", { XM, EXq } },
4e7d34a6 6205 { "(bad)", { XX } },
c1e679ec
DR
6206 { "(bad)", { XX } },
6207 { "(bad)", { XX } },
6208 { "(bad)", { XX } },
f88c9eb0 6209 /* 60 */
c1e679ec 6210 { "(bad)", { XX } },
f88c9eb0
SP
6211 { "phsubbw", { XM, EXq } },
6212 { "phsubbd", { XM, EXq } },
6213 { "phsubbq", { XM, EXq } },
4e7d34a6
L
6214 { "(bad)", { XX } },
6215 { "(bad)", { XX } },
6216 { "(bad)", { XX } },
6217 { "(bad)", { XX } },
6218 /* 68 */
6219 { "(bad)", { XX } },
6220 { "(bad)", { XX } },
6221 { "(bad)", { XX } },
6222 { "(bad)", { XX } },
6223 { "(bad)", { XX } },
6224 { "(bad)", { XX } },
6225 { "(bad)", { XX } },
6226 { "(bad)", { XX } },
85f10a01 6227 /* 70 */
4e7d34a6
L
6228 { "(bad)", { XX } },
6229 { "(bad)", { XX } },
6230 { "(bad)", { XX } },
6231 { "(bad)", { XX } },
6232 { "(bad)", { XX } },
6233 { "(bad)", { XX } },
6234 { "(bad)", { XX } },
6235 { "(bad)", { XX } },
85f10a01 6236 /* 78 */
4e7d34a6
L
6237 { "(bad)", { XX } },
6238 { "(bad)", { XX } },
6239 { "(bad)", { XX } },
6240 { "(bad)", { XX } },
6241 { "(bad)", { XX } },
6242 { "(bad)", { XX } },
6243 { "(bad)", { XX } },
6244 { "(bad)", { XX } },
85f10a01 6245 /* 80 */
f88c9eb0
SP
6246 { "(bad)", { XX } },
6247 { "(bad)", { XX } },
4e7d34a6
L
6248 { "(bad)", { XX } },
6249 { "(bad)", { XX } },
6250 { "(bad)", { XX } },
c0f3af97
L
6251 { "(bad)", { XX } },
6252 { "(bad)", { XX } },
6253 { "(bad)", { XX } },
85f10a01 6254 /* 88 */
4e7d34a6
L
6255 { "(bad)", { XX } },
6256 { "(bad)", { XX } },
6257 { "(bad)", { XX } },
6258 { "(bad)", { XX } },
6259 { "(bad)", { XX } },
6260 { "(bad)", { XX } },
c0f3af97
L
6261 { "(bad)", { XX } },
6262 { "(bad)", { XX } },
85f10a01 6263 /* 90 */
4e7d34a6
L
6264 { "(bad)", { XX } },
6265 { "(bad)", { XX } },
6266 { "(bad)", { XX } },
6267 { "(bad)", { XX } },
6268 { "(bad)", { XX } },
c0f3af97
L
6269 { "(bad)", { XX } },
6270 { "(bad)", { XX } },
6271 { "(bad)", { XX } },
85f10a01 6272 /* 98 */
4e7d34a6
L
6273 { "(bad)", { XX } },
6274 { "(bad)", { XX } },
6275 { "(bad)", { XX } },
6276 { "(bad)", { XX } },
6277 { "(bad)", { XX } },
6278 { "(bad)", { XX } },
c0f3af97
L
6279 { "(bad)", { XX } },
6280 { "(bad)", { XX } },
85f10a01 6281 /* a0 */
4e7d34a6
L
6282 { "(bad)", { XX } },
6283 { "(bad)", { XX } },
6284 { "(bad)", { XX } },
6285 { "(bad)", { XX } },
6286 { "(bad)", { XX } },
6287 { "(bad)", { XX } },
c0f3af97 6288 { "(bad)", { XX } },
4e7d34a6 6289 { "(bad)", { XX } },
85f10a01 6290 /* a8 */
4e7d34a6
L
6291 { "(bad)", { XX } },
6292 { "(bad)", { XX } },
6293 { "(bad)", { XX } },
6294 { "(bad)", { XX } },
6295 { "(bad)", { XX } },
6296 { "(bad)", { XX } },
6297 { "(bad)", { XX } },
6298 { "(bad)", { XX } },
85f10a01 6299 /* b0 */
4e7d34a6
L
6300 { "(bad)", { XX } },
6301 { "(bad)", { XX } },
6302 { "(bad)", { XX } },
6303 { "(bad)", { XX } },
6304 { "(bad)", { XX } },
6305 { "(bad)", { XX } },
c0f3af97 6306 { "(bad)", { XX } },
4e7d34a6 6307 { "(bad)", { XX } },
85f10a01 6308 /* b8 */
4e7d34a6
L
6309 { "(bad)", { XX } },
6310 { "(bad)", { XX } },
6311 { "(bad)", { XX } },
6312 { "(bad)", { XX } },
6313 { "(bad)", { XX } },
6314 { "(bad)", { XX } },
6315 { "(bad)", { XX } },
6316 { "(bad)", { XX } },
85f10a01 6317 /* c0 */
4e7d34a6
L
6318 { "(bad)", { XX } },
6319 { "(bad)", { XX } },
6320 { "(bad)", { XX } },
6321 { "(bad)", { XX } },
6322 { "(bad)", { XX } },
6323 { "(bad)", { XX } },
6324 { "(bad)", { XX } },
6325 { "(bad)", { XX } },
85f10a01 6326 /* c8 */
4e7d34a6
L
6327 { "(bad)", { XX } },
6328 { "(bad)", { XX } },
6329 { "(bad)", { XX } },
6330 { "(bad)", { XX } },
6331 { "(bad)", { XX } },
6332 { "(bad)", { XX } },
6333 { "(bad)", { XX } },
6334 { "(bad)", { XX } },
85f10a01 6335 /* d0 */
4e7d34a6
L
6336 { "(bad)", { XX } },
6337 { "(bad)", { XX } },
6338 { "(bad)", { XX } },
6339 { "(bad)", { XX } },
6340 { "(bad)", { XX } },
6341 { "(bad)", { XX } },
6342 { "(bad)", { XX } },
6343 { "(bad)", { XX } },
85f10a01 6344 /* d8 */
4e7d34a6
L
6345 { "(bad)", { XX } },
6346 { "(bad)", { XX } },
6347 { "(bad)", { XX } },
f88c9eb0
SP
6348 { "(bad)", { XX } },
6349 { "(bad)", { XX } },
6350 { "(bad)", { XX } },
6351 { "(bad)", { XX } },
6352 { "(bad)", { XX } },
85f10a01 6353 /* e0 */
4e7d34a6
L
6354 { "(bad)", { XX } },
6355 { "(bad)", { XX } },
6356 { "(bad)", { XX } },
6357 { "(bad)", { XX } },
6358 { "(bad)", { XX } },
6359 { "(bad)", { XX } },
6360 { "(bad)", { XX } },
6361 { "(bad)", { XX } },
85f10a01 6362 /* e8 */
4e7d34a6
L
6363 { "(bad)", { XX } },
6364 { "(bad)", { XX } },
6365 { "(bad)", { XX } },
6366 { "(bad)", { XX } },
6367 { "(bad)", { XX } },
6368 { "(bad)", { XX } },
6369 { "(bad)", { XX } },
6370 { "(bad)", { XX } },
85f10a01 6371 /* f0 */
f88c9eb0
SP
6372 { "(bad)", { XX } },
6373 { "(bad)", { XX } },
4e7d34a6
L
6374 { "(bad)", { XX } },
6375 { "(bad)", { XX } },
6376 { "(bad)", { XX } },
6377 { "(bad)", { XX } },
6378 { "(bad)", { XX } },
6379 { "(bad)", { XX } },
85f10a01 6380 /* f8 */
4e7d34a6
L
6381 { "(bad)", { XX } },
6382 { "(bad)", { XX } },
6383 { "(bad)", { XX } },
6384 { "(bad)", { XX } },
6385 { "(bad)", { XX } },
6386 { "(bad)", { XX } },
6387 { "(bad)", { XX } },
6388 { "(bad)", { XX } },
85f10a01 6389 },
f88c9eb0
SP
6390};
6391
6392static const struct dis386 xop_table[][256] = {
5dd85c99 6393 /* XOP_08 */
85f10a01
MM
6394 {
6395 /* 00 */
4e7d34a6
L
6396 { "(bad)", { XX } },
6397 { "(bad)", { XX } },
6398 { "(bad)", { XX } },
6399 { "(bad)", { XX } },
6400 { "(bad)", { XX } },
6401 { "(bad)", { XX } },
6402 { "(bad)", { XX } },
6403 { "(bad)", { XX } },
85f10a01 6404 /* 08 */
f88c9eb0
SP
6405 { "(bad)", { XX } },
6406 { "(bad)", { XX } },
6407 { "(bad)", { XX } },
6408 { "(bad)", { XX } },
6409 { "(bad)", { XX } },
6410 { "(bad)", { XX } },
6411 { "(bad)", { XX } },
6412 { "(bad)", { XX } },
85f10a01 6413 /* 10 */
4e7d34a6
L
6414 { "(bad)", { XX } },
6415 { "(bad)", { XX } },
5dd85c99 6416 { "(bad)", { XX } },
f88c9eb0
SP
6417 { "(bad)", { XX } },
6418 { "(bad)", { XX } },
6419 { "(bad)", { XX } },
4e7d34a6
L
6420 { "(bad)", { XX } },
6421 { "(bad)", { XX } },
85f10a01 6422 /* 18 */
4e7d34a6
L
6423 { "(bad)", { XX } },
6424 { "(bad)", { XX } },
6425 { "(bad)", { XX } },
6426 { "(bad)", { XX } },
6427 { "(bad)", { XX } },
6428 { "(bad)", { XX } },
6429 { "(bad)", { XX } },
6430 { "(bad)", { XX } },
85f10a01 6431 /* 20 */
f88c9eb0
SP
6432 { "(bad)", { XX } },
6433 { "(bad)", { XX } },
6434 { "(bad)", { XX } },
4e7d34a6
L
6435 { "(bad)", { XX } },
6436 { "(bad)", { XX } },
6437 { "(bad)", { XX } },
6438 { "(bad)", { XX } },
6439 { "(bad)", { XX } },
85f10a01 6440 /* 28 */
4e7d34a6
L
6441 { "(bad)", { XX } },
6442 { "(bad)", { XX } },
6443 { "(bad)", { XX } },
6444 { "(bad)", { XX } },
4e7d34a6
L
6445 { "(bad)", { XX } },
6446 { "(bad)", { XX } },
6447 { "(bad)", { XX } },
6448 { "(bad)", { XX } },
c0f3af97 6449 /* 30 */
c1e679ec
DR
6450 { "(bad)", { XX } },
6451 { "(bad)", { XX } },
4e7d34a6 6452 { "(bad)", { XX } },
4e7d34a6
L
6453 { "(bad)", { XX } },
6454 { "(bad)", { XX } },
6455 { "(bad)", { XX } },
6456 { "(bad)", { XX } },
6457 { "(bad)", { XX } },
c0f3af97 6458 /* 38 */
4e7d34a6
L
6459 { "(bad)", { XX } },
6460 { "(bad)", { XX } },
6461 { "(bad)", { XX } },
4e7d34a6
L
6462 { "(bad)", { XX } },
6463 { "(bad)", { XX } },
6464 { "(bad)", { XX } },
6465 { "(bad)", { XX } },
6466 { "(bad)", { XX } },
c0f3af97 6467 /* 40 */
c1e679ec 6468 { "(bad)", { XX } },
f88c9eb0
SP
6469 { "(bad)", { XX } },
6470 { "(bad)", { XX } },
6471 { "(bad)", { XX } },
6472 { "(bad)", { XX } },
4e7d34a6
L
6473 { "(bad)", { XX } },
6474 { "(bad)", { XX } },
6475 { "(bad)", { XX } },
85f10a01 6476 /* 48 */
4e7d34a6
L
6477 { "(bad)", { XX } },
6478 { "(bad)", { XX } },
6479 { "(bad)", { XX } },
c1e679ec 6480 { "(bad)", { XX } },
4e7d34a6
L
6481 { "(bad)", { XX } },
6482 { "(bad)", { XX } },
6483 { "(bad)", { XX } },
6484 { "(bad)", { XX } },
c0f3af97 6485 /* 50 */
4e7d34a6
L
6486 { "(bad)", { XX } },
6487 { "(bad)", { XX } },
6488 { "(bad)", { XX } },
c1e679ec
DR
6489 { "(bad)", { XX } },
6490 { "(bad)", { XX } },
6491 { "(bad)", { XX } },
6492 { "(bad)", { XX } },
6493 { "(bad)", { XX } },
85f10a01 6494 /* 58 */
4e7d34a6
L
6495 { "(bad)", { XX } },
6496 { "(bad)", { XX } },
6497 { "(bad)", { XX } },
4e7d34a6
L
6498 { "(bad)", { XX } },
6499 { "(bad)", { XX } },
6500 { "(bad)", { XX } },
6501 { "(bad)", { XX } },
4e7d34a6 6502 { "(bad)", { XX } },
c1e679ec 6503 /* 60 */
f88c9eb0
SP
6504 { "(bad)", { XX } },
6505 { "(bad)", { XX } },
6506 { "(bad)", { XX } },
6507 { "(bad)", { XX } },
4e7d34a6
L
6508 { "(bad)", { XX } },
6509 { "(bad)", { XX } },
6510 { "(bad)", { XX } },
6511 { "(bad)", { XX } },
c0f3af97
L
6512 /* 68 */
6513 { "(bad)", { XX } },
4e7d34a6
L
6514 { "(bad)", { XX } },
6515 { "(bad)", { XX } },
6516 { "(bad)", { XX } },
4e7d34a6
L
6517 { "(bad)", { XX } },
6518 { "(bad)", { XX } },
6519 { "(bad)", { XX } },
6520 { "(bad)", { XX } },
85f10a01 6521 /* 70 */
4e7d34a6
L
6522 { "(bad)", { XX } },
6523 { "(bad)", { XX } },
6524 { "(bad)", { XX } },
6525 { "(bad)", { XX } },
6526 { "(bad)", { XX } },
6527 { "(bad)", { XX } },
6528 { "(bad)", { XX } },
6529 { "(bad)", { XX } },
85f10a01 6530 /* 78 */
4e7d34a6
L
6531 { "(bad)", { XX } },
6532 { "(bad)", { XX } },
6533 { "(bad)", { XX } },
6534 { "(bad)", { XX } },
6535 { "(bad)", { XX } },
6536 { "(bad)", { XX } },
6537 { "(bad)", { XX } },
6538 { "(bad)", { XX } },
85f10a01 6539 /* 80 */
4e7d34a6
L
6540 { "(bad)", { XX } },
6541 { "(bad)", { XX } },
6542 { "(bad)", { XX } },
6543 { "(bad)", { XX } },
6544 { "(bad)", { XX } },
5dd85c99
SP
6545 { "vpmacssww", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6546 { "vpmacsswd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6547 { "vpmacssdql", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6548 /* 88 */
4e7d34a6
L
6549 { "(bad)", { XX } },
6550 { "(bad)", { XX } },
6551 { "(bad)", { XX } },
4e7d34a6
L
6552 { "(bad)", { XX } },
6553 { "(bad)", { XX } },
6554 { "(bad)", { XX } },
5dd85c99
SP
6555 { "vpmacssdd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6556 { "vpmacssdqh", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6557 /* 90 */
4e7d34a6
L
6558 { "(bad)", { XX } },
6559 { "(bad)", { XX } },
6560 { "(bad)", { XX } },
6561 { "(bad)", { XX } },
6562 { "(bad)", { XX } },
5dd85c99
SP
6563 { "vpmacsww", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6564 { "vpmacswd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6565 { "vpmacsdql", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6566 /* 98 */
4e7d34a6
L
6567 { "(bad)", { XX } },
6568 { "(bad)", { XX } },
6569 { "(bad)", { XX } },
6570 { "(bad)", { XX } },
6571 { "(bad)", { XX } },
6572 { "(bad)", { XX } },
5dd85c99
SP
6573 { "vpmacsdd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6574 { "vpmacsdqh", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6575 /* a0 */
f0ae4a24
SP
6576 { "(bad)", { XX } },
6577 { "(bad)", { XX } },
5dd85c99
SP
6578 { "vpcmov", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6579 { "vpperm", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
4e7d34a6
L
6580 { "(bad)", { XX } },
6581 { "(bad)", { XX } },
5dd85c99 6582 { "vpmadcsswd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
4e7d34a6 6583 { "(bad)", { XX } },
5dd85c99 6584 /* a8 */
4e7d34a6
L
6585 { "(bad)", { XX } },
6586 { "(bad)", { XX } },
6587 { "(bad)", { XX } },
6588 { "(bad)", { XX } },
6589 { "(bad)", { XX } },
6590 { "(bad)", { XX } },
6591 { "(bad)", { XX } },
4e7d34a6 6592 { "(bad)", { XX } },
5dd85c99 6593 /* b0 */
4e7d34a6
L
6594 { "(bad)", { XX } },
6595 { "(bad)", { XX } },
6596 { "(bad)", { XX } },
6597 { "(bad)", { XX } },
6598 { "(bad)", { XX } },
6599 { "(bad)", { XX } },
5dd85c99 6600 { "vpmadcswd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
4e7d34a6 6601 { "(bad)", { XX } },
5dd85c99 6602 /* b8 */
4e7d34a6
L
6603 { "(bad)", { XX } },
6604 { "(bad)", { XX } },
6605 { "(bad)", { XX } },
6606 { "(bad)", { XX } },
6607 { "(bad)", { XX } },
6608 { "(bad)", { XX } },
6609 { "(bad)", { XX } },
6610 { "(bad)", { XX } },
5dd85c99
SP
6611 /* c0 */
6612 { "vprotb", { XM, Vex_2src_1, Ib } },
6613 { "vprotw", { XM, Vex_2src_1, Ib } },
6614 { "vprotd", { XM, Vex_2src_1, Ib } },
6615 { "vprotq", { XM, Vex_2src_1, Ib } },
4e7d34a6
L
6616 { "(bad)", { XX } },
6617 { "(bad)", { XX } },
6618 { "(bad)", { XX } },
6619 { "(bad)", { XX } },
5dd85c99 6620 /* c8 */
4e7d34a6
L
6621 { "(bad)", { XX } },
6622 { "(bad)", { XX } },
6623 { "(bad)", { XX } },
6624 { "(bad)", { XX } },
5dd85c99
SP
6625 { "vpcomb", { XM, Vex128, EXx, Ib } },
6626 { "vpcomw", { XM, Vex128, EXx, Ib } },
6627 { "vpcomd", { XM, Vex128, EXx, Ib } },
6628 { "vpcomq", { XM, Vex128, EXx, Ib } },
6629 /* d0 */
4e7d34a6
L
6630 { "(bad)", { XX } },
6631 { "(bad)", { XX } },
6632 { "(bad)", { XX } },
6633 { "(bad)", { XX } },
6634 { "(bad)", { XX } },
6635 { "(bad)", { XX } },
6636 { "(bad)", { XX } },
6637 { "(bad)", { XX } },
5dd85c99 6638 /* d8 */
4e7d34a6
L
6639 { "(bad)", { XX } },
6640 { "(bad)", { XX } },
6641 { "(bad)", { XX } },
6642 { "(bad)", { XX } },
6643 { "(bad)", { XX } },
6644 { "(bad)", { XX } },
6645 { "(bad)", { XX } },
6646 { "(bad)", { XX } },
5dd85c99 6647 /* e0 */
4e7d34a6
L
6648 { "(bad)", { XX } },
6649 { "(bad)", { XX } },
6650 { "(bad)", { XX } },
6651 { "(bad)", { XX } },
6652 { "(bad)", { XX } },
6653 { "(bad)", { XX } },
6654 { "(bad)", { XX } },
6655 { "(bad)", { XX } },
5dd85c99 6656 /* e8 */
4e7d34a6
L
6657 { "(bad)", { XX } },
6658 { "(bad)", { XX } },
6659 { "(bad)", { XX } },
6660 { "(bad)", { XX } },
5dd85c99
SP
6661 { "vpcomub", { XM, Vex128, EXx, Ib } },
6662 { "vpcomuw", { XM, Vex128, EXx, Ib } },
6663 { "vpcomud", { XM, Vex128, EXx, Ib } },
6664 { "vpcomuq", { XM, Vex128, EXx, Ib } },
6665 /* f0 */
4e7d34a6
L
6666 { "(bad)", { XX } },
6667 { "(bad)", { XX } },
6668 { "(bad)", { XX } },
6669 { "(bad)", { XX } },
4e7d34a6
L
6670 { "(bad)", { XX } },
6671 { "(bad)", { XX } },
6672 { "(bad)", { XX } },
6673 { "(bad)", { XX } },
5dd85c99
SP
6674 /* f8 */
6675 { "(bad)", { XX } },
6676 { "(bad)", { XX } },
6677 { "(bad)", { XX } },
6678 { "(bad)", { XX } },
6679 { "(bad)", { XX } },
6680 { "(bad)", { XX } },
6681 { "(bad)", { XX } },
6682 { "(bad)", { XX } },
6683 },
6684 /* XOP_09 */
6685 {
6686 /* 00 */
6687 { "(bad)", { XX } },
6688 { "(bad)", { XX } },
6689 { "(bad)", { XX } },
6690 { "(bad)", { XX } },
6691 { "(bad)", { XX } },
6692 { "(bad)", { XX } },
6693 { "(bad)", { XX } },
6694 { "(bad)", { XX } },
6695 /* 08 */
6696 { "(bad)", { XX } },
6697 { "(bad)", { XX } },
6698 { "(bad)", { XX } },
6699 { "(bad)", { XX } },
6700 { "(bad)", { XX } },
6701 { "(bad)", { XX } },
6702 { "(bad)", { XX } },
6703 { "(bad)", { XX } },
6704 /* 10 */
6705 { "(bad)", { XX } },
6706 { "(bad)", { XX } },
6707 { REG_TABLE (REG_XOP_LWPCB) },
6708 { "(bad)", { XX } },
6709 { "(bad)", { XX } },
6710 { "(bad)", { XX } },
6711 { "(bad)", { XX } },
6712 { "(bad)", { XX } },
6713 /* 18 */
6714 { "(bad)", { XX } },
6715 { "(bad)", { XX } },
6716 { "(bad)", { XX } },
6717 { "(bad)", { XX } },
6718 { "(bad)", { XX } },
6719 { "(bad)", { XX } },
6720 { "(bad)", { XX } },
6721 { "(bad)", { XX } },
6722 /* 20 */
4e7d34a6
L
6723 { "(bad)", { XX } },
6724 { "(bad)", { XX } },
6725 { "(bad)", { XX } },
f88c9eb0 6726 { "(bad)", { XX } },
4e7d34a6
L
6727 { "(bad)", { XX } },
6728 { "(bad)", { XX } },
6729 { "(bad)", { XX } },
6730 { "(bad)", { XX } },
5dd85c99
SP
6731 /* 28 */
6732 { "(bad)", { XX } },
6733 { "(bad)", { XX } },
6734 { "(bad)", { XX } },
6735 { "(bad)", { XX } },
6736 { "(bad)", { XX } },
6737 { "(bad)", { XX } },
6738 { "(bad)", { XX } },
6739 { "(bad)", { XX } },
6740 /* 30 */
6741 { "(bad)", { XX } },
6742 { "(bad)", { XX } },
6743 { "(bad)", { XX } },
6744 { "(bad)", { XX } },
6745 { "(bad)", { XX } },
6746 { "(bad)", { XX } },
6747 { "(bad)", { XX } },
6748 { "(bad)", { XX } },
6749 /* 38 */
6750 { "(bad)", { XX } },
6751 { "(bad)", { XX } },
6752 { "(bad)", { XX } },
6753 { "(bad)", { XX } },
6754 { "(bad)", { XX } },
6755 { "(bad)", { XX } },
6756 { "(bad)", { XX } },
6757 { "(bad)", { XX } },
6758 /* 40 */
6759 { "(bad)", { XX } },
6760 { "(bad)", { XX } },
6761 { "(bad)", { XX } },
6762 { "(bad)", { XX } },
6763 { "(bad)", { XX } },
6764 { "(bad)", { XX } },
6765 { "(bad)", { XX } },
6766 { "(bad)", { XX } },
6767 /* 48 */
6768 { "(bad)", { XX } },
6769 { "(bad)", { XX } },
6770 { "(bad)", { XX } },
6771 { "(bad)", { XX } },
6772 { "(bad)", { XX } },
6773 { "(bad)", { XX } },
6774 { "(bad)", { XX } },
6775 { "(bad)", { XX } },
6776 /* 50 */
6777 { "(bad)", { XX } },
6778 { "(bad)", { XX } },
6779 { "(bad)", { XX } },
6780 { "(bad)", { XX } },
6781 { "(bad)", { XX } },
6782 { "(bad)", { XX } },
6783 { "(bad)", { XX } },
6784 { "(bad)", { XX } },
6785 /* 58 */
6786 { "(bad)", { XX } },
6787 { "(bad)", { XX } },
6788 { "(bad)", { XX } },
6789 { "(bad)", { XX } },
6790 { "(bad)", { XX } },
6791 { "(bad)", { XX } },
6792 { "(bad)", { XX } },
6793 { "(bad)", { XX } },
6794 /* 60 */
6795 { "(bad)", { XX } },
6796 { "(bad)", { XX } },
6797 { "(bad)", { XX } },
6798 { "(bad)", { XX } },
6799 { "(bad)", { XX } },
6800 { "(bad)", { XX } },
6801 { "(bad)", { XX } },
6802 { "(bad)", { XX } },
6803 /* 68 */
6804 { "(bad)", { XX } },
6805 { "(bad)", { XX } },
6806 { "(bad)", { XX } },
6807 { "(bad)", { XX } },
6808 { "(bad)", { XX } },
6809 { "(bad)", { XX } },
6810 { "(bad)", { XX } },
6811 { "(bad)", { XX } },
6812 /* 70 */
6813 { "(bad)", { XX } },
6814 { "(bad)", { XX } },
6815 { "(bad)", { XX } },
6816 { "(bad)", { XX } },
6817 { "(bad)", { XX } },
6818 { "(bad)", { XX } },
6819 { "(bad)", { XX } },
6820 { "(bad)", { XX } },
6821 /* 78 */
6822 { "(bad)", { XX } },
6823 { "(bad)", { XX } },
6824 { "(bad)", { XX } },
6825 { "(bad)", { XX } },
6826 { "(bad)", { XX } },
6827 { "(bad)", { XX } },
6828 { "(bad)", { XX } },
6829 { "(bad)", { XX } },
6830 /* 80 */
6831 { VEX_LEN_TABLE (VEX_LEN_XOP_09_80) },
6832 { VEX_LEN_TABLE (VEX_LEN_XOP_09_81) },
6833 { "vfrczss", { XM, EXd } },
6834 { "vfrczsd", { XM, EXq } },
6835 { "(bad)", { XX } },
6836 { "(bad)", { XX } },
6837 { "(bad)", { XX } },
6838 { "(bad)", { XX } },
6839 /* 88 */
6840 { "(bad)", { XX } },
6841 { "(bad)", { XX } },
6842 { "(bad)", { XX } },
6843 { "(bad)", { XX } },
6844 { "(bad)", { XX } },
6845 { "(bad)", { XX } },
6846 { "(bad)", { XX } },
6847 { "(bad)", { XX } },
6848 /* 90 */
6849 { "vprotb", { XM, Vex_2src_1, Vex_2src_2 } },
6850 { "vprotw", { XM, Vex_2src_1, Vex_2src_2 } },
6851 { "vprotd", { XM, Vex_2src_1, Vex_2src_2 } },
6852 { "vprotq", { XM, Vex_2src_1, Vex_2src_2 } },
6853 { "vpshlb", { XM, Vex_2src_1, Vex_2src_2 } },
6854 { "vpshlw", { XM, Vex_2src_1, Vex_2src_2 } },
6855 { "vpshld", { XM, Vex_2src_1, Vex_2src_2 } },
6856 { "vpshlq", { XM, Vex_2src_1, Vex_2src_2 } },
6857 /* 98 */
6858 { "vpshab", { XM, Vex_2src_1, Vex_2src_2 } },
6859 { "vpshaw", { XM, Vex_2src_1, Vex_2src_2 } },
6860 { "vpshad", { XM, Vex_2src_1, Vex_2src_2 } },
6861 { "vpshaq", { XM, Vex_2src_1, Vex_2src_2 } },
6862 { "(bad)", { XX } },
6863 { "(bad)", { XX } },
6864 { "(bad)", { XX } },
6865 { "(bad)", { XX } },
6866 /* a0 */
6867 { "(bad)", { XX } },
6868 { "(bad)", { XX } },
6869 { "(bad)", { XX } },
6870 { "(bad)", { XX } },
6871 { "(bad)", { XX } },
6872 { "(bad)", { XX } },
6873 { "(bad)", { XX } },
6874 { "(bad)", { XX } },
6875 /* a8 */
6876 { "(bad)", { XX } },
6877 { "(bad)", { XX } },
6878 { "(bad)", { XX } },
6879 { "(bad)", { XX } },
6880 { "(bad)", { XX } },
6881 { "(bad)", { XX } },
6882 { "(bad)", { XX } },
6883 { "(bad)", { XX } },
6884 /* b0 */
6885 { "(bad)", { XX } },
6886 { "(bad)", { XX } },
6887 { "(bad)", { XX } },
6888 { "(bad)", { XX } },
6889 { "(bad)", { XX } },
6890 { "(bad)", { XX } },
6891 { "(bad)", { XX } },
6892 { "(bad)", { XX } },
6893 /* b8 */
6894 { "(bad)", { XX } },
6895 { "(bad)", { XX } },
6896 { "(bad)", { XX } },
6897 { "(bad)", { XX } },
6898 { "(bad)", { XX } },
6899 { "(bad)", { XX } },
6900 { "(bad)", { XX } },
6901 { "(bad)", { XX } },
6902 /* c0 */
6903 { "(bad)", { XX } },
6904 { "vphaddbw", { XM, EXxmm } },
6905 { "vphaddbd", { XM, EXxmm } },
6906 { "vphaddbq", { XM, EXxmm } },
6907 { "(bad)", { XX } },
6908 { "(bad)", { XX } },
6909 { "vphaddwd", { XM, EXxmm } },
6910 { "vphaddwq", { XM, EXxmm } },
6911 /* c8 */
6912 { "(bad)", { XX } },
6913 { "(bad)", { XX } },
6914 { "(bad)", { XX } },
6915 { "vphadddq", { XM, EXxmm } },
6916 { "(bad)", { XX } },
6917 { "(bad)", { XX } },
6918 { "(bad)", { XX } },
6919 { "(bad)", { XX } },
6920 /* d0 */
6921 { "(bad)", { XX } },
6922 { "vphaddubw", { XM, EXxmm } },
6923 { "vphaddubd", { XM, EXxmm } },
6924 { "vphaddubq", { XM, EXxmm } },
6925 { "(bad)", { XX } },
6926 { "(bad)", { XX } },
6927 { "vphadduwd", { XM, EXxmm } },
6928 { "vphadduwq", { XM, EXxmm } },
6929 /* d8 */
6930 { "(bad)", { XX } },
6931 { "(bad)", { XX } },
6932 { "(bad)", { XX } },
6933 { "vphaddudq", { XM, EXxmm } },
6934 { "(bad)", { XX } },
6935 { "(bad)", { XX } },
6936 { "(bad)", { XX } },
6937 { "(bad)", { XX } },
6938 /* e0 */
6939 { "(bad)", { XX } },
6940 { "vphsubbw", { XM, EXxmm } },
6941 { "vphsubwd", { XM, EXxmm } },
6942 { "vphsubdq", { XM, EXxmm } },
4e7d34a6
L
6943 { "(bad)", { XX } },
6944 { "(bad)", { XX } },
6945 { "(bad)", { XX } },
6946 { "(bad)", { XX } },
6947 /* e8 */
6948 { "(bad)", { XX } },
6949 { "(bad)", { XX } },
6950 { "(bad)", { XX } },
6951 { "(bad)", { XX } },
6952 { "(bad)", { XX } },
6953 { "(bad)", { XX } },
6954 { "(bad)", { XX } },
6955 { "(bad)", { XX } },
6956 /* f0 */
6957 { "(bad)", { XX } },
6958 { "(bad)", { XX } },
6959 { "(bad)", { XX } },
6960 { "(bad)", { XX } },
6961 { "(bad)", { XX } },
6962 { "(bad)", { XX } },
6963 { "(bad)", { XX } },
6964 { "(bad)", { XX } },
6965 /* f8 */
6966 { "(bad)", { XX } },
6967 { "(bad)", { XX } },
6968 { "(bad)", { XX } },
6969 { "(bad)", { XX } },
6970 { "(bad)", { XX } },
6971 { "(bad)", { XX } },
6972 { "(bad)", { XX } },
6973 { "(bad)", { XX } },
6974 },
f88c9eb0 6975 /* XOP_0A */
4e7d34a6
L
6976 {
6977 /* 00 */
c0f3af97
L
6978 { "(bad)", { XX } },
6979 { "(bad)", { XX } },
6980 { "(bad)", { XX } },
6981 { "(bad)", { XX } },
6982 { "(bad)", { XX } },
6983 { "(bad)", { XX } },
6984 { "(bad)", { XX } },
6985 { "(bad)", { XX } },
4e7d34a6 6986 /* 08 */
c0f3af97
L
6987 { "(bad)", { XX } },
6988 { "(bad)", { XX } },
6989 { "(bad)", { XX } },
6990 { "(bad)", { XX } },
d5d7db8e
L
6991 { "(bad)", { XX } },
6992 { "(bad)", { XX } },
6993 { "(bad)", { XX } },
6994 { "(bad)", { XX } },
4e7d34a6 6995 /* 10 */
d5d7db8e
L
6996 { "(bad)", { XX } },
6997 { "(bad)", { XX } },
f88c9eb0 6998 { REG_TABLE (REG_XOP_LWP) },
d5d7db8e 6999 { "(bad)", { XX } },
c0f3af97
L
7000 { "(bad)", { XX } },
7001 { "(bad)", { XX } },
7002 { "(bad)", { XX } },
7003 { "(bad)", { XX } },
4e7d34a6 7004 /* 18 */
d5d7db8e
L
7005 { "(bad)", { XX } },
7006 { "(bad)", { XX } },
7007 { "(bad)", { XX } },
7008 { "(bad)", { XX } },
c0f3af97
L
7009 { "(bad)", { XX } },
7010 { "(bad)", { XX } },
7011 { "(bad)", { XX } },
d5d7db8e 7012 { "(bad)", { XX } },
4e7d34a6 7013 /* 20 */
f88c9eb0 7014 { "(bad)", { XX } },
c0f3af97
L
7015 { "(bad)", { XX } },
7016 { "(bad)", { XX } },
7017 { "(bad)", { XX } },
7018 { "(bad)", { XX } },
7019 { "(bad)", { XX } },
d5d7db8e
L
7020 { "(bad)", { XX } },
7021 { "(bad)", { XX } },
4e7d34a6 7022 /* 28 */
c0f3af97
L
7023 { "(bad)", { XX } },
7024 { "(bad)", { XX } },
7025 { "(bad)", { XX } },
7026 { "(bad)", { XX } },
d5d7db8e
L
7027 { "(bad)", { XX } },
7028 { "(bad)", { XX } },
7029 { "(bad)", { XX } },
7030 { "(bad)", { XX } },
4e7d34a6 7031 /* 30 */
d5d7db8e 7032 { "(bad)", { XX } },
d5d7db8e
L
7033 { "(bad)", { XX } },
7034 { "(bad)", { XX } },
7035 { "(bad)", { XX } },
7036 { "(bad)", { XX } },
7037 { "(bad)", { XX } },
7038 { "(bad)", { XX } },
c0f3af97
L
7039 { "(bad)", { XX } },
7040 /* 38 */
7041 { "(bad)", { XX } },
7042 { "(bad)", { XX } },
7043 { "(bad)", { XX } },
7044 { "(bad)", { XX } },
d5d7db8e
L
7045 { "(bad)", { XX } },
7046 { "(bad)", { XX } },
7047 { "(bad)", { XX } },
7048 { "(bad)", { XX } },
c0f3af97 7049 /* 40 */
c1e679ec 7050 { "(bad)", { XX } },
d5d7db8e
L
7051 { "(bad)", { XX } },
7052 { "(bad)", { XX } },
f88c9eb0
SP
7053 { "(bad)", { XX } },
7054 { "(bad)", { XX } },
7055 { "(bad)", { XX } },
7056 { "(bad)", { XX } },
7057 { "(bad)", { XX } },
c1e679ec 7058 /* 48 */
d5d7db8e
L
7059 { "(bad)", { XX } },
7060 { "(bad)", { XX } },
d5d7db8e 7061 { "(bad)", { XX } },
f88c9eb0 7062 { "(bad)", { XX } },
d5d7db8e
L
7063 { "(bad)", { XX } },
7064 { "(bad)", { XX } },
7065 { "(bad)", { XX } },
7066 { "(bad)", { XX } },
c1e679ec 7067 /* 50 */
d5d7db8e
L
7068 { "(bad)", { XX } },
7069 { "(bad)", { XX } },
7070 { "(bad)", { XX } },
f88c9eb0
SP
7071 { "(bad)", { XX } },
7072 { "(bad)", { XX } },
7073 { "(bad)", { XX } },
7074 { "(bad)", { XX } },
7075 { "(bad)", { XX } },
4e7d34a6 7076 /* 58 */
d5d7db8e
L
7077 { "(bad)", { XX } },
7078 { "(bad)", { XX } },
7079 { "(bad)", { XX } },
f88c9eb0 7080 { "(bad)", { XX } },
d5d7db8e
L
7081 { "(bad)", { XX } },
7082 { "(bad)", { XX } },
7083 { "(bad)", { XX } },
7084 { "(bad)", { XX } },
4e7d34a6 7085 /* 60 */
d5d7db8e 7086 { "(bad)", { XX } },
f88c9eb0
SP
7087 { "(bad)", { XX } },
7088 { "(bad)", { XX } },
7089 { "(bad)", { XX } },
d5d7db8e
L
7090 { "(bad)", { XX } },
7091 { "(bad)", { XX } },
7092 { "(bad)", { XX } },
7093 { "(bad)", { XX } },
4e7d34a6 7094 /* 68 */
d5d7db8e
L
7095 { "(bad)", { XX } },
7096 { "(bad)", { XX } },
7097 { "(bad)", { XX } },
7098 { "(bad)", { XX } },
7099 { "(bad)", { XX } },
7100 { "(bad)", { XX } },
7101 { "(bad)", { XX } },
7102 { "(bad)", { XX } },
4e7d34a6 7103 /* 70 */
d5d7db8e
L
7104 { "(bad)", { XX } },
7105 { "(bad)", { XX } },
7106 { "(bad)", { XX } },
7107 { "(bad)", { XX } },
7108 { "(bad)", { XX } },
7109 { "(bad)", { XX } },
7110 { "(bad)", { XX } },
7111 { "(bad)", { XX } },
4e7d34a6 7112 /* 78 */
d5d7db8e
L
7113 { "(bad)", { XX } },
7114 { "(bad)", { XX } },
7115 { "(bad)", { XX } },
7116 { "(bad)", { XX } },
7117 { "(bad)", { XX } },
7118 { "(bad)", { XX } },
7119 { "(bad)", { XX } },
7120 { "(bad)", { XX } },
4e7d34a6 7121 /* 80 */
d5d7db8e
L
7122 { "(bad)", { XX } },
7123 { "(bad)", { XX } },
7124 { "(bad)", { XX } },
7125 { "(bad)", { XX } },
7126 { "(bad)", { XX } },
7127 { "(bad)", { XX } },
7128 { "(bad)", { XX } },
7129 { "(bad)", { XX } },
4e7d34a6 7130 /* 88 */
d5d7db8e
L
7131 { "(bad)", { XX } },
7132 { "(bad)", { XX } },
7133 { "(bad)", { XX } },
7134 { "(bad)", { XX } },
7135 { "(bad)", { XX } },
7136 { "(bad)", { XX } },
7137 { "(bad)", { XX } },
7138 { "(bad)", { XX } },
4e7d34a6 7139 /* 90 */
d5d7db8e
L
7140 { "(bad)", { XX } },
7141 { "(bad)", { XX } },
7142 { "(bad)", { XX } },
7143 { "(bad)", { XX } },
7144 { "(bad)", { XX } },
7145 { "(bad)", { XX } },
7146 { "(bad)", { XX } },
7147 { "(bad)", { XX } },
4e7d34a6 7148 /* 98 */
d5d7db8e
L
7149 { "(bad)", { XX } },
7150 { "(bad)", { XX } },
7151 { "(bad)", { XX } },
7152 { "(bad)", { XX } },
7153 { "(bad)", { XX } },
7154 { "(bad)", { XX } },
7155 { "(bad)", { XX } },
7156 { "(bad)", { XX } },
4e7d34a6 7157 /* a0 */
d5d7db8e
L
7158 { "(bad)", { XX } },
7159 { "(bad)", { XX } },
7160 { "(bad)", { XX } },
7161 { "(bad)", { XX } },
7162 { "(bad)", { XX } },
7163 { "(bad)", { XX } },
7164 { "(bad)", { XX } },
7165 { "(bad)", { XX } },
4e7d34a6 7166 /* a8 */
d5d7db8e
L
7167 { "(bad)", { XX } },
7168 { "(bad)", { XX } },
7169 { "(bad)", { XX } },
7170 { "(bad)", { XX } },
7171 { "(bad)", { XX } },
7172 { "(bad)", { XX } },
7173 { "(bad)", { XX } },
7174 { "(bad)", { XX } },
7175 /* b0 */
7176 { "(bad)", { XX } },
7177 { "(bad)", { XX } },
7178 { "(bad)", { XX } },
7179 { "(bad)", { XX } },
7180 { "(bad)", { XX } },
7181 { "(bad)", { XX } },
7182 { "(bad)", { XX } },
7183 { "(bad)", { XX } },
85f10a01 7184 /* b8 */
d5d7db8e
L
7185 { "(bad)", { XX } },
7186 { "(bad)", { XX } },
7187 { "(bad)", { XX } },
7188 { "(bad)", { XX } },
7189 { "(bad)", { XX } },
7190 { "(bad)", { XX } },
7191 { "(bad)", { XX } },
7192 { "(bad)", { XX } },
85f10a01 7193 /* c0 */
d5d7db8e
L
7194 { "(bad)", { XX } },
7195 { "(bad)", { XX } },
7196 { "(bad)", { XX } },
7197 { "(bad)", { XX } },
7198 { "(bad)", { XX } },
7199 { "(bad)", { XX } },
7200 { "(bad)", { XX } },
7201 { "(bad)", { XX } },
85f10a01 7202 /* c8 */
d5d7db8e
L
7203 { "(bad)", { XX } },
7204 { "(bad)", { XX } },
7205 { "(bad)", { XX } },
7206 { "(bad)", { XX } },
7207 { "(bad)", { XX } },
7208 { "(bad)", { XX } },
7209 { "(bad)", { XX } },
7210 { "(bad)", { XX } },
85f10a01 7211 /* d0 */
d5d7db8e
L
7212 { "(bad)", { XX } },
7213 { "(bad)", { XX } },
7214 { "(bad)", { XX } },
7215 { "(bad)", { XX } },
7216 { "(bad)", { XX } },
7217 { "(bad)", { XX } },
7218 { "(bad)", { XX } },
7219 { "(bad)", { XX } },
85f10a01 7220 /* d8 */
d5d7db8e
L
7221 { "(bad)", { XX } },
7222 { "(bad)", { XX } },
7223 { "(bad)", { XX } },
7224 { "(bad)", { XX } },
7225 { "(bad)", { XX } },
7226 { "(bad)", { XX } },
7227 { "(bad)", { XX } },
7228 { "(bad)", { XX } },
85f10a01 7229 /* e0 */
d5d7db8e
L
7230 { "(bad)", { XX } },
7231 { "(bad)", { XX } },
7232 { "(bad)", { XX } },
7233 { "(bad)", { XX } },
7234 { "(bad)", { XX } },
7235 { "(bad)", { XX } },
7236 { "(bad)", { XX } },
7237 { "(bad)", { XX } },
85f10a01 7238 /* e8 */
d5d7db8e
L
7239 { "(bad)", { XX } },
7240 { "(bad)", { XX } },
7241 { "(bad)", { XX } },
7242 { "(bad)", { XX } },
7243 { "(bad)", { XX } },
7244 { "(bad)", { XX } },
7245 { "(bad)", { XX } },
7246 { "(bad)", { XX } },
85f10a01 7247 /* f0 */
c0f3af97
L
7248 { "(bad)", { XX } },
7249 { "(bad)", { XX } },
d5d7db8e
L
7250 { "(bad)", { XX } },
7251 { "(bad)", { XX } },
7252 { "(bad)", { XX } },
7253 { "(bad)", { XX } },
7254 { "(bad)", { XX } },
7255 { "(bad)", { XX } },
85f10a01 7256 /* f8 */
d5d7db8e
L
7257 { "(bad)", { XX } },
7258 { "(bad)", { XX } },
7259 { "(bad)", { XX } },
7260 { "(bad)", { XX } },
7261 { "(bad)", { XX } },
7262 { "(bad)", { XX } },
7263 { "(bad)", { XX } },
7264 { "(bad)", { XX } },
85f10a01 7265 },
c0f3af97
L
7266};
7267
7268static const struct dis386 vex_table[][256] = {
7269 /* VEX_0F */
85f10a01
MM
7270 {
7271 /* 00 */
d5d7db8e
L
7272 { "(bad)", { XX } },
7273 { "(bad)", { XX } },
7274 { "(bad)", { XX } },
7275 { "(bad)", { XX } },
7276 { "(bad)", { XX } },
7277 { "(bad)", { XX } },
7278 { "(bad)", { XX } },
7279 { "(bad)", { XX } },
85f10a01 7280 /* 08 */
d5d7db8e
L
7281 { "(bad)", { XX } },
7282 { "(bad)", { XX } },
7283 { "(bad)", { XX } },
7284 { "(bad)", { XX } },
d5d7db8e
L
7285 { "(bad)", { XX } },
7286 { "(bad)", { XX } },
7287 { "(bad)", { XX } },
7288 { "(bad)", { XX } },
c0f3af97
L
7289 /* 10 */
7290 { PREFIX_TABLE (PREFIX_VEX_10) },
7291 { PREFIX_TABLE (PREFIX_VEX_11) },
7292 { PREFIX_TABLE (PREFIX_VEX_12) },
7293 { MOD_TABLE (MOD_VEX_13) },
7294 { "vunpcklpX", { XM, Vex, EXx } },
7295 { "vunpckhpX", { XM, Vex, EXx } },
7296 { PREFIX_TABLE (PREFIX_VEX_16) },
7297 { MOD_TABLE (MOD_VEX_17) },
7298 /* 18 */
d5d7db8e
L
7299 { "(bad)", { XX } },
7300 { "(bad)", { XX } },
7301 { "(bad)", { XX } },
d5d7db8e
L
7302 { "(bad)", { XX } },
7303 { "(bad)", { XX } },
7304 { "(bad)", { XX } },
7305 { "(bad)", { XX } },
7306 { "(bad)", { XX } },
c0f3af97 7307 /* 20 */
d5d7db8e
L
7308 { "(bad)", { XX } },
7309 { "(bad)", { XX } },
7310 { "(bad)", { XX } },
7311 { "(bad)", { XX } },
7312 { "(bad)", { XX } },
7313 { "(bad)", { XX } },
7314 { "(bad)", { XX } },
7315 { "(bad)", { XX } },
c0f3af97
L
7316 /* 28 */
7317 { "vmovapX", { XM, EXx } },
b6169b20 7318 { "vmovapX", { EXxS, XM } },
c0f3af97
L
7319 { PREFIX_TABLE (PREFIX_VEX_2A) },
7320 { MOD_TABLE (MOD_VEX_2B) },
7321 { PREFIX_TABLE (PREFIX_VEX_2C) },
7322 { PREFIX_TABLE (PREFIX_VEX_2D) },
7323 { PREFIX_TABLE (PREFIX_VEX_2E) },
7324 { PREFIX_TABLE (PREFIX_VEX_2F) },
85f10a01 7325 /* 30 */
d5d7db8e
L
7326 { "(bad)", { XX } },
7327 { "(bad)", { XX } },
7328 { "(bad)", { XX } },
7329 { "(bad)", { XX } },
7330 { "(bad)", { XX } },
7331 { "(bad)", { XX } },
7332 { "(bad)", { XX } },
7333 { "(bad)", { XX } },
4e7d34a6 7334 /* 38 */
d5d7db8e
L
7335 { "(bad)", { XX } },
7336 { "(bad)", { XX } },
7337 { "(bad)", { XX } },
7338 { "(bad)", { XX } },
7339 { "(bad)", { XX } },
7340 { "(bad)", { XX } },
7341 { "(bad)", { XX } },
7342 { "(bad)", { XX } },
7343 /* 40 */
c0f3af97
L
7344 { "(bad)", { XX } },
7345 { "(bad)", { XX } },
7346 { "(bad)", { XX } },
d5d7db8e
L
7347 { "(bad)", { XX } },
7348 { "(bad)", { XX } },
7349 { "(bad)", { XX } },
7350 { "(bad)", { XX } },
7351 { "(bad)", { XX } },
85f10a01 7352 /* 48 */
85f10a01
MM
7353 { "(bad)", { XX } },
7354 { "(bad)", { XX } },
7355 { "(bad)", { XX } },
7356 { "(bad)", { XX } },
7357 { "(bad)", { XX } },
7358 { "(bad)", { XX } },
7359 { "(bad)", { XX } },
7360 { "(bad)", { XX } },
d5d7db8e 7361 /* 50 */
c0f3af97
L
7362 { MOD_TABLE (MOD_VEX_51) },
7363 { PREFIX_TABLE (PREFIX_VEX_51) },
7364 { PREFIX_TABLE (PREFIX_VEX_52) },
7365 { PREFIX_TABLE (PREFIX_VEX_53) },
7366 { "vandpX", { XM, Vex, EXx } },
7367 { "vandnpX", { XM, Vex, EXx } },
7368 { "vorpX", { XM, Vex, EXx } },
7369 { "vxorpX", { XM, Vex, EXx } },
7370 /* 58 */
7371 { PREFIX_TABLE (PREFIX_VEX_58) },
7372 { PREFIX_TABLE (PREFIX_VEX_59) },
7373 { PREFIX_TABLE (PREFIX_VEX_5A) },
7374 { PREFIX_TABLE (PREFIX_VEX_5B) },
7375 { PREFIX_TABLE (PREFIX_VEX_5C) },
7376 { PREFIX_TABLE (PREFIX_VEX_5D) },
7377 { PREFIX_TABLE (PREFIX_VEX_5E) },
7378 { PREFIX_TABLE (PREFIX_VEX_5F) },
7379 /* 60 */
7380 { PREFIX_TABLE (PREFIX_VEX_60) },
7381 { PREFIX_TABLE (PREFIX_VEX_61) },
7382 { PREFIX_TABLE (PREFIX_VEX_62) },
7383 { PREFIX_TABLE (PREFIX_VEX_63) },
7384 { PREFIX_TABLE (PREFIX_VEX_64) },
7385 { PREFIX_TABLE (PREFIX_VEX_65) },
7386 { PREFIX_TABLE (PREFIX_VEX_66) },
7387 { PREFIX_TABLE (PREFIX_VEX_67) },
7388 /* 68 */
7389 { PREFIX_TABLE (PREFIX_VEX_68) },
7390 { PREFIX_TABLE (PREFIX_VEX_69) },
7391 { PREFIX_TABLE (PREFIX_VEX_6A) },
7392 { PREFIX_TABLE (PREFIX_VEX_6B) },
7393 { PREFIX_TABLE (PREFIX_VEX_6C) },
7394 { PREFIX_TABLE (PREFIX_VEX_6D) },
7395 { PREFIX_TABLE (PREFIX_VEX_6E) },
7396 { PREFIX_TABLE (PREFIX_VEX_6F) },
7397 /* 70 */
7398 { PREFIX_TABLE (PREFIX_VEX_70) },
7399 { REG_TABLE (REG_VEX_71) },
7400 { REG_TABLE (REG_VEX_72) },
7401 { REG_TABLE (REG_VEX_73) },
7402 { PREFIX_TABLE (PREFIX_VEX_74) },
7403 { PREFIX_TABLE (PREFIX_VEX_75) },
7404 { PREFIX_TABLE (PREFIX_VEX_76) },
7405 { PREFIX_TABLE (PREFIX_VEX_77) },
7406 /* 78 */
85f10a01
MM
7407 { "(bad)", { XX } },
7408 { "(bad)", { XX } },
7409 { "(bad)", { XX } },
7410 { "(bad)", { XX } },
c0f3af97
L
7411 { PREFIX_TABLE (PREFIX_VEX_7C) },
7412 { PREFIX_TABLE (PREFIX_VEX_7D) },
7413 { PREFIX_TABLE (PREFIX_VEX_7E) },
7414 { PREFIX_TABLE (PREFIX_VEX_7F) },
7415 /* 80 */
85f10a01
MM
7416 { "(bad)", { XX } },
7417 { "(bad)", { XX } },
7418 { "(bad)", { XX } },
7419 { "(bad)", { XX } },
85f10a01
MM
7420 { "(bad)", { XX } },
7421 { "(bad)", { XX } },
7422 { "(bad)", { XX } },
7423 { "(bad)", { XX } },
c0f3af97 7424 /* 88 */
85f10a01
MM
7425 { "(bad)", { XX } },
7426 { "(bad)", { XX } },
7427 { "(bad)", { XX } },
7428 { "(bad)", { XX } },
7429 { "(bad)", { XX } },
7430 { "(bad)", { XX } },
7431 { "(bad)", { XX } },
7432 { "(bad)", { XX } },
c0f3af97 7433 /* 90 */
85f10a01
MM
7434 { "(bad)", { XX } },
7435 { "(bad)", { XX } },
7436 { "(bad)", { XX } },
7437 { "(bad)", { XX } },
7438 { "(bad)", { XX } },
7439 { "(bad)", { XX } },
7440 { "(bad)", { XX } },
85f10a01 7441 { "(bad)", { XX } },
c0f3af97 7442 /* 98 */
85f10a01
MM
7443 { "(bad)", { XX } },
7444 { "(bad)", { XX } },
7445 { "(bad)", { XX } },
d5d7db8e
L
7446 { "(bad)", { XX } },
7447 { "(bad)", { XX } },
7448 { "(bad)", { XX } },
7449 { "(bad)", { XX } },
7450 { "(bad)", { XX } },
c0f3af97 7451 /* a0 */
d5d7db8e
L
7452 { "(bad)", { XX } },
7453 { "(bad)", { XX } },
7454 { "(bad)", { XX } },
7455 { "(bad)", { XX } },
7456 { "(bad)", { XX } },
7457 { "(bad)", { XX } },
7458 { "(bad)", { XX } },
7459 { "(bad)", { XX } },
c0f3af97 7460 /* a8 */
d5d7db8e
L
7461 { "(bad)", { XX } },
7462 { "(bad)", { XX } },
7463 { "(bad)", { XX } },
7464 { "(bad)", { XX } },
7465 { "(bad)", { XX } },
7466 { "(bad)", { XX } },
c0f3af97 7467 { REG_TABLE (REG_VEX_AE) },
d5d7db8e 7468 { "(bad)", { XX } },
c0f3af97 7469 /* b0 */
d5d7db8e 7470 { "(bad)", { XX } },
d5d7db8e
L
7471 { "(bad)", { XX } },
7472 { "(bad)", { XX } },
7473 { "(bad)", { XX } },
7474 { "(bad)", { XX } },
7475 { "(bad)", { XX } },
7476 { "(bad)", { XX } },
7477 { "(bad)", { XX } },
c0f3af97 7478 /* b8 */
d5d7db8e 7479 { "(bad)", { XX } },
d5d7db8e
L
7480 { "(bad)", { XX } },
7481 { "(bad)", { XX } },
7482 { "(bad)", { XX } },
7483 { "(bad)", { XX } },
7484 { "(bad)", { XX } },
7485 { "(bad)", { XX } },
7486 { "(bad)", { XX } },
c0f3af97 7487 /* c0 */
d5d7db8e 7488 { "(bad)", { XX } },
d5d7db8e 7489 { "(bad)", { XX } },
c0f3af97 7490 { PREFIX_TABLE (PREFIX_VEX_C2) },
d5d7db8e 7491 { "(bad)", { XX } },
c0f3af97
L
7492 { PREFIX_TABLE (PREFIX_VEX_C4) },
7493 { PREFIX_TABLE (PREFIX_VEX_C5) },
7494 { "vshufpX", { XM, Vex, EXx, Ib } },
d5d7db8e 7495 { "(bad)", { XX } },
c0f3af97 7496 /* c8 */
d5d7db8e
L
7497 { "(bad)", { XX } },
7498 { "(bad)", { XX } },
7499 { "(bad)", { XX } },
7500 { "(bad)", { XX } },
7501 { "(bad)", { XX } },
d5d7db8e
L
7502 { "(bad)", { XX } },
7503 { "(bad)", { XX } },
7504 { "(bad)", { XX } },
c0f3af97
L
7505 /* d0 */
7506 { PREFIX_TABLE (PREFIX_VEX_D0) },
7507 { PREFIX_TABLE (PREFIX_VEX_D1) },
7508 { PREFIX_TABLE (PREFIX_VEX_D2) },
7509 { PREFIX_TABLE (PREFIX_VEX_D3) },
7510 { PREFIX_TABLE (PREFIX_VEX_D4) },
7511 { PREFIX_TABLE (PREFIX_VEX_D5) },
7512 { PREFIX_TABLE (PREFIX_VEX_D6) },
7513 { PREFIX_TABLE (PREFIX_VEX_D7) },
7514 /* d8 */
7515 { PREFIX_TABLE (PREFIX_VEX_D8) },
7516 { PREFIX_TABLE (PREFIX_VEX_D9) },
7517 { PREFIX_TABLE (PREFIX_VEX_DA) },
7518 { PREFIX_TABLE (PREFIX_VEX_DB) },
7519 { PREFIX_TABLE (PREFIX_VEX_DC) },
7520 { PREFIX_TABLE (PREFIX_VEX_DD) },
7521 { PREFIX_TABLE (PREFIX_VEX_DE) },
7522 { PREFIX_TABLE (PREFIX_VEX_DF) },
7523 /* e0 */
7524 { PREFIX_TABLE (PREFIX_VEX_E0) },
7525 { PREFIX_TABLE (PREFIX_VEX_E1) },
7526 { PREFIX_TABLE (PREFIX_VEX_E2) },
7527 { PREFIX_TABLE (PREFIX_VEX_E3) },
7528 { PREFIX_TABLE (PREFIX_VEX_E4) },
7529 { PREFIX_TABLE (PREFIX_VEX_E5) },
7530 { PREFIX_TABLE (PREFIX_VEX_E6) },
7531 { PREFIX_TABLE (PREFIX_VEX_E7) },
7532 /* e8 */
7533 { PREFIX_TABLE (PREFIX_VEX_E8) },
7534 { PREFIX_TABLE (PREFIX_VEX_E9) },
7535 { PREFIX_TABLE (PREFIX_VEX_EA) },
7536 { PREFIX_TABLE (PREFIX_VEX_EB) },
7537 { PREFIX_TABLE (PREFIX_VEX_EC) },
7538 { PREFIX_TABLE (PREFIX_VEX_ED) },
7539 { PREFIX_TABLE (PREFIX_VEX_EE) },
7540 { PREFIX_TABLE (PREFIX_VEX_EF) },
7541 /* f0 */
7542 { PREFIX_TABLE (PREFIX_VEX_F0) },
7543 { PREFIX_TABLE (PREFIX_VEX_F1) },
7544 { PREFIX_TABLE (PREFIX_VEX_F2) },
7545 { PREFIX_TABLE (PREFIX_VEX_F3) },
7546 { PREFIX_TABLE (PREFIX_VEX_F4) },
7547 { PREFIX_TABLE (PREFIX_VEX_F5) },
7548 { PREFIX_TABLE (PREFIX_VEX_F6) },
7549 { PREFIX_TABLE (PREFIX_VEX_F7) },
7550 /* f8 */
7551 { PREFIX_TABLE (PREFIX_VEX_F8) },
7552 { PREFIX_TABLE (PREFIX_VEX_F9) },
7553 { PREFIX_TABLE (PREFIX_VEX_FA) },
7554 { PREFIX_TABLE (PREFIX_VEX_FB) },
7555 { PREFIX_TABLE (PREFIX_VEX_FC) },
7556 { PREFIX_TABLE (PREFIX_VEX_FD) },
7557 { PREFIX_TABLE (PREFIX_VEX_FE) },
d5d7db8e 7558 { "(bad)", { XX } },
c0f3af97
L
7559 },
7560 /* VEX_0F38 */
7561 {
7562 /* 00 */
7563 { PREFIX_TABLE (PREFIX_VEX_3800) },
7564 { PREFIX_TABLE (PREFIX_VEX_3801) },
7565 { PREFIX_TABLE (PREFIX_VEX_3802) },
7566 { PREFIX_TABLE (PREFIX_VEX_3803) },
7567 { PREFIX_TABLE (PREFIX_VEX_3804) },
7568 { PREFIX_TABLE (PREFIX_VEX_3805) },
7569 { PREFIX_TABLE (PREFIX_VEX_3806) },
7570 { PREFIX_TABLE (PREFIX_VEX_3807) },
7571 /* 08 */
7572 { PREFIX_TABLE (PREFIX_VEX_3808) },
7573 { PREFIX_TABLE (PREFIX_VEX_3809) },
7574 { PREFIX_TABLE (PREFIX_VEX_380A) },
7575 { PREFIX_TABLE (PREFIX_VEX_380B) },
7576 { PREFIX_TABLE (PREFIX_VEX_380C) },
7577 { PREFIX_TABLE (PREFIX_VEX_380D) },
7578 { PREFIX_TABLE (PREFIX_VEX_380E) },
7579 { PREFIX_TABLE (PREFIX_VEX_380F) },
7580 /* 10 */
d5d7db8e
L
7581 { "(bad)", { XX } },
7582 { "(bad)", { XX } },
7583 { "(bad)", { XX } },
7584 { "(bad)", { XX } },
d5d7db8e
L
7585 { "(bad)", { XX } },
7586 { "(bad)", { XX } },
7587 { "(bad)", { XX } },
c0f3af97
L
7588 { PREFIX_TABLE (PREFIX_VEX_3817) },
7589 /* 18 */
7590 { PREFIX_TABLE (PREFIX_VEX_3818) },
7591 { PREFIX_TABLE (PREFIX_VEX_3819) },
7592 { PREFIX_TABLE (PREFIX_VEX_381A) },
d5d7db8e 7593 { "(bad)", { XX } },
c0f3af97
L
7594 { PREFIX_TABLE (PREFIX_VEX_381C) },
7595 { PREFIX_TABLE (PREFIX_VEX_381D) },
7596 { PREFIX_TABLE (PREFIX_VEX_381E) },
d5d7db8e 7597 { "(bad)", { XX } },
c0f3af97
L
7598 /* 20 */
7599 { PREFIX_TABLE (PREFIX_VEX_3820) },
7600 { PREFIX_TABLE (PREFIX_VEX_3821) },
7601 { PREFIX_TABLE (PREFIX_VEX_3822) },
7602 { PREFIX_TABLE (PREFIX_VEX_3823) },
7603 { PREFIX_TABLE (PREFIX_VEX_3824) },
7604 { PREFIX_TABLE (PREFIX_VEX_3825) },
d5d7db8e
L
7605 { "(bad)", { XX } },
7606 { "(bad)", { XX } },
c0f3af97
L
7607 /* 28 */
7608 { PREFIX_TABLE (PREFIX_VEX_3828) },
7609 { PREFIX_TABLE (PREFIX_VEX_3829) },
7610 { PREFIX_TABLE (PREFIX_VEX_382A) },
7611 { PREFIX_TABLE (PREFIX_VEX_382B) },
7612 { PREFIX_TABLE (PREFIX_VEX_382C) },
7613 { PREFIX_TABLE (PREFIX_VEX_382D) },
7614 { PREFIX_TABLE (PREFIX_VEX_382E) },
7615 { PREFIX_TABLE (PREFIX_VEX_382F) },
7616 /* 30 */
7617 { PREFIX_TABLE (PREFIX_VEX_3830) },
7618 { PREFIX_TABLE (PREFIX_VEX_3831) },
7619 { PREFIX_TABLE (PREFIX_VEX_3832) },
7620 { PREFIX_TABLE (PREFIX_VEX_3833) },
7621 { PREFIX_TABLE (PREFIX_VEX_3834) },
7622 { PREFIX_TABLE (PREFIX_VEX_3835) },
7623 { "(bad)", { XX } },
7624 { PREFIX_TABLE (PREFIX_VEX_3837) },
7625 /* 38 */
7626 { PREFIX_TABLE (PREFIX_VEX_3838) },
7627 { PREFIX_TABLE (PREFIX_VEX_3839) },
7628 { PREFIX_TABLE (PREFIX_VEX_383A) },
7629 { PREFIX_TABLE (PREFIX_VEX_383B) },
7630 { PREFIX_TABLE (PREFIX_VEX_383C) },
7631 { PREFIX_TABLE (PREFIX_VEX_383D) },
7632 { PREFIX_TABLE (PREFIX_VEX_383E) },
7633 { PREFIX_TABLE (PREFIX_VEX_383F) },
7634 /* 40 */
7635 { PREFIX_TABLE (PREFIX_VEX_3840) },
7636 { PREFIX_TABLE (PREFIX_VEX_3841) },
d5d7db8e 7637 { "(bad)", { XX } },
d5d7db8e
L
7638 { "(bad)", { XX } },
7639 { "(bad)", { XX } },
7640 { "(bad)", { XX } },
7641 { "(bad)", { XX } },
7642 { "(bad)", { XX } },
c0f3af97 7643 /* 48 */
d5d7db8e
L
7644 { "(bad)", { XX } },
7645 { "(bad)", { XX } },
7646 { "(bad)", { XX } },
d5d7db8e
L
7647 { "(bad)", { XX } },
7648 { "(bad)", { XX } },
7649 { "(bad)", { XX } },
7650 { "(bad)", { XX } },
7651 { "(bad)", { XX } },
c0f3af97 7652 /* 50 */
d5d7db8e
L
7653 { "(bad)", { XX } },
7654 { "(bad)", { XX } },
7655 { "(bad)", { XX } },
d5d7db8e
L
7656 { "(bad)", { XX } },
7657 { "(bad)", { XX } },
7658 { "(bad)", { XX } },
7659 { "(bad)", { XX } },
7660 { "(bad)", { XX } },
c0f3af97 7661 /* 58 */
d5d7db8e
L
7662 { "(bad)", { XX } },
7663 { "(bad)", { XX } },
7664 { "(bad)", { XX } },
d5d7db8e
L
7665 { "(bad)", { XX } },
7666 { "(bad)", { XX } },
7667 { "(bad)", { XX } },
7668 { "(bad)", { XX } },
7669 { "(bad)", { XX } },
c0f3af97 7670 /* 60 */
d5d7db8e
L
7671 { "(bad)", { XX } },
7672 { "(bad)", { XX } },
7673 { "(bad)", { XX } },
d5d7db8e
L
7674 { "(bad)", { XX } },
7675 { "(bad)", { XX } },
7676 { "(bad)", { XX } },
7677 { "(bad)", { XX } },
7678 { "(bad)", { XX } },
c0f3af97 7679 /* 68 */
d5d7db8e
L
7680 { "(bad)", { XX } },
7681 { "(bad)", { XX } },
7682 { "(bad)", { XX } },
d5d7db8e
L
7683 { "(bad)", { XX } },
7684 { "(bad)", { XX } },
7685 { "(bad)", { XX } },
7686 { "(bad)", { XX } },
7687 { "(bad)", { XX } },
c0f3af97 7688 /* 70 */
d5d7db8e
L
7689 { "(bad)", { XX } },
7690 { "(bad)", { XX } },
7691 { "(bad)", { XX } },
d5d7db8e
L
7692 { "(bad)", { XX } },
7693 { "(bad)", { XX } },
7694 { "(bad)", { XX } },
7695 { "(bad)", { XX } },
7696 { "(bad)", { XX } },
c0f3af97 7697 /* 78 */
d5d7db8e
L
7698 { "(bad)", { XX } },
7699 { "(bad)", { XX } },
7700 { "(bad)", { XX } },
d5d7db8e
L
7701 { "(bad)", { XX } },
7702 { "(bad)", { XX } },
7703 { "(bad)", { XX } },
7704 { "(bad)", { XX } },
7705 { "(bad)", { XX } },
c0f3af97 7706 /* 80 */
d5d7db8e
L
7707 { "(bad)", { XX } },
7708 { "(bad)", { XX } },
7709 { "(bad)", { XX } },
d5d7db8e
L
7710 { "(bad)", { XX } },
7711 { "(bad)", { XX } },
7712 { "(bad)", { XX } },
7713 { "(bad)", { XX } },
7714 { "(bad)", { XX } },
c0f3af97 7715 /* 88 */
d5d7db8e
L
7716 { "(bad)", { XX } },
7717 { "(bad)", { XX } },
7718 { "(bad)", { XX } },
d5d7db8e
L
7719 { "(bad)", { XX } },
7720 { "(bad)", { XX } },
7721 { "(bad)", { XX } },
7722 { "(bad)", { XX } },
7723 { "(bad)", { XX } },
c0f3af97 7724 /* 90 */
d5d7db8e
L
7725 { "(bad)", { XX } },
7726 { "(bad)", { XX } },
7727 { "(bad)", { XX } },
d5d7db8e
L
7728 { "(bad)", { XX } },
7729 { "(bad)", { XX } },
7730 { "(bad)", { XX } },
0bfee649
L
7731 { PREFIX_TABLE (PREFIX_VEX_3896) },
7732 { PREFIX_TABLE (PREFIX_VEX_3897) },
c0f3af97 7733 /* 98 */
0bfee649
L
7734 { PREFIX_TABLE (PREFIX_VEX_3898) },
7735 { PREFIX_TABLE (PREFIX_VEX_3899) },
7736 { PREFIX_TABLE (PREFIX_VEX_389A) },
7737 { PREFIX_TABLE (PREFIX_VEX_389B) },
7738 { PREFIX_TABLE (PREFIX_VEX_389C) },
7739 { PREFIX_TABLE (PREFIX_VEX_389D) },
7740 { PREFIX_TABLE (PREFIX_VEX_389E) },
7741 { PREFIX_TABLE (PREFIX_VEX_389F) },
c0f3af97 7742 /* a0 */
d5d7db8e
L
7743 { "(bad)", { XX } },
7744 { "(bad)", { XX } },
7745 { "(bad)", { XX } },
d5d7db8e
L
7746 { "(bad)", { XX } },
7747 { "(bad)", { XX } },
7748 { "(bad)", { XX } },
0bfee649
L
7749 { PREFIX_TABLE (PREFIX_VEX_38A6) },
7750 { PREFIX_TABLE (PREFIX_VEX_38A7) },
c0f3af97 7751 /* a8 */
0bfee649
L
7752 { PREFIX_TABLE (PREFIX_VEX_38A8) },
7753 { PREFIX_TABLE (PREFIX_VEX_38A9) },
7754 { PREFIX_TABLE (PREFIX_VEX_38AA) },
7755 { PREFIX_TABLE (PREFIX_VEX_38AB) },
7756 { PREFIX_TABLE (PREFIX_VEX_38AC) },
7757 { PREFIX_TABLE (PREFIX_VEX_38AD) },
7758 { PREFIX_TABLE (PREFIX_VEX_38AE) },
7759 { PREFIX_TABLE (PREFIX_VEX_38AF) },
c0f3af97 7760 /* b0 */
d5d7db8e
L
7761 { "(bad)", { XX } },
7762 { "(bad)", { XX } },
7763 { "(bad)", { XX } },
7764 { "(bad)", { XX } },
7765 { "(bad)", { XX } },
7766 { "(bad)", { XX } },
0bfee649
L
7767 { PREFIX_TABLE (PREFIX_VEX_38B6) },
7768 { PREFIX_TABLE (PREFIX_VEX_38B7) },
c0f3af97 7769 /* b8 */
0bfee649
L
7770 { PREFIX_TABLE (PREFIX_VEX_38B8) },
7771 { PREFIX_TABLE (PREFIX_VEX_38B9) },
7772 { PREFIX_TABLE (PREFIX_VEX_38BA) },
7773 { PREFIX_TABLE (PREFIX_VEX_38BB) },
7774 { PREFIX_TABLE (PREFIX_VEX_38BC) },
7775 { PREFIX_TABLE (PREFIX_VEX_38BD) },
7776 { PREFIX_TABLE (PREFIX_VEX_38BE) },
7777 { PREFIX_TABLE (PREFIX_VEX_38BF) },
c0f3af97 7778 /* c0 */
d5d7db8e
L
7779 { "(bad)", { XX } },
7780 { "(bad)", { XX } },
7781 { "(bad)", { XX } },
7782 { "(bad)", { XX } },
d5d7db8e
L
7783 { "(bad)", { XX } },
7784 { "(bad)", { XX } },
7785 { "(bad)", { XX } },
7786 { "(bad)", { XX } },
c0f3af97 7787 /* c8 */
d5d7db8e
L
7788 { "(bad)", { XX } },
7789 { "(bad)", { XX } },
7790 { "(bad)", { XX } },
7791 { "(bad)", { XX } },
d5d7db8e 7792 { "(bad)", { XX } },
d5d7db8e
L
7793 { "(bad)", { XX } },
7794 { "(bad)", { XX } },
d5d7db8e 7795 { "(bad)", { XX } },
c0f3af97 7796 /* d0 */
d5d7db8e
L
7797 { "(bad)", { XX } },
7798 { "(bad)", { XX } },
d5d7db8e
L
7799 { "(bad)", { XX } },
7800 { "(bad)", { XX } },
7801 { "(bad)", { XX } },
7802 { "(bad)", { XX } },
d5d7db8e 7803 { "(bad)", { XX } },
d5d7db8e 7804 { "(bad)", { XX } },
c0f3af97 7805 /* d8 */
d5d7db8e 7806 { "(bad)", { XX } },
d5d7db8e
L
7807 { "(bad)", { XX } },
7808 { "(bad)", { XX } },
a5ff0eb2
L
7809 { PREFIX_TABLE (PREFIX_VEX_38DB) },
7810 { PREFIX_TABLE (PREFIX_VEX_38DC) },
7811 { PREFIX_TABLE (PREFIX_VEX_38DD) },
7812 { PREFIX_TABLE (PREFIX_VEX_38DE) },
7813 { PREFIX_TABLE (PREFIX_VEX_38DF) },
c0f3af97 7814 /* e0 */
d5d7db8e 7815 { "(bad)", { XX } },
d5d7db8e
L
7816 { "(bad)", { XX } },
7817 { "(bad)", { XX } },
7818 { "(bad)", { XX } },
7819 { "(bad)", { XX } },
d5d7db8e
L
7820 { "(bad)", { XX } },
7821 { "(bad)", { XX } },
7822 { "(bad)", { XX } },
c0f3af97 7823 /* e8 */
d5d7db8e
L
7824 { "(bad)", { XX } },
7825 { "(bad)", { XX } },
7826 { "(bad)", { XX } },
7827 { "(bad)", { XX } },
7828 { "(bad)", { XX } },
d5d7db8e
L
7829 { "(bad)", { XX } },
7830 { "(bad)", { XX } },
7831 { "(bad)", { XX } },
c0f3af97 7832 /* f0 */
d5d7db8e
L
7833 { "(bad)", { XX } },
7834 { "(bad)", { XX } },
7835 { "(bad)", { XX } },
7836 { "(bad)", { XX } },
7837 { "(bad)", { XX } },
d5d7db8e
L
7838 { "(bad)", { XX } },
7839 { "(bad)", { XX } },
7840 { "(bad)", { XX } },
c0f3af97 7841 /* f8 */
d5d7db8e
L
7842 { "(bad)", { XX } },
7843 { "(bad)", { XX } },
7844 { "(bad)", { XX } },
7845 { "(bad)", { XX } },
7846 { "(bad)", { XX } },
d5d7db8e
L
7847 { "(bad)", { XX } },
7848 { "(bad)", { XX } },
7849 { "(bad)", { XX } },
c0f3af97
L
7850 },
7851 /* VEX_0F3A */
7852 {
7853 /* 00 */
d5d7db8e
L
7854 { "(bad)", { XX } },
7855 { "(bad)", { XX } },
7856 { "(bad)", { XX } },
7857 { "(bad)", { XX } },
c0f3af97
L
7858 { PREFIX_TABLE (PREFIX_VEX_3A04) },
7859 { PREFIX_TABLE (PREFIX_VEX_3A05) },
7860 { PREFIX_TABLE (PREFIX_VEX_3A06) },
d5d7db8e 7861 { "(bad)", { XX } },
c0f3af97
L
7862 /* 08 */
7863 { PREFIX_TABLE (PREFIX_VEX_3A08) },
7864 { PREFIX_TABLE (PREFIX_VEX_3A09) },
7865 { PREFIX_TABLE (PREFIX_VEX_3A0A) },
7866 { PREFIX_TABLE (PREFIX_VEX_3A0B) },
7867 { PREFIX_TABLE (PREFIX_VEX_3A0C) },
7868 { PREFIX_TABLE (PREFIX_VEX_3A0D) },
7869 { PREFIX_TABLE (PREFIX_VEX_3A0E) },
7870 { PREFIX_TABLE (PREFIX_VEX_3A0F) },
7871 /* 10 */
d5d7db8e
L
7872 { "(bad)", { XX } },
7873 { "(bad)", { XX } },
7874 { "(bad)", { XX } },
7875 { "(bad)", { XX } },
c0f3af97
L
7876 { PREFIX_TABLE (PREFIX_VEX_3A14) },
7877 { PREFIX_TABLE (PREFIX_VEX_3A15) },
7878 { PREFIX_TABLE (PREFIX_VEX_3A16) },
7879 { PREFIX_TABLE (PREFIX_VEX_3A17) },
7880 /* 18 */
7881 { PREFIX_TABLE (PREFIX_VEX_3A18) },
7882 { PREFIX_TABLE (PREFIX_VEX_3A19) },
d5d7db8e
L
7883 { "(bad)", { XX } },
7884 { "(bad)", { XX } },
7885 { "(bad)", { XX } },
7886 { "(bad)", { XX } },
d5d7db8e
L
7887 { "(bad)", { XX } },
7888 { "(bad)", { XX } },
c0f3af97
L
7889 /* 20 */
7890 { PREFIX_TABLE (PREFIX_VEX_3A20) },
7891 { PREFIX_TABLE (PREFIX_VEX_3A21) },
7892 { PREFIX_TABLE (PREFIX_VEX_3A22) },
d5d7db8e
L
7893 { "(bad)", { XX } },
7894 { "(bad)", { XX } },
7895 { "(bad)", { XX } },
7896 { "(bad)", { XX } },
7897 { "(bad)", { XX } },
c0f3af97 7898 /* 28 */
d5d7db8e 7899 { "(bad)", { XX } },
d5d7db8e
L
7900 { "(bad)", { XX } },
7901 { "(bad)", { XX } },
7902 { "(bad)", { XX } },
7903 { "(bad)", { XX } },
7904 { "(bad)", { XX } },
7905 { "(bad)", { XX } },
7906 { "(bad)", { XX } },
c0f3af97 7907 /* 30 */
d5d7db8e 7908 { "(bad)", { XX } },
d5d7db8e
L
7909 { "(bad)", { XX } },
7910 { "(bad)", { XX } },
7911 { "(bad)", { XX } },
7912 { "(bad)", { XX } },
7913 { "(bad)", { XX } },
7914 { "(bad)", { XX } },
7915 { "(bad)", { XX } },
c0f3af97 7916 /* 38 */
d5d7db8e 7917 { "(bad)", { XX } },
d5d7db8e
L
7918 { "(bad)", { XX } },
7919 { "(bad)", { XX } },
7920 { "(bad)", { XX } },
7921 { "(bad)", { XX } },
7922 { "(bad)", { XX } },
7923 { "(bad)", { XX } },
7924 { "(bad)", { XX } },
c0f3af97
L
7925 /* 40 */
7926 { PREFIX_TABLE (PREFIX_VEX_3A40) },
7927 { PREFIX_TABLE (PREFIX_VEX_3A41) },
7928 { PREFIX_TABLE (PREFIX_VEX_3A42) },
d5d7db8e 7929 { "(bad)", { XX } },
ce2f5b3c 7930 { PREFIX_TABLE (PREFIX_VEX_3A44) },
d5d7db8e
L
7931 { "(bad)", { XX } },
7932 { "(bad)", { XX } },
7933 { "(bad)", { XX } },
c0f3af97 7934 /* 48 */
0bfee649
L
7935 { "(bad)", { XX } },
7936 { "(bad)", { XX } },
c0f3af97
L
7937 { PREFIX_TABLE (PREFIX_VEX_3A4A) },
7938 { PREFIX_TABLE (PREFIX_VEX_3A4B) },
7939 { PREFIX_TABLE (PREFIX_VEX_3A4C) },
d5d7db8e
L
7940 { "(bad)", { XX } },
7941 { "(bad)", { XX } },
7942 { "(bad)", { XX } },
c0f3af97 7943 /* 50 */
d5d7db8e 7944 { "(bad)", { XX } },
d5d7db8e
L
7945 { "(bad)", { XX } },
7946 { "(bad)", { XX } },
7947 { "(bad)", { XX } },
7948 { "(bad)", { XX } },
7949 { "(bad)", { XX } },
7950 { "(bad)", { XX } },
7951 { "(bad)", { XX } },
c0f3af97 7952 /* 58 */
d5d7db8e 7953 { "(bad)", { XX } },
d5d7db8e
L
7954 { "(bad)", { XX } },
7955 { "(bad)", { XX } },
7956 { "(bad)", { XX } },
922d8de8
DR
7957 { PREFIX_TABLE (PREFIX_VEX_3A5C) },
7958 { PREFIX_TABLE (PREFIX_VEX_3A5D) },
7959 { PREFIX_TABLE (PREFIX_VEX_3A5E) },
7960 { PREFIX_TABLE (PREFIX_VEX_3A5F) },
c0f3af97
L
7961 /* 60 */
7962 { PREFIX_TABLE (PREFIX_VEX_3A60) },
7963 { PREFIX_TABLE (PREFIX_VEX_3A61) },
7964 { PREFIX_TABLE (PREFIX_VEX_3A62) },
7965 { PREFIX_TABLE (PREFIX_VEX_3A63) },
d5d7db8e
L
7966 { "(bad)", { XX } },
7967 { "(bad)", { XX } },
7968 { "(bad)", { XX } },
7969 { "(bad)", { XX } },
c0f3af97 7970 /* 68 */
922d8de8
DR
7971 { PREFIX_TABLE (PREFIX_VEX_3A68) },
7972 { PREFIX_TABLE (PREFIX_VEX_3A69) },
7973 { PREFIX_TABLE (PREFIX_VEX_3A6A) },
7974 { PREFIX_TABLE (PREFIX_VEX_3A6B) },
7975 { PREFIX_TABLE (PREFIX_VEX_3A6C) },
7976 { PREFIX_TABLE (PREFIX_VEX_3A6D) },
7977 { PREFIX_TABLE (PREFIX_VEX_3A6E) },
7978 { PREFIX_TABLE (PREFIX_VEX_3A6F) },
c0f3af97 7979 /* 70 */
d5d7db8e 7980 { "(bad)", { XX } },
d5d7db8e
L
7981 { "(bad)", { XX } },
7982 { "(bad)", { XX } },
7983 { "(bad)", { XX } },
7984 { "(bad)", { XX } },
7985 { "(bad)", { XX } },
7986 { "(bad)", { XX } },
7987 { "(bad)", { XX } },
c0f3af97 7988 /* 78 */
922d8de8
DR
7989 { PREFIX_TABLE (PREFIX_VEX_3A78) },
7990 { PREFIX_TABLE (PREFIX_VEX_3A79) },
7991 { PREFIX_TABLE (PREFIX_VEX_3A7A) },
7992 { PREFIX_TABLE (PREFIX_VEX_3A7B) },
7993 { PREFIX_TABLE (PREFIX_VEX_3A7C) },
7994 { PREFIX_TABLE (PREFIX_VEX_3A7D) },
7995 { PREFIX_TABLE (PREFIX_VEX_3A7E) },
7996 { PREFIX_TABLE (PREFIX_VEX_3A7F) },
c0f3af97 7997 /* 80 */
d5d7db8e 7998 { "(bad)", { XX } },
d5d7db8e
L
7999 { "(bad)", { XX } },
8000 { "(bad)", { XX } },
8001 { "(bad)", { XX } },
8002 { "(bad)", { XX } },
8003 { "(bad)", { XX } },
8004 { "(bad)", { XX } },
8005 { "(bad)", { XX } },
c0f3af97 8006 /* 88 */
d5d7db8e 8007 { "(bad)", { XX } },
d5d7db8e
L
8008 { "(bad)", { XX } },
8009 { "(bad)", { XX } },
8010 { "(bad)", { XX } },
8011 { "(bad)", { XX } },
8012 { "(bad)", { XX } },
8013 { "(bad)", { XX } },
8014 { "(bad)", { XX } },
c0f3af97 8015 /* 90 */
d5d7db8e 8016 { "(bad)", { XX } },
d5d7db8e
L
8017 { "(bad)", { XX } },
8018 { "(bad)", { XX } },
8019 { "(bad)", { XX } },
8020 { "(bad)", { XX } },
8021 { "(bad)", { XX } },
8022 { "(bad)", { XX } },
8023 { "(bad)", { XX } },
c0f3af97 8024 /* 98 */
d5d7db8e 8025 { "(bad)", { XX } },
d5d7db8e
L
8026 { "(bad)", { XX } },
8027 { "(bad)", { XX } },
8028 { "(bad)", { XX } },
8029 { "(bad)", { XX } },
8030 { "(bad)", { XX } },
8031 { "(bad)", { XX } },
8032 { "(bad)", { XX } },
c0f3af97 8033 /* a0 */
d5d7db8e 8034 { "(bad)", { XX } },
85f10a01
MM
8035 { "(bad)", { XX } },
8036 { "(bad)", { XX } },
d5d7db8e
L
8037 { "(bad)", { XX } },
8038 { "(bad)", { XX } },
8039 { "(bad)", { XX } },
8040 { "(bad)", { XX } },
8041 { "(bad)", { XX } },
c0f3af97 8042 /* a8 */
d5d7db8e 8043 { "(bad)", { XX } },
d5d7db8e
L
8044 { "(bad)", { XX } },
8045 { "(bad)", { XX } },
8046 { "(bad)", { XX } },
8047 { "(bad)", { XX } },
8048 { "(bad)", { XX } },
8049 { "(bad)", { XX } },
8050 { "(bad)", { XX } },
c0f3af97
L
8051 /* b0 */
8052 { "(bad)", { XX } },
8053 { "(bad)", { XX } },
8054 { "(bad)", { XX } },
8055 { "(bad)", { XX } },
8056 { "(bad)", { XX } },
8057 { "(bad)", { XX } },
8058 { "(bad)", { XX } },
8059 { "(bad)", { XX } },
8060 /* b8 */
8061 { "(bad)", { XX } },
8062 { "(bad)", { XX } },
8063 { "(bad)", { XX } },
8064 { "(bad)", { XX } },
8065 { "(bad)", { XX } },
8066 { "(bad)", { XX } },
8067 { "(bad)", { XX } },
8068 { "(bad)", { XX } },
8069 /* c0 */
8070 { "(bad)", { XX } },
8071 { "(bad)", { XX } },
8072 { "(bad)", { XX } },
8073 { "(bad)", { XX } },
8074 { "(bad)", { XX } },
8075 { "(bad)", { XX } },
8076 { "(bad)", { XX } },
8077 { "(bad)", { XX } },
8078 /* c8 */
8079 { "(bad)", { XX } },
8080 { "(bad)", { XX } },
d5d7db8e 8081 { "(bad)", { XX } },
d5d7db8e
L
8082 { "(bad)", { XX } },
8083 { "(bad)", { XX } },
8084 { "(bad)", { XX } },
8085 { "(bad)", { XX } },
8086 { "(bad)", { XX } },
c0f3af97
L
8087 /* d0 */
8088 { "(bad)", { XX } },
8089 { "(bad)", { XX } },
8090 { "(bad)", { XX } },
d5d7db8e
L
8091 { "(bad)", { XX } },
8092 { "(bad)", { XX } },
8093 { "(bad)", { XX } },
c0f3af97
L
8094 { "(bad)", { XX } },
8095 { "(bad)", { XX } },
8096 /* d8 */
8097 { "(bad)", { XX } },
d5d7db8e
L
8098 { "(bad)", { XX } },
8099 { "(bad)", { XX } },
8100 { "(bad)", { XX } },
8101 { "(bad)", { XX } },
8102 { "(bad)", { XX } },
8103 { "(bad)", { XX } },
a5ff0eb2 8104 { PREFIX_TABLE (PREFIX_VEX_3ADF) },
c0f3af97 8105 /* e0 */
d5d7db8e 8106 { "(bad)", { XX } },
d5d7db8e
L
8107 { "(bad)", { XX } },
8108 { "(bad)", { XX } },
8109 { "(bad)", { XX } },
8110 { "(bad)", { XX } },
8111 { "(bad)", { XX } },
8112 { "(bad)", { XX } },
8113 { "(bad)", { XX } },
c0f3af97 8114 /* e8 */
d5d7db8e 8115 { "(bad)", { XX } },
d5d7db8e
L
8116 { "(bad)", { XX } },
8117 { "(bad)", { XX } },
8118 { "(bad)", { XX } },
8119 { "(bad)", { XX } },
8120 { "(bad)", { XX } },
8121 { "(bad)", { XX } },
8122 { "(bad)", { XX } },
c0f3af97 8123 /* f0 */
d5d7db8e 8124 { "(bad)", { XX } },
d5d7db8e
L
8125 { "(bad)", { XX } },
8126 { "(bad)", { XX } },
8127 { "(bad)", { XX } },
8128 { "(bad)", { XX } },
8129 { "(bad)", { XX } },
8130 { "(bad)", { XX } },
8131 { "(bad)", { XX } },
c0f3af97 8132 /* f8 */
d5d7db8e 8133 { "(bad)", { XX } },
d5d7db8e
L
8134 { "(bad)", { XX } },
8135 { "(bad)", { XX } },
8136 { "(bad)", { XX } },
8137 { "(bad)", { XX } },
8138 { "(bad)", { XX } },
8139 { "(bad)", { XX } },
8140 { "(bad)", { XX } },
c0f3af97
L
8141 },
8142};
8143
8144static const struct dis386 vex_len_table[][2] = {
8145 /* VEX_LEN_10_P_1 */
8146 {
8147 { "vmovss", { XMVex, Vex128, EXd } },
d5d7db8e 8148 { "(bad)", { XX } },
c0f3af97
L
8149 },
8150
8151 /* VEX_LEN_10_P_3 */
8152 {
8153 { "vmovsd", { XMVex, Vex128, EXq } },
d5d7db8e 8154 { "(bad)", { XX } },
c0f3af97
L
8155 },
8156
8157 /* VEX_LEN_11_P_1 */
8158 {
fa99fab2 8159 { "vmovss", { EXdVexS, Vex128, XM } },
d5d7db8e 8160 { "(bad)", { XX } },
c0f3af97
L
8161 },
8162
8163 /* VEX_LEN_11_P_3 */
8164 {
fa99fab2 8165 { "vmovsd", { EXqVexS, Vex128, XM } },
d5d7db8e 8166 { "(bad)", { XX } },
c0f3af97
L
8167 },
8168
8169 /* VEX_LEN_12_P_0_M_0 */
8170 {
8171 { "vmovlps", { XM, Vex128, EXq } },
d5d7db8e 8172 { "(bad)", { XX } },
c0f3af97
L
8173 },
8174
8175 /* VEX_LEN_12_P_0_M_1 */
8176 {
8177 { "vmovhlps", { XM, Vex128, EXq } },
d5d7db8e 8178 { "(bad)", { XX } },
c0f3af97
L
8179 },
8180
8181 /* VEX_LEN_12_P_2 */
8182 {
8183 { "vmovlpd", { XM, Vex128, EXq } },
d5d7db8e 8184 { "(bad)", { XX } },
c0f3af97
L
8185 },
8186
8187 /* VEX_LEN_13_M_0 */
8188 {
8189 { "vmovlpX", { EXq, XM } },
85f10a01 8190 { "(bad)", { XX } },
c0f3af97
L
8191 },
8192
8193 /* VEX_LEN_16_P_0_M_0 */
8194 {
8195 { "vmovhps", { XM, Vex128, EXq } },
85f10a01 8196 { "(bad)", { XX } },
c0f3af97
L
8197 },
8198
8199 /* VEX_LEN_16_P_0_M_1 */
8200 {
8201 { "vmovlhps", { XM, Vex128, EXq } },
85f10a01 8202 { "(bad)", { XX } },
c0f3af97
L
8203 },
8204
8205 /* VEX_LEN_16_P_2 */
8206 {
8207 { "vmovhpd", { XM, Vex128, EXq } },
85f10a01 8208 { "(bad)", { XX } },
c0f3af97
L
8209 },
8210
8211 /* VEX_LEN_17_M_0 */
8212 {
8213 { "vmovhpX", { EXq, XM } },
85f10a01 8214 { "(bad)", { XX } },
c0f3af97
L
8215 },
8216
8217 /* VEX_LEN_2A_P_1 */
8218 {
8219 { "vcvtsi2ss%LQ", { XM, Vex128, Ev } },
d5d7db8e 8220 { "(bad)", { XX } },
c0f3af97
L
8221 },
8222
8223 /* VEX_LEN_2A_P_3 */
8224 {
8225 { "vcvtsi2sd%LQ", { XM, Vex128, Ev } },
d5d7db8e 8226 { "(bad)", { XX } },
c0f3af97
L
8227 },
8228
c0f3af97
L
8229 /* VEX_LEN_2C_P_1 */
8230 {
8231 { "vcvttss2siY", { Gv, EXd } },
d5d7db8e 8232 { "(bad)", { XX } },
c0f3af97
L
8233 },
8234
8235 /* VEX_LEN_2C_P_3 */
8236 {
8237 { "vcvttsd2siY", { Gv, EXq } },
d5d7db8e 8238 { "(bad)", { XX } },
c0f3af97
L
8239 },
8240
8241 /* VEX_LEN_2D_P_1 */
8242 {
8243 { "vcvtss2siY", { Gv, EXd } },
85f10a01 8244 { "(bad)", { XX } },
c0f3af97
L
8245 },
8246
8247 /* VEX_LEN_2D_P_3 */
8248 {
8249 { "vcvtsd2siY", { Gv, EXq } },
d5d7db8e 8250 { "(bad)", { XX } },
c0f3af97
L
8251 },
8252
8253 /* VEX_LEN_2E_P_0 */
8254 {
8255 { "vucomiss", { XM, EXd } },
d5d7db8e 8256 { "(bad)", { XX } },
c0f3af97
L
8257 },
8258
8259 /* VEX_LEN_2E_P_2 */
8260 {
8261 { "vucomisd", { XM, EXq } },
d5d7db8e 8262 { "(bad)", { XX } },
c0f3af97
L
8263 },
8264
8265 /* VEX_LEN_2F_P_0 */
8266 {
8267 { "vcomiss", { XM, EXd } },
d5d7db8e 8268 { "(bad)", { XX } },
c0f3af97
L
8269 },
8270
8271 /* VEX_LEN_2F_P_2 */
8272 {
8273 { "vcomisd", { XM, EXq } },
d5d7db8e 8274 { "(bad)", { XX } },
c0f3af97
L
8275 },
8276
8277 /* VEX_LEN_51_P_1 */
8278 {
8279 { "vsqrtss", { XM, Vex128, EXd } },
d5d7db8e 8280 { "(bad)", { XX } },
c0f3af97
L
8281 },
8282
8283 /* VEX_LEN_51_P_3 */
8284 {
8285 { "vsqrtsd", { XM, Vex128, EXq } },
d5d7db8e 8286 { "(bad)", { XX } },
c0f3af97
L
8287 },
8288
8289 /* VEX_LEN_52_P_1 */
8290 {
8291 { "vrsqrtss", { XM, Vex128, EXd } },
d5d7db8e 8292 { "(bad)", { XX } },
c0f3af97
L
8293 },
8294
8295 /* VEX_LEN_53_P_1 */
8296 {
8297 { "vrcpss", { XM, Vex128, EXd } },
d5d7db8e 8298 { "(bad)", { XX } },
c0f3af97
L
8299 },
8300
8301 /* VEX_LEN_58_P_1 */
8302 {
8303 { "vaddss", { XM, Vex128, EXd } },
d5d7db8e 8304 { "(bad)", { XX } },
c0f3af97
L
8305 },
8306
8307 /* VEX_LEN_58_P_3 */
8308 {
8309 { "vaddsd", { XM, Vex128, EXq } },
d5d7db8e 8310 { "(bad)", { XX } },
c0f3af97
L
8311 },
8312
8313 /* VEX_LEN_59_P_1 */
8314 {
8315 { "vmulss", { XM, Vex128, EXd } },
d5d7db8e 8316 { "(bad)", { XX } },
c0f3af97
L
8317 },
8318
8319 /* VEX_LEN_59_P_3 */
8320 {
8321 { "vmulsd", { XM, Vex128, EXq } },
d5d7db8e 8322 { "(bad)", { XX } },
c0f3af97
L
8323 },
8324
8325 /* VEX_LEN_5A_P_1 */
8326 {
8327 { "vcvtss2sd", { XM, Vex128, EXd } },
d5d7db8e 8328 { "(bad)", { XX } },
c0f3af97
L
8329 },
8330
8331 /* VEX_LEN_5A_P_3 */
8332 {
8333 { "vcvtsd2ss", { XM, Vex128, EXq } },
d5d7db8e 8334 { "(bad)", { XX } },
c0f3af97
L
8335 },
8336
8337 /* VEX_LEN_5C_P_1 */
8338 {
8339 { "vsubss", { XM, Vex128, EXd } },
d5d7db8e 8340 { "(bad)", { XX } },
c0f3af97
L
8341 },
8342
8343 /* VEX_LEN_5C_P_3 */
8344 {
8345 { "vsubsd", { XM, Vex128, EXq } },
d5d7db8e 8346 { "(bad)", { XX } },
c0f3af97
L
8347 },
8348
8349 /* VEX_LEN_5D_P_1 */
8350 {
8351 { "vminss", { XM, Vex128, EXd } },
d5d7db8e 8352 { "(bad)", { XX } },
c0f3af97
L
8353 },
8354
8355 /* VEX_LEN_5D_P_3 */
8356 {
8357 { "vminsd", { XM, Vex128, EXq } },
d5d7db8e 8358 { "(bad)", { XX } },
c0f3af97
L
8359 },
8360
8361 /* VEX_LEN_5E_P_1 */
8362 {
8363 { "vdivss", { XM, Vex128, EXd } },
85f10a01 8364 { "(bad)", { XX } },
c0f3af97
L
8365 },
8366
8367 /* VEX_LEN_5E_P_3 */
8368 {
8369 { "vdivsd", { XM, Vex128, EXq } },
85f10a01 8370 { "(bad)", { XX } },
c0f3af97
L
8371 },
8372
8373 /* VEX_LEN_5F_P_1 */
8374 {
8375 { "vmaxss", { XM, Vex128, EXd } },
85f10a01 8376 { "(bad)", { XX } },
c0f3af97
L
8377 },
8378
8379 /* VEX_LEN_5F_P_3 */
8380 {
8381 { "vmaxsd", { XM, Vex128, EXq } },
85f10a01 8382 { "(bad)", { XX } },
c0f3af97
L
8383 },
8384
8385 /* VEX_LEN_60_P_2 */
8386 {
8387 { "vpunpcklbw", { XM, Vex128, EXx } },
d5d7db8e 8388 { "(bad)", { XX } },
c0f3af97
L
8389 },
8390
8391 /* VEX_LEN_61_P_2 */
8392 {
8393 { "vpunpcklwd", { XM, Vex128, EXx } },
d5d7db8e 8394 { "(bad)", { XX } },
c0f3af97
L
8395 },
8396
8397 /* VEX_LEN_62_P_2 */
8398 {
8399 { "vpunpckldq", { XM, Vex128, EXx } },
d5d7db8e 8400 { "(bad)", { XX } },
c0f3af97
L
8401 },
8402
8403 /* VEX_LEN_63_P_2 */
8404 {
8405 { "vpacksswb", { XM, Vex128, EXx } },
d5d7db8e 8406 { "(bad)", { XX } },
c0f3af97
L
8407 },
8408
8409 /* VEX_LEN_64_P_2 */
8410 {
8411 { "vpcmpgtb", { XM, Vex128, EXx } },
d5d7db8e 8412 { "(bad)", { XX } },
c0f3af97
L
8413 },
8414
8415 /* VEX_LEN_65_P_2 */
8416 {
8417 { "vpcmpgtw", { XM, Vex128, EXx } },
d5d7db8e 8418 { "(bad)", { XX } },
c0f3af97
L
8419 },
8420
8421 /* VEX_LEN_66_P_2 */
8422 {
8423 { "vpcmpgtd", { XM, Vex128, EXx } },
d5d7db8e 8424 { "(bad)", { XX } },
c0f3af97
L
8425 },
8426
8427 /* VEX_LEN_67_P_2 */
8428 {
8429 { "vpackuswb", { XM, Vex128, EXx } },
d5d7db8e 8430 { "(bad)", { XX } },
c0f3af97
L
8431 },
8432
8433 /* VEX_LEN_68_P_2 */
8434 {
8435 { "vpunpckhbw", { XM, Vex128, EXx } },
d5d7db8e 8436 { "(bad)", { XX } },
c0f3af97
L
8437 },
8438
8439 /* VEX_LEN_69_P_2 */
8440 {
8441 { "vpunpckhwd", { XM, Vex128, EXx } },
d5d7db8e 8442 { "(bad)", { XX } },
c0f3af97
L
8443 },
8444
8445 /* VEX_LEN_6A_P_2 */
8446 {
8447 { "vpunpckhdq", { XM, Vex128, EXx } },
d5d7db8e 8448 { "(bad)", { XX } },
c0f3af97
L
8449 },
8450
8451 /* VEX_LEN_6B_P_2 */
8452 {
8453 { "vpackssdw", { XM, Vex128, EXx } },
d5d7db8e 8454 { "(bad)", { XX } },
c0f3af97
L
8455 },
8456
8457 /* VEX_LEN_6C_P_2 */
8458 {
8459 { "vpunpcklqdq", { XM, Vex128, EXx } },
d5d7db8e 8460 { "(bad)", { XX } },
c0f3af97
L
8461 },
8462
8463 /* VEX_LEN_6D_P_2 */
8464 {
8465 { "vpunpckhqdq", { XM, Vex128, EXx } },
d5d7db8e 8466 { "(bad)", { XX } },
c0f3af97
L
8467 },
8468
8469 /* VEX_LEN_6E_P_2 */
8470 {
8471 { "vmovK", { XM, Edq } },
d5d7db8e 8472 { "(bad)", { XX } },
c0f3af97
L
8473 },
8474
8475 /* VEX_LEN_70_P_1 */
8476 {
8477 { "vpshufhw", { XM, EXx, Ib } },
d5d7db8e 8478 { "(bad)", { XX } },
c0f3af97
L
8479 },
8480
8481 /* VEX_LEN_70_P_2 */
8482 {
8483 { "vpshufd", { XM, EXx, Ib } },
d5d7db8e 8484 { "(bad)", { XX } },
c0f3af97
L
8485 },
8486
8487 /* VEX_LEN_70_P_3 */
8488 {
8489 { "vpshuflw", { XM, EXx, Ib } },
d5d7db8e 8490 { "(bad)", { XX } },
c0f3af97
L
8491 },
8492
8493 /* VEX_LEN_71_R_2_P_2 */
8494 {
8495 { "vpsrlw", { Vex128, XS, Ib } },
d5d7db8e 8496 { "(bad)", { XX } },
c0f3af97
L
8497 },
8498
8499 /* VEX_LEN_71_R_4_P_2 */
8500 {
8501 { "vpsraw", { Vex128, XS, Ib } },
d5d7db8e 8502 { "(bad)", { XX } },
c0f3af97
L
8503 },
8504
8505 /* VEX_LEN_71_R_6_P_2 */
8506 {
8507 { "vpsllw", { Vex128, XS, Ib } },
d5d7db8e 8508 { "(bad)", { XX } },
c0f3af97
L
8509 },
8510
8511 /* VEX_LEN_72_R_2_P_2 */
8512 {
8513 { "vpsrld", { Vex128, XS, Ib } },
d5d7db8e 8514 { "(bad)", { XX } },
c0f3af97
L
8515 },
8516
8517 /* VEX_LEN_72_R_4_P_2 */
8518 {
8519 { "vpsrad", { Vex128, XS, Ib } },
d5d7db8e 8520 { "(bad)", { XX } },
c0f3af97
L
8521 },
8522
8523 /* VEX_LEN_72_R_6_P_2 */
8524 {
8525 { "vpslld", { Vex128, XS, Ib } },
d5d7db8e 8526 { "(bad)", { XX } },
c0f3af97
L
8527 },
8528
8529 /* VEX_LEN_73_R_2_P_2 */
8530 {
8531 { "vpsrlq", { Vex128, XS, Ib } },
d5d7db8e 8532 { "(bad)", { XX } },
c0f3af97
L
8533 },
8534
8535 /* VEX_LEN_73_R_3_P_2 */
8536 {
8537 { "vpsrldq", { Vex128, XS, Ib } },
d5d7db8e 8538 { "(bad)", { XX } },
c0f3af97
L
8539 },
8540
8541 /* VEX_LEN_73_R_6_P_2 */
8542 {
8543 { "vpsllq", { Vex128, XS, Ib } },
d5d7db8e 8544 { "(bad)", { XX } },
c0f3af97
L
8545 },
8546
8547 /* VEX_LEN_73_R_7_P_2 */
8548 {
8549 { "vpslldq", { Vex128, XS, Ib } },
d5d7db8e 8550 { "(bad)", { XX } },
c0f3af97
L
8551 },
8552
8553 /* VEX_LEN_74_P_2 */
8554 {
8555 { "vpcmpeqb", { XM, Vex128, EXx } },
d5d7db8e 8556 { "(bad)", { XX } },
c0f3af97
L
8557 },
8558
8559 /* VEX_LEN_75_P_2 */
8560 {
8561 { "vpcmpeqw", { XM, Vex128, EXx } },
d5d7db8e 8562 { "(bad)", { XX } },
c0f3af97
L
8563 },
8564
8565 /* VEX_LEN_76_P_2 */
8566 {
8567 { "vpcmpeqd", { XM, Vex128, EXx } },
d5d7db8e 8568 { "(bad)", { XX } },
c0f3af97
L
8569 },
8570
8571 /* VEX_LEN_7E_P_1 */
8572 {
8573 { "vmovq", { XM, EXq } },
d5d7db8e 8574 { "(bad)", { XX } },
c0f3af97
L
8575 },
8576
8577 /* VEX_LEN_7E_P_2 */
8578 {
8579 { "vmovK", { Edq, XM } },
d5d7db8e 8580 { "(bad)", { XX } },
c0f3af97
L
8581 },
8582
9daa0d29 8583 /* VEX_LEN_AE_R_2_M_0 */
c0f3af97
L
8584 {
8585 { "vldmxcsr", { Md } },
d5d7db8e 8586 { "(bad)", { XX } },
c0f3af97
L
8587 },
8588
9daa0d29 8589 /* VEX_LEN_AE_R_3_M_0 */
c0f3af97
L
8590 {
8591 { "vstmxcsr", { Md } },
d5d7db8e 8592 { "(bad)", { XX } },
c0f3af97
L
8593 },
8594
8595 /* VEX_LEN_C2_P_1 */
8596 {
8597 { "vcmpss", { XM, Vex128, EXd, VCMP } },
d5d7db8e 8598 { "(bad)", { XX } },
c0f3af97
L
8599 },
8600
8601 /* VEX_LEN_C2_P_3 */
8602 {
8603 { "vcmpsd", { XM, Vex128, EXq, VCMP } },
d5d7db8e 8604 { "(bad)", { XX } },
c0f3af97
L
8605 },
8606
8607 /* VEX_LEN_C4_P_2 */
8608 {
8609 { "vpinsrw", { XM, Vex128, Edqw, Ib } },
d5d7db8e 8610 { "(bad)", { XX } },
c0f3af97
L
8611 },
8612
8613 /* VEX_LEN_C5_P_2 */
8614 {
8615 { "vpextrw", { Gdq, XS, Ib } },
d5d7db8e 8616 { "(bad)", { XX } },
c0f3af97
L
8617 },
8618
8619 /* VEX_LEN_D1_P_2 */
8620 {
8621 { "vpsrlw", { XM, Vex128, EXx } },
d5d7db8e 8622 { "(bad)", { XX } },
c0f3af97
L
8623 },
8624
8625 /* VEX_LEN_D2_P_2 */
8626 {
8627 { "vpsrld", { XM, Vex128, EXx } },
d5d7db8e 8628 { "(bad)", { XX } },
c0f3af97
L
8629 },
8630
8631 /* VEX_LEN_D3_P_2 */
8632 {
8633 { "vpsrlq", { XM, Vex128, EXx } },
d5d7db8e 8634 { "(bad)", { XX } },
c0f3af97
L
8635 },
8636
8637 /* VEX_LEN_D4_P_2 */
8638 {
8639 { "vpaddq", { XM, Vex128, EXx } },
d5d7db8e 8640 { "(bad)", { XX } },
c0f3af97
L
8641 },
8642
8643 /* VEX_LEN_D5_P_2 */
8644 {
8645 { "vpmullw", { XM, Vex128, EXx } },
d5d7db8e 8646 { "(bad)", { XX } },
c0f3af97
L
8647 },
8648
8649 /* VEX_LEN_D6_P_2 */
8650 {
b6169b20 8651 { "vmovq", { EXqS, XM } },
d5d7db8e 8652 { "(bad)", { XX } },
c0f3af97
L
8653 },
8654
8655 /* VEX_LEN_D7_P_2_M_1 */
8656 {
8657 { "vpmovmskb", { Gdq, XS } },
d5d7db8e 8658 { "(bad)", { XX } },
c0f3af97
L
8659 },
8660
8661 /* VEX_LEN_D8_P_2 */
8662 {
8663 { "vpsubusb", { XM, Vex128, EXx } },
d5d7db8e 8664 { "(bad)", { XX } },
c0f3af97
L
8665 },
8666
8667 /* VEX_LEN_D9_P_2 */
8668 {
8669 { "vpsubusw", { XM, Vex128, EXx } },
d5d7db8e 8670 { "(bad)", { XX } },
c0f3af97
L
8671 },
8672
8673 /* VEX_LEN_DA_P_2 */
8674 {
8675 { "vpminub", { XM, Vex128, EXx } },
d5d7db8e 8676 { "(bad)", { XX } },
c0f3af97
L
8677 },
8678
8679 /* VEX_LEN_DB_P_2 */
8680 {
8681 { "vpand", { XM, Vex128, EXx } },
d5d7db8e 8682 { "(bad)", { XX } },
c0f3af97
L
8683 },
8684
8685 /* VEX_LEN_DC_P_2 */
8686 {
8687 { "vpaddusb", { XM, Vex128, EXx } },
d5d7db8e 8688 { "(bad)", { XX } },
c0f3af97
L
8689 },
8690
8691 /* VEX_LEN_DD_P_2 */
8692 {
8693 { "vpaddusw", { XM, Vex128, EXx } },
d5d7db8e 8694 { "(bad)", { XX } },
c0f3af97
L
8695 },
8696
8697 /* VEX_LEN_DE_P_2 */
8698 {
8699 { "vpmaxub", { XM, Vex128, EXx } },
d5d7db8e 8700 { "(bad)", { XX } },
c0f3af97
L
8701 },
8702
8703 /* VEX_LEN_DF_P_2 */
8704 {
8705 { "vpandn", { XM, Vex128, EXx } },
d5d7db8e 8706 { "(bad)", { XX } },
c0f3af97
L
8707 },
8708
8709 /* VEX_LEN_E0_P_2 */
8710 {
8711 { "vpavgb", { XM, Vex128, EXx } },
d5d7db8e 8712 { "(bad)", { XX } },
c0f3af97
L
8713 },
8714
8715 /* VEX_LEN_E1_P_2 */
8716 {
8717 { "vpsraw", { XM, Vex128, EXx } },
d5d7db8e 8718 { "(bad)", { XX } },
c0f3af97
L
8719 },
8720
8721 /* VEX_LEN_E2_P_2 */
8722 {
8723 { "vpsrad", { XM, Vex128, EXx } },
d5d7db8e 8724 { "(bad)", { XX } },
c0f3af97
L
8725 },
8726
8727 /* VEX_LEN_E3_P_2 */
8728 {
8729 { "vpavgw", { XM, Vex128, EXx } },
d5d7db8e 8730 { "(bad)", { XX } },
c0f3af97
L
8731 },
8732
8733 /* VEX_LEN_E4_P_2 */
8734 {
8735 { "vpmulhuw", { XM, Vex128, EXx } },
d5d7db8e 8736 { "(bad)", { XX } },
c0f3af97
L
8737 },
8738
8739 /* VEX_LEN_E5_P_2 */
8740 {
8741 { "vpmulhw", { XM, Vex128, EXx } },
d5d7db8e 8742 { "(bad)", { XX } },
c0f3af97
L
8743 },
8744
c0f3af97
L
8745 /* VEX_LEN_E8_P_2 */
8746 {
8747 { "vpsubsb", { XM, Vex128, EXx } },
d5d7db8e 8748 { "(bad)", { XX } },
c0f3af97
L
8749 },
8750
8751 /* VEX_LEN_E9_P_2 */
8752 {
8753 { "vpsubsw", { XM, Vex128, EXx } },
d5d7db8e 8754 { "(bad)", { XX } },
c0f3af97
L
8755 },
8756
8757 /* VEX_LEN_EA_P_2 */
8758 {
8759 { "vpminsw", { XM, Vex128, EXx } },
d5d7db8e 8760 { "(bad)", { XX } },
c0f3af97
L
8761 },
8762
8763 /* VEX_LEN_EB_P_2 */
8764 {
8765 { "vpor", { XM, Vex128, EXx } },
d5d7db8e 8766 { "(bad)", { XX } },
c0f3af97
L
8767 },
8768
8769 /* VEX_LEN_EC_P_2 */
8770 {
8771 { "vpaddsb", { XM, Vex128, EXx } },
d5d7db8e 8772 { "(bad)", { XX } },
c0f3af97
L
8773 },
8774
8775 /* VEX_LEN_ED_P_2 */
8776 {
8777 { "vpaddsw", { XM, Vex128, EXx } },
d5d7db8e 8778 { "(bad)", { XX } },
c0f3af97
L
8779 },
8780
8781 /* VEX_LEN_EE_P_2 */
8782 {
8783 { "vpmaxsw", { XM, Vex128, EXx } },
d5d7db8e 8784 { "(bad)", { XX } },
c0f3af97
L
8785 },
8786
8787 /* VEX_LEN_EF_P_2 */
8788 {
8789 { "vpxor", { XM, Vex128, EXx } },
d5d7db8e 8790 { "(bad)", { XX } },
c0f3af97
L
8791 },
8792
8793 /* VEX_LEN_F1_P_2 */
8794 {
8795 { "vpsllw", { XM, Vex128, EXx } },
d5d7db8e 8796 { "(bad)", { XX } },
c0f3af97
L
8797 },
8798
8799 /* VEX_LEN_F2_P_2 */
8800 {
8801 { "vpslld", { XM, Vex128, EXx } },
d5d7db8e 8802 { "(bad)", { XX } },
c0f3af97
L
8803 },
8804
8805 /* VEX_LEN_F3_P_2 */
8806 {
8807 { "vpsllq", { XM, Vex128, EXx } },
d5d7db8e 8808 { "(bad)", { XX } },
c0f3af97
L
8809 },
8810
8811 /* VEX_LEN_F4_P_2 */
8812 {
8813 { "vpmuludq", { XM, Vex128, EXx } },
d5d7db8e 8814 { "(bad)", { XX } },
c0f3af97
L
8815 },
8816
8817 /* VEX_LEN_F5_P_2 */
8818 {
8819 { "vpmaddwd", { XM, Vex128, EXx } },
d5d7db8e 8820 { "(bad)", { XX } },
c0f3af97
L
8821 },
8822
8823 /* VEX_LEN_F6_P_2 */
8824 {
8825 { "vpsadbw", { XM, Vex128, EXx } },
d5d7db8e 8826 { "(bad)", { XX } },
c0f3af97
L
8827 },
8828
8829 /* VEX_LEN_F7_P_2 */
8830 {
8831 { "vmaskmovdqu", { XM, XS } },
d5d7db8e 8832 { "(bad)", { XX } },
c0f3af97
L
8833 },
8834
8835 /* VEX_LEN_F8_P_2 */
8836 {
8837 { "vpsubb", { XM, Vex128, EXx } },
d5d7db8e 8838 { "(bad)", { XX } },
c0f3af97
L
8839 },
8840
8841 /* VEX_LEN_F9_P_2 */
8842 {
8843 { "vpsubw", { XM, Vex128, EXx } },
d5d7db8e 8844 { "(bad)", { XX } },
c0f3af97
L
8845 },
8846
8847 /* VEX_LEN_FA_P_2 */
8848 {
8849 { "vpsubd", { XM, Vex128, EXx } },
d5d7db8e 8850 { "(bad)", { XX } },
c0f3af97
L
8851 },
8852
8853 /* VEX_LEN_FB_P_2 */
8854 {
8855 { "vpsubq", { XM, Vex128, EXx } },
d5d7db8e 8856 { "(bad)", { XX } },
c0f3af97
L
8857 },
8858
8859 /* VEX_LEN_FC_P_2 */
8860 {
8861 { "vpaddb", { XM, Vex128, EXx } },
d5d7db8e 8862 { "(bad)", { XX } },
c0f3af97
L
8863 },
8864
8865 /* VEX_LEN_FD_P_2 */
8866 {
8867 { "vpaddw", { XM, Vex128, EXx } },
d5d7db8e 8868 { "(bad)", { XX } },
c0f3af97
L
8869 },
8870
8871 /* VEX_LEN_FE_P_2 */
8872 {
8873 { "vpaddd", { XM, Vex128, EXx } },
d5d7db8e 8874 { "(bad)", { XX } },
c0f3af97
L
8875 },
8876
8877 /* VEX_LEN_3800_P_2 */
8878 {
8879 { "vpshufb", { XM, Vex128, EXx } },
d5d7db8e 8880 { "(bad)", { XX } },
c0f3af97
L
8881 },
8882
8883 /* VEX_LEN_3801_P_2 */
8884 {
8885 { "vphaddw", { XM, Vex128, EXx } },
d5d7db8e 8886 { "(bad)", { XX } },
c0f3af97
L
8887 },
8888
8889 /* VEX_LEN_3802_P_2 */
8890 {
8891 { "vphaddd", { XM, Vex128, EXx } },
d5d7db8e 8892 { "(bad)", { XX } },
c0f3af97
L
8893 },
8894
8895 /* VEX_LEN_3803_P_2 */
8896 {
8897 { "vphaddsw", { XM, Vex128, EXx } },
d5d7db8e 8898 { "(bad)", { XX } },
c0f3af97
L
8899 },
8900
8901 /* VEX_LEN_3804_P_2 */
8902 {
8903 { "vpmaddubsw", { XM, Vex128, EXx } },
d5d7db8e 8904 { "(bad)", { XX } },
c0f3af97
L
8905 },
8906
8907 /* VEX_LEN_3805_P_2 */
8908 {
8909 { "vphsubw", { XM, Vex128, EXx } },
d5d7db8e 8910 { "(bad)", { XX } },
c0f3af97
L
8911 },
8912
8913 /* VEX_LEN_3806_P_2 */
8914 {
8915 { "vphsubd", { XM, Vex128, EXx } },
d5d7db8e 8916 { "(bad)", { XX } },
c0f3af97
L
8917 },
8918
8919 /* VEX_LEN_3807_P_2 */
8920 {
8921 { "vphsubsw", { XM, Vex128, EXx } },
d5d7db8e 8922 { "(bad)", { XX } },
c0f3af97
L
8923 },
8924
8925 /* VEX_LEN_3808_P_2 */
8926 {
8927 { "vpsignb", { XM, Vex128, EXx } },
d5d7db8e 8928 { "(bad)", { XX } },
c0f3af97
L
8929 },
8930
8931 /* VEX_LEN_3809_P_2 */
8932 {
8933 { "vpsignw", { XM, Vex128, EXx } },
d5d7db8e 8934 { "(bad)", { XX } },
c0f3af97
L
8935 },
8936
8937 /* VEX_LEN_380A_P_2 */
8938 {
8939 { "vpsignd", { XM, Vex128, EXx } },
d5d7db8e 8940 { "(bad)", { XX } },
c0f3af97
L
8941 },
8942
8943 /* VEX_LEN_380B_P_2 */
8944 {
8945 { "vpmulhrsw", { XM, Vex128, EXx } },
d5d7db8e 8946 { "(bad)", { XX } },
c0f3af97
L
8947 },
8948
8949 /* VEX_LEN_3819_P_2_M_0 */
8950 {
d5d7db8e 8951 { "(bad)", { XX } },
c0f3af97
L
8952 { "vbroadcastsd", { XM, Mq } },
8953 },
8954
8955 /* VEX_LEN_381A_P_2_M_0 */
8956 {
d5d7db8e 8957 { "(bad)", { XX } },
c0f3af97
L
8958 { "vbroadcastf128", { XM, Mxmm } },
8959 },
8960
8961 /* VEX_LEN_381C_P_2 */
8962 {
8963 { "vpabsb", { XM, EXx } },
d5d7db8e 8964 { "(bad)", { XX } },
c0f3af97
L
8965 },
8966
8967 /* VEX_LEN_381D_P_2 */
8968 {
8969 { "vpabsw", { XM, EXx } },
d5d7db8e 8970 { "(bad)", { XX } },
c0f3af97
L
8971 },
8972
8973 /* VEX_LEN_381E_P_2 */
8974 {
8975 { "vpabsd", { XM, EXx } },
d5d7db8e 8976 { "(bad)", { XX } },
c0f3af97
L
8977 },
8978
8979 /* VEX_LEN_3820_P_2 */
8980 {
8981 { "vpmovsxbw", { XM, EXq } },
d5d7db8e 8982 { "(bad)", { XX } },
c0f3af97
L
8983 },
8984
8985 /* VEX_LEN_3821_P_2 */
8986 {
8987 { "vpmovsxbd", { XM, EXd } },
d5d7db8e 8988 { "(bad)", { XX } },
c0f3af97
L
8989 },
8990
8991 /* VEX_LEN_3822_P_2 */
8992 {
8993 { "vpmovsxbq", { XM, EXw } },
d5d7db8e 8994 { "(bad)", { XX } },
c0f3af97
L
8995 },
8996
8997 /* VEX_LEN_3823_P_2 */
8998 {
8999 { "vpmovsxwd", { XM, EXq } },
d5d7db8e 9000 { "(bad)", { XX } },
c0f3af97
L
9001 },
9002
9003 /* VEX_LEN_3824_P_2 */
9004 {
9005 { "vpmovsxwq", { XM, EXd } },
d5d7db8e 9006 { "(bad)", { XX } },
c0f3af97
L
9007 },
9008
9009 /* VEX_LEN_3825_P_2 */
9010 {
9011 { "vpmovsxdq", { XM, EXq } },
d5d7db8e 9012 { "(bad)", { XX } },
c0f3af97
L
9013 },
9014
9015 /* VEX_LEN_3828_P_2 */
9016 {
9017 { "vpmuldq", { XM, Vex128, EXx } },
d5d7db8e 9018 { "(bad)", { XX } },
c0f3af97
L
9019 },
9020
9021 /* VEX_LEN_3829_P_2 */
9022 {
9023 { "vpcmpeqq", { XM, Vex128, EXx } },
d5d7db8e 9024 { "(bad)", { XX } },
c0f3af97
L
9025 },
9026
9027 /* VEX_LEN_382A_P_2_M_0 */
9028 {
9029 { "vmovntdqa", { XM, Mx } },
d5d7db8e 9030 { "(bad)", { XX } },
c0f3af97
L
9031 },
9032
9033 /* VEX_LEN_382B_P_2 */
9034 {
9035 { "vpackusdw", { XM, Vex128, EXx } },
d5d7db8e 9036 { "(bad)", { XX } },
c0f3af97
L
9037 },
9038
9039 /* VEX_LEN_3830_P_2 */
9040 {
9041 { "vpmovzxbw", { XM, EXq } },
d5d7db8e 9042 { "(bad)", { XX } },
c0f3af97
L
9043 },
9044
9045 /* VEX_LEN_3831_P_2 */
9046 {
9047 { "vpmovzxbd", { XM, EXd } },
d5d7db8e 9048 { "(bad)", { XX } },
c0f3af97
L
9049 },
9050
9051 /* VEX_LEN_3832_P_2 */
9052 {
9053 { "vpmovzxbq", { XM, EXw } },
d5d7db8e 9054 { "(bad)", { XX } },
c0f3af97
L
9055 },
9056
9057 /* VEX_LEN_3833_P_2 */
9058 {
9059 { "vpmovzxwd", { XM, EXq } },
d5d7db8e 9060 { "(bad)", { XX } },
c0f3af97
L
9061 },
9062
9063 /* VEX_LEN_3834_P_2 */
9064 {
9065 { "vpmovzxwq", { XM, EXd } },
d5d7db8e 9066 { "(bad)", { XX } },
c0f3af97
L
9067 },
9068
9069 /* VEX_LEN_3835_P_2 */
9070 {
9071 { "vpmovzxdq", { XM, EXq } },
d5d7db8e 9072 { "(bad)", { XX } },
c0f3af97
L
9073 },
9074
9075 /* VEX_LEN_3837_P_2 */
9076 {
9077 { "vpcmpgtq", { XM, Vex128, EXx } },
d5d7db8e 9078 { "(bad)", { XX } },
c0f3af97
L
9079 },
9080
9081 /* VEX_LEN_3838_P_2 */
9082 {
9083 { "vpminsb", { XM, Vex128, EXx } },
d5d7db8e 9084 { "(bad)", { XX } },
c0f3af97
L
9085 },
9086
9087 /* VEX_LEN_3839_P_2 */
9088 {
9089 { "vpminsd", { XM, Vex128, EXx } },
d5d7db8e 9090 { "(bad)", { XX } },
c0f3af97
L
9091 },
9092
9093 /* VEX_LEN_383A_P_2 */
9094 {
9095 { "vpminuw", { XM, Vex128, EXx } },
d5d7db8e 9096 { "(bad)", { XX } },
c0f3af97
L
9097 },
9098
9099 /* VEX_LEN_383B_P_2 */
9100 {
9101 { "vpminud", { XM, Vex128, EXx } },
d5d7db8e 9102 { "(bad)", { XX } },
c0f3af97
L
9103 },
9104
9105 /* VEX_LEN_383C_P_2 */
9106 {
9107 { "vpmaxsb", { XM, Vex128, EXx } },
d5d7db8e 9108 { "(bad)", { XX } },
c0f3af97
L
9109 },
9110
9111 /* VEX_LEN_383D_P_2 */
9112 {
9113 { "vpmaxsd", { XM, Vex128, EXx } },
d5d7db8e 9114 { "(bad)", { XX } },
c0f3af97
L
9115 },
9116
9117 /* VEX_LEN_383E_P_2 */
9118 {
9119 { "vpmaxuw", { XM, Vex128, EXx } },
d5d7db8e 9120 { "(bad)", { XX } },
c0f3af97
L
9121 },
9122
9123 /* VEX_LEN_383F_P_2 */
9124 {
9125 { "vpmaxud", { XM, Vex128, EXx } },
d5d7db8e 9126 { "(bad)", { XX } },
c0f3af97
L
9127 },
9128
9129 /* VEX_LEN_3840_P_2 */
9130 {
9131 { "vpmulld", { XM, Vex128, EXx } },
d5d7db8e 9132 { "(bad)", { XX } },
c0f3af97
L
9133 },
9134
9135 /* VEX_LEN_3841_P_2 */
9136 {
9137 { "vphminposuw", { XM, EXx } },
d5d7db8e 9138 { "(bad)", { XX } },
c0f3af97
L
9139 },
9140
a5ff0eb2
L
9141 /* VEX_LEN_38DB_P_2 */
9142 {
9143 { "vaesimc", { XM, EXx } },
9144 { "(bad)", { XX } },
9145 },
9146
9147 /* VEX_LEN_38DC_P_2 */
9148 {
9149 { "vaesenc", { XM, Vex128, EXx } },
9150 { "(bad)", { XX } },
9151 },
9152
9153 /* VEX_LEN_38DD_P_2 */
9154 {
9155 { "vaesenclast", { XM, Vex128, EXx } },
9156 { "(bad)", { XX } },
9157 },
9158
9159 /* VEX_LEN_38DE_P_2 */
9160 {
9161 { "vaesdec", { XM, Vex128, EXx } },
9162 { "(bad)", { XX } },
9163 },
9164
9165 /* VEX_LEN_38DF_P_2 */
9166 {
9167 { "vaesdeclast", { XM, Vex128, EXx } },
9168 { "(bad)", { XX } },
9169 },
9170
c0f3af97
L
9171 /* VEX_LEN_3A06_P_2 */
9172 {
d5d7db8e 9173 { "(bad)", { XX } },
c0f3af97
L
9174 { "vperm2f128", { XM, Vex256, EXx, Ib } },
9175 },
9176
9177 /* VEX_LEN_3A0A_P_2 */
9178 {
9179 { "vroundss", { XM, Vex128, EXd, Ib } },
d5d7db8e 9180 { "(bad)", { XX } },
c0f3af97
L
9181 },
9182
9183 /* VEX_LEN_3A0B_P_2 */
9184 {
9185 { "vroundsd", { XM, Vex128, EXq, Ib } },
d5d7db8e 9186 { "(bad)", { XX } },
c0f3af97
L
9187 },
9188
9189 /* VEX_LEN_3A0E_P_2 */
9190 {
9191 { "vpblendw", { XM, Vex128, EXx, Ib } },
d5d7db8e 9192 { "(bad)", { XX } },
c0f3af97
L
9193 },
9194
9195 /* VEX_LEN_3A0F_P_2 */
9196 {
9197 { "vpalignr", { XM, Vex128, EXx, Ib } },
d5d7db8e 9198 { "(bad)", { XX } },
c0f3af97
L
9199 },
9200
9201 /* VEX_LEN_3A14_P_2 */
9202 {
9203 { "vpextrb", { Edqb, XM, Ib } },
d5d7db8e 9204 { "(bad)", { XX } },
c0f3af97
L
9205 },
9206
9207 /* VEX_LEN_3A15_P_2 */
9208 {
9209 { "vpextrw", { Edqw, XM, Ib } },
d5d7db8e 9210 { "(bad)", { XX } },
c0f3af97
L
9211 },
9212
9213 /* VEX_LEN_3A16_P_2 */
9214 {
9215 { "vpextrK", { Edq, XM, Ib } },
d5d7db8e 9216 { "(bad)", { XX } },
c0f3af97
L
9217 },
9218
9219 /* VEX_LEN_3A17_P_2 */
9220 {
9221 { "vextractps", { Edqd, XM, Ib } },
d5d7db8e 9222 { "(bad)", { XX } },
c0f3af97
L
9223 },
9224
9225 /* VEX_LEN_3A18_P_2 */
9226 {
d5d7db8e 9227 { "(bad)", { XX } },
c0f3af97
L
9228 { "vinsertf128", { XM, Vex256, EXxmm, Ib } },
9229 },
9230
9231 /* VEX_LEN_3A19_P_2 */
9232 {
d5d7db8e 9233 { "(bad)", { XX } },
c0f3af97
L
9234 { "vextractf128", { EXxmm, XM, Ib } },
9235 },
9236
9237 /* VEX_LEN_3A20_P_2 */
9238 {
9239 { "vpinsrb", { XM, Vex128, Edqb, Ib } },
d5d7db8e 9240 { "(bad)", { XX } },
c0f3af97
L
9241 },
9242
9243 /* VEX_LEN_3A21_P_2 */
9244 {
9245 { "vinsertps", { XM, Vex128, EXd, Ib } },
d5d7db8e 9246 { "(bad)", { XX } },
c0f3af97
L
9247 },
9248
9249 /* VEX_LEN_3A22_P_2 */
9250 {
9251 { "vpinsrK", { XM, Vex128, Edq, Ib } },
d5d7db8e 9252 { "(bad)", { XX } },
c0f3af97
L
9253 },
9254
9255 /* VEX_LEN_3A41_P_2 */
9256 {
9257 { "vdppd", { XM, Vex128, EXx, Ib } },
d5d7db8e 9258 { "(bad)", { XX } },
c0f3af97
L
9259 },
9260
9261 /* VEX_LEN_3A42_P_2 */
9262 {
9263 { "vmpsadbw", { XM, Vex128, EXx, Ib } },
d5d7db8e 9264 { "(bad)", { XX } },
c0f3af97
L
9265 },
9266
ce2f5b3c
L
9267 /* VEX_LEN_3A44_P_2 */
9268 {
9269 { "vpclmulqdq", { XM, Vex128, EXx, PCLMUL } },
9270 { "(bad)", { XX } },
9271 },
9272
c0f3af97
L
9273 /* VEX_LEN_3A4C_P_2 */
9274 {
9275 { "vpblendvb", { XM, Vex128, EXx, XMVexI4 } },
d5d7db8e 9276 { "(bad)", { XX } },
c0f3af97
L
9277 },
9278
9279 /* VEX_LEN_3A60_P_2 */
9280 {
9281 { "vpcmpestrm", { XM, EXx, Ib } },
d5d7db8e 9282 { "(bad)", { XX } },
c0f3af97
L
9283 },
9284
9285 /* VEX_LEN_3A61_P_2 */
9286 {
9287 { "vpcmpestri", { XM, EXx, Ib } },
d5d7db8e 9288 { "(bad)", { XX } },
c0f3af97
L
9289 },
9290
9291 /* VEX_LEN_3A62_P_2 */
9292 {
9293 { "vpcmpistrm", { XM, EXx, Ib } },
d5d7db8e 9294 { "(bad)", { XX } },
c0f3af97
L
9295 },
9296
9297 /* VEX_LEN_3A63_P_2 */
9298 {
9299 { "vpcmpistri", { XM, EXx, Ib } },
d5d7db8e 9300 { "(bad)", { XX } },
c0f3af97
L
9301 },
9302
922d8de8
DR
9303 /* VEX_LEN_3A6A_P_2 */
9304 {
206c2556 9305 { "vfmaddss", { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
922d8de8
DR
9306 { "(bad)", { XX } },
9307 },
9308
9309 /* VEX_LEN_3A6B_P_2 */
9310 {
206c2556 9311 { "vfmaddsd", { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
922d8de8
DR
9312 { "(bad)", { XX } },
9313 },
9314
9315 /* VEX_LEN_3A6E_P_2 */
9316 {
206c2556 9317 { "vfmsubss", { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
922d8de8
DR
9318 { "(bad)", { XX } },
9319 },
9320
9321 /* VEX_LEN_3A6F_P_2 */
9322 {
206c2556 9323 { "vfmsubsd", { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
922d8de8
DR
9324 { "(bad)", { XX } },
9325 },
9326
9327 /* VEX_LEN_3A7A_P_2 */
9328 {
206c2556 9329 { "vfnmaddss", { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
922d8de8
DR
9330 { "(bad)", { XX } },
9331 },
9332
9333 /* VEX_LEN_3A7B_P_2 */
9334 {
206c2556 9335 { "vfnmaddsd", { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
922d8de8
DR
9336 { "(bad)", { XX } },
9337 },
9338
9339 /* VEX_LEN_3A7E_P_2 */
9340 {
206c2556 9341 { "vfnmsubss", { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
922d8de8
DR
9342 { "(bad)", { XX } },
9343 },
9344
9345 /* VEX_LEN_3A7F_P_2 */
9346 {
206c2556 9347 { "vfnmsubsd", { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
922d8de8
DR
9348 { "(bad)", { XX } },
9349 },
9350
a5ff0eb2
L
9351 /* VEX_LEN_3ADF_P_2 */
9352 {
9353 { "vaeskeygenassist", { XM, EXx, Ib } },
9354 { "(bad)", { XX } },
9355 },
5dd85c99
SP
9356 /* VEX_LEN_XOP_09_80 */
9357 {
9358 { "vfrczps", { XM, EXxmm } },
9359 { "vfrczps", { XM, EXymmq } },
9360 },
9361 /* VEX_LEN_XOP_09_81 */
9362 {
9363 { "vfrczpd", { XM, EXxmm } },
9364 { "vfrczpd", { XM, EXymmq } },
9365 },
331d2d0d
L
9366};
9367
1ceb70f8 9368static const struct dis386 mod_table[][2] = {
b844680a 9369 {
1ceb70f8 9370 /* MOD_8D */
d8faab4e
L
9371 { "leaS", { Gv, M } },
9372 { "(bad)", { XX } },
9373 },
9374 {
92fddf8e
L
9375 /* MOD_0F01_REG_0 */
9376 { X86_64_TABLE (X86_64_0F01_REG_0) },
9377 { RM_TABLE (RM_0F01_REG_0) },
d8faab4e
L
9378 },
9379 {
92fddf8e
L
9380 /* MOD_0F01_REG_1 */
9381 { X86_64_TABLE (X86_64_0F01_REG_1) },
9382 { RM_TABLE (RM_0F01_REG_1) },
d8faab4e
L
9383 },
9384 {
92fddf8e
L
9385 /* MOD_0F01_REG_2 */
9386 { X86_64_TABLE (X86_64_0F01_REG_2) },
475a2301 9387 { RM_TABLE (RM_0F01_REG_2) },
d8faab4e
L
9388 },
9389 {
92fddf8e
L
9390 /* MOD_0F01_REG_3 */
9391 { X86_64_TABLE (X86_64_0F01_REG_3) },
9392 { RM_TABLE (RM_0F01_REG_3) },
d8faab4e
L
9393 },
9394 {
92fddf8e
L
9395 /* MOD_0F01_REG_7 */
9396 { "invlpg", { Mb } },
9397 { RM_TABLE (RM_0F01_REG_7) },
b844680a
L
9398 },
9399 {
92fddf8e
L
9400 /* MOD_0F12_PREFIX_0 */
9401 { "movlps", { XM, EXq } },
9402 { "movhlps", { XM, EXq } },
b844680a
L
9403 },
9404 {
92fddf8e
L
9405 /* MOD_0F13 */
9406 { "movlpX", { EXq, XM } },
d8faab4e
L
9407 { "(bad)", { XX } },
9408 },
9409 {
92fddf8e
L
9410 /* MOD_0F16_PREFIX_0 */
9411 { "movhps", { XM, EXq } },
9412 { "movlhps", { XM, EXq } },
b844680a
L
9413 },
9414 {
92fddf8e
L
9415 /* MOD_0F17 */
9416 { "movhpX", { EXq, XM } },
b844680a
L
9417 { "(bad)", { XX } },
9418 },
9419 {
92fddf8e
L
9420 /* MOD_0F18_REG_0 */
9421 { "prefetchnta", { Mb } },
b844680a 9422 { "(bad)", { XX } },
b844680a
L
9423 },
9424 {
92fddf8e
L
9425 /* MOD_0F18_REG_1 */
9426 { "prefetcht0", { Mb } },
9427 { "(bad)", { XX } },
b844680a
L
9428 },
9429 {
92fddf8e
L
9430 /* MOD_0F18_REG_2 */
9431 { "prefetcht1", { Mb } },
9432 { "(bad)", { XX } },
b844680a
L
9433 },
9434 {
92fddf8e
L
9435 /* MOD_0F18_REG_3 */
9436 { "prefetcht2", { Mb } },
b844680a 9437 { "(bad)", { XX } },
b844680a
L
9438 },
9439 {
92fddf8e
L
9440 /* MOD_0F20 */
9441 { "(bad)", { XX } },
9442 { "movZ", { Rm, Cm } },
b844680a
L
9443 },
9444 {
92fddf8e
L
9445 /* MOD_0F21 */
9446 { "(bad)", { XX } },
9447 { "movZ", { Rm, Dm } },
b844680a
L
9448 },
9449 {
92fddf8e 9450 /* MOD_0F22 */
b844680a 9451 { "(bad)", { XX } },
92fddf8e 9452 { "movZ", { Cm, Rm } },
b844680a
L
9453 },
9454 {
92fddf8e 9455 /* MOD_0F23 */
b844680a 9456 { "(bad)", { XX } },
92fddf8e 9457 { "movZ", { Dm, Rm } },
b844680a
L
9458 },
9459 {
92fddf8e 9460 /* MOD_0F24 */
c1e679ec 9461 { "(bad)", { XX } },
92fddf8e 9462 { "movL", { Rd, Td } },
b844680a
L
9463 },
9464 {
92fddf8e 9465 /* MOD_0F26 */
b844680a 9466 { "(bad)", { XX } },
92fddf8e 9467 { "movL", { Td, Rd } },
b844680a 9468 },
75c135a8
L
9469 {
9470 /* MOD_0F2B_PREFIX_0 */
4ee52178 9471 {"movntps", { Mx, XM } },
75c135a8
L
9472 { "(bad)", { XX } },
9473 },
9474 {
9475 /* MOD_0F2B_PREFIX_1 */
4ee52178 9476 {"movntss", { Md, XM } },
75c135a8
L
9477 { "(bad)", { XX } },
9478 },
9479 {
9480 /* MOD_0F2B_PREFIX_2 */
4ee52178 9481 {"movntpd", { Mx, XM } },
75c135a8
L
9482 { "(bad)", { XX } },
9483 },
9484 {
9485 /* MOD_0F2B_PREFIX_3 */
4ee52178 9486 {"movntsd", { Mq, XM } },
75c135a8
L
9487 { "(bad)", { XX } },
9488 },
9489 {
9490 /* MOD_0F51 */
9491 { "(bad)", { XX } },
9492 { "movmskpX", { Gdq, XS } },
9493 },
b844680a 9494 {
1ceb70f8 9495 /* MOD_0F71_REG_2 */
b844680a 9496 { "(bad)", { XX } },
4e7d34a6 9497 { "psrlw", { MS, Ib } },
b844680a
L
9498 },
9499 {
1ceb70f8 9500 /* MOD_0F71_REG_4 */
b844680a 9501 { "(bad)", { XX } },
4e7d34a6 9502 { "psraw", { MS, Ib } },
b844680a
L
9503 },
9504 {
1ceb70f8 9505 /* MOD_0F71_REG_6 */
b844680a 9506 { "(bad)", { XX } },
4e7d34a6 9507 { "psllw", { MS, Ib } },
b844680a
L
9508 },
9509 {
1ceb70f8 9510 /* MOD_0F72_REG_2 */
b844680a 9511 { "(bad)", { XX } },
4e7d34a6 9512 { "psrld", { MS, Ib } },
b844680a
L
9513 },
9514 {
1ceb70f8 9515 /* MOD_0F72_REG_4 */
b844680a 9516 { "(bad)", { XX } },
4e7d34a6 9517 { "psrad", { MS, Ib } },
b844680a
L
9518 },
9519 {
1ceb70f8 9520 /* MOD_0F72_REG_6 */
b844680a 9521 { "(bad)", { XX } },
4e7d34a6 9522 { "pslld", { MS, Ib } },
b844680a
L
9523 },
9524 {
1ceb70f8 9525 /* MOD_0F73_REG_2 */
4e7d34a6
L
9526 { "(bad)", { XX } },
9527 { "psrlq", { MS, Ib } },
b844680a
L
9528 },
9529 {
1ceb70f8 9530 /* MOD_0F73_REG_3 */
b844680a 9531 { "(bad)", { XX } },
c0f3af97
L
9532 { PREFIX_TABLE (PREFIX_0F73_REG_3) },
9533 },
9534 {
9535 /* MOD_0F73_REG_6 */
9536 { "(bad)", { XX } },
9537 { "psllq", { MS, Ib } },
9538 },
9539 {
9540 /* MOD_0F73_REG_7 */
9541 { "(bad)", { XX } },
9542 { PREFIX_TABLE (PREFIX_0F73_REG_7) },
9543 },
9544 {
9545 /* MOD_0FAE_REG_0 */
eacc9c89 9546 { "fxsave", { FXSAVE } },
c0f3af97
L
9547 { "(bad)", { XX } },
9548 },
9549 {
9550 /* MOD_0FAE_REG_1 */
eacc9c89 9551 { "fxrstor", { FXSAVE } },
c0f3af97
L
9552 { "(bad)", { XX } },
9553 },
9554 {
9555 /* MOD_0FAE_REG_2 */
9556 { "ldmxcsr", { Md } },
9557 { "(bad)", { XX } },
9558 },
9559 {
9560 /* MOD_0FAE_REG_3 */
9561 { "stmxcsr", { Md } },
9562 { "(bad)", { XX } },
9563 },
9564 {
9565 /* MOD_0FAE_REG_4 */
9566 { "xsave", { M } },
9567 { "(bad)", { XX } },
9568 },
9569 {
9570 /* MOD_0FAE_REG_5 */
9571 { "xrstor", { M } },
9572 { RM_TABLE (RM_0FAE_REG_5) },
9573 },
9574 {
9575 /* MOD_0FAE_REG_6 */
9576 { "xsaveopt", { M } },
9577 { RM_TABLE (RM_0FAE_REG_6) },
9578 },
9579 {
9580 /* MOD_0FAE_REG_7 */
9581 { "clflush", { Mb } },
9582 { RM_TABLE (RM_0FAE_REG_7) },
9583 },
9584 {
9585 /* MOD_0FB2 */
9586 { "lssS", { Gv, Mp } },
9587 { "(bad)", { XX } },
9588 },
9589 {
9590 /* MOD_0FB4 */
9591 { "lfsS", { Gv, Mp } },
9592 { "(bad)", { XX } },
9593 },
9594 {
9595 /* MOD_0FB5 */
9596 { "lgsS", { Gv, Mp } },
9597 { "(bad)", { XX } },
9598 },
9599 {
9600 /* MOD_0FC7_REG_6 */
9601 { PREFIX_TABLE (PREFIX_0FC7_REG_6) },
9602 { "(bad)", { XX } },
9603 },
9604 {
9605 /* MOD_0FC7_REG_7 */
9606 { "vmptrst", { Mq } },
9607 { "(bad)", { XX } },
9608 },
9609 {
9610 /* MOD_0FD7 */
9611 { "(bad)", { XX } },
9612 { "pmovmskb", { Gdq, MS } },
9613 },
9614 {
9615 /* MOD_0FE7_PREFIX_2 */
9616 { "movntdq", { Mx, XM } },
9617 { "(bad)", { XX } },
9618 },
9619 {
9620 /* MOD_0FF0_PREFIX_3 */
9621 { "lddqu", { XM, M } },
9622 { "(bad)", { XX } },
9623 },
9624 {
9625 /* MOD_0F382A_PREFIX_2 */
9626 { "movntdqa", { XM, Mx } },
9627 { "(bad)", { XX } },
9628 },
9629 {
9630 /* MOD_62_32BIT */
9631 { "bound{S|}", { Gv, Ma } },
9632 { "(bad)", { XX } },
9633 },
9634 {
9635 /* MOD_C4_32BIT */
9636 { "lesS", { Gv, Mp } },
9637 { VEX_C4_TABLE (VEX_0F) },
9638 },
9639 {
9640 /* MOD_C5_32BIT */
9641 { "ldsS", { Gv, Mp } },
9642 { VEX_C5_TABLE (VEX_0F) },
9643 },
9644 {
9645 /* MOD_VEX_12_PREFIX_0 */
9646 { VEX_LEN_TABLE (VEX_LEN_12_P_0_M_0) },
9647 { VEX_LEN_TABLE (VEX_LEN_12_P_0_M_1) },
9648 },
9649 {
9650 /* MOD_VEX_13 */
9651 { VEX_LEN_TABLE (VEX_LEN_13_M_0) },
9652 { "(bad)", { XX } },
9653 },
9654 {
9655 /* MOD_VEX_16_PREFIX_0 */
9656 { VEX_LEN_TABLE (VEX_LEN_16_P_0_M_0) },
9657 { VEX_LEN_TABLE (VEX_LEN_16_P_0_M_1) },
9658 },
9659 {
9660 /* MOD_VEX_17 */
9661 { VEX_LEN_TABLE (VEX_LEN_17_M_0) },
9662 { "(bad)", { XX } },
9663 },
9664 {
9665 /* MOD_VEX_2B */
168e3097 9666 { "vmovntpX", { Mx, XM } },
c0f3af97
L
9667 { "(bad)", { XX } },
9668 },
9669 {
9670 /* MOD_VEX_51 */
9671 { "(bad)", { XX } },
9672 { "vmovmskpX", { Gdq, XS } },
9673 },
9674 {
9675 /* MOD_VEX_71_REG_2 */
9676 { "(bad)", { XX } },
9677 { PREFIX_TABLE (PREFIX_VEX_71_REG_2) },
b844680a
L
9678 },
9679 {
c0f3af97 9680 /* MOD_VEX_71_REG_4 */
b844680a 9681 { "(bad)", { XX } },
c0f3af97 9682 { PREFIX_TABLE (PREFIX_VEX_71_REG_4) },
b844680a
L
9683 },
9684 {
c0f3af97 9685 /* MOD_VEX_71_REG_6 */
b844680a 9686 { "(bad)", { XX } },
c0f3af97 9687 { PREFIX_TABLE (PREFIX_VEX_71_REG_6) },
b844680a
L
9688 },
9689 {
c0f3af97 9690 /* MOD_VEX_72_REG_2 */
b844680a 9691 { "(bad)", { XX } },
c0f3af97 9692 { PREFIX_TABLE (PREFIX_VEX_72_REG_2) },
b844680a 9693 },
d8faab4e 9694 {
c0f3af97 9695 /* MOD_VEX_72_REG_4 */
d8faab4e 9696 { "(bad)", { XX } },
c0f3af97 9697 { PREFIX_TABLE (PREFIX_VEX_72_REG_4) },
d8faab4e
L
9698 },
9699 {
c0f3af97 9700 /* MOD_VEX_72_REG_6 */
d8faab4e 9701 { "(bad)", { XX } },
c0f3af97 9702 { PREFIX_TABLE (PREFIX_VEX_72_REG_6) },
d8faab4e 9703 },
876d4bfa 9704 {
c0f3af97 9705 /* MOD_VEX_73_REG_2 */
876d4bfa 9706 { "(bad)", { XX } },
c0f3af97 9707 { PREFIX_TABLE (PREFIX_VEX_73_REG_2) },
876d4bfa
L
9708 },
9709 {
c0f3af97 9710 /* MOD_VEX_73_REG_3 */
876d4bfa 9711 { "(bad)", { XX } },
c0f3af97 9712 { PREFIX_TABLE (PREFIX_VEX_73_REG_3) },
475a2301
L
9713 },
9714 {
c0f3af97
L
9715 /* MOD_VEX_73_REG_6 */
9716 { "(bad)", { XX } },
9717 { PREFIX_TABLE (PREFIX_VEX_73_REG_6) },
876d4bfa
L
9718 },
9719 {
c0f3af97 9720 /* MOD_VEX_73_REG_7 */
4e7d34a6 9721 { "(bad)", { XX } },
c0f3af97 9722 { PREFIX_TABLE (PREFIX_VEX_73_REG_7) },
876d4bfa
L
9723 },
9724 {
c0f3af97
L
9725 /* MOD_VEX_AE_REG_2 */
9726 { VEX_LEN_TABLE (VEX_LEN_AE_R_2_M_0) },
9727 { "(bad)", { XX } },
876d4bfa 9728 },
bbedc832 9729 {
c0f3af97
L
9730 /* MOD_VEX_AE_REG_3 */
9731 { VEX_LEN_TABLE (VEX_LEN_AE_R_3_M_0) },
4e7d34a6 9732 { "(bad)", { XX } },
bbedc832 9733 },
144c41d9 9734 {
c0f3af97 9735 /* MOD_VEX_D7_PREFIX_2 */
4e7d34a6 9736 { "(bad)", { XX } },
c0f3af97 9737 { VEX_LEN_TABLE (VEX_LEN_D7_P_2_M_1) },
144c41d9 9738 },
1afd85e3 9739 {
c0f3af97 9740 /* MOD_VEX_E7_PREFIX_2 */
168e3097 9741 { "vmovntdq", { Mx, XM } },
92fddf8e 9742 { "(bad)", { XX } },
1afd85e3
L
9743 },
9744 {
c0f3af97
L
9745 /* MOD_VEX_F0_PREFIX_3 */
9746 { "vlddqu", { XM, M } },
92fddf8e
L
9747 { "(bad)", { XX } },
9748 },
9749 {
c0f3af97
L
9750 /* MOD_VEX_3818_PREFIX_2 */
9751 { "vbroadcastss", { XM, Md } },
92fddf8e 9752 { "(bad)", { XX } },
1afd85e3 9753 },
75c135a8 9754 {
c0f3af97
L
9755 /* MOD_VEX_3819_PREFIX_2 */
9756 { VEX_LEN_TABLE (VEX_LEN_3819_P_2_M_0) },
75c135a8 9757 { "(bad)", { XX } },
75c135a8
L
9758 },
9759 {
c0f3af97
L
9760 /* MOD_VEX_381A_PREFIX_2 */
9761 { VEX_LEN_TABLE (VEX_LEN_381A_P_2_M_0) },
75c135a8
L
9762 { "(bad)", { XX } },
9763 },
1afd85e3 9764 {
c0f3af97
L
9765 /* MOD_VEX_382A_PREFIX_2 */
9766 { VEX_LEN_TABLE (VEX_LEN_382A_P_2_M_0) },
1afd85e3 9767 { "(bad)", { XX } },
1afd85e3 9768 },
75c135a8 9769 {
c0f3af97
L
9770 /* MOD_VEX_382C_PREFIX_2 */
9771 { "vmaskmovps", { XM, Vex, Mx } },
75c135a8
L
9772 { "(bad)", { XX } },
9773 },
1afd85e3 9774 {
c0f3af97
L
9775 /* MOD_VEX_382D_PREFIX_2 */
9776 { "vmaskmovpd", { XM, Vex, Mx } },
1afd85e3 9777 { "(bad)", { XX } },
1afd85e3
L
9778 },
9779 {
c0f3af97
L
9780 /* MOD_VEX_382E_PREFIX_2 */
9781 { "vmaskmovps", { Mx, Vex, XM } },
4e7d34a6 9782 { "(bad)", { XX } },
1afd85e3
L
9783 },
9784 {
c0f3af97
L
9785 /* MOD_VEX_382F_PREFIX_2 */
9786 { "vmaskmovpd", { Mx, Vex, XM } },
1afd85e3 9787 { "(bad)", { XX } },
1afd85e3 9788 },
b844680a
L
9789};
9790
1ceb70f8 9791static const struct dis386 rm_table[][8] = {
b844680a 9792 {
1ceb70f8 9793 /* RM_0F01_REG_0 */
b844680a
L
9794 { "(bad)", { XX } },
9795 { "vmcall", { Skip_MODRM } },
9796 { "vmlaunch", { Skip_MODRM } },
9797 { "vmresume", { Skip_MODRM } },
9798 { "vmxoff", { Skip_MODRM } },
9799 { "(bad)", { XX } },
9800 { "(bad)", { XX } },
9801 { "(bad)", { XX } },
9802 },
9803 {
1ceb70f8 9804 /* RM_0F01_REG_1 */
b844680a
L
9805 { "monitor", { { OP_Monitor, 0 } } },
9806 { "mwait", { { OP_Mwait, 0 } } },
9807 { "(bad)", { XX } },
9808 { "(bad)", { XX } },
9809 { "(bad)", { XX } },
9810 { "(bad)", { XX } },
9811 { "(bad)", { XX } },
9812 { "(bad)", { XX } },
9813 },
475a2301
L
9814 {
9815 /* RM_0F01_REG_2 */
9816 { "xgetbv", { Skip_MODRM } },
9817 { "xsetbv", { Skip_MODRM } },
9818 { "(bad)", { XX } },
9819 { "(bad)", { XX } },
9820 { "(bad)", { XX } },
9821 { "(bad)", { XX } },
9822 { "(bad)", { XX } },
9823 { "(bad)", { XX } },
9824 },
b844680a 9825 {
1ceb70f8 9826 /* RM_0F01_REG_3 */
4e7d34a6
L
9827 { "vmrun", { Skip_MODRM } },
9828 { "vmmcall", { Skip_MODRM } },
9829 { "vmload", { Skip_MODRM } },
9830 { "vmsave", { Skip_MODRM } },
9831 { "stgi", { Skip_MODRM } },
9832 { "clgi", { Skip_MODRM } },
9833 { "skinit", { Skip_MODRM } },
9834 { "invlpga", { Skip_MODRM } },
9835 },
9836 {
1ceb70f8 9837 /* RM_0F01_REG_7 */
4e7d34a6
L
9838 { "swapgs", { Skip_MODRM } },
9839 { "rdtscp", { Skip_MODRM } },
b844680a
L
9840 { "(bad)", { XX } },
9841 { "(bad)", { XX } },
9842 { "(bad)", { XX } },
9843 { "(bad)", { XX } },
9844 { "(bad)", { XX } },
9845 { "(bad)", { XX } },
9846 },
9847 {
1ceb70f8 9848 /* RM_0FAE_REG_5 */
4e7d34a6 9849 { "lfence", { Skip_MODRM } },
b844680a
L
9850 { "(bad)", { XX } },
9851 { "(bad)", { XX } },
9852 { "(bad)", { XX } },
9853 { "(bad)", { XX } },
9854 { "(bad)", { XX } },
9855 { "(bad)", { XX } },
9856 { "(bad)", { XX } },
9857 },
9858 {
1ceb70f8 9859 /* RM_0FAE_REG_6 */
4e7d34a6 9860 { "mfence", { Skip_MODRM } },
b844680a
L
9861 { "(bad)", { XX } },
9862 { "(bad)", { XX } },
9863 { "(bad)", { XX } },
9864 { "(bad)", { XX } },
9865 { "(bad)", { XX } },
9866 { "(bad)", { XX } },
9867 { "(bad)", { XX } },
9868 },
bbedc832 9869 {
1ceb70f8 9870 /* RM_0FAE_REG_7 */
4e7d34a6
L
9871 { "sfence", { Skip_MODRM } },
9872 { "(bad)", { XX } },
bbedc832
L
9873 { "(bad)", { XX } },
9874 { "(bad)", { XX } },
9875 { "(bad)", { XX } },
9876 { "(bad)", { XX } },
9877 { "(bad)", { XX } },
9878 { "(bad)", { XX } },
144c41d9 9879 },
b844680a
L
9880};
9881
c608c12e
AM
9882#define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
9883
f16cd0d5
L
9884/* We use the high bit to indicate different name for the same
9885 prefix. */
9886#define ADDR16_PREFIX (0x67 | 0x100)
9887#define ADDR32_PREFIX (0x67 | 0x200)
9888#define DATA16_PREFIX (0x66 | 0x100)
9889#define DATA32_PREFIX (0x66 | 0x200)
9890#define REP_PREFIX (0xf3 | 0x100)
9891
9892static int
26ca5450 9893ckprefix (void)
252b5132 9894{
f16cd0d5 9895 int newrex, i, length;
52b15da3 9896 rex = 0;
c0f3af97
L
9897 rex_original = 0;
9898 rex_ignored = 0;
252b5132 9899 prefixes = 0;
7d421014 9900 used_prefixes = 0;
52b15da3 9901 rex_used = 0;
f16cd0d5
L
9902 last_lock_prefix = -1;
9903 last_repz_prefix = -1;
9904 last_repnz_prefix = -1;
9905 last_data_prefix = -1;
9906 last_addr_prefix = -1;
9907 last_rex_prefix = -1;
9908 last_seg_prefix = -1;
f310f33d
L
9909 for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
9910 all_prefixes[i] = 0;
9911 i = 0;
f16cd0d5
L
9912 length = 0;
9913 /* The maximum instruction length is 15bytes. */
9914 while (length < MAX_CODE_LENGTH - 1)
252b5132
RH
9915 {
9916 FETCH_DATA (the_info, codep + 1);
52b15da3 9917 newrex = 0;
252b5132
RH
9918 switch (*codep)
9919 {
52b15da3
JH
9920 /* REX prefixes family. */
9921 case 0x40:
9922 case 0x41:
9923 case 0x42:
9924 case 0x43:
9925 case 0x44:
9926 case 0x45:
9927 case 0x46:
9928 case 0x47:
9929 case 0x48:
9930 case 0x49:
9931 case 0x4a:
9932 case 0x4b:
9933 case 0x4c:
9934 case 0x4d:
9935 case 0x4e:
9936 case 0x4f:
f16cd0d5
L
9937 if (address_mode == mode_64bit)
9938 newrex = *codep;
9939 else
9940 return 1;
9941 last_rex_prefix = i;
52b15da3 9942 break;
252b5132
RH
9943 case 0xf3:
9944 prefixes |= PREFIX_REPZ;
f16cd0d5 9945 last_repz_prefix = i;
252b5132
RH
9946 break;
9947 case 0xf2:
9948 prefixes |= PREFIX_REPNZ;
f16cd0d5 9949 last_repnz_prefix = i;
252b5132
RH
9950 break;
9951 case 0xf0:
9952 prefixes |= PREFIX_LOCK;
f16cd0d5 9953 last_lock_prefix = i;
252b5132
RH
9954 break;
9955 case 0x2e:
9956 prefixes |= PREFIX_CS;
f16cd0d5 9957 last_seg_prefix = i;
252b5132
RH
9958 break;
9959 case 0x36:
9960 prefixes |= PREFIX_SS;
f16cd0d5 9961 last_seg_prefix = i;
252b5132
RH
9962 break;
9963 case 0x3e:
9964 prefixes |= PREFIX_DS;
f16cd0d5 9965 last_seg_prefix = i;
252b5132
RH
9966 break;
9967 case 0x26:
9968 prefixes |= PREFIX_ES;
f16cd0d5 9969 last_seg_prefix = i;
252b5132
RH
9970 break;
9971 case 0x64:
9972 prefixes |= PREFIX_FS;
f16cd0d5 9973 last_seg_prefix = i;
252b5132
RH
9974 break;
9975 case 0x65:
9976 prefixes |= PREFIX_GS;
f16cd0d5 9977 last_seg_prefix = i;
252b5132
RH
9978 break;
9979 case 0x66:
9980 prefixes |= PREFIX_DATA;
f16cd0d5 9981 last_data_prefix = i;
252b5132
RH
9982 break;
9983 case 0x67:
9984 prefixes |= PREFIX_ADDR;
f16cd0d5 9985 last_addr_prefix = i;
252b5132 9986 break;
5076851f 9987 case FWAIT_OPCODE:
252b5132
RH
9988 /* fwait is really an instruction. If there are prefixes
9989 before the fwait, they belong to the fwait, *not* to the
9990 following instruction. */
3e7d61b2 9991 if (prefixes || rex)
252b5132
RH
9992 {
9993 prefixes |= PREFIX_FWAIT;
9994 codep++;
f16cd0d5 9995 return 1;
252b5132
RH
9996 }
9997 prefixes = PREFIX_FWAIT;
9998 break;
9999 default:
f16cd0d5 10000 return 1;
252b5132 10001 }
52b15da3
JH
10002 /* Rex is ignored when followed by another prefix. */
10003 if (rex)
10004 {
3e7d61b2 10005 rex_used = rex;
f16cd0d5 10006 return 1;
52b15da3 10007 }
f16cd0d5
L
10008 if (*codep != FWAIT_OPCODE)
10009 all_prefixes[i++] = *codep;
52b15da3 10010 rex = newrex;
c0f3af97 10011 rex_original = rex;
252b5132 10012 codep++;
f16cd0d5
L
10013 length++;
10014 }
10015 return 0;
10016}
10017
10018static int
10019seg_prefix (int pref)
10020{
10021 switch (pref)
10022 {
10023 case 0x2e:
10024 return PREFIX_CS;
10025 case 0x36:
10026 return PREFIX_SS;
10027 case 0x3e:
10028 return PREFIX_DS;
10029 case 0x26:
10030 return PREFIX_ES;
10031 case 0x64:
10032 return PREFIX_FS;
10033 case 0x65:
10034 return PREFIX_GS;
10035 default:
10036 return 0;
252b5132
RH
10037 }
10038}
10039
7d421014
ILT
10040/* Return the name of the prefix byte PREF, or NULL if PREF is not a
10041 prefix byte. */
10042
10043static const char *
26ca5450 10044prefix_name (int pref, int sizeflag)
7d421014 10045{
0003779b
L
10046 static const char *rexes [16] =
10047 {
10048 "rex", /* 0x40 */
10049 "rex.B", /* 0x41 */
10050 "rex.X", /* 0x42 */
10051 "rex.XB", /* 0x43 */
10052 "rex.R", /* 0x44 */
10053 "rex.RB", /* 0x45 */
10054 "rex.RX", /* 0x46 */
10055 "rex.RXB", /* 0x47 */
10056 "rex.W", /* 0x48 */
10057 "rex.WB", /* 0x49 */
10058 "rex.WX", /* 0x4a */
10059 "rex.WXB", /* 0x4b */
10060 "rex.WR", /* 0x4c */
10061 "rex.WRB", /* 0x4d */
10062 "rex.WRX", /* 0x4e */
10063 "rex.WRXB", /* 0x4f */
10064 };
10065
7d421014
ILT
10066 switch (pref)
10067 {
52b15da3
JH
10068 /* REX prefixes family. */
10069 case 0x40:
52b15da3 10070 case 0x41:
52b15da3 10071 case 0x42:
52b15da3 10072 case 0x43:
52b15da3 10073 case 0x44:
52b15da3 10074 case 0x45:
52b15da3 10075 case 0x46:
52b15da3 10076 case 0x47:
52b15da3 10077 case 0x48:
52b15da3 10078 case 0x49:
52b15da3 10079 case 0x4a:
52b15da3 10080 case 0x4b:
52b15da3 10081 case 0x4c:
52b15da3 10082 case 0x4d:
52b15da3 10083 case 0x4e:
52b15da3 10084 case 0x4f:
0003779b 10085 return rexes [pref - 0x40];
7d421014
ILT
10086 case 0xf3:
10087 return "repz";
10088 case 0xf2:
10089 return "repnz";
10090 case 0xf0:
10091 return "lock";
10092 case 0x2e:
10093 return "cs";
10094 case 0x36:
10095 return "ss";
10096 case 0x3e:
10097 return "ds";
10098 case 0x26:
10099 return "es";
10100 case 0x64:
10101 return "fs";
10102 case 0x65:
10103 return "gs";
10104 case 0x66:
10105 return (sizeflag & DFLAG) ? "data16" : "data32";
10106 case 0x67:
cb712a9e 10107 if (address_mode == mode_64bit)
db6eb5be 10108 return (sizeflag & AFLAG) ? "addr32" : "addr64";
c1a64871 10109 else
2888cb7a 10110 return (sizeflag & AFLAG) ? "addr16" : "addr32";
7d421014
ILT
10111 case FWAIT_OPCODE:
10112 return "fwait";
f16cd0d5
L
10113 case ADDR16_PREFIX:
10114 return "addr16";
10115 case ADDR32_PREFIX:
10116 return "addr32";
10117 case DATA16_PREFIX:
10118 return "data16";
10119 case DATA32_PREFIX:
10120 return "data32";
10121 case REP_PREFIX:
10122 return "rep";
7d421014
ILT
10123 default:
10124 return NULL;
10125 }
10126}
10127
ce518a5f
L
10128static char op_out[MAX_OPERANDS][100];
10129static int op_ad, op_index[MAX_OPERANDS];
1d9f512f 10130static int two_source_ops;
ce518a5f
L
10131static bfd_vma op_address[MAX_OPERANDS];
10132static bfd_vma op_riprel[MAX_OPERANDS];
52b15da3 10133static bfd_vma start_pc;
ce518a5f 10134
252b5132
RH
10135/*
10136 * On the 386's of 1988, the maximum length of an instruction is 15 bytes.
10137 * (see topic "Redundant prefixes" in the "Differences from 8086"
10138 * section of the "Virtual 8086 Mode" chapter.)
10139 * 'pc' should be the address of this instruction, it will
10140 * be used to print the target address if this is a relative jump or call
10141 * The function returns the length of this instruction in bytes.
10142 */
10143
252b5132 10144static char intel_syntax;
9d141669 10145static char intel_mnemonic = !SYSV386_COMPAT;
252b5132
RH
10146static char open_char;
10147static char close_char;
10148static char separator_char;
10149static char scale_char;
10150
e396998b
AM
10151/* Here for backwards compatibility. When gdb stops using
10152 print_insn_i386_att and print_insn_i386_intel these functions can
10153 disappear, and print_insn_i386 be merged into print_insn. */
252b5132 10154int
26ca5450 10155print_insn_i386_att (bfd_vma pc, disassemble_info *info)
252b5132
RH
10156{
10157 intel_syntax = 0;
e396998b
AM
10158
10159 return print_insn (pc, info);
252b5132
RH
10160}
10161
10162int
26ca5450 10163print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
252b5132
RH
10164{
10165 intel_syntax = 1;
e396998b
AM
10166
10167 return print_insn (pc, info);
252b5132
RH
10168}
10169
e396998b 10170int
26ca5450 10171print_insn_i386 (bfd_vma pc, disassemble_info *info)
e396998b
AM
10172{
10173 intel_syntax = -1;
10174
10175 return print_insn (pc, info);
10176}
10177
f59a29b9
L
10178void
10179print_i386_disassembler_options (FILE *stream)
10180{
10181 fprintf (stream, _("\n\
10182The following i386/x86-64 specific disassembler options are supported for use\n\
10183with the -M switch (multiple options should be separated by commas):\n"));
10184
10185 fprintf (stream, _(" x86-64 Disassemble in 64bit mode\n"));
10186 fprintf (stream, _(" i386 Disassemble in 32bit mode\n"));
10187 fprintf (stream, _(" i8086 Disassemble in 16bit mode\n"));
10188 fprintf (stream, _(" att Display instruction in AT&T syntax\n"));
10189 fprintf (stream, _(" intel Display instruction in Intel syntax\n"));
9d141669
L
10190 fprintf (stream, _(" att-mnemonic\n"
10191 " Display instruction in AT&T mnemonic\n"));
10192 fprintf (stream, _(" intel-mnemonic\n"
10193 " Display instruction in Intel mnemonic\n"));
f59a29b9
L
10194 fprintf (stream, _(" addr64 Assume 64bit address size\n"));
10195 fprintf (stream, _(" addr32 Assume 32bit address size\n"));
10196 fprintf (stream, _(" addr16 Assume 16bit address size\n"));
10197 fprintf (stream, _(" data32 Assume 32bit data size\n"));
10198 fprintf (stream, _(" data16 Assume 16bit data size\n"));
10199 fprintf (stream, _(" suffix Always display instruction suffix in AT&T syntax\n"));
10200}
10201
b844680a
L
10202/* Get a pointer to struct dis386 with a valid name. */
10203
10204static const struct dis386 *
8bb15339 10205get_valid_dis386 (const struct dis386 *dp, disassemble_info *info)
b844680a 10206{
91d6fa6a 10207 int vindex, vex_table_index;
b844680a
L
10208
10209 if (dp->name != NULL)
10210 return dp;
10211
10212 switch (dp->op[0].bytemode)
10213 {
1ceb70f8
L
10214 case USE_REG_TABLE:
10215 dp = &reg_table[dp->op[1].bytemode][modrm.reg];
10216 break;
10217
10218 case USE_MOD_TABLE:
91d6fa6a
NC
10219 vindex = modrm.mod == 0x3 ? 1 : 0;
10220 dp = &mod_table[dp->op[1].bytemode][vindex];
1ceb70f8
L
10221 break;
10222
10223 case USE_RM_TABLE:
10224 dp = &rm_table[dp->op[1].bytemode][modrm.rm];
b844680a
L
10225 break;
10226
4e7d34a6 10227 case USE_PREFIX_TABLE:
c0f3af97 10228 if (need_vex)
b844680a 10229 {
c0f3af97
L
10230 /* The prefix in VEX is implicit. */
10231 switch (vex.prefix)
10232 {
10233 case 0:
91d6fa6a 10234 vindex = 0;
c0f3af97
L
10235 break;
10236 case REPE_PREFIX_OPCODE:
91d6fa6a 10237 vindex = 1;
c0f3af97
L
10238 break;
10239 case DATA_PREFIX_OPCODE:
91d6fa6a 10240 vindex = 2;
c0f3af97
L
10241 break;
10242 case REPNE_PREFIX_OPCODE:
91d6fa6a 10243 vindex = 3;
c0f3af97
L
10244 break;
10245 default:
10246 abort ();
10247 break;
10248 }
b844680a 10249 }
c0f3af97 10250 else
b844680a 10251 {
91d6fa6a 10252 vindex = 0;
c0f3af97
L
10253 used_prefixes |= (prefixes & PREFIX_REPZ);
10254 if (prefixes & PREFIX_REPZ)
b844680a 10255 {
91d6fa6a 10256 vindex = 1;
f16cd0d5 10257 all_prefixes[last_repz_prefix] = 0;
b844680a
L
10258 }
10259 else
10260 {
c0f3af97
L
10261 /* We should check PREFIX_REPNZ and PREFIX_REPZ before
10262 PREFIX_DATA. */
10263 used_prefixes |= (prefixes & PREFIX_REPNZ);
10264 if (prefixes & PREFIX_REPNZ)
10265 {
91d6fa6a 10266 vindex = 3;
f16cd0d5 10267 all_prefixes[last_repnz_prefix] = 0;
c0f3af97
L
10268 }
10269 else
b844680a 10270 {
c0f3af97
L
10271 used_prefixes |= (prefixes & PREFIX_DATA);
10272 if (prefixes & PREFIX_DATA)
10273 {
91d6fa6a 10274 vindex = 2;
f16cd0d5 10275 all_prefixes[last_data_prefix] = 0;
c0f3af97 10276 }
b844680a
L
10277 }
10278 }
10279 }
91d6fa6a 10280 dp = &prefix_table[dp->op[1].bytemode][vindex];
b844680a
L
10281 break;
10282
4e7d34a6 10283 case USE_X86_64_TABLE:
91d6fa6a
NC
10284 vindex = address_mode == mode_64bit ? 1 : 0;
10285 dp = &x86_64_table[dp->op[1].bytemode][vindex];
b844680a
L
10286 break;
10287
4e7d34a6 10288 case USE_3BYTE_TABLE:
8bb15339 10289 FETCH_DATA (info, codep + 2);
91d6fa6a
NC
10290 vindex = *codep++;
10291 dp = &three_byte_table[dp->op[1].bytemode][vindex];
8bb15339
L
10292 modrm.mod = (*codep >> 6) & 3;
10293 modrm.reg = (*codep >> 3) & 7;
10294 modrm.rm = *codep & 7;
10295 break;
10296
c0f3af97
L
10297 case USE_VEX_LEN_TABLE:
10298 if (!need_vex)
10299 abort ();
10300
10301 switch (vex.length)
10302 {
10303 case 128:
91d6fa6a 10304 vindex = 0;
c0f3af97
L
10305 break;
10306 case 256:
91d6fa6a 10307 vindex = 1;
c0f3af97
L
10308 break;
10309 default:
10310 abort ();
10311 break;
10312 }
10313
91d6fa6a 10314 dp = &vex_len_table[dp->op[1].bytemode][vindex];
c0f3af97
L
10315 break;
10316
f88c9eb0
SP
10317 case USE_XOP_8F_TABLE:
10318 FETCH_DATA (info, codep + 3);
10319 /* All bits in the REX prefix are ignored. */
10320 rex_ignored = rex;
10321 rex = ~(*codep >> 5) & 0x7;
10322
10323 /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm". */
10324 switch ((*codep & 0x1f))
10325 {
10326 default:
10327 BadOp ();
5dd85c99
SP
10328 case 0x8:
10329 vex_table_index = XOP_08;
10330 break;
f88c9eb0
SP
10331 case 0x9:
10332 vex_table_index = XOP_09;
10333 break;
10334 case 0xa:
10335 vex_table_index = XOP_0A;
10336 break;
10337 }
10338 codep++;
10339 vex.w = *codep & 0x80;
10340 if (vex.w && address_mode == mode_64bit)
10341 rex |= REX_W;
10342
10343 vex.register_specifier = (~(*codep >> 3)) & 0xf;
10344 if (address_mode != mode_64bit
10345 && vex.register_specifier > 0x7)
10346 BadOp ();
10347
10348 vex.length = (*codep & 0x4) ? 256 : 128;
10349 switch ((*codep & 0x3))
10350 {
10351 case 0:
10352 vex.prefix = 0;
10353 break;
10354 case 1:
10355 vex.prefix = DATA_PREFIX_OPCODE;
10356 break;
10357 case 2:
10358 vex.prefix = REPE_PREFIX_OPCODE;
10359 break;
10360 case 3:
10361 vex.prefix = REPNE_PREFIX_OPCODE;
10362 break;
10363 }
10364 need_vex = 1;
10365 need_vex_reg = 1;
10366 codep++;
91d6fa6a
NC
10367 vindex = *codep++;
10368 dp = &xop_table[vex_table_index][vindex];
c48244a5
SP
10369
10370 FETCH_DATA (info, codep + 1);
10371 modrm.mod = (*codep >> 6) & 3;
10372 modrm.reg = (*codep >> 3) & 7;
10373 modrm.rm = *codep & 7;
f88c9eb0
SP
10374 break;
10375
c0f3af97
L
10376 case USE_VEX_C4_TABLE:
10377 FETCH_DATA (info, codep + 3);
10378 /* All bits in the REX prefix are ignored. */
10379 rex_ignored = rex;
10380 rex = ~(*codep >> 5) & 0x7;
10381 switch ((*codep & 0x1f))
10382 {
10383 default:
10384 BadOp ();
10385 case 0x1:
f88c9eb0 10386 vex_table_index = VEX_0F;
c0f3af97
L
10387 break;
10388 case 0x2:
f88c9eb0 10389 vex_table_index = VEX_0F38;
c0f3af97
L
10390 break;
10391 case 0x3:
f88c9eb0 10392 vex_table_index = VEX_0F3A;
c0f3af97
L
10393 break;
10394 }
10395 codep++;
10396 vex.w = *codep & 0x80;
10397 if (vex.w && address_mode == mode_64bit)
10398 rex |= REX_W;
10399
10400 vex.register_specifier = (~(*codep >> 3)) & 0xf;
10401 if (address_mode != mode_64bit
10402 && vex.register_specifier > 0x7)
10403 BadOp ();
10404
10405 vex.length = (*codep & 0x4) ? 256 : 128;
10406 switch ((*codep & 0x3))
10407 {
10408 case 0:
10409 vex.prefix = 0;
10410 break;
10411 case 1:
10412 vex.prefix = DATA_PREFIX_OPCODE;
10413 break;
10414 case 2:
10415 vex.prefix = REPE_PREFIX_OPCODE;
10416 break;
10417 case 3:
10418 vex.prefix = REPNE_PREFIX_OPCODE;
10419 break;
10420 }
10421 need_vex = 1;
10422 need_vex_reg = 1;
10423 codep++;
91d6fa6a
NC
10424 vindex = *codep++;
10425 dp = &vex_table[vex_table_index][vindex];
c0f3af97 10426 /* There is no MODRM byte for VEX [82|77]. */
91d6fa6a 10427 if (vindex != 0x77 && vindex != 0x82)
c0f3af97
L
10428 {
10429 FETCH_DATA (info, codep + 1);
10430 modrm.mod = (*codep >> 6) & 3;
10431 modrm.reg = (*codep >> 3) & 7;
10432 modrm.rm = *codep & 7;
10433 }
10434 break;
10435
10436 case USE_VEX_C5_TABLE:
10437 FETCH_DATA (info, codep + 2);
10438 /* All bits in the REX prefix are ignored. */
10439 rex_ignored = rex;
10440 rex = (*codep & 0x80) ? 0 : REX_R;
10441
10442 vex.register_specifier = (~(*codep >> 3)) & 0xf;
10443 if (address_mode != mode_64bit
10444 && vex.register_specifier > 0x7)
10445 BadOp ();
10446
10447 vex.length = (*codep & 0x4) ? 256 : 128;
10448 switch ((*codep & 0x3))
10449 {
10450 case 0:
10451 vex.prefix = 0;
10452 break;
10453 case 1:
10454 vex.prefix = DATA_PREFIX_OPCODE;
10455 break;
10456 case 2:
10457 vex.prefix = REPE_PREFIX_OPCODE;
10458 break;
10459 case 3:
10460 vex.prefix = REPNE_PREFIX_OPCODE;
10461 break;
10462 }
10463 need_vex = 1;
10464 need_vex_reg = 1;
10465 codep++;
91d6fa6a
NC
10466 vindex = *codep++;
10467 dp = &vex_table[dp->op[1].bytemode][vindex];
c0f3af97 10468 /* There is no MODRM byte for VEX [82|77]. */
91d6fa6a 10469 if (vindex != 0x77 && vindex != 0x82)
c0f3af97
L
10470 {
10471 FETCH_DATA (info, codep + 1);
10472 modrm.mod = (*codep >> 6) & 3;
10473 modrm.reg = (*codep >> 3) & 7;
10474 modrm.rm = *codep & 7;
10475 }
10476 break;
10477
b844680a 10478 default:
d34b5006 10479 abort ();
b844680a
L
10480 }
10481
10482 if (dp->name != NULL)
10483 return dp;
10484 else
8bb15339 10485 return get_valid_dis386 (dp, info);
b844680a
L
10486}
10487
e396998b 10488static int
26ca5450 10489print_insn (bfd_vma pc, disassemble_info *info)
252b5132 10490{
2da11e11 10491 const struct dis386 *dp;
252b5132 10492 int i;
ce518a5f 10493 char *op_txt[MAX_OPERANDS];
252b5132 10494 int needcomma;
e396998b
AM
10495 int sizeflag;
10496 const char *p;
252b5132 10497 struct dis_private priv;
eec0f4ca 10498 unsigned char op;
f16cd0d5
L
10499 int prefix_length;
10500 int default_prefixes;
252b5132 10501
cb712a9e 10502 if (info->mach == bfd_mach_x86_64_intel_syntax
8a9036a4
L
10503 || info->mach == bfd_mach_x86_64
10504 || info->mach == bfd_mach_l1om
10505 || info->mach == bfd_mach_l1om_intel_syntax)
cb712a9e
L
10506 address_mode = mode_64bit;
10507 else
10508 address_mode = mode_32bit;
52b15da3 10509
8373f971 10510 if (intel_syntax == (char) -1)
e396998b 10511 intel_syntax = (info->mach == bfd_mach_i386_i386_intel_syntax
8a9036a4
L
10512 || info->mach == bfd_mach_x86_64_intel_syntax
10513 || info->mach == bfd_mach_l1om_intel_syntax);
e396998b 10514
2da11e11 10515 if (info->mach == bfd_mach_i386_i386
52b15da3 10516 || info->mach == bfd_mach_x86_64
8a9036a4 10517 || info->mach == bfd_mach_l1om
52b15da3 10518 || info->mach == bfd_mach_i386_i386_intel_syntax
8a9036a4
L
10519 || info->mach == bfd_mach_x86_64_intel_syntax
10520 || info->mach == bfd_mach_l1om_intel_syntax)
e396998b 10521 priv.orig_sizeflag = AFLAG | DFLAG;
2da11e11 10522 else if (info->mach == bfd_mach_i386_i8086)
e396998b 10523 priv.orig_sizeflag = 0;
2da11e11
AM
10524 else
10525 abort ();
e396998b
AM
10526
10527 for (p = info->disassembler_options; p != NULL; )
10528 {
0112cd26 10529 if (CONST_STRNEQ (p, "x86-64"))
e396998b 10530 {
cb712a9e 10531 address_mode = mode_64bit;
e396998b
AM
10532 priv.orig_sizeflag = AFLAG | DFLAG;
10533 }
0112cd26 10534 else if (CONST_STRNEQ (p, "i386"))
e396998b 10535 {
cb712a9e 10536 address_mode = mode_32bit;
e396998b
AM
10537 priv.orig_sizeflag = AFLAG | DFLAG;
10538 }
0112cd26 10539 else if (CONST_STRNEQ (p, "i8086"))
e396998b 10540 {
cb712a9e 10541 address_mode = mode_16bit;
e396998b
AM
10542 priv.orig_sizeflag = 0;
10543 }
0112cd26 10544 else if (CONST_STRNEQ (p, "intel"))
e396998b
AM
10545 {
10546 intel_syntax = 1;
9d141669
L
10547 if (CONST_STRNEQ (p + 5, "-mnemonic"))
10548 intel_mnemonic = 1;
e396998b 10549 }
0112cd26 10550 else if (CONST_STRNEQ (p, "att"))
e396998b
AM
10551 {
10552 intel_syntax = 0;
9d141669
L
10553 if (CONST_STRNEQ (p + 3, "-mnemonic"))
10554 intel_mnemonic = 0;
e396998b 10555 }
0112cd26 10556 else if (CONST_STRNEQ (p, "addr"))
e396998b 10557 {
f59a29b9
L
10558 if (address_mode == mode_64bit)
10559 {
10560 if (p[4] == '3' && p[5] == '2')
10561 priv.orig_sizeflag &= ~AFLAG;
10562 else if (p[4] == '6' && p[5] == '4')
10563 priv.orig_sizeflag |= AFLAG;
10564 }
10565 else
10566 {
10567 if (p[4] == '1' && p[5] == '6')
10568 priv.orig_sizeflag &= ~AFLAG;
10569 else if (p[4] == '3' && p[5] == '2')
10570 priv.orig_sizeflag |= AFLAG;
10571 }
e396998b 10572 }
0112cd26 10573 else if (CONST_STRNEQ (p, "data"))
e396998b
AM
10574 {
10575 if (p[4] == '1' && p[5] == '6')
10576 priv.orig_sizeflag &= ~DFLAG;
10577 else if (p[4] == '3' && p[5] == '2')
10578 priv.orig_sizeflag |= DFLAG;
10579 }
0112cd26 10580 else if (CONST_STRNEQ (p, "suffix"))
e396998b
AM
10581 priv.orig_sizeflag |= SUFFIX_ALWAYS;
10582
10583 p = strchr (p, ',');
10584 if (p != NULL)
10585 p++;
10586 }
10587
10588 if (intel_syntax)
10589 {
10590 names64 = intel_names64;
10591 names32 = intel_names32;
10592 names16 = intel_names16;
10593 names8 = intel_names8;
10594 names8rex = intel_names8rex;
10595 names_seg = intel_names_seg;
db51cc60
L
10596 index64 = intel_index64;
10597 index32 = intel_index32;
e396998b
AM
10598 index16 = intel_index16;
10599 open_char = '[';
10600 close_char = ']';
10601 separator_char = '+';
10602 scale_char = '*';
10603 }
10604 else
10605 {
10606 names64 = att_names64;
10607 names32 = att_names32;
10608 names16 = att_names16;
10609 names8 = att_names8;
10610 names8rex = att_names8rex;
10611 names_seg = att_names_seg;
db51cc60
L
10612 index64 = att_index64;
10613 index32 = att_index32;
e396998b
AM
10614 index16 = att_index16;
10615 open_char = '(';
10616 close_char = ')';
10617 separator_char = ',';
10618 scale_char = ',';
10619 }
2da11e11 10620
4fe53c98 10621 /* The output looks better if we put 7 bytes on a line, since that
8a9036a4
L
10622 puts most long word instructions on a single line. Use 8 bytes
10623 for Intel L1OM. */
10624 if (info->mach == bfd_mach_l1om
10625 || info->mach == bfd_mach_l1om_intel_syntax)
10626 info->bytes_per_line = 8;
10627 else
10628 info->bytes_per_line = 7;
252b5132 10629
26ca5450 10630 info->private_data = &priv;
252b5132
RH
10631 priv.max_fetched = priv.the_buffer;
10632 priv.insn_start = pc;
252b5132
RH
10633
10634 obuf[0] = 0;
ce518a5f
L
10635 for (i = 0; i < MAX_OPERANDS; ++i)
10636 {
10637 op_out[i][0] = 0;
10638 op_index[i] = -1;
10639 }
252b5132
RH
10640
10641 the_info = info;
10642 start_pc = pc;
e396998b
AM
10643 start_codep = priv.the_buffer;
10644 codep = priv.the_buffer;
252b5132 10645
5076851f
ILT
10646 if (setjmp (priv.bailout) != 0)
10647 {
7d421014
ILT
10648 const char *name;
10649
5076851f 10650 /* Getting here means we tried for data but didn't get it. That
e396998b
AM
10651 means we have an incomplete instruction of some sort. Just
10652 print the first byte as a prefix or a .byte pseudo-op. */
10653 if (codep > priv.the_buffer)
5076851f 10654 {
e396998b 10655 name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
7d421014
ILT
10656 if (name != NULL)
10657 (*info->fprintf_func) (info->stream, "%s", name);
10658 else
5076851f 10659 {
7d421014
ILT
10660 /* Just print the first byte as a .byte instruction. */
10661 (*info->fprintf_func) (info->stream, ".byte 0x%x",
e396998b 10662 (unsigned int) priv.the_buffer[0]);
5076851f 10663 }
5076851f 10664
7d421014 10665 return 1;
5076851f
ILT
10666 }
10667
10668 return -1;
10669 }
10670
52b15da3 10671 obufp = obuf;
f16cd0d5
L
10672 sizeflag = priv.orig_sizeflag;
10673
10674 if (!ckprefix () || rex_used)
10675 {
10676 /* Too many prefixes or unused REX prefixes. */
10677 for (i = 0;
10678 all_prefixes[i] && i < (int) ARRAY_SIZE (all_prefixes);
10679 i++)
10680 (*info->fprintf_func) (info->stream, "%s",
10681 prefix_name (all_prefixes[i], sizeflag));
10682 return 1;
10683 }
252b5132
RH
10684
10685 insn_codep = codep;
10686
10687 FETCH_DATA (info, codep + 1);
10688 two_source_ops = (*codep == 0x62) || (*codep == 0xc8);
10689
3e7d61b2 10690 if (((prefixes & PREFIX_FWAIT)
f16cd0d5 10691 && ((*codep < 0xd8) || (*codep > 0xdf))))
252b5132 10692 {
f16cd0d5 10693 (*info->fprintf_func) (info->stream, "fwait");
7d421014 10694 return 1;
252b5132
RH
10695 }
10696
eec0f4ca 10697 op = 0;
c1e679ec 10698
252b5132
RH
10699 if (*codep == 0x0f)
10700 {
eec0f4ca 10701 unsigned char threebyte;
252b5132 10702 FETCH_DATA (info, codep + 2);
eec0f4ca
L
10703 threebyte = *++codep;
10704 dp = &dis386_twobyte[threebyte];
252b5132 10705 need_modrm = twobyte_has_modrm[*codep];
eec0f4ca 10706 codep++;
252b5132
RH
10707 }
10708 else
10709 {
6439fc28 10710 dp = &dis386[*codep];
252b5132 10711 need_modrm = onebyte_has_modrm[*codep];
eec0f4ca 10712 codep++;
252b5132 10713 }
246c51aa 10714
b844680a 10715 if ((prefixes & PREFIX_REPZ))
f16cd0d5 10716 used_prefixes |= PREFIX_REPZ;
b844680a 10717 if ((prefixes & PREFIX_REPNZ))
f16cd0d5 10718 used_prefixes |= PREFIX_REPNZ;
b844680a 10719 if ((prefixes & PREFIX_LOCK))
f16cd0d5 10720 used_prefixes |= PREFIX_LOCK;
c608c12e 10721
f16cd0d5 10722 default_prefixes = 0;
c608c12e
AM
10723 if (prefixes & PREFIX_ADDR)
10724 {
10725 sizeflag ^= AFLAG;
ce518a5f 10726 if (dp->op[2].bytemode != loop_jcxz_mode || intel_syntax)
3ffd33cf 10727 {
cb712a9e 10728 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
f16cd0d5 10729 all_prefixes[last_addr_prefix] = ADDR32_PREFIX;
3ffd33cf 10730 else
f16cd0d5
L
10731 all_prefixes[last_addr_prefix] = ADDR16_PREFIX;
10732 default_prefixes |= PREFIX_ADDR;
3ffd33cf
AM
10733 }
10734 }
10735
b844680a 10736 if ((prefixes & PREFIX_DATA))
3ffd33cf
AM
10737 {
10738 sizeflag ^= DFLAG;
ce518a5f
L
10739 if (dp->op[2].bytemode == cond_jump_mode
10740 && dp->op[0].bytemode == v_mode
6439fc28 10741 && !intel_syntax)
3ffd33cf
AM
10742 {
10743 if (sizeflag & DFLAG)
f16cd0d5 10744 all_prefixes[last_data_prefix] = DATA32_PREFIX;
3ffd33cf 10745 else
f16cd0d5
L
10746 all_prefixes[last_data_prefix] = DATA16_PREFIX;
10747 default_prefixes |= PREFIX_DATA;
10748 }
10749 else if (rex & REX_W)
10750 {
10751 /* REX_W will override PREFIX_DATA. */
10752 default_prefixes |= PREFIX_DATA;
3ffd33cf
AM
10753 }
10754 }
10755
8bb15339 10756 if (need_modrm)
252b5132
RH
10757 {
10758 FETCH_DATA (info, codep + 1);
7967e09e
L
10759 modrm.mod = (*codep >> 6) & 3;
10760 modrm.reg = (*codep >> 3) & 7;
10761 modrm.rm = *codep & 7;
252b5132
RH
10762 }
10763
55b126d4
L
10764 need_vex = 0;
10765 need_vex_reg = 0;
5639ff87 10766 vex.w = 0;
55b126d4
L
10767 vex_w_done = 0;
10768
ce518a5f 10769 if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
252b5132
RH
10770 {
10771 dofloat (sizeflag);
10772 }
10773 else
10774 {
8bb15339 10775 dp = get_valid_dis386 (dp, info);
b844680a 10776 if (dp != NULL && putop (dp->name, sizeflag) == 0)
ce518a5f
L
10777 {
10778 for (i = 0; i < MAX_OPERANDS; ++i)
10779 {
246c51aa 10780 obufp = op_out[i];
ce518a5f
L
10781 op_ad = MAX_OPERANDS - 1 - i;
10782 if (dp->op[i].rtn)
10783 (*dp->op[i].rtn) (dp->op[i].bytemode, sizeflag);
10784 }
6439fc28 10785 }
252b5132
RH
10786 }
10787
7d421014
ILT
10788 /* See if any prefixes were not used. If so, print the first one
10789 separately. If we don't do this, we'll wind up printing an
10790 instruction stream which does not precisely correspond to the
10791 bytes we are disassembling. */
f16cd0d5 10792 if ((prefixes & ~(used_prefixes | default_prefixes)) != 0)
7d421014 10793 {
f16cd0d5
L
10794 for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
10795 if (all_prefixes[i])
10796 {
10797 const char *name;
10798 name = prefix_name (all_prefixes[i], priv.orig_sizeflag);
10799 if (name == NULL)
10800 name = INTERNAL_DISASSEMBLER_ERROR;
10801 (*info->fprintf_func) (info->stream, "%s", name);
10802 return 1;
10803 }
52b15da3 10804 }
7d421014 10805
f16cd0d5 10806 /* Check if the REX prefix used. */
2a70cca4 10807 if (rex_ignored == 0 && (rex ^ rex_used) == 0)
f16cd0d5
L
10808 all_prefixes[last_rex_prefix] = 0;
10809
10810 /* Check if the SEG prefix used. */
10811 if ((prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS | PREFIX_ES
10812 | PREFIX_FS | PREFIX_GS)) != 0
10813 && (used_prefixes
10814 & seg_prefix (all_prefixes[last_seg_prefix])) != 0)
10815 all_prefixes[last_seg_prefix] = 0;
10816
10817 /* Check if the ADDR prefix used. */
10818 if ((prefixes & PREFIX_ADDR) != 0
10819 && (used_prefixes & PREFIX_ADDR) != 0)
10820 all_prefixes[last_addr_prefix] = 0;
10821
10822 /* Check if the DATA prefix used. */
10823 if ((prefixes & PREFIX_DATA) != 0
10824 && (used_prefixes & PREFIX_DATA) != 0)
10825 all_prefixes[last_data_prefix] = 0;
10826
10827 prefix_length = 0;
f310f33d 10828 for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
f16cd0d5
L
10829 if (all_prefixes[i])
10830 {
10831 const char *name;
10832 name = prefix_name (all_prefixes[i], sizeflag);
10833 if (name == NULL)
10834 abort ();
10835 prefix_length += strlen (name) + 1;
10836 (*info->fprintf_func) (info->stream, "%s ", name);
10837 }
b844680a 10838
f16cd0d5
L
10839 /* Check maximum code length. */
10840 if ((codep - start_codep) > MAX_CODE_LENGTH)
10841 {
10842 (*info->fprintf_func) (info->stream, "(bad)");
10843 return MAX_CODE_LENGTH;
10844 }
b844680a 10845
ea397f5b 10846 obufp = mnemonicendp;
f16cd0d5 10847 for (i = strlen (obuf) + prefix_length; i < 6; i++)
252b5132
RH
10848 oappend (" ");
10849 oappend (" ");
10850 (*info->fprintf_func) (info->stream, "%s", obuf);
10851
10852 /* The enter and bound instructions are printed with operands in the same
10853 order as the intel book; everything else is printed in reverse order. */
2da11e11 10854 if (intel_syntax || two_source_ops)
252b5132 10855 {
185b1163
L
10856 bfd_vma riprel;
10857
ce518a5f
L
10858 for (i = 0; i < MAX_OPERANDS; ++i)
10859 op_txt[i] = op_out[i];
246c51aa 10860
ce518a5f
L
10861 for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
10862 {
10863 op_ad = op_index[i];
10864 op_index[i] = op_index[MAX_OPERANDS - 1 - i];
10865 op_index[MAX_OPERANDS - 1 - i] = op_ad;
185b1163
L
10866 riprel = op_riprel[i];
10867 op_riprel[i] = op_riprel [MAX_OPERANDS - 1 - i];
10868 op_riprel[MAX_OPERANDS - 1 - i] = riprel;
ce518a5f 10869 }
252b5132
RH
10870 }
10871 else
10872 {
ce518a5f
L
10873 for (i = 0; i < MAX_OPERANDS; ++i)
10874 op_txt[MAX_OPERANDS - 1 - i] = op_out[i];
050dfa73
MM
10875 }
10876
ce518a5f
L
10877 needcomma = 0;
10878 for (i = 0; i < MAX_OPERANDS; ++i)
10879 if (*op_txt[i])
10880 {
10881 if (needcomma)
10882 (*info->fprintf_func) (info->stream, ",");
10883 if (op_index[i] != -1 && !op_riprel[i])
10884 (*info->print_address_func) ((bfd_vma) op_address[op_index[i]], info);
10885 else
10886 (*info->fprintf_func) (info->stream, "%s", op_txt[i]);
10887 needcomma = 1;
10888 }
050dfa73 10889
ce518a5f 10890 for (i = 0; i < MAX_OPERANDS; i++)
52b15da3
JH
10891 if (op_index[i] != -1 && op_riprel[i])
10892 {
10893 (*info->fprintf_func) (info->stream, " # ");
10894 (*info->print_address_func) ((bfd_vma) (start_pc + codep - start_codep
10895 + op_address[op_index[i]]), info);
185b1163 10896 break;
52b15da3 10897 }
e396998b 10898 return codep - priv.the_buffer;
252b5132
RH
10899}
10900
6439fc28 10901static const char *float_mem[] = {
252b5132 10902 /* d8 */
7c52e0e8
L
10903 "fadd{s|}",
10904 "fmul{s|}",
10905 "fcom{s|}",
10906 "fcomp{s|}",
10907 "fsub{s|}",
10908 "fsubr{s|}",
10909 "fdiv{s|}",
10910 "fdivr{s|}",
db6eb5be 10911 /* d9 */
7c52e0e8 10912 "fld{s|}",
252b5132 10913 "(bad)",
7c52e0e8
L
10914 "fst{s|}",
10915 "fstp{s|}",
9306ca4a 10916 "fldenvIC",
252b5132 10917 "fldcw",
9306ca4a 10918 "fNstenvIC",
252b5132
RH
10919 "fNstcw",
10920 /* da */
7c52e0e8
L
10921 "fiadd{l|}",
10922 "fimul{l|}",
10923 "ficom{l|}",
10924 "ficomp{l|}",
10925 "fisub{l|}",
10926 "fisubr{l|}",
10927 "fidiv{l|}",
10928 "fidivr{l|}",
252b5132 10929 /* db */
7c52e0e8
L
10930 "fild{l|}",
10931 "fisttp{l|}",
10932 "fist{l|}",
10933 "fistp{l|}",
252b5132 10934 "(bad)",
6439fc28 10935 "fld{t||t|}",
252b5132 10936 "(bad)",
6439fc28 10937 "fstp{t||t|}",
252b5132 10938 /* dc */
7c52e0e8
L
10939 "fadd{l|}",
10940 "fmul{l|}",
10941 "fcom{l|}",
10942 "fcomp{l|}",
10943 "fsub{l|}",
10944 "fsubr{l|}",
10945 "fdiv{l|}",
10946 "fdivr{l|}",
252b5132 10947 /* dd */
7c52e0e8
L
10948 "fld{l|}",
10949 "fisttp{ll|}",
10950 "fst{l||}",
10951 "fstp{l|}",
9306ca4a 10952 "frstorIC",
252b5132 10953 "(bad)",
9306ca4a 10954 "fNsaveIC",
252b5132
RH
10955 "fNstsw",
10956 /* de */
10957 "fiadd",
10958 "fimul",
10959 "ficom",
10960 "ficomp",
10961 "fisub",
10962 "fisubr",
10963 "fidiv",
10964 "fidivr",
10965 /* df */
10966 "fild",
ca164297 10967 "fisttp",
252b5132
RH
10968 "fist",
10969 "fistp",
10970 "fbld",
7c52e0e8 10971 "fild{ll|}",
252b5132 10972 "fbstp",
7c52e0e8 10973 "fistp{ll|}",
1d9f512f
AM
10974};
10975
10976static const unsigned char float_mem_mode[] = {
10977 /* d8 */
10978 d_mode,
10979 d_mode,
10980 d_mode,
10981 d_mode,
10982 d_mode,
10983 d_mode,
10984 d_mode,
10985 d_mode,
10986 /* d9 */
10987 d_mode,
10988 0,
10989 d_mode,
10990 d_mode,
10991 0,
10992 w_mode,
10993 0,
10994 w_mode,
10995 /* da */
10996 d_mode,
10997 d_mode,
10998 d_mode,
10999 d_mode,
11000 d_mode,
11001 d_mode,
11002 d_mode,
11003 d_mode,
11004 /* db */
11005 d_mode,
11006 d_mode,
11007 d_mode,
11008 d_mode,
11009 0,
9306ca4a 11010 t_mode,
1d9f512f 11011 0,
9306ca4a 11012 t_mode,
1d9f512f
AM
11013 /* dc */
11014 q_mode,
11015 q_mode,
11016 q_mode,
11017 q_mode,
11018 q_mode,
11019 q_mode,
11020 q_mode,
11021 q_mode,
11022 /* dd */
11023 q_mode,
11024 q_mode,
11025 q_mode,
11026 q_mode,
11027 0,
11028 0,
11029 0,
11030 w_mode,
11031 /* de */
11032 w_mode,
11033 w_mode,
11034 w_mode,
11035 w_mode,
11036 w_mode,
11037 w_mode,
11038 w_mode,
11039 w_mode,
11040 /* df */
11041 w_mode,
11042 w_mode,
11043 w_mode,
11044 w_mode,
9306ca4a 11045 t_mode,
1d9f512f 11046 q_mode,
9306ca4a 11047 t_mode,
1d9f512f 11048 q_mode
252b5132
RH
11049};
11050
ce518a5f
L
11051#define ST { OP_ST, 0 }
11052#define STi { OP_STi, 0 }
252b5132 11053
4efba78c
L
11054#define FGRPd9_2 NULL, { { NULL, 0 } }
11055#define FGRPd9_4 NULL, { { NULL, 1 } }
11056#define FGRPd9_5 NULL, { { NULL, 2 } }
11057#define FGRPd9_6 NULL, { { NULL, 3 } }
11058#define FGRPd9_7 NULL, { { NULL, 4 } }
11059#define FGRPda_5 NULL, { { NULL, 5 } }
11060#define FGRPdb_4 NULL, { { NULL, 6 } }
11061#define FGRPde_3 NULL, { { NULL, 7 } }
11062#define FGRPdf_4 NULL, { { NULL, 8 } }
252b5132 11063
2da11e11 11064static const struct dis386 float_reg[][8] = {
252b5132
RH
11065 /* d8 */
11066 {
ce518a5f
L
11067 { "fadd", { ST, STi } },
11068 { "fmul", { ST, STi } },
11069 { "fcom", { STi } },
11070 { "fcomp", { STi } },
11071 { "fsub", { ST, STi } },
11072 { "fsubr", { ST, STi } },
11073 { "fdiv", { ST, STi } },
11074 { "fdivr", { ST, STi } },
252b5132
RH
11075 },
11076 /* d9 */
11077 {
ce518a5f
L
11078 { "fld", { STi } },
11079 { "fxch", { STi } },
252b5132 11080 { FGRPd9_2 },
ce518a5f 11081 { "(bad)", { XX } },
252b5132
RH
11082 { FGRPd9_4 },
11083 { FGRPd9_5 },
11084 { FGRPd9_6 },
11085 { FGRPd9_7 },
11086 },
11087 /* da */
11088 {
ce518a5f
L
11089 { "fcmovb", { ST, STi } },
11090 { "fcmove", { ST, STi } },
11091 { "fcmovbe",{ ST, STi } },
11092 { "fcmovu", { ST, STi } },
11093 { "(bad)", { XX } },
252b5132 11094 { FGRPda_5 },
ce518a5f
L
11095 { "(bad)", { XX } },
11096 { "(bad)", { XX } },
252b5132
RH
11097 },
11098 /* db */
11099 {
ce518a5f
L
11100 { "fcmovnb",{ ST, STi } },
11101 { "fcmovne",{ ST, STi } },
11102 { "fcmovnbe",{ ST, STi } },
11103 { "fcmovnu",{ ST, STi } },
252b5132 11104 { FGRPdb_4 },
ce518a5f
L
11105 { "fucomi", { ST, STi } },
11106 { "fcomi", { ST, STi } },
11107 { "(bad)", { XX } },
252b5132
RH
11108 },
11109 /* dc */
11110 {
ce518a5f
L
11111 { "fadd", { STi, ST } },
11112 { "fmul", { STi, ST } },
11113 { "(bad)", { XX } },
11114 { "(bad)", { XX } },
9d141669
L
11115 { "fsub!M", { STi, ST } },
11116 { "fsubM", { STi, ST } },
11117 { "fdiv!M", { STi, ST } },
11118 { "fdivM", { STi, ST } },
252b5132
RH
11119 },
11120 /* dd */
11121 {
ce518a5f
L
11122 { "ffree", { STi } },
11123 { "(bad)", { XX } },
11124 { "fst", { STi } },
11125 { "fstp", { STi } },
11126 { "fucom", { STi } },
11127 { "fucomp", { STi } },
11128 { "(bad)", { XX } },
11129 { "(bad)", { XX } },
252b5132
RH
11130 },
11131 /* de */
11132 {
ce518a5f
L
11133 { "faddp", { STi, ST } },
11134 { "fmulp", { STi, ST } },
11135 { "(bad)", { XX } },
252b5132 11136 { FGRPde_3 },
9d141669
L
11137 { "fsub!Mp", { STi, ST } },
11138 { "fsubMp", { STi, ST } },
11139 { "fdiv!Mp", { STi, ST } },
11140 { "fdivMp", { STi, ST } },
252b5132
RH
11141 },
11142 /* df */
11143 {
ce518a5f
L
11144 { "ffreep", { STi } },
11145 { "(bad)", { XX } },
11146 { "(bad)", { XX } },
11147 { "(bad)", { XX } },
252b5132 11148 { FGRPdf_4 },
ce518a5f
L
11149 { "fucomip", { ST, STi } },
11150 { "fcomip", { ST, STi } },
11151 { "(bad)", { XX } },
252b5132
RH
11152 },
11153};
11154
252b5132
RH
11155static char *fgrps[][8] = {
11156 /* d9_2 0 */
11157 {
11158 "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
11159 },
11160
11161 /* d9_4 1 */
11162 {
11163 "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
11164 },
11165
11166 /* d9_5 2 */
11167 {
11168 "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
11169 },
11170
11171 /* d9_6 3 */
11172 {
11173 "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
11174 },
11175
11176 /* d9_7 4 */
11177 {
11178 "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
11179 },
11180
11181 /* da_5 5 */
11182 {
11183 "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
11184 },
11185
11186 /* db_4 6 */
11187 {
309d3373
JB
11188 "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
11189 "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
252b5132
RH
11190 },
11191
11192 /* de_3 7 */
11193 {
11194 "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
11195 },
11196
11197 /* df_4 8 */
11198 {
11199 "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
11200 },
11201};
11202
b6169b20
L
11203static void
11204swap_operand (void)
11205{
11206 mnemonicendp[0] = '.';
11207 mnemonicendp[1] = 's';
11208 mnemonicendp += 2;
11209}
11210
b844680a
L
11211static void
11212OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED,
11213 int sizeflag ATTRIBUTE_UNUSED)
11214{
11215 /* Skip mod/rm byte. */
11216 MODRM_CHECK;
11217 codep++;
11218}
11219
252b5132 11220static void
26ca5450 11221dofloat (int sizeflag)
252b5132 11222{
2da11e11 11223 const struct dis386 *dp;
252b5132
RH
11224 unsigned char floatop;
11225
11226 floatop = codep[-1];
11227
7967e09e 11228 if (modrm.mod != 3)
252b5132 11229 {
7967e09e 11230 int fp_indx = (floatop - 0xd8) * 8 + modrm.reg;
1d9f512f
AM
11231
11232 putop (float_mem[fp_indx], sizeflag);
ce518a5f 11233 obufp = op_out[0];
6e50d963 11234 op_ad = 2;
1d9f512f 11235 OP_E (float_mem_mode[fp_indx], sizeflag);
252b5132
RH
11236 return;
11237 }
6608db57 11238 /* Skip mod/rm byte. */
4bba6815 11239 MODRM_CHECK;
252b5132
RH
11240 codep++;
11241
7967e09e 11242 dp = &float_reg[floatop - 0xd8][modrm.reg];
252b5132
RH
11243 if (dp->name == NULL)
11244 {
7967e09e 11245 putop (fgrps[dp->op[0].bytemode][modrm.rm], sizeflag);
252b5132 11246
6608db57 11247 /* Instruction fnstsw is only one with strange arg. */
252b5132 11248 if (floatop == 0xdf && codep[-1] == 0xe0)
ce518a5f 11249 strcpy (op_out[0], names16[0]);
252b5132
RH
11250 }
11251 else
11252 {
11253 putop (dp->name, sizeflag);
11254
ce518a5f 11255 obufp = op_out[0];
6e50d963 11256 op_ad = 2;
ce518a5f
L
11257 if (dp->op[0].rtn)
11258 (*dp->op[0].rtn) (dp->op[0].bytemode, sizeflag);
6e50d963 11259
ce518a5f 11260 obufp = op_out[1];
6e50d963 11261 op_ad = 1;
ce518a5f
L
11262 if (dp->op[1].rtn)
11263 (*dp->op[1].rtn) (dp->op[1].bytemode, sizeflag);
252b5132
RH
11264 }
11265}
11266
252b5132 11267static void
26ca5450 11268OP_ST (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 11269{
422673a9 11270 oappend ("%st" + intel_syntax);
252b5132
RH
11271}
11272
252b5132 11273static void
26ca5450 11274OP_STi (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 11275{
7967e09e 11276 sprintf (scratchbuf, "%%st(%d)", modrm.rm);
d708bcba 11277 oappend (scratchbuf + intel_syntax);
252b5132
RH
11278}
11279
6608db57 11280/* Capital letters in template are macros. */
6439fc28 11281static int
d3ce72d0 11282putop (const char *in_template, int sizeflag)
252b5132 11283{
2da11e11 11284 const char *p;
9306ca4a 11285 int alt = 0;
9d141669 11286 int cond = 1;
98b528ac
L
11287 unsigned int l = 0, len = 1;
11288 char last[4];
11289
11290#define SAVE_LAST(c) \
11291 if (l < len && l < sizeof (last)) \
11292 last[l++] = c; \
11293 else \
11294 abort ();
252b5132 11295
d3ce72d0 11296 for (p = in_template; *p; p++)
252b5132
RH
11297 {
11298 switch (*p)
11299 {
11300 default:
11301 *obufp++ = *p;
11302 break;
98b528ac
L
11303 case '%':
11304 len++;
11305 break;
9d141669
L
11306 case '!':
11307 cond = 0;
11308 break;
6439fc28
AM
11309 case '{':
11310 alt = 0;
11311 if (intel_syntax)
6439fc28
AM
11312 {
11313 while (*++p != '|')
7c52e0e8
L
11314 if (*p == '}' || *p == '\0')
11315 abort ();
6439fc28 11316 }
9306ca4a
JB
11317 /* Fall through. */
11318 case 'I':
11319 alt = 1;
11320 continue;
6439fc28
AM
11321 case '|':
11322 while (*++p != '}')
11323 {
11324 if (*p == '\0')
11325 abort ();
11326 }
11327 break;
11328 case '}':
11329 break;
252b5132 11330 case 'A':
db6eb5be
AM
11331 if (intel_syntax)
11332 break;
7967e09e 11333 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
252b5132
RH
11334 *obufp++ = 'b';
11335 break;
11336 case 'B':
4b06377f
L
11337 if (l == 0 && len == 1)
11338 {
11339case_B:
11340 if (intel_syntax)
11341 break;
11342 if (sizeflag & SUFFIX_ALWAYS)
11343 *obufp++ = 'b';
11344 }
11345 else
11346 {
11347 if (l != 1
11348 || len != 2
11349 || last[0] != 'L')
11350 {
11351 SAVE_LAST (*p);
11352 break;
11353 }
11354
11355 if (address_mode == mode_64bit
11356 && !(prefixes & PREFIX_ADDR))
11357 {
11358 *obufp++ = 'a';
11359 *obufp++ = 'b';
11360 *obufp++ = 's';
11361 }
11362
11363 goto case_B;
11364 }
252b5132 11365 break;
9306ca4a
JB
11366 case 'C':
11367 if (intel_syntax && !alt)
11368 break;
11369 if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
11370 {
11371 if (sizeflag & DFLAG)
11372 *obufp++ = intel_syntax ? 'd' : 'l';
11373 else
11374 *obufp++ = intel_syntax ? 'w' : 's';
11375 used_prefixes |= (prefixes & PREFIX_DATA);
11376 }
11377 break;
ed7841b3
JB
11378 case 'D':
11379 if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
11380 break;
161a04f6 11381 USED_REX (REX_W);
7967e09e 11382 if (modrm.mod == 3)
ed7841b3 11383 {
161a04f6 11384 if (rex & REX_W)
ed7841b3 11385 *obufp++ = 'q';
ed7841b3 11386 else
f16cd0d5
L
11387 {
11388 if (sizeflag & DFLAG)
11389 *obufp++ = intel_syntax ? 'd' : 'l';
11390 else
11391 *obufp++ = 'w';
11392 used_prefixes |= (prefixes & PREFIX_DATA);
11393 }
ed7841b3
JB
11394 }
11395 else
11396 *obufp++ = 'w';
11397 break;
252b5132 11398 case 'E': /* For jcxz/jecxz */
cb712a9e 11399 if (address_mode == mode_64bit)
c1a64871
JH
11400 {
11401 if (sizeflag & AFLAG)
11402 *obufp++ = 'r';
11403 else
11404 *obufp++ = 'e';
11405 }
11406 else
11407 if (sizeflag & AFLAG)
11408 *obufp++ = 'e';
3ffd33cf
AM
11409 used_prefixes |= (prefixes & PREFIX_ADDR);
11410 break;
11411 case 'F':
db6eb5be
AM
11412 if (intel_syntax)
11413 break;
e396998b 11414 if ((prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
3ffd33cf
AM
11415 {
11416 if (sizeflag & AFLAG)
cb712a9e 11417 *obufp++ = address_mode == mode_64bit ? 'q' : 'l';
3ffd33cf 11418 else
cb712a9e 11419 *obufp++ = address_mode == mode_64bit ? 'l' : 'w';
3ffd33cf
AM
11420 used_prefixes |= (prefixes & PREFIX_ADDR);
11421 }
252b5132 11422 break;
52fd6d94
JB
11423 case 'G':
11424 if (intel_syntax || (obufp[-1] != 's' && !(sizeflag & SUFFIX_ALWAYS)))
11425 break;
161a04f6 11426 if ((rex & REX_W) || (sizeflag & DFLAG))
52fd6d94
JB
11427 *obufp++ = 'l';
11428 else
11429 *obufp++ = 'w';
161a04f6 11430 if (!(rex & REX_W))
52fd6d94
JB
11431 used_prefixes |= (prefixes & PREFIX_DATA);
11432 break;
5dd0794d 11433 case 'H':
db6eb5be
AM
11434 if (intel_syntax)
11435 break;
5dd0794d
AM
11436 if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
11437 || (prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
11438 {
11439 used_prefixes |= prefixes & (PREFIX_CS | PREFIX_DS);
11440 *obufp++ = ',';
11441 *obufp++ = 'p';
11442 if (prefixes & PREFIX_DS)
11443 *obufp++ = 't';
11444 else
11445 *obufp++ = 'n';
11446 }
11447 break;
9306ca4a
JB
11448 case 'J':
11449 if (intel_syntax)
11450 break;
11451 *obufp++ = 'l';
11452 break;
42903f7f
L
11453 case 'K':
11454 USED_REX (REX_W);
11455 if (rex & REX_W)
11456 *obufp++ = 'q';
11457 else
11458 *obufp++ = 'd';
11459 break;
6dd5059a
L
11460 case 'Z':
11461 if (intel_syntax)
11462 break;
11463 if (address_mode == mode_64bit && (sizeflag & SUFFIX_ALWAYS))
11464 {
11465 *obufp++ = 'q';
11466 break;
11467 }
11468 /* Fall through. */
98b528ac 11469 goto case_L;
252b5132 11470 case 'L':
98b528ac
L
11471 if (l != 0 || len != 1)
11472 {
11473 SAVE_LAST (*p);
11474 break;
11475 }
11476case_L:
db6eb5be
AM
11477 if (intel_syntax)
11478 break;
252b5132
RH
11479 if (sizeflag & SUFFIX_ALWAYS)
11480 *obufp++ = 'l';
252b5132 11481 break;
9d141669
L
11482 case 'M':
11483 if (intel_mnemonic != cond)
11484 *obufp++ = 'r';
11485 break;
252b5132
RH
11486 case 'N':
11487 if ((prefixes & PREFIX_FWAIT) == 0)
11488 *obufp++ = 'n';
7d421014
ILT
11489 else
11490 used_prefixes |= PREFIX_FWAIT;
252b5132 11491 break;
52b15da3 11492 case 'O':
161a04f6
L
11493 USED_REX (REX_W);
11494 if (rex & REX_W)
6439fc28 11495 *obufp++ = 'o';
a35ca55a
JB
11496 else if (intel_syntax && (sizeflag & DFLAG))
11497 *obufp++ = 'q';
52b15da3
JH
11498 else
11499 *obufp++ = 'd';
161a04f6 11500 if (!(rex & REX_W))
a35ca55a 11501 used_prefixes |= (prefixes & PREFIX_DATA);
52b15da3 11502 break;
6439fc28 11503 case 'T':
db6eb5be
AM
11504 if (intel_syntax)
11505 break;
cb712a9e 11506 if (address_mode == mode_64bit && (sizeflag & DFLAG))
6439fc28
AM
11507 {
11508 *obufp++ = 'q';
11509 break;
11510 }
6608db57 11511 /* Fall through. */
252b5132 11512 case 'P':
db6eb5be
AM
11513 if (intel_syntax)
11514 break;
252b5132 11515 if ((prefixes & PREFIX_DATA)
161a04f6 11516 || (rex & REX_W)
e396998b 11517 || (sizeflag & SUFFIX_ALWAYS))
252b5132 11518 {
161a04f6
L
11519 USED_REX (REX_W);
11520 if (rex & REX_W)
52b15da3 11521 *obufp++ = 'q';
c2419411 11522 else
52b15da3
JH
11523 {
11524 if (sizeflag & DFLAG)
11525 *obufp++ = 'l';
11526 else
11527 *obufp++ = 'w';
f16cd0d5 11528 used_prefixes |= (prefixes & PREFIX_DATA);
52b15da3 11529 }
252b5132
RH
11530 }
11531 break;
6439fc28 11532 case 'U':
db6eb5be
AM
11533 if (intel_syntax)
11534 break;
cb712a9e 11535 if (address_mode == mode_64bit && (sizeflag & DFLAG))
6439fc28 11536 {
7967e09e 11537 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
1a114b12 11538 *obufp++ = 'q';
6439fc28
AM
11539 break;
11540 }
6608db57 11541 /* Fall through. */
98b528ac 11542 goto case_Q;
252b5132 11543 case 'Q':
98b528ac 11544 if (l == 0 && len == 1)
252b5132 11545 {
98b528ac
L
11546case_Q:
11547 if (intel_syntax && !alt)
11548 break;
11549 USED_REX (REX_W);
11550 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
52b15da3 11551 {
98b528ac
L
11552 if (rex & REX_W)
11553 *obufp++ = 'q';
52b15da3 11554 else
98b528ac
L
11555 {
11556 if (sizeflag & DFLAG)
11557 *obufp++ = intel_syntax ? 'd' : 'l';
11558 else
11559 *obufp++ = 'w';
f16cd0d5 11560 used_prefixes |= (prefixes & PREFIX_DATA);
98b528ac 11561 }
52b15da3 11562 }
98b528ac
L
11563 }
11564 else
11565 {
11566 if (l != 1 || len != 2 || last[0] != 'L')
11567 {
11568 SAVE_LAST (*p);
11569 break;
11570 }
11571 if (intel_syntax
11572 || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
11573 break;
11574 if ((rex & REX_W))
11575 {
11576 USED_REX (REX_W);
11577 *obufp++ = 'q';
11578 }
11579 else
11580 *obufp++ = 'l';
252b5132
RH
11581 }
11582 break;
11583 case 'R':
161a04f6
L
11584 USED_REX (REX_W);
11585 if (rex & REX_W)
a35ca55a
JB
11586 *obufp++ = 'q';
11587 else if (sizeflag & DFLAG)
c608c12e 11588 {
a35ca55a 11589 if (intel_syntax)
c608c12e 11590 *obufp++ = 'd';
c608c12e 11591 else
a35ca55a 11592 *obufp++ = 'l';
c608c12e 11593 }
252b5132 11594 else
a35ca55a
JB
11595 *obufp++ = 'w';
11596 if (intel_syntax && !p[1]
161a04f6 11597 && ((rex & REX_W) || (sizeflag & DFLAG)))
a35ca55a 11598 *obufp++ = 'e';
161a04f6 11599 if (!(rex & REX_W))
52b15da3 11600 used_prefixes |= (prefixes & PREFIX_DATA);
252b5132 11601 break;
1a114b12 11602 case 'V':
4b06377f 11603 if (l == 0 && len == 1)
1a114b12 11604 {
4b06377f
L
11605 if (intel_syntax)
11606 break;
11607 if (address_mode == mode_64bit && (sizeflag & DFLAG))
11608 {
11609 if (sizeflag & SUFFIX_ALWAYS)
11610 *obufp++ = 'q';
11611 break;
11612 }
11613 }
11614 else
11615 {
11616 if (l != 1
11617 || len != 2
11618 || last[0] != 'L')
11619 {
11620 SAVE_LAST (*p);
11621 break;
11622 }
11623
11624 if (rex & REX_W)
11625 {
11626 *obufp++ = 'a';
11627 *obufp++ = 'b';
11628 *obufp++ = 's';
11629 }
1a114b12
JB
11630 }
11631 /* Fall through. */
4b06377f 11632 goto case_S;
252b5132 11633 case 'S':
4b06377f 11634 if (l == 0 && len == 1)
252b5132 11635 {
4b06377f
L
11636case_S:
11637 if (intel_syntax)
11638 break;
11639 if (sizeflag & SUFFIX_ALWAYS)
52b15da3 11640 {
4b06377f
L
11641 if (rex & REX_W)
11642 *obufp++ = 'q';
52b15da3 11643 else
4b06377f
L
11644 {
11645 if (sizeflag & DFLAG)
11646 *obufp++ = 'l';
11647 else
11648 *obufp++ = 'w';
11649 used_prefixes |= (prefixes & PREFIX_DATA);
11650 }
11651 }
11652 }
11653 else
11654 {
11655 if (l != 1
11656 || len != 2
11657 || last[0] != 'L')
11658 {
11659 SAVE_LAST (*p);
11660 break;
52b15da3 11661 }
4b06377f
L
11662
11663 if (address_mode == mode_64bit
11664 && !(prefixes & PREFIX_ADDR))
11665 {
11666 *obufp++ = 'a';
11667 *obufp++ = 'b';
11668 *obufp++ = 's';
11669 }
11670
11671 goto case_S;
252b5132 11672 }
252b5132 11673 break;
041bd2e0 11674 case 'X':
c0f3af97
L
11675 if (l != 0 || len != 1)
11676 {
11677 SAVE_LAST (*p);
11678 break;
11679 }
11680 if (need_vex && vex.prefix)
11681 {
11682 if (vex.prefix == DATA_PREFIX_OPCODE)
11683 *obufp++ = 'd';
11684 else
11685 *obufp++ = 's';
11686 }
041bd2e0 11687 else
f16cd0d5
L
11688 {
11689 if (prefixes & PREFIX_DATA)
11690 *obufp++ = 'd';
11691 else
11692 *obufp++ = 's';
11693 used_prefixes |= (prefixes & PREFIX_DATA);
11694 }
041bd2e0 11695 break;
76f227a5 11696 case 'Y':
c0f3af97 11697 if (l == 0 && len == 1)
76f227a5 11698 {
c0f3af97
L
11699 if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
11700 break;
11701 if (rex & REX_W)
11702 {
11703 USED_REX (REX_W);
11704 *obufp++ = 'q';
11705 }
11706 break;
11707 }
11708 else
11709 {
11710 if (l != 1 || len != 2 || last[0] != 'X')
11711 {
11712 SAVE_LAST (*p);
11713 break;
11714 }
11715 if (!need_vex)
11716 abort ();
11717 if (intel_syntax
11718 || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
11719 break;
11720 switch (vex.length)
11721 {
11722 case 128:
11723 *obufp++ = 'x';
11724 break;
11725 case 256:
11726 *obufp++ = 'y';
11727 break;
11728 default:
11729 abort ();
11730 }
76f227a5
JH
11731 }
11732 break;
252b5132 11733 case 'W':
0bfee649 11734 if (l == 0 && len == 1)
a35ca55a 11735 {
0bfee649
L
11736 /* operand size flag for cwtl, cbtw */
11737 USED_REX (REX_W);
11738 if (rex & REX_W)
11739 {
11740 if (intel_syntax)
11741 *obufp++ = 'd';
11742 else
11743 *obufp++ = 'l';
11744 }
11745 else if (sizeflag & DFLAG)
11746 *obufp++ = 'w';
a35ca55a 11747 else
0bfee649
L
11748 *obufp++ = 'b';
11749 if (!(rex & REX_W))
11750 used_prefixes |= (prefixes & PREFIX_DATA);
a35ca55a 11751 }
252b5132 11752 else
0bfee649
L
11753 {
11754 if (l != 1 || len != 2 || last[0] != 'X')
11755 {
11756 SAVE_LAST (*p);
11757 break;
11758 }
11759 if (!need_vex)
11760 abort ();
11761 *obufp++ = vex.w ? 'd': 's';
11762 }
252b5132
RH
11763 break;
11764 }
9306ca4a 11765 alt = 0;
252b5132
RH
11766 }
11767 *obufp = 0;
ea397f5b 11768 mnemonicendp = obufp;
6439fc28 11769 return 0;
252b5132
RH
11770}
11771
11772static void
26ca5450 11773oappend (const char *s)
252b5132 11774{
ea397f5b 11775 obufp = stpcpy (obufp, s);
252b5132
RH
11776}
11777
11778static void
26ca5450 11779append_seg (void)
252b5132
RH
11780{
11781 if (prefixes & PREFIX_CS)
7d421014 11782 {
7d421014 11783 used_prefixes |= PREFIX_CS;
d708bcba 11784 oappend ("%cs:" + intel_syntax);
7d421014 11785 }
252b5132 11786 if (prefixes & PREFIX_DS)
7d421014 11787 {
7d421014 11788 used_prefixes |= PREFIX_DS;
d708bcba 11789 oappend ("%ds:" + intel_syntax);
7d421014 11790 }
252b5132 11791 if (prefixes & PREFIX_SS)
7d421014 11792 {
7d421014 11793 used_prefixes |= PREFIX_SS;
d708bcba 11794 oappend ("%ss:" + intel_syntax);
7d421014 11795 }
252b5132 11796 if (prefixes & PREFIX_ES)
7d421014 11797 {
7d421014 11798 used_prefixes |= PREFIX_ES;
d708bcba 11799 oappend ("%es:" + intel_syntax);
7d421014 11800 }
252b5132 11801 if (prefixes & PREFIX_FS)
7d421014 11802 {
7d421014 11803 used_prefixes |= PREFIX_FS;
d708bcba 11804 oappend ("%fs:" + intel_syntax);
7d421014 11805 }
252b5132 11806 if (prefixes & PREFIX_GS)
7d421014 11807 {
7d421014 11808 used_prefixes |= PREFIX_GS;
d708bcba 11809 oappend ("%gs:" + intel_syntax);
7d421014 11810 }
252b5132
RH
11811}
11812
11813static void
26ca5450 11814OP_indirE (int bytemode, int sizeflag)
252b5132
RH
11815{
11816 if (!intel_syntax)
11817 oappend ("*");
11818 OP_E (bytemode, sizeflag);
11819}
11820
52b15da3 11821static void
26ca5450 11822print_operand_value (char *buf, int hex, bfd_vma disp)
52b15da3 11823{
cb712a9e 11824 if (address_mode == mode_64bit)
52b15da3
JH
11825 {
11826 if (hex)
11827 {
11828 char tmp[30];
11829 int i;
11830 buf[0] = '0';
11831 buf[1] = 'x';
11832 sprintf_vma (tmp, disp);
6608db57 11833 for (i = 0; tmp[i] == '0' && tmp[i + 1]; i++);
52b15da3
JH
11834 strcpy (buf + 2, tmp + i);
11835 }
11836 else
11837 {
11838 bfd_signed_vma v = disp;
11839 char tmp[30];
11840 int i;
11841 if (v < 0)
11842 {
11843 *(buf++) = '-';
11844 v = -disp;
6608db57 11845 /* Check for possible overflow on 0x8000000000000000. */
52b15da3
JH
11846 if (v < 0)
11847 {
11848 strcpy (buf, "9223372036854775808");
11849 return;
11850 }
11851 }
11852 if (!v)
11853 {
11854 strcpy (buf, "0");
11855 return;
11856 }
11857
11858 i = 0;
11859 tmp[29] = 0;
11860 while (v)
11861 {
6608db57 11862 tmp[28 - i] = (v % 10) + '0';
52b15da3
JH
11863 v /= 10;
11864 i++;
11865 }
11866 strcpy (buf, tmp + 29 - i);
11867 }
11868 }
11869 else
11870 {
11871 if (hex)
11872 sprintf (buf, "0x%x", (unsigned int) disp);
11873 else
11874 sprintf (buf, "%d", (int) disp);
11875 }
11876}
11877
5d669648
L
11878/* Put DISP in BUF as signed hex number. */
11879
11880static void
11881print_displacement (char *buf, bfd_vma disp)
11882{
11883 bfd_signed_vma val = disp;
11884 char tmp[30];
11885 int i, j = 0;
11886
11887 if (val < 0)
11888 {
11889 buf[j++] = '-';
11890 val = -disp;
11891
11892 /* Check for possible overflow. */
11893 if (val < 0)
11894 {
11895 switch (address_mode)
11896 {
11897 case mode_64bit:
11898 strcpy (buf + j, "0x8000000000000000");
11899 break;
11900 case mode_32bit:
11901 strcpy (buf + j, "0x80000000");
11902 break;
11903 case mode_16bit:
11904 strcpy (buf + j, "0x8000");
11905 break;
11906 }
11907 return;
11908 }
11909 }
11910
11911 buf[j++] = '0';
11912 buf[j++] = 'x';
11913
0af1713e 11914 sprintf_vma (tmp, (bfd_vma) val);
5d669648
L
11915 for (i = 0; tmp[i] == '0'; i++)
11916 continue;
11917 if (tmp[i] == '\0')
11918 i--;
11919 strcpy (buf + j, tmp + i);
11920}
11921
3f31e633
JB
11922static void
11923intel_operand_size (int bytemode, int sizeflag)
11924{
11925 switch (bytemode)
11926 {
11927 case b_mode:
b6169b20 11928 case b_swap_mode:
42903f7f 11929 case dqb_mode:
3f31e633
JB
11930 oappend ("BYTE PTR ");
11931 break;
11932 case w_mode:
11933 case dqw_mode:
11934 oappend ("WORD PTR ");
11935 break;
1a114b12 11936 case stack_v_mode:
cb712a9e 11937 if (address_mode == mode_64bit && (sizeflag & DFLAG))
3f31e633
JB
11938 {
11939 oappend ("QWORD PTR ");
3f31e633
JB
11940 break;
11941 }
11942 /* FALLTHRU */
11943 case v_mode:
b6169b20 11944 case v_swap_mode:
3f31e633 11945 case dq_mode:
161a04f6
L
11946 USED_REX (REX_W);
11947 if (rex & REX_W)
3f31e633 11948 oappend ("QWORD PTR ");
3f31e633 11949 else
f16cd0d5
L
11950 {
11951 if ((sizeflag & DFLAG) || bytemode == dq_mode)
11952 oappend ("DWORD PTR ");
11953 else
11954 oappend ("WORD PTR ");
11955 used_prefixes |= (prefixes & PREFIX_DATA);
11956 }
3f31e633 11957 break;
52fd6d94 11958 case z_mode:
161a04f6 11959 if ((rex & REX_W) || (sizeflag & DFLAG))
52fd6d94
JB
11960 *obufp++ = 'D';
11961 oappend ("WORD PTR ");
161a04f6 11962 if (!(rex & REX_W))
52fd6d94
JB
11963 used_prefixes |= (prefixes & PREFIX_DATA);
11964 break;
34b772a6
JB
11965 case a_mode:
11966 if (sizeflag & DFLAG)
11967 oappend ("QWORD PTR ");
11968 else
11969 oappend ("DWORD PTR ");
11970 used_prefixes |= (prefixes & PREFIX_DATA);
11971 break;
3f31e633 11972 case d_mode:
fa99fab2 11973 case d_swap_mode:
42903f7f 11974 case dqd_mode:
3f31e633
JB
11975 oappend ("DWORD PTR ");
11976 break;
11977 case q_mode:
b6169b20 11978 case q_swap_mode:
3f31e633
JB
11979 oappend ("QWORD PTR ");
11980 break;
11981 case m_mode:
cb712a9e 11982 if (address_mode == mode_64bit)
3f31e633
JB
11983 oappend ("QWORD PTR ");
11984 else
11985 oappend ("DWORD PTR ");
11986 break;
11987 case f_mode:
11988 if (sizeflag & DFLAG)
11989 oappend ("FWORD PTR ");
11990 else
11991 oappend ("DWORD PTR ");
11992 used_prefixes |= (prefixes & PREFIX_DATA);
11993 break;
11994 case t_mode:
11995 oappend ("TBYTE PTR ");
11996 break;
11997 case x_mode:
b6169b20 11998 case x_swap_mode:
c0f3af97
L
11999 if (need_vex)
12000 {
12001 switch (vex.length)
12002 {
12003 case 128:
12004 oappend ("XMMWORD PTR ");
12005 break;
12006 case 256:
12007 oappend ("YMMWORD PTR ");
12008 break;
12009 default:
12010 abort ();
12011 }
12012 }
12013 else
12014 oappend ("XMMWORD PTR ");
12015 break;
12016 case xmm_mode:
3f31e633
JB
12017 oappend ("XMMWORD PTR ");
12018 break;
c0f3af97
L
12019 case xmmq_mode:
12020 if (!need_vex)
12021 abort ();
12022
12023 switch (vex.length)
12024 {
12025 case 128:
12026 oappend ("QWORD PTR ");
12027 break;
12028 case 256:
12029 oappend ("XMMWORD PTR ");
12030 break;
12031 default:
12032 abort ();
12033 }
12034 break;
12035 case ymmq_mode:
12036 if (!need_vex)
12037 abort ();
12038
12039 switch (vex.length)
12040 {
12041 case 128:
12042 oappend ("QWORD PTR ");
12043 break;
12044 case 256:
12045 oappend ("YMMWORD PTR ");
12046 break;
12047 default:
12048 abort ();
12049 }
12050 break;
fb9c77c7
L
12051 case o_mode:
12052 oappend ("OWORD PTR ");
12053 break;
0bfee649
L
12054 case vex_w_dq_mode:
12055 if (!need_vex)
12056 abort ();
12057
12058 if (vex.w)
12059 oappend ("QWORD PTR ");
12060 else
12061 oappend ("DWORD PTR ");
12062 break;
3f31e633
JB
12063 default:
12064 break;
12065 }
12066}
12067
252b5132 12068static void
c0f3af97 12069OP_E_register (int bytemode, int sizeflag)
252b5132 12070{
c0f3af97
L
12071 int reg = modrm.rm;
12072 const char **names;
252b5132 12073
c0f3af97
L
12074 USED_REX (REX_B);
12075 if ((rex & REX_B))
12076 reg += 8;
252b5132 12077
b6169b20
L
12078 if ((sizeflag & SUFFIX_ALWAYS)
12079 && (bytemode == b_swap_mode || bytemode == v_swap_mode))
12080 swap_operand ();
12081
c0f3af97 12082 switch (bytemode)
252b5132 12083 {
c0f3af97 12084 case b_mode:
b6169b20 12085 case b_swap_mode:
c0f3af97
L
12086 USED_REX (0);
12087 if (rex)
12088 names = names8rex;
12089 else
12090 names = names8;
12091 break;
12092 case w_mode:
12093 names = names16;
12094 break;
12095 case d_mode:
12096 names = names32;
12097 break;
12098 case q_mode:
12099 names = names64;
12100 break;
12101 case m_mode:
12102 names = address_mode == mode_64bit ? names64 : names32;
12103 break;
12104 case stack_v_mode:
12105 if (address_mode == mode_64bit && (sizeflag & DFLAG))
252b5132 12106 {
c0f3af97 12107 names = names64;
252b5132 12108 break;
252b5132 12109 }
c0f3af97
L
12110 bytemode = v_mode;
12111 /* FALLTHRU */
12112 case v_mode:
b6169b20 12113 case v_swap_mode:
c0f3af97
L
12114 case dq_mode:
12115 case dqb_mode:
12116 case dqd_mode:
12117 case dqw_mode:
12118 USED_REX (REX_W);
12119 if (rex & REX_W)
12120 names = names64;
c0f3af97 12121 else
f16cd0d5
L
12122 {
12123 if ((sizeflag & DFLAG)
12124 || (bytemode != v_mode
12125 && bytemode != v_swap_mode))
12126 names = names32;
12127 else
12128 names = names16;
12129 used_prefixes |= (prefixes & PREFIX_DATA);
12130 }
c0f3af97
L
12131 break;
12132 case 0:
12133 return;
12134 default:
12135 oappend (INTERNAL_DISASSEMBLER_ERROR);
252b5132
RH
12136 return;
12137 }
c0f3af97
L
12138 oappend (names[reg]);
12139}
12140
12141static void
c1e679ec 12142OP_E_memory (int bytemode, int sizeflag)
c0f3af97
L
12143{
12144 bfd_vma disp = 0;
12145 int add = (rex & REX_B) ? 8 : 0;
12146 int riprel = 0;
252b5132 12147
c0f3af97 12148 USED_REX (REX_B);
3f31e633
JB
12149 if (intel_syntax)
12150 intel_operand_size (bytemode, sizeflag);
252b5132
RH
12151 append_seg ();
12152
5d669648 12153 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
252b5132 12154 {
5d669648
L
12155 /* 32/64 bit address mode */
12156 int havedisp;
252b5132
RH
12157 int havesib;
12158 int havebase;
0f7da397 12159 int haveindex;
20afcfb7 12160 int needindex;
82c18208 12161 int base, rbase;
91d6fa6a 12162 int vindex = 0;
252b5132
RH
12163 int scale = 0;
12164
12165 havesib = 0;
12166 havebase = 1;
0f7da397 12167 haveindex = 0;
7967e09e 12168 base = modrm.rm;
252b5132
RH
12169
12170 if (base == 4)
12171 {
12172 havesib = 1;
12173 FETCH_DATA (the_info, codep + 1);
91d6fa6a 12174 vindex = (*codep >> 3) & 7;
db51cc60 12175 scale = (*codep >> 6) & 3;
252b5132 12176 base = *codep & 7;
161a04f6
L
12177 USED_REX (REX_X);
12178 if (rex & REX_X)
91d6fa6a
NC
12179 vindex += 8;
12180 haveindex = vindex != 4;
252b5132
RH
12181 codep++;
12182 }
82c18208 12183 rbase = base + add;
252b5132 12184
7967e09e 12185 switch (modrm.mod)
252b5132
RH
12186 {
12187 case 0:
82c18208 12188 if (base == 5)
252b5132
RH
12189 {
12190 havebase = 0;
cb712a9e 12191 if (address_mode == mode_64bit && !havesib)
52b15da3
JH
12192 riprel = 1;
12193 disp = get32s ();
252b5132
RH
12194 }
12195 break;
12196 case 1:
12197 FETCH_DATA (the_info, codep + 1);
12198 disp = *codep++;
12199 if ((disp & 0x80) != 0)
12200 disp -= 0x100;
12201 break;
12202 case 2:
52b15da3 12203 disp = get32s ();
252b5132
RH
12204 break;
12205 }
12206
20afcfb7
L
12207 /* In 32bit mode, we need index register to tell [offset] from
12208 [eiz*1 + offset]. */
12209 needindex = (havesib
12210 && !havebase
12211 && !haveindex
12212 && address_mode == mode_32bit);
12213 havedisp = (havebase
12214 || needindex
12215 || (havesib && (haveindex || scale != 0)));
5d669648 12216
252b5132 12217 if (!intel_syntax)
82c18208 12218 if (modrm.mod != 0 || base == 5)
db6eb5be 12219 {
5d669648
L
12220 if (havedisp || riprel)
12221 print_displacement (scratchbuf, disp);
12222 else
12223 print_operand_value (scratchbuf, 1, disp);
db6eb5be 12224 oappend (scratchbuf);
52b15da3
JH
12225 if (riprel)
12226 {
12227 set_op (disp, 1);
87767711 12228 oappend (sizeflag & AFLAG ? "(%rip)" : "(%eip)");
52b15da3 12229 }
db6eb5be 12230 }
2da11e11 12231
87767711
JB
12232 if (havebase || haveindex || riprel)
12233 used_prefixes |= PREFIX_ADDR;
12234
5d669648 12235 if (havedisp || (intel_syntax && riprel))
252b5132 12236 {
252b5132 12237 *obufp++ = open_char;
52b15da3 12238 if (intel_syntax && riprel)
185b1163
L
12239 {
12240 set_op (disp, 1);
87767711 12241 oappend (sizeflag & AFLAG ? "rip" : "eip");
185b1163 12242 }
db6eb5be 12243 *obufp = '\0';
252b5132 12244 if (havebase)
cb712a9e 12245 oappend (address_mode == mode_64bit && (sizeflag & AFLAG)
82c18208 12246 ? names64[rbase] : names32[rbase]);
252b5132
RH
12247 if (havesib)
12248 {
db51cc60
L
12249 /* ESP/RSP won't allow index. If base isn't ESP/RSP,
12250 print index to tell base + index from base. */
12251 if (scale != 0
20afcfb7 12252 || needindex
db51cc60
L
12253 || haveindex
12254 || (havebase && base != ESP_REG_NUM))
252b5132 12255 {
9306ca4a 12256 if (!intel_syntax || havebase)
db6eb5be 12257 {
9306ca4a
JB
12258 *obufp++ = separator_char;
12259 *obufp = '\0';
db6eb5be 12260 }
db51cc60
L
12261 if (haveindex)
12262 oappend (address_mode == mode_64bit
12263 && (sizeflag & AFLAG)
91d6fa6a 12264 ? names64[vindex] : names32[vindex]);
db51cc60
L
12265 else
12266 oappend (address_mode == mode_64bit
12267 && (sizeflag & AFLAG)
12268 ? index64 : index32);
12269
db6eb5be
AM
12270 *obufp++ = scale_char;
12271 *obufp = '\0';
12272 sprintf (scratchbuf, "%d", 1 << scale);
12273 oappend (scratchbuf);
12274 }
252b5132 12275 }
185b1163 12276 if (intel_syntax
82c18208 12277 && (disp || modrm.mod != 0 || base == 5))
3d456fa1 12278 {
db51cc60 12279 if (!havedisp || (bfd_signed_vma) disp >= 0)
3d456fa1
JB
12280 {
12281 *obufp++ = '+';
12282 *obufp = '\0';
12283 }
05203043 12284 else if (modrm.mod != 1 && disp != -disp)
3d456fa1
JB
12285 {
12286 *obufp++ = '-';
12287 *obufp = '\0';
12288 disp = - (bfd_signed_vma) disp;
12289 }
12290
db51cc60
L
12291 if (havedisp)
12292 print_displacement (scratchbuf, disp);
12293 else
12294 print_operand_value (scratchbuf, 1, disp);
3d456fa1
JB
12295 oappend (scratchbuf);
12296 }
252b5132
RH
12297
12298 *obufp++ = close_char;
db6eb5be 12299 *obufp = '\0';
252b5132
RH
12300 }
12301 else if (intel_syntax)
db6eb5be 12302 {
82c18208 12303 if (modrm.mod != 0 || base == 5)
db6eb5be 12304 {
252b5132
RH
12305 if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
12306 | PREFIX_ES | PREFIX_FS | PREFIX_GS))
12307 ;
12308 else
12309 {
d708bcba 12310 oappend (names_seg[ds_reg - es_reg]);
252b5132
RH
12311 oappend (":");
12312 }
52b15da3 12313 print_operand_value (scratchbuf, 1, disp);
db6eb5be
AM
12314 oappend (scratchbuf);
12315 }
12316 }
252b5132
RH
12317 }
12318 else
f16cd0d5
L
12319 {
12320 /* 16 bit address mode */
12321 used_prefixes |= prefixes & PREFIX_ADDR;
7967e09e 12322 switch (modrm.mod)
252b5132
RH
12323 {
12324 case 0:
7967e09e 12325 if (modrm.rm == 6)
252b5132
RH
12326 {
12327 disp = get16 ();
12328 if ((disp & 0x8000) != 0)
12329 disp -= 0x10000;
12330 }
12331 break;
12332 case 1:
12333 FETCH_DATA (the_info, codep + 1);
12334 disp = *codep++;
12335 if ((disp & 0x80) != 0)
12336 disp -= 0x100;
12337 break;
12338 case 2:
12339 disp = get16 ();
12340 if ((disp & 0x8000) != 0)
12341 disp -= 0x10000;
12342 break;
12343 }
12344
12345 if (!intel_syntax)
7967e09e 12346 if (modrm.mod != 0 || modrm.rm == 6)
db6eb5be 12347 {
5d669648 12348 print_displacement (scratchbuf, disp);
db6eb5be
AM
12349 oappend (scratchbuf);
12350 }
252b5132 12351
7967e09e 12352 if (modrm.mod != 0 || modrm.rm != 6)
252b5132
RH
12353 {
12354 *obufp++ = open_char;
db6eb5be 12355 *obufp = '\0';
7967e09e 12356 oappend (index16[modrm.rm]);
5d669648
L
12357 if (intel_syntax
12358 && (disp || modrm.mod != 0 || modrm.rm == 6))
3d456fa1 12359 {
5d669648 12360 if ((bfd_signed_vma) disp >= 0)
3d456fa1
JB
12361 {
12362 *obufp++ = '+';
12363 *obufp = '\0';
12364 }
7967e09e 12365 else if (modrm.mod != 1)
3d456fa1
JB
12366 {
12367 *obufp++ = '-';
12368 *obufp = '\0';
12369 disp = - (bfd_signed_vma) disp;
12370 }
12371
5d669648 12372 print_displacement (scratchbuf, disp);
3d456fa1
JB
12373 oappend (scratchbuf);
12374 }
12375
db6eb5be
AM
12376 *obufp++ = close_char;
12377 *obufp = '\0';
252b5132 12378 }
3d456fa1
JB
12379 else if (intel_syntax)
12380 {
12381 if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
12382 | PREFIX_ES | PREFIX_FS | PREFIX_GS))
12383 ;
12384 else
12385 {
12386 oappend (names_seg[ds_reg - es_reg]);
12387 oappend (":");
12388 }
12389 print_operand_value (scratchbuf, 1, disp & 0xffff);
12390 oappend (scratchbuf);
12391 }
252b5132
RH
12392 }
12393}
12394
c0f3af97 12395static void
8b3f93e7 12396OP_E (int bytemode, int sizeflag)
c0f3af97
L
12397{
12398 /* Skip mod/rm byte. */
12399 MODRM_CHECK;
12400 codep++;
12401
12402 if (modrm.mod == 3)
12403 OP_E_register (bytemode, sizeflag);
12404 else
c1e679ec 12405 OP_E_memory (bytemode, sizeflag);
c0f3af97
L
12406}
12407
252b5132 12408static void
26ca5450 12409OP_G (int bytemode, int sizeflag)
252b5132 12410{
52b15da3 12411 int add = 0;
161a04f6
L
12412 USED_REX (REX_R);
12413 if (rex & REX_R)
52b15da3 12414 add += 8;
252b5132
RH
12415 switch (bytemode)
12416 {
12417 case b_mode:
52b15da3
JH
12418 USED_REX (0);
12419 if (rex)
7967e09e 12420 oappend (names8rex[modrm.reg + add]);
52b15da3 12421 else
7967e09e 12422 oappend (names8[modrm.reg + add]);
252b5132
RH
12423 break;
12424 case w_mode:
7967e09e 12425 oappend (names16[modrm.reg + add]);
252b5132
RH
12426 break;
12427 case d_mode:
7967e09e 12428 oappend (names32[modrm.reg + add]);
52b15da3
JH
12429 break;
12430 case q_mode:
7967e09e 12431 oappend (names64[modrm.reg + add]);
252b5132
RH
12432 break;
12433 case v_mode:
9306ca4a 12434 case dq_mode:
42903f7f
L
12435 case dqb_mode:
12436 case dqd_mode:
9306ca4a 12437 case dqw_mode:
161a04f6
L
12438 USED_REX (REX_W);
12439 if (rex & REX_W)
7967e09e 12440 oappend (names64[modrm.reg + add]);
252b5132 12441 else
f16cd0d5
L
12442 {
12443 if ((sizeflag & DFLAG) || bytemode != v_mode)
12444 oappend (names32[modrm.reg + add]);
12445 else
12446 oappend (names16[modrm.reg + add]);
12447 used_prefixes |= (prefixes & PREFIX_DATA);
12448 }
252b5132 12449 break;
90700ea2 12450 case m_mode:
cb712a9e 12451 if (address_mode == mode_64bit)
7967e09e 12452 oappend (names64[modrm.reg + add]);
90700ea2 12453 else
7967e09e 12454 oappend (names32[modrm.reg + add]);
90700ea2 12455 break;
252b5132
RH
12456 default:
12457 oappend (INTERNAL_DISASSEMBLER_ERROR);
12458 break;
12459 }
12460}
12461
52b15da3 12462static bfd_vma
26ca5450 12463get64 (void)
52b15da3 12464{
5dd0794d 12465 bfd_vma x;
52b15da3 12466#ifdef BFD64
5dd0794d
AM
12467 unsigned int a;
12468 unsigned int b;
12469
52b15da3
JH
12470 FETCH_DATA (the_info, codep + 8);
12471 a = *codep++ & 0xff;
12472 a |= (*codep++ & 0xff) << 8;
12473 a |= (*codep++ & 0xff) << 16;
12474 a |= (*codep++ & 0xff) << 24;
5dd0794d 12475 b = *codep++ & 0xff;
52b15da3
JH
12476 b |= (*codep++ & 0xff) << 8;
12477 b |= (*codep++ & 0xff) << 16;
12478 b |= (*codep++ & 0xff) << 24;
12479 x = a + ((bfd_vma) b << 32);
12480#else
6608db57 12481 abort ();
5dd0794d 12482 x = 0;
52b15da3
JH
12483#endif
12484 return x;
12485}
12486
12487static bfd_signed_vma
26ca5450 12488get32 (void)
252b5132 12489{
52b15da3 12490 bfd_signed_vma x = 0;
252b5132
RH
12491
12492 FETCH_DATA (the_info, codep + 4);
52b15da3
JH
12493 x = *codep++ & (bfd_signed_vma) 0xff;
12494 x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
12495 x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
12496 x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
12497 return x;
12498}
12499
12500static bfd_signed_vma
26ca5450 12501get32s (void)
52b15da3
JH
12502{
12503 bfd_signed_vma x = 0;
12504
12505 FETCH_DATA (the_info, codep + 4);
12506 x = *codep++ & (bfd_signed_vma) 0xff;
12507 x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
12508 x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
12509 x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
12510
12511 x = (x ^ ((bfd_signed_vma) 1 << 31)) - ((bfd_signed_vma) 1 << 31);
12512
252b5132
RH
12513 return x;
12514}
12515
12516static int
26ca5450 12517get16 (void)
252b5132
RH
12518{
12519 int x = 0;
12520
12521 FETCH_DATA (the_info, codep + 2);
12522 x = *codep++ & 0xff;
12523 x |= (*codep++ & 0xff) << 8;
12524 return x;
12525}
12526
12527static void
26ca5450 12528set_op (bfd_vma op, int riprel)
252b5132
RH
12529{
12530 op_index[op_ad] = op_ad;
cb712a9e 12531 if (address_mode == mode_64bit)
7081ff04
AJ
12532 {
12533 op_address[op_ad] = op;
12534 op_riprel[op_ad] = riprel;
12535 }
12536 else
12537 {
12538 /* Mask to get a 32-bit address. */
12539 op_address[op_ad] = op & 0xffffffff;
12540 op_riprel[op_ad] = riprel & 0xffffffff;
12541 }
252b5132
RH
12542}
12543
12544static void
26ca5450 12545OP_REG (int code, int sizeflag)
252b5132 12546{
2da11e11 12547 const char *s;
9b60702d 12548 int add;
161a04f6
L
12549 USED_REX (REX_B);
12550 if (rex & REX_B)
52b15da3 12551 add = 8;
9b60702d
L
12552 else
12553 add = 0;
52b15da3
JH
12554
12555 switch (code)
12556 {
52b15da3
JH
12557 case ax_reg: case cx_reg: case dx_reg: case bx_reg:
12558 case sp_reg: case bp_reg: case si_reg: case di_reg:
12559 s = names16[code - ax_reg + add];
12560 break;
12561 case es_reg: case ss_reg: case cs_reg:
12562 case ds_reg: case fs_reg: case gs_reg:
12563 s = names_seg[code - es_reg + add];
12564 break;
12565 case al_reg: case ah_reg: case cl_reg: case ch_reg:
12566 case dl_reg: case dh_reg: case bl_reg: case bh_reg:
12567 USED_REX (0);
12568 if (rex)
12569 s = names8rex[code - al_reg + add];
12570 else
12571 s = names8[code - al_reg];
12572 break;
6439fc28
AM
12573 case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
12574 case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
cb712a9e 12575 if (address_mode == mode_64bit && (sizeflag & DFLAG))
6439fc28
AM
12576 {
12577 s = names64[code - rAX_reg + add];
12578 break;
12579 }
12580 code += eAX_reg - rAX_reg;
6608db57 12581 /* Fall through. */
52b15da3
JH
12582 case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
12583 case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
161a04f6
L
12584 USED_REX (REX_W);
12585 if (rex & REX_W)
52b15da3 12586 s = names64[code - eAX_reg + add];
52b15da3 12587 else
f16cd0d5
L
12588 {
12589 if (sizeflag & DFLAG)
12590 s = names32[code - eAX_reg + add];
12591 else
12592 s = names16[code - eAX_reg + add];
12593 used_prefixes |= (prefixes & PREFIX_DATA);
12594 }
52b15da3 12595 break;
52b15da3
JH
12596 default:
12597 s = INTERNAL_DISASSEMBLER_ERROR;
12598 break;
12599 }
12600 oappend (s);
12601}
12602
12603static void
26ca5450 12604OP_IMREG (int code, int sizeflag)
52b15da3
JH
12605{
12606 const char *s;
252b5132
RH
12607
12608 switch (code)
12609 {
12610 case indir_dx_reg:
d708bcba 12611 if (intel_syntax)
52fd6d94 12612 s = "dx";
d708bcba 12613 else
db6eb5be 12614 s = "(%dx)";
252b5132
RH
12615 break;
12616 case ax_reg: case cx_reg: case dx_reg: case bx_reg:
12617 case sp_reg: case bp_reg: case si_reg: case di_reg:
12618 s = names16[code - ax_reg];
12619 break;
12620 case es_reg: case ss_reg: case cs_reg:
12621 case ds_reg: case fs_reg: case gs_reg:
12622 s = names_seg[code - es_reg];
12623 break;
12624 case al_reg: case ah_reg: case cl_reg: case ch_reg:
12625 case dl_reg: case dh_reg: case bl_reg: case bh_reg:
52b15da3
JH
12626 USED_REX (0);
12627 if (rex)
12628 s = names8rex[code - al_reg];
12629 else
12630 s = names8[code - al_reg];
252b5132
RH
12631 break;
12632 case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
12633 case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
161a04f6
L
12634 USED_REX (REX_W);
12635 if (rex & REX_W)
52b15da3 12636 s = names64[code - eAX_reg];
252b5132 12637 else
f16cd0d5
L
12638 {
12639 if (sizeflag & DFLAG)
12640 s = names32[code - eAX_reg];
12641 else
12642 s = names16[code - eAX_reg];
12643 used_prefixes |= (prefixes & PREFIX_DATA);
12644 }
252b5132 12645 break;
52fd6d94 12646 case z_mode_ax_reg:
161a04f6 12647 if ((rex & REX_W) || (sizeflag & DFLAG))
52fd6d94
JB
12648 s = *names32;
12649 else
12650 s = *names16;
161a04f6 12651 if (!(rex & REX_W))
52fd6d94
JB
12652 used_prefixes |= (prefixes & PREFIX_DATA);
12653 break;
252b5132
RH
12654 default:
12655 s = INTERNAL_DISASSEMBLER_ERROR;
12656 break;
12657 }
12658 oappend (s);
12659}
12660
12661static void
26ca5450 12662OP_I (int bytemode, int sizeflag)
252b5132 12663{
52b15da3
JH
12664 bfd_signed_vma op;
12665 bfd_signed_vma mask = -1;
252b5132
RH
12666
12667 switch (bytemode)
12668 {
12669 case b_mode:
12670 FETCH_DATA (the_info, codep + 1);
52b15da3
JH
12671 op = *codep++;
12672 mask = 0xff;
12673 break;
12674 case q_mode:
cb712a9e 12675 if (address_mode == mode_64bit)
6439fc28
AM
12676 {
12677 op = get32s ();
12678 break;
12679 }
6608db57 12680 /* Fall through. */
252b5132 12681 case v_mode:
161a04f6
L
12682 USED_REX (REX_W);
12683 if (rex & REX_W)
52b15da3 12684 op = get32s ();
252b5132 12685 else
52b15da3 12686 {
f16cd0d5
L
12687 if (sizeflag & DFLAG)
12688 {
12689 op = get32 ();
12690 mask = 0xffffffff;
12691 }
12692 else
12693 {
12694 op = get16 ();
12695 mask = 0xfffff;
12696 }
12697 used_prefixes |= (prefixes & PREFIX_DATA);
52b15da3 12698 }
252b5132
RH
12699 break;
12700 case w_mode:
52b15da3 12701 mask = 0xfffff;
252b5132
RH
12702 op = get16 ();
12703 break;
9306ca4a
JB
12704 case const_1_mode:
12705 if (intel_syntax)
12706 oappend ("1");
12707 return;
252b5132
RH
12708 default:
12709 oappend (INTERNAL_DISASSEMBLER_ERROR);
12710 return;
12711 }
12712
52b15da3
JH
12713 op &= mask;
12714 scratchbuf[0] = '$';
d708bcba
AM
12715 print_operand_value (scratchbuf + 1, 1, op);
12716 oappend (scratchbuf + intel_syntax);
52b15da3
JH
12717 scratchbuf[0] = '\0';
12718}
12719
12720static void
26ca5450 12721OP_I64 (int bytemode, int sizeflag)
52b15da3
JH
12722{
12723 bfd_signed_vma op;
12724 bfd_signed_vma mask = -1;
12725
cb712a9e 12726 if (address_mode != mode_64bit)
6439fc28
AM
12727 {
12728 OP_I (bytemode, sizeflag);
12729 return;
12730 }
12731
52b15da3
JH
12732 switch (bytemode)
12733 {
12734 case b_mode:
12735 FETCH_DATA (the_info, codep + 1);
12736 op = *codep++;
12737 mask = 0xff;
12738 break;
12739 case v_mode:
161a04f6
L
12740 USED_REX (REX_W);
12741 if (rex & REX_W)
52b15da3 12742 op = get64 ();
52b15da3
JH
12743 else
12744 {
f16cd0d5
L
12745 if (sizeflag & DFLAG)
12746 {
12747 op = get32 ();
12748 mask = 0xffffffff;
12749 }
12750 else
12751 {
12752 op = get16 ();
12753 mask = 0xfffff;
12754 }
12755 used_prefixes |= (prefixes & PREFIX_DATA);
52b15da3 12756 }
52b15da3
JH
12757 break;
12758 case w_mode:
12759 mask = 0xfffff;
12760 op = get16 ();
12761 break;
12762 default:
12763 oappend (INTERNAL_DISASSEMBLER_ERROR);
12764 return;
12765 }
12766
12767 op &= mask;
12768 scratchbuf[0] = '$';
d708bcba
AM
12769 print_operand_value (scratchbuf + 1, 1, op);
12770 oappend (scratchbuf + intel_syntax);
252b5132
RH
12771 scratchbuf[0] = '\0';
12772}
12773
12774static void
26ca5450 12775OP_sI (int bytemode, int sizeflag)
252b5132 12776{
52b15da3
JH
12777 bfd_signed_vma op;
12778 bfd_signed_vma mask = -1;
252b5132
RH
12779
12780 switch (bytemode)
12781 {
12782 case b_mode:
12783 FETCH_DATA (the_info, codep + 1);
12784 op = *codep++;
12785 if ((op & 0x80) != 0)
12786 op -= 0x100;
52b15da3 12787 mask = 0xffffffff;
252b5132
RH
12788 break;
12789 case v_mode:
161a04f6
L
12790 USED_REX (REX_W);
12791 if (rex & REX_W)
52b15da3 12792 op = get32s ();
252b5132
RH
12793 else
12794 {
f16cd0d5
L
12795 if (sizeflag & DFLAG)
12796 {
12797 op = get32s ();
12798 mask = 0xffffffff;
12799 }
12800 else
12801 {
12802 mask = 0xffffffff;
12803 op = get16 ();
12804 if ((op & 0x8000) != 0)
12805 op -= 0x10000;
12806 }
12807 used_prefixes |= (prefixes & PREFIX_DATA);
252b5132
RH
12808 }
12809 break;
12810 case w_mode:
12811 op = get16 ();
52b15da3 12812 mask = 0xffffffff;
252b5132
RH
12813 if ((op & 0x8000) != 0)
12814 op -= 0x10000;
12815 break;
12816 default:
12817 oappend (INTERNAL_DISASSEMBLER_ERROR);
12818 return;
12819 }
52b15da3
JH
12820
12821 scratchbuf[0] = '$';
12822 print_operand_value (scratchbuf + 1, 1, op);
d708bcba 12823 oappend (scratchbuf + intel_syntax);
252b5132
RH
12824}
12825
12826static void
26ca5450 12827OP_J (int bytemode, int sizeflag)
252b5132 12828{
52b15da3 12829 bfd_vma disp;
7081ff04 12830 bfd_vma mask = -1;
65ca155d 12831 bfd_vma segment = 0;
252b5132
RH
12832
12833 switch (bytemode)
12834 {
12835 case b_mode:
12836 FETCH_DATA (the_info, codep + 1);
12837 disp = *codep++;
12838 if ((disp & 0x80) != 0)
12839 disp -= 0x100;
12840 break;
12841 case v_mode:
f16cd0d5 12842 USED_REX (REX_W);
161a04f6 12843 if ((sizeflag & DFLAG) || (rex & REX_W))
52b15da3 12844 disp = get32s ();
252b5132
RH
12845 else
12846 {
12847 disp = get16 ();
206717e8
L
12848 if ((disp & 0x8000) != 0)
12849 disp -= 0x10000;
65ca155d
L
12850 /* In 16bit mode, address is wrapped around at 64k within
12851 the same segment. Otherwise, a data16 prefix on a jump
12852 instruction means that the pc is masked to 16 bits after
12853 the displacement is added! */
12854 mask = 0xffff;
12855 if ((prefixes & PREFIX_DATA) == 0)
12856 segment = ((start_pc + codep - start_codep)
12857 & ~((bfd_vma) 0xffff));
252b5132 12858 }
f16cd0d5
L
12859 if (!(rex & REX_W))
12860 used_prefixes |= (prefixes & PREFIX_DATA);
252b5132
RH
12861 break;
12862 default:
12863 oappend (INTERNAL_DISASSEMBLER_ERROR);
12864 return;
12865 }
65ca155d 12866 disp = ((start_pc + codep - start_codep + disp) & mask) | segment;
52b15da3
JH
12867 set_op (disp, 0);
12868 print_operand_value (scratchbuf, 1, disp);
252b5132
RH
12869 oappend (scratchbuf);
12870}
12871
252b5132 12872static void
ed7841b3 12873OP_SEG (int bytemode, int sizeflag)
252b5132 12874{
ed7841b3 12875 if (bytemode == w_mode)
7967e09e 12876 oappend (names_seg[modrm.reg]);
ed7841b3 12877 else
7967e09e 12878 OP_E (modrm.mod == 3 ? bytemode : w_mode, sizeflag);
252b5132
RH
12879}
12880
12881static void
26ca5450 12882OP_DIR (int dummy ATTRIBUTE_UNUSED, int sizeflag)
252b5132
RH
12883{
12884 int seg, offset;
12885
c608c12e 12886 if (sizeflag & DFLAG)
252b5132 12887 {
c608c12e
AM
12888 offset = get32 ();
12889 seg = get16 ();
252b5132 12890 }
c608c12e
AM
12891 else
12892 {
12893 offset = get16 ();
12894 seg = get16 ();
12895 }
7d421014 12896 used_prefixes |= (prefixes & PREFIX_DATA);
d708bcba 12897 if (intel_syntax)
3f31e633 12898 sprintf (scratchbuf, "0x%x:0x%x", seg, offset);
d708bcba
AM
12899 else
12900 sprintf (scratchbuf, "$0x%x,$0x%x", seg, offset);
c608c12e 12901 oappend (scratchbuf);
252b5132
RH
12902}
12903
252b5132 12904static void
3f31e633 12905OP_OFF (int bytemode, int sizeflag)
252b5132 12906{
52b15da3 12907 bfd_vma off;
252b5132 12908
3f31e633
JB
12909 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
12910 intel_operand_size (bytemode, sizeflag);
252b5132
RH
12911 append_seg ();
12912
cb712a9e 12913 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
252b5132
RH
12914 off = get32 ();
12915 else
12916 off = get16 ();
12917
12918 if (intel_syntax)
12919 {
12920 if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
db6eb5be 12921 | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
252b5132 12922 {
d708bcba 12923 oappend (names_seg[ds_reg - es_reg]);
252b5132
RH
12924 oappend (":");
12925 }
12926 }
52b15da3
JH
12927 print_operand_value (scratchbuf, 1, off);
12928 oappend (scratchbuf);
12929}
6439fc28 12930
52b15da3 12931static void
3f31e633 12932OP_OFF64 (int bytemode, int sizeflag)
52b15da3
JH
12933{
12934 bfd_vma off;
12935
539e75ad
L
12936 if (address_mode != mode_64bit
12937 || (prefixes & PREFIX_ADDR))
6439fc28
AM
12938 {
12939 OP_OFF (bytemode, sizeflag);
12940 return;
12941 }
12942
3f31e633
JB
12943 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
12944 intel_operand_size (bytemode, sizeflag);
52b15da3
JH
12945 append_seg ();
12946
6608db57 12947 off = get64 ();
52b15da3
JH
12948
12949 if (intel_syntax)
12950 {
12951 if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
db6eb5be 12952 | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
52b15da3 12953 {
d708bcba 12954 oappend (names_seg[ds_reg - es_reg]);
52b15da3
JH
12955 oappend (":");
12956 }
12957 }
12958 print_operand_value (scratchbuf, 1, off);
252b5132
RH
12959 oappend (scratchbuf);
12960}
12961
12962static void
26ca5450 12963ptr_reg (int code, int sizeflag)
252b5132 12964{
2da11e11 12965 const char *s;
d708bcba 12966
1d9f512f 12967 *obufp++ = open_char;
20f0a1fc 12968 used_prefixes |= (prefixes & PREFIX_ADDR);
cb712a9e 12969 if (address_mode == mode_64bit)
c1a64871
JH
12970 {
12971 if (!(sizeflag & AFLAG))
db6eb5be 12972 s = names32[code - eAX_reg];
c1a64871 12973 else
db6eb5be 12974 s = names64[code - eAX_reg];
c1a64871 12975 }
52b15da3 12976 else if (sizeflag & AFLAG)
252b5132
RH
12977 s = names32[code - eAX_reg];
12978 else
12979 s = names16[code - eAX_reg];
12980 oappend (s);
1d9f512f
AM
12981 *obufp++ = close_char;
12982 *obufp = 0;
252b5132
RH
12983}
12984
12985static void
26ca5450 12986OP_ESreg (int code, int sizeflag)
252b5132 12987{
9306ca4a 12988 if (intel_syntax)
52fd6d94
JB
12989 {
12990 switch (codep[-1])
12991 {
12992 case 0x6d: /* insw/insl */
12993 intel_operand_size (z_mode, sizeflag);
12994 break;
12995 case 0xa5: /* movsw/movsl/movsq */
12996 case 0xa7: /* cmpsw/cmpsl/cmpsq */
12997 case 0xab: /* stosw/stosl */
12998 case 0xaf: /* scasw/scasl */
12999 intel_operand_size (v_mode, sizeflag);
13000 break;
13001 default:
13002 intel_operand_size (b_mode, sizeflag);
13003 }
13004 }
d708bcba 13005 oappend ("%es:" + intel_syntax);
252b5132
RH
13006 ptr_reg (code, sizeflag);
13007}
13008
13009static void
26ca5450 13010OP_DSreg (int code, int sizeflag)
252b5132 13011{
9306ca4a 13012 if (intel_syntax)
52fd6d94
JB
13013 {
13014 switch (codep[-1])
13015 {
13016 case 0x6f: /* outsw/outsl */
13017 intel_operand_size (z_mode, sizeflag);
13018 break;
13019 case 0xa5: /* movsw/movsl/movsq */
13020 case 0xa7: /* cmpsw/cmpsl/cmpsq */
13021 case 0xad: /* lodsw/lodsl/lodsq */
13022 intel_operand_size (v_mode, sizeflag);
13023 break;
13024 default:
13025 intel_operand_size (b_mode, sizeflag);
13026 }
13027 }
252b5132
RH
13028 if ((prefixes
13029 & (PREFIX_CS
13030 | PREFIX_DS
13031 | PREFIX_SS
13032 | PREFIX_ES
13033 | PREFIX_FS
13034 | PREFIX_GS)) == 0)
13035 prefixes |= PREFIX_DS;
6608db57 13036 append_seg ();
252b5132
RH
13037 ptr_reg (code, sizeflag);
13038}
13039
252b5132 13040static void
26ca5450 13041OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 13042{
9b60702d 13043 int add;
161a04f6 13044 if (rex & REX_R)
c4a530c5 13045 {
161a04f6 13046 USED_REX (REX_R);
c4a530c5
JB
13047 add = 8;
13048 }
cb712a9e 13049 else if (address_mode != mode_64bit && (prefixes & PREFIX_LOCK))
c4a530c5 13050 {
f16cd0d5 13051 all_prefixes[last_lock_prefix] = 0;
c4a530c5
JB
13052 used_prefixes |= PREFIX_LOCK;
13053 add = 8;
13054 }
9b60702d
L
13055 else
13056 add = 0;
7967e09e 13057 sprintf (scratchbuf, "%%cr%d", modrm.reg + add);
d708bcba 13058 oappend (scratchbuf + intel_syntax);
252b5132
RH
13059}
13060
252b5132 13061static void
26ca5450 13062OP_D (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 13063{
9b60702d 13064 int add;
161a04f6
L
13065 USED_REX (REX_R);
13066 if (rex & REX_R)
52b15da3 13067 add = 8;
9b60702d
L
13068 else
13069 add = 0;
d708bcba 13070 if (intel_syntax)
7967e09e 13071 sprintf (scratchbuf, "db%d", modrm.reg + add);
d708bcba 13072 else
7967e09e 13073 sprintf (scratchbuf, "%%db%d", modrm.reg + add);
252b5132
RH
13074 oappend (scratchbuf);
13075}
13076
252b5132 13077static void
26ca5450 13078OP_T (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 13079{
7967e09e 13080 sprintf (scratchbuf, "%%tr%d", modrm.reg);
d708bcba 13081 oappend (scratchbuf + intel_syntax);
252b5132
RH
13082}
13083
13084static void
6f74c397 13085OP_R (int bytemode, int sizeflag)
252b5132 13086{
7967e09e 13087 if (modrm.mod == 3)
2da11e11
AM
13088 OP_E (bytemode, sizeflag);
13089 else
6608db57 13090 BadOp ();
252b5132
RH
13091}
13092
13093static void
26ca5450 13094OP_MMX (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 13095{
041bd2e0
JH
13096 used_prefixes |= (prefixes & PREFIX_DATA);
13097 if (prefixes & PREFIX_DATA)
20f0a1fc 13098 {
9b60702d 13099 int add;
161a04f6
L
13100 USED_REX (REX_R);
13101 if (rex & REX_R)
20f0a1fc 13102 add = 8;
9b60702d
L
13103 else
13104 add = 0;
7967e09e 13105 sprintf (scratchbuf, "%%xmm%d", modrm.reg + add);
20f0a1fc 13106 }
041bd2e0 13107 else
7967e09e 13108 sprintf (scratchbuf, "%%mm%d", modrm.reg);
d708bcba 13109 oappend (scratchbuf + intel_syntax);
252b5132
RH
13110}
13111
c608c12e 13112static void
c0f3af97 13113OP_XMM (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
c608c12e 13114{
9b60702d 13115 int add;
161a04f6
L
13116 USED_REX (REX_R);
13117 if (rex & REX_R)
041bd2e0 13118 add = 8;
9b60702d
L
13119 else
13120 add = 0;
c0f3af97
L
13121 if (need_vex && bytemode != xmm_mode)
13122 {
13123 switch (vex.length)
13124 {
13125 case 128:
13126 sprintf (scratchbuf, "%%xmm%d", modrm.reg + add);
13127 break;
13128 case 256:
13129 sprintf (scratchbuf, "%%ymm%d", modrm.reg + add);
13130 break;
13131 default:
13132 abort ();
13133 }
13134 }
13135 else
13136 sprintf (scratchbuf, "%%xmm%d", modrm.reg + add);
d708bcba 13137 oappend (scratchbuf + intel_syntax);
c608c12e
AM
13138}
13139
252b5132 13140static void
26ca5450 13141OP_EM (int bytemode, int sizeflag)
252b5132 13142{
7967e09e 13143 if (modrm.mod != 3)
252b5132 13144 {
b6169b20
L
13145 if (intel_syntax
13146 && (bytemode == v_mode || bytemode == v_swap_mode))
9306ca4a
JB
13147 {
13148 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
13149 used_prefixes |= (prefixes & PREFIX_DATA);
13150 }
252b5132
RH
13151 OP_E (bytemode, sizeflag);
13152 return;
13153 }
13154
b6169b20
L
13155 if ((sizeflag & SUFFIX_ALWAYS) && bytemode == v_swap_mode)
13156 swap_operand ();
13157
6608db57 13158 /* Skip mod/rm byte. */
4bba6815 13159 MODRM_CHECK;
252b5132 13160 codep++;
041bd2e0
JH
13161 used_prefixes |= (prefixes & PREFIX_DATA);
13162 if (prefixes & PREFIX_DATA)
20f0a1fc 13163 {
9b60702d 13164 int add;
20f0a1fc 13165
161a04f6
L
13166 USED_REX (REX_B);
13167 if (rex & REX_B)
20f0a1fc 13168 add = 8;
9b60702d
L
13169 else
13170 add = 0;
7967e09e 13171 sprintf (scratchbuf, "%%xmm%d", modrm.rm + add);
20f0a1fc 13172 }
041bd2e0 13173 else
7967e09e 13174 sprintf (scratchbuf, "%%mm%d", modrm.rm);
d708bcba 13175 oappend (scratchbuf + intel_syntax);
252b5132
RH
13176}
13177
246c51aa
L
13178/* cvt* are the only instructions in sse2 which have
13179 both SSE and MMX operands and also have 0x66 prefix
13180 in their opcode. 0x66 was originally used to differentiate
13181 between SSE and MMX instruction(operands). So we have to handle the
4d9567e0
MM
13182 cvt* separately using OP_EMC and OP_MXC */
13183static void
13184OP_EMC (int bytemode, int sizeflag)
13185{
7967e09e 13186 if (modrm.mod != 3)
4d9567e0
MM
13187 {
13188 if (intel_syntax && bytemode == v_mode)
13189 {
13190 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
13191 used_prefixes |= (prefixes & PREFIX_DATA);
13192 }
13193 OP_E (bytemode, sizeflag);
13194 return;
13195 }
246c51aa 13196
4d9567e0
MM
13197 /* Skip mod/rm byte. */
13198 MODRM_CHECK;
13199 codep++;
13200 used_prefixes |= (prefixes & PREFIX_DATA);
7967e09e 13201 sprintf (scratchbuf, "%%mm%d", modrm.rm);
4d9567e0
MM
13202 oappend (scratchbuf + intel_syntax);
13203}
13204
13205static void
13206OP_MXC (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13207{
13208 used_prefixes |= (prefixes & PREFIX_DATA);
7967e09e 13209 sprintf (scratchbuf, "%%mm%d", modrm.reg);
4d9567e0
MM
13210 oappend (scratchbuf + intel_syntax);
13211}
13212
c608c12e 13213static void
26ca5450 13214OP_EX (int bytemode, int sizeflag)
c608c12e 13215{
9b60702d 13216 int add;
d6f574e0
L
13217
13218 /* Skip mod/rm byte. */
13219 MODRM_CHECK;
13220 codep++;
13221
7967e09e 13222 if (modrm.mod != 3)
c608c12e 13223 {
c1e679ec 13224 OP_E_memory (bytemode, sizeflag);
c608c12e
AM
13225 return;
13226 }
d6f574e0 13227
161a04f6
L
13228 USED_REX (REX_B);
13229 if (rex & REX_B)
041bd2e0 13230 add = 8;
9b60702d
L
13231 else
13232 add = 0;
c608c12e 13233
b6169b20 13234 if ((sizeflag & SUFFIX_ALWAYS)
fa99fab2
L
13235 && (bytemode == x_swap_mode
13236 || bytemode == d_swap_mode
13237 || bytemode == q_swap_mode))
b6169b20
L
13238 swap_operand ();
13239
c0f3af97
L
13240 if (need_vex
13241 && bytemode != xmm_mode
13242 && bytemode != xmmq_mode)
13243 {
13244 switch (vex.length)
13245 {
13246 case 128:
13247 sprintf (scratchbuf, "%%xmm%d", modrm.rm + add);
13248 break;
13249 case 256:
13250 sprintf (scratchbuf, "%%ymm%d", modrm.rm + add);
13251 break;
13252 default:
13253 abort ();
13254 }
13255 }
13256 else
13257 sprintf (scratchbuf, "%%xmm%d", modrm.rm + add);
d708bcba 13258 oappend (scratchbuf + intel_syntax);
c608c12e
AM
13259}
13260
252b5132 13261static void
26ca5450 13262OP_MS (int bytemode, int sizeflag)
252b5132 13263{
7967e09e 13264 if (modrm.mod == 3)
2da11e11
AM
13265 OP_EM (bytemode, sizeflag);
13266 else
6608db57 13267 BadOp ();
252b5132
RH
13268}
13269
992aaec9 13270static void
26ca5450 13271OP_XS (int bytemode, int sizeflag)
992aaec9 13272{
7967e09e 13273 if (modrm.mod == 3)
992aaec9
AM
13274 OP_EX (bytemode, sizeflag);
13275 else
6608db57 13276 BadOp ();
992aaec9
AM
13277}
13278
cc0ec051
AM
13279static void
13280OP_M (int bytemode, int sizeflag)
13281{
7967e09e 13282 if (modrm.mod == 3)
75413a22
L
13283 /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
13284 BadOp ();
cc0ec051
AM
13285 else
13286 OP_E (bytemode, sizeflag);
13287}
13288
13289static void
13290OP_0f07 (int bytemode, int sizeflag)
13291{
7967e09e 13292 if (modrm.mod != 3 || modrm.rm != 0)
cc0ec051
AM
13293 BadOp ();
13294 else
13295 OP_E (bytemode, sizeflag);
13296}
13297
46e883c5 13298/* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
246c51aa 13299 32bit mode and "xchg %rax,%rax" in 64bit mode. */
46e883c5 13300
cc0ec051 13301static void
46e883c5 13302NOP_Fixup1 (int bytemode, int sizeflag)
cc0ec051 13303{
8b38ad71
L
13304 if ((prefixes & PREFIX_DATA) != 0
13305 || (rex != 0
13306 && rex != 0x48
13307 && address_mode == mode_64bit))
46e883c5
L
13308 OP_REG (bytemode, sizeflag);
13309 else
13310 strcpy (obuf, "nop");
13311}
13312
13313static void
13314NOP_Fixup2 (int bytemode, int sizeflag)
13315{
8b38ad71
L
13316 if ((prefixes & PREFIX_DATA) != 0
13317 || (rex != 0
13318 && rex != 0x48
13319 && address_mode == mode_64bit))
46e883c5 13320 OP_IMREG (bytemode, sizeflag);
cc0ec051
AM
13321}
13322
84037f8c 13323static const char *const Suffix3DNow[] = {
252b5132
RH
13324/* 00 */ NULL, NULL, NULL, NULL,
13325/* 04 */ NULL, NULL, NULL, NULL,
13326/* 08 */ NULL, NULL, NULL, NULL,
9e525108 13327/* 0C */ "pi2fw", "pi2fd", NULL, NULL,
252b5132
RH
13328/* 10 */ NULL, NULL, NULL, NULL,
13329/* 14 */ NULL, NULL, NULL, NULL,
13330/* 18 */ NULL, NULL, NULL, NULL,
9e525108 13331/* 1C */ "pf2iw", "pf2id", NULL, NULL,
252b5132
RH
13332/* 20 */ NULL, NULL, NULL, NULL,
13333/* 24 */ NULL, NULL, NULL, NULL,
13334/* 28 */ NULL, NULL, NULL, NULL,
13335/* 2C */ NULL, NULL, NULL, NULL,
13336/* 30 */ NULL, NULL, NULL, NULL,
13337/* 34 */ NULL, NULL, NULL, NULL,
13338/* 38 */ NULL, NULL, NULL, NULL,
13339/* 3C */ NULL, NULL, NULL, NULL,
13340/* 40 */ NULL, NULL, NULL, NULL,
13341/* 44 */ NULL, NULL, NULL, NULL,
13342/* 48 */ NULL, NULL, NULL, NULL,
13343/* 4C */ NULL, NULL, NULL, NULL,
13344/* 50 */ NULL, NULL, NULL, NULL,
13345/* 54 */ NULL, NULL, NULL, NULL,
13346/* 58 */ NULL, NULL, NULL, NULL,
13347/* 5C */ NULL, NULL, NULL, NULL,
13348/* 60 */ NULL, NULL, NULL, NULL,
13349/* 64 */ NULL, NULL, NULL, NULL,
13350/* 68 */ NULL, NULL, NULL, NULL,
13351/* 6C */ NULL, NULL, NULL, NULL,
13352/* 70 */ NULL, NULL, NULL, NULL,
13353/* 74 */ NULL, NULL, NULL, NULL,
13354/* 78 */ NULL, NULL, NULL, NULL,
13355/* 7C */ NULL, NULL, NULL, NULL,
13356/* 80 */ NULL, NULL, NULL, NULL,
13357/* 84 */ NULL, NULL, NULL, NULL,
9e525108
AM
13358/* 88 */ NULL, NULL, "pfnacc", NULL,
13359/* 8C */ NULL, NULL, "pfpnacc", NULL,
252b5132
RH
13360/* 90 */ "pfcmpge", NULL, NULL, NULL,
13361/* 94 */ "pfmin", NULL, "pfrcp", "pfrsqrt",
13362/* 98 */ NULL, NULL, "pfsub", NULL,
13363/* 9C */ NULL, NULL, "pfadd", NULL,
13364/* A0 */ "pfcmpgt", NULL, NULL, NULL,
13365/* A4 */ "pfmax", NULL, "pfrcpit1", "pfrsqit1",
13366/* A8 */ NULL, NULL, "pfsubr", NULL,
13367/* AC */ NULL, NULL, "pfacc", NULL,
13368/* B0 */ "pfcmpeq", NULL, NULL, NULL,
9beff690 13369/* B4 */ "pfmul", NULL, "pfrcpit2", "pmulhrw",
9e525108 13370/* B8 */ NULL, NULL, NULL, "pswapd",
252b5132
RH
13371/* BC */ NULL, NULL, NULL, "pavgusb",
13372/* C0 */ NULL, NULL, NULL, NULL,
13373/* C4 */ NULL, NULL, NULL, NULL,
13374/* C8 */ NULL, NULL, NULL, NULL,
13375/* CC */ NULL, NULL, NULL, NULL,
13376/* D0 */ NULL, NULL, NULL, NULL,
13377/* D4 */ NULL, NULL, NULL, NULL,
13378/* D8 */ NULL, NULL, NULL, NULL,
13379/* DC */ NULL, NULL, NULL, NULL,
13380/* E0 */ NULL, NULL, NULL, NULL,
13381/* E4 */ NULL, NULL, NULL, NULL,
13382/* E8 */ NULL, NULL, NULL, NULL,
13383/* EC */ NULL, NULL, NULL, NULL,
13384/* F0 */ NULL, NULL, NULL, NULL,
13385/* F4 */ NULL, NULL, NULL, NULL,
13386/* F8 */ NULL, NULL, NULL, NULL,
13387/* FC */ NULL, NULL, NULL, NULL,
13388};
13389
13390static void
26ca5450 13391OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132
RH
13392{
13393 const char *mnemonic;
13394
13395 FETCH_DATA (the_info, codep + 1);
13396 /* AMD 3DNow! instructions are specified by an opcode suffix in the
13397 place where an 8-bit immediate would normally go. ie. the last
13398 byte of the instruction. */
ea397f5b 13399 obufp = mnemonicendp;
c608c12e 13400 mnemonic = Suffix3DNow[*codep++ & 0xff];
252b5132 13401 if (mnemonic)
2da11e11 13402 oappend (mnemonic);
252b5132
RH
13403 else
13404 {
13405 /* Since a variable sized modrm/sib chunk is between the start
13406 of the opcode (0x0f0f) and the opcode suffix, we need to do
13407 all the modrm processing first, and don't know until now that
13408 we have a bad opcode. This necessitates some cleaning up. */
ce518a5f
L
13409 op_out[0][0] = '\0';
13410 op_out[1][0] = '\0';
6608db57 13411 BadOp ();
252b5132 13412 }
ea397f5b 13413 mnemonicendp = obufp;
252b5132 13414}
c608c12e 13415
ea397f5b
L
13416static struct op simd_cmp_op[] =
13417{
13418 { STRING_COMMA_LEN ("eq") },
13419 { STRING_COMMA_LEN ("lt") },
13420 { STRING_COMMA_LEN ("le") },
13421 { STRING_COMMA_LEN ("unord") },
13422 { STRING_COMMA_LEN ("neq") },
13423 { STRING_COMMA_LEN ("nlt") },
13424 { STRING_COMMA_LEN ("nle") },
13425 { STRING_COMMA_LEN ("ord") }
c608c12e
AM
13426};
13427
13428static void
ad19981d 13429CMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
c608c12e
AM
13430{
13431 unsigned int cmp_type;
13432
13433 FETCH_DATA (the_info, codep + 1);
13434 cmp_type = *codep++ & 0xff;
c0f3af97 13435 if (cmp_type < ARRAY_SIZE (simd_cmp_op))
c608c12e 13436 {
ad19981d 13437 char suffix [3];
ea397f5b 13438 char *p = mnemonicendp - 2;
ad19981d
L
13439 suffix[0] = p[0];
13440 suffix[1] = p[1];
13441 suffix[2] = '\0';
ea397f5b
L
13442 sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
13443 mnemonicendp += simd_cmp_op[cmp_type].len;
c608c12e
AM
13444 }
13445 else
13446 {
ad19981d
L
13447 /* We have a reserved extension byte. Output it directly. */
13448 scratchbuf[0] = '$';
13449 print_operand_value (scratchbuf + 1, 1, cmp_type);
13450 oappend (scratchbuf + intel_syntax);
13451 scratchbuf[0] = '\0';
c608c12e
AM
13452 }
13453}
13454
ca164297 13455static void
b844680a
L
13456OP_Mwait (int bytemode ATTRIBUTE_UNUSED,
13457 int sizeflag ATTRIBUTE_UNUSED)
13458{
13459 /* mwait %eax,%ecx */
13460 if (!intel_syntax)
13461 {
13462 const char **names = (address_mode == mode_64bit
13463 ? names64 : names32);
13464 strcpy (op_out[0], names[0]);
13465 strcpy (op_out[1], names[1]);
13466 two_source_ops = 1;
13467 }
13468 /* Skip mod/rm byte. */
13469 MODRM_CHECK;
13470 codep++;
13471}
13472
13473static void
13474OP_Monitor (int bytemode ATTRIBUTE_UNUSED,
13475 int sizeflag ATTRIBUTE_UNUSED)
ca164297 13476{
b844680a
L
13477 /* monitor %eax,%ecx,%edx" */
13478 if (!intel_syntax)
ca164297 13479 {
b844680a 13480 const char **op1_names;
cb712a9e
L
13481 const char **names = (address_mode == mode_64bit
13482 ? names64 : names32);
1d9f512f 13483
b844680a
L
13484 if (!(prefixes & PREFIX_ADDR))
13485 op1_names = (address_mode == mode_16bit
13486 ? names16 : names);
ca164297
L
13487 else
13488 {
b844680a 13489 /* Remove "addr16/addr32". */
f16cd0d5 13490 all_prefixes[last_addr_prefix] = 0;
b844680a
L
13491 op1_names = (address_mode != mode_32bit
13492 ? names32 : names16);
13493 used_prefixes |= PREFIX_ADDR;
ca164297 13494 }
b844680a
L
13495 strcpy (op_out[0], op1_names[0]);
13496 strcpy (op_out[1], names[1]);
13497 strcpy (op_out[2], names[2]);
13498 two_source_ops = 1;
ca164297 13499 }
b844680a
L
13500 /* Skip mod/rm byte. */
13501 MODRM_CHECK;
13502 codep++;
30123838
JB
13503}
13504
6608db57
KH
13505static void
13506BadOp (void)
2da11e11 13507{
6608db57
KH
13508 /* Throw away prefixes and 1st. opcode byte. */
13509 codep = insn_codep + 1;
2da11e11
AM
13510 oappend ("(bad)");
13511}
4cc91dba 13512
35c52694
L
13513static void
13514REP_Fixup (int bytemode, int sizeflag)
13515{
13516 /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
13517 lods and stos. */
35c52694 13518 if (prefixes & PREFIX_REPZ)
f16cd0d5 13519 all_prefixes[last_repz_prefix] = REP_PREFIX;
35c52694
L
13520
13521 switch (bytemode)
13522 {
13523 case al_reg:
13524 case eAX_reg:
13525 case indir_dx_reg:
13526 OP_IMREG (bytemode, sizeflag);
13527 break;
13528 case eDI_reg:
13529 OP_ESreg (bytemode, sizeflag);
13530 break;
13531 case eSI_reg:
13532 OP_DSreg (bytemode, sizeflag);
13533 break;
13534 default:
13535 abort ();
13536 break;
13537 }
13538}
f5804c90
L
13539
13540static void
13541CMPXCHG8B_Fixup (int bytemode, int sizeflag)
13542{
161a04f6
L
13543 USED_REX (REX_W);
13544 if (rex & REX_W)
f5804c90
L
13545 {
13546 /* Change cmpxchg8b to cmpxchg16b. */
ea397f5b
L
13547 char *p = mnemonicendp - 2;
13548 mnemonicendp = stpcpy (p, "16b");
fb9c77c7 13549 bytemode = o_mode;
f5804c90
L
13550 }
13551 OP_M (bytemode, sizeflag);
13552}
42903f7f
L
13553
13554static void
13555XMM_Fixup (int reg, int sizeflag ATTRIBUTE_UNUSED)
13556{
c0f3af97
L
13557 if (need_vex)
13558 {
13559 switch (vex.length)
13560 {
13561 case 128:
13562 sprintf (scratchbuf, "%%xmm%d", reg);
13563 break;
13564 case 256:
13565 sprintf (scratchbuf, "%%ymm%d", reg);
13566 break;
13567 default:
13568 abort ();
13569 }
13570 }
13571 else
13572 sprintf (scratchbuf, "%%xmm%d", reg);
42903f7f
L
13573 oappend (scratchbuf + intel_syntax);
13574}
381d071f
L
13575
13576static void
13577CRC32_Fixup (int bytemode, int sizeflag)
13578{
13579 /* Add proper suffix to "crc32". */
ea397f5b 13580 char *p = mnemonicendp;
381d071f
L
13581
13582 switch (bytemode)
13583 {
13584 case b_mode:
20592a94 13585 if (intel_syntax)
ea397f5b 13586 goto skip;
20592a94 13587
381d071f
L
13588 *p++ = 'b';
13589 break;
13590 case v_mode:
20592a94 13591 if (intel_syntax)
ea397f5b 13592 goto skip;
20592a94 13593
381d071f
L
13594 USED_REX (REX_W);
13595 if (rex & REX_W)
13596 *p++ = 'q';
f16cd0d5
L
13597 else
13598 {
13599 if (sizeflag & DFLAG)
13600 *p++ = 'l';
13601 else
13602 *p++ = 'w';
13603 used_prefixes |= (prefixes & PREFIX_DATA);
13604 }
381d071f
L
13605 break;
13606 default:
13607 oappend (INTERNAL_DISASSEMBLER_ERROR);
13608 break;
13609 }
ea397f5b 13610 mnemonicendp = p;
381d071f
L
13611 *p = '\0';
13612
ea397f5b 13613skip:
381d071f
L
13614 if (modrm.mod == 3)
13615 {
13616 int add;
13617
13618 /* Skip mod/rm byte. */
13619 MODRM_CHECK;
13620 codep++;
13621
13622 USED_REX (REX_B);
13623 add = (rex & REX_B) ? 8 : 0;
13624 if (bytemode == b_mode)
13625 {
13626 USED_REX (0);
13627 if (rex)
13628 oappend (names8rex[modrm.rm + add]);
13629 else
13630 oappend (names8[modrm.rm + add]);
13631 }
13632 else
13633 {
13634 USED_REX (REX_W);
13635 if (rex & REX_W)
13636 oappend (names64[modrm.rm + add]);
13637 else if ((prefixes & PREFIX_DATA))
13638 oappend (names16[modrm.rm + add]);
13639 else
13640 oappend (names32[modrm.rm + add]);
13641 }
13642 }
13643 else
9344ff29 13644 OP_E (bytemode, sizeflag);
381d071f 13645}
85f10a01 13646
eacc9c89
L
13647static void
13648FXSAVE_Fixup (int bytemode, int sizeflag)
13649{
13650 /* Add proper suffix to "fxsave" and "fxrstor". */
13651 USED_REX (REX_W);
13652 if (rex & REX_W)
13653 {
13654 char *p = mnemonicendp;
13655 *p++ = '6';
13656 *p++ = '4';
13657 *p = '\0';
13658 mnemonicendp = p;
13659 }
13660 OP_M (bytemode, sizeflag);
13661}
13662
c0f3af97
L
13663/* Display the destination register operand for instructions with
13664 VEX. */
13665
13666static void
13667OP_VEX (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13668{
13669 if (!need_vex)
13670 abort ();
13671
13672 if (!need_vex_reg)
13673 return;
13674
13675 switch (vex.length)
13676 {
13677 case 128:
13678 switch (bytemode)
13679 {
13680 case vex_mode:
13681 case vex128_mode:
13682 break;
13683 default:
13684 abort ();
13685 return;
13686 }
13687
13688 sprintf (scratchbuf, "%%xmm%d", vex.register_specifier);
13689 break;
13690 case 256:
13691 switch (bytemode)
13692 {
13693 case vex_mode:
13694 case vex256_mode:
13695 break;
13696 default:
13697 abort ();
13698 return;
13699 }
13700
13701 sprintf (scratchbuf, "%%ymm%d", vex.register_specifier);
13702 break;
13703 default:
13704 abort ();
13705 break;
13706 }
13707 oappend (scratchbuf + intel_syntax);
13708}
13709
922d8de8
DR
13710/* Get the VEX immediate byte without moving codep. */
13711
13712static unsigned char
ccc5981b 13713get_vex_imm8 (int sizeflag, int opnum)
922d8de8
DR
13714{
13715 int bytes_before_imm = 0;
13716
922d8de8
DR
13717 if (modrm.mod != 3)
13718 {
13719 /* There are SIB/displacement bytes. */
13720 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
02e647f9 13721 {
922d8de8 13722 /* 32/64 bit address mode */
02e647f9 13723 int base = modrm.rm;
922d8de8
DR
13724
13725 /* Check SIB byte. */
02e647f9
SP
13726 if (base == 4)
13727 {
13728 FETCH_DATA (the_info, codep + 1);
13729 base = *codep & 7;
13730 /* When decoding the third source, don't increase
13731 bytes_before_imm as this has already been incremented
13732 by one in OP_E_memory while decoding the second
13733 source operand. */
ccc5981b
SP
13734 if (opnum == 0)
13735 bytes_before_imm++;
02e647f9
SP
13736 }
13737
13738 /* Don't increase bytes_before_imm when decoding the third source,
13739 it has already been incremented by OP_E_memory while decoding
13740 the second source operand. */
13741 if (opnum == 0)
13742 {
13743 switch (modrm.mod)
13744 {
13745 case 0:
13746 /* When modrm.rm == 5 or modrm.rm == 4 and base in
13747 SIB == 5, there is a 4 byte displacement. */
13748 if (base != 5)
13749 /* No displacement. */
13750 break;
13751 case 2:
13752 /* 4 byte displacement. */
13753 bytes_before_imm += 4;
13754 break;
13755 case 1:
13756 /* 1 byte displacement. */
13757 bytes_before_imm++;
13758 break;
13759 }
13760 }
13761 }
922d8de8 13762 else
02e647f9
SP
13763 {
13764 /* 16 bit address mode */
13765 /* Don't increase bytes_before_imm when decoding the third source,
13766 it has already been incremented by OP_E_memory while decoding
13767 the second source operand. */
13768 if (opnum == 0)
13769 {
13770 switch (modrm.mod)
13771 {
13772 case 0:
13773 /* When modrm.rm == 6, there is a 2 byte displacement. */
13774 if (modrm.rm != 6)
13775 /* No displacement. */
13776 break;
13777 case 2:
13778 /* 2 byte displacement. */
13779 bytes_before_imm += 2;
13780 break;
13781 case 1:
13782 /* 1 byte displacement: when decoding the third source,
13783 don't increase bytes_before_imm as this has already
13784 been incremented by one in OP_E_memory while decoding
13785 the second source operand. */
13786 if (opnum == 0)
13787 bytes_before_imm++;
ccc5981b 13788
02e647f9
SP
13789 break;
13790 }
922d8de8
DR
13791 }
13792 }
13793 }
13794
13795 FETCH_DATA (the_info, codep + bytes_before_imm + 1);
13796 return codep [bytes_before_imm];
13797}
13798
13799static void
13800OP_EX_VexReg (int bytemode, int sizeflag, int reg)
13801{
13802 if (reg == -1 && modrm.mod != 3)
13803 {
13804 OP_E_memory (bytemode, sizeflag);
13805 return;
13806 }
13807 else
13808 {
13809 if (reg == -1)
13810 {
13811 reg = modrm.rm;
13812 USED_REX (REX_B);
13813 if (rex & REX_B)
13814 reg += 8;
13815 }
13816 else if (reg > 7 && address_mode != mode_64bit)
13817 BadOp ();
13818 }
13819
13820 switch (vex.length)
13821 {
13822 case 128:
13823 sprintf (scratchbuf, "%%xmm%d", reg);
13824 break;
13825 case 256:
13826 sprintf (scratchbuf, "%%ymm%d", reg);
13827 break;
13828 default:
13829 abort ();
13830 }
13831 oappend (scratchbuf + intel_syntax);
13832}
13833
5dd85c99
SP
13834static void
13835OP_Vex_2src (int bytemode, int sizeflag)
13836{
13837 if (modrm.mod == 3)
13838 {
13839 USED_REX (REX_B);
13840 sprintf (scratchbuf, "%%xmm%d", rex & REX_B ? modrm.rm + 8 : modrm.rm);
13841 oappend (scratchbuf + intel_syntax);
13842 }
13843 else
13844 {
13845 if (intel_syntax
13846 && (bytemode == v_mode || bytemode == v_swap_mode))
13847 {
13848 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
13849 used_prefixes |= (prefixes & PREFIX_DATA);
13850 }
13851 OP_E (bytemode, sizeflag);
13852 }
13853}
13854
13855static void
13856OP_Vex_2src_1 (int bytemode, int sizeflag)
13857{
13858 if (modrm.mod == 3)
13859 {
13860 /* Skip mod/rm byte. */
13861 MODRM_CHECK;
13862 codep++;
13863 }
13864
13865 if (vex.w)
13866 {
13867 sprintf (scratchbuf, "%%xmm%d", vex.register_specifier);
13868 oappend (scratchbuf + intel_syntax);
13869 }
13870 else
13871 OP_Vex_2src (bytemode, sizeflag);
13872}
13873
13874static void
13875OP_Vex_2src_2 (int bytemode, int sizeflag)
13876{
13877 if (vex.w)
13878 OP_Vex_2src (bytemode, sizeflag);
13879 else
13880 {
13881 sprintf (scratchbuf, "%%xmm%d", vex.register_specifier);
13882 oappend (scratchbuf + intel_syntax);
13883 }
13884}
13885
922d8de8
DR
13886static void
13887OP_EX_VexW (int bytemode, int sizeflag)
13888{
13889 int reg = -1;
13890
13891 if (!vex_w_done)
13892 {
13893 vex_w_done = 1;
41effecb
SP
13894
13895 /* Skip mod/rm byte. */
13896 MODRM_CHECK;
13897 codep++;
13898
922d8de8 13899 if (vex.w)
ccc5981b 13900 reg = get_vex_imm8 (sizeflag, 0) >> 4;
922d8de8
DR
13901 }
13902 else
13903 {
13904 if (!vex.w)
ccc5981b 13905 reg = get_vex_imm8 (sizeflag, 1) >> 4;
922d8de8
DR
13906 }
13907
13908 OP_EX_VexReg (bytemode, sizeflag, reg);
13909}
13910
922d8de8
DR
13911static void
13912VEXI4_Fixup (int bytemode ATTRIBUTE_UNUSED,
13913 int sizeflag ATTRIBUTE_UNUSED)
13914{
13915 /* Skip the immediate byte and check for invalid bits. */
13916 FETCH_DATA (the_info, codep + 1);
13917 if (*codep++ & 0xf)
13918 BadOp ();
13919}
13920
c0f3af97
L
13921static void
13922OP_REG_VexI4 (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13923{
13924 int reg;
13925 FETCH_DATA (the_info, codep + 1);
13926 reg = *codep++;
13927
13928 if (bytemode != x_mode)
13929 abort ();
13930
13931 if (reg & 0xf)
13932 BadOp ();
13933
13934 reg >>= 4;
dae39acc
L
13935 if (reg > 7 && address_mode != mode_64bit)
13936 BadOp ();
13937
c0f3af97
L
13938 switch (vex.length)
13939 {
13940 case 128:
13941 sprintf (scratchbuf, "%%xmm%d", reg);
13942 break;
13943 case 256:
13944 sprintf (scratchbuf, "%%ymm%d", reg);
13945 break;
13946 default:
13947 abort ();
13948 }
13949 oappend (scratchbuf + intel_syntax);
13950}
13951
922d8de8
DR
13952static void
13953OP_XMM_VexW (int bytemode, int sizeflag)
13954{
13955 /* Turn off the REX.W bit since it is used for swapping operands
13956 now. */
13957 rex &= ~REX_W;
13958 OP_XMM (bytemode, sizeflag);
13959}
13960
c0f3af97
L
13961static void
13962OP_EX_Vex (int bytemode, int sizeflag)
13963{
13964 if (modrm.mod != 3)
13965 {
13966 if (vex.register_specifier != 0)
13967 BadOp ();
13968 need_vex_reg = 0;
13969 }
13970 OP_EX (bytemode, sizeflag);
13971}
13972
13973static void
13974OP_XMM_Vex (int bytemode, int sizeflag)
13975{
13976 if (modrm.mod != 3)
13977 {
13978 if (vex.register_specifier != 0)
13979 BadOp ();
13980 need_vex_reg = 0;
13981 }
13982 OP_XMM (bytemode, sizeflag);
13983}
13984
13985static void
13986VZERO_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13987{
13988 switch (vex.length)
13989 {
13990 case 128:
ea397f5b 13991 mnemonicendp = stpcpy (obuf, "vzeroupper");
c0f3af97
L
13992 break;
13993 case 256:
ea397f5b 13994 mnemonicendp = stpcpy (obuf, "vzeroall");
c0f3af97
L
13995 break;
13996 default:
13997 abort ();
13998 }
13999}
14000
ea397f5b
L
14001static struct op vex_cmp_op[] =
14002{
14003 { STRING_COMMA_LEN ("eq") },
14004 { STRING_COMMA_LEN ("lt") },
14005 { STRING_COMMA_LEN ("le") },
14006 { STRING_COMMA_LEN ("unord") },
14007 { STRING_COMMA_LEN ("neq") },
14008 { STRING_COMMA_LEN ("nlt") },
14009 { STRING_COMMA_LEN ("nle") },
14010 { STRING_COMMA_LEN ("ord") },
14011 { STRING_COMMA_LEN ("eq_uq") },
14012 { STRING_COMMA_LEN ("nge") },
14013 { STRING_COMMA_LEN ("ngt") },
14014 { STRING_COMMA_LEN ("false") },
14015 { STRING_COMMA_LEN ("neq_oq") },
14016 { STRING_COMMA_LEN ("ge") },
14017 { STRING_COMMA_LEN ("gt") },
14018 { STRING_COMMA_LEN ("true") },
14019 { STRING_COMMA_LEN ("eq_os") },
14020 { STRING_COMMA_LEN ("lt_oq") },
14021 { STRING_COMMA_LEN ("le_oq") },
14022 { STRING_COMMA_LEN ("unord_s") },
14023 { STRING_COMMA_LEN ("neq_us") },
14024 { STRING_COMMA_LEN ("nlt_uq") },
14025 { STRING_COMMA_LEN ("nle_uq") },
14026 { STRING_COMMA_LEN ("ord_s") },
14027 { STRING_COMMA_LEN ("eq_us") },
14028 { STRING_COMMA_LEN ("nge_uq") },
14029 { STRING_COMMA_LEN ("ngt_uq") },
14030 { STRING_COMMA_LEN ("false_os") },
14031 { STRING_COMMA_LEN ("neq_os") },
14032 { STRING_COMMA_LEN ("ge_oq") },
14033 { STRING_COMMA_LEN ("gt_oq") },
14034 { STRING_COMMA_LEN ("true_us") },
c0f3af97
L
14035};
14036
14037static void
14038VCMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
14039{
14040 unsigned int cmp_type;
14041
14042 FETCH_DATA (the_info, codep + 1);
14043 cmp_type = *codep++ & 0xff;
14044 if (cmp_type < ARRAY_SIZE (vex_cmp_op))
14045 {
14046 char suffix [3];
ea397f5b 14047 char *p = mnemonicendp - 2;
c0f3af97
L
14048 suffix[0] = p[0];
14049 suffix[1] = p[1];
14050 suffix[2] = '\0';
ea397f5b
L
14051 sprintf (p, "%s%s", vex_cmp_op[cmp_type].name, suffix);
14052 mnemonicendp += vex_cmp_op[cmp_type].len;
c0f3af97
L
14053 }
14054 else
14055 {
14056 /* We have a reserved extension byte. Output it directly. */
14057 scratchbuf[0] = '$';
14058 print_operand_value (scratchbuf + 1, 1, cmp_type);
14059 oappend (scratchbuf + intel_syntax);
14060 scratchbuf[0] = '\0';
14061 }
14062}
14063
ea397f5b
L
14064static const struct op pclmul_op[] =
14065{
14066 { STRING_COMMA_LEN ("lql") },
14067 { STRING_COMMA_LEN ("hql") },
14068 { STRING_COMMA_LEN ("lqh") },
14069 { STRING_COMMA_LEN ("hqh") }
c0f3af97
L
14070};
14071
14072static void
14073PCLMUL_Fixup (int bytemode ATTRIBUTE_UNUSED,
14074 int sizeflag ATTRIBUTE_UNUSED)
14075{
14076 unsigned int pclmul_type;
14077
14078 FETCH_DATA (the_info, codep + 1);
14079 pclmul_type = *codep++ & 0xff;
14080 switch (pclmul_type)
14081 {
14082 case 0x10:
14083 pclmul_type = 2;
14084 break;
14085 case 0x11:
14086 pclmul_type = 3;
14087 break;
14088 default:
14089 break;
14090 }
14091 if (pclmul_type < ARRAY_SIZE (pclmul_op))
14092 {
14093 char suffix [4];
ea397f5b 14094 char *p = mnemonicendp - 3;
c0f3af97
L
14095 suffix[0] = p[0];
14096 suffix[1] = p[1];
14097 suffix[2] = p[2];
14098 suffix[3] = '\0';
ea397f5b
L
14099 sprintf (p, "%s%s", pclmul_op[pclmul_type].name, suffix);
14100 mnemonicendp += pclmul_op[pclmul_type].len;
c0f3af97
L
14101 }
14102 else
14103 {
14104 /* We have a reserved extension byte. Output it directly. */
14105 scratchbuf[0] = '$';
14106 print_operand_value (scratchbuf + 1, 1, pclmul_type);
14107 oappend (scratchbuf + intel_syntax);
14108 scratchbuf[0] = '\0';
14109 }
14110}
14111
f1f8f695
L
14112static void
14113MOVBE_Fixup (int bytemode, int sizeflag)
14114{
14115 /* Add proper suffix to "movbe". */
ea397f5b 14116 char *p = mnemonicendp;
f1f8f695
L
14117
14118 switch (bytemode)
14119 {
14120 case v_mode:
14121 if (intel_syntax)
ea397f5b 14122 goto skip;
f1f8f695
L
14123
14124 USED_REX (REX_W);
14125 if (sizeflag & SUFFIX_ALWAYS)
14126 {
14127 if (rex & REX_W)
14128 *p++ = 'q';
f1f8f695 14129 else
f16cd0d5
L
14130 {
14131 if (sizeflag & DFLAG)
14132 *p++ = 'l';
14133 else
14134 *p++ = 'w';
14135 used_prefixes |= (prefixes & PREFIX_DATA);
14136 }
f1f8f695 14137 }
f1f8f695
L
14138 break;
14139 default:
14140 oappend (INTERNAL_DISASSEMBLER_ERROR);
14141 break;
14142 }
ea397f5b 14143 mnemonicendp = p;
f1f8f695
L
14144 *p = '\0';
14145
ea397f5b 14146skip:
f1f8f695
L
14147 OP_M (bytemode, sizeflag);
14148}
f88c9eb0
SP
14149
14150static void
14151OP_LWPCB_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
14152{
14153 int reg;
14154 const char **names;
14155
14156 /* Skip mod/rm byte. */
14157 MODRM_CHECK;
14158 codep++;
14159
14160 if (vex.w)
14161 names = names64;
14162 else if (vex.length == 256)
14163 names = names32;
14164 else
14165 names = names16;
14166
14167 reg = modrm.rm;
14168 USED_REX (REX_B);
14169 if (rex & REX_B)
14170 reg += 8;
14171
14172 oappend (names[reg]);
14173}
14174
14175static void
14176OP_LWP_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
14177{
14178 const char **names;
14179
14180 if (vex.w)
14181 names = names64;
14182 else if (vex.length == 256)
14183 names = names32;
14184 else
14185 names = names16;
14186
14187 oappend (names[vex.register_specifier]);
14188}
14189
14190static void
14191OP_LWP_I (int bytemode ATTRIBUTE_UNUSED, int sizeflag)
14192{
14193 if (vex.w || vex.length == 256)
14194 OP_I (q_mode, sizeflag);
14195 else
14196 OP_I (w_mode, sizeflag);
14197}
14198
This page took 1.307399 seconds and 4 git commands to generate.