]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - opcodes/i386-dis.c
* ld-cris/tls-err-77.d, ld-cris/tls-gc-79.d, ld-cris/tls-ie-8e.s,
[thirdparty/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,
0af1713e
AM
3 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
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 fetch_data (struct disassemble_info *, bfd_byte *);
46static void ckprefix (void);
47static const char *prefix_name (int, int);
48static int print_insn (bfd_vma, disassemble_info *);
49static void dofloat (int);
50static void OP_ST (int, int);
51static void OP_STi (int, int);
52static int putop (const char *, int);
53static void oappend (const char *);
54static void append_seg (void);
55static void OP_indirE (int, int);
56static void print_operand_value (char *, int, bfd_vma);
c0f3af97
L
57static void OP_E_register (int, int);
58static void OP_E_memory (int, int, int);
85f10a01 59static void OP_E_extended (int, int, int);
5d669648 60static void print_displacement (char *, bfd_vma);
26ca5450
AJ
61static void OP_E (int, int);
62static void OP_G (int, int);
63static bfd_vma get64 (void);
64static bfd_signed_vma get32 (void);
65static bfd_signed_vma get32s (void);
66static int get16 (void);
67static void set_op (bfd_vma, int);
b844680a 68static void OP_Skip_MODRM (int, int);
26ca5450
AJ
69static void OP_REG (int, int);
70static void OP_IMREG (int, int);
71static void OP_I (int, int);
72static void OP_I64 (int, int);
73static void OP_sI (int, int);
74static void OP_J (int, int);
75static void OP_SEG (int, int);
76static void OP_DIR (int, int);
77static void OP_OFF (int, int);
78static void OP_OFF64 (int, int);
79static void ptr_reg (int, int);
80static void OP_ESreg (int, int);
81static void OP_DSreg (int, int);
82static void OP_C (int, int);
83static void OP_D (int, int);
84static void OP_T (int, int);
6f74c397 85static void OP_R (int, int);
26ca5450
AJ
86static void OP_MMX (int, int);
87static void OP_XMM (int, int);
88static void OP_EM (int, int);
89static void OP_EX (int, int);
4d9567e0
MM
90static void OP_EMC (int,int);
91static void OP_MXC (int,int);
26ca5450
AJ
92static void OP_MS (int, int);
93static void OP_XS (int, int);
cc0ec051 94static void OP_M (int, int);
c0f3af97 95static void OP_VEX (int, int);
dae39acc 96static void OP_VEX_FMA (int, int);
c0f3af97
L
97static void OP_EX_Vex (int, int);
98static void OP_EX_VexW (int, int);
dae39acc 99static void OP_EX_VexImmW (int, int);
c0f3af97
L
100static void OP_XMM_Vex (int, int);
101static void OP_XMM_VexW (int, int);
102static void OP_REG_VexI4 (int, int);
103static void PCLMUL_Fixup (int, int);
104static void VEXI4_Fixup (int, int);
105static void VZERO_Fixup (int, int);
106static void VCMP_Fixup (int, int);
107static void VPERMIL2_Fixup (int, int);
cc0ec051 108static void OP_0f07 (int, int);
b844680a
L
109static void OP_Monitor (int, int);
110static void OP_Mwait (int, int);
46e883c5
L
111static void NOP_Fixup1 (int, int);
112static void NOP_Fixup2 (int, int);
26ca5450 113static void OP_3DNowSuffix (int, int);
ad19981d 114static void CMP_Fixup (int, int);
26ca5450 115static void BadOp (void);
35c52694 116static void REP_Fixup (int, int);
f5804c90 117static void CMPXCHG8B_Fixup (int, int);
42903f7f 118static void XMM_Fixup (int, int);
381d071f 119static void CRC32_Fixup (int, int);
85f10a01
MM
120static void print_drex_arg (unsigned int, int, int);
121static void OP_DREX4 (int, int);
122static void OP_DREX3 (int, int);
123static void OP_DREX_ICMP (int, int);
124static void OP_DREX_FCMP (int, int);
f1f8f695 125static void MOVBE_Fixup (int, int);
252b5132 126
6608db57 127struct dis_private {
252b5132
RH
128 /* Points to first byte not fetched. */
129 bfd_byte *max_fetched;
0b1cf022 130 bfd_byte the_buffer[MAX_MNEM_SIZE];
252b5132 131 bfd_vma insn_start;
e396998b 132 int orig_sizeflag;
252b5132
RH
133 jmp_buf bailout;
134};
135
cb712a9e
L
136enum address_mode
137{
138 mode_16bit,
139 mode_32bit,
140 mode_64bit
141};
142
143enum address_mode address_mode;
52b15da3 144
5076851f
ILT
145/* Flags for the prefixes for the current instruction. See below. */
146static int prefixes;
147
52b15da3
JH
148/* REX prefix the current instruction. See below. */
149static int rex;
150/* Bits of REX we've already used. */
151static int rex_used;
c0f3af97
L
152/* Original REX prefix. */
153static int rex_original;
154/* REX bits in original REX prefix ignored. It may not be the same
155 as rex_original since some bits may not be ignored. */
156static int rex_ignored;
52b15da3
JH
157/* Mark parts used in the REX prefix. When we are testing for
158 empty prefix (for 8bit register REX extension), just mask it
159 out. Otherwise test for REX bit is excuse for existence of REX
160 only in case value is nonzero. */
161#define USED_REX(value) \
162 { \
163 if (value) \
161a04f6
L
164 { \
165 if ((rex & value)) \
166 rex_used |= (value) | REX_OPCODE; \
167 } \
52b15da3 168 else \
161a04f6 169 rex_used |= REX_OPCODE; \
52b15da3
JH
170 }
171
85f10a01
MM
172/* Special 'registers' for DREX handling */
173#define DREX_REG_UNKNOWN 1000 /* not initialized */
174#define DREX_REG_MEMORY 1001 /* use MODRM/SIB/OFFSET memory */
175
176/* The DREX byte has the following fields:
177 Bits 7-4 -- DREX.Dest, xmm destination register
178 Bit 3 -- DREX.OC0, operand config bit defines operand order
179 Bit 2 -- DREX.R, equivalent to REX_R bit, to extend ModRM register
180 Bit 1 -- DREX.X, equivalent to REX_X bit, to extend SIB index field
181 Bit 0 -- DREX.W, equivalent to REX_B bit, to extend ModRM r/m field,
182 SIB base field, or opcode reg field. */
183#define DREX_XMM(drex) ((drex >> 4) & 0xf)
184#define DREX_OC0(drex) ((drex >> 3) & 0x1)
185
7d421014
ILT
186/* Flags for prefixes which we somehow handled when printing the
187 current instruction. */
188static int used_prefixes;
189
5076851f
ILT
190/* Flags stored in PREFIXES. */
191#define PREFIX_REPZ 1
192#define PREFIX_REPNZ 2
193#define PREFIX_LOCK 4
194#define PREFIX_CS 8
195#define PREFIX_SS 0x10
196#define PREFIX_DS 0x20
197#define PREFIX_ES 0x40
198#define PREFIX_FS 0x80
199#define PREFIX_GS 0x100
200#define PREFIX_DATA 0x200
201#define PREFIX_ADDR 0x400
202#define PREFIX_FWAIT 0x800
203
252b5132
RH
204/* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
205 to ADDR (exclusive) are valid. Returns 1 for success, longjmps
206 on error. */
207#define FETCH_DATA(info, addr) \
6608db57 208 ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \
252b5132
RH
209 ? 1 : fetch_data ((info), (addr)))
210
211static int
26ca5450 212fetch_data (struct disassemble_info *info, bfd_byte *addr)
252b5132
RH
213{
214 int status;
6608db57 215 struct dis_private *priv = (struct dis_private *) info->private_data;
252b5132
RH
216 bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer);
217
0b1cf022 218 if (addr <= priv->the_buffer + MAX_MNEM_SIZE)
272c9217
JB
219 status = (*info->read_memory_func) (start,
220 priv->max_fetched,
221 addr - priv->max_fetched,
222 info);
223 else
224 status = -1;
252b5132
RH
225 if (status != 0)
226 {
7d421014 227 /* If we did manage to read at least one byte, then
db6eb5be
AM
228 print_insn_i386 will do something sensible. Otherwise, print
229 an error. We do that here because this is where we know
230 STATUS. */
7d421014 231 if (priv->max_fetched == priv->the_buffer)
5076851f 232 (*info->memory_error_func) (status, start, info);
252b5132
RH
233 longjmp (priv->bailout, 1);
234 }
235 else
236 priv->max_fetched = addr;
237 return 1;
238}
239
ce518a5f
L
240#define XX { NULL, 0 }
241
242#define Eb { OP_E, b_mode }
243#define Ev { OP_E, v_mode }
244#define Ed { OP_E, d_mode }
245#define Edq { OP_E, dq_mode }
246#define Edqw { OP_E, dqw_mode }
42903f7f
L
247#define Edqb { OP_E, dqb_mode }
248#define Edqd { OP_E, dqd_mode }
09335d05 249#define Eq { OP_E, q_mode }
ce518a5f
L
250#define indirEv { OP_indirE, stack_v_mode }
251#define indirEp { OP_indirE, f_mode }
252#define stackEv { OP_E, stack_v_mode }
253#define Em { OP_E, m_mode }
254#define Ew { OP_E, w_mode }
255#define M { OP_M, 0 } /* lea, lgdt, etc. */
34b772a6 256#define Ma { OP_M, a_mode }
b844680a 257#define Mb { OP_M, b_mode }
d9a5e5e5 258#define Md { OP_M, d_mode }
f1f8f695 259#define Mo { OP_M, o_mode }
ce518a5f
L
260#define Mp { OP_M, f_mode } /* 32 or 48 bit memory operand for LDS, LES etc */
261#define Mq { OP_M, q_mode }
4ee52178 262#define Mx { OP_M, x_mode }
c0f3af97 263#define Mxmm { OP_M, xmm_mode }
ce518a5f
L
264#define Gb { OP_G, b_mode }
265#define Gv { OP_G, v_mode }
266#define Gd { OP_G, d_mode }
267#define Gdq { OP_G, dq_mode }
268#define Gm { OP_G, m_mode }
269#define Gw { OP_G, w_mode }
6f74c397
L
270#define Rd { OP_R, d_mode }
271#define Rm { OP_R, m_mode }
ce518a5f
L
272#define Ib { OP_I, b_mode }
273#define sIb { OP_sI, b_mode } /* sign extened byte */
274#define Iv { OP_I, v_mode }
275#define Iq { OP_I, q_mode }
276#define Iv64 { OP_I64, v_mode }
277#define Iw { OP_I, w_mode }
278#define I1 { OP_I, const_1_mode }
279#define Jb { OP_J, b_mode }
280#define Jv { OP_J, v_mode }
281#define Cm { OP_C, m_mode }
282#define Dm { OP_D, m_mode }
283#define Td { OP_T, d_mode }
b844680a 284#define Skip_MODRM { OP_Skip_MODRM, 0 }
ce518a5f
L
285
286#define RMeAX { OP_REG, eAX_reg }
287#define RMeBX { OP_REG, eBX_reg }
288#define RMeCX { OP_REG, eCX_reg }
289#define RMeDX { OP_REG, eDX_reg }
290#define RMeSP { OP_REG, eSP_reg }
291#define RMeBP { OP_REG, eBP_reg }
292#define RMeSI { OP_REG, eSI_reg }
293#define RMeDI { OP_REG, eDI_reg }
294#define RMrAX { OP_REG, rAX_reg }
295#define RMrBX { OP_REG, rBX_reg }
296#define RMrCX { OP_REG, rCX_reg }
297#define RMrDX { OP_REG, rDX_reg }
298#define RMrSP { OP_REG, rSP_reg }
299#define RMrBP { OP_REG, rBP_reg }
300#define RMrSI { OP_REG, rSI_reg }
301#define RMrDI { OP_REG, rDI_reg }
302#define RMAL { OP_REG, al_reg }
303#define RMAL { OP_REG, al_reg }
304#define RMCL { OP_REG, cl_reg }
305#define RMDL { OP_REG, dl_reg }
306#define RMBL { OP_REG, bl_reg }
307#define RMAH { OP_REG, ah_reg }
308#define RMCH { OP_REG, ch_reg }
309#define RMDH { OP_REG, dh_reg }
310#define RMBH { OP_REG, bh_reg }
311#define RMAX { OP_REG, ax_reg }
312#define RMDX { OP_REG, dx_reg }
313
314#define eAX { OP_IMREG, eAX_reg }
315#define eBX { OP_IMREG, eBX_reg }
316#define eCX { OP_IMREG, eCX_reg }
317#define eDX { OP_IMREG, eDX_reg }
318#define eSP { OP_IMREG, eSP_reg }
319#define eBP { OP_IMREG, eBP_reg }
320#define eSI { OP_IMREG, eSI_reg }
321#define eDI { OP_IMREG, eDI_reg }
322#define AL { OP_IMREG, al_reg }
323#define CL { OP_IMREG, cl_reg }
324#define DL { OP_IMREG, dl_reg }
325#define BL { OP_IMREG, bl_reg }
326#define AH { OP_IMREG, ah_reg }
327#define CH { OP_IMREG, ch_reg }
328#define DH { OP_IMREG, dh_reg }
329#define BH { OP_IMREG, bh_reg }
330#define AX { OP_IMREG, ax_reg }
331#define DX { OP_IMREG, dx_reg }
332#define zAX { OP_IMREG, z_mode_ax_reg }
333#define indirDX { OP_IMREG, indir_dx_reg }
334
335#define Sw { OP_SEG, w_mode }
336#define Sv { OP_SEG, v_mode }
337#define Ap { OP_DIR, 0 }
338#define Ob { OP_OFF64, b_mode }
339#define Ov { OP_OFF64, v_mode }
340#define Xb { OP_DSreg, eSI_reg }
341#define Xv { OP_DSreg, eSI_reg }
342#define Xz { OP_DSreg, eSI_reg }
343#define Yb { OP_ESreg, eDI_reg }
344#define Yv { OP_ESreg, eDI_reg }
345#define DSBX { OP_DSreg, eBX_reg }
346
347#define es { OP_REG, es_reg }
348#define ss { OP_REG, ss_reg }
349#define cs { OP_REG, cs_reg }
350#define ds { OP_REG, ds_reg }
351#define fs { OP_REG, fs_reg }
352#define gs { OP_REG, gs_reg }
353
354#define MX { OP_MMX, 0 }
355#define XM { OP_XMM, 0 }
c0f3af97 356#define XMM { OP_XMM, xmm_mode }
ce518a5f 357#define EM { OP_EM, v_mode }
09a2c6cf 358#define EMd { OP_EM, d_mode }
14051056 359#define EMx { OP_EM, x_mode }
8976381e 360#define EXw { OP_EX, w_mode }
09a2c6cf
L
361#define EXd { OP_EX, d_mode }
362#define EXq { OP_EX, q_mode }
363#define EXx { OP_EX, x_mode }
c0f3af97
L
364#define EXxmm { OP_EX, xmm_mode }
365#define EXxmmq { OP_EX, xmmq_mode }
366#define EXymmq { OP_EX, ymmq_mode }
ce518a5f
L
367#define MS { OP_MS, v_mode }
368#define XS { OP_XS, v_mode }
09335d05 369#define EMCq { OP_EMC, q_mode }
ce518a5f 370#define MXC { OP_MXC, 0 }
ce518a5f 371#define OPSUF { OP_3DNowSuffix, 0 }
ad19981d 372#define CMP { CMP_Fixup, 0 }
42903f7f 373#define XMM0 { XMM_Fixup, 0 }
252b5132 374
c0f3af97
L
375#define Vex { OP_VEX, vex_mode }
376#define Vex128 { OP_VEX, vex128_mode }
377#define Vex256 { OP_VEX, vex256_mode }
378#define VexI4 { VEXI4_Fixup, 0}
dae39acc
L
379#define VexFMA { OP_VEX_FMA, vex_mode }
380#define Vex128FMA { OP_VEX_FMA, vex128_mode }
c0f3af97
L
381#define EXdVex { OP_EX_Vex, d_mode }
382#define EXqVex { OP_EX_Vex, q_mode }
383#define EXVexW { OP_EX_VexW, x_mode }
384#define EXdVexW { OP_EX_VexW, d_mode }
385#define EXqVexW { OP_EX_VexW, q_mode }
dae39acc 386#define EXVexImmW { OP_EX_VexImmW, x_mode }
c0f3af97
L
387#define XMVex { OP_XMM_Vex, 0 }
388#define XMVexW { OP_XMM_VexW, 0 }
389#define XMVexI4 { OP_REG_VexI4, x_mode }
390#define PCLMUL { PCLMUL_Fixup, 0 }
391#define VZERO { VZERO_Fixup, 0 }
392#define VCMP { VCMP_Fixup, 0 }
393#define VPERMIL2 { VPERMIL2_Fixup, 0 }
394
35c52694 395/* Used handle "rep" prefix for string instructions. */
ce518a5f
L
396#define Xbr { REP_Fixup, eSI_reg }
397#define Xvr { REP_Fixup, eSI_reg }
398#define Ybr { REP_Fixup, eDI_reg }
399#define Yvr { REP_Fixup, eDI_reg }
400#define Yzr { REP_Fixup, eDI_reg }
401#define indirDXr { REP_Fixup, indir_dx_reg }
402#define ALr { REP_Fixup, al_reg }
403#define eAXr { REP_Fixup, eAX_reg }
404
405#define cond_jump_flag { NULL, cond_jump_mode }
406#define loop_jcxz_flag { NULL, loop_jcxz_mode }
3ffd33cf 407
252b5132 408/* bits in sizeflag */
252b5132 409#define SUFFIX_ALWAYS 4
252b5132
RH
410#define AFLAG 2
411#define DFLAG 1
412
d55ee72f
L
413/* byte operand */
414#define b_mode 1
415/* operand size depends on prefixes */
630c2cc5 416#define v_mode (b_mode + 1)
d55ee72f
L
417/* word operand */
418#define w_mode (v_mode + 1)
419/* double word operand */
420#define d_mode (w_mode + 1)
421/* quad word operand */
422#define q_mode (d_mode + 1)
423/* ten-byte operand */
424#define t_mode (q_mode + 1)
c0f3af97 425/* 16-byte XMM or 32-byte YMM operand */
d55ee72f 426#define x_mode (t_mode + 1)
c0f3af97
L
427/* 16-byte XMM operand */
428#define xmm_mode (x_mode + 1)
429/* 16-byte XMM or quad word operand */
430#define xmmq_mode (xmm_mode + 1)
431/* 32-byte YMM or quad word operand */
432#define ymmq_mode (xmmq_mode + 1)
d55ee72f 433/* d_mode in 32bit, q_mode in 64bit mode. */
c0f3af97 434#define m_mode (ymmq_mode + 1)
34b772a6
JB
435/* pair of v_mode operands */
436#define a_mode (m_mode + 1)
437#define cond_jump_mode (a_mode + 1)
d55ee72f
L
438#define loop_jcxz_mode (cond_jump_mode + 1)
439/* operand size depends on REX prefixes. */
440#define dq_mode (loop_jcxz_mode + 1)
441/* registers like dq_mode, memory like w_mode. */
442#define dqw_mode (dq_mode + 1)
443/* 4- or 6-byte pointer operand */
444#define f_mode (dqw_mode + 1)
445#define const_1_mode (f_mode + 1)
446/* v_mode for stack-related opcodes. */
447#define stack_v_mode (const_1_mode + 1)
448/* non-quad operand size depends on prefixes */
449#define z_mode (stack_v_mode + 1)
450/* 16-byte operand */
451#define o_mode (z_mode + 1)
452/* registers like dq_mode, memory like b_mode. */
453#define dqb_mode (o_mode + 1)
454/* registers like dq_mode, memory like d_mode. */
455#define dqd_mode (dqb_mode + 1)
c0f3af97
L
456/* normal vex mode */
457#define vex_mode (dqd_mode + 1)
458/* 128bit vex mode */
459#define vex128_mode (vex_mode + 1)
460/* 256bit vex mode */
461#define vex256_mode (vex128_mode + 1)
462
463#define es_reg (vex256_mode + 1)
d55ee72f
L
464#define cs_reg (es_reg + 1)
465#define ss_reg (cs_reg + 1)
466#define ds_reg (ss_reg + 1)
467#define fs_reg (ds_reg + 1)
468#define gs_reg (fs_reg + 1)
469
470#define eAX_reg (gs_reg + 1)
471#define eCX_reg (eAX_reg + 1)
472#define eDX_reg (eCX_reg + 1)
473#define eBX_reg (eDX_reg + 1)
474#define eSP_reg (eBX_reg + 1)
475#define eBP_reg (eSP_reg + 1)
476#define eSI_reg (eBP_reg + 1)
477#define eDI_reg (eSI_reg + 1)
478
479#define al_reg (eDI_reg + 1)
480#define cl_reg (al_reg + 1)
481#define dl_reg (cl_reg + 1)
482#define bl_reg (dl_reg + 1)
483#define ah_reg (bl_reg + 1)
484#define ch_reg (ah_reg + 1)
485#define dh_reg (ch_reg + 1)
486#define bh_reg (dh_reg + 1)
487
488#define ax_reg (bh_reg + 1)
489#define cx_reg (ax_reg + 1)
490#define dx_reg (cx_reg + 1)
491#define bx_reg (dx_reg + 1)
492#define sp_reg (bx_reg + 1)
493#define bp_reg (sp_reg + 1)
494#define si_reg (bp_reg + 1)
495#define di_reg (si_reg + 1)
496
497#define rAX_reg (di_reg + 1)
498#define rCX_reg (rAX_reg + 1)
499#define rDX_reg (rCX_reg + 1)
500#define rBX_reg (rDX_reg + 1)
501#define rSP_reg (rBX_reg + 1)
502#define rBP_reg (rSP_reg + 1)
503#define rSI_reg (rBP_reg + 1)
504#define rDI_reg (rSI_reg + 1)
505
506#define z_mode_ax_reg (rDI_reg + 1)
507#define indir_dx_reg (z_mode_ax_reg + 1)
508
509#define MAX_BYTEMODE indir_dx_reg
510
511/* Flags that are OR'ed into the bytemode field to pass extra
512 information. */
513#define DREX_OC1 0x10000 /* OC1 bit set */
514#define DREX_NO_OC0 0x20000 /* OC0 bit not used */
515#define DREX_MASK 0x40000 /* mask to delete */
516
517#if MAX_BYTEMODE >= DREX_OC1
518#error MAX_BYTEMODE must be less than DREX_OC1
519#endif
252b5132 520
1b0d430b
L
521#define FLOATCODE 1
522#define USE_REG_TABLE (FLOATCODE + 1)
523#define USE_MOD_TABLE (USE_REG_TABLE + 1)
524#define USE_RM_TABLE (USE_MOD_TABLE + 1)
525#define USE_PREFIX_TABLE (USE_RM_TABLE + 1)
526#define USE_X86_64_TABLE (USE_PREFIX_TABLE + 1)
527#define USE_3BYTE_TABLE (USE_X86_64_TABLE + 1)
c0f3af97
L
528#define USE_VEX_C4_TABLE (USE_3BYTE_TABLE + 1)
529#define USE_VEX_C5_TABLE (USE_VEX_C4_TABLE + 1)
530#define USE_VEX_LEN_TABLE (USE_VEX_C5_TABLE + 1)
6439fc28 531
1ceb70f8 532#define FLOAT NULL, { { NULL, FLOATCODE } }
4efba78c 533
4e7d34a6 534#define DIS386(T, I) NULL, { { NULL, (T)}, { NULL, (I) } }
1ceb70f8
L
535#define REG_TABLE(I) DIS386 (USE_REG_TABLE, (I))
536#define MOD_TABLE(I) DIS386 (USE_MOD_TABLE, (I))
537#define RM_TABLE(I) DIS386 (USE_RM_TABLE, (I))
538#define PREFIX_TABLE(I) DIS386 (USE_PREFIX_TABLE, (I))
4e7d34a6
L
539#define X86_64_TABLE(I) DIS386 (USE_X86_64_TABLE, (I))
540#define THREE_BYTE_TABLE(I) DIS386 (USE_3BYTE_TABLE, (I))
c0f3af97
L
541#define VEX_C4_TABLE(I) DIS386 (USE_VEX_C4_TABLE, (I))
542#define VEX_C5_TABLE(I) DIS386 (USE_VEX_C5_TABLE, (I))
543#define VEX_LEN_TABLE(I) DIS386 (USE_VEX_LEN_TABLE, (I))
1ceb70f8
L
544
545#define REG_80 0
546#define REG_81 (REG_80 + 1)
547#define REG_82 (REG_81 + 1)
548#define REG_8F (REG_82 + 1)
549#define REG_C0 (REG_8F + 1)
550#define REG_C1 (REG_C0 + 1)
551#define REG_C6 (REG_C1 + 1)
552#define REG_C7 (REG_C6 + 1)
553#define REG_D0 (REG_C7 + 1)
554#define REG_D1 (REG_D0 + 1)
555#define REG_D2 (REG_D1 + 1)
556#define REG_D3 (REG_D2 + 1)
557#define REG_F6 (REG_D3 + 1)
558#define REG_F7 (REG_F6 + 1)
559#define REG_FE (REG_F7 + 1)
560#define REG_FF (REG_FE + 1)
561#define REG_0F00 (REG_FF + 1)
562#define REG_0F01 (REG_0F00 + 1)
b5b1fc4f
L
563#define REG_0F0D (REG_0F01 + 1)
564#define REG_0F18 (REG_0F0D + 1)
1ceb70f8
L
565#define REG_0F71 (REG_0F18 + 1)
566#define REG_0F72 (REG_0F71 + 1)
567#define REG_0F73 (REG_0F72 + 1)
568#define REG_0FA6 (REG_0F73 + 1)
569#define REG_0FA7 (REG_0FA6 + 1)
570#define REG_0FAE (REG_0FA7 + 1)
571#define REG_0FBA (REG_0FAE + 1)
572#define REG_0FC7 (REG_0FBA + 1)
c0f3af97
L
573#define REG_VEX_71 (REG_0FC7 + 1)
574#define REG_VEX_72 (REG_VEX_71 + 1)
575#define REG_VEX_73 (REG_VEX_72 + 1)
576#define REG_VEX_AE (REG_VEX_73 + 1)
1ceb70f8
L
577
578#define MOD_8D 0
92fddf8e 579#define MOD_0F01_REG_0 (MOD_8D + 1)
1ceb70f8
L
580#define MOD_0F01_REG_1 (MOD_0F01_REG_0 + 1)
581#define MOD_0F01_REG_2 (MOD_0F01_REG_1 + 1)
582#define MOD_0F01_REG_3 (MOD_0F01_REG_2 + 1)
583#define MOD_0F01_REG_7 (MOD_0F01_REG_3 + 1)
92fddf8e
L
584#define MOD_0F12_PREFIX_0 (MOD_0F01_REG_7 + 1)
585#define MOD_0F13 (MOD_0F12_PREFIX_0 + 1)
586#define MOD_0F16_PREFIX_0 (MOD_0F13 + 1)
587#define MOD_0F17 (MOD_0F16_PREFIX_0 + 1)
588#define MOD_0F18_REG_0 (MOD_0F17 + 1)
1ceb70f8
L
589#define MOD_0F18_REG_1 (MOD_0F18_REG_0 + 1)
590#define MOD_0F18_REG_2 (MOD_0F18_REG_1 + 1)
591#define MOD_0F18_REG_3 (MOD_0F18_REG_2 + 1)
92fddf8e
L
592#define MOD_0F20 (MOD_0F18_REG_3 + 1)
593#define MOD_0F21 (MOD_0F20 + 1)
594#define MOD_0F22 (MOD_0F21 + 1)
595#define MOD_0F23 (MOD_0F22 + 1)
596#define MOD_0F24 (MOD_0F23 + 1)
597#define MOD_0F26 (MOD_0F24 + 1)
75c135a8
L
598#define MOD_0F2B_PREFIX_0 (MOD_0F26 + 1)
599#define MOD_0F2B_PREFIX_1 (MOD_0F2B_PREFIX_0 + 1)
600#define MOD_0F2B_PREFIX_2 (MOD_0F2B_PREFIX_1 + 1)
601#define MOD_0F2B_PREFIX_3 (MOD_0F2B_PREFIX_2 + 1)
602#define MOD_0F51 (MOD_0F2B_PREFIX_3 + 1)
603#define MOD_0F71_REG_2 (MOD_0F51 + 1)
1ceb70f8
L
604#define MOD_0F71_REG_4 (MOD_0F71_REG_2 + 1)
605#define MOD_0F71_REG_6 (MOD_0F71_REG_4 + 1)
606#define MOD_0F72_REG_2 (MOD_0F71_REG_6 + 1)
607#define MOD_0F72_REG_4 (MOD_0F72_REG_2 + 1)
608#define MOD_0F72_REG_6 (MOD_0F72_REG_4 + 1)
609#define MOD_0F73_REG_2 (MOD_0F72_REG_6 + 1)
610#define MOD_0F73_REG_3 (MOD_0F73_REG_2 + 1)
611#define MOD_0F73_REG_6 (MOD_0F73_REG_3 + 1)
612#define MOD_0F73_REG_7 (MOD_0F73_REG_6 + 1)
613#define MOD_0FAE_REG_0 (MOD_0F73_REG_7 + 1)
614#define MOD_0FAE_REG_1 (MOD_0FAE_REG_0 + 1)
615#define MOD_0FAE_REG_2 (MOD_0FAE_REG_1 + 1)
616#define MOD_0FAE_REG_3 (MOD_0FAE_REG_2 + 1)
475a2301
L
617#define MOD_0FAE_REG_4 (MOD_0FAE_REG_3 + 1)
618#define MOD_0FAE_REG_5 (MOD_0FAE_REG_4 + 1)
1ceb70f8
L
619#define MOD_0FAE_REG_6 (MOD_0FAE_REG_5 + 1)
620#define MOD_0FAE_REG_7 (MOD_0FAE_REG_6 + 1)
92fddf8e
L
621#define MOD_0FB2 (MOD_0FAE_REG_7 + 1)
622#define MOD_0FB4 (MOD_0FB2 + 1)
623#define MOD_0FB5 (MOD_0FB4 + 1)
624#define MOD_0FC7_REG_6 (MOD_0FB5 + 1)
1ceb70f8 625#define MOD_0FC7_REG_7 (MOD_0FC7_REG_6 + 1)
75c135a8
L
626#define MOD_0FD7 (MOD_0FC7_REG_7 + 1)
627#define MOD_0FE7_PREFIX_2 (MOD_0FD7 + 1)
628#define MOD_0FF0_PREFIX_3 (MOD_0FE7_PREFIX_2 + 1)
629#define MOD_0F382A_PREFIX_2 (MOD_0FF0_PREFIX_3 + 1)
630#define MOD_62_32BIT (MOD_0F382A_PREFIX_2 + 1)
1ceb70f8
L
631#define MOD_C4_32BIT (MOD_62_32BIT + 1)
632#define MOD_C5_32BIT (MOD_C4_32BIT + 1)
c0f3af97
L
633#define MOD_VEX_12_PREFIX_0 (MOD_C5_32BIT + 1)
634#define MOD_VEX_13 (MOD_VEX_12_PREFIX_0 + 1)
635#define MOD_VEX_16_PREFIX_0 (MOD_VEX_13 + 1)
636#define MOD_VEX_17 (MOD_VEX_16_PREFIX_0 + 1)
637#define MOD_VEX_2B (MOD_VEX_17 + 1)
638#define MOD_VEX_51 (MOD_VEX_2B + 1)
639#define MOD_VEX_71_REG_2 (MOD_VEX_51 + 1)
640#define MOD_VEX_71_REG_4 (MOD_VEX_71_REG_2 + 1)
641#define MOD_VEX_71_REG_6 (MOD_VEX_71_REG_4 + 1)
642#define MOD_VEX_72_REG_2 (MOD_VEX_71_REG_6 + 1)
643#define MOD_VEX_72_REG_4 (MOD_VEX_72_REG_2 + 1)
644#define MOD_VEX_72_REG_6 (MOD_VEX_72_REG_4 + 1)
645#define MOD_VEX_73_REG_2 (MOD_VEX_72_REG_6 + 1)
646#define MOD_VEX_73_REG_3 (MOD_VEX_73_REG_2 + 1)
647#define MOD_VEX_73_REG_6 (MOD_VEX_73_REG_3 + 1)
648#define MOD_VEX_73_REG_7 (MOD_VEX_73_REG_6 + 1)
649#define MOD_VEX_AE_REG_2 (MOD_VEX_73_REG_7 + 1)
650#define MOD_VEX_AE_REG_3 (MOD_VEX_AE_REG_2 + 1)
651#define MOD_VEX_D7_PREFIX_2 (MOD_VEX_AE_REG_3 + 1)
652#define MOD_VEX_E7_PREFIX_2 (MOD_VEX_D7_PREFIX_2 + 1)
653#define MOD_VEX_F0_PREFIX_3 (MOD_VEX_E7_PREFIX_2 + 1)
654#define MOD_VEX_3818_PREFIX_2 (MOD_VEX_F0_PREFIX_3 + 1)
655#define MOD_VEX_3819_PREFIX_2 (MOD_VEX_3818_PREFIX_2 + 1)
656#define MOD_VEX_381A_PREFIX_2 (MOD_VEX_3819_PREFIX_2 + 1)
657#define MOD_VEX_382A_PREFIX_2 (MOD_VEX_381A_PREFIX_2 + 1)
658#define MOD_VEX_382C_PREFIX_2 (MOD_VEX_382A_PREFIX_2 + 1)
659#define MOD_VEX_382D_PREFIX_2 (MOD_VEX_382C_PREFIX_2 + 1)
660#define MOD_VEX_382E_PREFIX_2 (MOD_VEX_382D_PREFIX_2 + 1)
661#define MOD_VEX_382F_PREFIX_2 (MOD_VEX_382E_PREFIX_2 + 1)
1ceb70f8
L
662
663#define RM_0F01_REG_0 0
664#define RM_0F01_REG_1 (RM_0F01_REG_0 + 1)
475a2301
L
665#define RM_0F01_REG_2 (RM_0F01_REG_1 + 1)
666#define RM_0F01_REG_3 (RM_0F01_REG_2 + 1)
1ceb70f8
L
667#define RM_0F01_REG_7 (RM_0F01_REG_3 + 1)
668#define RM_0FAE_REG_5 (RM_0F01_REG_7 + 1)
669#define RM_0FAE_REG_6 (RM_0FAE_REG_5 + 1)
670#define RM_0FAE_REG_7 (RM_0FAE_REG_6 + 1)
671
672#define PREFIX_90 0
673#define PREFIX_0F10 (PREFIX_90 + 1)
674#define PREFIX_0F11 (PREFIX_0F10 + 1)
675#define PREFIX_0F12 (PREFIX_0F11 + 1)
676#define PREFIX_0F16 (PREFIX_0F12 + 1)
677#define PREFIX_0F2A (PREFIX_0F16 + 1)
678#define PREFIX_0F2B (PREFIX_0F2A + 1)
679#define PREFIX_0F2C (PREFIX_0F2B + 1)
680#define PREFIX_0F2D (PREFIX_0F2C + 1)
681#define PREFIX_0F2E (PREFIX_0F2D + 1)
682#define PREFIX_0F2F (PREFIX_0F2E + 1)
683#define PREFIX_0F51 (PREFIX_0F2F + 1)
684#define PREFIX_0F52 (PREFIX_0F51 + 1)
685#define PREFIX_0F53 (PREFIX_0F52 + 1)
686#define PREFIX_0F58 (PREFIX_0F53 + 1)
687#define PREFIX_0F59 (PREFIX_0F58 + 1)
688#define PREFIX_0F5A (PREFIX_0F59 + 1)
689#define PREFIX_0F5B (PREFIX_0F5A + 1)
690#define PREFIX_0F5C (PREFIX_0F5B + 1)
691#define PREFIX_0F5D (PREFIX_0F5C + 1)
692#define PREFIX_0F5E (PREFIX_0F5D + 1)
693#define PREFIX_0F5F (PREFIX_0F5E + 1)
694#define PREFIX_0F60 (PREFIX_0F5F + 1)
695#define PREFIX_0F61 (PREFIX_0F60 + 1)
696#define PREFIX_0F62 (PREFIX_0F61 + 1)
697#define PREFIX_0F6C (PREFIX_0F62 + 1)
698#define PREFIX_0F6D (PREFIX_0F6C + 1)
699#define PREFIX_0F6F (PREFIX_0F6D + 1)
700#define PREFIX_0F70 (PREFIX_0F6F + 1)
92fddf8e
L
701#define PREFIX_0F73_REG_3 (PREFIX_0F70 + 1)
702#define PREFIX_0F73_REG_7 (PREFIX_0F73_REG_3 + 1)
703#define PREFIX_0F78 (PREFIX_0F73_REG_7 + 1)
1ceb70f8
L
704#define PREFIX_0F79 (PREFIX_0F78 + 1)
705#define PREFIX_0F7C (PREFIX_0F79 + 1)
706#define PREFIX_0F7D (PREFIX_0F7C + 1)
707#define PREFIX_0F7E (PREFIX_0F7D + 1)
708#define PREFIX_0F7F (PREFIX_0F7E + 1)
709#define PREFIX_0FB8 (PREFIX_0F7F + 1)
710#define PREFIX_0FBD (PREFIX_0FB8 + 1)
711#define PREFIX_0FC2 (PREFIX_0FBD + 1)
4ee52178
L
712#define PREFIX_0FC3 (PREFIX_0FC2 + 1)
713#define PREFIX_0FC7_REG_6 (PREFIX_0FC3 + 1)
92fddf8e 714#define PREFIX_0FD0 (PREFIX_0FC7_REG_6 + 1)
1ceb70f8
L
715#define PREFIX_0FD6 (PREFIX_0FD0 + 1)
716#define PREFIX_0FE6 (PREFIX_0FD6 + 1)
717#define PREFIX_0FE7 (PREFIX_0FE6 + 1)
718#define PREFIX_0FF0 (PREFIX_0FE7 + 1)
719#define PREFIX_0FF7 (PREFIX_0FF0 + 1)
720#define PREFIX_0F3810 (PREFIX_0FF7 + 1)
721#define PREFIX_0F3814 (PREFIX_0F3810 + 1)
722#define PREFIX_0F3815 (PREFIX_0F3814 + 1)
723#define PREFIX_0F3817 (PREFIX_0F3815 + 1)
724#define PREFIX_0F3820 (PREFIX_0F3817 + 1)
725#define PREFIX_0F3821 (PREFIX_0F3820 + 1)
726#define PREFIX_0F3822 (PREFIX_0F3821 + 1)
727#define PREFIX_0F3823 (PREFIX_0F3822 + 1)
728#define PREFIX_0F3824 (PREFIX_0F3823 + 1)
729#define PREFIX_0F3825 (PREFIX_0F3824 + 1)
730#define PREFIX_0F3828 (PREFIX_0F3825 + 1)
731#define PREFIX_0F3829 (PREFIX_0F3828 + 1)
732#define PREFIX_0F382A (PREFIX_0F3829 + 1)
733#define PREFIX_0F382B (PREFIX_0F382A + 1)
734#define PREFIX_0F3830 (PREFIX_0F382B + 1)
735#define PREFIX_0F3831 (PREFIX_0F3830 + 1)
736#define PREFIX_0F3832 (PREFIX_0F3831 + 1)
737#define PREFIX_0F3833 (PREFIX_0F3832 + 1)
738#define PREFIX_0F3834 (PREFIX_0F3833 + 1)
739#define PREFIX_0F3835 (PREFIX_0F3834 + 1)
740#define PREFIX_0F3837 (PREFIX_0F3835 + 1)
741#define PREFIX_0F3838 (PREFIX_0F3837 + 1)
742#define PREFIX_0F3839 (PREFIX_0F3838 + 1)
743#define PREFIX_0F383A (PREFIX_0F3839 + 1)
744#define PREFIX_0F383B (PREFIX_0F383A + 1)
745#define PREFIX_0F383C (PREFIX_0F383B + 1)
746#define PREFIX_0F383D (PREFIX_0F383C + 1)
747#define PREFIX_0F383E (PREFIX_0F383D + 1)
748#define PREFIX_0F383F (PREFIX_0F383E + 1)
749#define PREFIX_0F3840 (PREFIX_0F383F + 1)
750#define PREFIX_0F3841 (PREFIX_0F3840 + 1)
f1f8f695
L
751#define PREFIX_0F3880 (PREFIX_0F3841 + 1)
752#define PREFIX_0F3881 (PREFIX_0F3880 + 1)
753#define PREFIX_0F38DB (PREFIX_0F3881 + 1)
c0f3af97
L
754#define PREFIX_0F38DC (PREFIX_0F38DB + 1)
755#define PREFIX_0F38DD (PREFIX_0F38DC + 1)
756#define PREFIX_0F38DE (PREFIX_0F38DD + 1)
757#define PREFIX_0F38DF (PREFIX_0F38DE + 1)
758#define PREFIX_0F38F0 (PREFIX_0F38DF + 1)
1ceb70f8
L
759#define PREFIX_0F38F1 (PREFIX_0F38F0 + 1)
760#define PREFIX_0F3A08 (PREFIX_0F38F1 + 1)
761#define PREFIX_0F3A09 (PREFIX_0F3A08 + 1)
762#define PREFIX_0F3A0A (PREFIX_0F3A09 + 1)
763#define PREFIX_0F3A0B (PREFIX_0F3A0A + 1)
764#define PREFIX_0F3A0C (PREFIX_0F3A0B + 1)
765#define PREFIX_0F3A0D (PREFIX_0F3A0C + 1)
766#define PREFIX_0F3A0E (PREFIX_0F3A0D + 1)
767#define PREFIX_0F3A14 (PREFIX_0F3A0E + 1)
768#define PREFIX_0F3A15 (PREFIX_0F3A14 + 1)
769#define PREFIX_0F3A16 (PREFIX_0F3A15 + 1)
770#define PREFIX_0F3A17 (PREFIX_0F3A16 + 1)
771#define PREFIX_0F3A20 (PREFIX_0F3A17 + 1)
772#define PREFIX_0F3A21 (PREFIX_0F3A20 + 1)
773#define PREFIX_0F3A22 (PREFIX_0F3A21 + 1)
774#define PREFIX_0F3A40 (PREFIX_0F3A22 + 1)
775#define PREFIX_0F3A41 (PREFIX_0F3A40 + 1)
776#define PREFIX_0F3A42 (PREFIX_0F3A41 + 1)
c0f3af97
L
777#define PREFIX_0F3A44 (PREFIX_0F3A42 + 1)
778#define PREFIX_0F3A60 (PREFIX_0F3A44 + 1)
1ceb70f8
L
779#define PREFIX_0F3A61 (PREFIX_0F3A60 + 1)
780#define PREFIX_0F3A62 (PREFIX_0F3A61 + 1)
781#define PREFIX_0F3A63 (PREFIX_0F3A62 + 1)
c0f3af97
L
782#define PREFIX_0F3ADF (PREFIX_0F3A63 + 1)
783#define PREFIX_VEX_10 (PREFIX_0F3ADF + 1)
784#define PREFIX_VEX_11 (PREFIX_VEX_10 + 1)
785#define PREFIX_VEX_12 (PREFIX_VEX_11 + 1)
786#define PREFIX_VEX_16 (PREFIX_VEX_12 + 1)
787#define PREFIX_VEX_2A (PREFIX_VEX_16 + 1)
788#define PREFIX_VEX_2C (PREFIX_VEX_2A + 1)
789#define PREFIX_VEX_2D (PREFIX_VEX_2C + 1)
790#define PREFIX_VEX_2E (PREFIX_VEX_2D + 1)
791#define PREFIX_VEX_2F (PREFIX_VEX_2E + 1)
792#define PREFIX_VEX_51 (PREFIX_VEX_2F + 1)
793#define PREFIX_VEX_52 (PREFIX_VEX_51 + 1)
794#define PREFIX_VEX_53 (PREFIX_VEX_52 + 1)
795#define PREFIX_VEX_58 (PREFIX_VEX_53 + 1)
796#define PREFIX_VEX_59 (PREFIX_VEX_58 + 1)
797#define PREFIX_VEX_5A (PREFIX_VEX_59 + 1)
798#define PREFIX_VEX_5B (PREFIX_VEX_5A + 1)
799#define PREFIX_VEX_5C (PREFIX_VEX_5B + 1)
800#define PREFIX_VEX_5D (PREFIX_VEX_5C + 1)
801#define PREFIX_VEX_5E (PREFIX_VEX_5D + 1)
802#define PREFIX_VEX_5F (PREFIX_VEX_5E + 1)
803#define PREFIX_VEX_60 (PREFIX_VEX_5F + 1)
804#define PREFIX_VEX_61 (PREFIX_VEX_60 + 1)
805#define PREFIX_VEX_62 (PREFIX_VEX_61 + 1)
806#define PREFIX_VEX_63 (PREFIX_VEX_62 + 1)
807#define PREFIX_VEX_64 (PREFIX_VEX_63 + 1)
808#define PREFIX_VEX_65 (PREFIX_VEX_64 + 1)
809#define PREFIX_VEX_66 (PREFIX_VEX_65 + 1)
810#define PREFIX_VEX_67 (PREFIX_VEX_66 + 1)
811#define PREFIX_VEX_68 (PREFIX_VEX_67 + 1)
812#define PREFIX_VEX_69 (PREFIX_VEX_68 + 1)
813#define PREFIX_VEX_6A (PREFIX_VEX_69 + 1)
814#define PREFIX_VEX_6B (PREFIX_VEX_6A + 1)
815#define PREFIX_VEX_6C (PREFIX_VEX_6B + 1)
816#define PREFIX_VEX_6D (PREFIX_VEX_6C + 1)
817#define PREFIX_VEX_6E (PREFIX_VEX_6D + 1)
818#define PREFIX_VEX_6F (PREFIX_VEX_6E + 1)
819#define PREFIX_VEX_70 (PREFIX_VEX_6F + 1)
820#define PREFIX_VEX_71_REG_2 (PREFIX_VEX_70 + 1)
821#define PREFIX_VEX_71_REG_4 (PREFIX_VEX_71_REG_2 + 1)
822#define PREFIX_VEX_71_REG_6 (PREFIX_VEX_71_REG_4 + 1)
823#define PREFIX_VEX_72_REG_2 (PREFIX_VEX_71_REG_6 + 1)
824#define PREFIX_VEX_72_REG_4 (PREFIX_VEX_72_REG_2 + 1)
825#define PREFIX_VEX_72_REG_6 (PREFIX_VEX_72_REG_4 + 1)
826#define PREFIX_VEX_73_REG_2 (PREFIX_VEX_72_REG_6 + 1)
827#define PREFIX_VEX_73_REG_3 (PREFIX_VEX_73_REG_2 + 1)
828#define PREFIX_VEX_73_REG_6 (PREFIX_VEX_73_REG_3 + 1)
829#define PREFIX_VEX_73_REG_7 (PREFIX_VEX_73_REG_6 + 1)
830#define PREFIX_VEX_74 (PREFIX_VEX_73_REG_7 + 1)
831#define PREFIX_VEX_75 (PREFIX_VEX_74 + 1)
832#define PREFIX_VEX_76 (PREFIX_VEX_75 + 1)
833#define PREFIX_VEX_77 (PREFIX_VEX_76 + 1)
834#define PREFIX_VEX_7C (PREFIX_VEX_77 + 1)
835#define PREFIX_VEX_7D (PREFIX_VEX_7C + 1)
836#define PREFIX_VEX_7E (PREFIX_VEX_7D + 1)
837#define PREFIX_VEX_7F (PREFIX_VEX_7E + 1)
838#define PREFIX_VEX_C2 (PREFIX_VEX_7F + 1)
839#define PREFIX_VEX_C4 (PREFIX_VEX_C2 + 1)
840#define PREFIX_VEX_C5 (PREFIX_VEX_C4 + 1)
841#define PREFIX_VEX_D0 (PREFIX_VEX_C5 + 1)
842#define PREFIX_VEX_D1 (PREFIX_VEX_D0 + 1)
843#define PREFIX_VEX_D2 (PREFIX_VEX_D1 + 1)
844#define PREFIX_VEX_D3 (PREFIX_VEX_D2 + 1)
845#define PREFIX_VEX_D4 (PREFIX_VEX_D3 + 1)
846#define PREFIX_VEX_D5 (PREFIX_VEX_D4 + 1)
847#define PREFIX_VEX_D6 (PREFIX_VEX_D5 + 1)
848#define PREFIX_VEX_D7 (PREFIX_VEX_D6 + 1)
849#define PREFIX_VEX_D8 (PREFIX_VEX_D7 + 1)
850#define PREFIX_VEX_D9 (PREFIX_VEX_D8 + 1)
851#define PREFIX_VEX_DA (PREFIX_VEX_D9 + 1)
852#define PREFIX_VEX_DB (PREFIX_VEX_DA + 1)
853#define PREFIX_VEX_DC (PREFIX_VEX_DB + 1)
854#define PREFIX_VEX_DD (PREFIX_VEX_DC + 1)
855#define PREFIX_VEX_DE (PREFIX_VEX_DD + 1)
856#define PREFIX_VEX_DF (PREFIX_VEX_DE + 1)
857#define PREFIX_VEX_E0 (PREFIX_VEX_DF + 1)
858#define PREFIX_VEX_E1 (PREFIX_VEX_E0 + 1)
859#define PREFIX_VEX_E2 (PREFIX_VEX_E1 + 1)
860#define PREFIX_VEX_E3 (PREFIX_VEX_E2 + 1)
861#define PREFIX_VEX_E4 (PREFIX_VEX_E3 + 1)
862#define PREFIX_VEX_E5 (PREFIX_VEX_E4 + 1)
863#define PREFIX_VEX_E6 (PREFIX_VEX_E5 + 1)
864#define PREFIX_VEX_E7 (PREFIX_VEX_E6 + 1)
865#define PREFIX_VEX_E8 (PREFIX_VEX_E7 + 1)
866#define PREFIX_VEX_E9 (PREFIX_VEX_E8 + 1)
867#define PREFIX_VEX_EA (PREFIX_VEX_E9 + 1)
868#define PREFIX_VEX_EB (PREFIX_VEX_EA + 1)
869#define PREFIX_VEX_EC (PREFIX_VEX_EB + 1)
870#define PREFIX_VEX_ED (PREFIX_VEX_EC + 1)
871#define PREFIX_VEX_EE (PREFIX_VEX_ED + 1)
872#define PREFIX_VEX_EF (PREFIX_VEX_EE + 1)
873#define PREFIX_VEX_F0 (PREFIX_VEX_EF + 1)
874#define PREFIX_VEX_F1 (PREFIX_VEX_F0 + 1)
875#define PREFIX_VEX_F2 (PREFIX_VEX_F1 + 1)
876#define PREFIX_VEX_F3 (PREFIX_VEX_F2 + 1)
877#define PREFIX_VEX_F4 (PREFIX_VEX_F3 + 1)
878#define PREFIX_VEX_F5 (PREFIX_VEX_F4 + 1)
879#define PREFIX_VEX_F6 (PREFIX_VEX_F5 + 1)
880#define PREFIX_VEX_F7 (PREFIX_VEX_F6 + 1)
881#define PREFIX_VEX_F8 (PREFIX_VEX_F7 + 1)
882#define PREFIX_VEX_F9 (PREFIX_VEX_F8 + 1)
883#define PREFIX_VEX_FA (PREFIX_VEX_F9 + 1)
884#define PREFIX_VEX_FB (PREFIX_VEX_FA + 1)
885#define PREFIX_VEX_FC (PREFIX_VEX_FB + 1)
886#define PREFIX_VEX_FD (PREFIX_VEX_FC + 1)
887#define PREFIX_VEX_FE (PREFIX_VEX_FD + 1)
06c8514a
L
888#define PREFIX_VEX_3800 (PREFIX_VEX_FE + 1)
889#define PREFIX_VEX_3801 (PREFIX_VEX_3800 + 1)
890#define PREFIX_VEX_3802 (PREFIX_VEX_3801 + 1)
891#define PREFIX_VEX_3803 (PREFIX_VEX_3802 + 1)
892#define PREFIX_VEX_3804 (PREFIX_VEX_3803 + 1)
893#define PREFIX_VEX_3805 (PREFIX_VEX_3804 + 1)
894#define PREFIX_VEX_3806 (PREFIX_VEX_3805 + 1)
895#define PREFIX_VEX_3807 (PREFIX_VEX_3806 + 1)
896#define PREFIX_VEX_3808 (PREFIX_VEX_3807 + 1)
897#define PREFIX_VEX_3809 (PREFIX_VEX_3808 + 1)
898#define PREFIX_VEX_380A (PREFIX_VEX_3809 + 1)
899#define PREFIX_VEX_380B (PREFIX_VEX_380A + 1)
900#define PREFIX_VEX_380C (PREFIX_VEX_380B + 1)
901#define PREFIX_VEX_380D (PREFIX_VEX_380C + 1)
902#define PREFIX_VEX_380E (PREFIX_VEX_380D + 1)
903#define PREFIX_VEX_380F (PREFIX_VEX_380E + 1)
904#define PREFIX_VEX_3817 (PREFIX_VEX_380F + 1)
905#define PREFIX_VEX_3818 (PREFIX_VEX_3817 + 1)
906#define PREFIX_VEX_3819 (PREFIX_VEX_3818 + 1)
907#define PREFIX_VEX_381A (PREFIX_VEX_3819 + 1)
908#define PREFIX_VEX_381C (PREFIX_VEX_381A + 1)
909#define PREFIX_VEX_381D (PREFIX_VEX_381C + 1)
910#define PREFIX_VEX_381E (PREFIX_VEX_381D + 1)
911#define PREFIX_VEX_3820 (PREFIX_VEX_381E + 1)
912#define PREFIX_VEX_3821 (PREFIX_VEX_3820 + 1)
913#define PREFIX_VEX_3822 (PREFIX_VEX_3821 + 1)
914#define PREFIX_VEX_3823 (PREFIX_VEX_3822 + 1)
915#define PREFIX_VEX_3824 (PREFIX_VEX_3823 + 1)
916#define PREFIX_VEX_3825 (PREFIX_VEX_3824 + 1)
917#define PREFIX_VEX_3828 (PREFIX_VEX_3825 + 1)
918#define PREFIX_VEX_3829 (PREFIX_VEX_3828 + 1)
919#define PREFIX_VEX_382A (PREFIX_VEX_3829 + 1)
920#define PREFIX_VEX_382B (PREFIX_VEX_382A + 1)
921#define PREFIX_VEX_382C (PREFIX_VEX_382B + 1)
922#define PREFIX_VEX_382D (PREFIX_VEX_382C + 1)
923#define PREFIX_VEX_382E (PREFIX_VEX_382D + 1)
924#define PREFIX_VEX_382F (PREFIX_VEX_382E + 1)
925#define PREFIX_VEX_3830 (PREFIX_VEX_382F + 1)
926#define PREFIX_VEX_3831 (PREFIX_VEX_3830 + 1)
927#define PREFIX_VEX_3832 (PREFIX_VEX_3831 + 1)
928#define PREFIX_VEX_3833 (PREFIX_VEX_3832 + 1)
929#define PREFIX_VEX_3834 (PREFIX_VEX_3833 + 1)
930#define PREFIX_VEX_3835 (PREFIX_VEX_3834 + 1)
931#define PREFIX_VEX_3837 (PREFIX_VEX_3835 + 1)
932#define PREFIX_VEX_3838 (PREFIX_VEX_3837 + 1)
933#define PREFIX_VEX_3839 (PREFIX_VEX_3838 + 1)
934#define PREFIX_VEX_383A (PREFIX_VEX_3839 + 1)
935#define PREFIX_VEX_383B (PREFIX_VEX_383A + 1)
936#define PREFIX_VEX_383C (PREFIX_VEX_383B + 1)
937#define PREFIX_VEX_383D (PREFIX_VEX_383C + 1)
938#define PREFIX_VEX_383E (PREFIX_VEX_383D + 1)
939#define PREFIX_VEX_383F (PREFIX_VEX_383E + 1)
940#define PREFIX_VEX_3840 (PREFIX_VEX_383F + 1)
941#define PREFIX_VEX_3841 (PREFIX_VEX_3840 + 1)
a5ff0eb2
L
942#define PREFIX_VEX_38DB (PREFIX_VEX_3841 + 1)
943#define PREFIX_VEX_38DC (PREFIX_VEX_38DB + 1)
944#define PREFIX_VEX_38DD (PREFIX_VEX_38DC + 1)
945#define PREFIX_VEX_38DE (PREFIX_VEX_38DD + 1)
946#define PREFIX_VEX_38DF (PREFIX_VEX_38DE + 1)
947#define PREFIX_VEX_3A04 (PREFIX_VEX_38DF + 1)
06c8514a
L
948#define PREFIX_VEX_3A05 (PREFIX_VEX_3A04 + 1)
949#define PREFIX_VEX_3A06 (PREFIX_VEX_3A05 + 1)
950#define PREFIX_VEX_3A08 (PREFIX_VEX_3A06 + 1)
951#define PREFIX_VEX_3A09 (PREFIX_VEX_3A08 + 1)
952#define PREFIX_VEX_3A0A (PREFIX_VEX_3A09 + 1)
953#define PREFIX_VEX_3A0B (PREFIX_VEX_3A0A + 1)
954#define PREFIX_VEX_3A0C (PREFIX_VEX_3A0B + 1)
955#define PREFIX_VEX_3A0D (PREFIX_VEX_3A0C + 1)
956#define PREFIX_VEX_3A0E (PREFIX_VEX_3A0D + 1)
957#define PREFIX_VEX_3A0F (PREFIX_VEX_3A0E + 1)
958#define PREFIX_VEX_3A14 (PREFIX_VEX_3A0F + 1)
959#define PREFIX_VEX_3A15 (PREFIX_VEX_3A14 + 1)
960#define PREFIX_VEX_3A16 (PREFIX_VEX_3A15 + 1)
961#define PREFIX_VEX_3A17 (PREFIX_VEX_3A16 + 1)
962#define PREFIX_VEX_3A18 (PREFIX_VEX_3A17 + 1)
963#define PREFIX_VEX_3A19 (PREFIX_VEX_3A18 + 1)
964#define PREFIX_VEX_3A20 (PREFIX_VEX_3A19 + 1)
965#define PREFIX_VEX_3A21 (PREFIX_VEX_3A20 + 1)
966#define PREFIX_VEX_3A22 (PREFIX_VEX_3A21 + 1)
967#define PREFIX_VEX_3A40 (PREFIX_VEX_3A22 + 1)
968#define PREFIX_VEX_3A41 (PREFIX_VEX_3A40 + 1)
969#define PREFIX_VEX_3A42 (PREFIX_VEX_3A41 + 1)
970#define PREFIX_VEX_3A48 (PREFIX_VEX_3A42 + 1)
971#define PREFIX_VEX_3A49 (PREFIX_VEX_3A48 + 1)
972#define PREFIX_VEX_3A4A (PREFIX_VEX_3A49 + 1)
973#define PREFIX_VEX_3A4B (PREFIX_VEX_3A4A + 1)
974#define PREFIX_VEX_3A4C (PREFIX_VEX_3A4B + 1)
975#define PREFIX_VEX_3A5C (PREFIX_VEX_3A4C + 1)
976#define PREFIX_VEX_3A5D (PREFIX_VEX_3A5C + 1)
977#define PREFIX_VEX_3A5E (PREFIX_VEX_3A5D + 1)
978#define PREFIX_VEX_3A5F (PREFIX_VEX_3A5E + 1)
979#define PREFIX_VEX_3A60 (PREFIX_VEX_3A5F + 1)
980#define PREFIX_VEX_3A61 (PREFIX_VEX_3A60 + 1)
981#define PREFIX_VEX_3A62 (PREFIX_VEX_3A61 + 1)
982#define PREFIX_VEX_3A63 (PREFIX_VEX_3A62 + 1)
983#define PREFIX_VEX_3A68 (PREFIX_VEX_3A63 + 1)
984#define PREFIX_VEX_3A69 (PREFIX_VEX_3A68 + 1)
985#define PREFIX_VEX_3A6A (PREFIX_VEX_3A69 + 1)
986#define PREFIX_VEX_3A6B (PREFIX_VEX_3A6A + 1)
987#define PREFIX_VEX_3A6C (PREFIX_VEX_3A6B + 1)
988#define PREFIX_VEX_3A6D (PREFIX_VEX_3A6C + 1)
989#define PREFIX_VEX_3A6E (PREFIX_VEX_3A6D + 1)
990#define PREFIX_VEX_3A6F (PREFIX_VEX_3A6E + 1)
991#define PREFIX_VEX_3A78 (PREFIX_VEX_3A6F + 1)
992#define PREFIX_VEX_3A79 (PREFIX_VEX_3A78 + 1)
993#define PREFIX_VEX_3A7A (PREFIX_VEX_3A79 + 1)
994#define PREFIX_VEX_3A7B (PREFIX_VEX_3A7A + 1)
995#define PREFIX_VEX_3A7C (PREFIX_VEX_3A7B + 1)
996#define PREFIX_VEX_3A7D (PREFIX_VEX_3A7C + 1)
997#define PREFIX_VEX_3A7E (PREFIX_VEX_3A7D + 1)
998#define PREFIX_VEX_3A7F (PREFIX_VEX_3A7E + 1)
a5ff0eb2 999#define PREFIX_VEX_3ADF (PREFIX_VEX_3A7F + 1)
4e7d34a6
L
1000
1001#define X86_64_06 0
1002#define X86_64_07 (X86_64_06 + 1)
1003#define X86_64_0D (X86_64_07 + 1)
1004#define X86_64_16 (X86_64_0D + 1)
1005#define X86_64_17 (X86_64_16 + 1)
1006#define X86_64_1E (X86_64_17 + 1)
1007#define X86_64_1F (X86_64_1E + 1)
1008#define X86_64_27 (X86_64_1F + 1)
1009#define X86_64_2F (X86_64_27 + 1)
1010#define X86_64_37 (X86_64_2F + 1)
1011#define X86_64_3F (X86_64_37 + 1)
1012#define X86_64_60 (X86_64_3F + 1)
1013#define X86_64_61 (X86_64_60 + 1)
1014#define X86_64_62 (X86_64_61 + 1)
1015#define X86_64_63 (X86_64_62 + 1)
1016#define X86_64_6D (X86_64_63 + 1)
1017#define X86_64_6F (X86_64_6D + 1)
1018#define X86_64_9A (X86_64_6F + 1)
1019#define X86_64_C4 (X86_64_9A + 1)
1020#define X86_64_C5 (X86_64_C4 + 1)
1021#define X86_64_CE (X86_64_C5 + 1)
1022#define X86_64_D4 (X86_64_CE + 1)
1023#define X86_64_D5 (X86_64_D4 + 1)
1024#define X86_64_EA (X86_64_D5 + 1)
1025#define X86_64_0F01_REG_0 (X86_64_EA + 1)
1026#define X86_64_0F01_REG_1 (X86_64_0F01_REG_0 + 1)
1027#define X86_64_0F01_REG_2 (X86_64_0F01_REG_1 + 1)
1028#define X86_64_0F01_REG_3 (X86_64_0F01_REG_2 + 1)
1029
1030#define THREE_BYTE_0F24 0
1031#define THREE_BYTE_0F25 (THREE_BYTE_0F24 + 1)
1032#define THREE_BYTE_0F38 (THREE_BYTE_0F25 + 1)
1033#define THREE_BYTE_0F3A (THREE_BYTE_0F38 + 1)
1034#define THREE_BYTE_0F7A (THREE_BYTE_0F3A + 1)
89b66d55 1035#define THREE_BYTE_0F7B (THREE_BYTE_0F7A + 1)
4e7d34a6 1036
c0f3af97
L
1037#define VEX_0F 0
1038#define VEX_0F38 (VEX_0F + 1)
1039#define VEX_0F3A (VEX_0F38 + 1)
1040
1041#define VEX_LEN_10_P_1 0
1042#define VEX_LEN_10_P_3 (VEX_LEN_10_P_1 + 1)
1043#define VEX_LEN_11_P_1 (VEX_LEN_10_P_3 + 1)
1044#define VEX_LEN_11_P_3 (VEX_LEN_11_P_1 + 1)
1045#define VEX_LEN_12_P_0_M_0 (VEX_LEN_11_P_3 + 1)
1046#define VEX_LEN_12_P_0_M_1 (VEX_LEN_12_P_0_M_0 + 1)
1047#define VEX_LEN_12_P_2 (VEX_LEN_12_P_0_M_1 + 1)
1048#define VEX_LEN_13_M_0 (VEX_LEN_12_P_2 + 1)
1049#define VEX_LEN_16_P_0_M_0 (VEX_LEN_13_M_0 + 1)
1050#define VEX_LEN_16_P_0_M_1 (VEX_LEN_16_P_0_M_0 + 1)
1051#define VEX_LEN_16_P_2 (VEX_LEN_16_P_0_M_1 + 1)
1052#define VEX_LEN_17_M_0 (VEX_LEN_16_P_2 + 1)
1053#define VEX_LEN_2A_P_1 (VEX_LEN_17_M_0 + 1)
1054#define VEX_LEN_2A_P_3 (VEX_LEN_2A_P_1 + 1)
1055#define VEX_LEN_2B_M_0 (VEX_LEN_2A_P_3 + 1)
1056#define VEX_LEN_2C_P_1 (VEX_LEN_2B_M_0 + 1)
1057#define VEX_LEN_2C_P_3 (VEX_LEN_2C_P_1 + 1)
1058#define VEX_LEN_2D_P_1 (VEX_LEN_2C_P_3 + 1)
1059#define VEX_LEN_2D_P_3 (VEX_LEN_2D_P_1 + 1)
1060#define VEX_LEN_2E_P_0 (VEX_LEN_2D_P_3 + 1)
1061#define VEX_LEN_2E_P_2 (VEX_LEN_2E_P_0 + 1)
1062#define VEX_LEN_2F_P_0 (VEX_LEN_2E_P_2 + 1)
1063#define VEX_LEN_2F_P_2 (VEX_LEN_2F_P_0 + 1)
1064#define VEX_LEN_51_P_1 (VEX_LEN_2F_P_2 + 1)
1065#define VEX_LEN_51_P_3 (VEX_LEN_51_P_1 + 1)
1066#define VEX_LEN_52_P_1 (VEX_LEN_51_P_3 + 1)
1067#define VEX_LEN_53_P_1 (VEX_LEN_52_P_1 + 1)
1068#define VEX_LEN_58_P_1 (VEX_LEN_53_P_1 + 1)
1069#define VEX_LEN_58_P_3 (VEX_LEN_58_P_1 + 1)
1070#define VEX_LEN_59_P_1 (VEX_LEN_58_P_3 + 1)
1071#define VEX_LEN_59_P_3 (VEX_LEN_59_P_1 + 1)
1072#define VEX_LEN_5A_P_1 (VEX_LEN_59_P_3 + 1)
1073#define VEX_LEN_5A_P_3 (VEX_LEN_5A_P_1 + 1)
1074#define VEX_LEN_5C_P_1 (VEX_LEN_5A_P_3 + 1)
1075#define VEX_LEN_5C_P_3 (VEX_LEN_5C_P_1 + 1)
1076#define VEX_LEN_5D_P_1 (VEX_LEN_5C_P_3 + 1)
1077#define VEX_LEN_5D_P_3 (VEX_LEN_5D_P_1 + 1)
1078#define VEX_LEN_5E_P_1 (VEX_LEN_5D_P_3 + 1)
1079#define VEX_LEN_5E_P_3 (VEX_LEN_5E_P_1 + 1)
1080#define VEX_LEN_5F_P_1 (VEX_LEN_5E_P_3 + 1)
1081#define VEX_LEN_5F_P_3 (VEX_LEN_5F_P_1 + 1)
1082#define VEX_LEN_60_P_2 (VEX_LEN_5F_P_3 + 1)
1083#define VEX_LEN_61_P_2 (VEX_LEN_60_P_2 + 1)
1084#define VEX_LEN_62_P_2 (VEX_LEN_61_P_2 + 1)
1085#define VEX_LEN_63_P_2 (VEX_LEN_62_P_2 + 1)
1086#define VEX_LEN_64_P_2 (VEX_LEN_63_P_2 + 1)
1087#define VEX_LEN_65_P_2 (VEX_LEN_64_P_2 + 1)
1088#define VEX_LEN_66_P_2 (VEX_LEN_65_P_2 + 1)
1089#define VEX_LEN_67_P_2 (VEX_LEN_66_P_2 + 1)
1090#define VEX_LEN_68_P_2 (VEX_LEN_67_P_2 + 1)
1091#define VEX_LEN_69_P_2 (VEX_LEN_68_P_2 + 1)
1092#define VEX_LEN_6A_P_2 (VEX_LEN_69_P_2 + 1)
1093#define VEX_LEN_6B_P_2 (VEX_LEN_6A_P_2 + 1)
1094#define VEX_LEN_6C_P_2 (VEX_LEN_6B_P_2 + 1)
1095#define VEX_LEN_6D_P_2 (VEX_LEN_6C_P_2 + 1)
1096#define VEX_LEN_6E_P_2 (VEX_LEN_6D_P_2 + 1)
1097#define VEX_LEN_70_P_1 (VEX_LEN_6E_P_2 + 1)
1098#define VEX_LEN_70_P_2 (VEX_LEN_70_P_1 + 1)
1099#define VEX_LEN_70_P_3 (VEX_LEN_70_P_2 + 1)
1100#define VEX_LEN_71_R_2_P_2 (VEX_LEN_70_P_3 + 1)
1101#define VEX_LEN_71_R_4_P_2 (VEX_LEN_71_R_2_P_2 + 1)
1102#define VEX_LEN_71_R_6_P_2 (VEX_LEN_71_R_4_P_2 + 1)
1103#define VEX_LEN_72_R_2_P_2 (VEX_LEN_71_R_6_P_2 + 1)
1104#define VEX_LEN_72_R_4_P_2 (VEX_LEN_72_R_2_P_2 + 1)
1105#define VEX_LEN_72_R_6_P_2 (VEX_LEN_72_R_4_P_2 + 1)
1106#define VEX_LEN_73_R_2_P_2 (VEX_LEN_72_R_6_P_2 + 1)
1107#define VEX_LEN_73_R_3_P_2 (VEX_LEN_73_R_2_P_2 + 1)
1108#define VEX_LEN_73_R_6_P_2 (VEX_LEN_73_R_3_P_2 + 1)
1109#define VEX_LEN_73_R_7_P_2 (VEX_LEN_73_R_6_P_2 + 1)
1110#define VEX_LEN_74_P_2 (VEX_LEN_73_R_7_P_2 + 1)
1111#define VEX_LEN_75_P_2 (VEX_LEN_74_P_2 + 1)
1112#define VEX_LEN_76_P_2 (VEX_LEN_75_P_2 + 1)
1113#define VEX_LEN_7E_P_1 (VEX_LEN_76_P_2 + 1)
1114#define VEX_LEN_7E_P_2 (VEX_LEN_7E_P_1 + 1)
1115#define VEX_LEN_AE_R_2_M_0 (VEX_LEN_7E_P_2 + 1)
1116#define VEX_LEN_AE_R_3_M_0 (VEX_LEN_AE_R_2_M_0 + 1)
1117#define VEX_LEN_C2_P_1 (VEX_LEN_AE_R_3_M_0 + 1)
1118#define VEX_LEN_C2_P_3 (VEX_LEN_C2_P_1 + 1)
1119#define VEX_LEN_C4_P_2 (VEX_LEN_C2_P_3 + 1)
1120#define VEX_LEN_C5_P_2 (VEX_LEN_C4_P_2 + 1)
1121#define VEX_LEN_D1_P_2 (VEX_LEN_C5_P_2 + 1)
1122#define VEX_LEN_D2_P_2 (VEX_LEN_D1_P_2 + 1)
1123#define VEX_LEN_D3_P_2 (VEX_LEN_D2_P_2 + 1)
1124#define VEX_LEN_D4_P_2 (VEX_LEN_D3_P_2 + 1)
1125#define VEX_LEN_D5_P_2 (VEX_LEN_D4_P_2 + 1)
1126#define VEX_LEN_D6_P_2 (VEX_LEN_D5_P_2 + 1)
1127#define VEX_LEN_D7_P_2_M_1 (VEX_LEN_D6_P_2 + 1)
1128#define VEX_LEN_D8_P_2 (VEX_LEN_D7_P_2_M_1 + 1)
1129#define VEX_LEN_D9_P_2 (VEX_LEN_D8_P_2 + 1)
1130#define VEX_LEN_DA_P_2 (VEX_LEN_D9_P_2 + 1)
1131#define VEX_LEN_DB_P_2 (VEX_LEN_DA_P_2 + 1)
1132#define VEX_LEN_DC_P_2 (VEX_LEN_DB_P_2 + 1)
1133#define VEX_LEN_DD_P_2 (VEX_LEN_DC_P_2 + 1)
1134#define VEX_LEN_DE_P_2 (VEX_LEN_DD_P_2 + 1)
1135#define VEX_LEN_DF_P_2 (VEX_LEN_DE_P_2 + 1)
1136#define VEX_LEN_E0_P_2 (VEX_LEN_DF_P_2 + 1)
1137#define VEX_LEN_E1_P_2 (VEX_LEN_E0_P_2 + 1)
1138#define VEX_LEN_E2_P_2 (VEX_LEN_E1_P_2 + 1)
1139#define VEX_LEN_E3_P_2 (VEX_LEN_E2_P_2 + 1)
1140#define VEX_LEN_E4_P_2 (VEX_LEN_E3_P_2 + 1)
1141#define VEX_LEN_E5_P_2 (VEX_LEN_E4_P_2 + 1)
1142#define VEX_LEN_E7_P_2_M_0 (VEX_LEN_E5_P_2 + 1)
1143#define VEX_LEN_E8_P_2 (VEX_LEN_E7_P_2_M_0 + 1)
1144#define VEX_LEN_E9_P_2 (VEX_LEN_E8_P_2 + 1)
1145#define VEX_LEN_EA_P_2 (VEX_LEN_E9_P_2 + 1)
1146#define VEX_LEN_EB_P_2 (VEX_LEN_EA_P_2 + 1)
1147#define VEX_LEN_EC_P_2 (VEX_LEN_EB_P_2 + 1)
1148#define VEX_LEN_ED_P_2 (VEX_LEN_EC_P_2 + 1)
1149#define VEX_LEN_EE_P_2 (VEX_LEN_ED_P_2 + 1)
1150#define VEX_LEN_EF_P_2 (VEX_LEN_EE_P_2 + 1)
1151#define VEX_LEN_F1_P_2 (VEX_LEN_EF_P_2 + 1)
1152#define VEX_LEN_F2_P_2 (VEX_LEN_F1_P_2 + 1)
1153#define VEX_LEN_F3_P_2 (VEX_LEN_F2_P_2 + 1)
1154#define VEX_LEN_F4_P_2 (VEX_LEN_F3_P_2 + 1)
1155#define VEX_LEN_F5_P_2 (VEX_LEN_F4_P_2 + 1)
1156#define VEX_LEN_F6_P_2 (VEX_LEN_F5_P_2 + 1)
1157#define VEX_LEN_F7_P_2 (VEX_LEN_F6_P_2 + 1)
1158#define VEX_LEN_F8_P_2 (VEX_LEN_F7_P_2 + 1)
1159#define VEX_LEN_F9_P_2 (VEX_LEN_F8_P_2 + 1)
1160#define VEX_LEN_FA_P_2 (VEX_LEN_F9_P_2 + 1)
1161#define VEX_LEN_FB_P_2 (VEX_LEN_FA_P_2 + 1)
1162#define VEX_LEN_FC_P_2 (VEX_LEN_FB_P_2 + 1)
1163#define VEX_LEN_FD_P_2 (VEX_LEN_FC_P_2 + 1)
1164#define VEX_LEN_FE_P_2 (VEX_LEN_FD_P_2 + 1)
1165#define VEX_LEN_3800_P_2 (VEX_LEN_FE_P_2 + 1)
1166#define VEX_LEN_3801_P_2 (VEX_LEN_3800_P_2 + 1)
1167#define VEX_LEN_3802_P_2 (VEX_LEN_3801_P_2 + 1)
1168#define VEX_LEN_3803_P_2 (VEX_LEN_3802_P_2 + 1)
1169#define VEX_LEN_3804_P_2 (VEX_LEN_3803_P_2 + 1)
1170#define VEX_LEN_3805_P_2 (VEX_LEN_3804_P_2 + 1)
1171#define VEX_LEN_3806_P_2 (VEX_LEN_3805_P_2 + 1)
1172#define VEX_LEN_3807_P_2 (VEX_LEN_3806_P_2 + 1)
1173#define VEX_LEN_3808_P_2 (VEX_LEN_3807_P_2 + 1)
1174#define VEX_LEN_3809_P_2 (VEX_LEN_3808_P_2 + 1)
1175#define VEX_LEN_380A_P_2 (VEX_LEN_3809_P_2 + 1)
1176#define VEX_LEN_380B_P_2 (VEX_LEN_380A_P_2 + 1)
1177#define VEX_LEN_3819_P_2_M_0 (VEX_LEN_380B_P_2 + 1)
1178#define VEX_LEN_381A_P_2_M_0 (VEX_LEN_3819_P_2_M_0 + 1)
1179#define VEX_LEN_381C_P_2 (VEX_LEN_381A_P_2_M_0 + 1)
1180#define VEX_LEN_381D_P_2 (VEX_LEN_381C_P_2 + 1)
1181#define VEX_LEN_381E_P_2 (VEX_LEN_381D_P_2 + 1)
1182#define VEX_LEN_3820_P_2 (VEX_LEN_381E_P_2 + 1)
1183#define VEX_LEN_3821_P_2 (VEX_LEN_3820_P_2 + 1)
1184#define VEX_LEN_3822_P_2 (VEX_LEN_3821_P_2 + 1)
1185#define VEX_LEN_3823_P_2 (VEX_LEN_3822_P_2 + 1)
1186#define VEX_LEN_3824_P_2 (VEX_LEN_3823_P_2 + 1)
1187#define VEX_LEN_3825_P_2 (VEX_LEN_3824_P_2 + 1)
1188#define VEX_LEN_3828_P_2 (VEX_LEN_3825_P_2 + 1)
1189#define VEX_LEN_3829_P_2 (VEX_LEN_3828_P_2 + 1)
1190#define VEX_LEN_382A_P_2_M_0 (VEX_LEN_3829_P_2 + 1)
1191#define VEX_LEN_382B_P_2 (VEX_LEN_382A_P_2_M_0 + 1)
1192#define VEX_LEN_3830_P_2 (VEX_LEN_382B_P_2 + 1)
1193#define VEX_LEN_3831_P_2 (VEX_LEN_3830_P_2 + 1)
1194#define VEX_LEN_3832_P_2 (VEX_LEN_3831_P_2 + 1)
1195#define VEX_LEN_3833_P_2 (VEX_LEN_3832_P_2 + 1)
1196#define VEX_LEN_3834_P_2 (VEX_LEN_3833_P_2 + 1)
1197#define VEX_LEN_3835_P_2 (VEX_LEN_3834_P_2 + 1)
1198#define VEX_LEN_3837_P_2 (VEX_LEN_3835_P_2 + 1)
1199#define VEX_LEN_3838_P_2 (VEX_LEN_3837_P_2 + 1)
1200#define VEX_LEN_3839_P_2 (VEX_LEN_3838_P_2 + 1)
1201#define VEX_LEN_383A_P_2 (VEX_LEN_3839_P_2 + 1)
1202#define VEX_LEN_383B_P_2 (VEX_LEN_383A_P_2 + 1)
1203#define VEX_LEN_383C_P_2 (VEX_LEN_383B_P_2 + 1)
1204#define VEX_LEN_383D_P_2 (VEX_LEN_383C_P_2 + 1)
1205#define VEX_LEN_383E_P_2 (VEX_LEN_383D_P_2 + 1)
1206#define VEX_LEN_383F_P_2 (VEX_LEN_383E_P_2 + 1)
1207#define VEX_LEN_3840_P_2 (VEX_LEN_383F_P_2 + 1)
1208#define VEX_LEN_3841_P_2 (VEX_LEN_3840_P_2 + 1)
a5ff0eb2
L
1209#define VEX_LEN_38DB_P_2 (VEX_LEN_3841_P_2 + 1)
1210#define VEX_LEN_38DC_P_2 (VEX_LEN_38DB_P_2 + 1)
1211#define VEX_LEN_38DD_P_2 (VEX_LEN_38DC_P_2 + 1)
1212#define VEX_LEN_38DE_P_2 (VEX_LEN_38DD_P_2 + 1)
1213#define VEX_LEN_38DF_P_2 (VEX_LEN_38DE_P_2 + 1)
1214#define VEX_LEN_3A06_P_2 (VEX_LEN_38DF_P_2 + 1)
c0f3af97
L
1215#define VEX_LEN_3A0A_P_2 (VEX_LEN_3A06_P_2 + 1)
1216#define VEX_LEN_3A0B_P_2 (VEX_LEN_3A0A_P_2 + 1)
1217#define VEX_LEN_3A0E_P_2 (VEX_LEN_3A0B_P_2 + 1)
1218#define VEX_LEN_3A0F_P_2 (VEX_LEN_3A0E_P_2 + 1)
1219#define VEX_LEN_3A14_P_2 (VEX_LEN_3A0F_P_2 + 1)
1220#define VEX_LEN_3A15_P_2 (VEX_LEN_3A14_P_2 + 1)
1221#define VEX_LEN_3A16_P_2 (VEX_LEN_3A15_P_2 + 1)
1222#define VEX_LEN_3A17_P_2 (VEX_LEN_3A16_P_2 + 1)
1223#define VEX_LEN_3A18_P_2 (VEX_LEN_3A17_P_2 + 1)
1224#define VEX_LEN_3A19_P_2 (VEX_LEN_3A18_P_2 + 1)
1225#define VEX_LEN_3A20_P_2 (VEX_LEN_3A19_P_2 + 1)
1226#define VEX_LEN_3A21_P_2 (VEX_LEN_3A20_P_2 + 1)
1227#define VEX_LEN_3A22_P_2 (VEX_LEN_3A21_P_2 + 1)
1228#define VEX_LEN_3A41_P_2 (VEX_LEN_3A22_P_2 + 1)
1229#define VEX_LEN_3A42_P_2 (VEX_LEN_3A41_P_2 + 1)
1230#define VEX_LEN_3A4C_P_2 (VEX_LEN_3A42_P_2 + 1)
1231#define VEX_LEN_3A60_P_2 (VEX_LEN_3A4C_P_2 + 1)
1232#define VEX_LEN_3A61_P_2 (VEX_LEN_3A60_P_2 + 1)
1233#define VEX_LEN_3A62_P_2 (VEX_LEN_3A61_P_2 + 1)
1234#define VEX_LEN_3A63_P_2 (VEX_LEN_3A62_P_2 + 1)
1235#define VEX_LEN_3A6A_P_2 (VEX_LEN_3A63_P_2 + 1)
1236#define VEX_LEN_3A6B_P_2 (VEX_LEN_3A6A_P_2 + 1)
1237#define VEX_LEN_3A6E_P_2 (VEX_LEN_3A6B_P_2 + 1)
1238#define VEX_LEN_3A6F_P_2 (VEX_LEN_3A6E_P_2 + 1)
1239#define VEX_LEN_3A7A_P_2 (VEX_LEN_3A6F_P_2 + 1)
1240#define VEX_LEN_3A7B_P_2 (VEX_LEN_3A7A_P_2 + 1)
1241#define VEX_LEN_3A7E_P_2 (VEX_LEN_3A7B_P_2 + 1)
1242#define VEX_LEN_3A7F_P_2 (VEX_LEN_3A7E_P_2 + 1)
a5ff0eb2 1243#define VEX_LEN_3ADF_P_2 (VEX_LEN_3A7F_P_2 + 1)
c0f3af97 1244
26ca5450 1245typedef void (*op_rtn) (int bytemode, int sizeflag);
252b5132
RH
1246
1247struct dis386 {
2da11e11 1248 const char *name;
ce518a5f
L
1249 struct
1250 {
1251 op_rtn rtn;
1252 int bytemode;
1253 } op[MAX_OPERANDS];
252b5132
RH
1254};
1255
1256/* Upper case letters in the instruction names here are macros.
1257 'A' => print 'b' if no register operands or suffix_always is true
1258 'B' => print 'b' if suffix_always is true
9306ca4a 1259 'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
98b528ac 1260 size prefix
ed7841b3 1261 'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
98b528ac 1262 suffix_always is true
252b5132 1263 'E' => print 'e' if 32-bit form of jcxz
3ffd33cf 1264 'F' => print 'w' or 'l' depending on address size prefix (loop insns)
52fd6d94 1265 'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
5dd0794d 1266 'H' => print ",pt" or ",pn" branch hint
9306ca4a 1267 'I' => honor following macro letter even in Intel mode (implemented only
98b528ac 1268 for some of the macro letters)
9306ca4a 1269 'J' => print 'l'
42903f7f 1270 'K' => print 'd' or 'q' if rex prefix is present.
252b5132 1271 'L' => print 'l' if suffix_always is true
9d141669 1272 'M' => print 'r' if intel_mnemonic is false.
252b5132 1273 'N' => print 'n' if instruction has no wait "prefix"
a35ca55a 1274 'O' => print 'd' or 'o' (or 'q' in Intel mode)
52b15da3 1275 'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix,
98b528ac
L
1276 or suffix_always is true. print 'q' if rex prefix is present.
1277 'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
1278 is true
a35ca55a 1279 'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
52b15da3 1280 'S' => print 'w', 'l' or 'q' if suffix_always is true
6439fc28
AM
1281 'T' => print 'q' in 64bit mode and behave as 'P' otherwise
1282 'U' => print 'q' in 64bit mode and behave as 'Q' otherwise
1a114b12 1283 'V' => print 'q' in 64bit mode and behave as 'S' otherwise
a35ca55a 1284 'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
9306ca4a 1285 'X' => print 's', 'd' depending on data16 prefix (for XMM)
8a72226a
L
1286 'Y' => 'q' if instruction has an REX 64bit overwrite prefix and
1287 suffix_always is true.
6dd5059a 1288 'Z' => print 'q' in 64bit mode and behave as 'L' otherwise
9d141669 1289 '!' => change condition from true to false or from false to true.
98b528ac
L
1290 '%' => add 1 upper case letter to the macro.
1291
1292 2 upper case letter macros:
c0f3af97
L
1293 "XY" => print 'x' or 'y' if no register operands or suffix_always
1294 is true.
98b528ac
L
1295 'LQ' => print 'l' ('d' in Intel mode) or 'q' for memory operand
1296 or suffix_always is true
52b15da3 1297
6439fc28
AM
1298 Many of the above letters print nothing in Intel mode. See "putop"
1299 for the details.
52b15da3 1300
6439fc28 1301 Braces '{' and '}', and vertical bars '|', indicate alternative
7c52e0e8 1302 mnemonic strings for AT&T and Intel. */
252b5132 1303
6439fc28 1304static const struct dis386 dis386[] = {
252b5132 1305 /* 00 */
ce518a5f
L
1306 { "addB", { Eb, Gb } },
1307 { "addS", { Ev, Gv } },
1308 { "addB", { Gb, Eb } },
1309 { "addS", { Gv, Ev } },
1310 { "addB", { AL, Ib } },
1311 { "addS", { eAX, Iv } },
4e7d34a6
L
1312 { X86_64_TABLE (X86_64_06) },
1313 { X86_64_TABLE (X86_64_07) },
252b5132 1314 /* 08 */
ce518a5f
L
1315 { "orB", { Eb, Gb } },
1316 { "orS", { Ev, Gv } },
1317 { "orB", { Gb, Eb } },
1318 { "orS", { Gv, Ev } },
1319 { "orB", { AL, Ib } },
1320 { "orS", { eAX, Iv } },
4e7d34a6 1321 { X86_64_TABLE (X86_64_0D) },
ce518a5f 1322 { "(bad)", { XX } }, /* 0x0f extended opcode escape */
252b5132 1323 /* 10 */
ce518a5f
L
1324 { "adcB", { Eb, Gb } },
1325 { "adcS", { Ev, Gv } },
1326 { "adcB", { Gb, Eb } },
1327 { "adcS", { Gv, Ev } },
1328 { "adcB", { AL, Ib } },
1329 { "adcS", { eAX, Iv } },
4e7d34a6
L
1330 { X86_64_TABLE (X86_64_16) },
1331 { X86_64_TABLE (X86_64_17) },
252b5132 1332 /* 18 */
ce518a5f
L
1333 { "sbbB", { Eb, Gb } },
1334 { "sbbS", { Ev, Gv } },
1335 { "sbbB", { Gb, Eb } },
1336 { "sbbS", { Gv, Ev } },
1337 { "sbbB", { AL, Ib } },
1338 { "sbbS", { eAX, Iv } },
4e7d34a6
L
1339 { X86_64_TABLE (X86_64_1E) },
1340 { X86_64_TABLE (X86_64_1F) },
252b5132 1341 /* 20 */
ce518a5f
L
1342 { "andB", { Eb, Gb } },
1343 { "andS", { Ev, Gv } },
1344 { "andB", { Gb, Eb } },
1345 { "andS", { Gv, Ev } },
1346 { "andB", { AL, Ib } },
1347 { "andS", { eAX, Iv } },
1348 { "(bad)", { XX } }, /* SEG ES prefix */
4e7d34a6 1349 { X86_64_TABLE (X86_64_27) },
252b5132 1350 /* 28 */
ce518a5f
L
1351 { "subB", { Eb, Gb } },
1352 { "subS", { Ev, Gv } },
1353 { "subB", { Gb, Eb } },
1354 { "subS", { Gv, Ev } },
1355 { "subB", { AL, Ib } },
1356 { "subS", { eAX, Iv } },
1357 { "(bad)", { XX } }, /* SEG CS prefix */
4e7d34a6 1358 { X86_64_TABLE (X86_64_2F) },
252b5132 1359 /* 30 */
ce518a5f
L
1360 { "xorB", { Eb, Gb } },
1361 { "xorS", { Ev, Gv } },
1362 { "xorB", { Gb, Eb } },
1363 { "xorS", { Gv, Ev } },
1364 { "xorB", { AL, Ib } },
1365 { "xorS", { eAX, Iv } },
1366 { "(bad)", { XX } }, /* SEG SS prefix */
4e7d34a6 1367 { X86_64_TABLE (X86_64_37) },
252b5132 1368 /* 38 */
ce518a5f
L
1369 { "cmpB", { Eb, Gb } },
1370 { "cmpS", { Ev, Gv } },
1371 { "cmpB", { Gb, Eb } },
1372 { "cmpS", { Gv, Ev } },
1373 { "cmpB", { AL, Ib } },
1374 { "cmpS", { eAX, Iv } },
1375 { "(bad)", { XX } }, /* SEG DS prefix */
4e7d34a6 1376 { X86_64_TABLE (X86_64_3F) },
252b5132 1377 /* 40 */
ce518a5f
L
1378 { "inc{S|}", { RMeAX } },
1379 { "inc{S|}", { RMeCX } },
1380 { "inc{S|}", { RMeDX } },
1381 { "inc{S|}", { RMeBX } },
1382 { "inc{S|}", { RMeSP } },
1383 { "inc{S|}", { RMeBP } },
1384 { "inc{S|}", { RMeSI } },
1385 { "inc{S|}", { RMeDI } },
252b5132 1386 /* 48 */
ce518a5f
L
1387 { "dec{S|}", { RMeAX } },
1388 { "dec{S|}", { RMeCX } },
1389 { "dec{S|}", { RMeDX } },
1390 { "dec{S|}", { RMeBX } },
1391 { "dec{S|}", { RMeSP } },
1392 { "dec{S|}", { RMeBP } },
1393 { "dec{S|}", { RMeSI } },
1394 { "dec{S|}", { RMeDI } },
252b5132 1395 /* 50 */
ce518a5f
L
1396 { "pushV", { RMrAX } },
1397 { "pushV", { RMrCX } },
1398 { "pushV", { RMrDX } },
1399 { "pushV", { RMrBX } },
1400 { "pushV", { RMrSP } },
1401 { "pushV", { RMrBP } },
1402 { "pushV", { RMrSI } },
1403 { "pushV", { RMrDI } },
252b5132 1404 /* 58 */
ce518a5f
L
1405 { "popV", { RMrAX } },
1406 { "popV", { RMrCX } },
1407 { "popV", { RMrDX } },
1408 { "popV", { RMrBX } },
1409 { "popV", { RMrSP } },
1410 { "popV", { RMrBP } },
1411 { "popV", { RMrSI } },
1412 { "popV", { RMrDI } },
252b5132 1413 /* 60 */
4e7d34a6
L
1414 { X86_64_TABLE (X86_64_60) },
1415 { X86_64_TABLE (X86_64_61) },
1416 { X86_64_TABLE (X86_64_62) },
1417 { X86_64_TABLE (X86_64_63) },
ce518a5f
L
1418 { "(bad)", { XX } }, /* seg fs */
1419 { "(bad)", { XX } }, /* seg gs */
1420 { "(bad)", { XX } }, /* op size prefix */
1421 { "(bad)", { XX } }, /* adr size prefix */
252b5132 1422 /* 68 */
ce518a5f
L
1423 { "pushT", { Iq } },
1424 { "imulS", { Gv, Ev, Iv } },
1425 { "pushT", { sIb } },
1426 { "imulS", { Gv, Ev, sIb } },
7c52e0e8 1427 { "ins{b|}", { Ybr, indirDX } },
4e7d34a6 1428 { X86_64_TABLE (X86_64_6D) },
7c52e0e8 1429 { "outs{b|}", { indirDXr, Xb } },
4e7d34a6 1430 { X86_64_TABLE (X86_64_6F) },
252b5132 1431 /* 70 */
ce518a5f
L
1432 { "joH", { Jb, XX, cond_jump_flag } },
1433 { "jnoH", { Jb, XX, cond_jump_flag } },
1434 { "jbH", { Jb, XX, cond_jump_flag } },
1435 { "jaeH", { Jb, XX, cond_jump_flag } },
1436 { "jeH", { Jb, XX, cond_jump_flag } },
1437 { "jneH", { Jb, XX, cond_jump_flag } },
1438 { "jbeH", { Jb, XX, cond_jump_flag } },
1439 { "jaH", { Jb, XX, cond_jump_flag } },
252b5132 1440 /* 78 */
ce518a5f
L
1441 { "jsH", { Jb, XX, cond_jump_flag } },
1442 { "jnsH", { Jb, XX, cond_jump_flag } },
1443 { "jpH", { Jb, XX, cond_jump_flag } },
1444 { "jnpH", { Jb, XX, cond_jump_flag } },
1445 { "jlH", { Jb, XX, cond_jump_flag } },
1446 { "jgeH", { Jb, XX, cond_jump_flag } },
1447 { "jleH", { Jb, XX, cond_jump_flag } },
1448 { "jgH", { Jb, XX, cond_jump_flag } },
252b5132 1449 /* 80 */
1ceb70f8
L
1450 { REG_TABLE (REG_80) },
1451 { REG_TABLE (REG_81) },
ce518a5f 1452 { "(bad)", { XX } },
1ceb70f8 1453 { REG_TABLE (REG_82) },
ce518a5f
L
1454 { "testB", { Eb, Gb } },
1455 { "testS", { Ev, Gv } },
1456 { "xchgB", { Eb, Gb } },
1457 { "xchgS", { Ev, Gv } },
252b5132 1458 /* 88 */
ce518a5f
L
1459 { "movB", { Eb, Gb } },
1460 { "movS", { Ev, Gv } },
1461 { "movB", { Gb, Eb } },
1462 { "movS", { Gv, Ev } },
1463 { "movD", { Sv, Sw } },
1ceb70f8 1464 { MOD_TABLE (MOD_8D) },
ce518a5f 1465 { "movD", { Sw, Sv } },
1ceb70f8 1466 { REG_TABLE (REG_8F) },
252b5132 1467 /* 90 */
1ceb70f8 1468 { PREFIX_TABLE (PREFIX_90) },
ce518a5f
L
1469 { "xchgS", { RMeCX, eAX } },
1470 { "xchgS", { RMeDX, eAX } },
1471 { "xchgS", { RMeBX, eAX } },
1472 { "xchgS", { RMeSP, eAX } },
1473 { "xchgS", { RMeBP, eAX } },
1474 { "xchgS", { RMeSI, eAX } },
1475 { "xchgS", { RMeDI, eAX } },
252b5132 1476 /* 98 */
7c52e0e8
L
1477 { "cW{t|}R", { XX } },
1478 { "cR{t|}O", { XX } },
4e7d34a6 1479 { X86_64_TABLE (X86_64_9A) },
ce518a5f
L
1480 { "(bad)", { XX } }, /* fwait */
1481 { "pushfT", { XX } },
1482 { "popfT", { XX } },
7c52e0e8
L
1483 { "sahf", { XX } },
1484 { "lahf", { XX } },
252b5132 1485 /* a0 */
ce518a5f
L
1486 { "movB", { AL, Ob } },
1487 { "movS", { eAX, Ov } },
1488 { "movB", { Ob, AL } },
1489 { "movS", { Ov, eAX } },
7c52e0e8
L
1490 { "movs{b|}", { Ybr, Xb } },
1491 { "movs{R|}", { Yvr, Xv } },
1492 { "cmps{b|}", { Xb, Yb } },
1493 { "cmps{R|}", { Xv, Yv } },
252b5132 1494 /* a8 */
ce518a5f
L
1495 { "testB", { AL, Ib } },
1496 { "testS", { eAX, Iv } },
1497 { "stosB", { Ybr, AL } },
1498 { "stosS", { Yvr, eAX } },
1499 { "lodsB", { ALr, Xb } },
1500 { "lodsS", { eAXr, Xv } },
1501 { "scasB", { AL, Yb } },
1502 { "scasS", { eAX, Yv } },
252b5132 1503 /* b0 */
ce518a5f
L
1504 { "movB", { RMAL, Ib } },
1505 { "movB", { RMCL, Ib } },
1506 { "movB", { RMDL, Ib } },
1507 { "movB", { RMBL, Ib } },
1508 { "movB", { RMAH, Ib } },
1509 { "movB", { RMCH, Ib } },
1510 { "movB", { RMDH, Ib } },
1511 { "movB", { RMBH, Ib } },
252b5132 1512 /* b8 */
ce518a5f
L
1513 { "movS", { RMeAX, Iv64 } },
1514 { "movS", { RMeCX, Iv64 } },
1515 { "movS", { RMeDX, Iv64 } },
1516 { "movS", { RMeBX, Iv64 } },
1517 { "movS", { RMeSP, Iv64 } },
1518 { "movS", { RMeBP, Iv64 } },
1519 { "movS", { RMeSI, Iv64 } },
1520 { "movS", { RMeDI, Iv64 } },
252b5132 1521 /* c0 */
1ceb70f8
L
1522 { REG_TABLE (REG_C0) },
1523 { REG_TABLE (REG_C1) },
ce518a5f
L
1524 { "retT", { Iw } },
1525 { "retT", { XX } },
4e7d34a6
L
1526 { X86_64_TABLE (X86_64_C4) },
1527 { X86_64_TABLE (X86_64_C5) },
1ceb70f8
L
1528 { REG_TABLE (REG_C6) },
1529 { REG_TABLE (REG_C7) },
252b5132 1530 /* c8 */
ce518a5f
L
1531 { "enterT", { Iw, Ib } },
1532 { "leaveT", { XX } },
ddab3d59
JB
1533 { "Jret{|f}P", { Iw } },
1534 { "Jret{|f}P", { XX } },
ce518a5f
L
1535 { "int3", { XX } },
1536 { "int", { Ib } },
4e7d34a6 1537 { X86_64_TABLE (X86_64_CE) },
ce518a5f 1538 { "iretP", { XX } },
252b5132 1539 /* d0 */
1ceb70f8
L
1540 { REG_TABLE (REG_D0) },
1541 { REG_TABLE (REG_D1) },
1542 { REG_TABLE (REG_D2) },
1543 { REG_TABLE (REG_D3) },
4e7d34a6
L
1544 { X86_64_TABLE (X86_64_D4) },
1545 { X86_64_TABLE (X86_64_D5) },
ce518a5f
L
1546 { "(bad)", { XX } },
1547 { "xlat", { DSBX } },
252b5132
RH
1548 /* d8 */
1549 { FLOAT },
1550 { FLOAT },
1551 { FLOAT },
1552 { FLOAT },
1553 { FLOAT },
1554 { FLOAT },
1555 { FLOAT },
1556 { FLOAT },
1557 /* e0 */
ce518a5f
L
1558 { "loopneFH", { Jb, XX, loop_jcxz_flag } },
1559 { "loopeFH", { Jb, XX, loop_jcxz_flag } },
1560 { "loopFH", { Jb, XX, loop_jcxz_flag } },
1561 { "jEcxzH", { Jb, XX, loop_jcxz_flag } },
1562 { "inB", { AL, Ib } },
1563 { "inG", { zAX, Ib } },
1564 { "outB", { Ib, AL } },
1565 { "outG", { Ib, zAX } },
252b5132 1566 /* e8 */
ce518a5f
L
1567 { "callT", { Jv } },
1568 { "jmpT", { Jv } },
4e7d34a6 1569 { X86_64_TABLE (X86_64_EA) },
ce518a5f
L
1570 { "jmp", { Jb } },
1571 { "inB", { AL, indirDX } },
1572 { "inG", { zAX, indirDX } },
1573 { "outB", { indirDX, AL } },
1574 { "outG", { indirDX, zAX } },
252b5132 1575 /* f0 */
ce518a5f
L
1576 { "(bad)", { XX } }, /* lock prefix */
1577 { "icebp", { XX } },
1578 { "(bad)", { XX } }, /* repne */
1579 { "(bad)", { XX } }, /* repz */
1580 { "hlt", { XX } },
1581 { "cmc", { XX } },
1ceb70f8
L
1582 { REG_TABLE (REG_F6) },
1583 { REG_TABLE (REG_F7) },
252b5132 1584 /* f8 */
ce518a5f
L
1585 { "clc", { XX } },
1586 { "stc", { XX } },
1587 { "cli", { XX } },
1588 { "sti", { XX } },
1589 { "cld", { XX } },
1590 { "std", { XX } },
1ceb70f8
L
1591 { REG_TABLE (REG_FE) },
1592 { REG_TABLE (REG_FF) },
252b5132
RH
1593};
1594
6439fc28 1595static const struct dis386 dis386_twobyte[] = {
252b5132 1596 /* 00 */
1ceb70f8
L
1597 { REG_TABLE (REG_0F00 ) },
1598 { REG_TABLE (REG_0F01 ) },
ce518a5f
L
1599 { "larS", { Gv, Ew } },
1600 { "lslS", { Gv, Ew } },
1601 { "(bad)", { XX } },
1602 { "syscall", { XX } },
1603 { "clts", { XX } },
1604 { "sysretP", { XX } },
252b5132 1605 /* 08 */
ce518a5f
L
1606 { "invd", { XX } },
1607 { "wbinvd", { XX } },
1608 { "(bad)", { XX } },
1609 { "ud2a", { XX } },
1610 { "(bad)", { XX } },
b5b1fc4f 1611 { REG_TABLE (REG_0F0D) },
ce518a5f
L
1612 { "femms", { XX } },
1613 { "", { MX, EM, OPSUF } }, /* See OP_3DNowSuffix. */
252b5132 1614 /* 10 */
1ceb70f8
L
1615 { PREFIX_TABLE (PREFIX_0F10) },
1616 { PREFIX_TABLE (PREFIX_0F11) },
1617 { PREFIX_TABLE (PREFIX_0F12) },
1618 { MOD_TABLE (MOD_0F13) },
f2a421c4
L
1619 { "unpcklpX", { XM, EXx } },
1620 { "unpckhpX", { XM, EXx } },
1ceb70f8
L
1621 { PREFIX_TABLE (PREFIX_0F16) },
1622 { MOD_TABLE (MOD_0F17) },
252b5132 1623 /* 18 */
1ceb70f8 1624 { REG_TABLE (REG_0F18) },
b5b1fc4f
L
1625 { "nopQ", { Ev } },
1626 { "nopQ", { Ev } },
1627 { "nopQ", { Ev } },
1628 { "nopQ", { Ev } },
1629 { "nopQ", { Ev } },
1630 { "nopQ", { Ev } },
ce518a5f 1631 { "nopQ", { Ev } },
252b5132 1632 /* 20 */
1ceb70f8
L
1633 { MOD_TABLE (MOD_0F20) },
1634 { MOD_TABLE (MOD_0F21) },
1635 { MOD_TABLE (MOD_0F22) },
1636 { MOD_TABLE (MOD_0F23) },
1637 { MOD_TABLE (MOD_0F24) },
4e7d34a6 1638 { THREE_BYTE_TABLE (THREE_BYTE_0F25) },
1ceb70f8 1639 { MOD_TABLE (MOD_0F26) },
ce518a5f 1640 { "(bad)", { XX } },
252b5132 1641 /* 28 */
09a2c6cf 1642 { "movapX", { XM, EXx } },
d5d7db8e 1643 { "movapX", { EXx, XM } },
1ceb70f8
L
1644 { PREFIX_TABLE (PREFIX_0F2A) },
1645 { PREFIX_TABLE (PREFIX_0F2B) },
1646 { PREFIX_TABLE (PREFIX_0F2C) },
1647 { PREFIX_TABLE (PREFIX_0F2D) },
1648 { PREFIX_TABLE (PREFIX_0F2E) },
1649 { PREFIX_TABLE (PREFIX_0F2F) },
252b5132 1650 /* 30 */
ce518a5f
L
1651 { "wrmsr", { XX } },
1652 { "rdtsc", { XX } },
1653 { "rdmsr", { XX } },
1654 { "rdpmc", { XX } },
1655 { "sysenter", { XX } },
1656 { "sysexit", { XX } },
1657 { "(bad)", { XX } },
47dd174c 1658 { "getsec", { XX } },
252b5132 1659 /* 38 */
4e7d34a6 1660 { THREE_BYTE_TABLE (THREE_BYTE_0F38) },
ce518a5f 1661 { "(bad)", { XX } },
4e7d34a6 1662 { THREE_BYTE_TABLE (THREE_BYTE_0F3A) },
ce518a5f
L
1663 { "(bad)", { XX } },
1664 { "(bad)", { XX } },
1665 { "(bad)", { XX } },
1666 { "(bad)", { XX } },
1667 { "(bad)", { XX } },
252b5132 1668 /* 40 */
b19d5385
JB
1669 { "cmovoS", { Gv, Ev } },
1670 { "cmovnoS", { Gv, Ev } },
1671 { "cmovbS", { Gv, Ev } },
1672 { "cmovaeS", { Gv, Ev } },
1673 { "cmoveS", { Gv, Ev } },
1674 { "cmovneS", { Gv, Ev } },
1675 { "cmovbeS", { Gv, Ev } },
1676 { "cmovaS", { Gv, Ev } },
252b5132 1677 /* 48 */
b19d5385
JB
1678 { "cmovsS", { Gv, Ev } },
1679 { "cmovnsS", { Gv, Ev } },
1680 { "cmovpS", { Gv, Ev } },
1681 { "cmovnpS", { Gv, Ev } },
1682 { "cmovlS", { Gv, Ev } },
1683 { "cmovgeS", { Gv, Ev } },
1684 { "cmovleS", { Gv, Ev } },
1685 { "cmovgS", { Gv, Ev } },
252b5132 1686 /* 50 */
75c135a8 1687 { MOD_TABLE (MOD_0F51) },
1ceb70f8
L
1688 { PREFIX_TABLE (PREFIX_0F51) },
1689 { PREFIX_TABLE (PREFIX_0F52) },
1690 { PREFIX_TABLE (PREFIX_0F53) },
09a2c6cf
L
1691 { "andpX", { XM, EXx } },
1692 { "andnpX", { XM, EXx } },
1693 { "orpX", { XM, EXx } },
1694 { "xorpX", { XM, EXx } },
252b5132 1695 /* 58 */
1ceb70f8
L
1696 { PREFIX_TABLE (PREFIX_0F58) },
1697 { PREFIX_TABLE (PREFIX_0F59) },
1698 { PREFIX_TABLE (PREFIX_0F5A) },
1699 { PREFIX_TABLE (PREFIX_0F5B) },
1700 { PREFIX_TABLE (PREFIX_0F5C) },
1701 { PREFIX_TABLE (PREFIX_0F5D) },
1702 { PREFIX_TABLE (PREFIX_0F5E) },
1703 { PREFIX_TABLE (PREFIX_0F5F) },
252b5132 1704 /* 60 */
1ceb70f8
L
1705 { PREFIX_TABLE (PREFIX_0F60) },
1706 { PREFIX_TABLE (PREFIX_0F61) },
1707 { PREFIX_TABLE (PREFIX_0F62) },
ce518a5f
L
1708 { "packsswb", { MX, EM } },
1709 { "pcmpgtb", { MX, EM } },
1710 { "pcmpgtw", { MX, EM } },
1711 { "pcmpgtd", { MX, EM } },
1712 { "packuswb", { MX, EM } },
252b5132 1713 /* 68 */
ce518a5f
L
1714 { "punpckhbw", { MX, EM } },
1715 { "punpckhwd", { MX, EM } },
1716 { "punpckhdq", { MX, EM } },
1717 { "packssdw", { MX, EM } },
1ceb70f8
L
1718 { PREFIX_TABLE (PREFIX_0F6C) },
1719 { PREFIX_TABLE (PREFIX_0F6D) },
231af070 1720 { "movK", { MX, Edq } },
1ceb70f8 1721 { PREFIX_TABLE (PREFIX_0F6F) },
252b5132 1722 /* 70 */
1ceb70f8
L
1723 { PREFIX_TABLE (PREFIX_0F70) },
1724 { REG_TABLE (REG_0F71) },
1725 { REG_TABLE (REG_0F72) },
1726 { REG_TABLE (REG_0F73) },
ce518a5f
L
1727 { "pcmpeqb", { MX, EM } },
1728 { "pcmpeqw", { MX, EM } },
1729 { "pcmpeqd", { MX, EM } },
1730 { "emms", { XX } },
252b5132 1731 /* 78 */
1ceb70f8
L
1732 { PREFIX_TABLE (PREFIX_0F78) },
1733 { PREFIX_TABLE (PREFIX_0F79) },
4e7d34a6 1734 { THREE_BYTE_TABLE (THREE_BYTE_0F7A) },
89b66d55 1735 { THREE_BYTE_TABLE (THREE_BYTE_0F7B) },
1ceb70f8
L
1736 { PREFIX_TABLE (PREFIX_0F7C) },
1737 { PREFIX_TABLE (PREFIX_0F7D) },
1738 { PREFIX_TABLE (PREFIX_0F7E) },
1739 { PREFIX_TABLE (PREFIX_0F7F) },
252b5132 1740 /* 80 */
ce518a5f
L
1741 { "joH", { Jv, XX, cond_jump_flag } },
1742 { "jnoH", { Jv, XX, cond_jump_flag } },
1743 { "jbH", { Jv, XX, cond_jump_flag } },
1744 { "jaeH", { Jv, XX, cond_jump_flag } },
1745 { "jeH", { Jv, XX, cond_jump_flag } },
1746 { "jneH", { Jv, XX, cond_jump_flag } },
1747 { "jbeH", { Jv, XX, cond_jump_flag } },
1748 { "jaH", { Jv, XX, cond_jump_flag } },
252b5132 1749 /* 88 */
ce518a5f
L
1750 { "jsH", { Jv, XX, cond_jump_flag } },
1751 { "jnsH", { Jv, XX, cond_jump_flag } },
1752 { "jpH", { Jv, XX, cond_jump_flag } },
1753 { "jnpH", { Jv, XX, cond_jump_flag } },
1754 { "jlH", { Jv, XX, cond_jump_flag } },
1755 { "jgeH", { Jv, XX, cond_jump_flag } },
1756 { "jleH", { Jv, XX, cond_jump_flag } },
1757 { "jgH", { Jv, XX, cond_jump_flag } },
252b5132 1758 /* 90 */
ce518a5f
L
1759 { "seto", { Eb } },
1760 { "setno", { Eb } },
1761 { "setb", { Eb } },
1762 { "setae", { Eb } },
1763 { "sete", { Eb } },
1764 { "setne", { Eb } },
1765 { "setbe", { Eb } },
1766 { "seta", { Eb } },
252b5132 1767 /* 98 */
ce518a5f
L
1768 { "sets", { Eb } },
1769 { "setns", { Eb } },
1770 { "setp", { Eb } },
1771 { "setnp", { Eb } },
1772 { "setl", { Eb } },
1773 { "setge", { Eb } },
1774 { "setle", { Eb } },
1775 { "setg", { Eb } },
252b5132 1776 /* a0 */
ce518a5f
L
1777 { "pushT", { fs } },
1778 { "popT", { fs } },
1779 { "cpuid", { XX } },
1780 { "btS", { Ev, Gv } },
1781 { "shldS", { Ev, Gv, Ib } },
1782 { "shldS", { Ev, Gv, CL } },
1ceb70f8
L
1783 { REG_TABLE (REG_0FA6) },
1784 { REG_TABLE (REG_0FA7) },
252b5132 1785 /* a8 */
ce518a5f
L
1786 { "pushT", { gs } },
1787 { "popT", { gs } },
1788 { "rsm", { XX } },
1789 { "btsS", { Ev, Gv } },
1790 { "shrdS", { Ev, Gv, Ib } },
1791 { "shrdS", { Ev, Gv, CL } },
1ceb70f8 1792 { REG_TABLE (REG_0FAE) },
ce518a5f 1793 { "imulS", { Gv, Ev } },
252b5132 1794 /* b0 */
ce518a5f
L
1795 { "cmpxchgB", { Eb, Gb } },
1796 { "cmpxchgS", { Ev, Gv } },
1ceb70f8 1797 { MOD_TABLE (MOD_0FB2) },
ce518a5f 1798 { "btrS", { Ev, Gv } },
1ceb70f8
L
1799 { MOD_TABLE (MOD_0FB4) },
1800 { MOD_TABLE (MOD_0FB5) },
7c52e0e8
L
1801 { "movz{bR|x}", { Gv, Eb } },
1802 { "movz{wR|x}", { Gv, Ew } }, /* yes, there really is movzww ! */
252b5132 1803 /* b8 */
1ceb70f8 1804 { PREFIX_TABLE (PREFIX_0FB8) },
ce518a5f 1805 { "ud2b", { XX } },
1ceb70f8 1806 { REG_TABLE (REG_0FBA) },
ce518a5f
L
1807 { "btcS", { Ev, Gv } },
1808 { "bsfS", { Gv, Ev } },
1ceb70f8 1809 { PREFIX_TABLE (PREFIX_0FBD) },
7c52e0e8
L
1810 { "movs{bR|x}", { Gv, Eb } },
1811 { "movs{wR|x}", { Gv, Ew } }, /* yes, there really is movsww ! */
252b5132 1812 /* c0 */
ce518a5f
L
1813 { "xaddB", { Eb, Gb } },
1814 { "xaddS", { Ev, Gv } },
1ceb70f8 1815 { PREFIX_TABLE (PREFIX_0FC2) },
4ee52178 1816 { PREFIX_TABLE (PREFIX_0FC3) },
ce518a5f
L
1817 { "pinsrw", { MX, Edqw, Ib } },
1818 { "pextrw", { Gdq, MS, Ib } },
09a2c6cf 1819 { "shufpX", { XM, EXx, Ib } },
1ceb70f8 1820 { REG_TABLE (REG_0FC7) },
252b5132 1821 /* c8 */
ce518a5f
L
1822 { "bswap", { RMeAX } },
1823 { "bswap", { RMeCX } },
1824 { "bswap", { RMeDX } },
1825 { "bswap", { RMeBX } },
1826 { "bswap", { RMeSP } },
1827 { "bswap", { RMeBP } },
1828 { "bswap", { RMeSI } },
1829 { "bswap", { RMeDI } },
252b5132 1830 /* d0 */
1ceb70f8 1831 { PREFIX_TABLE (PREFIX_0FD0) },
ce518a5f
L
1832 { "psrlw", { MX, EM } },
1833 { "psrld", { MX, EM } },
1834 { "psrlq", { MX, EM } },
1835 { "paddq", { MX, EM } },
1836 { "pmullw", { MX, EM } },
1ceb70f8 1837 { PREFIX_TABLE (PREFIX_0FD6) },
75c135a8 1838 { MOD_TABLE (MOD_0FD7) },
252b5132 1839 /* d8 */
ce518a5f
L
1840 { "psubusb", { MX, EM } },
1841 { "psubusw", { MX, EM } },
1842 { "pminub", { MX, EM } },
1843 { "pand", { MX, EM } },
1844 { "paddusb", { MX, EM } },
1845 { "paddusw", { MX, EM } },
1846 { "pmaxub", { MX, EM } },
1847 { "pandn", { MX, EM } },
252b5132 1848 /* e0 */
ce518a5f
L
1849 { "pavgb", { MX, EM } },
1850 { "psraw", { MX, EM } },
1851 { "psrad", { MX, EM } },
1852 { "pavgw", { MX, EM } },
1853 { "pmulhuw", { MX, EM } },
1854 { "pmulhw", { MX, EM } },
1ceb70f8
L
1855 { PREFIX_TABLE (PREFIX_0FE6) },
1856 { PREFIX_TABLE (PREFIX_0FE7) },
252b5132 1857 /* e8 */
ce518a5f
L
1858 { "psubsb", { MX, EM } },
1859 { "psubsw", { MX, EM } },
1860 { "pminsw", { MX, EM } },
1861 { "por", { MX, EM } },
1862 { "paddsb", { MX, EM } },
1863 { "paddsw", { MX, EM } },
1864 { "pmaxsw", { MX, EM } },
1865 { "pxor", { MX, EM } },
252b5132 1866 /* f0 */
1ceb70f8 1867 { PREFIX_TABLE (PREFIX_0FF0) },
ce518a5f
L
1868 { "psllw", { MX, EM } },
1869 { "pslld", { MX, EM } },
1870 { "psllq", { MX, EM } },
1871 { "pmuludq", { MX, EM } },
1872 { "pmaddwd", { MX, EM } },
1873 { "psadbw", { MX, EM } },
1ceb70f8 1874 { PREFIX_TABLE (PREFIX_0FF7) },
252b5132 1875 /* f8 */
ce518a5f
L
1876 { "psubb", { MX, EM } },
1877 { "psubw", { MX, EM } },
1878 { "psubd", { MX, EM } },
1879 { "psubq", { MX, EM } },
1880 { "paddb", { MX, EM } },
1881 { "paddw", { MX, EM } },
1882 { "paddd", { MX, EM } },
1883 { "(bad)", { XX } },
252b5132
RH
1884};
1885
1886static const unsigned char onebyte_has_modrm[256] = {
c608c12e
AM
1887 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
1888 /* ------------------------------- */
1889 /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
1890 /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
1891 /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
1892 /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
1893 /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
1894 /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
1895 /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
1896 /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
1897 /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
1898 /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
1899 /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
1900 /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
1901 /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
1902 /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
1903 /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
1904 /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1 /* f0 */
1905 /* ------------------------------- */
1906 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
252b5132
RH
1907};
1908
1909static const unsigned char twobyte_has_modrm[256] = {
c608c12e
AM
1910 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
1911 /* ------------------------------- */
252b5132 1912 /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
b5b1fc4f 1913 /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
85f10a01 1914 /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
331d2d0d 1915 /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
252b5132 1916 /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
4bba6815
AM
1917 /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
1918 /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
85f10a01 1919 /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
252b5132
RH
1920 /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
1921 /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
30d1c836 1922 /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
050dfa73 1923 /* b0 */ 1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1, /* bf */
252b5132 1924 /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
ca164297 1925 /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
4bba6815 1926 /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
ca164297 1927 /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0 /* ff */
c608c12e
AM
1928 /* ------------------------------- */
1929 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
1930};
1931
252b5132
RH
1932static char obuf[100];
1933static char *obufp;
ea397f5b 1934static char *mnemonicendp;
252b5132
RH
1935static char scratchbuf[100];
1936static unsigned char *start_codep;
1937static unsigned char *insn_codep;
1938static unsigned char *codep;
b844680a
L
1939static const char *lock_prefix;
1940static const char *data_prefix;
1941static const char *addr_prefix;
1942static const char *repz_prefix;
1943static const char *repnz_prefix;
252b5132 1944static disassemble_info *the_info;
7967e09e
L
1945static struct
1946 {
1947 int mod;
7967e09e 1948 int reg;
484c222e 1949 int rm;
7967e09e
L
1950 }
1951modrm;
4bba6815 1952static unsigned char need_modrm;
c0f3af97
L
1953static struct
1954 {
1955 int register_specifier;
1956 int length;
1957 int prefix;
1958 int w;
1959 }
1960vex;
1961static unsigned char need_vex;
1962static unsigned char need_vex_reg;
dae39acc 1963static unsigned char vex_w_done;
252b5132 1964
ea397f5b
L
1965struct op
1966 {
1967 const char *name;
1968 unsigned int len;
1969 };
1970
4bba6815
AM
1971/* If we are accessing mod/rm/reg without need_modrm set, then the
1972 values are stale. Hitting this abort likely indicates that you
1973 need to update onebyte_has_modrm or twobyte_has_modrm. */
1974#define MODRM_CHECK if (!need_modrm) abort ()
1975
d708bcba
AM
1976static const char **names64;
1977static const char **names32;
1978static const char **names16;
1979static const char **names8;
1980static const char **names8rex;
1981static const char **names_seg;
db51cc60
L
1982static const char *index64;
1983static const char *index32;
d708bcba
AM
1984static const char **index16;
1985
1986static const char *intel_names64[] = {
1987 "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
1988 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
1989};
1990static const char *intel_names32[] = {
1991 "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
1992 "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
1993};
1994static const char *intel_names16[] = {
1995 "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
1996 "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
1997};
1998static const char *intel_names8[] = {
1999 "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
2000};
2001static const char *intel_names8rex[] = {
2002 "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
2003 "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
2004};
2005static const char *intel_names_seg[] = {
2006 "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
2007};
db51cc60
L
2008static const char *intel_index64 = "riz";
2009static const char *intel_index32 = "eiz";
d708bcba
AM
2010static const char *intel_index16[] = {
2011 "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
2012};
2013
2014static const char *att_names64[] = {
2015 "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
52b15da3
JH
2016 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
2017};
d708bcba
AM
2018static const char *att_names32[] = {
2019 "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
52b15da3 2020 "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
252b5132 2021};
d708bcba
AM
2022static const char *att_names16[] = {
2023 "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
52b15da3 2024 "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
252b5132 2025};
d708bcba
AM
2026static const char *att_names8[] = {
2027 "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
252b5132 2028};
d708bcba
AM
2029static const char *att_names8rex[] = {
2030 "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
52b15da3
JH
2031 "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
2032};
d708bcba
AM
2033static const char *att_names_seg[] = {
2034 "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
252b5132 2035};
db51cc60
L
2036static const char *att_index64 = "%riz";
2037static const char *att_index32 = "%eiz";
d708bcba
AM
2038static const char *att_index16[] = {
2039 "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
252b5132
RH
2040};
2041
1ceb70f8
L
2042static const struct dis386 reg_table[][8] = {
2043 /* REG_80 */
252b5132 2044 {
ce518a5f
L
2045 { "addA", { Eb, Ib } },
2046 { "orA", { Eb, Ib } },
2047 { "adcA", { Eb, Ib } },
2048 { "sbbA", { Eb, Ib } },
2049 { "andA", { Eb, Ib } },
2050 { "subA", { Eb, Ib } },
2051 { "xorA", { Eb, Ib } },
2052 { "cmpA", { Eb, Ib } },
252b5132 2053 },
1ceb70f8 2054 /* REG_81 */
252b5132 2055 {
ce518a5f
L
2056 { "addQ", { Ev, Iv } },
2057 { "orQ", { Ev, Iv } },
2058 { "adcQ", { Ev, Iv } },
2059 { "sbbQ", { Ev, Iv } },
2060 { "andQ", { Ev, Iv } },
2061 { "subQ", { Ev, Iv } },
2062 { "xorQ", { Ev, Iv } },
2063 { "cmpQ", { Ev, Iv } },
252b5132 2064 },
1ceb70f8 2065 /* REG_82 */
252b5132 2066 {
ce518a5f
L
2067 { "addQ", { Ev, sIb } },
2068 { "orQ", { Ev, sIb } },
2069 { "adcQ", { Ev, sIb } },
2070 { "sbbQ", { Ev, sIb } },
2071 { "andQ", { Ev, sIb } },
2072 { "subQ", { Ev, sIb } },
2073 { "xorQ", { Ev, sIb } },
2074 { "cmpQ", { Ev, sIb } },
252b5132 2075 },
1ceb70f8 2076 /* REG_8F */
4e7d34a6
L
2077 {
2078 { "popU", { stackEv } },
2079 { "(bad)", { XX } },
2080 { "(bad)", { XX } },
2081 { "(bad)", { XX } },
2082 { "(bad)", { XX } },
2083 { "(bad)", { XX } },
2084 { "(bad)", { XX } },
2085 { "(bad)", { XX } },
2086 },
1ceb70f8 2087 /* REG_C0 */
252b5132 2088 {
ce518a5f
L
2089 { "rolA", { Eb, Ib } },
2090 { "rorA", { Eb, Ib } },
2091 { "rclA", { Eb, Ib } },
2092 { "rcrA", { Eb, Ib } },
2093 { "shlA", { Eb, Ib } },
2094 { "shrA", { Eb, Ib } },
2095 { "(bad)", { XX } },
2096 { "sarA", { Eb, Ib } },
252b5132 2097 },
1ceb70f8 2098 /* REG_C1 */
252b5132 2099 {
ce518a5f
L
2100 { "rolQ", { Ev, Ib } },
2101 { "rorQ", { Ev, Ib } },
2102 { "rclQ", { Ev, Ib } },
2103 { "rcrQ", { Ev, Ib } },
2104 { "shlQ", { Ev, Ib } },
2105 { "shrQ", { Ev, Ib } },
2106 { "(bad)", { XX } },
2107 { "sarQ", { Ev, Ib } },
252b5132 2108 },
1ceb70f8 2109 /* REG_C6 */
4e7d34a6
L
2110 {
2111 { "movA", { Eb, Ib } },
2112 { "(bad)", { XX } },
2113 { "(bad)", { XX } },
2114 { "(bad)", { XX } },
2115 { "(bad)", { XX } },
2116 { "(bad)", { XX } },
2117 { "(bad)", { XX } },
2118 { "(bad)", { XX } },
2119 },
1ceb70f8 2120 /* REG_C7 */
4e7d34a6
L
2121 {
2122 { "movQ", { Ev, Iv } },
2123 { "(bad)", { XX } },
2124 { "(bad)", { XX } },
2125 { "(bad)", { XX } },
2126 { "(bad)", { XX } },
2127 { "(bad)", { XX } },
2128 { "(bad)", { XX } },
2129 { "(bad)", { XX } },
2130 },
1ceb70f8 2131 /* REG_D0 */
252b5132 2132 {
ce518a5f
L
2133 { "rolA", { Eb, I1 } },
2134 { "rorA", { Eb, I1 } },
2135 { "rclA", { Eb, I1 } },
2136 { "rcrA", { Eb, I1 } },
2137 { "shlA", { Eb, I1 } },
2138 { "shrA", { Eb, I1 } },
2139 { "(bad)", { XX } },
2140 { "sarA", { Eb, I1 } },
252b5132 2141 },
1ceb70f8 2142 /* REG_D1 */
252b5132 2143 {
ce518a5f
L
2144 { "rolQ", { Ev, I1 } },
2145 { "rorQ", { Ev, I1 } },
2146 { "rclQ", { Ev, I1 } },
2147 { "rcrQ", { Ev, I1 } },
2148 { "shlQ", { Ev, I1 } },
2149 { "shrQ", { Ev, I1 } },
2150 { "(bad)", { XX } },
2151 { "sarQ", { Ev, I1 } },
252b5132 2152 },
1ceb70f8 2153 /* REG_D2 */
252b5132 2154 {
ce518a5f
L
2155 { "rolA", { Eb, CL } },
2156 { "rorA", { Eb, CL } },
2157 { "rclA", { Eb, CL } },
2158 { "rcrA", { Eb, CL } },
2159 { "shlA", { Eb, CL } },
2160 { "shrA", { Eb, CL } },
2161 { "(bad)", { XX } },
2162 { "sarA", { Eb, CL } },
252b5132 2163 },
1ceb70f8 2164 /* REG_D3 */
252b5132 2165 {
ce518a5f
L
2166 { "rolQ", { Ev, CL } },
2167 { "rorQ", { Ev, CL } },
2168 { "rclQ", { Ev, CL } },
2169 { "rcrQ", { Ev, CL } },
2170 { "shlQ", { Ev, CL } },
2171 { "shrQ", { Ev, CL } },
2172 { "(bad)", { XX } },
2173 { "sarQ", { Ev, CL } },
252b5132 2174 },
1ceb70f8 2175 /* REG_F6 */
252b5132 2176 {
ce518a5f 2177 { "testA", { Eb, Ib } },
058f233b 2178 { "(bad)", { XX } },
ce518a5f
L
2179 { "notA", { Eb } },
2180 { "negA", { Eb } },
2181 { "mulA", { Eb } }, /* Don't print the implicit %al register, */
2182 { "imulA", { Eb } }, /* to distinguish these opcodes from other */
2183 { "divA", { Eb } }, /* mul/imul opcodes. Do the same for div */
2184 { "idivA", { Eb } }, /* and idiv for consistency. */
252b5132 2185 },
1ceb70f8 2186 /* REG_F7 */
252b5132 2187 {
ce518a5f
L
2188 { "testQ", { Ev, Iv } },
2189 { "(bad)", { XX } },
2190 { "notQ", { Ev } },
2191 { "negQ", { Ev } },
2192 { "mulQ", { Ev } }, /* Don't print the implicit register. */
2193 { "imulQ", { Ev } },
2194 { "divQ", { Ev } },
2195 { "idivQ", { Ev } },
252b5132 2196 },
1ceb70f8 2197 /* REG_FE */
252b5132 2198 {
ce518a5f
L
2199 { "incA", { Eb } },
2200 { "decA", { Eb } },
2201 { "(bad)", { XX } },
2202 { "(bad)", { XX } },
2203 { "(bad)", { XX } },
2204 { "(bad)", { XX } },
2205 { "(bad)", { XX } },
2206 { "(bad)", { XX } },
252b5132 2207 },
1ceb70f8 2208 /* REG_FF */
252b5132 2209 {
ce518a5f
L
2210 { "incQ", { Ev } },
2211 { "decQ", { Ev } },
2212 { "callT", { indirEv } },
2213 { "JcallT", { indirEp } },
2214 { "jmpT", { indirEv } },
2215 { "JjmpT", { indirEp } },
2216 { "pushU", { stackEv } },
2217 { "(bad)", { XX } },
252b5132 2218 },
1ceb70f8 2219 /* REG_0F00 */
252b5132 2220 {
ce518a5f
L
2221 { "sldtD", { Sv } },
2222 { "strD", { Sv } },
2223 { "lldt", { Ew } },
2224 { "ltr", { Ew } },
2225 { "verr", { Ew } },
2226 { "verw", { Ew } },
2227 { "(bad)", { XX } },
2228 { "(bad)", { XX } },
252b5132 2229 },
1ceb70f8 2230 /* REG_0F01 */
252b5132 2231 {
1ceb70f8
L
2232 { MOD_TABLE (MOD_0F01_REG_0) },
2233 { MOD_TABLE (MOD_0F01_REG_1) },
2234 { MOD_TABLE (MOD_0F01_REG_2) },
2235 { MOD_TABLE (MOD_0F01_REG_3) },
ce518a5f
L
2236 { "smswD", { Sv } },
2237 { "(bad)", { XX } },
2238 { "lmsw", { Ew } },
1ceb70f8 2239 { MOD_TABLE (MOD_0F01_REG_7) },
252b5132 2240 },
b5b1fc4f 2241 /* REG_0F0D */
252b5132 2242 {
4e7d34a6
L
2243 { "prefetch", { Eb } },
2244 { "prefetchw", { Eb } },
2245 { "(bad)", { XX } },
2246 { "(bad)", { XX } },
2247 { "(bad)", { XX } },
2248 { "(bad)", { XX } },
2249 { "(bad)", { XX } },
2250 { "(bad)", { XX } },
252b5132 2251 },
1ceb70f8 2252 /* REG_0F18 */
252b5132 2253 {
1ceb70f8
L
2254 { MOD_TABLE (MOD_0F18_REG_0) },
2255 { MOD_TABLE (MOD_0F18_REG_1) },
2256 { MOD_TABLE (MOD_0F18_REG_2) },
2257 { MOD_TABLE (MOD_0F18_REG_3) },
ce518a5f
L
2258 { "(bad)", { XX } },
2259 { "(bad)", { XX } },
2260 { "(bad)", { XX } },
2261 { "(bad)", { XX } },
252b5132 2262 },
1ceb70f8 2263 /* REG_0F71 */
a6bd098c 2264 {
ce518a5f
L
2265 { "(bad)", { XX } },
2266 { "(bad)", { XX } },
1ceb70f8 2267 { MOD_TABLE (MOD_0F71_REG_2) },
ce518a5f 2268 { "(bad)", { XX } },
1ceb70f8 2269 { MOD_TABLE (MOD_0F71_REG_4) },
ce518a5f 2270 { "(bad)", { XX } },
1ceb70f8 2271 { MOD_TABLE (MOD_0F71_REG_6) },
ce518a5f 2272 { "(bad)", { XX } },
a6bd098c 2273 },
1ceb70f8 2274 /* REG_0F72 */
a6bd098c 2275 {
ce518a5f
L
2276 { "(bad)", { XX } },
2277 { "(bad)", { XX } },
1ceb70f8 2278 { MOD_TABLE (MOD_0F72_REG_2) },
ce518a5f 2279 { "(bad)", { XX } },
1ceb70f8 2280 { MOD_TABLE (MOD_0F72_REG_4) },
ce518a5f 2281 { "(bad)", { XX } },
1ceb70f8 2282 { MOD_TABLE (MOD_0F72_REG_6) },
ce518a5f 2283 { "(bad)", { XX } },
a6bd098c 2284 },
1ceb70f8 2285 /* REG_0F73 */
252b5132 2286 {
ce518a5f
L
2287 { "(bad)", { XX } },
2288 { "(bad)", { XX } },
1ceb70f8
L
2289 { MOD_TABLE (MOD_0F73_REG_2) },
2290 { MOD_TABLE (MOD_0F73_REG_3) },
ce518a5f 2291 { "(bad)", { XX } },
ce518a5f 2292 { "(bad)", { XX } },
1ceb70f8
L
2293 { MOD_TABLE (MOD_0F73_REG_6) },
2294 { MOD_TABLE (MOD_0F73_REG_7) },
252b5132 2295 },
1ceb70f8 2296 /* REG_0FA6 */
252b5132 2297 {
4e7d34a6
L
2298 { "montmul", { { OP_0f07, 0 } } },
2299 { "xsha1", { { OP_0f07, 0 } } },
2300 { "xsha256", { { OP_0f07, 0 } } },
2301 { "(bad)", { { OP_0f07, 0 } } },
2302 { "(bad)", { { OP_0f07, 0 } } },
2303 { "(bad)", { { OP_0f07, 0 } } },
2304 { "(bad)", { { OP_0f07, 0 } } },
2305 { "(bad)", { { OP_0f07, 0 } } },
2306 },
1ceb70f8 2307 /* REG_0FA7 */
4e7d34a6
L
2308 {
2309 { "xstore-rng", { { OP_0f07, 0 } } },
2310 { "xcrypt-ecb", { { OP_0f07, 0 } } },
2311 { "xcrypt-cbc", { { OP_0f07, 0 } } },
2312 { "xcrypt-ctr", { { OP_0f07, 0 } } },
2313 { "xcrypt-cfb", { { OP_0f07, 0 } } },
2314 { "xcrypt-ofb", { { OP_0f07, 0 } } },
2315 { "(bad)", { { OP_0f07, 0 } } },
2316 { "(bad)", { { OP_0f07, 0 } } },
2317 },
1ceb70f8 2318 /* REG_0FAE */
4e7d34a6 2319 {
1ceb70f8
L
2320 { MOD_TABLE (MOD_0FAE_REG_0) },
2321 { MOD_TABLE (MOD_0FAE_REG_1) },
2322 { MOD_TABLE (MOD_0FAE_REG_2) },
2323 { MOD_TABLE (MOD_0FAE_REG_3) },
475a2301 2324 { MOD_TABLE (MOD_0FAE_REG_4) },
1ceb70f8
L
2325 { MOD_TABLE (MOD_0FAE_REG_5) },
2326 { MOD_TABLE (MOD_0FAE_REG_6) },
2327 { MOD_TABLE (MOD_0FAE_REG_7) },
252b5132 2328 },
1ceb70f8 2329 /* REG_0FBA */
252b5132 2330 {
ce518a5f
L
2331 { "(bad)", { XX } },
2332 { "(bad)", { XX } },
d8faab4e
L
2333 { "(bad)", { XX } },
2334 { "(bad)", { XX } },
4e7d34a6
L
2335 { "btQ", { Ev, Ib } },
2336 { "btsQ", { Ev, Ib } },
2337 { "btrQ", { Ev, Ib } },
2338 { "btcQ", { Ev, Ib } },
c608c12e 2339 },
1ceb70f8 2340 /* REG_0FC7 */
c608c12e 2341 {
b844680a 2342 { "(bad)", { XX } },
4e7d34a6 2343 { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } } },
d8faab4e 2344 { "(bad)", { XX } },
b844680a
L
2345 { "(bad)", { XX } },
2346 { "(bad)", { XX } },
2347 { "(bad)", { XX } },
1ceb70f8
L
2348 { MOD_TABLE (MOD_0FC7_REG_6) },
2349 { MOD_TABLE (MOD_0FC7_REG_7) },
252b5132 2350 },
c0f3af97
L
2351 /* REG_VEX_71 */
2352 {
2353 { "(bad)", { XX } },
2354 { "(bad)", { XX } },
2355 { MOD_TABLE (MOD_VEX_71_REG_2) },
2356 { "(bad)", { XX } },
2357 { MOD_TABLE (MOD_VEX_71_REG_4) },
2358 { "(bad)", { XX } },
2359 { MOD_TABLE (MOD_VEX_71_REG_6) },
2360 { "(bad)", { XX } },
2361 },
2362 /* REG_VEX_72 */
2363 {
2364 { "(bad)", { XX } },
2365 { "(bad)", { XX } },
2366 { MOD_TABLE (MOD_VEX_72_REG_2) },
2367 { "(bad)", { XX } },
2368 { MOD_TABLE (MOD_VEX_72_REG_4) },
2369 { "(bad)", { XX } },
2370 { MOD_TABLE (MOD_VEX_72_REG_6) },
2371 { "(bad)", { XX } },
2372 },
2373 /* REG_VEX_73 */
2374 {
2375 { "(bad)", { XX } },
2376 { "(bad)", { XX } },
2377 { MOD_TABLE (MOD_VEX_73_REG_2) },
2378 { MOD_TABLE (MOD_VEX_73_REG_3) },
2379 { "(bad)", { XX } },
2380 { "(bad)", { XX } },
2381 { MOD_TABLE (MOD_VEX_73_REG_6) },
2382 { MOD_TABLE (MOD_VEX_73_REG_7) },
2383 },
2384 /* REG_VEX_AE */
2385 {
2386 { "(bad)", { XX } },
2387 { "(bad)", { XX } },
2388 { MOD_TABLE (MOD_VEX_AE_REG_2) },
2389 { MOD_TABLE (MOD_VEX_AE_REG_3) },
2390 { "(bad)", { XX } },
2391 { "(bad)", { XX } },
2392 { "(bad)", { XX } },
2393 { "(bad)", { XX } },
2394 },
4e7d34a6
L
2395};
2396
1ceb70f8
L
2397static const struct dis386 prefix_table[][4] = {
2398 /* PREFIX_90 */
252b5132 2399 {
4e7d34a6
L
2400 { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } } },
2401 { "pause", { XX } },
2402 { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } } },
2403 { "(bad)", { XX } },
0f10071e 2404 },
4e7d34a6 2405
1ceb70f8 2406 /* PREFIX_0F10 */
cc0ec051 2407 {
4e7d34a6
L
2408 { "movups", { XM, EXx } },
2409 { "movss", { XM, EXd } },
2410 { "movupd", { XM, EXx } },
2411 { "movsd", { XM, EXq } },
30d1c836 2412 },
4e7d34a6 2413
1ceb70f8 2414 /* PREFIX_0F11 */
30d1c836 2415 {
d5d7db8e
L
2416 { "movups", { EXx, XM } },
2417 { "movss", { EXd, XM } },
2418 { "movupd", { EXx, XM } },
2419 { "movsd", { EXq, XM } },
4e7d34a6 2420 },
252b5132 2421
1ceb70f8 2422 /* PREFIX_0F12 */
c608c12e 2423 {
1ceb70f8 2424 { MOD_TABLE (MOD_0F12_PREFIX_0) },
4e7d34a6
L
2425 { "movsldup", { XM, EXx } },
2426 { "movlpd", { XM, EXq } },
2427 { "movddup", { XM, EXq } },
c608c12e 2428 },
4e7d34a6 2429
1ceb70f8 2430 /* PREFIX_0F16 */
c608c12e 2431 {
1ceb70f8 2432 { MOD_TABLE (MOD_0F16_PREFIX_0) },
4e7d34a6
L
2433 { "movshdup", { XM, EXx } },
2434 { "movhpd", { XM, EXq } },
058f233b 2435 { "(bad)", { XX } },
c608c12e 2436 },
4e7d34a6 2437
1ceb70f8 2438 /* PREFIX_0F2A */
c608c12e 2439 {
09335d05 2440 { "cvtpi2ps", { XM, EMCq } },
98b528ac 2441 { "cvtsi2ss%LQ", { XM, Ev } },
09335d05 2442 { "cvtpi2pd", { XM, EMCq } },
98b528ac 2443 { "cvtsi2sd%LQ", { XM, Ev } },
c608c12e 2444 },
4e7d34a6 2445
1ceb70f8 2446 /* PREFIX_0F2B */
c608c12e 2447 {
75c135a8
L
2448 { MOD_TABLE (MOD_0F2B_PREFIX_0) },
2449 { MOD_TABLE (MOD_0F2B_PREFIX_1) },
2450 { MOD_TABLE (MOD_0F2B_PREFIX_2) },
2451 { MOD_TABLE (MOD_0F2B_PREFIX_3) },
c608c12e 2452 },
4e7d34a6 2453
1ceb70f8 2454 /* PREFIX_0F2C */
c608c12e 2455 {
09335d05
L
2456 { "cvttps2pi", { MXC, EXq } },
2457 { "cvttss2siY", { Gv, EXd } },
09a2c6cf 2458 { "cvttpd2pi", { MXC, EXx } },
09335d05 2459 { "cvttsd2siY", { Gv, EXq } },
c608c12e 2460 },
4e7d34a6 2461
1ceb70f8 2462 /* PREFIX_0F2D */
c608c12e 2463 {
4e7d34a6
L
2464 { "cvtps2pi", { MXC, EXq } },
2465 { "cvtss2siY", { Gv, EXd } },
2466 { "cvtpd2pi", { MXC, EXx } },
2467 { "cvtsd2siY", { Gv, EXq } },
c608c12e 2468 },
4e7d34a6 2469
1ceb70f8 2470 /* PREFIX_0F2E */
c608c12e 2471 {
4e7d34a6
L
2472 { "ucomiss",{ XM, EXd } },
2473 { "(bad)", { XX } },
2474 { "ucomisd",{ XM, EXq } },
2475 { "(bad)", { XX } },
c608c12e 2476 },
4e7d34a6 2477
1ceb70f8 2478 /* PREFIX_0F2F */
c608c12e 2479 {
4e7d34a6
L
2480 { "comiss", { XM, EXd } },
2481 { "(bad)", { XX } },
2482 { "comisd", { XM, EXq } },
2483 { "(bad)", { XX } },
c608c12e 2484 },
4e7d34a6 2485
1ceb70f8 2486 /* PREFIX_0F51 */
c608c12e 2487 {
4e7d34a6
L
2488 { "sqrtps", { XM, EXx } },
2489 { "sqrtss", { XM, EXd } },
2490 { "sqrtpd", { XM, EXx } },
2491 { "sqrtsd", { XM, EXq } },
c608c12e 2492 },
4e7d34a6 2493
1ceb70f8 2494 /* PREFIX_0F52 */
c608c12e 2495 {
4e7d34a6
L
2496 { "rsqrtps",{ XM, EXx } },
2497 { "rsqrtss",{ XM, EXd } },
058f233b
L
2498 { "(bad)", { XX } },
2499 { "(bad)", { XX } },
c608c12e 2500 },
4e7d34a6 2501
1ceb70f8 2502 /* PREFIX_0F53 */
c608c12e 2503 {
4e7d34a6
L
2504 { "rcpps", { XM, EXx } },
2505 { "rcpss", { XM, EXd } },
058f233b
L
2506 { "(bad)", { XX } },
2507 { "(bad)", { XX } },
c608c12e 2508 },
4e7d34a6 2509
1ceb70f8 2510 /* PREFIX_0F58 */
c608c12e 2511 {
4e7d34a6
L
2512 { "addps", { XM, EXx } },
2513 { "addss", { XM, EXd } },
2514 { "addpd", { XM, EXx } },
2515 { "addsd", { XM, EXq } },
c608c12e 2516 },
4e7d34a6 2517
1ceb70f8 2518 /* PREFIX_0F59 */
c608c12e 2519 {
4e7d34a6
L
2520 { "mulps", { XM, EXx } },
2521 { "mulss", { XM, EXd } },
2522 { "mulpd", { XM, EXx } },
2523 { "mulsd", { XM, EXq } },
041bd2e0 2524 },
4e7d34a6 2525
1ceb70f8 2526 /* PREFIX_0F5A */
041bd2e0 2527 {
4e7d34a6
L
2528 { "cvtps2pd", { XM, EXq } },
2529 { "cvtss2sd", { XM, EXd } },
2530 { "cvtpd2ps", { XM, EXx } },
2531 { "cvtsd2ss", { XM, EXq } },
041bd2e0 2532 },
4e7d34a6 2533
1ceb70f8 2534 /* PREFIX_0F5B */
041bd2e0 2535 {
09a2c6cf
L
2536 { "cvtdq2ps", { XM, EXx } },
2537 { "cvttps2dq", { XM, EXx } },
2538 { "cvtps2dq", { XM, EXx } },
058f233b 2539 { "(bad)", { XX } },
041bd2e0 2540 },
4e7d34a6 2541
1ceb70f8 2542 /* PREFIX_0F5C */
041bd2e0 2543 {
4e7d34a6
L
2544 { "subps", { XM, EXx } },
2545 { "subss", { XM, EXd } },
2546 { "subpd", { XM, EXx } },
2547 { "subsd", { XM, EXq } },
041bd2e0 2548 },
4e7d34a6 2549
1ceb70f8 2550 /* PREFIX_0F5D */
041bd2e0 2551 {
4e7d34a6
L
2552 { "minps", { XM, EXx } },
2553 { "minss", { XM, EXd } },
2554 { "minpd", { XM, EXx } },
2555 { "minsd", { XM, EXq } },
041bd2e0 2556 },
4e7d34a6 2557
1ceb70f8 2558 /* PREFIX_0F5E */
041bd2e0 2559 {
4e7d34a6
L
2560 { "divps", { XM, EXx } },
2561 { "divss", { XM, EXd } },
2562 { "divpd", { XM, EXx } },
2563 { "divsd", { XM, EXq } },
041bd2e0 2564 },
4e7d34a6 2565
1ceb70f8 2566 /* PREFIX_0F5F */
041bd2e0 2567 {
4e7d34a6
L
2568 { "maxps", { XM, EXx } },
2569 { "maxss", { XM, EXd } },
2570 { "maxpd", { XM, EXx } },
2571 { "maxsd", { XM, EXq } },
041bd2e0 2572 },
4e7d34a6 2573
1ceb70f8 2574 /* PREFIX_0F60 */
041bd2e0 2575 {
4e7d34a6
L
2576 { "punpcklbw",{ MX, EMd } },
2577 { "(bad)", { XX } },
2578 { "punpcklbw",{ MX, EMx } },
2579 { "(bad)", { XX } },
041bd2e0 2580 },
4e7d34a6 2581
1ceb70f8 2582 /* PREFIX_0F61 */
041bd2e0 2583 {
4e7d34a6
L
2584 { "punpcklwd",{ MX, EMd } },
2585 { "(bad)", { XX } },
2586 { "punpcklwd",{ MX, EMx } },
2587 { "(bad)", { XX } },
041bd2e0 2588 },
4e7d34a6 2589
1ceb70f8 2590 /* PREFIX_0F62 */
041bd2e0 2591 {
4e7d34a6
L
2592 { "punpckldq",{ MX, EMd } },
2593 { "(bad)", { XX } },
2594 { "punpckldq",{ MX, EMx } },
2595 { "(bad)", { XX } },
041bd2e0 2596 },
4e7d34a6 2597
1ceb70f8 2598 /* PREFIX_0F6C */
041bd2e0 2599 {
058f233b
L
2600 { "(bad)", { XX } },
2601 { "(bad)", { XX } },
4e7d34a6 2602 { "punpcklqdq", { XM, EXx } },
058f233b 2603 { "(bad)", { XX } },
0f17484f 2604 },
4e7d34a6 2605
1ceb70f8 2606 /* PREFIX_0F6D */
0f17484f 2607 {
058f233b
L
2608 { "(bad)", { XX } },
2609 { "(bad)", { XX } },
4e7d34a6 2610 { "punpckhqdq", { XM, EXx } },
058f233b 2611 { "(bad)", { XX } },
041bd2e0 2612 },
4e7d34a6 2613
1ceb70f8 2614 /* PREFIX_0F6F */
ca164297 2615 {
4e7d34a6
L
2616 { "movq", { MX, EM } },
2617 { "movdqu", { XM, EXx } },
2618 { "movdqa", { XM, EXx } },
058f233b 2619 { "(bad)", { XX } },
ca164297 2620 },
4e7d34a6 2621
1ceb70f8 2622 /* PREFIX_0F70 */
4e7d34a6
L
2623 {
2624 { "pshufw", { MX, EM, Ib } },
2625 { "pshufhw",{ XM, EXx, Ib } },
2626 { "pshufd", { XM, EXx, Ib } },
2627 { "pshuflw",{ XM, EXx, Ib } },
2628 },
2629
92fddf8e
L
2630 /* PREFIX_0F73_REG_3 */
2631 {
2632 { "(bad)", { XX } },
2633 { "(bad)", { XX } },
2634 { "psrldq", { XS, Ib } },
2635 { "(bad)", { XX } },
2636 },
2637
2638 /* PREFIX_0F73_REG_7 */
2639 {
2640 { "(bad)", { XX } },
2641 { "(bad)", { XX } },
2642 { "pslldq", { XS, Ib } },
2643 { "(bad)", { XX } },
2644 },
2645
1ceb70f8 2646 /* PREFIX_0F78 */
4e7d34a6
L
2647 {
2648 {"vmread", { Em, Gm } },
2649 {"(bad)", { XX } },
2650 {"extrq", { XS, Ib, Ib } },
2651 {"insertq", { XM, XS, Ib, Ib } },
2652 },
2653
1ceb70f8 2654 /* PREFIX_0F79 */
4e7d34a6
L
2655 {
2656 {"vmwrite", { Gm, Em } },
2657 {"(bad)", { XX } },
2658 {"extrq", { XM, XS } },
2659 {"insertq", { XM, XS } },
2660 },
2661
1ceb70f8 2662 /* PREFIX_0F7C */
ca164297 2663 {
058f233b
L
2664 { "(bad)", { XX } },
2665 { "(bad)", { XX } },
09a2c6cf
L
2666 { "haddpd", { XM, EXx } },
2667 { "haddps", { XM, EXx } },
ca164297 2668 },
4e7d34a6 2669
1ceb70f8 2670 /* PREFIX_0F7D */
ca164297 2671 {
058f233b
L
2672 { "(bad)", { XX } },
2673 { "(bad)", { XX } },
09a2c6cf
L
2674 { "hsubpd", { XM, EXx } },
2675 { "hsubps", { XM, EXx } },
ca164297 2676 },
4e7d34a6 2677
1ceb70f8 2678 /* PREFIX_0F7E */
ca164297 2679 {
4e7d34a6
L
2680 { "movK", { Edq, MX } },
2681 { "movq", { XM, EXq } },
2682 { "movK", { Edq, XM } },
058f233b 2683 { "(bad)", { XX } },
ca164297 2684 },
4e7d34a6 2685
1ceb70f8 2686 /* PREFIX_0F7F */
ca164297 2687 {
4e7d34a6 2688 { "movq", { EM, MX } },
d5d7db8e
L
2689 { "movdqu", { EXx, XM } },
2690 { "movdqa", { EXx, XM } },
058f233b 2691 { "(bad)", { XX } },
ca164297 2692 },
4e7d34a6 2693
1ceb70f8 2694 /* PREFIX_0FB8 */
ca164297 2695 {
4e7d34a6
L
2696 { "(bad)", { XX } },
2697 { "popcntS", { Gv, Ev } },
2698 { "(bad)", { XX } },
2699 { "(bad)", { XX } },
ca164297 2700 },
4e7d34a6 2701
1ceb70f8 2702 /* PREFIX_0FBD */
050dfa73 2703 {
4e7d34a6
L
2704 { "bsrS", { Gv, Ev } },
2705 { "lzcntS", { Gv, Ev } },
2706 { "bsrS", { Gv, Ev } },
2707 { "(bad)", { XX } },
050dfa73
MM
2708 },
2709
1ceb70f8 2710 /* PREFIX_0FC2 */
050dfa73 2711 {
ad19981d
L
2712 { "cmpps", { XM, EXx, CMP } },
2713 { "cmpss", { XM, EXd, CMP } },
2714 { "cmppd", { XM, EXx, CMP } },
2715 { "cmpsd", { XM, EXq, CMP } },
050dfa73 2716 },
246c51aa 2717
4ee52178
L
2718 /* PREFIX_0FC3 */
2719 {
2720 { "movntiS", { Ma, Gv } },
2721 { "(bad)", { XX } },
2722 { "(bad)", { XX } },
2723 { "(bad)", { XX } },
2724 },
2725
92fddf8e
L
2726 /* PREFIX_0FC7_REG_6 */
2727 {
2728 { "vmptrld",{ Mq } },
2729 { "vmxon", { Mq } },
2730 { "vmclear",{ Mq } },
2731 { "(bad)", { XX } },
2732 },
2733
1ceb70f8 2734 /* PREFIX_0FD0 */
050dfa73 2735 {
058f233b
L
2736 { "(bad)", { XX } },
2737 { "(bad)", { XX } },
4e7d34a6
L
2738 { "addsubpd", { XM, EXx } },
2739 { "addsubps", { XM, EXx } },
246c51aa 2740 },
050dfa73 2741
1ceb70f8 2742 /* PREFIX_0FD6 */
050dfa73 2743 {
058f233b 2744 { "(bad)", { XX } },
4e7d34a6
L
2745 { "movq2dq",{ XM, MS } },
2746 { "movq", { EXq, XM } },
2747 { "movdq2q",{ MX, XS } },
050dfa73
MM
2748 },
2749
1ceb70f8 2750 /* PREFIX_0FE6 */
7918206c 2751 {
058f233b 2752 { "(bad)", { XX } },
4e7d34a6
L
2753 { "cvtdq2pd", { XM, EXq } },
2754 { "cvttpd2dq", { XM, EXx } },
2755 { "cvtpd2dq", { XM, EXx } },
7918206c 2756 },
8b38ad71 2757
1ceb70f8 2758 /* PREFIX_0FE7 */
8b38ad71 2759 {
4ee52178 2760 { "movntq", { Mq, MX } },
058f233b 2761 { "(bad)", { XX } },
75c135a8 2762 { MOD_TABLE (MOD_0FE7_PREFIX_2) },
058f233b 2763 { "(bad)", { XX } },
4e7d34a6
L
2764 },
2765
1ceb70f8 2766 /* PREFIX_0FF0 */
4e7d34a6 2767 {
058f233b
L
2768 { "(bad)", { XX } },
2769 { "(bad)", { XX } },
2770 { "(bad)", { XX } },
1ceb70f8 2771 { MOD_TABLE (MOD_0FF0_PREFIX_3) },
4e7d34a6
L
2772 },
2773
1ceb70f8 2774 /* PREFIX_0FF7 */
4e7d34a6
L
2775 {
2776 { "maskmovq", { MX, MS } },
058f233b 2777 { "(bad)", { XX } },
4e7d34a6 2778 { "maskmovdqu", { XM, XS } },
058f233b 2779 { "(bad)", { XX } },
8b38ad71 2780 },
42903f7f 2781
1ceb70f8 2782 /* PREFIX_0F3810 */
42903f7f
L
2783 {
2784 { "(bad)", { XX } },
2785 { "(bad)", { XX } },
88a94849 2786 { "pblendvb", { XM, EXx, XMM0 } },
42903f7f
L
2787 { "(bad)", { XX } },
2788 },
2789
1ceb70f8 2790 /* PREFIX_0F3814 */
42903f7f
L
2791 {
2792 { "(bad)", { XX } },
2793 { "(bad)", { XX } },
88a94849 2794 { "blendvps", { XM, EXx, XMM0 } },
42903f7f
L
2795 { "(bad)", { XX } },
2796 },
2797
1ceb70f8 2798 /* PREFIX_0F3815 */
42903f7f
L
2799 {
2800 { "(bad)", { XX } },
2801 { "(bad)", { XX } },
09a2c6cf 2802 { "blendvpd", { XM, EXx, XMM0 } },
42903f7f
L
2803 { "(bad)", { XX } },
2804 },
2805
1ceb70f8 2806 /* PREFIX_0F3817 */
42903f7f
L
2807 {
2808 { "(bad)", { XX } },
2809 { "(bad)", { XX } },
09a2c6cf 2810 { "ptest", { XM, EXx } },
42903f7f
L
2811 { "(bad)", { XX } },
2812 },
2813
1ceb70f8 2814 /* PREFIX_0F3820 */
42903f7f
L
2815 {
2816 { "(bad)", { XX } },
2817 { "(bad)", { XX } },
8976381e 2818 { "pmovsxbw", { XM, EXq } },
42903f7f
L
2819 { "(bad)", { XX } },
2820 },
2821
1ceb70f8 2822 /* PREFIX_0F3821 */
42903f7f
L
2823 {
2824 { "(bad)", { XX } },
2825 { "(bad)", { XX } },
8976381e 2826 { "pmovsxbd", { XM, EXd } },
42903f7f
L
2827 { "(bad)", { XX } },
2828 },
2829
1ceb70f8 2830 /* PREFIX_0F3822 */
42903f7f
L
2831 {
2832 { "(bad)", { XX } },
2833 { "(bad)", { XX } },
8976381e 2834 { "pmovsxbq", { XM, EXw } },
42903f7f
L
2835 { "(bad)", { XX } },
2836 },
2837
1ceb70f8 2838 /* PREFIX_0F3823 */
42903f7f
L
2839 {
2840 { "(bad)", { XX } },
2841 { "(bad)", { XX } },
8976381e 2842 { "pmovsxwd", { XM, EXq } },
42903f7f
L
2843 { "(bad)", { XX } },
2844 },
2845
1ceb70f8 2846 /* PREFIX_0F3824 */
42903f7f
L
2847 {
2848 { "(bad)", { XX } },
2849 { "(bad)", { XX } },
8976381e 2850 { "pmovsxwq", { XM, EXd } },
42903f7f
L
2851 { "(bad)", { XX } },
2852 },
2853
1ceb70f8 2854 /* PREFIX_0F3825 */
42903f7f
L
2855 {
2856 { "(bad)", { XX } },
2857 { "(bad)", { XX } },
8976381e 2858 { "pmovsxdq", { XM, EXq } },
42903f7f
L
2859 { "(bad)", { XX } },
2860 },
2861
1ceb70f8 2862 /* PREFIX_0F3828 */
42903f7f
L
2863 {
2864 { "(bad)", { XX } },
2865 { "(bad)", { XX } },
09a2c6cf 2866 { "pmuldq", { XM, EXx } },
42903f7f
L
2867 { "(bad)", { XX } },
2868 },
2869
1ceb70f8 2870 /* PREFIX_0F3829 */
42903f7f
L
2871 {
2872 { "(bad)", { XX } },
2873 { "(bad)", { XX } },
09a2c6cf 2874 { "pcmpeqq", { XM, EXx } },
42903f7f
L
2875 { "(bad)", { XX } },
2876 },
2877
1ceb70f8 2878 /* PREFIX_0F382A */
42903f7f
L
2879 {
2880 { "(bad)", { XX } },
2881 { "(bad)", { XX } },
75c135a8 2882 { MOD_TABLE (MOD_0F382A_PREFIX_2) },
42903f7f
L
2883 { "(bad)", { XX } },
2884 },
2885
1ceb70f8 2886 /* PREFIX_0F382B */
42903f7f
L
2887 {
2888 { "(bad)", { XX } },
2889 { "(bad)", { XX } },
09a2c6cf 2890 { "packusdw", { XM, EXx } },
42903f7f
L
2891 { "(bad)", { XX } },
2892 },
2893
1ceb70f8 2894 /* PREFIX_0F3830 */
42903f7f
L
2895 {
2896 { "(bad)", { XX } },
2897 { "(bad)", { XX } },
8976381e 2898 { "pmovzxbw", { XM, EXq } },
42903f7f
L
2899 { "(bad)", { XX } },
2900 },
2901
1ceb70f8 2902 /* PREFIX_0F3831 */
42903f7f
L
2903 {
2904 { "(bad)", { XX } },
2905 { "(bad)", { XX } },
8976381e 2906 { "pmovzxbd", { XM, EXd } },
42903f7f
L
2907 { "(bad)", { XX } },
2908 },
2909
1ceb70f8 2910 /* PREFIX_0F3832 */
42903f7f
L
2911 {
2912 { "(bad)", { XX } },
2913 { "(bad)", { XX } },
8976381e 2914 { "pmovzxbq", { XM, EXw } },
42903f7f
L
2915 { "(bad)", { XX } },
2916 },
2917
1ceb70f8 2918 /* PREFIX_0F3833 */
42903f7f
L
2919 {
2920 { "(bad)", { XX } },
2921 { "(bad)", { XX } },
8976381e 2922 { "pmovzxwd", { XM, EXq } },
42903f7f
L
2923 { "(bad)", { XX } },
2924 },
2925
1ceb70f8 2926 /* PREFIX_0F3834 */
42903f7f
L
2927 {
2928 { "(bad)", { XX } },
2929 { "(bad)", { XX } },
8976381e 2930 { "pmovzxwq", { XM, EXd } },
42903f7f
L
2931 { "(bad)", { XX } },
2932 },
2933
1ceb70f8 2934 /* PREFIX_0F3835 */
42903f7f
L
2935 {
2936 { "(bad)", { XX } },
2937 { "(bad)", { XX } },
8976381e 2938 { "pmovzxdq", { XM, EXq } },
42903f7f
L
2939 { "(bad)", { XX } },
2940 },
2941
1ceb70f8 2942 /* PREFIX_0F3837 */
4e7d34a6
L
2943 {
2944 { "(bad)", { XX } },
2945 { "(bad)", { XX } },
2946 { "pcmpgtq", { XM, EXx } },
2947 { "(bad)", { XX } },
2948 },
2949
1ceb70f8 2950 /* PREFIX_0F3838 */
42903f7f
L
2951 {
2952 { "(bad)", { XX } },
2953 { "(bad)", { XX } },
09a2c6cf 2954 { "pminsb", { XM, EXx } },
42903f7f
L
2955 { "(bad)", { XX } },
2956 },
2957
1ceb70f8 2958 /* PREFIX_0F3839 */
42903f7f
L
2959 {
2960 { "(bad)", { XX } },
2961 { "(bad)", { XX } },
09a2c6cf 2962 { "pminsd", { XM, EXx } },
42903f7f
L
2963 { "(bad)", { XX } },
2964 },
2965
1ceb70f8 2966 /* PREFIX_0F383A */
42903f7f
L
2967 {
2968 { "(bad)", { XX } },
2969 { "(bad)", { XX } },
09a2c6cf 2970 { "pminuw", { XM, EXx } },
42903f7f
L
2971 { "(bad)", { XX } },
2972 },
2973
1ceb70f8 2974 /* PREFIX_0F383B */
42903f7f
L
2975 {
2976 { "(bad)", { XX } },
2977 { "(bad)", { XX } },
09a2c6cf 2978 { "pminud", { XM, EXx } },
42903f7f
L
2979 { "(bad)", { XX } },
2980 },
2981
1ceb70f8 2982 /* PREFIX_0F383C */
42903f7f
L
2983 {
2984 { "(bad)", { XX } },
2985 { "(bad)", { XX } },
09a2c6cf 2986 { "pmaxsb", { XM, EXx } },
42903f7f
L
2987 { "(bad)", { XX } },
2988 },
2989
1ceb70f8 2990 /* PREFIX_0F383D */
42903f7f
L
2991 {
2992 { "(bad)", { XX } },
2993 { "(bad)", { XX } },
09a2c6cf 2994 { "pmaxsd", { XM, EXx } },
42903f7f
L
2995 { "(bad)", { XX } },
2996 },
2997
1ceb70f8 2998 /* PREFIX_0F383E */
42903f7f
L
2999 {
3000 { "(bad)", { XX } },
3001 { "(bad)", { XX } },
09a2c6cf 3002 { "pmaxuw", { XM, EXx } },
42903f7f
L
3003 { "(bad)", { XX } },
3004 },
3005
1ceb70f8 3006 /* PREFIX_0F383F */
42903f7f
L
3007 {
3008 { "(bad)", { XX } },
3009 { "(bad)", { XX } },
09a2c6cf 3010 { "pmaxud", { XM, EXx } },
42903f7f
L
3011 { "(bad)", { XX } },
3012 },
3013
1ceb70f8 3014 /* PREFIX_0F3840 */
42903f7f
L
3015 {
3016 { "(bad)", { XX } },
3017 { "(bad)", { XX } },
09a2c6cf 3018 { "pmulld", { XM, EXx } },
42903f7f
L
3019 { "(bad)", { XX } },
3020 },
3021
1ceb70f8 3022 /* PREFIX_0F3841 */
42903f7f
L
3023 {
3024 { "(bad)", { XX } },
3025 { "(bad)", { XX } },
09a2c6cf 3026 { "phminposuw", { XM, EXx } },
42903f7f
L
3027 { "(bad)", { XX } },
3028 },
3029
f1f8f695
L
3030 /* PREFIX_0F3880 */
3031 {
3032 { "(bad)", { XX } },
3033 { "(bad)", { XX } },
3034 { "invept", { Gm, Mo } },
3035 { "(bad)", { XX } },
3036 },
3037
3038 /* PREFIX_0F3881 */
3039 {
3040 { "(bad)", { XX } },
3041 { "(bad)", { XX } },
3042 { "invvpid", { Gm, Mo } },
3043 { "(bad)", { XX } },
3044 },
3045
c0f3af97
L
3046 /* PREFIX_0F38DB */
3047 {
3048 { "(bad)", { XX } },
3049 { "(bad)", { XX } },
3050 { "aesimc", { XM, EXx } },
3051 { "(bad)", { XX } },
3052 },
3053
3054 /* PREFIX_0F38DC */
3055 {
3056 { "(bad)", { XX } },
3057 { "(bad)", { XX } },
3058 { "aesenc", { XM, EXx } },
3059 { "(bad)", { XX } },
3060 },
3061
3062 /* PREFIX_0F38DD */
3063 {
3064 { "(bad)", { XX } },
3065 { "(bad)", { XX } },
3066 { "aesenclast", { XM, EXx } },
3067 { "(bad)", { XX } },
3068 },
3069
3070 /* PREFIX_0F38DE */
3071 {
3072 { "(bad)", { XX } },
3073 { "(bad)", { XX } },
3074 { "aesdec", { XM, EXx } },
3075 { "(bad)", { XX } },
3076 },
3077
3078 /* PREFIX_0F38DF */
3079 {
3080 { "(bad)", { XX } },
3081 { "(bad)", { XX } },
3082 { "aesdeclast", { XM, EXx } },
3083 { "(bad)", { XX } },
3084 },
3085
1ceb70f8 3086 /* PREFIX_0F38F0 */
4e7d34a6 3087 {
f1f8f695 3088 { "movbeS", { Gv, { MOVBE_Fixup, v_mode } } },
4e7d34a6 3089 { "(bad)", { XX } },
f1f8f695 3090 { "movbeS", { Gv, { MOVBE_Fixup, v_mode } } },
4e7d34a6
L
3091 { "crc32", { Gdq, { CRC32_Fixup, b_mode } } },
3092 },
3093
1ceb70f8 3094 /* PREFIX_0F38F1 */
4e7d34a6 3095 {
f1f8f695 3096 { "movbeS", { { MOVBE_Fixup, v_mode }, Gv } },
4e7d34a6 3097 { "(bad)", { XX } },
f1f8f695 3098 { "movbeS", { { MOVBE_Fixup, v_mode }, Gv } },
4e7d34a6
L
3099 { "crc32", { Gdq, { CRC32_Fixup, v_mode } } },
3100 },
3101
1ceb70f8 3102 /* PREFIX_0F3A08 */
42903f7f
L
3103 {
3104 { "(bad)", { XX } },
3105 { "(bad)", { XX } },
09a2c6cf 3106 { "roundps", { XM, EXx, Ib } },
42903f7f
L
3107 { "(bad)", { XX } },
3108 },
3109
1ceb70f8 3110 /* PREFIX_0F3A09 */
42903f7f
L
3111 {
3112 { "(bad)", { XX } },
3113 { "(bad)", { XX } },
09a2c6cf 3114 { "roundpd", { XM, EXx, Ib } },
42903f7f
L
3115 { "(bad)", { XX } },
3116 },
3117
1ceb70f8 3118 /* PREFIX_0F3A0A */
42903f7f
L
3119 {
3120 { "(bad)", { XX } },
3121 { "(bad)", { XX } },
09335d05 3122 { "roundss", { XM, EXd, Ib } },
42903f7f
L
3123 { "(bad)", { XX } },
3124 },
3125
1ceb70f8 3126 /* PREFIX_0F3A0B */
42903f7f
L
3127 {
3128 { "(bad)", { XX } },
3129 { "(bad)", { XX } },
09335d05 3130 { "roundsd", { XM, EXq, Ib } },
42903f7f
L
3131 { "(bad)", { XX } },
3132 },
3133
1ceb70f8 3134 /* PREFIX_0F3A0C */
42903f7f
L
3135 {
3136 { "(bad)", { XX } },
3137 { "(bad)", { XX } },
09a2c6cf 3138 { "blendps", { XM, EXx, Ib } },
42903f7f
L
3139 { "(bad)", { XX } },
3140 },
3141
1ceb70f8 3142 /* PREFIX_0F3A0D */
42903f7f
L
3143 {
3144 { "(bad)", { XX } },
3145 { "(bad)", { XX } },
09a2c6cf 3146 { "blendpd", { XM, EXx, Ib } },
42903f7f
L
3147 { "(bad)", { XX } },
3148 },
3149
1ceb70f8 3150 /* PREFIX_0F3A0E */
42903f7f
L
3151 {
3152 { "(bad)", { XX } },
3153 { "(bad)", { XX } },
09a2c6cf 3154 { "pblendw", { XM, EXx, Ib } },
42903f7f
L
3155 { "(bad)", { XX } },
3156 },
3157
1ceb70f8 3158 /* PREFIX_0F3A14 */
42903f7f
L
3159 {
3160 { "(bad)", { XX } },
3161 { "(bad)", { XX } },
3162 { "pextrb", { Edqb, XM, Ib } },
3163 { "(bad)", { XX } },
3164 },
3165
1ceb70f8 3166 /* PREFIX_0F3A15 */
42903f7f
L
3167 {
3168 { "(bad)", { XX } },
3169 { "(bad)", { XX } },
3170 { "pextrw", { Edqw, XM, Ib } },
3171 { "(bad)", { XX } },
3172 },
3173
1ceb70f8 3174 /* PREFIX_0F3A16 */
42903f7f
L
3175 {
3176 { "(bad)", { XX } },
3177 { "(bad)", { XX } },
3178 { "pextrK", { Edq, XM, Ib } },
3179 { "(bad)", { XX } },
3180 },
3181
1ceb70f8 3182 /* PREFIX_0F3A17 */
42903f7f
L
3183 {
3184 { "(bad)", { XX } },
3185 { "(bad)", { XX } },
3186 { "extractps", { Edqd, XM, Ib } },
3187 { "(bad)", { XX } },
3188 },
3189
1ceb70f8 3190 /* PREFIX_0F3A20 */
42903f7f
L
3191 {
3192 { "(bad)", { XX } },
3193 { "(bad)", { XX } },
3194 { "pinsrb", { XM, Edqb, Ib } },
3195 { "(bad)", { XX } },
3196 },
3197
1ceb70f8 3198 /* PREFIX_0F3A21 */
42903f7f
L
3199 {
3200 { "(bad)", { XX } },
3201 { "(bad)", { XX } },
8976381e 3202 { "insertps", { XM, EXd, Ib } },
42903f7f
L
3203 { "(bad)", { XX } },
3204 },
3205
1ceb70f8 3206 /* PREFIX_0F3A22 */
42903f7f
L
3207 {
3208 { "(bad)", { XX } },
3209 { "(bad)", { XX } },
3210 { "pinsrK", { XM, Edq, Ib } },
3211 { "(bad)", { XX } },
3212 },
3213
1ceb70f8 3214 /* PREFIX_0F3A40 */
42903f7f
L
3215 {
3216 { "(bad)", { XX } },
3217 { "(bad)", { XX } },
09a2c6cf 3218 { "dpps", { XM, EXx, Ib } },
42903f7f
L
3219 { "(bad)", { XX } },
3220 },
3221
1ceb70f8 3222 /* PREFIX_0F3A41 */
42903f7f
L
3223 {
3224 { "(bad)", { XX } },
3225 { "(bad)", { XX } },
09a2c6cf 3226 { "dppd", { XM, EXx, Ib } },
42903f7f
L
3227 { "(bad)", { XX } },
3228 },
3229
1ceb70f8 3230 /* PREFIX_0F3A42 */
42903f7f
L
3231 {
3232 { "(bad)", { XX } },
3233 { "(bad)", { XX } },
09a2c6cf 3234 { "mpsadbw", { XM, EXx, Ib } },
42903f7f
L
3235 { "(bad)", { XX } },
3236 },
381d071f 3237
c0f3af97
L
3238 /* PREFIX_0F3A44 */
3239 {
3240 { "(bad)", { XX } },
3241 { "(bad)", { XX } },
3242 { "pclmulqdq", { XM, EXx, PCLMUL } },
3243 { "(bad)", { XX } },
3244 },
3245
1ceb70f8 3246 /* PREFIX_0F3A60 */
381d071f
L
3247 {
3248 { "(bad)", { XX } },
3249 { "(bad)", { XX } },
4e7d34a6 3250 { "pcmpestrm", { XM, EXx, Ib } },
381d071f
L
3251 { "(bad)", { XX } },
3252 },
3253
1ceb70f8 3254 /* PREFIX_0F3A61 */
381d071f
L
3255 {
3256 { "(bad)", { XX } },
3257 { "(bad)", { XX } },
4e7d34a6 3258 { "pcmpestri", { XM, EXx, Ib } },
381d071f 3259 { "(bad)", { XX } },
381d071f
L
3260 },
3261
1ceb70f8 3262 /* PREFIX_0F3A62 */
381d071f
L
3263 {
3264 { "(bad)", { XX } },
3265 { "(bad)", { XX } },
4e7d34a6 3266 { "pcmpistrm", { XM, EXx, Ib } },
381d071f 3267 { "(bad)", { XX } },
381d071f
L
3268 },
3269
1ceb70f8 3270 /* PREFIX_0F3A63 */
381d071f
L
3271 {
3272 { "(bad)", { XX } },
3273 { "(bad)", { XX } },
4e7d34a6 3274 { "pcmpistri", { XM, EXx, Ib } },
381d071f
L
3275 { "(bad)", { XX } },
3276 },
09a2c6cf 3277
c0f3af97 3278 /* PREFIX_0F3ADF */
09a2c6cf 3279 {
c0f3af97
L
3280 { "(bad)", { XX } },
3281 { "(bad)", { XX } },
3282 { "aeskeygenassist", { XM, EXx, Ib } },
3283 { "(bad)", { XX } },
09a2c6cf
L
3284 },
3285
c0f3af97 3286 /* PREFIX_VEX_10 */
09a2c6cf 3287 {
c0f3af97
L
3288 { "vmovups", { XM, EXx } },
3289 { VEX_LEN_TABLE (VEX_LEN_10_P_1) },
3290 { "vmovupd", { XM, EXx } },
3291 { VEX_LEN_TABLE (VEX_LEN_10_P_3) },
09a2c6cf
L
3292 },
3293
c0f3af97 3294 /* PREFIX_VEX_11 */
09a2c6cf 3295 {
c0f3af97
L
3296 { "vmovups", { EXx, XM } },
3297 { VEX_LEN_TABLE (VEX_LEN_11_P_1) },
3298 { "vmovupd", { EXx, XM } },
3299 { VEX_LEN_TABLE (VEX_LEN_11_P_3) },
09a2c6cf
L
3300 },
3301
c0f3af97 3302 /* PREFIX_VEX_12 */
09a2c6cf 3303 {
c0f3af97
L
3304 { MOD_TABLE (MOD_VEX_12_PREFIX_0) },
3305 { "vmovsldup", { XM, EXx } },
3306 { VEX_LEN_TABLE (VEX_LEN_12_P_2) },
3307 { "vmovddup", { XM, EXymmq } },
09a2c6cf
L
3308 },
3309
c0f3af97 3310 /* PREFIX_VEX_16 */
09a2c6cf 3311 {
c0f3af97
L
3312 { MOD_TABLE (MOD_VEX_16_PREFIX_0) },
3313 { "vmovshdup", { XM, EXx } },
3314 { VEX_LEN_TABLE (VEX_LEN_16_P_2) },
3315 { "(bad)", { XX } },
5f754f58 3316 },
7c52e0e8 3317
c0f3af97 3318 /* PREFIX_VEX_2A */
5f754f58 3319 {
c0f3af97
L
3320 { "(bad)", { XX } },
3321 { VEX_LEN_TABLE (VEX_LEN_2A_P_1) },
3322 { "(bad)", { XX } },
3323 { VEX_LEN_TABLE (VEX_LEN_2A_P_3) },
5f754f58 3324 },
7c52e0e8 3325
c0f3af97 3326 /* PREFIX_VEX_2C */
5f754f58 3327 {
c0f3af97
L
3328 { "(bad)", { XX } },
3329 { VEX_LEN_TABLE (VEX_LEN_2C_P_1) },
3330 { "(bad)", { XX } },
3331 { VEX_LEN_TABLE (VEX_LEN_2C_P_3) },
5f754f58 3332 },
7c52e0e8 3333
c0f3af97 3334 /* PREFIX_VEX_2D */
7c52e0e8 3335 {
c0f3af97
L
3336 { "(bad)", { XX } },
3337 { VEX_LEN_TABLE (VEX_LEN_2D_P_1) },
3338 { "(bad)", { XX } },
3339 { VEX_LEN_TABLE (VEX_LEN_2D_P_3) },
7c52e0e8
L
3340 },
3341
c0f3af97 3342 /* PREFIX_VEX_2E */
7c52e0e8 3343 {
c0f3af97
L
3344 { VEX_LEN_TABLE (VEX_LEN_2E_P_0) },
3345 { "(bad)", { XX } },
3346 { VEX_LEN_TABLE (VEX_LEN_2E_P_2) },
3347 { "(bad)", { XX } },
7c52e0e8
L
3348 },
3349
c0f3af97 3350 /* PREFIX_VEX_2F */
7c52e0e8 3351 {
c0f3af97
L
3352 { VEX_LEN_TABLE (VEX_LEN_2F_P_0) },
3353 { "(bad)", { XX } },
3354 { VEX_LEN_TABLE (VEX_LEN_2F_P_2) },
3355 { "(bad)", { XX } },
7c52e0e8
L
3356 },
3357
c0f3af97 3358 /* PREFIX_VEX_51 */
7c52e0e8 3359 {
c0f3af97
L
3360 { "vsqrtps", { XM, EXx } },
3361 { VEX_LEN_TABLE (VEX_LEN_51_P_1) },
3362 { "vsqrtpd", { XM, EXx } },
3363 { VEX_LEN_TABLE (VEX_LEN_51_P_3) },
7c52e0e8
L
3364 },
3365
c0f3af97 3366 /* PREFIX_VEX_52 */
7c52e0e8 3367 {
c0f3af97
L
3368 { "vrsqrtps", { XM, EXx } },
3369 { VEX_LEN_TABLE (VEX_LEN_52_P_1) },
3370 { "(bad)", { XX } },
3371 { "(bad)", { XX } },
7c52e0e8
L
3372 },
3373
c0f3af97 3374 /* PREFIX_VEX_53 */
7c52e0e8 3375 {
c0f3af97
L
3376 { "vrcpps", { XM, EXx } },
3377 { VEX_LEN_TABLE (VEX_LEN_53_P_1) },
3378 { "(bad)", { XX } },
3379 { "(bad)", { XX } },
7c52e0e8
L
3380 },
3381
c0f3af97 3382 /* PREFIX_VEX_58 */
7c52e0e8 3383 {
c0f3af97
L
3384 { "vaddps", { XM, Vex, EXx } },
3385 { VEX_LEN_TABLE (VEX_LEN_58_P_1) },
3386 { "vaddpd", { XM, Vex, EXx } },
3387 { VEX_LEN_TABLE (VEX_LEN_58_P_3) },
7c52e0e8
L
3388 },
3389
c0f3af97 3390 /* PREFIX_VEX_59 */
7c52e0e8 3391 {
c0f3af97
L
3392 { "vmulps", { XM, Vex, EXx } },
3393 { VEX_LEN_TABLE (VEX_LEN_59_P_1) },
3394 { "vmulpd", { XM, Vex, EXx } },
3395 { VEX_LEN_TABLE (VEX_LEN_59_P_3) },
7c52e0e8
L
3396 },
3397
c0f3af97 3398 /* PREFIX_VEX_5A */
7c52e0e8 3399 {
c0f3af97
L
3400 { "vcvtps2pd", { XM, EXxmmq } },
3401 { VEX_LEN_TABLE (VEX_LEN_5A_P_1) },
3402 { "vcvtpd2ps%XY", { XMM, EXx } },
3403 { VEX_LEN_TABLE (VEX_LEN_5A_P_3) },
7c52e0e8
L
3404 },
3405
c0f3af97 3406 /* PREFIX_VEX_5B */
7c52e0e8 3407 {
c0f3af97
L
3408 { "vcvtdq2ps", { XM, EXx } },
3409 { "vcvttps2dq", { XM, EXx } },
3410 { "vcvtps2dq", { XM, EXx } },
3411 { "(bad)", { XX } },
7c52e0e8
L
3412 },
3413
c0f3af97 3414 /* PREFIX_VEX_5C */
7c52e0e8 3415 {
c0f3af97
L
3416 { "vsubps", { XM, Vex, EXx } },
3417 { VEX_LEN_TABLE (VEX_LEN_5C_P_1) },
3418 { "vsubpd", { XM, Vex, EXx } },
3419 { VEX_LEN_TABLE (VEX_LEN_5C_P_3) },
7c52e0e8
L
3420 },
3421
c0f3af97 3422 /* PREFIX_VEX_5D */
7c52e0e8 3423 {
c0f3af97
L
3424 { "vminps", { XM, Vex, EXx } },
3425 { VEX_LEN_TABLE (VEX_LEN_5D_P_1) },
3426 { "vminpd", { XM, Vex, EXx } },
3427 { VEX_LEN_TABLE (VEX_LEN_5D_P_3) },
7c52e0e8
L
3428 },
3429
c0f3af97 3430 /* PREFIX_VEX_5E */
7c52e0e8 3431 {
c0f3af97
L
3432 { "vdivps", { XM, Vex, EXx } },
3433 { VEX_LEN_TABLE (VEX_LEN_5E_P_1) },
3434 { "vdivpd", { XM, Vex, EXx } },
3435 { VEX_LEN_TABLE (VEX_LEN_5E_P_3) },
7c52e0e8
L
3436 },
3437
c0f3af97 3438 /* PREFIX_VEX_5F */
7c52e0e8 3439 {
c0f3af97
L
3440 { "vmaxps", { XM, Vex, EXx } },
3441 { VEX_LEN_TABLE (VEX_LEN_5F_P_1) },
3442 { "vmaxpd", { XM, Vex, EXx } },
3443 { VEX_LEN_TABLE (VEX_LEN_5F_P_3) },
7c52e0e8
L
3444 },
3445
c0f3af97 3446 /* PREFIX_VEX_60 */
7c52e0e8 3447 {
c0f3af97
L
3448 { "(bad)", { XX } },
3449 { "(bad)", { XX } },
3450 { VEX_LEN_TABLE (VEX_LEN_60_P_2) },
3451 { "(bad)", { XX } },
7c52e0e8
L
3452 },
3453
c0f3af97 3454 /* PREFIX_VEX_61 */
7c52e0e8 3455 {
c0f3af97
L
3456 { "(bad)", { XX } },
3457 { "(bad)", { XX } },
3458 { VEX_LEN_TABLE (VEX_LEN_61_P_2) },
3459 { "(bad)", { XX } },
7c52e0e8
L
3460 },
3461
c0f3af97 3462 /* PREFIX_VEX_62 */
7c52e0e8 3463 {
c0f3af97
L
3464 { "(bad)", { XX } },
3465 { "(bad)", { XX } },
3466 { VEX_LEN_TABLE (VEX_LEN_62_P_2) },
3467 { "(bad)", { XX } },
7c52e0e8
L
3468 },
3469
c0f3af97 3470 /* PREFIX_VEX_63 */
7c52e0e8 3471 {
c0f3af97
L
3472 { "(bad)", { XX } },
3473 { "(bad)", { XX } },
3474 { VEX_LEN_TABLE (VEX_LEN_63_P_2) },
3475 { "(bad)", { XX } },
7c52e0e8
L
3476 },
3477
c0f3af97 3478 /* PREFIX_VEX_64 */
7c52e0e8 3479 {
c0f3af97
L
3480 { "(bad)", { XX } },
3481 { "(bad)", { XX } },
3482 { VEX_LEN_TABLE (VEX_LEN_64_P_2) },
3483 { "(bad)", { XX } },
7c52e0e8
L
3484 },
3485
c0f3af97 3486 /* PREFIX_VEX_65 */
7c52e0e8 3487 {
c0f3af97
L
3488 { "(bad)", { XX } },
3489 { "(bad)", { XX } },
3490 { VEX_LEN_TABLE (VEX_LEN_65_P_2) },
3491 { "(bad)", { XX } },
7c52e0e8
L
3492 },
3493
c0f3af97 3494 /* PREFIX_VEX_66 */
7c52e0e8 3495 {
c0f3af97
L
3496 { "(bad)", { XX } },
3497 { "(bad)", { XX } },
3498 { VEX_LEN_TABLE (VEX_LEN_66_P_2) },
3499 { "(bad)", { XX } },
7c52e0e8 3500 },
6439fc28 3501
c0f3af97 3502 /* PREFIX_VEX_67 */
331d2d0d 3503 {
c0f3af97
L
3504 { "(bad)", { XX } },
3505 { "(bad)", { XX } },
3506 { VEX_LEN_TABLE (VEX_LEN_67_P_2) },
3507 { "(bad)", { XX } },
3508 },
3509
3510 /* PREFIX_VEX_68 */
3511 {
3512 { "(bad)", { XX } },
3513 { "(bad)", { XX } },
3514 { VEX_LEN_TABLE (VEX_LEN_68_P_2) },
3515 { "(bad)", { XX } },
3516 },
3517
3518 /* PREFIX_VEX_69 */
3519 {
3520 { "(bad)", { XX } },
3521 { "(bad)", { XX } },
3522 { VEX_LEN_TABLE (VEX_LEN_69_P_2) },
3523 { "(bad)", { XX } },
3524 },
3525
3526 /* PREFIX_VEX_6A */
3527 {
3528 { "(bad)", { XX } },
3529 { "(bad)", { XX } },
3530 { VEX_LEN_TABLE (VEX_LEN_6A_P_2) },
3531 { "(bad)", { XX } },
3532 },
3533
3534 /* PREFIX_VEX_6B */
3535 {
3536 { "(bad)", { XX } },
3537 { "(bad)", { XX } },
3538 { VEX_LEN_TABLE (VEX_LEN_6B_P_2) },
3539 { "(bad)", { XX } },
3540 },
3541
3542 /* PREFIX_VEX_6C */
3543 {
3544 { "(bad)", { XX } },
3545 { "(bad)", { XX } },
3546 { VEX_LEN_TABLE (VEX_LEN_6C_P_2) },
3547 { "(bad)", { XX } },
3548 },
3549
3550 /* PREFIX_VEX_6D */
3551 {
3552 { "(bad)", { XX } },
3553 { "(bad)", { XX } },
3554 { VEX_LEN_TABLE (VEX_LEN_6D_P_2) },
3555 { "(bad)", { XX } },
3556 },
3557
3558 /* PREFIX_VEX_6E */
3559 {
3560 { "(bad)", { XX } },
3561 { "(bad)", { XX } },
3562 { VEX_LEN_TABLE (VEX_LEN_6E_P_2) },
3563 { "(bad)", { XX } },
3564 },
3565
3566 /* PREFIX_VEX_6F */
3567 {
3568 { "(bad)", { XX } },
3569 { "vmovdqu", { XM, EXx } },
3570 { "vmovdqa", { XM, EXx } },
3571 { "(bad)", { XX } },
3572 },
3573
3574 /* PREFIX_VEX_70 */
3575 {
3576 { "(bad)", { XX } },
3577 { VEX_LEN_TABLE (VEX_LEN_70_P_1) },
3578 { VEX_LEN_TABLE (VEX_LEN_70_P_2) },
3579 { VEX_LEN_TABLE (VEX_LEN_70_P_3) },
3580 },
3581
3582 /* PREFIX_VEX_71_REG_2 */
3583 {
3584 { "(bad)", { XX } },
3585 { "(bad)", { XX } },
3586 { VEX_LEN_TABLE (VEX_LEN_71_R_2_P_2) },
3587 { "(bad)", { XX } },
3588 },
3589
3590 /* PREFIX_VEX_71_REG_4 */
3591 {
3592 { "(bad)", { XX } },
3593 { "(bad)", { XX } },
3594 { VEX_LEN_TABLE (VEX_LEN_71_R_4_P_2) },
3595 { "(bad)", { XX } },
3596 },
3597
3598 /* PREFIX_VEX_71_REG_6 */
3599 {
3600 { "(bad)", { XX } },
3601 { "(bad)", { XX } },
3602 { VEX_LEN_TABLE (VEX_LEN_71_R_6_P_2) },
3603 { "(bad)", { XX } },
3604 },
3605
3606 /* PREFIX_VEX_72_REG_2 */
3607 {
3608 { "(bad)", { XX } },
3609 { "(bad)", { XX } },
3610 { VEX_LEN_TABLE (VEX_LEN_72_R_2_P_2) },
3611 { "(bad)", { XX } },
3612 },
3613
3614 /* PREFIX_VEX_72_REG_4 */
3615 {
3616 { "(bad)", { XX } },
3617 { "(bad)", { XX } },
3618 { VEX_LEN_TABLE (VEX_LEN_72_R_4_P_2) },
3619 { "(bad)", { XX } },
3620 },
3621
3622 /* PREFIX_VEX_72_REG_6 */
3623 {
3624 { "(bad)", { XX } },
3625 { "(bad)", { XX } },
3626 { VEX_LEN_TABLE (VEX_LEN_72_R_6_P_2) },
3627 { "(bad)", { XX } },
3628 },
3629
3630 /* PREFIX_VEX_73_REG_2 */
3631 {
3632 { "(bad)", { XX } },
3633 { "(bad)", { XX } },
3634 { VEX_LEN_TABLE (VEX_LEN_73_R_2_P_2) },
3635 { "(bad)", { XX } },
3636 },
3637
3638 /* PREFIX_VEX_73_REG_3 */
3639 {
3640 { "(bad)", { XX } },
3641 { "(bad)", { XX } },
3642 { VEX_LEN_TABLE (VEX_LEN_73_R_3_P_2) },
3643 { "(bad)", { XX } },
3644 },
3645
3646 /* PREFIX_VEX_73_REG_6 */
3647 {
3648 { "(bad)", { XX } },
3649 { "(bad)", { XX } },
3650 { VEX_LEN_TABLE (VEX_LEN_73_R_6_P_2) },
3651 { "(bad)", { XX } },
3652 },
3653
3654 /* PREFIX_VEX_73_REG_7 */
3655 {
3656 { "(bad)", { XX } },
3657 { "(bad)", { XX } },
3658 { VEX_LEN_TABLE (VEX_LEN_73_R_7_P_2) },
3659 { "(bad)", { XX } },
3660 },
3661
3662 /* PREFIX_VEX_74 */
3663 {
3664 { "(bad)", { XX } },
3665 { "(bad)", { XX } },
3666 { VEX_LEN_TABLE (VEX_LEN_74_P_2) },
3667 { "(bad)", { XX } },
3668 },
3669
3670 /* PREFIX_VEX_75 */
3671 {
3672 { "(bad)", { XX } },
3673 { "(bad)", { XX } },
3674 { VEX_LEN_TABLE (VEX_LEN_75_P_2) },
3675 { "(bad)", { XX } },
3676 },
3677
3678 /* PREFIX_VEX_76 */
3679 {
3680 { "(bad)", { XX } },
3681 { "(bad)", { XX } },
3682 { VEX_LEN_TABLE (VEX_LEN_76_P_2) },
3683 { "(bad)", { XX } },
3684 },
3685
3686 /* PREFIX_VEX_77 */
3687 {
3688 { "", { VZERO } },
3689 { "(bad)", { XX } },
3690 { "(bad)", { XX } },
3691 { "(bad)", { XX } },
3692 },
3693
3694 /* PREFIX_VEX_7C */
3695 {
3696 { "(bad)", { XX } },
3697 { "(bad)", { XX } },
3698 { "vhaddpd", { XM, Vex, EXx } },
3699 { "vhaddps", { XM, Vex, EXx } },
3700 },
3701
3702 /* PREFIX_VEX_7D */
3703 {
3704 { "(bad)", { XX } },
3705 { "(bad)", { XX } },
3706 { "vhsubpd", { XM, Vex, EXx } },
3707 { "vhsubps", { XM, Vex, EXx } },
3708 },
3709
3710 /* PREFIX_VEX_7E */
3711 {
3712 { "(bad)", { XX } },
3713 { VEX_LEN_TABLE (VEX_LEN_7E_P_1) },
3714 { VEX_LEN_TABLE (VEX_LEN_7E_P_2) },
3715 { "(bad)", { XX } },
3716 },
3717
3718 /* PREFIX_VEX_7F */
3719 {
3720 { "(bad)", { XX } },
3721 { "vmovdqu", { EXx, XM } },
3722 { "vmovdqa", { EXx, XM } },
3723 { "(bad)", { XX } },
3724 },
3725
3726 /* PREFIX_VEX_C2 */
3727 {
3728 { "vcmpps", { XM, Vex, EXx, VCMP } },
3729 { VEX_LEN_TABLE (VEX_LEN_C2_P_1) },
3730 { "vcmppd", { XM, Vex, EXx, VCMP } },
3731 { VEX_LEN_TABLE (VEX_LEN_C2_P_3) },
3732 },
3733
3734 /* PREFIX_VEX_C4 */
3735 {
3736 { "(bad)", { XX } },
3737 { "(bad)", { XX } },
3738 { VEX_LEN_TABLE (VEX_LEN_C4_P_2) },
3739 { "(bad)", { XX } },
3740 },
3741
3742 /* PREFIX_VEX_C5 */
3743 {
3744 { "(bad)", { XX } },
3745 { "(bad)", { XX } },
3746 { VEX_LEN_TABLE (VEX_LEN_C5_P_2) },
3747 { "(bad)", { XX } },
3748 },
3749
3750 /* PREFIX_VEX_D0 */
3751 {
3752 { "(bad)", { XX } },
3753 { "(bad)", { XX } },
3754 { "vaddsubpd", { XM, Vex, EXx } },
3755 { "vaddsubps", { XM, Vex, EXx } },
3756 },
3757
3758 /* PREFIX_VEX_D1 */
3759 {
3760 { "(bad)", { XX } },
3761 { "(bad)", { XX } },
3762 { VEX_LEN_TABLE (VEX_LEN_D1_P_2) },
3763 { "(bad)", { XX } },
3764 },
3765
3766 /* PREFIX_VEX_D2 */
3767 {
3768 { "(bad)", { XX } },
3769 { "(bad)", { XX } },
3770 { VEX_LEN_TABLE (VEX_LEN_D2_P_2) },
3771 { "(bad)", { XX } },
3772 },
3773
3774 /* PREFIX_VEX_D3 */
3775 {
3776 { "(bad)", { XX } },
3777 { "(bad)", { XX } },
3778 { VEX_LEN_TABLE (VEX_LEN_D3_P_2) },
3779 { "(bad)", { XX } },
3780 },
3781
3782 /* PREFIX_VEX_D4 */
3783 {
3784 { "(bad)", { XX } },
3785 { "(bad)", { XX } },
3786 { VEX_LEN_TABLE (VEX_LEN_D4_P_2) },
3787 { "(bad)", { XX } },
3788 },
3789
3790 /* PREFIX_VEX_D5 */
3791 {
3792 { "(bad)", { XX } },
3793 { "(bad)", { XX } },
3794 { VEX_LEN_TABLE (VEX_LEN_D5_P_2) },
3795 { "(bad)", { XX } },
3796 },
3797
3798 /* PREFIX_VEX_D6 */
3799 {
3800 { "(bad)", { XX } },
3801 { "(bad)", { XX } },
3802 { VEX_LEN_TABLE (VEX_LEN_D6_P_2) },
3803 { "(bad)", { XX } },
3804 },
3805
3806 /* PREFIX_VEX_D7 */
3807 {
3808 { "(bad)", { XX } },
3809 { "(bad)", { XX } },
3810 { MOD_TABLE (MOD_VEX_D7_PREFIX_2) },
3811 { "(bad)", { XX } },
3812 },
3813
3814 /* PREFIX_VEX_D8 */
3815 {
3816 { "(bad)", { XX } },
3817 { "(bad)", { XX } },
3818 { VEX_LEN_TABLE (VEX_LEN_D8_P_2) },
3819 { "(bad)", { XX } },
3820 },
3821
3822 /* PREFIX_VEX_D9 */
3823 {
3824 { "(bad)", { XX } },
3825 { "(bad)", { XX } },
3826 { VEX_LEN_TABLE (VEX_LEN_D9_P_2) },
3827 { "(bad)", { XX } },
3828 },
3829
3830 /* PREFIX_VEX_DA */
3831 {
3832 { "(bad)", { XX } },
3833 { "(bad)", { XX } },
3834 { VEX_LEN_TABLE (VEX_LEN_DA_P_2) },
3835 { "(bad)", { XX } },
3836 },
3837
3838 /* PREFIX_VEX_DB */
3839 {
3840 { "(bad)", { XX } },
3841 { "(bad)", { XX } },
3842 { VEX_LEN_TABLE (VEX_LEN_DB_P_2) },
3843 { "(bad)", { XX } },
3844 },
3845
3846 /* PREFIX_VEX_DC */
3847 {
3848 { "(bad)", { XX } },
3849 { "(bad)", { XX } },
3850 { VEX_LEN_TABLE (VEX_LEN_DC_P_2) },
3851 { "(bad)", { XX } },
3852 },
3853
3854 /* PREFIX_VEX_DD */
3855 {
3856 { "(bad)", { XX } },
3857 { "(bad)", { XX } },
3858 { VEX_LEN_TABLE (VEX_LEN_DD_P_2) },
3859 { "(bad)", { XX } },
3860 },
3861
3862 /* PREFIX_VEX_DE */
3863 {
3864 { "(bad)", { XX } },
3865 { "(bad)", { XX } },
3866 { VEX_LEN_TABLE (VEX_LEN_DE_P_2) },
3867 { "(bad)", { XX } },
3868 },
3869
3870 /* PREFIX_VEX_DF */
3871 {
3872 { "(bad)", { XX } },
3873 { "(bad)", { XX } },
3874 { VEX_LEN_TABLE (VEX_LEN_DF_P_2) },
3875 { "(bad)", { XX } },
3876 },
3877
3878 /* PREFIX_VEX_E0 */
3879 {
3880 { "(bad)", { XX } },
3881 { "(bad)", { XX } },
3882 { VEX_LEN_TABLE (VEX_LEN_E0_P_2) },
3883 { "(bad)", { XX } },
3884 },
3885
3886 /* PREFIX_VEX_E1 */
3887 {
3888 { "(bad)", { XX } },
3889 { "(bad)", { XX } },
3890 { VEX_LEN_TABLE (VEX_LEN_E1_P_2) },
3891 { "(bad)", { XX } },
3892 },
3893
3894 /* PREFIX_VEX_E2 */
3895 {
3896 { "(bad)", { XX } },
3897 { "(bad)", { XX } },
3898 { VEX_LEN_TABLE (VEX_LEN_E2_P_2) },
3899 { "(bad)", { XX } },
3900 },
3901
3902 /* PREFIX_VEX_E3 */
3903 {
3904 { "(bad)", { XX } },
3905 { "(bad)", { XX } },
3906 { VEX_LEN_TABLE (VEX_LEN_E3_P_2) },
3907 { "(bad)", { XX } },
3908 },
3909
3910 /* PREFIX_VEX_E4 */
3911 {
3912 { "(bad)", { XX } },
3913 { "(bad)", { XX } },
3914 { VEX_LEN_TABLE (VEX_LEN_E4_P_2) },
3915 { "(bad)", { XX } },
3916 },
3917
3918 /* PREFIX_VEX_E5 */
3919 {
3920 { "(bad)", { XX } },
3921 { "(bad)", { XX } },
3922 { VEX_LEN_TABLE (VEX_LEN_E5_P_2) },
3923 { "(bad)", { XX } },
3924 },
3925
3926 /* PREFIX_VEX_E6 */
3927 {
3928 { "(bad)", { XX } },
3929 { "vcvtdq2pd", { XM, EXxmmq } },
3930 { "vcvttpd2dq%XY", { XMM, EXx } },
3931 { "vcvtpd2dq%XY", { XMM, EXx } },
3932 },
3933
3934 /* PREFIX_VEX_E7 */
3935 {
3936 { "(bad)", { XX } },
3937 { "(bad)", { XX } },
3938 { MOD_TABLE (MOD_VEX_E7_PREFIX_2) },
3939 { "(bad)", { XX } },
3940 },
3941
3942 /* PREFIX_VEX_E8 */
3943 {
3944 { "(bad)", { XX } },
3945 { "(bad)", { XX } },
3946 { VEX_LEN_TABLE (VEX_LEN_E8_P_2) },
3947 { "(bad)", { XX } },
3948 },
3949
3950 /* PREFIX_VEX_E9 */
3951 {
3952 { "(bad)", { XX } },
3953 { "(bad)", { XX } },
3954 { VEX_LEN_TABLE (VEX_LEN_E9_P_2) },
3955 { "(bad)", { XX } },
3956 },
3957
3958 /* PREFIX_VEX_EA */
3959 {
3960 { "(bad)", { XX } },
3961 { "(bad)", { XX } },
3962 { VEX_LEN_TABLE (VEX_LEN_EA_P_2) },
3963 { "(bad)", { XX } },
3964 },
3965
3966 /* PREFIX_VEX_EB */
3967 {
3968 { "(bad)", { XX } },
3969 { "(bad)", { XX } },
3970 { VEX_LEN_TABLE (VEX_LEN_EB_P_2) },
3971 { "(bad)", { XX } },
3972 },
3973
3974 /* PREFIX_VEX_EC */
3975 {
3976 { "(bad)", { XX } },
3977 { "(bad)", { XX } },
3978 { VEX_LEN_TABLE (VEX_LEN_EC_P_2) },
3979 { "(bad)", { XX } },
3980 },
3981
3982 /* PREFIX_VEX_ED */
3983 {
3984 { "(bad)", { XX } },
3985 { "(bad)", { XX } },
3986 { VEX_LEN_TABLE (VEX_LEN_ED_P_2) },
3987 { "(bad)", { XX } },
3988 },
3989
3990 /* PREFIX_VEX_EE */
3991 {
3992 { "(bad)", { XX } },
3993 { "(bad)", { XX } },
3994 { VEX_LEN_TABLE (VEX_LEN_EE_P_2) },
3995 { "(bad)", { XX } },
3996 },
3997
3998 /* PREFIX_VEX_EF */
3999 {
4000 { "(bad)", { XX } },
4001 { "(bad)", { XX } },
4002 { VEX_LEN_TABLE (VEX_LEN_EF_P_2) },
4003 { "(bad)", { XX } },
4004 },
4005
4006 /* PREFIX_VEX_F0 */
4007 {
4008 { "(bad)", { XX } },
4009 { "(bad)", { XX } },
4010 { "(bad)", { XX } },
4011 { MOD_TABLE (MOD_VEX_F0_PREFIX_3) },
4012 },
4013
4014 /* PREFIX_VEX_F1 */
4015 {
4016 { "(bad)", { XX } },
4017 { "(bad)", { XX } },
4018 { VEX_LEN_TABLE (VEX_LEN_F1_P_2) },
4019 { "(bad)", { XX } },
4020 },
4021
4022 /* PREFIX_VEX_F2 */
4023 {
4024 { "(bad)", { XX } },
4025 { "(bad)", { XX } },
4026 { VEX_LEN_TABLE (VEX_LEN_F2_P_2) },
4027 { "(bad)", { XX } },
4028 },
4029
4030 /* PREFIX_VEX_F3 */
4031 {
4032 { "(bad)", { XX } },
4033 { "(bad)", { XX } },
4034 { VEX_LEN_TABLE (VEX_LEN_F3_P_2) },
4035 { "(bad)", { XX } },
4036 },
4037
4038 /* PREFIX_VEX_F4 */
4039 {
4040 { "(bad)", { XX } },
4041 { "(bad)", { XX } },
4042 { VEX_LEN_TABLE (VEX_LEN_F4_P_2) },
4043 { "(bad)", { XX } },
4044 },
4045
4046 /* PREFIX_VEX_F5 */
4047 {
4048 { "(bad)", { XX } },
4049 { "(bad)", { XX } },
4050 { VEX_LEN_TABLE (VEX_LEN_F5_P_2) },
4051 { "(bad)", { XX } },
4052 },
4053
4054 /* PREFIX_VEX_F6 */
4055 {
4056 { "(bad)", { XX } },
4057 { "(bad)", { XX } },
4058 { VEX_LEN_TABLE (VEX_LEN_F6_P_2) },
4059 { "(bad)", { XX } },
4060 },
4061
4062 /* PREFIX_VEX_F7 */
4063 {
4064 { "(bad)", { XX } },
4065 { "(bad)", { XX } },
4066 { VEX_LEN_TABLE (VEX_LEN_F7_P_2) },
4067 { "(bad)", { XX } },
4068 },
4069
4070 /* PREFIX_VEX_F8 */
4071 {
4072 { "(bad)", { XX } },
4073 { "(bad)", { XX } },
4074 { VEX_LEN_TABLE (VEX_LEN_F8_P_2) },
4075 { "(bad)", { XX } },
4076 },
4077
4078 /* PREFIX_VEX_F9 */
4079 {
4080 { "(bad)", { XX } },
4081 { "(bad)", { XX } },
4082 { VEX_LEN_TABLE (VEX_LEN_F9_P_2) },
4083 { "(bad)", { XX } },
4084 },
4085
4086 /* PREFIX_VEX_FA */
4087 {
4088 { "(bad)", { XX } },
4089 { "(bad)", { XX } },
4090 { VEX_LEN_TABLE (VEX_LEN_FA_P_2) },
4091 { "(bad)", { XX } },
4092 },
4093
4094 /* PREFIX_VEX_FB */
4095 {
4096 { "(bad)", { XX } },
4097 { "(bad)", { XX } },
4098 { VEX_LEN_TABLE (VEX_LEN_FB_P_2) },
4099 { "(bad)", { XX } },
4100 },
4101
4102 /* PREFIX_VEX_FC */
4103 {
4104 { "(bad)", { XX } },
4105 { "(bad)", { XX } },
4106 { VEX_LEN_TABLE (VEX_LEN_FC_P_2) },
4107 { "(bad)", { XX } },
4108 },
4109
4110 /* PREFIX_VEX_FD */
4111 {
4112 { "(bad)", { XX } },
4113 { "(bad)", { XX } },
4114 { VEX_LEN_TABLE (VEX_LEN_FD_P_2) },
4115 { "(bad)", { XX } },
4116 },
4117
4118 /* PREFIX_VEX_FE */
4119 {
4120 { "(bad)", { XX } },
4121 { "(bad)", { XX } },
4122 { VEX_LEN_TABLE (VEX_LEN_FE_P_2) },
4123 { "(bad)", { XX } },
4124 },
4125
4126 /* PREFIX_VEX_3800 */
4127 {
4128 { "(bad)", { XX } },
4129 { "(bad)", { XX } },
4130 { VEX_LEN_TABLE (VEX_LEN_3800_P_2) },
4131 { "(bad)", { XX } },
4132 },
4133
4134 /* PREFIX_VEX_3801 */
4135 {
4136 { "(bad)", { XX } },
4137 { "(bad)", { XX } },
4138 { VEX_LEN_TABLE (VEX_LEN_3801_P_2) },
4139 { "(bad)", { XX } },
4140 },
4141
4142 /* PREFIX_VEX_3802 */
4143 {
4144 { "(bad)", { XX } },
4145 { "(bad)", { XX } },
4146 { VEX_LEN_TABLE (VEX_LEN_3802_P_2) },
4147 { "(bad)", { XX } },
4148 },
4149
4150 /* PREFIX_VEX_3803 */
4151 {
4152 { "(bad)", { XX } },
4153 { "(bad)", { XX } },
4154 { VEX_LEN_TABLE (VEX_LEN_3803_P_2) },
4155 { "(bad)", { XX } },
4156 },
4157
4158 /* PREFIX_VEX_3804 */
4159 {
4160 { "(bad)", { XX } },
4161 { "(bad)", { XX } },
4162 { VEX_LEN_TABLE (VEX_LEN_3804_P_2) },
4163 { "(bad)", { XX } },
4164 },
4165
4166 /* PREFIX_VEX_3805 */
4167 {
4168 { "(bad)", { XX } },
4169 { "(bad)", { XX } },
4170 { VEX_LEN_TABLE (VEX_LEN_3805_P_2) },
4171 { "(bad)", { XX } },
4172 },
4173
4174 /* PREFIX_VEX_3806 */
4175 {
4176 { "(bad)", { XX } },
4177 { "(bad)", { XX } },
4178 { VEX_LEN_TABLE (VEX_LEN_3806_P_2) },
4179 { "(bad)", { XX } },
4180 },
4181
4182 /* PREFIX_VEX_3807 */
4183 {
4184 { "(bad)", { XX } },
4185 { "(bad)", { XX } },
4186 { VEX_LEN_TABLE (VEX_LEN_3807_P_2) },
4187 { "(bad)", { XX } },
4188 },
4189
4190 /* PREFIX_VEX_3808 */
4191 {
4192 { "(bad)", { XX } },
4193 { "(bad)", { XX } },
4194 { VEX_LEN_TABLE (VEX_LEN_3808_P_2) },
4195 { "(bad)", { XX } },
4196 },
4197
4198 /* PREFIX_VEX_3809 */
4199 {
4200 { "(bad)", { XX } },
4201 { "(bad)", { XX } },
4202 { VEX_LEN_TABLE (VEX_LEN_3809_P_2) },
4203 { "(bad)", { XX } },
4204 },
4205
4206 /* PREFIX_VEX_380A */
4207 {
4208 { "(bad)", { XX } },
4209 { "(bad)", { XX } },
4210 { VEX_LEN_TABLE (VEX_LEN_380A_P_2) },
4211 { "(bad)", { XX } },
4212 },
4213
4214 /* PREFIX_VEX_380B */
4215 {
4216 { "(bad)", { XX } },
4217 { "(bad)", { XX } },
4218 { VEX_LEN_TABLE (VEX_LEN_380B_P_2) },
4219 { "(bad)", { XX } },
4220 },
4221
4222 /* PREFIX_VEX_380C */
4223 {
4224 { "(bad)", { XX } },
4225 { "(bad)", { XX } },
4226 { "vpermilps", { XM, Vex, EXx } },
4227 { "(bad)", { XX } },
4228 },
4229
4230 /* PREFIX_VEX_380D */
4231 {
4232 { "(bad)", { XX } },
4233 { "(bad)", { XX } },
4234 { "vpermilpd", { XM, Vex, EXx } },
4235 { "(bad)", { XX } },
4236 },
4237
4238 /* PREFIX_VEX_380E */
4239 {
4240 { "(bad)", { XX } },
4241 { "(bad)", { XX } },
4242 { "vtestps", { XM, EXx } },
4243 { "(bad)", { XX } },
4244 },
4245
4246 /* PREFIX_VEX_380F */
4247 {
4248 { "(bad)", { XX } },
4249 { "(bad)", { XX } },
4250 { "vtestpd", { XM, EXx } },
4251 { "(bad)", { XX } },
4252 },
4253
4254 /* PREFIX_VEX_3817 */
4255 {
4256 { "(bad)", { XX } },
4257 { "(bad)", { XX } },
4258 { "vptest", { XM, EXx } },
4259 { "(bad)", { XX } },
4260 },
4261
4262 /* PREFIX_VEX_3818 */
4263 {
4264 { "(bad)", { XX } },
4265 { "(bad)", { XX } },
4266 { MOD_TABLE (MOD_VEX_3818_PREFIX_2) },
4267 { "(bad)", { XX } },
4268 },
4269
4270 /* PREFIX_VEX_3819 */
4271 {
4272 { "(bad)", { XX } },
4273 { "(bad)", { XX } },
4274 { MOD_TABLE (MOD_VEX_3819_PREFIX_2) },
4275 { "(bad)", { XX } },
4276 },
4277
4278 /* PREFIX_VEX_381A */
4279 {
4280 { "(bad)", { XX } },
4281 { "(bad)", { XX } },
4282 { MOD_TABLE (MOD_VEX_381A_PREFIX_2) },
4283 { "(bad)", { XX } },
4284 },
4285
4286 /* PREFIX_VEX_381C */
4287 {
4288 { "(bad)", { XX } },
4289 { "(bad)", { XX } },
4290 { VEX_LEN_TABLE (VEX_LEN_381C_P_2) },
4291 { "(bad)", { XX } },
4292 },
4293
4294 /* PREFIX_VEX_381D */
4295 {
4296 { "(bad)", { XX } },
4297 { "(bad)", { XX } },
4298 { VEX_LEN_TABLE (VEX_LEN_381D_P_2) },
4299 { "(bad)", { XX } },
4300 },
4301
4302 /* PREFIX_VEX_381E */
4303 {
4304 { "(bad)", { XX } },
4305 { "(bad)", { XX } },
4306 { VEX_LEN_TABLE (VEX_LEN_381E_P_2) },
4307 { "(bad)", { XX } },
4308 },
4309
4310 /* PREFIX_VEX_3820 */
4311 {
4312 { "(bad)", { XX } },
4313 { "(bad)", { XX } },
4314 { VEX_LEN_TABLE (VEX_LEN_3820_P_2) },
4315 { "(bad)", { XX } },
4316 },
4317
4318 /* PREFIX_VEX_3821 */
4319 {
4320 { "(bad)", { XX } },
4321 { "(bad)", { XX } },
4322 { VEX_LEN_TABLE (VEX_LEN_3821_P_2) },
4323 { "(bad)", { XX } },
4324 },
4325
4326 /* PREFIX_VEX_3822 */
4327 {
4328 { "(bad)", { XX } },
4329 { "(bad)", { XX } },
4330 { VEX_LEN_TABLE (VEX_LEN_3822_P_2) },
4331 { "(bad)", { XX } },
4332 },
4333
4334 /* PREFIX_VEX_3823 */
4335 {
4336 { "(bad)", { XX } },
4337 { "(bad)", { XX } },
4338 { VEX_LEN_TABLE (VEX_LEN_3823_P_2) },
4339 { "(bad)", { XX } },
4340 },
4341
4342 /* PREFIX_VEX_3824 */
4343 {
4344 { "(bad)", { XX } },
4345 { "(bad)", { XX } },
4346 { VEX_LEN_TABLE (VEX_LEN_3824_P_2) },
4347 { "(bad)", { XX } },
4348 },
4349
4350 /* PREFIX_VEX_3825 */
4351 {
4352 { "(bad)", { XX } },
4353 { "(bad)", { XX } },
4354 { VEX_LEN_TABLE (VEX_LEN_3825_P_2) },
4355 { "(bad)", { XX } },
4356 },
4357
4358 /* PREFIX_VEX_3828 */
4359 {
4360 { "(bad)", { XX } },
4361 { "(bad)", { XX } },
4362 { VEX_LEN_TABLE (VEX_LEN_3828_P_2) },
4363 { "(bad)", { XX } },
4364 },
4365
4366 /* PREFIX_VEX_3829 */
4367 {
4368 { "(bad)", { XX } },
4369 { "(bad)", { XX } },
4370 { VEX_LEN_TABLE (VEX_LEN_3829_P_2) },
4371 { "(bad)", { XX } },
4372 },
4373
4374 /* PREFIX_VEX_382A */
4375 {
4376 { "(bad)", { XX } },
4377 { "(bad)", { XX } },
4378 { MOD_TABLE (MOD_VEX_382A_PREFIX_2) },
4379 { "(bad)", { XX } },
4380 },
4381
4382 /* PREFIX_VEX_382B */
4383 {
4384 { "(bad)", { XX } },
4385 { "(bad)", { XX } },
4386 { VEX_LEN_TABLE (VEX_LEN_382B_P_2) },
4387 { "(bad)", { XX } },
4388 },
4389
4390 /* PREFIX_VEX_382C */
4391 {
4392 { "(bad)", { XX } },
4393 { "(bad)", { XX } },
4394 { MOD_TABLE (MOD_VEX_382C_PREFIX_2) },
4395 { "(bad)", { XX } },
4396 },
4397
4398 /* PREFIX_VEX_382D */
4399 {
4400 { "(bad)", { XX } },
4401 { "(bad)", { XX } },
4402 { MOD_TABLE (MOD_VEX_382D_PREFIX_2) },
4403 { "(bad)", { XX } },
4404 },
4405
4406 /* PREFIX_VEX_382E */
4407 {
4408 { "(bad)", { XX } },
4409 { "(bad)", { XX } },
4410 { MOD_TABLE (MOD_VEX_382E_PREFIX_2) },
4411 { "(bad)", { XX } },
4412 },
4413
4414 /* PREFIX_VEX_382F */
4415 {
4416 { "(bad)", { XX } },
4417 { "(bad)", { XX } },
4418 { MOD_TABLE (MOD_VEX_382F_PREFIX_2) },
4419 { "(bad)", { XX } },
4420 },
4421
4422 /* PREFIX_VEX_3830 */
4423 {
4424 { "(bad)", { XX } },
4425 { "(bad)", { XX } },
4426 { VEX_LEN_TABLE (VEX_LEN_3830_P_2) },
4427 { "(bad)", { XX } },
4428 },
4429
4430 /* PREFIX_VEX_3831 */
4431 {
4432 { "(bad)", { XX } },
4433 { "(bad)", { XX } },
4434 { VEX_LEN_TABLE (VEX_LEN_3831_P_2) },
4435 { "(bad)", { XX } },
4436 },
4437
4438 /* PREFIX_VEX_3832 */
4439 {
4440 { "(bad)", { XX } },
4441 { "(bad)", { XX } },
4442 { VEX_LEN_TABLE (VEX_LEN_3832_P_2) },
4443 { "(bad)", { XX } },
4444 },
4445
4446 /* PREFIX_VEX_3833 */
4447 {
4448 { "(bad)", { XX } },
4449 { "(bad)", { XX } },
4450 { VEX_LEN_TABLE (VEX_LEN_3833_P_2) },
4451 { "(bad)", { XX } },
4452 },
4453
4454 /* PREFIX_VEX_3834 */
4455 {
4456 { "(bad)", { XX } },
4457 { "(bad)", { XX } },
4458 { VEX_LEN_TABLE (VEX_LEN_3834_P_2) },
4459 { "(bad)", { XX } },
4460 },
4461
4462 /* PREFIX_VEX_3835 */
4463 {
4464 { "(bad)", { XX } },
4465 { "(bad)", { XX } },
4466 { VEX_LEN_TABLE (VEX_LEN_3835_P_2) },
4467 { "(bad)", { XX } },
4468 },
4469
4470 /* PREFIX_VEX_3837 */
4471 {
4472 { "(bad)", { XX } },
4473 { "(bad)", { XX } },
4474 { VEX_LEN_TABLE (VEX_LEN_3837_P_2) },
4475 { "(bad)", { XX } },
4476 },
4477
4478 /* PREFIX_VEX_3838 */
4479 {
4480 { "(bad)", { XX } },
4481 { "(bad)", { XX } },
4482 { VEX_LEN_TABLE (VEX_LEN_3838_P_2) },
4483 { "(bad)", { XX } },
4484 },
4485
4486 /* PREFIX_VEX_3839 */
4487 {
4488 { "(bad)", { XX } },
4489 { "(bad)", { XX } },
4490 { VEX_LEN_TABLE (VEX_LEN_3839_P_2) },
4491 { "(bad)", { XX } },
4492 },
4493
4494 /* PREFIX_VEX_383A */
4495 {
4496 { "(bad)", { XX } },
4497 { "(bad)", { XX } },
4498 { VEX_LEN_TABLE (VEX_LEN_383A_P_2) },
4499 { "(bad)", { XX } },
4500 },
4501
4502 /* PREFIX_VEX_383B */
4503 {
4504 { "(bad)", { XX } },
4505 { "(bad)", { XX } },
4506 { VEX_LEN_TABLE (VEX_LEN_383B_P_2) },
4507 { "(bad)", { XX } },
4508 },
4509
4510 /* PREFIX_VEX_383C */
4511 {
4512 { "(bad)", { XX } },
4513 { "(bad)", { XX } },
4514 { VEX_LEN_TABLE (VEX_LEN_383C_P_2) },
4515 { "(bad)", { XX } },
4516 },
4517
4518 /* PREFIX_VEX_383D */
4519 {
4520 { "(bad)", { XX } },
4521 { "(bad)", { XX } },
4522 { VEX_LEN_TABLE (VEX_LEN_383D_P_2) },
4523 { "(bad)", { XX } },
4524 },
4525
4526 /* PREFIX_VEX_383E */
4527 {
4528 { "(bad)", { XX } },
4529 { "(bad)", { XX } },
4530 { VEX_LEN_TABLE (VEX_LEN_383E_P_2) },
4531 { "(bad)", { XX } },
4532 },
4533
4534 /* PREFIX_VEX_383F */
4535 {
4536 { "(bad)", { XX } },
4537 { "(bad)", { XX } },
4538 { VEX_LEN_TABLE (VEX_LEN_383F_P_2) },
4539 { "(bad)", { XX } },
4540 },
4541
4542 /* PREFIX_VEX_3840 */
4543 {
4544 { "(bad)", { XX } },
4545 { "(bad)", { XX } },
4546 { VEX_LEN_TABLE (VEX_LEN_3840_P_2) },
4547 { "(bad)", { XX } },
4548 },
4549
4550 /* PREFIX_VEX_3841 */
4551 {
4552 { "(bad)", { XX } },
4553 { "(bad)", { XX } },
4554 { VEX_LEN_TABLE (VEX_LEN_3841_P_2) },
4555 { "(bad)", { XX } },
4556 },
4557
a5ff0eb2
L
4558 /* PREFIX_VEX_38DB */
4559 {
4560 { "(bad)", { XX } },
4561 { "(bad)", { XX } },
4562 { VEX_LEN_TABLE (VEX_LEN_38DB_P_2) },
4563 { "(bad)", { XX } },
4564 },
4565
4566 /* PREFIX_VEX_38DC */
4567 {
4568 { "(bad)", { XX } },
4569 { "(bad)", { XX } },
4570 { VEX_LEN_TABLE (VEX_LEN_38DC_P_2) },
4571 { "(bad)", { XX } },
4572 },
4573
4574 /* PREFIX_VEX_38DD */
4575 {
4576 { "(bad)", { XX } },
4577 { "(bad)", { XX } },
4578 { VEX_LEN_TABLE (VEX_LEN_38DD_P_2) },
4579 { "(bad)", { XX } },
4580 },
4581
4582 /* PREFIX_VEX_38DE */
4583 {
4584 { "(bad)", { XX } },
4585 { "(bad)", { XX } },
4586 { VEX_LEN_TABLE (VEX_LEN_38DE_P_2) },
4587 { "(bad)", { XX } },
4588 },
4589
4590 /* PREFIX_VEX_38DF */
4591 {
4592 { "(bad)", { XX } },
4593 { "(bad)", { XX } },
4594 { VEX_LEN_TABLE (VEX_LEN_38DF_P_2) },
4595 { "(bad)", { XX } },
4596 },
4597
c0f3af97
L
4598 /* PREFIX_VEX_3A04 */
4599 {
4600 { "(bad)", { XX } },
4601 { "(bad)", { XX } },
4602 { "vpermilps", { XM, EXx, Ib } },
4603 { "(bad)", { XX } },
4604 },
4605
4606 /* PREFIX_VEX_3A05 */
4607 {
4608 { "(bad)", { XX } },
4609 { "(bad)", { XX } },
4610 { "vpermilpd", { XM, EXx, Ib } },
4611 { "(bad)", { XX } },
4612 },
4613
4614 /* PREFIX_VEX_3A06 */
4615 {
4616 { "(bad)", { XX } },
4617 { "(bad)", { XX } },
4618 { VEX_LEN_TABLE (VEX_LEN_3A06_P_2) },
4619 { "(bad)", { XX } },
4620 },
4621
4622 /* PREFIX_VEX_3A08 */
4623 {
4624 { "(bad)", { XX } },
4625 { "(bad)", { XX } },
4626 { "vroundps", { XM, EXx, Ib } },
4627 { "(bad)", { XX } },
4628 },
4629
4630 /* PREFIX_VEX_3A09 */
4631 {
4632 { "(bad)", { XX } },
4633 { "(bad)", { XX } },
4634 { "vroundpd", { XM, EXx, Ib } },
4635 { "(bad)", { XX } },
4636 },
4637
4638 /* PREFIX_VEX_3A0A */
4639 {
4640 { "(bad)", { XX } },
4641 { "(bad)", { XX } },
4642 { VEX_LEN_TABLE (VEX_LEN_3A0A_P_2) },
4643 { "(bad)", { XX } },
4644 },
4645
4646 /* PREFIX_VEX_3A0B */
4647 {
4648 { "(bad)", { XX } },
4649 { "(bad)", { XX } },
4650 { VEX_LEN_TABLE (VEX_LEN_3A0B_P_2) },
4651 { "(bad)", { XX } },
4652 },
4653
4654 /* PREFIX_VEX_3A0C */
4655 {
4656 { "(bad)", { XX } },
4657 { "(bad)", { XX } },
4658 { "vblendps", { XM, Vex, EXx, Ib } },
4659 { "(bad)", { XX } },
4660 },
4661
4662 /* PREFIX_VEX_3A0D */
4663 {
4664 { "(bad)", { XX } },
4665 { "(bad)", { XX } },
4666 { "vblendpd", { XM, Vex, EXx, Ib } },
4667 { "(bad)", { XX } },
4668 },
4669
4670 /* PREFIX_VEX_3A0E */
4671 {
4672 { "(bad)", { XX } },
4673 { "(bad)", { XX } },
4674 { VEX_LEN_TABLE (VEX_LEN_3A0E_P_2) },
4675 { "(bad)", { XX } },
4676 },
4677
4678 /* PREFIX_VEX_3A0F */
4679 {
4680 { "(bad)", { XX } },
4681 { "(bad)", { XX } },
4682 { VEX_LEN_TABLE (VEX_LEN_3A0F_P_2) },
4683 { "(bad)", { XX } },
4684 },
4685
4686 /* PREFIX_VEX_3A14 */
4687 {
4688 { "(bad)", { XX } },
4689 { "(bad)", { XX } },
4690 { VEX_LEN_TABLE (VEX_LEN_3A14_P_2) },
4691 { "(bad)", { XX } },
4692 },
4693
4694 /* PREFIX_VEX_3A15 */
4695 {
4696 { "(bad)", { XX } },
4697 { "(bad)", { XX } },
4698 { VEX_LEN_TABLE (VEX_LEN_3A15_P_2) },
4699 { "(bad)", { XX } },
4700 },
4701
4702 /* PREFIX_VEX_3A16 */
4703 {
4704 { "(bad)", { XX } },
4705 { "(bad)", { XX } },
4706 { VEX_LEN_TABLE (VEX_LEN_3A16_P_2) },
4707 { "(bad)", { XX } },
4708 },
4709
4710 /* PREFIX_VEX_3A17 */
4711 {
4712 { "(bad)", { XX } },
4713 { "(bad)", { XX } },
4714 { VEX_LEN_TABLE (VEX_LEN_3A17_P_2) },
4715 { "(bad)", { XX } },
4716 },
4717
4718 /* PREFIX_VEX_3A18 */
4719 {
4720 { "(bad)", { XX } },
4721 { "(bad)", { XX } },
4722 { VEX_LEN_TABLE (VEX_LEN_3A18_P_2) },
4723 { "(bad)", { XX } },
4724 },
4725
4726 /* PREFIX_VEX_3A19 */
4727 {
4728 { "(bad)", { XX } },
4729 { "(bad)", { XX } },
4730 { VEX_LEN_TABLE (VEX_LEN_3A19_P_2) },
4731 { "(bad)", { XX } },
4732 },
4733
4734 /* PREFIX_VEX_3A20 */
4735 {
4736 { "(bad)", { XX } },
4737 { "(bad)", { XX } },
4738 { VEX_LEN_TABLE (VEX_LEN_3A20_P_2) },
4739 { "(bad)", { XX } },
4740 },
4741
4742 /* PREFIX_VEX_3A21 */
4743 {
4744 { "(bad)", { XX } },
4745 { "(bad)", { XX } },
4746 { VEX_LEN_TABLE (VEX_LEN_3A21_P_2) },
4747 { "(bad)", { XX } },
4748 },
4749
4750 /* PREFIX_VEX_3A22 */
4751 {
4752 { "(bad)", { XX } },
4753 { "(bad)", { XX } },
4754 { VEX_LEN_TABLE (VEX_LEN_3A22_P_2) },
4755 { "(bad)", { XX } },
4756 },
4757
4758 /* PREFIX_VEX_3A40 */
4759 {
4760 { "(bad)", { XX } },
4761 { "(bad)", { XX } },
4762 { "vdpps", { XM, Vex, EXx, Ib } },
4763 { "(bad)", { XX } },
4764 },
4765
4766 /* PREFIX_VEX_3A41 */
4767 {
4768 { "(bad)", { XX } },
4769 { "(bad)", { XX } },
4770 { VEX_LEN_TABLE (VEX_LEN_3A41_P_2) },
4771 { "(bad)", { XX } },
4772 },
4773
4774 /* PREFIX_VEX_3A42 */
4775 {
4776 { "(bad)", { XX } },
4777 { "(bad)", { XX } },
4778 { VEX_LEN_TABLE (VEX_LEN_3A42_P_2) },
4779 { "(bad)", { XX } },
4780 },
4781
4782 /* PREFIX_VEX_3A48 */
4783 {
4784 { "(bad)", { XX } },
4785 { "(bad)", { XX } },
dae39acc 4786 { "vpermil2ps", { XMVexW, Vex, EXVexImmW, EXVexImmW, VPERMIL2 } },
c0f3af97
L
4787 { "(bad)", { XX } },
4788 },
4789
4790 /* PREFIX_VEX_3A49 */
4791 {
4792 { "(bad)", { XX } },
4793 { "(bad)", { XX } },
dae39acc 4794 { "vpermil2pd", { XMVexW, Vex, EXVexImmW, EXVexImmW, VPERMIL2 } },
c0f3af97
L
4795 { "(bad)", { XX } },
4796 },
4797
4798 /* PREFIX_VEX_3A4A */
4799 {
4800 { "(bad)", { XX } },
4801 { "(bad)", { XX } },
4802 { "vblendvps", { XM, Vex, EXx, XMVexI4 } },
4803 { "(bad)", { XX } },
4804 },
4805
4806 /* PREFIX_VEX_3A4B */
4807 {
4808 { "(bad)", { XX } },
4809 { "(bad)", { XX } },
4810 { "vblendvpd", { XM, Vex, EXx, XMVexI4 } },
4811 { "(bad)", { XX } },
4812 },
4813
4814 /* PREFIX_VEX_3A4C */
4815 {
4816 { "(bad)", { XX } },
4817 { "(bad)", { XX } },
4818 { VEX_LEN_TABLE (VEX_LEN_3A4C_P_2) },
4819 { "(bad)", { XX } },
4820 },
4821
4822 /* PREFIX_VEX_3A5C */
4823 {
4824 { "(bad)", { XX } },
4825 { "(bad)", { XX } },
dae39acc 4826 { "vfmaddsubps", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
c0f3af97
L
4827 { "(bad)", { XX } },
4828 },
4829
4830 /* PREFIX_VEX_3A5D */
4831 {
4832 { "(bad)", { XX } },
4833 { "(bad)", { XX } },
dae39acc 4834 { "vfmaddsubpd", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
c0f3af97
L
4835 { "(bad)", { XX } },
4836 },
4837
4838 /* PREFIX_VEX_3A5E */
4839 {
4840 { "(bad)", { XX } },
4841 { "(bad)", { XX } },
dae39acc 4842 { "vfmsubaddps", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
c0f3af97
L
4843 { "(bad)", { XX } },
4844 },
4845
4846 /* PREFIX_VEX_3A5F */
4847 {
4848 { "(bad)", { XX } },
4849 { "(bad)", { XX } },
dae39acc 4850 { "vfmsubaddpd", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
c0f3af97
L
4851 { "(bad)", { XX } },
4852 },
4853
4854 /* PREFIX_VEX_3A60 */
4855 {
4856 { "(bad)", { XX } },
4857 { "(bad)", { XX } },
4858 { VEX_LEN_TABLE (VEX_LEN_3A60_P_2) },
4859 { "(bad)", { XX } },
4860 },
4861
4862 /* PREFIX_VEX_3A61 */
4863 {
4864 { "(bad)", { XX } },
4865 { "(bad)", { XX } },
4866 { VEX_LEN_TABLE (VEX_LEN_3A61_P_2) },
4867 { "(bad)", { XX } },
4868 },
4869
4870 /* PREFIX_VEX_3A62 */
4871 {
4872 { "(bad)", { XX } },
4873 { "(bad)", { XX } },
4874 { VEX_LEN_TABLE (VEX_LEN_3A62_P_2) },
4875 { "(bad)", { XX } },
4876 },
4877
4878 /* PREFIX_VEX_3A63 */
4879 {
4880 { "(bad)", { XX } },
4881 { "(bad)", { XX } },
4882 { VEX_LEN_TABLE (VEX_LEN_3A63_P_2) },
4883 { "(bad)", { XX } },
4884 },
4885
4886 /* PREFIX_VEX_3A68 */
4887 {
4888 { "(bad)", { XX } },
4889 { "(bad)", { XX } },
dae39acc 4890 { "vfmaddps", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
c0f3af97
L
4891 { "(bad)", { XX } },
4892 },
4893
4894 /* PREFIX_VEX_3A69 */
4895 {
4896 { "(bad)", { XX } },
4897 { "(bad)", { XX } },
dae39acc 4898 { "vfmaddpd", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
c0f3af97
L
4899 { "(bad)", { XX } },
4900 },
4901
4902 /* PREFIX_VEX_3A6A */
4903 {
4904 { "(bad)", { XX } },
4905 { "(bad)", { XX } },
4906 { VEX_LEN_TABLE (VEX_LEN_3A6A_P_2) },
4907 { "(bad)", { XX } },
4908 },
4909
4910 /* PREFIX_VEX_3A6B */
4911 {
4912 { "(bad)", { XX } },
4913 { "(bad)", { XX } },
4914 { VEX_LEN_TABLE (VEX_LEN_3A6B_P_2) },
4915 { "(bad)", { XX } },
4916 },
4917
4918 /* PREFIX_VEX_3A6C */
4919 {
4920 { "(bad)", { XX } },
4921 { "(bad)", { XX } },
dae39acc 4922 { "vfmsubps", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
c0f3af97
L
4923 { "(bad)", { XX } },
4924 },
4925
4926 /* PREFIX_VEX_3A6D */
4927 {
4928 { "(bad)", { XX } },
4929 { "(bad)", { XX } },
dae39acc 4930 { "vfmsubpd", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
c0f3af97
L
4931 { "(bad)", { XX } },
4932 },
4933
4934 /* PREFIX_VEX_3A6E */
4935 {
4936 { "(bad)", { XX } },
4937 { "(bad)", { XX } },
4938 { VEX_LEN_TABLE (VEX_LEN_3A6E_P_2) },
4939 { "(bad)", { XX } },
4940 },
4941
4942 /* PREFIX_VEX_3A6F */
4943 {
4944 { "(bad)", { XX } },
4945 { "(bad)", { XX } },
4946 { VEX_LEN_TABLE (VEX_LEN_3A6F_P_2) },
4947 { "(bad)", { XX } },
4948 },
4949
4950 /* PREFIX_VEX_3A78 */
4951 {
4952 { "(bad)", { XX } },
4953 { "(bad)", { XX } },
dae39acc 4954 { "vfnmaddps", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
c0f3af97
L
4955 { "(bad)", { XX } },
4956 },
4957
4958 /* PREFIX_VEX_3A79 */
4959 {
4960 { "(bad)", { XX } },
4961 { "(bad)", { XX } },
dae39acc 4962 { "vfnmaddpd", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
c0f3af97
L
4963 { "(bad)", { XX } },
4964 },
4965
4966 /* PREFIX_VEX_3A7A */
4967 {
4968 { "(bad)", { XX } },
4969 { "(bad)", { XX } },
4970 { VEX_LEN_TABLE (VEX_LEN_3A7A_P_2) },
4971 { "(bad)", { XX } },
4972 },
4973
4974 /* PREFIX_VEX_3A7B */
4975 {
4976 { "(bad)", { XX } },
4977 { "(bad)", { XX } },
4978 { VEX_LEN_TABLE (VEX_LEN_3A7B_P_2) },
4979 { "(bad)", { XX } },
4980 },
4981
4982 /* PREFIX_VEX_3A7C */
4983 {
4984 { "(bad)", { XX } },
4985 { "(bad)", { XX } },
dae39acc 4986 { "vfnmsubps", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
c0f3af97
L
4987 { "(bad)", { XX } },
4988 },
4989
4990 /* PREFIX_VEX_3A7D */
4991 {
4992 { "(bad)", { XX } },
4993 { "(bad)", { XX } },
dae39acc 4994 { "vfnmsubpd", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
c0f3af97
L
4995 { "(bad)", { XX } },
4996 },
4997
4998 /* PREFIX_VEX_3A7E */
4999 {
5000 { "(bad)", { XX } },
5001 { "(bad)", { XX } },
5002 { VEX_LEN_TABLE (VEX_LEN_3A7E_P_2) },
5003 { "(bad)", { XX } },
5004 },
5005
5006 /* PREFIX_VEX_3A7F */
5007 {
5008 { "(bad)", { XX } },
5009 { "(bad)", { XX } },
5010 { VEX_LEN_TABLE (VEX_LEN_3A7F_P_2) },
5011 { "(bad)", { XX } },
5012 },
a5ff0eb2
L
5013
5014 /* PREFIX_VEX_3ADF */
5015 {
5016 { "(bad)", { XX } },
5017 { "(bad)", { XX } },
5018 { VEX_LEN_TABLE (VEX_LEN_3ADF_P_2) },
5019 { "(bad)", { XX } },
5020 },
c0f3af97
L
5021};
5022
5023static const struct dis386 x86_64_table[][2] = {
5024 /* X86_64_06 */
5025 {
5026 { "push{T|}", { es } },
5027 { "(bad)", { XX } },
5028 },
5029
5030 /* X86_64_07 */
5031 {
5032 { "pop{T|}", { es } },
5033 { "(bad)", { XX } },
5034 },
5035
5036 /* X86_64_0D */
5037 {
5038 { "push{T|}", { cs } },
5039 { "(bad)", { XX } },
5040 },
5041
5042 /* X86_64_16 */
5043 {
5044 { "push{T|}", { ss } },
5045 { "(bad)", { XX } },
5046 },
5047
5048 /* X86_64_17 */
5049 {
5050 { "pop{T|}", { ss } },
5051 { "(bad)", { XX } },
5052 },
5053
5054 /* X86_64_1E */
5055 {
5056 { "push{T|}", { ds } },
5057 { "(bad)", { XX } },
5058 },
5059
5060 /* X86_64_1F */
5061 {
5062 { "pop{T|}", { ds } },
5063 { "(bad)", { XX } },
5064 },
5065
5066 /* X86_64_27 */
5067 {
5068 { "daa", { XX } },
5069 { "(bad)", { XX } },
5070 },
5071
5072 /* X86_64_2F */
5073 {
5074 { "das", { XX } },
5075 { "(bad)", { XX } },
5076 },
5077
5078 /* X86_64_37 */
5079 {
5080 { "aaa", { XX } },
5081 { "(bad)", { XX } },
5082 },
5083
5084 /* X86_64_3F */
5085 {
5086 { "aas", { XX } },
5087 { "(bad)", { XX } },
5088 },
5089
5090 /* X86_64_60 */
5091 {
5092 { "pusha{P|}", { XX } },
5093 { "(bad)", { XX } },
5094 },
5095
5096 /* X86_64_61 */
5097 {
5098 { "popa{P|}", { XX } },
5099 { "(bad)", { XX } },
5100 },
5101
5102 /* X86_64_62 */
5103 {
5104 { MOD_TABLE (MOD_62_32BIT) },
5105 { "(bad)", { XX } },
5106 },
5107
5108 /* X86_64_63 */
5109 {
5110 { "arpl", { Ew, Gw } },
5111 { "movs{lq|xd}", { Gv, Ed } },
5112 },
5113
5114 /* X86_64_6D */
5115 {
5116 { "ins{R|}", { Yzr, indirDX } },
5117 { "ins{G|}", { Yzr, indirDX } },
5118 },
5119
5120 /* X86_64_6F */
5121 {
5122 { "outs{R|}", { indirDXr, Xz } },
5123 { "outs{G|}", { indirDXr, Xz } },
5124 },
5125
5126 /* X86_64_9A */
5127 {
5128 { "Jcall{T|}", { Ap } },
5129 { "(bad)", { XX } },
5130 },
5131
5132 /* X86_64_C4 */
5133 {
5134 { MOD_TABLE (MOD_C4_32BIT) },
5135 { VEX_C4_TABLE (VEX_0F) },
5136 },
5137
5138 /* X86_64_C5 */
5139 {
5140 { MOD_TABLE (MOD_C5_32BIT) },
5141 { VEX_C5_TABLE (VEX_0F) },
5142 },
5143
5144 /* X86_64_CE */
5145 {
5146 { "into", { XX } },
5147 { "(bad)", { XX } },
5148 },
5149
5150 /* X86_64_D4 */
5151 {
5152 { "aam", { sIb } },
5153 { "(bad)", { XX } },
5154 },
5155
5156 /* X86_64_D5 */
5157 {
5158 { "aad", { sIb } },
5159 { "(bad)", { XX } },
5160 },
5161
5162 /* X86_64_EA */
5163 {
5164 { "Jjmp{T|}", { Ap } },
5165 { "(bad)", { XX } },
5166 },
5167
5168 /* X86_64_0F01_REG_0 */
5169 {
5170 { "sgdt{Q|IQ}", { M } },
5171 { "sgdt", { M } },
5172 },
5173
5174 /* X86_64_0F01_REG_1 */
5175 {
5176 { "sidt{Q|IQ}", { M } },
5177 { "sidt", { M } },
5178 },
5179
5180 /* X86_64_0F01_REG_2 */
5181 {
5182 { "lgdt{Q|Q}", { M } },
5183 { "lgdt", { M } },
5184 },
5185
5186 /* X86_64_0F01_REG_3 */
5187 {
5188 { "lidt{Q|Q}", { M } },
5189 { "lidt", { M } },
5190 },
5191};
5192
5193static const struct dis386 three_byte_table[][256] = {
5194 /* THREE_BYTE_0F24 */
5195 {
5196 /* 00 */
5197 { "fmaddps", { { OP_DREX4, q_mode } } },
5198 { "fmaddpd", { { OP_DREX4, q_mode } } },
5199 { "fmaddss", { { OP_DREX4, w_mode } } },
5200 { "fmaddsd", { { OP_DREX4, d_mode } } },
5201 { "fmaddps", { { OP_DREX4, DREX_OC1 + q_mode } } },
5202 { "fmaddpd", { { OP_DREX4, DREX_OC1 + q_mode } } },
5203 { "fmaddss", { { OP_DREX4, DREX_OC1 + w_mode } } },
5204 { "fmaddsd", { { OP_DREX4, DREX_OC1 + d_mode } } },
5205 /* 08 */
5206 { "fmsubps", { { OP_DREX4, q_mode } } },
5207 { "fmsubpd", { { OP_DREX4, q_mode } } },
5208 { "fmsubss", { { OP_DREX4, w_mode } } },
5209 { "fmsubsd", { { OP_DREX4, d_mode } } },
5210 { "fmsubps", { { OP_DREX4, DREX_OC1 + q_mode } } },
5211 { "fmsubpd", { { OP_DREX4, DREX_OC1 + q_mode } } },
5212 { "fmsubss", { { OP_DREX4, DREX_OC1 + w_mode } } },
5213 { "fmsubsd", { { OP_DREX4, DREX_OC1 + d_mode } } },
5214 /* 10 */
5215 { "fnmaddps", { { OP_DREX4, q_mode } } },
5216 { "fnmaddpd", { { OP_DREX4, q_mode } } },
5217 { "fnmaddss", { { OP_DREX4, w_mode } } },
5218 { "fnmaddsd", { { OP_DREX4, d_mode } } },
5219 { "fnmaddps", { { OP_DREX4, DREX_OC1 + q_mode } } },
5220 { "fnmaddpd", { { OP_DREX4, DREX_OC1 + q_mode } } },
5221 { "fnmaddss", { { OP_DREX4, DREX_OC1 + w_mode } } },
5222 { "fnmaddsd", { { OP_DREX4, DREX_OC1 + d_mode } } },
5223 /* 18 */
5224 { "fnmsubps", { { OP_DREX4, q_mode } } },
5225 { "fnmsubpd", { { OP_DREX4, q_mode } } },
5226 { "fnmsubss", { { OP_DREX4, w_mode } } },
5227 { "fnmsubsd", { { OP_DREX4, d_mode } } },
5228 { "fnmsubps", { { OP_DREX4, DREX_OC1 + q_mode } } },
5229 { "fnmsubpd", { { OP_DREX4, DREX_OC1 + q_mode } } },
5230 { "fnmsubss", { { OP_DREX4, DREX_OC1 + w_mode } } },
5231 { "fnmsubsd", { { OP_DREX4, DREX_OC1 + d_mode } } },
5232 /* 20 */
5233 { "permps", { { OP_DREX4, q_mode } } },
5234 { "permpd", { { OP_DREX4, q_mode } } },
5235 { "pcmov", { { OP_DREX4, q_mode } } },
5236 { "pperm", { { OP_DREX4, q_mode } } },
5237 { "permps", { { OP_DREX4, DREX_OC1 + q_mode } } },
5238 { "permpd", { { OP_DREX4, DREX_OC1 + q_mode } } },
5239 { "pcmov", { { OP_DREX4, DREX_OC1 + w_mode } } },
5240 { "pperm", { { OP_DREX4, DREX_OC1 + d_mode } } },
5241 /* 28 */
5242 { "(bad)", { XX } },
5243 { "(bad)", { XX } },
5244 { "(bad)", { XX } },
5245 { "(bad)", { XX } },
5246 { "(bad)", { XX } },
5247 { "(bad)", { XX } },
5248 { "(bad)", { XX } },
5249 { "(bad)", { XX } },
5250 /* 30 */
5251 { "(bad)", { XX } },
5252 { "(bad)", { XX } },
5253 { "(bad)", { XX } },
5254 { "(bad)", { XX } },
5255 { "(bad)", { XX } },
5256 { "(bad)", { XX } },
5257 { "(bad)", { XX } },
5258 { "(bad)", { XX } },
5259 /* 38 */
5260 { "(bad)", { XX } },
5261 { "(bad)", { XX } },
5262 { "(bad)", { XX } },
5263 { "(bad)", { XX } },
5264 { "(bad)", { XX } },
5265 { "(bad)", { XX } },
5266 { "(bad)", { XX } },
5267 { "(bad)", { XX } },
5268 /* 40 */
5269 { "protb", { { OP_DREX3, q_mode } } },
5270 { "protw", { { OP_DREX3, q_mode } } },
5271 { "protd", { { OP_DREX3, q_mode } } },
5272 { "protq", { { OP_DREX3, q_mode } } },
5273 { "pshlb", { { OP_DREX3, q_mode } } },
5274 { "pshlw", { { OP_DREX3, q_mode } } },
5275 { "pshld", { { OP_DREX3, q_mode } } },
5276 { "pshlq", { { OP_DREX3, q_mode } } },
5277 /* 48 */
5278 { "pshab", { { OP_DREX3, q_mode } } },
5279 { "pshaw", { { OP_DREX3, q_mode } } },
5280 { "pshad", { { OP_DREX3, q_mode } } },
5281 { "pshaq", { { OP_DREX3, q_mode } } },
5282 { "(bad)", { XX } },
5283 { "(bad)", { XX } },
5284 { "(bad)", { XX } },
5285 { "(bad)", { XX } },
5286 /* 50 */
5287 { "(bad)", { XX } },
5288 { "(bad)", { XX } },
5289 { "(bad)", { XX } },
5290 { "(bad)", { XX } },
5291 { "(bad)", { XX } },
5292 { "(bad)", { XX } },
5293 { "(bad)", { XX } },
5294 { "(bad)", { XX } },
5295 /* 58 */
5296 { "(bad)", { XX } },
5297 { "(bad)", { XX } },
5298 { "(bad)", { XX } },
5299 { "(bad)", { XX } },
5300 { "(bad)", { XX } },
5301 { "(bad)", { XX } },
5302 { "(bad)", { XX } },
5303 { "(bad)", { XX } },
5304 /* 60 */
5305 { "(bad)", { XX } },
5306 { "(bad)", { XX } },
5307 { "(bad)", { XX } },
5308 { "(bad)", { XX } },
5309 { "(bad)", { XX } },
5310 { "(bad)", { XX } },
5311 { "(bad)", { XX } },
5312 { "(bad)", { XX } },
5313 /* 68 */
5314 { "(bad)", { XX } },
5315 { "(bad)", { XX } },
5316 { "(bad)", { XX } },
5317 { "(bad)", { XX } },
5318 { "(bad)", { XX } },
5319 { "(bad)", { XX } },
5320 { "(bad)", { XX } },
5321 { "(bad)", { XX } },
5322 /* 70 */
5323 { "(bad)", { XX } },
5324 { "(bad)", { XX } },
5325 { "(bad)", { XX } },
5326 { "(bad)", { XX } },
5327 { "(bad)", { XX } },
5328 { "(bad)", { XX } },
5329 { "(bad)", { XX } },
5330 { "(bad)", { XX } },
5331 /* 78 */
5332 { "(bad)", { XX } },
5333 { "(bad)", { XX } },
5334 { "(bad)", { XX } },
5335 { "(bad)", { XX } },
5336 { "(bad)", { XX } },
5337 { "(bad)", { XX } },
5338 { "(bad)", { XX } },
5339 { "(bad)", { XX } },
5340 /* 80 */
5341 { "(bad)", { XX } },
5342 { "(bad)", { XX } },
5343 { "(bad)", { XX } },
5344 { "(bad)", { XX } },
5345 { "(bad)", { XX } },
5346 { "pmacssww", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5347 { "pmacsswd", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5348 { "pmacssdql", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5349 /* 88 */
5350 { "(bad)", { XX } },
5351 { "(bad)", { XX } },
5352 { "(bad)", { XX } },
5353 { "(bad)", { XX } },
5354 { "(bad)", { XX } },
5355 { "(bad)", { XX } },
5356 { "pmacssdd", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5357 { "pmacssdqh", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5358 /* 90 */
5359 { "(bad)", { XX } },
5360 { "(bad)", { XX } },
5361 { "(bad)", { XX } },
5362 { "(bad)", { XX } },
5363 { "(bad)", { XX } },
5364 { "pmacsww", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5365 { "pmacswd", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5366 { "pmacsdql", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5367 /* 98 */
5368 { "(bad)", { XX } },
5369 { "(bad)", { XX } },
5370 { "(bad)", { XX } },
5371 { "(bad)", { XX } },
5372 { "(bad)", { XX } },
5373 { "(bad)", { XX } },
5374 { "pmacsdd", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5375 { "pmacsdqh", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5376 /* a0 */
5377 { "(bad)", { XX } },
5378 { "(bad)", { XX } },
5379 { "(bad)", { XX } },
5380 { "(bad)", { XX } },
5381 { "(bad)", { XX } },
5382 { "(bad)", { XX } },
5383 { "pmadcsswd", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5384 { "(bad)", { XX } },
5385 /* a8 */
5386 { "(bad)", { XX } },
5387 { "(bad)", { XX } },
5388 { "(bad)", { XX } },
5389 { "(bad)", { XX } },
5390 { "(bad)", { XX } },
5391 { "(bad)", { XX } },
5392 { "(bad)", { XX } },
5393 { "(bad)", { XX } },
5394 /* b0 */
5395 { "(bad)", { XX } },
5396 { "(bad)", { XX } },
5397 { "(bad)", { XX } },
5398 { "(bad)", { XX } },
5399 { "(bad)", { XX } },
5400 { "(bad)", { XX } },
5401 { "pmadcswd", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5402 { "(bad)", { XX } },
5403 /* b8 */
5404 { "(bad)", { XX } },
5405 { "(bad)", { XX } },
5406 { "(bad)", { XX } },
5407 { "(bad)", { XX } },
5408 { "(bad)", { XX } },
5409 { "(bad)", { XX } },
5410 { "(bad)", { XX } },
5411 { "(bad)", { XX } },
5412 /* c0 */
5413 { "(bad)", { XX } },
5414 { "(bad)", { XX } },
5415 { "(bad)", { XX } },
5416 { "(bad)", { XX } },
5417 { "(bad)", { XX } },
5418 { "(bad)", { XX } },
5419 { "(bad)", { XX } },
5420 { "(bad)", { XX } },
5421 /* c8 */
5422 { "(bad)", { XX } },
5423 { "(bad)", { XX } },
5424 { "(bad)", { XX } },
5425 { "(bad)", { XX } },
5426 { "(bad)", { XX } },
5427 { "(bad)", { XX } },
5428 { "(bad)", { XX } },
5429 { "(bad)", { XX } },
5430 /* d0 */
5431 { "(bad)", { XX } },
5432 { "(bad)", { XX } },
5433 { "(bad)", { XX } },
5434 { "(bad)", { XX } },
5435 { "(bad)", { XX } },
5436 { "(bad)", { XX } },
5437 { "(bad)", { XX } },
5438 { "(bad)", { XX } },
5439 /* d8 */
5440 { "(bad)", { XX } },
5441 { "(bad)", { XX } },
5442 { "(bad)", { XX } },
5443 { "(bad)", { XX } },
5444 { "(bad)", { XX } },
5445 { "(bad)", { XX } },
5446 { "(bad)", { XX } },
5447 { "(bad)", { XX } },
5448 /* e0 */
5449 { "(bad)", { XX } },
5450 { "(bad)", { XX } },
5451 { "(bad)", { XX } },
5452 { "(bad)", { XX } },
5453 { "(bad)", { XX } },
5454 { "(bad)", { XX } },
5455 { "(bad)", { XX } },
5456 { "(bad)", { XX } },
5457 /* e8 */
5458 { "(bad)", { XX } },
5459 { "(bad)", { XX } },
5460 { "(bad)", { XX } },
5461 { "(bad)", { XX } },
5462 { "(bad)", { XX } },
5463 { "(bad)", { XX } },
5464 { "(bad)", { XX } },
5465 { "(bad)", { XX } },
5466 /* f0 */
5467 { "(bad)", { XX } },
5468 { "(bad)", { XX } },
5469 { "(bad)", { XX } },
5470 { "(bad)", { XX } },
5471 { "(bad)", { XX } },
5472 { "(bad)", { XX } },
5473 { "(bad)", { XX } },
5474 { "(bad)", { XX } },
5475 /* f8 */
5476 { "(bad)", { XX } },
5477 { "(bad)", { XX } },
5478 { "(bad)", { XX } },
5479 { "(bad)", { XX } },
5480 { "(bad)", { XX } },
5481 { "(bad)", { XX } },
5482 { "(bad)", { XX } },
5483 { "(bad)", { XX } },
5484 },
5485 /* THREE_BYTE_0F25 */
5486 {
5487 /* 00 */
5488 { "(bad)", { XX } },
5489 { "(bad)", { XX } },
5490 { "(bad)", { XX } },
5491 { "(bad)", { XX } },
5492 { "(bad)", { XX } },
5493 { "(bad)", { XX } },
5494 { "(bad)", { XX } },
5495 { "(bad)", { XX } },
5496 /* 08 */
5497 { "(bad)", { XX } },
5498 { "(bad)", { XX } },
5499 { "(bad)", { XX } },
5500 { "(bad)", { XX } },
5501 { "(bad)", { XX } },
5502 { "(bad)", { XX } },
5503 { "(bad)", { XX } },
5504 { "(bad)", { XX } },
5505 /* 10 */
5506 { "(bad)", { XX } },
5507 { "(bad)", { XX } },
5508 { "(bad)", { XX } },
5509 { "(bad)", { XX } },
5510 { "(bad)", { XX } },
5511 { "(bad)", { XX } },
5512 { "(bad)", { XX } },
5513 { "(bad)", { XX } },
5514 /* 18 */
5515 { "(bad)", { XX } },
5516 { "(bad)", { XX } },
5517 { "(bad)", { XX } },
5518 { "(bad)", { XX } },
5519 { "(bad)", { XX } },
5520 { "(bad)", { XX } },
5521 { "(bad)", { XX } },
5522 { "(bad)", { XX } },
5523 /* 20 */
5524 { "(bad)", { XX } },
5525 { "(bad)", { XX } },
5526 { "(bad)", { XX } },
5527 { "(bad)", { XX } },
5528 { "(bad)", { XX } },
5529 { "(bad)", { XX } },
5530 { "(bad)", { XX } },
5531 { "(bad)", { XX } },
5532 /* 28 */
5533 { "(bad)", { XX } },
5534 { "(bad)", { XX } },
5535 { "(bad)", { XX } },
5536 { "(bad)", { XX } },
5537 { "comps", { { OP_DREX3, q_mode }, { OP_DREX_FCMP, b_mode } } },
5538 { "compd", { { OP_DREX3, q_mode }, { OP_DREX_FCMP, b_mode } } },
5539 { "comss", { { OP_DREX3, w_mode }, { OP_DREX_FCMP, b_mode } } },
5540 { "comsd", { { OP_DREX3, d_mode }, { OP_DREX_FCMP, b_mode } } },
5541 /* 30 */
5542 { "(bad)", { XX } },
5543 { "(bad)", { XX } },
5544 { "(bad)", { XX } },
5545 { "(bad)", { XX } },
5546 { "(bad)", { XX } },
5547 { "(bad)", { XX } },
5548 { "(bad)", { XX } },
5549 { "(bad)", { XX } },
5550 /* 38 */
5551 { "(bad)", { XX } },
5552 { "(bad)", { XX } },
5553 { "(bad)", { XX } },
5554 { "(bad)", { XX } },
5555 { "(bad)", { XX } },
5556 { "(bad)", { XX } },
5557 { "(bad)", { XX } },
5558 { "(bad)", { XX } },
5559 /* 40 */
5560 { "(bad)", { XX } },
5561 { "(bad)", { XX } },
5562 { "(bad)", { XX } },
5563 { "(bad)", { XX } },
5564 { "(bad)", { XX } },
5565 { "(bad)", { XX } },
5566 { "(bad)", { XX } },
5567 { "(bad)", { XX } },
5568 /* 48 */
5569 { "(bad)", { XX } },
5570 { "(bad)", { XX } },
5571 { "(bad)", { XX } },
5572 { "(bad)", { XX } },
5573 { "pcomb", { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
5574 { "pcomw", { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
5575 { "pcomd", { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
5576 { "pcomq", { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
5577 /* 50 */
5578 { "(bad)", { XX } },
5579 { "(bad)", { XX } },
5580 { "(bad)", { XX } },
5581 { "(bad)", { XX } },
5582 { "(bad)", { XX } },
5583 { "(bad)", { XX } },
5584 { "(bad)", { XX } },
5585 { "(bad)", { XX } },
5586 /* 58 */
5587 { "(bad)", { XX } },
5588 { "(bad)", { XX } },
5589 { "(bad)", { XX } },
5590 { "(bad)", { XX } },
5591 { "(bad)", { XX } },
5592 { "(bad)", { XX } },
5593 { "(bad)", { XX } },
5594 { "(bad)", { XX } },
5595 /* 60 */
5596 { "(bad)", { XX } },
5597 { "(bad)", { XX } },
5598 { "(bad)", { XX } },
5599 { "(bad)", { XX } },
5600 { "(bad)", { XX } },
5601 { "(bad)", { XX } },
5602 { "(bad)", { XX } },
5603 { "(bad)", { XX } },
5604 /* 68 */
5605 { "(bad)", { XX } },
5606 { "(bad)", { XX } },
5607 { "(bad)", { XX } },
5608 { "(bad)", { XX } },
5609 { "pcomub", { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
5610 { "pcomuw", { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
5611 { "pcomud", { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
5612 { "pcomuq", { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
5613 /* 70 */
5614 { "(bad)", { XX } },
5615 { "(bad)", { XX } },
5616 { "(bad)", { XX } },
5617 { "(bad)", { XX } },
5618 { "(bad)", { XX } },
5619 { "(bad)", { XX } },
5620 { "(bad)", { XX } },
5621 { "(bad)", { XX } },
5622 /* 78 */
5623 { "(bad)", { XX } },
5624 { "(bad)", { XX } },
5625 { "(bad)", { XX } },
5626 { "(bad)", { XX } },
5627 { "(bad)", { XX } },
5628 { "(bad)", { XX } },
5629 { "(bad)", { XX } },
5630 { "(bad)", { XX } },
5631 /* 80 */
5632 { "(bad)", { XX } },
5633 { "(bad)", { XX } },
5634 { "(bad)", { XX } },
5635 { "(bad)", { XX } },
5636 { "(bad)", { XX } },
5637 { "(bad)", { XX } },
5638 { "(bad)", { XX } },
5639 { "(bad)", { XX } },
5640 /* 88 */
5641 { "(bad)", { XX } },
5642 { "(bad)", { XX } },
5643 { "(bad)", { XX } },
5644 { "(bad)", { XX } },
5645 { "(bad)", { XX } },
5646 { "(bad)", { XX } },
5647 { "(bad)", { XX } },
5648 { "(bad)", { XX } },
5649 /* 90 */
5650 { "(bad)", { XX } },
5651 { "(bad)", { XX } },
5652 { "(bad)", { XX } },
5653 { "(bad)", { XX } },
5654 { "(bad)", { XX } },
5655 { "(bad)", { XX } },
5656 { "(bad)", { XX } },
5657 { "(bad)", { XX } },
5658 /* 98 */
5659 { "(bad)", { XX } },
5660 { "(bad)", { XX } },
5661 { "(bad)", { XX } },
5662 { "(bad)", { XX } },
5663 { "(bad)", { XX } },
5664 { "(bad)", { XX } },
5665 { "(bad)", { XX } },
5666 { "(bad)", { XX } },
5667 /* a0 */
5668 { "(bad)", { XX } },
5669 { "(bad)", { XX } },
5670 { "(bad)", { XX } },
5671 { "(bad)", { XX } },
5672 { "(bad)", { XX } },
5673 { "(bad)", { XX } },
5674 { "(bad)", { XX } },
5675 { "(bad)", { XX } },
5676 /* a8 */
5677 { "(bad)", { XX } },
5678 { "(bad)", { XX } },
5679 { "(bad)", { XX } },
5680 { "(bad)", { XX } },
5681 { "(bad)", { XX } },
5682 { "(bad)", { XX } },
5683 { "(bad)", { XX } },
5684 { "(bad)", { XX } },
5685 /* b0 */
5686 { "(bad)", { XX } },
5687 { "(bad)", { XX } },
5688 { "(bad)", { XX } },
5689 { "(bad)", { XX } },
5690 { "(bad)", { XX } },
5691 { "(bad)", { XX } },
5692 { "(bad)", { XX } },
5693 { "(bad)", { XX } },
5694 /* b8 */
5695 { "(bad)", { XX } },
5696 { "(bad)", { XX } },
5697 { "(bad)", { XX } },
5698 { "(bad)", { XX } },
5699 { "(bad)", { XX } },
5700 { "(bad)", { XX } },
5701 { "(bad)", { XX } },
5702 { "(bad)", { XX } },
5703 /* c0 */
5704 { "(bad)", { XX } },
5705 { "(bad)", { XX } },
5706 { "(bad)", { XX } },
5707 { "(bad)", { XX } },
5708 { "(bad)", { XX } },
5709 { "(bad)", { XX } },
5710 { "(bad)", { XX } },
5711 { "(bad)", { XX } },
5712 /* c8 */
5713 { "(bad)", { XX } },
5714 { "(bad)", { XX } },
5715 { "(bad)", { XX } },
5716 { "(bad)", { XX } },
5717 { "(bad)", { XX } },
5718 { "(bad)", { XX } },
5719 { "(bad)", { XX } },
5720 { "(bad)", { XX } },
5721 /* d0 */
5722 { "(bad)", { XX } },
5723 { "(bad)", { XX } },
5724 { "(bad)", { XX } },
5725 { "(bad)", { XX } },
5726 { "(bad)", { XX } },
5727 { "(bad)", { XX } },
5728 { "(bad)", { XX } },
5729 { "(bad)", { XX } },
5730 /* d8 */
5731 { "(bad)", { XX } },
5732 { "(bad)", { XX } },
5733 { "(bad)", { XX } },
5734 { "(bad)", { XX } },
5735 { "(bad)", { XX } },
5736 { "(bad)", { XX } },
5737 { "(bad)", { XX } },
5738 { "(bad)", { XX } },
5739 /* e0 */
5740 { "(bad)", { XX } },
5741 { "(bad)", { XX } },
5742 { "(bad)", { XX } },
5743 { "(bad)", { XX } },
5744 { "(bad)", { XX } },
5745 { "(bad)", { XX } },
5746 { "(bad)", { XX } },
5747 { "(bad)", { XX } },
5748 /* e8 */
5749 { "(bad)", { XX } },
5750 { "(bad)", { XX } },
5751 { "(bad)", { XX } },
5752 { "(bad)", { XX } },
5753 { "(bad)", { XX } },
5754 { "(bad)", { XX } },
5755 { "(bad)", { XX } },
5756 { "(bad)", { XX } },
5757 /* f0 */
5758 { "(bad)", { XX } },
5759 { "(bad)", { XX } },
5760 { "(bad)", { XX } },
5761 { "(bad)", { XX } },
5762 { "(bad)", { XX } },
5763 { "(bad)", { XX } },
5764 { "(bad)", { XX } },
5765 { "(bad)", { XX } },
5766 /* f8 */
5767 { "(bad)", { XX } },
5768 { "(bad)", { XX } },
5769 { "(bad)", { XX } },
5770 { "(bad)", { XX } },
5771 { "(bad)", { XX } },
5772 { "(bad)", { XX } },
5773 { "(bad)", { XX } },
5774 { "(bad)", { XX } },
5775 },
5776 /* THREE_BYTE_0F38 */
5777 {
5778 /* 00 */
5779 { "pshufb", { MX, EM } },
5780 { "phaddw", { MX, EM } },
5781 { "phaddd", { MX, EM } },
5782 { "phaddsw", { MX, EM } },
5783 { "pmaddubsw", { MX, EM } },
5784 { "phsubw", { MX, EM } },
5785 { "phsubd", { MX, EM } },
5786 { "phsubsw", { MX, EM } },
5787 /* 08 */
5788 { "psignb", { MX, EM } },
5789 { "psignw", { MX, EM } },
5790 { "psignd", { MX, EM } },
5791 { "pmulhrsw", { MX, EM } },
5792 { "(bad)", { XX } },
5793 { "(bad)", { XX } },
5794 { "(bad)", { XX } },
5795 { "(bad)", { XX } },
5796 /* 10 */
5797 { PREFIX_TABLE (PREFIX_0F3810) },
5798 { "(bad)", { XX } },
5799 { "(bad)", { XX } },
5800 { "(bad)", { XX } },
5801 { PREFIX_TABLE (PREFIX_0F3814) },
5802 { PREFIX_TABLE (PREFIX_0F3815) },
5803 { "(bad)", { XX } },
5804 { PREFIX_TABLE (PREFIX_0F3817) },
5805 /* 18 */
5806 { "(bad)", { XX } },
5807 { "(bad)", { XX } },
5808 { "(bad)", { XX } },
5809 { "(bad)", { XX } },
5810 { "pabsb", { MX, EM } },
5811 { "pabsw", { MX, EM } },
5812 { "pabsd", { MX, EM } },
5813 { "(bad)", { XX } },
5814 /* 20 */
5815 { PREFIX_TABLE (PREFIX_0F3820) },
5816 { PREFIX_TABLE (PREFIX_0F3821) },
5817 { PREFIX_TABLE (PREFIX_0F3822) },
5818 { PREFIX_TABLE (PREFIX_0F3823) },
5819 { PREFIX_TABLE (PREFIX_0F3824) },
5820 { PREFIX_TABLE (PREFIX_0F3825) },
5821 { "(bad)", { XX } },
5822 { "(bad)", { XX } },
5823 /* 28 */
5824 { PREFIX_TABLE (PREFIX_0F3828) },
5825 { PREFIX_TABLE (PREFIX_0F3829) },
5826 { PREFIX_TABLE (PREFIX_0F382A) },
5827 { PREFIX_TABLE (PREFIX_0F382B) },
5828 { "(bad)", { XX } },
5829 { "(bad)", { XX } },
5830 { "(bad)", { XX } },
5831 { "(bad)", { XX } },
5832 /* 30 */
5833 { PREFIX_TABLE (PREFIX_0F3830) },
5834 { PREFIX_TABLE (PREFIX_0F3831) },
5835 { PREFIX_TABLE (PREFIX_0F3832) },
5836 { PREFIX_TABLE (PREFIX_0F3833) },
5837 { PREFIX_TABLE (PREFIX_0F3834) },
5838 { PREFIX_TABLE (PREFIX_0F3835) },
5839 { "(bad)", { XX } },
5840 { PREFIX_TABLE (PREFIX_0F3837) },
5841 /* 38 */
5842 { PREFIX_TABLE (PREFIX_0F3838) },
5843 { PREFIX_TABLE (PREFIX_0F3839) },
5844 { PREFIX_TABLE (PREFIX_0F383A) },
5845 { PREFIX_TABLE (PREFIX_0F383B) },
5846 { PREFIX_TABLE (PREFIX_0F383C) },
5847 { PREFIX_TABLE (PREFIX_0F383D) },
5848 { PREFIX_TABLE (PREFIX_0F383E) },
5849 { PREFIX_TABLE (PREFIX_0F383F) },
5850 /* 40 */
5851 { PREFIX_TABLE (PREFIX_0F3840) },
5852 { PREFIX_TABLE (PREFIX_0F3841) },
5853 { "(bad)", { XX } },
5854 { "(bad)", { XX } },
5855 { "(bad)", { XX } },
5856 { "(bad)", { XX } },
5857 { "(bad)", { XX } },
5858 { "(bad)", { XX } },
5859 /* 48 */
5860 { "(bad)", { XX } },
5861 { "(bad)", { XX } },
5862 { "(bad)", { XX } },
5863 { "(bad)", { XX } },
5864 { "(bad)", { XX } },
5865 { "(bad)", { XX } },
5866 { "(bad)", { XX } },
5867 { "(bad)", { XX } },
5868 /* 50 */
5869 { "(bad)", { XX } },
5870 { "(bad)", { XX } },
5871 { "(bad)", { XX } },
5872 { "(bad)", { XX } },
5873 { "(bad)", { XX } },
5874 { "(bad)", { XX } },
5875 { "(bad)", { XX } },
5876 { "(bad)", { XX } },
5877 /* 58 */
5878 { "(bad)", { XX } },
5879 { "(bad)", { XX } },
5880 { "(bad)", { XX } },
5881 { "(bad)", { XX } },
5882 { "(bad)", { XX } },
5883 { "(bad)", { XX } },
5884 { "(bad)", { XX } },
5885 { "(bad)", { XX } },
5886 /* 60 */
5887 { "(bad)", { XX } },
5888 { "(bad)", { XX } },
5889 { "(bad)", { XX } },
5890 { "(bad)", { XX } },
5891 { "(bad)", { XX } },
5892 { "(bad)", { XX } },
5893 { "(bad)", { XX } },
5894 { "(bad)", { XX } },
5895 /* 68 */
5896 { "(bad)", { XX } },
5897 { "(bad)", { XX } },
5898 { "(bad)", { XX } },
5899 { "(bad)", { XX } },
5900 { "(bad)", { XX } },
5901 { "(bad)", { XX } },
5902 { "(bad)", { XX } },
5903 { "(bad)", { XX } },
5904 /* 70 */
5905 { "(bad)", { XX } },
5906 { "(bad)", { XX } },
5907 { "(bad)", { XX } },
5908 { "(bad)", { XX } },
5909 { "(bad)", { XX } },
5910 { "(bad)", { XX } },
5911 { "(bad)", { XX } },
5912 { "(bad)", { XX } },
5913 /* 78 */
5914 { "(bad)", { XX } },
5915 { "(bad)", { XX } },
5916 { "(bad)", { XX } },
5917 { "(bad)", { XX } },
5918 { "(bad)", { XX } },
5919 { "(bad)", { XX } },
5920 { "(bad)", { XX } },
5921 { "(bad)", { XX } },
5922 /* 80 */
f1f8f695
L
5923 { PREFIX_TABLE (PREFIX_0F3880) },
5924 { PREFIX_TABLE (PREFIX_0F3881) },
c0f3af97
L
5925 { "(bad)", { XX } },
5926 { "(bad)", { XX } },
5927 { "(bad)", { XX } },
5928 { "(bad)", { XX } },
5929 { "(bad)", { XX } },
5930 { "(bad)", { XX } },
5931 /* 88 */
5932 { "(bad)", { XX } },
5933 { "(bad)", { XX } },
5934 { "(bad)", { XX } },
5935 { "(bad)", { XX } },
5936 { "(bad)", { XX } },
5937 { "(bad)", { XX } },
5938 { "(bad)", { XX } },
5939 { "(bad)", { XX } },
5940 /* 90 */
5941 { "(bad)", { XX } },
5942 { "(bad)", { XX } },
5943 { "(bad)", { XX } },
5944 { "(bad)", { XX } },
5945 { "(bad)", { XX } },
5946 { "(bad)", { XX } },
5947 { "(bad)", { XX } },
5948 { "(bad)", { XX } },
5949 /* 98 */
5950 { "(bad)", { XX } },
5951 { "(bad)", { XX } },
5952 { "(bad)", { XX } },
5953 { "(bad)", { XX } },
5954 { "(bad)", { XX } },
5955 { "(bad)", { XX } },
5956 { "(bad)", { XX } },
5957 { "(bad)", { XX } },
5958 /* a0 */
5959 { "(bad)", { XX } },
5960 { "(bad)", { XX } },
5961 { "(bad)", { XX } },
5962 { "(bad)", { XX } },
5963 { "(bad)", { XX } },
5964 { "(bad)", { XX } },
5965 { "(bad)", { XX } },
5966 { "(bad)", { XX } },
5967 /* a8 */
5968 { "(bad)", { XX } },
5969 { "(bad)", { XX } },
5970 { "(bad)", { XX } },
5971 { "(bad)", { XX } },
5972 { "(bad)", { XX } },
5973 { "(bad)", { XX } },
5974 { "(bad)", { XX } },
5975 { "(bad)", { XX } },
5976 /* b0 */
5977 { "(bad)", { XX } },
5978 { "(bad)", { XX } },
5979 { "(bad)", { XX } },
5980 { "(bad)", { XX } },
5981 { "(bad)", { XX } },
5982 { "(bad)", { XX } },
5983 { "(bad)", { XX } },
5984 { "(bad)", { XX } },
5985 /* b8 */
5986 { "(bad)", { XX } },
5987 { "(bad)", { XX } },
5988 { "(bad)", { XX } },
5989 { "(bad)", { XX } },
5990 { "(bad)", { XX } },
5991 { "(bad)", { XX } },
5992 { "(bad)", { XX } },
5993 { "(bad)", { XX } },
5994 /* c0 */
5995 { "(bad)", { XX } },
5996 { "(bad)", { XX } },
5997 { "(bad)", { XX } },
5998 { "(bad)", { XX } },
5999 { "(bad)", { XX } },
6000 { "(bad)", { XX } },
6001 { "(bad)", { XX } },
6002 { "(bad)", { XX } },
6003 /* c8 */
6004 { "(bad)", { XX } },
6005 { "(bad)", { XX } },
6006 { "(bad)", { XX } },
6007 { "(bad)", { XX } },
6008 { "(bad)", { XX } },
6009 { "(bad)", { XX } },
6010 { "(bad)", { XX } },
6011 { "(bad)", { XX } },
6012 /* d0 */
6013 { "(bad)", { XX } },
6014 { "(bad)", { XX } },
6015 { "(bad)", { XX } },
6016 { "(bad)", { XX } },
6017 { "(bad)", { XX } },
6018 { "(bad)", { XX } },
6019 { "(bad)", { XX } },
6020 { "(bad)", { XX } },
6021 /* d8 */
6022 { "(bad)", { XX } },
6023 { "(bad)", { XX } },
6024 { "(bad)", { XX } },
6025 { PREFIX_TABLE (PREFIX_0F38DB) },
6026 { PREFIX_TABLE (PREFIX_0F38DC) },
6027 { PREFIX_TABLE (PREFIX_0F38DD) },
6028 { PREFIX_TABLE (PREFIX_0F38DE) },
6029 { PREFIX_TABLE (PREFIX_0F38DF) },
6030 /* e0 */
6031 { "(bad)", { XX } },
6032 { "(bad)", { XX } },
6033 { "(bad)", { XX } },
6034 { "(bad)", { XX } },
6035 { "(bad)", { XX } },
6036 { "(bad)", { XX } },
6037 { "(bad)", { XX } },
6038 { "(bad)", { XX } },
6039 /* e8 */
6040 { "(bad)", { XX } },
6041 { "(bad)", { XX } },
6042 { "(bad)", { XX } },
6043 { "(bad)", { XX } },
6044 { "(bad)", { XX } },
6045 { "(bad)", { XX } },
6046 { "(bad)", { XX } },
6047 { "(bad)", { XX } },
6048 /* f0 */
6049 { PREFIX_TABLE (PREFIX_0F38F0) },
6050 { PREFIX_TABLE (PREFIX_0F38F1) },
6051 { "(bad)", { XX } },
6052 { "(bad)", { XX } },
6053 { "(bad)", { XX } },
6054 { "(bad)", { XX } },
6055 { "(bad)", { XX } },
6056 { "(bad)", { XX } },
6057 /* f8 */
6058 { "(bad)", { XX } },
6059 { "(bad)", { XX } },
6060 { "(bad)", { XX } },
6061 { "(bad)", { XX } },
6062 { "(bad)", { XX } },
6063 { "(bad)", { XX } },
6064 { "(bad)", { XX } },
6065 { "(bad)", { XX } },
6066 },
6067 /* THREE_BYTE_0F3A */
6068 {
6069 /* 00 */
6070 { "(bad)", { XX } },
6071 { "(bad)", { XX } },
6072 { "(bad)", { XX } },
6073 { "(bad)", { XX } },
6074 { "(bad)", { XX } },
6075 { "(bad)", { XX } },
6076 { "(bad)", { XX } },
6077 { "(bad)", { XX } },
6078 /* 08 */
6079 { PREFIX_TABLE (PREFIX_0F3A08) },
6080 { PREFIX_TABLE (PREFIX_0F3A09) },
6081 { PREFIX_TABLE (PREFIX_0F3A0A) },
6082 { PREFIX_TABLE (PREFIX_0F3A0B) },
6083 { PREFIX_TABLE (PREFIX_0F3A0C) },
6084 { PREFIX_TABLE (PREFIX_0F3A0D) },
6085 { PREFIX_TABLE (PREFIX_0F3A0E) },
6086 { "palignr", { MX, EM, Ib } },
6087 /* 10 */
6088 { "(bad)", { XX } },
6089 { "(bad)", { XX } },
6090 { "(bad)", { XX } },
6091 { "(bad)", { XX } },
6092 { PREFIX_TABLE (PREFIX_0F3A14) },
6093 { PREFIX_TABLE (PREFIX_0F3A15) },
6094 { PREFIX_TABLE (PREFIX_0F3A16) },
6095 { PREFIX_TABLE (PREFIX_0F3A17) },
6096 /* 18 */
6097 { "(bad)", { XX } },
6098 { "(bad)", { XX } },
6099 { "(bad)", { XX } },
6100 { "(bad)", { XX } },
6101 { "(bad)", { XX } },
6102 { "(bad)", { XX } },
6103 { "(bad)", { XX } },
6104 { "(bad)", { XX } },
6105 /* 20 */
6106 { PREFIX_TABLE (PREFIX_0F3A20) },
6107 { PREFIX_TABLE (PREFIX_0F3A21) },
6108 { PREFIX_TABLE (PREFIX_0F3A22) },
6109 { "(bad)", { XX } },
6110 { "(bad)", { XX } },
6111 { "(bad)", { XX } },
6112 { "(bad)", { XX } },
6113 { "(bad)", { XX } },
6114 /* 28 */
6115 { "(bad)", { XX } },
6116 { "(bad)", { XX } },
6117 { "(bad)", { XX } },
6118 { "(bad)", { XX } },
6119 { "(bad)", { XX } },
6120 { "(bad)", { XX } },
6121 { "(bad)", { XX } },
6122 { "(bad)", { XX } },
6123 /* 30 */
4e7d34a6
L
6124 { "(bad)", { XX } },
6125 { "(bad)", { XX } },
6126 { "(bad)", { XX } },
6127 { "(bad)", { XX } },
6128 { "(bad)", { XX } },
6129 { "(bad)", { XX } },
6130 { "(bad)", { XX } },
6131 { "(bad)", { XX } },
85f10a01 6132 /* 38 */
4e7d34a6
L
6133 { "(bad)", { XX } },
6134 { "(bad)", { XX } },
6135 { "(bad)", { XX } },
6136 { "(bad)", { XX } },
6137 { "(bad)", { XX } },
6138 { "(bad)", { XX } },
6139 { "(bad)", { XX } },
6140 { "(bad)", { XX } },
85f10a01 6141 /* 40 */
c0f3af97
L
6142 { PREFIX_TABLE (PREFIX_0F3A40) },
6143 { PREFIX_TABLE (PREFIX_0F3A41) },
6144 { PREFIX_TABLE (PREFIX_0F3A42) },
6145 { "(bad)", { XX } },
6146 { PREFIX_TABLE (PREFIX_0F3A44) },
6147 { "(bad)", { XX } },
6148 { "(bad)", { XX } },
6149 { "(bad)", { XX } },
85f10a01 6150 /* 48 */
4e7d34a6
L
6151 { "(bad)", { XX } },
6152 { "(bad)", { XX } },
6153 { "(bad)", { XX } },
6154 { "(bad)", { XX } },
4e7d34a6
L
6155 { "(bad)", { XX } },
6156 { "(bad)", { XX } },
6157 { "(bad)", { XX } },
6158 { "(bad)", { XX } },
c0f3af97 6159 /* 50 */
4e7d34a6
L
6160 { "(bad)", { XX } },
6161 { "(bad)", { XX } },
6162 { "(bad)", { XX } },
6163 { "(bad)", { XX } },
4e7d34a6
L
6164 { "(bad)", { XX } },
6165 { "(bad)", { XX } },
6166 { "(bad)", { XX } },
6167 { "(bad)", { XX } },
c0f3af97 6168 /* 58 */
4e7d34a6
L
6169 { "(bad)", { XX } },
6170 { "(bad)", { XX } },
6171 { "(bad)", { XX } },
6172 { "(bad)", { XX } },
4e7d34a6
L
6173 { "(bad)", { XX } },
6174 { "(bad)", { XX } },
6175 { "(bad)", { XX } },
6176 { "(bad)", { XX } },
c0f3af97
L
6177 /* 60 */
6178 { PREFIX_TABLE (PREFIX_0F3A60) },
6179 { PREFIX_TABLE (PREFIX_0F3A61) },
6180 { PREFIX_TABLE (PREFIX_0F3A62) },
6181 { PREFIX_TABLE (PREFIX_0F3A63) },
4e7d34a6
L
6182 { "(bad)", { XX } },
6183 { "(bad)", { XX } },
6184 { "(bad)", { XX } },
6185 { "(bad)", { XX } },
6186 /* 68 */
6187 { "(bad)", { XX } },
6188 { "(bad)", { XX } },
6189 { "(bad)", { XX } },
6190 { "(bad)", { XX } },
6191 { "(bad)", { XX } },
6192 { "(bad)", { XX } },
6193 { "(bad)", { XX } },
6194 { "(bad)", { XX } },
85f10a01 6195 /* 70 */
4e7d34a6
L
6196 { "(bad)", { XX } },
6197 { "(bad)", { XX } },
6198 { "(bad)", { XX } },
6199 { "(bad)", { XX } },
6200 { "(bad)", { XX } },
6201 { "(bad)", { XX } },
6202 { "(bad)", { XX } },
6203 { "(bad)", { XX } },
85f10a01 6204 /* 78 */
4e7d34a6
L
6205 { "(bad)", { XX } },
6206 { "(bad)", { XX } },
6207 { "(bad)", { XX } },
6208 { "(bad)", { XX } },
6209 { "(bad)", { XX } },
6210 { "(bad)", { XX } },
6211 { "(bad)", { XX } },
6212 { "(bad)", { XX } },
85f10a01 6213 /* 80 */
4e7d34a6
L
6214 { "(bad)", { XX } },
6215 { "(bad)", { XX } },
6216 { "(bad)", { XX } },
6217 { "(bad)", { XX } },
6218 { "(bad)", { XX } },
c0f3af97
L
6219 { "(bad)", { XX } },
6220 { "(bad)", { XX } },
6221 { "(bad)", { XX } },
85f10a01 6222 /* 88 */
4e7d34a6
L
6223 { "(bad)", { XX } },
6224 { "(bad)", { XX } },
6225 { "(bad)", { XX } },
6226 { "(bad)", { XX } },
6227 { "(bad)", { XX } },
6228 { "(bad)", { XX } },
c0f3af97
L
6229 { "(bad)", { XX } },
6230 { "(bad)", { XX } },
85f10a01 6231 /* 90 */
4e7d34a6
L
6232 { "(bad)", { XX } },
6233 { "(bad)", { XX } },
6234 { "(bad)", { XX } },
6235 { "(bad)", { XX } },
6236 { "(bad)", { XX } },
c0f3af97
L
6237 { "(bad)", { XX } },
6238 { "(bad)", { XX } },
6239 { "(bad)", { XX } },
85f10a01 6240 /* 98 */
4e7d34a6
L
6241 { "(bad)", { XX } },
6242 { "(bad)", { XX } },
6243 { "(bad)", { XX } },
6244 { "(bad)", { XX } },
6245 { "(bad)", { XX } },
6246 { "(bad)", { XX } },
c0f3af97
L
6247 { "(bad)", { XX } },
6248 { "(bad)", { XX } },
85f10a01 6249 /* a0 */
4e7d34a6
L
6250 { "(bad)", { XX } },
6251 { "(bad)", { XX } },
6252 { "(bad)", { XX } },
6253 { "(bad)", { XX } },
6254 { "(bad)", { XX } },
6255 { "(bad)", { XX } },
c0f3af97 6256 { "(bad)", { XX } },
4e7d34a6 6257 { "(bad)", { XX } },
85f10a01 6258 /* a8 */
4e7d34a6
L
6259 { "(bad)", { XX } },
6260 { "(bad)", { XX } },
6261 { "(bad)", { XX } },
6262 { "(bad)", { XX } },
6263 { "(bad)", { XX } },
6264 { "(bad)", { XX } },
6265 { "(bad)", { XX } },
6266 { "(bad)", { XX } },
85f10a01 6267 /* b0 */
4e7d34a6
L
6268 { "(bad)", { XX } },
6269 { "(bad)", { XX } },
6270 { "(bad)", { XX } },
6271 { "(bad)", { XX } },
6272 { "(bad)", { XX } },
6273 { "(bad)", { XX } },
c0f3af97 6274 { "(bad)", { XX } },
4e7d34a6 6275 { "(bad)", { XX } },
85f10a01 6276 /* b8 */
4e7d34a6
L
6277 { "(bad)", { XX } },
6278 { "(bad)", { XX } },
6279 { "(bad)", { XX } },
6280 { "(bad)", { XX } },
6281 { "(bad)", { XX } },
6282 { "(bad)", { XX } },
6283 { "(bad)", { XX } },
6284 { "(bad)", { XX } },
85f10a01 6285 /* c0 */
4e7d34a6
L
6286 { "(bad)", { XX } },
6287 { "(bad)", { XX } },
6288 { "(bad)", { XX } },
6289 { "(bad)", { XX } },
6290 { "(bad)", { XX } },
6291 { "(bad)", { XX } },
6292 { "(bad)", { XX } },
6293 { "(bad)", { XX } },
85f10a01 6294 /* c8 */
4e7d34a6
L
6295 { "(bad)", { XX } },
6296 { "(bad)", { XX } },
6297 { "(bad)", { XX } },
6298 { "(bad)", { XX } },
6299 { "(bad)", { XX } },
6300 { "(bad)", { XX } },
6301 { "(bad)", { XX } },
6302 { "(bad)", { XX } },
85f10a01 6303 /* d0 */
4e7d34a6
L
6304 { "(bad)", { XX } },
6305 { "(bad)", { XX } },
6306 { "(bad)", { XX } },
6307 { "(bad)", { XX } },
6308 { "(bad)", { XX } },
6309 { "(bad)", { XX } },
6310 { "(bad)", { XX } },
6311 { "(bad)", { XX } },
85f10a01 6312 /* d8 */
4e7d34a6
L
6313 { "(bad)", { XX } },
6314 { "(bad)", { XX } },
6315 { "(bad)", { XX } },
6316 { "(bad)", { XX } },
6317 { "(bad)", { XX } },
6318 { "(bad)", { XX } },
6319 { "(bad)", { XX } },
c0f3af97 6320 { PREFIX_TABLE (PREFIX_0F3ADF) },
85f10a01 6321 /* e0 */
4e7d34a6
L
6322 { "(bad)", { XX } },
6323 { "(bad)", { XX } },
6324 { "(bad)", { XX } },
6325 { "(bad)", { XX } },
6326 { "(bad)", { XX } },
6327 { "(bad)", { XX } },
6328 { "(bad)", { XX } },
6329 { "(bad)", { XX } },
85f10a01 6330 /* e8 */
4e7d34a6
L
6331 { "(bad)", { XX } },
6332 { "(bad)", { XX } },
6333 { "(bad)", { XX } },
6334 { "(bad)", { XX } },
6335 { "(bad)", { XX } },
6336 { "(bad)", { XX } },
6337 { "(bad)", { XX } },
6338 { "(bad)", { XX } },
85f10a01 6339 /* f0 */
4e7d34a6
L
6340 { "(bad)", { XX } },
6341 { "(bad)", { XX } },
6342 { "(bad)", { XX } },
6343 { "(bad)", { XX } },
6344 { "(bad)", { XX } },
6345 { "(bad)", { XX } },
6346 { "(bad)", { XX } },
6347 { "(bad)", { XX } },
85f10a01 6348 /* f8 */
4e7d34a6
L
6349 { "(bad)", { XX } },
6350 { "(bad)", { XX } },
6351 { "(bad)", { XX } },
6352 { "(bad)", { XX } },
6353 { "(bad)", { XX } },
6354 { "(bad)", { XX } },
6355 { "(bad)", { XX } },
6356 { "(bad)", { XX } },
85f10a01 6357 },
c0f3af97 6358 /* THREE_BYTE_0F7A */
85f10a01
MM
6359 {
6360 /* 00 */
4e7d34a6
L
6361 { "(bad)", { XX } },
6362 { "(bad)", { XX } },
6363 { "(bad)", { XX } },
6364 { "(bad)", { XX } },
6365 { "(bad)", { XX } },
6366 { "(bad)", { XX } },
6367 { "(bad)", { XX } },
6368 { "(bad)", { XX } },
85f10a01 6369 /* 08 */
4e7d34a6
L
6370 { "(bad)", { XX } },
6371 { "(bad)", { XX } },
6372 { "(bad)", { XX } },
6373 { "(bad)", { XX } },
6374 { "(bad)", { XX } },
6375 { "(bad)", { XX } },
6376 { "(bad)", { XX } },
6377 { "(bad)", { XX } },
85f10a01 6378 /* 10 */
c0f3af97
L
6379 { "frczps", { XM, EXq } },
6380 { "frczpd", { XM, EXq } },
6381 { "frczss", { XM, EXq } },
6382 { "frczsd", { XM, EXq } },
4e7d34a6
L
6383 { "(bad)", { XX } },
6384 { "(bad)", { XX } },
6385 { "(bad)", { XX } },
6386 { "(bad)", { XX } },
85f10a01 6387 /* 18 */
4e7d34a6
L
6388 { "(bad)", { XX } },
6389 { "(bad)", { XX } },
6390 { "(bad)", { XX } },
6391 { "(bad)", { XX } },
6392 { "(bad)", { XX } },
6393 { "(bad)", { XX } },
6394 { "(bad)", { XX } },
6395 { "(bad)", { XX } },
85f10a01 6396 /* 20 */
c0f3af97 6397 { "ptest", { XX } },
4e7d34a6
L
6398 { "(bad)", { XX } },
6399 { "(bad)", { XX } },
6400 { "(bad)", { XX } },
6401 { "(bad)", { XX } },
6402 { "(bad)", { XX } },
6403 { "(bad)", { XX } },
6404 { "(bad)", { XX } },
85f10a01 6405 /* 28 */
4e7d34a6
L
6406 { "(bad)", { XX } },
6407 { "(bad)", { XX } },
6408 { "(bad)", { XX } },
6409 { "(bad)", { XX } },
4e7d34a6
L
6410 { "(bad)", { XX } },
6411 { "(bad)", { XX } },
6412 { "(bad)", { XX } },
6413 { "(bad)", { XX } },
c0f3af97
L
6414 /* 30 */
6415 { "cvtph2ps", { XM, EXd } },
6416 { "cvtps2ph", { EXd, XM } },
4e7d34a6 6417 { "(bad)", { XX } },
4e7d34a6
L
6418 { "(bad)", { XX } },
6419 { "(bad)", { XX } },
6420 { "(bad)", { XX } },
6421 { "(bad)", { XX } },
6422 { "(bad)", { XX } },
c0f3af97 6423 /* 38 */
4e7d34a6
L
6424 { "(bad)", { XX } },
6425 { "(bad)", { XX } },
6426 { "(bad)", { XX } },
4e7d34a6
L
6427 { "(bad)", { XX } },
6428 { "(bad)", { XX } },
6429 { "(bad)", { XX } },
6430 { "(bad)", { XX } },
6431 { "(bad)", { XX } },
c0f3af97 6432 /* 40 */
4e7d34a6 6433 { "(bad)", { XX } },
c0f3af97
L
6434 { "phaddbw", { XM, EXq } },
6435 { "phaddbd", { XM, EXq } },
6436 { "phaddbq", { XM, EXq } },
4e7d34a6
L
6437 { "(bad)", { XX } },
6438 { "(bad)", { XX } },
c0f3af97
L
6439 { "phaddwd", { XM, EXq } },
6440 { "phaddwq", { XM, EXq } },
85f10a01 6441 /* 48 */
4e7d34a6
L
6442 { "(bad)", { XX } },
6443 { "(bad)", { XX } },
6444 { "(bad)", { XX } },
c0f3af97 6445 { "phadddq", { XM, EXq } },
4e7d34a6
L
6446 { "(bad)", { XX } },
6447 { "(bad)", { XX } },
6448 { "(bad)", { XX } },
6449 { "(bad)", { XX } },
c0f3af97 6450 /* 50 */
4e7d34a6 6451 { "(bad)", { XX } },
c0f3af97
L
6452 { "phaddubw", { XM, EXq } },
6453 { "phaddubd", { XM, EXq } },
6454 { "phaddubq", { XM, EXq } },
4e7d34a6
L
6455 { "(bad)", { XX } },
6456 { "(bad)", { XX } },
c0f3af97
L
6457 { "phadduwd", { XM, EXq } },
6458 { "phadduwq", { XM, EXq } },
85f10a01 6459 /* 58 */
4e7d34a6
L
6460 { "(bad)", { XX } },
6461 { "(bad)", { XX } },
6462 { "(bad)", { XX } },
c0f3af97 6463 { "phaddudq", { XM, EXq } },
4e7d34a6
L
6464 { "(bad)", { XX } },
6465 { "(bad)", { XX } },
6466 { "(bad)", { XX } },
6467 { "(bad)", { XX } },
85f10a01 6468 /* 60 */
4e7d34a6 6469 { "(bad)", { XX } },
c0f3af97
L
6470 { "phsubbw", { XM, EXq } },
6471 { "phsubbd", { XM, EXq } },
6472 { "phsubbq", { XM, EXq } },
4e7d34a6
L
6473 { "(bad)", { XX } },
6474 { "(bad)", { XX } },
6475 { "(bad)", { XX } },
6476 { "(bad)", { XX } },
c0f3af97
L
6477 /* 68 */
6478 { "(bad)", { XX } },
4e7d34a6
L
6479 { "(bad)", { XX } },
6480 { "(bad)", { XX } },
6481 { "(bad)", { XX } },
4e7d34a6
L
6482 { "(bad)", { XX } },
6483 { "(bad)", { XX } },
6484 { "(bad)", { XX } },
6485 { "(bad)", { XX } },
85f10a01 6486 /* 70 */
4e7d34a6
L
6487 { "(bad)", { XX } },
6488 { "(bad)", { XX } },
6489 { "(bad)", { XX } },
6490 { "(bad)", { XX } },
6491 { "(bad)", { XX } },
6492 { "(bad)", { XX } },
6493 { "(bad)", { XX } },
6494 { "(bad)", { XX } },
85f10a01 6495 /* 78 */
4e7d34a6
L
6496 { "(bad)", { XX } },
6497 { "(bad)", { XX } },
6498 { "(bad)", { XX } },
6499 { "(bad)", { XX } },
6500 { "(bad)", { XX } },
6501 { "(bad)", { XX } },
6502 { "(bad)", { XX } },
6503 { "(bad)", { XX } },
85f10a01 6504 /* 80 */
4e7d34a6
L
6505 { "(bad)", { XX } },
6506 { "(bad)", { XX } },
6507 { "(bad)", { XX } },
6508 { "(bad)", { XX } },
6509 { "(bad)", { XX } },
6510 { "(bad)", { XX } },
6511 { "(bad)", { XX } },
6512 { "(bad)", { XX } },
6513 /* 88 */
6514 { "(bad)", { XX } },
6515 { "(bad)", { XX } },
6516 { "(bad)", { XX } },
6517 { "(bad)", { XX } },
6518 { "(bad)", { XX } },
6519 { "(bad)", { XX } },
6520 { "(bad)", { XX } },
6521 { "(bad)", { XX } },
6522 /* 90 */
6523 { "(bad)", { XX } },
6524 { "(bad)", { XX } },
6525 { "(bad)", { XX } },
6526 { "(bad)", { XX } },
6527 { "(bad)", { XX } },
6528 { "(bad)", { XX } },
6529 { "(bad)", { XX } },
6530 { "(bad)", { XX } },
6531 /* 98 */
6532 { "(bad)", { XX } },
6533 { "(bad)", { XX } },
6534 { "(bad)", { XX } },
6535 { "(bad)", { XX } },
6536 { "(bad)", { XX } },
6537 { "(bad)", { XX } },
6538 { "(bad)", { XX } },
6539 { "(bad)", { XX } },
6540 /* a0 */
6541 { "(bad)", { XX } },
6542 { "(bad)", { XX } },
6543 { "(bad)", { XX } },
6544 { "(bad)", { XX } },
6545 { "(bad)", { XX } },
6546 { "(bad)", { XX } },
6547 { "(bad)", { XX } },
6548 { "(bad)", { XX } },
6549 /* a8 */
6550 { "(bad)", { XX } },
6551 { "(bad)", { XX } },
6552 { "(bad)", { XX } },
6553 { "(bad)", { XX } },
6554 { "(bad)", { XX } },
6555 { "(bad)", { XX } },
6556 { "(bad)", { XX } },
6557 { "(bad)", { XX } },
6558 /* b0 */
6559 { "(bad)", { XX } },
6560 { "(bad)", { XX } },
6561 { "(bad)", { XX } },
6562 { "(bad)", { XX } },
6563 { "(bad)", { XX } },
6564 { "(bad)", { XX } },
6565 { "(bad)", { XX } },
6566 { "(bad)", { XX } },
6567 /* b8 */
6568 { "(bad)", { XX } },
6569 { "(bad)", { XX } },
6570 { "(bad)", { XX } },
6571 { "(bad)", { XX } },
6572 { "(bad)", { XX } },
6573 { "(bad)", { XX } },
6574 { "(bad)", { XX } },
6575 { "(bad)", { XX } },
6576 /* c0 */
6577 { "(bad)", { XX } },
6578 { "(bad)", { XX } },
6579 { "(bad)", { XX } },
6580 { "(bad)", { XX } },
6581 { "(bad)", { XX } },
6582 { "(bad)", { XX } },
6583 { "(bad)", { XX } },
6584 { "(bad)", { XX } },
6585 /* c8 */
6586 { "(bad)", { XX } },
6587 { "(bad)", { XX } },
6588 { "(bad)", { XX } },
6589 { "(bad)", { XX } },
6590 { "(bad)", { XX } },
6591 { "(bad)", { XX } },
6592 { "(bad)", { XX } },
6593 { "(bad)", { XX } },
6594 /* d0 */
6595 { "(bad)", { XX } },
6596 { "(bad)", { XX } },
6597 { "(bad)", { XX } },
6598 { "(bad)", { XX } },
6599 { "(bad)", { XX } },
6600 { "(bad)", { XX } },
6601 { "(bad)", { XX } },
6602 { "(bad)", { XX } },
6603 /* d8 */
6604 { "(bad)", { XX } },
6605 { "(bad)", { XX } },
6606 { "(bad)", { XX } },
6607 { "(bad)", { XX } },
6608 { "(bad)", { XX } },
6609 { "(bad)", { XX } },
6610 { "(bad)", { XX } },
6611 { "(bad)", { XX } },
6612 /* e0 */
6613 { "(bad)", { XX } },
6614 { "(bad)", { XX } },
6615 { "(bad)", { XX } },
6616 { "(bad)", { XX } },
6617 { "(bad)", { XX } },
6618 { "(bad)", { XX } },
6619 { "(bad)", { XX } },
6620 { "(bad)", { XX } },
6621 /* e8 */
6622 { "(bad)", { XX } },
6623 { "(bad)", { XX } },
6624 { "(bad)", { XX } },
6625 { "(bad)", { XX } },
6626 { "(bad)", { XX } },
6627 { "(bad)", { XX } },
6628 { "(bad)", { XX } },
6629 { "(bad)", { XX } },
6630 /* f0 */
6631 { "(bad)", { XX } },
6632 { "(bad)", { XX } },
6633 { "(bad)", { XX } },
6634 { "(bad)", { XX } },
6635 { "(bad)", { XX } },
6636 { "(bad)", { XX } },
6637 { "(bad)", { XX } },
6638 { "(bad)", { XX } },
6639 /* f8 */
6640 { "(bad)", { XX } },
6641 { "(bad)", { XX } },
6642 { "(bad)", { XX } },
6643 { "(bad)", { XX } },
6644 { "(bad)", { XX } },
6645 { "(bad)", { XX } },
6646 { "(bad)", { XX } },
6647 { "(bad)", { XX } },
6648 },
c0f3af97 6649 /* THREE_BYTE_0F7B */
4e7d34a6
L
6650 {
6651 /* 00 */
c0f3af97
L
6652 { "(bad)", { XX } },
6653 { "(bad)", { XX } },
6654 { "(bad)", { XX } },
6655 { "(bad)", { XX } },
6656 { "(bad)", { XX } },
6657 { "(bad)", { XX } },
6658 { "(bad)", { XX } },
6659 { "(bad)", { XX } },
4e7d34a6 6660 /* 08 */
c0f3af97
L
6661 { "(bad)", { XX } },
6662 { "(bad)", { XX } },
6663 { "(bad)", { XX } },
6664 { "(bad)", { XX } },
d5d7db8e
L
6665 { "(bad)", { XX } },
6666 { "(bad)", { XX } },
6667 { "(bad)", { XX } },
6668 { "(bad)", { XX } },
4e7d34a6 6669 /* 10 */
d5d7db8e
L
6670 { "(bad)", { XX } },
6671 { "(bad)", { XX } },
6672 { "(bad)", { XX } },
d5d7db8e 6673 { "(bad)", { XX } },
c0f3af97
L
6674 { "(bad)", { XX } },
6675 { "(bad)", { XX } },
6676 { "(bad)", { XX } },
6677 { "(bad)", { XX } },
4e7d34a6 6678 /* 18 */
d5d7db8e
L
6679 { "(bad)", { XX } },
6680 { "(bad)", { XX } },
6681 { "(bad)", { XX } },
6682 { "(bad)", { XX } },
c0f3af97
L
6683 { "(bad)", { XX } },
6684 { "(bad)", { XX } },
6685 { "(bad)", { XX } },
d5d7db8e 6686 { "(bad)", { XX } },
4e7d34a6 6687 /* 20 */
c0f3af97
L
6688 { "(bad)", { XX } },
6689 { "(bad)", { XX } },
6690 { "(bad)", { XX } },
6691 { "(bad)", { XX } },
6692 { "(bad)", { XX } },
6693 { "(bad)", { XX } },
d5d7db8e
L
6694 { "(bad)", { XX } },
6695 { "(bad)", { XX } },
4e7d34a6 6696 /* 28 */
c0f3af97
L
6697 { "(bad)", { XX } },
6698 { "(bad)", { XX } },
6699 { "(bad)", { XX } },
6700 { "(bad)", { XX } },
d5d7db8e
L
6701 { "(bad)", { XX } },
6702 { "(bad)", { XX } },
6703 { "(bad)", { XX } },
6704 { "(bad)", { XX } },
4e7d34a6 6705 /* 30 */
d5d7db8e 6706 { "(bad)", { XX } },
d5d7db8e
L
6707 { "(bad)", { XX } },
6708 { "(bad)", { XX } },
6709 { "(bad)", { XX } },
6710 { "(bad)", { XX } },
6711 { "(bad)", { XX } },
6712 { "(bad)", { XX } },
c0f3af97
L
6713 { "(bad)", { XX } },
6714 /* 38 */
6715 { "(bad)", { XX } },
6716 { "(bad)", { XX } },
6717 { "(bad)", { XX } },
6718 { "(bad)", { XX } },
d5d7db8e
L
6719 { "(bad)", { XX } },
6720 { "(bad)", { XX } },
6721 { "(bad)", { XX } },
6722 { "(bad)", { XX } },
c0f3af97
L
6723 /* 40 */
6724 { "protb", { XM, EXq, Ib } },
6725 { "protw", { XM, EXq, Ib } },
6726 { "protd", { XM, EXq, Ib } },
6727 { "protq", { XM, EXq, Ib } },
6728 { "pshlb", { XM, EXq, Ib } },
6729 { "pshlw", { XM, EXq, Ib } },
6730 { "pshld", { XM, EXq, Ib } },
6731 { "pshlq", { XM, EXq, Ib } },
6732 /* 48 */
6733 { "pshab", { XM, EXq, Ib } },
6734 { "pshaw", { XM, EXq, Ib } },
6735 { "pshad", { XM, EXq, Ib } },
6736 { "pshaq", { XM, EXq, Ib } },
d5d7db8e
L
6737 { "(bad)", { XX } },
6738 { "(bad)", { XX } },
6739 { "(bad)", { XX } },
6740 { "(bad)", { XX } },
4e7d34a6 6741 /* 50 */
d5d7db8e
L
6742 { "(bad)", { XX } },
6743 { "(bad)", { XX } },
6744 { "(bad)", { XX } },
6745 { "(bad)", { XX } },
6746 { "(bad)", { XX } },
6747 { "(bad)", { XX } },
6748 { "(bad)", { XX } },
6749 { "(bad)", { XX } },
4e7d34a6 6750 /* 58 */
d5d7db8e
L
6751 { "(bad)", { XX } },
6752 { "(bad)", { XX } },
6753 { "(bad)", { XX } },
6754 { "(bad)", { XX } },
6755 { "(bad)", { XX } },
6756 { "(bad)", { XX } },
6757 { "(bad)", { XX } },
6758 { "(bad)", { XX } },
4e7d34a6 6759 /* 60 */
d5d7db8e
L
6760 { "(bad)", { XX } },
6761 { "(bad)", { XX } },
6762 { "(bad)", { XX } },
6763 { "(bad)", { XX } },
6764 { "(bad)", { XX } },
6765 { "(bad)", { XX } },
6766 { "(bad)", { XX } },
6767 { "(bad)", { XX } },
4e7d34a6 6768 /* 68 */
d5d7db8e
L
6769 { "(bad)", { XX } },
6770 { "(bad)", { XX } },
6771 { "(bad)", { XX } },
6772 { "(bad)", { XX } },
6773 { "(bad)", { XX } },
6774 { "(bad)", { XX } },
6775 { "(bad)", { XX } },
6776 { "(bad)", { XX } },
4e7d34a6 6777 /* 70 */
d5d7db8e
L
6778 { "(bad)", { XX } },
6779 { "(bad)", { XX } },
6780 { "(bad)", { XX } },
6781 { "(bad)", { XX } },
6782 { "(bad)", { XX } },
6783 { "(bad)", { XX } },
6784 { "(bad)", { XX } },
6785 { "(bad)", { XX } },
4e7d34a6 6786 /* 78 */
d5d7db8e
L
6787 { "(bad)", { XX } },
6788 { "(bad)", { XX } },
6789 { "(bad)", { XX } },
6790 { "(bad)", { XX } },
6791 { "(bad)", { XX } },
6792 { "(bad)", { XX } },
6793 { "(bad)", { XX } },
6794 { "(bad)", { XX } },
4e7d34a6 6795 /* 80 */
d5d7db8e
L
6796 { "(bad)", { XX } },
6797 { "(bad)", { XX } },
6798 { "(bad)", { XX } },
6799 { "(bad)", { XX } },
6800 { "(bad)", { XX } },
6801 { "(bad)", { XX } },
6802 { "(bad)", { XX } },
6803 { "(bad)", { XX } },
4e7d34a6 6804 /* 88 */
d5d7db8e
L
6805 { "(bad)", { XX } },
6806 { "(bad)", { XX } },
6807 { "(bad)", { XX } },
6808 { "(bad)", { XX } },
6809 { "(bad)", { XX } },
6810 { "(bad)", { XX } },
6811 { "(bad)", { XX } },
6812 { "(bad)", { XX } },
4e7d34a6 6813 /* 90 */
d5d7db8e
L
6814 { "(bad)", { XX } },
6815 { "(bad)", { XX } },
6816 { "(bad)", { XX } },
6817 { "(bad)", { XX } },
6818 { "(bad)", { XX } },
6819 { "(bad)", { XX } },
6820 { "(bad)", { XX } },
6821 { "(bad)", { XX } },
4e7d34a6 6822 /* 98 */
d5d7db8e
L
6823 { "(bad)", { XX } },
6824 { "(bad)", { XX } },
6825 { "(bad)", { XX } },
6826 { "(bad)", { XX } },
6827 { "(bad)", { XX } },
6828 { "(bad)", { XX } },
6829 { "(bad)", { XX } },
6830 { "(bad)", { XX } },
4e7d34a6 6831 /* a0 */
d5d7db8e
L
6832 { "(bad)", { XX } },
6833 { "(bad)", { XX } },
6834 { "(bad)", { XX } },
6835 { "(bad)", { XX } },
6836 { "(bad)", { XX } },
6837 { "(bad)", { XX } },
6838 { "(bad)", { XX } },
6839 { "(bad)", { XX } },
4e7d34a6 6840 /* a8 */
d5d7db8e
L
6841 { "(bad)", { XX } },
6842 { "(bad)", { XX } },
6843 { "(bad)", { XX } },
6844 { "(bad)", { XX } },
6845 { "(bad)", { XX } },
6846 { "(bad)", { XX } },
6847 { "(bad)", { XX } },
6848 { "(bad)", { XX } },
6849 /* b0 */
6850 { "(bad)", { XX } },
6851 { "(bad)", { XX } },
6852 { "(bad)", { XX } },
6853 { "(bad)", { XX } },
6854 { "(bad)", { XX } },
6855 { "(bad)", { XX } },
6856 { "(bad)", { XX } },
6857 { "(bad)", { XX } },
85f10a01 6858 /* b8 */
d5d7db8e
L
6859 { "(bad)", { XX } },
6860 { "(bad)", { XX } },
6861 { "(bad)", { XX } },
6862 { "(bad)", { XX } },
6863 { "(bad)", { XX } },
6864 { "(bad)", { XX } },
6865 { "(bad)", { XX } },
6866 { "(bad)", { XX } },
85f10a01 6867 /* c0 */
d5d7db8e
L
6868 { "(bad)", { XX } },
6869 { "(bad)", { XX } },
6870 { "(bad)", { XX } },
6871 { "(bad)", { XX } },
6872 { "(bad)", { XX } },
6873 { "(bad)", { XX } },
6874 { "(bad)", { XX } },
6875 { "(bad)", { XX } },
85f10a01 6876 /* c8 */
d5d7db8e
L
6877 { "(bad)", { XX } },
6878 { "(bad)", { XX } },
6879 { "(bad)", { XX } },
6880 { "(bad)", { XX } },
6881 { "(bad)", { XX } },
6882 { "(bad)", { XX } },
6883 { "(bad)", { XX } },
6884 { "(bad)", { XX } },
85f10a01 6885 /* d0 */
d5d7db8e
L
6886 { "(bad)", { XX } },
6887 { "(bad)", { XX } },
6888 { "(bad)", { XX } },
6889 { "(bad)", { XX } },
6890 { "(bad)", { XX } },
6891 { "(bad)", { XX } },
6892 { "(bad)", { XX } },
6893 { "(bad)", { XX } },
85f10a01 6894 /* d8 */
d5d7db8e
L
6895 { "(bad)", { XX } },
6896 { "(bad)", { XX } },
6897 { "(bad)", { XX } },
6898 { "(bad)", { XX } },
6899 { "(bad)", { XX } },
6900 { "(bad)", { XX } },
6901 { "(bad)", { XX } },
6902 { "(bad)", { XX } },
85f10a01 6903 /* e0 */
d5d7db8e
L
6904 { "(bad)", { XX } },
6905 { "(bad)", { XX } },
6906 { "(bad)", { XX } },
6907 { "(bad)", { XX } },
6908 { "(bad)", { XX } },
6909 { "(bad)", { XX } },
6910 { "(bad)", { XX } },
6911 { "(bad)", { XX } },
85f10a01 6912 /* e8 */
d5d7db8e
L
6913 { "(bad)", { XX } },
6914 { "(bad)", { XX } },
6915 { "(bad)", { XX } },
6916 { "(bad)", { XX } },
6917 { "(bad)", { XX } },
6918 { "(bad)", { XX } },
6919 { "(bad)", { XX } },
6920 { "(bad)", { XX } },
85f10a01 6921 /* f0 */
c0f3af97
L
6922 { "(bad)", { XX } },
6923 { "(bad)", { XX } },
d5d7db8e
L
6924 { "(bad)", { XX } },
6925 { "(bad)", { XX } },
6926 { "(bad)", { XX } },
6927 { "(bad)", { XX } },
6928 { "(bad)", { XX } },
6929 { "(bad)", { XX } },
85f10a01 6930 /* f8 */
d5d7db8e
L
6931 { "(bad)", { XX } },
6932 { "(bad)", { XX } },
6933 { "(bad)", { XX } },
6934 { "(bad)", { XX } },
6935 { "(bad)", { XX } },
6936 { "(bad)", { XX } },
6937 { "(bad)", { XX } },
6938 { "(bad)", { XX } },
85f10a01 6939 },
c0f3af97
L
6940};
6941
6942static const struct dis386 vex_table[][256] = {
6943 /* VEX_0F */
85f10a01
MM
6944 {
6945 /* 00 */
d5d7db8e
L
6946 { "(bad)", { XX } },
6947 { "(bad)", { XX } },
6948 { "(bad)", { XX } },
6949 { "(bad)", { XX } },
6950 { "(bad)", { XX } },
6951 { "(bad)", { XX } },
6952 { "(bad)", { XX } },
6953 { "(bad)", { XX } },
85f10a01 6954 /* 08 */
d5d7db8e
L
6955 { "(bad)", { XX } },
6956 { "(bad)", { XX } },
6957 { "(bad)", { XX } },
6958 { "(bad)", { XX } },
d5d7db8e
L
6959 { "(bad)", { XX } },
6960 { "(bad)", { XX } },
6961 { "(bad)", { XX } },
6962 { "(bad)", { XX } },
c0f3af97
L
6963 /* 10 */
6964 { PREFIX_TABLE (PREFIX_VEX_10) },
6965 { PREFIX_TABLE (PREFIX_VEX_11) },
6966 { PREFIX_TABLE (PREFIX_VEX_12) },
6967 { MOD_TABLE (MOD_VEX_13) },
6968 { "vunpcklpX", { XM, Vex, EXx } },
6969 { "vunpckhpX", { XM, Vex, EXx } },
6970 { PREFIX_TABLE (PREFIX_VEX_16) },
6971 { MOD_TABLE (MOD_VEX_17) },
6972 /* 18 */
d5d7db8e
L
6973 { "(bad)", { XX } },
6974 { "(bad)", { XX } },
6975 { "(bad)", { XX } },
d5d7db8e
L
6976 { "(bad)", { XX } },
6977 { "(bad)", { XX } },
6978 { "(bad)", { XX } },
6979 { "(bad)", { XX } },
6980 { "(bad)", { XX } },
c0f3af97 6981 /* 20 */
d5d7db8e
L
6982 { "(bad)", { XX } },
6983 { "(bad)", { XX } },
6984 { "(bad)", { XX } },
6985 { "(bad)", { XX } },
6986 { "(bad)", { XX } },
6987 { "(bad)", { XX } },
6988 { "(bad)", { XX } },
6989 { "(bad)", { XX } },
c0f3af97
L
6990 /* 28 */
6991 { "vmovapX", { XM, EXx } },
6992 { "vmovapX", { EXx, XM } },
6993 { PREFIX_TABLE (PREFIX_VEX_2A) },
6994 { MOD_TABLE (MOD_VEX_2B) },
6995 { PREFIX_TABLE (PREFIX_VEX_2C) },
6996 { PREFIX_TABLE (PREFIX_VEX_2D) },
6997 { PREFIX_TABLE (PREFIX_VEX_2E) },
6998 { PREFIX_TABLE (PREFIX_VEX_2F) },
85f10a01 6999 /* 30 */
d5d7db8e
L
7000 { "(bad)", { XX } },
7001 { "(bad)", { XX } },
7002 { "(bad)", { XX } },
7003 { "(bad)", { XX } },
7004 { "(bad)", { XX } },
7005 { "(bad)", { XX } },
7006 { "(bad)", { XX } },
7007 { "(bad)", { XX } },
4e7d34a6 7008 /* 38 */
d5d7db8e
L
7009 { "(bad)", { XX } },
7010 { "(bad)", { XX } },
7011 { "(bad)", { XX } },
7012 { "(bad)", { XX } },
7013 { "(bad)", { XX } },
7014 { "(bad)", { XX } },
7015 { "(bad)", { XX } },
7016 { "(bad)", { XX } },
7017 /* 40 */
c0f3af97
L
7018 { "(bad)", { XX } },
7019 { "(bad)", { XX } },
7020 { "(bad)", { XX } },
d5d7db8e
L
7021 { "(bad)", { XX } },
7022 { "(bad)", { XX } },
7023 { "(bad)", { XX } },
7024 { "(bad)", { XX } },
7025 { "(bad)", { XX } },
85f10a01 7026 /* 48 */
85f10a01
MM
7027 { "(bad)", { XX } },
7028 { "(bad)", { XX } },
7029 { "(bad)", { XX } },
7030 { "(bad)", { XX } },
7031 { "(bad)", { XX } },
7032 { "(bad)", { XX } },
7033 { "(bad)", { XX } },
7034 { "(bad)", { XX } },
d5d7db8e 7035 /* 50 */
c0f3af97
L
7036 { MOD_TABLE (MOD_VEX_51) },
7037 { PREFIX_TABLE (PREFIX_VEX_51) },
7038 { PREFIX_TABLE (PREFIX_VEX_52) },
7039 { PREFIX_TABLE (PREFIX_VEX_53) },
7040 { "vandpX", { XM, Vex, EXx } },
7041 { "vandnpX", { XM, Vex, EXx } },
7042 { "vorpX", { XM, Vex, EXx } },
7043 { "vxorpX", { XM, Vex, EXx } },
7044 /* 58 */
7045 { PREFIX_TABLE (PREFIX_VEX_58) },
7046 { PREFIX_TABLE (PREFIX_VEX_59) },
7047 { PREFIX_TABLE (PREFIX_VEX_5A) },
7048 { PREFIX_TABLE (PREFIX_VEX_5B) },
7049 { PREFIX_TABLE (PREFIX_VEX_5C) },
7050 { PREFIX_TABLE (PREFIX_VEX_5D) },
7051 { PREFIX_TABLE (PREFIX_VEX_5E) },
7052 { PREFIX_TABLE (PREFIX_VEX_5F) },
7053 /* 60 */
7054 { PREFIX_TABLE (PREFIX_VEX_60) },
7055 { PREFIX_TABLE (PREFIX_VEX_61) },
7056 { PREFIX_TABLE (PREFIX_VEX_62) },
7057 { PREFIX_TABLE (PREFIX_VEX_63) },
7058 { PREFIX_TABLE (PREFIX_VEX_64) },
7059 { PREFIX_TABLE (PREFIX_VEX_65) },
7060 { PREFIX_TABLE (PREFIX_VEX_66) },
7061 { PREFIX_TABLE (PREFIX_VEX_67) },
7062 /* 68 */
7063 { PREFIX_TABLE (PREFIX_VEX_68) },
7064 { PREFIX_TABLE (PREFIX_VEX_69) },
7065 { PREFIX_TABLE (PREFIX_VEX_6A) },
7066 { PREFIX_TABLE (PREFIX_VEX_6B) },
7067 { PREFIX_TABLE (PREFIX_VEX_6C) },
7068 { PREFIX_TABLE (PREFIX_VEX_6D) },
7069 { PREFIX_TABLE (PREFIX_VEX_6E) },
7070 { PREFIX_TABLE (PREFIX_VEX_6F) },
7071 /* 70 */
7072 { PREFIX_TABLE (PREFIX_VEX_70) },
7073 { REG_TABLE (REG_VEX_71) },
7074 { REG_TABLE (REG_VEX_72) },
7075 { REG_TABLE (REG_VEX_73) },
7076 { PREFIX_TABLE (PREFIX_VEX_74) },
7077 { PREFIX_TABLE (PREFIX_VEX_75) },
7078 { PREFIX_TABLE (PREFIX_VEX_76) },
7079 { PREFIX_TABLE (PREFIX_VEX_77) },
7080 /* 78 */
85f10a01
MM
7081 { "(bad)", { XX } },
7082 { "(bad)", { XX } },
7083 { "(bad)", { XX } },
7084 { "(bad)", { XX } },
c0f3af97
L
7085 { PREFIX_TABLE (PREFIX_VEX_7C) },
7086 { PREFIX_TABLE (PREFIX_VEX_7D) },
7087 { PREFIX_TABLE (PREFIX_VEX_7E) },
7088 { PREFIX_TABLE (PREFIX_VEX_7F) },
7089 /* 80 */
85f10a01
MM
7090 { "(bad)", { XX } },
7091 { "(bad)", { XX } },
7092 { "(bad)", { XX } },
7093 { "(bad)", { XX } },
85f10a01
MM
7094 { "(bad)", { XX } },
7095 { "(bad)", { XX } },
7096 { "(bad)", { XX } },
7097 { "(bad)", { XX } },
c0f3af97 7098 /* 88 */
85f10a01
MM
7099 { "(bad)", { XX } },
7100 { "(bad)", { XX } },
7101 { "(bad)", { XX } },
7102 { "(bad)", { XX } },
7103 { "(bad)", { XX } },
7104 { "(bad)", { XX } },
7105 { "(bad)", { XX } },
7106 { "(bad)", { XX } },
c0f3af97 7107 /* 90 */
85f10a01
MM
7108 { "(bad)", { XX } },
7109 { "(bad)", { XX } },
7110 { "(bad)", { XX } },
7111 { "(bad)", { XX } },
7112 { "(bad)", { XX } },
7113 { "(bad)", { XX } },
7114 { "(bad)", { XX } },
85f10a01 7115 { "(bad)", { XX } },
c0f3af97 7116 /* 98 */
85f10a01
MM
7117 { "(bad)", { XX } },
7118 { "(bad)", { XX } },
7119 { "(bad)", { XX } },
d5d7db8e
L
7120 { "(bad)", { XX } },
7121 { "(bad)", { XX } },
7122 { "(bad)", { XX } },
7123 { "(bad)", { XX } },
7124 { "(bad)", { XX } },
c0f3af97 7125 /* a0 */
d5d7db8e
L
7126 { "(bad)", { XX } },
7127 { "(bad)", { XX } },
7128 { "(bad)", { XX } },
7129 { "(bad)", { XX } },
7130 { "(bad)", { XX } },
7131 { "(bad)", { XX } },
7132 { "(bad)", { XX } },
7133 { "(bad)", { XX } },
c0f3af97 7134 /* a8 */
d5d7db8e
L
7135 { "(bad)", { XX } },
7136 { "(bad)", { XX } },
7137 { "(bad)", { XX } },
7138 { "(bad)", { XX } },
7139 { "(bad)", { XX } },
7140 { "(bad)", { XX } },
c0f3af97 7141 { REG_TABLE (REG_VEX_AE) },
d5d7db8e 7142 { "(bad)", { XX } },
c0f3af97 7143 /* b0 */
d5d7db8e 7144 { "(bad)", { XX } },
d5d7db8e
L
7145 { "(bad)", { XX } },
7146 { "(bad)", { XX } },
7147 { "(bad)", { XX } },
7148 { "(bad)", { XX } },
7149 { "(bad)", { XX } },
7150 { "(bad)", { XX } },
7151 { "(bad)", { XX } },
c0f3af97 7152 /* b8 */
d5d7db8e 7153 { "(bad)", { XX } },
d5d7db8e
L
7154 { "(bad)", { XX } },
7155 { "(bad)", { XX } },
7156 { "(bad)", { XX } },
7157 { "(bad)", { XX } },
7158 { "(bad)", { XX } },
7159 { "(bad)", { XX } },
7160 { "(bad)", { XX } },
c0f3af97 7161 /* c0 */
d5d7db8e 7162 { "(bad)", { XX } },
d5d7db8e 7163 { "(bad)", { XX } },
c0f3af97 7164 { PREFIX_TABLE (PREFIX_VEX_C2) },
d5d7db8e 7165 { "(bad)", { XX } },
c0f3af97
L
7166 { PREFIX_TABLE (PREFIX_VEX_C4) },
7167 { PREFIX_TABLE (PREFIX_VEX_C5) },
7168 { "vshufpX", { XM, Vex, EXx, Ib } },
d5d7db8e 7169 { "(bad)", { XX } },
c0f3af97 7170 /* c8 */
d5d7db8e
L
7171 { "(bad)", { XX } },
7172 { "(bad)", { XX } },
7173 { "(bad)", { XX } },
7174 { "(bad)", { XX } },
7175 { "(bad)", { XX } },
d5d7db8e
L
7176 { "(bad)", { XX } },
7177 { "(bad)", { XX } },
7178 { "(bad)", { XX } },
c0f3af97
L
7179 /* d0 */
7180 { PREFIX_TABLE (PREFIX_VEX_D0) },
7181 { PREFIX_TABLE (PREFIX_VEX_D1) },
7182 { PREFIX_TABLE (PREFIX_VEX_D2) },
7183 { PREFIX_TABLE (PREFIX_VEX_D3) },
7184 { PREFIX_TABLE (PREFIX_VEX_D4) },
7185 { PREFIX_TABLE (PREFIX_VEX_D5) },
7186 { PREFIX_TABLE (PREFIX_VEX_D6) },
7187 { PREFIX_TABLE (PREFIX_VEX_D7) },
7188 /* d8 */
7189 { PREFIX_TABLE (PREFIX_VEX_D8) },
7190 { PREFIX_TABLE (PREFIX_VEX_D9) },
7191 { PREFIX_TABLE (PREFIX_VEX_DA) },
7192 { PREFIX_TABLE (PREFIX_VEX_DB) },
7193 { PREFIX_TABLE (PREFIX_VEX_DC) },
7194 { PREFIX_TABLE (PREFIX_VEX_DD) },
7195 { PREFIX_TABLE (PREFIX_VEX_DE) },
7196 { PREFIX_TABLE (PREFIX_VEX_DF) },
7197 /* e0 */
7198 { PREFIX_TABLE (PREFIX_VEX_E0) },
7199 { PREFIX_TABLE (PREFIX_VEX_E1) },
7200 { PREFIX_TABLE (PREFIX_VEX_E2) },
7201 { PREFIX_TABLE (PREFIX_VEX_E3) },
7202 { PREFIX_TABLE (PREFIX_VEX_E4) },
7203 { PREFIX_TABLE (PREFIX_VEX_E5) },
7204 { PREFIX_TABLE (PREFIX_VEX_E6) },
7205 { PREFIX_TABLE (PREFIX_VEX_E7) },
7206 /* e8 */
7207 { PREFIX_TABLE (PREFIX_VEX_E8) },
7208 { PREFIX_TABLE (PREFIX_VEX_E9) },
7209 { PREFIX_TABLE (PREFIX_VEX_EA) },
7210 { PREFIX_TABLE (PREFIX_VEX_EB) },
7211 { PREFIX_TABLE (PREFIX_VEX_EC) },
7212 { PREFIX_TABLE (PREFIX_VEX_ED) },
7213 { PREFIX_TABLE (PREFIX_VEX_EE) },
7214 { PREFIX_TABLE (PREFIX_VEX_EF) },
7215 /* f0 */
7216 { PREFIX_TABLE (PREFIX_VEX_F0) },
7217 { PREFIX_TABLE (PREFIX_VEX_F1) },
7218 { PREFIX_TABLE (PREFIX_VEX_F2) },
7219 { PREFIX_TABLE (PREFIX_VEX_F3) },
7220 { PREFIX_TABLE (PREFIX_VEX_F4) },
7221 { PREFIX_TABLE (PREFIX_VEX_F5) },
7222 { PREFIX_TABLE (PREFIX_VEX_F6) },
7223 { PREFIX_TABLE (PREFIX_VEX_F7) },
7224 /* f8 */
7225 { PREFIX_TABLE (PREFIX_VEX_F8) },
7226 { PREFIX_TABLE (PREFIX_VEX_F9) },
7227 { PREFIX_TABLE (PREFIX_VEX_FA) },
7228 { PREFIX_TABLE (PREFIX_VEX_FB) },
7229 { PREFIX_TABLE (PREFIX_VEX_FC) },
7230 { PREFIX_TABLE (PREFIX_VEX_FD) },
7231 { PREFIX_TABLE (PREFIX_VEX_FE) },
d5d7db8e 7232 { "(bad)", { XX } },
c0f3af97
L
7233 },
7234 /* VEX_0F38 */
7235 {
7236 /* 00 */
7237 { PREFIX_TABLE (PREFIX_VEX_3800) },
7238 { PREFIX_TABLE (PREFIX_VEX_3801) },
7239 { PREFIX_TABLE (PREFIX_VEX_3802) },
7240 { PREFIX_TABLE (PREFIX_VEX_3803) },
7241 { PREFIX_TABLE (PREFIX_VEX_3804) },
7242 { PREFIX_TABLE (PREFIX_VEX_3805) },
7243 { PREFIX_TABLE (PREFIX_VEX_3806) },
7244 { PREFIX_TABLE (PREFIX_VEX_3807) },
7245 /* 08 */
7246 { PREFIX_TABLE (PREFIX_VEX_3808) },
7247 { PREFIX_TABLE (PREFIX_VEX_3809) },
7248 { PREFIX_TABLE (PREFIX_VEX_380A) },
7249 { PREFIX_TABLE (PREFIX_VEX_380B) },
7250 { PREFIX_TABLE (PREFIX_VEX_380C) },
7251 { PREFIX_TABLE (PREFIX_VEX_380D) },
7252 { PREFIX_TABLE (PREFIX_VEX_380E) },
7253 { PREFIX_TABLE (PREFIX_VEX_380F) },
7254 /* 10 */
d5d7db8e
L
7255 { "(bad)", { XX } },
7256 { "(bad)", { XX } },
7257 { "(bad)", { XX } },
7258 { "(bad)", { XX } },
d5d7db8e
L
7259 { "(bad)", { XX } },
7260 { "(bad)", { XX } },
7261 { "(bad)", { XX } },
c0f3af97
L
7262 { PREFIX_TABLE (PREFIX_VEX_3817) },
7263 /* 18 */
7264 { PREFIX_TABLE (PREFIX_VEX_3818) },
7265 { PREFIX_TABLE (PREFIX_VEX_3819) },
7266 { PREFIX_TABLE (PREFIX_VEX_381A) },
d5d7db8e 7267 { "(bad)", { XX } },
c0f3af97
L
7268 { PREFIX_TABLE (PREFIX_VEX_381C) },
7269 { PREFIX_TABLE (PREFIX_VEX_381D) },
7270 { PREFIX_TABLE (PREFIX_VEX_381E) },
d5d7db8e 7271 { "(bad)", { XX } },
c0f3af97
L
7272 /* 20 */
7273 { PREFIX_TABLE (PREFIX_VEX_3820) },
7274 { PREFIX_TABLE (PREFIX_VEX_3821) },
7275 { PREFIX_TABLE (PREFIX_VEX_3822) },
7276 { PREFIX_TABLE (PREFIX_VEX_3823) },
7277 { PREFIX_TABLE (PREFIX_VEX_3824) },
7278 { PREFIX_TABLE (PREFIX_VEX_3825) },
d5d7db8e
L
7279 { "(bad)", { XX } },
7280 { "(bad)", { XX } },
c0f3af97
L
7281 /* 28 */
7282 { PREFIX_TABLE (PREFIX_VEX_3828) },
7283 { PREFIX_TABLE (PREFIX_VEX_3829) },
7284 { PREFIX_TABLE (PREFIX_VEX_382A) },
7285 { PREFIX_TABLE (PREFIX_VEX_382B) },
7286 { PREFIX_TABLE (PREFIX_VEX_382C) },
7287 { PREFIX_TABLE (PREFIX_VEX_382D) },
7288 { PREFIX_TABLE (PREFIX_VEX_382E) },
7289 { PREFIX_TABLE (PREFIX_VEX_382F) },
7290 /* 30 */
7291 { PREFIX_TABLE (PREFIX_VEX_3830) },
7292 { PREFIX_TABLE (PREFIX_VEX_3831) },
7293 { PREFIX_TABLE (PREFIX_VEX_3832) },
7294 { PREFIX_TABLE (PREFIX_VEX_3833) },
7295 { PREFIX_TABLE (PREFIX_VEX_3834) },
7296 { PREFIX_TABLE (PREFIX_VEX_3835) },
7297 { "(bad)", { XX } },
7298 { PREFIX_TABLE (PREFIX_VEX_3837) },
7299 /* 38 */
7300 { PREFIX_TABLE (PREFIX_VEX_3838) },
7301 { PREFIX_TABLE (PREFIX_VEX_3839) },
7302 { PREFIX_TABLE (PREFIX_VEX_383A) },
7303 { PREFIX_TABLE (PREFIX_VEX_383B) },
7304 { PREFIX_TABLE (PREFIX_VEX_383C) },
7305 { PREFIX_TABLE (PREFIX_VEX_383D) },
7306 { PREFIX_TABLE (PREFIX_VEX_383E) },
7307 { PREFIX_TABLE (PREFIX_VEX_383F) },
7308 /* 40 */
7309 { PREFIX_TABLE (PREFIX_VEX_3840) },
7310 { PREFIX_TABLE (PREFIX_VEX_3841) },
d5d7db8e 7311 { "(bad)", { XX } },
d5d7db8e
L
7312 { "(bad)", { XX } },
7313 { "(bad)", { XX } },
7314 { "(bad)", { XX } },
7315 { "(bad)", { XX } },
7316 { "(bad)", { XX } },
c0f3af97 7317 /* 48 */
d5d7db8e
L
7318 { "(bad)", { XX } },
7319 { "(bad)", { XX } },
7320 { "(bad)", { XX } },
d5d7db8e
L
7321 { "(bad)", { XX } },
7322 { "(bad)", { XX } },
7323 { "(bad)", { XX } },
7324 { "(bad)", { XX } },
7325 { "(bad)", { XX } },
c0f3af97 7326 /* 50 */
d5d7db8e
L
7327 { "(bad)", { XX } },
7328 { "(bad)", { XX } },
7329 { "(bad)", { XX } },
d5d7db8e
L
7330 { "(bad)", { XX } },
7331 { "(bad)", { XX } },
7332 { "(bad)", { XX } },
7333 { "(bad)", { XX } },
7334 { "(bad)", { XX } },
c0f3af97 7335 /* 58 */
d5d7db8e
L
7336 { "(bad)", { XX } },
7337 { "(bad)", { XX } },
7338 { "(bad)", { XX } },
d5d7db8e
L
7339 { "(bad)", { XX } },
7340 { "(bad)", { XX } },
7341 { "(bad)", { XX } },
7342 { "(bad)", { XX } },
7343 { "(bad)", { XX } },
c0f3af97 7344 /* 60 */
d5d7db8e
L
7345 { "(bad)", { XX } },
7346 { "(bad)", { XX } },
7347 { "(bad)", { XX } },
d5d7db8e
L
7348 { "(bad)", { XX } },
7349 { "(bad)", { XX } },
7350 { "(bad)", { XX } },
7351 { "(bad)", { XX } },
7352 { "(bad)", { XX } },
c0f3af97 7353 /* 68 */
d5d7db8e
L
7354 { "(bad)", { XX } },
7355 { "(bad)", { XX } },
7356 { "(bad)", { XX } },
d5d7db8e
L
7357 { "(bad)", { XX } },
7358 { "(bad)", { XX } },
7359 { "(bad)", { XX } },
7360 { "(bad)", { XX } },
7361 { "(bad)", { XX } },
c0f3af97 7362 /* 70 */
d5d7db8e
L
7363 { "(bad)", { XX } },
7364 { "(bad)", { XX } },
7365 { "(bad)", { XX } },
d5d7db8e
L
7366 { "(bad)", { XX } },
7367 { "(bad)", { XX } },
7368 { "(bad)", { XX } },
7369 { "(bad)", { XX } },
7370 { "(bad)", { XX } },
c0f3af97 7371 /* 78 */
d5d7db8e
L
7372 { "(bad)", { XX } },
7373 { "(bad)", { XX } },
7374 { "(bad)", { XX } },
d5d7db8e
L
7375 { "(bad)", { XX } },
7376 { "(bad)", { XX } },
7377 { "(bad)", { XX } },
7378 { "(bad)", { XX } },
7379 { "(bad)", { XX } },
c0f3af97 7380 /* 80 */
d5d7db8e
L
7381 { "(bad)", { XX } },
7382 { "(bad)", { XX } },
7383 { "(bad)", { XX } },
d5d7db8e
L
7384 { "(bad)", { XX } },
7385 { "(bad)", { XX } },
7386 { "(bad)", { XX } },
7387 { "(bad)", { XX } },
7388 { "(bad)", { XX } },
c0f3af97 7389 /* 88 */
d5d7db8e
L
7390 { "(bad)", { XX } },
7391 { "(bad)", { XX } },
7392 { "(bad)", { XX } },
d5d7db8e
L
7393 { "(bad)", { XX } },
7394 { "(bad)", { XX } },
7395 { "(bad)", { XX } },
7396 { "(bad)", { XX } },
7397 { "(bad)", { XX } },
c0f3af97 7398 /* 90 */
d5d7db8e
L
7399 { "(bad)", { XX } },
7400 { "(bad)", { XX } },
7401 { "(bad)", { XX } },
d5d7db8e
L
7402 { "(bad)", { XX } },
7403 { "(bad)", { XX } },
7404 { "(bad)", { XX } },
7405 { "(bad)", { XX } },
7406 { "(bad)", { XX } },
c0f3af97 7407 /* 98 */
d5d7db8e
L
7408 { "(bad)", { XX } },
7409 { "(bad)", { XX } },
7410 { "(bad)", { XX } },
d5d7db8e
L
7411 { "(bad)", { XX } },
7412 { "(bad)", { XX } },
7413 { "(bad)", { XX } },
7414 { "(bad)", { XX } },
7415 { "(bad)", { XX } },
c0f3af97 7416 /* a0 */
d5d7db8e
L
7417 { "(bad)", { XX } },
7418 { "(bad)", { XX } },
7419 { "(bad)", { XX } },
d5d7db8e
L
7420 { "(bad)", { XX } },
7421 { "(bad)", { XX } },
7422 { "(bad)", { XX } },
7423 { "(bad)", { XX } },
d5d7db8e 7424 { "(bad)", { XX } },
c0f3af97 7425 /* a8 */
d5d7db8e
L
7426 { "(bad)", { XX } },
7427 { "(bad)", { XX } },
7428 { "(bad)", { XX } },
7429 { "(bad)", { XX } },
7430 { "(bad)", { XX } },
7431 { "(bad)", { XX } },
7432 { "(bad)", { XX } },
d5d7db8e 7433 { "(bad)", { XX } },
c0f3af97 7434 /* b0 */
d5d7db8e
L
7435 { "(bad)", { XX } },
7436 { "(bad)", { XX } },
7437 { "(bad)", { XX } },
7438 { "(bad)", { XX } },
7439 { "(bad)", { XX } },
7440 { "(bad)", { XX } },
d5d7db8e
L
7441 { "(bad)", { XX } },
7442 { "(bad)", { XX } },
c0f3af97 7443 /* b8 */
d5d7db8e
L
7444 { "(bad)", { XX } },
7445 { "(bad)", { XX } },
7446 { "(bad)", { XX } },
7447 { "(bad)", { XX } },
7448 { "(bad)", { XX } },
7449 { "(bad)", { XX } },
d5d7db8e
L
7450 { "(bad)", { XX } },
7451 { "(bad)", { XX } },
c0f3af97 7452 /* c0 */
d5d7db8e
L
7453 { "(bad)", { XX } },
7454 { "(bad)", { XX } },
7455 { "(bad)", { XX } },
7456 { "(bad)", { XX } },
d5d7db8e
L
7457 { "(bad)", { XX } },
7458 { "(bad)", { XX } },
7459 { "(bad)", { XX } },
7460 { "(bad)", { XX } },
c0f3af97 7461 /* c8 */
d5d7db8e
L
7462 { "(bad)", { XX } },
7463 { "(bad)", { XX } },
7464 { "(bad)", { XX } },
7465 { "(bad)", { XX } },
d5d7db8e 7466 { "(bad)", { XX } },
d5d7db8e
L
7467 { "(bad)", { XX } },
7468 { "(bad)", { XX } },
d5d7db8e 7469 { "(bad)", { XX } },
c0f3af97 7470 /* d0 */
d5d7db8e
L
7471 { "(bad)", { XX } },
7472 { "(bad)", { XX } },
d5d7db8e
L
7473 { "(bad)", { XX } },
7474 { "(bad)", { XX } },
7475 { "(bad)", { XX } },
7476 { "(bad)", { XX } },
d5d7db8e 7477 { "(bad)", { XX } },
d5d7db8e 7478 { "(bad)", { XX } },
c0f3af97 7479 /* d8 */
d5d7db8e 7480 { "(bad)", { XX } },
d5d7db8e
L
7481 { "(bad)", { XX } },
7482 { "(bad)", { XX } },
a5ff0eb2
L
7483 { PREFIX_TABLE (PREFIX_VEX_38DB) },
7484 { PREFIX_TABLE (PREFIX_VEX_38DC) },
7485 { PREFIX_TABLE (PREFIX_VEX_38DD) },
7486 { PREFIX_TABLE (PREFIX_VEX_38DE) },
7487 { PREFIX_TABLE (PREFIX_VEX_38DF) },
c0f3af97 7488 /* e0 */
d5d7db8e 7489 { "(bad)", { XX } },
d5d7db8e
L
7490 { "(bad)", { XX } },
7491 { "(bad)", { XX } },
7492 { "(bad)", { XX } },
7493 { "(bad)", { XX } },
d5d7db8e
L
7494 { "(bad)", { XX } },
7495 { "(bad)", { XX } },
7496 { "(bad)", { XX } },
c0f3af97 7497 /* e8 */
d5d7db8e
L
7498 { "(bad)", { XX } },
7499 { "(bad)", { XX } },
7500 { "(bad)", { XX } },
7501 { "(bad)", { XX } },
7502 { "(bad)", { XX } },
d5d7db8e
L
7503 { "(bad)", { XX } },
7504 { "(bad)", { XX } },
7505 { "(bad)", { XX } },
c0f3af97 7506 /* f0 */
d5d7db8e
L
7507 { "(bad)", { XX } },
7508 { "(bad)", { XX } },
7509 { "(bad)", { XX } },
7510 { "(bad)", { XX } },
7511 { "(bad)", { XX } },
d5d7db8e
L
7512 { "(bad)", { XX } },
7513 { "(bad)", { XX } },
7514 { "(bad)", { XX } },
c0f3af97 7515 /* f8 */
d5d7db8e
L
7516 { "(bad)", { XX } },
7517 { "(bad)", { XX } },
7518 { "(bad)", { XX } },
7519 { "(bad)", { XX } },
7520 { "(bad)", { XX } },
d5d7db8e
L
7521 { "(bad)", { XX } },
7522 { "(bad)", { XX } },
7523 { "(bad)", { XX } },
c0f3af97
L
7524 },
7525 /* VEX_0F3A */
7526 {
7527 /* 00 */
d5d7db8e
L
7528 { "(bad)", { XX } },
7529 { "(bad)", { XX } },
7530 { "(bad)", { XX } },
7531 { "(bad)", { XX } },
c0f3af97
L
7532 { PREFIX_TABLE (PREFIX_VEX_3A04) },
7533 { PREFIX_TABLE (PREFIX_VEX_3A05) },
7534 { PREFIX_TABLE (PREFIX_VEX_3A06) },
d5d7db8e 7535 { "(bad)", { XX } },
c0f3af97
L
7536 /* 08 */
7537 { PREFIX_TABLE (PREFIX_VEX_3A08) },
7538 { PREFIX_TABLE (PREFIX_VEX_3A09) },
7539 { PREFIX_TABLE (PREFIX_VEX_3A0A) },
7540 { PREFIX_TABLE (PREFIX_VEX_3A0B) },
7541 { PREFIX_TABLE (PREFIX_VEX_3A0C) },
7542 { PREFIX_TABLE (PREFIX_VEX_3A0D) },
7543 { PREFIX_TABLE (PREFIX_VEX_3A0E) },
7544 { PREFIX_TABLE (PREFIX_VEX_3A0F) },
7545 /* 10 */
d5d7db8e
L
7546 { "(bad)", { XX } },
7547 { "(bad)", { XX } },
7548 { "(bad)", { XX } },
7549 { "(bad)", { XX } },
c0f3af97
L
7550 { PREFIX_TABLE (PREFIX_VEX_3A14) },
7551 { PREFIX_TABLE (PREFIX_VEX_3A15) },
7552 { PREFIX_TABLE (PREFIX_VEX_3A16) },
7553 { PREFIX_TABLE (PREFIX_VEX_3A17) },
7554 /* 18 */
7555 { PREFIX_TABLE (PREFIX_VEX_3A18) },
7556 { PREFIX_TABLE (PREFIX_VEX_3A19) },
d5d7db8e
L
7557 { "(bad)", { XX } },
7558 { "(bad)", { XX } },
7559 { "(bad)", { XX } },
7560 { "(bad)", { XX } },
d5d7db8e
L
7561 { "(bad)", { XX } },
7562 { "(bad)", { XX } },
c0f3af97
L
7563 /* 20 */
7564 { PREFIX_TABLE (PREFIX_VEX_3A20) },
7565 { PREFIX_TABLE (PREFIX_VEX_3A21) },
7566 { PREFIX_TABLE (PREFIX_VEX_3A22) },
d5d7db8e
L
7567 { "(bad)", { XX } },
7568 { "(bad)", { XX } },
7569 { "(bad)", { XX } },
7570 { "(bad)", { XX } },
7571 { "(bad)", { XX } },
c0f3af97 7572 /* 28 */
d5d7db8e 7573 { "(bad)", { XX } },
d5d7db8e
L
7574 { "(bad)", { XX } },
7575 { "(bad)", { XX } },
7576 { "(bad)", { XX } },
7577 { "(bad)", { XX } },
7578 { "(bad)", { XX } },
7579 { "(bad)", { XX } },
7580 { "(bad)", { XX } },
c0f3af97 7581 /* 30 */
d5d7db8e 7582 { "(bad)", { XX } },
d5d7db8e
L
7583 { "(bad)", { XX } },
7584 { "(bad)", { XX } },
7585 { "(bad)", { XX } },
7586 { "(bad)", { XX } },
7587 { "(bad)", { XX } },
7588 { "(bad)", { XX } },
7589 { "(bad)", { XX } },
c0f3af97 7590 /* 38 */
d5d7db8e 7591 { "(bad)", { XX } },
d5d7db8e
L
7592 { "(bad)", { XX } },
7593 { "(bad)", { XX } },
7594 { "(bad)", { XX } },
7595 { "(bad)", { XX } },
7596 { "(bad)", { XX } },
7597 { "(bad)", { XX } },
7598 { "(bad)", { XX } },
c0f3af97
L
7599 /* 40 */
7600 { PREFIX_TABLE (PREFIX_VEX_3A40) },
7601 { PREFIX_TABLE (PREFIX_VEX_3A41) },
7602 { PREFIX_TABLE (PREFIX_VEX_3A42) },
d5d7db8e 7603 { "(bad)", { XX } },
d5d7db8e
L
7604 { "(bad)", { XX } },
7605 { "(bad)", { XX } },
7606 { "(bad)", { XX } },
7607 { "(bad)", { XX } },
c0f3af97
L
7608 /* 48 */
7609 { PREFIX_TABLE (PREFIX_VEX_3A48) },
7610 { PREFIX_TABLE (PREFIX_VEX_3A49) },
7611 { PREFIX_TABLE (PREFIX_VEX_3A4A) },
7612 { PREFIX_TABLE (PREFIX_VEX_3A4B) },
7613 { PREFIX_TABLE (PREFIX_VEX_3A4C) },
d5d7db8e
L
7614 { "(bad)", { XX } },
7615 { "(bad)", { XX } },
7616 { "(bad)", { XX } },
c0f3af97 7617 /* 50 */
d5d7db8e 7618 { "(bad)", { XX } },
d5d7db8e
L
7619 { "(bad)", { XX } },
7620 { "(bad)", { XX } },
7621 { "(bad)", { XX } },
7622 { "(bad)", { XX } },
7623 { "(bad)", { XX } },
7624 { "(bad)", { XX } },
7625 { "(bad)", { XX } },
c0f3af97 7626 /* 58 */
d5d7db8e 7627 { "(bad)", { XX } },
d5d7db8e
L
7628 { "(bad)", { XX } },
7629 { "(bad)", { XX } },
7630 { "(bad)", { XX } },
c0f3af97
L
7631 { PREFIX_TABLE (PREFIX_VEX_3A5C) },
7632 { PREFIX_TABLE (PREFIX_VEX_3A5D) },
7633 { PREFIX_TABLE (PREFIX_VEX_3A5E) },
7634 { PREFIX_TABLE (PREFIX_VEX_3A5F) },
7635 /* 60 */
7636 { PREFIX_TABLE (PREFIX_VEX_3A60) },
7637 { PREFIX_TABLE (PREFIX_VEX_3A61) },
7638 { PREFIX_TABLE (PREFIX_VEX_3A62) },
7639 { PREFIX_TABLE (PREFIX_VEX_3A63) },
d5d7db8e
L
7640 { "(bad)", { XX } },
7641 { "(bad)", { XX } },
7642 { "(bad)", { XX } },
7643 { "(bad)", { XX } },
c0f3af97
L
7644 /* 68 */
7645 { PREFIX_TABLE (PREFIX_VEX_3A68) },
7646 { PREFIX_TABLE (PREFIX_VEX_3A69) },
7647 { PREFIX_TABLE (PREFIX_VEX_3A6A) },
7648 { PREFIX_TABLE (PREFIX_VEX_3A6B) },
7649 { PREFIX_TABLE (PREFIX_VEX_3A6C) },
7650 { PREFIX_TABLE (PREFIX_VEX_3A6D) },
7651 { PREFIX_TABLE (PREFIX_VEX_3A6E) },
7652 { PREFIX_TABLE (PREFIX_VEX_3A6F) },
7653 /* 70 */
d5d7db8e 7654 { "(bad)", { XX } },
d5d7db8e
L
7655 { "(bad)", { XX } },
7656 { "(bad)", { XX } },
7657 { "(bad)", { XX } },
7658 { "(bad)", { XX } },
7659 { "(bad)", { XX } },
7660 { "(bad)", { XX } },
7661 { "(bad)", { XX } },
c0f3af97
L
7662 /* 78 */
7663 { PREFIX_TABLE (PREFIX_VEX_3A78) },
7664 { PREFIX_TABLE (PREFIX_VEX_3A79) },
7665 { PREFIX_TABLE (PREFIX_VEX_3A7A) },
7666 { PREFIX_TABLE (PREFIX_VEX_3A7B) },
7667 { PREFIX_TABLE (PREFIX_VEX_3A7C) },
7668 { PREFIX_TABLE (PREFIX_VEX_3A7D) },
7669 { PREFIX_TABLE (PREFIX_VEX_3A7E) },
7670 { PREFIX_TABLE (PREFIX_VEX_3A7F) },
7671 /* 80 */
d5d7db8e 7672 { "(bad)", { XX } },
d5d7db8e
L
7673 { "(bad)", { XX } },
7674 { "(bad)", { XX } },
7675 { "(bad)", { XX } },
7676 { "(bad)", { XX } },
7677 { "(bad)", { XX } },
7678 { "(bad)", { XX } },
7679 { "(bad)", { XX } },
c0f3af97 7680 /* 88 */
d5d7db8e 7681 { "(bad)", { XX } },
d5d7db8e
L
7682 { "(bad)", { XX } },
7683 { "(bad)", { XX } },
7684 { "(bad)", { XX } },
7685 { "(bad)", { XX } },
7686 { "(bad)", { XX } },
7687 { "(bad)", { XX } },
7688 { "(bad)", { XX } },
c0f3af97 7689 /* 90 */
d5d7db8e 7690 { "(bad)", { XX } },
d5d7db8e
L
7691 { "(bad)", { XX } },
7692 { "(bad)", { XX } },
7693 { "(bad)", { XX } },
7694 { "(bad)", { XX } },
7695 { "(bad)", { XX } },
7696 { "(bad)", { XX } },
7697 { "(bad)", { XX } },
c0f3af97 7698 /* 98 */
d5d7db8e 7699 { "(bad)", { XX } },
d5d7db8e
L
7700 { "(bad)", { XX } },
7701 { "(bad)", { XX } },
7702 { "(bad)", { XX } },
7703 { "(bad)", { XX } },
7704 { "(bad)", { XX } },
7705 { "(bad)", { XX } },
7706 { "(bad)", { XX } },
c0f3af97 7707 /* a0 */
d5d7db8e 7708 { "(bad)", { XX } },
85f10a01
MM
7709 { "(bad)", { XX } },
7710 { "(bad)", { XX } },
d5d7db8e
L
7711 { "(bad)", { XX } },
7712 { "(bad)", { XX } },
7713 { "(bad)", { XX } },
7714 { "(bad)", { XX } },
7715 { "(bad)", { XX } },
c0f3af97 7716 /* a8 */
d5d7db8e 7717 { "(bad)", { XX } },
d5d7db8e
L
7718 { "(bad)", { XX } },
7719 { "(bad)", { XX } },
7720 { "(bad)", { XX } },
7721 { "(bad)", { XX } },
7722 { "(bad)", { XX } },
7723 { "(bad)", { XX } },
7724 { "(bad)", { XX } },
c0f3af97
L
7725 /* b0 */
7726 { "(bad)", { XX } },
7727 { "(bad)", { XX } },
7728 { "(bad)", { XX } },
7729 { "(bad)", { XX } },
7730 { "(bad)", { XX } },
7731 { "(bad)", { XX } },
7732 { "(bad)", { XX } },
7733 { "(bad)", { XX } },
7734 /* b8 */
7735 { "(bad)", { XX } },
7736 { "(bad)", { XX } },
7737 { "(bad)", { XX } },
7738 { "(bad)", { XX } },
7739 { "(bad)", { XX } },
7740 { "(bad)", { XX } },
7741 { "(bad)", { XX } },
7742 { "(bad)", { XX } },
7743 /* c0 */
7744 { "(bad)", { XX } },
7745 { "(bad)", { XX } },
7746 { "(bad)", { XX } },
7747 { "(bad)", { XX } },
7748 { "(bad)", { XX } },
7749 { "(bad)", { XX } },
7750 { "(bad)", { XX } },
7751 { "(bad)", { XX } },
7752 /* c8 */
7753 { "(bad)", { XX } },
7754 { "(bad)", { XX } },
d5d7db8e 7755 { "(bad)", { XX } },
d5d7db8e
L
7756 { "(bad)", { XX } },
7757 { "(bad)", { XX } },
7758 { "(bad)", { XX } },
7759 { "(bad)", { XX } },
7760 { "(bad)", { XX } },
c0f3af97
L
7761 /* d0 */
7762 { "(bad)", { XX } },
7763 { "(bad)", { XX } },
7764 { "(bad)", { XX } },
d5d7db8e
L
7765 { "(bad)", { XX } },
7766 { "(bad)", { XX } },
7767 { "(bad)", { XX } },
c0f3af97
L
7768 { "(bad)", { XX } },
7769 { "(bad)", { XX } },
7770 /* d8 */
7771 { "(bad)", { XX } },
d5d7db8e
L
7772 { "(bad)", { XX } },
7773 { "(bad)", { XX } },
7774 { "(bad)", { XX } },
7775 { "(bad)", { XX } },
7776 { "(bad)", { XX } },
7777 { "(bad)", { XX } },
a5ff0eb2 7778 { PREFIX_TABLE (PREFIX_VEX_3ADF) },
c0f3af97 7779 /* e0 */
d5d7db8e 7780 { "(bad)", { XX } },
d5d7db8e
L
7781 { "(bad)", { XX } },
7782 { "(bad)", { XX } },
7783 { "(bad)", { XX } },
7784 { "(bad)", { XX } },
7785 { "(bad)", { XX } },
7786 { "(bad)", { XX } },
7787 { "(bad)", { XX } },
c0f3af97 7788 /* e8 */
d5d7db8e 7789 { "(bad)", { XX } },
d5d7db8e
L
7790 { "(bad)", { XX } },
7791 { "(bad)", { XX } },
7792 { "(bad)", { XX } },
7793 { "(bad)", { XX } },
7794 { "(bad)", { XX } },
7795 { "(bad)", { XX } },
7796 { "(bad)", { XX } },
c0f3af97 7797 /* f0 */
d5d7db8e 7798 { "(bad)", { XX } },
d5d7db8e
L
7799 { "(bad)", { XX } },
7800 { "(bad)", { XX } },
7801 { "(bad)", { XX } },
7802 { "(bad)", { XX } },
7803 { "(bad)", { XX } },
7804 { "(bad)", { XX } },
7805 { "(bad)", { XX } },
c0f3af97 7806 /* f8 */
d5d7db8e 7807 { "(bad)", { XX } },
d5d7db8e
L
7808 { "(bad)", { XX } },
7809 { "(bad)", { XX } },
7810 { "(bad)", { XX } },
7811 { "(bad)", { XX } },
7812 { "(bad)", { XX } },
7813 { "(bad)", { XX } },
7814 { "(bad)", { XX } },
c0f3af97
L
7815 },
7816};
7817
7818static const struct dis386 vex_len_table[][2] = {
7819 /* VEX_LEN_10_P_1 */
7820 {
7821 { "vmovss", { XMVex, Vex128, EXd } },
d5d7db8e 7822 { "(bad)", { XX } },
c0f3af97
L
7823 },
7824
7825 /* VEX_LEN_10_P_3 */
7826 {
7827 { "vmovsd", { XMVex, Vex128, EXq } },
d5d7db8e 7828 { "(bad)", { XX } },
c0f3af97
L
7829 },
7830
7831 /* VEX_LEN_11_P_1 */
7832 {
7833 { "vmovss", { EXdVex, Vex128, XM } },
d5d7db8e 7834 { "(bad)", { XX } },
c0f3af97
L
7835 },
7836
7837 /* VEX_LEN_11_P_3 */
7838 {
7839 { "vmovsd", { EXqVex, Vex128, XM } },
d5d7db8e 7840 { "(bad)", { XX } },
c0f3af97
L
7841 },
7842
7843 /* VEX_LEN_12_P_0_M_0 */
7844 {
7845 { "vmovlps", { XM, Vex128, EXq } },
d5d7db8e 7846 { "(bad)", { XX } },
c0f3af97
L
7847 },
7848
7849 /* VEX_LEN_12_P_0_M_1 */
7850 {
7851 { "vmovhlps", { XM, Vex128, EXq } },
d5d7db8e 7852 { "(bad)", { XX } },
c0f3af97
L
7853 },
7854
7855 /* VEX_LEN_12_P_2 */
7856 {
7857 { "vmovlpd", { XM, Vex128, EXq } },
d5d7db8e 7858 { "(bad)", { XX } },
c0f3af97
L
7859 },
7860
7861 /* VEX_LEN_13_M_0 */
7862 {
7863 { "vmovlpX", { EXq, XM } },
85f10a01 7864 { "(bad)", { XX } },
c0f3af97
L
7865 },
7866
7867 /* VEX_LEN_16_P_0_M_0 */
7868 {
7869 { "vmovhps", { XM, Vex128, EXq } },
85f10a01 7870 { "(bad)", { XX } },
c0f3af97
L
7871 },
7872
7873 /* VEX_LEN_16_P_0_M_1 */
7874 {
7875 { "vmovlhps", { XM, Vex128, EXq } },
85f10a01 7876 { "(bad)", { XX } },
c0f3af97
L
7877 },
7878
7879 /* VEX_LEN_16_P_2 */
7880 {
7881 { "vmovhpd", { XM, Vex128, EXq } },
85f10a01 7882 { "(bad)", { XX } },
c0f3af97
L
7883 },
7884
7885 /* VEX_LEN_17_M_0 */
7886 {
7887 { "vmovhpX", { EXq, XM } },
85f10a01 7888 { "(bad)", { XX } },
c0f3af97
L
7889 },
7890
7891 /* VEX_LEN_2A_P_1 */
7892 {
7893 { "vcvtsi2ss%LQ", { XM, Vex128, Ev } },
d5d7db8e 7894 { "(bad)", { XX } },
c0f3af97
L
7895 },
7896
7897 /* VEX_LEN_2A_P_3 */
7898 {
7899 { "vcvtsi2sd%LQ", { XM, Vex128, Ev } },
d5d7db8e 7900 { "(bad)", { XX } },
c0f3af97
L
7901 },
7902
7903 /* VEX_LEN_2B_M_0 */
7904 {
7905 { "vmovntpX", { Mx, XM } },
d5d7db8e 7906 { "(bad)", { XX } },
c0f3af97
L
7907 },
7908
7909 /* VEX_LEN_2C_P_1 */
7910 {
7911 { "vcvttss2siY", { Gv, EXd } },
d5d7db8e 7912 { "(bad)", { XX } },
c0f3af97
L
7913 },
7914
7915 /* VEX_LEN_2C_P_3 */
7916 {
7917 { "vcvttsd2siY", { Gv, EXq } },
d5d7db8e 7918 { "(bad)", { XX } },
c0f3af97
L
7919 },
7920
7921 /* VEX_LEN_2D_P_1 */
7922 {
7923 { "vcvtss2siY", { Gv, EXd } },
85f10a01 7924 { "(bad)", { XX } },
c0f3af97
L
7925 },
7926
7927 /* VEX_LEN_2D_P_3 */
7928 {
7929 { "vcvtsd2siY", { Gv, EXq } },
d5d7db8e 7930 { "(bad)", { XX } },
c0f3af97
L
7931 },
7932
7933 /* VEX_LEN_2E_P_0 */
7934 {
7935 { "vucomiss", { XM, EXd } },
d5d7db8e 7936 { "(bad)", { XX } },
c0f3af97
L
7937 },
7938
7939 /* VEX_LEN_2E_P_2 */
7940 {
7941 { "vucomisd", { XM, EXq } },
d5d7db8e 7942 { "(bad)", { XX } },
c0f3af97
L
7943 },
7944
7945 /* VEX_LEN_2F_P_0 */
7946 {
7947 { "vcomiss", { XM, EXd } },
d5d7db8e 7948 { "(bad)", { XX } },
c0f3af97
L
7949 },
7950
7951 /* VEX_LEN_2F_P_2 */
7952 {
7953 { "vcomisd", { XM, EXq } },
d5d7db8e 7954 { "(bad)", { XX } },
c0f3af97
L
7955 },
7956
7957 /* VEX_LEN_51_P_1 */
7958 {
7959 { "vsqrtss", { XM, Vex128, EXd } },
d5d7db8e 7960 { "(bad)", { XX } },
c0f3af97
L
7961 },
7962
7963 /* VEX_LEN_51_P_3 */
7964 {
7965 { "vsqrtsd", { XM, Vex128, EXq } },
d5d7db8e 7966 { "(bad)", { XX } },
c0f3af97
L
7967 },
7968
7969 /* VEX_LEN_52_P_1 */
7970 {
7971 { "vrsqrtss", { XM, Vex128, EXd } },
d5d7db8e 7972 { "(bad)", { XX } },
c0f3af97
L
7973 },
7974
7975 /* VEX_LEN_53_P_1 */
7976 {
7977 { "vrcpss", { XM, Vex128, EXd } },
d5d7db8e 7978 { "(bad)", { XX } },
c0f3af97
L
7979 },
7980
7981 /* VEX_LEN_58_P_1 */
7982 {
7983 { "vaddss", { XM, Vex128, EXd } },
d5d7db8e 7984 { "(bad)", { XX } },
c0f3af97
L
7985 },
7986
7987 /* VEX_LEN_58_P_3 */
7988 {
7989 { "vaddsd", { XM, Vex128, EXq } },
d5d7db8e 7990 { "(bad)", { XX } },
c0f3af97
L
7991 },
7992
7993 /* VEX_LEN_59_P_1 */
7994 {
7995 { "vmulss", { XM, Vex128, EXd } },
d5d7db8e 7996 { "(bad)", { XX } },
c0f3af97
L
7997 },
7998
7999 /* VEX_LEN_59_P_3 */
8000 {
8001 { "vmulsd", { XM, Vex128, EXq } },
d5d7db8e 8002 { "(bad)", { XX } },
c0f3af97
L
8003 },
8004
8005 /* VEX_LEN_5A_P_1 */
8006 {
8007 { "vcvtss2sd", { XM, Vex128, EXd } },
d5d7db8e 8008 { "(bad)", { XX } },
c0f3af97
L
8009 },
8010
8011 /* VEX_LEN_5A_P_3 */
8012 {
8013 { "vcvtsd2ss", { XM, Vex128, EXq } },
d5d7db8e 8014 { "(bad)", { XX } },
c0f3af97
L
8015 },
8016
8017 /* VEX_LEN_5C_P_1 */
8018 {
8019 { "vsubss", { XM, Vex128, EXd } },
d5d7db8e 8020 { "(bad)", { XX } },
c0f3af97
L
8021 },
8022
8023 /* VEX_LEN_5C_P_3 */
8024 {
8025 { "vsubsd", { XM, Vex128, EXq } },
d5d7db8e 8026 { "(bad)", { XX } },
c0f3af97
L
8027 },
8028
8029 /* VEX_LEN_5D_P_1 */
8030 {
8031 { "vminss", { XM, Vex128, EXd } },
d5d7db8e 8032 { "(bad)", { XX } },
c0f3af97
L
8033 },
8034
8035 /* VEX_LEN_5D_P_3 */
8036 {
8037 { "vminsd", { XM, Vex128, EXq } },
d5d7db8e 8038 { "(bad)", { XX } },
c0f3af97
L
8039 },
8040
8041 /* VEX_LEN_5E_P_1 */
8042 {
8043 { "vdivss", { XM, Vex128, EXd } },
85f10a01 8044 { "(bad)", { XX } },
c0f3af97
L
8045 },
8046
8047 /* VEX_LEN_5E_P_3 */
8048 {
8049 { "vdivsd", { XM, Vex128, EXq } },
85f10a01 8050 { "(bad)", { XX } },
c0f3af97
L
8051 },
8052
8053 /* VEX_LEN_5F_P_1 */
8054 {
8055 { "vmaxss", { XM, Vex128, EXd } },
85f10a01 8056 { "(bad)", { XX } },
c0f3af97
L
8057 },
8058
8059 /* VEX_LEN_5F_P_3 */
8060 {
8061 { "vmaxsd", { XM, Vex128, EXq } },
85f10a01 8062 { "(bad)", { XX } },
c0f3af97
L
8063 },
8064
8065 /* VEX_LEN_60_P_2 */
8066 {
8067 { "vpunpcklbw", { XM, Vex128, EXx } },
d5d7db8e 8068 { "(bad)", { XX } },
c0f3af97
L
8069 },
8070
8071 /* VEX_LEN_61_P_2 */
8072 {
8073 { "vpunpcklwd", { XM, Vex128, EXx } },
d5d7db8e 8074 { "(bad)", { XX } },
c0f3af97
L
8075 },
8076
8077 /* VEX_LEN_62_P_2 */
8078 {
8079 { "vpunpckldq", { XM, Vex128, EXx } },
d5d7db8e 8080 { "(bad)", { XX } },
c0f3af97
L
8081 },
8082
8083 /* VEX_LEN_63_P_2 */
8084 {
8085 { "vpacksswb", { XM, Vex128, EXx } },
d5d7db8e 8086 { "(bad)", { XX } },
c0f3af97
L
8087 },
8088
8089 /* VEX_LEN_64_P_2 */
8090 {
8091 { "vpcmpgtb", { XM, Vex128, EXx } },
d5d7db8e 8092 { "(bad)", { XX } },
c0f3af97
L
8093 },
8094
8095 /* VEX_LEN_65_P_2 */
8096 {
8097 { "vpcmpgtw", { XM, Vex128, EXx } },
d5d7db8e 8098 { "(bad)", { XX } },
c0f3af97
L
8099 },
8100
8101 /* VEX_LEN_66_P_2 */
8102 {
8103 { "vpcmpgtd", { XM, Vex128, EXx } },
d5d7db8e 8104 { "(bad)", { XX } },
c0f3af97
L
8105 },
8106
8107 /* VEX_LEN_67_P_2 */
8108 {
8109 { "vpackuswb", { XM, Vex128, EXx } },
d5d7db8e 8110 { "(bad)", { XX } },
c0f3af97
L
8111 },
8112
8113 /* VEX_LEN_68_P_2 */
8114 {
8115 { "vpunpckhbw", { XM, Vex128, EXx } },
d5d7db8e 8116 { "(bad)", { XX } },
c0f3af97
L
8117 },
8118
8119 /* VEX_LEN_69_P_2 */
8120 {
8121 { "vpunpckhwd", { XM, Vex128, EXx } },
d5d7db8e 8122 { "(bad)", { XX } },
c0f3af97
L
8123 },
8124
8125 /* VEX_LEN_6A_P_2 */
8126 {
8127 { "vpunpckhdq", { XM, Vex128, EXx } },
d5d7db8e 8128 { "(bad)", { XX } },
c0f3af97
L
8129 },
8130
8131 /* VEX_LEN_6B_P_2 */
8132 {
8133 { "vpackssdw", { XM, Vex128, EXx } },
d5d7db8e 8134 { "(bad)", { XX } },
c0f3af97
L
8135 },
8136
8137 /* VEX_LEN_6C_P_2 */
8138 {
8139 { "vpunpcklqdq", { XM, Vex128, EXx } },
d5d7db8e 8140 { "(bad)", { XX } },
c0f3af97
L
8141 },
8142
8143 /* VEX_LEN_6D_P_2 */
8144 {
8145 { "vpunpckhqdq", { XM, Vex128, EXx } },
d5d7db8e 8146 { "(bad)", { XX } },
c0f3af97
L
8147 },
8148
8149 /* VEX_LEN_6E_P_2 */
8150 {
8151 { "vmovK", { XM, Edq } },
d5d7db8e 8152 { "(bad)", { XX } },
c0f3af97
L
8153 },
8154
8155 /* VEX_LEN_70_P_1 */
8156 {
8157 { "vpshufhw", { XM, EXx, Ib } },
d5d7db8e 8158 { "(bad)", { XX } },
c0f3af97
L
8159 },
8160
8161 /* VEX_LEN_70_P_2 */
8162 {
8163 { "vpshufd", { XM, EXx, Ib } },
d5d7db8e 8164 { "(bad)", { XX } },
c0f3af97
L
8165 },
8166
8167 /* VEX_LEN_70_P_3 */
8168 {
8169 { "vpshuflw", { XM, EXx, Ib } },
d5d7db8e 8170 { "(bad)", { XX } },
c0f3af97
L
8171 },
8172
8173 /* VEX_LEN_71_R_2_P_2 */
8174 {
8175 { "vpsrlw", { Vex128, XS, Ib } },
d5d7db8e 8176 { "(bad)", { XX } },
c0f3af97
L
8177 },
8178
8179 /* VEX_LEN_71_R_4_P_2 */
8180 {
8181 { "vpsraw", { Vex128, XS, Ib } },
d5d7db8e 8182 { "(bad)", { XX } },
c0f3af97
L
8183 },
8184
8185 /* VEX_LEN_71_R_6_P_2 */
8186 {
8187 { "vpsllw", { Vex128, XS, Ib } },
d5d7db8e 8188 { "(bad)", { XX } },
c0f3af97
L
8189 },
8190
8191 /* VEX_LEN_72_R_2_P_2 */
8192 {
8193 { "vpsrld", { Vex128, XS, Ib } },
d5d7db8e 8194 { "(bad)", { XX } },
c0f3af97
L
8195 },
8196
8197 /* VEX_LEN_72_R_4_P_2 */
8198 {
8199 { "vpsrad", { Vex128, XS, Ib } },
d5d7db8e 8200 { "(bad)", { XX } },
c0f3af97
L
8201 },
8202
8203 /* VEX_LEN_72_R_6_P_2 */
8204 {
8205 { "vpslld", { Vex128, XS, Ib } },
d5d7db8e 8206 { "(bad)", { XX } },
c0f3af97
L
8207 },
8208
8209 /* VEX_LEN_73_R_2_P_2 */
8210 {
8211 { "vpsrlq", { Vex128, XS, Ib } },
d5d7db8e 8212 { "(bad)", { XX } },
c0f3af97
L
8213 },
8214
8215 /* VEX_LEN_73_R_3_P_2 */
8216 {
8217 { "vpsrldq", { Vex128, XS, Ib } },
d5d7db8e 8218 { "(bad)", { XX } },
c0f3af97
L
8219 },
8220
8221 /* VEX_LEN_73_R_6_P_2 */
8222 {
8223 { "vpsllq", { Vex128, XS, Ib } },
d5d7db8e 8224 { "(bad)", { XX } },
c0f3af97
L
8225 },
8226
8227 /* VEX_LEN_73_R_7_P_2 */
8228 {
8229 { "vpslldq", { Vex128, XS, Ib } },
d5d7db8e 8230 { "(bad)", { XX } },
c0f3af97
L
8231 },
8232
8233 /* VEX_LEN_74_P_2 */
8234 {
8235 { "vpcmpeqb", { XM, Vex128, EXx } },
d5d7db8e 8236 { "(bad)", { XX } },
c0f3af97
L
8237 },
8238
8239 /* VEX_LEN_75_P_2 */
8240 {
8241 { "vpcmpeqw", { XM, Vex128, EXx } },
d5d7db8e 8242 { "(bad)", { XX } },
c0f3af97
L
8243 },
8244
8245 /* VEX_LEN_76_P_2 */
8246 {
8247 { "vpcmpeqd", { XM, Vex128, EXx } },
d5d7db8e 8248 { "(bad)", { XX } },
c0f3af97
L
8249 },
8250
8251 /* VEX_LEN_7E_P_1 */
8252 {
8253 { "vmovq", { XM, EXq } },
d5d7db8e 8254 { "(bad)", { XX } },
c0f3af97
L
8255 },
8256
8257 /* VEX_LEN_7E_P_2 */
8258 {
8259 { "vmovK", { Edq, XM } },
d5d7db8e 8260 { "(bad)", { XX } },
c0f3af97
L
8261 },
8262
8263 /* VEX_LEN_AE_R_2_M0 */
8264 {
8265 { "vldmxcsr", { Md } },
d5d7db8e 8266 { "(bad)", { XX } },
c0f3af97
L
8267 },
8268
8269 /* VEX_LEN_AE_R_3_M0 */
8270 {
8271 { "vstmxcsr", { Md } },
d5d7db8e 8272 { "(bad)", { XX } },
c0f3af97
L
8273 },
8274
8275 /* VEX_LEN_C2_P_1 */
8276 {
8277 { "vcmpss", { XM, Vex128, EXd, VCMP } },
d5d7db8e 8278 { "(bad)", { XX } },
c0f3af97
L
8279 },
8280
8281 /* VEX_LEN_C2_P_3 */
8282 {
8283 { "vcmpsd", { XM, Vex128, EXq, VCMP } },
d5d7db8e 8284 { "(bad)", { XX } },
c0f3af97
L
8285 },
8286
8287 /* VEX_LEN_C4_P_2 */
8288 {
8289 { "vpinsrw", { XM, Vex128, Edqw, Ib } },
d5d7db8e 8290 { "(bad)", { XX } },
c0f3af97
L
8291 },
8292
8293 /* VEX_LEN_C5_P_2 */
8294 {
8295 { "vpextrw", { Gdq, XS, Ib } },
d5d7db8e 8296 { "(bad)", { XX } },
c0f3af97
L
8297 },
8298
8299 /* VEX_LEN_D1_P_2 */
8300 {
8301 { "vpsrlw", { XM, Vex128, EXx } },
d5d7db8e 8302 { "(bad)", { XX } },
c0f3af97
L
8303 },
8304
8305 /* VEX_LEN_D2_P_2 */
8306 {
8307 { "vpsrld", { XM, Vex128, EXx } },
d5d7db8e 8308 { "(bad)", { XX } },
c0f3af97
L
8309 },
8310
8311 /* VEX_LEN_D3_P_2 */
8312 {
8313 { "vpsrlq", { XM, Vex128, EXx } },
d5d7db8e 8314 { "(bad)", { XX } },
c0f3af97
L
8315 },
8316
8317 /* VEX_LEN_D4_P_2 */
8318 {
8319 { "vpaddq", { XM, Vex128, EXx } },
d5d7db8e 8320 { "(bad)", { XX } },
c0f3af97
L
8321 },
8322
8323 /* VEX_LEN_D5_P_2 */
8324 {
8325 { "vpmullw", { XM, Vex128, EXx } },
d5d7db8e 8326 { "(bad)", { XX } },
c0f3af97
L
8327 },
8328
8329 /* VEX_LEN_D6_P_2 */
8330 {
8331 { "vmovq", { EXq, XM } },
d5d7db8e 8332 { "(bad)", { XX } },
c0f3af97
L
8333 },
8334
8335 /* VEX_LEN_D7_P_2_M_1 */
8336 {
8337 { "vpmovmskb", { Gdq, XS } },
d5d7db8e 8338 { "(bad)", { XX } },
c0f3af97
L
8339 },
8340
8341 /* VEX_LEN_D8_P_2 */
8342 {
8343 { "vpsubusb", { XM, Vex128, EXx } },
d5d7db8e 8344 { "(bad)", { XX } },
c0f3af97
L
8345 },
8346
8347 /* VEX_LEN_D9_P_2 */
8348 {
8349 { "vpsubusw", { XM, Vex128, EXx } },
d5d7db8e 8350 { "(bad)", { XX } },
c0f3af97
L
8351 },
8352
8353 /* VEX_LEN_DA_P_2 */
8354 {
8355 { "vpminub", { XM, Vex128, EXx } },
d5d7db8e 8356 { "(bad)", { XX } },
c0f3af97
L
8357 },
8358
8359 /* VEX_LEN_DB_P_2 */
8360 {
8361 { "vpand", { XM, Vex128, EXx } },
d5d7db8e 8362 { "(bad)", { XX } },
c0f3af97
L
8363 },
8364
8365 /* VEX_LEN_DC_P_2 */
8366 {
8367 { "vpaddusb", { XM, Vex128, EXx } },
d5d7db8e 8368 { "(bad)", { XX } },
c0f3af97
L
8369 },
8370
8371 /* VEX_LEN_DD_P_2 */
8372 {
8373 { "vpaddusw", { XM, Vex128, EXx } },
d5d7db8e 8374 { "(bad)", { XX } },
c0f3af97
L
8375 },
8376
8377 /* VEX_LEN_DE_P_2 */
8378 {
8379 { "vpmaxub", { XM, Vex128, EXx } },
d5d7db8e 8380 { "(bad)", { XX } },
c0f3af97
L
8381 },
8382
8383 /* VEX_LEN_DF_P_2 */
8384 {
8385 { "vpandn", { XM, Vex128, EXx } },
d5d7db8e 8386 { "(bad)", { XX } },
c0f3af97
L
8387 },
8388
8389 /* VEX_LEN_E0_P_2 */
8390 {
8391 { "vpavgb", { XM, Vex128, EXx } },
d5d7db8e 8392 { "(bad)", { XX } },
c0f3af97
L
8393 },
8394
8395 /* VEX_LEN_E1_P_2 */
8396 {
8397 { "vpsraw", { XM, Vex128, EXx } },
d5d7db8e 8398 { "(bad)", { XX } },
c0f3af97
L
8399 },
8400
8401 /* VEX_LEN_E2_P_2 */
8402 {
8403 { "vpsrad", { XM, Vex128, EXx } },
d5d7db8e 8404 { "(bad)", { XX } },
c0f3af97
L
8405 },
8406
8407 /* VEX_LEN_E3_P_2 */
8408 {
8409 { "vpavgw", { XM, Vex128, EXx } },
d5d7db8e 8410 { "(bad)", { XX } },
c0f3af97
L
8411 },
8412
8413 /* VEX_LEN_E4_P_2 */
8414 {
8415 { "vpmulhuw", { XM, Vex128, EXx } },
d5d7db8e 8416 { "(bad)", { XX } },
c0f3af97
L
8417 },
8418
8419 /* VEX_LEN_E5_P_2 */
8420 {
8421 { "vpmulhw", { XM, Vex128, EXx } },
d5d7db8e 8422 { "(bad)", { XX } },
c0f3af97
L
8423 },
8424
8425 /* VEX_LEN_E7_P_2_M_0 */
8426 {
8427 { "vmovntdq", { Mx, XM } },
d5d7db8e 8428 { "(bad)", { XX } },
c0f3af97
L
8429 },
8430
8431 /* VEX_LEN_E8_P_2 */
8432 {
8433 { "vpsubsb", { XM, Vex128, EXx } },
d5d7db8e 8434 { "(bad)", { XX } },
c0f3af97
L
8435 },
8436
8437 /* VEX_LEN_E9_P_2 */
8438 {
8439 { "vpsubsw", { XM, Vex128, EXx } },
d5d7db8e 8440 { "(bad)", { XX } },
c0f3af97
L
8441 },
8442
8443 /* VEX_LEN_EA_P_2 */
8444 {
8445 { "vpminsw", { XM, Vex128, EXx } },
d5d7db8e 8446 { "(bad)", { XX } },
c0f3af97
L
8447 },
8448
8449 /* VEX_LEN_EB_P_2 */
8450 {
8451 { "vpor", { XM, Vex128, EXx } },
d5d7db8e 8452 { "(bad)", { XX } },
c0f3af97
L
8453 },
8454
8455 /* VEX_LEN_EC_P_2 */
8456 {
8457 { "vpaddsb", { XM, Vex128, EXx } },
d5d7db8e 8458 { "(bad)", { XX } },
c0f3af97
L
8459 },
8460
8461 /* VEX_LEN_ED_P_2 */
8462 {
8463 { "vpaddsw", { XM, Vex128, EXx } },
d5d7db8e 8464 { "(bad)", { XX } },
c0f3af97
L
8465 },
8466
8467 /* VEX_LEN_EE_P_2 */
8468 {
8469 { "vpmaxsw", { XM, Vex128, EXx } },
d5d7db8e 8470 { "(bad)", { XX } },
c0f3af97
L
8471 },
8472
8473 /* VEX_LEN_EF_P_2 */
8474 {
8475 { "vpxor", { XM, Vex128, EXx } },
d5d7db8e 8476 { "(bad)", { XX } },
c0f3af97
L
8477 },
8478
8479 /* VEX_LEN_F1_P_2 */
8480 {
8481 { "vpsllw", { XM, Vex128, EXx } },
d5d7db8e 8482 { "(bad)", { XX } },
c0f3af97
L
8483 },
8484
8485 /* VEX_LEN_F2_P_2 */
8486 {
8487 { "vpslld", { XM, Vex128, EXx } },
d5d7db8e 8488 { "(bad)", { XX } },
c0f3af97
L
8489 },
8490
8491 /* VEX_LEN_F3_P_2 */
8492 {
8493 { "vpsllq", { XM, Vex128, EXx } },
d5d7db8e 8494 { "(bad)", { XX } },
c0f3af97
L
8495 },
8496
8497 /* VEX_LEN_F4_P_2 */
8498 {
8499 { "vpmuludq", { XM, Vex128, EXx } },
d5d7db8e 8500 { "(bad)", { XX } },
c0f3af97
L
8501 },
8502
8503 /* VEX_LEN_F5_P_2 */
8504 {
8505 { "vpmaddwd", { XM, Vex128, EXx } },
d5d7db8e 8506 { "(bad)", { XX } },
c0f3af97
L
8507 },
8508
8509 /* VEX_LEN_F6_P_2 */
8510 {
8511 { "vpsadbw", { XM, Vex128, EXx } },
d5d7db8e 8512 { "(bad)", { XX } },
c0f3af97
L
8513 },
8514
8515 /* VEX_LEN_F7_P_2 */
8516 {
8517 { "vmaskmovdqu", { XM, XS } },
d5d7db8e 8518 { "(bad)", { XX } },
c0f3af97
L
8519 },
8520
8521 /* VEX_LEN_F8_P_2 */
8522 {
8523 { "vpsubb", { XM, Vex128, EXx } },
d5d7db8e 8524 { "(bad)", { XX } },
c0f3af97
L
8525 },
8526
8527 /* VEX_LEN_F9_P_2 */
8528 {
8529 { "vpsubw", { XM, Vex128, EXx } },
d5d7db8e 8530 { "(bad)", { XX } },
c0f3af97
L
8531 },
8532
8533 /* VEX_LEN_FA_P_2 */
8534 {
8535 { "vpsubd", { XM, Vex128, EXx } },
d5d7db8e 8536 { "(bad)", { XX } },
c0f3af97
L
8537 },
8538
8539 /* VEX_LEN_FB_P_2 */
8540 {
8541 { "vpsubq", { XM, Vex128, EXx } },
d5d7db8e 8542 { "(bad)", { XX } },
c0f3af97
L
8543 },
8544
8545 /* VEX_LEN_FC_P_2 */
8546 {
8547 { "vpaddb", { XM, Vex128, EXx } },
d5d7db8e 8548 { "(bad)", { XX } },
c0f3af97
L
8549 },
8550
8551 /* VEX_LEN_FD_P_2 */
8552 {
8553 { "vpaddw", { XM, Vex128, EXx } },
d5d7db8e 8554 { "(bad)", { XX } },
c0f3af97
L
8555 },
8556
8557 /* VEX_LEN_FE_P_2 */
8558 {
8559 { "vpaddd", { XM, Vex128, EXx } },
d5d7db8e 8560 { "(bad)", { XX } },
c0f3af97
L
8561 },
8562
8563 /* VEX_LEN_3800_P_2 */
8564 {
8565 { "vpshufb", { XM, Vex128, EXx } },
d5d7db8e 8566 { "(bad)", { XX } },
c0f3af97
L
8567 },
8568
8569 /* VEX_LEN_3801_P_2 */
8570 {
8571 { "vphaddw", { XM, Vex128, EXx } },
d5d7db8e 8572 { "(bad)", { XX } },
c0f3af97
L
8573 },
8574
8575 /* VEX_LEN_3802_P_2 */
8576 {
8577 { "vphaddd", { XM, Vex128, EXx } },
d5d7db8e 8578 { "(bad)", { XX } },
c0f3af97
L
8579 },
8580
8581 /* VEX_LEN_3803_P_2 */
8582 {
8583 { "vphaddsw", { XM, Vex128, EXx } },
d5d7db8e 8584 { "(bad)", { XX } },
c0f3af97
L
8585 },
8586
8587 /* VEX_LEN_3804_P_2 */
8588 {
8589 { "vpmaddubsw", { XM, Vex128, EXx } },
d5d7db8e 8590 { "(bad)", { XX } },
c0f3af97
L
8591 },
8592
8593 /* VEX_LEN_3805_P_2 */
8594 {
8595 { "vphsubw", { XM, Vex128, EXx } },
d5d7db8e 8596 { "(bad)", { XX } },
c0f3af97
L
8597 },
8598
8599 /* VEX_LEN_3806_P_2 */
8600 {
8601 { "vphsubd", { XM, Vex128, EXx } },
d5d7db8e 8602 { "(bad)", { XX } },
c0f3af97
L
8603 },
8604
8605 /* VEX_LEN_3807_P_2 */
8606 {
8607 { "vphsubsw", { XM, Vex128, EXx } },
d5d7db8e 8608 { "(bad)", { XX } },
c0f3af97
L
8609 },
8610
8611 /* VEX_LEN_3808_P_2 */
8612 {
8613 { "vpsignb", { XM, Vex128, EXx } },
d5d7db8e 8614 { "(bad)", { XX } },
c0f3af97
L
8615 },
8616
8617 /* VEX_LEN_3809_P_2 */
8618 {
8619 { "vpsignw", { XM, Vex128, EXx } },
d5d7db8e 8620 { "(bad)", { XX } },
c0f3af97
L
8621 },
8622
8623 /* VEX_LEN_380A_P_2 */
8624 {
8625 { "vpsignd", { XM, Vex128, EXx } },
d5d7db8e 8626 { "(bad)", { XX } },
c0f3af97
L
8627 },
8628
8629 /* VEX_LEN_380B_P_2 */
8630 {
8631 { "vpmulhrsw", { XM, Vex128, EXx } },
d5d7db8e 8632 { "(bad)", { XX } },
c0f3af97
L
8633 },
8634
8635 /* VEX_LEN_3819_P_2_M_0 */
8636 {
d5d7db8e 8637 { "(bad)", { XX } },
c0f3af97
L
8638 { "vbroadcastsd", { XM, Mq } },
8639 },
8640
8641 /* VEX_LEN_381A_P_2_M_0 */
8642 {
d5d7db8e 8643 { "(bad)", { XX } },
c0f3af97
L
8644 { "vbroadcastf128", { XM, Mxmm } },
8645 },
8646
8647 /* VEX_LEN_381C_P_2 */
8648 {
8649 { "vpabsb", { XM, EXx } },
d5d7db8e 8650 { "(bad)", { XX } },
c0f3af97
L
8651 },
8652
8653 /* VEX_LEN_381D_P_2 */
8654 {
8655 { "vpabsw", { XM, EXx } },
d5d7db8e 8656 { "(bad)", { XX } },
c0f3af97
L
8657 },
8658
8659 /* VEX_LEN_381E_P_2 */
8660 {
8661 { "vpabsd", { XM, EXx } },
d5d7db8e 8662 { "(bad)", { XX } },
c0f3af97
L
8663 },
8664
8665 /* VEX_LEN_3820_P_2 */
8666 {
8667 { "vpmovsxbw", { XM, EXq } },
d5d7db8e 8668 { "(bad)", { XX } },
c0f3af97
L
8669 },
8670
8671 /* VEX_LEN_3821_P_2 */
8672 {
8673 { "vpmovsxbd", { XM, EXd } },
d5d7db8e 8674 { "(bad)", { XX } },
c0f3af97
L
8675 },
8676
8677 /* VEX_LEN_3822_P_2 */
8678 {
8679 { "vpmovsxbq", { XM, EXw } },
d5d7db8e 8680 { "(bad)", { XX } },
c0f3af97
L
8681 },
8682
8683 /* VEX_LEN_3823_P_2 */
8684 {
8685 { "vpmovsxwd", { XM, EXq } },
d5d7db8e 8686 { "(bad)", { XX } },
c0f3af97
L
8687 },
8688
8689 /* VEX_LEN_3824_P_2 */
8690 {
8691 { "vpmovsxwq", { XM, EXd } },
d5d7db8e 8692 { "(bad)", { XX } },
c0f3af97
L
8693 },
8694
8695 /* VEX_LEN_3825_P_2 */
8696 {
8697 { "vpmovsxdq", { XM, EXq } },
d5d7db8e 8698 { "(bad)", { XX } },
c0f3af97
L
8699 },
8700
8701 /* VEX_LEN_3828_P_2 */
8702 {
8703 { "vpmuldq", { XM, Vex128, EXx } },
d5d7db8e 8704 { "(bad)", { XX } },
c0f3af97
L
8705 },
8706
8707 /* VEX_LEN_3829_P_2 */
8708 {
8709 { "vpcmpeqq", { XM, Vex128, EXx } },
d5d7db8e 8710 { "(bad)", { XX } },
c0f3af97
L
8711 },
8712
8713 /* VEX_LEN_382A_P_2_M_0 */
8714 {
8715 { "vmovntdqa", { XM, Mx } },
d5d7db8e 8716 { "(bad)", { XX } },
c0f3af97
L
8717 },
8718
8719 /* VEX_LEN_382B_P_2 */
8720 {
8721 { "vpackusdw", { XM, Vex128, EXx } },
d5d7db8e 8722 { "(bad)", { XX } },
c0f3af97
L
8723 },
8724
8725 /* VEX_LEN_3830_P_2 */
8726 {
8727 { "vpmovzxbw", { XM, EXq } },
d5d7db8e 8728 { "(bad)", { XX } },
c0f3af97
L
8729 },
8730
8731 /* VEX_LEN_3831_P_2 */
8732 {
8733 { "vpmovzxbd", { XM, EXd } },
d5d7db8e 8734 { "(bad)", { XX } },
c0f3af97
L
8735 },
8736
8737 /* VEX_LEN_3832_P_2 */
8738 {
8739 { "vpmovzxbq", { XM, EXw } },
d5d7db8e 8740 { "(bad)", { XX } },
c0f3af97
L
8741 },
8742
8743 /* VEX_LEN_3833_P_2 */
8744 {
8745 { "vpmovzxwd", { XM, EXq } },
d5d7db8e 8746 { "(bad)", { XX } },
c0f3af97
L
8747 },
8748
8749 /* VEX_LEN_3834_P_2 */
8750 {
8751 { "vpmovzxwq", { XM, EXd } },
d5d7db8e 8752 { "(bad)", { XX } },
c0f3af97
L
8753 },
8754
8755 /* VEX_LEN_3835_P_2 */
8756 {
8757 { "vpmovzxdq", { XM, EXq } },
d5d7db8e 8758 { "(bad)", { XX } },
c0f3af97
L
8759 },
8760
8761 /* VEX_LEN_3837_P_2 */
8762 {
8763 { "vpcmpgtq", { XM, Vex128, EXx } },
d5d7db8e 8764 { "(bad)", { XX } },
c0f3af97
L
8765 },
8766
8767 /* VEX_LEN_3838_P_2 */
8768 {
8769 { "vpminsb", { XM, Vex128, EXx } },
d5d7db8e 8770 { "(bad)", { XX } },
c0f3af97
L
8771 },
8772
8773 /* VEX_LEN_3839_P_2 */
8774 {
8775 { "vpminsd", { XM, Vex128, EXx } },
d5d7db8e 8776 { "(bad)", { XX } },
c0f3af97
L
8777 },
8778
8779 /* VEX_LEN_383A_P_2 */
8780 {
8781 { "vpminuw", { XM, Vex128, EXx } },
d5d7db8e 8782 { "(bad)", { XX } },
c0f3af97
L
8783 },
8784
8785 /* VEX_LEN_383B_P_2 */
8786 {
8787 { "vpminud", { XM, Vex128, EXx } },
d5d7db8e 8788 { "(bad)", { XX } },
c0f3af97
L
8789 },
8790
8791 /* VEX_LEN_383C_P_2 */
8792 {
8793 { "vpmaxsb", { XM, Vex128, EXx } },
d5d7db8e 8794 { "(bad)", { XX } },
c0f3af97
L
8795 },
8796
8797 /* VEX_LEN_383D_P_2 */
8798 {
8799 { "vpmaxsd", { XM, Vex128, EXx } },
d5d7db8e 8800 { "(bad)", { XX } },
c0f3af97
L
8801 },
8802
8803 /* VEX_LEN_383E_P_2 */
8804 {
8805 { "vpmaxuw", { XM, Vex128, EXx } },
d5d7db8e 8806 { "(bad)", { XX } },
c0f3af97
L
8807 },
8808
8809 /* VEX_LEN_383F_P_2 */
8810 {
8811 { "vpmaxud", { XM, Vex128, EXx } },
d5d7db8e 8812 { "(bad)", { XX } },
c0f3af97
L
8813 },
8814
8815 /* VEX_LEN_3840_P_2 */
8816 {
8817 { "vpmulld", { XM, Vex128, EXx } },
d5d7db8e 8818 { "(bad)", { XX } },
c0f3af97
L
8819 },
8820
8821 /* VEX_LEN_3841_P_2 */
8822 {
8823 { "vphminposuw", { XM, EXx } },
d5d7db8e 8824 { "(bad)", { XX } },
c0f3af97
L
8825 },
8826
a5ff0eb2
L
8827 /* VEX_LEN_38DB_P_2 */
8828 {
8829 { "vaesimc", { XM, EXx } },
8830 { "(bad)", { XX } },
8831 },
8832
8833 /* VEX_LEN_38DC_P_2 */
8834 {
8835 { "vaesenc", { XM, Vex128, EXx } },
8836 { "(bad)", { XX } },
8837 },
8838
8839 /* VEX_LEN_38DD_P_2 */
8840 {
8841 { "vaesenclast", { XM, Vex128, EXx } },
8842 { "(bad)", { XX } },
8843 },
8844
8845 /* VEX_LEN_38DE_P_2 */
8846 {
8847 { "vaesdec", { XM, Vex128, EXx } },
8848 { "(bad)", { XX } },
8849 },
8850
8851 /* VEX_LEN_38DF_P_2 */
8852 {
8853 { "vaesdeclast", { XM, Vex128, EXx } },
8854 { "(bad)", { XX } },
8855 },
8856
c0f3af97
L
8857 /* VEX_LEN_3A06_P_2 */
8858 {
d5d7db8e 8859 { "(bad)", { XX } },
c0f3af97
L
8860 { "vperm2f128", { XM, Vex256, EXx, Ib } },
8861 },
8862
8863 /* VEX_LEN_3A0A_P_2 */
8864 {
8865 { "vroundss", { XM, Vex128, EXd, Ib } },
d5d7db8e 8866 { "(bad)", { XX } },
c0f3af97
L
8867 },
8868
8869 /* VEX_LEN_3A0B_P_2 */
8870 {
8871 { "vroundsd", { XM, Vex128, EXq, Ib } },
d5d7db8e 8872 { "(bad)", { XX } },
c0f3af97
L
8873 },
8874
8875 /* VEX_LEN_3A0E_P_2 */
8876 {
8877 { "vpblendw", { XM, Vex128, EXx, Ib } },
d5d7db8e 8878 { "(bad)", { XX } },
c0f3af97
L
8879 },
8880
8881 /* VEX_LEN_3A0F_P_2 */
8882 {
8883 { "vpalignr", { XM, Vex128, EXx, Ib } },
d5d7db8e 8884 { "(bad)", { XX } },
c0f3af97
L
8885 },
8886
8887 /* VEX_LEN_3A14_P_2 */
8888 {
8889 { "vpextrb", { Edqb, XM, Ib } },
d5d7db8e 8890 { "(bad)", { XX } },
c0f3af97
L
8891 },
8892
8893 /* VEX_LEN_3A15_P_2 */
8894 {
8895 { "vpextrw", { Edqw, XM, Ib } },
d5d7db8e 8896 { "(bad)", { XX } },
c0f3af97
L
8897 },
8898
8899 /* VEX_LEN_3A16_P_2 */
8900 {
8901 { "vpextrK", { Edq, XM, Ib } },
d5d7db8e 8902 { "(bad)", { XX } },
c0f3af97
L
8903 },
8904
8905 /* VEX_LEN_3A17_P_2 */
8906 {
8907 { "vextractps", { Edqd, XM, Ib } },
d5d7db8e 8908 { "(bad)", { XX } },
c0f3af97
L
8909 },
8910
8911 /* VEX_LEN_3A18_P_2 */
8912 {
d5d7db8e 8913 { "(bad)", { XX } },
c0f3af97
L
8914 { "vinsertf128", { XM, Vex256, EXxmm, Ib } },
8915 },
8916
8917 /* VEX_LEN_3A19_P_2 */
8918 {
d5d7db8e 8919 { "(bad)", { XX } },
c0f3af97
L
8920 { "vextractf128", { EXxmm, XM, Ib } },
8921 },
8922
8923 /* VEX_LEN_3A20_P_2 */
8924 {
8925 { "vpinsrb", { XM, Vex128, Edqb, Ib } },
d5d7db8e 8926 { "(bad)", { XX } },
c0f3af97
L
8927 },
8928
8929 /* VEX_LEN_3A21_P_2 */
8930 {
8931 { "vinsertps", { XM, Vex128, EXd, Ib } },
d5d7db8e 8932 { "(bad)", { XX } },
c0f3af97
L
8933 },
8934
8935 /* VEX_LEN_3A22_P_2 */
8936 {
8937 { "vpinsrK", { XM, Vex128, Edq, Ib } },
d5d7db8e 8938 { "(bad)", { XX } },
c0f3af97
L
8939 },
8940
8941 /* VEX_LEN_3A41_P_2 */
8942 {
8943 { "vdppd", { XM, Vex128, EXx, Ib } },
d5d7db8e 8944 { "(bad)", { XX } },
c0f3af97
L
8945 },
8946
8947 /* VEX_LEN_3A42_P_2 */
8948 {
8949 { "vmpsadbw", { XM, Vex128, EXx, Ib } },
d5d7db8e 8950 { "(bad)", { XX } },
c0f3af97
L
8951 },
8952
8953 /* VEX_LEN_3A4C_P_2 */
8954 {
8955 { "vpblendvb", { XM, Vex128, EXx, XMVexI4 } },
d5d7db8e 8956 { "(bad)", { XX } },
c0f3af97
L
8957 },
8958
8959 /* VEX_LEN_3A60_P_2 */
8960 {
8961 { "vpcmpestrm", { XM, EXx, Ib } },
d5d7db8e 8962 { "(bad)", { XX } },
c0f3af97
L
8963 },
8964
8965 /* VEX_LEN_3A61_P_2 */
8966 {
8967 { "vpcmpestri", { XM, EXx, Ib } },
d5d7db8e 8968 { "(bad)", { XX } },
c0f3af97
L
8969 },
8970
8971 /* VEX_LEN_3A62_P_2 */
8972 {
8973 { "vpcmpistrm", { XM, EXx, Ib } },
d5d7db8e 8974 { "(bad)", { XX } },
c0f3af97
L
8975 },
8976
8977 /* VEX_LEN_3A63_P_2 */
8978 {
8979 { "vpcmpistri", { XM, EXx, Ib } },
d5d7db8e 8980 { "(bad)", { XX } },
c0f3af97
L
8981 },
8982
8983 /* VEX_LEN_3A6A_P_2 */
8984 {
dae39acc 8985 { "vfmaddss", { XMVexW, Vex128FMA, EXdVexW, EXdVexW, VexI4 } },
d5d7db8e 8986 { "(bad)", { XX } },
c0f3af97
L
8987 },
8988
8989 /* VEX_LEN_3A6B_P_2 */
8990 {
dae39acc 8991 { "vfmaddsd", { XMVexW, Vex128FMA, EXqVexW, EXqVexW, VexI4 } },
d5d7db8e 8992 { "(bad)", { XX } },
c0f3af97
L
8993 },
8994
8995 /* VEX_LEN_3A6E_P_2 */
8996 {
dae39acc 8997 { "vfmsubss", { XMVexW, Vex128FMA, EXdVexW, EXdVexW, VexI4 } },
d5d7db8e 8998 { "(bad)", { XX } },
c0f3af97
L
8999 },
9000
9001 /* VEX_LEN_3A6F_P_2 */
9002 {
dae39acc 9003 { "vfmsubsd", { XMVexW, Vex128FMA, EXqVexW, EXqVexW, VexI4 } },
d5d7db8e 9004 { "(bad)", { XX } },
c0f3af97
L
9005 },
9006
9007 /* VEX_LEN_3A7A_P_2 */
9008 {
dae39acc 9009 { "vfnmaddss", { XMVexW, Vex128FMA, EXdVexW, EXdVexW, VexI4 } },
d5d7db8e 9010 { "(bad)", { XX } },
c0f3af97
L
9011 },
9012
9013 /* VEX_LEN_3A7B_P_2 */
9014 {
dae39acc 9015 { "vfnmaddsd", { XMVexW, Vex128FMA, EXqVexW, EXqVexW, VexI4 } },
d5d7db8e 9016 { "(bad)", { XX } },
c0f3af97
L
9017 },
9018
9019 /* VEX_LEN_3A7E_P_2 */
9020 {
dae39acc 9021 { "vfnmsubss", { XMVexW, Vex128FMA, EXdVexW, EXdVexW, VexI4 } },
d5d7db8e 9022 { "(bad)", { XX } },
c0f3af97
L
9023 },
9024
9025 /* VEX_LEN_3A7F_P_2 */
9026 {
dae39acc 9027 { "vfnmsubsd", { XMVexW, Vex128FMA, EXqVexW, EXqVexW, VexI4 } },
d5d7db8e 9028 { "(bad)", { XX } },
c0f3af97 9029 },
a5ff0eb2
L
9030
9031 /* VEX_LEN_3ADF_P_2 */
9032 {
9033 { "vaeskeygenassist", { XM, EXx, Ib } },
9034 { "(bad)", { XX } },
9035 },
331d2d0d
L
9036};
9037
1ceb70f8 9038static const struct dis386 mod_table[][2] = {
b844680a 9039 {
1ceb70f8 9040 /* MOD_8D */
d8faab4e
L
9041 { "leaS", { Gv, M } },
9042 { "(bad)", { XX } },
9043 },
9044 {
92fddf8e
L
9045 /* MOD_0F01_REG_0 */
9046 { X86_64_TABLE (X86_64_0F01_REG_0) },
9047 { RM_TABLE (RM_0F01_REG_0) },
d8faab4e
L
9048 },
9049 {
92fddf8e
L
9050 /* MOD_0F01_REG_1 */
9051 { X86_64_TABLE (X86_64_0F01_REG_1) },
9052 { RM_TABLE (RM_0F01_REG_1) },
d8faab4e
L
9053 },
9054 {
92fddf8e
L
9055 /* MOD_0F01_REG_2 */
9056 { X86_64_TABLE (X86_64_0F01_REG_2) },
475a2301 9057 { RM_TABLE (RM_0F01_REG_2) },
d8faab4e
L
9058 },
9059 {
92fddf8e
L
9060 /* MOD_0F01_REG_3 */
9061 { X86_64_TABLE (X86_64_0F01_REG_3) },
9062 { RM_TABLE (RM_0F01_REG_3) },
d8faab4e
L
9063 },
9064 {
92fddf8e
L
9065 /* MOD_0F01_REG_7 */
9066 { "invlpg", { Mb } },
9067 { RM_TABLE (RM_0F01_REG_7) },
b844680a
L
9068 },
9069 {
92fddf8e
L
9070 /* MOD_0F12_PREFIX_0 */
9071 { "movlps", { XM, EXq } },
9072 { "movhlps", { XM, EXq } },
b844680a
L
9073 },
9074 {
92fddf8e
L
9075 /* MOD_0F13 */
9076 { "movlpX", { EXq, XM } },
d8faab4e
L
9077 { "(bad)", { XX } },
9078 },
9079 {
92fddf8e
L
9080 /* MOD_0F16_PREFIX_0 */
9081 { "movhps", { XM, EXq } },
9082 { "movlhps", { XM, EXq } },
b844680a
L
9083 },
9084 {
92fddf8e
L
9085 /* MOD_0F17 */
9086 { "movhpX", { EXq, XM } },
b844680a
L
9087 { "(bad)", { XX } },
9088 },
9089 {
92fddf8e
L
9090 /* MOD_0F18_REG_0 */
9091 { "prefetchnta", { Mb } },
b844680a 9092 { "(bad)", { XX } },
b844680a
L
9093 },
9094 {
92fddf8e
L
9095 /* MOD_0F18_REG_1 */
9096 { "prefetcht0", { Mb } },
9097 { "(bad)", { XX } },
b844680a
L
9098 },
9099 {
92fddf8e
L
9100 /* MOD_0F18_REG_2 */
9101 { "prefetcht1", { Mb } },
9102 { "(bad)", { XX } },
b844680a
L
9103 },
9104 {
92fddf8e
L
9105 /* MOD_0F18_REG_3 */
9106 { "prefetcht2", { Mb } },
b844680a 9107 { "(bad)", { XX } },
b844680a
L
9108 },
9109 {
92fddf8e
L
9110 /* MOD_0F20 */
9111 { "(bad)", { XX } },
9112 { "movZ", { Rm, Cm } },
b844680a
L
9113 },
9114 {
92fddf8e
L
9115 /* MOD_0F21 */
9116 { "(bad)", { XX } },
9117 { "movZ", { Rm, Dm } },
b844680a
L
9118 },
9119 {
92fddf8e 9120 /* MOD_0F22 */
b844680a 9121 { "(bad)", { XX } },
92fddf8e 9122 { "movZ", { Cm, Rm } },
b844680a
L
9123 },
9124 {
92fddf8e 9125 /* MOD_0F23 */
b844680a 9126 { "(bad)", { XX } },
92fddf8e 9127 { "movZ", { Dm, Rm } },
b844680a
L
9128 },
9129 {
92fddf8e
L
9130 /* MOD_0F24 */
9131 { THREE_BYTE_TABLE (THREE_BYTE_0F24) },
9132 { "movL", { Rd, Td } },
b844680a
L
9133 },
9134 {
92fddf8e 9135 /* MOD_0F26 */
b844680a 9136 { "(bad)", { XX } },
92fddf8e 9137 { "movL", { Td, Rd } },
b844680a 9138 },
75c135a8
L
9139 {
9140 /* MOD_0F2B_PREFIX_0 */
4ee52178 9141 {"movntps", { Mx, XM } },
75c135a8
L
9142 { "(bad)", { XX } },
9143 },
9144 {
9145 /* MOD_0F2B_PREFIX_1 */
4ee52178 9146 {"movntss", { Md, XM } },
75c135a8
L
9147 { "(bad)", { XX } },
9148 },
9149 {
9150 /* MOD_0F2B_PREFIX_2 */
4ee52178 9151 {"movntpd", { Mx, XM } },
75c135a8
L
9152 { "(bad)", { XX } },
9153 },
9154 {
9155 /* MOD_0F2B_PREFIX_3 */
4ee52178 9156 {"movntsd", { Mq, XM } },
75c135a8
L
9157 { "(bad)", { XX } },
9158 },
9159 {
9160 /* MOD_0F51 */
9161 { "(bad)", { XX } },
9162 { "movmskpX", { Gdq, XS } },
9163 },
b844680a 9164 {
1ceb70f8 9165 /* MOD_0F71_REG_2 */
b844680a 9166 { "(bad)", { XX } },
4e7d34a6 9167 { "psrlw", { MS, Ib } },
b844680a
L
9168 },
9169 {
1ceb70f8 9170 /* MOD_0F71_REG_4 */
b844680a 9171 { "(bad)", { XX } },
4e7d34a6 9172 { "psraw", { MS, Ib } },
b844680a
L
9173 },
9174 {
1ceb70f8 9175 /* MOD_0F71_REG_6 */
b844680a 9176 { "(bad)", { XX } },
4e7d34a6 9177 { "psllw", { MS, Ib } },
b844680a
L
9178 },
9179 {
1ceb70f8 9180 /* MOD_0F72_REG_2 */
b844680a 9181 { "(bad)", { XX } },
4e7d34a6 9182 { "psrld", { MS, Ib } },
b844680a
L
9183 },
9184 {
1ceb70f8 9185 /* MOD_0F72_REG_4 */
b844680a 9186 { "(bad)", { XX } },
4e7d34a6 9187 { "psrad", { MS, Ib } },
b844680a
L
9188 },
9189 {
1ceb70f8 9190 /* MOD_0F72_REG_6 */
b844680a 9191 { "(bad)", { XX } },
4e7d34a6 9192 { "pslld", { MS, Ib } },
b844680a
L
9193 },
9194 {
1ceb70f8 9195 /* MOD_0F73_REG_2 */
4e7d34a6
L
9196 { "(bad)", { XX } },
9197 { "psrlq", { MS, Ib } },
b844680a
L
9198 },
9199 {
1ceb70f8 9200 /* MOD_0F73_REG_3 */
b844680a 9201 { "(bad)", { XX } },
c0f3af97
L
9202 { PREFIX_TABLE (PREFIX_0F73_REG_3) },
9203 },
9204 {
9205 /* MOD_0F73_REG_6 */
9206 { "(bad)", { XX } },
9207 { "psllq", { MS, Ib } },
9208 },
9209 {
9210 /* MOD_0F73_REG_7 */
9211 { "(bad)", { XX } },
9212 { PREFIX_TABLE (PREFIX_0F73_REG_7) },
9213 },
9214 {
9215 /* MOD_0FAE_REG_0 */
9216 { "fxsave", { M } },
9217 { "(bad)", { XX } },
9218 },
9219 {
9220 /* MOD_0FAE_REG_1 */
9221 { "fxrstor", { M } },
9222 { "(bad)", { XX } },
9223 },
9224 {
9225 /* MOD_0FAE_REG_2 */
9226 { "ldmxcsr", { Md } },
9227 { "(bad)", { XX } },
9228 },
9229 {
9230 /* MOD_0FAE_REG_3 */
9231 { "stmxcsr", { Md } },
9232 { "(bad)", { XX } },
9233 },
9234 {
9235 /* MOD_0FAE_REG_4 */
9236 { "xsave", { M } },
9237 { "(bad)", { XX } },
9238 },
9239 {
9240 /* MOD_0FAE_REG_5 */
9241 { "xrstor", { M } },
9242 { RM_TABLE (RM_0FAE_REG_5) },
9243 },
9244 {
9245 /* MOD_0FAE_REG_6 */
9246 { "xsaveopt", { M } },
9247 { RM_TABLE (RM_0FAE_REG_6) },
9248 },
9249 {
9250 /* MOD_0FAE_REG_7 */
9251 { "clflush", { Mb } },
9252 { RM_TABLE (RM_0FAE_REG_7) },
9253 },
9254 {
9255 /* MOD_0FB2 */
9256 { "lssS", { Gv, Mp } },
9257 { "(bad)", { XX } },
9258 },
9259 {
9260 /* MOD_0FB4 */
9261 { "lfsS", { Gv, Mp } },
9262 { "(bad)", { XX } },
9263 },
9264 {
9265 /* MOD_0FB5 */
9266 { "lgsS", { Gv, Mp } },
9267 { "(bad)", { XX } },
9268 },
9269 {
9270 /* MOD_0FC7_REG_6 */
9271 { PREFIX_TABLE (PREFIX_0FC7_REG_6) },
9272 { "(bad)", { XX } },
9273 },
9274 {
9275 /* MOD_0FC7_REG_7 */
9276 { "vmptrst", { Mq } },
9277 { "(bad)", { XX } },
9278 },
9279 {
9280 /* MOD_0FD7 */
9281 { "(bad)", { XX } },
9282 { "pmovmskb", { Gdq, MS } },
9283 },
9284 {
9285 /* MOD_0FE7_PREFIX_2 */
9286 { "movntdq", { Mx, XM } },
9287 { "(bad)", { XX } },
9288 },
9289 {
9290 /* MOD_0FF0_PREFIX_3 */
9291 { "lddqu", { XM, M } },
9292 { "(bad)", { XX } },
9293 },
9294 {
9295 /* MOD_0F382A_PREFIX_2 */
9296 { "movntdqa", { XM, Mx } },
9297 { "(bad)", { XX } },
9298 },
9299 {
9300 /* MOD_62_32BIT */
9301 { "bound{S|}", { Gv, Ma } },
9302 { "(bad)", { XX } },
9303 },
9304 {
9305 /* MOD_C4_32BIT */
9306 { "lesS", { Gv, Mp } },
9307 { VEX_C4_TABLE (VEX_0F) },
9308 },
9309 {
9310 /* MOD_C5_32BIT */
9311 { "ldsS", { Gv, Mp } },
9312 { VEX_C5_TABLE (VEX_0F) },
9313 },
9314 {
9315 /* MOD_VEX_12_PREFIX_0 */
9316 { VEX_LEN_TABLE (VEX_LEN_12_P_0_M_0) },
9317 { VEX_LEN_TABLE (VEX_LEN_12_P_0_M_1) },
9318 },
9319 {
9320 /* MOD_VEX_13 */
9321 { VEX_LEN_TABLE (VEX_LEN_13_M_0) },
9322 { "(bad)", { XX } },
9323 },
9324 {
9325 /* MOD_VEX_16_PREFIX_0 */
9326 { VEX_LEN_TABLE (VEX_LEN_16_P_0_M_0) },
9327 { VEX_LEN_TABLE (VEX_LEN_16_P_0_M_1) },
9328 },
9329 {
9330 /* MOD_VEX_17 */
9331 { VEX_LEN_TABLE (VEX_LEN_17_M_0) },
9332 { "(bad)", { XX } },
9333 },
9334 {
9335 /* MOD_VEX_2B */
9336 { VEX_LEN_TABLE (VEX_LEN_2B_M_0) },
9337 { "(bad)", { XX } },
9338 },
9339 {
9340 /* MOD_VEX_51 */
9341 { "(bad)", { XX } },
9342 { "vmovmskpX", { Gdq, XS } },
9343 },
9344 {
9345 /* MOD_VEX_71_REG_2 */
9346 { "(bad)", { XX } },
9347 { PREFIX_TABLE (PREFIX_VEX_71_REG_2) },
b844680a
L
9348 },
9349 {
c0f3af97 9350 /* MOD_VEX_71_REG_4 */
b844680a 9351 { "(bad)", { XX } },
c0f3af97 9352 { PREFIX_TABLE (PREFIX_VEX_71_REG_4) },
b844680a
L
9353 },
9354 {
c0f3af97 9355 /* MOD_VEX_71_REG_6 */
b844680a 9356 { "(bad)", { XX } },
c0f3af97 9357 { PREFIX_TABLE (PREFIX_VEX_71_REG_6) },
b844680a
L
9358 },
9359 {
c0f3af97 9360 /* MOD_VEX_72_REG_2 */
b844680a 9361 { "(bad)", { XX } },
c0f3af97 9362 { PREFIX_TABLE (PREFIX_VEX_72_REG_2) },
b844680a 9363 },
d8faab4e 9364 {
c0f3af97 9365 /* MOD_VEX_72_REG_4 */
d8faab4e 9366 { "(bad)", { XX } },
c0f3af97 9367 { PREFIX_TABLE (PREFIX_VEX_72_REG_4) },
d8faab4e
L
9368 },
9369 {
c0f3af97 9370 /* MOD_VEX_72_REG_6 */
d8faab4e 9371 { "(bad)", { XX } },
c0f3af97 9372 { PREFIX_TABLE (PREFIX_VEX_72_REG_6) },
d8faab4e 9373 },
876d4bfa 9374 {
c0f3af97 9375 /* MOD_VEX_73_REG_2 */
876d4bfa 9376 { "(bad)", { XX } },
c0f3af97 9377 { PREFIX_TABLE (PREFIX_VEX_73_REG_2) },
876d4bfa
L
9378 },
9379 {
c0f3af97 9380 /* MOD_VEX_73_REG_3 */
876d4bfa 9381 { "(bad)", { XX } },
c0f3af97 9382 { PREFIX_TABLE (PREFIX_VEX_73_REG_3) },
475a2301
L
9383 },
9384 {
c0f3af97
L
9385 /* MOD_VEX_73_REG_6 */
9386 { "(bad)", { XX } },
9387 { PREFIX_TABLE (PREFIX_VEX_73_REG_6) },
876d4bfa
L
9388 },
9389 {
c0f3af97 9390 /* MOD_VEX_73_REG_7 */
4e7d34a6 9391 { "(bad)", { XX } },
c0f3af97 9392 { PREFIX_TABLE (PREFIX_VEX_73_REG_7) },
876d4bfa
L
9393 },
9394 {
c0f3af97
L
9395 /* MOD_VEX_AE_REG_2 */
9396 { VEX_LEN_TABLE (VEX_LEN_AE_R_2_M_0) },
9397 { "(bad)", { XX } },
876d4bfa 9398 },
bbedc832 9399 {
c0f3af97
L
9400 /* MOD_VEX_AE_REG_3 */
9401 { VEX_LEN_TABLE (VEX_LEN_AE_R_3_M_0) },
4e7d34a6 9402 { "(bad)", { XX } },
bbedc832 9403 },
144c41d9 9404 {
c0f3af97 9405 /* MOD_VEX_D7_PREFIX_2 */
4e7d34a6 9406 { "(bad)", { XX } },
c0f3af97 9407 { VEX_LEN_TABLE (VEX_LEN_D7_P_2_M_1) },
144c41d9 9408 },
1afd85e3 9409 {
c0f3af97
L
9410 /* MOD_VEX_E7_PREFIX_2 */
9411 { VEX_LEN_TABLE (VEX_LEN_E7_P_2_M_0) },
92fddf8e 9412 { "(bad)", { XX } },
1afd85e3
L
9413 },
9414 {
c0f3af97
L
9415 /* MOD_VEX_F0_PREFIX_3 */
9416 { "vlddqu", { XM, M } },
92fddf8e
L
9417 { "(bad)", { XX } },
9418 },
9419 {
c0f3af97
L
9420 /* MOD_VEX_3818_PREFIX_2 */
9421 { "vbroadcastss", { XM, Md } },
92fddf8e 9422 { "(bad)", { XX } },
1afd85e3 9423 },
75c135a8 9424 {
c0f3af97
L
9425 /* MOD_VEX_3819_PREFIX_2 */
9426 { VEX_LEN_TABLE (VEX_LEN_3819_P_2_M_0) },
75c135a8 9427 { "(bad)", { XX } },
75c135a8
L
9428 },
9429 {
c0f3af97
L
9430 /* MOD_VEX_381A_PREFIX_2 */
9431 { VEX_LEN_TABLE (VEX_LEN_381A_P_2_M_0) },
75c135a8
L
9432 { "(bad)", { XX } },
9433 },
1afd85e3 9434 {
c0f3af97
L
9435 /* MOD_VEX_382A_PREFIX_2 */
9436 { VEX_LEN_TABLE (VEX_LEN_382A_P_2_M_0) },
1afd85e3 9437 { "(bad)", { XX } },
1afd85e3 9438 },
75c135a8 9439 {
c0f3af97
L
9440 /* MOD_VEX_382C_PREFIX_2 */
9441 { "vmaskmovps", { XM, Vex, Mx } },
75c135a8
L
9442 { "(bad)", { XX } },
9443 },
1afd85e3 9444 {
c0f3af97
L
9445 /* MOD_VEX_382D_PREFIX_2 */
9446 { "vmaskmovpd", { XM, Vex, Mx } },
1afd85e3 9447 { "(bad)", { XX } },
1afd85e3
L
9448 },
9449 {
c0f3af97
L
9450 /* MOD_VEX_382E_PREFIX_2 */
9451 { "vmaskmovps", { Mx, Vex, XM } },
4e7d34a6 9452 { "(bad)", { XX } },
1afd85e3
L
9453 },
9454 {
c0f3af97
L
9455 /* MOD_VEX_382F_PREFIX_2 */
9456 { "vmaskmovpd", { Mx, Vex, XM } },
1afd85e3 9457 { "(bad)", { XX } },
1afd85e3 9458 },
b844680a
L
9459};
9460
1ceb70f8 9461static const struct dis386 rm_table[][8] = {
b844680a 9462 {
1ceb70f8 9463 /* RM_0F01_REG_0 */
b844680a
L
9464 { "(bad)", { XX } },
9465 { "vmcall", { Skip_MODRM } },
9466 { "vmlaunch", { Skip_MODRM } },
9467 { "vmresume", { Skip_MODRM } },
9468 { "vmxoff", { Skip_MODRM } },
9469 { "(bad)", { XX } },
9470 { "(bad)", { XX } },
9471 { "(bad)", { XX } },
9472 },
9473 {
1ceb70f8 9474 /* RM_0F01_REG_1 */
b844680a
L
9475 { "monitor", { { OP_Monitor, 0 } } },
9476 { "mwait", { { OP_Mwait, 0 } } },
9477 { "(bad)", { XX } },
9478 { "(bad)", { XX } },
9479 { "(bad)", { XX } },
9480 { "(bad)", { XX } },
9481 { "(bad)", { XX } },
9482 { "(bad)", { XX } },
9483 },
475a2301
L
9484 {
9485 /* RM_0F01_REG_2 */
9486 { "xgetbv", { Skip_MODRM } },
9487 { "xsetbv", { Skip_MODRM } },
9488 { "(bad)", { XX } },
9489 { "(bad)", { XX } },
9490 { "(bad)", { XX } },
9491 { "(bad)", { XX } },
9492 { "(bad)", { XX } },
9493 { "(bad)", { XX } },
9494 },
b844680a 9495 {
1ceb70f8 9496 /* RM_0F01_REG_3 */
4e7d34a6
L
9497 { "vmrun", { Skip_MODRM } },
9498 { "vmmcall", { Skip_MODRM } },
9499 { "vmload", { Skip_MODRM } },
9500 { "vmsave", { Skip_MODRM } },
9501 { "stgi", { Skip_MODRM } },
9502 { "clgi", { Skip_MODRM } },
9503 { "skinit", { Skip_MODRM } },
9504 { "invlpga", { Skip_MODRM } },
9505 },
9506 {
1ceb70f8 9507 /* RM_0F01_REG_7 */
4e7d34a6
L
9508 { "swapgs", { Skip_MODRM } },
9509 { "rdtscp", { Skip_MODRM } },
b844680a
L
9510 { "(bad)", { XX } },
9511 { "(bad)", { XX } },
9512 { "(bad)", { XX } },
9513 { "(bad)", { XX } },
9514 { "(bad)", { XX } },
9515 { "(bad)", { XX } },
9516 },
9517 {
1ceb70f8 9518 /* RM_0FAE_REG_5 */
4e7d34a6 9519 { "lfence", { Skip_MODRM } },
b844680a
L
9520 { "(bad)", { XX } },
9521 { "(bad)", { XX } },
9522 { "(bad)", { XX } },
9523 { "(bad)", { XX } },
9524 { "(bad)", { XX } },
9525 { "(bad)", { XX } },
9526 { "(bad)", { XX } },
9527 },
9528 {
1ceb70f8 9529 /* RM_0FAE_REG_6 */
4e7d34a6 9530 { "mfence", { Skip_MODRM } },
b844680a
L
9531 { "(bad)", { XX } },
9532 { "(bad)", { XX } },
9533 { "(bad)", { XX } },
9534 { "(bad)", { XX } },
9535 { "(bad)", { XX } },
9536 { "(bad)", { XX } },
9537 { "(bad)", { XX } },
9538 },
bbedc832 9539 {
1ceb70f8 9540 /* RM_0FAE_REG_7 */
4e7d34a6
L
9541 { "sfence", { Skip_MODRM } },
9542 { "(bad)", { XX } },
bbedc832
L
9543 { "(bad)", { XX } },
9544 { "(bad)", { XX } },
9545 { "(bad)", { XX } },
9546 { "(bad)", { XX } },
9547 { "(bad)", { XX } },
9548 { "(bad)", { XX } },
144c41d9 9549 },
b844680a
L
9550};
9551
c608c12e
AM
9552#define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
9553
252b5132 9554static void
26ca5450 9555ckprefix (void)
252b5132 9556{
52b15da3
JH
9557 int newrex;
9558 rex = 0;
c0f3af97
L
9559 rex_original = 0;
9560 rex_ignored = 0;
252b5132 9561 prefixes = 0;
7d421014 9562 used_prefixes = 0;
52b15da3 9563 rex_used = 0;
252b5132
RH
9564 while (1)
9565 {
9566 FETCH_DATA (the_info, codep + 1);
52b15da3 9567 newrex = 0;
252b5132
RH
9568 switch (*codep)
9569 {
52b15da3
JH
9570 /* REX prefixes family. */
9571 case 0x40:
9572 case 0x41:
9573 case 0x42:
9574 case 0x43:
9575 case 0x44:
9576 case 0x45:
9577 case 0x46:
9578 case 0x47:
9579 case 0x48:
9580 case 0x49:
9581 case 0x4a:
9582 case 0x4b:
9583 case 0x4c:
9584 case 0x4d:
9585 case 0x4e:
9586 case 0x4f:
cb712a9e 9587 if (address_mode == mode_64bit)
52b15da3
JH
9588 newrex = *codep;
9589 else
9590 return;
9591 break;
252b5132
RH
9592 case 0xf3:
9593 prefixes |= PREFIX_REPZ;
9594 break;
9595 case 0xf2:
9596 prefixes |= PREFIX_REPNZ;
9597 break;
9598 case 0xf0:
9599 prefixes |= PREFIX_LOCK;
9600 break;
9601 case 0x2e:
9602 prefixes |= PREFIX_CS;
9603 break;
9604 case 0x36:
9605 prefixes |= PREFIX_SS;
9606 break;
9607 case 0x3e:
9608 prefixes |= PREFIX_DS;
9609 break;
9610 case 0x26:
9611 prefixes |= PREFIX_ES;
9612 break;
9613 case 0x64:
9614 prefixes |= PREFIX_FS;
9615 break;
9616 case 0x65:
9617 prefixes |= PREFIX_GS;
9618 break;
9619 case 0x66:
9620 prefixes |= PREFIX_DATA;
9621 break;
9622 case 0x67:
9623 prefixes |= PREFIX_ADDR;
9624 break;
5076851f 9625 case FWAIT_OPCODE:
252b5132
RH
9626 /* fwait is really an instruction. If there are prefixes
9627 before the fwait, they belong to the fwait, *not* to the
9628 following instruction. */
3e7d61b2 9629 if (prefixes || rex)
252b5132
RH
9630 {
9631 prefixes |= PREFIX_FWAIT;
9632 codep++;
9633 return;
9634 }
9635 prefixes = PREFIX_FWAIT;
9636 break;
9637 default:
9638 return;
9639 }
52b15da3
JH
9640 /* Rex is ignored when followed by another prefix. */
9641 if (rex)
9642 {
3e7d61b2
AM
9643 rex_used = rex;
9644 return;
52b15da3
JH
9645 }
9646 rex = newrex;
c0f3af97 9647 rex_original = rex;
252b5132
RH
9648 codep++;
9649 }
9650}
9651
7d421014
ILT
9652/* Return the name of the prefix byte PREF, or NULL if PREF is not a
9653 prefix byte. */
9654
9655static const char *
26ca5450 9656prefix_name (int pref, int sizeflag)
7d421014 9657{
0003779b
L
9658 static const char *rexes [16] =
9659 {
9660 "rex", /* 0x40 */
9661 "rex.B", /* 0x41 */
9662 "rex.X", /* 0x42 */
9663 "rex.XB", /* 0x43 */
9664 "rex.R", /* 0x44 */
9665 "rex.RB", /* 0x45 */
9666 "rex.RX", /* 0x46 */
9667 "rex.RXB", /* 0x47 */
9668 "rex.W", /* 0x48 */
9669 "rex.WB", /* 0x49 */
9670 "rex.WX", /* 0x4a */
9671 "rex.WXB", /* 0x4b */
9672 "rex.WR", /* 0x4c */
9673 "rex.WRB", /* 0x4d */
9674 "rex.WRX", /* 0x4e */
9675 "rex.WRXB", /* 0x4f */
9676 };
9677
7d421014
ILT
9678 switch (pref)
9679 {
52b15da3
JH
9680 /* REX prefixes family. */
9681 case 0x40:
52b15da3 9682 case 0x41:
52b15da3 9683 case 0x42:
52b15da3 9684 case 0x43:
52b15da3 9685 case 0x44:
52b15da3 9686 case 0x45:
52b15da3 9687 case 0x46:
52b15da3 9688 case 0x47:
52b15da3 9689 case 0x48:
52b15da3 9690 case 0x49:
52b15da3 9691 case 0x4a:
52b15da3 9692 case 0x4b:
52b15da3 9693 case 0x4c:
52b15da3 9694 case 0x4d:
52b15da3 9695 case 0x4e:
52b15da3 9696 case 0x4f:
0003779b 9697 return rexes [pref - 0x40];
7d421014
ILT
9698 case 0xf3:
9699 return "repz";
9700 case 0xf2:
9701 return "repnz";
9702 case 0xf0:
9703 return "lock";
9704 case 0x2e:
9705 return "cs";
9706 case 0x36:
9707 return "ss";
9708 case 0x3e:
9709 return "ds";
9710 case 0x26:
9711 return "es";
9712 case 0x64:
9713 return "fs";
9714 case 0x65:
9715 return "gs";
9716 case 0x66:
9717 return (sizeflag & DFLAG) ? "data16" : "data32";
9718 case 0x67:
cb712a9e 9719 if (address_mode == mode_64bit)
db6eb5be 9720 return (sizeflag & AFLAG) ? "addr32" : "addr64";
c1a64871 9721 else
2888cb7a 9722 return (sizeflag & AFLAG) ? "addr16" : "addr32";
7d421014
ILT
9723 case FWAIT_OPCODE:
9724 return "fwait";
9725 default:
9726 return NULL;
9727 }
9728}
9729
ce518a5f
L
9730static char op_out[MAX_OPERANDS][100];
9731static int op_ad, op_index[MAX_OPERANDS];
1d9f512f 9732static int two_source_ops;
ce518a5f
L
9733static bfd_vma op_address[MAX_OPERANDS];
9734static bfd_vma op_riprel[MAX_OPERANDS];
52b15da3 9735static bfd_vma start_pc;
ce518a5f 9736
252b5132
RH
9737/*
9738 * On the 386's of 1988, the maximum length of an instruction is 15 bytes.
9739 * (see topic "Redundant prefixes" in the "Differences from 8086"
9740 * section of the "Virtual 8086 Mode" chapter.)
9741 * 'pc' should be the address of this instruction, it will
9742 * be used to print the target address if this is a relative jump or call
9743 * The function returns the length of this instruction in bytes.
9744 */
9745
252b5132 9746static char intel_syntax;
9d141669 9747static char intel_mnemonic = !SYSV386_COMPAT;
252b5132
RH
9748static char open_char;
9749static char close_char;
9750static char separator_char;
9751static char scale_char;
9752
e396998b
AM
9753/* Here for backwards compatibility. When gdb stops using
9754 print_insn_i386_att and print_insn_i386_intel these functions can
9755 disappear, and print_insn_i386 be merged into print_insn. */
252b5132 9756int
26ca5450 9757print_insn_i386_att (bfd_vma pc, disassemble_info *info)
252b5132
RH
9758{
9759 intel_syntax = 0;
e396998b
AM
9760
9761 return print_insn (pc, info);
252b5132
RH
9762}
9763
9764int
26ca5450 9765print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
252b5132
RH
9766{
9767 intel_syntax = 1;
e396998b
AM
9768
9769 return print_insn (pc, info);
252b5132
RH
9770}
9771
e396998b 9772int
26ca5450 9773print_insn_i386 (bfd_vma pc, disassemble_info *info)
e396998b
AM
9774{
9775 intel_syntax = -1;
9776
9777 return print_insn (pc, info);
9778}
9779
f59a29b9
L
9780void
9781print_i386_disassembler_options (FILE *stream)
9782{
9783 fprintf (stream, _("\n\
9784The following i386/x86-64 specific disassembler options are supported for use\n\
9785with the -M switch (multiple options should be separated by commas):\n"));
9786
9787 fprintf (stream, _(" x86-64 Disassemble in 64bit mode\n"));
9788 fprintf (stream, _(" i386 Disassemble in 32bit mode\n"));
9789 fprintf (stream, _(" i8086 Disassemble in 16bit mode\n"));
9790 fprintf (stream, _(" att Display instruction in AT&T syntax\n"));
9791 fprintf (stream, _(" intel Display instruction in Intel syntax\n"));
9d141669
L
9792 fprintf (stream, _(" att-mnemonic\n"
9793 " Display instruction in AT&T mnemonic\n"));
9794 fprintf (stream, _(" intel-mnemonic\n"
9795 " Display instruction in Intel mnemonic\n"));
f59a29b9
L
9796 fprintf (stream, _(" addr64 Assume 64bit address size\n"));
9797 fprintf (stream, _(" addr32 Assume 32bit address size\n"));
9798 fprintf (stream, _(" addr16 Assume 16bit address size\n"));
9799 fprintf (stream, _(" data32 Assume 32bit data size\n"));
9800 fprintf (stream, _(" data16 Assume 16bit data size\n"));
9801 fprintf (stream, _(" suffix Always display instruction suffix in AT&T syntax\n"));
9802}
9803
b844680a
L
9804/* Get a pointer to struct dis386 with a valid name. */
9805
9806static const struct dis386 *
8bb15339 9807get_valid_dis386 (const struct dis386 *dp, disassemble_info *info)
b844680a 9808{
c0f3af97 9809 int index, vex_table_index;
b844680a
L
9810
9811 if (dp->name != NULL)
9812 return dp;
9813
9814 switch (dp->op[0].bytemode)
9815 {
1ceb70f8
L
9816 case USE_REG_TABLE:
9817 dp = &reg_table[dp->op[1].bytemode][modrm.reg];
9818 break;
9819
9820 case USE_MOD_TABLE:
9821 index = modrm.mod == 0x3 ? 1 : 0;
9822 dp = &mod_table[dp->op[1].bytemode][index];
9823 break;
9824
9825 case USE_RM_TABLE:
9826 dp = &rm_table[dp->op[1].bytemode][modrm.rm];
b844680a
L
9827 break;
9828
4e7d34a6 9829 case USE_PREFIX_TABLE:
c0f3af97 9830 if (need_vex)
b844680a 9831 {
c0f3af97
L
9832 /* The prefix in VEX is implicit. */
9833 switch (vex.prefix)
9834 {
9835 case 0:
9836 index = 0;
9837 break;
9838 case REPE_PREFIX_OPCODE:
9839 index = 1;
9840 break;
9841 case DATA_PREFIX_OPCODE:
9842 index = 2;
9843 break;
9844 case REPNE_PREFIX_OPCODE:
9845 index = 3;
9846 break;
9847 default:
9848 abort ();
9849 break;
9850 }
b844680a 9851 }
c0f3af97 9852 else
b844680a 9853 {
c0f3af97
L
9854 index = 0;
9855 used_prefixes |= (prefixes & PREFIX_REPZ);
9856 if (prefixes & PREFIX_REPZ)
b844680a 9857 {
c0f3af97
L
9858 index = 1;
9859 repz_prefix = NULL;
b844680a
L
9860 }
9861 else
9862 {
c0f3af97
L
9863 /* We should check PREFIX_REPNZ and PREFIX_REPZ before
9864 PREFIX_DATA. */
9865 used_prefixes |= (prefixes & PREFIX_REPNZ);
9866 if (prefixes & PREFIX_REPNZ)
9867 {
9868 index = 3;
9869 repnz_prefix = NULL;
9870 }
9871 else
b844680a 9872 {
c0f3af97
L
9873 used_prefixes |= (prefixes & PREFIX_DATA);
9874 if (prefixes & PREFIX_DATA)
9875 {
9876 index = 2;
9877 data_prefix = NULL;
9878 }
b844680a
L
9879 }
9880 }
9881 }
1ceb70f8 9882 dp = &prefix_table[dp->op[1].bytemode][index];
b844680a
L
9883 break;
9884
4e7d34a6 9885 case USE_X86_64_TABLE:
b844680a
L
9886 index = address_mode == mode_64bit ? 1 : 0;
9887 dp = &x86_64_table[dp->op[1].bytemode][index];
9888 break;
9889
4e7d34a6 9890 case USE_3BYTE_TABLE:
8bb15339
L
9891 FETCH_DATA (info, codep + 2);
9892 index = *codep++;
9893 dp = &three_byte_table[dp->op[1].bytemode][index];
9894 modrm.mod = (*codep >> 6) & 3;
9895 modrm.reg = (*codep >> 3) & 7;
9896 modrm.rm = *codep & 7;
9897 break;
9898
c0f3af97
L
9899 case USE_VEX_LEN_TABLE:
9900 if (!need_vex)
9901 abort ();
9902
9903 switch (vex.length)
9904 {
9905 case 128:
9906 index = 0;
9907 break;
9908 case 256:
9909 index = 1;
9910 break;
9911 default:
9912 abort ();
9913 break;
9914 }
9915
9916 dp = &vex_len_table[dp->op[1].bytemode][index];
9917 break;
9918
9919 case USE_VEX_C4_TABLE:
9920 FETCH_DATA (info, codep + 3);
9921 /* All bits in the REX prefix are ignored. */
9922 rex_ignored = rex;
9923 rex = ~(*codep >> 5) & 0x7;
9924 switch ((*codep & 0x1f))
9925 {
9926 default:
9927 BadOp ();
9928 case 0x1:
9929 vex_table_index = 0;
9930 break;
9931 case 0x2:
9932 vex_table_index = 1;
9933 break;
9934 case 0x3:
9935 vex_table_index = 2;
9936 break;
9937 }
9938 codep++;
9939 vex.w = *codep & 0x80;
9940 if (vex.w && address_mode == mode_64bit)
9941 rex |= REX_W;
9942
9943 vex.register_specifier = (~(*codep >> 3)) & 0xf;
9944 if (address_mode != mode_64bit
9945 && vex.register_specifier > 0x7)
9946 BadOp ();
9947
9948 vex.length = (*codep & 0x4) ? 256 : 128;
9949 switch ((*codep & 0x3))
9950 {
9951 case 0:
9952 vex.prefix = 0;
9953 break;
9954 case 1:
9955 vex.prefix = DATA_PREFIX_OPCODE;
9956 break;
9957 case 2:
9958 vex.prefix = REPE_PREFIX_OPCODE;
9959 break;
9960 case 3:
9961 vex.prefix = REPNE_PREFIX_OPCODE;
9962 break;
9963 }
9964 need_vex = 1;
9965 need_vex_reg = 1;
9966 codep++;
9967 index = *codep++;
9968 dp = &vex_table[vex_table_index][index];
9969 /* There is no MODRM byte for VEX [82|77]. */
9970 if (index != 0x77 && index != 0x82)
9971 {
9972 FETCH_DATA (info, codep + 1);
9973 modrm.mod = (*codep >> 6) & 3;
9974 modrm.reg = (*codep >> 3) & 7;
9975 modrm.rm = *codep & 7;
9976 }
9977 break;
9978
9979 case USE_VEX_C5_TABLE:
9980 FETCH_DATA (info, codep + 2);
9981 /* All bits in the REX prefix are ignored. */
9982 rex_ignored = rex;
9983 rex = (*codep & 0x80) ? 0 : REX_R;
9984
9985 vex.register_specifier = (~(*codep >> 3)) & 0xf;
9986 if (address_mode != mode_64bit
9987 && vex.register_specifier > 0x7)
9988 BadOp ();
9989
9990 vex.length = (*codep & 0x4) ? 256 : 128;
9991 switch ((*codep & 0x3))
9992 {
9993 case 0:
9994 vex.prefix = 0;
9995 break;
9996 case 1:
9997 vex.prefix = DATA_PREFIX_OPCODE;
9998 break;
9999 case 2:
10000 vex.prefix = REPE_PREFIX_OPCODE;
10001 break;
10002 case 3:
10003 vex.prefix = REPNE_PREFIX_OPCODE;
10004 break;
10005 }
10006 need_vex = 1;
10007 need_vex_reg = 1;
10008 codep++;
10009 index = *codep++;
10010 dp = &vex_table[dp->op[1].bytemode][index];
10011 /* There is no MODRM byte for VEX [82|77]. */
10012 if (index != 0x77 && index != 0x82)
10013 {
10014 FETCH_DATA (info, codep + 1);
10015 modrm.mod = (*codep >> 6) & 3;
10016 modrm.reg = (*codep >> 3) & 7;
10017 modrm.rm = *codep & 7;
10018 }
10019 break;
10020
b844680a
L
10021 default:
10022 oappend (INTERNAL_DISASSEMBLER_ERROR);
10023 return NULL;
10024 }
10025
10026 if (dp->name != NULL)
10027 return dp;
10028 else
8bb15339 10029 return get_valid_dis386 (dp, info);
b844680a
L
10030}
10031
e396998b 10032static int
26ca5450 10033print_insn (bfd_vma pc, disassemble_info *info)
252b5132 10034{
2da11e11 10035 const struct dis386 *dp;
252b5132 10036 int i;
ce518a5f 10037 char *op_txt[MAX_OPERANDS];
252b5132 10038 int needcomma;
e396998b
AM
10039 int sizeflag;
10040 const char *p;
252b5132 10041 struct dis_private priv;
eec0f4ca 10042 unsigned char op;
b844680a
L
10043 char prefix_obuf[32];
10044 char *prefix_obufp;
252b5132 10045
cb712a9e
L
10046 if (info->mach == bfd_mach_x86_64_intel_syntax
10047 || info->mach == bfd_mach_x86_64)
10048 address_mode = mode_64bit;
10049 else
10050 address_mode = mode_32bit;
52b15da3 10051
8373f971 10052 if (intel_syntax == (char) -1)
e396998b
AM
10053 intel_syntax = (info->mach == bfd_mach_i386_i386_intel_syntax
10054 || info->mach == bfd_mach_x86_64_intel_syntax);
10055
2da11e11 10056 if (info->mach == bfd_mach_i386_i386
52b15da3
JH
10057 || info->mach == bfd_mach_x86_64
10058 || info->mach == bfd_mach_i386_i386_intel_syntax
10059 || info->mach == bfd_mach_x86_64_intel_syntax)
e396998b 10060 priv.orig_sizeflag = AFLAG | DFLAG;
2da11e11 10061 else if (info->mach == bfd_mach_i386_i8086)
e396998b 10062 priv.orig_sizeflag = 0;
2da11e11
AM
10063 else
10064 abort ();
e396998b
AM
10065
10066 for (p = info->disassembler_options; p != NULL; )
10067 {
0112cd26 10068 if (CONST_STRNEQ (p, "x86-64"))
e396998b 10069 {
cb712a9e 10070 address_mode = mode_64bit;
e396998b
AM
10071 priv.orig_sizeflag = AFLAG | DFLAG;
10072 }
0112cd26 10073 else if (CONST_STRNEQ (p, "i386"))
e396998b 10074 {
cb712a9e 10075 address_mode = mode_32bit;
e396998b
AM
10076 priv.orig_sizeflag = AFLAG | DFLAG;
10077 }
0112cd26 10078 else if (CONST_STRNEQ (p, "i8086"))
e396998b 10079 {
cb712a9e 10080 address_mode = mode_16bit;
e396998b
AM
10081 priv.orig_sizeflag = 0;
10082 }
0112cd26 10083 else if (CONST_STRNEQ (p, "intel"))
e396998b
AM
10084 {
10085 intel_syntax = 1;
9d141669
L
10086 if (CONST_STRNEQ (p + 5, "-mnemonic"))
10087 intel_mnemonic = 1;
e396998b 10088 }
0112cd26 10089 else if (CONST_STRNEQ (p, "att"))
e396998b
AM
10090 {
10091 intel_syntax = 0;
9d141669
L
10092 if (CONST_STRNEQ (p + 3, "-mnemonic"))
10093 intel_mnemonic = 0;
e396998b 10094 }
0112cd26 10095 else if (CONST_STRNEQ (p, "addr"))
e396998b 10096 {
f59a29b9
L
10097 if (address_mode == mode_64bit)
10098 {
10099 if (p[4] == '3' && p[5] == '2')
10100 priv.orig_sizeflag &= ~AFLAG;
10101 else if (p[4] == '6' && p[5] == '4')
10102 priv.orig_sizeflag |= AFLAG;
10103 }
10104 else
10105 {
10106 if (p[4] == '1' && p[5] == '6')
10107 priv.orig_sizeflag &= ~AFLAG;
10108 else if (p[4] == '3' && p[5] == '2')
10109 priv.orig_sizeflag |= AFLAG;
10110 }
e396998b 10111 }
0112cd26 10112 else if (CONST_STRNEQ (p, "data"))
e396998b
AM
10113 {
10114 if (p[4] == '1' && p[5] == '6')
10115 priv.orig_sizeflag &= ~DFLAG;
10116 else if (p[4] == '3' && p[5] == '2')
10117 priv.orig_sizeflag |= DFLAG;
10118 }
0112cd26 10119 else if (CONST_STRNEQ (p, "suffix"))
e396998b
AM
10120 priv.orig_sizeflag |= SUFFIX_ALWAYS;
10121
10122 p = strchr (p, ',');
10123 if (p != NULL)
10124 p++;
10125 }
10126
10127 if (intel_syntax)
10128 {
10129 names64 = intel_names64;
10130 names32 = intel_names32;
10131 names16 = intel_names16;
10132 names8 = intel_names8;
10133 names8rex = intel_names8rex;
10134 names_seg = intel_names_seg;
db51cc60
L
10135 index64 = intel_index64;
10136 index32 = intel_index32;
e396998b
AM
10137 index16 = intel_index16;
10138 open_char = '[';
10139 close_char = ']';
10140 separator_char = '+';
10141 scale_char = '*';
10142 }
10143 else
10144 {
10145 names64 = att_names64;
10146 names32 = att_names32;
10147 names16 = att_names16;
10148 names8 = att_names8;
10149 names8rex = att_names8rex;
10150 names_seg = att_names_seg;
db51cc60
L
10151 index64 = att_index64;
10152 index32 = att_index32;
e396998b
AM
10153 index16 = att_index16;
10154 open_char = '(';
10155 close_char = ')';
10156 separator_char = ',';
10157 scale_char = ',';
10158 }
2da11e11 10159
4fe53c98 10160 /* The output looks better if we put 7 bytes on a line, since that
c608c12e 10161 puts most long word instructions on a single line. */
4fe53c98 10162 info->bytes_per_line = 7;
252b5132 10163
26ca5450 10164 info->private_data = &priv;
252b5132
RH
10165 priv.max_fetched = priv.the_buffer;
10166 priv.insn_start = pc;
252b5132
RH
10167
10168 obuf[0] = 0;
ce518a5f
L
10169 for (i = 0; i < MAX_OPERANDS; ++i)
10170 {
10171 op_out[i][0] = 0;
10172 op_index[i] = -1;
10173 }
252b5132
RH
10174
10175 the_info = info;
10176 start_pc = pc;
e396998b
AM
10177 start_codep = priv.the_buffer;
10178 codep = priv.the_buffer;
252b5132 10179
5076851f
ILT
10180 if (setjmp (priv.bailout) != 0)
10181 {
7d421014
ILT
10182 const char *name;
10183
5076851f 10184 /* Getting here means we tried for data but didn't get it. That
e396998b
AM
10185 means we have an incomplete instruction of some sort. Just
10186 print the first byte as a prefix or a .byte pseudo-op. */
10187 if (codep > priv.the_buffer)
5076851f 10188 {
e396998b 10189 name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
7d421014
ILT
10190 if (name != NULL)
10191 (*info->fprintf_func) (info->stream, "%s", name);
10192 else
5076851f 10193 {
7d421014
ILT
10194 /* Just print the first byte as a .byte instruction. */
10195 (*info->fprintf_func) (info->stream, ".byte 0x%x",
e396998b 10196 (unsigned int) priv.the_buffer[0]);
5076851f 10197 }
5076851f 10198
7d421014 10199 return 1;
5076851f
ILT
10200 }
10201
10202 return -1;
10203 }
10204
52b15da3 10205 obufp = obuf;
252b5132
RH
10206 ckprefix ();
10207
10208 insn_codep = codep;
e396998b 10209 sizeflag = priv.orig_sizeflag;
252b5132
RH
10210
10211 FETCH_DATA (info, codep + 1);
10212 two_source_ops = (*codep == 0x62) || (*codep == 0xc8);
10213
3e7d61b2
AM
10214 if (((prefixes & PREFIX_FWAIT)
10215 && ((*codep < 0xd8) || (*codep > 0xdf)))
10216 || (rex && rex_used))
252b5132 10217 {
7d421014
ILT
10218 const char *name;
10219
3e7d61b2
AM
10220 /* fwait not followed by floating point instruction, or rex followed
10221 by other prefixes. Print the first prefix. */
e396998b 10222 name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
7d421014
ILT
10223 if (name == NULL)
10224 name = INTERNAL_DISASSEMBLER_ERROR;
10225 (*info->fprintf_func) (info->stream, "%s", name);
10226 return 1;
252b5132
RH
10227 }
10228
eec0f4ca 10229 op = 0;
252b5132
RH
10230 if (*codep == 0x0f)
10231 {
eec0f4ca 10232 unsigned char threebyte;
252b5132 10233 FETCH_DATA (info, codep + 2);
eec0f4ca
L
10234 threebyte = *++codep;
10235 dp = &dis386_twobyte[threebyte];
252b5132 10236 need_modrm = twobyte_has_modrm[*codep];
eec0f4ca 10237 codep++;
252b5132
RH
10238 }
10239 else
10240 {
6439fc28 10241 dp = &dis386[*codep];
252b5132 10242 need_modrm = onebyte_has_modrm[*codep];
eec0f4ca 10243 codep++;
252b5132 10244 }
246c51aa 10245
b844680a 10246 if ((prefixes & PREFIX_REPZ))
7d421014 10247 {
b844680a 10248 repz_prefix = "repz ";
7d421014
ILT
10249 used_prefixes |= PREFIX_REPZ;
10250 }
b844680a
L
10251 else
10252 repz_prefix = NULL;
10253
10254 if ((prefixes & PREFIX_REPNZ))
7d421014 10255 {
b844680a 10256 repnz_prefix = "repnz ";
7d421014
ILT
10257 used_prefixes |= PREFIX_REPNZ;
10258 }
b844680a
L
10259 else
10260 repnz_prefix = NULL;
050dfa73 10261
b844680a 10262 if ((prefixes & PREFIX_LOCK))
7d421014 10263 {
b844680a 10264 lock_prefix = "lock ";
7d421014
ILT
10265 used_prefixes |= PREFIX_LOCK;
10266 }
b844680a
L
10267 else
10268 lock_prefix = NULL;
c608c12e 10269
b844680a 10270 addr_prefix = NULL;
c608c12e
AM
10271 if (prefixes & PREFIX_ADDR)
10272 {
10273 sizeflag ^= AFLAG;
ce518a5f 10274 if (dp->op[2].bytemode != loop_jcxz_mode || intel_syntax)
3ffd33cf 10275 {
cb712a9e 10276 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
b844680a 10277 addr_prefix = "addr32 ";
3ffd33cf 10278 else
b844680a 10279 addr_prefix = "addr16 ";
3ffd33cf
AM
10280 used_prefixes |= PREFIX_ADDR;
10281 }
10282 }
10283
b844680a
L
10284 data_prefix = NULL;
10285 if ((prefixes & PREFIX_DATA))
3ffd33cf
AM
10286 {
10287 sizeflag ^= DFLAG;
ce518a5f
L
10288 if (dp->op[2].bytemode == cond_jump_mode
10289 && dp->op[0].bytemode == v_mode
6439fc28 10290 && !intel_syntax)
3ffd33cf
AM
10291 {
10292 if (sizeflag & DFLAG)
b844680a 10293 data_prefix = "data32 ";
3ffd33cf 10294 else
b844680a 10295 data_prefix = "data16 ";
3ffd33cf
AM
10296 used_prefixes |= PREFIX_DATA;
10297 }
10298 }
10299
8bb15339 10300 if (need_modrm)
252b5132
RH
10301 {
10302 FETCH_DATA (info, codep + 1);
7967e09e
L
10303 modrm.mod = (*codep >> 6) & 3;
10304 modrm.reg = (*codep >> 3) & 7;
10305 modrm.rm = *codep & 7;
252b5132
RH
10306 }
10307
ce518a5f 10308 if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
252b5132
RH
10309 {
10310 dofloat (sizeflag);
10311 }
10312 else
10313 {
c0f3af97
L
10314 need_vex = 0;
10315 need_vex_reg = 0;
dae39acc 10316 vex_w_done = 0;
8bb15339 10317 dp = get_valid_dis386 (dp, info);
b844680a 10318 if (dp != NULL && putop (dp->name, sizeflag) == 0)
ce518a5f
L
10319 {
10320 for (i = 0; i < MAX_OPERANDS; ++i)
10321 {
246c51aa 10322 obufp = op_out[i];
ce518a5f
L
10323 op_ad = MAX_OPERANDS - 1 - i;
10324 if (dp->op[i].rtn)
10325 (*dp->op[i].rtn) (dp->op[i].bytemode, sizeflag);
10326 }
6439fc28 10327 }
252b5132
RH
10328 }
10329
7d421014
ILT
10330 /* See if any prefixes were not used. If so, print the first one
10331 separately. If we don't do this, we'll wind up printing an
10332 instruction stream which does not precisely correspond to the
10333 bytes we are disassembling. */
10334 if ((prefixes & ~used_prefixes) != 0)
10335 {
10336 const char *name;
10337
e396998b 10338 name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
7d421014
ILT
10339 if (name == NULL)
10340 name = INTERNAL_DISASSEMBLER_ERROR;
10341 (*info->fprintf_func) (info->stream, "%s", name);
10342 return 1;
10343 }
c0f3af97 10344 if ((rex_original & ~rex_used) || rex_ignored)
52b15da3
JH
10345 {
10346 const char *name;
c0f3af97 10347 name = prefix_name (rex_original, priv.orig_sizeflag);
52b15da3
JH
10348 if (name == NULL)
10349 name = INTERNAL_DISASSEMBLER_ERROR;
10350 (*info->fprintf_func) (info->stream, "%s ", name);
10351 }
7d421014 10352
b844680a
L
10353 prefix_obuf[0] = 0;
10354 prefix_obufp = prefix_obuf;
10355 if (lock_prefix)
10356 prefix_obufp = stpcpy (prefix_obufp, lock_prefix);
10357 if (repz_prefix)
10358 prefix_obufp = stpcpy (prefix_obufp, repz_prefix);
10359 if (repnz_prefix)
10360 prefix_obufp = stpcpy (prefix_obufp, repnz_prefix);
10361 if (addr_prefix)
10362 prefix_obufp = stpcpy (prefix_obufp, addr_prefix);
10363 if (data_prefix)
10364 prefix_obufp = stpcpy (prefix_obufp, data_prefix);
10365
10366 if (prefix_obuf[0] != 0)
10367 (*info->fprintf_func) (info->stream, "%s", prefix_obuf);
10368
ea397f5b 10369 obufp = mnemonicendp;
b844680a 10370 for (i = strlen (obuf) + strlen (prefix_obuf); i < 6; i++)
252b5132
RH
10371 oappend (" ");
10372 oappend (" ");
10373 (*info->fprintf_func) (info->stream, "%s", obuf);
10374
10375 /* The enter and bound instructions are printed with operands in the same
10376 order as the intel book; everything else is printed in reverse order. */
2da11e11 10377 if (intel_syntax || two_source_ops)
252b5132 10378 {
185b1163
L
10379 bfd_vma riprel;
10380
ce518a5f
L
10381 for (i = 0; i < MAX_OPERANDS; ++i)
10382 op_txt[i] = op_out[i];
246c51aa 10383
ce518a5f
L
10384 for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
10385 {
10386 op_ad = op_index[i];
10387 op_index[i] = op_index[MAX_OPERANDS - 1 - i];
10388 op_index[MAX_OPERANDS - 1 - i] = op_ad;
185b1163
L
10389 riprel = op_riprel[i];
10390 op_riprel[i] = op_riprel [MAX_OPERANDS - 1 - i];
10391 op_riprel[MAX_OPERANDS - 1 - i] = riprel;
ce518a5f 10392 }
252b5132
RH
10393 }
10394 else
10395 {
ce518a5f
L
10396 for (i = 0; i < MAX_OPERANDS; ++i)
10397 op_txt[MAX_OPERANDS - 1 - i] = op_out[i];
050dfa73
MM
10398 }
10399
ce518a5f
L
10400 needcomma = 0;
10401 for (i = 0; i < MAX_OPERANDS; ++i)
10402 if (*op_txt[i])
10403 {
10404 if (needcomma)
10405 (*info->fprintf_func) (info->stream, ",");
10406 if (op_index[i] != -1 && !op_riprel[i])
10407 (*info->print_address_func) ((bfd_vma) op_address[op_index[i]], info);
10408 else
10409 (*info->fprintf_func) (info->stream, "%s", op_txt[i]);
10410 needcomma = 1;
10411 }
050dfa73 10412
ce518a5f 10413 for (i = 0; i < MAX_OPERANDS; i++)
52b15da3
JH
10414 if (op_index[i] != -1 && op_riprel[i])
10415 {
10416 (*info->fprintf_func) (info->stream, " # ");
10417 (*info->print_address_func) ((bfd_vma) (start_pc + codep - start_codep
10418 + op_address[op_index[i]]), info);
185b1163 10419 break;
52b15da3 10420 }
e396998b 10421 return codep - priv.the_buffer;
252b5132
RH
10422}
10423
6439fc28 10424static const char *float_mem[] = {
252b5132 10425 /* d8 */
7c52e0e8
L
10426 "fadd{s|}",
10427 "fmul{s|}",
10428 "fcom{s|}",
10429 "fcomp{s|}",
10430 "fsub{s|}",
10431 "fsubr{s|}",
10432 "fdiv{s|}",
10433 "fdivr{s|}",
db6eb5be 10434 /* d9 */
7c52e0e8 10435 "fld{s|}",
252b5132 10436 "(bad)",
7c52e0e8
L
10437 "fst{s|}",
10438 "fstp{s|}",
9306ca4a 10439 "fldenvIC",
252b5132 10440 "fldcw",
9306ca4a 10441 "fNstenvIC",
252b5132
RH
10442 "fNstcw",
10443 /* da */
7c52e0e8
L
10444 "fiadd{l|}",
10445 "fimul{l|}",
10446 "ficom{l|}",
10447 "ficomp{l|}",
10448 "fisub{l|}",
10449 "fisubr{l|}",
10450 "fidiv{l|}",
10451 "fidivr{l|}",
252b5132 10452 /* db */
7c52e0e8
L
10453 "fild{l|}",
10454 "fisttp{l|}",
10455 "fist{l|}",
10456 "fistp{l|}",
252b5132 10457 "(bad)",
6439fc28 10458 "fld{t||t|}",
252b5132 10459 "(bad)",
6439fc28 10460 "fstp{t||t|}",
252b5132 10461 /* dc */
7c52e0e8
L
10462 "fadd{l|}",
10463 "fmul{l|}",
10464 "fcom{l|}",
10465 "fcomp{l|}",
10466 "fsub{l|}",
10467 "fsubr{l|}",
10468 "fdiv{l|}",
10469 "fdivr{l|}",
252b5132 10470 /* dd */
7c52e0e8
L
10471 "fld{l|}",
10472 "fisttp{ll|}",
10473 "fst{l||}",
10474 "fstp{l|}",
9306ca4a 10475 "frstorIC",
252b5132 10476 "(bad)",
9306ca4a 10477 "fNsaveIC",
252b5132
RH
10478 "fNstsw",
10479 /* de */
10480 "fiadd",
10481 "fimul",
10482 "ficom",
10483 "ficomp",
10484 "fisub",
10485 "fisubr",
10486 "fidiv",
10487 "fidivr",
10488 /* df */
10489 "fild",
ca164297 10490 "fisttp",
252b5132
RH
10491 "fist",
10492 "fistp",
10493 "fbld",
7c52e0e8 10494 "fild{ll|}",
252b5132 10495 "fbstp",
7c52e0e8 10496 "fistp{ll|}",
1d9f512f
AM
10497};
10498
10499static const unsigned char float_mem_mode[] = {
10500 /* d8 */
10501 d_mode,
10502 d_mode,
10503 d_mode,
10504 d_mode,
10505 d_mode,
10506 d_mode,
10507 d_mode,
10508 d_mode,
10509 /* d9 */
10510 d_mode,
10511 0,
10512 d_mode,
10513 d_mode,
10514 0,
10515 w_mode,
10516 0,
10517 w_mode,
10518 /* da */
10519 d_mode,
10520 d_mode,
10521 d_mode,
10522 d_mode,
10523 d_mode,
10524 d_mode,
10525 d_mode,
10526 d_mode,
10527 /* db */
10528 d_mode,
10529 d_mode,
10530 d_mode,
10531 d_mode,
10532 0,
9306ca4a 10533 t_mode,
1d9f512f 10534 0,
9306ca4a 10535 t_mode,
1d9f512f
AM
10536 /* dc */
10537 q_mode,
10538 q_mode,
10539 q_mode,
10540 q_mode,
10541 q_mode,
10542 q_mode,
10543 q_mode,
10544 q_mode,
10545 /* dd */
10546 q_mode,
10547 q_mode,
10548 q_mode,
10549 q_mode,
10550 0,
10551 0,
10552 0,
10553 w_mode,
10554 /* de */
10555 w_mode,
10556 w_mode,
10557 w_mode,
10558 w_mode,
10559 w_mode,
10560 w_mode,
10561 w_mode,
10562 w_mode,
10563 /* df */
10564 w_mode,
10565 w_mode,
10566 w_mode,
10567 w_mode,
9306ca4a 10568 t_mode,
1d9f512f 10569 q_mode,
9306ca4a 10570 t_mode,
1d9f512f 10571 q_mode
252b5132
RH
10572};
10573
ce518a5f
L
10574#define ST { OP_ST, 0 }
10575#define STi { OP_STi, 0 }
252b5132 10576
4efba78c
L
10577#define FGRPd9_2 NULL, { { NULL, 0 } }
10578#define FGRPd9_4 NULL, { { NULL, 1 } }
10579#define FGRPd9_5 NULL, { { NULL, 2 } }
10580#define FGRPd9_6 NULL, { { NULL, 3 } }
10581#define FGRPd9_7 NULL, { { NULL, 4 } }
10582#define FGRPda_5 NULL, { { NULL, 5 } }
10583#define FGRPdb_4 NULL, { { NULL, 6 } }
10584#define FGRPde_3 NULL, { { NULL, 7 } }
10585#define FGRPdf_4 NULL, { { NULL, 8 } }
252b5132 10586
2da11e11 10587static const struct dis386 float_reg[][8] = {
252b5132
RH
10588 /* d8 */
10589 {
ce518a5f
L
10590 { "fadd", { ST, STi } },
10591 { "fmul", { ST, STi } },
10592 { "fcom", { STi } },
10593 { "fcomp", { STi } },
10594 { "fsub", { ST, STi } },
10595 { "fsubr", { ST, STi } },
10596 { "fdiv", { ST, STi } },
10597 { "fdivr", { ST, STi } },
252b5132
RH
10598 },
10599 /* d9 */
10600 {
ce518a5f
L
10601 { "fld", { STi } },
10602 { "fxch", { STi } },
252b5132 10603 { FGRPd9_2 },
ce518a5f 10604 { "(bad)", { XX } },
252b5132
RH
10605 { FGRPd9_4 },
10606 { FGRPd9_5 },
10607 { FGRPd9_6 },
10608 { FGRPd9_7 },
10609 },
10610 /* da */
10611 {
ce518a5f
L
10612 { "fcmovb", { ST, STi } },
10613 { "fcmove", { ST, STi } },
10614 { "fcmovbe",{ ST, STi } },
10615 { "fcmovu", { ST, STi } },
10616 { "(bad)", { XX } },
252b5132 10617 { FGRPda_5 },
ce518a5f
L
10618 { "(bad)", { XX } },
10619 { "(bad)", { XX } },
252b5132
RH
10620 },
10621 /* db */
10622 {
ce518a5f
L
10623 { "fcmovnb",{ ST, STi } },
10624 { "fcmovne",{ ST, STi } },
10625 { "fcmovnbe",{ ST, STi } },
10626 { "fcmovnu",{ ST, STi } },
252b5132 10627 { FGRPdb_4 },
ce518a5f
L
10628 { "fucomi", { ST, STi } },
10629 { "fcomi", { ST, STi } },
10630 { "(bad)", { XX } },
252b5132
RH
10631 },
10632 /* dc */
10633 {
ce518a5f
L
10634 { "fadd", { STi, ST } },
10635 { "fmul", { STi, ST } },
10636 { "(bad)", { XX } },
10637 { "(bad)", { XX } },
9d141669
L
10638 { "fsub!M", { STi, ST } },
10639 { "fsubM", { STi, ST } },
10640 { "fdiv!M", { STi, ST } },
10641 { "fdivM", { STi, ST } },
252b5132
RH
10642 },
10643 /* dd */
10644 {
ce518a5f
L
10645 { "ffree", { STi } },
10646 { "(bad)", { XX } },
10647 { "fst", { STi } },
10648 { "fstp", { STi } },
10649 { "fucom", { STi } },
10650 { "fucomp", { STi } },
10651 { "(bad)", { XX } },
10652 { "(bad)", { XX } },
252b5132
RH
10653 },
10654 /* de */
10655 {
ce518a5f
L
10656 { "faddp", { STi, ST } },
10657 { "fmulp", { STi, ST } },
10658 { "(bad)", { XX } },
252b5132 10659 { FGRPde_3 },
9d141669
L
10660 { "fsub!Mp", { STi, ST } },
10661 { "fsubMp", { STi, ST } },
10662 { "fdiv!Mp", { STi, ST } },
10663 { "fdivMp", { STi, ST } },
252b5132
RH
10664 },
10665 /* df */
10666 {
ce518a5f
L
10667 { "ffreep", { STi } },
10668 { "(bad)", { XX } },
10669 { "(bad)", { XX } },
10670 { "(bad)", { XX } },
252b5132 10671 { FGRPdf_4 },
ce518a5f
L
10672 { "fucomip", { ST, STi } },
10673 { "fcomip", { ST, STi } },
10674 { "(bad)", { XX } },
252b5132
RH
10675 },
10676};
10677
252b5132
RH
10678static char *fgrps[][8] = {
10679 /* d9_2 0 */
10680 {
10681 "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10682 },
10683
10684 /* d9_4 1 */
10685 {
10686 "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
10687 },
10688
10689 /* d9_5 2 */
10690 {
10691 "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
10692 },
10693
10694 /* d9_6 3 */
10695 {
10696 "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
10697 },
10698
10699 /* d9_7 4 */
10700 {
10701 "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
10702 },
10703
10704 /* da_5 5 */
10705 {
10706 "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10707 },
10708
10709 /* db_4 6 */
10710 {
10711 "feni(287 only)","fdisi(287 only)","fNclex","fNinit",
10712 "fNsetpm(287 only)","(bad)","(bad)","(bad)",
10713 },
10714
10715 /* de_3 7 */
10716 {
10717 "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10718 },
10719
10720 /* df_4 8 */
10721 {
10722 "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10723 },
10724};
10725
b844680a
L
10726static void
10727OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED,
10728 int sizeflag ATTRIBUTE_UNUSED)
10729{
10730 /* Skip mod/rm byte. */
10731 MODRM_CHECK;
10732 codep++;
10733}
10734
252b5132 10735static void
26ca5450 10736dofloat (int sizeflag)
252b5132 10737{
2da11e11 10738 const struct dis386 *dp;
252b5132
RH
10739 unsigned char floatop;
10740
10741 floatop = codep[-1];
10742
7967e09e 10743 if (modrm.mod != 3)
252b5132 10744 {
7967e09e 10745 int fp_indx = (floatop - 0xd8) * 8 + modrm.reg;
1d9f512f
AM
10746
10747 putop (float_mem[fp_indx], sizeflag);
ce518a5f 10748 obufp = op_out[0];
6e50d963 10749 op_ad = 2;
1d9f512f 10750 OP_E (float_mem_mode[fp_indx], sizeflag);
252b5132
RH
10751 return;
10752 }
6608db57 10753 /* Skip mod/rm byte. */
4bba6815 10754 MODRM_CHECK;
252b5132
RH
10755 codep++;
10756
7967e09e 10757 dp = &float_reg[floatop - 0xd8][modrm.reg];
252b5132
RH
10758 if (dp->name == NULL)
10759 {
7967e09e 10760 putop (fgrps[dp->op[0].bytemode][modrm.rm], sizeflag);
252b5132 10761
6608db57 10762 /* Instruction fnstsw is only one with strange arg. */
252b5132 10763 if (floatop == 0xdf && codep[-1] == 0xe0)
ce518a5f 10764 strcpy (op_out[0], names16[0]);
252b5132
RH
10765 }
10766 else
10767 {
10768 putop (dp->name, sizeflag);
10769
ce518a5f 10770 obufp = op_out[0];
6e50d963 10771 op_ad = 2;
ce518a5f
L
10772 if (dp->op[0].rtn)
10773 (*dp->op[0].rtn) (dp->op[0].bytemode, sizeflag);
6e50d963 10774
ce518a5f 10775 obufp = op_out[1];
6e50d963 10776 op_ad = 1;
ce518a5f
L
10777 if (dp->op[1].rtn)
10778 (*dp->op[1].rtn) (dp->op[1].bytemode, sizeflag);
252b5132
RH
10779 }
10780}
10781
252b5132 10782static void
26ca5450 10783OP_ST (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 10784{
422673a9 10785 oappend ("%st" + intel_syntax);
252b5132
RH
10786}
10787
252b5132 10788static void
26ca5450 10789OP_STi (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 10790{
7967e09e 10791 sprintf (scratchbuf, "%%st(%d)", modrm.rm);
d708bcba 10792 oappend (scratchbuf + intel_syntax);
252b5132
RH
10793}
10794
6608db57 10795/* Capital letters in template are macros. */
6439fc28 10796static int
26ca5450 10797putop (const char *template, int sizeflag)
252b5132 10798{
2da11e11 10799 const char *p;
9306ca4a 10800 int alt = 0;
9d141669 10801 int cond = 1;
98b528ac
L
10802 unsigned int l = 0, len = 1;
10803 char last[4];
10804
10805#define SAVE_LAST(c) \
10806 if (l < len && l < sizeof (last)) \
10807 last[l++] = c; \
10808 else \
10809 abort ();
252b5132
RH
10810
10811 for (p = template; *p; p++)
10812 {
10813 switch (*p)
10814 {
10815 default:
10816 *obufp++ = *p;
10817 break;
98b528ac
L
10818 case '%':
10819 len++;
10820 break;
9d141669
L
10821 case '!':
10822 cond = 0;
10823 break;
6439fc28
AM
10824 case '{':
10825 alt = 0;
10826 if (intel_syntax)
6439fc28
AM
10827 {
10828 while (*++p != '|')
7c52e0e8
L
10829 if (*p == '}' || *p == '\0')
10830 abort ();
6439fc28 10831 }
9306ca4a
JB
10832 /* Fall through. */
10833 case 'I':
10834 alt = 1;
10835 continue;
6439fc28
AM
10836 case '|':
10837 while (*++p != '}')
10838 {
10839 if (*p == '\0')
10840 abort ();
10841 }
10842 break;
10843 case '}':
10844 break;
252b5132 10845 case 'A':
db6eb5be
AM
10846 if (intel_syntax)
10847 break;
7967e09e 10848 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
252b5132
RH
10849 *obufp++ = 'b';
10850 break;
10851 case 'B':
db6eb5be
AM
10852 if (intel_syntax)
10853 break;
252b5132
RH
10854 if (sizeflag & SUFFIX_ALWAYS)
10855 *obufp++ = 'b';
252b5132 10856 break;
9306ca4a
JB
10857 case 'C':
10858 if (intel_syntax && !alt)
10859 break;
10860 if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
10861 {
10862 if (sizeflag & DFLAG)
10863 *obufp++ = intel_syntax ? 'd' : 'l';
10864 else
10865 *obufp++ = intel_syntax ? 'w' : 's';
10866 used_prefixes |= (prefixes & PREFIX_DATA);
10867 }
10868 break;
ed7841b3
JB
10869 case 'D':
10870 if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
10871 break;
161a04f6 10872 USED_REX (REX_W);
7967e09e 10873 if (modrm.mod == 3)
ed7841b3 10874 {
161a04f6 10875 if (rex & REX_W)
ed7841b3
JB
10876 *obufp++ = 'q';
10877 else if (sizeflag & DFLAG)
10878 *obufp++ = intel_syntax ? 'd' : 'l';
10879 else
10880 *obufp++ = 'w';
10881 used_prefixes |= (prefixes & PREFIX_DATA);
10882 }
10883 else
10884 *obufp++ = 'w';
10885 break;
252b5132 10886 case 'E': /* For jcxz/jecxz */
cb712a9e 10887 if (address_mode == mode_64bit)
c1a64871
JH
10888 {
10889 if (sizeflag & AFLAG)
10890 *obufp++ = 'r';
10891 else
10892 *obufp++ = 'e';
10893 }
10894 else
10895 if (sizeflag & AFLAG)
10896 *obufp++ = 'e';
3ffd33cf
AM
10897 used_prefixes |= (prefixes & PREFIX_ADDR);
10898 break;
10899 case 'F':
db6eb5be
AM
10900 if (intel_syntax)
10901 break;
e396998b 10902 if ((prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
3ffd33cf
AM
10903 {
10904 if (sizeflag & AFLAG)
cb712a9e 10905 *obufp++ = address_mode == mode_64bit ? 'q' : 'l';
3ffd33cf 10906 else
cb712a9e 10907 *obufp++ = address_mode == mode_64bit ? 'l' : 'w';
3ffd33cf
AM
10908 used_prefixes |= (prefixes & PREFIX_ADDR);
10909 }
252b5132 10910 break;
52fd6d94
JB
10911 case 'G':
10912 if (intel_syntax || (obufp[-1] != 's' && !(sizeflag & SUFFIX_ALWAYS)))
10913 break;
161a04f6 10914 if ((rex & REX_W) || (sizeflag & DFLAG))
52fd6d94
JB
10915 *obufp++ = 'l';
10916 else
10917 *obufp++ = 'w';
161a04f6 10918 if (!(rex & REX_W))
52fd6d94
JB
10919 used_prefixes |= (prefixes & PREFIX_DATA);
10920 break;
5dd0794d 10921 case 'H':
db6eb5be
AM
10922 if (intel_syntax)
10923 break;
5dd0794d
AM
10924 if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
10925 || (prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
10926 {
10927 used_prefixes |= prefixes & (PREFIX_CS | PREFIX_DS);
10928 *obufp++ = ',';
10929 *obufp++ = 'p';
10930 if (prefixes & PREFIX_DS)
10931 *obufp++ = 't';
10932 else
10933 *obufp++ = 'n';
10934 }
10935 break;
9306ca4a
JB
10936 case 'J':
10937 if (intel_syntax)
10938 break;
10939 *obufp++ = 'l';
10940 break;
42903f7f
L
10941 case 'K':
10942 USED_REX (REX_W);
10943 if (rex & REX_W)
10944 *obufp++ = 'q';
10945 else
10946 *obufp++ = 'd';
10947 break;
6dd5059a
L
10948 case 'Z':
10949 if (intel_syntax)
10950 break;
10951 if (address_mode == mode_64bit && (sizeflag & SUFFIX_ALWAYS))
10952 {
10953 *obufp++ = 'q';
10954 break;
10955 }
10956 /* Fall through. */
98b528ac 10957 goto case_L;
252b5132 10958 case 'L':
98b528ac
L
10959 if (l != 0 || len != 1)
10960 {
10961 SAVE_LAST (*p);
10962 break;
10963 }
10964case_L:
db6eb5be
AM
10965 if (intel_syntax)
10966 break;
252b5132
RH
10967 if (sizeflag & SUFFIX_ALWAYS)
10968 *obufp++ = 'l';
252b5132 10969 break;
9d141669
L
10970 case 'M':
10971 if (intel_mnemonic != cond)
10972 *obufp++ = 'r';
10973 break;
252b5132
RH
10974 case 'N':
10975 if ((prefixes & PREFIX_FWAIT) == 0)
10976 *obufp++ = 'n';
7d421014
ILT
10977 else
10978 used_prefixes |= PREFIX_FWAIT;
252b5132 10979 break;
52b15da3 10980 case 'O':
161a04f6
L
10981 USED_REX (REX_W);
10982 if (rex & REX_W)
6439fc28 10983 *obufp++ = 'o';
a35ca55a
JB
10984 else if (intel_syntax && (sizeflag & DFLAG))
10985 *obufp++ = 'q';
52b15da3
JH
10986 else
10987 *obufp++ = 'd';
161a04f6 10988 if (!(rex & REX_W))
a35ca55a 10989 used_prefixes |= (prefixes & PREFIX_DATA);
52b15da3 10990 break;
6439fc28 10991 case 'T':
db6eb5be
AM
10992 if (intel_syntax)
10993 break;
cb712a9e 10994 if (address_mode == mode_64bit && (sizeflag & DFLAG))
6439fc28
AM
10995 {
10996 *obufp++ = 'q';
10997 break;
10998 }
6608db57 10999 /* Fall through. */
252b5132 11000 case 'P':
db6eb5be
AM
11001 if (intel_syntax)
11002 break;
252b5132 11003 if ((prefixes & PREFIX_DATA)
161a04f6 11004 || (rex & REX_W)
e396998b 11005 || (sizeflag & SUFFIX_ALWAYS))
252b5132 11006 {
161a04f6
L
11007 USED_REX (REX_W);
11008 if (rex & REX_W)
52b15da3 11009 *obufp++ = 'q';
c2419411 11010 else
52b15da3
JH
11011 {
11012 if (sizeflag & DFLAG)
11013 *obufp++ = 'l';
11014 else
11015 *obufp++ = 'w';
52b15da3 11016 }
1a114b12 11017 used_prefixes |= (prefixes & PREFIX_DATA);
252b5132
RH
11018 }
11019 break;
6439fc28 11020 case 'U':
db6eb5be
AM
11021 if (intel_syntax)
11022 break;
cb712a9e 11023 if (address_mode == mode_64bit && (sizeflag & DFLAG))
6439fc28 11024 {
7967e09e 11025 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
1a114b12 11026 *obufp++ = 'q';
6439fc28
AM
11027 break;
11028 }
6608db57 11029 /* Fall through. */
98b528ac 11030 goto case_Q;
252b5132 11031 case 'Q':
98b528ac 11032 if (l == 0 && len == 1)
252b5132 11033 {
98b528ac
L
11034case_Q:
11035 if (intel_syntax && !alt)
11036 break;
11037 USED_REX (REX_W);
11038 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
52b15da3 11039 {
98b528ac
L
11040 if (rex & REX_W)
11041 *obufp++ = 'q';
52b15da3 11042 else
98b528ac
L
11043 {
11044 if (sizeflag & DFLAG)
11045 *obufp++ = intel_syntax ? 'd' : 'l';
11046 else
11047 *obufp++ = 'w';
11048 }
11049 used_prefixes |= (prefixes & PREFIX_DATA);
52b15da3 11050 }
98b528ac
L
11051 }
11052 else
11053 {
11054 if (l != 1 || len != 2 || last[0] != 'L')
11055 {
11056 SAVE_LAST (*p);
11057 break;
11058 }
11059 if (intel_syntax
11060 || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
11061 break;
11062 if ((rex & REX_W))
11063 {
11064 USED_REX (REX_W);
11065 *obufp++ = 'q';
11066 }
11067 else
11068 *obufp++ = 'l';
252b5132
RH
11069 }
11070 break;
11071 case 'R':
161a04f6
L
11072 USED_REX (REX_W);
11073 if (rex & REX_W)
a35ca55a
JB
11074 *obufp++ = 'q';
11075 else if (sizeflag & DFLAG)
c608c12e 11076 {
a35ca55a 11077 if (intel_syntax)
c608c12e 11078 *obufp++ = 'd';
c608c12e 11079 else
a35ca55a 11080 *obufp++ = 'l';
c608c12e 11081 }
252b5132 11082 else
a35ca55a
JB
11083 *obufp++ = 'w';
11084 if (intel_syntax && !p[1]
161a04f6 11085 && ((rex & REX_W) || (sizeflag & DFLAG)))
a35ca55a 11086 *obufp++ = 'e';
161a04f6 11087 if (!(rex & REX_W))
52b15da3 11088 used_prefixes |= (prefixes & PREFIX_DATA);
252b5132 11089 break;
1a114b12
JB
11090 case 'V':
11091 if (intel_syntax)
11092 break;
cb712a9e 11093 if (address_mode == mode_64bit && (sizeflag & DFLAG))
1a114b12
JB
11094 {
11095 if (sizeflag & SUFFIX_ALWAYS)
11096 *obufp++ = 'q';
11097 break;
11098 }
11099 /* Fall through. */
252b5132 11100 case 'S':
db6eb5be
AM
11101 if (intel_syntax)
11102 break;
252b5132
RH
11103 if (sizeflag & SUFFIX_ALWAYS)
11104 {
161a04f6 11105 if (rex & REX_W)
52b15da3 11106 *obufp++ = 'q';
252b5132 11107 else
52b15da3
JH
11108 {
11109 if (sizeflag & DFLAG)
11110 *obufp++ = 'l';
11111 else
11112 *obufp++ = 'w';
11113 used_prefixes |= (prefixes & PREFIX_DATA);
11114 }
252b5132 11115 }
252b5132 11116 break;
041bd2e0 11117 case 'X':
c0f3af97
L
11118 if (l != 0 || len != 1)
11119 {
11120 SAVE_LAST (*p);
11121 break;
11122 }
11123 if (need_vex && vex.prefix)
11124 {
11125 if (vex.prefix == DATA_PREFIX_OPCODE)
11126 *obufp++ = 'd';
11127 else
11128 *obufp++ = 's';
11129 }
11130 else if (prefixes & PREFIX_DATA)
041bd2e0
JH
11131 *obufp++ = 'd';
11132 else
11133 *obufp++ = 's';
db6eb5be 11134 used_prefixes |= (prefixes & PREFIX_DATA);
041bd2e0 11135 break;
76f227a5 11136 case 'Y':
c0f3af97 11137 if (l == 0 && len == 1)
76f227a5 11138 {
c0f3af97
L
11139 if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
11140 break;
11141 if (rex & REX_W)
11142 {
11143 USED_REX (REX_W);
11144 *obufp++ = 'q';
11145 }
11146 break;
11147 }
11148 else
11149 {
11150 if (l != 1 || len != 2 || last[0] != 'X')
11151 {
11152 SAVE_LAST (*p);
11153 break;
11154 }
11155 if (!need_vex)
11156 abort ();
11157 if (intel_syntax
11158 || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
11159 break;
11160 switch (vex.length)
11161 {
11162 case 128:
11163 *obufp++ = 'x';
11164 break;
11165 case 256:
11166 *obufp++ = 'y';
11167 break;
11168 default:
11169 abort ();
11170 }
76f227a5
JH
11171 }
11172 break;
252b5132 11173 case 'W':
252b5132 11174 /* operand size flag for cwtl, cbtw */
161a04f6
L
11175 USED_REX (REX_W);
11176 if (rex & REX_W)
a35ca55a
JB
11177 {
11178 if (intel_syntax)
11179 *obufp++ = 'd';
11180 else
11181 *obufp++ = 'l';
11182 }
52b15da3 11183 else if (sizeflag & DFLAG)
252b5132
RH
11184 *obufp++ = 'w';
11185 else
11186 *obufp++ = 'b';
161a04f6 11187 if (!(rex & REX_W))
52b15da3 11188 used_prefixes |= (prefixes & PREFIX_DATA);
252b5132
RH
11189 break;
11190 }
9306ca4a 11191 alt = 0;
252b5132
RH
11192 }
11193 *obufp = 0;
ea397f5b 11194 mnemonicendp = obufp;
6439fc28 11195 return 0;
252b5132
RH
11196}
11197
11198static void
26ca5450 11199oappend (const char *s)
252b5132 11200{
ea397f5b 11201 obufp = stpcpy (obufp, s);
252b5132
RH
11202}
11203
11204static void
26ca5450 11205append_seg (void)
252b5132
RH
11206{
11207 if (prefixes & PREFIX_CS)
7d421014 11208 {
7d421014 11209 used_prefixes |= PREFIX_CS;
d708bcba 11210 oappend ("%cs:" + intel_syntax);
7d421014 11211 }
252b5132 11212 if (prefixes & PREFIX_DS)
7d421014 11213 {
7d421014 11214 used_prefixes |= PREFIX_DS;
d708bcba 11215 oappend ("%ds:" + intel_syntax);
7d421014 11216 }
252b5132 11217 if (prefixes & PREFIX_SS)
7d421014 11218 {
7d421014 11219 used_prefixes |= PREFIX_SS;
d708bcba 11220 oappend ("%ss:" + intel_syntax);
7d421014 11221 }
252b5132 11222 if (prefixes & PREFIX_ES)
7d421014 11223 {
7d421014 11224 used_prefixes |= PREFIX_ES;
d708bcba 11225 oappend ("%es:" + intel_syntax);
7d421014 11226 }
252b5132 11227 if (prefixes & PREFIX_FS)
7d421014 11228 {
7d421014 11229 used_prefixes |= PREFIX_FS;
d708bcba 11230 oappend ("%fs:" + intel_syntax);
7d421014 11231 }
252b5132 11232 if (prefixes & PREFIX_GS)
7d421014 11233 {
7d421014 11234 used_prefixes |= PREFIX_GS;
d708bcba 11235 oappend ("%gs:" + intel_syntax);
7d421014 11236 }
252b5132
RH
11237}
11238
11239static void
26ca5450 11240OP_indirE (int bytemode, int sizeflag)
252b5132
RH
11241{
11242 if (!intel_syntax)
11243 oappend ("*");
11244 OP_E (bytemode, sizeflag);
11245}
11246
52b15da3 11247static void
26ca5450 11248print_operand_value (char *buf, int hex, bfd_vma disp)
52b15da3 11249{
cb712a9e 11250 if (address_mode == mode_64bit)
52b15da3
JH
11251 {
11252 if (hex)
11253 {
11254 char tmp[30];
11255 int i;
11256 buf[0] = '0';
11257 buf[1] = 'x';
11258 sprintf_vma (tmp, disp);
6608db57 11259 for (i = 0; tmp[i] == '0' && tmp[i + 1]; i++);
52b15da3
JH
11260 strcpy (buf + 2, tmp + i);
11261 }
11262 else
11263 {
11264 bfd_signed_vma v = disp;
11265 char tmp[30];
11266 int i;
11267 if (v < 0)
11268 {
11269 *(buf++) = '-';
11270 v = -disp;
6608db57 11271 /* Check for possible overflow on 0x8000000000000000. */
52b15da3
JH
11272 if (v < 0)
11273 {
11274 strcpy (buf, "9223372036854775808");
11275 return;
11276 }
11277 }
11278 if (!v)
11279 {
11280 strcpy (buf, "0");
11281 return;
11282 }
11283
11284 i = 0;
11285 tmp[29] = 0;
11286 while (v)
11287 {
6608db57 11288 tmp[28 - i] = (v % 10) + '0';
52b15da3
JH
11289 v /= 10;
11290 i++;
11291 }
11292 strcpy (buf, tmp + 29 - i);
11293 }
11294 }
11295 else
11296 {
11297 if (hex)
11298 sprintf (buf, "0x%x", (unsigned int) disp);
11299 else
11300 sprintf (buf, "%d", (int) disp);
11301 }
11302}
11303
5d669648
L
11304/* Put DISP in BUF as signed hex number. */
11305
11306static void
11307print_displacement (char *buf, bfd_vma disp)
11308{
11309 bfd_signed_vma val = disp;
11310 char tmp[30];
11311 int i, j = 0;
11312
11313 if (val < 0)
11314 {
11315 buf[j++] = '-';
11316 val = -disp;
11317
11318 /* Check for possible overflow. */
11319 if (val < 0)
11320 {
11321 switch (address_mode)
11322 {
11323 case mode_64bit:
11324 strcpy (buf + j, "0x8000000000000000");
11325 break;
11326 case mode_32bit:
11327 strcpy (buf + j, "0x80000000");
11328 break;
11329 case mode_16bit:
11330 strcpy (buf + j, "0x8000");
11331 break;
11332 }
11333 return;
11334 }
11335 }
11336
11337 buf[j++] = '0';
11338 buf[j++] = 'x';
11339
0af1713e 11340 sprintf_vma (tmp, (bfd_vma) val);
5d669648
L
11341 for (i = 0; tmp[i] == '0'; i++)
11342 continue;
11343 if (tmp[i] == '\0')
11344 i--;
11345 strcpy (buf + j, tmp + i);
11346}
11347
3f31e633
JB
11348static void
11349intel_operand_size (int bytemode, int sizeflag)
11350{
11351 switch (bytemode)
11352 {
11353 case b_mode:
42903f7f 11354 case dqb_mode:
3f31e633
JB
11355 oappend ("BYTE PTR ");
11356 break;
11357 case w_mode:
11358 case dqw_mode:
11359 oappend ("WORD PTR ");
11360 break;
1a114b12 11361 case stack_v_mode:
cb712a9e 11362 if (address_mode == mode_64bit && (sizeflag & DFLAG))
3f31e633
JB
11363 {
11364 oappend ("QWORD PTR ");
11365 used_prefixes |= (prefixes & PREFIX_DATA);
11366 break;
11367 }
11368 /* FALLTHRU */
11369 case v_mode:
11370 case dq_mode:
161a04f6
L
11371 USED_REX (REX_W);
11372 if (rex & REX_W)
3f31e633
JB
11373 oappend ("QWORD PTR ");
11374 else if ((sizeflag & DFLAG) || bytemode == dq_mode)
11375 oappend ("DWORD PTR ");
11376 else
11377 oappend ("WORD PTR ");
11378 used_prefixes |= (prefixes & PREFIX_DATA);
11379 break;
52fd6d94 11380 case z_mode:
161a04f6 11381 if ((rex & REX_W) || (sizeflag & DFLAG))
52fd6d94
JB
11382 *obufp++ = 'D';
11383 oappend ("WORD PTR ");
161a04f6 11384 if (!(rex & REX_W))
52fd6d94
JB
11385 used_prefixes |= (prefixes & PREFIX_DATA);
11386 break;
34b772a6
JB
11387 case a_mode:
11388 if (sizeflag & DFLAG)
11389 oappend ("QWORD PTR ");
11390 else
11391 oappend ("DWORD PTR ");
11392 used_prefixes |= (prefixes & PREFIX_DATA);
11393 break;
3f31e633 11394 case d_mode:
42903f7f 11395 case dqd_mode:
3f31e633
JB
11396 oappend ("DWORD PTR ");
11397 break;
11398 case q_mode:
11399 oappend ("QWORD PTR ");
11400 break;
11401 case m_mode:
cb712a9e 11402 if (address_mode == mode_64bit)
3f31e633
JB
11403 oappend ("QWORD PTR ");
11404 else
11405 oappend ("DWORD PTR ");
11406 break;
11407 case f_mode:
11408 if (sizeflag & DFLAG)
11409 oappend ("FWORD PTR ");
11410 else
11411 oappend ("DWORD PTR ");
11412 used_prefixes |= (prefixes & PREFIX_DATA);
11413 break;
11414 case t_mode:
11415 oappend ("TBYTE PTR ");
11416 break;
11417 case x_mode:
c0f3af97
L
11418 if (need_vex)
11419 {
11420 switch (vex.length)
11421 {
11422 case 128:
11423 oappend ("XMMWORD PTR ");
11424 break;
11425 case 256:
11426 oappend ("YMMWORD PTR ");
11427 break;
11428 default:
11429 abort ();
11430 }
11431 }
11432 else
11433 oappend ("XMMWORD PTR ");
11434 break;
11435 case xmm_mode:
3f31e633
JB
11436 oappend ("XMMWORD PTR ");
11437 break;
c0f3af97
L
11438 case xmmq_mode:
11439 if (!need_vex)
11440 abort ();
11441
11442 switch (vex.length)
11443 {
11444 case 128:
11445 oappend ("QWORD PTR ");
11446 break;
11447 case 256:
11448 oappend ("XMMWORD PTR ");
11449 break;
11450 default:
11451 abort ();
11452 }
11453 break;
11454 case ymmq_mode:
11455 if (!need_vex)
11456 abort ();
11457
11458 switch (vex.length)
11459 {
11460 case 128:
11461 oappend ("QWORD PTR ");
11462 break;
11463 case 256:
11464 oappend ("YMMWORD PTR ");
11465 break;
11466 default:
11467 abort ();
11468 }
11469 break;
fb9c77c7
L
11470 case o_mode:
11471 oappend ("OWORD PTR ");
11472 break;
3f31e633
JB
11473 default:
11474 break;
11475 }
11476}
11477
252b5132 11478static void
c0f3af97 11479OP_E_register (int bytemode, int sizeflag)
252b5132 11480{
c0f3af97
L
11481 int reg = modrm.rm;
11482 const char **names;
252b5132 11483
c0f3af97
L
11484 USED_REX (REX_B);
11485 if ((rex & REX_B))
11486 reg += 8;
252b5132 11487
c0f3af97 11488 switch (bytemode)
252b5132 11489 {
c0f3af97
L
11490 case b_mode:
11491 USED_REX (0);
11492 if (rex)
11493 names = names8rex;
11494 else
11495 names = names8;
11496 break;
11497 case w_mode:
11498 names = names16;
11499 break;
11500 case d_mode:
11501 names = names32;
11502 break;
11503 case q_mode:
11504 names = names64;
11505 break;
11506 case m_mode:
11507 names = address_mode == mode_64bit ? names64 : names32;
11508 break;
11509 case stack_v_mode:
11510 if (address_mode == mode_64bit && (sizeflag & DFLAG))
252b5132 11511 {
c0f3af97 11512 names = names64;
7d421014 11513 used_prefixes |= (prefixes & PREFIX_DATA);
252b5132 11514 break;
252b5132 11515 }
c0f3af97
L
11516 bytemode = v_mode;
11517 /* FALLTHRU */
11518 case v_mode:
11519 case dq_mode:
11520 case dqb_mode:
11521 case dqd_mode:
11522 case dqw_mode:
11523 USED_REX (REX_W);
11524 if (rex & REX_W)
11525 names = names64;
11526 else if ((sizeflag & DFLAG) || bytemode != v_mode)
11527 names = names32;
11528 else
11529 names = names16;
11530 used_prefixes |= (prefixes & PREFIX_DATA);
11531 break;
11532 case 0:
11533 return;
11534 default:
11535 oappend (INTERNAL_DISASSEMBLER_ERROR);
252b5132
RH
11536 return;
11537 }
c0f3af97
L
11538 oappend (names[reg]);
11539}
11540
11541static void
11542OP_E_memory (int bytemode, int sizeflag, int has_drex)
11543{
11544 bfd_vma disp = 0;
11545 int add = (rex & REX_B) ? 8 : 0;
11546 int riprel = 0;
252b5132 11547
c0f3af97 11548 USED_REX (REX_B);
3f31e633
JB
11549 if (intel_syntax)
11550 intel_operand_size (bytemode, sizeflag);
252b5132
RH
11551 append_seg ();
11552
5d669648 11553 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
252b5132 11554 {
5d669648
L
11555 /* 32/64 bit address mode */
11556 int havedisp;
252b5132
RH
11557 int havesib;
11558 int havebase;
0f7da397 11559 int haveindex;
20afcfb7 11560 int needindex;
82c18208 11561 int base, rbase;
252b5132
RH
11562 int index = 0;
11563 int scale = 0;
11564
11565 havesib = 0;
11566 havebase = 1;
0f7da397 11567 haveindex = 0;
7967e09e 11568 base = modrm.rm;
252b5132
RH
11569
11570 if (base == 4)
11571 {
11572 havesib = 1;
11573 FETCH_DATA (the_info, codep + 1);
252b5132 11574 index = (*codep >> 3) & 7;
db51cc60 11575 scale = (*codep >> 6) & 3;
252b5132 11576 base = *codep & 7;
161a04f6
L
11577 USED_REX (REX_X);
11578 if (rex & REX_X)
52b15da3 11579 index += 8;
0f7da397 11580 haveindex = index != 4;
252b5132
RH
11581 codep++;
11582 }
82c18208 11583 rbase = base + add;
252b5132 11584
85f10a01
MM
11585 /* If we have a DREX byte, skip it now
11586 (it has already been handled) */
11587 if (has_drex)
11588 {
11589 FETCH_DATA (the_info, codep + 1);
11590 codep++;
11591 }
11592
7967e09e 11593 switch (modrm.mod)
252b5132
RH
11594 {
11595 case 0:
82c18208 11596 if (base == 5)
252b5132
RH
11597 {
11598 havebase = 0;
cb712a9e 11599 if (address_mode == mode_64bit && !havesib)
52b15da3
JH
11600 riprel = 1;
11601 disp = get32s ();
252b5132
RH
11602 }
11603 break;
11604 case 1:
11605 FETCH_DATA (the_info, codep + 1);
11606 disp = *codep++;
11607 if ((disp & 0x80) != 0)
11608 disp -= 0x100;
11609 break;
11610 case 2:
52b15da3 11611 disp = get32s ();
252b5132
RH
11612 break;
11613 }
11614
20afcfb7
L
11615 /* In 32bit mode, we need index register to tell [offset] from
11616 [eiz*1 + offset]. */
11617 needindex = (havesib
11618 && !havebase
11619 && !haveindex
11620 && address_mode == mode_32bit);
11621 havedisp = (havebase
11622 || needindex
11623 || (havesib && (haveindex || scale != 0)));
5d669648 11624
252b5132 11625 if (!intel_syntax)
82c18208 11626 if (modrm.mod != 0 || base == 5)
db6eb5be 11627 {
5d669648
L
11628 if (havedisp || riprel)
11629 print_displacement (scratchbuf, disp);
11630 else
11631 print_operand_value (scratchbuf, 1, disp);
db6eb5be 11632 oappend (scratchbuf);
52b15da3
JH
11633 if (riprel)
11634 {
11635 set_op (disp, 1);
87767711 11636 oappend (sizeflag & AFLAG ? "(%rip)" : "(%eip)");
52b15da3 11637 }
db6eb5be 11638 }
2da11e11 11639
87767711
JB
11640 if (havebase || haveindex || riprel)
11641 used_prefixes |= PREFIX_ADDR;
11642
5d669648 11643 if (havedisp || (intel_syntax && riprel))
252b5132 11644 {
252b5132 11645 *obufp++ = open_char;
52b15da3 11646 if (intel_syntax && riprel)
185b1163
L
11647 {
11648 set_op (disp, 1);
87767711 11649 oappend (sizeflag & AFLAG ? "rip" : "eip");
185b1163 11650 }
db6eb5be 11651 *obufp = '\0';
252b5132 11652 if (havebase)
cb712a9e 11653 oappend (address_mode == mode_64bit && (sizeflag & AFLAG)
82c18208 11654 ? names64[rbase] : names32[rbase]);
252b5132
RH
11655 if (havesib)
11656 {
db51cc60
L
11657 /* ESP/RSP won't allow index. If base isn't ESP/RSP,
11658 print index to tell base + index from base. */
11659 if (scale != 0
20afcfb7 11660 || needindex
db51cc60
L
11661 || haveindex
11662 || (havebase && base != ESP_REG_NUM))
252b5132 11663 {
9306ca4a 11664 if (!intel_syntax || havebase)
db6eb5be 11665 {
9306ca4a
JB
11666 *obufp++ = separator_char;
11667 *obufp = '\0';
db6eb5be 11668 }
db51cc60
L
11669 if (haveindex)
11670 oappend (address_mode == mode_64bit
11671 && (sizeflag & AFLAG)
11672 ? names64[index] : names32[index]);
11673 else
11674 oappend (address_mode == mode_64bit
11675 && (sizeflag & AFLAG)
11676 ? index64 : index32);
11677
db6eb5be
AM
11678 *obufp++ = scale_char;
11679 *obufp = '\0';
11680 sprintf (scratchbuf, "%d", 1 << scale);
11681 oappend (scratchbuf);
11682 }
252b5132 11683 }
185b1163 11684 if (intel_syntax
82c18208 11685 && (disp || modrm.mod != 0 || base == 5))
3d456fa1 11686 {
db51cc60 11687 if (!havedisp || (bfd_signed_vma) disp >= 0)
3d456fa1
JB
11688 {
11689 *obufp++ = '+';
11690 *obufp = '\0';
11691 }
7967e09e 11692 else if (modrm.mod != 1)
3d456fa1
JB
11693 {
11694 *obufp++ = '-';
11695 *obufp = '\0';
11696 disp = - (bfd_signed_vma) disp;
11697 }
11698
db51cc60
L
11699 if (havedisp)
11700 print_displacement (scratchbuf, disp);
11701 else
11702 print_operand_value (scratchbuf, 1, disp);
3d456fa1
JB
11703 oappend (scratchbuf);
11704 }
252b5132
RH
11705
11706 *obufp++ = close_char;
db6eb5be 11707 *obufp = '\0';
252b5132
RH
11708 }
11709 else if (intel_syntax)
db6eb5be 11710 {
82c18208 11711 if (modrm.mod != 0 || base == 5)
db6eb5be 11712 {
252b5132
RH
11713 if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
11714 | PREFIX_ES | PREFIX_FS | PREFIX_GS))
11715 ;
11716 else
11717 {
d708bcba 11718 oappend (names_seg[ds_reg - es_reg]);
252b5132
RH
11719 oappend (":");
11720 }
52b15da3 11721 print_operand_value (scratchbuf, 1, disp);
db6eb5be
AM
11722 oappend (scratchbuf);
11723 }
11724 }
252b5132
RH
11725 }
11726 else
11727 { /* 16 bit address mode */
7967e09e 11728 switch (modrm.mod)
252b5132
RH
11729 {
11730 case 0:
7967e09e 11731 if (modrm.rm == 6)
252b5132
RH
11732 {
11733 disp = get16 ();
11734 if ((disp & 0x8000) != 0)
11735 disp -= 0x10000;
11736 }
11737 break;
11738 case 1:
11739 FETCH_DATA (the_info, codep + 1);
11740 disp = *codep++;
11741 if ((disp & 0x80) != 0)
11742 disp -= 0x100;
11743 break;
11744 case 2:
11745 disp = get16 ();
11746 if ((disp & 0x8000) != 0)
11747 disp -= 0x10000;
11748 break;
11749 }
11750
11751 if (!intel_syntax)
7967e09e 11752 if (modrm.mod != 0 || modrm.rm == 6)
db6eb5be 11753 {
5d669648 11754 print_displacement (scratchbuf, disp);
db6eb5be
AM
11755 oappend (scratchbuf);
11756 }
252b5132 11757
7967e09e 11758 if (modrm.mod != 0 || modrm.rm != 6)
252b5132
RH
11759 {
11760 *obufp++ = open_char;
db6eb5be 11761 *obufp = '\0';
7967e09e 11762 oappend (index16[modrm.rm]);
5d669648
L
11763 if (intel_syntax
11764 && (disp || modrm.mod != 0 || modrm.rm == 6))
3d456fa1 11765 {
5d669648 11766 if ((bfd_signed_vma) disp >= 0)
3d456fa1
JB
11767 {
11768 *obufp++ = '+';
11769 *obufp = '\0';
11770 }
7967e09e 11771 else if (modrm.mod != 1)
3d456fa1
JB
11772 {
11773 *obufp++ = '-';
11774 *obufp = '\0';
11775 disp = - (bfd_signed_vma) disp;
11776 }
11777
5d669648 11778 print_displacement (scratchbuf, disp);
3d456fa1
JB
11779 oappend (scratchbuf);
11780 }
11781
db6eb5be
AM
11782 *obufp++ = close_char;
11783 *obufp = '\0';
252b5132 11784 }
3d456fa1
JB
11785 else if (intel_syntax)
11786 {
11787 if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
11788 | PREFIX_ES | PREFIX_FS | PREFIX_GS))
11789 ;
11790 else
11791 {
11792 oappend (names_seg[ds_reg - es_reg]);
11793 oappend (":");
11794 }
11795 print_operand_value (scratchbuf, 1, disp & 0xffff);
11796 oappend (scratchbuf);
11797 }
252b5132
RH
11798 }
11799}
11800
c0f3af97
L
11801static void
11802OP_E_extended (int bytemode, int sizeflag, int has_drex)
11803{
11804 /* Skip mod/rm byte. */
11805 MODRM_CHECK;
11806 codep++;
11807
11808 if (modrm.mod == 3)
11809 OP_E_register (bytemode, sizeflag);
11810 else
11811 OP_E_memory (bytemode, sizeflag, has_drex);
11812}
11813
85f10a01
MM
11814static void
11815OP_E (int bytemode, int sizeflag)
11816{
11817 OP_E_extended (bytemode, sizeflag, 0);
11818}
11819
11820
252b5132 11821static void
26ca5450 11822OP_G (int bytemode, int sizeflag)
252b5132 11823{
52b15da3 11824 int add = 0;
161a04f6
L
11825 USED_REX (REX_R);
11826 if (rex & REX_R)
52b15da3 11827 add += 8;
252b5132
RH
11828 switch (bytemode)
11829 {
11830 case b_mode:
52b15da3
JH
11831 USED_REX (0);
11832 if (rex)
7967e09e 11833 oappend (names8rex[modrm.reg + add]);
52b15da3 11834 else
7967e09e 11835 oappend (names8[modrm.reg + add]);
252b5132
RH
11836 break;
11837 case w_mode:
7967e09e 11838 oappend (names16[modrm.reg + add]);
252b5132
RH
11839 break;
11840 case d_mode:
7967e09e 11841 oappend (names32[modrm.reg + add]);
52b15da3
JH
11842 break;
11843 case q_mode:
7967e09e 11844 oappend (names64[modrm.reg + add]);
252b5132
RH
11845 break;
11846 case v_mode:
9306ca4a 11847 case dq_mode:
42903f7f
L
11848 case dqb_mode:
11849 case dqd_mode:
9306ca4a 11850 case dqw_mode:
161a04f6
L
11851 USED_REX (REX_W);
11852 if (rex & REX_W)
7967e09e 11853 oappend (names64[modrm.reg + add]);
9306ca4a 11854 else if ((sizeflag & DFLAG) || bytemode != v_mode)
7967e09e 11855 oappend (names32[modrm.reg + add]);
252b5132 11856 else
7967e09e 11857 oappend (names16[modrm.reg + add]);
7d421014 11858 used_prefixes |= (prefixes & PREFIX_DATA);
252b5132 11859 break;
90700ea2 11860 case m_mode:
cb712a9e 11861 if (address_mode == mode_64bit)
7967e09e 11862 oappend (names64[modrm.reg + add]);
90700ea2 11863 else
7967e09e 11864 oappend (names32[modrm.reg + add]);
90700ea2 11865 break;
252b5132
RH
11866 default:
11867 oappend (INTERNAL_DISASSEMBLER_ERROR);
11868 break;
11869 }
11870}
11871
52b15da3 11872static bfd_vma
26ca5450 11873get64 (void)
52b15da3 11874{
5dd0794d 11875 bfd_vma x;
52b15da3 11876#ifdef BFD64
5dd0794d
AM
11877 unsigned int a;
11878 unsigned int b;
11879
52b15da3
JH
11880 FETCH_DATA (the_info, codep + 8);
11881 a = *codep++ & 0xff;
11882 a |= (*codep++ & 0xff) << 8;
11883 a |= (*codep++ & 0xff) << 16;
11884 a |= (*codep++ & 0xff) << 24;
5dd0794d 11885 b = *codep++ & 0xff;
52b15da3
JH
11886 b |= (*codep++ & 0xff) << 8;
11887 b |= (*codep++ & 0xff) << 16;
11888 b |= (*codep++ & 0xff) << 24;
11889 x = a + ((bfd_vma) b << 32);
11890#else
6608db57 11891 abort ();
5dd0794d 11892 x = 0;
52b15da3
JH
11893#endif
11894 return x;
11895}
11896
11897static bfd_signed_vma
26ca5450 11898get32 (void)
252b5132 11899{
52b15da3 11900 bfd_signed_vma x = 0;
252b5132
RH
11901
11902 FETCH_DATA (the_info, codep + 4);
52b15da3
JH
11903 x = *codep++ & (bfd_signed_vma) 0xff;
11904 x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
11905 x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
11906 x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
11907 return x;
11908}
11909
11910static bfd_signed_vma
26ca5450 11911get32s (void)
52b15da3
JH
11912{
11913 bfd_signed_vma x = 0;
11914
11915 FETCH_DATA (the_info, codep + 4);
11916 x = *codep++ & (bfd_signed_vma) 0xff;
11917 x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
11918 x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
11919 x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
11920
11921 x = (x ^ ((bfd_signed_vma) 1 << 31)) - ((bfd_signed_vma) 1 << 31);
11922
252b5132
RH
11923 return x;
11924}
11925
11926static int
26ca5450 11927get16 (void)
252b5132
RH
11928{
11929 int x = 0;
11930
11931 FETCH_DATA (the_info, codep + 2);
11932 x = *codep++ & 0xff;
11933 x |= (*codep++ & 0xff) << 8;
11934 return x;
11935}
11936
11937static void
26ca5450 11938set_op (bfd_vma op, int riprel)
252b5132
RH
11939{
11940 op_index[op_ad] = op_ad;
cb712a9e 11941 if (address_mode == mode_64bit)
7081ff04
AJ
11942 {
11943 op_address[op_ad] = op;
11944 op_riprel[op_ad] = riprel;
11945 }
11946 else
11947 {
11948 /* Mask to get a 32-bit address. */
11949 op_address[op_ad] = op & 0xffffffff;
11950 op_riprel[op_ad] = riprel & 0xffffffff;
11951 }
252b5132
RH
11952}
11953
11954static void
26ca5450 11955OP_REG (int code, int sizeflag)
252b5132 11956{
2da11e11 11957 const char *s;
9b60702d 11958 int add;
161a04f6
L
11959 USED_REX (REX_B);
11960 if (rex & REX_B)
52b15da3 11961 add = 8;
9b60702d
L
11962 else
11963 add = 0;
52b15da3
JH
11964
11965 switch (code)
11966 {
52b15da3
JH
11967 case ax_reg: case cx_reg: case dx_reg: case bx_reg:
11968 case sp_reg: case bp_reg: case si_reg: case di_reg:
11969 s = names16[code - ax_reg + add];
11970 break;
11971 case es_reg: case ss_reg: case cs_reg:
11972 case ds_reg: case fs_reg: case gs_reg:
11973 s = names_seg[code - es_reg + add];
11974 break;
11975 case al_reg: case ah_reg: case cl_reg: case ch_reg:
11976 case dl_reg: case dh_reg: case bl_reg: case bh_reg:
11977 USED_REX (0);
11978 if (rex)
11979 s = names8rex[code - al_reg + add];
11980 else
11981 s = names8[code - al_reg];
11982 break;
6439fc28
AM
11983 case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
11984 case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
cb712a9e 11985 if (address_mode == mode_64bit && (sizeflag & DFLAG))
6439fc28
AM
11986 {
11987 s = names64[code - rAX_reg + add];
11988 break;
11989 }
11990 code += eAX_reg - rAX_reg;
6608db57 11991 /* Fall through. */
52b15da3
JH
11992 case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
11993 case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
161a04f6
L
11994 USED_REX (REX_W);
11995 if (rex & REX_W)
52b15da3
JH
11996 s = names64[code - eAX_reg + add];
11997 else if (sizeflag & DFLAG)
11998 s = names32[code - eAX_reg + add];
11999 else
12000 s = names16[code - eAX_reg + add];
12001 used_prefixes |= (prefixes & PREFIX_DATA);
12002 break;
52b15da3
JH
12003 default:
12004 s = INTERNAL_DISASSEMBLER_ERROR;
12005 break;
12006 }
12007 oappend (s);
12008}
12009
12010static void
26ca5450 12011OP_IMREG (int code, int sizeflag)
52b15da3
JH
12012{
12013 const char *s;
252b5132
RH
12014
12015 switch (code)
12016 {
12017 case indir_dx_reg:
d708bcba 12018 if (intel_syntax)
52fd6d94 12019 s = "dx";
d708bcba 12020 else
db6eb5be 12021 s = "(%dx)";
252b5132
RH
12022 break;
12023 case ax_reg: case cx_reg: case dx_reg: case bx_reg:
12024 case sp_reg: case bp_reg: case si_reg: case di_reg:
12025 s = names16[code - ax_reg];
12026 break;
12027 case es_reg: case ss_reg: case cs_reg:
12028 case ds_reg: case fs_reg: case gs_reg:
12029 s = names_seg[code - es_reg];
12030 break;
12031 case al_reg: case ah_reg: case cl_reg: case ch_reg:
12032 case dl_reg: case dh_reg: case bl_reg: case bh_reg:
52b15da3
JH
12033 USED_REX (0);
12034 if (rex)
12035 s = names8rex[code - al_reg];
12036 else
12037 s = names8[code - al_reg];
252b5132
RH
12038 break;
12039 case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
12040 case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
161a04f6
L
12041 USED_REX (REX_W);
12042 if (rex & REX_W)
52b15da3
JH
12043 s = names64[code - eAX_reg];
12044 else if (sizeflag & DFLAG)
252b5132
RH
12045 s = names32[code - eAX_reg];
12046 else
12047 s = names16[code - eAX_reg];
7d421014 12048 used_prefixes |= (prefixes & PREFIX_DATA);
252b5132 12049 break;
52fd6d94 12050 case z_mode_ax_reg:
161a04f6 12051 if ((rex & REX_W) || (sizeflag & DFLAG))
52fd6d94
JB
12052 s = *names32;
12053 else
12054 s = *names16;
161a04f6 12055 if (!(rex & REX_W))
52fd6d94
JB
12056 used_prefixes |= (prefixes & PREFIX_DATA);
12057 break;
252b5132
RH
12058 default:
12059 s = INTERNAL_DISASSEMBLER_ERROR;
12060 break;
12061 }
12062 oappend (s);
12063}
12064
12065static void
26ca5450 12066OP_I (int bytemode, int sizeflag)
252b5132 12067{
52b15da3
JH
12068 bfd_signed_vma op;
12069 bfd_signed_vma mask = -1;
252b5132
RH
12070
12071 switch (bytemode)
12072 {
12073 case b_mode:
12074 FETCH_DATA (the_info, codep + 1);
52b15da3
JH
12075 op = *codep++;
12076 mask = 0xff;
12077 break;
12078 case q_mode:
cb712a9e 12079 if (address_mode == mode_64bit)
6439fc28
AM
12080 {
12081 op = get32s ();
12082 break;
12083 }
6608db57 12084 /* Fall through. */
252b5132 12085 case v_mode:
161a04f6
L
12086 USED_REX (REX_W);
12087 if (rex & REX_W)
52b15da3
JH
12088 op = get32s ();
12089 else if (sizeflag & DFLAG)
12090 {
12091 op = get32 ();
12092 mask = 0xffffffff;
12093 }
252b5132 12094 else
52b15da3
JH
12095 {
12096 op = get16 ();
12097 mask = 0xfffff;
12098 }
7d421014 12099 used_prefixes |= (prefixes & PREFIX_DATA);
252b5132
RH
12100 break;
12101 case w_mode:
52b15da3 12102 mask = 0xfffff;
252b5132
RH
12103 op = get16 ();
12104 break;
9306ca4a
JB
12105 case const_1_mode:
12106 if (intel_syntax)
12107 oappend ("1");
12108 return;
252b5132
RH
12109 default:
12110 oappend (INTERNAL_DISASSEMBLER_ERROR);
12111 return;
12112 }
12113
52b15da3
JH
12114 op &= mask;
12115 scratchbuf[0] = '$';
d708bcba
AM
12116 print_operand_value (scratchbuf + 1, 1, op);
12117 oappend (scratchbuf + intel_syntax);
52b15da3
JH
12118 scratchbuf[0] = '\0';
12119}
12120
12121static void
26ca5450 12122OP_I64 (int bytemode, int sizeflag)
52b15da3
JH
12123{
12124 bfd_signed_vma op;
12125 bfd_signed_vma mask = -1;
12126
cb712a9e 12127 if (address_mode != mode_64bit)
6439fc28
AM
12128 {
12129 OP_I (bytemode, sizeflag);
12130 return;
12131 }
12132
52b15da3
JH
12133 switch (bytemode)
12134 {
12135 case b_mode:
12136 FETCH_DATA (the_info, codep + 1);
12137 op = *codep++;
12138 mask = 0xff;
12139 break;
12140 case v_mode:
161a04f6
L
12141 USED_REX (REX_W);
12142 if (rex & REX_W)
52b15da3
JH
12143 op = get64 ();
12144 else if (sizeflag & DFLAG)
12145 {
12146 op = get32 ();
12147 mask = 0xffffffff;
12148 }
12149 else
12150 {
12151 op = get16 ();
12152 mask = 0xfffff;
12153 }
12154 used_prefixes |= (prefixes & PREFIX_DATA);
12155 break;
12156 case w_mode:
12157 mask = 0xfffff;
12158 op = get16 ();
12159 break;
12160 default:
12161 oappend (INTERNAL_DISASSEMBLER_ERROR);
12162 return;
12163 }
12164
12165 op &= mask;
12166 scratchbuf[0] = '$';
d708bcba
AM
12167 print_operand_value (scratchbuf + 1, 1, op);
12168 oappend (scratchbuf + intel_syntax);
252b5132
RH
12169 scratchbuf[0] = '\0';
12170}
12171
12172static void
26ca5450 12173OP_sI (int bytemode, int sizeflag)
252b5132 12174{
52b15da3
JH
12175 bfd_signed_vma op;
12176 bfd_signed_vma mask = -1;
252b5132
RH
12177
12178 switch (bytemode)
12179 {
12180 case b_mode:
12181 FETCH_DATA (the_info, codep + 1);
12182 op = *codep++;
12183 if ((op & 0x80) != 0)
12184 op -= 0x100;
52b15da3 12185 mask = 0xffffffff;
252b5132
RH
12186 break;
12187 case v_mode:
161a04f6
L
12188 USED_REX (REX_W);
12189 if (rex & REX_W)
52b15da3
JH
12190 op = get32s ();
12191 else if (sizeflag & DFLAG)
12192 {
12193 op = get32s ();
12194 mask = 0xffffffff;
12195 }
252b5132
RH
12196 else
12197 {
52b15da3 12198 mask = 0xffffffff;
6608db57 12199 op = get16 ();
252b5132
RH
12200 if ((op & 0x8000) != 0)
12201 op -= 0x10000;
12202 }
7d421014 12203 used_prefixes |= (prefixes & PREFIX_DATA);
252b5132
RH
12204 break;
12205 case w_mode:
12206 op = get16 ();
52b15da3 12207 mask = 0xffffffff;
252b5132
RH
12208 if ((op & 0x8000) != 0)
12209 op -= 0x10000;
12210 break;
12211 default:
12212 oappend (INTERNAL_DISASSEMBLER_ERROR);
12213 return;
12214 }
52b15da3
JH
12215
12216 scratchbuf[0] = '$';
12217 print_operand_value (scratchbuf + 1, 1, op);
d708bcba 12218 oappend (scratchbuf + intel_syntax);
252b5132
RH
12219}
12220
12221static void
26ca5450 12222OP_J (int bytemode, int sizeflag)
252b5132 12223{
52b15da3 12224 bfd_vma disp;
7081ff04 12225 bfd_vma mask = -1;
65ca155d 12226 bfd_vma segment = 0;
252b5132
RH
12227
12228 switch (bytemode)
12229 {
12230 case b_mode:
12231 FETCH_DATA (the_info, codep + 1);
12232 disp = *codep++;
12233 if ((disp & 0x80) != 0)
12234 disp -= 0x100;
12235 break;
12236 case v_mode:
161a04f6 12237 if ((sizeflag & DFLAG) || (rex & REX_W))
52b15da3 12238 disp = get32s ();
252b5132
RH
12239 else
12240 {
12241 disp = get16 ();
206717e8
L
12242 if ((disp & 0x8000) != 0)
12243 disp -= 0x10000;
65ca155d
L
12244 /* In 16bit mode, address is wrapped around at 64k within
12245 the same segment. Otherwise, a data16 prefix on a jump
12246 instruction means that the pc is masked to 16 bits after
12247 the displacement is added! */
12248 mask = 0xffff;
12249 if ((prefixes & PREFIX_DATA) == 0)
12250 segment = ((start_pc + codep - start_codep)
12251 & ~((bfd_vma) 0xffff));
252b5132 12252 }
d807a492 12253 used_prefixes |= (prefixes & PREFIX_DATA);
252b5132
RH
12254 break;
12255 default:
12256 oappend (INTERNAL_DISASSEMBLER_ERROR);
12257 return;
12258 }
65ca155d 12259 disp = ((start_pc + codep - start_codep + disp) & mask) | segment;
52b15da3
JH
12260 set_op (disp, 0);
12261 print_operand_value (scratchbuf, 1, disp);
252b5132
RH
12262 oappend (scratchbuf);
12263}
12264
252b5132 12265static void
ed7841b3 12266OP_SEG (int bytemode, int sizeflag)
252b5132 12267{
ed7841b3 12268 if (bytemode == w_mode)
7967e09e 12269 oappend (names_seg[modrm.reg]);
ed7841b3 12270 else
7967e09e 12271 OP_E (modrm.mod == 3 ? bytemode : w_mode, sizeflag);
252b5132
RH
12272}
12273
12274static void
26ca5450 12275OP_DIR (int dummy ATTRIBUTE_UNUSED, int sizeflag)
252b5132
RH
12276{
12277 int seg, offset;
12278
c608c12e 12279 if (sizeflag & DFLAG)
252b5132 12280 {
c608c12e
AM
12281 offset = get32 ();
12282 seg = get16 ();
252b5132 12283 }
c608c12e
AM
12284 else
12285 {
12286 offset = get16 ();
12287 seg = get16 ();
12288 }
7d421014 12289 used_prefixes |= (prefixes & PREFIX_DATA);
d708bcba 12290 if (intel_syntax)
3f31e633 12291 sprintf (scratchbuf, "0x%x:0x%x", seg, offset);
d708bcba
AM
12292 else
12293 sprintf (scratchbuf, "$0x%x,$0x%x", seg, offset);
c608c12e 12294 oappend (scratchbuf);
252b5132
RH
12295}
12296
252b5132 12297static void
3f31e633 12298OP_OFF (int bytemode, int sizeflag)
252b5132 12299{
52b15da3 12300 bfd_vma off;
252b5132 12301
3f31e633
JB
12302 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
12303 intel_operand_size (bytemode, sizeflag);
252b5132
RH
12304 append_seg ();
12305
cb712a9e 12306 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
252b5132
RH
12307 off = get32 ();
12308 else
12309 off = get16 ();
12310
12311 if (intel_syntax)
12312 {
12313 if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
db6eb5be 12314 | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
252b5132 12315 {
d708bcba 12316 oappend (names_seg[ds_reg - es_reg]);
252b5132
RH
12317 oappend (":");
12318 }
12319 }
52b15da3
JH
12320 print_operand_value (scratchbuf, 1, off);
12321 oappend (scratchbuf);
12322}
6439fc28 12323
52b15da3 12324static void
3f31e633 12325OP_OFF64 (int bytemode, int sizeflag)
52b15da3
JH
12326{
12327 bfd_vma off;
12328
539e75ad
L
12329 if (address_mode != mode_64bit
12330 || (prefixes & PREFIX_ADDR))
6439fc28
AM
12331 {
12332 OP_OFF (bytemode, sizeflag);
12333 return;
12334 }
12335
3f31e633
JB
12336 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
12337 intel_operand_size (bytemode, sizeflag);
52b15da3
JH
12338 append_seg ();
12339
6608db57 12340 off = get64 ();
52b15da3
JH
12341
12342 if (intel_syntax)
12343 {
12344 if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
db6eb5be 12345 | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
52b15da3 12346 {
d708bcba 12347 oappend (names_seg[ds_reg - es_reg]);
52b15da3
JH
12348 oappend (":");
12349 }
12350 }
12351 print_operand_value (scratchbuf, 1, off);
252b5132
RH
12352 oappend (scratchbuf);
12353}
12354
12355static void
26ca5450 12356ptr_reg (int code, int sizeflag)
252b5132 12357{
2da11e11 12358 const char *s;
d708bcba 12359
1d9f512f 12360 *obufp++ = open_char;
20f0a1fc 12361 used_prefixes |= (prefixes & PREFIX_ADDR);
cb712a9e 12362 if (address_mode == mode_64bit)
c1a64871
JH
12363 {
12364 if (!(sizeflag & AFLAG))
db6eb5be 12365 s = names32[code - eAX_reg];
c1a64871 12366 else
db6eb5be 12367 s = names64[code - eAX_reg];
c1a64871 12368 }
52b15da3 12369 else if (sizeflag & AFLAG)
252b5132
RH
12370 s = names32[code - eAX_reg];
12371 else
12372 s = names16[code - eAX_reg];
12373 oappend (s);
1d9f512f
AM
12374 *obufp++ = close_char;
12375 *obufp = 0;
252b5132
RH
12376}
12377
12378static void
26ca5450 12379OP_ESreg (int code, int sizeflag)
252b5132 12380{
9306ca4a 12381 if (intel_syntax)
52fd6d94
JB
12382 {
12383 switch (codep[-1])
12384 {
12385 case 0x6d: /* insw/insl */
12386 intel_operand_size (z_mode, sizeflag);
12387 break;
12388 case 0xa5: /* movsw/movsl/movsq */
12389 case 0xa7: /* cmpsw/cmpsl/cmpsq */
12390 case 0xab: /* stosw/stosl */
12391 case 0xaf: /* scasw/scasl */
12392 intel_operand_size (v_mode, sizeflag);
12393 break;
12394 default:
12395 intel_operand_size (b_mode, sizeflag);
12396 }
12397 }
d708bcba 12398 oappend ("%es:" + intel_syntax);
252b5132
RH
12399 ptr_reg (code, sizeflag);
12400}
12401
12402static void
26ca5450 12403OP_DSreg (int code, int sizeflag)
252b5132 12404{
9306ca4a 12405 if (intel_syntax)
52fd6d94
JB
12406 {
12407 switch (codep[-1])
12408 {
12409 case 0x6f: /* outsw/outsl */
12410 intel_operand_size (z_mode, sizeflag);
12411 break;
12412 case 0xa5: /* movsw/movsl/movsq */
12413 case 0xa7: /* cmpsw/cmpsl/cmpsq */
12414 case 0xad: /* lodsw/lodsl/lodsq */
12415 intel_operand_size (v_mode, sizeflag);
12416 break;
12417 default:
12418 intel_operand_size (b_mode, sizeflag);
12419 }
12420 }
252b5132
RH
12421 if ((prefixes
12422 & (PREFIX_CS
12423 | PREFIX_DS
12424 | PREFIX_SS
12425 | PREFIX_ES
12426 | PREFIX_FS
12427 | PREFIX_GS)) == 0)
12428 prefixes |= PREFIX_DS;
6608db57 12429 append_seg ();
252b5132
RH
12430 ptr_reg (code, sizeflag);
12431}
12432
252b5132 12433static void
26ca5450 12434OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 12435{
9b60702d 12436 int add;
161a04f6 12437 if (rex & REX_R)
c4a530c5 12438 {
161a04f6 12439 USED_REX (REX_R);
c4a530c5
JB
12440 add = 8;
12441 }
cb712a9e 12442 else if (address_mode != mode_64bit && (prefixes & PREFIX_LOCK))
c4a530c5 12443 {
b844680a 12444 lock_prefix = NULL;
c4a530c5
JB
12445 used_prefixes |= PREFIX_LOCK;
12446 add = 8;
12447 }
9b60702d
L
12448 else
12449 add = 0;
7967e09e 12450 sprintf (scratchbuf, "%%cr%d", modrm.reg + add);
d708bcba 12451 oappend (scratchbuf + intel_syntax);
252b5132
RH
12452}
12453
252b5132 12454static void
26ca5450 12455OP_D (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 12456{
9b60702d 12457 int add;
161a04f6
L
12458 USED_REX (REX_R);
12459 if (rex & REX_R)
52b15da3 12460 add = 8;
9b60702d
L
12461 else
12462 add = 0;
d708bcba 12463 if (intel_syntax)
7967e09e 12464 sprintf (scratchbuf, "db%d", modrm.reg + add);
d708bcba 12465 else
7967e09e 12466 sprintf (scratchbuf, "%%db%d", modrm.reg + add);
252b5132
RH
12467 oappend (scratchbuf);
12468}
12469
252b5132 12470static void
26ca5450 12471OP_T (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 12472{
7967e09e 12473 sprintf (scratchbuf, "%%tr%d", modrm.reg);
d708bcba 12474 oappend (scratchbuf + intel_syntax);
252b5132
RH
12475}
12476
12477static void
6f74c397 12478OP_R (int bytemode, int sizeflag)
252b5132 12479{
7967e09e 12480 if (modrm.mod == 3)
2da11e11
AM
12481 OP_E (bytemode, sizeflag);
12482 else
6608db57 12483 BadOp ();
252b5132
RH
12484}
12485
12486static void
26ca5450 12487OP_MMX (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 12488{
041bd2e0
JH
12489 used_prefixes |= (prefixes & PREFIX_DATA);
12490 if (prefixes & PREFIX_DATA)
20f0a1fc 12491 {
9b60702d 12492 int add;
161a04f6
L
12493 USED_REX (REX_R);
12494 if (rex & REX_R)
20f0a1fc 12495 add = 8;
9b60702d
L
12496 else
12497 add = 0;
7967e09e 12498 sprintf (scratchbuf, "%%xmm%d", modrm.reg + add);
20f0a1fc 12499 }
041bd2e0 12500 else
7967e09e 12501 sprintf (scratchbuf, "%%mm%d", modrm.reg);
d708bcba 12502 oappend (scratchbuf + intel_syntax);
252b5132
RH
12503}
12504
c608c12e 12505static void
c0f3af97 12506OP_XMM (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
c608c12e 12507{
9b60702d 12508 int add;
161a04f6
L
12509 USED_REX (REX_R);
12510 if (rex & REX_R)
041bd2e0 12511 add = 8;
9b60702d
L
12512 else
12513 add = 0;
c0f3af97
L
12514 if (need_vex && bytemode != xmm_mode)
12515 {
12516 switch (vex.length)
12517 {
12518 case 128:
12519 sprintf (scratchbuf, "%%xmm%d", modrm.reg + add);
12520 break;
12521 case 256:
12522 sprintf (scratchbuf, "%%ymm%d", modrm.reg + add);
12523 break;
12524 default:
12525 abort ();
12526 }
12527 }
12528 else
12529 sprintf (scratchbuf, "%%xmm%d", modrm.reg + add);
d708bcba 12530 oappend (scratchbuf + intel_syntax);
c608c12e
AM
12531}
12532
252b5132 12533static void
26ca5450 12534OP_EM (int bytemode, int sizeflag)
252b5132 12535{
7967e09e 12536 if (modrm.mod != 3)
252b5132 12537 {
9306ca4a
JB
12538 if (intel_syntax && bytemode == v_mode)
12539 {
12540 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
12541 used_prefixes |= (prefixes & PREFIX_DATA);
12542 }
252b5132
RH
12543 OP_E (bytemode, sizeflag);
12544 return;
12545 }
12546
6608db57 12547 /* Skip mod/rm byte. */
4bba6815 12548 MODRM_CHECK;
252b5132 12549 codep++;
041bd2e0
JH
12550 used_prefixes |= (prefixes & PREFIX_DATA);
12551 if (prefixes & PREFIX_DATA)
20f0a1fc 12552 {
9b60702d 12553 int add;
20f0a1fc 12554
161a04f6
L
12555 USED_REX (REX_B);
12556 if (rex & REX_B)
20f0a1fc 12557 add = 8;
9b60702d
L
12558 else
12559 add = 0;
7967e09e 12560 sprintf (scratchbuf, "%%xmm%d", modrm.rm + add);
20f0a1fc 12561 }
041bd2e0 12562 else
7967e09e 12563 sprintf (scratchbuf, "%%mm%d", modrm.rm);
d708bcba 12564 oappend (scratchbuf + intel_syntax);
252b5132
RH
12565}
12566
246c51aa
L
12567/* cvt* are the only instructions in sse2 which have
12568 both SSE and MMX operands and also have 0x66 prefix
12569 in their opcode. 0x66 was originally used to differentiate
12570 between SSE and MMX instruction(operands). So we have to handle the
4d9567e0
MM
12571 cvt* separately using OP_EMC and OP_MXC */
12572static void
12573OP_EMC (int bytemode, int sizeflag)
12574{
7967e09e 12575 if (modrm.mod != 3)
4d9567e0
MM
12576 {
12577 if (intel_syntax && bytemode == v_mode)
12578 {
12579 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
12580 used_prefixes |= (prefixes & PREFIX_DATA);
12581 }
12582 OP_E (bytemode, sizeflag);
12583 return;
12584 }
246c51aa 12585
4d9567e0
MM
12586 /* Skip mod/rm byte. */
12587 MODRM_CHECK;
12588 codep++;
12589 used_prefixes |= (prefixes & PREFIX_DATA);
7967e09e 12590 sprintf (scratchbuf, "%%mm%d", modrm.rm);
4d9567e0
MM
12591 oappend (scratchbuf + intel_syntax);
12592}
12593
12594static void
12595OP_MXC (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12596{
12597 used_prefixes |= (prefixes & PREFIX_DATA);
7967e09e 12598 sprintf (scratchbuf, "%%mm%d", modrm.reg);
4d9567e0
MM
12599 oappend (scratchbuf + intel_syntax);
12600}
12601
c608c12e 12602static void
26ca5450 12603OP_EX (int bytemode, int sizeflag)
c608c12e 12604{
9b60702d 12605 int add;
7967e09e 12606 if (modrm.mod != 3)
c608c12e
AM
12607 {
12608 OP_E (bytemode, sizeflag);
12609 return;
12610 }
161a04f6
L
12611 USED_REX (REX_B);
12612 if (rex & REX_B)
041bd2e0 12613 add = 8;
9b60702d
L
12614 else
12615 add = 0;
c608c12e 12616
6608db57 12617 /* Skip mod/rm byte. */
4bba6815 12618 MODRM_CHECK;
c608c12e 12619 codep++;
c0f3af97
L
12620 if (need_vex
12621 && bytemode != xmm_mode
12622 && bytemode != xmmq_mode)
12623 {
12624 switch (vex.length)
12625 {
12626 case 128:
12627 sprintf (scratchbuf, "%%xmm%d", modrm.rm + add);
12628 break;
12629 case 256:
12630 sprintf (scratchbuf, "%%ymm%d", modrm.rm + add);
12631 break;
12632 default:
12633 abort ();
12634 }
12635 }
12636 else
12637 sprintf (scratchbuf, "%%xmm%d", modrm.rm + add);
d708bcba 12638 oappend (scratchbuf + intel_syntax);
c608c12e
AM
12639}
12640
252b5132 12641static void
26ca5450 12642OP_MS (int bytemode, int sizeflag)
252b5132 12643{
7967e09e 12644 if (modrm.mod == 3)
2da11e11
AM
12645 OP_EM (bytemode, sizeflag);
12646 else
6608db57 12647 BadOp ();
252b5132
RH
12648}
12649
992aaec9 12650static void
26ca5450 12651OP_XS (int bytemode, int sizeflag)
992aaec9 12652{
7967e09e 12653 if (modrm.mod == 3)
992aaec9
AM
12654 OP_EX (bytemode, sizeflag);
12655 else
6608db57 12656 BadOp ();
992aaec9
AM
12657}
12658
cc0ec051
AM
12659static void
12660OP_M (int bytemode, int sizeflag)
12661{
7967e09e 12662 if (modrm.mod == 3)
75413a22
L
12663 /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
12664 BadOp ();
cc0ec051
AM
12665 else
12666 OP_E (bytemode, sizeflag);
12667}
12668
12669static void
12670OP_0f07 (int bytemode, int sizeflag)
12671{
7967e09e 12672 if (modrm.mod != 3 || modrm.rm != 0)
cc0ec051
AM
12673 BadOp ();
12674 else
12675 OP_E (bytemode, sizeflag);
12676}
12677
46e883c5 12678/* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
246c51aa 12679 32bit mode and "xchg %rax,%rax" in 64bit mode. */
46e883c5 12680
cc0ec051 12681static void
46e883c5 12682NOP_Fixup1 (int bytemode, int sizeflag)
cc0ec051 12683{
8b38ad71
L
12684 if ((prefixes & PREFIX_DATA) != 0
12685 || (rex != 0
12686 && rex != 0x48
12687 && address_mode == mode_64bit))
46e883c5
L
12688 OP_REG (bytemode, sizeflag);
12689 else
12690 strcpy (obuf, "nop");
12691}
12692
12693static void
12694NOP_Fixup2 (int bytemode, int sizeflag)
12695{
8b38ad71
L
12696 if ((prefixes & PREFIX_DATA) != 0
12697 || (rex != 0
12698 && rex != 0x48
12699 && address_mode == mode_64bit))
46e883c5 12700 OP_IMREG (bytemode, sizeflag);
cc0ec051
AM
12701}
12702
84037f8c 12703static const char *const Suffix3DNow[] = {
252b5132
RH
12704/* 00 */ NULL, NULL, NULL, NULL,
12705/* 04 */ NULL, NULL, NULL, NULL,
12706/* 08 */ NULL, NULL, NULL, NULL,
9e525108 12707/* 0C */ "pi2fw", "pi2fd", NULL, NULL,
252b5132
RH
12708/* 10 */ NULL, NULL, NULL, NULL,
12709/* 14 */ NULL, NULL, NULL, NULL,
12710/* 18 */ NULL, NULL, NULL, NULL,
9e525108 12711/* 1C */ "pf2iw", "pf2id", NULL, NULL,
252b5132
RH
12712/* 20 */ NULL, NULL, NULL, NULL,
12713/* 24 */ NULL, NULL, NULL, NULL,
12714/* 28 */ NULL, NULL, NULL, NULL,
12715/* 2C */ NULL, NULL, NULL, NULL,
12716/* 30 */ NULL, NULL, NULL, NULL,
12717/* 34 */ NULL, NULL, NULL, NULL,
12718/* 38 */ NULL, NULL, NULL, NULL,
12719/* 3C */ NULL, NULL, NULL, NULL,
12720/* 40 */ NULL, NULL, NULL, NULL,
12721/* 44 */ NULL, NULL, NULL, NULL,
12722/* 48 */ NULL, NULL, NULL, NULL,
12723/* 4C */ NULL, NULL, NULL, NULL,
12724/* 50 */ NULL, NULL, NULL, NULL,
12725/* 54 */ NULL, NULL, NULL, NULL,
12726/* 58 */ NULL, NULL, NULL, NULL,
12727/* 5C */ NULL, NULL, NULL, NULL,
12728/* 60 */ NULL, NULL, NULL, NULL,
12729/* 64 */ NULL, NULL, NULL, NULL,
12730/* 68 */ NULL, NULL, NULL, NULL,
12731/* 6C */ NULL, NULL, NULL, NULL,
12732/* 70 */ NULL, NULL, NULL, NULL,
12733/* 74 */ NULL, NULL, NULL, NULL,
12734/* 78 */ NULL, NULL, NULL, NULL,
12735/* 7C */ NULL, NULL, NULL, NULL,
12736/* 80 */ NULL, NULL, NULL, NULL,
12737/* 84 */ NULL, NULL, NULL, NULL,
9e525108
AM
12738/* 88 */ NULL, NULL, "pfnacc", NULL,
12739/* 8C */ NULL, NULL, "pfpnacc", NULL,
252b5132
RH
12740/* 90 */ "pfcmpge", NULL, NULL, NULL,
12741/* 94 */ "pfmin", NULL, "pfrcp", "pfrsqrt",
12742/* 98 */ NULL, NULL, "pfsub", NULL,
12743/* 9C */ NULL, NULL, "pfadd", NULL,
12744/* A0 */ "pfcmpgt", NULL, NULL, NULL,
12745/* A4 */ "pfmax", NULL, "pfrcpit1", "pfrsqit1",
12746/* A8 */ NULL, NULL, "pfsubr", NULL,
12747/* AC */ NULL, NULL, "pfacc", NULL,
12748/* B0 */ "pfcmpeq", NULL, NULL, NULL,
9beff690 12749/* B4 */ "pfmul", NULL, "pfrcpit2", "pmulhrw",
9e525108 12750/* B8 */ NULL, NULL, NULL, "pswapd",
252b5132
RH
12751/* BC */ NULL, NULL, NULL, "pavgusb",
12752/* C0 */ NULL, NULL, NULL, NULL,
12753/* C4 */ NULL, NULL, NULL, NULL,
12754/* C8 */ NULL, NULL, NULL, NULL,
12755/* CC */ NULL, NULL, NULL, NULL,
12756/* D0 */ NULL, NULL, NULL, NULL,
12757/* D4 */ NULL, NULL, NULL, NULL,
12758/* D8 */ NULL, NULL, NULL, NULL,
12759/* DC */ NULL, NULL, NULL, NULL,
12760/* E0 */ NULL, NULL, NULL, NULL,
12761/* E4 */ NULL, NULL, NULL, NULL,
12762/* E8 */ NULL, NULL, NULL, NULL,
12763/* EC */ NULL, NULL, NULL, NULL,
12764/* F0 */ NULL, NULL, NULL, NULL,
12765/* F4 */ NULL, NULL, NULL, NULL,
12766/* F8 */ NULL, NULL, NULL, NULL,
12767/* FC */ NULL, NULL, NULL, NULL,
12768};
12769
12770static void
26ca5450 12771OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132
RH
12772{
12773 const char *mnemonic;
12774
12775 FETCH_DATA (the_info, codep + 1);
12776 /* AMD 3DNow! instructions are specified by an opcode suffix in the
12777 place where an 8-bit immediate would normally go. ie. the last
12778 byte of the instruction. */
ea397f5b 12779 obufp = mnemonicendp;
c608c12e 12780 mnemonic = Suffix3DNow[*codep++ & 0xff];
252b5132 12781 if (mnemonic)
2da11e11 12782 oappend (mnemonic);
252b5132
RH
12783 else
12784 {
12785 /* Since a variable sized modrm/sib chunk is between the start
12786 of the opcode (0x0f0f) and the opcode suffix, we need to do
12787 all the modrm processing first, and don't know until now that
12788 we have a bad opcode. This necessitates some cleaning up. */
ce518a5f
L
12789 op_out[0][0] = '\0';
12790 op_out[1][0] = '\0';
6608db57 12791 BadOp ();
252b5132 12792 }
ea397f5b 12793 mnemonicendp = obufp;
252b5132 12794}
c608c12e 12795
ea397f5b
L
12796static struct op simd_cmp_op[] =
12797{
12798 { STRING_COMMA_LEN ("eq") },
12799 { STRING_COMMA_LEN ("lt") },
12800 { STRING_COMMA_LEN ("le") },
12801 { STRING_COMMA_LEN ("unord") },
12802 { STRING_COMMA_LEN ("neq") },
12803 { STRING_COMMA_LEN ("nlt") },
12804 { STRING_COMMA_LEN ("nle") },
12805 { STRING_COMMA_LEN ("ord") }
c608c12e
AM
12806};
12807
12808static void
ad19981d 12809CMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
c608c12e
AM
12810{
12811 unsigned int cmp_type;
12812
12813 FETCH_DATA (the_info, codep + 1);
12814 cmp_type = *codep++ & 0xff;
c0f3af97 12815 if (cmp_type < ARRAY_SIZE (simd_cmp_op))
c608c12e 12816 {
ad19981d 12817 char suffix [3];
ea397f5b 12818 char *p = mnemonicendp - 2;
ad19981d
L
12819 suffix[0] = p[0];
12820 suffix[1] = p[1];
12821 suffix[2] = '\0';
ea397f5b
L
12822 sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
12823 mnemonicendp += simd_cmp_op[cmp_type].len;
c608c12e
AM
12824 }
12825 else
12826 {
ad19981d
L
12827 /* We have a reserved extension byte. Output it directly. */
12828 scratchbuf[0] = '$';
12829 print_operand_value (scratchbuf + 1, 1, cmp_type);
12830 oappend (scratchbuf + intel_syntax);
12831 scratchbuf[0] = '\0';
c608c12e
AM
12832 }
12833}
12834
ca164297 12835static void
b844680a
L
12836OP_Mwait (int bytemode ATTRIBUTE_UNUSED,
12837 int sizeflag ATTRIBUTE_UNUSED)
12838{
12839 /* mwait %eax,%ecx */
12840 if (!intel_syntax)
12841 {
12842 const char **names = (address_mode == mode_64bit
12843 ? names64 : names32);
12844 strcpy (op_out[0], names[0]);
12845 strcpy (op_out[1], names[1]);
12846 two_source_ops = 1;
12847 }
12848 /* Skip mod/rm byte. */
12849 MODRM_CHECK;
12850 codep++;
12851}
12852
12853static void
12854OP_Monitor (int bytemode ATTRIBUTE_UNUSED,
12855 int sizeflag ATTRIBUTE_UNUSED)
ca164297 12856{
b844680a
L
12857 /* monitor %eax,%ecx,%edx" */
12858 if (!intel_syntax)
ca164297 12859 {
b844680a 12860 const char **op1_names;
cb712a9e
L
12861 const char **names = (address_mode == mode_64bit
12862 ? names64 : names32);
1d9f512f 12863
b844680a
L
12864 if (!(prefixes & PREFIX_ADDR))
12865 op1_names = (address_mode == mode_16bit
12866 ? names16 : names);
ca164297
L
12867 else
12868 {
b844680a
L
12869 /* Remove "addr16/addr32". */
12870 addr_prefix = NULL;
12871 op1_names = (address_mode != mode_32bit
12872 ? names32 : names16);
12873 used_prefixes |= PREFIX_ADDR;
ca164297 12874 }
b844680a
L
12875 strcpy (op_out[0], op1_names[0]);
12876 strcpy (op_out[1], names[1]);
12877 strcpy (op_out[2], names[2]);
12878 two_source_ops = 1;
ca164297 12879 }
b844680a
L
12880 /* Skip mod/rm byte. */
12881 MODRM_CHECK;
12882 codep++;
30123838
JB
12883}
12884
6608db57
KH
12885static void
12886BadOp (void)
2da11e11 12887{
6608db57
KH
12888 /* Throw away prefixes and 1st. opcode byte. */
12889 codep = insn_codep + 1;
2da11e11
AM
12890 oappend ("(bad)");
12891}
4cc91dba 12892
35c52694
L
12893static void
12894REP_Fixup (int bytemode, int sizeflag)
12895{
12896 /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
12897 lods and stos. */
35c52694 12898 if (prefixes & PREFIX_REPZ)
b844680a 12899 repz_prefix = "rep ";
35c52694
L
12900
12901 switch (bytemode)
12902 {
12903 case al_reg:
12904 case eAX_reg:
12905 case indir_dx_reg:
12906 OP_IMREG (bytemode, sizeflag);
12907 break;
12908 case eDI_reg:
12909 OP_ESreg (bytemode, sizeflag);
12910 break;
12911 case eSI_reg:
12912 OP_DSreg (bytemode, sizeflag);
12913 break;
12914 default:
12915 abort ();
12916 break;
12917 }
12918}
f5804c90
L
12919
12920static void
12921CMPXCHG8B_Fixup (int bytemode, int sizeflag)
12922{
161a04f6
L
12923 USED_REX (REX_W);
12924 if (rex & REX_W)
f5804c90
L
12925 {
12926 /* Change cmpxchg8b to cmpxchg16b. */
ea397f5b
L
12927 char *p = mnemonicendp - 2;
12928 mnemonicendp = stpcpy (p, "16b");
fb9c77c7 12929 bytemode = o_mode;
f5804c90
L
12930 }
12931 OP_M (bytemode, sizeflag);
12932}
42903f7f
L
12933
12934static void
12935XMM_Fixup (int reg, int sizeflag ATTRIBUTE_UNUSED)
12936{
c0f3af97
L
12937 if (need_vex)
12938 {
12939 switch (vex.length)
12940 {
12941 case 128:
12942 sprintf (scratchbuf, "%%xmm%d", reg);
12943 break;
12944 case 256:
12945 sprintf (scratchbuf, "%%ymm%d", reg);
12946 break;
12947 default:
12948 abort ();
12949 }
12950 }
12951 else
12952 sprintf (scratchbuf, "%%xmm%d", reg);
42903f7f
L
12953 oappend (scratchbuf + intel_syntax);
12954}
381d071f
L
12955
12956static void
12957CRC32_Fixup (int bytemode, int sizeflag)
12958{
12959 /* Add proper suffix to "crc32". */
ea397f5b 12960 char *p = mnemonicendp;
381d071f
L
12961
12962 switch (bytemode)
12963 {
12964 case b_mode:
20592a94 12965 if (intel_syntax)
ea397f5b 12966 goto skip;
20592a94 12967
381d071f
L
12968 *p++ = 'b';
12969 break;
12970 case v_mode:
20592a94 12971 if (intel_syntax)
ea397f5b 12972 goto skip;
20592a94 12973
381d071f
L
12974 USED_REX (REX_W);
12975 if (rex & REX_W)
12976 *p++ = 'q';
9344ff29 12977 else if (sizeflag & DFLAG)
20592a94 12978 *p++ = 'l';
381d071f 12979 else
9344ff29
L
12980 *p++ = 'w';
12981 used_prefixes |= (prefixes & PREFIX_DATA);
381d071f
L
12982 break;
12983 default:
12984 oappend (INTERNAL_DISASSEMBLER_ERROR);
12985 break;
12986 }
ea397f5b 12987 mnemonicendp = p;
381d071f
L
12988 *p = '\0';
12989
ea397f5b 12990skip:
381d071f
L
12991 if (modrm.mod == 3)
12992 {
12993 int add;
12994
12995 /* Skip mod/rm byte. */
12996 MODRM_CHECK;
12997 codep++;
12998
12999 USED_REX (REX_B);
13000 add = (rex & REX_B) ? 8 : 0;
13001 if (bytemode == b_mode)
13002 {
13003 USED_REX (0);
13004 if (rex)
13005 oappend (names8rex[modrm.rm + add]);
13006 else
13007 oappend (names8[modrm.rm + add]);
13008 }
13009 else
13010 {
13011 USED_REX (REX_W);
13012 if (rex & REX_W)
13013 oappend (names64[modrm.rm + add]);
13014 else if ((prefixes & PREFIX_DATA))
13015 oappend (names16[modrm.rm + add]);
13016 else
13017 oappend (names32[modrm.rm + add]);
13018 }
13019 }
13020 else
9344ff29 13021 OP_E (bytemode, sizeflag);
381d071f 13022}
85f10a01
MM
13023
13024/* Print a DREX argument as either a register or memory operation. */
13025static void
13026print_drex_arg (unsigned int reg, int bytemode, int sizeflag)
13027{
13028 if (reg == DREX_REG_UNKNOWN)
13029 BadOp ();
13030
13031 else if (reg != DREX_REG_MEMORY)
13032 {
13033 sprintf (scratchbuf, "%%xmm%d", reg);
13034 oappend (scratchbuf + intel_syntax);
13035 }
13036
13037 else
13038 OP_E_extended (bytemode, sizeflag, 1);
13039}
13040
13041/* SSE5 instructions that have 4 arguments are encoded as:
13042 0f 24 <sub-opcode> <modrm> <optional-sib> <drex> <offset>.
13043
13044 The <sub-opcode> byte has 1 bit (0x4) that is combined with 1 bit in
13045 the DREX field (0x8) to determine how the arguments are laid out.
13046 The destination register must be the same register as one of the
13047 inputs, and it is encoded in the DREX byte. No REX prefix is used
13048 for these instructions, since the DREX field contains the 3 extension
13049 bits provided by the REX prefix.
13050
13051 The bytemode argument adds 2 extra bits for passing extra information:
13052 DREX_OC1 -- Set the OC1 bit to indicate dest == 1st arg
13053 DREX_NO_OC0 -- OC0 in DREX is invalid
13054 (but pretend it is set). */
13055
13056static void
13057OP_DREX4 (int flag_bytemode, int sizeflag)
13058{
13059 unsigned int drex_byte;
13060 unsigned int regs[4];
13061 unsigned int modrm_regmem;
13062 unsigned int modrm_reg;
13063 unsigned int drex_reg;
13064 int bytemode;
13065 int rex_save = rex;
13066 int rex_used_save = rex_used;
13067 int has_sib = 0;
13068 int oc1 = (flag_bytemode & DREX_OC1) ? 2 : 0;
13069 int oc0;
13070 int i;
13071
13072 bytemode = flag_bytemode & ~ DREX_MASK;
13073
13074 for (i = 0; i < 4; i++)
13075 regs[i] = DREX_REG_UNKNOWN;
13076
13077 /* Determine if we have a SIB byte in addition to MODRM before the
13078 DREX byte. */
13079 if (((sizeflag & AFLAG) || address_mode == mode_64bit)
13080 && (modrm.mod != 3)
13081 && (modrm.rm == 4))
13082 has_sib = 1;
13083
13084 /* Get the DREX byte. */
13085 FETCH_DATA (the_info, codep + 2 + has_sib);
13086 drex_byte = codep[has_sib+1];
13087 drex_reg = DREX_XMM (drex_byte);
13088 modrm_reg = modrm.reg + ((drex_byte & REX_R) ? 8 : 0);
13089
13090 /* Is OC0 legal? If not, hardwire oc0 == 1. */
13091 if (flag_bytemode & DREX_NO_OC0)
13092 {
13093 oc0 = 1;
13094 if (DREX_OC0 (drex_byte))
13095 BadOp ();
13096 }
13097 else
13098 oc0 = DREX_OC0 (drex_byte);
13099
13100 if (modrm.mod == 3)
13101 {
13102 /* regmem == register */
13103 modrm_regmem = modrm.rm + ((drex_byte & REX_B) ? 8 : 0);
13104 rex = rex_used = 0;
13105 /* skip modrm/drex since we don't call OP_E_extended */
13106 codep += 2;
13107 }
13108 else
13109 {
13110 /* regmem == memory, fill in appropriate REX bits */
13111 modrm_regmem = DREX_REG_MEMORY;
13112 rex = drex_byte & (REX_B | REX_X | REX_R);
13113 if (rex)
13114 rex |= REX_OPCODE;
13115 rex_used = rex;
13116 }
13117
13118 /* Based on the OC1/OC0 bits, lay out the arguments in the correct
13119 order. */
13120 switch (oc0 + oc1)
13121 {
13122 default:
13123 BadOp ();
13124 return;
13125
13126 case 0:
13127 regs[0] = modrm_regmem;
13128 regs[1] = modrm_reg;
13129 regs[2] = drex_reg;
13130 regs[3] = drex_reg;
13131 break;
13132
13133 case 1:
13134 regs[0] = modrm_reg;
13135 regs[1] = modrm_regmem;
13136 regs[2] = drex_reg;
13137 regs[3] = drex_reg;
13138 break;
13139
13140 case 2:
13141 regs[0] = drex_reg;
13142 regs[1] = modrm_regmem;
13143 regs[2] = modrm_reg;
13144 regs[3] = drex_reg;
13145 break;
13146
13147 case 3:
13148 regs[0] = drex_reg;
13149 regs[1] = modrm_reg;
13150 regs[2] = modrm_regmem;
13151 regs[3] = drex_reg;
13152 break;
13153 }
13154
13155 /* Print out the arguments. */
13156 for (i = 0; i < 4; i++)
13157 {
13158 int j = (intel_syntax) ? 3 - i : i;
13159 if (i > 0)
13160 {
13161 *obufp++ = ',';
13162 *obufp = '\0';
13163 }
13164
13165 print_drex_arg (regs[j], bytemode, sizeflag);
13166 }
13167
13168 rex = rex_save;
13169 rex_used = rex_used_save;
13170}
13171
13172/* SSE5 instructions that have 3 arguments, and are encoded as:
13173 0f 24 <sub-opcode> <modrm> <optional-sib> <drex> <offset> (or)
13174 0f 25 <sub-opcode> <modrm> <optional-sib> <drex> <offset> <cmp-byte>
13175
13176 The DREX field has 1 bit (0x8) to determine how the arguments are
13177 laid out. The destination register is encoded in the DREX byte.
13178 No REX prefix is used for these instructions, since the DREX field
13179 contains the 3 extension bits provided by the REX prefix. */
13180
13181static void
13182OP_DREX3 (int flag_bytemode, int sizeflag)
13183{
13184 unsigned int drex_byte;
13185 unsigned int regs[3];
13186 unsigned int modrm_regmem;
13187 unsigned int modrm_reg;
13188 unsigned int drex_reg;
13189 int bytemode;
13190 int rex_save = rex;
13191 int rex_used_save = rex_used;
13192 int has_sib = 0;
13193 int oc0;
13194 int i;
13195
13196 bytemode = flag_bytemode & ~ DREX_MASK;
13197
13198 for (i = 0; i < 3; i++)
13199 regs[i] = DREX_REG_UNKNOWN;
13200
13201 /* Determine if we have a SIB byte in addition to MODRM before the
13202 DREX byte. */
13203 if (((sizeflag & AFLAG) || address_mode == mode_64bit)
13204 && (modrm.mod != 3)
13205 && (modrm.rm == 4))
13206 has_sib = 1;
13207
13208 /* Get the DREX byte. */
13209 FETCH_DATA (the_info, codep + 2 + has_sib);
13210 drex_byte = codep[has_sib+1];
13211 drex_reg = DREX_XMM (drex_byte);
13212 modrm_reg = modrm.reg + ((drex_byte & REX_R) ? 8 : 0);
13213
13214 /* Is OC0 legal? If not, hardwire oc0 == 0 */
13215 oc0 = DREX_OC0 (drex_byte);
13216 if ((flag_bytemode & DREX_NO_OC0) && oc0)
13217 BadOp ();
13218
13219 if (modrm.mod == 3)
13220 {
13221 /* regmem == register */
13222 modrm_regmem = modrm.rm + ((drex_byte & REX_B) ? 8 : 0);
13223 rex = rex_used = 0;
13224 /* skip modrm/drex since we don't call OP_E_extended. */
13225 codep += 2;
13226 }
13227 else
13228 {
13229 /* regmem == memory, fill in appropriate REX bits. */
13230 modrm_regmem = DREX_REG_MEMORY;
13231 rex = drex_byte & (REX_B | REX_X | REX_R);
13232 if (rex)
13233 rex |= REX_OPCODE;
13234 rex_used = rex;
13235 }
13236
13237 /* Based on the OC1/OC0 bits, lay out the arguments in the correct
13238 order. */
13239 switch (oc0)
13240 {
13241 default:
13242 BadOp ();
13243 return;
13244
13245 case 0:
13246 regs[0] = modrm_regmem;
13247 regs[1] = modrm_reg;
13248 regs[2] = drex_reg;
13249 break;
13250
13251 case 1:
13252 regs[0] = modrm_reg;
13253 regs[1] = modrm_regmem;
13254 regs[2] = drex_reg;
13255 break;
13256 }
13257
13258 /* Print out the arguments. */
13259 for (i = 0; i < 3; i++)
13260 {
13261 int j = (intel_syntax) ? 2 - i : i;
13262 if (i > 0)
13263 {
13264 *obufp++ = ',';
13265 *obufp = '\0';
13266 }
13267
13268 print_drex_arg (regs[j], bytemode, sizeflag);
13269 }
13270
13271 rex = rex_save;
13272 rex_used = rex_used_save;
13273}
13274
13275/* Emit a floating point comparison for comp<xx> instructions. */
13276
13277static void
13278OP_DREX_FCMP (int bytemode ATTRIBUTE_UNUSED,
13279 int sizeflag ATTRIBUTE_UNUSED)
13280{
13281 unsigned char byte;
13282
13283 static const char *const cmp_test[] = {
13284 "eq",
13285 "lt",
13286 "le",
13287 "unord",
13288 "ne",
13289 "nlt",
13290 "nle",
13291 "ord",
13292 "ueq",
13293 "ult",
13294 "ule",
13295 "false",
13296 "une",
13297 "unlt",
13298 "unle",
13299 "true"
13300 };
13301
13302 FETCH_DATA (the_info, codep + 1);
13303 byte = *codep & 0xff;
13304
13305 if (byte >= ARRAY_SIZE (cmp_test)
13306 || obuf[0] != 'c'
13307 || obuf[1] != 'o'
13308 || obuf[2] != 'm')
13309 {
13310 /* The instruction isn't one we know about, so just append the
13311 extension byte as a numeric value. */
13312 OP_I (b_mode, 0);
13313 }
13314
13315 else
13316 {
13317 sprintf (scratchbuf, "com%s%s", cmp_test[byte], obuf+3);
ea397f5b 13318 mnemonicendp = stpcpy (obuf, scratchbuf);
85f10a01
MM
13319 codep++;
13320 }
13321}
13322
13323/* Emit an integer point comparison for pcom<xx> instructions,
13324 rewriting the instruction to have the test inside of it. */
13325
13326static void
13327OP_DREX_ICMP (int bytemode ATTRIBUTE_UNUSED,
13328 int sizeflag ATTRIBUTE_UNUSED)
13329{
13330 unsigned char byte;
13331
13332 static const char *const cmp_test[] = {
13333 "lt",
13334 "le",
13335 "gt",
13336 "ge",
13337 "eq",
13338 "ne",
13339 "false",
13340 "true"
13341 };
13342
13343 FETCH_DATA (the_info, codep + 1);
13344 byte = *codep & 0xff;
13345
13346 if (byte >= ARRAY_SIZE (cmp_test)
13347 || obuf[0] != 'p'
13348 || obuf[1] != 'c'
13349 || obuf[2] != 'o'
13350 || obuf[3] != 'm')
13351 {
13352 /* The instruction isn't one we know about, so just print the
13353 comparison test byte as a numeric value. */
13354 OP_I (b_mode, 0);
13355 }
13356
13357 else
13358 {
13359 sprintf (scratchbuf, "pcom%s%s", cmp_test[byte], obuf+4);
ea397f5b 13360 mnemonicendp = stpcpy (obuf, scratchbuf);
85f10a01
MM
13361 codep++;
13362 }
13363}
c0f3af97
L
13364
13365/* Display the destination register operand for instructions with
13366 VEX. */
13367
13368static void
13369OP_VEX (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13370{
13371 if (!need_vex)
13372 abort ();
13373
13374 if (!need_vex_reg)
13375 return;
13376
13377 switch (vex.length)
13378 {
13379 case 128:
13380 switch (bytemode)
13381 {
13382 case vex_mode:
13383 case vex128_mode:
13384 break;
13385 default:
13386 abort ();
13387 return;
13388 }
13389
13390 sprintf (scratchbuf, "%%xmm%d", vex.register_specifier);
13391 break;
13392 case 256:
13393 switch (bytemode)
13394 {
13395 case vex_mode:
13396 case vex256_mode:
13397 break;
13398 default:
13399 abort ();
13400 return;
13401 }
13402
13403 sprintf (scratchbuf, "%%ymm%d", vex.register_specifier);
13404 break;
13405 default:
13406 abort ();
13407 break;
13408 }
13409 oappend (scratchbuf + intel_syntax);
13410}
13411
dae39acc 13412/* Get the VEX immediate byte without moving codep. */
c0f3af97 13413
dae39acc
L
13414static unsigned char
13415get_vex_imm8 (int sizeflag)
13416{
13417 int bytes_before_imm = 0;
c0f3af97 13418
dae39acc
L
13419 /* Skip mod/rm byte. */
13420 MODRM_CHECK;
13421 codep++;
c0f3af97 13422
dae39acc
L
13423 if (modrm.mod != 3)
13424 {
13425 /* There are SIB/displacement bytes. */
13426 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
c0f3af97 13427 {
dae39acc
L
13428 /* 32/64 bit address mode */
13429 int base = modrm.rm;
c0f3af97 13430
dae39acc
L
13431 /* Check SIB byte. */
13432 if (base == 4)
13433 {
13434 FETCH_DATA (the_info, codep + 1);
13435 base = *codep & 7;
13436 bytes_before_imm++;
13437 }
c0f3af97 13438
dae39acc
L
13439 switch (modrm.mod)
13440 {
13441 case 0:
13442 /* When modrm.rm == 5 or modrm.rm == 4 and base in
13443 SIB == 5, there is a 4 byte displacement. */
13444 if (base != 5)
13445 /* No displacement. */
13446 break;
13447 case 2:
13448 /* 4 byte displacement. */
13449 bytes_before_imm += 4;
13450 break;
13451 case 1:
13452 /* 1 byte displacement. */
13453 bytes_before_imm++;
13454 break;
c0f3af97 13455 }
dae39acc
L
13456 }
13457 else
13458 { /* 16 bit address mode */
13459 switch (modrm.mod)
13460 {
13461 case 0:
13462 /* When modrm.rm == 6, there is a 2 byte displacement. */
13463 if (modrm.rm != 6)
13464 /* No displacement. */
13465 break;
13466 case 2:
13467 /* 2 byte displacement. */
13468 bytes_before_imm += 2;
13469 break;
13470 case 1:
13471 /* 1 byte displacement. */
13472 bytes_before_imm++;
13473 break;
c0f3af97
L
13474 }
13475 }
c0f3af97
L
13476 }
13477
dae39acc
L
13478 FETCH_DATA (the_info, codep + bytes_before_imm + 1);
13479 return codep [bytes_before_imm];
13480}
13481
13482static void
13483OP_EX_VexReg (int bytemode, int sizeflag, int reg)
13484{
c0f3af97
L
13485 if (reg == -1 && modrm.mod != 3)
13486 {
13487 OP_E_memory (bytemode, sizeflag, 0);
13488 return;
13489 }
13490 else
13491 {
13492 if (reg == -1)
13493 {
13494 reg = modrm.rm;
13495 USED_REX (REX_B);
13496 if (rex & REX_B)
13497 reg += 8;
13498 }
13499 else if (reg > 7 && address_mode != mode_64bit)
13500 BadOp ();
13501 }
13502
13503 switch (vex.length)
13504 {
13505 case 128:
13506 sprintf (scratchbuf, "%%xmm%d", reg);
13507 break;
13508 case 256:
13509 sprintf (scratchbuf, "%%ymm%d", reg);
13510 break;
13511 default:
13512 abort ();
13513 }
13514 oappend (scratchbuf + intel_syntax);
13515}
13516
dae39acc
L
13517static void
13518OP_EX_VexImmW (int bytemode, int sizeflag)
13519{
13520 int reg = -1;
13521 static unsigned char vex_imm8;
13522
13523 if (!vex_w_done)
13524 {
13525 vex_imm8 = get_vex_imm8 (sizeflag);
13526 if (vex.w)
13527 reg = vex_imm8 >> 4;
13528 vex_w_done = 1;
13529 }
13530 else
13531 {
13532 if (!vex.w)
13533 reg = vex_imm8 >> 4;
13534 }
13535
13536 OP_EX_VexReg (bytemode, sizeflag, reg);
13537}
13538
13539static void
13540OP_EX_VexW (int bytemode, int sizeflag)
13541{
13542 int reg = -1;
13543
13544 if (!vex_w_done)
13545 {
13546 vex_w_done = 1;
13547 if (vex.w)
13548 reg = vex.register_specifier;
13549 }
13550 else
13551 {
13552 if (!vex.w)
13553 reg = vex.register_specifier;
13554 }
13555
13556 OP_EX_VexReg (bytemode, sizeflag, reg);
13557}
13558
13559static void
13560OP_VEX_FMA (int bytemode, int sizeflag)
13561{
13562 int reg = get_vex_imm8 (sizeflag) >> 4;
13563
13564 if (reg > 7 && address_mode != mode_64bit)
13565 BadOp ();
13566
13567 switch (vex.length)
13568 {
13569 case 128:
13570 switch (bytemode)
13571 {
13572 case vex_mode:
13573 case vex128_mode:
13574 break;
13575 default:
13576 abort ();
13577 return;
13578 }
13579
13580 sprintf (scratchbuf, "%%xmm%d", reg);
13581 break;
13582 case 256:
13583 switch (bytemode)
13584 {
13585 case vex_mode:
13586 break;
13587 default:
13588 abort ();
13589 return;
13590 }
13591
13592 sprintf (scratchbuf, "%%ymm%d", reg);
13593 break;
13594 default:
13595 abort ();
13596 }
13597 oappend (scratchbuf + intel_syntax);
13598}
13599
c0f3af97
L
13600static void
13601VEXI4_Fixup (int bytemode ATTRIBUTE_UNUSED,
13602 int sizeflag ATTRIBUTE_UNUSED)
13603{
13604 /* Skip the immediate byte and check for invalid bits. */
13605 FETCH_DATA (the_info, codep + 1);
13606 if (*codep++ & 0xf)
13607 BadOp ();
13608}
13609
13610static void
13611OP_REG_VexI4 (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13612{
13613 int reg;
13614 FETCH_DATA (the_info, codep + 1);
13615 reg = *codep++;
13616
13617 if (bytemode != x_mode)
13618 abort ();
13619
13620 if (reg & 0xf)
13621 BadOp ();
13622
13623 reg >>= 4;
dae39acc
L
13624 if (reg > 7 && address_mode != mode_64bit)
13625 BadOp ();
13626
c0f3af97
L
13627 switch (vex.length)
13628 {
13629 case 128:
13630 sprintf (scratchbuf, "%%xmm%d", reg);
13631 break;
13632 case 256:
13633 sprintf (scratchbuf, "%%ymm%d", reg);
13634 break;
13635 default:
13636 abort ();
13637 }
13638 oappend (scratchbuf + intel_syntax);
13639}
13640
13641static void
13642OP_XMM_VexW (int bytemode, int sizeflag)
13643{
13644 /* Turn off the REX.W bit since it is used for swapping operands
13645 now. */
13646 rex &= ~REX_W;
13647 OP_XMM (bytemode, sizeflag);
13648}
13649
13650static void
13651OP_EX_Vex (int bytemode, int sizeflag)
13652{
13653 if (modrm.mod != 3)
13654 {
13655 if (vex.register_specifier != 0)
13656 BadOp ();
13657 need_vex_reg = 0;
13658 }
13659 OP_EX (bytemode, sizeflag);
13660}
13661
13662static void
13663OP_XMM_Vex (int bytemode, int sizeflag)
13664{
13665 if (modrm.mod != 3)
13666 {
13667 if (vex.register_specifier != 0)
13668 BadOp ();
13669 need_vex_reg = 0;
13670 }
13671 OP_XMM (bytemode, sizeflag);
13672}
13673
13674static void
13675VZERO_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13676{
13677 switch (vex.length)
13678 {
13679 case 128:
ea397f5b 13680 mnemonicendp = stpcpy (obuf, "vzeroupper");
c0f3af97
L
13681 break;
13682 case 256:
ea397f5b 13683 mnemonicendp = stpcpy (obuf, "vzeroall");
c0f3af97
L
13684 break;
13685 default:
13686 abort ();
13687 }
13688}
13689
ea397f5b
L
13690static struct op vex_cmp_op[] =
13691{
13692 { STRING_COMMA_LEN ("eq") },
13693 { STRING_COMMA_LEN ("lt") },
13694 { STRING_COMMA_LEN ("le") },
13695 { STRING_COMMA_LEN ("unord") },
13696 { STRING_COMMA_LEN ("neq") },
13697 { STRING_COMMA_LEN ("nlt") },
13698 { STRING_COMMA_LEN ("nle") },
13699 { STRING_COMMA_LEN ("ord") },
13700 { STRING_COMMA_LEN ("eq_uq") },
13701 { STRING_COMMA_LEN ("nge") },
13702 { STRING_COMMA_LEN ("ngt") },
13703 { STRING_COMMA_LEN ("false") },
13704 { STRING_COMMA_LEN ("neq_oq") },
13705 { STRING_COMMA_LEN ("ge") },
13706 { STRING_COMMA_LEN ("gt") },
13707 { STRING_COMMA_LEN ("true") },
13708 { STRING_COMMA_LEN ("eq_os") },
13709 { STRING_COMMA_LEN ("lt_oq") },
13710 { STRING_COMMA_LEN ("le_oq") },
13711 { STRING_COMMA_LEN ("unord_s") },
13712 { STRING_COMMA_LEN ("neq_us") },
13713 { STRING_COMMA_LEN ("nlt_uq") },
13714 { STRING_COMMA_LEN ("nle_uq") },
13715 { STRING_COMMA_LEN ("ord_s") },
13716 { STRING_COMMA_LEN ("eq_us") },
13717 { STRING_COMMA_LEN ("nge_uq") },
13718 { STRING_COMMA_LEN ("ngt_uq") },
13719 { STRING_COMMA_LEN ("false_os") },
13720 { STRING_COMMA_LEN ("neq_os") },
13721 { STRING_COMMA_LEN ("ge_oq") },
13722 { STRING_COMMA_LEN ("gt_oq") },
13723 { STRING_COMMA_LEN ("true_us") },
c0f3af97
L
13724};
13725
13726static void
13727VCMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13728{
13729 unsigned int cmp_type;
13730
13731 FETCH_DATA (the_info, codep + 1);
13732 cmp_type = *codep++ & 0xff;
13733 if (cmp_type < ARRAY_SIZE (vex_cmp_op))
13734 {
13735 char suffix [3];
ea397f5b 13736 char *p = mnemonicendp - 2;
c0f3af97
L
13737 suffix[0] = p[0];
13738 suffix[1] = p[1];
13739 suffix[2] = '\0';
ea397f5b
L
13740 sprintf (p, "%s%s", vex_cmp_op[cmp_type].name, suffix);
13741 mnemonicendp += vex_cmp_op[cmp_type].len;
c0f3af97
L
13742 }
13743 else
13744 {
13745 /* We have a reserved extension byte. Output it directly. */
13746 scratchbuf[0] = '$';
13747 print_operand_value (scratchbuf + 1, 1, cmp_type);
13748 oappend (scratchbuf + intel_syntax);
13749 scratchbuf[0] = '\0';
13750 }
13751}
13752
ea397f5b
L
13753static const struct op pclmul_op[] =
13754{
13755 { STRING_COMMA_LEN ("lql") },
13756 { STRING_COMMA_LEN ("hql") },
13757 { STRING_COMMA_LEN ("lqh") },
13758 { STRING_COMMA_LEN ("hqh") }
c0f3af97
L
13759};
13760
13761static void
13762PCLMUL_Fixup (int bytemode ATTRIBUTE_UNUSED,
13763 int sizeflag ATTRIBUTE_UNUSED)
13764{
13765 unsigned int pclmul_type;
13766
13767 FETCH_DATA (the_info, codep + 1);
13768 pclmul_type = *codep++ & 0xff;
13769 switch (pclmul_type)
13770 {
13771 case 0x10:
13772 pclmul_type = 2;
13773 break;
13774 case 0x11:
13775 pclmul_type = 3;
13776 break;
13777 default:
13778 break;
13779 }
13780 if (pclmul_type < ARRAY_SIZE (pclmul_op))
13781 {
13782 char suffix [4];
ea397f5b 13783 char *p = mnemonicendp - 3;
c0f3af97
L
13784 suffix[0] = p[0];
13785 suffix[1] = p[1];
13786 suffix[2] = p[2];
13787 suffix[3] = '\0';
ea397f5b
L
13788 sprintf (p, "%s%s", pclmul_op[pclmul_type].name, suffix);
13789 mnemonicendp += pclmul_op[pclmul_type].len;
c0f3af97
L
13790 }
13791 else
13792 {
13793 /* We have a reserved extension byte. Output it directly. */
13794 scratchbuf[0] = '$';
13795 print_operand_value (scratchbuf + 1, 1, pclmul_type);
13796 oappend (scratchbuf + intel_syntax);
13797 scratchbuf[0] = '\0';
13798 }
13799}
13800
ea397f5b
L
13801static const struct op vpermil2_op[] =
13802{
13803 { STRING_COMMA_LEN ("td") },
13804 { STRING_COMMA_LEN ("td") },
13805 { STRING_COMMA_LEN ("mo") },
13806 { STRING_COMMA_LEN ("mz") }
c0f3af97
L
13807};
13808
13809static void
13810VPERMIL2_Fixup (int bytemode ATTRIBUTE_UNUSED,
13811 int sizeflag ATTRIBUTE_UNUSED)
13812{
13813 unsigned int vpermil2_type;
13814
13815 FETCH_DATA (the_info, codep + 1);
13816 vpermil2_type = *codep++ & 0xf;
13817 if (vpermil2_type < ARRAY_SIZE (vpermil2_op))
13818 {
13819 char suffix [4];
ea397f5b 13820 char *p = mnemonicendp - 3;
c0f3af97
L
13821 suffix[0] = p[0];
13822 suffix[1] = p[1];
13823 suffix[2] = p[2];
13824 suffix[3] = '\0';
ea397f5b
L
13825 sprintf (p, "%s%s", vpermil2_op[vpermil2_type].name, suffix);
13826 mnemonicendp += vpermil2_op[vpermil2_type].len;
c0f3af97
L
13827 }
13828 else
13829 {
13830 /* We have a reserved extension byte. Output it directly. */
13831 scratchbuf[0] = '$';
13832 print_operand_value (scratchbuf + 1, 1, vpermil2_type);
13833 oappend (scratchbuf + intel_syntax);
13834 scratchbuf[0] = '\0';
13835 }
13836}
f1f8f695
L
13837
13838static void
13839MOVBE_Fixup (int bytemode, int sizeflag)
13840{
13841 /* Add proper suffix to "movbe". */
ea397f5b 13842 char *p = mnemonicendp;
f1f8f695
L
13843
13844 switch (bytemode)
13845 {
13846 case v_mode:
13847 if (intel_syntax)
ea397f5b 13848 goto skip;
f1f8f695
L
13849
13850 USED_REX (REX_W);
13851 if (sizeflag & SUFFIX_ALWAYS)
13852 {
13853 if (rex & REX_W)
13854 *p++ = 'q';
13855 else if (sizeflag & DFLAG)
13856 *p++ = 'l';
13857 else
13858 *p++ = 'w';
13859 }
13860 used_prefixes |= (prefixes & PREFIX_DATA);
13861 break;
13862 default:
13863 oappend (INTERNAL_DISASSEMBLER_ERROR);
13864 break;
13865 }
ea397f5b 13866 mnemonicendp = p;
f1f8f695
L
13867 *p = '\0';
13868
ea397f5b 13869skip:
f1f8f695
L
13870 OP_M (bytemode, sizeflag);
13871}