Introduce assign_operation
[deliverable/binutils-gdb.git] / opcodes / i386-dis.c
CommitLineData
252b5132 1/* Print i386 instructions for GDB, the GNU debugger.
250d07de 2 Copyright (C) 1988-2021 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,
c1fa250a 695 REG_0F3A0F_PREFIX_1_MOD_3,
3873ba12
L
696 REG_0F71,
697 REG_0F72,
698 REG_0F73,
699 REG_0FA6,
700 REG_0FA7,
701 REG_0FAE,
702 REG_0FBA,
703 REG_0FC7,
592a252b
L
704 REG_VEX_0F71,
705 REG_VEX_0F72,
706 REG_VEX_0F73,
707 REG_VEX_0FAE,
260cd341 708 REG_VEX_0F3849_X86_64_P_0_W_0_M_1,
f12dc422 709 REG_VEX_0F38F3,
467bbef0
JB
710
711 REG_0FXOP_09_01_L_0,
712 REG_0FXOP_09_02_L_0,
713 REG_0FXOP_09_12_M_1_L_0,
714 REG_0FXOP_0A_12_L_0,
43234a1e 715
1ba585e8 716 REG_EVEX_0F71,
43234a1e
L
717 REG_EVEX_0F72,
718 REG_EVEX_0F73,
719 REG_EVEX_0F38C6,
720 REG_EVEX_0F38C7
51e7da1b 721};
1ceb70f8 722
51e7da1b
L
723enum
724{
725 MOD_8D = 0,
42164a71
L
726 MOD_C6_REG_7,
727 MOD_C7_REG_7,
4a357820
MZ
728 MOD_FF_REG_3,
729 MOD_FF_REG_5,
3873ba12
L
730 MOD_0F01_REG_0,
731 MOD_0F01_REG_1,
732 MOD_0F01_REG_2,
733 MOD_0F01_REG_3,
8eab4136 734 MOD_0F01_REG_5,
3873ba12
L
735 MOD_0F01_REG_7,
736 MOD_0F12_PREFIX_0,
18897deb 737 MOD_0F12_PREFIX_2,
3873ba12
L
738 MOD_0F13,
739 MOD_0F16_PREFIX_0,
18897deb 740 MOD_0F16_PREFIX_2,
3873ba12
L
741 MOD_0F17,
742 MOD_0F18_REG_0,
743 MOD_0F18_REG_1,
744 MOD_0F18_REG_2,
745 MOD_0F18_REG_3,
d7189fa5
RM
746 MOD_0F18_REG_4,
747 MOD_0F18_REG_5,
748 MOD_0F18_REG_6,
749 MOD_0F18_REG_7,
7e8b059b
L
750 MOD_0F1A_PREFIX_0,
751 MOD_0F1B_PREFIX_0,
752 MOD_0F1B_PREFIX_1,
c48935d7 753 MOD_0F1C_PREFIX_0,
603555e5 754 MOD_0F1E_PREFIX_1,
3873ba12
L
755 MOD_0F2B_PREFIX_0,
756 MOD_0F2B_PREFIX_1,
757 MOD_0F2B_PREFIX_2,
758 MOD_0F2B_PREFIX_3,
a5aaedb9 759 MOD_0F50,
3873ba12
L
760 MOD_0F71_REG_2,
761 MOD_0F71_REG_4,
762 MOD_0F71_REG_6,
763 MOD_0F72_REG_2,
764 MOD_0F72_REG_4,
765 MOD_0F72_REG_6,
766 MOD_0F73_REG_2,
767 MOD_0F73_REG_3,
768 MOD_0F73_REG_6,
769 MOD_0F73_REG_7,
770 MOD_0FAE_REG_0,
771 MOD_0FAE_REG_1,
772 MOD_0FAE_REG_2,
773 MOD_0FAE_REG_3,
774 MOD_0FAE_REG_4,
775 MOD_0FAE_REG_5,
776 MOD_0FAE_REG_6,
777 MOD_0FAE_REG_7,
778 MOD_0FB2,
779 MOD_0FB4,
780 MOD_0FB5,
a8484f96 781 MOD_0FC3,
963f3586
IT
782 MOD_0FC7_REG_3,
783 MOD_0FC7_REG_4,
784 MOD_0FC7_REG_5,
3873ba12
L
785 MOD_0FC7_REG_6,
786 MOD_0FC7_REG_7,
787 MOD_0FD7,
788 MOD_0FE7_PREFIX_2,
789 MOD_0FF0_PREFIX_3,
7531c613 790 MOD_0F382A,
c4694f17
TG
791 MOD_0F38DC_PREFIX_1,
792 MOD_0F38DD_PREFIX_1,
793 MOD_0F38DE_PREFIX_1,
794 MOD_0F38DF_PREFIX_1,
7531c613 795 MOD_0F38F5,
603555e5 796 MOD_0F38F6_PREFIX_0,
5d79adc4 797 MOD_0F38F8_PREFIX_1,
c0a30a9f 798 MOD_0F38F8_PREFIX_2,
5d79adc4 799 MOD_0F38F8_PREFIX_3,
035e7389 800 MOD_0F38F9,
c4694f17
TG
801 MOD_0F38FA_PREFIX_1,
802 MOD_0F38FB_PREFIX_1,
c1fa250a 803 MOD_0F3A0F_PREFIX_1,
3873ba12
L
804 MOD_62_32BIT,
805 MOD_C4_32BIT,
806 MOD_C5_32BIT,
592a252b 807 MOD_VEX_0F12_PREFIX_0,
18897deb 808 MOD_VEX_0F12_PREFIX_2,
592a252b
L
809 MOD_VEX_0F13,
810 MOD_VEX_0F16_PREFIX_0,
18897deb 811 MOD_VEX_0F16_PREFIX_2,
592a252b
L
812 MOD_VEX_0F17,
813 MOD_VEX_0F2B,
ab4e4ed5
AF
814 MOD_VEX_W_0_0F41_P_0_LEN_1,
815 MOD_VEX_W_1_0F41_P_0_LEN_1,
816 MOD_VEX_W_0_0F41_P_2_LEN_1,
817 MOD_VEX_W_1_0F41_P_2_LEN_1,
818 MOD_VEX_W_0_0F42_P_0_LEN_1,
819 MOD_VEX_W_1_0F42_P_0_LEN_1,
820 MOD_VEX_W_0_0F42_P_2_LEN_1,
821 MOD_VEX_W_1_0F42_P_2_LEN_1,
822 MOD_VEX_W_0_0F44_P_0_LEN_1,
823 MOD_VEX_W_1_0F44_P_0_LEN_1,
824 MOD_VEX_W_0_0F44_P_2_LEN_1,
825 MOD_VEX_W_1_0F44_P_2_LEN_1,
826 MOD_VEX_W_0_0F45_P_0_LEN_1,
827 MOD_VEX_W_1_0F45_P_0_LEN_1,
828 MOD_VEX_W_0_0F45_P_2_LEN_1,
829 MOD_VEX_W_1_0F45_P_2_LEN_1,
830 MOD_VEX_W_0_0F46_P_0_LEN_1,
831 MOD_VEX_W_1_0F46_P_0_LEN_1,
832 MOD_VEX_W_0_0F46_P_2_LEN_1,
833 MOD_VEX_W_1_0F46_P_2_LEN_1,
834 MOD_VEX_W_0_0F47_P_0_LEN_1,
835 MOD_VEX_W_1_0F47_P_0_LEN_1,
836 MOD_VEX_W_0_0F47_P_2_LEN_1,
837 MOD_VEX_W_1_0F47_P_2_LEN_1,
838 MOD_VEX_W_0_0F4A_P_0_LEN_1,
839 MOD_VEX_W_1_0F4A_P_0_LEN_1,
840 MOD_VEX_W_0_0F4A_P_2_LEN_1,
841 MOD_VEX_W_1_0F4A_P_2_LEN_1,
842 MOD_VEX_W_0_0F4B_P_0_LEN_1,
843 MOD_VEX_W_1_0F4B_P_0_LEN_1,
844 MOD_VEX_W_0_0F4B_P_2_LEN_1,
592a252b
L
845 MOD_VEX_0F50,
846 MOD_VEX_0F71_REG_2,
847 MOD_VEX_0F71_REG_4,
848 MOD_VEX_0F71_REG_6,
849 MOD_VEX_0F72_REG_2,
850 MOD_VEX_0F72_REG_4,
851 MOD_VEX_0F72_REG_6,
852 MOD_VEX_0F73_REG_2,
853 MOD_VEX_0F73_REG_3,
854 MOD_VEX_0F73_REG_6,
855 MOD_VEX_0F73_REG_7,
ab4e4ed5
AF
856 MOD_VEX_W_0_0F91_P_0_LEN_0,
857 MOD_VEX_W_1_0F91_P_0_LEN_0,
858 MOD_VEX_W_0_0F91_P_2_LEN_0,
859 MOD_VEX_W_1_0F91_P_2_LEN_0,
860 MOD_VEX_W_0_0F92_P_0_LEN_0,
861 MOD_VEX_W_0_0F92_P_2_LEN_0,
58a211d2 862 MOD_VEX_0F92_P_3_LEN_0,
ab4e4ed5
AF
863 MOD_VEX_W_0_0F93_P_0_LEN_0,
864 MOD_VEX_W_0_0F93_P_2_LEN_0,
58a211d2 865 MOD_VEX_0F93_P_3_LEN_0,
ab4e4ed5
AF
866 MOD_VEX_W_0_0F98_P_0_LEN_0,
867 MOD_VEX_W_1_0F98_P_0_LEN_0,
868 MOD_VEX_W_0_0F98_P_2_LEN_0,
869 MOD_VEX_W_1_0F98_P_2_LEN_0,
870 MOD_VEX_W_0_0F99_P_0_LEN_0,
871 MOD_VEX_W_1_0F99_P_0_LEN_0,
872 MOD_VEX_W_0_0F99_P_2_LEN_0,
873 MOD_VEX_W_1_0F99_P_2_LEN_0,
592a252b
L
874 MOD_VEX_0FAE_REG_2,
875 MOD_VEX_0FAE_REG_3,
7531c613
JB
876 MOD_VEX_0FD7,
877 MOD_VEX_0FE7,
592a252b 878 MOD_VEX_0FF0_PREFIX_3,
7531c613
JB
879 MOD_VEX_0F381A,
880 MOD_VEX_0F382A,
881 MOD_VEX_0F382C,
882 MOD_VEX_0F382D,
883 MOD_VEX_0F382E,
884 MOD_VEX_0F382F,
09d73035
CL
885 MOD_VEX_0F3849_X86_64_P_0_W_0,
886 MOD_VEX_0F3849_X86_64_P_2_W_0,
887 MOD_VEX_0F3849_X86_64_P_3_W_0,
888 MOD_VEX_0F384B_X86_64_P_1_W_0,
889 MOD_VEX_0F384B_X86_64_P_2_W_0,
890 MOD_VEX_0F384B_X86_64_P_3_W_0,
7531c613 891 MOD_VEX_0F385A,
09d73035
CL
892 MOD_VEX_0F385C_X86_64_P_1_W_0,
893 MOD_VEX_0F385E_X86_64_P_0_W_0,
894 MOD_VEX_0F385E_X86_64_P_1_W_0,
895 MOD_VEX_0F385E_X86_64_P_2_W_0,
896 MOD_VEX_0F385E_X86_64_P_3_W_0,
7531c613
JB
897 MOD_VEX_0F388C,
898 MOD_VEX_0F388E,
bb5b3501
JB
899 MOD_VEX_0F3A30_L_0,
900 MOD_VEX_0F3A31_L_0,
901 MOD_VEX_0F3A32_L_0,
902 MOD_VEX_0F3A33_L_0,
43234a1e 903
467bbef0
JB
904 MOD_VEX_0FXOP_09_12,
905
43234a1e 906 MOD_EVEX_0F12_PREFIX_0,
97e6786a
JB
907 MOD_EVEX_0F12_PREFIX_2,
908 MOD_EVEX_0F13,
43234a1e 909 MOD_EVEX_0F16_PREFIX_0,
97e6786a
JB
910 MOD_EVEX_0F16_PREFIX_2,
911 MOD_EVEX_0F17,
912 MOD_EVEX_0F2B,
7531c613
JB
913 MOD_EVEX_0F381A_W_0,
914 MOD_EVEX_0F381A_W_1,
915 MOD_EVEX_0F381B_W_0,
916 MOD_EVEX_0F381B_W_1,
464d2b65
JB
917 MOD_EVEX_0F3828_P_1,
918 MOD_EVEX_0F382A_P_1_W_1,
919 MOD_EVEX_0F3838_P_1,
920 MOD_EVEX_0F383A_P_1_W_0,
7531c613
JB
921 MOD_EVEX_0F385A_W_0,
922 MOD_EVEX_0F385A_W_1,
923 MOD_EVEX_0F385B_W_0,
924 MOD_EVEX_0F385B_W_1,
464d2b65
JB
925 MOD_EVEX_0F387A_W_0,
926 MOD_EVEX_0F387B_W_0,
927 MOD_EVEX_0F387C,
43234a1e
L
928 MOD_EVEX_0F38C6_REG_1,
929 MOD_EVEX_0F38C6_REG_2,
930 MOD_EVEX_0F38C6_REG_5,
931 MOD_EVEX_0F38C6_REG_6,
932 MOD_EVEX_0F38C7_REG_1,
933 MOD_EVEX_0F38C7_REG_2,
934 MOD_EVEX_0F38C7_REG_5,
935 MOD_EVEX_0F38C7_REG_6
51e7da1b 936};
1ceb70f8 937
51e7da1b
L
938enum
939{
42164a71
L
940 RM_C6_REG_7 = 0,
941 RM_C7_REG_7,
942 RM_0F01_REG_0,
3873ba12
L
943 RM_0F01_REG_1,
944 RM_0F01_REG_2,
945 RM_0F01_REG_3,
f8687e93
JB
946 RM_0F01_REG_5_MOD_3,
947 RM_0F01_REG_7_MOD_3,
948 RM_0F1E_P_1_MOD_3_REG_7,
c1fa250a 949 RM_0F3A0F_P_1_MOD_3_REG_0,
f8687e93
JB
950 RM_0FAE_REG_6_MOD_3_P_0,
951 RM_0FAE_REG_7_MOD_3,
260cd341 952 RM_VEX_0F3849_X86_64_P_0_W_0_M_1_R_0
51e7da1b 953};
1ceb70f8 954
51e7da1b
L
955enum
956{
957 PREFIX_90 = 0,
81d54bb7
CL
958 PREFIX_0F01_REG_1_RM_4,
959 PREFIX_0F01_REG_1_RM_5,
960 PREFIX_0F01_REG_1_RM_6,
961 PREFIX_0F01_REG_1_RM_7,
a847e322 962 PREFIX_0F01_REG_3_RM_1,
f8687e93
JB
963 PREFIX_0F01_REG_5_MOD_0,
964 PREFIX_0F01_REG_5_MOD_3_RM_0,
bb651e8b 965 PREFIX_0F01_REG_5_MOD_3_RM_1,
f8687e93 966 PREFIX_0F01_REG_5_MOD_3_RM_2,
f64c42a9
LC
967 PREFIX_0F01_REG_5_MOD_3_RM_4,
968 PREFIX_0F01_REG_5_MOD_3_RM_5,
969 PREFIX_0F01_REG_5_MOD_3_RM_6,
970 PREFIX_0F01_REG_5_MOD_3_RM_7,
267b8516 971 PREFIX_0F01_REG_7_MOD_3_RM_2,
646cc3e0
GG
972 PREFIX_0F01_REG_7_MOD_3_RM_6,
973 PREFIX_0F01_REG_7_MOD_3_RM_7,
3233d7d0 974 PREFIX_0F09,
3873ba12
L
975 PREFIX_0F10,
976 PREFIX_0F11,
977 PREFIX_0F12,
978 PREFIX_0F16,
7e8b059b
L
979 PREFIX_0F1A,
980 PREFIX_0F1B,
c48935d7 981 PREFIX_0F1C,
603555e5 982 PREFIX_0F1E,
3873ba12
L
983 PREFIX_0F2A,
984 PREFIX_0F2B,
985 PREFIX_0F2C,
986 PREFIX_0F2D,
987 PREFIX_0F2E,
988 PREFIX_0F2F,
989 PREFIX_0F51,
990 PREFIX_0F52,
991 PREFIX_0F53,
992 PREFIX_0F58,
993 PREFIX_0F59,
994 PREFIX_0F5A,
995 PREFIX_0F5B,
996 PREFIX_0F5C,
997 PREFIX_0F5D,
998 PREFIX_0F5E,
999 PREFIX_0F5F,
1000 PREFIX_0F60,
1001 PREFIX_0F61,
1002 PREFIX_0F62,
3873ba12
L
1003 PREFIX_0F6F,
1004 PREFIX_0F70,
3873ba12
L
1005 PREFIX_0F78,
1006 PREFIX_0F79,
1007 PREFIX_0F7C,
1008 PREFIX_0F7D,
1009 PREFIX_0F7E,
1010 PREFIX_0F7F,
f8687e93
JB
1011 PREFIX_0FAE_REG_0_MOD_3,
1012 PREFIX_0FAE_REG_1_MOD_3,
1013 PREFIX_0FAE_REG_2_MOD_3,
1014 PREFIX_0FAE_REG_3_MOD_3,
1015 PREFIX_0FAE_REG_4_MOD_0,
1016 PREFIX_0FAE_REG_4_MOD_3,
f8687e93
JB
1017 PREFIX_0FAE_REG_5_MOD_3,
1018 PREFIX_0FAE_REG_6_MOD_0,
1019 PREFIX_0FAE_REG_6_MOD_3,
1020 PREFIX_0FAE_REG_7_MOD_0,
3873ba12 1021 PREFIX_0FB8,
f12dc422 1022 PREFIX_0FBC,
3873ba12
L
1023 PREFIX_0FBD,
1024 PREFIX_0FC2,
f8687e93
JB
1025 PREFIX_0FC7_REG_6_MOD_0,
1026 PREFIX_0FC7_REG_6_MOD_3,
1027 PREFIX_0FC7_REG_7_MOD_3,
3873ba12
L
1028 PREFIX_0FD0,
1029 PREFIX_0FD6,
1030 PREFIX_0FE6,
1031 PREFIX_0FE7,
1032 PREFIX_0FF0,
1033 PREFIX_0FF7,
c4694f17
TG
1034 PREFIX_0F38D8,
1035 PREFIX_0F38DC,
1036 PREFIX_0F38DD,
1037 PREFIX_0F38DE,
1038 PREFIX_0F38DF,
3873ba12
L
1039 PREFIX_0F38F0,
1040 PREFIX_0F38F1,
e2e1fcde 1041 PREFIX_0F38F6,
c0a30a9f 1042 PREFIX_0F38F8,
c4694f17
TG
1043 PREFIX_0F38FA,
1044 PREFIX_0F38FB,
c1fa250a 1045 PREFIX_0F3A0F,
592a252b
L
1046 PREFIX_VEX_0F10,
1047 PREFIX_VEX_0F11,
1048 PREFIX_VEX_0F12,
1049 PREFIX_VEX_0F16,
1050 PREFIX_VEX_0F2A,
1051 PREFIX_VEX_0F2C,
1052 PREFIX_VEX_0F2D,
1053 PREFIX_VEX_0F2E,
1054 PREFIX_VEX_0F2F,
43234a1e
L
1055 PREFIX_VEX_0F41,
1056 PREFIX_VEX_0F42,
1057 PREFIX_VEX_0F44,
1058 PREFIX_VEX_0F45,
1059 PREFIX_VEX_0F46,
1060 PREFIX_VEX_0F47,
1ba585e8 1061 PREFIX_VEX_0F4A,
43234a1e 1062 PREFIX_VEX_0F4B,
592a252b
L
1063 PREFIX_VEX_0F51,
1064 PREFIX_VEX_0F52,
1065 PREFIX_VEX_0F53,
1066 PREFIX_VEX_0F58,
1067 PREFIX_VEX_0F59,
1068 PREFIX_VEX_0F5A,
1069 PREFIX_VEX_0F5B,
1070 PREFIX_VEX_0F5C,
1071 PREFIX_VEX_0F5D,
1072 PREFIX_VEX_0F5E,
1073 PREFIX_VEX_0F5F,
592a252b
L
1074 PREFIX_VEX_0F6F,
1075 PREFIX_VEX_0F70,
592a252b
L
1076 PREFIX_VEX_0F7C,
1077 PREFIX_VEX_0F7D,
1078 PREFIX_VEX_0F7E,
1079 PREFIX_VEX_0F7F,
43234a1e
L
1080 PREFIX_VEX_0F90,
1081 PREFIX_VEX_0F91,
1082 PREFIX_VEX_0F92,
1083 PREFIX_VEX_0F93,
1084 PREFIX_VEX_0F98,
1ba585e8 1085 PREFIX_VEX_0F99,
592a252b 1086 PREFIX_VEX_0FC2,
592a252b 1087 PREFIX_VEX_0FD0,
592a252b 1088 PREFIX_VEX_0FE6,
592a252b 1089 PREFIX_VEX_0FF0,
260cd341
LC
1090 PREFIX_VEX_0F3849_X86_64,
1091 PREFIX_VEX_0F384B_X86_64,
260cd341
LC
1092 PREFIX_VEX_0F385C_X86_64,
1093 PREFIX_VEX_0F385E_X86_64,
6c30d220
L
1094 PREFIX_VEX_0F38F5,
1095 PREFIX_VEX_0F38F6,
f12dc422 1096 PREFIX_VEX_0F38F7,
43234a1e
L
1097 PREFIX_VEX_0F3AF0,
1098
1099 PREFIX_EVEX_0F10,
1100 PREFIX_EVEX_0F11,
1101 PREFIX_EVEX_0F12,
43234a1e 1102 PREFIX_EVEX_0F16,
43234a1e 1103 PREFIX_EVEX_0F2A,
43234a1e
L
1104 PREFIX_EVEX_0F51,
1105 PREFIX_EVEX_0F58,
1106 PREFIX_EVEX_0F59,
1107 PREFIX_EVEX_0F5A,
1108 PREFIX_EVEX_0F5B,
1109 PREFIX_EVEX_0F5C,
1110 PREFIX_EVEX_0F5D,
1111 PREFIX_EVEX_0F5E,
1112 PREFIX_EVEX_0F5F,
43234a1e
L
1113 PREFIX_EVEX_0F6F,
1114 PREFIX_EVEX_0F70,
43234a1e
L
1115 PREFIX_EVEX_0F78,
1116 PREFIX_EVEX_0F79,
1117 PREFIX_EVEX_0F7A,
1118 PREFIX_EVEX_0F7B,
1119 PREFIX_EVEX_0F7E,
1120 PREFIX_EVEX_0F7F,
1121 PREFIX_EVEX_0FC2,
43234a1e 1122 PREFIX_EVEX_0FE6,
1ba585e8 1123 PREFIX_EVEX_0F3810,
43234a1e
L
1124 PREFIX_EVEX_0F3811,
1125 PREFIX_EVEX_0F3812,
1126 PREFIX_EVEX_0F3813,
1127 PREFIX_EVEX_0F3814,
1128 PREFIX_EVEX_0F3815,
1ba585e8 1129 PREFIX_EVEX_0F3820,
43234a1e
L
1130 PREFIX_EVEX_0F3821,
1131 PREFIX_EVEX_0F3822,
1132 PREFIX_EVEX_0F3823,
1133 PREFIX_EVEX_0F3824,
1134 PREFIX_EVEX_0F3825,
1ba585e8 1135 PREFIX_EVEX_0F3826,
43234a1e
L
1136 PREFIX_EVEX_0F3827,
1137 PREFIX_EVEX_0F3828,
1138 PREFIX_EVEX_0F3829,
1139 PREFIX_EVEX_0F382A,
1ba585e8 1140 PREFIX_EVEX_0F3830,
43234a1e
L
1141 PREFIX_EVEX_0F3831,
1142 PREFIX_EVEX_0F3832,
1143 PREFIX_EVEX_0F3833,
1144 PREFIX_EVEX_0F3834,
1145 PREFIX_EVEX_0F3835,
1ba585e8 1146 PREFIX_EVEX_0F3838,
43234a1e
L
1147 PREFIX_EVEX_0F3839,
1148 PREFIX_EVEX_0F383A,
47acf0bd
IT
1149 PREFIX_EVEX_0F3852,
1150 PREFIX_EVEX_0F3853,
9186c494 1151 PREFIX_EVEX_0F3868,
53467f57 1152 PREFIX_EVEX_0F3872,
43234a1e
L
1153 PREFIX_EVEX_0F389A,
1154 PREFIX_EVEX_0F389B,
43234a1e
L
1155 PREFIX_EVEX_0F38AA,
1156 PREFIX_EVEX_0F38AB,
51e7da1b 1157};
4e7d34a6 1158
51e7da1b
L
1159enum
1160{
1161 X86_64_06 = 0,
3873ba12 1162 X86_64_07,
1673df32 1163 X86_64_0E,
3873ba12
L
1164 X86_64_16,
1165 X86_64_17,
1166 X86_64_1E,
1167 X86_64_1F,
1168 X86_64_27,
1169 X86_64_2F,
1170 X86_64_37,
1171 X86_64_3F,
1172 X86_64_60,
1173 X86_64_61,
1174 X86_64_62,
1175 X86_64_63,
1176 X86_64_6D,
1177 X86_64_6F,
d039fef3 1178 X86_64_82,
3873ba12 1179 X86_64_9A,
aeab2b26
JB
1180 X86_64_C2,
1181 X86_64_C3,
3873ba12
L
1182 X86_64_C4,
1183 X86_64_C5,
1184 X86_64_CE,
1185 X86_64_D4,
1186 X86_64_D5,
a72d2af2
L
1187 X86_64_E8,
1188 X86_64_E9,
3873ba12
L
1189 X86_64_EA,
1190 X86_64_0F01_REG_0,
1191 X86_64_0F01_REG_1,
81d54bb7
CL
1192 X86_64_0F01_REG_1_RM_5_PREFIX_2,
1193 X86_64_0F01_REG_1_RM_6_PREFIX_2,
1194 X86_64_0F01_REG_1_RM_7_PREFIX_2,
3873ba12 1195 X86_64_0F01_REG_2,
260cd341 1196 X86_64_0F01_REG_3,
78467458
JB
1197 X86_64_0F24,
1198 X86_64_0F26,
260cd341
LC
1199 X86_64_VEX_0F3849,
1200 X86_64_VEX_0F384B,
1201 X86_64_VEX_0F385C,
f64c42a9
LC
1202 X86_64_VEX_0F385E,
1203 X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1,
1204 X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1,
1205 X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1,
1206 X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1,
646cc3e0
GG
1207 X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1,
1208 X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3,
1209 X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1,
f64c42a9 1210 X86_64_0FC7_REG_6_MOD_3_PREFIX_1
51e7da1b 1211};
4e7d34a6 1212
51e7da1b
L
1213enum
1214{
1215 THREE_BYTE_0F38 = 0,
1f334aeb 1216 THREE_BYTE_0F3A
51e7da1b 1217};
4e7d34a6 1218
f88c9eb0
SP
1219enum
1220{
5dd85c99
SP
1221 XOP_08 = 0,
1222 XOP_09,
f88c9eb0
SP
1223 XOP_0A
1224};
1225
51e7da1b
L
1226enum
1227{
1228 VEX_0F = 0,
3873ba12
L
1229 VEX_0F38,
1230 VEX_0F3A
51e7da1b 1231};
c0f3af97 1232
43234a1e
L
1233enum
1234{
1235 EVEX_0F = 0,
1236 EVEX_0F38,
1237 EVEX_0F3A
1238};
1239
51e7da1b
L
1240enum
1241{
ec6f095a 1242 VEX_LEN_0F12_P_0_M_0 = 0,
592a252b 1243 VEX_LEN_0F12_P_0_M_1,
18897deb 1244#define VEX_LEN_0F12_P_2_M_0 VEX_LEN_0F12_P_0_M_0
592a252b
L
1245 VEX_LEN_0F13_M_0,
1246 VEX_LEN_0F16_P_0_M_0,
1247 VEX_LEN_0F16_P_0_M_1,
18897deb 1248#define VEX_LEN_0F16_P_2_M_0 VEX_LEN_0F16_P_0_M_0
592a252b 1249 VEX_LEN_0F17_M_0,
43234a1e 1250 VEX_LEN_0F41_P_0,
1ba585e8 1251 VEX_LEN_0F41_P_2,
43234a1e 1252 VEX_LEN_0F42_P_0,
1ba585e8 1253 VEX_LEN_0F42_P_2,
43234a1e 1254 VEX_LEN_0F44_P_0,
1ba585e8 1255 VEX_LEN_0F44_P_2,
43234a1e 1256 VEX_LEN_0F45_P_0,
1ba585e8 1257 VEX_LEN_0F45_P_2,
43234a1e 1258 VEX_LEN_0F46_P_0,
1ba585e8 1259 VEX_LEN_0F46_P_2,
43234a1e 1260 VEX_LEN_0F47_P_0,
1ba585e8
IT
1261 VEX_LEN_0F47_P_2,
1262 VEX_LEN_0F4A_P_0,
1263 VEX_LEN_0F4A_P_2,
1264 VEX_LEN_0F4B_P_0,
43234a1e 1265 VEX_LEN_0F4B_P_2,
7531c613 1266 VEX_LEN_0F6E,
035e7389 1267 VEX_LEN_0F77,
592a252b
L
1268 VEX_LEN_0F7E_P_1,
1269 VEX_LEN_0F7E_P_2,
43234a1e 1270 VEX_LEN_0F90_P_0,
1ba585e8 1271 VEX_LEN_0F90_P_2,
43234a1e 1272 VEX_LEN_0F91_P_0,
1ba585e8 1273 VEX_LEN_0F91_P_2,
43234a1e 1274 VEX_LEN_0F92_P_0,
90a915bf 1275 VEX_LEN_0F92_P_2,
1ba585e8 1276 VEX_LEN_0F92_P_3,
43234a1e 1277 VEX_LEN_0F93_P_0,
90a915bf 1278 VEX_LEN_0F93_P_2,
1ba585e8 1279 VEX_LEN_0F93_P_3,
43234a1e 1280 VEX_LEN_0F98_P_0,
1ba585e8
IT
1281 VEX_LEN_0F98_P_2,
1282 VEX_LEN_0F99_P_0,
1283 VEX_LEN_0F99_P_2,
592a252b
L
1284 VEX_LEN_0FAE_R_2_M_0,
1285 VEX_LEN_0FAE_R_3_M_0,
7531c613
JB
1286 VEX_LEN_0FC4,
1287 VEX_LEN_0FC5,
1288 VEX_LEN_0FD6,
1289 VEX_LEN_0FF7,
1290 VEX_LEN_0F3816,
1291 VEX_LEN_0F3819,
1292 VEX_LEN_0F381A_M_0,
1293 VEX_LEN_0F3836,
1294 VEX_LEN_0F3841,
260cd341
LC
1295 VEX_LEN_0F3849_X86_64_P_0_W_0_M_0,
1296 VEX_LEN_0F3849_X86_64_P_0_W_0_M_1_REG_0_RM_0,
1297 VEX_LEN_0F3849_X86_64_P_2_W_0_M_0,
1298 VEX_LEN_0F3849_X86_64_P_3_W_0_M_0,
1299 VEX_LEN_0F384B_X86_64_P_1_W_0_M_0,
1300 VEX_LEN_0F384B_X86_64_P_2_W_0_M_0,
1301 VEX_LEN_0F384B_X86_64_P_3_W_0_M_0,
7531c613 1302 VEX_LEN_0F385A_M_0,
260cd341
LC
1303 VEX_LEN_0F385C_X86_64_P_1_W_0_M_0,
1304 VEX_LEN_0F385E_X86_64_P_0_W_0_M_0,
1305 VEX_LEN_0F385E_X86_64_P_1_W_0_M_0,
1306 VEX_LEN_0F385E_X86_64_P_2_W_0_M_0,
1307 VEX_LEN_0F385E_X86_64_P_3_W_0_M_0,
7531c613 1308 VEX_LEN_0F38DB,
035e7389
JB
1309 VEX_LEN_0F38F2,
1310 VEX_LEN_0F38F3_R_1,
1311 VEX_LEN_0F38F3_R_2,
1312 VEX_LEN_0F38F3_R_3,
6c30d220
L
1313 VEX_LEN_0F38F5_P_0,
1314 VEX_LEN_0F38F5_P_1,
1315 VEX_LEN_0F38F5_P_3,
1316 VEX_LEN_0F38F6_P_3,
f12dc422 1317 VEX_LEN_0F38F7_P_0,
6c30d220
L
1318 VEX_LEN_0F38F7_P_1,
1319 VEX_LEN_0F38F7_P_2,
1320 VEX_LEN_0F38F7_P_3,
7531c613
JB
1321 VEX_LEN_0F3A00,
1322 VEX_LEN_0F3A01,
1323 VEX_LEN_0F3A06,
1324 VEX_LEN_0F3A14,
1325 VEX_LEN_0F3A15,
1326 VEX_LEN_0F3A16,
1327 VEX_LEN_0F3A17,
1328 VEX_LEN_0F3A18,
1329 VEX_LEN_0F3A19,
1330 VEX_LEN_0F3A20,
1331 VEX_LEN_0F3A21,
1332 VEX_LEN_0F3A22,
1333 VEX_LEN_0F3A30,
1334 VEX_LEN_0F3A31,
1335 VEX_LEN_0F3A32,
1336 VEX_LEN_0F3A33,
1337 VEX_LEN_0F3A38,
1338 VEX_LEN_0F3A39,
1339 VEX_LEN_0F3A41,
1340 VEX_LEN_0F3A46,
1341 VEX_LEN_0F3A60,
1342 VEX_LEN_0F3A61,
1343 VEX_LEN_0F3A62,
1344 VEX_LEN_0F3A63,
1345 VEX_LEN_0F3ADF,
6c30d220 1346 VEX_LEN_0F3AF0_P_3,
467bbef0
JB
1347 VEX_LEN_0FXOP_08_85,
1348 VEX_LEN_0FXOP_08_86,
1349 VEX_LEN_0FXOP_08_87,
1350 VEX_LEN_0FXOP_08_8E,
1351 VEX_LEN_0FXOP_08_8F,
1352 VEX_LEN_0FXOP_08_95,
1353 VEX_LEN_0FXOP_08_96,
1354 VEX_LEN_0FXOP_08_97,
1355 VEX_LEN_0FXOP_08_9E,
1356 VEX_LEN_0FXOP_08_9F,
1357 VEX_LEN_0FXOP_08_A3,
1358 VEX_LEN_0FXOP_08_A6,
1359 VEX_LEN_0FXOP_08_B6,
1360 VEX_LEN_0FXOP_08_C0,
1361 VEX_LEN_0FXOP_08_C1,
1362 VEX_LEN_0FXOP_08_C2,
1363 VEX_LEN_0FXOP_08_C3,
ff688e1f
L
1364 VEX_LEN_0FXOP_08_CC,
1365 VEX_LEN_0FXOP_08_CD,
1366 VEX_LEN_0FXOP_08_CE,
1367 VEX_LEN_0FXOP_08_CF,
1368 VEX_LEN_0FXOP_08_EC,
1369 VEX_LEN_0FXOP_08_ED,
1370 VEX_LEN_0FXOP_08_EE,
1371 VEX_LEN_0FXOP_08_EF,
467bbef0
JB
1372 VEX_LEN_0FXOP_09_01,
1373 VEX_LEN_0FXOP_09_02,
1374 VEX_LEN_0FXOP_09_12_M_1,
b5b098c2
JB
1375 VEX_LEN_0FXOP_09_82_W_0,
1376 VEX_LEN_0FXOP_09_83_W_0,
467bbef0
JB
1377 VEX_LEN_0FXOP_09_90,
1378 VEX_LEN_0FXOP_09_91,
1379 VEX_LEN_0FXOP_09_92,
1380 VEX_LEN_0FXOP_09_93,
1381 VEX_LEN_0FXOP_09_94,
1382 VEX_LEN_0FXOP_09_95,
1383 VEX_LEN_0FXOP_09_96,
1384 VEX_LEN_0FXOP_09_97,
1385 VEX_LEN_0FXOP_09_98,
1386 VEX_LEN_0FXOP_09_99,
1387 VEX_LEN_0FXOP_09_9A,
1388 VEX_LEN_0FXOP_09_9B,
1389 VEX_LEN_0FXOP_09_C1,
1390 VEX_LEN_0FXOP_09_C2,
1391 VEX_LEN_0FXOP_09_C3,
1392 VEX_LEN_0FXOP_09_C6,
1393 VEX_LEN_0FXOP_09_C7,
1394 VEX_LEN_0FXOP_09_CB,
1395 VEX_LEN_0FXOP_09_D1,
1396 VEX_LEN_0FXOP_09_D2,
1397 VEX_LEN_0FXOP_09_D3,
1398 VEX_LEN_0FXOP_09_D6,
1399 VEX_LEN_0FXOP_09_D7,
1400 VEX_LEN_0FXOP_09_DB,
1401 VEX_LEN_0FXOP_09_E1,
1402 VEX_LEN_0FXOP_09_E2,
1403 VEX_LEN_0FXOP_09_E3,
1404 VEX_LEN_0FXOP_0A_12,
51e7da1b 1405};
c0f3af97 1406
04e2a182
L
1407enum
1408{
7531c613 1409 EVEX_LEN_0F6E = 0,
04e2a182
L
1410 EVEX_LEN_0F7E_P_1,
1411 EVEX_LEN_0F7E_P_2,
7531c613
JB
1412 EVEX_LEN_0FC4,
1413 EVEX_LEN_0FC5,
1414 EVEX_LEN_0FD6,
1415 EVEX_LEN_0F3816,
1416 EVEX_LEN_0F3819_W_0,
1417 EVEX_LEN_0F3819_W_1,
1418 EVEX_LEN_0F381A_W_0_M_0,
1419 EVEX_LEN_0F381A_W_1_M_0,
1420 EVEX_LEN_0F381B_W_0_M_0,
1421 EVEX_LEN_0F381B_W_1_M_0,
1422 EVEX_LEN_0F3836,
1423 EVEX_LEN_0F385A_W_0_M_0,
1424 EVEX_LEN_0F385A_W_1_M_0,
1425 EVEX_LEN_0F385B_W_0_M_0,
1426 EVEX_LEN_0F385B_W_1_M_0,
1427 EVEX_LEN_0F38C6_R_1_M_0,
1428 EVEX_LEN_0F38C6_R_2_M_0,
1429 EVEX_LEN_0F38C6_R_5_M_0,
1430 EVEX_LEN_0F38C6_R_6_M_0,
1431 EVEX_LEN_0F38C7_R_1_M_0_W_0,
1432 EVEX_LEN_0F38C7_R_1_M_0_W_1,
1433 EVEX_LEN_0F38C7_R_2_M_0_W_0,
1434 EVEX_LEN_0F38C7_R_2_M_0_W_1,
1435 EVEX_LEN_0F38C7_R_5_M_0_W_0,
1436 EVEX_LEN_0F38C7_R_5_M_0_W_1,
1437 EVEX_LEN_0F38C7_R_6_M_0_W_0,
1438 EVEX_LEN_0F38C7_R_6_M_0_W_1,
1439 EVEX_LEN_0F3A00_W_1,
1440 EVEX_LEN_0F3A01_W_1,
1441 EVEX_LEN_0F3A14,
1442 EVEX_LEN_0F3A15,
1443 EVEX_LEN_0F3A16,
1444 EVEX_LEN_0F3A17,
1445 EVEX_LEN_0F3A18_W_0,
1446 EVEX_LEN_0F3A18_W_1,
1447 EVEX_LEN_0F3A19_W_0,
1448 EVEX_LEN_0F3A19_W_1,
1449 EVEX_LEN_0F3A1A_W_0,
1450 EVEX_LEN_0F3A1A_W_1,
1451 EVEX_LEN_0F3A1B_W_0,
1452 EVEX_LEN_0F3A1B_W_1,
1453 EVEX_LEN_0F3A20,
1454 EVEX_LEN_0F3A21_W_0,
1455 EVEX_LEN_0F3A22,
1456 EVEX_LEN_0F3A23_W_0,
1457 EVEX_LEN_0F3A23_W_1,
1458 EVEX_LEN_0F3A38_W_0,
1459 EVEX_LEN_0F3A38_W_1,
1460 EVEX_LEN_0F3A39_W_0,
1461 EVEX_LEN_0F3A39_W_1,
1462 EVEX_LEN_0F3A3A_W_0,
1463 EVEX_LEN_0F3A3A_W_1,
1464 EVEX_LEN_0F3A3B_W_0,
1465 EVEX_LEN_0F3A3B_W_1,
1466 EVEX_LEN_0F3A43_W_0,
1467 EVEX_LEN_0F3A43_W_1
04e2a182
L
1468};
1469
9e30b8e0
L
1470enum
1471{
ec6f095a 1472 VEX_W_0F41_P_0_LEN_1 = 0,
1ba585e8 1473 VEX_W_0F41_P_2_LEN_1,
43234a1e 1474 VEX_W_0F42_P_0_LEN_1,
1ba585e8 1475 VEX_W_0F42_P_2_LEN_1,
43234a1e 1476 VEX_W_0F44_P_0_LEN_0,
1ba585e8 1477 VEX_W_0F44_P_2_LEN_0,
43234a1e 1478 VEX_W_0F45_P_0_LEN_1,
1ba585e8 1479 VEX_W_0F45_P_2_LEN_1,
43234a1e 1480 VEX_W_0F46_P_0_LEN_1,
1ba585e8 1481 VEX_W_0F46_P_2_LEN_1,
43234a1e 1482 VEX_W_0F47_P_0_LEN_1,
1ba585e8
IT
1483 VEX_W_0F47_P_2_LEN_1,
1484 VEX_W_0F4A_P_0_LEN_1,
1485 VEX_W_0F4A_P_2_LEN_1,
1486 VEX_W_0F4B_P_0_LEN_1,
43234a1e 1487 VEX_W_0F4B_P_2_LEN_1,
43234a1e 1488 VEX_W_0F90_P_0_LEN_0,
1ba585e8 1489 VEX_W_0F90_P_2_LEN_0,
43234a1e 1490 VEX_W_0F91_P_0_LEN_0,
1ba585e8 1491 VEX_W_0F91_P_2_LEN_0,
43234a1e 1492 VEX_W_0F92_P_0_LEN_0,
90a915bf 1493 VEX_W_0F92_P_2_LEN_0,
43234a1e 1494 VEX_W_0F93_P_0_LEN_0,
90a915bf 1495 VEX_W_0F93_P_2_LEN_0,
43234a1e 1496 VEX_W_0F98_P_0_LEN_0,
1ba585e8
IT
1497 VEX_W_0F98_P_2_LEN_0,
1498 VEX_W_0F99_P_0_LEN_0,
1499 VEX_W_0F99_P_2_LEN_0,
7531c613
JB
1500 VEX_W_0F380C,
1501 VEX_W_0F380D,
1502 VEX_W_0F380E,
1503 VEX_W_0F380F,
1504 VEX_W_0F3813,
1505 VEX_W_0F3816_L_1,
1506 VEX_W_0F3818,
1507 VEX_W_0F3819_L_1,
1508 VEX_W_0F381A_M_0_L_1,
1509 VEX_W_0F382C_M_0,
1510 VEX_W_0F382D_M_0,
1511 VEX_W_0F382E_M_0,
1512 VEX_W_0F382F_M_0,
1513 VEX_W_0F3836,
1514 VEX_W_0F3846,
260cd341
LC
1515 VEX_W_0F3849_X86_64_P_0,
1516 VEX_W_0F3849_X86_64_P_2,
1517 VEX_W_0F3849_X86_64_P_3,
1518 VEX_W_0F384B_X86_64_P_1,
1519 VEX_W_0F384B_X86_64_P_2,
1520 VEX_W_0F384B_X86_64_P_3,
58bf9b6a
L
1521 VEX_W_0F3850,
1522 VEX_W_0F3851,
1523 VEX_W_0F3852,
1524 VEX_W_0F3853,
7531c613
JB
1525 VEX_W_0F3858,
1526 VEX_W_0F3859,
1527 VEX_W_0F385A_M_0_L_0,
260cd341
LC
1528 VEX_W_0F385C_X86_64_P_1,
1529 VEX_W_0F385E_X86_64_P_0,
1530 VEX_W_0F385E_X86_64_P_1,
1531 VEX_W_0F385E_X86_64_P_2,
1532 VEX_W_0F385E_X86_64_P_3,
7531c613
JB
1533 VEX_W_0F3878,
1534 VEX_W_0F3879,
1535 VEX_W_0F38CF,
1536 VEX_W_0F3A00_L_1,
1537 VEX_W_0F3A01_L_1,
1538 VEX_W_0F3A02,
1539 VEX_W_0F3A04,
1540 VEX_W_0F3A05,
1541 VEX_W_0F3A06_L_1,
1542 VEX_W_0F3A18_L_1,
1543 VEX_W_0F3A19_L_1,
1544 VEX_W_0F3A1D,
7531c613
JB
1545 VEX_W_0F3A38_L_1,
1546 VEX_W_0F3A39_L_1,
1547 VEX_W_0F3A46_L_1,
1548 VEX_W_0F3A4A,
1549 VEX_W_0F3A4B,
1550 VEX_W_0F3A4C,
1551 VEX_W_0F3ACE,
1552 VEX_W_0F3ACF,
43234a1e 1553
467bbef0
JB
1554 VEX_W_0FXOP_08_85_L_0,
1555 VEX_W_0FXOP_08_86_L_0,
1556 VEX_W_0FXOP_08_87_L_0,
1557 VEX_W_0FXOP_08_8E_L_0,
1558 VEX_W_0FXOP_08_8F_L_0,
1559 VEX_W_0FXOP_08_95_L_0,
1560 VEX_W_0FXOP_08_96_L_0,
1561 VEX_W_0FXOP_08_97_L_0,
1562 VEX_W_0FXOP_08_9E_L_0,
1563 VEX_W_0FXOP_08_9F_L_0,
1564 VEX_W_0FXOP_08_A6_L_0,
1565 VEX_W_0FXOP_08_B6_L_0,
1566 VEX_W_0FXOP_08_C0_L_0,
1567 VEX_W_0FXOP_08_C1_L_0,
1568 VEX_W_0FXOP_08_C2_L_0,
1569 VEX_W_0FXOP_08_C3_L_0,
1570 VEX_W_0FXOP_08_CC_L_0,
1571 VEX_W_0FXOP_08_CD_L_0,
1572 VEX_W_0FXOP_08_CE_L_0,
1573 VEX_W_0FXOP_08_CF_L_0,
1574 VEX_W_0FXOP_08_EC_L_0,
1575 VEX_W_0FXOP_08_ED_L_0,
1576 VEX_W_0FXOP_08_EE_L_0,
1577 VEX_W_0FXOP_08_EF_L_0,
1578
b5b098c2
JB
1579 VEX_W_0FXOP_09_80,
1580 VEX_W_0FXOP_09_81,
1581 VEX_W_0FXOP_09_82,
1582 VEX_W_0FXOP_09_83,
467bbef0
JB
1583 VEX_W_0FXOP_09_C1_L_0,
1584 VEX_W_0FXOP_09_C2_L_0,
1585 VEX_W_0FXOP_09_C3_L_0,
1586 VEX_W_0FXOP_09_C6_L_0,
1587 VEX_W_0FXOP_09_C7_L_0,
1588 VEX_W_0FXOP_09_CB_L_0,
1589 VEX_W_0FXOP_09_D1_L_0,
1590 VEX_W_0FXOP_09_D2_L_0,
1591 VEX_W_0FXOP_09_D3_L_0,
1592 VEX_W_0FXOP_09_D6_L_0,
1593 VEX_W_0FXOP_09_D7_L_0,
1594 VEX_W_0FXOP_09_DB_L_0,
1595 VEX_W_0FXOP_09_E1_L_0,
1596 VEX_W_0FXOP_09_E2_L_0,
1597 VEX_W_0FXOP_09_E3_L_0,
b5b098c2 1598
36cc073e 1599 EVEX_W_0F10_P_1,
36cc073e 1600 EVEX_W_0F10_P_3,
36cc073e 1601 EVEX_W_0F11_P_1,
36cc073e 1602 EVEX_W_0F11_P_3,
43234a1e
L
1603 EVEX_W_0F12_P_0_M_1,
1604 EVEX_W_0F12_P_1,
43234a1e 1605 EVEX_W_0F12_P_3,
43234a1e
L
1606 EVEX_W_0F16_P_0_M_1,
1607 EVEX_W_0F16_P_1,
43234a1e 1608 EVEX_W_0F2A_P_3,
43234a1e 1609 EVEX_W_0F51_P_1,
43234a1e 1610 EVEX_W_0F51_P_3,
43234a1e 1611 EVEX_W_0F58_P_1,
43234a1e 1612 EVEX_W_0F58_P_3,
43234a1e 1613 EVEX_W_0F59_P_1,
43234a1e
L
1614 EVEX_W_0F59_P_3,
1615 EVEX_W_0F5A_P_0,
1616 EVEX_W_0F5A_P_1,
1617 EVEX_W_0F5A_P_2,
1618 EVEX_W_0F5A_P_3,
1619 EVEX_W_0F5B_P_0,
1620 EVEX_W_0F5B_P_1,
1621 EVEX_W_0F5B_P_2,
43234a1e 1622 EVEX_W_0F5C_P_1,
43234a1e 1623 EVEX_W_0F5C_P_3,
43234a1e 1624 EVEX_W_0F5D_P_1,
43234a1e 1625 EVEX_W_0F5D_P_3,
43234a1e 1626 EVEX_W_0F5E_P_1,
43234a1e 1627 EVEX_W_0F5E_P_3,
43234a1e 1628 EVEX_W_0F5F_P_1,
43234a1e 1629 EVEX_W_0F5F_P_3,
fedfb81e 1630 EVEX_W_0F62,
7531c613 1631 EVEX_W_0F66,
fedfb81e
JB
1632 EVEX_W_0F6A,
1633 EVEX_W_0F6B,
1634 EVEX_W_0F6C,
1635 EVEX_W_0F6D,
43234a1e
L
1636 EVEX_W_0F6F_P_1,
1637 EVEX_W_0F6F_P_2,
1ba585e8 1638 EVEX_W_0F6F_P_3,
43234a1e 1639 EVEX_W_0F70_P_2,
7531c613
JB
1640 EVEX_W_0F72_R_2,
1641 EVEX_W_0F72_R_6,
1642 EVEX_W_0F73_R_2,
1643 EVEX_W_0F73_R_6,
1644 EVEX_W_0F76,
43234a1e 1645 EVEX_W_0F78_P_0,
90a915bf 1646 EVEX_W_0F78_P_2,
43234a1e 1647 EVEX_W_0F79_P_0,
90a915bf 1648 EVEX_W_0F79_P_2,
43234a1e 1649 EVEX_W_0F7A_P_1,
90a915bf 1650 EVEX_W_0F7A_P_2,
43234a1e 1651 EVEX_W_0F7A_P_3,
90a915bf 1652 EVEX_W_0F7B_P_2,
43234a1e
L
1653 EVEX_W_0F7B_P_3,
1654 EVEX_W_0F7E_P_1,
43234a1e
L
1655 EVEX_W_0F7F_P_1,
1656 EVEX_W_0F7F_P_2,
1ba585e8 1657 EVEX_W_0F7F_P_3,
43234a1e 1658 EVEX_W_0FC2_P_1,
43234a1e 1659 EVEX_W_0FC2_P_3,
fedfb81e
JB
1660 EVEX_W_0FD2,
1661 EVEX_W_0FD3,
1662 EVEX_W_0FD4,
7531c613 1663 EVEX_W_0FD6_L_0,
43234a1e
L
1664 EVEX_W_0FE6_P_1,
1665 EVEX_W_0FE6_P_2,
1666 EVEX_W_0FE6_P_3,
7531c613 1667 EVEX_W_0FE7,
fedfb81e
JB
1668 EVEX_W_0FF2,
1669 EVEX_W_0FF3,
1670 EVEX_W_0FF4,
1671 EVEX_W_0FFA,
1672 EVEX_W_0FFB,
1673 EVEX_W_0FFE,
7531c613 1674 EVEX_W_0F380D,
1ba585e8
IT
1675 EVEX_W_0F3810_P_1,
1676 EVEX_W_0F3810_P_2,
43234a1e 1677 EVEX_W_0F3811_P_1,
1ba585e8 1678 EVEX_W_0F3811_P_2,
43234a1e 1679 EVEX_W_0F3812_P_1,
1ba585e8 1680 EVEX_W_0F3812_P_2,
43234a1e
L
1681 EVEX_W_0F3813_P_1,
1682 EVEX_W_0F3813_P_2,
1683 EVEX_W_0F3814_P_1,
1684 EVEX_W_0F3815_P_1,
7531c613
JB
1685 EVEX_W_0F3819,
1686 EVEX_W_0F381A,
1687 EVEX_W_0F381B,
1688 EVEX_W_0F381E,
1689 EVEX_W_0F381F,
1ba585e8 1690 EVEX_W_0F3820_P_1,
43234a1e
L
1691 EVEX_W_0F3821_P_1,
1692 EVEX_W_0F3822_P_1,
1693 EVEX_W_0F3823_P_1,
1694 EVEX_W_0F3824_P_1,
1695 EVEX_W_0F3825_P_1,
1696 EVEX_W_0F3825_P_2,
1697 EVEX_W_0F3828_P_2,
1698 EVEX_W_0F3829_P_2,
1699 EVEX_W_0F382A_P_1,
1700 EVEX_W_0F382A_P_2,
fedfb81e 1701 EVEX_W_0F382B,
1ba585e8 1702 EVEX_W_0F3830_P_1,
43234a1e
L
1703 EVEX_W_0F3831_P_1,
1704 EVEX_W_0F3832_P_1,
1705 EVEX_W_0F3833_P_1,
1706 EVEX_W_0F3834_P_1,
1707 EVEX_W_0F3835_P_1,
1708 EVEX_W_0F3835_P_2,
7531c613 1709 EVEX_W_0F3837,
43234a1e 1710 EVEX_W_0F383A_P_1,
d6aab7a1 1711 EVEX_W_0F3852_P_1,
7531c613
JB
1712 EVEX_W_0F3859,
1713 EVEX_W_0F385A,
1714 EVEX_W_0F385B,
1715 EVEX_W_0F3870,
d6aab7a1 1716 EVEX_W_0F3872_P_1,
53467f57 1717 EVEX_W_0F3872_P_2,
d6aab7a1 1718 EVEX_W_0F3872_P_3,
7531c613
JB
1719 EVEX_W_0F387A,
1720 EVEX_W_0F387B,
1721 EVEX_W_0F3883,
1722 EVEX_W_0F3891,
1723 EVEX_W_0F3893,
1724 EVEX_W_0F38A1,
1725 EVEX_W_0F38A3,
1726 EVEX_W_0F38C7_R_1_M_0,
1727 EVEX_W_0F38C7_R_2_M_0,
1728 EVEX_W_0F38C7_R_5_M_0,
1729 EVEX_W_0F38C7_R_6_M_0,
1730
1731 EVEX_W_0F3A00,
1732 EVEX_W_0F3A01,
1733 EVEX_W_0F3A05,
1734 EVEX_W_0F3A08,
1735 EVEX_W_0F3A09,
1736 EVEX_W_0F3A0A,
1737 EVEX_W_0F3A0B,
1738 EVEX_W_0F3A18,
1739 EVEX_W_0F3A19,
1740 EVEX_W_0F3A1A,
1741 EVEX_W_0F3A1B,
1742 EVEX_W_0F3A21,
1743 EVEX_W_0F3A23,
1744 EVEX_W_0F3A38,
1745 EVEX_W_0F3A39,
1746 EVEX_W_0F3A3A,
1747 EVEX_W_0F3A3B,
1748 EVEX_W_0F3A42,
1749 EVEX_W_0F3A43,
1750 EVEX_W_0F3A70,
1751 EVEX_W_0F3A72,
9e30b8e0
L
1752};
1753
26ca5450 1754typedef void (*op_rtn) (int bytemode, int sizeflag);
252b5132
RH
1755
1756struct dis386 {
2da11e11 1757 const char *name;
ce518a5f
L
1758 struct
1759 {
1760 op_rtn rtn;
1761 int bytemode;
1762 } op[MAX_OPERANDS];
bf890a93 1763 unsigned int prefix_requirement;
252b5132
RH
1764};
1765
1766/* Upper case letters in the instruction names here are macros.
1767 'A' => print 'b' if no register operands or suffix_always is true
1768 'B' => print 'b' if suffix_always is true
9306ca4a 1769 'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
98b528ac 1770 size prefix
ed7841b3 1771 'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
98b528ac 1772 suffix_always is true
252b5132 1773 'E' => print 'e' if 32-bit form of jcxz
3ffd33cf 1774 'F' => print 'w' or 'l' depending on address size prefix (loop insns)
52fd6d94 1775 'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
5dd0794d 1776 'H' => print ",pt" or ",pn" branch hint
d1c36125 1777 'I' unused.
8f570d62 1778 'J' unused.
42903f7f 1779 'K' => print 'd' or 'q' if rex prefix is present.
78467458 1780 'L' unused.
9d141669 1781 'M' => print 'r' if intel_mnemonic is false.
252b5132 1782 'N' => print 'n' if instruction has no wait "prefix"
a35ca55a 1783 'O' => print 'd' or 'o' (or 'q' in Intel mode)
36938cab
JB
1784 'P' => behave as 'T' except with register operand outside of suffix_always
1785 mode
98b528ac
L
1786 'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
1787 is true
a35ca55a 1788 'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
52b15da3 1789 'S' => print 'w', 'l' or 'q' if suffix_always is true
36938cab
JB
1790 'T' => print 'w', 'l'/'d', or 'q' if instruction has an operand size
1791 prefix or if suffix_always is true.
1792 'U' unused.
c3f5525f 1793 'V' unused.
a35ca55a 1794 'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
9306ca4a 1795 'X' => print 's', 'd' depending on data16 prefix (for XMM)
9646c87b 1796 'Y' unused.
78467458 1797 'Z' => print 'q' in 64bit mode and 'l' otherwise, if suffix_always is true.
9d141669 1798 '!' => change condition from true to false or from false to true.
98b528ac 1799 '%' => add 1 upper case letter to the macro.
5990e377
JB
1800 '^' => print 'w', 'l', or 'q' (Intel64 ISA only) depending on operand size
1801 prefix or suffix_always is true (lcall/ljmp).
36938cab
JB
1802 '@' => in 64bit mode for Intel64 ISA or if instruction
1803 has no operand sizing prefix, print 'q' if suffix_always is true or
1804 nothing otherwise; behave as 'P' in all other cases
98b528ac
L
1805
1806 2 upper case letter macros:
04d824a4
JB
1807 "XY" => print 'x' or 'y' if suffix_always is true or no register
1808 operands and no broadcast.
1809 "XZ" => print 'x', 'y', or 'z' if suffix_always is true or no
1810 register operands and no broadcast.
4b06377f 1811 "XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
58bf9b6a 1812 "XV" => print "{vex3}" pseudo prefix
b24d668c
JB
1813 "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand, cond
1814 being false, or no operand at all in 64bit mode, or if suffix_always
589958d6 1815 is true.
4b06377f
L
1816 "LB" => print "abs" in 64bit mode and behave as 'B' otherwise
1817 "LS" => print "abs" in 64bit mode and behave as 'S' otherwise
1818 "LV" => print "abs" for 64bit operand and behave as 'S' otherwise
492a76aa 1819 "DQ" => print 'd' or 'q' depending on the VEX.W bit
bb5b3501 1820 "BW" => print 'b' or 'w' depending on the VEX.W bit
4b4c407a
L
1821 "LP" => print 'w' or 'l' ('d' in Intel mode) if instruction has
1822 an operand size prefix, or suffix_always is true. print
1823 'q' if rex prefix is present.
52b15da3 1824
6439fc28
AM
1825 Many of the above letters print nothing in Intel mode. See "putop"
1826 for the details.
52b15da3 1827
6439fc28 1828 Braces '{' and '}', and vertical bars '|', indicate alternative
7c52e0e8 1829 mnemonic strings for AT&T and Intel. */
252b5132 1830
6439fc28 1831static const struct dis386 dis386[] = {
252b5132 1832 /* 00 */
bf890a93
IT
1833 { "addB", { Ebh1, Gb }, 0 },
1834 { "addS", { Evh1, Gv }, 0 },
1835 { "addB", { Gb, EbS }, 0 },
1836 { "addS", { Gv, EvS }, 0 },
1837 { "addB", { AL, Ib }, 0 },
1838 { "addS", { eAX, Iv }, 0 },
4e7d34a6
L
1839 { X86_64_TABLE (X86_64_06) },
1840 { X86_64_TABLE (X86_64_07) },
252b5132 1841 /* 08 */
bf890a93
IT
1842 { "orB", { Ebh1, Gb }, 0 },
1843 { "orS", { Evh1, Gv }, 0 },
1844 { "orB", { Gb, EbS }, 0 },
1845 { "orS", { Gv, EvS }, 0 },
1846 { "orB", { AL, Ib }, 0 },
1847 { "orS", { eAX, Iv }, 0 },
1673df32 1848 { X86_64_TABLE (X86_64_0E) },
592d1631 1849 { Bad_Opcode }, /* 0x0f extended opcode escape */
252b5132 1850 /* 10 */
bf890a93
IT
1851 { "adcB", { Ebh1, Gb }, 0 },
1852 { "adcS", { Evh1, Gv }, 0 },
1853 { "adcB", { Gb, EbS }, 0 },
1854 { "adcS", { Gv, EvS }, 0 },
1855 { "adcB", { AL, Ib }, 0 },
1856 { "adcS", { eAX, Iv }, 0 },
4e7d34a6
L
1857 { X86_64_TABLE (X86_64_16) },
1858 { X86_64_TABLE (X86_64_17) },
252b5132 1859 /* 18 */
bf890a93
IT
1860 { "sbbB", { Ebh1, Gb }, 0 },
1861 { "sbbS", { Evh1, Gv }, 0 },
1862 { "sbbB", { Gb, EbS }, 0 },
1863 { "sbbS", { Gv, EvS }, 0 },
1864 { "sbbB", { AL, Ib }, 0 },
1865 { "sbbS", { eAX, Iv }, 0 },
4e7d34a6
L
1866 { X86_64_TABLE (X86_64_1E) },
1867 { X86_64_TABLE (X86_64_1F) },
252b5132 1868 /* 20 */
bf890a93
IT
1869 { "andB", { Ebh1, Gb }, 0 },
1870 { "andS", { Evh1, Gv }, 0 },
1871 { "andB", { Gb, EbS }, 0 },
1872 { "andS", { Gv, EvS }, 0 },
1873 { "andB", { AL, Ib }, 0 },
1874 { "andS", { eAX, Iv }, 0 },
592d1631 1875 { Bad_Opcode }, /* SEG ES prefix */
4e7d34a6 1876 { X86_64_TABLE (X86_64_27) },
252b5132 1877 /* 28 */
bf890a93
IT
1878 { "subB", { Ebh1, Gb }, 0 },
1879 { "subS", { Evh1, Gv }, 0 },
1880 { "subB", { Gb, EbS }, 0 },
1881 { "subS", { Gv, EvS }, 0 },
1882 { "subB", { AL, Ib }, 0 },
1883 { "subS", { eAX, Iv }, 0 },
592d1631 1884 { Bad_Opcode }, /* SEG CS prefix */
4e7d34a6 1885 { X86_64_TABLE (X86_64_2F) },
252b5132 1886 /* 30 */
bf890a93
IT
1887 { "xorB", { Ebh1, Gb }, 0 },
1888 { "xorS", { Evh1, Gv }, 0 },
1889 { "xorB", { Gb, EbS }, 0 },
1890 { "xorS", { Gv, EvS }, 0 },
1891 { "xorB", { AL, Ib }, 0 },
1892 { "xorS", { eAX, Iv }, 0 },
592d1631 1893 { Bad_Opcode }, /* SEG SS prefix */
4e7d34a6 1894 { X86_64_TABLE (X86_64_37) },
252b5132 1895 /* 38 */
bf890a93
IT
1896 { "cmpB", { Eb, Gb }, 0 },
1897 { "cmpS", { Ev, Gv }, 0 },
1898 { "cmpB", { Gb, EbS }, 0 },
1899 { "cmpS", { Gv, EvS }, 0 },
1900 { "cmpB", { AL, Ib }, 0 },
1901 { "cmpS", { eAX, Iv }, 0 },
592d1631 1902 { Bad_Opcode }, /* SEG DS prefix */
4e7d34a6 1903 { X86_64_TABLE (X86_64_3F) },
252b5132 1904 /* 40 */
bf890a93
IT
1905 { "inc{S|}", { RMeAX }, 0 },
1906 { "inc{S|}", { RMeCX }, 0 },
1907 { "inc{S|}", { RMeDX }, 0 },
1908 { "inc{S|}", { RMeBX }, 0 },
1909 { "inc{S|}", { RMeSP }, 0 },
1910 { "inc{S|}", { RMeBP }, 0 },
1911 { "inc{S|}", { RMeSI }, 0 },
1912 { "inc{S|}", { RMeDI }, 0 },
252b5132 1913 /* 48 */
bf890a93
IT
1914 { "dec{S|}", { RMeAX }, 0 },
1915 { "dec{S|}", { RMeCX }, 0 },
1916 { "dec{S|}", { RMeDX }, 0 },
1917 { "dec{S|}", { RMeBX }, 0 },
1918 { "dec{S|}", { RMeSP }, 0 },
1919 { "dec{S|}", { RMeBP }, 0 },
1920 { "dec{S|}", { RMeSI }, 0 },
1921 { "dec{S|}", { RMeDI }, 0 },
252b5132 1922 /* 50 */
c3f5525f
JB
1923 { "push{!P|}", { RMrAX }, 0 },
1924 { "push{!P|}", { RMrCX }, 0 },
1925 { "push{!P|}", { RMrDX }, 0 },
1926 { "push{!P|}", { RMrBX }, 0 },
1927 { "push{!P|}", { RMrSP }, 0 },
1928 { "push{!P|}", { RMrBP }, 0 },
1929 { "push{!P|}", { RMrSI }, 0 },
1930 { "push{!P|}", { RMrDI }, 0 },
252b5132 1931 /* 58 */
c3f5525f
JB
1932 { "pop{!P|}", { RMrAX }, 0 },
1933 { "pop{!P|}", { RMrCX }, 0 },
1934 { "pop{!P|}", { RMrDX }, 0 },
1935 { "pop{!P|}", { RMrBX }, 0 },
1936 { "pop{!P|}", { RMrSP }, 0 },
1937 { "pop{!P|}", { RMrBP }, 0 },
1938 { "pop{!P|}", { RMrSI }, 0 },
1939 { "pop{!P|}", { RMrDI }, 0 },
252b5132 1940 /* 60 */
4e7d34a6
L
1941 { X86_64_TABLE (X86_64_60) },
1942 { X86_64_TABLE (X86_64_61) },
1943 { X86_64_TABLE (X86_64_62) },
1944 { X86_64_TABLE (X86_64_63) },
592d1631
L
1945 { Bad_Opcode }, /* seg fs */
1946 { Bad_Opcode }, /* seg gs */
1947 { Bad_Opcode }, /* op size prefix */
1948 { Bad_Opcode }, /* adr size prefix */
252b5132 1949 /* 68 */
36938cab 1950 { "pushP", { sIv }, 0 },
bf890a93 1951 { "imulS", { Gv, Ev, Iv }, 0 },
36938cab 1952 { "pushP", { sIbT }, 0 },
bf890a93
IT
1953 { "imulS", { Gv, Ev, sIb }, 0 },
1954 { "ins{b|}", { Ybr, indirDX }, 0 },
4e7d34a6 1955 { X86_64_TABLE (X86_64_6D) },
bf890a93 1956 { "outs{b|}", { indirDXr, Xb }, 0 },
4e7d34a6 1957 { X86_64_TABLE (X86_64_6F) },
252b5132 1958 /* 70 */
bf890a93
IT
1959 { "joH", { Jb, BND, cond_jump_flag }, 0 },
1960 { "jnoH", { Jb, BND, cond_jump_flag }, 0 },
1961 { "jbH", { Jb, BND, cond_jump_flag }, 0 },
1962 { "jaeH", { Jb, BND, cond_jump_flag }, 0 },
1963 { "jeH", { Jb, BND, cond_jump_flag }, 0 },
1964 { "jneH", { Jb, BND, cond_jump_flag }, 0 },
1965 { "jbeH", { Jb, BND, cond_jump_flag }, 0 },
1966 { "jaH", { Jb, BND, cond_jump_flag }, 0 },
252b5132 1967 /* 78 */
bf890a93
IT
1968 { "jsH", { Jb, BND, cond_jump_flag }, 0 },
1969 { "jnsH", { Jb, BND, cond_jump_flag }, 0 },
1970 { "jpH", { Jb, BND, cond_jump_flag }, 0 },
1971 { "jnpH", { Jb, BND, cond_jump_flag }, 0 },
1972 { "jlH", { Jb, BND, cond_jump_flag }, 0 },
1973 { "jgeH", { Jb, BND, cond_jump_flag }, 0 },
1974 { "jleH", { Jb, BND, cond_jump_flag }, 0 },
1975 { "jgH", { Jb, BND, cond_jump_flag }, 0 },
252b5132 1976 /* 80 */
1ceb70f8
L
1977 { REG_TABLE (REG_80) },
1978 { REG_TABLE (REG_81) },
d039fef3 1979 { X86_64_TABLE (X86_64_82) },
7148c369 1980 { REG_TABLE (REG_83) },
bf890a93
IT
1981 { "testB", { Eb, Gb }, 0 },
1982 { "testS", { Ev, Gv }, 0 },
1983 { "xchgB", { Ebh2, Gb }, 0 },
1984 { "xchgS", { Evh2, Gv }, 0 },
252b5132 1985 /* 88 */
bf890a93
IT
1986 { "movB", { Ebh3, Gb }, 0 },
1987 { "movS", { Evh3, Gv }, 0 },
1988 { "movB", { Gb, EbS }, 0 },
1989 { "movS", { Gv, EvS }, 0 },
1990 { "movD", { Sv, Sw }, 0 },
1ceb70f8 1991 { MOD_TABLE (MOD_8D) },
bf890a93 1992 { "movD", { Sw, Sv }, 0 },
1ceb70f8 1993 { REG_TABLE (REG_8F) },
252b5132 1994 /* 90 */
1ceb70f8 1995 { PREFIX_TABLE (PREFIX_90) },
bf890a93
IT
1996 { "xchgS", { RMeCX, eAX }, 0 },
1997 { "xchgS", { RMeDX, eAX }, 0 },
1998 { "xchgS", { RMeBX, eAX }, 0 },
1999 { "xchgS", { RMeSP, eAX }, 0 },
2000 { "xchgS", { RMeBP, eAX }, 0 },
2001 { "xchgS", { RMeSI, eAX }, 0 },
2002 { "xchgS", { RMeDI, eAX }, 0 },
252b5132 2003 /* 98 */
bf890a93
IT
2004 { "cW{t|}R", { XX }, 0 },
2005 { "cR{t|}O", { XX }, 0 },
4e7d34a6 2006 { X86_64_TABLE (X86_64_9A) },
592d1631 2007 { Bad_Opcode }, /* fwait */
36938cab
JB
2008 { "pushfP", { XX }, 0 },
2009 { "popfP", { XX }, 0 },
bf890a93
IT
2010 { "sahf", { XX }, 0 },
2011 { "lahf", { XX }, 0 },
252b5132 2012 /* a0 */
bf890a93
IT
2013 { "mov%LB", { AL, Ob }, 0 },
2014 { "mov%LS", { eAX, Ov }, 0 },
2015 { "mov%LB", { Ob, AL }, 0 },
2016 { "mov%LS", { Ov, eAX }, 0 },
2017 { "movs{b|}", { Ybr, Xb }, 0 },
2018 { "movs{R|}", { Yvr, Xv }, 0 },
2019 { "cmps{b|}", { Xb, Yb }, 0 },
2020 { "cmps{R|}", { Xv, Yv }, 0 },
252b5132 2021 /* a8 */
bf890a93
IT
2022 { "testB", { AL, Ib }, 0 },
2023 { "testS", { eAX, Iv }, 0 },
2024 { "stosB", { Ybr, AL }, 0 },
2025 { "stosS", { Yvr, eAX }, 0 },
2026 { "lodsB", { ALr, Xb }, 0 },
2027 { "lodsS", { eAXr, Xv }, 0 },
2028 { "scasB", { AL, Yb }, 0 },
2029 { "scasS", { eAX, Yv }, 0 },
252b5132 2030 /* b0 */
bf890a93
IT
2031 { "movB", { RMAL, Ib }, 0 },
2032 { "movB", { RMCL, Ib }, 0 },
2033 { "movB", { RMDL, Ib }, 0 },
2034 { "movB", { RMBL, Ib }, 0 },
2035 { "movB", { RMAH, Ib }, 0 },
2036 { "movB", { RMCH, Ib }, 0 },
2037 { "movB", { RMDH, Ib }, 0 },
2038 { "movB", { RMBH, Ib }, 0 },
252b5132 2039 /* b8 */
bf890a93
IT
2040 { "mov%LV", { RMeAX, Iv64 }, 0 },
2041 { "mov%LV", { RMeCX, Iv64 }, 0 },
2042 { "mov%LV", { RMeDX, Iv64 }, 0 },
2043 { "mov%LV", { RMeBX, Iv64 }, 0 },
2044 { "mov%LV", { RMeSP, Iv64 }, 0 },
2045 { "mov%LV", { RMeBP, Iv64 }, 0 },
2046 { "mov%LV", { RMeSI, Iv64 }, 0 },
2047 { "mov%LV", { RMeDI, Iv64 }, 0 },
252b5132 2048 /* c0 */
1ceb70f8
L
2049 { REG_TABLE (REG_C0) },
2050 { REG_TABLE (REG_C1) },
aeab2b26
JB
2051 { X86_64_TABLE (X86_64_C2) },
2052 { X86_64_TABLE (X86_64_C3) },
4e7d34a6
L
2053 { X86_64_TABLE (X86_64_C4) },
2054 { X86_64_TABLE (X86_64_C5) },
1ceb70f8
L
2055 { REG_TABLE (REG_C6) },
2056 { REG_TABLE (REG_C7) },
252b5132 2057 /* c8 */
36938cab
JB
2058 { "enterP", { Iw, Ib }, 0 },
2059 { "leaveP", { XX }, 0 },
2060 { "{l|}ret{|f}%LP", { Iw }, 0 },
2061 { "{l|}ret{|f}%LP", { XX }, 0 },
bf890a93
IT
2062 { "int3", { XX }, 0 },
2063 { "int", { Ib }, 0 },
4e7d34a6 2064 { X86_64_TABLE (X86_64_CE) },
bf890a93 2065 { "iret%LP", { XX }, 0 },
252b5132 2066 /* d0 */
1ceb70f8
L
2067 { REG_TABLE (REG_D0) },
2068 { REG_TABLE (REG_D1) },
2069 { REG_TABLE (REG_D2) },
2070 { REG_TABLE (REG_D3) },
4e7d34a6
L
2071 { X86_64_TABLE (X86_64_D4) },
2072 { X86_64_TABLE (X86_64_D5) },
592d1631 2073 { Bad_Opcode },
bf890a93 2074 { "xlat", { DSBX }, 0 },
252b5132
RH
2075 /* d8 */
2076 { FLOAT },
2077 { FLOAT },
2078 { FLOAT },
2079 { FLOAT },
2080 { FLOAT },
2081 { FLOAT },
2082 { FLOAT },
2083 { FLOAT },
2084 /* e0 */
bf890a93
IT
2085 { "loopneFH", { Jb, XX, loop_jcxz_flag }, 0 },
2086 { "loopeFH", { Jb, XX, loop_jcxz_flag }, 0 },
2087 { "loopFH", { Jb, XX, loop_jcxz_flag }, 0 },
2088 { "jEcxzH", { Jb, XX, loop_jcxz_flag }, 0 },
2089 { "inB", { AL, Ib }, 0 },
2090 { "inG", { zAX, Ib }, 0 },
2091 { "outB", { Ib, AL }, 0 },
2092 { "outG", { Ib, zAX }, 0 },
252b5132 2093 /* e8 */
a72d2af2
L
2094 { X86_64_TABLE (X86_64_E8) },
2095 { X86_64_TABLE (X86_64_E9) },
4e7d34a6 2096 { X86_64_TABLE (X86_64_EA) },
bf890a93
IT
2097 { "jmp", { Jb, BND }, 0 },
2098 { "inB", { AL, indirDX }, 0 },
2099 { "inG", { zAX, indirDX }, 0 },
2100 { "outB", { indirDX, AL }, 0 },
2101 { "outG", { indirDX, zAX }, 0 },
252b5132 2102 /* f0 */
592d1631 2103 { Bad_Opcode }, /* lock prefix */
bf890a93 2104 { "icebp", { XX }, 0 },
592d1631
L
2105 { Bad_Opcode }, /* repne */
2106 { Bad_Opcode }, /* repz */
bf890a93
IT
2107 { "hlt", { XX }, 0 },
2108 { "cmc", { XX }, 0 },
1ceb70f8
L
2109 { REG_TABLE (REG_F6) },
2110 { REG_TABLE (REG_F7) },
252b5132 2111 /* f8 */
bf890a93
IT
2112 { "clc", { XX }, 0 },
2113 { "stc", { XX }, 0 },
2114 { "cli", { XX }, 0 },
2115 { "sti", { XX }, 0 },
2116 { "cld", { XX }, 0 },
2117 { "std", { XX }, 0 },
1ceb70f8
L
2118 { REG_TABLE (REG_FE) },
2119 { REG_TABLE (REG_FF) },
252b5132
RH
2120};
2121
6439fc28 2122static const struct dis386 dis386_twobyte[] = {
252b5132 2123 /* 00 */
1ceb70f8
L
2124 { REG_TABLE (REG_0F00 ) },
2125 { REG_TABLE (REG_0F01 ) },
bf890a93
IT
2126 { "larS", { Gv, Ew }, 0 },
2127 { "lslS", { Gv, Ew }, 0 },
592d1631 2128 { Bad_Opcode },
bf890a93
IT
2129 { "syscall", { XX }, 0 },
2130 { "clts", { XX }, 0 },
589958d6 2131 { "sysret%LQ", { XX }, 0 },
252b5132 2132 /* 08 */
bf890a93 2133 { "invd", { XX }, 0 },
3233d7d0 2134 { PREFIX_TABLE (PREFIX_0F09) },
592d1631 2135 { Bad_Opcode },
bf890a93 2136 { "ud2", { XX }, 0 },
592d1631 2137 { Bad_Opcode },
b5b1fc4f 2138 { REG_TABLE (REG_0F0D) },
bf890a93
IT
2139 { "femms", { XX }, 0 },
2140 { "", { MX, EM, OPSUF }, 0 }, /* See OP_3DNowSuffix. */
252b5132 2141 /* 10 */
1ceb70f8
L
2142 { PREFIX_TABLE (PREFIX_0F10) },
2143 { PREFIX_TABLE (PREFIX_0F11) },
2144 { PREFIX_TABLE (PREFIX_0F12) },
2145 { MOD_TABLE (MOD_0F13) },
507bd325
L
2146 { "unpcklpX", { XM, EXx }, PREFIX_OPCODE },
2147 { "unpckhpX", { XM, EXx }, PREFIX_OPCODE },
1ceb70f8
L
2148 { PREFIX_TABLE (PREFIX_0F16) },
2149 { MOD_TABLE (MOD_0F17) },
252b5132 2150 /* 18 */
1ceb70f8 2151 { REG_TABLE (REG_0F18) },
bf890a93 2152 { "nopQ", { Ev }, 0 },
7e8b059b
L
2153 { PREFIX_TABLE (PREFIX_0F1A) },
2154 { PREFIX_TABLE (PREFIX_0F1B) },
c48935d7 2155 { PREFIX_TABLE (PREFIX_0F1C) },
bf890a93 2156 { "nopQ", { Ev }, 0 },
603555e5 2157 { PREFIX_TABLE (PREFIX_0F1E) },
bf890a93 2158 { "nopQ", { Ev }, 0 },
252b5132 2159 /* 20 */
78467458
JB
2160 { "movZ", { Em, Cm }, 0 },
2161 { "movZ", { Em, Dm }, 0 },
2162 { "movZ", { Cm, Em }, 0 },
2163 { "movZ", { Dm, Em }, 0 },
2164 { X86_64_TABLE (X86_64_0F24) },
592d1631 2165 { Bad_Opcode },
78467458 2166 { X86_64_TABLE (X86_64_0F26) },
592d1631 2167 { Bad_Opcode },
252b5132 2168 /* 28 */
507bd325
L
2169 { "movapX", { XM, EXx }, PREFIX_OPCODE },
2170 { "movapX", { EXxS, XM }, PREFIX_OPCODE },
1ceb70f8
L
2171 { PREFIX_TABLE (PREFIX_0F2A) },
2172 { PREFIX_TABLE (PREFIX_0F2B) },
2173 { PREFIX_TABLE (PREFIX_0F2C) },
2174 { PREFIX_TABLE (PREFIX_0F2D) },
2175 { PREFIX_TABLE (PREFIX_0F2E) },
2176 { PREFIX_TABLE (PREFIX_0F2F) },
252b5132 2177 /* 30 */
bf890a93
IT
2178 { "wrmsr", { XX }, 0 },
2179 { "rdtsc", { XX }, 0 },
2180 { "rdmsr", { XX }, 0 },
2181 { "rdpmc", { XX }, 0 },
d835a58b
JB
2182 { "sysenter", { SEP }, 0 },
2183 { "sysexit", { SEP }, 0 },
592d1631 2184 { Bad_Opcode },
bf890a93 2185 { "getsec", { XX }, 0 },
252b5132 2186 /* 38 */
507bd325 2187 { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F38, PREFIX_OPCODE) },
592d1631 2188 { Bad_Opcode },
507bd325 2189 { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F3A, PREFIX_OPCODE) },
592d1631
L
2190 { Bad_Opcode },
2191 { Bad_Opcode },
2192 { Bad_Opcode },
2193 { Bad_Opcode },
2194 { Bad_Opcode },
252b5132 2195 /* 40 */
bf890a93
IT
2196 { "cmovoS", { Gv, Ev }, 0 },
2197 { "cmovnoS", { Gv, Ev }, 0 },
2198 { "cmovbS", { Gv, Ev }, 0 },
2199 { "cmovaeS", { Gv, Ev }, 0 },
2200 { "cmoveS", { Gv, Ev }, 0 },
2201 { "cmovneS", { Gv, Ev }, 0 },
2202 { "cmovbeS", { Gv, Ev }, 0 },
2203 { "cmovaS", { Gv, Ev }, 0 },
252b5132 2204 /* 48 */
bf890a93
IT
2205 { "cmovsS", { Gv, Ev }, 0 },
2206 { "cmovnsS", { Gv, Ev }, 0 },
2207 { "cmovpS", { Gv, Ev }, 0 },
2208 { "cmovnpS", { Gv, Ev }, 0 },
2209 { "cmovlS", { Gv, Ev }, 0 },
2210 { "cmovgeS", { Gv, Ev }, 0 },
2211 { "cmovleS", { Gv, Ev }, 0 },
2212 { "cmovgS", { Gv, Ev }, 0 },
252b5132 2213 /* 50 */
a5aaedb9 2214 { MOD_TABLE (MOD_0F50) },
1ceb70f8
L
2215 { PREFIX_TABLE (PREFIX_0F51) },
2216 { PREFIX_TABLE (PREFIX_0F52) },
2217 { PREFIX_TABLE (PREFIX_0F53) },
507bd325
L
2218 { "andpX", { XM, EXx }, PREFIX_OPCODE },
2219 { "andnpX", { XM, EXx }, PREFIX_OPCODE },
2220 { "orpX", { XM, EXx }, PREFIX_OPCODE },
2221 { "xorpX", { XM, EXx }, PREFIX_OPCODE },
252b5132 2222 /* 58 */
1ceb70f8
L
2223 { PREFIX_TABLE (PREFIX_0F58) },
2224 { PREFIX_TABLE (PREFIX_0F59) },
2225 { PREFIX_TABLE (PREFIX_0F5A) },
2226 { PREFIX_TABLE (PREFIX_0F5B) },
2227 { PREFIX_TABLE (PREFIX_0F5C) },
2228 { PREFIX_TABLE (PREFIX_0F5D) },
2229 { PREFIX_TABLE (PREFIX_0F5E) },
2230 { PREFIX_TABLE (PREFIX_0F5F) },
252b5132 2231 /* 60 */
1ceb70f8
L
2232 { PREFIX_TABLE (PREFIX_0F60) },
2233 { PREFIX_TABLE (PREFIX_0F61) },
2234 { PREFIX_TABLE (PREFIX_0F62) },
507bd325
L
2235 { "packsswb", { MX, EM }, PREFIX_OPCODE },
2236 { "pcmpgtb", { MX, EM }, PREFIX_OPCODE },
2237 { "pcmpgtw", { MX, EM }, PREFIX_OPCODE },
2238 { "pcmpgtd", { MX, EM }, PREFIX_OPCODE },
2239 { "packuswb", { MX, EM }, PREFIX_OPCODE },
252b5132 2240 /* 68 */
507bd325
L
2241 { "punpckhbw", { MX, EM }, PREFIX_OPCODE },
2242 { "punpckhwd", { MX, EM }, PREFIX_OPCODE },
2243 { "punpckhdq", { MX, EM }, PREFIX_OPCODE },
2244 { "packssdw", { MX, EM }, PREFIX_OPCODE },
7531c613
JB
2245 { "punpcklqdq", { XM, EXx }, PREFIX_DATA },
2246 { "punpckhqdq", { XM, EXx }, PREFIX_DATA },
507bd325 2247 { "movK", { MX, Edq }, PREFIX_OPCODE },
1ceb70f8 2248 { PREFIX_TABLE (PREFIX_0F6F) },
252b5132 2249 /* 70 */
1ceb70f8
L
2250 { PREFIX_TABLE (PREFIX_0F70) },
2251 { REG_TABLE (REG_0F71) },
2252 { REG_TABLE (REG_0F72) },
2253 { REG_TABLE (REG_0F73) },
507bd325
L
2254 { "pcmpeqb", { MX, EM }, PREFIX_OPCODE },
2255 { "pcmpeqw", { MX, EM }, PREFIX_OPCODE },
2256 { "pcmpeqd", { MX, EM }, PREFIX_OPCODE },
2257 { "emms", { XX }, PREFIX_OPCODE },
252b5132 2258 /* 78 */
1ceb70f8
L
2259 { PREFIX_TABLE (PREFIX_0F78) },
2260 { PREFIX_TABLE (PREFIX_0F79) },
1f334aeb 2261 { Bad_Opcode },
592d1631 2262 { Bad_Opcode },
1ceb70f8
L
2263 { PREFIX_TABLE (PREFIX_0F7C) },
2264 { PREFIX_TABLE (PREFIX_0F7D) },
2265 { PREFIX_TABLE (PREFIX_0F7E) },
2266 { PREFIX_TABLE (PREFIX_0F7F) },
252b5132 2267 /* 80 */
bf890a93
IT
2268 { "joH", { Jv, BND, cond_jump_flag }, 0 },
2269 { "jnoH", { Jv, BND, cond_jump_flag }, 0 },
2270 { "jbH", { Jv, BND, cond_jump_flag }, 0 },
2271 { "jaeH", { Jv, BND, cond_jump_flag }, 0 },
2272 { "jeH", { Jv, BND, cond_jump_flag }, 0 },
2273 { "jneH", { Jv, BND, cond_jump_flag }, 0 },
2274 { "jbeH", { Jv, BND, cond_jump_flag }, 0 },
2275 { "jaH", { Jv, BND, cond_jump_flag }, 0 },
252b5132 2276 /* 88 */
bf890a93
IT
2277 { "jsH", { Jv, BND, cond_jump_flag }, 0 },
2278 { "jnsH", { Jv, BND, cond_jump_flag }, 0 },
2279 { "jpH", { Jv, BND, cond_jump_flag }, 0 },
2280 { "jnpH", { Jv, BND, cond_jump_flag }, 0 },
2281 { "jlH", { Jv, BND, cond_jump_flag }, 0 },
2282 { "jgeH", { Jv, BND, cond_jump_flag }, 0 },
2283 { "jleH", { Jv, BND, cond_jump_flag }, 0 },
2284 { "jgH", { Jv, BND, cond_jump_flag }, 0 },
252b5132 2285 /* 90 */
bf890a93
IT
2286 { "seto", { Eb }, 0 },
2287 { "setno", { Eb }, 0 },
2288 { "setb", { Eb }, 0 },
2289 { "setae", { Eb }, 0 },
2290 { "sete", { Eb }, 0 },
2291 { "setne", { Eb }, 0 },
2292 { "setbe", { Eb }, 0 },
2293 { "seta", { Eb }, 0 },
252b5132 2294 /* 98 */
bf890a93
IT
2295 { "sets", { Eb }, 0 },
2296 { "setns", { Eb }, 0 },
2297 { "setp", { Eb }, 0 },
2298 { "setnp", { Eb }, 0 },
2299 { "setl", { Eb }, 0 },
2300 { "setge", { Eb }, 0 },
2301 { "setle", { Eb }, 0 },
2302 { "setg", { Eb }, 0 },
252b5132 2303 /* a0 */
36938cab
JB
2304 { "pushP", { fs }, 0 },
2305 { "popP", { fs }, 0 },
bf890a93
IT
2306 { "cpuid", { XX }, 0 },
2307 { "btS", { Ev, Gv }, 0 },
2308 { "shldS", { Ev, Gv, Ib }, 0 },
2309 { "shldS", { Ev, Gv, CL }, 0 },
1ceb70f8
L
2310 { REG_TABLE (REG_0FA6) },
2311 { REG_TABLE (REG_0FA7) },
252b5132 2312 /* a8 */
36938cab
JB
2313 { "pushP", { gs }, 0 },
2314 { "popP", { gs }, 0 },
bf890a93
IT
2315 { "rsm", { XX }, 0 },
2316 { "btsS", { Evh1, Gv }, 0 },
2317 { "shrdS", { Ev, Gv, Ib }, 0 },
2318 { "shrdS", { Ev, Gv, CL }, 0 },
1ceb70f8 2319 { REG_TABLE (REG_0FAE) },
bf890a93 2320 { "imulS", { Gv, Ev }, 0 },
252b5132 2321 /* b0 */
bf890a93
IT
2322 { "cmpxchgB", { Ebh1, Gb }, 0 },
2323 { "cmpxchgS", { Evh1, Gv }, 0 },
1ceb70f8 2324 { MOD_TABLE (MOD_0FB2) },
bf890a93 2325 { "btrS", { Evh1, Gv }, 0 },
1ceb70f8
L
2326 { MOD_TABLE (MOD_0FB4) },
2327 { MOD_TABLE (MOD_0FB5) },
bf890a93
IT
2328 { "movz{bR|x}", { Gv, Eb }, 0 },
2329 { "movz{wR|x}", { Gv, Ew }, 0 }, /* yes, there really is movzww ! */
252b5132 2330 /* b8 */
1ceb70f8 2331 { PREFIX_TABLE (PREFIX_0FB8) },
66f1eba0 2332 { "ud1S", { Gv, Ev }, 0 },
1ceb70f8 2333 { REG_TABLE (REG_0FBA) },
bf890a93 2334 { "btcS", { Evh1, Gv }, 0 },
f12dc422 2335 { PREFIX_TABLE (PREFIX_0FBC) },
1ceb70f8 2336 { PREFIX_TABLE (PREFIX_0FBD) },
bf890a93
IT
2337 { "movs{bR|x}", { Gv, Eb }, 0 },
2338 { "movs{wR|x}", { Gv, Ew }, 0 }, /* yes, there really is movsww ! */
252b5132 2339 /* c0 */
bf890a93
IT
2340 { "xaddB", { Ebh1, Gb }, 0 },
2341 { "xaddS", { Evh1, Gv }, 0 },
1ceb70f8 2342 { PREFIX_TABLE (PREFIX_0FC2) },
a8484f96 2343 { MOD_TABLE (MOD_0FC3) },
507bd325
L
2344 { "pinsrw", { MX, Edqw, Ib }, PREFIX_OPCODE },
2345 { "pextrw", { Gdq, MS, Ib }, PREFIX_OPCODE },
2346 { "shufpX", { XM, EXx, Ib }, PREFIX_OPCODE },
1ceb70f8 2347 { REG_TABLE (REG_0FC7) },
252b5132 2348 /* c8 */
bf890a93
IT
2349 { "bswap", { RMeAX }, 0 },
2350 { "bswap", { RMeCX }, 0 },
2351 { "bswap", { RMeDX }, 0 },
2352 { "bswap", { RMeBX }, 0 },
2353 { "bswap", { RMeSP }, 0 },
2354 { "bswap", { RMeBP }, 0 },
2355 { "bswap", { RMeSI }, 0 },
2356 { "bswap", { RMeDI }, 0 },
252b5132 2357 /* d0 */
1ceb70f8 2358 { PREFIX_TABLE (PREFIX_0FD0) },
507bd325
L
2359 { "psrlw", { MX, EM }, PREFIX_OPCODE },
2360 { "psrld", { MX, EM }, PREFIX_OPCODE },
2361 { "psrlq", { MX, EM }, PREFIX_OPCODE },
2362 { "paddq", { MX, EM }, PREFIX_OPCODE },
2363 { "pmullw", { MX, EM }, PREFIX_OPCODE },
1ceb70f8 2364 { PREFIX_TABLE (PREFIX_0FD6) },
75c135a8 2365 { MOD_TABLE (MOD_0FD7) },
252b5132 2366 /* d8 */
507bd325
L
2367 { "psubusb", { MX, EM }, PREFIX_OPCODE },
2368 { "psubusw", { MX, EM }, PREFIX_OPCODE },
2369 { "pminub", { MX, EM }, PREFIX_OPCODE },
2370 { "pand", { MX, EM }, PREFIX_OPCODE },
2371 { "paddusb", { MX, EM }, PREFIX_OPCODE },
2372 { "paddusw", { MX, EM }, PREFIX_OPCODE },
2373 { "pmaxub", { MX, EM }, PREFIX_OPCODE },
2374 { "pandn", { MX, EM }, PREFIX_OPCODE },
252b5132 2375 /* e0 */
507bd325
L
2376 { "pavgb", { MX, EM }, PREFIX_OPCODE },
2377 { "psraw", { MX, EM }, PREFIX_OPCODE },
2378 { "psrad", { MX, EM }, PREFIX_OPCODE },
2379 { "pavgw", { MX, EM }, PREFIX_OPCODE },
2380 { "pmulhuw", { MX, EM }, PREFIX_OPCODE },
2381 { "pmulhw", { MX, EM }, PREFIX_OPCODE },
1ceb70f8
L
2382 { PREFIX_TABLE (PREFIX_0FE6) },
2383 { PREFIX_TABLE (PREFIX_0FE7) },
252b5132 2384 /* e8 */
507bd325
L
2385 { "psubsb", { MX, EM }, PREFIX_OPCODE },
2386 { "psubsw", { MX, EM }, PREFIX_OPCODE },
2387 { "pminsw", { MX, EM }, PREFIX_OPCODE },
2388 { "por", { MX, EM }, PREFIX_OPCODE },
2389 { "paddsb", { MX, EM }, PREFIX_OPCODE },
2390 { "paddsw", { MX, EM }, PREFIX_OPCODE },
2391 { "pmaxsw", { MX, EM }, PREFIX_OPCODE },
2392 { "pxor", { MX, EM }, PREFIX_OPCODE },
252b5132 2393 /* f0 */
1ceb70f8 2394 { PREFIX_TABLE (PREFIX_0FF0) },
507bd325
L
2395 { "psllw", { MX, EM }, PREFIX_OPCODE },
2396 { "pslld", { MX, EM }, PREFIX_OPCODE },
2397 { "psllq", { MX, EM }, PREFIX_OPCODE },
2398 { "pmuludq", { MX, EM }, PREFIX_OPCODE },
2399 { "pmaddwd", { MX, EM }, PREFIX_OPCODE },
2400 { "psadbw", { MX, EM }, PREFIX_OPCODE },
1ceb70f8 2401 { PREFIX_TABLE (PREFIX_0FF7) },
252b5132 2402 /* f8 */
507bd325
L
2403 { "psubb", { MX, EM }, PREFIX_OPCODE },
2404 { "psubw", { MX, EM }, PREFIX_OPCODE },
2405 { "psubd", { MX, EM }, PREFIX_OPCODE },
2406 { "psubq", { MX, EM }, PREFIX_OPCODE },
2407 { "paddb", { MX, EM }, PREFIX_OPCODE },
2408 { "paddw", { MX, EM }, PREFIX_OPCODE },
2409 { "paddd", { MX, EM }, PREFIX_OPCODE },
66f1eba0 2410 { "ud0S", { Gv, Ev }, 0 },
252b5132
RH
2411};
2412
2413static const unsigned char onebyte_has_modrm[256] = {
c608c12e
AM
2414 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2415 /* ------------------------------- */
2416 /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
2417 /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
2418 /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
2419 /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
2420 /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
2421 /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
2422 /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
2423 /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
2424 /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
2425 /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
2426 /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
2427 /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
2428 /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
2429 /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
2430 /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
2431 /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1 /* f0 */
2432 /* ------------------------------- */
2433 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
252b5132
RH
2434};
2435
2436static const unsigned char twobyte_has_modrm[256] = {
c608c12e
AM
2437 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2438 /* ------------------------------- */
252b5132 2439 /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
b5b1fc4f 2440 /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
85f10a01 2441 /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
331d2d0d 2442 /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
252b5132 2443 /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
4bba6815
AM
2444 /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
2445 /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
85f10a01 2446 /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
252b5132
RH
2447 /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
2448 /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
30d1c836 2449 /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
66f1eba0 2450 /* b0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* bf */
252b5132 2451 /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
ca164297 2452 /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
4bba6815 2453 /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
66f1eba0 2454 /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 /* ff */
c608c12e
AM
2455 /* ------------------------------- */
2456 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2457};
2458
252b5132
RH
2459static char obuf[100];
2460static char *obufp;
ea397f5b 2461static char *mnemonicendp;
252b5132
RH
2462static char scratchbuf[100];
2463static unsigned char *start_codep;
2464static unsigned char *insn_codep;
2465static unsigned char *codep;
285ca992 2466static unsigned char *end_codep;
f16cd0d5
L
2467static int last_lock_prefix;
2468static int last_repz_prefix;
2469static int last_repnz_prefix;
2470static int last_data_prefix;
2471static int last_addr_prefix;
2472static int last_rex_prefix;
2473static int last_seg_prefix;
d9949a36 2474static int fwait_prefix;
285ca992
L
2475/* The active segment register prefix. */
2476static int active_seg_prefix;
f16cd0d5
L
2477#define MAX_CODE_LENGTH 15
2478/* We can up to 14 prefixes since the maximum instruction length is
2479 15bytes. */
2480static int all_prefixes[MAX_CODE_LENGTH - 1];
252b5132 2481static disassemble_info *the_info;
7967e09e
L
2482static struct
2483 {
2484 int mod;
7967e09e 2485 int reg;
484c222e 2486 int rm;
7967e09e
L
2487 }
2488modrm;
4bba6815 2489static unsigned char need_modrm;
dfc8cf43
L
2490static struct
2491 {
2492 int scale;
2493 int index;
2494 int base;
2495 }
2496sib;
c0f3af97
L
2497static struct
2498 {
2499 int register_specifier;
2500 int length;
2501 int prefix;
2502 int w;
43234a1e
L
2503 int evex;
2504 int r;
2505 int v;
2506 int mask_register_specifier;
2507 int zeroing;
2508 int ll;
2509 int b;
c0f3af97
L
2510 }
2511vex;
2512static unsigned char need_vex;
252b5132 2513
ea397f5b
L
2514struct op
2515 {
2516 const char *name;
2517 unsigned int len;
2518 };
2519
4bba6815
AM
2520/* If we are accessing mod/rm/reg without need_modrm set, then the
2521 values are stale. Hitting this abort likely indicates that you
2522 need to update onebyte_has_modrm or twobyte_has_modrm. */
2523#define MODRM_CHECK if (!need_modrm) abort ()
2524
d708bcba
AM
2525static const char **names64;
2526static const char **names32;
2527static const char **names16;
2528static const char **names8;
2529static const char **names8rex;
2530static const char **names_seg;
db51cc60
L
2531static const char *index64;
2532static const char *index32;
d708bcba 2533static const char **index16;
7e8b059b 2534static const char **names_bnd;
d708bcba
AM
2535
2536static const char *intel_names64[] = {
2537 "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
2538 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2539};
2540static const char *intel_names32[] = {
2541 "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
2542 "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
2543};
2544static const char *intel_names16[] = {
2545 "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
2546 "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
2547};
2548static const char *intel_names8[] = {
2549 "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
2550};
2551static const char *intel_names8rex[] = {
2552 "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
2553 "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
2554};
2555static const char *intel_names_seg[] = {
2556 "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
2557};
db51cc60
L
2558static const char *intel_index64 = "riz";
2559static const char *intel_index32 = "eiz";
d708bcba
AM
2560static const char *intel_index16[] = {
2561 "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
2562};
2563
2564static const char *att_names64[] = {
2565 "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
52b15da3
JH
2566 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
2567};
d708bcba
AM
2568static const char *att_names32[] = {
2569 "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
52b15da3 2570 "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
252b5132 2571};
d708bcba
AM
2572static const char *att_names16[] = {
2573 "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
52b15da3 2574 "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
252b5132 2575};
d708bcba
AM
2576static const char *att_names8[] = {
2577 "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
252b5132 2578};
d708bcba
AM
2579static const char *att_names8rex[] = {
2580 "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
52b15da3
JH
2581 "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
2582};
d708bcba
AM
2583static const char *att_names_seg[] = {
2584 "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
252b5132 2585};
db51cc60
L
2586static const char *att_index64 = "%riz";
2587static const char *att_index32 = "%eiz";
d708bcba
AM
2588static const char *att_index16[] = {
2589 "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
252b5132
RH
2590};
2591
b9733481
L
2592static const char **names_mm;
2593static const char *intel_names_mm[] = {
2594 "mm0", "mm1", "mm2", "mm3",
2595 "mm4", "mm5", "mm6", "mm7"
2596};
2597static const char *att_names_mm[] = {
2598 "%mm0", "%mm1", "%mm2", "%mm3",
2599 "%mm4", "%mm5", "%mm6", "%mm7"
2600};
2601
7e8b059b
L
2602static const char *intel_names_bnd[] = {
2603 "bnd0", "bnd1", "bnd2", "bnd3"
2604};
2605
2606static const char *att_names_bnd[] = {
2607 "%bnd0", "%bnd1", "%bnd2", "%bnd3"
2608};
2609
b9733481
L
2610static const char **names_xmm;
2611static const char *intel_names_xmm[] = {
2612 "xmm0", "xmm1", "xmm2", "xmm3",
2613 "xmm4", "xmm5", "xmm6", "xmm7",
2614 "xmm8", "xmm9", "xmm10", "xmm11",
43234a1e
L
2615 "xmm12", "xmm13", "xmm14", "xmm15",
2616 "xmm16", "xmm17", "xmm18", "xmm19",
2617 "xmm20", "xmm21", "xmm22", "xmm23",
2618 "xmm24", "xmm25", "xmm26", "xmm27",
2619 "xmm28", "xmm29", "xmm30", "xmm31"
b9733481
L
2620};
2621static const char *att_names_xmm[] = {
2622 "%xmm0", "%xmm1", "%xmm2", "%xmm3",
2623 "%xmm4", "%xmm5", "%xmm6", "%xmm7",
2624 "%xmm8", "%xmm9", "%xmm10", "%xmm11",
43234a1e
L
2625 "%xmm12", "%xmm13", "%xmm14", "%xmm15",
2626 "%xmm16", "%xmm17", "%xmm18", "%xmm19",
2627 "%xmm20", "%xmm21", "%xmm22", "%xmm23",
2628 "%xmm24", "%xmm25", "%xmm26", "%xmm27",
2629 "%xmm28", "%xmm29", "%xmm30", "%xmm31"
b9733481
L
2630};
2631
2632static const char **names_ymm;
2633static const char *intel_names_ymm[] = {
2634 "ymm0", "ymm1", "ymm2", "ymm3",
2635 "ymm4", "ymm5", "ymm6", "ymm7",
2636 "ymm8", "ymm9", "ymm10", "ymm11",
43234a1e
L
2637 "ymm12", "ymm13", "ymm14", "ymm15",
2638 "ymm16", "ymm17", "ymm18", "ymm19",
2639 "ymm20", "ymm21", "ymm22", "ymm23",
2640 "ymm24", "ymm25", "ymm26", "ymm27",
2641 "ymm28", "ymm29", "ymm30", "ymm31"
b9733481
L
2642};
2643static const char *att_names_ymm[] = {
2644 "%ymm0", "%ymm1", "%ymm2", "%ymm3",
2645 "%ymm4", "%ymm5", "%ymm6", "%ymm7",
2646 "%ymm8", "%ymm9", "%ymm10", "%ymm11",
43234a1e
L
2647 "%ymm12", "%ymm13", "%ymm14", "%ymm15",
2648 "%ymm16", "%ymm17", "%ymm18", "%ymm19",
2649 "%ymm20", "%ymm21", "%ymm22", "%ymm23",
2650 "%ymm24", "%ymm25", "%ymm26", "%ymm27",
2651 "%ymm28", "%ymm29", "%ymm30", "%ymm31"
2652};
2653
2654static const char **names_zmm;
2655static const char *intel_names_zmm[] = {
2656 "zmm0", "zmm1", "zmm2", "zmm3",
2657 "zmm4", "zmm5", "zmm6", "zmm7",
2658 "zmm8", "zmm9", "zmm10", "zmm11",
2659 "zmm12", "zmm13", "zmm14", "zmm15",
2660 "zmm16", "zmm17", "zmm18", "zmm19",
2661 "zmm20", "zmm21", "zmm22", "zmm23",
2662 "zmm24", "zmm25", "zmm26", "zmm27",
2663 "zmm28", "zmm29", "zmm30", "zmm31"
2664};
2665static const char *att_names_zmm[] = {
2666 "%zmm0", "%zmm1", "%zmm2", "%zmm3",
2667 "%zmm4", "%zmm5", "%zmm6", "%zmm7",
2668 "%zmm8", "%zmm9", "%zmm10", "%zmm11",
2669 "%zmm12", "%zmm13", "%zmm14", "%zmm15",
2670 "%zmm16", "%zmm17", "%zmm18", "%zmm19",
2671 "%zmm20", "%zmm21", "%zmm22", "%zmm23",
2672 "%zmm24", "%zmm25", "%zmm26", "%zmm27",
2673 "%zmm28", "%zmm29", "%zmm30", "%zmm31"
2674};
2675
260cd341
LC
2676static const char **names_tmm;
2677static const char *intel_names_tmm[] = {
2678 "tmm0", "tmm1", "tmm2", "tmm3",
2679 "tmm4", "tmm5", "tmm6", "tmm7"
2680};
2681static const char *att_names_tmm[] = {
2682 "%tmm0", "%tmm1", "%tmm2", "%tmm3",
2683 "%tmm4", "%tmm5", "%tmm6", "%tmm7"
2684};
2685
43234a1e
L
2686static const char **names_mask;
2687static const char *intel_names_mask[] = {
2688 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7"
2689};
2690static const char *att_names_mask[] = {
2691 "%k0", "%k1", "%k2", "%k3", "%k4", "%k5", "%k6", "%k7"
2692};
2693
2694static const char *names_rounding[] =
2695{
2696 "{rn-sae}",
2697 "{rd-sae}",
2698 "{ru-sae}",
2699 "{rz-sae}"
b9733481
L
2700};
2701
1ceb70f8
L
2702static const struct dis386 reg_table[][8] = {
2703 /* REG_80 */
252b5132 2704 {
bf890a93
IT
2705 { "addA", { Ebh1, Ib }, 0 },
2706 { "orA", { Ebh1, Ib }, 0 },
2707 { "adcA", { Ebh1, Ib }, 0 },
2708 { "sbbA", { Ebh1, Ib }, 0 },
2709 { "andA", { Ebh1, Ib }, 0 },
2710 { "subA", { Ebh1, Ib }, 0 },
2711 { "xorA", { Ebh1, Ib }, 0 },
2712 { "cmpA", { Eb, Ib }, 0 },
252b5132 2713 },
1ceb70f8 2714 /* REG_81 */
252b5132 2715 {
bf890a93
IT
2716 { "addQ", { Evh1, Iv }, 0 },
2717 { "orQ", { Evh1, Iv }, 0 },
2718 { "adcQ", { Evh1, Iv }, 0 },
2719 { "sbbQ", { Evh1, Iv }, 0 },
2720 { "andQ", { Evh1, Iv }, 0 },
2721 { "subQ", { Evh1, Iv }, 0 },
2722 { "xorQ", { Evh1, Iv }, 0 },
2723 { "cmpQ", { Ev, Iv }, 0 },
252b5132 2724 },
7148c369 2725 /* REG_83 */
252b5132 2726 {
bf890a93
IT
2727 { "addQ", { Evh1, sIb }, 0 },
2728 { "orQ", { Evh1, sIb }, 0 },
2729 { "adcQ", { Evh1, sIb }, 0 },
2730 { "sbbQ", { Evh1, sIb }, 0 },
2731 { "andQ", { Evh1, sIb }, 0 },
2732 { "subQ", { Evh1, sIb }, 0 },
2733 { "xorQ", { Evh1, sIb }, 0 },
2734 { "cmpQ", { Ev, sIb }, 0 },
252b5132 2735 },
1ceb70f8 2736 /* REG_8F */
4e7d34a6 2737 {
36938cab 2738 { "pop{P|}", { stackEv }, 0 },
c48244a5 2739 { XOP_8F_TABLE (XOP_09) },
592d1631
L
2740 { Bad_Opcode },
2741 { Bad_Opcode },
2742 { Bad_Opcode },
f88c9eb0 2743 { XOP_8F_TABLE (XOP_09) },
4e7d34a6 2744 },
1ceb70f8 2745 /* REG_C0 */
252b5132 2746 {
bf890a93
IT
2747 { "rolA", { Eb, Ib }, 0 },
2748 { "rorA", { Eb, Ib }, 0 },
2749 { "rclA", { Eb, Ib }, 0 },
2750 { "rcrA", { Eb, Ib }, 0 },
2751 { "shlA", { Eb, Ib }, 0 },
2752 { "shrA", { Eb, Ib }, 0 },
e4bdd679 2753 { "shlA", { Eb, Ib }, 0 },
bf890a93 2754 { "sarA", { Eb, Ib }, 0 },
252b5132 2755 },
1ceb70f8 2756 /* REG_C1 */
252b5132 2757 {
bf890a93
IT
2758 { "rolQ", { Ev, Ib }, 0 },
2759 { "rorQ", { Ev, Ib }, 0 },
2760 { "rclQ", { Ev, Ib }, 0 },
2761 { "rcrQ", { Ev, Ib }, 0 },
2762 { "shlQ", { Ev, Ib }, 0 },
2763 { "shrQ", { Ev, Ib }, 0 },
e4bdd679 2764 { "shlQ", { Ev, Ib }, 0 },
bf890a93 2765 { "sarQ", { Ev, Ib }, 0 },
252b5132 2766 },
1ceb70f8 2767 /* REG_C6 */
4e7d34a6 2768 {
bf890a93 2769 { "movA", { Ebh3, Ib }, 0 },
42164a71
L
2770 { Bad_Opcode },
2771 { Bad_Opcode },
2772 { Bad_Opcode },
2773 { Bad_Opcode },
2774 { Bad_Opcode },
2775 { Bad_Opcode },
2776 { MOD_TABLE (MOD_C6_REG_7) },
4e7d34a6 2777 },
1ceb70f8 2778 /* REG_C7 */
4e7d34a6 2779 {
bf890a93 2780 { "movQ", { Evh3, Iv }, 0 },
42164a71
L
2781 { Bad_Opcode },
2782 { Bad_Opcode },
2783 { Bad_Opcode },
2784 { Bad_Opcode },
2785 { Bad_Opcode },
2786 { Bad_Opcode },
2787 { MOD_TABLE (MOD_C7_REG_7) },
4e7d34a6 2788 },
1ceb70f8 2789 /* REG_D0 */
252b5132 2790 {
bf890a93
IT
2791 { "rolA", { Eb, I1 }, 0 },
2792 { "rorA", { Eb, I1 }, 0 },
2793 { "rclA", { Eb, I1 }, 0 },
2794 { "rcrA", { Eb, I1 }, 0 },
2795 { "shlA", { Eb, I1 }, 0 },
2796 { "shrA", { Eb, I1 }, 0 },
e4bdd679 2797 { "shlA", { Eb, I1 }, 0 },
bf890a93 2798 { "sarA", { Eb, I1 }, 0 },
252b5132 2799 },
1ceb70f8 2800 /* REG_D1 */
252b5132 2801 {
bf890a93
IT
2802 { "rolQ", { Ev, I1 }, 0 },
2803 { "rorQ", { Ev, I1 }, 0 },
2804 { "rclQ", { Ev, I1 }, 0 },
2805 { "rcrQ", { Ev, I1 }, 0 },
2806 { "shlQ", { Ev, I1 }, 0 },
2807 { "shrQ", { Ev, I1 }, 0 },
e4bdd679 2808 { "shlQ", { Ev, I1 }, 0 },
bf890a93 2809 { "sarQ", { Ev, I1 }, 0 },
252b5132 2810 },
1ceb70f8 2811 /* REG_D2 */
252b5132 2812 {
bf890a93
IT
2813 { "rolA", { Eb, CL }, 0 },
2814 { "rorA", { Eb, CL }, 0 },
2815 { "rclA", { Eb, CL }, 0 },
2816 { "rcrA", { Eb, CL }, 0 },
2817 { "shlA", { Eb, CL }, 0 },
2818 { "shrA", { Eb, CL }, 0 },
e4bdd679 2819 { "shlA", { Eb, CL }, 0 },
bf890a93 2820 { "sarA", { Eb, CL }, 0 },
252b5132 2821 },
1ceb70f8 2822 /* REG_D3 */
252b5132 2823 {
bf890a93
IT
2824 { "rolQ", { Ev, CL }, 0 },
2825 { "rorQ", { Ev, CL }, 0 },
2826 { "rclQ", { Ev, CL }, 0 },
2827 { "rcrQ", { Ev, CL }, 0 },
2828 { "shlQ", { Ev, CL }, 0 },
2829 { "shrQ", { Ev, CL }, 0 },
e4bdd679 2830 { "shlQ", { Ev, CL }, 0 },
bf890a93 2831 { "sarQ", { Ev, CL }, 0 },
252b5132 2832 },
1ceb70f8 2833 /* REG_F6 */
252b5132 2834 {
bf890a93 2835 { "testA", { Eb, Ib }, 0 },
7db2c588 2836 { "testA", { Eb, Ib }, 0 },
bf890a93
IT
2837 { "notA", { Ebh1 }, 0 },
2838 { "negA", { Ebh1 }, 0 },
2839 { "mulA", { Eb }, 0 }, /* Don't print the implicit %al register, */
2840 { "imulA", { Eb }, 0 }, /* to distinguish these opcodes from other */
2841 { "divA", { Eb }, 0 }, /* mul/imul opcodes. Do the same for div */
2842 { "idivA", { Eb }, 0 }, /* and idiv for consistency. */
252b5132 2843 },
1ceb70f8 2844 /* REG_F7 */
252b5132 2845 {
bf890a93 2846 { "testQ", { Ev, Iv }, 0 },
7db2c588 2847 { "testQ", { Ev, Iv }, 0 },
bf890a93
IT
2848 { "notQ", { Evh1 }, 0 },
2849 { "negQ", { Evh1 }, 0 },
2850 { "mulQ", { Ev }, 0 }, /* Don't print the implicit register. */
2851 { "imulQ", { Ev }, 0 },
2852 { "divQ", { Ev }, 0 },
2853 { "idivQ", { Ev }, 0 },
252b5132 2854 },
1ceb70f8 2855 /* REG_FE */
252b5132 2856 {
bf890a93
IT
2857 { "incA", { Ebh1 }, 0 },
2858 { "decA", { Ebh1 }, 0 },
252b5132 2859 },
1ceb70f8 2860 /* REG_FF */
252b5132 2861 {
bf890a93
IT
2862 { "incQ", { Evh1 }, 0 },
2863 { "decQ", { Evh1 }, 0 },
36938cab 2864 { "call{@|}", { NOTRACK, indirEv, BND }, 0 },
4a357820 2865 { MOD_TABLE (MOD_FF_REG_3) },
36938cab 2866 { "jmp{@|}", { NOTRACK, indirEv, BND }, 0 },
4a357820 2867 { MOD_TABLE (MOD_FF_REG_5) },
36938cab 2868 { "push{P|}", { stackEv }, 0 },
592d1631 2869 { Bad_Opcode },
252b5132 2870 },
1ceb70f8 2871 /* REG_0F00 */
252b5132 2872 {
bf890a93
IT
2873 { "sldtD", { Sv }, 0 },
2874 { "strD", { Sv }, 0 },
2875 { "lldt", { Ew }, 0 },
2876 { "ltr", { Ew }, 0 },
2877 { "verr", { Ew }, 0 },
2878 { "verw", { Ew }, 0 },
592d1631
L
2879 { Bad_Opcode },
2880 { Bad_Opcode },
252b5132 2881 },
1ceb70f8 2882 /* REG_0F01 */
252b5132 2883 {
1ceb70f8
L
2884 { MOD_TABLE (MOD_0F01_REG_0) },
2885 { MOD_TABLE (MOD_0F01_REG_1) },
2886 { MOD_TABLE (MOD_0F01_REG_2) },
2887 { MOD_TABLE (MOD_0F01_REG_3) },
bf890a93 2888 { "smswD", { Sv }, 0 },
8eab4136 2889 { MOD_TABLE (MOD_0F01_REG_5) },
bf890a93 2890 { "lmsw", { Ew }, 0 },
1ceb70f8 2891 { MOD_TABLE (MOD_0F01_REG_7) },
252b5132 2892 },
b5b1fc4f 2893 /* REG_0F0D */
252b5132 2894 {
bf890a93
IT
2895 { "prefetch", { Mb }, 0 },
2896 { "prefetchw", { Mb }, 0 },
2897 { "prefetchwt1", { Mb }, 0 },
2898 { "prefetch", { Mb }, 0 },
2899 { "prefetch", { Mb }, 0 },
2900 { "prefetch", { Mb }, 0 },
2901 { "prefetch", { Mb }, 0 },
2902 { "prefetch", { Mb }, 0 },
252b5132 2903 },
1ceb70f8 2904 /* REG_0F18 */
252b5132 2905 {
1ceb70f8
L
2906 { MOD_TABLE (MOD_0F18_REG_0) },
2907 { MOD_TABLE (MOD_0F18_REG_1) },
2908 { MOD_TABLE (MOD_0F18_REG_2) },
2909 { MOD_TABLE (MOD_0F18_REG_3) },
d7189fa5
RM
2910 { MOD_TABLE (MOD_0F18_REG_4) },
2911 { MOD_TABLE (MOD_0F18_REG_5) },
2912 { MOD_TABLE (MOD_0F18_REG_6) },
2913 { MOD_TABLE (MOD_0F18_REG_7) },
252b5132 2914 },
f8687e93 2915 /* REG_0F1C_P_0_MOD_0 */
c48935d7
IT
2916 {
2917 { "cldemote", { Mb }, 0 },
2918 { "nopQ", { Ev }, 0 },
2919 { "nopQ", { Ev }, 0 },
2920 { "nopQ", { Ev }, 0 },
2921 { "nopQ", { Ev }, 0 },
2922 { "nopQ", { Ev }, 0 },
2923 { "nopQ", { Ev }, 0 },
2924 { "nopQ", { Ev }, 0 },
2925 },
f8687e93 2926 /* REG_0F1E_P_1_MOD_3 */
603555e5
L
2927 {
2928 { "nopQ", { Ev }, 0 },
464d2b65 2929 { "rdsspK", { Edq }, PREFIX_OPCODE },
603555e5
L
2930 { "nopQ", { Ev }, 0 },
2931 { "nopQ", { Ev }, 0 },
2932 { "nopQ", { Ev }, 0 },
2933 { "nopQ", { Ev }, 0 },
2934 { "nopQ", { Ev }, 0 },
f8687e93 2935 { RM_TABLE (RM_0F1E_P_1_MOD_3_REG_7) },
603555e5 2936 },
c4694f17
TG
2937 /* REG_0F38D8_PREFIX_1 */
2938 {
2939 { "aesencwide128kl", { M }, 0 },
2940 { "aesdecwide128kl", { M }, 0 },
2941 { "aesencwide256kl", { M }, 0 },
2942 { "aesdecwide256kl", { M }, 0 },
2943 },
c1fa250a
LC
2944 /* REG_0F3A0F_PREFIX_1_MOD_3 */
2945 {
2946 { RM_TABLE (RM_0F3A0F_P_1_MOD_3_REG_0) },
2947 },
1ceb70f8 2948 /* REG_0F71 */
a6bd098c 2949 {
592d1631
L
2950 { Bad_Opcode },
2951 { Bad_Opcode },
1ceb70f8 2952 { MOD_TABLE (MOD_0F71_REG_2) },
592d1631 2953 { Bad_Opcode },
1ceb70f8 2954 { MOD_TABLE (MOD_0F71_REG_4) },
592d1631 2955 { Bad_Opcode },
1ceb70f8 2956 { MOD_TABLE (MOD_0F71_REG_6) },
a6bd098c 2957 },
1ceb70f8 2958 /* REG_0F72 */
a6bd098c 2959 {
592d1631
L
2960 { Bad_Opcode },
2961 { Bad_Opcode },
1ceb70f8 2962 { MOD_TABLE (MOD_0F72_REG_2) },
592d1631 2963 { Bad_Opcode },
1ceb70f8 2964 { MOD_TABLE (MOD_0F72_REG_4) },
592d1631 2965 { Bad_Opcode },
1ceb70f8 2966 { MOD_TABLE (MOD_0F72_REG_6) },
a6bd098c 2967 },
1ceb70f8 2968 /* REG_0F73 */
252b5132 2969 {
592d1631
L
2970 { Bad_Opcode },
2971 { Bad_Opcode },
1ceb70f8
L
2972 { MOD_TABLE (MOD_0F73_REG_2) },
2973 { MOD_TABLE (MOD_0F73_REG_3) },
592d1631
L
2974 { Bad_Opcode },
2975 { Bad_Opcode },
1ceb70f8
L
2976 { MOD_TABLE (MOD_0F73_REG_6) },
2977 { MOD_TABLE (MOD_0F73_REG_7) },
252b5132 2978 },
1ceb70f8 2979 /* REG_0FA6 */
252b5132 2980 {
bf890a93
IT
2981 { "montmul", { { OP_0f07, 0 } }, 0 },
2982 { "xsha1", { { OP_0f07, 0 } }, 0 },
2983 { "xsha256", { { OP_0f07, 0 } }, 0 },
4e7d34a6 2984 },
1ceb70f8 2985 /* REG_0FA7 */
4e7d34a6 2986 {
bf890a93
IT
2987 { "xstore-rng", { { OP_0f07, 0 } }, 0 },
2988 { "xcrypt-ecb", { { OP_0f07, 0 } }, 0 },
2989 { "xcrypt-cbc", { { OP_0f07, 0 } }, 0 },
2990 { "xcrypt-ctr", { { OP_0f07, 0 } }, 0 },
2991 { "xcrypt-cfb", { { OP_0f07, 0 } }, 0 },
2992 { "xcrypt-ofb", { { OP_0f07, 0 } }, 0 },
4e7d34a6 2993 },
1ceb70f8 2994 /* REG_0FAE */
4e7d34a6 2995 {
1ceb70f8
L
2996 { MOD_TABLE (MOD_0FAE_REG_0) },
2997 { MOD_TABLE (MOD_0FAE_REG_1) },
2998 { MOD_TABLE (MOD_0FAE_REG_2) },
2999 { MOD_TABLE (MOD_0FAE_REG_3) },
475a2301 3000 { MOD_TABLE (MOD_0FAE_REG_4) },
1ceb70f8
L
3001 { MOD_TABLE (MOD_0FAE_REG_5) },
3002 { MOD_TABLE (MOD_0FAE_REG_6) },
3003 { MOD_TABLE (MOD_0FAE_REG_7) },
252b5132 3004 },
1ceb70f8 3005 /* REG_0FBA */
252b5132 3006 {
592d1631
L
3007 { Bad_Opcode },
3008 { Bad_Opcode },
3009 { Bad_Opcode },
3010 { Bad_Opcode },
bf890a93
IT
3011 { "btQ", { Ev, Ib }, 0 },
3012 { "btsQ", { Evh1, Ib }, 0 },
3013 { "btrQ", { Evh1, Ib }, 0 },
3014 { "btcQ", { Evh1, Ib }, 0 },
c608c12e 3015 },
1ceb70f8 3016 /* REG_0FC7 */
c608c12e 3017 {
592d1631 3018 { Bad_Opcode },
bf890a93 3019 { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } }, 0 },
592d1631 3020 { Bad_Opcode },
963f3586
IT
3021 { MOD_TABLE (MOD_0FC7_REG_3) },
3022 { MOD_TABLE (MOD_0FC7_REG_4) },
3023 { MOD_TABLE (MOD_0FC7_REG_5) },
1ceb70f8
L
3024 { MOD_TABLE (MOD_0FC7_REG_6) },
3025 { MOD_TABLE (MOD_0FC7_REG_7) },
252b5132 3026 },
592a252b 3027 /* REG_VEX_0F71 */
c0f3af97 3028 {
592d1631
L
3029 { Bad_Opcode },
3030 { Bad_Opcode },
592a252b 3031 { MOD_TABLE (MOD_VEX_0F71_REG_2) },
592d1631 3032 { Bad_Opcode },
592a252b 3033 { MOD_TABLE (MOD_VEX_0F71_REG_4) },
592d1631 3034 { Bad_Opcode },
592a252b 3035 { MOD_TABLE (MOD_VEX_0F71_REG_6) },
c0f3af97 3036 },
592a252b 3037 /* REG_VEX_0F72 */
c0f3af97 3038 {
592d1631
L
3039 { Bad_Opcode },
3040 { Bad_Opcode },
592a252b 3041 { MOD_TABLE (MOD_VEX_0F72_REG_2) },
592d1631 3042 { Bad_Opcode },
592a252b 3043 { MOD_TABLE (MOD_VEX_0F72_REG_4) },
592d1631 3044 { Bad_Opcode },
592a252b 3045 { MOD_TABLE (MOD_VEX_0F72_REG_6) },
c0f3af97 3046 },
592a252b 3047 /* REG_VEX_0F73 */
c0f3af97 3048 {
592d1631
L
3049 { Bad_Opcode },
3050 { Bad_Opcode },
592a252b
L
3051 { MOD_TABLE (MOD_VEX_0F73_REG_2) },
3052 { MOD_TABLE (MOD_VEX_0F73_REG_3) },
592d1631
L
3053 { Bad_Opcode },
3054 { Bad_Opcode },
592a252b
L
3055 { MOD_TABLE (MOD_VEX_0F73_REG_6) },
3056 { MOD_TABLE (MOD_VEX_0F73_REG_7) },
c0f3af97 3057 },
592a252b 3058 /* REG_VEX_0FAE */
c0f3af97 3059 {
592d1631
L
3060 { Bad_Opcode },
3061 { Bad_Opcode },
592a252b
L
3062 { MOD_TABLE (MOD_VEX_0FAE_REG_2) },
3063 { MOD_TABLE (MOD_VEX_0FAE_REG_3) },
c0f3af97 3064 },
260cd341
LC
3065 /* REG_VEX_0F3849_X86_64_P_0_W_0_M_1 */
3066 {
3067 { RM_TABLE (RM_VEX_0F3849_X86_64_P_0_W_0_M_1_R_0) },
3068 },
f12dc422
L
3069 /* REG_VEX_0F38F3 */
3070 {
3071 { Bad_Opcode },
035e7389
JB
3072 { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_1) },
3073 { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_2) },
3074 { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_3) },
f12dc422 3075 },
467bbef0 3076 /* REG_0FXOP_09_01_L_0 */
2a2a0f38
QN
3077 {
3078 { Bad_Opcode },
467bbef0
JB
3079 { "blcfill", { VexGdq, Edq }, 0 },
3080 { "blsfill", { VexGdq, Edq }, 0 },
3081 { "blcs", { VexGdq, Edq }, 0 },
3082 { "tzmsk", { VexGdq, Edq }, 0 },
3083 { "blcic", { VexGdq, Edq }, 0 },
3084 { "blsic", { VexGdq, Edq }, 0 },
3085 { "t1mskc", { VexGdq, Edq }, 0 },
2a2a0f38 3086 },
467bbef0 3087 /* REG_0FXOP_09_02_L_0 */
2a2a0f38
QN
3088 {
3089 { Bad_Opcode },
467bbef0 3090 { "blcmsk", { VexGdq, Edq }, 0 },
2a2a0f38
QN
3091 { Bad_Opcode },
3092 { Bad_Opcode },
3093 { Bad_Opcode },
3094 { Bad_Opcode },
467bbef0
JB
3095 { "blci", { VexGdq, Edq }, 0 },
3096 },
3097 /* REG_0FXOP_09_12_M_1_L_0 */
3098 {
3099 { "llwpcb", { Edq }, 0 },
3100 { "slwpcb", { Edq }, 0 },
3101 },
3102 /* REG_0FXOP_0A_12_L_0 */
3103 {
3104 { "lwpins", { VexGdq, Ed, Id }, 0 },
3105 { "lwpval", { VexGdq, Ed, Id }, 0 },
2a2a0f38 3106 },
ad692897
L
3107
3108#include "i386-dis-evex-reg.h"
4e7d34a6
L
3109};
3110
1ceb70f8
L
3111static const struct dis386 prefix_table[][4] = {
3112 /* PREFIX_90 */
252b5132 3113 {
bf890a93
IT
3114 { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } }, 0 },
3115 { "pause", { XX }, 0 },
3116 { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } }, 0 },
507bd325 3117 { NULL, { { NULL, 0 } }, PREFIX_IGNORED }
0f10071e 3118 },
4e7d34a6 3119
81d54bb7
CL
3120 /* PREFIX_0F01_REG_1_RM_4 */
3121 {
3122 { Bad_Opcode },
3123 { Bad_Opcode },
3124 { "tdcall", { Skip_MODRM }, 0 },
3125 { Bad_Opcode },
3126 },
3127
3128 /* PREFIX_0F01_REG_1_RM_5 */
3129 {
3130 { Bad_Opcode },
3131 { Bad_Opcode },
3132 { X86_64_TABLE (X86_64_0F01_REG_1_RM_5_PREFIX_2) },
3133 { Bad_Opcode },
3134 },
3135
3136 /* PREFIX_0F01_REG_1_RM_6 */
3137 {
3138 { Bad_Opcode },
3139 { Bad_Opcode },
3140 { X86_64_TABLE (X86_64_0F01_REG_1_RM_6_PREFIX_2) },
3141 { Bad_Opcode },
3142 },
3143
3144 /* PREFIX_0F01_REG_1_RM_7 */
3145 {
3146 { "encls", { Skip_MODRM }, 0 },
3147 { Bad_Opcode },
3148 { X86_64_TABLE (X86_64_0F01_REG_1_RM_7_PREFIX_2) },
3149 { Bad_Opcode },
3150 },
3151
f9630fa6 3152 /* PREFIX_0F01_REG_3_RM_1 */
a847e322
JB
3153 {
3154 { "vmmcall", { Skip_MODRM }, 0 },
3155 { "vmgexit", { Skip_MODRM }, 0 },
d27c357a
JB
3156 { Bad_Opcode },
3157 { "vmgexit", { Skip_MODRM }, 0 },
a847e322
JB
3158 },
3159
f8687e93 3160 /* PREFIX_0F01_REG_5_MOD_0 */
603555e5
L
3161 {
3162 { Bad_Opcode },
3163 { "rstorssp", { Mq }, PREFIX_OPCODE },
3164 },
3165
f8687e93 3166 /* PREFIX_0F01_REG_5_MOD_3_RM_0 */
603555e5 3167 {
4b27d27c 3168 { "serialize", { Skip_MODRM }, PREFIX_OPCODE },
2234eee6 3169 { "setssbsy", { Skip_MODRM }, PREFIX_OPCODE },
bb651e8b 3170 { Bad_Opcode },
efe30057 3171 { "xsusldtrk", { Skip_MODRM }, PREFIX_OPCODE },
bb651e8b
CL
3172 },
3173
3174 /* PREFIX_0F01_REG_5_MOD_3_RM_1 */
3175 {
3176 { Bad_Opcode },
3177 { Bad_Opcode },
3178 { Bad_Opcode },
3179 { "xresldtrk", { Skip_MODRM }, PREFIX_OPCODE },
603555e5
L
3180 },
3181
f8687e93 3182 /* PREFIX_0F01_REG_5_MOD_3_RM_2 */
603555e5
L
3183 {
3184 { Bad_Opcode },
c2f76402 3185 { "saveprevssp", { Skip_MODRM }, PREFIX_OPCODE },
603555e5
L
3186 },
3187
f64c42a9
LC
3188 /* PREFIX_0F01_REG_5_MOD_3_RM_4 */
3189 {
3190 { Bad_Opcode },
3191 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1) },
3192 },
3193
3194 /* PREFIX_0F01_REG_5_MOD_3_RM_5 */
3195 {
3196 { Bad_Opcode },
3197 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1) },
3198 },
3199
3200 /* PREFIX_0F01_REG_5_MOD_3_RM_6 */
3201 {
3202 { "rdpkru", { Skip_MODRM }, 0 },
3203 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1) },
3204 },
3205
3206 /* PREFIX_0F01_REG_5_MOD_3_RM_7 */
3207 {
3208 { "wrpkru", { Skip_MODRM }, 0 },
3209 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1) },
3210 },
3211
267b8516
JB
3212 /* PREFIX_0F01_REG_7_MOD_3_RM_2 */
3213 {
3214 { "monitorx", { { OP_Monitor, 0 } }, 0 },
142861df 3215 { "mcommit", { Skip_MODRM }, 0 },
267b8516
JB
3216 },
3217
646cc3e0
GG
3218 /* PREFIX_0F01_REG_7_MOD_3_RM_6 */
3219 {
3220 { "invlpgb", { Skip_MODRM }, 0 },
3221 { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1) },
3222 { Bad_Opcode },
3223 { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3) },
3224 },
3225
3226 /* PREFIX_0F01_REG_7_MOD_3_RM_7 */
3227 {
3228 { "tlbsync", { Skip_MODRM }, 0 },
3229 { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1) },
3230 { Bad_Opcode },
3231 { "pvalidate", { Skip_MODRM }, 0 },
3232 },
3233
3233d7d0
IT
3234 /* PREFIX_0F09 */
3235 {
3236 { "wbinvd", { XX }, 0 },
3237 { "wbnoinvd", { XX }, 0 },
3238 },
3239
1ceb70f8 3240 /* PREFIX_0F10 */
cc0ec051 3241 {
507bd325
L
3242 { "movups", { XM, EXx }, PREFIX_OPCODE },
3243 { "movss", { XM, EXd }, PREFIX_OPCODE },
3244 { "movupd", { XM, EXx }, PREFIX_OPCODE },
3245 { "movsd", { XM, EXq }, PREFIX_OPCODE },
30d1c836 3246 },
4e7d34a6 3247
1ceb70f8 3248 /* PREFIX_0F11 */
30d1c836 3249 {
507bd325
L
3250 { "movups", { EXxS, XM }, PREFIX_OPCODE },
3251 { "movss", { EXdS, XM }, PREFIX_OPCODE },
3252 { "movupd", { EXxS, XM }, PREFIX_OPCODE },
3253 { "movsd", { EXqS, XM }, PREFIX_OPCODE },
4e7d34a6 3254 },
252b5132 3255
1ceb70f8 3256 /* PREFIX_0F12 */
c608c12e 3257 {
1ceb70f8 3258 { MOD_TABLE (MOD_0F12_PREFIX_0) },
507bd325 3259 { "movsldup", { XM, EXx }, PREFIX_OPCODE },
18897deb 3260 { MOD_TABLE (MOD_0F12_PREFIX_2) },
507bd325 3261 { "movddup", { XM, EXq }, PREFIX_OPCODE },
c608c12e 3262 },
4e7d34a6 3263
1ceb70f8 3264 /* PREFIX_0F16 */
c608c12e 3265 {
1ceb70f8 3266 { MOD_TABLE (MOD_0F16_PREFIX_0) },
507bd325 3267 { "movshdup", { XM, EXx }, PREFIX_OPCODE },
18897deb 3268 { MOD_TABLE (MOD_0F16_PREFIX_2) },
c608c12e 3269 },
4e7d34a6 3270
7e8b059b
L
3271 /* PREFIX_0F1A */
3272 {
3273 { MOD_TABLE (MOD_0F1A_PREFIX_0) },
bf890a93
IT
3274 { "bndcl", { Gbnd, Ev_bnd }, 0 },
3275 { "bndmov", { Gbnd, Ebnd }, 0 },
3276 { "bndcu", { Gbnd, Ev_bnd }, 0 },
7e8b059b
L
3277 },
3278
3279 /* PREFIX_0F1B */
3280 {
3281 { MOD_TABLE (MOD_0F1B_PREFIX_0) },
3282 { MOD_TABLE (MOD_0F1B_PREFIX_1) },
9f79e886 3283 { "bndmov", { EbndS, Gbnd }, 0 },
bf890a93 3284 { "bndcn", { Gbnd, Ev_bnd }, 0 },
7e8b059b
L
3285 },
3286
c48935d7
IT
3287 /* PREFIX_0F1C */
3288 {
3289 { MOD_TABLE (MOD_0F1C_PREFIX_0) },
3290 { "nopQ", { Ev }, PREFIX_OPCODE },
3291 { "nopQ", { Ev }, PREFIX_OPCODE },
3292 { "nopQ", { Ev }, PREFIX_OPCODE },
3293 },
3294
603555e5
L
3295 /* PREFIX_0F1E */
3296 {
3297 { "nopQ", { Ev }, PREFIX_OPCODE },
3298 { MOD_TABLE (MOD_0F1E_PREFIX_1) },
3299 { "nopQ", { Ev }, PREFIX_OPCODE },
3300 { "nopQ", { Ev }, PREFIX_OPCODE },
3301 },
3302
1ceb70f8 3303 /* PREFIX_0F2A */
c608c12e 3304 {
507bd325 3305 { "cvtpi2ps", { XM, EMCq }, PREFIX_OPCODE },
b24d668c 3306 { "cvtsi2ss{%LQ|}", { XM, Edq }, PREFIX_OPCODE },
507bd325 3307 { "cvtpi2pd", { XM, EMCq }, PREFIX_OPCODE },
b24d668c 3308 { "cvtsi2sd{%LQ|}", { XM, Edq }, 0 },
c608c12e 3309 },
4e7d34a6 3310
1ceb70f8 3311 /* PREFIX_0F2B */
c608c12e 3312 {
75c135a8
L
3313 { MOD_TABLE (MOD_0F2B_PREFIX_0) },
3314 { MOD_TABLE (MOD_0F2B_PREFIX_1) },
3315 { MOD_TABLE (MOD_0F2B_PREFIX_2) },
3316 { MOD_TABLE (MOD_0F2B_PREFIX_3) },
c608c12e 3317 },
4e7d34a6 3318
1ceb70f8 3319 /* PREFIX_0F2C */
c608c12e 3320 {
507bd325 3321 { "cvttps2pi", { MXC, EXq }, PREFIX_OPCODE },
e1a1babd 3322 { "cvttss2si", { Gdq, EXd }, PREFIX_OPCODE },
507bd325 3323 { "cvttpd2pi", { MXC, EXx }, PREFIX_OPCODE },
e1a1babd 3324 { "cvttsd2si", { Gdq, EXq }, PREFIX_OPCODE },
c608c12e 3325 },
4e7d34a6 3326
1ceb70f8 3327 /* PREFIX_0F2D */
c608c12e 3328 {
507bd325 3329 { "cvtps2pi", { MXC, EXq }, PREFIX_OPCODE },
e1a1babd 3330 { "cvtss2si", { Gdq, EXd }, PREFIX_OPCODE },
507bd325 3331 { "cvtpd2pi", { MXC, EXx }, PREFIX_OPCODE },
e1a1babd 3332 { "cvtsd2si", { Gdq, EXq }, PREFIX_OPCODE },
c608c12e 3333 },
4e7d34a6 3334
1ceb70f8 3335 /* PREFIX_0F2E */
c608c12e 3336 {
bf890a93 3337 { "ucomiss",{ XM, EXd }, 0 },
592d1631 3338 { Bad_Opcode },
bf890a93 3339 { "ucomisd",{ XM, EXq }, 0 },
c608c12e 3340 },
4e7d34a6 3341
1ceb70f8 3342 /* PREFIX_0F2F */
c608c12e 3343 {
bf890a93 3344 { "comiss", { XM, EXd }, 0 },
592d1631 3345 { Bad_Opcode },
bf890a93 3346 { "comisd", { XM, EXq }, 0 },
c608c12e 3347 },
4e7d34a6 3348
1ceb70f8 3349 /* PREFIX_0F51 */
c608c12e 3350 {
507bd325
L
3351 { "sqrtps", { XM, EXx }, PREFIX_OPCODE },
3352 { "sqrtss", { XM, EXd }, PREFIX_OPCODE },
3353 { "sqrtpd", { XM, EXx }, PREFIX_OPCODE },
3354 { "sqrtsd", { XM, EXq }, PREFIX_OPCODE },
c608c12e 3355 },
4e7d34a6 3356
1ceb70f8 3357 /* PREFIX_0F52 */
c608c12e 3358 {
507bd325
L
3359 { "rsqrtps",{ XM, EXx }, PREFIX_OPCODE },
3360 { "rsqrtss",{ XM, EXd }, PREFIX_OPCODE },
c608c12e 3361 },
4e7d34a6 3362
1ceb70f8 3363 /* PREFIX_0F53 */
c608c12e 3364 {
507bd325
L
3365 { "rcpps", { XM, EXx }, PREFIX_OPCODE },
3366 { "rcpss", { XM, EXd }, PREFIX_OPCODE },
c608c12e 3367 },
4e7d34a6 3368
1ceb70f8 3369 /* PREFIX_0F58 */
c608c12e 3370 {
507bd325
L
3371 { "addps", { XM, EXx }, PREFIX_OPCODE },
3372 { "addss", { XM, EXd }, PREFIX_OPCODE },
3373 { "addpd", { XM, EXx }, PREFIX_OPCODE },
3374 { "addsd", { XM, EXq }, PREFIX_OPCODE },
c608c12e 3375 },
4e7d34a6 3376
1ceb70f8 3377 /* PREFIX_0F59 */
c608c12e 3378 {
507bd325
L
3379 { "mulps", { XM, EXx }, PREFIX_OPCODE },
3380 { "mulss", { XM, EXd }, PREFIX_OPCODE },
3381 { "mulpd", { XM, EXx }, PREFIX_OPCODE },
3382 { "mulsd", { XM, EXq }, PREFIX_OPCODE },
041bd2e0 3383 },
4e7d34a6 3384
1ceb70f8 3385 /* PREFIX_0F5A */
041bd2e0 3386 {
507bd325
L
3387 { "cvtps2pd", { XM, EXq }, PREFIX_OPCODE },
3388 { "cvtss2sd", { XM, EXd }, PREFIX_OPCODE },
3389 { "cvtpd2ps", { XM, EXx }, PREFIX_OPCODE },
3390 { "cvtsd2ss", { XM, EXq }, PREFIX_OPCODE },
041bd2e0 3391 },
4e7d34a6 3392
1ceb70f8 3393 /* PREFIX_0F5B */
041bd2e0 3394 {
507bd325
L
3395 { "cvtdq2ps", { XM, EXx }, PREFIX_OPCODE },
3396 { "cvttps2dq", { XM, EXx }, PREFIX_OPCODE },
3397 { "cvtps2dq", { XM, EXx }, PREFIX_OPCODE },
041bd2e0 3398 },
4e7d34a6 3399
1ceb70f8 3400 /* PREFIX_0F5C */
041bd2e0 3401 {
507bd325
L
3402 { "subps", { XM, EXx }, PREFIX_OPCODE },
3403 { "subss", { XM, EXd }, PREFIX_OPCODE },
3404 { "subpd", { XM, EXx }, PREFIX_OPCODE },
3405 { "subsd", { XM, EXq }, PREFIX_OPCODE },
041bd2e0 3406 },
4e7d34a6 3407
1ceb70f8 3408 /* PREFIX_0F5D */
041bd2e0 3409 {
507bd325
L
3410 { "minps", { XM, EXx }, PREFIX_OPCODE },
3411 { "minss", { XM, EXd }, PREFIX_OPCODE },
3412 { "minpd", { XM, EXx }, PREFIX_OPCODE },
3413 { "minsd", { XM, EXq }, PREFIX_OPCODE },
041bd2e0 3414 },
4e7d34a6 3415
1ceb70f8 3416 /* PREFIX_0F5E */
041bd2e0 3417 {
507bd325
L
3418 { "divps", { XM, EXx }, PREFIX_OPCODE },
3419 { "divss", { XM, EXd }, PREFIX_OPCODE },
3420 { "divpd", { XM, EXx }, PREFIX_OPCODE },
3421 { "divsd", { XM, EXq }, PREFIX_OPCODE },
041bd2e0 3422 },
4e7d34a6 3423
1ceb70f8 3424 /* PREFIX_0F5F */
041bd2e0 3425 {
507bd325
L
3426 { "maxps", { XM, EXx }, PREFIX_OPCODE },
3427 { "maxss", { XM, EXd }, PREFIX_OPCODE },
3428 { "maxpd", { XM, EXx }, PREFIX_OPCODE },
3429 { "maxsd", { XM, EXq }, PREFIX_OPCODE },
041bd2e0 3430 },
4e7d34a6 3431
1ceb70f8 3432 /* PREFIX_0F60 */
041bd2e0 3433 {
507bd325 3434 { "punpcklbw",{ MX, EMd }, PREFIX_OPCODE },
592d1631 3435 { Bad_Opcode },
507bd325 3436 { "punpcklbw",{ MX, EMx }, PREFIX_OPCODE },
041bd2e0 3437 },
4e7d34a6 3438
1ceb70f8 3439 /* PREFIX_0F61 */
041bd2e0 3440 {
507bd325 3441 { "punpcklwd",{ MX, EMd }, PREFIX_OPCODE },
592d1631 3442 { Bad_Opcode },
507bd325 3443 { "punpcklwd",{ MX, EMx }, PREFIX_OPCODE },
041bd2e0 3444 },
4e7d34a6 3445
1ceb70f8 3446 /* PREFIX_0F62 */
041bd2e0 3447 {
507bd325 3448 { "punpckldq",{ MX, EMd }, PREFIX_OPCODE },
592d1631 3449 { Bad_Opcode },
507bd325 3450 { "punpckldq",{ MX, EMx }, PREFIX_OPCODE },
041bd2e0 3451 },
4e7d34a6 3452
1ceb70f8 3453 /* PREFIX_0F6F */
ca164297 3454 {
507bd325
L
3455 { "movq", { MX, EM }, PREFIX_OPCODE },
3456 { "movdqu", { XM, EXx }, PREFIX_OPCODE },
3457 { "movdqa", { XM, EXx }, PREFIX_OPCODE },
ca164297 3458 },
4e7d34a6 3459
1ceb70f8 3460 /* PREFIX_0F70 */
4e7d34a6 3461 {
507bd325
L
3462 { "pshufw", { MX, EM, Ib }, PREFIX_OPCODE },
3463 { "pshufhw",{ XM, EXx, Ib }, PREFIX_OPCODE },
3464 { "pshufd", { XM, EXx, Ib }, PREFIX_OPCODE },
3465 { "pshuflw",{ XM, EXx, Ib }, PREFIX_OPCODE },
4e7d34a6
L
3466 },
3467
1ceb70f8 3468 /* PREFIX_0F78 */
4e7d34a6 3469 {
bf890a93 3470 {"vmread", { Em, Gm }, 0 },
592d1631 3471 { Bad_Opcode },
bf890a93
IT
3472 {"extrq", { XS, Ib, Ib }, 0 },
3473 {"insertq", { XM, XS, Ib, Ib }, 0 },
4e7d34a6
L
3474 },
3475
1ceb70f8 3476 /* PREFIX_0F79 */
4e7d34a6 3477 {
bf890a93 3478 {"vmwrite", { Gm, Em }, 0 },
592d1631 3479 { Bad_Opcode },
bf890a93
IT
3480 {"extrq", { XM, XS }, 0 },
3481 {"insertq", { XM, XS }, 0 },
4e7d34a6
L
3482 },
3483
1ceb70f8 3484 /* PREFIX_0F7C */
ca164297 3485 {
592d1631
L
3486 { Bad_Opcode },
3487 { Bad_Opcode },
507bd325
L
3488 { "haddpd", { XM, EXx }, PREFIX_OPCODE },
3489 { "haddps", { XM, EXx }, PREFIX_OPCODE },
ca164297 3490 },
4e7d34a6 3491
1ceb70f8 3492 /* PREFIX_0F7D */
ca164297 3493 {
592d1631
L
3494 { Bad_Opcode },
3495 { Bad_Opcode },
507bd325
L
3496 { "hsubpd", { XM, EXx }, PREFIX_OPCODE },
3497 { "hsubps", { XM, EXx }, PREFIX_OPCODE },
ca164297 3498 },
4e7d34a6 3499
1ceb70f8 3500 /* PREFIX_0F7E */
ca164297 3501 {
507bd325
L
3502 { "movK", { Edq, MX }, PREFIX_OPCODE },
3503 { "movq", { XM, EXq }, PREFIX_OPCODE },
3504 { "movK", { Edq, XM }, PREFIX_OPCODE },
ca164297 3505 },
4e7d34a6 3506
1ceb70f8 3507 /* PREFIX_0F7F */
ca164297 3508 {
507bd325
L
3509 { "movq", { EMS, MX }, PREFIX_OPCODE },
3510 { "movdqu", { EXxS, XM }, PREFIX_OPCODE },
3511 { "movdqa", { EXxS, XM }, PREFIX_OPCODE },
ca164297 3512 },
4e7d34a6 3513
f8687e93 3514 /* PREFIX_0FAE_REG_0_MOD_3 */
c7b8aa3a
L
3515 {
3516 { Bad_Opcode },
bf890a93 3517 { "rdfsbase", { Ev }, 0 },
c7b8aa3a
L
3518 },
3519
f8687e93 3520 /* PREFIX_0FAE_REG_1_MOD_3 */
c7b8aa3a
L
3521 {
3522 { Bad_Opcode },
bf890a93 3523 { "rdgsbase", { Ev }, 0 },
c7b8aa3a
L
3524 },
3525
f8687e93 3526 /* PREFIX_0FAE_REG_2_MOD_3 */
c7b8aa3a
L
3527 {
3528 { Bad_Opcode },
bf890a93 3529 { "wrfsbase", { Ev }, 0 },
c7b8aa3a
L
3530 },
3531
f8687e93 3532 /* PREFIX_0FAE_REG_3_MOD_3 */
c7b8aa3a
L
3533 {
3534 { Bad_Opcode },
bf890a93 3535 { "wrgsbase", { Ev }, 0 },
c7b8aa3a
L
3536 },
3537
f8687e93 3538 /* PREFIX_0FAE_REG_4_MOD_0 */
6b40c462
L
3539 {
3540 { "xsave", { FXSAVE }, 0 },
b24d668c 3541 { "ptwrite{%LQ|}", { Edq }, 0 },
6b40c462
L
3542 },
3543
f8687e93 3544 /* PREFIX_0FAE_REG_4_MOD_3 */
6b40c462
L
3545 {
3546 { Bad_Opcode },
b24d668c 3547 { "ptwrite{%LQ|}", { Edq }, 0 },
6b40c462
L
3548 },
3549
f8687e93 3550 /* PREFIX_0FAE_REG_5_MOD_3 */
2234eee6
L
3551 {
3552 { "lfence", { Skip_MODRM }, 0 },
464d2b65 3553 { "incsspK", { Edq }, PREFIX_OPCODE },
603555e5
L
3554 },
3555
f8687e93 3556 /* PREFIX_0FAE_REG_6_MOD_0 */
c5e7287a 3557 {
603555e5
L
3558 { "xsaveopt", { FXSAVE }, PREFIX_OPCODE },
3559 { "clrssbsy", { Mq }, PREFIX_OPCODE },
3560 { "clwb", { Mb }, PREFIX_OPCODE },
c5e7287a
IT
3561 },
3562
f8687e93 3563 /* PREFIX_0FAE_REG_6_MOD_3 */
de89d0a3 3564 {
f8687e93 3565 { RM_TABLE (RM_0FAE_REG_6_MOD_3_P_0) },
de89d0a3 3566 { "umonitor", { Eva }, PREFIX_OPCODE },
ae1d3843
L
3567 { "tpause", { Edq }, PREFIX_OPCODE },
3568 { "umwait", { Edq }, PREFIX_OPCODE },
de89d0a3
IT
3569 },
3570
f8687e93 3571 /* PREFIX_0FAE_REG_7_MOD_0 */
963f3586 3572 {
bf890a93 3573 { "clflush", { Mb }, 0 },
963f3586 3574 { Bad_Opcode },
bf890a93 3575 { "clflushopt", { Mb }, 0 },
963f3586
IT
3576 },
3577
1ceb70f8 3578 /* PREFIX_0FB8 */
ca164297 3579 {
592d1631 3580 { Bad_Opcode },
bf890a93 3581 { "popcntS", { Gv, Ev }, 0 },
ca164297 3582 },
4e7d34a6 3583
f12dc422
L
3584 /* PREFIX_0FBC */
3585 {
bf890a93
IT
3586 { "bsfS", { Gv, Ev }, 0 },
3587 { "tzcntS", { Gv, Ev }, 0 },
3588 { "bsfS", { Gv, Ev }, 0 },
f12dc422
L
3589 },
3590
1ceb70f8 3591 /* PREFIX_0FBD */
050dfa73 3592 {
bf890a93
IT
3593 { "bsrS", { Gv, Ev }, 0 },
3594 { "lzcntS", { Gv, Ev }, 0 },
3595 { "bsrS", { Gv, Ev }, 0 },
050dfa73
MM
3596 },
3597
1ceb70f8 3598 /* PREFIX_0FC2 */
050dfa73 3599 {
507bd325
L
3600 { "cmpps", { XM, EXx, CMP }, PREFIX_OPCODE },
3601 { "cmpss", { XM, EXd, CMP }, PREFIX_OPCODE },
3602 { "cmppd", { XM, EXx, CMP }, PREFIX_OPCODE },
3603 { "cmpsd", { XM, EXq, CMP }, PREFIX_OPCODE },
050dfa73 3604 },
246c51aa 3605
f8687e93 3606 /* PREFIX_0FC7_REG_6_MOD_0 */
92fddf8e 3607 {
bf890a93
IT
3608 { "vmptrld",{ Mq }, 0 },
3609 { "vmxon", { Mq }, 0 },
3610 { "vmclear",{ Mq }, 0 },
92fddf8e
L
3611 },
3612
f8687e93 3613 /* PREFIX_0FC7_REG_6_MOD_3 */
f24bcbaa
L
3614 {
3615 { "rdrand", { Ev }, 0 },
f64c42a9 3616 { X86_64_TABLE (X86_64_0FC7_REG_6_MOD_3_PREFIX_1) },
f24bcbaa
L
3617 { "rdrand", { Ev }, 0 }
3618 },
3619
f8687e93 3620 /* PREFIX_0FC7_REG_7_MOD_3 */
f24bcbaa
L
3621 {
3622 { "rdseed", { Ev }, 0 },
8bc52696 3623 { "rdpid", { Em }, 0 },
f24bcbaa
L
3624 { "rdseed", { Ev }, 0 },
3625 },
3626
1ceb70f8 3627 /* PREFIX_0FD0 */
050dfa73 3628 {
592d1631
L
3629 { Bad_Opcode },
3630 { Bad_Opcode },
bf890a93
IT
3631 { "addsubpd", { XM, EXx }, 0 },
3632 { "addsubps", { XM, EXx }, 0 },
246c51aa 3633 },
050dfa73 3634
1ceb70f8 3635 /* PREFIX_0FD6 */
050dfa73 3636 {
592d1631 3637 { Bad_Opcode },
bf890a93
IT
3638 { "movq2dq",{ XM, MS }, 0 },
3639 { "movq", { EXqS, XM }, 0 },
3640 { "movdq2q",{ MX, XS }, 0 },
050dfa73
MM
3641 },
3642
1ceb70f8 3643 /* PREFIX_0FE6 */
7918206c 3644 {
592d1631 3645 { Bad_Opcode },
507bd325
L
3646 { "cvtdq2pd", { XM, EXq }, PREFIX_OPCODE },
3647 { "cvttpd2dq", { XM, EXx }, PREFIX_OPCODE },
3648 { "cvtpd2dq", { XM, EXx }, PREFIX_OPCODE },
7918206c 3649 },
8b38ad71 3650
1ceb70f8 3651 /* PREFIX_0FE7 */
8b38ad71 3652 {
507bd325 3653 { "movntq", { Mq, MX }, PREFIX_OPCODE },
592d1631 3654 { Bad_Opcode },
75c135a8 3655 { MOD_TABLE (MOD_0FE7_PREFIX_2) },
4e7d34a6
L
3656 },
3657
1ceb70f8 3658 /* PREFIX_0FF0 */
4e7d34a6 3659 {
592d1631
L
3660 { Bad_Opcode },
3661 { Bad_Opcode },
3662 { Bad_Opcode },
1ceb70f8 3663 { MOD_TABLE (MOD_0FF0_PREFIX_3) },
4e7d34a6
L
3664 },
3665
1ceb70f8 3666 /* PREFIX_0FF7 */
4e7d34a6 3667 {
507bd325 3668 { "maskmovq", { MX, MS }, PREFIX_OPCODE },
592d1631 3669 { Bad_Opcode },
507bd325 3670 { "maskmovdqu", { XM, XS }, PREFIX_OPCODE },
8b38ad71 3671 },
42903f7f 3672
c4694f17
TG
3673 /* PREFIX_0F38D8 */
3674 {
3675 { Bad_Opcode },
3676 { REG_TABLE (REG_0F38D8_PREFIX_1) },
3677 },
3678
3679 /* PREFIX_0F38DC */
3680 {
3681 { Bad_Opcode },
3682 { MOD_TABLE (MOD_0F38DC_PREFIX_1) },
3683 { "aesenc", { XM, EXx }, 0 },
3684 },
3685
3686 /* PREFIX_0F38DD */
3687 {
3688 { Bad_Opcode },
3689 { MOD_TABLE (MOD_0F38DD_PREFIX_1) },
3690 { "aesenclast", { XM, EXx }, 0 },
3691 },
3692
3693 /* PREFIX_0F38DE */
3694 {
3695 { Bad_Opcode },
3696 { MOD_TABLE (MOD_0F38DE_PREFIX_1) },
3697 { "aesdec", { XM, EXx }, 0 },
3698 },
3699
3700 /* PREFIX_0F38DF */
3701 {
3702 { Bad_Opcode },
3703 { MOD_TABLE (MOD_0F38DF_PREFIX_1) },
3704 { "aesdeclast", { XM, EXx }, 0 },
3705 },
3706
1ceb70f8 3707 /* PREFIX_0F38F0 */
4e7d34a6 3708 {
9ab00b61 3709 { "movbeS", { Gv, Mv }, PREFIX_OPCODE },
592d1631 3710 { Bad_Opcode },
9ab00b61 3711 { "movbeS", { Gv, Mv }, PREFIX_OPCODE },
2875b28a 3712 { "crc32A", { Gdq, Eb }, PREFIX_OPCODE },
4e7d34a6
L
3713 },
3714
1ceb70f8 3715 /* PREFIX_0F38F1 */
4e7d34a6 3716 {
9ab00b61 3717 { "movbeS", { Mv, Gv }, PREFIX_OPCODE },
592d1631 3718 { Bad_Opcode },
9ab00b61 3719 { "movbeS", { Mv, Gv }, PREFIX_OPCODE },
2875b28a 3720 { "crc32Q", { Gdq, Ev }, PREFIX_OPCODE },
4e7d34a6
L
3721 },
3722
603555e5
L
3723 /* PREFIX_0F38F6 */
3724 {
3725 { MOD_TABLE (MOD_0F38F6_PREFIX_0) },
507bd325
L
3726 { "adoxS", { Gdq, Edq}, PREFIX_OPCODE },
3727 { "adcxS", { Gdq, Edq}, PREFIX_OPCODE },
e2e1fcde
L
3728 { Bad_Opcode },
3729 },
3730
c0a30a9f
L
3731 /* PREFIX_0F38F8 */
3732 {
3733 { Bad_Opcode },
5d79adc4 3734 { MOD_TABLE (MOD_0F38F8_PREFIX_1) },
c0a30a9f 3735 { MOD_TABLE (MOD_0F38F8_PREFIX_2) },
5d79adc4 3736 { MOD_TABLE (MOD_0F38F8_PREFIX_3) },
c0a30a9f 3737 },
c4694f17
TG
3738 /* PREFIX_0F38FA */
3739 {
3740 { Bad_Opcode },
3741 { MOD_TABLE (MOD_0F38FA_PREFIX_1) },
3742 },
3743
3744 /* PREFIX_0F38FB */
3745 {
3746 { Bad_Opcode },
3747 { MOD_TABLE (MOD_0F38FB_PREFIX_1) },
3748 },
c0a30a9f 3749
c1fa250a
LC
3750 /* PREFIX_0F3A0F */
3751 {
3752 { Bad_Opcode },
3753 { MOD_TABLE (MOD_0F3A0F_PREFIX_1)},
3754 },
3755
7531c613 3756 /* PREFIX_VEX_0F10 */
42903f7f 3757 {
7531c613
JB
3758 { "vmovups", { XM, EXx }, 0 },
3759 { "vmovss", { XMScalar, VexScalarR, EXxmm_md }, 0 },
3760 { "vmovupd", { XM, EXx }, 0 },
3761 { "vmovsd", { XMScalar, VexScalarR, EXxmm_mq }, 0 },
42903f7f
L
3762 },
3763
7531c613 3764 /* PREFIX_VEX_0F11 */
42903f7f 3765 {
7531c613
JB
3766 { "vmovups", { EXxS, XM }, 0 },
3767 { "vmovss", { EXdS, VexScalarR, XMScalar }, 0 },
3768 { "vmovupd", { EXxS, XM }, 0 },
3769 { "vmovsd", { EXqS, VexScalarR, XMScalar }, 0 },
42903f7f
L
3770 },
3771
7531c613 3772 /* PREFIX_VEX_0F12 */
42903f7f 3773 {
7531c613
JB
3774 { MOD_TABLE (MOD_VEX_0F12_PREFIX_0) },
3775 { "vmovsldup", { XM, EXx }, 0 },
3776 { MOD_TABLE (MOD_VEX_0F12_PREFIX_2) },
3777 { "vmovddup", { XM, EXymmq }, 0 },
42903f7f
L
3778 },
3779
7531c613 3780 /* PREFIX_VEX_0F16 */
42903f7f 3781 {
7531c613
JB
3782 { MOD_TABLE (MOD_VEX_0F16_PREFIX_0) },
3783 { "vmovshdup", { XM, EXx }, 0 },
3784 { MOD_TABLE (MOD_VEX_0F16_PREFIX_2) },
5f754f58 3785 },
7c52e0e8 3786
592a252b 3787 /* PREFIX_VEX_0F2A */
5f754f58 3788 {
592d1631 3789 { Bad_Opcode },
b24d668c 3790 { "vcvtsi2ss{%LQ|}", { XMScalar, VexScalar, Edq }, 0 },
592d1631 3791 { Bad_Opcode },
b24d668c 3792 { "vcvtsi2sd{%LQ|}", { XMScalar, VexScalar, Edq }, 0 },
5f754f58 3793 },
7c52e0e8 3794
592a252b 3795 /* PREFIX_VEX_0F2C */
5f754f58 3796 {
592d1631 3797 { Bad_Opcode },
17d3c7ec 3798 { "vcvttss2si", { Gdq, EXxmm_md, EXxEVexS }, 0 },
592d1631 3799 { Bad_Opcode },
17d3c7ec 3800 { "vcvttsd2si", { Gdq, EXxmm_mq, EXxEVexS }, 0 },
5f754f58 3801 },
7c52e0e8 3802
592a252b 3803 /* PREFIX_VEX_0F2D */
7c52e0e8 3804 {
592d1631 3805 { Bad_Opcode },
17d3c7ec 3806 { "vcvtss2si", { Gdq, EXxmm_md, EXxEVexR }, 0 },
592d1631 3807 { Bad_Opcode },
17d3c7ec 3808 { "vcvtsd2si", { Gdq, EXxmm_mq, EXxEVexR }, 0 },
7c52e0e8
L
3809 },
3810
592a252b 3811 /* PREFIX_VEX_0F2E */
7c52e0e8 3812 {
17d3c7ec 3813 { "vucomisX", { XMScalar, EXxmm_md, EXxEVexS }, PREFIX_OPCODE },
592d1631 3814 { Bad_Opcode },
17d3c7ec 3815 { "vucomisX", { XMScalar, EXxmm_mq, EXxEVexS }, PREFIX_OPCODE },
7c52e0e8
L
3816 },
3817
592a252b 3818 /* PREFIX_VEX_0F2F */
7c52e0e8 3819 {
17d3c7ec 3820 { "vcomisX", { XMScalar, EXxmm_md, EXxEVexS }, PREFIX_OPCODE },
592d1631 3821 { Bad_Opcode },
17d3c7ec 3822 { "vcomisX", { XMScalar, EXxmm_mq, EXxEVexS }, PREFIX_OPCODE },
7c52e0e8
L
3823 },
3824
43234a1e
L
3825 /* PREFIX_VEX_0F41 */
3826 {
3827 { VEX_LEN_TABLE (VEX_LEN_0F41_P_0) },
1ba585e8
IT
3828 { Bad_Opcode },
3829 { VEX_LEN_TABLE (VEX_LEN_0F41_P_2) },
43234a1e
L
3830 },
3831
3832 /* PREFIX_VEX_0F42 */
3833 {
3834 { VEX_LEN_TABLE (VEX_LEN_0F42_P_0) },
1ba585e8
IT
3835 { Bad_Opcode },
3836 { VEX_LEN_TABLE (VEX_LEN_0F42_P_2) },
43234a1e
L
3837 },
3838
7531c613 3839 /* PREFIX_VEX_0F44 */
c0f3af97 3840 {
7531c613 3841 { VEX_LEN_TABLE (VEX_LEN_0F44_P_0) },
592d1631 3842 { Bad_Opcode },
7531c613 3843 { VEX_LEN_TABLE (VEX_LEN_0F44_P_2) },
c0f3af97
L
3844 },
3845
7531c613 3846 /* PREFIX_VEX_0F45 */
0bfee649 3847 {
7531c613 3848 { VEX_LEN_TABLE (VEX_LEN_0F45_P_0) },
592d1631 3849 { Bad_Opcode },
7531c613 3850 { VEX_LEN_TABLE (VEX_LEN_0F45_P_2) },
0bfee649
L
3851 },
3852
7531c613 3853 /* PREFIX_VEX_0F46 */
43234a1e 3854 {
7531c613 3855 { VEX_LEN_TABLE (VEX_LEN_0F46_P_0) },
43234a1e 3856 { Bad_Opcode },
7531c613 3857 { VEX_LEN_TABLE (VEX_LEN_0F46_P_2) },
43234a1e
L
3858 },
3859
7531c613 3860 /* PREFIX_VEX_0F47 */
1ba585e8 3861 {
7531c613 3862 { VEX_LEN_TABLE (VEX_LEN_0F47_P_0) },
1ba585e8 3863 { Bad_Opcode },
7531c613 3864 { VEX_LEN_TABLE (VEX_LEN_0F47_P_2) },
1ba585e8
IT
3865 },
3866
7531c613 3867 /* PREFIX_VEX_0F4A */
43234a1e 3868 {
7531c613 3869 { VEX_LEN_TABLE (VEX_LEN_0F4A_P_0) },
43234a1e 3870 { Bad_Opcode },
7531c613 3871 { VEX_LEN_TABLE (VEX_LEN_0F4A_P_2) },
43234a1e
L
3872 },
3873
7531c613 3874 /* PREFIX_VEX_0F4B */
1ba585e8 3875 {
7531c613 3876 { VEX_LEN_TABLE (VEX_LEN_0F4B_P_0) },
1ba585e8 3877 { Bad_Opcode },
7531c613 3878 { VEX_LEN_TABLE (VEX_LEN_0F4B_P_2) },
1ba585e8
IT
3879 },
3880
7531c613 3881 /* PREFIX_VEX_0F51 */
6c30d220 3882 {
7531c613
JB
3883 { "vsqrtps", { XM, EXx }, 0 },
3884 { "vsqrtss", { XMScalar, VexScalar, EXxmm_md }, 0 },
3885 { "vsqrtpd", { XM, EXx }, 0 },
3886 { "vsqrtsd", { XMScalar, VexScalar, EXxmm_mq }, 0 },
6c30d220
L
3887 },
3888
7531c613 3889 /* PREFIX_VEX_0F52 */
6c30d220 3890 {
7531c613
JB
3891 { "vrsqrtps", { XM, EXx }, 0 },
3892 { "vrsqrtss", { XMScalar, VexScalar, EXxmm_md }, 0 },
6c30d220
L
3893 },
3894
7531c613 3895 /* PREFIX_VEX_0F53 */
c0f3af97 3896 {
7531c613
JB
3897 { "vrcpps", { XM, EXx }, 0 },
3898 { "vrcpss", { XMScalar, VexScalar, EXxmm_md }, 0 },
c0f3af97
L
3899 },
3900
7531c613 3901 /* PREFIX_VEX_0F58 */
c0f3af97 3902 {
7531c613
JB
3903 { "vaddps", { XM, Vex, EXx }, 0 },
3904 { "vaddss", { XMScalar, VexScalar, EXxmm_md }, 0 },
3905 { "vaddpd", { XM, Vex, EXx }, 0 },
3906 { "vaddsd", { XMScalar, VexScalar, EXxmm_mq }, 0 },
c0f3af97
L
3907 },
3908
7531c613 3909 /* PREFIX_VEX_0F59 */
c0f3af97 3910 {
7531c613
JB
3911 { "vmulps", { XM, Vex, EXx }, 0 },
3912 { "vmulss", { XMScalar, VexScalar, EXxmm_md }, 0 },
3913 { "vmulpd", { XM, Vex, EXx }, 0 },
3914 { "vmulsd", { XMScalar, VexScalar, EXxmm_mq }, 0 },
c0f3af97
L
3915 },
3916
7531c613 3917 /* PREFIX_VEX_0F5A */
ce2f5b3c 3918 {
7531c613
JB
3919 { "vcvtps2pd", { XM, EXxmmq }, 0 },
3920 { "vcvtss2sd", { XMScalar, VexScalar, EXxmm_md }, 0 },
3921 { "vcvtpd2ps%XY",{ XMM, EXx }, 0 },
3922 { "vcvtsd2ss", { XMScalar, VexScalar, EXxmm_mq }, 0 },
ce2f5b3c
L
3923 },
3924
7531c613 3925 /* PREFIX_VEX_0F5B */
6c30d220 3926 {
7531c613
JB
3927 { "vcvtdq2ps", { XM, EXx }, 0 },
3928 { "vcvttps2dq", { XM, EXx }, 0 },
3929 { "vcvtps2dq", { XM, EXx }, 0 },
6c30d220
L
3930 },
3931
7531c613 3932 /* PREFIX_VEX_0F5C */
a683cc34 3933 {
7531c613
JB
3934 { "vsubps", { XM, Vex, EXx }, 0 },
3935 { "vsubss", { XMScalar, VexScalar, EXxmm_md }, 0 },
3936 { "vsubpd", { XM, Vex, EXx }, 0 },
3937 { "vsubsd", { XMScalar, VexScalar, EXxmm_mq }, 0 },
a683cc34
SP
3938 },
3939
7531c613 3940 /* PREFIX_VEX_0F5D */
a683cc34 3941 {
7531c613
JB
3942 { "vminps", { XM, Vex, EXx }, 0 },
3943 { "vminss", { XMScalar, VexScalar, EXxmm_md }, 0 },
3944 { "vminpd", { XM, Vex, EXx }, 0 },
3945 { "vminsd", { XMScalar, VexScalar, EXxmm_mq }, 0 },
a683cc34
SP
3946 },
3947
7531c613 3948 /* PREFIX_VEX_0F5E */
c0f3af97 3949 {
7531c613
JB
3950 { "vdivps", { XM, Vex, EXx }, 0 },
3951 { "vdivss", { XMScalar, VexScalar, EXxmm_md }, 0 },
3952 { "vdivpd", { XM, Vex, EXx }, 0 },
3953 { "vdivsd", { XMScalar, VexScalar, EXxmm_mq }, 0 },
c0f3af97
L
3954 },
3955
7531c613 3956 /* PREFIX_VEX_0F5F */
c0f3af97 3957 {
7531c613
JB
3958 { "vmaxps", { XM, Vex, EXx }, 0 },
3959 { "vmaxss", { XMScalar, VexScalar, EXxmm_md }, 0 },
3960 { "vmaxpd", { XM, Vex, EXx }, 0 },
3961 { "vmaxsd", { XMScalar, VexScalar, EXxmm_mq }, 0 },
c0f3af97
L
3962 },
3963
7531c613 3964 /* PREFIX_VEX_0F6F */
c0f3af97 3965 {
592d1631 3966 { Bad_Opcode },
7531c613
JB
3967 { "vmovdqu", { XM, EXx }, 0 },
3968 { "vmovdqa", { XM, EXx }, 0 },
c0f3af97
L
3969 },
3970
7531c613 3971 /* PREFIX_VEX_0F70 */
922d8de8 3972 {
592d1631 3973 { Bad_Opcode },
7531c613
JB
3974 { "vpshufhw", { XM, EXx, Ib }, 0 },
3975 { "vpshufd", { XM, EXx, Ib }, 0 },
3976 { "vpshuflw", { XM, EXx, Ib }, 0 },
922d8de8
DR
3977 },
3978
7531c613 3979 /* PREFIX_VEX_0F7C */
922d8de8 3980 {
592d1631
L
3981 { Bad_Opcode },
3982 { Bad_Opcode },
7531c613
JB
3983 { "vhaddpd", { XM, Vex, EXx }, 0 },
3984 { "vhaddps", { XM, Vex, EXx }, 0 },
922d8de8
DR
3985 },
3986
7531c613 3987 /* PREFIX_VEX_0F7D */
922d8de8 3988 {
592d1631
L
3989 { Bad_Opcode },
3990 { Bad_Opcode },
7531c613
JB
3991 { "vhsubpd", { XM, Vex, EXx }, 0 },
3992 { "vhsubps", { XM, Vex, EXx }, 0 },
922d8de8
DR
3993 },
3994
7531c613 3995 /* PREFIX_VEX_0F7E */
c0f3af97 3996 {
592d1631 3997 { Bad_Opcode },
7531c613
JB
3998 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_1) },
3999 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_2) },
c0f3af97
L
4000 },
4001
7531c613 4002 /* PREFIX_VEX_0F7F */
c0f3af97 4003 {
592d1631 4004 { Bad_Opcode },
7531c613
JB
4005 { "vmovdqu", { EXxS, XM }, 0 },
4006 { "vmovdqa", { EXxS, XM }, 0 },
c0f3af97
L
4007 },
4008
7531c613 4009 /* PREFIX_VEX_0F90 */
c0f3af97 4010 {
7531c613 4011 { VEX_LEN_TABLE (VEX_LEN_0F90_P_0) },
592d1631 4012 { Bad_Opcode },
7531c613 4013 { VEX_LEN_TABLE (VEX_LEN_0F90_P_2) },
c0f3af97
L
4014 },
4015
7531c613 4016 /* PREFIX_VEX_0F91 */
c0f3af97 4017 {
7531c613 4018 { VEX_LEN_TABLE (VEX_LEN_0F91_P_0) },
592d1631 4019 { Bad_Opcode },
7531c613 4020 { VEX_LEN_TABLE (VEX_LEN_0F91_P_2) },
c0f3af97 4021 },
a5ff0eb2 4022
7531c613 4023 /* PREFIX_VEX_0F92 */
922d8de8 4024 {
7531c613 4025 { VEX_LEN_TABLE (VEX_LEN_0F92_P_0) },
592d1631 4026 { Bad_Opcode },
7531c613
JB
4027 { VEX_LEN_TABLE (VEX_LEN_0F92_P_2) },
4028 { VEX_LEN_TABLE (VEX_LEN_0F92_P_3) },
922d8de8
DR
4029 },
4030
7531c613 4031 /* PREFIX_VEX_0F93 */
922d8de8 4032 {
7531c613 4033 { VEX_LEN_TABLE (VEX_LEN_0F93_P_0) },
592d1631 4034 { Bad_Opcode },
7531c613
JB
4035 { VEX_LEN_TABLE (VEX_LEN_0F93_P_2) },
4036 { VEX_LEN_TABLE (VEX_LEN_0F93_P_3) },
922d8de8
DR
4037 },
4038
7531c613 4039 /* PREFIX_VEX_0F98 */
922d8de8 4040 {
7531c613 4041 { VEX_LEN_TABLE (VEX_LEN_0F98_P_0) },
592d1631 4042 { Bad_Opcode },
7531c613 4043 { VEX_LEN_TABLE (VEX_LEN_0F98_P_2) },
922d8de8
DR
4044 },
4045
7531c613 4046 /* PREFIX_VEX_0F99 */
922d8de8 4047 {
7531c613 4048 { VEX_LEN_TABLE (VEX_LEN_0F99_P_0) },
592d1631 4049 { Bad_Opcode },
7531c613 4050 { VEX_LEN_TABLE (VEX_LEN_0F99_P_2) },
922d8de8
DR
4051 },
4052
7531c613 4053 /* PREFIX_VEX_0FC2 */
922d8de8 4054 {
7531c613
JB
4055 { "vcmpps", { XM, Vex, EXx, CMP }, 0 },
4056 { "vcmpss", { XMScalar, VexScalar, EXxmm_md, CMP }, 0 },
4057 { "vcmppd", { XM, Vex, EXx, CMP }, 0 },
4058 { "vcmpsd", { XMScalar, VexScalar, EXxmm_mq, CMP }, 0 },
922d8de8
DR
4059 },
4060
7531c613 4061 /* PREFIX_VEX_0FD0 */
922d8de8 4062 {
592d1631
L
4063 { Bad_Opcode },
4064 { Bad_Opcode },
7531c613
JB
4065 { "vaddsubpd", { XM, Vex, EXx }, 0 },
4066 { "vaddsubps", { XM, Vex, EXx }, 0 },
922d8de8
DR
4067 },
4068
7531c613 4069 /* PREFIX_VEX_0FE6 */
922d8de8 4070 {
592d1631 4071 { Bad_Opcode },
7531c613
JB
4072 { "vcvtdq2pd", { XM, EXxmmq }, 0 },
4073 { "vcvttpd2dq%XY", { XMM, EXx }, 0 },
4074 { "vcvtpd2dq%XY", { XMM, EXx }, 0 },
922d8de8
DR
4075 },
4076
7531c613 4077 /* PREFIX_VEX_0FF0 */
922d8de8 4078 {
592d1631
L
4079 { Bad_Opcode },
4080 { Bad_Opcode },
7531c613
JB
4081 { Bad_Opcode },
4082 { MOD_TABLE (MOD_VEX_0FF0_PREFIX_3) },
922d8de8
DR
4083 },
4084
7531c613 4085 /* PREFIX_VEX_0F3849_X86_64 */
922d8de8 4086 {
7531c613 4087 { VEX_W_TABLE (VEX_W_0F3849_X86_64_P_0) },
592d1631 4088 { Bad_Opcode },
7531c613
JB
4089 { VEX_W_TABLE (VEX_W_0F3849_X86_64_P_2) },
4090 { VEX_W_TABLE (VEX_W_0F3849_X86_64_P_3) },
922d8de8
DR
4091 },
4092
7531c613 4093 /* PREFIX_VEX_0F384B_X86_64 */
922d8de8 4094 {
592d1631 4095 { Bad_Opcode },
7531c613
JB
4096 { VEX_W_TABLE (VEX_W_0F384B_X86_64_P_1) },
4097 { VEX_W_TABLE (VEX_W_0F384B_X86_64_P_2) },
4098 { VEX_W_TABLE (VEX_W_0F384B_X86_64_P_3) },
922d8de8
DR
4099 },
4100
7531c613 4101 /* PREFIX_VEX_0F385C_X86_64 */
922d8de8 4102 {
592d1631 4103 { Bad_Opcode },
7531c613 4104 { VEX_W_TABLE (VEX_W_0F385C_X86_64_P_1) },
592d1631 4105 { Bad_Opcode },
922d8de8
DR
4106 },
4107
7531c613 4108 /* PREFIX_VEX_0F385E_X86_64 */
922d8de8 4109 {
7531c613
JB
4110 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_0) },
4111 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_1) },
4112 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_2) },
4113 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_3) },
922d8de8
DR
4114 },
4115
7531c613 4116 /* PREFIX_VEX_0F38F5 */
48521003 4117 {
7531c613
JB
4118 { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_0) },
4119 { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_1) },
48521003 4120 { Bad_Opcode },
7531c613 4121 { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_3) },
48521003
IT
4122 },
4123
7531c613 4124 /* PREFIX_VEX_0F38F6 */
48521003
IT
4125 {
4126 { Bad_Opcode },
4127 { Bad_Opcode },
7531c613
JB
4128 { Bad_Opcode },
4129 { VEX_LEN_TABLE (VEX_LEN_0F38F6_P_3) },
48521003
IT
4130 },
4131
7531c613 4132 /* PREFIX_VEX_0F38F7 */
a5ff0eb2 4133 {
7531c613
JB
4134 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_0) },
4135 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_1) },
4136 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_2) },
4137 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_3) },
a5ff0eb2 4138 },
6c30d220
L
4139
4140 /* PREFIX_VEX_0F3AF0 */
4141 {
4142 { Bad_Opcode },
4143 { Bad_Opcode },
4144 { Bad_Opcode },
4145 { VEX_LEN_TABLE (VEX_LEN_0F3AF0_P_3) },
4146 },
43234a1e 4147
ad692897 4148#include "i386-dis-evex-prefix.h"
c0f3af97
L
4149};
4150
4151static const struct dis386 x86_64_table[][2] = {
4152 /* X86_64_06 */
4153 {
bf890a93 4154 { "pushP", { es }, 0 },
c0f3af97
L
4155 },
4156
4157 /* X86_64_07 */
4158 {
bf890a93 4159 { "popP", { es }, 0 },
c0f3af97
L
4160 },
4161
1673df32 4162 /* X86_64_0E */
c0f3af97 4163 {
bf890a93 4164 { "pushP", { cs }, 0 },
c0f3af97
L
4165 },
4166
4167 /* X86_64_16 */
4168 {
bf890a93 4169 { "pushP", { ss }, 0 },
c0f3af97
L
4170 },
4171
4172 /* X86_64_17 */
4173 {
bf890a93 4174 { "popP", { ss }, 0 },
c0f3af97
L
4175 },
4176
4177 /* X86_64_1E */
4178 {
bf890a93 4179 { "pushP", { ds }, 0 },
c0f3af97
L
4180 },
4181
4182 /* X86_64_1F */
4183 {
bf890a93 4184 { "popP", { ds }, 0 },
c0f3af97
L
4185 },
4186
4187 /* X86_64_27 */
4188 {
bf890a93 4189 { "daa", { XX }, 0 },
c0f3af97
L
4190 },
4191
4192 /* X86_64_2F */
4193 {
bf890a93 4194 { "das", { XX }, 0 },
c0f3af97
L
4195 },
4196
4197 /* X86_64_37 */
4198 {
bf890a93 4199 { "aaa", { XX }, 0 },
c0f3af97
L
4200 },
4201
4202 /* X86_64_3F */
4203 {
bf890a93 4204 { "aas", { XX }, 0 },
c0f3af97
L
4205 },
4206
4207 /* X86_64_60 */
4208 {
bf890a93 4209 { "pushaP", { XX }, 0 },
c0f3af97
L
4210 },
4211
4212 /* X86_64_61 */
4213 {
bf890a93 4214 { "popaP", { XX }, 0 },
c0f3af97
L
4215 },
4216
4217 /* X86_64_62 */
4218 {
4219 { MOD_TABLE (MOD_62_32BIT) },
43234a1e 4220 { EVEX_TABLE (EVEX_0F) },
c0f3af97
L
4221 },
4222
4223 /* X86_64_63 */
4224 {
bf890a93 4225 { "arpl", { Ew, Gw }, 0 },
bc31405e 4226 { "movs", { { OP_G, movsxd_mode }, { MOVSXD_Fixup, movsxd_mode } }, 0 },
c0f3af97
L
4227 },
4228
4229 /* X86_64_6D */
4230 {
bf890a93
IT
4231 { "ins{R|}", { Yzr, indirDX }, 0 },
4232 { "ins{G|}", { Yzr, indirDX }, 0 },
c0f3af97
L
4233 },
4234
4235 /* X86_64_6F */
4236 {
bf890a93
IT
4237 { "outs{R|}", { indirDXr, Xz }, 0 },
4238 { "outs{G|}", { indirDXr, Xz }, 0 },
c0f3af97
L
4239 },
4240
d039fef3 4241 /* X86_64_82 */
8b89fe14 4242 {
de194d85 4243 /* Opcode 0x82 is an alias of opcode 0x80 in 32-bit mode. */
d039fef3 4244 { REG_TABLE (REG_80) },
8b89fe14
L
4245 },
4246
c0f3af97
L
4247 /* X86_64_9A */
4248 {
36938cab 4249 { "{l|}call{P|}", { Ap }, 0 },
c0f3af97
L
4250 },
4251
aeab2b26
JB
4252 /* X86_64_C2 */
4253 {
4254 { "retP", { Iw, BND }, 0 },
4255 { "ret@", { Iw, BND }, 0 },
4256 },
4257
4258 /* X86_64_C3 */
4259 {
4260 { "retP", { BND }, 0 },
4261 { "ret@", { BND }, 0 },
4262 },
4263
c0f3af97
L
4264 /* X86_64_C4 */
4265 {
4266 { MOD_TABLE (MOD_C4_32BIT) },
4267 { VEX_C4_TABLE (VEX_0F) },
4268 },
4269
4270 /* X86_64_C5 */
4271 {
4272 { MOD_TABLE (MOD_C5_32BIT) },
4273 { VEX_C5_TABLE (VEX_0F) },
4274 },
4275
4276 /* X86_64_CE */
4277 {
bf890a93 4278 { "into", { XX }, 0 },
c0f3af97
L
4279 },
4280
4281 /* X86_64_D4 */
4282 {
bf890a93 4283 { "aam", { Ib }, 0 },
c0f3af97
L
4284 },
4285
4286 /* X86_64_D5 */
4287 {
bf890a93 4288 { "aad", { Ib }, 0 },
c0f3af97
L
4289 },
4290
a72d2af2
L
4291 /* X86_64_E8 */
4292 {
4293 { "callP", { Jv, BND }, 0 },
5db04b09 4294 { "call@", { Jv, BND }, 0 }
a72d2af2
L
4295 },
4296
4297 /* X86_64_E9 */
4298 {
4299 { "jmpP", { Jv, BND }, 0 },
5db04b09 4300 { "jmp@", { Jv, BND }, 0 }
a72d2af2
L
4301 },
4302
c0f3af97
L
4303 /* X86_64_EA */
4304 {
36938cab 4305 { "{l|}jmp{P|}", { Ap }, 0 },
c0f3af97
L
4306 },
4307
4308 /* X86_64_0F01_REG_0 */
4309 {
d1c36125 4310 { "sgdt{Q|Q}", { M }, 0 },
bf890a93 4311 { "sgdt", { M }, 0 },
c0f3af97
L
4312 },
4313
4314 /* X86_64_0F01_REG_1 */
4315 {
d1c36125 4316 { "sidt{Q|Q}", { M }, 0 },
bf890a93 4317 { "sidt", { M }, 0 },
c0f3af97
L
4318 },
4319
81d54bb7
CL
4320 /* X86_64_0F01_REG_1_RM_5_PREFIX_2 */
4321 {
4322 { Bad_Opcode },
4323 { "seamret", { Skip_MODRM }, 0 },
4324 },
4325
4326 /* X86_64_0F01_REG_1_RM_6_PREFIX_2 */
4327 {
4328 { Bad_Opcode },
4329 { "seamops", { Skip_MODRM }, 0 },
4330 },
4331
4332 /* X86_64_0F01_REG_1_RM_7_PREFIX_2 */
4333 {
4334 { Bad_Opcode },
4335 { "seamcall", { Skip_MODRM }, 0 },
4336 },
4337
c0f3af97
L
4338 /* X86_64_0F01_REG_2 */
4339 {
bf890a93
IT
4340 { "lgdt{Q|Q}", { M }, 0 },
4341 { "lgdt", { M }, 0 },
c0f3af97
L
4342 },
4343
4344 /* X86_64_0F01_REG_3 */
4345 {
bf890a93
IT
4346 { "lidt{Q|Q}", { M }, 0 },
4347 { "lidt", { M }, 0 },
c0f3af97 4348 },
260cd341 4349
78467458
JB
4350 {
4351 /* X86_64_0F24 */
4352 { "movZ", { Em, Td }, 0 },
4353 },
4354
4355 {
4356 /* X86_64_0F26 */
4357 { "movZ", { Td, Em }, 0 },
4358 },
4359
260cd341
LC
4360 /* X86_64_VEX_0F3849 */
4361 {
4362 { Bad_Opcode },
4363 { PREFIX_TABLE (PREFIX_VEX_0F3849_X86_64) },
4364 },
4365
4366 /* X86_64_VEX_0F384B */
4367 {
4368 { Bad_Opcode },
4369 { PREFIX_TABLE (PREFIX_VEX_0F384B_X86_64) },
4370 },
4371
4372 /* X86_64_VEX_0F385C */
4373 {
4374 { Bad_Opcode },
4375 { PREFIX_TABLE (PREFIX_VEX_0F385C_X86_64) },
4376 },
4377
4378 /* X86_64_VEX_0F385E */
4379 {
4380 { Bad_Opcode },
4381 { PREFIX_TABLE (PREFIX_VEX_0F385E_X86_64) },
4382 },
f64c42a9
LC
4383
4384 /* X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1 */
4385 {
4386 { Bad_Opcode },
4387 { "uiret", { Skip_MODRM }, 0 },
4388 },
4389
4390 /* X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1 */
4391 {
4392 { Bad_Opcode },
4393 { "testui", { Skip_MODRM }, 0 },
4394 },
4395
4396 /* X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1 */
4397 {
4398 { Bad_Opcode },
4399 { "clui", { Skip_MODRM }, 0 },
4400 },
4401
4402 /* X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1 */
4403 {
4404 { Bad_Opcode },
4405 { "stui", { Skip_MODRM }, 0 },
4406 },
4407
646cc3e0
GG
4408 /* X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1 */
4409 {
4410 { Bad_Opcode },
4411 { "rmpadjust", { Skip_MODRM }, 0 },
4412 },
4413
4414 /* X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3 */
4415 {
4416 { Bad_Opcode },
4417 { "rmpupdate", { Skip_MODRM }, 0 },
4418 },
4419
4420 /* X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1 */
4421 {
4422 { Bad_Opcode },
4423 { "psmash", { Skip_MODRM }, 0 },
4424 },
4425
f64c42a9
LC
4426 /* X86_64_0FC7_REG_6_MOD_3_PREFIX_1 */
4427 {
4428 { Bad_Opcode },
4429 { "senduipi", { Eq }, 0 },
4430 },
c0f3af97
L
4431};
4432
4433static const struct dis386 three_byte_table[][256] = {
c1e679ec
DR
4434
4435 /* THREE_BYTE_0F38 */
c0f3af97
L
4436 {
4437 /* 00 */
507bd325
L
4438 { "pshufb", { MX, EM }, PREFIX_OPCODE },
4439 { "phaddw", { MX, EM }, PREFIX_OPCODE },
4440 { "phaddd", { MX, EM }, PREFIX_OPCODE },
4441 { "phaddsw", { MX, EM }, PREFIX_OPCODE },
4442 { "pmaddubsw", { MX, EM }, PREFIX_OPCODE },
4443 { "phsubw", { MX, EM }, PREFIX_OPCODE },
4444 { "phsubd", { MX, EM }, PREFIX_OPCODE },
4445 { "phsubsw", { MX, EM }, PREFIX_OPCODE },
c0f3af97 4446 /* 08 */
507bd325
L
4447 { "psignb", { MX, EM }, PREFIX_OPCODE },
4448 { "psignw", { MX, EM }, PREFIX_OPCODE },
4449 { "psignd", { MX, EM }, PREFIX_OPCODE },
4450 { "pmulhrsw", { MX, EM }, PREFIX_OPCODE },
592d1631
L
4451 { Bad_Opcode },
4452 { Bad_Opcode },
4453 { Bad_Opcode },
4454 { Bad_Opcode },
f88c9eb0 4455 /* 10 */
7531c613 4456 { "pblendvb", { XM, EXx, XMM0 }, PREFIX_DATA },
592d1631
L
4457 { Bad_Opcode },
4458 { Bad_Opcode },
4459 { Bad_Opcode },
7531c613
JB
4460 { "blendvps", { XM, EXx, XMM0 }, PREFIX_DATA },
4461 { "blendvpd", { XM, EXx, XMM0 }, PREFIX_DATA },
592d1631 4462 { Bad_Opcode },
7531c613 4463 { "ptest", { XM, EXx }, PREFIX_DATA },
f88c9eb0 4464 /* 18 */
592d1631
L
4465 { Bad_Opcode },
4466 { Bad_Opcode },
4467 { Bad_Opcode },
4468 { Bad_Opcode },
507bd325
L
4469 { "pabsb", { MX, EM }, PREFIX_OPCODE },
4470 { "pabsw", { MX, EM }, PREFIX_OPCODE },
4471 { "pabsd", { MX, EM }, PREFIX_OPCODE },
592d1631 4472 { Bad_Opcode },
f88c9eb0 4473 /* 20 */
7531c613
JB
4474 { "pmovsxbw", { XM, EXq }, PREFIX_DATA },
4475 { "pmovsxbd", { XM, EXd }, PREFIX_DATA },
4476 { "pmovsxbq", { XM, EXw }, PREFIX_DATA },
4477 { "pmovsxwd", { XM, EXq }, PREFIX_DATA },
4478 { "pmovsxwq", { XM, EXd }, PREFIX_DATA },
4479 { "pmovsxdq", { XM, EXq }, PREFIX_DATA },
592d1631
L
4480 { Bad_Opcode },
4481 { Bad_Opcode },
f88c9eb0 4482 /* 28 */
7531c613
JB
4483 { "pmuldq", { XM, EXx }, PREFIX_DATA },
4484 { "pcmpeqq", { XM, EXx }, PREFIX_DATA },
4485 { MOD_TABLE (MOD_0F382A) },
4486 { "packusdw", { XM, EXx }, PREFIX_DATA },
592d1631
L
4487 { Bad_Opcode },
4488 { Bad_Opcode },
4489 { Bad_Opcode },
4490 { Bad_Opcode },
f88c9eb0 4491 /* 30 */
7531c613
JB
4492 { "pmovzxbw", { XM, EXq }, PREFIX_DATA },
4493 { "pmovzxbd", { XM, EXd }, PREFIX_DATA },
4494 { "pmovzxbq", { XM, EXw }, PREFIX_DATA },
4495 { "pmovzxwd", { XM, EXq }, PREFIX_DATA },
4496 { "pmovzxwq", { XM, EXd }, PREFIX_DATA },
4497 { "pmovzxdq", { XM, EXq }, PREFIX_DATA },
4498 { Bad_Opcode },
4499 { "pcmpgtq", { XM, EXx }, PREFIX_DATA },
f88c9eb0 4500 /* 38 */
7531c613
JB
4501 { "pminsb", { XM, EXx }, PREFIX_DATA },
4502 { "pminsd", { XM, EXx }, PREFIX_DATA },
4503 { "pminuw", { XM, EXx }, PREFIX_DATA },
4504 { "pminud", { XM, EXx }, PREFIX_DATA },
4505 { "pmaxsb", { XM, EXx }, PREFIX_DATA },
4506 { "pmaxsd", { XM, EXx }, PREFIX_DATA },
4507 { "pmaxuw", { XM, EXx }, PREFIX_DATA },
4508 { "pmaxud", { XM, EXx }, PREFIX_DATA },
f88c9eb0 4509 /* 40 */
7531c613
JB
4510 { "pmulld", { XM, EXx }, PREFIX_DATA },
4511 { "phminposuw", { XM, EXx }, PREFIX_DATA },
592d1631
L
4512 { Bad_Opcode },
4513 { Bad_Opcode },
4514 { Bad_Opcode },
4515 { Bad_Opcode },
4516 { Bad_Opcode },
4517 { Bad_Opcode },
f88c9eb0 4518 /* 48 */
592d1631
L
4519 { Bad_Opcode },
4520 { Bad_Opcode },
4521 { Bad_Opcode },
4522 { Bad_Opcode },
4523 { Bad_Opcode },
4524 { Bad_Opcode },
4525 { Bad_Opcode },
4526 { Bad_Opcode },
f88c9eb0 4527 /* 50 */
592d1631
L
4528 { Bad_Opcode },
4529 { Bad_Opcode },
4530 { Bad_Opcode },
4531 { Bad_Opcode },
4532 { Bad_Opcode },
4533 { Bad_Opcode },
4534 { Bad_Opcode },
4535 { Bad_Opcode },
f88c9eb0 4536 /* 58 */
592d1631
L
4537 { Bad_Opcode },
4538 { Bad_Opcode },
4539 { Bad_Opcode },
4540 { Bad_Opcode },
4541 { Bad_Opcode },
4542 { Bad_Opcode },
4543 { Bad_Opcode },
4544 { Bad_Opcode },
f88c9eb0 4545 /* 60 */
592d1631
L
4546 { Bad_Opcode },
4547 { Bad_Opcode },
4548 { Bad_Opcode },
4549 { Bad_Opcode },
4550 { Bad_Opcode },
4551 { Bad_Opcode },
4552 { Bad_Opcode },
4553 { Bad_Opcode },
f88c9eb0 4554 /* 68 */
592d1631
L
4555 { Bad_Opcode },
4556 { Bad_Opcode },
4557 { Bad_Opcode },
4558 { Bad_Opcode },
4559 { Bad_Opcode },
4560 { Bad_Opcode },
4561 { Bad_Opcode },
4562 { Bad_Opcode },
f88c9eb0 4563 /* 70 */
592d1631
L
4564 { Bad_Opcode },
4565 { Bad_Opcode },
4566 { Bad_Opcode },
4567 { Bad_Opcode },
4568 { Bad_Opcode },
4569 { Bad_Opcode },
4570 { Bad_Opcode },
4571 { Bad_Opcode },
f88c9eb0 4572 /* 78 */
592d1631
L
4573 { Bad_Opcode },
4574 { Bad_Opcode },
4575 { Bad_Opcode },
4576 { Bad_Opcode },
4577 { Bad_Opcode },
4578 { Bad_Opcode },
4579 { Bad_Opcode },
4580 { Bad_Opcode },
f88c9eb0 4581 /* 80 */
7531c613
JB
4582 { "invept", { Gm, Mo }, PREFIX_DATA },
4583 { "invvpid", { Gm, Mo }, PREFIX_DATA },
4584 { "invpcid", { Gm, M }, PREFIX_DATA },
592d1631
L
4585 { Bad_Opcode },
4586 { Bad_Opcode },
4587 { Bad_Opcode },
4588 { Bad_Opcode },
4589 { Bad_Opcode },
f88c9eb0 4590 /* 88 */
592d1631
L
4591 { Bad_Opcode },
4592 { Bad_Opcode },
4593 { Bad_Opcode },
4594 { Bad_Opcode },
4595 { Bad_Opcode },
4596 { Bad_Opcode },
4597 { Bad_Opcode },
4598 { Bad_Opcode },
f88c9eb0 4599 /* 90 */
592d1631
L
4600 { Bad_Opcode },
4601 { Bad_Opcode },
4602 { Bad_Opcode },
4603 { Bad_Opcode },
4604 { Bad_Opcode },
4605 { Bad_Opcode },
4606 { Bad_Opcode },
4607 { Bad_Opcode },
f88c9eb0 4608 /* 98 */
592d1631
L
4609 { Bad_Opcode },
4610 { Bad_Opcode },
4611 { Bad_Opcode },
4612 { Bad_Opcode },
4613 { Bad_Opcode },
4614 { Bad_Opcode },
4615 { Bad_Opcode },
4616 { Bad_Opcode },
f88c9eb0 4617 /* a0 */
592d1631
L
4618 { Bad_Opcode },
4619 { Bad_Opcode },
4620 { Bad_Opcode },
4621 { Bad_Opcode },
4622 { Bad_Opcode },
4623 { Bad_Opcode },
4624 { Bad_Opcode },
4625 { Bad_Opcode },
f88c9eb0 4626 /* a8 */
592d1631
L
4627 { Bad_Opcode },
4628 { Bad_Opcode },
4629 { Bad_Opcode },
4630 { Bad_Opcode },
4631 { Bad_Opcode },
4632 { Bad_Opcode },
4633 { Bad_Opcode },
4634 { Bad_Opcode },
f88c9eb0 4635 /* b0 */
592d1631
L
4636 { Bad_Opcode },
4637 { Bad_Opcode },
4638 { Bad_Opcode },
4639 { Bad_Opcode },
4640 { Bad_Opcode },
4641 { Bad_Opcode },
4642 { Bad_Opcode },
4643 { Bad_Opcode },
f88c9eb0 4644 /* b8 */
592d1631
L
4645 { Bad_Opcode },
4646 { Bad_Opcode },
4647 { Bad_Opcode },
4648 { Bad_Opcode },
4649 { Bad_Opcode },
4650 { Bad_Opcode },
4651 { Bad_Opcode },
4652 { Bad_Opcode },
f88c9eb0 4653 /* c0 */
592d1631
L
4654 { Bad_Opcode },
4655 { Bad_Opcode },
4656 { Bad_Opcode },
4657 { Bad_Opcode },
4658 { Bad_Opcode },
4659 { Bad_Opcode },
4660 { Bad_Opcode },
4661 { Bad_Opcode },
f88c9eb0 4662 /* c8 */
035e7389
JB
4663 { "sha1nexte", { XM, EXxmm }, PREFIX_OPCODE },
4664 { "sha1msg1", { XM, EXxmm }, PREFIX_OPCODE },
4665 { "sha1msg2", { XM, EXxmm }, PREFIX_OPCODE },
4666 { "sha256rnds2", { XM, EXxmm, XMM0 }, PREFIX_OPCODE },
4667 { "sha256msg1", { XM, EXxmm }, PREFIX_OPCODE },
4668 { "sha256msg2", { XM, EXxmm }, PREFIX_OPCODE },
592d1631 4669 { Bad_Opcode },
7531c613 4670 { "gf2p8mulb", { XM, EXxmm }, PREFIX_DATA },
f88c9eb0 4671 /* d0 */
592d1631
L
4672 { Bad_Opcode },
4673 { Bad_Opcode },
4674 { Bad_Opcode },
4675 { Bad_Opcode },
4676 { Bad_Opcode },
4677 { Bad_Opcode },
4678 { Bad_Opcode },
4679 { Bad_Opcode },
f88c9eb0 4680 /* d8 */
c4694f17 4681 { PREFIX_TABLE (PREFIX_0F38D8) },
592d1631
L
4682 { Bad_Opcode },
4683 { Bad_Opcode },
7531c613 4684 { "aesimc", { XM, EXx }, PREFIX_DATA },
c4694f17
TG
4685 { PREFIX_TABLE (PREFIX_0F38DC) },
4686 { PREFIX_TABLE (PREFIX_0F38DD) },
4687 { PREFIX_TABLE (PREFIX_0F38DE) },
4688 { PREFIX_TABLE (PREFIX_0F38DF) },
f88c9eb0 4689 /* e0 */
592d1631
L
4690 { Bad_Opcode },
4691 { Bad_Opcode },
4692 { Bad_Opcode },
4693 { Bad_Opcode },
4694 { Bad_Opcode },
4695 { Bad_Opcode },
4696 { Bad_Opcode },
4697 { Bad_Opcode },
f88c9eb0 4698 /* e8 */
592d1631
L
4699 { Bad_Opcode },
4700 { Bad_Opcode },
4701 { Bad_Opcode },
4702 { Bad_Opcode },
4703 { Bad_Opcode },
4704 { Bad_Opcode },
4705 { Bad_Opcode },
4706 { Bad_Opcode },
f88c9eb0
SP
4707 /* f0 */
4708 { PREFIX_TABLE (PREFIX_0F38F0) },
4709 { PREFIX_TABLE (PREFIX_0F38F1) },
592d1631
L
4710 { Bad_Opcode },
4711 { Bad_Opcode },
4712 { Bad_Opcode },
7531c613 4713 { MOD_TABLE (MOD_0F38F5) },
e2e1fcde 4714 { PREFIX_TABLE (PREFIX_0F38F6) },
592d1631 4715 { Bad_Opcode },
f88c9eb0 4716 /* f8 */
c0a30a9f 4717 { PREFIX_TABLE (PREFIX_0F38F8) },
035e7389 4718 { MOD_TABLE (MOD_0F38F9) },
c4694f17
TG
4719 { PREFIX_TABLE (PREFIX_0F38FA) },
4720 { PREFIX_TABLE (PREFIX_0F38FB) },
592d1631
L
4721 { Bad_Opcode },
4722 { Bad_Opcode },
4723 { Bad_Opcode },
4724 { Bad_Opcode },
f88c9eb0
SP
4725 },
4726 /* THREE_BYTE_0F3A */
4727 {
4728 /* 00 */
592d1631
L
4729 { Bad_Opcode },
4730 { Bad_Opcode },
4731 { Bad_Opcode },
4732 { Bad_Opcode },
4733 { Bad_Opcode },
4734 { Bad_Opcode },
4735 { Bad_Opcode },
4736 { Bad_Opcode },
f88c9eb0 4737 /* 08 */
7531c613
JB
4738 { "roundps", { XM, EXx, Ib }, PREFIX_DATA },
4739 { "roundpd", { XM, EXx, Ib }, PREFIX_DATA },
4740 { "roundss", { XM, EXd, Ib }, PREFIX_DATA },
4741 { "roundsd", { XM, EXq, Ib }, PREFIX_DATA },
4742 { "blendps", { XM, EXx, Ib }, PREFIX_DATA },
4743 { "blendpd", { XM, EXx, Ib }, PREFIX_DATA },
4744 { "pblendw", { XM, EXx, Ib }, PREFIX_DATA },
507bd325 4745 { "palignr", { MX, EM, Ib }, PREFIX_OPCODE },
f88c9eb0 4746 /* 10 */
592d1631
L
4747 { Bad_Opcode },
4748 { Bad_Opcode },
4749 { Bad_Opcode },
4750 { Bad_Opcode },
7531c613
JB
4751 { "pextrb", { Edqb, XM, Ib }, PREFIX_DATA },
4752 { "pextrw", { Edqw, XM, Ib }, PREFIX_DATA },
4753 { "pextrK", { Edq, XM, Ib }, PREFIX_DATA },
4754 { "extractps", { Edqd, XM, Ib }, PREFIX_DATA },
f88c9eb0 4755 /* 18 */
592d1631
L
4756 { Bad_Opcode },
4757 { Bad_Opcode },
4758 { Bad_Opcode },
4759 { Bad_Opcode },
4760 { Bad_Opcode },
4761 { Bad_Opcode },
4762 { Bad_Opcode },
4763 { Bad_Opcode },
f88c9eb0 4764 /* 20 */
7531c613
JB
4765 { "pinsrb", { XM, Edqb, Ib }, PREFIX_DATA },
4766 { "insertps", { XM, EXd, Ib }, PREFIX_DATA },
4767 { "pinsrK", { XM, Edq, Ib }, PREFIX_DATA },
592d1631
L
4768 { Bad_Opcode },
4769 { Bad_Opcode },
4770 { Bad_Opcode },
4771 { Bad_Opcode },
4772 { Bad_Opcode },
f88c9eb0 4773 /* 28 */
592d1631
L
4774 { Bad_Opcode },
4775 { Bad_Opcode },
4776 { Bad_Opcode },
4777 { Bad_Opcode },
4778 { Bad_Opcode },
4779 { Bad_Opcode },
4780 { Bad_Opcode },
4781 { Bad_Opcode },
f88c9eb0 4782 /* 30 */
592d1631
L
4783 { Bad_Opcode },
4784 { Bad_Opcode },
4785 { Bad_Opcode },
4786 { Bad_Opcode },
4787 { Bad_Opcode },
4788 { Bad_Opcode },
4789 { Bad_Opcode },
4790 { Bad_Opcode },
f88c9eb0 4791 /* 38 */
592d1631
L
4792 { Bad_Opcode },
4793 { Bad_Opcode },
4794 { Bad_Opcode },
4795 { Bad_Opcode },
4796 { Bad_Opcode },
4797 { Bad_Opcode },
4798 { Bad_Opcode },
4799 { Bad_Opcode },
f88c9eb0 4800 /* 40 */
7531c613
JB
4801 { "dpps", { XM, EXx, Ib }, PREFIX_DATA },
4802 { "dppd", { XM, EXx, Ib }, PREFIX_DATA },
4803 { "mpsadbw", { XM, EXx, Ib }, PREFIX_DATA },
592d1631 4804 { Bad_Opcode },
7531c613 4805 { "pclmulqdq", { XM, EXx, PCLMUL }, PREFIX_DATA },
592d1631
L
4806 { Bad_Opcode },
4807 { Bad_Opcode },
4808 { Bad_Opcode },
f88c9eb0 4809 /* 48 */
592d1631
L
4810 { Bad_Opcode },
4811 { Bad_Opcode },
4812 { Bad_Opcode },
4813 { Bad_Opcode },
4814 { Bad_Opcode },
4815 { Bad_Opcode },
4816 { Bad_Opcode },
4817 { Bad_Opcode },
f88c9eb0 4818 /* 50 */
592d1631
L
4819 { Bad_Opcode },
4820 { Bad_Opcode },
4821 { Bad_Opcode },
4822 { Bad_Opcode },
4823 { Bad_Opcode },
4824 { Bad_Opcode },
4825 { Bad_Opcode },
4826 { Bad_Opcode },
f88c9eb0 4827 /* 58 */
592d1631
L
4828 { Bad_Opcode },
4829 { Bad_Opcode },
4830 { Bad_Opcode },
4831 { Bad_Opcode },
4832 { Bad_Opcode },
4833 { Bad_Opcode },
4834 { Bad_Opcode },
4835 { Bad_Opcode },
f88c9eb0 4836 /* 60 */
7531c613
JB
4837 { "pcmpestrm!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
4838 { "pcmpestri!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
4839 { "pcmpistrm", { XM, EXx, Ib }, PREFIX_DATA },
4840 { "pcmpistri", { XM, EXx, Ib }, PREFIX_DATA },
592d1631
L
4841 { Bad_Opcode },
4842 { Bad_Opcode },
4843 { Bad_Opcode },
4844 { Bad_Opcode },
f88c9eb0 4845 /* 68 */
592d1631
L
4846 { Bad_Opcode },
4847 { Bad_Opcode },
4848 { Bad_Opcode },
4849 { Bad_Opcode },
4850 { Bad_Opcode },
4851 { Bad_Opcode },
4852 { Bad_Opcode },
4853 { Bad_Opcode },
f88c9eb0 4854 /* 70 */
592d1631
L
4855 { Bad_Opcode },
4856 { Bad_Opcode },
4857 { Bad_Opcode },
4858 { Bad_Opcode },
4859 { Bad_Opcode },
4860 { Bad_Opcode },
4861 { Bad_Opcode },
4862 { Bad_Opcode },
f88c9eb0 4863 /* 78 */
592d1631
L
4864 { Bad_Opcode },
4865 { Bad_Opcode },
4866 { Bad_Opcode },
4867 { Bad_Opcode },
4868 { Bad_Opcode },
4869 { Bad_Opcode },
4870 { Bad_Opcode },
4871 { Bad_Opcode },
f88c9eb0 4872 /* 80 */
592d1631
L
4873 { Bad_Opcode },
4874 { Bad_Opcode },
4875 { Bad_Opcode },
4876 { Bad_Opcode },
4877 { Bad_Opcode },
4878 { Bad_Opcode },
4879 { Bad_Opcode },
4880 { Bad_Opcode },
f88c9eb0 4881 /* 88 */
592d1631
L
4882 { Bad_Opcode },
4883 { Bad_Opcode },
4884 { Bad_Opcode },
4885 { Bad_Opcode },
4886 { Bad_Opcode },
4887 { Bad_Opcode },
4888 { Bad_Opcode },
4889 { Bad_Opcode },
f88c9eb0 4890 /* 90 */
592d1631
L
4891 { Bad_Opcode },
4892 { Bad_Opcode },
4893 { Bad_Opcode },
4894 { Bad_Opcode },
4895 { Bad_Opcode },
4896 { Bad_Opcode },
4897 { Bad_Opcode },
4898 { Bad_Opcode },
f88c9eb0 4899 /* 98 */
592d1631
L
4900 { Bad_Opcode },
4901 { Bad_Opcode },
4902 { Bad_Opcode },
4903 { Bad_Opcode },
4904 { Bad_Opcode },
4905 { Bad_Opcode },
4906 { Bad_Opcode },
4907 { Bad_Opcode },
f88c9eb0 4908 /* a0 */
592d1631
L
4909 { Bad_Opcode },
4910 { Bad_Opcode },
4911 { Bad_Opcode },
4912 { Bad_Opcode },
4913 { Bad_Opcode },
4914 { Bad_Opcode },
4915 { Bad_Opcode },
4916 { Bad_Opcode },
f88c9eb0 4917 /* a8 */
592d1631
L
4918 { Bad_Opcode },
4919 { Bad_Opcode },
4920 { Bad_Opcode },
4921 { Bad_Opcode },
4922 { Bad_Opcode },
4923 { Bad_Opcode },
4924 { Bad_Opcode },
4925 { Bad_Opcode },
f88c9eb0 4926 /* b0 */
592d1631
L
4927 { Bad_Opcode },
4928 { Bad_Opcode },
4929 { Bad_Opcode },
4930 { Bad_Opcode },
4931 { Bad_Opcode },
4932 { Bad_Opcode },
4933 { Bad_Opcode },
4934 { Bad_Opcode },
f88c9eb0 4935 /* b8 */
592d1631
L
4936 { Bad_Opcode },
4937 { Bad_Opcode },
4938 { Bad_Opcode },
4939 { Bad_Opcode },
4940 { Bad_Opcode },
4941 { Bad_Opcode },
4942 { Bad_Opcode },
4943 { Bad_Opcode },
f88c9eb0 4944 /* c0 */
592d1631
L
4945 { Bad_Opcode },
4946 { Bad_Opcode },
4947 { Bad_Opcode },
4948 { Bad_Opcode },
4949 { Bad_Opcode },
4950 { Bad_Opcode },
4951 { Bad_Opcode },
4952 { Bad_Opcode },
f88c9eb0 4953 /* c8 */
592d1631
L
4954 { Bad_Opcode },
4955 { Bad_Opcode },
4956 { Bad_Opcode },
4957 { Bad_Opcode },
035e7389 4958 { "sha1rnds4", { XM, EXxmm, Ib }, PREFIX_OPCODE },
592d1631 4959 { Bad_Opcode },
7531c613
JB
4960 { "gf2p8affineqb", { XM, EXxmm, Ib }, PREFIX_DATA },
4961 { "gf2p8affineinvqb", { XM, EXxmm, Ib }, PREFIX_DATA },
f88c9eb0 4962 /* d0 */
592d1631
L
4963 { Bad_Opcode },
4964 { Bad_Opcode },
4965 { Bad_Opcode },
4966 { Bad_Opcode },
4967 { Bad_Opcode },
4968 { Bad_Opcode },
4969 { Bad_Opcode },
4970 { Bad_Opcode },
f88c9eb0 4971 /* d8 */
592d1631
L
4972 { Bad_Opcode },
4973 { Bad_Opcode },
4974 { Bad_Opcode },
4975 { Bad_Opcode },
4976 { Bad_Opcode },
4977 { Bad_Opcode },
4978 { Bad_Opcode },
7531c613 4979 { "aeskeygenassist", { XM, EXx, Ib }, PREFIX_DATA },
f88c9eb0 4980 /* e0 */
592d1631
L
4981 { Bad_Opcode },
4982 { Bad_Opcode },
4983 { Bad_Opcode },
4984 { Bad_Opcode },
4985 { Bad_Opcode },
592d1631
L
4986 { Bad_Opcode },
4987 { Bad_Opcode },
4988 { Bad_Opcode },
85f10a01 4989 /* e8 */
592d1631
L
4990 { Bad_Opcode },
4991 { Bad_Opcode },
4992 { Bad_Opcode },
4993 { Bad_Opcode },
4994 { Bad_Opcode },
4995 { Bad_Opcode },
4996 { Bad_Opcode },
4997 { Bad_Opcode },
85f10a01 4998 /* f0 */
c1fa250a 4999 { PREFIX_TABLE (PREFIX_0F3A0F) },
592d1631
L
5000 { Bad_Opcode },
5001 { Bad_Opcode },
5002 { Bad_Opcode },
5003 { Bad_Opcode },
5004 { Bad_Opcode },
5005 { Bad_Opcode },
5006 { Bad_Opcode },
85f10a01 5007 /* f8 */
592d1631
L
5008 { Bad_Opcode },
5009 { Bad_Opcode },
5010 { Bad_Opcode },
5011 { Bad_Opcode },
5012 { Bad_Opcode },
5013 { Bad_Opcode },
5014 { Bad_Opcode },
5015 { Bad_Opcode },
85f10a01 5016 },
f88c9eb0
SP
5017};
5018
5019static const struct dis386 xop_table[][256] = {
5dd85c99 5020 /* XOP_08 */
85f10a01
MM
5021 {
5022 /* 00 */
592d1631
L
5023 { Bad_Opcode },
5024 { Bad_Opcode },
5025 { Bad_Opcode },
5026 { Bad_Opcode },
5027 { Bad_Opcode },
5028 { Bad_Opcode },
5029 { Bad_Opcode },
5030 { Bad_Opcode },
85f10a01 5031 /* 08 */
592d1631
L
5032 { Bad_Opcode },
5033 { Bad_Opcode },
5034 { Bad_Opcode },
5035 { Bad_Opcode },
5036 { Bad_Opcode },
5037 { Bad_Opcode },
5038 { Bad_Opcode },
5039 { Bad_Opcode },
85f10a01 5040 /* 10 */
3929df09 5041 { Bad_Opcode },
592d1631
L
5042 { Bad_Opcode },
5043 { Bad_Opcode },
5044 { Bad_Opcode },
5045 { Bad_Opcode },
5046 { Bad_Opcode },
5047 { Bad_Opcode },
5048 { Bad_Opcode },
85f10a01 5049 /* 18 */
592d1631
L
5050 { Bad_Opcode },
5051 { Bad_Opcode },
5052 { Bad_Opcode },
5053 { Bad_Opcode },
5054 { Bad_Opcode },
5055 { Bad_Opcode },
5056 { Bad_Opcode },
5057 { Bad_Opcode },
85f10a01 5058 /* 20 */
592d1631
L
5059 { Bad_Opcode },
5060 { Bad_Opcode },
5061 { Bad_Opcode },
5062 { Bad_Opcode },
5063 { Bad_Opcode },
5064 { Bad_Opcode },
5065 { Bad_Opcode },
5066 { Bad_Opcode },
85f10a01 5067 /* 28 */
592d1631
L
5068 { Bad_Opcode },
5069 { Bad_Opcode },
5070 { Bad_Opcode },
5071 { Bad_Opcode },
5072 { Bad_Opcode },
5073 { Bad_Opcode },
5074 { Bad_Opcode },
5075 { Bad_Opcode },
c0f3af97 5076 /* 30 */
592d1631
L
5077 { Bad_Opcode },
5078 { Bad_Opcode },
5079 { Bad_Opcode },
5080 { Bad_Opcode },
5081 { Bad_Opcode },
5082 { Bad_Opcode },
5083 { Bad_Opcode },
5084 { Bad_Opcode },
c0f3af97 5085 /* 38 */
592d1631
L
5086 { Bad_Opcode },
5087 { Bad_Opcode },
5088 { Bad_Opcode },
5089 { Bad_Opcode },
5090 { Bad_Opcode },
5091 { Bad_Opcode },
5092 { Bad_Opcode },
5093 { Bad_Opcode },
c0f3af97 5094 /* 40 */
592d1631
L
5095 { Bad_Opcode },
5096 { Bad_Opcode },
5097 { Bad_Opcode },
5098 { Bad_Opcode },
5099 { Bad_Opcode },
5100 { Bad_Opcode },
5101 { Bad_Opcode },
5102 { Bad_Opcode },
85f10a01 5103 /* 48 */
592d1631
L
5104 { Bad_Opcode },
5105 { Bad_Opcode },
5106 { Bad_Opcode },
5107 { Bad_Opcode },
5108 { Bad_Opcode },
5109 { Bad_Opcode },
5110 { Bad_Opcode },
5111 { Bad_Opcode },
c0f3af97 5112 /* 50 */
592d1631
L
5113 { Bad_Opcode },
5114 { Bad_Opcode },
5115 { Bad_Opcode },
5116 { Bad_Opcode },
5117 { Bad_Opcode },
5118 { Bad_Opcode },
5119 { Bad_Opcode },
5120 { Bad_Opcode },
85f10a01 5121 /* 58 */
592d1631
L
5122 { Bad_Opcode },
5123 { Bad_Opcode },
5124 { Bad_Opcode },
5125 { Bad_Opcode },
5126 { Bad_Opcode },
5127 { Bad_Opcode },
5128 { Bad_Opcode },
5129 { Bad_Opcode },
c1e679ec 5130 /* 60 */
592d1631
L
5131 { Bad_Opcode },
5132 { Bad_Opcode },
5133 { Bad_Opcode },
5134 { Bad_Opcode },
5135 { Bad_Opcode },
5136 { Bad_Opcode },
5137 { Bad_Opcode },
5138 { Bad_Opcode },
c0f3af97 5139 /* 68 */
592d1631
L
5140 { Bad_Opcode },
5141 { Bad_Opcode },
5142 { Bad_Opcode },
5143 { Bad_Opcode },
5144 { Bad_Opcode },
5145 { Bad_Opcode },
5146 { Bad_Opcode },
5147 { Bad_Opcode },
85f10a01 5148 /* 70 */
592d1631
L
5149 { Bad_Opcode },
5150 { Bad_Opcode },
5151 { Bad_Opcode },
5152 { Bad_Opcode },
5153 { Bad_Opcode },
5154 { Bad_Opcode },
5155 { Bad_Opcode },
5156 { Bad_Opcode },
85f10a01 5157 /* 78 */
592d1631
L
5158 { Bad_Opcode },
5159 { Bad_Opcode },
5160 { Bad_Opcode },
5161 { Bad_Opcode },
5162 { Bad_Opcode },
5163 { Bad_Opcode },
5164 { Bad_Opcode },
5165 { Bad_Opcode },
85f10a01 5166 /* 80 */
592d1631
L
5167 { Bad_Opcode },
5168 { Bad_Opcode },
5169 { Bad_Opcode },
5170 { Bad_Opcode },
5171 { Bad_Opcode },
467bbef0
JB
5172 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_85) },
5173 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_86) },
5174 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_87) },
5dd85c99 5175 /* 88 */
592d1631
L
5176 { Bad_Opcode },
5177 { Bad_Opcode },
5178 { Bad_Opcode },
5179 { Bad_Opcode },
5180 { Bad_Opcode },
5181 { Bad_Opcode },
467bbef0
JB
5182 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_8E) },
5183 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_8F) },
5dd85c99 5184 /* 90 */
592d1631
L
5185 { Bad_Opcode },
5186 { Bad_Opcode },
5187 { Bad_Opcode },
5188 { Bad_Opcode },
5189 { Bad_Opcode },
467bbef0
JB
5190 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_95) },
5191 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_96) },
5192 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_97) },
5dd85c99 5193 /* 98 */
592d1631
L
5194 { Bad_Opcode },
5195 { Bad_Opcode },
5196 { Bad_Opcode },
5197 { Bad_Opcode },
5198 { Bad_Opcode },
5199 { Bad_Opcode },
467bbef0
JB
5200 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_9E) },
5201 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_9F) },
5dd85c99 5202 /* a0 */
592d1631
L
5203 { Bad_Opcode },
5204 { Bad_Opcode },
b13b1bc0 5205 { "vpcmov", { XM, Vex, EXx, XMVexI4 }, 0 },
467bbef0 5206 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_A3) },
592d1631
L
5207 { Bad_Opcode },
5208 { Bad_Opcode },
467bbef0 5209 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_A6) },
592d1631 5210 { Bad_Opcode },
5dd85c99 5211 /* a8 */
592d1631
L
5212 { Bad_Opcode },
5213 { Bad_Opcode },
5214 { Bad_Opcode },
5215 { Bad_Opcode },
5216 { Bad_Opcode },
5217 { Bad_Opcode },
5218 { Bad_Opcode },
5219 { Bad_Opcode },
5dd85c99 5220 /* b0 */
592d1631
L
5221 { Bad_Opcode },
5222 { Bad_Opcode },
5223 { Bad_Opcode },
5224 { Bad_Opcode },
5225 { Bad_Opcode },
5226 { Bad_Opcode },
467bbef0 5227 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_B6) },
592d1631 5228 { Bad_Opcode },
5dd85c99 5229 /* b8 */
592d1631
L
5230 { Bad_Opcode },
5231 { Bad_Opcode },
5232 { Bad_Opcode },
5233 { Bad_Opcode },
5234 { Bad_Opcode },
5235 { Bad_Opcode },
5236 { Bad_Opcode },
5237 { Bad_Opcode },
5dd85c99 5238 /* c0 */
467bbef0
JB
5239 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C0) },
5240 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C1) },
5241 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C2) },
5242 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C3) },
592d1631
L
5243 { Bad_Opcode },
5244 { Bad_Opcode },
5245 { Bad_Opcode },
5246 { Bad_Opcode },
5dd85c99 5247 /* c8 */
592d1631
L
5248 { Bad_Opcode },
5249 { Bad_Opcode },
5250 { Bad_Opcode },
5251 { Bad_Opcode },
ff688e1f
L
5252 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CC) },
5253 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CD) },
5254 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CE) },
5255 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CF) },
5dd85c99 5256 /* d0 */
592d1631
L
5257 { Bad_Opcode },
5258 { Bad_Opcode },
5259 { Bad_Opcode },
5260 { Bad_Opcode },
5261 { Bad_Opcode },
5262 { Bad_Opcode },
5263 { Bad_Opcode },
5264 { Bad_Opcode },
5dd85c99 5265 /* d8 */
592d1631
L
5266 { Bad_Opcode },
5267 { Bad_Opcode },
5268 { Bad_Opcode },
5269 { Bad_Opcode },
5270 { Bad_Opcode },
5271 { Bad_Opcode },
5272 { Bad_Opcode },
5273 { Bad_Opcode },
5dd85c99 5274 /* e0 */
592d1631
L
5275 { Bad_Opcode },
5276 { Bad_Opcode },
5277 { Bad_Opcode },
5278 { Bad_Opcode },
5279 { Bad_Opcode },
5280 { Bad_Opcode },
5281 { Bad_Opcode },
5282 { Bad_Opcode },
5dd85c99 5283 /* e8 */
592d1631
L
5284 { Bad_Opcode },
5285 { Bad_Opcode },
5286 { Bad_Opcode },
5287 { Bad_Opcode },
ff688e1f
L
5288 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EC) },
5289 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_ED) },
5290 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EE) },
5291 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EF) },
5dd85c99 5292 /* f0 */
592d1631
L
5293 { Bad_Opcode },
5294 { Bad_Opcode },
5295 { Bad_Opcode },
5296 { Bad_Opcode },
5297 { Bad_Opcode },
5298 { Bad_Opcode },
5299 { Bad_Opcode },
5300 { Bad_Opcode },
5dd85c99 5301 /* f8 */
592d1631
L
5302 { Bad_Opcode },
5303 { Bad_Opcode },
5304 { Bad_Opcode },
5305 { Bad_Opcode },
5306 { Bad_Opcode },
5307 { Bad_Opcode },
5308 { Bad_Opcode },
5309 { Bad_Opcode },
5dd85c99
SP
5310 },
5311 /* XOP_09 */
5312 {
5313 /* 00 */
592d1631 5314 { Bad_Opcode },
467bbef0
JB
5315 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_01) },
5316 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_02) },
592d1631
L
5317 { Bad_Opcode },
5318 { Bad_Opcode },
5319 { Bad_Opcode },
5320 { Bad_Opcode },
5321 { Bad_Opcode },
5dd85c99 5322 /* 08 */
592d1631
L
5323 { Bad_Opcode },
5324 { Bad_Opcode },
5325 { Bad_Opcode },
5326 { Bad_Opcode },
5327 { Bad_Opcode },
5328 { Bad_Opcode },
5329 { Bad_Opcode },
5330 { Bad_Opcode },
5dd85c99 5331 /* 10 */
592d1631
L
5332 { Bad_Opcode },
5333 { Bad_Opcode },
467bbef0 5334 { MOD_TABLE (MOD_VEX_0FXOP_09_12) },
592d1631
L
5335 { Bad_Opcode },
5336 { Bad_Opcode },
5337 { Bad_Opcode },
5338 { Bad_Opcode },
5339 { Bad_Opcode },
5dd85c99 5340 /* 18 */
592d1631
L
5341 { Bad_Opcode },
5342 { Bad_Opcode },
5343 { Bad_Opcode },
5344 { Bad_Opcode },
5345 { Bad_Opcode },
5346 { Bad_Opcode },
5347 { Bad_Opcode },
5348 { Bad_Opcode },
5dd85c99 5349 /* 20 */
592d1631
L
5350 { Bad_Opcode },
5351 { Bad_Opcode },
5352 { Bad_Opcode },
5353 { Bad_Opcode },
5354 { Bad_Opcode },
5355 { Bad_Opcode },
5356 { Bad_Opcode },
5357 { Bad_Opcode },
5dd85c99 5358 /* 28 */
592d1631
L
5359 { Bad_Opcode },
5360 { Bad_Opcode },
5361 { Bad_Opcode },
5362 { Bad_Opcode },
5363 { Bad_Opcode },
5364 { Bad_Opcode },
5365 { Bad_Opcode },
5366 { Bad_Opcode },
5dd85c99 5367 /* 30 */
592d1631
L
5368 { Bad_Opcode },
5369 { Bad_Opcode },
5370 { Bad_Opcode },
5371 { Bad_Opcode },
5372 { Bad_Opcode },
5373 { Bad_Opcode },
5374 { Bad_Opcode },
5375 { Bad_Opcode },
5dd85c99 5376 /* 38 */
592d1631
L
5377 { Bad_Opcode },
5378 { Bad_Opcode },
5379 { Bad_Opcode },
5380 { Bad_Opcode },
5381 { Bad_Opcode },
5382 { Bad_Opcode },
5383 { Bad_Opcode },
5384 { Bad_Opcode },
5dd85c99 5385 /* 40 */
592d1631
L
5386 { Bad_Opcode },
5387 { Bad_Opcode },
5388 { Bad_Opcode },
5389 { Bad_Opcode },
5390 { Bad_Opcode },
5391 { Bad_Opcode },
5392 { Bad_Opcode },
5393 { Bad_Opcode },
5dd85c99 5394 /* 48 */
592d1631
L
5395 { Bad_Opcode },
5396 { Bad_Opcode },
5397 { Bad_Opcode },
5398 { Bad_Opcode },
5399 { Bad_Opcode },
5400 { Bad_Opcode },
5401 { Bad_Opcode },
5402 { Bad_Opcode },
5dd85c99 5403 /* 50 */
592d1631
L
5404 { Bad_Opcode },
5405 { Bad_Opcode },
5406 { Bad_Opcode },
5407 { Bad_Opcode },
5408 { Bad_Opcode },
5409 { Bad_Opcode },
5410 { Bad_Opcode },
5411 { Bad_Opcode },
5dd85c99 5412 /* 58 */
592d1631
L
5413 { Bad_Opcode },
5414 { Bad_Opcode },
5415 { Bad_Opcode },
5416 { Bad_Opcode },
5417 { Bad_Opcode },
5418 { Bad_Opcode },
5419 { Bad_Opcode },
5420 { Bad_Opcode },
5dd85c99 5421 /* 60 */
592d1631
L
5422 { Bad_Opcode },
5423 { Bad_Opcode },
5424 { Bad_Opcode },
5425 { Bad_Opcode },
5426 { Bad_Opcode },
5427 { Bad_Opcode },
5428 { Bad_Opcode },
5429 { Bad_Opcode },
5dd85c99 5430 /* 68 */
592d1631
L
5431 { Bad_Opcode },
5432 { Bad_Opcode },
5433 { Bad_Opcode },
5434 { Bad_Opcode },
5435 { Bad_Opcode },
5436 { Bad_Opcode },
5437 { Bad_Opcode },
5438 { Bad_Opcode },
5dd85c99 5439 /* 70 */
592d1631
L
5440 { Bad_Opcode },
5441 { Bad_Opcode },
5442 { Bad_Opcode },
5443 { Bad_Opcode },
5444 { Bad_Opcode },
5445 { Bad_Opcode },
5446 { Bad_Opcode },
5447 { Bad_Opcode },
5dd85c99 5448 /* 78 */
592d1631
L
5449 { Bad_Opcode },
5450 { Bad_Opcode },
5451 { Bad_Opcode },
5452 { Bad_Opcode },
5453 { Bad_Opcode },
5454 { Bad_Opcode },
5455 { Bad_Opcode },
5456 { Bad_Opcode },
5dd85c99 5457 /* 80 */
b5b098c2
JB
5458 { VEX_W_TABLE (VEX_W_0FXOP_09_80) },
5459 { VEX_W_TABLE (VEX_W_0FXOP_09_81) },
5460 { VEX_W_TABLE (VEX_W_0FXOP_09_82) },
5461 { VEX_W_TABLE (VEX_W_0FXOP_09_83) },
592d1631
L
5462 { Bad_Opcode },
5463 { Bad_Opcode },
5464 { Bad_Opcode },
5465 { Bad_Opcode },
5dd85c99 5466 /* 88 */
592d1631
L
5467 { Bad_Opcode },
5468 { Bad_Opcode },
5469 { Bad_Opcode },
5470 { Bad_Opcode },
5471 { Bad_Opcode },
5472 { Bad_Opcode },
5473 { Bad_Opcode },
5474 { Bad_Opcode },
5dd85c99 5475 /* 90 */
467bbef0
JB
5476 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_90) },
5477 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_91) },
5478 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_92) },
5479 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_93) },
5480 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_94) },
5481 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_95) },
5482 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_96) },
5483 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_97) },
5dd85c99 5484 /* 98 */
467bbef0
JB
5485 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_98) },
5486 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_99) },
5487 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_9A) },
5488 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_9B) },
592d1631
L
5489 { Bad_Opcode },
5490 { Bad_Opcode },
5491 { Bad_Opcode },
5492 { Bad_Opcode },
5dd85c99 5493 /* a0 */
592d1631
L
5494 { Bad_Opcode },
5495 { Bad_Opcode },
5496 { Bad_Opcode },
5497 { Bad_Opcode },
5498 { Bad_Opcode },
5499 { Bad_Opcode },
5500 { Bad_Opcode },
5501 { Bad_Opcode },
5dd85c99 5502 /* a8 */
592d1631
L
5503 { Bad_Opcode },
5504 { Bad_Opcode },
5505 { Bad_Opcode },
5506 { Bad_Opcode },
5507 { Bad_Opcode },
5508 { Bad_Opcode },
5509 { Bad_Opcode },
5510 { Bad_Opcode },
5dd85c99 5511 /* b0 */
592d1631
L
5512 { Bad_Opcode },
5513 { Bad_Opcode },
5514 { Bad_Opcode },
5515 { Bad_Opcode },
5516 { Bad_Opcode },
5517 { Bad_Opcode },
5518 { Bad_Opcode },
5519 { Bad_Opcode },
5dd85c99 5520 /* b8 */
592d1631
L
5521 { Bad_Opcode },
5522 { Bad_Opcode },
5523 { Bad_Opcode },
5524 { Bad_Opcode },
5525 { Bad_Opcode },
5526 { Bad_Opcode },
5527 { Bad_Opcode },
5528 { Bad_Opcode },
5dd85c99 5529 /* c0 */
592d1631 5530 { Bad_Opcode },
467bbef0
JB
5531 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C1) },
5532 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C2) },
5533 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C3) },
592d1631
L
5534 { Bad_Opcode },
5535 { Bad_Opcode },
467bbef0
JB
5536 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C6) },
5537 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C7) },
5dd85c99 5538 /* c8 */
592d1631
L
5539 { Bad_Opcode },
5540 { Bad_Opcode },
5541 { Bad_Opcode },
467bbef0 5542 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_CB) },
592d1631
L
5543 { Bad_Opcode },
5544 { Bad_Opcode },
5545 { Bad_Opcode },
5546 { Bad_Opcode },
5dd85c99 5547 /* d0 */
592d1631 5548 { Bad_Opcode },
467bbef0
JB
5549 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D1) },
5550 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D2) },
5551 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D3) },
592d1631
L
5552 { Bad_Opcode },
5553 { Bad_Opcode },
467bbef0
JB
5554 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D6) },
5555 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D7) },
5dd85c99 5556 /* d8 */
592d1631
L
5557 { Bad_Opcode },
5558 { Bad_Opcode },
5559 { Bad_Opcode },
467bbef0 5560 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_DB) },
592d1631
L
5561 { Bad_Opcode },
5562 { Bad_Opcode },
5563 { Bad_Opcode },
5564 { Bad_Opcode },
5dd85c99 5565 /* e0 */
592d1631 5566 { Bad_Opcode },
467bbef0
JB
5567 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E1) },
5568 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E2) },
5569 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E3) },
592d1631
L
5570 { Bad_Opcode },
5571 { Bad_Opcode },
5572 { Bad_Opcode },
5573 { Bad_Opcode },
4e7d34a6 5574 /* e8 */
592d1631
L
5575 { Bad_Opcode },
5576 { Bad_Opcode },
5577 { Bad_Opcode },
5578 { Bad_Opcode },
5579 { Bad_Opcode },
5580 { Bad_Opcode },
5581 { Bad_Opcode },
5582 { Bad_Opcode },
4e7d34a6 5583 /* f0 */
592d1631
L
5584 { Bad_Opcode },
5585 { Bad_Opcode },
5586 { Bad_Opcode },
5587 { Bad_Opcode },
5588 { Bad_Opcode },
5589 { Bad_Opcode },
5590 { Bad_Opcode },
5591 { Bad_Opcode },
4e7d34a6 5592 /* f8 */
592d1631
L
5593 { Bad_Opcode },
5594 { Bad_Opcode },
5595 { Bad_Opcode },
5596 { Bad_Opcode },
5597 { Bad_Opcode },
5598 { Bad_Opcode },
5599 { Bad_Opcode },
5600 { Bad_Opcode },
4e7d34a6 5601 },
f88c9eb0 5602 /* XOP_0A */
4e7d34a6
L
5603 {
5604 /* 00 */
592d1631
L
5605 { Bad_Opcode },
5606 { Bad_Opcode },
5607 { Bad_Opcode },
5608 { Bad_Opcode },
5609 { Bad_Opcode },
5610 { Bad_Opcode },
5611 { Bad_Opcode },
5612 { Bad_Opcode },
4e7d34a6 5613 /* 08 */
592d1631
L
5614 { Bad_Opcode },
5615 { Bad_Opcode },
5616 { Bad_Opcode },
5617 { Bad_Opcode },
5618 { Bad_Opcode },
5619 { Bad_Opcode },
5620 { Bad_Opcode },
5621 { Bad_Opcode },
4e7d34a6 5622 /* 10 */
c1dc7af5 5623 { "bextrS", { Gdq, Edq, Id }, 0 },
592d1631 5624 { Bad_Opcode },
467bbef0 5625 { VEX_LEN_TABLE (VEX_LEN_0FXOP_0A_12) },
592d1631
L
5626 { Bad_Opcode },
5627 { Bad_Opcode },
5628 { Bad_Opcode },
5629 { Bad_Opcode },
5630 { Bad_Opcode },
4e7d34a6 5631 /* 18 */
592d1631
L
5632 { Bad_Opcode },
5633 { Bad_Opcode },
5634 { Bad_Opcode },
5635 { Bad_Opcode },
5636 { Bad_Opcode },
5637 { Bad_Opcode },
5638 { Bad_Opcode },
5639 { Bad_Opcode },
4e7d34a6 5640 /* 20 */
592d1631
L
5641 { Bad_Opcode },
5642 { Bad_Opcode },
5643 { Bad_Opcode },
5644 { Bad_Opcode },
5645 { Bad_Opcode },
5646 { Bad_Opcode },
5647 { Bad_Opcode },
5648 { Bad_Opcode },
4e7d34a6 5649 /* 28 */
592d1631
L
5650 { Bad_Opcode },
5651 { Bad_Opcode },
5652 { Bad_Opcode },
5653 { Bad_Opcode },
5654 { Bad_Opcode },
5655 { Bad_Opcode },
5656 { Bad_Opcode },
5657 { Bad_Opcode },
4e7d34a6 5658 /* 30 */
592d1631
L
5659 { Bad_Opcode },
5660 { Bad_Opcode },
5661 { Bad_Opcode },
5662 { Bad_Opcode },
5663 { Bad_Opcode },
5664 { Bad_Opcode },
5665 { Bad_Opcode },
5666 { Bad_Opcode },
c0f3af97 5667 /* 38 */
592d1631
L
5668 { Bad_Opcode },
5669 { Bad_Opcode },
5670 { Bad_Opcode },
5671 { Bad_Opcode },
5672 { Bad_Opcode },
5673 { Bad_Opcode },
5674 { Bad_Opcode },
5675 { Bad_Opcode },
c0f3af97 5676 /* 40 */
592d1631
L
5677 { Bad_Opcode },
5678 { Bad_Opcode },
5679 { Bad_Opcode },
5680 { Bad_Opcode },
5681 { Bad_Opcode },
5682 { Bad_Opcode },
5683 { Bad_Opcode },
5684 { Bad_Opcode },
c1e679ec 5685 /* 48 */
592d1631
L
5686 { Bad_Opcode },
5687 { Bad_Opcode },
5688 { Bad_Opcode },
5689 { Bad_Opcode },
5690 { Bad_Opcode },
5691 { Bad_Opcode },
5692 { Bad_Opcode },
5693 { Bad_Opcode },
c1e679ec 5694 /* 50 */
592d1631
L
5695 { Bad_Opcode },
5696 { Bad_Opcode },
5697 { Bad_Opcode },
5698 { Bad_Opcode },
5699 { Bad_Opcode },
5700 { Bad_Opcode },
5701 { Bad_Opcode },
5702 { Bad_Opcode },
4e7d34a6 5703 /* 58 */
592d1631
L
5704 { Bad_Opcode },
5705 { Bad_Opcode },
5706 { Bad_Opcode },
5707 { Bad_Opcode },
5708 { Bad_Opcode },
5709 { Bad_Opcode },
5710 { Bad_Opcode },
5711 { Bad_Opcode },
4e7d34a6 5712 /* 60 */
592d1631
L
5713 { Bad_Opcode },
5714 { Bad_Opcode },
5715 { Bad_Opcode },
5716 { Bad_Opcode },
5717 { Bad_Opcode },
5718 { Bad_Opcode },
5719 { Bad_Opcode },
5720 { Bad_Opcode },
4e7d34a6 5721 /* 68 */
592d1631
L
5722 { Bad_Opcode },
5723 { Bad_Opcode },
5724 { Bad_Opcode },
5725 { Bad_Opcode },
5726 { Bad_Opcode },
5727 { Bad_Opcode },
5728 { Bad_Opcode },
5729 { Bad_Opcode },
4e7d34a6 5730 /* 70 */
592d1631
L
5731 { Bad_Opcode },
5732 { Bad_Opcode },
5733 { Bad_Opcode },
5734 { Bad_Opcode },
5735 { Bad_Opcode },
5736 { Bad_Opcode },
5737 { Bad_Opcode },
5738 { Bad_Opcode },
4e7d34a6 5739 /* 78 */
592d1631
L
5740 { Bad_Opcode },
5741 { Bad_Opcode },
5742 { Bad_Opcode },
5743 { Bad_Opcode },
5744 { Bad_Opcode },
5745 { Bad_Opcode },
5746 { Bad_Opcode },
5747 { Bad_Opcode },
4e7d34a6 5748 /* 80 */
592d1631
L
5749 { Bad_Opcode },
5750 { Bad_Opcode },
5751 { Bad_Opcode },
5752 { Bad_Opcode },
5753 { Bad_Opcode },
5754 { Bad_Opcode },
5755 { Bad_Opcode },
5756 { Bad_Opcode },
4e7d34a6 5757 /* 88 */
592d1631
L
5758 { Bad_Opcode },
5759 { Bad_Opcode },
5760 { Bad_Opcode },
5761 { Bad_Opcode },
5762 { Bad_Opcode },
5763 { Bad_Opcode },
5764 { Bad_Opcode },
5765 { Bad_Opcode },
4e7d34a6 5766 /* 90 */
592d1631
L
5767 { Bad_Opcode },
5768 { Bad_Opcode },
5769 { Bad_Opcode },
5770 { Bad_Opcode },
5771 { Bad_Opcode },
5772 { Bad_Opcode },
5773 { Bad_Opcode },
5774 { Bad_Opcode },
4e7d34a6 5775 /* 98 */
592d1631
L
5776 { Bad_Opcode },
5777 { Bad_Opcode },
5778 { Bad_Opcode },
5779 { Bad_Opcode },
5780 { Bad_Opcode },
5781 { Bad_Opcode },
5782 { Bad_Opcode },
5783 { Bad_Opcode },
4e7d34a6 5784 /* a0 */
592d1631
L
5785 { Bad_Opcode },
5786 { Bad_Opcode },
5787 { Bad_Opcode },
5788 { Bad_Opcode },
5789 { Bad_Opcode },
5790 { Bad_Opcode },
5791 { Bad_Opcode },
5792 { Bad_Opcode },
4e7d34a6 5793 /* a8 */
592d1631
L
5794 { Bad_Opcode },
5795 { Bad_Opcode },
5796 { Bad_Opcode },
5797 { Bad_Opcode },
5798 { Bad_Opcode },
5799 { Bad_Opcode },
5800 { Bad_Opcode },
5801 { Bad_Opcode },
d5d7db8e 5802 /* b0 */
592d1631
L
5803 { Bad_Opcode },
5804 { Bad_Opcode },
5805 { Bad_Opcode },
5806 { Bad_Opcode },
5807 { Bad_Opcode },
5808 { Bad_Opcode },
5809 { Bad_Opcode },
5810 { Bad_Opcode },
85f10a01 5811 /* b8 */
592d1631
L
5812 { Bad_Opcode },
5813 { Bad_Opcode },
5814 { Bad_Opcode },
5815 { Bad_Opcode },
5816 { Bad_Opcode },
5817 { Bad_Opcode },
5818 { Bad_Opcode },
5819 { Bad_Opcode },
85f10a01 5820 /* c0 */
592d1631
L
5821 { Bad_Opcode },
5822 { Bad_Opcode },
5823 { Bad_Opcode },
5824 { Bad_Opcode },
5825 { Bad_Opcode },
5826 { Bad_Opcode },
5827 { Bad_Opcode },
5828 { Bad_Opcode },
85f10a01 5829 /* c8 */
592d1631
L
5830 { Bad_Opcode },
5831 { Bad_Opcode },
5832 { Bad_Opcode },
5833 { Bad_Opcode },
5834 { Bad_Opcode },
5835 { Bad_Opcode },
5836 { Bad_Opcode },
5837 { Bad_Opcode },
85f10a01 5838 /* d0 */
592d1631
L
5839 { Bad_Opcode },
5840 { Bad_Opcode },
5841 { Bad_Opcode },
5842 { Bad_Opcode },
5843 { Bad_Opcode },
5844 { Bad_Opcode },
5845 { Bad_Opcode },
5846 { Bad_Opcode },
85f10a01 5847 /* d8 */
592d1631
L
5848 { Bad_Opcode },
5849 { Bad_Opcode },
5850 { Bad_Opcode },
5851 { Bad_Opcode },
5852 { Bad_Opcode },
5853 { Bad_Opcode },
5854 { Bad_Opcode },
5855 { Bad_Opcode },
85f10a01 5856 /* e0 */
592d1631
L
5857 { Bad_Opcode },
5858 { Bad_Opcode },
5859 { Bad_Opcode },
5860 { Bad_Opcode },
5861 { Bad_Opcode },
5862 { Bad_Opcode },
5863 { Bad_Opcode },
5864 { Bad_Opcode },
85f10a01 5865 /* e8 */
592d1631
L
5866 { Bad_Opcode },
5867 { Bad_Opcode },
5868 { Bad_Opcode },
5869 { Bad_Opcode },
5870 { Bad_Opcode },
5871 { Bad_Opcode },
5872 { Bad_Opcode },
5873 { Bad_Opcode },
85f10a01 5874 /* f0 */
592d1631
L
5875 { Bad_Opcode },
5876 { Bad_Opcode },
5877 { Bad_Opcode },
5878 { Bad_Opcode },
5879 { Bad_Opcode },
5880 { Bad_Opcode },
5881 { Bad_Opcode },
5882 { Bad_Opcode },
85f10a01 5883 /* f8 */
592d1631
L
5884 { Bad_Opcode },
5885 { Bad_Opcode },
5886 { Bad_Opcode },
5887 { Bad_Opcode },
5888 { Bad_Opcode },
5889 { Bad_Opcode },
5890 { Bad_Opcode },
5891 { Bad_Opcode },
85f10a01 5892 },
c0f3af97
L
5893};
5894
5895static const struct dis386 vex_table[][256] = {
5896 /* VEX_0F */
85f10a01
MM
5897 {
5898 /* 00 */
592d1631
L
5899 { Bad_Opcode },
5900 { Bad_Opcode },
5901 { Bad_Opcode },
5902 { Bad_Opcode },
5903 { Bad_Opcode },
5904 { Bad_Opcode },
5905 { Bad_Opcode },
5906 { Bad_Opcode },
85f10a01 5907 /* 08 */
592d1631
L
5908 { Bad_Opcode },
5909 { Bad_Opcode },
5910 { Bad_Opcode },
5911 { Bad_Opcode },
5912 { Bad_Opcode },
5913 { Bad_Opcode },
5914 { Bad_Opcode },
5915 { Bad_Opcode },
c0f3af97 5916 /* 10 */
592a252b
L
5917 { PREFIX_TABLE (PREFIX_VEX_0F10) },
5918 { PREFIX_TABLE (PREFIX_VEX_0F11) },
5919 { PREFIX_TABLE (PREFIX_VEX_0F12) },
5920 { MOD_TABLE (MOD_VEX_0F13) },
bf926894
JB
5921 { "vunpcklpX", { XM, Vex, EXx }, PREFIX_OPCODE },
5922 { "vunpckhpX", { XM, Vex, EXx }, PREFIX_OPCODE },
592a252b
L
5923 { PREFIX_TABLE (PREFIX_VEX_0F16) },
5924 { MOD_TABLE (MOD_VEX_0F17) },
c0f3af97 5925 /* 18 */
592d1631
L
5926 { Bad_Opcode },
5927 { Bad_Opcode },
5928 { Bad_Opcode },
5929 { Bad_Opcode },
5930 { Bad_Opcode },
5931 { Bad_Opcode },
5932 { Bad_Opcode },
5933 { Bad_Opcode },
c0f3af97 5934 /* 20 */
592d1631
L
5935 { Bad_Opcode },
5936 { Bad_Opcode },
5937 { Bad_Opcode },
5938 { Bad_Opcode },
5939 { Bad_Opcode },
5940 { Bad_Opcode },
5941 { Bad_Opcode },
5942 { Bad_Opcode },
c0f3af97 5943 /* 28 */
bf926894
JB
5944 { "vmovapX", { XM, EXx }, PREFIX_OPCODE },
5945 { "vmovapX", { EXxS, XM }, PREFIX_OPCODE },
592a252b
L
5946 { PREFIX_TABLE (PREFIX_VEX_0F2A) },
5947 { MOD_TABLE (MOD_VEX_0F2B) },
5948 { PREFIX_TABLE (PREFIX_VEX_0F2C) },
5949 { PREFIX_TABLE (PREFIX_VEX_0F2D) },
5950 { PREFIX_TABLE (PREFIX_VEX_0F2E) },
5951 { PREFIX_TABLE (PREFIX_VEX_0F2F) },
85f10a01 5952 /* 30 */
592d1631
L
5953 { Bad_Opcode },
5954 { Bad_Opcode },
5955 { Bad_Opcode },
5956 { Bad_Opcode },
5957 { Bad_Opcode },
5958 { Bad_Opcode },
5959 { Bad_Opcode },
5960 { Bad_Opcode },
4e7d34a6 5961 /* 38 */
592d1631
L
5962 { Bad_Opcode },
5963 { Bad_Opcode },
5964 { Bad_Opcode },
5965 { Bad_Opcode },
5966 { Bad_Opcode },
5967 { Bad_Opcode },
5968 { Bad_Opcode },
5969 { Bad_Opcode },
d5d7db8e 5970 /* 40 */
592d1631 5971 { Bad_Opcode },
43234a1e
L
5972 { PREFIX_TABLE (PREFIX_VEX_0F41) },
5973 { PREFIX_TABLE (PREFIX_VEX_0F42) },
592d1631 5974 { Bad_Opcode },
43234a1e
L
5975 { PREFIX_TABLE (PREFIX_VEX_0F44) },
5976 { PREFIX_TABLE (PREFIX_VEX_0F45) },
5977 { PREFIX_TABLE (PREFIX_VEX_0F46) },
5978 { PREFIX_TABLE (PREFIX_VEX_0F47) },
85f10a01 5979 /* 48 */
592d1631
L
5980 { Bad_Opcode },
5981 { Bad_Opcode },
1ba585e8 5982 { PREFIX_TABLE (PREFIX_VEX_0F4A) },
43234a1e 5983 { PREFIX_TABLE (PREFIX_VEX_0F4B) },
592d1631
L
5984 { Bad_Opcode },
5985 { Bad_Opcode },
5986 { Bad_Opcode },
5987 { Bad_Opcode },
d5d7db8e 5988 /* 50 */
592a252b
L
5989 { MOD_TABLE (MOD_VEX_0F50) },
5990 { PREFIX_TABLE (PREFIX_VEX_0F51) },
5991 { PREFIX_TABLE (PREFIX_VEX_0F52) },
5992 { PREFIX_TABLE (PREFIX_VEX_0F53) },
bf926894
JB
5993 { "vandpX", { XM, Vex, EXx }, PREFIX_OPCODE },
5994 { "vandnpX", { XM, Vex, EXx }, PREFIX_OPCODE },
5995 { "vorpX", { XM, Vex, EXx }, PREFIX_OPCODE },
5996 { "vxorpX", { XM, Vex, EXx }, PREFIX_OPCODE },
c0f3af97 5997 /* 58 */
592a252b
L
5998 { PREFIX_TABLE (PREFIX_VEX_0F58) },
5999 { PREFIX_TABLE (PREFIX_VEX_0F59) },
6000 { PREFIX_TABLE (PREFIX_VEX_0F5A) },
6001 { PREFIX_TABLE (PREFIX_VEX_0F5B) },
6002 { PREFIX_TABLE (PREFIX_VEX_0F5C) },
6003 { PREFIX_TABLE (PREFIX_VEX_0F5D) },
6004 { PREFIX_TABLE (PREFIX_VEX_0F5E) },
6005 { PREFIX_TABLE (PREFIX_VEX_0F5F) },
c0f3af97 6006 /* 60 */
7531c613
JB
6007 { "vpunpcklbw", { XM, Vex, EXx }, PREFIX_DATA },
6008 { "vpunpcklwd", { XM, Vex, EXx }, PREFIX_DATA },
6009 { "vpunpckldq", { XM, Vex, EXx }, PREFIX_DATA },
6010 { "vpacksswb", { XM, Vex, EXx }, PREFIX_DATA },
6011 { "vpcmpgtb", { XM, Vex, EXx }, PREFIX_DATA },
6012 { "vpcmpgtw", { XM, Vex, EXx }, PREFIX_DATA },
6013 { "vpcmpgtd", { XM, Vex, EXx }, PREFIX_DATA },
6014 { "vpackuswb", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6015 /* 68 */
7531c613
JB
6016 { "vpunpckhbw", { XM, Vex, EXx }, PREFIX_DATA },
6017 { "vpunpckhwd", { XM, Vex, EXx }, PREFIX_DATA },
6018 { "vpunpckhdq", { XM, Vex, EXx }, PREFIX_DATA },
6019 { "vpackssdw", { XM, Vex, EXx }, PREFIX_DATA },
6020 { "vpunpcklqdq", { XM, Vex, EXx }, PREFIX_DATA },
6021 { "vpunpckhqdq", { XM, Vex, EXx }, PREFIX_DATA },
6022 { VEX_LEN_TABLE (VEX_LEN_0F6E) },
592a252b 6023 { PREFIX_TABLE (PREFIX_VEX_0F6F) },
c0f3af97 6024 /* 70 */
592a252b
L
6025 { PREFIX_TABLE (PREFIX_VEX_0F70) },
6026 { REG_TABLE (REG_VEX_0F71) },
6027 { REG_TABLE (REG_VEX_0F72) },
6028 { REG_TABLE (REG_VEX_0F73) },
7531c613
JB
6029 { "vpcmpeqb", { XM, Vex, EXx }, PREFIX_DATA },
6030 { "vpcmpeqw", { XM, Vex, EXx }, PREFIX_DATA },
6031 { "vpcmpeqd", { XM, Vex, EXx }, PREFIX_DATA },
035e7389 6032 { VEX_LEN_TABLE (VEX_LEN_0F77) },
c0f3af97 6033 /* 78 */
592d1631
L
6034 { Bad_Opcode },
6035 { Bad_Opcode },
6036 { Bad_Opcode },
6037 { Bad_Opcode },
592a252b
L
6038 { PREFIX_TABLE (PREFIX_VEX_0F7C) },
6039 { PREFIX_TABLE (PREFIX_VEX_0F7D) },
6040 { PREFIX_TABLE (PREFIX_VEX_0F7E) },
6041 { PREFIX_TABLE (PREFIX_VEX_0F7F) },
c0f3af97 6042 /* 80 */
592d1631
L
6043 { Bad_Opcode },
6044 { Bad_Opcode },
6045 { Bad_Opcode },
6046 { Bad_Opcode },
6047 { Bad_Opcode },
6048 { Bad_Opcode },
6049 { Bad_Opcode },
6050 { Bad_Opcode },
c0f3af97 6051 /* 88 */
592d1631
L
6052 { Bad_Opcode },
6053 { Bad_Opcode },
6054 { Bad_Opcode },
6055 { Bad_Opcode },
6056 { Bad_Opcode },
6057 { Bad_Opcode },
6058 { Bad_Opcode },
6059 { Bad_Opcode },
c0f3af97 6060 /* 90 */
43234a1e
L
6061 { PREFIX_TABLE (PREFIX_VEX_0F90) },
6062 { PREFIX_TABLE (PREFIX_VEX_0F91) },
6063 { PREFIX_TABLE (PREFIX_VEX_0F92) },
6064 { PREFIX_TABLE (PREFIX_VEX_0F93) },
592d1631
L
6065 { Bad_Opcode },
6066 { Bad_Opcode },
6067 { Bad_Opcode },
6068 { Bad_Opcode },
c0f3af97 6069 /* 98 */
43234a1e 6070 { PREFIX_TABLE (PREFIX_VEX_0F98) },
1ba585e8 6071 { PREFIX_TABLE (PREFIX_VEX_0F99) },
592d1631
L
6072 { Bad_Opcode },
6073 { Bad_Opcode },
6074 { Bad_Opcode },
6075 { Bad_Opcode },
6076 { Bad_Opcode },
6077 { Bad_Opcode },
c0f3af97 6078 /* a0 */
592d1631
L
6079 { Bad_Opcode },
6080 { Bad_Opcode },
6081 { Bad_Opcode },
6082 { Bad_Opcode },
6083 { Bad_Opcode },
6084 { Bad_Opcode },
6085 { Bad_Opcode },
6086 { Bad_Opcode },
c0f3af97 6087 /* a8 */
592d1631
L
6088 { Bad_Opcode },
6089 { Bad_Opcode },
6090 { Bad_Opcode },
6091 { Bad_Opcode },
6092 { Bad_Opcode },
6093 { Bad_Opcode },
592a252b 6094 { REG_TABLE (REG_VEX_0FAE) },
592d1631 6095 { Bad_Opcode },
c0f3af97 6096 /* b0 */
592d1631
L
6097 { Bad_Opcode },
6098 { Bad_Opcode },
6099 { Bad_Opcode },
6100 { Bad_Opcode },
6101 { Bad_Opcode },
6102 { Bad_Opcode },
6103 { Bad_Opcode },
6104 { Bad_Opcode },
c0f3af97 6105 /* b8 */
592d1631
L
6106 { Bad_Opcode },
6107 { Bad_Opcode },
6108 { Bad_Opcode },
6109 { Bad_Opcode },
6110 { Bad_Opcode },
6111 { Bad_Opcode },
6112 { Bad_Opcode },
6113 { Bad_Opcode },
c0f3af97 6114 /* c0 */
592d1631
L
6115 { Bad_Opcode },
6116 { Bad_Opcode },
592a252b 6117 { PREFIX_TABLE (PREFIX_VEX_0FC2) },
592d1631 6118 { Bad_Opcode },
7531c613
JB
6119 { VEX_LEN_TABLE (VEX_LEN_0FC4) },
6120 { VEX_LEN_TABLE (VEX_LEN_0FC5) },
bf926894 6121 { "vshufpX", { XM, Vex, EXx, Ib }, PREFIX_OPCODE },
592d1631 6122 { Bad_Opcode },
c0f3af97 6123 /* c8 */
592d1631
L
6124 { Bad_Opcode },
6125 { Bad_Opcode },
6126 { Bad_Opcode },
6127 { Bad_Opcode },
6128 { Bad_Opcode },
6129 { Bad_Opcode },
6130 { Bad_Opcode },
6131 { Bad_Opcode },
c0f3af97 6132 /* d0 */
592a252b 6133 { PREFIX_TABLE (PREFIX_VEX_0FD0) },
7531c613
JB
6134 { "vpsrlw", { XM, Vex, EXxmm }, PREFIX_DATA },
6135 { "vpsrld", { XM, Vex, EXxmm }, PREFIX_DATA },
6136 { "vpsrlq", { XM, Vex, EXxmm }, PREFIX_DATA },
6137 { "vpaddq", { XM, Vex, EXx }, PREFIX_DATA },
6138 { "vpmullw", { XM, Vex, EXx }, PREFIX_DATA },
6139 { VEX_LEN_TABLE (VEX_LEN_0FD6) },
6140 { MOD_TABLE (MOD_VEX_0FD7) },
c0f3af97 6141 /* d8 */
7531c613
JB
6142 { "vpsubusb", { XM, Vex, EXx }, PREFIX_DATA },
6143 { "vpsubusw", { XM, Vex, EXx }, PREFIX_DATA },
6144 { "vpminub", { XM, Vex, EXx }, PREFIX_DATA },
6145 { "vpand", { XM, Vex, EXx }, PREFIX_DATA },
6146 { "vpaddusb", { XM, Vex, EXx }, PREFIX_DATA },
6147 { "vpaddusw", { XM, Vex, EXx }, PREFIX_DATA },
6148 { "vpmaxub", { XM, Vex, EXx }, PREFIX_DATA },
6149 { "vpandn", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6150 /* e0 */
7531c613
JB
6151 { "vpavgb", { XM, Vex, EXx }, PREFIX_DATA },
6152 { "vpsraw", { XM, Vex, EXxmm }, PREFIX_DATA },
6153 { "vpsrad", { XM, Vex, EXxmm }, PREFIX_DATA },
6154 { "vpavgw", { XM, Vex, EXx }, PREFIX_DATA },
6155 { "vpmulhuw", { XM, Vex, EXx }, PREFIX_DATA },
6156 { "vpmulhw", { XM, Vex, EXx }, PREFIX_DATA },
592a252b 6157 { PREFIX_TABLE (PREFIX_VEX_0FE6) },
7531c613 6158 { MOD_TABLE (MOD_VEX_0FE7) },
c0f3af97 6159 /* e8 */
7531c613
JB
6160 { "vpsubsb", { XM, Vex, EXx }, PREFIX_DATA },
6161 { "vpsubsw", { XM, Vex, EXx }, PREFIX_DATA },
6162 { "vpminsw", { XM, Vex, EXx }, PREFIX_DATA },
6163 { "vpor", { XM, Vex, EXx }, PREFIX_DATA },
6164 { "vpaddsb", { XM, Vex, EXx }, PREFIX_DATA },
6165 { "vpaddsw", { XM, Vex, EXx }, PREFIX_DATA },
6166 { "vpmaxsw", { XM, Vex, EXx }, PREFIX_DATA },
6167 { "vpxor", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6168 /* f0 */
592a252b 6169 { PREFIX_TABLE (PREFIX_VEX_0FF0) },
7531c613
JB
6170 { "vpsllw", { XM, Vex, EXxmm }, PREFIX_DATA },
6171 { "vpslld", { XM, Vex, EXxmm }, PREFIX_DATA },
6172 { "vpsllq", { XM, Vex, EXxmm }, PREFIX_DATA },
6173 { "vpmuludq", { XM, Vex, EXx }, PREFIX_DATA },
6174 { "vpmaddwd", { XM, Vex, EXx }, PREFIX_DATA },
6175 { "vpsadbw", { XM, Vex, EXx }, PREFIX_DATA },
6176 { VEX_LEN_TABLE (VEX_LEN_0FF7) },
c0f3af97 6177 /* f8 */
7531c613
JB
6178 { "vpsubb", { XM, Vex, EXx }, PREFIX_DATA },
6179 { "vpsubw", { XM, Vex, EXx }, PREFIX_DATA },
6180 { "vpsubd", { XM, Vex, EXx }, PREFIX_DATA },
6181 { "vpsubq", { XM, Vex, EXx }, PREFIX_DATA },
6182 { "vpaddb", { XM, Vex, EXx }, PREFIX_DATA },
6183 { "vpaddw", { XM, Vex, EXx }, PREFIX_DATA },
6184 { "vpaddd", { XM, Vex, EXx }, PREFIX_DATA },
592d1631 6185 { Bad_Opcode },
c0f3af97
L
6186 },
6187 /* VEX_0F38 */
6188 {
6189 /* 00 */
7531c613
JB
6190 { "vpshufb", { XM, Vex, EXx }, PREFIX_DATA },
6191 { "vphaddw", { XM, Vex, EXx }, PREFIX_DATA },
6192 { "vphaddd", { XM, Vex, EXx }, PREFIX_DATA },
6193 { "vphaddsw", { XM, Vex, EXx }, PREFIX_DATA },
6194 { "vpmaddubsw", { XM, Vex, EXx }, PREFIX_DATA },
6195 { "vphsubw", { XM, Vex, EXx }, PREFIX_DATA },
6196 { "vphsubd", { XM, Vex, EXx }, PREFIX_DATA },
6197 { "vphsubsw", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6198 /* 08 */
7531c613
JB
6199 { "vpsignb", { XM, Vex, EXx }, PREFIX_DATA },
6200 { "vpsignw", { XM, Vex, EXx }, PREFIX_DATA },
6201 { "vpsignd", { XM, Vex, EXx }, PREFIX_DATA },
6202 { "vpmulhrsw", { XM, Vex, EXx }, PREFIX_DATA },
6203 { VEX_W_TABLE (VEX_W_0F380C) },
6204 { VEX_W_TABLE (VEX_W_0F380D) },
6205 { VEX_W_TABLE (VEX_W_0F380E) },
6206 { VEX_W_TABLE (VEX_W_0F380F) },
c0f3af97 6207 /* 10 */
592d1631
L
6208 { Bad_Opcode },
6209 { Bad_Opcode },
6210 { Bad_Opcode },
7531c613 6211 { VEX_W_TABLE (VEX_W_0F3813) },
592d1631
L
6212 { Bad_Opcode },
6213 { Bad_Opcode },
7531c613
JB
6214 { VEX_LEN_TABLE (VEX_LEN_0F3816) },
6215 { "vptest", { XM, EXx }, PREFIX_DATA },
c0f3af97 6216 /* 18 */
7531c613
JB
6217 { VEX_W_TABLE (VEX_W_0F3818) },
6218 { VEX_LEN_TABLE (VEX_LEN_0F3819) },
6219 { MOD_TABLE (MOD_VEX_0F381A) },
592d1631 6220 { Bad_Opcode },
7531c613
JB
6221 { "vpabsb", { XM, EXx }, PREFIX_DATA },
6222 { "vpabsw", { XM, EXx }, PREFIX_DATA },
6223 { "vpabsd", { XM, EXx }, PREFIX_DATA },
592d1631 6224 { Bad_Opcode },
c0f3af97 6225 /* 20 */
7531c613
JB
6226 { "vpmovsxbw", { XM, EXxmmq }, PREFIX_DATA },
6227 { "vpmovsxbd", { XM, EXxmmqd }, PREFIX_DATA },
6228 { "vpmovsxbq", { XM, EXxmmdw }, PREFIX_DATA },
6229 { "vpmovsxwd", { XM, EXxmmq }, PREFIX_DATA },
6230 { "vpmovsxwq", { XM, EXxmmqd }, PREFIX_DATA },
6231 { "vpmovsxdq", { XM, EXxmmq }, PREFIX_DATA },
592d1631
L
6232 { Bad_Opcode },
6233 { Bad_Opcode },
c0f3af97 6234 /* 28 */
7531c613
JB
6235 { "vpmuldq", { XM, Vex, EXx }, PREFIX_DATA },
6236 { "vpcmpeqq", { XM, Vex, EXx }, PREFIX_DATA },
6237 { MOD_TABLE (MOD_VEX_0F382A) },
6238 { "vpackusdw", { XM, Vex, EXx }, PREFIX_DATA },
6239 { MOD_TABLE (MOD_VEX_0F382C) },
6240 { MOD_TABLE (MOD_VEX_0F382D) },
6241 { MOD_TABLE (MOD_VEX_0F382E) },
6242 { MOD_TABLE (MOD_VEX_0F382F) },
c0f3af97 6243 /* 30 */
7531c613
JB
6244 { "vpmovzxbw", { XM, EXxmmq }, PREFIX_DATA },
6245 { "vpmovzxbd", { XM, EXxmmqd }, PREFIX_DATA },
6246 { "vpmovzxbq", { XM, EXxmmdw }, PREFIX_DATA },
6247 { "vpmovzxwd", { XM, EXxmmq }, PREFIX_DATA },
6248 { "vpmovzxwq", { XM, EXxmmqd }, PREFIX_DATA },
6249 { "vpmovzxdq", { XM, EXxmmq }, PREFIX_DATA },
6250 { VEX_LEN_TABLE (VEX_LEN_0F3836) },
6251 { "vpcmpgtq", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6252 /* 38 */
7531c613
JB
6253 { "vpminsb", { XM, Vex, EXx }, PREFIX_DATA },
6254 { "vpminsd", { XM, Vex, EXx }, PREFIX_DATA },
6255 { "vpminuw", { XM, Vex, EXx }, PREFIX_DATA },
6256 { "vpminud", { XM, Vex, EXx }, PREFIX_DATA },
6257 { "vpmaxsb", { XM, Vex, EXx }, PREFIX_DATA },
6258 { "vpmaxsd", { XM, Vex, EXx }, PREFIX_DATA },
6259 { "vpmaxuw", { XM, Vex, EXx }, PREFIX_DATA },
6260 { "vpmaxud", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6261 /* 40 */
7531c613
JB
6262 { "vpmulld", { XM, Vex, EXx }, PREFIX_DATA },
6263 { VEX_LEN_TABLE (VEX_LEN_0F3841) },
592d1631
L
6264 { Bad_Opcode },
6265 { Bad_Opcode },
6266 { Bad_Opcode },
7531c613
JB
6267 { "vpsrlv%DQ", { XM, Vex, EXx }, PREFIX_DATA },
6268 { VEX_W_TABLE (VEX_W_0F3846) },
6269 { "vpsllv%DQ", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6270 /* 48 */
592d1631 6271 { Bad_Opcode },
260cd341 6272 { X86_64_TABLE (X86_64_VEX_0F3849) },
592d1631 6273 { Bad_Opcode },
260cd341 6274 { X86_64_TABLE (X86_64_VEX_0F384B) },
592d1631
L
6275 { Bad_Opcode },
6276 { Bad_Opcode },
6277 { Bad_Opcode },
6278 { Bad_Opcode },
c0f3af97 6279 /* 50 */
58bf9b6a
L
6280 { VEX_W_TABLE (VEX_W_0F3850) },
6281 { VEX_W_TABLE (VEX_W_0F3851) },
6282 { VEX_W_TABLE (VEX_W_0F3852) },
6283 { VEX_W_TABLE (VEX_W_0F3853) },
592d1631
L
6284 { Bad_Opcode },
6285 { Bad_Opcode },
6286 { Bad_Opcode },
6287 { Bad_Opcode },
c0f3af97 6288 /* 58 */
7531c613
JB
6289 { VEX_W_TABLE (VEX_W_0F3858) },
6290 { VEX_W_TABLE (VEX_W_0F3859) },
6291 { MOD_TABLE (MOD_VEX_0F385A) },
592d1631 6292 { Bad_Opcode },
260cd341 6293 { X86_64_TABLE (X86_64_VEX_0F385C) },
592d1631 6294 { Bad_Opcode },
260cd341 6295 { X86_64_TABLE (X86_64_VEX_0F385E) },
592d1631 6296 { Bad_Opcode },
c0f3af97 6297 /* 60 */
592d1631
L
6298 { Bad_Opcode },
6299 { Bad_Opcode },
6300 { Bad_Opcode },
6301 { Bad_Opcode },
6302 { Bad_Opcode },
6303 { Bad_Opcode },
6304 { Bad_Opcode },
6305 { Bad_Opcode },
c0f3af97 6306 /* 68 */
592d1631
L
6307 { Bad_Opcode },
6308 { Bad_Opcode },
6309 { Bad_Opcode },
6310 { Bad_Opcode },
6311 { Bad_Opcode },
6312 { Bad_Opcode },
6313 { Bad_Opcode },
6314 { Bad_Opcode },
c0f3af97 6315 /* 70 */
592d1631
L
6316 { Bad_Opcode },
6317 { Bad_Opcode },
6318 { Bad_Opcode },
6319 { Bad_Opcode },
6320 { Bad_Opcode },
6321 { Bad_Opcode },
6322 { Bad_Opcode },
6323 { Bad_Opcode },
c0f3af97 6324 /* 78 */
7531c613
JB
6325 { VEX_W_TABLE (VEX_W_0F3878) },
6326 { VEX_W_TABLE (VEX_W_0F3879) },
592d1631
L
6327 { Bad_Opcode },
6328 { Bad_Opcode },
6329 { Bad_Opcode },
6330 { Bad_Opcode },
6331 { Bad_Opcode },
6332 { Bad_Opcode },
c0f3af97 6333 /* 80 */
592d1631
L
6334 { Bad_Opcode },
6335 { Bad_Opcode },
6336 { Bad_Opcode },
6337 { Bad_Opcode },
6338 { Bad_Opcode },
6339 { Bad_Opcode },
6340 { Bad_Opcode },
6341 { Bad_Opcode },
c0f3af97 6342 /* 88 */
592d1631
L
6343 { Bad_Opcode },
6344 { Bad_Opcode },
6345 { Bad_Opcode },
6346 { Bad_Opcode },
7531c613 6347 { MOD_TABLE (MOD_VEX_0F388C) },
592d1631 6348 { Bad_Opcode },
7531c613 6349 { MOD_TABLE (MOD_VEX_0F388E) },
592d1631 6350 { Bad_Opcode },
c0f3af97 6351 /* 90 */
7531c613
JB
6352 { "vpgatherd%DQ", { XM, MVexVSIBDWpX, Vex }, PREFIX_DATA },
6353 { "vpgatherq%DQ", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, PREFIX_DATA },
6354 { "vgatherdp%XW", { XM, MVexVSIBDWpX, Vex }, PREFIX_DATA },
6355 { "vgatherqp%XW", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, PREFIX_DATA },
592d1631
L
6356 { Bad_Opcode },
6357 { Bad_Opcode },
7531c613
JB
6358 { "vfmaddsub132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6359 { "vfmsubadd132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6360 /* 98 */
7531c613
JB
6361 { "vfmadd132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6362 { "vfmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6363 { "vfmsub132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6364 { "vfmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6365 { "vfnmadd132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6366 { "vfnmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6367 { "vfnmsub132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6368 { "vfnmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
c0f3af97 6369 /* a0 */
592d1631
L
6370 { Bad_Opcode },
6371 { Bad_Opcode },
6372 { Bad_Opcode },
6373 { Bad_Opcode },
6374 { Bad_Opcode },
6375 { Bad_Opcode },
7531c613
JB
6376 { "vfmaddsub213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6377 { "vfmsubadd213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6378 /* a8 */
7531c613
JB
6379 { "vfmadd213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6380 { "vfmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6381 { "vfmsub213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6382 { "vfmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6383 { "vfnmadd213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6384 { "vfnmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6385 { "vfnmsub213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6386 { "vfnmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
c0f3af97 6387 /* b0 */
592d1631
L
6388 { Bad_Opcode },
6389 { Bad_Opcode },
6390 { Bad_Opcode },
6391 { Bad_Opcode },
6392 { Bad_Opcode },
6393 { Bad_Opcode },
7531c613
JB
6394 { "vfmaddsub231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6395 { "vfmsubadd231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6396 /* b8 */
7531c613
JB
6397 { "vfmadd231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6398 { "vfmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6399 { "vfmsub231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6400 { "vfmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6401 { "vfnmadd231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6402 { "vfnmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6403 { "vfnmsub231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6404 { "vfnmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
c0f3af97 6405 /* c0 */
592d1631
L
6406 { Bad_Opcode },
6407 { Bad_Opcode },
6408 { Bad_Opcode },
6409 { Bad_Opcode },
6410 { Bad_Opcode },
6411 { Bad_Opcode },
6412 { Bad_Opcode },
6413 { Bad_Opcode },
c0f3af97 6414 /* c8 */
592d1631
L
6415 { Bad_Opcode },
6416 { Bad_Opcode },
6417 { Bad_Opcode },
6418 { Bad_Opcode },
6419 { Bad_Opcode },
6420 { Bad_Opcode },
6421 { Bad_Opcode },
7531c613 6422 { VEX_W_TABLE (VEX_W_0F38CF) },
c0f3af97 6423 /* d0 */
592d1631
L
6424 { Bad_Opcode },
6425 { Bad_Opcode },
6426 { Bad_Opcode },
6427 { Bad_Opcode },
6428 { Bad_Opcode },
6429 { Bad_Opcode },
6430 { Bad_Opcode },
6431 { Bad_Opcode },
c0f3af97 6432 /* d8 */
592d1631
L
6433 { Bad_Opcode },
6434 { Bad_Opcode },
6435 { Bad_Opcode },
7531c613
JB
6436 { VEX_LEN_TABLE (VEX_LEN_0F38DB) },
6437 { "vaesenc", { XM, Vex, EXx }, PREFIX_DATA },
6438 { "vaesenclast", { XM, Vex, EXx }, PREFIX_DATA },
6439 { "vaesdec", { XM, Vex, EXx }, PREFIX_DATA },
6440 { "vaesdeclast", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6441 /* e0 */
592d1631
L
6442 { Bad_Opcode },
6443 { Bad_Opcode },
6444 { Bad_Opcode },
6445 { Bad_Opcode },
6446 { Bad_Opcode },
6447 { Bad_Opcode },
6448 { Bad_Opcode },
6449 { Bad_Opcode },
c0f3af97 6450 /* e8 */
592d1631
L
6451 { Bad_Opcode },
6452 { Bad_Opcode },
6453 { Bad_Opcode },
6454 { Bad_Opcode },
6455 { Bad_Opcode },
6456 { Bad_Opcode },
6457 { Bad_Opcode },
6458 { Bad_Opcode },
c0f3af97 6459 /* f0 */
592d1631
L
6460 { Bad_Opcode },
6461 { Bad_Opcode },
035e7389 6462 { VEX_LEN_TABLE (VEX_LEN_0F38F2) },
f12dc422 6463 { REG_TABLE (REG_VEX_0F38F3) },
592d1631 6464 { Bad_Opcode },
6c30d220
L
6465 { PREFIX_TABLE (PREFIX_VEX_0F38F5) },
6466 { PREFIX_TABLE (PREFIX_VEX_0F38F6) },
f12dc422 6467 { PREFIX_TABLE (PREFIX_VEX_0F38F7) },
c0f3af97 6468 /* f8 */
592d1631
L
6469 { Bad_Opcode },
6470 { Bad_Opcode },
6471 { Bad_Opcode },
6472 { Bad_Opcode },
6473 { Bad_Opcode },
6474 { Bad_Opcode },
6475 { Bad_Opcode },
6476 { Bad_Opcode },
c0f3af97
L
6477 },
6478 /* VEX_0F3A */
6479 {
6480 /* 00 */
7531c613
JB
6481 { VEX_LEN_TABLE (VEX_LEN_0F3A00) },
6482 { VEX_LEN_TABLE (VEX_LEN_0F3A01) },
6483 { VEX_W_TABLE (VEX_W_0F3A02) },
592d1631 6484 { Bad_Opcode },
7531c613
JB
6485 { VEX_W_TABLE (VEX_W_0F3A04) },
6486 { VEX_W_TABLE (VEX_W_0F3A05) },
6487 { VEX_LEN_TABLE (VEX_LEN_0F3A06) },
592d1631 6488 { Bad_Opcode },
c0f3af97 6489 /* 08 */
7531c613
JB
6490 { "vroundps", { XM, EXx, Ib }, PREFIX_DATA },
6491 { "vroundpd", { XM, EXx, Ib }, PREFIX_DATA },
6492 { "vroundss", { XMScalar, VexScalar, EXxmm_md, Ib }, PREFIX_DATA },
6493 { "vroundsd", { XMScalar, VexScalar, EXxmm_mq, Ib }, PREFIX_DATA },
6494 { "vblendps", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6495 { "vblendpd", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6496 { "vpblendw", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6497 { "vpalignr", { XM, Vex, EXx, Ib }, PREFIX_DATA },
c0f3af97 6498 /* 10 */
592d1631
L
6499 { Bad_Opcode },
6500 { Bad_Opcode },
6501 { Bad_Opcode },
6502 { Bad_Opcode },
7531c613
JB
6503 { VEX_LEN_TABLE (VEX_LEN_0F3A14) },
6504 { VEX_LEN_TABLE (VEX_LEN_0F3A15) },
6505 { VEX_LEN_TABLE (VEX_LEN_0F3A16) },
6506 { VEX_LEN_TABLE (VEX_LEN_0F3A17) },
c0f3af97 6507 /* 18 */
7531c613
JB
6508 { VEX_LEN_TABLE (VEX_LEN_0F3A18) },
6509 { VEX_LEN_TABLE (VEX_LEN_0F3A19) },
592d1631
L
6510 { Bad_Opcode },
6511 { Bad_Opcode },
6512 { Bad_Opcode },
7531c613 6513 { VEX_W_TABLE (VEX_W_0F3A1D) },
592d1631
L
6514 { Bad_Opcode },
6515 { Bad_Opcode },
c0f3af97 6516 /* 20 */
7531c613
JB
6517 { VEX_LEN_TABLE (VEX_LEN_0F3A20) },
6518 { VEX_LEN_TABLE (VEX_LEN_0F3A21) },
6519 { VEX_LEN_TABLE (VEX_LEN_0F3A22) },
592d1631
L
6520 { Bad_Opcode },
6521 { Bad_Opcode },
6522 { Bad_Opcode },
6523 { Bad_Opcode },
6524 { Bad_Opcode },
c0f3af97 6525 /* 28 */
592d1631
L
6526 { Bad_Opcode },
6527 { Bad_Opcode },
6528 { Bad_Opcode },
6529 { Bad_Opcode },
6530 { Bad_Opcode },
6531 { Bad_Opcode },
6532 { Bad_Opcode },
6533 { Bad_Opcode },
c0f3af97 6534 /* 30 */
7531c613
JB
6535 { VEX_LEN_TABLE (VEX_LEN_0F3A30) },
6536 { VEX_LEN_TABLE (VEX_LEN_0F3A31) },
6537 { VEX_LEN_TABLE (VEX_LEN_0F3A32) },
6538 { VEX_LEN_TABLE (VEX_LEN_0F3A33) },
592d1631
L
6539 { Bad_Opcode },
6540 { Bad_Opcode },
6541 { Bad_Opcode },
6542 { Bad_Opcode },
c0f3af97 6543 /* 38 */
7531c613
JB
6544 { VEX_LEN_TABLE (VEX_LEN_0F3A38) },
6545 { VEX_LEN_TABLE (VEX_LEN_0F3A39) },
592d1631
L
6546 { Bad_Opcode },
6547 { Bad_Opcode },
6548 { Bad_Opcode },
6549 { Bad_Opcode },
6550 { Bad_Opcode },
6551 { Bad_Opcode },
c0f3af97 6552 /* 40 */
7531c613
JB
6553 { "vdpps", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6554 { VEX_LEN_TABLE (VEX_LEN_0F3A41) },
6555 { "vmpsadbw", { XM, Vex, EXx, Ib }, PREFIX_DATA },
592d1631 6556 { Bad_Opcode },
7531c613 6557 { "vpclmulqdq", { XM, Vex, EXx, PCLMUL }, PREFIX_DATA },
592d1631 6558 { Bad_Opcode },
7531c613 6559 { VEX_LEN_TABLE (VEX_LEN_0F3A46) },
592d1631 6560 { Bad_Opcode },
c0f3af97 6561 /* 48 */
7531c613
JB
6562 { "vpermil2ps", { XM, Vex, EXx, XMVexI4, VexI4 }, PREFIX_DATA },
6563 { "vpermil2pd", { XM, Vex, EXx, XMVexI4, VexI4 }, PREFIX_DATA },
6564 { VEX_W_TABLE (VEX_W_0F3A4A) },
6565 { VEX_W_TABLE (VEX_W_0F3A4B) },
6566 { VEX_W_TABLE (VEX_W_0F3A4C) },
592d1631
L
6567 { Bad_Opcode },
6568 { Bad_Opcode },
6569 { Bad_Opcode },
c0f3af97 6570 /* 50 */
592d1631
L
6571 { Bad_Opcode },
6572 { Bad_Opcode },
6573 { Bad_Opcode },
6574 { Bad_Opcode },
6575 { Bad_Opcode },
6576 { Bad_Opcode },
6577 { Bad_Opcode },
6578 { Bad_Opcode },
c0f3af97 6579 /* 58 */
592d1631
L
6580 { Bad_Opcode },
6581 { Bad_Opcode },
6582 { Bad_Opcode },
6583 { Bad_Opcode },
7531c613
JB
6584 { "vfmaddsubps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6585 { "vfmaddsubpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6586 { "vfmsubaddps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6587 { "vfmsubaddpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
c0f3af97 6588 /* 60 */
7531c613
JB
6589 { VEX_LEN_TABLE (VEX_LEN_0F3A60) },
6590 { VEX_LEN_TABLE (VEX_LEN_0F3A61) },
6591 { VEX_LEN_TABLE (VEX_LEN_0F3A62) },
6592 { VEX_LEN_TABLE (VEX_LEN_0F3A63) },
592d1631
L
6593 { Bad_Opcode },
6594 { Bad_Opcode },
6595 { Bad_Opcode },
6596 { Bad_Opcode },
c0f3af97 6597 /* 68 */
7531c613
JB
6598 { "vfmaddps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6599 { "vfmaddpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6600 { "vfmaddss", { XMScalar, VexScalar, EXxmm_md, XMVexScalarI4 }, PREFIX_DATA },
6601 { "vfmaddsd", { XMScalar, VexScalar, EXxmm_mq, XMVexScalarI4 }, PREFIX_DATA },
6602 { "vfmsubps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6603 { "vfmsubpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6604 { "vfmsubss", { XMScalar, VexScalar, EXxmm_md, XMVexScalarI4 }, PREFIX_DATA },
6605 { "vfmsubsd", { XMScalar, VexScalar, EXxmm_mq, XMVexScalarI4 }, PREFIX_DATA },
c0f3af97 6606 /* 70 */
592d1631
L
6607 { Bad_Opcode },
6608 { Bad_Opcode },
6609 { Bad_Opcode },
6610 { Bad_Opcode },
6611 { Bad_Opcode },
6612 { Bad_Opcode },
6613 { Bad_Opcode },
6614 { Bad_Opcode },
c0f3af97 6615 /* 78 */
7531c613
JB
6616 { "vfnmaddps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6617 { "vfnmaddpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6618 { "vfnmaddss", { XMScalar, VexScalar, EXxmm_md, XMVexScalarI4 }, PREFIX_DATA },
6619 { "vfnmaddsd", { XMScalar, VexScalar, EXxmm_mq, XMVexScalarI4 }, PREFIX_DATA },
6620 { "vfnmsubps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6621 { "vfnmsubpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6622 { "vfnmsubss", { XMScalar, VexScalar, EXxmm_md, XMVexScalarI4 }, PREFIX_DATA },
6623 { "vfnmsubsd", { XMScalar, VexScalar, EXxmm_mq, XMVexScalarI4 }, PREFIX_DATA },
c0f3af97 6624 /* 80 */
592d1631
L
6625 { Bad_Opcode },
6626 { Bad_Opcode },
6627 { Bad_Opcode },
6628 { Bad_Opcode },
6629 { Bad_Opcode },
6630 { Bad_Opcode },
6631 { Bad_Opcode },
6632 { Bad_Opcode },
c0f3af97 6633 /* 88 */
592d1631
L
6634 { Bad_Opcode },
6635 { Bad_Opcode },
6636 { Bad_Opcode },
6637 { Bad_Opcode },
6638 { Bad_Opcode },
6639 { Bad_Opcode },
6640 { Bad_Opcode },
6641 { Bad_Opcode },
c0f3af97 6642 /* 90 */
592d1631
L
6643 { Bad_Opcode },
6644 { Bad_Opcode },
6645 { Bad_Opcode },
6646 { Bad_Opcode },
6647 { Bad_Opcode },
6648 { Bad_Opcode },
6649 { Bad_Opcode },
6650 { Bad_Opcode },
c0f3af97 6651 /* 98 */
592d1631
L
6652 { Bad_Opcode },
6653 { Bad_Opcode },
6654 { Bad_Opcode },
6655 { Bad_Opcode },
6656 { Bad_Opcode },
6657 { Bad_Opcode },
6658 { Bad_Opcode },
6659 { Bad_Opcode },
c0f3af97 6660 /* a0 */
592d1631
L
6661 { Bad_Opcode },
6662 { Bad_Opcode },
6663 { Bad_Opcode },
6664 { Bad_Opcode },
6665 { Bad_Opcode },
6666 { Bad_Opcode },
6667 { Bad_Opcode },
6668 { Bad_Opcode },
c0f3af97 6669 /* a8 */
592d1631
L
6670 { Bad_Opcode },
6671 { Bad_Opcode },
6672 { Bad_Opcode },
6673 { Bad_Opcode },
6674 { Bad_Opcode },
6675 { Bad_Opcode },
6676 { Bad_Opcode },
6677 { Bad_Opcode },
c0f3af97 6678 /* b0 */
592d1631
L
6679 { Bad_Opcode },
6680 { Bad_Opcode },
6681 { Bad_Opcode },
6682 { Bad_Opcode },
6683 { Bad_Opcode },
6684 { Bad_Opcode },
6685 { Bad_Opcode },
6686 { Bad_Opcode },
c0f3af97 6687 /* b8 */
592d1631
L
6688 { Bad_Opcode },
6689 { Bad_Opcode },
6690 { Bad_Opcode },
6691 { Bad_Opcode },
6692 { Bad_Opcode },
6693 { Bad_Opcode },
6694 { Bad_Opcode },
6695 { Bad_Opcode },
c0f3af97 6696 /* c0 */
592d1631
L
6697 { Bad_Opcode },
6698 { Bad_Opcode },
6699 { Bad_Opcode },
6700 { Bad_Opcode },
6701 { Bad_Opcode },
6702 { Bad_Opcode },
6703 { Bad_Opcode },
6704 { Bad_Opcode },
c0f3af97 6705 /* c8 */
592d1631
L
6706 { Bad_Opcode },
6707 { Bad_Opcode },
6708 { Bad_Opcode },
6709 { Bad_Opcode },
6710 { Bad_Opcode },
6711 { Bad_Opcode },
7531c613
JB
6712 { VEX_W_TABLE (VEX_W_0F3ACE) },
6713 { VEX_W_TABLE (VEX_W_0F3ACF) },
c0f3af97 6714 /* d0 */
592d1631
L
6715 { Bad_Opcode },
6716 { Bad_Opcode },
6717 { Bad_Opcode },
6718 { Bad_Opcode },
6719 { Bad_Opcode },
6720 { Bad_Opcode },
6721 { Bad_Opcode },
6722 { Bad_Opcode },
c0f3af97 6723 /* d8 */
592d1631
L
6724 { Bad_Opcode },
6725 { Bad_Opcode },
6726 { Bad_Opcode },
6727 { Bad_Opcode },
6728 { Bad_Opcode },
6729 { Bad_Opcode },
6730 { Bad_Opcode },
7531c613 6731 { VEX_LEN_TABLE (VEX_LEN_0F3ADF) },
c0f3af97 6732 /* e0 */
592d1631
L
6733 { Bad_Opcode },
6734 { Bad_Opcode },
6735 { Bad_Opcode },
6736 { Bad_Opcode },
6737 { Bad_Opcode },
6738 { Bad_Opcode },
6739 { Bad_Opcode },
6740 { Bad_Opcode },
c0f3af97 6741 /* e8 */
592d1631
L
6742 { Bad_Opcode },
6743 { Bad_Opcode },
6744 { Bad_Opcode },
6745 { Bad_Opcode },
6746 { Bad_Opcode },
6747 { Bad_Opcode },
6748 { Bad_Opcode },
6749 { Bad_Opcode },
c0f3af97 6750 /* f0 */
6c30d220 6751 { PREFIX_TABLE (PREFIX_VEX_0F3AF0) },
592d1631
L
6752 { Bad_Opcode },
6753 { Bad_Opcode },
6754 { Bad_Opcode },
6755 { Bad_Opcode },
6756 { Bad_Opcode },
6757 { Bad_Opcode },
6758 { Bad_Opcode },
c0f3af97 6759 /* f8 */
592d1631
L
6760 { Bad_Opcode },
6761 { Bad_Opcode },
6762 { Bad_Opcode },
6763 { Bad_Opcode },
6764 { Bad_Opcode },
6765 { Bad_Opcode },
6766 { Bad_Opcode },
6767 { Bad_Opcode },
c0f3af97
L
6768 },
6769};
6770
43234a1e 6771#include "i386-dis-evex.h"
ad692897 6772
c0f3af97 6773static const struct dis386 vex_len_table[][2] = {
18897deb 6774 /* VEX_LEN_0F12_P_0_M_0 / VEX_LEN_0F12_P_2_M_0 */
c0f3af97 6775 {
89e65d17 6776 { "vmovlpX", { XM, Vex, EXq }, 0 },
c0f3af97
L
6777 },
6778
592a252b 6779 /* VEX_LEN_0F12_P_0_M_1 */
c0f3af97 6780 {
89e65d17 6781 { "vmovhlps", { XM, Vex, EXq }, 0 },
c0f3af97
L
6782 },
6783
592a252b 6784 /* VEX_LEN_0F13_M_0 */
c0f3af97 6785 {
bf926894 6786 { "vmovlpX", { EXq, XM }, PREFIX_OPCODE },
c0f3af97
L
6787 },
6788
18897deb 6789 /* VEX_LEN_0F16_P_0_M_0 / VEX_LEN_0F16_P_2_M_0 */
c0f3af97 6790 {
89e65d17 6791 { "vmovhpX", { XM, Vex, EXq }, 0 },
c0f3af97
L
6792 },
6793
592a252b 6794 /* VEX_LEN_0F16_P_0_M_1 */
c0f3af97 6795 {
89e65d17 6796 { "vmovlhps", { XM, Vex, EXq }, 0 },
c0f3af97
L
6797 },
6798
592a252b 6799 /* VEX_LEN_0F17_M_0 */
c0f3af97 6800 {
bf926894 6801 { "vmovhpX", { EXq, XM }, PREFIX_OPCODE },
c0f3af97
L
6802 },
6803
43234a1e
L
6804 /* VEX_LEN_0F41_P_0 */
6805 {
6806 { Bad_Opcode },
6807 { VEX_W_TABLE (VEX_W_0F41_P_0_LEN_1) },
6808 },
1ba585e8
IT
6809 /* VEX_LEN_0F41_P_2 */
6810 {
6811 { Bad_Opcode },
6812 { VEX_W_TABLE (VEX_W_0F41_P_2_LEN_1) },
6813 },
43234a1e
L
6814 /* VEX_LEN_0F42_P_0 */
6815 {
6816 { Bad_Opcode },
6817 { VEX_W_TABLE (VEX_W_0F42_P_0_LEN_1) },
6818 },
1ba585e8
IT
6819 /* VEX_LEN_0F42_P_2 */
6820 {
6821 { Bad_Opcode },
6822 { VEX_W_TABLE (VEX_W_0F42_P_2_LEN_1) },
6823 },
43234a1e
L
6824 /* VEX_LEN_0F44_P_0 */
6825 {
6826 { VEX_W_TABLE (VEX_W_0F44_P_0_LEN_0) },
6827 },
1ba585e8
IT
6828 /* VEX_LEN_0F44_P_2 */
6829 {
6830 { VEX_W_TABLE (VEX_W_0F44_P_2_LEN_0) },
6831 },
43234a1e
L
6832 /* VEX_LEN_0F45_P_0 */
6833 {
6834 { Bad_Opcode },
6835 { VEX_W_TABLE (VEX_W_0F45_P_0_LEN_1) },
6836 },
1ba585e8
IT
6837 /* VEX_LEN_0F45_P_2 */
6838 {
6839 { Bad_Opcode },
6840 { VEX_W_TABLE (VEX_W_0F45_P_2_LEN_1) },
6841 },
43234a1e
L
6842 /* VEX_LEN_0F46_P_0 */
6843 {
6844 { Bad_Opcode },
6845 { VEX_W_TABLE (VEX_W_0F46_P_0_LEN_1) },
6846 },
1ba585e8
IT
6847 /* VEX_LEN_0F46_P_2 */
6848 {
6849 { Bad_Opcode },
6850 { VEX_W_TABLE (VEX_W_0F46_P_2_LEN_1) },
6851 },
43234a1e
L
6852 /* VEX_LEN_0F47_P_0 */
6853 {
6854 { Bad_Opcode },
6855 { VEX_W_TABLE (VEX_W_0F47_P_0_LEN_1) },
6856 },
1ba585e8
IT
6857 /* VEX_LEN_0F47_P_2 */
6858 {
6859 { Bad_Opcode },
6860 { VEX_W_TABLE (VEX_W_0F47_P_2_LEN_1) },
6861 },
6862 /* VEX_LEN_0F4A_P_0 */
6863 {
6864 { Bad_Opcode },
6865 { VEX_W_TABLE (VEX_W_0F4A_P_0_LEN_1) },
6866 },
6867 /* VEX_LEN_0F4A_P_2 */
6868 {
6869 { Bad_Opcode },
6870 { VEX_W_TABLE (VEX_W_0F4A_P_2_LEN_1) },
6871 },
6872 /* VEX_LEN_0F4B_P_0 */
6873 {
6874 { Bad_Opcode },
6875 { VEX_W_TABLE (VEX_W_0F4B_P_0_LEN_1) },
6876 },
43234a1e
L
6877 /* VEX_LEN_0F4B_P_2 */
6878 {
6879 { Bad_Opcode },
6880 { VEX_W_TABLE (VEX_W_0F4B_P_2_LEN_1) },
6881 },
6882
7531c613 6883 /* VEX_LEN_0F6E */
c0f3af97 6884 {
7531c613 6885 { "vmovK", { XMScalar, Edq }, PREFIX_DATA },
c0f3af97
L
6886 },
6887
035e7389 6888 /* VEX_LEN_0F77 */
c0f3af97 6889 {
ec6f095a
L
6890 { "vzeroupper", { XX }, 0 },
6891 { "vzeroall", { XX }, 0 },
c0f3af97
L
6892 },
6893
ec6f095a 6894 /* VEX_LEN_0F7E_P_1 */
c0f3af97 6895 {
5b872f7d 6896 { "vmovq", { XMScalar, EXxmm_mq }, 0 },
c0f3af97
L
6897 },
6898
ec6f095a 6899 /* VEX_LEN_0F7E_P_2 */
c0f3af97 6900 {
ec6f095a 6901 { "vmovK", { Edq, XMScalar }, 0 },
c0f3af97
L
6902 },
6903
ec6f095a 6904 /* VEX_LEN_0F90_P_0 */
c0f3af97 6905 {
ec6f095a 6906 { VEX_W_TABLE (VEX_W_0F90_P_0_LEN_0) },
c0f3af97
L
6907 },
6908
ec6f095a 6909 /* VEX_LEN_0F90_P_2 */
c0f3af97 6910 {
ec6f095a 6911 { VEX_W_TABLE (VEX_W_0F90_P_2_LEN_0) },
c0f3af97
L
6912 },
6913
ec6f095a 6914 /* VEX_LEN_0F91_P_0 */
c0f3af97 6915 {
ec6f095a 6916 { VEX_W_TABLE (VEX_W_0F91_P_0_LEN_0) },
c0f3af97
L
6917 },
6918
ec6f095a 6919 /* VEX_LEN_0F91_P_2 */
c0f3af97 6920 {
ec6f095a 6921 { VEX_W_TABLE (VEX_W_0F91_P_2_LEN_0) },
c0f3af97
L
6922 },
6923
ec6f095a 6924 /* VEX_LEN_0F92_P_0 */
c0f3af97 6925 {
ec6f095a 6926 { VEX_W_TABLE (VEX_W_0F92_P_0_LEN_0) },
c0f3af97
L
6927 },
6928
ec6f095a 6929 /* VEX_LEN_0F92_P_2 */
c0f3af97 6930 {
ec6f095a 6931 { VEX_W_TABLE (VEX_W_0F92_P_2_LEN_0) },
c0f3af97
L
6932 },
6933
ec6f095a 6934 /* VEX_LEN_0F92_P_3 */
c0f3af97 6935 {
58a211d2 6936 { MOD_TABLE (MOD_VEX_0F92_P_3_LEN_0) },
c0f3af97
L
6937 },
6938
ec6f095a 6939 /* VEX_LEN_0F93_P_0 */
c0f3af97 6940 {
ec6f095a 6941 { VEX_W_TABLE (VEX_W_0F93_P_0_LEN_0) },
c0f3af97
L
6942 },
6943
ec6f095a 6944 /* VEX_LEN_0F93_P_2 */
c0f3af97 6945 {
ec6f095a 6946 { VEX_W_TABLE (VEX_W_0F93_P_2_LEN_0) },
c0f3af97
L
6947 },
6948
ec6f095a 6949 /* VEX_LEN_0F93_P_3 */
c0f3af97 6950 {
58a211d2 6951 { MOD_TABLE (MOD_VEX_0F93_P_3_LEN_0) },
c0f3af97
L
6952 },
6953
ec6f095a 6954 /* VEX_LEN_0F98_P_0 */
43234a1e
L
6955 {
6956 { VEX_W_TABLE (VEX_W_0F98_P_0_LEN_0) },
6957 },
6958
1ba585e8
IT
6959 /* VEX_LEN_0F98_P_2 */
6960 {
6961 { VEX_W_TABLE (VEX_W_0F98_P_2_LEN_0) },
6962 },
6963
6964 /* VEX_LEN_0F99_P_0 */
6965 {
6966 { VEX_W_TABLE (VEX_W_0F99_P_0_LEN_0) },
6967 },
6968
6969 /* VEX_LEN_0F99_P_2 */
6970 {
6971 { VEX_W_TABLE (VEX_W_0F99_P_2_LEN_0) },
6972 },
6973
6c30d220 6974 /* VEX_LEN_0FAE_R_2_M_0 */
c0f3af97 6975 {
ec6f095a 6976 { "vldmxcsr", { Md }, 0 },
c0f3af97
L
6977 },
6978
6c30d220 6979 /* VEX_LEN_0FAE_R_3_M_0 */
c0f3af97 6980 {
ec6f095a 6981 { "vstmxcsr", { Md }, 0 },
c0f3af97
L
6982 },
6983
7531c613 6984 /* VEX_LEN_0FC4 */
c0f3af97 6985 {
7531c613 6986 { "vpinsrw", { XM, Vex, Edqw, Ib }, PREFIX_DATA },
c0f3af97
L
6987 },
6988
7531c613 6989 /* VEX_LEN_0FC5 */
c0f3af97 6990 {
7531c613 6991 { "vpextrw", { Gdq, XS, Ib }, PREFIX_DATA },
c0f3af97
L
6992 },
6993
7531c613 6994 /* VEX_LEN_0FD6 */
c0f3af97 6995 {
7531c613 6996 { "vmovq", { EXqS, XMScalar }, PREFIX_DATA },
c0f3af97
L
6997 },
6998
7531c613 6999 /* VEX_LEN_0FF7 */
c0f3af97 7000 {
7531c613 7001 { "vmaskmovdqu", { XM, XS }, PREFIX_DATA },
c0f3af97
L
7002 },
7003
7531c613 7004 /* VEX_LEN_0F3816 */
c0f3af97 7005 {
6c30d220 7006 { Bad_Opcode },
7531c613 7007 { VEX_W_TABLE (VEX_W_0F3816_L_1) },
c0f3af97
L
7008 },
7009
7531c613 7010 /* VEX_LEN_0F3819 */
c0f3af97 7011 {
6c30d220 7012 { Bad_Opcode },
7531c613 7013 { VEX_W_TABLE (VEX_W_0F3819_L_1) },
c0f3af97
L
7014 },
7015
7531c613 7016 /* VEX_LEN_0F381A_M_0 */
c0f3af97 7017 {
6c30d220 7018 { Bad_Opcode },
7531c613 7019 { VEX_W_TABLE (VEX_W_0F381A_M_0_L_1) },
c0f3af97
L
7020 },
7021
7531c613 7022 /* VEX_LEN_0F3836 */
c0f3af97 7023 {
6c30d220 7024 { Bad_Opcode },
7531c613 7025 { VEX_W_TABLE (VEX_W_0F3836) },
c0f3af97
L
7026 },
7027
7531c613 7028 /* VEX_LEN_0F3841 */
c0f3af97 7029 {
7531c613 7030 { "vphminposuw", { XM, EXx }, PREFIX_DATA },
c0f3af97
L
7031 },
7032
260cd341
LC
7033 /* VEX_LEN_0F3849_X86_64_P_0_W_0_M_0 */
7034 {
7035 { "ldtilecfg", { M }, 0 },
7036 },
7037
7038 /* VEX_LEN_0F3849_X86_64_P_0_W_0_M_1_REG_0_RM_0 */
7039 {
7040 { "tilerelease", { Skip_MODRM }, 0 },
7041 },
7042
7043 /* VEX_LEN_0F3849_X86_64_P_2_W_0_M_0 */
7044 {
7045 { "sttilecfg", { M }, 0 },
7046 },
7047
7048 /* VEX_LEN_0F3849_X86_64_P_3_W_0_M_0 */
7049 {
7050 { "tilezero", { TMM, Skip_MODRM }, 0 },
7051 },
7052
7053 /* VEX_LEN_0F384B_X86_64_P_1_W_0_M_0 */
7054 {
7055 { "tilestored", { MVexSIBMEM, TMM }, 0 },
7056 },
7057 /* VEX_LEN_0F384B_X86_64_P_2_W_0_M_0 */
7058 {
7059 { "tileloaddt1", { TMM, MVexSIBMEM }, 0 },
7060 },
7061
7062 /* VEX_LEN_0F384B_X86_64_P_3_W_0_M_0 */
7063 {
7064 { "tileloadd", { TMM, MVexSIBMEM }, 0 },
7065 },
7066
7531c613 7067 /* VEX_LEN_0F385A_M_0 */
6c30d220
L
7068 {
7069 { Bad_Opcode },
7531c613 7070 { VEX_W_TABLE (VEX_W_0F385A_M_0_L_0) },
6c30d220
L
7071 },
7072
260cd341
LC
7073 /* VEX_LEN_0F385C_X86_64_P_1_W_0_M_0 */
7074 {
7075 { "tdpbf16ps", { TMM, EXtmm, VexTmm }, 0 },
7076 },
7077
7078 /* VEX_LEN_0F385E_X86_64_P_0_W_0_M_0 */
7079 {
7080 { "tdpbuud", {TMM, EXtmm, VexTmm }, 0 },
7081 },
7082
7083 /* VEX_LEN_0F385E_X86_64_P_1_W_0_M_0 */
7084 {
7085 { "tdpbsud", {TMM, EXtmm, VexTmm }, 0 },
7086 },
7087
7088 /* VEX_LEN_0F385E_X86_64_P_2_W_0_M_0 */
7089 {
7090 { "tdpbusd", {TMM, EXtmm, VexTmm }, 0 },
7091 },
7092
7093 /* VEX_LEN_0F385E_X86_64_P_3_W_0_M_0 */
7094 {
7095 { "tdpbssd", {TMM, EXtmm, VexTmm }, 0 },
7096 },
7097
7531c613 7098 /* VEX_LEN_0F38DB */
a5ff0eb2 7099 {
7531c613 7100 { "vaesimc", { XM, EXx }, PREFIX_DATA },
a5ff0eb2
L
7101 },
7102
035e7389 7103 /* VEX_LEN_0F38F2 */
f12dc422 7104 {
035e7389 7105 { "andnS", { Gdq, VexGdq, Edq }, PREFIX_OPCODE },
f12dc422
L
7106 },
7107
035e7389 7108 /* VEX_LEN_0F38F3_R_1 */
f12dc422 7109 {
035e7389 7110 { "blsrS", { VexGdq, Edq }, PREFIX_OPCODE },
f12dc422
L
7111 },
7112
035e7389 7113 /* VEX_LEN_0F38F3_R_2 */
f12dc422 7114 {
035e7389 7115 { "blsmskS", { VexGdq, Edq }, PREFIX_OPCODE },
f12dc422
L
7116 },
7117
035e7389 7118 /* VEX_LEN_0F38F3_R_3 */
f12dc422 7119 {
035e7389 7120 { "blsiS", { VexGdq, Edq }, PREFIX_OPCODE },
f12dc422
L
7121 },
7122
6c30d220
L
7123 /* VEX_LEN_0F38F5_P_0 */
7124 {
bf890a93 7125 { "bzhiS", { Gdq, Edq, VexGdq }, 0 },
6c30d220
L
7126 },
7127
7128 /* VEX_LEN_0F38F5_P_1 */
7129 {
bf890a93 7130 { "pextS", { Gdq, VexGdq, Edq }, 0 },
6c30d220
L
7131 },
7132
7133 /* VEX_LEN_0F38F5_P_3 */
7134 {
bf890a93 7135 { "pdepS", { Gdq, VexGdq, Edq }, 0 },
6c30d220
L
7136 },
7137
7138 /* VEX_LEN_0F38F6_P_3 */
7139 {
bf890a93 7140 { "mulxS", { Gdq, VexGdq, Edq }, 0 },
6c30d220
L
7141 },
7142
f12dc422
L
7143 /* VEX_LEN_0F38F7_P_0 */
7144 {
bf890a93 7145 { "bextrS", { Gdq, Edq, VexGdq }, 0 },
f12dc422
L
7146 },
7147
6c30d220
L
7148 /* VEX_LEN_0F38F7_P_1 */
7149 {
bf890a93 7150 { "sarxS", { Gdq, Edq, VexGdq }, 0 },
6c30d220
L
7151 },
7152
7153 /* VEX_LEN_0F38F7_P_2 */
7154 {
bf890a93 7155 { "shlxS", { Gdq, Edq, VexGdq }, 0 },
6c30d220
L
7156 },
7157
7158 /* VEX_LEN_0F38F7_P_3 */
7159 {
bf890a93 7160 { "shrxS", { Gdq, Edq, VexGdq }, 0 },
6c30d220
L
7161 },
7162
7531c613 7163 /* VEX_LEN_0F3A00 */
6c30d220
L
7164 {
7165 { Bad_Opcode },
7531c613 7166 { VEX_W_TABLE (VEX_W_0F3A00_L_1) },
6c30d220
L
7167 },
7168
7531c613 7169 /* VEX_LEN_0F3A01 */
6c30d220
L
7170 {
7171 { Bad_Opcode },
7531c613 7172 { VEX_W_TABLE (VEX_W_0F3A01_L_1) },
6c30d220
L
7173 },
7174
7531c613 7175 /* VEX_LEN_0F3A06 */
c0f3af97 7176 {
592d1631 7177 { Bad_Opcode },
7531c613 7178 { VEX_W_TABLE (VEX_W_0F3A06_L_1) },
c0f3af97
L
7179 },
7180
7531c613 7181 /* VEX_LEN_0F3A14 */
c0f3af97 7182 {
7531c613 7183 { "vpextrb", { Edqb, XM, Ib }, PREFIX_DATA },
c0f3af97
L
7184 },
7185
7531c613 7186 /* VEX_LEN_0F3A15 */
c0f3af97 7187 {
7531c613 7188 { "vpextrw", { Edqw, XM, Ib }, PREFIX_DATA },
c0f3af97
L
7189 },
7190
7531c613 7191 /* VEX_LEN_0F3A16 */
c0f3af97 7192 {
7531c613 7193 { "vpextrK", { Edq, XM, Ib }, PREFIX_DATA },
c0f3af97
L
7194 },
7195
7531c613 7196 /* VEX_LEN_0F3A17 */
c0f3af97 7197 {
7531c613 7198 { "vextractps", { Edqd, XM, Ib }, PREFIX_DATA },
c0f3af97
L
7199 },
7200
7531c613 7201 /* VEX_LEN_0F3A18 */
c0f3af97 7202 {
592d1631 7203 { Bad_Opcode },
7531c613 7204 { VEX_W_TABLE (VEX_W_0F3A18_L_1) },
c0f3af97
L
7205 },
7206
7531c613 7207 /* VEX_LEN_0F3A19 */
c0f3af97 7208 {
592d1631 7209 { Bad_Opcode },
7531c613 7210 { VEX_W_TABLE (VEX_W_0F3A19_L_1) },
c0f3af97
L
7211 },
7212
7531c613 7213 /* VEX_LEN_0F3A20 */
c0f3af97 7214 {
7531c613 7215 { "vpinsrb", { XM, Vex, Edqb, Ib }, PREFIX_DATA },
c0f3af97
L
7216 },
7217
7531c613 7218 /* VEX_LEN_0F3A21 */
c0f3af97 7219 {
7531c613 7220 { "vinsertps", { XM, Vex, EXd, Ib }, PREFIX_DATA },
c0f3af97
L
7221 },
7222
7531c613 7223 /* VEX_LEN_0F3A22 */
c0f3af97 7224 {
7531c613 7225 { "vpinsrK", { XM, Vex, Edq, Ib }, PREFIX_DATA },
c0f3af97
L
7226 },
7227
7531c613 7228 /* VEX_LEN_0F3A30 */
43234a1e 7229 {
bb5b3501 7230 { MOD_TABLE (MOD_VEX_0F3A30_L_0) },
43234a1e
L
7231 },
7232
7531c613 7233 /* VEX_LEN_0F3A31 */
1ba585e8 7234 {
bb5b3501 7235 { MOD_TABLE (MOD_VEX_0F3A31_L_0) },
1ba585e8
IT
7236 },
7237
7531c613 7238 /* VEX_LEN_0F3A32 */
43234a1e 7239 {
bb5b3501 7240 { MOD_TABLE (MOD_VEX_0F3A32_L_0) },
43234a1e
L
7241 },
7242
7531c613 7243 /* VEX_LEN_0F3A33 */
1ba585e8 7244 {
bb5b3501 7245 { MOD_TABLE (MOD_VEX_0F3A33_L_0) },
1ba585e8
IT
7246 },
7247
7531c613 7248 /* VEX_LEN_0F3A38 */
c0f3af97 7249 {
6c30d220 7250 { Bad_Opcode },
7531c613 7251 { VEX_W_TABLE (VEX_W_0F3A38_L_1) },
c0f3af97
L
7252 },
7253
7531c613 7254 /* VEX_LEN_0F3A39 */
c0f3af97 7255 {
6c30d220 7256 { Bad_Opcode },
7531c613 7257 { VEX_W_TABLE (VEX_W_0F3A39_L_1) },
6c30d220
L
7258 },
7259
7531c613 7260 /* VEX_LEN_0F3A41 */
6c30d220 7261 {
7531c613 7262 { "vdppd", { XM, Vex, EXx, Ib }, PREFIX_DATA },
c0f3af97
L
7263 },
7264
7531c613 7265 /* VEX_LEN_0F3A46 */
c0f3af97 7266 {
6c30d220 7267 { Bad_Opcode },
7531c613 7268 { VEX_W_TABLE (VEX_W_0F3A46_L_1) },
c0f3af97
L
7269 },
7270
7531c613 7271 /* VEX_LEN_0F3A60 */
c0f3af97 7272 {
7531c613 7273 { "vpcmpestrm!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
c0f3af97
L
7274 },
7275
7531c613 7276 /* VEX_LEN_0F3A61 */
c0f3af97 7277 {
7531c613 7278 { "vpcmpestri!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
c0f3af97
L
7279 },
7280
7531c613 7281 /* VEX_LEN_0F3A62 */
c0f3af97 7282 {
7531c613 7283 { "vpcmpistrm", { XM, EXx, Ib }, PREFIX_DATA },
c0f3af97
L
7284 },
7285
7531c613 7286 /* VEX_LEN_0F3A63 */
c0f3af97 7287 {
7531c613 7288 { "vpcmpistri", { XM, EXx, Ib }, PREFIX_DATA },
c0f3af97
L
7289 },
7290
7531c613 7291 /* VEX_LEN_0F3ADF */
a5ff0eb2 7292 {
7531c613 7293 { "vaeskeygenassist", { XM, EXx, Ib }, PREFIX_DATA },
a5ff0eb2 7294 },
4c807e72 7295
6c30d220
L
7296 /* VEX_LEN_0F3AF0_P_3 */
7297 {
bf890a93 7298 { "rorxS", { Gdq, Edq, Ib }, 0 },
6c30d220
L
7299 },
7300
467bbef0
JB
7301 /* VEX_LEN_0FXOP_08_85 */
7302 {
7303 { VEX_W_TABLE (VEX_W_0FXOP_08_85_L_0) },
7304 },
7305
7306 /* VEX_LEN_0FXOP_08_86 */
7307 {
7308 { VEX_W_TABLE (VEX_W_0FXOP_08_86_L_0) },
7309 },
7310
7311 /* VEX_LEN_0FXOP_08_87 */
7312 {
7313 { VEX_W_TABLE (VEX_W_0FXOP_08_87_L_0) },
7314 },
7315
7316 /* VEX_LEN_0FXOP_08_8E */
7317 {
7318 { VEX_W_TABLE (VEX_W_0FXOP_08_8E_L_0) },
7319 },
7320
7321 /* VEX_LEN_0FXOP_08_8F */
7322 {
7323 { VEX_W_TABLE (VEX_W_0FXOP_08_8F_L_0) },
7324 },
7325
7326 /* VEX_LEN_0FXOP_08_95 */
7327 {
7328 { VEX_W_TABLE (VEX_W_0FXOP_08_95_L_0) },
7329 },
7330
7331 /* VEX_LEN_0FXOP_08_96 */
7332 {
7333 { VEX_W_TABLE (VEX_W_0FXOP_08_96_L_0) },
7334 },
7335
7336 /* VEX_LEN_0FXOP_08_97 */
7337 {
7338 { VEX_W_TABLE (VEX_W_0FXOP_08_97_L_0) },
7339 },
7340
7341 /* VEX_LEN_0FXOP_08_9E */
7342 {
7343 { VEX_W_TABLE (VEX_W_0FXOP_08_9E_L_0) },
7344 },
7345
7346 /* VEX_LEN_0FXOP_08_9F */
7347 {
7348 { VEX_W_TABLE (VEX_W_0FXOP_08_9F_L_0) },
7349 },
7350
7351 /* VEX_LEN_0FXOP_08_A3 */
7352 {
7353 { "vpperm", { XM, Vex, EXx, XMVexI4 }, 0 },
7354 },
7355
7356 /* VEX_LEN_0FXOP_08_A6 */
7357 {
7358 { VEX_W_TABLE (VEX_W_0FXOP_08_A6_L_0) },
7359 },
7360
7361 /* VEX_LEN_0FXOP_08_B6 */
7362 {
7363 { VEX_W_TABLE (VEX_W_0FXOP_08_B6_L_0) },
7364 },
7365
7366 /* VEX_LEN_0FXOP_08_C0 */
7367 {
7368 { VEX_W_TABLE (VEX_W_0FXOP_08_C0_L_0) },
7369 },
7370
7371 /* VEX_LEN_0FXOP_08_C1 */
7372 {
7373 { VEX_W_TABLE (VEX_W_0FXOP_08_C1_L_0) },
7374 },
7375
7376 /* VEX_LEN_0FXOP_08_C2 */
7377 {
7378 { VEX_W_TABLE (VEX_W_0FXOP_08_C2_L_0) },
7379 },
7380
7381 /* VEX_LEN_0FXOP_08_C3 */
7382 {
7383 { VEX_W_TABLE (VEX_W_0FXOP_08_C3_L_0) },
7384 },
7385
ff688e1f
L
7386 /* VEX_LEN_0FXOP_08_CC */
7387 {
467bbef0 7388 { VEX_W_TABLE (VEX_W_0FXOP_08_CC_L_0) },
ff688e1f
L
7389 },
7390
7391 /* VEX_LEN_0FXOP_08_CD */
7392 {
467bbef0 7393 { VEX_W_TABLE (VEX_W_0FXOP_08_CD_L_0) },
ff688e1f
L
7394 },
7395
7396 /* VEX_LEN_0FXOP_08_CE */
7397 {
467bbef0 7398 { VEX_W_TABLE (VEX_W_0FXOP_08_CE_L_0) },
ff688e1f
L
7399 },
7400
7401 /* VEX_LEN_0FXOP_08_CF */
7402 {
467bbef0 7403 { VEX_W_TABLE (VEX_W_0FXOP_08_CF_L_0) },
ff688e1f
L
7404 },
7405
7406 /* VEX_LEN_0FXOP_08_EC */
7407 {
467bbef0 7408 { VEX_W_TABLE (VEX_W_0FXOP_08_EC_L_0) },
ff688e1f
L
7409 },
7410
7411 /* VEX_LEN_0FXOP_08_ED */
7412 {
467bbef0 7413 { VEX_W_TABLE (VEX_W_0FXOP_08_ED_L_0) },
ff688e1f
L
7414 },
7415
7416 /* VEX_LEN_0FXOP_08_EE */
7417 {
467bbef0 7418 { VEX_W_TABLE (VEX_W_0FXOP_08_EE_L_0) },
ff688e1f
L
7419 },
7420
7421 /* VEX_LEN_0FXOP_08_EF */
7422 {
467bbef0
JB
7423 { VEX_W_TABLE (VEX_W_0FXOP_08_EF_L_0) },
7424 },
7425
7426 /* VEX_LEN_0FXOP_09_01 */
7427 {
7428 { REG_TABLE (REG_0FXOP_09_01_L_0) },
7429 },
7430
7431 /* VEX_LEN_0FXOP_09_02 */
7432 {
7433 { REG_TABLE (REG_0FXOP_09_02_L_0) },
7434 },
7435
7436 /* VEX_LEN_0FXOP_09_12_M_1 */
7437 {
7438 { REG_TABLE (REG_0FXOP_09_12_M_1_L_0) },
ff688e1f
L
7439 },
7440
b5b098c2 7441 /* VEX_LEN_0FXOP_09_82_W_0 */
5dd85c99 7442 {
b5b098c2 7443 { "vfrczss", { XM, EXd }, 0 },
5dd85c99 7444 },
4c807e72 7445
b5b098c2 7446 /* VEX_LEN_0FXOP_09_83_W_0 */
5dd85c99 7447 {
b5b098c2 7448 { "vfrczsd", { XM, EXq }, 0 },
5dd85c99 7449 },
467bbef0
JB
7450
7451 /* VEX_LEN_0FXOP_09_90 */
7452 {
7453 { "vprotb", { XM, EXx, VexW }, 0 },
7454 },
7455
7456 /* VEX_LEN_0FXOP_09_91 */
7457 {
7458 { "vprotw", { XM, EXx, VexW }, 0 },
7459 },
7460
7461 /* VEX_LEN_0FXOP_09_92 */
7462 {
7463 { "vprotd", { XM, EXx, VexW }, 0 },
7464 },
7465
7466 /* VEX_LEN_0FXOP_09_93 */
7467 {
7468 { "vprotq", { XM, EXx, VexW }, 0 },
7469 },
7470
7471 /* VEX_LEN_0FXOP_09_94 */
7472 {
7473 { "vpshlb", { XM, EXx, VexW }, 0 },
7474 },
7475
7476 /* VEX_LEN_0FXOP_09_95 */
7477 {
7478 { "vpshlw", { XM, EXx, VexW }, 0 },
7479 },
7480
7481 /* VEX_LEN_0FXOP_09_96 */
7482 {
7483 { "vpshld", { XM, EXx, VexW }, 0 },
7484 },
7485
7486 /* VEX_LEN_0FXOP_09_97 */
7487 {
7488 { "vpshlq", { XM, EXx, VexW }, 0 },
7489 },
7490
7491 /* VEX_LEN_0FXOP_09_98 */
7492 {
7493 { "vpshab", { XM, EXx, VexW }, 0 },
7494 },
7495
7496 /* VEX_LEN_0FXOP_09_99 */
7497 {
7498 { "vpshaw", { XM, EXx, VexW }, 0 },
7499 },
7500
7501 /* VEX_LEN_0FXOP_09_9A */
7502 {
7503 { "vpshad", { XM, EXx, VexW }, 0 },
7504 },
7505
7506 /* VEX_LEN_0FXOP_09_9B */
7507 {
7508 { "vpshaq", { XM, EXx, VexW }, 0 },
7509 },
7510
7511 /* VEX_LEN_0FXOP_09_C1 */
7512 {
7513 { VEX_W_TABLE (VEX_W_0FXOP_09_C1_L_0) },
7514 },
7515
7516 /* VEX_LEN_0FXOP_09_C2 */
7517 {
7518 { VEX_W_TABLE (VEX_W_0FXOP_09_C2_L_0) },
7519 },
7520
7521 /* VEX_LEN_0FXOP_09_C3 */
7522 {
7523 { VEX_W_TABLE (VEX_W_0FXOP_09_C3_L_0) },
7524 },
7525
7526 /* VEX_LEN_0FXOP_09_C6 */
7527 {
7528 { VEX_W_TABLE (VEX_W_0FXOP_09_C6_L_0) },
7529 },
7530
7531 /* VEX_LEN_0FXOP_09_C7 */
7532 {
7533 { VEX_W_TABLE (VEX_W_0FXOP_09_C7_L_0) },
7534 },
7535
7536 /* VEX_LEN_0FXOP_09_CB */
7537 {
7538 { VEX_W_TABLE (VEX_W_0FXOP_09_CB_L_0) },
7539 },
7540
7541 /* VEX_LEN_0FXOP_09_D1 */
7542 {
7543 { VEX_W_TABLE (VEX_W_0FXOP_09_D1_L_0) },
7544 },
7545
7546 /* VEX_LEN_0FXOP_09_D2 */
7547 {
7548 { VEX_W_TABLE (VEX_W_0FXOP_09_D2_L_0) },
7549 },
7550
7551 /* VEX_LEN_0FXOP_09_D3 */
7552 {
7553 { VEX_W_TABLE (VEX_W_0FXOP_09_D3_L_0) },
7554 },
7555
7556 /* VEX_LEN_0FXOP_09_D6 */
7557 {
7558 { VEX_W_TABLE (VEX_W_0FXOP_09_D6_L_0) },
7559 },
7560
7561 /* VEX_LEN_0FXOP_09_D7 */
7562 {
7563 { VEX_W_TABLE (VEX_W_0FXOP_09_D7_L_0) },
7564 },
7565
7566 /* VEX_LEN_0FXOP_09_DB */
7567 {
7568 { VEX_W_TABLE (VEX_W_0FXOP_09_DB_L_0) },
7569 },
7570
7571 /* VEX_LEN_0FXOP_09_E1 */
7572 {
7573 { VEX_W_TABLE (VEX_W_0FXOP_09_E1_L_0) },
7574 },
7575
7576 /* VEX_LEN_0FXOP_09_E2 */
7577 {
7578 { VEX_W_TABLE (VEX_W_0FXOP_09_E2_L_0) },
7579 },
7580
7581 /* VEX_LEN_0FXOP_09_E3 */
7582 {
7583 { VEX_W_TABLE (VEX_W_0FXOP_09_E3_L_0) },
7584 },
7585
7586 /* VEX_LEN_0FXOP_0A_12 */
7587 {
7588 { REG_TABLE (REG_0FXOP_0A_12_L_0) },
7589 },
331d2d0d
L
7590};
7591
ad692897 7592#include "i386-dis-evex-len.h"
04e2a182 7593
9e30b8e0 7594static const struct dis386 vex_w_table[][2] = {
43234a1e
L
7595 {
7596 /* VEX_W_0F41_P_0_LEN_1 */
ab4e4ed5
AF
7597 { MOD_TABLE (MOD_VEX_W_0_0F41_P_0_LEN_1) },
7598 { MOD_TABLE (MOD_VEX_W_1_0F41_P_0_LEN_1) },
1ba585e8
IT
7599 },
7600 {
7601 /* VEX_W_0F41_P_2_LEN_1 */
ab4e4ed5
AF
7602 { MOD_TABLE (MOD_VEX_W_0_0F41_P_2_LEN_1) },
7603 { MOD_TABLE (MOD_VEX_W_1_0F41_P_2_LEN_1) }
43234a1e
L
7604 },
7605 {
7606 /* VEX_W_0F42_P_0_LEN_1 */
ab4e4ed5
AF
7607 { MOD_TABLE (MOD_VEX_W_0_0F42_P_0_LEN_1) },
7608 { MOD_TABLE (MOD_VEX_W_1_0F42_P_0_LEN_1) },
1ba585e8
IT
7609 },
7610 {
7611 /* VEX_W_0F42_P_2_LEN_1 */
ab4e4ed5
AF
7612 { MOD_TABLE (MOD_VEX_W_0_0F42_P_2_LEN_1) },
7613 { MOD_TABLE (MOD_VEX_W_1_0F42_P_2_LEN_1) },
43234a1e
L
7614 },
7615 {
7616 /* VEX_W_0F44_P_0_LEN_0 */
ab4e4ed5
AF
7617 { MOD_TABLE (MOD_VEX_W_0_0F44_P_0_LEN_1) },
7618 { MOD_TABLE (MOD_VEX_W_1_0F44_P_0_LEN_1) },
1ba585e8
IT
7619 },
7620 {
7621 /* VEX_W_0F44_P_2_LEN_0 */
ab4e4ed5
AF
7622 { MOD_TABLE (MOD_VEX_W_0_0F44_P_2_LEN_1) },
7623 { MOD_TABLE (MOD_VEX_W_1_0F44_P_2_LEN_1) },
43234a1e
L
7624 },
7625 {
ec6f095a
L
7626 /* VEX_W_0F45_P_0_LEN_1 */
7627 { MOD_TABLE (MOD_VEX_W_0_0F45_P_0_LEN_1) },
7628 { MOD_TABLE (MOD_VEX_W_1_0F45_P_0_LEN_1) },
9e30b8e0
L
7629 },
7630 {
ec6f095a
L
7631 /* VEX_W_0F45_P_2_LEN_1 */
7632 { MOD_TABLE (MOD_VEX_W_0_0F45_P_2_LEN_1) },
7633 { MOD_TABLE (MOD_VEX_W_1_0F45_P_2_LEN_1) },
9e30b8e0
L
7634 },
7635 {
ec6f095a
L
7636 /* VEX_W_0F46_P_0_LEN_1 */
7637 { MOD_TABLE (MOD_VEX_W_0_0F46_P_0_LEN_1) },
7638 { MOD_TABLE (MOD_VEX_W_1_0F46_P_0_LEN_1) },
9e30b8e0
L
7639 },
7640 {
ec6f095a
L
7641 /* VEX_W_0F46_P_2_LEN_1 */
7642 { MOD_TABLE (MOD_VEX_W_0_0F46_P_2_LEN_1) },
7643 { MOD_TABLE (MOD_VEX_W_1_0F46_P_2_LEN_1) },
9e30b8e0
L
7644 },
7645 {
ec6f095a
L
7646 /* VEX_W_0F47_P_0_LEN_1 */
7647 { MOD_TABLE (MOD_VEX_W_0_0F47_P_0_LEN_1) },
7648 { MOD_TABLE (MOD_VEX_W_1_0F47_P_0_LEN_1) },
9e30b8e0
L
7649 },
7650 {
ec6f095a
L
7651 /* VEX_W_0F47_P_2_LEN_1 */
7652 { MOD_TABLE (MOD_VEX_W_0_0F47_P_2_LEN_1) },
7653 { MOD_TABLE (MOD_VEX_W_1_0F47_P_2_LEN_1) },
9e30b8e0
L
7654 },
7655 {
ec6f095a
L
7656 /* VEX_W_0F4A_P_0_LEN_1 */
7657 { MOD_TABLE (MOD_VEX_W_0_0F4A_P_0_LEN_1) },
7658 { MOD_TABLE (MOD_VEX_W_1_0F4A_P_0_LEN_1) },
9e30b8e0
L
7659 },
7660 {
ec6f095a
L
7661 /* VEX_W_0F4A_P_2_LEN_1 */
7662 { MOD_TABLE (MOD_VEX_W_0_0F4A_P_2_LEN_1) },
7663 { MOD_TABLE (MOD_VEX_W_1_0F4A_P_2_LEN_1) },
9e30b8e0
L
7664 },
7665 {
ec6f095a
L
7666 /* VEX_W_0F4B_P_0_LEN_1 */
7667 { MOD_TABLE (MOD_VEX_W_0_0F4B_P_0_LEN_1) },
7668 { MOD_TABLE (MOD_VEX_W_1_0F4B_P_0_LEN_1) },
9e30b8e0
L
7669 },
7670 {
ec6f095a
L
7671 /* VEX_W_0F4B_P_2_LEN_1 */
7672 { MOD_TABLE (MOD_VEX_W_0_0F4B_P_2_LEN_1) },
9e30b8e0
L
7673 },
7674 {
ec6f095a
L
7675 /* VEX_W_0F90_P_0_LEN_0 */
7676 { "kmovw", { MaskG, MaskE }, 0 },
7677 { "kmovq", { MaskG, MaskE }, 0 },
9e30b8e0
L
7678 },
7679 {
ec6f095a
L
7680 /* VEX_W_0F90_P_2_LEN_0 */
7681 { "kmovb", { MaskG, MaskBDE }, 0 },
7682 { "kmovd", { MaskG, MaskBDE }, 0 },
9e30b8e0
L
7683 },
7684 {
ec6f095a
L
7685 /* VEX_W_0F91_P_0_LEN_0 */
7686 { MOD_TABLE (MOD_VEX_W_0_0F91_P_0_LEN_0) },
7687 { MOD_TABLE (MOD_VEX_W_1_0F91_P_0_LEN_0) },
9e30b8e0
L
7688 },
7689 {
ec6f095a
L
7690 /* VEX_W_0F91_P_2_LEN_0 */
7691 { MOD_TABLE (MOD_VEX_W_0_0F91_P_2_LEN_0) },
7692 { MOD_TABLE (MOD_VEX_W_1_0F91_P_2_LEN_0) },
9e30b8e0
L
7693 },
7694 {
ec6f095a
L
7695 /* VEX_W_0F92_P_0_LEN_0 */
7696 { MOD_TABLE (MOD_VEX_W_0_0F92_P_0_LEN_0) },
9e30b8e0
L
7697 },
7698 {
ec6f095a
L
7699 /* VEX_W_0F92_P_2_LEN_0 */
7700 { MOD_TABLE (MOD_VEX_W_0_0F92_P_2_LEN_0) },
9e30b8e0 7701 },
9e30b8e0 7702 {
ec6f095a
L
7703 /* VEX_W_0F93_P_0_LEN_0 */
7704 { MOD_TABLE (MOD_VEX_W_0_0F93_P_0_LEN_0) },
9e30b8e0
L
7705 },
7706 {
ec6f095a
L
7707 /* VEX_W_0F93_P_2_LEN_0 */
7708 { MOD_TABLE (MOD_VEX_W_0_0F93_P_2_LEN_0) },
9e30b8e0 7709 },
9e30b8e0 7710 {
ec6f095a
L
7711 /* VEX_W_0F98_P_0_LEN_0 */
7712 { MOD_TABLE (MOD_VEX_W_0_0F98_P_0_LEN_0) },
7713 { MOD_TABLE (MOD_VEX_W_1_0F98_P_0_LEN_0) },
9e30b8e0
L
7714 },
7715 {
ec6f095a
L
7716 /* VEX_W_0F98_P_2_LEN_0 */
7717 { MOD_TABLE (MOD_VEX_W_0_0F98_P_2_LEN_0) },
7718 { MOD_TABLE (MOD_VEX_W_1_0F98_P_2_LEN_0) },
9e30b8e0
L
7719 },
7720 {
ec6f095a
L
7721 /* VEX_W_0F99_P_0_LEN_0 */
7722 { MOD_TABLE (MOD_VEX_W_0_0F99_P_0_LEN_0) },
7723 { MOD_TABLE (MOD_VEX_W_1_0F99_P_0_LEN_0) },
9e30b8e0
L
7724 },
7725 {
ec6f095a
L
7726 /* VEX_W_0F99_P_2_LEN_0 */
7727 { MOD_TABLE (MOD_VEX_W_0_0F99_P_2_LEN_0) },
7728 { MOD_TABLE (MOD_VEX_W_1_0F99_P_2_LEN_0) },
9e30b8e0 7729 },
9e30b8e0 7730 {
7531c613
JB
7731 /* VEX_W_0F380C */
7732 { "vpermilps", { XM, Vex, EXx }, PREFIX_DATA },
9e30b8e0
L
7733 },
7734 {
7531c613
JB
7735 /* VEX_W_0F380D */
7736 { "vpermilpd", { XM, Vex, EXx }, PREFIX_DATA },
9e30b8e0
L
7737 },
7738 {
7531c613
JB
7739 /* VEX_W_0F380E */
7740 { "vtestps", { XM, EXx }, PREFIX_DATA },
9e30b8e0
L
7741 },
7742 {
7531c613
JB
7743 /* VEX_W_0F380F */
7744 { "vtestpd", { XM, EXx }, PREFIX_DATA },
9e30b8e0 7745 },
6431c801 7746 {
7531c613
JB
7747 /* VEX_W_0F3813 */
7748 { "vcvtph2ps", { XM, EXxmmq }, PREFIX_DATA },
6431c801 7749 },
6c30d220 7750 {
7531c613
JB
7751 /* VEX_W_0F3816_L_1 */
7752 { "vpermps", { XM, Vex, EXx }, PREFIX_DATA },
6c30d220 7753 },
bcf2684f 7754 {
7531c613
JB
7755 /* VEX_W_0F3818 */
7756 { "vbroadcastss", { XM, EXxmm_md }, PREFIX_DATA },
bcf2684f 7757 },
9e30b8e0 7758 {
7531c613
JB
7759 /* VEX_W_0F3819_L_1 */
7760 { "vbroadcastsd", { XM, EXxmm_mq }, PREFIX_DATA },
9e30b8e0
L
7761 },
7762 {
7531c613
JB
7763 /* VEX_W_0F381A_M_0_L_1 */
7764 { "vbroadcastf128", { XM, Mxmm }, PREFIX_DATA },
9e30b8e0 7765 },
53aa04a0 7766 {
7531c613
JB
7767 /* VEX_W_0F382C_M_0 */
7768 { "vmaskmovps", { XM, Vex, Mx }, PREFIX_DATA },
53aa04a0
L
7769 },
7770 {
7531c613
JB
7771 /* VEX_W_0F382D_M_0 */
7772 { "vmaskmovpd", { XM, Vex, Mx }, PREFIX_DATA },
53aa04a0
L
7773 },
7774 {
7531c613
JB
7775 /* VEX_W_0F382E_M_0 */
7776 { "vmaskmovps", { Mx, Vex, XM }, PREFIX_DATA },
53aa04a0
L
7777 },
7778 {
7531c613
JB
7779 /* VEX_W_0F382F_M_0 */
7780 { "vmaskmovpd", { Mx, Vex, XM }, PREFIX_DATA },
53aa04a0 7781 },
6c30d220 7782 {
7531c613
JB
7783 /* VEX_W_0F3836 */
7784 { "vpermd", { XM, Vex, EXx }, PREFIX_DATA },
9e30b8e0 7785 },
6c30d220 7786 {
7531c613
JB
7787 /* VEX_W_0F3846 */
7788 { "vpsravd", { XM, Vex, EXx }, PREFIX_DATA },
6c30d220 7789 },
260cd341
LC
7790 {
7791 /* VEX_W_0F3849_X86_64_P_0 */
7792 { MOD_TABLE (MOD_VEX_0F3849_X86_64_P_0_W_0) },
7793 },
7794 {
7795 /* VEX_W_0F3849_X86_64_P_2 */
7796 { MOD_TABLE (MOD_VEX_0F3849_X86_64_P_2_W_0) },
7797 },
7798 {
7799 /* VEX_W_0F3849_X86_64_P_3 */
7800 { MOD_TABLE (MOD_VEX_0F3849_X86_64_P_3_W_0) },
7801 },
7802 {
7803 /* VEX_W_0F384B_X86_64_P_1 */
7804 { MOD_TABLE (MOD_VEX_0F384B_X86_64_P_1_W_0) },
7805 },
7806 {
7807 /* VEX_W_0F384B_X86_64_P_2 */
7808 { MOD_TABLE (MOD_VEX_0F384B_X86_64_P_2_W_0) },
7809 },
7810 {
7811 /* VEX_W_0F384B_X86_64_P_3 */
7812 { MOD_TABLE (MOD_VEX_0F384B_X86_64_P_3_W_0) },
7813 },
58bf9b6a
L
7814 {
7815 /* VEX_W_0F3850 */
7816 { "%XV vpdpbusd", { XM, Vex, EXx }, 0 },
7817 },
7818 {
7819 /* VEX_W_0F3851 */
7820 { "%XV vpdpbusds", { XM, Vex, EXx }, 0 },
7821 },
7822 {
7823 /* VEX_W_0F3852 */
7824 { "%XV vpdpwssd", { XM, Vex, EXx }, 0 },
7825 },
7826 {
7827 /* VEX_W_0F3853 */
7828 { "%XV vpdpwssds", { XM, Vex, EXx }, 0 },
7829 },
6c30d220 7830 {
7531c613
JB
7831 /* VEX_W_0F3858 */
7832 { "vpbroadcastd", { XM, EXxmm_md }, PREFIX_DATA },
6c30d220
L
7833 },
7834 {
7531c613
JB
7835 /* VEX_W_0F3859 */
7836 { "vpbroadcastq", { XM, EXxmm_mq }, PREFIX_DATA },
6c30d220
L
7837 },
7838 {
7531c613
JB
7839 /* VEX_W_0F385A_M_0_L_0 */
7840 { "vbroadcasti128", { XM, Mxmm }, PREFIX_DATA },
6c30d220 7841 },
260cd341
LC
7842 {
7843 /* VEX_W_0F385C_X86_64_P_1 */
7844 { MOD_TABLE (MOD_VEX_0F385C_X86_64_P_1_W_0) },
7845 },
7846 {
7847 /* VEX_W_0F385E_X86_64_P_0 */
7848 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_0_W_0) },
7849 },
7850 {
7851 /* VEX_W_0F385E_X86_64_P_1 */
7852 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_1_W_0) },
7853 },
7854 {
7855 /* VEX_W_0F385E_X86_64_P_2 */
7856 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_2_W_0) },
7857 },
7858 {
7859 /* VEX_W_0F385E_X86_64_P_3 */
7860 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_3_W_0) },
7861 },
6c30d220 7862 {
7531c613
JB
7863 /* VEX_W_0F3878 */
7864 { "vpbroadcastb", { XM, EXxmm_mb }, PREFIX_DATA },
6c30d220
L
7865 },
7866 {
7531c613
JB
7867 /* VEX_W_0F3879 */
7868 { "vpbroadcastw", { XM, EXxmm_mw }, PREFIX_DATA },
6c30d220 7869 },
48521003 7870 {
7531c613
JB
7871 /* VEX_W_0F38CF */
7872 { "vgf2p8mulb", { XM, Vex, EXx }, PREFIX_DATA },
48521003 7873 },
6c30d220 7874 {
7531c613 7875 /* VEX_W_0F3A00_L_1 */
6c30d220 7876 { Bad_Opcode },
7531c613 7877 { "vpermq", { XM, EXx, Ib }, PREFIX_DATA },
6c30d220
L
7878 },
7879 {
7531c613 7880 /* VEX_W_0F3A01_L_1 */
6c30d220 7881 { Bad_Opcode },
7531c613 7882 { "vpermpd", { XM, EXx, Ib }, PREFIX_DATA },
6c30d220
L
7883 },
7884 {
7531c613
JB
7885 /* VEX_W_0F3A02 */
7886 { "vpblendd", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6c30d220 7887 },
9e30b8e0 7888 {
7531c613
JB
7889 /* VEX_W_0F3A04 */
7890 { "vpermilps", { XM, EXx, Ib }, PREFIX_DATA },
9e30b8e0
L
7891 },
7892 {
7531c613
JB
7893 /* VEX_W_0F3A05 */
7894 { "vpermilpd", { XM, EXx, Ib }, PREFIX_DATA },
9e30b8e0
L
7895 },
7896 {
7531c613
JB
7897 /* VEX_W_0F3A06_L_1 */
7898 { "vperm2f128", { XM, Vex, EXx, Ib }, PREFIX_DATA },
9e30b8e0 7899 },
9e30b8e0 7900 {
7531c613
JB
7901 /* VEX_W_0F3A18_L_1 */
7902 { "vinsertf128", { XM, Vex, EXxmm, Ib }, PREFIX_DATA },
9e30b8e0
L
7903 },
7904 {
7531c613
JB
7905 /* VEX_W_0F3A19_L_1 */
7906 { "vextractf128", { EXxmm, XM, Ib }, PREFIX_DATA },
9e30b8e0 7907 },
6431c801 7908 {
7531c613
JB
7909 /* VEX_W_0F3A1D */
7910 { "vcvtps2ph", { EXxmmq, XM, EXxEVexS, Ib }, PREFIX_DATA },
6431c801 7911 },
6c30d220 7912 {
7531c613
JB
7913 /* VEX_W_0F3A38_L_1 */
7914 { "vinserti128", { XM, Vex, EXxmm, Ib }, PREFIX_DATA },
6c30d220
L
7915 },
7916 {
7531c613
JB
7917 /* VEX_W_0F3A39_L_1 */
7918 { "vextracti128", { EXxmm, XM, Ib }, PREFIX_DATA },
6c30d220 7919 },
6c30d220 7920 {
7531c613
JB
7921 /* VEX_W_0F3A46_L_1 */
7922 { "vperm2i128", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6c30d220 7923 },
9e30b8e0 7924 {
7531c613
JB
7925 /* VEX_W_0F3A4A */
7926 { "vblendvps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
9e30b8e0
L
7927 },
7928 {
7531c613
JB
7929 /* VEX_W_0F3A4B */
7930 { "vblendvpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
9e30b8e0
L
7931 },
7932 {
7531c613
JB
7933 /* VEX_W_0F3A4C */
7934 { "vpblendvb", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
9e30b8e0 7935 },
48521003 7936 {
7531c613 7937 /* VEX_W_0F3ACE */
48521003 7938 { Bad_Opcode },
7531c613 7939 { "vgf2p8affineqb", { XM, Vex, EXx, Ib }, PREFIX_DATA },
48521003
IT
7940 },
7941 {
7531c613 7942 /* VEX_W_0F3ACF */
48521003 7943 { Bad_Opcode },
7531c613 7944 { "vgf2p8affineinvqb", { XM, Vex, EXx, Ib }, PREFIX_DATA },
48521003 7945 },
467bbef0
JB
7946 /* VEX_W_0FXOP_08_85_L_0 */
7947 {
7948 { "vpmacssww", { XM, Vex, EXx, XMVexI4 }, 0 },
7949 },
7950 /* VEX_W_0FXOP_08_86_L_0 */
7951 {
7952 { "vpmacsswd", { XM, Vex, EXx, XMVexI4 }, 0 },
7953 },
7954 /* VEX_W_0FXOP_08_87_L_0 */
7955 {
7956 { "vpmacssdql", { XM, Vex, EXx, XMVexI4 }, 0 },
7957 },
7958 /* VEX_W_0FXOP_08_8E_L_0 */
7959 {
7960 { "vpmacssdd", { XM, Vex, EXx, XMVexI4 }, 0 },
7961 },
7962 /* VEX_W_0FXOP_08_8F_L_0 */
7963 {
7964 { "vpmacssdqh", { XM, Vex, EXx, XMVexI4 }, 0 },
7965 },
7966 /* VEX_W_0FXOP_08_95_L_0 */
7967 {
7968 { "vpmacsww", { XM, Vex, EXx, XMVexI4 }, 0 },
7969 },
7970 /* VEX_W_0FXOP_08_96_L_0 */
7971 {
7972 { "vpmacswd", { XM, Vex, EXx, XMVexI4 }, 0 },
7973 },
7974 /* VEX_W_0FXOP_08_97_L_0 */
7975 {
7976 { "vpmacsdql", { XM, Vex, EXx, XMVexI4 }, 0 },
7977 },
7978 /* VEX_W_0FXOP_08_9E_L_0 */
7979 {
7980 { "vpmacsdd", { XM, Vex, EXx, XMVexI4 }, 0 },
7981 },
7982 /* VEX_W_0FXOP_08_9F_L_0 */
7983 {
7984 { "vpmacsdqh", { XM, Vex, EXx, XMVexI4 }, 0 },
7985 },
7986 /* VEX_W_0FXOP_08_A6_L_0 */
7987 {
7988 { "vpmadcsswd", { XM, Vex, EXx, XMVexI4 }, 0 },
7989 },
7990 /* VEX_W_0FXOP_08_B6_L_0 */
7991 {
7992 { "vpmadcswd", { XM, Vex, EXx, XMVexI4 }, 0 },
7993 },
7994 /* VEX_W_0FXOP_08_C0_L_0 */
7995 {
7996 { "vprotb", { XM, EXx, Ib }, 0 },
7997 },
7998 /* VEX_W_0FXOP_08_C1_L_0 */
7999 {
8000 { "vprotw", { XM, EXx, Ib }, 0 },
8001 },
8002 /* VEX_W_0FXOP_08_C2_L_0 */
8003 {
8004 { "vprotd", { XM, EXx, Ib }, 0 },
8005 },
8006 /* VEX_W_0FXOP_08_C3_L_0 */
8007 {
8008 { "vprotq", { XM, EXx, Ib }, 0 },
8009 },
8010 /* VEX_W_0FXOP_08_CC_L_0 */
8011 {
89e65d17 8012 { "vpcomb", { XM, Vex, EXx, VPCOM }, 0 },
467bbef0
JB
8013 },
8014 /* VEX_W_0FXOP_08_CD_L_0 */
8015 {
89e65d17 8016 { "vpcomw", { XM, Vex, EXx, VPCOM }, 0 },
467bbef0
JB
8017 },
8018 /* VEX_W_0FXOP_08_CE_L_0 */
8019 {
89e65d17 8020 { "vpcomd", { XM, Vex, EXx, VPCOM }, 0 },
467bbef0
JB
8021 },
8022 /* VEX_W_0FXOP_08_CF_L_0 */
8023 {
89e65d17 8024 { "vpcomq", { XM, Vex, EXx, VPCOM }, 0 },
467bbef0
JB
8025 },
8026 /* VEX_W_0FXOP_08_EC_L_0 */
8027 {
89e65d17 8028 { "vpcomub", { XM, Vex, EXx, VPCOM }, 0 },
467bbef0
JB
8029 },
8030 /* VEX_W_0FXOP_08_ED_L_0 */
8031 {
89e65d17 8032 { "vpcomuw", { XM, Vex, EXx, VPCOM }, 0 },
467bbef0
JB
8033 },
8034 /* VEX_W_0FXOP_08_EE_L_0 */
8035 {
89e65d17 8036 { "vpcomud", { XM, Vex, EXx, VPCOM }, 0 },
467bbef0
JB
8037 },
8038 /* VEX_W_0FXOP_08_EF_L_0 */
8039 {
89e65d17 8040 { "vpcomuq", { XM, Vex, EXx, VPCOM }, 0 },
467bbef0 8041 },
b5b098c2
JB
8042 /* VEX_W_0FXOP_09_80 */
8043 {
8044 { "vfrczps", { XM, EXx }, 0 },
8045 },
8046 /* VEX_W_0FXOP_09_81 */
8047 {
8048 { "vfrczpd", { XM, EXx }, 0 },
8049 },
8050 /* VEX_W_0FXOP_09_82 */
8051 {
8052 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_82_W_0) },
8053 },
8054 /* VEX_W_0FXOP_09_83 */
8055 {
8056 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_83_W_0) },
8057 },
467bbef0
JB
8058 /* VEX_W_0FXOP_09_C1_L_0 */
8059 {
8060 { "vphaddbw", { XM, EXxmm }, 0 },
8061 },
8062 /* VEX_W_0FXOP_09_C2_L_0 */
8063 {
8064 { "vphaddbd", { XM, EXxmm }, 0 },
8065 },
8066 /* VEX_W_0FXOP_09_C3_L_0 */
8067 {
8068 { "vphaddbq", { XM, EXxmm }, 0 },
8069 },
8070 /* VEX_W_0FXOP_09_C6_L_0 */
8071 {
8072 { "vphaddwd", { XM, EXxmm }, 0 },
8073 },
8074 /* VEX_W_0FXOP_09_C7_L_0 */
8075 {
8076 { "vphaddwq", { XM, EXxmm }, 0 },
8077 },
8078 /* VEX_W_0FXOP_09_CB_L_0 */
8079 {
8080 { "vphadddq", { XM, EXxmm }, 0 },
8081 },
8082 /* VEX_W_0FXOP_09_D1_L_0 */
8083 {
8084 { "vphaddubw", { XM, EXxmm }, 0 },
8085 },
8086 /* VEX_W_0FXOP_09_D2_L_0 */
8087 {
8088 { "vphaddubd", { XM, EXxmm }, 0 },
8089 },
8090 /* VEX_W_0FXOP_09_D3_L_0 */
8091 {
8092 { "vphaddubq", { XM, EXxmm }, 0 },
8093 },
8094 /* VEX_W_0FXOP_09_D6_L_0 */
8095 {
8096 { "vphadduwd", { XM, EXxmm }, 0 },
8097 },
8098 /* VEX_W_0FXOP_09_D7_L_0 */
8099 {
8100 { "vphadduwq", { XM, EXxmm }, 0 },
8101 },
8102 /* VEX_W_0FXOP_09_DB_L_0 */
8103 {
8104 { "vphaddudq", { XM, EXxmm }, 0 },
8105 },
8106 /* VEX_W_0FXOP_09_E1_L_0 */
8107 {
8108 { "vphsubbw", { XM, EXxmm }, 0 },
8109 },
8110 /* VEX_W_0FXOP_09_E2_L_0 */
8111 {
8112 { "vphsubwd", { XM, EXxmm }, 0 },
8113 },
8114 /* VEX_W_0FXOP_09_E3_L_0 */
8115 {
8116 { "vphsubdq", { XM, EXxmm }, 0 },
8117 },
ad692897
L
8118
8119#include "i386-dis-evex-w.h"
9e30b8e0
L
8120};
8121
8122static const struct dis386 mod_table[][2] = {
8123 {
8124 /* MOD_8D */
bf890a93 8125 { "leaS", { Gv, M }, 0 },
9e30b8e0 8126 },
42164a71
L
8127 {
8128 /* MOD_C6_REG_7 */
8129 { Bad_Opcode },
8130 { RM_TABLE (RM_C6_REG_7) },
8131 },
8132 {
8133 /* MOD_C7_REG_7 */
8134 { Bad_Opcode },
8135 { RM_TABLE (RM_C7_REG_7) },
8136 },
4a357820
MZ
8137 {
8138 /* MOD_FF_REG_3 */
8f570d62 8139 { "{l|}call^", { indirEp }, 0 },
4a357820
MZ
8140 },
8141 {
8142 /* MOD_FF_REG_5 */
8f570d62 8143 { "{l|}jmp^", { indirEp }, 0 },
4a357820 8144 },
9e30b8e0
L
8145 {
8146 /* MOD_0F01_REG_0 */
8147 { X86_64_TABLE (X86_64_0F01_REG_0) },
8148 { RM_TABLE (RM_0F01_REG_0) },
8149 },
8150 {
8151 /* MOD_0F01_REG_1 */
8152 { X86_64_TABLE (X86_64_0F01_REG_1) },
8153 { RM_TABLE (RM_0F01_REG_1) },
8154 },
8155 {
8156 /* MOD_0F01_REG_2 */
8157 { X86_64_TABLE (X86_64_0F01_REG_2) },
8158 { RM_TABLE (RM_0F01_REG_2) },
8159 },
8160 {
8161 /* MOD_0F01_REG_3 */
8162 { X86_64_TABLE (X86_64_0F01_REG_3) },
8163 { RM_TABLE (RM_0F01_REG_3) },
8164 },
8eab4136
L
8165 {
8166 /* MOD_0F01_REG_5 */
f8687e93
JB
8167 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_0) },
8168 { RM_TABLE (RM_0F01_REG_5_MOD_3) },
8eab4136 8169 },
9e30b8e0
L
8170 {
8171 /* MOD_0F01_REG_7 */
bf890a93 8172 { "invlpg", { Mb }, 0 },
f8687e93 8173 { RM_TABLE (RM_0F01_REG_7_MOD_3) },
9e30b8e0
L
8174 },
8175 {
8176 /* MOD_0F12_PREFIX_0 */
18897deb
JB
8177 { "movlpX", { XM, EXq }, 0 },
8178 { "movhlps", { XM, EXq }, 0 },
8179 },
8180 {
8181 /* MOD_0F12_PREFIX_2 */
8182 { "movlpX", { XM, EXq }, 0 },
9e30b8e0
L
8183 },
8184 {
8185 /* MOD_0F13 */
507bd325 8186 { "movlpX", { EXq, XM }, PREFIX_OPCODE },
9e30b8e0
L
8187 },
8188 {
8189 /* MOD_0F16_PREFIX_0 */
18897deb 8190 { "movhpX", { XM, EXq }, 0 },
bf890a93 8191 { "movlhps", { XM, EXq }, 0 },
9e30b8e0 8192 },
18897deb
JB
8193 {
8194 /* MOD_0F16_PREFIX_2 */
8195 { "movhpX", { XM, EXq }, 0 },
8196 },
9e30b8e0
L
8197 {
8198 /* MOD_0F17 */
507bd325 8199 { "movhpX", { EXq, XM }, PREFIX_OPCODE },
9e30b8e0
L
8200 },
8201 {
8202 /* MOD_0F18_REG_0 */
bf890a93 8203 { "prefetchnta", { Mb }, 0 },
9e30b8e0
L
8204 },
8205 {
8206 /* MOD_0F18_REG_1 */
bf890a93 8207 { "prefetcht0", { Mb }, 0 },
9e30b8e0
L
8208 },
8209 {
8210 /* MOD_0F18_REG_2 */
bf890a93 8211 { "prefetcht1", { Mb }, 0 },
9e30b8e0
L
8212 },
8213 {
8214 /* MOD_0F18_REG_3 */
bf890a93 8215 { "prefetcht2", { Mb }, 0 },
9e30b8e0 8216 },
d7189fa5
RM
8217 {
8218 /* MOD_0F18_REG_4 */
bf890a93 8219 { "nop/reserved", { Mb }, 0 },
d7189fa5
RM
8220 },
8221 {
8222 /* MOD_0F18_REG_5 */
bf890a93 8223 { "nop/reserved", { Mb }, 0 },
d7189fa5
RM
8224 },
8225 {
8226 /* MOD_0F18_REG_6 */
bf890a93 8227 { "nop/reserved", { Mb }, 0 },
d7189fa5
RM
8228 },
8229 {
8230 /* MOD_0F18_REG_7 */
bf890a93 8231 { "nop/reserved", { Mb }, 0 },
d7189fa5 8232 },
7e8b059b
L
8233 {
8234 /* MOD_0F1A_PREFIX_0 */
d276ec69 8235 { "bndldx", { Gbnd, Mv_bnd }, 0 },
bf890a93 8236 { "nopQ", { Ev }, 0 },
7e8b059b
L
8237 },
8238 {
8239 /* MOD_0F1B_PREFIX_0 */
d276ec69 8240 { "bndstx", { Mv_bnd, Gbnd }, 0 },
bf890a93 8241 { "nopQ", { Ev }, 0 },
7e8b059b
L
8242 },
8243 {
8244 /* MOD_0F1B_PREFIX_1 */
d276ec69 8245 { "bndmk", { Gbnd, Mv_bnd }, 0 },
bf890a93 8246 { "nopQ", { Ev }, 0 },
7e8b059b 8247 },
c48935d7
IT
8248 {
8249 /* MOD_0F1C_PREFIX_0 */
f8687e93 8250 { REG_TABLE (REG_0F1C_P_0_MOD_0) },
c48935d7
IT
8251 { "nopQ", { Ev }, 0 },
8252 },
603555e5
L
8253 {
8254 /* MOD_0F1E_PREFIX_1 */
8255 { "nopQ", { Ev }, 0 },
f8687e93 8256 { REG_TABLE (REG_0F1E_P_1_MOD_3) },
603555e5 8257 },
75c135a8
L
8258 {
8259 /* MOD_0F2B_PREFIX_0 */
507bd325 8260 {"movntps", { Mx, XM }, PREFIX_OPCODE },
75c135a8
L
8261 },
8262 {
8263 /* MOD_0F2B_PREFIX_1 */
507bd325 8264 {"movntss", { Md, XM }, PREFIX_OPCODE },
75c135a8
L
8265 },
8266 {
8267 /* MOD_0F2B_PREFIX_2 */
507bd325 8268 {"movntpd", { Mx, XM }, PREFIX_OPCODE },
75c135a8
L
8269 },
8270 {
8271 /* MOD_0F2B_PREFIX_3 */
507bd325 8272 {"movntsd", { Mq, XM }, PREFIX_OPCODE },
75c135a8
L
8273 },
8274 {
a5aaedb9 8275 /* MOD_0F50 */
592d1631 8276 { Bad_Opcode },
507bd325 8277 { "movmskpX", { Gdq, XS }, PREFIX_OPCODE },
75c135a8 8278 },
b844680a 8279 {
1ceb70f8 8280 /* MOD_0F71_REG_2 */
592d1631 8281 { Bad_Opcode },
7531c613 8282 { "psrlw", { MS, Ib }, PREFIX_OPCODE },
b844680a
L
8283 },
8284 {
1ceb70f8 8285 /* MOD_0F71_REG_4 */
592d1631 8286 { Bad_Opcode },
7531c613 8287 { "psraw", { MS, Ib }, PREFIX_OPCODE },
b844680a
L
8288 },
8289 {
1ceb70f8 8290 /* MOD_0F71_REG_6 */
592d1631 8291 { Bad_Opcode },
7531c613 8292 { "psllw", { MS, Ib }, PREFIX_OPCODE },
b844680a
L
8293 },
8294 {
1ceb70f8 8295 /* MOD_0F72_REG_2 */
592d1631 8296 { Bad_Opcode },
7531c613 8297 { "psrld", { MS, Ib }, PREFIX_OPCODE },
b844680a
L
8298 },
8299 {
1ceb70f8 8300 /* MOD_0F72_REG_4 */
592d1631 8301 { Bad_Opcode },
7531c613 8302 { "psrad", { MS, Ib }, PREFIX_OPCODE },
b844680a
L
8303 },
8304 {
1ceb70f8 8305 /* MOD_0F72_REG_6 */
592d1631 8306 { Bad_Opcode },
7531c613 8307 { "pslld", { MS, Ib }, PREFIX_OPCODE },
b844680a
L
8308 },
8309 {
1ceb70f8 8310 /* MOD_0F73_REG_2 */
592d1631 8311 { Bad_Opcode },
7531c613 8312 { "psrlq", { MS, Ib }, PREFIX_OPCODE },
b844680a
L
8313 },
8314 {
1ceb70f8 8315 /* MOD_0F73_REG_3 */
592d1631 8316 { Bad_Opcode },
7531c613 8317 { "psrldq", { XS, Ib }, PREFIX_DATA },
c0f3af97
L
8318 },
8319 {
8320 /* MOD_0F73_REG_6 */
592d1631 8321 { Bad_Opcode },
7531c613 8322 { "psllq", { MS, Ib }, PREFIX_OPCODE },
c0f3af97
L
8323 },
8324 {
8325 /* MOD_0F73_REG_7 */
592d1631 8326 { Bad_Opcode },
7531c613 8327 { "pslldq", { XS, Ib }, PREFIX_DATA },
c0f3af97
L
8328 },
8329 {
8330 /* MOD_0FAE_REG_0 */
bf890a93 8331 { "fxsave", { FXSAVE }, 0 },
f8687e93 8332 { PREFIX_TABLE (PREFIX_0FAE_REG_0_MOD_3) },
c0f3af97
L
8333 },
8334 {
8335 /* MOD_0FAE_REG_1 */
bf890a93 8336 { "fxrstor", { FXSAVE }, 0 },
f8687e93 8337 { PREFIX_TABLE (PREFIX_0FAE_REG_1_MOD_3) },
c0f3af97
L
8338 },
8339 {
8340 /* MOD_0FAE_REG_2 */
bf890a93 8341 { "ldmxcsr", { Md }, 0 },
f8687e93 8342 { PREFIX_TABLE (PREFIX_0FAE_REG_2_MOD_3) },
c0f3af97
L
8343 },
8344 {
8345 /* MOD_0FAE_REG_3 */
bf890a93 8346 { "stmxcsr", { Md }, 0 },
f8687e93 8347 { PREFIX_TABLE (PREFIX_0FAE_REG_3_MOD_3) },
c0f3af97
L
8348 },
8349 {
8350 /* MOD_0FAE_REG_4 */
f8687e93
JB
8351 { PREFIX_TABLE (PREFIX_0FAE_REG_4_MOD_0) },
8352 { PREFIX_TABLE (PREFIX_0FAE_REG_4_MOD_3) },
c0f3af97
L
8353 },
8354 {
8355 /* MOD_0FAE_REG_5 */
035e7389 8356 { "xrstor", { FXSAVE }, PREFIX_OPCODE },
f8687e93 8357 { PREFIX_TABLE (PREFIX_0FAE_REG_5_MOD_3) },
c0f3af97
L
8358 },
8359 {
8360 /* MOD_0FAE_REG_6 */
f8687e93
JB
8361 { PREFIX_TABLE (PREFIX_0FAE_REG_6_MOD_0) },
8362 { PREFIX_TABLE (PREFIX_0FAE_REG_6_MOD_3) },
c0f3af97
L
8363 },
8364 {
8365 /* MOD_0FAE_REG_7 */
f8687e93
JB
8366 { PREFIX_TABLE (PREFIX_0FAE_REG_7_MOD_0) },
8367 { RM_TABLE (RM_0FAE_REG_7_MOD_3) },
c0f3af97
L
8368 },
8369 {
8370 /* MOD_0FB2 */
bf890a93 8371 { "lssS", { Gv, Mp }, 0 },
c0f3af97
L
8372 },
8373 {
8374 /* MOD_0FB4 */
bf890a93 8375 { "lfsS", { Gv, Mp }, 0 },
c0f3af97
L
8376 },
8377 {
8378 /* MOD_0FB5 */
bf890a93 8379 { "lgsS", { Gv, Mp }, 0 },
c0f3af97 8380 },
a8484f96
L
8381 {
8382 /* MOD_0FC3 */
035e7389 8383 { "movntiS", { Edq, Gdq }, PREFIX_OPCODE },
a8484f96 8384 },
963f3586
IT
8385 {
8386 /* MOD_0FC7_REG_3 */
a8484f96 8387 { "xrstors", { FXSAVE }, 0 },
963f3586
IT
8388 },
8389 {
8390 /* MOD_0FC7_REG_4 */
bf890a93 8391 { "xsavec", { FXSAVE }, 0 },
963f3586
IT
8392 },
8393 {
8394 /* MOD_0FC7_REG_5 */
bf890a93 8395 { "xsaves", { FXSAVE }, 0 },
963f3586 8396 },
c0f3af97
L
8397 {
8398 /* MOD_0FC7_REG_6 */
f8687e93
JB
8399 { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_0) },
8400 { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_3) }
c0f3af97
L
8401 },
8402 {
8403 /* MOD_0FC7_REG_7 */
bf890a93 8404 { "vmptrst", { Mq }, 0 },
f8687e93 8405 { PREFIX_TABLE (PREFIX_0FC7_REG_7_MOD_3) }
c0f3af97
L
8406 },
8407 {
8408 /* MOD_0FD7 */
592d1631 8409 { Bad_Opcode },
bf890a93 8410 { "pmovmskb", { Gdq, MS }, 0 },
c0f3af97
L
8411 },
8412 {
8413 /* MOD_0FE7_PREFIX_2 */
bf890a93 8414 { "movntdq", { Mx, XM }, 0 },
c0f3af97
L
8415 },
8416 {
8417 /* MOD_0FF0_PREFIX_3 */
bf890a93 8418 { "lddqu", { XM, M }, 0 },
c0f3af97
L
8419 },
8420 {
7531c613
JB
8421 /* MOD_0F382A */
8422 { "movntdqa", { XM, Mx }, PREFIX_DATA },
c0f3af97 8423 },
c4694f17
TG
8424 {
8425 /* MOD_0F38DC_PREFIX_1 */
8426 { "aesenc128kl", { XM, M }, 0 },
8427 { "loadiwkey", { XM, EXx }, 0 },
8428 },
8429 {
8430 /* MOD_0F38DD_PREFIX_1 */
8431 { "aesdec128kl", { XM, M }, 0 },
8432 },
8433 {
8434 /* MOD_0F38DE_PREFIX_1 */
8435 { "aesenc256kl", { XM, M }, 0 },
8436 },
8437 {
8438 /* MOD_0F38DF_PREFIX_1 */
8439 { "aesdec256kl", { XM, M }, 0 },
8440 },
603555e5 8441 {
7531c613
JB
8442 /* MOD_0F38F5 */
8443 { "wrussK", { M, Gdq }, PREFIX_DATA },
603555e5
L
8444 },
8445 {
8446 /* MOD_0F38F6_PREFIX_0 */
8447 { "wrssK", { M, Gdq }, PREFIX_OPCODE },
8448 },
5d79adc4
L
8449 {
8450 /* MOD_0F38F8_PREFIX_1 */
8451 { "enqcmds", { Gva, M }, PREFIX_OPCODE },
8452 },
c0a30a9f
L
8453 {
8454 /* MOD_0F38F8_PREFIX_2 */
8455 { "movdir64b", { Gva, M }, PREFIX_OPCODE },
8456 },
5d79adc4
L
8457 {
8458 /* MOD_0F38F8_PREFIX_3 */
8459 { "enqcmd", { Gva, M }, PREFIX_OPCODE },
8460 },
c0a30a9f 8461 {
035e7389
JB
8462 /* MOD_0F38F9 */
8463 { "movdiri", { Edq, Gdq }, PREFIX_OPCODE },
c0a30a9f 8464 },
c4694f17
TG
8465 {
8466 /* MOD_0F38FA_PREFIX_1 */
8467 { Bad_Opcode },
8468 { "encodekey128", { Gd, Ed }, 0 },
8469 },
8470 {
8471 /* MOD_0F38FB_PREFIX_1 */
8472 { Bad_Opcode },
8473 { "encodekey256", { Gd, Ed }, 0 },
8474 },
c1fa250a
LC
8475 {
8476 /* MOD_0F3A0F_PREFIX_1 */
8477 { Bad_Opcode },
8478 { REG_TABLE (REG_0F3A0F_PREFIX_1_MOD_3) },
8479 },
c0f3af97
L
8480 {
8481 /* MOD_62_32BIT */
bf890a93 8482 { "bound{S|}", { Gv, Ma }, 0 },
43234a1e 8483 { EVEX_TABLE (EVEX_0F) },
c0f3af97
L
8484 },
8485 {
8486 /* MOD_C4_32BIT */
bf890a93 8487 { "lesS", { Gv, Mp }, 0 },
c0f3af97
L
8488 { VEX_C4_TABLE (VEX_0F) },
8489 },
8490 {
8491 /* MOD_C5_32BIT */
bf890a93 8492 { "ldsS", { Gv, Mp }, 0 },
c0f3af97
L
8493 { VEX_C5_TABLE (VEX_0F) },
8494 },
8495 {
592a252b
L
8496 /* MOD_VEX_0F12_PREFIX_0 */
8497 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_0) },
8498 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_1) },
c0f3af97 8499 },
18897deb
JB
8500 {
8501 /* MOD_VEX_0F12_PREFIX_2 */
8502 { VEX_LEN_TABLE (VEX_LEN_0F12_P_2_M_0) },
8503 },
c0f3af97 8504 {
592a252b
L
8505 /* MOD_VEX_0F13 */
8506 { VEX_LEN_TABLE (VEX_LEN_0F13_M_0) },
c0f3af97
L
8507 },
8508 {
592a252b
L
8509 /* MOD_VEX_0F16_PREFIX_0 */
8510 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_0) },
8511 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_1) },
c0f3af97 8512 },
18897deb
JB
8513 {
8514 /* MOD_VEX_0F16_PREFIX_2 */
8515 { VEX_LEN_TABLE (VEX_LEN_0F16_P_2_M_0) },
8516 },
c0f3af97 8517 {
592a252b
L
8518 /* MOD_VEX_0F17 */
8519 { VEX_LEN_TABLE (VEX_LEN_0F17_M_0) },
c0f3af97
L
8520 },
8521 {
592a252b 8522 /* MOD_VEX_0F2B */
bf926894 8523 { "vmovntpX", { Mx, XM }, PREFIX_OPCODE },
c0f3af97 8524 },
ab4e4ed5
AF
8525 {
8526 /* MOD_VEX_W_0_0F41_P_0_LEN_1 */
8527 { Bad_Opcode },
464d2b65 8528 { "kandw", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8529 },
8530 {
8531 /* MOD_VEX_W_1_0F41_P_0_LEN_1 */
8532 { Bad_Opcode },
464d2b65 8533 { "kandq", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8534 },
8535 {
8536 /* MOD_VEX_W_0_0F41_P_2_LEN_1 */
8537 { Bad_Opcode },
464d2b65 8538 { "kandb", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8539 },
8540 {
8541 /* MOD_VEX_W_1_0F41_P_2_LEN_1 */
8542 { Bad_Opcode },
464d2b65 8543 { "kandd", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8544 },
8545 {
8546 /* MOD_VEX_W_0_0F42_P_0_LEN_1 */
8547 { Bad_Opcode },
464d2b65 8548 { "kandnw", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8549 },
8550 {
8551 /* MOD_VEX_W_1_0F42_P_0_LEN_1 */
8552 { Bad_Opcode },
464d2b65 8553 { "kandnq", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8554 },
8555 {
8556 /* MOD_VEX_W_0_0F42_P_2_LEN_1 */
8557 { Bad_Opcode },
464d2b65 8558 { "kandnb", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8559 },
8560 {
8561 /* MOD_VEX_W_1_0F42_P_2_LEN_1 */
8562 { Bad_Opcode },
464d2b65 8563 { "kandnd", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8564 },
8565 {
8566 /* MOD_VEX_W_0_0F44_P_0_LEN_0 */
8567 { Bad_Opcode },
464d2b65 8568 { "knotw", { MaskG, MaskE }, 0 },
ab4e4ed5
AF
8569 },
8570 {
8571 /* MOD_VEX_W_1_0F44_P_0_LEN_0 */
8572 { Bad_Opcode },
464d2b65 8573 { "knotq", { MaskG, MaskE }, 0 },
ab4e4ed5
AF
8574 },
8575 {
8576 /* MOD_VEX_W_0_0F44_P_2_LEN_0 */
8577 { Bad_Opcode },
464d2b65 8578 { "knotb", { MaskG, MaskE }, 0 },
ab4e4ed5
AF
8579 },
8580 {
8581 /* MOD_VEX_W_1_0F44_P_2_LEN_0 */
8582 { Bad_Opcode },
464d2b65 8583 { "knotd", { MaskG, MaskE }, 0 },
ab4e4ed5
AF
8584 },
8585 {
8586 /* MOD_VEX_W_0_0F45_P_0_LEN_1 */
8587 { Bad_Opcode },
464d2b65 8588 { "korw", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8589 },
8590 {
8591 /* MOD_VEX_W_1_0F45_P_0_LEN_1 */
8592 { Bad_Opcode },
464d2b65 8593 { "korq", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8594 },
8595 {
8596 /* MOD_VEX_W_0_0F45_P_2_LEN_1 */
8597 { Bad_Opcode },
464d2b65 8598 { "korb", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8599 },
8600 {
8601 /* MOD_VEX_W_1_0F45_P_2_LEN_1 */
8602 { Bad_Opcode },
464d2b65 8603 { "kord", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8604 },
8605 {
8606 /* MOD_VEX_W_0_0F46_P_0_LEN_1 */
8607 { Bad_Opcode },
464d2b65 8608 { "kxnorw", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8609 },
8610 {
8611 /* MOD_VEX_W_1_0F46_P_0_LEN_1 */
8612 { Bad_Opcode },
464d2b65 8613 { "kxnorq", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8614 },
8615 {
8616 /* MOD_VEX_W_0_0F46_P_2_LEN_1 */
8617 { Bad_Opcode },
464d2b65 8618 { "kxnorb", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8619 },
8620 {
8621 /* MOD_VEX_W_1_0F46_P_2_LEN_1 */
8622 { Bad_Opcode },
464d2b65 8623 { "kxnord", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8624 },
8625 {
8626 /* MOD_VEX_W_0_0F47_P_0_LEN_1 */
8627 { Bad_Opcode },
464d2b65 8628 { "kxorw", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8629 },
8630 {
8631 /* MOD_VEX_W_1_0F47_P_0_LEN_1 */
8632 { Bad_Opcode },
464d2b65 8633 { "kxorq", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8634 },
8635 {
8636 /* MOD_VEX_W_0_0F47_P_2_LEN_1 */
8637 { Bad_Opcode },
464d2b65 8638 { "kxorb", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8639 },
8640 {
8641 /* MOD_VEX_W_1_0F47_P_2_LEN_1 */
8642 { Bad_Opcode },
464d2b65 8643 { "kxord", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8644 },
8645 {
8646 /* MOD_VEX_W_0_0F4A_P_0_LEN_1 */
8647 { Bad_Opcode },
464d2b65 8648 { "kaddw", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8649 },
8650 {
8651 /* MOD_VEX_W_1_0F4A_P_0_LEN_1 */
8652 { Bad_Opcode },
464d2b65 8653 { "kaddq", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8654 },
8655 {
8656 /* MOD_VEX_W_0_0F4A_P_2_LEN_1 */
8657 { Bad_Opcode },
464d2b65 8658 { "kaddb", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8659 },
8660 {
8661 /* MOD_VEX_W_1_0F4A_P_2_LEN_1 */
8662 { Bad_Opcode },
464d2b65 8663 { "kaddd", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8664 },
8665 {
8666 /* MOD_VEX_W_0_0F4B_P_0_LEN_1 */
8667 { Bad_Opcode },
464d2b65 8668 { "kunpckwd", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8669 },
8670 {
8671 /* MOD_VEX_W_1_0F4B_P_0_LEN_1 */
8672 { Bad_Opcode },
464d2b65 8673 { "kunpckdq", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8674 },
8675 {
8676 /* MOD_VEX_W_0_0F4B_P_2_LEN_1 */
8677 { Bad_Opcode },
464d2b65 8678 { "kunpckbw", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5 8679 },
c0f3af97 8680 {
592a252b 8681 /* MOD_VEX_0F50 */
592d1631 8682 { Bad_Opcode },
bf926894 8683 { "vmovmskpX", { Gdq, XS }, PREFIX_OPCODE },
c0f3af97
L
8684 },
8685 {
592a252b 8686 /* MOD_VEX_0F71_REG_2 */
592d1631 8687 { Bad_Opcode },
7531c613 8688 { "vpsrlw", { Vex, XS, Ib }, PREFIX_DATA },
b844680a
L
8689 },
8690 {
592a252b 8691 /* MOD_VEX_0F71_REG_4 */
592d1631 8692 { Bad_Opcode },
7531c613 8693 { "vpsraw", { Vex, XS, Ib }, PREFIX_DATA },
b844680a
L
8694 },
8695 {
592a252b 8696 /* MOD_VEX_0F71_REG_6 */
592d1631 8697 { Bad_Opcode },
7531c613 8698 { "vpsllw", { Vex, XS, Ib }, PREFIX_DATA },
b844680a
L
8699 },
8700 {
592a252b 8701 /* MOD_VEX_0F72_REG_2 */
592d1631 8702 { Bad_Opcode },
7531c613 8703 { "vpsrld", { Vex, XS, Ib }, PREFIX_DATA },
b844680a 8704 },
d8faab4e 8705 {
592a252b 8706 /* MOD_VEX_0F72_REG_4 */
592d1631 8707 { Bad_Opcode },
7531c613 8708 { "vpsrad", { Vex, XS, Ib }, PREFIX_DATA },
d8faab4e
L
8709 },
8710 {
592a252b 8711 /* MOD_VEX_0F72_REG_6 */
592d1631 8712 { Bad_Opcode },
7531c613 8713 { "vpslld", { Vex, XS, Ib }, PREFIX_DATA },
d8faab4e 8714 },
876d4bfa 8715 {
592a252b 8716 /* MOD_VEX_0F73_REG_2 */
592d1631 8717 { Bad_Opcode },
7531c613 8718 { "vpsrlq", { Vex, XS, Ib }, PREFIX_DATA },
876d4bfa
L
8719 },
8720 {
592a252b 8721 /* MOD_VEX_0F73_REG_3 */
592d1631 8722 { Bad_Opcode },
7531c613 8723 { "vpsrldq", { Vex, XS, Ib }, PREFIX_DATA },
475a2301
L
8724 },
8725 {
592a252b 8726 /* MOD_VEX_0F73_REG_6 */
592d1631 8727 { Bad_Opcode },
7531c613 8728 { "vpsllq", { Vex, XS, Ib }, PREFIX_DATA },
876d4bfa
L
8729 },
8730 {
592a252b 8731 /* MOD_VEX_0F73_REG_7 */
592d1631 8732 { Bad_Opcode },
7531c613 8733 { "vpslldq", { Vex, XS, Ib }, PREFIX_DATA },
876d4bfa 8734 },
ab4e4ed5
AF
8735 {
8736 /* MOD_VEX_W_0_0F91_P_0_LEN_0 */
8737 { "kmovw", { Ew, MaskG }, 0 },
8738 { Bad_Opcode },
8739 },
8740 {
8741 /* MOD_VEX_W_0_0F91_P_0_LEN_0 */
8742 { "kmovq", { Eq, MaskG }, 0 },
8743 { Bad_Opcode },
8744 },
8745 {
8746 /* MOD_VEX_W_0_0F91_P_2_LEN_0 */
8747 { "kmovb", { Eb, MaskG }, 0 },
8748 { Bad_Opcode },
8749 },
8750 {
8751 /* MOD_VEX_W_0_0F91_P_2_LEN_0 */
8752 { "kmovd", { Ed, MaskG }, 0 },
8753 { Bad_Opcode },
8754 },
8755 {
8756 /* MOD_VEX_W_0_0F92_P_0_LEN_0 */
8757 { Bad_Opcode },
464d2b65 8758 { "kmovw", { MaskG, Edq }, 0 },
ab4e4ed5
AF
8759 },
8760 {
8761 /* MOD_VEX_W_0_0F92_P_2_LEN_0 */
8762 { Bad_Opcode },
464d2b65 8763 { "kmovb", { MaskG, Edq }, 0 },
ab4e4ed5
AF
8764 },
8765 {
58a211d2 8766 /* MOD_VEX_0F92_P_3_LEN_0 */
ab4e4ed5 8767 { Bad_Opcode },
464d2b65 8768 { "kmovK", { MaskG, Edq }, 0 },
ab4e4ed5
AF
8769 },
8770 {
8771 /* MOD_VEX_W_0_0F93_P_0_LEN_0 */
8772 { Bad_Opcode },
464d2b65 8773 { "kmovw", { Gdq, MaskE }, 0 },
ab4e4ed5
AF
8774 },
8775 {
8776 /* MOD_VEX_W_0_0F93_P_2_LEN_0 */
8777 { Bad_Opcode },
464d2b65 8778 { "kmovb", { Gdq, MaskE }, 0 },
ab4e4ed5
AF
8779 },
8780 {
58a211d2 8781 /* MOD_VEX_0F93_P_3_LEN_0 */
ab4e4ed5 8782 { Bad_Opcode },
464d2b65 8783 { "kmovK", { Gdq, MaskE }, 0 },
ab4e4ed5
AF
8784 },
8785 {
8786 /* MOD_VEX_W_0_0F98_P_0_LEN_0 */
8787 { Bad_Opcode },
464d2b65 8788 { "kortestw", { MaskG, MaskE }, 0 },
ab4e4ed5
AF
8789 },
8790 {
8791 /* MOD_VEX_W_1_0F98_P_0_LEN_0 */
8792 { Bad_Opcode },
464d2b65 8793 { "kortestq", { MaskG, MaskE }, 0 },
ab4e4ed5
AF
8794 },
8795 {
8796 /* MOD_VEX_W_0_0F98_P_2_LEN_0 */
8797 { Bad_Opcode },
464d2b65 8798 { "kortestb", { MaskG, MaskE }, 0 },
ab4e4ed5
AF
8799 },
8800 {
8801 /* MOD_VEX_W_1_0F98_P_2_LEN_0 */
8802 { Bad_Opcode },
464d2b65 8803 { "kortestd", { MaskG, MaskE }, 0 },
ab4e4ed5
AF
8804 },
8805 {
8806 /* MOD_VEX_W_0_0F99_P_0_LEN_0 */
8807 { Bad_Opcode },
464d2b65 8808 { "ktestw", { MaskG, MaskE }, 0 },
ab4e4ed5
AF
8809 },
8810 {
8811 /* MOD_VEX_W_1_0F99_P_0_LEN_0 */
8812 { Bad_Opcode },
464d2b65 8813 { "ktestq", { MaskG, MaskE }, 0 },
ab4e4ed5
AF
8814 },
8815 {
8816 /* MOD_VEX_W_0_0F99_P_2_LEN_0 */
8817 { Bad_Opcode },
464d2b65 8818 { "ktestb", { MaskG, MaskE }, 0 },
ab4e4ed5
AF
8819 },
8820 {
8821 /* MOD_VEX_W_1_0F99_P_2_LEN_0 */
8822 { Bad_Opcode },
464d2b65 8823 { "ktestd", { MaskG, MaskE }, 0 },
ab4e4ed5 8824 },
876d4bfa 8825 {
592a252b
L
8826 /* MOD_VEX_0FAE_REG_2 */
8827 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_2_M_0) },
876d4bfa 8828 },
bbedc832 8829 {
592a252b
L
8830 /* MOD_VEX_0FAE_REG_3 */
8831 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_3_M_0) },
bbedc832 8832 },
144c41d9 8833 {
7531c613 8834 /* MOD_VEX_0FD7 */
592d1631 8835 { Bad_Opcode },
7531c613 8836 { "vpmovmskb", { Gdq, XS }, PREFIX_DATA },
144c41d9 8837 },
1afd85e3 8838 {
7531c613
JB
8839 /* MOD_VEX_0FE7 */
8840 { "vmovntdq", { Mx, XM }, PREFIX_DATA },
1afd85e3
L
8841 },
8842 {
592a252b 8843 /* MOD_VEX_0FF0_PREFIX_3 */
ec6f095a 8844 { "vlddqu", { XM, M }, 0 },
92fddf8e 8845 },
75c135a8 8846 {
7531c613
JB
8847 /* MOD_VEX_0F381A */
8848 { VEX_LEN_TABLE (VEX_LEN_0F381A_M_0) },
75c135a8 8849 },
1afd85e3 8850 {
7531c613
JB
8851 /* MOD_VEX_0F382A */
8852 { "vmovntdqa", { XM, Mx }, PREFIX_DATA },
1afd85e3 8853 },
75c135a8 8854 {
7531c613
JB
8855 /* MOD_VEX_0F382C */
8856 { VEX_W_TABLE (VEX_W_0F382C_M_0) },
75c135a8 8857 },
1afd85e3 8858 {
7531c613
JB
8859 /* MOD_VEX_0F382D */
8860 { VEX_W_TABLE (VEX_W_0F382D_M_0) },
1afd85e3
L
8861 },
8862 {
7531c613
JB
8863 /* MOD_VEX_0F382E */
8864 { VEX_W_TABLE (VEX_W_0F382E_M_0) },
1afd85e3
L
8865 },
8866 {
7531c613
JB
8867 /* MOD_VEX_0F382F */
8868 { VEX_W_TABLE (VEX_W_0F382F_M_0) },
1afd85e3 8869 },
09d73035
CL
8870 {
8871 /* MOD_VEX_0F3849_X86_64_P_0_W_0 */
8872 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_0_W_0_M_0) },
8873 { REG_TABLE (REG_VEX_0F3849_X86_64_P_0_W_0_M_1) },
8874 },
8875 {
8876 /* MOD_VEX_0F3849_X86_64_P_2_W_0 */
8877 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_2_W_0_M_0) },
8878 },
8879 {
8880 /* MOD_VEX_0F3849_X86_64_P_3_W_0 */
8881 { Bad_Opcode },
8882 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_3_W_0_M_0) },
8883 },
8884 {
8885 /* MOD_VEX_0F384B_X86_64_P_1_W_0 */
8886 { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64_P_1_W_0_M_0) },
8887 },
8888 {
8889 /* MOD_VEX_0F384B_X86_64_P_2_W_0 */
8890 { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64_P_2_W_0_M_0) },
8891 },
8892 {
8893 /* MOD_VEX_0F384B_X86_64_P_3_W_0 */
8894 { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64_P_3_W_0_M_0) },
8895 },
6c30d220 8896 {
7531c613
JB
8897 /* MOD_VEX_0F385A */
8898 { VEX_LEN_TABLE (VEX_LEN_0F385A_M_0) },
6c30d220 8899 },
09d73035
CL
8900 {
8901 /* MOD_VEX_0F385C_X86_64_P_1_W_0 */
8902 { Bad_Opcode },
8903 { VEX_LEN_TABLE (VEX_LEN_0F385C_X86_64_P_1_W_0_M_0) },
8904 },
8905 {
8906 /* MOD_VEX_0F385E_X86_64_P_0_W_0 */
8907 { Bad_Opcode },
8908 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_0_W_0_M_0) },
8909 },
8910 {
8911 /* MOD_VEX_0F385E_X86_64_P_1_W_0 */
8912 { Bad_Opcode },
8913 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_1_W_0_M_0) },
8914 },
8915 {
8916 /* MOD_VEX_0F385E_X86_64_P_2_W_0 */
8917 { Bad_Opcode },
8918 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_2_W_0_M_0) },
8919 },
8920 {
8921 /* MOD_VEX_0F385E_X86_64_P_3_W_0 */
8922 { Bad_Opcode },
8923 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_3_W_0_M_0) },
8924 },
6c30d220 8925 {
7531c613
JB
8926 /* MOD_VEX_0F388C */
8927 { "vpmaskmov%DQ", { XM, Vex, Mx }, PREFIX_DATA },
6c30d220
L
8928 },
8929 {
7531c613
JB
8930 /* MOD_VEX_0F388E */
8931 { "vpmaskmov%DQ", { Mx, Vex, XM }, PREFIX_DATA },
6c30d220 8932 },
ab4e4ed5 8933 {
bb5b3501 8934 /* MOD_VEX_0F3A30_L_0 */
ab4e4ed5 8935 { Bad_Opcode },
464d2b65 8936 { "kshiftr%BW", { MaskG, MaskE, Ib }, PREFIX_DATA },
ab4e4ed5
AF
8937 },
8938 {
bb5b3501 8939 /* MOD_VEX_0F3A31_L_0 */
ab4e4ed5 8940 { Bad_Opcode },
464d2b65 8941 { "kshiftr%DQ", { MaskG, MaskE, Ib }, PREFIX_DATA },
ab4e4ed5
AF
8942 },
8943 {
bb5b3501 8944 /* MOD_VEX_0F3A32_L_0 */
ab4e4ed5 8945 { Bad_Opcode },
464d2b65 8946 { "kshiftl%BW", { MaskG, MaskE, Ib }, PREFIX_DATA },
ab4e4ed5
AF
8947 },
8948 {
bb5b3501 8949 /* MOD_VEX_0F3A33_L_0 */
ab4e4ed5 8950 { Bad_Opcode },
464d2b65 8951 { "kshiftl%DQ", { MaskG, MaskE, Ib }, PREFIX_DATA },
ab4e4ed5 8952 },
467bbef0
JB
8953 {
8954 /* MOD_VEX_0FXOP_09_12 */
8955 { Bad_Opcode },
8956 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_12_M_1) },
8957 },
ad692897
L
8958
8959#include "i386-dis-evex-mod.h"
b844680a
L
8960};
8961
1ceb70f8 8962static const struct dis386 rm_table[][8] = {
42164a71
L
8963 {
8964 /* RM_C6_REG_7 */
bf890a93 8965 { "xabort", { Skip_MODRM, Ib }, 0 },
42164a71
L
8966 },
8967 {
8968 /* RM_C7_REG_7 */
376cd056 8969 { "xbeginT", { Skip_MODRM, Jdqw }, 0 },
42164a71 8970 },
b844680a 8971 {
1ceb70f8 8972 /* RM_0F01_REG_0 */
a4e78aa5 8973 { "enclv", { Skip_MODRM }, 0 },
bf890a93
IT
8974 { "vmcall", { Skip_MODRM }, 0 },
8975 { "vmlaunch", { Skip_MODRM }, 0 },
8976 { "vmresume", { Skip_MODRM }, 0 },
8977 { "vmxoff", { Skip_MODRM }, 0 },
be3a8dca 8978 { "pconfig", { Skip_MODRM }, 0 },
b844680a
L
8979 },
8980 {
1ceb70f8 8981 /* RM_0F01_REG_1 */
bf890a93
IT
8982 { "monitor", { { OP_Monitor, 0 } }, 0 },
8983 { "mwait", { { OP_Mwait, 0 } }, 0 },
8984 { "clac", { Skip_MODRM }, 0 },
8985 { "stac", { Skip_MODRM }, 0 },
81d54bb7
CL
8986 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_4) },
8987 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_5) },
8988 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_6) },
8989 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_7) },
b844680a 8990 },
475a2301
L
8991 {
8992 /* RM_0F01_REG_2 */
bf890a93
IT
8993 { "xgetbv", { Skip_MODRM }, 0 },
8994 { "xsetbv", { Skip_MODRM }, 0 },
8729a6f6
L
8995 { Bad_Opcode },
8996 { Bad_Opcode },
bf890a93
IT
8997 { "vmfunc", { Skip_MODRM }, 0 },
8998 { "xend", { Skip_MODRM }, 0 },
8999 { "xtest", { Skip_MODRM }, 0 },
9000 { "enclu", { Skip_MODRM }, 0 },
475a2301 9001 },
b844680a 9002 {
1ceb70f8 9003 /* RM_0F01_REG_3 */
bf890a93 9004 { "vmrun", { Skip_MODRM }, 0 },
a847e322 9005 { PREFIX_TABLE (PREFIX_0F01_REG_3_RM_1) },
bf890a93
IT
9006 { "vmload", { Skip_MODRM }, 0 },
9007 { "vmsave", { Skip_MODRM }, 0 },
9008 { "stgi", { Skip_MODRM }, 0 },
9009 { "clgi", { Skip_MODRM }, 0 },
9010 { "skinit", { Skip_MODRM }, 0 },
9011 { "invlpga", { Skip_MODRM }, 0 },
4e7d34a6 9012 },
8eab4136 9013 {
f8687e93
JB
9014 /* RM_0F01_REG_5_MOD_3 */
9015 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_0) },
bb651e8b 9016 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_1) },
f8687e93 9017 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_2) },
8eab4136 9018 { Bad_Opcode },
f64c42a9
LC
9019 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_4) },
9020 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_5) },
9021 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_6) },
9022 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_7) },
8eab4136 9023 },
4e7d34a6 9024 {
f8687e93 9025 /* RM_0F01_REG_7_MOD_3 */
bf890a93
IT
9026 { "swapgs", { Skip_MODRM }, 0 },
9027 { "rdtscp", { Skip_MODRM }, 0 },
267b8516 9028 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_2) },
035e7389 9029 { "mwaitx", { { OP_Mwait, eBX_reg } }, PREFIX_OPCODE },
bf890a93 9030 { "clzero", { Skip_MODRM }, 0 },
142861df 9031 { "rdpru", { Skip_MODRM }, 0 },
646cc3e0
GG
9032 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_6) },
9033 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_7) },
b844680a 9034 },
603555e5 9035 {
f8687e93 9036 /* RM_0F1E_P_1_MOD_3_REG_7 */
603555e5
L
9037 { "nopQ", { Ev }, 0 },
9038 { "nopQ", { Ev }, 0 },
9039 { "endbr64", { Skip_MODRM }, PREFIX_OPCODE },
9040 { "endbr32", { Skip_MODRM }, PREFIX_OPCODE },
9041 { "nopQ", { Ev }, 0 },
9042 { "nopQ", { Ev }, 0 },
9043 { "nopQ", { Ev }, 0 },
9044 { "nopQ", { Ev }, 0 },
9045 },
c1fa250a
LC
9046 {
9047 /* RM_0F3A0F_P_1_MOD_3_REG_0 */
9048 { "hreset", { Skip_MODRM, Ib }, 0 },
9049 },
b844680a 9050 {
f8687e93 9051 /* RM_0FAE_REG_6_MOD_3 */
bf890a93 9052 { "mfence", { Skip_MODRM }, 0 },
b844680a 9053 },
bbedc832 9054 {
f8687e93 9055 /* RM_0FAE_REG_7_MOD_3 */
b5cefcca
L
9056 { "sfence", { Skip_MODRM }, 0 },
9057
144c41d9 9058 },
260cd341
LC
9059 {
9060 /* RM_VEX_0F3849_X86_64_P_0_W_0_M_1_R_0 */
9061 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_0_W_0_M_1_REG_0_RM_0) },
9062 },
b844680a
L
9063};
9064
c608c12e
AM
9065#define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
9066
f16cd0d5
L
9067/* We use the high bit to indicate different name for the same
9068 prefix. */
f16cd0d5 9069#define REP_PREFIX (0xf3 | 0x100)
42164a71
L
9070#define XACQUIRE_PREFIX (0xf2 | 0x200)
9071#define XRELEASE_PREFIX (0xf3 | 0x400)
7e8b059b 9072#define BND_PREFIX (0xf2 | 0x400)
04ef582a 9073#define NOTRACK_PREFIX (0x3e | 0x100)
f16cd0d5 9074
1d67fe3b
TT
9075/* Remember if the current op is a jump instruction. */
9076static bfd_boolean op_is_jump = FALSE;
9077
f16cd0d5 9078static int
26ca5450 9079ckprefix (void)
252b5132 9080{
f16cd0d5 9081 int newrex, i, length;
52b15da3 9082 rex = 0;
252b5132 9083 prefixes = 0;
7d421014 9084 used_prefixes = 0;
52b15da3 9085 rex_used = 0;
f16cd0d5
L
9086 last_lock_prefix = -1;
9087 last_repz_prefix = -1;
9088 last_repnz_prefix = -1;
9089 last_data_prefix = -1;
9090 last_addr_prefix = -1;
9091 last_rex_prefix = -1;
9092 last_seg_prefix = -1;
d9949a36 9093 fwait_prefix = -1;
285ca992 9094 active_seg_prefix = 0;
f310f33d
L
9095 for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
9096 all_prefixes[i] = 0;
9097 i = 0;
f16cd0d5
L
9098 length = 0;
9099 /* The maximum instruction length is 15bytes. */
9100 while (length < MAX_CODE_LENGTH - 1)
252b5132
RH
9101 {
9102 FETCH_DATA (the_info, codep + 1);
52b15da3 9103 newrex = 0;
252b5132
RH
9104 switch (*codep)
9105 {
52b15da3
JH
9106 /* REX prefixes family. */
9107 case 0x40:
9108 case 0x41:
9109 case 0x42:
9110 case 0x43:
9111 case 0x44:
9112 case 0x45:
9113 case 0x46:
9114 case 0x47:
9115 case 0x48:
9116 case 0x49:
9117 case 0x4a:
9118 case 0x4b:
9119 case 0x4c:
9120 case 0x4d:
9121 case 0x4e:
9122 case 0x4f:
f16cd0d5
L
9123 if (address_mode == mode_64bit)
9124 newrex = *codep;
9125 else
9126 return 1;
9127 last_rex_prefix = i;
52b15da3 9128 break;
252b5132
RH
9129 case 0xf3:
9130 prefixes |= PREFIX_REPZ;
f16cd0d5 9131 last_repz_prefix = i;
252b5132
RH
9132 break;
9133 case 0xf2:
9134 prefixes |= PREFIX_REPNZ;
f16cd0d5 9135 last_repnz_prefix = i;
252b5132
RH
9136 break;
9137 case 0xf0:
9138 prefixes |= PREFIX_LOCK;
f16cd0d5 9139 last_lock_prefix = i;
252b5132
RH
9140 break;
9141 case 0x2e:
9142 prefixes |= PREFIX_CS;
f16cd0d5 9143 last_seg_prefix = i;
0fa0fc85
BP
9144
9145 if (address_mode != mode_64bit)
9146 active_seg_prefix = PREFIX_CS;
9147
252b5132
RH
9148 break;
9149 case 0x36:
9150 prefixes |= PREFIX_SS;
f16cd0d5 9151 last_seg_prefix = i;
0fa0fc85
BP
9152
9153 if (address_mode != mode_64bit)
9154 active_seg_prefix = PREFIX_SS;
9155
252b5132
RH
9156 break;
9157 case 0x3e:
9158 prefixes |= PREFIX_DS;
f16cd0d5 9159 last_seg_prefix = i;
0fa0fc85
BP
9160
9161 if (address_mode != mode_64bit)
9162 active_seg_prefix = PREFIX_DS;
9163
252b5132
RH
9164 break;
9165 case 0x26:
9166 prefixes |= PREFIX_ES;
f16cd0d5 9167 last_seg_prefix = i;
0fa0fc85
BP
9168
9169 if (address_mode != mode_64bit)
9170 active_seg_prefix = PREFIX_ES;
9171
252b5132
RH
9172 break;
9173 case 0x64:
9174 prefixes |= PREFIX_FS;
f16cd0d5 9175 last_seg_prefix = i;
285ca992 9176 active_seg_prefix = PREFIX_FS;
252b5132
RH
9177 break;
9178 case 0x65:
9179 prefixes |= PREFIX_GS;
f16cd0d5 9180 last_seg_prefix = i;
285ca992 9181 active_seg_prefix = PREFIX_GS;
252b5132
RH
9182 break;
9183 case 0x66:
9184 prefixes |= PREFIX_DATA;
f16cd0d5 9185 last_data_prefix = i;
252b5132
RH
9186 break;
9187 case 0x67:
9188 prefixes |= PREFIX_ADDR;
f16cd0d5 9189 last_addr_prefix = i;
252b5132 9190 break;
5076851f 9191 case FWAIT_OPCODE:
252b5132
RH
9192 /* fwait is really an instruction. If there are prefixes
9193 before the fwait, they belong to the fwait, *not* to the
9194 following instruction. */
d9949a36 9195 fwait_prefix = i;
3e7d61b2 9196 if (prefixes || rex)
252b5132
RH
9197 {
9198 prefixes |= PREFIX_FWAIT;
9199 codep++;
6c067bbb
RM
9200 /* This ensures that the previous REX prefixes are noticed
9201 as unused prefixes, as in the return case below. */
9202 rex_used = rex;
f16cd0d5 9203 return 1;
252b5132
RH
9204 }
9205 prefixes = PREFIX_FWAIT;
9206 break;
9207 default:
f16cd0d5 9208 return 1;
252b5132 9209 }
52b15da3
JH
9210 /* Rex is ignored when followed by another prefix. */
9211 if (rex)
9212 {
3e7d61b2 9213 rex_used = rex;
f16cd0d5 9214 return 1;
52b15da3 9215 }
f16cd0d5 9216 if (*codep != FWAIT_OPCODE)
4e9ac44a 9217 all_prefixes[i++] = *codep;
52b15da3 9218 rex = newrex;
252b5132 9219 codep++;
f16cd0d5
L
9220 length++;
9221 }
9222 return 0;
9223}
9224
7d421014
ILT
9225/* Return the name of the prefix byte PREF, or NULL if PREF is not a
9226 prefix byte. */
9227
9228static const char *
26ca5450 9229prefix_name (int pref, int sizeflag)
7d421014 9230{
0003779b
L
9231 static const char *rexes [16] =
9232 {
9233 "rex", /* 0x40 */
9234 "rex.B", /* 0x41 */
9235 "rex.X", /* 0x42 */
9236 "rex.XB", /* 0x43 */
9237 "rex.R", /* 0x44 */
9238 "rex.RB", /* 0x45 */
9239 "rex.RX", /* 0x46 */
9240 "rex.RXB", /* 0x47 */
9241 "rex.W", /* 0x48 */
9242 "rex.WB", /* 0x49 */
9243 "rex.WX", /* 0x4a */
9244 "rex.WXB", /* 0x4b */
9245 "rex.WR", /* 0x4c */
9246 "rex.WRB", /* 0x4d */
9247 "rex.WRX", /* 0x4e */
9248 "rex.WRXB", /* 0x4f */
9249 };
9250
7d421014
ILT
9251 switch (pref)
9252 {
52b15da3
JH
9253 /* REX prefixes family. */
9254 case 0x40:
52b15da3 9255 case 0x41:
52b15da3 9256 case 0x42:
52b15da3 9257 case 0x43:
52b15da3 9258 case 0x44:
52b15da3 9259 case 0x45:
52b15da3 9260 case 0x46:
52b15da3 9261 case 0x47:
52b15da3 9262 case 0x48:
52b15da3 9263 case 0x49:
52b15da3 9264 case 0x4a:
52b15da3 9265 case 0x4b:
52b15da3 9266 case 0x4c:
52b15da3 9267 case 0x4d:
52b15da3 9268 case 0x4e:
52b15da3 9269 case 0x4f:
0003779b 9270 return rexes [pref - 0x40];
7d421014
ILT
9271 case 0xf3:
9272 return "repz";
9273 case 0xf2:
9274 return "repnz";
9275 case 0xf0:
9276 return "lock";
9277 case 0x2e:
9278 return "cs";
9279 case 0x36:
9280 return "ss";
9281 case 0x3e:
9282 return "ds";
9283 case 0x26:
9284 return "es";
9285 case 0x64:
9286 return "fs";
9287 case 0x65:
9288 return "gs";
9289 case 0x66:
9290 return (sizeflag & DFLAG) ? "data16" : "data32";
9291 case 0x67:
cb712a9e 9292 if (address_mode == mode_64bit)
db6eb5be 9293 return (sizeflag & AFLAG) ? "addr32" : "addr64";
c1a64871 9294 else
2888cb7a 9295 return (sizeflag & AFLAG) ? "addr16" : "addr32";
7d421014
ILT
9296 case FWAIT_OPCODE:
9297 return "fwait";
f16cd0d5
L
9298 case REP_PREFIX:
9299 return "rep";
42164a71
L
9300 case XACQUIRE_PREFIX:
9301 return "xacquire";
9302 case XRELEASE_PREFIX:
9303 return "xrelease";
7e8b059b
L
9304 case BND_PREFIX:
9305 return "bnd";
04ef582a
L
9306 case NOTRACK_PREFIX:
9307 return "notrack";
7d421014
ILT
9308 default:
9309 return NULL;
9310 }
9311}
9312
ce518a5f
L
9313static char op_out[MAX_OPERANDS][100];
9314static int op_ad, op_index[MAX_OPERANDS];
1d9f512f 9315static int two_source_ops;
ce518a5f
L
9316static bfd_vma op_address[MAX_OPERANDS];
9317static bfd_vma op_riprel[MAX_OPERANDS];
52b15da3 9318static bfd_vma start_pc;
ce518a5f 9319
252b5132
RH
9320/*
9321 * On the 386's of 1988, the maximum length of an instruction is 15 bytes.
9322 * (see topic "Redundant prefixes" in the "Differences from 8086"
9323 * section of the "Virtual 8086 Mode" chapter.)
9324 * 'pc' should be the address of this instruction, it will
9325 * be used to print the target address if this is a relative jump or call
9326 * The function returns the length of this instruction in bytes.
9327 */
9328
252b5132 9329static char intel_syntax;
9d141669 9330static char intel_mnemonic = !SYSV386_COMPAT;
252b5132
RH
9331static char open_char;
9332static char close_char;
9333static char separator_char;
9334static char scale_char;
9335
5db04b09
L
9336enum x86_64_isa
9337{
d835a58b 9338 amd64 = 1,
5db04b09
L
9339 intel64
9340};
9341
9342static enum x86_64_isa isa64;
9343
e396998b
AM
9344/* Here for backwards compatibility. When gdb stops using
9345 print_insn_i386_att and print_insn_i386_intel these functions can
9346 disappear, and print_insn_i386 be merged into print_insn. */
252b5132 9347int
26ca5450 9348print_insn_i386_att (bfd_vma pc, disassemble_info *info)
252b5132
RH
9349{
9350 intel_syntax = 0;
e396998b
AM
9351
9352 return print_insn (pc, info);
252b5132
RH
9353}
9354
9355int
26ca5450 9356print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
252b5132
RH
9357{
9358 intel_syntax = 1;
e396998b
AM
9359
9360 return print_insn (pc, info);
252b5132
RH
9361}
9362
e396998b 9363int
26ca5450 9364print_insn_i386 (bfd_vma pc, disassemble_info *info)
e396998b
AM
9365{
9366 intel_syntax = -1;
9367
9368 return print_insn (pc, info);
9369}
9370
f59a29b9
L
9371void
9372print_i386_disassembler_options (FILE *stream)
9373{
9374 fprintf (stream, _("\n\
9375The following i386/x86-64 specific disassembler options are supported for use\n\
9376with the -M switch (multiple options should be separated by commas):\n"));
9377
9378 fprintf (stream, _(" x86-64 Disassemble in 64bit mode\n"));
9379 fprintf (stream, _(" i386 Disassemble in 32bit mode\n"));
9380 fprintf (stream, _(" i8086 Disassemble in 16bit mode\n"));
9381 fprintf (stream, _(" att Display instruction in AT&T syntax\n"));
9382 fprintf (stream, _(" intel Display instruction in Intel syntax\n"));
9d141669
L
9383 fprintf (stream, _(" att-mnemonic\n"
9384 " Display instruction in AT&T mnemonic\n"));
9385 fprintf (stream, _(" intel-mnemonic\n"
9386 " Display instruction in Intel mnemonic\n"));
f59a29b9
L
9387 fprintf (stream, _(" addr64 Assume 64bit address size\n"));
9388 fprintf (stream, _(" addr32 Assume 32bit address size\n"));
9389 fprintf (stream, _(" addr16 Assume 16bit address size\n"));
9390 fprintf (stream, _(" data32 Assume 32bit data size\n"));
9391 fprintf (stream, _(" data16 Assume 16bit data size\n"));
9392 fprintf (stream, _(" suffix Always display instruction suffix in AT&T syntax\n"));
5db04b09
L
9393 fprintf (stream, _(" amd64 Display instruction in AMD64 ISA\n"));
9394 fprintf (stream, _(" intel64 Display instruction in Intel64 ISA\n"));
f59a29b9
L
9395}
9396
592d1631 9397/* Bad opcode. */
bf890a93 9398static const struct dis386 bad_opcode = { "(bad)", { XX }, 0 };
592d1631 9399
b844680a
L
9400/* Get a pointer to struct dis386 with a valid name. */
9401
9402static const struct dis386 *
8bb15339 9403get_valid_dis386 (const struct dis386 *dp, disassemble_info *info)
b844680a 9404{
91d6fa6a 9405 int vindex, vex_table_index;
b844680a
L
9406
9407 if (dp->name != NULL)
9408 return dp;
9409
9410 switch (dp->op[0].bytemode)
9411 {
1ceb70f8
L
9412 case USE_REG_TABLE:
9413 dp = &reg_table[dp->op[1].bytemode][modrm.reg];
9414 break;
9415
9416 case USE_MOD_TABLE:
91d6fa6a
NC
9417 vindex = modrm.mod == 0x3 ? 1 : 0;
9418 dp = &mod_table[dp->op[1].bytemode][vindex];
1ceb70f8
L
9419 break;
9420
9421 case USE_RM_TABLE:
9422 dp = &rm_table[dp->op[1].bytemode][modrm.rm];
b844680a
L
9423 break;
9424
4e7d34a6 9425 case USE_PREFIX_TABLE:
c0f3af97 9426 if (need_vex)
b844680a 9427 {
c0f3af97
L
9428 /* The prefix in VEX is implicit. */
9429 switch (vex.prefix)
9430 {
9431 case 0:
91d6fa6a 9432 vindex = 0;
c0f3af97
L
9433 break;
9434 case REPE_PREFIX_OPCODE:
91d6fa6a 9435 vindex = 1;
c0f3af97
L
9436 break;
9437 case DATA_PREFIX_OPCODE:
91d6fa6a 9438 vindex = 2;
c0f3af97
L
9439 break;
9440 case REPNE_PREFIX_OPCODE:
91d6fa6a 9441 vindex = 3;
c0f3af97
L
9442 break;
9443 default:
9444 abort ();
9445 break;
9446 }
b844680a 9447 }
7bb15c6f 9448 else
b844680a 9449 {
285ca992
L
9450 int last_prefix = -1;
9451 int prefix = 0;
91d6fa6a 9452 vindex = 0;
285ca992
L
9453 /* We check PREFIX_REPNZ and PREFIX_REPZ before PREFIX_DATA.
9454 When there are multiple PREFIX_REPNZ and PREFIX_REPZ, the
9455 last one wins. */
9456 if ((prefixes & (PREFIX_REPZ | PREFIX_REPNZ)) != 0)
b844680a 9457 {
285ca992 9458 if (last_repz_prefix > last_repnz_prefix)
c0f3af97 9459 {
285ca992
L
9460 vindex = 1;
9461 prefix = PREFIX_REPZ;
9462 last_prefix = last_repz_prefix;
c0f3af97
L
9463 }
9464 else
b844680a 9465 {
285ca992
L
9466 vindex = 3;
9467 prefix = PREFIX_REPNZ;
9468 last_prefix = last_repnz_prefix;
b844680a 9469 }
285ca992 9470
507bd325
L
9471 /* Check if prefix should be ignored. */
9472 if ((((prefix_table[dp->op[1].bytemode][vindex].prefix_requirement
9473 & PREFIX_IGNORED) >> PREFIX_IGNORED_SHIFT)
9474 & prefix) != 0)
285ca992
L
9475 vindex = 0;
9476 }
9477
9478 if (vindex == 0 && (prefixes & PREFIX_DATA) != 0)
9479 {
9480 vindex = 2;
9481 prefix = PREFIX_DATA;
9482 last_prefix = last_data_prefix;
9483 }
9484
9485 if (vindex != 0)
9486 {
9487 used_prefixes |= prefix;
9488 all_prefixes[last_prefix] = 0;
b844680a
L
9489 }
9490 }
91d6fa6a 9491 dp = &prefix_table[dp->op[1].bytemode][vindex];
b844680a
L
9492 break;
9493
4e7d34a6 9494 case USE_X86_64_TABLE:
91d6fa6a
NC
9495 vindex = address_mode == mode_64bit ? 1 : 0;
9496 dp = &x86_64_table[dp->op[1].bytemode][vindex];
b844680a
L
9497 break;
9498
4e7d34a6 9499 case USE_3BYTE_TABLE:
8bb15339 9500 FETCH_DATA (info, codep + 2);
91d6fa6a
NC
9501 vindex = *codep++;
9502 dp = &three_byte_table[dp->op[1].bytemode][vindex];
285ca992 9503 end_codep = codep;
8bb15339
L
9504 modrm.mod = (*codep >> 6) & 3;
9505 modrm.reg = (*codep >> 3) & 7;
9506 modrm.rm = *codep & 7;
9507 break;
9508
c0f3af97
L
9509 case USE_VEX_LEN_TABLE:
9510 if (!need_vex)
9511 abort ();
9512
9513 switch (vex.length)
9514 {
9515 case 128:
91d6fa6a 9516 vindex = 0;
c0f3af97
L
9517 break;
9518 case 256:
91d6fa6a 9519 vindex = 1;
c0f3af97
L
9520 break;
9521 default:
9522 abort ();
9523 break;
9524 }
9525
91d6fa6a 9526 dp = &vex_len_table[dp->op[1].bytemode][vindex];
c0f3af97
L
9527 break;
9528
04e2a182
L
9529 case USE_EVEX_LEN_TABLE:
9530 if (!vex.evex)
9531 abort ();
9532
9533 switch (vex.length)
9534 {
9535 case 128:
9536 vindex = 0;
9537 break;
9538 case 256:
9539 vindex = 1;
9540 break;
9541 case 512:
9542 vindex = 2;
9543 break;
9544 default:
9545 abort ();
9546 break;
9547 }
9548
9549 dp = &evex_len_table[dp->op[1].bytemode][vindex];
9550 break;
9551
f88c9eb0
SP
9552 case USE_XOP_8F_TABLE:
9553 FETCH_DATA (info, codep + 3);
f88c9eb0
SP
9554 rex = ~(*codep >> 5) & 0x7;
9555
9556 /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm". */
9557 switch ((*codep & 0x1f))
9558 {
9559 default:
f07af43e
L
9560 dp = &bad_opcode;
9561 return dp;
5dd85c99
SP
9562 case 0x8:
9563 vex_table_index = XOP_08;
9564 break;
f88c9eb0
SP
9565 case 0x9:
9566 vex_table_index = XOP_09;
9567 break;
9568 case 0xa:
9569 vex_table_index = XOP_0A;
9570 break;
9571 }
9572 codep++;
9573 vex.w = *codep & 0x80;
9574 if (vex.w && address_mode == mode_64bit)
9575 rex |= REX_W;
9576
9577 vex.register_specifier = (~(*codep >> 3)) & 0xf;
abfcb414 9578 if (address_mode != mode_64bit)
f07af43e 9579 {
abfcb414
AP
9580 /* In 16/32-bit mode REX_B is silently ignored. */
9581 rex &= ~REX_B;
f07af43e 9582 }
f88c9eb0
SP
9583
9584 vex.length = (*codep & 0x4) ? 256 : 128;
9585 switch ((*codep & 0x3))
9586 {
9587 case 0:
f88c9eb0
SP
9588 break;
9589 case 1:
9590 vex.prefix = DATA_PREFIX_OPCODE;
9591 break;
9592 case 2:
9593 vex.prefix = REPE_PREFIX_OPCODE;
9594 break;
9595 case 3:
9596 vex.prefix = REPNE_PREFIX_OPCODE;
9597 break;
9598 }
9599 need_vex = 1;
f88c9eb0 9600 codep++;
91d6fa6a
NC
9601 vindex = *codep++;
9602 dp = &xop_table[vex_table_index][vindex];
c48244a5 9603
285ca992 9604 end_codep = codep;
c48244a5
SP
9605 FETCH_DATA (info, codep + 1);
9606 modrm.mod = (*codep >> 6) & 3;
9607 modrm.reg = (*codep >> 3) & 7;
9608 modrm.rm = *codep & 7;
b5b098c2
JB
9609
9610 /* No XOP encoding so far allows for a non-zero embedded prefix. Avoid
9611 having to decode the bits for every otherwise valid encoding. */
9612 if (vex.prefix)
9613 return &bad_opcode;
f88c9eb0
SP
9614 break;
9615
c0f3af97 9616 case USE_VEX_C4_TABLE:
43234a1e 9617 /* VEX prefix. */
c0f3af97 9618 FETCH_DATA (info, codep + 3);
c0f3af97
L
9619 rex = ~(*codep >> 5) & 0x7;
9620 switch ((*codep & 0x1f))
9621 {
9622 default:
f07af43e
L
9623 dp = &bad_opcode;
9624 return dp;
c0f3af97 9625 case 0x1:
f88c9eb0 9626 vex_table_index = VEX_0F;
c0f3af97
L
9627 break;
9628 case 0x2:
f88c9eb0 9629 vex_table_index = VEX_0F38;
c0f3af97
L
9630 break;
9631 case 0x3:
f88c9eb0 9632 vex_table_index = VEX_0F3A;
c0f3af97
L
9633 break;
9634 }
9635 codep++;
9636 vex.w = *codep & 0x80;
9889cbb1 9637 if (address_mode == mode_64bit)
f07af43e 9638 {
9889cbb1
L
9639 if (vex.w)
9640 rex |= REX_W;
9889cbb1
L
9641 }
9642 else
9643 {
9644 /* For the 3-byte VEX prefix in 32-bit mode, the REX_B bit
9645 is ignored, other REX bits are 0 and the highest bit in
5f847646 9646 VEX.vvvv is also ignored (but we mustn't clear it here). */
9889cbb1 9647 rex = 0;
f07af43e 9648 }
5f847646 9649 vex.register_specifier = (~(*codep >> 3)) & 0xf;
c0f3af97
L
9650 vex.length = (*codep & 0x4) ? 256 : 128;
9651 switch ((*codep & 0x3))
9652 {
9653 case 0:
c0f3af97
L
9654 break;
9655 case 1:
9656 vex.prefix = DATA_PREFIX_OPCODE;
9657 break;
9658 case 2:
9659 vex.prefix = REPE_PREFIX_OPCODE;
9660 break;
9661 case 3:
9662 vex.prefix = REPNE_PREFIX_OPCODE;
9663 break;
9664 }
9665 need_vex = 1;
c0f3af97 9666 codep++;
91d6fa6a
NC
9667 vindex = *codep++;
9668 dp = &vex_table[vex_table_index][vindex];
285ca992 9669 end_codep = codep;
53c4d625
JB
9670 /* There is no MODRM byte for VEX0F 77. */
9671 if (vex_table_index != VEX_0F || vindex != 0x77)
c0f3af97
L
9672 {
9673 FETCH_DATA (info, codep + 1);
9674 modrm.mod = (*codep >> 6) & 3;
9675 modrm.reg = (*codep >> 3) & 7;
9676 modrm.rm = *codep & 7;
9677 }
9678 break;
9679
9680 case USE_VEX_C5_TABLE:
43234a1e 9681 /* VEX prefix. */
c0f3af97 9682 FETCH_DATA (info, codep + 2);
c0f3af97
L
9683 rex = (*codep & 0x80) ? 0 : REX_R;
9684
9889cbb1
L
9685 /* For the 2-byte VEX prefix in 32-bit mode, the highest bit in
9686 VEX.vvvv is 1. */
c0f3af97 9687 vex.register_specifier = (~(*codep >> 3)) & 0xf;
c0f3af97
L
9688 vex.length = (*codep & 0x4) ? 256 : 128;
9689 switch ((*codep & 0x3))
9690 {
9691 case 0:
c0f3af97
L
9692 break;
9693 case 1:
9694 vex.prefix = DATA_PREFIX_OPCODE;
9695 break;
9696 case 2:
9697 vex.prefix = REPE_PREFIX_OPCODE;
9698 break;
9699 case 3:
9700 vex.prefix = REPNE_PREFIX_OPCODE;
9701 break;
9702 }
9703 need_vex = 1;
c0f3af97 9704 codep++;
91d6fa6a
NC
9705 vindex = *codep++;
9706 dp = &vex_table[dp->op[1].bytemode][vindex];
285ca992 9707 end_codep = codep;
53c4d625
JB
9708 /* There is no MODRM byte for VEX 77. */
9709 if (vindex != 0x77)
c0f3af97
L
9710 {
9711 FETCH_DATA (info, codep + 1);
9712 modrm.mod = (*codep >> 6) & 3;
9713 modrm.reg = (*codep >> 3) & 7;
9714 modrm.rm = *codep & 7;
9715 }
9716 break;
9717
9e30b8e0
L
9718 case USE_VEX_W_TABLE:
9719 if (!need_vex)
9720 abort ();
9721
9722 dp = &vex_w_table[dp->op[1].bytemode][vex.w ? 1 : 0];
9723 break;
9724
43234a1e
L
9725 case USE_EVEX_TABLE:
9726 two_source_ops = 0;
9727 /* EVEX prefix. */
9728 vex.evex = 1;
9729 FETCH_DATA (info, codep + 4);
43234a1e
L
9730 /* The first byte after 0x62. */
9731 rex = ~(*codep >> 5) & 0x7;
9732 vex.r = *codep & 0x10;
9733 switch ((*codep & 0xf))
9734 {
9735 default:
9736 return &bad_opcode;
9737 case 0x1:
9738 vex_table_index = EVEX_0F;
9739 break;
9740 case 0x2:
9741 vex_table_index = EVEX_0F38;
9742 break;
9743 case 0x3:
9744 vex_table_index = EVEX_0F3A;
9745 break;
9746 }
9747
9748 /* The second byte after 0x62. */
9749 codep++;
9750 vex.w = *codep & 0x80;
9751 if (vex.w && address_mode == mode_64bit)
9752 rex |= REX_W;
9753
9754 vex.register_specifier = (~(*codep >> 3)) & 0xf;
43234a1e
L
9755
9756 /* The U bit. */
9757 if (!(*codep & 0x4))
9758 return &bad_opcode;
9759
9760 switch ((*codep & 0x3))
9761 {
9762 case 0:
43234a1e
L
9763 break;
9764 case 1:
9765 vex.prefix = DATA_PREFIX_OPCODE;
9766 break;
9767 case 2:
9768 vex.prefix = REPE_PREFIX_OPCODE;
9769 break;
9770 case 3:
9771 vex.prefix = REPNE_PREFIX_OPCODE;
9772 break;
9773 }
9774
9775 /* The third byte after 0x62. */
9776 codep++;
9777
9778 /* Remember the static rounding bits. */
9779 vex.ll = (*codep >> 5) & 3;
9780 vex.b = (*codep & 0x10) != 0;
9781
9782 vex.v = *codep & 0x8;
9783 vex.mask_register_specifier = *codep & 0x7;
9784 vex.zeroing = *codep & 0x80;
9785
5f847646
JB
9786 if (address_mode != mode_64bit)
9787 {
9788 /* In 16/32-bit mode silently ignore following bits. */
9789 rex &= ~REX_B;
9790 vex.r = 1;
9791 vex.v = 1;
9792 }
9793
43234a1e 9794 need_vex = 1;
43234a1e
L
9795 codep++;
9796 vindex = *codep++;
9797 dp = &evex_table[vex_table_index][vindex];
285ca992 9798 end_codep = codep;
43234a1e
L
9799 FETCH_DATA (info, codep + 1);
9800 modrm.mod = (*codep >> 6) & 3;
9801 modrm.reg = (*codep >> 3) & 7;
9802 modrm.rm = *codep & 7;
9803
9804 /* Set vector length. */
9805 if (modrm.mod == 3 && vex.b)
9806 vex.length = 512;
9807 else
9808 {
9809 switch (vex.ll)
9810 {
9811 case 0x0:
9812 vex.length = 128;
9813 break;
9814 case 0x1:
9815 vex.length = 256;
9816 break;
9817 case 0x2:
9818 vex.length = 512;
9819 break;
9820 default:
9821 return &bad_opcode;
9822 }
9823 }
9824 break;
9825
592d1631
L
9826 case 0:
9827 dp = &bad_opcode;
9828 break;
9829
b844680a 9830 default:
d34b5006 9831 abort ();
b844680a
L
9832 }
9833
9834 if (dp->name != NULL)
9835 return dp;
9836 else
8bb15339 9837 return get_valid_dis386 (dp, info);
b844680a
L
9838}
9839
dfc8cf43 9840static void
55cf16e1 9841get_sib (disassemble_info *info, int sizeflag)
dfc8cf43
L
9842{
9843 /* If modrm.mod == 3, operand must be register. */
9844 if (need_modrm
55cf16e1 9845 && ((sizeflag & AFLAG) || address_mode == mode_64bit)
dfc8cf43
L
9846 && modrm.mod != 3
9847 && modrm.rm == 4)
9848 {
9849 FETCH_DATA (info, codep + 2);
9850 sib.index = (codep [1] >> 3) & 7;
9851 sib.scale = (codep [1] >> 6) & 3;
9852 sib.base = codep [1] & 7;
9853 }
9854}
9855
e396998b 9856static int
26ca5450 9857print_insn (bfd_vma pc, disassemble_info *info)
252b5132 9858{
2da11e11 9859 const struct dis386 *dp;
252b5132 9860 int i;
ce518a5f 9861 char *op_txt[MAX_OPERANDS];
252b5132 9862 int needcomma;
df18fdba 9863 int sizeflag, orig_sizeflag;
e396998b 9864 const char *p;
252b5132 9865 struct dis_private priv;
f16cd0d5 9866 int prefix_length;
252b5132 9867
d7921315
L
9868 priv.orig_sizeflag = AFLAG | DFLAG;
9869 if ((info->mach & bfd_mach_i386_i386) != 0)
cb712a9e 9870 address_mode = mode_32bit;
2da11e11 9871 else if (info->mach == bfd_mach_i386_i8086)
d7921315
L
9872 {
9873 address_mode = mode_16bit;
9874 priv.orig_sizeflag = 0;
9875 }
2da11e11 9876 else
d7921315
L
9877 address_mode = mode_64bit;
9878
9879 if (intel_syntax == (char) -1)
9880 intel_syntax = (info->mach & bfd_mach_i386_intel_syntax) != 0;
e396998b
AM
9881
9882 for (p = info->disassembler_options; p != NULL; )
9883 {
5db04b09
L
9884 if (CONST_STRNEQ (p, "amd64"))
9885 isa64 = amd64;
9886 else if (CONST_STRNEQ (p, "intel64"))
9887 isa64 = intel64;
9888 else if (CONST_STRNEQ (p, "x86-64"))
e396998b 9889 {
cb712a9e 9890 address_mode = mode_64bit;
2a1bb84c 9891 priv.orig_sizeflag |= AFLAG | DFLAG;
e396998b 9892 }
0112cd26 9893 else if (CONST_STRNEQ (p, "i386"))
e396998b 9894 {
cb712a9e 9895 address_mode = mode_32bit;
2a1bb84c 9896 priv.orig_sizeflag |= AFLAG | DFLAG;
e396998b 9897 }
0112cd26 9898 else if (CONST_STRNEQ (p, "i8086"))
e396998b 9899 {
cb712a9e 9900 address_mode = mode_16bit;
2a1bb84c 9901 priv.orig_sizeflag &= ~(AFLAG | DFLAG);
e396998b 9902 }
0112cd26 9903 else if (CONST_STRNEQ (p, "intel"))
e396998b
AM
9904 {
9905 intel_syntax = 1;
9d141669
L
9906 if (CONST_STRNEQ (p + 5, "-mnemonic"))
9907 intel_mnemonic = 1;
e396998b 9908 }
0112cd26 9909 else if (CONST_STRNEQ (p, "att"))
e396998b
AM
9910 {
9911 intel_syntax = 0;
9d141669
L
9912 if (CONST_STRNEQ (p + 3, "-mnemonic"))
9913 intel_mnemonic = 0;
e396998b 9914 }
0112cd26 9915 else if (CONST_STRNEQ (p, "addr"))
e396998b 9916 {
f59a29b9
L
9917 if (address_mode == mode_64bit)
9918 {
9919 if (p[4] == '3' && p[5] == '2')
9920 priv.orig_sizeflag &= ~AFLAG;
9921 else if (p[4] == '6' && p[5] == '4')
9922 priv.orig_sizeflag |= AFLAG;
9923 }
9924 else
9925 {
9926 if (p[4] == '1' && p[5] == '6')
9927 priv.orig_sizeflag &= ~AFLAG;
9928 else if (p[4] == '3' && p[5] == '2')
9929 priv.orig_sizeflag |= AFLAG;
9930 }
e396998b 9931 }
0112cd26 9932 else if (CONST_STRNEQ (p, "data"))
e396998b
AM
9933 {
9934 if (p[4] == '1' && p[5] == '6')
9935 priv.orig_sizeflag &= ~DFLAG;
9936 else if (p[4] == '3' && p[5] == '2')
9937 priv.orig_sizeflag |= DFLAG;
9938 }
0112cd26 9939 else if (CONST_STRNEQ (p, "suffix"))
e396998b
AM
9940 priv.orig_sizeflag |= SUFFIX_ALWAYS;
9941
9942 p = strchr (p, ',');
9943 if (p != NULL)
9944 p++;
9945 }
9946
c0f92bf9
L
9947 if (address_mode == mode_64bit && sizeof (bfd_vma) < 8)
9948 {
9949 (*info->fprintf_func) (info->stream,
9950 _("64-bit address is disabled"));
9951 return -1;
9952 }
9953
e396998b
AM
9954 if (intel_syntax)
9955 {
9956 names64 = intel_names64;
9957 names32 = intel_names32;
9958 names16 = intel_names16;
9959 names8 = intel_names8;
9960 names8rex = intel_names8rex;
9961 names_seg = intel_names_seg;
b9733481 9962 names_mm = intel_names_mm;
7e8b059b 9963 names_bnd = intel_names_bnd;
b9733481
L
9964 names_xmm = intel_names_xmm;
9965 names_ymm = intel_names_ymm;
43234a1e 9966 names_zmm = intel_names_zmm;
260cd341 9967 names_tmm = intel_names_tmm;
db51cc60
L
9968 index64 = intel_index64;
9969 index32 = intel_index32;
43234a1e 9970 names_mask = intel_names_mask;
e396998b
AM
9971 index16 = intel_index16;
9972 open_char = '[';
9973 close_char = ']';
9974 separator_char = '+';
9975 scale_char = '*';
9976 }
9977 else
9978 {
9979 names64 = att_names64;
9980 names32 = att_names32;
9981 names16 = att_names16;
9982 names8 = att_names8;
9983 names8rex = att_names8rex;
9984 names_seg = att_names_seg;
b9733481 9985 names_mm = att_names_mm;
7e8b059b 9986 names_bnd = att_names_bnd;
b9733481
L
9987 names_xmm = att_names_xmm;
9988 names_ymm = att_names_ymm;
43234a1e 9989 names_zmm = att_names_zmm;
260cd341 9990 names_tmm = att_names_tmm;
db51cc60
L
9991 index64 = att_index64;
9992 index32 = att_index32;
43234a1e 9993 names_mask = att_names_mask;
e396998b
AM
9994 index16 = att_index16;
9995 open_char = '(';
9996 close_char = ')';
9997 separator_char = ',';
9998 scale_char = ',';
9999 }
2da11e11 10000
4fe53c98 10001 /* The output looks better if we put 7 bytes on a line, since that
8a9036a4
L
10002 puts most long word instructions on a single line. Use 8 bytes
10003 for Intel L1OM. */
d7921315 10004 if ((info->mach & bfd_mach_l1om) != 0)
8a9036a4
L
10005 info->bytes_per_line = 8;
10006 else
10007 info->bytes_per_line = 7;
252b5132 10008
26ca5450 10009 info->private_data = &priv;
252b5132
RH
10010 priv.max_fetched = priv.the_buffer;
10011 priv.insn_start = pc;
252b5132
RH
10012
10013 obuf[0] = 0;
ce518a5f
L
10014 for (i = 0; i < MAX_OPERANDS; ++i)
10015 {
10016 op_out[i][0] = 0;
10017 op_index[i] = -1;
10018 }
252b5132
RH
10019
10020 the_info = info;
10021 start_pc = pc;
e396998b
AM
10022 start_codep = priv.the_buffer;
10023 codep = priv.the_buffer;
252b5132 10024
8df14d78 10025 if (OPCODES_SIGSETJMP (priv.bailout) != 0)
5076851f 10026 {
7d421014
ILT
10027 const char *name;
10028
5076851f 10029 /* Getting here means we tried for data but didn't get it. That
e396998b
AM
10030 means we have an incomplete instruction of some sort. Just
10031 print the first byte as a prefix or a .byte pseudo-op. */
10032 if (codep > priv.the_buffer)
5076851f 10033 {
e396998b 10034 name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
7d421014
ILT
10035 if (name != NULL)
10036 (*info->fprintf_func) (info->stream, "%s", name);
10037 else
5076851f 10038 {
7d421014
ILT
10039 /* Just print the first byte as a .byte instruction. */
10040 (*info->fprintf_func) (info->stream, ".byte 0x%x",
e396998b 10041 (unsigned int) priv.the_buffer[0]);
5076851f 10042 }
5076851f 10043
7d421014 10044 return 1;
5076851f
ILT
10045 }
10046
10047 return -1;
10048 }
10049
52b15da3 10050 obufp = obuf;
f16cd0d5
L
10051 sizeflag = priv.orig_sizeflag;
10052
10053 if (!ckprefix () || rex_used)
10054 {
10055 /* Too many prefixes or unused REX prefixes. */
10056 for (i = 0;
f6dd4781 10057 i < (int) ARRAY_SIZE (all_prefixes) && all_prefixes[i];
f16cd0d5 10058 i++)
de882298 10059 (*info->fprintf_func) (info->stream, "%s%s",
6c067bbb 10060 i == 0 ? "" : " ",
f16cd0d5 10061 prefix_name (all_prefixes[i], sizeflag));
de882298 10062 return i;
f16cd0d5 10063 }
252b5132
RH
10064
10065 insn_codep = codep;
10066
10067 FETCH_DATA (info, codep + 1);
10068 two_source_ops = (*codep == 0x62) || (*codep == 0xc8);
10069
3e7d61b2 10070 if (((prefixes & PREFIX_FWAIT)
f16cd0d5 10071 && ((*codep < 0xd8) || (*codep > 0xdf))))
252b5132 10072 {
86a80a50 10073 /* Handle prefixes before fwait. */
d9949a36 10074 for (i = 0; i < fwait_prefix && all_prefixes[i];
86a80a50
L
10075 i++)
10076 (*info->fprintf_func) (info->stream, "%s ",
10077 prefix_name (all_prefixes[i], sizeflag));
f16cd0d5 10078 (*info->fprintf_func) (info->stream, "fwait");
86a80a50 10079 return i + 1;
252b5132
RH
10080 }
10081
252b5132
RH
10082 if (*codep == 0x0f)
10083 {
eec0f4ca 10084 unsigned char threebyte;
5f40e14d
JS
10085
10086 codep++;
10087 FETCH_DATA (info, codep + 1);
10088 threebyte = *codep;
eec0f4ca 10089 dp = &dis386_twobyte[threebyte];
0e9f3bf1 10090 need_modrm = twobyte_has_modrm[threebyte];
eec0f4ca 10091 codep++;
252b5132
RH
10092 }
10093 else
10094 {
6439fc28 10095 dp = &dis386[*codep];
252b5132 10096 need_modrm = onebyte_has_modrm[*codep];
eec0f4ca 10097 codep++;
252b5132 10098 }
246c51aa 10099
df18fdba
L
10100 /* Save sizeflag for printing the extra prefixes later before updating
10101 it for mnemonic and operand processing. The prefix names depend
10102 only on the address mode. */
10103 orig_sizeflag = sizeflag;
c608c12e 10104 if (prefixes & PREFIX_ADDR)
df18fdba 10105 sizeflag ^= AFLAG;
b844680a 10106 if ((prefixes & PREFIX_DATA))
df18fdba 10107 sizeflag ^= DFLAG;
3ffd33cf 10108
285ca992 10109 end_codep = codep;
8bb15339 10110 if (need_modrm)
252b5132
RH
10111 {
10112 FETCH_DATA (info, codep + 1);
7967e09e
L
10113 modrm.mod = (*codep >> 6) & 3;
10114 modrm.reg = (*codep >> 3) & 7;
10115 modrm.rm = *codep & 7;
252b5132 10116 }
0e9f3bf1
L
10117 else
10118 memset (&modrm, 0, sizeof (modrm));
252b5132 10119
42d5f9c6 10120 need_vex = 0;
caf0678c 10121 memset (&vex, 0, sizeof (vex));
55b126d4 10122
ce518a5f 10123 if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
252b5132 10124 {
55cf16e1 10125 get_sib (info, sizeflag);
252b5132
RH
10126 dofloat (sizeflag);
10127 }
10128 else
10129 {
8bb15339 10130 dp = get_valid_dis386 (dp, info);
b844680a 10131 if (dp != NULL && putop (dp->name, sizeflag) == 0)
6c067bbb 10132 {
55cf16e1 10133 get_sib (info, sizeflag);
ce518a5f
L
10134 for (i = 0; i < MAX_OPERANDS; ++i)
10135 {
246c51aa 10136 obufp = op_out[i];
ce518a5f
L
10137 op_ad = MAX_OPERANDS - 1 - i;
10138 if (dp->op[i].rtn)
10139 (*dp->op[i].rtn) (dp->op[i].bytemode, sizeflag);
43234a1e
L
10140 /* For EVEX instruction after the last operand masking
10141 should be printed. */
10142 if (i == 0 && vex.evex)
10143 {
10144 /* Don't print {%k0}. */
10145 if (vex.mask_register_specifier)
10146 {
10147 oappend ("{");
10148 oappend (names_mask[vex.mask_register_specifier]);
10149 oappend ("}");
10150 }
10151 if (vex.zeroing)
10152 oappend ("{z}");
10153 }
ce518a5f 10154 }
6439fc28 10155 }
252b5132
RH
10156 }
10157
1d67fe3b
TT
10158 /* Clear instruction information. */
10159 if (the_info)
10160 {
10161 the_info->insn_info_valid = 0;
10162 the_info->branch_delay_insns = 0;
10163 the_info->data_size = 0;
10164 the_info->insn_type = dis_noninsn;
10165 the_info->target = 0;
10166 the_info->target2 = 0;
10167 }
10168
10169 /* Reset jump operation indicator. */
10170 op_is_jump = FALSE;
10171
10172 {
10173 int jump_detection = 0;
10174
10175 /* Extract flags. */
10176 for (i = 0; i < MAX_OPERANDS; ++i)
10177 {
10178 if ((dp->op[i].rtn == OP_J)
10179 || (dp->op[i].rtn == OP_indirE))
10180 jump_detection |= 1;
10181 else if ((dp->op[i].rtn == BND_Fixup)
10182 || (!dp->op[i].rtn && !dp->op[i].bytemode))
10183 jump_detection |= 2;
10184 else if ((dp->op[i].bytemode == cond_jump_mode)
10185 || (dp->op[i].bytemode == loop_jcxz_mode))
10186 jump_detection |= 4;
10187 }
10188
10189 /* Determine if this is a jump or branch. */
10190 if ((jump_detection & 0x3) == 0x3)
10191 {
10192 op_is_jump = TRUE;
10193 if (jump_detection & 0x4)
10194 the_info->insn_type = dis_condbranch;
10195 else
10196 the_info->insn_type =
10197 (dp->name && !strncmp(dp->name, "call", 4))
10198 ? dis_jsr : dis_branch;
10199 }
10200 }
10201
63c6fc6c
L
10202 /* If VEX.vvvv and EVEX.vvvv are unused, they must be all 1s, which
10203 are all 0s in inverted form. */
10204 if (need_vex && vex.register_specifier != 0)
10205 {
10206 (*info->fprintf_func) (info->stream, "(bad)");
10207 return end_codep - priv.the_buffer;
10208 }
10209
7531c613
JB
10210 switch (dp->prefix_requirement)
10211 {
10212 case PREFIX_DATA:
10213 /* If only the data prefix is marked as mandatory, its absence renders
10214 the encoding invalid. Most other PREFIX_OPCODE rules still apply. */
10215 if (need_vex ? !vex.prefix : !(prefixes & PREFIX_DATA))
10216 {
10217 (*info->fprintf_func) (info->stream, "(bad)");
10218 return end_codep - priv.the_buffer;
10219 }
10220 used_prefixes |= PREFIX_DATA;
10221 /* Fall through. */
10222 case PREFIX_OPCODE:
10223 /* If the mandatory PREFIX_REPZ/PREFIX_REPNZ/PREFIX_DATA prefix is
10224 unused, opcode is invalid. Since the PREFIX_DATA prefix may be
10225 used by putop and MMX/SSE operand and may be overridden by the
10226 PREFIX_REPZ/PREFIX_REPNZ fix, we check the PREFIX_DATA prefix
10227 separately. */
10228 if (((need_vex
10229 ? vex.prefix == REPE_PREFIX_OPCODE
10230 || vex.prefix == REPNE_PREFIX_OPCODE
10231 : (prefixes
10232 & (PREFIX_REPZ | PREFIX_REPNZ)) != 0)
10233 && (used_prefixes
10234 & (PREFIX_REPZ | PREFIX_REPNZ)) == 0)
10235 || (((need_vex
10236 ? vex.prefix == DATA_PREFIX_OPCODE
10237 : ((prefixes
10238 & (PREFIX_REPZ | PREFIX_REPNZ | PREFIX_DATA))
10239 == PREFIX_DATA))
10240 && (used_prefixes & PREFIX_DATA) == 0))
10241 || (vex.evex && dp->prefix_requirement != PREFIX_DATA
10242 && !vex.w != !(used_prefixes & PREFIX_DATA)))
10243 {
10244 (*info->fprintf_func) (info->stream, "(bad)");
10245 return end_codep - priv.the_buffer;
10246 }
10247 break;
10248 }
10249
d869730d 10250 /* Check if the REX prefix is used. */
73239888 10251 if ((rex ^ rex_used) == 0 && !need_vex && last_rex_prefix >= 0)
f16cd0d5
L
10252 all_prefixes[last_rex_prefix] = 0;
10253
5e6718e4 10254 /* Check if the SEG prefix is used. */
f16cd0d5
L
10255 if ((prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS | PREFIX_ES
10256 | PREFIX_FS | PREFIX_GS)) != 0
285ca992 10257 && (used_prefixes & active_seg_prefix) != 0)
f16cd0d5
L
10258 all_prefixes[last_seg_prefix] = 0;
10259
5e6718e4 10260 /* Check if the ADDR prefix is used. */
f16cd0d5
L
10261 if ((prefixes & PREFIX_ADDR) != 0
10262 && (used_prefixes & PREFIX_ADDR) != 0)
10263 all_prefixes[last_addr_prefix] = 0;
10264
df18fdba
L
10265 /* Check if the DATA prefix is used. */
10266 if ((prefixes & PREFIX_DATA) != 0
73239888
JB
10267 && (used_prefixes & PREFIX_DATA) != 0
10268 && !need_vex)
df18fdba 10269 all_prefixes[last_data_prefix] = 0;
f16cd0d5 10270
df18fdba 10271 /* Print the extra prefixes. */
f16cd0d5 10272 prefix_length = 0;
f310f33d 10273 for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
f16cd0d5
L
10274 if (all_prefixes[i])
10275 {
10276 const char *name;
df18fdba 10277 name = prefix_name (all_prefixes[i], orig_sizeflag);
f16cd0d5
L
10278 if (name == NULL)
10279 abort ();
10280 prefix_length += strlen (name) + 1;
10281 (*info->fprintf_func) (info->stream, "%s ", name);
10282 }
b844680a 10283
f16cd0d5
L
10284 /* Check maximum code length. */
10285 if ((codep - start_codep) > MAX_CODE_LENGTH)
10286 {
10287 (*info->fprintf_func) (info->stream, "(bad)");
10288 return MAX_CODE_LENGTH;
10289 }
b844680a 10290
ea397f5b 10291 obufp = mnemonicendp;
f16cd0d5 10292 for (i = strlen (obuf) + prefix_length; i < 6; i++)
252b5132
RH
10293 oappend (" ");
10294 oappend (" ");
10295 (*info->fprintf_func) (info->stream, "%s", obuf);
10296
10297 /* The enter and bound instructions are printed with operands in the same
10298 order as the intel book; everything else is printed in reverse order. */
2da11e11 10299 if (intel_syntax || two_source_ops)
252b5132 10300 {
185b1163
L
10301 bfd_vma riprel;
10302
ce518a5f 10303 for (i = 0; i < MAX_OPERANDS; ++i)
6c067bbb 10304 op_txt[i] = op_out[i];
246c51aa 10305
3a8547d2
JB
10306 if (intel_syntax && dp && dp->op[2].rtn == OP_Rounding
10307 && dp->op[3].rtn == OP_E && dp->op[4].rtn == NULL)
10308 {
10309 op_txt[2] = op_out[3];
10310 op_txt[3] = op_out[2];
10311 }
10312
ce518a5f
L
10313 for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
10314 {
6c067bbb
RM
10315 op_ad = op_index[i];
10316 op_index[i] = op_index[MAX_OPERANDS - 1 - i];
10317 op_index[MAX_OPERANDS - 1 - i] = op_ad;
185b1163
L
10318 riprel = op_riprel[i];
10319 op_riprel[i] = op_riprel [MAX_OPERANDS - 1 - i];
10320 op_riprel[MAX_OPERANDS - 1 - i] = riprel;
ce518a5f 10321 }
252b5132
RH
10322 }
10323 else
10324 {
ce518a5f 10325 for (i = 0; i < MAX_OPERANDS; ++i)
6c067bbb 10326 op_txt[MAX_OPERANDS - 1 - i] = op_out[i];
050dfa73
MM
10327 }
10328
ce518a5f
L
10329 needcomma = 0;
10330 for (i = 0; i < MAX_OPERANDS; ++i)
10331 if (*op_txt[i])
10332 {
10333 if (needcomma)
10334 (*info->fprintf_func) (info->stream, ",");
10335 if (op_index[i] != -1 && !op_riprel[i])
1d67fe3b
TT
10336 {
10337 bfd_vma target = (bfd_vma) op_address[op_index[i]];
10338
10339 if (the_info && op_is_jump)
10340 {
10341 the_info->insn_info_valid = 1;
10342 the_info->branch_delay_insns = 0;
10343 the_info->data_size = 0;
10344 the_info->target = target;
10345 the_info->target2 = 0;
10346 }
10347 (*info->print_address_func) (target, info);
10348 }
ce518a5f
L
10349 else
10350 (*info->fprintf_func) (info->stream, "%s", op_txt[i]);
10351 needcomma = 1;
10352 }
050dfa73 10353
ce518a5f 10354 for (i = 0; i < MAX_OPERANDS; i++)
52b15da3
JH
10355 if (op_index[i] != -1 && op_riprel[i])
10356 {
10357 (*info->fprintf_func) (info->stream, " # ");
4fd7268a 10358 (*info->print_address_func) ((bfd_vma) (start_pc + (codep - start_codep)
52b15da3 10359 + op_address[op_index[i]]), info);
185b1163 10360 break;
52b15da3 10361 }
e396998b 10362 return codep - priv.the_buffer;
252b5132
RH
10363}
10364
6439fc28 10365static const char *float_mem[] = {
252b5132 10366 /* d8 */
7c52e0e8
L
10367 "fadd{s|}",
10368 "fmul{s|}",
10369 "fcom{s|}",
10370 "fcomp{s|}",
10371 "fsub{s|}",
10372 "fsubr{s|}",
10373 "fdiv{s|}",
10374 "fdivr{s|}",
db6eb5be 10375 /* d9 */
7c52e0e8 10376 "fld{s|}",
252b5132 10377 "(bad)",
7c52e0e8
L
10378 "fst{s|}",
10379 "fstp{s|}",
d1c36125 10380 "fldenv{C|C}",
252b5132 10381 "fldcw",
d1c36125 10382 "fNstenv{C|C}",
252b5132
RH
10383 "fNstcw",
10384 /* da */
7c52e0e8
L
10385 "fiadd{l|}",
10386 "fimul{l|}",
10387 "ficom{l|}",
10388 "ficomp{l|}",
10389 "fisub{l|}",
10390 "fisubr{l|}",
10391 "fidiv{l|}",
10392 "fidivr{l|}",
252b5132 10393 /* db */
7c52e0e8
L
10394 "fild{l|}",
10395 "fisttp{l|}",
10396 "fist{l|}",
10397 "fistp{l|}",
252b5132 10398 "(bad)",
464dc4af 10399 "fld{t|}",
252b5132 10400 "(bad)",
464dc4af 10401 "fstp{t|}",
252b5132 10402 /* dc */
7c52e0e8
L
10403 "fadd{l|}",
10404 "fmul{l|}",
10405 "fcom{l|}",
10406 "fcomp{l|}",
10407 "fsub{l|}",
10408 "fsubr{l|}",
10409 "fdiv{l|}",
10410 "fdivr{l|}",
252b5132 10411 /* dd */
7c52e0e8
L
10412 "fld{l|}",
10413 "fisttp{ll|}",
10414 "fst{l||}",
10415 "fstp{l|}",
d1c36125 10416 "frstor{C|C}",
252b5132 10417 "(bad)",
d1c36125 10418 "fNsave{C|C}",
252b5132
RH
10419 "fNstsw",
10420 /* de */
ac465521
JB
10421 "fiadd{s|}",
10422 "fimul{s|}",
10423 "ficom{s|}",
10424 "ficomp{s|}",
10425 "fisub{s|}",
10426 "fisubr{s|}",
10427 "fidiv{s|}",
10428 "fidivr{s|}",
252b5132 10429 /* df */
ac465521
JB
10430 "fild{s|}",
10431 "fisttp{s|}",
10432 "fist{s|}",
10433 "fistp{s|}",
252b5132 10434 "fbld",
7c52e0e8 10435 "fild{ll|}",
252b5132 10436 "fbstp",
7c52e0e8 10437 "fistp{ll|}",
1d9f512f
AM
10438};
10439
10440static const unsigned char float_mem_mode[] = {
10441 /* d8 */
10442 d_mode,
10443 d_mode,
10444 d_mode,
10445 d_mode,
10446 d_mode,
10447 d_mode,
10448 d_mode,
10449 d_mode,
10450 /* d9 */
10451 d_mode,
10452 0,
10453 d_mode,
10454 d_mode,
10455 0,
10456 w_mode,
10457 0,
10458 w_mode,
10459 /* da */
10460 d_mode,
10461 d_mode,
10462 d_mode,
10463 d_mode,
10464 d_mode,
10465 d_mode,
10466 d_mode,
10467 d_mode,
10468 /* db */
10469 d_mode,
10470 d_mode,
10471 d_mode,
10472 d_mode,
10473 0,
9306ca4a 10474 t_mode,
1d9f512f 10475 0,
9306ca4a 10476 t_mode,
1d9f512f
AM
10477 /* dc */
10478 q_mode,
10479 q_mode,
10480 q_mode,
10481 q_mode,
10482 q_mode,
10483 q_mode,
10484 q_mode,
10485 q_mode,
10486 /* dd */
10487 q_mode,
10488 q_mode,
10489 q_mode,
10490 q_mode,
10491 0,
10492 0,
10493 0,
10494 w_mode,
10495 /* de */
10496 w_mode,
10497 w_mode,
10498 w_mode,
10499 w_mode,
10500 w_mode,
10501 w_mode,
10502 w_mode,
10503 w_mode,
10504 /* df */
10505 w_mode,
10506 w_mode,
10507 w_mode,
10508 w_mode,
9306ca4a 10509 t_mode,
1d9f512f 10510 q_mode,
9306ca4a 10511 t_mode,
1d9f512f 10512 q_mode
252b5132
RH
10513};
10514
ce518a5f
L
10515#define ST { OP_ST, 0 }
10516#define STi { OP_STi, 0 }
252b5132 10517
48c97fa1
L
10518#define FGRPd9_2 NULL, { { NULL, 1 } }, 0
10519#define FGRPd9_4 NULL, { { NULL, 2 } }, 0
10520#define FGRPd9_5 NULL, { { NULL, 3 } }, 0
10521#define FGRPd9_6 NULL, { { NULL, 4 } }, 0
10522#define FGRPd9_7 NULL, { { NULL, 5 } }, 0
10523#define FGRPda_5 NULL, { { NULL, 6 } }, 0
10524#define FGRPdb_4 NULL, { { NULL, 7 } }, 0
10525#define FGRPde_3 NULL, { { NULL, 8 } }, 0
10526#define FGRPdf_4 NULL, { { NULL, 9 } }, 0
252b5132 10527
2da11e11 10528static const struct dis386 float_reg[][8] = {
252b5132
RH
10529 /* d8 */
10530 {
bf890a93
IT
10531 { "fadd", { ST, STi }, 0 },
10532 { "fmul", { ST, STi }, 0 },
10533 { "fcom", { STi }, 0 },
10534 { "fcomp", { STi }, 0 },
10535 { "fsub", { ST, STi }, 0 },
10536 { "fsubr", { ST, STi }, 0 },
10537 { "fdiv", { ST, STi }, 0 },
10538 { "fdivr", { ST, STi }, 0 },
252b5132
RH
10539 },
10540 /* d9 */
10541 {
bf890a93
IT
10542 { "fld", { STi }, 0 },
10543 { "fxch", { STi }, 0 },
252b5132 10544 { FGRPd9_2 },
592d1631 10545 { Bad_Opcode },
252b5132
RH
10546 { FGRPd9_4 },
10547 { FGRPd9_5 },
10548 { FGRPd9_6 },
10549 { FGRPd9_7 },
10550 },
10551 /* da */
10552 {
bf890a93
IT
10553 { "fcmovb", { ST, STi }, 0 },
10554 { "fcmove", { ST, STi }, 0 },
10555 { "fcmovbe",{ ST, STi }, 0 },
10556 { "fcmovu", { ST, STi }, 0 },
592d1631 10557 { Bad_Opcode },
252b5132 10558 { FGRPda_5 },
592d1631
L
10559 { Bad_Opcode },
10560 { Bad_Opcode },
252b5132
RH
10561 },
10562 /* db */
10563 {
bf890a93
IT
10564 { "fcmovnb",{ ST, STi }, 0 },
10565 { "fcmovne",{ ST, STi }, 0 },
10566 { "fcmovnbe",{ ST, STi }, 0 },
10567 { "fcmovnu",{ ST, STi }, 0 },
252b5132 10568 { FGRPdb_4 },
bf890a93
IT
10569 { "fucomi", { ST, STi }, 0 },
10570 { "fcomi", { ST, STi }, 0 },
592d1631 10571 { Bad_Opcode },
252b5132
RH
10572 },
10573 /* dc */
10574 {
bf890a93
IT
10575 { "fadd", { STi, ST }, 0 },
10576 { "fmul", { STi, ST }, 0 },
592d1631
L
10577 { Bad_Opcode },
10578 { Bad_Opcode },
d53e6b98
JB
10579 { "fsub{!M|r}", { STi, ST }, 0 },
10580 { "fsub{M|}", { STi, ST }, 0 },
10581 { "fdiv{!M|r}", { STi, ST }, 0 },
10582 { "fdiv{M|}", { STi, ST }, 0 },
252b5132
RH
10583 },
10584 /* dd */
10585 {
bf890a93 10586 { "ffree", { STi }, 0 },
592d1631 10587 { Bad_Opcode },
bf890a93
IT
10588 { "fst", { STi }, 0 },
10589 { "fstp", { STi }, 0 },
10590 { "fucom", { STi }, 0 },
10591 { "fucomp", { STi }, 0 },
592d1631
L
10592 { Bad_Opcode },
10593 { Bad_Opcode },
252b5132
RH
10594 },
10595 /* de */
10596 {
bf890a93
IT
10597 { "faddp", { STi, ST }, 0 },
10598 { "fmulp", { STi, ST }, 0 },
592d1631 10599 { Bad_Opcode },
252b5132 10600 { FGRPde_3 },
d53e6b98
JB
10601 { "fsub{!M|r}p", { STi, ST }, 0 },
10602 { "fsub{M|}p", { STi, ST }, 0 },
10603 { "fdiv{!M|r}p", { STi, ST }, 0 },
10604 { "fdiv{M|}p", { STi, ST }, 0 },
252b5132
RH
10605 },
10606 /* df */
10607 {
bf890a93 10608 { "ffreep", { STi }, 0 },
592d1631
L
10609 { Bad_Opcode },
10610 { Bad_Opcode },
10611 { Bad_Opcode },
252b5132 10612 { FGRPdf_4 },
bf890a93
IT
10613 { "fucomip", { ST, STi }, 0 },
10614 { "fcomip", { ST, STi }, 0 },
592d1631 10615 { Bad_Opcode },
252b5132
RH
10616 },
10617};
10618
252b5132 10619static char *fgrps[][8] = {
48c97fa1
L
10620 /* Bad opcode 0 */
10621 {
10622 "(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10623 },
10624
10625 /* d9_2 1 */
252b5132
RH
10626 {
10627 "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10628 },
10629
48c97fa1 10630 /* d9_4 2 */
252b5132
RH
10631 {
10632 "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
10633 },
10634
48c97fa1 10635 /* d9_5 3 */
252b5132
RH
10636 {
10637 "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
10638 },
10639
48c97fa1 10640 /* d9_6 4 */
252b5132
RH
10641 {
10642 "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
10643 },
10644
48c97fa1 10645 /* d9_7 5 */
252b5132
RH
10646 {
10647 "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
10648 },
10649
48c97fa1 10650 /* da_5 6 */
252b5132
RH
10651 {
10652 "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10653 },
10654
48c97fa1 10655 /* db_4 7 */
252b5132 10656 {
309d3373
JB
10657 "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
10658 "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
252b5132
RH
10659 },
10660
48c97fa1 10661 /* de_3 8 */
252b5132
RH
10662 {
10663 "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10664 },
10665
48c97fa1 10666 /* df_4 9 */
252b5132
RH
10667 {
10668 "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10669 },
10670};
10671
b6169b20
L
10672static void
10673swap_operand (void)
10674{
10675 mnemonicendp[0] = '.';
10676 mnemonicendp[1] = 's';
10677 mnemonicendp += 2;
10678}
10679
b844680a
L
10680static void
10681OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED,
10682 int sizeflag ATTRIBUTE_UNUSED)
10683{
10684 /* Skip mod/rm byte. */
10685 MODRM_CHECK;
10686 codep++;
10687}
10688
252b5132 10689static void
26ca5450 10690dofloat (int sizeflag)
252b5132 10691{
2da11e11 10692 const struct dis386 *dp;
252b5132
RH
10693 unsigned char floatop;
10694
10695 floatop = codep[-1];
10696
7967e09e 10697 if (modrm.mod != 3)
252b5132 10698 {
7967e09e 10699 int fp_indx = (floatop - 0xd8) * 8 + modrm.reg;
1d9f512f
AM
10700
10701 putop (float_mem[fp_indx], sizeflag);
ce518a5f 10702 obufp = op_out[0];
6e50d963 10703 op_ad = 2;
1d9f512f 10704 OP_E (float_mem_mode[fp_indx], sizeflag);
252b5132
RH
10705 return;
10706 }
6608db57 10707 /* Skip mod/rm byte. */
4bba6815 10708 MODRM_CHECK;
252b5132
RH
10709 codep++;
10710
7967e09e 10711 dp = &float_reg[floatop - 0xd8][modrm.reg];
252b5132
RH
10712 if (dp->name == NULL)
10713 {
7967e09e 10714 putop (fgrps[dp->op[0].bytemode][modrm.rm], sizeflag);
252b5132 10715
6608db57 10716 /* Instruction fnstsw is only one with strange arg. */
252b5132 10717 if (floatop == 0xdf && codep[-1] == 0xe0)
ce518a5f 10718 strcpy (op_out[0], names16[0]);
252b5132
RH
10719 }
10720 else
10721 {
10722 putop (dp->name, sizeflag);
10723
ce518a5f 10724 obufp = op_out[0];
6e50d963 10725 op_ad = 2;
ce518a5f
L
10726 if (dp->op[0].rtn)
10727 (*dp->op[0].rtn) (dp->op[0].bytemode, sizeflag);
6e50d963 10728
ce518a5f 10729 obufp = op_out[1];
6e50d963 10730 op_ad = 1;
ce518a5f
L
10731 if (dp->op[1].rtn)
10732 (*dp->op[1].rtn) (dp->op[1].bytemode, sizeflag);
252b5132
RH
10733 }
10734}
10735
9ce09ba2
RM
10736/* Like oappend (below), but S is a string starting with '%'.
10737 In Intel syntax, the '%' is elided. */
10738static void
10739oappend_maybe_intel (const char *s)
10740{
10741 oappend (s + intel_syntax);
10742}
10743
252b5132 10744static void
26ca5450 10745OP_ST (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 10746{
9ce09ba2 10747 oappend_maybe_intel ("%st");
252b5132
RH
10748}
10749
252b5132 10750static void
26ca5450 10751OP_STi (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 10752{
7967e09e 10753 sprintf (scratchbuf, "%%st(%d)", modrm.rm);
9ce09ba2 10754 oappend_maybe_intel (scratchbuf);
252b5132
RH
10755}
10756
6608db57 10757/* Capital letters in template are macros. */
6439fc28 10758static int
d3ce72d0 10759putop (const char *in_template, int sizeflag)
252b5132 10760{
2da11e11 10761 const char *p;
9306ca4a 10762 int alt = 0;
9d141669 10763 int cond = 1;
21a3faeb 10764 unsigned int l = 0, len = 0;
98b528ac
L
10765 char last[4];
10766
d3ce72d0 10767 for (p = in_template; *p; p++)
252b5132 10768 {
21a3faeb
JB
10769 if (len > l)
10770 {
10771 if (l >= sizeof (last) || !ISUPPER (*p))
10772 abort ();
10773 last[l++] = *p;
10774 continue;
10775 }
252b5132
RH
10776 switch (*p)
10777 {
10778 default:
10779 *obufp++ = *p;
10780 break;
98b528ac
L
10781 case '%':
10782 len++;
10783 break;
9d141669
L
10784 case '!':
10785 cond = 0;
10786 break;
6439fc28 10787 case '{':
6439fc28 10788 if (intel_syntax)
6439fc28
AM
10789 {
10790 while (*++p != '|')
7c52e0e8
L
10791 if (*p == '}' || *p == '\0')
10792 abort ();
d1c36125 10793 alt = 1;
6439fc28 10794 }
d1c36125 10795 break;
6439fc28
AM
10796 case '|':
10797 while (*++p != '}')
10798 {
10799 if (*p == '\0')
10800 abort ();
10801 }
10802 break;
10803 case '}':
d1c36125 10804 alt = 0;
6439fc28 10805 break;
252b5132 10806 case 'A':
db6eb5be
AM
10807 if (intel_syntax)
10808 break;
0e9f3bf1
L
10809 if ((need_modrm && modrm.mod != 3)
10810 || (sizeflag & SUFFIX_ALWAYS))
252b5132
RH
10811 *obufp++ = 'b';
10812 break;
10813 case 'B':
21a3faeb 10814 if (l == 0)
4b06377f 10815 {
dc1e8a47 10816 case_B:
4b06377f
L
10817 if (intel_syntax)
10818 break;
10819 if (sizeflag & SUFFIX_ALWAYS)
10820 *obufp++ = 'b';
10821 }
21a3faeb 10822 else if (l == 1 && last[0] == 'L')
4b06377f 10823 {
4b06377f
L
10824 if (address_mode == mode_64bit
10825 && !(prefixes & PREFIX_ADDR))
10826 {
10827 *obufp++ = 'a';
10828 *obufp++ = 'b';
10829 *obufp++ = 's';
10830 }
10831
10832 goto case_B;
10833 }
21a3faeb
JB
10834 else
10835 abort ();
252b5132 10836 break;
9306ca4a
JB
10837 case 'C':
10838 if (intel_syntax && !alt)
10839 break;
10840 if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
10841 {
10842 if (sizeflag & DFLAG)
10843 *obufp++ = intel_syntax ? 'd' : 'l';
10844 else
10845 *obufp++ = intel_syntax ? 'w' : 's';
10846 used_prefixes |= (prefixes & PREFIX_DATA);
10847 }
10848 break;
ed7841b3
JB
10849 case 'D':
10850 if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
10851 break;
161a04f6 10852 USED_REX (REX_W);
7967e09e 10853 if (modrm.mod == 3)
ed7841b3 10854 {
161a04f6 10855 if (rex & REX_W)
ed7841b3 10856 *obufp++ = 'q';
ed7841b3 10857 else
f16cd0d5
L
10858 {
10859 if (sizeflag & DFLAG)
10860 *obufp++ = intel_syntax ? 'd' : 'l';
10861 else
10862 *obufp++ = 'w';
10863 used_prefixes |= (prefixes & PREFIX_DATA);
10864 }
ed7841b3
JB
10865 }
10866 else
10867 *obufp++ = 'w';
10868 break;
252b5132 10869 case 'E': /* For jcxz/jecxz */
cb712a9e 10870 if (address_mode == mode_64bit)
c1a64871
JH
10871 {
10872 if (sizeflag & AFLAG)
10873 *obufp++ = 'r';
10874 else
10875 *obufp++ = 'e';
10876 }
10877 else
10878 if (sizeflag & AFLAG)
10879 *obufp++ = 'e';
3ffd33cf
AM
10880 used_prefixes |= (prefixes & PREFIX_ADDR);
10881 break;
10882 case 'F':
db6eb5be
AM
10883 if (intel_syntax)
10884 break;
e396998b 10885 if ((prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
3ffd33cf
AM
10886 {
10887 if (sizeflag & AFLAG)
cb712a9e 10888 *obufp++ = address_mode == mode_64bit ? 'q' : 'l';
3ffd33cf 10889 else
cb712a9e 10890 *obufp++ = address_mode == mode_64bit ? 'l' : 'w';
3ffd33cf
AM
10891 used_prefixes |= (prefixes & PREFIX_ADDR);
10892 }
252b5132 10893 break;
52fd6d94
JB
10894 case 'G':
10895 if (intel_syntax || (obufp[-1] != 's' && !(sizeflag & SUFFIX_ALWAYS)))
10896 break;
161a04f6 10897 if ((rex & REX_W) || (sizeflag & DFLAG))
52fd6d94
JB
10898 *obufp++ = 'l';
10899 else
10900 *obufp++ = 'w';
161a04f6 10901 if (!(rex & REX_W))
52fd6d94
JB
10902 used_prefixes |= (prefixes & PREFIX_DATA);
10903 break;
5dd0794d 10904 case 'H':
db6eb5be
AM
10905 if (intel_syntax)
10906 break;
5dd0794d
AM
10907 if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
10908 || (prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
10909 {
10910 used_prefixes |= prefixes & (PREFIX_CS | PREFIX_DS);
10911 *obufp++ = ',';
10912 *obufp++ = 'p';
632ee6fd
BP
10913
10914 /* Set active_seg_prefix even if not set in 64-bit mode
10915 because here it is a valid branch hint. */
5dd0794d 10916 if (prefixes & PREFIX_DS)
632ee6fd
BP
10917 {
10918 active_seg_prefix = PREFIX_DS;
10919 *obufp++ = 't';
10920 }
5dd0794d 10921 else
632ee6fd
BP
10922 {
10923 active_seg_prefix = PREFIX_CS;
10924 *obufp++ = 'n';
10925 }
5dd0794d
AM
10926 }
10927 break;
42903f7f
L
10928 case 'K':
10929 USED_REX (REX_W);
10930 if (rex & REX_W)
10931 *obufp++ = 'q';
10932 else
10933 *obufp++ = 'd';
10934 break;
252b5132 10935 case 'L':
78467458 10936 abort ();
9d141669
L
10937 case 'M':
10938 if (intel_mnemonic != cond)
10939 *obufp++ = 'r';
10940 break;
252b5132
RH
10941 case 'N':
10942 if ((prefixes & PREFIX_FWAIT) == 0)
10943 *obufp++ = 'n';
7d421014
ILT
10944 else
10945 used_prefixes |= PREFIX_FWAIT;
252b5132 10946 break;
52b15da3 10947 case 'O':
161a04f6
L
10948 USED_REX (REX_W);
10949 if (rex & REX_W)
6439fc28 10950 *obufp++ = 'o';
a35ca55a
JB
10951 else if (intel_syntax && (sizeflag & DFLAG))
10952 *obufp++ = 'q';
52b15da3
JH
10953 else
10954 *obufp++ = 'd';
161a04f6 10955 if (!(rex & REX_W))
a35ca55a 10956 used_prefixes |= (prefixes & PREFIX_DATA);
52b15da3 10957 break;
36938cab
JB
10958 case '@':
10959 if (address_mode == mode_64bit
10960 && (isa64 == intel64 || (rex & REX_W)
10961 || !(prefixes & PREFIX_DATA)))
6439fc28 10962 {
36938cab
JB
10963 if (sizeflag & SUFFIX_ALWAYS)
10964 *obufp++ = 'q';
6439fc28
AM
10965 break;
10966 }
6608db57 10967 /* Fall through. */
252b5132 10968 case 'P':
21a3faeb 10969 if (l == 0)
d9e3625e 10970 {
0e9f3bf1 10971 if ((modrm.mod == 3 || !cond)
c3f5525f 10972 && !(sizeflag & SUFFIX_ALWAYS))
36938cab
JB
10973 break;
10974 /* Fall through. */
10975 case 'T':
10976 if ((!(rex & REX_W) && (prefixes & PREFIX_DATA))
10977 || ((sizeflag & SUFFIX_ALWAYS)
10978 && address_mode != mode_64bit))
4b4c407a 10979 {
36938cab
JB
10980 *obufp++ = (sizeflag & DFLAG) ?
10981 intel_syntax ? 'd' : 'l' : 'w';
10982 used_prefixes |= (prefixes & PREFIX_DATA);
d9e3625e 10983 }
36938cab
JB
10984 else if (sizeflag & SUFFIX_ALWAYS)
10985 *obufp++ = 'q';
d9e3625e 10986 }
21a3faeb 10987 else if (l == 1 && last[0] == 'L')
252b5132 10988 {
4b4c407a
L
10989 if ((prefixes & PREFIX_DATA)
10990 || (rex & REX_W)
10991 || (sizeflag & SUFFIX_ALWAYS))
52b15da3 10992 {
4b4c407a
L
10993 USED_REX (REX_W);
10994 if (rex & REX_W)
10995 *obufp++ = 'q';
10996 else
10997 {
10998 if (sizeflag & DFLAG)
10999 *obufp++ = intel_syntax ? 'd' : 'l';
11000 else
11001 *obufp++ = 'w';
11002 used_prefixes |= (prefixes & PREFIX_DATA);
11003 }
52b15da3 11004 }
252b5132 11005 }
21a3faeb
JB
11006 else
11007 abort ();
252b5132
RH
11008 break;
11009 case 'Q':
21a3faeb 11010 if (l == 0)
252b5132 11011 {
98b528ac
L
11012 if (intel_syntax && !alt)
11013 break;
11014 USED_REX (REX_W);
0e9f3bf1
L
11015 if ((need_modrm && modrm.mod != 3)
11016 || (sizeflag & SUFFIX_ALWAYS))
52b15da3 11017 {
98b528ac
L
11018 if (rex & REX_W)
11019 *obufp++ = 'q';
52b15da3 11020 else
98b528ac
L
11021 {
11022 if (sizeflag & DFLAG)
11023 *obufp++ = intel_syntax ? 'd' : 'l';
11024 else
11025 *obufp++ = 'w';
f16cd0d5 11026 used_prefixes |= (prefixes & PREFIX_DATA);
98b528ac 11027 }
52b15da3 11028 }
98b528ac 11029 }
492a76aa
JB
11030 else if (l == 1 && last[0] == 'D')
11031 *obufp++ = vex.w ? 'q' : 'd';
21a3faeb 11032 else if (l == 1 && last[0] == 'L')
98b528ac 11033 {
b24d668c
JB
11034 if (cond ? modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)
11035 : address_mode != mode_64bit)
98b528ac
L
11036 break;
11037 if ((rex & REX_W))
11038 {
11039 USED_REX (REX_W);
11040 *obufp++ = 'q';
11041 }
5b316d90 11042 else if((address_mode == mode_64bit && cond)
589958d6
JB
11043 || (sizeflag & SUFFIX_ALWAYS))
11044 *obufp++ = intel_syntax? 'd' : 'l';
252b5132 11045 }
21a3faeb
JB
11046 else
11047 abort ();
252b5132
RH
11048 break;
11049 case 'R':
161a04f6
L
11050 USED_REX (REX_W);
11051 if (rex & REX_W)
a35ca55a
JB
11052 *obufp++ = 'q';
11053 else if (sizeflag & DFLAG)
c608c12e 11054 {
a35ca55a 11055 if (intel_syntax)
c608c12e 11056 *obufp++ = 'd';
c608c12e 11057 else
a35ca55a 11058 *obufp++ = 'l';
c608c12e 11059 }
252b5132 11060 else
a35ca55a
JB
11061 *obufp++ = 'w';
11062 if (intel_syntax && !p[1]
161a04f6 11063 && ((rex & REX_W) || (sizeflag & DFLAG)))
a35ca55a 11064 *obufp++ = 'e';
161a04f6 11065 if (!(rex & REX_W))
52b15da3 11066 used_prefixes |= (prefixes & PREFIX_DATA);
252b5132
RH
11067 break;
11068 case 'S':
21a3faeb 11069 if (l == 0)
252b5132 11070 {
dc1e8a47 11071 case_S:
4b06377f
L
11072 if (intel_syntax)
11073 break;
11074 if (sizeflag & SUFFIX_ALWAYS)
52b15da3 11075 {
4b06377f
L
11076 if (rex & REX_W)
11077 *obufp++ = 'q';
52b15da3 11078 else
4b06377f
L
11079 {
11080 if (sizeflag & DFLAG)
11081 *obufp++ = 'l';
11082 else
11083 *obufp++ = 'w';
11084 used_prefixes |= (prefixes & PREFIX_DATA);
11085 }
11086 }
11087 }
21a3faeb 11088 else if (l == 1 && last[0] == 'L')
4b06377f 11089 {
4b06377f
L
11090 if (address_mode == mode_64bit
11091 && !(prefixes & PREFIX_ADDR))
11092 {
11093 *obufp++ = 'a';
11094 *obufp++ = 'b';
11095 *obufp++ = 's';
11096 }
11097
11098 goto case_S;
252b5132 11099 }
21a3faeb
JB
11100 else
11101 abort ();
252b5132 11102 break;
f0e8d0ba
JB
11103 case 'V':
11104 if (l == 0)
11105 abort ();
58bf9b6a
L
11106 else if (l == 1
11107 && (last[0] == 'L' || last[0] == 'X'))
f0e8d0ba 11108 {
58bf9b6a
L
11109 if (last[0] == 'X')
11110 {
11111 *obufp++ = '{';
11112 *obufp++ = 'v';
11113 *obufp++ = 'e';
11114 *obufp++ = 'x';
58bf9b6a
L
11115 *obufp++ = '}';
11116 }
11117 else if (rex & REX_W)
f0e8d0ba
JB
11118 {
11119 *obufp++ = 'a';
11120 *obufp++ = 'b';
11121 *obufp++ = 's';
11122 }
11123 }
11124 else
11125 abort ();
11126 goto case_S;
11127 case 'W':
11128 if (l == 0)
11129 {
11130 /* operand size flag for cwtl, cbtw */
11131 USED_REX (REX_W);
11132 if (rex & REX_W)
11133 {
11134 if (intel_syntax)
11135 *obufp++ = 'd';
11136 else
11137 *obufp++ = 'l';
11138 }
11139 else if (sizeflag & DFLAG)
11140 *obufp++ = 'w';
11141 else
11142 *obufp++ = 'b';
11143 if (!(rex & REX_W))
11144 used_prefixes |= (prefixes & PREFIX_DATA);
11145 }
11146 else if (l == 1)
11147 {
11148 if (!need_vex)
11149 abort ();
11150 if (last[0] == 'X')
11151 *obufp++ = vex.w ? 'd': 's';
11152 else if (last[0] == 'B')
11153 *obufp++ = vex.w ? 'w': 'b';
11154 else
11155 abort ();
11156 }
11157 else
11158 abort ();
11159 break;
041bd2e0 11160 case 'X':
21a3faeb
JB
11161 if (l != 0)
11162 abort ();
bf926894
JB
11163 if (need_vex
11164 ? vex.prefix == DATA_PREFIX_OPCODE
11165 : prefixes & PREFIX_DATA)
c0f3af97 11166 {
bf926894
JB
11167 *obufp++ = 'd';
11168 used_prefixes |= PREFIX_DATA;
c0f3af97 11169 }
041bd2e0 11170 else
bf926894 11171 *obufp++ = 's';
041bd2e0 11172 break;
76f227a5 11173 case 'Y':
21a3faeb 11174 if (l == 1 && last[0] == 'X')
c0f3af97 11175 {
c0f3af97
L
11176 if (!need_vex)
11177 abort ();
11178 if (intel_syntax
04d824a4 11179 || ((modrm.mod == 3 || vex.b) && !(sizeflag & SUFFIX_ALWAYS)))
c0f3af97
L
11180 break;
11181 switch (vex.length)
11182 {
11183 case 128:
11184 *obufp++ = 'x';
11185 break;
11186 case 256:
11187 *obufp++ = 'y';
11188 break;
04d824a4
JB
11189 case 512:
11190 if (!vex.evex)
c0f3af97 11191 default:
04d824a4 11192 abort ();
c0f3af97 11193 }
76f227a5 11194 }
21a3faeb
JB
11195 else
11196 abort ();
76f227a5 11197 break;
78467458
JB
11198 case 'Z':
11199 if (l == 0)
11200 {
11201 /* These insns ignore ModR/M.mod: Force it to 3 for OP_E(). */
11202 modrm.mod = 3;
11203 if (!intel_syntax && (sizeflag & SUFFIX_ALWAYS))
11204 *obufp++ = address_mode == mode_64bit ? 'q' : 'l';
11205 }
11206 else if (l == 1 && last[0] == 'X')
11207 {
11208 if (!need_vex || !vex.evex)
11209 abort ();
11210 if (intel_syntax
11211 || ((modrm.mod == 3 || vex.b) && !(sizeflag & SUFFIX_ALWAYS)))
11212 break;
11213 switch (vex.length)
11214 {
11215 case 128:
11216 *obufp++ = 'x';
11217 break;
11218 case 256:
11219 *obufp++ = 'y';
11220 break;
11221 case 512:
11222 *obufp++ = 'z';
11223 break;
11224 default:
11225 abort ();
11226 }
11227 }
11228 else
11229 abort ();
11230 break;
a72d2af2
L
11231 case '^':
11232 if (intel_syntax)
11233 break;
5990e377
JB
11234 if (isa64 == intel64 && (rex & REX_W))
11235 {
11236 USED_REX (REX_W);
11237 *obufp++ = 'q';
11238 break;
11239 }
a72d2af2
L
11240 if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
11241 {
11242 if (sizeflag & DFLAG)
11243 *obufp++ = 'l';
11244 else
11245 *obufp++ = 'w';
11246 used_prefixes |= (prefixes & PREFIX_DATA);
11247 }
11248 break;
252b5132 11249 }
21a3faeb
JB
11250
11251 if (len == l)
11252 len = l = 0;
252b5132
RH
11253 }
11254 *obufp = 0;
ea397f5b 11255 mnemonicendp = obufp;
6439fc28 11256 return 0;
252b5132
RH
11257}
11258
11259static void
26ca5450 11260oappend (const char *s)
252b5132 11261{
ea397f5b 11262 obufp = stpcpy (obufp, s);
252b5132
RH
11263}
11264
11265static void
26ca5450 11266append_seg (void)
252b5132 11267{
285ca992
L
11268 /* Only print the active segment register. */
11269 if (!active_seg_prefix)
11270 return;
11271
11272 used_prefixes |= active_seg_prefix;
11273 switch (active_seg_prefix)
7d421014 11274 {
285ca992 11275 case PREFIX_CS:
9ce09ba2 11276 oappend_maybe_intel ("%cs:");
285ca992
L
11277 break;
11278 case PREFIX_DS:
9ce09ba2 11279 oappend_maybe_intel ("%ds:");
285ca992
L
11280 break;
11281 case PREFIX_SS:
9ce09ba2 11282 oappend_maybe_intel ("%ss:");
285ca992
L
11283 break;
11284 case PREFIX_ES:
9ce09ba2 11285 oappend_maybe_intel ("%es:");
285ca992
L
11286 break;
11287 case PREFIX_FS:
9ce09ba2 11288 oappend_maybe_intel ("%fs:");
285ca992
L
11289 break;
11290 case PREFIX_GS:
9ce09ba2 11291 oappend_maybe_intel ("%gs:");
285ca992
L
11292 break;
11293 default:
11294 break;
7d421014 11295 }
252b5132
RH
11296}
11297
11298static void
26ca5450 11299OP_indirE (int bytemode, int sizeflag)
252b5132
RH
11300{
11301 if (!intel_syntax)
11302 oappend ("*");
11303 OP_E (bytemode, sizeflag);
11304}
11305
52b15da3 11306static void
26ca5450 11307print_operand_value (char *buf, int hex, bfd_vma disp)
52b15da3 11308{
cb712a9e 11309 if (address_mode == mode_64bit)
52b15da3
JH
11310 {
11311 if (hex)
11312 {
11313 char tmp[30];
11314 int i;
11315 buf[0] = '0';
11316 buf[1] = 'x';
11317 sprintf_vma (tmp, disp);
6608db57 11318 for (i = 0; tmp[i] == '0' && tmp[i + 1]; i++);
52b15da3
JH
11319 strcpy (buf + 2, tmp + i);
11320 }
11321 else
11322 {
11323 bfd_signed_vma v = disp;
11324 char tmp[30];
11325 int i;
11326 if (v < 0)
11327 {
11328 *(buf++) = '-';
11329 v = -disp;
6608db57 11330 /* Check for possible overflow on 0x8000000000000000. */
52b15da3
JH
11331 if (v < 0)
11332 {
11333 strcpy (buf, "9223372036854775808");
11334 return;
11335 }
11336 }
11337 if (!v)
11338 {
11339 strcpy (buf, "0");
11340 return;
11341 }
11342
11343 i = 0;
11344 tmp[29] = 0;
11345 while (v)
11346 {
6608db57 11347 tmp[28 - i] = (v % 10) + '0';
52b15da3
JH
11348 v /= 10;
11349 i++;
11350 }
11351 strcpy (buf, tmp + 29 - i);
11352 }
11353 }
11354 else
11355 {
11356 if (hex)
11357 sprintf (buf, "0x%x", (unsigned int) disp);
11358 else
11359 sprintf (buf, "%d", (int) disp);
11360 }
11361}
11362
5d669648
L
11363/* Put DISP in BUF as signed hex number. */
11364
11365static void
11366print_displacement (char *buf, bfd_vma disp)
11367{
11368 bfd_signed_vma val = disp;
11369 char tmp[30];
11370 int i, j = 0;
11371
11372 if (val < 0)
11373 {
11374 buf[j++] = '-';
11375 val = -disp;
11376
11377 /* Check for possible overflow. */
11378 if (val < 0)
11379 {
11380 switch (address_mode)
11381 {
11382 case mode_64bit:
11383 strcpy (buf + j, "0x8000000000000000");
11384 break;
11385 case mode_32bit:
11386 strcpy (buf + j, "0x80000000");
11387 break;
11388 case mode_16bit:
11389 strcpy (buf + j, "0x8000");
11390 break;
11391 }
11392 return;
11393 }
11394 }
11395
11396 buf[j++] = '0';
11397 buf[j++] = 'x';
11398
0af1713e 11399 sprintf_vma (tmp, (bfd_vma) val);
5d669648
L
11400 for (i = 0; tmp[i] == '0'; i++)
11401 continue;
11402 if (tmp[i] == '\0')
11403 i--;
11404 strcpy (buf + j, tmp + i);
11405}
11406
3f31e633
JB
11407static void
11408intel_operand_size (int bytemode, int sizeflag)
11409{
43234a1e
L
11410 if (vex.evex
11411 && vex.b
11412 && (bytemode == x_mode
11413 || bytemode == evex_half_bcst_xmmq_mode))
11414 {
11415 if (vex.w)
11416 oappend ("QWORD PTR ");
11417 else
11418 oappend ("DWORD PTR ");
11419 return;
11420 }
3f31e633
JB
11421 switch (bytemode)
11422 {
11423 case b_mode:
b6169b20 11424 case b_swap_mode:
42903f7f 11425 case dqb_mode:
1ba585e8 11426 case db_mode:
3f31e633
JB
11427 oappend ("BYTE PTR ");
11428 break;
11429 case w_mode:
1ba585e8 11430 case dw_mode:
3f31e633
JB
11431 case dqw_mode:
11432 oappend ("WORD PTR ");
11433 break;
07f5af7d
L
11434 case indir_v_mode:
11435 if (address_mode == mode_64bit && isa64 == intel64)
11436 {
11437 oappend ("QWORD PTR ");
11438 break;
11439 }
1a0670f3 11440 /* Fall through. */
1a114b12 11441 case stack_v_mode:
7bb15c6f 11442 if (address_mode == mode_64bit && ((sizeflag & DFLAG) || (rex & REX_W)))
3f31e633
JB
11443 {
11444 oappend ("QWORD PTR ");
3f31e633
JB
11445 break;
11446 }
1a0670f3 11447 /* Fall through. */
3f31e633 11448 case v_mode:
b6169b20 11449 case v_swap_mode:
3f31e633 11450 case dq_mode:
161a04f6
L
11451 USED_REX (REX_W);
11452 if (rex & REX_W)
3f31e633 11453 oappend ("QWORD PTR ");
035e7389
JB
11454 else if (bytemode == dq_mode)
11455 oappend ("DWORD PTR ");
3f31e633 11456 else
f16cd0d5 11457 {
035e7389 11458 if (sizeflag & DFLAG)
f16cd0d5
L
11459 oappend ("DWORD PTR ");
11460 else
11461 oappend ("WORD PTR ");
11462 used_prefixes |= (prefixes & PREFIX_DATA);
11463 }
3f31e633 11464 break;
52fd6d94 11465 case z_mode:
161a04f6 11466 if ((rex & REX_W) || (sizeflag & DFLAG))
52fd6d94
JB
11467 *obufp++ = 'D';
11468 oappend ("WORD PTR ");
161a04f6 11469 if (!(rex & REX_W))
52fd6d94
JB
11470 used_prefixes |= (prefixes & PREFIX_DATA);
11471 break;
34b772a6
JB
11472 case a_mode:
11473 if (sizeflag & DFLAG)
11474 oappend ("QWORD PTR ");
11475 else
11476 oappend ("DWORD PTR ");
11477 used_prefixes |= (prefixes & PREFIX_DATA);
11478 break;
bc31405e
L
11479 case movsxd_mode:
11480 if (!(sizeflag & DFLAG) && isa64 == intel64)
11481 oappend ("WORD PTR ");
11482 else
11483 oappend ("DWORD PTR ");
11484 used_prefixes |= (prefixes & PREFIX_DATA);
11485 break;
3f31e633 11486 case d_mode:
fa99fab2 11487 case d_swap_mode:
42903f7f 11488 case dqd_mode:
3f31e633
JB
11489 oappend ("DWORD PTR ");
11490 break;
11491 case q_mode:
b6169b20 11492 case q_swap_mode:
3f31e633
JB
11493 oappend ("QWORD PTR ");
11494 break;
11495 case m_mode:
cb712a9e 11496 if (address_mode == mode_64bit)
3f31e633
JB
11497 oappend ("QWORD PTR ");
11498 else
11499 oappend ("DWORD PTR ");
11500 break;
11501 case f_mode:
11502 if (sizeflag & DFLAG)
11503 oappend ("FWORD PTR ");
11504 else
11505 oappend ("DWORD PTR ");
11506 used_prefixes |= (prefixes & PREFIX_DATA);
11507 break;
11508 case t_mode:
11509 oappend ("TBYTE PTR ");
11510 break;
11511 case x_mode:
b6169b20 11512 case x_swap_mode:
43234a1e
L
11513 case evex_x_gscat_mode:
11514 case evex_x_nobcst_mode:
4726e9a4 11515 case bw_unit_mode:
c0f3af97
L
11516 if (need_vex)
11517 {
11518 switch (vex.length)
11519 {
11520 case 128:
11521 oappend ("XMMWORD PTR ");
11522 break;
11523 case 256:
11524 oappend ("YMMWORD PTR ");
11525 break;
43234a1e
L
11526 case 512:
11527 oappend ("ZMMWORD PTR ");
11528 break;
c0f3af97
L
11529 default:
11530 abort ();
11531 }
11532 }
11533 else
11534 oappend ("XMMWORD PTR ");
11535 break;
11536 case xmm_mode:
3f31e633
JB
11537 oappend ("XMMWORD PTR ");
11538 break;
43234a1e
L
11539 case ymm_mode:
11540 oappend ("YMMWORD PTR ");
11541 break;
c0f3af97 11542 case xmmq_mode:
43234a1e 11543 case evex_half_bcst_xmmq_mode:
c0f3af97
L
11544 if (!need_vex)
11545 abort ();
11546
11547 switch (vex.length)
11548 {
11549 case 128:
11550 oappend ("QWORD PTR ");
11551 break;
11552 case 256:
11553 oappend ("XMMWORD PTR ");
11554 break;
43234a1e
L
11555 case 512:
11556 oappend ("YMMWORD PTR ");
11557 break;
c0f3af97
L
11558 default:
11559 abort ();
11560 }
11561 break;
6c30d220
L
11562 case xmm_mb_mode:
11563 if (!need_vex)
11564 abort ();
11565
11566 switch (vex.length)
11567 {
11568 case 128:
11569 case 256:
43234a1e 11570 case 512:
6c30d220
L
11571 oappend ("BYTE PTR ");
11572 break;
11573 default:
11574 abort ();
11575 }
11576 break;
11577 case xmm_mw_mode:
11578 if (!need_vex)
11579 abort ();
11580
11581 switch (vex.length)
11582 {
11583 case 128:
11584 case 256:
43234a1e 11585 case 512:
6c30d220
L
11586 oappend ("WORD PTR ");
11587 break;
11588 default:
11589 abort ();
11590 }
11591 break;
11592 case xmm_md_mode:
11593 if (!need_vex)
11594 abort ();
11595
11596 switch (vex.length)
11597 {
11598 case 128:
11599 case 256:
43234a1e 11600 case 512:
6c30d220
L
11601 oappend ("DWORD PTR ");
11602 break;
11603 default:
11604 abort ();
11605 }
11606 break;
11607 case xmm_mq_mode:
11608 if (!need_vex)
11609 abort ();
11610
11611 switch (vex.length)
11612 {
11613 case 128:
11614 case 256:
43234a1e 11615 case 512:
6c30d220
L
11616 oappend ("QWORD PTR ");
11617 break;
11618 default:
11619 abort ();
11620 }
11621 break;
11622 case xmmdw_mode:
11623 if (!need_vex)
11624 abort ();
11625
11626 switch (vex.length)
11627 {
11628 case 128:
11629 oappend ("WORD PTR ");
11630 break;
11631 case 256:
11632 oappend ("DWORD PTR ");
11633 break;
43234a1e
L
11634 case 512:
11635 oappend ("QWORD PTR ");
11636 break;
6c30d220
L
11637 default:
11638 abort ();
11639 }
11640 break;
11641 case xmmqd_mode:
11642 if (!need_vex)
11643 abort ();
11644
11645 switch (vex.length)
11646 {
11647 case 128:
11648 oappend ("DWORD PTR ");
11649 break;
11650 case 256:
11651 oappend ("QWORD PTR ");
11652 break;
43234a1e
L
11653 case 512:
11654 oappend ("XMMWORD PTR ");
11655 break;
6c30d220
L
11656 default:
11657 abort ();
11658 }
11659 break;
c0f3af97
L
11660 case ymmq_mode:
11661 if (!need_vex)
11662 abort ();
11663
11664 switch (vex.length)
11665 {
11666 case 128:
11667 oappend ("QWORD PTR ");
11668 break;
11669 case 256:
11670 oappend ("YMMWORD PTR ");
11671 break;
43234a1e
L
11672 case 512:
11673 oappend ("ZMMWORD PTR ");
11674 break;
c0f3af97
L
11675 default:
11676 abort ();
11677 }
11678 break;
6c30d220
L
11679 case ymmxmm_mode:
11680 if (!need_vex)
11681 abort ();
11682
11683 switch (vex.length)
11684 {
11685 case 128:
11686 case 256:
11687 oappend ("XMMWORD PTR ");
11688 break;
11689 default:
11690 abort ();
11691 }
11692 break;
fb9c77c7
L
11693 case o_mode:
11694 oappend ("OWORD PTR ");
11695 break;
1c480963 11696 case vex_scalar_w_dq_mode:
0bfee649
L
11697 if (!need_vex)
11698 abort ();
11699
11700 if (vex.w)
11701 oappend ("QWORD PTR ");
11702 else
11703 oappend ("DWORD PTR ");
11704 break;
43234a1e
L
11705 case vex_vsib_d_w_dq_mode:
11706 case vex_vsib_q_w_dq_mode:
11707 if (!need_vex)
11708 abort ();
11709
11710 if (!vex.evex)
11711 {
11712 if (vex.w)
11713 oappend ("QWORD PTR ");
11714 else
11715 oappend ("DWORD PTR ");
11716 }
11717 else
11718 {
b28d1bda
IT
11719 switch (vex.length)
11720 {
11721 case 128:
11722 oappend ("XMMWORD PTR ");
11723 break;
11724 case 256:
11725 oappend ("YMMWORD PTR ");
11726 break;
11727 case 512:
11728 oappend ("ZMMWORD PTR ");
11729 break;
11730 default:
11731 abort ();
11732 }
43234a1e
L
11733 }
11734 break;
5fc35d96
IT
11735 case vex_vsib_q_w_d_mode:
11736 case vex_vsib_d_w_d_mode:
b28d1bda 11737 if (!need_vex || !vex.evex)
5fc35d96
IT
11738 abort ();
11739
b28d1bda
IT
11740 switch (vex.length)
11741 {
11742 case 128:
11743 oappend ("QWORD PTR ");
11744 break;
11745 case 256:
11746 oappend ("XMMWORD PTR ");
11747 break;
11748 case 512:
11749 oappend ("YMMWORD PTR ");
11750 break;
11751 default:
11752 abort ();
11753 }
5fc35d96
IT
11754
11755 break;
1ba585e8
IT
11756 case mask_bd_mode:
11757 if (!need_vex || vex.length != 128)
11758 abort ();
11759 if (vex.w)
11760 oappend ("DWORD PTR ");
11761 else
11762 oappend ("BYTE PTR ");
11763 break;
43234a1e
L
11764 case mask_mode:
11765 if (!need_vex)
11766 abort ();
1ba585e8
IT
11767 if (vex.w)
11768 oappend ("QWORD PTR ");
11769 else
11770 oappend ("WORD PTR ");
43234a1e 11771 break;
6c75cc62 11772 case v_bnd_mode:
d276ec69 11773 case v_bndmk_mode:
3f31e633
JB
11774 default:
11775 break;
11776 }
11777}
11778
252b5132 11779static void
c0f3af97 11780OP_E_register (int bytemode, int sizeflag)
252b5132 11781{
c0f3af97
L
11782 int reg = modrm.rm;
11783 const char **names;
252b5132 11784
c0f3af97
L
11785 USED_REX (REX_B);
11786 if ((rex & REX_B))
11787 reg += 8;
252b5132 11788
b6169b20 11789 if ((sizeflag & SUFFIX_ALWAYS)
1ba585e8 11790 && (bytemode == b_swap_mode
9f79e886 11791 || bytemode == bnd_swap_mode
60227d64 11792 || bytemode == v_swap_mode))
b6169b20
L
11793 swap_operand ();
11794
c0f3af97 11795 switch (bytemode)
252b5132 11796 {
c0f3af97 11797 case b_mode:
b6169b20 11798 case b_swap_mode:
e184e611
JB
11799 if (reg & 4)
11800 USED_REX (0);
c0f3af97
L
11801 if (rex)
11802 names = names8rex;
11803 else
11804 names = names8;
11805 break;
11806 case w_mode:
11807 names = names16;
11808 break;
11809 case d_mode:
1ba585e8
IT
11810 case dw_mode:
11811 case db_mode:
c0f3af97
L
11812 names = names32;
11813 break;
11814 case q_mode:
11815 names = names64;
11816 break;
11817 case m_mode:
6c75cc62 11818 case v_bnd_mode:
c0f3af97
L
11819 names = address_mode == mode_64bit ? names64 : names32;
11820 break;
7e8b059b 11821 case bnd_mode:
9f79e886 11822 case bnd_swap_mode:
0d96e4df
L
11823 if (reg > 0x3)
11824 {
11825 oappend ("(bad)");
11826 return;
11827 }
7e8b059b
L
11828 names = names_bnd;
11829 break;
07f5af7d
L
11830 case indir_v_mode:
11831 if (address_mode == mode_64bit && isa64 == intel64)
11832 {
11833 names = names64;
11834 break;
11835 }
1a0670f3 11836 /* Fall through. */
c0f3af97 11837 case stack_v_mode:
7bb15c6f 11838 if (address_mode == mode_64bit && ((sizeflag & DFLAG) || (rex & REX_W)))
252b5132 11839 {
c0f3af97 11840 names = names64;
252b5132 11841 break;
252b5132 11842 }
c0f3af97 11843 bytemode = v_mode;
1a0670f3 11844 /* Fall through. */
c0f3af97 11845 case v_mode:
b6169b20 11846 case v_swap_mode:
c0f3af97
L
11847 case dq_mode:
11848 case dqb_mode:
11849 case dqd_mode:
11850 case dqw_mode:
11851 USED_REX (REX_W);
11852 if (rex & REX_W)
11853 names = names64;
035e7389
JB
11854 else if (bytemode != v_mode && bytemode != v_swap_mode)
11855 names = names32;
c0f3af97 11856 else
f16cd0d5 11857 {
035e7389 11858 if (sizeflag & DFLAG)
f16cd0d5
L
11859 names = names32;
11860 else
11861 names = names16;
11862 used_prefixes |= (prefixes & PREFIX_DATA);
11863 }
c0f3af97 11864 break;
bc31405e
L
11865 case movsxd_mode:
11866 if (!(sizeflag & DFLAG) && isa64 == intel64)
11867 names = names16;
11868 else
11869 names = names32;
11870 used_prefixes |= (prefixes & PREFIX_DATA);
11871 break;
de89d0a3
IT
11872 case va_mode:
11873 names = (address_mode == mode_64bit
11874 ? names64 : names32);
11875 if (!(prefixes & PREFIX_ADDR))
aa178437
IT
11876 names = (address_mode == mode_16bit
11877 ? names16 : names);
de89d0a3
IT
11878 else
11879 {
11880 /* Remove "addr16/addr32". */
11881 all_prefixes[last_addr_prefix] = 0;
11882 names = (address_mode != mode_32bit
11883 ? names32 : names16);
11884 used_prefixes |= PREFIX_ADDR;
11885 }
11886 break;
1ba585e8 11887 case mask_bd_mode:
43234a1e 11888 case mask_mode:
9889cbb1
L
11889 if (reg > 0x7)
11890 {
11891 oappend ("(bad)");
11892 return;
11893 }
43234a1e
L
11894 names = names_mask;
11895 break;
c0f3af97
L
11896 case 0:
11897 return;
11898 default:
11899 oappend (INTERNAL_DISASSEMBLER_ERROR);
252b5132
RH
11900 return;
11901 }
c0f3af97
L
11902 oappend (names[reg]);
11903}
11904
11905static void
c1e679ec 11906OP_E_memory (int bytemode, int sizeflag)
c0f3af97
L
11907{
11908 bfd_vma disp = 0;
11909 int add = (rex & REX_B) ? 8 : 0;
11910 int riprel = 0;
43234a1e
L
11911 int shift;
11912
11913 if (vex.evex)
11914 {
11915 /* In EVEX, if operand doesn't allow broadcast, vex.b should be 0. */
11916 if (vex.b
11917 && bytemode != x_mode
90a915bf 11918 && bytemode != xmmq_mode
43234a1e
L
11919 && bytemode != evex_half_bcst_xmmq_mode)
11920 {
11921 BadOp ();
11922 return;
11923 }
11924 switch (bytemode)
11925 {
1ba585e8
IT
11926 case dqw_mode:
11927 case dw_mode:
059edf8b 11928 case xmm_mw_mode:
1ba585e8
IT
11929 shift = 1;
11930 break;
11931 case dqb_mode:
11932 case db_mode:
059edf8b 11933 case xmm_mb_mode:
1ba585e8
IT
11934 shift = 0;
11935 break;
b50c9f31
JB
11936 case dq_mode:
11937 if (address_mode != mode_64bit)
11938 {
059edf8b
JB
11939 case dqd_mode:
11940 case xmm_md_mode:
11941 case d_mode:
11942 case d_swap_mode:
b50c9f31
JB
11943 shift = 2;
11944 break;
11945 }
11946 /* fall through */
4102be5c 11947 case vex_scalar_w_dq_mode:
43234a1e 11948 case vex_vsib_d_w_dq_mode:
5fc35d96 11949 case vex_vsib_d_w_d_mode:
eaa9d1ad 11950 case vex_vsib_q_w_dq_mode:
5fc35d96 11951 case vex_vsib_q_w_d_mode:
43234a1e 11952 case evex_x_gscat_mode:
43234a1e
L
11953 shift = vex.w ? 3 : 2;
11954 break;
43234a1e
L
11955 case x_mode:
11956 case evex_half_bcst_xmmq_mode:
90a915bf 11957 case xmmq_mode:
43234a1e
L
11958 if (vex.b)
11959 {
11960 shift = vex.w ? 3 : 2;
11961 break;
11962 }
1a0670f3 11963 /* Fall through. */
43234a1e
L
11964 case xmmqd_mode:
11965 case xmmdw_mode:
43234a1e
L
11966 case ymmq_mode:
11967 case evex_x_nobcst_mode:
11968 case x_swap_mode:
11969 switch (vex.length)
11970 {
11971 case 128:
11972 shift = 4;
11973 break;
11974 case 256:
11975 shift = 5;
11976 break;
11977 case 512:
11978 shift = 6;
11979 break;
11980 default:
11981 abort ();
11982 }
059edf8b
JB
11983 /* Make necessary corrections to shift for modes that need it. */
11984 if (bytemode == xmmq_mode
11985 || bytemode == evex_half_bcst_xmmq_mode
11986 || (bytemode == ymmq_mode && vex.length == 128))
11987 shift -= 1;
11988 else if (bytemode == xmmqd_mode)
11989 shift -= 2;
11990 else if (bytemode == xmmdw_mode)
11991 shift -= 3;
43234a1e
L
11992 break;
11993 case ymm_mode:
11994 shift = 5;
11995 break;
11996 case xmm_mode:
11997 shift = 4;
11998 break;
11999 case xmm_mq_mode:
12000 case q_mode:
43234a1e 12001 case q_swap_mode:
43234a1e
L
12002 shift = 3;
12003 break;
4726e9a4
JB
12004 case bw_unit_mode:
12005 shift = vex.w ? 1 : 0;
12006 break;
43234a1e
L
12007 default:
12008 abort ();
12009 }
43234a1e
L
12010 }
12011 else
12012 shift = 0;
252b5132 12013
c0f3af97 12014 USED_REX (REX_B);
3f31e633
JB
12015 if (intel_syntax)
12016 intel_operand_size (bytemode, sizeflag);
252b5132
RH
12017 append_seg ();
12018
5d669648 12019 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
252b5132 12020 {
5d669648
L
12021 /* 32/64 bit address mode */
12022 int havedisp;
252b5132
RH
12023 int havesib;
12024 int havebase;
0f7da397 12025 int haveindex;
20afcfb7 12026 int needindex;
1bc60e56 12027 int needaddr32;
82c18208 12028 int base, rbase;
91d6fa6a 12029 int vindex = 0;
252b5132 12030 int scale = 0;
7e8b059b
L
12031 int addr32flag = !((sizeflag & AFLAG)
12032 || bytemode == v_bnd_mode
d276ec69 12033 || bytemode == v_bndmk_mode
9f79e886
JB
12034 || bytemode == bnd_mode
12035 || bytemode == bnd_swap_mode);
6c30d220
L
12036 const char **indexes64 = names64;
12037 const char **indexes32 = names32;
252b5132
RH
12038
12039 havesib = 0;
12040 havebase = 1;
0f7da397 12041 haveindex = 0;
7967e09e 12042 base = modrm.rm;
252b5132
RH
12043
12044 if (base == 4)
12045 {
12046 havesib = 1;
dfc8cf43 12047 vindex = sib.index;
161a04f6
L
12048 USED_REX (REX_X);
12049 if (rex & REX_X)
91d6fa6a 12050 vindex += 8;
6c30d220
L
12051 switch (bytemode)
12052 {
12053 case vex_vsib_d_w_dq_mode:
5fc35d96 12054 case vex_vsib_d_w_d_mode:
6c30d220 12055 case vex_vsib_q_w_dq_mode:
5fc35d96 12056 case vex_vsib_q_w_d_mode:
6c30d220
L
12057 if (!need_vex)
12058 abort ();
43234a1e
L
12059 if (vex.evex)
12060 {
12061 if (!vex.v)
12062 vindex += 16;
12063 }
6c30d220
L
12064
12065 haveindex = 1;
12066 switch (vex.length)
12067 {
12068 case 128:
7bb15c6f 12069 indexes64 = indexes32 = names_xmm;
6c30d220
L
12070 break;
12071 case 256:
5fc35d96
IT
12072 if (!vex.w
12073 || bytemode == vex_vsib_q_w_dq_mode
12074 || bytemode == vex_vsib_q_w_d_mode)
7bb15c6f 12075 indexes64 = indexes32 = names_ymm;
6c30d220 12076 else
7bb15c6f 12077 indexes64 = indexes32 = names_xmm;
6c30d220 12078 break;
43234a1e 12079 case 512:
5fc35d96
IT
12080 if (!vex.w
12081 || bytemode == vex_vsib_q_w_dq_mode
12082 || bytemode == vex_vsib_q_w_d_mode)
43234a1e
L
12083 indexes64 = indexes32 = names_zmm;
12084 else
12085 indexes64 = indexes32 = names_ymm;
12086 break;
6c30d220
L
12087 default:
12088 abort ();
12089 }
12090 break;
12091 default:
12092 haveindex = vindex != 4;
12093 break;
12094 }
12095 scale = sib.scale;
12096 base = sib.base;
252b5132
RH
12097 codep++;
12098 }
260cd341
LC
12099 else
12100 {
12101 /* mandatory non-vector SIB must have sib */
12102 if (bytemode == vex_sibmem_mode)
12103 {
12104 oappend ("(bad)");
12105 return;
12106 }
12107 }
82c18208 12108 rbase = base + add;
252b5132 12109
7967e09e 12110 switch (modrm.mod)
252b5132
RH
12111 {
12112 case 0:
82c18208 12113 if (base == 5)
252b5132
RH
12114 {
12115 havebase = 0;
cb712a9e 12116 if (address_mode == mode_64bit && !havesib)
52b15da3
JH
12117 riprel = 1;
12118 disp = get32s ();
d276ec69
JB
12119 if (riprel && bytemode == v_bndmk_mode)
12120 {
12121 oappend ("(bad)");
12122 return;
12123 }
252b5132
RH
12124 }
12125 break;
12126 case 1:
12127 FETCH_DATA (the_info, codep + 1);
12128 disp = *codep++;
12129 if ((disp & 0x80) != 0)
12130 disp -= 0x100;
43234a1e
L
12131 if (vex.evex && shift > 0)
12132 disp <<= shift;
252b5132
RH
12133 break;
12134 case 2:
52b15da3 12135 disp = get32s ();
252b5132
RH
12136 break;
12137 }
12138
1bc60e56
L
12139 needindex = 0;
12140 needaddr32 = 0;
12141 if (havesib
12142 && !havebase
12143 && !haveindex
12144 && address_mode != mode_16bit)
12145 {
12146 if (address_mode == mode_64bit)
12147 {
8e58ef80
L
12148 if (addr32flag)
12149 {
12150 /* Without base nor index registers, zero-extend the
12151 lower 32-bit displacement to 64 bits. */
12152 disp = (unsigned int) disp;
bf4ba07c 12153 needindex = 1;
8e58ef80 12154 }
1bc60e56
L
12155 needaddr32 = 1;
12156 }
12157 else
12158 {
12159 /* In 32-bit mode, we need index register to tell [offset]
12160 from [eiz*1 + offset]. */
12161 needindex = 1;
12162 }
12163 }
12164
20afcfb7
L
12165 havedisp = (havebase
12166 || needindex
12167 || (havesib && (haveindex || scale != 0)));
5d669648 12168
252b5132 12169 if (!intel_syntax)
82c18208 12170 if (modrm.mod != 0 || base == 5)
db6eb5be 12171 {
5d669648
L
12172 if (havedisp || riprel)
12173 print_displacement (scratchbuf, disp);
12174 else
12175 print_operand_value (scratchbuf, 1, disp);
db6eb5be 12176 oappend (scratchbuf);
52b15da3
JH
12177 if (riprel)
12178 {
12179 set_op (disp, 1);
28596323 12180 oappend (!addr32flag ? "(%rip)" : "(%eip)");
52b15da3 12181 }
db6eb5be 12182 }
2da11e11 12183
c1dc7af5 12184 if ((havebase || haveindex || needindex || needaddr32 || riprel)
a23b33b3
JB
12185 && (address_mode != mode_64bit
12186 || ((bytemode != v_bnd_mode)
12187 && (bytemode != v_bndmk_mode)
12188 && (bytemode != bnd_mode)
12189 && (bytemode != bnd_swap_mode))))
87767711
JB
12190 used_prefixes |= PREFIX_ADDR;
12191
5d669648 12192 if (havedisp || (intel_syntax && riprel))
252b5132 12193 {
252b5132 12194 *obufp++ = open_char;
52b15da3 12195 if (intel_syntax && riprel)
185b1163
L
12196 {
12197 set_op (disp, 1);
28596323 12198 oappend (!addr32flag ? "rip" : "eip");
185b1163 12199 }
db6eb5be 12200 *obufp = '\0';
252b5132 12201 if (havebase)
7e8b059b 12202 oappend (address_mode == mode_64bit && !addr32flag
82c18208 12203 ? names64[rbase] : names32[rbase]);
252b5132
RH
12204 if (havesib)
12205 {
db51cc60
L
12206 /* ESP/RSP won't allow index. If base isn't ESP/RSP,
12207 print index to tell base + index from base. */
12208 if (scale != 0
20afcfb7 12209 || needindex
db51cc60
L
12210 || haveindex
12211 || (havebase && base != ESP_REG_NUM))
252b5132 12212 {
9306ca4a 12213 if (!intel_syntax || havebase)
db6eb5be 12214 {
9306ca4a
JB
12215 *obufp++ = separator_char;
12216 *obufp = '\0';
db6eb5be 12217 }
db51cc60 12218 if (haveindex)
7e8b059b 12219 oappend (address_mode == mode_64bit && !addr32flag
6c30d220 12220 ? indexes64[vindex] : indexes32[vindex]);
db51cc60 12221 else
7e8b059b 12222 oappend (address_mode == mode_64bit && !addr32flag
db51cc60
L
12223 ? index64 : index32);
12224
db6eb5be
AM
12225 *obufp++ = scale_char;
12226 *obufp = '\0';
12227 sprintf (scratchbuf, "%d", 1 << scale);
12228 oappend (scratchbuf);
12229 }
252b5132 12230 }
185b1163 12231 if (intel_syntax
82c18208 12232 && (disp || modrm.mod != 0 || base == 5))
3d456fa1 12233 {
db51cc60 12234 if (!havedisp || (bfd_signed_vma) disp >= 0)
3d456fa1
JB
12235 {
12236 *obufp++ = '+';
12237 *obufp = '\0';
12238 }
05203043 12239 else if (modrm.mod != 1 && disp != -disp)
3d456fa1
JB
12240 {
12241 *obufp++ = '-';
12242 *obufp = '\0';
b4b39349 12243 disp = -disp;
3d456fa1
JB
12244 }
12245
db51cc60
L
12246 if (havedisp)
12247 print_displacement (scratchbuf, disp);
12248 else
12249 print_operand_value (scratchbuf, 1, disp);
3d456fa1
JB
12250 oappend (scratchbuf);
12251 }
252b5132
RH
12252
12253 *obufp++ = close_char;
db6eb5be 12254 *obufp = '\0';
252b5132
RH
12255 }
12256 else if (intel_syntax)
db6eb5be 12257 {
82c18208 12258 if (modrm.mod != 0 || base == 5)
db6eb5be 12259 {
285ca992 12260 if (!active_seg_prefix)
252b5132 12261 {
d708bcba 12262 oappend (names_seg[ds_reg - es_reg]);
252b5132
RH
12263 oappend (":");
12264 }
52b15da3 12265 print_operand_value (scratchbuf, 1, disp);
db6eb5be
AM
12266 oappend (scratchbuf);
12267 }
12268 }
252b5132 12269 }
a23b33b3
JB
12270 else if (bytemode == v_bnd_mode
12271 || bytemode == v_bndmk_mode
12272 || bytemode == bnd_mode
12273 || bytemode == bnd_swap_mode)
12274 {
12275 oappend ("(bad)");
12276 return;
12277 }
252b5132 12278 else
f16cd0d5
L
12279 {
12280 /* 16 bit address mode */
12281 used_prefixes |= prefixes & PREFIX_ADDR;
7967e09e 12282 switch (modrm.mod)
252b5132
RH
12283 {
12284 case 0:
7967e09e 12285 if (modrm.rm == 6)
252b5132
RH
12286 {
12287 disp = get16 ();
12288 if ((disp & 0x8000) != 0)
12289 disp -= 0x10000;
12290 }
12291 break;
12292 case 1:
12293 FETCH_DATA (the_info, codep + 1);
12294 disp = *codep++;
12295 if ((disp & 0x80) != 0)
12296 disp -= 0x100;
65f3ed04
JB
12297 if (vex.evex && shift > 0)
12298 disp <<= shift;
252b5132
RH
12299 break;
12300 case 2:
12301 disp = get16 ();
12302 if ((disp & 0x8000) != 0)
12303 disp -= 0x10000;
12304 break;
12305 }
12306
12307 if (!intel_syntax)
7967e09e 12308 if (modrm.mod != 0 || modrm.rm == 6)
db6eb5be 12309 {
5d669648 12310 print_displacement (scratchbuf, disp);
db6eb5be
AM
12311 oappend (scratchbuf);
12312 }
252b5132 12313
7967e09e 12314 if (modrm.mod != 0 || modrm.rm != 6)
252b5132
RH
12315 {
12316 *obufp++ = open_char;
db6eb5be 12317 *obufp = '\0';
7967e09e 12318 oappend (index16[modrm.rm]);
5d669648
L
12319 if (intel_syntax
12320 && (disp || modrm.mod != 0 || modrm.rm == 6))
3d456fa1 12321 {
5d669648 12322 if ((bfd_signed_vma) disp >= 0)
3d456fa1
JB
12323 {
12324 *obufp++ = '+';
12325 *obufp = '\0';
12326 }
7967e09e 12327 else if (modrm.mod != 1)
3d456fa1
JB
12328 {
12329 *obufp++ = '-';
12330 *obufp = '\0';
b4b39349 12331 disp = -disp;
3d456fa1
JB
12332 }
12333
5d669648 12334 print_displacement (scratchbuf, disp);
3d456fa1
JB
12335 oappend (scratchbuf);
12336 }
12337
db6eb5be
AM
12338 *obufp++ = close_char;
12339 *obufp = '\0';
252b5132 12340 }
3d456fa1
JB
12341 else if (intel_syntax)
12342 {
285ca992 12343 if (!active_seg_prefix)
3d456fa1
JB
12344 {
12345 oappend (names_seg[ds_reg - es_reg]);
12346 oappend (":");
12347 }
12348 print_operand_value (scratchbuf, 1, disp & 0xffff);
12349 oappend (scratchbuf);
12350 }
252b5132 12351 }
43234a1e
L
12352 if (vex.evex && vex.b
12353 && (bytemode == x_mode
90a915bf 12354 || bytemode == xmmq_mode
43234a1e
L
12355 || bytemode == evex_half_bcst_xmmq_mode))
12356 {
90a915bf
IT
12357 if (vex.w
12358 || bytemode == xmmq_mode
12359 || bytemode == evex_half_bcst_xmmq_mode)
b28d1bda
IT
12360 {
12361 switch (vex.length)
12362 {
12363 case 128:
12364 oappend ("{1to2}");
12365 break;
12366 case 256:
12367 oappend ("{1to4}");
12368 break;
12369 case 512:
12370 oappend ("{1to8}");
12371 break;
12372 default:
12373 abort ();
12374 }
12375 }
43234a1e 12376 else
b28d1bda
IT
12377 {
12378 switch (vex.length)
12379 {
12380 case 128:
12381 oappend ("{1to4}");
12382 break;
12383 case 256:
12384 oappend ("{1to8}");
12385 break;
12386 case 512:
12387 oappend ("{1to16}");
12388 break;
12389 default:
12390 abort ();
12391 }
12392 }
43234a1e 12393 }
252b5132
RH
12394}
12395
c0f3af97 12396static void
8b3f93e7 12397OP_E (int bytemode, int sizeflag)
c0f3af97
L
12398{
12399 /* Skip mod/rm byte. */
12400 MODRM_CHECK;
12401 codep++;
12402
12403 if (modrm.mod == 3)
12404 OP_E_register (bytemode, sizeflag);
12405 else
c1e679ec 12406 OP_E_memory (bytemode, sizeflag);
c0f3af97
L
12407}
12408
252b5132 12409static void
26ca5450 12410OP_G (int bytemode, int sizeflag)
252b5132 12411{
52b15da3 12412 int add = 0;
c0a30a9f 12413 const char **names;
161a04f6
L
12414 USED_REX (REX_R);
12415 if (rex & REX_R)
52b15da3 12416 add += 8;
252b5132
RH
12417 switch (bytemode)
12418 {
12419 case b_mode:
e184e611
JB
12420 if (modrm.reg & 4)
12421 USED_REX (0);
52b15da3 12422 if (rex)
7967e09e 12423 oappend (names8rex[modrm.reg + add]);
52b15da3 12424 else
7967e09e 12425 oappend (names8[modrm.reg + add]);
252b5132
RH
12426 break;
12427 case w_mode:
7967e09e 12428 oappend (names16[modrm.reg + add]);
252b5132
RH
12429 break;
12430 case d_mode:
1ba585e8
IT
12431 case db_mode:
12432 case dw_mode:
7967e09e 12433 oappend (names32[modrm.reg + add]);
52b15da3
JH
12434 break;
12435 case q_mode:
7967e09e 12436 oappend (names64[modrm.reg + add]);
252b5132 12437 break;
7e8b059b 12438 case bnd_mode:
0d96e4df
L
12439 if (modrm.reg > 0x3)
12440 {
12441 oappend ("(bad)");
12442 return;
12443 }
7e8b059b
L
12444 oappend (names_bnd[modrm.reg]);
12445 break;
252b5132 12446 case v_mode:
9306ca4a 12447 case dq_mode:
42903f7f
L
12448 case dqb_mode:
12449 case dqd_mode:
9306ca4a 12450 case dqw_mode:
bc31405e 12451 case movsxd_mode:
161a04f6
L
12452 USED_REX (REX_W);
12453 if (rex & REX_W)
7967e09e 12454 oappend (names64[modrm.reg + add]);
035e7389
JB
12455 else if (bytemode != v_mode && bytemode != movsxd_mode)
12456 oappend (names32[modrm.reg + add]);
252b5132 12457 else
f16cd0d5 12458 {
035e7389 12459 if (sizeflag & DFLAG)
f16cd0d5
L
12460 oappend (names32[modrm.reg + add]);
12461 else
12462 oappend (names16[modrm.reg + add]);
12463 used_prefixes |= (prefixes & PREFIX_DATA);
12464 }
252b5132 12465 break;
c0a30a9f
L
12466 case va_mode:
12467 names = (address_mode == mode_64bit
12468 ? names64 : names32);
12469 if (!(prefixes & PREFIX_ADDR))
12470 {
12471 if (address_mode == mode_16bit)
12472 names = names16;
12473 }
12474 else
12475 {
12476 /* Remove "addr16/addr32". */
12477 all_prefixes[last_addr_prefix] = 0;
12478 names = (address_mode != mode_32bit
12479 ? names32 : names16);
12480 used_prefixes |= PREFIX_ADDR;
12481 }
12482 oappend (names[modrm.reg + add]);
12483 break;
90700ea2 12484 case m_mode:
cb712a9e 12485 if (address_mode == mode_64bit)
7967e09e 12486 oappend (names64[modrm.reg + add]);
90700ea2 12487 else
7967e09e 12488 oappend (names32[modrm.reg + add]);
90700ea2 12489 break;
1ba585e8 12490 case mask_bd_mode:
43234a1e 12491 case mask_mode:
9889cbb1
L
12492 if ((modrm.reg + add) > 0x7)
12493 {
12494 oappend ("(bad)");
12495 return;
12496 }
43234a1e
L
12497 oappend (names_mask[modrm.reg + add]);
12498 break;
252b5132
RH
12499 default:
12500 oappend (INTERNAL_DISASSEMBLER_ERROR);
12501 break;
12502 }
12503}
12504
52b15da3 12505static bfd_vma
26ca5450 12506get64 (void)
52b15da3 12507{
5dd0794d 12508 bfd_vma x;
52b15da3 12509#ifdef BFD64
5dd0794d
AM
12510 unsigned int a;
12511 unsigned int b;
12512
52b15da3
JH
12513 FETCH_DATA (the_info, codep + 8);
12514 a = *codep++ & 0xff;
12515 a |= (*codep++ & 0xff) << 8;
12516 a |= (*codep++ & 0xff) << 16;
070fe95d 12517 a |= (*codep++ & 0xffu) << 24;
5dd0794d 12518 b = *codep++ & 0xff;
52b15da3
JH
12519 b |= (*codep++ & 0xff) << 8;
12520 b |= (*codep++ & 0xff) << 16;
070fe95d 12521 b |= (*codep++ & 0xffu) << 24;
52b15da3
JH
12522 x = a + ((bfd_vma) b << 32);
12523#else
6608db57 12524 abort ();
5dd0794d 12525 x = 0;
52b15da3
JH
12526#endif
12527 return x;
12528}
12529
12530static bfd_signed_vma
26ca5450 12531get32 (void)
252b5132 12532{
b4b39349 12533 bfd_vma x = 0;
252b5132
RH
12534
12535 FETCH_DATA (the_info, codep + 4);
b4b39349
AM
12536 x = *codep++ & (bfd_vma) 0xff;
12537 x |= (*codep++ & (bfd_vma) 0xff) << 8;
12538 x |= (*codep++ & (bfd_vma) 0xff) << 16;
12539 x |= (*codep++ & (bfd_vma) 0xff) << 24;
52b15da3
JH
12540 return x;
12541}
12542
12543static bfd_signed_vma
26ca5450 12544get32s (void)
52b15da3 12545{
b4b39349 12546 bfd_vma x = 0;
52b15da3
JH
12547
12548 FETCH_DATA (the_info, codep + 4);
b4b39349
AM
12549 x = *codep++ & (bfd_vma) 0xff;
12550 x |= (*codep++ & (bfd_vma) 0xff) << 8;
12551 x |= (*codep++ & (bfd_vma) 0xff) << 16;
12552 x |= (*codep++ & (bfd_vma) 0xff) << 24;
52b15da3 12553
b4b39349 12554 x = (x ^ ((bfd_vma) 1 << 31)) - ((bfd_vma) 1 << 31);
52b15da3 12555
252b5132
RH
12556 return x;
12557}
12558
12559static int
26ca5450 12560get16 (void)
252b5132
RH
12561{
12562 int x = 0;
12563
12564 FETCH_DATA (the_info, codep + 2);
12565 x = *codep++ & 0xff;
12566 x |= (*codep++ & 0xff) << 8;
12567 return x;
12568}
12569
12570static void
26ca5450 12571set_op (bfd_vma op, int riprel)
252b5132
RH
12572{
12573 op_index[op_ad] = op_ad;
cb712a9e 12574 if (address_mode == mode_64bit)
7081ff04
AJ
12575 {
12576 op_address[op_ad] = op;
12577 op_riprel[op_ad] = riprel;
12578 }
12579 else
12580 {
12581 /* Mask to get a 32-bit address. */
12582 op_address[op_ad] = op & 0xffffffff;
12583 op_riprel[op_ad] = riprel & 0xffffffff;
12584 }
252b5132
RH
12585}
12586
12587static void
26ca5450 12588OP_REG (int code, int sizeflag)
252b5132 12589{
2da11e11 12590 const char *s;
9b60702d 12591 int add;
de882298
RM
12592
12593 switch (code)
12594 {
12595 case es_reg: case ss_reg: case cs_reg:
12596 case ds_reg: case fs_reg: case gs_reg:
12597 oappend (names_seg[code - es_reg]);
12598 return;
12599 }
12600
161a04f6
L
12601 USED_REX (REX_B);
12602 if (rex & REX_B)
52b15da3 12603 add = 8;
9b60702d
L
12604 else
12605 add = 0;
52b15da3
JH
12606
12607 switch (code)
12608 {
52b15da3
JH
12609 case ax_reg: case cx_reg: case dx_reg: case bx_reg:
12610 case sp_reg: case bp_reg: case si_reg: case di_reg:
12611 s = names16[code - ax_reg + add];
12612 break;
e184e611 12613 case ah_reg: case ch_reg: case dh_reg: case bh_reg:
52b15da3 12614 USED_REX (0);
e184e611
JB
12615 /* Fall through. */
12616 case al_reg: case cl_reg: case dl_reg: case bl_reg:
52b15da3
JH
12617 if (rex)
12618 s = names8rex[code - al_reg + add];
12619 else
12620 s = names8[code - al_reg];
12621 break;
6439fc28
AM
12622 case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
12623 case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
7bb15c6f 12624 if (address_mode == mode_64bit
6c067bbb 12625 && ((sizeflag & DFLAG) || (rex & REX_W)))
6439fc28
AM
12626 {
12627 s = names64[code - rAX_reg + add];
12628 break;
12629 }
12630 code += eAX_reg - rAX_reg;
6608db57 12631 /* Fall through. */
52b15da3
JH
12632 case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
12633 case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
161a04f6
L
12634 USED_REX (REX_W);
12635 if (rex & REX_W)
52b15da3 12636 s = names64[code - eAX_reg + add];
52b15da3 12637 else
f16cd0d5
L
12638 {
12639 if (sizeflag & DFLAG)
12640 s = names32[code - eAX_reg + add];
12641 else
12642 s = names16[code - eAX_reg + add];
12643 used_prefixes |= (prefixes & PREFIX_DATA);
12644 }
52b15da3 12645 break;
52b15da3
JH
12646 default:
12647 s = INTERNAL_DISASSEMBLER_ERROR;
12648 break;
12649 }
12650 oappend (s);
12651}
12652
12653static void
26ca5450 12654OP_IMREG (int code, int sizeflag)
52b15da3
JH
12655{
12656 const char *s;
252b5132
RH
12657
12658 switch (code)
12659 {
12660 case indir_dx_reg:
d708bcba 12661 if (intel_syntax)
52fd6d94 12662 s = "dx";
d708bcba 12663 else
db6eb5be 12664 s = "(%dx)";
252b5132 12665 break;
e8b5d5f9
JB
12666 case al_reg: case cl_reg:
12667 s = names8[code - al_reg];
252b5132 12668 break;
e8b5d5f9 12669 case eAX_reg:
161a04f6
L
12670 USED_REX (REX_W);
12671 if (rex & REX_W)
f16cd0d5 12672 {
e8b5d5f9
JB
12673 s = *names64;
12674 break;
f16cd0d5 12675 }
e8b5d5f9 12676 /* Fall through. */
52fd6d94 12677 case z_mode_ax_reg:
161a04f6 12678 if ((rex & REX_W) || (sizeflag & DFLAG))
52fd6d94
JB
12679 s = *names32;
12680 else
12681 s = *names16;
161a04f6 12682 if (!(rex & REX_W))
52fd6d94
JB
12683 used_prefixes |= (prefixes & PREFIX_DATA);
12684 break;
252b5132
RH
12685 default:
12686 s = INTERNAL_DISASSEMBLER_ERROR;
12687 break;
12688 }
12689 oappend (s);
12690}
12691
12692static void
26ca5450 12693OP_I (int bytemode, int sizeflag)
252b5132 12694{
52b15da3
JH
12695 bfd_signed_vma op;
12696 bfd_signed_vma mask = -1;
252b5132
RH
12697
12698 switch (bytemode)
12699 {
12700 case b_mode:
12701 FETCH_DATA (the_info, codep + 1);
52b15da3
JH
12702 op = *codep++;
12703 mask = 0xff;
12704 break;
252b5132 12705 case v_mode:
161a04f6
L
12706 USED_REX (REX_W);
12707 if (rex & REX_W)
52b15da3 12708 op = get32s ();
252b5132 12709 else
52b15da3 12710 {
f16cd0d5
L
12711 if (sizeflag & DFLAG)
12712 {
12713 op = get32 ();
12714 mask = 0xffffffff;
12715 }
12716 else
12717 {
12718 op = get16 ();
12719 mask = 0xfffff;
12720 }
12721 used_prefixes |= (prefixes & PREFIX_DATA);
52b15da3 12722 }
252b5132 12723 break;
c1dc7af5
JB
12724 case d_mode:
12725 mask = 0xffffffff;
12726 op = get32 ();
12727 break;
252b5132 12728 case w_mode:
52b15da3 12729 mask = 0xfffff;
252b5132
RH
12730 op = get16 ();
12731 break;
9306ca4a
JB
12732 case const_1_mode:
12733 if (intel_syntax)
6c067bbb 12734 oappend ("1");
9306ca4a 12735 return;
252b5132
RH
12736 default:
12737 oappend (INTERNAL_DISASSEMBLER_ERROR);
12738 return;
12739 }
12740
52b15da3
JH
12741 op &= mask;
12742 scratchbuf[0] = '$';
d708bcba 12743 print_operand_value (scratchbuf + 1, 1, op);
9ce09ba2 12744 oappend_maybe_intel (scratchbuf);
52b15da3
JH
12745 scratchbuf[0] = '\0';
12746}
12747
12748static void
26ca5450 12749OP_I64 (int bytemode, int sizeflag)
52b15da3 12750{
a280ab8e 12751 if (bytemode != v_mode || address_mode != mode_64bit || !(rex & REX_W))
6439fc28
AM
12752 {
12753 OP_I (bytemode, sizeflag);
12754 return;
12755 }
12756
a280ab8e 12757 USED_REX (REX_W);
52b15da3 12758
52b15da3 12759 scratchbuf[0] = '$';
a280ab8e 12760 print_operand_value (scratchbuf + 1, 1, get64 ());
9ce09ba2 12761 oappend_maybe_intel (scratchbuf);
252b5132
RH
12762 scratchbuf[0] = '\0';
12763}
12764
12765static void
26ca5450 12766OP_sI (int bytemode, int sizeflag)
252b5132 12767{
52b15da3 12768 bfd_signed_vma op;
252b5132
RH
12769
12770 switch (bytemode)
12771 {
12772 case b_mode:
e3949f17 12773 case b_T_mode:
252b5132
RH
12774 FETCH_DATA (the_info, codep + 1);
12775 op = *codep++;
12776 if ((op & 0x80) != 0)
12777 op -= 0x100;
e3949f17
L
12778 if (bytemode == b_T_mode)
12779 {
12780 if (address_mode != mode_64bit
7bb15c6f 12781 || !((sizeflag & DFLAG) || (rex & REX_W)))
e3949f17 12782 {
6c067bbb
RM
12783 /* The operand-size prefix is overridden by a REX prefix. */
12784 if ((sizeflag & DFLAG) || (rex & REX_W))
e3949f17
L
12785 op &= 0xffffffff;
12786 else
12787 op &= 0xffff;
12788 }
12789 }
12790 else
12791 {
12792 if (!(rex & REX_W))
12793 {
12794 if (sizeflag & DFLAG)
12795 op &= 0xffffffff;
12796 else
12797 op &= 0xffff;
12798 }
12799 }
252b5132
RH
12800 break;
12801 case v_mode:
7bb15c6f
RM
12802 /* The operand-size prefix is overridden by a REX prefix. */
12803 if ((sizeflag & DFLAG) || (rex & REX_W))
52b15da3 12804 op = get32s ();
252b5132 12805 else
d9e3625e 12806 op = get16 ();
252b5132
RH
12807 break;
12808 default:
12809 oappend (INTERNAL_DISASSEMBLER_ERROR);
12810 return;
12811 }
52b15da3
JH
12812
12813 scratchbuf[0] = '$';
12814 print_operand_value (scratchbuf + 1, 1, op);
9ce09ba2 12815 oappend_maybe_intel (scratchbuf);
252b5132
RH
12816}
12817
12818static void
26ca5450 12819OP_J (int bytemode, int sizeflag)
252b5132 12820{
52b15da3 12821 bfd_vma disp;
7081ff04 12822 bfd_vma mask = -1;
65ca155d 12823 bfd_vma segment = 0;
252b5132
RH
12824
12825 switch (bytemode)
12826 {
12827 case b_mode:
12828 FETCH_DATA (the_info, codep + 1);
12829 disp = *codep++;
12830 if ((disp & 0x80) != 0)
12831 disp -= 0x100;
12832 break;
12833 case v_mode:
376cd056 12834 case dqw_mode:
5db04b09
L
12835 if ((sizeflag & DFLAG)
12836 || (address_mode == mode_64bit
d835a58b 12837 && ((isa64 == intel64 && bytemode != dqw_mode)
376cd056 12838 || (rex & REX_W))))
52b15da3 12839 disp = get32s ();
252b5132
RH
12840 else
12841 {
12842 disp = get16 ();
206717e8
L
12843 if ((disp & 0x8000) != 0)
12844 disp -= 0x10000;
65ca155d
L
12845 /* In 16bit mode, address is wrapped around at 64k within
12846 the same segment. Otherwise, a data16 prefix on a jump
12847 instruction means that the pc is masked to 16 bits after
12848 the displacement is added! */
12849 mask = 0xffff;
12850 if ((prefixes & PREFIX_DATA) == 0)
4fd7268a 12851 segment = ((start_pc + (codep - start_codep))
65ca155d 12852 & ~((bfd_vma) 0xffff));
252b5132 12853 }
5db04b09 12854 if (address_mode != mode_64bit
d835a58b 12855 || (isa64 != intel64 && !(rex & REX_W)))
f16cd0d5 12856 used_prefixes |= (prefixes & PREFIX_DATA);
252b5132
RH
12857 break;
12858 default:
12859 oappend (INTERNAL_DISASSEMBLER_ERROR);
12860 return;
12861 }
42d5f9c6 12862 disp = ((start_pc + (codep - start_codep) + disp) & mask) | segment;
52b15da3
JH
12863 set_op (disp, 0);
12864 print_operand_value (scratchbuf, 1, disp);
252b5132
RH
12865 oappend (scratchbuf);
12866}
12867
252b5132 12868static void
ed7841b3 12869OP_SEG (int bytemode, int sizeflag)
252b5132 12870{
ed7841b3 12871 if (bytemode == w_mode)
7967e09e 12872 oappend (names_seg[modrm.reg]);
ed7841b3 12873 else
7967e09e 12874 OP_E (modrm.mod == 3 ? bytemode : w_mode, sizeflag);
252b5132
RH
12875}
12876
12877static void
26ca5450 12878OP_DIR (int dummy ATTRIBUTE_UNUSED, int sizeflag)
252b5132
RH
12879{
12880 int seg, offset;
12881
c608c12e 12882 if (sizeflag & DFLAG)
252b5132 12883 {
c608c12e
AM
12884 offset = get32 ();
12885 seg = get16 ();
252b5132 12886 }
c608c12e
AM
12887 else
12888 {
12889 offset = get16 ();
12890 seg = get16 ();
12891 }
7d421014 12892 used_prefixes |= (prefixes & PREFIX_DATA);
d708bcba 12893 if (intel_syntax)
3f31e633 12894 sprintf (scratchbuf, "0x%x:0x%x", seg, offset);
d708bcba
AM
12895 else
12896 sprintf (scratchbuf, "$0x%x,$0x%x", seg, offset);
c608c12e 12897 oappend (scratchbuf);
252b5132
RH
12898}
12899
252b5132 12900static void
3f31e633 12901OP_OFF (int bytemode, int sizeflag)
252b5132 12902{
52b15da3 12903 bfd_vma off;
252b5132 12904
3f31e633
JB
12905 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
12906 intel_operand_size (bytemode, sizeflag);
252b5132
RH
12907 append_seg ();
12908
cb712a9e 12909 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
252b5132
RH
12910 off = get32 ();
12911 else
12912 off = get16 ();
12913
12914 if (intel_syntax)
12915 {
285ca992 12916 if (!active_seg_prefix)
252b5132 12917 {
d708bcba 12918 oappend (names_seg[ds_reg - es_reg]);
252b5132
RH
12919 oappend (":");
12920 }
12921 }
52b15da3
JH
12922 print_operand_value (scratchbuf, 1, off);
12923 oappend (scratchbuf);
12924}
6439fc28 12925
52b15da3 12926static void
3f31e633 12927OP_OFF64 (int bytemode, int sizeflag)
52b15da3
JH
12928{
12929 bfd_vma off;
12930
539e75ad
L
12931 if (address_mode != mode_64bit
12932 || (prefixes & PREFIX_ADDR))
6439fc28
AM
12933 {
12934 OP_OFF (bytemode, sizeflag);
12935 return;
12936 }
12937
3f31e633
JB
12938 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
12939 intel_operand_size (bytemode, sizeflag);
52b15da3
JH
12940 append_seg ();
12941
6608db57 12942 off = get64 ();
52b15da3
JH
12943
12944 if (intel_syntax)
12945 {
285ca992 12946 if (!active_seg_prefix)
52b15da3 12947 {
d708bcba 12948 oappend (names_seg[ds_reg - es_reg]);
52b15da3
JH
12949 oappend (":");
12950 }
12951 }
12952 print_operand_value (scratchbuf, 1, off);
252b5132
RH
12953 oappend (scratchbuf);
12954}
12955
12956static void
26ca5450 12957ptr_reg (int code, int sizeflag)
252b5132 12958{
2da11e11 12959 const char *s;
d708bcba 12960
1d9f512f 12961 *obufp++ = open_char;
20f0a1fc 12962 used_prefixes |= (prefixes & PREFIX_ADDR);
cb712a9e 12963 if (address_mode == mode_64bit)
c1a64871
JH
12964 {
12965 if (!(sizeflag & AFLAG))
db6eb5be 12966 s = names32[code - eAX_reg];
c1a64871 12967 else
db6eb5be 12968 s = names64[code - eAX_reg];
c1a64871 12969 }
52b15da3 12970 else if (sizeflag & AFLAG)
252b5132
RH
12971 s = names32[code - eAX_reg];
12972 else
12973 s = names16[code - eAX_reg];
12974 oappend (s);
1d9f512f
AM
12975 *obufp++ = close_char;
12976 *obufp = 0;
252b5132
RH
12977}
12978
12979static void
26ca5450 12980OP_ESreg (int code, int sizeflag)
252b5132 12981{
9306ca4a 12982 if (intel_syntax)
52fd6d94
JB
12983 {
12984 switch (codep[-1])
12985 {
12986 case 0x6d: /* insw/insl */
12987 intel_operand_size (z_mode, sizeflag);
12988 break;
12989 case 0xa5: /* movsw/movsl/movsq */
12990 case 0xa7: /* cmpsw/cmpsl/cmpsq */
12991 case 0xab: /* stosw/stosl */
12992 case 0xaf: /* scasw/scasl */
12993 intel_operand_size (v_mode, sizeflag);
12994 break;
12995 default:
12996 intel_operand_size (b_mode, sizeflag);
12997 }
12998 }
9ce09ba2 12999 oappend_maybe_intel ("%es:");
252b5132
RH
13000 ptr_reg (code, sizeflag);
13001}
13002
13003static void
26ca5450 13004OP_DSreg (int code, int sizeflag)
252b5132 13005{
9306ca4a 13006 if (intel_syntax)
52fd6d94
JB
13007 {
13008 switch (codep[-1])
13009 {
13010 case 0x6f: /* outsw/outsl */
13011 intel_operand_size (z_mode, sizeflag);
13012 break;
13013 case 0xa5: /* movsw/movsl/movsq */
13014 case 0xa7: /* cmpsw/cmpsl/cmpsq */
13015 case 0xad: /* lodsw/lodsl/lodsq */
13016 intel_operand_size (v_mode, sizeflag);
13017 break;
13018 default:
13019 intel_operand_size (b_mode, sizeflag);
13020 }
13021 }
285ca992
L
13022 /* Set active_seg_prefix to PREFIX_DS if it is unset so that the
13023 default segment register DS is printed. */
13024 if (!active_seg_prefix)
13025 active_seg_prefix = PREFIX_DS;
6608db57 13026 append_seg ();
252b5132
RH
13027 ptr_reg (code, sizeflag);
13028}
13029
252b5132 13030static void
26ca5450 13031OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 13032{
9b60702d 13033 int add;
161a04f6 13034 if (rex & REX_R)
c4a530c5 13035 {
161a04f6 13036 USED_REX (REX_R);
c4a530c5
JB
13037 add = 8;
13038 }
cb712a9e 13039 else if (address_mode != mode_64bit && (prefixes & PREFIX_LOCK))
c4a530c5 13040 {
f16cd0d5 13041 all_prefixes[last_lock_prefix] = 0;
c4a530c5
JB
13042 used_prefixes |= PREFIX_LOCK;
13043 add = 8;
13044 }
9b60702d
L
13045 else
13046 add = 0;
7967e09e 13047 sprintf (scratchbuf, "%%cr%d", modrm.reg + add);
9ce09ba2 13048 oappend_maybe_intel (scratchbuf);
252b5132
RH
13049}
13050
252b5132 13051static void
26ca5450 13052OP_D (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 13053{
9b60702d 13054 int add;
161a04f6
L
13055 USED_REX (REX_R);
13056 if (rex & REX_R)
52b15da3 13057 add = 8;
9b60702d
L
13058 else
13059 add = 0;
d708bcba 13060 if (intel_syntax)
bfbd9438 13061 sprintf (scratchbuf, "dr%d", modrm.reg + add);
d708bcba 13062 else
7967e09e 13063 sprintf (scratchbuf, "%%db%d", modrm.reg + add);
252b5132
RH
13064 oappend (scratchbuf);
13065}
13066
252b5132 13067static void
26ca5450 13068OP_T (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 13069{
7967e09e 13070 sprintf (scratchbuf, "%%tr%d", modrm.reg);
9ce09ba2 13071 oappend_maybe_intel (scratchbuf);
252b5132
RH
13072}
13073
252b5132 13074static void
26ca5450 13075OP_MMX (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 13076{
b9733481
L
13077 int reg = modrm.reg;
13078 const char **names;
13079
041bd2e0
JH
13080 used_prefixes |= (prefixes & PREFIX_DATA);
13081 if (prefixes & PREFIX_DATA)
20f0a1fc 13082 {
b9733481 13083 names = names_xmm;
161a04f6
L
13084 USED_REX (REX_R);
13085 if (rex & REX_R)
b9733481 13086 reg += 8;
20f0a1fc 13087 }
041bd2e0 13088 else
b9733481
L
13089 names = names_mm;
13090 oappend (names[reg]);
252b5132
RH
13091}
13092
c608c12e 13093static void
c0f3af97 13094OP_XMM (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
c608c12e 13095{
b9733481
L
13096 int reg = modrm.reg;
13097 const char **names;
13098
161a04f6
L
13099 USED_REX (REX_R);
13100 if (rex & REX_R)
b9733481 13101 reg += 8;
43234a1e
L
13102 if (vex.evex)
13103 {
13104 if (!vex.r)
13105 reg += 16;
13106 }
13107
539f890d
L
13108 if (need_vex
13109 && bytemode != xmm_mode
43234a1e
L
13110 && bytemode != xmmq_mode
13111 && bytemode != evex_half_bcst_xmmq_mode
13112 && bytemode != ymm_mode
260cd341 13113 && bytemode != tmm_mode
539f890d 13114 && bytemode != scalar_mode)
c0f3af97
L
13115 {
13116 switch (vex.length)
13117 {
13118 case 128:
b9733481 13119 names = names_xmm;
c0f3af97
L
13120 break;
13121 case 256:
5fc35d96
IT
13122 if (vex.w
13123 || (bytemode != vex_vsib_q_w_dq_mode
13124 && bytemode != vex_vsib_q_w_d_mode))
6c30d220
L
13125 names = names_ymm;
13126 else
13127 names = names_xmm;
c0f3af97 13128 break;
43234a1e
L
13129 case 512:
13130 names = names_zmm;
13131 break;
c0f3af97
L
13132 default:
13133 abort ();
13134 }
13135 }
43234a1e
L
13136 else if (bytemode == xmmq_mode
13137 || bytemode == evex_half_bcst_xmmq_mode)
13138 {
13139 switch (vex.length)
13140 {
13141 case 128:
13142 case 256:
13143 names = names_xmm;
13144 break;
13145 case 512:
13146 names = names_ymm;
13147 break;
13148 default:
13149 abort ();
13150 }
13151 }
260cd341
LC
13152 else if (bytemode == tmm_mode)
13153 {
13154 modrm.reg = reg;
13155 if (reg >= 8)
13156 {
13157 oappend ("(bad)");
13158 return;
13159 }
13160 names = names_tmm;
13161 }
43234a1e
L
13162 else if (bytemode == ymm_mode)
13163 names = names_ymm;
c0f3af97 13164 else
b9733481
L
13165 names = names_xmm;
13166 oappend (names[reg]);
c608c12e
AM
13167}
13168
252b5132 13169static void
26ca5450 13170OP_EM (int bytemode, int sizeflag)
252b5132 13171{
b9733481
L
13172 int reg;
13173 const char **names;
13174
7967e09e 13175 if (modrm.mod != 3)
252b5132 13176 {
b6169b20
L
13177 if (intel_syntax
13178 && (bytemode == v_mode || bytemode == v_swap_mode))
9306ca4a
JB
13179 {
13180 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
13181 used_prefixes |= (prefixes & PREFIX_DATA);
6c067bbb 13182 }
252b5132
RH
13183 OP_E (bytemode, sizeflag);
13184 return;
13185 }
13186
b6169b20
L
13187 if ((sizeflag & SUFFIX_ALWAYS) && bytemode == v_swap_mode)
13188 swap_operand ();
13189
6608db57 13190 /* Skip mod/rm byte. */
4bba6815 13191 MODRM_CHECK;
252b5132 13192 codep++;
041bd2e0 13193 used_prefixes |= (prefixes & PREFIX_DATA);
b9733481 13194 reg = modrm.rm;
041bd2e0 13195 if (prefixes & PREFIX_DATA)
20f0a1fc 13196 {
b9733481 13197 names = names_xmm;
161a04f6
L
13198 USED_REX (REX_B);
13199 if (rex & REX_B)
b9733481 13200 reg += 8;
20f0a1fc 13201 }
041bd2e0 13202 else
b9733481
L
13203 names = names_mm;
13204 oappend (names[reg]);
252b5132
RH
13205}
13206
246c51aa
L
13207/* cvt* are the only instructions in sse2 which have
13208 both SSE and MMX operands and also have 0x66 prefix
13209 in their opcode. 0x66 was originally used to differentiate
13210 between SSE and MMX instruction(operands). So we have to handle the
4d9567e0
MM
13211 cvt* separately using OP_EMC and OP_MXC */
13212static void
13213OP_EMC (int bytemode, int sizeflag)
13214{
7967e09e 13215 if (modrm.mod != 3)
4d9567e0
MM
13216 {
13217 if (intel_syntax && bytemode == v_mode)
13218 {
13219 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
13220 used_prefixes |= (prefixes & PREFIX_DATA);
6c067bbb 13221 }
4d9567e0
MM
13222 OP_E (bytemode, sizeflag);
13223 return;
13224 }
246c51aa 13225
4d9567e0
MM
13226 /* Skip mod/rm byte. */
13227 MODRM_CHECK;
13228 codep++;
13229 used_prefixes |= (prefixes & PREFIX_DATA);
b9733481 13230 oappend (names_mm[modrm.rm]);
4d9567e0
MM
13231}
13232
13233static void
13234OP_MXC (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13235{
13236 used_prefixes |= (prefixes & PREFIX_DATA);
b9733481 13237 oappend (names_mm[modrm.reg]);
4d9567e0
MM
13238}
13239
c608c12e 13240static void
26ca5450 13241OP_EX (int bytemode, int sizeflag)
c608c12e 13242{
b9733481
L
13243 int reg;
13244 const char **names;
d6f574e0
L
13245
13246 /* Skip mod/rm byte. */
13247 MODRM_CHECK;
13248 codep++;
13249
7967e09e 13250 if (modrm.mod != 3)
c608c12e 13251 {
c1e679ec 13252 OP_E_memory (bytemode, sizeflag);
c608c12e
AM
13253 return;
13254 }
d6f574e0 13255
b9733481 13256 reg = modrm.rm;
161a04f6
L
13257 USED_REX (REX_B);
13258 if (rex & REX_B)
b9733481 13259 reg += 8;
43234a1e
L
13260 if (vex.evex)
13261 {
13262 USED_REX (REX_X);
13263 if ((rex & REX_X))
13264 reg += 16;
13265 }
c608c12e 13266
b6169b20 13267 if ((sizeflag & SUFFIX_ALWAYS)
fa99fab2
L
13268 && (bytemode == x_swap_mode
13269 || bytemode == d_swap_mode
41f5efc6 13270 || bytemode == q_swap_mode))
b6169b20
L
13271 swap_operand ();
13272
c0f3af97
L
13273 if (need_vex
13274 && bytemode != xmm_mode
6c30d220
L
13275 && bytemode != xmmdw_mode
13276 && bytemode != xmmqd_mode
13277 && bytemode != xmm_mb_mode
13278 && bytemode != xmm_mw_mode
13279 && bytemode != xmm_md_mode
13280 && bytemode != xmm_mq_mode
539f890d 13281 && bytemode != xmmq_mode
43234a1e
L
13282 && bytemode != evex_half_bcst_xmmq_mode
13283 && bytemode != ymm_mode
260cd341 13284 && bytemode != tmm_mode
1c480963 13285 && bytemode != vex_scalar_w_dq_mode)
c0f3af97
L
13286 {
13287 switch (vex.length)
13288 {
13289 case 128:
b9733481 13290 names = names_xmm;
c0f3af97
L
13291 break;
13292 case 256:
b9733481 13293 names = names_ymm;
c0f3af97 13294 break;
43234a1e
L
13295 case 512:
13296 names = names_zmm;
13297 break;
c0f3af97
L
13298 default:
13299 abort ();
13300 }
13301 }
43234a1e
L
13302 else if (bytemode == xmmq_mode
13303 || bytemode == evex_half_bcst_xmmq_mode)
13304 {
13305 switch (vex.length)
13306 {
13307 case 128:
13308 case 256:
13309 names = names_xmm;
13310 break;
13311 case 512:
13312 names = names_ymm;
13313 break;
13314 default:
13315 abort ();
13316 }
13317 }
260cd341
LC
13318 else if (bytemode == tmm_mode)
13319 {
13320 modrm.rm = reg;
13321 if (reg >= 8)
13322 {
13323 oappend ("(bad)");
13324 return;
13325 }
13326 names = names_tmm;
13327 }
43234a1e
L
13328 else if (bytemode == ymm_mode)
13329 names = names_ymm;
c0f3af97 13330 else
b9733481
L
13331 names = names_xmm;
13332 oappend (names[reg]);
c608c12e
AM
13333}
13334
252b5132 13335static void
26ca5450 13336OP_MS (int bytemode, int sizeflag)
252b5132 13337{
7967e09e 13338 if (modrm.mod == 3)
2da11e11
AM
13339 OP_EM (bytemode, sizeflag);
13340 else
6608db57 13341 BadOp ();
252b5132
RH
13342}
13343
992aaec9 13344static void
26ca5450 13345OP_XS (int bytemode, int sizeflag)
992aaec9 13346{
7967e09e 13347 if (modrm.mod == 3)
992aaec9
AM
13348 OP_EX (bytemode, sizeflag);
13349 else
6608db57 13350 BadOp ();
992aaec9
AM
13351}
13352
cc0ec051
AM
13353static void
13354OP_M (int bytemode, int sizeflag)
13355{
7967e09e 13356 if (modrm.mod == 3)
75413a22
L
13357 /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
13358 BadOp ();
cc0ec051
AM
13359 else
13360 OP_E (bytemode, sizeflag);
13361}
13362
13363static void
13364OP_0f07 (int bytemode, int sizeflag)
13365{
7967e09e 13366 if (modrm.mod != 3 || modrm.rm != 0)
cc0ec051
AM
13367 BadOp ();
13368 else
13369 OP_E (bytemode, sizeflag);
13370}
13371
46e883c5 13372/* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
246c51aa 13373 32bit mode and "xchg %rax,%rax" in 64bit mode. */
46e883c5 13374
cc0ec051 13375static void
46e883c5 13376NOP_Fixup1 (int bytemode, int sizeflag)
cc0ec051 13377{
8b38ad71
L
13378 if ((prefixes & PREFIX_DATA) != 0
13379 || (rex != 0
13380 && rex != 0x48
13381 && address_mode == mode_64bit))
46e883c5
L
13382 OP_REG (bytemode, sizeflag);
13383 else
13384 strcpy (obuf, "nop");
13385}
13386
13387static void
13388NOP_Fixup2 (int bytemode, int sizeflag)
13389{
8b38ad71
L
13390 if ((prefixes & PREFIX_DATA) != 0
13391 || (rex != 0
13392 && rex != 0x48
13393 && address_mode == mode_64bit))
46e883c5 13394 OP_IMREG (bytemode, sizeflag);
cc0ec051
AM
13395}
13396
84037f8c 13397static const char *const Suffix3DNow[] = {
252b5132
RH
13398/* 00 */ NULL, NULL, NULL, NULL,
13399/* 04 */ NULL, NULL, NULL, NULL,
13400/* 08 */ NULL, NULL, NULL, NULL,
9e525108 13401/* 0C */ "pi2fw", "pi2fd", NULL, NULL,
252b5132
RH
13402/* 10 */ NULL, NULL, NULL, NULL,
13403/* 14 */ NULL, NULL, NULL, NULL,
13404/* 18 */ NULL, NULL, NULL, NULL,
9e525108 13405/* 1C */ "pf2iw", "pf2id", NULL, NULL,
252b5132
RH
13406/* 20 */ NULL, NULL, NULL, NULL,
13407/* 24 */ NULL, NULL, NULL, NULL,
13408/* 28 */ NULL, NULL, NULL, NULL,
13409/* 2C */ NULL, NULL, NULL, NULL,
13410/* 30 */ NULL, NULL, NULL, NULL,
13411/* 34 */ NULL, NULL, NULL, NULL,
13412/* 38 */ NULL, NULL, NULL, NULL,
13413/* 3C */ NULL, NULL, NULL, NULL,
13414/* 40 */ NULL, NULL, NULL, NULL,
13415/* 44 */ NULL, NULL, NULL, NULL,
13416/* 48 */ NULL, NULL, NULL, NULL,
13417/* 4C */ NULL, NULL, NULL, NULL,
13418/* 50 */ NULL, NULL, NULL, NULL,
13419/* 54 */ NULL, NULL, NULL, NULL,
13420/* 58 */ NULL, NULL, NULL, NULL,
13421/* 5C */ NULL, NULL, NULL, NULL,
13422/* 60 */ NULL, NULL, NULL, NULL,
13423/* 64 */ NULL, NULL, NULL, NULL,
13424/* 68 */ NULL, NULL, NULL, NULL,
13425/* 6C */ NULL, NULL, NULL, NULL,
13426/* 70 */ NULL, NULL, NULL, NULL,
13427/* 74 */ NULL, NULL, NULL, NULL,
13428/* 78 */ NULL, NULL, NULL, NULL,
13429/* 7C */ NULL, NULL, NULL, NULL,
13430/* 80 */ NULL, NULL, NULL, NULL,
13431/* 84 */ NULL, NULL, NULL, NULL,
9e525108
AM
13432/* 88 */ NULL, NULL, "pfnacc", NULL,
13433/* 8C */ NULL, NULL, "pfpnacc", NULL,
252b5132
RH
13434/* 90 */ "pfcmpge", NULL, NULL, NULL,
13435/* 94 */ "pfmin", NULL, "pfrcp", "pfrsqrt",
13436/* 98 */ NULL, NULL, "pfsub", NULL,
13437/* 9C */ NULL, NULL, "pfadd", NULL,
13438/* A0 */ "pfcmpgt", NULL, NULL, NULL,
13439/* A4 */ "pfmax", NULL, "pfrcpit1", "pfrsqit1",
13440/* A8 */ NULL, NULL, "pfsubr", NULL,
13441/* AC */ NULL, NULL, "pfacc", NULL,
13442/* B0 */ "pfcmpeq", NULL, NULL, NULL,
9beff690 13443/* B4 */ "pfmul", NULL, "pfrcpit2", "pmulhrw",
9e525108 13444/* B8 */ NULL, NULL, NULL, "pswapd",
252b5132
RH
13445/* BC */ NULL, NULL, NULL, "pavgusb",
13446/* C0 */ NULL, NULL, NULL, NULL,
13447/* C4 */ NULL, NULL, NULL, NULL,
13448/* C8 */ NULL, NULL, NULL, NULL,
13449/* CC */ NULL, NULL, NULL, NULL,
13450/* D0 */ NULL, NULL, NULL, NULL,
13451/* D4 */ NULL, NULL, NULL, NULL,
13452/* D8 */ NULL, NULL, NULL, NULL,
13453/* DC */ NULL, NULL, NULL, NULL,
13454/* E0 */ NULL, NULL, NULL, NULL,
13455/* E4 */ NULL, NULL, NULL, NULL,
13456/* E8 */ NULL, NULL, NULL, NULL,
13457/* EC */ NULL, NULL, NULL, NULL,
13458/* F0 */ NULL, NULL, NULL, NULL,
13459/* F4 */ NULL, NULL, NULL, NULL,
13460/* F8 */ NULL, NULL, NULL, NULL,
13461/* FC */ NULL, NULL, NULL, NULL,
13462};
13463
13464static void
26ca5450 13465OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132
RH
13466{
13467 const char *mnemonic;
13468
13469 FETCH_DATA (the_info, codep + 1);
13470 /* AMD 3DNow! instructions are specified by an opcode suffix in the
13471 place where an 8-bit immediate would normally go. ie. the last
13472 byte of the instruction. */
ea397f5b 13473 obufp = mnemonicendp;
c608c12e 13474 mnemonic = Suffix3DNow[*codep++ & 0xff];
252b5132 13475 if (mnemonic)
2da11e11 13476 oappend (mnemonic);
252b5132
RH
13477 else
13478 {
13479 /* Since a variable sized modrm/sib chunk is between the start
13480 of the opcode (0x0f0f) and the opcode suffix, we need to do
13481 all the modrm processing first, and don't know until now that
13482 we have a bad opcode. This necessitates some cleaning up. */
ce518a5f
L
13483 op_out[0][0] = '\0';
13484 op_out[1][0] = '\0';
6608db57 13485 BadOp ();
252b5132 13486 }
ea397f5b 13487 mnemonicendp = obufp;
252b5132 13488}
c608c12e 13489
c4de7606 13490static const struct op simd_cmp_op[] =
ea397f5b
L
13491{
13492 { STRING_COMMA_LEN ("eq") },
13493 { STRING_COMMA_LEN ("lt") },
13494 { STRING_COMMA_LEN ("le") },
13495 { STRING_COMMA_LEN ("unord") },
13496 { STRING_COMMA_LEN ("neq") },
13497 { STRING_COMMA_LEN ("nlt") },
13498 { STRING_COMMA_LEN ("nle") },
13499 { STRING_COMMA_LEN ("ord") }
c608c12e
AM
13500};
13501
c4de7606
JB
13502static const struct op vex_cmp_op[] =
13503{
13504 { STRING_COMMA_LEN ("eq_uq") },
13505 { STRING_COMMA_LEN ("nge") },
13506 { STRING_COMMA_LEN ("ngt") },
13507 { STRING_COMMA_LEN ("false") },
13508 { STRING_COMMA_LEN ("neq_oq") },
13509 { STRING_COMMA_LEN ("ge") },
13510 { STRING_COMMA_LEN ("gt") },
13511 { STRING_COMMA_LEN ("true") },
13512 { STRING_COMMA_LEN ("eq_os") },
13513 { STRING_COMMA_LEN ("lt_oq") },
13514 { STRING_COMMA_LEN ("le_oq") },
13515 { STRING_COMMA_LEN ("unord_s") },
13516 { STRING_COMMA_LEN ("neq_us") },
13517 { STRING_COMMA_LEN ("nlt_uq") },
13518 { STRING_COMMA_LEN ("nle_uq") },
13519 { STRING_COMMA_LEN ("ord_s") },
13520 { STRING_COMMA_LEN ("eq_us") },
13521 { STRING_COMMA_LEN ("nge_uq") },
13522 { STRING_COMMA_LEN ("ngt_uq") },
13523 { STRING_COMMA_LEN ("false_os") },
13524 { STRING_COMMA_LEN ("neq_os") },
13525 { STRING_COMMA_LEN ("ge_oq") },
13526 { STRING_COMMA_LEN ("gt_oq") },
13527 { STRING_COMMA_LEN ("true_us") },
13528};
13529
c608c12e 13530static void
ad19981d 13531CMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
c608c12e
AM
13532{
13533 unsigned int cmp_type;
13534
13535 FETCH_DATA (the_info, codep + 1);
13536 cmp_type = *codep++ & 0xff;
c0f3af97 13537 if (cmp_type < ARRAY_SIZE (simd_cmp_op))
c608c12e 13538 {
ad19981d 13539 char suffix [3];
ea397f5b 13540 char *p = mnemonicendp - 2;
ad19981d
L
13541 suffix[0] = p[0];
13542 suffix[1] = p[1];
13543 suffix[2] = '\0';
ea397f5b
L
13544 sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
13545 mnemonicendp += simd_cmp_op[cmp_type].len;
c608c12e 13546 }
c4de7606
JB
13547 else if (need_vex
13548 && cmp_type < ARRAY_SIZE (simd_cmp_op) + ARRAY_SIZE (vex_cmp_op))
13549 {
13550 char suffix [3];
13551 char *p = mnemonicendp - 2;
13552 suffix[0] = p[0];
13553 suffix[1] = p[1];
13554 suffix[2] = '\0';
13555 cmp_type -= ARRAY_SIZE (simd_cmp_op);
13556 sprintf (p, "%s%s", vex_cmp_op[cmp_type].name, suffix);
13557 mnemonicendp += vex_cmp_op[cmp_type].len;
13558 }
c608c12e
AM
13559 else
13560 {
ad19981d
L
13561 /* We have a reserved extension byte. Output it directly. */
13562 scratchbuf[0] = '$';
13563 print_operand_value (scratchbuf + 1, 1, cmp_type);
9ce09ba2 13564 oappend_maybe_intel (scratchbuf);
ad19981d 13565 scratchbuf[0] = '\0';
c608c12e
AM
13566 }
13567}
13568
9916071f 13569static void
7abb8d81 13570OP_Mwait (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
9916071f 13571{
7abb8d81 13572 /* mwait %eax,%ecx / mwaitx %eax,%ecx,%ebx */
b844680a
L
13573 if (!intel_syntax)
13574 {
081e283f
JB
13575 strcpy (op_out[0], names32[0]);
13576 strcpy (op_out[1], names32[1]);
7abb8d81 13577 if (bytemode == eBX_reg)
081e283f 13578 strcpy (op_out[2], names32[3]);
b844680a
L
13579 two_source_ops = 1;
13580 }
13581 /* Skip mod/rm byte. */
13582 MODRM_CHECK;
13583 codep++;
13584}
13585
13586static void
13587OP_Monitor (int bytemode ATTRIBUTE_UNUSED,
13588 int sizeflag ATTRIBUTE_UNUSED)
ca164297 13589{
081e283f 13590 /* monitor %{e,r,}ax,%ecx,%edx" */
b844680a 13591 if (!intel_syntax)
ca164297 13592 {
cb712a9e
L
13593 const char **names = (address_mode == mode_64bit
13594 ? names64 : names32);
1d9f512f 13595
081e283f 13596 if (prefixes & PREFIX_ADDR)
ca164297 13597 {
b844680a 13598 /* Remove "addr16/addr32". */
f16cd0d5 13599 all_prefixes[last_addr_prefix] = 0;
081e283f
JB
13600 names = (address_mode != mode_32bit
13601 ? names32 : names16);
b844680a 13602 used_prefixes |= PREFIX_ADDR;
ca164297 13603 }
081e283f
JB
13604 else if (address_mode == mode_16bit)
13605 names = names16;
13606 strcpy (op_out[0], names[0]);
13607 strcpy (op_out[1], names32[1]);
13608 strcpy (op_out[2], names32[2]);
b844680a 13609 two_source_ops = 1;
ca164297 13610 }
b844680a
L
13611 /* Skip mod/rm byte. */
13612 MODRM_CHECK;
13613 codep++;
30123838
JB
13614}
13615
6608db57
KH
13616static void
13617BadOp (void)
2da11e11 13618{
6608db57
KH
13619 /* Throw away prefixes and 1st. opcode byte. */
13620 codep = insn_codep + 1;
2da11e11
AM
13621 oappend ("(bad)");
13622}
4cc91dba 13623
35c52694
L
13624static void
13625REP_Fixup (int bytemode, int sizeflag)
13626{
13627 /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
13628 lods and stos. */
35c52694 13629 if (prefixes & PREFIX_REPZ)
f16cd0d5 13630 all_prefixes[last_repz_prefix] = REP_PREFIX;
35c52694
L
13631
13632 switch (bytemode)
13633 {
13634 case al_reg:
13635 case eAX_reg:
13636 case indir_dx_reg:
13637 OP_IMREG (bytemode, sizeflag);
13638 break;
13639 case eDI_reg:
13640 OP_ESreg (bytemode, sizeflag);
13641 break;
13642 case eSI_reg:
13643 OP_DSreg (bytemode, sizeflag);
13644 break;
13645 default:
13646 abort ();
13647 break;
13648 }
13649}
f5804c90 13650
d835a58b
JB
13651static void
13652SEP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13653{
13654 if ( isa64 != amd64 )
13655 return;
13656
13657 obufp = obuf;
13658 BadOp ();
13659 mnemonicendp = obufp;
13660 ++codep;
13661}
13662
7e8b059b
L
13663/* For BND-prefixed instructions 0xF2 prefix should be displayed as
13664 "bnd". */
13665
13666static void
13667BND_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13668{
13669 if (prefixes & PREFIX_REPNZ)
13670 all_prefixes[last_repnz_prefix] = BND_PREFIX;
13671}
13672
04ef582a
L
13673/* For NOTRACK-prefixed instructions, 0x3E prefix should be displayed as
13674 "notrack". */
13675
13676static void
13677NOTRACK_Fixup (int bytemode ATTRIBUTE_UNUSED,
13678 int sizeflag ATTRIBUTE_UNUSED)
13679{
0fa0fc85
BP
13680
13681 /* Since active_seg_prefix is not set in 64-bit mode, check whether
13682 we've seen a PREFIX_DS. */
13683 if ((prefixes & PREFIX_DS) != 0
04ef582a
L
13684 && (address_mode != mode_64bit || last_data_prefix < 0))
13685 {
4e9ac44a 13686 /* NOTRACK prefix is only valid on indirect branch instructions.
9fef80d6 13687 NB: DATA prefix is unsupported for Intel64. */
04ef582a
L
13688 active_seg_prefix = 0;
13689 all_prefixes[last_seg_prefix] = NOTRACK_PREFIX;
13690 }
13691}
13692
42164a71
L
13693/* Similar to OP_E. But the 0xf2/0xf3 prefixes should be displayed as
13694 "xacquire"/"xrelease" for memory operand if there is a LOCK prefix.
13695 */
13696
13697static void
13698HLE_Fixup1 (int bytemode, int sizeflag)
13699{
13700 if (modrm.mod != 3
13701 && (prefixes & PREFIX_LOCK) != 0)
13702 {
13703 if (prefixes & PREFIX_REPZ)
13704 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
13705 if (prefixes & PREFIX_REPNZ)
13706 all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
13707 }
13708
13709 OP_E (bytemode, sizeflag);
13710}
13711
13712/* Similar to OP_E. But the 0xf2/0xf3 prefixes should be displayed as
13713 "xacquire"/"xrelease" for memory operand. No check for LOCK prefix.
13714 */
13715
13716static void
13717HLE_Fixup2 (int bytemode, int sizeflag)
13718{
13719 if (modrm.mod != 3)
13720 {
13721 if (prefixes & PREFIX_REPZ)
13722 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
13723 if (prefixes & PREFIX_REPNZ)
13724 all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
13725 }
13726
13727 OP_E (bytemode, sizeflag);
13728}
13729
13730/* Similar to OP_E. But the 0xf3 prefixes should be displayed as
13731 "xrelease" for memory operand. No check for LOCK prefix. */
13732
13733static void
13734HLE_Fixup3 (int bytemode, int sizeflag)
13735{
13736 if (modrm.mod != 3
13737 && last_repz_prefix > last_repnz_prefix
13738 && (prefixes & PREFIX_REPZ) != 0)
13739 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
13740
13741 OP_E (bytemode, sizeflag);
13742}
13743
f5804c90
L
13744static void
13745CMPXCHG8B_Fixup (int bytemode, int sizeflag)
13746{
161a04f6
L
13747 USED_REX (REX_W);
13748 if (rex & REX_W)
f5804c90
L
13749 {
13750 /* Change cmpxchg8b to cmpxchg16b. */
ea397f5b
L
13751 char *p = mnemonicendp - 2;
13752 mnemonicendp = stpcpy (p, "16b");
fb9c77c7 13753 bytemode = o_mode;
f5804c90 13754 }
42164a71
L
13755 else if ((prefixes & PREFIX_LOCK) != 0)
13756 {
13757 if (prefixes & PREFIX_REPZ)
13758 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
13759 if (prefixes & PREFIX_REPNZ)
13760 all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
13761 }
13762
f5804c90
L
13763 OP_M (bytemode, sizeflag);
13764}
42903f7f
L
13765
13766static void
13767XMM_Fixup (int reg, int sizeflag ATTRIBUTE_UNUSED)
13768{
b9733481
L
13769 const char **names;
13770
c0f3af97
L
13771 if (need_vex)
13772 {
13773 switch (vex.length)
13774 {
13775 case 128:
b9733481 13776 names = names_xmm;
c0f3af97
L
13777 break;
13778 case 256:
b9733481 13779 names = names_ymm;
c0f3af97
L
13780 break;
13781 default:
13782 abort ();
13783 }
13784 }
13785 else
b9733481
L
13786 names = names_xmm;
13787 oappend (names[reg]);
42903f7f 13788}
381d071f
L
13789
13790static void
eacc9c89
L
13791FXSAVE_Fixup (int bytemode, int sizeflag)
13792{
13793 /* Add proper suffix to "fxsave" and "fxrstor". */
13794 USED_REX (REX_W);
13795 if (rex & REX_W)
13796 {
13797 char *p = mnemonicendp;
13798 *p++ = '6';
13799 *p++ = '4';
13800 *p = '\0';
13801 mnemonicendp = p;
13802 }
13803 OP_M (bytemode, sizeflag);
15c7c1d8
JB
13804}
13805
c0f3af97
L
13806/* Display the destination register operand for instructions with
13807 VEX. */
13808
13809static void
13810OP_VEX (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13811{
539f890d 13812 int reg;
b9733481
L
13813 const char **names;
13814
c0f3af97
L
13815 if (!need_vex)
13816 abort ();
13817
539f890d 13818 reg = vex.register_specifier;
63c6fc6c 13819 vex.register_specifier = 0;
5f847646
JB
13820 if (address_mode != mode_64bit)
13821 reg &= 7;
13822 else if (vex.evex && !vex.v)
13823 reg += 16;
43234a1e 13824
539f890d
L
13825 if (bytemode == vex_scalar_mode)
13826 {
13827 oappend (names_xmm[reg]);
13828 return;
13829 }
13830
260cd341
LC
13831 if (bytemode == tmm_mode)
13832 {
13833 /* All 3 TMM registers must be distinct. */
13834 if (reg >= 8)
13835 oappend ("(bad)");
13836 else
13837 {
13838 /* This must be the 3rd operand. */
13839 if (obufp != op_out[2])
13840 abort ();
13841 oappend (names_tmm[reg]);
13842 if (reg == modrm.reg || reg == modrm.rm)
13843 strcpy (obufp, "/(bad)");
13844 }
13845
13846 if (modrm.reg == modrm.rm || modrm.reg == reg || modrm.rm == reg)
13847 {
13848 if (modrm.reg <= 8
13849 && (modrm.reg == modrm.rm || modrm.reg == reg))
13850 strcat (op_out[0], "/(bad)");
13851 if (modrm.rm <= 8
13852 && (modrm.rm == modrm.reg || modrm.rm == reg))
13853 strcat (op_out[1], "/(bad)");
13854 }
13855
13856 return;
13857 }
13858
c0f3af97
L
13859 switch (vex.length)
13860 {
13861 case 128:
13862 switch (bytemode)
13863 {
13864 case vex_mode:
6c30d220 13865 case vex_vsib_q_w_dq_mode:
5fc35d96 13866 case vex_vsib_q_w_d_mode:
cb21baef
L
13867 names = names_xmm;
13868 break;
13869 case dq_mode:
390a6789 13870 if (rex & REX_W)
cb21baef
L
13871 names = names64;
13872 else
13873 names = names32;
c0f3af97 13874 break;
1ba585e8 13875 case mask_bd_mode:
43234a1e 13876 case mask_mode:
9889cbb1
L
13877 if (reg > 0x7)
13878 {
13879 oappend ("(bad)");
13880 return;
13881 }
43234a1e
L
13882 names = names_mask;
13883 break;
c0f3af97
L
13884 default:
13885 abort ();
13886 return;
13887 }
c0f3af97
L
13888 break;
13889 case 256:
13890 switch (bytemode)
13891 {
13892 case vex_mode:
6c30d220
L
13893 names = names_ymm;
13894 break;
13895 case vex_vsib_q_w_dq_mode:
5fc35d96 13896 case vex_vsib_q_w_d_mode:
6c30d220 13897 names = vex.w ? names_ymm : names_xmm;
c0f3af97 13898 break;
1ba585e8 13899 case mask_bd_mode:
43234a1e 13900 case mask_mode:
9889cbb1
L
13901 if (reg > 0x7)
13902 {
13903 oappend ("(bad)");
13904 return;
13905 }
43234a1e
L
13906 names = names_mask;
13907 break;
c0f3af97 13908 default:
a37a2806
NC
13909 /* See PR binutils/20893 for a reproducer. */
13910 oappend ("(bad)");
c0f3af97
L
13911 return;
13912 }
c0f3af97 13913 break;
43234a1e
L
13914 case 512:
13915 names = names_zmm;
13916 break;
c0f3af97
L
13917 default:
13918 abort ();
13919 break;
13920 }
539f890d 13921 oappend (names[reg]);
c0f3af97
L
13922}
13923
41f5efc6
JB
13924static void
13925OP_VexR (int bytemode, int sizeflag)
13926{
13927 if (modrm.mod == 3)
13928 OP_VEX (bytemode, sizeflag);
13929}
13930
5dd85c99 13931static void
e6123d0c 13932OP_VexW (int bytemode, int sizeflag)
5dd85c99 13933{
e6123d0c 13934 OP_VEX (bytemode, sizeflag);
5dd85c99 13935
5dd85c99 13936 if (vex.w)
5f847646 13937 {
e6123d0c
JB
13938 /* Swap 2nd and 3rd operands. */
13939 strcpy (scratchbuf, op_out[2]);
13940 strcpy (op_out[2], op_out[1]);
13941 strcpy (op_out[1], scratchbuf);
5f847646 13942 }
5dd85c99
SP
13943}
13944
c0f3af97
L
13945static void
13946OP_REG_VexI4 (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13947{
13948 int reg;
6384fd9e 13949 const char **names = names_xmm;
b9733481 13950
c0f3af97
L
13951 FETCH_DATA (the_info, codep + 1);
13952 reg = *codep++;
13953
6384fd9e 13954 if (bytemode != x_mode && bytemode != scalar_mode)
c0f3af97
L
13955 abort ();
13956
c0f3af97 13957 reg >>= 4;
5f847646
JB
13958 if (address_mode != mode_64bit)
13959 reg &= 7;
dae39acc 13960
6384fd9e
JB
13961 if (bytemode == x_mode && vex.length == 256)
13962 names = names_ymm;
13963
b9733481 13964 oappend (names[reg]);
b13b1bc0
JB
13965
13966 if (vex.w)
13967 {
13968 /* Swap 3rd and 4th operands. */
13969 strcpy (scratchbuf, op_out[3]);
13970 strcpy (op_out[3], op_out[2]);
13971 strcpy (op_out[2], scratchbuf);
13972 }
c0f3af97
L
13973}
13974
922d8de8 13975static void
93abb146
JB
13976OP_VexI4 (int bytemode ATTRIBUTE_UNUSED,
13977 int sizeflag ATTRIBUTE_UNUSED)
922d8de8 13978{
93abb146
JB
13979 scratchbuf[0] = '$';
13980 print_operand_value (scratchbuf + 1, 1, codep[-1] & 0xf);
13981 oappend_maybe_intel (scratchbuf);
922d8de8
DR
13982}
13983
43234a1e
L
13984static void
13985VPCMP_Fixup (int bytemode ATTRIBUTE_UNUSED,
13986 int sizeflag ATTRIBUTE_UNUSED)
13987{
13988 unsigned int cmp_type;
13989
13990 if (!vex.evex)
13991 abort ();
13992
13993 FETCH_DATA (the_info, codep + 1);
13994 cmp_type = *codep++ & 0xff;
13995 /* There are aliases for immediates 0, 1, 2, 4, 5, 6.
13996 If it's the case, print suffix, otherwise - print the immediate. */
13997 if (cmp_type < ARRAY_SIZE (simd_cmp_op)
13998 && cmp_type != 3
13999 && cmp_type != 7)
14000 {
14001 char suffix [3];
14002 char *p = mnemonicendp - 2;
14003
14004 /* vpcmp* can have both one- and two-lettered suffix. */
14005 if (p[0] == 'p')
14006 {
14007 p++;
14008 suffix[0] = p[0];
14009 suffix[1] = '\0';
14010 }
14011 else
14012 {
14013 suffix[0] = p[0];
14014 suffix[1] = p[1];
14015 suffix[2] = '\0';
14016 }
14017
14018 sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
14019 mnemonicendp += simd_cmp_op[cmp_type].len;
14020 }
be92cb14
JB
14021 else
14022 {
14023 /* We have a reserved extension byte. Output it directly. */
14024 scratchbuf[0] = '$';
14025 print_operand_value (scratchbuf + 1, 1, cmp_type);
14026 oappend_maybe_intel (scratchbuf);
14027 scratchbuf[0] = '\0';
14028 }
14029}
14030
14031static const struct op xop_cmp_op[] =
14032{
14033 { STRING_COMMA_LEN ("lt") },
14034 { STRING_COMMA_LEN ("le") },
14035 { STRING_COMMA_LEN ("gt") },
14036 { STRING_COMMA_LEN ("ge") },
14037 { STRING_COMMA_LEN ("eq") },
14038 { STRING_COMMA_LEN ("neq") },
14039 { STRING_COMMA_LEN ("false") },
14040 { STRING_COMMA_LEN ("true") }
14041};
14042
14043static void
14044VPCOM_Fixup (int bytemode ATTRIBUTE_UNUSED,
14045 int sizeflag ATTRIBUTE_UNUSED)
14046{
14047 unsigned int cmp_type;
14048
14049 FETCH_DATA (the_info, codep + 1);
14050 cmp_type = *codep++ & 0xff;
14051 if (cmp_type < ARRAY_SIZE (xop_cmp_op))
14052 {
14053 char suffix[3];
14054 char *p = mnemonicendp - 2;
14055
14056 /* vpcom* can have both one- and two-lettered suffix. */
14057 if (p[0] == 'm')
14058 {
14059 p++;
14060 suffix[0] = p[0];
14061 suffix[1] = '\0';
14062 }
14063 else
14064 {
14065 suffix[0] = p[0];
14066 suffix[1] = p[1];
14067 suffix[2] = '\0';
14068 }
14069
14070 sprintf (p, "%s%s", xop_cmp_op[cmp_type].name, suffix);
14071 mnemonicendp += xop_cmp_op[cmp_type].len;
14072 }
43234a1e
L
14073 else
14074 {
14075 /* We have a reserved extension byte. Output it directly. */
14076 scratchbuf[0] = '$';
14077 print_operand_value (scratchbuf + 1, 1, cmp_type);
9ce09ba2 14078 oappend_maybe_intel (scratchbuf);
43234a1e
L
14079 scratchbuf[0] = '\0';
14080 }
14081}
14082
ea397f5b
L
14083static const struct op pclmul_op[] =
14084{
14085 { STRING_COMMA_LEN ("lql") },
14086 { STRING_COMMA_LEN ("hql") },
14087 { STRING_COMMA_LEN ("lqh") },
14088 { STRING_COMMA_LEN ("hqh") }
c0f3af97
L
14089};
14090
14091static void
14092PCLMUL_Fixup (int bytemode ATTRIBUTE_UNUSED,
14093 int sizeflag ATTRIBUTE_UNUSED)
14094{
14095 unsigned int pclmul_type;
14096
14097 FETCH_DATA (the_info, codep + 1);
14098 pclmul_type = *codep++ & 0xff;
14099 switch (pclmul_type)
14100 {
14101 case 0x10:
14102 pclmul_type = 2;
14103 break;
14104 case 0x11:
14105 pclmul_type = 3;
14106 break;
14107 default:
14108 break;
7bb15c6f 14109 }
c0f3af97
L
14110 if (pclmul_type < ARRAY_SIZE (pclmul_op))
14111 {
14112 char suffix [4];
ea397f5b 14113 char *p = mnemonicendp - 3;
c0f3af97
L
14114 suffix[0] = p[0];
14115 suffix[1] = p[1];
14116 suffix[2] = p[2];
14117 suffix[3] = '\0';
ea397f5b
L
14118 sprintf (p, "%s%s", pclmul_op[pclmul_type].name, suffix);
14119 mnemonicendp += pclmul_op[pclmul_type].len;
c0f3af97
L
14120 }
14121 else
14122 {
14123 /* We have a reserved extension byte. Output it directly. */
14124 scratchbuf[0] = '$';
14125 print_operand_value (scratchbuf + 1, 1, pclmul_type);
9ce09ba2 14126 oappend_maybe_intel (scratchbuf);
c0f3af97
L
14127 scratchbuf[0] = '\0';
14128 }
14129}
14130
bc31405e
L
14131static void
14132MOVSXD_Fixup (int bytemode, int sizeflag)
14133{
14134 /* Add proper suffix to "movsxd". */
14135 char *p = mnemonicendp;
14136
14137 switch (bytemode)
14138 {
14139 case movsxd_mode:
14140 if (intel_syntax)
14141 {
14142 *p++ = 'x';
14143 *p++ = 'd';
14144 goto skip;
14145 }
14146
14147 USED_REX (REX_W);
14148 if (rex & REX_W)
14149 {
14150 *p++ = 'l';
14151 *p++ = 'q';
14152 }
14153 else
14154 {
14155 *p++ = 'x';
14156 *p++ = 'd';
14157 }
14158 break;
14159 default:
14160 oappend (INTERNAL_DISASSEMBLER_ERROR);
14161 break;
14162 }
14163
dc1e8a47 14164 skip:
bc31405e
L
14165 mnemonicendp = p;
14166 *p = '\0';
14167 OP_E (bytemode, sizeflag);
14168}
14169
43234a1e
L
14170static void
14171OP_Mask (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
14172{
14173 if (!vex.evex
1ba585e8 14174 || (bytemode != mask_mode && bytemode != mask_bd_mode))
43234a1e
L
14175 abort ();
14176
14177 USED_REX (REX_R);
14178 if ((rex & REX_R) != 0 || !vex.r)
14179 {
14180 BadOp ();
14181 return;
14182 }
14183
14184 oappend (names_mask [modrm.reg]);
14185}
14186
14187static void
14188OP_Rounding (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
14189{
43234a1e
L
14190 if (modrm.mod == 3 && vex.b)
14191 switch (bytemode)
14192 {
70df6fc9
L
14193 case evex_rounding_64_mode:
14194 if (address_mode != mode_64bit)
14195 {
14196 oappend ("(bad)");
14197 break;
14198 }
14199 /* Fall through. */
43234a1e
L
14200 case evex_rounding_mode:
14201 oappend (names_rounding[vex.ll]);
14202 break;
14203 case evex_sae_mode:
14204 oappend ("{sae}");
14205 break;
14206 default:
6df22cf6 14207 abort ();
43234a1e
L
14208 break;
14209 }
14210}
This page took 2.429573 seconds and 4 git commands to generate.