Enable support to Intel Keylocker instructions
[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,
c4694f17 694 REG_0F38D8_PREFIX_1,
3873ba12
L
695 REG_0F71,
696 REG_0F72,
697 REG_0F73,
698 REG_0FA6,
699 REG_0FA7,
700 REG_0FAE,
701 REG_0FBA,
702 REG_0FC7,
592a252b
L
703 REG_VEX_0F71,
704 REG_VEX_0F72,
705 REG_VEX_0F73,
706 REG_VEX_0FAE,
260cd341 707 REG_VEX_0F3849_X86_64_P_0_W_0_M_1,
f12dc422 708 REG_VEX_0F38F3,
467bbef0
JB
709
710 REG_0FXOP_09_01_L_0,
711 REG_0FXOP_09_02_L_0,
712 REG_0FXOP_09_12_M_1_L_0,
713 REG_0FXOP_0A_12_L_0,
43234a1e 714
1ba585e8 715 REG_EVEX_0F71,
43234a1e
L
716 REG_EVEX_0F72,
717 REG_EVEX_0F73,
718 REG_EVEX_0F38C6,
719 REG_EVEX_0F38C7
51e7da1b 720};
1ceb70f8 721
51e7da1b
L
722enum
723{
724 MOD_8D = 0,
42164a71
L
725 MOD_C6_REG_7,
726 MOD_C7_REG_7,
4a357820
MZ
727 MOD_FF_REG_3,
728 MOD_FF_REG_5,
3873ba12
L
729 MOD_0F01_REG_0,
730 MOD_0F01_REG_1,
731 MOD_0F01_REG_2,
732 MOD_0F01_REG_3,
8eab4136 733 MOD_0F01_REG_5,
3873ba12
L
734 MOD_0F01_REG_7,
735 MOD_0F12_PREFIX_0,
18897deb 736 MOD_0F12_PREFIX_2,
3873ba12
L
737 MOD_0F13,
738 MOD_0F16_PREFIX_0,
18897deb 739 MOD_0F16_PREFIX_2,
3873ba12
L
740 MOD_0F17,
741 MOD_0F18_REG_0,
742 MOD_0F18_REG_1,
743 MOD_0F18_REG_2,
744 MOD_0F18_REG_3,
d7189fa5
RM
745 MOD_0F18_REG_4,
746 MOD_0F18_REG_5,
747 MOD_0F18_REG_6,
748 MOD_0F18_REG_7,
7e8b059b
L
749 MOD_0F1A_PREFIX_0,
750 MOD_0F1B_PREFIX_0,
751 MOD_0F1B_PREFIX_1,
c48935d7 752 MOD_0F1C_PREFIX_0,
603555e5 753 MOD_0F1E_PREFIX_1,
3873ba12
L
754 MOD_0F2B_PREFIX_0,
755 MOD_0F2B_PREFIX_1,
756 MOD_0F2B_PREFIX_2,
757 MOD_0F2B_PREFIX_3,
a5aaedb9 758 MOD_0F50,
3873ba12
L
759 MOD_0F71_REG_2,
760 MOD_0F71_REG_4,
761 MOD_0F71_REG_6,
762 MOD_0F72_REG_2,
763 MOD_0F72_REG_4,
764 MOD_0F72_REG_6,
765 MOD_0F73_REG_2,
766 MOD_0F73_REG_3,
767 MOD_0F73_REG_6,
768 MOD_0F73_REG_7,
769 MOD_0FAE_REG_0,
770 MOD_0FAE_REG_1,
771 MOD_0FAE_REG_2,
772 MOD_0FAE_REG_3,
773 MOD_0FAE_REG_4,
774 MOD_0FAE_REG_5,
775 MOD_0FAE_REG_6,
776 MOD_0FAE_REG_7,
777 MOD_0FB2,
778 MOD_0FB4,
779 MOD_0FB5,
a8484f96 780 MOD_0FC3,
963f3586
IT
781 MOD_0FC7_REG_3,
782 MOD_0FC7_REG_4,
783 MOD_0FC7_REG_5,
3873ba12
L
784 MOD_0FC7_REG_6,
785 MOD_0FC7_REG_7,
786 MOD_0FD7,
787 MOD_0FE7_PREFIX_2,
788 MOD_0FF0_PREFIX_3,
7531c613 789 MOD_0F382A,
260cd341
LC
790 MOD_VEX_0F3849_X86_64_P_0_W_0,
791 MOD_VEX_0F3849_X86_64_P_2_W_0,
792 MOD_VEX_0F3849_X86_64_P_3_W_0,
793 MOD_VEX_0F384B_X86_64_P_1_W_0,
794 MOD_VEX_0F384B_X86_64_P_2_W_0,
795 MOD_VEX_0F384B_X86_64_P_3_W_0,
796 MOD_VEX_0F385C_X86_64_P_1_W_0,
797 MOD_VEX_0F385E_X86_64_P_0_W_0,
798 MOD_VEX_0F385E_X86_64_P_1_W_0,
799 MOD_VEX_0F385E_X86_64_P_2_W_0,
800 MOD_VEX_0F385E_X86_64_P_3_W_0,
c4694f17
TG
801 MOD_0F38DC_PREFIX_1,
802 MOD_0F38DD_PREFIX_1,
803 MOD_0F38DE_PREFIX_1,
804 MOD_0F38DF_PREFIX_1,
7531c613 805 MOD_0F38F5,
603555e5 806 MOD_0F38F6_PREFIX_0,
5d79adc4 807 MOD_0F38F8_PREFIX_1,
c0a30a9f 808 MOD_0F38F8_PREFIX_2,
5d79adc4 809 MOD_0F38F8_PREFIX_3,
035e7389 810 MOD_0F38F9,
c4694f17
TG
811 MOD_0F38FA_PREFIX_1,
812 MOD_0F38FB_PREFIX_1,
3873ba12
L
813 MOD_62_32BIT,
814 MOD_C4_32BIT,
815 MOD_C5_32BIT,
592a252b 816 MOD_VEX_0F12_PREFIX_0,
18897deb 817 MOD_VEX_0F12_PREFIX_2,
592a252b
L
818 MOD_VEX_0F13,
819 MOD_VEX_0F16_PREFIX_0,
18897deb 820 MOD_VEX_0F16_PREFIX_2,
592a252b
L
821 MOD_VEX_0F17,
822 MOD_VEX_0F2B,
ab4e4ed5
AF
823 MOD_VEX_W_0_0F41_P_0_LEN_1,
824 MOD_VEX_W_1_0F41_P_0_LEN_1,
825 MOD_VEX_W_0_0F41_P_2_LEN_1,
826 MOD_VEX_W_1_0F41_P_2_LEN_1,
827 MOD_VEX_W_0_0F42_P_0_LEN_1,
828 MOD_VEX_W_1_0F42_P_0_LEN_1,
829 MOD_VEX_W_0_0F42_P_2_LEN_1,
830 MOD_VEX_W_1_0F42_P_2_LEN_1,
831 MOD_VEX_W_0_0F44_P_0_LEN_1,
832 MOD_VEX_W_1_0F44_P_0_LEN_1,
833 MOD_VEX_W_0_0F44_P_2_LEN_1,
834 MOD_VEX_W_1_0F44_P_2_LEN_1,
835 MOD_VEX_W_0_0F45_P_0_LEN_1,
836 MOD_VEX_W_1_0F45_P_0_LEN_1,
837 MOD_VEX_W_0_0F45_P_2_LEN_1,
838 MOD_VEX_W_1_0F45_P_2_LEN_1,
839 MOD_VEX_W_0_0F46_P_0_LEN_1,
840 MOD_VEX_W_1_0F46_P_0_LEN_1,
841 MOD_VEX_W_0_0F46_P_2_LEN_1,
842 MOD_VEX_W_1_0F46_P_2_LEN_1,
843 MOD_VEX_W_0_0F47_P_0_LEN_1,
844 MOD_VEX_W_1_0F47_P_0_LEN_1,
845 MOD_VEX_W_0_0F47_P_2_LEN_1,
846 MOD_VEX_W_1_0F47_P_2_LEN_1,
847 MOD_VEX_W_0_0F4A_P_0_LEN_1,
848 MOD_VEX_W_1_0F4A_P_0_LEN_1,
849 MOD_VEX_W_0_0F4A_P_2_LEN_1,
850 MOD_VEX_W_1_0F4A_P_2_LEN_1,
851 MOD_VEX_W_0_0F4B_P_0_LEN_1,
852 MOD_VEX_W_1_0F4B_P_0_LEN_1,
853 MOD_VEX_W_0_0F4B_P_2_LEN_1,
592a252b
L
854 MOD_VEX_0F50,
855 MOD_VEX_0F71_REG_2,
856 MOD_VEX_0F71_REG_4,
857 MOD_VEX_0F71_REG_6,
858 MOD_VEX_0F72_REG_2,
859 MOD_VEX_0F72_REG_4,
860 MOD_VEX_0F72_REG_6,
861 MOD_VEX_0F73_REG_2,
862 MOD_VEX_0F73_REG_3,
863 MOD_VEX_0F73_REG_6,
864 MOD_VEX_0F73_REG_7,
ab4e4ed5
AF
865 MOD_VEX_W_0_0F91_P_0_LEN_0,
866 MOD_VEX_W_1_0F91_P_0_LEN_0,
867 MOD_VEX_W_0_0F91_P_2_LEN_0,
868 MOD_VEX_W_1_0F91_P_2_LEN_0,
869 MOD_VEX_W_0_0F92_P_0_LEN_0,
870 MOD_VEX_W_0_0F92_P_2_LEN_0,
58a211d2 871 MOD_VEX_0F92_P_3_LEN_0,
ab4e4ed5
AF
872 MOD_VEX_W_0_0F93_P_0_LEN_0,
873 MOD_VEX_W_0_0F93_P_2_LEN_0,
58a211d2 874 MOD_VEX_0F93_P_3_LEN_0,
ab4e4ed5
AF
875 MOD_VEX_W_0_0F98_P_0_LEN_0,
876 MOD_VEX_W_1_0F98_P_0_LEN_0,
877 MOD_VEX_W_0_0F98_P_2_LEN_0,
878 MOD_VEX_W_1_0F98_P_2_LEN_0,
879 MOD_VEX_W_0_0F99_P_0_LEN_0,
880 MOD_VEX_W_1_0F99_P_0_LEN_0,
881 MOD_VEX_W_0_0F99_P_2_LEN_0,
882 MOD_VEX_W_1_0F99_P_2_LEN_0,
592a252b
L
883 MOD_VEX_0FAE_REG_2,
884 MOD_VEX_0FAE_REG_3,
7531c613
JB
885 MOD_VEX_0FD7,
886 MOD_VEX_0FE7,
592a252b 887 MOD_VEX_0FF0_PREFIX_3,
7531c613
JB
888 MOD_VEX_0F381A,
889 MOD_VEX_0F382A,
890 MOD_VEX_0F382C,
891 MOD_VEX_0F382D,
892 MOD_VEX_0F382E,
893 MOD_VEX_0F382F,
894 MOD_VEX_0F385A,
895 MOD_VEX_0F388C,
896 MOD_VEX_0F388E,
bb5b3501
JB
897 MOD_VEX_0F3A30_L_0,
898 MOD_VEX_0F3A31_L_0,
899 MOD_VEX_0F3A32_L_0,
900 MOD_VEX_0F3A33_L_0,
43234a1e 901
467bbef0
JB
902 MOD_VEX_0FXOP_09_12,
903
43234a1e 904 MOD_EVEX_0F12_PREFIX_0,
97e6786a
JB
905 MOD_EVEX_0F12_PREFIX_2,
906 MOD_EVEX_0F13,
43234a1e 907 MOD_EVEX_0F16_PREFIX_0,
97e6786a
JB
908 MOD_EVEX_0F16_PREFIX_2,
909 MOD_EVEX_0F17,
910 MOD_EVEX_0F2B,
7531c613
JB
911 MOD_EVEX_0F381A_W_0,
912 MOD_EVEX_0F381A_W_1,
913 MOD_EVEX_0F381B_W_0,
914 MOD_EVEX_0F381B_W_1,
464d2b65
JB
915 MOD_EVEX_0F3828_P_1,
916 MOD_EVEX_0F382A_P_1_W_1,
917 MOD_EVEX_0F3838_P_1,
918 MOD_EVEX_0F383A_P_1_W_0,
7531c613
JB
919 MOD_EVEX_0F385A_W_0,
920 MOD_EVEX_0F385A_W_1,
921 MOD_EVEX_0F385B_W_0,
922 MOD_EVEX_0F385B_W_1,
464d2b65
JB
923 MOD_EVEX_0F387A_W_0,
924 MOD_EVEX_0F387B_W_0,
925 MOD_EVEX_0F387C,
43234a1e
L
926 MOD_EVEX_0F38C6_REG_1,
927 MOD_EVEX_0F38C6_REG_2,
928 MOD_EVEX_0F38C6_REG_5,
929 MOD_EVEX_0F38C6_REG_6,
930 MOD_EVEX_0F38C7_REG_1,
931 MOD_EVEX_0F38C7_REG_2,
932 MOD_EVEX_0F38C7_REG_5,
933 MOD_EVEX_0F38C7_REG_6
51e7da1b 934};
1ceb70f8 935
51e7da1b
L
936enum
937{
42164a71
L
938 RM_C6_REG_7 = 0,
939 RM_C7_REG_7,
940 RM_0F01_REG_0,
3873ba12
L
941 RM_0F01_REG_1,
942 RM_0F01_REG_2,
943 RM_0F01_REG_3,
f8687e93
JB
944 RM_0F01_REG_5_MOD_3,
945 RM_0F01_REG_7_MOD_3,
946 RM_0F1E_P_1_MOD_3_REG_7,
947 RM_0FAE_REG_6_MOD_3_P_0,
948 RM_0FAE_REG_7_MOD_3,
260cd341 949 RM_VEX_0F3849_X86_64_P_0_W_0_M_1_R_0
51e7da1b 950};
1ceb70f8 951
51e7da1b
L
952enum
953{
954 PREFIX_90 = 0,
a847e322 955 PREFIX_0F01_REG_3_RM_1,
f8687e93
JB
956 PREFIX_0F01_REG_5_MOD_0,
957 PREFIX_0F01_REG_5_MOD_3_RM_0,
bb651e8b 958 PREFIX_0F01_REG_5_MOD_3_RM_1,
f8687e93 959 PREFIX_0F01_REG_5_MOD_3_RM_2,
267b8516 960 PREFIX_0F01_REG_7_MOD_3_RM_2,
3233d7d0 961 PREFIX_0F09,
3873ba12
L
962 PREFIX_0F10,
963 PREFIX_0F11,
964 PREFIX_0F12,
965 PREFIX_0F16,
7e8b059b
L
966 PREFIX_0F1A,
967 PREFIX_0F1B,
c48935d7 968 PREFIX_0F1C,
603555e5 969 PREFIX_0F1E,
3873ba12
L
970 PREFIX_0F2A,
971 PREFIX_0F2B,
972 PREFIX_0F2C,
973 PREFIX_0F2D,
974 PREFIX_0F2E,
975 PREFIX_0F2F,
976 PREFIX_0F51,
977 PREFIX_0F52,
978 PREFIX_0F53,
979 PREFIX_0F58,
980 PREFIX_0F59,
981 PREFIX_0F5A,
982 PREFIX_0F5B,
983 PREFIX_0F5C,
984 PREFIX_0F5D,
985 PREFIX_0F5E,
986 PREFIX_0F5F,
987 PREFIX_0F60,
988 PREFIX_0F61,
989 PREFIX_0F62,
3873ba12
L
990 PREFIX_0F6F,
991 PREFIX_0F70,
3873ba12
L
992 PREFIX_0F78,
993 PREFIX_0F79,
994 PREFIX_0F7C,
995 PREFIX_0F7D,
996 PREFIX_0F7E,
997 PREFIX_0F7F,
f8687e93
JB
998 PREFIX_0FAE_REG_0_MOD_3,
999 PREFIX_0FAE_REG_1_MOD_3,
1000 PREFIX_0FAE_REG_2_MOD_3,
1001 PREFIX_0FAE_REG_3_MOD_3,
1002 PREFIX_0FAE_REG_4_MOD_0,
1003 PREFIX_0FAE_REG_4_MOD_3,
f8687e93
JB
1004 PREFIX_0FAE_REG_5_MOD_3,
1005 PREFIX_0FAE_REG_6_MOD_0,
1006 PREFIX_0FAE_REG_6_MOD_3,
1007 PREFIX_0FAE_REG_7_MOD_0,
3873ba12 1008 PREFIX_0FB8,
f12dc422 1009 PREFIX_0FBC,
3873ba12
L
1010 PREFIX_0FBD,
1011 PREFIX_0FC2,
f8687e93
JB
1012 PREFIX_0FC7_REG_6_MOD_0,
1013 PREFIX_0FC7_REG_6_MOD_3,
1014 PREFIX_0FC7_REG_7_MOD_3,
3873ba12
L
1015 PREFIX_0FD0,
1016 PREFIX_0FD6,
1017 PREFIX_0FE6,
1018 PREFIX_0FE7,
1019 PREFIX_0FF0,
1020 PREFIX_0FF7,
c4694f17
TG
1021 PREFIX_0F38D8,
1022 PREFIX_0F38DC,
1023 PREFIX_0F38DD,
1024 PREFIX_0F38DE,
1025 PREFIX_0F38DF,
3873ba12
L
1026 PREFIX_0F38F0,
1027 PREFIX_0F38F1,
e2e1fcde 1028 PREFIX_0F38F6,
c0a30a9f 1029 PREFIX_0F38F8,
c4694f17
TG
1030 PREFIX_0F38FA,
1031 PREFIX_0F38FB,
592a252b
L
1032 PREFIX_VEX_0F10,
1033 PREFIX_VEX_0F11,
1034 PREFIX_VEX_0F12,
1035 PREFIX_VEX_0F16,
1036 PREFIX_VEX_0F2A,
1037 PREFIX_VEX_0F2C,
1038 PREFIX_VEX_0F2D,
1039 PREFIX_VEX_0F2E,
1040 PREFIX_VEX_0F2F,
43234a1e
L
1041 PREFIX_VEX_0F41,
1042 PREFIX_VEX_0F42,
1043 PREFIX_VEX_0F44,
1044 PREFIX_VEX_0F45,
1045 PREFIX_VEX_0F46,
1046 PREFIX_VEX_0F47,
1ba585e8 1047 PREFIX_VEX_0F4A,
43234a1e 1048 PREFIX_VEX_0F4B,
592a252b
L
1049 PREFIX_VEX_0F51,
1050 PREFIX_VEX_0F52,
1051 PREFIX_VEX_0F53,
1052 PREFIX_VEX_0F58,
1053 PREFIX_VEX_0F59,
1054 PREFIX_VEX_0F5A,
1055 PREFIX_VEX_0F5B,
1056 PREFIX_VEX_0F5C,
1057 PREFIX_VEX_0F5D,
1058 PREFIX_VEX_0F5E,
1059 PREFIX_VEX_0F5F,
592a252b
L
1060 PREFIX_VEX_0F6F,
1061 PREFIX_VEX_0F70,
592a252b
L
1062 PREFIX_VEX_0F7C,
1063 PREFIX_VEX_0F7D,
1064 PREFIX_VEX_0F7E,
1065 PREFIX_VEX_0F7F,
43234a1e
L
1066 PREFIX_VEX_0F90,
1067 PREFIX_VEX_0F91,
1068 PREFIX_VEX_0F92,
1069 PREFIX_VEX_0F93,
1070 PREFIX_VEX_0F98,
1ba585e8 1071 PREFIX_VEX_0F99,
592a252b 1072 PREFIX_VEX_0FC2,
592a252b 1073 PREFIX_VEX_0FD0,
592a252b 1074 PREFIX_VEX_0FE6,
592a252b 1075 PREFIX_VEX_0FF0,
260cd341
LC
1076 PREFIX_VEX_0F3849_X86_64,
1077 PREFIX_VEX_0F384B_X86_64,
260cd341
LC
1078 PREFIX_VEX_0F385C_X86_64,
1079 PREFIX_VEX_0F385E_X86_64,
6c30d220
L
1080 PREFIX_VEX_0F38F5,
1081 PREFIX_VEX_0F38F6,
f12dc422 1082 PREFIX_VEX_0F38F7,
43234a1e
L
1083 PREFIX_VEX_0F3AF0,
1084
1085 PREFIX_EVEX_0F10,
1086 PREFIX_EVEX_0F11,
1087 PREFIX_EVEX_0F12,
43234a1e 1088 PREFIX_EVEX_0F16,
43234a1e 1089 PREFIX_EVEX_0F2A,
43234a1e
L
1090 PREFIX_EVEX_0F51,
1091 PREFIX_EVEX_0F58,
1092 PREFIX_EVEX_0F59,
1093 PREFIX_EVEX_0F5A,
1094 PREFIX_EVEX_0F5B,
1095 PREFIX_EVEX_0F5C,
1096 PREFIX_EVEX_0F5D,
1097 PREFIX_EVEX_0F5E,
1098 PREFIX_EVEX_0F5F,
43234a1e
L
1099 PREFIX_EVEX_0F6F,
1100 PREFIX_EVEX_0F70,
43234a1e
L
1101 PREFIX_EVEX_0F78,
1102 PREFIX_EVEX_0F79,
1103 PREFIX_EVEX_0F7A,
1104 PREFIX_EVEX_0F7B,
1105 PREFIX_EVEX_0F7E,
1106 PREFIX_EVEX_0F7F,
1107 PREFIX_EVEX_0FC2,
43234a1e 1108 PREFIX_EVEX_0FE6,
1ba585e8 1109 PREFIX_EVEX_0F3810,
43234a1e
L
1110 PREFIX_EVEX_0F3811,
1111 PREFIX_EVEX_0F3812,
1112 PREFIX_EVEX_0F3813,
1113 PREFIX_EVEX_0F3814,
1114 PREFIX_EVEX_0F3815,
1ba585e8 1115 PREFIX_EVEX_0F3820,
43234a1e
L
1116 PREFIX_EVEX_0F3821,
1117 PREFIX_EVEX_0F3822,
1118 PREFIX_EVEX_0F3823,
1119 PREFIX_EVEX_0F3824,
1120 PREFIX_EVEX_0F3825,
1ba585e8 1121 PREFIX_EVEX_0F3826,
43234a1e
L
1122 PREFIX_EVEX_0F3827,
1123 PREFIX_EVEX_0F3828,
1124 PREFIX_EVEX_0F3829,
1125 PREFIX_EVEX_0F382A,
1ba585e8 1126 PREFIX_EVEX_0F3830,
43234a1e
L
1127 PREFIX_EVEX_0F3831,
1128 PREFIX_EVEX_0F3832,
1129 PREFIX_EVEX_0F3833,
1130 PREFIX_EVEX_0F3834,
1131 PREFIX_EVEX_0F3835,
1ba585e8 1132 PREFIX_EVEX_0F3838,
43234a1e
L
1133 PREFIX_EVEX_0F3839,
1134 PREFIX_EVEX_0F383A,
47acf0bd
IT
1135 PREFIX_EVEX_0F3852,
1136 PREFIX_EVEX_0F3853,
9186c494 1137 PREFIX_EVEX_0F3868,
53467f57 1138 PREFIX_EVEX_0F3872,
43234a1e
L
1139 PREFIX_EVEX_0F389A,
1140 PREFIX_EVEX_0F389B,
43234a1e
L
1141 PREFIX_EVEX_0F38AA,
1142 PREFIX_EVEX_0F38AB,
51e7da1b 1143};
4e7d34a6 1144
51e7da1b
L
1145enum
1146{
1147 X86_64_06 = 0,
3873ba12 1148 X86_64_07,
1673df32 1149 X86_64_0E,
3873ba12
L
1150 X86_64_16,
1151 X86_64_17,
1152 X86_64_1E,
1153 X86_64_1F,
1154 X86_64_27,
1155 X86_64_2F,
1156 X86_64_37,
1157 X86_64_3F,
1158 X86_64_60,
1159 X86_64_61,
1160 X86_64_62,
1161 X86_64_63,
1162 X86_64_6D,
1163 X86_64_6F,
d039fef3 1164 X86_64_82,
3873ba12 1165 X86_64_9A,
aeab2b26
JB
1166 X86_64_C2,
1167 X86_64_C3,
3873ba12
L
1168 X86_64_C4,
1169 X86_64_C5,
1170 X86_64_CE,
1171 X86_64_D4,
1172 X86_64_D5,
a72d2af2
L
1173 X86_64_E8,
1174 X86_64_E9,
3873ba12
L
1175 X86_64_EA,
1176 X86_64_0F01_REG_0,
1177 X86_64_0F01_REG_1,
1178 X86_64_0F01_REG_2,
260cd341 1179 X86_64_0F01_REG_3,
78467458
JB
1180 X86_64_0F24,
1181 X86_64_0F26,
260cd341
LC
1182 X86_64_VEX_0F3849,
1183 X86_64_VEX_0F384B,
1184 X86_64_VEX_0F385C,
1185 X86_64_VEX_0F385E
51e7da1b 1186};
4e7d34a6 1187
51e7da1b
L
1188enum
1189{
1190 THREE_BYTE_0F38 = 0,
1f334aeb 1191 THREE_BYTE_0F3A
51e7da1b 1192};
4e7d34a6 1193
f88c9eb0
SP
1194enum
1195{
5dd85c99
SP
1196 XOP_08 = 0,
1197 XOP_09,
f88c9eb0
SP
1198 XOP_0A
1199};
1200
51e7da1b
L
1201enum
1202{
1203 VEX_0F = 0,
3873ba12
L
1204 VEX_0F38,
1205 VEX_0F3A
51e7da1b 1206};
c0f3af97 1207
43234a1e
L
1208enum
1209{
1210 EVEX_0F = 0,
1211 EVEX_0F38,
1212 EVEX_0F3A
1213};
1214
51e7da1b
L
1215enum
1216{
ec6f095a 1217 VEX_LEN_0F12_P_0_M_0 = 0,
592a252b 1218 VEX_LEN_0F12_P_0_M_1,
18897deb 1219#define VEX_LEN_0F12_P_2_M_0 VEX_LEN_0F12_P_0_M_0
592a252b
L
1220 VEX_LEN_0F13_M_0,
1221 VEX_LEN_0F16_P_0_M_0,
1222 VEX_LEN_0F16_P_0_M_1,
18897deb 1223#define VEX_LEN_0F16_P_2_M_0 VEX_LEN_0F16_P_0_M_0
592a252b 1224 VEX_LEN_0F17_M_0,
43234a1e 1225 VEX_LEN_0F41_P_0,
1ba585e8 1226 VEX_LEN_0F41_P_2,
43234a1e 1227 VEX_LEN_0F42_P_0,
1ba585e8 1228 VEX_LEN_0F42_P_2,
43234a1e 1229 VEX_LEN_0F44_P_0,
1ba585e8 1230 VEX_LEN_0F44_P_2,
43234a1e 1231 VEX_LEN_0F45_P_0,
1ba585e8 1232 VEX_LEN_0F45_P_2,
43234a1e 1233 VEX_LEN_0F46_P_0,
1ba585e8 1234 VEX_LEN_0F46_P_2,
43234a1e 1235 VEX_LEN_0F47_P_0,
1ba585e8
IT
1236 VEX_LEN_0F47_P_2,
1237 VEX_LEN_0F4A_P_0,
1238 VEX_LEN_0F4A_P_2,
1239 VEX_LEN_0F4B_P_0,
43234a1e 1240 VEX_LEN_0F4B_P_2,
7531c613 1241 VEX_LEN_0F6E,
035e7389 1242 VEX_LEN_0F77,
592a252b
L
1243 VEX_LEN_0F7E_P_1,
1244 VEX_LEN_0F7E_P_2,
43234a1e 1245 VEX_LEN_0F90_P_0,
1ba585e8 1246 VEX_LEN_0F90_P_2,
43234a1e 1247 VEX_LEN_0F91_P_0,
1ba585e8 1248 VEX_LEN_0F91_P_2,
43234a1e 1249 VEX_LEN_0F92_P_0,
90a915bf 1250 VEX_LEN_0F92_P_2,
1ba585e8 1251 VEX_LEN_0F92_P_3,
43234a1e 1252 VEX_LEN_0F93_P_0,
90a915bf 1253 VEX_LEN_0F93_P_2,
1ba585e8 1254 VEX_LEN_0F93_P_3,
43234a1e 1255 VEX_LEN_0F98_P_0,
1ba585e8
IT
1256 VEX_LEN_0F98_P_2,
1257 VEX_LEN_0F99_P_0,
1258 VEX_LEN_0F99_P_2,
592a252b
L
1259 VEX_LEN_0FAE_R_2_M_0,
1260 VEX_LEN_0FAE_R_3_M_0,
7531c613
JB
1261 VEX_LEN_0FC4,
1262 VEX_LEN_0FC5,
1263 VEX_LEN_0FD6,
1264 VEX_LEN_0FF7,
1265 VEX_LEN_0F3816,
1266 VEX_LEN_0F3819,
1267 VEX_LEN_0F381A_M_0,
1268 VEX_LEN_0F3836,
1269 VEX_LEN_0F3841,
260cd341
LC
1270 VEX_LEN_0F3849_X86_64_P_0_W_0_M_0,
1271 VEX_LEN_0F3849_X86_64_P_0_W_0_M_1_REG_0_RM_0,
1272 VEX_LEN_0F3849_X86_64_P_2_W_0_M_0,
1273 VEX_LEN_0F3849_X86_64_P_3_W_0_M_0,
1274 VEX_LEN_0F384B_X86_64_P_1_W_0_M_0,
1275 VEX_LEN_0F384B_X86_64_P_2_W_0_M_0,
1276 VEX_LEN_0F384B_X86_64_P_3_W_0_M_0,
7531c613 1277 VEX_LEN_0F385A_M_0,
260cd341
LC
1278 VEX_LEN_0F385C_X86_64_P_1_W_0_M_0,
1279 VEX_LEN_0F385E_X86_64_P_0_W_0_M_0,
1280 VEX_LEN_0F385E_X86_64_P_1_W_0_M_0,
1281 VEX_LEN_0F385E_X86_64_P_2_W_0_M_0,
1282 VEX_LEN_0F385E_X86_64_P_3_W_0_M_0,
7531c613 1283 VEX_LEN_0F38DB,
035e7389
JB
1284 VEX_LEN_0F38F2,
1285 VEX_LEN_0F38F3_R_1,
1286 VEX_LEN_0F38F3_R_2,
1287 VEX_LEN_0F38F3_R_3,
6c30d220
L
1288 VEX_LEN_0F38F5_P_0,
1289 VEX_LEN_0F38F5_P_1,
1290 VEX_LEN_0F38F5_P_3,
1291 VEX_LEN_0F38F6_P_3,
f12dc422 1292 VEX_LEN_0F38F7_P_0,
6c30d220
L
1293 VEX_LEN_0F38F7_P_1,
1294 VEX_LEN_0F38F7_P_2,
1295 VEX_LEN_0F38F7_P_3,
7531c613
JB
1296 VEX_LEN_0F3A00,
1297 VEX_LEN_0F3A01,
1298 VEX_LEN_0F3A06,
1299 VEX_LEN_0F3A14,
1300 VEX_LEN_0F3A15,
1301 VEX_LEN_0F3A16,
1302 VEX_LEN_0F3A17,
1303 VEX_LEN_0F3A18,
1304 VEX_LEN_0F3A19,
1305 VEX_LEN_0F3A20,
1306 VEX_LEN_0F3A21,
1307 VEX_LEN_0F3A22,
1308 VEX_LEN_0F3A30,
1309 VEX_LEN_0F3A31,
1310 VEX_LEN_0F3A32,
1311 VEX_LEN_0F3A33,
1312 VEX_LEN_0F3A38,
1313 VEX_LEN_0F3A39,
1314 VEX_LEN_0F3A41,
1315 VEX_LEN_0F3A46,
1316 VEX_LEN_0F3A60,
1317 VEX_LEN_0F3A61,
1318 VEX_LEN_0F3A62,
1319 VEX_LEN_0F3A63,
1320 VEX_LEN_0F3ADF,
6c30d220 1321 VEX_LEN_0F3AF0_P_3,
467bbef0
JB
1322 VEX_LEN_0FXOP_08_85,
1323 VEX_LEN_0FXOP_08_86,
1324 VEX_LEN_0FXOP_08_87,
1325 VEX_LEN_0FXOP_08_8E,
1326 VEX_LEN_0FXOP_08_8F,
1327 VEX_LEN_0FXOP_08_95,
1328 VEX_LEN_0FXOP_08_96,
1329 VEX_LEN_0FXOP_08_97,
1330 VEX_LEN_0FXOP_08_9E,
1331 VEX_LEN_0FXOP_08_9F,
1332 VEX_LEN_0FXOP_08_A3,
1333 VEX_LEN_0FXOP_08_A6,
1334 VEX_LEN_0FXOP_08_B6,
1335 VEX_LEN_0FXOP_08_C0,
1336 VEX_LEN_0FXOP_08_C1,
1337 VEX_LEN_0FXOP_08_C2,
1338 VEX_LEN_0FXOP_08_C3,
ff688e1f
L
1339 VEX_LEN_0FXOP_08_CC,
1340 VEX_LEN_0FXOP_08_CD,
1341 VEX_LEN_0FXOP_08_CE,
1342 VEX_LEN_0FXOP_08_CF,
1343 VEX_LEN_0FXOP_08_EC,
1344 VEX_LEN_0FXOP_08_ED,
1345 VEX_LEN_0FXOP_08_EE,
1346 VEX_LEN_0FXOP_08_EF,
467bbef0
JB
1347 VEX_LEN_0FXOP_09_01,
1348 VEX_LEN_0FXOP_09_02,
1349 VEX_LEN_0FXOP_09_12_M_1,
b5b098c2
JB
1350 VEX_LEN_0FXOP_09_82_W_0,
1351 VEX_LEN_0FXOP_09_83_W_0,
467bbef0
JB
1352 VEX_LEN_0FXOP_09_90,
1353 VEX_LEN_0FXOP_09_91,
1354 VEX_LEN_0FXOP_09_92,
1355 VEX_LEN_0FXOP_09_93,
1356 VEX_LEN_0FXOP_09_94,
1357 VEX_LEN_0FXOP_09_95,
1358 VEX_LEN_0FXOP_09_96,
1359 VEX_LEN_0FXOP_09_97,
1360 VEX_LEN_0FXOP_09_98,
1361 VEX_LEN_0FXOP_09_99,
1362 VEX_LEN_0FXOP_09_9A,
1363 VEX_LEN_0FXOP_09_9B,
1364 VEX_LEN_0FXOP_09_C1,
1365 VEX_LEN_0FXOP_09_C2,
1366 VEX_LEN_0FXOP_09_C3,
1367 VEX_LEN_0FXOP_09_C6,
1368 VEX_LEN_0FXOP_09_C7,
1369 VEX_LEN_0FXOP_09_CB,
1370 VEX_LEN_0FXOP_09_D1,
1371 VEX_LEN_0FXOP_09_D2,
1372 VEX_LEN_0FXOP_09_D3,
1373 VEX_LEN_0FXOP_09_D6,
1374 VEX_LEN_0FXOP_09_D7,
1375 VEX_LEN_0FXOP_09_DB,
1376 VEX_LEN_0FXOP_09_E1,
1377 VEX_LEN_0FXOP_09_E2,
1378 VEX_LEN_0FXOP_09_E3,
1379 VEX_LEN_0FXOP_0A_12,
51e7da1b 1380};
c0f3af97 1381
04e2a182
L
1382enum
1383{
7531c613 1384 EVEX_LEN_0F6E = 0,
04e2a182
L
1385 EVEX_LEN_0F7E_P_1,
1386 EVEX_LEN_0F7E_P_2,
7531c613
JB
1387 EVEX_LEN_0FC4,
1388 EVEX_LEN_0FC5,
1389 EVEX_LEN_0FD6,
1390 EVEX_LEN_0F3816,
1391 EVEX_LEN_0F3819_W_0,
1392 EVEX_LEN_0F3819_W_1,
1393 EVEX_LEN_0F381A_W_0_M_0,
1394 EVEX_LEN_0F381A_W_1_M_0,
1395 EVEX_LEN_0F381B_W_0_M_0,
1396 EVEX_LEN_0F381B_W_1_M_0,
1397 EVEX_LEN_0F3836,
1398 EVEX_LEN_0F385A_W_0_M_0,
1399 EVEX_LEN_0F385A_W_1_M_0,
1400 EVEX_LEN_0F385B_W_0_M_0,
1401 EVEX_LEN_0F385B_W_1_M_0,
1402 EVEX_LEN_0F38C6_R_1_M_0,
1403 EVEX_LEN_0F38C6_R_2_M_0,
1404 EVEX_LEN_0F38C6_R_5_M_0,
1405 EVEX_LEN_0F38C6_R_6_M_0,
1406 EVEX_LEN_0F38C7_R_1_M_0_W_0,
1407 EVEX_LEN_0F38C7_R_1_M_0_W_1,
1408 EVEX_LEN_0F38C7_R_2_M_0_W_0,
1409 EVEX_LEN_0F38C7_R_2_M_0_W_1,
1410 EVEX_LEN_0F38C7_R_5_M_0_W_0,
1411 EVEX_LEN_0F38C7_R_5_M_0_W_1,
1412 EVEX_LEN_0F38C7_R_6_M_0_W_0,
1413 EVEX_LEN_0F38C7_R_6_M_0_W_1,
1414 EVEX_LEN_0F3A00_W_1,
1415 EVEX_LEN_0F3A01_W_1,
1416 EVEX_LEN_0F3A14,
1417 EVEX_LEN_0F3A15,
1418 EVEX_LEN_0F3A16,
1419 EVEX_LEN_0F3A17,
1420 EVEX_LEN_0F3A18_W_0,
1421 EVEX_LEN_0F3A18_W_1,
1422 EVEX_LEN_0F3A19_W_0,
1423 EVEX_LEN_0F3A19_W_1,
1424 EVEX_LEN_0F3A1A_W_0,
1425 EVEX_LEN_0F3A1A_W_1,
1426 EVEX_LEN_0F3A1B_W_0,
1427 EVEX_LEN_0F3A1B_W_1,
1428 EVEX_LEN_0F3A20,
1429 EVEX_LEN_0F3A21_W_0,
1430 EVEX_LEN_0F3A22,
1431 EVEX_LEN_0F3A23_W_0,
1432 EVEX_LEN_0F3A23_W_1,
1433 EVEX_LEN_0F3A38_W_0,
1434 EVEX_LEN_0F3A38_W_1,
1435 EVEX_LEN_0F3A39_W_0,
1436 EVEX_LEN_0F3A39_W_1,
1437 EVEX_LEN_0F3A3A_W_0,
1438 EVEX_LEN_0F3A3A_W_1,
1439 EVEX_LEN_0F3A3B_W_0,
1440 EVEX_LEN_0F3A3B_W_1,
1441 EVEX_LEN_0F3A43_W_0,
1442 EVEX_LEN_0F3A43_W_1
04e2a182
L
1443};
1444
9e30b8e0
L
1445enum
1446{
ec6f095a 1447 VEX_W_0F41_P_0_LEN_1 = 0,
1ba585e8 1448 VEX_W_0F41_P_2_LEN_1,
43234a1e 1449 VEX_W_0F42_P_0_LEN_1,
1ba585e8 1450 VEX_W_0F42_P_2_LEN_1,
43234a1e 1451 VEX_W_0F44_P_0_LEN_0,
1ba585e8 1452 VEX_W_0F44_P_2_LEN_0,
43234a1e 1453 VEX_W_0F45_P_0_LEN_1,
1ba585e8 1454 VEX_W_0F45_P_2_LEN_1,
43234a1e 1455 VEX_W_0F46_P_0_LEN_1,
1ba585e8 1456 VEX_W_0F46_P_2_LEN_1,
43234a1e 1457 VEX_W_0F47_P_0_LEN_1,
1ba585e8
IT
1458 VEX_W_0F47_P_2_LEN_1,
1459 VEX_W_0F4A_P_0_LEN_1,
1460 VEX_W_0F4A_P_2_LEN_1,
1461 VEX_W_0F4B_P_0_LEN_1,
43234a1e 1462 VEX_W_0F4B_P_2_LEN_1,
43234a1e 1463 VEX_W_0F90_P_0_LEN_0,
1ba585e8 1464 VEX_W_0F90_P_2_LEN_0,
43234a1e 1465 VEX_W_0F91_P_0_LEN_0,
1ba585e8 1466 VEX_W_0F91_P_2_LEN_0,
43234a1e 1467 VEX_W_0F92_P_0_LEN_0,
90a915bf 1468 VEX_W_0F92_P_2_LEN_0,
43234a1e 1469 VEX_W_0F93_P_0_LEN_0,
90a915bf 1470 VEX_W_0F93_P_2_LEN_0,
43234a1e 1471 VEX_W_0F98_P_0_LEN_0,
1ba585e8
IT
1472 VEX_W_0F98_P_2_LEN_0,
1473 VEX_W_0F99_P_0_LEN_0,
1474 VEX_W_0F99_P_2_LEN_0,
7531c613
JB
1475 VEX_W_0F380C,
1476 VEX_W_0F380D,
1477 VEX_W_0F380E,
1478 VEX_W_0F380F,
1479 VEX_W_0F3813,
1480 VEX_W_0F3816_L_1,
1481 VEX_W_0F3818,
1482 VEX_W_0F3819_L_1,
1483 VEX_W_0F381A_M_0_L_1,
1484 VEX_W_0F382C_M_0,
1485 VEX_W_0F382D_M_0,
1486 VEX_W_0F382E_M_0,
1487 VEX_W_0F382F_M_0,
1488 VEX_W_0F3836,
1489 VEX_W_0F3846,
260cd341
LC
1490 VEX_W_0F3849_X86_64_P_0,
1491 VEX_W_0F3849_X86_64_P_2,
1492 VEX_W_0F3849_X86_64_P_3,
1493 VEX_W_0F384B_X86_64_P_1,
1494 VEX_W_0F384B_X86_64_P_2,
1495 VEX_W_0F384B_X86_64_P_3,
7531c613
JB
1496 VEX_W_0F3858,
1497 VEX_W_0F3859,
1498 VEX_W_0F385A_M_0_L_0,
260cd341
LC
1499 VEX_W_0F385C_X86_64_P_1,
1500 VEX_W_0F385E_X86_64_P_0,
1501 VEX_W_0F385E_X86_64_P_1,
1502 VEX_W_0F385E_X86_64_P_2,
1503 VEX_W_0F385E_X86_64_P_3,
7531c613
JB
1504 VEX_W_0F3878,
1505 VEX_W_0F3879,
1506 VEX_W_0F38CF,
1507 VEX_W_0F3A00_L_1,
1508 VEX_W_0F3A01_L_1,
1509 VEX_W_0F3A02,
1510 VEX_W_0F3A04,
1511 VEX_W_0F3A05,
1512 VEX_W_0F3A06_L_1,
1513 VEX_W_0F3A18_L_1,
1514 VEX_W_0F3A19_L_1,
1515 VEX_W_0F3A1D,
7531c613
JB
1516 VEX_W_0F3A38_L_1,
1517 VEX_W_0F3A39_L_1,
1518 VEX_W_0F3A46_L_1,
1519 VEX_W_0F3A4A,
1520 VEX_W_0F3A4B,
1521 VEX_W_0F3A4C,
1522 VEX_W_0F3ACE,
1523 VEX_W_0F3ACF,
43234a1e 1524
467bbef0
JB
1525 VEX_W_0FXOP_08_85_L_0,
1526 VEX_W_0FXOP_08_86_L_0,
1527 VEX_W_0FXOP_08_87_L_0,
1528 VEX_W_0FXOP_08_8E_L_0,
1529 VEX_W_0FXOP_08_8F_L_0,
1530 VEX_W_0FXOP_08_95_L_0,
1531 VEX_W_0FXOP_08_96_L_0,
1532 VEX_W_0FXOP_08_97_L_0,
1533 VEX_W_0FXOP_08_9E_L_0,
1534 VEX_W_0FXOP_08_9F_L_0,
1535 VEX_W_0FXOP_08_A6_L_0,
1536 VEX_W_0FXOP_08_B6_L_0,
1537 VEX_W_0FXOP_08_C0_L_0,
1538 VEX_W_0FXOP_08_C1_L_0,
1539 VEX_W_0FXOP_08_C2_L_0,
1540 VEX_W_0FXOP_08_C3_L_0,
1541 VEX_W_0FXOP_08_CC_L_0,
1542 VEX_W_0FXOP_08_CD_L_0,
1543 VEX_W_0FXOP_08_CE_L_0,
1544 VEX_W_0FXOP_08_CF_L_0,
1545 VEX_W_0FXOP_08_EC_L_0,
1546 VEX_W_0FXOP_08_ED_L_0,
1547 VEX_W_0FXOP_08_EE_L_0,
1548 VEX_W_0FXOP_08_EF_L_0,
1549
b5b098c2
JB
1550 VEX_W_0FXOP_09_80,
1551 VEX_W_0FXOP_09_81,
1552 VEX_W_0FXOP_09_82,
1553 VEX_W_0FXOP_09_83,
467bbef0
JB
1554 VEX_W_0FXOP_09_C1_L_0,
1555 VEX_W_0FXOP_09_C2_L_0,
1556 VEX_W_0FXOP_09_C3_L_0,
1557 VEX_W_0FXOP_09_C6_L_0,
1558 VEX_W_0FXOP_09_C7_L_0,
1559 VEX_W_0FXOP_09_CB_L_0,
1560 VEX_W_0FXOP_09_D1_L_0,
1561 VEX_W_0FXOP_09_D2_L_0,
1562 VEX_W_0FXOP_09_D3_L_0,
1563 VEX_W_0FXOP_09_D6_L_0,
1564 VEX_W_0FXOP_09_D7_L_0,
1565 VEX_W_0FXOP_09_DB_L_0,
1566 VEX_W_0FXOP_09_E1_L_0,
1567 VEX_W_0FXOP_09_E2_L_0,
1568 VEX_W_0FXOP_09_E3_L_0,
b5b098c2 1569
36cc073e 1570 EVEX_W_0F10_P_1,
36cc073e 1571 EVEX_W_0F10_P_3,
36cc073e 1572 EVEX_W_0F11_P_1,
36cc073e 1573 EVEX_W_0F11_P_3,
43234a1e
L
1574 EVEX_W_0F12_P_0_M_1,
1575 EVEX_W_0F12_P_1,
43234a1e 1576 EVEX_W_0F12_P_3,
43234a1e
L
1577 EVEX_W_0F16_P_0_M_1,
1578 EVEX_W_0F16_P_1,
43234a1e 1579 EVEX_W_0F2A_P_3,
43234a1e 1580 EVEX_W_0F51_P_1,
43234a1e 1581 EVEX_W_0F51_P_3,
43234a1e 1582 EVEX_W_0F58_P_1,
43234a1e 1583 EVEX_W_0F58_P_3,
43234a1e 1584 EVEX_W_0F59_P_1,
43234a1e
L
1585 EVEX_W_0F59_P_3,
1586 EVEX_W_0F5A_P_0,
1587 EVEX_W_0F5A_P_1,
1588 EVEX_W_0F5A_P_2,
1589 EVEX_W_0F5A_P_3,
1590 EVEX_W_0F5B_P_0,
1591 EVEX_W_0F5B_P_1,
1592 EVEX_W_0F5B_P_2,
43234a1e 1593 EVEX_W_0F5C_P_1,
43234a1e 1594 EVEX_W_0F5C_P_3,
43234a1e 1595 EVEX_W_0F5D_P_1,
43234a1e 1596 EVEX_W_0F5D_P_3,
43234a1e 1597 EVEX_W_0F5E_P_1,
43234a1e 1598 EVEX_W_0F5E_P_3,
43234a1e 1599 EVEX_W_0F5F_P_1,
43234a1e 1600 EVEX_W_0F5F_P_3,
fedfb81e 1601 EVEX_W_0F62,
7531c613 1602 EVEX_W_0F66,
fedfb81e
JB
1603 EVEX_W_0F6A,
1604 EVEX_W_0F6B,
1605 EVEX_W_0F6C,
1606 EVEX_W_0F6D,
43234a1e
L
1607 EVEX_W_0F6F_P_1,
1608 EVEX_W_0F6F_P_2,
1ba585e8 1609 EVEX_W_0F6F_P_3,
43234a1e 1610 EVEX_W_0F70_P_2,
7531c613
JB
1611 EVEX_W_0F72_R_2,
1612 EVEX_W_0F72_R_6,
1613 EVEX_W_0F73_R_2,
1614 EVEX_W_0F73_R_6,
1615 EVEX_W_0F76,
43234a1e 1616 EVEX_W_0F78_P_0,
90a915bf 1617 EVEX_W_0F78_P_2,
43234a1e 1618 EVEX_W_0F79_P_0,
90a915bf 1619 EVEX_W_0F79_P_2,
43234a1e 1620 EVEX_W_0F7A_P_1,
90a915bf 1621 EVEX_W_0F7A_P_2,
43234a1e 1622 EVEX_W_0F7A_P_3,
90a915bf 1623 EVEX_W_0F7B_P_2,
43234a1e
L
1624 EVEX_W_0F7B_P_3,
1625 EVEX_W_0F7E_P_1,
43234a1e
L
1626 EVEX_W_0F7F_P_1,
1627 EVEX_W_0F7F_P_2,
1ba585e8 1628 EVEX_W_0F7F_P_3,
43234a1e 1629 EVEX_W_0FC2_P_1,
43234a1e 1630 EVEX_W_0FC2_P_3,
fedfb81e
JB
1631 EVEX_W_0FD2,
1632 EVEX_W_0FD3,
1633 EVEX_W_0FD4,
7531c613 1634 EVEX_W_0FD6_L_0,
43234a1e
L
1635 EVEX_W_0FE6_P_1,
1636 EVEX_W_0FE6_P_2,
1637 EVEX_W_0FE6_P_3,
7531c613 1638 EVEX_W_0FE7,
fedfb81e
JB
1639 EVEX_W_0FF2,
1640 EVEX_W_0FF3,
1641 EVEX_W_0FF4,
1642 EVEX_W_0FFA,
1643 EVEX_W_0FFB,
1644 EVEX_W_0FFE,
7531c613 1645 EVEX_W_0F380D,
1ba585e8
IT
1646 EVEX_W_0F3810_P_1,
1647 EVEX_W_0F3810_P_2,
43234a1e 1648 EVEX_W_0F3811_P_1,
1ba585e8 1649 EVEX_W_0F3811_P_2,
43234a1e 1650 EVEX_W_0F3812_P_1,
1ba585e8 1651 EVEX_W_0F3812_P_2,
43234a1e
L
1652 EVEX_W_0F3813_P_1,
1653 EVEX_W_0F3813_P_2,
1654 EVEX_W_0F3814_P_1,
1655 EVEX_W_0F3815_P_1,
7531c613
JB
1656 EVEX_W_0F3819,
1657 EVEX_W_0F381A,
1658 EVEX_W_0F381B,
1659 EVEX_W_0F381E,
1660 EVEX_W_0F381F,
1ba585e8 1661 EVEX_W_0F3820_P_1,
43234a1e
L
1662 EVEX_W_0F3821_P_1,
1663 EVEX_W_0F3822_P_1,
1664 EVEX_W_0F3823_P_1,
1665 EVEX_W_0F3824_P_1,
1666 EVEX_W_0F3825_P_1,
1667 EVEX_W_0F3825_P_2,
1668 EVEX_W_0F3828_P_2,
1669 EVEX_W_0F3829_P_2,
1670 EVEX_W_0F382A_P_1,
1671 EVEX_W_0F382A_P_2,
fedfb81e 1672 EVEX_W_0F382B,
1ba585e8 1673 EVEX_W_0F3830_P_1,
43234a1e
L
1674 EVEX_W_0F3831_P_1,
1675 EVEX_W_0F3832_P_1,
1676 EVEX_W_0F3833_P_1,
1677 EVEX_W_0F3834_P_1,
1678 EVEX_W_0F3835_P_1,
1679 EVEX_W_0F3835_P_2,
7531c613 1680 EVEX_W_0F3837,
43234a1e 1681 EVEX_W_0F383A_P_1,
d6aab7a1 1682 EVEX_W_0F3852_P_1,
7531c613
JB
1683 EVEX_W_0F3859,
1684 EVEX_W_0F385A,
1685 EVEX_W_0F385B,
1686 EVEX_W_0F3870,
d6aab7a1 1687 EVEX_W_0F3872_P_1,
53467f57 1688 EVEX_W_0F3872_P_2,
d6aab7a1 1689 EVEX_W_0F3872_P_3,
7531c613
JB
1690 EVEX_W_0F387A,
1691 EVEX_W_0F387B,
1692 EVEX_W_0F3883,
1693 EVEX_W_0F3891,
1694 EVEX_W_0F3893,
1695 EVEX_W_0F38A1,
1696 EVEX_W_0F38A3,
1697 EVEX_W_0F38C7_R_1_M_0,
1698 EVEX_W_0F38C7_R_2_M_0,
1699 EVEX_W_0F38C7_R_5_M_0,
1700 EVEX_W_0F38C7_R_6_M_0,
1701
1702 EVEX_W_0F3A00,
1703 EVEX_W_0F3A01,
1704 EVEX_W_0F3A05,
1705 EVEX_W_0F3A08,
1706 EVEX_W_0F3A09,
1707 EVEX_W_0F3A0A,
1708 EVEX_W_0F3A0B,
1709 EVEX_W_0F3A18,
1710 EVEX_W_0F3A19,
1711 EVEX_W_0F3A1A,
1712 EVEX_W_0F3A1B,
1713 EVEX_W_0F3A21,
1714 EVEX_W_0F3A23,
1715 EVEX_W_0F3A38,
1716 EVEX_W_0F3A39,
1717 EVEX_W_0F3A3A,
1718 EVEX_W_0F3A3B,
1719 EVEX_W_0F3A42,
1720 EVEX_W_0F3A43,
1721 EVEX_W_0F3A70,
1722 EVEX_W_0F3A72,
9e30b8e0
L
1723};
1724
26ca5450 1725typedef void (*op_rtn) (int bytemode, int sizeflag);
252b5132
RH
1726
1727struct dis386 {
2da11e11 1728 const char *name;
ce518a5f
L
1729 struct
1730 {
1731 op_rtn rtn;
1732 int bytemode;
1733 } op[MAX_OPERANDS];
bf890a93 1734 unsigned int prefix_requirement;
252b5132
RH
1735};
1736
1737/* Upper case letters in the instruction names here are macros.
1738 'A' => print 'b' if no register operands or suffix_always is true
1739 'B' => print 'b' if suffix_always is true
9306ca4a 1740 'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
98b528ac 1741 size prefix
ed7841b3 1742 'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
98b528ac 1743 suffix_always is true
252b5132 1744 'E' => print 'e' if 32-bit form of jcxz
3ffd33cf 1745 'F' => print 'w' or 'l' depending on address size prefix (loop insns)
52fd6d94 1746 'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
5dd0794d 1747 'H' => print ",pt" or ",pn" branch hint
d1c36125 1748 'I' unused.
8f570d62 1749 'J' unused.
42903f7f 1750 'K' => print 'd' or 'q' if rex prefix is present.
78467458 1751 'L' unused.
9d141669 1752 'M' => print 'r' if intel_mnemonic is false.
252b5132 1753 'N' => print 'n' if instruction has no wait "prefix"
a35ca55a 1754 'O' => print 'd' or 'o' (or 'q' in Intel mode)
36938cab
JB
1755 'P' => behave as 'T' except with register operand outside of suffix_always
1756 mode
98b528ac
L
1757 'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
1758 is true
a35ca55a 1759 'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
52b15da3 1760 'S' => print 'w', 'l' or 'q' if suffix_always is true
36938cab
JB
1761 'T' => print 'w', 'l'/'d', or 'q' if instruction has an operand size
1762 prefix or if suffix_always is true.
1763 'U' unused.
c3f5525f 1764 'V' unused.
a35ca55a 1765 'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
9306ca4a 1766 'X' => print 's', 'd' depending on data16 prefix (for XMM)
9646c87b 1767 'Y' unused.
78467458 1768 'Z' => print 'q' in 64bit mode and 'l' otherwise, if suffix_always is true.
9d141669 1769 '!' => change condition from true to false or from false to true.
98b528ac 1770 '%' => add 1 upper case letter to the macro.
5990e377
JB
1771 '^' => print 'w', 'l', or 'q' (Intel64 ISA only) depending on operand size
1772 prefix or suffix_always is true (lcall/ljmp).
36938cab
JB
1773 '@' => in 64bit mode for Intel64 ISA or if instruction
1774 has no operand sizing prefix, print 'q' if suffix_always is true or
1775 nothing otherwise; behave as 'P' in all other cases
98b528ac
L
1776
1777 2 upper case letter macros:
04d824a4
JB
1778 "XY" => print 'x' or 'y' if suffix_always is true or no register
1779 operands and no broadcast.
1780 "XZ" => print 'x', 'y', or 'z' if suffix_always is true or no
1781 register operands and no broadcast.
4b06377f 1782 "XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
b24d668c
JB
1783 "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand, cond
1784 being false, or no operand at all in 64bit mode, or if suffix_always
589958d6 1785 is true.
4b06377f
L
1786 "LB" => print "abs" in 64bit mode and behave as 'B' otherwise
1787 "LS" => print "abs" in 64bit mode and behave as 'S' otherwise
1788 "LV" => print "abs" for 64bit operand and behave as 'S' otherwise
492a76aa 1789 "DQ" => print 'd' or 'q' depending on the VEX.W bit
bb5b3501 1790 "BW" => print 'b' or 'w' depending on the VEX.W bit
4b4c407a
L
1791 "LP" => print 'w' or 'l' ('d' in Intel mode) if instruction has
1792 an operand size prefix, or suffix_always is true. print
1793 'q' if rex prefix is present.
52b15da3 1794
6439fc28
AM
1795 Many of the above letters print nothing in Intel mode. See "putop"
1796 for the details.
52b15da3 1797
6439fc28 1798 Braces '{' and '}', and vertical bars '|', indicate alternative
7c52e0e8 1799 mnemonic strings for AT&T and Intel. */
252b5132 1800
6439fc28 1801static const struct dis386 dis386[] = {
252b5132 1802 /* 00 */
bf890a93
IT
1803 { "addB", { Ebh1, Gb }, 0 },
1804 { "addS", { Evh1, Gv }, 0 },
1805 { "addB", { Gb, EbS }, 0 },
1806 { "addS", { Gv, EvS }, 0 },
1807 { "addB", { AL, Ib }, 0 },
1808 { "addS", { eAX, Iv }, 0 },
4e7d34a6
L
1809 { X86_64_TABLE (X86_64_06) },
1810 { X86_64_TABLE (X86_64_07) },
252b5132 1811 /* 08 */
bf890a93
IT
1812 { "orB", { Ebh1, Gb }, 0 },
1813 { "orS", { Evh1, Gv }, 0 },
1814 { "orB", { Gb, EbS }, 0 },
1815 { "orS", { Gv, EvS }, 0 },
1816 { "orB", { AL, Ib }, 0 },
1817 { "orS", { eAX, Iv }, 0 },
1673df32 1818 { X86_64_TABLE (X86_64_0E) },
592d1631 1819 { Bad_Opcode }, /* 0x0f extended opcode escape */
252b5132 1820 /* 10 */
bf890a93
IT
1821 { "adcB", { Ebh1, Gb }, 0 },
1822 { "adcS", { Evh1, Gv }, 0 },
1823 { "adcB", { Gb, EbS }, 0 },
1824 { "adcS", { Gv, EvS }, 0 },
1825 { "adcB", { AL, Ib }, 0 },
1826 { "adcS", { eAX, Iv }, 0 },
4e7d34a6
L
1827 { X86_64_TABLE (X86_64_16) },
1828 { X86_64_TABLE (X86_64_17) },
252b5132 1829 /* 18 */
bf890a93
IT
1830 { "sbbB", { Ebh1, Gb }, 0 },
1831 { "sbbS", { Evh1, Gv }, 0 },
1832 { "sbbB", { Gb, EbS }, 0 },
1833 { "sbbS", { Gv, EvS }, 0 },
1834 { "sbbB", { AL, Ib }, 0 },
1835 { "sbbS", { eAX, Iv }, 0 },
4e7d34a6
L
1836 { X86_64_TABLE (X86_64_1E) },
1837 { X86_64_TABLE (X86_64_1F) },
252b5132 1838 /* 20 */
bf890a93
IT
1839 { "andB", { Ebh1, Gb }, 0 },
1840 { "andS", { Evh1, Gv }, 0 },
1841 { "andB", { Gb, EbS }, 0 },
1842 { "andS", { Gv, EvS }, 0 },
1843 { "andB", { AL, Ib }, 0 },
1844 { "andS", { eAX, Iv }, 0 },
592d1631 1845 { Bad_Opcode }, /* SEG ES prefix */
4e7d34a6 1846 { X86_64_TABLE (X86_64_27) },
252b5132 1847 /* 28 */
bf890a93
IT
1848 { "subB", { Ebh1, Gb }, 0 },
1849 { "subS", { Evh1, Gv }, 0 },
1850 { "subB", { Gb, EbS }, 0 },
1851 { "subS", { Gv, EvS }, 0 },
1852 { "subB", { AL, Ib }, 0 },
1853 { "subS", { eAX, Iv }, 0 },
592d1631 1854 { Bad_Opcode }, /* SEG CS prefix */
4e7d34a6 1855 { X86_64_TABLE (X86_64_2F) },
252b5132 1856 /* 30 */
bf890a93
IT
1857 { "xorB", { Ebh1, Gb }, 0 },
1858 { "xorS", { Evh1, Gv }, 0 },
1859 { "xorB", { Gb, EbS }, 0 },
1860 { "xorS", { Gv, EvS }, 0 },
1861 { "xorB", { AL, Ib }, 0 },
1862 { "xorS", { eAX, Iv }, 0 },
592d1631 1863 { Bad_Opcode }, /* SEG SS prefix */
4e7d34a6 1864 { X86_64_TABLE (X86_64_37) },
252b5132 1865 /* 38 */
bf890a93
IT
1866 { "cmpB", { Eb, Gb }, 0 },
1867 { "cmpS", { Ev, Gv }, 0 },
1868 { "cmpB", { Gb, EbS }, 0 },
1869 { "cmpS", { Gv, EvS }, 0 },
1870 { "cmpB", { AL, Ib }, 0 },
1871 { "cmpS", { eAX, Iv }, 0 },
592d1631 1872 { Bad_Opcode }, /* SEG DS prefix */
4e7d34a6 1873 { X86_64_TABLE (X86_64_3F) },
252b5132 1874 /* 40 */
bf890a93
IT
1875 { "inc{S|}", { RMeAX }, 0 },
1876 { "inc{S|}", { RMeCX }, 0 },
1877 { "inc{S|}", { RMeDX }, 0 },
1878 { "inc{S|}", { RMeBX }, 0 },
1879 { "inc{S|}", { RMeSP }, 0 },
1880 { "inc{S|}", { RMeBP }, 0 },
1881 { "inc{S|}", { RMeSI }, 0 },
1882 { "inc{S|}", { RMeDI }, 0 },
252b5132 1883 /* 48 */
bf890a93
IT
1884 { "dec{S|}", { RMeAX }, 0 },
1885 { "dec{S|}", { RMeCX }, 0 },
1886 { "dec{S|}", { RMeDX }, 0 },
1887 { "dec{S|}", { RMeBX }, 0 },
1888 { "dec{S|}", { RMeSP }, 0 },
1889 { "dec{S|}", { RMeBP }, 0 },
1890 { "dec{S|}", { RMeSI }, 0 },
1891 { "dec{S|}", { RMeDI }, 0 },
252b5132 1892 /* 50 */
c3f5525f
JB
1893 { "push{!P|}", { RMrAX }, 0 },
1894 { "push{!P|}", { RMrCX }, 0 },
1895 { "push{!P|}", { RMrDX }, 0 },
1896 { "push{!P|}", { RMrBX }, 0 },
1897 { "push{!P|}", { RMrSP }, 0 },
1898 { "push{!P|}", { RMrBP }, 0 },
1899 { "push{!P|}", { RMrSI }, 0 },
1900 { "push{!P|}", { RMrDI }, 0 },
252b5132 1901 /* 58 */
c3f5525f
JB
1902 { "pop{!P|}", { RMrAX }, 0 },
1903 { "pop{!P|}", { RMrCX }, 0 },
1904 { "pop{!P|}", { RMrDX }, 0 },
1905 { "pop{!P|}", { RMrBX }, 0 },
1906 { "pop{!P|}", { RMrSP }, 0 },
1907 { "pop{!P|}", { RMrBP }, 0 },
1908 { "pop{!P|}", { RMrSI }, 0 },
1909 { "pop{!P|}", { RMrDI }, 0 },
252b5132 1910 /* 60 */
4e7d34a6
L
1911 { X86_64_TABLE (X86_64_60) },
1912 { X86_64_TABLE (X86_64_61) },
1913 { X86_64_TABLE (X86_64_62) },
1914 { X86_64_TABLE (X86_64_63) },
592d1631
L
1915 { Bad_Opcode }, /* seg fs */
1916 { Bad_Opcode }, /* seg gs */
1917 { Bad_Opcode }, /* op size prefix */
1918 { Bad_Opcode }, /* adr size prefix */
252b5132 1919 /* 68 */
36938cab 1920 { "pushP", { sIv }, 0 },
bf890a93 1921 { "imulS", { Gv, Ev, Iv }, 0 },
36938cab 1922 { "pushP", { sIbT }, 0 },
bf890a93
IT
1923 { "imulS", { Gv, Ev, sIb }, 0 },
1924 { "ins{b|}", { Ybr, indirDX }, 0 },
4e7d34a6 1925 { X86_64_TABLE (X86_64_6D) },
bf890a93 1926 { "outs{b|}", { indirDXr, Xb }, 0 },
4e7d34a6 1927 { X86_64_TABLE (X86_64_6F) },
252b5132 1928 /* 70 */
bf890a93
IT
1929 { "joH", { Jb, BND, cond_jump_flag }, 0 },
1930 { "jnoH", { Jb, BND, cond_jump_flag }, 0 },
1931 { "jbH", { Jb, BND, cond_jump_flag }, 0 },
1932 { "jaeH", { Jb, BND, cond_jump_flag }, 0 },
1933 { "jeH", { Jb, BND, cond_jump_flag }, 0 },
1934 { "jneH", { Jb, BND, cond_jump_flag }, 0 },
1935 { "jbeH", { Jb, BND, cond_jump_flag }, 0 },
1936 { "jaH", { Jb, BND, cond_jump_flag }, 0 },
252b5132 1937 /* 78 */
bf890a93
IT
1938 { "jsH", { Jb, BND, cond_jump_flag }, 0 },
1939 { "jnsH", { Jb, BND, cond_jump_flag }, 0 },
1940 { "jpH", { Jb, BND, cond_jump_flag }, 0 },
1941 { "jnpH", { Jb, BND, cond_jump_flag }, 0 },
1942 { "jlH", { Jb, BND, cond_jump_flag }, 0 },
1943 { "jgeH", { Jb, BND, cond_jump_flag }, 0 },
1944 { "jleH", { Jb, BND, cond_jump_flag }, 0 },
1945 { "jgH", { Jb, BND, cond_jump_flag }, 0 },
252b5132 1946 /* 80 */
1ceb70f8
L
1947 { REG_TABLE (REG_80) },
1948 { REG_TABLE (REG_81) },
d039fef3 1949 { X86_64_TABLE (X86_64_82) },
7148c369 1950 { REG_TABLE (REG_83) },
bf890a93
IT
1951 { "testB", { Eb, Gb }, 0 },
1952 { "testS", { Ev, Gv }, 0 },
1953 { "xchgB", { Ebh2, Gb }, 0 },
1954 { "xchgS", { Evh2, Gv }, 0 },
252b5132 1955 /* 88 */
bf890a93
IT
1956 { "movB", { Ebh3, Gb }, 0 },
1957 { "movS", { Evh3, Gv }, 0 },
1958 { "movB", { Gb, EbS }, 0 },
1959 { "movS", { Gv, EvS }, 0 },
1960 { "movD", { Sv, Sw }, 0 },
1ceb70f8 1961 { MOD_TABLE (MOD_8D) },
bf890a93 1962 { "movD", { Sw, Sv }, 0 },
1ceb70f8 1963 { REG_TABLE (REG_8F) },
252b5132 1964 /* 90 */
1ceb70f8 1965 { PREFIX_TABLE (PREFIX_90) },
bf890a93
IT
1966 { "xchgS", { RMeCX, eAX }, 0 },
1967 { "xchgS", { RMeDX, eAX }, 0 },
1968 { "xchgS", { RMeBX, eAX }, 0 },
1969 { "xchgS", { RMeSP, eAX }, 0 },
1970 { "xchgS", { RMeBP, eAX }, 0 },
1971 { "xchgS", { RMeSI, eAX }, 0 },
1972 { "xchgS", { RMeDI, eAX }, 0 },
252b5132 1973 /* 98 */
bf890a93
IT
1974 { "cW{t|}R", { XX }, 0 },
1975 { "cR{t|}O", { XX }, 0 },
4e7d34a6 1976 { X86_64_TABLE (X86_64_9A) },
592d1631 1977 { Bad_Opcode }, /* fwait */
36938cab
JB
1978 { "pushfP", { XX }, 0 },
1979 { "popfP", { XX }, 0 },
bf890a93
IT
1980 { "sahf", { XX }, 0 },
1981 { "lahf", { XX }, 0 },
252b5132 1982 /* a0 */
bf890a93
IT
1983 { "mov%LB", { AL, Ob }, 0 },
1984 { "mov%LS", { eAX, Ov }, 0 },
1985 { "mov%LB", { Ob, AL }, 0 },
1986 { "mov%LS", { Ov, eAX }, 0 },
1987 { "movs{b|}", { Ybr, Xb }, 0 },
1988 { "movs{R|}", { Yvr, Xv }, 0 },
1989 { "cmps{b|}", { Xb, Yb }, 0 },
1990 { "cmps{R|}", { Xv, Yv }, 0 },
252b5132 1991 /* a8 */
bf890a93
IT
1992 { "testB", { AL, Ib }, 0 },
1993 { "testS", { eAX, Iv }, 0 },
1994 { "stosB", { Ybr, AL }, 0 },
1995 { "stosS", { Yvr, eAX }, 0 },
1996 { "lodsB", { ALr, Xb }, 0 },
1997 { "lodsS", { eAXr, Xv }, 0 },
1998 { "scasB", { AL, Yb }, 0 },
1999 { "scasS", { eAX, Yv }, 0 },
252b5132 2000 /* b0 */
bf890a93
IT
2001 { "movB", { RMAL, Ib }, 0 },
2002 { "movB", { RMCL, Ib }, 0 },
2003 { "movB", { RMDL, Ib }, 0 },
2004 { "movB", { RMBL, Ib }, 0 },
2005 { "movB", { RMAH, Ib }, 0 },
2006 { "movB", { RMCH, Ib }, 0 },
2007 { "movB", { RMDH, Ib }, 0 },
2008 { "movB", { RMBH, Ib }, 0 },
252b5132 2009 /* b8 */
bf890a93
IT
2010 { "mov%LV", { RMeAX, Iv64 }, 0 },
2011 { "mov%LV", { RMeCX, Iv64 }, 0 },
2012 { "mov%LV", { RMeDX, Iv64 }, 0 },
2013 { "mov%LV", { RMeBX, Iv64 }, 0 },
2014 { "mov%LV", { RMeSP, Iv64 }, 0 },
2015 { "mov%LV", { RMeBP, Iv64 }, 0 },
2016 { "mov%LV", { RMeSI, Iv64 }, 0 },
2017 { "mov%LV", { RMeDI, Iv64 }, 0 },
252b5132 2018 /* c0 */
1ceb70f8
L
2019 { REG_TABLE (REG_C0) },
2020 { REG_TABLE (REG_C1) },
aeab2b26
JB
2021 { X86_64_TABLE (X86_64_C2) },
2022 { X86_64_TABLE (X86_64_C3) },
4e7d34a6
L
2023 { X86_64_TABLE (X86_64_C4) },
2024 { X86_64_TABLE (X86_64_C5) },
1ceb70f8
L
2025 { REG_TABLE (REG_C6) },
2026 { REG_TABLE (REG_C7) },
252b5132 2027 /* c8 */
36938cab
JB
2028 { "enterP", { Iw, Ib }, 0 },
2029 { "leaveP", { XX }, 0 },
2030 { "{l|}ret{|f}%LP", { Iw }, 0 },
2031 { "{l|}ret{|f}%LP", { XX }, 0 },
bf890a93
IT
2032 { "int3", { XX }, 0 },
2033 { "int", { Ib }, 0 },
4e7d34a6 2034 { X86_64_TABLE (X86_64_CE) },
bf890a93 2035 { "iret%LP", { XX }, 0 },
252b5132 2036 /* d0 */
1ceb70f8
L
2037 { REG_TABLE (REG_D0) },
2038 { REG_TABLE (REG_D1) },
2039 { REG_TABLE (REG_D2) },
2040 { REG_TABLE (REG_D3) },
4e7d34a6
L
2041 { X86_64_TABLE (X86_64_D4) },
2042 { X86_64_TABLE (X86_64_D5) },
592d1631 2043 { Bad_Opcode },
bf890a93 2044 { "xlat", { DSBX }, 0 },
252b5132
RH
2045 /* d8 */
2046 { FLOAT },
2047 { FLOAT },
2048 { FLOAT },
2049 { FLOAT },
2050 { FLOAT },
2051 { FLOAT },
2052 { FLOAT },
2053 { FLOAT },
2054 /* e0 */
bf890a93
IT
2055 { "loopneFH", { Jb, XX, loop_jcxz_flag }, 0 },
2056 { "loopeFH", { Jb, XX, loop_jcxz_flag }, 0 },
2057 { "loopFH", { Jb, XX, loop_jcxz_flag }, 0 },
2058 { "jEcxzH", { Jb, XX, loop_jcxz_flag }, 0 },
2059 { "inB", { AL, Ib }, 0 },
2060 { "inG", { zAX, Ib }, 0 },
2061 { "outB", { Ib, AL }, 0 },
2062 { "outG", { Ib, zAX }, 0 },
252b5132 2063 /* e8 */
a72d2af2
L
2064 { X86_64_TABLE (X86_64_E8) },
2065 { X86_64_TABLE (X86_64_E9) },
4e7d34a6 2066 { X86_64_TABLE (X86_64_EA) },
bf890a93
IT
2067 { "jmp", { Jb, BND }, 0 },
2068 { "inB", { AL, indirDX }, 0 },
2069 { "inG", { zAX, indirDX }, 0 },
2070 { "outB", { indirDX, AL }, 0 },
2071 { "outG", { indirDX, zAX }, 0 },
252b5132 2072 /* f0 */
592d1631 2073 { Bad_Opcode }, /* lock prefix */
bf890a93 2074 { "icebp", { XX }, 0 },
592d1631
L
2075 { Bad_Opcode }, /* repne */
2076 { Bad_Opcode }, /* repz */
bf890a93
IT
2077 { "hlt", { XX }, 0 },
2078 { "cmc", { XX }, 0 },
1ceb70f8
L
2079 { REG_TABLE (REG_F6) },
2080 { REG_TABLE (REG_F7) },
252b5132 2081 /* f8 */
bf890a93
IT
2082 { "clc", { XX }, 0 },
2083 { "stc", { XX }, 0 },
2084 { "cli", { XX }, 0 },
2085 { "sti", { XX }, 0 },
2086 { "cld", { XX }, 0 },
2087 { "std", { XX }, 0 },
1ceb70f8
L
2088 { REG_TABLE (REG_FE) },
2089 { REG_TABLE (REG_FF) },
252b5132
RH
2090};
2091
6439fc28 2092static const struct dis386 dis386_twobyte[] = {
252b5132 2093 /* 00 */
1ceb70f8
L
2094 { REG_TABLE (REG_0F00 ) },
2095 { REG_TABLE (REG_0F01 ) },
bf890a93
IT
2096 { "larS", { Gv, Ew }, 0 },
2097 { "lslS", { Gv, Ew }, 0 },
592d1631 2098 { Bad_Opcode },
bf890a93
IT
2099 { "syscall", { XX }, 0 },
2100 { "clts", { XX }, 0 },
589958d6 2101 { "sysret%LQ", { XX }, 0 },
252b5132 2102 /* 08 */
bf890a93 2103 { "invd", { XX }, 0 },
3233d7d0 2104 { PREFIX_TABLE (PREFIX_0F09) },
592d1631 2105 { Bad_Opcode },
bf890a93 2106 { "ud2", { XX }, 0 },
592d1631 2107 { Bad_Opcode },
b5b1fc4f 2108 { REG_TABLE (REG_0F0D) },
bf890a93
IT
2109 { "femms", { XX }, 0 },
2110 { "", { MX, EM, OPSUF }, 0 }, /* See OP_3DNowSuffix. */
252b5132 2111 /* 10 */
1ceb70f8
L
2112 { PREFIX_TABLE (PREFIX_0F10) },
2113 { PREFIX_TABLE (PREFIX_0F11) },
2114 { PREFIX_TABLE (PREFIX_0F12) },
2115 { MOD_TABLE (MOD_0F13) },
507bd325
L
2116 { "unpcklpX", { XM, EXx }, PREFIX_OPCODE },
2117 { "unpckhpX", { XM, EXx }, PREFIX_OPCODE },
1ceb70f8
L
2118 { PREFIX_TABLE (PREFIX_0F16) },
2119 { MOD_TABLE (MOD_0F17) },
252b5132 2120 /* 18 */
1ceb70f8 2121 { REG_TABLE (REG_0F18) },
bf890a93 2122 { "nopQ", { Ev }, 0 },
7e8b059b
L
2123 { PREFIX_TABLE (PREFIX_0F1A) },
2124 { PREFIX_TABLE (PREFIX_0F1B) },
c48935d7 2125 { PREFIX_TABLE (PREFIX_0F1C) },
bf890a93 2126 { "nopQ", { Ev }, 0 },
603555e5 2127 { PREFIX_TABLE (PREFIX_0F1E) },
bf890a93 2128 { "nopQ", { Ev }, 0 },
252b5132 2129 /* 20 */
78467458
JB
2130 { "movZ", { Em, Cm }, 0 },
2131 { "movZ", { Em, Dm }, 0 },
2132 { "movZ", { Cm, Em }, 0 },
2133 { "movZ", { Dm, Em }, 0 },
2134 { X86_64_TABLE (X86_64_0F24) },
592d1631 2135 { Bad_Opcode },
78467458 2136 { X86_64_TABLE (X86_64_0F26) },
592d1631 2137 { Bad_Opcode },
252b5132 2138 /* 28 */
507bd325
L
2139 { "movapX", { XM, EXx }, PREFIX_OPCODE },
2140 { "movapX", { EXxS, XM }, PREFIX_OPCODE },
1ceb70f8
L
2141 { PREFIX_TABLE (PREFIX_0F2A) },
2142 { PREFIX_TABLE (PREFIX_0F2B) },
2143 { PREFIX_TABLE (PREFIX_0F2C) },
2144 { PREFIX_TABLE (PREFIX_0F2D) },
2145 { PREFIX_TABLE (PREFIX_0F2E) },
2146 { PREFIX_TABLE (PREFIX_0F2F) },
252b5132 2147 /* 30 */
bf890a93
IT
2148 { "wrmsr", { XX }, 0 },
2149 { "rdtsc", { XX }, 0 },
2150 { "rdmsr", { XX }, 0 },
2151 { "rdpmc", { XX }, 0 },
d835a58b
JB
2152 { "sysenter", { SEP }, 0 },
2153 { "sysexit", { SEP }, 0 },
592d1631 2154 { Bad_Opcode },
bf890a93 2155 { "getsec", { XX }, 0 },
252b5132 2156 /* 38 */
507bd325 2157 { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F38, PREFIX_OPCODE) },
592d1631 2158 { Bad_Opcode },
507bd325 2159 { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F3A, PREFIX_OPCODE) },
592d1631
L
2160 { Bad_Opcode },
2161 { Bad_Opcode },
2162 { Bad_Opcode },
2163 { Bad_Opcode },
2164 { Bad_Opcode },
252b5132 2165 /* 40 */
bf890a93
IT
2166 { "cmovoS", { Gv, Ev }, 0 },
2167 { "cmovnoS", { Gv, Ev }, 0 },
2168 { "cmovbS", { Gv, Ev }, 0 },
2169 { "cmovaeS", { Gv, Ev }, 0 },
2170 { "cmoveS", { Gv, Ev }, 0 },
2171 { "cmovneS", { Gv, Ev }, 0 },
2172 { "cmovbeS", { Gv, Ev }, 0 },
2173 { "cmovaS", { Gv, Ev }, 0 },
252b5132 2174 /* 48 */
bf890a93
IT
2175 { "cmovsS", { Gv, Ev }, 0 },
2176 { "cmovnsS", { Gv, Ev }, 0 },
2177 { "cmovpS", { Gv, Ev }, 0 },
2178 { "cmovnpS", { Gv, Ev }, 0 },
2179 { "cmovlS", { Gv, Ev }, 0 },
2180 { "cmovgeS", { Gv, Ev }, 0 },
2181 { "cmovleS", { Gv, Ev }, 0 },
2182 { "cmovgS", { Gv, Ev }, 0 },
252b5132 2183 /* 50 */
a5aaedb9 2184 { MOD_TABLE (MOD_0F50) },
1ceb70f8
L
2185 { PREFIX_TABLE (PREFIX_0F51) },
2186 { PREFIX_TABLE (PREFIX_0F52) },
2187 { PREFIX_TABLE (PREFIX_0F53) },
507bd325
L
2188 { "andpX", { XM, EXx }, PREFIX_OPCODE },
2189 { "andnpX", { XM, EXx }, PREFIX_OPCODE },
2190 { "orpX", { XM, EXx }, PREFIX_OPCODE },
2191 { "xorpX", { XM, EXx }, PREFIX_OPCODE },
252b5132 2192 /* 58 */
1ceb70f8
L
2193 { PREFIX_TABLE (PREFIX_0F58) },
2194 { PREFIX_TABLE (PREFIX_0F59) },
2195 { PREFIX_TABLE (PREFIX_0F5A) },
2196 { PREFIX_TABLE (PREFIX_0F5B) },
2197 { PREFIX_TABLE (PREFIX_0F5C) },
2198 { PREFIX_TABLE (PREFIX_0F5D) },
2199 { PREFIX_TABLE (PREFIX_0F5E) },
2200 { PREFIX_TABLE (PREFIX_0F5F) },
252b5132 2201 /* 60 */
1ceb70f8
L
2202 { PREFIX_TABLE (PREFIX_0F60) },
2203 { PREFIX_TABLE (PREFIX_0F61) },
2204 { PREFIX_TABLE (PREFIX_0F62) },
507bd325
L
2205 { "packsswb", { MX, EM }, PREFIX_OPCODE },
2206 { "pcmpgtb", { MX, EM }, PREFIX_OPCODE },
2207 { "pcmpgtw", { MX, EM }, PREFIX_OPCODE },
2208 { "pcmpgtd", { MX, EM }, PREFIX_OPCODE },
2209 { "packuswb", { MX, EM }, PREFIX_OPCODE },
252b5132 2210 /* 68 */
507bd325
L
2211 { "punpckhbw", { MX, EM }, PREFIX_OPCODE },
2212 { "punpckhwd", { MX, EM }, PREFIX_OPCODE },
2213 { "punpckhdq", { MX, EM }, PREFIX_OPCODE },
2214 { "packssdw", { MX, EM }, PREFIX_OPCODE },
7531c613
JB
2215 { "punpcklqdq", { XM, EXx }, PREFIX_DATA },
2216 { "punpckhqdq", { XM, EXx }, PREFIX_DATA },
507bd325 2217 { "movK", { MX, Edq }, PREFIX_OPCODE },
1ceb70f8 2218 { PREFIX_TABLE (PREFIX_0F6F) },
252b5132 2219 /* 70 */
1ceb70f8
L
2220 { PREFIX_TABLE (PREFIX_0F70) },
2221 { REG_TABLE (REG_0F71) },
2222 { REG_TABLE (REG_0F72) },
2223 { REG_TABLE (REG_0F73) },
507bd325
L
2224 { "pcmpeqb", { MX, EM }, PREFIX_OPCODE },
2225 { "pcmpeqw", { MX, EM }, PREFIX_OPCODE },
2226 { "pcmpeqd", { MX, EM }, PREFIX_OPCODE },
2227 { "emms", { XX }, PREFIX_OPCODE },
252b5132 2228 /* 78 */
1ceb70f8
L
2229 { PREFIX_TABLE (PREFIX_0F78) },
2230 { PREFIX_TABLE (PREFIX_0F79) },
1f334aeb 2231 { Bad_Opcode },
592d1631 2232 { Bad_Opcode },
1ceb70f8
L
2233 { PREFIX_TABLE (PREFIX_0F7C) },
2234 { PREFIX_TABLE (PREFIX_0F7D) },
2235 { PREFIX_TABLE (PREFIX_0F7E) },
2236 { PREFIX_TABLE (PREFIX_0F7F) },
252b5132 2237 /* 80 */
bf890a93
IT
2238 { "joH", { Jv, BND, cond_jump_flag }, 0 },
2239 { "jnoH", { Jv, BND, cond_jump_flag }, 0 },
2240 { "jbH", { Jv, BND, cond_jump_flag }, 0 },
2241 { "jaeH", { Jv, BND, cond_jump_flag }, 0 },
2242 { "jeH", { Jv, BND, cond_jump_flag }, 0 },
2243 { "jneH", { Jv, BND, cond_jump_flag }, 0 },
2244 { "jbeH", { Jv, BND, cond_jump_flag }, 0 },
2245 { "jaH", { Jv, BND, cond_jump_flag }, 0 },
252b5132 2246 /* 88 */
bf890a93
IT
2247 { "jsH", { Jv, BND, cond_jump_flag }, 0 },
2248 { "jnsH", { Jv, BND, cond_jump_flag }, 0 },
2249 { "jpH", { Jv, BND, cond_jump_flag }, 0 },
2250 { "jnpH", { Jv, BND, cond_jump_flag }, 0 },
2251 { "jlH", { Jv, BND, cond_jump_flag }, 0 },
2252 { "jgeH", { Jv, BND, cond_jump_flag }, 0 },
2253 { "jleH", { Jv, BND, cond_jump_flag }, 0 },
2254 { "jgH", { Jv, BND, cond_jump_flag }, 0 },
252b5132 2255 /* 90 */
bf890a93
IT
2256 { "seto", { Eb }, 0 },
2257 { "setno", { Eb }, 0 },
2258 { "setb", { Eb }, 0 },
2259 { "setae", { Eb }, 0 },
2260 { "sete", { Eb }, 0 },
2261 { "setne", { Eb }, 0 },
2262 { "setbe", { Eb }, 0 },
2263 { "seta", { Eb }, 0 },
252b5132 2264 /* 98 */
bf890a93
IT
2265 { "sets", { Eb }, 0 },
2266 { "setns", { Eb }, 0 },
2267 { "setp", { Eb }, 0 },
2268 { "setnp", { Eb }, 0 },
2269 { "setl", { Eb }, 0 },
2270 { "setge", { Eb }, 0 },
2271 { "setle", { Eb }, 0 },
2272 { "setg", { Eb }, 0 },
252b5132 2273 /* a0 */
36938cab
JB
2274 { "pushP", { fs }, 0 },
2275 { "popP", { fs }, 0 },
bf890a93
IT
2276 { "cpuid", { XX }, 0 },
2277 { "btS", { Ev, Gv }, 0 },
2278 { "shldS", { Ev, Gv, Ib }, 0 },
2279 { "shldS", { Ev, Gv, CL }, 0 },
1ceb70f8
L
2280 { REG_TABLE (REG_0FA6) },
2281 { REG_TABLE (REG_0FA7) },
252b5132 2282 /* a8 */
36938cab
JB
2283 { "pushP", { gs }, 0 },
2284 { "popP", { gs }, 0 },
bf890a93
IT
2285 { "rsm", { XX }, 0 },
2286 { "btsS", { Evh1, Gv }, 0 },
2287 { "shrdS", { Ev, Gv, Ib }, 0 },
2288 { "shrdS", { Ev, Gv, CL }, 0 },
1ceb70f8 2289 { REG_TABLE (REG_0FAE) },
bf890a93 2290 { "imulS", { Gv, Ev }, 0 },
252b5132 2291 /* b0 */
bf890a93
IT
2292 { "cmpxchgB", { Ebh1, Gb }, 0 },
2293 { "cmpxchgS", { Evh1, Gv }, 0 },
1ceb70f8 2294 { MOD_TABLE (MOD_0FB2) },
bf890a93 2295 { "btrS", { Evh1, Gv }, 0 },
1ceb70f8
L
2296 { MOD_TABLE (MOD_0FB4) },
2297 { MOD_TABLE (MOD_0FB5) },
bf890a93
IT
2298 { "movz{bR|x}", { Gv, Eb }, 0 },
2299 { "movz{wR|x}", { Gv, Ew }, 0 }, /* yes, there really is movzww ! */
252b5132 2300 /* b8 */
1ceb70f8 2301 { PREFIX_TABLE (PREFIX_0FB8) },
66f1eba0 2302 { "ud1S", { Gv, Ev }, 0 },
1ceb70f8 2303 { REG_TABLE (REG_0FBA) },
bf890a93 2304 { "btcS", { Evh1, Gv }, 0 },
f12dc422 2305 { PREFIX_TABLE (PREFIX_0FBC) },
1ceb70f8 2306 { PREFIX_TABLE (PREFIX_0FBD) },
bf890a93
IT
2307 { "movs{bR|x}", { Gv, Eb }, 0 },
2308 { "movs{wR|x}", { Gv, Ew }, 0 }, /* yes, there really is movsww ! */
252b5132 2309 /* c0 */
bf890a93
IT
2310 { "xaddB", { Ebh1, Gb }, 0 },
2311 { "xaddS", { Evh1, Gv }, 0 },
1ceb70f8 2312 { PREFIX_TABLE (PREFIX_0FC2) },
a8484f96 2313 { MOD_TABLE (MOD_0FC3) },
507bd325
L
2314 { "pinsrw", { MX, Edqw, Ib }, PREFIX_OPCODE },
2315 { "pextrw", { Gdq, MS, Ib }, PREFIX_OPCODE },
2316 { "shufpX", { XM, EXx, Ib }, PREFIX_OPCODE },
1ceb70f8 2317 { REG_TABLE (REG_0FC7) },
252b5132 2318 /* c8 */
bf890a93
IT
2319 { "bswap", { RMeAX }, 0 },
2320 { "bswap", { RMeCX }, 0 },
2321 { "bswap", { RMeDX }, 0 },
2322 { "bswap", { RMeBX }, 0 },
2323 { "bswap", { RMeSP }, 0 },
2324 { "bswap", { RMeBP }, 0 },
2325 { "bswap", { RMeSI }, 0 },
2326 { "bswap", { RMeDI }, 0 },
252b5132 2327 /* d0 */
1ceb70f8 2328 { PREFIX_TABLE (PREFIX_0FD0) },
507bd325
L
2329 { "psrlw", { MX, EM }, PREFIX_OPCODE },
2330 { "psrld", { MX, EM }, PREFIX_OPCODE },
2331 { "psrlq", { MX, EM }, PREFIX_OPCODE },
2332 { "paddq", { MX, EM }, PREFIX_OPCODE },
2333 { "pmullw", { MX, EM }, PREFIX_OPCODE },
1ceb70f8 2334 { PREFIX_TABLE (PREFIX_0FD6) },
75c135a8 2335 { MOD_TABLE (MOD_0FD7) },
252b5132 2336 /* d8 */
507bd325
L
2337 { "psubusb", { MX, EM }, PREFIX_OPCODE },
2338 { "psubusw", { MX, EM }, PREFIX_OPCODE },
2339 { "pminub", { MX, EM }, PREFIX_OPCODE },
2340 { "pand", { MX, EM }, PREFIX_OPCODE },
2341 { "paddusb", { MX, EM }, PREFIX_OPCODE },
2342 { "paddusw", { MX, EM }, PREFIX_OPCODE },
2343 { "pmaxub", { MX, EM }, PREFIX_OPCODE },
2344 { "pandn", { MX, EM }, PREFIX_OPCODE },
252b5132 2345 /* e0 */
507bd325
L
2346 { "pavgb", { MX, EM }, PREFIX_OPCODE },
2347 { "psraw", { MX, EM }, PREFIX_OPCODE },
2348 { "psrad", { MX, EM }, PREFIX_OPCODE },
2349 { "pavgw", { MX, EM }, PREFIX_OPCODE },
2350 { "pmulhuw", { MX, EM }, PREFIX_OPCODE },
2351 { "pmulhw", { MX, EM }, PREFIX_OPCODE },
1ceb70f8
L
2352 { PREFIX_TABLE (PREFIX_0FE6) },
2353 { PREFIX_TABLE (PREFIX_0FE7) },
252b5132 2354 /* e8 */
507bd325
L
2355 { "psubsb", { MX, EM }, PREFIX_OPCODE },
2356 { "psubsw", { MX, EM }, PREFIX_OPCODE },
2357 { "pminsw", { MX, EM }, PREFIX_OPCODE },
2358 { "por", { MX, EM }, PREFIX_OPCODE },
2359 { "paddsb", { MX, EM }, PREFIX_OPCODE },
2360 { "paddsw", { MX, EM }, PREFIX_OPCODE },
2361 { "pmaxsw", { MX, EM }, PREFIX_OPCODE },
2362 { "pxor", { MX, EM }, PREFIX_OPCODE },
252b5132 2363 /* f0 */
1ceb70f8 2364 { PREFIX_TABLE (PREFIX_0FF0) },
507bd325
L
2365 { "psllw", { MX, EM }, PREFIX_OPCODE },
2366 { "pslld", { MX, EM }, PREFIX_OPCODE },
2367 { "psllq", { MX, EM }, PREFIX_OPCODE },
2368 { "pmuludq", { MX, EM }, PREFIX_OPCODE },
2369 { "pmaddwd", { MX, EM }, PREFIX_OPCODE },
2370 { "psadbw", { MX, EM }, PREFIX_OPCODE },
1ceb70f8 2371 { PREFIX_TABLE (PREFIX_0FF7) },
252b5132 2372 /* f8 */
507bd325
L
2373 { "psubb", { MX, EM }, PREFIX_OPCODE },
2374 { "psubw", { MX, EM }, PREFIX_OPCODE },
2375 { "psubd", { MX, EM }, PREFIX_OPCODE },
2376 { "psubq", { MX, EM }, PREFIX_OPCODE },
2377 { "paddb", { MX, EM }, PREFIX_OPCODE },
2378 { "paddw", { MX, EM }, PREFIX_OPCODE },
2379 { "paddd", { MX, EM }, PREFIX_OPCODE },
66f1eba0 2380 { "ud0S", { Gv, Ev }, 0 },
252b5132
RH
2381};
2382
2383static const unsigned char onebyte_has_modrm[256] = {
c608c12e
AM
2384 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2385 /* ------------------------------- */
2386 /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
2387 /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
2388 /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
2389 /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
2390 /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
2391 /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
2392 /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
2393 /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
2394 /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
2395 /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
2396 /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
2397 /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
2398 /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
2399 /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
2400 /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
2401 /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1 /* f0 */
2402 /* ------------------------------- */
2403 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
252b5132
RH
2404};
2405
2406static const unsigned char twobyte_has_modrm[256] = {
c608c12e
AM
2407 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2408 /* ------------------------------- */
252b5132 2409 /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
b5b1fc4f 2410 /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
85f10a01 2411 /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
331d2d0d 2412 /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
252b5132 2413 /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
4bba6815
AM
2414 /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
2415 /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
85f10a01 2416 /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
252b5132
RH
2417 /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
2418 /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
30d1c836 2419 /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
66f1eba0 2420 /* b0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* bf */
252b5132 2421 /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
ca164297 2422 /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
4bba6815 2423 /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
66f1eba0 2424 /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 /* ff */
c608c12e
AM
2425 /* ------------------------------- */
2426 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2427};
2428
252b5132
RH
2429static char obuf[100];
2430static char *obufp;
ea397f5b 2431static char *mnemonicendp;
252b5132
RH
2432static char scratchbuf[100];
2433static unsigned char *start_codep;
2434static unsigned char *insn_codep;
2435static unsigned char *codep;
285ca992 2436static unsigned char *end_codep;
f16cd0d5
L
2437static int last_lock_prefix;
2438static int last_repz_prefix;
2439static int last_repnz_prefix;
2440static int last_data_prefix;
2441static int last_addr_prefix;
2442static int last_rex_prefix;
2443static int last_seg_prefix;
d9949a36 2444static int fwait_prefix;
285ca992
L
2445/* The active segment register prefix. */
2446static int active_seg_prefix;
f16cd0d5
L
2447#define MAX_CODE_LENGTH 15
2448/* We can up to 14 prefixes since the maximum instruction length is
2449 15bytes. */
2450static int all_prefixes[MAX_CODE_LENGTH - 1];
252b5132 2451static disassemble_info *the_info;
7967e09e
L
2452static struct
2453 {
2454 int mod;
7967e09e 2455 int reg;
484c222e 2456 int rm;
7967e09e
L
2457 }
2458modrm;
4bba6815 2459static unsigned char need_modrm;
dfc8cf43
L
2460static struct
2461 {
2462 int scale;
2463 int index;
2464 int base;
2465 }
2466sib;
c0f3af97
L
2467static struct
2468 {
2469 int register_specifier;
2470 int length;
2471 int prefix;
2472 int w;
43234a1e
L
2473 int evex;
2474 int r;
2475 int v;
2476 int mask_register_specifier;
2477 int zeroing;
2478 int ll;
2479 int b;
c0f3af97
L
2480 }
2481vex;
2482static unsigned char need_vex;
252b5132 2483
ea397f5b
L
2484struct op
2485 {
2486 const char *name;
2487 unsigned int len;
2488 };
2489
4bba6815
AM
2490/* If we are accessing mod/rm/reg without need_modrm set, then the
2491 values are stale. Hitting this abort likely indicates that you
2492 need to update onebyte_has_modrm or twobyte_has_modrm. */
2493#define MODRM_CHECK if (!need_modrm) abort ()
2494
d708bcba
AM
2495static const char **names64;
2496static const char **names32;
2497static const char **names16;
2498static const char **names8;
2499static const char **names8rex;
2500static const char **names_seg;
db51cc60
L
2501static const char *index64;
2502static const char *index32;
d708bcba 2503static const char **index16;
7e8b059b 2504static const char **names_bnd;
d708bcba
AM
2505
2506static const char *intel_names64[] = {
2507 "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
2508 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2509};
2510static const char *intel_names32[] = {
2511 "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
2512 "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
2513};
2514static const char *intel_names16[] = {
2515 "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
2516 "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
2517};
2518static const char *intel_names8[] = {
2519 "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
2520};
2521static const char *intel_names8rex[] = {
2522 "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
2523 "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
2524};
2525static const char *intel_names_seg[] = {
2526 "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
2527};
db51cc60
L
2528static const char *intel_index64 = "riz";
2529static const char *intel_index32 = "eiz";
d708bcba
AM
2530static const char *intel_index16[] = {
2531 "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
2532};
2533
2534static const char *att_names64[] = {
2535 "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
52b15da3
JH
2536 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
2537};
d708bcba
AM
2538static const char *att_names32[] = {
2539 "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
52b15da3 2540 "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
252b5132 2541};
d708bcba
AM
2542static const char *att_names16[] = {
2543 "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
52b15da3 2544 "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
252b5132 2545};
d708bcba
AM
2546static const char *att_names8[] = {
2547 "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
252b5132 2548};
d708bcba
AM
2549static const char *att_names8rex[] = {
2550 "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
52b15da3
JH
2551 "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
2552};
d708bcba
AM
2553static const char *att_names_seg[] = {
2554 "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
252b5132 2555};
db51cc60
L
2556static const char *att_index64 = "%riz";
2557static const char *att_index32 = "%eiz";
d708bcba
AM
2558static const char *att_index16[] = {
2559 "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
252b5132
RH
2560};
2561
b9733481
L
2562static const char **names_mm;
2563static const char *intel_names_mm[] = {
2564 "mm0", "mm1", "mm2", "mm3",
2565 "mm4", "mm5", "mm6", "mm7"
2566};
2567static const char *att_names_mm[] = {
2568 "%mm0", "%mm1", "%mm2", "%mm3",
2569 "%mm4", "%mm5", "%mm6", "%mm7"
2570};
2571
7e8b059b
L
2572static const char *intel_names_bnd[] = {
2573 "bnd0", "bnd1", "bnd2", "bnd3"
2574};
2575
2576static const char *att_names_bnd[] = {
2577 "%bnd0", "%bnd1", "%bnd2", "%bnd3"
2578};
2579
b9733481
L
2580static const char **names_xmm;
2581static const char *intel_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};
2591static const char *att_names_xmm[] = {
2592 "%xmm0", "%xmm1", "%xmm2", "%xmm3",
2593 "%xmm4", "%xmm5", "%xmm6", "%xmm7",
2594 "%xmm8", "%xmm9", "%xmm10", "%xmm11",
43234a1e
L
2595 "%xmm12", "%xmm13", "%xmm14", "%xmm15",
2596 "%xmm16", "%xmm17", "%xmm18", "%xmm19",
2597 "%xmm20", "%xmm21", "%xmm22", "%xmm23",
2598 "%xmm24", "%xmm25", "%xmm26", "%xmm27",
2599 "%xmm28", "%xmm29", "%xmm30", "%xmm31"
b9733481
L
2600};
2601
2602static const char **names_ymm;
2603static const char *intel_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"
b9733481
L
2612};
2613static const char *att_names_ymm[] = {
2614 "%ymm0", "%ymm1", "%ymm2", "%ymm3",
2615 "%ymm4", "%ymm5", "%ymm6", "%ymm7",
2616 "%ymm8", "%ymm9", "%ymm10", "%ymm11",
43234a1e
L
2617 "%ymm12", "%ymm13", "%ymm14", "%ymm15",
2618 "%ymm16", "%ymm17", "%ymm18", "%ymm19",
2619 "%ymm20", "%ymm21", "%ymm22", "%ymm23",
2620 "%ymm24", "%ymm25", "%ymm26", "%ymm27",
2621 "%ymm28", "%ymm29", "%ymm30", "%ymm31"
2622};
2623
2624static const char **names_zmm;
2625static const char *intel_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};
2635static const char *att_names_zmm[] = {
2636 "%zmm0", "%zmm1", "%zmm2", "%zmm3",
2637 "%zmm4", "%zmm5", "%zmm6", "%zmm7",
2638 "%zmm8", "%zmm9", "%zmm10", "%zmm11",
2639 "%zmm12", "%zmm13", "%zmm14", "%zmm15",
2640 "%zmm16", "%zmm17", "%zmm18", "%zmm19",
2641 "%zmm20", "%zmm21", "%zmm22", "%zmm23",
2642 "%zmm24", "%zmm25", "%zmm26", "%zmm27",
2643 "%zmm28", "%zmm29", "%zmm30", "%zmm31"
2644};
2645
260cd341
LC
2646static const char **names_tmm;
2647static const char *intel_names_tmm[] = {
2648 "tmm0", "tmm1", "tmm2", "tmm3",
2649 "tmm4", "tmm5", "tmm6", "tmm7"
2650};
2651static const char *att_names_tmm[] = {
2652 "%tmm0", "%tmm1", "%tmm2", "%tmm3",
2653 "%tmm4", "%tmm5", "%tmm6", "%tmm7"
2654};
2655
43234a1e
L
2656static const char **names_mask;
2657static const char *intel_names_mask[] = {
2658 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7"
2659};
2660static const char *att_names_mask[] = {
2661 "%k0", "%k1", "%k2", "%k3", "%k4", "%k5", "%k6", "%k7"
2662};
2663
2664static const char *names_rounding[] =
2665{
2666 "{rn-sae}",
2667 "{rd-sae}",
2668 "{ru-sae}",
2669 "{rz-sae}"
b9733481
L
2670};
2671
1ceb70f8
L
2672static const struct dis386 reg_table[][8] = {
2673 /* REG_80 */
252b5132 2674 {
bf890a93
IT
2675 { "addA", { Ebh1, Ib }, 0 },
2676 { "orA", { Ebh1, Ib }, 0 },
2677 { "adcA", { Ebh1, Ib }, 0 },
2678 { "sbbA", { Ebh1, Ib }, 0 },
2679 { "andA", { Ebh1, Ib }, 0 },
2680 { "subA", { Ebh1, Ib }, 0 },
2681 { "xorA", { Ebh1, Ib }, 0 },
2682 { "cmpA", { Eb, Ib }, 0 },
252b5132 2683 },
1ceb70f8 2684 /* REG_81 */
252b5132 2685 {
bf890a93
IT
2686 { "addQ", { Evh1, Iv }, 0 },
2687 { "orQ", { Evh1, Iv }, 0 },
2688 { "adcQ", { Evh1, Iv }, 0 },
2689 { "sbbQ", { Evh1, Iv }, 0 },
2690 { "andQ", { Evh1, Iv }, 0 },
2691 { "subQ", { Evh1, Iv }, 0 },
2692 { "xorQ", { Evh1, Iv }, 0 },
2693 { "cmpQ", { Ev, Iv }, 0 },
252b5132 2694 },
7148c369 2695 /* REG_83 */
252b5132 2696 {
bf890a93
IT
2697 { "addQ", { Evh1, sIb }, 0 },
2698 { "orQ", { Evh1, sIb }, 0 },
2699 { "adcQ", { Evh1, sIb }, 0 },
2700 { "sbbQ", { Evh1, sIb }, 0 },
2701 { "andQ", { Evh1, sIb }, 0 },
2702 { "subQ", { Evh1, sIb }, 0 },
2703 { "xorQ", { Evh1, sIb }, 0 },
2704 { "cmpQ", { Ev, sIb }, 0 },
252b5132 2705 },
1ceb70f8 2706 /* REG_8F */
4e7d34a6 2707 {
36938cab 2708 { "pop{P|}", { stackEv }, 0 },
c48244a5 2709 { XOP_8F_TABLE (XOP_09) },
592d1631
L
2710 { Bad_Opcode },
2711 { Bad_Opcode },
2712 { Bad_Opcode },
f88c9eb0 2713 { XOP_8F_TABLE (XOP_09) },
4e7d34a6 2714 },
1ceb70f8 2715 /* REG_C0 */
252b5132 2716 {
bf890a93
IT
2717 { "rolA", { Eb, Ib }, 0 },
2718 { "rorA", { Eb, Ib }, 0 },
2719 { "rclA", { Eb, Ib }, 0 },
2720 { "rcrA", { Eb, Ib }, 0 },
2721 { "shlA", { Eb, Ib }, 0 },
2722 { "shrA", { Eb, Ib }, 0 },
e4bdd679 2723 { "shlA", { Eb, Ib }, 0 },
bf890a93 2724 { "sarA", { Eb, Ib }, 0 },
252b5132 2725 },
1ceb70f8 2726 /* REG_C1 */
252b5132 2727 {
bf890a93
IT
2728 { "rolQ", { Ev, Ib }, 0 },
2729 { "rorQ", { Ev, Ib }, 0 },
2730 { "rclQ", { Ev, Ib }, 0 },
2731 { "rcrQ", { Ev, Ib }, 0 },
2732 { "shlQ", { Ev, Ib }, 0 },
2733 { "shrQ", { Ev, Ib }, 0 },
e4bdd679 2734 { "shlQ", { Ev, Ib }, 0 },
bf890a93 2735 { "sarQ", { Ev, Ib }, 0 },
252b5132 2736 },
1ceb70f8 2737 /* REG_C6 */
4e7d34a6 2738 {
bf890a93 2739 { "movA", { Ebh3, Ib }, 0 },
42164a71
L
2740 { Bad_Opcode },
2741 { Bad_Opcode },
2742 { Bad_Opcode },
2743 { Bad_Opcode },
2744 { Bad_Opcode },
2745 { Bad_Opcode },
2746 { MOD_TABLE (MOD_C6_REG_7) },
4e7d34a6 2747 },
1ceb70f8 2748 /* REG_C7 */
4e7d34a6 2749 {
bf890a93 2750 { "movQ", { Evh3, Iv }, 0 },
42164a71
L
2751 { Bad_Opcode },
2752 { Bad_Opcode },
2753 { Bad_Opcode },
2754 { Bad_Opcode },
2755 { Bad_Opcode },
2756 { Bad_Opcode },
2757 { MOD_TABLE (MOD_C7_REG_7) },
4e7d34a6 2758 },
1ceb70f8 2759 /* REG_D0 */
252b5132 2760 {
bf890a93
IT
2761 { "rolA", { Eb, I1 }, 0 },
2762 { "rorA", { Eb, I1 }, 0 },
2763 { "rclA", { Eb, I1 }, 0 },
2764 { "rcrA", { Eb, I1 }, 0 },
2765 { "shlA", { Eb, I1 }, 0 },
2766 { "shrA", { Eb, I1 }, 0 },
e4bdd679 2767 { "shlA", { Eb, I1 }, 0 },
bf890a93 2768 { "sarA", { Eb, I1 }, 0 },
252b5132 2769 },
1ceb70f8 2770 /* REG_D1 */
252b5132 2771 {
bf890a93
IT
2772 { "rolQ", { Ev, I1 }, 0 },
2773 { "rorQ", { Ev, I1 }, 0 },
2774 { "rclQ", { Ev, I1 }, 0 },
2775 { "rcrQ", { Ev, I1 }, 0 },
2776 { "shlQ", { Ev, I1 }, 0 },
2777 { "shrQ", { Ev, I1 }, 0 },
e4bdd679 2778 { "shlQ", { Ev, I1 }, 0 },
bf890a93 2779 { "sarQ", { Ev, I1 }, 0 },
252b5132 2780 },
1ceb70f8 2781 /* REG_D2 */
252b5132 2782 {
bf890a93
IT
2783 { "rolA", { Eb, CL }, 0 },
2784 { "rorA", { Eb, CL }, 0 },
2785 { "rclA", { Eb, CL }, 0 },
2786 { "rcrA", { Eb, CL }, 0 },
2787 { "shlA", { Eb, CL }, 0 },
2788 { "shrA", { Eb, CL }, 0 },
e4bdd679 2789 { "shlA", { Eb, CL }, 0 },
bf890a93 2790 { "sarA", { Eb, CL }, 0 },
252b5132 2791 },
1ceb70f8 2792 /* REG_D3 */
252b5132 2793 {
bf890a93
IT
2794 { "rolQ", { Ev, CL }, 0 },
2795 { "rorQ", { Ev, CL }, 0 },
2796 { "rclQ", { Ev, CL }, 0 },
2797 { "rcrQ", { Ev, CL }, 0 },
2798 { "shlQ", { Ev, CL }, 0 },
2799 { "shrQ", { Ev, CL }, 0 },
e4bdd679 2800 { "shlQ", { Ev, CL }, 0 },
bf890a93 2801 { "sarQ", { Ev, CL }, 0 },
252b5132 2802 },
1ceb70f8 2803 /* REG_F6 */
252b5132 2804 {
bf890a93 2805 { "testA", { Eb, Ib }, 0 },
7db2c588 2806 { "testA", { Eb, Ib }, 0 },
bf890a93
IT
2807 { "notA", { Ebh1 }, 0 },
2808 { "negA", { Ebh1 }, 0 },
2809 { "mulA", { Eb }, 0 }, /* Don't print the implicit %al register, */
2810 { "imulA", { Eb }, 0 }, /* to distinguish these opcodes from other */
2811 { "divA", { Eb }, 0 }, /* mul/imul opcodes. Do the same for div */
2812 { "idivA", { Eb }, 0 }, /* and idiv for consistency. */
252b5132 2813 },
1ceb70f8 2814 /* REG_F7 */
252b5132 2815 {
bf890a93 2816 { "testQ", { Ev, Iv }, 0 },
7db2c588 2817 { "testQ", { Ev, Iv }, 0 },
bf890a93
IT
2818 { "notQ", { Evh1 }, 0 },
2819 { "negQ", { Evh1 }, 0 },
2820 { "mulQ", { Ev }, 0 }, /* Don't print the implicit register. */
2821 { "imulQ", { Ev }, 0 },
2822 { "divQ", { Ev }, 0 },
2823 { "idivQ", { Ev }, 0 },
252b5132 2824 },
1ceb70f8 2825 /* REG_FE */
252b5132 2826 {
bf890a93
IT
2827 { "incA", { Ebh1 }, 0 },
2828 { "decA", { Ebh1 }, 0 },
252b5132 2829 },
1ceb70f8 2830 /* REG_FF */
252b5132 2831 {
bf890a93
IT
2832 { "incQ", { Evh1 }, 0 },
2833 { "decQ", { Evh1 }, 0 },
36938cab 2834 { "call{@|}", { NOTRACK, indirEv, BND }, 0 },
4a357820 2835 { MOD_TABLE (MOD_FF_REG_3) },
36938cab 2836 { "jmp{@|}", { NOTRACK, indirEv, BND }, 0 },
4a357820 2837 { MOD_TABLE (MOD_FF_REG_5) },
36938cab 2838 { "push{P|}", { stackEv }, 0 },
592d1631 2839 { Bad_Opcode },
252b5132 2840 },
1ceb70f8 2841 /* REG_0F00 */
252b5132 2842 {
bf890a93
IT
2843 { "sldtD", { Sv }, 0 },
2844 { "strD", { Sv }, 0 },
2845 { "lldt", { Ew }, 0 },
2846 { "ltr", { Ew }, 0 },
2847 { "verr", { Ew }, 0 },
2848 { "verw", { Ew }, 0 },
592d1631
L
2849 { Bad_Opcode },
2850 { Bad_Opcode },
252b5132 2851 },
1ceb70f8 2852 /* REG_0F01 */
252b5132 2853 {
1ceb70f8
L
2854 { MOD_TABLE (MOD_0F01_REG_0) },
2855 { MOD_TABLE (MOD_0F01_REG_1) },
2856 { MOD_TABLE (MOD_0F01_REG_2) },
2857 { MOD_TABLE (MOD_0F01_REG_3) },
bf890a93 2858 { "smswD", { Sv }, 0 },
8eab4136 2859 { MOD_TABLE (MOD_0F01_REG_5) },
bf890a93 2860 { "lmsw", { Ew }, 0 },
1ceb70f8 2861 { MOD_TABLE (MOD_0F01_REG_7) },
252b5132 2862 },
b5b1fc4f 2863 /* REG_0F0D */
252b5132 2864 {
bf890a93
IT
2865 { "prefetch", { Mb }, 0 },
2866 { "prefetchw", { Mb }, 0 },
2867 { "prefetchwt1", { Mb }, 0 },
2868 { "prefetch", { Mb }, 0 },
2869 { "prefetch", { Mb }, 0 },
2870 { "prefetch", { Mb }, 0 },
2871 { "prefetch", { Mb }, 0 },
2872 { "prefetch", { Mb }, 0 },
252b5132 2873 },
1ceb70f8 2874 /* REG_0F18 */
252b5132 2875 {
1ceb70f8
L
2876 { MOD_TABLE (MOD_0F18_REG_0) },
2877 { MOD_TABLE (MOD_0F18_REG_1) },
2878 { MOD_TABLE (MOD_0F18_REG_2) },
2879 { MOD_TABLE (MOD_0F18_REG_3) },
d7189fa5
RM
2880 { MOD_TABLE (MOD_0F18_REG_4) },
2881 { MOD_TABLE (MOD_0F18_REG_5) },
2882 { MOD_TABLE (MOD_0F18_REG_6) },
2883 { MOD_TABLE (MOD_0F18_REG_7) },
252b5132 2884 },
f8687e93 2885 /* REG_0F1C_P_0_MOD_0 */
c48935d7
IT
2886 {
2887 { "cldemote", { Mb }, 0 },
2888 { "nopQ", { Ev }, 0 },
2889 { "nopQ", { Ev }, 0 },
2890 { "nopQ", { Ev }, 0 },
2891 { "nopQ", { Ev }, 0 },
2892 { "nopQ", { Ev }, 0 },
2893 { "nopQ", { Ev }, 0 },
2894 { "nopQ", { Ev }, 0 },
2895 },
f8687e93 2896 /* REG_0F1E_P_1_MOD_3 */
603555e5
L
2897 {
2898 { "nopQ", { Ev }, 0 },
464d2b65 2899 { "rdsspK", { Edq }, PREFIX_OPCODE },
603555e5
L
2900 { "nopQ", { Ev }, 0 },
2901 { "nopQ", { Ev }, 0 },
2902 { "nopQ", { Ev }, 0 },
2903 { "nopQ", { Ev }, 0 },
2904 { "nopQ", { Ev }, 0 },
f8687e93 2905 { RM_TABLE (RM_0F1E_P_1_MOD_3_REG_7) },
603555e5 2906 },
c4694f17
TG
2907 /* REG_0F38D8_PREFIX_1 */
2908 {
2909 { "aesencwide128kl", { M }, 0 },
2910 { "aesdecwide128kl", { M }, 0 },
2911 { "aesencwide256kl", { M }, 0 },
2912 { "aesdecwide256kl", { M }, 0 },
2913 },
1ceb70f8 2914 /* REG_0F71 */
a6bd098c 2915 {
592d1631
L
2916 { Bad_Opcode },
2917 { Bad_Opcode },
1ceb70f8 2918 { MOD_TABLE (MOD_0F71_REG_2) },
592d1631 2919 { Bad_Opcode },
1ceb70f8 2920 { MOD_TABLE (MOD_0F71_REG_4) },
592d1631 2921 { Bad_Opcode },
1ceb70f8 2922 { MOD_TABLE (MOD_0F71_REG_6) },
a6bd098c 2923 },
1ceb70f8 2924 /* REG_0F72 */
a6bd098c 2925 {
592d1631
L
2926 { Bad_Opcode },
2927 { Bad_Opcode },
1ceb70f8 2928 { MOD_TABLE (MOD_0F72_REG_2) },
592d1631 2929 { Bad_Opcode },
1ceb70f8 2930 { MOD_TABLE (MOD_0F72_REG_4) },
592d1631 2931 { Bad_Opcode },
1ceb70f8 2932 { MOD_TABLE (MOD_0F72_REG_6) },
a6bd098c 2933 },
1ceb70f8 2934 /* REG_0F73 */
252b5132 2935 {
592d1631
L
2936 { Bad_Opcode },
2937 { Bad_Opcode },
1ceb70f8
L
2938 { MOD_TABLE (MOD_0F73_REG_2) },
2939 { MOD_TABLE (MOD_0F73_REG_3) },
592d1631
L
2940 { Bad_Opcode },
2941 { Bad_Opcode },
1ceb70f8
L
2942 { MOD_TABLE (MOD_0F73_REG_6) },
2943 { MOD_TABLE (MOD_0F73_REG_7) },
252b5132 2944 },
1ceb70f8 2945 /* REG_0FA6 */
252b5132 2946 {
bf890a93
IT
2947 { "montmul", { { OP_0f07, 0 } }, 0 },
2948 { "xsha1", { { OP_0f07, 0 } }, 0 },
2949 { "xsha256", { { OP_0f07, 0 } }, 0 },
4e7d34a6 2950 },
1ceb70f8 2951 /* REG_0FA7 */
4e7d34a6 2952 {
bf890a93
IT
2953 { "xstore-rng", { { OP_0f07, 0 } }, 0 },
2954 { "xcrypt-ecb", { { OP_0f07, 0 } }, 0 },
2955 { "xcrypt-cbc", { { OP_0f07, 0 } }, 0 },
2956 { "xcrypt-ctr", { { OP_0f07, 0 } }, 0 },
2957 { "xcrypt-cfb", { { OP_0f07, 0 } }, 0 },
2958 { "xcrypt-ofb", { { OP_0f07, 0 } }, 0 },
4e7d34a6 2959 },
1ceb70f8 2960 /* REG_0FAE */
4e7d34a6 2961 {
1ceb70f8
L
2962 { MOD_TABLE (MOD_0FAE_REG_0) },
2963 { MOD_TABLE (MOD_0FAE_REG_1) },
2964 { MOD_TABLE (MOD_0FAE_REG_2) },
2965 { MOD_TABLE (MOD_0FAE_REG_3) },
475a2301 2966 { MOD_TABLE (MOD_0FAE_REG_4) },
1ceb70f8
L
2967 { MOD_TABLE (MOD_0FAE_REG_5) },
2968 { MOD_TABLE (MOD_0FAE_REG_6) },
2969 { MOD_TABLE (MOD_0FAE_REG_7) },
252b5132 2970 },
1ceb70f8 2971 /* REG_0FBA */
252b5132 2972 {
592d1631
L
2973 { Bad_Opcode },
2974 { Bad_Opcode },
2975 { Bad_Opcode },
2976 { Bad_Opcode },
bf890a93
IT
2977 { "btQ", { Ev, Ib }, 0 },
2978 { "btsQ", { Evh1, Ib }, 0 },
2979 { "btrQ", { Evh1, Ib }, 0 },
2980 { "btcQ", { Evh1, Ib }, 0 },
c608c12e 2981 },
1ceb70f8 2982 /* REG_0FC7 */
c608c12e 2983 {
592d1631 2984 { Bad_Opcode },
bf890a93 2985 { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } }, 0 },
592d1631 2986 { Bad_Opcode },
963f3586
IT
2987 { MOD_TABLE (MOD_0FC7_REG_3) },
2988 { MOD_TABLE (MOD_0FC7_REG_4) },
2989 { MOD_TABLE (MOD_0FC7_REG_5) },
1ceb70f8
L
2990 { MOD_TABLE (MOD_0FC7_REG_6) },
2991 { MOD_TABLE (MOD_0FC7_REG_7) },
252b5132 2992 },
592a252b 2993 /* REG_VEX_0F71 */
c0f3af97 2994 {
592d1631
L
2995 { Bad_Opcode },
2996 { Bad_Opcode },
592a252b 2997 { MOD_TABLE (MOD_VEX_0F71_REG_2) },
592d1631 2998 { Bad_Opcode },
592a252b 2999 { MOD_TABLE (MOD_VEX_0F71_REG_4) },
592d1631 3000 { Bad_Opcode },
592a252b 3001 { MOD_TABLE (MOD_VEX_0F71_REG_6) },
c0f3af97 3002 },
592a252b 3003 /* REG_VEX_0F72 */
c0f3af97 3004 {
592d1631
L
3005 { Bad_Opcode },
3006 { Bad_Opcode },
592a252b 3007 { MOD_TABLE (MOD_VEX_0F72_REG_2) },
592d1631 3008 { Bad_Opcode },
592a252b 3009 { MOD_TABLE (MOD_VEX_0F72_REG_4) },
592d1631 3010 { Bad_Opcode },
592a252b 3011 { MOD_TABLE (MOD_VEX_0F72_REG_6) },
c0f3af97 3012 },
592a252b 3013 /* REG_VEX_0F73 */
c0f3af97 3014 {
592d1631
L
3015 { Bad_Opcode },
3016 { Bad_Opcode },
592a252b
L
3017 { MOD_TABLE (MOD_VEX_0F73_REG_2) },
3018 { MOD_TABLE (MOD_VEX_0F73_REG_3) },
592d1631
L
3019 { Bad_Opcode },
3020 { Bad_Opcode },
592a252b
L
3021 { MOD_TABLE (MOD_VEX_0F73_REG_6) },
3022 { MOD_TABLE (MOD_VEX_0F73_REG_7) },
c0f3af97 3023 },
592a252b 3024 /* REG_VEX_0FAE */
c0f3af97 3025 {
592d1631
L
3026 { Bad_Opcode },
3027 { Bad_Opcode },
592a252b
L
3028 { MOD_TABLE (MOD_VEX_0FAE_REG_2) },
3029 { MOD_TABLE (MOD_VEX_0FAE_REG_3) },
c0f3af97 3030 },
260cd341
LC
3031 /* REG_VEX_0F3849_X86_64_P_0_W_0_M_1 */
3032 {
3033 { RM_TABLE (RM_VEX_0F3849_X86_64_P_0_W_0_M_1_R_0) },
3034 },
f12dc422
L
3035 /* REG_VEX_0F38F3 */
3036 {
3037 { Bad_Opcode },
035e7389
JB
3038 { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_1) },
3039 { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_2) },
3040 { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_3) },
f12dc422 3041 },
467bbef0 3042 /* REG_0FXOP_09_01_L_0 */
2a2a0f38
QN
3043 {
3044 { Bad_Opcode },
467bbef0
JB
3045 { "blcfill", { VexGdq, Edq }, 0 },
3046 { "blsfill", { VexGdq, Edq }, 0 },
3047 { "blcs", { VexGdq, Edq }, 0 },
3048 { "tzmsk", { VexGdq, Edq }, 0 },
3049 { "blcic", { VexGdq, Edq }, 0 },
3050 { "blsic", { VexGdq, Edq }, 0 },
3051 { "t1mskc", { VexGdq, Edq }, 0 },
2a2a0f38 3052 },
467bbef0 3053 /* REG_0FXOP_09_02_L_0 */
2a2a0f38
QN
3054 {
3055 { Bad_Opcode },
467bbef0 3056 { "blcmsk", { VexGdq, Edq }, 0 },
2a2a0f38
QN
3057 { Bad_Opcode },
3058 { Bad_Opcode },
3059 { Bad_Opcode },
3060 { Bad_Opcode },
467bbef0
JB
3061 { "blci", { VexGdq, Edq }, 0 },
3062 },
3063 /* REG_0FXOP_09_12_M_1_L_0 */
3064 {
3065 { "llwpcb", { Edq }, 0 },
3066 { "slwpcb", { Edq }, 0 },
3067 },
3068 /* REG_0FXOP_0A_12_L_0 */
3069 {
3070 { "lwpins", { VexGdq, Ed, Id }, 0 },
3071 { "lwpval", { VexGdq, Ed, Id }, 0 },
2a2a0f38 3072 },
ad692897
L
3073
3074#include "i386-dis-evex-reg.h"
4e7d34a6
L
3075};
3076
1ceb70f8
L
3077static const struct dis386 prefix_table[][4] = {
3078 /* PREFIX_90 */
252b5132 3079 {
bf890a93
IT
3080 { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } }, 0 },
3081 { "pause", { XX }, 0 },
3082 { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } }, 0 },
507bd325 3083 { NULL, { { NULL, 0 } }, PREFIX_IGNORED }
0f10071e 3084 },
4e7d34a6 3085
f9630fa6 3086 /* PREFIX_0F01_REG_3_RM_1 */
a847e322
JB
3087 {
3088 { "vmmcall", { Skip_MODRM }, 0 },
3089 { "vmgexit", { Skip_MODRM }, 0 },
d27c357a
JB
3090 { Bad_Opcode },
3091 { "vmgexit", { Skip_MODRM }, 0 },
a847e322
JB
3092 },
3093
f8687e93 3094 /* PREFIX_0F01_REG_5_MOD_0 */
603555e5
L
3095 {
3096 { Bad_Opcode },
3097 { "rstorssp", { Mq }, PREFIX_OPCODE },
3098 },
3099
f8687e93 3100 /* PREFIX_0F01_REG_5_MOD_3_RM_0 */
603555e5 3101 {
4b27d27c 3102 { "serialize", { Skip_MODRM }, PREFIX_OPCODE },
2234eee6 3103 { "setssbsy", { Skip_MODRM }, PREFIX_OPCODE },
bb651e8b 3104 { Bad_Opcode },
efe30057 3105 { "xsusldtrk", { Skip_MODRM }, PREFIX_OPCODE },
bb651e8b
CL
3106 },
3107
3108 /* PREFIX_0F01_REG_5_MOD_3_RM_1 */
3109 {
3110 { Bad_Opcode },
3111 { Bad_Opcode },
3112 { Bad_Opcode },
3113 { "xresldtrk", { Skip_MODRM }, PREFIX_OPCODE },
603555e5
L
3114 },
3115
f8687e93 3116 /* PREFIX_0F01_REG_5_MOD_3_RM_2 */
603555e5
L
3117 {
3118 { Bad_Opcode },
c2f76402 3119 { "saveprevssp", { Skip_MODRM }, PREFIX_OPCODE },
603555e5
L
3120 },
3121
267b8516
JB
3122 /* PREFIX_0F01_REG_7_MOD_3_RM_2 */
3123 {
3124 { "monitorx", { { OP_Monitor, 0 } }, 0 },
142861df 3125 { "mcommit", { Skip_MODRM }, 0 },
267b8516
JB
3126 },
3127
3233d7d0
IT
3128 /* PREFIX_0F09 */
3129 {
3130 { "wbinvd", { XX }, 0 },
3131 { "wbnoinvd", { XX }, 0 },
3132 },
3133
1ceb70f8 3134 /* PREFIX_0F10 */
cc0ec051 3135 {
507bd325
L
3136 { "movups", { XM, EXx }, PREFIX_OPCODE },
3137 { "movss", { XM, EXd }, PREFIX_OPCODE },
3138 { "movupd", { XM, EXx }, PREFIX_OPCODE },
3139 { "movsd", { XM, EXq }, PREFIX_OPCODE },
30d1c836 3140 },
4e7d34a6 3141
1ceb70f8 3142 /* PREFIX_0F11 */
30d1c836 3143 {
507bd325
L
3144 { "movups", { EXxS, XM }, PREFIX_OPCODE },
3145 { "movss", { EXdS, XM }, PREFIX_OPCODE },
3146 { "movupd", { EXxS, XM }, PREFIX_OPCODE },
3147 { "movsd", { EXqS, XM }, PREFIX_OPCODE },
4e7d34a6 3148 },
252b5132 3149
1ceb70f8 3150 /* PREFIX_0F12 */
c608c12e 3151 {
1ceb70f8 3152 { MOD_TABLE (MOD_0F12_PREFIX_0) },
507bd325 3153 { "movsldup", { XM, EXx }, PREFIX_OPCODE },
18897deb 3154 { MOD_TABLE (MOD_0F12_PREFIX_2) },
507bd325 3155 { "movddup", { XM, EXq }, PREFIX_OPCODE },
c608c12e 3156 },
4e7d34a6 3157
1ceb70f8 3158 /* PREFIX_0F16 */
c608c12e 3159 {
1ceb70f8 3160 { MOD_TABLE (MOD_0F16_PREFIX_0) },
507bd325 3161 { "movshdup", { XM, EXx }, PREFIX_OPCODE },
18897deb 3162 { MOD_TABLE (MOD_0F16_PREFIX_2) },
c608c12e 3163 },
4e7d34a6 3164
7e8b059b
L
3165 /* PREFIX_0F1A */
3166 {
3167 { MOD_TABLE (MOD_0F1A_PREFIX_0) },
bf890a93
IT
3168 { "bndcl", { Gbnd, Ev_bnd }, 0 },
3169 { "bndmov", { Gbnd, Ebnd }, 0 },
3170 { "bndcu", { Gbnd, Ev_bnd }, 0 },
7e8b059b
L
3171 },
3172
3173 /* PREFIX_0F1B */
3174 {
3175 { MOD_TABLE (MOD_0F1B_PREFIX_0) },
3176 { MOD_TABLE (MOD_0F1B_PREFIX_1) },
9f79e886 3177 { "bndmov", { EbndS, Gbnd }, 0 },
bf890a93 3178 { "bndcn", { Gbnd, Ev_bnd }, 0 },
7e8b059b
L
3179 },
3180
c48935d7
IT
3181 /* PREFIX_0F1C */
3182 {
3183 { MOD_TABLE (MOD_0F1C_PREFIX_0) },
3184 { "nopQ", { Ev }, PREFIX_OPCODE },
3185 { "nopQ", { Ev }, PREFIX_OPCODE },
3186 { "nopQ", { Ev }, PREFIX_OPCODE },
3187 },
3188
603555e5
L
3189 /* PREFIX_0F1E */
3190 {
3191 { "nopQ", { Ev }, PREFIX_OPCODE },
3192 { MOD_TABLE (MOD_0F1E_PREFIX_1) },
3193 { "nopQ", { Ev }, PREFIX_OPCODE },
3194 { "nopQ", { Ev }, PREFIX_OPCODE },
3195 },
3196
1ceb70f8 3197 /* PREFIX_0F2A */
c608c12e 3198 {
507bd325 3199 { "cvtpi2ps", { XM, EMCq }, PREFIX_OPCODE },
b24d668c 3200 { "cvtsi2ss{%LQ|}", { XM, Edq }, PREFIX_OPCODE },
507bd325 3201 { "cvtpi2pd", { XM, EMCq }, PREFIX_OPCODE },
b24d668c 3202 { "cvtsi2sd{%LQ|}", { XM, Edq }, 0 },
c608c12e 3203 },
4e7d34a6 3204
1ceb70f8 3205 /* PREFIX_0F2B */
c608c12e 3206 {
75c135a8
L
3207 { MOD_TABLE (MOD_0F2B_PREFIX_0) },
3208 { MOD_TABLE (MOD_0F2B_PREFIX_1) },
3209 { MOD_TABLE (MOD_0F2B_PREFIX_2) },
3210 { MOD_TABLE (MOD_0F2B_PREFIX_3) },
c608c12e 3211 },
4e7d34a6 3212
1ceb70f8 3213 /* PREFIX_0F2C */
c608c12e 3214 {
507bd325 3215 { "cvttps2pi", { MXC, EXq }, PREFIX_OPCODE },
e1a1babd 3216 { "cvttss2si", { Gdq, EXd }, PREFIX_OPCODE },
507bd325 3217 { "cvttpd2pi", { MXC, EXx }, PREFIX_OPCODE },
e1a1babd 3218 { "cvttsd2si", { Gdq, EXq }, PREFIX_OPCODE },
c608c12e 3219 },
4e7d34a6 3220
1ceb70f8 3221 /* PREFIX_0F2D */
c608c12e 3222 {
507bd325 3223 { "cvtps2pi", { MXC, EXq }, PREFIX_OPCODE },
e1a1babd 3224 { "cvtss2si", { Gdq, EXd }, PREFIX_OPCODE },
507bd325 3225 { "cvtpd2pi", { MXC, EXx }, PREFIX_OPCODE },
e1a1babd 3226 { "cvtsd2si", { Gdq, EXq }, PREFIX_OPCODE },
c608c12e 3227 },
4e7d34a6 3228
1ceb70f8 3229 /* PREFIX_0F2E */
c608c12e 3230 {
bf890a93 3231 { "ucomiss",{ XM, EXd }, 0 },
592d1631 3232 { Bad_Opcode },
bf890a93 3233 { "ucomisd",{ XM, EXq }, 0 },
c608c12e 3234 },
4e7d34a6 3235
1ceb70f8 3236 /* PREFIX_0F2F */
c608c12e 3237 {
bf890a93 3238 { "comiss", { XM, EXd }, 0 },
592d1631 3239 { Bad_Opcode },
bf890a93 3240 { "comisd", { XM, EXq }, 0 },
c608c12e 3241 },
4e7d34a6 3242
1ceb70f8 3243 /* PREFIX_0F51 */
c608c12e 3244 {
507bd325
L
3245 { "sqrtps", { XM, EXx }, PREFIX_OPCODE },
3246 { "sqrtss", { XM, EXd }, PREFIX_OPCODE },
3247 { "sqrtpd", { XM, EXx }, PREFIX_OPCODE },
3248 { "sqrtsd", { XM, EXq }, PREFIX_OPCODE },
c608c12e 3249 },
4e7d34a6 3250
1ceb70f8 3251 /* PREFIX_0F52 */
c608c12e 3252 {
507bd325
L
3253 { "rsqrtps",{ XM, EXx }, PREFIX_OPCODE },
3254 { "rsqrtss",{ XM, EXd }, PREFIX_OPCODE },
c608c12e 3255 },
4e7d34a6 3256
1ceb70f8 3257 /* PREFIX_0F53 */
c608c12e 3258 {
507bd325
L
3259 { "rcpps", { XM, EXx }, PREFIX_OPCODE },
3260 { "rcpss", { XM, EXd }, PREFIX_OPCODE },
c608c12e 3261 },
4e7d34a6 3262
1ceb70f8 3263 /* PREFIX_0F58 */
c608c12e 3264 {
507bd325
L
3265 { "addps", { XM, EXx }, PREFIX_OPCODE },
3266 { "addss", { XM, EXd }, PREFIX_OPCODE },
3267 { "addpd", { XM, EXx }, PREFIX_OPCODE },
3268 { "addsd", { XM, EXq }, PREFIX_OPCODE },
c608c12e 3269 },
4e7d34a6 3270
1ceb70f8 3271 /* PREFIX_0F59 */
c608c12e 3272 {
507bd325
L
3273 { "mulps", { XM, EXx }, PREFIX_OPCODE },
3274 { "mulss", { XM, EXd }, PREFIX_OPCODE },
3275 { "mulpd", { XM, EXx }, PREFIX_OPCODE },
3276 { "mulsd", { XM, EXq }, PREFIX_OPCODE },
041bd2e0 3277 },
4e7d34a6 3278
1ceb70f8 3279 /* PREFIX_0F5A */
041bd2e0 3280 {
507bd325
L
3281 { "cvtps2pd", { XM, EXq }, PREFIX_OPCODE },
3282 { "cvtss2sd", { XM, EXd }, PREFIX_OPCODE },
3283 { "cvtpd2ps", { XM, EXx }, PREFIX_OPCODE },
3284 { "cvtsd2ss", { XM, EXq }, PREFIX_OPCODE },
041bd2e0 3285 },
4e7d34a6 3286
1ceb70f8 3287 /* PREFIX_0F5B */
041bd2e0 3288 {
507bd325
L
3289 { "cvtdq2ps", { XM, EXx }, PREFIX_OPCODE },
3290 { "cvttps2dq", { XM, EXx }, PREFIX_OPCODE },
3291 { "cvtps2dq", { XM, EXx }, PREFIX_OPCODE },
041bd2e0 3292 },
4e7d34a6 3293
1ceb70f8 3294 /* PREFIX_0F5C */
041bd2e0 3295 {
507bd325
L
3296 { "subps", { XM, EXx }, PREFIX_OPCODE },
3297 { "subss", { XM, EXd }, PREFIX_OPCODE },
3298 { "subpd", { XM, EXx }, PREFIX_OPCODE },
3299 { "subsd", { XM, EXq }, PREFIX_OPCODE },
041bd2e0 3300 },
4e7d34a6 3301
1ceb70f8 3302 /* PREFIX_0F5D */
041bd2e0 3303 {
507bd325
L
3304 { "minps", { XM, EXx }, PREFIX_OPCODE },
3305 { "minss", { XM, EXd }, PREFIX_OPCODE },
3306 { "minpd", { XM, EXx }, PREFIX_OPCODE },
3307 { "minsd", { XM, EXq }, PREFIX_OPCODE },
041bd2e0 3308 },
4e7d34a6 3309
1ceb70f8 3310 /* PREFIX_0F5E */
041bd2e0 3311 {
507bd325
L
3312 { "divps", { XM, EXx }, PREFIX_OPCODE },
3313 { "divss", { XM, EXd }, PREFIX_OPCODE },
3314 { "divpd", { XM, EXx }, PREFIX_OPCODE },
3315 { "divsd", { XM, EXq }, PREFIX_OPCODE },
041bd2e0 3316 },
4e7d34a6 3317
1ceb70f8 3318 /* PREFIX_0F5F */
041bd2e0 3319 {
507bd325
L
3320 { "maxps", { XM, EXx }, PREFIX_OPCODE },
3321 { "maxss", { XM, EXd }, PREFIX_OPCODE },
3322 { "maxpd", { XM, EXx }, PREFIX_OPCODE },
3323 { "maxsd", { XM, EXq }, PREFIX_OPCODE },
041bd2e0 3324 },
4e7d34a6 3325
1ceb70f8 3326 /* PREFIX_0F60 */
041bd2e0 3327 {
507bd325 3328 { "punpcklbw",{ MX, EMd }, PREFIX_OPCODE },
592d1631 3329 { Bad_Opcode },
507bd325 3330 { "punpcklbw",{ MX, EMx }, PREFIX_OPCODE },
041bd2e0 3331 },
4e7d34a6 3332
1ceb70f8 3333 /* PREFIX_0F61 */
041bd2e0 3334 {
507bd325 3335 { "punpcklwd",{ MX, EMd }, PREFIX_OPCODE },
592d1631 3336 { Bad_Opcode },
507bd325 3337 { "punpcklwd",{ MX, EMx }, PREFIX_OPCODE },
041bd2e0 3338 },
4e7d34a6 3339
1ceb70f8 3340 /* PREFIX_0F62 */
041bd2e0 3341 {
507bd325 3342 { "punpckldq",{ MX, EMd }, PREFIX_OPCODE },
592d1631 3343 { Bad_Opcode },
507bd325 3344 { "punpckldq",{ MX, EMx }, PREFIX_OPCODE },
041bd2e0 3345 },
4e7d34a6 3346
1ceb70f8 3347 /* PREFIX_0F6F */
ca164297 3348 {
507bd325
L
3349 { "movq", { MX, EM }, PREFIX_OPCODE },
3350 { "movdqu", { XM, EXx }, PREFIX_OPCODE },
3351 { "movdqa", { XM, EXx }, PREFIX_OPCODE },
ca164297 3352 },
4e7d34a6 3353
1ceb70f8 3354 /* PREFIX_0F70 */
4e7d34a6 3355 {
507bd325
L
3356 { "pshufw", { MX, EM, Ib }, PREFIX_OPCODE },
3357 { "pshufhw",{ XM, EXx, Ib }, PREFIX_OPCODE },
3358 { "pshufd", { XM, EXx, Ib }, PREFIX_OPCODE },
3359 { "pshuflw",{ XM, EXx, Ib }, PREFIX_OPCODE },
4e7d34a6
L
3360 },
3361
1ceb70f8 3362 /* PREFIX_0F78 */
4e7d34a6 3363 {
bf890a93 3364 {"vmread", { Em, Gm }, 0 },
592d1631 3365 { Bad_Opcode },
bf890a93
IT
3366 {"extrq", { XS, Ib, Ib }, 0 },
3367 {"insertq", { XM, XS, Ib, Ib }, 0 },
4e7d34a6
L
3368 },
3369
1ceb70f8 3370 /* PREFIX_0F79 */
4e7d34a6 3371 {
bf890a93 3372 {"vmwrite", { Gm, Em }, 0 },
592d1631 3373 { Bad_Opcode },
bf890a93
IT
3374 {"extrq", { XM, XS }, 0 },
3375 {"insertq", { XM, XS }, 0 },
4e7d34a6
L
3376 },
3377
1ceb70f8 3378 /* PREFIX_0F7C */
ca164297 3379 {
592d1631
L
3380 { Bad_Opcode },
3381 { Bad_Opcode },
507bd325
L
3382 { "haddpd", { XM, EXx }, PREFIX_OPCODE },
3383 { "haddps", { XM, EXx }, PREFIX_OPCODE },
ca164297 3384 },
4e7d34a6 3385
1ceb70f8 3386 /* PREFIX_0F7D */
ca164297 3387 {
592d1631
L
3388 { Bad_Opcode },
3389 { Bad_Opcode },
507bd325
L
3390 { "hsubpd", { XM, EXx }, PREFIX_OPCODE },
3391 { "hsubps", { XM, EXx }, PREFIX_OPCODE },
ca164297 3392 },
4e7d34a6 3393
1ceb70f8 3394 /* PREFIX_0F7E */
ca164297 3395 {
507bd325
L
3396 { "movK", { Edq, MX }, PREFIX_OPCODE },
3397 { "movq", { XM, EXq }, PREFIX_OPCODE },
3398 { "movK", { Edq, XM }, PREFIX_OPCODE },
ca164297 3399 },
4e7d34a6 3400
1ceb70f8 3401 /* PREFIX_0F7F */
ca164297 3402 {
507bd325
L
3403 { "movq", { EMS, MX }, PREFIX_OPCODE },
3404 { "movdqu", { EXxS, XM }, PREFIX_OPCODE },
3405 { "movdqa", { EXxS, XM }, PREFIX_OPCODE },
ca164297 3406 },
4e7d34a6 3407
f8687e93 3408 /* PREFIX_0FAE_REG_0_MOD_3 */
c7b8aa3a
L
3409 {
3410 { Bad_Opcode },
bf890a93 3411 { "rdfsbase", { Ev }, 0 },
c7b8aa3a
L
3412 },
3413
f8687e93 3414 /* PREFIX_0FAE_REG_1_MOD_3 */
c7b8aa3a
L
3415 {
3416 { Bad_Opcode },
bf890a93 3417 { "rdgsbase", { Ev }, 0 },
c7b8aa3a
L
3418 },
3419
f8687e93 3420 /* PREFIX_0FAE_REG_2_MOD_3 */
c7b8aa3a
L
3421 {
3422 { Bad_Opcode },
bf890a93 3423 { "wrfsbase", { Ev }, 0 },
c7b8aa3a
L
3424 },
3425
f8687e93 3426 /* PREFIX_0FAE_REG_3_MOD_3 */
c7b8aa3a
L
3427 {
3428 { Bad_Opcode },
bf890a93 3429 { "wrgsbase", { Ev }, 0 },
c7b8aa3a
L
3430 },
3431
f8687e93 3432 /* PREFIX_0FAE_REG_4_MOD_0 */
6b40c462
L
3433 {
3434 { "xsave", { FXSAVE }, 0 },
b24d668c 3435 { "ptwrite{%LQ|}", { Edq }, 0 },
6b40c462
L
3436 },
3437
f8687e93 3438 /* PREFIX_0FAE_REG_4_MOD_3 */
6b40c462
L
3439 {
3440 { Bad_Opcode },
b24d668c 3441 { "ptwrite{%LQ|}", { Edq }, 0 },
6b40c462
L
3442 },
3443
f8687e93 3444 /* PREFIX_0FAE_REG_5_MOD_3 */
2234eee6
L
3445 {
3446 { "lfence", { Skip_MODRM }, 0 },
464d2b65 3447 { "incsspK", { Edq }, PREFIX_OPCODE },
603555e5
L
3448 },
3449
f8687e93 3450 /* PREFIX_0FAE_REG_6_MOD_0 */
c5e7287a 3451 {
603555e5
L
3452 { "xsaveopt", { FXSAVE }, PREFIX_OPCODE },
3453 { "clrssbsy", { Mq }, PREFIX_OPCODE },
3454 { "clwb", { Mb }, PREFIX_OPCODE },
c5e7287a
IT
3455 },
3456
f8687e93 3457 /* PREFIX_0FAE_REG_6_MOD_3 */
de89d0a3 3458 {
f8687e93 3459 { RM_TABLE (RM_0FAE_REG_6_MOD_3_P_0) },
de89d0a3 3460 { "umonitor", { Eva }, PREFIX_OPCODE },
ae1d3843
L
3461 { "tpause", { Edq }, PREFIX_OPCODE },
3462 { "umwait", { Edq }, PREFIX_OPCODE },
de89d0a3
IT
3463 },
3464
f8687e93 3465 /* PREFIX_0FAE_REG_7_MOD_0 */
963f3586 3466 {
bf890a93 3467 { "clflush", { Mb }, 0 },
963f3586 3468 { Bad_Opcode },
bf890a93 3469 { "clflushopt", { Mb }, 0 },
963f3586
IT
3470 },
3471
1ceb70f8 3472 /* PREFIX_0FB8 */
ca164297 3473 {
592d1631 3474 { Bad_Opcode },
bf890a93 3475 { "popcntS", { Gv, Ev }, 0 },
ca164297 3476 },
4e7d34a6 3477
f12dc422
L
3478 /* PREFIX_0FBC */
3479 {
bf890a93
IT
3480 { "bsfS", { Gv, Ev }, 0 },
3481 { "tzcntS", { Gv, Ev }, 0 },
3482 { "bsfS", { Gv, Ev }, 0 },
f12dc422
L
3483 },
3484
1ceb70f8 3485 /* PREFIX_0FBD */
050dfa73 3486 {
bf890a93
IT
3487 { "bsrS", { Gv, Ev }, 0 },
3488 { "lzcntS", { Gv, Ev }, 0 },
3489 { "bsrS", { Gv, Ev }, 0 },
050dfa73
MM
3490 },
3491
1ceb70f8 3492 /* PREFIX_0FC2 */
050dfa73 3493 {
507bd325
L
3494 { "cmpps", { XM, EXx, CMP }, PREFIX_OPCODE },
3495 { "cmpss", { XM, EXd, CMP }, PREFIX_OPCODE },
3496 { "cmppd", { XM, EXx, CMP }, PREFIX_OPCODE },
3497 { "cmpsd", { XM, EXq, CMP }, PREFIX_OPCODE },
050dfa73 3498 },
246c51aa 3499
f8687e93 3500 /* PREFIX_0FC7_REG_6_MOD_0 */
92fddf8e 3501 {
bf890a93
IT
3502 { "vmptrld",{ Mq }, 0 },
3503 { "vmxon", { Mq }, 0 },
3504 { "vmclear",{ Mq }, 0 },
92fddf8e
L
3505 },
3506
f8687e93 3507 /* PREFIX_0FC7_REG_6_MOD_3 */
f24bcbaa
L
3508 {
3509 { "rdrand", { Ev }, 0 },
3510 { Bad_Opcode },
3511 { "rdrand", { Ev }, 0 }
3512 },
3513
f8687e93 3514 /* PREFIX_0FC7_REG_7_MOD_3 */
f24bcbaa
L
3515 {
3516 { "rdseed", { Ev }, 0 },
8bc52696 3517 { "rdpid", { Em }, 0 },
f24bcbaa
L
3518 { "rdseed", { Ev }, 0 },
3519 },
3520
1ceb70f8 3521 /* PREFIX_0FD0 */
050dfa73 3522 {
592d1631
L
3523 { Bad_Opcode },
3524 { Bad_Opcode },
bf890a93
IT
3525 { "addsubpd", { XM, EXx }, 0 },
3526 { "addsubps", { XM, EXx }, 0 },
246c51aa 3527 },
050dfa73 3528
1ceb70f8 3529 /* PREFIX_0FD6 */
050dfa73 3530 {
592d1631 3531 { Bad_Opcode },
bf890a93
IT
3532 { "movq2dq",{ XM, MS }, 0 },
3533 { "movq", { EXqS, XM }, 0 },
3534 { "movdq2q",{ MX, XS }, 0 },
050dfa73
MM
3535 },
3536
1ceb70f8 3537 /* PREFIX_0FE6 */
7918206c 3538 {
592d1631 3539 { Bad_Opcode },
507bd325
L
3540 { "cvtdq2pd", { XM, EXq }, PREFIX_OPCODE },
3541 { "cvttpd2dq", { XM, EXx }, PREFIX_OPCODE },
3542 { "cvtpd2dq", { XM, EXx }, PREFIX_OPCODE },
7918206c 3543 },
8b38ad71 3544
1ceb70f8 3545 /* PREFIX_0FE7 */
8b38ad71 3546 {
507bd325 3547 { "movntq", { Mq, MX }, PREFIX_OPCODE },
592d1631 3548 { Bad_Opcode },
75c135a8 3549 { MOD_TABLE (MOD_0FE7_PREFIX_2) },
4e7d34a6
L
3550 },
3551
1ceb70f8 3552 /* PREFIX_0FF0 */
4e7d34a6 3553 {
592d1631
L
3554 { Bad_Opcode },
3555 { Bad_Opcode },
3556 { Bad_Opcode },
1ceb70f8 3557 { MOD_TABLE (MOD_0FF0_PREFIX_3) },
4e7d34a6
L
3558 },
3559
1ceb70f8 3560 /* PREFIX_0FF7 */
4e7d34a6 3561 {
507bd325 3562 { "maskmovq", { MX, MS }, PREFIX_OPCODE },
592d1631 3563 { Bad_Opcode },
507bd325 3564 { "maskmovdqu", { XM, XS }, PREFIX_OPCODE },
8b38ad71 3565 },
42903f7f 3566
c4694f17
TG
3567 /* PREFIX_0F38D8 */
3568 {
3569 { Bad_Opcode },
3570 { REG_TABLE (REG_0F38D8_PREFIX_1) },
3571 },
3572
3573 /* PREFIX_0F38DC */
3574 {
3575 { Bad_Opcode },
3576 { MOD_TABLE (MOD_0F38DC_PREFIX_1) },
3577 { "aesenc", { XM, EXx }, 0 },
3578 },
3579
3580 /* PREFIX_0F38DD */
3581 {
3582 { Bad_Opcode },
3583 { MOD_TABLE (MOD_0F38DD_PREFIX_1) },
3584 { "aesenclast", { XM, EXx }, 0 },
3585 },
3586
3587 /* PREFIX_0F38DE */
3588 {
3589 { Bad_Opcode },
3590 { MOD_TABLE (MOD_0F38DE_PREFIX_1) },
3591 { "aesdec", { XM, EXx }, 0 },
3592 },
3593
3594 /* PREFIX_0F38DF */
3595 {
3596 { Bad_Opcode },
3597 { MOD_TABLE (MOD_0F38DF_PREFIX_1) },
3598 { "aesdeclast", { XM, EXx }, 0 },
3599 },
3600
1ceb70f8 3601 /* PREFIX_0F38F0 */
4e7d34a6 3602 {
9ab00b61 3603 { "movbeS", { Gv, Mv }, PREFIX_OPCODE },
592d1631 3604 { Bad_Opcode },
9ab00b61 3605 { "movbeS", { Gv, Mv }, PREFIX_OPCODE },
2875b28a 3606 { "crc32A", { Gdq, Eb }, PREFIX_OPCODE },
4e7d34a6
L
3607 },
3608
1ceb70f8 3609 /* PREFIX_0F38F1 */
4e7d34a6 3610 {
9ab00b61 3611 { "movbeS", { Mv, Gv }, PREFIX_OPCODE },
592d1631 3612 { Bad_Opcode },
9ab00b61 3613 { "movbeS", { Mv, Gv }, PREFIX_OPCODE },
2875b28a 3614 { "crc32Q", { Gdq, Ev }, PREFIX_OPCODE },
4e7d34a6
L
3615 },
3616
603555e5
L
3617 /* PREFIX_0F38F6 */
3618 {
3619 { MOD_TABLE (MOD_0F38F6_PREFIX_0) },
507bd325
L
3620 { "adoxS", { Gdq, Edq}, PREFIX_OPCODE },
3621 { "adcxS", { Gdq, Edq}, PREFIX_OPCODE },
e2e1fcde
L
3622 { Bad_Opcode },
3623 },
3624
c0a30a9f
L
3625 /* PREFIX_0F38F8 */
3626 {
3627 { Bad_Opcode },
5d79adc4 3628 { MOD_TABLE (MOD_0F38F8_PREFIX_1) },
c0a30a9f 3629 { MOD_TABLE (MOD_0F38F8_PREFIX_2) },
5d79adc4 3630 { MOD_TABLE (MOD_0F38F8_PREFIX_3) },
c0a30a9f 3631 },
c4694f17
TG
3632 /* PREFIX_0F38FA */
3633 {
3634 { Bad_Opcode },
3635 { MOD_TABLE (MOD_0F38FA_PREFIX_1) },
3636 },
3637
3638 /* PREFIX_0F38FB */
3639 {
3640 { Bad_Opcode },
3641 { MOD_TABLE (MOD_0F38FB_PREFIX_1) },
3642 },
c0a30a9f 3643
7531c613 3644 /* PREFIX_VEX_0F10 */
42903f7f 3645 {
7531c613
JB
3646 { "vmovups", { XM, EXx }, 0 },
3647 { "vmovss", { XMScalar, VexScalarR, EXxmm_md }, 0 },
3648 { "vmovupd", { XM, EXx }, 0 },
3649 { "vmovsd", { XMScalar, VexScalarR, EXxmm_mq }, 0 },
42903f7f
L
3650 },
3651
7531c613 3652 /* PREFIX_VEX_0F11 */
42903f7f 3653 {
7531c613
JB
3654 { "vmovups", { EXxS, XM }, 0 },
3655 { "vmovss", { EXdS, VexScalarR, XMScalar }, 0 },
3656 { "vmovupd", { EXxS, XM }, 0 },
3657 { "vmovsd", { EXqS, VexScalarR, XMScalar }, 0 },
42903f7f
L
3658 },
3659
7531c613 3660 /* PREFIX_VEX_0F12 */
42903f7f 3661 {
7531c613
JB
3662 { MOD_TABLE (MOD_VEX_0F12_PREFIX_0) },
3663 { "vmovsldup", { XM, EXx }, 0 },
3664 { MOD_TABLE (MOD_VEX_0F12_PREFIX_2) },
3665 { "vmovddup", { XM, EXymmq }, 0 },
42903f7f
L
3666 },
3667
7531c613 3668 /* PREFIX_VEX_0F16 */
42903f7f 3669 {
7531c613
JB
3670 { MOD_TABLE (MOD_VEX_0F16_PREFIX_0) },
3671 { "vmovshdup", { XM, EXx }, 0 },
3672 { MOD_TABLE (MOD_VEX_0F16_PREFIX_2) },
5f754f58 3673 },
7c52e0e8 3674
592a252b 3675 /* PREFIX_VEX_0F2A */
5f754f58 3676 {
592d1631 3677 { Bad_Opcode },
b24d668c 3678 { "vcvtsi2ss{%LQ|}", { XMScalar, VexScalar, Edq }, 0 },
592d1631 3679 { Bad_Opcode },
b24d668c 3680 { "vcvtsi2sd{%LQ|}", { XMScalar, VexScalar, Edq }, 0 },
5f754f58 3681 },
7c52e0e8 3682
592a252b 3683 /* PREFIX_VEX_0F2C */
5f754f58 3684 {
592d1631 3685 { Bad_Opcode },
17d3c7ec 3686 { "vcvttss2si", { Gdq, EXxmm_md, EXxEVexS }, 0 },
592d1631 3687 { Bad_Opcode },
17d3c7ec 3688 { "vcvttsd2si", { Gdq, EXxmm_mq, EXxEVexS }, 0 },
5f754f58 3689 },
7c52e0e8 3690
592a252b 3691 /* PREFIX_VEX_0F2D */
7c52e0e8 3692 {
592d1631 3693 { Bad_Opcode },
17d3c7ec 3694 { "vcvtss2si", { Gdq, EXxmm_md, EXxEVexR }, 0 },
592d1631 3695 { Bad_Opcode },
17d3c7ec 3696 { "vcvtsd2si", { Gdq, EXxmm_mq, EXxEVexR }, 0 },
7c52e0e8
L
3697 },
3698
592a252b 3699 /* PREFIX_VEX_0F2E */
7c52e0e8 3700 {
17d3c7ec 3701 { "vucomisX", { XMScalar, EXxmm_md, EXxEVexS }, PREFIX_OPCODE },
592d1631 3702 { Bad_Opcode },
17d3c7ec 3703 { "vucomisX", { XMScalar, EXxmm_mq, EXxEVexS }, PREFIX_OPCODE },
7c52e0e8
L
3704 },
3705
592a252b 3706 /* PREFIX_VEX_0F2F */
7c52e0e8 3707 {
17d3c7ec 3708 { "vcomisX", { XMScalar, EXxmm_md, EXxEVexS }, PREFIX_OPCODE },
592d1631 3709 { Bad_Opcode },
17d3c7ec 3710 { "vcomisX", { XMScalar, EXxmm_mq, EXxEVexS }, PREFIX_OPCODE },
7c52e0e8
L
3711 },
3712
43234a1e
L
3713 /* PREFIX_VEX_0F41 */
3714 {
3715 { VEX_LEN_TABLE (VEX_LEN_0F41_P_0) },
1ba585e8
IT
3716 { Bad_Opcode },
3717 { VEX_LEN_TABLE (VEX_LEN_0F41_P_2) },
43234a1e
L
3718 },
3719
3720 /* PREFIX_VEX_0F42 */
3721 {
3722 { VEX_LEN_TABLE (VEX_LEN_0F42_P_0) },
1ba585e8
IT
3723 { Bad_Opcode },
3724 { VEX_LEN_TABLE (VEX_LEN_0F42_P_2) },
43234a1e
L
3725 },
3726
7531c613 3727 /* PREFIX_VEX_0F44 */
c0f3af97 3728 {
7531c613 3729 { VEX_LEN_TABLE (VEX_LEN_0F44_P_0) },
592d1631 3730 { Bad_Opcode },
7531c613 3731 { VEX_LEN_TABLE (VEX_LEN_0F44_P_2) },
c0f3af97
L
3732 },
3733
7531c613 3734 /* PREFIX_VEX_0F45 */
0bfee649 3735 {
7531c613 3736 { VEX_LEN_TABLE (VEX_LEN_0F45_P_0) },
592d1631 3737 { Bad_Opcode },
7531c613 3738 { VEX_LEN_TABLE (VEX_LEN_0F45_P_2) },
0bfee649
L
3739 },
3740
7531c613 3741 /* PREFIX_VEX_0F46 */
43234a1e 3742 {
7531c613 3743 { VEX_LEN_TABLE (VEX_LEN_0F46_P_0) },
43234a1e 3744 { Bad_Opcode },
7531c613 3745 { VEX_LEN_TABLE (VEX_LEN_0F46_P_2) },
43234a1e
L
3746 },
3747
7531c613 3748 /* PREFIX_VEX_0F47 */
1ba585e8 3749 {
7531c613 3750 { VEX_LEN_TABLE (VEX_LEN_0F47_P_0) },
1ba585e8 3751 { Bad_Opcode },
7531c613 3752 { VEX_LEN_TABLE (VEX_LEN_0F47_P_2) },
1ba585e8
IT
3753 },
3754
7531c613 3755 /* PREFIX_VEX_0F4A */
43234a1e 3756 {
7531c613 3757 { VEX_LEN_TABLE (VEX_LEN_0F4A_P_0) },
43234a1e 3758 { Bad_Opcode },
7531c613 3759 { VEX_LEN_TABLE (VEX_LEN_0F4A_P_2) },
43234a1e
L
3760 },
3761
7531c613 3762 /* PREFIX_VEX_0F4B */
1ba585e8 3763 {
7531c613 3764 { VEX_LEN_TABLE (VEX_LEN_0F4B_P_0) },
1ba585e8 3765 { Bad_Opcode },
7531c613 3766 { VEX_LEN_TABLE (VEX_LEN_0F4B_P_2) },
1ba585e8
IT
3767 },
3768
7531c613 3769 /* PREFIX_VEX_0F51 */
6c30d220 3770 {
7531c613
JB
3771 { "vsqrtps", { XM, EXx }, 0 },
3772 { "vsqrtss", { XMScalar, VexScalar, EXxmm_md }, 0 },
3773 { "vsqrtpd", { XM, EXx }, 0 },
3774 { "vsqrtsd", { XMScalar, VexScalar, EXxmm_mq }, 0 },
6c30d220
L
3775 },
3776
7531c613 3777 /* PREFIX_VEX_0F52 */
6c30d220 3778 {
7531c613
JB
3779 { "vrsqrtps", { XM, EXx }, 0 },
3780 { "vrsqrtss", { XMScalar, VexScalar, EXxmm_md }, 0 },
6c30d220
L
3781 },
3782
7531c613 3783 /* PREFIX_VEX_0F53 */
c0f3af97 3784 {
7531c613
JB
3785 { "vrcpps", { XM, EXx }, 0 },
3786 { "vrcpss", { XMScalar, VexScalar, EXxmm_md }, 0 },
c0f3af97
L
3787 },
3788
7531c613 3789 /* PREFIX_VEX_0F58 */
c0f3af97 3790 {
7531c613
JB
3791 { "vaddps", { XM, Vex, EXx }, 0 },
3792 { "vaddss", { XMScalar, VexScalar, EXxmm_md }, 0 },
3793 { "vaddpd", { XM, Vex, EXx }, 0 },
3794 { "vaddsd", { XMScalar, VexScalar, EXxmm_mq }, 0 },
c0f3af97
L
3795 },
3796
7531c613 3797 /* PREFIX_VEX_0F59 */
c0f3af97 3798 {
7531c613
JB
3799 { "vmulps", { XM, Vex, EXx }, 0 },
3800 { "vmulss", { XMScalar, VexScalar, EXxmm_md }, 0 },
3801 { "vmulpd", { XM, Vex, EXx }, 0 },
3802 { "vmulsd", { XMScalar, VexScalar, EXxmm_mq }, 0 },
c0f3af97
L
3803 },
3804
7531c613 3805 /* PREFIX_VEX_0F5A */
ce2f5b3c 3806 {
7531c613
JB
3807 { "vcvtps2pd", { XM, EXxmmq }, 0 },
3808 { "vcvtss2sd", { XMScalar, VexScalar, EXxmm_md }, 0 },
3809 { "vcvtpd2ps%XY",{ XMM, EXx }, 0 },
3810 { "vcvtsd2ss", { XMScalar, VexScalar, EXxmm_mq }, 0 },
ce2f5b3c
L
3811 },
3812
7531c613 3813 /* PREFIX_VEX_0F5B */
6c30d220 3814 {
7531c613
JB
3815 { "vcvtdq2ps", { XM, EXx }, 0 },
3816 { "vcvttps2dq", { XM, EXx }, 0 },
3817 { "vcvtps2dq", { XM, EXx }, 0 },
6c30d220
L
3818 },
3819
7531c613 3820 /* PREFIX_VEX_0F5C */
a683cc34 3821 {
7531c613
JB
3822 { "vsubps", { XM, Vex, EXx }, 0 },
3823 { "vsubss", { XMScalar, VexScalar, EXxmm_md }, 0 },
3824 { "vsubpd", { XM, Vex, EXx }, 0 },
3825 { "vsubsd", { XMScalar, VexScalar, EXxmm_mq }, 0 },
a683cc34
SP
3826 },
3827
7531c613 3828 /* PREFIX_VEX_0F5D */
a683cc34 3829 {
7531c613
JB
3830 { "vminps", { XM, Vex, EXx }, 0 },
3831 { "vminss", { XMScalar, VexScalar, EXxmm_md }, 0 },
3832 { "vminpd", { XM, Vex, EXx }, 0 },
3833 { "vminsd", { XMScalar, VexScalar, EXxmm_mq }, 0 },
a683cc34
SP
3834 },
3835
7531c613 3836 /* PREFIX_VEX_0F5E */
c0f3af97 3837 {
7531c613
JB
3838 { "vdivps", { XM, Vex, EXx }, 0 },
3839 { "vdivss", { XMScalar, VexScalar, EXxmm_md }, 0 },
3840 { "vdivpd", { XM, Vex, EXx }, 0 },
3841 { "vdivsd", { XMScalar, VexScalar, EXxmm_mq }, 0 },
c0f3af97
L
3842 },
3843
7531c613 3844 /* PREFIX_VEX_0F5F */
c0f3af97 3845 {
7531c613
JB
3846 { "vmaxps", { XM, Vex, EXx }, 0 },
3847 { "vmaxss", { XMScalar, VexScalar, EXxmm_md }, 0 },
3848 { "vmaxpd", { XM, Vex, EXx }, 0 },
3849 { "vmaxsd", { XMScalar, VexScalar, EXxmm_mq }, 0 },
c0f3af97
L
3850 },
3851
7531c613 3852 /* PREFIX_VEX_0F6F */
c0f3af97 3853 {
592d1631 3854 { Bad_Opcode },
7531c613
JB
3855 { "vmovdqu", { XM, EXx }, 0 },
3856 { "vmovdqa", { XM, EXx }, 0 },
c0f3af97
L
3857 },
3858
7531c613 3859 /* PREFIX_VEX_0F70 */
922d8de8 3860 {
592d1631 3861 { Bad_Opcode },
7531c613
JB
3862 { "vpshufhw", { XM, EXx, Ib }, 0 },
3863 { "vpshufd", { XM, EXx, Ib }, 0 },
3864 { "vpshuflw", { XM, EXx, Ib }, 0 },
922d8de8
DR
3865 },
3866
7531c613 3867 /* PREFIX_VEX_0F7C */
922d8de8 3868 {
592d1631
L
3869 { Bad_Opcode },
3870 { Bad_Opcode },
7531c613
JB
3871 { "vhaddpd", { XM, Vex, EXx }, 0 },
3872 { "vhaddps", { XM, Vex, EXx }, 0 },
922d8de8
DR
3873 },
3874
7531c613 3875 /* PREFIX_VEX_0F7D */
922d8de8 3876 {
592d1631
L
3877 { Bad_Opcode },
3878 { Bad_Opcode },
7531c613
JB
3879 { "vhsubpd", { XM, Vex, EXx }, 0 },
3880 { "vhsubps", { XM, Vex, EXx }, 0 },
922d8de8
DR
3881 },
3882
7531c613 3883 /* PREFIX_VEX_0F7E */
c0f3af97 3884 {
592d1631 3885 { Bad_Opcode },
7531c613
JB
3886 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_1) },
3887 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_2) },
c0f3af97
L
3888 },
3889
7531c613 3890 /* PREFIX_VEX_0F7F */
c0f3af97 3891 {
592d1631 3892 { Bad_Opcode },
7531c613
JB
3893 { "vmovdqu", { EXxS, XM }, 0 },
3894 { "vmovdqa", { EXxS, XM }, 0 },
c0f3af97
L
3895 },
3896
7531c613 3897 /* PREFIX_VEX_0F90 */
c0f3af97 3898 {
7531c613 3899 { VEX_LEN_TABLE (VEX_LEN_0F90_P_0) },
592d1631 3900 { Bad_Opcode },
7531c613 3901 { VEX_LEN_TABLE (VEX_LEN_0F90_P_2) },
c0f3af97
L
3902 },
3903
7531c613 3904 /* PREFIX_VEX_0F91 */
c0f3af97 3905 {
7531c613 3906 { VEX_LEN_TABLE (VEX_LEN_0F91_P_0) },
592d1631 3907 { Bad_Opcode },
7531c613 3908 { VEX_LEN_TABLE (VEX_LEN_0F91_P_2) },
c0f3af97 3909 },
a5ff0eb2 3910
7531c613 3911 /* PREFIX_VEX_0F92 */
922d8de8 3912 {
7531c613 3913 { VEX_LEN_TABLE (VEX_LEN_0F92_P_0) },
592d1631 3914 { Bad_Opcode },
7531c613
JB
3915 { VEX_LEN_TABLE (VEX_LEN_0F92_P_2) },
3916 { VEX_LEN_TABLE (VEX_LEN_0F92_P_3) },
922d8de8
DR
3917 },
3918
7531c613 3919 /* PREFIX_VEX_0F93 */
922d8de8 3920 {
7531c613 3921 { VEX_LEN_TABLE (VEX_LEN_0F93_P_0) },
592d1631 3922 { Bad_Opcode },
7531c613
JB
3923 { VEX_LEN_TABLE (VEX_LEN_0F93_P_2) },
3924 { VEX_LEN_TABLE (VEX_LEN_0F93_P_3) },
922d8de8
DR
3925 },
3926
7531c613 3927 /* PREFIX_VEX_0F98 */
922d8de8 3928 {
7531c613 3929 { VEX_LEN_TABLE (VEX_LEN_0F98_P_0) },
592d1631 3930 { Bad_Opcode },
7531c613 3931 { VEX_LEN_TABLE (VEX_LEN_0F98_P_2) },
922d8de8
DR
3932 },
3933
7531c613 3934 /* PREFIX_VEX_0F99 */
922d8de8 3935 {
7531c613 3936 { VEX_LEN_TABLE (VEX_LEN_0F99_P_0) },
592d1631 3937 { Bad_Opcode },
7531c613 3938 { VEX_LEN_TABLE (VEX_LEN_0F99_P_2) },
922d8de8
DR
3939 },
3940
7531c613 3941 /* PREFIX_VEX_0FC2 */
922d8de8 3942 {
7531c613
JB
3943 { "vcmpps", { XM, Vex, EXx, CMP }, 0 },
3944 { "vcmpss", { XMScalar, VexScalar, EXxmm_md, CMP }, 0 },
3945 { "vcmppd", { XM, Vex, EXx, CMP }, 0 },
3946 { "vcmpsd", { XMScalar, VexScalar, EXxmm_mq, CMP }, 0 },
922d8de8
DR
3947 },
3948
7531c613 3949 /* PREFIX_VEX_0FD0 */
922d8de8 3950 {
592d1631
L
3951 { Bad_Opcode },
3952 { Bad_Opcode },
7531c613
JB
3953 { "vaddsubpd", { XM, Vex, EXx }, 0 },
3954 { "vaddsubps", { XM, Vex, EXx }, 0 },
922d8de8
DR
3955 },
3956
7531c613 3957 /* PREFIX_VEX_0FE6 */
922d8de8 3958 {
592d1631 3959 { Bad_Opcode },
7531c613
JB
3960 { "vcvtdq2pd", { XM, EXxmmq }, 0 },
3961 { "vcvttpd2dq%XY", { XMM, EXx }, 0 },
3962 { "vcvtpd2dq%XY", { XMM, EXx }, 0 },
922d8de8
DR
3963 },
3964
7531c613 3965 /* PREFIX_VEX_0FF0 */
922d8de8 3966 {
592d1631
L
3967 { Bad_Opcode },
3968 { Bad_Opcode },
7531c613
JB
3969 { Bad_Opcode },
3970 { MOD_TABLE (MOD_VEX_0FF0_PREFIX_3) },
922d8de8
DR
3971 },
3972
7531c613 3973 /* PREFIX_VEX_0F3849_X86_64 */
922d8de8 3974 {
7531c613 3975 { VEX_W_TABLE (VEX_W_0F3849_X86_64_P_0) },
592d1631 3976 { Bad_Opcode },
7531c613
JB
3977 { VEX_W_TABLE (VEX_W_0F3849_X86_64_P_2) },
3978 { VEX_W_TABLE (VEX_W_0F3849_X86_64_P_3) },
922d8de8
DR
3979 },
3980
7531c613 3981 /* PREFIX_VEX_0F384B_X86_64 */
922d8de8 3982 {
592d1631 3983 { Bad_Opcode },
7531c613
JB
3984 { VEX_W_TABLE (VEX_W_0F384B_X86_64_P_1) },
3985 { VEX_W_TABLE (VEX_W_0F384B_X86_64_P_2) },
3986 { VEX_W_TABLE (VEX_W_0F384B_X86_64_P_3) },
922d8de8
DR
3987 },
3988
7531c613 3989 /* PREFIX_VEX_0F385C_X86_64 */
922d8de8 3990 {
592d1631 3991 { Bad_Opcode },
7531c613 3992 { VEX_W_TABLE (VEX_W_0F385C_X86_64_P_1) },
592d1631 3993 { Bad_Opcode },
922d8de8
DR
3994 },
3995
7531c613 3996 /* PREFIX_VEX_0F385E_X86_64 */
922d8de8 3997 {
7531c613
JB
3998 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_0) },
3999 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_1) },
4000 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_2) },
4001 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_3) },
922d8de8
DR
4002 },
4003
7531c613 4004 /* PREFIX_VEX_0F38F5 */
48521003 4005 {
7531c613
JB
4006 { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_0) },
4007 { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_1) },
48521003 4008 { Bad_Opcode },
7531c613 4009 { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_3) },
48521003
IT
4010 },
4011
7531c613 4012 /* PREFIX_VEX_0F38F6 */
48521003
IT
4013 {
4014 { Bad_Opcode },
4015 { Bad_Opcode },
7531c613
JB
4016 { Bad_Opcode },
4017 { VEX_LEN_TABLE (VEX_LEN_0F38F6_P_3) },
48521003
IT
4018 },
4019
7531c613 4020 /* PREFIX_VEX_0F38F7 */
a5ff0eb2 4021 {
7531c613
JB
4022 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_0) },
4023 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_1) },
4024 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_2) },
4025 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_3) },
a5ff0eb2 4026 },
6c30d220
L
4027
4028 /* PREFIX_VEX_0F3AF0 */
4029 {
4030 { Bad_Opcode },
4031 { Bad_Opcode },
4032 { Bad_Opcode },
4033 { VEX_LEN_TABLE (VEX_LEN_0F3AF0_P_3) },
4034 },
43234a1e 4035
ad692897 4036#include "i386-dis-evex-prefix.h"
c0f3af97
L
4037};
4038
4039static const struct dis386 x86_64_table[][2] = {
4040 /* X86_64_06 */
4041 {
bf890a93 4042 { "pushP", { es }, 0 },
c0f3af97
L
4043 },
4044
4045 /* X86_64_07 */
4046 {
bf890a93 4047 { "popP", { es }, 0 },
c0f3af97
L
4048 },
4049
1673df32 4050 /* X86_64_0E */
c0f3af97 4051 {
bf890a93 4052 { "pushP", { cs }, 0 },
c0f3af97
L
4053 },
4054
4055 /* X86_64_16 */
4056 {
bf890a93 4057 { "pushP", { ss }, 0 },
c0f3af97
L
4058 },
4059
4060 /* X86_64_17 */
4061 {
bf890a93 4062 { "popP", { ss }, 0 },
c0f3af97
L
4063 },
4064
4065 /* X86_64_1E */
4066 {
bf890a93 4067 { "pushP", { ds }, 0 },
c0f3af97
L
4068 },
4069
4070 /* X86_64_1F */
4071 {
bf890a93 4072 { "popP", { ds }, 0 },
c0f3af97
L
4073 },
4074
4075 /* X86_64_27 */
4076 {
bf890a93 4077 { "daa", { XX }, 0 },
c0f3af97
L
4078 },
4079
4080 /* X86_64_2F */
4081 {
bf890a93 4082 { "das", { XX }, 0 },
c0f3af97
L
4083 },
4084
4085 /* X86_64_37 */
4086 {
bf890a93 4087 { "aaa", { XX }, 0 },
c0f3af97
L
4088 },
4089
4090 /* X86_64_3F */
4091 {
bf890a93 4092 { "aas", { XX }, 0 },
c0f3af97
L
4093 },
4094
4095 /* X86_64_60 */
4096 {
bf890a93 4097 { "pushaP", { XX }, 0 },
c0f3af97
L
4098 },
4099
4100 /* X86_64_61 */
4101 {
bf890a93 4102 { "popaP", { XX }, 0 },
c0f3af97
L
4103 },
4104
4105 /* X86_64_62 */
4106 {
4107 { MOD_TABLE (MOD_62_32BIT) },
43234a1e 4108 { EVEX_TABLE (EVEX_0F) },
c0f3af97
L
4109 },
4110
4111 /* X86_64_63 */
4112 {
bf890a93 4113 { "arpl", { Ew, Gw }, 0 },
bc31405e 4114 { "movs", { { OP_G, movsxd_mode }, { MOVSXD_Fixup, movsxd_mode } }, 0 },
c0f3af97
L
4115 },
4116
4117 /* X86_64_6D */
4118 {
bf890a93
IT
4119 { "ins{R|}", { Yzr, indirDX }, 0 },
4120 { "ins{G|}", { Yzr, indirDX }, 0 },
c0f3af97
L
4121 },
4122
4123 /* X86_64_6F */
4124 {
bf890a93
IT
4125 { "outs{R|}", { indirDXr, Xz }, 0 },
4126 { "outs{G|}", { indirDXr, Xz }, 0 },
c0f3af97
L
4127 },
4128
d039fef3 4129 /* X86_64_82 */
8b89fe14 4130 {
de194d85 4131 /* Opcode 0x82 is an alias of opcode 0x80 in 32-bit mode. */
d039fef3 4132 { REG_TABLE (REG_80) },
8b89fe14
L
4133 },
4134
c0f3af97
L
4135 /* X86_64_9A */
4136 {
36938cab 4137 { "{l|}call{P|}", { Ap }, 0 },
c0f3af97
L
4138 },
4139
aeab2b26
JB
4140 /* X86_64_C2 */
4141 {
4142 { "retP", { Iw, BND }, 0 },
4143 { "ret@", { Iw, BND }, 0 },
4144 },
4145
4146 /* X86_64_C3 */
4147 {
4148 { "retP", { BND }, 0 },
4149 { "ret@", { BND }, 0 },
4150 },
4151
c0f3af97
L
4152 /* X86_64_C4 */
4153 {
4154 { MOD_TABLE (MOD_C4_32BIT) },
4155 { VEX_C4_TABLE (VEX_0F) },
4156 },
4157
4158 /* X86_64_C5 */
4159 {
4160 { MOD_TABLE (MOD_C5_32BIT) },
4161 { VEX_C5_TABLE (VEX_0F) },
4162 },
4163
4164 /* X86_64_CE */
4165 {
bf890a93 4166 { "into", { XX }, 0 },
c0f3af97
L
4167 },
4168
4169 /* X86_64_D4 */
4170 {
bf890a93 4171 { "aam", { Ib }, 0 },
c0f3af97
L
4172 },
4173
4174 /* X86_64_D5 */
4175 {
bf890a93 4176 { "aad", { Ib }, 0 },
c0f3af97
L
4177 },
4178
a72d2af2
L
4179 /* X86_64_E8 */
4180 {
4181 { "callP", { Jv, BND }, 0 },
5db04b09 4182 { "call@", { Jv, BND }, 0 }
a72d2af2
L
4183 },
4184
4185 /* X86_64_E9 */
4186 {
4187 { "jmpP", { Jv, BND }, 0 },
5db04b09 4188 { "jmp@", { Jv, BND }, 0 }
a72d2af2
L
4189 },
4190
c0f3af97
L
4191 /* X86_64_EA */
4192 {
36938cab 4193 { "{l|}jmp{P|}", { Ap }, 0 },
c0f3af97
L
4194 },
4195
4196 /* X86_64_0F01_REG_0 */
4197 {
d1c36125 4198 { "sgdt{Q|Q}", { M }, 0 },
bf890a93 4199 { "sgdt", { M }, 0 },
c0f3af97
L
4200 },
4201
4202 /* X86_64_0F01_REG_1 */
4203 {
d1c36125 4204 { "sidt{Q|Q}", { M }, 0 },
bf890a93 4205 { "sidt", { M }, 0 },
c0f3af97
L
4206 },
4207
4208 /* X86_64_0F01_REG_2 */
4209 {
bf890a93
IT
4210 { "lgdt{Q|Q}", { M }, 0 },
4211 { "lgdt", { M }, 0 },
c0f3af97
L
4212 },
4213
4214 /* X86_64_0F01_REG_3 */
4215 {
bf890a93
IT
4216 { "lidt{Q|Q}", { M }, 0 },
4217 { "lidt", { M }, 0 },
c0f3af97 4218 },
260cd341 4219
78467458
JB
4220 {
4221 /* X86_64_0F24 */
4222 { "movZ", { Em, Td }, 0 },
4223 },
4224
4225 {
4226 /* X86_64_0F26 */
4227 { "movZ", { Td, Em }, 0 },
4228 },
4229
260cd341
LC
4230 /* X86_64_VEX_0F3849 */
4231 {
4232 { Bad_Opcode },
4233 { PREFIX_TABLE (PREFIX_VEX_0F3849_X86_64) },
4234 },
4235
4236 /* X86_64_VEX_0F384B */
4237 {
4238 { Bad_Opcode },
4239 { PREFIX_TABLE (PREFIX_VEX_0F384B_X86_64) },
4240 },
4241
4242 /* X86_64_VEX_0F385C */
4243 {
4244 { Bad_Opcode },
4245 { PREFIX_TABLE (PREFIX_VEX_0F385C_X86_64) },
4246 },
4247
4248 /* X86_64_VEX_0F385E */
4249 {
4250 { Bad_Opcode },
4251 { PREFIX_TABLE (PREFIX_VEX_0F385E_X86_64) },
4252 },
c0f3af97
L
4253};
4254
4255static const struct dis386 three_byte_table[][256] = {
c1e679ec
DR
4256
4257 /* THREE_BYTE_0F38 */
c0f3af97
L
4258 {
4259 /* 00 */
507bd325
L
4260 { "pshufb", { MX, EM }, PREFIX_OPCODE },
4261 { "phaddw", { MX, EM }, PREFIX_OPCODE },
4262 { "phaddd", { MX, EM }, PREFIX_OPCODE },
4263 { "phaddsw", { MX, EM }, PREFIX_OPCODE },
4264 { "pmaddubsw", { MX, EM }, PREFIX_OPCODE },
4265 { "phsubw", { MX, EM }, PREFIX_OPCODE },
4266 { "phsubd", { MX, EM }, PREFIX_OPCODE },
4267 { "phsubsw", { MX, EM }, PREFIX_OPCODE },
c0f3af97 4268 /* 08 */
507bd325
L
4269 { "psignb", { MX, EM }, PREFIX_OPCODE },
4270 { "psignw", { MX, EM }, PREFIX_OPCODE },
4271 { "psignd", { MX, EM }, PREFIX_OPCODE },
4272 { "pmulhrsw", { MX, EM }, PREFIX_OPCODE },
592d1631
L
4273 { Bad_Opcode },
4274 { Bad_Opcode },
4275 { Bad_Opcode },
4276 { Bad_Opcode },
f88c9eb0 4277 /* 10 */
7531c613 4278 { "pblendvb", { XM, EXx, XMM0 }, PREFIX_DATA },
592d1631
L
4279 { Bad_Opcode },
4280 { Bad_Opcode },
4281 { Bad_Opcode },
7531c613
JB
4282 { "blendvps", { XM, EXx, XMM0 }, PREFIX_DATA },
4283 { "blendvpd", { XM, EXx, XMM0 }, PREFIX_DATA },
592d1631 4284 { Bad_Opcode },
7531c613 4285 { "ptest", { XM, EXx }, PREFIX_DATA },
f88c9eb0 4286 /* 18 */
592d1631
L
4287 { Bad_Opcode },
4288 { Bad_Opcode },
4289 { Bad_Opcode },
4290 { Bad_Opcode },
507bd325
L
4291 { "pabsb", { MX, EM }, PREFIX_OPCODE },
4292 { "pabsw", { MX, EM }, PREFIX_OPCODE },
4293 { "pabsd", { MX, EM }, PREFIX_OPCODE },
592d1631 4294 { Bad_Opcode },
f88c9eb0 4295 /* 20 */
7531c613
JB
4296 { "pmovsxbw", { XM, EXq }, PREFIX_DATA },
4297 { "pmovsxbd", { XM, EXd }, PREFIX_DATA },
4298 { "pmovsxbq", { XM, EXw }, PREFIX_DATA },
4299 { "pmovsxwd", { XM, EXq }, PREFIX_DATA },
4300 { "pmovsxwq", { XM, EXd }, PREFIX_DATA },
4301 { "pmovsxdq", { XM, EXq }, PREFIX_DATA },
592d1631
L
4302 { Bad_Opcode },
4303 { Bad_Opcode },
f88c9eb0 4304 /* 28 */
7531c613
JB
4305 { "pmuldq", { XM, EXx }, PREFIX_DATA },
4306 { "pcmpeqq", { XM, EXx }, PREFIX_DATA },
4307 { MOD_TABLE (MOD_0F382A) },
4308 { "packusdw", { XM, EXx }, PREFIX_DATA },
592d1631
L
4309 { Bad_Opcode },
4310 { Bad_Opcode },
4311 { Bad_Opcode },
4312 { Bad_Opcode },
f88c9eb0 4313 /* 30 */
7531c613
JB
4314 { "pmovzxbw", { XM, EXq }, PREFIX_DATA },
4315 { "pmovzxbd", { XM, EXd }, PREFIX_DATA },
4316 { "pmovzxbq", { XM, EXw }, PREFIX_DATA },
4317 { "pmovzxwd", { XM, EXq }, PREFIX_DATA },
4318 { "pmovzxwq", { XM, EXd }, PREFIX_DATA },
4319 { "pmovzxdq", { XM, EXq }, PREFIX_DATA },
4320 { Bad_Opcode },
4321 { "pcmpgtq", { XM, EXx }, PREFIX_DATA },
f88c9eb0 4322 /* 38 */
7531c613
JB
4323 { "pminsb", { XM, EXx }, PREFIX_DATA },
4324 { "pminsd", { XM, EXx }, PREFIX_DATA },
4325 { "pminuw", { XM, EXx }, PREFIX_DATA },
4326 { "pminud", { XM, EXx }, PREFIX_DATA },
4327 { "pmaxsb", { XM, EXx }, PREFIX_DATA },
4328 { "pmaxsd", { XM, EXx }, PREFIX_DATA },
4329 { "pmaxuw", { XM, EXx }, PREFIX_DATA },
4330 { "pmaxud", { XM, EXx }, PREFIX_DATA },
f88c9eb0 4331 /* 40 */
7531c613
JB
4332 { "pmulld", { XM, EXx }, PREFIX_DATA },
4333 { "phminposuw", { XM, EXx }, PREFIX_DATA },
592d1631
L
4334 { Bad_Opcode },
4335 { Bad_Opcode },
4336 { Bad_Opcode },
4337 { Bad_Opcode },
4338 { Bad_Opcode },
4339 { Bad_Opcode },
f88c9eb0 4340 /* 48 */
592d1631
L
4341 { Bad_Opcode },
4342 { Bad_Opcode },
4343 { Bad_Opcode },
4344 { Bad_Opcode },
4345 { Bad_Opcode },
4346 { Bad_Opcode },
4347 { Bad_Opcode },
4348 { Bad_Opcode },
f88c9eb0 4349 /* 50 */
592d1631
L
4350 { Bad_Opcode },
4351 { Bad_Opcode },
4352 { Bad_Opcode },
4353 { Bad_Opcode },
4354 { Bad_Opcode },
4355 { Bad_Opcode },
4356 { Bad_Opcode },
4357 { Bad_Opcode },
f88c9eb0 4358 /* 58 */
592d1631
L
4359 { Bad_Opcode },
4360 { Bad_Opcode },
4361 { Bad_Opcode },
4362 { Bad_Opcode },
4363 { Bad_Opcode },
4364 { Bad_Opcode },
4365 { Bad_Opcode },
4366 { Bad_Opcode },
f88c9eb0 4367 /* 60 */
592d1631
L
4368 { Bad_Opcode },
4369 { Bad_Opcode },
4370 { Bad_Opcode },
4371 { Bad_Opcode },
4372 { Bad_Opcode },
4373 { Bad_Opcode },
4374 { Bad_Opcode },
4375 { Bad_Opcode },
f88c9eb0 4376 /* 68 */
592d1631
L
4377 { Bad_Opcode },
4378 { Bad_Opcode },
4379 { Bad_Opcode },
4380 { Bad_Opcode },
4381 { Bad_Opcode },
4382 { Bad_Opcode },
4383 { Bad_Opcode },
4384 { Bad_Opcode },
f88c9eb0 4385 /* 70 */
592d1631
L
4386 { Bad_Opcode },
4387 { Bad_Opcode },
4388 { Bad_Opcode },
4389 { Bad_Opcode },
4390 { Bad_Opcode },
4391 { Bad_Opcode },
4392 { Bad_Opcode },
4393 { Bad_Opcode },
f88c9eb0 4394 /* 78 */
592d1631
L
4395 { Bad_Opcode },
4396 { Bad_Opcode },
4397 { Bad_Opcode },
4398 { Bad_Opcode },
4399 { Bad_Opcode },
4400 { Bad_Opcode },
4401 { Bad_Opcode },
4402 { Bad_Opcode },
f88c9eb0 4403 /* 80 */
7531c613
JB
4404 { "invept", { Gm, Mo }, PREFIX_DATA },
4405 { "invvpid", { Gm, Mo }, PREFIX_DATA },
4406 { "invpcid", { Gm, M }, PREFIX_DATA },
592d1631
L
4407 { Bad_Opcode },
4408 { Bad_Opcode },
4409 { Bad_Opcode },
4410 { Bad_Opcode },
4411 { Bad_Opcode },
f88c9eb0 4412 /* 88 */
592d1631
L
4413 { Bad_Opcode },
4414 { Bad_Opcode },
4415 { Bad_Opcode },
4416 { Bad_Opcode },
4417 { Bad_Opcode },
4418 { Bad_Opcode },
4419 { Bad_Opcode },
4420 { Bad_Opcode },
f88c9eb0 4421 /* 90 */
592d1631
L
4422 { Bad_Opcode },
4423 { Bad_Opcode },
4424 { Bad_Opcode },
4425 { Bad_Opcode },
4426 { Bad_Opcode },
4427 { Bad_Opcode },
4428 { Bad_Opcode },
4429 { Bad_Opcode },
f88c9eb0 4430 /* 98 */
592d1631
L
4431 { Bad_Opcode },
4432 { Bad_Opcode },
4433 { Bad_Opcode },
4434 { Bad_Opcode },
4435 { Bad_Opcode },
4436 { Bad_Opcode },
4437 { Bad_Opcode },
4438 { Bad_Opcode },
f88c9eb0 4439 /* a0 */
592d1631
L
4440 { Bad_Opcode },
4441 { Bad_Opcode },
4442 { Bad_Opcode },
4443 { Bad_Opcode },
4444 { Bad_Opcode },
4445 { Bad_Opcode },
4446 { Bad_Opcode },
4447 { Bad_Opcode },
f88c9eb0 4448 /* a8 */
592d1631
L
4449 { Bad_Opcode },
4450 { Bad_Opcode },
4451 { Bad_Opcode },
4452 { Bad_Opcode },
4453 { Bad_Opcode },
4454 { Bad_Opcode },
4455 { Bad_Opcode },
4456 { Bad_Opcode },
f88c9eb0 4457 /* b0 */
592d1631
L
4458 { Bad_Opcode },
4459 { Bad_Opcode },
4460 { Bad_Opcode },
4461 { Bad_Opcode },
4462 { Bad_Opcode },
4463 { Bad_Opcode },
4464 { Bad_Opcode },
4465 { Bad_Opcode },
f88c9eb0 4466 /* b8 */
592d1631
L
4467 { Bad_Opcode },
4468 { Bad_Opcode },
4469 { Bad_Opcode },
4470 { Bad_Opcode },
4471 { Bad_Opcode },
4472 { Bad_Opcode },
4473 { Bad_Opcode },
4474 { Bad_Opcode },
f88c9eb0 4475 /* c0 */
592d1631
L
4476 { Bad_Opcode },
4477 { Bad_Opcode },
4478 { Bad_Opcode },
4479 { Bad_Opcode },
4480 { Bad_Opcode },
4481 { Bad_Opcode },
4482 { Bad_Opcode },
4483 { Bad_Opcode },
f88c9eb0 4484 /* c8 */
035e7389
JB
4485 { "sha1nexte", { XM, EXxmm }, PREFIX_OPCODE },
4486 { "sha1msg1", { XM, EXxmm }, PREFIX_OPCODE },
4487 { "sha1msg2", { XM, EXxmm }, PREFIX_OPCODE },
4488 { "sha256rnds2", { XM, EXxmm, XMM0 }, PREFIX_OPCODE },
4489 { "sha256msg1", { XM, EXxmm }, PREFIX_OPCODE },
4490 { "sha256msg2", { XM, EXxmm }, PREFIX_OPCODE },
592d1631 4491 { Bad_Opcode },
7531c613 4492 { "gf2p8mulb", { XM, EXxmm }, PREFIX_DATA },
f88c9eb0 4493 /* d0 */
592d1631
L
4494 { Bad_Opcode },
4495 { Bad_Opcode },
4496 { Bad_Opcode },
4497 { Bad_Opcode },
4498 { Bad_Opcode },
4499 { Bad_Opcode },
4500 { Bad_Opcode },
4501 { Bad_Opcode },
f88c9eb0 4502 /* d8 */
c4694f17 4503 { PREFIX_TABLE (PREFIX_0F38D8) },
592d1631
L
4504 { Bad_Opcode },
4505 { Bad_Opcode },
7531c613 4506 { "aesimc", { XM, EXx }, PREFIX_DATA },
c4694f17
TG
4507 { PREFIX_TABLE (PREFIX_0F38DC) },
4508 { PREFIX_TABLE (PREFIX_0F38DD) },
4509 { PREFIX_TABLE (PREFIX_0F38DE) },
4510 { PREFIX_TABLE (PREFIX_0F38DF) },
f88c9eb0 4511 /* e0 */
592d1631
L
4512 { Bad_Opcode },
4513 { Bad_Opcode },
4514 { Bad_Opcode },
4515 { Bad_Opcode },
4516 { Bad_Opcode },
4517 { Bad_Opcode },
4518 { Bad_Opcode },
4519 { Bad_Opcode },
f88c9eb0 4520 /* e8 */
592d1631
L
4521 { Bad_Opcode },
4522 { Bad_Opcode },
4523 { Bad_Opcode },
4524 { Bad_Opcode },
4525 { Bad_Opcode },
4526 { Bad_Opcode },
4527 { Bad_Opcode },
4528 { Bad_Opcode },
f88c9eb0
SP
4529 /* f0 */
4530 { PREFIX_TABLE (PREFIX_0F38F0) },
4531 { PREFIX_TABLE (PREFIX_0F38F1) },
592d1631
L
4532 { Bad_Opcode },
4533 { Bad_Opcode },
4534 { Bad_Opcode },
7531c613 4535 { MOD_TABLE (MOD_0F38F5) },
e2e1fcde 4536 { PREFIX_TABLE (PREFIX_0F38F6) },
592d1631 4537 { Bad_Opcode },
f88c9eb0 4538 /* f8 */
c0a30a9f 4539 { PREFIX_TABLE (PREFIX_0F38F8) },
035e7389 4540 { MOD_TABLE (MOD_0F38F9) },
c4694f17
TG
4541 { PREFIX_TABLE (PREFIX_0F38FA) },
4542 { PREFIX_TABLE (PREFIX_0F38FB) },
592d1631
L
4543 { Bad_Opcode },
4544 { Bad_Opcode },
4545 { Bad_Opcode },
4546 { Bad_Opcode },
f88c9eb0
SP
4547 },
4548 /* THREE_BYTE_0F3A */
4549 {
4550 /* 00 */
592d1631
L
4551 { Bad_Opcode },
4552 { Bad_Opcode },
4553 { Bad_Opcode },
4554 { Bad_Opcode },
4555 { Bad_Opcode },
4556 { Bad_Opcode },
4557 { Bad_Opcode },
4558 { Bad_Opcode },
f88c9eb0 4559 /* 08 */
7531c613
JB
4560 { "roundps", { XM, EXx, Ib }, PREFIX_DATA },
4561 { "roundpd", { XM, EXx, Ib }, PREFIX_DATA },
4562 { "roundss", { XM, EXd, Ib }, PREFIX_DATA },
4563 { "roundsd", { XM, EXq, Ib }, PREFIX_DATA },
4564 { "blendps", { XM, EXx, Ib }, PREFIX_DATA },
4565 { "blendpd", { XM, EXx, Ib }, PREFIX_DATA },
4566 { "pblendw", { XM, EXx, Ib }, PREFIX_DATA },
507bd325 4567 { "palignr", { MX, EM, Ib }, PREFIX_OPCODE },
f88c9eb0 4568 /* 10 */
592d1631
L
4569 { Bad_Opcode },
4570 { Bad_Opcode },
4571 { Bad_Opcode },
4572 { Bad_Opcode },
7531c613
JB
4573 { "pextrb", { Edqb, XM, Ib }, PREFIX_DATA },
4574 { "pextrw", { Edqw, XM, Ib }, PREFIX_DATA },
4575 { "pextrK", { Edq, XM, Ib }, PREFIX_DATA },
4576 { "extractps", { Edqd, XM, Ib }, PREFIX_DATA },
f88c9eb0 4577 /* 18 */
592d1631
L
4578 { Bad_Opcode },
4579 { Bad_Opcode },
4580 { Bad_Opcode },
4581 { Bad_Opcode },
4582 { Bad_Opcode },
4583 { Bad_Opcode },
4584 { Bad_Opcode },
4585 { Bad_Opcode },
f88c9eb0 4586 /* 20 */
7531c613
JB
4587 { "pinsrb", { XM, Edqb, Ib }, PREFIX_DATA },
4588 { "insertps", { XM, EXd, Ib }, PREFIX_DATA },
4589 { "pinsrK", { XM, Edq, Ib }, PREFIX_DATA },
592d1631
L
4590 { Bad_Opcode },
4591 { Bad_Opcode },
4592 { Bad_Opcode },
4593 { Bad_Opcode },
4594 { Bad_Opcode },
f88c9eb0 4595 /* 28 */
592d1631
L
4596 { Bad_Opcode },
4597 { Bad_Opcode },
4598 { Bad_Opcode },
4599 { Bad_Opcode },
4600 { Bad_Opcode },
4601 { Bad_Opcode },
4602 { Bad_Opcode },
4603 { Bad_Opcode },
f88c9eb0 4604 /* 30 */
592d1631
L
4605 { Bad_Opcode },
4606 { Bad_Opcode },
4607 { Bad_Opcode },
4608 { Bad_Opcode },
4609 { Bad_Opcode },
4610 { Bad_Opcode },
4611 { Bad_Opcode },
4612 { Bad_Opcode },
f88c9eb0 4613 /* 38 */
592d1631
L
4614 { Bad_Opcode },
4615 { Bad_Opcode },
4616 { Bad_Opcode },
4617 { Bad_Opcode },
4618 { Bad_Opcode },
4619 { Bad_Opcode },
4620 { Bad_Opcode },
4621 { Bad_Opcode },
f88c9eb0 4622 /* 40 */
7531c613
JB
4623 { "dpps", { XM, EXx, Ib }, PREFIX_DATA },
4624 { "dppd", { XM, EXx, Ib }, PREFIX_DATA },
4625 { "mpsadbw", { XM, EXx, Ib }, PREFIX_DATA },
592d1631 4626 { Bad_Opcode },
7531c613 4627 { "pclmulqdq", { XM, EXx, PCLMUL }, PREFIX_DATA },
592d1631
L
4628 { Bad_Opcode },
4629 { Bad_Opcode },
4630 { Bad_Opcode },
f88c9eb0 4631 /* 48 */
592d1631
L
4632 { Bad_Opcode },
4633 { Bad_Opcode },
4634 { Bad_Opcode },
4635 { Bad_Opcode },
4636 { Bad_Opcode },
4637 { Bad_Opcode },
4638 { Bad_Opcode },
4639 { Bad_Opcode },
f88c9eb0 4640 /* 50 */
592d1631
L
4641 { Bad_Opcode },
4642 { Bad_Opcode },
4643 { Bad_Opcode },
4644 { Bad_Opcode },
4645 { Bad_Opcode },
4646 { Bad_Opcode },
4647 { Bad_Opcode },
4648 { Bad_Opcode },
f88c9eb0 4649 /* 58 */
592d1631
L
4650 { Bad_Opcode },
4651 { Bad_Opcode },
4652 { Bad_Opcode },
4653 { Bad_Opcode },
4654 { Bad_Opcode },
4655 { Bad_Opcode },
4656 { Bad_Opcode },
4657 { Bad_Opcode },
f88c9eb0 4658 /* 60 */
7531c613
JB
4659 { "pcmpestrm!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
4660 { "pcmpestri!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
4661 { "pcmpistrm", { XM, EXx, Ib }, PREFIX_DATA },
4662 { "pcmpistri", { XM, EXx, Ib }, PREFIX_DATA },
592d1631
L
4663 { Bad_Opcode },
4664 { Bad_Opcode },
4665 { Bad_Opcode },
4666 { Bad_Opcode },
f88c9eb0 4667 /* 68 */
592d1631
L
4668 { Bad_Opcode },
4669 { Bad_Opcode },
4670 { Bad_Opcode },
4671 { Bad_Opcode },
4672 { Bad_Opcode },
4673 { Bad_Opcode },
4674 { Bad_Opcode },
4675 { Bad_Opcode },
f88c9eb0 4676 /* 70 */
592d1631
L
4677 { Bad_Opcode },
4678 { Bad_Opcode },
4679 { Bad_Opcode },
4680 { Bad_Opcode },
4681 { Bad_Opcode },
4682 { Bad_Opcode },
4683 { Bad_Opcode },
4684 { Bad_Opcode },
f88c9eb0 4685 /* 78 */
592d1631
L
4686 { Bad_Opcode },
4687 { Bad_Opcode },
4688 { Bad_Opcode },
4689 { Bad_Opcode },
4690 { Bad_Opcode },
4691 { Bad_Opcode },
4692 { Bad_Opcode },
4693 { Bad_Opcode },
f88c9eb0 4694 /* 80 */
592d1631
L
4695 { Bad_Opcode },
4696 { Bad_Opcode },
4697 { Bad_Opcode },
4698 { Bad_Opcode },
4699 { Bad_Opcode },
4700 { Bad_Opcode },
4701 { Bad_Opcode },
4702 { Bad_Opcode },
f88c9eb0 4703 /* 88 */
592d1631
L
4704 { Bad_Opcode },
4705 { Bad_Opcode },
4706 { Bad_Opcode },
4707 { Bad_Opcode },
4708 { Bad_Opcode },
4709 { Bad_Opcode },
4710 { Bad_Opcode },
4711 { Bad_Opcode },
f88c9eb0 4712 /* 90 */
592d1631
L
4713 { Bad_Opcode },
4714 { Bad_Opcode },
4715 { Bad_Opcode },
4716 { Bad_Opcode },
4717 { Bad_Opcode },
4718 { Bad_Opcode },
4719 { Bad_Opcode },
4720 { Bad_Opcode },
f88c9eb0 4721 /* 98 */
592d1631
L
4722 { Bad_Opcode },
4723 { Bad_Opcode },
4724 { Bad_Opcode },
4725 { Bad_Opcode },
4726 { Bad_Opcode },
4727 { Bad_Opcode },
4728 { Bad_Opcode },
4729 { Bad_Opcode },
f88c9eb0 4730 /* a0 */
592d1631
L
4731 { Bad_Opcode },
4732 { Bad_Opcode },
4733 { Bad_Opcode },
4734 { Bad_Opcode },
4735 { Bad_Opcode },
4736 { Bad_Opcode },
4737 { Bad_Opcode },
4738 { Bad_Opcode },
f88c9eb0 4739 /* a8 */
592d1631
L
4740 { Bad_Opcode },
4741 { Bad_Opcode },
4742 { Bad_Opcode },
4743 { Bad_Opcode },
4744 { Bad_Opcode },
4745 { Bad_Opcode },
4746 { Bad_Opcode },
4747 { Bad_Opcode },
f88c9eb0 4748 /* b0 */
592d1631
L
4749 { Bad_Opcode },
4750 { Bad_Opcode },
4751 { Bad_Opcode },
4752 { Bad_Opcode },
4753 { Bad_Opcode },
4754 { Bad_Opcode },
4755 { Bad_Opcode },
4756 { Bad_Opcode },
f88c9eb0 4757 /* b8 */
592d1631
L
4758 { Bad_Opcode },
4759 { Bad_Opcode },
4760 { Bad_Opcode },
4761 { Bad_Opcode },
4762 { Bad_Opcode },
4763 { Bad_Opcode },
4764 { Bad_Opcode },
4765 { Bad_Opcode },
f88c9eb0 4766 /* c0 */
592d1631
L
4767 { Bad_Opcode },
4768 { Bad_Opcode },
4769 { Bad_Opcode },
4770 { Bad_Opcode },
4771 { Bad_Opcode },
4772 { Bad_Opcode },
4773 { Bad_Opcode },
4774 { Bad_Opcode },
f88c9eb0 4775 /* c8 */
592d1631
L
4776 { Bad_Opcode },
4777 { Bad_Opcode },
4778 { Bad_Opcode },
4779 { Bad_Opcode },
035e7389 4780 { "sha1rnds4", { XM, EXxmm, Ib }, PREFIX_OPCODE },
592d1631 4781 { Bad_Opcode },
7531c613
JB
4782 { "gf2p8affineqb", { XM, EXxmm, Ib }, PREFIX_DATA },
4783 { "gf2p8affineinvqb", { XM, EXxmm, Ib }, PREFIX_DATA },
f88c9eb0 4784 /* d0 */
592d1631
L
4785 { Bad_Opcode },
4786 { Bad_Opcode },
4787 { Bad_Opcode },
4788 { Bad_Opcode },
4789 { Bad_Opcode },
4790 { Bad_Opcode },
4791 { Bad_Opcode },
4792 { Bad_Opcode },
f88c9eb0 4793 /* d8 */
592d1631
L
4794 { Bad_Opcode },
4795 { Bad_Opcode },
4796 { Bad_Opcode },
4797 { Bad_Opcode },
4798 { Bad_Opcode },
4799 { Bad_Opcode },
4800 { Bad_Opcode },
7531c613 4801 { "aeskeygenassist", { XM, EXx, Ib }, PREFIX_DATA },
f88c9eb0 4802 /* e0 */
592d1631
L
4803 { Bad_Opcode },
4804 { Bad_Opcode },
4805 { Bad_Opcode },
4806 { Bad_Opcode },
4807 { Bad_Opcode },
592d1631
L
4808 { Bad_Opcode },
4809 { Bad_Opcode },
4810 { Bad_Opcode },
85f10a01 4811 /* e8 */
592d1631
L
4812 { Bad_Opcode },
4813 { Bad_Opcode },
4814 { Bad_Opcode },
4815 { Bad_Opcode },
4816 { Bad_Opcode },
4817 { Bad_Opcode },
4818 { Bad_Opcode },
4819 { Bad_Opcode },
85f10a01 4820 /* f0 */
592d1631
L
4821 { Bad_Opcode },
4822 { Bad_Opcode },
4823 { Bad_Opcode },
4824 { Bad_Opcode },
4825 { Bad_Opcode },
4826 { Bad_Opcode },
4827 { Bad_Opcode },
4828 { Bad_Opcode },
85f10a01 4829 /* f8 */
592d1631
L
4830 { Bad_Opcode },
4831 { Bad_Opcode },
4832 { Bad_Opcode },
4833 { Bad_Opcode },
4834 { Bad_Opcode },
4835 { Bad_Opcode },
4836 { Bad_Opcode },
4837 { Bad_Opcode },
85f10a01 4838 },
f88c9eb0
SP
4839};
4840
4841static const struct dis386 xop_table[][256] = {
5dd85c99 4842 /* XOP_08 */
85f10a01
MM
4843 {
4844 /* 00 */
592d1631
L
4845 { Bad_Opcode },
4846 { Bad_Opcode },
4847 { Bad_Opcode },
4848 { Bad_Opcode },
4849 { Bad_Opcode },
4850 { Bad_Opcode },
4851 { Bad_Opcode },
4852 { Bad_Opcode },
85f10a01 4853 /* 08 */
592d1631
L
4854 { Bad_Opcode },
4855 { Bad_Opcode },
4856 { Bad_Opcode },
4857 { Bad_Opcode },
4858 { Bad_Opcode },
4859 { Bad_Opcode },
4860 { Bad_Opcode },
4861 { Bad_Opcode },
85f10a01 4862 /* 10 */
3929df09 4863 { Bad_Opcode },
592d1631
L
4864 { Bad_Opcode },
4865 { Bad_Opcode },
4866 { Bad_Opcode },
4867 { Bad_Opcode },
4868 { Bad_Opcode },
4869 { Bad_Opcode },
4870 { Bad_Opcode },
85f10a01 4871 /* 18 */
592d1631
L
4872 { Bad_Opcode },
4873 { Bad_Opcode },
4874 { Bad_Opcode },
4875 { Bad_Opcode },
4876 { Bad_Opcode },
4877 { Bad_Opcode },
4878 { Bad_Opcode },
4879 { Bad_Opcode },
85f10a01 4880 /* 20 */
592d1631
L
4881 { Bad_Opcode },
4882 { Bad_Opcode },
4883 { Bad_Opcode },
4884 { Bad_Opcode },
4885 { Bad_Opcode },
4886 { Bad_Opcode },
4887 { Bad_Opcode },
4888 { Bad_Opcode },
85f10a01 4889 /* 28 */
592d1631
L
4890 { Bad_Opcode },
4891 { Bad_Opcode },
4892 { Bad_Opcode },
4893 { Bad_Opcode },
4894 { Bad_Opcode },
4895 { Bad_Opcode },
4896 { Bad_Opcode },
4897 { Bad_Opcode },
c0f3af97 4898 /* 30 */
592d1631
L
4899 { Bad_Opcode },
4900 { Bad_Opcode },
4901 { Bad_Opcode },
4902 { Bad_Opcode },
4903 { Bad_Opcode },
4904 { Bad_Opcode },
4905 { Bad_Opcode },
4906 { Bad_Opcode },
c0f3af97 4907 /* 38 */
592d1631
L
4908 { Bad_Opcode },
4909 { Bad_Opcode },
4910 { Bad_Opcode },
4911 { Bad_Opcode },
4912 { Bad_Opcode },
4913 { Bad_Opcode },
4914 { Bad_Opcode },
4915 { Bad_Opcode },
c0f3af97 4916 /* 40 */
592d1631
L
4917 { Bad_Opcode },
4918 { Bad_Opcode },
4919 { Bad_Opcode },
4920 { Bad_Opcode },
4921 { Bad_Opcode },
4922 { Bad_Opcode },
4923 { Bad_Opcode },
4924 { Bad_Opcode },
85f10a01 4925 /* 48 */
592d1631
L
4926 { Bad_Opcode },
4927 { Bad_Opcode },
4928 { Bad_Opcode },
4929 { Bad_Opcode },
4930 { Bad_Opcode },
4931 { Bad_Opcode },
4932 { Bad_Opcode },
4933 { Bad_Opcode },
c0f3af97 4934 /* 50 */
592d1631
L
4935 { Bad_Opcode },
4936 { Bad_Opcode },
4937 { Bad_Opcode },
4938 { Bad_Opcode },
4939 { Bad_Opcode },
4940 { Bad_Opcode },
4941 { Bad_Opcode },
4942 { Bad_Opcode },
85f10a01 4943 /* 58 */
592d1631
L
4944 { Bad_Opcode },
4945 { Bad_Opcode },
4946 { Bad_Opcode },
4947 { Bad_Opcode },
4948 { Bad_Opcode },
4949 { Bad_Opcode },
4950 { Bad_Opcode },
4951 { Bad_Opcode },
c1e679ec 4952 /* 60 */
592d1631
L
4953 { Bad_Opcode },
4954 { Bad_Opcode },
4955 { Bad_Opcode },
4956 { Bad_Opcode },
4957 { Bad_Opcode },
4958 { Bad_Opcode },
4959 { Bad_Opcode },
4960 { Bad_Opcode },
c0f3af97 4961 /* 68 */
592d1631
L
4962 { Bad_Opcode },
4963 { Bad_Opcode },
4964 { Bad_Opcode },
4965 { Bad_Opcode },
4966 { Bad_Opcode },
4967 { Bad_Opcode },
4968 { Bad_Opcode },
4969 { Bad_Opcode },
85f10a01 4970 /* 70 */
592d1631
L
4971 { Bad_Opcode },
4972 { Bad_Opcode },
4973 { Bad_Opcode },
4974 { Bad_Opcode },
4975 { Bad_Opcode },
4976 { Bad_Opcode },
4977 { Bad_Opcode },
4978 { Bad_Opcode },
85f10a01 4979 /* 78 */
592d1631
L
4980 { Bad_Opcode },
4981 { Bad_Opcode },
4982 { Bad_Opcode },
4983 { Bad_Opcode },
4984 { Bad_Opcode },
4985 { Bad_Opcode },
4986 { Bad_Opcode },
4987 { Bad_Opcode },
85f10a01 4988 /* 80 */
592d1631
L
4989 { Bad_Opcode },
4990 { Bad_Opcode },
4991 { Bad_Opcode },
4992 { Bad_Opcode },
4993 { Bad_Opcode },
467bbef0
JB
4994 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_85) },
4995 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_86) },
4996 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_87) },
5dd85c99 4997 /* 88 */
592d1631
L
4998 { Bad_Opcode },
4999 { Bad_Opcode },
5000 { Bad_Opcode },
5001 { Bad_Opcode },
5002 { Bad_Opcode },
5003 { Bad_Opcode },
467bbef0
JB
5004 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_8E) },
5005 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_8F) },
5dd85c99 5006 /* 90 */
592d1631
L
5007 { Bad_Opcode },
5008 { Bad_Opcode },
5009 { Bad_Opcode },
5010 { Bad_Opcode },
5011 { Bad_Opcode },
467bbef0
JB
5012 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_95) },
5013 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_96) },
5014 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_97) },
5dd85c99 5015 /* 98 */
592d1631
L
5016 { Bad_Opcode },
5017 { Bad_Opcode },
5018 { Bad_Opcode },
5019 { Bad_Opcode },
5020 { Bad_Opcode },
5021 { Bad_Opcode },
467bbef0
JB
5022 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_9E) },
5023 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_9F) },
5dd85c99 5024 /* a0 */
592d1631
L
5025 { Bad_Opcode },
5026 { Bad_Opcode },
b13b1bc0 5027 { "vpcmov", { XM, Vex, EXx, XMVexI4 }, 0 },
467bbef0 5028 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_A3) },
592d1631
L
5029 { Bad_Opcode },
5030 { Bad_Opcode },
467bbef0 5031 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_A6) },
592d1631 5032 { Bad_Opcode },
5dd85c99 5033 /* a8 */
592d1631
L
5034 { Bad_Opcode },
5035 { Bad_Opcode },
5036 { Bad_Opcode },
5037 { Bad_Opcode },
5038 { Bad_Opcode },
5039 { Bad_Opcode },
5040 { Bad_Opcode },
5041 { Bad_Opcode },
5dd85c99 5042 /* b0 */
592d1631
L
5043 { Bad_Opcode },
5044 { Bad_Opcode },
5045 { Bad_Opcode },
5046 { Bad_Opcode },
5047 { Bad_Opcode },
5048 { Bad_Opcode },
467bbef0 5049 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_B6) },
592d1631 5050 { Bad_Opcode },
5dd85c99 5051 /* b8 */
592d1631
L
5052 { Bad_Opcode },
5053 { Bad_Opcode },
5054 { Bad_Opcode },
5055 { Bad_Opcode },
5056 { Bad_Opcode },
5057 { Bad_Opcode },
5058 { Bad_Opcode },
5059 { Bad_Opcode },
5dd85c99 5060 /* c0 */
467bbef0
JB
5061 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C0) },
5062 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C1) },
5063 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C2) },
5064 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C3) },
592d1631
L
5065 { Bad_Opcode },
5066 { Bad_Opcode },
5067 { Bad_Opcode },
5068 { Bad_Opcode },
5dd85c99 5069 /* c8 */
592d1631
L
5070 { Bad_Opcode },
5071 { Bad_Opcode },
5072 { Bad_Opcode },
5073 { Bad_Opcode },
ff688e1f
L
5074 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CC) },
5075 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CD) },
5076 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CE) },
5077 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CF) },
5dd85c99 5078 /* d0 */
592d1631
L
5079 { Bad_Opcode },
5080 { Bad_Opcode },
5081 { Bad_Opcode },
5082 { Bad_Opcode },
5083 { Bad_Opcode },
5084 { Bad_Opcode },
5085 { Bad_Opcode },
5086 { Bad_Opcode },
5dd85c99 5087 /* d8 */
592d1631
L
5088 { Bad_Opcode },
5089 { Bad_Opcode },
5090 { Bad_Opcode },
5091 { Bad_Opcode },
5092 { Bad_Opcode },
5093 { Bad_Opcode },
5094 { Bad_Opcode },
5095 { Bad_Opcode },
5dd85c99 5096 /* e0 */
592d1631
L
5097 { Bad_Opcode },
5098 { Bad_Opcode },
5099 { Bad_Opcode },
5100 { Bad_Opcode },
5101 { Bad_Opcode },
5102 { Bad_Opcode },
5103 { Bad_Opcode },
5104 { Bad_Opcode },
5dd85c99 5105 /* e8 */
592d1631
L
5106 { Bad_Opcode },
5107 { Bad_Opcode },
5108 { Bad_Opcode },
5109 { Bad_Opcode },
ff688e1f
L
5110 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EC) },
5111 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_ED) },
5112 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EE) },
5113 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EF) },
5dd85c99 5114 /* f0 */
592d1631
L
5115 { Bad_Opcode },
5116 { Bad_Opcode },
5117 { Bad_Opcode },
5118 { Bad_Opcode },
5119 { Bad_Opcode },
5120 { Bad_Opcode },
5121 { Bad_Opcode },
5122 { Bad_Opcode },
5dd85c99 5123 /* f8 */
592d1631
L
5124 { Bad_Opcode },
5125 { Bad_Opcode },
5126 { Bad_Opcode },
5127 { Bad_Opcode },
5128 { Bad_Opcode },
5129 { Bad_Opcode },
5130 { Bad_Opcode },
5131 { Bad_Opcode },
5dd85c99
SP
5132 },
5133 /* XOP_09 */
5134 {
5135 /* 00 */
592d1631 5136 { Bad_Opcode },
467bbef0
JB
5137 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_01) },
5138 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_02) },
592d1631
L
5139 { Bad_Opcode },
5140 { Bad_Opcode },
5141 { Bad_Opcode },
5142 { Bad_Opcode },
5143 { Bad_Opcode },
5dd85c99 5144 /* 08 */
592d1631
L
5145 { Bad_Opcode },
5146 { Bad_Opcode },
5147 { Bad_Opcode },
5148 { Bad_Opcode },
5149 { Bad_Opcode },
5150 { Bad_Opcode },
5151 { Bad_Opcode },
5152 { Bad_Opcode },
5dd85c99 5153 /* 10 */
592d1631
L
5154 { Bad_Opcode },
5155 { Bad_Opcode },
467bbef0 5156 { MOD_TABLE (MOD_VEX_0FXOP_09_12) },
592d1631
L
5157 { Bad_Opcode },
5158 { Bad_Opcode },
5159 { Bad_Opcode },
5160 { Bad_Opcode },
5161 { Bad_Opcode },
5dd85c99 5162 /* 18 */
592d1631
L
5163 { Bad_Opcode },
5164 { Bad_Opcode },
5165 { Bad_Opcode },
5166 { Bad_Opcode },
5167 { Bad_Opcode },
5168 { Bad_Opcode },
5169 { Bad_Opcode },
5170 { Bad_Opcode },
5dd85c99 5171 /* 20 */
592d1631
L
5172 { Bad_Opcode },
5173 { Bad_Opcode },
5174 { Bad_Opcode },
5175 { Bad_Opcode },
5176 { Bad_Opcode },
5177 { Bad_Opcode },
5178 { Bad_Opcode },
5179 { Bad_Opcode },
5dd85c99 5180 /* 28 */
592d1631
L
5181 { Bad_Opcode },
5182 { Bad_Opcode },
5183 { Bad_Opcode },
5184 { Bad_Opcode },
5185 { Bad_Opcode },
5186 { Bad_Opcode },
5187 { Bad_Opcode },
5188 { Bad_Opcode },
5dd85c99 5189 /* 30 */
592d1631
L
5190 { Bad_Opcode },
5191 { Bad_Opcode },
5192 { Bad_Opcode },
5193 { Bad_Opcode },
5194 { Bad_Opcode },
5195 { Bad_Opcode },
5196 { Bad_Opcode },
5197 { Bad_Opcode },
5dd85c99 5198 /* 38 */
592d1631
L
5199 { Bad_Opcode },
5200 { Bad_Opcode },
5201 { Bad_Opcode },
5202 { Bad_Opcode },
5203 { Bad_Opcode },
5204 { Bad_Opcode },
5205 { Bad_Opcode },
5206 { Bad_Opcode },
5dd85c99 5207 /* 40 */
592d1631
L
5208 { Bad_Opcode },
5209 { Bad_Opcode },
5210 { Bad_Opcode },
5211 { Bad_Opcode },
5212 { Bad_Opcode },
5213 { Bad_Opcode },
5214 { Bad_Opcode },
5215 { Bad_Opcode },
5dd85c99 5216 /* 48 */
592d1631
L
5217 { Bad_Opcode },
5218 { Bad_Opcode },
5219 { Bad_Opcode },
5220 { Bad_Opcode },
5221 { Bad_Opcode },
5222 { Bad_Opcode },
5223 { Bad_Opcode },
5224 { Bad_Opcode },
5dd85c99 5225 /* 50 */
592d1631
L
5226 { Bad_Opcode },
5227 { Bad_Opcode },
5228 { Bad_Opcode },
5229 { Bad_Opcode },
5230 { Bad_Opcode },
5231 { Bad_Opcode },
5232 { Bad_Opcode },
5233 { Bad_Opcode },
5dd85c99 5234 /* 58 */
592d1631
L
5235 { Bad_Opcode },
5236 { Bad_Opcode },
5237 { Bad_Opcode },
5238 { Bad_Opcode },
5239 { Bad_Opcode },
5240 { Bad_Opcode },
5241 { Bad_Opcode },
5242 { Bad_Opcode },
5dd85c99 5243 /* 60 */
592d1631
L
5244 { Bad_Opcode },
5245 { Bad_Opcode },
5246 { Bad_Opcode },
5247 { Bad_Opcode },
5248 { Bad_Opcode },
5249 { Bad_Opcode },
5250 { Bad_Opcode },
5251 { Bad_Opcode },
5dd85c99 5252 /* 68 */
592d1631
L
5253 { Bad_Opcode },
5254 { Bad_Opcode },
5255 { Bad_Opcode },
5256 { Bad_Opcode },
5257 { Bad_Opcode },
5258 { Bad_Opcode },
5259 { Bad_Opcode },
5260 { Bad_Opcode },
5dd85c99 5261 /* 70 */
592d1631
L
5262 { Bad_Opcode },
5263 { Bad_Opcode },
5264 { Bad_Opcode },
5265 { Bad_Opcode },
5266 { Bad_Opcode },
5267 { Bad_Opcode },
5268 { Bad_Opcode },
5269 { Bad_Opcode },
5dd85c99 5270 /* 78 */
592d1631
L
5271 { Bad_Opcode },
5272 { Bad_Opcode },
5273 { Bad_Opcode },
5274 { Bad_Opcode },
5275 { Bad_Opcode },
5276 { Bad_Opcode },
5277 { Bad_Opcode },
5278 { Bad_Opcode },
5dd85c99 5279 /* 80 */
b5b098c2
JB
5280 { VEX_W_TABLE (VEX_W_0FXOP_09_80) },
5281 { VEX_W_TABLE (VEX_W_0FXOP_09_81) },
5282 { VEX_W_TABLE (VEX_W_0FXOP_09_82) },
5283 { VEX_W_TABLE (VEX_W_0FXOP_09_83) },
592d1631
L
5284 { Bad_Opcode },
5285 { Bad_Opcode },
5286 { Bad_Opcode },
5287 { Bad_Opcode },
5dd85c99 5288 /* 88 */
592d1631
L
5289 { Bad_Opcode },
5290 { Bad_Opcode },
5291 { Bad_Opcode },
5292 { Bad_Opcode },
5293 { Bad_Opcode },
5294 { Bad_Opcode },
5295 { Bad_Opcode },
5296 { Bad_Opcode },
5dd85c99 5297 /* 90 */
467bbef0
JB
5298 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_90) },
5299 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_91) },
5300 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_92) },
5301 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_93) },
5302 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_94) },
5303 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_95) },
5304 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_96) },
5305 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_97) },
5dd85c99 5306 /* 98 */
467bbef0
JB
5307 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_98) },
5308 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_99) },
5309 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_9A) },
5310 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_9B) },
592d1631
L
5311 { Bad_Opcode },
5312 { Bad_Opcode },
5313 { Bad_Opcode },
5314 { Bad_Opcode },
5dd85c99 5315 /* a0 */
592d1631
L
5316 { Bad_Opcode },
5317 { Bad_Opcode },
5318 { Bad_Opcode },
5319 { Bad_Opcode },
5320 { Bad_Opcode },
5321 { Bad_Opcode },
5322 { Bad_Opcode },
5323 { Bad_Opcode },
5dd85c99 5324 /* a8 */
592d1631
L
5325 { Bad_Opcode },
5326 { Bad_Opcode },
5327 { Bad_Opcode },
5328 { Bad_Opcode },
5329 { Bad_Opcode },
5330 { Bad_Opcode },
5331 { Bad_Opcode },
5332 { Bad_Opcode },
5dd85c99 5333 /* b0 */
592d1631
L
5334 { Bad_Opcode },
5335 { Bad_Opcode },
5336 { Bad_Opcode },
5337 { Bad_Opcode },
5338 { Bad_Opcode },
5339 { Bad_Opcode },
5340 { Bad_Opcode },
5341 { Bad_Opcode },
5dd85c99 5342 /* b8 */
592d1631
L
5343 { Bad_Opcode },
5344 { Bad_Opcode },
5345 { Bad_Opcode },
5346 { Bad_Opcode },
5347 { Bad_Opcode },
5348 { Bad_Opcode },
5349 { Bad_Opcode },
5350 { Bad_Opcode },
5dd85c99 5351 /* c0 */
592d1631 5352 { Bad_Opcode },
467bbef0
JB
5353 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C1) },
5354 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C2) },
5355 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C3) },
592d1631
L
5356 { Bad_Opcode },
5357 { Bad_Opcode },
467bbef0
JB
5358 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C6) },
5359 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C7) },
5dd85c99 5360 /* c8 */
592d1631
L
5361 { Bad_Opcode },
5362 { Bad_Opcode },
5363 { Bad_Opcode },
467bbef0 5364 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_CB) },
592d1631
L
5365 { Bad_Opcode },
5366 { Bad_Opcode },
5367 { Bad_Opcode },
5368 { Bad_Opcode },
5dd85c99 5369 /* d0 */
592d1631 5370 { Bad_Opcode },
467bbef0
JB
5371 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D1) },
5372 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D2) },
5373 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D3) },
592d1631
L
5374 { Bad_Opcode },
5375 { Bad_Opcode },
467bbef0
JB
5376 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D6) },
5377 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D7) },
5dd85c99 5378 /* d8 */
592d1631
L
5379 { Bad_Opcode },
5380 { Bad_Opcode },
5381 { Bad_Opcode },
467bbef0 5382 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_DB) },
592d1631
L
5383 { Bad_Opcode },
5384 { Bad_Opcode },
5385 { Bad_Opcode },
5386 { Bad_Opcode },
5dd85c99 5387 /* e0 */
592d1631 5388 { Bad_Opcode },
467bbef0
JB
5389 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E1) },
5390 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E2) },
5391 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E3) },
592d1631
L
5392 { Bad_Opcode },
5393 { Bad_Opcode },
5394 { Bad_Opcode },
5395 { Bad_Opcode },
4e7d34a6 5396 /* e8 */
592d1631
L
5397 { Bad_Opcode },
5398 { Bad_Opcode },
5399 { Bad_Opcode },
5400 { Bad_Opcode },
5401 { Bad_Opcode },
5402 { Bad_Opcode },
5403 { Bad_Opcode },
5404 { Bad_Opcode },
4e7d34a6 5405 /* f0 */
592d1631
L
5406 { Bad_Opcode },
5407 { Bad_Opcode },
5408 { Bad_Opcode },
5409 { Bad_Opcode },
5410 { Bad_Opcode },
5411 { Bad_Opcode },
5412 { Bad_Opcode },
5413 { Bad_Opcode },
4e7d34a6 5414 /* f8 */
592d1631
L
5415 { Bad_Opcode },
5416 { Bad_Opcode },
5417 { Bad_Opcode },
5418 { Bad_Opcode },
5419 { Bad_Opcode },
5420 { Bad_Opcode },
5421 { Bad_Opcode },
5422 { Bad_Opcode },
4e7d34a6 5423 },
f88c9eb0 5424 /* XOP_0A */
4e7d34a6
L
5425 {
5426 /* 00 */
592d1631
L
5427 { Bad_Opcode },
5428 { Bad_Opcode },
5429 { Bad_Opcode },
5430 { Bad_Opcode },
5431 { Bad_Opcode },
5432 { Bad_Opcode },
5433 { Bad_Opcode },
5434 { Bad_Opcode },
4e7d34a6 5435 /* 08 */
592d1631
L
5436 { Bad_Opcode },
5437 { Bad_Opcode },
5438 { Bad_Opcode },
5439 { Bad_Opcode },
5440 { Bad_Opcode },
5441 { Bad_Opcode },
5442 { Bad_Opcode },
5443 { Bad_Opcode },
4e7d34a6 5444 /* 10 */
c1dc7af5 5445 { "bextrS", { Gdq, Edq, Id }, 0 },
592d1631 5446 { Bad_Opcode },
467bbef0 5447 { VEX_LEN_TABLE (VEX_LEN_0FXOP_0A_12) },
592d1631
L
5448 { Bad_Opcode },
5449 { Bad_Opcode },
5450 { Bad_Opcode },
5451 { Bad_Opcode },
5452 { Bad_Opcode },
4e7d34a6 5453 /* 18 */
592d1631
L
5454 { Bad_Opcode },
5455 { Bad_Opcode },
5456 { Bad_Opcode },
5457 { Bad_Opcode },
5458 { Bad_Opcode },
5459 { Bad_Opcode },
5460 { Bad_Opcode },
5461 { Bad_Opcode },
4e7d34a6 5462 /* 20 */
592d1631
L
5463 { Bad_Opcode },
5464 { Bad_Opcode },
5465 { Bad_Opcode },
5466 { Bad_Opcode },
5467 { Bad_Opcode },
5468 { Bad_Opcode },
5469 { Bad_Opcode },
5470 { Bad_Opcode },
4e7d34a6 5471 /* 28 */
592d1631
L
5472 { Bad_Opcode },
5473 { Bad_Opcode },
5474 { Bad_Opcode },
5475 { Bad_Opcode },
5476 { Bad_Opcode },
5477 { Bad_Opcode },
5478 { Bad_Opcode },
5479 { Bad_Opcode },
4e7d34a6 5480 /* 30 */
592d1631
L
5481 { Bad_Opcode },
5482 { Bad_Opcode },
5483 { Bad_Opcode },
5484 { Bad_Opcode },
5485 { Bad_Opcode },
5486 { Bad_Opcode },
5487 { Bad_Opcode },
5488 { Bad_Opcode },
c0f3af97 5489 /* 38 */
592d1631
L
5490 { Bad_Opcode },
5491 { Bad_Opcode },
5492 { Bad_Opcode },
5493 { Bad_Opcode },
5494 { Bad_Opcode },
5495 { Bad_Opcode },
5496 { Bad_Opcode },
5497 { Bad_Opcode },
c0f3af97 5498 /* 40 */
592d1631
L
5499 { Bad_Opcode },
5500 { Bad_Opcode },
5501 { Bad_Opcode },
5502 { Bad_Opcode },
5503 { Bad_Opcode },
5504 { Bad_Opcode },
5505 { Bad_Opcode },
5506 { Bad_Opcode },
c1e679ec 5507 /* 48 */
592d1631
L
5508 { Bad_Opcode },
5509 { Bad_Opcode },
5510 { Bad_Opcode },
5511 { Bad_Opcode },
5512 { Bad_Opcode },
5513 { Bad_Opcode },
5514 { Bad_Opcode },
5515 { Bad_Opcode },
c1e679ec 5516 /* 50 */
592d1631
L
5517 { Bad_Opcode },
5518 { Bad_Opcode },
5519 { Bad_Opcode },
5520 { Bad_Opcode },
5521 { Bad_Opcode },
5522 { Bad_Opcode },
5523 { Bad_Opcode },
5524 { Bad_Opcode },
4e7d34a6 5525 /* 58 */
592d1631
L
5526 { Bad_Opcode },
5527 { Bad_Opcode },
5528 { Bad_Opcode },
5529 { Bad_Opcode },
5530 { Bad_Opcode },
5531 { Bad_Opcode },
5532 { Bad_Opcode },
5533 { Bad_Opcode },
4e7d34a6 5534 /* 60 */
592d1631
L
5535 { Bad_Opcode },
5536 { Bad_Opcode },
5537 { Bad_Opcode },
5538 { Bad_Opcode },
5539 { Bad_Opcode },
5540 { Bad_Opcode },
5541 { Bad_Opcode },
5542 { Bad_Opcode },
4e7d34a6 5543 /* 68 */
592d1631
L
5544 { Bad_Opcode },
5545 { Bad_Opcode },
5546 { Bad_Opcode },
5547 { Bad_Opcode },
5548 { Bad_Opcode },
5549 { Bad_Opcode },
5550 { Bad_Opcode },
5551 { Bad_Opcode },
4e7d34a6 5552 /* 70 */
592d1631
L
5553 { Bad_Opcode },
5554 { Bad_Opcode },
5555 { Bad_Opcode },
5556 { Bad_Opcode },
5557 { Bad_Opcode },
5558 { Bad_Opcode },
5559 { Bad_Opcode },
5560 { Bad_Opcode },
4e7d34a6 5561 /* 78 */
592d1631
L
5562 { Bad_Opcode },
5563 { Bad_Opcode },
5564 { Bad_Opcode },
5565 { Bad_Opcode },
5566 { Bad_Opcode },
5567 { Bad_Opcode },
5568 { Bad_Opcode },
5569 { Bad_Opcode },
4e7d34a6 5570 /* 80 */
592d1631
L
5571 { Bad_Opcode },
5572 { Bad_Opcode },
5573 { Bad_Opcode },
5574 { Bad_Opcode },
5575 { Bad_Opcode },
5576 { Bad_Opcode },
5577 { Bad_Opcode },
5578 { Bad_Opcode },
4e7d34a6 5579 /* 88 */
592d1631
L
5580 { Bad_Opcode },
5581 { Bad_Opcode },
5582 { Bad_Opcode },
5583 { Bad_Opcode },
5584 { Bad_Opcode },
5585 { Bad_Opcode },
5586 { Bad_Opcode },
5587 { Bad_Opcode },
4e7d34a6 5588 /* 90 */
592d1631
L
5589 { Bad_Opcode },
5590 { Bad_Opcode },
5591 { Bad_Opcode },
5592 { Bad_Opcode },
5593 { Bad_Opcode },
5594 { Bad_Opcode },
5595 { Bad_Opcode },
5596 { Bad_Opcode },
4e7d34a6 5597 /* 98 */
592d1631
L
5598 { Bad_Opcode },
5599 { Bad_Opcode },
5600 { Bad_Opcode },
5601 { Bad_Opcode },
5602 { Bad_Opcode },
5603 { Bad_Opcode },
5604 { Bad_Opcode },
5605 { Bad_Opcode },
4e7d34a6 5606 /* a0 */
592d1631
L
5607 { Bad_Opcode },
5608 { Bad_Opcode },
5609 { Bad_Opcode },
5610 { Bad_Opcode },
5611 { Bad_Opcode },
5612 { Bad_Opcode },
5613 { Bad_Opcode },
5614 { Bad_Opcode },
4e7d34a6 5615 /* a8 */
592d1631
L
5616 { Bad_Opcode },
5617 { Bad_Opcode },
5618 { Bad_Opcode },
5619 { Bad_Opcode },
5620 { Bad_Opcode },
5621 { Bad_Opcode },
5622 { Bad_Opcode },
5623 { Bad_Opcode },
d5d7db8e 5624 /* b0 */
592d1631
L
5625 { Bad_Opcode },
5626 { Bad_Opcode },
5627 { Bad_Opcode },
5628 { Bad_Opcode },
5629 { Bad_Opcode },
5630 { Bad_Opcode },
5631 { Bad_Opcode },
5632 { Bad_Opcode },
85f10a01 5633 /* b8 */
592d1631
L
5634 { Bad_Opcode },
5635 { Bad_Opcode },
5636 { Bad_Opcode },
5637 { Bad_Opcode },
5638 { Bad_Opcode },
5639 { Bad_Opcode },
5640 { Bad_Opcode },
5641 { Bad_Opcode },
85f10a01 5642 /* c0 */
592d1631
L
5643 { Bad_Opcode },
5644 { Bad_Opcode },
5645 { Bad_Opcode },
5646 { Bad_Opcode },
5647 { Bad_Opcode },
5648 { Bad_Opcode },
5649 { Bad_Opcode },
5650 { Bad_Opcode },
85f10a01 5651 /* c8 */
592d1631
L
5652 { Bad_Opcode },
5653 { Bad_Opcode },
5654 { Bad_Opcode },
5655 { Bad_Opcode },
5656 { Bad_Opcode },
5657 { Bad_Opcode },
5658 { Bad_Opcode },
5659 { Bad_Opcode },
85f10a01 5660 /* d0 */
592d1631
L
5661 { Bad_Opcode },
5662 { Bad_Opcode },
5663 { Bad_Opcode },
5664 { Bad_Opcode },
5665 { Bad_Opcode },
5666 { Bad_Opcode },
5667 { Bad_Opcode },
5668 { Bad_Opcode },
85f10a01 5669 /* d8 */
592d1631
L
5670 { Bad_Opcode },
5671 { Bad_Opcode },
5672 { Bad_Opcode },
5673 { Bad_Opcode },
5674 { Bad_Opcode },
5675 { Bad_Opcode },
5676 { Bad_Opcode },
5677 { Bad_Opcode },
85f10a01 5678 /* e0 */
592d1631
L
5679 { Bad_Opcode },
5680 { Bad_Opcode },
5681 { Bad_Opcode },
5682 { Bad_Opcode },
5683 { Bad_Opcode },
5684 { Bad_Opcode },
5685 { Bad_Opcode },
5686 { Bad_Opcode },
85f10a01 5687 /* e8 */
592d1631
L
5688 { Bad_Opcode },
5689 { Bad_Opcode },
5690 { Bad_Opcode },
5691 { Bad_Opcode },
5692 { Bad_Opcode },
5693 { Bad_Opcode },
5694 { Bad_Opcode },
5695 { Bad_Opcode },
85f10a01 5696 /* f0 */
592d1631
L
5697 { Bad_Opcode },
5698 { Bad_Opcode },
5699 { Bad_Opcode },
5700 { Bad_Opcode },
5701 { Bad_Opcode },
5702 { Bad_Opcode },
5703 { Bad_Opcode },
5704 { Bad_Opcode },
85f10a01 5705 /* f8 */
592d1631
L
5706 { Bad_Opcode },
5707 { Bad_Opcode },
5708 { Bad_Opcode },
5709 { Bad_Opcode },
5710 { Bad_Opcode },
5711 { Bad_Opcode },
5712 { Bad_Opcode },
5713 { Bad_Opcode },
85f10a01 5714 },
c0f3af97
L
5715};
5716
5717static const struct dis386 vex_table[][256] = {
5718 /* VEX_0F */
85f10a01
MM
5719 {
5720 /* 00 */
592d1631
L
5721 { Bad_Opcode },
5722 { Bad_Opcode },
5723 { Bad_Opcode },
5724 { Bad_Opcode },
5725 { Bad_Opcode },
5726 { Bad_Opcode },
5727 { Bad_Opcode },
5728 { Bad_Opcode },
85f10a01 5729 /* 08 */
592d1631
L
5730 { Bad_Opcode },
5731 { Bad_Opcode },
5732 { Bad_Opcode },
5733 { Bad_Opcode },
5734 { Bad_Opcode },
5735 { Bad_Opcode },
5736 { Bad_Opcode },
5737 { Bad_Opcode },
c0f3af97 5738 /* 10 */
592a252b
L
5739 { PREFIX_TABLE (PREFIX_VEX_0F10) },
5740 { PREFIX_TABLE (PREFIX_VEX_0F11) },
5741 { PREFIX_TABLE (PREFIX_VEX_0F12) },
5742 { MOD_TABLE (MOD_VEX_0F13) },
bf926894
JB
5743 { "vunpcklpX", { XM, Vex, EXx }, PREFIX_OPCODE },
5744 { "vunpckhpX", { XM, Vex, EXx }, PREFIX_OPCODE },
592a252b
L
5745 { PREFIX_TABLE (PREFIX_VEX_0F16) },
5746 { MOD_TABLE (MOD_VEX_0F17) },
c0f3af97 5747 /* 18 */
592d1631
L
5748 { Bad_Opcode },
5749 { Bad_Opcode },
5750 { Bad_Opcode },
5751 { Bad_Opcode },
5752 { Bad_Opcode },
5753 { Bad_Opcode },
5754 { Bad_Opcode },
5755 { Bad_Opcode },
c0f3af97 5756 /* 20 */
592d1631
L
5757 { Bad_Opcode },
5758 { Bad_Opcode },
5759 { Bad_Opcode },
5760 { Bad_Opcode },
5761 { Bad_Opcode },
5762 { Bad_Opcode },
5763 { Bad_Opcode },
5764 { Bad_Opcode },
c0f3af97 5765 /* 28 */
bf926894
JB
5766 { "vmovapX", { XM, EXx }, PREFIX_OPCODE },
5767 { "vmovapX", { EXxS, XM }, PREFIX_OPCODE },
592a252b
L
5768 { PREFIX_TABLE (PREFIX_VEX_0F2A) },
5769 { MOD_TABLE (MOD_VEX_0F2B) },
5770 { PREFIX_TABLE (PREFIX_VEX_0F2C) },
5771 { PREFIX_TABLE (PREFIX_VEX_0F2D) },
5772 { PREFIX_TABLE (PREFIX_VEX_0F2E) },
5773 { PREFIX_TABLE (PREFIX_VEX_0F2F) },
85f10a01 5774 /* 30 */
592d1631
L
5775 { Bad_Opcode },
5776 { Bad_Opcode },
5777 { Bad_Opcode },
5778 { Bad_Opcode },
5779 { Bad_Opcode },
5780 { Bad_Opcode },
5781 { Bad_Opcode },
5782 { Bad_Opcode },
4e7d34a6 5783 /* 38 */
592d1631
L
5784 { Bad_Opcode },
5785 { Bad_Opcode },
5786 { Bad_Opcode },
5787 { Bad_Opcode },
5788 { Bad_Opcode },
5789 { Bad_Opcode },
5790 { Bad_Opcode },
5791 { Bad_Opcode },
d5d7db8e 5792 /* 40 */
592d1631 5793 { Bad_Opcode },
43234a1e
L
5794 { PREFIX_TABLE (PREFIX_VEX_0F41) },
5795 { PREFIX_TABLE (PREFIX_VEX_0F42) },
592d1631 5796 { Bad_Opcode },
43234a1e
L
5797 { PREFIX_TABLE (PREFIX_VEX_0F44) },
5798 { PREFIX_TABLE (PREFIX_VEX_0F45) },
5799 { PREFIX_TABLE (PREFIX_VEX_0F46) },
5800 { PREFIX_TABLE (PREFIX_VEX_0F47) },
85f10a01 5801 /* 48 */
592d1631
L
5802 { Bad_Opcode },
5803 { Bad_Opcode },
1ba585e8 5804 { PREFIX_TABLE (PREFIX_VEX_0F4A) },
43234a1e 5805 { PREFIX_TABLE (PREFIX_VEX_0F4B) },
592d1631
L
5806 { Bad_Opcode },
5807 { Bad_Opcode },
5808 { Bad_Opcode },
5809 { Bad_Opcode },
d5d7db8e 5810 /* 50 */
592a252b
L
5811 { MOD_TABLE (MOD_VEX_0F50) },
5812 { PREFIX_TABLE (PREFIX_VEX_0F51) },
5813 { PREFIX_TABLE (PREFIX_VEX_0F52) },
5814 { PREFIX_TABLE (PREFIX_VEX_0F53) },
bf926894
JB
5815 { "vandpX", { XM, Vex, EXx }, PREFIX_OPCODE },
5816 { "vandnpX", { XM, Vex, EXx }, PREFIX_OPCODE },
5817 { "vorpX", { XM, Vex, EXx }, PREFIX_OPCODE },
5818 { "vxorpX", { XM, Vex, EXx }, PREFIX_OPCODE },
c0f3af97 5819 /* 58 */
592a252b
L
5820 { PREFIX_TABLE (PREFIX_VEX_0F58) },
5821 { PREFIX_TABLE (PREFIX_VEX_0F59) },
5822 { PREFIX_TABLE (PREFIX_VEX_0F5A) },
5823 { PREFIX_TABLE (PREFIX_VEX_0F5B) },
5824 { PREFIX_TABLE (PREFIX_VEX_0F5C) },
5825 { PREFIX_TABLE (PREFIX_VEX_0F5D) },
5826 { PREFIX_TABLE (PREFIX_VEX_0F5E) },
5827 { PREFIX_TABLE (PREFIX_VEX_0F5F) },
c0f3af97 5828 /* 60 */
7531c613
JB
5829 { "vpunpcklbw", { XM, Vex, EXx }, PREFIX_DATA },
5830 { "vpunpcklwd", { XM, Vex, EXx }, PREFIX_DATA },
5831 { "vpunpckldq", { XM, Vex, EXx }, PREFIX_DATA },
5832 { "vpacksswb", { XM, Vex, EXx }, PREFIX_DATA },
5833 { "vpcmpgtb", { XM, Vex, EXx }, PREFIX_DATA },
5834 { "vpcmpgtw", { XM, Vex, EXx }, PREFIX_DATA },
5835 { "vpcmpgtd", { XM, Vex, EXx }, PREFIX_DATA },
5836 { "vpackuswb", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 5837 /* 68 */
7531c613
JB
5838 { "vpunpckhbw", { XM, Vex, EXx }, PREFIX_DATA },
5839 { "vpunpckhwd", { XM, Vex, EXx }, PREFIX_DATA },
5840 { "vpunpckhdq", { XM, Vex, EXx }, PREFIX_DATA },
5841 { "vpackssdw", { XM, Vex, EXx }, PREFIX_DATA },
5842 { "vpunpcklqdq", { XM, Vex, EXx }, PREFIX_DATA },
5843 { "vpunpckhqdq", { XM, Vex, EXx }, PREFIX_DATA },
5844 { VEX_LEN_TABLE (VEX_LEN_0F6E) },
592a252b 5845 { PREFIX_TABLE (PREFIX_VEX_0F6F) },
c0f3af97 5846 /* 70 */
592a252b
L
5847 { PREFIX_TABLE (PREFIX_VEX_0F70) },
5848 { REG_TABLE (REG_VEX_0F71) },
5849 { REG_TABLE (REG_VEX_0F72) },
5850 { REG_TABLE (REG_VEX_0F73) },
7531c613
JB
5851 { "vpcmpeqb", { XM, Vex, EXx }, PREFIX_DATA },
5852 { "vpcmpeqw", { XM, Vex, EXx }, PREFIX_DATA },
5853 { "vpcmpeqd", { XM, Vex, EXx }, PREFIX_DATA },
035e7389 5854 { VEX_LEN_TABLE (VEX_LEN_0F77) },
c0f3af97 5855 /* 78 */
592d1631
L
5856 { Bad_Opcode },
5857 { Bad_Opcode },
5858 { Bad_Opcode },
5859 { Bad_Opcode },
592a252b
L
5860 { PREFIX_TABLE (PREFIX_VEX_0F7C) },
5861 { PREFIX_TABLE (PREFIX_VEX_0F7D) },
5862 { PREFIX_TABLE (PREFIX_VEX_0F7E) },
5863 { PREFIX_TABLE (PREFIX_VEX_0F7F) },
c0f3af97 5864 /* 80 */
592d1631
L
5865 { Bad_Opcode },
5866 { Bad_Opcode },
5867 { Bad_Opcode },
5868 { Bad_Opcode },
5869 { Bad_Opcode },
5870 { Bad_Opcode },
5871 { Bad_Opcode },
5872 { Bad_Opcode },
c0f3af97 5873 /* 88 */
592d1631
L
5874 { Bad_Opcode },
5875 { Bad_Opcode },
5876 { Bad_Opcode },
5877 { Bad_Opcode },
5878 { Bad_Opcode },
5879 { Bad_Opcode },
5880 { Bad_Opcode },
5881 { Bad_Opcode },
c0f3af97 5882 /* 90 */
43234a1e
L
5883 { PREFIX_TABLE (PREFIX_VEX_0F90) },
5884 { PREFIX_TABLE (PREFIX_VEX_0F91) },
5885 { PREFIX_TABLE (PREFIX_VEX_0F92) },
5886 { PREFIX_TABLE (PREFIX_VEX_0F93) },
592d1631
L
5887 { Bad_Opcode },
5888 { Bad_Opcode },
5889 { Bad_Opcode },
5890 { Bad_Opcode },
c0f3af97 5891 /* 98 */
43234a1e 5892 { PREFIX_TABLE (PREFIX_VEX_0F98) },
1ba585e8 5893 { PREFIX_TABLE (PREFIX_VEX_0F99) },
592d1631
L
5894 { Bad_Opcode },
5895 { Bad_Opcode },
5896 { Bad_Opcode },
5897 { Bad_Opcode },
5898 { Bad_Opcode },
5899 { Bad_Opcode },
c0f3af97 5900 /* a0 */
592d1631
L
5901 { Bad_Opcode },
5902 { Bad_Opcode },
5903 { Bad_Opcode },
5904 { Bad_Opcode },
5905 { Bad_Opcode },
5906 { Bad_Opcode },
5907 { Bad_Opcode },
5908 { Bad_Opcode },
c0f3af97 5909 /* a8 */
592d1631
L
5910 { Bad_Opcode },
5911 { Bad_Opcode },
5912 { Bad_Opcode },
5913 { Bad_Opcode },
5914 { Bad_Opcode },
5915 { Bad_Opcode },
592a252b 5916 { REG_TABLE (REG_VEX_0FAE) },
592d1631 5917 { Bad_Opcode },
c0f3af97 5918 /* b0 */
592d1631
L
5919 { Bad_Opcode },
5920 { Bad_Opcode },
5921 { Bad_Opcode },
5922 { Bad_Opcode },
5923 { Bad_Opcode },
5924 { Bad_Opcode },
5925 { Bad_Opcode },
5926 { Bad_Opcode },
c0f3af97 5927 /* b8 */
592d1631
L
5928 { Bad_Opcode },
5929 { Bad_Opcode },
5930 { Bad_Opcode },
5931 { Bad_Opcode },
5932 { Bad_Opcode },
5933 { Bad_Opcode },
5934 { Bad_Opcode },
5935 { Bad_Opcode },
c0f3af97 5936 /* c0 */
592d1631
L
5937 { Bad_Opcode },
5938 { Bad_Opcode },
592a252b 5939 { PREFIX_TABLE (PREFIX_VEX_0FC2) },
592d1631 5940 { Bad_Opcode },
7531c613
JB
5941 { VEX_LEN_TABLE (VEX_LEN_0FC4) },
5942 { VEX_LEN_TABLE (VEX_LEN_0FC5) },
bf926894 5943 { "vshufpX", { XM, Vex, EXx, Ib }, PREFIX_OPCODE },
592d1631 5944 { Bad_Opcode },
c0f3af97 5945 /* c8 */
592d1631
L
5946 { Bad_Opcode },
5947 { Bad_Opcode },
5948 { Bad_Opcode },
5949 { Bad_Opcode },
5950 { Bad_Opcode },
5951 { Bad_Opcode },
5952 { Bad_Opcode },
5953 { Bad_Opcode },
c0f3af97 5954 /* d0 */
592a252b 5955 { PREFIX_TABLE (PREFIX_VEX_0FD0) },
7531c613
JB
5956 { "vpsrlw", { XM, Vex, EXxmm }, PREFIX_DATA },
5957 { "vpsrld", { XM, Vex, EXxmm }, PREFIX_DATA },
5958 { "vpsrlq", { XM, Vex, EXxmm }, PREFIX_DATA },
5959 { "vpaddq", { XM, Vex, EXx }, PREFIX_DATA },
5960 { "vpmullw", { XM, Vex, EXx }, PREFIX_DATA },
5961 { VEX_LEN_TABLE (VEX_LEN_0FD6) },
5962 { MOD_TABLE (MOD_VEX_0FD7) },
c0f3af97 5963 /* d8 */
7531c613
JB
5964 { "vpsubusb", { XM, Vex, EXx }, PREFIX_DATA },
5965 { "vpsubusw", { XM, Vex, EXx }, PREFIX_DATA },
5966 { "vpminub", { XM, Vex, EXx }, PREFIX_DATA },
5967 { "vpand", { XM, Vex, EXx }, PREFIX_DATA },
5968 { "vpaddusb", { XM, Vex, EXx }, PREFIX_DATA },
5969 { "vpaddusw", { XM, Vex, EXx }, PREFIX_DATA },
5970 { "vpmaxub", { XM, Vex, EXx }, PREFIX_DATA },
5971 { "vpandn", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 5972 /* e0 */
7531c613
JB
5973 { "vpavgb", { XM, Vex, EXx }, PREFIX_DATA },
5974 { "vpsraw", { XM, Vex, EXxmm }, PREFIX_DATA },
5975 { "vpsrad", { XM, Vex, EXxmm }, PREFIX_DATA },
5976 { "vpavgw", { XM, Vex, EXx }, PREFIX_DATA },
5977 { "vpmulhuw", { XM, Vex, EXx }, PREFIX_DATA },
5978 { "vpmulhw", { XM, Vex, EXx }, PREFIX_DATA },
592a252b 5979 { PREFIX_TABLE (PREFIX_VEX_0FE6) },
7531c613 5980 { MOD_TABLE (MOD_VEX_0FE7) },
c0f3af97 5981 /* e8 */
7531c613
JB
5982 { "vpsubsb", { XM, Vex, EXx }, PREFIX_DATA },
5983 { "vpsubsw", { XM, Vex, EXx }, PREFIX_DATA },
5984 { "vpminsw", { XM, Vex, EXx }, PREFIX_DATA },
5985 { "vpor", { XM, Vex, EXx }, PREFIX_DATA },
5986 { "vpaddsb", { XM, Vex, EXx }, PREFIX_DATA },
5987 { "vpaddsw", { XM, Vex, EXx }, PREFIX_DATA },
5988 { "vpmaxsw", { XM, Vex, EXx }, PREFIX_DATA },
5989 { "vpxor", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 5990 /* f0 */
592a252b 5991 { PREFIX_TABLE (PREFIX_VEX_0FF0) },
7531c613
JB
5992 { "vpsllw", { XM, Vex, EXxmm }, PREFIX_DATA },
5993 { "vpslld", { XM, Vex, EXxmm }, PREFIX_DATA },
5994 { "vpsllq", { XM, Vex, EXxmm }, PREFIX_DATA },
5995 { "vpmuludq", { XM, Vex, EXx }, PREFIX_DATA },
5996 { "vpmaddwd", { XM, Vex, EXx }, PREFIX_DATA },
5997 { "vpsadbw", { XM, Vex, EXx }, PREFIX_DATA },
5998 { VEX_LEN_TABLE (VEX_LEN_0FF7) },
c0f3af97 5999 /* f8 */
7531c613
JB
6000 { "vpsubb", { XM, Vex, EXx }, PREFIX_DATA },
6001 { "vpsubw", { XM, Vex, EXx }, PREFIX_DATA },
6002 { "vpsubd", { XM, Vex, EXx }, PREFIX_DATA },
6003 { "vpsubq", { XM, Vex, EXx }, PREFIX_DATA },
6004 { "vpaddb", { XM, Vex, EXx }, PREFIX_DATA },
6005 { "vpaddw", { XM, Vex, EXx }, PREFIX_DATA },
6006 { "vpaddd", { XM, Vex, EXx }, PREFIX_DATA },
592d1631 6007 { Bad_Opcode },
c0f3af97
L
6008 },
6009 /* VEX_0F38 */
6010 {
6011 /* 00 */
7531c613
JB
6012 { "vpshufb", { XM, Vex, EXx }, PREFIX_DATA },
6013 { "vphaddw", { XM, Vex, EXx }, PREFIX_DATA },
6014 { "vphaddd", { XM, Vex, EXx }, PREFIX_DATA },
6015 { "vphaddsw", { XM, Vex, EXx }, PREFIX_DATA },
6016 { "vpmaddubsw", { XM, Vex, EXx }, PREFIX_DATA },
6017 { "vphsubw", { XM, Vex, EXx }, PREFIX_DATA },
6018 { "vphsubd", { XM, Vex, EXx }, PREFIX_DATA },
6019 { "vphsubsw", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6020 /* 08 */
7531c613
JB
6021 { "vpsignb", { XM, Vex, EXx }, PREFIX_DATA },
6022 { "vpsignw", { XM, Vex, EXx }, PREFIX_DATA },
6023 { "vpsignd", { XM, Vex, EXx }, PREFIX_DATA },
6024 { "vpmulhrsw", { XM, Vex, EXx }, PREFIX_DATA },
6025 { VEX_W_TABLE (VEX_W_0F380C) },
6026 { VEX_W_TABLE (VEX_W_0F380D) },
6027 { VEX_W_TABLE (VEX_W_0F380E) },
6028 { VEX_W_TABLE (VEX_W_0F380F) },
c0f3af97 6029 /* 10 */
592d1631
L
6030 { Bad_Opcode },
6031 { Bad_Opcode },
6032 { Bad_Opcode },
7531c613 6033 { VEX_W_TABLE (VEX_W_0F3813) },
592d1631
L
6034 { Bad_Opcode },
6035 { Bad_Opcode },
7531c613
JB
6036 { VEX_LEN_TABLE (VEX_LEN_0F3816) },
6037 { "vptest", { XM, EXx }, PREFIX_DATA },
c0f3af97 6038 /* 18 */
7531c613
JB
6039 { VEX_W_TABLE (VEX_W_0F3818) },
6040 { VEX_LEN_TABLE (VEX_LEN_0F3819) },
6041 { MOD_TABLE (MOD_VEX_0F381A) },
592d1631 6042 { Bad_Opcode },
7531c613
JB
6043 { "vpabsb", { XM, EXx }, PREFIX_DATA },
6044 { "vpabsw", { XM, EXx }, PREFIX_DATA },
6045 { "vpabsd", { XM, EXx }, PREFIX_DATA },
592d1631 6046 { Bad_Opcode },
c0f3af97 6047 /* 20 */
7531c613
JB
6048 { "vpmovsxbw", { XM, EXxmmq }, PREFIX_DATA },
6049 { "vpmovsxbd", { XM, EXxmmqd }, PREFIX_DATA },
6050 { "vpmovsxbq", { XM, EXxmmdw }, PREFIX_DATA },
6051 { "vpmovsxwd", { XM, EXxmmq }, PREFIX_DATA },
6052 { "vpmovsxwq", { XM, EXxmmqd }, PREFIX_DATA },
6053 { "vpmovsxdq", { XM, EXxmmq }, PREFIX_DATA },
592d1631
L
6054 { Bad_Opcode },
6055 { Bad_Opcode },
c0f3af97 6056 /* 28 */
7531c613
JB
6057 { "vpmuldq", { XM, Vex, EXx }, PREFIX_DATA },
6058 { "vpcmpeqq", { XM, Vex, EXx }, PREFIX_DATA },
6059 { MOD_TABLE (MOD_VEX_0F382A) },
6060 { "vpackusdw", { XM, Vex, EXx }, PREFIX_DATA },
6061 { MOD_TABLE (MOD_VEX_0F382C) },
6062 { MOD_TABLE (MOD_VEX_0F382D) },
6063 { MOD_TABLE (MOD_VEX_0F382E) },
6064 { MOD_TABLE (MOD_VEX_0F382F) },
c0f3af97 6065 /* 30 */
7531c613
JB
6066 { "vpmovzxbw", { XM, EXxmmq }, PREFIX_DATA },
6067 { "vpmovzxbd", { XM, EXxmmqd }, PREFIX_DATA },
6068 { "vpmovzxbq", { XM, EXxmmdw }, PREFIX_DATA },
6069 { "vpmovzxwd", { XM, EXxmmq }, PREFIX_DATA },
6070 { "vpmovzxwq", { XM, EXxmmqd }, PREFIX_DATA },
6071 { "vpmovzxdq", { XM, EXxmmq }, PREFIX_DATA },
6072 { VEX_LEN_TABLE (VEX_LEN_0F3836) },
6073 { "vpcmpgtq", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6074 /* 38 */
7531c613
JB
6075 { "vpminsb", { XM, Vex, EXx }, PREFIX_DATA },
6076 { "vpminsd", { XM, Vex, EXx }, PREFIX_DATA },
6077 { "vpminuw", { XM, Vex, EXx }, PREFIX_DATA },
6078 { "vpminud", { XM, Vex, EXx }, PREFIX_DATA },
6079 { "vpmaxsb", { XM, Vex, EXx }, PREFIX_DATA },
6080 { "vpmaxsd", { XM, Vex, EXx }, PREFIX_DATA },
6081 { "vpmaxuw", { XM, Vex, EXx }, PREFIX_DATA },
6082 { "vpmaxud", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6083 /* 40 */
7531c613
JB
6084 { "vpmulld", { XM, Vex, EXx }, PREFIX_DATA },
6085 { VEX_LEN_TABLE (VEX_LEN_0F3841) },
592d1631
L
6086 { Bad_Opcode },
6087 { Bad_Opcode },
6088 { Bad_Opcode },
7531c613
JB
6089 { "vpsrlv%DQ", { XM, Vex, EXx }, PREFIX_DATA },
6090 { VEX_W_TABLE (VEX_W_0F3846) },
6091 { "vpsllv%DQ", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6092 /* 48 */
592d1631 6093 { Bad_Opcode },
260cd341 6094 { X86_64_TABLE (X86_64_VEX_0F3849) },
592d1631 6095 { Bad_Opcode },
260cd341 6096 { X86_64_TABLE (X86_64_VEX_0F384B) },
592d1631
L
6097 { Bad_Opcode },
6098 { Bad_Opcode },
6099 { Bad_Opcode },
6100 { Bad_Opcode },
c0f3af97 6101 /* 50 */
592d1631
L
6102 { Bad_Opcode },
6103 { Bad_Opcode },
6104 { Bad_Opcode },
6105 { Bad_Opcode },
6106 { Bad_Opcode },
6107 { Bad_Opcode },
6108 { Bad_Opcode },
6109 { Bad_Opcode },
c0f3af97 6110 /* 58 */
7531c613
JB
6111 { VEX_W_TABLE (VEX_W_0F3858) },
6112 { VEX_W_TABLE (VEX_W_0F3859) },
6113 { MOD_TABLE (MOD_VEX_0F385A) },
592d1631 6114 { Bad_Opcode },
260cd341 6115 { X86_64_TABLE (X86_64_VEX_0F385C) },
592d1631 6116 { Bad_Opcode },
260cd341 6117 { X86_64_TABLE (X86_64_VEX_0F385E) },
592d1631 6118 { Bad_Opcode },
c0f3af97 6119 /* 60 */
592d1631
L
6120 { Bad_Opcode },
6121 { Bad_Opcode },
6122 { Bad_Opcode },
6123 { Bad_Opcode },
6124 { Bad_Opcode },
6125 { Bad_Opcode },
6126 { Bad_Opcode },
6127 { Bad_Opcode },
c0f3af97 6128 /* 68 */
592d1631
L
6129 { Bad_Opcode },
6130 { Bad_Opcode },
6131 { Bad_Opcode },
6132 { Bad_Opcode },
6133 { Bad_Opcode },
6134 { Bad_Opcode },
6135 { Bad_Opcode },
6136 { Bad_Opcode },
c0f3af97 6137 /* 70 */
592d1631
L
6138 { Bad_Opcode },
6139 { Bad_Opcode },
6140 { Bad_Opcode },
6141 { Bad_Opcode },
6142 { Bad_Opcode },
6143 { Bad_Opcode },
6144 { Bad_Opcode },
6145 { Bad_Opcode },
c0f3af97 6146 /* 78 */
7531c613
JB
6147 { VEX_W_TABLE (VEX_W_0F3878) },
6148 { VEX_W_TABLE (VEX_W_0F3879) },
592d1631
L
6149 { Bad_Opcode },
6150 { Bad_Opcode },
6151 { Bad_Opcode },
6152 { Bad_Opcode },
6153 { Bad_Opcode },
6154 { Bad_Opcode },
c0f3af97 6155 /* 80 */
592d1631
L
6156 { Bad_Opcode },
6157 { Bad_Opcode },
6158 { Bad_Opcode },
6159 { Bad_Opcode },
6160 { Bad_Opcode },
6161 { Bad_Opcode },
6162 { Bad_Opcode },
6163 { Bad_Opcode },
c0f3af97 6164 /* 88 */
592d1631
L
6165 { Bad_Opcode },
6166 { Bad_Opcode },
6167 { Bad_Opcode },
6168 { Bad_Opcode },
7531c613 6169 { MOD_TABLE (MOD_VEX_0F388C) },
592d1631 6170 { Bad_Opcode },
7531c613 6171 { MOD_TABLE (MOD_VEX_0F388E) },
592d1631 6172 { Bad_Opcode },
c0f3af97 6173 /* 90 */
7531c613
JB
6174 { "vpgatherd%DQ", { XM, MVexVSIBDWpX, Vex }, PREFIX_DATA },
6175 { "vpgatherq%DQ", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, PREFIX_DATA },
6176 { "vgatherdp%XW", { XM, MVexVSIBDWpX, Vex }, PREFIX_DATA },
6177 { "vgatherqp%XW", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, PREFIX_DATA },
592d1631
L
6178 { Bad_Opcode },
6179 { Bad_Opcode },
7531c613
JB
6180 { "vfmaddsub132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6181 { "vfmsubadd132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6182 /* 98 */
7531c613
JB
6183 { "vfmadd132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6184 { "vfmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6185 { "vfmsub132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6186 { "vfmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6187 { "vfnmadd132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6188 { "vfnmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6189 { "vfnmsub132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6190 { "vfnmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
c0f3af97 6191 /* a0 */
592d1631
L
6192 { Bad_Opcode },
6193 { Bad_Opcode },
6194 { Bad_Opcode },
6195 { Bad_Opcode },
6196 { Bad_Opcode },
6197 { Bad_Opcode },
7531c613
JB
6198 { "vfmaddsub213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6199 { "vfmsubadd213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6200 /* a8 */
7531c613
JB
6201 { "vfmadd213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6202 { "vfmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6203 { "vfmsub213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6204 { "vfmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6205 { "vfnmadd213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6206 { "vfnmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6207 { "vfnmsub213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6208 { "vfnmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
c0f3af97 6209 /* b0 */
592d1631
L
6210 { Bad_Opcode },
6211 { Bad_Opcode },
6212 { Bad_Opcode },
6213 { Bad_Opcode },
6214 { Bad_Opcode },
6215 { Bad_Opcode },
7531c613
JB
6216 { "vfmaddsub231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6217 { "vfmsubadd231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6218 /* b8 */
7531c613
JB
6219 { "vfmadd231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6220 { "vfmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6221 { "vfmsub231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6222 { "vfmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6223 { "vfnmadd231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6224 { "vfnmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6225 { "vfnmsub231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6226 { "vfnmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
c0f3af97 6227 /* c0 */
592d1631
L
6228 { Bad_Opcode },
6229 { Bad_Opcode },
6230 { Bad_Opcode },
6231 { Bad_Opcode },
6232 { Bad_Opcode },
6233 { Bad_Opcode },
6234 { Bad_Opcode },
6235 { Bad_Opcode },
c0f3af97 6236 /* c8 */
592d1631
L
6237 { Bad_Opcode },
6238 { Bad_Opcode },
6239 { Bad_Opcode },
6240 { Bad_Opcode },
6241 { Bad_Opcode },
6242 { Bad_Opcode },
6243 { Bad_Opcode },
7531c613 6244 { VEX_W_TABLE (VEX_W_0F38CF) },
c0f3af97 6245 /* d0 */
592d1631
L
6246 { Bad_Opcode },
6247 { Bad_Opcode },
6248 { Bad_Opcode },
6249 { Bad_Opcode },
6250 { Bad_Opcode },
6251 { Bad_Opcode },
6252 { Bad_Opcode },
6253 { Bad_Opcode },
c0f3af97 6254 /* d8 */
592d1631
L
6255 { Bad_Opcode },
6256 { Bad_Opcode },
6257 { Bad_Opcode },
7531c613
JB
6258 { VEX_LEN_TABLE (VEX_LEN_0F38DB) },
6259 { "vaesenc", { XM, Vex, EXx }, PREFIX_DATA },
6260 { "vaesenclast", { XM, Vex, EXx }, PREFIX_DATA },
6261 { "vaesdec", { XM, Vex, EXx }, PREFIX_DATA },
6262 { "vaesdeclast", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6263 /* e0 */
592d1631
L
6264 { Bad_Opcode },
6265 { Bad_Opcode },
6266 { Bad_Opcode },
6267 { Bad_Opcode },
6268 { Bad_Opcode },
6269 { Bad_Opcode },
6270 { Bad_Opcode },
6271 { Bad_Opcode },
c0f3af97 6272 /* e8 */
592d1631
L
6273 { Bad_Opcode },
6274 { Bad_Opcode },
6275 { Bad_Opcode },
6276 { Bad_Opcode },
6277 { Bad_Opcode },
6278 { Bad_Opcode },
6279 { Bad_Opcode },
6280 { Bad_Opcode },
c0f3af97 6281 /* f0 */
592d1631
L
6282 { Bad_Opcode },
6283 { Bad_Opcode },
035e7389 6284 { VEX_LEN_TABLE (VEX_LEN_0F38F2) },
f12dc422 6285 { REG_TABLE (REG_VEX_0F38F3) },
592d1631 6286 { Bad_Opcode },
6c30d220
L
6287 { PREFIX_TABLE (PREFIX_VEX_0F38F5) },
6288 { PREFIX_TABLE (PREFIX_VEX_0F38F6) },
f12dc422 6289 { PREFIX_TABLE (PREFIX_VEX_0F38F7) },
c0f3af97 6290 /* f8 */
592d1631
L
6291 { Bad_Opcode },
6292 { Bad_Opcode },
6293 { Bad_Opcode },
6294 { Bad_Opcode },
6295 { Bad_Opcode },
6296 { Bad_Opcode },
6297 { Bad_Opcode },
6298 { Bad_Opcode },
c0f3af97
L
6299 },
6300 /* VEX_0F3A */
6301 {
6302 /* 00 */
7531c613
JB
6303 { VEX_LEN_TABLE (VEX_LEN_0F3A00) },
6304 { VEX_LEN_TABLE (VEX_LEN_0F3A01) },
6305 { VEX_W_TABLE (VEX_W_0F3A02) },
592d1631 6306 { Bad_Opcode },
7531c613
JB
6307 { VEX_W_TABLE (VEX_W_0F3A04) },
6308 { VEX_W_TABLE (VEX_W_0F3A05) },
6309 { VEX_LEN_TABLE (VEX_LEN_0F3A06) },
592d1631 6310 { Bad_Opcode },
c0f3af97 6311 /* 08 */
7531c613
JB
6312 { "vroundps", { XM, EXx, Ib }, PREFIX_DATA },
6313 { "vroundpd", { XM, EXx, Ib }, PREFIX_DATA },
6314 { "vroundss", { XMScalar, VexScalar, EXxmm_md, Ib }, PREFIX_DATA },
6315 { "vroundsd", { XMScalar, VexScalar, EXxmm_mq, Ib }, PREFIX_DATA },
6316 { "vblendps", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6317 { "vblendpd", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6318 { "vpblendw", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6319 { "vpalignr", { XM, Vex, EXx, Ib }, PREFIX_DATA },
c0f3af97 6320 /* 10 */
592d1631
L
6321 { Bad_Opcode },
6322 { Bad_Opcode },
6323 { Bad_Opcode },
6324 { Bad_Opcode },
7531c613
JB
6325 { VEX_LEN_TABLE (VEX_LEN_0F3A14) },
6326 { VEX_LEN_TABLE (VEX_LEN_0F3A15) },
6327 { VEX_LEN_TABLE (VEX_LEN_0F3A16) },
6328 { VEX_LEN_TABLE (VEX_LEN_0F3A17) },
c0f3af97 6329 /* 18 */
7531c613
JB
6330 { VEX_LEN_TABLE (VEX_LEN_0F3A18) },
6331 { VEX_LEN_TABLE (VEX_LEN_0F3A19) },
592d1631
L
6332 { Bad_Opcode },
6333 { Bad_Opcode },
6334 { Bad_Opcode },
7531c613 6335 { VEX_W_TABLE (VEX_W_0F3A1D) },
592d1631
L
6336 { Bad_Opcode },
6337 { Bad_Opcode },
c0f3af97 6338 /* 20 */
7531c613
JB
6339 { VEX_LEN_TABLE (VEX_LEN_0F3A20) },
6340 { VEX_LEN_TABLE (VEX_LEN_0F3A21) },
6341 { VEX_LEN_TABLE (VEX_LEN_0F3A22) },
592d1631
L
6342 { Bad_Opcode },
6343 { Bad_Opcode },
6344 { Bad_Opcode },
6345 { Bad_Opcode },
6346 { Bad_Opcode },
c0f3af97 6347 /* 28 */
592d1631
L
6348 { Bad_Opcode },
6349 { Bad_Opcode },
6350 { Bad_Opcode },
6351 { Bad_Opcode },
6352 { Bad_Opcode },
6353 { Bad_Opcode },
6354 { Bad_Opcode },
6355 { Bad_Opcode },
c0f3af97 6356 /* 30 */
7531c613
JB
6357 { VEX_LEN_TABLE (VEX_LEN_0F3A30) },
6358 { VEX_LEN_TABLE (VEX_LEN_0F3A31) },
6359 { VEX_LEN_TABLE (VEX_LEN_0F3A32) },
6360 { VEX_LEN_TABLE (VEX_LEN_0F3A33) },
592d1631
L
6361 { Bad_Opcode },
6362 { Bad_Opcode },
6363 { Bad_Opcode },
6364 { Bad_Opcode },
c0f3af97 6365 /* 38 */
7531c613
JB
6366 { VEX_LEN_TABLE (VEX_LEN_0F3A38) },
6367 { VEX_LEN_TABLE (VEX_LEN_0F3A39) },
592d1631
L
6368 { Bad_Opcode },
6369 { Bad_Opcode },
6370 { Bad_Opcode },
6371 { Bad_Opcode },
6372 { Bad_Opcode },
6373 { Bad_Opcode },
c0f3af97 6374 /* 40 */
7531c613
JB
6375 { "vdpps", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6376 { VEX_LEN_TABLE (VEX_LEN_0F3A41) },
6377 { "vmpsadbw", { XM, Vex, EXx, Ib }, PREFIX_DATA },
592d1631 6378 { Bad_Opcode },
7531c613 6379 { "vpclmulqdq", { XM, Vex, EXx, PCLMUL }, PREFIX_DATA },
592d1631 6380 { Bad_Opcode },
7531c613 6381 { VEX_LEN_TABLE (VEX_LEN_0F3A46) },
592d1631 6382 { Bad_Opcode },
c0f3af97 6383 /* 48 */
7531c613
JB
6384 { "vpermil2ps", { XM, Vex, EXx, XMVexI4, VexI4 }, PREFIX_DATA },
6385 { "vpermil2pd", { XM, Vex, EXx, XMVexI4, VexI4 }, PREFIX_DATA },
6386 { VEX_W_TABLE (VEX_W_0F3A4A) },
6387 { VEX_W_TABLE (VEX_W_0F3A4B) },
6388 { VEX_W_TABLE (VEX_W_0F3A4C) },
592d1631
L
6389 { Bad_Opcode },
6390 { Bad_Opcode },
6391 { Bad_Opcode },
c0f3af97 6392 /* 50 */
592d1631
L
6393 { Bad_Opcode },
6394 { Bad_Opcode },
6395 { Bad_Opcode },
6396 { Bad_Opcode },
6397 { Bad_Opcode },
6398 { Bad_Opcode },
6399 { Bad_Opcode },
6400 { Bad_Opcode },
c0f3af97 6401 /* 58 */
592d1631
L
6402 { Bad_Opcode },
6403 { Bad_Opcode },
6404 { Bad_Opcode },
6405 { Bad_Opcode },
7531c613
JB
6406 { "vfmaddsubps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6407 { "vfmaddsubpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6408 { "vfmsubaddps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6409 { "vfmsubaddpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
c0f3af97 6410 /* 60 */
7531c613
JB
6411 { VEX_LEN_TABLE (VEX_LEN_0F3A60) },
6412 { VEX_LEN_TABLE (VEX_LEN_0F3A61) },
6413 { VEX_LEN_TABLE (VEX_LEN_0F3A62) },
6414 { VEX_LEN_TABLE (VEX_LEN_0F3A63) },
592d1631
L
6415 { Bad_Opcode },
6416 { Bad_Opcode },
6417 { Bad_Opcode },
6418 { Bad_Opcode },
c0f3af97 6419 /* 68 */
7531c613
JB
6420 { "vfmaddps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6421 { "vfmaddpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6422 { "vfmaddss", { XMScalar, VexScalar, EXxmm_md, XMVexScalarI4 }, PREFIX_DATA },
6423 { "vfmaddsd", { XMScalar, VexScalar, EXxmm_mq, XMVexScalarI4 }, PREFIX_DATA },
6424 { "vfmsubps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6425 { "vfmsubpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6426 { "vfmsubss", { XMScalar, VexScalar, EXxmm_md, XMVexScalarI4 }, PREFIX_DATA },
6427 { "vfmsubsd", { XMScalar, VexScalar, EXxmm_mq, XMVexScalarI4 }, PREFIX_DATA },
c0f3af97 6428 /* 70 */
592d1631
L
6429 { Bad_Opcode },
6430 { Bad_Opcode },
6431 { Bad_Opcode },
6432 { Bad_Opcode },
6433 { Bad_Opcode },
6434 { Bad_Opcode },
6435 { Bad_Opcode },
6436 { Bad_Opcode },
c0f3af97 6437 /* 78 */
7531c613
JB
6438 { "vfnmaddps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6439 { "vfnmaddpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6440 { "vfnmaddss", { XMScalar, VexScalar, EXxmm_md, XMVexScalarI4 }, PREFIX_DATA },
6441 { "vfnmaddsd", { XMScalar, VexScalar, EXxmm_mq, XMVexScalarI4 }, PREFIX_DATA },
6442 { "vfnmsubps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6443 { "vfnmsubpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6444 { "vfnmsubss", { XMScalar, VexScalar, EXxmm_md, XMVexScalarI4 }, PREFIX_DATA },
6445 { "vfnmsubsd", { XMScalar, VexScalar, EXxmm_mq, XMVexScalarI4 }, PREFIX_DATA },
c0f3af97 6446 /* 80 */
592d1631
L
6447 { Bad_Opcode },
6448 { Bad_Opcode },
6449 { Bad_Opcode },
6450 { Bad_Opcode },
6451 { Bad_Opcode },
6452 { Bad_Opcode },
6453 { Bad_Opcode },
6454 { Bad_Opcode },
c0f3af97 6455 /* 88 */
592d1631
L
6456 { Bad_Opcode },
6457 { Bad_Opcode },
6458 { Bad_Opcode },
6459 { Bad_Opcode },
6460 { Bad_Opcode },
6461 { Bad_Opcode },
6462 { Bad_Opcode },
6463 { Bad_Opcode },
c0f3af97 6464 /* 90 */
592d1631
L
6465 { Bad_Opcode },
6466 { Bad_Opcode },
6467 { Bad_Opcode },
6468 { Bad_Opcode },
6469 { Bad_Opcode },
6470 { Bad_Opcode },
6471 { Bad_Opcode },
6472 { Bad_Opcode },
c0f3af97 6473 /* 98 */
592d1631
L
6474 { Bad_Opcode },
6475 { Bad_Opcode },
6476 { Bad_Opcode },
6477 { Bad_Opcode },
6478 { Bad_Opcode },
6479 { Bad_Opcode },
6480 { Bad_Opcode },
6481 { Bad_Opcode },
c0f3af97 6482 /* a0 */
592d1631
L
6483 { Bad_Opcode },
6484 { Bad_Opcode },
6485 { Bad_Opcode },
6486 { Bad_Opcode },
6487 { Bad_Opcode },
6488 { Bad_Opcode },
6489 { Bad_Opcode },
6490 { Bad_Opcode },
c0f3af97 6491 /* a8 */
592d1631
L
6492 { Bad_Opcode },
6493 { Bad_Opcode },
6494 { Bad_Opcode },
6495 { Bad_Opcode },
6496 { Bad_Opcode },
6497 { Bad_Opcode },
6498 { Bad_Opcode },
6499 { Bad_Opcode },
c0f3af97 6500 /* b0 */
592d1631
L
6501 { Bad_Opcode },
6502 { Bad_Opcode },
6503 { Bad_Opcode },
6504 { Bad_Opcode },
6505 { Bad_Opcode },
6506 { Bad_Opcode },
6507 { Bad_Opcode },
6508 { Bad_Opcode },
c0f3af97 6509 /* b8 */
592d1631
L
6510 { Bad_Opcode },
6511 { Bad_Opcode },
6512 { Bad_Opcode },
6513 { Bad_Opcode },
6514 { Bad_Opcode },
6515 { Bad_Opcode },
6516 { Bad_Opcode },
6517 { Bad_Opcode },
c0f3af97 6518 /* c0 */
592d1631
L
6519 { Bad_Opcode },
6520 { Bad_Opcode },
6521 { Bad_Opcode },
6522 { Bad_Opcode },
6523 { Bad_Opcode },
6524 { Bad_Opcode },
6525 { Bad_Opcode },
6526 { Bad_Opcode },
c0f3af97 6527 /* c8 */
592d1631
L
6528 { Bad_Opcode },
6529 { Bad_Opcode },
6530 { Bad_Opcode },
6531 { Bad_Opcode },
6532 { Bad_Opcode },
6533 { Bad_Opcode },
7531c613
JB
6534 { VEX_W_TABLE (VEX_W_0F3ACE) },
6535 { VEX_W_TABLE (VEX_W_0F3ACF) },
c0f3af97 6536 /* d0 */
592d1631
L
6537 { Bad_Opcode },
6538 { Bad_Opcode },
6539 { Bad_Opcode },
6540 { Bad_Opcode },
6541 { Bad_Opcode },
6542 { Bad_Opcode },
6543 { Bad_Opcode },
6544 { Bad_Opcode },
c0f3af97 6545 /* d8 */
592d1631
L
6546 { Bad_Opcode },
6547 { Bad_Opcode },
6548 { Bad_Opcode },
6549 { Bad_Opcode },
6550 { Bad_Opcode },
6551 { Bad_Opcode },
6552 { Bad_Opcode },
7531c613 6553 { VEX_LEN_TABLE (VEX_LEN_0F3ADF) },
c0f3af97 6554 /* e0 */
592d1631
L
6555 { Bad_Opcode },
6556 { Bad_Opcode },
6557 { Bad_Opcode },
6558 { Bad_Opcode },
6559 { Bad_Opcode },
6560 { Bad_Opcode },
6561 { Bad_Opcode },
6562 { Bad_Opcode },
c0f3af97 6563 /* e8 */
592d1631
L
6564 { Bad_Opcode },
6565 { Bad_Opcode },
6566 { Bad_Opcode },
6567 { Bad_Opcode },
6568 { Bad_Opcode },
6569 { Bad_Opcode },
6570 { Bad_Opcode },
6571 { Bad_Opcode },
c0f3af97 6572 /* f0 */
6c30d220 6573 { PREFIX_TABLE (PREFIX_VEX_0F3AF0) },
592d1631
L
6574 { Bad_Opcode },
6575 { Bad_Opcode },
6576 { Bad_Opcode },
6577 { Bad_Opcode },
6578 { Bad_Opcode },
6579 { Bad_Opcode },
6580 { Bad_Opcode },
c0f3af97 6581 /* f8 */
592d1631
L
6582 { Bad_Opcode },
6583 { Bad_Opcode },
6584 { Bad_Opcode },
6585 { Bad_Opcode },
6586 { Bad_Opcode },
6587 { Bad_Opcode },
6588 { Bad_Opcode },
6589 { Bad_Opcode },
c0f3af97
L
6590 },
6591};
6592
43234a1e 6593#include "i386-dis-evex.h"
ad692897 6594
c0f3af97 6595static const struct dis386 vex_len_table[][2] = {
18897deb 6596 /* VEX_LEN_0F12_P_0_M_0 / VEX_LEN_0F12_P_2_M_0 */
c0f3af97 6597 {
89e65d17 6598 { "vmovlpX", { XM, Vex, EXq }, 0 },
c0f3af97
L
6599 },
6600
592a252b 6601 /* VEX_LEN_0F12_P_0_M_1 */
c0f3af97 6602 {
89e65d17 6603 { "vmovhlps", { XM, Vex, EXq }, 0 },
c0f3af97
L
6604 },
6605
592a252b 6606 /* VEX_LEN_0F13_M_0 */
c0f3af97 6607 {
bf926894 6608 { "vmovlpX", { EXq, XM }, PREFIX_OPCODE },
c0f3af97
L
6609 },
6610
18897deb 6611 /* VEX_LEN_0F16_P_0_M_0 / VEX_LEN_0F16_P_2_M_0 */
c0f3af97 6612 {
89e65d17 6613 { "vmovhpX", { XM, Vex, EXq }, 0 },
c0f3af97
L
6614 },
6615
592a252b 6616 /* VEX_LEN_0F16_P_0_M_1 */
c0f3af97 6617 {
89e65d17 6618 { "vmovlhps", { XM, Vex, EXq }, 0 },
c0f3af97
L
6619 },
6620
592a252b 6621 /* VEX_LEN_0F17_M_0 */
c0f3af97 6622 {
bf926894 6623 { "vmovhpX", { EXq, XM }, PREFIX_OPCODE },
c0f3af97
L
6624 },
6625
43234a1e
L
6626 /* VEX_LEN_0F41_P_0 */
6627 {
6628 { Bad_Opcode },
6629 { VEX_W_TABLE (VEX_W_0F41_P_0_LEN_1) },
6630 },
1ba585e8
IT
6631 /* VEX_LEN_0F41_P_2 */
6632 {
6633 { Bad_Opcode },
6634 { VEX_W_TABLE (VEX_W_0F41_P_2_LEN_1) },
6635 },
43234a1e
L
6636 /* VEX_LEN_0F42_P_0 */
6637 {
6638 { Bad_Opcode },
6639 { VEX_W_TABLE (VEX_W_0F42_P_0_LEN_1) },
6640 },
1ba585e8
IT
6641 /* VEX_LEN_0F42_P_2 */
6642 {
6643 { Bad_Opcode },
6644 { VEX_W_TABLE (VEX_W_0F42_P_2_LEN_1) },
6645 },
43234a1e
L
6646 /* VEX_LEN_0F44_P_0 */
6647 {
6648 { VEX_W_TABLE (VEX_W_0F44_P_0_LEN_0) },
6649 },
1ba585e8
IT
6650 /* VEX_LEN_0F44_P_2 */
6651 {
6652 { VEX_W_TABLE (VEX_W_0F44_P_2_LEN_0) },
6653 },
43234a1e
L
6654 /* VEX_LEN_0F45_P_0 */
6655 {
6656 { Bad_Opcode },
6657 { VEX_W_TABLE (VEX_W_0F45_P_0_LEN_1) },
6658 },
1ba585e8
IT
6659 /* VEX_LEN_0F45_P_2 */
6660 {
6661 { Bad_Opcode },
6662 { VEX_W_TABLE (VEX_W_0F45_P_2_LEN_1) },
6663 },
43234a1e
L
6664 /* VEX_LEN_0F46_P_0 */
6665 {
6666 { Bad_Opcode },
6667 { VEX_W_TABLE (VEX_W_0F46_P_0_LEN_1) },
6668 },
1ba585e8
IT
6669 /* VEX_LEN_0F46_P_2 */
6670 {
6671 { Bad_Opcode },
6672 { VEX_W_TABLE (VEX_W_0F46_P_2_LEN_1) },
6673 },
43234a1e
L
6674 /* VEX_LEN_0F47_P_0 */
6675 {
6676 { Bad_Opcode },
6677 { VEX_W_TABLE (VEX_W_0F47_P_0_LEN_1) },
6678 },
1ba585e8
IT
6679 /* VEX_LEN_0F47_P_2 */
6680 {
6681 { Bad_Opcode },
6682 { VEX_W_TABLE (VEX_W_0F47_P_2_LEN_1) },
6683 },
6684 /* VEX_LEN_0F4A_P_0 */
6685 {
6686 { Bad_Opcode },
6687 { VEX_W_TABLE (VEX_W_0F4A_P_0_LEN_1) },
6688 },
6689 /* VEX_LEN_0F4A_P_2 */
6690 {
6691 { Bad_Opcode },
6692 { VEX_W_TABLE (VEX_W_0F4A_P_2_LEN_1) },
6693 },
6694 /* VEX_LEN_0F4B_P_0 */
6695 {
6696 { Bad_Opcode },
6697 { VEX_W_TABLE (VEX_W_0F4B_P_0_LEN_1) },
6698 },
43234a1e
L
6699 /* VEX_LEN_0F4B_P_2 */
6700 {
6701 { Bad_Opcode },
6702 { VEX_W_TABLE (VEX_W_0F4B_P_2_LEN_1) },
6703 },
6704
7531c613 6705 /* VEX_LEN_0F6E */
c0f3af97 6706 {
7531c613 6707 { "vmovK", { XMScalar, Edq }, PREFIX_DATA },
c0f3af97
L
6708 },
6709
035e7389 6710 /* VEX_LEN_0F77 */
c0f3af97 6711 {
ec6f095a
L
6712 { "vzeroupper", { XX }, 0 },
6713 { "vzeroall", { XX }, 0 },
c0f3af97
L
6714 },
6715
ec6f095a 6716 /* VEX_LEN_0F7E_P_1 */
c0f3af97 6717 {
5b872f7d 6718 { "vmovq", { XMScalar, EXxmm_mq }, 0 },
c0f3af97
L
6719 },
6720
ec6f095a 6721 /* VEX_LEN_0F7E_P_2 */
c0f3af97 6722 {
ec6f095a 6723 { "vmovK", { Edq, XMScalar }, 0 },
c0f3af97
L
6724 },
6725
ec6f095a 6726 /* VEX_LEN_0F90_P_0 */
c0f3af97 6727 {
ec6f095a 6728 { VEX_W_TABLE (VEX_W_0F90_P_0_LEN_0) },
c0f3af97
L
6729 },
6730
ec6f095a 6731 /* VEX_LEN_0F90_P_2 */
c0f3af97 6732 {
ec6f095a 6733 { VEX_W_TABLE (VEX_W_0F90_P_2_LEN_0) },
c0f3af97
L
6734 },
6735
ec6f095a 6736 /* VEX_LEN_0F91_P_0 */
c0f3af97 6737 {
ec6f095a 6738 { VEX_W_TABLE (VEX_W_0F91_P_0_LEN_0) },
c0f3af97
L
6739 },
6740
ec6f095a 6741 /* VEX_LEN_0F91_P_2 */
c0f3af97 6742 {
ec6f095a 6743 { VEX_W_TABLE (VEX_W_0F91_P_2_LEN_0) },
c0f3af97
L
6744 },
6745
ec6f095a 6746 /* VEX_LEN_0F92_P_0 */
c0f3af97 6747 {
ec6f095a 6748 { VEX_W_TABLE (VEX_W_0F92_P_0_LEN_0) },
c0f3af97
L
6749 },
6750
ec6f095a 6751 /* VEX_LEN_0F92_P_2 */
c0f3af97 6752 {
ec6f095a 6753 { VEX_W_TABLE (VEX_W_0F92_P_2_LEN_0) },
c0f3af97
L
6754 },
6755
ec6f095a 6756 /* VEX_LEN_0F92_P_3 */
c0f3af97 6757 {
58a211d2 6758 { MOD_TABLE (MOD_VEX_0F92_P_3_LEN_0) },
c0f3af97
L
6759 },
6760
ec6f095a 6761 /* VEX_LEN_0F93_P_0 */
c0f3af97 6762 {
ec6f095a 6763 { VEX_W_TABLE (VEX_W_0F93_P_0_LEN_0) },
c0f3af97
L
6764 },
6765
ec6f095a 6766 /* VEX_LEN_0F93_P_2 */
c0f3af97 6767 {
ec6f095a 6768 { VEX_W_TABLE (VEX_W_0F93_P_2_LEN_0) },
c0f3af97
L
6769 },
6770
ec6f095a 6771 /* VEX_LEN_0F93_P_3 */
c0f3af97 6772 {
58a211d2 6773 { MOD_TABLE (MOD_VEX_0F93_P_3_LEN_0) },
c0f3af97
L
6774 },
6775
ec6f095a 6776 /* VEX_LEN_0F98_P_0 */
43234a1e
L
6777 {
6778 { VEX_W_TABLE (VEX_W_0F98_P_0_LEN_0) },
6779 },
6780
1ba585e8
IT
6781 /* VEX_LEN_0F98_P_2 */
6782 {
6783 { VEX_W_TABLE (VEX_W_0F98_P_2_LEN_0) },
6784 },
6785
6786 /* VEX_LEN_0F99_P_0 */
6787 {
6788 { VEX_W_TABLE (VEX_W_0F99_P_0_LEN_0) },
6789 },
6790
6791 /* VEX_LEN_0F99_P_2 */
6792 {
6793 { VEX_W_TABLE (VEX_W_0F99_P_2_LEN_0) },
6794 },
6795
6c30d220 6796 /* VEX_LEN_0FAE_R_2_M_0 */
c0f3af97 6797 {
ec6f095a 6798 { "vldmxcsr", { Md }, 0 },
c0f3af97
L
6799 },
6800
6c30d220 6801 /* VEX_LEN_0FAE_R_3_M_0 */
c0f3af97 6802 {
ec6f095a 6803 { "vstmxcsr", { Md }, 0 },
c0f3af97
L
6804 },
6805
7531c613 6806 /* VEX_LEN_0FC4 */
c0f3af97 6807 {
7531c613 6808 { "vpinsrw", { XM, Vex, Edqw, Ib }, PREFIX_DATA },
c0f3af97
L
6809 },
6810
7531c613 6811 /* VEX_LEN_0FC5 */
c0f3af97 6812 {
7531c613 6813 { "vpextrw", { Gdq, XS, Ib }, PREFIX_DATA },
c0f3af97
L
6814 },
6815
7531c613 6816 /* VEX_LEN_0FD6 */
c0f3af97 6817 {
7531c613 6818 { "vmovq", { EXqS, XMScalar }, PREFIX_DATA },
c0f3af97
L
6819 },
6820
7531c613 6821 /* VEX_LEN_0FF7 */
c0f3af97 6822 {
7531c613 6823 { "vmaskmovdqu", { XM, XS }, PREFIX_DATA },
c0f3af97
L
6824 },
6825
7531c613 6826 /* VEX_LEN_0F3816 */
c0f3af97 6827 {
6c30d220 6828 { Bad_Opcode },
7531c613 6829 { VEX_W_TABLE (VEX_W_0F3816_L_1) },
c0f3af97
L
6830 },
6831
7531c613 6832 /* VEX_LEN_0F3819 */
c0f3af97 6833 {
6c30d220 6834 { Bad_Opcode },
7531c613 6835 { VEX_W_TABLE (VEX_W_0F3819_L_1) },
c0f3af97
L
6836 },
6837
7531c613 6838 /* VEX_LEN_0F381A_M_0 */
c0f3af97 6839 {
6c30d220 6840 { Bad_Opcode },
7531c613 6841 { VEX_W_TABLE (VEX_W_0F381A_M_0_L_1) },
c0f3af97
L
6842 },
6843
7531c613 6844 /* VEX_LEN_0F3836 */
c0f3af97 6845 {
6c30d220 6846 { Bad_Opcode },
7531c613 6847 { VEX_W_TABLE (VEX_W_0F3836) },
c0f3af97
L
6848 },
6849
7531c613 6850 /* VEX_LEN_0F3841 */
c0f3af97 6851 {
7531c613 6852 { "vphminposuw", { XM, EXx }, PREFIX_DATA },
c0f3af97
L
6853 },
6854
260cd341
LC
6855 /* VEX_LEN_0F3849_X86_64_P_0_W_0_M_0 */
6856 {
6857 { "ldtilecfg", { M }, 0 },
6858 },
6859
6860 /* VEX_LEN_0F3849_X86_64_P_0_W_0_M_1_REG_0_RM_0 */
6861 {
6862 { "tilerelease", { Skip_MODRM }, 0 },
6863 },
6864
6865 /* VEX_LEN_0F3849_X86_64_P_2_W_0_M_0 */
6866 {
6867 { "sttilecfg", { M }, 0 },
6868 },
6869
6870 /* VEX_LEN_0F3849_X86_64_P_3_W_0_M_0 */
6871 {
6872 { "tilezero", { TMM, Skip_MODRM }, 0 },
6873 },
6874
6875 /* VEX_LEN_0F384B_X86_64_P_1_W_0_M_0 */
6876 {
6877 { "tilestored", { MVexSIBMEM, TMM }, 0 },
6878 },
6879 /* VEX_LEN_0F384B_X86_64_P_2_W_0_M_0 */
6880 {
6881 { "tileloaddt1", { TMM, MVexSIBMEM }, 0 },
6882 },
6883
6884 /* VEX_LEN_0F384B_X86_64_P_3_W_0_M_0 */
6885 {
6886 { "tileloadd", { TMM, MVexSIBMEM }, 0 },
6887 },
6888
7531c613 6889 /* VEX_LEN_0F385A_M_0 */
6c30d220
L
6890 {
6891 { Bad_Opcode },
7531c613 6892 { VEX_W_TABLE (VEX_W_0F385A_M_0_L_0) },
6c30d220
L
6893 },
6894
260cd341
LC
6895 /* VEX_LEN_0F385C_X86_64_P_1_W_0_M_0 */
6896 {
6897 { "tdpbf16ps", { TMM, EXtmm, VexTmm }, 0 },
6898 },
6899
6900 /* VEX_LEN_0F385E_X86_64_P_0_W_0_M_0 */
6901 {
6902 { "tdpbuud", {TMM, EXtmm, VexTmm }, 0 },
6903 },
6904
6905 /* VEX_LEN_0F385E_X86_64_P_1_W_0_M_0 */
6906 {
6907 { "tdpbsud", {TMM, EXtmm, VexTmm }, 0 },
6908 },
6909
6910 /* VEX_LEN_0F385E_X86_64_P_2_W_0_M_0 */
6911 {
6912 { "tdpbusd", {TMM, EXtmm, VexTmm }, 0 },
6913 },
6914
6915 /* VEX_LEN_0F385E_X86_64_P_3_W_0_M_0 */
6916 {
6917 { "tdpbssd", {TMM, EXtmm, VexTmm }, 0 },
6918 },
6919
7531c613 6920 /* VEX_LEN_0F38DB */
a5ff0eb2 6921 {
7531c613 6922 { "vaesimc", { XM, EXx }, PREFIX_DATA },
a5ff0eb2
L
6923 },
6924
035e7389 6925 /* VEX_LEN_0F38F2 */
f12dc422 6926 {
035e7389 6927 { "andnS", { Gdq, VexGdq, Edq }, PREFIX_OPCODE },
f12dc422
L
6928 },
6929
035e7389 6930 /* VEX_LEN_0F38F3_R_1 */
f12dc422 6931 {
035e7389 6932 { "blsrS", { VexGdq, Edq }, PREFIX_OPCODE },
f12dc422
L
6933 },
6934
035e7389 6935 /* VEX_LEN_0F38F3_R_2 */
f12dc422 6936 {
035e7389 6937 { "blsmskS", { VexGdq, Edq }, PREFIX_OPCODE },
f12dc422
L
6938 },
6939
035e7389 6940 /* VEX_LEN_0F38F3_R_3 */
f12dc422 6941 {
035e7389 6942 { "blsiS", { VexGdq, Edq }, PREFIX_OPCODE },
f12dc422
L
6943 },
6944
6c30d220
L
6945 /* VEX_LEN_0F38F5_P_0 */
6946 {
bf890a93 6947 { "bzhiS", { Gdq, Edq, VexGdq }, 0 },
6c30d220
L
6948 },
6949
6950 /* VEX_LEN_0F38F5_P_1 */
6951 {
bf890a93 6952 { "pextS", { Gdq, VexGdq, Edq }, 0 },
6c30d220
L
6953 },
6954
6955 /* VEX_LEN_0F38F5_P_3 */
6956 {
bf890a93 6957 { "pdepS", { Gdq, VexGdq, Edq }, 0 },
6c30d220
L
6958 },
6959
6960 /* VEX_LEN_0F38F6_P_3 */
6961 {
bf890a93 6962 { "mulxS", { Gdq, VexGdq, Edq }, 0 },
6c30d220
L
6963 },
6964
f12dc422
L
6965 /* VEX_LEN_0F38F7_P_0 */
6966 {
bf890a93 6967 { "bextrS", { Gdq, Edq, VexGdq }, 0 },
f12dc422
L
6968 },
6969
6c30d220
L
6970 /* VEX_LEN_0F38F7_P_1 */
6971 {
bf890a93 6972 { "sarxS", { Gdq, Edq, VexGdq }, 0 },
6c30d220
L
6973 },
6974
6975 /* VEX_LEN_0F38F7_P_2 */
6976 {
bf890a93 6977 { "shlxS", { Gdq, Edq, VexGdq }, 0 },
6c30d220
L
6978 },
6979
6980 /* VEX_LEN_0F38F7_P_3 */
6981 {
bf890a93 6982 { "shrxS", { Gdq, Edq, VexGdq }, 0 },
6c30d220
L
6983 },
6984
7531c613 6985 /* VEX_LEN_0F3A00 */
6c30d220
L
6986 {
6987 { Bad_Opcode },
7531c613 6988 { VEX_W_TABLE (VEX_W_0F3A00_L_1) },
6c30d220
L
6989 },
6990
7531c613 6991 /* VEX_LEN_0F3A01 */
6c30d220
L
6992 {
6993 { Bad_Opcode },
7531c613 6994 { VEX_W_TABLE (VEX_W_0F3A01_L_1) },
6c30d220
L
6995 },
6996
7531c613 6997 /* VEX_LEN_0F3A06 */
c0f3af97 6998 {
592d1631 6999 { Bad_Opcode },
7531c613 7000 { VEX_W_TABLE (VEX_W_0F3A06_L_1) },
c0f3af97
L
7001 },
7002
7531c613 7003 /* VEX_LEN_0F3A14 */
c0f3af97 7004 {
7531c613 7005 { "vpextrb", { Edqb, XM, Ib }, PREFIX_DATA },
c0f3af97
L
7006 },
7007
7531c613 7008 /* VEX_LEN_0F3A15 */
c0f3af97 7009 {
7531c613 7010 { "vpextrw", { Edqw, XM, Ib }, PREFIX_DATA },
c0f3af97
L
7011 },
7012
7531c613 7013 /* VEX_LEN_0F3A16 */
c0f3af97 7014 {
7531c613 7015 { "vpextrK", { Edq, XM, Ib }, PREFIX_DATA },
c0f3af97
L
7016 },
7017
7531c613 7018 /* VEX_LEN_0F3A17 */
c0f3af97 7019 {
7531c613 7020 { "vextractps", { Edqd, XM, Ib }, PREFIX_DATA },
c0f3af97
L
7021 },
7022
7531c613 7023 /* VEX_LEN_0F3A18 */
c0f3af97 7024 {
592d1631 7025 { Bad_Opcode },
7531c613 7026 { VEX_W_TABLE (VEX_W_0F3A18_L_1) },
c0f3af97
L
7027 },
7028
7531c613 7029 /* VEX_LEN_0F3A19 */
c0f3af97 7030 {
592d1631 7031 { Bad_Opcode },
7531c613 7032 { VEX_W_TABLE (VEX_W_0F3A19_L_1) },
c0f3af97
L
7033 },
7034
7531c613 7035 /* VEX_LEN_0F3A20 */
c0f3af97 7036 {
7531c613 7037 { "vpinsrb", { XM, Vex, Edqb, Ib }, PREFIX_DATA },
c0f3af97
L
7038 },
7039
7531c613 7040 /* VEX_LEN_0F3A21 */
c0f3af97 7041 {
7531c613 7042 { "vinsertps", { XM, Vex, EXd, Ib }, PREFIX_DATA },
c0f3af97
L
7043 },
7044
7531c613 7045 /* VEX_LEN_0F3A22 */
c0f3af97 7046 {
7531c613 7047 { "vpinsrK", { XM, Vex, Edq, Ib }, PREFIX_DATA },
c0f3af97
L
7048 },
7049
7531c613 7050 /* VEX_LEN_0F3A30 */
43234a1e 7051 {
bb5b3501 7052 { MOD_TABLE (MOD_VEX_0F3A30_L_0) },
43234a1e
L
7053 },
7054
7531c613 7055 /* VEX_LEN_0F3A31 */
1ba585e8 7056 {
bb5b3501 7057 { MOD_TABLE (MOD_VEX_0F3A31_L_0) },
1ba585e8
IT
7058 },
7059
7531c613 7060 /* VEX_LEN_0F3A32 */
43234a1e 7061 {
bb5b3501 7062 { MOD_TABLE (MOD_VEX_0F3A32_L_0) },
43234a1e
L
7063 },
7064
7531c613 7065 /* VEX_LEN_0F3A33 */
1ba585e8 7066 {
bb5b3501 7067 { MOD_TABLE (MOD_VEX_0F3A33_L_0) },
1ba585e8
IT
7068 },
7069
7531c613 7070 /* VEX_LEN_0F3A38 */
c0f3af97 7071 {
6c30d220 7072 { Bad_Opcode },
7531c613 7073 { VEX_W_TABLE (VEX_W_0F3A38_L_1) },
c0f3af97
L
7074 },
7075
7531c613 7076 /* VEX_LEN_0F3A39 */
c0f3af97 7077 {
6c30d220 7078 { Bad_Opcode },
7531c613 7079 { VEX_W_TABLE (VEX_W_0F3A39_L_1) },
6c30d220
L
7080 },
7081
7531c613 7082 /* VEX_LEN_0F3A41 */
6c30d220 7083 {
7531c613 7084 { "vdppd", { XM, Vex, EXx, Ib }, PREFIX_DATA },
c0f3af97
L
7085 },
7086
7531c613 7087 /* VEX_LEN_0F3A46 */
c0f3af97 7088 {
6c30d220 7089 { Bad_Opcode },
7531c613 7090 { VEX_W_TABLE (VEX_W_0F3A46_L_1) },
c0f3af97
L
7091 },
7092
7531c613 7093 /* VEX_LEN_0F3A60 */
c0f3af97 7094 {
7531c613 7095 { "vpcmpestrm!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
c0f3af97
L
7096 },
7097
7531c613 7098 /* VEX_LEN_0F3A61 */
c0f3af97 7099 {
7531c613 7100 { "vpcmpestri!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
c0f3af97
L
7101 },
7102
7531c613 7103 /* VEX_LEN_0F3A62 */
c0f3af97 7104 {
7531c613 7105 { "vpcmpistrm", { XM, EXx, Ib }, PREFIX_DATA },
c0f3af97
L
7106 },
7107
7531c613 7108 /* VEX_LEN_0F3A63 */
c0f3af97 7109 {
7531c613 7110 { "vpcmpistri", { XM, EXx, Ib }, PREFIX_DATA },
c0f3af97
L
7111 },
7112
7531c613 7113 /* VEX_LEN_0F3ADF */
a5ff0eb2 7114 {
7531c613 7115 { "vaeskeygenassist", { XM, EXx, Ib }, PREFIX_DATA },
a5ff0eb2 7116 },
4c807e72 7117
6c30d220
L
7118 /* VEX_LEN_0F3AF0_P_3 */
7119 {
bf890a93 7120 { "rorxS", { Gdq, Edq, Ib }, 0 },
6c30d220
L
7121 },
7122
467bbef0
JB
7123 /* VEX_LEN_0FXOP_08_85 */
7124 {
7125 { VEX_W_TABLE (VEX_W_0FXOP_08_85_L_0) },
7126 },
7127
7128 /* VEX_LEN_0FXOP_08_86 */
7129 {
7130 { VEX_W_TABLE (VEX_W_0FXOP_08_86_L_0) },
7131 },
7132
7133 /* VEX_LEN_0FXOP_08_87 */
7134 {
7135 { VEX_W_TABLE (VEX_W_0FXOP_08_87_L_0) },
7136 },
7137
7138 /* VEX_LEN_0FXOP_08_8E */
7139 {
7140 { VEX_W_TABLE (VEX_W_0FXOP_08_8E_L_0) },
7141 },
7142
7143 /* VEX_LEN_0FXOP_08_8F */
7144 {
7145 { VEX_W_TABLE (VEX_W_0FXOP_08_8F_L_0) },
7146 },
7147
7148 /* VEX_LEN_0FXOP_08_95 */
7149 {
7150 { VEX_W_TABLE (VEX_W_0FXOP_08_95_L_0) },
7151 },
7152
7153 /* VEX_LEN_0FXOP_08_96 */
7154 {
7155 { VEX_W_TABLE (VEX_W_0FXOP_08_96_L_0) },
7156 },
7157
7158 /* VEX_LEN_0FXOP_08_97 */
7159 {
7160 { VEX_W_TABLE (VEX_W_0FXOP_08_97_L_0) },
7161 },
7162
7163 /* VEX_LEN_0FXOP_08_9E */
7164 {
7165 { VEX_W_TABLE (VEX_W_0FXOP_08_9E_L_0) },
7166 },
7167
7168 /* VEX_LEN_0FXOP_08_9F */
7169 {
7170 { VEX_W_TABLE (VEX_W_0FXOP_08_9F_L_0) },
7171 },
7172
7173 /* VEX_LEN_0FXOP_08_A3 */
7174 {
7175 { "vpperm", { XM, Vex, EXx, XMVexI4 }, 0 },
7176 },
7177
7178 /* VEX_LEN_0FXOP_08_A6 */
7179 {
7180 { VEX_W_TABLE (VEX_W_0FXOP_08_A6_L_0) },
7181 },
7182
7183 /* VEX_LEN_0FXOP_08_B6 */
7184 {
7185 { VEX_W_TABLE (VEX_W_0FXOP_08_B6_L_0) },
7186 },
7187
7188 /* VEX_LEN_0FXOP_08_C0 */
7189 {
7190 { VEX_W_TABLE (VEX_W_0FXOP_08_C0_L_0) },
7191 },
7192
7193 /* VEX_LEN_0FXOP_08_C1 */
7194 {
7195 { VEX_W_TABLE (VEX_W_0FXOP_08_C1_L_0) },
7196 },
7197
7198 /* VEX_LEN_0FXOP_08_C2 */
7199 {
7200 { VEX_W_TABLE (VEX_W_0FXOP_08_C2_L_0) },
7201 },
7202
7203 /* VEX_LEN_0FXOP_08_C3 */
7204 {
7205 { VEX_W_TABLE (VEX_W_0FXOP_08_C3_L_0) },
7206 },
7207
ff688e1f
L
7208 /* VEX_LEN_0FXOP_08_CC */
7209 {
467bbef0 7210 { VEX_W_TABLE (VEX_W_0FXOP_08_CC_L_0) },
ff688e1f
L
7211 },
7212
7213 /* VEX_LEN_0FXOP_08_CD */
7214 {
467bbef0 7215 { VEX_W_TABLE (VEX_W_0FXOP_08_CD_L_0) },
ff688e1f
L
7216 },
7217
7218 /* VEX_LEN_0FXOP_08_CE */
7219 {
467bbef0 7220 { VEX_W_TABLE (VEX_W_0FXOP_08_CE_L_0) },
ff688e1f
L
7221 },
7222
7223 /* VEX_LEN_0FXOP_08_CF */
7224 {
467bbef0 7225 { VEX_W_TABLE (VEX_W_0FXOP_08_CF_L_0) },
ff688e1f
L
7226 },
7227
7228 /* VEX_LEN_0FXOP_08_EC */
7229 {
467bbef0 7230 { VEX_W_TABLE (VEX_W_0FXOP_08_EC_L_0) },
ff688e1f
L
7231 },
7232
7233 /* VEX_LEN_0FXOP_08_ED */
7234 {
467bbef0 7235 { VEX_W_TABLE (VEX_W_0FXOP_08_ED_L_0) },
ff688e1f
L
7236 },
7237
7238 /* VEX_LEN_0FXOP_08_EE */
7239 {
467bbef0 7240 { VEX_W_TABLE (VEX_W_0FXOP_08_EE_L_0) },
ff688e1f
L
7241 },
7242
7243 /* VEX_LEN_0FXOP_08_EF */
7244 {
467bbef0
JB
7245 { VEX_W_TABLE (VEX_W_0FXOP_08_EF_L_0) },
7246 },
7247
7248 /* VEX_LEN_0FXOP_09_01 */
7249 {
7250 { REG_TABLE (REG_0FXOP_09_01_L_0) },
7251 },
7252
7253 /* VEX_LEN_0FXOP_09_02 */
7254 {
7255 { REG_TABLE (REG_0FXOP_09_02_L_0) },
7256 },
7257
7258 /* VEX_LEN_0FXOP_09_12_M_1 */
7259 {
7260 { REG_TABLE (REG_0FXOP_09_12_M_1_L_0) },
ff688e1f
L
7261 },
7262
b5b098c2 7263 /* VEX_LEN_0FXOP_09_82_W_0 */
5dd85c99 7264 {
b5b098c2 7265 { "vfrczss", { XM, EXd }, 0 },
5dd85c99 7266 },
4c807e72 7267
b5b098c2 7268 /* VEX_LEN_0FXOP_09_83_W_0 */
5dd85c99 7269 {
b5b098c2 7270 { "vfrczsd", { XM, EXq }, 0 },
5dd85c99 7271 },
467bbef0
JB
7272
7273 /* VEX_LEN_0FXOP_09_90 */
7274 {
7275 { "vprotb", { XM, EXx, VexW }, 0 },
7276 },
7277
7278 /* VEX_LEN_0FXOP_09_91 */
7279 {
7280 { "vprotw", { XM, EXx, VexW }, 0 },
7281 },
7282
7283 /* VEX_LEN_0FXOP_09_92 */
7284 {
7285 { "vprotd", { XM, EXx, VexW }, 0 },
7286 },
7287
7288 /* VEX_LEN_0FXOP_09_93 */
7289 {
7290 { "vprotq", { XM, EXx, VexW }, 0 },
7291 },
7292
7293 /* VEX_LEN_0FXOP_09_94 */
7294 {
7295 { "vpshlb", { XM, EXx, VexW }, 0 },
7296 },
7297
7298 /* VEX_LEN_0FXOP_09_95 */
7299 {
7300 { "vpshlw", { XM, EXx, VexW }, 0 },
7301 },
7302
7303 /* VEX_LEN_0FXOP_09_96 */
7304 {
7305 { "vpshld", { XM, EXx, VexW }, 0 },
7306 },
7307
7308 /* VEX_LEN_0FXOP_09_97 */
7309 {
7310 { "vpshlq", { XM, EXx, VexW }, 0 },
7311 },
7312
7313 /* VEX_LEN_0FXOP_09_98 */
7314 {
7315 { "vpshab", { XM, EXx, VexW }, 0 },
7316 },
7317
7318 /* VEX_LEN_0FXOP_09_99 */
7319 {
7320 { "vpshaw", { XM, EXx, VexW }, 0 },
7321 },
7322
7323 /* VEX_LEN_0FXOP_09_9A */
7324 {
7325 { "vpshad", { XM, EXx, VexW }, 0 },
7326 },
7327
7328 /* VEX_LEN_0FXOP_09_9B */
7329 {
7330 { "vpshaq", { XM, EXx, VexW }, 0 },
7331 },
7332
7333 /* VEX_LEN_0FXOP_09_C1 */
7334 {
7335 { VEX_W_TABLE (VEX_W_0FXOP_09_C1_L_0) },
7336 },
7337
7338 /* VEX_LEN_0FXOP_09_C2 */
7339 {
7340 { VEX_W_TABLE (VEX_W_0FXOP_09_C2_L_0) },
7341 },
7342
7343 /* VEX_LEN_0FXOP_09_C3 */
7344 {
7345 { VEX_W_TABLE (VEX_W_0FXOP_09_C3_L_0) },
7346 },
7347
7348 /* VEX_LEN_0FXOP_09_C6 */
7349 {
7350 { VEX_W_TABLE (VEX_W_0FXOP_09_C6_L_0) },
7351 },
7352
7353 /* VEX_LEN_0FXOP_09_C7 */
7354 {
7355 { VEX_W_TABLE (VEX_W_0FXOP_09_C7_L_0) },
7356 },
7357
7358 /* VEX_LEN_0FXOP_09_CB */
7359 {
7360 { VEX_W_TABLE (VEX_W_0FXOP_09_CB_L_0) },
7361 },
7362
7363 /* VEX_LEN_0FXOP_09_D1 */
7364 {
7365 { VEX_W_TABLE (VEX_W_0FXOP_09_D1_L_0) },
7366 },
7367
7368 /* VEX_LEN_0FXOP_09_D2 */
7369 {
7370 { VEX_W_TABLE (VEX_W_0FXOP_09_D2_L_0) },
7371 },
7372
7373 /* VEX_LEN_0FXOP_09_D3 */
7374 {
7375 { VEX_W_TABLE (VEX_W_0FXOP_09_D3_L_0) },
7376 },
7377
7378 /* VEX_LEN_0FXOP_09_D6 */
7379 {
7380 { VEX_W_TABLE (VEX_W_0FXOP_09_D6_L_0) },
7381 },
7382
7383 /* VEX_LEN_0FXOP_09_D7 */
7384 {
7385 { VEX_W_TABLE (VEX_W_0FXOP_09_D7_L_0) },
7386 },
7387
7388 /* VEX_LEN_0FXOP_09_DB */
7389 {
7390 { VEX_W_TABLE (VEX_W_0FXOP_09_DB_L_0) },
7391 },
7392
7393 /* VEX_LEN_0FXOP_09_E1 */
7394 {
7395 { VEX_W_TABLE (VEX_W_0FXOP_09_E1_L_0) },
7396 },
7397
7398 /* VEX_LEN_0FXOP_09_E2 */
7399 {
7400 { VEX_W_TABLE (VEX_W_0FXOP_09_E2_L_0) },
7401 },
7402
7403 /* VEX_LEN_0FXOP_09_E3 */
7404 {
7405 { VEX_W_TABLE (VEX_W_0FXOP_09_E3_L_0) },
7406 },
7407
7408 /* VEX_LEN_0FXOP_0A_12 */
7409 {
7410 { REG_TABLE (REG_0FXOP_0A_12_L_0) },
7411 },
331d2d0d
L
7412};
7413
ad692897 7414#include "i386-dis-evex-len.h"
04e2a182 7415
9e30b8e0 7416static const struct dis386 vex_w_table[][2] = {
43234a1e
L
7417 {
7418 /* VEX_W_0F41_P_0_LEN_1 */
ab4e4ed5
AF
7419 { MOD_TABLE (MOD_VEX_W_0_0F41_P_0_LEN_1) },
7420 { MOD_TABLE (MOD_VEX_W_1_0F41_P_0_LEN_1) },
1ba585e8
IT
7421 },
7422 {
7423 /* VEX_W_0F41_P_2_LEN_1 */
ab4e4ed5
AF
7424 { MOD_TABLE (MOD_VEX_W_0_0F41_P_2_LEN_1) },
7425 { MOD_TABLE (MOD_VEX_W_1_0F41_P_2_LEN_1) }
43234a1e
L
7426 },
7427 {
7428 /* VEX_W_0F42_P_0_LEN_1 */
ab4e4ed5
AF
7429 { MOD_TABLE (MOD_VEX_W_0_0F42_P_0_LEN_1) },
7430 { MOD_TABLE (MOD_VEX_W_1_0F42_P_0_LEN_1) },
1ba585e8
IT
7431 },
7432 {
7433 /* VEX_W_0F42_P_2_LEN_1 */
ab4e4ed5
AF
7434 { MOD_TABLE (MOD_VEX_W_0_0F42_P_2_LEN_1) },
7435 { MOD_TABLE (MOD_VEX_W_1_0F42_P_2_LEN_1) },
43234a1e
L
7436 },
7437 {
7438 /* VEX_W_0F44_P_0_LEN_0 */
ab4e4ed5
AF
7439 { MOD_TABLE (MOD_VEX_W_0_0F44_P_0_LEN_1) },
7440 { MOD_TABLE (MOD_VEX_W_1_0F44_P_0_LEN_1) },
1ba585e8
IT
7441 },
7442 {
7443 /* VEX_W_0F44_P_2_LEN_0 */
ab4e4ed5
AF
7444 { MOD_TABLE (MOD_VEX_W_0_0F44_P_2_LEN_1) },
7445 { MOD_TABLE (MOD_VEX_W_1_0F44_P_2_LEN_1) },
43234a1e
L
7446 },
7447 {
ec6f095a
L
7448 /* VEX_W_0F45_P_0_LEN_1 */
7449 { MOD_TABLE (MOD_VEX_W_0_0F45_P_0_LEN_1) },
7450 { MOD_TABLE (MOD_VEX_W_1_0F45_P_0_LEN_1) },
9e30b8e0
L
7451 },
7452 {
ec6f095a
L
7453 /* VEX_W_0F45_P_2_LEN_1 */
7454 { MOD_TABLE (MOD_VEX_W_0_0F45_P_2_LEN_1) },
7455 { MOD_TABLE (MOD_VEX_W_1_0F45_P_2_LEN_1) },
9e30b8e0
L
7456 },
7457 {
ec6f095a
L
7458 /* VEX_W_0F46_P_0_LEN_1 */
7459 { MOD_TABLE (MOD_VEX_W_0_0F46_P_0_LEN_1) },
7460 { MOD_TABLE (MOD_VEX_W_1_0F46_P_0_LEN_1) },
9e30b8e0
L
7461 },
7462 {
ec6f095a
L
7463 /* VEX_W_0F46_P_2_LEN_1 */
7464 { MOD_TABLE (MOD_VEX_W_0_0F46_P_2_LEN_1) },
7465 { MOD_TABLE (MOD_VEX_W_1_0F46_P_2_LEN_1) },
9e30b8e0
L
7466 },
7467 {
ec6f095a
L
7468 /* VEX_W_0F47_P_0_LEN_1 */
7469 { MOD_TABLE (MOD_VEX_W_0_0F47_P_0_LEN_1) },
7470 { MOD_TABLE (MOD_VEX_W_1_0F47_P_0_LEN_1) },
9e30b8e0
L
7471 },
7472 {
ec6f095a
L
7473 /* VEX_W_0F47_P_2_LEN_1 */
7474 { MOD_TABLE (MOD_VEX_W_0_0F47_P_2_LEN_1) },
7475 { MOD_TABLE (MOD_VEX_W_1_0F47_P_2_LEN_1) },
9e30b8e0
L
7476 },
7477 {
ec6f095a
L
7478 /* VEX_W_0F4A_P_0_LEN_1 */
7479 { MOD_TABLE (MOD_VEX_W_0_0F4A_P_0_LEN_1) },
7480 { MOD_TABLE (MOD_VEX_W_1_0F4A_P_0_LEN_1) },
9e30b8e0
L
7481 },
7482 {
ec6f095a
L
7483 /* VEX_W_0F4A_P_2_LEN_1 */
7484 { MOD_TABLE (MOD_VEX_W_0_0F4A_P_2_LEN_1) },
7485 { MOD_TABLE (MOD_VEX_W_1_0F4A_P_2_LEN_1) },
9e30b8e0
L
7486 },
7487 {
ec6f095a
L
7488 /* VEX_W_0F4B_P_0_LEN_1 */
7489 { MOD_TABLE (MOD_VEX_W_0_0F4B_P_0_LEN_1) },
7490 { MOD_TABLE (MOD_VEX_W_1_0F4B_P_0_LEN_1) },
9e30b8e0
L
7491 },
7492 {
ec6f095a
L
7493 /* VEX_W_0F4B_P_2_LEN_1 */
7494 { MOD_TABLE (MOD_VEX_W_0_0F4B_P_2_LEN_1) },
9e30b8e0
L
7495 },
7496 {
ec6f095a
L
7497 /* VEX_W_0F90_P_0_LEN_0 */
7498 { "kmovw", { MaskG, MaskE }, 0 },
7499 { "kmovq", { MaskG, MaskE }, 0 },
9e30b8e0
L
7500 },
7501 {
ec6f095a
L
7502 /* VEX_W_0F90_P_2_LEN_0 */
7503 { "kmovb", { MaskG, MaskBDE }, 0 },
7504 { "kmovd", { MaskG, MaskBDE }, 0 },
9e30b8e0
L
7505 },
7506 {
ec6f095a
L
7507 /* VEX_W_0F91_P_0_LEN_0 */
7508 { MOD_TABLE (MOD_VEX_W_0_0F91_P_0_LEN_0) },
7509 { MOD_TABLE (MOD_VEX_W_1_0F91_P_0_LEN_0) },
9e30b8e0
L
7510 },
7511 {
ec6f095a
L
7512 /* VEX_W_0F91_P_2_LEN_0 */
7513 { MOD_TABLE (MOD_VEX_W_0_0F91_P_2_LEN_0) },
7514 { MOD_TABLE (MOD_VEX_W_1_0F91_P_2_LEN_0) },
9e30b8e0
L
7515 },
7516 {
ec6f095a
L
7517 /* VEX_W_0F92_P_0_LEN_0 */
7518 { MOD_TABLE (MOD_VEX_W_0_0F92_P_0_LEN_0) },
9e30b8e0
L
7519 },
7520 {
ec6f095a
L
7521 /* VEX_W_0F92_P_2_LEN_0 */
7522 { MOD_TABLE (MOD_VEX_W_0_0F92_P_2_LEN_0) },
9e30b8e0 7523 },
9e30b8e0 7524 {
ec6f095a
L
7525 /* VEX_W_0F93_P_0_LEN_0 */
7526 { MOD_TABLE (MOD_VEX_W_0_0F93_P_0_LEN_0) },
9e30b8e0
L
7527 },
7528 {
ec6f095a
L
7529 /* VEX_W_0F93_P_2_LEN_0 */
7530 { MOD_TABLE (MOD_VEX_W_0_0F93_P_2_LEN_0) },
9e30b8e0 7531 },
9e30b8e0 7532 {
ec6f095a
L
7533 /* VEX_W_0F98_P_0_LEN_0 */
7534 { MOD_TABLE (MOD_VEX_W_0_0F98_P_0_LEN_0) },
7535 { MOD_TABLE (MOD_VEX_W_1_0F98_P_0_LEN_0) },
9e30b8e0
L
7536 },
7537 {
ec6f095a
L
7538 /* VEX_W_0F98_P_2_LEN_0 */
7539 { MOD_TABLE (MOD_VEX_W_0_0F98_P_2_LEN_0) },
7540 { MOD_TABLE (MOD_VEX_W_1_0F98_P_2_LEN_0) },
9e30b8e0
L
7541 },
7542 {
ec6f095a
L
7543 /* VEX_W_0F99_P_0_LEN_0 */
7544 { MOD_TABLE (MOD_VEX_W_0_0F99_P_0_LEN_0) },
7545 { MOD_TABLE (MOD_VEX_W_1_0F99_P_0_LEN_0) },
9e30b8e0
L
7546 },
7547 {
ec6f095a
L
7548 /* VEX_W_0F99_P_2_LEN_0 */
7549 { MOD_TABLE (MOD_VEX_W_0_0F99_P_2_LEN_0) },
7550 { MOD_TABLE (MOD_VEX_W_1_0F99_P_2_LEN_0) },
9e30b8e0 7551 },
9e30b8e0 7552 {
7531c613
JB
7553 /* VEX_W_0F380C */
7554 { "vpermilps", { XM, Vex, EXx }, PREFIX_DATA },
9e30b8e0
L
7555 },
7556 {
7531c613
JB
7557 /* VEX_W_0F380D */
7558 { "vpermilpd", { XM, Vex, EXx }, PREFIX_DATA },
9e30b8e0
L
7559 },
7560 {
7531c613
JB
7561 /* VEX_W_0F380E */
7562 { "vtestps", { XM, EXx }, PREFIX_DATA },
9e30b8e0
L
7563 },
7564 {
7531c613
JB
7565 /* VEX_W_0F380F */
7566 { "vtestpd", { XM, EXx }, PREFIX_DATA },
9e30b8e0 7567 },
6431c801 7568 {
7531c613
JB
7569 /* VEX_W_0F3813 */
7570 { "vcvtph2ps", { XM, EXxmmq }, PREFIX_DATA },
6431c801 7571 },
6c30d220 7572 {
7531c613
JB
7573 /* VEX_W_0F3816_L_1 */
7574 { "vpermps", { XM, Vex, EXx }, PREFIX_DATA },
6c30d220 7575 },
bcf2684f 7576 {
7531c613
JB
7577 /* VEX_W_0F3818 */
7578 { "vbroadcastss", { XM, EXxmm_md }, PREFIX_DATA },
bcf2684f 7579 },
9e30b8e0 7580 {
7531c613
JB
7581 /* VEX_W_0F3819_L_1 */
7582 { "vbroadcastsd", { XM, EXxmm_mq }, PREFIX_DATA },
9e30b8e0
L
7583 },
7584 {
7531c613
JB
7585 /* VEX_W_0F381A_M_0_L_1 */
7586 { "vbroadcastf128", { XM, Mxmm }, PREFIX_DATA },
9e30b8e0 7587 },
53aa04a0 7588 {
7531c613
JB
7589 /* VEX_W_0F382C_M_0 */
7590 { "vmaskmovps", { XM, Vex, Mx }, PREFIX_DATA },
53aa04a0
L
7591 },
7592 {
7531c613
JB
7593 /* VEX_W_0F382D_M_0 */
7594 { "vmaskmovpd", { XM, Vex, Mx }, PREFIX_DATA },
53aa04a0
L
7595 },
7596 {
7531c613
JB
7597 /* VEX_W_0F382E_M_0 */
7598 { "vmaskmovps", { Mx, Vex, XM }, PREFIX_DATA },
53aa04a0
L
7599 },
7600 {
7531c613
JB
7601 /* VEX_W_0F382F_M_0 */
7602 { "vmaskmovpd", { Mx, Vex, XM }, PREFIX_DATA },
53aa04a0 7603 },
6c30d220 7604 {
7531c613
JB
7605 /* VEX_W_0F3836 */
7606 { "vpermd", { XM, Vex, EXx }, PREFIX_DATA },
9e30b8e0 7607 },
6c30d220 7608 {
7531c613
JB
7609 /* VEX_W_0F3846 */
7610 { "vpsravd", { XM, Vex, EXx }, PREFIX_DATA },
6c30d220 7611 },
260cd341
LC
7612 {
7613 /* VEX_W_0F3849_X86_64_P_0 */
7614 { MOD_TABLE (MOD_VEX_0F3849_X86_64_P_0_W_0) },
7615 },
7616 {
7617 /* VEX_W_0F3849_X86_64_P_2 */
7618 { MOD_TABLE (MOD_VEX_0F3849_X86_64_P_2_W_0) },
7619 },
7620 {
7621 /* VEX_W_0F3849_X86_64_P_3 */
7622 { MOD_TABLE (MOD_VEX_0F3849_X86_64_P_3_W_0) },
7623 },
7624 {
7625 /* VEX_W_0F384B_X86_64_P_1 */
7626 { MOD_TABLE (MOD_VEX_0F384B_X86_64_P_1_W_0) },
7627 },
7628 {
7629 /* VEX_W_0F384B_X86_64_P_2 */
7630 { MOD_TABLE (MOD_VEX_0F384B_X86_64_P_2_W_0) },
7631 },
7632 {
7633 /* VEX_W_0F384B_X86_64_P_3 */
7634 { MOD_TABLE (MOD_VEX_0F384B_X86_64_P_3_W_0) },
7635 },
6c30d220 7636 {
7531c613
JB
7637 /* VEX_W_0F3858 */
7638 { "vpbroadcastd", { XM, EXxmm_md }, PREFIX_DATA },
6c30d220
L
7639 },
7640 {
7531c613
JB
7641 /* VEX_W_0F3859 */
7642 { "vpbroadcastq", { XM, EXxmm_mq }, PREFIX_DATA },
6c30d220
L
7643 },
7644 {
7531c613
JB
7645 /* VEX_W_0F385A_M_0_L_0 */
7646 { "vbroadcasti128", { XM, Mxmm }, PREFIX_DATA },
6c30d220 7647 },
260cd341
LC
7648 {
7649 /* VEX_W_0F385C_X86_64_P_1 */
7650 { MOD_TABLE (MOD_VEX_0F385C_X86_64_P_1_W_0) },
7651 },
7652 {
7653 /* VEX_W_0F385E_X86_64_P_0 */
7654 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_0_W_0) },
7655 },
7656 {
7657 /* VEX_W_0F385E_X86_64_P_1 */
7658 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_1_W_0) },
7659 },
7660 {
7661 /* VEX_W_0F385E_X86_64_P_2 */
7662 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_2_W_0) },
7663 },
7664 {
7665 /* VEX_W_0F385E_X86_64_P_3 */
7666 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_3_W_0) },
7667 },
6c30d220 7668 {
7531c613
JB
7669 /* VEX_W_0F3878 */
7670 { "vpbroadcastb", { XM, EXxmm_mb }, PREFIX_DATA },
6c30d220
L
7671 },
7672 {
7531c613
JB
7673 /* VEX_W_0F3879 */
7674 { "vpbroadcastw", { XM, EXxmm_mw }, PREFIX_DATA },
6c30d220 7675 },
48521003 7676 {
7531c613
JB
7677 /* VEX_W_0F38CF */
7678 { "vgf2p8mulb", { XM, Vex, EXx }, PREFIX_DATA },
48521003 7679 },
6c30d220 7680 {
7531c613 7681 /* VEX_W_0F3A00_L_1 */
6c30d220 7682 { Bad_Opcode },
7531c613 7683 { "vpermq", { XM, EXx, Ib }, PREFIX_DATA },
6c30d220
L
7684 },
7685 {
7531c613 7686 /* VEX_W_0F3A01_L_1 */
6c30d220 7687 { Bad_Opcode },
7531c613 7688 { "vpermpd", { XM, EXx, Ib }, PREFIX_DATA },
6c30d220
L
7689 },
7690 {
7531c613
JB
7691 /* VEX_W_0F3A02 */
7692 { "vpblendd", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6c30d220 7693 },
9e30b8e0 7694 {
7531c613
JB
7695 /* VEX_W_0F3A04 */
7696 { "vpermilps", { XM, EXx, Ib }, PREFIX_DATA },
9e30b8e0
L
7697 },
7698 {
7531c613
JB
7699 /* VEX_W_0F3A05 */
7700 { "vpermilpd", { XM, EXx, Ib }, PREFIX_DATA },
9e30b8e0
L
7701 },
7702 {
7531c613
JB
7703 /* VEX_W_0F3A06_L_1 */
7704 { "vperm2f128", { XM, Vex, EXx, Ib }, PREFIX_DATA },
9e30b8e0 7705 },
9e30b8e0 7706 {
7531c613
JB
7707 /* VEX_W_0F3A18_L_1 */
7708 { "vinsertf128", { XM, Vex, EXxmm, Ib }, PREFIX_DATA },
9e30b8e0
L
7709 },
7710 {
7531c613
JB
7711 /* VEX_W_0F3A19_L_1 */
7712 { "vextractf128", { EXxmm, XM, Ib }, PREFIX_DATA },
9e30b8e0 7713 },
6431c801 7714 {
7531c613
JB
7715 /* VEX_W_0F3A1D */
7716 { "vcvtps2ph", { EXxmmq, XM, EXxEVexS, Ib }, PREFIX_DATA },
6431c801 7717 },
6c30d220 7718 {
7531c613
JB
7719 /* VEX_W_0F3A38_L_1 */
7720 { "vinserti128", { XM, Vex, EXxmm, Ib }, PREFIX_DATA },
6c30d220
L
7721 },
7722 {
7531c613
JB
7723 /* VEX_W_0F3A39_L_1 */
7724 { "vextracti128", { EXxmm, XM, Ib }, PREFIX_DATA },
6c30d220 7725 },
6c30d220 7726 {
7531c613
JB
7727 /* VEX_W_0F3A46_L_1 */
7728 { "vperm2i128", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6c30d220 7729 },
9e30b8e0 7730 {
7531c613
JB
7731 /* VEX_W_0F3A4A */
7732 { "vblendvps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
9e30b8e0
L
7733 },
7734 {
7531c613
JB
7735 /* VEX_W_0F3A4B */
7736 { "vblendvpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
9e30b8e0
L
7737 },
7738 {
7531c613
JB
7739 /* VEX_W_0F3A4C */
7740 { "vpblendvb", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
9e30b8e0 7741 },
48521003 7742 {
7531c613 7743 /* VEX_W_0F3ACE */
48521003 7744 { Bad_Opcode },
7531c613 7745 { "vgf2p8affineqb", { XM, Vex, EXx, Ib }, PREFIX_DATA },
48521003
IT
7746 },
7747 {
7531c613 7748 /* VEX_W_0F3ACF */
48521003 7749 { Bad_Opcode },
7531c613 7750 { "vgf2p8affineinvqb", { XM, Vex, EXx, Ib }, PREFIX_DATA },
48521003 7751 },
467bbef0
JB
7752 /* VEX_W_0FXOP_08_85_L_0 */
7753 {
7754 { "vpmacssww", { XM, Vex, EXx, XMVexI4 }, 0 },
7755 },
7756 /* VEX_W_0FXOP_08_86_L_0 */
7757 {
7758 { "vpmacsswd", { XM, Vex, EXx, XMVexI4 }, 0 },
7759 },
7760 /* VEX_W_0FXOP_08_87_L_0 */
7761 {
7762 { "vpmacssdql", { XM, Vex, EXx, XMVexI4 }, 0 },
7763 },
7764 /* VEX_W_0FXOP_08_8E_L_0 */
7765 {
7766 { "vpmacssdd", { XM, Vex, EXx, XMVexI4 }, 0 },
7767 },
7768 /* VEX_W_0FXOP_08_8F_L_0 */
7769 {
7770 { "vpmacssdqh", { XM, Vex, EXx, XMVexI4 }, 0 },
7771 },
7772 /* VEX_W_0FXOP_08_95_L_0 */
7773 {
7774 { "vpmacsww", { XM, Vex, EXx, XMVexI4 }, 0 },
7775 },
7776 /* VEX_W_0FXOP_08_96_L_0 */
7777 {
7778 { "vpmacswd", { XM, Vex, EXx, XMVexI4 }, 0 },
7779 },
7780 /* VEX_W_0FXOP_08_97_L_0 */
7781 {
7782 { "vpmacsdql", { XM, Vex, EXx, XMVexI4 }, 0 },
7783 },
7784 /* VEX_W_0FXOP_08_9E_L_0 */
7785 {
7786 { "vpmacsdd", { XM, Vex, EXx, XMVexI4 }, 0 },
7787 },
7788 /* VEX_W_0FXOP_08_9F_L_0 */
7789 {
7790 { "vpmacsdqh", { XM, Vex, EXx, XMVexI4 }, 0 },
7791 },
7792 /* VEX_W_0FXOP_08_A6_L_0 */
7793 {
7794 { "vpmadcsswd", { XM, Vex, EXx, XMVexI4 }, 0 },
7795 },
7796 /* VEX_W_0FXOP_08_B6_L_0 */
7797 {
7798 { "vpmadcswd", { XM, Vex, EXx, XMVexI4 }, 0 },
7799 },
7800 /* VEX_W_0FXOP_08_C0_L_0 */
7801 {
7802 { "vprotb", { XM, EXx, Ib }, 0 },
7803 },
7804 /* VEX_W_0FXOP_08_C1_L_0 */
7805 {
7806 { "vprotw", { XM, EXx, Ib }, 0 },
7807 },
7808 /* VEX_W_0FXOP_08_C2_L_0 */
7809 {
7810 { "vprotd", { XM, EXx, Ib }, 0 },
7811 },
7812 /* VEX_W_0FXOP_08_C3_L_0 */
7813 {
7814 { "vprotq", { XM, EXx, Ib }, 0 },
7815 },
7816 /* VEX_W_0FXOP_08_CC_L_0 */
7817 {
89e65d17 7818 { "vpcomb", { XM, Vex, EXx, VPCOM }, 0 },
467bbef0
JB
7819 },
7820 /* VEX_W_0FXOP_08_CD_L_0 */
7821 {
89e65d17 7822 { "vpcomw", { XM, Vex, EXx, VPCOM }, 0 },
467bbef0
JB
7823 },
7824 /* VEX_W_0FXOP_08_CE_L_0 */
7825 {
89e65d17 7826 { "vpcomd", { XM, Vex, EXx, VPCOM }, 0 },
467bbef0
JB
7827 },
7828 /* VEX_W_0FXOP_08_CF_L_0 */
7829 {
89e65d17 7830 { "vpcomq", { XM, Vex, EXx, VPCOM }, 0 },
467bbef0
JB
7831 },
7832 /* VEX_W_0FXOP_08_EC_L_0 */
7833 {
89e65d17 7834 { "vpcomub", { XM, Vex, EXx, VPCOM }, 0 },
467bbef0
JB
7835 },
7836 /* VEX_W_0FXOP_08_ED_L_0 */
7837 {
89e65d17 7838 { "vpcomuw", { XM, Vex, EXx, VPCOM }, 0 },
467bbef0
JB
7839 },
7840 /* VEX_W_0FXOP_08_EE_L_0 */
7841 {
89e65d17 7842 { "vpcomud", { XM, Vex, EXx, VPCOM }, 0 },
467bbef0
JB
7843 },
7844 /* VEX_W_0FXOP_08_EF_L_0 */
7845 {
89e65d17 7846 { "vpcomuq", { XM, Vex, EXx, VPCOM }, 0 },
467bbef0 7847 },
b5b098c2
JB
7848 /* VEX_W_0FXOP_09_80 */
7849 {
7850 { "vfrczps", { XM, EXx }, 0 },
7851 },
7852 /* VEX_W_0FXOP_09_81 */
7853 {
7854 { "vfrczpd", { XM, EXx }, 0 },
7855 },
7856 /* VEX_W_0FXOP_09_82 */
7857 {
7858 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_82_W_0) },
7859 },
7860 /* VEX_W_0FXOP_09_83 */
7861 {
7862 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_83_W_0) },
7863 },
467bbef0
JB
7864 /* VEX_W_0FXOP_09_C1_L_0 */
7865 {
7866 { "vphaddbw", { XM, EXxmm }, 0 },
7867 },
7868 /* VEX_W_0FXOP_09_C2_L_0 */
7869 {
7870 { "vphaddbd", { XM, EXxmm }, 0 },
7871 },
7872 /* VEX_W_0FXOP_09_C3_L_0 */
7873 {
7874 { "vphaddbq", { XM, EXxmm }, 0 },
7875 },
7876 /* VEX_W_0FXOP_09_C6_L_0 */
7877 {
7878 { "vphaddwd", { XM, EXxmm }, 0 },
7879 },
7880 /* VEX_W_0FXOP_09_C7_L_0 */
7881 {
7882 { "vphaddwq", { XM, EXxmm }, 0 },
7883 },
7884 /* VEX_W_0FXOP_09_CB_L_0 */
7885 {
7886 { "vphadddq", { XM, EXxmm }, 0 },
7887 },
7888 /* VEX_W_0FXOP_09_D1_L_0 */
7889 {
7890 { "vphaddubw", { XM, EXxmm }, 0 },
7891 },
7892 /* VEX_W_0FXOP_09_D2_L_0 */
7893 {
7894 { "vphaddubd", { XM, EXxmm }, 0 },
7895 },
7896 /* VEX_W_0FXOP_09_D3_L_0 */
7897 {
7898 { "vphaddubq", { XM, EXxmm }, 0 },
7899 },
7900 /* VEX_W_0FXOP_09_D6_L_0 */
7901 {
7902 { "vphadduwd", { XM, EXxmm }, 0 },
7903 },
7904 /* VEX_W_0FXOP_09_D7_L_0 */
7905 {
7906 { "vphadduwq", { XM, EXxmm }, 0 },
7907 },
7908 /* VEX_W_0FXOP_09_DB_L_0 */
7909 {
7910 { "vphaddudq", { XM, EXxmm }, 0 },
7911 },
7912 /* VEX_W_0FXOP_09_E1_L_0 */
7913 {
7914 { "vphsubbw", { XM, EXxmm }, 0 },
7915 },
7916 /* VEX_W_0FXOP_09_E2_L_0 */
7917 {
7918 { "vphsubwd", { XM, EXxmm }, 0 },
7919 },
7920 /* VEX_W_0FXOP_09_E3_L_0 */
7921 {
7922 { "vphsubdq", { XM, EXxmm }, 0 },
7923 },
ad692897
L
7924
7925#include "i386-dis-evex-w.h"
9e30b8e0
L
7926};
7927
7928static const struct dis386 mod_table[][2] = {
7929 {
7930 /* MOD_8D */
bf890a93 7931 { "leaS", { Gv, M }, 0 },
9e30b8e0 7932 },
42164a71
L
7933 {
7934 /* MOD_C6_REG_7 */
7935 { Bad_Opcode },
7936 { RM_TABLE (RM_C6_REG_7) },
7937 },
7938 {
7939 /* MOD_C7_REG_7 */
7940 { Bad_Opcode },
7941 { RM_TABLE (RM_C7_REG_7) },
7942 },
4a357820
MZ
7943 {
7944 /* MOD_FF_REG_3 */
8f570d62 7945 { "{l|}call^", { indirEp }, 0 },
4a357820
MZ
7946 },
7947 {
7948 /* MOD_FF_REG_5 */
8f570d62 7949 { "{l|}jmp^", { indirEp }, 0 },
4a357820 7950 },
9e30b8e0
L
7951 {
7952 /* MOD_0F01_REG_0 */
7953 { X86_64_TABLE (X86_64_0F01_REG_0) },
7954 { RM_TABLE (RM_0F01_REG_0) },
7955 },
7956 {
7957 /* MOD_0F01_REG_1 */
7958 { X86_64_TABLE (X86_64_0F01_REG_1) },
7959 { RM_TABLE (RM_0F01_REG_1) },
7960 },
7961 {
7962 /* MOD_0F01_REG_2 */
7963 { X86_64_TABLE (X86_64_0F01_REG_2) },
7964 { RM_TABLE (RM_0F01_REG_2) },
7965 },
7966 {
7967 /* MOD_0F01_REG_3 */
7968 { X86_64_TABLE (X86_64_0F01_REG_3) },
7969 { RM_TABLE (RM_0F01_REG_3) },
7970 },
8eab4136
L
7971 {
7972 /* MOD_0F01_REG_5 */
f8687e93
JB
7973 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_0) },
7974 { RM_TABLE (RM_0F01_REG_5_MOD_3) },
8eab4136 7975 },
9e30b8e0
L
7976 {
7977 /* MOD_0F01_REG_7 */
bf890a93 7978 { "invlpg", { Mb }, 0 },
f8687e93 7979 { RM_TABLE (RM_0F01_REG_7_MOD_3) },
9e30b8e0
L
7980 },
7981 {
7982 /* MOD_0F12_PREFIX_0 */
18897deb
JB
7983 { "movlpX", { XM, EXq }, 0 },
7984 { "movhlps", { XM, EXq }, 0 },
7985 },
7986 {
7987 /* MOD_0F12_PREFIX_2 */
7988 { "movlpX", { XM, EXq }, 0 },
9e30b8e0
L
7989 },
7990 {
7991 /* MOD_0F13 */
507bd325 7992 { "movlpX", { EXq, XM }, PREFIX_OPCODE },
9e30b8e0
L
7993 },
7994 {
7995 /* MOD_0F16_PREFIX_0 */
18897deb 7996 { "movhpX", { XM, EXq }, 0 },
bf890a93 7997 { "movlhps", { XM, EXq }, 0 },
9e30b8e0 7998 },
18897deb
JB
7999 {
8000 /* MOD_0F16_PREFIX_2 */
8001 { "movhpX", { XM, EXq }, 0 },
8002 },
9e30b8e0
L
8003 {
8004 /* MOD_0F17 */
507bd325 8005 { "movhpX", { EXq, XM }, PREFIX_OPCODE },
9e30b8e0
L
8006 },
8007 {
8008 /* MOD_0F18_REG_0 */
bf890a93 8009 { "prefetchnta", { Mb }, 0 },
9e30b8e0
L
8010 },
8011 {
8012 /* MOD_0F18_REG_1 */
bf890a93 8013 { "prefetcht0", { Mb }, 0 },
9e30b8e0
L
8014 },
8015 {
8016 /* MOD_0F18_REG_2 */
bf890a93 8017 { "prefetcht1", { Mb }, 0 },
9e30b8e0
L
8018 },
8019 {
8020 /* MOD_0F18_REG_3 */
bf890a93 8021 { "prefetcht2", { Mb }, 0 },
9e30b8e0 8022 },
d7189fa5
RM
8023 {
8024 /* MOD_0F18_REG_4 */
bf890a93 8025 { "nop/reserved", { Mb }, 0 },
d7189fa5
RM
8026 },
8027 {
8028 /* MOD_0F18_REG_5 */
bf890a93 8029 { "nop/reserved", { Mb }, 0 },
d7189fa5
RM
8030 },
8031 {
8032 /* MOD_0F18_REG_6 */
bf890a93 8033 { "nop/reserved", { Mb }, 0 },
d7189fa5
RM
8034 },
8035 {
8036 /* MOD_0F18_REG_7 */
bf890a93 8037 { "nop/reserved", { Mb }, 0 },
d7189fa5 8038 },
7e8b059b
L
8039 {
8040 /* MOD_0F1A_PREFIX_0 */
d276ec69 8041 { "bndldx", { Gbnd, Mv_bnd }, 0 },
bf890a93 8042 { "nopQ", { Ev }, 0 },
7e8b059b
L
8043 },
8044 {
8045 /* MOD_0F1B_PREFIX_0 */
d276ec69 8046 { "bndstx", { Mv_bnd, Gbnd }, 0 },
bf890a93 8047 { "nopQ", { Ev }, 0 },
7e8b059b
L
8048 },
8049 {
8050 /* MOD_0F1B_PREFIX_1 */
d276ec69 8051 { "bndmk", { Gbnd, Mv_bnd }, 0 },
bf890a93 8052 { "nopQ", { Ev }, 0 },
7e8b059b 8053 },
c48935d7
IT
8054 {
8055 /* MOD_0F1C_PREFIX_0 */
f8687e93 8056 { REG_TABLE (REG_0F1C_P_0_MOD_0) },
c48935d7
IT
8057 { "nopQ", { Ev }, 0 },
8058 },
603555e5
L
8059 {
8060 /* MOD_0F1E_PREFIX_1 */
8061 { "nopQ", { Ev }, 0 },
f8687e93 8062 { REG_TABLE (REG_0F1E_P_1_MOD_3) },
603555e5 8063 },
75c135a8
L
8064 {
8065 /* MOD_0F2B_PREFIX_0 */
507bd325 8066 {"movntps", { Mx, XM }, PREFIX_OPCODE },
75c135a8
L
8067 },
8068 {
8069 /* MOD_0F2B_PREFIX_1 */
507bd325 8070 {"movntss", { Md, XM }, PREFIX_OPCODE },
75c135a8
L
8071 },
8072 {
8073 /* MOD_0F2B_PREFIX_2 */
507bd325 8074 {"movntpd", { Mx, XM }, PREFIX_OPCODE },
75c135a8
L
8075 },
8076 {
8077 /* MOD_0F2B_PREFIX_3 */
507bd325 8078 {"movntsd", { Mq, XM }, PREFIX_OPCODE },
75c135a8
L
8079 },
8080 {
a5aaedb9 8081 /* MOD_0F50 */
592d1631 8082 { Bad_Opcode },
507bd325 8083 { "movmskpX", { Gdq, XS }, PREFIX_OPCODE },
75c135a8 8084 },
b844680a 8085 {
1ceb70f8 8086 /* MOD_0F71_REG_2 */
592d1631 8087 { Bad_Opcode },
7531c613 8088 { "psrlw", { MS, Ib }, PREFIX_OPCODE },
b844680a
L
8089 },
8090 {
1ceb70f8 8091 /* MOD_0F71_REG_4 */
592d1631 8092 { Bad_Opcode },
7531c613 8093 { "psraw", { MS, Ib }, PREFIX_OPCODE },
b844680a
L
8094 },
8095 {
1ceb70f8 8096 /* MOD_0F71_REG_6 */
592d1631 8097 { Bad_Opcode },
7531c613 8098 { "psllw", { MS, Ib }, PREFIX_OPCODE },
b844680a
L
8099 },
8100 {
1ceb70f8 8101 /* MOD_0F72_REG_2 */
592d1631 8102 { Bad_Opcode },
7531c613 8103 { "psrld", { MS, Ib }, PREFIX_OPCODE },
b844680a
L
8104 },
8105 {
1ceb70f8 8106 /* MOD_0F72_REG_4 */
592d1631 8107 { Bad_Opcode },
7531c613 8108 { "psrad", { MS, Ib }, PREFIX_OPCODE },
b844680a
L
8109 },
8110 {
1ceb70f8 8111 /* MOD_0F72_REG_6 */
592d1631 8112 { Bad_Opcode },
7531c613 8113 { "pslld", { MS, Ib }, PREFIX_OPCODE },
b844680a
L
8114 },
8115 {
1ceb70f8 8116 /* MOD_0F73_REG_2 */
592d1631 8117 { Bad_Opcode },
7531c613 8118 { "psrlq", { MS, Ib }, PREFIX_OPCODE },
b844680a
L
8119 },
8120 {
1ceb70f8 8121 /* MOD_0F73_REG_3 */
592d1631 8122 { Bad_Opcode },
7531c613 8123 { "psrldq", { XS, Ib }, PREFIX_DATA },
c0f3af97
L
8124 },
8125 {
8126 /* MOD_0F73_REG_6 */
592d1631 8127 { Bad_Opcode },
7531c613 8128 { "psllq", { MS, Ib }, PREFIX_OPCODE },
c0f3af97
L
8129 },
8130 {
8131 /* MOD_0F73_REG_7 */
592d1631 8132 { Bad_Opcode },
7531c613 8133 { "pslldq", { XS, Ib }, PREFIX_DATA },
c0f3af97
L
8134 },
8135 {
8136 /* MOD_0FAE_REG_0 */
bf890a93 8137 { "fxsave", { FXSAVE }, 0 },
f8687e93 8138 { PREFIX_TABLE (PREFIX_0FAE_REG_0_MOD_3) },
c0f3af97
L
8139 },
8140 {
8141 /* MOD_0FAE_REG_1 */
bf890a93 8142 { "fxrstor", { FXSAVE }, 0 },
f8687e93 8143 { PREFIX_TABLE (PREFIX_0FAE_REG_1_MOD_3) },
c0f3af97
L
8144 },
8145 {
8146 /* MOD_0FAE_REG_2 */
bf890a93 8147 { "ldmxcsr", { Md }, 0 },
f8687e93 8148 { PREFIX_TABLE (PREFIX_0FAE_REG_2_MOD_3) },
c0f3af97
L
8149 },
8150 {
8151 /* MOD_0FAE_REG_3 */
bf890a93 8152 { "stmxcsr", { Md }, 0 },
f8687e93 8153 { PREFIX_TABLE (PREFIX_0FAE_REG_3_MOD_3) },
c0f3af97
L
8154 },
8155 {
8156 /* MOD_0FAE_REG_4 */
f8687e93
JB
8157 { PREFIX_TABLE (PREFIX_0FAE_REG_4_MOD_0) },
8158 { PREFIX_TABLE (PREFIX_0FAE_REG_4_MOD_3) },
c0f3af97
L
8159 },
8160 {
8161 /* MOD_0FAE_REG_5 */
035e7389 8162 { "xrstor", { FXSAVE }, PREFIX_OPCODE },
f8687e93 8163 { PREFIX_TABLE (PREFIX_0FAE_REG_5_MOD_3) },
c0f3af97
L
8164 },
8165 {
8166 /* MOD_0FAE_REG_6 */
f8687e93
JB
8167 { PREFIX_TABLE (PREFIX_0FAE_REG_6_MOD_0) },
8168 { PREFIX_TABLE (PREFIX_0FAE_REG_6_MOD_3) },
c0f3af97
L
8169 },
8170 {
8171 /* MOD_0FAE_REG_7 */
f8687e93
JB
8172 { PREFIX_TABLE (PREFIX_0FAE_REG_7_MOD_0) },
8173 { RM_TABLE (RM_0FAE_REG_7_MOD_3) },
c0f3af97
L
8174 },
8175 {
8176 /* MOD_0FB2 */
bf890a93 8177 { "lssS", { Gv, Mp }, 0 },
c0f3af97
L
8178 },
8179 {
8180 /* MOD_0FB4 */
bf890a93 8181 { "lfsS", { Gv, Mp }, 0 },
c0f3af97
L
8182 },
8183 {
8184 /* MOD_0FB5 */
bf890a93 8185 { "lgsS", { Gv, Mp }, 0 },
c0f3af97 8186 },
a8484f96
L
8187 {
8188 /* MOD_0FC3 */
035e7389 8189 { "movntiS", { Edq, Gdq }, PREFIX_OPCODE },
a8484f96 8190 },
963f3586
IT
8191 {
8192 /* MOD_0FC7_REG_3 */
a8484f96 8193 { "xrstors", { FXSAVE }, 0 },
963f3586
IT
8194 },
8195 {
8196 /* MOD_0FC7_REG_4 */
bf890a93 8197 { "xsavec", { FXSAVE }, 0 },
963f3586
IT
8198 },
8199 {
8200 /* MOD_0FC7_REG_5 */
bf890a93 8201 { "xsaves", { FXSAVE }, 0 },
963f3586 8202 },
c0f3af97
L
8203 {
8204 /* MOD_0FC7_REG_6 */
f8687e93
JB
8205 { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_0) },
8206 { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_3) }
c0f3af97
L
8207 },
8208 {
8209 /* MOD_0FC7_REG_7 */
bf890a93 8210 { "vmptrst", { Mq }, 0 },
f8687e93 8211 { PREFIX_TABLE (PREFIX_0FC7_REG_7_MOD_3) }
c0f3af97
L
8212 },
8213 {
8214 /* MOD_0FD7 */
592d1631 8215 { Bad_Opcode },
bf890a93 8216 { "pmovmskb", { Gdq, MS }, 0 },
c0f3af97
L
8217 },
8218 {
8219 /* MOD_0FE7_PREFIX_2 */
bf890a93 8220 { "movntdq", { Mx, XM }, 0 },
c0f3af97
L
8221 },
8222 {
8223 /* MOD_0FF0_PREFIX_3 */
bf890a93 8224 { "lddqu", { XM, M }, 0 },
c0f3af97
L
8225 },
8226 {
7531c613
JB
8227 /* MOD_0F382A */
8228 { "movntdqa", { XM, Mx }, PREFIX_DATA },
c0f3af97 8229 },
260cd341
LC
8230 {
8231 /* MOD_VEX_0F3849_X86_64_P_0_W_0 */
8232 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_0_W_0_M_0) },
8233 { REG_TABLE (REG_VEX_0F3849_X86_64_P_0_W_0_M_1) },
8234 },
8235 {
8236 /* MOD_VEX_0F3849_X86_64_P_2_W_0 */
8237 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_2_W_0_M_0) },
8238 },
8239 {
8240 /* MOD_VEX_0F3849_X86_64_P_3_W_0 */
8241 { Bad_Opcode },
8242 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_3_W_0_M_0) },
8243 },
8244 {
8245 /* MOD_VEX_0F384B_X86_64_P_1_W_0 */
8246 { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64_P_1_W_0_M_0) },
8247 },
8248 {
8249 /* MOD_VEX_0F384B_X86_64_P_2_W_0 */
8250 { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64_P_2_W_0_M_0) },
8251 },
8252 {
8253 /* MOD_VEX_0F384B_X86_64_P_3_W_0 */
8254 { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64_P_3_W_0_M_0) },
8255 },
8256 {
8257 /* MOD_VEX_0F385C_X86_64_P_1_W_0 */
8258 { Bad_Opcode },
8259 { VEX_LEN_TABLE (VEX_LEN_0F385C_X86_64_P_1_W_0_M_0) },
8260 },
8261 {
8262 /* MOD_VEX_0F385E_X86_64_P_0_W_0 */
8263 { Bad_Opcode },
8264 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_0_W_0_M_0) },
8265 },
8266 {
8267 /* MOD_VEX_0F385E_X86_64_P_1_W_0 */
8268 { Bad_Opcode },
8269 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_1_W_0_M_0) },
8270 },
8271 {
8272 /* MOD_VEX_0F385E_X86_64_P_2_W_0 */
8273 { Bad_Opcode },
8274 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_2_W_0_M_0) },
8275 },
8276 {
8277 /* MOD_VEX_0F385E_X86_64_P_3_W_0 */
8278 { Bad_Opcode },
8279 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_3_W_0_M_0) },
8280 },
c4694f17
TG
8281 {
8282 /* MOD_0F38DC_PREFIX_1 */
8283 { "aesenc128kl", { XM, M }, 0 },
8284 { "loadiwkey", { XM, EXx }, 0 },
8285 },
8286 {
8287 /* MOD_0F38DD_PREFIX_1 */
8288 { "aesdec128kl", { XM, M }, 0 },
8289 },
8290 {
8291 /* MOD_0F38DE_PREFIX_1 */
8292 { "aesenc256kl", { XM, M }, 0 },
8293 },
8294 {
8295 /* MOD_0F38DF_PREFIX_1 */
8296 { "aesdec256kl", { XM, M }, 0 },
8297 },
603555e5 8298 {
7531c613
JB
8299 /* MOD_0F38F5 */
8300 { "wrussK", { M, Gdq }, PREFIX_DATA },
603555e5
L
8301 },
8302 {
8303 /* MOD_0F38F6_PREFIX_0 */
8304 { "wrssK", { M, Gdq }, PREFIX_OPCODE },
8305 },
5d79adc4
L
8306 {
8307 /* MOD_0F38F8_PREFIX_1 */
8308 { "enqcmds", { Gva, M }, PREFIX_OPCODE },
8309 },
c0a30a9f
L
8310 {
8311 /* MOD_0F38F8_PREFIX_2 */
8312 { "movdir64b", { Gva, M }, PREFIX_OPCODE },
8313 },
5d79adc4
L
8314 {
8315 /* MOD_0F38F8_PREFIX_3 */
8316 { "enqcmd", { Gva, M }, PREFIX_OPCODE },
8317 },
c0a30a9f 8318 {
035e7389
JB
8319 /* MOD_0F38F9 */
8320 { "movdiri", { Edq, Gdq }, PREFIX_OPCODE },
c0a30a9f 8321 },
c4694f17
TG
8322 {
8323 /* MOD_0F38FA_PREFIX_1 */
8324 { Bad_Opcode },
8325 { "encodekey128", { Gd, Ed }, 0 },
8326 },
8327 {
8328 /* MOD_0F38FB_PREFIX_1 */
8329 { Bad_Opcode },
8330 { "encodekey256", { Gd, Ed }, 0 },
8331 },
c0f3af97
L
8332 {
8333 /* MOD_62_32BIT */
bf890a93 8334 { "bound{S|}", { Gv, Ma }, 0 },
43234a1e 8335 { EVEX_TABLE (EVEX_0F) },
c0f3af97
L
8336 },
8337 {
8338 /* MOD_C4_32BIT */
bf890a93 8339 { "lesS", { Gv, Mp }, 0 },
c0f3af97
L
8340 { VEX_C4_TABLE (VEX_0F) },
8341 },
8342 {
8343 /* MOD_C5_32BIT */
bf890a93 8344 { "ldsS", { Gv, Mp }, 0 },
c0f3af97
L
8345 { VEX_C5_TABLE (VEX_0F) },
8346 },
8347 {
592a252b
L
8348 /* MOD_VEX_0F12_PREFIX_0 */
8349 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_0) },
8350 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_1) },
c0f3af97 8351 },
18897deb
JB
8352 {
8353 /* MOD_VEX_0F12_PREFIX_2 */
8354 { VEX_LEN_TABLE (VEX_LEN_0F12_P_2_M_0) },
8355 },
c0f3af97 8356 {
592a252b
L
8357 /* MOD_VEX_0F13 */
8358 { VEX_LEN_TABLE (VEX_LEN_0F13_M_0) },
c0f3af97
L
8359 },
8360 {
592a252b
L
8361 /* MOD_VEX_0F16_PREFIX_0 */
8362 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_0) },
8363 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_1) },
c0f3af97 8364 },
18897deb
JB
8365 {
8366 /* MOD_VEX_0F16_PREFIX_2 */
8367 { VEX_LEN_TABLE (VEX_LEN_0F16_P_2_M_0) },
8368 },
c0f3af97 8369 {
592a252b
L
8370 /* MOD_VEX_0F17 */
8371 { VEX_LEN_TABLE (VEX_LEN_0F17_M_0) },
c0f3af97
L
8372 },
8373 {
592a252b 8374 /* MOD_VEX_0F2B */
bf926894 8375 { "vmovntpX", { Mx, XM }, PREFIX_OPCODE },
c0f3af97 8376 },
ab4e4ed5
AF
8377 {
8378 /* MOD_VEX_W_0_0F41_P_0_LEN_1 */
8379 { Bad_Opcode },
464d2b65 8380 { "kandw", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8381 },
8382 {
8383 /* MOD_VEX_W_1_0F41_P_0_LEN_1 */
8384 { Bad_Opcode },
464d2b65 8385 { "kandq", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8386 },
8387 {
8388 /* MOD_VEX_W_0_0F41_P_2_LEN_1 */
8389 { Bad_Opcode },
464d2b65 8390 { "kandb", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8391 },
8392 {
8393 /* MOD_VEX_W_1_0F41_P_2_LEN_1 */
8394 { Bad_Opcode },
464d2b65 8395 { "kandd", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8396 },
8397 {
8398 /* MOD_VEX_W_0_0F42_P_0_LEN_1 */
8399 { Bad_Opcode },
464d2b65 8400 { "kandnw", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8401 },
8402 {
8403 /* MOD_VEX_W_1_0F42_P_0_LEN_1 */
8404 { Bad_Opcode },
464d2b65 8405 { "kandnq", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8406 },
8407 {
8408 /* MOD_VEX_W_0_0F42_P_2_LEN_1 */
8409 { Bad_Opcode },
464d2b65 8410 { "kandnb", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8411 },
8412 {
8413 /* MOD_VEX_W_1_0F42_P_2_LEN_1 */
8414 { Bad_Opcode },
464d2b65 8415 { "kandnd", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8416 },
8417 {
8418 /* MOD_VEX_W_0_0F44_P_0_LEN_0 */
8419 { Bad_Opcode },
464d2b65 8420 { "knotw", { MaskG, MaskE }, 0 },
ab4e4ed5
AF
8421 },
8422 {
8423 /* MOD_VEX_W_1_0F44_P_0_LEN_0 */
8424 { Bad_Opcode },
464d2b65 8425 { "knotq", { MaskG, MaskE }, 0 },
ab4e4ed5
AF
8426 },
8427 {
8428 /* MOD_VEX_W_0_0F44_P_2_LEN_0 */
8429 { Bad_Opcode },
464d2b65 8430 { "knotb", { MaskG, MaskE }, 0 },
ab4e4ed5
AF
8431 },
8432 {
8433 /* MOD_VEX_W_1_0F44_P_2_LEN_0 */
8434 { Bad_Opcode },
464d2b65 8435 { "knotd", { MaskG, MaskE }, 0 },
ab4e4ed5
AF
8436 },
8437 {
8438 /* MOD_VEX_W_0_0F45_P_0_LEN_1 */
8439 { Bad_Opcode },
464d2b65 8440 { "korw", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8441 },
8442 {
8443 /* MOD_VEX_W_1_0F45_P_0_LEN_1 */
8444 { Bad_Opcode },
464d2b65 8445 { "korq", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8446 },
8447 {
8448 /* MOD_VEX_W_0_0F45_P_2_LEN_1 */
8449 { Bad_Opcode },
464d2b65 8450 { "korb", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8451 },
8452 {
8453 /* MOD_VEX_W_1_0F45_P_2_LEN_1 */
8454 { Bad_Opcode },
464d2b65 8455 { "kord", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8456 },
8457 {
8458 /* MOD_VEX_W_0_0F46_P_0_LEN_1 */
8459 { Bad_Opcode },
464d2b65 8460 { "kxnorw", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8461 },
8462 {
8463 /* MOD_VEX_W_1_0F46_P_0_LEN_1 */
8464 { Bad_Opcode },
464d2b65 8465 { "kxnorq", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8466 },
8467 {
8468 /* MOD_VEX_W_0_0F46_P_2_LEN_1 */
8469 { Bad_Opcode },
464d2b65 8470 { "kxnorb", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8471 },
8472 {
8473 /* MOD_VEX_W_1_0F46_P_2_LEN_1 */
8474 { Bad_Opcode },
464d2b65 8475 { "kxnord", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8476 },
8477 {
8478 /* MOD_VEX_W_0_0F47_P_0_LEN_1 */
8479 { Bad_Opcode },
464d2b65 8480 { "kxorw", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8481 },
8482 {
8483 /* MOD_VEX_W_1_0F47_P_0_LEN_1 */
8484 { Bad_Opcode },
464d2b65 8485 { "kxorq", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8486 },
8487 {
8488 /* MOD_VEX_W_0_0F47_P_2_LEN_1 */
8489 { Bad_Opcode },
464d2b65 8490 { "kxorb", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8491 },
8492 {
8493 /* MOD_VEX_W_1_0F47_P_2_LEN_1 */
8494 { Bad_Opcode },
464d2b65 8495 { "kxord", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8496 },
8497 {
8498 /* MOD_VEX_W_0_0F4A_P_0_LEN_1 */
8499 { Bad_Opcode },
464d2b65 8500 { "kaddw", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8501 },
8502 {
8503 /* MOD_VEX_W_1_0F4A_P_0_LEN_1 */
8504 { Bad_Opcode },
464d2b65 8505 { "kaddq", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8506 },
8507 {
8508 /* MOD_VEX_W_0_0F4A_P_2_LEN_1 */
8509 { Bad_Opcode },
464d2b65 8510 { "kaddb", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8511 },
8512 {
8513 /* MOD_VEX_W_1_0F4A_P_2_LEN_1 */
8514 { Bad_Opcode },
464d2b65 8515 { "kaddd", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8516 },
8517 {
8518 /* MOD_VEX_W_0_0F4B_P_0_LEN_1 */
8519 { Bad_Opcode },
464d2b65 8520 { "kunpckwd", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8521 },
8522 {
8523 /* MOD_VEX_W_1_0F4B_P_0_LEN_1 */
8524 { Bad_Opcode },
464d2b65 8525 { "kunpckdq", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8526 },
8527 {
8528 /* MOD_VEX_W_0_0F4B_P_2_LEN_1 */
8529 { Bad_Opcode },
464d2b65 8530 { "kunpckbw", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5 8531 },
c0f3af97 8532 {
592a252b 8533 /* MOD_VEX_0F50 */
592d1631 8534 { Bad_Opcode },
bf926894 8535 { "vmovmskpX", { Gdq, XS }, PREFIX_OPCODE },
c0f3af97
L
8536 },
8537 {
592a252b 8538 /* MOD_VEX_0F71_REG_2 */
592d1631 8539 { Bad_Opcode },
7531c613 8540 { "vpsrlw", { Vex, XS, Ib }, PREFIX_DATA },
b844680a
L
8541 },
8542 {
592a252b 8543 /* MOD_VEX_0F71_REG_4 */
592d1631 8544 { Bad_Opcode },
7531c613 8545 { "vpsraw", { Vex, XS, Ib }, PREFIX_DATA },
b844680a
L
8546 },
8547 {
592a252b 8548 /* MOD_VEX_0F71_REG_6 */
592d1631 8549 { Bad_Opcode },
7531c613 8550 { "vpsllw", { Vex, XS, Ib }, PREFIX_DATA },
b844680a
L
8551 },
8552 {
592a252b 8553 /* MOD_VEX_0F72_REG_2 */
592d1631 8554 { Bad_Opcode },
7531c613 8555 { "vpsrld", { Vex, XS, Ib }, PREFIX_DATA },
b844680a 8556 },
d8faab4e 8557 {
592a252b 8558 /* MOD_VEX_0F72_REG_4 */
592d1631 8559 { Bad_Opcode },
7531c613 8560 { "vpsrad", { Vex, XS, Ib }, PREFIX_DATA },
d8faab4e
L
8561 },
8562 {
592a252b 8563 /* MOD_VEX_0F72_REG_6 */
592d1631 8564 { Bad_Opcode },
7531c613 8565 { "vpslld", { Vex, XS, Ib }, PREFIX_DATA },
d8faab4e 8566 },
876d4bfa 8567 {
592a252b 8568 /* MOD_VEX_0F73_REG_2 */
592d1631 8569 { Bad_Opcode },
7531c613 8570 { "vpsrlq", { Vex, XS, Ib }, PREFIX_DATA },
876d4bfa
L
8571 },
8572 {
592a252b 8573 /* MOD_VEX_0F73_REG_3 */
592d1631 8574 { Bad_Opcode },
7531c613 8575 { "vpsrldq", { Vex, XS, Ib }, PREFIX_DATA },
475a2301
L
8576 },
8577 {
592a252b 8578 /* MOD_VEX_0F73_REG_6 */
592d1631 8579 { Bad_Opcode },
7531c613 8580 { "vpsllq", { Vex, XS, Ib }, PREFIX_DATA },
876d4bfa
L
8581 },
8582 {
592a252b 8583 /* MOD_VEX_0F73_REG_7 */
592d1631 8584 { Bad_Opcode },
7531c613 8585 { "vpslldq", { Vex, XS, Ib }, PREFIX_DATA },
876d4bfa 8586 },
ab4e4ed5
AF
8587 {
8588 /* MOD_VEX_W_0_0F91_P_0_LEN_0 */
8589 { "kmovw", { Ew, MaskG }, 0 },
8590 { Bad_Opcode },
8591 },
8592 {
8593 /* MOD_VEX_W_0_0F91_P_0_LEN_0 */
8594 { "kmovq", { Eq, MaskG }, 0 },
8595 { Bad_Opcode },
8596 },
8597 {
8598 /* MOD_VEX_W_0_0F91_P_2_LEN_0 */
8599 { "kmovb", { Eb, MaskG }, 0 },
8600 { Bad_Opcode },
8601 },
8602 {
8603 /* MOD_VEX_W_0_0F91_P_2_LEN_0 */
8604 { "kmovd", { Ed, MaskG }, 0 },
8605 { Bad_Opcode },
8606 },
8607 {
8608 /* MOD_VEX_W_0_0F92_P_0_LEN_0 */
8609 { Bad_Opcode },
464d2b65 8610 { "kmovw", { MaskG, Edq }, 0 },
ab4e4ed5
AF
8611 },
8612 {
8613 /* MOD_VEX_W_0_0F92_P_2_LEN_0 */
8614 { Bad_Opcode },
464d2b65 8615 { "kmovb", { MaskG, Edq }, 0 },
ab4e4ed5
AF
8616 },
8617 {
58a211d2 8618 /* MOD_VEX_0F92_P_3_LEN_0 */
ab4e4ed5 8619 { Bad_Opcode },
464d2b65 8620 { "kmovK", { MaskG, Edq }, 0 },
ab4e4ed5
AF
8621 },
8622 {
8623 /* MOD_VEX_W_0_0F93_P_0_LEN_0 */
8624 { Bad_Opcode },
464d2b65 8625 { "kmovw", { Gdq, MaskE }, 0 },
ab4e4ed5
AF
8626 },
8627 {
8628 /* MOD_VEX_W_0_0F93_P_2_LEN_0 */
8629 { Bad_Opcode },
464d2b65 8630 { "kmovb", { Gdq, MaskE }, 0 },
ab4e4ed5
AF
8631 },
8632 {
58a211d2 8633 /* MOD_VEX_0F93_P_3_LEN_0 */
ab4e4ed5 8634 { Bad_Opcode },
464d2b65 8635 { "kmovK", { Gdq, MaskE }, 0 },
ab4e4ed5
AF
8636 },
8637 {
8638 /* MOD_VEX_W_0_0F98_P_0_LEN_0 */
8639 { Bad_Opcode },
464d2b65 8640 { "kortestw", { MaskG, MaskE }, 0 },
ab4e4ed5
AF
8641 },
8642 {
8643 /* MOD_VEX_W_1_0F98_P_0_LEN_0 */
8644 { Bad_Opcode },
464d2b65 8645 { "kortestq", { MaskG, MaskE }, 0 },
ab4e4ed5
AF
8646 },
8647 {
8648 /* MOD_VEX_W_0_0F98_P_2_LEN_0 */
8649 { Bad_Opcode },
464d2b65 8650 { "kortestb", { MaskG, MaskE }, 0 },
ab4e4ed5
AF
8651 },
8652 {
8653 /* MOD_VEX_W_1_0F98_P_2_LEN_0 */
8654 { Bad_Opcode },
464d2b65 8655 { "kortestd", { MaskG, MaskE }, 0 },
ab4e4ed5
AF
8656 },
8657 {
8658 /* MOD_VEX_W_0_0F99_P_0_LEN_0 */
8659 { Bad_Opcode },
464d2b65 8660 { "ktestw", { MaskG, MaskE }, 0 },
ab4e4ed5
AF
8661 },
8662 {
8663 /* MOD_VEX_W_1_0F99_P_0_LEN_0 */
8664 { Bad_Opcode },
464d2b65 8665 { "ktestq", { MaskG, MaskE }, 0 },
ab4e4ed5
AF
8666 },
8667 {
8668 /* MOD_VEX_W_0_0F99_P_2_LEN_0 */
8669 { Bad_Opcode },
464d2b65 8670 { "ktestb", { MaskG, MaskE }, 0 },
ab4e4ed5
AF
8671 },
8672 {
8673 /* MOD_VEX_W_1_0F99_P_2_LEN_0 */
8674 { Bad_Opcode },
464d2b65 8675 { "ktestd", { MaskG, MaskE }, 0 },
ab4e4ed5 8676 },
876d4bfa 8677 {
592a252b
L
8678 /* MOD_VEX_0FAE_REG_2 */
8679 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_2_M_0) },
876d4bfa 8680 },
bbedc832 8681 {
592a252b
L
8682 /* MOD_VEX_0FAE_REG_3 */
8683 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_3_M_0) },
bbedc832 8684 },
144c41d9 8685 {
7531c613 8686 /* MOD_VEX_0FD7 */
592d1631 8687 { Bad_Opcode },
7531c613 8688 { "vpmovmskb", { Gdq, XS }, PREFIX_DATA },
144c41d9 8689 },
1afd85e3 8690 {
7531c613
JB
8691 /* MOD_VEX_0FE7 */
8692 { "vmovntdq", { Mx, XM }, PREFIX_DATA },
1afd85e3
L
8693 },
8694 {
592a252b 8695 /* MOD_VEX_0FF0_PREFIX_3 */
ec6f095a 8696 { "vlddqu", { XM, M }, 0 },
92fddf8e 8697 },
75c135a8 8698 {
7531c613
JB
8699 /* MOD_VEX_0F381A */
8700 { VEX_LEN_TABLE (VEX_LEN_0F381A_M_0) },
75c135a8 8701 },
1afd85e3 8702 {
7531c613
JB
8703 /* MOD_VEX_0F382A */
8704 { "vmovntdqa", { XM, Mx }, PREFIX_DATA },
1afd85e3 8705 },
75c135a8 8706 {
7531c613
JB
8707 /* MOD_VEX_0F382C */
8708 { VEX_W_TABLE (VEX_W_0F382C_M_0) },
75c135a8 8709 },
1afd85e3 8710 {
7531c613
JB
8711 /* MOD_VEX_0F382D */
8712 { VEX_W_TABLE (VEX_W_0F382D_M_0) },
1afd85e3
L
8713 },
8714 {
7531c613
JB
8715 /* MOD_VEX_0F382E */
8716 { VEX_W_TABLE (VEX_W_0F382E_M_0) },
1afd85e3
L
8717 },
8718 {
7531c613
JB
8719 /* MOD_VEX_0F382F */
8720 { VEX_W_TABLE (VEX_W_0F382F_M_0) },
1afd85e3 8721 },
6c30d220 8722 {
7531c613
JB
8723 /* MOD_VEX_0F385A */
8724 { VEX_LEN_TABLE (VEX_LEN_0F385A_M_0) },
6c30d220
L
8725 },
8726 {
7531c613
JB
8727 /* MOD_VEX_0F388C */
8728 { "vpmaskmov%DQ", { XM, Vex, Mx }, PREFIX_DATA },
6c30d220
L
8729 },
8730 {
7531c613
JB
8731 /* MOD_VEX_0F388E */
8732 { "vpmaskmov%DQ", { Mx, Vex, XM }, PREFIX_DATA },
6c30d220 8733 },
ab4e4ed5 8734 {
bb5b3501 8735 /* MOD_VEX_0F3A30_L_0 */
ab4e4ed5 8736 { Bad_Opcode },
464d2b65 8737 { "kshiftr%BW", { MaskG, MaskE, Ib }, PREFIX_DATA },
ab4e4ed5
AF
8738 },
8739 {
bb5b3501 8740 /* MOD_VEX_0F3A31_L_0 */
ab4e4ed5 8741 { Bad_Opcode },
464d2b65 8742 { "kshiftr%DQ", { MaskG, MaskE, Ib }, PREFIX_DATA },
ab4e4ed5
AF
8743 },
8744 {
bb5b3501 8745 /* MOD_VEX_0F3A32_L_0 */
ab4e4ed5 8746 { Bad_Opcode },
464d2b65 8747 { "kshiftl%BW", { MaskG, MaskE, Ib }, PREFIX_DATA },
ab4e4ed5
AF
8748 },
8749 {
bb5b3501 8750 /* MOD_VEX_0F3A33_L_0 */
ab4e4ed5 8751 { Bad_Opcode },
464d2b65 8752 { "kshiftl%DQ", { MaskG, MaskE, Ib }, PREFIX_DATA },
ab4e4ed5 8753 },
467bbef0
JB
8754 {
8755 /* MOD_VEX_0FXOP_09_12 */
8756 { Bad_Opcode },
8757 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_12_M_1) },
8758 },
ad692897
L
8759
8760#include "i386-dis-evex-mod.h"
b844680a
L
8761};
8762
1ceb70f8 8763static const struct dis386 rm_table[][8] = {
42164a71
L
8764 {
8765 /* RM_C6_REG_7 */
bf890a93 8766 { "xabort", { Skip_MODRM, Ib }, 0 },
42164a71
L
8767 },
8768 {
8769 /* RM_C7_REG_7 */
376cd056 8770 { "xbeginT", { Skip_MODRM, Jdqw }, 0 },
42164a71 8771 },
b844680a 8772 {
1ceb70f8 8773 /* RM_0F01_REG_0 */
a4e78aa5 8774 { "enclv", { Skip_MODRM }, 0 },
bf890a93
IT
8775 { "vmcall", { Skip_MODRM }, 0 },
8776 { "vmlaunch", { Skip_MODRM }, 0 },
8777 { "vmresume", { Skip_MODRM }, 0 },
8778 { "vmxoff", { Skip_MODRM }, 0 },
be3a8dca 8779 { "pconfig", { Skip_MODRM }, 0 },
b844680a
L
8780 },
8781 {
1ceb70f8 8782 /* RM_0F01_REG_1 */
bf890a93
IT
8783 { "monitor", { { OP_Monitor, 0 } }, 0 },
8784 { "mwait", { { OP_Mwait, 0 } }, 0 },
8785 { "clac", { Skip_MODRM }, 0 },
8786 { "stac", { Skip_MODRM }, 0 },
2cf200a4
IT
8787 { Bad_Opcode },
8788 { Bad_Opcode },
8789 { Bad_Opcode },
bf890a93 8790 { "encls", { Skip_MODRM }, 0 },
b844680a 8791 },
475a2301
L
8792 {
8793 /* RM_0F01_REG_2 */
bf890a93
IT
8794 { "xgetbv", { Skip_MODRM }, 0 },
8795 { "xsetbv", { Skip_MODRM }, 0 },
8729a6f6
L
8796 { Bad_Opcode },
8797 { Bad_Opcode },
bf890a93
IT
8798 { "vmfunc", { Skip_MODRM }, 0 },
8799 { "xend", { Skip_MODRM }, 0 },
8800 { "xtest", { Skip_MODRM }, 0 },
8801 { "enclu", { Skip_MODRM }, 0 },
475a2301 8802 },
b844680a 8803 {
1ceb70f8 8804 /* RM_0F01_REG_3 */
bf890a93 8805 { "vmrun", { Skip_MODRM }, 0 },
a847e322 8806 { PREFIX_TABLE (PREFIX_0F01_REG_3_RM_1) },
bf890a93
IT
8807 { "vmload", { Skip_MODRM }, 0 },
8808 { "vmsave", { Skip_MODRM }, 0 },
8809 { "stgi", { Skip_MODRM }, 0 },
8810 { "clgi", { Skip_MODRM }, 0 },
8811 { "skinit", { Skip_MODRM }, 0 },
8812 { "invlpga", { Skip_MODRM }, 0 },
4e7d34a6 8813 },
8eab4136 8814 {
f8687e93
JB
8815 /* RM_0F01_REG_5_MOD_3 */
8816 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_0) },
bb651e8b 8817 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_1) },
f8687e93 8818 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_2) },
8eab4136
L
8819 { Bad_Opcode },
8820 { Bad_Opcode },
8821 { Bad_Opcode },
8822 { "rdpkru", { Skip_MODRM }, 0 },
8823 { "wrpkru", { Skip_MODRM }, 0 },
8824 },
4e7d34a6 8825 {
f8687e93 8826 /* RM_0F01_REG_7_MOD_3 */
bf890a93
IT
8827 { "swapgs", { Skip_MODRM }, 0 },
8828 { "rdtscp", { Skip_MODRM }, 0 },
267b8516 8829 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_2) },
035e7389 8830 { "mwaitx", { { OP_Mwait, eBX_reg } }, PREFIX_OPCODE },
bf890a93 8831 { "clzero", { Skip_MODRM }, 0 },
142861df 8832 { "rdpru", { Skip_MODRM }, 0 },
b844680a 8833 },
603555e5 8834 {
f8687e93 8835 /* RM_0F1E_P_1_MOD_3_REG_7 */
603555e5
L
8836 { "nopQ", { Ev }, 0 },
8837 { "nopQ", { Ev }, 0 },
8838 { "endbr64", { Skip_MODRM }, PREFIX_OPCODE },
8839 { "endbr32", { Skip_MODRM }, PREFIX_OPCODE },
8840 { "nopQ", { Ev }, 0 },
8841 { "nopQ", { Ev }, 0 },
8842 { "nopQ", { Ev }, 0 },
8843 { "nopQ", { Ev }, 0 },
8844 },
b844680a 8845 {
f8687e93 8846 /* RM_0FAE_REG_6_MOD_3 */
bf890a93 8847 { "mfence", { Skip_MODRM }, 0 },
b844680a 8848 },
bbedc832 8849 {
f8687e93 8850 /* RM_0FAE_REG_7_MOD_3 */
b5cefcca
L
8851 { "sfence", { Skip_MODRM }, 0 },
8852
144c41d9 8853 },
260cd341
LC
8854 {
8855 /* RM_VEX_0F3849_X86_64_P_0_W_0_M_1_R_0 */
8856 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_0_W_0_M_1_REG_0_RM_0) },
8857 },
b844680a
L
8858};
8859
c608c12e
AM
8860#define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
8861
f16cd0d5
L
8862/* We use the high bit to indicate different name for the same
8863 prefix. */
f16cd0d5 8864#define REP_PREFIX (0xf3 | 0x100)
42164a71
L
8865#define XACQUIRE_PREFIX (0xf2 | 0x200)
8866#define XRELEASE_PREFIX (0xf3 | 0x400)
7e8b059b 8867#define BND_PREFIX (0xf2 | 0x400)
04ef582a 8868#define NOTRACK_PREFIX (0x3e | 0x100)
f16cd0d5 8869
1d67fe3b
TT
8870/* Remember if the current op is a jump instruction. */
8871static bfd_boolean op_is_jump = FALSE;
8872
f16cd0d5 8873static int
26ca5450 8874ckprefix (void)
252b5132 8875{
f16cd0d5 8876 int newrex, i, length;
52b15da3 8877 rex = 0;
252b5132 8878 prefixes = 0;
7d421014 8879 used_prefixes = 0;
52b15da3 8880 rex_used = 0;
f16cd0d5
L
8881 last_lock_prefix = -1;
8882 last_repz_prefix = -1;
8883 last_repnz_prefix = -1;
8884 last_data_prefix = -1;
8885 last_addr_prefix = -1;
8886 last_rex_prefix = -1;
8887 last_seg_prefix = -1;
d9949a36 8888 fwait_prefix = -1;
285ca992 8889 active_seg_prefix = 0;
f310f33d
L
8890 for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
8891 all_prefixes[i] = 0;
8892 i = 0;
f16cd0d5
L
8893 length = 0;
8894 /* The maximum instruction length is 15bytes. */
8895 while (length < MAX_CODE_LENGTH - 1)
252b5132
RH
8896 {
8897 FETCH_DATA (the_info, codep + 1);
52b15da3 8898 newrex = 0;
252b5132
RH
8899 switch (*codep)
8900 {
52b15da3
JH
8901 /* REX prefixes family. */
8902 case 0x40:
8903 case 0x41:
8904 case 0x42:
8905 case 0x43:
8906 case 0x44:
8907 case 0x45:
8908 case 0x46:
8909 case 0x47:
8910 case 0x48:
8911 case 0x49:
8912 case 0x4a:
8913 case 0x4b:
8914 case 0x4c:
8915 case 0x4d:
8916 case 0x4e:
8917 case 0x4f:
f16cd0d5
L
8918 if (address_mode == mode_64bit)
8919 newrex = *codep;
8920 else
8921 return 1;
8922 last_rex_prefix = i;
52b15da3 8923 break;
252b5132
RH
8924 case 0xf3:
8925 prefixes |= PREFIX_REPZ;
f16cd0d5 8926 last_repz_prefix = i;
252b5132
RH
8927 break;
8928 case 0xf2:
8929 prefixes |= PREFIX_REPNZ;
f16cd0d5 8930 last_repnz_prefix = i;
252b5132
RH
8931 break;
8932 case 0xf0:
8933 prefixes |= PREFIX_LOCK;
f16cd0d5 8934 last_lock_prefix = i;
252b5132
RH
8935 break;
8936 case 0x2e:
8937 prefixes |= PREFIX_CS;
f16cd0d5 8938 last_seg_prefix = i;
285ca992 8939 active_seg_prefix = PREFIX_CS;
252b5132
RH
8940 break;
8941 case 0x36:
8942 prefixes |= PREFIX_SS;
f16cd0d5 8943 last_seg_prefix = i;
285ca992 8944 active_seg_prefix = PREFIX_SS;
252b5132
RH
8945 break;
8946 case 0x3e:
8947 prefixes |= PREFIX_DS;
f16cd0d5 8948 last_seg_prefix = i;
285ca992 8949 active_seg_prefix = PREFIX_DS;
252b5132
RH
8950 break;
8951 case 0x26:
8952 prefixes |= PREFIX_ES;
f16cd0d5 8953 last_seg_prefix = i;
285ca992 8954 active_seg_prefix = PREFIX_ES;
252b5132
RH
8955 break;
8956 case 0x64:
8957 prefixes |= PREFIX_FS;
f16cd0d5 8958 last_seg_prefix = i;
285ca992 8959 active_seg_prefix = PREFIX_FS;
252b5132
RH
8960 break;
8961 case 0x65:
8962 prefixes |= PREFIX_GS;
f16cd0d5 8963 last_seg_prefix = i;
285ca992 8964 active_seg_prefix = PREFIX_GS;
252b5132
RH
8965 break;
8966 case 0x66:
8967 prefixes |= PREFIX_DATA;
f16cd0d5 8968 last_data_prefix = i;
252b5132
RH
8969 break;
8970 case 0x67:
8971 prefixes |= PREFIX_ADDR;
f16cd0d5 8972 last_addr_prefix = i;
252b5132 8973 break;
5076851f 8974 case FWAIT_OPCODE:
252b5132
RH
8975 /* fwait is really an instruction. If there are prefixes
8976 before the fwait, they belong to the fwait, *not* to the
8977 following instruction. */
d9949a36 8978 fwait_prefix = i;
3e7d61b2 8979 if (prefixes || rex)
252b5132
RH
8980 {
8981 prefixes |= PREFIX_FWAIT;
8982 codep++;
6c067bbb
RM
8983 /* This ensures that the previous REX prefixes are noticed
8984 as unused prefixes, as in the return case below. */
8985 rex_used = rex;
f16cd0d5 8986 return 1;
252b5132
RH
8987 }
8988 prefixes = PREFIX_FWAIT;
8989 break;
8990 default:
f16cd0d5 8991 return 1;
252b5132 8992 }
52b15da3
JH
8993 /* Rex is ignored when followed by another prefix. */
8994 if (rex)
8995 {
3e7d61b2 8996 rex_used = rex;
f16cd0d5 8997 return 1;
52b15da3 8998 }
f16cd0d5 8999 if (*codep != FWAIT_OPCODE)
4e9ac44a 9000 all_prefixes[i++] = *codep;
52b15da3 9001 rex = newrex;
252b5132 9002 codep++;
f16cd0d5
L
9003 length++;
9004 }
9005 return 0;
9006}
9007
7d421014
ILT
9008/* Return the name of the prefix byte PREF, or NULL if PREF is not a
9009 prefix byte. */
9010
9011static const char *
26ca5450 9012prefix_name (int pref, int sizeflag)
7d421014 9013{
0003779b
L
9014 static const char *rexes [16] =
9015 {
9016 "rex", /* 0x40 */
9017 "rex.B", /* 0x41 */
9018 "rex.X", /* 0x42 */
9019 "rex.XB", /* 0x43 */
9020 "rex.R", /* 0x44 */
9021 "rex.RB", /* 0x45 */
9022 "rex.RX", /* 0x46 */
9023 "rex.RXB", /* 0x47 */
9024 "rex.W", /* 0x48 */
9025 "rex.WB", /* 0x49 */
9026 "rex.WX", /* 0x4a */
9027 "rex.WXB", /* 0x4b */
9028 "rex.WR", /* 0x4c */
9029 "rex.WRB", /* 0x4d */
9030 "rex.WRX", /* 0x4e */
9031 "rex.WRXB", /* 0x4f */
9032 };
9033
7d421014
ILT
9034 switch (pref)
9035 {
52b15da3
JH
9036 /* REX prefixes family. */
9037 case 0x40:
52b15da3 9038 case 0x41:
52b15da3 9039 case 0x42:
52b15da3 9040 case 0x43:
52b15da3 9041 case 0x44:
52b15da3 9042 case 0x45:
52b15da3 9043 case 0x46:
52b15da3 9044 case 0x47:
52b15da3 9045 case 0x48:
52b15da3 9046 case 0x49:
52b15da3 9047 case 0x4a:
52b15da3 9048 case 0x4b:
52b15da3 9049 case 0x4c:
52b15da3 9050 case 0x4d:
52b15da3 9051 case 0x4e:
52b15da3 9052 case 0x4f:
0003779b 9053 return rexes [pref - 0x40];
7d421014
ILT
9054 case 0xf3:
9055 return "repz";
9056 case 0xf2:
9057 return "repnz";
9058 case 0xf0:
9059 return "lock";
9060 case 0x2e:
9061 return "cs";
9062 case 0x36:
9063 return "ss";
9064 case 0x3e:
9065 return "ds";
9066 case 0x26:
9067 return "es";
9068 case 0x64:
9069 return "fs";
9070 case 0x65:
9071 return "gs";
9072 case 0x66:
9073 return (sizeflag & DFLAG) ? "data16" : "data32";
9074 case 0x67:
cb712a9e 9075 if (address_mode == mode_64bit)
db6eb5be 9076 return (sizeflag & AFLAG) ? "addr32" : "addr64";
c1a64871 9077 else
2888cb7a 9078 return (sizeflag & AFLAG) ? "addr16" : "addr32";
7d421014
ILT
9079 case FWAIT_OPCODE:
9080 return "fwait";
f16cd0d5
L
9081 case REP_PREFIX:
9082 return "rep";
42164a71
L
9083 case XACQUIRE_PREFIX:
9084 return "xacquire";
9085 case XRELEASE_PREFIX:
9086 return "xrelease";
7e8b059b
L
9087 case BND_PREFIX:
9088 return "bnd";
04ef582a
L
9089 case NOTRACK_PREFIX:
9090 return "notrack";
7d421014
ILT
9091 default:
9092 return NULL;
9093 }
9094}
9095
ce518a5f
L
9096static char op_out[MAX_OPERANDS][100];
9097static int op_ad, op_index[MAX_OPERANDS];
1d9f512f 9098static int two_source_ops;
ce518a5f
L
9099static bfd_vma op_address[MAX_OPERANDS];
9100static bfd_vma op_riprel[MAX_OPERANDS];
52b15da3 9101static bfd_vma start_pc;
ce518a5f 9102
252b5132
RH
9103/*
9104 * On the 386's of 1988, the maximum length of an instruction is 15 bytes.
9105 * (see topic "Redundant prefixes" in the "Differences from 8086"
9106 * section of the "Virtual 8086 Mode" chapter.)
9107 * 'pc' should be the address of this instruction, it will
9108 * be used to print the target address if this is a relative jump or call
9109 * The function returns the length of this instruction in bytes.
9110 */
9111
252b5132 9112static char intel_syntax;
9d141669 9113static char intel_mnemonic = !SYSV386_COMPAT;
252b5132
RH
9114static char open_char;
9115static char close_char;
9116static char separator_char;
9117static char scale_char;
9118
5db04b09
L
9119enum x86_64_isa
9120{
d835a58b 9121 amd64 = 1,
5db04b09
L
9122 intel64
9123};
9124
9125static enum x86_64_isa isa64;
9126
e396998b
AM
9127/* Here for backwards compatibility. When gdb stops using
9128 print_insn_i386_att and print_insn_i386_intel these functions can
9129 disappear, and print_insn_i386 be merged into print_insn. */
252b5132 9130int
26ca5450 9131print_insn_i386_att (bfd_vma pc, disassemble_info *info)
252b5132
RH
9132{
9133 intel_syntax = 0;
e396998b
AM
9134
9135 return print_insn (pc, info);
252b5132
RH
9136}
9137
9138int
26ca5450 9139print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
252b5132
RH
9140{
9141 intel_syntax = 1;
e396998b
AM
9142
9143 return print_insn (pc, info);
252b5132
RH
9144}
9145
e396998b 9146int
26ca5450 9147print_insn_i386 (bfd_vma pc, disassemble_info *info)
e396998b
AM
9148{
9149 intel_syntax = -1;
9150
9151 return print_insn (pc, info);
9152}
9153
f59a29b9
L
9154void
9155print_i386_disassembler_options (FILE *stream)
9156{
9157 fprintf (stream, _("\n\
9158The following i386/x86-64 specific disassembler options are supported for use\n\
9159with the -M switch (multiple options should be separated by commas):\n"));
9160
9161 fprintf (stream, _(" x86-64 Disassemble in 64bit mode\n"));
9162 fprintf (stream, _(" i386 Disassemble in 32bit mode\n"));
9163 fprintf (stream, _(" i8086 Disassemble in 16bit mode\n"));
9164 fprintf (stream, _(" att Display instruction in AT&T syntax\n"));
9165 fprintf (stream, _(" intel Display instruction in Intel syntax\n"));
9d141669
L
9166 fprintf (stream, _(" att-mnemonic\n"
9167 " Display instruction in AT&T mnemonic\n"));
9168 fprintf (stream, _(" intel-mnemonic\n"
9169 " Display instruction in Intel mnemonic\n"));
f59a29b9
L
9170 fprintf (stream, _(" addr64 Assume 64bit address size\n"));
9171 fprintf (stream, _(" addr32 Assume 32bit address size\n"));
9172 fprintf (stream, _(" addr16 Assume 16bit address size\n"));
9173 fprintf (stream, _(" data32 Assume 32bit data size\n"));
9174 fprintf (stream, _(" data16 Assume 16bit data size\n"));
9175 fprintf (stream, _(" suffix Always display instruction suffix in AT&T syntax\n"));
5db04b09
L
9176 fprintf (stream, _(" amd64 Display instruction in AMD64 ISA\n"));
9177 fprintf (stream, _(" intel64 Display instruction in Intel64 ISA\n"));
f59a29b9
L
9178}
9179
592d1631 9180/* Bad opcode. */
bf890a93 9181static const struct dis386 bad_opcode = { "(bad)", { XX }, 0 };
592d1631 9182
b844680a
L
9183/* Get a pointer to struct dis386 with a valid name. */
9184
9185static const struct dis386 *
8bb15339 9186get_valid_dis386 (const struct dis386 *dp, disassemble_info *info)
b844680a 9187{
91d6fa6a 9188 int vindex, vex_table_index;
b844680a
L
9189
9190 if (dp->name != NULL)
9191 return dp;
9192
9193 switch (dp->op[0].bytemode)
9194 {
1ceb70f8
L
9195 case USE_REG_TABLE:
9196 dp = &reg_table[dp->op[1].bytemode][modrm.reg];
9197 break;
9198
9199 case USE_MOD_TABLE:
91d6fa6a
NC
9200 vindex = modrm.mod == 0x3 ? 1 : 0;
9201 dp = &mod_table[dp->op[1].bytemode][vindex];
1ceb70f8
L
9202 break;
9203
9204 case USE_RM_TABLE:
9205 dp = &rm_table[dp->op[1].bytemode][modrm.rm];
b844680a
L
9206 break;
9207
4e7d34a6 9208 case USE_PREFIX_TABLE:
c0f3af97 9209 if (need_vex)
b844680a 9210 {
c0f3af97
L
9211 /* The prefix in VEX is implicit. */
9212 switch (vex.prefix)
9213 {
9214 case 0:
91d6fa6a 9215 vindex = 0;
c0f3af97
L
9216 break;
9217 case REPE_PREFIX_OPCODE:
91d6fa6a 9218 vindex = 1;
c0f3af97
L
9219 break;
9220 case DATA_PREFIX_OPCODE:
91d6fa6a 9221 vindex = 2;
c0f3af97
L
9222 break;
9223 case REPNE_PREFIX_OPCODE:
91d6fa6a 9224 vindex = 3;
c0f3af97
L
9225 break;
9226 default:
9227 abort ();
9228 break;
9229 }
b844680a 9230 }
7bb15c6f 9231 else
b844680a 9232 {
285ca992
L
9233 int last_prefix = -1;
9234 int prefix = 0;
91d6fa6a 9235 vindex = 0;
285ca992
L
9236 /* We check PREFIX_REPNZ and PREFIX_REPZ before PREFIX_DATA.
9237 When there are multiple PREFIX_REPNZ and PREFIX_REPZ, the
9238 last one wins. */
9239 if ((prefixes & (PREFIX_REPZ | PREFIX_REPNZ)) != 0)
b844680a 9240 {
285ca992 9241 if (last_repz_prefix > last_repnz_prefix)
c0f3af97 9242 {
285ca992
L
9243 vindex = 1;
9244 prefix = PREFIX_REPZ;
9245 last_prefix = last_repz_prefix;
c0f3af97
L
9246 }
9247 else
b844680a 9248 {
285ca992
L
9249 vindex = 3;
9250 prefix = PREFIX_REPNZ;
9251 last_prefix = last_repnz_prefix;
b844680a 9252 }
285ca992 9253
507bd325
L
9254 /* Check if prefix should be ignored. */
9255 if ((((prefix_table[dp->op[1].bytemode][vindex].prefix_requirement
9256 & PREFIX_IGNORED) >> PREFIX_IGNORED_SHIFT)
9257 & prefix) != 0)
285ca992
L
9258 vindex = 0;
9259 }
9260
9261 if (vindex == 0 && (prefixes & PREFIX_DATA) != 0)
9262 {
9263 vindex = 2;
9264 prefix = PREFIX_DATA;
9265 last_prefix = last_data_prefix;
9266 }
9267
9268 if (vindex != 0)
9269 {
9270 used_prefixes |= prefix;
9271 all_prefixes[last_prefix] = 0;
b844680a
L
9272 }
9273 }
91d6fa6a 9274 dp = &prefix_table[dp->op[1].bytemode][vindex];
b844680a
L
9275 break;
9276
4e7d34a6 9277 case USE_X86_64_TABLE:
91d6fa6a
NC
9278 vindex = address_mode == mode_64bit ? 1 : 0;
9279 dp = &x86_64_table[dp->op[1].bytemode][vindex];
b844680a
L
9280 break;
9281
4e7d34a6 9282 case USE_3BYTE_TABLE:
8bb15339 9283 FETCH_DATA (info, codep + 2);
91d6fa6a
NC
9284 vindex = *codep++;
9285 dp = &three_byte_table[dp->op[1].bytemode][vindex];
285ca992 9286 end_codep = codep;
8bb15339
L
9287 modrm.mod = (*codep >> 6) & 3;
9288 modrm.reg = (*codep >> 3) & 7;
9289 modrm.rm = *codep & 7;
9290 break;
9291
c0f3af97
L
9292 case USE_VEX_LEN_TABLE:
9293 if (!need_vex)
9294 abort ();
9295
9296 switch (vex.length)
9297 {
9298 case 128:
91d6fa6a 9299 vindex = 0;
c0f3af97
L
9300 break;
9301 case 256:
91d6fa6a 9302 vindex = 1;
c0f3af97
L
9303 break;
9304 default:
9305 abort ();
9306 break;
9307 }
9308
91d6fa6a 9309 dp = &vex_len_table[dp->op[1].bytemode][vindex];
c0f3af97
L
9310 break;
9311
04e2a182
L
9312 case USE_EVEX_LEN_TABLE:
9313 if (!vex.evex)
9314 abort ();
9315
9316 switch (vex.length)
9317 {
9318 case 128:
9319 vindex = 0;
9320 break;
9321 case 256:
9322 vindex = 1;
9323 break;
9324 case 512:
9325 vindex = 2;
9326 break;
9327 default:
9328 abort ();
9329 break;
9330 }
9331
9332 dp = &evex_len_table[dp->op[1].bytemode][vindex];
9333 break;
9334
f88c9eb0
SP
9335 case USE_XOP_8F_TABLE:
9336 FETCH_DATA (info, codep + 3);
f88c9eb0
SP
9337 rex = ~(*codep >> 5) & 0x7;
9338
9339 /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm". */
9340 switch ((*codep & 0x1f))
9341 {
9342 default:
f07af43e
L
9343 dp = &bad_opcode;
9344 return dp;
5dd85c99
SP
9345 case 0x8:
9346 vex_table_index = XOP_08;
9347 break;
f88c9eb0
SP
9348 case 0x9:
9349 vex_table_index = XOP_09;
9350 break;
9351 case 0xa:
9352 vex_table_index = XOP_0A;
9353 break;
9354 }
9355 codep++;
9356 vex.w = *codep & 0x80;
9357 if (vex.w && address_mode == mode_64bit)
9358 rex |= REX_W;
9359
9360 vex.register_specifier = (~(*codep >> 3)) & 0xf;
abfcb414 9361 if (address_mode != mode_64bit)
f07af43e 9362 {
abfcb414
AP
9363 /* In 16/32-bit mode REX_B is silently ignored. */
9364 rex &= ~REX_B;
f07af43e 9365 }
f88c9eb0
SP
9366
9367 vex.length = (*codep & 0x4) ? 256 : 128;
9368 switch ((*codep & 0x3))
9369 {
9370 case 0:
f88c9eb0
SP
9371 break;
9372 case 1:
9373 vex.prefix = DATA_PREFIX_OPCODE;
9374 break;
9375 case 2:
9376 vex.prefix = REPE_PREFIX_OPCODE;
9377 break;
9378 case 3:
9379 vex.prefix = REPNE_PREFIX_OPCODE;
9380 break;
9381 }
9382 need_vex = 1;
f88c9eb0 9383 codep++;
91d6fa6a
NC
9384 vindex = *codep++;
9385 dp = &xop_table[vex_table_index][vindex];
c48244a5 9386
285ca992 9387 end_codep = codep;
c48244a5
SP
9388 FETCH_DATA (info, codep + 1);
9389 modrm.mod = (*codep >> 6) & 3;
9390 modrm.reg = (*codep >> 3) & 7;
9391 modrm.rm = *codep & 7;
b5b098c2
JB
9392
9393 /* No XOP encoding so far allows for a non-zero embedded prefix. Avoid
9394 having to decode the bits for every otherwise valid encoding. */
9395 if (vex.prefix)
9396 return &bad_opcode;
f88c9eb0
SP
9397 break;
9398
c0f3af97 9399 case USE_VEX_C4_TABLE:
43234a1e 9400 /* VEX prefix. */
c0f3af97 9401 FETCH_DATA (info, codep + 3);
c0f3af97
L
9402 rex = ~(*codep >> 5) & 0x7;
9403 switch ((*codep & 0x1f))
9404 {
9405 default:
f07af43e
L
9406 dp = &bad_opcode;
9407 return dp;
c0f3af97 9408 case 0x1:
f88c9eb0 9409 vex_table_index = VEX_0F;
c0f3af97
L
9410 break;
9411 case 0x2:
f88c9eb0 9412 vex_table_index = VEX_0F38;
c0f3af97
L
9413 break;
9414 case 0x3:
f88c9eb0 9415 vex_table_index = VEX_0F3A;
c0f3af97
L
9416 break;
9417 }
9418 codep++;
9419 vex.w = *codep & 0x80;
9889cbb1 9420 if (address_mode == mode_64bit)
f07af43e 9421 {
9889cbb1
L
9422 if (vex.w)
9423 rex |= REX_W;
9889cbb1
L
9424 }
9425 else
9426 {
9427 /* For the 3-byte VEX prefix in 32-bit mode, the REX_B bit
9428 is ignored, other REX bits are 0 and the highest bit in
5f847646 9429 VEX.vvvv is also ignored (but we mustn't clear it here). */
9889cbb1 9430 rex = 0;
f07af43e 9431 }
5f847646 9432 vex.register_specifier = (~(*codep >> 3)) & 0xf;
c0f3af97
L
9433 vex.length = (*codep & 0x4) ? 256 : 128;
9434 switch ((*codep & 0x3))
9435 {
9436 case 0:
c0f3af97
L
9437 break;
9438 case 1:
9439 vex.prefix = DATA_PREFIX_OPCODE;
9440 break;
9441 case 2:
9442 vex.prefix = REPE_PREFIX_OPCODE;
9443 break;
9444 case 3:
9445 vex.prefix = REPNE_PREFIX_OPCODE;
9446 break;
9447 }
9448 need_vex = 1;
c0f3af97 9449 codep++;
91d6fa6a
NC
9450 vindex = *codep++;
9451 dp = &vex_table[vex_table_index][vindex];
285ca992 9452 end_codep = codep;
53c4d625
JB
9453 /* There is no MODRM byte for VEX0F 77. */
9454 if (vex_table_index != VEX_0F || vindex != 0x77)
c0f3af97
L
9455 {
9456 FETCH_DATA (info, codep + 1);
9457 modrm.mod = (*codep >> 6) & 3;
9458 modrm.reg = (*codep >> 3) & 7;
9459 modrm.rm = *codep & 7;
9460 }
9461 break;
9462
9463 case USE_VEX_C5_TABLE:
43234a1e 9464 /* VEX prefix. */
c0f3af97 9465 FETCH_DATA (info, codep + 2);
c0f3af97
L
9466 rex = (*codep & 0x80) ? 0 : REX_R;
9467
9889cbb1
L
9468 /* For the 2-byte VEX prefix in 32-bit mode, the highest bit in
9469 VEX.vvvv is 1. */
c0f3af97 9470 vex.register_specifier = (~(*codep >> 3)) & 0xf;
c0f3af97
L
9471 vex.length = (*codep & 0x4) ? 256 : 128;
9472 switch ((*codep & 0x3))
9473 {
9474 case 0:
c0f3af97
L
9475 break;
9476 case 1:
9477 vex.prefix = DATA_PREFIX_OPCODE;
9478 break;
9479 case 2:
9480 vex.prefix = REPE_PREFIX_OPCODE;
9481 break;
9482 case 3:
9483 vex.prefix = REPNE_PREFIX_OPCODE;
9484 break;
9485 }
9486 need_vex = 1;
c0f3af97 9487 codep++;
91d6fa6a
NC
9488 vindex = *codep++;
9489 dp = &vex_table[dp->op[1].bytemode][vindex];
285ca992 9490 end_codep = codep;
53c4d625
JB
9491 /* There is no MODRM byte for VEX 77. */
9492 if (vindex != 0x77)
c0f3af97
L
9493 {
9494 FETCH_DATA (info, codep + 1);
9495 modrm.mod = (*codep >> 6) & 3;
9496 modrm.reg = (*codep >> 3) & 7;
9497 modrm.rm = *codep & 7;
9498 }
9499 break;
9500
9e30b8e0
L
9501 case USE_VEX_W_TABLE:
9502 if (!need_vex)
9503 abort ();
9504
9505 dp = &vex_w_table[dp->op[1].bytemode][vex.w ? 1 : 0];
9506 break;
9507
43234a1e
L
9508 case USE_EVEX_TABLE:
9509 two_source_ops = 0;
9510 /* EVEX prefix. */
9511 vex.evex = 1;
9512 FETCH_DATA (info, codep + 4);
43234a1e
L
9513 /* The first byte after 0x62. */
9514 rex = ~(*codep >> 5) & 0x7;
9515 vex.r = *codep & 0x10;
9516 switch ((*codep & 0xf))
9517 {
9518 default:
9519 return &bad_opcode;
9520 case 0x1:
9521 vex_table_index = EVEX_0F;
9522 break;
9523 case 0x2:
9524 vex_table_index = EVEX_0F38;
9525 break;
9526 case 0x3:
9527 vex_table_index = EVEX_0F3A;
9528 break;
9529 }
9530
9531 /* The second byte after 0x62. */
9532 codep++;
9533 vex.w = *codep & 0x80;
9534 if (vex.w && address_mode == mode_64bit)
9535 rex |= REX_W;
9536
9537 vex.register_specifier = (~(*codep >> 3)) & 0xf;
43234a1e
L
9538
9539 /* The U bit. */
9540 if (!(*codep & 0x4))
9541 return &bad_opcode;
9542
9543 switch ((*codep & 0x3))
9544 {
9545 case 0:
43234a1e
L
9546 break;
9547 case 1:
9548 vex.prefix = DATA_PREFIX_OPCODE;
9549 break;
9550 case 2:
9551 vex.prefix = REPE_PREFIX_OPCODE;
9552 break;
9553 case 3:
9554 vex.prefix = REPNE_PREFIX_OPCODE;
9555 break;
9556 }
9557
9558 /* The third byte after 0x62. */
9559 codep++;
9560
9561 /* Remember the static rounding bits. */
9562 vex.ll = (*codep >> 5) & 3;
9563 vex.b = (*codep & 0x10) != 0;
9564
9565 vex.v = *codep & 0x8;
9566 vex.mask_register_specifier = *codep & 0x7;
9567 vex.zeroing = *codep & 0x80;
9568
5f847646
JB
9569 if (address_mode != mode_64bit)
9570 {
9571 /* In 16/32-bit mode silently ignore following bits. */
9572 rex &= ~REX_B;
9573 vex.r = 1;
9574 vex.v = 1;
9575 }
9576
43234a1e 9577 need_vex = 1;
43234a1e
L
9578 codep++;
9579 vindex = *codep++;
9580 dp = &evex_table[vex_table_index][vindex];
285ca992 9581 end_codep = codep;
43234a1e
L
9582 FETCH_DATA (info, codep + 1);
9583 modrm.mod = (*codep >> 6) & 3;
9584 modrm.reg = (*codep >> 3) & 7;
9585 modrm.rm = *codep & 7;
9586
9587 /* Set vector length. */
9588 if (modrm.mod == 3 && vex.b)
9589 vex.length = 512;
9590 else
9591 {
9592 switch (vex.ll)
9593 {
9594 case 0x0:
9595 vex.length = 128;
9596 break;
9597 case 0x1:
9598 vex.length = 256;
9599 break;
9600 case 0x2:
9601 vex.length = 512;
9602 break;
9603 default:
9604 return &bad_opcode;
9605 }
9606 }
9607 break;
9608
592d1631
L
9609 case 0:
9610 dp = &bad_opcode;
9611 break;
9612
b844680a 9613 default:
d34b5006 9614 abort ();
b844680a
L
9615 }
9616
9617 if (dp->name != NULL)
9618 return dp;
9619 else
8bb15339 9620 return get_valid_dis386 (dp, info);
b844680a
L
9621}
9622
dfc8cf43 9623static void
55cf16e1 9624get_sib (disassemble_info *info, int sizeflag)
dfc8cf43
L
9625{
9626 /* If modrm.mod == 3, operand must be register. */
9627 if (need_modrm
55cf16e1 9628 && ((sizeflag & AFLAG) || address_mode == mode_64bit)
dfc8cf43
L
9629 && modrm.mod != 3
9630 && modrm.rm == 4)
9631 {
9632 FETCH_DATA (info, codep + 2);
9633 sib.index = (codep [1] >> 3) & 7;
9634 sib.scale = (codep [1] >> 6) & 3;
9635 sib.base = codep [1] & 7;
9636 }
9637}
9638
e396998b 9639static int
26ca5450 9640print_insn (bfd_vma pc, disassemble_info *info)
252b5132 9641{
2da11e11 9642 const struct dis386 *dp;
252b5132 9643 int i;
ce518a5f 9644 char *op_txt[MAX_OPERANDS];
252b5132 9645 int needcomma;
df18fdba 9646 int sizeflag, orig_sizeflag;
e396998b 9647 const char *p;
252b5132 9648 struct dis_private priv;
f16cd0d5 9649 int prefix_length;
252b5132 9650
d7921315
L
9651 priv.orig_sizeflag = AFLAG | DFLAG;
9652 if ((info->mach & bfd_mach_i386_i386) != 0)
cb712a9e 9653 address_mode = mode_32bit;
2da11e11 9654 else if (info->mach == bfd_mach_i386_i8086)
d7921315
L
9655 {
9656 address_mode = mode_16bit;
9657 priv.orig_sizeflag = 0;
9658 }
2da11e11 9659 else
d7921315
L
9660 address_mode = mode_64bit;
9661
9662 if (intel_syntax == (char) -1)
9663 intel_syntax = (info->mach & bfd_mach_i386_intel_syntax) != 0;
e396998b
AM
9664
9665 for (p = info->disassembler_options; p != NULL; )
9666 {
5db04b09
L
9667 if (CONST_STRNEQ (p, "amd64"))
9668 isa64 = amd64;
9669 else if (CONST_STRNEQ (p, "intel64"))
9670 isa64 = intel64;
9671 else if (CONST_STRNEQ (p, "x86-64"))
e396998b 9672 {
cb712a9e 9673 address_mode = mode_64bit;
2a1bb84c 9674 priv.orig_sizeflag |= AFLAG | DFLAG;
e396998b 9675 }
0112cd26 9676 else if (CONST_STRNEQ (p, "i386"))
e396998b 9677 {
cb712a9e 9678 address_mode = mode_32bit;
2a1bb84c 9679 priv.orig_sizeflag |= AFLAG | DFLAG;
e396998b 9680 }
0112cd26 9681 else if (CONST_STRNEQ (p, "i8086"))
e396998b 9682 {
cb712a9e 9683 address_mode = mode_16bit;
2a1bb84c 9684 priv.orig_sizeflag &= ~(AFLAG | DFLAG);
e396998b 9685 }
0112cd26 9686 else if (CONST_STRNEQ (p, "intel"))
e396998b
AM
9687 {
9688 intel_syntax = 1;
9d141669
L
9689 if (CONST_STRNEQ (p + 5, "-mnemonic"))
9690 intel_mnemonic = 1;
e396998b 9691 }
0112cd26 9692 else if (CONST_STRNEQ (p, "att"))
e396998b
AM
9693 {
9694 intel_syntax = 0;
9d141669
L
9695 if (CONST_STRNEQ (p + 3, "-mnemonic"))
9696 intel_mnemonic = 0;
e396998b 9697 }
0112cd26 9698 else if (CONST_STRNEQ (p, "addr"))
e396998b 9699 {
f59a29b9
L
9700 if (address_mode == mode_64bit)
9701 {
9702 if (p[4] == '3' && p[5] == '2')
9703 priv.orig_sizeflag &= ~AFLAG;
9704 else if (p[4] == '6' && p[5] == '4')
9705 priv.orig_sizeflag |= AFLAG;
9706 }
9707 else
9708 {
9709 if (p[4] == '1' && p[5] == '6')
9710 priv.orig_sizeflag &= ~AFLAG;
9711 else if (p[4] == '3' && p[5] == '2')
9712 priv.orig_sizeflag |= AFLAG;
9713 }
e396998b 9714 }
0112cd26 9715 else if (CONST_STRNEQ (p, "data"))
e396998b
AM
9716 {
9717 if (p[4] == '1' && p[5] == '6')
9718 priv.orig_sizeflag &= ~DFLAG;
9719 else if (p[4] == '3' && p[5] == '2')
9720 priv.orig_sizeflag |= DFLAG;
9721 }
0112cd26 9722 else if (CONST_STRNEQ (p, "suffix"))
e396998b
AM
9723 priv.orig_sizeflag |= SUFFIX_ALWAYS;
9724
9725 p = strchr (p, ',');
9726 if (p != NULL)
9727 p++;
9728 }
9729
c0f92bf9
L
9730 if (address_mode == mode_64bit && sizeof (bfd_vma) < 8)
9731 {
9732 (*info->fprintf_func) (info->stream,
9733 _("64-bit address is disabled"));
9734 return -1;
9735 }
9736
e396998b
AM
9737 if (intel_syntax)
9738 {
9739 names64 = intel_names64;
9740 names32 = intel_names32;
9741 names16 = intel_names16;
9742 names8 = intel_names8;
9743 names8rex = intel_names8rex;
9744 names_seg = intel_names_seg;
b9733481 9745 names_mm = intel_names_mm;
7e8b059b 9746 names_bnd = intel_names_bnd;
b9733481
L
9747 names_xmm = intel_names_xmm;
9748 names_ymm = intel_names_ymm;
43234a1e 9749 names_zmm = intel_names_zmm;
260cd341 9750 names_tmm = intel_names_tmm;
db51cc60
L
9751 index64 = intel_index64;
9752 index32 = intel_index32;
43234a1e 9753 names_mask = intel_names_mask;
e396998b
AM
9754 index16 = intel_index16;
9755 open_char = '[';
9756 close_char = ']';
9757 separator_char = '+';
9758 scale_char = '*';
9759 }
9760 else
9761 {
9762 names64 = att_names64;
9763 names32 = att_names32;
9764 names16 = att_names16;
9765 names8 = att_names8;
9766 names8rex = att_names8rex;
9767 names_seg = att_names_seg;
b9733481 9768 names_mm = att_names_mm;
7e8b059b 9769 names_bnd = att_names_bnd;
b9733481
L
9770 names_xmm = att_names_xmm;
9771 names_ymm = att_names_ymm;
43234a1e 9772 names_zmm = att_names_zmm;
260cd341 9773 names_tmm = att_names_tmm;
db51cc60
L
9774 index64 = att_index64;
9775 index32 = att_index32;
43234a1e 9776 names_mask = att_names_mask;
e396998b
AM
9777 index16 = att_index16;
9778 open_char = '(';
9779 close_char = ')';
9780 separator_char = ',';
9781 scale_char = ',';
9782 }
2da11e11 9783
4fe53c98 9784 /* The output looks better if we put 7 bytes on a line, since that
8a9036a4
L
9785 puts most long word instructions on a single line. Use 8 bytes
9786 for Intel L1OM. */
d7921315 9787 if ((info->mach & bfd_mach_l1om) != 0)
8a9036a4
L
9788 info->bytes_per_line = 8;
9789 else
9790 info->bytes_per_line = 7;
252b5132 9791
26ca5450 9792 info->private_data = &priv;
252b5132
RH
9793 priv.max_fetched = priv.the_buffer;
9794 priv.insn_start = pc;
252b5132
RH
9795
9796 obuf[0] = 0;
ce518a5f
L
9797 for (i = 0; i < MAX_OPERANDS; ++i)
9798 {
9799 op_out[i][0] = 0;
9800 op_index[i] = -1;
9801 }
252b5132
RH
9802
9803 the_info = info;
9804 start_pc = pc;
e396998b
AM
9805 start_codep = priv.the_buffer;
9806 codep = priv.the_buffer;
252b5132 9807
8df14d78 9808 if (OPCODES_SIGSETJMP (priv.bailout) != 0)
5076851f 9809 {
7d421014
ILT
9810 const char *name;
9811
5076851f 9812 /* Getting here means we tried for data but didn't get it. That
e396998b
AM
9813 means we have an incomplete instruction of some sort. Just
9814 print the first byte as a prefix or a .byte pseudo-op. */
9815 if (codep > priv.the_buffer)
5076851f 9816 {
e396998b 9817 name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
7d421014
ILT
9818 if (name != NULL)
9819 (*info->fprintf_func) (info->stream, "%s", name);
9820 else
5076851f 9821 {
7d421014
ILT
9822 /* Just print the first byte as a .byte instruction. */
9823 (*info->fprintf_func) (info->stream, ".byte 0x%x",
e396998b 9824 (unsigned int) priv.the_buffer[0]);
5076851f 9825 }
5076851f 9826
7d421014 9827 return 1;
5076851f
ILT
9828 }
9829
9830 return -1;
9831 }
9832
52b15da3 9833 obufp = obuf;
f16cd0d5
L
9834 sizeflag = priv.orig_sizeflag;
9835
9836 if (!ckprefix () || rex_used)
9837 {
9838 /* Too many prefixes or unused REX prefixes. */
9839 for (i = 0;
f6dd4781 9840 i < (int) ARRAY_SIZE (all_prefixes) && all_prefixes[i];
f16cd0d5 9841 i++)
de882298 9842 (*info->fprintf_func) (info->stream, "%s%s",
6c067bbb 9843 i == 0 ? "" : " ",
f16cd0d5 9844 prefix_name (all_prefixes[i], sizeflag));
de882298 9845 return i;
f16cd0d5 9846 }
252b5132
RH
9847
9848 insn_codep = codep;
9849
9850 FETCH_DATA (info, codep + 1);
9851 two_source_ops = (*codep == 0x62) || (*codep == 0xc8);
9852
3e7d61b2 9853 if (((prefixes & PREFIX_FWAIT)
f16cd0d5 9854 && ((*codep < 0xd8) || (*codep > 0xdf))))
252b5132 9855 {
86a80a50 9856 /* Handle prefixes before fwait. */
d9949a36 9857 for (i = 0; i < fwait_prefix && all_prefixes[i];
86a80a50
L
9858 i++)
9859 (*info->fprintf_func) (info->stream, "%s ",
9860 prefix_name (all_prefixes[i], sizeflag));
f16cd0d5 9861 (*info->fprintf_func) (info->stream, "fwait");
86a80a50 9862 return i + 1;
252b5132
RH
9863 }
9864
252b5132
RH
9865 if (*codep == 0x0f)
9866 {
eec0f4ca 9867 unsigned char threebyte;
5f40e14d
JS
9868
9869 codep++;
9870 FETCH_DATA (info, codep + 1);
9871 threebyte = *codep;
eec0f4ca 9872 dp = &dis386_twobyte[threebyte];
252b5132 9873 need_modrm = twobyte_has_modrm[*codep];
eec0f4ca 9874 codep++;
252b5132
RH
9875 }
9876 else
9877 {
6439fc28 9878 dp = &dis386[*codep];
252b5132 9879 need_modrm = onebyte_has_modrm[*codep];
eec0f4ca 9880 codep++;
252b5132 9881 }
246c51aa 9882
df18fdba
L
9883 /* Save sizeflag for printing the extra prefixes later before updating
9884 it for mnemonic and operand processing. The prefix names depend
9885 only on the address mode. */
9886 orig_sizeflag = sizeflag;
c608c12e 9887 if (prefixes & PREFIX_ADDR)
df18fdba 9888 sizeflag ^= AFLAG;
b844680a 9889 if ((prefixes & PREFIX_DATA))
df18fdba 9890 sizeflag ^= DFLAG;
3ffd33cf 9891
285ca992 9892 end_codep = codep;
8bb15339 9893 if (need_modrm)
252b5132
RH
9894 {
9895 FETCH_DATA (info, codep + 1);
7967e09e
L
9896 modrm.mod = (*codep >> 6) & 3;
9897 modrm.reg = (*codep >> 3) & 7;
9898 modrm.rm = *codep & 7;
252b5132
RH
9899 }
9900
42d5f9c6 9901 need_vex = 0;
caf0678c 9902 memset (&vex, 0, sizeof (vex));
55b126d4 9903
ce518a5f 9904 if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
252b5132 9905 {
55cf16e1 9906 get_sib (info, sizeflag);
252b5132
RH
9907 dofloat (sizeflag);
9908 }
9909 else
9910 {
8bb15339 9911 dp = get_valid_dis386 (dp, info);
b844680a 9912 if (dp != NULL && putop (dp->name, sizeflag) == 0)
6c067bbb 9913 {
55cf16e1 9914 get_sib (info, sizeflag);
ce518a5f
L
9915 for (i = 0; i < MAX_OPERANDS; ++i)
9916 {
246c51aa 9917 obufp = op_out[i];
ce518a5f
L
9918 op_ad = MAX_OPERANDS - 1 - i;
9919 if (dp->op[i].rtn)
9920 (*dp->op[i].rtn) (dp->op[i].bytemode, sizeflag);
43234a1e
L
9921 /* For EVEX instruction after the last operand masking
9922 should be printed. */
9923 if (i == 0 && vex.evex)
9924 {
9925 /* Don't print {%k0}. */
9926 if (vex.mask_register_specifier)
9927 {
9928 oappend ("{");
9929 oappend (names_mask[vex.mask_register_specifier]);
9930 oappend ("}");
9931 }
9932 if (vex.zeroing)
9933 oappend ("{z}");
9934 }
ce518a5f 9935 }
6439fc28 9936 }
252b5132
RH
9937 }
9938
1d67fe3b
TT
9939 /* Clear instruction information. */
9940 if (the_info)
9941 {
9942 the_info->insn_info_valid = 0;
9943 the_info->branch_delay_insns = 0;
9944 the_info->data_size = 0;
9945 the_info->insn_type = dis_noninsn;
9946 the_info->target = 0;
9947 the_info->target2 = 0;
9948 }
9949
9950 /* Reset jump operation indicator. */
9951 op_is_jump = FALSE;
9952
9953 {
9954 int jump_detection = 0;
9955
9956 /* Extract flags. */
9957 for (i = 0; i < MAX_OPERANDS; ++i)
9958 {
9959 if ((dp->op[i].rtn == OP_J)
9960 || (dp->op[i].rtn == OP_indirE))
9961 jump_detection |= 1;
9962 else if ((dp->op[i].rtn == BND_Fixup)
9963 || (!dp->op[i].rtn && !dp->op[i].bytemode))
9964 jump_detection |= 2;
9965 else if ((dp->op[i].bytemode == cond_jump_mode)
9966 || (dp->op[i].bytemode == loop_jcxz_mode))
9967 jump_detection |= 4;
9968 }
9969
9970 /* Determine if this is a jump or branch. */
9971 if ((jump_detection & 0x3) == 0x3)
9972 {
9973 op_is_jump = TRUE;
9974 if (jump_detection & 0x4)
9975 the_info->insn_type = dis_condbranch;
9976 else
9977 the_info->insn_type =
9978 (dp->name && !strncmp(dp->name, "call", 4))
9979 ? dis_jsr : dis_branch;
9980 }
9981 }
9982
63c6fc6c
L
9983 /* If VEX.vvvv and EVEX.vvvv are unused, they must be all 1s, which
9984 are all 0s in inverted form. */
9985 if (need_vex && vex.register_specifier != 0)
9986 {
9987 (*info->fprintf_func) (info->stream, "(bad)");
9988 return end_codep - priv.the_buffer;
9989 }
9990
7531c613
JB
9991 switch (dp->prefix_requirement)
9992 {
9993 case PREFIX_DATA:
9994 /* If only the data prefix is marked as mandatory, its absence renders
9995 the encoding invalid. Most other PREFIX_OPCODE rules still apply. */
9996 if (need_vex ? !vex.prefix : !(prefixes & PREFIX_DATA))
9997 {
9998 (*info->fprintf_func) (info->stream, "(bad)");
9999 return end_codep - priv.the_buffer;
10000 }
10001 used_prefixes |= PREFIX_DATA;
10002 /* Fall through. */
10003 case PREFIX_OPCODE:
10004 /* If the mandatory PREFIX_REPZ/PREFIX_REPNZ/PREFIX_DATA prefix is
10005 unused, opcode is invalid. Since the PREFIX_DATA prefix may be
10006 used by putop and MMX/SSE operand and may be overridden by the
10007 PREFIX_REPZ/PREFIX_REPNZ fix, we check the PREFIX_DATA prefix
10008 separately. */
10009 if (((need_vex
10010 ? vex.prefix == REPE_PREFIX_OPCODE
10011 || vex.prefix == REPNE_PREFIX_OPCODE
10012 : (prefixes
10013 & (PREFIX_REPZ | PREFIX_REPNZ)) != 0)
10014 && (used_prefixes
10015 & (PREFIX_REPZ | PREFIX_REPNZ)) == 0)
10016 || (((need_vex
10017 ? vex.prefix == DATA_PREFIX_OPCODE
10018 : ((prefixes
10019 & (PREFIX_REPZ | PREFIX_REPNZ | PREFIX_DATA))
10020 == PREFIX_DATA))
10021 && (used_prefixes & PREFIX_DATA) == 0))
10022 || (vex.evex && dp->prefix_requirement != PREFIX_DATA
10023 && !vex.w != !(used_prefixes & PREFIX_DATA)))
10024 {
10025 (*info->fprintf_func) (info->stream, "(bad)");
10026 return end_codep - priv.the_buffer;
10027 }
10028 break;
10029 }
10030
d869730d 10031 /* Check if the REX prefix is used. */
73239888 10032 if ((rex ^ rex_used) == 0 && !need_vex && last_rex_prefix >= 0)
f16cd0d5
L
10033 all_prefixes[last_rex_prefix] = 0;
10034
5e6718e4 10035 /* Check if the SEG prefix is used. */
f16cd0d5
L
10036 if ((prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS | PREFIX_ES
10037 | PREFIX_FS | PREFIX_GS)) != 0
285ca992 10038 && (used_prefixes & active_seg_prefix) != 0)
f16cd0d5
L
10039 all_prefixes[last_seg_prefix] = 0;
10040
5e6718e4 10041 /* Check if the ADDR prefix is used. */
f16cd0d5
L
10042 if ((prefixes & PREFIX_ADDR) != 0
10043 && (used_prefixes & PREFIX_ADDR) != 0)
10044 all_prefixes[last_addr_prefix] = 0;
10045
df18fdba
L
10046 /* Check if the DATA prefix is used. */
10047 if ((prefixes & PREFIX_DATA) != 0
73239888
JB
10048 && (used_prefixes & PREFIX_DATA) != 0
10049 && !need_vex)
df18fdba 10050 all_prefixes[last_data_prefix] = 0;
f16cd0d5 10051
df18fdba 10052 /* Print the extra prefixes. */
f16cd0d5 10053 prefix_length = 0;
f310f33d 10054 for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
f16cd0d5
L
10055 if (all_prefixes[i])
10056 {
10057 const char *name;
df18fdba 10058 name = prefix_name (all_prefixes[i], orig_sizeflag);
f16cd0d5
L
10059 if (name == NULL)
10060 abort ();
10061 prefix_length += strlen (name) + 1;
10062 (*info->fprintf_func) (info->stream, "%s ", name);
10063 }
b844680a 10064
f16cd0d5
L
10065 /* Check maximum code length. */
10066 if ((codep - start_codep) > MAX_CODE_LENGTH)
10067 {
10068 (*info->fprintf_func) (info->stream, "(bad)");
10069 return MAX_CODE_LENGTH;
10070 }
b844680a 10071
ea397f5b 10072 obufp = mnemonicendp;
f16cd0d5 10073 for (i = strlen (obuf) + prefix_length; i < 6; i++)
252b5132
RH
10074 oappend (" ");
10075 oappend (" ");
10076 (*info->fprintf_func) (info->stream, "%s", obuf);
10077
10078 /* The enter and bound instructions are printed with operands in the same
10079 order as the intel book; everything else is printed in reverse order. */
2da11e11 10080 if (intel_syntax || two_source_ops)
252b5132 10081 {
185b1163
L
10082 bfd_vma riprel;
10083
ce518a5f 10084 for (i = 0; i < MAX_OPERANDS; ++i)
6c067bbb 10085 op_txt[i] = op_out[i];
246c51aa 10086
3a8547d2
JB
10087 if (intel_syntax && dp && dp->op[2].rtn == OP_Rounding
10088 && dp->op[3].rtn == OP_E && dp->op[4].rtn == NULL)
10089 {
10090 op_txt[2] = op_out[3];
10091 op_txt[3] = op_out[2];
10092 }
10093
ce518a5f
L
10094 for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
10095 {
6c067bbb
RM
10096 op_ad = op_index[i];
10097 op_index[i] = op_index[MAX_OPERANDS - 1 - i];
10098 op_index[MAX_OPERANDS - 1 - i] = op_ad;
185b1163
L
10099 riprel = op_riprel[i];
10100 op_riprel[i] = op_riprel [MAX_OPERANDS - 1 - i];
10101 op_riprel[MAX_OPERANDS - 1 - i] = riprel;
ce518a5f 10102 }
252b5132
RH
10103 }
10104 else
10105 {
ce518a5f 10106 for (i = 0; i < MAX_OPERANDS; ++i)
6c067bbb 10107 op_txt[MAX_OPERANDS - 1 - i] = op_out[i];
050dfa73
MM
10108 }
10109
ce518a5f
L
10110 needcomma = 0;
10111 for (i = 0; i < MAX_OPERANDS; ++i)
10112 if (*op_txt[i])
10113 {
10114 if (needcomma)
10115 (*info->fprintf_func) (info->stream, ",");
10116 if (op_index[i] != -1 && !op_riprel[i])
1d67fe3b
TT
10117 {
10118 bfd_vma target = (bfd_vma) op_address[op_index[i]];
10119
10120 if (the_info && op_is_jump)
10121 {
10122 the_info->insn_info_valid = 1;
10123 the_info->branch_delay_insns = 0;
10124 the_info->data_size = 0;
10125 the_info->target = target;
10126 the_info->target2 = 0;
10127 }
10128 (*info->print_address_func) (target, info);
10129 }
ce518a5f
L
10130 else
10131 (*info->fprintf_func) (info->stream, "%s", op_txt[i]);
10132 needcomma = 1;
10133 }
050dfa73 10134
ce518a5f 10135 for (i = 0; i < MAX_OPERANDS; i++)
52b15da3
JH
10136 if (op_index[i] != -1 && op_riprel[i])
10137 {
10138 (*info->fprintf_func) (info->stream, " # ");
4fd7268a 10139 (*info->print_address_func) ((bfd_vma) (start_pc + (codep - start_codep)
52b15da3 10140 + op_address[op_index[i]]), info);
185b1163 10141 break;
52b15da3 10142 }
e396998b 10143 return codep - priv.the_buffer;
252b5132
RH
10144}
10145
6439fc28 10146static const char *float_mem[] = {
252b5132 10147 /* d8 */
7c52e0e8
L
10148 "fadd{s|}",
10149 "fmul{s|}",
10150 "fcom{s|}",
10151 "fcomp{s|}",
10152 "fsub{s|}",
10153 "fsubr{s|}",
10154 "fdiv{s|}",
10155 "fdivr{s|}",
db6eb5be 10156 /* d9 */
7c52e0e8 10157 "fld{s|}",
252b5132 10158 "(bad)",
7c52e0e8
L
10159 "fst{s|}",
10160 "fstp{s|}",
d1c36125 10161 "fldenv{C|C}",
252b5132 10162 "fldcw",
d1c36125 10163 "fNstenv{C|C}",
252b5132
RH
10164 "fNstcw",
10165 /* da */
7c52e0e8
L
10166 "fiadd{l|}",
10167 "fimul{l|}",
10168 "ficom{l|}",
10169 "ficomp{l|}",
10170 "fisub{l|}",
10171 "fisubr{l|}",
10172 "fidiv{l|}",
10173 "fidivr{l|}",
252b5132 10174 /* db */
7c52e0e8
L
10175 "fild{l|}",
10176 "fisttp{l|}",
10177 "fist{l|}",
10178 "fistp{l|}",
252b5132 10179 "(bad)",
464dc4af 10180 "fld{t|}",
252b5132 10181 "(bad)",
464dc4af 10182 "fstp{t|}",
252b5132 10183 /* dc */
7c52e0e8
L
10184 "fadd{l|}",
10185 "fmul{l|}",
10186 "fcom{l|}",
10187 "fcomp{l|}",
10188 "fsub{l|}",
10189 "fsubr{l|}",
10190 "fdiv{l|}",
10191 "fdivr{l|}",
252b5132 10192 /* dd */
7c52e0e8
L
10193 "fld{l|}",
10194 "fisttp{ll|}",
10195 "fst{l||}",
10196 "fstp{l|}",
d1c36125 10197 "frstor{C|C}",
252b5132 10198 "(bad)",
d1c36125 10199 "fNsave{C|C}",
252b5132
RH
10200 "fNstsw",
10201 /* de */
ac465521
JB
10202 "fiadd{s|}",
10203 "fimul{s|}",
10204 "ficom{s|}",
10205 "ficomp{s|}",
10206 "fisub{s|}",
10207 "fisubr{s|}",
10208 "fidiv{s|}",
10209 "fidivr{s|}",
252b5132 10210 /* df */
ac465521
JB
10211 "fild{s|}",
10212 "fisttp{s|}",
10213 "fist{s|}",
10214 "fistp{s|}",
252b5132 10215 "fbld",
7c52e0e8 10216 "fild{ll|}",
252b5132 10217 "fbstp",
7c52e0e8 10218 "fistp{ll|}",
1d9f512f
AM
10219};
10220
10221static const unsigned char float_mem_mode[] = {
10222 /* d8 */
10223 d_mode,
10224 d_mode,
10225 d_mode,
10226 d_mode,
10227 d_mode,
10228 d_mode,
10229 d_mode,
10230 d_mode,
10231 /* d9 */
10232 d_mode,
10233 0,
10234 d_mode,
10235 d_mode,
10236 0,
10237 w_mode,
10238 0,
10239 w_mode,
10240 /* da */
10241 d_mode,
10242 d_mode,
10243 d_mode,
10244 d_mode,
10245 d_mode,
10246 d_mode,
10247 d_mode,
10248 d_mode,
10249 /* db */
10250 d_mode,
10251 d_mode,
10252 d_mode,
10253 d_mode,
10254 0,
9306ca4a 10255 t_mode,
1d9f512f 10256 0,
9306ca4a 10257 t_mode,
1d9f512f
AM
10258 /* dc */
10259 q_mode,
10260 q_mode,
10261 q_mode,
10262 q_mode,
10263 q_mode,
10264 q_mode,
10265 q_mode,
10266 q_mode,
10267 /* dd */
10268 q_mode,
10269 q_mode,
10270 q_mode,
10271 q_mode,
10272 0,
10273 0,
10274 0,
10275 w_mode,
10276 /* de */
10277 w_mode,
10278 w_mode,
10279 w_mode,
10280 w_mode,
10281 w_mode,
10282 w_mode,
10283 w_mode,
10284 w_mode,
10285 /* df */
10286 w_mode,
10287 w_mode,
10288 w_mode,
10289 w_mode,
9306ca4a 10290 t_mode,
1d9f512f 10291 q_mode,
9306ca4a 10292 t_mode,
1d9f512f 10293 q_mode
252b5132
RH
10294};
10295
ce518a5f
L
10296#define ST { OP_ST, 0 }
10297#define STi { OP_STi, 0 }
252b5132 10298
48c97fa1
L
10299#define FGRPd9_2 NULL, { { NULL, 1 } }, 0
10300#define FGRPd9_4 NULL, { { NULL, 2 } }, 0
10301#define FGRPd9_5 NULL, { { NULL, 3 } }, 0
10302#define FGRPd9_6 NULL, { { NULL, 4 } }, 0
10303#define FGRPd9_7 NULL, { { NULL, 5 } }, 0
10304#define FGRPda_5 NULL, { { NULL, 6 } }, 0
10305#define FGRPdb_4 NULL, { { NULL, 7 } }, 0
10306#define FGRPde_3 NULL, { { NULL, 8 } }, 0
10307#define FGRPdf_4 NULL, { { NULL, 9 } }, 0
252b5132 10308
2da11e11 10309static const struct dis386 float_reg[][8] = {
252b5132
RH
10310 /* d8 */
10311 {
bf890a93
IT
10312 { "fadd", { ST, STi }, 0 },
10313 { "fmul", { ST, STi }, 0 },
10314 { "fcom", { STi }, 0 },
10315 { "fcomp", { STi }, 0 },
10316 { "fsub", { ST, STi }, 0 },
10317 { "fsubr", { ST, STi }, 0 },
10318 { "fdiv", { ST, STi }, 0 },
10319 { "fdivr", { ST, STi }, 0 },
252b5132
RH
10320 },
10321 /* d9 */
10322 {
bf890a93
IT
10323 { "fld", { STi }, 0 },
10324 { "fxch", { STi }, 0 },
252b5132 10325 { FGRPd9_2 },
592d1631 10326 { Bad_Opcode },
252b5132
RH
10327 { FGRPd9_4 },
10328 { FGRPd9_5 },
10329 { FGRPd9_6 },
10330 { FGRPd9_7 },
10331 },
10332 /* da */
10333 {
bf890a93
IT
10334 { "fcmovb", { ST, STi }, 0 },
10335 { "fcmove", { ST, STi }, 0 },
10336 { "fcmovbe",{ ST, STi }, 0 },
10337 { "fcmovu", { ST, STi }, 0 },
592d1631 10338 { Bad_Opcode },
252b5132 10339 { FGRPda_5 },
592d1631
L
10340 { Bad_Opcode },
10341 { Bad_Opcode },
252b5132
RH
10342 },
10343 /* db */
10344 {
bf890a93
IT
10345 { "fcmovnb",{ ST, STi }, 0 },
10346 { "fcmovne",{ ST, STi }, 0 },
10347 { "fcmovnbe",{ ST, STi }, 0 },
10348 { "fcmovnu",{ ST, STi }, 0 },
252b5132 10349 { FGRPdb_4 },
bf890a93
IT
10350 { "fucomi", { ST, STi }, 0 },
10351 { "fcomi", { ST, STi }, 0 },
592d1631 10352 { Bad_Opcode },
252b5132
RH
10353 },
10354 /* dc */
10355 {
bf890a93
IT
10356 { "fadd", { STi, ST }, 0 },
10357 { "fmul", { STi, ST }, 0 },
592d1631
L
10358 { Bad_Opcode },
10359 { Bad_Opcode },
d53e6b98
JB
10360 { "fsub{!M|r}", { STi, ST }, 0 },
10361 { "fsub{M|}", { STi, ST }, 0 },
10362 { "fdiv{!M|r}", { STi, ST }, 0 },
10363 { "fdiv{M|}", { STi, ST }, 0 },
252b5132
RH
10364 },
10365 /* dd */
10366 {
bf890a93 10367 { "ffree", { STi }, 0 },
592d1631 10368 { Bad_Opcode },
bf890a93
IT
10369 { "fst", { STi }, 0 },
10370 { "fstp", { STi }, 0 },
10371 { "fucom", { STi }, 0 },
10372 { "fucomp", { STi }, 0 },
592d1631
L
10373 { Bad_Opcode },
10374 { Bad_Opcode },
252b5132
RH
10375 },
10376 /* de */
10377 {
bf890a93
IT
10378 { "faddp", { STi, ST }, 0 },
10379 { "fmulp", { STi, ST }, 0 },
592d1631 10380 { Bad_Opcode },
252b5132 10381 { FGRPde_3 },
d53e6b98
JB
10382 { "fsub{!M|r}p", { STi, ST }, 0 },
10383 { "fsub{M|}p", { STi, ST }, 0 },
10384 { "fdiv{!M|r}p", { STi, ST }, 0 },
10385 { "fdiv{M|}p", { STi, ST }, 0 },
252b5132
RH
10386 },
10387 /* df */
10388 {
bf890a93 10389 { "ffreep", { STi }, 0 },
592d1631
L
10390 { Bad_Opcode },
10391 { Bad_Opcode },
10392 { Bad_Opcode },
252b5132 10393 { FGRPdf_4 },
bf890a93
IT
10394 { "fucomip", { ST, STi }, 0 },
10395 { "fcomip", { ST, STi }, 0 },
592d1631 10396 { Bad_Opcode },
252b5132
RH
10397 },
10398};
10399
252b5132 10400static char *fgrps[][8] = {
48c97fa1
L
10401 /* Bad opcode 0 */
10402 {
10403 "(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10404 },
10405
10406 /* d9_2 1 */
252b5132
RH
10407 {
10408 "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10409 },
10410
48c97fa1 10411 /* d9_4 2 */
252b5132
RH
10412 {
10413 "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
10414 },
10415
48c97fa1 10416 /* d9_5 3 */
252b5132
RH
10417 {
10418 "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
10419 },
10420
48c97fa1 10421 /* d9_6 4 */
252b5132
RH
10422 {
10423 "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
10424 },
10425
48c97fa1 10426 /* d9_7 5 */
252b5132
RH
10427 {
10428 "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
10429 },
10430
48c97fa1 10431 /* da_5 6 */
252b5132
RH
10432 {
10433 "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10434 },
10435
48c97fa1 10436 /* db_4 7 */
252b5132 10437 {
309d3373
JB
10438 "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
10439 "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
252b5132
RH
10440 },
10441
48c97fa1 10442 /* de_3 8 */
252b5132
RH
10443 {
10444 "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10445 },
10446
48c97fa1 10447 /* df_4 9 */
252b5132
RH
10448 {
10449 "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10450 },
10451};
10452
b6169b20
L
10453static void
10454swap_operand (void)
10455{
10456 mnemonicendp[0] = '.';
10457 mnemonicendp[1] = 's';
10458 mnemonicendp += 2;
10459}
10460
b844680a
L
10461static void
10462OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED,
10463 int sizeflag ATTRIBUTE_UNUSED)
10464{
10465 /* Skip mod/rm byte. */
10466 MODRM_CHECK;
10467 codep++;
10468}
10469
252b5132 10470static void
26ca5450 10471dofloat (int sizeflag)
252b5132 10472{
2da11e11 10473 const struct dis386 *dp;
252b5132
RH
10474 unsigned char floatop;
10475
10476 floatop = codep[-1];
10477
7967e09e 10478 if (modrm.mod != 3)
252b5132 10479 {
7967e09e 10480 int fp_indx = (floatop - 0xd8) * 8 + modrm.reg;
1d9f512f
AM
10481
10482 putop (float_mem[fp_indx], sizeflag);
ce518a5f 10483 obufp = op_out[0];
6e50d963 10484 op_ad = 2;
1d9f512f 10485 OP_E (float_mem_mode[fp_indx], sizeflag);
252b5132
RH
10486 return;
10487 }
6608db57 10488 /* Skip mod/rm byte. */
4bba6815 10489 MODRM_CHECK;
252b5132
RH
10490 codep++;
10491
7967e09e 10492 dp = &float_reg[floatop - 0xd8][modrm.reg];
252b5132
RH
10493 if (dp->name == NULL)
10494 {
7967e09e 10495 putop (fgrps[dp->op[0].bytemode][modrm.rm], sizeflag);
252b5132 10496
6608db57 10497 /* Instruction fnstsw is only one with strange arg. */
252b5132 10498 if (floatop == 0xdf && codep[-1] == 0xe0)
ce518a5f 10499 strcpy (op_out[0], names16[0]);
252b5132
RH
10500 }
10501 else
10502 {
10503 putop (dp->name, sizeflag);
10504
ce518a5f 10505 obufp = op_out[0];
6e50d963 10506 op_ad = 2;
ce518a5f
L
10507 if (dp->op[0].rtn)
10508 (*dp->op[0].rtn) (dp->op[0].bytemode, sizeflag);
6e50d963 10509
ce518a5f 10510 obufp = op_out[1];
6e50d963 10511 op_ad = 1;
ce518a5f
L
10512 if (dp->op[1].rtn)
10513 (*dp->op[1].rtn) (dp->op[1].bytemode, sizeflag);
252b5132
RH
10514 }
10515}
10516
9ce09ba2
RM
10517/* Like oappend (below), but S is a string starting with '%'.
10518 In Intel syntax, the '%' is elided. */
10519static void
10520oappend_maybe_intel (const char *s)
10521{
10522 oappend (s + intel_syntax);
10523}
10524
252b5132 10525static void
26ca5450 10526OP_ST (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 10527{
9ce09ba2 10528 oappend_maybe_intel ("%st");
252b5132
RH
10529}
10530
252b5132 10531static void
26ca5450 10532OP_STi (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 10533{
7967e09e 10534 sprintf (scratchbuf, "%%st(%d)", modrm.rm);
9ce09ba2 10535 oappend_maybe_intel (scratchbuf);
252b5132
RH
10536}
10537
6608db57 10538/* Capital letters in template are macros. */
6439fc28 10539static int
d3ce72d0 10540putop (const char *in_template, int sizeflag)
252b5132 10541{
2da11e11 10542 const char *p;
9306ca4a 10543 int alt = 0;
9d141669 10544 int cond = 1;
21a3faeb 10545 unsigned int l = 0, len = 0;
98b528ac
L
10546 char last[4];
10547
d3ce72d0 10548 for (p = in_template; *p; p++)
252b5132 10549 {
21a3faeb
JB
10550 if (len > l)
10551 {
10552 if (l >= sizeof (last) || !ISUPPER (*p))
10553 abort ();
10554 last[l++] = *p;
10555 continue;
10556 }
252b5132
RH
10557 switch (*p)
10558 {
10559 default:
10560 *obufp++ = *p;
10561 break;
98b528ac
L
10562 case '%':
10563 len++;
10564 break;
9d141669
L
10565 case '!':
10566 cond = 0;
10567 break;
6439fc28 10568 case '{':
6439fc28 10569 if (intel_syntax)
6439fc28
AM
10570 {
10571 while (*++p != '|')
7c52e0e8
L
10572 if (*p == '}' || *p == '\0')
10573 abort ();
d1c36125 10574 alt = 1;
6439fc28 10575 }
d1c36125 10576 break;
6439fc28
AM
10577 case '|':
10578 while (*++p != '}')
10579 {
10580 if (*p == '\0')
10581 abort ();
10582 }
10583 break;
10584 case '}':
d1c36125 10585 alt = 0;
6439fc28 10586 break;
252b5132 10587 case 'A':
db6eb5be
AM
10588 if (intel_syntax)
10589 break;
7967e09e 10590 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
252b5132
RH
10591 *obufp++ = 'b';
10592 break;
10593 case 'B':
21a3faeb 10594 if (l == 0)
4b06377f 10595 {
dc1e8a47 10596 case_B:
4b06377f
L
10597 if (intel_syntax)
10598 break;
10599 if (sizeflag & SUFFIX_ALWAYS)
10600 *obufp++ = 'b';
10601 }
21a3faeb 10602 else if (l == 1 && last[0] == 'L')
4b06377f 10603 {
4b06377f
L
10604 if (address_mode == mode_64bit
10605 && !(prefixes & PREFIX_ADDR))
10606 {
10607 *obufp++ = 'a';
10608 *obufp++ = 'b';
10609 *obufp++ = 's';
10610 }
10611
10612 goto case_B;
10613 }
21a3faeb
JB
10614 else
10615 abort ();
252b5132 10616 break;
9306ca4a
JB
10617 case 'C':
10618 if (intel_syntax && !alt)
10619 break;
10620 if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
10621 {
10622 if (sizeflag & DFLAG)
10623 *obufp++ = intel_syntax ? 'd' : 'l';
10624 else
10625 *obufp++ = intel_syntax ? 'w' : 's';
10626 used_prefixes |= (prefixes & PREFIX_DATA);
10627 }
10628 break;
ed7841b3
JB
10629 case 'D':
10630 if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
10631 break;
161a04f6 10632 USED_REX (REX_W);
7967e09e 10633 if (modrm.mod == 3)
ed7841b3 10634 {
161a04f6 10635 if (rex & REX_W)
ed7841b3 10636 *obufp++ = 'q';
ed7841b3 10637 else
f16cd0d5
L
10638 {
10639 if (sizeflag & DFLAG)
10640 *obufp++ = intel_syntax ? 'd' : 'l';
10641 else
10642 *obufp++ = 'w';
10643 used_prefixes |= (prefixes & PREFIX_DATA);
10644 }
ed7841b3
JB
10645 }
10646 else
10647 *obufp++ = 'w';
10648 break;
252b5132 10649 case 'E': /* For jcxz/jecxz */
cb712a9e 10650 if (address_mode == mode_64bit)
c1a64871
JH
10651 {
10652 if (sizeflag & AFLAG)
10653 *obufp++ = 'r';
10654 else
10655 *obufp++ = 'e';
10656 }
10657 else
10658 if (sizeflag & AFLAG)
10659 *obufp++ = 'e';
3ffd33cf
AM
10660 used_prefixes |= (prefixes & PREFIX_ADDR);
10661 break;
10662 case 'F':
db6eb5be
AM
10663 if (intel_syntax)
10664 break;
e396998b 10665 if ((prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
3ffd33cf
AM
10666 {
10667 if (sizeflag & AFLAG)
cb712a9e 10668 *obufp++ = address_mode == mode_64bit ? 'q' : 'l';
3ffd33cf 10669 else
cb712a9e 10670 *obufp++ = address_mode == mode_64bit ? 'l' : 'w';
3ffd33cf
AM
10671 used_prefixes |= (prefixes & PREFIX_ADDR);
10672 }
252b5132 10673 break;
52fd6d94
JB
10674 case 'G':
10675 if (intel_syntax || (obufp[-1] != 's' && !(sizeflag & SUFFIX_ALWAYS)))
10676 break;
161a04f6 10677 if ((rex & REX_W) || (sizeflag & DFLAG))
52fd6d94
JB
10678 *obufp++ = 'l';
10679 else
10680 *obufp++ = 'w';
161a04f6 10681 if (!(rex & REX_W))
52fd6d94
JB
10682 used_prefixes |= (prefixes & PREFIX_DATA);
10683 break;
5dd0794d 10684 case 'H':
db6eb5be
AM
10685 if (intel_syntax)
10686 break;
5dd0794d
AM
10687 if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
10688 || (prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
10689 {
10690 used_prefixes |= prefixes & (PREFIX_CS | PREFIX_DS);
10691 *obufp++ = ',';
10692 *obufp++ = 'p';
10693 if (prefixes & PREFIX_DS)
10694 *obufp++ = 't';
10695 else
10696 *obufp++ = 'n';
10697 }
10698 break;
42903f7f
L
10699 case 'K':
10700 USED_REX (REX_W);
10701 if (rex & REX_W)
10702 *obufp++ = 'q';
10703 else
10704 *obufp++ = 'd';
10705 break;
252b5132 10706 case 'L':
78467458 10707 abort ();
9d141669
L
10708 case 'M':
10709 if (intel_mnemonic != cond)
10710 *obufp++ = 'r';
10711 break;
252b5132
RH
10712 case 'N':
10713 if ((prefixes & PREFIX_FWAIT) == 0)
10714 *obufp++ = 'n';
7d421014
ILT
10715 else
10716 used_prefixes |= PREFIX_FWAIT;
252b5132 10717 break;
52b15da3 10718 case 'O':
161a04f6
L
10719 USED_REX (REX_W);
10720 if (rex & REX_W)
6439fc28 10721 *obufp++ = 'o';
a35ca55a
JB
10722 else if (intel_syntax && (sizeflag & DFLAG))
10723 *obufp++ = 'q';
52b15da3
JH
10724 else
10725 *obufp++ = 'd';
161a04f6 10726 if (!(rex & REX_W))
a35ca55a 10727 used_prefixes |= (prefixes & PREFIX_DATA);
52b15da3 10728 break;
36938cab
JB
10729 case '@':
10730 if (address_mode == mode_64bit
10731 && (isa64 == intel64 || (rex & REX_W)
10732 || !(prefixes & PREFIX_DATA)))
6439fc28 10733 {
36938cab
JB
10734 if (sizeflag & SUFFIX_ALWAYS)
10735 *obufp++ = 'q';
6439fc28
AM
10736 break;
10737 }
6608db57 10738 /* Fall through. */
252b5132 10739 case 'P':
21a3faeb 10740 if (l == 0)
d9e3625e 10741 {
c3f5525f
JB
10742 if (((need_modrm && modrm.mod == 3) || !cond)
10743 && !(sizeflag & SUFFIX_ALWAYS))
36938cab
JB
10744 break;
10745 /* Fall through. */
10746 case 'T':
10747 if ((!(rex & REX_W) && (prefixes & PREFIX_DATA))
10748 || ((sizeflag & SUFFIX_ALWAYS)
10749 && address_mode != mode_64bit))
4b4c407a 10750 {
36938cab
JB
10751 *obufp++ = (sizeflag & DFLAG) ?
10752 intel_syntax ? 'd' : 'l' : 'w';
10753 used_prefixes |= (prefixes & PREFIX_DATA);
d9e3625e 10754 }
36938cab
JB
10755 else if (sizeflag & SUFFIX_ALWAYS)
10756 *obufp++ = 'q';
d9e3625e 10757 }
21a3faeb 10758 else if (l == 1 && last[0] == 'L')
252b5132 10759 {
4b4c407a
L
10760 if ((prefixes & PREFIX_DATA)
10761 || (rex & REX_W)
10762 || (sizeflag & SUFFIX_ALWAYS))
52b15da3 10763 {
4b4c407a
L
10764 USED_REX (REX_W);
10765 if (rex & REX_W)
10766 *obufp++ = 'q';
10767 else
10768 {
10769 if (sizeflag & DFLAG)
10770 *obufp++ = intel_syntax ? 'd' : 'l';
10771 else
10772 *obufp++ = 'w';
10773 used_prefixes |= (prefixes & PREFIX_DATA);
10774 }
52b15da3 10775 }
252b5132 10776 }
21a3faeb
JB
10777 else
10778 abort ();
252b5132
RH
10779 break;
10780 case 'Q':
21a3faeb 10781 if (l == 0)
252b5132 10782 {
98b528ac
L
10783 if (intel_syntax && !alt)
10784 break;
10785 USED_REX (REX_W);
10786 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
52b15da3 10787 {
98b528ac
L
10788 if (rex & REX_W)
10789 *obufp++ = 'q';
52b15da3 10790 else
98b528ac
L
10791 {
10792 if (sizeflag & DFLAG)
10793 *obufp++ = intel_syntax ? 'd' : 'l';
10794 else
10795 *obufp++ = 'w';
f16cd0d5 10796 used_prefixes |= (prefixes & PREFIX_DATA);
98b528ac 10797 }
52b15da3 10798 }
98b528ac 10799 }
492a76aa
JB
10800 else if (l == 1 && last[0] == 'D')
10801 *obufp++ = vex.w ? 'q' : 'd';
21a3faeb 10802 else if (l == 1 && last[0] == 'L')
98b528ac 10803 {
b24d668c
JB
10804 if (cond ? modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)
10805 : address_mode != mode_64bit)
98b528ac
L
10806 break;
10807 if ((rex & REX_W))
10808 {
10809 USED_REX (REX_W);
10810 *obufp++ = 'q';
10811 }
b24d668c 10812 else if((address_mode == mode_64bit && need_modrm && cond)
589958d6
JB
10813 || (sizeflag & SUFFIX_ALWAYS))
10814 *obufp++ = intel_syntax? 'd' : 'l';
252b5132 10815 }
21a3faeb
JB
10816 else
10817 abort ();
252b5132
RH
10818 break;
10819 case 'R':
161a04f6
L
10820 USED_REX (REX_W);
10821 if (rex & REX_W)
a35ca55a
JB
10822 *obufp++ = 'q';
10823 else if (sizeflag & DFLAG)
c608c12e 10824 {
a35ca55a 10825 if (intel_syntax)
c608c12e 10826 *obufp++ = 'd';
c608c12e 10827 else
a35ca55a 10828 *obufp++ = 'l';
c608c12e 10829 }
252b5132 10830 else
a35ca55a
JB
10831 *obufp++ = 'w';
10832 if (intel_syntax && !p[1]
161a04f6 10833 && ((rex & REX_W) || (sizeflag & DFLAG)))
a35ca55a 10834 *obufp++ = 'e';
161a04f6 10835 if (!(rex & REX_W))
52b15da3 10836 used_prefixes |= (prefixes & PREFIX_DATA);
252b5132
RH
10837 break;
10838 case 'S':
21a3faeb 10839 if (l == 0)
252b5132 10840 {
dc1e8a47 10841 case_S:
4b06377f
L
10842 if (intel_syntax)
10843 break;
10844 if (sizeflag & SUFFIX_ALWAYS)
52b15da3 10845 {
4b06377f
L
10846 if (rex & REX_W)
10847 *obufp++ = 'q';
52b15da3 10848 else
4b06377f
L
10849 {
10850 if (sizeflag & DFLAG)
10851 *obufp++ = 'l';
10852 else
10853 *obufp++ = 'w';
10854 used_prefixes |= (prefixes & PREFIX_DATA);
10855 }
10856 }
10857 }
21a3faeb 10858 else if (l == 1 && last[0] == 'L')
4b06377f 10859 {
4b06377f
L
10860 if (address_mode == mode_64bit
10861 && !(prefixes & PREFIX_ADDR))
10862 {
10863 *obufp++ = 'a';
10864 *obufp++ = 'b';
10865 *obufp++ = 's';
10866 }
10867
10868 goto case_S;
252b5132 10869 }
21a3faeb
JB
10870 else
10871 abort ();
252b5132 10872 break;
f0e8d0ba
JB
10873 case 'V':
10874 if (l == 0)
10875 abort ();
10876 else if (l == 1 && last[0] == 'L')
10877 {
10878 if (rex & REX_W)
10879 {
10880 *obufp++ = 'a';
10881 *obufp++ = 'b';
10882 *obufp++ = 's';
10883 }
10884 }
10885 else
10886 abort ();
10887 goto case_S;
10888 case 'W':
10889 if (l == 0)
10890 {
10891 /* operand size flag for cwtl, cbtw */
10892 USED_REX (REX_W);
10893 if (rex & REX_W)
10894 {
10895 if (intel_syntax)
10896 *obufp++ = 'd';
10897 else
10898 *obufp++ = 'l';
10899 }
10900 else if (sizeflag & DFLAG)
10901 *obufp++ = 'w';
10902 else
10903 *obufp++ = 'b';
10904 if (!(rex & REX_W))
10905 used_prefixes |= (prefixes & PREFIX_DATA);
10906 }
10907 else if (l == 1)
10908 {
10909 if (!need_vex)
10910 abort ();
10911 if (last[0] == 'X')
10912 *obufp++ = vex.w ? 'd': 's';
10913 else if (last[0] == 'B')
10914 *obufp++ = vex.w ? 'w': 'b';
10915 else
10916 abort ();
10917 }
10918 else
10919 abort ();
10920 break;
041bd2e0 10921 case 'X':
21a3faeb
JB
10922 if (l != 0)
10923 abort ();
bf926894
JB
10924 if (need_vex
10925 ? vex.prefix == DATA_PREFIX_OPCODE
10926 : prefixes & PREFIX_DATA)
c0f3af97 10927 {
bf926894
JB
10928 *obufp++ = 'd';
10929 used_prefixes |= PREFIX_DATA;
c0f3af97 10930 }
041bd2e0 10931 else
bf926894 10932 *obufp++ = 's';
041bd2e0 10933 break;
76f227a5 10934 case 'Y':
21a3faeb 10935 if (l == 1 && last[0] == 'X')
c0f3af97 10936 {
c0f3af97
L
10937 if (!need_vex)
10938 abort ();
10939 if (intel_syntax
04d824a4 10940 || ((modrm.mod == 3 || vex.b) && !(sizeflag & SUFFIX_ALWAYS)))
c0f3af97
L
10941 break;
10942 switch (vex.length)
10943 {
10944 case 128:
10945 *obufp++ = 'x';
10946 break;
10947 case 256:
10948 *obufp++ = 'y';
10949 break;
04d824a4
JB
10950 case 512:
10951 if (!vex.evex)
c0f3af97 10952 default:
04d824a4 10953 abort ();
c0f3af97 10954 }
76f227a5 10955 }
21a3faeb
JB
10956 else
10957 abort ();
76f227a5 10958 break;
78467458
JB
10959 case 'Z':
10960 if (l == 0)
10961 {
10962 /* These insns ignore ModR/M.mod: Force it to 3 for OP_E(). */
10963 modrm.mod = 3;
10964 if (!intel_syntax && (sizeflag & SUFFIX_ALWAYS))
10965 *obufp++ = address_mode == mode_64bit ? 'q' : 'l';
10966 }
10967 else if (l == 1 && last[0] == 'X')
10968 {
10969 if (!need_vex || !vex.evex)
10970 abort ();
10971 if (intel_syntax
10972 || ((modrm.mod == 3 || vex.b) && !(sizeflag & SUFFIX_ALWAYS)))
10973 break;
10974 switch (vex.length)
10975 {
10976 case 128:
10977 *obufp++ = 'x';
10978 break;
10979 case 256:
10980 *obufp++ = 'y';
10981 break;
10982 case 512:
10983 *obufp++ = 'z';
10984 break;
10985 default:
10986 abort ();
10987 }
10988 }
10989 else
10990 abort ();
10991 break;
a72d2af2
L
10992 case '^':
10993 if (intel_syntax)
10994 break;
5990e377
JB
10995 if (isa64 == intel64 && (rex & REX_W))
10996 {
10997 USED_REX (REX_W);
10998 *obufp++ = 'q';
10999 break;
11000 }
a72d2af2
L
11001 if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
11002 {
11003 if (sizeflag & DFLAG)
11004 *obufp++ = 'l';
11005 else
11006 *obufp++ = 'w';
11007 used_prefixes |= (prefixes & PREFIX_DATA);
11008 }
11009 break;
252b5132 11010 }
21a3faeb
JB
11011
11012 if (len == l)
11013 len = l = 0;
252b5132
RH
11014 }
11015 *obufp = 0;
ea397f5b 11016 mnemonicendp = obufp;
6439fc28 11017 return 0;
252b5132
RH
11018}
11019
11020static void
26ca5450 11021oappend (const char *s)
252b5132 11022{
ea397f5b 11023 obufp = stpcpy (obufp, s);
252b5132
RH
11024}
11025
11026static void
26ca5450 11027append_seg (void)
252b5132 11028{
285ca992
L
11029 /* Only print the active segment register. */
11030 if (!active_seg_prefix)
11031 return;
11032
11033 used_prefixes |= active_seg_prefix;
11034 switch (active_seg_prefix)
7d421014 11035 {
285ca992 11036 case PREFIX_CS:
9ce09ba2 11037 oappend_maybe_intel ("%cs:");
285ca992
L
11038 break;
11039 case PREFIX_DS:
9ce09ba2 11040 oappend_maybe_intel ("%ds:");
285ca992
L
11041 break;
11042 case PREFIX_SS:
9ce09ba2 11043 oappend_maybe_intel ("%ss:");
285ca992
L
11044 break;
11045 case PREFIX_ES:
9ce09ba2 11046 oappend_maybe_intel ("%es:");
285ca992
L
11047 break;
11048 case PREFIX_FS:
9ce09ba2 11049 oappend_maybe_intel ("%fs:");
285ca992
L
11050 break;
11051 case PREFIX_GS:
9ce09ba2 11052 oappend_maybe_intel ("%gs:");
285ca992
L
11053 break;
11054 default:
11055 break;
7d421014 11056 }
252b5132
RH
11057}
11058
11059static void
26ca5450 11060OP_indirE (int bytemode, int sizeflag)
252b5132
RH
11061{
11062 if (!intel_syntax)
11063 oappend ("*");
11064 OP_E (bytemode, sizeflag);
11065}
11066
52b15da3 11067static void
26ca5450 11068print_operand_value (char *buf, int hex, bfd_vma disp)
52b15da3 11069{
cb712a9e 11070 if (address_mode == mode_64bit)
52b15da3
JH
11071 {
11072 if (hex)
11073 {
11074 char tmp[30];
11075 int i;
11076 buf[0] = '0';
11077 buf[1] = 'x';
11078 sprintf_vma (tmp, disp);
6608db57 11079 for (i = 0; tmp[i] == '0' && tmp[i + 1]; i++);
52b15da3
JH
11080 strcpy (buf + 2, tmp + i);
11081 }
11082 else
11083 {
11084 bfd_signed_vma v = disp;
11085 char tmp[30];
11086 int i;
11087 if (v < 0)
11088 {
11089 *(buf++) = '-';
11090 v = -disp;
6608db57 11091 /* Check for possible overflow on 0x8000000000000000. */
52b15da3
JH
11092 if (v < 0)
11093 {
11094 strcpy (buf, "9223372036854775808");
11095 return;
11096 }
11097 }
11098 if (!v)
11099 {
11100 strcpy (buf, "0");
11101 return;
11102 }
11103
11104 i = 0;
11105 tmp[29] = 0;
11106 while (v)
11107 {
6608db57 11108 tmp[28 - i] = (v % 10) + '0';
52b15da3
JH
11109 v /= 10;
11110 i++;
11111 }
11112 strcpy (buf, tmp + 29 - i);
11113 }
11114 }
11115 else
11116 {
11117 if (hex)
11118 sprintf (buf, "0x%x", (unsigned int) disp);
11119 else
11120 sprintf (buf, "%d", (int) disp);
11121 }
11122}
11123
5d669648
L
11124/* Put DISP in BUF as signed hex number. */
11125
11126static void
11127print_displacement (char *buf, bfd_vma disp)
11128{
11129 bfd_signed_vma val = disp;
11130 char tmp[30];
11131 int i, j = 0;
11132
11133 if (val < 0)
11134 {
11135 buf[j++] = '-';
11136 val = -disp;
11137
11138 /* Check for possible overflow. */
11139 if (val < 0)
11140 {
11141 switch (address_mode)
11142 {
11143 case mode_64bit:
11144 strcpy (buf + j, "0x8000000000000000");
11145 break;
11146 case mode_32bit:
11147 strcpy (buf + j, "0x80000000");
11148 break;
11149 case mode_16bit:
11150 strcpy (buf + j, "0x8000");
11151 break;
11152 }
11153 return;
11154 }
11155 }
11156
11157 buf[j++] = '0';
11158 buf[j++] = 'x';
11159
0af1713e 11160 sprintf_vma (tmp, (bfd_vma) val);
5d669648
L
11161 for (i = 0; tmp[i] == '0'; i++)
11162 continue;
11163 if (tmp[i] == '\0')
11164 i--;
11165 strcpy (buf + j, tmp + i);
11166}
11167
3f31e633
JB
11168static void
11169intel_operand_size (int bytemode, int sizeflag)
11170{
43234a1e
L
11171 if (vex.evex
11172 && vex.b
11173 && (bytemode == x_mode
11174 || bytemode == evex_half_bcst_xmmq_mode))
11175 {
11176 if (vex.w)
11177 oappend ("QWORD PTR ");
11178 else
11179 oappend ("DWORD PTR ");
11180 return;
11181 }
3f31e633
JB
11182 switch (bytemode)
11183 {
11184 case b_mode:
b6169b20 11185 case b_swap_mode:
42903f7f 11186 case dqb_mode:
1ba585e8 11187 case db_mode:
3f31e633
JB
11188 oappend ("BYTE PTR ");
11189 break;
11190 case w_mode:
1ba585e8 11191 case dw_mode:
3f31e633
JB
11192 case dqw_mode:
11193 oappend ("WORD PTR ");
11194 break;
07f5af7d
L
11195 case indir_v_mode:
11196 if (address_mode == mode_64bit && isa64 == intel64)
11197 {
11198 oappend ("QWORD PTR ");
11199 break;
11200 }
1a0670f3 11201 /* Fall through. */
1a114b12 11202 case stack_v_mode:
7bb15c6f 11203 if (address_mode == mode_64bit && ((sizeflag & DFLAG) || (rex & REX_W)))
3f31e633
JB
11204 {
11205 oappend ("QWORD PTR ");
3f31e633
JB
11206 break;
11207 }
1a0670f3 11208 /* Fall through. */
3f31e633 11209 case v_mode:
b6169b20 11210 case v_swap_mode:
3f31e633 11211 case dq_mode:
161a04f6
L
11212 USED_REX (REX_W);
11213 if (rex & REX_W)
3f31e633 11214 oappend ("QWORD PTR ");
035e7389
JB
11215 else if (bytemode == dq_mode)
11216 oappend ("DWORD PTR ");
3f31e633 11217 else
f16cd0d5 11218 {
035e7389 11219 if (sizeflag & DFLAG)
f16cd0d5
L
11220 oappend ("DWORD PTR ");
11221 else
11222 oappend ("WORD PTR ");
11223 used_prefixes |= (prefixes & PREFIX_DATA);
11224 }
3f31e633 11225 break;
52fd6d94 11226 case z_mode:
161a04f6 11227 if ((rex & REX_W) || (sizeflag & DFLAG))
52fd6d94
JB
11228 *obufp++ = 'D';
11229 oappend ("WORD PTR ");
161a04f6 11230 if (!(rex & REX_W))
52fd6d94
JB
11231 used_prefixes |= (prefixes & PREFIX_DATA);
11232 break;
34b772a6
JB
11233 case a_mode:
11234 if (sizeflag & DFLAG)
11235 oappend ("QWORD PTR ");
11236 else
11237 oappend ("DWORD PTR ");
11238 used_prefixes |= (prefixes & PREFIX_DATA);
11239 break;
bc31405e
L
11240 case movsxd_mode:
11241 if (!(sizeflag & DFLAG) && isa64 == intel64)
11242 oappend ("WORD PTR ");
11243 else
11244 oappend ("DWORD PTR ");
11245 used_prefixes |= (prefixes & PREFIX_DATA);
11246 break;
3f31e633 11247 case d_mode:
fa99fab2 11248 case d_swap_mode:
42903f7f 11249 case dqd_mode:
3f31e633
JB
11250 oappend ("DWORD PTR ");
11251 break;
11252 case q_mode:
b6169b20 11253 case q_swap_mode:
3f31e633
JB
11254 oappend ("QWORD PTR ");
11255 break;
11256 case m_mode:
cb712a9e 11257 if (address_mode == mode_64bit)
3f31e633
JB
11258 oappend ("QWORD PTR ");
11259 else
11260 oappend ("DWORD PTR ");
11261 break;
11262 case f_mode:
11263 if (sizeflag & DFLAG)
11264 oappend ("FWORD PTR ");
11265 else
11266 oappend ("DWORD PTR ");
11267 used_prefixes |= (prefixes & PREFIX_DATA);
11268 break;
11269 case t_mode:
11270 oappend ("TBYTE PTR ");
11271 break;
11272 case x_mode:
b6169b20 11273 case x_swap_mode:
43234a1e
L
11274 case evex_x_gscat_mode:
11275 case evex_x_nobcst_mode:
4726e9a4 11276 case bw_unit_mode:
c0f3af97
L
11277 if (need_vex)
11278 {
11279 switch (vex.length)
11280 {
11281 case 128:
11282 oappend ("XMMWORD PTR ");
11283 break;
11284 case 256:
11285 oappend ("YMMWORD PTR ");
11286 break;
43234a1e
L
11287 case 512:
11288 oappend ("ZMMWORD PTR ");
11289 break;
c0f3af97
L
11290 default:
11291 abort ();
11292 }
11293 }
11294 else
11295 oappend ("XMMWORD PTR ");
11296 break;
11297 case xmm_mode:
3f31e633
JB
11298 oappend ("XMMWORD PTR ");
11299 break;
43234a1e
L
11300 case ymm_mode:
11301 oappend ("YMMWORD PTR ");
11302 break;
c0f3af97 11303 case xmmq_mode:
43234a1e 11304 case evex_half_bcst_xmmq_mode:
c0f3af97
L
11305 if (!need_vex)
11306 abort ();
11307
11308 switch (vex.length)
11309 {
11310 case 128:
11311 oappend ("QWORD PTR ");
11312 break;
11313 case 256:
11314 oappend ("XMMWORD PTR ");
11315 break;
43234a1e
L
11316 case 512:
11317 oappend ("YMMWORD PTR ");
11318 break;
c0f3af97
L
11319 default:
11320 abort ();
11321 }
11322 break;
6c30d220
L
11323 case xmm_mb_mode:
11324 if (!need_vex)
11325 abort ();
11326
11327 switch (vex.length)
11328 {
11329 case 128:
11330 case 256:
43234a1e 11331 case 512:
6c30d220
L
11332 oappend ("BYTE PTR ");
11333 break;
11334 default:
11335 abort ();
11336 }
11337 break;
11338 case xmm_mw_mode:
11339 if (!need_vex)
11340 abort ();
11341
11342 switch (vex.length)
11343 {
11344 case 128:
11345 case 256:
43234a1e 11346 case 512:
6c30d220
L
11347 oappend ("WORD PTR ");
11348 break;
11349 default:
11350 abort ();
11351 }
11352 break;
11353 case xmm_md_mode:
11354 if (!need_vex)
11355 abort ();
11356
11357 switch (vex.length)
11358 {
11359 case 128:
11360 case 256:
43234a1e 11361 case 512:
6c30d220
L
11362 oappend ("DWORD PTR ");
11363 break;
11364 default:
11365 abort ();
11366 }
11367 break;
11368 case xmm_mq_mode:
11369 if (!need_vex)
11370 abort ();
11371
11372 switch (vex.length)
11373 {
11374 case 128:
11375 case 256:
43234a1e 11376 case 512:
6c30d220
L
11377 oappend ("QWORD PTR ");
11378 break;
11379 default:
11380 abort ();
11381 }
11382 break;
11383 case xmmdw_mode:
11384 if (!need_vex)
11385 abort ();
11386
11387 switch (vex.length)
11388 {
11389 case 128:
11390 oappend ("WORD PTR ");
11391 break;
11392 case 256:
11393 oappend ("DWORD PTR ");
11394 break;
43234a1e
L
11395 case 512:
11396 oappend ("QWORD PTR ");
11397 break;
6c30d220
L
11398 default:
11399 abort ();
11400 }
11401 break;
11402 case xmmqd_mode:
11403 if (!need_vex)
11404 abort ();
11405
11406 switch (vex.length)
11407 {
11408 case 128:
11409 oappend ("DWORD PTR ");
11410 break;
11411 case 256:
11412 oappend ("QWORD PTR ");
11413 break;
43234a1e
L
11414 case 512:
11415 oappend ("XMMWORD PTR ");
11416 break;
6c30d220
L
11417 default:
11418 abort ();
11419 }
11420 break;
c0f3af97
L
11421 case ymmq_mode:
11422 if (!need_vex)
11423 abort ();
11424
11425 switch (vex.length)
11426 {
11427 case 128:
11428 oappend ("QWORD PTR ");
11429 break;
11430 case 256:
11431 oappend ("YMMWORD PTR ");
11432 break;
43234a1e
L
11433 case 512:
11434 oappend ("ZMMWORD PTR ");
11435 break;
c0f3af97
L
11436 default:
11437 abort ();
11438 }
11439 break;
6c30d220
L
11440 case ymmxmm_mode:
11441 if (!need_vex)
11442 abort ();
11443
11444 switch (vex.length)
11445 {
11446 case 128:
11447 case 256:
11448 oappend ("XMMWORD PTR ");
11449 break;
11450 default:
11451 abort ();
11452 }
11453 break;
fb9c77c7
L
11454 case o_mode:
11455 oappend ("OWORD PTR ");
11456 break;
1c480963 11457 case vex_scalar_w_dq_mode:
0bfee649
L
11458 if (!need_vex)
11459 abort ();
11460
11461 if (vex.w)
11462 oappend ("QWORD PTR ");
11463 else
11464 oappend ("DWORD PTR ");
11465 break;
43234a1e
L
11466 case vex_vsib_d_w_dq_mode:
11467 case vex_vsib_q_w_dq_mode:
11468 if (!need_vex)
11469 abort ();
11470
11471 if (!vex.evex)
11472 {
11473 if (vex.w)
11474 oappend ("QWORD PTR ");
11475 else
11476 oappend ("DWORD PTR ");
11477 }
11478 else
11479 {
b28d1bda
IT
11480 switch (vex.length)
11481 {
11482 case 128:
11483 oappend ("XMMWORD PTR ");
11484 break;
11485 case 256:
11486 oappend ("YMMWORD PTR ");
11487 break;
11488 case 512:
11489 oappend ("ZMMWORD PTR ");
11490 break;
11491 default:
11492 abort ();
11493 }
43234a1e
L
11494 }
11495 break;
5fc35d96
IT
11496 case vex_vsib_q_w_d_mode:
11497 case vex_vsib_d_w_d_mode:
b28d1bda 11498 if (!need_vex || !vex.evex)
5fc35d96
IT
11499 abort ();
11500
b28d1bda
IT
11501 switch (vex.length)
11502 {
11503 case 128:
11504 oappend ("QWORD PTR ");
11505 break;
11506 case 256:
11507 oappend ("XMMWORD PTR ");
11508 break;
11509 case 512:
11510 oappend ("YMMWORD PTR ");
11511 break;
11512 default:
11513 abort ();
11514 }
5fc35d96
IT
11515
11516 break;
1ba585e8
IT
11517 case mask_bd_mode:
11518 if (!need_vex || vex.length != 128)
11519 abort ();
11520 if (vex.w)
11521 oappend ("DWORD PTR ");
11522 else
11523 oappend ("BYTE PTR ");
11524 break;
43234a1e
L
11525 case mask_mode:
11526 if (!need_vex)
11527 abort ();
1ba585e8
IT
11528 if (vex.w)
11529 oappend ("QWORD PTR ");
11530 else
11531 oappend ("WORD PTR ");
43234a1e 11532 break;
6c75cc62 11533 case v_bnd_mode:
d276ec69 11534 case v_bndmk_mode:
3f31e633
JB
11535 default:
11536 break;
11537 }
11538}
11539
252b5132 11540static void
c0f3af97 11541OP_E_register (int bytemode, int sizeflag)
252b5132 11542{
c0f3af97
L
11543 int reg = modrm.rm;
11544 const char **names;
252b5132 11545
c0f3af97
L
11546 USED_REX (REX_B);
11547 if ((rex & REX_B))
11548 reg += 8;
252b5132 11549
b6169b20 11550 if ((sizeflag & SUFFIX_ALWAYS)
1ba585e8 11551 && (bytemode == b_swap_mode
9f79e886 11552 || bytemode == bnd_swap_mode
60227d64 11553 || bytemode == v_swap_mode))
b6169b20
L
11554 swap_operand ();
11555
c0f3af97 11556 switch (bytemode)
252b5132 11557 {
c0f3af97 11558 case b_mode:
b6169b20 11559 case b_swap_mode:
e184e611
JB
11560 if (reg & 4)
11561 USED_REX (0);
c0f3af97
L
11562 if (rex)
11563 names = names8rex;
11564 else
11565 names = names8;
11566 break;
11567 case w_mode:
11568 names = names16;
11569 break;
11570 case d_mode:
1ba585e8
IT
11571 case dw_mode:
11572 case db_mode:
c0f3af97
L
11573 names = names32;
11574 break;
11575 case q_mode:
11576 names = names64;
11577 break;
11578 case m_mode:
6c75cc62 11579 case v_bnd_mode:
c0f3af97
L
11580 names = address_mode == mode_64bit ? names64 : names32;
11581 break;
7e8b059b 11582 case bnd_mode:
9f79e886 11583 case bnd_swap_mode:
0d96e4df
L
11584 if (reg > 0x3)
11585 {
11586 oappend ("(bad)");
11587 return;
11588 }
7e8b059b
L
11589 names = names_bnd;
11590 break;
07f5af7d
L
11591 case indir_v_mode:
11592 if (address_mode == mode_64bit && isa64 == intel64)
11593 {
11594 names = names64;
11595 break;
11596 }
1a0670f3 11597 /* Fall through. */
c0f3af97 11598 case stack_v_mode:
7bb15c6f 11599 if (address_mode == mode_64bit && ((sizeflag & DFLAG) || (rex & REX_W)))
252b5132 11600 {
c0f3af97 11601 names = names64;
252b5132 11602 break;
252b5132 11603 }
c0f3af97 11604 bytemode = v_mode;
1a0670f3 11605 /* Fall through. */
c0f3af97 11606 case v_mode:
b6169b20 11607 case v_swap_mode:
c0f3af97
L
11608 case dq_mode:
11609 case dqb_mode:
11610 case dqd_mode:
11611 case dqw_mode:
11612 USED_REX (REX_W);
11613 if (rex & REX_W)
11614 names = names64;
035e7389
JB
11615 else if (bytemode != v_mode && bytemode != v_swap_mode)
11616 names = names32;
c0f3af97 11617 else
f16cd0d5 11618 {
035e7389 11619 if (sizeflag & DFLAG)
f16cd0d5
L
11620 names = names32;
11621 else
11622 names = names16;
11623 used_prefixes |= (prefixes & PREFIX_DATA);
11624 }
c0f3af97 11625 break;
bc31405e
L
11626 case movsxd_mode:
11627 if (!(sizeflag & DFLAG) && isa64 == intel64)
11628 names = names16;
11629 else
11630 names = names32;
11631 used_prefixes |= (prefixes & PREFIX_DATA);
11632 break;
de89d0a3
IT
11633 case va_mode:
11634 names = (address_mode == mode_64bit
11635 ? names64 : names32);
11636 if (!(prefixes & PREFIX_ADDR))
aa178437
IT
11637 names = (address_mode == mode_16bit
11638 ? names16 : names);
de89d0a3
IT
11639 else
11640 {
11641 /* Remove "addr16/addr32". */
11642 all_prefixes[last_addr_prefix] = 0;
11643 names = (address_mode != mode_32bit
11644 ? names32 : names16);
11645 used_prefixes |= PREFIX_ADDR;
11646 }
11647 break;
1ba585e8 11648 case mask_bd_mode:
43234a1e 11649 case mask_mode:
9889cbb1
L
11650 if (reg > 0x7)
11651 {
11652 oappend ("(bad)");
11653 return;
11654 }
43234a1e
L
11655 names = names_mask;
11656 break;
c0f3af97
L
11657 case 0:
11658 return;
11659 default:
11660 oappend (INTERNAL_DISASSEMBLER_ERROR);
252b5132
RH
11661 return;
11662 }
c0f3af97
L
11663 oappend (names[reg]);
11664}
11665
11666static void
c1e679ec 11667OP_E_memory (int bytemode, int sizeflag)
c0f3af97
L
11668{
11669 bfd_vma disp = 0;
11670 int add = (rex & REX_B) ? 8 : 0;
11671 int riprel = 0;
43234a1e
L
11672 int shift;
11673
11674 if (vex.evex)
11675 {
11676 /* In EVEX, if operand doesn't allow broadcast, vex.b should be 0. */
11677 if (vex.b
11678 && bytemode != x_mode
90a915bf 11679 && bytemode != xmmq_mode
43234a1e
L
11680 && bytemode != evex_half_bcst_xmmq_mode)
11681 {
11682 BadOp ();
11683 return;
11684 }
11685 switch (bytemode)
11686 {
1ba585e8
IT
11687 case dqw_mode:
11688 case dw_mode:
059edf8b 11689 case xmm_mw_mode:
1ba585e8
IT
11690 shift = 1;
11691 break;
11692 case dqb_mode:
11693 case db_mode:
059edf8b 11694 case xmm_mb_mode:
1ba585e8
IT
11695 shift = 0;
11696 break;
b50c9f31
JB
11697 case dq_mode:
11698 if (address_mode != mode_64bit)
11699 {
059edf8b
JB
11700 case dqd_mode:
11701 case xmm_md_mode:
11702 case d_mode:
11703 case d_swap_mode:
b50c9f31
JB
11704 shift = 2;
11705 break;
11706 }
11707 /* fall through */
4102be5c 11708 case vex_scalar_w_dq_mode:
43234a1e 11709 case vex_vsib_d_w_dq_mode:
5fc35d96 11710 case vex_vsib_d_w_d_mode:
eaa9d1ad 11711 case vex_vsib_q_w_dq_mode:
5fc35d96 11712 case vex_vsib_q_w_d_mode:
43234a1e 11713 case evex_x_gscat_mode:
43234a1e
L
11714 shift = vex.w ? 3 : 2;
11715 break;
43234a1e
L
11716 case x_mode:
11717 case evex_half_bcst_xmmq_mode:
90a915bf 11718 case xmmq_mode:
43234a1e
L
11719 if (vex.b)
11720 {
11721 shift = vex.w ? 3 : 2;
11722 break;
11723 }
1a0670f3 11724 /* Fall through. */
43234a1e
L
11725 case xmmqd_mode:
11726 case xmmdw_mode:
43234a1e
L
11727 case ymmq_mode:
11728 case evex_x_nobcst_mode:
11729 case x_swap_mode:
11730 switch (vex.length)
11731 {
11732 case 128:
11733 shift = 4;
11734 break;
11735 case 256:
11736 shift = 5;
11737 break;
11738 case 512:
11739 shift = 6;
11740 break;
11741 default:
11742 abort ();
11743 }
059edf8b
JB
11744 /* Make necessary corrections to shift for modes that need it. */
11745 if (bytemode == xmmq_mode
11746 || bytemode == evex_half_bcst_xmmq_mode
11747 || (bytemode == ymmq_mode && vex.length == 128))
11748 shift -= 1;
11749 else if (bytemode == xmmqd_mode)
11750 shift -= 2;
11751 else if (bytemode == xmmdw_mode)
11752 shift -= 3;
43234a1e
L
11753 break;
11754 case ymm_mode:
11755 shift = 5;
11756 break;
11757 case xmm_mode:
11758 shift = 4;
11759 break;
11760 case xmm_mq_mode:
11761 case q_mode:
43234a1e 11762 case q_swap_mode:
43234a1e
L
11763 shift = 3;
11764 break;
4726e9a4
JB
11765 case bw_unit_mode:
11766 shift = vex.w ? 1 : 0;
11767 break;
43234a1e
L
11768 default:
11769 abort ();
11770 }
43234a1e
L
11771 }
11772 else
11773 shift = 0;
252b5132 11774
c0f3af97 11775 USED_REX (REX_B);
3f31e633
JB
11776 if (intel_syntax)
11777 intel_operand_size (bytemode, sizeflag);
252b5132
RH
11778 append_seg ();
11779
5d669648 11780 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
252b5132 11781 {
5d669648
L
11782 /* 32/64 bit address mode */
11783 int havedisp;
252b5132
RH
11784 int havesib;
11785 int havebase;
0f7da397 11786 int haveindex;
20afcfb7 11787 int needindex;
1bc60e56 11788 int needaddr32;
82c18208 11789 int base, rbase;
91d6fa6a 11790 int vindex = 0;
252b5132 11791 int scale = 0;
7e8b059b
L
11792 int addr32flag = !((sizeflag & AFLAG)
11793 || bytemode == v_bnd_mode
d276ec69 11794 || bytemode == v_bndmk_mode
9f79e886
JB
11795 || bytemode == bnd_mode
11796 || bytemode == bnd_swap_mode);
6c30d220
L
11797 const char **indexes64 = names64;
11798 const char **indexes32 = names32;
252b5132
RH
11799
11800 havesib = 0;
11801 havebase = 1;
0f7da397 11802 haveindex = 0;
7967e09e 11803 base = modrm.rm;
252b5132
RH
11804
11805 if (base == 4)
11806 {
11807 havesib = 1;
dfc8cf43 11808 vindex = sib.index;
161a04f6
L
11809 USED_REX (REX_X);
11810 if (rex & REX_X)
91d6fa6a 11811 vindex += 8;
6c30d220
L
11812 switch (bytemode)
11813 {
11814 case vex_vsib_d_w_dq_mode:
5fc35d96 11815 case vex_vsib_d_w_d_mode:
6c30d220 11816 case vex_vsib_q_w_dq_mode:
5fc35d96 11817 case vex_vsib_q_w_d_mode:
6c30d220
L
11818 if (!need_vex)
11819 abort ();
43234a1e
L
11820 if (vex.evex)
11821 {
11822 if (!vex.v)
11823 vindex += 16;
11824 }
6c30d220
L
11825
11826 haveindex = 1;
11827 switch (vex.length)
11828 {
11829 case 128:
7bb15c6f 11830 indexes64 = indexes32 = names_xmm;
6c30d220
L
11831 break;
11832 case 256:
5fc35d96
IT
11833 if (!vex.w
11834 || bytemode == vex_vsib_q_w_dq_mode
11835 || bytemode == vex_vsib_q_w_d_mode)
7bb15c6f 11836 indexes64 = indexes32 = names_ymm;
6c30d220 11837 else
7bb15c6f 11838 indexes64 = indexes32 = names_xmm;
6c30d220 11839 break;
43234a1e 11840 case 512:
5fc35d96
IT
11841 if (!vex.w
11842 || bytemode == vex_vsib_q_w_dq_mode
11843 || bytemode == vex_vsib_q_w_d_mode)
43234a1e
L
11844 indexes64 = indexes32 = names_zmm;
11845 else
11846 indexes64 = indexes32 = names_ymm;
11847 break;
6c30d220
L
11848 default:
11849 abort ();
11850 }
11851 break;
11852 default:
11853 haveindex = vindex != 4;
11854 break;
11855 }
11856 scale = sib.scale;
11857 base = sib.base;
252b5132
RH
11858 codep++;
11859 }
260cd341
LC
11860 else
11861 {
11862 /* mandatory non-vector SIB must have sib */
11863 if (bytemode == vex_sibmem_mode)
11864 {
11865 oappend ("(bad)");
11866 return;
11867 }
11868 }
82c18208 11869 rbase = base + add;
252b5132 11870
7967e09e 11871 switch (modrm.mod)
252b5132
RH
11872 {
11873 case 0:
82c18208 11874 if (base == 5)
252b5132
RH
11875 {
11876 havebase = 0;
cb712a9e 11877 if (address_mode == mode_64bit && !havesib)
52b15da3
JH
11878 riprel = 1;
11879 disp = get32s ();
d276ec69
JB
11880 if (riprel && bytemode == v_bndmk_mode)
11881 {
11882 oappend ("(bad)");
11883 return;
11884 }
252b5132
RH
11885 }
11886 break;
11887 case 1:
11888 FETCH_DATA (the_info, codep + 1);
11889 disp = *codep++;
11890 if ((disp & 0x80) != 0)
11891 disp -= 0x100;
43234a1e
L
11892 if (vex.evex && shift > 0)
11893 disp <<= shift;
252b5132
RH
11894 break;
11895 case 2:
52b15da3 11896 disp = get32s ();
252b5132
RH
11897 break;
11898 }
11899
1bc60e56
L
11900 needindex = 0;
11901 needaddr32 = 0;
11902 if (havesib
11903 && !havebase
11904 && !haveindex
11905 && address_mode != mode_16bit)
11906 {
11907 if (address_mode == mode_64bit)
11908 {
8e58ef80
L
11909 if (addr32flag)
11910 {
11911 /* Without base nor index registers, zero-extend the
11912 lower 32-bit displacement to 64 bits. */
11913 disp = (unsigned int) disp;
bf4ba07c 11914 needindex = 1;
8e58ef80 11915 }
1bc60e56
L
11916 needaddr32 = 1;
11917 }
11918 else
11919 {
11920 /* In 32-bit mode, we need index register to tell [offset]
11921 from [eiz*1 + offset]. */
11922 needindex = 1;
11923 }
11924 }
11925
20afcfb7
L
11926 havedisp = (havebase
11927 || needindex
11928 || (havesib && (haveindex || scale != 0)));
5d669648 11929
252b5132 11930 if (!intel_syntax)
82c18208 11931 if (modrm.mod != 0 || base == 5)
db6eb5be 11932 {
5d669648
L
11933 if (havedisp || riprel)
11934 print_displacement (scratchbuf, disp);
11935 else
11936 print_operand_value (scratchbuf, 1, disp);
db6eb5be 11937 oappend (scratchbuf);
52b15da3
JH
11938 if (riprel)
11939 {
11940 set_op (disp, 1);
28596323 11941 oappend (!addr32flag ? "(%rip)" : "(%eip)");
52b15da3 11942 }
db6eb5be 11943 }
2da11e11 11944
c1dc7af5 11945 if ((havebase || haveindex || needindex || needaddr32 || riprel)
a23b33b3
JB
11946 && (address_mode != mode_64bit
11947 || ((bytemode != v_bnd_mode)
11948 && (bytemode != v_bndmk_mode)
11949 && (bytemode != bnd_mode)
11950 && (bytemode != bnd_swap_mode))))
87767711
JB
11951 used_prefixes |= PREFIX_ADDR;
11952
5d669648 11953 if (havedisp || (intel_syntax && riprel))
252b5132 11954 {
252b5132 11955 *obufp++ = open_char;
52b15da3 11956 if (intel_syntax && riprel)
185b1163
L
11957 {
11958 set_op (disp, 1);
28596323 11959 oappend (!addr32flag ? "rip" : "eip");
185b1163 11960 }
db6eb5be 11961 *obufp = '\0';
252b5132 11962 if (havebase)
7e8b059b 11963 oappend (address_mode == mode_64bit && !addr32flag
82c18208 11964 ? names64[rbase] : names32[rbase]);
252b5132
RH
11965 if (havesib)
11966 {
db51cc60
L
11967 /* ESP/RSP won't allow index. If base isn't ESP/RSP,
11968 print index to tell base + index from base. */
11969 if (scale != 0
20afcfb7 11970 || needindex
db51cc60
L
11971 || haveindex
11972 || (havebase && base != ESP_REG_NUM))
252b5132 11973 {
9306ca4a 11974 if (!intel_syntax || havebase)
db6eb5be 11975 {
9306ca4a
JB
11976 *obufp++ = separator_char;
11977 *obufp = '\0';
db6eb5be 11978 }
db51cc60 11979 if (haveindex)
7e8b059b 11980 oappend (address_mode == mode_64bit && !addr32flag
6c30d220 11981 ? indexes64[vindex] : indexes32[vindex]);
db51cc60 11982 else
7e8b059b 11983 oappend (address_mode == mode_64bit && !addr32flag
db51cc60
L
11984 ? index64 : index32);
11985
db6eb5be
AM
11986 *obufp++ = scale_char;
11987 *obufp = '\0';
11988 sprintf (scratchbuf, "%d", 1 << scale);
11989 oappend (scratchbuf);
11990 }
252b5132 11991 }
185b1163 11992 if (intel_syntax
82c18208 11993 && (disp || modrm.mod != 0 || base == 5))
3d456fa1 11994 {
db51cc60 11995 if (!havedisp || (bfd_signed_vma) disp >= 0)
3d456fa1
JB
11996 {
11997 *obufp++ = '+';
11998 *obufp = '\0';
11999 }
05203043 12000 else if (modrm.mod != 1 && disp != -disp)
3d456fa1
JB
12001 {
12002 *obufp++ = '-';
12003 *obufp = '\0';
b4b39349 12004 disp = -disp;
3d456fa1
JB
12005 }
12006
db51cc60
L
12007 if (havedisp)
12008 print_displacement (scratchbuf, disp);
12009 else
12010 print_operand_value (scratchbuf, 1, disp);
3d456fa1
JB
12011 oappend (scratchbuf);
12012 }
252b5132
RH
12013
12014 *obufp++ = close_char;
db6eb5be 12015 *obufp = '\0';
252b5132
RH
12016 }
12017 else if (intel_syntax)
db6eb5be 12018 {
82c18208 12019 if (modrm.mod != 0 || base == 5)
db6eb5be 12020 {
285ca992 12021 if (!active_seg_prefix)
252b5132 12022 {
d708bcba 12023 oappend (names_seg[ds_reg - es_reg]);
252b5132
RH
12024 oappend (":");
12025 }
52b15da3 12026 print_operand_value (scratchbuf, 1, disp);
db6eb5be
AM
12027 oappend (scratchbuf);
12028 }
12029 }
252b5132 12030 }
a23b33b3
JB
12031 else if (bytemode == v_bnd_mode
12032 || bytemode == v_bndmk_mode
12033 || bytemode == bnd_mode
12034 || bytemode == bnd_swap_mode)
12035 {
12036 oappend ("(bad)");
12037 return;
12038 }
252b5132 12039 else
f16cd0d5
L
12040 {
12041 /* 16 bit address mode */
12042 used_prefixes |= prefixes & PREFIX_ADDR;
7967e09e 12043 switch (modrm.mod)
252b5132
RH
12044 {
12045 case 0:
7967e09e 12046 if (modrm.rm == 6)
252b5132
RH
12047 {
12048 disp = get16 ();
12049 if ((disp & 0x8000) != 0)
12050 disp -= 0x10000;
12051 }
12052 break;
12053 case 1:
12054 FETCH_DATA (the_info, codep + 1);
12055 disp = *codep++;
12056 if ((disp & 0x80) != 0)
12057 disp -= 0x100;
65f3ed04
JB
12058 if (vex.evex && shift > 0)
12059 disp <<= shift;
252b5132
RH
12060 break;
12061 case 2:
12062 disp = get16 ();
12063 if ((disp & 0x8000) != 0)
12064 disp -= 0x10000;
12065 break;
12066 }
12067
12068 if (!intel_syntax)
7967e09e 12069 if (modrm.mod != 0 || modrm.rm == 6)
db6eb5be 12070 {
5d669648 12071 print_displacement (scratchbuf, disp);
db6eb5be
AM
12072 oappend (scratchbuf);
12073 }
252b5132 12074
7967e09e 12075 if (modrm.mod != 0 || modrm.rm != 6)
252b5132
RH
12076 {
12077 *obufp++ = open_char;
db6eb5be 12078 *obufp = '\0';
7967e09e 12079 oappend (index16[modrm.rm]);
5d669648
L
12080 if (intel_syntax
12081 && (disp || modrm.mod != 0 || modrm.rm == 6))
3d456fa1 12082 {
5d669648 12083 if ((bfd_signed_vma) disp >= 0)
3d456fa1
JB
12084 {
12085 *obufp++ = '+';
12086 *obufp = '\0';
12087 }
7967e09e 12088 else if (modrm.mod != 1)
3d456fa1
JB
12089 {
12090 *obufp++ = '-';
12091 *obufp = '\0';
b4b39349 12092 disp = -disp;
3d456fa1
JB
12093 }
12094
5d669648 12095 print_displacement (scratchbuf, disp);
3d456fa1
JB
12096 oappend (scratchbuf);
12097 }
12098
db6eb5be
AM
12099 *obufp++ = close_char;
12100 *obufp = '\0';
252b5132 12101 }
3d456fa1
JB
12102 else if (intel_syntax)
12103 {
285ca992 12104 if (!active_seg_prefix)
3d456fa1
JB
12105 {
12106 oappend (names_seg[ds_reg - es_reg]);
12107 oappend (":");
12108 }
12109 print_operand_value (scratchbuf, 1, disp & 0xffff);
12110 oappend (scratchbuf);
12111 }
252b5132 12112 }
43234a1e
L
12113 if (vex.evex && vex.b
12114 && (bytemode == x_mode
90a915bf 12115 || bytemode == xmmq_mode
43234a1e
L
12116 || bytemode == evex_half_bcst_xmmq_mode))
12117 {
90a915bf
IT
12118 if (vex.w
12119 || bytemode == xmmq_mode
12120 || bytemode == evex_half_bcst_xmmq_mode)
b28d1bda
IT
12121 {
12122 switch (vex.length)
12123 {
12124 case 128:
12125 oappend ("{1to2}");
12126 break;
12127 case 256:
12128 oappend ("{1to4}");
12129 break;
12130 case 512:
12131 oappend ("{1to8}");
12132 break;
12133 default:
12134 abort ();
12135 }
12136 }
43234a1e 12137 else
b28d1bda
IT
12138 {
12139 switch (vex.length)
12140 {
12141 case 128:
12142 oappend ("{1to4}");
12143 break;
12144 case 256:
12145 oappend ("{1to8}");
12146 break;
12147 case 512:
12148 oappend ("{1to16}");
12149 break;
12150 default:
12151 abort ();
12152 }
12153 }
43234a1e 12154 }
252b5132
RH
12155}
12156
c0f3af97 12157static void
8b3f93e7 12158OP_E (int bytemode, int sizeflag)
c0f3af97
L
12159{
12160 /* Skip mod/rm byte. */
12161 MODRM_CHECK;
12162 codep++;
12163
12164 if (modrm.mod == 3)
12165 OP_E_register (bytemode, sizeflag);
12166 else
c1e679ec 12167 OP_E_memory (bytemode, sizeflag);
c0f3af97
L
12168}
12169
252b5132 12170static void
26ca5450 12171OP_G (int bytemode, int sizeflag)
252b5132 12172{
52b15da3 12173 int add = 0;
c0a30a9f 12174 const char **names;
161a04f6
L
12175 USED_REX (REX_R);
12176 if (rex & REX_R)
52b15da3 12177 add += 8;
252b5132
RH
12178 switch (bytemode)
12179 {
12180 case b_mode:
e184e611
JB
12181 if (modrm.reg & 4)
12182 USED_REX (0);
52b15da3 12183 if (rex)
7967e09e 12184 oappend (names8rex[modrm.reg + add]);
52b15da3 12185 else
7967e09e 12186 oappend (names8[modrm.reg + add]);
252b5132
RH
12187 break;
12188 case w_mode:
7967e09e 12189 oappend (names16[modrm.reg + add]);
252b5132
RH
12190 break;
12191 case d_mode:
1ba585e8
IT
12192 case db_mode:
12193 case dw_mode:
7967e09e 12194 oappend (names32[modrm.reg + add]);
52b15da3
JH
12195 break;
12196 case q_mode:
7967e09e 12197 oappend (names64[modrm.reg + add]);
252b5132 12198 break;
7e8b059b 12199 case bnd_mode:
0d96e4df
L
12200 if (modrm.reg > 0x3)
12201 {
12202 oappend ("(bad)");
12203 return;
12204 }
7e8b059b
L
12205 oappend (names_bnd[modrm.reg]);
12206 break;
252b5132 12207 case v_mode:
9306ca4a 12208 case dq_mode:
42903f7f
L
12209 case dqb_mode:
12210 case dqd_mode:
9306ca4a 12211 case dqw_mode:
bc31405e 12212 case movsxd_mode:
161a04f6
L
12213 USED_REX (REX_W);
12214 if (rex & REX_W)
7967e09e 12215 oappend (names64[modrm.reg + add]);
035e7389
JB
12216 else if (bytemode != v_mode && bytemode != movsxd_mode)
12217 oappend (names32[modrm.reg + add]);
252b5132 12218 else
f16cd0d5 12219 {
035e7389 12220 if (sizeflag & DFLAG)
f16cd0d5
L
12221 oappend (names32[modrm.reg + add]);
12222 else
12223 oappend (names16[modrm.reg + add]);
12224 used_prefixes |= (prefixes & PREFIX_DATA);
12225 }
252b5132 12226 break;
c0a30a9f
L
12227 case va_mode:
12228 names = (address_mode == mode_64bit
12229 ? names64 : names32);
12230 if (!(prefixes & PREFIX_ADDR))
12231 {
12232 if (address_mode == mode_16bit)
12233 names = names16;
12234 }
12235 else
12236 {
12237 /* Remove "addr16/addr32". */
12238 all_prefixes[last_addr_prefix] = 0;
12239 names = (address_mode != mode_32bit
12240 ? names32 : names16);
12241 used_prefixes |= PREFIX_ADDR;
12242 }
12243 oappend (names[modrm.reg + add]);
12244 break;
90700ea2 12245 case m_mode:
cb712a9e 12246 if (address_mode == mode_64bit)
7967e09e 12247 oappend (names64[modrm.reg + add]);
90700ea2 12248 else
7967e09e 12249 oappend (names32[modrm.reg + add]);
90700ea2 12250 break;
1ba585e8 12251 case mask_bd_mode:
43234a1e 12252 case mask_mode:
9889cbb1
L
12253 if ((modrm.reg + add) > 0x7)
12254 {
12255 oappend ("(bad)");
12256 return;
12257 }
43234a1e
L
12258 oappend (names_mask[modrm.reg + add]);
12259 break;
252b5132
RH
12260 default:
12261 oappend (INTERNAL_DISASSEMBLER_ERROR);
12262 break;
12263 }
12264}
12265
52b15da3 12266static bfd_vma
26ca5450 12267get64 (void)
52b15da3 12268{
5dd0794d 12269 bfd_vma x;
52b15da3 12270#ifdef BFD64
5dd0794d
AM
12271 unsigned int a;
12272 unsigned int b;
12273
52b15da3
JH
12274 FETCH_DATA (the_info, codep + 8);
12275 a = *codep++ & 0xff;
12276 a |= (*codep++ & 0xff) << 8;
12277 a |= (*codep++ & 0xff) << 16;
070fe95d 12278 a |= (*codep++ & 0xffu) << 24;
5dd0794d 12279 b = *codep++ & 0xff;
52b15da3
JH
12280 b |= (*codep++ & 0xff) << 8;
12281 b |= (*codep++ & 0xff) << 16;
070fe95d 12282 b |= (*codep++ & 0xffu) << 24;
52b15da3
JH
12283 x = a + ((bfd_vma) b << 32);
12284#else
6608db57 12285 abort ();
5dd0794d 12286 x = 0;
52b15da3
JH
12287#endif
12288 return x;
12289}
12290
12291static bfd_signed_vma
26ca5450 12292get32 (void)
252b5132 12293{
b4b39349 12294 bfd_vma x = 0;
252b5132
RH
12295
12296 FETCH_DATA (the_info, codep + 4);
b4b39349
AM
12297 x = *codep++ & (bfd_vma) 0xff;
12298 x |= (*codep++ & (bfd_vma) 0xff) << 8;
12299 x |= (*codep++ & (bfd_vma) 0xff) << 16;
12300 x |= (*codep++ & (bfd_vma) 0xff) << 24;
52b15da3
JH
12301 return x;
12302}
12303
12304static bfd_signed_vma
26ca5450 12305get32s (void)
52b15da3 12306{
b4b39349 12307 bfd_vma x = 0;
52b15da3
JH
12308
12309 FETCH_DATA (the_info, codep + 4);
b4b39349
AM
12310 x = *codep++ & (bfd_vma) 0xff;
12311 x |= (*codep++ & (bfd_vma) 0xff) << 8;
12312 x |= (*codep++ & (bfd_vma) 0xff) << 16;
12313 x |= (*codep++ & (bfd_vma) 0xff) << 24;
52b15da3 12314
b4b39349 12315 x = (x ^ ((bfd_vma) 1 << 31)) - ((bfd_vma) 1 << 31);
52b15da3 12316
252b5132
RH
12317 return x;
12318}
12319
12320static int
26ca5450 12321get16 (void)
252b5132
RH
12322{
12323 int x = 0;
12324
12325 FETCH_DATA (the_info, codep + 2);
12326 x = *codep++ & 0xff;
12327 x |= (*codep++ & 0xff) << 8;
12328 return x;
12329}
12330
12331static void
26ca5450 12332set_op (bfd_vma op, int riprel)
252b5132
RH
12333{
12334 op_index[op_ad] = op_ad;
cb712a9e 12335 if (address_mode == mode_64bit)
7081ff04
AJ
12336 {
12337 op_address[op_ad] = op;
12338 op_riprel[op_ad] = riprel;
12339 }
12340 else
12341 {
12342 /* Mask to get a 32-bit address. */
12343 op_address[op_ad] = op & 0xffffffff;
12344 op_riprel[op_ad] = riprel & 0xffffffff;
12345 }
252b5132
RH
12346}
12347
12348static void
26ca5450 12349OP_REG (int code, int sizeflag)
252b5132 12350{
2da11e11 12351 const char *s;
9b60702d 12352 int add;
de882298
RM
12353
12354 switch (code)
12355 {
12356 case es_reg: case ss_reg: case cs_reg:
12357 case ds_reg: case fs_reg: case gs_reg:
12358 oappend (names_seg[code - es_reg]);
12359 return;
12360 }
12361
161a04f6
L
12362 USED_REX (REX_B);
12363 if (rex & REX_B)
52b15da3 12364 add = 8;
9b60702d
L
12365 else
12366 add = 0;
52b15da3
JH
12367
12368 switch (code)
12369 {
52b15da3
JH
12370 case ax_reg: case cx_reg: case dx_reg: case bx_reg:
12371 case sp_reg: case bp_reg: case si_reg: case di_reg:
12372 s = names16[code - ax_reg + add];
12373 break;
e184e611 12374 case ah_reg: case ch_reg: case dh_reg: case bh_reg:
52b15da3 12375 USED_REX (0);
e184e611
JB
12376 /* Fall through. */
12377 case al_reg: case cl_reg: case dl_reg: case bl_reg:
52b15da3
JH
12378 if (rex)
12379 s = names8rex[code - al_reg + add];
12380 else
12381 s = names8[code - al_reg];
12382 break;
6439fc28
AM
12383 case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
12384 case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
7bb15c6f 12385 if (address_mode == mode_64bit
6c067bbb 12386 && ((sizeflag & DFLAG) || (rex & REX_W)))
6439fc28
AM
12387 {
12388 s = names64[code - rAX_reg + add];
12389 break;
12390 }
12391 code += eAX_reg - rAX_reg;
6608db57 12392 /* Fall through. */
52b15da3
JH
12393 case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
12394 case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
161a04f6
L
12395 USED_REX (REX_W);
12396 if (rex & REX_W)
52b15da3 12397 s = names64[code - eAX_reg + add];
52b15da3 12398 else
f16cd0d5
L
12399 {
12400 if (sizeflag & DFLAG)
12401 s = names32[code - eAX_reg + add];
12402 else
12403 s = names16[code - eAX_reg + add];
12404 used_prefixes |= (prefixes & PREFIX_DATA);
12405 }
52b15da3 12406 break;
52b15da3
JH
12407 default:
12408 s = INTERNAL_DISASSEMBLER_ERROR;
12409 break;
12410 }
12411 oappend (s);
12412}
12413
12414static void
26ca5450 12415OP_IMREG (int code, int sizeflag)
52b15da3
JH
12416{
12417 const char *s;
252b5132
RH
12418
12419 switch (code)
12420 {
12421 case indir_dx_reg:
d708bcba 12422 if (intel_syntax)
52fd6d94 12423 s = "dx";
d708bcba 12424 else
db6eb5be 12425 s = "(%dx)";
252b5132 12426 break;
e8b5d5f9
JB
12427 case al_reg: case cl_reg:
12428 s = names8[code - al_reg];
252b5132 12429 break;
e8b5d5f9 12430 case eAX_reg:
161a04f6
L
12431 USED_REX (REX_W);
12432 if (rex & REX_W)
f16cd0d5 12433 {
e8b5d5f9
JB
12434 s = *names64;
12435 break;
f16cd0d5 12436 }
e8b5d5f9 12437 /* Fall through. */
52fd6d94 12438 case z_mode_ax_reg:
161a04f6 12439 if ((rex & REX_W) || (sizeflag & DFLAG))
52fd6d94
JB
12440 s = *names32;
12441 else
12442 s = *names16;
161a04f6 12443 if (!(rex & REX_W))
52fd6d94
JB
12444 used_prefixes |= (prefixes & PREFIX_DATA);
12445 break;
252b5132
RH
12446 default:
12447 s = INTERNAL_DISASSEMBLER_ERROR;
12448 break;
12449 }
12450 oappend (s);
12451}
12452
12453static void
26ca5450 12454OP_I (int bytemode, int sizeflag)
252b5132 12455{
52b15da3
JH
12456 bfd_signed_vma op;
12457 bfd_signed_vma mask = -1;
252b5132
RH
12458
12459 switch (bytemode)
12460 {
12461 case b_mode:
12462 FETCH_DATA (the_info, codep + 1);
52b15da3
JH
12463 op = *codep++;
12464 mask = 0xff;
12465 break;
252b5132 12466 case v_mode:
161a04f6
L
12467 USED_REX (REX_W);
12468 if (rex & REX_W)
52b15da3 12469 op = get32s ();
252b5132 12470 else
52b15da3 12471 {
f16cd0d5
L
12472 if (sizeflag & DFLAG)
12473 {
12474 op = get32 ();
12475 mask = 0xffffffff;
12476 }
12477 else
12478 {
12479 op = get16 ();
12480 mask = 0xfffff;
12481 }
12482 used_prefixes |= (prefixes & PREFIX_DATA);
52b15da3 12483 }
252b5132 12484 break;
c1dc7af5
JB
12485 case d_mode:
12486 mask = 0xffffffff;
12487 op = get32 ();
12488 break;
252b5132 12489 case w_mode:
52b15da3 12490 mask = 0xfffff;
252b5132
RH
12491 op = get16 ();
12492 break;
9306ca4a
JB
12493 case const_1_mode:
12494 if (intel_syntax)
6c067bbb 12495 oappend ("1");
9306ca4a 12496 return;
252b5132
RH
12497 default:
12498 oappend (INTERNAL_DISASSEMBLER_ERROR);
12499 return;
12500 }
12501
52b15da3
JH
12502 op &= mask;
12503 scratchbuf[0] = '$';
d708bcba 12504 print_operand_value (scratchbuf + 1, 1, op);
9ce09ba2 12505 oappend_maybe_intel (scratchbuf);
52b15da3
JH
12506 scratchbuf[0] = '\0';
12507}
12508
12509static void
26ca5450 12510OP_I64 (int bytemode, int sizeflag)
52b15da3 12511{
a280ab8e 12512 if (bytemode != v_mode || address_mode != mode_64bit || !(rex & REX_W))
6439fc28
AM
12513 {
12514 OP_I (bytemode, sizeflag);
12515 return;
12516 }
12517
a280ab8e 12518 USED_REX (REX_W);
52b15da3 12519
52b15da3 12520 scratchbuf[0] = '$';
a280ab8e 12521 print_operand_value (scratchbuf + 1, 1, get64 ());
9ce09ba2 12522 oappend_maybe_intel (scratchbuf);
252b5132
RH
12523 scratchbuf[0] = '\0';
12524}
12525
12526static void
26ca5450 12527OP_sI (int bytemode, int sizeflag)
252b5132 12528{
52b15da3 12529 bfd_signed_vma op;
252b5132
RH
12530
12531 switch (bytemode)
12532 {
12533 case b_mode:
e3949f17 12534 case b_T_mode:
252b5132
RH
12535 FETCH_DATA (the_info, codep + 1);
12536 op = *codep++;
12537 if ((op & 0x80) != 0)
12538 op -= 0x100;
e3949f17
L
12539 if (bytemode == b_T_mode)
12540 {
12541 if (address_mode != mode_64bit
7bb15c6f 12542 || !((sizeflag & DFLAG) || (rex & REX_W)))
e3949f17 12543 {
6c067bbb
RM
12544 /* The operand-size prefix is overridden by a REX prefix. */
12545 if ((sizeflag & DFLAG) || (rex & REX_W))
e3949f17
L
12546 op &= 0xffffffff;
12547 else
12548 op &= 0xffff;
12549 }
12550 }
12551 else
12552 {
12553 if (!(rex & REX_W))
12554 {
12555 if (sizeflag & DFLAG)
12556 op &= 0xffffffff;
12557 else
12558 op &= 0xffff;
12559 }
12560 }
252b5132
RH
12561 break;
12562 case v_mode:
7bb15c6f
RM
12563 /* The operand-size prefix is overridden by a REX prefix. */
12564 if ((sizeflag & DFLAG) || (rex & REX_W))
52b15da3 12565 op = get32s ();
252b5132 12566 else
d9e3625e 12567 op = get16 ();
252b5132
RH
12568 break;
12569 default:
12570 oappend (INTERNAL_DISASSEMBLER_ERROR);
12571 return;
12572 }
52b15da3
JH
12573
12574 scratchbuf[0] = '$';
12575 print_operand_value (scratchbuf + 1, 1, op);
9ce09ba2 12576 oappend_maybe_intel (scratchbuf);
252b5132
RH
12577}
12578
12579static void
26ca5450 12580OP_J (int bytemode, int sizeflag)
252b5132 12581{
52b15da3 12582 bfd_vma disp;
7081ff04 12583 bfd_vma mask = -1;
65ca155d 12584 bfd_vma segment = 0;
252b5132
RH
12585
12586 switch (bytemode)
12587 {
12588 case b_mode:
12589 FETCH_DATA (the_info, codep + 1);
12590 disp = *codep++;
12591 if ((disp & 0x80) != 0)
12592 disp -= 0x100;
12593 break;
12594 case v_mode:
376cd056 12595 case dqw_mode:
5db04b09
L
12596 if ((sizeflag & DFLAG)
12597 || (address_mode == mode_64bit
d835a58b 12598 && ((isa64 == intel64 && bytemode != dqw_mode)
376cd056 12599 || (rex & REX_W))))
52b15da3 12600 disp = get32s ();
252b5132
RH
12601 else
12602 {
12603 disp = get16 ();
206717e8
L
12604 if ((disp & 0x8000) != 0)
12605 disp -= 0x10000;
65ca155d
L
12606 /* In 16bit mode, address is wrapped around at 64k within
12607 the same segment. Otherwise, a data16 prefix on a jump
12608 instruction means that the pc is masked to 16 bits after
12609 the displacement is added! */
12610 mask = 0xffff;
12611 if ((prefixes & PREFIX_DATA) == 0)
4fd7268a 12612 segment = ((start_pc + (codep - start_codep))
65ca155d 12613 & ~((bfd_vma) 0xffff));
252b5132 12614 }
5db04b09 12615 if (address_mode != mode_64bit
d835a58b 12616 || (isa64 != intel64 && !(rex & REX_W)))
f16cd0d5 12617 used_prefixes |= (prefixes & PREFIX_DATA);
252b5132
RH
12618 break;
12619 default:
12620 oappend (INTERNAL_DISASSEMBLER_ERROR);
12621 return;
12622 }
42d5f9c6 12623 disp = ((start_pc + (codep - start_codep) + disp) & mask) | segment;
52b15da3
JH
12624 set_op (disp, 0);
12625 print_operand_value (scratchbuf, 1, disp);
252b5132
RH
12626 oappend (scratchbuf);
12627}
12628
252b5132 12629static void
ed7841b3 12630OP_SEG (int bytemode, int sizeflag)
252b5132 12631{
ed7841b3 12632 if (bytemode == w_mode)
7967e09e 12633 oappend (names_seg[modrm.reg]);
ed7841b3 12634 else
7967e09e 12635 OP_E (modrm.mod == 3 ? bytemode : w_mode, sizeflag);
252b5132
RH
12636}
12637
12638static void
26ca5450 12639OP_DIR (int dummy ATTRIBUTE_UNUSED, int sizeflag)
252b5132
RH
12640{
12641 int seg, offset;
12642
c608c12e 12643 if (sizeflag & DFLAG)
252b5132 12644 {
c608c12e
AM
12645 offset = get32 ();
12646 seg = get16 ();
252b5132 12647 }
c608c12e
AM
12648 else
12649 {
12650 offset = get16 ();
12651 seg = get16 ();
12652 }
7d421014 12653 used_prefixes |= (prefixes & PREFIX_DATA);
d708bcba 12654 if (intel_syntax)
3f31e633 12655 sprintf (scratchbuf, "0x%x:0x%x", seg, offset);
d708bcba
AM
12656 else
12657 sprintf (scratchbuf, "$0x%x,$0x%x", seg, offset);
c608c12e 12658 oappend (scratchbuf);
252b5132
RH
12659}
12660
252b5132 12661static void
3f31e633 12662OP_OFF (int bytemode, int sizeflag)
252b5132 12663{
52b15da3 12664 bfd_vma off;
252b5132 12665
3f31e633
JB
12666 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
12667 intel_operand_size (bytemode, sizeflag);
252b5132
RH
12668 append_seg ();
12669
cb712a9e 12670 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
252b5132
RH
12671 off = get32 ();
12672 else
12673 off = get16 ();
12674
12675 if (intel_syntax)
12676 {
285ca992 12677 if (!active_seg_prefix)
252b5132 12678 {
d708bcba 12679 oappend (names_seg[ds_reg - es_reg]);
252b5132
RH
12680 oappend (":");
12681 }
12682 }
52b15da3
JH
12683 print_operand_value (scratchbuf, 1, off);
12684 oappend (scratchbuf);
12685}
6439fc28 12686
52b15da3 12687static void
3f31e633 12688OP_OFF64 (int bytemode, int sizeflag)
52b15da3
JH
12689{
12690 bfd_vma off;
12691
539e75ad
L
12692 if (address_mode != mode_64bit
12693 || (prefixes & PREFIX_ADDR))
6439fc28
AM
12694 {
12695 OP_OFF (bytemode, sizeflag);
12696 return;
12697 }
12698
3f31e633
JB
12699 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
12700 intel_operand_size (bytemode, sizeflag);
52b15da3
JH
12701 append_seg ();
12702
6608db57 12703 off = get64 ();
52b15da3
JH
12704
12705 if (intel_syntax)
12706 {
285ca992 12707 if (!active_seg_prefix)
52b15da3 12708 {
d708bcba 12709 oappend (names_seg[ds_reg - es_reg]);
52b15da3
JH
12710 oappend (":");
12711 }
12712 }
12713 print_operand_value (scratchbuf, 1, off);
252b5132
RH
12714 oappend (scratchbuf);
12715}
12716
12717static void
26ca5450 12718ptr_reg (int code, int sizeflag)
252b5132 12719{
2da11e11 12720 const char *s;
d708bcba 12721
1d9f512f 12722 *obufp++ = open_char;
20f0a1fc 12723 used_prefixes |= (prefixes & PREFIX_ADDR);
cb712a9e 12724 if (address_mode == mode_64bit)
c1a64871
JH
12725 {
12726 if (!(sizeflag & AFLAG))
db6eb5be 12727 s = names32[code - eAX_reg];
c1a64871 12728 else
db6eb5be 12729 s = names64[code - eAX_reg];
c1a64871 12730 }
52b15da3 12731 else if (sizeflag & AFLAG)
252b5132
RH
12732 s = names32[code - eAX_reg];
12733 else
12734 s = names16[code - eAX_reg];
12735 oappend (s);
1d9f512f
AM
12736 *obufp++ = close_char;
12737 *obufp = 0;
252b5132
RH
12738}
12739
12740static void
26ca5450 12741OP_ESreg (int code, int sizeflag)
252b5132 12742{
9306ca4a 12743 if (intel_syntax)
52fd6d94
JB
12744 {
12745 switch (codep[-1])
12746 {
12747 case 0x6d: /* insw/insl */
12748 intel_operand_size (z_mode, sizeflag);
12749 break;
12750 case 0xa5: /* movsw/movsl/movsq */
12751 case 0xa7: /* cmpsw/cmpsl/cmpsq */
12752 case 0xab: /* stosw/stosl */
12753 case 0xaf: /* scasw/scasl */
12754 intel_operand_size (v_mode, sizeflag);
12755 break;
12756 default:
12757 intel_operand_size (b_mode, sizeflag);
12758 }
12759 }
9ce09ba2 12760 oappend_maybe_intel ("%es:");
252b5132
RH
12761 ptr_reg (code, sizeflag);
12762}
12763
12764static void
26ca5450 12765OP_DSreg (int code, int sizeflag)
252b5132 12766{
9306ca4a 12767 if (intel_syntax)
52fd6d94
JB
12768 {
12769 switch (codep[-1])
12770 {
12771 case 0x6f: /* outsw/outsl */
12772 intel_operand_size (z_mode, sizeflag);
12773 break;
12774 case 0xa5: /* movsw/movsl/movsq */
12775 case 0xa7: /* cmpsw/cmpsl/cmpsq */
12776 case 0xad: /* lodsw/lodsl/lodsq */
12777 intel_operand_size (v_mode, sizeflag);
12778 break;
12779 default:
12780 intel_operand_size (b_mode, sizeflag);
12781 }
12782 }
285ca992
L
12783 /* Set active_seg_prefix to PREFIX_DS if it is unset so that the
12784 default segment register DS is printed. */
12785 if (!active_seg_prefix)
12786 active_seg_prefix = PREFIX_DS;
6608db57 12787 append_seg ();
252b5132
RH
12788 ptr_reg (code, sizeflag);
12789}
12790
252b5132 12791static void
26ca5450 12792OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 12793{
9b60702d 12794 int add;
161a04f6 12795 if (rex & REX_R)
c4a530c5 12796 {
161a04f6 12797 USED_REX (REX_R);
c4a530c5
JB
12798 add = 8;
12799 }
cb712a9e 12800 else if (address_mode != mode_64bit && (prefixes & PREFIX_LOCK))
c4a530c5 12801 {
f16cd0d5 12802 all_prefixes[last_lock_prefix] = 0;
c4a530c5
JB
12803 used_prefixes |= PREFIX_LOCK;
12804 add = 8;
12805 }
9b60702d
L
12806 else
12807 add = 0;
7967e09e 12808 sprintf (scratchbuf, "%%cr%d", modrm.reg + add);
9ce09ba2 12809 oappend_maybe_intel (scratchbuf);
252b5132
RH
12810}
12811
252b5132 12812static void
26ca5450 12813OP_D (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 12814{
9b60702d 12815 int add;
161a04f6
L
12816 USED_REX (REX_R);
12817 if (rex & REX_R)
52b15da3 12818 add = 8;
9b60702d
L
12819 else
12820 add = 0;
d708bcba 12821 if (intel_syntax)
bfbd9438 12822 sprintf (scratchbuf, "dr%d", modrm.reg + add);
d708bcba 12823 else
7967e09e 12824 sprintf (scratchbuf, "%%db%d", modrm.reg + add);
252b5132
RH
12825 oappend (scratchbuf);
12826}
12827
252b5132 12828static void
26ca5450 12829OP_T (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 12830{
7967e09e 12831 sprintf (scratchbuf, "%%tr%d", modrm.reg);
9ce09ba2 12832 oappend_maybe_intel (scratchbuf);
252b5132
RH
12833}
12834
252b5132 12835static void
26ca5450 12836OP_MMX (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 12837{
b9733481
L
12838 int reg = modrm.reg;
12839 const char **names;
12840
041bd2e0
JH
12841 used_prefixes |= (prefixes & PREFIX_DATA);
12842 if (prefixes & PREFIX_DATA)
20f0a1fc 12843 {
b9733481 12844 names = names_xmm;
161a04f6
L
12845 USED_REX (REX_R);
12846 if (rex & REX_R)
b9733481 12847 reg += 8;
20f0a1fc 12848 }
041bd2e0 12849 else
b9733481
L
12850 names = names_mm;
12851 oappend (names[reg]);
252b5132
RH
12852}
12853
c608c12e 12854static void
c0f3af97 12855OP_XMM (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
c608c12e 12856{
b9733481
L
12857 int reg = modrm.reg;
12858 const char **names;
12859
161a04f6
L
12860 USED_REX (REX_R);
12861 if (rex & REX_R)
b9733481 12862 reg += 8;
43234a1e
L
12863 if (vex.evex)
12864 {
12865 if (!vex.r)
12866 reg += 16;
12867 }
12868
539f890d
L
12869 if (need_vex
12870 && bytemode != xmm_mode
43234a1e
L
12871 && bytemode != xmmq_mode
12872 && bytemode != evex_half_bcst_xmmq_mode
12873 && bytemode != ymm_mode
260cd341 12874 && bytemode != tmm_mode
539f890d 12875 && bytemode != scalar_mode)
c0f3af97
L
12876 {
12877 switch (vex.length)
12878 {
12879 case 128:
b9733481 12880 names = names_xmm;
c0f3af97
L
12881 break;
12882 case 256:
5fc35d96
IT
12883 if (vex.w
12884 || (bytemode != vex_vsib_q_w_dq_mode
12885 && bytemode != vex_vsib_q_w_d_mode))
6c30d220
L
12886 names = names_ymm;
12887 else
12888 names = names_xmm;
c0f3af97 12889 break;
43234a1e
L
12890 case 512:
12891 names = names_zmm;
12892 break;
c0f3af97
L
12893 default:
12894 abort ();
12895 }
12896 }
43234a1e
L
12897 else if (bytemode == xmmq_mode
12898 || bytemode == evex_half_bcst_xmmq_mode)
12899 {
12900 switch (vex.length)
12901 {
12902 case 128:
12903 case 256:
12904 names = names_xmm;
12905 break;
12906 case 512:
12907 names = names_ymm;
12908 break;
12909 default:
12910 abort ();
12911 }
12912 }
260cd341
LC
12913 else if (bytemode == tmm_mode)
12914 {
12915 modrm.reg = reg;
12916 if (reg >= 8)
12917 {
12918 oappend ("(bad)");
12919 return;
12920 }
12921 names = names_tmm;
12922 }
43234a1e
L
12923 else if (bytemode == ymm_mode)
12924 names = names_ymm;
c0f3af97 12925 else
b9733481
L
12926 names = names_xmm;
12927 oappend (names[reg]);
c608c12e
AM
12928}
12929
252b5132 12930static void
26ca5450 12931OP_EM (int bytemode, int sizeflag)
252b5132 12932{
b9733481
L
12933 int reg;
12934 const char **names;
12935
7967e09e 12936 if (modrm.mod != 3)
252b5132 12937 {
b6169b20
L
12938 if (intel_syntax
12939 && (bytemode == v_mode || bytemode == v_swap_mode))
9306ca4a
JB
12940 {
12941 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
12942 used_prefixes |= (prefixes & PREFIX_DATA);
6c067bbb 12943 }
252b5132
RH
12944 OP_E (bytemode, sizeflag);
12945 return;
12946 }
12947
b6169b20
L
12948 if ((sizeflag & SUFFIX_ALWAYS) && bytemode == v_swap_mode)
12949 swap_operand ();
12950
6608db57 12951 /* Skip mod/rm byte. */
4bba6815 12952 MODRM_CHECK;
252b5132 12953 codep++;
041bd2e0 12954 used_prefixes |= (prefixes & PREFIX_DATA);
b9733481 12955 reg = modrm.rm;
041bd2e0 12956 if (prefixes & PREFIX_DATA)
20f0a1fc 12957 {
b9733481 12958 names = names_xmm;
161a04f6
L
12959 USED_REX (REX_B);
12960 if (rex & REX_B)
b9733481 12961 reg += 8;
20f0a1fc 12962 }
041bd2e0 12963 else
b9733481
L
12964 names = names_mm;
12965 oappend (names[reg]);
252b5132
RH
12966}
12967
246c51aa
L
12968/* cvt* are the only instructions in sse2 which have
12969 both SSE and MMX operands and also have 0x66 prefix
12970 in their opcode. 0x66 was originally used to differentiate
12971 between SSE and MMX instruction(operands). So we have to handle the
4d9567e0
MM
12972 cvt* separately using OP_EMC and OP_MXC */
12973static void
12974OP_EMC (int bytemode, int sizeflag)
12975{
7967e09e 12976 if (modrm.mod != 3)
4d9567e0
MM
12977 {
12978 if (intel_syntax && bytemode == v_mode)
12979 {
12980 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
12981 used_prefixes |= (prefixes & PREFIX_DATA);
6c067bbb 12982 }
4d9567e0
MM
12983 OP_E (bytemode, sizeflag);
12984 return;
12985 }
246c51aa 12986
4d9567e0
MM
12987 /* Skip mod/rm byte. */
12988 MODRM_CHECK;
12989 codep++;
12990 used_prefixes |= (prefixes & PREFIX_DATA);
b9733481 12991 oappend (names_mm[modrm.rm]);
4d9567e0
MM
12992}
12993
12994static void
12995OP_MXC (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12996{
12997 used_prefixes |= (prefixes & PREFIX_DATA);
b9733481 12998 oappend (names_mm[modrm.reg]);
4d9567e0
MM
12999}
13000
c608c12e 13001static void
26ca5450 13002OP_EX (int bytemode, int sizeflag)
c608c12e 13003{
b9733481
L
13004 int reg;
13005 const char **names;
d6f574e0
L
13006
13007 /* Skip mod/rm byte. */
13008 MODRM_CHECK;
13009 codep++;
13010
7967e09e 13011 if (modrm.mod != 3)
c608c12e 13012 {
c1e679ec 13013 OP_E_memory (bytemode, sizeflag);
c608c12e
AM
13014 return;
13015 }
d6f574e0 13016
b9733481 13017 reg = modrm.rm;
161a04f6
L
13018 USED_REX (REX_B);
13019 if (rex & REX_B)
b9733481 13020 reg += 8;
43234a1e
L
13021 if (vex.evex)
13022 {
13023 USED_REX (REX_X);
13024 if ((rex & REX_X))
13025 reg += 16;
13026 }
c608c12e 13027
b6169b20 13028 if ((sizeflag & SUFFIX_ALWAYS)
fa99fab2
L
13029 && (bytemode == x_swap_mode
13030 || bytemode == d_swap_mode
41f5efc6 13031 || bytemode == q_swap_mode))
b6169b20
L
13032 swap_operand ();
13033
c0f3af97
L
13034 if (need_vex
13035 && bytemode != xmm_mode
6c30d220
L
13036 && bytemode != xmmdw_mode
13037 && bytemode != xmmqd_mode
13038 && bytemode != xmm_mb_mode
13039 && bytemode != xmm_mw_mode
13040 && bytemode != xmm_md_mode
13041 && bytemode != xmm_mq_mode
539f890d 13042 && bytemode != xmmq_mode
43234a1e
L
13043 && bytemode != evex_half_bcst_xmmq_mode
13044 && bytemode != ymm_mode
260cd341 13045 && bytemode != tmm_mode
1c480963 13046 && bytemode != vex_scalar_w_dq_mode)
c0f3af97
L
13047 {
13048 switch (vex.length)
13049 {
13050 case 128:
b9733481 13051 names = names_xmm;
c0f3af97
L
13052 break;
13053 case 256:
b9733481 13054 names = names_ymm;
c0f3af97 13055 break;
43234a1e
L
13056 case 512:
13057 names = names_zmm;
13058 break;
c0f3af97
L
13059 default:
13060 abort ();
13061 }
13062 }
43234a1e
L
13063 else if (bytemode == xmmq_mode
13064 || bytemode == evex_half_bcst_xmmq_mode)
13065 {
13066 switch (vex.length)
13067 {
13068 case 128:
13069 case 256:
13070 names = names_xmm;
13071 break;
13072 case 512:
13073 names = names_ymm;
13074 break;
13075 default:
13076 abort ();
13077 }
13078 }
260cd341
LC
13079 else if (bytemode == tmm_mode)
13080 {
13081 modrm.rm = reg;
13082 if (reg >= 8)
13083 {
13084 oappend ("(bad)");
13085 return;
13086 }
13087 names = names_tmm;
13088 }
43234a1e
L
13089 else if (bytemode == ymm_mode)
13090 names = names_ymm;
c0f3af97 13091 else
b9733481
L
13092 names = names_xmm;
13093 oappend (names[reg]);
c608c12e
AM
13094}
13095
252b5132 13096static void
26ca5450 13097OP_MS (int bytemode, int sizeflag)
252b5132 13098{
7967e09e 13099 if (modrm.mod == 3)
2da11e11
AM
13100 OP_EM (bytemode, sizeflag);
13101 else
6608db57 13102 BadOp ();
252b5132
RH
13103}
13104
992aaec9 13105static void
26ca5450 13106OP_XS (int bytemode, int sizeflag)
992aaec9 13107{
7967e09e 13108 if (modrm.mod == 3)
992aaec9
AM
13109 OP_EX (bytemode, sizeflag);
13110 else
6608db57 13111 BadOp ();
992aaec9
AM
13112}
13113
cc0ec051
AM
13114static void
13115OP_M (int bytemode, int sizeflag)
13116{
7967e09e 13117 if (modrm.mod == 3)
75413a22
L
13118 /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
13119 BadOp ();
cc0ec051
AM
13120 else
13121 OP_E (bytemode, sizeflag);
13122}
13123
13124static void
13125OP_0f07 (int bytemode, int sizeflag)
13126{
7967e09e 13127 if (modrm.mod != 3 || modrm.rm != 0)
cc0ec051
AM
13128 BadOp ();
13129 else
13130 OP_E (bytemode, sizeflag);
13131}
13132
46e883c5 13133/* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
246c51aa 13134 32bit mode and "xchg %rax,%rax" in 64bit mode. */
46e883c5 13135
cc0ec051 13136static void
46e883c5 13137NOP_Fixup1 (int bytemode, int sizeflag)
cc0ec051 13138{
8b38ad71
L
13139 if ((prefixes & PREFIX_DATA) != 0
13140 || (rex != 0
13141 && rex != 0x48
13142 && address_mode == mode_64bit))
46e883c5
L
13143 OP_REG (bytemode, sizeflag);
13144 else
13145 strcpy (obuf, "nop");
13146}
13147
13148static void
13149NOP_Fixup2 (int bytemode, int sizeflag)
13150{
8b38ad71
L
13151 if ((prefixes & PREFIX_DATA) != 0
13152 || (rex != 0
13153 && rex != 0x48
13154 && address_mode == mode_64bit))
46e883c5 13155 OP_IMREG (bytemode, sizeflag);
cc0ec051
AM
13156}
13157
84037f8c 13158static const char *const Suffix3DNow[] = {
252b5132
RH
13159/* 00 */ NULL, NULL, NULL, NULL,
13160/* 04 */ NULL, NULL, NULL, NULL,
13161/* 08 */ NULL, NULL, NULL, NULL,
9e525108 13162/* 0C */ "pi2fw", "pi2fd", NULL, NULL,
252b5132
RH
13163/* 10 */ NULL, NULL, NULL, NULL,
13164/* 14 */ NULL, NULL, NULL, NULL,
13165/* 18 */ NULL, NULL, NULL, NULL,
9e525108 13166/* 1C */ "pf2iw", "pf2id", NULL, NULL,
252b5132
RH
13167/* 20 */ NULL, NULL, NULL, NULL,
13168/* 24 */ NULL, NULL, NULL, NULL,
13169/* 28 */ NULL, NULL, NULL, NULL,
13170/* 2C */ NULL, NULL, NULL, NULL,
13171/* 30 */ NULL, NULL, NULL, NULL,
13172/* 34 */ NULL, NULL, NULL, NULL,
13173/* 38 */ NULL, NULL, NULL, NULL,
13174/* 3C */ NULL, NULL, NULL, NULL,
13175/* 40 */ NULL, NULL, NULL, NULL,
13176/* 44 */ NULL, NULL, NULL, NULL,
13177/* 48 */ NULL, NULL, NULL, NULL,
13178/* 4C */ NULL, NULL, NULL, NULL,
13179/* 50 */ NULL, NULL, NULL, NULL,
13180/* 54 */ NULL, NULL, NULL, NULL,
13181/* 58 */ NULL, NULL, NULL, NULL,
13182/* 5C */ NULL, NULL, NULL, NULL,
13183/* 60 */ NULL, NULL, NULL, NULL,
13184/* 64 */ NULL, NULL, NULL, NULL,
13185/* 68 */ NULL, NULL, NULL, NULL,
13186/* 6C */ NULL, NULL, NULL, NULL,
13187/* 70 */ NULL, NULL, NULL, NULL,
13188/* 74 */ NULL, NULL, NULL, NULL,
13189/* 78 */ NULL, NULL, NULL, NULL,
13190/* 7C */ NULL, NULL, NULL, NULL,
13191/* 80 */ NULL, NULL, NULL, NULL,
13192/* 84 */ NULL, NULL, NULL, NULL,
9e525108
AM
13193/* 88 */ NULL, NULL, "pfnacc", NULL,
13194/* 8C */ NULL, NULL, "pfpnacc", NULL,
252b5132
RH
13195/* 90 */ "pfcmpge", NULL, NULL, NULL,
13196/* 94 */ "pfmin", NULL, "pfrcp", "pfrsqrt",
13197/* 98 */ NULL, NULL, "pfsub", NULL,
13198/* 9C */ NULL, NULL, "pfadd", NULL,
13199/* A0 */ "pfcmpgt", NULL, NULL, NULL,
13200/* A4 */ "pfmax", NULL, "pfrcpit1", "pfrsqit1",
13201/* A8 */ NULL, NULL, "pfsubr", NULL,
13202/* AC */ NULL, NULL, "pfacc", NULL,
13203/* B0 */ "pfcmpeq", NULL, NULL, NULL,
9beff690 13204/* B4 */ "pfmul", NULL, "pfrcpit2", "pmulhrw",
9e525108 13205/* B8 */ NULL, NULL, NULL, "pswapd",
252b5132
RH
13206/* BC */ NULL, NULL, NULL, "pavgusb",
13207/* C0 */ NULL, NULL, NULL, NULL,
13208/* C4 */ NULL, NULL, NULL, NULL,
13209/* C8 */ NULL, NULL, NULL, NULL,
13210/* CC */ NULL, NULL, NULL, NULL,
13211/* D0 */ NULL, NULL, NULL, NULL,
13212/* D4 */ NULL, NULL, NULL, NULL,
13213/* D8 */ NULL, NULL, NULL, NULL,
13214/* DC */ NULL, NULL, NULL, NULL,
13215/* E0 */ NULL, NULL, NULL, NULL,
13216/* E4 */ NULL, NULL, NULL, NULL,
13217/* E8 */ NULL, NULL, NULL, NULL,
13218/* EC */ NULL, NULL, NULL, NULL,
13219/* F0 */ NULL, NULL, NULL, NULL,
13220/* F4 */ NULL, NULL, NULL, NULL,
13221/* F8 */ NULL, NULL, NULL, NULL,
13222/* FC */ NULL, NULL, NULL, NULL,
13223};
13224
13225static void
26ca5450 13226OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132
RH
13227{
13228 const char *mnemonic;
13229
13230 FETCH_DATA (the_info, codep + 1);
13231 /* AMD 3DNow! instructions are specified by an opcode suffix in the
13232 place where an 8-bit immediate would normally go. ie. the last
13233 byte of the instruction. */
ea397f5b 13234 obufp = mnemonicendp;
c608c12e 13235 mnemonic = Suffix3DNow[*codep++ & 0xff];
252b5132 13236 if (mnemonic)
2da11e11 13237 oappend (mnemonic);
252b5132
RH
13238 else
13239 {
13240 /* Since a variable sized modrm/sib chunk is between the start
13241 of the opcode (0x0f0f) and the opcode suffix, we need to do
13242 all the modrm processing first, and don't know until now that
13243 we have a bad opcode. This necessitates some cleaning up. */
ce518a5f
L
13244 op_out[0][0] = '\0';
13245 op_out[1][0] = '\0';
6608db57 13246 BadOp ();
252b5132 13247 }
ea397f5b 13248 mnemonicendp = obufp;
252b5132 13249}
c608c12e 13250
c4de7606 13251static const struct op simd_cmp_op[] =
ea397f5b
L
13252{
13253 { STRING_COMMA_LEN ("eq") },
13254 { STRING_COMMA_LEN ("lt") },
13255 { STRING_COMMA_LEN ("le") },
13256 { STRING_COMMA_LEN ("unord") },
13257 { STRING_COMMA_LEN ("neq") },
13258 { STRING_COMMA_LEN ("nlt") },
13259 { STRING_COMMA_LEN ("nle") },
13260 { STRING_COMMA_LEN ("ord") }
c608c12e
AM
13261};
13262
c4de7606
JB
13263static const struct op vex_cmp_op[] =
13264{
13265 { STRING_COMMA_LEN ("eq_uq") },
13266 { STRING_COMMA_LEN ("nge") },
13267 { STRING_COMMA_LEN ("ngt") },
13268 { STRING_COMMA_LEN ("false") },
13269 { STRING_COMMA_LEN ("neq_oq") },
13270 { STRING_COMMA_LEN ("ge") },
13271 { STRING_COMMA_LEN ("gt") },
13272 { STRING_COMMA_LEN ("true") },
13273 { STRING_COMMA_LEN ("eq_os") },
13274 { STRING_COMMA_LEN ("lt_oq") },
13275 { STRING_COMMA_LEN ("le_oq") },
13276 { STRING_COMMA_LEN ("unord_s") },
13277 { STRING_COMMA_LEN ("neq_us") },
13278 { STRING_COMMA_LEN ("nlt_uq") },
13279 { STRING_COMMA_LEN ("nle_uq") },
13280 { STRING_COMMA_LEN ("ord_s") },
13281 { STRING_COMMA_LEN ("eq_us") },
13282 { STRING_COMMA_LEN ("nge_uq") },
13283 { STRING_COMMA_LEN ("ngt_uq") },
13284 { STRING_COMMA_LEN ("false_os") },
13285 { STRING_COMMA_LEN ("neq_os") },
13286 { STRING_COMMA_LEN ("ge_oq") },
13287 { STRING_COMMA_LEN ("gt_oq") },
13288 { STRING_COMMA_LEN ("true_us") },
13289};
13290
c608c12e 13291static void
ad19981d 13292CMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
c608c12e
AM
13293{
13294 unsigned int cmp_type;
13295
13296 FETCH_DATA (the_info, codep + 1);
13297 cmp_type = *codep++ & 0xff;
c0f3af97 13298 if (cmp_type < ARRAY_SIZE (simd_cmp_op))
c608c12e 13299 {
ad19981d 13300 char suffix [3];
ea397f5b 13301 char *p = mnemonicendp - 2;
ad19981d
L
13302 suffix[0] = p[0];
13303 suffix[1] = p[1];
13304 suffix[2] = '\0';
ea397f5b
L
13305 sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
13306 mnemonicendp += simd_cmp_op[cmp_type].len;
c608c12e 13307 }
c4de7606
JB
13308 else if (need_vex
13309 && cmp_type < ARRAY_SIZE (simd_cmp_op) + ARRAY_SIZE (vex_cmp_op))
13310 {
13311 char suffix [3];
13312 char *p = mnemonicendp - 2;
13313 suffix[0] = p[0];
13314 suffix[1] = p[1];
13315 suffix[2] = '\0';
13316 cmp_type -= ARRAY_SIZE (simd_cmp_op);
13317 sprintf (p, "%s%s", vex_cmp_op[cmp_type].name, suffix);
13318 mnemonicendp += vex_cmp_op[cmp_type].len;
13319 }
c608c12e
AM
13320 else
13321 {
ad19981d
L
13322 /* We have a reserved extension byte. Output it directly. */
13323 scratchbuf[0] = '$';
13324 print_operand_value (scratchbuf + 1, 1, cmp_type);
9ce09ba2 13325 oappend_maybe_intel (scratchbuf);
ad19981d 13326 scratchbuf[0] = '\0';
c608c12e
AM
13327 }
13328}
13329
9916071f 13330static void
7abb8d81 13331OP_Mwait (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
9916071f 13332{
7abb8d81 13333 /* mwait %eax,%ecx / mwaitx %eax,%ecx,%ebx */
b844680a
L
13334 if (!intel_syntax)
13335 {
081e283f
JB
13336 strcpy (op_out[0], names32[0]);
13337 strcpy (op_out[1], names32[1]);
7abb8d81 13338 if (bytemode == eBX_reg)
081e283f 13339 strcpy (op_out[2], names32[3]);
b844680a
L
13340 two_source_ops = 1;
13341 }
13342 /* Skip mod/rm byte. */
13343 MODRM_CHECK;
13344 codep++;
13345}
13346
13347static void
13348OP_Monitor (int bytemode ATTRIBUTE_UNUSED,
13349 int sizeflag ATTRIBUTE_UNUSED)
ca164297 13350{
081e283f 13351 /* monitor %{e,r,}ax,%ecx,%edx" */
b844680a 13352 if (!intel_syntax)
ca164297 13353 {
cb712a9e
L
13354 const char **names = (address_mode == mode_64bit
13355 ? names64 : names32);
1d9f512f 13356
081e283f 13357 if (prefixes & PREFIX_ADDR)
ca164297 13358 {
b844680a 13359 /* Remove "addr16/addr32". */
f16cd0d5 13360 all_prefixes[last_addr_prefix] = 0;
081e283f
JB
13361 names = (address_mode != mode_32bit
13362 ? names32 : names16);
b844680a 13363 used_prefixes |= PREFIX_ADDR;
ca164297 13364 }
081e283f
JB
13365 else if (address_mode == mode_16bit)
13366 names = names16;
13367 strcpy (op_out[0], names[0]);
13368 strcpy (op_out[1], names32[1]);
13369 strcpy (op_out[2], names32[2]);
b844680a 13370 two_source_ops = 1;
ca164297 13371 }
b844680a
L
13372 /* Skip mod/rm byte. */
13373 MODRM_CHECK;
13374 codep++;
30123838
JB
13375}
13376
6608db57
KH
13377static void
13378BadOp (void)
2da11e11 13379{
6608db57
KH
13380 /* Throw away prefixes and 1st. opcode byte. */
13381 codep = insn_codep + 1;
2da11e11
AM
13382 oappend ("(bad)");
13383}
4cc91dba 13384
35c52694
L
13385static void
13386REP_Fixup (int bytemode, int sizeflag)
13387{
13388 /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
13389 lods and stos. */
35c52694 13390 if (prefixes & PREFIX_REPZ)
f16cd0d5 13391 all_prefixes[last_repz_prefix] = REP_PREFIX;
35c52694
L
13392
13393 switch (bytemode)
13394 {
13395 case al_reg:
13396 case eAX_reg:
13397 case indir_dx_reg:
13398 OP_IMREG (bytemode, sizeflag);
13399 break;
13400 case eDI_reg:
13401 OP_ESreg (bytemode, sizeflag);
13402 break;
13403 case eSI_reg:
13404 OP_DSreg (bytemode, sizeflag);
13405 break;
13406 default:
13407 abort ();
13408 break;
13409 }
13410}
f5804c90 13411
d835a58b
JB
13412static void
13413SEP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13414{
13415 if ( isa64 != amd64 )
13416 return;
13417
13418 obufp = obuf;
13419 BadOp ();
13420 mnemonicendp = obufp;
13421 ++codep;
13422}
13423
7e8b059b
L
13424/* For BND-prefixed instructions 0xF2 prefix should be displayed as
13425 "bnd". */
13426
13427static void
13428BND_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13429{
13430 if (prefixes & PREFIX_REPNZ)
13431 all_prefixes[last_repnz_prefix] = BND_PREFIX;
13432}
13433
04ef582a
L
13434/* For NOTRACK-prefixed instructions, 0x3E prefix should be displayed as
13435 "notrack". */
13436
13437static void
13438NOTRACK_Fixup (int bytemode ATTRIBUTE_UNUSED,
13439 int sizeflag ATTRIBUTE_UNUSED)
13440{
9fef80d6 13441 if (active_seg_prefix == PREFIX_DS
04ef582a
L
13442 && (address_mode != mode_64bit || last_data_prefix < 0))
13443 {
4e9ac44a 13444 /* NOTRACK prefix is only valid on indirect branch instructions.
9fef80d6 13445 NB: DATA prefix is unsupported for Intel64. */
04ef582a
L
13446 active_seg_prefix = 0;
13447 all_prefixes[last_seg_prefix] = NOTRACK_PREFIX;
13448 }
13449}
13450
42164a71
L
13451/* Similar to OP_E. But the 0xf2/0xf3 prefixes should be displayed as
13452 "xacquire"/"xrelease" for memory operand if there is a LOCK prefix.
13453 */
13454
13455static void
13456HLE_Fixup1 (int bytemode, int sizeflag)
13457{
13458 if (modrm.mod != 3
13459 && (prefixes & PREFIX_LOCK) != 0)
13460 {
13461 if (prefixes & PREFIX_REPZ)
13462 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
13463 if (prefixes & PREFIX_REPNZ)
13464 all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
13465 }
13466
13467 OP_E (bytemode, sizeflag);
13468}
13469
13470/* Similar to OP_E. But the 0xf2/0xf3 prefixes should be displayed as
13471 "xacquire"/"xrelease" for memory operand. No check for LOCK prefix.
13472 */
13473
13474static void
13475HLE_Fixup2 (int bytemode, int sizeflag)
13476{
13477 if (modrm.mod != 3)
13478 {
13479 if (prefixes & PREFIX_REPZ)
13480 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
13481 if (prefixes & PREFIX_REPNZ)
13482 all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
13483 }
13484
13485 OP_E (bytemode, sizeflag);
13486}
13487
13488/* Similar to OP_E. But the 0xf3 prefixes should be displayed as
13489 "xrelease" for memory operand. No check for LOCK prefix. */
13490
13491static void
13492HLE_Fixup3 (int bytemode, int sizeflag)
13493{
13494 if (modrm.mod != 3
13495 && last_repz_prefix > last_repnz_prefix
13496 && (prefixes & PREFIX_REPZ) != 0)
13497 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
13498
13499 OP_E (bytemode, sizeflag);
13500}
13501
f5804c90
L
13502static void
13503CMPXCHG8B_Fixup (int bytemode, int sizeflag)
13504{
161a04f6
L
13505 USED_REX (REX_W);
13506 if (rex & REX_W)
f5804c90
L
13507 {
13508 /* Change cmpxchg8b to cmpxchg16b. */
ea397f5b
L
13509 char *p = mnemonicendp - 2;
13510 mnemonicendp = stpcpy (p, "16b");
fb9c77c7 13511 bytemode = o_mode;
f5804c90 13512 }
42164a71
L
13513 else if ((prefixes & PREFIX_LOCK) != 0)
13514 {
13515 if (prefixes & PREFIX_REPZ)
13516 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
13517 if (prefixes & PREFIX_REPNZ)
13518 all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
13519 }
13520
f5804c90
L
13521 OP_M (bytemode, sizeflag);
13522}
42903f7f
L
13523
13524static void
13525XMM_Fixup (int reg, int sizeflag ATTRIBUTE_UNUSED)
13526{
b9733481
L
13527 const char **names;
13528
c0f3af97
L
13529 if (need_vex)
13530 {
13531 switch (vex.length)
13532 {
13533 case 128:
b9733481 13534 names = names_xmm;
c0f3af97
L
13535 break;
13536 case 256:
b9733481 13537 names = names_ymm;
c0f3af97
L
13538 break;
13539 default:
13540 abort ();
13541 }
13542 }
13543 else
b9733481
L
13544 names = names_xmm;
13545 oappend (names[reg]);
42903f7f 13546}
381d071f
L
13547
13548static void
eacc9c89
L
13549FXSAVE_Fixup (int bytemode, int sizeflag)
13550{
13551 /* Add proper suffix to "fxsave" and "fxrstor". */
13552 USED_REX (REX_W);
13553 if (rex & REX_W)
13554 {
13555 char *p = mnemonicendp;
13556 *p++ = '6';
13557 *p++ = '4';
13558 *p = '\0';
13559 mnemonicendp = p;
13560 }
13561 OP_M (bytemode, sizeflag);
15c7c1d8
JB
13562}
13563
c0f3af97
L
13564/* Display the destination register operand for instructions with
13565 VEX. */
13566
13567static void
13568OP_VEX (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13569{
539f890d 13570 int reg;
b9733481
L
13571 const char **names;
13572
c0f3af97
L
13573 if (!need_vex)
13574 abort ();
13575
539f890d 13576 reg = vex.register_specifier;
63c6fc6c 13577 vex.register_specifier = 0;
5f847646
JB
13578 if (address_mode != mode_64bit)
13579 reg &= 7;
13580 else if (vex.evex && !vex.v)
13581 reg += 16;
43234a1e 13582
539f890d
L
13583 if (bytemode == vex_scalar_mode)
13584 {
13585 oappend (names_xmm[reg]);
13586 return;
13587 }
13588
260cd341
LC
13589 if (bytemode == tmm_mode)
13590 {
13591 /* All 3 TMM registers must be distinct. */
13592 if (reg >= 8)
13593 oappend ("(bad)");
13594 else
13595 {
13596 /* This must be the 3rd operand. */
13597 if (obufp != op_out[2])
13598 abort ();
13599 oappend (names_tmm[reg]);
13600 if (reg == modrm.reg || reg == modrm.rm)
13601 strcpy (obufp, "/(bad)");
13602 }
13603
13604 if (modrm.reg == modrm.rm || modrm.reg == reg || modrm.rm == reg)
13605 {
13606 if (modrm.reg <= 8
13607 && (modrm.reg == modrm.rm || modrm.reg == reg))
13608 strcat (op_out[0], "/(bad)");
13609 if (modrm.rm <= 8
13610 && (modrm.rm == modrm.reg || modrm.rm == reg))
13611 strcat (op_out[1], "/(bad)");
13612 }
13613
13614 return;
13615 }
13616
c0f3af97
L
13617 switch (vex.length)
13618 {
13619 case 128:
13620 switch (bytemode)
13621 {
13622 case vex_mode:
6c30d220 13623 case vex_vsib_q_w_dq_mode:
5fc35d96 13624 case vex_vsib_q_w_d_mode:
cb21baef
L
13625 names = names_xmm;
13626 break;
13627 case dq_mode:
390a6789 13628 if (rex & REX_W)
cb21baef
L
13629 names = names64;
13630 else
13631 names = names32;
c0f3af97 13632 break;
1ba585e8 13633 case mask_bd_mode:
43234a1e 13634 case mask_mode:
9889cbb1
L
13635 if (reg > 0x7)
13636 {
13637 oappend ("(bad)");
13638 return;
13639 }
43234a1e
L
13640 names = names_mask;
13641 break;
c0f3af97
L
13642 default:
13643 abort ();
13644 return;
13645 }
c0f3af97
L
13646 break;
13647 case 256:
13648 switch (bytemode)
13649 {
13650 case vex_mode:
6c30d220
L
13651 names = names_ymm;
13652 break;
13653 case vex_vsib_q_w_dq_mode:
5fc35d96 13654 case vex_vsib_q_w_d_mode:
6c30d220 13655 names = vex.w ? names_ymm : names_xmm;
c0f3af97 13656 break;
1ba585e8 13657 case mask_bd_mode:
43234a1e 13658 case mask_mode:
9889cbb1
L
13659 if (reg > 0x7)
13660 {
13661 oappend ("(bad)");
13662 return;
13663 }
43234a1e
L
13664 names = names_mask;
13665 break;
c0f3af97 13666 default:
a37a2806
NC
13667 /* See PR binutils/20893 for a reproducer. */
13668 oappend ("(bad)");
c0f3af97
L
13669 return;
13670 }
c0f3af97 13671 break;
43234a1e
L
13672 case 512:
13673 names = names_zmm;
13674 break;
c0f3af97
L
13675 default:
13676 abort ();
13677 break;
13678 }
539f890d 13679 oappend (names[reg]);
c0f3af97
L
13680}
13681
41f5efc6
JB
13682static void
13683OP_VexR (int bytemode, int sizeflag)
13684{
13685 if (modrm.mod == 3)
13686 OP_VEX (bytemode, sizeflag);
13687}
13688
5dd85c99 13689static void
e6123d0c 13690OP_VexW (int bytemode, int sizeflag)
5dd85c99 13691{
e6123d0c 13692 OP_VEX (bytemode, sizeflag);
5dd85c99 13693
5dd85c99 13694 if (vex.w)
5f847646 13695 {
e6123d0c
JB
13696 /* Swap 2nd and 3rd operands. */
13697 strcpy (scratchbuf, op_out[2]);
13698 strcpy (op_out[2], op_out[1]);
13699 strcpy (op_out[1], scratchbuf);
5f847646 13700 }
5dd85c99
SP
13701}
13702
c0f3af97
L
13703static void
13704OP_REG_VexI4 (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13705{
13706 int reg;
6384fd9e 13707 const char **names = names_xmm;
b9733481 13708
c0f3af97
L
13709 FETCH_DATA (the_info, codep + 1);
13710 reg = *codep++;
13711
6384fd9e 13712 if (bytemode != x_mode && bytemode != scalar_mode)
c0f3af97
L
13713 abort ();
13714
c0f3af97 13715 reg >>= 4;
5f847646
JB
13716 if (address_mode != mode_64bit)
13717 reg &= 7;
dae39acc 13718
6384fd9e
JB
13719 if (bytemode == x_mode && vex.length == 256)
13720 names = names_ymm;
13721
b9733481 13722 oappend (names[reg]);
b13b1bc0
JB
13723
13724 if (vex.w)
13725 {
13726 /* Swap 3rd and 4th operands. */
13727 strcpy (scratchbuf, op_out[3]);
13728 strcpy (op_out[3], op_out[2]);
13729 strcpy (op_out[2], scratchbuf);
13730 }
c0f3af97
L
13731}
13732
922d8de8 13733static void
93abb146
JB
13734OP_VexI4 (int bytemode ATTRIBUTE_UNUSED,
13735 int sizeflag ATTRIBUTE_UNUSED)
922d8de8 13736{
93abb146
JB
13737 scratchbuf[0] = '$';
13738 print_operand_value (scratchbuf + 1, 1, codep[-1] & 0xf);
13739 oappend_maybe_intel (scratchbuf);
922d8de8
DR
13740}
13741
43234a1e
L
13742static void
13743VPCMP_Fixup (int bytemode ATTRIBUTE_UNUSED,
13744 int sizeflag ATTRIBUTE_UNUSED)
13745{
13746 unsigned int cmp_type;
13747
13748 if (!vex.evex)
13749 abort ();
13750
13751 FETCH_DATA (the_info, codep + 1);
13752 cmp_type = *codep++ & 0xff;
13753 /* There are aliases for immediates 0, 1, 2, 4, 5, 6.
13754 If it's the case, print suffix, otherwise - print the immediate. */
13755 if (cmp_type < ARRAY_SIZE (simd_cmp_op)
13756 && cmp_type != 3
13757 && cmp_type != 7)
13758 {
13759 char suffix [3];
13760 char *p = mnemonicendp - 2;
13761
13762 /* vpcmp* can have both one- and two-lettered suffix. */
13763 if (p[0] == 'p')
13764 {
13765 p++;
13766 suffix[0] = p[0];
13767 suffix[1] = '\0';
13768 }
13769 else
13770 {
13771 suffix[0] = p[0];
13772 suffix[1] = p[1];
13773 suffix[2] = '\0';
13774 }
13775
13776 sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
13777 mnemonicendp += simd_cmp_op[cmp_type].len;
13778 }
be92cb14
JB
13779 else
13780 {
13781 /* We have a reserved extension byte. Output it directly. */
13782 scratchbuf[0] = '$';
13783 print_operand_value (scratchbuf + 1, 1, cmp_type);
13784 oappend_maybe_intel (scratchbuf);
13785 scratchbuf[0] = '\0';
13786 }
13787}
13788
13789static const struct op xop_cmp_op[] =
13790{
13791 { STRING_COMMA_LEN ("lt") },
13792 { STRING_COMMA_LEN ("le") },
13793 { STRING_COMMA_LEN ("gt") },
13794 { STRING_COMMA_LEN ("ge") },
13795 { STRING_COMMA_LEN ("eq") },
13796 { STRING_COMMA_LEN ("neq") },
13797 { STRING_COMMA_LEN ("false") },
13798 { STRING_COMMA_LEN ("true") }
13799};
13800
13801static void
13802VPCOM_Fixup (int bytemode ATTRIBUTE_UNUSED,
13803 int sizeflag ATTRIBUTE_UNUSED)
13804{
13805 unsigned int cmp_type;
13806
13807 FETCH_DATA (the_info, codep + 1);
13808 cmp_type = *codep++ & 0xff;
13809 if (cmp_type < ARRAY_SIZE (xop_cmp_op))
13810 {
13811 char suffix[3];
13812 char *p = mnemonicendp - 2;
13813
13814 /* vpcom* can have both one- and two-lettered suffix. */
13815 if (p[0] == 'm')
13816 {
13817 p++;
13818 suffix[0] = p[0];
13819 suffix[1] = '\0';
13820 }
13821 else
13822 {
13823 suffix[0] = p[0];
13824 suffix[1] = p[1];
13825 suffix[2] = '\0';
13826 }
13827
13828 sprintf (p, "%s%s", xop_cmp_op[cmp_type].name, suffix);
13829 mnemonicendp += xop_cmp_op[cmp_type].len;
13830 }
43234a1e
L
13831 else
13832 {
13833 /* We have a reserved extension byte. Output it directly. */
13834 scratchbuf[0] = '$';
13835 print_operand_value (scratchbuf + 1, 1, cmp_type);
9ce09ba2 13836 oappend_maybe_intel (scratchbuf);
43234a1e
L
13837 scratchbuf[0] = '\0';
13838 }
13839}
13840
ea397f5b
L
13841static const struct op pclmul_op[] =
13842{
13843 { STRING_COMMA_LEN ("lql") },
13844 { STRING_COMMA_LEN ("hql") },
13845 { STRING_COMMA_LEN ("lqh") },
13846 { STRING_COMMA_LEN ("hqh") }
c0f3af97
L
13847};
13848
13849static void
13850PCLMUL_Fixup (int bytemode ATTRIBUTE_UNUSED,
13851 int sizeflag ATTRIBUTE_UNUSED)
13852{
13853 unsigned int pclmul_type;
13854
13855 FETCH_DATA (the_info, codep + 1);
13856 pclmul_type = *codep++ & 0xff;
13857 switch (pclmul_type)
13858 {
13859 case 0x10:
13860 pclmul_type = 2;
13861 break;
13862 case 0x11:
13863 pclmul_type = 3;
13864 break;
13865 default:
13866 break;
7bb15c6f 13867 }
c0f3af97
L
13868 if (pclmul_type < ARRAY_SIZE (pclmul_op))
13869 {
13870 char suffix [4];
ea397f5b 13871 char *p = mnemonicendp - 3;
c0f3af97
L
13872 suffix[0] = p[0];
13873 suffix[1] = p[1];
13874 suffix[2] = p[2];
13875 suffix[3] = '\0';
ea397f5b
L
13876 sprintf (p, "%s%s", pclmul_op[pclmul_type].name, suffix);
13877 mnemonicendp += pclmul_op[pclmul_type].len;
c0f3af97
L
13878 }
13879 else
13880 {
13881 /* We have a reserved extension byte. Output it directly. */
13882 scratchbuf[0] = '$';
13883 print_operand_value (scratchbuf + 1, 1, pclmul_type);
9ce09ba2 13884 oappend_maybe_intel (scratchbuf);
c0f3af97
L
13885 scratchbuf[0] = '\0';
13886 }
13887}
13888
bc31405e
L
13889static void
13890MOVSXD_Fixup (int bytemode, int sizeflag)
13891{
13892 /* Add proper suffix to "movsxd". */
13893 char *p = mnemonicendp;
13894
13895 switch (bytemode)
13896 {
13897 case movsxd_mode:
13898 if (intel_syntax)
13899 {
13900 *p++ = 'x';
13901 *p++ = 'd';
13902 goto skip;
13903 }
13904
13905 USED_REX (REX_W);
13906 if (rex & REX_W)
13907 {
13908 *p++ = 'l';
13909 *p++ = 'q';
13910 }
13911 else
13912 {
13913 *p++ = 'x';
13914 *p++ = 'd';
13915 }
13916 break;
13917 default:
13918 oappend (INTERNAL_DISASSEMBLER_ERROR);
13919 break;
13920 }
13921
dc1e8a47 13922 skip:
bc31405e
L
13923 mnemonicendp = p;
13924 *p = '\0';
13925 OP_E (bytemode, sizeflag);
13926}
13927
43234a1e
L
13928static void
13929OP_Mask (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13930{
13931 if (!vex.evex
1ba585e8 13932 || (bytemode != mask_mode && bytemode != mask_bd_mode))
43234a1e
L
13933 abort ();
13934
13935 USED_REX (REX_R);
13936 if ((rex & REX_R) != 0 || !vex.r)
13937 {
13938 BadOp ();
13939 return;
13940 }
13941
13942 oappend (names_mask [modrm.reg]);
13943}
13944
13945static void
13946OP_Rounding (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13947{
43234a1e
L
13948 if (modrm.mod == 3 && vex.b)
13949 switch (bytemode)
13950 {
70df6fc9
L
13951 case evex_rounding_64_mode:
13952 if (address_mode != mode_64bit)
13953 {
13954 oappend ("(bad)");
13955 break;
13956 }
13957 /* Fall through. */
43234a1e
L
13958 case evex_rounding_mode:
13959 oappend (names_rounding[vex.ll]);
13960 break;
13961 case evex_sae_mode:
13962 oappend ("{sae}");
13963 break;
13964 default:
6df22cf6 13965 abort ();
43234a1e
L
13966 break;
13967 }
13968}
This page took 2.378173 seconds and 4 git commands to generate.