x86: drop Rm and the 'L' macro
[deliverable/binutils-gdb.git] / opcodes / i386-dis.c
CommitLineData
252b5132 1/* Print i386 instructions for GDB, the GNU debugger.
b3adc24a 2 Copyright (C) 1988-2020 Free Software Foundation, Inc.
252b5132 3
9b201bb5 4 This file is part of the GNU opcodes library.
20f0a1fc 5
9b201bb5 6 This library is free software; you can redistribute it and/or modify
20f0a1fc 7 it under the terms of the GNU General Public License as published by
9b201bb5
NC
8 the Free Software Foundation; either version 3, or (at your option)
9 any later version.
20f0a1fc 10
9b201bb5
NC
11 It is distributed in the hope that it will be useful, but WITHOUT
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
14 License for more details.
20f0a1fc
NC
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
9b201bb5
NC
18 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19 MA 02110-1301, USA. */
20
20f0a1fc
NC
21
22/* 80386 instruction printer by Pace Willisson (pace@prep.ai.mit.edu)
23 July 1988
24 modified by John Hassey (hassey@dg-rtp.dg.com)
25 x86-64 support added by Jan Hubicka (jh@suse.cz)
26 VIA PadLock support by Michal Ludvig (mludvig@suse.cz). */
27
28/* The main tables describing the instructions is essentially a copy
29 of the "Opcode Map" chapter (Appendix A) of the Intel 80386
30 Programmers Manual. Usually, there is a capital letter, followed
31 by a small letter. The capital letter tell the addressing mode,
32 and the small letter tells about the operand size. Refer to
33 the Intel manual for details. */
252b5132 34
252b5132 35#include "sysdep.h"
88c1242d 36#include "disassemble.h"
252b5132 37#include "opintl.h"
0b1cf022 38#include "opcode/i386.h"
85f10a01 39#include "libiberty.h"
5b872f7d 40#include "safe-ctype.h"
252b5132
RH
41
42#include <setjmp.h>
43
26ca5450
AJ
44static int print_insn (bfd_vma, disassemble_info *);
45static void dofloat (int);
46static void OP_ST (int, int);
47static void OP_STi (int, int);
48static int putop (const char *, int);
49static void oappend (const char *);
50static void append_seg (void);
51static void OP_indirE (int, int);
52static void print_operand_value (char *, int, bfd_vma);
c0f3af97 53static void OP_E_register (int, int);
c1e679ec 54static void OP_E_memory (int, int);
5d669648 55static void print_displacement (char *, bfd_vma);
26ca5450
AJ
56static void OP_E (int, int);
57static void OP_G (int, int);
58static bfd_vma get64 (void);
59static bfd_signed_vma get32 (void);
60static bfd_signed_vma get32s (void);
61static int get16 (void);
62static void set_op (bfd_vma, int);
b844680a 63static void OP_Skip_MODRM (int, int);
26ca5450
AJ
64static void OP_REG (int, int);
65static void OP_IMREG (int, int);
66static void OP_I (int, int);
67static void OP_I64 (int, int);
68static void OP_sI (int, int);
69static void OP_J (int, int);
70static void OP_SEG (int, int);
71static void OP_DIR (int, int);
72static void OP_OFF (int, int);
73static void OP_OFF64 (int, int);
74static void ptr_reg (int, int);
75static void OP_ESreg (int, int);
76static void OP_DSreg (int, int);
77static void OP_C (int, int);
78static void OP_D (int, int);
79static void OP_T (int, int);
26ca5450
AJ
80static void OP_MMX (int, int);
81static void OP_XMM (int, int);
82static void OP_EM (int, int);
83static void OP_EX (int, int);
4d9567e0
MM
84static void OP_EMC (int,int);
85static void OP_MXC (int,int);
26ca5450
AJ
86static void OP_MS (int, int);
87static void OP_XS (int, int);
cc0ec051 88static void OP_M (int, int);
c0f3af97 89static void OP_VEX (int, int);
41f5efc6 90static void OP_VexR (int, int);
e6123d0c 91static void OP_VexW (int, int);
43234a1e 92static void OP_Rounding (int, int);
c0f3af97 93static void OP_REG_VexI4 (int, int);
93abb146 94static void OP_VexI4 (int, int);
c0f3af97 95static void PCLMUL_Fixup (int, int);
43234a1e 96static void VPCMP_Fixup (int, int);
be92cb14 97static void VPCOM_Fixup (int, int);
cc0ec051 98static void OP_0f07 (int, int);
b844680a
L
99static void OP_Monitor (int, int);
100static void OP_Mwait (int, int);
46e883c5
L
101static void NOP_Fixup1 (int, int);
102static void NOP_Fixup2 (int, int);
26ca5450 103static void OP_3DNowSuffix (int, int);
ad19981d 104static void CMP_Fixup (int, int);
26ca5450 105static void BadOp (void);
35c52694 106static void REP_Fixup (int, int);
d835a58b 107static void SEP_Fixup (int, int);
7e8b059b 108static void BND_Fixup (int, int);
04ef582a 109static void NOTRACK_Fixup (int, int);
42164a71
L
110static void HLE_Fixup1 (int, int);
111static void HLE_Fixup2 (int, int);
112static void HLE_Fixup3 (int, int);
f5804c90 113static void CMPXCHG8B_Fixup (int, int);
42903f7f 114static void XMM_Fixup (int, int);
eacc9c89 115static void FXSAVE_Fixup (int, int);
c1e679ec 116
bc31405e 117static void MOVSXD_Fixup (int, int);
252b5132 118
43234a1e
L
119static void OP_Mask (int, int);
120
6608db57 121struct dis_private {
252b5132
RH
122 /* Points to first byte not fetched. */
123 bfd_byte *max_fetched;
0b1cf022 124 bfd_byte the_buffer[MAX_MNEM_SIZE];
252b5132 125 bfd_vma insn_start;
e396998b 126 int orig_sizeflag;
8df14d78 127 OPCODES_SIGJMP_BUF bailout;
252b5132
RH
128};
129
cb712a9e
L
130enum address_mode
131{
132 mode_16bit,
133 mode_32bit,
134 mode_64bit
135};
136
137enum address_mode address_mode;
52b15da3 138
5076851f
ILT
139/* Flags for the prefixes for the current instruction. See below. */
140static int prefixes;
141
52b15da3
JH
142/* REX prefix the current instruction. See below. */
143static int rex;
144/* Bits of REX we've already used. */
145static int rex_used;
52b15da3
JH
146/* Mark parts used in the REX prefix. When we are testing for
147 empty prefix (for 8bit register REX extension), just mask it
148 out. Otherwise test for REX bit is excuse for existence of REX
149 only in case value is nonzero. */
150#define USED_REX(value) \
151 { \
152 if (value) \
161a04f6
L
153 { \
154 if ((rex & value)) \
155 rex_used |= (value) | REX_OPCODE; \
156 } \
52b15da3 157 else \
161a04f6 158 rex_used |= REX_OPCODE; \
52b15da3
JH
159 }
160
7d421014
ILT
161/* Flags for prefixes which we somehow handled when printing the
162 current instruction. */
163static int used_prefixes;
164
5076851f
ILT
165/* Flags stored in PREFIXES. */
166#define PREFIX_REPZ 1
167#define PREFIX_REPNZ 2
168#define PREFIX_LOCK 4
169#define PREFIX_CS 8
170#define PREFIX_SS 0x10
171#define PREFIX_DS 0x20
172#define PREFIX_ES 0x40
173#define PREFIX_FS 0x80
174#define PREFIX_GS 0x100
175#define PREFIX_DATA 0x200
176#define PREFIX_ADDR 0x400
177#define PREFIX_FWAIT 0x800
178
252b5132
RH
179/* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
180 to ADDR (exclusive) are valid. Returns 1 for success, longjmps
181 on error. */
182#define FETCH_DATA(info, addr) \
6608db57 183 ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \
252b5132
RH
184 ? 1 : fetch_data ((info), (addr)))
185
186static int
26ca5450 187fetch_data (struct disassemble_info *info, bfd_byte *addr)
252b5132
RH
188{
189 int status;
6608db57 190 struct dis_private *priv = (struct dis_private *) info->private_data;
252b5132
RH
191 bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer);
192
0b1cf022 193 if (addr <= priv->the_buffer + MAX_MNEM_SIZE)
272c9217
JB
194 status = (*info->read_memory_func) (start,
195 priv->max_fetched,
196 addr - priv->max_fetched,
197 info);
198 else
199 status = -1;
252b5132
RH
200 if (status != 0)
201 {
7d421014 202 /* If we did manage to read at least one byte, then
db6eb5be
AM
203 print_insn_i386 will do something sensible. Otherwise, print
204 an error. We do that here because this is where we know
205 STATUS. */
7d421014 206 if (priv->max_fetched == priv->the_buffer)
5076851f 207 (*info->memory_error_func) (status, start, info);
8df14d78 208 OPCODES_SIGLONGJMP (priv->bailout, 1);
252b5132
RH
209 }
210 else
211 priv->max_fetched = addr;
212 return 1;
213}
214
bf890a93 215/* Possible values for prefix requirement. */
507bd325
L
216#define PREFIX_IGNORED_SHIFT 16
217#define PREFIX_IGNORED_REPZ (PREFIX_REPZ << PREFIX_IGNORED_SHIFT)
218#define PREFIX_IGNORED_REPNZ (PREFIX_REPNZ << PREFIX_IGNORED_SHIFT)
219#define PREFIX_IGNORED_DATA (PREFIX_DATA << PREFIX_IGNORED_SHIFT)
220#define PREFIX_IGNORED_ADDR (PREFIX_ADDR << PREFIX_IGNORED_SHIFT)
221#define PREFIX_IGNORED_LOCK (PREFIX_LOCK << PREFIX_IGNORED_SHIFT)
222
223/* Opcode prefixes. */
224#define PREFIX_OPCODE (PREFIX_REPZ \
225 | PREFIX_REPNZ \
226 | PREFIX_DATA)
227
228/* Prefixes ignored. */
229#define PREFIX_IGNORED (PREFIX_IGNORED_REPZ \
230 | PREFIX_IGNORED_REPNZ \
231 | PREFIX_IGNORED_DATA)
bf890a93 232
ce518a5f 233#define XX { NULL, 0 }
507bd325 234#define Bad_Opcode NULL, { { NULL, 0 } }, 0
ce518a5f
L
235
236#define Eb { OP_E, b_mode }
7e8b059b 237#define Ebnd { OP_E, bnd_mode }
b6169b20 238#define EbS { OP_E, b_swap_mode }
9f79e886 239#define EbndS { OP_E, bnd_swap_mode }
ce518a5f 240#define Ev { OP_E, v_mode }
de89d0a3 241#define Eva { OP_E, va_mode }
7e8b059b 242#define Ev_bnd { OP_E, v_bnd_mode }
b6169b20 243#define EvS { OP_E, v_swap_mode }
ce518a5f
L
244#define Ed { OP_E, d_mode }
245#define Edq { OP_E, dq_mode }
246#define Edqw { OP_E, dqw_mode }
42903f7f 247#define Edqb { OP_E, dqb_mode }
1ba585e8
IT
248#define Edb { OP_E, db_mode }
249#define Edw { OP_E, dw_mode }
42903f7f 250#define Edqd { OP_E, dqd_mode }
09335d05 251#define Eq { OP_E, q_mode }
07f5af7d 252#define indirEv { OP_indirE, indir_v_mode }
ce518a5f
L
253#define indirEp { OP_indirE, f_mode }
254#define stackEv { OP_E, stack_v_mode }
255#define Em { OP_E, m_mode }
256#define Ew { OP_E, w_mode }
257#define M { OP_M, 0 } /* lea, lgdt, etc. */
34b772a6 258#define Ma { OP_M, a_mode }
b844680a 259#define Mb { OP_M, b_mode }
d9a5e5e5 260#define Md { OP_M, d_mode }
f1f8f695 261#define Mo { OP_M, o_mode }
ce518a5f
L
262#define Mp { OP_M, f_mode } /* 32 or 48 bit memory operand for LDS, LES etc */
263#define Mq { OP_M, q_mode }
9ab00b61 264#define Mv { OP_M, v_mode }
d276ec69 265#define Mv_bnd { OP_M, v_bndmk_mode }
4ee52178 266#define Mx { OP_M, x_mode }
c0f3af97 267#define Mxmm { OP_M, xmm_mode }
ce518a5f 268#define Gb { OP_G, b_mode }
7e8b059b 269#define Gbnd { OP_G, bnd_mode }
ce518a5f
L
270#define Gv { OP_G, v_mode }
271#define Gd { OP_G, d_mode }
272#define Gdq { OP_G, dq_mode }
273#define Gm { OP_G, m_mode }
c0a30a9f 274#define Gva { OP_G, va_mode }
ce518a5f 275#define Gw { OP_G, w_mode }
ce518a5f
L
276#define Ib { OP_I, b_mode }
277#define sIb { OP_sI, b_mode } /* sign extened byte */
e3949f17 278#define sIbT { OP_sI, b_T_mode } /* sign extened byte like 'T' */
ce518a5f 279#define Iv { OP_I, v_mode }
7bb15c6f 280#define sIv { OP_sI, v_mode }
ce518a5f 281#define Iv64 { OP_I64, v_mode }
c1dc7af5 282#define Id { OP_I, d_mode }
ce518a5f
L
283#define Iw { OP_I, w_mode }
284#define I1 { OP_I, const_1_mode }
285#define Jb { OP_J, b_mode }
286#define Jv { OP_J, v_mode }
376cd056 287#define Jdqw { OP_J, dqw_mode }
ce518a5f
L
288#define Cm { OP_C, m_mode }
289#define Dm { OP_D, m_mode }
290#define Td { OP_T, d_mode }
b844680a 291#define Skip_MODRM { OP_Skip_MODRM, 0 }
ce518a5f
L
292
293#define RMeAX { OP_REG, eAX_reg }
294#define RMeBX { OP_REG, eBX_reg }
295#define RMeCX { OP_REG, eCX_reg }
296#define RMeDX { OP_REG, eDX_reg }
297#define RMeSP { OP_REG, eSP_reg }
298#define RMeBP { OP_REG, eBP_reg }
299#define RMeSI { OP_REG, eSI_reg }
300#define RMeDI { OP_REG, eDI_reg }
301#define RMrAX { OP_REG, rAX_reg }
302#define RMrBX { OP_REG, rBX_reg }
303#define RMrCX { OP_REG, rCX_reg }
304#define RMrDX { OP_REG, rDX_reg }
305#define RMrSP { OP_REG, rSP_reg }
306#define RMrBP { OP_REG, rBP_reg }
307#define RMrSI { OP_REG, rSI_reg }
308#define RMrDI { OP_REG, rDI_reg }
309#define RMAL { OP_REG, al_reg }
ce518a5f
L
310#define RMCL { OP_REG, cl_reg }
311#define RMDL { OP_REG, dl_reg }
312#define RMBL { OP_REG, bl_reg }
313#define RMAH { OP_REG, ah_reg }
314#define RMCH { OP_REG, ch_reg }
315#define RMDH { OP_REG, dh_reg }
316#define RMBH { OP_REG, bh_reg }
317#define RMAX { OP_REG, ax_reg }
318#define RMDX { OP_REG, dx_reg }
319
320#define eAX { OP_IMREG, eAX_reg }
ce518a5f
L
321#define AL { OP_IMREG, al_reg }
322#define CL { OP_IMREG, cl_reg }
ce518a5f
L
323#define zAX { OP_IMREG, z_mode_ax_reg }
324#define indirDX { OP_IMREG, indir_dx_reg }
325
326#define Sw { OP_SEG, w_mode }
327#define Sv { OP_SEG, v_mode }
328#define Ap { OP_DIR, 0 }
329#define Ob { OP_OFF64, b_mode }
330#define Ov { OP_OFF64, v_mode }
331#define Xb { OP_DSreg, eSI_reg }
332#define Xv { OP_DSreg, eSI_reg }
333#define Xz { OP_DSreg, eSI_reg }
334#define Yb { OP_ESreg, eDI_reg }
335#define Yv { OP_ESreg, eDI_reg }
336#define DSBX { OP_DSreg, eBX_reg }
337
338#define es { OP_REG, es_reg }
339#define ss { OP_REG, ss_reg }
340#define cs { OP_REG, cs_reg }
341#define ds { OP_REG, ds_reg }
342#define fs { OP_REG, fs_reg }
343#define gs { OP_REG, gs_reg }
344
345#define MX { OP_MMX, 0 }
346#define XM { OP_XMM, 0 }
539f890d 347#define XMScalar { OP_XMM, scalar_mode }
6c30d220 348#define XMGatherQ { OP_XMM, vex_vsib_q_w_dq_mode }
c0f3af97 349#define XMM { OP_XMM, xmm_mode }
260cd341 350#define TMM { OP_XMM, tmm_mode }
43234a1e 351#define XMxmmq { OP_XMM, xmmq_mode }
ce518a5f 352#define EM { OP_EM, v_mode }
b6169b20 353#define EMS { OP_EM, v_swap_mode }
09a2c6cf 354#define EMd { OP_EM, d_mode }
14051056 355#define EMx { OP_EM, x_mode }
4726e9a4 356#define EXbwUnit { OP_EX, bw_unit_mode }
8976381e 357#define EXw { OP_EX, w_mode }
09a2c6cf 358#define EXd { OP_EX, d_mode }
fa99fab2 359#define EXdS { OP_EX, d_swap_mode }
09a2c6cf 360#define EXq { OP_EX, q_mode }
b6169b20 361#define EXqS { OP_EX, q_swap_mode }
09a2c6cf 362#define EXx { OP_EX, x_mode }
b6169b20 363#define EXxS { OP_EX, x_swap_mode }
c0f3af97 364#define EXxmm { OP_EX, xmm_mode }
43234a1e 365#define EXymm { OP_EX, ymm_mode }
260cd341 366#define EXtmm { OP_EX, tmm_mode }
c0f3af97 367#define EXxmmq { OP_EX, xmmq_mode }
43234a1e 368#define EXEvexHalfBcstXmmq { OP_EX, evex_half_bcst_xmmq_mode }
6c30d220
L
369#define EXxmm_mb { OP_EX, xmm_mb_mode }
370#define EXxmm_mw { OP_EX, xmm_mw_mode }
371#define EXxmm_md { OP_EX, xmm_md_mode }
372#define EXxmm_mq { OP_EX, xmm_mq_mode }
373#define EXxmmdw { OP_EX, xmmdw_mode }
374#define EXxmmqd { OP_EX, xmmqd_mode }
c0f3af97 375#define EXymmq { OP_EX, ymmq_mode }
1c480963 376#define EXVexWdqScalar { OP_EX, vex_scalar_w_dq_mode }
43234a1e
L
377#define EXEvexXGscat { OP_EX, evex_x_gscat_mode }
378#define EXEvexXNoBcst { OP_EX, evex_x_nobcst_mode }
ce518a5f
L
379#define MS { OP_MS, v_mode }
380#define XS { OP_XS, v_mode }
09335d05 381#define EMCq { OP_EMC, q_mode }
ce518a5f 382#define MXC { OP_MXC, 0 }
ce518a5f 383#define OPSUF { OP_3DNowSuffix, 0 }
d835a58b 384#define SEP { SEP_Fixup, 0 }
ad19981d 385#define CMP { CMP_Fixup, 0 }
42903f7f 386#define XMM0 { XMM_Fixup, 0 }
eacc9c89 387#define FXSAVE { FXSAVE_Fixup, 0 }
252b5132 388
c0f3af97 389#define Vex { OP_VEX, vex_mode }
e6123d0c 390#define VexW { OP_VexW, vex_mode }
539f890d 391#define VexScalar { OP_VEX, vex_scalar_mode }
41f5efc6 392#define VexScalarR { OP_VexR, vex_scalar_mode }
6c30d220 393#define VexGatherQ { OP_VEX, vex_vsib_q_w_dq_mode }
cb21baef 394#define VexGdq { OP_VEX, dq_mode }
260cd341 395#define VexTmm { OP_VEX, tmm_mode }
c0f3af97 396#define XMVexI4 { OP_REG_VexI4, x_mode }
6384fd9e 397#define XMVexScalarI4 { OP_REG_VexI4, scalar_mode }
93abb146 398#define VexI4 { OP_VexI4, 0 }
c0f3af97 399#define PCLMUL { PCLMUL_Fixup, 0 }
43234a1e 400#define VPCMP { VPCMP_Fixup, 0 }
be92cb14 401#define VPCOM { VPCOM_Fixup, 0 }
43234a1e
L
402
403#define EXxEVexR { OP_Rounding, evex_rounding_mode }
70df6fc9 404#define EXxEVexR64 { OP_Rounding, evex_rounding_64_mode }
43234a1e
L
405#define EXxEVexS { OP_Rounding, evex_sae_mode }
406
407#define XMask { OP_Mask, mask_mode }
408#define MaskG { OP_G, mask_mode }
409#define MaskE { OP_E, mask_mode }
1ba585e8 410#define MaskBDE { OP_E, mask_bd_mode }
43234a1e 411#define MaskVex { OP_VEX, mask_mode }
c0f3af97 412
6c30d220 413#define MVexVSIBDWpX { OP_M, vex_vsib_d_w_dq_mode }
5fc35d96 414#define MVexVSIBDQWpX { OP_M, vex_vsib_d_w_d_mode }
6c30d220 415#define MVexVSIBQWpX { OP_M, vex_vsib_q_w_dq_mode }
5fc35d96 416#define MVexVSIBQDWpX { OP_M, vex_vsib_q_w_d_mode }
6c30d220 417
260cd341
LC
418#define MVexSIBMEM { OP_M, vex_sibmem_mode }
419
35c52694 420/* Used handle "rep" prefix for string instructions. */
ce518a5f
L
421#define Xbr { REP_Fixup, eSI_reg }
422#define Xvr { REP_Fixup, eSI_reg }
423#define Ybr { REP_Fixup, eDI_reg }
424#define Yvr { REP_Fixup, eDI_reg }
425#define Yzr { REP_Fixup, eDI_reg }
426#define indirDXr { REP_Fixup, indir_dx_reg }
427#define ALr { REP_Fixup, al_reg }
428#define eAXr { REP_Fixup, eAX_reg }
429
42164a71
L
430/* Used handle HLE prefix for lockable instructions. */
431#define Ebh1 { HLE_Fixup1, b_mode }
432#define Evh1 { HLE_Fixup1, v_mode }
433#define Ebh2 { HLE_Fixup2, b_mode }
434#define Evh2 { HLE_Fixup2, v_mode }
435#define Ebh3 { HLE_Fixup3, b_mode }
436#define Evh3 { HLE_Fixup3, v_mode }
437
7e8b059b 438#define BND { BND_Fixup, 0 }
04ef582a 439#define NOTRACK { NOTRACK_Fixup, 0 }
7e8b059b 440
ce518a5f
L
441#define cond_jump_flag { NULL, cond_jump_mode }
442#define loop_jcxz_flag { NULL, loop_jcxz_mode }
3ffd33cf 443
252b5132 444/* bits in sizeflag */
252b5132 445#define SUFFIX_ALWAYS 4
252b5132
RH
446#define AFLAG 2
447#define DFLAG 1
448
51e7da1b
L
449enum
450{
451 /* byte operand */
452 b_mode = 1,
453 /* byte operand with operand swapped */
3873ba12 454 b_swap_mode,
e3949f17
L
455 /* byte operand, sign extend like 'T' suffix */
456 b_T_mode,
51e7da1b 457 /* operand size depends on prefixes */
3873ba12 458 v_mode,
51e7da1b 459 /* operand size depends on prefixes with operand swapped */
3873ba12 460 v_swap_mode,
de89d0a3
IT
461 /* operand size depends on address prefix */
462 va_mode,
51e7da1b 463 /* word operand */
3873ba12 464 w_mode,
51e7da1b 465 /* double word operand */
3873ba12 466 d_mode,
51e7da1b 467 /* double word operand with operand swapped */
3873ba12 468 d_swap_mode,
51e7da1b 469 /* quad word operand */
3873ba12 470 q_mode,
51e7da1b 471 /* quad word operand with operand swapped */
3873ba12 472 q_swap_mode,
51e7da1b 473 /* ten-byte operand */
3873ba12 474 t_mode,
43234a1e
L
475 /* 16-byte XMM, 32-byte YMM or 64-byte ZMM operand. In EVEX with
476 broadcast enabled. */
3873ba12 477 x_mode,
43234a1e
L
478 /* Similar to x_mode, but with different EVEX mem shifts. */
479 evex_x_gscat_mode,
4726e9a4
JB
480 /* Similar to x_mode, but with yet different EVEX mem shifts. */
481 bw_unit_mode,
43234a1e
L
482 /* Similar to x_mode, but with disabled broadcast. */
483 evex_x_nobcst_mode,
484 /* Similar to x_mode, but with operands swapped and disabled broadcast
485 in EVEX. */
3873ba12 486 x_swap_mode,
51e7da1b 487 /* 16-byte XMM operand */
3873ba12 488 xmm_mode,
43234a1e
L
489 /* XMM, XMM or YMM register operand, or quad word, xmmword or ymmword
490 memory operand (depending on vector length). Broadcast isn't
491 allowed. */
3873ba12 492 xmmq_mode,
43234a1e
L
493 /* Same as xmmq_mode, but broadcast is allowed. */
494 evex_half_bcst_xmmq_mode,
6c30d220
L
495 /* XMM register or byte memory operand */
496 xmm_mb_mode,
497 /* XMM register or word memory operand */
498 xmm_mw_mode,
499 /* XMM register or double word memory operand */
500 xmm_md_mode,
501 /* XMM register or quad word memory operand */
502 xmm_mq_mode,
43234a1e 503 /* 16-byte XMM, word, double word or quad word operand. */
6c30d220 504 xmmdw_mode,
43234a1e 505 /* 16-byte XMM, double word, quad word operand or xmm word operand. */
6c30d220 506 xmmqd_mode,
43234a1e
L
507 /* 32-byte YMM operand */
508 ymm_mode,
509 /* quad word, ymmword or zmmword memory operand. */
3873ba12 510 ymmq_mode,
6c30d220
L
511 /* 32-byte YMM or 16-byte word operand */
512 ymmxmm_mode,
260cd341
LC
513 /* TMM operand */
514 tmm_mode,
51e7da1b 515 /* d_mode in 32bit, q_mode in 64bit mode. */
3873ba12 516 m_mode,
51e7da1b 517 /* pair of v_mode operands */
3873ba12
L
518 a_mode,
519 cond_jump_mode,
520 loop_jcxz_mode,
bc31405e 521 movsxd_mode,
7e8b059b 522 v_bnd_mode,
d276ec69
JB
523 /* like v_bnd_mode in 32bit, no RIP-rel in 64bit mode. */
524 v_bndmk_mode,
51e7da1b 525 /* operand size depends on REX prefixes. */
3873ba12 526 dq_mode,
376cd056
JB
527 /* registers like dq_mode, memory like w_mode, displacements like
528 v_mode without considering Intel64 ISA. */
3873ba12 529 dqw_mode,
9f79e886 530 /* bounds operand */
7e8b059b 531 bnd_mode,
9f79e886
JB
532 /* bounds operand with operand swapped */
533 bnd_swap_mode,
51e7da1b 534 /* 4- or 6-byte pointer operand */
3873ba12
L
535 f_mode,
536 const_1_mode,
07f5af7d
L
537 /* v_mode for indirect branch opcodes. */
538 indir_v_mode,
51e7da1b 539 /* v_mode for stack-related opcodes. */
3873ba12 540 stack_v_mode,
51e7da1b 541 /* non-quad operand size depends on prefixes */
3873ba12 542 z_mode,
51e7da1b 543 /* 16-byte operand */
3873ba12 544 o_mode,
51e7da1b 545 /* registers like dq_mode, memory like b_mode. */
3873ba12 546 dqb_mode,
1ba585e8
IT
547 /* registers like d_mode, memory like b_mode. */
548 db_mode,
549 /* registers like d_mode, memory like w_mode. */
550 dw_mode,
51e7da1b 551 /* registers like dq_mode, memory like d_mode. */
3873ba12 552 dqd_mode,
51e7da1b 553 /* normal vex mode */
3873ba12 554 vex_mode,
d55ee72f 555
825bd36c 556 /* Operand size depends on the VEX.W bit, with VSIB dword indices. */
6c30d220 557 vex_vsib_d_w_dq_mode,
5fc35d96
IT
558 /* Similar to vex_vsib_d_w_dq_mode, with smaller memory. */
559 vex_vsib_d_w_d_mode,
825bd36c 560 /* Operand size depends on the VEX.W bit, with VSIB qword indices. */
6c30d220 561 vex_vsib_q_w_dq_mode,
5fc35d96
IT
562 /* Similar to vex_vsib_q_w_dq_mode, with smaller memory. */
563 vex_vsib_q_w_d_mode,
260cd341
LC
564 /* mandatory non-vector SIB. */
565 vex_sibmem_mode,
6c30d220 566
539f890d
L
567 /* scalar, ignore vector length. */
568 scalar_mode,
539f890d
L
569 /* like vex_mode, ignore vector length. */
570 vex_scalar_mode,
825bd36c 571 /* Operand size depends on the VEX.W bit, ignore vector length. */
1c480963 572 vex_scalar_w_dq_mode,
539f890d 573
43234a1e
L
574 /* Static rounding. */
575 evex_rounding_mode,
70df6fc9
L
576 /* Static rounding, 64-bit mode only. */
577 evex_rounding_64_mode,
43234a1e
L
578 /* Supress all exceptions. */
579 evex_sae_mode,
580
581 /* Mask register operand. */
582 mask_mode,
1ba585e8
IT
583 /* Mask register operand. */
584 mask_bd_mode,
43234a1e 585
3873ba12
L
586 es_reg,
587 cs_reg,
588 ss_reg,
589 ds_reg,
590 fs_reg,
591 gs_reg,
d55ee72f 592
3873ba12
L
593 eAX_reg,
594 eCX_reg,
595 eDX_reg,
596 eBX_reg,
597 eSP_reg,
598 eBP_reg,
599 eSI_reg,
600 eDI_reg,
d55ee72f 601
3873ba12
L
602 al_reg,
603 cl_reg,
604 dl_reg,
605 bl_reg,
606 ah_reg,
607 ch_reg,
608 dh_reg,
609 bh_reg,
d55ee72f 610
3873ba12
L
611 ax_reg,
612 cx_reg,
613 dx_reg,
614 bx_reg,
615 sp_reg,
616 bp_reg,
617 si_reg,
618 di_reg,
d55ee72f 619
3873ba12
L
620 rAX_reg,
621 rCX_reg,
622 rDX_reg,
623 rBX_reg,
624 rSP_reg,
625 rBP_reg,
626 rSI_reg,
627 rDI_reg,
d55ee72f 628
3873ba12
L
629 z_mode_ax_reg,
630 indir_dx_reg
51e7da1b 631};
252b5132 632
51e7da1b
L
633enum
634{
635 FLOATCODE = 1,
3873ba12
L
636 USE_REG_TABLE,
637 USE_MOD_TABLE,
638 USE_RM_TABLE,
639 USE_PREFIX_TABLE,
640 USE_X86_64_TABLE,
641 USE_3BYTE_TABLE,
f88c9eb0 642 USE_XOP_8F_TABLE,
3873ba12
L
643 USE_VEX_C4_TABLE,
644 USE_VEX_C5_TABLE,
9e30b8e0 645 USE_VEX_LEN_TABLE,
43234a1e 646 USE_VEX_W_TABLE,
04e2a182
L
647 USE_EVEX_TABLE,
648 USE_EVEX_LEN_TABLE
51e7da1b 649};
6439fc28 650
bf890a93 651#define FLOAT NULL, { { NULL, FLOATCODE } }, 0
4efba78c 652
bf890a93
IT
653#define DIS386(T, I) NULL, { { NULL, (T)}, { NULL, (I) } }, 0
654#define DIS386_PREFIX(T, I, P) NULL, { { NULL, (T)}, { NULL, (I) } }, P
1ceb70f8
L
655#define REG_TABLE(I) DIS386 (USE_REG_TABLE, (I))
656#define MOD_TABLE(I) DIS386 (USE_MOD_TABLE, (I))
657#define RM_TABLE(I) DIS386 (USE_RM_TABLE, (I))
658#define PREFIX_TABLE(I) DIS386 (USE_PREFIX_TABLE, (I))
4e7d34a6
L
659#define X86_64_TABLE(I) DIS386 (USE_X86_64_TABLE, (I))
660#define THREE_BYTE_TABLE(I) DIS386 (USE_3BYTE_TABLE, (I))
bf890a93 661#define THREE_BYTE_TABLE_PREFIX(I, P) DIS386_PREFIX (USE_3BYTE_TABLE, (I), P)
f88c9eb0 662#define XOP_8F_TABLE(I) DIS386 (USE_XOP_8F_TABLE, (I))
c0f3af97
L
663#define VEX_C4_TABLE(I) DIS386 (USE_VEX_C4_TABLE, (I))
664#define VEX_C5_TABLE(I) DIS386 (USE_VEX_C5_TABLE, (I))
665#define VEX_LEN_TABLE(I) DIS386 (USE_VEX_LEN_TABLE, (I))
9e30b8e0 666#define VEX_W_TABLE(I) DIS386 (USE_VEX_W_TABLE, (I))
43234a1e 667#define EVEX_TABLE(I) DIS386 (USE_EVEX_TABLE, (I))
04e2a182 668#define EVEX_LEN_TABLE(I) DIS386 (USE_EVEX_LEN_TABLE, (I))
1ceb70f8 669
51e7da1b
L
670enum
671{
672 REG_80 = 0,
3873ba12 673 REG_81,
7148c369 674 REG_83,
3873ba12
L
675 REG_8F,
676 REG_C0,
677 REG_C1,
678 REG_C6,
679 REG_C7,
680 REG_D0,
681 REG_D1,
682 REG_D2,
683 REG_D3,
684 REG_F6,
685 REG_F7,
686 REG_FE,
687 REG_FF,
688 REG_0F00,
689 REG_0F01,
690 REG_0F0D,
691 REG_0F18,
f8687e93
JB
692 REG_0F1C_P_0_MOD_0,
693 REG_0F1E_P_1_MOD_3,
3873ba12
L
694 REG_0F71,
695 REG_0F72,
696 REG_0F73,
697 REG_0FA6,
698 REG_0FA7,
699 REG_0FAE,
700 REG_0FBA,
701 REG_0FC7,
592a252b
L
702 REG_VEX_0F71,
703 REG_VEX_0F72,
704 REG_VEX_0F73,
705 REG_VEX_0FAE,
260cd341 706 REG_VEX_0F3849_X86_64_P_0_W_0_M_1,
f12dc422 707 REG_VEX_0F38F3,
467bbef0
JB
708
709 REG_0FXOP_09_01_L_0,
710 REG_0FXOP_09_02_L_0,
711 REG_0FXOP_09_12_M_1_L_0,
712 REG_0FXOP_0A_12_L_0,
43234a1e 713
1ba585e8 714 REG_EVEX_0F71,
43234a1e
L
715 REG_EVEX_0F72,
716 REG_EVEX_0F73,
717 REG_EVEX_0F38C6,
718 REG_EVEX_0F38C7
51e7da1b 719};
1ceb70f8 720
51e7da1b
L
721enum
722{
723 MOD_8D = 0,
42164a71
L
724 MOD_C6_REG_7,
725 MOD_C7_REG_7,
4a357820
MZ
726 MOD_FF_REG_3,
727 MOD_FF_REG_5,
3873ba12
L
728 MOD_0F01_REG_0,
729 MOD_0F01_REG_1,
730 MOD_0F01_REG_2,
731 MOD_0F01_REG_3,
8eab4136 732 MOD_0F01_REG_5,
3873ba12
L
733 MOD_0F01_REG_7,
734 MOD_0F12_PREFIX_0,
18897deb 735 MOD_0F12_PREFIX_2,
3873ba12
L
736 MOD_0F13,
737 MOD_0F16_PREFIX_0,
18897deb 738 MOD_0F16_PREFIX_2,
3873ba12
L
739 MOD_0F17,
740 MOD_0F18_REG_0,
741 MOD_0F18_REG_1,
742 MOD_0F18_REG_2,
743 MOD_0F18_REG_3,
d7189fa5
RM
744 MOD_0F18_REG_4,
745 MOD_0F18_REG_5,
746 MOD_0F18_REG_6,
747 MOD_0F18_REG_7,
7e8b059b
L
748 MOD_0F1A_PREFIX_0,
749 MOD_0F1B_PREFIX_0,
750 MOD_0F1B_PREFIX_1,
c48935d7 751 MOD_0F1C_PREFIX_0,
603555e5 752 MOD_0F1E_PREFIX_1,
3873ba12
L
753 MOD_0F2B_PREFIX_0,
754 MOD_0F2B_PREFIX_1,
755 MOD_0F2B_PREFIX_2,
756 MOD_0F2B_PREFIX_3,
a5aaedb9 757 MOD_0F50,
3873ba12
L
758 MOD_0F71_REG_2,
759 MOD_0F71_REG_4,
760 MOD_0F71_REG_6,
761 MOD_0F72_REG_2,
762 MOD_0F72_REG_4,
763 MOD_0F72_REG_6,
764 MOD_0F73_REG_2,
765 MOD_0F73_REG_3,
766 MOD_0F73_REG_6,
767 MOD_0F73_REG_7,
768 MOD_0FAE_REG_0,
769 MOD_0FAE_REG_1,
770 MOD_0FAE_REG_2,
771 MOD_0FAE_REG_3,
772 MOD_0FAE_REG_4,
773 MOD_0FAE_REG_5,
774 MOD_0FAE_REG_6,
775 MOD_0FAE_REG_7,
776 MOD_0FB2,
777 MOD_0FB4,
778 MOD_0FB5,
a8484f96 779 MOD_0FC3,
963f3586
IT
780 MOD_0FC7_REG_3,
781 MOD_0FC7_REG_4,
782 MOD_0FC7_REG_5,
3873ba12
L
783 MOD_0FC7_REG_6,
784 MOD_0FC7_REG_7,
785 MOD_0FD7,
786 MOD_0FE7_PREFIX_2,
787 MOD_0FF0_PREFIX_3,
7531c613 788 MOD_0F382A,
260cd341
LC
789 MOD_VEX_0F3849_X86_64_P_0_W_0,
790 MOD_VEX_0F3849_X86_64_P_2_W_0,
791 MOD_VEX_0F3849_X86_64_P_3_W_0,
792 MOD_VEX_0F384B_X86_64_P_1_W_0,
793 MOD_VEX_0F384B_X86_64_P_2_W_0,
794 MOD_VEX_0F384B_X86_64_P_3_W_0,
795 MOD_VEX_0F385C_X86_64_P_1_W_0,
796 MOD_VEX_0F385E_X86_64_P_0_W_0,
797 MOD_VEX_0F385E_X86_64_P_1_W_0,
798 MOD_VEX_0F385E_X86_64_P_2_W_0,
799 MOD_VEX_0F385E_X86_64_P_3_W_0,
7531c613 800 MOD_0F38F5,
603555e5 801 MOD_0F38F6_PREFIX_0,
5d79adc4 802 MOD_0F38F8_PREFIX_1,
c0a30a9f 803 MOD_0F38F8_PREFIX_2,
5d79adc4 804 MOD_0F38F8_PREFIX_3,
035e7389 805 MOD_0F38F9,
3873ba12
L
806 MOD_62_32BIT,
807 MOD_C4_32BIT,
808 MOD_C5_32BIT,
592a252b 809 MOD_VEX_0F12_PREFIX_0,
18897deb 810 MOD_VEX_0F12_PREFIX_2,
592a252b
L
811 MOD_VEX_0F13,
812 MOD_VEX_0F16_PREFIX_0,
18897deb 813 MOD_VEX_0F16_PREFIX_2,
592a252b
L
814 MOD_VEX_0F17,
815 MOD_VEX_0F2B,
ab4e4ed5
AF
816 MOD_VEX_W_0_0F41_P_0_LEN_1,
817 MOD_VEX_W_1_0F41_P_0_LEN_1,
818 MOD_VEX_W_0_0F41_P_2_LEN_1,
819 MOD_VEX_W_1_0F41_P_2_LEN_1,
820 MOD_VEX_W_0_0F42_P_0_LEN_1,
821 MOD_VEX_W_1_0F42_P_0_LEN_1,
822 MOD_VEX_W_0_0F42_P_2_LEN_1,
823 MOD_VEX_W_1_0F42_P_2_LEN_1,
824 MOD_VEX_W_0_0F44_P_0_LEN_1,
825 MOD_VEX_W_1_0F44_P_0_LEN_1,
826 MOD_VEX_W_0_0F44_P_2_LEN_1,
827 MOD_VEX_W_1_0F44_P_2_LEN_1,
828 MOD_VEX_W_0_0F45_P_0_LEN_1,
829 MOD_VEX_W_1_0F45_P_0_LEN_1,
830 MOD_VEX_W_0_0F45_P_2_LEN_1,
831 MOD_VEX_W_1_0F45_P_2_LEN_1,
832 MOD_VEX_W_0_0F46_P_0_LEN_1,
833 MOD_VEX_W_1_0F46_P_0_LEN_1,
834 MOD_VEX_W_0_0F46_P_2_LEN_1,
835 MOD_VEX_W_1_0F46_P_2_LEN_1,
836 MOD_VEX_W_0_0F47_P_0_LEN_1,
837 MOD_VEX_W_1_0F47_P_0_LEN_1,
838 MOD_VEX_W_0_0F47_P_2_LEN_1,
839 MOD_VEX_W_1_0F47_P_2_LEN_1,
840 MOD_VEX_W_0_0F4A_P_0_LEN_1,
841 MOD_VEX_W_1_0F4A_P_0_LEN_1,
842 MOD_VEX_W_0_0F4A_P_2_LEN_1,
843 MOD_VEX_W_1_0F4A_P_2_LEN_1,
844 MOD_VEX_W_0_0F4B_P_0_LEN_1,
845 MOD_VEX_W_1_0F4B_P_0_LEN_1,
846 MOD_VEX_W_0_0F4B_P_2_LEN_1,
592a252b
L
847 MOD_VEX_0F50,
848 MOD_VEX_0F71_REG_2,
849 MOD_VEX_0F71_REG_4,
850 MOD_VEX_0F71_REG_6,
851 MOD_VEX_0F72_REG_2,
852 MOD_VEX_0F72_REG_4,
853 MOD_VEX_0F72_REG_6,
854 MOD_VEX_0F73_REG_2,
855 MOD_VEX_0F73_REG_3,
856 MOD_VEX_0F73_REG_6,
857 MOD_VEX_0F73_REG_7,
ab4e4ed5
AF
858 MOD_VEX_W_0_0F91_P_0_LEN_0,
859 MOD_VEX_W_1_0F91_P_0_LEN_0,
860 MOD_VEX_W_0_0F91_P_2_LEN_0,
861 MOD_VEX_W_1_0F91_P_2_LEN_0,
862 MOD_VEX_W_0_0F92_P_0_LEN_0,
863 MOD_VEX_W_0_0F92_P_2_LEN_0,
58a211d2 864 MOD_VEX_0F92_P_3_LEN_0,
ab4e4ed5
AF
865 MOD_VEX_W_0_0F93_P_0_LEN_0,
866 MOD_VEX_W_0_0F93_P_2_LEN_0,
58a211d2 867 MOD_VEX_0F93_P_3_LEN_0,
ab4e4ed5
AF
868 MOD_VEX_W_0_0F98_P_0_LEN_0,
869 MOD_VEX_W_1_0F98_P_0_LEN_0,
870 MOD_VEX_W_0_0F98_P_2_LEN_0,
871 MOD_VEX_W_1_0F98_P_2_LEN_0,
872 MOD_VEX_W_0_0F99_P_0_LEN_0,
873 MOD_VEX_W_1_0F99_P_0_LEN_0,
874 MOD_VEX_W_0_0F99_P_2_LEN_0,
875 MOD_VEX_W_1_0F99_P_2_LEN_0,
592a252b
L
876 MOD_VEX_0FAE_REG_2,
877 MOD_VEX_0FAE_REG_3,
7531c613
JB
878 MOD_VEX_0FD7,
879 MOD_VEX_0FE7,
592a252b 880 MOD_VEX_0FF0_PREFIX_3,
7531c613
JB
881 MOD_VEX_0F381A,
882 MOD_VEX_0F382A,
883 MOD_VEX_0F382C,
884 MOD_VEX_0F382D,
885 MOD_VEX_0F382E,
886 MOD_VEX_0F382F,
887 MOD_VEX_0F385A,
888 MOD_VEX_0F388C,
889 MOD_VEX_0F388E,
bb5b3501
JB
890 MOD_VEX_0F3A30_L_0,
891 MOD_VEX_0F3A31_L_0,
892 MOD_VEX_0F3A32_L_0,
893 MOD_VEX_0F3A33_L_0,
43234a1e 894
467bbef0
JB
895 MOD_VEX_0FXOP_09_12,
896
43234a1e 897 MOD_EVEX_0F12_PREFIX_0,
97e6786a
JB
898 MOD_EVEX_0F12_PREFIX_2,
899 MOD_EVEX_0F13,
43234a1e 900 MOD_EVEX_0F16_PREFIX_0,
97e6786a
JB
901 MOD_EVEX_0F16_PREFIX_2,
902 MOD_EVEX_0F17,
903 MOD_EVEX_0F2B,
7531c613
JB
904 MOD_EVEX_0F381A_W_0,
905 MOD_EVEX_0F381A_W_1,
906 MOD_EVEX_0F381B_W_0,
907 MOD_EVEX_0F381B_W_1,
464d2b65
JB
908 MOD_EVEX_0F3828_P_1,
909 MOD_EVEX_0F382A_P_1_W_1,
910 MOD_EVEX_0F3838_P_1,
911 MOD_EVEX_0F383A_P_1_W_0,
7531c613
JB
912 MOD_EVEX_0F385A_W_0,
913 MOD_EVEX_0F385A_W_1,
914 MOD_EVEX_0F385B_W_0,
915 MOD_EVEX_0F385B_W_1,
464d2b65
JB
916 MOD_EVEX_0F387A_W_0,
917 MOD_EVEX_0F387B_W_0,
918 MOD_EVEX_0F387C,
43234a1e
L
919 MOD_EVEX_0F38C6_REG_1,
920 MOD_EVEX_0F38C6_REG_2,
921 MOD_EVEX_0F38C6_REG_5,
922 MOD_EVEX_0F38C6_REG_6,
923 MOD_EVEX_0F38C7_REG_1,
924 MOD_EVEX_0F38C7_REG_2,
925 MOD_EVEX_0F38C7_REG_5,
926 MOD_EVEX_0F38C7_REG_6
51e7da1b 927};
1ceb70f8 928
51e7da1b
L
929enum
930{
42164a71
L
931 RM_C6_REG_7 = 0,
932 RM_C7_REG_7,
933 RM_0F01_REG_0,
3873ba12
L
934 RM_0F01_REG_1,
935 RM_0F01_REG_2,
936 RM_0F01_REG_3,
f8687e93
JB
937 RM_0F01_REG_5_MOD_3,
938 RM_0F01_REG_7_MOD_3,
939 RM_0F1E_P_1_MOD_3_REG_7,
940 RM_0FAE_REG_6_MOD_3_P_0,
941 RM_0FAE_REG_7_MOD_3,
260cd341 942 RM_VEX_0F3849_X86_64_P_0_W_0_M_1_R_0
51e7da1b 943};
1ceb70f8 944
51e7da1b
L
945enum
946{
947 PREFIX_90 = 0,
a847e322 948 PREFIX_0F01_REG_3_RM_1,
f8687e93
JB
949 PREFIX_0F01_REG_5_MOD_0,
950 PREFIX_0F01_REG_5_MOD_3_RM_0,
bb651e8b 951 PREFIX_0F01_REG_5_MOD_3_RM_1,
f8687e93 952 PREFIX_0F01_REG_5_MOD_3_RM_2,
267b8516 953 PREFIX_0F01_REG_7_MOD_3_RM_2,
3233d7d0 954 PREFIX_0F09,
3873ba12
L
955 PREFIX_0F10,
956 PREFIX_0F11,
957 PREFIX_0F12,
958 PREFIX_0F16,
7e8b059b
L
959 PREFIX_0F1A,
960 PREFIX_0F1B,
c48935d7 961 PREFIX_0F1C,
603555e5 962 PREFIX_0F1E,
3873ba12
L
963 PREFIX_0F2A,
964 PREFIX_0F2B,
965 PREFIX_0F2C,
966 PREFIX_0F2D,
967 PREFIX_0F2E,
968 PREFIX_0F2F,
969 PREFIX_0F51,
970 PREFIX_0F52,
971 PREFIX_0F53,
972 PREFIX_0F58,
973 PREFIX_0F59,
974 PREFIX_0F5A,
975 PREFIX_0F5B,
976 PREFIX_0F5C,
977 PREFIX_0F5D,
978 PREFIX_0F5E,
979 PREFIX_0F5F,
980 PREFIX_0F60,
981 PREFIX_0F61,
982 PREFIX_0F62,
3873ba12
L
983 PREFIX_0F6F,
984 PREFIX_0F70,
3873ba12
L
985 PREFIX_0F78,
986 PREFIX_0F79,
987 PREFIX_0F7C,
988 PREFIX_0F7D,
989 PREFIX_0F7E,
990 PREFIX_0F7F,
f8687e93
JB
991 PREFIX_0FAE_REG_0_MOD_3,
992 PREFIX_0FAE_REG_1_MOD_3,
993 PREFIX_0FAE_REG_2_MOD_3,
994 PREFIX_0FAE_REG_3_MOD_3,
995 PREFIX_0FAE_REG_4_MOD_0,
996 PREFIX_0FAE_REG_4_MOD_3,
f8687e93
JB
997 PREFIX_0FAE_REG_5_MOD_3,
998 PREFIX_0FAE_REG_6_MOD_0,
999 PREFIX_0FAE_REG_6_MOD_3,
1000 PREFIX_0FAE_REG_7_MOD_0,
3873ba12 1001 PREFIX_0FB8,
f12dc422 1002 PREFIX_0FBC,
3873ba12
L
1003 PREFIX_0FBD,
1004 PREFIX_0FC2,
f8687e93
JB
1005 PREFIX_0FC7_REG_6_MOD_0,
1006 PREFIX_0FC7_REG_6_MOD_3,
1007 PREFIX_0FC7_REG_7_MOD_3,
3873ba12
L
1008 PREFIX_0FD0,
1009 PREFIX_0FD6,
1010 PREFIX_0FE6,
1011 PREFIX_0FE7,
1012 PREFIX_0FF0,
1013 PREFIX_0FF7,
3873ba12
L
1014 PREFIX_0F38F0,
1015 PREFIX_0F38F1,
e2e1fcde 1016 PREFIX_0F38F6,
c0a30a9f 1017 PREFIX_0F38F8,
592a252b
L
1018 PREFIX_VEX_0F10,
1019 PREFIX_VEX_0F11,
1020 PREFIX_VEX_0F12,
1021 PREFIX_VEX_0F16,
1022 PREFIX_VEX_0F2A,
1023 PREFIX_VEX_0F2C,
1024 PREFIX_VEX_0F2D,
1025 PREFIX_VEX_0F2E,
1026 PREFIX_VEX_0F2F,
43234a1e
L
1027 PREFIX_VEX_0F41,
1028 PREFIX_VEX_0F42,
1029 PREFIX_VEX_0F44,
1030 PREFIX_VEX_0F45,
1031 PREFIX_VEX_0F46,
1032 PREFIX_VEX_0F47,
1ba585e8 1033 PREFIX_VEX_0F4A,
43234a1e 1034 PREFIX_VEX_0F4B,
592a252b
L
1035 PREFIX_VEX_0F51,
1036 PREFIX_VEX_0F52,
1037 PREFIX_VEX_0F53,
1038 PREFIX_VEX_0F58,
1039 PREFIX_VEX_0F59,
1040 PREFIX_VEX_0F5A,
1041 PREFIX_VEX_0F5B,
1042 PREFIX_VEX_0F5C,
1043 PREFIX_VEX_0F5D,
1044 PREFIX_VEX_0F5E,
1045 PREFIX_VEX_0F5F,
592a252b
L
1046 PREFIX_VEX_0F6F,
1047 PREFIX_VEX_0F70,
592a252b
L
1048 PREFIX_VEX_0F7C,
1049 PREFIX_VEX_0F7D,
1050 PREFIX_VEX_0F7E,
1051 PREFIX_VEX_0F7F,
43234a1e
L
1052 PREFIX_VEX_0F90,
1053 PREFIX_VEX_0F91,
1054 PREFIX_VEX_0F92,
1055 PREFIX_VEX_0F93,
1056 PREFIX_VEX_0F98,
1ba585e8 1057 PREFIX_VEX_0F99,
592a252b 1058 PREFIX_VEX_0FC2,
592a252b 1059 PREFIX_VEX_0FD0,
592a252b 1060 PREFIX_VEX_0FE6,
592a252b 1061 PREFIX_VEX_0FF0,
260cd341
LC
1062 PREFIX_VEX_0F3849_X86_64,
1063 PREFIX_VEX_0F384B_X86_64,
260cd341
LC
1064 PREFIX_VEX_0F385C_X86_64,
1065 PREFIX_VEX_0F385E_X86_64,
6c30d220
L
1066 PREFIX_VEX_0F38F5,
1067 PREFIX_VEX_0F38F6,
f12dc422 1068 PREFIX_VEX_0F38F7,
43234a1e
L
1069 PREFIX_VEX_0F3AF0,
1070
1071 PREFIX_EVEX_0F10,
1072 PREFIX_EVEX_0F11,
1073 PREFIX_EVEX_0F12,
43234a1e 1074 PREFIX_EVEX_0F16,
43234a1e 1075 PREFIX_EVEX_0F2A,
43234a1e
L
1076 PREFIX_EVEX_0F51,
1077 PREFIX_EVEX_0F58,
1078 PREFIX_EVEX_0F59,
1079 PREFIX_EVEX_0F5A,
1080 PREFIX_EVEX_0F5B,
1081 PREFIX_EVEX_0F5C,
1082 PREFIX_EVEX_0F5D,
1083 PREFIX_EVEX_0F5E,
1084 PREFIX_EVEX_0F5F,
43234a1e
L
1085 PREFIX_EVEX_0F6F,
1086 PREFIX_EVEX_0F70,
43234a1e
L
1087 PREFIX_EVEX_0F78,
1088 PREFIX_EVEX_0F79,
1089 PREFIX_EVEX_0F7A,
1090 PREFIX_EVEX_0F7B,
1091 PREFIX_EVEX_0F7E,
1092 PREFIX_EVEX_0F7F,
1093 PREFIX_EVEX_0FC2,
43234a1e 1094 PREFIX_EVEX_0FE6,
1ba585e8 1095 PREFIX_EVEX_0F3810,
43234a1e
L
1096 PREFIX_EVEX_0F3811,
1097 PREFIX_EVEX_0F3812,
1098 PREFIX_EVEX_0F3813,
1099 PREFIX_EVEX_0F3814,
1100 PREFIX_EVEX_0F3815,
1ba585e8 1101 PREFIX_EVEX_0F3820,
43234a1e
L
1102 PREFIX_EVEX_0F3821,
1103 PREFIX_EVEX_0F3822,
1104 PREFIX_EVEX_0F3823,
1105 PREFIX_EVEX_0F3824,
1106 PREFIX_EVEX_0F3825,
1ba585e8 1107 PREFIX_EVEX_0F3826,
43234a1e
L
1108 PREFIX_EVEX_0F3827,
1109 PREFIX_EVEX_0F3828,
1110 PREFIX_EVEX_0F3829,
1111 PREFIX_EVEX_0F382A,
1ba585e8 1112 PREFIX_EVEX_0F3830,
43234a1e
L
1113 PREFIX_EVEX_0F3831,
1114 PREFIX_EVEX_0F3832,
1115 PREFIX_EVEX_0F3833,
1116 PREFIX_EVEX_0F3834,
1117 PREFIX_EVEX_0F3835,
1ba585e8 1118 PREFIX_EVEX_0F3838,
43234a1e
L
1119 PREFIX_EVEX_0F3839,
1120 PREFIX_EVEX_0F383A,
47acf0bd
IT
1121 PREFIX_EVEX_0F3852,
1122 PREFIX_EVEX_0F3853,
9186c494 1123 PREFIX_EVEX_0F3868,
53467f57 1124 PREFIX_EVEX_0F3872,
43234a1e
L
1125 PREFIX_EVEX_0F389A,
1126 PREFIX_EVEX_0F389B,
43234a1e
L
1127 PREFIX_EVEX_0F38AA,
1128 PREFIX_EVEX_0F38AB,
51e7da1b 1129};
4e7d34a6 1130
51e7da1b
L
1131enum
1132{
1133 X86_64_06 = 0,
3873ba12 1134 X86_64_07,
1673df32 1135 X86_64_0E,
3873ba12
L
1136 X86_64_16,
1137 X86_64_17,
1138 X86_64_1E,
1139 X86_64_1F,
1140 X86_64_27,
1141 X86_64_2F,
1142 X86_64_37,
1143 X86_64_3F,
1144 X86_64_60,
1145 X86_64_61,
1146 X86_64_62,
1147 X86_64_63,
1148 X86_64_6D,
1149 X86_64_6F,
d039fef3 1150 X86_64_82,
3873ba12 1151 X86_64_9A,
aeab2b26
JB
1152 X86_64_C2,
1153 X86_64_C3,
3873ba12
L
1154 X86_64_C4,
1155 X86_64_C5,
1156 X86_64_CE,
1157 X86_64_D4,
1158 X86_64_D5,
a72d2af2
L
1159 X86_64_E8,
1160 X86_64_E9,
3873ba12
L
1161 X86_64_EA,
1162 X86_64_0F01_REG_0,
1163 X86_64_0F01_REG_1,
1164 X86_64_0F01_REG_2,
260cd341 1165 X86_64_0F01_REG_3,
78467458
JB
1166 X86_64_0F24,
1167 X86_64_0F26,
260cd341
LC
1168 X86_64_VEX_0F3849,
1169 X86_64_VEX_0F384B,
1170 X86_64_VEX_0F385C,
1171 X86_64_VEX_0F385E
51e7da1b 1172};
4e7d34a6 1173
51e7da1b
L
1174enum
1175{
1176 THREE_BYTE_0F38 = 0,
1f334aeb 1177 THREE_BYTE_0F3A
51e7da1b 1178};
4e7d34a6 1179
f88c9eb0
SP
1180enum
1181{
5dd85c99
SP
1182 XOP_08 = 0,
1183 XOP_09,
f88c9eb0
SP
1184 XOP_0A
1185};
1186
51e7da1b
L
1187enum
1188{
1189 VEX_0F = 0,
3873ba12
L
1190 VEX_0F38,
1191 VEX_0F3A
51e7da1b 1192};
c0f3af97 1193
43234a1e
L
1194enum
1195{
1196 EVEX_0F = 0,
1197 EVEX_0F38,
1198 EVEX_0F3A
1199};
1200
51e7da1b
L
1201enum
1202{
ec6f095a 1203 VEX_LEN_0F12_P_0_M_0 = 0,
592a252b 1204 VEX_LEN_0F12_P_0_M_1,
18897deb 1205#define VEX_LEN_0F12_P_2_M_0 VEX_LEN_0F12_P_0_M_0
592a252b
L
1206 VEX_LEN_0F13_M_0,
1207 VEX_LEN_0F16_P_0_M_0,
1208 VEX_LEN_0F16_P_0_M_1,
18897deb 1209#define VEX_LEN_0F16_P_2_M_0 VEX_LEN_0F16_P_0_M_0
592a252b 1210 VEX_LEN_0F17_M_0,
43234a1e 1211 VEX_LEN_0F41_P_0,
1ba585e8 1212 VEX_LEN_0F41_P_2,
43234a1e 1213 VEX_LEN_0F42_P_0,
1ba585e8 1214 VEX_LEN_0F42_P_2,
43234a1e 1215 VEX_LEN_0F44_P_0,
1ba585e8 1216 VEX_LEN_0F44_P_2,
43234a1e 1217 VEX_LEN_0F45_P_0,
1ba585e8 1218 VEX_LEN_0F45_P_2,
43234a1e 1219 VEX_LEN_0F46_P_0,
1ba585e8 1220 VEX_LEN_0F46_P_2,
43234a1e 1221 VEX_LEN_0F47_P_0,
1ba585e8
IT
1222 VEX_LEN_0F47_P_2,
1223 VEX_LEN_0F4A_P_0,
1224 VEX_LEN_0F4A_P_2,
1225 VEX_LEN_0F4B_P_0,
43234a1e 1226 VEX_LEN_0F4B_P_2,
7531c613 1227 VEX_LEN_0F6E,
035e7389 1228 VEX_LEN_0F77,
592a252b
L
1229 VEX_LEN_0F7E_P_1,
1230 VEX_LEN_0F7E_P_2,
43234a1e 1231 VEX_LEN_0F90_P_0,
1ba585e8 1232 VEX_LEN_0F90_P_2,
43234a1e 1233 VEX_LEN_0F91_P_0,
1ba585e8 1234 VEX_LEN_0F91_P_2,
43234a1e 1235 VEX_LEN_0F92_P_0,
90a915bf 1236 VEX_LEN_0F92_P_2,
1ba585e8 1237 VEX_LEN_0F92_P_3,
43234a1e 1238 VEX_LEN_0F93_P_0,
90a915bf 1239 VEX_LEN_0F93_P_2,
1ba585e8 1240 VEX_LEN_0F93_P_3,
43234a1e 1241 VEX_LEN_0F98_P_0,
1ba585e8
IT
1242 VEX_LEN_0F98_P_2,
1243 VEX_LEN_0F99_P_0,
1244 VEX_LEN_0F99_P_2,
592a252b
L
1245 VEX_LEN_0FAE_R_2_M_0,
1246 VEX_LEN_0FAE_R_3_M_0,
7531c613
JB
1247 VEX_LEN_0FC4,
1248 VEX_LEN_0FC5,
1249 VEX_LEN_0FD6,
1250 VEX_LEN_0FF7,
1251 VEX_LEN_0F3816,
1252 VEX_LEN_0F3819,
1253 VEX_LEN_0F381A_M_0,
1254 VEX_LEN_0F3836,
1255 VEX_LEN_0F3841,
260cd341
LC
1256 VEX_LEN_0F3849_X86_64_P_0_W_0_M_0,
1257 VEX_LEN_0F3849_X86_64_P_0_W_0_M_1_REG_0_RM_0,
1258 VEX_LEN_0F3849_X86_64_P_2_W_0_M_0,
1259 VEX_LEN_0F3849_X86_64_P_3_W_0_M_0,
1260 VEX_LEN_0F384B_X86_64_P_1_W_0_M_0,
1261 VEX_LEN_0F384B_X86_64_P_2_W_0_M_0,
1262 VEX_LEN_0F384B_X86_64_P_3_W_0_M_0,
7531c613 1263 VEX_LEN_0F385A_M_0,
260cd341
LC
1264 VEX_LEN_0F385C_X86_64_P_1_W_0_M_0,
1265 VEX_LEN_0F385E_X86_64_P_0_W_0_M_0,
1266 VEX_LEN_0F385E_X86_64_P_1_W_0_M_0,
1267 VEX_LEN_0F385E_X86_64_P_2_W_0_M_0,
1268 VEX_LEN_0F385E_X86_64_P_3_W_0_M_0,
7531c613 1269 VEX_LEN_0F38DB,
035e7389
JB
1270 VEX_LEN_0F38F2,
1271 VEX_LEN_0F38F3_R_1,
1272 VEX_LEN_0F38F3_R_2,
1273 VEX_LEN_0F38F3_R_3,
6c30d220
L
1274 VEX_LEN_0F38F5_P_0,
1275 VEX_LEN_0F38F5_P_1,
1276 VEX_LEN_0F38F5_P_3,
1277 VEX_LEN_0F38F6_P_3,
f12dc422 1278 VEX_LEN_0F38F7_P_0,
6c30d220
L
1279 VEX_LEN_0F38F7_P_1,
1280 VEX_LEN_0F38F7_P_2,
1281 VEX_LEN_0F38F7_P_3,
7531c613
JB
1282 VEX_LEN_0F3A00,
1283 VEX_LEN_0F3A01,
1284 VEX_LEN_0F3A06,
1285 VEX_LEN_0F3A14,
1286 VEX_LEN_0F3A15,
1287 VEX_LEN_0F3A16,
1288 VEX_LEN_0F3A17,
1289 VEX_LEN_0F3A18,
1290 VEX_LEN_0F3A19,
1291 VEX_LEN_0F3A20,
1292 VEX_LEN_0F3A21,
1293 VEX_LEN_0F3A22,
1294 VEX_LEN_0F3A30,
1295 VEX_LEN_0F3A31,
1296 VEX_LEN_0F3A32,
1297 VEX_LEN_0F3A33,
1298 VEX_LEN_0F3A38,
1299 VEX_LEN_0F3A39,
1300 VEX_LEN_0F3A41,
1301 VEX_LEN_0F3A46,
1302 VEX_LEN_0F3A60,
1303 VEX_LEN_0F3A61,
1304 VEX_LEN_0F3A62,
1305 VEX_LEN_0F3A63,
1306 VEX_LEN_0F3ADF,
6c30d220 1307 VEX_LEN_0F3AF0_P_3,
467bbef0
JB
1308 VEX_LEN_0FXOP_08_85,
1309 VEX_LEN_0FXOP_08_86,
1310 VEX_LEN_0FXOP_08_87,
1311 VEX_LEN_0FXOP_08_8E,
1312 VEX_LEN_0FXOP_08_8F,
1313 VEX_LEN_0FXOP_08_95,
1314 VEX_LEN_0FXOP_08_96,
1315 VEX_LEN_0FXOP_08_97,
1316 VEX_LEN_0FXOP_08_9E,
1317 VEX_LEN_0FXOP_08_9F,
1318 VEX_LEN_0FXOP_08_A3,
1319 VEX_LEN_0FXOP_08_A6,
1320 VEX_LEN_0FXOP_08_B6,
1321 VEX_LEN_0FXOP_08_C0,
1322 VEX_LEN_0FXOP_08_C1,
1323 VEX_LEN_0FXOP_08_C2,
1324 VEX_LEN_0FXOP_08_C3,
ff688e1f
L
1325 VEX_LEN_0FXOP_08_CC,
1326 VEX_LEN_0FXOP_08_CD,
1327 VEX_LEN_0FXOP_08_CE,
1328 VEX_LEN_0FXOP_08_CF,
1329 VEX_LEN_0FXOP_08_EC,
1330 VEX_LEN_0FXOP_08_ED,
1331 VEX_LEN_0FXOP_08_EE,
1332 VEX_LEN_0FXOP_08_EF,
467bbef0
JB
1333 VEX_LEN_0FXOP_09_01,
1334 VEX_LEN_0FXOP_09_02,
1335 VEX_LEN_0FXOP_09_12_M_1,
b5b098c2
JB
1336 VEX_LEN_0FXOP_09_82_W_0,
1337 VEX_LEN_0FXOP_09_83_W_0,
467bbef0
JB
1338 VEX_LEN_0FXOP_09_90,
1339 VEX_LEN_0FXOP_09_91,
1340 VEX_LEN_0FXOP_09_92,
1341 VEX_LEN_0FXOP_09_93,
1342 VEX_LEN_0FXOP_09_94,
1343 VEX_LEN_0FXOP_09_95,
1344 VEX_LEN_0FXOP_09_96,
1345 VEX_LEN_0FXOP_09_97,
1346 VEX_LEN_0FXOP_09_98,
1347 VEX_LEN_0FXOP_09_99,
1348 VEX_LEN_0FXOP_09_9A,
1349 VEX_LEN_0FXOP_09_9B,
1350 VEX_LEN_0FXOP_09_C1,
1351 VEX_LEN_0FXOP_09_C2,
1352 VEX_LEN_0FXOP_09_C3,
1353 VEX_LEN_0FXOP_09_C6,
1354 VEX_LEN_0FXOP_09_C7,
1355 VEX_LEN_0FXOP_09_CB,
1356 VEX_LEN_0FXOP_09_D1,
1357 VEX_LEN_0FXOP_09_D2,
1358 VEX_LEN_0FXOP_09_D3,
1359 VEX_LEN_0FXOP_09_D6,
1360 VEX_LEN_0FXOP_09_D7,
1361 VEX_LEN_0FXOP_09_DB,
1362 VEX_LEN_0FXOP_09_E1,
1363 VEX_LEN_0FXOP_09_E2,
1364 VEX_LEN_0FXOP_09_E3,
1365 VEX_LEN_0FXOP_0A_12,
51e7da1b 1366};
c0f3af97 1367
04e2a182
L
1368enum
1369{
7531c613 1370 EVEX_LEN_0F6E = 0,
04e2a182
L
1371 EVEX_LEN_0F7E_P_1,
1372 EVEX_LEN_0F7E_P_2,
7531c613
JB
1373 EVEX_LEN_0FC4,
1374 EVEX_LEN_0FC5,
1375 EVEX_LEN_0FD6,
1376 EVEX_LEN_0F3816,
1377 EVEX_LEN_0F3819_W_0,
1378 EVEX_LEN_0F3819_W_1,
1379 EVEX_LEN_0F381A_W_0_M_0,
1380 EVEX_LEN_0F381A_W_1_M_0,
1381 EVEX_LEN_0F381B_W_0_M_0,
1382 EVEX_LEN_0F381B_W_1_M_0,
1383 EVEX_LEN_0F3836,
1384 EVEX_LEN_0F385A_W_0_M_0,
1385 EVEX_LEN_0F385A_W_1_M_0,
1386 EVEX_LEN_0F385B_W_0_M_0,
1387 EVEX_LEN_0F385B_W_1_M_0,
1388 EVEX_LEN_0F38C6_R_1_M_0,
1389 EVEX_LEN_0F38C6_R_2_M_0,
1390 EVEX_LEN_0F38C6_R_5_M_0,
1391 EVEX_LEN_0F38C6_R_6_M_0,
1392 EVEX_LEN_0F38C7_R_1_M_0_W_0,
1393 EVEX_LEN_0F38C7_R_1_M_0_W_1,
1394 EVEX_LEN_0F38C7_R_2_M_0_W_0,
1395 EVEX_LEN_0F38C7_R_2_M_0_W_1,
1396 EVEX_LEN_0F38C7_R_5_M_0_W_0,
1397 EVEX_LEN_0F38C7_R_5_M_0_W_1,
1398 EVEX_LEN_0F38C7_R_6_M_0_W_0,
1399 EVEX_LEN_0F38C7_R_6_M_0_W_1,
1400 EVEX_LEN_0F3A00_W_1,
1401 EVEX_LEN_0F3A01_W_1,
1402 EVEX_LEN_0F3A14,
1403 EVEX_LEN_0F3A15,
1404 EVEX_LEN_0F3A16,
1405 EVEX_LEN_0F3A17,
1406 EVEX_LEN_0F3A18_W_0,
1407 EVEX_LEN_0F3A18_W_1,
1408 EVEX_LEN_0F3A19_W_0,
1409 EVEX_LEN_0F3A19_W_1,
1410 EVEX_LEN_0F3A1A_W_0,
1411 EVEX_LEN_0F3A1A_W_1,
1412 EVEX_LEN_0F3A1B_W_0,
1413 EVEX_LEN_0F3A1B_W_1,
1414 EVEX_LEN_0F3A20,
1415 EVEX_LEN_0F3A21_W_0,
1416 EVEX_LEN_0F3A22,
1417 EVEX_LEN_0F3A23_W_0,
1418 EVEX_LEN_0F3A23_W_1,
1419 EVEX_LEN_0F3A38_W_0,
1420 EVEX_LEN_0F3A38_W_1,
1421 EVEX_LEN_0F3A39_W_0,
1422 EVEX_LEN_0F3A39_W_1,
1423 EVEX_LEN_0F3A3A_W_0,
1424 EVEX_LEN_0F3A3A_W_1,
1425 EVEX_LEN_0F3A3B_W_0,
1426 EVEX_LEN_0F3A3B_W_1,
1427 EVEX_LEN_0F3A43_W_0,
1428 EVEX_LEN_0F3A43_W_1
04e2a182
L
1429};
1430
9e30b8e0
L
1431enum
1432{
ec6f095a 1433 VEX_W_0F41_P_0_LEN_1 = 0,
1ba585e8 1434 VEX_W_0F41_P_2_LEN_1,
43234a1e 1435 VEX_W_0F42_P_0_LEN_1,
1ba585e8 1436 VEX_W_0F42_P_2_LEN_1,
43234a1e 1437 VEX_W_0F44_P_0_LEN_0,
1ba585e8 1438 VEX_W_0F44_P_2_LEN_0,
43234a1e 1439 VEX_W_0F45_P_0_LEN_1,
1ba585e8 1440 VEX_W_0F45_P_2_LEN_1,
43234a1e 1441 VEX_W_0F46_P_0_LEN_1,
1ba585e8 1442 VEX_W_0F46_P_2_LEN_1,
43234a1e 1443 VEX_W_0F47_P_0_LEN_1,
1ba585e8
IT
1444 VEX_W_0F47_P_2_LEN_1,
1445 VEX_W_0F4A_P_0_LEN_1,
1446 VEX_W_0F4A_P_2_LEN_1,
1447 VEX_W_0F4B_P_0_LEN_1,
43234a1e 1448 VEX_W_0F4B_P_2_LEN_1,
43234a1e 1449 VEX_W_0F90_P_0_LEN_0,
1ba585e8 1450 VEX_W_0F90_P_2_LEN_0,
43234a1e 1451 VEX_W_0F91_P_0_LEN_0,
1ba585e8 1452 VEX_W_0F91_P_2_LEN_0,
43234a1e 1453 VEX_W_0F92_P_0_LEN_0,
90a915bf 1454 VEX_W_0F92_P_2_LEN_0,
43234a1e 1455 VEX_W_0F93_P_0_LEN_0,
90a915bf 1456 VEX_W_0F93_P_2_LEN_0,
43234a1e 1457 VEX_W_0F98_P_0_LEN_0,
1ba585e8
IT
1458 VEX_W_0F98_P_2_LEN_0,
1459 VEX_W_0F99_P_0_LEN_0,
1460 VEX_W_0F99_P_2_LEN_0,
7531c613
JB
1461 VEX_W_0F380C,
1462 VEX_W_0F380D,
1463 VEX_W_0F380E,
1464 VEX_W_0F380F,
1465 VEX_W_0F3813,
1466 VEX_W_0F3816_L_1,
1467 VEX_W_0F3818,
1468 VEX_W_0F3819_L_1,
1469 VEX_W_0F381A_M_0_L_1,
1470 VEX_W_0F382C_M_0,
1471 VEX_W_0F382D_M_0,
1472 VEX_W_0F382E_M_0,
1473 VEX_W_0F382F_M_0,
1474 VEX_W_0F3836,
1475 VEX_W_0F3846,
260cd341
LC
1476 VEX_W_0F3849_X86_64_P_0,
1477 VEX_W_0F3849_X86_64_P_2,
1478 VEX_W_0F3849_X86_64_P_3,
1479 VEX_W_0F384B_X86_64_P_1,
1480 VEX_W_0F384B_X86_64_P_2,
1481 VEX_W_0F384B_X86_64_P_3,
7531c613
JB
1482 VEX_W_0F3858,
1483 VEX_W_0F3859,
1484 VEX_W_0F385A_M_0_L_0,
260cd341
LC
1485 VEX_W_0F385C_X86_64_P_1,
1486 VEX_W_0F385E_X86_64_P_0,
1487 VEX_W_0F385E_X86_64_P_1,
1488 VEX_W_0F385E_X86_64_P_2,
1489 VEX_W_0F385E_X86_64_P_3,
7531c613
JB
1490 VEX_W_0F3878,
1491 VEX_W_0F3879,
1492 VEX_W_0F38CF,
1493 VEX_W_0F3A00_L_1,
1494 VEX_W_0F3A01_L_1,
1495 VEX_W_0F3A02,
1496 VEX_W_0F3A04,
1497 VEX_W_0F3A05,
1498 VEX_W_0F3A06_L_1,
1499 VEX_W_0F3A18_L_1,
1500 VEX_W_0F3A19_L_1,
1501 VEX_W_0F3A1D,
7531c613
JB
1502 VEX_W_0F3A38_L_1,
1503 VEX_W_0F3A39_L_1,
1504 VEX_W_0F3A46_L_1,
1505 VEX_W_0F3A4A,
1506 VEX_W_0F3A4B,
1507 VEX_W_0F3A4C,
1508 VEX_W_0F3ACE,
1509 VEX_W_0F3ACF,
43234a1e 1510
467bbef0
JB
1511 VEX_W_0FXOP_08_85_L_0,
1512 VEX_W_0FXOP_08_86_L_0,
1513 VEX_W_0FXOP_08_87_L_0,
1514 VEX_W_0FXOP_08_8E_L_0,
1515 VEX_W_0FXOP_08_8F_L_0,
1516 VEX_W_0FXOP_08_95_L_0,
1517 VEX_W_0FXOP_08_96_L_0,
1518 VEX_W_0FXOP_08_97_L_0,
1519 VEX_W_0FXOP_08_9E_L_0,
1520 VEX_W_0FXOP_08_9F_L_0,
1521 VEX_W_0FXOP_08_A6_L_0,
1522 VEX_W_0FXOP_08_B6_L_0,
1523 VEX_W_0FXOP_08_C0_L_0,
1524 VEX_W_0FXOP_08_C1_L_0,
1525 VEX_W_0FXOP_08_C2_L_0,
1526 VEX_W_0FXOP_08_C3_L_0,
1527 VEX_W_0FXOP_08_CC_L_0,
1528 VEX_W_0FXOP_08_CD_L_0,
1529 VEX_W_0FXOP_08_CE_L_0,
1530 VEX_W_0FXOP_08_CF_L_0,
1531 VEX_W_0FXOP_08_EC_L_0,
1532 VEX_W_0FXOP_08_ED_L_0,
1533 VEX_W_0FXOP_08_EE_L_0,
1534 VEX_W_0FXOP_08_EF_L_0,
1535
b5b098c2
JB
1536 VEX_W_0FXOP_09_80,
1537 VEX_W_0FXOP_09_81,
1538 VEX_W_0FXOP_09_82,
1539 VEX_W_0FXOP_09_83,
467bbef0
JB
1540 VEX_W_0FXOP_09_C1_L_0,
1541 VEX_W_0FXOP_09_C2_L_0,
1542 VEX_W_0FXOP_09_C3_L_0,
1543 VEX_W_0FXOP_09_C6_L_0,
1544 VEX_W_0FXOP_09_C7_L_0,
1545 VEX_W_0FXOP_09_CB_L_0,
1546 VEX_W_0FXOP_09_D1_L_0,
1547 VEX_W_0FXOP_09_D2_L_0,
1548 VEX_W_0FXOP_09_D3_L_0,
1549 VEX_W_0FXOP_09_D6_L_0,
1550 VEX_W_0FXOP_09_D7_L_0,
1551 VEX_W_0FXOP_09_DB_L_0,
1552 VEX_W_0FXOP_09_E1_L_0,
1553 VEX_W_0FXOP_09_E2_L_0,
1554 VEX_W_0FXOP_09_E3_L_0,
b5b098c2 1555
36cc073e 1556 EVEX_W_0F10_P_1,
36cc073e 1557 EVEX_W_0F10_P_3,
36cc073e 1558 EVEX_W_0F11_P_1,
36cc073e 1559 EVEX_W_0F11_P_3,
43234a1e
L
1560 EVEX_W_0F12_P_0_M_1,
1561 EVEX_W_0F12_P_1,
43234a1e 1562 EVEX_W_0F12_P_3,
43234a1e
L
1563 EVEX_W_0F16_P_0_M_1,
1564 EVEX_W_0F16_P_1,
43234a1e 1565 EVEX_W_0F2A_P_3,
43234a1e 1566 EVEX_W_0F51_P_1,
43234a1e 1567 EVEX_W_0F51_P_3,
43234a1e 1568 EVEX_W_0F58_P_1,
43234a1e 1569 EVEX_W_0F58_P_3,
43234a1e 1570 EVEX_W_0F59_P_1,
43234a1e
L
1571 EVEX_W_0F59_P_3,
1572 EVEX_W_0F5A_P_0,
1573 EVEX_W_0F5A_P_1,
1574 EVEX_W_0F5A_P_2,
1575 EVEX_W_0F5A_P_3,
1576 EVEX_W_0F5B_P_0,
1577 EVEX_W_0F5B_P_1,
1578 EVEX_W_0F5B_P_2,
43234a1e 1579 EVEX_W_0F5C_P_1,
43234a1e 1580 EVEX_W_0F5C_P_3,
43234a1e 1581 EVEX_W_0F5D_P_1,
43234a1e 1582 EVEX_W_0F5D_P_3,
43234a1e 1583 EVEX_W_0F5E_P_1,
43234a1e 1584 EVEX_W_0F5E_P_3,
43234a1e 1585 EVEX_W_0F5F_P_1,
43234a1e 1586 EVEX_W_0F5F_P_3,
fedfb81e 1587 EVEX_W_0F62,
7531c613 1588 EVEX_W_0F66,
fedfb81e
JB
1589 EVEX_W_0F6A,
1590 EVEX_W_0F6B,
1591 EVEX_W_0F6C,
1592 EVEX_W_0F6D,
43234a1e
L
1593 EVEX_W_0F6F_P_1,
1594 EVEX_W_0F6F_P_2,
1ba585e8 1595 EVEX_W_0F6F_P_3,
43234a1e 1596 EVEX_W_0F70_P_2,
7531c613
JB
1597 EVEX_W_0F72_R_2,
1598 EVEX_W_0F72_R_6,
1599 EVEX_W_0F73_R_2,
1600 EVEX_W_0F73_R_6,
1601 EVEX_W_0F76,
43234a1e 1602 EVEX_W_0F78_P_0,
90a915bf 1603 EVEX_W_0F78_P_2,
43234a1e 1604 EVEX_W_0F79_P_0,
90a915bf 1605 EVEX_W_0F79_P_2,
43234a1e 1606 EVEX_W_0F7A_P_1,
90a915bf 1607 EVEX_W_0F7A_P_2,
43234a1e 1608 EVEX_W_0F7A_P_3,
90a915bf 1609 EVEX_W_0F7B_P_2,
43234a1e
L
1610 EVEX_W_0F7B_P_3,
1611 EVEX_W_0F7E_P_1,
43234a1e
L
1612 EVEX_W_0F7F_P_1,
1613 EVEX_W_0F7F_P_2,
1ba585e8 1614 EVEX_W_0F7F_P_3,
43234a1e 1615 EVEX_W_0FC2_P_1,
43234a1e 1616 EVEX_W_0FC2_P_3,
fedfb81e
JB
1617 EVEX_W_0FD2,
1618 EVEX_W_0FD3,
1619 EVEX_W_0FD4,
7531c613 1620 EVEX_W_0FD6_L_0,
43234a1e
L
1621 EVEX_W_0FE6_P_1,
1622 EVEX_W_0FE6_P_2,
1623 EVEX_W_0FE6_P_3,
7531c613 1624 EVEX_W_0FE7,
fedfb81e
JB
1625 EVEX_W_0FF2,
1626 EVEX_W_0FF3,
1627 EVEX_W_0FF4,
1628 EVEX_W_0FFA,
1629 EVEX_W_0FFB,
1630 EVEX_W_0FFE,
7531c613 1631 EVEX_W_0F380D,
1ba585e8
IT
1632 EVEX_W_0F3810_P_1,
1633 EVEX_W_0F3810_P_2,
43234a1e 1634 EVEX_W_0F3811_P_1,
1ba585e8 1635 EVEX_W_0F3811_P_2,
43234a1e 1636 EVEX_W_0F3812_P_1,
1ba585e8 1637 EVEX_W_0F3812_P_2,
43234a1e
L
1638 EVEX_W_0F3813_P_1,
1639 EVEX_W_0F3813_P_2,
1640 EVEX_W_0F3814_P_1,
1641 EVEX_W_0F3815_P_1,
7531c613
JB
1642 EVEX_W_0F3819,
1643 EVEX_W_0F381A,
1644 EVEX_W_0F381B,
1645 EVEX_W_0F381E,
1646 EVEX_W_0F381F,
1ba585e8 1647 EVEX_W_0F3820_P_1,
43234a1e
L
1648 EVEX_W_0F3821_P_1,
1649 EVEX_W_0F3822_P_1,
1650 EVEX_W_0F3823_P_1,
1651 EVEX_W_0F3824_P_1,
1652 EVEX_W_0F3825_P_1,
1653 EVEX_W_0F3825_P_2,
1654 EVEX_W_0F3828_P_2,
1655 EVEX_W_0F3829_P_2,
1656 EVEX_W_0F382A_P_1,
1657 EVEX_W_0F382A_P_2,
fedfb81e 1658 EVEX_W_0F382B,
1ba585e8 1659 EVEX_W_0F3830_P_1,
43234a1e
L
1660 EVEX_W_0F3831_P_1,
1661 EVEX_W_0F3832_P_1,
1662 EVEX_W_0F3833_P_1,
1663 EVEX_W_0F3834_P_1,
1664 EVEX_W_0F3835_P_1,
1665 EVEX_W_0F3835_P_2,
7531c613 1666 EVEX_W_0F3837,
43234a1e 1667 EVEX_W_0F383A_P_1,
d6aab7a1 1668 EVEX_W_0F3852_P_1,
7531c613
JB
1669 EVEX_W_0F3859,
1670 EVEX_W_0F385A,
1671 EVEX_W_0F385B,
1672 EVEX_W_0F3870,
d6aab7a1 1673 EVEX_W_0F3872_P_1,
53467f57 1674 EVEX_W_0F3872_P_2,
d6aab7a1 1675 EVEX_W_0F3872_P_3,
7531c613
JB
1676 EVEX_W_0F387A,
1677 EVEX_W_0F387B,
1678 EVEX_W_0F3883,
1679 EVEX_W_0F3891,
1680 EVEX_W_0F3893,
1681 EVEX_W_0F38A1,
1682 EVEX_W_0F38A3,
1683 EVEX_W_0F38C7_R_1_M_0,
1684 EVEX_W_0F38C7_R_2_M_0,
1685 EVEX_W_0F38C7_R_5_M_0,
1686 EVEX_W_0F38C7_R_6_M_0,
1687
1688 EVEX_W_0F3A00,
1689 EVEX_W_0F3A01,
1690 EVEX_W_0F3A05,
1691 EVEX_W_0F3A08,
1692 EVEX_W_0F3A09,
1693 EVEX_W_0F3A0A,
1694 EVEX_W_0F3A0B,
1695 EVEX_W_0F3A18,
1696 EVEX_W_0F3A19,
1697 EVEX_W_0F3A1A,
1698 EVEX_W_0F3A1B,
1699 EVEX_W_0F3A21,
1700 EVEX_W_0F3A23,
1701 EVEX_W_0F3A38,
1702 EVEX_W_0F3A39,
1703 EVEX_W_0F3A3A,
1704 EVEX_W_0F3A3B,
1705 EVEX_W_0F3A42,
1706 EVEX_W_0F3A43,
1707 EVEX_W_0F3A70,
1708 EVEX_W_0F3A72,
9e30b8e0
L
1709};
1710
26ca5450 1711typedef void (*op_rtn) (int bytemode, int sizeflag);
252b5132
RH
1712
1713struct dis386 {
2da11e11 1714 const char *name;
ce518a5f
L
1715 struct
1716 {
1717 op_rtn rtn;
1718 int bytemode;
1719 } op[MAX_OPERANDS];
bf890a93 1720 unsigned int prefix_requirement;
252b5132
RH
1721};
1722
1723/* Upper case letters in the instruction names here are macros.
1724 'A' => print 'b' if no register operands or suffix_always is true
1725 'B' => print 'b' if suffix_always is true
9306ca4a 1726 'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
98b528ac 1727 size prefix
ed7841b3 1728 'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
98b528ac 1729 suffix_always is true
252b5132 1730 'E' => print 'e' if 32-bit form of jcxz
3ffd33cf 1731 'F' => print 'w' or 'l' depending on address size prefix (loop insns)
52fd6d94 1732 'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
5dd0794d 1733 'H' => print ",pt" or ",pn" branch hint
d1c36125 1734 'I' unused.
8f570d62 1735 'J' unused.
42903f7f 1736 'K' => print 'd' or 'q' if rex prefix is present.
78467458 1737 'L' unused.
9d141669 1738 'M' => print 'r' if intel_mnemonic is false.
252b5132 1739 'N' => print 'n' if instruction has no wait "prefix"
a35ca55a 1740 'O' => print 'd' or 'o' (or 'q' in Intel mode)
52b15da3 1741 'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix,
98b528ac
L
1742 or suffix_always is true. print 'q' if rex prefix is present.
1743 'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
1744 is true
a35ca55a 1745 'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
52b15da3 1746 'S' => print 'w', 'l' or 'q' if suffix_always is true
a72d2af2
L
1747 'T' => print 'q' in 64bit mode if instruction has no operand size
1748 prefix and behave as 'P' otherwise
1749 'U' => print 'q' in 64bit mode if instruction has no operand size
1750 prefix and behave as 'Q' otherwise
1751 'V' => print 'q' in 64bit mode if instruction has no operand size
1752 prefix and behave as 'S' otherwise
a35ca55a 1753 'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
9306ca4a 1754 'X' => print 's', 'd' depending on data16 prefix (for XMM)
9646c87b 1755 'Y' unused.
78467458 1756 'Z' => print 'q' in 64bit mode and 'l' otherwise, if suffix_always is true.
9d141669 1757 '!' => change condition from true to false or from false to true.
98b528ac 1758 '%' => add 1 upper case letter to the macro.
5990e377
JB
1759 '^' => print 'w', 'l', or 'q' (Intel64 ISA only) depending on operand size
1760 prefix or suffix_always is true (lcall/ljmp).
5db04b09
L
1761 '@' => print 'q' for Intel64 ISA, 'w' or 'q' for AMD64 ISA depending
1762 on operand size prefix.
07f5af7d
L
1763 '&' => print 'q' in 64bit mode for Intel64 ISA or if instruction
1764 has no operand size prefix for AMD64 ISA, behave as 'P'
1765 otherwise
98b528ac
L
1766
1767 2 upper case letter macros:
04d824a4
JB
1768 "XY" => print 'x' or 'y' if suffix_always is true or no register
1769 operands and no broadcast.
1770 "XZ" => print 'x', 'y', or 'z' if suffix_always is true or no
1771 register operands and no broadcast.
4b06377f 1772 "XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
b24d668c
JB
1773 "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand, cond
1774 being false, or no operand at all in 64bit mode, or if suffix_always
589958d6 1775 is true.
4b06377f
L
1776 "LB" => print "abs" in 64bit mode and behave as 'B' otherwise
1777 "LS" => print "abs" in 64bit mode and behave as 'S' otherwise
1778 "LV" => print "abs" for 64bit operand and behave as 'S' otherwise
492a76aa 1779 "DQ" => print 'd' or 'q' depending on the VEX.W bit
bb5b3501 1780 "BW" => print 'b' or 'w' depending on the VEX.W bit
4b4c407a
L
1781 "LP" => print 'w' or 'l' ('d' in Intel mode) if instruction has
1782 an operand size prefix, or suffix_always is true. print
1783 'q' if rex prefix is present.
52b15da3 1784
6439fc28
AM
1785 Many of the above letters print nothing in Intel mode. See "putop"
1786 for the details.
52b15da3 1787
6439fc28 1788 Braces '{' and '}', and vertical bars '|', indicate alternative
7c52e0e8 1789 mnemonic strings for AT&T and Intel. */
252b5132 1790
6439fc28 1791static const struct dis386 dis386[] = {
252b5132 1792 /* 00 */
bf890a93
IT
1793 { "addB", { Ebh1, Gb }, 0 },
1794 { "addS", { Evh1, Gv }, 0 },
1795 { "addB", { Gb, EbS }, 0 },
1796 { "addS", { Gv, EvS }, 0 },
1797 { "addB", { AL, Ib }, 0 },
1798 { "addS", { eAX, Iv }, 0 },
4e7d34a6
L
1799 { X86_64_TABLE (X86_64_06) },
1800 { X86_64_TABLE (X86_64_07) },
252b5132 1801 /* 08 */
bf890a93
IT
1802 { "orB", { Ebh1, Gb }, 0 },
1803 { "orS", { Evh1, Gv }, 0 },
1804 { "orB", { Gb, EbS }, 0 },
1805 { "orS", { Gv, EvS }, 0 },
1806 { "orB", { AL, Ib }, 0 },
1807 { "orS", { eAX, Iv }, 0 },
1673df32 1808 { X86_64_TABLE (X86_64_0E) },
592d1631 1809 { Bad_Opcode }, /* 0x0f extended opcode escape */
252b5132 1810 /* 10 */
bf890a93
IT
1811 { "adcB", { Ebh1, Gb }, 0 },
1812 { "adcS", { Evh1, Gv }, 0 },
1813 { "adcB", { Gb, EbS }, 0 },
1814 { "adcS", { Gv, EvS }, 0 },
1815 { "adcB", { AL, Ib }, 0 },
1816 { "adcS", { eAX, Iv }, 0 },
4e7d34a6
L
1817 { X86_64_TABLE (X86_64_16) },
1818 { X86_64_TABLE (X86_64_17) },
252b5132 1819 /* 18 */
bf890a93
IT
1820 { "sbbB", { Ebh1, Gb }, 0 },
1821 { "sbbS", { Evh1, Gv }, 0 },
1822 { "sbbB", { Gb, EbS }, 0 },
1823 { "sbbS", { Gv, EvS }, 0 },
1824 { "sbbB", { AL, Ib }, 0 },
1825 { "sbbS", { eAX, Iv }, 0 },
4e7d34a6
L
1826 { X86_64_TABLE (X86_64_1E) },
1827 { X86_64_TABLE (X86_64_1F) },
252b5132 1828 /* 20 */
bf890a93
IT
1829 { "andB", { Ebh1, Gb }, 0 },
1830 { "andS", { Evh1, Gv }, 0 },
1831 { "andB", { Gb, EbS }, 0 },
1832 { "andS", { Gv, EvS }, 0 },
1833 { "andB", { AL, Ib }, 0 },
1834 { "andS", { eAX, Iv }, 0 },
592d1631 1835 { Bad_Opcode }, /* SEG ES prefix */
4e7d34a6 1836 { X86_64_TABLE (X86_64_27) },
252b5132 1837 /* 28 */
bf890a93
IT
1838 { "subB", { Ebh1, Gb }, 0 },
1839 { "subS", { Evh1, Gv }, 0 },
1840 { "subB", { Gb, EbS }, 0 },
1841 { "subS", { Gv, EvS }, 0 },
1842 { "subB", { AL, Ib }, 0 },
1843 { "subS", { eAX, Iv }, 0 },
592d1631 1844 { Bad_Opcode }, /* SEG CS prefix */
4e7d34a6 1845 { X86_64_TABLE (X86_64_2F) },
252b5132 1846 /* 30 */
bf890a93
IT
1847 { "xorB", { Ebh1, Gb }, 0 },
1848 { "xorS", { Evh1, Gv }, 0 },
1849 { "xorB", { Gb, EbS }, 0 },
1850 { "xorS", { Gv, EvS }, 0 },
1851 { "xorB", { AL, Ib }, 0 },
1852 { "xorS", { eAX, Iv }, 0 },
592d1631 1853 { Bad_Opcode }, /* SEG SS prefix */
4e7d34a6 1854 { X86_64_TABLE (X86_64_37) },
252b5132 1855 /* 38 */
bf890a93
IT
1856 { "cmpB", { Eb, Gb }, 0 },
1857 { "cmpS", { Ev, Gv }, 0 },
1858 { "cmpB", { Gb, EbS }, 0 },
1859 { "cmpS", { Gv, EvS }, 0 },
1860 { "cmpB", { AL, Ib }, 0 },
1861 { "cmpS", { eAX, Iv }, 0 },
592d1631 1862 { Bad_Opcode }, /* SEG DS prefix */
4e7d34a6 1863 { X86_64_TABLE (X86_64_3F) },
252b5132 1864 /* 40 */
bf890a93
IT
1865 { "inc{S|}", { RMeAX }, 0 },
1866 { "inc{S|}", { RMeCX }, 0 },
1867 { "inc{S|}", { RMeDX }, 0 },
1868 { "inc{S|}", { RMeBX }, 0 },
1869 { "inc{S|}", { RMeSP }, 0 },
1870 { "inc{S|}", { RMeBP }, 0 },
1871 { "inc{S|}", { RMeSI }, 0 },
1872 { "inc{S|}", { RMeDI }, 0 },
252b5132 1873 /* 48 */
bf890a93
IT
1874 { "dec{S|}", { RMeAX }, 0 },
1875 { "dec{S|}", { RMeCX }, 0 },
1876 { "dec{S|}", { RMeDX }, 0 },
1877 { "dec{S|}", { RMeBX }, 0 },
1878 { "dec{S|}", { RMeSP }, 0 },
1879 { "dec{S|}", { RMeBP }, 0 },
1880 { "dec{S|}", { RMeSI }, 0 },
1881 { "dec{S|}", { RMeDI }, 0 },
252b5132 1882 /* 50 */
bf890a93
IT
1883 { "pushV", { RMrAX }, 0 },
1884 { "pushV", { RMrCX }, 0 },
1885 { "pushV", { RMrDX }, 0 },
1886 { "pushV", { RMrBX }, 0 },
1887 { "pushV", { RMrSP }, 0 },
1888 { "pushV", { RMrBP }, 0 },
1889 { "pushV", { RMrSI }, 0 },
1890 { "pushV", { RMrDI }, 0 },
252b5132 1891 /* 58 */
bf890a93
IT
1892 { "popV", { RMrAX }, 0 },
1893 { "popV", { RMrCX }, 0 },
1894 { "popV", { RMrDX }, 0 },
1895 { "popV", { RMrBX }, 0 },
1896 { "popV", { RMrSP }, 0 },
1897 { "popV", { RMrBP }, 0 },
1898 { "popV", { RMrSI }, 0 },
1899 { "popV", { RMrDI }, 0 },
252b5132 1900 /* 60 */
4e7d34a6
L
1901 { X86_64_TABLE (X86_64_60) },
1902 { X86_64_TABLE (X86_64_61) },
1903 { X86_64_TABLE (X86_64_62) },
1904 { X86_64_TABLE (X86_64_63) },
592d1631
L
1905 { Bad_Opcode }, /* seg fs */
1906 { Bad_Opcode }, /* seg gs */
1907 { Bad_Opcode }, /* op size prefix */
1908 { Bad_Opcode }, /* adr size prefix */
252b5132 1909 /* 68 */
bf890a93
IT
1910 { "pushT", { sIv }, 0 },
1911 { "imulS", { Gv, Ev, Iv }, 0 },
1912 { "pushT", { sIbT }, 0 },
1913 { "imulS", { Gv, Ev, sIb }, 0 },
1914 { "ins{b|}", { Ybr, indirDX }, 0 },
4e7d34a6 1915 { X86_64_TABLE (X86_64_6D) },
bf890a93 1916 { "outs{b|}", { indirDXr, Xb }, 0 },
4e7d34a6 1917 { X86_64_TABLE (X86_64_6F) },
252b5132 1918 /* 70 */
bf890a93
IT
1919 { "joH", { Jb, BND, cond_jump_flag }, 0 },
1920 { "jnoH", { Jb, BND, cond_jump_flag }, 0 },
1921 { "jbH", { Jb, BND, cond_jump_flag }, 0 },
1922 { "jaeH", { Jb, BND, cond_jump_flag }, 0 },
1923 { "jeH", { Jb, BND, cond_jump_flag }, 0 },
1924 { "jneH", { Jb, BND, cond_jump_flag }, 0 },
1925 { "jbeH", { Jb, BND, cond_jump_flag }, 0 },
1926 { "jaH", { Jb, BND, cond_jump_flag }, 0 },
252b5132 1927 /* 78 */
bf890a93
IT
1928 { "jsH", { Jb, BND, cond_jump_flag }, 0 },
1929 { "jnsH", { Jb, BND, cond_jump_flag }, 0 },
1930 { "jpH", { Jb, BND, cond_jump_flag }, 0 },
1931 { "jnpH", { Jb, BND, cond_jump_flag }, 0 },
1932 { "jlH", { Jb, BND, cond_jump_flag }, 0 },
1933 { "jgeH", { Jb, BND, cond_jump_flag }, 0 },
1934 { "jleH", { Jb, BND, cond_jump_flag }, 0 },
1935 { "jgH", { Jb, BND, cond_jump_flag }, 0 },
252b5132 1936 /* 80 */
1ceb70f8
L
1937 { REG_TABLE (REG_80) },
1938 { REG_TABLE (REG_81) },
d039fef3 1939 { X86_64_TABLE (X86_64_82) },
7148c369 1940 { REG_TABLE (REG_83) },
bf890a93
IT
1941 { "testB", { Eb, Gb }, 0 },
1942 { "testS", { Ev, Gv }, 0 },
1943 { "xchgB", { Ebh2, Gb }, 0 },
1944 { "xchgS", { Evh2, Gv }, 0 },
252b5132 1945 /* 88 */
bf890a93
IT
1946 { "movB", { Ebh3, Gb }, 0 },
1947 { "movS", { Evh3, Gv }, 0 },
1948 { "movB", { Gb, EbS }, 0 },
1949 { "movS", { Gv, EvS }, 0 },
1950 { "movD", { Sv, Sw }, 0 },
1ceb70f8 1951 { MOD_TABLE (MOD_8D) },
bf890a93 1952 { "movD", { Sw, Sv }, 0 },
1ceb70f8 1953 { REG_TABLE (REG_8F) },
252b5132 1954 /* 90 */
1ceb70f8 1955 { PREFIX_TABLE (PREFIX_90) },
bf890a93
IT
1956 { "xchgS", { RMeCX, eAX }, 0 },
1957 { "xchgS", { RMeDX, eAX }, 0 },
1958 { "xchgS", { RMeBX, eAX }, 0 },
1959 { "xchgS", { RMeSP, eAX }, 0 },
1960 { "xchgS", { RMeBP, eAX }, 0 },
1961 { "xchgS", { RMeSI, eAX }, 0 },
1962 { "xchgS", { RMeDI, eAX }, 0 },
252b5132 1963 /* 98 */
bf890a93
IT
1964 { "cW{t|}R", { XX }, 0 },
1965 { "cR{t|}O", { XX }, 0 },
4e7d34a6 1966 { X86_64_TABLE (X86_64_9A) },
592d1631 1967 { Bad_Opcode }, /* fwait */
bf890a93
IT
1968 { "pushfT", { XX }, 0 },
1969 { "popfT", { XX }, 0 },
1970 { "sahf", { XX }, 0 },
1971 { "lahf", { XX }, 0 },
252b5132 1972 /* a0 */
bf890a93
IT
1973 { "mov%LB", { AL, Ob }, 0 },
1974 { "mov%LS", { eAX, Ov }, 0 },
1975 { "mov%LB", { Ob, AL }, 0 },
1976 { "mov%LS", { Ov, eAX }, 0 },
1977 { "movs{b|}", { Ybr, Xb }, 0 },
1978 { "movs{R|}", { Yvr, Xv }, 0 },
1979 { "cmps{b|}", { Xb, Yb }, 0 },
1980 { "cmps{R|}", { Xv, Yv }, 0 },
252b5132 1981 /* a8 */
bf890a93
IT
1982 { "testB", { AL, Ib }, 0 },
1983 { "testS", { eAX, Iv }, 0 },
1984 { "stosB", { Ybr, AL }, 0 },
1985 { "stosS", { Yvr, eAX }, 0 },
1986 { "lodsB", { ALr, Xb }, 0 },
1987 { "lodsS", { eAXr, Xv }, 0 },
1988 { "scasB", { AL, Yb }, 0 },
1989 { "scasS", { eAX, Yv }, 0 },
252b5132 1990 /* b0 */
bf890a93
IT
1991 { "movB", { RMAL, Ib }, 0 },
1992 { "movB", { RMCL, Ib }, 0 },
1993 { "movB", { RMDL, Ib }, 0 },
1994 { "movB", { RMBL, Ib }, 0 },
1995 { "movB", { RMAH, Ib }, 0 },
1996 { "movB", { RMCH, Ib }, 0 },
1997 { "movB", { RMDH, Ib }, 0 },
1998 { "movB", { RMBH, Ib }, 0 },
252b5132 1999 /* b8 */
bf890a93
IT
2000 { "mov%LV", { RMeAX, Iv64 }, 0 },
2001 { "mov%LV", { RMeCX, Iv64 }, 0 },
2002 { "mov%LV", { RMeDX, Iv64 }, 0 },
2003 { "mov%LV", { RMeBX, Iv64 }, 0 },
2004 { "mov%LV", { RMeSP, Iv64 }, 0 },
2005 { "mov%LV", { RMeBP, Iv64 }, 0 },
2006 { "mov%LV", { RMeSI, Iv64 }, 0 },
2007 { "mov%LV", { RMeDI, Iv64 }, 0 },
252b5132 2008 /* c0 */
1ceb70f8
L
2009 { REG_TABLE (REG_C0) },
2010 { REG_TABLE (REG_C1) },
aeab2b26
JB
2011 { X86_64_TABLE (X86_64_C2) },
2012 { X86_64_TABLE (X86_64_C3) },
4e7d34a6
L
2013 { X86_64_TABLE (X86_64_C4) },
2014 { X86_64_TABLE (X86_64_C5) },
1ceb70f8
L
2015 { REG_TABLE (REG_C6) },
2016 { REG_TABLE (REG_C7) },
252b5132 2017 /* c8 */
bf890a93
IT
2018 { "enterT", { Iw, Ib }, 0 },
2019 { "leaveT", { XX }, 0 },
8f570d62
JB
2020 { "{l|}ret{|f}P", { Iw }, 0 },
2021 { "{l|}ret{|f}P", { XX }, 0 },
bf890a93
IT
2022 { "int3", { XX }, 0 },
2023 { "int", { Ib }, 0 },
4e7d34a6 2024 { X86_64_TABLE (X86_64_CE) },
bf890a93 2025 { "iret%LP", { XX }, 0 },
252b5132 2026 /* d0 */
1ceb70f8
L
2027 { REG_TABLE (REG_D0) },
2028 { REG_TABLE (REG_D1) },
2029 { REG_TABLE (REG_D2) },
2030 { REG_TABLE (REG_D3) },
4e7d34a6
L
2031 { X86_64_TABLE (X86_64_D4) },
2032 { X86_64_TABLE (X86_64_D5) },
592d1631 2033 { Bad_Opcode },
bf890a93 2034 { "xlat", { DSBX }, 0 },
252b5132
RH
2035 /* d8 */
2036 { FLOAT },
2037 { FLOAT },
2038 { FLOAT },
2039 { FLOAT },
2040 { FLOAT },
2041 { FLOAT },
2042 { FLOAT },
2043 { FLOAT },
2044 /* e0 */
bf890a93
IT
2045 { "loopneFH", { Jb, XX, loop_jcxz_flag }, 0 },
2046 { "loopeFH", { Jb, XX, loop_jcxz_flag }, 0 },
2047 { "loopFH", { Jb, XX, loop_jcxz_flag }, 0 },
2048 { "jEcxzH", { Jb, XX, loop_jcxz_flag }, 0 },
2049 { "inB", { AL, Ib }, 0 },
2050 { "inG", { zAX, Ib }, 0 },
2051 { "outB", { Ib, AL }, 0 },
2052 { "outG", { Ib, zAX }, 0 },
252b5132 2053 /* e8 */
a72d2af2
L
2054 { X86_64_TABLE (X86_64_E8) },
2055 { X86_64_TABLE (X86_64_E9) },
4e7d34a6 2056 { X86_64_TABLE (X86_64_EA) },
bf890a93
IT
2057 { "jmp", { Jb, BND }, 0 },
2058 { "inB", { AL, indirDX }, 0 },
2059 { "inG", { zAX, indirDX }, 0 },
2060 { "outB", { indirDX, AL }, 0 },
2061 { "outG", { indirDX, zAX }, 0 },
252b5132 2062 /* f0 */
592d1631 2063 { Bad_Opcode }, /* lock prefix */
bf890a93 2064 { "icebp", { XX }, 0 },
592d1631
L
2065 { Bad_Opcode }, /* repne */
2066 { Bad_Opcode }, /* repz */
bf890a93
IT
2067 { "hlt", { XX }, 0 },
2068 { "cmc", { XX }, 0 },
1ceb70f8
L
2069 { REG_TABLE (REG_F6) },
2070 { REG_TABLE (REG_F7) },
252b5132 2071 /* f8 */
bf890a93
IT
2072 { "clc", { XX }, 0 },
2073 { "stc", { XX }, 0 },
2074 { "cli", { XX }, 0 },
2075 { "sti", { XX }, 0 },
2076 { "cld", { XX }, 0 },
2077 { "std", { XX }, 0 },
1ceb70f8
L
2078 { REG_TABLE (REG_FE) },
2079 { REG_TABLE (REG_FF) },
252b5132
RH
2080};
2081
6439fc28 2082static const struct dis386 dis386_twobyte[] = {
252b5132 2083 /* 00 */
1ceb70f8
L
2084 { REG_TABLE (REG_0F00 ) },
2085 { REG_TABLE (REG_0F01 ) },
bf890a93
IT
2086 { "larS", { Gv, Ew }, 0 },
2087 { "lslS", { Gv, Ew }, 0 },
592d1631 2088 { Bad_Opcode },
bf890a93
IT
2089 { "syscall", { XX }, 0 },
2090 { "clts", { XX }, 0 },
589958d6 2091 { "sysret%LQ", { XX }, 0 },
252b5132 2092 /* 08 */
bf890a93 2093 { "invd", { XX }, 0 },
3233d7d0 2094 { PREFIX_TABLE (PREFIX_0F09) },
592d1631 2095 { Bad_Opcode },
bf890a93 2096 { "ud2", { XX }, 0 },
592d1631 2097 { Bad_Opcode },
b5b1fc4f 2098 { REG_TABLE (REG_0F0D) },
bf890a93
IT
2099 { "femms", { XX }, 0 },
2100 { "", { MX, EM, OPSUF }, 0 }, /* See OP_3DNowSuffix. */
252b5132 2101 /* 10 */
1ceb70f8
L
2102 { PREFIX_TABLE (PREFIX_0F10) },
2103 { PREFIX_TABLE (PREFIX_0F11) },
2104 { PREFIX_TABLE (PREFIX_0F12) },
2105 { MOD_TABLE (MOD_0F13) },
507bd325
L
2106 { "unpcklpX", { XM, EXx }, PREFIX_OPCODE },
2107 { "unpckhpX", { XM, EXx }, PREFIX_OPCODE },
1ceb70f8
L
2108 { PREFIX_TABLE (PREFIX_0F16) },
2109 { MOD_TABLE (MOD_0F17) },
252b5132 2110 /* 18 */
1ceb70f8 2111 { REG_TABLE (REG_0F18) },
bf890a93 2112 { "nopQ", { Ev }, 0 },
7e8b059b
L
2113 { PREFIX_TABLE (PREFIX_0F1A) },
2114 { PREFIX_TABLE (PREFIX_0F1B) },
c48935d7 2115 { PREFIX_TABLE (PREFIX_0F1C) },
bf890a93 2116 { "nopQ", { Ev }, 0 },
603555e5 2117 { PREFIX_TABLE (PREFIX_0F1E) },
bf890a93 2118 { "nopQ", { Ev }, 0 },
252b5132 2119 /* 20 */
78467458
JB
2120 { "movZ", { Em, Cm }, 0 },
2121 { "movZ", { Em, Dm }, 0 },
2122 { "movZ", { Cm, Em }, 0 },
2123 { "movZ", { Dm, Em }, 0 },
2124 { X86_64_TABLE (X86_64_0F24) },
592d1631 2125 { Bad_Opcode },
78467458 2126 { X86_64_TABLE (X86_64_0F26) },
592d1631 2127 { Bad_Opcode },
252b5132 2128 /* 28 */
507bd325
L
2129 { "movapX", { XM, EXx }, PREFIX_OPCODE },
2130 { "movapX", { EXxS, XM }, PREFIX_OPCODE },
1ceb70f8
L
2131 { PREFIX_TABLE (PREFIX_0F2A) },
2132 { PREFIX_TABLE (PREFIX_0F2B) },
2133 { PREFIX_TABLE (PREFIX_0F2C) },
2134 { PREFIX_TABLE (PREFIX_0F2D) },
2135 { PREFIX_TABLE (PREFIX_0F2E) },
2136 { PREFIX_TABLE (PREFIX_0F2F) },
252b5132 2137 /* 30 */
bf890a93
IT
2138 { "wrmsr", { XX }, 0 },
2139 { "rdtsc", { XX }, 0 },
2140 { "rdmsr", { XX }, 0 },
2141 { "rdpmc", { XX }, 0 },
d835a58b
JB
2142 { "sysenter", { SEP }, 0 },
2143 { "sysexit", { SEP }, 0 },
592d1631 2144 { Bad_Opcode },
bf890a93 2145 { "getsec", { XX }, 0 },
252b5132 2146 /* 38 */
507bd325 2147 { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F38, PREFIX_OPCODE) },
592d1631 2148 { Bad_Opcode },
507bd325 2149 { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F3A, PREFIX_OPCODE) },
592d1631
L
2150 { Bad_Opcode },
2151 { Bad_Opcode },
2152 { Bad_Opcode },
2153 { Bad_Opcode },
2154 { Bad_Opcode },
252b5132 2155 /* 40 */
bf890a93
IT
2156 { "cmovoS", { Gv, Ev }, 0 },
2157 { "cmovnoS", { Gv, Ev }, 0 },
2158 { "cmovbS", { Gv, Ev }, 0 },
2159 { "cmovaeS", { Gv, Ev }, 0 },
2160 { "cmoveS", { Gv, Ev }, 0 },
2161 { "cmovneS", { Gv, Ev }, 0 },
2162 { "cmovbeS", { Gv, Ev }, 0 },
2163 { "cmovaS", { Gv, Ev }, 0 },
252b5132 2164 /* 48 */
bf890a93
IT
2165 { "cmovsS", { Gv, Ev }, 0 },
2166 { "cmovnsS", { Gv, Ev }, 0 },
2167 { "cmovpS", { Gv, Ev }, 0 },
2168 { "cmovnpS", { Gv, Ev }, 0 },
2169 { "cmovlS", { Gv, Ev }, 0 },
2170 { "cmovgeS", { Gv, Ev }, 0 },
2171 { "cmovleS", { Gv, Ev }, 0 },
2172 { "cmovgS", { Gv, Ev }, 0 },
252b5132 2173 /* 50 */
a5aaedb9 2174 { MOD_TABLE (MOD_0F50) },
1ceb70f8
L
2175 { PREFIX_TABLE (PREFIX_0F51) },
2176 { PREFIX_TABLE (PREFIX_0F52) },
2177 { PREFIX_TABLE (PREFIX_0F53) },
507bd325
L
2178 { "andpX", { XM, EXx }, PREFIX_OPCODE },
2179 { "andnpX", { XM, EXx }, PREFIX_OPCODE },
2180 { "orpX", { XM, EXx }, PREFIX_OPCODE },
2181 { "xorpX", { XM, EXx }, PREFIX_OPCODE },
252b5132 2182 /* 58 */
1ceb70f8
L
2183 { PREFIX_TABLE (PREFIX_0F58) },
2184 { PREFIX_TABLE (PREFIX_0F59) },
2185 { PREFIX_TABLE (PREFIX_0F5A) },
2186 { PREFIX_TABLE (PREFIX_0F5B) },
2187 { PREFIX_TABLE (PREFIX_0F5C) },
2188 { PREFIX_TABLE (PREFIX_0F5D) },
2189 { PREFIX_TABLE (PREFIX_0F5E) },
2190 { PREFIX_TABLE (PREFIX_0F5F) },
252b5132 2191 /* 60 */
1ceb70f8
L
2192 { PREFIX_TABLE (PREFIX_0F60) },
2193 { PREFIX_TABLE (PREFIX_0F61) },
2194 { PREFIX_TABLE (PREFIX_0F62) },
507bd325
L
2195 { "packsswb", { MX, EM }, PREFIX_OPCODE },
2196 { "pcmpgtb", { MX, EM }, PREFIX_OPCODE },
2197 { "pcmpgtw", { MX, EM }, PREFIX_OPCODE },
2198 { "pcmpgtd", { MX, EM }, PREFIX_OPCODE },
2199 { "packuswb", { MX, EM }, PREFIX_OPCODE },
252b5132 2200 /* 68 */
507bd325
L
2201 { "punpckhbw", { MX, EM }, PREFIX_OPCODE },
2202 { "punpckhwd", { MX, EM }, PREFIX_OPCODE },
2203 { "punpckhdq", { MX, EM }, PREFIX_OPCODE },
2204 { "packssdw", { MX, EM }, PREFIX_OPCODE },
7531c613
JB
2205 { "punpcklqdq", { XM, EXx }, PREFIX_DATA },
2206 { "punpckhqdq", { XM, EXx }, PREFIX_DATA },
507bd325 2207 { "movK", { MX, Edq }, PREFIX_OPCODE },
1ceb70f8 2208 { PREFIX_TABLE (PREFIX_0F6F) },
252b5132 2209 /* 70 */
1ceb70f8
L
2210 { PREFIX_TABLE (PREFIX_0F70) },
2211 { REG_TABLE (REG_0F71) },
2212 { REG_TABLE (REG_0F72) },
2213 { REG_TABLE (REG_0F73) },
507bd325
L
2214 { "pcmpeqb", { MX, EM }, PREFIX_OPCODE },
2215 { "pcmpeqw", { MX, EM }, PREFIX_OPCODE },
2216 { "pcmpeqd", { MX, EM }, PREFIX_OPCODE },
2217 { "emms", { XX }, PREFIX_OPCODE },
252b5132 2218 /* 78 */
1ceb70f8
L
2219 { PREFIX_TABLE (PREFIX_0F78) },
2220 { PREFIX_TABLE (PREFIX_0F79) },
1f334aeb 2221 { Bad_Opcode },
592d1631 2222 { Bad_Opcode },
1ceb70f8
L
2223 { PREFIX_TABLE (PREFIX_0F7C) },
2224 { PREFIX_TABLE (PREFIX_0F7D) },
2225 { PREFIX_TABLE (PREFIX_0F7E) },
2226 { PREFIX_TABLE (PREFIX_0F7F) },
252b5132 2227 /* 80 */
bf890a93
IT
2228 { "joH", { Jv, BND, cond_jump_flag }, 0 },
2229 { "jnoH", { Jv, BND, cond_jump_flag }, 0 },
2230 { "jbH", { Jv, BND, cond_jump_flag }, 0 },
2231 { "jaeH", { Jv, BND, cond_jump_flag }, 0 },
2232 { "jeH", { Jv, BND, cond_jump_flag }, 0 },
2233 { "jneH", { Jv, BND, cond_jump_flag }, 0 },
2234 { "jbeH", { Jv, BND, cond_jump_flag }, 0 },
2235 { "jaH", { Jv, BND, cond_jump_flag }, 0 },
252b5132 2236 /* 88 */
bf890a93
IT
2237 { "jsH", { Jv, BND, cond_jump_flag }, 0 },
2238 { "jnsH", { Jv, BND, cond_jump_flag }, 0 },
2239 { "jpH", { Jv, BND, cond_jump_flag }, 0 },
2240 { "jnpH", { Jv, BND, cond_jump_flag }, 0 },
2241 { "jlH", { Jv, BND, cond_jump_flag }, 0 },
2242 { "jgeH", { Jv, BND, cond_jump_flag }, 0 },
2243 { "jleH", { Jv, BND, cond_jump_flag }, 0 },
2244 { "jgH", { Jv, BND, cond_jump_flag }, 0 },
252b5132 2245 /* 90 */
bf890a93
IT
2246 { "seto", { Eb }, 0 },
2247 { "setno", { Eb }, 0 },
2248 { "setb", { Eb }, 0 },
2249 { "setae", { Eb }, 0 },
2250 { "sete", { Eb }, 0 },
2251 { "setne", { Eb }, 0 },
2252 { "setbe", { Eb }, 0 },
2253 { "seta", { Eb }, 0 },
252b5132 2254 /* 98 */
bf890a93
IT
2255 { "sets", { Eb }, 0 },
2256 { "setns", { Eb }, 0 },
2257 { "setp", { Eb }, 0 },
2258 { "setnp", { Eb }, 0 },
2259 { "setl", { Eb }, 0 },
2260 { "setge", { Eb }, 0 },
2261 { "setle", { Eb }, 0 },
2262 { "setg", { Eb }, 0 },
252b5132 2263 /* a0 */
bf890a93
IT
2264 { "pushT", { fs }, 0 },
2265 { "popT", { fs }, 0 },
2266 { "cpuid", { XX }, 0 },
2267 { "btS", { Ev, Gv }, 0 },
2268 { "shldS", { Ev, Gv, Ib }, 0 },
2269 { "shldS", { Ev, Gv, CL }, 0 },
1ceb70f8
L
2270 { REG_TABLE (REG_0FA6) },
2271 { REG_TABLE (REG_0FA7) },
252b5132 2272 /* a8 */
bf890a93
IT
2273 { "pushT", { gs }, 0 },
2274 { "popT", { gs }, 0 },
2275 { "rsm", { XX }, 0 },
2276 { "btsS", { Evh1, Gv }, 0 },
2277 { "shrdS", { Ev, Gv, Ib }, 0 },
2278 { "shrdS", { Ev, Gv, CL }, 0 },
1ceb70f8 2279 { REG_TABLE (REG_0FAE) },
bf890a93 2280 { "imulS", { Gv, Ev }, 0 },
252b5132 2281 /* b0 */
bf890a93
IT
2282 { "cmpxchgB", { Ebh1, Gb }, 0 },
2283 { "cmpxchgS", { Evh1, Gv }, 0 },
1ceb70f8 2284 { MOD_TABLE (MOD_0FB2) },
bf890a93 2285 { "btrS", { Evh1, Gv }, 0 },
1ceb70f8
L
2286 { MOD_TABLE (MOD_0FB4) },
2287 { MOD_TABLE (MOD_0FB5) },
bf890a93
IT
2288 { "movz{bR|x}", { Gv, Eb }, 0 },
2289 { "movz{wR|x}", { Gv, Ew }, 0 }, /* yes, there really is movzww ! */
252b5132 2290 /* b8 */
1ceb70f8 2291 { PREFIX_TABLE (PREFIX_0FB8) },
66f1eba0 2292 { "ud1S", { Gv, Ev }, 0 },
1ceb70f8 2293 { REG_TABLE (REG_0FBA) },
bf890a93 2294 { "btcS", { Evh1, Gv }, 0 },
f12dc422 2295 { PREFIX_TABLE (PREFIX_0FBC) },
1ceb70f8 2296 { PREFIX_TABLE (PREFIX_0FBD) },
bf890a93
IT
2297 { "movs{bR|x}", { Gv, Eb }, 0 },
2298 { "movs{wR|x}", { Gv, Ew }, 0 }, /* yes, there really is movsww ! */
252b5132 2299 /* c0 */
bf890a93
IT
2300 { "xaddB", { Ebh1, Gb }, 0 },
2301 { "xaddS", { Evh1, Gv }, 0 },
1ceb70f8 2302 { PREFIX_TABLE (PREFIX_0FC2) },
a8484f96 2303 { MOD_TABLE (MOD_0FC3) },
507bd325
L
2304 { "pinsrw", { MX, Edqw, Ib }, PREFIX_OPCODE },
2305 { "pextrw", { Gdq, MS, Ib }, PREFIX_OPCODE },
2306 { "shufpX", { XM, EXx, Ib }, PREFIX_OPCODE },
1ceb70f8 2307 { REG_TABLE (REG_0FC7) },
252b5132 2308 /* c8 */
bf890a93
IT
2309 { "bswap", { RMeAX }, 0 },
2310 { "bswap", { RMeCX }, 0 },
2311 { "bswap", { RMeDX }, 0 },
2312 { "bswap", { RMeBX }, 0 },
2313 { "bswap", { RMeSP }, 0 },
2314 { "bswap", { RMeBP }, 0 },
2315 { "bswap", { RMeSI }, 0 },
2316 { "bswap", { RMeDI }, 0 },
252b5132 2317 /* d0 */
1ceb70f8 2318 { PREFIX_TABLE (PREFIX_0FD0) },
507bd325
L
2319 { "psrlw", { MX, EM }, PREFIX_OPCODE },
2320 { "psrld", { MX, EM }, PREFIX_OPCODE },
2321 { "psrlq", { MX, EM }, PREFIX_OPCODE },
2322 { "paddq", { MX, EM }, PREFIX_OPCODE },
2323 { "pmullw", { MX, EM }, PREFIX_OPCODE },
1ceb70f8 2324 { PREFIX_TABLE (PREFIX_0FD6) },
75c135a8 2325 { MOD_TABLE (MOD_0FD7) },
252b5132 2326 /* d8 */
507bd325
L
2327 { "psubusb", { MX, EM }, PREFIX_OPCODE },
2328 { "psubusw", { MX, EM }, PREFIX_OPCODE },
2329 { "pminub", { MX, EM }, PREFIX_OPCODE },
2330 { "pand", { MX, EM }, PREFIX_OPCODE },
2331 { "paddusb", { MX, EM }, PREFIX_OPCODE },
2332 { "paddusw", { MX, EM }, PREFIX_OPCODE },
2333 { "pmaxub", { MX, EM }, PREFIX_OPCODE },
2334 { "pandn", { MX, EM }, PREFIX_OPCODE },
252b5132 2335 /* e0 */
507bd325
L
2336 { "pavgb", { MX, EM }, PREFIX_OPCODE },
2337 { "psraw", { MX, EM }, PREFIX_OPCODE },
2338 { "psrad", { MX, EM }, PREFIX_OPCODE },
2339 { "pavgw", { MX, EM }, PREFIX_OPCODE },
2340 { "pmulhuw", { MX, EM }, PREFIX_OPCODE },
2341 { "pmulhw", { MX, EM }, PREFIX_OPCODE },
1ceb70f8
L
2342 { PREFIX_TABLE (PREFIX_0FE6) },
2343 { PREFIX_TABLE (PREFIX_0FE7) },
252b5132 2344 /* e8 */
507bd325
L
2345 { "psubsb", { MX, EM }, PREFIX_OPCODE },
2346 { "psubsw", { MX, EM }, PREFIX_OPCODE },
2347 { "pminsw", { MX, EM }, PREFIX_OPCODE },
2348 { "por", { MX, EM }, PREFIX_OPCODE },
2349 { "paddsb", { MX, EM }, PREFIX_OPCODE },
2350 { "paddsw", { MX, EM }, PREFIX_OPCODE },
2351 { "pmaxsw", { MX, EM }, PREFIX_OPCODE },
2352 { "pxor", { MX, EM }, PREFIX_OPCODE },
252b5132 2353 /* f0 */
1ceb70f8 2354 { PREFIX_TABLE (PREFIX_0FF0) },
507bd325
L
2355 { "psllw", { MX, EM }, PREFIX_OPCODE },
2356 { "pslld", { MX, EM }, PREFIX_OPCODE },
2357 { "psllq", { MX, EM }, PREFIX_OPCODE },
2358 { "pmuludq", { MX, EM }, PREFIX_OPCODE },
2359 { "pmaddwd", { MX, EM }, PREFIX_OPCODE },
2360 { "psadbw", { MX, EM }, PREFIX_OPCODE },
1ceb70f8 2361 { PREFIX_TABLE (PREFIX_0FF7) },
252b5132 2362 /* f8 */
507bd325
L
2363 { "psubb", { MX, EM }, PREFIX_OPCODE },
2364 { "psubw", { MX, EM }, PREFIX_OPCODE },
2365 { "psubd", { MX, EM }, PREFIX_OPCODE },
2366 { "psubq", { MX, EM }, PREFIX_OPCODE },
2367 { "paddb", { MX, EM }, PREFIX_OPCODE },
2368 { "paddw", { MX, EM }, PREFIX_OPCODE },
2369 { "paddd", { MX, EM }, PREFIX_OPCODE },
66f1eba0 2370 { "ud0S", { Gv, Ev }, 0 },
252b5132
RH
2371};
2372
2373static const unsigned char onebyte_has_modrm[256] = {
c608c12e
AM
2374 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2375 /* ------------------------------- */
2376 /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
2377 /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
2378 /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
2379 /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
2380 /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
2381 /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
2382 /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
2383 /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
2384 /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
2385 /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
2386 /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
2387 /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
2388 /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
2389 /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
2390 /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
2391 /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1 /* f0 */
2392 /* ------------------------------- */
2393 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
252b5132
RH
2394};
2395
2396static const unsigned char twobyte_has_modrm[256] = {
c608c12e
AM
2397 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2398 /* ------------------------------- */
252b5132 2399 /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
b5b1fc4f 2400 /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
85f10a01 2401 /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
331d2d0d 2402 /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
252b5132 2403 /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
4bba6815
AM
2404 /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
2405 /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
85f10a01 2406 /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
252b5132
RH
2407 /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
2408 /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
30d1c836 2409 /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
66f1eba0 2410 /* b0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* bf */
252b5132 2411 /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
ca164297 2412 /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
4bba6815 2413 /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
66f1eba0 2414 /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 /* ff */
c608c12e
AM
2415 /* ------------------------------- */
2416 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2417};
2418
252b5132
RH
2419static char obuf[100];
2420static char *obufp;
ea397f5b 2421static char *mnemonicendp;
252b5132
RH
2422static char scratchbuf[100];
2423static unsigned char *start_codep;
2424static unsigned char *insn_codep;
2425static unsigned char *codep;
285ca992 2426static unsigned char *end_codep;
f16cd0d5
L
2427static int last_lock_prefix;
2428static int last_repz_prefix;
2429static int last_repnz_prefix;
2430static int last_data_prefix;
2431static int last_addr_prefix;
2432static int last_rex_prefix;
2433static int last_seg_prefix;
d9949a36 2434static int fwait_prefix;
285ca992
L
2435/* The active segment register prefix. */
2436static int active_seg_prefix;
f16cd0d5
L
2437#define MAX_CODE_LENGTH 15
2438/* We can up to 14 prefixes since the maximum instruction length is
2439 15bytes. */
2440static int all_prefixes[MAX_CODE_LENGTH - 1];
252b5132 2441static disassemble_info *the_info;
7967e09e
L
2442static struct
2443 {
2444 int mod;
7967e09e 2445 int reg;
484c222e 2446 int rm;
7967e09e
L
2447 }
2448modrm;
4bba6815 2449static unsigned char need_modrm;
dfc8cf43
L
2450static struct
2451 {
2452 int scale;
2453 int index;
2454 int base;
2455 }
2456sib;
c0f3af97
L
2457static struct
2458 {
2459 int register_specifier;
2460 int length;
2461 int prefix;
2462 int w;
43234a1e
L
2463 int evex;
2464 int r;
2465 int v;
2466 int mask_register_specifier;
2467 int zeroing;
2468 int ll;
2469 int b;
c0f3af97
L
2470 }
2471vex;
2472static unsigned char need_vex;
252b5132 2473
ea397f5b
L
2474struct op
2475 {
2476 const char *name;
2477 unsigned int len;
2478 };
2479
4bba6815
AM
2480/* If we are accessing mod/rm/reg without need_modrm set, then the
2481 values are stale. Hitting this abort likely indicates that you
2482 need to update onebyte_has_modrm or twobyte_has_modrm. */
2483#define MODRM_CHECK if (!need_modrm) abort ()
2484
d708bcba
AM
2485static const char **names64;
2486static const char **names32;
2487static const char **names16;
2488static const char **names8;
2489static const char **names8rex;
2490static const char **names_seg;
db51cc60
L
2491static const char *index64;
2492static const char *index32;
d708bcba 2493static const char **index16;
7e8b059b 2494static const char **names_bnd;
d708bcba
AM
2495
2496static const char *intel_names64[] = {
2497 "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
2498 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2499};
2500static const char *intel_names32[] = {
2501 "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
2502 "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
2503};
2504static const char *intel_names16[] = {
2505 "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
2506 "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
2507};
2508static const char *intel_names8[] = {
2509 "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
2510};
2511static const char *intel_names8rex[] = {
2512 "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
2513 "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
2514};
2515static const char *intel_names_seg[] = {
2516 "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
2517};
db51cc60
L
2518static const char *intel_index64 = "riz";
2519static const char *intel_index32 = "eiz";
d708bcba
AM
2520static const char *intel_index16[] = {
2521 "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
2522};
2523
2524static const char *att_names64[] = {
2525 "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
52b15da3
JH
2526 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
2527};
d708bcba
AM
2528static const char *att_names32[] = {
2529 "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
52b15da3 2530 "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
252b5132 2531};
d708bcba
AM
2532static const char *att_names16[] = {
2533 "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
52b15da3 2534 "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
252b5132 2535};
d708bcba
AM
2536static const char *att_names8[] = {
2537 "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
252b5132 2538};
d708bcba
AM
2539static const char *att_names8rex[] = {
2540 "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
52b15da3
JH
2541 "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
2542};
d708bcba
AM
2543static const char *att_names_seg[] = {
2544 "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
252b5132 2545};
db51cc60
L
2546static const char *att_index64 = "%riz";
2547static const char *att_index32 = "%eiz";
d708bcba
AM
2548static const char *att_index16[] = {
2549 "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
252b5132
RH
2550};
2551
b9733481
L
2552static const char **names_mm;
2553static const char *intel_names_mm[] = {
2554 "mm0", "mm1", "mm2", "mm3",
2555 "mm4", "mm5", "mm6", "mm7"
2556};
2557static const char *att_names_mm[] = {
2558 "%mm0", "%mm1", "%mm2", "%mm3",
2559 "%mm4", "%mm5", "%mm6", "%mm7"
2560};
2561
7e8b059b
L
2562static const char *intel_names_bnd[] = {
2563 "bnd0", "bnd1", "bnd2", "bnd3"
2564};
2565
2566static const char *att_names_bnd[] = {
2567 "%bnd0", "%bnd1", "%bnd2", "%bnd3"
2568};
2569
b9733481
L
2570static const char **names_xmm;
2571static const char *intel_names_xmm[] = {
2572 "xmm0", "xmm1", "xmm2", "xmm3",
2573 "xmm4", "xmm5", "xmm6", "xmm7",
2574 "xmm8", "xmm9", "xmm10", "xmm11",
43234a1e
L
2575 "xmm12", "xmm13", "xmm14", "xmm15",
2576 "xmm16", "xmm17", "xmm18", "xmm19",
2577 "xmm20", "xmm21", "xmm22", "xmm23",
2578 "xmm24", "xmm25", "xmm26", "xmm27",
2579 "xmm28", "xmm29", "xmm30", "xmm31"
b9733481
L
2580};
2581static const char *att_names_xmm[] = {
2582 "%xmm0", "%xmm1", "%xmm2", "%xmm3",
2583 "%xmm4", "%xmm5", "%xmm6", "%xmm7",
2584 "%xmm8", "%xmm9", "%xmm10", "%xmm11",
43234a1e
L
2585 "%xmm12", "%xmm13", "%xmm14", "%xmm15",
2586 "%xmm16", "%xmm17", "%xmm18", "%xmm19",
2587 "%xmm20", "%xmm21", "%xmm22", "%xmm23",
2588 "%xmm24", "%xmm25", "%xmm26", "%xmm27",
2589 "%xmm28", "%xmm29", "%xmm30", "%xmm31"
b9733481
L
2590};
2591
2592static const char **names_ymm;
2593static const char *intel_names_ymm[] = {
2594 "ymm0", "ymm1", "ymm2", "ymm3",
2595 "ymm4", "ymm5", "ymm6", "ymm7",
2596 "ymm8", "ymm9", "ymm10", "ymm11",
43234a1e
L
2597 "ymm12", "ymm13", "ymm14", "ymm15",
2598 "ymm16", "ymm17", "ymm18", "ymm19",
2599 "ymm20", "ymm21", "ymm22", "ymm23",
2600 "ymm24", "ymm25", "ymm26", "ymm27",
2601 "ymm28", "ymm29", "ymm30", "ymm31"
b9733481
L
2602};
2603static const char *att_names_ymm[] = {
2604 "%ymm0", "%ymm1", "%ymm2", "%ymm3",
2605 "%ymm4", "%ymm5", "%ymm6", "%ymm7",
2606 "%ymm8", "%ymm9", "%ymm10", "%ymm11",
43234a1e
L
2607 "%ymm12", "%ymm13", "%ymm14", "%ymm15",
2608 "%ymm16", "%ymm17", "%ymm18", "%ymm19",
2609 "%ymm20", "%ymm21", "%ymm22", "%ymm23",
2610 "%ymm24", "%ymm25", "%ymm26", "%ymm27",
2611 "%ymm28", "%ymm29", "%ymm30", "%ymm31"
2612};
2613
2614static const char **names_zmm;
2615static const char *intel_names_zmm[] = {
2616 "zmm0", "zmm1", "zmm2", "zmm3",
2617 "zmm4", "zmm5", "zmm6", "zmm7",
2618 "zmm8", "zmm9", "zmm10", "zmm11",
2619 "zmm12", "zmm13", "zmm14", "zmm15",
2620 "zmm16", "zmm17", "zmm18", "zmm19",
2621 "zmm20", "zmm21", "zmm22", "zmm23",
2622 "zmm24", "zmm25", "zmm26", "zmm27",
2623 "zmm28", "zmm29", "zmm30", "zmm31"
2624};
2625static const char *att_names_zmm[] = {
2626 "%zmm0", "%zmm1", "%zmm2", "%zmm3",
2627 "%zmm4", "%zmm5", "%zmm6", "%zmm7",
2628 "%zmm8", "%zmm9", "%zmm10", "%zmm11",
2629 "%zmm12", "%zmm13", "%zmm14", "%zmm15",
2630 "%zmm16", "%zmm17", "%zmm18", "%zmm19",
2631 "%zmm20", "%zmm21", "%zmm22", "%zmm23",
2632 "%zmm24", "%zmm25", "%zmm26", "%zmm27",
2633 "%zmm28", "%zmm29", "%zmm30", "%zmm31"
2634};
2635
260cd341
LC
2636static const char **names_tmm;
2637static const char *intel_names_tmm[] = {
2638 "tmm0", "tmm1", "tmm2", "tmm3",
2639 "tmm4", "tmm5", "tmm6", "tmm7"
2640};
2641static const char *att_names_tmm[] = {
2642 "%tmm0", "%tmm1", "%tmm2", "%tmm3",
2643 "%tmm4", "%tmm5", "%tmm6", "%tmm7"
2644};
2645
43234a1e
L
2646static const char **names_mask;
2647static const char *intel_names_mask[] = {
2648 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7"
2649};
2650static const char *att_names_mask[] = {
2651 "%k0", "%k1", "%k2", "%k3", "%k4", "%k5", "%k6", "%k7"
2652};
2653
2654static const char *names_rounding[] =
2655{
2656 "{rn-sae}",
2657 "{rd-sae}",
2658 "{ru-sae}",
2659 "{rz-sae}"
b9733481
L
2660};
2661
1ceb70f8
L
2662static const struct dis386 reg_table[][8] = {
2663 /* REG_80 */
252b5132 2664 {
bf890a93
IT
2665 { "addA", { Ebh1, Ib }, 0 },
2666 { "orA", { Ebh1, Ib }, 0 },
2667 { "adcA", { Ebh1, Ib }, 0 },
2668 { "sbbA", { Ebh1, Ib }, 0 },
2669 { "andA", { Ebh1, Ib }, 0 },
2670 { "subA", { Ebh1, Ib }, 0 },
2671 { "xorA", { Ebh1, Ib }, 0 },
2672 { "cmpA", { Eb, Ib }, 0 },
252b5132 2673 },
1ceb70f8 2674 /* REG_81 */
252b5132 2675 {
bf890a93
IT
2676 { "addQ", { Evh1, Iv }, 0 },
2677 { "orQ", { Evh1, Iv }, 0 },
2678 { "adcQ", { Evh1, Iv }, 0 },
2679 { "sbbQ", { Evh1, Iv }, 0 },
2680 { "andQ", { Evh1, Iv }, 0 },
2681 { "subQ", { Evh1, Iv }, 0 },
2682 { "xorQ", { Evh1, Iv }, 0 },
2683 { "cmpQ", { Ev, Iv }, 0 },
252b5132 2684 },
7148c369 2685 /* REG_83 */
252b5132 2686 {
bf890a93
IT
2687 { "addQ", { Evh1, sIb }, 0 },
2688 { "orQ", { Evh1, sIb }, 0 },
2689 { "adcQ", { Evh1, sIb }, 0 },
2690 { "sbbQ", { Evh1, sIb }, 0 },
2691 { "andQ", { Evh1, sIb }, 0 },
2692 { "subQ", { Evh1, sIb }, 0 },
2693 { "xorQ", { Evh1, sIb }, 0 },
2694 { "cmpQ", { Ev, sIb }, 0 },
252b5132 2695 },
1ceb70f8 2696 /* REG_8F */
4e7d34a6 2697 {
bf890a93 2698 { "popU", { stackEv }, 0 },
c48244a5 2699 { XOP_8F_TABLE (XOP_09) },
592d1631
L
2700 { Bad_Opcode },
2701 { Bad_Opcode },
2702 { Bad_Opcode },
f88c9eb0 2703 { XOP_8F_TABLE (XOP_09) },
4e7d34a6 2704 },
1ceb70f8 2705 /* REG_C0 */
252b5132 2706 {
bf890a93
IT
2707 { "rolA", { Eb, Ib }, 0 },
2708 { "rorA", { Eb, Ib }, 0 },
2709 { "rclA", { Eb, Ib }, 0 },
2710 { "rcrA", { Eb, Ib }, 0 },
2711 { "shlA", { Eb, Ib }, 0 },
2712 { "shrA", { Eb, Ib }, 0 },
e4bdd679 2713 { "shlA", { Eb, Ib }, 0 },
bf890a93 2714 { "sarA", { Eb, Ib }, 0 },
252b5132 2715 },
1ceb70f8 2716 /* REG_C1 */
252b5132 2717 {
bf890a93
IT
2718 { "rolQ", { Ev, Ib }, 0 },
2719 { "rorQ", { Ev, Ib }, 0 },
2720 { "rclQ", { Ev, Ib }, 0 },
2721 { "rcrQ", { Ev, Ib }, 0 },
2722 { "shlQ", { Ev, Ib }, 0 },
2723 { "shrQ", { Ev, Ib }, 0 },
e4bdd679 2724 { "shlQ", { Ev, Ib }, 0 },
bf890a93 2725 { "sarQ", { Ev, Ib }, 0 },
252b5132 2726 },
1ceb70f8 2727 /* REG_C6 */
4e7d34a6 2728 {
bf890a93 2729 { "movA", { Ebh3, Ib }, 0 },
42164a71
L
2730 { Bad_Opcode },
2731 { Bad_Opcode },
2732 { Bad_Opcode },
2733 { Bad_Opcode },
2734 { Bad_Opcode },
2735 { Bad_Opcode },
2736 { MOD_TABLE (MOD_C6_REG_7) },
4e7d34a6 2737 },
1ceb70f8 2738 /* REG_C7 */
4e7d34a6 2739 {
bf890a93 2740 { "movQ", { Evh3, Iv }, 0 },
42164a71
L
2741 { Bad_Opcode },
2742 { Bad_Opcode },
2743 { Bad_Opcode },
2744 { Bad_Opcode },
2745 { Bad_Opcode },
2746 { Bad_Opcode },
2747 { MOD_TABLE (MOD_C7_REG_7) },
4e7d34a6 2748 },
1ceb70f8 2749 /* REG_D0 */
252b5132 2750 {
bf890a93
IT
2751 { "rolA", { Eb, I1 }, 0 },
2752 { "rorA", { Eb, I1 }, 0 },
2753 { "rclA", { Eb, I1 }, 0 },
2754 { "rcrA", { Eb, I1 }, 0 },
2755 { "shlA", { Eb, I1 }, 0 },
2756 { "shrA", { Eb, I1 }, 0 },
e4bdd679 2757 { "shlA", { Eb, I1 }, 0 },
bf890a93 2758 { "sarA", { Eb, I1 }, 0 },
252b5132 2759 },
1ceb70f8 2760 /* REG_D1 */
252b5132 2761 {
bf890a93
IT
2762 { "rolQ", { Ev, I1 }, 0 },
2763 { "rorQ", { Ev, I1 }, 0 },
2764 { "rclQ", { Ev, I1 }, 0 },
2765 { "rcrQ", { Ev, I1 }, 0 },
2766 { "shlQ", { Ev, I1 }, 0 },
2767 { "shrQ", { Ev, I1 }, 0 },
e4bdd679 2768 { "shlQ", { Ev, I1 }, 0 },
bf890a93 2769 { "sarQ", { Ev, I1 }, 0 },
252b5132 2770 },
1ceb70f8 2771 /* REG_D2 */
252b5132 2772 {
bf890a93
IT
2773 { "rolA", { Eb, CL }, 0 },
2774 { "rorA", { Eb, CL }, 0 },
2775 { "rclA", { Eb, CL }, 0 },
2776 { "rcrA", { Eb, CL }, 0 },
2777 { "shlA", { Eb, CL }, 0 },
2778 { "shrA", { Eb, CL }, 0 },
e4bdd679 2779 { "shlA", { Eb, CL }, 0 },
bf890a93 2780 { "sarA", { Eb, CL }, 0 },
252b5132 2781 },
1ceb70f8 2782 /* REG_D3 */
252b5132 2783 {
bf890a93
IT
2784 { "rolQ", { Ev, CL }, 0 },
2785 { "rorQ", { Ev, CL }, 0 },
2786 { "rclQ", { Ev, CL }, 0 },
2787 { "rcrQ", { Ev, CL }, 0 },
2788 { "shlQ", { Ev, CL }, 0 },
2789 { "shrQ", { Ev, CL }, 0 },
e4bdd679 2790 { "shlQ", { Ev, CL }, 0 },
bf890a93 2791 { "sarQ", { Ev, CL }, 0 },
252b5132 2792 },
1ceb70f8 2793 /* REG_F6 */
252b5132 2794 {
bf890a93 2795 { "testA", { Eb, Ib }, 0 },
7db2c588 2796 { "testA", { Eb, Ib }, 0 },
bf890a93
IT
2797 { "notA", { Ebh1 }, 0 },
2798 { "negA", { Ebh1 }, 0 },
2799 { "mulA", { Eb }, 0 }, /* Don't print the implicit %al register, */
2800 { "imulA", { Eb }, 0 }, /* to distinguish these opcodes from other */
2801 { "divA", { Eb }, 0 }, /* mul/imul opcodes. Do the same for div */
2802 { "idivA", { Eb }, 0 }, /* and idiv for consistency. */
252b5132 2803 },
1ceb70f8 2804 /* REG_F7 */
252b5132 2805 {
bf890a93 2806 { "testQ", { Ev, Iv }, 0 },
7db2c588 2807 { "testQ", { Ev, Iv }, 0 },
bf890a93
IT
2808 { "notQ", { Evh1 }, 0 },
2809 { "negQ", { Evh1 }, 0 },
2810 { "mulQ", { Ev }, 0 }, /* Don't print the implicit register. */
2811 { "imulQ", { Ev }, 0 },
2812 { "divQ", { Ev }, 0 },
2813 { "idivQ", { Ev }, 0 },
252b5132 2814 },
1ceb70f8 2815 /* REG_FE */
252b5132 2816 {
bf890a93
IT
2817 { "incA", { Ebh1 }, 0 },
2818 { "decA", { Ebh1 }, 0 },
252b5132 2819 },
1ceb70f8 2820 /* REG_FF */
252b5132 2821 {
bf890a93
IT
2822 { "incQ", { Evh1 }, 0 },
2823 { "decQ", { Evh1 }, 0 },
9fef80d6 2824 { "call{&|}", { NOTRACK, indirEv, BND }, 0 },
4a357820 2825 { MOD_TABLE (MOD_FF_REG_3) },
9fef80d6 2826 { "jmp{&|}", { NOTRACK, indirEv, BND }, 0 },
4a357820 2827 { MOD_TABLE (MOD_FF_REG_5) },
bf890a93 2828 { "pushU", { stackEv }, 0 },
592d1631 2829 { Bad_Opcode },
252b5132 2830 },
1ceb70f8 2831 /* REG_0F00 */
252b5132 2832 {
bf890a93
IT
2833 { "sldtD", { Sv }, 0 },
2834 { "strD", { Sv }, 0 },
2835 { "lldt", { Ew }, 0 },
2836 { "ltr", { Ew }, 0 },
2837 { "verr", { Ew }, 0 },
2838 { "verw", { Ew }, 0 },
592d1631
L
2839 { Bad_Opcode },
2840 { Bad_Opcode },
252b5132 2841 },
1ceb70f8 2842 /* REG_0F01 */
252b5132 2843 {
1ceb70f8
L
2844 { MOD_TABLE (MOD_0F01_REG_0) },
2845 { MOD_TABLE (MOD_0F01_REG_1) },
2846 { MOD_TABLE (MOD_0F01_REG_2) },
2847 { MOD_TABLE (MOD_0F01_REG_3) },
bf890a93 2848 { "smswD", { Sv }, 0 },
8eab4136 2849 { MOD_TABLE (MOD_0F01_REG_5) },
bf890a93 2850 { "lmsw", { Ew }, 0 },
1ceb70f8 2851 { MOD_TABLE (MOD_0F01_REG_7) },
252b5132 2852 },
b5b1fc4f 2853 /* REG_0F0D */
252b5132 2854 {
bf890a93
IT
2855 { "prefetch", { Mb }, 0 },
2856 { "prefetchw", { Mb }, 0 },
2857 { "prefetchwt1", { Mb }, 0 },
2858 { "prefetch", { Mb }, 0 },
2859 { "prefetch", { Mb }, 0 },
2860 { "prefetch", { Mb }, 0 },
2861 { "prefetch", { Mb }, 0 },
2862 { "prefetch", { Mb }, 0 },
252b5132 2863 },
1ceb70f8 2864 /* REG_0F18 */
252b5132 2865 {
1ceb70f8
L
2866 { MOD_TABLE (MOD_0F18_REG_0) },
2867 { MOD_TABLE (MOD_0F18_REG_1) },
2868 { MOD_TABLE (MOD_0F18_REG_2) },
2869 { MOD_TABLE (MOD_0F18_REG_3) },
d7189fa5
RM
2870 { MOD_TABLE (MOD_0F18_REG_4) },
2871 { MOD_TABLE (MOD_0F18_REG_5) },
2872 { MOD_TABLE (MOD_0F18_REG_6) },
2873 { MOD_TABLE (MOD_0F18_REG_7) },
252b5132 2874 },
f8687e93 2875 /* REG_0F1C_P_0_MOD_0 */
c48935d7
IT
2876 {
2877 { "cldemote", { Mb }, 0 },
2878 { "nopQ", { Ev }, 0 },
2879 { "nopQ", { Ev }, 0 },
2880 { "nopQ", { Ev }, 0 },
2881 { "nopQ", { Ev }, 0 },
2882 { "nopQ", { Ev }, 0 },
2883 { "nopQ", { Ev }, 0 },
2884 { "nopQ", { Ev }, 0 },
2885 },
f8687e93 2886 /* REG_0F1E_P_1_MOD_3 */
603555e5
L
2887 {
2888 { "nopQ", { Ev }, 0 },
464d2b65 2889 { "rdsspK", { Edq }, PREFIX_OPCODE },
603555e5
L
2890 { "nopQ", { Ev }, 0 },
2891 { "nopQ", { Ev }, 0 },
2892 { "nopQ", { Ev }, 0 },
2893 { "nopQ", { Ev }, 0 },
2894 { "nopQ", { Ev }, 0 },
f8687e93 2895 { RM_TABLE (RM_0F1E_P_1_MOD_3_REG_7) },
603555e5 2896 },
1ceb70f8 2897 /* REG_0F71 */
a6bd098c 2898 {
592d1631
L
2899 { Bad_Opcode },
2900 { Bad_Opcode },
1ceb70f8 2901 { MOD_TABLE (MOD_0F71_REG_2) },
592d1631 2902 { Bad_Opcode },
1ceb70f8 2903 { MOD_TABLE (MOD_0F71_REG_4) },
592d1631 2904 { Bad_Opcode },
1ceb70f8 2905 { MOD_TABLE (MOD_0F71_REG_6) },
a6bd098c 2906 },
1ceb70f8 2907 /* REG_0F72 */
a6bd098c 2908 {
592d1631
L
2909 { Bad_Opcode },
2910 { Bad_Opcode },
1ceb70f8 2911 { MOD_TABLE (MOD_0F72_REG_2) },
592d1631 2912 { Bad_Opcode },
1ceb70f8 2913 { MOD_TABLE (MOD_0F72_REG_4) },
592d1631 2914 { Bad_Opcode },
1ceb70f8 2915 { MOD_TABLE (MOD_0F72_REG_6) },
a6bd098c 2916 },
1ceb70f8 2917 /* REG_0F73 */
252b5132 2918 {
592d1631
L
2919 { Bad_Opcode },
2920 { Bad_Opcode },
1ceb70f8
L
2921 { MOD_TABLE (MOD_0F73_REG_2) },
2922 { MOD_TABLE (MOD_0F73_REG_3) },
592d1631
L
2923 { Bad_Opcode },
2924 { Bad_Opcode },
1ceb70f8
L
2925 { MOD_TABLE (MOD_0F73_REG_6) },
2926 { MOD_TABLE (MOD_0F73_REG_7) },
252b5132 2927 },
1ceb70f8 2928 /* REG_0FA6 */
252b5132 2929 {
bf890a93
IT
2930 { "montmul", { { OP_0f07, 0 } }, 0 },
2931 { "xsha1", { { OP_0f07, 0 } }, 0 },
2932 { "xsha256", { { OP_0f07, 0 } }, 0 },
4e7d34a6 2933 },
1ceb70f8 2934 /* REG_0FA7 */
4e7d34a6 2935 {
bf890a93
IT
2936 { "xstore-rng", { { OP_0f07, 0 } }, 0 },
2937 { "xcrypt-ecb", { { OP_0f07, 0 } }, 0 },
2938 { "xcrypt-cbc", { { OP_0f07, 0 } }, 0 },
2939 { "xcrypt-ctr", { { OP_0f07, 0 } }, 0 },
2940 { "xcrypt-cfb", { { OP_0f07, 0 } }, 0 },
2941 { "xcrypt-ofb", { { OP_0f07, 0 } }, 0 },
4e7d34a6 2942 },
1ceb70f8 2943 /* REG_0FAE */
4e7d34a6 2944 {
1ceb70f8
L
2945 { MOD_TABLE (MOD_0FAE_REG_0) },
2946 { MOD_TABLE (MOD_0FAE_REG_1) },
2947 { MOD_TABLE (MOD_0FAE_REG_2) },
2948 { MOD_TABLE (MOD_0FAE_REG_3) },
475a2301 2949 { MOD_TABLE (MOD_0FAE_REG_4) },
1ceb70f8
L
2950 { MOD_TABLE (MOD_0FAE_REG_5) },
2951 { MOD_TABLE (MOD_0FAE_REG_6) },
2952 { MOD_TABLE (MOD_0FAE_REG_7) },
252b5132 2953 },
1ceb70f8 2954 /* REG_0FBA */
252b5132 2955 {
592d1631
L
2956 { Bad_Opcode },
2957 { Bad_Opcode },
2958 { Bad_Opcode },
2959 { Bad_Opcode },
bf890a93
IT
2960 { "btQ", { Ev, Ib }, 0 },
2961 { "btsQ", { Evh1, Ib }, 0 },
2962 { "btrQ", { Evh1, Ib }, 0 },
2963 { "btcQ", { Evh1, Ib }, 0 },
c608c12e 2964 },
1ceb70f8 2965 /* REG_0FC7 */
c608c12e 2966 {
592d1631 2967 { Bad_Opcode },
bf890a93 2968 { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } }, 0 },
592d1631 2969 { Bad_Opcode },
963f3586
IT
2970 { MOD_TABLE (MOD_0FC7_REG_3) },
2971 { MOD_TABLE (MOD_0FC7_REG_4) },
2972 { MOD_TABLE (MOD_0FC7_REG_5) },
1ceb70f8
L
2973 { MOD_TABLE (MOD_0FC7_REG_6) },
2974 { MOD_TABLE (MOD_0FC7_REG_7) },
252b5132 2975 },
592a252b 2976 /* REG_VEX_0F71 */
c0f3af97 2977 {
592d1631
L
2978 { Bad_Opcode },
2979 { Bad_Opcode },
592a252b 2980 { MOD_TABLE (MOD_VEX_0F71_REG_2) },
592d1631 2981 { Bad_Opcode },
592a252b 2982 { MOD_TABLE (MOD_VEX_0F71_REG_4) },
592d1631 2983 { Bad_Opcode },
592a252b 2984 { MOD_TABLE (MOD_VEX_0F71_REG_6) },
c0f3af97 2985 },
592a252b 2986 /* REG_VEX_0F72 */
c0f3af97 2987 {
592d1631
L
2988 { Bad_Opcode },
2989 { Bad_Opcode },
592a252b 2990 { MOD_TABLE (MOD_VEX_0F72_REG_2) },
592d1631 2991 { Bad_Opcode },
592a252b 2992 { MOD_TABLE (MOD_VEX_0F72_REG_4) },
592d1631 2993 { Bad_Opcode },
592a252b 2994 { MOD_TABLE (MOD_VEX_0F72_REG_6) },
c0f3af97 2995 },
592a252b 2996 /* REG_VEX_0F73 */
c0f3af97 2997 {
592d1631
L
2998 { Bad_Opcode },
2999 { Bad_Opcode },
592a252b
L
3000 { MOD_TABLE (MOD_VEX_0F73_REG_2) },
3001 { MOD_TABLE (MOD_VEX_0F73_REG_3) },
592d1631
L
3002 { Bad_Opcode },
3003 { Bad_Opcode },
592a252b
L
3004 { MOD_TABLE (MOD_VEX_0F73_REG_6) },
3005 { MOD_TABLE (MOD_VEX_0F73_REG_7) },
c0f3af97 3006 },
592a252b 3007 /* REG_VEX_0FAE */
c0f3af97 3008 {
592d1631
L
3009 { Bad_Opcode },
3010 { Bad_Opcode },
592a252b
L
3011 { MOD_TABLE (MOD_VEX_0FAE_REG_2) },
3012 { MOD_TABLE (MOD_VEX_0FAE_REG_3) },
c0f3af97 3013 },
260cd341
LC
3014 /* REG_VEX_0F3849_X86_64_P_0_W_0_M_1 */
3015 {
3016 { RM_TABLE (RM_VEX_0F3849_X86_64_P_0_W_0_M_1_R_0) },
3017 },
f12dc422
L
3018 /* REG_VEX_0F38F3 */
3019 {
3020 { Bad_Opcode },
035e7389
JB
3021 { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_1) },
3022 { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_2) },
3023 { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_3) },
f12dc422 3024 },
467bbef0 3025 /* REG_0FXOP_09_01_L_0 */
2a2a0f38
QN
3026 {
3027 { Bad_Opcode },
467bbef0
JB
3028 { "blcfill", { VexGdq, Edq }, 0 },
3029 { "blsfill", { VexGdq, Edq }, 0 },
3030 { "blcs", { VexGdq, Edq }, 0 },
3031 { "tzmsk", { VexGdq, Edq }, 0 },
3032 { "blcic", { VexGdq, Edq }, 0 },
3033 { "blsic", { VexGdq, Edq }, 0 },
3034 { "t1mskc", { VexGdq, Edq }, 0 },
2a2a0f38 3035 },
467bbef0 3036 /* REG_0FXOP_09_02_L_0 */
2a2a0f38
QN
3037 {
3038 { Bad_Opcode },
467bbef0 3039 { "blcmsk", { VexGdq, Edq }, 0 },
2a2a0f38
QN
3040 { Bad_Opcode },
3041 { Bad_Opcode },
3042 { Bad_Opcode },
3043 { Bad_Opcode },
467bbef0
JB
3044 { "blci", { VexGdq, Edq }, 0 },
3045 },
3046 /* REG_0FXOP_09_12_M_1_L_0 */
3047 {
3048 { "llwpcb", { Edq }, 0 },
3049 { "slwpcb", { Edq }, 0 },
3050 },
3051 /* REG_0FXOP_0A_12_L_0 */
3052 {
3053 { "lwpins", { VexGdq, Ed, Id }, 0 },
3054 { "lwpval", { VexGdq, Ed, Id }, 0 },
2a2a0f38 3055 },
ad692897
L
3056
3057#include "i386-dis-evex-reg.h"
4e7d34a6
L
3058};
3059
1ceb70f8
L
3060static const struct dis386 prefix_table[][4] = {
3061 /* PREFIX_90 */
252b5132 3062 {
bf890a93
IT
3063 { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } }, 0 },
3064 { "pause", { XX }, 0 },
3065 { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } }, 0 },
507bd325 3066 { NULL, { { NULL, 0 } }, PREFIX_IGNORED }
0f10071e 3067 },
4e7d34a6 3068
f9630fa6 3069 /* PREFIX_0F01_REG_3_RM_1 */
a847e322
JB
3070 {
3071 { "vmmcall", { Skip_MODRM }, 0 },
3072 { "vmgexit", { Skip_MODRM }, 0 },
d27c357a
JB
3073 { Bad_Opcode },
3074 { "vmgexit", { Skip_MODRM }, 0 },
a847e322
JB
3075 },
3076
f8687e93 3077 /* PREFIX_0F01_REG_5_MOD_0 */
603555e5
L
3078 {
3079 { Bad_Opcode },
3080 { "rstorssp", { Mq }, PREFIX_OPCODE },
3081 },
3082
f8687e93 3083 /* PREFIX_0F01_REG_5_MOD_3_RM_0 */
603555e5 3084 {
4b27d27c 3085 { "serialize", { Skip_MODRM }, PREFIX_OPCODE },
2234eee6 3086 { "setssbsy", { Skip_MODRM }, PREFIX_OPCODE },
bb651e8b 3087 { Bad_Opcode },
efe30057 3088 { "xsusldtrk", { Skip_MODRM }, PREFIX_OPCODE },
bb651e8b
CL
3089 },
3090
3091 /* PREFIX_0F01_REG_5_MOD_3_RM_1 */
3092 {
3093 { Bad_Opcode },
3094 { Bad_Opcode },
3095 { Bad_Opcode },
3096 { "xresldtrk", { Skip_MODRM }, PREFIX_OPCODE },
603555e5
L
3097 },
3098
f8687e93 3099 /* PREFIX_0F01_REG_5_MOD_3_RM_2 */
603555e5
L
3100 {
3101 { Bad_Opcode },
c2f76402 3102 { "saveprevssp", { Skip_MODRM }, PREFIX_OPCODE },
603555e5
L
3103 },
3104
267b8516
JB
3105 /* PREFIX_0F01_REG_7_MOD_3_RM_2 */
3106 {
3107 { "monitorx", { { OP_Monitor, 0 } }, 0 },
142861df 3108 { "mcommit", { Skip_MODRM }, 0 },
267b8516
JB
3109 },
3110
3233d7d0
IT
3111 /* PREFIX_0F09 */
3112 {
3113 { "wbinvd", { XX }, 0 },
3114 { "wbnoinvd", { XX }, 0 },
3115 },
3116
1ceb70f8 3117 /* PREFIX_0F10 */
cc0ec051 3118 {
507bd325
L
3119 { "movups", { XM, EXx }, PREFIX_OPCODE },
3120 { "movss", { XM, EXd }, PREFIX_OPCODE },
3121 { "movupd", { XM, EXx }, PREFIX_OPCODE },
3122 { "movsd", { XM, EXq }, PREFIX_OPCODE },
30d1c836 3123 },
4e7d34a6 3124
1ceb70f8 3125 /* PREFIX_0F11 */
30d1c836 3126 {
507bd325
L
3127 { "movups", { EXxS, XM }, PREFIX_OPCODE },
3128 { "movss", { EXdS, XM }, PREFIX_OPCODE },
3129 { "movupd", { EXxS, XM }, PREFIX_OPCODE },
3130 { "movsd", { EXqS, XM }, PREFIX_OPCODE },
4e7d34a6 3131 },
252b5132 3132
1ceb70f8 3133 /* PREFIX_0F12 */
c608c12e 3134 {
1ceb70f8 3135 { MOD_TABLE (MOD_0F12_PREFIX_0) },
507bd325 3136 { "movsldup", { XM, EXx }, PREFIX_OPCODE },
18897deb 3137 { MOD_TABLE (MOD_0F12_PREFIX_2) },
507bd325 3138 { "movddup", { XM, EXq }, PREFIX_OPCODE },
c608c12e 3139 },
4e7d34a6 3140
1ceb70f8 3141 /* PREFIX_0F16 */
c608c12e 3142 {
1ceb70f8 3143 { MOD_TABLE (MOD_0F16_PREFIX_0) },
507bd325 3144 { "movshdup", { XM, EXx }, PREFIX_OPCODE },
18897deb 3145 { MOD_TABLE (MOD_0F16_PREFIX_2) },
c608c12e 3146 },
4e7d34a6 3147
7e8b059b
L
3148 /* PREFIX_0F1A */
3149 {
3150 { MOD_TABLE (MOD_0F1A_PREFIX_0) },
bf890a93
IT
3151 { "bndcl", { Gbnd, Ev_bnd }, 0 },
3152 { "bndmov", { Gbnd, Ebnd }, 0 },
3153 { "bndcu", { Gbnd, Ev_bnd }, 0 },
7e8b059b
L
3154 },
3155
3156 /* PREFIX_0F1B */
3157 {
3158 { MOD_TABLE (MOD_0F1B_PREFIX_0) },
3159 { MOD_TABLE (MOD_0F1B_PREFIX_1) },
9f79e886 3160 { "bndmov", { EbndS, Gbnd }, 0 },
bf890a93 3161 { "bndcn", { Gbnd, Ev_bnd }, 0 },
7e8b059b
L
3162 },
3163
c48935d7
IT
3164 /* PREFIX_0F1C */
3165 {
3166 { MOD_TABLE (MOD_0F1C_PREFIX_0) },
3167 { "nopQ", { Ev }, PREFIX_OPCODE },
3168 { "nopQ", { Ev }, PREFIX_OPCODE },
3169 { "nopQ", { Ev }, PREFIX_OPCODE },
3170 },
3171
603555e5
L
3172 /* PREFIX_0F1E */
3173 {
3174 { "nopQ", { Ev }, PREFIX_OPCODE },
3175 { MOD_TABLE (MOD_0F1E_PREFIX_1) },
3176 { "nopQ", { Ev }, PREFIX_OPCODE },
3177 { "nopQ", { Ev }, PREFIX_OPCODE },
3178 },
3179
1ceb70f8 3180 /* PREFIX_0F2A */
c608c12e 3181 {
507bd325 3182 { "cvtpi2ps", { XM, EMCq }, PREFIX_OPCODE },
b24d668c 3183 { "cvtsi2ss{%LQ|}", { XM, Edq }, PREFIX_OPCODE },
507bd325 3184 { "cvtpi2pd", { XM, EMCq }, PREFIX_OPCODE },
b24d668c 3185 { "cvtsi2sd{%LQ|}", { XM, Edq }, 0 },
c608c12e 3186 },
4e7d34a6 3187
1ceb70f8 3188 /* PREFIX_0F2B */
c608c12e 3189 {
75c135a8
L
3190 { MOD_TABLE (MOD_0F2B_PREFIX_0) },
3191 { MOD_TABLE (MOD_0F2B_PREFIX_1) },
3192 { MOD_TABLE (MOD_0F2B_PREFIX_2) },
3193 { MOD_TABLE (MOD_0F2B_PREFIX_3) },
c608c12e 3194 },
4e7d34a6 3195
1ceb70f8 3196 /* PREFIX_0F2C */
c608c12e 3197 {
507bd325 3198 { "cvttps2pi", { MXC, EXq }, PREFIX_OPCODE },
e1a1babd 3199 { "cvttss2si", { Gdq, EXd }, PREFIX_OPCODE },
507bd325 3200 { "cvttpd2pi", { MXC, EXx }, PREFIX_OPCODE },
e1a1babd 3201 { "cvttsd2si", { Gdq, EXq }, PREFIX_OPCODE },
c608c12e 3202 },
4e7d34a6 3203
1ceb70f8 3204 /* PREFIX_0F2D */
c608c12e 3205 {
507bd325 3206 { "cvtps2pi", { MXC, EXq }, PREFIX_OPCODE },
e1a1babd 3207 { "cvtss2si", { Gdq, EXd }, PREFIX_OPCODE },
507bd325 3208 { "cvtpd2pi", { MXC, EXx }, PREFIX_OPCODE },
e1a1babd 3209 { "cvtsd2si", { Gdq, EXq }, PREFIX_OPCODE },
c608c12e 3210 },
4e7d34a6 3211
1ceb70f8 3212 /* PREFIX_0F2E */
c608c12e 3213 {
bf890a93 3214 { "ucomiss",{ XM, EXd }, 0 },
592d1631 3215 { Bad_Opcode },
bf890a93 3216 { "ucomisd",{ XM, EXq }, 0 },
c608c12e 3217 },
4e7d34a6 3218
1ceb70f8 3219 /* PREFIX_0F2F */
c608c12e 3220 {
bf890a93 3221 { "comiss", { XM, EXd }, 0 },
592d1631 3222 { Bad_Opcode },
bf890a93 3223 { "comisd", { XM, EXq }, 0 },
c608c12e 3224 },
4e7d34a6 3225
1ceb70f8 3226 /* PREFIX_0F51 */
c608c12e 3227 {
507bd325
L
3228 { "sqrtps", { XM, EXx }, PREFIX_OPCODE },
3229 { "sqrtss", { XM, EXd }, PREFIX_OPCODE },
3230 { "sqrtpd", { XM, EXx }, PREFIX_OPCODE },
3231 { "sqrtsd", { XM, EXq }, PREFIX_OPCODE },
c608c12e 3232 },
4e7d34a6 3233
1ceb70f8 3234 /* PREFIX_0F52 */
c608c12e 3235 {
507bd325
L
3236 { "rsqrtps",{ XM, EXx }, PREFIX_OPCODE },
3237 { "rsqrtss",{ XM, EXd }, PREFIX_OPCODE },
c608c12e 3238 },
4e7d34a6 3239
1ceb70f8 3240 /* PREFIX_0F53 */
c608c12e 3241 {
507bd325
L
3242 { "rcpps", { XM, EXx }, PREFIX_OPCODE },
3243 { "rcpss", { XM, EXd }, PREFIX_OPCODE },
c608c12e 3244 },
4e7d34a6 3245
1ceb70f8 3246 /* PREFIX_0F58 */
c608c12e 3247 {
507bd325
L
3248 { "addps", { XM, EXx }, PREFIX_OPCODE },
3249 { "addss", { XM, EXd }, PREFIX_OPCODE },
3250 { "addpd", { XM, EXx }, PREFIX_OPCODE },
3251 { "addsd", { XM, EXq }, PREFIX_OPCODE },
c608c12e 3252 },
4e7d34a6 3253
1ceb70f8 3254 /* PREFIX_0F59 */
c608c12e 3255 {
507bd325
L
3256 { "mulps", { XM, EXx }, PREFIX_OPCODE },
3257 { "mulss", { XM, EXd }, PREFIX_OPCODE },
3258 { "mulpd", { XM, EXx }, PREFIX_OPCODE },
3259 { "mulsd", { XM, EXq }, PREFIX_OPCODE },
041bd2e0 3260 },
4e7d34a6 3261
1ceb70f8 3262 /* PREFIX_0F5A */
041bd2e0 3263 {
507bd325
L
3264 { "cvtps2pd", { XM, EXq }, PREFIX_OPCODE },
3265 { "cvtss2sd", { XM, EXd }, PREFIX_OPCODE },
3266 { "cvtpd2ps", { XM, EXx }, PREFIX_OPCODE },
3267 { "cvtsd2ss", { XM, EXq }, PREFIX_OPCODE },
041bd2e0 3268 },
4e7d34a6 3269
1ceb70f8 3270 /* PREFIX_0F5B */
041bd2e0 3271 {
507bd325
L
3272 { "cvtdq2ps", { XM, EXx }, PREFIX_OPCODE },
3273 { "cvttps2dq", { XM, EXx }, PREFIX_OPCODE },
3274 { "cvtps2dq", { XM, EXx }, PREFIX_OPCODE },
041bd2e0 3275 },
4e7d34a6 3276
1ceb70f8 3277 /* PREFIX_0F5C */
041bd2e0 3278 {
507bd325
L
3279 { "subps", { XM, EXx }, PREFIX_OPCODE },
3280 { "subss", { XM, EXd }, PREFIX_OPCODE },
3281 { "subpd", { XM, EXx }, PREFIX_OPCODE },
3282 { "subsd", { XM, EXq }, PREFIX_OPCODE },
041bd2e0 3283 },
4e7d34a6 3284
1ceb70f8 3285 /* PREFIX_0F5D */
041bd2e0 3286 {
507bd325
L
3287 { "minps", { XM, EXx }, PREFIX_OPCODE },
3288 { "minss", { XM, EXd }, PREFIX_OPCODE },
3289 { "minpd", { XM, EXx }, PREFIX_OPCODE },
3290 { "minsd", { XM, EXq }, PREFIX_OPCODE },
041bd2e0 3291 },
4e7d34a6 3292
1ceb70f8 3293 /* PREFIX_0F5E */
041bd2e0 3294 {
507bd325
L
3295 { "divps", { XM, EXx }, PREFIX_OPCODE },
3296 { "divss", { XM, EXd }, PREFIX_OPCODE },
3297 { "divpd", { XM, EXx }, PREFIX_OPCODE },
3298 { "divsd", { XM, EXq }, PREFIX_OPCODE },
041bd2e0 3299 },
4e7d34a6 3300
1ceb70f8 3301 /* PREFIX_0F5F */
041bd2e0 3302 {
507bd325
L
3303 { "maxps", { XM, EXx }, PREFIX_OPCODE },
3304 { "maxss", { XM, EXd }, PREFIX_OPCODE },
3305 { "maxpd", { XM, EXx }, PREFIX_OPCODE },
3306 { "maxsd", { XM, EXq }, PREFIX_OPCODE },
041bd2e0 3307 },
4e7d34a6 3308
1ceb70f8 3309 /* PREFIX_0F60 */
041bd2e0 3310 {
507bd325 3311 { "punpcklbw",{ MX, EMd }, PREFIX_OPCODE },
592d1631 3312 { Bad_Opcode },
507bd325 3313 { "punpcklbw",{ MX, EMx }, PREFIX_OPCODE },
041bd2e0 3314 },
4e7d34a6 3315
1ceb70f8 3316 /* PREFIX_0F61 */
041bd2e0 3317 {
507bd325 3318 { "punpcklwd",{ MX, EMd }, PREFIX_OPCODE },
592d1631 3319 { Bad_Opcode },
507bd325 3320 { "punpcklwd",{ MX, EMx }, PREFIX_OPCODE },
041bd2e0 3321 },
4e7d34a6 3322
1ceb70f8 3323 /* PREFIX_0F62 */
041bd2e0 3324 {
507bd325 3325 { "punpckldq",{ MX, EMd }, PREFIX_OPCODE },
592d1631 3326 { Bad_Opcode },
507bd325 3327 { "punpckldq",{ MX, EMx }, PREFIX_OPCODE },
041bd2e0 3328 },
4e7d34a6 3329
1ceb70f8 3330 /* PREFIX_0F6F */
ca164297 3331 {
507bd325
L
3332 { "movq", { MX, EM }, PREFIX_OPCODE },
3333 { "movdqu", { XM, EXx }, PREFIX_OPCODE },
3334 { "movdqa", { XM, EXx }, PREFIX_OPCODE },
ca164297 3335 },
4e7d34a6 3336
1ceb70f8 3337 /* PREFIX_0F70 */
4e7d34a6 3338 {
507bd325
L
3339 { "pshufw", { MX, EM, Ib }, PREFIX_OPCODE },
3340 { "pshufhw",{ XM, EXx, Ib }, PREFIX_OPCODE },
3341 { "pshufd", { XM, EXx, Ib }, PREFIX_OPCODE },
3342 { "pshuflw",{ XM, EXx, Ib }, PREFIX_OPCODE },
4e7d34a6
L
3343 },
3344
1ceb70f8 3345 /* PREFIX_0F78 */
4e7d34a6 3346 {
bf890a93 3347 {"vmread", { Em, Gm }, 0 },
592d1631 3348 { Bad_Opcode },
bf890a93
IT
3349 {"extrq", { XS, Ib, Ib }, 0 },
3350 {"insertq", { XM, XS, Ib, Ib }, 0 },
4e7d34a6
L
3351 },
3352
1ceb70f8 3353 /* PREFIX_0F79 */
4e7d34a6 3354 {
bf890a93 3355 {"vmwrite", { Gm, Em }, 0 },
592d1631 3356 { Bad_Opcode },
bf890a93
IT
3357 {"extrq", { XM, XS }, 0 },
3358 {"insertq", { XM, XS }, 0 },
4e7d34a6
L
3359 },
3360
1ceb70f8 3361 /* PREFIX_0F7C */
ca164297 3362 {
592d1631
L
3363 { Bad_Opcode },
3364 { Bad_Opcode },
507bd325
L
3365 { "haddpd", { XM, EXx }, PREFIX_OPCODE },
3366 { "haddps", { XM, EXx }, PREFIX_OPCODE },
ca164297 3367 },
4e7d34a6 3368
1ceb70f8 3369 /* PREFIX_0F7D */
ca164297 3370 {
592d1631
L
3371 { Bad_Opcode },
3372 { Bad_Opcode },
507bd325
L
3373 { "hsubpd", { XM, EXx }, PREFIX_OPCODE },
3374 { "hsubps", { XM, EXx }, PREFIX_OPCODE },
ca164297 3375 },
4e7d34a6 3376
1ceb70f8 3377 /* PREFIX_0F7E */
ca164297 3378 {
507bd325
L
3379 { "movK", { Edq, MX }, PREFIX_OPCODE },
3380 { "movq", { XM, EXq }, PREFIX_OPCODE },
3381 { "movK", { Edq, XM }, PREFIX_OPCODE },
ca164297 3382 },
4e7d34a6 3383
1ceb70f8 3384 /* PREFIX_0F7F */
ca164297 3385 {
507bd325
L
3386 { "movq", { EMS, MX }, PREFIX_OPCODE },
3387 { "movdqu", { EXxS, XM }, PREFIX_OPCODE },
3388 { "movdqa", { EXxS, XM }, PREFIX_OPCODE },
ca164297 3389 },
4e7d34a6 3390
f8687e93 3391 /* PREFIX_0FAE_REG_0_MOD_3 */
c7b8aa3a
L
3392 {
3393 { Bad_Opcode },
bf890a93 3394 { "rdfsbase", { Ev }, 0 },
c7b8aa3a
L
3395 },
3396
f8687e93 3397 /* PREFIX_0FAE_REG_1_MOD_3 */
c7b8aa3a
L
3398 {
3399 { Bad_Opcode },
bf890a93 3400 { "rdgsbase", { Ev }, 0 },
c7b8aa3a
L
3401 },
3402
f8687e93 3403 /* PREFIX_0FAE_REG_2_MOD_3 */
c7b8aa3a
L
3404 {
3405 { Bad_Opcode },
bf890a93 3406 { "wrfsbase", { Ev }, 0 },
c7b8aa3a
L
3407 },
3408
f8687e93 3409 /* PREFIX_0FAE_REG_3_MOD_3 */
c7b8aa3a
L
3410 {
3411 { Bad_Opcode },
bf890a93 3412 { "wrgsbase", { Ev }, 0 },
c7b8aa3a
L
3413 },
3414
f8687e93 3415 /* PREFIX_0FAE_REG_4_MOD_0 */
6b40c462
L
3416 {
3417 { "xsave", { FXSAVE }, 0 },
b24d668c 3418 { "ptwrite{%LQ|}", { Edq }, 0 },
6b40c462
L
3419 },
3420
f8687e93 3421 /* PREFIX_0FAE_REG_4_MOD_3 */
6b40c462
L
3422 {
3423 { Bad_Opcode },
b24d668c 3424 { "ptwrite{%LQ|}", { Edq }, 0 },
6b40c462
L
3425 },
3426
f8687e93 3427 /* PREFIX_0FAE_REG_5_MOD_3 */
2234eee6
L
3428 {
3429 { "lfence", { Skip_MODRM }, 0 },
464d2b65 3430 { "incsspK", { Edq }, PREFIX_OPCODE },
603555e5
L
3431 },
3432
f8687e93 3433 /* PREFIX_0FAE_REG_6_MOD_0 */
c5e7287a 3434 {
603555e5
L
3435 { "xsaveopt", { FXSAVE }, PREFIX_OPCODE },
3436 { "clrssbsy", { Mq }, PREFIX_OPCODE },
3437 { "clwb", { Mb }, PREFIX_OPCODE },
c5e7287a
IT
3438 },
3439
f8687e93 3440 /* PREFIX_0FAE_REG_6_MOD_3 */
de89d0a3 3441 {
f8687e93 3442 { RM_TABLE (RM_0FAE_REG_6_MOD_3_P_0) },
de89d0a3 3443 { "umonitor", { Eva }, PREFIX_OPCODE },
ae1d3843
L
3444 { "tpause", { Edq }, PREFIX_OPCODE },
3445 { "umwait", { Edq }, PREFIX_OPCODE },
de89d0a3
IT
3446 },
3447
f8687e93 3448 /* PREFIX_0FAE_REG_7_MOD_0 */
963f3586 3449 {
bf890a93 3450 { "clflush", { Mb }, 0 },
963f3586 3451 { Bad_Opcode },
bf890a93 3452 { "clflushopt", { Mb }, 0 },
963f3586
IT
3453 },
3454
1ceb70f8 3455 /* PREFIX_0FB8 */
ca164297 3456 {
592d1631 3457 { Bad_Opcode },
bf890a93 3458 { "popcntS", { Gv, Ev }, 0 },
ca164297 3459 },
4e7d34a6 3460
f12dc422
L
3461 /* PREFIX_0FBC */
3462 {
bf890a93
IT
3463 { "bsfS", { Gv, Ev }, 0 },
3464 { "tzcntS", { Gv, Ev }, 0 },
3465 { "bsfS", { Gv, Ev }, 0 },
f12dc422
L
3466 },
3467
1ceb70f8 3468 /* PREFIX_0FBD */
050dfa73 3469 {
bf890a93
IT
3470 { "bsrS", { Gv, Ev }, 0 },
3471 { "lzcntS", { Gv, Ev }, 0 },
3472 { "bsrS", { Gv, Ev }, 0 },
050dfa73
MM
3473 },
3474
1ceb70f8 3475 /* PREFIX_0FC2 */
050dfa73 3476 {
507bd325
L
3477 { "cmpps", { XM, EXx, CMP }, PREFIX_OPCODE },
3478 { "cmpss", { XM, EXd, CMP }, PREFIX_OPCODE },
3479 { "cmppd", { XM, EXx, CMP }, PREFIX_OPCODE },
3480 { "cmpsd", { XM, EXq, CMP }, PREFIX_OPCODE },
050dfa73 3481 },
246c51aa 3482
f8687e93 3483 /* PREFIX_0FC7_REG_6_MOD_0 */
92fddf8e 3484 {
bf890a93
IT
3485 { "vmptrld",{ Mq }, 0 },
3486 { "vmxon", { Mq }, 0 },
3487 { "vmclear",{ Mq }, 0 },
92fddf8e
L
3488 },
3489
f8687e93 3490 /* PREFIX_0FC7_REG_6_MOD_3 */
f24bcbaa
L
3491 {
3492 { "rdrand", { Ev }, 0 },
3493 { Bad_Opcode },
3494 { "rdrand", { Ev }, 0 }
3495 },
3496
f8687e93 3497 /* PREFIX_0FC7_REG_7_MOD_3 */
f24bcbaa
L
3498 {
3499 { "rdseed", { Ev }, 0 },
8bc52696 3500 { "rdpid", { Em }, 0 },
f24bcbaa
L
3501 { "rdseed", { Ev }, 0 },
3502 },
3503
1ceb70f8 3504 /* PREFIX_0FD0 */
050dfa73 3505 {
592d1631
L
3506 { Bad_Opcode },
3507 { Bad_Opcode },
bf890a93
IT
3508 { "addsubpd", { XM, EXx }, 0 },
3509 { "addsubps", { XM, EXx }, 0 },
246c51aa 3510 },
050dfa73 3511
1ceb70f8 3512 /* PREFIX_0FD6 */
050dfa73 3513 {
592d1631 3514 { Bad_Opcode },
bf890a93
IT
3515 { "movq2dq",{ XM, MS }, 0 },
3516 { "movq", { EXqS, XM }, 0 },
3517 { "movdq2q",{ MX, XS }, 0 },
050dfa73
MM
3518 },
3519
1ceb70f8 3520 /* PREFIX_0FE6 */
7918206c 3521 {
592d1631 3522 { Bad_Opcode },
507bd325
L
3523 { "cvtdq2pd", { XM, EXq }, PREFIX_OPCODE },
3524 { "cvttpd2dq", { XM, EXx }, PREFIX_OPCODE },
3525 { "cvtpd2dq", { XM, EXx }, PREFIX_OPCODE },
7918206c 3526 },
8b38ad71 3527
1ceb70f8 3528 /* PREFIX_0FE7 */
8b38ad71 3529 {
507bd325 3530 { "movntq", { Mq, MX }, PREFIX_OPCODE },
592d1631 3531 { Bad_Opcode },
75c135a8 3532 { MOD_TABLE (MOD_0FE7_PREFIX_2) },
4e7d34a6
L
3533 },
3534
1ceb70f8 3535 /* PREFIX_0FF0 */
4e7d34a6 3536 {
592d1631
L
3537 { Bad_Opcode },
3538 { Bad_Opcode },
3539 { Bad_Opcode },
1ceb70f8 3540 { MOD_TABLE (MOD_0FF0_PREFIX_3) },
4e7d34a6
L
3541 },
3542
1ceb70f8 3543 /* PREFIX_0FF7 */
4e7d34a6 3544 {
507bd325 3545 { "maskmovq", { MX, MS }, PREFIX_OPCODE },
592d1631 3546 { Bad_Opcode },
507bd325 3547 { "maskmovdqu", { XM, XS }, PREFIX_OPCODE },
8b38ad71 3548 },
42903f7f 3549
1ceb70f8 3550 /* PREFIX_0F38F0 */
4e7d34a6 3551 {
9ab00b61 3552 { "movbeS", { Gv, Mv }, PREFIX_OPCODE },
592d1631 3553 { Bad_Opcode },
9ab00b61 3554 { "movbeS", { Gv, Mv }, PREFIX_OPCODE },
2875b28a 3555 { "crc32A", { Gdq, Eb }, PREFIX_OPCODE },
4e7d34a6
L
3556 },
3557
1ceb70f8 3558 /* PREFIX_0F38F1 */
4e7d34a6 3559 {
9ab00b61 3560 { "movbeS", { Mv, Gv }, PREFIX_OPCODE },
592d1631 3561 { Bad_Opcode },
9ab00b61 3562 { "movbeS", { Mv, Gv }, PREFIX_OPCODE },
2875b28a 3563 { "crc32Q", { Gdq, Ev }, PREFIX_OPCODE },
4e7d34a6
L
3564 },
3565
603555e5
L
3566 /* PREFIX_0F38F6 */
3567 {
3568 { MOD_TABLE (MOD_0F38F6_PREFIX_0) },
507bd325
L
3569 { "adoxS", { Gdq, Edq}, PREFIX_OPCODE },
3570 { "adcxS", { Gdq, Edq}, PREFIX_OPCODE },
e2e1fcde
L
3571 { Bad_Opcode },
3572 },
3573
c0a30a9f
L
3574 /* PREFIX_0F38F8 */
3575 {
3576 { Bad_Opcode },
5d79adc4 3577 { MOD_TABLE (MOD_0F38F8_PREFIX_1) },
c0a30a9f 3578 { MOD_TABLE (MOD_0F38F8_PREFIX_2) },
5d79adc4 3579 { MOD_TABLE (MOD_0F38F8_PREFIX_3) },
c0a30a9f
L
3580 },
3581
7531c613 3582 /* PREFIX_VEX_0F10 */
42903f7f 3583 {
7531c613
JB
3584 { "vmovups", { XM, EXx }, 0 },
3585 { "vmovss", { XMScalar, VexScalarR, EXxmm_md }, 0 },
3586 { "vmovupd", { XM, EXx }, 0 },
3587 { "vmovsd", { XMScalar, VexScalarR, EXxmm_mq }, 0 },
42903f7f
L
3588 },
3589
7531c613 3590 /* PREFIX_VEX_0F11 */
42903f7f 3591 {
7531c613
JB
3592 { "vmovups", { EXxS, XM }, 0 },
3593 { "vmovss", { EXdS, VexScalarR, XMScalar }, 0 },
3594 { "vmovupd", { EXxS, XM }, 0 },
3595 { "vmovsd", { EXqS, VexScalarR, XMScalar }, 0 },
42903f7f
L
3596 },
3597
7531c613 3598 /* PREFIX_VEX_0F12 */
42903f7f 3599 {
7531c613
JB
3600 { MOD_TABLE (MOD_VEX_0F12_PREFIX_0) },
3601 { "vmovsldup", { XM, EXx }, 0 },
3602 { MOD_TABLE (MOD_VEX_0F12_PREFIX_2) },
3603 { "vmovddup", { XM, EXymmq }, 0 },
42903f7f
L
3604 },
3605
7531c613 3606 /* PREFIX_VEX_0F16 */
42903f7f 3607 {
7531c613
JB
3608 { MOD_TABLE (MOD_VEX_0F16_PREFIX_0) },
3609 { "vmovshdup", { XM, EXx }, 0 },
3610 { MOD_TABLE (MOD_VEX_0F16_PREFIX_2) },
5f754f58 3611 },
7c52e0e8 3612
592a252b 3613 /* PREFIX_VEX_0F2A */
5f754f58 3614 {
592d1631 3615 { Bad_Opcode },
b24d668c 3616 { "vcvtsi2ss{%LQ|}", { XMScalar, VexScalar, Edq }, 0 },
592d1631 3617 { Bad_Opcode },
b24d668c 3618 { "vcvtsi2sd{%LQ|}", { XMScalar, VexScalar, Edq }, 0 },
5f754f58 3619 },
7c52e0e8 3620
592a252b 3621 /* PREFIX_VEX_0F2C */
5f754f58 3622 {
592d1631 3623 { Bad_Opcode },
17d3c7ec 3624 { "vcvttss2si", { Gdq, EXxmm_md, EXxEVexS }, 0 },
592d1631 3625 { Bad_Opcode },
17d3c7ec 3626 { "vcvttsd2si", { Gdq, EXxmm_mq, EXxEVexS }, 0 },
5f754f58 3627 },
7c52e0e8 3628
592a252b 3629 /* PREFIX_VEX_0F2D */
7c52e0e8 3630 {
592d1631 3631 { Bad_Opcode },
17d3c7ec 3632 { "vcvtss2si", { Gdq, EXxmm_md, EXxEVexR }, 0 },
592d1631 3633 { Bad_Opcode },
17d3c7ec 3634 { "vcvtsd2si", { Gdq, EXxmm_mq, EXxEVexR }, 0 },
7c52e0e8
L
3635 },
3636
592a252b 3637 /* PREFIX_VEX_0F2E */
7c52e0e8 3638 {
17d3c7ec 3639 { "vucomisX", { XMScalar, EXxmm_md, EXxEVexS }, PREFIX_OPCODE },
592d1631 3640 { Bad_Opcode },
17d3c7ec 3641 { "vucomisX", { XMScalar, EXxmm_mq, EXxEVexS }, PREFIX_OPCODE },
7c52e0e8
L
3642 },
3643
592a252b 3644 /* PREFIX_VEX_0F2F */
7c52e0e8 3645 {
17d3c7ec 3646 { "vcomisX", { XMScalar, EXxmm_md, EXxEVexS }, PREFIX_OPCODE },
592d1631 3647 { Bad_Opcode },
17d3c7ec 3648 { "vcomisX", { XMScalar, EXxmm_mq, EXxEVexS }, PREFIX_OPCODE },
7c52e0e8
L
3649 },
3650
43234a1e
L
3651 /* PREFIX_VEX_0F41 */
3652 {
3653 { VEX_LEN_TABLE (VEX_LEN_0F41_P_0) },
1ba585e8
IT
3654 { Bad_Opcode },
3655 { VEX_LEN_TABLE (VEX_LEN_0F41_P_2) },
43234a1e
L
3656 },
3657
3658 /* PREFIX_VEX_0F42 */
3659 {
3660 { VEX_LEN_TABLE (VEX_LEN_0F42_P_0) },
1ba585e8
IT
3661 { Bad_Opcode },
3662 { VEX_LEN_TABLE (VEX_LEN_0F42_P_2) },
43234a1e
L
3663 },
3664
7531c613 3665 /* PREFIX_VEX_0F44 */
c0f3af97 3666 {
7531c613 3667 { VEX_LEN_TABLE (VEX_LEN_0F44_P_0) },
592d1631 3668 { Bad_Opcode },
7531c613 3669 { VEX_LEN_TABLE (VEX_LEN_0F44_P_2) },
c0f3af97
L
3670 },
3671
7531c613 3672 /* PREFIX_VEX_0F45 */
0bfee649 3673 {
7531c613 3674 { VEX_LEN_TABLE (VEX_LEN_0F45_P_0) },
592d1631 3675 { Bad_Opcode },
7531c613 3676 { VEX_LEN_TABLE (VEX_LEN_0F45_P_2) },
0bfee649
L
3677 },
3678
7531c613 3679 /* PREFIX_VEX_0F46 */
43234a1e 3680 {
7531c613 3681 { VEX_LEN_TABLE (VEX_LEN_0F46_P_0) },
43234a1e 3682 { Bad_Opcode },
7531c613 3683 { VEX_LEN_TABLE (VEX_LEN_0F46_P_2) },
43234a1e
L
3684 },
3685
7531c613 3686 /* PREFIX_VEX_0F47 */
1ba585e8 3687 {
7531c613 3688 { VEX_LEN_TABLE (VEX_LEN_0F47_P_0) },
1ba585e8 3689 { Bad_Opcode },
7531c613 3690 { VEX_LEN_TABLE (VEX_LEN_0F47_P_2) },
1ba585e8
IT
3691 },
3692
7531c613 3693 /* PREFIX_VEX_0F4A */
43234a1e 3694 {
7531c613 3695 { VEX_LEN_TABLE (VEX_LEN_0F4A_P_0) },
43234a1e 3696 { Bad_Opcode },
7531c613 3697 { VEX_LEN_TABLE (VEX_LEN_0F4A_P_2) },
43234a1e
L
3698 },
3699
7531c613 3700 /* PREFIX_VEX_0F4B */
1ba585e8 3701 {
7531c613 3702 { VEX_LEN_TABLE (VEX_LEN_0F4B_P_0) },
1ba585e8 3703 { Bad_Opcode },
7531c613 3704 { VEX_LEN_TABLE (VEX_LEN_0F4B_P_2) },
1ba585e8
IT
3705 },
3706
7531c613 3707 /* PREFIX_VEX_0F51 */
6c30d220 3708 {
7531c613
JB
3709 { "vsqrtps", { XM, EXx }, 0 },
3710 { "vsqrtss", { XMScalar, VexScalar, EXxmm_md }, 0 },
3711 { "vsqrtpd", { XM, EXx }, 0 },
3712 { "vsqrtsd", { XMScalar, VexScalar, EXxmm_mq }, 0 },
6c30d220
L
3713 },
3714
7531c613 3715 /* PREFIX_VEX_0F52 */
6c30d220 3716 {
7531c613
JB
3717 { "vrsqrtps", { XM, EXx }, 0 },
3718 { "vrsqrtss", { XMScalar, VexScalar, EXxmm_md }, 0 },
6c30d220
L
3719 },
3720
7531c613 3721 /* PREFIX_VEX_0F53 */
c0f3af97 3722 {
7531c613
JB
3723 { "vrcpps", { XM, EXx }, 0 },
3724 { "vrcpss", { XMScalar, VexScalar, EXxmm_md }, 0 },
c0f3af97
L
3725 },
3726
7531c613 3727 /* PREFIX_VEX_0F58 */
c0f3af97 3728 {
7531c613
JB
3729 { "vaddps", { XM, Vex, EXx }, 0 },
3730 { "vaddss", { XMScalar, VexScalar, EXxmm_md }, 0 },
3731 { "vaddpd", { XM, Vex, EXx }, 0 },
3732 { "vaddsd", { XMScalar, VexScalar, EXxmm_mq }, 0 },
c0f3af97
L
3733 },
3734
7531c613 3735 /* PREFIX_VEX_0F59 */
c0f3af97 3736 {
7531c613
JB
3737 { "vmulps", { XM, Vex, EXx }, 0 },
3738 { "vmulss", { XMScalar, VexScalar, EXxmm_md }, 0 },
3739 { "vmulpd", { XM, Vex, EXx }, 0 },
3740 { "vmulsd", { XMScalar, VexScalar, EXxmm_mq }, 0 },
c0f3af97
L
3741 },
3742
7531c613 3743 /* PREFIX_VEX_0F5A */
ce2f5b3c 3744 {
7531c613
JB
3745 { "vcvtps2pd", { XM, EXxmmq }, 0 },
3746 { "vcvtss2sd", { XMScalar, VexScalar, EXxmm_md }, 0 },
3747 { "vcvtpd2ps%XY",{ XMM, EXx }, 0 },
3748 { "vcvtsd2ss", { XMScalar, VexScalar, EXxmm_mq }, 0 },
ce2f5b3c
L
3749 },
3750
7531c613 3751 /* PREFIX_VEX_0F5B */
6c30d220 3752 {
7531c613
JB
3753 { "vcvtdq2ps", { XM, EXx }, 0 },
3754 { "vcvttps2dq", { XM, EXx }, 0 },
3755 { "vcvtps2dq", { XM, EXx }, 0 },
6c30d220
L
3756 },
3757
7531c613 3758 /* PREFIX_VEX_0F5C */
a683cc34 3759 {
7531c613
JB
3760 { "vsubps", { XM, Vex, EXx }, 0 },
3761 { "vsubss", { XMScalar, VexScalar, EXxmm_md }, 0 },
3762 { "vsubpd", { XM, Vex, EXx }, 0 },
3763 { "vsubsd", { XMScalar, VexScalar, EXxmm_mq }, 0 },
a683cc34
SP
3764 },
3765
7531c613 3766 /* PREFIX_VEX_0F5D */
a683cc34 3767 {
7531c613
JB
3768 { "vminps", { XM, Vex, EXx }, 0 },
3769 { "vminss", { XMScalar, VexScalar, EXxmm_md }, 0 },
3770 { "vminpd", { XM, Vex, EXx }, 0 },
3771 { "vminsd", { XMScalar, VexScalar, EXxmm_mq }, 0 },
a683cc34
SP
3772 },
3773
7531c613 3774 /* PREFIX_VEX_0F5E */
c0f3af97 3775 {
7531c613
JB
3776 { "vdivps", { XM, Vex, EXx }, 0 },
3777 { "vdivss", { XMScalar, VexScalar, EXxmm_md }, 0 },
3778 { "vdivpd", { XM, Vex, EXx }, 0 },
3779 { "vdivsd", { XMScalar, VexScalar, EXxmm_mq }, 0 },
c0f3af97
L
3780 },
3781
7531c613 3782 /* PREFIX_VEX_0F5F */
c0f3af97 3783 {
7531c613
JB
3784 { "vmaxps", { XM, Vex, EXx }, 0 },
3785 { "vmaxss", { XMScalar, VexScalar, EXxmm_md }, 0 },
3786 { "vmaxpd", { XM, Vex, EXx }, 0 },
3787 { "vmaxsd", { XMScalar, VexScalar, EXxmm_mq }, 0 },
c0f3af97
L
3788 },
3789
7531c613 3790 /* PREFIX_VEX_0F6F */
c0f3af97 3791 {
592d1631 3792 { Bad_Opcode },
7531c613
JB
3793 { "vmovdqu", { XM, EXx }, 0 },
3794 { "vmovdqa", { XM, EXx }, 0 },
c0f3af97
L
3795 },
3796
7531c613 3797 /* PREFIX_VEX_0F70 */
922d8de8 3798 {
592d1631 3799 { Bad_Opcode },
7531c613
JB
3800 { "vpshufhw", { XM, EXx, Ib }, 0 },
3801 { "vpshufd", { XM, EXx, Ib }, 0 },
3802 { "vpshuflw", { XM, EXx, Ib }, 0 },
922d8de8
DR
3803 },
3804
7531c613 3805 /* PREFIX_VEX_0F7C */
922d8de8 3806 {
592d1631
L
3807 { Bad_Opcode },
3808 { Bad_Opcode },
7531c613
JB
3809 { "vhaddpd", { XM, Vex, EXx }, 0 },
3810 { "vhaddps", { XM, Vex, EXx }, 0 },
922d8de8
DR
3811 },
3812
7531c613 3813 /* PREFIX_VEX_0F7D */
922d8de8 3814 {
592d1631
L
3815 { Bad_Opcode },
3816 { Bad_Opcode },
7531c613
JB
3817 { "vhsubpd", { XM, Vex, EXx }, 0 },
3818 { "vhsubps", { XM, Vex, EXx }, 0 },
922d8de8
DR
3819 },
3820
7531c613 3821 /* PREFIX_VEX_0F7E */
c0f3af97 3822 {
592d1631 3823 { Bad_Opcode },
7531c613
JB
3824 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_1) },
3825 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_2) },
c0f3af97
L
3826 },
3827
7531c613 3828 /* PREFIX_VEX_0F7F */
c0f3af97 3829 {
592d1631 3830 { Bad_Opcode },
7531c613
JB
3831 { "vmovdqu", { EXxS, XM }, 0 },
3832 { "vmovdqa", { EXxS, XM }, 0 },
c0f3af97
L
3833 },
3834
7531c613 3835 /* PREFIX_VEX_0F90 */
c0f3af97 3836 {
7531c613 3837 { VEX_LEN_TABLE (VEX_LEN_0F90_P_0) },
592d1631 3838 { Bad_Opcode },
7531c613 3839 { VEX_LEN_TABLE (VEX_LEN_0F90_P_2) },
c0f3af97
L
3840 },
3841
7531c613 3842 /* PREFIX_VEX_0F91 */
c0f3af97 3843 {
7531c613 3844 { VEX_LEN_TABLE (VEX_LEN_0F91_P_0) },
592d1631 3845 { Bad_Opcode },
7531c613 3846 { VEX_LEN_TABLE (VEX_LEN_0F91_P_2) },
c0f3af97 3847 },
a5ff0eb2 3848
7531c613 3849 /* PREFIX_VEX_0F92 */
922d8de8 3850 {
7531c613 3851 { VEX_LEN_TABLE (VEX_LEN_0F92_P_0) },
592d1631 3852 { Bad_Opcode },
7531c613
JB
3853 { VEX_LEN_TABLE (VEX_LEN_0F92_P_2) },
3854 { VEX_LEN_TABLE (VEX_LEN_0F92_P_3) },
922d8de8
DR
3855 },
3856
7531c613 3857 /* PREFIX_VEX_0F93 */
922d8de8 3858 {
7531c613 3859 { VEX_LEN_TABLE (VEX_LEN_0F93_P_0) },
592d1631 3860 { Bad_Opcode },
7531c613
JB
3861 { VEX_LEN_TABLE (VEX_LEN_0F93_P_2) },
3862 { VEX_LEN_TABLE (VEX_LEN_0F93_P_3) },
922d8de8
DR
3863 },
3864
7531c613 3865 /* PREFIX_VEX_0F98 */
922d8de8 3866 {
7531c613 3867 { VEX_LEN_TABLE (VEX_LEN_0F98_P_0) },
592d1631 3868 { Bad_Opcode },
7531c613 3869 { VEX_LEN_TABLE (VEX_LEN_0F98_P_2) },
922d8de8
DR
3870 },
3871
7531c613 3872 /* PREFIX_VEX_0F99 */
922d8de8 3873 {
7531c613 3874 { VEX_LEN_TABLE (VEX_LEN_0F99_P_0) },
592d1631 3875 { Bad_Opcode },
7531c613 3876 { VEX_LEN_TABLE (VEX_LEN_0F99_P_2) },
922d8de8
DR
3877 },
3878
7531c613 3879 /* PREFIX_VEX_0FC2 */
922d8de8 3880 {
7531c613
JB
3881 { "vcmpps", { XM, Vex, EXx, CMP }, 0 },
3882 { "vcmpss", { XMScalar, VexScalar, EXxmm_md, CMP }, 0 },
3883 { "vcmppd", { XM, Vex, EXx, CMP }, 0 },
3884 { "vcmpsd", { XMScalar, VexScalar, EXxmm_mq, CMP }, 0 },
922d8de8
DR
3885 },
3886
7531c613 3887 /* PREFIX_VEX_0FD0 */
922d8de8 3888 {
592d1631
L
3889 { Bad_Opcode },
3890 { Bad_Opcode },
7531c613
JB
3891 { "vaddsubpd", { XM, Vex, EXx }, 0 },
3892 { "vaddsubps", { XM, Vex, EXx }, 0 },
922d8de8
DR
3893 },
3894
7531c613 3895 /* PREFIX_VEX_0FE6 */
922d8de8 3896 {
592d1631 3897 { Bad_Opcode },
7531c613
JB
3898 { "vcvtdq2pd", { XM, EXxmmq }, 0 },
3899 { "vcvttpd2dq%XY", { XMM, EXx }, 0 },
3900 { "vcvtpd2dq%XY", { XMM, EXx }, 0 },
922d8de8
DR
3901 },
3902
7531c613 3903 /* PREFIX_VEX_0FF0 */
922d8de8 3904 {
592d1631
L
3905 { Bad_Opcode },
3906 { Bad_Opcode },
7531c613
JB
3907 { Bad_Opcode },
3908 { MOD_TABLE (MOD_VEX_0FF0_PREFIX_3) },
922d8de8
DR
3909 },
3910
7531c613 3911 /* PREFIX_VEX_0F3849_X86_64 */
922d8de8 3912 {
7531c613 3913 { VEX_W_TABLE (VEX_W_0F3849_X86_64_P_0) },
592d1631 3914 { Bad_Opcode },
7531c613
JB
3915 { VEX_W_TABLE (VEX_W_0F3849_X86_64_P_2) },
3916 { VEX_W_TABLE (VEX_W_0F3849_X86_64_P_3) },
922d8de8
DR
3917 },
3918
7531c613 3919 /* PREFIX_VEX_0F384B_X86_64 */
922d8de8 3920 {
592d1631 3921 { Bad_Opcode },
7531c613
JB
3922 { VEX_W_TABLE (VEX_W_0F384B_X86_64_P_1) },
3923 { VEX_W_TABLE (VEX_W_0F384B_X86_64_P_2) },
3924 { VEX_W_TABLE (VEX_W_0F384B_X86_64_P_3) },
922d8de8
DR
3925 },
3926
7531c613 3927 /* PREFIX_VEX_0F385C_X86_64 */
922d8de8 3928 {
592d1631 3929 { Bad_Opcode },
7531c613 3930 { VEX_W_TABLE (VEX_W_0F385C_X86_64_P_1) },
592d1631 3931 { Bad_Opcode },
922d8de8
DR
3932 },
3933
7531c613 3934 /* PREFIX_VEX_0F385E_X86_64 */
922d8de8 3935 {
7531c613
JB
3936 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_0) },
3937 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_1) },
3938 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_2) },
3939 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_3) },
922d8de8
DR
3940 },
3941
7531c613 3942 /* PREFIX_VEX_0F38F5 */
48521003 3943 {
7531c613
JB
3944 { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_0) },
3945 { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_1) },
48521003 3946 { Bad_Opcode },
7531c613 3947 { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_3) },
48521003
IT
3948 },
3949
7531c613 3950 /* PREFIX_VEX_0F38F6 */
48521003
IT
3951 {
3952 { Bad_Opcode },
3953 { Bad_Opcode },
7531c613
JB
3954 { Bad_Opcode },
3955 { VEX_LEN_TABLE (VEX_LEN_0F38F6_P_3) },
48521003
IT
3956 },
3957
7531c613 3958 /* PREFIX_VEX_0F38F7 */
a5ff0eb2 3959 {
7531c613
JB
3960 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_0) },
3961 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_1) },
3962 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_2) },
3963 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_3) },
a5ff0eb2 3964 },
6c30d220
L
3965
3966 /* PREFIX_VEX_0F3AF0 */
3967 {
3968 { Bad_Opcode },
3969 { Bad_Opcode },
3970 { Bad_Opcode },
3971 { VEX_LEN_TABLE (VEX_LEN_0F3AF0_P_3) },
3972 },
43234a1e 3973
ad692897 3974#include "i386-dis-evex-prefix.h"
c0f3af97
L
3975};
3976
3977static const struct dis386 x86_64_table[][2] = {
3978 /* X86_64_06 */
3979 {
bf890a93 3980 { "pushP", { es }, 0 },
c0f3af97
L
3981 },
3982
3983 /* X86_64_07 */
3984 {
bf890a93 3985 { "popP", { es }, 0 },
c0f3af97
L
3986 },
3987
1673df32 3988 /* X86_64_0E */
c0f3af97 3989 {
bf890a93 3990 { "pushP", { cs }, 0 },
c0f3af97
L
3991 },
3992
3993 /* X86_64_16 */
3994 {
bf890a93 3995 { "pushP", { ss }, 0 },
c0f3af97
L
3996 },
3997
3998 /* X86_64_17 */
3999 {
bf890a93 4000 { "popP", { ss }, 0 },
c0f3af97
L
4001 },
4002
4003 /* X86_64_1E */
4004 {
bf890a93 4005 { "pushP", { ds }, 0 },
c0f3af97
L
4006 },
4007
4008 /* X86_64_1F */
4009 {
bf890a93 4010 { "popP", { ds }, 0 },
c0f3af97
L
4011 },
4012
4013 /* X86_64_27 */
4014 {
bf890a93 4015 { "daa", { XX }, 0 },
c0f3af97
L
4016 },
4017
4018 /* X86_64_2F */
4019 {
bf890a93 4020 { "das", { XX }, 0 },
c0f3af97
L
4021 },
4022
4023 /* X86_64_37 */
4024 {
bf890a93 4025 { "aaa", { XX }, 0 },
c0f3af97
L
4026 },
4027
4028 /* X86_64_3F */
4029 {
bf890a93 4030 { "aas", { XX }, 0 },
c0f3af97
L
4031 },
4032
4033 /* X86_64_60 */
4034 {
bf890a93 4035 { "pushaP", { XX }, 0 },
c0f3af97
L
4036 },
4037
4038 /* X86_64_61 */
4039 {
bf890a93 4040 { "popaP", { XX }, 0 },
c0f3af97
L
4041 },
4042
4043 /* X86_64_62 */
4044 {
4045 { MOD_TABLE (MOD_62_32BIT) },
43234a1e 4046 { EVEX_TABLE (EVEX_0F) },
c0f3af97
L
4047 },
4048
4049 /* X86_64_63 */
4050 {
bf890a93 4051 { "arpl", { Ew, Gw }, 0 },
bc31405e 4052 { "movs", { { OP_G, movsxd_mode }, { MOVSXD_Fixup, movsxd_mode } }, 0 },
c0f3af97
L
4053 },
4054
4055 /* X86_64_6D */
4056 {
bf890a93
IT
4057 { "ins{R|}", { Yzr, indirDX }, 0 },
4058 { "ins{G|}", { Yzr, indirDX }, 0 },
c0f3af97
L
4059 },
4060
4061 /* X86_64_6F */
4062 {
bf890a93
IT
4063 { "outs{R|}", { indirDXr, Xz }, 0 },
4064 { "outs{G|}", { indirDXr, Xz }, 0 },
c0f3af97
L
4065 },
4066
d039fef3 4067 /* X86_64_82 */
8b89fe14 4068 {
de194d85 4069 /* Opcode 0x82 is an alias of opcode 0x80 in 32-bit mode. */
d039fef3 4070 { REG_TABLE (REG_80) },
8b89fe14
L
4071 },
4072
c0f3af97
L
4073 /* X86_64_9A */
4074 {
8f570d62 4075 { "{l|}call{T|}", { Ap }, 0 },
c0f3af97
L
4076 },
4077
aeab2b26
JB
4078 /* X86_64_C2 */
4079 {
4080 { "retP", { Iw, BND }, 0 },
4081 { "ret@", { Iw, BND }, 0 },
4082 },
4083
4084 /* X86_64_C3 */
4085 {
4086 { "retP", { BND }, 0 },
4087 { "ret@", { BND }, 0 },
4088 },
4089
c0f3af97
L
4090 /* X86_64_C4 */
4091 {
4092 { MOD_TABLE (MOD_C4_32BIT) },
4093 { VEX_C4_TABLE (VEX_0F) },
4094 },
4095
4096 /* X86_64_C5 */
4097 {
4098 { MOD_TABLE (MOD_C5_32BIT) },
4099 { VEX_C5_TABLE (VEX_0F) },
4100 },
4101
4102 /* X86_64_CE */
4103 {
bf890a93 4104 { "into", { XX }, 0 },
c0f3af97
L
4105 },
4106
4107 /* X86_64_D4 */
4108 {
bf890a93 4109 { "aam", { Ib }, 0 },
c0f3af97
L
4110 },
4111
4112 /* X86_64_D5 */
4113 {
bf890a93 4114 { "aad", { Ib }, 0 },
c0f3af97
L
4115 },
4116
a72d2af2
L
4117 /* X86_64_E8 */
4118 {
4119 { "callP", { Jv, BND }, 0 },
5db04b09 4120 { "call@", { Jv, BND }, 0 }
a72d2af2
L
4121 },
4122
4123 /* X86_64_E9 */
4124 {
4125 { "jmpP", { Jv, BND }, 0 },
5db04b09 4126 { "jmp@", { Jv, BND }, 0 }
a72d2af2
L
4127 },
4128
c0f3af97
L
4129 /* X86_64_EA */
4130 {
8f570d62 4131 { "{l|}jmp{T|}", { Ap }, 0 },
c0f3af97
L
4132 },
4133
4134 /* X86_64_0F01_REG_0 */
4135 {
d1c36125 4136 { "sgdt{Q|Q}", { M }, 0 },
bf890a93 4137 { "sgdt", { M }, 0 },
c0f3af97
L
4138 },
4139
4140 /* X86_64_0F01_REG_1 */
4141 {
d1c36125 4142 { "sidt{Q|Q}", { M }, 0 },
bf890a93 4143 { "sidt", { M }, 0 },
c0f3af97
L
4144 },
4145
4146 /* X86_64_0F01_REG_2 */
4147 {
bf890a93
IT
4148 { "lgdt{Q|Q}", { M }, 0 },
4149 { "lgdt", { M }, 0 },
c0f3af97
L
4150 },
4151
4152 /* X86_64_0F01_REG_3 */
4153 {
bf890a93
IT
4154 { "lidt{Q|Q}", { M }, 0 },
4155 { "lidt", { M }, 0 },
c0f3af97 4156 },
260cd341 4157
78467458
JB
4158 {
4159 /* X86_64_0F24 */
4160 { "movZ", { Em, Td }, 0 },
4161 },
4162
4163 {
4164 /* X86_64_0F26 */
4165 { "movZ", { Td, Em }, 0 },
4166 },
4167
260cd341
LC
4168 /* X86_64_VEX_0F3849 */
4169 {
4170 { Bad_Opcode },
4171 { PREFIX_TABLE (PREFIX_VEX_0F3849_X86_64) },
4172 },
4173
4174 /* X86_64_VEX_0F384B */
4175 {
4176 { Bad_Opcode },
4177 { PREFIX_TABLE (PREFIX_VEX_0F384B_X86_64) },
4178 },
4179
4180 /* X86_64_VEX_0F385C */
4181 {
4182 { Bad_Opcode },
4183 { PREFIX_TABLE (PREFIX_VEX_0F385C_X86_64) },
4184 },
4185
4186 /* X86_64_VEX_0F385E */
4187 {
4188 { Bad_Opcode },
4189 { PREFIX_TABLE (PREFIX_VEX_0F385E_X86_64) },
4190 },
c0f3af97
L
4191};
4192
4193static const struct dis386 three_byte_table[][256] = {
c1e679ec
DR
4194
4195 /* THREE_BYTE_0F38 */
c0f3af97
L
4196 {
4197 /* 00 */
507bd325
L
4198 { "pshufb", { MX, EM }, PREFIX_OPCODE },
4199 { "phaddw", { MX, EM }, PREFIX_OPCODE },
4200 { "phaddd", { MX, EM }, PREFIX_OPCODE },
4201 { "phaddsw", { MX, EM }, PREFIX_OPCODE },
4202 { "pmaddubsw", { MX, EM }, PREFIX_OPCODE },
4203 { "phsubw", { MX, EM }, PREFIX_OPCODE },
4204 { "phsubd", { MX, EM }, PREFIX_OPCODE },
4205 { "phsubsw", { MX, EM }, PREFIX_OPCODE },
c0f3af97 4206 /* 08 */
507bd325
L
4207 { "psignb", { MX, EM }, PREFIX_OPCODE },
4208 { "psignw", { MX, EM }, PREFIX_OPCODE },
4209 { "psignd", { MX, EM }, PREFIX_OPCODE },
4210 { "pmulhrsw", { MX, EM }, PREFIX_OPCODE },
592d1631
L
4211 { Bad_Opcode },
4212 { Bad_Opcode },
4213 { Bad_Opcode },
4214 { Bad_Opcode },
f88c9eb0 4215 /* 10 */
7531c613 4216 { "pblendvb", { XM, EXx, XMM0 }, PREFIX_DATA },
592d1631
L
4217 { Bad_Opcode },
4218 { Bad_Opcode },
4219 { Bad_Opcode },
7531c613
JB
4220 { "blendvps", { XM, EXx, XMM0 }, PREFIX_DATA },
4221 { "blendvpd", { XM, EXx, XMM0 }, PREFIX_DATA },
592d1631 4222 { Bad_Opcode },
7531c613 4223 { "ptest", { XM, EXx }, PREFIX_DATA },
f88c9eb0 4224 /* 18 */
592d1631
L
4225 { Bad_Opcode },
4226 { Bad_Opcode },
4227 { Bad_Opcode },
4228 { Bad_Opcode },
507bd325
L
4229 { "pabsb", { MX, EM }, PREFIX_OPCODE },
4230 { "pabsw", { MX, EM }, PREFIX_OPCODE },
4231 { "pabsd", { MX, EM }, PREFIX_OPCODE },
592d1631 4232 { Bad_Opcode },
f88c9eb0 4233 /* 20 */
7531c613
JB
4234 { "pmovsxbw", { XM, EXq }, PREFIX_DATA },
4235 { "pmovsxbd", { XM, EXd }, PREFIX_DATA },
4236 { "pmovsxbq", { XM, EXw }, PREFIX_DATA },
4237 { "pmovsxwd", { XM, EXq }, PREFIX_DATA },
4238 { "pmovsxwq", { XM, EXd }, PREFIX_DATA },
4239 { "pmovsxdq", { XM, EXq }, PREFIX_DATA },
592d1631
L
4240 { Bad_Opcode },
4241 { Bad_Opcode },
f88c9eb0 4242 /* 28 */
7531c613
JB
4243 { "pmuldq", { XM, EXx }, PREFIX_DATA },
4244 { "pcmpeqq", { XM, EXx }, PREFIX_DATA },
4245 { MOD_TABLE (MOD_0F382A) },
4246 { "packusdw", { XM, EXx }, PREFIX_DATA },
592d1631
L
4247 { Bad_Opcode },
4248 { Bad_Opcode },
4249 { Bad_Opcode },
4250 { Bad_Opcode },
f88c9eb0 4251 /* 30 */
7531c613
JB
4252 { "pmovzxbw", { XM, EXq }, PREFIX_DATA },
4253 { "pmovzxbd", { XM, EXd }, PREFIX_DATA },
4254 { "pmovzxbq", { XM, EXw }, PREFIX_DATA },
4255 { "pmovzxwd", { XM, EXq }, PREFIX_DATA },
4256 { "pmovzxwq", { XM, EXd }, PREFIX_DATA },
4257 { "pmovzxdq", { XM, EXq }, PREFIX_DATA },
4258 { Bad_Opcode },
4259 { "pcmpgtq", { XM, EXx }, PREFIX_DATA },
f88c9eb0 4260 /* 38 */
7531c613
JB
4261 { "pminsb", { XM, EXx }, PREFIX_DATA },
4262 { "pminsd", { XM, EXx }, PREFIX_DATA },
4263 { "pminuw", { XM, EXx }, PREFIX_DATA },
4264 { "pminud", { XM, EXx }, PREFIX_DATA },
4265 { "pmaxsb", { XM, EXx }, PREFIX_DATA },
4266 { "pmaxsd", { XM, EXx }, PREFIX_DATA },
4267 { "pmaxuw", { XM, EXx }, PREFIX_DATA },
4268 { "pmaxud", { XM, EXx }, PREFIX_DATA },
f88c9eb0 4269 /* 40 */
7531c613
JB
4270 { "pmulld", { XM, EXx }, PREFIX_DATA },
4271 { "phminposuw", { XM, EXx }, PREFIX_DATA },
592d1631
L
4272 { Bad_Opcode },
4273 { Bad_Opcode },
4274 { Bad_Opcode },
4275 { Bad_Opcode },
4276 { Bad_Opcode },
4277 { Bad_Opcode },
f88c9eb0 4278 /* 48 */
592d1631
L
4279 { Bad_Opcode },
4280 { Bad_Opcode },
4281 { Bad_Opcode },
4282 { Bad_Opcode },
4283 { Bad_Opcode },
4284 { Bad_Opcode },
4285 { Bad_Opcode },
4286 { Bad_Opcode },
f88c9eb0 4287 /* 50 */
592d1631
L
4288 { Bad_Opcode },
4289 { Bad_Opcode },
4290 { Bad_Opcode },
4291 { Bad_Opcode },
4292 { Bad_Opcode },
4293 { Bad_Opcode },
4294 { Bad_Opcode },
4295 { Bad_Opcode },
f88c9eb0 4296 /* 58 */
592d1631
L
4297 { Bad_Opcode },
4298 { Bad_Opcode },
4299 { Bad_Opcode },
4300 { Bad_Opcode },
4301 { Bad_Opcode },
4302 { Bad_Opcode },
4303 { Bad_Opcode },
4304 { Bad_Opcode },
f88c9eb0 4305 /* 60 */
592d1631
L
4306 { Bad_Opcode },
4307 { Bad_Opcode },
4308 { Bad_Opcode },
4309 { Bad_Opcode },
4310 { Bad_Opcode },
4311 { Bad_Opcode },
4312 { Bad_Opcode },
4313 { Bad_Opcode },
f88c9eb0 4314 /* 68 */
592d1631
L
4315 { Bad_Opcode },
4316 { Bad_Opcode },
4317 { Bad_Opcode },
4318 { Bad_Opcode },
4319 { Bad_Opcode },
4320 { Bad_Opcode },
4321 { Bad_Opcode },
4322 { Bad_Opcode },
f88c9eb0 4323 /* 70 */
592d1631
L
4324 { Bad_Opcode },
4325 { Bad_Opcode },
4326 { Bad_Opcode },
4327 { Bad_Opcode },
4328 { Bad_Opcode },
4329 { Bad_Opcode },
4330 { Bad_Opcode },
4331 { Bad_Opcode },
f88c9eb0 4332 /* 78 */
592d1631
L
4333 { Bad_Opcode },
4334 { Bad_Opcode },
4335 { Bad_Opcode },
4336 { Bad_Opcode },
4337 { Bad_Opcode },
4338 { Bad_Opcode },
4339 { Bad_Opcode },
4340 { Bad_Opcode },
f88c9eb0 4341 /* 80 */
7531c613
JB
4342 { "invept", { Gm, Mo }, PREFIX_DATA },
4343 { "invvpid", { Gm, Mo }, PREFIX_DATA },
4344 { "invpcid", { Gm, M }, PREFIX_DATA },
592d1631
L
4345 { Bad_Opcode },
4346 { Bad_Opcode },
4347 { Bad_Opcode },
4348 { Bad_Opcode },
4349 { Bad_Opcode },
f88c9eb0 4350 /* 88 */
592d1631
L
4351 { Bad_Opcode },
4352 { Bad_Opcode },
4353 { Bad_Opcode },
4354 { Bad_Opcode },
4355 { Bad_Opcode },
4356 { Bad_Opcode },
4357 { Bad_Opcode },
4358 { Bad_Opcode },
f88c9eb0 4359 /* 90 */
592d1631
L
4360 { Bad_Opcode },
4361 { Bad_Opcode },
4362 { Bad_Opcode },
4363 { Bad_Opcode },
4364 { Bad_Opcode },
4365 { Bad_Opcode },
4366 { Bad_Opcode },
4367 { Bad_Opcode },
f88c9eb0 4368 /* 98 */
592d1631
L
4369 { Bad_Opcode },
4370 { Bad_Opcode },
4371 { Bad_Opcode },
4372 { Bad_Opcode },
4373 { Bad_Opcode },
4374 { Bad_Opcode },
4375 { Bad_Opcode },
4376 { Bad_Opcode },
f88c9eb0 4377 /* a0 */
592d1631
L
4378 { Bad_Opcode },
4379 { Bad_Opcode },
4380 { Bad_Opcode },
4381 { Bad_Opcode },
4382 { Bad_Opcode },
4383 { Bad_Opcode },
4384 { Bad_Opcode },
4385 { Bad_Opcode },
f88c9eb0 4386 /* a8 */
592d1631
L
4387 { Bad_Opcode },
4388 { Bad_Opcode },
4389 { Bad_Opcode },
4390 { Bad_Opcode },
4391 { Bad_Opcode },
4392 { Bad_Opcode },
4393 { Bad_Opcode },
4394 { Bad_Opcode },
f88c9eb0 4395 /* b0 */
592d1631
L
4396 { Bad_Opcode },
4397 { Bad_Opcode },
4398 { Bad_Opcode },
4399 { Bad_Opcode },
4400 { Bad_Opcode },
4401 { Bad_Opcode },
4402 { Bad_Opcode },
4403 { Bad_Opcode },
f88c9eb0 4404 /* b8 */
592d1631
L
4405 { Bad_Opcode },
4406 { Bad_Opcode },
4407 { Bad_Opcode },
4408 { Bad_Opcode },
4409 { Bad_Opcode },
4410 { Bad_Opcode },
4411 { Bad_Opcode },
4412 { Bad_Opcode },
f88c9eb0 4413 /* c0 */
592d1631
L
4414 { Bad_Opcode },
4415 { Bad_Opcode },
4416 { Bad_Opcode },
4417 { Bad_Opcode },
4418 { Bad_Opcode },
4419 { Bad_Opcode },
4420 { Bad_Opcode },
4421 { Bad_Opcode },
f88c9eb0 4422 /* c8 */
035e7389
JB
4423 { "sha1nexte", { XM, EXxmm }, PREFIX_OPCODE },
4424 { "sha1msg1", { XM, EXxmm }, PREFIX_OPCODE },
4425 { "sha1msg2", { XM, EXxmm }, PREFIX_OPCODE },
4426 { "sha256rnds2", { XM, EXxmm, XMM0 }, PREFIX_OPCODE },
4427 { "sha256msg1", { XM, EXxmm }, PREFIX_OPCODE },
4428 { "sha256msg2", { XM, EXxmm }, PREFIX_OPCODE },
592d1631 4429 { Bad_Opcode },
7531c613 4430 { "gf2p8mulb", { XM, EXxmm }, PREFIX_DATA },
f88c9eb0 4431 /* d0 */
592d1631
L
4432 { Bad_Opcode },
4433 { Bad_Opcode },
4434 { Bad_Opcode },
4435 { Bad_Opcode },
4436 { Bad_Opcode },
4437 { Bad_Opcode },
4438 { Bad_Opcode },
4439 { Bad_Opcode },
f88c9eb0 4440 /* d8 */
592d1631
L
4441 { Bad_Opcode },
4442 { Bad_Opcode },
4443 { Bad_Opcode },
7531c613
JB
4444 { "aesimc", { XM, EXx }, PREFIX_DATA },
4445 { "aesenc", { XM, EXx }, PREFIX_DATA },
4446 { "aesenclast", { XM, EXx }, PREFIX_DATA },
4447 { "aesdec", { XM, EXx }, PREFIX_DATA },
4448 { "aesdeclast", { XM, EXx }, PREFIX_DATA },
f88c9eb0 4449 /* e0 */
592d1631
L
4450 { Bad_Opcode },
4451 { Bad_Opcode },
4452 { Bad_Opcode },
4453 { Bad_Opcode },
4454 { Bad_Opcode },
4455 { Bad_Opcode },
4456 { Bad_Opcode },
4457 { Bad_Opcode },
f88c9eb0 4458 /* e8 */
592d1631
L
4459 { Bad_Opcode },
4460 { Bad_Opcode },
4461 { Bad_Opcode },
4462 { Bad_Opcode },
4463 { Bad_Opcode },
4464 { Bad_Opcode },
4465 { Bad_Opcode },
4466 { Bad_Opcode },
f88c9eb0
SP
4467 /* f0 */
4468 { PREFIX_TABLE (PREFIX_0F38F0) },
4469 { PREFIX_TABLE (PREFIX_0F38F1) },
592d1631
L
4470 { Bad_Opcode },
4471 { Bad_Opcode },
4472 { Bad_Opcode },
7531c613 4473 { MOD_TABLE (MOD_0F38F5) },
e2e1fcde 4474 { PREFIX_TABLE (PREFIX_0F38F6) },
592d1631 4475 { Bad_Opcode },
f88c9eb0 4476 /* f8 */
c0a30a9f 4477 { PREFIX_TABLE (PREFIX_0F38F8) },
035e7389 4478 { MOD_TABLE (MOD_0F38F9) },
592d1631
L
4479 { Bad_Opcode },
4480 { Bad_Opcode },
4481 { Bad_Opcode },
4482 { Bad_Opcode },
4483 { Bad_Opcode },
4484 { Bad_Opcode },
f88c9eb0
SP
4485 },
4486 /* THREE_BYTE_0F3A */
4487 {
4488 /* 00 */
592d1631
L
4489 { Bad_Opcode },
4490 { Bad_Opcode },
4491 { Bad_Opcode },
4492 { Bad_Opcode },
4493 { Bad_Opcode },
4494 { Bad_Opcode },
4495 { Bad_Opcode },
4496 { Bad_Opcode },
f88c9eb0 4497 /* 08 */
7531c613
JB
4498 { "roundps", { XM, EXx, Ib }, PREFIX_DATA },
4499 { "roundpd", { XM, EXx, Ib }, PREFIX_DATA },
4500 { "roundss", { XM, EXd, Ib }, PREFIX_DATA },
4501 { "roundsd", { XM, EXq, Ib }, PREFIX_DATA },
4502 { "blendps", { XM, EXx, Ib }, PREFIX_DATA },
4503 { "blendpd", { XM, EXx, Ib }, PREFIX_DATA },
4504 { "pblendw", { XM, EXx, Ib }, PREFIX_DATA },
507bd325 4505 { "palignr", { MX, EM, Ib }, PREFIX_OPCODE },
f88c9eb0 4506 /* 10 */
592d1631
L
4507 { Bad_Opcode },
4508 { Bad_Opcode },
4509 { Bad_Opcode },
4510 { Bad_Opcode },
7531c613
JB
4511 { "pextrb", { Edqb, XM, Ib }, PREFIX_DATA },
4512 { "pextrw", { Edqw, XM, Ib }, PREFIX_DATA },
4513 { "pextrK", { Edq, XM, Ib }, PREFIX_DATA },
4514 { "extractps", { Edqd, XM, Ib }, PREFIX_DATA },
f88c9eb0 4515 /* 18 */
592d1631
L
4516 { Bad_Opcode },
4517 { Bad_Opcode },
4518 { Bad_Opcode },
4519 { Bad_Opcode },
4520 { Bad_Opcode },
4521 { Bad_Opcode },
4522 { Bad_Opcode },
4523 { Bad_Opcode },
f88c9eb0 4524 /* 20 */
7531c613
JB
4525 { "pinsrb", { XM, Edqb, Ib }, PREFIX_DATA },
4526 { "insertps", { XM, EXd, Ib }, PREFIX_DATA },
4527 { "pinsrK", { XM, Edq, Ib }, PREFIX_DATA },
592d1631
L
4528 { Bad_Opcode },
4529 { Bad_Opcode },
4530 { Bad_Opcode },
4531 { Bad_Opcode },
4532 { Bad_Opcode },
f88c9eb0 4533 /* 28 */
592d1631
L
4534 { Bad_Opcode },
4535 { Bad_Opcode },
4536 { Bad_Opcode },
4537 { Bad_Opcode },
4538 { Bad_Opcode },
4539 { Bad_Opcode },
4540 { Bad_Opcode },
4541 { Bad_Opcode },
f88c9eb0 4542 /* 30 */
592d1631
L
4543 { Bad_Opcode },
4544 { Bad_Opcode },
4545 { Bad_Opcode },
4546 { Bad_Opcode },
4547 { Bad_Opcode },
4548 { Bad_Opcode },
4549 { Bad_Opcode },
4550 { Bad_Opcode },
f88c9eb0 4551 /* 38 */
592d1631
L
4552 { Bad_Opcode },
4553 { Bad_Opcode },
4554 { Bad_Opcode },
4555 { Bad_Opcode },
4556 { Bad_Opcode },
4557 { Bad_Opcode },
4558 { Bad_Opcode },
4559 { Bad_Opcode },
f88c9eb0 4560 /* 40 */
7531c613
JB
4561 { "dpps", { XM, EXx, Ib }, PREFIX_DATA },
4562 { "dppd", { XM, EXx, Ib }, PREFIX_DATA },
4563 { "mpsadbw", { XM, EXx, Ib }, PREFIX_DATA },
592d1631 4564 { Bad_Opcode },
7531c613 4565 { "pclmulqdq", { XM, EXx, PCLMUL }, PREFIX_DATA },
592d1631
L
4566 { Bad_Opcode },
4567 { Bad_Opcode },
4568 { Bad_Opcode },
f88c9eb0 4569 /* 48 */
592d1631
L
4570 { Bad_Opcode },
4571 { Bad_Opcode },
4572 { Bad_Opcode },
4573 { Bad_Opcode },
4574 { Bad_Opcode },
4575 { Bad_Opcode },
4576 { Bad_Opcode },
4577 { Bad_Opcode },
f88c9eb0 4578 /* 50 */
592d1631
L
4579 { Bad_Opcode },
4580 { Bad_Opcode },
4581 { Bad_Opcode },
4582 { Bad_Opcode },
4583 { Bad_Opcode },
4584 { Bad_Opcode },
4585 { Bad_Opcode },
4586 { Bad_Opcode },
f88c9eb0 4587 /* 58 */
592d1631
L
4588 { Bad_Opcode },
4589 { Bad_Opcode },
4590 { Bad_Opcode },
4591 { Bad_Opcode },
4592 { Bad_Opcode },
4593 { Bad_Opcode },
4594 { Bad_Opcode },
4595 { Bad_Opcode },
f88c9eb0 4596 /* 60 */
7531c613
JB
4597 { "pcmpestrm!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
4598 { "pcmpestri!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
4599 { "pcmpistrm", { XM, EXx, Ib }, PREFIX_DATA },
4600 { "pcmpistri", { XM, EXx, Ib }, PREFIX_DATA },
592d1631
L
4601 { Bad_Opcode },
4602 { Bad_Opcode },
4603 { Bad_Opcode },
4604 { Bad_Opcode },
f88c9eb0 4605 /* 68 */
592d1631
L
4606 { Bad_Opcode },
4607 { Bad_Opcode },
4608 { Bad_Opcode },
4609 { Bad_Opcode },
4610 { Bad_Opcode },
4611 { Bad_Opcode },
4612 { Bad_Opcode },
4613 { Bad_Opcode },
f88c9eb0 4614 /* 70 */
592d1631
L
4615 { Bad_Opcode },
4616 { Bad_Opcode },
4617 { Bad_Opcode },
4618 { Bad_Opcode },
4619 { Bad_Opcode },
4620 { Bad_Opcode },
4621 { Bad_Opcode },
4622 { Bad_Opcode },
f88c9eb0 4623 /* 78 */
592d1631
L
4624 { Bad_Opcode },
4625 { Bad_Opcode },
4626 { Bad_Opcode },
4627 { Bad_Opcode },
4628 { Bad_Opcode },
4629 { Bad_Opcode },
4630 { Bad_Opcode },
4631 { Bad_Opcode },
f88c9eb0 4632 /* 80 */
592d1631
L
4633 { Bad_Opcode },
4634 { Bad_Opcode },
4635 { Bad_Opcode },
4636 { Bad_Opcode },
4637 { Bad_Opcode },
4638 { Bad_Opcode },
4639 { Bad_Opcode },
4640 { Bad_Opcode },
f88c9eb0 4641 /* 88 */
592d1631
L
4642 { Bad_Opcode },
4643 { Bad_Opcode },
4644 { Bad_Opcode },
4645 { Bad_Opcode },
4646 { Bad_Opcode },
4647 { Bad_Opcode },
4648 { Bad_Opcode },
4649 { Bad_Opcode },
f88c9eb0 4650 /* 90 */
592d1631
L
4651 { Bad_Opcode },
4652 { Bad_Opcode },
4653 { Bad_Opcode },
4654 { Bad_Opcode },
4655 { Bad_Opcode },
4656 { Bad_Opcode },
4657 { Bad_Opcode },
4658 { Bad_Opcode },
f88c9eb0 4659 /* 98 */
592d1631
L
4660 { Bad_Opcode },
4661 { Bad_Opcode },
4662 { Bad_Opcode },
4663 { Bad_Opcode },
4664 { Bad_Opcode },
4665 { Bad_Opcode },
4666 { Bad_Opcode },
4667 { Bad_Opcode },
f88c9eb0 4668 /* a0 */
592d1631
L
4669 { Bad_Opcode },
4670 { Bad_Opcode },
4671 { Bad_Opcode },
4672 { Bad_Opcode },
4673 { Bad_Opcode },
4674 { Bad_Opcode },
4675 { Bad_Opcode },
4676 { Bad_Opcode },
f88c9eb0 4677 /* a8 */
592d1631
L
4678 { Bad_Opcode },
4679 { Bad_Opcode },
4680 { Bad_Opcode },
4681 { Bad_Opcode },
4682 { Bad_Opcode },
4683 { Bad_Opcode },
4684 { Bad_Opcode },
4685 { Bad_Opcode },
f88c9eb0 4686 /* b0 */
592d1631
L
4687 { Bad_Opcode },
4688 { Bad_Opcode },
4689 { Bad_Opcode },
4690 { Bad_Opcode },
4691 { Bad_Opcode },
4692 { Bad_Opcode },
4693 { Bad_Opcode },
4694 { Bad_Opcode },
f88c9eb0 4695 /* b8 */
592d1631
L
4696 { Bad_Opcode },
4697 { Bad_Opcode },
4698 { Bad_Opcode },
4699 { Bad_Opcode },
4700 { Bad_Opcode },
4701 { Bad_Opcode },
4702 { Bad_Opcode },
4703 { Bad_Opcode },
f88c9eb0 4704 /* c0 */
592d1631
L
4705 { Bad_Opcode },
4706 { Bad_Opcode },
4707 { Bad_Opcode },
4708 { Bad_Opcode },
4709 { Bad_Opcode },
4710 { Bad_Opcode },
4711 { Bad_Opcode },
4712 { Bad_Opcode },
f88c9eb0 4713 /* c8 */
592d1631
L
4714 { Bad_Opcode },
4715 { Bad_Opcode },
4716 { Bad_Opcode },
4717 { Bad_Opcode },
035e7389 4718 { "sha1rnds4", { XM, EXxmm, Ib }, PREFIX_OPCODE },
592d1631 4719 { Bad_Opcode },
7531c613
JB
4720 { "gf2p8affineqb", { XM, EXxmm, Ib }, PREFIX_DATA },
4721 { "gf2p8affineinvqb", { XM, EXxmm, Ib }, PREFIX_DATA },
f88c9eb0 4722 /* d0 */
592d1631
L
4723 { Bad_Opcode },
4724 { Bad_Opcode },
4725 { Bad_Opcode },
4726 { Bad_Opcode },
4727 { Bad_Opcode },
4728 { Bad_Opcode },
4729 { Bad_Opcode },
4730 { Bad_Opcode },
f88c9eb0 4731 /* d8 */
592d1631
L
4732 { Bad_Opcode },
4733 { Bad_Opcode },
4734 { Bad_Opcode },
4735 { Bad_Opcode },
4736 { Bad_Opcode },
4737 { Bad_Opcode },
4738 { Bad_Opcode },
7531c613 4739 { "aeskeygenassist", { XM, EXx, Ib }, PREFIX_DATA },
f88c9eb0 4740 /* e0 */
592d1631
L
4741 { Bad_Opcode },
4742 { Bad_Opcode },
4743 { Bad_Opcode },
4744 { Bad_Opcode },
4745 { Bad_Opcode },
592d1631
L
4746 { Bad_Opcode },
4747 { Bad_Opcode },
4748 { Bad_Opcode },
85f10a01 4749 /* e8 */
592d1631
L
4750 { Bad_Opcode },
4751 { Bad_Opcode },
4752 { Bad_Opcode },
4753 { Bad_Opcode },
4754 { Bad_Opcode },
4755 { Bad_Opcode },
4756 { Bad_Opcode },
4757 { Bad_Opcode },
85f10a01 4758 /* f0 */
592d1631
L
4759 { Bad_Opcode },
4760 { Bad_Opcode },
4761 { Bad_Opcode },
4762 { Bad_Opcode },
4763 { Bad_Opcode },
4764 { Bad_Opcode },
4765 { Bad_Opcode },
4766 { Bad_Opcode },
85f10a01 4767 /* f8 */
592d1631
L
4768 { Bad_Opcode },
4769 { Bad_Opcode },
4770 { Bad_Opcode },
4771 { Bad_Opcode },
4772 { Bad_Opcode },
4773 { Bad_Opcode },
4774 { Bad_Opcode },
4775 { Bad_Opcode },
85f10a01 4776 },
f88c9eb0
SP
4777};
4778
4779static const struct dis386 xop_table[][256] = {
5dd85c99 4780 /* XOP_08 */
85f10a01
MM
4781 {
4782 /* 00 */
592d1631
L
4783 { Bad_Opcode },
4784 { Bad_Opcode },
4785 { Bad_Opcode },
4786 { Bad_Opcode },
4787 { Bad_Opcode },
4788 { Bad_Opcode },
4789 { Bad_Opcode },
4790 { Bad_Opcode },
85f10a01 4791 /* 08 */
592d1631
L
4792 { Bad_Opcode },
4793 { Bad_Opcode },
4794 { Bad_Opcode },
4795 { Bad_Opcode },
4796 { Bad_Opcode },
4797 { Bad_Opcode },
4798 { Bad_Opcode },
4799 { Bad_Opcode },
85f10a01 4800 /* 10 */
3929df09 4801 { Bad_Opcode },
592d1631
L
4802 { Bad_Opcode },
4803 { Bad_Opcode },
4804 { Bad_Opcode },
4805 { Bad_Opcode },
4806 { Bad_Opcode },
4807 { Bad_Opcode },
4808 { Bad_Opcode },
85f10a01 4809 /* 18 */
592d1631
L
4810 { Bad_Opcode },
4811 { Bad_Opcode },
4812 { Bad_Opcode },
4813 { Bad_Opcode },
4814 { Bad_Opcode },
4815 { Bad_Opcode },
4816 { Bad_Opcode },
4817 { Bad_Opcode },
85f10a01 4818 /* 20 */
592d1631
L
4819 { Bad_Opcode },
4820 { Bad_Opcode },
4821 { Bad_Opcode },
4822 { Bad_Opcode },
4823 { Bad_Opcode },
4824 { Bad_Opcode },
4825 { Bad_Opcode },
4826 { Bad_Opcode },
85f10a01 4827 /* 28 */
592d1631
L
4828 { Bad_Opcode },
4829 { Bad_Opcode },
4830 { Bad_Opcode },
4831 { Bad_Opcode },
4832 { Bad_Opcode },
4833 { Bad_Opcode },
4834 { Bad_Opcode },
4835 { Bad_Opcode },
c0f3af97 4836 /* 30 */
592d1631
L
4837 { Bad_Opcode },
4838 { Bad_Opcode },
4839 { Bad_Opcode },
4840 { Bad_Opcode },
4841 { Bad_Opcode },
4842 { Bad_Opcode },
4843 { Bad_Opcode },
4844 { Bad_Opcode },
c0f3af97 4845 /* 38 */
592d1631
L
4846 { Bad_Opcode },
4847 { Bad_Opcode },
4848 { Bad_Opcode },
4849 { Bad_Opcode },
4850 { Bad_Opcode },
4851 { Bad_Opcode },
4852 { Bad_Opcode },
4853 { Bad_Opcode },
c0f3af97 4854 /* 40 */
592d1631
L
4855 { Bad_Opcode },
4856 { Bad_Opcode },
4857 { Bad_Opcode },
4858 { Bad_Opcode },
4859 { Bad_Opcode },
4860 { Bad_Opcode },
4861 { Bad_Opcode },
4862 { Bad_Opcode },
85f10a01 4863 /* 48 */
592d1631
L
4864 { Bad_Opcode },
4865 { Bad_Opcode },
4866 { Bad_Opcode },
4867 { Bad_Opcode },
4868 { Bad_Opcode },
4869 { Bad_Opcode },
4870 { Bad_Opcode },
4871 { Bad_Opcode },
c0f3af97 4872 /* 50 */
592d1631
L
4873 { Bad_Opcode },
4874 { Bad_Opcode },
4875 { Bad_Opcode },
4876 { Bad_Opcode },
4877 { Bad_Opcode },
4878 { Bad_Opcode },
4879 { Bad_Opcode },
4880 { Bad_Opcode },
85f10a01 4881 /* 58 */
592d1631
L
4882 { Bad_Opcode },
4883 { Bad_Opcode },
4884 { Bad_Opcode },
4885 { Bad_Opcode },
4886 { Bad_Opcode },
4887 { Bad_Opcode },
4888 { Bad_Opcode },
4889 { Bad_Opcode },
c1e679ec 4890 /* 60 */
592d1631
L
4891 { Bad_Opcode },
4892 { Bad_Opcode },
4893 { Bad_Opcode },
4894 { Bad_Opcode },
4895 { Bad_Opcode },
4896 { Bad_Opcode },
4897 { Bad_Opcode },
4898 { Bad_Opcode },
c0f3af97 4899 /* 68 */
592d1631
L
4900 { Bad_Opcode },
4901 { Bad_Opcode },
4902 { Bad_Opcode },
4903 { Bad_Opcode },
4904 { Bad_Opcode },
4905 { Bad_Opcode },
4906 { Bad_Opcode },
4907 { Bad_Opcode },
85f10a01 4908 /* 70 */
592d1631
L
4909 { Bad_Opcode },
4910 { Bad_Opcode },
4911 { Bad_Opcode },
4912 { Bad_Opcode },
4913 { Bad_Opcode },
4914 { Bad_Opcode },
4915 { Bad_Opcode },
4916 { Bad_Opcode },
85f10a01 4917 /* 78 */
592d1631
L
4918 { Bad_Opcode },
4919 { Bad_Opcode },
4920 { Bad_Opcode },
4921 { Bad_Opcode },
4922 { Bad_Opcode },
4923 { Bad_Opcode },
4924 { Bad_Opcode },
4925 { Bad_Opcode },
85f10a01 4926 /* 80 */
592d1631
L
4927 { Bad_Opcode },
4928 { Bad_Opcode },
4929 { Bad_Opcode },
4930 { Bad_Opcode },
4931 { Bad_Opcode },
467bbef0
JB
4932 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_85) },
4933 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_86) },
4934 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_87) },
5dd85c99 4935 /* 88 */
592d1631
L
4936 { Bad_Opcode },
4937 { Bad_Opcode },
4938 { Bad_Opcode },
4939 { Bad_Opcode },
4940 { Bad_Opcode },
4941 { Bad_Opcode },
467bbef0
JB
4942 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_8E) },
4943 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_8F) },
5dd85c99 4944 /* 90 */
592d1631
L
4945 { Bad_Opcode },
4946 { Bad_Opcode },
4947 { Bad_Opcode },
4948 { Bad_Opcode },
4949 { Bad_Opcode },
467bbef0
JB
4950 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_95) },
4951 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_96) },
4952 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_97) },
5dd85c99 4953 /* 98 */
592d1631
L
4954 { Bad_Opcode },
4955 { Bad_Opcode },
4956 { Bad_Opcode },
4957 { Bad_Opcode },
4958 { Bad_Opcode },
4959 { Bad_Opcode },
467bbef0
JB
4960 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_9E) },
4961 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_9F) },
5dd85c99 4962 /* a0 */
592d1631
L
4963 { Bad_Opcode },
4964 { Bad_Opcode },
b13b1bc0 4965 { "vpcmov", { XM, Vex, EXx, XMVexI4 }, 0 },
467bbef0 4966 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_A3) },
592d1631
L
4967 { Bad_Opcode },
4968 { Bad_Opcode },
467bbef0 4969 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_A6) },
592d1631 4970 { Bad_Opcode },
5dd85c99 4971 /* a8 */
592d1631
L
4972 { Bad_Opcode },
4973 { Bad_Opcode },
4974 { Bad_Opcode },
4975 { Bad_Opcode },
4976 { Bad_Opcode },
4977 { Bad_Opcode },
4978 { Bad_Opcode },
4979 { Bad_Opcode },
5dd85c99 4980 /* b0 */
592d1631
L
4981 { Bad_Opcode },
4982 { Bad_Opcode },
4983 { Bad_Opcode },
4984 { Bad_Opcode },
4985 { Bad_Opcode },
4986 { Bad_Opcode },
467bbef0 4987 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_B6) },
592d1631 4988 { Bad_Opcode },
5dd85c99 4989 /* b8 */
592d1631
L
4990 { Bad_Opcode },
4991 { Bad_Opcode },
4992 { Bad_Opcode },
4993 { Bad_Opcode },
4994 { Bad_Opcode },
4995 { Bad_Opcode },
4996 { Bad_Opcode },
4997 { Bad_Opcode },
5dd85c99 4998 /* c0 */
467bbef0
JB
4999 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C0) },
5000 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C1) },
5001 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C2) },
5002 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C3) },
592d1631
L
5003 { Bad_Opcode },
5004 { Bad_Opcode },
5005 { Bad_Opcode },
5006 { Bad_Opcode },
5dd85c99 5007 /* c8 */
592d1631
L
5008 { Bad_Opcode },
5009 { Bad_Opcode },
5010 { Bad_Opcode },
5011 { Bad_Opcode },
ff688e1f
L
5012 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CC) },
5013 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CD) },
5014 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CE) },
5015 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CF) },
5dd85c99 5016 /* d0 */
592d1631
L
5017 { Bad_Opcode },
5018 { Bad_Opcode },
5019 { Bad_Opcode },
5020 { Bad_Opcode },
5021 { Bad_Opcode },
5022 { Bad_Opcode },
5023 { Bad_Opcode },
5024 { Bad_Opcode },
5dd85c99 5025 /* d8 */
592d1631
L
5026 { Bad_Opcode },
5027 { Bad_Opcode },
5028 { Bad_Opcode },
5029 { Bad_Opcode },
5030 { Bad_Opcode },
5031 { Bad_Opcode },
5032 { Bad_Opcode },
5033 { Bad_Opcode },
5dd85c99 5034 /* e0 */
592d1631
L
5035 { Bad_Opcode },
5036 { Bad_Opcode },
5037 { Bad_Opcode },
5038 { Bad_Opcode },
5039 { Bad_Opcode },
5040 { Bad_Opcode },
5041 { Bad_Opcode },
5042 { Bad_Opcode },
5dd85c99 5043 /* e8 */
592d1631
L
5044 { Bad_Opcode },
5045 { Bad_Opcode },
5046 { Bad_Opcode },
5047 { Bad_Opcode },
ff688e1f
L
5048 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EC) },
5049 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_ED) },
5050 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EE) },
5051 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EF) },
5dd85c99 5052 /* f0 */
592d1631
L
5053 { Bad_Opcode },
5054 { Bad_Opcode },
5055 { Bad_Opcode },
5056 { Bad_Opcode },
5057 { Bad_Opcode },
5058 { Bad_Opcode },
5059 { Bad_Opcode },
5060 { Bad_Opcode },
5dd85c99 5061 /* f8 */
592d1631
L
5062 { Bad_Opcode },
5063 { Bad_Opcode },
5064 { Bad_Opcode },
5065 { Bad_Opcode },
5066 { Bad_Opcode },
5067 { Bad_Opcode },
5068 { Bad_Opcode },
5069 { Bad_Opcode },
5dd85c99
SP
5070 },
5071 /* XOP_09 */
5072 {
5073 /* 00 */
592d1631 5074 { Bad_Opcode },
467bbef0
JB
5075 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_01) },
5076 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_02) },
592d1631
L
5077 { Bad_Opcode },
5078 { Bad_Opcode },
5079 { Bad_Opcode },
5080 { Bad_Opcode },
5081 { Bad_Opcode },
5dd85c99 5082 /* 08 */
592d1631
L
5083 { Bad_Opcode },
5084 { Bad_Opcode },
5085 { Bad_Opcode },
5086 { Bad_Opcode },
5087 { Bad_Opcode },
5088 { Bad_Opcode },
5089 { Bad_Opcode },
5090 { Bad_Opcode },
5dd85c99 5091 /* 10 */
592d1631
L
5092 { Bad_Opcode },
5093 { Bad_Opcode },
467bbef0 5094 { MOD_TABLE (MOD_VEX_0FXOP_09_12) },
592d1631
L
5095 { Bad_Opcode },
5096 { Bad_Opcode },
5097 { Bad_Opcode },
5098 { Bad_Opcode },
5099 { Bad_Opcode },
5dd85c99 5100 /* 18 */
592d1631
L
5101 { Bad_Opcode },
5102 { Bad_Opcode },
5103 { Bad_Opcode },
5104 { Bad_Opcode },
5105 { Bad_Opcode },
5106 { Bad_Opcode },
5107 { Bad_Opcode },
5108 { Bad_Opcode },
5dd85c99 5109 /* 20 */
592d1631
L
5110 { Bad_Opcode },
5111 { Bad_Opcode },
5112 { Bad_Opcode },
5113 { Bad_Opcode },
5114 { Bad_Opcode },
5115 { Bad_Opcode },
5116 { Bad_Opcode },
5117 { Bad_Opcode },
5dd85c99 5118 /* 28 */
592d1631
L
5119 { Bad_Opcode },
5120 { Bad_Opcode },
5121 { Bad_Opcode },
5122 { Bad_Opcode },
5123 { Bad_Opcode },
5124 { Bad_Opcode },
5125 { Bad_Opcode },
5126 { Bad_Opcode },
5dd85c99 5127 /* 30 */
592d1631
L
5128 { Bad_Opcode },
5129 { Bad_Opcode },
5130 { Bad_Opcode },
5131 { Bad_Opcode },
5132 { Bad_Opcode },
5133 { Bad_Opcode },
5134 { Bad_Opcode },
5135 { Bad_Opcode },
5dd85c99 5136 /* 38 */
592d1631
L
5137 { Bad_Opcode },
5138 { Bad_Opcode },
5139 { Bad_Opcode },
5140 { Bad_Opcode },
5141 { Bad_Opcode },
5142 { Bad_Opcode },
5143 { Bad_Opcode },
5144 { Bad_Opcode },
5dd85c99 5145 /* 40 */
592d1631
L
5146 { Bad_Opcode },
5147 { Bad_Opcode },
5148 { Bad_Opcode },
5149 { Bad_Opcode },
5150 { Bad_Opcode },
5151 { Bad_Opcode },
5152 { Bad_Opcode },
5153 { Bad_Opcode },
5dd85c99 5154 /* 48 */
592d1631
L
5155 { Bad_Opcode },
5156 { Bad_Opcode },
5157 { Bad_Opcode },
5158 { Bad_Opcode },
5159 { Bad_Opcode },
5160 { Bad_Opcode },
5161 { Bad_Opcode },
5162 { Bad_Opcode },
5dd85c99 5163 /* 50 */
592d1631
L
5164 { Bad_Opcode },
5165 { Bad_Opcode },
5166 { Bad_Opcode },
5167 { Bad_Opcode },
5168 { Bad_Opcode },
5169 { Bad_Opcode },
5170 { Bad_Opcode },
5171 { Bad_Opcode },
5dd85c99 5172 /* 58 */
592d1631
L
5173 { Bad_Opcode },
5174 { Bad_Opcode },
5175 { Bad_Opcode },
5176 { Bad_Opcode },
5177 { Bad_Opcode },
5178 { Bad_Opcode },
5179 { Bad_Opcode },
5180 { Bad_Opcode },
5dd85c99 5181 /* 60 */
592d1631
L
5182 { Bad_Opcode },
5183 { Bad_Opcode },
5184 { Bad_Opcode },
5185 { Bad_Opcode },
5186 { Bad_Opcode },
5187 { Bad_Opcode },
5188 { Bad_Opcode },
5189 { Bad_Opcode },
5dd85c99 5190 /* 68 */
592d1631
L
5191 { Bad_Opcode },
5192 { Bad_Opcode },
5193 { Bad_Opcode },
5194 { Bad_Opcode },
5195 { Bad_Opcode },
5196 { Bad_Opcode },
5197 { Bad_Opcode },
5198 { Bad_Opcode },
5dd85c99 5199 /* 70 */
592d1631
L
5200 { Bad_Opcode },
5201 { Bad_Opcode },
5202 { Bad_Opcode },
5203 { Bad_Opcode },
5204 { Bad_Opcode },
5205 { Bad_Opcode },
5206 { Bad_Opcode },
5207 { Bad_Opcode },
5dd85c99 5208 /* 78 */
592d1631
L
5209 { Bad_Opcode },
5210 { Bad_Opcode },
5211 { Bad_Opcode },
5212 { Bad_Opcode },
5213 { Bad_Opcode },
5214 { Bad_Opcode },
5215 { Bad_Opcode },
5216 { Bad_Opcode },
5dd85c99 5217 /* 80 */
b5b098c2
JB
5218 { VEX_W_TABLE (VEX_W_0FXOP_09_80) },
5219 { VEX_W_TABLE (VEX_W_0FXOP_09_81) },
5220 { VEX_W_TABLE (VEX_W_0FXOP_09_82) },
5221 { VEX_W_TABLE (VEX_W_0FXOP_09_83) },
592d1631
L
5222 { Bad_Opcode },
5223 { Bad_Opcode },
5224 { Bad_Opcode },
5225 { Bad_Opcode },
5dd85c99 5226 /* 88 */
592d1631
L
5227 { Bad_Opcode },
5228 { Bad_Opcode },
5229 { Bad_Opcode },
5230 { Bad_Opcode },
5231 { Bad_Opcode },
5232 { Bad_Opcode },
5233 { Bad_Opcode },
5234 { Bad_Opcode },
5dd85c99 5235 /* 90 */
467bbef0
JB
5236 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_90) },
5237 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_91) },
5238 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_92) },
5239 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_93) },
5240 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_94) },
5241 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_95) },
5242 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_96) },
5243 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_97) },
5dd85c99 5244 /* 98 */
467bbef0
JB
5245 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_98) },
5246 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_99) },
5247 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_9A) },
5248 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_9B) },
592d1631
L
5249 { Bad_Opcode },
5250 { Bad_Opcode },
5251 { Bad_Opcode },
5252 { Bad_Opcode },
5dd85c99 5253 /* a0 */
592d1631
L
5254 { Bad_Opcode },
5255 { Bad_Opcode },
5256 { Bad_Opcode },
5257 { Bad_Opcode },
5258 { Bad_Opcode },
5259 { Bad_Opcode },
5260 { Bad_Opcode },
5261 { Bad_Opcode },
5dd85c99 5262 /* a8 */
592d1631
L
5263 { Bad_Opcode },
5264 { Bad_Opcode },
5265 { Bad_Opcode },
5266 { Bad_Opcode },
5267 { Bad_Opcode },
5268 { Bad_Opcode },
5269 { Bad_Opcode },
5270 { Bad_Opcode },
5dd85c99 5271 /* b0 */
592d1631
L
5272 { Bad_Opcode },
5273 { Bad_Opcode },
5274 { Bad_Opcode },
5275 { Bad_Opcode },
5276 { Bad_Opcode },
5277 { Bad_Opcode },
5278 { Bad_Opcode },
5279 { Bad_Opcode },
5dd85c99 5280 /* b8 */
592d1631
L
5281 { Bad_Opcode },
5282 { Bad_Opcode },
5283 { Bad_Opcode },
5284 { Bad_Opcode },
5285 { Bad_Opcode },
5286 { Bad_Opcode },
5287 { Bad_Opcode },
5288 { Bad_Opcode },
5dd85c99 5289 /* c0 */
592d1631 5290 { Bad_Opcode },
467bbef0
JB
5291 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C1) },
5292 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C2) },
5293 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C3) },
592d1631
L
5294 { Bad_Opcode },
5295 { Bad_Opcode },
467bbef0
JB
5296 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C6) },
5297 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C7) },
5dd85c99 5298 /* c8 */
592d1631
L
5299 { Bad_Opcode },
5300 { Bad_Opcode },
5301 { Bad_Opcode },
467bbef0 5302 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_CB) },
592d1631
L
5303 { Bad_Opcode },
5304 { Bad_Opcode },
5305 { Bad_Opcode },
5306 { Bad_Opcode },
5dd85c99 5307 /* d0 */
592d1631 5308 { Bad_Opcode },
467bbef0
JB
5309 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D1) },
5310 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D2) },
5311 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D3) },
592d1631
L
5312 { Bad_Opcode },
5313 { Bad_Opcode },
467bbef0
JB
5314 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D6) },
5315 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D7) },
5dd85c99 5316 /* d8 */
592d1631
L
5317 { Bad_Opcode },
5318 { Bad_Opcode },
5319 { Bad_Opcode },
467bbef0 5320 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_DB) },
592d1631
L
5321 { Bad_Opcode },
5322 { Bad_Opcode },
5323 { Bad_Opcode },
5324 { Bad_Opcode },
5dd85c99 5325 /* e0 */
592d1631 5326 { Bad_Opcode },
467bbef0
JB
5327 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E1) },
5328 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E2) },
5329 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E3) },
592d1631
L
5330 { Bad_Opcode },
5331 { Bad_Opcode },
5332 { Bad_Opcode },
5333 { Bad_Opcode },
4e7d34a6 5334 /* e8 */
592d1631
L
5335 { Bad_Opcode },
5336 { Bad_Opcode },
5337 { Bad_Opcode },
5338 { Bad_Opcode },
5339 { Bad_Opcode },
5340 { Bad_Opcode },
5341 { Bad_Opcode },
5342 { Bad_Opcode },
4e7d34a6 5343 /* f0 */
592d1631
L
5344 { Bad_Opcode },
5345 { Bad_Opcode },
5346 { Bad_Opcode },
5347 { Bad_Opcode },
5348 { Bad_Opcode },
5349 { Bad_Opcode },
5350 { Bad_Opcode },
5351 { Bad_Opcode },
4e7d34a6 5352 /* f8 */
592d1631
L
5353 { Bad_Opcode },
5354 { Bad_Opcode },
5355 { Bad_Opcode },
5356 { Bad_Opcode },
5357 { Bad_Opcode },
5358 { Bad_Opcode },
5359 { Bad_Opcode },
5360 { Bad_Opcode },
4e7d34a6 5361 },
f88c9eb0 5362 /* XOP_0A */
4e7d34a6
L
5363 {
5364 /* 00 */
592d1631
L
5365 { Bad_Opcode },
5366 { Bad_Opcode },
5367 { Bad_Opcode },
5368 { Bad_Opcode },
5369 { Bad_Opcode },
5370 { Bad_Opcode },
5371 { Bad_Opcode },
5372 { Bad_Opcode },
4e7d34a6 5373 /* 08 */
592d1631
L
5374 { Bad_Opcode },
5375 { Bad_Opcode },
5376 { Bad_Opcode },
5377 { Bad_Opcode },
5378 { Bad_Opcode },
5379 { Bad_Opcode },
5380 { Bad_Opcode },
5381 { Bad_Opcode },
4e7d34a6 5382 /* 10 */
c1dc7af5 5383 { "bextrS", { Gdq, Edq, Id }, 0 },
592d1631 5384 { Bad_Opcode },
467bbef0 5385 { VEX_LEN_TABLE (VEX_LEN_0FXOP_0A_12) },
592d1631
L
5386 { Bad_Opcode },
5387 { Bad_Opcode },
5388 { Bad_Opcode },
5389 { Bad_Opcode },
5390 { Bad_Opcode },
4e7d34a6 5391 /* 18 */
592d1631
L
5392 { Bad_Opcode },
5393 { Bad_Opcode },
5394 { Bad_Opcode },
5395 { Bad_Opcode },
5396 { Bad_Opcode },
5397 { Bad_Opcode },
5398 { Bad_Opcode },
5399 { Bad_Opcode },
4e7d34a6 5400 /* 20 */
592d1631
L
5401 { Bad_Opcode },
5402 { Bad_Opcode },
5403 { Bad_Opcode },
5404 { Bad_Opcode },
5405 { Bad_Opcode },
5406 { Bad_Opcode },
5407 { Bad_Opcode },
5408 { Bad_Opcode },
4e7d34a6 5409 /* 28 */
592d1631
L
5410 { Bad_Opcode },
5411 { Bad_Opcode },
5412 { Bad_Opcode },
5413 { Bad_Opcode },
5414 { Bad_Opcode },
5415 { Bad_Opcode },
5416 { Bad_Opcode },
5417 { Bad_Opcode },
4e7d34a6 5418 /* 30 */
592d1631
L
5419 { Bad_Opcode },
5420 { Bad_Opcode },
5421 { Bad_Opcode },
5422 { Bad_Opcode },
5423 { Bad_Opcode },
5424 { Bad_Opcode },
5425 { Bad_Opcode },
5426 { Bad_Opcode },
c0f3af97 5427 /* 38 */
592d1631
L
5428 { Bad_Opcode },
5429 { Bad_Opcode },
5430 { Bad_Opcode },
5431 { Bad_Opcode },
5432 { Bad_Opcode },
5433 { Bad_Opcode },
5434 { Bad_Opcode },
5435 { Bad_Opcode },
c0f3af97 5436 /* 40 */
592d1631
L
5437 { Bad_Opcode },
5438 { Bad_Opcode },
5439 { Bad_Opcode },
5440 { Bad_Opcode },
5441 { Bad_Opcode },
5442 { Bad_Opcode },
5443 { Bad_Opcode },
5444 { Bad_Opcode },
c1e679ec 5445 /* 48 */
592d1631
L
5446 { Bad_Opcode },
5447 { Bad_Opcode },
5448 { Bad_Opcode },
5449 { Bad_Opcode },
5450 { Bad_Opcode },
5451 { Bad_Opcode },
5452 { Bad_Opcode },
5453 { Bad_Opcode },
c1e679ec 5454 /* 50 */
592d1631
L
5455 { Bad_Opcode },
5456 { Bad_Opcode },
5457 { Bad_Opcode },
5458 { Bad_Opcode },
5459 { Bad_Opcode },
5460 { Bad_Opcode },
5461 { Bad_Opcode },
5462 { Bad_Opcode },
4e7d34a6 5463 /* 58 */
592d1631
L
5464 { Bad_Opcode },
5465 { Bad_Opcode },
5466 { Bad_Opcode },
5467 { Bad_Opcode },
5468 { Bad_Opcode },
5469 { Bad_Opcode },
5470 { Bad_Opcode },
5471 { Bad_Opcode },
4e7d34a6 5472 /* 60 */
592d1631
L
5473 { Bad_Opcode },
5474 { Bad_Opcode },
5475 { Bad_Opcode },
5476 { Bad_Opcode },
5477 { Bad_Opcode },
5478 { Bad_Opcode },
5479 { Bad_Opcode },
5480 { Bad_Opcode },
4e7d34a6 5481 /* 68 */
592d1631
L
5482 { Bad_Opcode },
5483 { Bad_Opcode },
5484 { Bad_Opcode },
5485 { Bad_Opcode },
5486 { Bad_Opcode },
5487 { Bad_Opcode },
5488 { Bad_Opcode },
5489 { Bad_Opcode },
4e7d34a6 5490 /* 70 */
592d1631
L
5491 { Bad_Opcode },
5492 { Bad_Opcode },
5493 { Bad_Opcode },
5494 { Bad_Opcode },
5495 { Bad_Opcode },
5496 { Bad_Opcode },
5497 { Bad_Opcode },
5498 { Bad_Opcode },
4e7d34a6 5499 /* 78 */
592d1631
L
5500 { Bad_Opcode },
5501 { Bad_Opcode },
5502 { Bad_Opcode },
5503 { Bad_Opcode },
5504 { Bad_Opcode },
5505 { Bad_Opcode },
5506 { Bad_Opcode },
5507 { Bad_Opcode },
4e7d34a6 5508 /* 80 */
592d1631
L
5509 { Bad_Opcode },
5510 { Bad_Opcode },
5511 { Bad_Opcode },
5512 { Bad_Opcode },
5513 { Bad_Opcode },
5514 { Bad_Opcode },
5515 { Bad_Opcode },
5516 { Bad_Opcode },
4e7d34a6 5517 /* 88 */
592d1631
L
5518 { Bad_Opcode },
5519 { Bad_Opcode },
5520 { Bad_Opcode },
5521 { Bad_Opcode },
5522 { Bad_Opcode },
5523 { Bad_Opcode },
5524 { Bad_Opcode },
5525 { Bad_Opcode },
4e7d34a6 5526 /* 90 */
592d1631
L
5527 { Bad_Opcode },
5528 { Bad_Opcode },
5529 { Bad_Opcode },
5530 { Bad_Opcode },
5531 { Bad_Opcode },
5532 { Bad_Opcode },
5533 { Bad_Opcode },
5534 { Bad_Opcode },
4e7d34a6 5535 /* 98 */
592d1631
L
5536 { Bad_Opcode },
5537 { Bad_Opcode },
5538 { Bad_Opcode },
5539 { Bad_Opcode },
5540 { Bad_Opcode },
5541 { Bad_Opcode },
5542 { Bad_Opcode },
5543 { Bad_Opcode },
4e7d34a6 5544 /* a0 */
592d1631
L
5545 { Bad_Opcode },
5546 { Bad_Opcode },
5547 { Bad_Opcode },
5548 { Bad_Opcode },
5549 { Bad_Opcode },
5550 { Bad_Opcode },
5551 { Bad_Opcode },
5552 { Bad_Opcode },
4e7d34a6 5553 /* a8 */
592d1631
L
5554 { Bad_Opcode },
5555 { Bad_Opcode },
5556 { Bad_Opcode },
5557 { Bad_Opcode },
5558 { Bad_Opcode },
5559 { Bad_Opcode },
5560 { Bad_Opcode },
5561 { Bad_Opcode },
d5d7db8e 5562 /* b0 */
592d1631
L
5563 { Bad_Opcode },
5564 { Bad_Opcode },
5565 { Bad_Opcode },
5566 { Bad_Opcode },
5567 { Bad_Opcode },
5568 { Bad_Opcode },
5569 { Bad_Opcode },
5570 { Bad_Opcode },
85f10a01 5571 /* b8 */
592d1631
L
5572 { Bad_Opcode },
5573 { Bad_Opcode },
5574 { Bad_Opcode },
5575 { Bad_Opcode },
5576 { Bad_Opcode },
5577 { Bad_Opcode },
5578 { Bad_Opcode },
5579 { Bad_Opcode },
85f10a01 5580 /* c0 */
592d1631
L
5581 { Bad_Opcode },
5582 { Bad_Opcode },
5583 { Bad_Opcode },
5584 { Bad_Opcode },
5585 { Bad_Opcode },
5586 { Bad_Opcode },
5587 { Bad_Opcode },
5588 { Bad_Opcode },
85f10a01 5589 /* c8 */
592d1631
L
5590 { Bad_Opcode },
5591 { Bad_Opcode },
5592 { Bad_Opcode },
5593 { Bad_Opcode },
5594 { Bad_Opcode },
5595 { Bad_Opcode },
5596 { Bad_Opcode },
5597 { Bad_Opcode },
85f10a01 5598 /* d0 */
592d1631
L
5599 { Bad_Opcode },
5600 { Bad_Opcode },
5601 { Bad_Opcode },
5602 { Bad_Opcode },
5603 { Bad_Opcode },
5604 { Bad_Opcode },
5605 { Bad_Opcode },
5606 { Bad_Opcode },
85f10a01 5607 /* d8 */
592d1631
L
5608 { Bad_Opcode },
5609 { Bad_Opcode },
5610 { Bad_Opcode },
5611 { Bad_Opcode },
5612 { Bad_Opcode },
5613 { Bad_Opcode },
5614 { Bad_Opcode },
5615 { Bad_Opcode },
85f10a01 5616 /* e0 */
592d1631
L
5617 { Bad_Opcode },
5618 { Bad_Opcode },
5619 { Bad_Opcode },
5620 { Bad_Opcode },
5621 { Bad_Opcode },
5622 { Bad_Opcode },
5623 { Bad_Opcode },
5624 { Bad_Opcode },
85f10a01 5625 /* e8 */
592d1631
L
5626 { Bad_Opcode },
5627 { Bad_Opcode },
5628 { Bad_Opcode },
5629 { Bad_Opcode },
5630 { Bad_Opcode },
5631 { Bad_Opcode },
5632 { Bad_Opcode },
5633 { Bad_Opcode },
85f10a01 5634 /* f0 */
592d1631
L
5635 { Bad_Opcode },
5636 { Bad_Opcode },
5637 { Bad_Opcode },
5638 { Bad_Opcode },
5639 { Bad_Opcode },
5640 { Bad_Opcode },
5641 { Bad_Opcode },
5642 { Bad_Opcode },
85f10a01 5643 /* f8 */
592d1631
L
5644 { Bad_Opcode },
5645 { Bad_Opcode },
5646 { Bad_Opcode },
5647 { Bad_Opcode },
5648 { Bad_Opcode },
5649 { Bad_Opcode },
5650 { Bad_Opcode },
5651 { Bad_Opcode },
85f10a01 5652 },
c0f3af97
L
5653};
5654
5655static const struct dis386 vex_table[][256] = {
5656 /* VEX_0F */
85f10a01
MM
5657 {
5658 /* 00 */
592d1631
L
5659 { Bad_Opcode },
5660 { Bad_Opcode },
5661 { Bad_Opcode },
5662 { Bad_Opcode },
5663 { Bad_Opcode },
5664 { Bad_Opcode },
5665 { Bad_Opcode },
5666 { Bad_Opcode },
85f10a01 5667 /* 08 */
592d1631
L
5668 { Bad_Opcode },
5669 { Bad_Opcode },
5670 { Bad_Opcode },
5671 { Bad_Opcode },
5672 { Bad_Opcode },
5673 { Bad_Opcode },
5674 { Bad_Opcode },
5675 { Bad_Opcode },
c0f3af97 5676 /* 10 */
592a252b
L
5677 { PREFIX_TABLE (PREFIX_VEX_0F10) },
5678 { PREFIX_TABLE (PREFIX_VEX_0F11) },
5679 { PREFIX_TABLE (PREFIX_VEX_0F12) },
5680 { MOD_TABLE (MOD_VEX_0F13) },
bf926894
JB
5681 { "vunpcklpX", { XM, Vex, EXx }, PREFIX_OPCODE },
5682 { "vunpckhpX", { XM, Vex, EXx }, PREFIX_OPCODE },
592a252b
L
5683 { PREFIX_TABLE (PREFIX_VEX_0F16) },
5684 { MOD_TABLE (MOD_VEX_0F17) },
c0f3af97 5685 /* 18 */
592d1631
L
5686 { Bad_Opcode },
5687 { Bad_Opcode },
5688 { Bad_Opcode },
5689 { Bad_Opcode },
5690 { Bad_Opcode },
5691 { Bad_Opcode },
5692 { Bad_Opcode },
5693 { Bad_Opcode },
c0f3af97 5694 /* 20 */
592d1631
L
5695 { Bad_Opcode },
5696 { Bad_Opcode },
5697 { Bad_Opcode },
5698 { Bad_Opcode },
5699 { Bad_Opcode },
5700 { Bad_Opcode },
5701 { Bad_Opcode },
5702 { Bad_Opcode },
c0f3af97 5703 /* 28 */
bf926894
JB
5704 { "vmovapX", { XM, EXx }, PREFIX_OPCODE },
5705 { "vmovapX", { EXxS, XM }, PREFIX_OPCODE },
592a252b
L
5706 { PREFIX_TABLE (PREFIX_VEX_0F2A) },
5707 { MOD_TABLE (MOD_VEX_0F2B) },
5708 { PREFIX_TABLE (PREFIX_VEX_0F2C) },
5709 { PREFIX_TABLE (PREFIX_VEX_0F2D) },
5710 { PREFIX_TABLE (PREFIX_VEX_0F2E) },
5711 { PREFIX_TABLE (PREFIX_VEX_0F2F) },
85f10a01 5712 /* 30 */
592d1631
L
5713 { Bad_Opcode },
5714 { Bad_Opcode },
5715 { Bad_Opcode },
5716 { Bad_Opcode },
5717 { Bad_Opcode },
5718 { Bad_Opcode },
5719 { Bad_Opcode },
5720 { Bad_Opcode },
4e7d34a6 5721 /* 38 */
592d1631
L
5722 { Bad_Opcode },
5723 { Bad_Opcode },
5724 { Bad_Opcode },
5725 { Bad_Opcode },
5726 { Bad_Opcode },
5727 { Bad_Opcode },
5728 { Bad_Opcode },
5729 { Bad_Opcode },
d5d7db8e 5730 /* 40 */
592d1631 5731 { Bad_Opcode },
43234a1e
L
5732 { PREFIX_TABLE (PREFIX_VEX_0F41) },
5733 { PREFIX_TABLE (PREFIX_VEX_0F42) },
592d1631 5734 { Bad_Opcode },
43234a1e
L
5735 { PREFIX_TABLE (PREFIX_VEX_0F44) },
5736 { PREFIX_TABLE (PREFIX_VEX_0F45) },
5737 { PREFIX_TABLE (PREFIX_VEX_0F46) },
5738 { PREFIX_TABLE (PREFIX_VEX_0F47) },
85f10a01 5739 /* 48 */
592d1631
L
5740 { Bad_Opcode },
5741 { Bad_Opcode },
1ba585e8 5742 { PREFIX_TABLE (PREFIX_VEX_0F4A) },
43234a1e 5743 { PREFIX_TABLE (PREFIX_VEX_0F4B) },
592d1631
L
5744 { Bad_Opcode },
5745 { Bad_Opcode },
5746 { Bad_Opcode },
5747 { Bad_Opcode },
d5d7db8e 5748 /* 50 */
592a252b
L
5749 { MOD_TABLE (MOD_VEX_0F50) },
5750 { PREFIX_TABLE (PREFIX_VEX_0F51) },
5751 { PREFIX_TABLE (PREFIX_VEX_0F52) },
5752 { PREFIX_TABLE (PREFIX_VEX_0F53) },
bf926894
JB
5753 { "vandpX", { XM, Vex, EXx }, PREFIX_OPCODE },
5754 { "vandnpX", { XM, Vex, EXx }, PREFIX_OPCODE },
5755 { "vorpX", { XM, Vex, EXx }, PREFIX_OPCODE },
5756 { "vxorpX", { XM, Vex, EXx }, PREFIX_OPCODE },
c0f3af97 5757 /* 58 */
592a252b
L
5758 { PREFIX_TABLE (PREFIX_VEX_0F58) },
5759 { PREFIX_TABLE (PREFIX_VEX_0F59) },
5760 { PREFIX_TABLE (PREFIX_VEX_0F5A) },
5761 { PREFIX_TABLE (PREFIX_VEX_0F5B) },
5762 { PREFIX_TABLE (PREFIX_VEX_0F5C) },
5763 { PREFIX_TABLE (PREFIX_VEX_0F5D) },
5764 { PREFIX_TABLE (PREFIX_VEX_0F5E) },
5765 { PREFIX_TABLE (PREFIX_VEX_0F5F) },
c0f3af97 5766 /* 60 */
7531c613
JB
5767 { "vpunpcklbw", { XM, Vex, EXx }, PREFIX_DATA },
5768 { "vpunpcklwd", { XM, Vex, EXx }, PREFIX_DATA },
5769 { "vpunpckldq", { XM, Vex, EXx }, PREFIX_DATA },
5770 { "vpacksswb", { XM, Vex, EXx }, PREFIX_DATA },
5771 { "vpcmpgtb", { XM, Vex, EXx }, PREFIX_DATA },
5772 { "vpcmpgtw", { XM, Vex, EXx }, PREFIX_DATA },
5773 { "vpcmpgtd", { XM, Vex, EXx }, PREFIX_DATA },
5774 { "vpackuswb", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 5775 /* 68 */
7531c613
JB
5776 { "vpunpckhbw", { XM, Vex, EXx }, PREFIX_DATA },
5777 { "vpunpckhwd", { XM, Vex, EXx }, PREFIX_DATA },
5778 { "vpunpckhdq", { XM, Vex, EXx }, PREFIX_DATA },
5779 { "vpackssdw", { XM, Vex, EXx }, PREFIX_DATA },
5780 { "vpunpcklqdq", { XM, Vex, EXx }, PREFIX_DATA },
5781 { "vpunpckhqdq", { XM, Vex, EXx }, PREFIX_DATA },
5782 { VEX_LEN_TABLE (VEX_LEN_0F6E) },
592a252b 5783 { PREFIX_TABLE (PREFIX_VEX_0F6F) },
c0f3af97 5784 /* 70 */
592a252b
L
5785 { PREFIX_TABLE (PREFIX_VEX_0F70) },
5786 { REG_TABLE (REG_VEX_0F71) },
5787 { REG_TABLE (REG_VEX_0F72) },
5788 { REG_TABLE (REG_VEX_0F73) },
7531c613
JB
5789 { "vpcmpeqb", { XM, Vex, EXx }, PREFIX_DATA },
5790 { "vpcmpeqw", { XM, Vex, EXx }, PREFIX_DATA },
5791 { "vpcmpeqd", { XM, Vex, EXx }, PREFIX_DATA },
035e7389 5792 { VEX_LEN_TABLE (VEX_LEN_0F77) },
c0f3af97 5793 /* 78 */
592d1631
L
5794 { Bad_Opcode },
5795 { Bad_Opcode },
5796 { Bad_Opcode },
5797 { Bad_Opcode },
592a252b
L
5798 { PREFIX_TABLE (PREFIX_VEX_0F7C) },
5799 { PREFIX_TABLE (PREFIX_VEX_0F7D) },
5800 { PREFIX_TABLE (PREFIX_VEX_0F7E) },
5801 { PREFIX_TABLE (PREFIX_VEX_0F7F) },
c0f3af97 5802 /* 80 */
592d1631
L
5803 { Bad_Opcode },
5804 { Bad_Opcode },
5805 { Bad_Opcode },
5806 { Bad_Opcode },
5807 { Bad_Opcode },
5808 { Bad_Opcode },
5809 { Bad_Opcode },
5810 { Bad_Opcode },
c0f3af97 5811 /* 88 */
592d1631
L
5812 { Bad_Opcode },
5813 { Bad_Opcode },
5814 { Bad_Opcode },
5815 { Bad_Opcode },
5816 { Bad_Opcode },
5817 { Bad_Opcode },
5818 { Bad_Opcode },
5819 { Bad_Opcode },
c0f3af97 5820 /* 90 */
43234a1e
L
5821 { PREFIX_TABLE (PREFIX_VEX_0F90) },
5822 { PREFIX_TABLE (PREFIX_VEX_0F91) },
5823 { PREFIX_TABLE (PREFIX_VEX_0F92) },
5824 { PREFIX_TABLE (PREFIX_VEX_0F93) },
592d1631
L
5825 { Bad_Opcode },
5826 { Bad_Opcode },
5827 { Bad_Opcode },
5828 { Bad_Opcode },
c0f3af97 5829 /* 98 */
43234a1e 5830 { PREFIX_TABLE (PREFIX_VEX_0F98) },
1ba585e8 5831 { PREFIX_TABLE (PREFIX_VEX_0F99) },
592d1631
L
5832 { Bad_Opcode },
5833 { Bad_Opcode },
5834 { Bad_Opcode },
5835 { Bad_Opcode },
5836 { Bad_Opcode },
5837 { Bad_Opcode },
c0f3af97 5838 /* a0 */
592d1631
L
5839 { Bad_Opcode },
5840 { Bad_Opcode },
5841 { Bad_Opcode },
5842 { Bad_Opcode },
5843 { Bad_Opcode },
5844 { Bad_Opcode },
5845 { Bad_Opcode },
5846 { Bad_Opcode },
c0f3af97 5847 /* a8 */
592d1631
L
5848 { Bad_Opcode },
5849 { Bad_Opcode },
5850 { Bad_Opcode },
5851 { Bad_Opcode },
5852 { Bad_Opcode },
5853 { Bad_Opcode },
592a252b 5854 { REG_TABLE (REG_VEX_0FAE) },
592d1631 5855 { Bad_Opcode },
c0f3af97 5856 /* b0 */
592d1631
L
5857 { Bad_Opcode },
5858 { Bad_Opcode },
5859 { Bad_Opcode },
5860 { Bad_Opcode },
5861 { Bad_Opcode },
5862 { Bad_Opcode },
5863 { Bad_Opcode },
5864 { Bad_Opcode },
c0f3af97 5865 /* b8 */
592d1631
L
5866 { Bad_Opcode },
5867 { Bad_Opcode },
5868 { Bad_Opcode },
5869 { Bad_Opcode },
5870 { Bad_Opcode },
5871 { Bad_Opcode },
5872 { Bad_Opcode },
5873 { Bad_Opcode },
c0f3af97 5874 /* c0 */
592d1631
L
5875 { Bad_Opcode },
5876 { Bad_Opcode },
592a252b 5877 { PREFIX_TABLE (PREFIX_VEX_0FC2) },
592d1631 5878 { Bad_Opcode },
7531c613
JB
5879 { VEX_LEN_TABLE (VEX_LEN_0FC4) },
5880 { VEX_LEN_TABLE (VEX_LEN_0FC5) },
bf926894 5881 { "vshufpX", { XM, Vex, EXx, Ib }, PREFIX_OPCODE },
592d1631 5882 { Bad_Opcode },
c0f3af97 5883 /* c8 */
592d1631
L
5884 { Bad_Opcode },
5885 { Bad_Opcode },
5886 { Bad_Opcode },
5887 { Bad_Opcode },
5888 { Bad_Opcode },
5889 { Bad_Opcode },
5890 { Bad_Opcode },
5891 { Bad_Opcode },
c0f3af97 5892 /* d0 */
592a252b 5893 { PREFIX_TABLE (PREFIX_VEX_0FD0) },
7531c613
JB
5894 { "vpsrlw", { XM, Vex, EXxmm }, PREFIX_DATA },
5895 { "vpsrld", { XM, Vex, EXxmm }, PREFIX_DATA },
5896 { "vpsrlq", { XM, Vex, EXxmm }, PREFIX_DATA },
5897 { "vpaddq", { XM, Vex, EXx }, PREFIX_DATA },
5898 { "vpmullw", { XM, Vex, EXx }, PREFIX_DATA },
5899 { VEX_LEN_TABLE (VEX_LEN_0FD6) },
5900 { MOD_TABLE (MOD_VEX_0FD7) },
c0f3af97 5901 /* d8 */
7531c613
JB
5902 { "vpsubusb", { XM, Vex, EXx }, PREFIX_DATA },
5903 { "vpsubusw", { XM, Vex, EXx }, PREFIX_DATA },
5904 { "vpminub", { XM, Vex, EXx }, PREFIX_DATA },
5905 { "vpand", { XM, Vex, EXx }, PREFIX_DATA },
5906 { "vpaddusb", { XM, Vex, EXx }, PREFIX_DATA },
5907 { "vpaddusw", { XM, Vex, EXx }, PREFIX_DATA },
5908 { "vpmaxub", { XM, Vex, EXx }, PREFIX_DATA },
5909 { "vpandn", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 5910 /* e0 */
7531c613
JB
5911 { "vpavgb", { XM, Vex, EXx }, PREFIX_DATA },
5912 { "vpsraw", { XM, Vex, EXxmm }, PREFIX_DATA },
5913 { "vpsrad", { XM, Vex, EXxmm }, PREFIX_DATA },
5914 { "vpavgw", { XM, Vex, EXx }, PREFIX_DATA },
5915 { "vpmulhuw", { XM, Vex, EXx }, PREFIX_DATA },
5916 { "vpmulhw", { XM, Vex, EXx }, PREFIX_DATA },
592a252b 5917 { PREFIX_TABLE (PREFIX_VEX_0FE6) },
7531c613 5918 { MOD_TABLE (MOD_VEX_0FE7) },
c0f3af97 5919 /* e8 */
7531c613
JB
5920 { "vpsubsb", { XM, Vex, EXx }, PREFIX_DATA },
5921 { "vpsubsw", { XM, Vex, EXx }, PREFIX_DATA },
5922 { "vpminsw", { XM, Vex, EXx }, PREFIX_DATA },
5923 { "vpor", { XM, Vex, EXx }, PREFIX_DATA },
5924 { "vpaddsb", { XM, Vex, EXx }, PREFIX_DATA },
5925 { "vpaddsw", { XM, Vex, EXx }, PREFIX_DATA },
5926 { "vpmaxsw", { XM, Vex, EXx }, PREFIX_DATA },
5927 { "vpxor", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 5928 /* f0 */
592a252b 5929 { PREFIX_TABLE (PREFIX_VEX_0FF0) },
7531c613
JB
5930 { "vpsllw", { XM, Vex, EXxmm }, PREFIX_DATA },
5931 { "vpslld", { XM, Vex, EXxmm }, PREFIX_DATA },
5932 { "vpsllq", { XM, Vex, EXxmm }, PREFIX_DATA },
5933 { "vpmuludq", { XM, Vex, EXx }, PREFIX_DATA },
5934 { "vpmaddwd", { XM, Vex, EXx }, PREFIX_DATA },
5935 { "vpsadbw", { XM, Vex, EXx }, PREFIX_DATA },
5936 { VEX_LEN_TABLE (VEX_LEN_0FF7) },
c0f3af97 5937 /* f8 */
7531c613
JB
5938 { "vpsubb", { XM, Vex, EXx }, PREFIX_DATA },
5939 { "vpsubw", { XM, Vex, EXx }, PREFIX_DATA },
5940 { "vpsubd", { XM, Vex, EXx }, PREFIX_DATA },
5941 { "vpsubq", { XM, Vex, EXx }, PREFIX_DATA },
5942 { "vpaddb", { XM, Vex, EXx }, PREFIX_DATA },
5943 { "vpaddw", { XM, Vex, EXx }, PREFIX_DATA },
5944 { "vpaddd", { XM, Vex, EXx }, PREFIX_DATA },
592d1631 5945 { Bad_Opcode },
c0f3af97
L
5946 },
5947 /* VEX_0F38 */
5948 {
5949 /* 00 */
7531c613
JB
5950 { "vpshufb", { XM, Vex, EXx }, PREFIX_DATA },
5951 { "vphaddw", { XM, Vex, EXx }, PREFIX_DATA },
5952 { "vphaddd", { XM, Vex, EXx }, PREFIX_DATA },
5953 { "vphaddsw", { XM, Vex, EXx }, PREFIX_DATA },
5954 { "vpmaddubsw", { XM, Vex, EXx }, PREFIX_DATA },
5955 { "vphsubw", { XM, Vex, EXx }, PREFIX_DATA },
5956 { "vphsubd", { XM, Vex, EXx }, PREFIX_DATA },
5957 { "vphsubsw", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 5958 /* 08 */
7531c613
JB
5959 { "vpsignb", { XM, Vex, EXx }, PREFIX_DATA },
5960 { "vpsignw", { XM, Vex, EXx }, PREFIX_DATA },
5961 { "vpsignd", { XM, Vex, EXx }, PREFIX_DATA },
5962 { "vpmulhrsw", { XM, Vex, EXx }, PREFIX_DATA },
5963 { VEX_W_TABLE (VEX_W_0F380C) },
5964 { VEX_W_TABLE (VEX_W_0F380D) },
5965 { VEX_W_TABLE (VEX_W_0F380E) },
5966 { VEX_W_TABLE (VEX_W_0F380F) },
c0f3af97 5967 /* 10 */
592d1631
L
5968 { Bad_Opcode },
5969 { Bad_Opcode },
5970 { Bad_Opcode },
7531c613 5971 { VEX_W_TABLE (VEX_W_0F3813) },
592d1631
L
5972 { Bad_Opcode },
5973 { Bad_Opcode },
7531c613
JB
5974 { VEX_LEN_TABLE (VEX_LEN_0F3816) },
5975 { "vptest", { XM, EXx }, PREFIX_DATA },
c0f3af97 5976 /* 18 */
7531c613
JB
5977 { VEX_W_TABLE (VEX_W_0F3818) },
5978 { VEX_LEN_TABLE (VEX_LEN_0F3819) },
5979 { MOD_TABLE (MOD_VEX_0F381A) },
592d1631 5980 { Bad_Opcode },
7531c613
JB
5981 { "vpabsb", { XM, EXx }, PREFIX_DATA },
5982 { "vpabsw", { XM, EXx }, PREFIX_DATA },
5983 { "vpabsd", { XM, EXx }, PREFIX_DATA },
592d1631 5984 { Bad_Opcode },
c0f3af97 5985 /* 20 */
7531c613
JB
5986 { "vpmovsxbw", { XM, EXxmmq }, PREFIX_DATA },
5987 { "vpmovsxbd", { XM, EXxmmqd }, PREFIX_DATA },
5988 { "vpmovsxbq", { XM, EXxmmdw }, PREFIX_DATA },
5989 { "vpmovsxwd", { XM, EXxmmq }, PREFIX_DATA },
5990 { "vpmovsxwq", { XM, EXxmmqd }, PREFIX_DATA },
5991 { "vpmovsxdq", { XM, EXxmmq }, PREFIX_DATA },
592d1631
L
5992 { Bad_Opcode },
5993 { Bad_Opcode },
c0f3af97 5994 /* 28 */
7531c613
JB
5995 { "vpmuldq", { XM, Vex, EXx }, PREFIX_DATA },
5996 { "vpcmpeqq", { XM, Vex, EXx }, PREFIX_DATA },
5997 { MOD_TABLE (MOD_VEX_0F382A) },
5998 { "vpackusdw", { XM, Vex, EXx }, PREFIX_DATA },
5999 { MOD_TABLE (MOD_VEX_0F382C) },
6000 { MOD_TABLE (MOD_VEX_0F382D) },
6001 { MOD_TABLE (MOD_VEX_0F382E) },
6002 { MOD_TABLE (MOD_VEX_0F382F) },
c0f3af97 6003 /* 30 */
7531c613
JB
6004 { "vpmovzxbw", { XM, EXxmmq }, PREFIX_DATA },
6005 { "vpmovzxbd", { XM, EXxmmqd }, PREFIX_DATA },
6006 { "vpmovzxbq", { XM, EXxmmdw }, PREFIX_DATA },
6007 { "vpmovzxwd", { XM, EXxmmq }, PREFIX_DATA },
6008 { "vpmovzxwq", { XM, EXxmmqd }, PREFIX_DATA },
6009 { "vpmovzxdq", { XM, EXxmmq }, PREFIX_DATA },
6010 { VEX_LEN_TABLE (VEX_LEN_0F3836) },
6011 { "vpcmpgtq", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6012 /* 38 */
7531c613
JB
6013 { "vpminsb", { XM, Vex, EXx }, PREFIX_DATA },
6014 { "vpminsd", { XM, Vex, EXx }, PREFIX_DATA },
6015 { "vpminuw", { XM, Vex, EXx }, PREFIX_DATA },
6016 { "vpminud", { XM, Vex, EXx }, PREFIX_DATA },
6017 { "vpmaxsb", { XM, Vex, EXx }, PREFIX_DATA },
6018 { "vpmaxsd", { XM, Vex, EXx }, PREFIX_DATA },
6019 { "vpmaxuw", { XM, Vex, EXx }, PREFIX_DATA },
6020 { "vpmaxud", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6021 /* 40 */
7531c613
JB
6022 { "vpmulld", { XM, Vex, EXx }, PREFIX_DATA },
6023 { VEX_LEN_TABLE (VEX_LEN_0F3841) },
592d1631
L
6024 { Bad_Opcode },
6025 { Bad_Opcode },
6026 { Bad_Opcode },
7531c613
JB
6027 { "vpsrlv%DQ", { XM, Vex, EXx }, PREFIX_DATA },
6028 { VEX_W_TABLE (VEX_W_0F3846) },
6029 { "vpsllv%DQ", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6030 /* 48 */
592d1631 6031 { Bad_Opcode },
260cd341 6032 { X86_64_TABLE (X86_64_VEX_0F3849) },
592d1631 6033 { Bad_Opcode },
260cd341 6034 { X86_64_TABLE (X86_64_VEX_0F384B) },
592d1631
L
6035 { Bad_Opcode },
6036 { Bad_Opcode },
6037 { Bad_Opcode },
6038 { Bad_Opcode },
c0f3af97 6039 /* 50 */
592d1631
L
6040 { Bad_Opcode },
6041 { Bad_Opcode },
6042 { Bad_Opcode },
6043 { Bad_Opcode },
6044 { Bad_Opcode },
6045 { Bad_Opcode },
6046 { Bad_Opcode },
6047 { Bad_Opcode },
c0f3af97 6048 /* 58 */
7531c613
JB
6049 { VEX_W_TABLE (VEX_W_0F3858) },
6050 { VEX_W_TABLE (VEX_W_0F3859) },
6051 { MOD_TABLE (MOD_VEX_0F385A) },
592d1631 6052 { Bad_Opcode },
260cd341 6053 { X86_64_TABLE (X86_64_VEX_0F385C) },
592d1631 6054 { Bad_Opcode },
260cd341 6055 { X86_64_TABLE (X86_64_VEX_0F385E) },
592d1631 6056 { Bad_Opcode },
c0f3af97 6057 /* 60 */
592d1631
L
6058 { Bad_Opcode },
6059 { Bad_Opcode },
6060 { Bad_Opcode },
6061 { Bad_Opcode },
6062 { Bad_Opcode },
6063 { Bad_Opcode },
6064 { Bad_Opcode },
6065 { Bad_Opcode },
c0f3af97 6066 /* 68 */
592d1631
L
6067 { Bad_Opcode },
6068 { Bad_Opcode },
6069 { Bad_Opcode },
6070 { Bad_Opcode },
6071 { Bad_Opcode },
6072 { Bad_Opcode },
6073 { Bad_Opcode },
6074 { Bad_Opcode },
c0f3af97 6075 /* 70 */
592d1631
L
6076 { Bad_Opcode },
6077 { Bad_Opcode },
6078 { Bad_Opcode },
6079 { Bad_Opcode },
6080 { Bad_Opcode },
6081 { Bad_Opcode },
6082 { Bad_Opcode },
6083 { Bad_Opcode },
c0f3af97 6084 /* 78 */
7531c613
JB
6085 { VEX_W_TABLE (VEX_W_0F3878) },
6086 { VEX_W_TABLE (VEX_W_0F3879) },
592d1631
L
6087 { Bad_Opcode },
6088 { Bad_Opcode },
6089 { Bad_Opcode },
6090 { Bad_Opcode },
6091 { Bad_Opcode },
6092 { Bad_Opcode },
c0f3af97 6093 /* 80 */
592d1631
L
6094 { Bad_Opcode },
6095 { Bad_Opcode },
6096 { Bad_Opcode },
6097 { Bad_Opcode },
6098 { Bad_Opcode },
6099 { Bad_Opcode },
6100 { Bad_Opcode },
6101 { Bad_Opcode },
c0f3af97 6102 /* 88 */
592d1631
L
6103 { Bad_Opcode },
6104 { Bad_Opcode },
6105 { Bad_Opcode },
6106 { Bad_Opcode },
7531c613 6107 { MOD_TABLE (MOD_VEX_0F388C) },
592d1631 6108 { Bad_Opcode },
7531c613 6109 { MOD_TABLE (MOD_VEX_0F388E) },
592d1631 6110 { Bad_Opcode },
c0f3af97 6111 /* 90 */
7531c613
JB
6112 { "vpgatherd%DQ", { XM, MVexVSIBDWpX, Vex }, PREFIX_DATA },
6113 { "vpgatherq%DQ", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, PREFIX_DATA },
6114 { "vgatherdp%XW", { XM, MVexVSIBDWpX, Vex }, PREFIX_DATA },
6115 { "vgatherqp%XW", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, PREFIX_DATA },
592d1631
L
6116 { Bad_Opcode },
6117 { Bad_Opcode },
7531c613
JB
6118 { "vfmaddsub132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6119 { "vfmsubadd132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6120 /* 98 */
7531c613
JB
6121 { "vfmadd132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6122 { "vfmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6123 { "vfmsub132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6124 { "vfmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6125 { "vfnmadd132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6126 { "vfnmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6127 { "vfnmsub132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6128 { "vfnmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
c0f3af97 6129 /* a0 */
592d1631
L
6130 { Bad_Opcode },
6131 { Bad_Opcode },
6132 { Bad_Opcode },
6133 { Bad_Opcode },
6134 { Bad_Opcode },
6135 { Bad_Opcode },
7531c613
JB
6136 { "vfmaddsub213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6137 { "vfmsubadd213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6138 /* a8 */
7531c613
JB
6139 { "vfmadd213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6140 { "vfmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6141 { "vfmsub213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6142 { "vfmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6143 { "vfnmadd213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6144 { "vfnmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6145 { "vfnmsub213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6146 { "vfnmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
c0f3af97 6147 /* b0 */
592d1631
L
6148 { Bad_Opcode },
6149 { Bad_Opcode },
6150 { Bad_Opcode },
6151 { Bad_Opcode },
6152 { Bad_Opcode },
6153 { Bad_Opcode },
7531c613
JB
6154 { "vfmaddsub231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6155 { "vfmsubadd231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6156 /* b8 */
7531c613
JB
6157 { "vfmadd231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6158 { "vfmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6159 { "vfmsub231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6160 { "vfmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6161 { "vfnmadd231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6162 { "vfnmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6163 { "vfnmsub231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6164 { "vfnmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
c0f3af97 6165 /* c0 */
592d1631
L
6166 { Bad_Opcode },
6167 { Bad_Opcode },
6168 { Bad_Opcode },
6169 { Bad_Opcode },
6170 { Bad_Opcode },
6171 { Bad_Opcode },
6172 { Bad_Opcode },
6173 { Bad_Opcode },
c0f3af97 6174 /* c8 */
592d1631
L
6175 { Bad_Opcode },
6176 { Bad_Opcode },
6177 { Bad_Opcode },
6178 { Bad_Opcode },
6179 { Bad_Opcode },
6180 { Bad_Opcode },
6181 { Bad_Opcode },
7531c613 6182 { VEX_W_TABLE (VEX_W_0F38CF) },
c0f3af97 6183 /* d0 */
592d1631
L
6184 { Bad_Opcode },
6185 { Bad_Opcode },
6186 { Bad_Opcode },
6187 { Bad_Opcode },
6188 { Bad_Opcode },
6189 { Bad_Opcode },
6190 { Bad_Opcode },
6191 { Bad_Opcode },
c0f3af97 6192 /* d8 */
592d1631
L
6193 { Bad_Opcode },
6194 { Bad_Opcode },
6195 { Bad_Opcode },
7531c613
JB
6196 { VEX_LEN_TABLE (VEX_LEN_0F38DB) },
6197 { "vaesenc", { XM, Vex, EXx }, PREFIX_DATA },
6198 { "vaesenclast", { XM, Vex, EXx }, PREFIX_DATA },
6199 { "vaesdec", { XM, Vex, EXx }, PREFIX_DATA },
6200 { "vaesdeclast", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6201 /* e0 */
592d1631
L
6202 { Bad_Opcode },
6203 { Bad_Opcode },
6204 { Bad_Opcode },
6205 { Bad_Opcode },
6206 { Bad_Opcode },
6207 { Bad_Opcode },
6208 { Bad_Opcode },
6209 { Bad_Opcode },
c0f3af97 6210 /* e8 */
592d1631
L
6211 { Bad_Opcode },
6212 { Bad_Opcode },
6213 { Bad_Opcode },
6214 { Bad_Opcode },
6215 { Bad_Opcode },
6216 { Bad_Opcode },
6217 { Bad_Opcode },
6218 { Bad_Opcode },
c0f3af97 6219 /* f0 */
592d1631
L
6220 { Bad_Opcode },
6221 { Bad_Opcode },
035e7389 6222 { VEX_LEN_TABLE (VEX_LEN_0F38F2) },
f12dc422 6223 { REG_TABLE (REG_VEX_0F38F3) },
592d1631 6224 { Bad_Opcode },
6c30d220
L
6225 { PREFIX_TABLE (PREFIX_VEX_0F38F5) },
6226 { PREFIX_TABLE (PREFIX_VEX_0F38F6) },
f12dc422 6227 { PREFIX_TABLE (PREFIX_VEX_0F38F7) },
c0f3af97 6228 /* f8 */
592d1631
L
6229 { Bad_Opcode },
6230 { Bad_Opcode },
6231 { Bad_Opcode },
6232 { Bad_Opcode },
6233 { Bad_Opcode },
6234 { Bad_Opcode },
6235 { Bad_Opcode },
6236 { Bad_Opcode },
c0f3af97
L
6237 },
6238 /* VEX_0F3A */
6239 {
6240 /* 00 */
7531c613
JB
6241 { VEX_LEN_TABLE (VEX_LEN_0F3A00) },
6242 { VEX_LEN_TABLE (VEX_LEN_0F3A01) },
6243 { VEX_W_TABLE (VEX_W_0F3A02) },
592d1631 6244 { Bad_Opcode },
7531c613
JB
6245 { VEX_W_TABLE (VEX_W_0F3A04) },
6246 { VEX_W_TABLE (VEX_W_0F3A05) },
6247 { VEX_LEN_TABLE (VEX_LEN_0F3A06) },
592d1631 6248 { Bad_Opcode },
c0f3af97 6249 /* 08 */
7531c613
JB
6250 { "vroundps", { XM, EXx, Ib }, PREFIX_DATA },
6251 { "vroundpd", { XM, EXx, Ib }, PREFIX_DATA },
6252 { "vroundss", { XMScalar, VexScalar, EXxmm_md, Ib }, PREFIX_DATA },
6253 { "vroundsd", { XMScalar, VexScalar, EXxmm_mq, Ib }, PREFIX_DATA },
6254 { "vblendps", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6255 { "vblendpd", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6256 { "vpblendw", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6257 { "vpalignr", { XM, Vex, EXx, Ib }, PREFIX_DATA },
c0f3af97 6258 /* 10 */
592d1631
L
6259 { Bad_Opcode },
6260 { Bad_Opcode },
6261 { Bad_Opcode },
6262 { Bad_Opcode },
7531c613
JB
6263 { VEX_LEN_TABLE (VEX_LEN_0F3A14) },
6264 { VEX_LEN_TABLE (VEX_LEN_0F3A15) },
6265 { VEX_LEN_TABLE (VEX_LEN_0F3A16) },
6266 { VEX_LEN_TABLE (VEX_LEN_0F3A17) },
c0f3af97 6267 /* 18 */
7531c613
JB
6268 { VEX_LEN_TABLE (VEX_LEN_0F3A18) },
6269 { VEX_LEN_TABLE (VEX_LEN_0F3A19) },
592d1631
L
6270 { Bad_Opcode },
6271 { Bad_Opcode },
6272 { Bad_Opcode },
7531c613 6273 { VEX_W_TABLE (VEX_W_0F3A1D) },
592d1631
L
6274 { Bad_Opcode },
6275 { Bad_Opcode },
c0f3af97 6276 /* 20 */
7531c613
JB
6277 { VEX_LEN_TABLE (VEX_LEN_0F3A20) },
6278 { VEX_LEN_TABLE (VEX_LEN_0F3A21) },
6279 { VEX_LEN_TABLE (VEX_LEN_0F3A22) },
592d1631
L
6280 { Bad_Opcode },
6281 { Bad_Opcode },
6282 { Bad_Opcode },
6283 { Bad_Opcode },
6284 { Bad_Opcode },
c0f3af97 6285 /* 28 */
592d1631
L
6286 { Bad_Opcode },
6287 { Bad_Opcode },
6288 { Bad_Opcode },
6289 { Bad_Opcode },
6290 { Bad_Opcode },
6291 { Bad_Opcode },
6292 { Bad_Opcode },
6293 { Bad_Opcode },
c0f3af97 6294 /* 30 */
7531c613
JB
6295 { VEX_LEN_TABLE (VEX_LEN_0F3A30) },
6296 { VEX_LEN_TABLE (VEX_LEN_0F3A31) },
6297 { VEX_LEN_TABLE (VEX_LEN_0F3A32) },
6298 { VEX_LEN_TABLE (VEX_LEN_0F3A33) },
592d1631
L
6299 { Bad_Opcode },
6300 { Bad_Opcode },
6301 { Bad_Opcode },
6302 { Bad_Opcode },
c0f3af97 6303 /* 38 */
7531c613
JB
6304 { VEX_LEN_TABLE (VEX_LEN_0F3A38) },
6305 { VEX_LEN_TABLE (VEX_LEN_0F3A39) },
592d1631
L
6306 { Bad_Opcode },
6307 { Bad_Opcode },
6308 { Bad_Opcode },
6309 { Bad_Opcode },
6310 { Bad_Opcode },
6311 { Bad_Opcode },
c0f3af97 6312 /* 40 */
7531c613
JB
6313 { "vdpps", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6314 { VEX_LEN_TABLE (VEX_LEN_0F3A41) },
6315 { "vmpsadbw", { XM, Vex, EXx, Ib }, PREFIX_DATA },
592d1631 6316 { Bad_Opcode },
7531c613 6317 { "vpclmulqdq", { XM, Vex, EXx, PCLMUL }, PREFIX_DATA },
592d1631 6318 { Bad_Opcode },
7531c613 6319 { VEX_LEN_TABLE (VEX_LEN_0F3A46) },
592d1631 6320 { Bad_Opcode },
c0f3af97 6321 /* 48 */
7531c613
JB
6322 { "vpermil2ps", { XM, Vex, EXx, XMVexI4, VexI4 }, PREFIX_DATA },
6323 { "vpermil2pd", { XM, Vex, EXx, XMVexI4, VexI4 }, PREFIX_DATA },
6324 { VEX_W_TABLE (VEX_W_0F3A4A) },
6325 { VEX_W_TABLE (VEX_W_0F3A4B) },
6326 { VEX_W_TABLE (VEX_W_0F3A4C) },
592d1631
L
6327 { Bad_Opcode },
6328 { Bad_Opcode },
6329 { Bad_Opcode },
c0f3af97 6330 /* 50 */
592d1631
L
6331 { Bad_Opcode },
6332 { Bad_Opcode },
6333 { Bad_Opcode },
6334 { Bad_Opcode },
6335 { Bad_Opcode },
6336 { Bad_Opcode },
6337 { Bad_Opcode },
6338 { Bad_Opcode },
c0f3af97 6339 /* 58 */
592d1631
L
6340 { Bad_Opcode },
6341 { Bad_Opcode },
6342 { Bad_Opcode },
6343 { Bad_Opcode },
7531c613
JB
6344 { "vfmaddsubps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6345 { "vfmaddsubpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6346 { "vfmsubaddps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6347 { "vfmsubaddpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
c0f3af97 6348 /* 60 */
7531c613
JB
6349 { VEX_LEN_TABLE (VEX_LEN_0F3A60) },
6350 { VEX_LEN_TABLE (VEX_LEN_0F3A61) },
6351 { VEX_LEN_TABLE (VEX_LEN_0F3A62) },
6352 { VEX_LEN_TABLE (VEX_LEN_0F3A63) },
592d1631
L
6353 { Bad_Opcode },
6354 { Bad_Opcode },
6355 { Bad_Opcode },
6356 { Bad_Opcode },
c0f3af97 6357 /* 68 */
7531c613
JB
6358 { "vfmaddps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6359 { "vfmaddpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6360 { "vfmaddss", { XMScalar, VexScalar, EXxmm_md, XMVexScalarI4 }, PREFIX_DATA },
6361 { "vfmaddsd", { XMScalar, VexScalar, EXxmm_mq, XMVexScalarI4 }, PREFIX_DATA },
6362 { "vfmsubps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6363 { "vfmsubpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6364 { "vfmsubss", { XMScalar, VexScalar, EXxmm_md, XMVexScalarI4 }, PREFIX_DATA },
6365 { "vfmsubsd", { XMScalar, VexScalar, EXxmm_mq, XMVexScalarI4 }, PREFIX_DATA },
c0f3af97 6366 /* 70 */
592d1631
L
6367 { Bad_Opcode },
6368 { Bad_Opcode },
6369 { Bad_Opcode },
6370 { Bad_Opcode },
6371 { Bad_Opcode },
6372 { Bad_Opcode },
6373 { Bad_Opcode },
6374 { Bad_Opcode },
c0f3af97 6375 /* 78 */
7531c613
JB
6376 { "vfnmaddps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6377 { "vfnmaddpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6378 { "vfnmaddss", { XMScalar, VexScalar, EXxmm_md, XMVexScalarI4 }, PREFIX_DATA },
6379 { "vfnmaddsd", { XMScalar, VexScalar, EXxmm_mq, XMVexScalarI4 }, PREFIX_DATA },
6380 { "vfnmsubps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6381 { "vfnmsubpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6382 { "vfnmsubss", { XMScalar, VexScalar, EXxmm_md, XMVexScalarI4 }, PREFIX_DATA },
6383 { "vfnmsubsd", { XMScalar, VexScalar, EXxmm_mq, XMVexScalarI4 }, PREFIX_DATA },
c0f3af97 6384 /* 80 */
592d1631
L
6385 { Bad_Opcode },
6386 { Bad_Opcode },
6387 { Bad_Opcode },
6388 { Bad_Opcode },
6389 { Bad_Opcode },
6390 { Bad_Opcode },
6391 { Bad_Opcode },
6392 { Bad_Opcode },
c0f3af97 6393 /* 88 */
592d1631
L
6394 { Bad_Opcode },
6395 { Bad_Opcode },
6396 { Bad_Opcode },
6397 { Bad_Opcode },
6398 { Bad_Opcode },
6399 { Bad_Opcode },
6400 { Bad_Opcode },
6401 { Bad_Opcode },
c0f3af97 6402 /* 90 */
592d1631
L
6403 { Bad_Opcode },
6404 { Bad_Opcode },
6405 { Bad_Opcode },
6406 { Bad_Opcode },
6407 { Bad_Opcode },
6408 { Bad_Opcode },
6409 { Bad_Opcode },
6410 { Bad_Opcode },
c0f3af97 6411 /* 98 */
592d1631
L
6412 { Bad_Opcode },
6413 { Bad_Opcode },
6414 { Bad_Opcode },
6415 { Bad_Opcode },
6416 { Bad_Opcode },
6417 { Bad_Opcode },
6418 { Bad_Opcode },
6419 { Bad_Opcode },
c0f3af97 6420 /* a0 */
592d1631
L
6421 { Bad_Opcode },
6422 { Bad_Opcode },
6423 { Bad_Opcode },
6424 { Bad_Opcode },
6425 { Bad_Opcode },
6426 { Bad_Opcode },
6427 { Bad_Opcode },
6428 { Bad_Opcode },
c0f3af97 6429 /* a8 */
592d1631
L
6430 { Bad_Opcode },
6431 { Bad_Opcode },
6432 { Bad_Opcode },
6433 { Bad_Opcode },
6434 { Bad_Opcode },
6435 { Bad_Opcode },
6436 { Bad_Opcode },
6437 { Bad_Opcode },
c0f3af97 6438 /* b0 */
592d1631
L
6439 { Bad_Opcode },
6440 { Bad_Opcode },
6441 { Bad_Opcode },
6442 { Bad_Opcode },
6443 { Bad_Opcode },
6444 { Bad_Opcode },
6445 { Bad_Opcode },
6446 { Bad_Opcode },
c0f3af97 6447 /* b8 */
592d1631
L
6448 { Bad_Opcode },
6449 { Bad_Opcode },
6450 { Bad_Opcode },
6451 { Bad_Opcode },
6452 { Bad_Opcode },
6453 { Bad_Opcode },
6454 { Bad_Opcode },
6455 { Bad_Opcode },
c0f3af97 6456 /* c0 */
592d1631
L
6457 { Bad_Opcode },
6458 { Bad_Opcode },
6459 { Bad_Opcode },
6460 { Bad_Opcode },
6461 { Bad_Opcode },
6462 { Bad_Opcode },
6463 { Bad_Opcode },
6464 { Bad_Opcode },
c0f3af97 6465 /* c8 */
592d1631
L
6466 { Bad_Opcode },
6467 { Bad_Opcode },
6468 { Bad_Opcode },
6469 { Bad_Opcode },
6470 { Bad_Opcode },
6471 { Bad_Opcode },
7531c613
JB
6472 { VEX_W_TABLE (VEX_W_0F3ACE) },
6473 { VEX_W_TABLE (VEX_W_0F3ACF) },
c0f3af97 6474 /* d0 */
592d1631
L
6475 { Bad_Opcode },
6476 { Bad_Opcode },
6477 { Bad_Opcode },
6478 { Bad_Opcode },
6479 { Bad_Opcode },
6480 { Bad_Opcode },
6481 { Bad_Opcode },
6482 { Bad_Opcode },
c0f3af97 6483 /* d8 */
592d1631
L
6484 { Bad_Opcode },
6485 { Bad_Opcode },
6486 { Bad_Opcode },
6487 { Bad_Opcode },
6488 { Bad_Opcode },
6489 { Bad_Opcode },
6490 { Bad_Opcode },
7531c613 6491 { VEX_LEN_TABLE (VEX_LEN_0F3ADF) },
c0f3af97 6492 /* e0 */
592d1631
L
6493 { Bad_Opcode },
6494 { Bad_Opcode },
6495 { Bad_Opcode },
6496 { Bad_Opcode },
6497 { Bad_Opcode },
6498 { Bad_Opcode },
6499 { Bad_Opcode },
6500 { Bad_Opcode },
c0f3af97 6501 /* e8 */
592d1631
L
6502 { Bad_Opcode },
6503 { Bad_Opcode },
6504 { Bad_Opcode },
6505 { Bad_Opcode },
6506 { Bad_Opcode },
6507 { Bad_Opcode },
6508 { Bad_Opcode },
6509 { Bad_Opcode },
c0f3af97 6510 /* f0 */
6c30d220 6511 { PREFIX_TABLE (PREFIX_VEX_0F3AF0) },
592d1631
L
6512 { Bad_Opcode },
6513 { Bad_Opcode },
6514 { Bad_Opcode },
6515 { Bad_Opcode },
6516 { Bad_Opcode },
6517 { Bad_Opcode },
6518 { Bad_Opcode },
c0f3af97 6519 /* f8 */
592d1631
L
6520 { Bad_Opcode },
6521 { Bad_Opcode },
6522 { Bad_Opcode },
6523 { Bad_Opcode },
6524 { Bad_Opcode },
6525 { Bad_Opcode },
6526 { Bad_Opcode },
6527 { Bad_Opcode },
c0f3af97
L
6528 },
6529};
6530
43234a1e 6531#include "i386-dis-evex.h"
ad692897 6532
c0f3af97 6533static const struct dis386 vex_len_table[][2] = {
18897deb 6534 /* VEX_LEN_0F12_P_0_M_0 / VEX_LEN_0F12_P_2_M_0 */
c0f3af97 6535 {
89e65d17 6536 { "vmovlpX", { XM, Vex, EXq }, 0 },
c0f3af97
L
6537 },
6538
592a252b 6539 /* VEX_LEN_0F12_P_0_M_1 */
c0f3af97 6540 {
89e65d17 6541 { "vmovhlps", { XM, Vex, EXq }, 0 },
c0f3af97
L
6542 },
6543
592a252b 6544 /* VEX_LEN_0F13_M_0 */
c0f3af97 6545 {
bf926894 6546 { "vmovlpX", { EXq, XM }, PREFIX_OPCODE },
c0f3af97
L
6547 },
6548
18897deb 6549 /* VEX_LEN_0F16_P_0_M_0 / VEX_LEN_0F16_P_2_M_0 */
c0f3af97 6550 {
89e65d17 6551 { "vmovhpX", { XM, Vex, EXq }, 0 },
c0f3af97
L
6552 },
6553
592a252b 6554 /* VEX_LEN_0F16_P_0_M_1 */
c0f3af97 6555 {
89e65d17 6556 { "vmovlhps", { XM, Vex, EXq }, 0 },
c0f3af97
L
6557 },
6558
592a252b 6559 /* VEX_LEN_0F17_M_0 */
c0f3af97 6560 {
bf926894 6561 { "vmovhpX", { EXq, XM }, PREFIX_OPCODE },
c0f3af97
L
6562 },
6563
43234a1e
L
6564 /* VEX_LEN_0F41_P_0 */
6565 {
6566 { Bad_Opcode },
6567 { VEX_W_TABLE (VEX_W_0F41_P_0_LEN_1) },
6568 },
1ba585e8
IT
6569 /* VEX_LEN_0F41_P_2 */
6570 {
6571 { Bad_Opcode },
6572 { VEX_W_TABLE (VEX_W_0F41_P_2_LEN_1) },
6573 },
43234a1e
L
6574 /* VEX_LEN_0F42_P_0 */
6575 {
6576 { Bad_Opcode },
6577 { VEX_W_TABLE (VEX_W_0F42_P_0_LEN_1) },
6578 },
1ba585e8
IT
6579 /* VEX_LEN_0F42_P_2 */
6580 {
6581 { Bad_Opcode },
6582 { VEX_W_TABLE (VEX_W_0F42_P_2_LEN_1) },
6583 },
43234a1e
L
6584 /* VEX_LEN_0F44_P_0 */
6585 {
6586 { VEX_W_TABLE (VEX_W_0F44_P_0_LEN_0) },
6587 },
1ba585e8
IT
6588 /* VEX_LEN_0F44_P_2 */
6589 {
6590 { VEX_W_TABLE (VEX_W_0F44_P_2_LEN_0) },
6591 },
43234a1e
L
6592 /* VEX_LEN_0F45_P_0 */
6593 {
6594 { Bad_Opcode },
6595 { VEX_W_TABLE (VEX_W_0F45_P_0_LEN_1) },
6596 },
1ba585e8
IT
6597 /* VEX_LEN_0F45_P_2 */
6598 {
6599 { Bad_Opcode },
6600 { VEX_W_TABLE (VEX_W_0F45_P_2_LEN_1) },
6601 },
43234a1e
L
6602 /* VEX_LEN_0F46_P_0 */
6603 {
6604 { Bad_Opcode },
6605 { VEX_W_TABLE (VEX_W_0F46_P_0_LEN_1) },
6606 },
1ba585e8
IT
6607 /* VEX_LEN_0F46_P_2 */
6608 {
6609 { Bad_Opcode },
6610 { VEX_W_TABLE (VEX_W_0F46_P_2_LEN_1) },
6611 },
43234a1e
L
6612 /* VEX_LEN_0F47_P_0 */
6613 {
6614 { Bad_Opcode },
6615 { VEX_W_TABLE (VEX_W_0F47_P_0_LEN_1) },
6616 },
1ba585e8
IT
6617 /* VEX_LEN_0F47_P_2 */
6618 {
6619 { Bad_Opcode },
6620 { VEX_W_TABLE (VEX_W_0F47_P_2_LEN_1) },
6621 },
6622 /* VEX_LEN_0F4A_P_0 */
6623 {
6624 { Bad_Opcode },
6625 { VEX_W_TABLE (VEX_W_0F4A_P_0_LEN_1) },
6626 },
6627 /* VEX_LEN_0F4A_P_2 */
6628 {
6629 { Bad_Opcode },
6630 { VEX_W_TABLE (VEX_W_0F4A_P_2_LEN_1) },
6631 },
6632 /* VEX_LEN_0F4B_P_0 */
6633 {
6634 { Bad_Opcode },
6635 { VEX_W_TABLE (VEX_W_0F4B_P_0_LEN_1) },
6636 },
43234a1e
L
6637 /* VEX_LEN_0F4B_P_2 */
6638 {
6639 { Bad_Opcode },
6640 { VEX_W_TABLE (VEX_W_0F4B_P_2_LEN_1) },
6641 },
6642
7531c613 6643 /* VEX_LEN_0F6E */
c0f3af97 6644 {
7531c613 6645 { "vmovK", { XMScalar, Edq }, PREFIX_DATA },
c0f3af97
L
6646 },
6647
035e7389 6648 /* VEX_LEN_0F77 */
c0f3af97 6649 {
ec6f095a
L
6650 { "vzeroupper", { XX }, 0 },
6651 { "vzeroall", { XX }, 0 },
c0f3af97
L
6652 },
6653
ec6f095a 6654 /* VEX_LEN_0F7E_P_1 */
c0f3af97 6655 {
5b872f7d 6656 { "vmovq", { XMScalar, EXxmm_mq }, 0 },
c0f3af97
L
6657 },
6658
ec6f095a 6659 /* VEX_LEN_0F7E_P_2 */
c0f3af97 6660 {
ec6f095a 6661 { "vmovK", { Edq, XMScalar }, 0 },
c0f3af97
L
6662 },
6663
ec6f095a 6664 /* VEX_LEN_0F90_P_0 */
c0f3af97 6665 {
ec6f095a 6666 { VEX_W_TABLE (VEX_W_0F90_P_0_LEN_0) },
c0f3af97
L
6667 },
6668
ec6f095a 6669 /* VEX_LEN_0F90_P_2 */
c0f3af97 6670 {
ec6f095a 6671 { VEX_W_TABLE (VEX_W_0F90_P_2_LEN_0) },
c0f3af97
L
6672 },
6673
ec6f095a 6674 /* VEX_LEN_0F91_P_0 */
c0f3af97 6675 {
ec6f095a 6676 { VEX_W_TABLE (VEX_W_0F91_P_0_LEN_0) },
c0f3af97
L
6677 },
6678
ec6f095a 6679 /* VEX_LEN_0F91_P_2 */
c0f3af97 6680 {
ec6f095a 6681 { VEX_W_TABLE (VEX_W_0F91_P_2_LEN_0) },
c0f3af97
L
6682 },
6683
ec6f095a 6684 /* VEX_LEN_0F92_P_0 */
c0f3af97 6685 {
ec6f095a 6686 { VEX_W_TABLE (VEX_W_0F92_P_0_LEN_0) },
c0f3af97
L
6687 },
6688
ec6f095a 6689 /* VEX_LEN_0F92_P_2 */
c0f3af97 6690 {
ec6f095a 6691 { VEX_W_TABLE (VEX_W_0F92_P_2_LEN_0) },
c0f3af97
L
6692 },
6693
ec6f095a 6694 /* VEX_LEN_0F92_P_3 */
c0f3af97 6695 {
58a211d2 6696 { MOD_TABLE (MOD_VEX_0F92_P_3_LEN_0) },
c0f3af97
L
6697 },
6698
ec6f095a 6699 /* VEX_LEN_0F93_P_0 */
c0f3af97 6700 {
ec6f095a 6701 { VEX_W_TABLE (VEX_W_0F93_P_0_LEN_0) },
c0f3af97
L
6702 },
6703
ec6f095a 6704 /* VEX_LEN_0F93_P_2 */
c0f3af97 6705 {
ec6f095a 6706 { VEX_W_TABLE (VEX_W_0F93_P_2_LEN_0) },
c0f3af97
L
6707 },
6708
ec6f095a 6709 /* VEX_LEN_0F93_P_3 */
c0f3af97 6710 {
58a211d2 6711 { MOD_TABLE (MOD_VEX_0F93_P_3_LEN_0) },
c0f3af97
L
6712 },
6713
ec6f095a 6714 /* VEX_LEN_0F98_P_0 */
43234a1e
L
6715 {
6716 { VEX_W_TABLE (VEX_W_0F98_P_0_LEN_0) },
6717 },
6718
1ba585e8
IT
6719 /* VEX_LEN_0F98_P_2 */
6720 {
6721 { VEX_W_TABLE (VEX_W_0F98_P_2_LEN_0) },
6722 },
6723
6724 /* VEX_LEN_0F99_P_0 */
6725 {
6726 { VEX_W_TABLE (VEX_W_0F99_P_0_LEN_0) },
6727 },
6728
6729 /* VEX_LEN_0F99_P_2 */
6730 {
6731 { VEX_W_TABLE (VEX_W_0F99_P_2_LEN_0) },
6732 },
6733
6c30d220 6734 /* VEX_LEN_0FAE_R_2_M_0 */
c0f3af97 6735 {
ec6f095a 6736 { "vldmxcsr", { Md }, 0 },
c0f3af97
L
6737 },
6738
6c30d220 6739 /* VEX_LEN_0FAE_R_3_M_0 */
c0f3af97 6740 {
ec6f095a 6741 { "vstmxcsr", { Md }, 0 },
c0f3af97
L
6742 },
6743
7531c613 6744 /* VEX_LEN_0FC4 */
c0f3af97 6745 {
7531c613 6746 { "vpinsrw", { XM, Vex, Edqw, Ib }, PREFIX_DATA },
c0f3af97
L
6747 },
6748
7531c613 6749 /* VEX_LEN_0FC5 */
c0f3af97 6750 {
7531c613 6751 { "vpextrw", { Gdq, XS, Ib }, PREFIX_DATA },
c0f3af97
L
6752 },
6753
7531c613 6754 /* VEX_LEN_0FD6 */
c0f3af97 6755 {
7531c613 6756 { "vmovq", { EXqS, XMScalar }, PREFIX_DATA },
c0f3af97
L
6757 },
6758
7531c613 6759 /* VEX_LEN_0FF7 */
c0f3af97 6760 {
7531c613 6761 { "vmaskmovdqu", { XM, XS }, PREFIX_DATA },
c0f3af97
L
6762 },
6763
7531c613 6764 /* VEX_LEN_0F3816 */
c0f3af97 6765 {
6c30d220 6766 { Bad_Opcode },
7531c613 6767 { VEX_W_TABLE (VEX_W_0F3816_L_1) },
c0f3af97
L
6768 },
6769
7531c613 6770 /* VEX_LEN_0F3819 */
c0f3af97 6771 {
6c30d220 6772 { Bad_Opcode },
7531c613 6773 { VEX_W_TABLE (VEX_W_0F3819_L_1) },
c0f3af97
L
6774 },
6775
7531c613 6776 /* VEX_LEN_0F381A_M_0 */
c0f3af97 6777 {
6c30d220 6778 { Bad_Opcode },
7531c613 6779 { VEX_W_TABLE (VEX_W_0F381A_M_0_L_1) },
c0f3af97
L
6780 },
6781
7531c613 6782 /* VEX_LEN_0F3836 */
c0f3af97 6783 {
6c30d220 6784 { Bad_Opcode },
7531c613 6785 { VEX_W_TABLE (VEX_W_0F3836) },
c0f3af97
L
6786 },
6787
7531c613 6788 /* VEX_LEN_0F3841 */
c0f3af97 6789 {
7531c613 6790 { "vphminposuw", { XM, EXx }, PREFIX_DATA },
c0f3af97
L
6791 },
6792
260cd341
LC
6793 /* VEX_LEN_0F3849_X86_64_P_0_W_0_M_0 */
6794 {
6795 { "ldtilecfg", { M }, 0 },
6796 },
6797
6798 /* VEX_LEN_0F3849_X86_64_P_0_W_0_M_1_REG_0_RM_0 */
6799 {
6800 { "tilerelease", { Skip_MODRM }, 0 },
6801 },
6802
6803 /* VEX_LEN_0F3849_X86_64_P_2_W_0_M_0 */
6804 {
6805 { "sttilecfg", { M }, 0 },
6806 },
6807
6808 /* VEX_LEN_0F3849_X86_64_P_3_W_0_M_0 */
6809 {
6810 { "tilezero", { TMM, Skip_MODRM }, 0 },
6811 },
6812
6813 /* VEX_LEN_0F384B_X86_64_P_1_W_0_M_0 */
6814 {
6815 { "tilestored", { MVexSIBMEM, TMM }, 0 },
6816 },
6817 /* VEX_LEN_0F384B_X86_64_P_2_W_0_M_0 */
6818 {
6819 { "tileloaddt1", { TMM, MVexSIBMEM }, 0 },
6820 },
6821
6822 /* VEX_LEN_0F384B_X86_64_P_3_W_0_M_0 */
6823 {
6824 { "tileloadd", { TMM, MVexSIBMEM }, 0 },
6825 },
6826
7531c613 6827 /* VEX_LEN_0F385A_M_0 */
6c30d220
L
6828 {
6829 { Bad_Opcode },
7531c613 6830 { VEX_W_TABLE (VEX_W_0F385A_M_0_L_0) },
6c30d220
L
6831 },
6832
260cd341
LC
6833 /* VEX_LEN_0F385C_X86_64_P_1_W_0_M_0 */
6834 {
6835 { "tdpbf16ps", { TMM, EXtmm, VexTmm }, 0 },
6836 },
6837
6838 /* VEX_LEN_0F385E_X86_64_P_0_W_0_M_0 */
6839 {
6840 { "tdpbuud", {TMM, EXtmm, VexTmm }, 0 },
6841 },
6842
6843 /* VEX_LEN_0F385E_X86_64_P_1_W_0_M_0 */
6844 {
6845 { "tdpbsud", {TMM, EXtmm, VexTmm }, 0 },
6846 },
6847
6848 /* VEX_LEN_0F385E_X86_64_P_2_W_0_M_0 */
6849 {
6850 { "tdpbusd", {TMM, EXtmm, VexTmm }, 0 },
6851 },
6852
6853 /* VEX_LEN_0F385E_X86_64_P_3_W_0_M_0 */
6854 {
6855 { "tdpbssd", {TMM, EXtmm, VexTmm }, 0 },
6856 },
6857
7531c613 6858 /* VEX_LEN_0F38DB */
a5ff0eb2 6859 {
7531c613 6860 { "vaesimc", { XM, EXx }, PREFIX_DATA },
a5ff0eb2
L
6861 },
6862
035e7389 6863 /* VEX_LEN_0F38F2 */
f12dc422 6864 {
035e7389 6865 { "andnS", { Gdq, VexGdq, Edq }, PREFIX_OPCODE },
f12dc422
L
6866 },
6867
035e7389 6868 /* VEX_LEN_0F38F3_R_1 */
f12dc422 6869 {
035e7389 6870 { "blsrS", { VexGdq, Edq }, PREFIX_OPCODE },
f12dc422
L
6871 },
6872
035e7389 6873 /* VEX_LEN_0F38F3_R_2 */
f12dc422 6874 {
035e7389 6875 { "blsmskS", { VexGdq, Edq }, PREFIX_OPCODE },
f12dc422
L
6876 },
6877
035e7389 6878 /* VEX_LEN_0F38F3_R_3 */
f12dc422 6879 {
035e7389 6880 { "blsiS", { VexGdq, Edq }, PREFIX_OPCODE },
f12dc422
L
6881 },
6882
6c30d220
L
6883 /* VEX_LEN_0F38F5_P_0 */
6884 {
bf890a93 6885 { "bzhiS", { Gdq, Edq, VexGdq }, 0 },
6c30d220
L
6886 },
6887
6888 /* VEX_LEN_0F38F5_P_1 */
6889 {
bf890a93 6890 { "pextS", { Gdq, VexGdq, Edq }, 0 },
6c30d220
L
6891 },
6892
6893 /* VEX_LEN_0F38F5_P_3 */
6894 {
bf890a93 6895 { "pdepS", { Gdq, VexGdq, Edq }, 0 },
6c30d220
L
6896 },
6897
6898 /* VEX_LEN_0F38F6_P_3 */
6899 {
bf890a93 6900 { "mulxS", { Gdq, VexGdq, Edq }, 0 },
6c30d220
L
6901 },
6902
f12dc422
L
6903 /* VEX_LEN_0F38F7_P_0 */
6904 {
bf890a93 6905 { "bextrS", { Gdq, Edq, VexGdq }, 0 },
f12dc422
L
6906 },
6907
6c30d220
L
6908 /* VEX_LEN_0F38F7_P_1 */
6909 {
bf890a93 6910 { "sarxS", { Gdq, Edq, VexGdq }, 0 },
6c30d220
L
6911 },
6912
6913 /* VEX_LEN_0F38F7_P_2 */
6914 {
bf890a93 6915 { "shlxS", { Gdq, Edq, VexGdq }, 0 },
6c30d220
L
6916 },
6917
6918 /* VEX_LEN_0F38F7_P_3 */
6919 {
bf890a93 6920 { "shrxS", { Gdq, Edq, VexGdq }, 0 },
6c30d220
L
6921 },
6922
7531c613 6923 /* VEX_LEN_0F3A00 */
6c30d220
L
6924 {
6925 { Bad_Opcode },
7531c613 6926 { VEX_W_TABLE (VEX_W_0F3A00_L_1) },
6c30d220
L
6927 },
6928
7531c613 6929 /* VEX_LEN_0F3A01 */
6c30d220
L
6930 {
6931 { Bad_Opcode },
7531c613 6932 { VEX_W_TABLE (VEX_W_0F3A01_L_1) },
6c30d220
L
6933 },
6934
7531c613 6935 /* VEX_LEN_0F3A06 */
c0f3af97 6936 {
592d1631 6937 { Bad_Opcode },
7531c613 6938 { VEX_W_TABLE (VEX_W_0F3A06_L_1) },
c0f3af97
L
6939 },
6940
7531c613 6941 /* VEX_LEN_0F3A14 */
c0f3af97 6942 {
7531c613 6943 { "vpextrb", { Edqb, XM, Ib }, PREFIX_DATA },
c0f3af97
L
6944 },
6945
7531c613 6946 /* VEX_LEN_0F3A15 */
c0f3af97 6947 {
7531c613 6948 { "vpextrw", { Edqw, XM, Ib }, PREFIX_DATA },
c0f3af97
L
6949 },
6950
7531c613 6951 /* VEX_LEN_0F3A16 */
c0f3af97 6952 {
7531c613 6953 { "vpextrK", { Edq, XM, Ib }, PREFIX_DATA },
c0f3af97
L
6954 },
6955
7531c613 6956 /* VEX_LEN_0F3A17 */
c0f3af97 6957 {
7531c613 6958 { "vextractps", { Edqd, XM, Ib }, PREFIX_DATA },
c0f3af97
L
6959 },
6960
7531c613 6961 /* VEX_LEN_0F3A18 */
c0f3af97 6962 {
592d1631 6963 { Bad_Opcode },
7531c613 6964 { VEX_W_TABLE (VEX_W_0F3A18_L_1) },
c0f3af97
L
6965 },
6966
7531c613 6967 /* VEX_LEN_0F3A19 */
c0f3af97 6968 {
592d1631 6969 { Bad_Opcode },
7531c613 6970 { VEX_W_TABLE (VEX_W_0F3A19_L_1) },
c0f3af97
L
6971 },
6972
7531c613 6973 /* VEX_LEN_0F3A20 */
c0f3af97 6974 {
7531c613 6975 { "vpinsrb", { XM, Vex, Edqb, Ib }, PREFIX_DATA },
c0f3af97
L
6976 },
6977
7531c613 6978 /* VEX_LEN_0F3A21 */
c0f3af97 6979 {
7531c613 6980 { "vinsertps", { XM, Vex, EXd, Ib }, PREFIX_DATA },
c0f3af97
L
6981 },
6982
7531c613 6983 /* VEX_LEN_0F3A22 */
c0f3af97 6984 {
7531c613 6985 { "vpinsrK", { XM, Vex, Edq, Ib }, PREFIX_DATA },
c0f3af97
L
6986 },
6987
7531c613 6988 /* VEX_LEN_0F3A30 */
43234a1e 6989 {
bb5b3501 6990 { MOD_TABLE (MOD_VEX_0F3A30_L_0) },
43234a1e
L
6991 },
6992
7531c613 6993 /* VEX_LEN_0F3A31 */
1ba585e8 6994 {
bb5b3501 6995 { MOD_TABLE (MOD_VEX_0F3A31_L_0) },
1ba585e8
IT
6996 },
6997
7531c613 6998 /* VEX_LEN_0F3A32 */
43234a1e 6999 {
bb5b3501 7000 { MOD_TABLE (MOD_VEX_0F3A32_L_0) },
43234a1e
L
7001 },
7002
7531c613 7003 /* VEX_LEN_0F3A33 */
1ba585e8 7004 {
bb5b3501 7005 { MOD_TABLE (MOD_VEX_0F3A33_L_0) },
1ba585e8
IT
7006 },
7007
7531c613 7008 /* VEX_LEN_0F3A38 */
c0f3af97 7009 {
6c30d220 7010 { Bad_Opcode },
7531c613 7011 { VEX_W_TABLE (VEX_W_0F3A38_L_1) },
c0f3af97
L
7012 },
7013
7531c613 7014 /* VEX_LEN_0F3A39 */
c0f3af97 7015 {
6c30d220 7016 { Bad_Opcode },
7531c613 7017 { VEX_W_TABLE (VEX_W_0F3A39_L_1) },
6c30d220
L
7018 },
7019
7531c613 7020 /* VEX_LEN_0F3A41 */
6c30d220 7021 {
7531c613 7022 { "vdppd", { XM, Vex, EXx, Ib }, PREFIX_DATA },
c0f3af97
L
7023 },
7024
7531c613 7025 /* VEX_LEN_0F3A46 */
c0f3af97 7026 {
6c30d220 7027 { Bad_Opcode },
7531c613 7028 { VEX_W_TABLE (VEX_W_0F3A46_L_1) },
c0f3af97
L
7029 },
7030
7531c613 7031 /* VEX_LEN_0F3A60 */
c0f3af97 7032 {
7531c613 7033 { "vpcmpestrm!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
c0f3af97
L
7034 },
7035
7531c613 7036 /* VEX_LEN_0F3A61 */
c0f3af97 7037 {
7531c613 7038 { "vpcmpestri!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
c0f3af97
L
7039 },
7040
7531c613 7041 /* VEX_LEN_0F3A62 */
c0f3af97 7042 {
7531c613 7043 { "vpcmpistrm", { XM, EXx, Ib }, PREFIX_DATA },
c0f3af97
L
7044 },
7045
7531c613 7046 /* VEX_LEN_0F3A63 */
c0f3af97 7047 {
7531c613 7048 { "vpcmpistri", { XM, EXx, Ib }, PREFIX_DATA },
c0f3af97
L
7049 },
7050
7531c613 7051 /* VEX_LEN_0F3ADF */
a5ff0eb2 7052 {
7531c613 7053 { "vaeskeygenassist", { XM, EXx, Ib }, PREFIX_DATA },
a5ff0eb2 7054 },
4c807e72 7055
6c30d220
L
7056 /* VEX_LEN_0F3AF0_P_3 */
7057 {
bf890a93 7058 { "rorxS", { Gdq, Edq, Ib }, 0 },
6c30d220
L
7059 },
7060
467bbef0
JB
7061 /* VEX_LEN_0FXOP_08_85 */
7062 {
7063 { VEX_W_TABLE (VEX_W_0FXOP_08_85_L_0) },
7064 },
7065
7066 /* VEX_LEN_0FXOP_08_86 */
7067 {
7068 { VEX_W_TABLE (VEX_W_0FXOP_08_86_L_0) },
7069 },
7070
7071 /* VEX_LEN_0FXOP_08_87 */
7072 {
7073 { VEX_W_TABLE (VEX_W_0FXOP_08_87_L_0) },
7074 },
7075
7076 /* VEX_LEN_0FXOP_08_8E */
7077 {
7078 { VEX_W_TABLE (VEX_W_0FXOP_08_8E_L_0) },
7079 },
7080
7081 /* VEX_LEN_0FXOP_08_8F */
7082 {
7083 { VEX_W_TABLE (VEX_W_0FXOP_08_8F_L_0) },
7084 },
7085
7086 /* VEX_LEN_0FXOP_08_95 */
7087 {
7088 { VEX_W_TABLE (VEX_W_0FXOP_08_95_L_0) },
7089 },
7090
7091 /* VEX_LEN_0FXOP_08_96 */
7092 {
7093 { VEX_W_TABLE (VEX_W_0FXOP_08_96_L_0) },
7094 },
7095
7096 /* VEX_LEN_0FXOP_08_97 */
7097 {
7098 { VEX_W_TABLE (VEX_W_0FXOP_08_97_L_0) },
7099 },
7100
7101 /* VEX_LEN_0FXOP_08_9E */
7102 {
7103 { VEX_W_TABLE (VEX_W_0FXOP_08_9E_L_0) },
7104 },
7105
7106 /* VEX_LEN_0FXOP_08_9F */
7107 {
7108 { VEX_W_TABLE (VEX_W_0FXOP_08_9F_L_0) },
7109 },
7110
7111 /* VEX_LEN_0FXOP_08_A3 */
7112 {
7113 { "vpperm", { XM, Vex, EXx, XMVexI4 }, 0 },
7114 },
7115
7116 /* VEX_LEN_0FXOP_08_A6 */
7117 {
7118 { VEX_W_TABLE (VEX_W_0FXOP_08_A6_L_0) },
7119 },
7120
7121 /* VEX_LEN_0FXOP_08_B6 */
7122 {
7123 { VEX_W_TABLE (VEX_W_0FXOP_08_B6_L_0) },
7124 },
7125
7126 /* VEX_LEN_0FXOP_08_C0 */
7127 {
7128 { VEX_W_TABLE (VEX_W_0FXOP_08_C0_L_0) },
7129 },
7130
7131 /* VEX_LEN_0FXOP_08_C1 */
7132 {
7133 { VEX_W_TABLE (VEX_W_0FXOP_08_C1_L_0) },
7134 },
7135
7136 /* VEX_LEN_0FXOP_08_C2 */
7137 {
7138 { VEX_W_TABLE (VEX_W_0FXOP_08_C2_L_0) },
7139 },
7140
7141 /* VEX_LEN_0FXOP_08_C3 */
7142 {
7143 { VEX_W_TABLE (VEX_W_0FXOP_08_C3_L_0) },
7144 },
7145
ff688e1f
L
7146 /* VEX_LEN_0FXOP_08_CC */
7147 {
467bbef0 7148 { VEX_W_TABLE (VEX_W_0FXOP_08_CC_L_0) },
ff688e1f
L
7149 },
7150
7151 /* VEX_LEN_0FXOP_08_CD */
7152 {
467bbef0 7153 { VEX_W_TABLE (VEX_W_0FXOP_08_CD_L_0) },
ff688e1f
L
7154 },
7155
7156 /* VEX_LEN_0FXOP_08_CE */
7157 {
467bbef0 7158 { VEX_W_TABLE (VEX_W_0FXOP_08_CE_L_0) },
ff688e1f
L
7159 },
7160
7161 /* VEX_LEN_0FXOP_08_CF */
7162 {
467bbef0 7163 { VEX_W_TABLE (VEX_W_0FXOP_08_CF_L_0) },
ff688e1f
L
7164 },
7165
7166 /* VEX_LEN_0FXOP_08_EC */
7167 {
467bbef0 7168 { VEX_W_TABLE (VEX_W_0FXOP_08_EC_L_0) },
ff688e1f
L
7169 },
7170
7171 /* VEX_LEN_0FXOP_08_ED */
7172 {
467bbef0 7173 { VEX_W_TABLE (VEX_W_0FXOP_08_ED_L_0) },
ff688e1f
L
7174 },
7175
7176 /* VEX_LEN_0FXOP_08_EE */
7177 {
467bbef0 7178 { VEX_W_TABLE (VEX_W_0FXOP_08_EE_L_0) },
ff688e1f
L
7179 },
7180
7181 /* VEX_LEN_0FXOP_08_EF */
7182 {
467bbef0
JB
7183 { VEX_W_TABLE (VEX_W_0FXOP_08_EF_L_0) },
7184 },
7185
7186 /* VEX_LEN_0FXOP_09_01 */
7187 {
7188 { REG_TABLE (REG_0FXOP_09_01_L_0) },
7189 },
7190
7191 /* VEX_LEN_0FXOP_09_02 */
7192 {
7193 { REG_TABLE (REG_0FXOP_09_02_L_0) },
7194 },
7195
7196 /* VEX_LEN_0FXOP_09_12_M_1 */
7197 {
7198 { REG_TABLE (REG_0FXOP_09_12_M_1_L_0) },
ff688e1f
L
7199 },
7200
b5b098c2 7201 /* VEX_LEN_0FXOP_09_82_W_0 */
5dd85c99 7202 {
b5b098c2 7203 { "vfrczss", { XM, EXd }, 0 },
5dd85c99 7204 },
4c807e72 7205
b5b098c2 7206 /* VEX_LEN_0FXOP_09_83_W_0 */
5dd85c99 7207 {
b5b098c2 7208 { "vfrczsd", { XM, EXq }, 0 },
5dd85c99 7209 },
467bbef0
JB
7210
7211 /* VEX_LEN_0FXOP_09_90 */
7212 {
7213 { "vprotb", { XM, EXx, VexW }, 0 },
7214 },
7215
7216 /* VEX_LEN_0FXOP_09_91 */
7217 {
7218 { "vprotw", { XM, EXx, VexW }, 0 },
7219 },
7220
7221 /* VEX_LEN_0FXOP_09_92 */
7222 {
7223 { "vprotd", { XM, EXx, VexW }, 0 },
7224 },
7225
7226 /* VEX_LEN_0FXOP_09_93 */
7227 {
7228 { "vprotq", { XM, EXx, VexW }, 0 },
7229 },
7230
7231 /* VEX_LEN_0FXOP_09_94 */
7232 {
7233 { "vpshlb", { XM, EXx, VexW }, 0 },
7234 },
7235
7236 /* VEX_LEN_0FXOP_09_95 */
7237 {
7238 { "vpshlw", { XM, EXx, VexW }, 0 },
7239 },
7240
7241 /* VEX_LEN_0FXOP_09_96 */
7242 {
7243 { "vpshld", { XM, EXx, VexW }, 0 },
7244 },
7245
7246 /* VEX_LEN_0FXOP_09_97 */
7247 {
7248 { "vpshlq", { XM, EXx, VexW }, 0 },
7249 },
7250
7251 /* VEX_LEN_0FXOP_09_98 */
7252 {
7253 { "vpshab", { XM, EXx, VexW }, 0 },
7254 },
7255
7256 /* VEX_LEN_0FXOP_09_99 */
7257 {
7258 { "vpshaw", { XM, EXx, VexW }, 0 },
7259 },
7260
7261 /* VEX_LEN_0FXOP_09_9A */
7262 {
7263 { "vpshad", { XM, EXx, VexW }, 0 },
7264 },
7265
7266 /* VEX_LEN_0FXOP_09_9B */
7267 {
7268 { "vpshaq", { XM, EXx, VexW }, 0 },
7269 },
7270
7271 /* VEX_LEN_0FXOP_09_C1 */
7272 {
7273 { VEX_W_TABLE (VEX_W_0FXOP_09_C1_L_0) },
7274 },
7275
7276 /* VEX_LEN_0FXOP_09_C2 */
7277 {
7278 { VEX_W_TABLE (VEX_W_0FXOP_09_C2_L_0) },
7279 },
7280
7281 /* VEX_LEN_0FXOP_09_C3 */
7282 {
7283 { VEX_W_TABLE (VEX_W_0FXOP_09_C3_L_0) },
7284 },
7285
7286 /* VEX_LEN_0FXOP_09_C6 */
7287 {
7288 { VEX_W_TABLE (VEX_W_0FXOP_09_C6_L_0) },
7289 },
7290
7291 /* VEX_LEN_0FXOP_09_C7 */
7292 {
7293 { VEX_W_TABLE (VEX_W_0FXOP_09_C7_L_0) },
7294 },
7295
7296 /* VEX_LEN_0FXOP_09_CB */
7297 {
7298 { VEX_W_TABLE (VEX_W_0FXOP_09_CB_L_0) },
7299 },
7300
7301 /* VEX_LEN_0FXOP_09_D1 */
7302 {
7303 { VEX_W_TABLE (VEX_W_0FXOP_09_D1_L_0) },
7304 },
7305
7306 /* VEX_LEN_0FXOP_09_D2 */
7307 {
7308 { VEX_W_TABLE (VEX_W_0FXOP_09_D2_L_0) },
7309 },
7310
7311 /* VEX_LEN_0FXOP_09_D3 */
7312 {
7313 { VEX_W_TABLE (VEX_W_0FXOP_09_D3_L_0) },
7314 },
7315
7316 /* VEX_LEN_0FXOP_09_D6 */
7317 {
7318 { VEX_W_TABLE (VEX_W_0FXOP_09_D6_L_0) },
7319 },
7320
7321 /* VEX_LEN_0FXOP_09_D7 */
7322 {
7323 { VEX_W_TABLE (VEX_W_0FXOP_09_D7_L_0) },
7324 },
7325
7326 /* VEX_LEN_0FXOP_09_DB */
7327 {
7328 { VEX_W_TABLE (VEX_W_0FXOP_09_DB_L_0) },
7329 },
7330
7331 /* VEX_LEN_0FXOP_09_E1 */
7332 {
7333 { VEX_W_TABLE (VEX_W_0FXOP_09_E1_L_0) },
7334 },
7335
7336 /* VEX_LEN_0FXOP_09_E2 */
7337 {
7338 { VEX_W_TABLE (VEX_W_0FXOP_09_E2_L_0) },
7339 },
7340
7341 /* VEX_LEN_0FXOP_09_E3 */
7342 {
7343 { VEX_W_TABLE (VEX_W_0FXOP_09_E3_L_0) },
7344 },
7345
7346 /* VEX_LEN_0FXOP_0A_12 */
7347 {
7348 { REG_TABLE (REG_0FXOP_0A_12_L_0) },
7349 },
331d2d0d
L
7350};
7351
ad692897 7352#include "i386-dis-evex-len.h"
04e2a182 7353
9e30b8e0 7354static const struct dis386 vex_w_table[][2] = {
43234a1e
L
7355 {
7356 /* VEX_W_0F41_P_0_LEN_1 */
ab4e4ed5
AF
7357 { MOD_TABLE (MOD_VEX_W_0_0F41_P_0_LEN_1) },
7358 { MOD_TABLE (MOD_VEX_W_1_0F41_P_0_LEN_1) },
1ba585e8
IT
7359 },
7360 {
7361 /* VEX_W_0F41_P_2_LEN_1 */
ab4e4ed5
AF
7362 { MOD_TABLE (MOD_VEX_W_0_0F41_P_2_LEN_1) },
7363 { MOD_TABLE (MOD_VEX_W_1_0F41_P_2_LEN_1) }
43234a1e
L
7364 },
7365 {
7366 /* VEX_W_0F42_P_0_LEN_1 */
ab4e4ed5
AF
7367 { MOD_TABLE (MOD_VEX_W_0_0F42_P_0_LEN_1) },
7368 { MOD_TABLE (MOD_VEX_W_1_0F42_P_0_LEN_1) },
1ba585e8
IT
7369 },
7370 {
7371 /* VEX_W_0F42_P_2_LEN_1 */
ab4e4ed5
AF
7372 { MOD_TABLE (MOD_VEX_W_0_0F42_P_2_LEN_1) },
7373 { MOD_TABLE (MOD_VEX_W_1_0F42_P_2_LEN_1) },
43234a1e
L
7374 },
7375 {
7376 /* VEX_W_0F44_P_0_LEN_0 */
ab4e4ed5
AF
7377 { MOD_TABLE (MOD_VEX_W_0_0F44_P_0_LEN_1) },
7378 { MOD_TABLE (MOD_VEX_W_1_0F44_P_0_LEN_1) },
1ba585e8
IT
7379 },
7380 {
7381 /* VEX_W_0F44_P_2_LEN_0 */
ab4e4ed5
AF
7382 { MOD_TABLE (MOD_VEX_W_0_0F44_P_2_LEN_1) },
7383 { MOD_TABLE (MOD_VEX_W_1_0F44_P_2_LEN_1) },
43234a1e
L
7384 },
7385 {
ec6f095a
L
7386 /* VEX_W_0F45_P_0_LEN_1 */
7387 { MOD_TABLE (MOD_VEX_W_0_0F45_P_0_LEN_1) },
7388 { MOD_TABLE (MOD_VEX_W_1_0F45_P_0_LEN_1) },
9e30b8e0
L
7389 },
7390 {
ec6f095a
L
7391 /* VEX_W_0F45_P_2_LEN_1 */
7392 { MOD_TABLE (MOD_VEX_W_0_0F45_P_2_LEN_1) },
7393 { MOD_TABLE (MOD_VEX_W_1_0F45_P_2_LEN_1) },
9e30b8e0
L
7394 },
7395 {
ec6f095a
L
7396 /* VEX_W_0F46_P_0_LEN_1 */
7397 { MOD_TABLE (MOD_VEX_W_0_0F46_P_0_LEN_1) },
7398 { MOD_TABLE (MOD_VEX_W_1_0F46_P_0_LEN_1) },
9e30b8e0
L
7399 },
7400 {
ec6f095a
L
7401 /* VEX_W_0F46_P_2_LEN_1 */
7402 { MOD_TABLE (MOD_VEX_W_0_0F46_P_2_LEN_1) },
7403 { MOD_TABLE (MOD_VEX_W_1_0F46_P_2_LEN_1) },
9e30b8e0
L
7404 },
7405 {
ec6f095a
L
7406 /* VEX_W_0F47_P_0_LEN_1 */
7407 { MOD_TABLE (MOD_VEX_W_0_0F47_P_0_LEN_1) },
7408 { MOD_TABLE (MOD_VEX_W_1_0F47_P_0_LEN_1) },
9e30b8e0
L
7409 },
7410 {
ec6f095a
L
7411 /* VEX_W_0F47_P_2_LEN_1 */
7412 { MOD_TABLE (MOD_VEX_W_0_0F47_P_2_LEN_1) },
7413 { MOD_TABLE (MOD_VEX_W_1_0F47_P_2_LEN_1) },
9e30b8e0
L
7414 },
7415 {
ec6f095a
L
7416 /* VEX_W_0F4A_P_0_LEN_1 */
7417 { MOD_TABLE (MOD_VEX_W_0_0F4A_P_0_LEN_1) },
7418 { MOD_TABLE (MOD_VEX_W_1_0F4A_P_0_LEN_1) },
9e30b8e0
L
7419 },
7420 {
ec6f095a
L
7421 /* VEX_W_0F4A_P_2_LEN_1 */
7422 { MOD_TABLE (MOD_VEX_W_0_0F4A_P_2_LEN_1) },
7423 { MOD_TABLE (MOD_VEX_W_1_0F4A_P_2_LEN_1) },
9e30b8e0
L
7424 },
7425 {
ec6f095a
L
7426 /* VEX_W_0F4B_P_0_LEN_1 */
7427 { MOD_TABLE (MOD_VEX_W_0_0F4B_P_0_LEN_1) },
7428 { MOD_TABLE (MOD_VEX_W_1_0F4B_P_0_LEN_1) },
9e30b8e0
L
7429 },
7430 {
ec6f095a
L
7431 /* VEX_W_0F4B_P_2_LEN_1 */
7432 { MOD_TABLE (MOD_VEX_W_0_0F4B_P_2_LEN_1) },
9e30b8e0
L
7433 },
7434 {
ec6f095a
L
7435 /* VEX_W_0F90_P_0_LEN_0 */
7436 { "kmovw", { MaskG, MaskE }, 0 },
7437 { "kmovq", { MaskG, MaskE }, 0 },
9e30b8e0
L
7438 },
7439 {
ec6f095a
L
7440 /* VEX_W_0F90_P_2_LEN_0 */
7441 { "kmovb", { MaskG, MaskBDE }, 0 },
7442 { "kmovd", { MaskG, MaskBDE }, 0 },
9e30b8e0
L
7443 },
7444 {
ec6f095a
L
7445 /* VEX_W_0F91_P_0_LEN_0 */
7446 { MOD_TABLE (MOD_VEX_W_0_0F91_P_0_LEN_0) },
7447 { MOD_TABLE (MOD_VEX_W_1_0F91_P_0_LEN_0) },
9e30b8e0
L
7448 },
7449 {
ec6f095a
L
7450 /* VEX_W_0F91_P_2_LEN_0 */
7451 { MOD_TABLE (MOD_VEX_W_0_0F91_P_2_LEN_0) },
7452 { MOD_TABLE (MOD_VEX_W_1_0F91_P_2_LEN_0) },
9e30b8e0
L
7453 },
7454 {
ec6f095a
L
7455 /* VEX_W_0F92_P_0_LEN_0 */
7456 { MOD_TABLE (MOD_VEX_W_0_0F92_P_0_LEN_0) },
9e30b8e0
L
7457 },
7458 {
ec6f095a
L
7459 /* VEX_W_0F92_P_2_LEN_0 */
7460 { MOD_TABLE (MOD_VEX_W_0_0F92_P_2_LEN_0) },
9e30b8e0 7461 },
9e30b8e0 7462 {
ec6f095a
L
7463 /* VEX_W_0F93_P_0_LEN_0 */
7464 { MOD_TABLE (MOD_VEX_W_0_0F93_P_0_LEN_0) },
9e30b8e0
L
7465 },
7466 {
ec6f095a
L
7467 /* VEX_W_0F93_P_2_LEN_0 */
7468 { MOD_TABLE (MOD_VEX_W_0_0F93_P_2_LEN_0) },
9e30b8e0 7469 },
9e30b8e0 7470 {
ec6f095a
L
7471 /* VEX_W_0F98_P_0_LEN_0 */
7472 { MOD_TABLE (MOD_VEX_W_0_0F98_P_0_LEN_0) },
7473 { MOD_TABLE (MOD_VEX_W_1_0F98_P_0_LEN_0) },
9e30b8e0
L
7474 },
7475 {
ec6f095a
L
7476 /* VEX_W_0F98_P_2_LEN_0 */
7477 { MOD_TABLE (MOD_VEX_W_0_0F98_P_2_LEN_0) },
7478 { MOD_TABLE (MOD_VEX_W_1_0F98_P_2_LEN_0) },
9e30b8e0
L
7479 },
7480 {
ec6f095a
L
7481 /* VEX_W_0F99_P_0_LEN_0 */
7482 { MOD_TABLE (MOD_VEX_W_0_0F99_P_0_LEN_0) },
7483 { MOD_TABLE (MOD_VEX_W_1_0F99_P_0_LEN_0) },
9e30b8e0
L
7484 },
7485 {
ec6f095a
L
7486 /* VEX_W_0F99_P_2_LEN_0 */
7487 { MOD_TABLE (MOD_VEX_W_0_0F99_P_2_LEN_0) },
7488 { MOD_TABLE (MOD_VEX_W_1_0F99_P_2_LEN_0) },
9e30b8e0 7489 },
9e30b8e0 7490 {
7531c613
JB
7491 /* VEX_W_0F380C */
7492 { "vpermilps", { XM, Vex, EXx }, PREFIX_DATA },
9e30b8e0
L
7493 },
7494 {
7531c613
JB
7495 /* VEX_W_0F380D */
7496 { "vpermilpd", { XM, Vex, EXx }, PREFIX_DATA },
9e30b8e0
L
7497 },
7498 {
7531c613
JB
7499 /* VEX_W_0F380E */
7500 { "vtestps", { XM, EXx }, PREFIX_DATA },
9e30b8e0
L
7501 },
7502 {
7531c613
JB
7503 /* VEX_W_0F380F */
7504 { "vtestpd", { XM, EXx }, PREFIX_DATA },
9e30b8e0 7505 },
6431c801 7506 {
7531c613
JB
7507 /* VEX_W_0F3813 */
7508 { "vcvtph2ps", { XM, EXxmmq }, PREFIX_DATA },
6431c801 7509 },
6c30d220 7510 {
7531c613
JB
7511 /* VEX_W_0F3816_L_1 */
7512 { "vpermps", { XM, Vex, EXx }, PREFIX_DATA },
6c30d220 7513 },
bcf2684f 7514 {
7531c613
JB
7515 /* VEX_W_0F3818 */
7516 { "vbroadcastss", { XM, EXxmm_md }, PREFIX_DATA },
bcf2684f 7517 },
9e30b8e0 7518 {
7531c613
JB
7519 /* VEX_W_0F3819_L_1 */
7520 { "vbroadcastsd", { XM, EXxmm_mq }, PREFIX_DATA },
9e30b8e0
L
7521 },
7522 {
7531c613
JB
7523 /* VEX_W_0F381A_M_0_L_1 */
7524 { "vbroadcastf128", { XM, Mxmm }, PREFIX_DATA },
9e30b8e0 7525 },
53aa04a0 7526 {
7531c613
JB
7527 /* VEX_W_0F382C_M_0 */
7528 { "vmaskmovps", { XM, Vex, Mx }, PREFIX_DATA },
53aa04a0
L
7529 },
7530 {
7531c613
JB
7531 /* VEX_W_0F382D_M_0 */
7532 { "vmaskmovpd", { XM, Vex, Mx }, PREFIX_DATA },
53aa04a0
L
7533 },
7534 {
7531c613
JB
7535 /* VEX_W_0F382E_M_0 */
7536 { "vmaskmovps", { Mx, Vex, XM }, PREFIX_DATA },
53aa04a0
L
7537 },
7538 {
7531c613
JB
7539 /* VEX_W_0F382F_M_0 */
7540 { "vmaskmovpd", { Mx, Vex, XM }, PREFIX_DATA },
53aa04a0 7541 },
6c30d220 7542 {
7531c613
JB
7543 /* VEX_W_0F3836 */
7544 { "vpermd", { XM, Vex, EXx }, PREFIX_DATA },
9e30b8e0 7545 },
6c30d220 7546 {
7531c613
JB
7547 /* VEX_W_0F3846 */
7548 { "vpsravd", { XM, Vex, EXx }, PREFIX_DATA },
6c30d220 7549 },
260cd341
LC
7550 {
7551 /* VEX_W_0F3849_X86_64_P_0 */
7552 { MOD_TABLE (MOD_VEX_0F3849_X86_64_P_0_W_0) },
7553 },
7554 {
7555 /* VEX_W_0F3849_X86_64_P_2 */
7556 { MOD_TABLE (MOD_VEX_0F3849_X86_64_P_2_W_0) },
7557 },
7558 {
7559 /* VEX_W_0F3849_X86_64_P_3 */
7560 { MOD_TABLE (MOD_VEX_0F3849_X86_64_P_3_W_0) },
7561 },
7562 {
7563 /* VEX_W_0F384B_X86_64_P_1 */
7564 { MOD_TABLE (MOD_VEX_0F384B_X86_64_P_1_W_0) },
7565 },
7566 {
7567 /* VEX_W_0F384B_X86_64_P_2 */
7568 { MOD_TABLE (MOD_VEX_0F384B_X86_64_P_2_W_0) },
7569 },
7570 {
7571 /* VEX_W_0F384B_X86_64_P_3 */
7572 { MOD_TABLE (MOD_VEX_0F384B_X86_64_P_3_W_0) },
7573 },
6c30d220 7574 {
7531c613
JB
7575 /* VEX_W_0F3858 */
7576 { "vpbroadcastd", { XM, EXxmm_md }, PREFIX_DATA },
6c30d220
L
7577 },
7578 {
7531c613
JB
7579 /* VEX_W_0F3859 */
7580 { "vpbroadcastq", { XM, EXxmm_mq }, PREFIX_DATA },
6c30d220
L
7581 },
7582 {
7531c613
JB
7583 /* VEX_W_0F385A_M_0_L_0 */
7584 { "vbroadcasti128", { XM, Mxmm }, PREFIX_DATA },
6c30d220 7585 },
260cd341
LC
7586 {
7587 /* VEX_W_0F385C_X86_64_P_1 */
7588 { MOD_TABLE (MOD_VEX_0F385C_X86_64_P_1_W_0) },
7589 },
7590 {
7591 /* VEX_W_0F385E_X86_64_P_0 */
7592 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_0_W_0) },
7593 },
7594 {
7595 /* VEX_W_0F385E_X86_64_P_1 */
7596 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_1_W_0) },
7597 },
7598 {
7599 /* VEX_W_0F385E_X86_64_P_2 */
7600 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_2_W_0) },
7601 },
7602 {
7603 /* VEX_W_0F385E_X86_64_P_3 */
7604 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_3_W_0) },
7605 },
6c30d220 7606 {
7531c613
JB
7607 /* VEX_W_0F3878 */
7608 { "vpbroadcastb", { XM, EXxmm_mb }, PREFIX_DATA },
6c30d220
L
7609 },
7610 {
7531c613
JB
7611 /* VEX_W_0F3879 */
7612 { "vpbroadcastw", { XM, EXxmm_mw }, PREFIX_DATA },
6c30d220 7613 },
48521003 7614 {
7531c613
JB
7615 /* VEX_W_0F38CF */
7616 { "vgf2p8mulb", { XM, Vex, EXx }, PREFIX_DATA },
48521003 7617 },
6c30d220 7618 {
7531c613 7619 /* VEX_W_0F3A00_L_1 */
6c30d220 7620 { Bad_Opcode },
7531c613 7621 { "vpermq", { XM, EXx, Ib }, PREFIX_DATA },
6c30d220
L
7622 },
7623 {
7531c613 7624 /* VEX_W_0F3A01_L_1 */
6c30d220 7625 { Bad_Opcode },
7531c613 7626 { "vpermpd", { XM, EXx, Ib }, PREFIX_DATA },
6c30d220
L
7627 },
7628 {
7531c613
JB
7629 /* VEX_W_0F3A02 */
7630 { "vpblendd", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6c30d220 7631 },
9e30b8e0 7632 {
7531c613
JB
7633 /* VEX_W_0F3A04 */
7634 { "vpermilps", { XM, EXx, Ib }, PREFIX_DATA },
9e30b8e0
L
7635 },
7636 {
7531c613
JB
7637 /* VEX_W_0F3A05 */
7638 { "vpermilpd", { XM, EXx, Ib }, PREFIX_DATA },
9e30b8e0
L
7639 },
7640 {
7531c613
JB
7641 /* VEX_W_0F3A06_L_1 */
7642 { "vperm2f128", { XM, Vex, EXx, Ib }, PREFIX_DATA },
9e30b8e0 7643 },
9e30b8e0 7644 {
7531c613
JB
7645 /* VEX_W_0F3A18_L_1 */
7646 { "vinsertf128", { XM, Vex, EXxmm, Ib }, PREFIX_DATA },
9e30b8e0
L
7647 },
7648 {
7531c613
JB
7649 /* VEX_W_0F3A19_L_1 */
7650 { "vextractf128", { EXxmm, XM, Ib }, PREFIX_DATA },
9e30b8e0 7651 },
6431c801 7652 {
7531c613
JB
7653 /* VEX_W_0F3A1D */
7654 { "vcvtps2ph", { EXxmmq, XM, EXxEVexS, Ib }, PREFIX_DATA },
6431c801 7655 },
6c30d220 7656 {
7531c613
JB
7657 /* VEX_W_0F3A38_L_1 */
7658 { "vinserti128", { XM, Vex, EXxmm, Ib }, PREFIX_DATA },
6c30d220
L
7659 },
7660 {
7531c613
JB
7661 /* VEX_W_0F3A39_L_1 */
7662 { "vextracti128", { EXxmm, XM, Ib }, PREFIX_DATA },
6c30d220 7663 },
6c30d220 7664 {
7531c613
JB
7665 /* VEX_W_0F3A46_L_1 */
7666 { "vperm2i128", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6c30d220 7667 },
9e30b8e0 7668 {
7531c613
JB
7669 /* VEX_W_0F3A4A */
7670 { "vblendvps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
9e30b8e0
L
7671 },
7672 {
7531c613
JB
7673 /* VEX_W_0F3A4B */
7674 { "vblendvpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
9e30b8e0
L
7675 },
7676 {
7531c613
JB
7677 /* VEX_W_0F3A4C */
7678 { "vpblendvb", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
9e30b8e0 7679 },
48521003 7680 {
7531c613 7681 /* VEX_W_0F3ACE */
48521003 7682 { Bad_Opcode },
7531c613 7683 { "vgf2p8affineqb", { XM, Vex, EXx, Ib }, PREFIX_DATA },
48521003
IT
7684 },
7685 {
7531c613 7686 /* VEX_W_0F3ACF */
48521003 7687 { Bad_Opcode },
7531c613 7688 { "vgf2p8affineinvqb", { XM, Vex, EXx, Ib }, PREFIX_DATA },
48521003 7689 },
467bbef0
JB
7690 /* VEX_W_0FXOP_08_85_L_0 */
7691 {
7692 { "vpmacssww", { XM, Vex, EXx, XMVexI4 }, 0 },
7693 },
7694 /* VEX_W_0FXOP_08_86_L_0 */
7695 {
7696 { "vpmacsswd", { XM, Vex, EXx, XMVexI4 }, 0 },
7697 },
7698 /* VEX_W_0FXOP_08_87_L_0 */
7699 {
7700 { "vpmacssdql", { XM, Vex, EXx, XMVexI4 }, 0 },
7701 },
7702 /* VEX_W_0FXOP_08_8E_L_0 */
7703 {
7704 { "vpmacssdd", { XM, Vex, EXx, XMVexI4 }, 0 },
7705 },
7706 /* VEX_W_0FXOP_08_8F_L_0 */
7707 {
7708 { "vpmacssdqh", { XM, Vex, EXx, XMVexI4 }, 0 },
7709 },
7710 /* VEX_W_0FXOP_08_95_L_0 */
7711 {
7712 { "vpmacsww", { XM, Vex, EXx, XMVexI4 }, 0 },
7713 },
7714 /* VEX_W_0FXOP_08_96_L_0 */
7715 {
7716 { "vpmacswd", { XM, Vex, EXx, XMVexI4 }, 0 },
7717 },
7718 /* VEX_W_0FXOP_08_97_L_0 */
7719 {
7720 { "vpmacsdql", { XM, Vex, EXx, XMVexI4 }, 0 },
7721 },
7722 /* VEX_W_0FXOP_08_9E_L_0 */
7723 {
7724 { "vpmacsdd", { XM, Vex, EXx, XMVexI4 }, 0 },
7725 },
7726 /* VEX_W_0FXOP_08_9F_L_0 */
7727 {
7728 { "vpmacsdqh", { XM, Vex, EXx, XMVexI4 }, 0 },
7729 },
7730 /* VEX_W_0FXOP_08_A6_L_0 */
7731 {
7732 { "vpmadcsswd", { XM, Vex, EXx, XMVexI4 }, 0 },
7733 },
7734 /* VEX_W_0FXOP_08_B6_L_0 */
7735 {
7736 { "vpmadcswd", { XM, Vex, EXx, XMVexI4 }, 0 },
7737 },
7738 /* VEX_W_0FXOP_08_C0_L_0 */
7739 {
7740 { "vprotb", { XM, EXx, Ib }, 0 },
7741 },
7742 /* VEX_W_0FXOP_08_C1_L_0 */
7743 {
7744 { "vprotw", { XM, EXx, Ib }, 0 },
7745 },
7746 /* VEX_W_0FXOP_08_C2_L_0 */
7747 {
7748 { "vprotd", { XM, EXx, Ib }, 0 },
7749 },
7750 /* VEX_W_0FXOP_08_C3_L_0 */
7751 {
7752 { "vprotq", { XM, EXx, Ib }, 0 },
7753 },
7754 /* VEX_W_0FXOP_08_CC_L_0 */
7755 {
89e65d17 7756 { "vpcomb", { XM, Vex, EXx, VPCOM }, 0 },
467bbef0
JB
7757 },
7758 /* VEX_W_0FXOP_08_CD_L_0 */
7759 {
89e65d17 7760 { "vpcomw", { XM, Vex, EXx, VPCOM }, 0 },
467bbef0
JB
7761 },
7762 /* VEX_W_0FXOP_08_CE_L_0 */
7763 {
89e65d17 7764 { "vpcomd", { XM, Vex, EXx, VPCOM }, 0 },
467bbef0
JB
7765 },
7766 /* VEX_W_0FXOP_08_CF_L_0 */
7767 {
89e65d17 7768 { "vpcomq", { XM, Vex, EXx, VPCOM }, 0 },
467bbef0
JB
7769 },
7770 /* VEX_W_0FXOP_08_EC_L_0 */
7771 {
89e65d17 7772 { "vpcomub", { XM, Vex, EXx, VPCOM }, 0 },
467bbef0
JB
7773 },
7774 /* VEX_W_0FXOP_08_ED_L_0 */
7775 {
89e65d17 7776 { "vpcomuw", { XM, Vex, EXx, VPCOM }, 0 },
467bbef0
JB
7777 },
7778 /* VEX_W_0FXOP_08_EE_L_0 */
7779 {
89e65d17 7780 { "vpcomud", { XM, Vex, EXx, VPCOM }, 0 },
467bbef0
JB
7781 },
7782 /* VEX_W_0FXOP_08_EF_L_0 */
7783 {
89e65d17 7784 { "vpcomuq", { XM, Vex, EXx, VPCOM }, 0 },
467bbef0 7785 },
b5b098c2
JB
7786 /* VEX_W_0FXOP_09_80 */
7787 {
7788 { "vfrczps", { XM, EXx }, 0 },
7789 },
7790 /* VEX_W_0FXOP_09_81 */
7791 {
7792 { "vfrczpd", { XM, EXx }, 0 },
7793 },
7794 /* VEX_W_0FXOP_09_82 */
7795 {
7796 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_82_W_0) },
7797 },
7798 /* VEX_W_0FXOP_09_83 */
7799 {
7800 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_83_W_0) },
7801 },
467bbef0
JB
7802 /* VEX_W_0FXOP_09_C1_L_0 */
7803 {
7804 { "vphaddbw", { XM, EXxmm }, 0 },
7805 },
7806 /* VEX_W_0FXOP_09_C2_L_0 */
7807 {
7808 { "vphaddbd", { XM, EXxmm }, 0 },
7809 },
7810 /* VEX_W_0FXOP_09_C3_L_0 */
7811 {
7812 { "vphaddbq", { XM, EXxmm }, 0 },
7813 },
7814 /* VEX_W_0FXOP_09_C6_L_0 */
7815 {
7816 { "vphaddwd", { XM, EXxmm }, 0 },
7817 },
7818 /* VEX_W_0FXOP_09_C7_L_0 */
7819 {
7820 { "vphaddwq", { XM, EXxmm }, 0 },
7821 },
7822 /* VEX_W_0FXOP_09_CB_L_0 */
7823 {
7824 { "vphadddq", { XM, EXxmm }, 0 },
7825 },
7826 /* VEX_W_0FXOP_09_D1_L_0 */
7827 {
7828 { "vphaddubw", { XM, EXxmm }, 0 },
7829 },
7830 /* VEX_W_0FXOP_09_D2_L_0 */
7831 {
7832 { "vphaddubd", { XM, EXxmm }, 0 },
7833 },
7834 /* VEX_W_0FXOP_09_D3_L_0 */
7835 {
7836 { "vphaddubq", { XM, EXxmm }, 0 },
7837 },
7838 /* VEX_W_0FXOP_09_D6_L_0 */
7839 {
7840 { "vphadduwd", { XM, EXxmm }, 0 },
7841 },
7842 /* VEX_W_0FXOP_09_D7_L_0 */
7843 {
7844 { "vphadduwq", { XM, EXxmm }, 0 },
7845 },
7846 /* VEX_W_0FXOP_09_DB_L_0 */
7847 {
7848 { "vphaddudq", { XM, EXxmm }, 0 },
7849 },
7850 /* VEX_W_0FXOP_09_E1_L_0 */
7851 {
7852 { "vphsubbw", { XM, EXxmm }, 0 },
7853 },
7854 /* VEX_W_0FXOP_09_E2_L_0 */
7855 {
7856 { "vphsubwd", { XM, EXxmm }, 0 },
7857 },
7858 /* VEX_W_0FXOP_09_E3_L_0 */
7859 {
7860 { "vphsubdq", { XM, EXxmm }, 0 },
7861 },
ad692897
L
7862
7863#include "i386-dis-evex-w.h"
9e30b8e0
L
7864};
7865
7866static const struct dis386 mod_table[][2] = {
7867 {
7868 /* MOD_8D */
bf890a93 7869 { "leaS", { Gv, M }, 0 },
9e30b8e0 7870 },
42164a71
L
7871 {
7872 /* MOD_C6_REG_7 */
7873 { Bad_Opcode },
7874 { RM_TABLE (RM_C6_REG_7) },
7875 },
7876 {
7877 /* MOD_C7_REG_7 */
7878 { Bad_Opcode },
7879 { RM_TABLE (RM_C7_REG_7) },
7880 },
4a357820
MZ
7881 {
7882 /* MOD_FF_REG_3 */
8f570d62 7883 { "{l|}call^", { indirEp }, 0 },
4a357820
MZ
7884 },
7885 {
7886 /* MOD_FF_REG_5 */
8f570d62 7887 { "{l|}jmp^", { indirEp }, 0 },
4a357820 7888 },
9e30b8e0
L
7889 {
7890 /* MOD_0F01_REG_0 */
7891 { X86_64_TABLE (X86_64_0F01_REG_0) },
7892 { RM_TABLE (RM_0F01_REG_0) },
7893 },
7894 {
7895 /* MOD_0F01_REG_1 */
7896 { X86_64_TABLE (X86_64_0F01_REG_1) },
7897 { RM_TABLE (RM_0F01_REG_1) },
7898 },
7899 {
7900 /* MOD_0F01_REG_2 */
7901 { X86_64_TABLE (X86_64_0F01_REG_2) },
7902 { RM_TABLE (RM_0F01_REG_2) },
7903 },
7904 {
7905 /* MOD_0F01_REG_3 */
7906 { X86_64_TABLE (X86_64_0F01_REG_3) },
7907 { RM_TABLE (RM_0F01_REG_3) },
7908 },
8eab4136
L
7909 {
7910 /* MOD_0F01_REG_5 */
f8687e93
JB
7911 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_0) },
7912 { RM_TABLE (RM_0F01_REG_5_MOD_3) },
8eab4136 7913 },
9e30b8e0
L
7914 {
7915 /* MOD_0F01_REG_7 */
bf890a93 7916 { "invlpg", { Mb }, 0 },
f8687e93 7917 { RM_TABLE (RM_0F01_REG_7_MOD_3) },
9e30b8e0
L
7918 },
7919 {
7920 /* MOD_0F12_PREFIX_0 */
18897deb
JB
7921 { "movlpX", { XM, EXq }, 0 },
7922 { "movhlps", { XM, EXq }, 0 },
7923 },
7924 {
7925 /* MOD_0F12_PREFIX_2 */
7926 { "movlpX", { XM, EXq }, 0 },
9e30b8e0
L
7927 },
7928 {
7929 /* MOD_0F13 */
507bd325 7930 { "movlpX", { EXq, XM }, PREFIX_OPCODE },
9e30b8e0
L
7931 },
7932 {
7933 /* MOD_0F16_PREFIX_0 */
18897deb 7934 { "movhpX", { XM, EXq }, 0 },
bf890a93 7935 { "movlhps", { XM, EXq }, 0 },
9e30b8e0 7936 },
18897deb
JB
7937 {
7938 /* MOD_0F16_PREFIX_2 */
7939 { "movhpX", { XM, EXq }, 0 },
7940 },
9e30b8e0
L
7941 {
7942 /* MOD_0F17 */
507bd325 7943 { "movhpX", { EXq, XM }, PREFIX_OPCODE },
9e30b8e0
L
7944 },
7945 {
7946 /* MOD_0F18_REG_0 */
bf890a93 7947 { "prefetchnta", { Mb }, 0 },
9e30b8e0
L
7948 },
7949 {
7950 /* MOD_0F18_REG_1 */
bf890a93 7951 { "prefetcht0", { Mb }, 0 },
9e30b8e0
L
7952 },
7953 {
7954 /* MOD_0F18_REG_2 */
bf890a93 7955 { "prefetcht1", { Mb }, 0 },
9e30b8e0
L
7956 },
7957 {
7958 /* MOD_0F18_REG_3 */
bf890a93 7959 { "prefetcht2", { Mb }, 0 },
9e30b8e0 7960 },
d7189fa5
RM
7961 {
7962 /* MOD_0F18_REG_4 */
bf890a93 7963 { "nop/reserved", { Mb }, 0 },
d7189fa5
RM
7964 },
7965 {
7966 /* MOD_0F18_REG_5 */
bf890a93 7967 { "nop/reserved", { Mb }, 0 },
d7189fa5
RM
7968 },
7969 {
7970 /* MOD_0F18_REG_6 */
bf890a93 7971 { "nop/reserved", { Mb }, 0 },
d7189fa5
RM
7972 },
7973 {
7974 /* MOD_0F18_REG_7 */
bf890a93 7975 { "nop/reserved", { Mb }, 0 },
d7189fa5 7976 },
7e8b059b
L
7977 {
7978 /* MOD_0F1A_PREFIX_0 */
d276ec69 7979 { "bndldx", { Gbnd, Mv_bnd }, 0 },
bf890a93 7980 { "nopQ", { Ev }, 0 },
7e8b059b
L
7981 },
7982 {
7983 /* MOD_0F1B_PREFIX_0 */
d276ec69 7984 { "bndstx", { Mv_bnd, Gbnd }, 0 },
bf890a93 7985 { "nopQ", { Ev }, 0 },
7e8b059b
L
7986 },
7987 {
7988 /* MOD_0F1B_PREFIX_1 */
d276ec69 7989 { "bndmk", { Gbnd, Mv_bnd }, 0 },
bf890a93 7990 { "nopQ", { Ev }, 0 },
7e8b059b 7991 },
c48935d7
IT
7992 {
7993 /* MOD_0F1C_PREFIX_0 */
f8687e93 7994 { REG_TABLE (REG_0F1C_P_0_MOD_0) },
c48935d7
IT
7995 { "nopQ", { Ev }, 0 },
7996 },
603555e5
L
7997 {
7998 /* MOD_0F1E_PREFIX_1 */
7999 { "nopQ", { Ev }, 0 },
f8687e93 8000 { REG_TABLE (REG_0F1E_P_1_MOD_3) },
603555e5 8001 },
75c135a8
L
8002 {
8003 /* MOD_0F2B_PREFIX_0 */
507bd325 8004 {"movntps", { Mx, XM }, PREFIX_OPCODE },
75c135a8
L
8005 },
8006 {
8007 /* MOD_0F2B_PREFIX_1 */
507bd325 8008 {"movntss", { Md, XM }, PREFIX_OPCODE },
75c135a8
L
8009 },
8010 {
8011 /* MOD_0F2B_PREFIX_2 */
507bd325 8012 {"movntpd", { Mx, XM }, PREFIX_OPCODE },
75c135a8
L
8013 },
8014 {
8015 /* MOD_0F2B_PREFIX_3 */
507bd325 8016 {"movntsd", { Mq, XM }, PREFIX_OPCODE },
75c135a8
L
8017 },
8018 {
a5aaedb9 8019 /* MOD_0F50 */
592d1631 8020 { Bad_Opcode },
507bd325 8021 { "movmskpX", { Gdq, XS }, PREFIX_OPCODE },
75c135a8 8022 },
b844680a 8023 {
1ceb70f8 8024 /* MOD_0F71_REG_2 */
592d1631 8025 { Bad_Opcode },
7531c613 8026 { "psrlw", { MS, Ib }, PREFIX_OPCODE },
b844680a
L
8027 },
8028 {
1ceb70f8 8029 /* MOD_0F71_REG_4 */
592d1631 8030 { Bad_Opcode },
7531c613 8031 { "psraw", { MS, Ib }, PREFIX_OPCODE },
b844680a
L
8032 },
8033 {
1ceb70f8 8034 /* MOD_0F71_REG_6 */
592d1631 8035 { Bad_Opcode },
7531c613 8036 { "psllw", { MS, Ib }, PREFIX_OPCODE },
b844680a
L
8037 },
8038 {
1ceb70f8 8039 /* MOD_0F72_REG_2 */
592d1631 8040 { Bad_Opcode },
7531c613 8041 { "psrld", { MS, Ib }, PREFIX_OPCODE },
b844680a
L
8042 },
8043 {
1ceb70f8 8044 /* MOD_0F72_REG_4 */
592d1631 8045 { Bad_Opcode },
7531c613 8046 { "psrad", { MS, Ib }, PREFIX_OPCODE },
b844680a
L
8047 },
8048 {
1ceb70f8 8049 /* MOD_0F72_REG_6 */
592d1631 8050 { Bad_Opcode },
7531c613 8051 { "pslld", { MS, Ib }, PREFIX_OPCODE },
b844680a
L
8052 },
8053 {
1ceb70f8 8054 /* MOD_0F73_REG_2 */
592d1631 8055 { Bad_Opcode },
7531c613 8056 { "psrlq", { MS, Ib }, PREFIX_OPCODE },
b844680a
L
8057 },
8058 {
1ceb70f8 8059 /* MOD_0F73_REG_3 */
592d1631 8060 { Bad_Opcode },
7531c613 8061 { "psrldq", { XS, Ib }, PREFIX_DATA },
c0f3af97
L
8062 },
8063 {
8064 /* MOD_0F73_REG_6 */
592d1631 8065 { Bad_Opcode },
7531c613 8066 { "psllq", { MS, Ib }, PREFIX_OPCODE },
c0f3af97
L
8067 },
8068 {
8069 /* MOD_0F73_REG_7 */
592d1631 8070 { Bad_Opcode },
7531c613 8071 { "pslldq", { XS, Ib }, PREFIX_DATA },
c0f3af97
L
8072 },
8073 {
8074 /* MOD_0FAE_REG_0 */
bf890a93 8075 { "fxsave", { FXSAVE }, 0 },
f8687e93 8076 { PREFIX_TABLE (PREFIX_0FAE_REG_0_MOD_3) },
c0f3af97
L
8077 },
8078 {
8079 /* MOD_0FAE_REG_1 */
bf890a93 8080 { "fxrstor", { FXSAVE }, 0 },
f8687e93 8081 { PREFIX_TABLE (PREFIX_0FAE_REG_1_MOD_3) },
c0f3af97
L
8082 },
8083 {
8084 /* MOD_0FAE_REG_2 */
bf890a93 8085 { "ldmxcsr", { Md }, 0 },
f8687e93 8086 { PREFIX_TABLE (PREFIX_0FAE_REG_2_MOD_3) },
c0f3af97
L
8087 },
8088 {
8089 /* MOD_0FAE_REG_3 */
bf890a93 8090 { "stmxcsr", { Md }, 0 },
f8687e93 8091 { PREFIX_TABLE (PREFIX_0FAE_REG_3_MOD_3) },
c0f3af97
L
8092 },
8093 {
8094 /* MOD_0FAE_REG_4 */
f8687e93
JB
8095 { PREFIX_TABLE (PREFIX_0FAE_REG_4_MOD_0) },
8096 { PREFIX_TABLE (PREFIX_0FAE_REG_4_MOD_3) },
c0f3af97
L
8097 },
8098 {
8099 /* MOD_0FAE_REG_5 */
035e7389 8100 { "xrstor", { FXSAVE }, PREFIX_OPCODE },
f8687e93 8101 { PREFIX_TABLE (PREFIX_0FAE_REG_5_MOD_3) },
c0f3af97
L
8102 },
8103 {
8104 /* MOD_0FAE_REG_6 */
f8687e93
JB
8105 { PREFIX_TABLE (PREFIX_0FAE_REG_6_MOD_0) },
8106 { PREFIX_TABLE (PREFIX_0FAE_REG_6_MOD_3) },
c0f3af97
L
8107 },
8108 {
8109 /* MOD_0FAE_REG_7 */
f8687e93
JB
8110 { PREFIX_TABLE (PREFIX_0FAE_REG_7_MOD_0) },
8111 { RM_TABLE (RM_0FAE_REG_7_MOD_3) },
c0f3af97
L
8112 },
8113 {
8114 /* MOD_0FB2 */
bf890a93 8115 { "lssS", { Gv, Mp }, 0 },
c0f3af97
L
8116 },
8117 {
8118 /* MOD_0FB4 */
bf890a93 8119 { "lfsS", { Gv, Mp }, 0 },
c0f3af97
L
8120 },
8121 {
8122 /* MOD_0FB5 */
bf890a93 8123 { "lgsS", { Gv, Mp }, 0 },
c0f3af97 8124 },
a8484f96
L
8125 {
8126 /* MOD_0FC3 */
035e7389 8127 { "movntiS", { Edq, Gdq }, PREFIX_OPCODE },
a8484f96 8128 },
963f3586
IT
8129 {
8130 /* MOD_0FC7_REG_3 */
a8484f96 8131 { "xrstors", { FXSAVE }, 0 },
963f3586
IT
8132 },
8133 {
8134 /* MOD_0FC7_REG_4 */
bf890a93 8135 { "xsavec", { FXSAVE }, 0 },
963f3586
IT
8136 },
8137 {
8138 /* MOD_0FC7_REG_5 */
bf890a93 8139 { "xsaves", { FXSAVE }, 0 },
963f3586 8140 },
c0f3af97
L
8141 {
8142 /* MOD_0FC7_REG_6 */
f8687e93
JB
8143 { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_0) },
8144 { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_3) }
c0f3af97
L
8145 },
8146 {
8147 /* MOD_0FC7_REG_7 */
bf890a93 8148 { "vmptrst", { Mq }, 0 },
f8687e93 8149 { PREFIX_TABLE (PREFIX_0FC7_REG_7_MOD_3) }
c0f3af97
L
8150 },
8151 {
8152 /* MOD_0FD7 */
592d1631 8153 { Bad_Opcode },
bf890a93 8154 { "pmovmskb", { Gdq, MS }, 0 },
c0f3af97
L
8155 },
8156 {
8157 /* MOD_0FE7_PREFIX_2 */
bf890a93 8158 { "movntdq", { Mx, XM }, 0 },
c0f3af97
L
8159 },
8160 {
8161 /* MOD_0FF0_PREFIX_3 */
bf890a93 8162 { "lddqu", { XM, M }, 0 },
c0f3af97
L
8163 },
8164 {
7531c613
JB
8165 /* MOD_0F382A */
8166 { "movntdqa", { XM, Mx }, PREFIX_DATA },
c0f3af97 8167 },
260cd341
LC
8168 {
8169 /* MOD_VEX_0F3849_X86_64_P_0_W_0 */
8170 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_0_W_0_M_0) },
8171 { REG_TABLE (REG_VEX_0F3849_X86_64_P_0_W_0_M_1) },
8172 },
8173 {
8174 /* MOD_VEX_0F3849_X86_64_P_2_W_0 */
8175 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_2_W_0_M_0) },
8176 },
8177 {
8178 /* MOD_VEX_0F3849_X86_64_P_3_W_0 */
8179 { Bad_Opcode },
8180 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_3_W_0_M_0) },
8181 },
8182 {
8183 /* MOD_VEX_0F384B_X86_64_P_1_W_0 */
8184 { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64_P_1_W_0_M_0) },
8185 },
8186 {
8187 /* MOD_VEX_0F384B_X86_64_P_2_W_0 */
8188 { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64_P_2_W_0_M_0) },
8189 },
8190 {
8191 /* MOD_VEX_0F384B_X86_64_P_3_W_0 */
8192 { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64_P_3_W_0_M_0) },
8193 },
8194 {
8195 /* MOD_VEX_0F385C_X86_64_P_1_W_0 */
8196 { Bad_Opcode },
8197 { VEX_LEN_TABLE (VEX_LEN_0F385C_X86_64_P_1_W_0_M_0) },
8198 },
8199 {
8200 /* MOD_VEX_0F385E_X86_64_P_0_W_0 */
8201 { Bad_Opcode },
8202 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_0_W_0_M_0) },
8203 },
8204 {
8205 /* MOD_VEX_0F385E_X86_64_P_1_W_0 */
8206 { Bad_Opcode },
8207 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_1_W_0_M_0) },
8208 },
8209 {
8210 /* MOD_VEX_0F385E_X86_64_P_2_W_0 */
8211 { Bad_Opcode },
8212 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_2_W_0_M_0) },
8213 },
8214 {
8215 /* MOD_VEX_0F385E_X86_64_P_3_W_0 */
8216 { Bad_Opcode },
8217 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_3_W_0_M_0) },
8218 },
603555e5 8219 {
7531c613
JB
8220 /* MOD_0F38F5 */
8221 { "wrussK", { M, Gdq }, PREFIX_DATA },
603555e5
L
8222 },
8223 {
8224 /* MOD_0F38F6_PREFIX_0 */
8225 { "wrssK", { M, Gdq }, PREFIX_OPCODE },
8226 },
5d79adc4
L
8227 {
8228 /* MOD_0F38F8_PREFIX_1 */
8229 { "enqcmds", { Gva, M }, PREFIX_OPCODE },
8230 },
c0a30a9f
L
8231 {
8232 /* MOD_0F38F8_PREFIX_2 */
8233 { "movdir64b", { Gva, M }, PREFIX_OPCODE },
8234 },
5d79adc4
L
8235 {
8236 /* MOD_0F38F8_PREFIX_3 */
8237 { "enqcmd", { Gva, M }, PREFIX_OPCODE },
8238 },
c0a30a9f 8239 {
035e7389
JB
8240 /* MOD_0F38F9 */
8241 { "movdiri", { Edq, Gdq }, PREFIX_OPCODE },
c0a30a9f 8242 },
c0f3af97
L
8243 {
8244 /* MOD_62_32BIT */
bf890a93 8245 { "bound{S|}", { Gv, Ma }, 0 },
43234a1e 8246 { EVEX_TABLE (EVEX_0F) },
c0f3af97
L
8247 },
8248 {
8249 /* MOD_C4_32BIT */
bf890a93 8250 { "lesS", { Gv, Mp }, 0 },
c0f3af97
L
8251 { VEX_C4_TABLE (VEX_0F) },
8252 },
8253 {
8254 /* MOD_C5_32BIT */
bf890a93 8255 { "ldsS", { Gv, Mp }, 0 },
c0f3af97
L
8256 { VEX_C5_TABLE (VEX_0F) },
8257 },
8258 {
592a252b
L
8259 /* MOD_VEX_0F12_PREFIX_0 */
8260 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_0) },
8261 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_1) },
c0f3af97 8262 },
18897deb
JB
8263 {
8264 /* MOD_VEX_0F12_PREFIX_2 */
8265 { VEX_LEN_TABLE (VEX_LEN_0F12_P_2_M_0) },
8266 },
c0f3af97 8267 {
592a252b
L
8268 /* MOD_VEX_0F13 */
8269 { VEX_LEN_TABLE (VEX_LEN_0F13_M_0) },
c0f3af97
L
8270 },
8271 {
592a252b
L
8272 /* MOD_VEX_0F16_PREFIX_0 */
8273 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_0) },
8274 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_1) },
c0f3af97 8275 },
18897deb
JB
8276 {
8277 /* MOD_VEX_0F16_PREFIX_2 */
8278 { VEX_LEN_TABLE (VEX_LEN_0F16_P_2_M_0) },
8279 },
c0f3af97 8280 {
592a252b
L
8281 /* MOD_VEX_0F17 */
8282 { VEX_LEN_TABLE (VEX_LEN_0F17_M_0) },
c0f3af97
L
8283 },
8284 {
592a252b 8285 /* MOD_VEX_0F2B */
bf926894 8286 { "vmovntpX", { Mx, XM }, PREFIX_OPCODE },
c0f3af97 8287 },
ab4e4ed5
AF
8288 {
8289 /* MOD_VEX_W_0_0F41_P_0_LEN_1 */
8290 { Bad_Opcode },
464d2b65 8291 { "kandw", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8292 },
8293 {
8294 /* MOD_VEX_W_1_0F41_P_0_LEN_1 */
8295 { Bad_Opcode },
464d2b65 8296 { "kandq", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8297 },
8298 {
8299 /* MOD_VEX_W_0_0F41_P_2_LEN_1 */
8300 { Bad_Opcode },
464d2b65 8301 { "kandb", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8302 },
8303 {
8304 /* MOD_VEX_W_1_0F41_P_2_LEN_1 */
8305 { Bad_Opcode },
464d2b65 8306 { "kandd", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8307 },
8308 {
8309 /* MOD_VEX_W_0_0F42_P_0_LEN_1 */
8310 { Bad_Opcode },
464d2b65 8311 { "kandnw", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8312 },
8313 {
8314 /* MOD_VEX_W_1_0F42_P_0_LEN_1 */
8315 { Bad_Opcode },
464d2b65 8316 { "kandnq", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8317 },
8318 {
8319 /* MOD_VEX_W_0_0F42_P_2_LEN_1 */
8320 { Bad_Opcode },
464d2b65 8321 { "kandnb", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8322 },
8323 {
8324 /* MOD_VEX_W_1_0F42_P_2_LEN_1 */
8325 { Bad_Opcode },
464d2b65 8326 { "kandnd", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8327 },
8328 {
8329 /* MOD_VEX_W_0_0F44_P_0_LEN_0 */
8330 { Bad_Opcode },
464d2b65 8331 { "knotw", { MaskG, MaskE }, 0 },
ab4e4ed5
AF
8332 },
8333 {
8334 /* MOD_VEX_W_1_0F44_P_0_LEN_0 */
8335 { Bad_Opcode },
464d2b65 8336 { "knotq", { MaskG, MaskE }, 0 },
ab4e4ed5
AF
8337 },
8338 {
8339 /* MOD_VEX_W_0_0F44_P_2_LEN_0 */
8340 { Bad_Opcode },
464d2b65 8341 { "knotb", { MaskG, MaskE }, 0 },
ab4e4ed5
AF
8342 },
8343 {
8344 /* MOD_VEX_W_1_0F44_P_2_LEN_0 */
8345 { Bad_Opcode },
464d2b65 8346 { "knotd", { MaskG, MaskE }, 0 },
ab4e4ed5
AF
8347 },
8348 {
8349 /* MOD_VEX_W_0_0F45_P_0_LEN_1 */
8350 { Bad_Opcode },
464d2b65 8351 { "korw", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8352 },
8353 {
8354 /* MOD_VEX_W_1_0F45_P_0_LEN_1 */
8355 { Bad_Opcode },
464d2b65 8356 { "korq", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8357 },
8358 {
8359 /* MOD_VEX_W_0_0F45_P_2_LEN_1 */
8360 { Bad_Opcode },
464d2b65 8361 { "korb", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8362 },
8363 {
8364 /* MOD_VEX_W_1_0F45_P_2_LEN_1 */
8365 { Bad_Opcode },
464d2b65 8366 { "kord", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8367 },
8368 {
8369 /* MOD_VEX_W_0_0F46_P_0_LEN_1 */
8370 { Bad_Opcode },
464d2b65 8371 { "kxnorw", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8372 },
8373 {
8374 /* MOD_VEX_W_1_0F46_P_0_LEN_1 */
8375 { Bad_Opcode },
464d2b65 8376 { "kxnorq", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8377 },
8378 {
8379 /* MOD_VEX_W_0_0F46_P_2_LEN_1 */
8380 { Bad_Opcode },
464d2b65 8381 { "kxnorb", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8382 },
8383 {
8384 /* MOD_VEX_W_1_0F46_P_2_LEN_1 */
8385 { Bad_Opcode },
464d2b65 8386 { "kxnord", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8387 },
8388 {
8389 /* MOD_VEX_W_0_0F47_P_0_LEN_1 */
8390 { Bad_Opcode },
464d2b65 8391 { "kxorw", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8392 },
8393 {
8394 /* MOD_VEX_W_1_0F47_P_0_LEN_1 */
8395 { Bad_Opcode },
464d2b65 8396 { "kxorq", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8397 },
8398 {
8399 /* MOD_VEX_W_0_0F47_P_2_LEN_1 */
8400 { Bad_Opcode },
464d2b65 8401 { "kxorb", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8402 },
8403 {
8404 /* MOD_VEX_W_1_0F47_P_2_LEN_1 */
8405 { Bad_Opcode },
464d2b65 8406 { "kxord", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8407 },
8408 {
8409 /* MOD_VEX_W_0_0F4A_P_0_LEN_1 */
8410 { Bad_Opcode },
464d2b65 8411 { "kaddw", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8412 },
8413 {
8414 /* MOD_VEX_W_1_0F4A_P_0_LEN_1 */
8415 { Bad_Opcode },
464d2b65 8416 { "kaddq", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8417 },
8418 {
8419 /* MOD_VEX_W_0_0F4A_P_2_LEN_1 */
8420 { Bad_Opcode },
464d2b65 8421 { "kaddb", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8422 },
8423 {
8424 /* MOD_VEX_W_1_0F4A_P_2_LEN_1 */
8425 { Bad_Opcode },
464d2b65 8426 { "kaddd", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8427 },
8428 {
8429 /* MOD_VEX_W_0_0F4B_P_0_LEN_1 */
8430 { Bad_Opcode },
464d2b65 8431 { "kunpckwd", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8432 },
8433 {
8434 /* MOD_VEX_W_1_0F4B_P_0_LEN_1 */
8435 { Bad_Opcode },
464d2b65 8436 { "kunpckdq", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8437 },
8438 {
8439 /* MOD_VEX_W_0_0F4B_P_2_LEN_1 */
8440 { Bad_Opcode },
464d2b65 8441 { "kunpckbw", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5 8442 },
c0f3af97 8443 {
592a252b 8444 /* MOD_VEX_0F50 */
592d1631 8445 { Bad_Opcode },
bf926894 8446 { "vmovmskpX", { Gdq, XS }, PREFIX_OPCODE },
c0f3af97
L
8447 },
8448 {
592a252b 8449 /* MOD_VEX_0F71_REG_2 */
592d1631 8450 { Bad_Opcode },
7531c613 8451 { "vpsrlw", { Vex, XS, Ib }, PREFIX_DATA },
b844680a
L
8452 },
8453 {
592a252b 8454 /* MOD_VEX_0F71_REG_4 */
592d1631 8455 { Bad_Opcode },
7531c613 8456 { "vpsraw", { Vex, XS, Ib }, PREFIX_DATA },
b844680a
L
8457 },
8458 {
592a252b 8459 /* MOD_VEX_0F71_REG_6 */
592d1631 8460 { Bad_Opcode },
7531c613 8461 { "vpsllw", { Vex, XS, Ib }, PREFIX_DATA },
b844680a
L
8462 },
8463 {
592a252b 8464 /* MOD_VEX_0F72_REG_2 */
592d1631 8465 { Bad_Opcode },
7531c613 8466 { "vpsrld", { Vex, XS, Ib }, PREFIX_DATA },
b844680a 8467 },
d8faab4e 8468 {
592a252b 8469 /* MOD_VEX_0F72_REG_4 */
592d1631 8470 { Bad_Opcode },
7531c613 8471 { "vpsrad", { Vex, XS, Ib }, PREFIX_DATA },
d8faab4e
L
8472 },
8473 {
592a252b 8474 /* MOD_VEX_0F72_REG_6 */
592d1631 8475 { Bad_Opcode },
7531c613 8476 { "vpslld", { Vex, XS, Ib }, PREFIX_DATA },
d8faab4e 8477 },
876d4bfa 8478 {
592a252b 8479 /* MOD_VEX_0F73_REG_2 */
592d1631 8480 { Bad_Opcode },
7531c613 8481 { "vpsrlq", { Vex, XS, Ib }, PREFIX_DATA },
876d4bfa
L
8482 },
8483 {
592a252b 8484 /* MOD_VEX_0F73_REG_3 */
592d1631 8485 { Bad_Opcode },
7531c613 8486 { "vpsrldq", { Vex, XS, Ib }, PREFIX_DATA },
475a2301
L
8487 },
8488 {
592a252b 8489 /* MOD_VEX_0F73_REG_6 */
592d1631 8490 { Bad_Opcode },
7531c613 8491 { "vpsllq", { Vex, XS, Ib }, PREFIX_DATA },
876d4bfa
L
8492 },
8493 {
592a252b 8494 /* MOD_VEX_0F73_REG_7 */
592d1631 8495 { Bad_Opcode },
7531c613 8496 { "vpslldq", { Vex, XS, Ib }, PREFIX_DATA },
876d4bfa 8497 },
ab4e4ed5
AF
8498 {
8499 /* MOD_VEX_W_0_0F91_P_0_LEN_0 */
8500 { "kmovw", { Ew, MaskG }, 0 },
8501 { Bad_Opcode },
8502 },
8503 {
8504 /* MOD_VEX_W_0_0F91_P_0_LEN_0 */
8505 { "kmovq", { Eq, MaskG }, 0 },
8506 { Bad_Opcode },
8507 },
8508 {
8509 /* MOD_VEX_W_0_0F91_P_2_LEN_0 */
8510 { "kmovb", { Eb, MaskG }, 0 },
8511 { Bad_Opcode },
8512 },
8513 {
8514 /* MOD_VEX_W_0_0F91_P_2_LEN_0 */
8515 { "kmovd", { Ed, MaskG }, 0 },
8516 { Bad_Opcode },
8517 },
8518 {
8519 /* MOD_VEX_W_0_0F92_P_0_LEN_0 */
8520 { Bad_Opcode },
464d2b65 8521 { "kmovw", { MaskG, Edq }, 0 },
ab4e4ed5
AF
8522 },
8523 {
8524 /* MOD_VEX_W_0_0F92_P_2_LEN_0 */
8525 { Bad_Opcode },
464d2b65 8526 { "kmovb", { MaskG, Edq }, 0 },
ab4e4ed5
AF
8527 },
8528 {
58a211d2 8529 /* MOD_VEX_0F92_P_3_LEN_0 */
ab4e4ed5 8530 { Bad_Opcode },
464d2b65 8531 { "kmovK", { MaskG, Edq }, 0 },
ab4e4ed5
AF
8532 },
8533 {
8534 /* MOD_VEX_W_0_0F93_P_0_LEN_0 */
8535 { Bad_Opcode },
464d2b65 8536 { "kmovw", { Gdq, MaskE }, 0 },
ab4e4ed5
AF
8537 },
8538 {
8539 /* MOD_VEX_W_0_0F93_P_2_LEN_0 */
8540 { Bad_Opcode },
464d2b65 8541 { "kmovb", { Gdq, MaskE }, 0 },
ab4e4ed5
AF
8542 },
8543 {
58a211d2 8544 /* MOD_VEX_0F93_P_3_LEN_0 */
ab4e4ed5 8545 { Bad_Opcode },
464d2b65 8546 { "kmovK", { Gdq, MaskE }, 0 },
ab4e4ed5
AF
8547 },
8548 {
8549 /* MOD_VEX_W_0_0F98_P_0_LEN_0 */
8550 { Bad_Opcode },
464d2b65 8551 { "kortestw", { MaskG, MaskE }, 0 },
ab4e4ed5
AF
8552 },
8553 {
8554 /* MOD_VEX_W_1_0F98_P_0_LEN_0 */
8555 { Bad_Opcode },
464d2b65 8556 { "kortestq", { MaskG, MaskE }, 0 },
ab4e4ed5
AF
8557 },
8558 {
8559 /* MOD_VEX_W_0_0F98_P_2_LEN_0 */
8560 { Bad_Opcode },
464d2b65 8561 { "kortestb", { MaskG, MaskE }, 0 },
ab4e4ed5
AF
8562 },
8563 {
8564 /* MOD_VEX_W_1_0F98_P_2_LEN_0 */
8565 { Bad_Opcode },
464d2b65 8566 { "kortestd", { MaskG, MaskE }, 0 },
ab4e4ed5
AF
8567 },
8568 {
8569 /* MOD_VEX_W_0_0F99_P_0_LEN_0 */
8570 { Bad_Opcode },
464d2b65 8571 { "ktestw", { MaskG, MaskE }, 0 },
ab4e4ed5
AF
8572 },
8573 {
8574 /* MOD_VEX_W_1_0F99_P_0_LEN_0 */
8575 { Bad_Opcode },
464d2b65 8576 { "ktestq", { MaskG, MaskE }, 0 },
ab4e4ed5
AF
8577 },
8578 {
8579 /* MOD_VEX_W_0_0F99_P_2_LEN_0 */
8580 { Bad_Opcode },
464d2b65 8581 { "ktestb", { MaskG, MaskE }, 0 },
ab4e4ed5
AF
8582 },
8583 {
8584 /* MOD_VEX_W_1_0F99_P_2_LEN_0 */
8585 { Bad_Opcode },
464d2b65 8586 { "ktestd", { MaskG, MaskE }, 0 },
ab4e4ed5 8587 },
876d4bfa 8588 {
592a252b
L
8589 /* MOD_VEX_0FAE_REG_2 */
8590 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_2_M_0) },
876d4bfa 8591 },
bbedc832 8592 {
592a252b
L
8593 /* MOD_VEX_0FAE_REG_3 */
8594 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_3_M_0) },
bbedc832 8595 },
144c41d9 8596 {
7531c613 8597 /* MOD_VEX_0FD7 */
592d1631 8598 { Bad_Opcode },
7531c613 8599 { "vpmovmskb", { Gdq, XS }, PREFIX_DATA },
144c41d9 8600 },
1afd85e3 8601 {
7531c613
JB
8602 /* MOD_VEX_0FE7 */
8603 { "vmovntdq", { Mx, XM }, PREFIX_DATA },
1afd85e3
L
8604 },
8605 {
592a252b 8606 /* MOD_VEX_0FF0_PREFIX_3 */
ec6f095a 8607 { "vlddqu", { XM, M }, 0 },
92fddf8e 8608 },
75c135a8 8609 {
7531c613
JB
8610 /* MOD_VEX_0F381A */
8611 { VEX_LEN_TABLE (VEX_LEN_0F381A_M_0) },
75c135a8 8612 },
1afd85e3 8613 {
7531c613
JB
8614 /* MOD_VEX_0F382A */
8615 { "vmovntdqa", { XM, Mx }, PREFIX_DATA },
1afd85e3 8616 },
75c135a8 8617 {
7531c613
JB
8618 /* MOD_VEX_0F382C */
8619 { VEX_W_TABLE (VEX_W_0F382C_M_0) },
75c135a8 8620 },
1afd85e3 8621 {
7531c613
JB
8622 /* MOD_VEX_0F382D */
8623 { VEX_W_TABLE (VEX_W_0F382D_M_0) },
1afd85e3
L
8624 },
8625 {
7531c613
JB
8626 /* MOD_VEX_0F382E */
8627 { VEX_W_TABLE (VEX_W_0F382E_M_0) },
1afd85e3
L
8628 },
8629 {
7531c613
JB
8630 /* MOD_VEX_0F382F */
8631 { VEX_W_TABLE (VEX_W_0F382F_M_0) },
1afd85e3 8632 },
6c30d220 8633 {
7531c613
JB
8634 /* MOD_VEX_0F385A */
8635 { VEX_LEN_TABLE (VEX_LEN_0F385A_M_0) },
6c30d220
L
8636 },
8637 {
7531c613
JB
8638 /* MOD_VEX_0F388C */
8639 { "vpmaskmov%DQ", { XM, Vex, Mx }, PREFIX_DATA },
6c30d220
L
8640 },
8641 {
7531c613
JB
8642 /* MOD_VEX_0F388E */
8643 { "vpmaskmov%DQ", { Mx, Vex, XM }, PREFIX_DATA },
6c30d220 8644 },
ab4e4ed5 8645 {
bb5b3501 8646 /* MOD_VEX_0F3A30_L_0 */
ab4e4ed5 8647 { Bad_Opcode },
464d2b65 8648 { "kshiftr%BW", { MaskG, MaskE, Ib }, PREFIX_DATA },
ab4e4ed5
AF
8649 },
8650 {
bb5b3501 8651 /* MOD_VEX_0F3A31_L_0 */
ab4e4ed5 8652 { Bad_Opcode },
464d2b65 8653 { "kshiftr%DQ", { MaskG, MaskE, Ib }, PREFIX_DATA },
ab4e4ed5
AF
8654 },
8655 {
bb5b3501 8656 /* MOD_VEX_0F3A32_L_0 */
ab4e4ed5 8657 { Bad_Opcode },
464d2b65 8658 { "kshiftl%BW", { MaskG, MaskE, Ib }, PREFIX_DATA },
ab4e4ed5
AF
8659 },
8660 {
bb5b3501 8661 /* MOD_VEX_0F3A33_L_0 */
ab4e4ed5 8662 { Bad_Opcode },
464d2b65 8663 { "kshiftl%DQ", { MaskG, MaskE, Ib }, PREFIX_DATA },
ab4e4ed5 8664 },
467bbef0
JB
8665 {
8666 /* MOD_VEX_0FXOP_09_12 */
8667 { Bad_Opcode },
8668 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_12_M_1) },
8669 },
ad692897
L
8670
8671#include "i386-dis-evex-mod.h"
b844680a
L
8672};
8673
1ceb70f8 8674static const struct dis386 rm_table[][8] = {
42164a71
L
8675 {
8676 /* RM_C6_REG_7 */
bf890a93 8677 { "xabort", { Skip_MODRM, Ib }, 0 },
42164a71
L
8678 },
8679 {
8680 /* RM_C7_REG_7 */
376cd056 8681 { "xbeginT", { Skip_MODRM, Jdqw }, 0 },
42164a71 8682 },
b844680a 8683 {
1ceb70f8 8684 /* RM_0F01_REG_0 */
a4e78aa5 8685 { "enclv", { Skip_MODRM }, 0 },
bf890a93
IT
8686 { "vmcall", { Skip_MODRM }, 0 },
8687 { "vmlaunch", { Skip_MODRM }, 0 },
8688 { "vmresume", { Skip_MODRM }, 0 },
8689 { "vmxoff", { Skip_MODRM }, 0 },
be3a8dca 8690 { "pconfig", { Skip_MODRM }, 0 },
b844680a
L
8691 },
8692 {
1ceb70f8 8693 /* RM_0F01_REG_1 */
bf890a93
IT
8694 { "monitor", { { OP_Monitor, 0 } }, 0 },
8695 { "mwait", { { OP_Mwait, 0 } }, 0 },
8696 { "clac", { Skip_MODRM }, 0 },
8697 { "stac", { Skip_MODRM }, 0 },
2cf200a4
IT
8698 { Bad_Opcode },
8699 { Bad_Opcode },
8700 { Bad_Opcode },
bf890a93 8701 { "encls", { Skip_MODRM }, 0 },
b844680a 8702 },
475a2301
L
8703 {
8704 /* RM_0F01_REG_2 */
bf890a93
IT
8705 { "xgetbv", { Skip_MODRM }, 0 },
8706 { "xsetbv", { Skip_MODRM }, 0 },
8729a6f6
L
8707 { Bad_Opcode },
8708 { Bad_Opcode },
bf890a93
IT
8709 { "vmfunc", { Skip_MODRM }, 0 },
8710 { "xend", { Skip_MODRM }, 0 },
8711 { "xtest", { Skip_MODRM }, 0 },
8712 { "enclu", { Skip_MODRM }, 0 },
475a2301 8713 },
b844680a 8714 {
1ceb70f8 8715 /* RM_0F01_REG_3 */
bf890a93 8716 { "vmrun", { Skip_MODRM }, 0 },
a847e322 8717 { PREFIX_TABLE (PREFIX_0F01_REG_3_RM_1) },
bf890a93
IT
8718 { "vmload", { Skip_MODRM }, 0 },
8719 { "vmsave", { Skip_MODRM }, 0 },
8720 { "stgi", { Skip_MODRM }, 0 },
8721 { "clgi", { Skip_MODRM }, 0 },
8722 { "skinit", { Skip_MODRM }, 0 },
8723 { "invlpga", { Skip_MODRM }, 0 },
4e7d34a6 8724 },
8eab4136 8725 {
f8687e93
JB
8726 /* RM_0F01_REG_5_MOD_3 */
8727 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_0) },
bb651e8b 8728 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_1) },
f8687e93 8729 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_2) },
8eab4136
L
8730 { Bad_Opcode },
8731 { Bad_Opcode },
8732 { Bad_Opcode },
8733 { "rdpkru", { Skip_MODRM }, 0 },
8734 { "wrpkru", { Skip_MODRM }, 0 },
8735 },
4e7d34a6 8736 {
f8687e93 8737 /* RM_0F01_REG_7_MOD_3 */
bf890a93
IT
8738 { "swapgs", { Skip_MODRM }, 0 },
8739 { "rdtscp", { Skip_MODRM }, 0 },
267b8516 8740 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_2) },
035e7389 8741 { "mwaitx", { { OP_Mwait, eBX_reg } }, PREFIX_OPCODE },
bf890a93 8742 { "clzero", { Skip_MODRM }, 0 },
142861df 8743 { "rdpru", { Skip_MODRM }, 0 },
b844680a 8744 },
603555e5 8745 {
f8687e93 8746 /* RM_0F1E_P_1_MOD_3_REG_7 */
603555e5
L
8747 { "nopQ", { Ev }, 0 },
8748 { "nopQ", { Ev }, 0 },
8749 { "endbr64", { Skip_MODRM }, PREFIX_OPCODE },
8750 { "endbr32", { Skip_MODRM }, PREFIX_OPCODE },
8751 { "nopQ", { Ev }, 0 },
8752 { "nopQ", { Ev }, 0 },
8753 { "nopQ", { Ev }, 0 },
8754 { "nopQ", { Ev }, 0 },
8755 },
b844680a 8756 {
f8687e93 8757 /* RM_0FAE_REG_6_MOD_3 */
bf890a93 8758 { "mfence", { Skip_MODRM }, 0 },
b844680a 8759 },
bbedc832 8760 {
f8687e93 8761 /* RM_0FAE_REG_7_MOD_3 */
b5cefcca
L
8762 { "sfence", { Skip_MODRM }, 0 },
8763
144c41d9 8764 },
260cd341
LC
8765 {
8766 /* RM_VEX_0F3849_X86_64_P_0_W_0_M_1_R_0 */
8767 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_0_W_0_M_1_REG_0_RM_0) },
8768 },
b844680a
L
8769};
8770
c608c12e
AM
8771#define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
8772
f16cd0d5
L
8773/* We use the high bit to indicate different name for the same
8774 prefix. */
f16cd0d5 8775#define REP_PREFIX (0xf3 | 0x100)
42164a71
L
8776#define XACQUIRE_PREFIX (0xf2 | 0x200)
8777#define XRELEASE_PREFIX (0xf3 | 0x400)
7e8b059b 8778#define BND_PREFIX (0xf2 | 0x400)
04ef582a 8779#define NOTRACK_PREFIX (0x3e | 0x100)
f16cd0d5 8780
1d67fe3b
TT
8781/* Remember if the current op is a jump instruction. */
8782static bfd_boolean op_is_jump = FALSE;
8783
f16cd0d5 8784static int
26ca5450 8785ckprefix (void)
252b5132 8786{
f16cd0d5 8787 int newrex, i, length;
52b15da3 8788 rex = 0;
252b5132 8789 prefixes = 0;
7d421014 8790 used_prefixes = 0;
52b15da3 8791 rex_used = 0;
f16cd0d5
L
8792 last_lock_prefix = -1;
8793 last_repz_prefix = -1;
8794 last_repnz_prefix = -1;
8795 last_data_prefix = -1;
8796 last_addr_prefix = -1;
8797 last_rex_prefix = -1;
8798 last_seg_prefix = -1;
d9949a36 8799 fwait_prefix = -1;
285ca992 8800 active_seg_prefix = 0;
f310f33d
L
8801 for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
8802 all_prefixes[i] = 0;
8803 i = 0;
f16cd0d5
L
8804 length = 0;
8805 /* The maximum instruction length is 15bytes. */
8806 while (length < MAX_CODE_LENGTH - 1)
252b5132
RH
8807 {
8808 FETCH_DATA (the_info, codep + 1);
52b15da3 8809 newrex = 0;
252b5132
RH
8810 switch (*codep)
8811 {
52b15da3
JH
8812 /* REX prefixes family. */
8813 case 0x40:
8814 case 0x41:
8815 case 0x42:
8816 case 0x43:
8817 case 0x44:
8818 case 0x45:
8819 case 0x46:
8820 case 0x47:
8821 case 0x48:
8822 case 0x49:
8823 case 0x4a:
8824 case 0x4b:
8825 case 0x4c:
8826 case 0x4d:
8827 case 0x4e:
8828 case 0x4f:
f16cd0d5
L
8829 if (address_mode == mode_64bit)
8830 newrex = *codep;
8831 else
8832 return 1;
8833 last_rex_prefix = i;
52b15da3 8834 break;
252b5132
RH
8835 case 0xf3:
8836 prefixes |= PREFIX_REPZ;
f16cd0d5 8837 last_repz_prefix = i;
252b5132
RH
8838 break;
8839 case 0xf2:
8840 prefixes |= PREFIX_REPNZ;
f16cd0d5 8841 last_repnz_prefix = i;
252b5132
RH
8842 break;
8843 case 0xf0:
8844 prefixes |= PREFIX_LOCK;
f16cd0d5 8845 last_lock_prefix = i;
252b5132
RH
8846 break;
8847 case 0x2e:
8848 prefixes |= PREFIX_CS;
f16cd0d5 8849 last_seg_prefix = i;
285ca992 8850 active_seg_prefix = PREFIX_CS;
252b5132
RH
8851 break;
8852 case 0x36:
8853 prefixes |= PREFIX_SS;
f16cd0d5 8854 last_seg_prefix = i;
285ca992 8855 active_seg_prefix = PREFIX_SS;
252b5132
RH
8856 break;
8857 case 0x3e:
8858 prefixes |= PREFIX_DS;
f16cd0d5 8859 last_seg_prefix = i;
285ca992 8860 active_seg_prefix = PREFIX_DS;
252b5132
RH
8861 break;
8862 case 0x26:
8863 prefixes |= PREFIX_ES;
f16cd0d5 8864 last_seg_prefix = i;
285ca992 8865 active_seg_prefix = PREFIX_ES;
252b5132
RH
8866 break;
8867 case 0x64:
8868 prefixes |= PREFIX_FS;
f16cd0d5 8869 last_seg_prefix = i;
285ca992 8870 active_seg_prefix = PREFIX_FS;
252b5132
RH
8871 break;
8872 case 0x65:
8873 prefixes |= PREFIX_GS;
f16cd0d5 8874 last_seg_prefix = i;
285ca992 8875 active_seg_prefix = PREFIX_GS;
252b5132
RH
8876 break;
8877 case 0x66:
8878 prefixes |= PREFIX_DATA;
f16cd0d5 8879 last_data_prefix = i;
252b5132
RH
8880 break;
8881 case 0x67:
8882 prefixes |= PREFIX_ADDR;
f16cd0d5 8883 last_addr_prefix = i;
252b5132 8884 break;
5076851f 8885 case FWAIT_OPCODE:
252b5132
RH
8886 /* fwait is really an instruction. If there are prefixes
8887 before the fwait, they belong to the fwait, *not* to the
8888 following instruction. */
d9949a36 8889 fwait_prefix = i;
3e7d61b2 8890 if (prefixes || rex)
252b5132
RH
8891 {
8892 prefixes |= PREFIX_FWAIT;
8893 codep++;
6c067bbb
RM
8894 /* This ensures that the previous REX prefixes are noticed
8895 as unused prefixes, as in the return case below. */
8896 rex_used = rex;
f16cd0d5 8897 return 1;
252b5132
RH
8898 }
8899 prefixes = PREFIX_FWAIT;
8900 break;
8901 default:
f16cd0d5 8902 return 1;
252b5132 8903 }
52b15da3
JH
8904 /* Rex is ignored when followed by another prefix. */
8905 if (rex)
8906 {
3e7d61b2 8907 rex_used = rex;
f16cd0d5 8908 return 1;
52b15da3 8909 }
f16cd0d5 8910 if (*codep != FWAIT_OPCODE)
4e9ac44a 8911 all_prefixes[i++] = *codep;
52b15da3 8912 rex = newrex;
252b5132 8913 codep++;
f16cd0d5
L
8914 length++;
8915 }
8916 return 0;
8917}
8918
7d421014
ILT
8919/* Return the name of the prefix byte PREF, or NULL if PREF is not a
8920 prefix byte. */
8921
8922static const char *
26ca5450 8923prefix_name (int pref, int sizeflag)
7d421014 8924{
0003779b
L
8925 static const char *rexes [16] =
8926 {
8927 "rex", /* 0x40 */
8928 "rex.B", /* 0x41 */
8929 "rex.X", /* 0x42 */
8930 "rex.XB", /* 0x43 */
8931 "rex.R", /* 0x44 */
8932 "rex.RB", /* 0x45 */
8933 "rex.RX", /* 0x46 */
8934 "rex.RXB", /* 0x47 */
8935 "rex.W", /* 0x48 */
8936 "rex.WB", /* 0x49 */
8937 "rex.WX", /* 0x4a */
8938 "rex.WXB", /* 0x4b */
8939 "rex.WR", /* 0x4c */
8940 "rex.WRB", /* 0x4d */
8941 "rex.WRX", /* 0x4e */
8942 "rex.WRXB", /* 0x4f */
8943 };
8944
7d421014
ILT
8945 switch (pref)
8946 {
52b15da3
JH
8947 /* REX prefixes family. */
8948 case 0x40:
52b15da3 8949 case 0x41:
52b15da3 8950 case 0x42:
52b15da3 8951 case 0x43:
52b15da3 8952 case 0x44:
52b15da3 8953 case 0x45:
52b15da3 8954 case 0x46:
52b15da3 8955 case 0x47:
52b15da3 8956 case 0x48:
52b15da3 8957 case 0x49:
52b15da3 8958 case 0x4a:
52b15da3 8959 case 0x4b:
52b15da3 8960 case 0x4c:
52b15da3 8961 case 0x4d:
52b15da3 8962 case 0x4e:
52b15da3 8963 case 0x4f:
0003779b 8964 return rexes [pref - 0x40];
7d421014
ILT
8965 case 0xf3:
8966 return "repz";
8967 case 0xf2:
8968 return "repnz";
8969 case 0xf0:
8970 return "lock";
8971 case 0x2e:
8972 return "cs";
8973 case 0x36:
8974 return "ss";
8975 case 0x3e:
8976 return "ds";
8977 case 0x26:
8978 return "es";
8979 case 0x64:
8980 return "fs";
8981 case 0x65:
8982 return "gs";
8983 case 0x66:
8984 return (sizeflag & DFLAG) ? "data16" : "data32";
8985 case 0x67:
cb712a9e 8986 if (address_mode == mode_64bit)
db6eb5be 8987 return (sizeflag & AFLAG) ? "addr32" : "addr64";
c1a64871 8988 else
2888cb7a 8989 return (sizeflag & AFLAG) ? "addr16" : "addr32";
7d421014
ILT
8990 case FWAIT_OPCODE:
8991 return "fwait";
f16cd0d5
L
8992 case REP_PREFIX:
8993 return "rep";
42164a71
L
8994 case XACQUIRE_PREFIX:
8995 return "xacquire";
8996 case XRELEASE_PREFIX:
8997 return "xrelease";
7e8b059b
L
8998 case BND_PREFIX:
8999 return "bnd";
04ef582a
L
9000 case NOTRACK_PREFIX:
9001 return "notrack";
7d421014
ILT
9002 default:
9003 return NULL;
9004 }
9005}
9006
ce518a5f
L
9007static char op_out[MAX_OPERANDS][100];
9008static int op_ad, op_index[MAX_OPERANDS];
1d9f512f 9009static int two_source_ops;
ce518a5f
L
9010static bfd_vma op_address[MAX_OPERANDS];
9011static bfd_vma op_riprel[MAX_OPERANDS];
52b15da3 9012static bfd_vma start_pc;
ce518a5f 9013
252b5132
RH
9014/*
9015 * On the 386's of 1988, the maximum length of an instruction is 15 bytes.
9016 * (see topic "Redundant prefixes" in the "Differences from 8086"
9017 * section of the "Virtual 8086 Mode" chapter.)
9018 * 'pc' should be the address of this instruction, it will
9019 * be used to print the target address if this is a relative jump or call
9020 * The function returns the length of this instruction in bytes.
9021 */
9022
252b5132 9023static char intel_syntax;
9d141669 9024static char intel_mnemonic = !SYSV386_COMPAT;
252b5132
RH
9025static char open_char;
9026static char close_char;
9027static char separator_char;
9028static char scale_char;
9029
5db04b09
L
9030enum x86_64_isa
9031{
d835a58b 9032 amd64 = 1,
5db04b09
L
9033 intel64
9034};
9035
9036static enum x86_64_isa isa64;
9037
e396998b
AM
9038/* Here for backwards compatibility. When gdb stops using
9039 print_insn_i386_att and print_insn_i386_intel these functions can
9040 disappear, and print_insn_i386 be merged into print_insn. */
252b5132 9041int
26ca5450 9042print_insn_i386_att (bfd_vma pc, disassemble_info *info)
252b5132
RH
9043{
9044 intel_syntax = 0;
e396998b
AM
9045
9046 return print_insn (pc, info);
252b5132
RH
9047}
9048
9049int
26ca5450 9050print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
252b5132
RH
9051{
9052 intel_syntax = 1;
e396998b
AM
9053
9054 return print_insn (pc, info);
252b5132
RH
9055}
9056
e396998b 9057int
26ca5450 9058print_insn_i386 (bfd_vma pc, disassemble_info *info)
e396998b
AM
9059{
9060 intel_syntax = -1;
9061
9062 return print_insn (pc, info);
9063}
9064
f59a29b9
L
9065void
9066print_i386_disassembler_options (FILE *stream)
9067{
9068 fprintf (stream, _("\n\
9069The following i386/x86-64 specific disassembler options are supported for use\n\
9070with the -M switch (multiple options should be separated by commas):\n"));
9071
9072 fprintf (stream, _(" x86-64 Disassemble in 64bit mode\n"));
9073 fprintf (stream, _(" i386 Disassemble in 32bit mode\n"));
9074 fprintf (stream, _(" i8086 Disassemble in 16bit mode\n"));
9075 fprintf (stream, _(" att Display instruction in AT&T syntax\n"));
9076 fprintf (stream, _(" intel Display instruction in Intel syntax\n"));
9d141669
L
9077 fprintf (stream, _(" att-mnemonic\n"
9078 " Display instruction in AT&T mnemonic\n"));
9079 fprintf (stream, _(" intel-mnemonic\n"
9080 " Display instruction in Intel mnemonic\n"));
f59a29b9
L
9081 fprintf (stream, _(" addr64 Assume 64bit address size\n"));
9082 fprintf (stream, _(" addr32 Assume 32bit address size\n"));
9083 fprintf (stream, _(" addr16 Assume 16bit address size\n"));
9084 fprintf (stream, _(" data32 Assume 32bit data size\n"));
9085 fprintf (stream, _(" data16 Assume 16bit data size\n"));
9086 fprintf (stream, _(" suffix Always display instruction suffix in AT&T syntax\n"));
5db04b09
L
9087 fprintf (stream, _(" amd64 Display instruction in AMD64 ISA\n"));
9088 fprintf (stream, _(" intel64 Display instruction in Intel64 ISA\n"));
f59a29b9
L
9089}
9090
592d1631 9091/* Bad opcode. */
bf890a93 9092static const struct dis386 bad_opcode = { "(bad)", { XX }, 0 };
592d1631 9093
b844680a
L
9094/* Get a pointer to struct dis386 with a valid name. */
9095
9096static const struct dis386 *
8bb15339 9097get_valid_dis386 (const struct dis386 *dp, disassemble_info *info)
b844680a 9098{
91d6fa6a 9099 int vindex, vex_table_index;
b844680a
L
9100
9101 if (dp->name != NULL)
9102 return dp;
9103
9104 switch (dp->op[0].bytemode)
9105 {
1ceb70f8
L
9106 case USE_REG_TABLE:
9107 dp = &reg_table[dp->op[1].bytemode][modrm.reg];
9108 break;
9109
9110 case USE_MOD_TABLE:
91d6fa6a
NC
9111 vindex = modrm.mod == 0x3 ? 1 : 0;
9112 dp = &mod_table[dp->op[1].bytemode][vindex];
1ceb70f8
L
9113 break;
9114
9115 case USE_RM_TABLE:
9116 dp = &rm_table[dp->op[1].bytemode][modrm.rm];
b844680a
L
9117 break;
9118
4e7d34a6 9119 case USE_PREFIX_TABLE:
c0f3af97 9120 if (need_vex)
b844680a 9121 {
c0f3af97
L
9122 /* The prefix in VEX is implicit. */
9123 switch (vex.prefix)
9124 {
9125 case 0:
91d6fa6a 9126 vindex = 0;
c0f3af97
L
9127 break;
9128 case REPE_PREFIX_OPCODE:
91d6fa6a 9129 vindex = 1;
c0f3af97
L
9130 break;
9131 case DATA_PREFIX_OPCODE:
91d6fa6a 9132 vindex = 2;
c0f3af97
L
9133 break;
9134 case REPNE_PREFIX_OPCODE:
91d6fa6a 9135 vindex = 3;
c0f3af97
L
9136 break;
9137 default:
9138 abort ();
9139 break;
9140 }
b844680a 9141 }
7bb15c6f 9142 else
b844680a 9143 {
285ca992
L
9144 int last_prefix = -1;
9145 int prefix = 0;
91d6fa6a 9146 vindex = 0;
285ca992
L
9147 /* We check PREFIX_REPNZ and PREFIX_REPZ before PREFIX_DATA.
9148 When there are multiple PREFIX_REPNZ and PREFIX_REPZ, the
9149 last one wins. */
9150 if ((prefixes & (PREFIX_REPZ | PREFIX_REPNZ)) != 0)
b844680a 9151 {
285ca992 9152 if (last_repz_prefix > last_repnz_prefix)
c0f3af97 9153 {
285ca992
L
9154 vindex = 1;
9155 prefix = PREFIX_REPZ;
9156 last_prefix = last_repz_prefix;
c0f3af97
L
9157 }
9158 else
b844680a 9159 {
285ca992
L
9160 vindex = 3;
9161 prefix = PREFIX_REPNZ;
9162 last_prefix = last_repnz_prefix;
b844680a 9163 }
285ca992 9164
507bd325
L
9165 /* Check if prefix should be ignored. */
9166 if ((((prefix_table[dp->op[1].bytemode][vindex].prefix_requirement
9167 & PREFIX_IGNORED) >> PREFIX_IGNORED_SHIFT)
9168 & prefix) != 0)
285ca992
L
9169 vindex = 0;
9170 }
9171
9172 if (vindex == 0 && (prefixes & PREFIX_DATA) != 0)
9173 {
9174 vindex = 2;
9175 prefix = PREFIX_DATA;
9176 last_prefix = last_data_prefix;
9177 }
9178
9179 if (vindex != 0)
9180 {
9181 used_prefixes |= prefix;
9182 all_prefixes[last_prefix] = 0;
b844680a
L
9183 }
9184 }
91d6fa6a 9185 dp = &prefix_table[dp->op[1].bytemode][vindex];
b844680a
L
9186 break;
9187
4e7d34a6 9188 case USE_X86_64_TABLE:
91d6fa6a
NC
9189 vindex = address_mode == mode_64bit ? 1 : 0;
9190 dp = &x86_64_table[dp->op[1].bytemode][vindex];
b844680a
L
9191 break;
9192
4e7d34a6 9193 case USE_3BYTE_TABLE:
8bb15339 9194 FETCH_DATA (info, codep + 2);
91d6fa6a
NC
9195 vindex = *codep++;
9196 dp = &three_byte_table[dp->op[1].bytemode][vindex];
285ca992 9197 end_codep = codep;
8bb15339
L
9198 modrm.mod = (*codep >> 6) & 3;
9199 modrm.reg = (*codep >> 3) & 7;
9200 modrm.rm = *codep & 7;
9201 break;
9202
c0f3af97
L
9203 case USE_VEX_LEN_TABLE:
9204 if (!need_vex)
9205 abort ();
9206
9207 switch (vex.length)
9208 {
9209 case 128:
91d6fa6a 9210 vindex = 0;
c0f3af97
L
9211 break;
9212 case 256:
91d6fa6a 9213 vindex = 1;
c0f3af97
L
9214 break;
9215 default:
9216 abort ();
9217 break;
9218 }
9219
91d6fa6a 9220 dp = &vex_len_table[dp->op[1].bytemode][vindex];
c0f3af97
L
9221 break;
9222
04e2a182
L
9223 case USE_EVEX_LEN_TABLE:
9224 if (!vex.evex)
9225 abort ();
9226
9227 switch (vex.length)
9228 {
9229 case 128:
9230 vindex = 0;
9231 break;
9232 case 256:
9233 vindex = 1;
9234 break;
9235 case 512:
9236 vindex = 2;
9237 break;
9238 default:
9239 abort ();
9240 break;
9241 }
9242
9243 dp = &evex_len_table[dp->op[1].bytemode][vindex];
9244 break;
9245
f88c9eb0
SP
9246 case USE_XOP_8F_TABLE:
9247 FETCH_DATA (info, codep + 3);
f88c9eb0
SP
9248 rex = ~(*codep >> 5) & 0x7;
9249
9250 /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm". */
9251 switch ((*codep & 0x1f))
9252 {
9253 default:
f07af43e
L
9254 dp = &bad_opcode;
9255 return dp;
5dd85c99
SP
9256 case 0x8:
9257 vex_table_index = XOP_08;
9258 break;
f88c9eb0
SP
9259 case 0x9:
9260 vex_table_index = XOP_09;
9261 break;
9262 case 0xa:
9263 vex_table_index = XOP_0A;
9264 break;
9265 }
9266 codep++;
9267 vex.w = *codep & 0x80;
9268 if (vex.w && address_mode == mode_64bit)
9269 rex |= REX_W;
9270
9271 vex.register_specifier = (~(*codep >> 3)) & 0xf;
abfcb414 9272 if (address_mode != mode_64bit)
f07af43e 9273 {
abfcb414
AP
9274 /* In 16/32-bit mode REX_B is silently ignored. */
9275 rex &= ~REX_B;
f07af43e 9276 }
f88c9eb0
SP
9277
9278 vex.length = (*codep & 0x4) ? 256 : 128;
9279 switch ((*codep & 0x3))
9280 {
9281 case 0:
f88c9eb0
SP
9282 break;
9283 case 1:
9284 vex.prefix = DATA_PREFIX_OPCODE;
9285 break;
9286 case 2:
9287 vex.prefix = REPE_PREFIX_OPCODE;
9288 break;
9289 case 3:
9290 vex.prefix = REPNE_PREFIX_OPCODE;
9291 break;
9292 }
9293 need_vex = 1;
f88c9eb0 9294 codep++;
91d6fa6a
NC
9295 vindex = *codep++;
9296 dp = &xop_table[vex_table_index][vindex];
c48244a5 9297
285ca992 9298 end_codep = codep;
c48244a5
SP
9299 FETCH_DATA (info, codep + 1);
9300 modrm.mod = (*codep >> 6) & 3;
9301 modrm.reg = (*codep >> 3) & 7;
9302 modrm.rm = *codep & 7;
b5b098c2
JB
9303
9304 /* No XOP encoding so far allows for a non-zero embedded prefix. Avoid
9305 having to decode the bits for every otherwise valid encoding. */
9306 if (vex.prefix)
9307 return &bad_opcode;
f88c9eb0
SP
9308 break;
9309
c0f3af97 9310 case USE_VEX_C4_TABLE:
43234a1e 9311 /* VEX prefix. */
c0f3af97 9312 FETCH_DATA (info, codep + 3);
c0f3af97
L
9313 rex = ~(*codep >> 5) & 0x7;
9314 switch ((*codep & 0x1f))
9315 {
9316 default:
f07af43e
L
9317 dp = &bad_opcode;
9318 return dp;
c0f3af97 9319 case 0x1:
f88c9eb0 9320 vex_table_index = VEX_0F;
c0f3af97
L
9321 break;
9322 case 0x2:
f88c9eb0 9323 vex_table_index = VEX_0F38;
c0f3af97
L
9324 break;
9325 case 0x3:
f88c9eb0 9326 vex_table_index = VEX_0F3A;
c0f3af97
L
9327 break;
9328 }
9329 codep++;
9330 vex.w = *codep & 0x80;
9889cbb1 9331 if (address_mode == mode_64bit)
f07af43e 9332 {
9889cbb1
L
9333 if (vex.w)
9334 rex |= REX_W;
9889cbb1
L
9335 }
9336 else
9337 {
9338 /* For the 3-byte VEX prefix in 32-bit mode, the REX_B bit
9339 is ignored, other REX bits are 0 and the highest bit in
5f847646 9340 VEX.vvvv is also ignored (but we mustn't clear it here). */
9889cbb1 9341 rex = 0;
f07af43e 9342 }
5f847646 9343 vex.register_specifier = (~(*codep >> 3)) & 0xf;
c0f3af97
L
9344 vex.length = (*codep & 0x4) ? 256 : 128;
9345 switch ((*codep & 0x3))
9346 {
9347 case 0:
c0f3af97
L
9348 break;
9349 case 1:
9350 vex.prefix = DATA_PREFIX_OPCODE;
9351 break;
9352 case 2:
9353 vex.prefix = REPE_PREFIX_OPCODE;
9354 break;
9355 case 3:
9356 vex.prefix = REPNE_PREFIX_OPCODE;
9357 break;
9358 }
9359 need_vex = 1;
c0f3af97 9360 codep++;
91d6fa6a
NC
9361 vindex = *codep++;
9362 dp = &vex_table[vex_table_index][vindex];
285ca992 9363 end_codep = codep;
53c4d625
JB
9364 /* There is no MODRM byte for VEX0F 77. */
9365 if (vex_table_index != VEX_0F || vindex != 0x77)
c0f3af97
L
9366 {
9367 FETCH_DATA (info, codep + 1);
9368 modrm.mod = (*codep >> 6) & 3;
9369 modrm.reg = (*codep >> 3) & 7;
9370 modrm.rm = *codep & 7;
9371 }
9372 break;
9373
9374 case USE_VEX_C5_TABLE:
43234a1e 9375 /* VEX prefix. */
c0f3af97 9376 FETCH_DATA (info, codep + 2);
c0f3af97
L
9377 rex = (*codep & 0x80) ? 0 : REX_R;
9378
9889cbb1
L
9379 /* For the 2-byte VEX prefix in 32-bit mode, the highest bit in
9380 VEX.vvvv is 1. */
c0f3af97 9381 vex.register_specifier = (~(*codep >> 3)) & 0xf;
c0f3af97
L
9382 vex.length = (*codep & 0x4) ? 256 : 128;
9383 switch ((*codep & 0x3))
9384 {
9385 case 0:
c0f3af97
L
9386 break;
9387 case 1:
9388 vex.prefix = DATA_PREFIX_OPCODE;
9389 break;
9390 case 2:
9391 vex.prefix = REPE_PREFIX_OPCODE;
9392 break;
9393 case 3:
9394 vex.prefix = REPNE_PREFIX_OPCODE;
9395 break;
9396 }
9397 need_vex = 1;
c0f3af97 9398 codep++;
91d6fa6a
NC
9399 vindex = *codep++;
9400 dp = &vex_table[dp->op[1].bytemode][vindex];
285ca992 9401 end_codep = codep;
53c4d625
JB
9402 /* There is no MODRM byte for VEX 77. */
9403 if (vindex != 0x77)
c0f3af97
L
9404 {
9405 FETCH_DATA (info, codep + 1);
9406 modrm.mod = (*codep >> 6) & 3;
9407 modrm.reg = (*codep >> 3) & 7;
9408 modrm.rm = *codep & 7;
9409 }
9410 break;
9411
9e30b8e0
L
9412 case USE_VEX_W_TABLE:
9413 if (!need_vex)
9414 abort ();
9415
9416 dp = &vex_w_table[dp->op[1].bytemode][vex.w ? 1 : 0];
9417 break;
9418
43234a1e
L
9419 case USE_EVEX_TABLE:
9420 two_source_ops = 0;
9421 /* EVEX prefix. */
9422 vex.evex = 1;
9423 FETCH_DATA (info, codep + 4);
43234a1e
L
9424 /* The first byte after 0x62. */
9425 rex = ~(*codep >> 5) & 0x7;
9426 vex.r = *codep & 0x10;
9427 switch ((*codep & 0xf))
9428 {
9429 default:
9430 return &bad_opcode;
9431 case 0x1:
9432 vex_table_index = EVEX_0F;
9433 break;
9434 case 0x2:
9435 vex_table_index = EVEX_0F38;
9436 break;
9437 case 0x3:
9438 vex_table_index = EVEX_0F3A;
9439 break;
9440 }
9441
9442 /* The second byte after 0x62. */
9443 codep++;
9444 vex.w = *codep & 0x80;
9445 if (vex.w && address_mode == mode_64bit)
9446 rex |= REX_W;
9447
9448 vex.register_specifier = (~(*codep >> 3)) & 0xf;
43234a1e
L
9449
9450 /* The U bit. */
9451 if (!(*codep & 0x4))
9452 return &bad_opcode;
9453
9454 switch ((*codep & 0x3))
9455 {
9456 case 0:
43234a1e
L
9457 break;
9458 case 1:
9459 vex.prefix = DATA_PREFIX_OPCODE;
9460 break;
9461 case 2:
9462 vex.prefix = REPE_PREFIX_OPCODE;
9463 break;
9464 case 3:
9465 vex.prefix = REPNE_PREFIX_OPCODE;
9466 break;
9467 }
9468
9469 /* The third byte after 0x62. */
9470 codep++;
9471
9472 /* Remember the static rounding bits. */
9473 vex.ll = (*codep >> 5) & 3;
9474 vex.b = (*codep & 0x10) != 0;
9475
9476 vex.v = *codep & 0x8;
9477 vex.mask_register_specifier = *codep & 0x7;
9478 vex.zeroing = *codep & 0x80;
9479
5f847646
JB
9480 if (address_mode != mode_64bit)
9481 {
9482 /* In 16/32-bit mode silently ignore following bits. */
9483 rex &= ~REX_B;
9484 vex.r = 1;
9485 vex.v = 1;
9486 }
9487
43234a1e 9488 need_vex = 1;
43234a1e
L
9489 codep++;
9490 vindex = *codep++;
9491 dp = &evex_table[vex_table_index][vindex];
285ca992 9492 end_codep = codep;
43234a1e
L
9493 FETCH_DATA (info, codep + 1);
9494 modrm.mod = (*codep >> 6) & 3;
9495 modrm.reg = (*codep >> 3) & 7;
9496 modrm.rm = *codep & 7;
9497
9498 /* Set vector length. */
9499 if (modrm.mod == 3 && vex.b)
9500 vex.length = 512;
9501 else
9502 {
9503 switch (vex.ll)
9504 {
9505 case 0x0:
9506 vex.length = 128;
9507 break;
9508 case 0x1:
9509 vex.length = 256;
9510 break;
9511 case 0x2:
9512 vex.length = 512;
9513 break;
9514 default:
9515 return &bad_opcode;
9516 }
9517 }
9518 break;
9519
592d1631
L
9520 case 0:
9521 dp = &bad_opcode;
9522 break;
9523
b844680a 9524 default:
d34b5006 9525 abort ();
b844680a
L
9526 }
9527
9528 if (dp->name != NULL)
9529 return dp;
9530 else
8bb15339 9531 return get_valid_dis386 (dp, info);
b844680a
L
9532}
9533
dfc8cf43 9534static void
55cf16e1 9535get_sib (disassemble_info *info, int sizeflag)
dfc8cf43
L
9536{
9537 /* If modrm.mod == 3, operand must be register. */
9538 if (need_modrm
55cf16e1 9539 && ((sizeflag & AFLAG) || address_mode == mode_64bit)
dfc8cf43
L
9540 && modrm.mod != 3
9541 && modrm.rm == 4)
9542 {
9543 FETCH_DATA (info, codep + 2);
9544 sib.index = (codep [1] >> 3) & 7;
9545 sib.scale = (codep [1] >> 6) & 3;
9546 sib.base = codep [1] & 7;
9547 }
9548}
9549
e396998b 9550static int
26ca5450 9551print_insn (bfd_vma pc, disassemble_info *info)
252b5132 9552{
2da11e11 9553 const struct dis386 *dp;
252b5132 9554 int i;
ce518a5f 9555 char *op_txt[MAX_OPERANDS];
252b5132 9556 int needcomma;
df18fdba 9557 int sizeflag, orig_sizeflag;
e396998b 9558 const char *p;
252b5132 9559 struct dis_private priv;
f16cd0d5 9560 int prefix_length;
252b5132 9561
d7921315
L
9562 priv.orig_sizeflag = AFLAG | DFLAG;
9563 if ((info->mach & bfd_mach_i386_i386) != 0)
cb712a9e 9564 address_mode = mode_32bit;
2da11e11 9565 else if (info->mach == bfd_mach_i386_i8086)
d7921315
L
9566 {
9567 address_mode = mode_16bit;
9568 priv.orig_sizeflag = 0;
9569 }
2da11e11 9570 else
d7921315
L
9571 address_mode = mode_64bit;
9572
9573 if (intel_syntax == (char) -1)
9574 intel_syntax = (info->mach & bfd_mach_i386_intel_syntax) != 0;
e396998b
AM
9575
9576 for (p = info->disassembler_options; p != NULL; )
9577 {
5db04b09
L
9578 if (CONST_STRNEQ (p, "amd64"))
9579 isa64 = amd64;
9580 else if (CONST_STRNEQ (p, "intel64"))
9581 isa64 = intel64;
9582 else if (CONST_STRNEQ (p, "x86-64"))
e396998b 9583 {
cb712a9e 9584 address_mode = mode_64bit;
2a1bb84c 9585 priv.orig_sizeflag |= AFLAG | DFLAG;
e396998b 9586 }
0112cd26 9587 else if (CONST_STRNEQ (p, "i386"))
e396998b 9588 {
cb712a9e 9589 address_mode = mode_32bit;
2a1bb84c 9590 priv.orig_sizeflag |= AFLAG | DFLAG;
e396998b 9591 }
0112cd26 9592 else if (CONST_STRNEQ (p, "i8086"))
e396998b 9593 {
cb712a9e 9594 address_mode = mode_16bit;
2a1bb84c 9595 priv.orig_sizeflag &= ~(AFLAG | DFLAG);
e396998b 9596 }
0112cd26 9597 else if (CONST_STRNEQ (p, "intel"))
e396998b
AM
9598 {
9599 intel_syntax = 1;
9d141669
L
9600 if (CONST_STRNEQ (p + 5, "-mnemonic"))
9601 intel_mnemonic = 1;
e396998b 9602 }
0112cd26 9603 else if (CONST_STRNEQ (p, "att"))
e396998b
AM
9604 {
9605 intel_syntax = 0;
9d141669
L
9606 if (CONST_STRNEQ (p + 3, "-mnemonic"))
9607 intel_mnemonic = 0;
e396998b 9608 }
0112cd26 9609 else if (CONST_STRNEQ (p, "addr"))
e396998b 9610 {
f59a29b9
L
9611 if (address_mode == mode_64bit)
9612 {
9613 if (p[4] == '3' && p[5] == '2')
9614 priv.orig_sizeflag &= ~AFLAG;
9615 else if (p[4] == '6' && p[5] == '4')
9616 priv.orig_sizeflag |= AFLAG;
9617 }
9618 else
9619 {
9620 if (p[4] == '1' && p[5] == '6')
9621 priv.orig_sizeflag &= ~AFLAG;
9622 else if (p[4] == '3' && p[5] == '2')
9623 priv.orig_sizeflag |= AFLAG;
9624 }
e396998b 9625 }
0112cd26 9626 else if (CONST_STRNEQ (p, "data"))
e396998b
AM
9627 {
9628 if (p[4] == '1' && p[5] == '6')
9629 priv.orig_sizeflag &= ~DFLAG;
9630 else if (p[4] == '3' && p[5] == '2')
9631 priv.orig_sizeflag |= DFLAG;
9632 }
0112cd26 9633 else if (CONST_STRNEQ (p, "suffix"))
e396998b
AM
9634 priv.orig_sizeflag |= SUFFIX_ALWAYS;
9635
9636 p = strchr (p, ',');
9637 if (p != NULL)
9638 p++;
9639 }
9640
c0f92bf9
L
9641 if (address_mode == mode_64bit && sizeof (bfd_vma) < 8)
9642 {
9643 (*info->fprintf_func) (info->stream,
9644 _("64-bit address is disabled"));
9645 return -1;
9646 }
9647
e396998b
AM
9648 if (intel_syntax)
9649 {
9650 names64 = intel_names64;
9651 names32 = intel_names32;
9652 names16 = intel_names16;
9653 names8 = intel_names8;
9654 names8rex = intel_names8rex;
9655 names_seg = intel_names_seg;
b9733481 9656 names_mm = intel_names_mm;
7e8b059b 9657 names_bnd = intel_names_bnd;
b9733481
L
9658 names_xmm = intel_names_xmm;
9659 names_ymm = intel_names_ymm;
43234a1e 9660 names_zmm = intel_names_zmm;
260cd341 9661 names_tmm = intel_names_tmm;
db51cc60
L
9662 index64 = intel_index64;
9663 index32 = intel_index32;
43234a1e 9664 names_mask = intel_names_mask;
e396998b
AM
9665 index16 = intel_index16;
9666 open_char = '[';
9667 close_char = ']';
9668 separator_char = '+';
9669 scale_char = '*';
9670 }
9671 else
9672 {
9673 names64 = att_names64;
9674 names32 = att_names32;
9675 names16 = att_names16;
9676 names8 = att_names8;
9677 names8rex = att_names8rex;
9678 names_seg = att_names_seg;
b9733481 9679 names_mm = att_names_mm;
7e8b059b 9680 names_bnd = att_names_bnd;
b9733481
L
9681 names_xmm = att_names_xmm;
9682 names_ymm = att_names_ymm;
43234a1e 9683 names_zmm = att_names_zmm;
260cd341 9684 names_tmm = att_names_tmm;
db51cc60
L
9685 index64 = att_index64;
9686 index32 = att_index32;
43234a1e 9687 names_mask = att_names_mask;
e396998b
AM
9688 index16 = att_index16;
9689 open_char = '(';
9690 close_char = ')';
9691 separator_char = ',';
9692 scale_char = ',';
9693 }
2da11e11 9694
4fe53c98 9695 /* The output looks better if we put 7 bytes on a line, since that
8a9036a4
L
9696 puts most long word instructions on a single line. Use 8 bytes
9697 for Intel L1OM. */
d7921315 9698 if ((info->mach & bfd_mach_l1om) != 0)
8a9036a4
L
9699 info->bytes_per_line = 8;
9700 else
9701 info->bytes_per_line = 7;
252b5132 9702
26ca5450 9703 info->private_data = &priv;
252b5132
RH
9704 priv.max_fetched = priv.the_buffer;
9705 priv.insn_start = pc;
252b5132
RH
9706
9707 obuf[0] = 0;
ce518a5f
L
9708 for (i = 0; i < MAX_OPERANDS; ++i)
9709 {
9710 op_out[i][0] = 0;
9711 op_index[i] = -1;
9712 }
252b5132
RH
9713
9714 the_info = info;
9715 start_pc = pc;
e396998b
AM
9716 start_codep = priv.the_buffer;
9717 codep = priv.the_buffer;
252b5132 9718
8df14d78 9719 if (OPCODES_SIGSETJMP (priv.bailout) != 0)
5076851f 9720 {
7d421014
ILT
9721 const char *name;
9722
5076851f 9723 /* Getting here means we tried for data but didn't get it. That
e396998b
AM
9724 means we have an incomplete instruction of some sort. Just
9725 print the first byte as a prefix or a .byte pseudo-op. */
9726 if (codep > priv.the_buffer)
5076851f 9727 {
e396998b 9728 name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
7d421014
ILT
9729 if (name != NULL)
9730 (*info->fprintf_func) (info->stream, "%s", name);
9731 else
5076851f 9732 {
7d421014
ILT
9733 /* Just print the first byte as a .byte instruction. */
9734 (*info->fprintf_func) (info->stream, ".byte 0x%x",
e396998b 9735 (unsigned int) priv.the_buffer[0]);
5076851f 9736 }
5076851f 9737
7d421014 9738 return 1;
5076851f
ILT
9739 }
9740
9741 return -1;
9742 }
9743
52b15da3 9744 obufp = obuf;
f16cd0d5
L
9745 sizeflag = priv.orig_sizeflag;
9746
9747 if (!ckprefix () || rex_used)
9748 {
9749 /* Too many prefixes or unused REX prefixes. */
9750 for (i = 0;
f6dd4781 9751 i < (int) ARRAY_SIZE (all_prefixes) && all_prefixes[i];
f16cd0d5 9752 i++)
de882298 9753 (*info->fprintf_func) (info->stream, "%s%s",
6c067bbb 9754 i == 0 ? "" : " ",
f16cd0d5 9755 prefix_name (all_prefixes[i], sizeflag));
de882298 9756 return i;
f16cd0d5 9757 }
252b5132
RH
9758
9759 insn_codep = codep;
9760
9761 FETCH_DATA (info, codep + 1);
9762 two_source_ops = (*codep == 0x62) || (*codep == 0xc8);
9763
3e7d61b2 9764 if (((prefixes & PREFIX_FWAIT)
f16cd0d5 9765 && ((*codep < 0xd8) || (*codep > 0xdf))))
252b5132 9766 {
86a80a50 9767 /* Handle prefixes before fwait. */
d9949a36 9768 for (i = 0; i < fwait_prefix && all_prefixes[i];
86a80a50
L
9769 i++)
9770 (*info->fprintf_func) (info->stream, "%s ",
9771 prefix_name (all_prefixes[i], sizeflag));
f16cd0d5 9772 (*info->fprintf_func) (info->stream, "fwait");
86a80a50 9773 return i + 1;
252b5132
RH
9774 }
9775
252b5132
RH
9776 if (*codep == 0x0f)
9777 {
eec0f4ca 9778 unsigned char threebyte;
5f40e14d
JS
9779
9780 codep++;
9781 FETCH_DATA (info, codep + 1);
9782 threebyte = *codep;
eec0f4ca 9783 dp = &dis386_twobyte[threebyte];
252b5132 9784 need_modrm = twobyte_has_modrm[*codep];
eec0f4ca 9785 codep++;
252b5132
RH
9786 }
9787 else
9788 {
6439fc28 9789 dp = &dis386[*codep];
252b5132 9790 need_modrm = onebyte_has_modrm[*codep];
eec0f4ca 9791 codep++;
252b5132 9792 }
246c51aa 9793
df18fdba
L
9794 /* Save sizeflag for printing the extra prefixes later before updating
9795 it for mnemonic and operand processing. The prefix names depend
9796 only on the address mode. */
9797 orig_sizeflag = sizeflag;
c608c12e 9798 if (prefixes & PREFIX_ADDR)
df18fdba 9799 sizeflag ^= AFLAG;
b844680a 9800 if ((prefixes & PREFIX_DATA))
df18fdba 9801 sizeflag ^= DFLAG;
3ffd33cf 9802
285ca992 9803 end_codep = codep;
8bb15339 9804 if (need_modrm)
252b5132
RH
9805 {
9806 FETCH_DATA (info, codep + 1);
7967e09e
L
9807 modrm.mod = (*codep >> 6) & 3;
9808 modrm.reg = (*codep >> 3) & 7;
9809 modrm.rm = *codep & 7;
252b5132
RH
9810 }
9811
42d5f9c6 9812 need_vex = 0;
caf0678c 9813 memset (&vex, 0, sizeof (vex));
55b126d4 9814
ce518a5f 9815 if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
252b5132 9816 {
55cf16e1 9817 get_sib (info, sizeflag);
252b5132
RH
9818 dofloat (sizeflag);
9819 }
9820 else
9821 {
8bb15339 9822 dp = get_valid_dis386 (dp, info);
b844680a 9823 if (dp != NULL && putop (dp->name, sizeflag) == 0)
6c067bbb 9824 {
55cf16e1 9825 get_sib (info, sizeflag);
ce518a5f
L
9826 for (i = 0; i < MAX_OPERANDS; ++i)
9827 {
246c51aa 9828 obufp = op_out[i];
ce518a5f
L
9829 op_ad = MAX_OPERANDS - 1 - i;
9830 if (dp->op[i].rtn)
9831 (*dp->op[i].rtn) (dp->op[i].bytemode, sizeflag);
43234a1e
L
9832 /* For EVEX instruction after the last operand masking
9833 should be printed. */
9834 if (i == 0 && vex.evex)
9835 {
9836 /* Don't print {%k0}. */
9837 if (vex.mask_register_specifier)
9838 {
9839 oappend ("{");
9840 oappend (names_mask[vex.mask_register_specifier]);
9841 oappend ("}");
9842 }
9843 if (vex.zeroing)
9844 oappend ("{z}");
9845 }
ce518a5f 9846 }
6439fc28 9847 }
252b5132
RH
9848 }
9849
1d67fe3b
TT
9850 /* Clear instruction information. */
9851 if (the_info)
9852 {
9853 the_info->insn_info_valid = 0;
9854 the_info->branch_delay_insns = 0;
9855 the_info->data_size = 0;
9856 the_info->insn_type = dis_noninsn;
9857 the_info->target = 0;
9858 the_info->target2 = 0;
9859 }
9860
9861 /* Reset jump operation indicator. */
9862 op_is_jump = FALSE;
9863
9864 {
9865 int jump_detection = 0;
9866
9867 /* Extract flags. */
9868 for (i = 0; i < MAX_OPERANDS; ++i)
9869 {
9870 if ((dp->op[i].rtn == OP_J)
9871 || (dp->op[i].rtn == OP_indirE))
9872 jump_detection |= 1;
9873 else if ((dp->op[i].rtn == BND_Fixup)
9874 || (!dp->op[i].rtn && !dp->op[i].bytemode))
9875 jump_detection |= 2;
9876 else if ((dp->op[i].bytemode == cond_jump_mode)
9877 || (dp->op[i].bytemode == loop_jcxz_mode))
9878 jump_detection |= 4;
9879 }
9880
9881 /* Determine if this is a jump or branch. */
9882 if ((jump_detection & 0x3) == 0x3)
9883 {
9884 op_is_jump = TRUE;
9885 if (jump_detection & 0x4)
9886 the_info->insn_type = dis_condbranch;
9887 else
9888 the_info->insn_type =
9889 (dp->name && !strncmp(dp->name, "call", 4))
9890 ? dis_jsr : dis_branch;
9891 }
9892 }
9893
63c6fc6c
L
9894 /* If VEX.vvvv and EVEX.vvvv are unused, they must be all 1s, which
9895 are all 0s in inverted form. */
9896 if (need_vex && vex.register_specifier != 0)
9897 {
9898 (*info->fprintf_func) (info->stream, "(bad)");
9899 return end_codep - priv.the_buffer;
9900 }
9901
7531c613
JB
9902 switch (dp->prefix_requirement)
9903 {
9904 case PREFIX_DATA:
9905 /* If only the data prefix is marked as mandatory, its absence renders
9906 the encoding invalid. Most other PREFIX_OPCODE rules still apply. */
9907 if (need_vex ? !vex.prefix : !(prefixes & PREFIX_DATA))
9908 {
9909 (*info->fprintf_func) (info->stream, "(bad)");
9910 return end_codep - priv.the_buffer;
9911 }
9912 used_prefixes |= PREFIX_DATA;
9913 /* Fall through. */
9914 case PREFIX_OPCODE:
9915 /* If the mandatory PREFIX_REPZ/PREFIX_REPNZ/PREFIX_DATA prefix is
9916 unused, opcode is invalid. Since the PREFIX_DATA prefix may be
9917 used by putop and MMX/SSE operand and may be overridden by the
9918 PREFIX_REPZ/PREFIX_REPNZ fix, we check the PREFIX_DATA prefix
9919 separately. */
9920 if (((need_vex
9921 ? vex.prefix == REPE_PREFIX_OPCODE
9922 || vex.prefix == REPNE_PREFIX_OPCODE
9923 : (prefixes
9924 & (PREFIX_REPZ | PREFIX_REPNZ)) != 0)
9925 && (used_prefixes
9926 & (PREFIX_REPZ | PREFIX_REPNZ)) == 0)
9927 || (((need_vex
9928 ? vex.prefix == DATA_PREFIX_OPCODE
9929 : ((prefixes
9930 & (PREFIX_REPZ | PREFIX_REPNZ | PREFIX_DATA))
9931 == PREFIX_DATA))
9932 && (used_prefixes & PREFIX_DATA) == 0))
9933 || (vex.evex && dp->prefix_requirement != PREFIX_DATA
9934 && !vex.w != !(used_prefixes & PREFIX_DATA)))
9935 {
9936 (*info->fprintf_func) (info->stream, "(bad)");
9937 return end_codep - priv.the_buffer;
9938 }
9939 break;
9940 }
9941
d869730d 9942 /* Check if the REX prefix is used. */
73239888 9943 if ((rex ^ rex_used) == 0 && !need_vex && last_rex_prefix >= 0)
f16cd0d5
L
9944 all_prefixes[last_rex_prefix] = 0;
9945
5e6718e4 9946 /* Check if the SEG prefix is used. */
f16cd0d5
L
9947 if ((prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS | PREFIX_ES
9948 | PREFIX_FS | PREFIX_GS)) != 0
285ca992 9949 && (used_prefixes & active_seg_prefix) != 0)
f16cd0d5
L
9950 all_prefixes[last_seg_prefix] = 0;
9951
5e6718e4 9952 /* Check if the ADDR prefix is used. */
f16cd0d5
L
9953 if ((prefixes & PREFIX_ADDR) != 0
9954 && (used_prefixes & PREFIX_ADDR) != 0)
9955 all_prefixes[last_addr_prefix] = 0;
9956
df18fdba
L
9957 /* Check if the DATA prefix is used. */
9958 if ((prefixes & PREFIX_DATA) != 0
73239888
JB
9959 && (used_prefixes & PREFIX_DATA) != 0
9960 && !need_vex)
df18fdba 9961 all_prefixes[last_data_prefix] = 0;
f16cd0d5 9962
df18fdba 9963 /* Print the extra prefixes. */
f16cd0d5 9964 prefix_length = 0;
f310f33d 9965 for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
f16cd0d5
L
9966 if (all_prefixes[i])
9967 {
9968 const char *name;
df18fdba 9969 name = prefix_name (all_prefixes[i], orig_sizeflag);
f16cd0d5
L
9970 if (name == NULL)
9971 abort ();
9972 prefix_length += strlen (name) + 1;
9973 (*info->fprintf_func) (info->stream, "%s ", name);
9974 }
b844680a 9975
f16cd0d5
L
9976 /* Check maximum code length. */
9977 if ((codep - start_codep) > MAX_CODE_LENGTH)
9978 {
9979 (*info->fprintf_func) (info->stream, "(bad)");
9980 return MAX_CODE_LENGTH;
9981 }
b844680a 9982
ea397f5b 9983 obufp = mnemonicendp;
f16cd0d5 9984 for (i = strlen (obuf) + prefix_length; i < 6; i++)
252b5132
RH
9985 oappend (" ");
9986 oappend (" ");
9987 (*info->fprintf_func) (info->stream, "%s", obuf);
9988
9989 /* The enter and bound instructions are printed with operands in the same
9990 order as the intel book; everything else is printed in reverse order. */
2da11e11 9991 if (intel_syntax || two_source_ops)
252b5132 9992 {
185b1163
L
9993 bfd_vma riprel;
9994
ce518a5f 9995 for (i = 0; i < MAX_OPERANDS; ++i)
6c067bbb 9996 op_txt[i] = op_out[i];
246c51aa 9997
3a8547d2
JB
9998 if (intel_syntax && dp && dp->op[2].rtn == OP_Rounding
9999 && dp->op[3].rtn == OP_E && dp->op[4].rtn == NULL)
10000 {
10001 op_txt[2] = op_out[3];
10002 op_txt[3] = op_out[2];
10003 }
10004
ce518a5f
L
10005 for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
10006 {
6c067bbb
RM
10007 op_ad = op_index[i];
10008 op_index[i] = op_index[MAX_OPERANDS - 1 - i];
10009 op_index[MAX_OPERANDS - 1 - i] = op_ad;
185b1163
L
10010 riprel = op_riprel[i];
10011 op_riprel[i] = op_riprel [MAX_OPERANDS - 1 - i];
10012 op_riprel[MAX_OPERANDS - 1 - i] = riprel;
ce518a5f 10013 }
252b5132
RH
10014 }
10015 else
10016 {
ce518a5f 10017 for (i = 0; i < MAX_OPERANDS; ++i)
6c067bbb 10018 op_txt[MAX_OPERANDS - 1 - i] = op_out[i];
050dfa73
MM
10019 }
10020
ce518a5f
L
10021 needcomma = 0;
10022 for (i = 0; i < MAX_OPERANDS; ++i)
10023 if (*op_txt[i])
10024 {
10025 if (needcomma)
10026 (*info->fprintf_func) (info->stream, ",");
10027 if (op_index[i] != -1 && !op_riprel[i])
1d67fe3b
TT
10028 {
10029 bfd_vma target = (bfd_vma) op_address[op_index[i]];
10030
10031 if (the_info && op_is_jump)
10032 {
10033 the_info->insn_info_valid = 1;
10034 the_info->branch_delay_insns = 0;
10035 the_info->data_size = 0;
10036 the_info->target = target;
10037 the_info->target2 = 0;
10038 }
10039 (*info->print_address_func) (target, info);
10040 }
ce518a5f
L
10041 else
10042 (*info->fprintf_func) (info->stream, "%s", op_txt[i]);
10043 needcomma = 1;
10044 }
050dfa73 10045
ce518a5f 10046 for (i = 0; i < MAX_OPERANDS; i++)
52b15da3
JH
10047 if (op_index[i] != -1 && op_riprel[i])
10048 {
10049 (*info->fprintf_func) (info->stream, " # ");
4fd7268a 10050 (*info->print_address_func) ((bfd_vma) (start_pc + (codep - start_codep)
52b15da3 10051 + op_address[op_index[i]]), info);
185b1163 10052 break;
52b15da3 10053 }
e396998b 10054 return codep - priv.the_buffer;
252b5132
RH
10055}
10056
6439fc28 10057static const char *float_mem[] = {
252b5132 10058 /* d8 */
7c52e0e8
L
10059 "fadd{s|}",
10060 "fmul{s|}",
10061 "fcom{s|}",
10062 "fcomp{s|}",
10063 "fsub{s|}",
10064 "fsubr{s|}",
10065 "fdiv{s|}",
10066 "fdivr{s|}",
db6eb5be 10067 /* d9 */
7c52e0e8 10068 "fld{s|}",
252b5132 10069 "(bad)",
7c52e0e8
L
10070 "fst{s|}",
10071 "fstp{s|}",
d1c36125 10072 "fldenv{C|C}",
252b5132 10073 "fldcw",
d1c36125 10074 "fNstenv{C|C}",
252b5132
RH
10075 "fNstcw",
10076 /* da */
7c52e0e8
L
10077 "fiadd{l|}",
10078 "fimul{l|}",
10079 "ficom{l|}",
10080 "ficomp{l|}",
10081 "fisub{l|}",
10082 "fisubr{l|}",
10083 "fidiv{l|}",
10084 "fidivr{l|}",
252b5132 10085 /* db */
7c52e0e8
L
10086 "fild{l|}",
10087 "fisttp{l|}",
10088 "fist{l|}",
10089 "fistp{l|}",
252b5132 10090 "(bad)",
464dc4af 10091 "fld{t|}",
252b5132 10092 "(bad)",
464dc4af 10093 "fstp{t|}",
252b5132 10094 /* dc */
7c52e0e8
L
10095 "fadd{l|}",
10096 "fmul{l|}",
10097 "fcom{l|}",
10098 "fcomp{l|}",
10099 "fsub{l|}",
10100 "fsubr{l|}",
10101 "fdiv{l|}",
10102 "fdivr{l|}",
252b5132 10103 /* dd */
7c52e0e8
L
10104 "fld{l|}",
10105 "fisttp{ll|}",
10106 "fst{l||}",
10107 "fstp{l|}",
d1c36125 10108 "frstor{C|C}",
252b5132 10109 "(bad)",
d1c36125 10110 "fNsave{C|C}",
252b5132
RH
10111 "fNstsw",
10112 /* de */
ac465521
JB
10113 "fiadd{s|}",
10114 "fimul{s|}",
10115 "ficom{s|}",
10116 "ficomp{s|}",
10117 "fisub{s|}",
10118 "fisubr{s|}",
10119 "fidiv{s|}",
10120 "fidivr{s|}",
252b5132 10121 /* df */
ac465521
JB
10122 "fild{s|}",
10123 "fisttp{s|}",
10124 "fist{s|}",
10125 "fistp{s|}",
252b5132 10126 "fbld",
7c52e0e8 10127 "fild{ll|}",
252b5132 10128 "fbstp",
7c52e0e8 10129 "fistp{ll|}",
1d9f512f
AM
10130};
10131
10132static const unsigned char float_mem_mode[] = {
10133 /* d8 */
10134 d_mode,
10135 d_mode,
10136 d_mode,
10137 d_mode,
10138 d_mode,
10139 d_mode,
10140 d_mode,
10141 d_mode,
10142 /* d9 */
10143 d_mode,
10144 0,
10145 d_mode,
10146 d_mode,
10147 0,
10148 w_mode,
10149 0,
10150 w_mode,
10151 /* da */
10152 d_mode,
10153 d_mode,
10154 d_mode,
10155 d_mode,
10156 d_mode,
10157 d_mode,
10158 d_mode,
10159 d_mode,
10160 /* db */
10161 d_mode,
10162 d_mode,
10163 d_mode,
10164 d_mode,
10165 0,
9306ca4a 10166 t_mode,
1d9f512f 10167 0,
9306ca4a 10168 t_mode,
1d9f512f
AM
10169 /* dc */
10170 q_mode,
10171 q_mode,
10172 q_mode,
10173 q_mode,
10174 q_mode,
10175 q_mode,
10176 q_mode,
10177 q_mode,
10178 /* dd */
10179 q_mode,
10180 q_mode,
10181 q_mode,
10182 q_mode,
10183 0,
10184 0,
10185 0,
10186 w_mode,
10187 /* de */
10188 w_mode,
10189 w_mode,
10190 w_mode,
10191 w_mode,
10192 w_mode,
10193 w_mode,
10194 w_mode,
10195 w_mode,
10196 /* df */
10197 w_mode,
10198 w_mode,
10199 w_mode,
10200 w_mode,
9306ca4a 10201 t_mode,
1d9f512f 10202 q_mode,
9306ca4a 10203 t_mode,
1d9f512f 10204 q_mode
252b5132
RH
10205};
10206
ce518a5f
L
10207#define ST { OP_ST, 0 }
10208#define STi { OP_STi, 0 }
252b5132 10209
48c97fa1
L
10210#define FGRPd9_2 NULL, { { NULL, 1 } }, 0
10211#define FGRPd9_4 NULL, { { NULL, 2 } }, 0
10212#define FGRPd9_5 NULL, { { NULL, 3 } }, 0
10213#define FGRPd9_6 NULL, { { NULL, 4 } }, 0
10214#define FGRPd9_7 NULL, { { NULL, 5 } }, 0
10215#define FGRPda_5 NULL, { { NULL, 6 } }, 0
10216#define FGRPdb_4 NULL, { { NULL, 7 } }, 0
10217#define FGRPde_3 NULL, { { NULL, 8 } }, 0
10218#define FGRPdf_4 NULL, { { NULL, 9 } }, 0
252b5132 10219
2da11e11 10220static const struct dis386 float_reg[][8] = {
252b5132
RH
10221 /* d8 */
10222 {
bf890a93
IT
10223 { "fadd", { ST, STi }, 0 },
10224 { "fmul", { ST, STi }, 0 },
10225 { "fcom", { STi }, 0 },
10226 { "fcomp", { STi }, 0 },
10227 { "fsub", { ST, STi }, 0 },
10228 { "fsubr", { ST, STi }, 0 },
10229 { "fdiv", { ST, STi }, 0 },
10230 { "fdivr", { ST, STi }, 0 },
252b5132
RH
10231 },
10232 /* d9 */
10233 {
bf890a93
IT
10234 { "fld", { STi }, 0 },
10235 { "fxch", { STi }, 0 },
252b5132 10236 { FGRPd9_2 },
592d1631 10237 { Bad_Opcode },
252b5132
RH
10238 { FGRPd9_4 },
10239 { FGRPd9_5 },
10240 { FGRPd9_6 },
10241 { FGRPd9_7 },
10242 },
10243 /* da */
10244 {
bf890a93
IT
10245 { "fcmovb", { ST, STi }, 0 },
10246 { "fcmove", { ST, STi }, 0 },
10247 { "fcmovbe",{ ST, STi }, 0 },
10248 { "fcmovu", { ST, STi }, 0 },
592d1631 10249 { Bad_Opcode },
252b5132 10250 { FGRPda_5 },
592d1631
L
10251 { Bad_Opcode },
10252 { Bad_Opcode },
252b5132
RH
10253 },
10254 /* db */
10255 {
bf890a93
IT
10256 { "fcmovnb",{ ST, STi }, 0 },
10257 { "fcmovne",{ ST, STi }, 0 },
10258 { "fcmovnbe",{ ST, STi }, 0 },
10259 { "fcmovnu",{ ST, STi }, 0 },
252b5132 10260 { FGRPdb_4 },
bf890a93
IT
10261 { "fucomi", { ST, STi }, 0 },
10262 { "fcomi", { ST, STi }, 0 },
592d1631 10263 { Bad_Opcode },
252b5132
RH
10264 },
10265 /* dc */
10266 {
bf890a93
IT
10267 { "fadd", { STi, ST }, 0 },
10268 { "fmul", { STi, ST }, 0 },
592d1631
L
10269 { Bad_Opcode },
10270 { Bad_Opcode },
d53e6b98
JB
10271 { "fsub{!M|r}", { STi, ST }, 0 },
10272 { "fsub{M|}", { STi, ST }, 0 },
10273 { "fdiv{!M|r}", { STi, ST }, 0 },
10274 { "fdiv{M|}", { STi, ST }, 0 },
252b5132
RH
10275 },
10276 /* dd */
10277 {
bf890a93 10278 { "ffree", { STi }, 0 },
592d1631 10279 { Bad_Opcode },
bf890a93
IT
10280 { "fst", { STi }, 0 },
10281 { "fstp", { STi }, 0 },
10282 { "fucom", { STi }, 0 },
10283 { "fucomp", { STi }, 0 },
592d1631
L
10284 { Bad_Opcode },
10285 { Bad_Opcode },
252b5132
RH
10286 },
10287 /* de */
10288 {
bf890a93
IT
10289 { "faddp", { STi, ST }, 0 },
10290 { "fmulp", { STi, ST }, 0 },
592d1631 10291 { Bad_Opcode },
252b5132 10292 { FGRPde_3 },
d53e6b98
JB
10293 { "fsub{!M|r}p", { STi, ST }, 0 },
10294 { "fsub{M|}p", { STi, ST }, 0 },
10295 { "fdiv{!M|r}p", { STi, ST }, 0 },
10296 { "fdiv{M|}p", { STi, ST }, 0 },
252b5132
RH
10297 },
10298 /* df */
10299 {
bf890a93 10300 { "ffreep", { STi }, 0 },
592d1631
L
10301 { Bad_Opcode },
10302 { Bad_Opcode },
10303 { Bad_Opcode },
252b5132 10304 { FGRPdf_4 },
bf890a93
IT
10305 { "fucomip", { ST, STi }, 0 },
10306 { "fcomip", { ST, STi }, 0 },
592d1631 10307 { Bad_Opcode },
252b5132
RH
10308 },
10309};
10310
252b5132 10311static char *fgrps[][8] = {
48c97fa1
L
10312 /* Bad opcode 0 */
10313 {
10314 "(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10315 },
10316
10317 /* d9_2 1 */
252b5132
RH
10318 {
10319 "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10320 },
10321
48c97fa1 10322 /* d9_4 2 */
252b5132
RH
10323 {
10324 "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
10325 },
10326
48c97fa1 10327 /* d9_5 3 */
252b5132
RH
10328 {
10329 "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
10330 },
10331
48c97fa1 10332 /* d9_6 4 */
252b5132
RH
10333 {
10334 "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
10335 },
10336
48c97fa1 10337 /* d9_7 5 */
252b5132
RH
10338 {
10339 "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
10340 },
10341
48c97fa1 10342 /* da_5 6 */
252b5132
RH
10343 {
10344 "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10345 },
10346
48c97fa1 10347 /* db_4 7 */
252b5132 10348 {
309d3373
JB
10349 "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
10350 "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
252b5132
RH
10351 },
10352
48c97fa1 10353 /* de_3 8 */
252b5132
RH
10354 {
10355 "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10356 },
10357
48c97fa1 10358 /* df_4 9 */
252b5132
RH
10359 {
10360 "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10361 },
10362};
10363
b6169b20
L
10364static void
10365swap_operand (void)
10366{
10367 mnemonicendp[0] = '.';
10368 mnemonicendp[1] = 's';
10369 mnemonicendp += 2;
10370}
10371
b844680a
L
10372static void
10373OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED,
10374 int sizeflag ATTRIBUTE_UNUSED)
10375{
10376 /* Skip mod/rm byte. */
10377 MODRM_CHECK;
10378 codep++;
10379}
10380
252b5132 10381static void
26ca5450 10382dofloat (int sizeflag)
252b5132 10383{
2da11e11 10384 const struct dis386 *dp;
252b5132
RH
10385 unsigned char floatop;
10386
10387 floatop = codep[-1];
10388
7967e09e 10389 if (modrm.mod != 3)
252b5132 10390 {
7967e09e 10391 int fp_indx = (floatop - 0xd8) * 8 + modrm.reg;
1d9f512f
AM
10392
10393 putop (float_mem[fp_indx], sizeflag);
ce518a5f 10394 obufp = op_out[0];
6e50d963 10395 op_ad = 2;
1d9f512f 10396 OP_E (float_mem_mode[fp_indx], sizeflag);
252b5132
RH
10397 return;
10398 }
6608db57 10399 /* Skip mod/rm byte. */
4bba6815 10400 MODRM_CHECK;
252b5132
RH
10401 codep++;
10402
7967e09e 10403 dp = &float_reg[floatop - 0xd8][modrm.reg];
252b5132
RH
10404 if (dp->name == NULL)
10405 {
7967e09e 10406 putop (fgrps[dp->op[0].bytemode][modrm.rm], sizeflag);
252b5132 10407
6608db57 10408 /* Instruction fnstsw is only one with strange arg. */
252b5132 10409 if (floatop == 0xdf && codep[-1] == 0xe0)
ce518a5f 10410 strcpy (op_out[0], names16[0]);
252b5132
RH
10411 }
10412 else
10413 {
10414 putop (dp->name, sizeflag);
10415
ce518a5f 10416 obufp = op_out[0];
6e50d963 10417 op_ad = 2;
ce518a5f
L
10418 if (dp->op[0].rtn)
10419 (*dp->op[0].rtn) (dp->op[0].bytemode, sizeflag);
6e50d963 10420
ce518a5f 10421 obufp = op_out[1];
6e50d963 10422 op_ad = 1;
ce518a5f
L
10423 if (dp->op[1].rtn)
10424 (*dp->op[1].rtn) (dp->op[1].bytemode, sizeflag);
252b5132
RH
10425 }
10426}
10427
9ce09ba2
RM
10428/* Like oappend (below), but S is a string starting with '%'.
10429 In Intel syntax, the '%' is elided. */
10430static void
10431oappend_maybe_intel (const char *s)
10432{
10433 oappend (s + intel_syntax);
10434}
10435
252b5132 10436static void
26ca5450 10437OP_ST (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 10438{
9ce09ba2 10439 oappend_maybe_intel ("%st");
252b5132
RH
10440}
10441
252b5132 10442static void
26ca5450 10443OP_STi (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 10444{
7967e09e 10445 sprintf (scratchbuf, "%%st(%d)", modrm.rm);
9ce09ba2 10446 oappend_maybe_intel (scratchbuf);
252b5132
RH
10447}
10448
6608db57 10449/* Capital letters in template are macros. */
6439fc28 10450static int
d3ce72d0 10451putop (const char *in_template, int sizeflag)
252b5132 10452{
2da11e11 10453 const char *p;
9306ca4a 10454 int alt = 0;
9d141669 10455 int cond = 1;
21a3faeb 10456 unsigned int l = 0, len = 0;
98b528ac
L
10457 char last[4];
10458
d3ce72d0 10459 for (p = in_template; *p; p++)
252b5132 10460 {
21a3faeb
JB
10461 if (len > l)
10462 {
10463 if (l >= sizeof (last) || !ISUPPER (*p))
10464 abort ();
10465 last[l++] = *p;
10466 continue;
10467 }
252b5132
RH
10468 switch (*p)
10469 {
10470 default:
10471 *obufp++ = *p;
10472 break;
98b528ac
L
10473 case '%':
10474 len++;
10475 break;
9d141669
L
10476 case '!':
10477 cond = 0;
10478 break;
6439fc28 10479 case '{':
6439fc28 10480 if (intel_syntax)
6439fc28
AM
10481 {
10482 while (*++p != '|')
7c52e0e8
L
10483 if (*p == '}' || *p == '\0')
10484 abort ();
d1c36125 10485 alt = 1;
6439fc28 10486 }
d1c36125 10487 break;
6439fc28
AM
10488 case '|':
10489 while (*++p != '}')
10490 {
10491 if (*p == '\0')
10492 abort ();
10493 }
10494 break;
10495 case '}':
d1c36125 10496 alt = 0;
6439fc28 10497 break;
252b5132 10498 case 'A':
db6eb5be
AM
10499 if (intel_syntax)
10500 break;
7967e09e 10501 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
252b5132
RH
10502 *obufp++ = 'b';
10503 break;
10504 case 'B':
21a3faeb 10505 if (l == 0)
4b06377f 10506 {
dc1e8a47 10507 case_B:
4b06377f
L
10508 if (intel_syntax)
10509 break;
10510 if (sizeflag & SUFFIX_ALWAYS)
10511 *obufp++ = 'b';
10512 }
21a3faeb 10513 else if (l == 1 && last[0] == 'L')
4b06377f 10514 {
4b06377f
L
10515 if (address_mode == mode_64bit
10516 && !(prefixes & PREFIX_ADDR))
10517 {
10518 *obufp++ = 'a';
10519 *obufp++ = 'b';
10520 *obufp++ = 's';
10521 }
10522
10523 goto case_B;
10524 }
21a3faeb
JB
10525 else
10526 abort ();
252b5132 10527 break;
9306ca4a
JB
10528 case 'C':
10529 if (intel_syntax && !alt)
10530 break;
10531 if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
10532 {
10533 if (sizeflag & DFLAG)
10534 *obufp++ = intel_syntax ? 'd' : 'l';
10535 else
10536 *obufp++ = intel_syntax ? 'w' : 's';
10537 used_prefixes |= (prefixes & PREFIX_DATA);
10538 }
10539 break;
ed7841b3
JB
10540 case 'D':
10541 if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
10542 break;
161a04f6 10543 USED_REX (REX_W);
7967e09e 10544 if (modrm.mod == 3)
ed7841b3 10545 {
161a04f6 10546 if (rex & REX_W)
ed7841b3 10547 *obufp++ = 'q';
ed7841b3 10548 else
f16cd0d5
L
10549 {
10550 if (sizeflag & DFLAG)
10551 *obufp++ = intel_syntax ? 'd' : 'l';
10552 else
10553 *obufp++ = 'w';
10554 used_prefixes |= (prefixes & PREFIX_DATA);
10555 }
ed7841b3
JB
10556 }
10557 else
10558 *obufp++ = 'w';
10559 break;
252b5132 10560 case 'E': /* For jcxz/jecxz */
cb712a9e 10561 if (address_mode == mode_64bit)
c1a64871
JH
10562 {
10563 if (sizeflag & AFLAG)
10564 *obufp++ = 'r';
10565 else
10566 *obufp++ = 'e';
10567 }
10568 else
10569 if (sizeflag & AFLAG)
10570 *obufp++ = 'e';
3ffd33cf
AM
10571 used_prefixes |= (prefixes & PREFIX_ADDR);
10572 break;
10573 case 'F':
db6eb5be
AM
10574 if (intel_syntax)
10575 break;
e396998b 10576 if ((prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
3ffd33cf
AM
10577 {
10578 if (sizeflag & AFLAG)
cb712a9e 10579 *obufp++ = address_mode == mode_64bit ? 'q' : 'l';
3ffd33cf 10580 else
cb712a9e 10581 *obufp++ = address_mode == mode_64bit ? 'l' : 'w';
3ffd33cf
AM
10582 used_prefixes |= (prefixes & PREFIX_ADDR);
10583 }
252b5132 10584 break;
52fd6d94
JB
10585 case 'G':
10586 if (intel_syntax || (obufp[-1] != 's' && !(sizeflag & SUFFIX_ALWAYS)))
10587 break;
161a04f6 10588 if ((rex & REX_W) || (sizeflag & DFLAG))
52fd6d94
JB
10589 *obufp++ = 'l';
10590 else
10591 *obufp++ = 'w';
161a04f6 10592 if (!(rex & REX_W))
52fd6d94
JB
10593 used_prefixes |= (prefixes & PREFIX_DATA);
10594 break;
5dd0794d 10595 case 'H':
db6eb5be
AM
10596 if (intel_syntax)
10597 break;
5dd0794d
AM
10598 if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
10599 || (prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
10600 {
10601 used_prefixes |= prefixes & (PREFIX_CS | PREFIX_DS);
10602 *obufp++ = ',';
10603 *obufp++ = 'p';
10604 if (prefixes & PREFIX_DS)
10605 *obufp++ = 't';
10606 else
10607 *obufp++ = 'n';
10608 }
10609 break;
42903f7f
L
10610 case 'K':
10611 USED_REX (REX_W);
10612 if (rex & REX_W)
10613 *obufp++ = 'q';
10614 else
10615 *obufp++ = 'd';
10616 break;
252b5132 10617 case 'L':
78467458 10618 abort ();
9d141669
L
10619 case 'M':
10620 if (intel_mnemonic != cond)
10621 *obufp++ = 'r';
10622 break;
252b5132
RH
10623 case 'N':
10624 if ((prefixes & PREFIX_FWAIT) == 0)
10625 *obufp++ = 'n';
7d421014
ILT
10626 else
10627 used_prefixes |= PREFIX_FWAIT;
252b5132 10628 break;
52b15da3 10629 case 'O':
161a04f6
L
10630 USED_REX (REX_W);
10631 if (rex & REX_W)
6439fc28 10632 *obufp++ = 'o';
a35ca55a
JB
10633 else if (intel_syntax && (sizeflag & DFLAG))
10634 *obufp++ = 'q';
52b15da3
JH
10635 else
10636 *obufp++ = 'd';
161a04f6 10637 if (!(rex & REX_W))
a35ca55a 10638 used_prefixes |= (prefixes & PREFIX_DATA);
52b15da3 10639 break;
07f5af7d
L
10640 case '&':
10641 if (!intel_syntax
10642 && address_mode == mode_64bit
10643 && isa64 == intel64)
10644 {
10645 *obufp++ = 'q';
10646 break;
10647 }
10648 /* Fall through. */
6439fc28 10649 case 'T':
d9e3625e
L
10650 if (!intel_syntax
10651 && address_mode == mode_64bit
7bb15c6f 10652 && ((sizeflag & DFLAG) || (rex & REX_W)))
6439fc28
AM
10653 {
10654 *obufp++ = 'q';
10655 break;
10656 }
6608db57 10657 /* Fall through. */
4b4c407a 10658 goto case_P;
252b5132 10659 case 'P':
21a3faeb 10660 if (l == 0)
d9e3625e 10661 {
dc1e8a47 10662 case_P:
4b4c407a 10663 if (intel_syntax)
d9e3625e 10664 {
4b4c407a
L
10665 if ((rex & REX_W) == 0
10666 && (prefixes & PREFIX_DATA))
10667 {
10668 if ((sizeflag & DFLAG) == 0)
10669 *obufp++ = 'w';
10670 used_prefixes |= (prefixes & PREFIX_DATA);
10671 }
10672 break;
10673 }
10674 if ((prefixes & PREFIX_DATA)
10675 || (rex & REX_W)
10676 || (sizeflag & SUFFIX_ALWAYS))
10677 {
10678 USED_REX (REX_W);
10679 if (rex & REX_W)
10680 *obufp++ = 'q';
10681 else
10682 {
10683 if (sizeflag & DFLAG)
10684 *obufp++ = 'l';
10685 else
10686 *obufp++ = 'w';
10687 used_prefixes |= (prefixes & PREFIX_DATA);
10688 }
d9e3625e 10689 }
d9e3625e 10690 }
21a3faeb 10691 else if (l == 1 && last[0] == 'L')
252b5132 10692 {
4b4c407a
L
10693 if ((prefixes & PREFIX_DATA)
10694 || (rex & REX_W)
10695 || (sizeflag & SUFFIX_ALWAYS))
52b15da3 10696 {
4b4c407a
L
10697 USED_REX (REX_W);
10698 if (rex & REX_W)
10699 *obufp++ = 'q';
10700 else
10701 {
10702 if (sizeflag & DFLAG)
10703 *obufp++ = intel_syntax ? 'd' : 'l';
10704 else
10705 *obufp++ = 'w';
10706 used_prefixes |= (prefixes & PREFIX_DATA);
10707 }
52b15da3 10708 }
252b5132 10709 }
21a3faeb
JB
10710 else
10711 abort ();
252b5132 10712 break;
6439fc28 10713 case 'U':
db6eb5be
AM
10714 if (intel_syntax)
10715 break;
7bb15c6f 10716 if (address_mode == mode_64bit
6c067bbb 10717 && ((sizeflag & DFLAG) || (rex & REX_W)))
6439fc28 10718 {
7967e09e 10719 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
1a114b12 10720 *obufp++ = 'q';
6439fc28
AM
10721 break;
10722 }
6608db57 10723 /* Fall through. */
98b528ac 10724 goto case_Q;
252b5132 10725 case 'Q':
21a3faeb 10726 if (l == 0)
252b5132 10727 {
dc1e8a47 10728 case_Q:
98b528ac
L
10729 if (intel_syntax && !alt)
10730 break;
10731 USED_REX (REX_W);
10732 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
52b15da3 10733 {
98b528ac
L
10734 if (rex & REX_W)
10735 *obufp++ = 'q';
52b15da3 10736 else
98b528ac
L
10737 {
10738 if (sizeflag & DFLAG)
10739 *obufp++ = intel_syntax ? 'd' : 'l';
10740 else
10741 *obufp++ = 'w';
f16cd0d5 10742 used_prefixes |= (prefixes & PREFIX_DATA);
98b528ac 10743 }
52b15da3 10744 }
98b528ac 10745 }
492a76aa
JB
10746 else if (l == 1 && last[0] == 'D')
10747 *obufp++ = vex.w ? 'q' : 'd';
21a3faeb 10748 else if (l == 1 && last[0] == 'L')
98b528ac 10749 {
b24d668c
JB
10750 if (cond ? modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)
10751 : address_mode != mode_64bit)
98b528ac
L
10752 break;
10753 if ((rex & REX_W))
10754 {
10755 USED_REX (REX_W);
10756 *obufp++ = 'q';
10757 }
b24d668c 10758 else if((address_mode == mode_64bit && need_modrm && cond)
589958d6
JB
10759 || (sizeflag & SUFFIX_ALWAYS))
10760 *obufp++ = intel_syntax? 'd' : 'l';
252b5132 10761 }
21a3faeb
JB
10762 else
10763 abort ();
252b5132
RH
10764 break;
10765 case 'R':
161a04f6
L
10766 USED_REX (REX_W);
10767 if (rex & REX_W)
a35ca55a
JB
10768 *obufp++ = 'q';
10769 else if (sizeflag & DFLAG)
c608c12e 10770 {
a35ca55a 10771 if (intel_syntax)
c608c12e 10772 *obufp++ = 'd';
c608c12e 10773 else
a35ca55a 10774 *obufp++ = 'l';
c608c12e 10775 }
252b5132 10776 else
a35ca55a
JB
10777 *obufp++ = 'w';
10778 if (intel_syntax && !p[1]
161a04f6 10779 && ((rex & REX_W) || (sizeflag & DFLAG)))
a35ca55a 10780 *obufp++ = 'e';
161a04f6 10781 if (!(rex & REX_W))
52b15da3 10782 used_prefixes |= (prefixes & PREFIX_DATA);
252b5132 10783 break;
1a114b12 10784 case 'V':
21a3faeb 10785 if (l == 0)
1a114b12 10786 {
4b06377f
L
10787 if (intel_syntax)
10788 break;
7bb15c6f 10789 if (address_mode == mode_64bit
6c067bbb 10790 && ((sizeflag & DFLAG) || (rex & REX_W)))
4b06377f
L
10791 {
10792 if (sizeflag & SUFFIX_ALWAYS)
10793 *obufp++ = 'q';
10794 break;
10795 }
10796 }
21a3faeb 10797 else if (l == 1 && last[0] == 'L')
4b06377f 10798 {
4b06377f
L
10799 if (rex & REX_W)
10800 {
10801 *obufp++ = 'a';
10802 *obufp++ = 'b';
10803 *obufp++ = 's';
10804 }
1a114b12 10805 }
21a3faeb
JB
10806 else
10807 abort ();
1a114b12 10808 /* Fall through. */
4b06377f 10809 goto case_S;
252b5132 10810 case 'S':
21a3faeb 10811 if (l == 0)
252b5132 10812 {
dc1e8a47 10813 case_S:
4b06377f
L
10814 if (intel_syntax)
10815 break;
10816 if (sizeflag & SUFFIX_ALWAYS)
52b15da3 10817 {
4b06377f
L
10818 if (rex & REX_W)
10819 *obufp++ = 'q';
52b15da3 10820 else
4b06377f
L
10821 {
10822 if (sizeflag & DFLAG)
10823 *obufp++ = 'l';
10824 else
10825 *obufp++ = 'w';
10826 used_prefixes |= (prefixes & PREFIX_DATA);
10827 }
10828 }
10829 }
21a3faeb 10830 else if (l == 1 && last[0] == 'L')
4b06377f 10831 {
4b06377f
L
10832 if (address_mode == mode_64bit
10833 && !(prefixes & PREFIX_ADDR))
10834 {
10835 *obufp++ = 'a';
10836 *obufp++ = 'b';
10837 *obufp++ = 's';
10838 }
10839
10840 goto case_S;
252b5132 10841 }
21a3faeb
JB
10842 else
10843 abort ();
252b5132 10844 break;
041bd2e0 10845 case 'X':
21a3faeb
JB
10846 if (l != 0)
10847 abort ();
bf926894
JB
10848 if (need_vex
10849 ? vex.prefix == DATA_PREFIX_OPCODE
10850 : prefixes & PREFIX_DATA)
c0f3af97 10851 {
bf926894
JB
10852 *obufp++ = 'd';
10853 used_prefixes |= PREFIX_DATA;
c0f3af97 10854 }
041bd2e0 10855 else
bf926894 10856 *obufp++ = 's';
041bd2e0 10857 break;
76f227a5 10858 case 'Y':
21a3faeb 10859 if (l == 1 && last[0] == 'X')
c0f3af97 10860 {
c0f3af97
L
10861 if (!need_vex)
10862 abort ();
10863 if (intel_syntax
04d824a4 10864 || ((modrm.mod == 3 || vex.b) && !(sizeflag & SUFFIX_ALWAYS)))
c0f3af97
L
10865 break;
10866 switch (vex.length)
10867 {
10868 case 128:
10869 *obufp++ = 'x';
10870 break;
10871 case 256:
10872 *obufp++ = 'y';
10873 break;
04d824a4
JB
10874 case 512:
10875 if (!vex.evex)
c0f3af97 10876 default:
04d824a4 10877 abort ();
c0f3af97 10878 }
76f227a5 10879 }
21a3faeb
JB
10880 else
10881 abort ();
76f227a5 10882 break;
78467458
JB
10883 case 'Z':
10884 if (l == 0)
10885 {
10886 /* These insns ignore ModR/M.mod: Force it to 3 for OP_E(). */
10887 modrm.mod = 3;
10888 if (!intel_syntax && (sizeflag & SUFFIX_ALWAYS))
10889 *obufp++ = address_mode == mode_64bit ? 'q' : 'l';
10890 }
10891 else if (l == 1 && last[0] == 'X')
10892 {
10893 if (!need_vex || !vex.evex)
10894 abort ();
10895 if (intel_syntax
10896 || ((modrm.mod == 3 || vex.b) && !(sizeflag & SUFFIX_ALWAYS)))
10897 break;
10898 switch (vex.length)
10899 {
10900 case 128:
10901 *obufp++ = 'x';
10902 break;
10903 case 256:
10904 *obufp++ = 'y';
10905 break;
10906 case 512:
10907 *obufp++ = 'z';
10908 break;
10909 default:
10910 abort ();
10911 }
10912 }
10913 else
10914 abort ();
10915 break;
252b5132 10916 case 'W':
21a3faeb 10917 if (l == 0)
a35ca55a 10918 {
0bfee649
L
10919 /* operand size flag for cwtl, cbtw */
10920 USED_REX (REX_W);
10921 if (rex & REX_W)
10922 {
10923 if (intel_syntax)
10924 *obufp++ = 'd';
10925 else
10926 *obufp++ = 'l';
10927 }
10928 else if (sizeflag & DFLAG)
10929 *obufp++ = 'w';
a35ca55a 10930 else
0bfee649
L
10931 *obufp++ = 'b';
10932 if (!(rex & REX_W))
10933 used_prefixes |= (prefixes & PREFIX_DATA);
a35ca55a 10934 }
21a3faeb 10935 else if (l == 1)
0bfee649 10936 {
0bfee649
L
10937 if (!need_vex)
10938 abort ();
6c30d220
L
10939 if (last[0] == 'X')
10940 *obufp++ = vex.w ? 'd': 's';
931452b6
JB
10941 else if (last[0] == 'B')
10942 *obufp++ = vex.w ? 'w': 'b';
21a3faeb
JB
10943 else
10944 abort ();
0bfee649 10945 }
21a3faeb
JB
10946 else
10947 abort ();
252b5132 10948 break;
a72d2af2
L
10949 case '^':
10950 if (intel_syntax)
10951 break;
5990e377
JB
10952 if (isa64 == intel64 && (rex & REX_W))
10953 {
10954 USED_REX (REX_W);
10955 *obufp++ = 'q';
10956 break;
10957 }
a72d2af2
L
10958 if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
10959 {
10960 if (sizeflag & DFLAG)
10961 *obufp++ = 'l';
10962 else
10963 *obufp++ = 'w';
10964 used_prefixes |= (prefixes & PREFIX_DATA);
10965 }
10966 break;
5db04b09
L
10967 case '@':
10968 if (intel_syntax)
10969 break;
10970 if (address_mode == mode_64bit
10971 && (isa64 == intel64
10972 || ((sizeflag & DFLAG) || (rex & REX_W))))
10973 *obufp++ = 'q';
10974 else if ((prefixes & PREFIX_DATA))
10975 {
10976 if (!(sizeflag & DFLAG))
10977 *obufp++ = 'w';
10978 used_prefixes |= (prefixes & PREFIX_DATA);
10979 }
10980 break;
252b5132 10981 }
21a3faeb
JB
10982
10983 if (len == l)
10984 len = l = 0;
252b5132
RH
10985 }
10986 *obufp = 0;
ea397f5b 10987 mnemonicendp = obufp;
6439fc28 10988 return 0;
252b5132
RH
10989}
10990
10991static void
26ca5450 10992oappend (const char *s)
252b5132 10993{
ea397f5b 10994 obufp = stpcpy (obufp, s);
252b5132
RH
10995}
10996
10997static void
26ca5450 10998append_seg (void)
252b5132 10999{
285ca992
L
11000 /* Only print the active segment register. */
11001 if (!active_seg_prefix)
11002 return;
11003
11004 used_prefixes |= active_seg_prefix;
11005 switch (active_seg_prefix)
7d421014 11006 {
285ca992 11007 case PREFIX_CS:
9ce09ba2 11008 oappend_maybe_intel ("%cs:");
285ca992
L
11009 break;
11010 case PREFIX_DS:
9ce09ba2 11011 oappend_maybe_intel ("%ds:");
285ca992
L
11012 break;
11013 case PREFIX_SS:
9ce09ba2 11014 oappend_maybe_intel ("%ss:");
285ca992
L
11015 break;
11016 case PREFIX_ES:
9ce09ba2 11017 oappend_maybe_intel ("%es:");
285ca992
L
11018 break;
11019 case PREFIX_FS:
9ce09ba2 11020 oappend_maybe_intel ("%fs:");
285ca992
L
11021 break;
11022 case PREFIX_GS:
9ce09ba2 11023 oappend_maybe_intel ("%gs:");
285ca992
L
11024 break;
11025 default:
11026 break;
7d421014 11027 }
252b5132
RH
11028}
11029
11030static void
26ca5450 11031OP_indirE (int bytemode, int sizeflag)
252b5132
RH
11032{
11033 if (!intel_syntax)
11034 oappend ("*");
11035 OP_E (bytemode, sizeflag);
11036}
11037
52b15da3 11038static void
26ca5450 11039print_operand_value (char *buf, int hex, bfd_vma disp)
52b15da3 11040{
cb712a9e 11041 if (address_mode == mode_64bit)
52b15da3
JH
11042 {
11043 if (hex)
11044 {
11045 char tmp[30];
11046 int i;
11047 buf[0] = '0';
11048 buf[1] = 'x';
11049 sprintf_vma (tmp, disp);
6608db57 11050 for (i = 0; tmp[i] == '0' && tmp[i + 1]; i++);
52b15da3
JH
11051 strcpy (buf + 2, tmp + i);
11052 }
11053 else
11054 {
11055 bfd_signed_vma v = disp;
11056 char tmp[30];
11057 int i;
11058 if (v < 0)
11059 {
11060 *(buf++) = '-';
11061 v = -disp;
6608db57 11062 /* Check for possible overflow on 0x8000000000000000. */
52b15da3
JH
11063 if (v < 0)
11064 {
11065 strcpy (buf, "9223372036854775808");
11066 return;
11067 }
11068 }
11069 if (!v)
11070 {
11071 strcpy (buf, "0");
11072 return;
11073 }
11074
11075 i = 0;
11076 tmp[29] = 0;
11077 while (v)
11078 {
6608db57 11079 tmp[28 - i] = (v % 10) + '0';
52b15da3
JH
11080 v /= 10;
11081 i++;
11082 }
11083 strcpy (buf, tmp + 29 - i);
11084 }
11085 }
11086 else
11087 {
11088 if (hex)
11089 sprintf (buf, "0x%x", (unsigned int) disp);
11090 else
11091 sprintf (buf, "%d", (int) disp);
11092 }
11093}
11094
5d669648
L
11095/* Put DISP in BUF as signed hex number. */
11096
11097static void
11098print_displacement (char *buf, bfd_vma disp)
11099{
11100 bfd_signed_vma val = disp;
11101 char tmp[30];
11102 int i, j = 0;
11103
11104 if (val < 0)
11105 {
11106 buf[j++] = '-';
11107 val = -disp;
11108
11109 /* Check for possible overflow. */
11110 if (val < 0)
11111 {
11112 switch (address_mode)
11113 {
11114 case mode_64bit:
11115 strcpy (buf + j, "0x8000000000000000");
11116 break;
11117 case mode_32bit:
11118 strcpy (buf + j, "0x80000000");
11119 break;
11120 case mode_16bit:
11121 strcpy (buf + j, "0x8000");
11122 break;
11123 }
11124 return;
11125 }
11126 }
11127
11128 buf[j++] = '0';
11129 buf[j++] = 'x';
11130
0af1713e 11131 sprintf_vma (tmp, (bfd_vma) val);
5d669648
L
11132 for (i = 0; tmp[i] == '0'; i++)
11133 continue;
11134 if (tmp[i] == '\0')
11135 i--;
11136 strcpy (buf + j, tmp + i);
11137}
11138
3f31e633
JB
11139static void
11140intel_operand_size (int bytemode, int sizeflag)
11141{
43234a1e
L
11142 if (vex.evex
11143 && vex.b
11144 && (bytemode == x_mode
11145 || bytemode == evex_half_bcst_xmmq_mode))
11146 {
11147 if (vex.w)
11148 oappend ("QWORD PTR ");
11149 else
11150 oappend ("DWORD PTR ");
11151 return;
11152 }
3f31e633
JB
11153 switch (bytemode)
11154 {
11155 case b_mode:
b6169b20 11156 case b_swap_mode:
42903f7f 11157 case dqb_mode:
1ba585e8 11158 case db_mode:
3f31e633
JB
11159 oappend ("BYTE PTR ");
11160 break;
11161 case w_mode:
1ba585e8 11162 case dw_mode:
3f31e633
JB
11163 case dqw_mode:
11164 oappend ("WORD PTR ");
11165 break;
07f5af7d
L
11166 case indir_v_mode:
11167 if (address_mode == mode_64bit && isa64 == intel64)
11168 {
11169 oappend ("QWORD PTR ");
11170 break;
11171 }
1a0670f3 11172 /* Fall through. */
1a114b12 11173 case stack_v_mode:
7bb15c6f 11174 if (address_mode == mode_64bit && ((sizeflag & DFLAG) || (rex & REX_W)))
3f31e633
JB
11175 {
11176 oappend ("QWORD PTR ");
3f31e633
JB
11177 break;
11178 }
1a0670f3 11179 /* Fall through. */
3f31e633 11180 case v_mode:
b6169b20 11181 case v_swap_mode:
3f31e633 11182 case dq_mode:
161a04f6
L
11183 USED_REX (REX_W);
11184 if (rex & REX_W)
3f31e633 11185 oappend ("QWORD PTR ");
035e7389
JB
11186 else if (bytemode == dq_mode)
11187 oappend ("DWORD PTR ");
3f31e633 11188 else
f16cd0d5 11189 {
035e7389 11190 if (sizeflag & DFLAG)
f16cd0d5
L
11191 oappend ("DWORD PTR ");
11192 else
11193 oappend ("WORD PTR ");
11194 used_prefixes |= (prefixes & PREFIX_DATA);
11195 }
3f31e633 11196 break;
52fd6d94 11197 case z_mode:
161a04f6 11198 if ((rex & REX_W) || (sizeflag & DFLAG))
52fd6d94
JB
11199 *obufp++ = 'D';
11200 oappend ("WORD PTR ");
161a04f6 11201 if (!(rex & REX_W))
52fd6d94
JB
11202 used_prefixes |= (prefixes & PREFIX_DATA);
11203 break;
34b772a6
JB
11204 case a_mode:
11205 if (sizeflag & DFLAG)
11206 oappend ("QWORD PTR ");
11207 else
11208 oappend ("DWORD PTR ");
11209 used_prefixes |= (prefixes & PREFIX_DATA);
11210 break;
bc31405e
L
11211 case movsxd_mode:
11212 if (!(sizeflag & DFLAG) && isa64 == intel64)
11213 oappend ("WORD PTR ");
11214 else
11215 oappend ("DWORD PTR ");
11216 used_prefixes |= (prefixes & PREFIX_DATA);
11217 break;
3f31e633 11218 case d_mode:
fa99fab2 11219 case d_swap_mode:
42903f7f 11220 case dqd_mode:
3f31e633
JB
11221 oappend ("DWORD PTR ");
11222 break;
11223 case q_mode:
b6169b20 11224 case q_swap_mode:
3f31e633
JB
11225 oappend ("QWORD PTR ");
11226 break;
11227 case m_mode:
cb712a9e 11228 if (address_mode == mode_64bit)
3f31e633
JB
11229 oappend ("QWORD PTR ");
11230 else
11231 oappend ("DWORD PTR ");
11232 break;
11233 case f_mode:
11234 if (sizeflag & DFLAG)
11235 oappend ("FWORD PTR ");
11236 else
11237 oappend ("DWORD PTR ");
11238 used_prefixes |= (prefixes & PREFIX_DATA);
11239 break;
11240 case t_mode:
11241 oappend ("TBYTE PTR ");
11242 break;
11243 case x_mode:
b6169b20 11244 case x_swap_mode:
43234a1e
L
11245 case evex_x_gscat_mode:
11246 case evex_x_nobcst_mode:
4726e9a4 11247 case bw_unit_mode:
c0f3af97
L
11248 if (need_vex)
11249 {
11250 switch (vex.length)
11251 {
11252 case 128:
11253 oappend ("XMMWORD PTR ");
11254 break;
11255 case 256:
11256 oappend ("YMMWORD PTR ");
11257 break;
43234a1e
L
11258 case 512:
11259 oappend ("ZMMWORD PTR ");
11260 break;
c0f3af97
L
11261 default:
11262 abort ();
11263 }
11264 }
11265 else
11266 oappend ("XMMWORD PTR ");
11267 break;
11268 case xmm_mode:
3f31e633
JB
11269 oappend ("XMMWORD PTR ");
11270 break;
43234a1e
L
11271 case ymm_mode:
11272 oappend ("YMMWORD PTR ");
11273 break;
c0f3af97 11274 case xmmq_mode:
43234a1e 11275 case evex_half_bcst_xmmq_mode:
c0f3af97
L
11276 if (!need_vex)
11277 abort ();
11278
11279 switch (vex.length)
11280 {
11281 case 128:
11282 oappend ("QWORD PTR ");
11283 break;
11284 case 256:
11285 oappend ("XMMWORD PTR ");
11286 break;
43234a1e
L
11287 case 512:
11288 oappend ("YMMWORD PTR ");
11289 break;
c0f3af97
L
11290 default:
11291 abort ();
11292 }
11293 break;
6c30d220
L
11294 case xmm_mb_mode:
11295 if (!need_vex)
11296 abort ();
11297
11298 switch (vex.length)
11299 {
11300 case 128:
11301 case 256:
43234a1e 11302 case 512:
6c30d220
L
11303 oappend ("BYTE PTR ");
11304 break;
11305 default:
11306 abort ();
11307 }
11308 break;
11309 case xmm_mw_mode:
11310 if (!need_vex)
11311 abort ();
11312
11313 switch (vex.length)
11314 {
11315 case 128:
11316 case 256:
43234a1e 11317 case 512:
6c30d220
L
11318 oappend ("WORD PTR ");
11319 break;
11320 default:
11321 abort ();
11322 }
11323 break;
11324 case xmm_md_mode:
11325 if (!need_vex)
11326 abort ();
11327
11328 switch (vex.length)
11329 {
11330 case 128:
11331 case 256:
43234a1e 11332 case 512:
6c30d220
L
11333 oappend ("DWORD PTR ");
11334 break;
11335 default:
11336 abort ();
11337 }
11338 break;
11339 case xmm_mq_mode:
11340 if (!need_vex)
11341 abort ();
11342
11343 switch (vex.length)
11344 {
11345 case 128:
11346 case 256:
43234a1e 11347 case 512:
6c30d220
L
11348 oappend ("QWORD PTR ");
11349 break;
11350 default:
11351 abort ();
11352 }
11353 break;
11354 case xmmdw_mode:
11355 if (!need_vex)
11356 abort ();
11357
11358 switch (vex.length)
11359 {
11360 case 128:
11361 oappend ("WORD PTR ");
11362 break;
11363 case 256:
11364 oappend ("DWORD PTR ");
11365 break;
43234a1e
L
11366 case 512:
11367 oappend ("QWORD PTR ");
11368 break;
6c30d220
L
11369 default:
11370 abort ();
11371 }
11372 break;
11373 case xmmqd_mode:
11374 if (!need_vex)
11375 abort ();
11376
11377 switch (vex.length)
11378 {
11379 case 128:
11380 oappend ("DWORD PTR ");
11381 break;
11382 case 256:
11383 oappend ("QWORD PTR ");
11384 break;
43234a1e
L
11385 case 512:
11386 oappend ("XMMWORD PTR ");
11387 break;
6c30d220
L
11388 default:
11389 abort ();
11390 }
11391 break;
c0f3af97
L
11392 case ymmq_mode:
11393 if (!need_vex)
11394 abort ();
11395
11396 switch (vex.length)
11397 {
11398 case 128:
11399 oappend ("QWORD PTR ");
11400 break;
11401 case 256:
11402 oappend ("YMMWORD PTR ");
11403 break;
43234a1e
L
11404 case 512:
11405 oappend ("ZMMWORD PTR ");
11406 break;
c0f3af97
L
11407 default:
11408 abort ();
11409 }
11410 break;
6c30d220
L
11411 case ymmxmm_mode:
11412 if (!need_vex)
11413 abort ();
11414
11415 switch (vex.length)
11416 {
11417 case 128:
11418 case 256:
11419 oappend ("XMMWORD PTR ");
11420 break;
11421 default:
11422 abort ();
11423 }
11424 break;
fb9c77c7
L
11425 case o_mode:
11426 oappend ("OWORD PTR ");
11427 break;
1c480963 11428 case vex_scalar_w_dq_mode:
0bfee649
L
11429 if (!need_vex)
11430 abort ();
11431
11432 if (vex.w)
11433 oappend ("QWORD PTR ");
11434 else
11435 oappend ("DWORD PTR ");
11436 break;
43234a1e
L
11437 case vex_vsib_d_w_dq_mode:
11438 case vex_vsib_q_w_dq_mode:
11439 if (!need_vex)
11440 abort ();
11441
11442 if (!vex.evex)
11443 {
11444 if (vex.w)
11445 oappend ("QWORD PTR ");
11446 else
11447 oappend ("DWORD PTR ");
11448 }
11449 else
11450 {
b28d1bda
IT
11451 switch (vex.length)
11452 {
11453 case 128:
11454 oappend ("XMMWORD PTR ");
11455 break;
11456 case 256:
11457 oappend ("YMMWORD PTR ");
11458 break;
11459 case 512:
11460 oappend ("ZMMWORD PTR ");
11461 break;
11462 default:
11463 abort ();
11464 }
43234a1e
L
11465 }
11466 break;
5fc35d96
IT
11467 case vex_vsib_q_w_d_mode:
11468 case vex_vsib_d_w_d_mode:
b28d1bda 11469 if (!need_vex || !vex.evex)
5fc35d96
IT
11470 abort ();
11471
b28d1bda
IT
11472 switch (vex.length)
11473 {
11474 case 128:
11475 oappend ("QWORD PTR ");
11476 break;
11477 case 256:
11478 oappend ("XMMWORD PTR ");
11479 break;
11480 case 512:
11481 oappend ("YMMWORD PTR ");
11482 break;
11483 default:
11484 abort ();
11485 }
5fc35d96
IT
11486
11487 break;
1ba585e8
IT
11488 case mask_bd_mode:
11489 if (!need_vex || vex.length != 128)
11490 abort ();
11491 if (vex.w)
11492 oappend ("DWORD PTR ");
11493 else
11494 oappend ("BYTE PTR ");
11495 break;
43234a1e
L
11496 case mask_mode:
11497 if (!need_vex)
11498 abort ();
1ba585e8
IT
11499 if (vex.w)
11500 oappend ("QWORD PTR ");
11501 else
11502 oappend ("WORD PTR ");
43234a1e 11503 break;
6c75cc62 11504 case v_bnd_mode:
d276ec69 11505 case v_bndmk_mode:
3f31e633
JB
11506 default:
11507 break;
11508 }
11509}
11510
252b5132 11511static void
c0f3af97 11512OP_E_register (int bytemode, int sizeflag)
252b5132 11513{
c0f3af97
L
11514 int reg = modrm.rm;
11515 const char **names;
252b5132 11516
c0f3af97
L
11517 USED_REX (REX_B);
11518 if ((rex & REX_B))
11519 reg += 8;
252b5132 11520
b6169b20 11521 if ((sizeflag & SUFFIX_ALWAYS)
1ba585e8 11522 && (bytemode == b_swap_mode
9f79e886 11523 || bytemode == bnd_swap_mode
60227d64 11524 || bytemode == v_swap_mode))
b6169b20
L
11525 swap_operand ();
11526
c0f3af97 11527 switch (bytemode)
252b5132 11528 {
c0f3af97 11529 case b_mode:
b6169b20 11530 case b_swap_mode:
e184e611
JB
11531 if (reg & 4)
11532 USED_REX (0);
c0f3af97
L
11533 if (rex)
11534 names = names8rex;
11535 else
11536 names = names8;
11537 break;
11538 case w_mode:
11539 names = names16;
11540 break;
11541 case d_mode:
1ba585e8
IT
11542 case dw_mode:
11543 case db_mode:
c0f3af97
L
11544 names = names32;
11545 break;
11546 case q_mode:
11547 names = names64;
11548 break;
11549 case m_mode:
6c75cc62 11550 case v_bnd_mode:
c0f3af97
L
11551 names = address_mode == mode_64bit ? names64 : names32;
11552 break;
7e8b059b 11553 case bnd_mode:
9f79e886 11554 case bnd_swap_mode:
0d96e4df
L
11555 if (reg > 0x3)
11556 {
11557 oappend ("(bad)");
11558 return;
11559 }
7e8b059b
L
11560 names = names_bnd;
11561 break;
07f5af7d
L
11562 case indir_v_mode:
11563 if (address_mode == mode_64bit && isa64 == intel64)
11564 {
11565 names = names64;
11566 break;
11567 }
1a0670f3 11568 /* Fall through. */
c0f3af97 11569 case stack_v_mode:
7bb15c6f 11570 if (address_mode == mode_64bit && ((sizeflag & DFLAG) || (rex & REX_W)))
252b5132 11571 {
c0f3af97 11572 names = names64;
252b5132 11573 break;
252b5132 11574 }
c0f3af97 11575 bytemode = v_mode;
1a0670f3 11576 /* Fall through. */
c0f3af97 11577 case v_mode:
b6169b20 11578 case v_swap_mode:
c0f3af97
L
11579 case dq_mode:
11580 case dqb_mode:
11581 case dqd_mode:
11582 case dqw_mode:
11583 USED_REX (REX_W);
11584 if (rex & REX_W)
11585 names = names64;
035e7389
JB
11586 else if (bytemode != v_mode && bytemode != v_swap_mode)
11587 names = names32;
c0f3af97 11588 else
f16cd0d5 11589 {
035e7389 11590 if (sizeflag & DFLAG)
f16cd0d5
L
11591 names = names32;
11592 else
11593 names = names16;
11594 used_prefixes |= (prefixes & PREFIX_DATA);
11595 }
c0f3af97 11596 break;
bc31405e
L
11597 case movsxd_mode:
11598 if (!(sizeflag & DFLAG) && isa64 == intel64)
11599 names = names16;
11600 else
11601 names = names32;
11602 used_prefixes |= (prefixes & PREFIX_DATA);
11603 break;
de89d0a3
IT
11604 case va_mode:
11605 names = (address_mode == mode_64bit
11606 ? names64 : names32);
11607 if (!(prefixes & PREFIX_ADDR))
aa178437
IT
11608 names = (address_mode == mode_16bit
11609 ? names16 : names);
de89d0a3
IT
11610 else
11611 {
11612 /* Remove "addr16/addr32". */
11613 all_prefixes[last_addr_prefix] = 0;
11614 names = (address_mode != mode_32bit
11615 ? names32 : names16);
11616 used_prefixes |= PREFIX_ADDR;
11617 }
11618 break;
1ba585e8 11619 case mask_bd_mode:
43234a1e 11620 case mask_mode:
9889cbb1
L
11621 if (reg > 0x7)
11622 {
11623 oappend ("(bad)");
11624 return;
11625 }
43234a1e
L
11626 names = names_mask;
11627 break;
c0f3af97
L
11628 case 0:
11629 return;
11630 default:
11631 oappend (INTERNAL_DISASSEMBLER_ERROR);
252b5132
RH
11632 return;
11633 }
c0f3af97
L
11634 oappend (names[reg]);
11635}
11636
11637static void
c1e679ec 11638OP_E_memory (int bytemode, int sizeflag)
c0f3af97
L
11639{
11640 bfd_vma disp = 0;
11641 int add = (rex & REX_B) ? 8 : 0;
11642 int riprel = 0;
43234a1e
L
11643 int shift;
11644
11645 if (vex.evex)
11646 {
11647 /* In EVEX, if operand doesn't allow broadcast, vex.b should be 0. */
11648 if (vex.b
11649 && bytemode != x_mode
90a915bf 11650 && bytemode != xmmq_mode
43234a1e
L
11651 && bytemode != evex_half_bcst_xmmq_mode)
11652 {
11653 BadOp ();
11654 return;
11655 }
11656 switch (bytemode)
11657 {
1ba585e8
IT
11658 case dqw_mode:
11659 case dw_mode:
059edf8b 11660 case xmm_mw_mode:
1ba585e8
IT
11661 shift = 1;
11662 break;
11663 case dqb_mode:
11664 case db_mode:
059edf8b 11665 case xmm_mb_mode:
1ba585e8
IT
11666 shift = 0;
11667 break;
b50c9f31
JB
11668 case dq_mode:
11669 if (address_mode != mode_64bit)
11670 {
059edf8b
JB
11671 case dqd_mode:
11672 case xmm_md_mode:
11673 case d_mode:
11674 case d_swap_mode:
b50c9f31
JB
11675 shift = 2;
11676 break;
11677 }
11678 /* fall through */
4102be5c 11679 case vex_scalar_w_dq_mode:
43234a1e 11680 case vex_vsib_d_w_dq_mode:
5fc35d96 11681 case vex_vsib_d_w_d_mode:
eaa9d1ad 11682 case vex_vsib_q_w_dq_mode:
5fc35d96 11683 case vex_vsib_q_w_d_mode:
43234a1e 11684 case evex_x_gscat_mode:
43234a1e
L
11685 shift = vex.w ? 3 : 2;
11686 break;
43234a1e
L
11687 case x_mode:
11688 case evex_half_bcst_xmmq_mode:
90a915bf 11689 case xmmq_mode:
43234a1e
L
11690 if (vex.b)
11691 {
11692 shift = vex.w ? 3 : 2;
11693 break;
11694 }
1a0670f3 11695 /* Fall through. */
43234a1e
L
11696 case xmmqd_mode:
11697 case xmmdw_mode:
43234a1e
L
11698 case ymmq_mode:
11699 case evex_x_nobcst_mode:
11700 case x_swap_mode:
11701 switch (vex.length)
11702 {
11703 case 128:
11704 shift = 4;
11705 break;
11706 case 256:
11707 shift = 5;
11708 break;
11709 case 512:
11710 shift = 6;
11711 break;
11712 default:
11713 abort ();
11714 }
059edf8b
JB
11715 /* Make necessary corrections to shift for modes that need it. */
11716 if (bytemode == xmmq_mode
11717 || bytemode == evex_half_bcst_xmmq_mode
11718 || (bytemode == ymmq_mode && vex.length == 128))
11719 shift -= 1;
11720 else if (bytemode == xmmqd_mode)
11721 shift -= 2;
11722 else if (bytemode == xmmdw_mode)
11723 shift -= 3;
43234a1e
L
11724 break;
11725 case ymm_mode:
11726 shift = 5;
11727 break;
11728 case xmm_mode:
11729 shift = 4;
11730 break;
11731 case xmm_mq_mode:
11732 case q_mode:
43234a1e 11733 case q_swap_mode:
43234a1e
L
11734 shift = 3;
11735 break;
4726e9a4
JB
11736 case bw_unit_mode:
11737 shift = vex.w ? 1 : 0;
11738 break;
43234a1e
L
11739 default:
11740 abort ();
11741 }
43234a1e
L
11742 }
11743 else
11744 shift = 0;
252b5132 11745
c0f3af97 11746 USED_REX (REX_B);
3f31e633
JB
11747 if (intel_syntax)
11748 intel_operand_size (bytemode, sizeflag);
252b5132
RH
11749 append_seg ();
11750
5d669648 11751 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
252b5132 11752 {
5d669648
L
11753 /* 32/64 bit address mode */
11754 int havedisp;
252b5132
RH
11755 int havesib;
11756 int havebase;
0f7da397 11757 int haveindex;
20afcfb7 11758 int needindex;
1bc60e56 11759 int needaddr32;
82c18208 11760 int base, rbase;
91d6fa6a 11761 int vindex = 0;
252b5132 11762 int scale = 0;
7e8b059b
L
11763 int addr32flag = !((sizeflag & AFLAG)
11764 || bytemode == v_bnd_mode
d276ec69 11765 || bytemode == v_bndmk_mode
9f79e886
JB
11766 || bytemode == bnd_mode
11767 || bytemode == bnd_swap_mode);
6c30d220
L
11768 const char **indexes64 = names64;
11769 const char **indexes32 = names32;
252b5132
RH
11770
11771 havesib = 0;
11772 havebase = 1;
0f7da397 11773 haveindex = 0;
7967e09e 11774 base = modrm.rm;
252b5132
RH
11775
11776 if (base == 4)
11777 {
11778 havesib = 1;
dfc8cf43 11779 vindex = sib.index;
161a04f6
L
11780 USED_REX (REX_X);
11781 if (rex & REX_X)
91d6fa6a 11782 vindex += 8;
6c30d220
L
11783 switch (bytemode)
11784 {
11785 case vex_vsib_d_w_dq_mode:
5fc35d96 11786 case vex_vsib_d_w_d_mode:
6c30d220 11787 case vex_vsib_q_w_dq_mode:
5fc35d96 11788 case vex_vsib_q_w_d_mode:
6c30d220
L
11789 if (!need_vex)
11790 abort ();
43234a1e
L
11791 if (vex.evex)
11792 {
11793 if (!vex.v)
11794 vindex += 16;
11795 }
6c30d220
L
11796
11797 haveindex = 1;
11798 switch (vex.length)
11799 {
11800 case 128:
7bb15c6f 11801 indexes64 = indexes32 = names_xmm;
6c30d220
L
11802 break;
11803 case 256:
5fc35d96
IT
11804 if (!vex.w
11805 || bytemode == vex_vsib_q_w_dq_mode
11806 || bytemode == vex_vsib_q_w_d_mode)
7bb15c6f 11807 indexes64 = indexes32 = names_ymm;
6c30d220 11808 else
7bb15c6f 11809 indexes64 = indexes32 = names_xmm;
6c30d220 11810 break;
43234a1e 11811 case 512:
5fc35d96
IT
11812 if (!vex.w
11813 || bytemode == vex_vsib_q_w_dq_mode
11814 || bytemode == vex_vsib_q_w_d_mode)
43234a1e
L
11815 indexes64 = indexes32 = names_zmm;
11816 else
11817 indexes64 = indexes32 = names_ymm;
11818 break;
6c30d220
L
11819 default:
11820 abort ();
11821 }
11822 break;
11823 default:
11824 haveindex = vindex != 4;
11825 break;
11826 }
11827 scale = sib.scale;
11828 base = sib.base;
252b5132
RH
11829 codep++;
11830 }
260cd341
LC
11831 else
11832 {
11833 /* mandatory non-vector SIB must have sib */
11834 if (bytemode == vex_sibmem_mode)
11835 {
11836 oappend ("(bad)");
11837 return;
11838 }
11839 }
82c18208 11840 rbase = base + add;
252b5132 11841
7967e09e 11842 switch (modrm.mod)
252b5132
RH
11843 {
11844 case 0:
82c18208 11845 if (base == 5)
252b5132
RH
11846 {
11847 havebase = 0;
cb712a9e 11848 if (address_mode == mode_64bit && !havesib)
52b15da3
JH
11849 riprel = 1;
11850 disp = get32s ();
d276ec69
JB
11851 if (riprel && bytemode == v_bndmk_mode)
11852 {
11853 oappend ("(bad)");
11854 return;
11855 }
252b5132
RH
11856 }
11857 break;
11858 case 1:
11859 FETCH_DATA (the_info, codep + 1);
11860 disp = *codep++;
11861 if ((disp & 0x80) != 0)
11862 disp -= 0x100;
43234a1e
L
11863 if (vex.evex && shift > 0)
11864 disp <<= shift;
252b5132
RH
11865 break;
11866 case 2:
52b15da3 11867 disp = get32s ();
252b5132
RH
11868 break;
11869 }
11870
1bc60e56
L
11871 needindex = 0;
11872 needaddr32 = 0;
11873 if (havesib
11874 && !havebase
11875 && !haveindex
11876 && address_mode != mode_16bit)
11877 {
11878 if (address_mode == mode_64bit)
11879 {
11880 /* Display eiz instead of addr32. */
11881 needindex = addr32flag;
11882 needaddr32 = 1;
11883 }
11884 else
11885 {
11886 /* In 32-bit mode, we need index register to tell [offset]
11887 from [eiz*1 + offset]. */
11888 needindex = 1;
11889 }
11890 }
11891
20afcfb7
L
11892 havedisp = (havebase
11893 || needindex
11894 || (havesib && (haveindex || scale != 0)));
5d669648 11895
252b5132 11896 if (!intel_syntax)
82c18208 11897 if (modrm.mod != 0 || base == 5)
db6eb5be 11898 {
5d669648
L
11899 if (havedisp || riprel)
11900 print_displacement (scratchbuf, disp);
11901 else
11902 print_operand_value (scratchbuf, 1, disp);
db6eb5be 11903 oappend (scratchbuf);
52b15da3
JH
11904 if (riprel)
11905 {
11906 set_op (disp, 1);
28596323 11907 oappend (!addr32flag ? "(%rip)" : "(%eip)");
52b15da3 11908 }
db6eb5be 11909 }
2da11e11 11910
c1dc7af5 11911 if ((havebase || haveindex || needindex || needaddr32 || riprel)
a23b33b3
JB
11912 && (address_mode != mode_64bit
11913 || ((bytemode != v_bnd_mode)
11914 && (bytemode != v_bndmk_mode)
11915 && (bytemode != bnd_mode)
11916 && (bytemode != bnd_swap_mode))))
87767711
JB
11917 used_prefixes |= PREFIX_ADDR;
11918
5d669648 11919 if (havedisp || (intel_syntax && riprel))
252b5132 11920 {
252b5132 11921 *obufp++ = open_char;
52b15da3 11922 if (intel_syntax && riprel)
185b1163
L
11923 {
11924 set_op (disp, 1);
28596323 11925 oappend (!addr32flag ? "rip" : "eip");
185b1163 11926 }
db6eb5be 11927 *obufp = '\0';
252b5132 11928 if (havebase)
7e8b059b 11929 oappend (address_mode == mode_64bit && !addr32flag
82c18208 11930 ? names64[rbase] : names32[rbase]);
252b5132
RH
11931 if (havesib)
11932 {
db51cc60
L
11933 /* ESP/RSP won't allow index. If base isn't ESP/RSP,
11934 print index to tell base + index from base. */
11935 if (scale != 0
20afcfb7 11936 || needindex
db51cc60
L
11937 || haveindex
11938 || (havebase && base != ESP_REG_NUM))
252b5132 11939 {
9306ca4a 11940 if (!intel_syntax || havebase)
db6eb5be 11941 {
9306ca4a
JB
11942 *obufp++ = separator_char;
11943 *obufp = '\0';
db6eb5be 11944 }
db51cc60 11945 if (haveindex)
7e8b059b 11946 oappend (address_mode == mode_64bit && !addr32flag
6c30d220 11947 ? indexes64[vindex] : indexes32[vindex]);
db51cc60 11948 else
7e8b059b 11949 oappend (address_mode == mode_64bit && !addr32flag
db51cc60
L
11950 ? index64 : index32);
11951
db6eb5be
AM
11952 *obufp++ = scale_char;
11953 *obufp = '\0';
11954 sprintf (scratchbuf, "%d", 1 << scale);
11955 oappend (scratchbuf);
11956 }
252b5132 11957 }
185b1163 11958 if (intel_syntax
82c18208 11959 && (disp || modrm.mod != 0 || base == 5))
3d456fa1 11960 {
db51cc60 11961 if (!havedisp || (bfd_signed_vma) disp >= 0)
3d456fa1
JB
11962 {
11963 *obufp++ = '+';
11964 *obufp = '\0';
11965 }
05203043 11966 else if (modrm.mod != 1 && disp != -disp)
3d456fa1
JB
11967 {
11968 *obufp++ = '-';
11969 *obufp = '\0';
11970 disp = - (bfd_signed_vma) disp;
11971 }
11972
db51cc60
L
11973 if (havedisp)
11974 print_displacement (scratchbuf, disp);
11975 else
11976 print_operand_value (scratchbuf, 1, disp);
3d456fa1
JB
11977 oappend (scratchbuf);
11978 }
252b5132
RH
11979
11980 *obufp++ = close_char;
db6eb5be 11981 *obufp = '\0';
252b5132
RH
11982 }
11983 else if (intel_syntax)
db6eb5be 11984 {
82c18208 11985 if (modrm.mod != 0 || base == 5)
db6eb5be 11986 {
285ca992 11987 if (!active_seg_prefix)
252b5132 11988 {
d708bcba 11989 oappend (names_seg[ds_reg - es_reg]);
252b5132
RH
11990 oappend (":");
11991 }
52b15da3 11992 print_operand_value (scratchbuf, 1, disp);
db6eb5be
AM
11993 oappend (scratchbuf);
11994 }
11995 }
252b5132 11996 }
a23b33b3
JB
11997 else if (bytemode == v_bnd_mode
11998 || bytemode == v_bndmk_mode
11999 || bytemode == bnd_mode
12000 || bytemode == bnd_swap_mode)
12001 {
12002 oappend ("(bad)");
12003 return;
12004 }
252b5132 12005 else
f16cd0d5
L
12006 {
12007 /* 16 bit address mode */
12008 used_prefixes |= prefixes & PREFIX_ADDR;
7967e09e 12009 switch (modrm.mod)
252b5132
RH
12010 {
12011 case 0:
7967e09e 12012 if (modrm.rm == 6)
252b5132
RH
12013 {
12014 disp = get16 ();
12015 if ((disp & 0x8000) != 0)
12016 disp -= 0x10000;
12017 }
12018 break;
12019 case 1:
12020 FETCH_DATA (the_info, codep + 1);
12021 disp = *codep++;
12022 if ((disp & 0x80) != 0)
12023 disp -= 0x100;
65f3ed04
JB
12024 if (vex.evex && shift > 0)
12025 disp <<= shift;
252b5132
RH
12026 break;
12027 case 2:
12028 disp = get16 ();
12029 if ((disp & 0x8000) != 0)
12030 disp -= 0x10000;
12031 break;
12032 }
12033
12034 if (!intel_syntax)
7967e09e 12035 if (modrm.mod != 0 || modrm.rm == 6)
db6eb5be 12036 {
5d669648 12037 print_displacement (scratchbuf, disp);
db6eb5be
AM
12038 oappend (scratchbuf);
12039 }
252b5132 12040
7967e09e 12041 if (modrm.mod != 0 || modrm.rm != 6)
252b5132
RH
12042 {
12043 *obufp++ = open_char;
db6eb5be 12044 *obufp = '\0';
7967e09e 12045 oappend (index16[modrm.rm]);
5d669648
L
12046 if (intel_syntax
12047 && (disp || modrm.mod != 0 || modrm.rm == 6))
3d456fa1 12048 {
5d669648 12049 if ((bfd_signed_vma) disp >= 0)
3d456fa1
JB
12050 {
12051 *obufp++ = '+';
12052 *obufp = '\0';
12053 }
7967e09e 12054 else if (modrm.mod != 1)
3d456fa1
JB
12055 {
12056 *obufp++ = '-';
12057 *obufp = '\0';
12058 disp = - (bfd_signed_vma) disp;
12059 }
12060
5d669648 12061 print_displacement (scratchbuf, disp);
3d456fa1
JB
12062 oappend (scratchbuf);
12063 }
12064
db6eb5be
AM
12065 *obufp++ = close_char;
12066 *obufp = '\0';
252b5132 12067 }
3d456fa1
JB
12068 else if (intel_syntax)
12069 {
285ca992 12070 if (!active_seg_prefix)
3d456fa1
JB
12071 {
12072 oappend (names_seg[ds_reg - es_reg]);
12073 oappend (":");
12074 }
12075 print_operand_value (scratchbuf, 1, disp & 0xffff);
12076 oappend (scratchbuf);
12077 }
252b5132 12078 }
43234a1e
L
12079 if (vex.evex && vex.b
12080 && (bytemode == x_mode
90a915bf 12081 || bytemode == xmmq_mode
43234a1e
L
12082 || bytemode == evex_half_bcst_xmmq_mode))
12083 {
90a915bf
IT
12084 if (vex.w
12085 || bytemode == xmmq_mode
12086 || bytemode == evex_half_bcst_xmmq_mode)
b28d1bda
IT
12087 {
12088 switch (vex.length)
12089 {
12090 case 128:
12091 oappend ("{1to2}");
12092 break;
12093 case 256:
12094 oappend ("{1to4}");
12095 break;
12096 case 512:
12097 oappend ("{1to8}");
12098 break;
12099 default:
12100 abort ();
12101 }
12102 }
43234a1e 12103 else
b28d1bda
IT
12104 {
12105 switch (vex.length)
12106 {
12107 case 128:
12108 oappend ("{1to4}");
12109 break;
12110 case 256:
12111 oappend ("{1to8}");
12112 break;
12113 case 512:
12114 oappend ("{1to16}");
12115 break;
12116 default:
12117 abort ();
12118 }
12119 }
43234a1e 12120 }
252b5132
RH
12121}
12122
c0f3af97 12123static void
8b3f93e7 12124OP_E (int bytemode, int sizeflag)
c0f3af97
L
12125{
12126 /* Skip mod/rm byte. */
12127 MODRM_CHECK;
12128 codep++;
12129
12130 if (modrm.mod == 3)
12131 OP_E_register (bytemode, sizeflag);
12132 else
c1e679ec 12133 OP_E_memory (bytemode, sizeflag);
c0f3af97
L
12134}
12135
252b5132 12136static void
26ca5450 12137OP_G (int bytemode, int sizeflag)
252b5132 12138{
52b15da3 12139 int add = 0;
c0a30a9f 12140 const char **names;
161a04f6
L
12141 USED_REX (REX_R);
12142 if (rex & REX_R)
52b15da3 12143 add += 8;
252b5132
RH
12144 switch (bytemode)
12145 {
12146 case b_mode:
e184e611
JB
12147 if (modrm.reg & 4)
12148 USED_REX (0);
52b15da3 12149 if (rex)
7967e09e 12150 oappend (names8rex[modrm.reg + add]);
52b15da3 12151 else
7967e09e 12152 oappend (names8[modrm.reg + add]);
252b5132
RH
12153 break;
12154 case w_mode:
7967e09e 12155 oappend (names16[modrm.reg + add]);
252b5132
RH
12156 break;
12157 case d_mode:
1ba585e8
IT
12158 case db_mode:
12159 case dw_mode:
7967e09e 12160 oappend (names32[modrm.reg + add]);
52b15da3
JH
12161 break;
12162 case q_mode:
7967e09e 12163 oappend (names64[modrm.reg + add]);
252b5132 12164 break;
7e8b059b 12165 case bnd_mode:
0d96e4df
L
12166 if (modrm.reg > 0x3)
12167 {
12168 oappend ("(bad)");
12169 return;
12170 }
7e8b059b
L
12171 oappend (names_bnd[modrm.reg]);
12172 break;
252b5132 12173 case v_mode:
9306ca4a 12174 case dq_mode:
42903f7f
L
12175 case dqb_mode:
12176 case dqd_mode:
9306ca4a 12177 case dqw_mode:
bc31405e 12178 case movsxd_mode:
161a04f6
L
12179 USED_REX (REX_W);
12180 if (rex & REX_W)
7967e09e 12181 oappend (names64[modrm.reg + add]);
035e7389
JB
12182 else if (bytemode != v_mode && bytemode != movsxd_mode)
12183 oappend (names32[modrm.reg + add]);
252b5132 12184 else
f16cd0d5 12185 {
035e7389 12186 if (sizeflag & DFLAG)
f16cd0d5
L
12187 oappend (names32[modrm.reg + add]);
12188 else
12189 oappend (names16[modrm.reg + add]);
12190 used_prefixes |= (prefixes & PREFIX_DATA);
12191 }
252b5132 12192 break;
c0a30a9f
L
12193 case va_mode:
12194 names = (address_mode == mode_64bit
12195 ? names64 : names32);
12196 if (!(prefixes & PREFIX_ADDR))
12197 {
12198 if (address_mode == mode_16bit)
12199 names = names16;
12200 }
12201 else
12202 {
12203 /* Remove "addr16/addr32". */
12204 all_prefixes[last_addr_prefix] = 0;
12205 names = (address_mode != mode_32bit
12206 ? names32 : names16);
12207 used_prefixes |= PREFIX_ADDR;
12208 }
12209 oappend (names[modrm.reg + add]);
12210 break;
90700ea2 12211 case m_mode:
cb712a9e 12212 if (address_mode == mode_64bit)
7967e09e 12213 oappend (names64[modrm.reg + add]);
90700ea2 12214 else
7967e09e 12215 oappend (names32[modrm.reg + add]);
90700ea2 12216 break;
1ba585e8 12217 case mask_bd_mode:
43234a1e 12218 case mask_mode:
9889cbb1
L
12219 if ((modrm.reg + add) > 0x7)
12220 {
12221 oappend ("(bad)");
12222 return;
12223 }
43234a1e
L
12224 oappend (names_mask[modrm.reg + add]);
12225 break;
252b5132
RH
12226 default:
12227 oappend (INTERNAL_DISASSEMBLER_ERROR);
12228 break;
12229 }
12230}
12231
52b15da3 12232static bfd_vma
26ca5450 12233get64 (void)
52b15da3 12234{
5dd0794d 12235 bfd_vma x;
52b15da3 12236#ifdef BFD64
5dd0794d
AM
12237 unsigned int a;
12238 unsigned int b;
12239
52b15da3
JH
12240 FETCH_DATA (the_info, codep + 8);
12241 a = *codep++ & 0xff;
12242 a |= (*codep++ & 0xff) << 8;
12243 a |= (*codep++ & 0xff) << 16;
070fe95d 12244 a |= (*codep++ & 0xffu) << 24;
5dd0794d 12245 b = *codep++ & 0xff;
52b15da3
JH
12246 b |= (*codep++ & 0xff) << 8;
12247 b |= (*codep++ & 0xff) << 16;
070fe95d 12248 b |= (*codep++ & 0xffu) << 24;
52b15da3
JH
12249 x = a + ((bfd_vma) b << 32);
12250#else
6608db57 12251 abort ();
5dd0794d 12252 x = 0;
52b15da3
JH
12253#endif
12254 return x;
12255}
12256
12257static bfd_signed_vma
26ca5450 12258get32 (void)
252b5132 12259{
52b15da3 12260 bfd_signed_vma x = 0;
252b5132
RH
12261
12262 FETCH_DATA (the_info, codep + 4);
52b15da3
JH
12263 x = *codep++ & (bfd_signed_vma) 0xff;
12264 x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
12265 x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
12266 x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
12267 return x;
12268}
12269
12270static bfd_signed_vma
26ca5450 12271get32s (void)
52b15da3
JH
12272{
12273 bfd_signed_vma x = 0;
12274
12275 FETCH_DATA (the_info, codep + 4);
12276 x = *codep++ & (bfd_signed_vma) 0xff;
12277 x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
12278 x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
12279 x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
12280
12281 x = (x ^ ((bfd_signed_vma) 1 << 31)) - ((bfd_signed_vma) 1 << 31);
12282
252b5132
RH
12283 return x;
12284}
12285
12286static int
26ca5450 12287get16 (void)
252b5132
RH
12288{
12289 int x = 0;
12290
12291 FETCH_DATA (the_info, codep + 2);
12292 x = *codep++ & 0xff;
12293 x |= (*codep++ & 0xff) << 8;
12294 return x;
12295}
12296
12297static void
26ca5450 12298set_op (bfd_vma op, int riprel)
252b5132
RH
12299{
12300 op_index[op_ad] = op_ad;
cb712a9e 12301 if (address_mode == mode_64bit)
7081ff04
AJ
12302 {
12303 op_address[op_ad] = op;
12304 op_riprel[op_ad] = riprel;
12305 }
12306 else
12307 {
12308 /* Mask to get a 32-bit address. */
12309 op_address[op_ad] = op & 0xffffffff;
12310 op_riprel[op_ad] = riprel & 0xffffffff;
12311 }
252b5132
RH
12312}
12313
12314static void
26ca5450 12315OP_REG (int code, int sizeflag)
252b5132 12316{
2da11e11 12317 const char *s;
9b60702d 12318 int add;
de882298
RM
12319
12320 switch (code)
12321 {
12322 case es_reg: case ss_reg: case cs_reg:
12323 case ds_reg: case fs_reg: case gs_reg:
12324 oappend (names_seg[code - es_reg]);
12325 return;
12326 }
12327
161a04f6
L
12328 USED_REX (REX_B);
12329 if (rex & REX_B)
52b15da3 12330 add = 8;
9b60702d
L
12331 else
12332 add = 0;
52b15da3
JH
12333
12334 switch (code)
12335 {
52b15da3
JH
12336 case ax_reg: case cx_reg: case dx_reg: case bx_reg:
12337 case sp_reg: case bp_reg: case si_reg: case di_reg:
12338 s = names16[code - ax_reg + add];
12339 break;
e184e611 12340 case ah_reg: case ch_reg: case dh_reg: case bh_reg:
52b15da3 12341 USED_REX (0);
e184e611
JB
12342 /* Fall through. */
12343 case al_reg: case cl_reg: case dl_reg: case bl_reg:
52b15da3
JH
12344 if (rex)
12345 s = names8rex[code - al_reg + add];
12346 else
12347 s = names8[code - al_reg];
12348 break;
6439fc28
AM
12349 case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
12350 case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
7bb15c6f 12351 if (address_mode == mode_64bit
6c067bbb 12352 && ((sizeflag & DFLAG) || (rex & REX_W)))
6439fc28
AM
12353 {
12354 s = names64[code - rAX_reg + add];
12355 break;
12356 }
12357 code += eAX_reg - rAX_reg;
6608db57 12358 /* Fall through. */
52b15da3
JH
12359 case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
12360 case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
161a04f6
L
12361 USED_REX (REX_W);
12362 if (rex & REX_W)
52b15da3 12363 s = names64[code - eAX_reg + add];
52b15da3 12364 else
f16cd0d5
L
12365 {
12366 if (sizeflag & DFLAG)
12367 s = names32[code - eAX_reg + add];
12368 else
12369 s = names16[code - eAX_reg + add];
12370 used_prefixes |= (prefixes & PREFIX_DATA);
12371 }
52b15da3 12372 break;
52b15da3
JH
12373 default:
12374 s = INTERNAL_DISASSEMBLER_ERROR;
12375 break;
12376 }
12377 oappend (s);
12378}
12379
12380static void
26ca5450 12381OP_IMREG (int code, int sizeflag)
52b15da3
JH
12382{
12383 const char *s;
252b5132
RH
12384
12385 switch (code)
12386 {
12387 case indir_dx_reg:
d708bcba 12388 if (intel_syntax)
52fd6d94 12389 s = "dx";
d708bcba 12390 else
db6eb5be 12391 s = "(%dx)";
252b5132 12392 break;
e8b5d5f9
JB
12393 case al_reg: case cl_reg:
12394 s = names8[code - al_reg];
252b5132 12395 break;
e8b5d5f9 12396 case eAX_reg:
161a04f6
L
12397 USED_REX (REX_W);
12398 if (rex & REX_W)
f16cd0d5 12399 {
e8b5d5f9
JB
12400 s = *names64;
12401 break;
f16cd0d5 12402 }
e8b5d5f9 12403 /* Fall through. */
52fd6d94 12404 case z_mode_ax_reg:
161a04f6 12405 if ((rex & REX_W) || (sizeflag & DFLAG))
52fd6d94
JB
12406 s = *names32;
12407 else
12408 s = *names16;
161a04f6 12409 if (!(rex & REX_W))
52fd6d94
JB
12410 used_prefixes |= (prefixes & PREFIX_DATA);
12411 break;
252b5132
RH
12412 default:
12413 s = INTERNAL_DISASSEMBLER_ERROR;
12414 break;
12415 }
12416 oappend (s);
12417}
12418
12419static void
26ca5450 12420OP_I (int bytemode, int sizeflag)
252b5132 12421{
52b15da3
JH
12422 bfd_signed_vma op;
12423 bfd_signed_vma mask = -1;
252b5132
RH
12424
12425 switch (bytemode)
12426 {
12427 case b_mode:
12428 FETCH_DATA (the_info, codep + 1);
52b15da3
JH
12429 op = *codep++;
12430 mask = 0xff;
12431 break;
252b5132 12432 case v_mode:
161a04f6
L
12433 USED_REX (REX_W);
12434 if (rex & REX_W)
52b15da3 12435 op = get32s ();
252b5132 12436 else
52b15da3 12437 {
f16cd0d5
L
12438 if (sizeflag & DFLAG)
12439 {
12440 op = get32 ();
12441 mask = 0xffffffff;
12442 }
12443 else
12444 {
12445 op = get16 ();
12446 mask = 0xfffff;
12447 }
12448 used_prefixes |= (prefixes & PREFIX_DATA);
52b15da3 12449 }
252b5132 12450 break;
c1dc7af5
JB
12451 case d_mode:
12452 mask = 0xffffffff;
12453 op = get32 ();
12454 break;
252b5132 12455 case w_mode:
52b15da3 12456 mask = 0xfffff;
252b5132
RH
12457 op = get16 ();
12458 break;
9306ca4a
JB
12459 case const_1_mode:
12460 if (intel_syntax)
6c067bbb 12461 oappend ("1");
9306ca4a 12462 return;
252b5132
RH
12463 default:
12464 oappend (INTERNAL_DISASSEMBLER_ERROR);
12465 return;
12466 }
12467
52b15da3
JH
12468 op &= mask;
12469 scratchbuf[0] = '$';
d708bcba 12470 print_operand_value (scratchbuf + 1, 1, op);
9ce09ba2 12471 oappend_maybe_intel (scratchbuf);
52b15da3
JH
12472 scratchbuf[0] = '\0';
12473}
12474
12475static void
26ca5450 12476OP_I64 (int bytemode, int sizeflag)
52b15da3 12477{
a280ab8e 12478 if (bytemode != v_mode || address_mode != mode_64bit || !(rex & REX_W))
6439fc28
AM
12479 {
12480 OP_I (bytemode, sizeflag);
12481 return;
12482 }
12483
a280ab8e 12484 USED_REX (REX_W);
52b15da3 12485
52b15da3 12486 scratchbuf[0] = '$';
a280ab8e 12487 print_operand_value (scratchbuf + 1, 1, get64 ());
9ce09ba2 12488 oappend_maybe_intel (scratchbuf);
252b5132
RH
12489 scratchbuf[0] = '\0';
12490}
12491
12492static void
26ca5450 12493OP_sI (int bytemode, int sizeflag)
252b5132 12494{
52b15da3 12495 bfd_signed_vma op;
252b5132
RH
12496
12497 switch (bytemode)
12498 {
12499 case b_mode:
e3949f17 12500 case b_T_mode:
252b5132
RH
12501 FETCH_DATA (the_info, codep + 1);
12502 op = *codep++;
12503 if ((op & 0x80) != 0)
12504 op -= 0x100;
e3949f17
L
12505 if (bytemode == b_T_mode)
12506 {
12507 if (address_mode != mode_64bit
7bb15c6f 12508 || !((sizeflag & DFLAG) || (rex & REX_W)))
e3949f17 12509 {
6c067bbb
RM
12510 /* The operand-size prefix is overridden by a REX prefix. */
12511 if ((sizeflag & DFLAG) || (rex & REX_W))
e3949f17
L
12512 op &= 0xffffffff;
12513 else
12514 op &= 0xffff;
12515 }
12516 }
12517 else
12518 {
12519 if (!(rex & REX_W))
12520 {
12521 if (sizeflag & DFLAG)
12522 op &= 0xffffffff;
12523 else
12524 op &= 0xffff;
12525 }
12526 }
252b5132
RH
12527 break;
12528 case v_mode:
7bb15c6f
RM
12529 /* The operand-size prefix is overridden by a REX prefix. */
12530 if ((sizeflag & DFLAG) || (rex & REX_W))
52b15da3 12531 op = get32s ();
252b5132 12532 else
d9e3625e 12533 op = get16 ();
252b5132
RH
12534 break;
12535 default:
12536 oappend (INTERNAL_DISASSEMBLER_ERROR);
12537 return;
12538 }
52b15da3
JH
12539
12540 scratchbuf[0] = '$';
12541 print_operand_value (scratchbuf + 1, 1, op);
9ce09ba2 12542 oappend_maybe_intel (scratchbuf);
252b5132
RH
12543}
12544
12545static void
26ca5450 12546OP_J (int bytemode, int sizeflag)
252b5132 12547{
52b15da3 12548 bfd_vma disp;
7081ff04 12549 bfd_vma mask = -1;
65ca155d 12550 bfd_vma segment = 0;
252b5132
RH
12551
12552 switch (bytemode)
12553 {
12554 case b_mode:
12555 FETCH_DATA (the_info, codep + 1);
12556 disp = *codep++;
12557 if ((disp & 0x80) != 0)
12558 disp -= 0x100;
12559 break;
12560 case v_mode:
d835a58b 12561 if (isa64 != intel64)
376cd056 12562 case dqw_mode:
5db04b09
L
12563 USED_REX (REX_W);
12564 if ((sizeflag & DFLAG)
12565 || (address_mode == mode_64bit
d835a58b 12566 && ((isa64 == intel64 && bytemode != dqw_mode)
376cd056 12567 || (rex & REX_W))))
52b15da3 12568 disp = get32s ();
252b5132
RH
12569 else
12570 {
12571 disp = get16 ();
206717e8
L
12572 if ((disp & 0x8000) != 0)
12573 disp -= 0x10000;
65ca155d
L
12574 /* In 16bit mode, address is wrapped around at 64k within
12575 the same segment. Otherwise, a data16 prefix on a jump
12576 instruction means that the pc is masked to 16 bits after
12577 the displacement is added! */
12578 mask = 0xffff;
12579 if ((prefixes & PREFIX_DATA) == 0)
4fd7268a 12580 segment = ((start_pc + (codep - start_codep))
65ca155d 12581 & ~((bfd_vma) 0xffff));
252b5132 12582 }
5db04b09 12583 if (address_mode != mode_64bit
d835a58b 12584 || (isa64 != intel64 && !(rex & REX_W)))
f16cd0d5 12585 used_prefixes |= (prefixes & PREFIX_DATA);
252b5132
RH
12586 break;
12587 default:
12588 oappend (INTERNAL_DISASSEMBLER_ERROR);
12589 return;
12590 }
42d5f9c6 12591 disp = ((start_pc + (codep - start_codep) + disp) & mask) | segment;
52b15da3
JH
12592 set_op (disp, 0);
12593 print_operand_value (scratchbuf, 1, disp);
252b5132
RH
12594 oappend (scratchbuf);
12595}
12596
252b5132 12597static void
ed7841b3 12598OP_SEG (int bytemode, int sizeflag)
252b5132 12599{
ed7841b3 12600 if (bytemode == w_mode)
7967e09e 12601 oappend (names_seg[modrm.reg]);
ed7841b3 12602 else
7967e09e 12603 OP_E (modrm.mod == 3 ? bytemode : w_mode, sizeflag);
252b5132
RH
12604}
12605
12606static void
26ca5450 12607OP_DIR (int dummy ATTRIBUTE_UNUSED, int sizeflag)
252b5132
RH
12608{
12609 int seg, offset;
12610
c608c12e 12611 if (sizeflag & DFLAG)
252b5132 12612 {
c608c12e
AM
12613 offset = get32 ();
12614 seg = get16 ();
252b5132 12615 }
c608c12e
AM
12616 else
12617 {
12618 offset = get16 ();
12619 seg = get16 ();
12620 }
7d421014 12621 used_prefixes |= (prefixes & PREFIX_DATA);
d708bcba 12622 if (intel_syntax)
3f31e633 12623 sprintf (scratchbuf, "0x%x:0x%x", seg, offset);
d708bcba
AM
12624 else
12625 sprintf (scratchbuf, "$0x%x,$0x%x", seg, offset);
c608c12e 12626 oappend (scratchbuf);
252b5132
RH
12627}
12628
252b5132 12629static void
3f31e633 12630OP_OFF (int bytemode, int sizeflag)
252b5132 12631{
52b15da3 12632 bfd_vma off;
252b5132 12633
3f31e633
JB
12634 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
12635 intel_operand_size (bytemode, sizeflag);
252b5132
RH
12636 append_seg ();
12637
cb712a9e 12638 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
252b5132
RH
12639 off = get32 ();
12640 else
12641 off = get16 ();
12642
12643 if (intel_syntax)
12644 {
285ca992 12645 if (!active_seg_prefix)
252b5132 12646 {
d708bcba 12647 oappend (names_seg[ds_reg - es_reg]);
252b5132
RH
12648 oappend (":");
12649 }
12650 }
52b15da3
JH
12651 print_operand_value (scratchbuf, 1, off);
12652 oappend (scratchbuf);
12653}
6439fc28 12654
52b15da3 12655static void
3f31e633 12656OP_OFF64 (int bytemode, int sizeflag)
52b15da3
JH
12657{
12658 bfd_vma off;
12659
539e75ad
L
12660 if (address_mode != mode_64bit
12661 || (prefixes & PREFIX_ADDR))
6439fc28
AM
12662 {
12663 OP_OFF (bytemode, sizeflag);
12664 return;
12665 }
12666
3f31e633
JB
12667 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
12668 intel_operand_size (bytemode, sizeflag);
52b15da3
JH
12669 append_seg ();
12670
6608db57 12671 off = get64 ();
52b15da3
JH
12672
12673 if (intel_syntax)
12674 {
285ca992 12675 if (!active_seg_prefix)
52b15da3 12676 {
d708bcba 12677 oappend (names_seg[ds_reg - es_reg]);
52b15da3
JH
12678 oappend (":");
12679 }
12680 }
12681 print_operand_value (scratchbuf, 1, off);
252b5132
RH
12682 oappend (scratchbuf);
12683}
12684
12685static void
26ca5450 12686ptr_reg (int code, int sizeflag)
252b5132 12687{
2da11e11 12688 const char *s;
d708bcba 12689
1d9f512f 12690 *obufp++ = open_char;
20f0a1fc 12691 used_prefixes |= (prefixes & PREFIX_ADDR);
cb712a9e 12692 if (address_mode == mode_64bit)
c1a64871
JH
12693 {
12694 if (!(sizeflag & AFLAG))
db6eb5be 12695 s = names32[code - eAX_reg];
c1a64871 12696 else
db6eb5be 12697 s = names64[code - eAX_reg];
c1a64871 12698 }
52b15da3 12699 else if (sizeflag & AFLAG)
252b5132
RH
12700 s = names32[code - eAX_reg];
12701 else
12702 s = names16[code - eAX_reg];
12703 oappend (s);
1d9f512f
AM
12704 *obufp++ = close_char;
12705 *obufp = 0;
252b5132
RH
12706}
12707
12708static void
26ca5450 12709OP_ESreg (int code, int sizeflag)
252b5132 12710{
9306ca4a 12711 if (intel_syntax)
52fd6d94
JB
12712 {
12713 switch (codep[-1])
12714 {
12715 case 0x6d: /* insw/insl */
12716 intel_operand_size (z_mode, sizeflag);
12717 break;
12718 case 0xa5: /* movsw/movsl/movsq */
12719 case 0xa7: /* cmpsw/cmpsl/cmpsq */
12720 case 0xab: /* stosw/stosl */
12721 case 0xaf: /* scasw/scasl */
12722 intel_operand_size (v_mode, sizeflag);
12723 break;
12724 default:
12725 intel_operand_size (b_mode, sizeflag);
12726 }
12727 }
9ce09ba2 12728 oappend_maybe_intel ("%es:");
252b5132
RH
12729 ptr_reg (code, sizeflag);
12730}
12731
12732static void
26ca5450 12733OP_DSreg (int code, int sizeflag)
252b5132 12734{
9306ca4a 12735 if (intel_syntax)
52fd6d94
JB
12736 {
12737 switch (codep[-1])
12738 {
12739 case 0x6f: /* outsw/outsl */
12740 intel_operand_size (z_mode, sizeflag);
12741 break;
12742 case 0xa5: /* movsw/movsl/movsq */
12743 case 0xa7: /* cmpsw/cmpsl/cmpsq */
12744 case 0xad: /* lodsw/lodsl/lodsq */
12745 intel_operand_size (v_mode, sizeflag);
12746 break;
12747 default:
12748 intel_operand_size (b_mode, sizeflag);
12749 }
12750 }
285ca992
L
12751 /* Set active_seg_prefix to PREFIX_DS if it is unset so that the
12752 default segment register DS is printed. */
12753 if (!active_seg_prefix)
12754 active_seg_prefix = PREFIX_DS;
6608db57 12755 append_seg ();
252b5132
RH
12756 ptr_reg (code, sizeflag);
12757}
12758
252b5132 12759static void
26ca5450 12760OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 12761{
9b60702d 12762 int add;
161a04f6 12763 if (rex & REX_R)
c4a530c5 12764 {
161a04f6 12765 USED_REX (REX_R);
c4a530c5
JB
12766 add = 8;
12767 }
cb712a9e 12768 else if (address_mode != mode_64bit && (prefixes & PREFIX_LOCK))
c4a530c5 12769 {
f16cd0d5 12770 all_prefixes[last_lock_prefix] = 0;
c4a530c5
JB
12771 used_prefixes |= PREFIX_LOCK;
12772 add = 8;
12773 }
9b60702d
L
12774 else
12775 add = 0;
7967e09e 12776 sprintf (scratchbuf, "%%cr%d", modrm.reg + add);
9ce09ba2 12777 oappend_maybe_intel (scratchbuf);
252b5132
RH
12778}
12779
252b5132 12780static void
26ca5450 12781OP_D (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 12782{
9b60702d 12783 int add;
161a04f6
L
12784 USED_REX (REX_R);
12785 if (rex & REX_R)
52b15da3 12786 add = 8;
9b60702d
L
12787 else
12788 add = 0;
d708bcba 12789 if (intel_syntax)
7967e09e 12790 sprintf (scratchbuf, "db%d", modrm.reg + add);
d708bcba 12791 else
7967e09e 12792 sprintf (scratchbuf, "%%db%d", modrm.reg + add);
252b5132
RH
12793 oappend (scratchbuf);
12794}
12795
252b5132 12796static void
26ca5450 12797OP_T (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 12798{
7967e09e 12799 sprintf (scratchbuf, "%%tr%d", modrm.reg);
9ce09ba2 12800 oappend_maybe_intel (scratchbuf);
252b5132
RH
12801}
12802
252b5132 12803static void
26ca5450 12804OP_MMX (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 12805{
b9733481
L
12806 int reg = modrm.reg;
12807 const char **names;
12808
041bd2e0
JH
12809 used_prefixes |= (prefixes & PREFIX_DATA);
12810 if (prefixes & PREFIX_DATA)
20f0a1fc 12811 {
b9733481 12812 names = names_xmm;
161a04f6
L
12813 USED_REX (REX_R);
12814 if (rex & REX_R)
b9733481 12815 reg += 8;
20f0a1fc 12816 }
041bd2e0 12817 else
b9733481
L
12818 names = names_mm;
12819 oappend (names[reg]);
252b5132
RH
12820}
12821
c608c12e 12822static void
c0f3af97 12823OP_XMM (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
c608c12e 12824{
b9733481
L
12825 int reg = modrm.reg;
12826 const char **names;
12827
161a04f6
L
12828 USED_REX (REX_R);
12829 if (rex & REX_R)
b9733481 12830 reg += 8;
43234a1e
L
12831 if (vex.evex)
12832 {
12833 if (!vex.r)
12834 reg += 16;
12835 }
12836
539f890d
L
12837 if (need_vex
12838 && bytemode != xmm_mode
43234a1e
L
12839 && bytemode != xmmq_mode
12840 && bytemode != evex_half_bcst_xmmq_mode
12841 && bytemode != ymm_mode
260cd341 12842 && bytemode != tmm_mode
539f890d 12843 && bytemode != scalar_mode)
c0f3af97
L
12844 {
12845 switch (vex.length)
12846 {
12847 case 128:
b9733481 12848 names = names_xmm;
c0f3af97
L
12849 break;
12850 case 256:
5fc35d96
IT
12851 if (vex.w
12852 || (bytemode != vex_vsib_q_w_dq_mode
12853 && bytemode != vex_vsib_q_w_d_mode))
6c30d220
L
12854 names = names_ymm;
12855 else
12856 names = names_xmm;
c0f3af97 12857 break;
43234a1e
L
12858 case 512:
12859 names = names_zmm;
12860 break;
c0f3af97
L
12861 default:
12862 abort ();
12863 }
12864 }
43234a1e
L
12865 else if (bytemode == xmmq_mode
12866 || bytemode == evex_half_bcst_xmmq_mode)
12867 {
12868 switch (vex.length)
12869 {
12870 case 128:
12871 case 256:
12872 names = names_xmm;
12873 break;
12874 case 512:
12875 names = names_ymm;
12876 break;
12877 default:
12878 abort ();
12879 }
12880 }
260cd341
LC
12881 else if (bytemode == tmm_mode)
12882 {
12883 modrm.reg = reg;
12884 if (reg >= 8)
12885 {
12886 oappend ("(bad)");
12887 return;
12888 }
12889 names = names_tmm;
12890 }
43234a1e
L
12891 else if (bytemode == ymm_mode)
12892 names = names_ymm;
c0f3af97 12893 else
b9733481
L
12894 names = names_xmm;
12895 oappend (names[reg]);
c608c12e
AM
12896}
12897
252b5132 12898static void
26ca5450 12899OP_EM (int bytemode, int sizeflag)
252b5132 12900{
b9733481
L
12901 int reg;
12902 const char **names;
12903
7967e09e 12904 if (modrm.mod != 3)
252b5132 12905 {
b6169b20
L
12906 if (intel_syntax
12907 && (bytemode == v_mode || bytemode == v_swap_mode))
9306ca4a
JB
12908 {
12909 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
12910 used_prefixes |= (prefixes & PREFIX_DATA);
6c067bbb 12911 }
252b5132
RH
12912 OP_E (bytemode, sizeflag);
12913 return;
12914 }
12915
b6169b20
L
12916 if ((sizeflag & SUFFIX_ALWAYS) && bytemode == v_swap_mode)
12917 swap_operand ();
12918
6608db57 12919 /* Skip mod/rm byte. */
4bba6815 12920 MODRM_CHECK;
252b5132 12921 codep++;
041bd2e0 12922 used_prefixes |= (prefixes & PREFIX_DATA);
b9733481 12923 reg = modrm.rm;
041bd2e0 12924 if (prefixes & PREFIX_DATA)
20f0a1fc 12925 {
b9733481 12926 names = names_xmm;
161a04f6
L
12927 USED_REX (REX_B);
12928 if (rex & REX_B)
b9733481 12929 reg += 8;
20f0a1fc 12930 }
041bd2e0 12931 else
b9733481
L
12932 names = names_mm;
12933 oappend (names[reg]);
252b5132
RH
12934}
12935
246c51aa
L
12936/* cvt* are the only instructions in sse2 which have
12937 both SSE and MMX operands and also have 0x66 prefix
12938 in their opcode. 0x66 was originally used to differentiate
12939 between SSE and MMX instruction(operands). So we have to handle the
4d9567e0
MM
12940 cvt* separately using OP_EMC and OP_MXC */
12941static void
12942OP_EMC (int bytemode, int sizeflag)
12943{
7967e09e 12944 if (modrm.mod != 3)
4d9567e0
MM
12945 {
12946 if (intel_syntax && bytemode == v_mode)
12947 {
12948 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
12949 used_prefixes |= (prefixes & PREFIX_DATA);
6c067bbb 12950 }
4d9567e0
MM
12951 OP_E (bytemode, sizeflag);
12952 return;
12953 }
246c51aa 12954
4d9567e0
MM
12955 /* Skip mod/rm byte. */
12956 MODRM_CHECK;
12957 codep++;
12958 used_prefixes |= (prefixes & PREFIX_DATA);
b9733481 12959 oappend (names_mm[modrm.rm]);
4d9567e0
MM
12960}
12961
12962static void
12963OP_MXC (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12964{
12965 used_prefixes |= (prefixes & PREFIX_DATA);
b9733481 12966 oappend (names_mm[modrm.reg]);
4d9567e0
MM
12967}
12968
c608c12e 12969static void
26ca5450 12970OP_EX (int bytemode, int sizeflag)
c608c12e 12971{
b9733481
L
12972 int reg;
12973 const char **names;
d6f574e0
L
12974
12975 /* Skip mod/rm byte. */
12976 MODRM_CHECK;
12977 codep++;
12978
7967e09e 12979 if (modrm.mod != 3)
c608c12e 12980 {
c1e679ec 12981 OP_E_memory (bytemode, sizeflag);
c608c12e
AM
12982 return;
12983 }
d6f574e0 12984
b9733481 12985 reg = modrm.rm;
161a04f6
L
12986 USED_REX (REX_B);
12987 if (rex & REX_B)
b9733481 12988 reg += 8;
43234a1e
L
12989 if (vex.evex)
12990 {
12991 USED_REX (REX_X);
12992 if ((rex & REX_X))
12993 reg += 16;
12994 }
c608c12e 12995
b6169b20 12996 if ((sizeflag & SUFFIX_ALWAYS)
fa99fab2
L
12997 && (bytemode == x_swap_mode
12998 || bytemode == d_swap_mode
41f5efc6 12999 || bytemode == q_swap_mode))
b6169b20
L
13000 swap_operand ();
13001
c0f3af97
L
13002 if (need_vex
13003 && bytemode != xmm_mode
6c30d220
L
13004 && bytemode != xmmdw_mode
13005 && bytemode != xmmqd_mode
13006 && bytemode != xmm_mb_mode
13007 && bytemode != xmm_mw_mode
13008 && bytemode != xmm_md_mode
13009 && bytemode != xmm_mq_mode
539f890d 13010 && bytemode != xmmq_mode
43234a1e
L
13011 && bytemode != evex_half_bcst_xmmq_mode
13012 && bytemode != ymm_mode
260cd341 13013 && bytemode != tmm_mode
1c480963 13014 && bytemode != vex_scalar_w_dq_mode)
c0f3af97
L
13015 {
13016 switch (vex.length)
13017 {
13018 case 128:
b9733481 13019 names = names_xmm;
c0f3af97
L
13020 break;
13021 case 256:
b9733481 13022 names = names_ymm;
c0f3af97 13023 break;
43234a1e
L
13024 case 512:
13025 names = names_zmm;
13026 break;
c0f3af97
L
13027 default:
13028 abort ();
13029 }
13030 }
43234a1e
L
13031 else if (bytemode == xmmq_mode
13032 || bytemode == evex_half_bcst_xmmq_mode)
13033 {
13034 switch (vex.length)
13035 {
13036 case 128:
13037 case 256:
13038 names = names_xmm;
13039 break;
13040 case 512:
13041 names = names_ymm;
13042 break;
13043 default:
13044 abort ();
13045 }
13046 }
260cd341
LC
13047 else if (bytemode == tmm_mode)
13048 {
13049 modrm.rm = reg;
13050 if (reg >= 8)
13051 {
13052 oappend ("(bad)");
13053 return;
13054 }
13055 names = names_tmm;
13056 }
43234a1e
L
13057 else if (bytemode == ymm_mode)
13058 names = names_ymm;
c0f3af97 13059 else
b9733481
L
13060 names = names_xmm;
13061 oappend (names[reg]);
c608c12e
AM
13062}
13063
252b5132 13064static void
26ca5450 13065OP_MS (int bytemode, int sizeflag)
252b5132 13066{
7967e09e 13067 if (modrm.mod == 3)
2da11e11
AM
13068 OP_EM (bytemode, sizeflag);
13069 else
6608db57 13070 BadOp ();
252b5132
RH
13071}
13072
992aaec9 13073static void
26ca5450 13074OP_XS (int bytemode, int sizeflag)
992aaec9 13075{
7967e09e 13076 if (modrm.mod == 3)
992aaec9
AM
13077 OP_EX (bytemode, sizeflag);
13078 else
6608db57 13079 BadOp ();
992aaec9
AM
13080}
13081
cc0ec051
AM
13082static void
13083OP_M (int bytemode, int sizeflag)
13084{
7967e09e 13085 if (modrm.mod == 3)
75413a22
L
13086 /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
13087 BadOp ();
cc0ec051
AM
13088 else
13089 OP_E (bytemode, sizeflag);
13090}
13091
13092static void
13093OP_0f07 (int bytemode, int sizeflag)
13094{
7967e09e 13095 if (modrm.mod != 3 || modrm.rm != 0)
cc0ec051
AM
13096 BadOp ();
13097 else
13098 OP_E (bytemode, sizeflag);
13099}
13100
46e883c5 13101/* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
246c51aa 13102 32bit mode and "xchg %rax,%rax" in 64bit mode. */
46e883c5 13103
cc0ec051 13104static void
46e883c5 13105NOP_Fixup1 (int bytemode, int sizeflag)
cc0ec051 13106{
8b38ad71
L
13107 if ((prefixes & PREFIX_DATA) != 0
13108 || (rex != 0
13109 && rex != 0x48
13110 && address_mode == mode_64bit))
46e883c5
L
13111 OP_REG (bytemode, sizeflag);
13112 else
13113 strcpy (obuf, "nop");
13114}
13115
13116static void
13117NOP_Fixup2 (int bytemode, int sizeflag)
13118{
8b38ad71
L
13119 if ((prefixes & PREFIX_DATA) != 0
13120 || (rex != 0
13121 && rex != 0x48
13122 && address_mode == mode_64bit))
46e883c5 13123 OP_IMREG (bytemode, sizeflag);
cc0ec051
AM
13124}
13125
84037f8c 13126static const char *const Suffix3DNow[] = {
252b5132
RH
13127/* 00 */ NULL, NULL, NULL, NULL,
13128/* 04 */ NULL, NULL, NULL, NULL,
13129/* 08 */ NULL, NULL, NULL, NULL,
9e525108 13130/* 0C */ "pi2fw", "pi2fd", NULL, NULL,
252b5132
RH
13131/* 10 */ NULL, NULL, NULL, NULL,
13132/* 14 */ NULL, NULL, NULL, NULL,
13133/* 18 */ NULL, NULL, NULL, NULL,
9e525108 13134/* 1C */ "pf2iw", "pf2id", NULL, NULL,
252b5132
RH
13135/* 20 */ NULL, NULL, NULL, NULL,
13136/* 24 */ NULL, NULL, NULL, NULL,
13137/* 28 */ NULL, NULL, NULL, NULL,
13138/* 2C */ NULL, NULL, NULL, NULL,
13139/* 30 */ NULL, NULL, NULL, NULL,
13140/* 34 */ NULL, NULL, NULL, NULL,
13141/* 38 */ NULL, NULL, NULL, NULL,
13142/* 3C */ NULL, NULL, NULL, NULL,
13143/* 40 */ NULL, NULL, NULL, NULL,
13144/* 44 */ NULL, NULL, NULL, NULL,
13145/* 48 */ NULL, NULL, NULL, NULL,
13146/* 4C */ NULL, NULL, NULL, NULL,
13147/* 50 */ NULL, NULL, NULL, NULL,
13148/* 54 */ NULL, NULL, NULL, NULL,
13149/* 58 */ NULL, NULL, NULL, NULL,
13150/* 5C */ NULL, NULL, NULL, NULL,
13151/* 60 */ NULL, NULL, NULL, NULL,
13152/* 64 */ NULL, NULL, NULL, NULL,
13153/* 68 */ NULL, NULL, NULL, NULL,
13154/* 6C */ NULL, NULL, NULL, NULL,
13155/* 70 */ NULL, NULL, NULL, NULL,
13156/* 74 */ NULL, NULL, NULL, NULL,
13157/* 78 */ NULL, NULL, NULL, NULL,
13158/* 7C */ NULL, NULL, NULL, NULL,
13159/* 80 */ NULL, NULL, NULL, NULL,
13160/* 84 */ NULL, NULL, NULL, NULL,
9e525108
AM
13161/* 88 */ NULL, NULL, "pfnacc", NULL,
13162/* 8C */ NULL, NULL, "pfpnacc", NULL,
252b5132
RH
13163/* 90 */ "pfcmpge", NULL, NULL, NULL,
13164/* 94 */ "pfmin", NULL, "pfrcp", "pfrsqrt",
13165/* 98 */ NULL, NULL, "pfsub", NULL,
13166/* 9C */ NULL, NULL, "pfadd", NULL,
13167/* A0 */ "pfcmpgt", NULL, NULL, NULL,
13168/* A4 */ "pfmax", NULL, "pfrcpit1", "pfrsqit1",
13169/* A8 */ NULL, NULL, "pfsubr", NULL,
13170/* AC */ NULL, NULL, "pfacc", NULL,
13171/* B0 */ "pfcmpeq", NULL, NULL, NULL,
9beff690 13172/* B4 */ "pfmul", NULL, "pfrcpit2", "pmulhrw",
9e525108 13173/* B8 */ NULL, NULL, NULL, "pswapd",
252b5132
RH
13174/* BC */ NULL, NULL, NULL, "pavgusb",
13175/* C0 */ NULL, NULL, NULL, NULL,
13176/* C4 */ NULL, NULL, NULL, NULL,
13177/* C8 */ NULL, NULL, NULL, NULL,
13178/* CC */ NULL, NULL, NULL, NULL,
13179/* D0 */ NULL, NULL, NULL, NULL,
13180/* D4 */ NULL, NULL, NULL, NULL,
13181/* D8 */ NULL, NULL, NULL, NULL,
13182/* DC */ NULL, NULL, NULL, NULL,
13183/* E0 */ NULL, NULL, NULL, NULL,
13184/* E4 */ NULL, NULL, NULL, NULL,
13185/* E8 */ NULL, NULL, NULL, NULL,
13186/* EC */ NULL, NULL, NULL, NULL,
13187/* F0 */ NULL, NULL, NULL, NULL,
13188/* F4 */ NULL, NULL, NULL, NULL,
13189/* F8 */ NULL, NULL, NULL, NULL,
13190/* FC */ NULL, NULL, NULL, NULL,
13191};
13192
13193static void
26ca5450 13194OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132
RH
13195{
13196 const char *mnemonic;
13197
13198 FETCH_DATA (the_info, codep + 1);
13199 /* AMD 3DNow! instructions are specified by an opcode suffix in the
13200 place where an 8-bit immediate would normally go. ie. the last
13201 byte of the instruction. */
ea397f5b 13202 obufp = mnemonicendp;
c608c12e 13203 mnemonic = Suffix3DNow[*codep++ & 0xff];
252b5132 13204 if (mnemonic)
2da11e11 13205 oappend (mnemonic);
252b5132
RH
13206 else
13207 {
13208 /* Since a variable sized modrm/sib chunk is between the start
13209 of the opcode (0x0f0f) and the opcode suffix, we need to do
13210 all the modrm processing first, and don't know until now that
13211 we have a bad opcode. This necessitates some cleaning up. */
ce518a5f
L
13212 op_out[0][0] = '\0';
13213 op_out[1][0] = '\0';
6608db57 13214 BadOp ();
252b5132 13215 }
ea397f5b 13216 mnemonicendp = obufp;
252b5132 13217}
c608c12e 13218
c4de7606 13219static const struct op simd_cmp_op[] =
ea397f5b
L
13220{
13221 { STRING_COMMA_LEN ("eq") },
13222 { STRING_COMMA_LEN ("lt") },
13223 { STRING_COMMA_LEN ("le") },
13224 { STRING_COMMA_LEN ("unord") },
13225 { STRING_COMMA_LEN ("neq") },
13226 { STRING_COMMA_LEN ("nlt") },
13227 { STRING_COMMA_LEN ("nle") },
13228 { STRING_COMMA_LEN ("ord") }
c608c12e
AM
13229};
13230
c4de7606
JB
13231static const struct op vex_cmp_op[] =
13232{
13233 { STRING_COMMA_LEN ("eq_uq") },
13234 { STRING_COMMA_LEN ("nge") },
13235 { STRING_COMMA_LEN ("ngt") },
13236 { STRING_COMMA_LEN ("false") },
13237 { STRING_COMMA_LEN ("neq_oq") },
13238 { STRING_COMMA_LEN ("ge") },
13239 { STRING_COMMA_LEN ("gt") },
13240 { STRING_COMMA_LEN ("true") },
13241 { STRING_COMMA_LEN ("eq_os") },
13242 { STRING_COMMA_LEN ("lt_oq") },
13243 { STRING_COMMA_LEN ("le_oq") },
13244 { STRING_COMMA_LEN ("unord_s") },
13245 { STRING_COMMA_LEN ("neq_us") },
13246 { STRING_COMMA_LEN ("nlt_uq") },
13247 { STRING_COMMA_LEN ("nle_uq") },
13248 { STRING_COMMA_LEN ("ord_s") },
13249 { STRING_COMMA_LEN ("eq_us") },
13250 { STRING_COMMA_LEN ("nge_uq") },
13251 { STRING_COMMA_LEN ("ngt_uq") },
13252 { STRING_COMMA_LEN ("false_os") },
13253 { STRING_COMMA_LEN ("neq_os") },
13254 { STRING_COMMA_LEN ("ge_oq") },
13255 { STRING_COMMA_LEN ("gt_oq") },
13256 { STRING_COMMA_LEN ("true_us") },
13257};
13258
c608c12e 13259static void
ad19981d 13260CMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
c608c12e
AM
13261{
13262 unsigned int cmp_type;
13263
13264 FETCH_DATA (the_info, codep + 1);
13265 cmp_type = *codep++ & 0xff;
c0f3af97 13266 if (cmp_type < ARRAY_SIZE (simd_cmp_op))
c608c12e 13267 {
ad19981d 13268 char suffix [3];
ea397f5b 13269 char *p = mnemonicendp - 2;
ad19981d
L
13270 suffix[0] = p[0];
13271 suffix[1] = p[1];
13272 suffix[2] = '\0';
ea397f5b
L
13273 sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
13274 mnemonicendp += simd_cmp_op[cmp_type].len;
c608c12e 13275 }
c4de7606
JB
13276 else if (need_vex
13277 && cmp_type < ARRAY_SIZE (simd_cmp_op) + ARRAY_SIZE (vex_cmp_op))
13278 {
13279 char suffix [3];
13280 char *p = mnemonicendp - 2;
13281 suffix[0] = p[0];
13282 suffix[1] = p[1];
13283 suffix[2] = '\0';
13284 cmp_type -= ARRAY_SIZE (simd_cmp_op);
13285 sprintf (p, "%s%s", vex_cmp_op[cmp_type].name, suffix);
13286 mnemonicendp += vex_cmp_op[cmp_type].len;
13287 }
c608c12e
AM
13288 else
13289 {
ad19981d
L
13290 /* We have a reserved extension byte. Output it directly. */
13291 scratchbuf[0] = '$';
13292 print_operand_value (scratchbuf + 1, 1, cmp_type);
9ce09ba2 13293 oappend_maybe_intel (scratchbuf);
ad19981d 13294 scratchbuf[0] = '\0';
c608c12e
AM
13295 }
13296}
13297
9916071f 13298static void
7abb8d81 13299OP_Mwait (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
9916071f 13300{
7abb8d81 13301 /* mwait %eax,%ecx / mwaitx %eax,%ecx,%ebx */
b844680a
L
13302 if (!intel_syntax)
13303 {
081e283f
JB
13304 strcpy (op_out[0], names32[0]);
13305 strcpy (op_out[1], names32[1]);
7abb8d81 13306 if (bytemode == eBX_reg)
081e283f 13307 strcpy (op_out[2], names32[3]);
b844680a
L
13308 two_source_ops = 1;
13309 }
13310 /* Skip mod/rm byte. */
13311 MODRM_CHECK;
13312 codep++;
13313}
13314
13315static void
13316OP_Monitor (int bytemode ATTRIBUTE_UNUSED,
13317 int sizeflag ATTRIBUTE_UNUSED)
ca164297 13318{
081e283f 13319 /* monitor %{e,r,}ax,%ecx,%edx" */
b844680a 13320 if (!intel_syntax)
ca164297 13321 {
cb712a9e
L
13322 const char **names = (address_mode == mode_64bit
13323 ? names64 : names32);
1d9f512f 13324
081e283f 13325 if (prefixes & PREFIX_ADDR)
ca164297 13326 {
b844680a 13327 /* Remove "addr16/addr32". */
f16cd0d5 13328 all_prefixes[last_addr_prefix] = 0;
081e283f
JB
13329 names = (address_mode != mode_32bit
13330 ? names32 : names16);
b844680a 13331 used_prefixes |= PREFIX_ADDR;
ca164297 13332 }
081e283f
JB
13333 else if (address_mode == mode_16bit)
13334 names = names16;
13335 strcpy (op_out[0], names[0]);
13336 strcpy (op_out[1], names32[1]);
13337 strcpy (op_out[2], names32[2]);
b844680a 13338 two_source_ops = 1;
ca164297 13339 }
b844680a
L
13340 /* Skip mod/rm byte. */
13341 MODRM_CHECK;
13342 codep++;
30123838
JB
13343}
13344
6608db57
KH
13345static void
13346BadOp (void)
2da11e11 13347{
6608db57
KH
13348 /* Throw away prefixes and 1st. opcode byte. */
13349 codep = insn_codep + 1;
2da11e11
AM
13350 oappend ("(bad)");
13351}
4cc91dba 13352
35c52694
L
13353static void
13354REP_Fixup (int bytemode, int sizeflag)
13355{
13356 /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
13357 lods and stos. */
35c52694 13358 if (prefixes & PREFIX_REPZ)
f16cd0d5 13359 all_prefixes[last_repz_prefix] = REP_PREFIX;
35c52694
L
13360
13361 switch (bytemode)
13362 {
13363 case al_reg:
13364 case eAX_reg:
13365 case indir_dx_reg:
13366 OP_IMREG (bytemode, sizeflag);
13367 break;
13368 case eDI_reg:
13369 OP_ESreg (bytemode, sizeflag);
13370 break;
13371 case eSI_reg:
13372 OP_DSreg (bytemode, sizeflag);
13373 break;
13374 default:
13375 abort ();
13376 break;
13377 }
13378}
f5804c90 13379
d835a58b
JB
13380static void
13381SEP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13382{
13383 if ( isa64 != amd64 )
13384 return;
13385
13386 obufp = obuf;
13387 BadOp ();
13388 mnemonicendp = obufp;
13389 ++codep;
13390}
13391
7e8b059b
L
13392/* For BND-prefixed instructions 0xF2 prefix should be displayed as
13393 "bnd". */
13394
13395static void
13396BND_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13397{
13398 if (prefixes & PREFIX_REPNZ)
13399 all_prefixes[last_repnz_prefix] = BND_PREFIX;
13400}
13401
04ef582a
L
13402/* For NOTRACK-prefixed instructions, 0x3E prefix should be displayed as
13403 "notrack". */
13404
13405static void
13406NOTRACK_Fixup (int bytemode ATTRIBUTE_UNUSED,
13407 int sizeflag ATTRIBUTE_UNUSED)
13408{
9fef80d6 13409 if (active_seg_prefix == PREFIX_DS
04ef582a
L
13410 && (address_mode != mode_64bit || last_data_prefix < 0))
13411 {
4e9ac44a 13412 /* NOTRACK prefix is only valid on indirect branch instructions.
9fef80d6 13413 NB: DATA prefix is unsupported for Intel64. */
04ef582a
L
13414 active_seg_prefix = 0;
13415 all_prefixes[last_seg_prefix] = NOTRACK_PREFIX;
13416 }
13417}
13418
42164a71
L
13419/* Similar to OP_E. But the 0xf2/0xf3 prefixes should be displayed as
13420 "xacquire"/"xrelease" for memory operand if there is a LOCK prefix.
13421 */
13422
13423static void
13424HLE_Fixup1 (int bytemode, int sizeflag)
13425{
13426 if (modrm.mod != 3
13427 && (prefixes & PREFIX_LOCK) != 0)
13428 {
13429 if (prefixes & PREFIX_REPZ)
13430 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
13431 if (prefixes & PREFIX_REPNZ)
13432 all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
13433 }
13434
13435 OP_E (bytemode, sizeflag);
13436}
13437
13438/* Similar to OP_E. But the 0xf2/0xf3 prefixes should be displayed as
13439 "xacquire"/"xrelease" for memory operand. No check for LOCK prefix.
13440 */
13441
13442static void
13443HLE_Fixup2 (int bytemode, int sizeflag)
13444{
13445 if (modrm.mod != 3)
13446 {
13447 if (prefixes & PREFIX_REPZ)
13448 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
13449 if (prefixes & PREFIX_REPNZ)
13450 all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
13451 }
13452
13453 OP_E (bytemode, sizeflag);
13454}
13455
13456/* Similar to OP_E. But the 0xf3 prefixes should be displayed as
13457 "xrelease" for memory operand. No check for LOCK prefix. */
13458
13459static void
13460HLE_Fixup3 (int bytemode, int sizeflag)
13461{
13462 if (modrm.mod != 3
13463 && last_repz_prefix > last_repnz_prefix
13464 && (prefixes & PREFIX_REPZ) != 0)
13465 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
13466
13467 OP_E (bytemode, sizeflag);
13468}
13469
f5804c90
L
13470static void
13471CMPXCHG8B_Fixup (int bytemode, int sizeflag)
13472{
161a04f6
L
13473 USED_REX (REX_W);
13474 if (rex & REX_W)
f5804c90
L
13475 {
13476 /* Change cmpxchg8b to cmpxchg16b. */
ea397f5b
L
13477 char *p = mnemonicendp - 2;
13478 mnemonicendp = stpcpy (p, "16b");
fb9c77c7 13479 bytemode = o_mode;
f5804c90 13480 }
42164a71
L
13481 else if ((prefixes & PREFIX_LOCK) != 0)
13482 {
13483 if (prefixes & PREFIX_REPZ)
13484 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
13485 if (prefixes & PREFIX_REPNZ)
13486 all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
13487 }
13488
f5804c90
L
13489 OP_M (bytemode, sizeflag);
13490}
42903f7f
L
13491
13492static void
13493XMM_Fixup (int reg, int sizeflag ATTRIBUTE_UNUSED)
13494{
b9733481
L
13495 const char **names;
13496
c0f3af97
L
13497 if (need_vex)
13498 {
13499 switch (vex.length)
13500 {
13501 case 128:
b9733481 13502 names = names_xmm;
c0f3af97
L
13503 break;
13504 case 256:
b9733481 13505 names = names_ymm;
c0f3af97
L
13506 break;
13507 default:
13508 abort ();
13509 }
13510 }
13511 else
b9733481
L
13512 names = names_xmm;
13513 oappend (names[reg]);
42903f7f 13514}
381d071f
L
13515
13516static void
eacc9c89
L
13517FXSAVE_Fixup (int bytemode, int sizeflag)
13518{
13519 /* Add proper suffix to "fxsave" and "fxrstor". */
13520 USED_REX (REX_W);
13521 if (rex & REX_W)
13522 {
13523 char *p = mnemonicendp;
13524 *p++ = '6';
13525 *p++ = '4';
13526 *p = '\0';
13527 mnemonicendp = p;
13528 }
13529 OP_M (bytemode, sizeflag);
15c7c1d8
JB
13530}
13531
c0f3af97
L
13532/* Display the destination register operand for instructions with
13533 VEX. */
13534
13535static void
13536OP_VEX (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13537{
539f890d 13538 int reg;
b9733481
L
13539 const char **names;
13540
c0f3af97
L
13541 if (!need_vex)
13542 abort ();
13543
539f890d 13544 reg = vex.register_specifier;
63c6fc6c 13545 vex.register_specifier = 0;
5f847646
JB
13546 if (address_mode != mode_64bit)
13547 reg &= 7;
13548 else if (vex.evex && !vex.v)
13549 reg += 16;
43234a1e 13550
539f890d
L
13551 if (bytemode == vex_scalar_mode)
13552 {
13553 oappend (names_xmm[reg]);
13554 return;
13555 }
13556
260cd341
LC
13557 if (bytemode == tmm_mode)
13558 {
13559 /* All 3 TMM registers must be distinct. */
13560 if (reg >= 8)
13561 oappend ("(bad)");
13562 else
13563 {
13564 /* This must be the 3rd operand. */
13565 if (obufp != op_out[2])
13566 abort ();
13567 oappend (names_tmm[reg]);
13568 if (reg == modrm.reg || reg == modrm.rm)
13569 strcpy (obufp, "/(bad)");
13570 }
13571
13572 if (modrm.reg == modrm.rm || modrm.reg == reg || modrm.rm == reg)
13573 {
13574 if (modrm.reg <= 8
13575 && (modrm.reg == modrm.rm || modrm.reg == reg))
13576 strcat (op_out[0], "/(bad)");
13577 if (modrm.rm <= 8
13578 && (modrm.rm == modrm.reg || modrm.rm == reg))
13579 strcat (op_out[1], "/(bad)");
13580 }
13581
13582 return;
13583 }
13584
c0f3af97
L
13585 switch (vex.length)
13586 {
13587 case 128:
13588 switch (bytemode)
13589 {
13590 case vex_mode:
6c30d220 13591 case vex_vsib_q_w_dq_mode:
5fc35d96 13592 case vex_vsib_q_w_d_mode:
cb21baef
L
13593 names = names_xmm;
13594 break;
13595 case dq_mode:
390a6789 13596 if (rex & REX_W)
cb21baef
L
13597 names = names64;
13598 else
13599 names = names32;
c0f3af97 13600 break;
1ba585e8 13601 case mask_bd_mode:
43234a1e 13602 case mask_mode:
9889cbb1
L
13603 if (reg > 0x7)
13604 {
13605 oappend ("(bad)");
13606 return;
13607 }
43234a1e
L
13608 names = names_mask;
13609 break;
c0f3af97
L
13610 default:
13611 abort ();
13612 return;
13613 }
c0f3af97
L
13614 break;
13615 case 256:
13616 switch (bytemode)
13617 {
13618 case vex_mode:
6c30d220
L
13619 names = names_ymm;
13620 break;
13621 case vex_vsib_q_w_dq_mode:
5fc35d96 13622 case vex_vsib_q_w_d_mode:
6c30d220 13623 names = vex.w ? names_ymm : names_xmm;
c0f3af97 13624 break;
1ba585e8 13625 case mask_bd_mode:
43234a1e 13626 case mask_mode:
9889cbb1
L
13627 if (reg > 0x7)
13628 {
13629 oappend ("(bad)");
13630 return;
13631 }
43234a1e
L
13632 names = names_mask;
13633 break;
c0f3af97 13634 default:
a37a2806
NC
13635 /* See PR binutils/20893 for a reproducer. */
13636 oappend ("(bad)");
c0f3af97
L
13637 return;
13638 }
c0f3af97 13639 break;
43234a1e
L
13640 case 512:
13641 names = names_zmm;
13642 break;
c0f3af97
L
13643 default:
13644 abort ();
13645 break;
13646 }
539f890d 13647 oappend (names[reg]);
c0f3af97
L
13648}
13649
41f5efc6
JB
13650static void
13651OP_VexR (int bytemode, int sizeflag)
13652{
13653 if (modrm.mod == 3)
13654 OP_VEX (bytemode, sizeflag);
13655}
13656
5dd85c99 13657static void
e6123d0c 13658OP_VexW (int bytemode, int sizeflag)
5dd85c99 13659{
e6123d0c 13660 OP_VEX (bytemode, sizeflag);
5dd85c99 13661
5dd85c99 13662 if (vex.w)
5f847646 13663 {
e6123d0c
JB
13664 /* Swap 2nd and 3rd operands. */
13665 strcpy (scratchbuf, op_out[2]);
13666 strcpy (op_out[2], op_out[1]);
13667 strcpy (op_out[1], scratchbuf);
5f847646 13668 }
5dd85c99
SP
13669}
13670
c0f3af97
L
13671static void
13672OP_REG_VexI4 (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13673{
13674 int reg;
6384fd9e 13675 const char **names = names_xmm;
b9733481 13676
c0f3af97
L
13677 FETCH_DATA (the_info, codep + 1);
13678 reg = *codep++;
13679
6384fd9e 13680 if (bytemode != x_mode && bytemode != scalar_mode)
c0f3af97
L
13681 abort ();
13682
c0f3af97 13683 reg >>= 4;
5f847646
JB
13684 if (address_mode != mode_64bit)
13685 reg &= 7;
dae39acc 13686
6384fd9e
JB
13687 if (bytemode == x_mode && vex.length == 256)
13688 names = names_ymm;
13689
b9733481 13690 oappend (names[reg]);
b13b1bc0
JB
13691
13692 if (vex.w)
13693 {
13694 /* Swap 3rd and 4th operands. */
13695 strcpy (scratchbuf, op_out[3]);
13696 strcpy (op_out[3], op_out[2]);
13697 strcpy (op_out[2], scratchbuf);
13698 }
c0f3af97
L
13699}
13700
922d8de8 13701static void
93abb146
JB
13702OP_VexI4 (int bytemode ATTRIBUTE_UNUSED,
13703 int sizeflag ATTRIBUTE_UNUSED)
922d8de8 13704{
93abb146
JB
13705 scratchbuf[0] = '$';
13706 print_operand_value (scratchbuf + 1, 1, codep[-1] & 0xf);
13707 oappend_maybe_intel (scratchbuf);
922d8de8
DR
13708}
13709
43234a1e
L
13710static void
13711VPCMP_Fixup (int bytemode ATTRIBUTE_UNUSED,
13712 int sizeflag ATTRIBUTE_UNUSED)
13713{
13714 unsigned int cmp_type;
13715
13716 if (!vex.evex)
13717 abort ();
13718
13719 FETCH_DATA (the_info, codep + 1);
13720 cmp_type = *codep++ & 0xff;
13721 /* There are aliases for immediates 0, 1, 2, 4, 5, 6.
13722 If it's the case, print suffix, otherwise - print the immediate. */
13723 if (cmp_type < ARRAY_SIZE (simd_cmp_op)
13724 && cmp_type != 3
13725 && cmp_type != 7)
13726 {
13727 char suffix [3];
13728 char *p = mnemonicendp - 2;
13729
13730 /* vpcmp* can have both one- and two-lettered suffix. */
13731 if (p[0] == 'p')
13732 {
13733 p++;
13734 suffix[0] = p[0];
13735 suffix[1] = '\0';
13736 }
13737 else
13738 {
13739 suffix[0] = p[0];
13740 suffix[1] = p[1];
13741 suffix[2] = '\0';
13742 }
13743
13744 sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
13745 mnemonicendp += simd_cmp_op[cmp_type].len;
13746 }
be92cb14
JB
13747 else
13748 {
13749 /* We have a reserved extension byte. Output it directly. */
13750 scratchbuf[0] = '$';
13751 print_operand_value (scratchbuf + 1, 1, cmp_type);
13752 oappend_maybe_intel (scratchbuf);
13753 scratchbuf[0] = '\0';
13754 }
13755}
13756
13757static const struct op xop_cmp_op[] =
13758{
13759 { STRING_COMMA_LEN ("lt") },
13760 { STRING_COMMA_LEN ("le") },
13761 { STRING_COMMA_LEN ("gt") },
13762 { STRING_COMMA_LEN ("ge") },
13763 { STRING_COMMA_LEN ("eq") },
13764 { STRING_COMMA_LEN ("neq") },
13765 { STRING_COMMA_LEN ("false") },
13766 { STRING_COMMA_LEN ("true") }
13767};
13768
13769static void
13770VPCOM_Fixup (int bytemode ATTRIBUTE_UNUSED,
13771 int sizeflag ATTRIBUTE_UNUSED)
13772{
13773 unsigned int cmp_type;
13774
13775 FETCH_DATA (the_info, codep + 1);
13776 cmp_type = *codep++ & 0xff;
13777 if (cmp_type < ARRAY_SIZE (xop_cmp_op))
13778 {
13779 char suffix[3];
13780 char *p = mnemonicendp - 2;
13781
13782 /* vpcom* can have both one- and two-lettered suffix. */
13783 if (p[0] == 'm')
13784 {
13785 p++;
13786 suffix[0] = p[0];
13787 suffix[1] = '\0';
13788 }
13789 else
13790 {
13791 suffix[0] = p[0];
13792 suffix[1] = p[1];
13793 suffix[2] = '\0';
13794 }
13795
13796 sprintf (p, "%s%s", xop_cmp_op[cmp_type].name, suffix);
13797 mnemonicendp += xop_cmp_op[cmp_type].len;
13798 }
43234a1e
L
13799 else
13800 {
13801 /* We have a reserved extension byte. Output it directly. */
13802 scratchbuf[0] = '$';
13803 print_operand_value (scratchbuf + 1, 1, cmp_type);
9ce09ba2 13804 oappend_maybe_intel (scratchbuf);
43234a1e
L
13805 scratchbuf[0] = '\0';
13806 }
13807}
13808
ea397f5b
L
13809static const struct op pclmul_op[] =
13810{
13811 { STRING_COMMA_LEN ("lql") },
13812 { STRING_COMMA_LEN ("hql") },
13813 { STRING_COMMA_LEN ("lqh") },
13814 { STRING_COMMA_LEN ("hqh") }
c0f3af97
L
13815};
13816
13817static void
13818PCLMUL_Fixup (int bytemode ATTRIBUTE_UNUSED,
13819 int sizeflag ATTRIBUTE_UNUSED)
13820{
13821 unsigned int pclmul_type;
13822
13823 FETCH_DATA (the_info, codep + 1);
13824 pclmul_type = *codep++ & 0xff;
13825 switch (pclmul_type)
13826 {
13827 case 0x10:
13828 pclmul_type = 2;
13829 break;
13830 case 0x11:
13831 pclmul_type = 3;
13832 break;
13833 default:
13834 break;
7bb15c6f 13835 }
c0f3af97
L
13836 if (pclmul_type < ARRAY_SIZE (pclmul_op))
13837 {
13838 char suffix [4];
ea397f5b 13839 char *p = mnemonicendp - 3;
c0f3af97
L
13840 suffix[0] = p[0];
13841 suffix[1] = p[1];
13842 suffix[2] = p[2];
13843 suffix[3] = '\0';
ea397f5b
L
13844 sprintf (p, "%s%s", pclmul_op[pclmul_type].name, suffix);
13845 mnemonicendp += pclmul_op[pclmul_type].len;
c0f3af97
L
13846 }
13847 else
13848 {
13849 /* We have a reserved extension byte. Output it directly. */
13850 scratchbuf[0] = '$';
13851 print_operand_value (scratchbuf + 1, 1, pclmul_type);
9ce09ba2 13852 oappend_maybe_intel (scratchbuf);
c0f3af97
L
13853 scratchbuf[0] = '\0';
13854 }
13855}
13856
bc31405e
L
13857static void
13858MOVSXD_Fixup (int bytemode, int sizeflag)
13859{
13860 /* Add proper suffix to "movsxd". */
13861 char *p = mnemonicendp;
13862
13863 switch (bytemode)
13864 {
13865 case movsxd_mode:
13866 if (intel_syntax)
13867 {
13868 *p++ = 'x';
13869 *p++ = 'd';
13870 goto skip;
13871 }
13872
13873 USED_REX (REX_W);
13874 if (rex & REX_W)
13875 {
13876 *p++ = 'l';
13877 *p++ = 'q';
13878 }
13879 else
13880 {
13881 *p++ = 'x';
13882 *p++ = 'd';
13883 }
13884 break;
13885 default:
13886 oappend (INTERNAL_DISASSEMBLER_ERROR);
13887 break;
13888 }
13889
dc1e8a47 13890 skip:
bc31405e
L
13891 mnemonicendp = p;
13892 *p = '\0';
13893 OP_E (bytemode, sizeflag);
13894}
13895
43234a1e
L
13896static void
13897OP_Mask (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13898{
13899 if (!vex.evex
1ba585e8 13900 || (bytemode != mask_mode && bytemode != mask_bd_mode))
43234a1e
L
13901 abort ();
13902
13903 USED_REX (REX_R);
13904 if ((rex & REX_R) != 0 || !vex.r)
13905 {
13906 BadOp ();
13907 return;
13908 }
13909
13910 oappend (names_mask [modrm.reg]);
13911}
13912
13913static void
13914OP_Rounding (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13915{
43234a1e
L
13916 if (modrm.mod == 3 && vex.b)
13917 switch (bytemode)
13918 {
70df6fc9
L
13919 case evex_rounding_64_mode:
13920 if (address_mode != mode_64bit)
13921 {
13922 oappend ("(bad)");
13923 break;
13924 }
13925 /* Fall through. */
43234a1e
L
13926 case evex_rounding_mode:
13927 oappend (names_rounding[vex.ll]);
13928 break;
13929 case evex_sae_mode:
13930 oappend ("{sae}");
13931 break;
13932 default:
6df22cf6 13933 abort ();
43234a1e
L
13934 break;
13935 }
13936}
This page took 2.83274 seconds and 4 git commands to generate.