x86: re-arrange order of decode for various VEX opcodes
[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,
00ec1875
JB
696 REG_0F71_MOD_0,
697 REG_0F72_MOD_0,
698 REG_0F73_MOD_0,
3873ba12
L
699 REG_0FA6,
700 REG_0FA7,
701 REG_0FAE,
702 REG_0FBA,
703 REG_0FC7,
14d10c6c
JB
704 REG_VEX_0F71_M_0,
705 REG_VEX_0F72_M_0,
706 REG_VEX_0F73_M_0,
592a252b 707 REG_VEX_0FAE,
260cd341 708 REG_VEX_0F3849_X86_64_P_0_W_0_M_1,
14d10c6c 709 REG_VEX_0F38F3_L_0,
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,
7e8b059b
L
746 MOD_0F1A_PREFIX_0,
747 MOD_0F1B_PREFIX_0,
748 MOD_0F1B_PREFIX_1,
c48935d7 749 MOD_0F1C_PREFIX_0,
603555e5 750 MOD_0F1E_PREFIX_1,
3873ba12
L
751 MOD_0F2B_PREFIX_0,
752 MOD_0F2B_PREFIX_1,
753 MOD_0F2B_PREFIX_2,
754 MOD_0F2B_PREFIX_3,
a5aaedb9 755 MOD_0F50,
00ec1875
JB
756 MOD_0F71,
757 MOD_0F72,
758 MOD_0F73,
3873ba12
L
759 MOD_0FAE_REG_0,
760 MOD_0FAE_REG_1,
761 MOD_0FAE_REG_2,
762 MOD_0FAE_REG_3,
763 MOD_0FAE_REG_4,
764 MOD_0FAE_REG_5,
765 MOD_0FAE_REG_6,
766 MOD_0FAE_REG_7,
767 MOD_0FB2,
768 MOD_0FB4,
769 MOD_0FB5,
a8484f96 770 MOD_0FC3,
963f3586
IT
771 MOD_0FC7_REG_3,
772 MOD_0FC7_REG_4,
773 MOD_0FC7_REG_5,
3873ba12
L
774 MOD_0FC7_REG_6,
775 MOD_0FC7_REG_7,
776 MOD_0FD7,
777 MOD_0FE7_PREFIX_2,
778 MOD_0FF0_PREFIX_3,
7531c613 779 MOD_0F382A,
c4694f17
TG
780 MOD_0F38DC_PREFIX_1,
781 MOD_0F38DD_PREFIX_1,
782 MOD_0F38DE_PREFIX_1,
783 MOD_0F38DF_PREFIX_1,
7531c613 784 MOD_0F38F5,
603555e5 785 MOD_0F38F6_PREFIX_0,
5d79adc4 786 MOD_0F38F8_PREFIX_1,
c0a30a9f 787 MOD_0F38F8_PREFIX_2,
5d79adc4 788 MOD_0F38F8_PREFIX_3,
035e7389 789 MOD_0F38F9,
c4694f17
TG
790 MOD_0F38FA_PREFIX_1,
791 MOD_0F38FB_PREFIX_1,
c1fa250a 792 MOD_0F3A0F_PREFIX_1,
3873ba12
L
793 MOD_62_32BIT,
794 MOD_C4_32BIT,
795 MOD_C5_32BIT,
592a252b 796 MOD_VEX_0F12_PREFIX_0,
18897deb 797 MOD_VEX_0F12_PREFIX_2,
592a252b
L
798 MOD_VEX_0F13,
799 MOD_VEX_0F16_PREFIX_0,
18897deb 800 MOD_VEX_0F16_PREFIX_2,
592a252b
L
801 MOD_VEX_0F17,
802 MOD_VEX_0F2B,
ab4e4ed5
AF
803 MOD_VEX_W_0_0F41_P_0_LEN_1,
804 MOD_VEX_W_1_0F41_P_0_LEN_1,
805 MOD_VEX_W_0_0F41_P_2_LEN_1,
806 MOD_VEX_W_1_0F41_P_2_LEN_1,
807 MOD_VEX_W_0_0F42_P_0_LEN_1,
808 MOD_VEX_W_1_0F42_P_0_LEN_1,
809 MOD_VEX_W_0_0F42_P_2_LEN_1,
810 MOD_VEX_W_1_0F42_P_2_LEN_1,
811 MOD_VEX_W_0_0F44_P_0_LEN_1,
812 MOD_VEX_W_1_0F44_P_0_LEN_1,
813 MOD_VEX_W_0_0F44_P_2_LEN_1,
814 MOD_VEX_W_1_0F44_P_2_LEN_1,
815 MOD_VEX_W_0_0F45_P_0_LEN_1,
816 MOD_VEX_W_1_0F45_P_0_LEN_1,
817 MOD_VEX_W_0_0F45_P_2_LEN_1,
818 MOD_VEX_W_1_0F45_P_2_LEN_1,
819 MOD_VEX_W_0_0F46_P_0_LEN_1,
820 MOD_VEX_W_1_0F46_P_0_LEN_1,
821 MOD_VEX_W_0_0F46_P_2_LEN_1,
822 MOD_VEX_W_1_0F46_P_2_LEN_1,
823 MOD_VEX_W_0_0F47_P_0_LEN_1,
824 MOD_VEX_W_1_0F47_P_0_LEN_1,
825 MOD_VEX_W_0_0F47_P_2_LEN_1,
826 MOD_VEX_W_1_0F47_P_2_LEN_1,
827 MOD_VEX_W_0_0F4A_P_0_LEN_1,
828 MOD_VEX_W_1_0F4A_P_0_LEN_1,
829 MOD_VEX_W_0_0F4A_P_2_LEN_1,
830 MOD_VEX_W_1_0F4A_P_2_LEN_1,
831 MOD_VEX_W_0_0F4B_P_0_LEN_1,
832 MOD_VEX_W_1_0F4B_P_0_LEN_1,
833 MOD_VEX_W_0_0F4B_P_2_LEN_1,
592a252b 834 MOD_VEX_0F50,
14d10c6c
JB
835 MOD_VEX_0F71,
836 MOD_VEX_0F72,
837 MOD_VEX_0F73,
ab4e4ed5
AF
838 MOD_VEX_W_0_0F91_P_0_LEN_0,
839 MOD_VEX_W_1_0F91_P_0_LEN_0,
840 MOD_VEX_W_0_0F91_P_2_LEN_0,
841 MOD_VEX_W_1_0F91_P_2_LEN_0,
842 MOD_VEX_W_0_0F92_P_0_LEN_0,
843 MOD_VEX_W_0_0F92_P_2_LEN_0,
58a211d2 844 MOD_VEX_0F92_P_3_LEN_0,
ab4e4ed5
AF
845 MOD_VEX_W_0_0F93_P_0_LEN_0,
846 MOD_VEX_W_0_0F93_P_2_LEN_0,
58a211d2 847 MOD_VEX_0F93_P_3_LEN_0,
ab4e4ed5
AF
848 MOD_VEX_W_0_0F98_P_0_LEN_0,
849 MOD_VEX_W_1_0F98_P_0_LEN_0,
850 MOD_VEX_W_0_0F98_P_2_LEN_0,
851 MOD_VEX_W_1_0F98_P_2_LEN_0,
852 MOD_VEX_W_0_0F99_P_0_LEN_0,
853 MOD_VEX_W_1_0F99_P_0_LEN_0,
854 MOD_VEX_W_0_0F99_P_2_LEN_0,
855 MOD_VEX_W_1_0F99_P_2_LEN_0,
592a252b
L
856 MOD_VEX_0FAE_REG_2,
857 MOD_VEX_0FAE_REG_3,
7531c613
JB
858 MOD_VEX_0FD7,
859 MOD_VEX_0FE7,
592a252b 860 MOD_VEX_0FF0_PREFIX_3,
7531c613
JB
861 MOD_VEX_0F381A,
862 MOD_VEX_0F382A,
863 MOD_VEX_0F382C,
864 MOD_VEX_0F382D,
865 MOD_VEX_0F382E,
866 MOD_VEX_0F382F,
09d73035
CL
867 MOD_VEX_0F3849_X86_64_P_0_W_0,
868 MOD_VEX_0F3849_X86_64_P_2_W_0,
869 MOD_VEX_0F3849_X86_64_P_3_W_0,
870 MOD_VEX_0F384B_X86_64_P_1_W_0,
871 MOD_VEX_0F384B_X86_64_P_2_W_0,
872 MOD_VEX_0F384B_X86_64_P_3_W_0,
7531c613 873 MOD_VEX_0F385A,
09d73035
CL
874 MOD_VEX_0F385C_X86_64_P_1_W_0,
875 MOD_VEX_0F385E_X86_64_P_0_W_0,
876 MOD_VEX_0F385E_X86_64_P_1_W_0,
877 MOD_VEX_0F385E_X86_64_P_2_W_0,
878 MOD_VEX_0F385E_X86_64_P_3_W_0,
7531c613
JB
879 MOD_VEX_0F388C,
880 MOD_VEX_0F388E,
bb5b3501
JB
881 MOD_VEX_0F3A30_L_0,
882 MOD_VEX_0F3A31_L_0,
883 MOD_VEX_0F3A32_L_0,
884 MOD_VEX_0F3A33_L_0,
43234a1e 885
467bbef0
JB
886 MOD_VEX_0FXOP_09_12,
887
43234a1e 888 MOD_EVEX_0F12_PREFIX_0,
97e6786a
JB
889 MOD_EVEX_0F12_PREFIX_2,
890 MOD_EVEX_0F13,
43234a1e 891 MOD_EVEX_0F16_PREFIX_0,
97e6786a
JB
892 MOD_EVEX_0F16_PREFIX_2,
893 MOD_EVEX_0F17,
894 MOD_EVEX_0F2B,
7531c613
JB
895 MOD_EVEX_0F381A_W_0,
896 MOD_EVEX_0F381A_W_1,
897 MOD_EVEX_0F381B_W_0,
898 MOD_EVEX_0F381B_W_1,
464d2b65
JB
899 MOD_EVEX_0F3828_P_1,
900 MOD_EVEX_0F382A_P_1_W_1,
901 MOD_EVEX_0F3838_P_1,
902 MOD_EVEX_0F383A_P_1_W_0,
7531c613
JB
903 MOD_EVEX_0F385A_W_0,
904 MOD_EVEX_0F385A_W_1,
905 MOD_EVEX_0F385B_W_0,
906 MOD_EVEX_0F385B_W_1,
464d2b65
JB
907 MOD_EVEX_0F387A_W_0,
908 MOD_EVEX_0F387B_W_0,
909 MOD_EVEX_0F387C,
43234a1e
L
910 MOD_EVEX_0F38C6_REG_1,
911 MOD_EVEX_0F38C6_REG_2,
912 MOD_EVEX_0F38C6_REG_5,
913 MOD_EVEX_0F38C6_REG_6,
914 MOD_EVEX_0F38C7_REG_1,
915 MOD_EVEX_0F38C7_REG_2,
916 MOD_EVEX_0F38C7_REG_5,
917 MOD_EVEX_0F38C7_REG_6
51e7da1b 918};
1ceb70f8 919
51e7da1b
L
920enum
921{
42164a71
L
922 RM_C6_REG_7 = 0,
923 RM_C7_REG_7,
924 RM_0F01_REG_0,
3873ba12
L
925 RM_0F01_REG_1,
926 RM_0F01_REG_2,
927 RM_0F01_REG_3,
f8687e93
JB
928 RM_0F01_REG_5_MOD_3,
929 RM_0F01_REG_7_MOD_3,
930 RM_0F1E_P_1_MOD_3_REG_7,
c1fa250a 931 RM_0F3A0F_P_1_MOD_3_REG_0,
f8687e93
JB
932 RM_0FAE_REG_6_MOD_3_P_0,
933 RM_0FAE_REG_7_MOD_3,
260cd341 934 RM_VEX_0F3849_X86_64_P_0_W_0_M_1_R_0
51e7da1b 935};
1ceb70f8 936
51e7da1b
L
937enum
938{
939 PREFIX_90 = 0,
81d54bb7
CL
940 PREFIX_0F01_REG_1_RM_4,
941 PREFIX_0F01_REG_1_RM_5,
942 PREFIX_0F01_REG_1_RM_6,
943 PREFIX_0F01_REG_1_RM_7,
a847e322 944 PREFIX_0F01_REG_3_RM_1,
f8687e93
JB
945 PREFIX_0F01_REG_5_MOD_0,
946 PREFIX_0F01_REG_5_MOD_3_RM_0,
bb651e8b 947 PREFIX_0F01_REG_5_MOD_3_RM_1,
f8687e93 948 PREFIX_0F01_REG_5_MOD_3_RM_2,
f64c42a9
LC
949 PREFIX_0F01_REG_5_MOD_3_RM_4,
950 PREFIX_0F01_REG_5_MOD_3_RM_5,
951 PREFIX_0F01_REG_5_MOD_3_RM_6,
952 PREFIX_0F01_REG_5_MOD_3_RM_7,
267b8516 953 PREFIX_0F01_REG_7_MOD_3_RM_2,
646cc3e0
GG
954 PREFIX_0F01_REG_7_MOD_3_RM_6,
955 PREFIX_0F01_REG_7_MOD_3_RM_7,
3233d7d0 956 PREFIX_0F09,
3873ba12
L
957 PREFIX_0F10,
958 PREFIX_0F11,
959 PREFIX_0F12,
960 PREFIX_0F16,
7e8b059b
L
961 PREFIX_0F1A,
962 PREFIX_0F1B,
c48935d7 963 PREFIX_0F1C,
603555e5 964 PREFIX_0F1E,
3873ba12
L
965 PREFIX_0F2A,
966 PREFIX_0F2B,
967 PREFIX_0F2C,
968 PREFIX_0F2D,
969 PREFIX_0F2E,
970 PREFIX_0F2F,
971 PREFIX_0F51,
972 PREFIX_0F52,
973 PREFIX_0F53,
974 PREFIX_0F58,
975 PREFIX_0F59,
976 PREFIX_0F5A,
977 PREFIX_0F5B,
978 PREFIX_0F5C,
979 PREFIX_0F5D,
980 PREFIX_0F5E,
981 PREFIX_0F5F,
982 PREFIX_0F60,
983 PREFIX_0F61,
984 PREFIX_0F62,
3873ba12
L
985 PREFIX_0F6F,
986 PREFIX_0F70,
3873ba12
L
987 PREFIX_0F78,
988 PREFIX_0F79,
989 PREFIX_0F7C,
990 PREFIX_0F7D,
991 PREFIX_0F7E,
992 PREFIX_0F7F,
f8687e93
JB
993 PREFIX_0FAE_REG_0_MOD_3,
994 PREFIX_0FAE_REG_1_MOD_3,
995 PREFIX_0FAE_REG_2_MOD_3,
996 PREFIX_0FAE_REG_3_MOD_3,
997 PREFIX_0FAE_REG_4_MOD_0,
998 PREFIX_0FAE_REG_4_MOD_3,
f8687e93
JB
999 PREFIX_0FAE_REG_5_MOD_3,
1000 PREFIX_0FAE_REG_6_MOD_0,
1001 PREFIX_0FAE_REG_6_MOD_3,
1002 PREFIX_0FAE_REG_7_MOD_0,
3873ba12 1003 PREFIX_0FB8,
f12dc422 1004 PREFIX_0FBC,
3873ba12
L
1005 PREFIX_0FBD,
1006 PREFIX_0FC2,
f8687e93
JB
1007 PREFIX_0FC7_REG_6_MOD_0,
1008 PREFIX_0FC7_REG_6_MOD_3,
1009 PREFIX_0FC7_REG_7_MOD_3,
3873ba12
L
1010 PREFIX_0FD0,
1011 PREFIX_0FD6,
1012 PREFIX_0FE6,
1013 PREFIX_0FE7,
1014 PREFIX_0FF0,
1015 PREFIX_0FF7,
c4694f17
TG
1016 PREFIX_0F38D8,
1017 PREFIX_0F38DC,
1018 PREFIX_0F38DD,
1019 PREFIX_0F38DE,
1020 PREFIX_0F38DF,
3873ba12
L
1021 PREFIX_0F38F0,
1022 PREFIX_0F38F1,
e2e1fcde 1023 PREFIX_0F38F6,
c0a30a9f 1024 PREFIX_0F38F8,
c4694f17
TG
1025 PREFIX_0F38FA,
1026 PREFIX_0F38FB,
c1fa250a 1027 PREFIX_0F3A0F,
592a252b
L
1028 PREFIX_VEX_0F10,
1029 PREFIX_VEX_0F11,
1030 PREFIX_VEX_0F12,
1031 PREFIX_VEX_0F16,
1032 PREFIX_VEX_0F2A,
1033 PREFIX_VEX_0F2C,
1034 PREFIX_VEX_0F2D,
1035 PREFIX_VEX_0F2E,
1036 PREFIX_VEX_0F2F,
43234a1e
L
1037 PREFIX_VEX_0F41,
1038 PREFIX_VEX_0F42,
1039 PREFIX_VEX_0F44,
1040 PREFIX_VEX_0F45,
1041 PREFIX_VEX_0F46,
1042 PREFIX_VEX_0F47,
1ba585e8 1043 PREFIX_VEX_0F4A,
43234a1e 1044 PREFIX_VEX_0F4B,
592a252b
L
1045 PREFIX_VEX_0F51,
1046 PREFIX_VEX_0F52,
1047 PREFIX_VEX_0F53,
1048 PREFIX_VEX_0F58,
1049 PREFIX_VEX_0F59,
1050 PREFIX_VEX_0F5A,
1051 PREFIX_VEX_0F5B,
1052 PREFIX_VEX_0F5C,
1053 PREFIX_VEX_0F5D,
1054 PREFIX_VEX_0F5E,
1055 PREFIX_VEX_0F5F,
592a252b
L
1056 PREFIX_VEX_0F6F,
1057 PREFIX_VEX_0F70,
592a252b
L
1058 PREFIX_VEX_0F7C,
1059 PREFIX_VEX_0F7D,
1060 PREFIX_VEX_0F7E,
1061 PREFIX_VEX_0F7F,
43234a1e
L
1062 PREFIX_VEX_0F90,
1063 PREFIX_VEX_0F91,
1064 PREFIX_VEX_0F92,
1065 PREFIX_VEX_0F93,
1066 PREFIX_VEX_0F98,
1ba585e8 1067 PREFIX_VEX_0F99,
592a252b 1068 PREFIX_VEX_0FC2,
592a252b 1069 PREFIX_VEX_0FD0,
592a252b 1070 PREFIX_VEX_0FE6,
592a252b 1071 PREFIX_VEX_0FF0,
260cd341
LC
1072 PREFIX_VEX_0F3849_X86_64,
1073 PREFIX_VEX_0F384B_X86_64,
260cd341
LC
1074 PREFIX_VEX_0F385C_X86_64,
1075 PREFIX_VEX_0F385E_X86_64,
14d10c6c
JB
1076 PREFIX_VEX_0F38F5_L_0,
1077 PREFIX_VEX_0F38F6_L_0,
1078 PREFIX_VEX_0F38F7_L_0,
1079 PREFIX_VEX_0F3AF0_L_0,
43234a1e
L
1080
1081 PREFIX_EVEX_0F10,
1082 PREFIX_EVEX_0F11,
1083 PREFIX_EVEX_0F12,
43234a1e 1084 PREFIX_EVEX_0F16,
43234a1e 1085 PREFIX_EVEX_0F2A,
43234a1e
L
1086 PREFIX_EVEX_0F51,
1087 PREFIX_EVEX_0F58,
1088 PREFIX_EVEX_0F59,
1089 PREFIX_EVEX_0F5A,
1090 PREFIX_EVEX_0F5B,
1091 PREFIX_EVEX_0F5C,
1092 PREFIX_EVEX_0F5D,
1093 PREFIX_EVEX_0F5E,
1094 PREFIX_EVEX_0F5F,
43234a1e
L
1095 PREFIX_EVEX_0F6F,
1096 PREFIX_EVEX_0F70,
43234a1e
L
1097 PREFIX_EVEX_0F78,
1098 PREFIX_EVEX_0F79,
1099 PREFIX_EVEX_0F7A,
1100 PREFIX_EVEX_0F7B,
1101 PREFIX_EVEX_0F7E,
1102 PREFIX_EVEX_0F7F,
1103 PREFIX_EVEX_0FC2,
43234a1e 1104 PREFIX_EVEX_0FE6,
1ba585e8 1105 PREFIX_EVEX_0F3810,
43234a1e
L
1106 PREFIX_EVEX_0F3811,
1107 PREFIX_EVEX_0F3812,
1108 PREFIX_EVEX_0F3813,
1109 PREFIX_EVEX_0F3814,
1110 PREFIX_EVEX_0F3815,
1ba585e8 1111 PREFIX_EVEX_0F3820,
43234a1e
L
1112 PREFIX_EVEX_0F3821,
1113 PREFIX_EVEX_0F3822,
1114 PREFIX_EVEX_0F3823,
1115 PREFIX_EVEX_0F3824,
1116 PREFIX_EVEX_0F3825,
1ba585e8 1117 PREFIX_EVEX_0F3826,
43234a1e
L
1118 PREFIX_EVEX_0F3827,
1119 PREFIX_EVEX_0F3828,
1120 PREFIX_EVEX_0F3829,
1121 PREFIX_EVEX_0F382A,
1ba585e8 1122 PREFIX_EVEX_0F3830,
43234a1e
L
1123 PREFIX_EVEX_0F3831,
1124 PREFIX_EVEX_0F3832,
1125 PREFIX_EVEX_0F3833,
1126 PREFIX_EVEX_0F3834,
1127 PREFIX_EVEX_0F3835,
1ba585e8 1128 PREFIX_EVEX_0F3838,
43234a1e
L
1129 PREFIX_EVEX_0F3839,
1130 PREFIX_EVEX_0F383A,
47acf0bd
IT
1131 PREFIX_EVEX_0F3852,
1132 PREFIX_EVEX_0F3853,
9186c494 1133 PREFIX_EVEX_0F3868,
53467f57 1134 PREFIX_EVEX_0F3872,
43234a1e
L
1135 PREFIX_EVEX_0F389A,
1136 PREFIX_EVEX_0F389B,
43234a1e
L
1137 PREFIX_EVEX_0F38AA,
1138 PREFIX_EVEX_0F38AB,
51e7da1b 1139};
4e7d34a6 1140
51e7da1b
L
1141enum
1142{
1143 X86_64_06 = 0,
3873ba12 1144 X86_64_07,
1673df32 1145 X86_64_0E,
3873ba12
L
1146 X86_64_16,
1147 X86_64_17,
1148 X86_64_1E,
1149 X86_64_1F,
1150 X86_64_27,
1151 X86_64_2F,
1152 X86_64_37,
1153 X86_64_3F,
1154 X86_64_60,
1155 X86_64_61,
1156 X86_64_62,
1157 X86_64_63,
1158 X86_64_6D,
1159 X86_64_6F,
d039fef3 1160 X86_64_82,
3873ba12 1161 X86_64_9A,
aeab2b26
JB
1162 X86_64_C2,
1163 X86_64_C3,
3873ba12
L
1164 X86_64_C4,
1165 X86_64_C5,
1166 X86_64_CE,
1167 X86_64_D4,
1168 X86_64_D5,
a72d2af2
L
1169 X86_64_E8,
1170 X86_64_E9,
3873ba12
L
1171 X86_64_EA,
1172 X86_64_0F01_REG_0,
1173 X86_64_0F01_REG_1,
81d54bb7
CL
1174 X86_64_0F01_REG_1_RM_5_PREFIX_2,
1175 X86_64_0F01_REG_1_RM_6_PREFIX_2,
1176 X86_64_0F01_REG_1_RM_7_PREFIX_2,
3873ba12 1177 X86_64_0F01_REG_2,
260cd341 1178 X86_64_0F01_REG_3,
78467458
JB
1179 X86_64_0F24,
1180 X86_64_0F26,
260cd341
LC
1181 X86_64_VEX_0F3849,
1182 X86_64_VEX_0F384B,
1183 X86_64_VEX_0F385C,
f64c42a9
LC
1184 X86_64_VEX_0F385E,
1185 X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1,
1186 X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1,
1187 X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1,
1188 X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1,
646cc3e0
GG
1189 X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1,
1190 X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3,
1191 X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1,
f64c42a9 1192 X86_64_0FC7_REG_6_MOD_3_PREFIX_1
51e7da1b 1193};
4e7d34a6 1194
51e7da1b
L
1195enum
1196{
1197 THREE_BYTE_0F38 = 0,
1f334aeb 1198 THREE_BYTE_0F3A
51e7da1b 1199};
4e7d34a6 1200
f88c9eb0
SP
1201enum
1202{
5dd85c99
SP
1203 XOP_08 = 0,
1204 XOP_09,
f88c9eb0
SP
1205 XOP_0A
1206};
1207
51e7da1b
L
1208enum
1209{
1210 VEX_0F = 0,
3873ba12
L
1211 VEX_0F38,
1212 VEX_0F3A
51e7da1b 1213};
c0f3af97 1214
43234a1e
L
1215enum
1216{
1217 EVEX_0F = 0,
1218 EVEX_0F38,
1219 EVEX_0F3A
1220};
1221
51e7da1b
L
1222enum
1223{
ec6f095a 1224 VEX_LEN_0F12_P_0_M_0 = 0,
592a252b 1225 VEX_LEN_0F12_P_0_M_1,
18897deb 1226#define VEX_LEN_0F12_P_2_M_0 VEX_LEN_0F12_P_0_M_0
592a252b
L
1227 VEX_LEN_0F13_M_0,
1228 VEX_LEN_0F16_P_0_M_0,
1229 VEX_LEN_0F16_P_0_M_1,
18897deb 1230#define VEX_LEN_0F16_P_2_M_0 VEX_LEN_0F16_P_0_M_0
592a252b 1231 VEX_LEN_0F17_M_0,
43234a1e 1232 VEX_LEN_0F41_P_0,
1ba585e8 1233 VEX_LEN_0F41_P_2,
43234a1e 1234 VEX_LEN_0F42_P_0,
1ba585e8 1235 VEX_LEN_0F42_P_2,
43234a1e 1236 VEX_LEN_0F44_P_0,
1ba585e8 1237 VEX_LEN_0F44_P_2,
43234a1e 1238 VEX_LEN_0F45_P_0,
1ba585e8 1239 VEX_LEN_0F45_P_2,
43234a1e 1240 VEX_LEN_0F46_P_0,
1ba585e8 1241 VEX_LEN_0F46_P_2,
43234a1e 1242 VEX_LEN_0F47_P_0,
1ba585e8
IT
1243 VEX_LEN_0F47_P_2,
1244 VEX_LEN_0F4A_P_0,
1245 VEX_LEN_0F4A_P_2,
1246 VEX_LEN_0F4B_P_0,
43234a1e 1247 VEX_LEN_0F4B_P_2,
7531c613 1248 VEX_LEN_0F6E,
035e7389 1249 VEX_LEN_0F77,
592a252b
L
1250 VEX_LEN_0F7E_P_1,
1251 VEX_LEN_0F7E_P_2,
43234a1e 1252 VEX_LEN_0F90_P_0,
1ba585e8 1253 VEX_LEN_0F90_P_2,
43234a1e 1254 VEX_LEN_0F91_P_0,
1ba585e8 1255 VEX_LEN_0F91_P_2,
43234a1e 1256 VEX_LEN_0F92_P_0,
90a915bf 1257 VEX_LEN_0F92_P_2,
1ba585e8 1258 VEX_LEN_0F92_P_3,
43234a1e 1259 VEX_LEN_0F93_P_0,
90a915bf 1260 VEX_LEN_0F93_P_2,
1ba585e8 1261 VEX_LEN_0F93_P_3,
43234a1e 1262 VEX_LEN_0F98_P_0,
1ba585e8
IT
1263 VEX_LEN_0F98_P_2,
1264 VEX_LEN_0F99_P_0,
1265 VEX_LEN_0F99_P_2,
592a252b
L
1266 VEX_LEN_0FAE_R_2_M_0,
1267 VEX_LEN_0FAE_R_3_M_0,
7531c613
JB
1268 VEX_LEN_0FC4,
1269 VEX_LEN_0FC5,
1270 VEX_LEN_0FD6,
1271 VEX_LEN_0FF7,
1272 VEX_LEN_0F3816,
1273 VEX_LEN_0F3819,
1274 VEX_LEN_0F381A_M_0,
1275 VEX_LEN_0F3836,
1276 VEX_LEN_0F3841,
260cd341
LC
1277 VEX_LEN_0F3849_X86_64_P_0_W_0_M_0,
1278 VEX_LEN_0F3849_X86_64_P_0_W_0_M_1_REG_0_RM_0,
1279 VEX_LEN_0F3849_X86_64_P_2_W_0_M_0,
1280 VEX_LEN_0F3849_X86_64_P_3_W_0_M_0,
1281 VEX_LEN_0F384B_X86_64_P_1_W_0_M_0,
1282 VEX_LEN_0F384B_X86_64_P_2_W_0_M_0,
1283 VEX_LEN_0F384B_X86_64_P_3_W_0_M_0,
7531c613 1284 VEX_LEN_0F385A_M_0,
260cd341
LC
1285 VEX_LEN_0F385C_X86_64_P_1_W_0_M_0,
1286 VEX_LEN_0F385E_X86_64_P_0_W_0_M_0,
1287 VEX_LEN_0F385E_X86_64_P_1_W_0_M_0,
1288 VEX_LEN_0F385E_X86_64_P_2_W_0_M_0,
1289 VEX_LEN_0F385E_X86_64_P_3_W_0_M_0,
7531c613 1290 VEX_LEN_0F38DB,
035e7389 1291 VEX_LEN_0F38F2,
14d10c6c
JB
1292 VEX_LEN_0F38F3,
1293 VEX_LEN_0F38F5,
1294 VEX_LEN_0F38F6,
1295 VEX_LEN_0F38F7,
7531c613
JB
1296 VEX_LEN_0F3A00,
1297 VEX_LEN_0F3A01,
1298 VEX_LEN_0F3A06,
1299 VEX_LEN_0F3A14,
1300 VEX_LEN_0F3A15,
1301 VEX_LEN_0F3A16,
1302 VEX_LEN_0F3A17,
1303 VEX_LEN_0F3A18,
1304 VEX_LEN_0F3A19,
1305 VEX_LEN_0F3A20,
1306 VEX_LEN_0F3A21,
1307 VEX_LEN_0F3A22,
1308 VEX_LEN_0F3A30,
1309 VEX_LEN_0F3A31,
1310 VEX_LEN_0F3A32,
1311 VEX_LEN_0F3A33,
1312 VEX_LEN_0F3A38,
1313 VEX_LEN_0F3A39,
1314 VEX_LEN_0F3A41,
1315 VEX_LEN_0F3A46,
1316 VEX_LEN_0F3A60,
1317 VEX_LEN_0F3A61,
1318 VEX_LEN_0F3A62,
1319 VEX_LEN_0F3A63,
1320 VEX_LEN_0F3ADF,
14d10c6c 1321 VEX_LEN_0F3AF0,
467bbef0
JB
1322 VEX_LEN_0FXOP_08_85,
1323 VEX_LEN_0FXOP_08_86,
1324 VEX_LEN_0FXOP_08_87,
1325 VEX_LEN_0FXOP_08_8E,
1326 VEX_LEN_0FXOP_08_8F,
1327 VEX_LEN_0FXOP_08_95,
1328 VEX_LEN_0FXOP_08_96,
1329 VEX_LEN_0FXOP_08_97,
1330 VEX_LEN_0FXOP_08_9E,
1331 VEX_LEN_0FXOP_08_9F,
1332 VEX_LEN_0FXOP_08_A3,
1333 VEX_LEN_0FXOP_08_A6,
1334 VEX_LEN_0FXOP_08_B6,
1335 VEX_LEN_0FXOP_08_C0,
1336 VEX_LEN_0FXOP_08_C1,
1337 VEX_LEN_0FXOP_08_C2,
1338 VEX_LEN_0FXOP_08_C3,
ff688e1f
L
1339 VEX_LEN_0FXOP_08_CC,
1340 VEX_LEN_0FXOP_08_CD,
1341 VEX_LEN_0FXOP_08_CE,
1342 VEX_LEN_0FXOP_08_CF,
1343 VEX_LEN_0FXOP_08_EC,
1344 VEX_LEN_0FXOP_08_ED,
1345 VEX_LEN_0FXOP_08_EE,
1346 VEX_LEN_0FXOP_08_EF,
467bbef0
JB
1347 VEX_LEN_0FXOP_09_01,
1348 VEX_LEN_0FXOP_09_02,
1349 VEX_LEN_0FXOP_09_12_M_1,
b5b098c2
JB
1350 VEX_LEN_0FXOP_09_82_W_0,
1351 VEX_LEN_0FXOP_09_83_W_0,
467bbef0
JB
1352 VEX_LEN_0FXOP_09_90,
1353 VEX_LEN_0FXOP_09_91,
1354 VEX_LEN_0FXOP_09_92,
1355 VEX_LEN_0FXOP_09_93,
1356 VEX_LEN_0FXOP_09_94,
1357 VEX_LEN_0FXOP_09_95,
1358 VEX_LEN_0FXOP_09_96,
1359 VEX_LEN_0FXOP_09_97,
1360 VEX_LEN_0FXOP_09_98,
1361 VEX_LEN_0FXOP_09_99,
1362 VEX_LEN_0FXOP_09_9A,
1363 VEX_LEN_0FXOP_09_9B,
1364 VEX_LEN_0FXOP_09_C1,
1365 VEX_LEN_0FXOP_09_C2,
1366 VEX_LEN_0FXOP_09_C3,
1367 VEX_LEN_0FXOP_09_C6,
1368 VEX_LEN_0FXOP_09_C7,
1369 VEX_LEN_0FXOP_09_CB,
1370 VEX_LEN_0FXOP_09_D1,
1371 VEX_LEN_0FXOP_09_D2,
1372 VEX_LEN_0FXOP_09_D3,
1373 VEX_LEN_0FXOP_09_D6,
1374 VEX_LEN_0FXOP_09_D7,
1375 VEX_LEN_0FXOP_09_DB,
1376 VEX_LEN_0FXOP_09_E1,
1377 VEX_LEN_0FXOP_09_E2,
1378 VEX_LEN_0FXOP_09_E3,
1379 VEX_LEN_0FXOP_0A_12,
51e7da1b 1380};
c0f3af97 1381
04e2a182
L
1382enum
1383{
7531c613 1384 EVEX_LEN_0F6E = 0,
04e2a182
L
1385 EVEX_LEN_0F7E_P_1,
1386 EVEX_LEN_0F7E_P_2,
7531c613
JB
1387 EVEX_LEN_0FC4,
1388 EVEX_LEN_0FC5,
1389 EVEX_LEN_0FD6,
1390 EVEX_LEN_0F3816,
1391 EVEX_LEN_0F3819_W_0,
1392 EVEX_LEN_0F3819_W_1,
1393 EVEX_LEN_0F381A_W_0_M_0,
1394 EVEX_LEN_0F381A_W_1_M_0,
1395 EVEX_LEN_0F381B_W_0_M_0,
1396 EVEX_LEN_0F381B_W_1_M_0,
1397 EVEX_LEN_0F3836,
1398 EVEX_LEN_0F385A_W_0_M_0,
1399 EVEX_LEN_0F385A_W_1_M_0,
1400 EVEX_LEN_0F385B_W_0_M_0,
1401 EVEX_LEN_0F385B_W_1_M_0,
1402 EVEX_LEN_0F38C6_R_1_M_0,
1403 EVEX_LEN_0F38C6_R_2_M_0,
1404 EVEX_LEN_0F38C6_R_5_M_0,
1405 EVEX_LEN_0F38C6_R_6_M_0,
1406 EVEX_LEN_0F38C7_R_1_M_0_W_0,
1407 EVEX_LEN_0F38C7_R_1_M_0_W_1,
1408 EVEX_LEN_0F38C7_R_2_M_0_W_0,
1409 EVEX_LEN_0F38C7_R_2_M_0_W_1,
1410 EVEX_LEN_0F38C7_R_5_M_0_W_0,
1411 EVEX_LEN_0F38C7_R_5_M_0_W_1,
1412 EVEX_LEN_0F38C7_R_6_M_0_W_0,
1413 EVEX_LEN_0F38C7_R_6_M_0_W_1,
1414 EVEX_LEN_0F3A00_W_1,
1415 EVEX_LEN_0F3A01_W_1,
1416 EVEX_LEN_0F3A14,
1417 EVEX_LEN_0F3A15,
1418 EVEX_LEN_0F3A16,
1419 EVEX_LEN_0F3A17,
1420 EVEX_LEN_0F3A18_W_0,
1421 EVEX_LEN_0F3A18_W_1,
1422 EVEX_LEN_0F3A19_W_0,
1423 EVEX_LEN_0F3A19_W_1,
1424 EVEX_LEN_0F3A1A_W_0,
1425 EVEX_LEN_0F3A1A_W_1,
1426 EVEX_LEN_0F3A1B_W_0,
1427 EVEX_LEN_0F3A1B_W_1,
1428 EVEX_LEN_0F3A20,
1429 EVEX_LEN_0F3A21_W_0,
1430 EVEX_LEN_0F3A22,
1431 EVEX_LEN_0F3A23_W_0,
1432 EVEX_LEN_0F3A23_W_1,
1433 EVEX_LEN_0F3A38_W_0,
1434 EVEX_LEN_0F3A38_W_1,
1435 EVEX_LEN_0F3A39_W_0,
1436 EVEX_LEN_0F3A39_W_1,
1437 EVEX_LEN_0F3A3A_W_0,
1438 EVEX_LEN_0F3A3A_W_1,
1439 EVEX_LEN_0F3A3B_W_0,
1440 EVEX_LEN_0F3A3B_W_1,
1441 EVEX_LEN_0F3A43_W_0,
1442 EVEX_LEN_0F3A43_W_1
04e2a182
L
1443};
1444
9e30b8e0
L
1445enum
1446{
ec6f095a 1447 VEX_W_0F41_P_0_LEN_1 = 0,
1ba585e8 1448 VEX_W_0F41_P_2_LEN_1,
43234a1e 1449 VEX_W_0F42_P_0_LEN_1,
1ba585e8 1450 VEX_W_0F42_P_2_LEN_1,
43234a1e 1451 VEX_W_0F44_P_0_LEN_0,
1ba585e8 1452 VEX_W_0F44_P_2_LEN_0,
43234a1e 1453 VEX_W_0F45_P_0_LEN_1,
1ba585e8 1454 VEX_W_0F45_P_2_LEN_1,
43234a1e 1455 VEX_W_0F46_P_0_LEN_1,
1ba585e8 1456 VEX_W_0F46_P_2_LEN_1,
43234a1e 1457 VEX_W_0F47_P_0_LEN_1,
1ba585e8
IT
1458 VEX_W_0F47_P_2_LEN_1,
1459 VEX_W_0F4A_P_0_LEN_1,
1460 VEX_W_0F4A_P_2_LEN_1,
1461 VEX_W_0F4B_P_0_LEN_1,
43234a1e 1462 VEX_W_0F4B_P_2_LEN_1,
43234a1e 1463 VEX_W_0F90_P_0_LEN_0,
1ba585e8 1464 VEX_W_0F90_P_2_LEN_0,
43234a1e 1465 VEX_W_0F91_P_0_LEN_0,
1ba585e8 1466 VEX_W_0F91_P_2_LEN_0,
43234a1e 1467 VEX_W_0F92_P_0_LEN_0,
90a915bf 1468 VEX_W_0F92_P_2_LEN_0,
43234a1e 1469 VEX_W_0F93_P_0_LEN_0,
90a915bf 1470 VEX_W_0F93_P_2_LEN_0,
43234a1e 1471 VEX_W_0F98_P_0_LEN_0,
1ba585e8
IT
1472 VEX_W_0F98_P_2_LEN_0,
1473 VEX_W_0F99_P_0_LEN_0,
1474 VEX_W_0F99_P_2_LEN_0,
7531c613
JB
1475 VEX_W_0F380C,
1476 VEX_W_0F380D,
1477 VEX_W_0F380E,
1478 VEX_W_0F380F,
1479 VEX_W_0F3813,
1480 VEX_W_0F3816_L_1,
1481 VEX_W_0F3818,
1482 VEX_W_0F3819_L_1,
1483 VEX_W_0F381A_M_0_L_1,
1484 VEX_W_0F382C_M_0,
1485 VEX_W_0F382D_M_0,
1486 VEX_W_0F382E_M_0,
1487 VEX_W_0F382F_M_0,
1488 VEX_W_0F3836,
1489 VEX_W_0F3846,
260cd341
LC
1490 VEX_W_0F3849_X86_64_P_0,
1491 VEX_W_0F3849_X86_64_P_2,
1492 VEX_W_0F3849_X86_64_P_3,
1493 VEX_W_0F384B_X86_64_P_1,
1494 VEX_W_0F384B_X86_64_P_2,
1495 VEX_W_0F384B_X86_64_P_3,
58bf9b6a
L
1496 VEX_W_0F3850,
1497 VEX_W_0F3851,
1498 VEX_W_0F3852,
1499 VEX_W_0F3853,
7531c613
JB
1500 VEX_W_0F3858,
1501 VEX_W_0F3859,
1502 VEX_W_0F385A_M_0_L_0,
260cd341
LC
1503 VEX_W_0F385C_X86_64_P_1,
1504 VEX_W_0F385E_X86_64_P_0,
1505 VEX_W_0F385E_X86_64_P_1,
1506 VEX_W_0F385E_X86_64_P_2,
1507 VEX_W_0F385E_X86_64_P_3,
7531c613
JB
1508 VEX_W_0F3878,
1509 VEX_W_0F3879,
1510 VEX_W_0F38CF,
1511 VEX_W_0F3A00_L_1,
1512 VEX_W_0F3A01_L_1,
1513 VEX_W_0F3A02,
1514 VEX_W_0F3A04,
1515 VEX_W_0F3A05,
1516 VEX_W_0F3A06_L_1,
1517 VEX_W_0F3A18_L_1,
1518 VEX_W_0F3A19_L_1,
1519 VEX_W_0F3A1D,
7531c613
JB
1520 VEX_W_0F3A38_L_1,
1521 VEX_W_0F3A39_L_1,
1522 VEX_W_0F3A46_L_1,
1523 VEX_W_0F3A4A,
1524 VEX_W_0F3A4B,
1525 VEX_W_0F3A4C,
1526 VEX_W_0F3ACE,
1527 VEX_W_0F3ACF,
43234a1e 1528
467bbef0
JB
1529 VEX_W_0FXOP_08_85_L_0,
1530 VEX_W_0FXOP_08_86_L_0,
1531 VEX_W_0FXOP_08_87_L_0,
1532 VEX_W_0FXOP_08_8E_L_0,
1533 VEX_W_0FXOP_08_8F_L_0,
1534 VEX_W_0FXOP_08_95_L_0,
1535 VEX_W_0FXOP_08_96_L_0,
1536 VEX_W_0FXOP_08_97_L_0,
1537 VEX_W_0FXOP_08_9E_L_0,
1538 VEX_W_0FXOP_08_9F_L_0,
1539 VEX_W_0FXOP_08_A6_L_0,
1540 VEX_W_0FXOP_08_B6_L_0,
1541 VEX_W_0FXOP_08_C0_L_0,
1542 VEX_W_0FXOP_08_C1_L_0,
1543 VEX_W_0FXOP_08_C2_L_0,
1544 VEX_W_0FXOP_08_C3_L_0,
1545 VEX_W_0FXOP_08_CC_L_0,
1546 VEX_W_0FXOP_08_CD_L_0,
1547 VEX_W_0FXOP_08_CE_L_0,
1548 VEX_W_0FXOP_08_CF_L_0,
1549 VEX_W_0FXOP_08_EC_L_0,
1550 VEX_W_0FXOP_08_ED_L_0,
1551 VEX_W_0FXOP_08_EE_L_0,
1552 VEX_W_0FXOP_08_EF_L_0,
1553
b5b098c2
JB
1554 VEX_W_0FXOP_09_80,
1555 VEX_W_0FXOP_09_81,
1556 VEX_W_0FXOP_09_82,
1557 VEX_W_0FXOP_09_83,
467bbef0
JB
1558 VEX_W_0FXOP_09_C1_L_0,
1559 VEX_W_0FXOP_09_C2_L_0,
1560 VEX_W_0FXOP_09_C3_L_0,
1561 VEX_W_0FXOP_09_C6_L_0,
1562 VEX_W_0FXOP_09_C7_L_0,
1563 VEX_W_0FXOP_09_CB_L_0,
1564 VEX_W_0FXOP_09_D1_L_0,
1565 VEX_W_0FXOP_09_D2_L_0,
1566 VEX_W_0FXOP_09_D3_L_0,
1567 VEX_W_0FXOP_09_D6_L_0,
1568 VEX_W_0FXOP_09_D7_L_0,
1569 VEX_W_0FXOP_09_DB_L_0,
1570 VEX_W_0FXOP_09_E1_L_0,
1571 VEX_W_0FXOP_09_E2_L_0,
1572 VEX_W_0FXOP_09_E3_L_0,
b5b098c2 1573
36cc073e 1574 EVEX_W_0F10_P_1,
36cc073e 1575 EVEX_W_0F10_P_3,
36cc073e 1576 EVEX_W_0F11_P_1,
36cc073e 1577 EVEX_W_0F11_P_3,
43234a1e
L
1578 EVEX_W_0F12_P_0_M_1,
1579 EVEX_W_0F12_P_1,
43234a1e 1580 EVEX_W_0F12_P_3,
43234a1e
L
1581 EVEX_W_0F16_P_0_M_1,
1582 EVEX_W_0F16_P_1,
43234a1e 1583 EVEX_W_0F2A_P_3,
43234a1e 1584 EVEX_W_0F51_P_1,
43234a1e 1585 EVEX_W_0F51_P_3,
43234a1e 1586 EVEX_W_0F58_P_1,
43234a1e 1587 EVEX_W_0F58_P_3,
43234a1e 1588 EVEX_W_0F59_P_1,
43234a1e
L
1589 EVEX_W_0F59_P_3,
1590 EVEX_W_0F5A_P_0,
1591 EVEX_W_0F5A_P_1,
1592 EVEX_W_0F5A_P_2,
1593 EVEX_W_0F5A_P_3,
1594 EVEX_W_0F5B_P_0,
1595 EVEX_W_0F5B_P_1,
1596 EVEX_W_0F5B_P_2,
43234a1e 1597 EVEX_W_0F5C_P_1,
43234a1e 1598 EVEX_W_0F5C_P_3,
43234a1e 1599 EVEX_W_0F5D_P_1,
43234a1e 1600 EVEX_W_0F5D_P_3,
43234a1e 1601 EVEX_W_0F5E_P_1,
43234a1e 1602 EVEX_W_0F5E_P_3,
43234a1e 1603 EVEX_W_0F5F_P_1,
43234a1e 1604 EVEX_W_0F5F_P_3,
fedfb81e 1605 EVEX_W_0F62,
7531c613 1606 EVEX_W_0F66,
fedfb81e
JB
1607 EVEX_W_0F6A,
1608 EVEX_W_0F6B,
1609 EVEX_W_0F6C,
1610 EVEX_W_0F6D,
43234a1e
L
1611 EVEX_W_0F6F_P_1,
1612 EVEX_W_0F6F_P_2,
1ba585e8 1613 EVEX_W_0F6F_P_3,
43234a1e 1614 EVEX_W_0F70_P_2,
7531c613
JB
1615 EVEX_W_0F72_R_2,
1616 EVEX_W_0F72_R_6,
1617 EVEX_W_0F73_R_2,
1618 EVEX_W_0F73_R_6,
1619 EVEX_W_0F76,
43234a1e 1620 EVEX_W_0F78_P_0,
90a915bf 1621 EVEX_W_0F78_P_2,
43234a1e 1622 EVEX_W_0F79_P_0,
90a915bf 1623 EVEX_W_0F79_P_2,
43234a1e 1624 EVEX_W_0F7A_P_1,
90a915bf 1625 EVEX_W_0F7A_P_2,
43234a1e 1626 EVEX_W_0F7A_P_3,
90a915bf 1627 EVEX_W_0F7B_P_2,
43234a1e
L
1628 EVEX_W_0F7B_P_3,
1629 EVEX_W_0F7E_P_1,
43234a1e
L
1630 EVEX_W_0F7F_P_1,
1631 EVEX_W_0F7F_P_2,
1ba585e8 1632 EVEX_W_0F7F_P_3,
43234a1e 1633 EVEX_W_0FC2_P_1,
43234a1e 1634 EVEX_W_0FC2_P_3,
fedfb81e
JB
1635 EVEX_W_0FD2,
1636 EVEX_W_0FD3,
1637 EVEX_W_0FD4,
7531c613 1638 EVEX_W_0FD6_L_0,
43234a1e
L
1639 EVEX_W_0FE6_P_1,
1640 EVEX_W_0FE6_P_2,
1641 EVEX_W_0FE6_P_3,
7531c613 1642 EVEX_W_0FE7,
fedfb81e
JB
1643 EVEX_W_0FF2,
1644 EVEX_W_0FF3,
1645 EVEX_W_0FF4,
1646 EVEX_W_0FFA,
1647 EVEX_W_0FFB,
1648 EVEX_W_0FFE,
7531c613 1649 EVEX_W_0F380D,
1ba585e8
IT
1650 EVEX_W_0F3810_P_1,
1651 EVEX_W_0F3810_P_2,
43234a1e 1652 EVEX_W_0F3811_P_1,
1ba585e8 1653 EVEX_W_0F3811_P_2,
43234a1e 1654 EVEX_W_0F3812_P_1,
1ba585e8 1655 EVEX_W_0F3812_P_2,
43234a1e
L
1656 EVEX_W_0F3813_P_1,
1657 EVEX_W_0F3813_P_2,
1658 EVEX_W_0F3814_P_1,
1659 EVEX_W_0F3815_P_1,
7531c613
JB
1660 EVEX_W_0F3819,
1661 EVEX_W_0F381A,
1662 EVEX_W_0F381B,
1663 EVEX_W_0F381E,
1664 EVEX_W_0F381F,
1ba585e8 1665 EVEX_W_0F3820_P_1,
43234a1e
L
1666 EVEX_W_0F3821_P_1,
1667 EVEX_W_0F3822_P_1,
1668 EVEX_W_0F3823_P_1,
1669 EVEX_W_0F3824_P_1,
1670 EVEX_W_0F3825_P_1,
1671 EVEX_W_0F3825_P_2,
1672 EVEX_W_0F3828_P_2,
1673 EVEX_W_0F3829_P_2,
1674 EVEX_W_0F382A_P_1,
1675 EVEX_W_0F382A_P_2,
fedfb81e 1676 EVEX_W_0F382B,
1ba585e8 1677 EVEX_W_0F3830_P_1,
43234a1e
L
1678 EVEX_W_0F3831_P_1,
1679 EVEX_W_0F3832_P_1,
1680 EVEX_W_0F3833_P_1,
1681 EVEX_W_0F3834_P_1,
1682 EVEX_W_0F3835_P_1,
1683 EVEX_W_0F3835_P_2,
7531c613 1684 EVEX_W_0F3837,
43234a1e 1685 EVEX_W_0F383A_P_1,
d6aab7a1 1686 EVEX_W_0F3852_P_1,
7531c613
JB
1687 EVEX_W_0F3859,
1688 EVEX_W_0F385A,
1689 EVEX_W_0F385B,
1690 EVEX_W_0F3870,
d6aab7a1 1691 EVEX_W_0F3872_P_1,
53467f57 1692 EVEX_W_0F3872_P_2,
d6aab7a1 1693 EVEX_W_0F3872_P_3,
7531c613
JB
1694 EVEX_W_0F387A,
1695 EVEX_W_0F387B,
1696 EVEX_W_0F3883,
1697 EVEX_W_0F3891,
1698 EVEX_W_0F3893,
1699 EVEX_W_0F38A1,
1700 EVEX_W_0F38A3,
1701 EVEX_W_0F38C7_R_1_M_0,
1702 EVEX_W_0F38C7_R_2_M_0,
1703 EVEX_W_0F38C7_R_5_M_0,
1704 EVEX_W_0F38C7_R_6_M_0,
1705
1706 EVEX_W_0F3A00,
1707 EVEX_W_0F3A01,
1708 EVEX_W_0F3A05,
1709 EVEX_W_0F3A08,
1710 EVEX_W_0F3A09,
1711 EVEX_W_0F3A0A,
1712 EVEX_W_0F3A0B,
1713 EVEX_W_0F3A18,
1714 EVEX_W_0F3A19,
1715 EVEX_W_0F3A1A,
1716 EVEX_W_0F3A1B,
1717 EVEX_W_0F3A21,
1718 EVEX_W_0F3A23,
1719 EVEX_W_0F3A38,
1720 EVEX_W_0F3A39,
1721 EVEX_W_0F3A3A,
1722 EVEX_W_0F3A3B,
1723 EVEX_W_0F3A42,
1724 EVEX_W_0F3A43,
1725 EVEX_W_0F3A70,
1726 EVEX_W_0F3A72,
9e30b8e0
L
1727};
1728
26ca5450 1729typedef void (*op_rtn) (int bytemode, int sizeflag);
252b5132
RH
1730
1731struct dis386 {
2da11e11 1732 const char *name;
ce518a5f
L
1733 struct
1734 {
1735 op_rtn rtn;
1736 int bytemode;
1737 } op[MAX_OPERANDS];
bf890a93 1738 unsigned int prefix_requirement;
252b5132
RH
1739};
1740
1741/* Upper case letters in the instruction names here are macros.
1742 'A' => print 'b' if no register operands or suffix_always is true
1743 'B' => print 'b' if suffix_always is true
9306ca4a 1744 'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
98b528ac 1745 size prefix
ed7841b3 1746 'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
98b528ac 1747 suffix_always is true
252b5132 1748 'E' => print 'e' if 32-bit form of jcxz
3ffd33cf 1749 'F' => print 'w' or 'l' depending on address size prefix (loop insns)
52fd6d94 1750 'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
5dd0794d 1751 'H' => print ",pt" or ",pn" branch hint
d1c36125 1752 'I' unused.
8f570d62 1753 'J' unused.
42903f7f 1754 'K' => print 'd' or 'q' if rex prefix is present.
78467458 1755 'L' unused.
9d141669 1756 'M' => print 'r' if intel_mnemonic is false.
252b5132 1757 'N' => print 'n' if instruction has no wait "prefix"
a35ca55a 1758 'O' => print 'd' or 'o' (or 'q' in Intel mode)
36938cab
JB
1759 'P' => behave as 'T' except with register operand outside of suffix_always
1760 mode
98b528ac
L
1761 'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
1762 is true
a35ca55a 1763 'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
52b15da3 1764 'S' => print 'w', 'l' or 'q' if suffix_always is true
36938cab
JB
1765 'T' => print 'w', 'l'/'d', or 'q' if instruction has an operand size
1766 prefix or if suffix_always is true.
1767 'U' unused.
c3f5525f 1768 'V' unused.
a35ca55a 1769 'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
9306ca4a 1770 'X' => print 's', 'd' depending on data16 prefix (for XMM)
9646c87b 1771 'Y' unused.
78467458 1772 'Z' => print 'q' in 64bit mode and 'l' otherwise, if suffix_always is true.
9d141669 1773 '!' => change condition from true to false or from false to true.
98b528ac 1774 '%' => add 1 upper case letter to the macro.
5990e377
JB
1775 '^' => print 'w', 'l', or 'q' (Intel64 ISA only) depending on operand size
1776 prefix or suffix_always is true (lcall/ljmp).
36938cab
JB
1777 '@' => in 64bit mode for Intel64 ISA or if instruction
1778 has no operand sizing prefix, print 'q' if suffix_always is true or
1779 nothing otherwise; behave as 'P' in all other cases
98b528ac
L
1780
1781 2 upper case letter macros:
04d824a4
JB
1782 "XY" => print 'x' or 'y' if suffix_always is true or no register
1783 operands and no broadcast.
1784 "XZ" => print 'x', 'y', or 'z' if suffix_always is true or no
1785 register operands and no broadcast.
4b06377f 1786 "XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
58bf9b6a 1787 "XV" => print "{vex3}" pseudo prefix
b24d668c
JB
1788 "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand, cond
1789 being false, or no operand at all in 64bit mode, or if suffix_always
589958d6 1790 is true.
4b06377f
L
1791 "LB" => print "abs" in 64bit mode and behave as 'B' otherwise
1792 "LS" => print "abs" in 64bit mode and behave as 'S' otherwise
1793 "LV" => print "abs" for 64bit operand and behave as 'S' otherwise
492a76aa 1794 "DQ" => print 'd' or 'q' depending on the VEX.W bit
bb5b3501 1795 "BW" => print 'b' or 'w' depending on the VEX.W bit
4b4c407a
L
1796 "LP" => print 'w' or 'l' ('d' in Intel mode) if instruction has
1797 an operand size prefix, or suffix_always is true. print
1798 'q' if rex prefix is present.
52b15da3 1799
6439fc28
AM
1800 Many of the above letters print nothing in Intel mode. See "putop"
1801 for the details.
52b15da3 1802
6439fc28 1803 Braces '{' and '}', and vertical bars '|', indicate alternative
7c52e0e8 1804 mnemonic strings for AT&T and Intel. */
252b5132 1805
6439fc28 1806static const struct dis386 dis386[] = {
252b5132 1807 /* 00 */
bf890a93
IT
1808 { "addB", { Ebh1, Gb }, 0 },
1809 { "addS", { Evh1, Gv }, 0 },
1810 { "addB", { Gb, EbS }, 0 },
1811 { "addS", { Gv, EvS }, 0 },
1812 { "addB", { AL, Ib }, 0 },
1813 { "addS", { eAX, Iv }, 0 },
4e7d34a6
L
1814 { X86_64_TABLE (X86_64_06) },
1815 { X86_64_TABLE (X86_64_07) },
252b5132 1816 /* 08 */
bf890a93
IT
1817 { "orB", { Ebh1, Gb }, 0 },
1818 { "orS", { Evh1, Gv }, 0 },
1819 { "orB", { Gb, EbS }, 0 },
1820 { "orS", { Gv, EvS }, 0 },
1821 { "orB", { AL, Ib }, 0 },
1822 { "orS", { eAX, Iv }, 0 },
1673df32 1823 { X86_64_TABLE (X86_64_0E) },
592d1631 1824 { Bad_Opcode }, /* 0x0f extended opcode escape */
252b5132 1825 /* 10 */
bf890a93
IT
1826 { "adcB", { Ebh1, Gb }, 0 },
1827 { "adcS", { Evh1, Gv }, 0 },
1828 { "adcB", { Gb, EbS }, 0 },
1829 { "adcS", { Gv, EvS }, 0 },
1830 { "adcB", { AL, Ib }, 0 },
1831 { "adcS", { eAX, Iv }, 0 },
4e7d34a6
L
1832 { X86_64_TABLE (X86_64_16) },
1833 { X86_64_TABLE (X86_64_17) },
252b5132 1834 /* 18 */
bf890a93
IT
1835 { "sbbB", { Ebh1, Gb }, 0 },
1836 { "sbbS", { Evh1, Gv }, 0 },
1837 { "sbbB", { Gb, EbS }, 0 },
1838 { "sbbS", { Gv, EvS }, 0 },
1839 { "sbbB", { AL, Ib }, 0 },
1840 { "sbbS", { eAX, Iv }, 0 },
4e7d34a6
L
1841 { X86_64_TABLE (X86_64_1E) },
1842 { X86_64_TABLE (X86_64_1F) },
252b5132 1843 /* 20 */
bf890a93
IT
1844 { "andB", { Ebh1, Gb }, 0 },
1845 { "andS", { Evh1, Gv }, 0 },
1846 { "andB", { Gb, EbS }, 0 },
1847 { "andS", { Gv, EvS }, 0 },
1848 { "andB", { AL, Ib }, 0 },
1849 { "andS", { eAX, Iv }, 0 },
592d1631 1850 { Bad_Opcode }, /* SEG ES prefix */
4e7d34a6 1851 { X86_64_TABLE (X86_64_27) },
252b5132 1852 /* 28 */
bf890a93
IT
1853 { "subB", { Ebh1, Gb }, 0 },
1854 { "subS", { Evh1, Gv }, 0 },
1855 { "subB", { Gb, EbS }, 0 },
1856 { "subS", { Gv, EvS }, 0 },
1857 { "subB", { AL, Ib }, 0 },
1858 { "subS", { eAX, Iv }, 0 },
592d1631 1859 { Bad_Opcode }, /* SEG CS prefix */
4e7d34a6 1860 { X86_64_TABLE (X86_64_2F) },
252b5132 1861 /* 30 */
bf890a93
IT
1862 { "xorB", { Ebh1, Gb }, 0 },
1863 { "xorS", { Evh1, Gv }, 0 },
1864 { "xorB", { Gb, EbS }, 0 },
1865 { "xorS", { Gv, EvS }, 0 },
1866 { "xorB", { AL, Ib }, 0 },
1867 { "xorS", { eAX, Iv }, 0 },
592d1631 1868 { Bad_Opcode }, /* SEG SS prefix */
4e7d34a6 1869 { X86_64_TABLE (X86_64_37) },
252b5132 1870 /* 38 */
bf890a93
IT
1871 { "cmpB", { Eb, Gb }, 0 },
1872 { "cmpS", { Ev, Gv }, 0 },
1873 { "cmpB", { Gb, EbS }, 0 },
1874 { "cmpS", { Gv, EvS }, 0 },
1875 { "cmpB", { AL, Ib }, 0 },
1876 { "cmpS", { eAX, Iv }, 0 },
592d1631 1877 { Bad_Opcode }, /* SEG DS prefix */
4e7d34a6 1878 { X86_64_TABLE (X86_64_3F) },
252b5132 1879 /* 40 */
bf890a93
IT
1880 { "inc{S|}", { RMeAX }, 0 },
1881 { "inc{S|}", { RMeCX }, 0 },
1882 { "inc{S|}", { RMeDX }, 0 },
1883 { "inc{S|}", { RMeBX }, 0 },
1884 { "inc{S|}", { RMeSP }, 0 },
1885 { "inc{S|}", { RMeBP }, 0 },
1886 { "inc{S|}", { RMeSI }, 0 },
1887 { "inc{S|}", { RMeDI }, 0 },
252b5132 1888 /* 48 */
bf890a93
IT
1889 { "dec{S|}", { RMeAX }, 0 },
1890 { "dec{S|}", { RMeCX }, 0 },
1891 { "dec{S|}", { RMeDX }, 0 },
1892 { "dec{S|}", { RMeBX }, 0 },
1893 { "dec{S|}", { RMeSP }, 0 },
1894 { "dec{S|}", { RMeBP }, 0 },
1895 { "dec{S|}", { RMeSI }, 0 },
1896 { "dec{S|}", { RMeDI }, 0 },
252b5132 1897 /* 50 */
c3f5525f
JB
1898 { "push{!P|}", { RMrAX }, 0 },
1899 { "push{!P|}", { RMrCX }, 0 },
1900 { "push{!P|}", { RMrDX }, 0 },
1901 { "push{!P|}", { RMrBX }, 0 },
1902 { "push{!P|}", { RMrSP }, 0 },
1903 { "push{!P|}", { RMrBP }, 0 },
1904 { "push{!P|}", { RMrSI }, 0 },
1905 { "push{!P|}", { RMrDI }, 0 },
252b5132 1906 /* 58 */
c3f5525f
JB
1907 { "pop{!P|}", { RMrAX }, 0 },
1908 { "pop{!P|}", { RMrCX }, 0 },
1909 { "pop{!P|}", { RMrDX }, 0 },
1910 { "pop{!P|}", { RMrBX }, 0 },
1911 { "pop{!P|}", { RMrSP }, 0 },
1912 { "pop{!P|}", { RMrBP }, 0 },
1913 { "pop{!P|}", { RMrSI }, 0 },
1914 { "pop{!P|}", { RMrDI }, 0 },
252b5132 1915 /* 60 */
4e7d34a6
L
1916 { X86_64_TABLE (X86_64_60) },
1917 { X86_64_TABLE (X86_64_61) },
1918 { X86_64_TABLE (X86_64_62) },
1919 { X86_64_TABLE (X86_64_63) },
592d1631
L
1920 { Bad_Opcode }, /* seg fs */
1921 { Bad_Opcode }, /* seg gs */
1922 { Bad_Opcode }, /* op size prefix */
1923 { Bad_Opcode }, /* adr size prefix */
252b5132 1924 /* 68 */
36938cab 1925 { "pushP", { sIv }, 0 },
bf890a93 1926 { "imulS", { Gv, Ev, Iv }, 0 },
36938cab 1927 { "pushP", { sIbT }, 0 },
bf890a93
IT
1928 { "imulS", { Gv, Ev, sIb }, 0 },
1929 { "ins{b|}", { Ybr, indirDX }, 0 },
4e7d34a6 1930 { X86_64_TABLE (X86_64_6D) },
bf890a93 1931 { "outs{b|}", { indirDXr, Xb }, 0 },
4e7d34a6 1932 { X86_64_TABLE (X86_64_6F) },
252b5132 1933 /* 70 */
bf890a93
IT
1934 { "joH", { Jb, BND, cond_jump_flag }, 0 },
1935 { "jnoH", { Jb, BND, cond_jump_flag }, 0 },
1936 { "jbH", { Jb, BND, cond_jump_flag }, 0 },
1937 { "jaeH", { Jb, BND, cond_jump_flag }, 0 },
1938 { "jeH", { Jb, BND, cond_jump_flag }, 0 },
1939 { "jneH", { Jb, BND, cond_jump_flag }, 0 },
1940 { "jbeH", { Jb, BND, cond_jump_flag }, 0 },
1941 { "jaH", { Jb, BND, cond_jump_flag }, 0 },
252b5132 1942 /* 78 */
bf890a93
IT
1943 { "jsH", { Jb, BND, cond_jump_flag }, 0 },
1944 { "jnsH", { Jb, BND, cond_jump_flag }, 0 },
1945 { "jpH", { Jb, BND, cond_jump_flag }, 0 },
1946 { "jnpH", { Jb, BND, cond_jump_flag }, 0 },
1947 { "jlH", { Jb, BND, cond_jump_flag }, 0 },
1948 { "jgeH", { Jb, BND, cond_jump_flag }, 0 },
1949 { "jleH", { Jb, BND, cond_jump_flag }, 0 },
1950 { "jgH", { Jb, BND, cond_jump_flag }, 0 },
252b5132 1951 /* 80 */
1ceb70f8
L
1952 { REG_TABLE (REG_80) },
1953 { REG_TABLE (REG_81) },
d039fef3 1954 { X86_64_TABLE (X86_64_82) },
7148c369 1955 { REG_TABLE (REG_83) },
bf890a93
IT
1956 { "testB", { Eb, Gb }, 0 },
1957 { "testS", { Ev, Gv }, 0 },
1958 { "xchgB", { Ebh2, Gb }, 0 },
1959 { "xchgS", { Evh2, Gv }, 0 },
252b5132 1960 /* 88 */
bf890a93
IT
1961 { "movB", { Ebh3, Gb }, 0 },
1962 { "movS", { Evh3, Gv }, 0 },
1963 { "movB", { Gb, EbS }, 0 },
1964 { "movS", { Gv, EvS }, 0 },
1965 { "movD", { Sv, Sw }, 0 },
1ceb70f8 1966 { MOD_TABLE (MOD_8D) },
bf890a93 1967 { "movD", { Sw, Sv }, 0 },
1ceb70f8 1968 { REG_TABLE (REG_8F) },
252b5132 1969 /* 90 */
1ceb70f8 1970 { PREFIX_TABLE (PREFIX_90) },
bf890a93
IT
1971 { "xchgS", { RMeCX, eAX }, 0 },
1972 { "xchgS", { RMeDX, eAX }, 0 },
1973 { "xchgS", { RMeBX, eAX }, 0 },
1974 { "xchgS", { RMeSP, eAX }, 0 },
1975 { "xchgS", { RMeBP, eAX }, 0 },
1976 { "xchgS", { RMeSI, eAX }, 0 },
1977 { "xchgS", { RMeDI, eAX }, 0 },
252b5132 1978 /* 98 */
bf890a93
IT
1979 { "cW{t|}R", { XX }, 0 },
1980 { "cR{t|}O", { XX }, 0 },
4e7d34a6 1981 { X86_64_TABLE (X86_64_9A) },
592d1631 1982 { Bad_Opcode }, /* fwait */
36938cab
JB
1983 { "pushfP", { XX }, 0 },
1984 { "popfP", { XX }, 0 },
bf890a93
IT
1985 { "sahf", { XX }, 0 },
1986 { "lahf", { XX }, 0 },
252b5132 1987 /* a0 */
bf890a93
IT
1988 { "mov%LB", { AL, Ob }, 0 },
1989 { "mov%LS", { eAX, Ov }, 0 },
1990 { "mov%LB", { Ob, AL }, 0 },
1991 { "mov%LS", { Ov, eAX }, 0 },
1992 { "movs{b|}", { Ybr, Xb }, 0 },
1993 { "movs{R|}", { Yvr, Xv }, 0 },
1994 { "cmps{b|}", { Xb, Yb }, 0 },
1995 { "cmps{R|}", { Xv, Yv }, 0 },
252b5132 1996 /* a8 */
bf890a93
IT
1997 { "testB", { AL, Ib }, 0 },
1998 { "testS", { eAX, Iv }, 0 },
1999 { "stosB", { Ybr, AL }, 0 },
2000 { "stosS", { Yvr, eAX }, 0 },
2001 { "lodsB", { ALr, Xb }, 0 },
2002 { "lodsS", { eAXr, Xv }, 0 },
2003 { "scasB", { AL, Yb }, 0 },
2004 { "scasS", { eAX, Yv }, 0 },
252b5132 2005 /* b0 */
bf890a93
IT
2006 { "movB", { RMAL, Ib }, 0 },
2007 { "movB", { RMCL, Ib }, 0 },
2008 { "movB", { RMDL, Ib }, 0 },
2009 { "movB", { RMBL, Ib }, 0 },
2010 { "movB", { RMAH, Ib }, 0 },
2011 { "movB", { RMCH, Ib }, 0 },
2012 { "movB", { RMDH, Ib }, 0 },
2013 { "movB", { RMBH, Ib }, 0 },
252b5132 2014 /* b8 */
bf890a93
IT
2015 { "mov%LV", { RMeAX, Iv64 }, 0 },
2016 { "mov%LV", { RMeCX, Iv64 }, 0 },
2017 { "mov%LV", { RMeDX, Iv64 }, 0 },
2018 { "mov%LV", { RMeBX, Iv64 }, 0 },
2019 { "mov%LV", { RMeSP, Iv64 }, 0 },
2020 { "mov%LV", { RMeBP, Iv64 }, 0 },
2021 { "mov%LV", { RMeSI, Iv64 }, 0 },
2022 { "mov%LV", { RMeDI, Iv64 }, 0 },
252b5132 2023 /* c0 */
1ceb70f8
L
2024 { REG_TABLE (REG_C0) },
2025 { REG_TABLE (REG_C1) },
aeab2b26
JB
2026 { X86_64_TABLE (X86_64_C2) },
2027 { X86_64_TABLE (X86_64_C3) },
4e7d34a6
L
2028 { X86_64_TABLE (X86_64_C4) },
2029 { X86_64_TABLE (X86_64_C5) },
1ceb70f8
L
2030 { REG_TABLE (REG_C6) },
2031 { REG_TABLE (REG_C7) },
252b5132 2032 /* c8 */
36938cab
JB
2033 { "enterP", { Iw, Ib }, 0 },
2034 { "leaveP", { XX }, 0 },
2035 { "{l|}ret{|f}%LP", { Iw }, 0 },
2036 { "{l|}ret{|f}%LP", { XX }, 0 },
bf890a93
IT
2037 { "int3", { XX }, 0 },
2038 { "int", { Ib }, 0 },
4e7d34a6 2039 { X86_64_TABLE (X86_64_CE) },
bf890a93 2040 { "iret%LP", { XX }, 0 },
252b5132 2041 /* d0 */
1ceb70f8
L
2042 { REG_TABLE (REG_D0) },
2043 { REG_TABLE (REG_D1) },
2044 { REG_TABLE (REG_D2) },
2045 { REG_TABLE (REG_D3) },
4e7d34a6
L
2046 { X86_64_TABLE (X86_64_D4) },
2047 { X86_64_TABLE (X86_64_D5) },
592d1631 2048 { Bad_Opcode },
bf890a93 2049 { "xlat", { DSBX }, 0 },
252b5132
RH
2050 /* d8 */
2051 { FLOAT },
2052 { FLOAT },
2053 { FLOAT },
2054 { FLOAT },
2055 { FLOAT },
2056 { FLOAT },
2057 { FLOAT },
2058 { FLOAT },
2059 /* e0 */
bf890a93
IT
2060 { "loopneFH", { Jb, XX, loop_jcxz_flag }, 0 },
2061 { "loopeFH", { Jb, XX, loop_jcxz_flag }, 0 },
2062 { "loopFH", { Jb, XX, loop_jcxz_flag }, 0 },
2063 { "jEcxzH", { Jb, XX, loop_jcxz_flag }, 0 },
2064 { "inB", { AL, Ib }, 0 },
2065 { "inG", { zAX, Ib }, 0 },
2066 { "outB", { Ib, AL }, 0 },
2067 { "outG", { Ib, zAX }, 0 },
252b5132 2068 /* e8 */
a72d2af2
L
2069 { X86_64_TABLE (X86_64_E8) },
2070 { X86_64_TABLE (X86_64_E9) },
4e7d34a6 2071 { X86_64_TABLE (X86_64_EA) },
bf890a93
IT
2072 { "jmp", { Jb, BND }, 0 },
2073 { "inB", { AL, indirDX }, 0 },
2074 { "inG", { zAX, indirDX }, 0 },
2075 { "outB", { indirDX, AL }, 0 },
2076 { "outG", { indirDX, zAX }, 0 },
252b5132 2077 /* f0 */
592d1631 2078 { Bad_Opcode }, /* lock prefix */
bf890a93 2079 { "icebp", { XX }, 0 },
592d1631
L
2080 { Bad_Opcode }, /* repne */
2081 { Bad_Opcode }, /* repz */
bf890a93
IT
2082 { "hlt", { XX }, 0 },
2083 { "cmc", { XX }, 0 },
1ceb70f8
L
2084 { REG_TABLE (REG_F6) },
2085 { REG_TABLE (REG_F7) },
252b5132 2086 /* f8 */
bf890a93
IT
2087 { "clc", { XX }, 0 },
2088 { "stc", { XX }, 0 },
2089 { "cli", { XX }, 0 },
2090 { "sti", { XX }, 0 },
2091 { "cld", { XX }, 0 },
2092 { "std", { XX }, 0 },
1ceb70f8
L
2093 { REG_TABLE (REG_FE) },
2094 { REG_TABLE (REG_FF) },
252b5132
RH
2095};
2096
6439fc28 2097static const struct dis386 dis386_twobyte[] = {
252b5132 2098 /* 00 */
1ceb70f8
L
2099 { REG_TABLE (REG_0F00 ) },
2100 { REG_TABLE (REG_0F01 ) },
bf890a93
IT
2101 { "larS", { Gv, Ew }, 0 },
2102 { "lslS", { Gv, Ew }, 0 },
592d1631 2103 { Bad_Opcode },
bf890a93
IT
2104 { "syscall", { XX }, 0 },
2105 { "clts", { XX }, 0 },
589958d6 2106 { "sysret%LQ", { XX }, 0 },
252b5132 2107 /* 08 */
bf890a93 2108 { "invd", { XX }, 0 },
3233d7d0 2109 { PREFIX_TABLE (PREFIX_0F09) },
592d1631 2110 { Bad_Opcode },
bf890a93 2111 { "ud2", { XX }, 0 },
592d1631 2112 { Bad_Opcode },
b5b1fc4f 2113 { REG_TABLE (REG_0F0D) },
bf890a93
IT
2114 { "femms", { XX }, 0 },
2115 { "", { MX, EM, OPSUF }, 0 }, /* See OP_3DNowSuffix. */
252b5132 2116 /* 10 */
1ceb70f8
L
2117 { PREFIX_TABLE (PREFIX_0F10) },
2118 { PREFIX_TABLE (PREFIX_0F11) },
2119 { PREFIX_TABLE (PREFIX_0F12) },
2120 { MOD_TABLE (MOD_0F13) },
507bd325
L
2121 { "unpcklpX", { XM, EXx }, PREFIX_OPCODE },
2122 { "unpckhpX", { XM, EXx }, PREFIX_OPCODE },
1ceb70f8
L
2123 { PREFIX_TABLE (PREFIX_0F16) },
2124 { MOD_TABLE (MOD_0F17) },
252b5132 2125 /* 18 */
1ceb70f8 2126 { REG_TABLE (REG_0F18) },
bf890a93 2127 { "nopQ", { Ev }, 0 },
7e8b059b
L
2128 { PREFIX_TABLE (PREFIX_0F1A) },
2129 { PREFIX_TABLE (PREFIX_0F1B) },
c48935d7 2130 { PREFIX_TABLE (PREFIX_0F1C) },
bf890a93 2131 { "nopQ", { Ev }, 0 },
603555e5 2132 { PREFIX_TABLE (PREFIX_0F1E) },
bf890a93 2133 { "nopQ", { Ev }, 0 },
252b5132 2134 /* 20 */
78467458
JB
2135 { "movZ", { Em, Cm }, 0 },
2136 { "movZ", { Em, Dm }, 0 },
2137 { "movZ", { Cm, Em }, 0 },
2138 { "movZ", { Dm, Em }, 0 },
2139 { X86_64_TABLE (X86_64_0F24) },
592d1631 2140 { Bad_Opcode },
78467458 2141 { X86_64_TABLE (X86_64_0F26) },
592d1631 2142 { Bad_Opcode },
252b5132 2143 /* 28 */
507bd325
L
2144 { "movapX", { XM, EXx }, PREFIX_OPCODE },
2145 { "movapX", { EXxS, XM }, PREFIX_OPCODE },
1ceb70f8
L
2146 { PREFIX_TABLE (PREFIX_0F2A) },
2147 { PREFIX_TABLE (PREFIX_0F2B) },
2148 { PREFIX_TABLE (PREFIX_0F2C) },
2149 { PREFIX_TABLE (PREFIX_0F2D) },
2150 { PREFIX_TABLE (PREFIX_0F2E) },
2151 { PREFIX_TABLE (PREFIX_0F2F) },
252b5132 2152 /* 30 */
bf890a93
IT
2153 { "wrmsr", { XX }, 0 },
2154 { "rdtsc", { XX }, 0 },
2155 { "rdmsr", { XX }, 0 },
2156 { "rdpmc", { XX }, 0 },
d835a58b 2157 { "sysenter", { SEP }, 0 },
e93a3b27 2158 { "sysexit%LQ", { SEP }, 0 },
592d1631 2159 { Bad_Opcode },
bf890a93 2160 { "getsec", { XX }, 0 },
252b5132 2161 /* 38 */
507bd325 2162 { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F38, PREFIX_OPCODE) },
592d1631 2163 { Bad_Opcode },
507bd325 2164 { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F3A, PREFIX_OPCODE) },
592d1631
L
2165 { Bad_Opcode },
2166 { Bad_Opcode },
2167 { Bad_Opcode },
2168 { Bad_Opcode },
2169 { Bad_Opcode },
252b5132 2170 /* 40 */
bf890a93
IT
2171 { "cmovoS", { Gv, Ev }, 0 },
2172 { "cmovnoS", { Gv, Ev }, 0 },
2173 { "cmovbS", { Gv, Ev }, 0 },
2174 { "cmovaeS", { Gv, Ev }, 0 },
2175 { "cmoveS", { Gv, Ev }, 0 },
2176 { "cmovneS", { Gv, Ev }, 0 },
2177 { "cmovbeS", { Gv, Ev }, 0 },
2178 { "cmovaS", { Gv, Ev }, 0 },
252b5132 2179 /* 48 */
bf890a93
IT
2180 { "cmovsS", { Gv, Ev }, 0 },
2181 { "cmovnsS", { Gv, Ev }, 0 },
2182 { "cmovpS", { Gv, Ev }, 0 },
2183 { "cmovnpS", { Gv, Ev }, 0 },
2184 { "cmovlS", { Gv, Ev }, 0 },
2185 { "cmovgeS", { Gv, Ev }, 0 },
2186 { "cmovleS", { Gv, Ev }, 0 },
2187 { "cmovgS", { Gv, Ev }, 0 },
252b5132 2188 /* 50 */
a5aaedb9 2189 { MOD_TABLE (MOD_0F50) },
1ceb70f8
L
2190 { PREFIX_TABLE (PREFIX_0F51) },
2191 { PREFIX_TABLE (PREFIX_0F52) },
2192 { PREFIX_TABLE (PREFIX_0F53) },
507bd325
L
2193 { "andpX", { XM, EXx }, PREFIX_OPCODE },
2194 { "andnpX", { XM, EXx }, PREFIX_OPCODE },
2195 { "orpX", { XM, EXx }, PREFIX_OPCODE },
2196 { "xorpX", { XM, EXx }, PREFIX_OPCODE },
252b5132 2197 /* 58 */
1ceb70f8
L
2198 { PREFIX_TABLE (PREFIX_0F58) },
2199 { PREFIX_TABLE (PREFIX_0F59) },
2200 { PREFIX_TABLE (PREFIX_0F5A) },
2201 { PREFIX_TABLE (PREFIX_0F5B) },
2202 { PREFIX_TABLE (PREFIX_0F5C) },
2203 { PREFIX_TABLE (PREFIX_0F5D) },
2204 { PREFIX_TABLE (PREFIX_0F5E) },
2205 { PREFIX_TABLE (PREFIX_0F5F) },
252b5132 2206 /* 60 */
1ceb70f8
L
2207 { PREFIX_TABLE (PREFIX_0F60) },
2208 { PREFIX_TABLE (PREFIX_0F61) },
2209 { PREFIX_TABLE (PREFIX_0F62) },
507bd325
L
2210 { "packsswb", { MX, EM }, PREFIX_OPCODE },
2211 { "pcmpgtb", { MX, EM }, PREFIX_OPCODE },
2212 { "pcmpgtw", { MX, EM }, PREFIX_OPCODE },
2213 { "pcmpgtd", { MX, EM }, PREFIX_OPCODE },
2214 { "packuswb", { MX, EM }, PREFIX_OPCODE },
252b5132 2215 /* 68 */
507bd325
L
2216 { "punpckhbw", { MX, EM }, PREFIX_OPCODE },
2217 { "punpckhwd", { MX, EM }, PREFIX_OPCODE },
2218 { "punpckhdq", { MX, EM }, PREFIX_OPCODE },
2219 { "packssdw", { MX, EM }, PREFIX_OPCODE },
7531c613
JB
2220 { "punpcklqdq", { XM, EXx }, PREFIX_DATA },
2221 { "punpckhqdq", { XM, EXx }, PREFIX_DATA },
507bd325 2222 { "movK", { MX, Edq }, PREFIX_OPCODE },
1ceb70f8 2223 { PREFIX_TABLE (PREFIX_0F6F) },
252b5132 2224 /* 70 */
1ceb70f8 2225 { PREFIX_TABLE (PREFIX_0F70) },
00ec1875
JB
2226 { MOD_TABLE (MOD_0F71) },
2227 { MOD_TABLE (MOD_0F72) },
2228 { MOD_TABLE (MOD_0F73) },
507bd325
L
2229 { "pcmpeqb", { MX, EM }, PREFIX_OPCODE },
2230 { "pcmpeqw", { MX, EM }, PREFIX_OPCODE },
2231 { "pcmpeqd", { MX, EM }, PREFIX_OPCODE },
2232 { "emms", { XX }, PREFIX_OPCODE },
252b5132 2233 /* 78 */
1ceb70f8
L
2234 { PREFIX_TABLE (PREFIX_0F78) },
2235 { PREFIX_TABLE (PREFIX_0F79) },
1f334aeb 2236 { Bad_Opcode },
592d1631 2237 { Bad_Opcode },
1ceb70f8
L
2238 { PREFIX_TABLE (PREFIX_0F7C) },
2239 { PREFIX_TABLE (PREFIX_0F7D) },
2240 { PREFIX_TABLE (PREFIX_0F7E) },
2241 { PREFIX_TABLE (PREFIX_0F7F) },
252b5132 2242 /* 80 */
bf890a93
IT
2243 { "joH", { Jv, BND, cond_jump_flag }, 0 },
2244 { "jnoH", { Jv, BND, cond_jump_flag }, 0 },
2245 { "jbH", { Jv, BND, cond_jump_flag }, 0 },
2246 { "jaeH", { Jv, BND, cond_jump_flag }, 0 },
2247 { "jeH", { Jv, BND, cond_jump_flag }, 0 },
2248 { "jneH", { Jv, BND, cond_jump_flag }, 0 },
2249 { "jbeH", { Jv, BND, cond_jump_flag }, 0 },
2250 { "jaH", { Jv, BND, cond_jump_flag }, 0 },
252b5132 2251 /* 88 */
bf890a93
IT
2252 { "jsH", { Jv, BND, cond_jump_flag }, 0 },
2253 { "jnsH", { Jv, BND, cond_jump_flag }, 0 },
2254 { "jpH", { Jv, BND, cond_jump_flag }, 0 },
2255 { "jnpH", { Jv, BND, cond_jump_flag }, 0 },
2256 { "jlH", { Jv, BND, cond_jump_flag }, 0 },
2257 { "jgeH", { Jv, BND, cond_jump_flag }, 0 },
2258 { "jleH", { Jv, BND, cond_jump_flag }, 0 },
2259 { "jgH", { Jv, BND, cond_jump_flag }, 0 },
252b5132 2260 /* 90 */
bf890a93
IT
2261 { "seto", { Eb }, 0 },
2262 { "setno", { Eb }, 0 },
2263 { "setb", { Eb }, 0 },
2264 { "setae", { Eb }, 0 },
2265 { "sete", { Eb }, 0 },
2266 { "setne", { Eb }, 0 },
2267 { "setbe", { Eb }, 0 },
2268 { "seta", { Eb }, 0 },
252b5132 2269 /* 98 */
bf890a93
IT
2270 { "sets", { Eb }, 0 },
2271 { "setns", { Eb }, 0 },
2272 { "setp", { Eb }, 0 },
2273 { "setnp", { Eb }, 0 },
2274 { "setl", { Eb }, 0 },
2275 { "setge", { Eb }, 0 },
2276 { "setle", { Eb }, 0 },
2277 { "setg", { Eb }, 0 },
252b5132 2278 /* a0 */
36938cab
JB
2279 { "pushP", { fs }, 0 },
2280 { "popP", { fs }, 0 },
bf890a93
IT
2281 { "cpuid", { XX }, 0 },
2282 { "btS", { Ev, Gv }, 0 },
2283 { "shldS", { Ev, Gv, Ib }, 0 },
2284 { "shldS", { Ev, Gv, CL }, 0 },
1ceb70f8
L
2285 { REG_TABLE (REG_0FA6) },
2286 { REG_TABLE (REG_0FA7) },
252b5132 2287 /* a8 */
36938cab
JB
2288 { "pushP", { gs }, 0 },
2289 { "popP", { gs }, 0 },
bf890a93
IT
2290 { "rsm", { XX }, 0 },
2291 { "btsS", { Evh1, Gv }, 0 },
2292 { "shrdS", { Ev, Gv, Ib }, 0 },
2293 { "shrdS", { Ev, Gv, CL }, 0 },
1ceb70f8 2294 { REG_TABLE (REG_0FAE) },
bf890a93 2295 { "imulS", { Gv, Ev }, 0 },
252b5132 2296 /* b0 */
bf890a93
IT
2297 { "cmpxchgB", { Ebh1, Gb }, 0 },
2298 { "cmpxchgS", { Evh1, Gv }, 0 },
1ceb70f8 2299 { MOD_TABLE (MOD_0FB2) },
bf890a93 2300 { "btrS", { Evh1, Gv }, 0 },
1ceb70f8
L
2301 { MOD_TABLE (MOD_0FB4) },
2302 { MOD_TABLE (MOD_0FB5) },
bf890a93
IT
2303 { "movz{bR|x}", { Gv, Eb }, 0 },
2304 { "movz{wR|x}", { Gv, Ew }, 0 }, /* yes, there really is movzww ! */
252b5132 2305 /* b8 */
1ceb70f8 2306 { PREFIX_TABLE (PREFIX_0FB8) },
66f1eba0 2307 { "ud1S", { Gv, Ev }, 0 },
1ceb70f8 2308 { REG_TABLE (REG_0FBA) },
bf890a93 2309 { "btcS", { Evh1, Gv }, 0 },
f12dc422 2310 { PREFIX_TABLE (PREFIX_0FBC) },
1ceb70f8 2311 { PREFIX_TABLE (PREFIX_0FBD) },
bf890a93
IT
2312 { "movs{bR|x}", { Gv, Eb }, 0 },
2313 { "movs{wR|x}", { Gv, Ew }, 0 }, /* yes, there really is movsww ! */
252b5132 2314 /* c0 */
bf890a93
IT
2315 { "xaddB", { Ebh1, Gb }, 0 },
2316 { "xaddS", { Evh1, Gv }, 0 },
1ceb70f8 2317 { PREFIX_TABLE (PREFIX_0FC2) },
a8484f96 2318 { MOD_TABLE (MOD_0FC3) },
507bd325
L
2319 { "pinsrw", { MX, Edqw, Ib }, PREFIX_OPCODE },
2320 { "pextrw", { Gdq, MS, Ib }, PREFIX_OPCODE },
2321 { "shufpX", { XM, EXx, Ib }, PREFIX_OPCODE },
1ceb70f8 2322 { REG_TABLE (REG_0FC7) },
252b5132 2323 /* c8 */
bf890a93
IT
2324 { "bswap", { RMeAX }, 0 },
2325 { "bswap", { RMeCX }, 0 },
2326 { "bswap", { RMeDX }, 0 },
2327 { "bswap", { RMeBX }, 0 },
2328 { "bswap", { RMeSP }, 0 },
2329 { "bswap", { RMeBP }, 0 },
2330 { "bswap", { RMeSI }, 0 },
2331 { "bswap", { RMeDI }, 0 },
252b5132 2332 /* d0 */
1ceb70f8 2333 { PREFIX_TABLE (PREFIX_0FD0) },
507bd325
L
2334 { "psrlw", { MX, EM }, PREFIX_OPCODE },
2335 { "psrld", { MX, EM }, PREFIX_OPCODE },
2336 { "psrlq", { MX, EM }, PREFIX_OPCODE },
2337 { "paddq", { MX, EM }, PREFIX_OPCODE },
2338 { "pmullw", { MX, EM }, PREFIX_OPCODE },
1ceb70f8 2339 { PREFIX_TABLE (PREFIX_0FD6) },
75c135a8 2340 { MOD_TABLE (MOD_0FD7) },
252b5132 2341 /* d8 */
507bd325
L
2342 { "psubusb", { MX, EM }, PREFIX_OPCODE },
2343 { "psubusw", { MX, EM }, PREFIX_OPCODE },
2344 { "pminub", { MX, EM }, PREFIX_OPCODE },
2345 { "pand", { MX, EM }, PREFIX_OPCODE },
2346 { "paddusb", { MX, EM }, PREFIX_OPCODE },
2347 { "paddusw", { MX, EM }, PREFIX_OPCODE },
2348 { "pmaxub", { MX, EM }, PREFIX_OPCODE },
2349 { "pandn", { MX, EM }, PREFIX_OPCODE },
252b5132 2350 /* e0 */
507bd325
L
2351 { "pavgb", { MX, EM }, PREFIX_OPCODE },
2352 { "psraw", { MX, EM }, PREFIX_OPCODE },
2353 { "psrad", { MX, EM }, PREFIX_OPCODE },
2354 { "pavgw", { MX, EM }, PREFIX_OPCODE },
2355 { "pmulhuw", { MX, EM }, PREFIX_OPCODE },
2356 { "pmulhw", { MX, EM }, PREFIX_OPCODE },
1ceb70f8
L
2357 { PREFIX_TABLE (PREFIX_0FE6) },
2358 { PREFIX_TABLE (PREFIX_0FE7) },
252b5132 2359 /* e8 */
507bd325
L
2360 { "psubsb", { MX, EM }, PREFIX_OPCODE },
2361 { "psubsw", { MX, EM }, PREFIX_OPCODE },
2362 { "pminsw", { MX, EM }, PREFIX_OPCODE },
2363 { "por", { MX, EM }, PREFIX_OPCODE },
2364 { "paddsb", { MX, EM }, PREFIX_OPCODE },
2365 { "paddsw", { MX, EM }, PREFIX_OPCODE },
2366 { "pmaxsw", { MX, EM }, PREFIX_OPCODE },
2367 { "pxor", { MX, EM }, PREFIX_OPCODE },
252b5132 2368 /* f0 */
1ceb70f8 2369 { PREFIX_TABLE (PREFIX_0FF0) },
507bd325
L
2370 { "psllw", { MX, EM }, PREFIX_OPCODE },
2371 { "pslld", { MX, EM }, PREFIX_OPCODE },
2372 { "psllq", { MX, EM }, PREFIX_OPCODE },
2373 { "pmuludq", { MX, EM }, PREFIX_OPCODE },
2374 { "pmaddwd", { MX, EM }, PREFIX_OPCODE },
2375 { "psadbw", { MX, EM }, PREFIX_OPCODE },
1ceb70f8 2376 { PREFIX_TABLE (PREFIX_0FF7) },
252b5132 2377 /* f8 */
507bd325
L
2378 { "psubb", { MX, EM }, PREFIX_OPCODE },
2379 { "psubw", { MX, EM }, PREFIX_OPCODE },
2380 { "psubd", { MX, EM }, PREFIX_OPCODE },
2381 { "psubq", { MX, EM }, PREFIX_OPCODE },
2382 { "paddb", { MX, EM }, PREFIX_OPCODE },
2383 { "paddw", { MX, EM }, PREFIX_OPCODE },
2384 { "paddd", { MX, EM }, PREFIX_OPCODE },
66f1eba0 2385 { "ud0S", { Gv, Ev }, 0 },
252b5132
RH
2386};
2387
2388static const unsigned char onebyte_has_modrm[256] = {
c608c12e
AM
2389 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2390 /* ------------------------------- */
2391 /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
2392 /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
2393 /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
2394 /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
2395 /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
2396 /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
2397 /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
2398 /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
2399 /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
2400 /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
2401 /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
2402 /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
2403 /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
2404 /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
2405 /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
2406 /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1 /* f0 */
2407 /* ------------------------------- */
2408 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
252b5132
RH
2409};
2410
2411static const unsigned char twobyte_has_modrm[256] = {
c608c12e
AM
2412 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2413 /* ------------------------------- */
252b5132 2414 /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
b5b1fc4f 2415 /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
85f10a01 2416 /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
331d2d0d 2417 /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
252b5132 2418 /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
4bba6815
AM
2419 /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
2420 /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
85f10a01 2421 /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
252b5132
RH
2422 /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
2423 /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
30d1c836 2424 /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
66f1eba0 2425 /* b0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* bf */
252b5132 2426 /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
ca164297 2427 /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
4bba6815 2428 /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
66f1eba0 2429 /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 /* ff */
c608c12e
AM
2430 /* ------------------------------- */
2431 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2432};
2433
252b5132
RH
2434static char obuf[100];
2435static char *obufp;
ea397f5b 2436static char *mnemonicendp;
252b5132
RH
2437static char scratchbuf[100];
2438static unsigned char *start_codep;
2439static unsigned char *insn_codep;
2440static unsigned char *codep;
285ca992 2441static unsigned char *end_codep;
f16cd0d5
L
2442static int last_lock_prefix;
2443static int last_repz_prefix;
2444static int last_repnz_prefix;
2445static int last_data_prefix;
2446static int last_addr_prefix;
2447static int last_rex_prefix;
2448static int last_seg_prefix;
d9949a36 2449static int fwait_prefix;
285ca992
L
2450/* The active segment register prefix. */
2451static int active_seg_prefix;
f16cd0d5
L
2452#define MAX_CODE_LENGTH 15
2453/* We can up to 14 prefixes since the maximum instruction length is
2454 15bytes. */
2455static int all_prefixes[MAX_CODE_LENGTH - 1];
252b5132 2456static disassemble_info *the_info;
7967e09e
L
2457static struct
2458 {
2459 int mod;
7967e09e 2460 int reg;
484c222e 2461 int rm;
7967e09e
L
2462 }
2463modrm;
4bba6815 2464static unsigned char need_modrm;
dfc8cf43
L
2465static struct
2466 {
2467 int scale;
2468 int index;
2469 int base;
2470 }
2471sib;
c0f3af97
L
2472static struct
2473 {
2474 int register_specifier;
2475 int length;
2476 int prefix;
2477 int w;
43234a1e
L
2478 int evex;
2479 int r;
2480 int v;
2481 int mask_register_specifier;
2482 int zeroing;
2483 int ll;
2484 int b;
c0f3af97
L
2485 }
2486vex;
2487static unsigned char need_vex;
252b5132 2488
ea397f5b
L
2489struct op
2490 {
2491 const char *name;
2492 unsigned int len;
2493 };
2494
4bba6815
AM
2495/* If we are accessing mod/rm/reg without need_modrm set, then the
2496 values are stale. Hitting this abort likely indicates that you
2497 need to update onebyte_has_modrm or twobyte_has_modrm. */
2498#define MODRM_CHECK if (!need_modrm) abort ()
2499
d708bcba
AM
2500static const char **names64;
2501static const char **names32;
2502static const char **names16;
2503static const char **names8;
2504static const char **names8rex;
2505static const char **names_seg;
db51cc60
L
2506static const char *index64;
2507static const char *index32;
d708bcba 2508static const char **index16;
7e8b059b 2509static const char **names_bnd;
d708bcba
AM
2510
2511static const char *intel_names64[] = {
2512 "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
2513 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2514};
2515static const char *intel_names32[] = {
2516 "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
2517 "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
2518};
2519static const char *intel_names16[] = {
2520 "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
2521 "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
2522};
2523static const char *intel_names8[] = {
2524 "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
2525};
2526static const char *intel_names8rex[] = {
2527 "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
2528 "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
2529};
2530static const char *intel_names_seg[] = {
2531 "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
2532};
db51cc60
L
2533static const char *intel_index64 = "riz";
2534static const char *intel_index32 = "eiz";
d708bcba
AM
2535static const char *intel_index16[] = {
2536 "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
2537};
2538
2539static const char *att_names64[] = {
2540 "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
52b15da3
JH
2541 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
2542};
d708bcba
AM
2543static const char *att_names32[] = {
2544 "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
52b15da3 2545 "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
252b5132 2546};
d708bcba
AM
2547static const char *att_names16[] = {
2548 "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
52b15da3 2549 "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
252b5132 2550};
d708bcba
AM
2551static const char *att_names8[] = {
2552 "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
252b5132 2553};
d708bcba
AM
2554static const char *att_names8rex[] = {
2555 "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
52b15da3
JH
2556 "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
2557};
d708bcba
AM
2558static const char *att_names_seg[] = {
2559 "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
252b5132 2560};
db51cc60
L
2561static const char *att_index64 = "%riz";
2562static const char *att_index32 = "%eiz";
d708bcba
AM
2563static const char *att_index16[] = {
2564 "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
252b5132
RH
2565};
2566
b9733481
L
2567static const char **names_mm;
2568static const char *intel_names_mm[] = {
2569 "mm0", "mm1", "mm2", "mm3",
2570 "mm4", "mm5", "mm6", "mm7"
2571};
2572static const char *att_names_mm[] = {
2573 "%mm0", "%mm1", "%mm2", "%mm3",
2574 "%mm4", "%mm5", "%mm6", "%mm7"
2575};
2576
7e8b059b
L
2577static const char *intel_names_bnd[] = {
2578 "bnd0", "bnd1", "bnd2", "bnd3"
2579};
2580
2581static const char *att_names_bnd[] = {
2582 "%bnd0", "%bnd1", "%bnd2", "%bnd3"
2583};
2584
b9733481
L
2585static const char **names_xmm;
2586static const char *intel_names_xmm[] = {
2587 "xmm0", "xmm1", "xmm2", "xmm3",
2588 "xmm4", "xmm5", "xmm6", "xmm7",
2589 "xmm8", "xmm9", "xmm10", "xmm11",
43234a1e
L
2590 "xmm12", "xmm13", "xmm14", "xmm15",
2591 "xmm16", "xmm17", "xmm18", "xmm19",
2592 "xmm20", "xmm21", "xmm22", "xmm23",
2593 "xmm24", "xmm25", "xmm26", "xmm27",
2594 "xmm28", "xmm29", "xmm30", "xmm31"
b9733481
L
2595};
2596static const char *att_names_xmm[] = {
2597 "%xmm0", "%xmm1", "%xmm2", "%xmm3",
2598 "%xmm4", "%xmm5", "%xmm6", "%xmm7",
2599 "%xmm8", "%xmm9", "%xmm10", "%xmm11",
43234a1e
L
2600 "%xmm12", "%xmm13", "%xmm14", "%xmm15",
2601 "%xmm16", "%xmm17", "%xmm18", "%xmm19",
2602 "%xmm20", "%xmm21", "%xmm22", "%xmm23",
2603 "%xmm24", "%xmm25", "%xmm26", "%xmm27",
2604 "%xmm28", "%xmm29", "%xmm30", "%xmm31"
b9733481
L
2605};
2606
2607static const char **names_ymm;
2608static const char *intel_names_ymm[] = {
2609 "ymm0", "ymm1", "ymm2", "ymm3",
2610 "ymm4", "ymm5", "ymm6", "ymm7",
2611 "ymm8", "ymm9", "ymm10", "ymm11",
43234a1e
L
2612 "ymm12", "ymm13", "ymm14", "ymm15",
2613 "ymm16", "ymm17", "ymm18", "ymm19",
2614 "ymm20", "ymm21", "ymm22", "ymm23",
2615 "ymm24", "ymm25", "ymm26", "ymm27",
2616 "ymm28", "ymm29", "ymm30", "ymm31"
b9733481
L
2617};
2618static const char *att_names_ymm[] = {
2619 "%ymm0", "%ymm1", "%ymm2", "%ymm3",
2620 "%ymm4", "%ymm5", "%ymm6", "%ymm7",
2621 "%ymm8", "%ymm9", "%ymm10", "%ymm11",
43234a1e
L
2622 "%ymm12", "%ymm13", "%ymm14", "%ymm15",
2623 "%ymm16", "%ymm17", "%ymm18", "%ymm19",
2624 "%ymm20", "%ymm21", "%ymm22", "%ymm23",
2625 "%ymm24", "%ymm25", "%ymm26", "%ymm27",
2626 "%ymm28", "%ymm29", "%ymm30", "%ymm31"
2627};
2628
2629static const char **names_zmm;
2630static const char *intel_names_zmm[] = {
2631 "zmm0", "zmm1", "zmm2", "zmm3",
2632 "zmm4", "zmm5", "zmm6", "zmm7",
2633 "zmm8", "zmm9", "zmm10", "zmm11",
2634 "zmm12", "zmm13", "zmm14", "zmm15",
2635 "zmm16", "zmm17", "zmm18", "zmm19",
2636 "zmm20", "zmm21", "zmm22", "zmm23",
2637 "zmm24", "zmm25", "zmm26", "zmm27",
2638 "zmm28", "zmm29", "zmm30", "zmm31"
2639};
2640static const char *att_names_zmm[] = {
2641 "%zmm0", "%zmm1", "%zmm2", "%zmm3",
2642 "%zmm4", "%zmm5", "%zmm6", "%zmm7",
2643 "%zmm8", "%zmm9", "%zmm10", "%zmm11",
2644 "%zmm12", "%zmm13", "%zmm14", "%zmm15",
2645 "%zmm16", "%zmm17", "%zmm18", "%zmm19",
2646 "%zmm20", "%zmm21", "%zmm22", "%zmm23",
2647 "%zmm24", "%zmm25", "%zmm26", "%zmm27",
2648 "%zmm28", "%zmm29", "%zmm30", "%zmm31"
2649};
2650
260cd341
LC
2651static const char **names_tmm;
2652static const char *intel_names_tmm[] = {
2653 "tmm0", "tmm1", "tmm2", "tmm3",
2654 "tmm4", "tmm5", "tmm6", "tmm7"
2655};
2656static const char *att_names_tmm[] = {
2657 "%tmm0", "%tmm1", "%tmm2", "%tmm3",
2658 "%tmm4", "%tmm5", "%tmm6", "%tmm7"
2659};
2660
43234a1e
L
2661static const char **names_mask;
2662static const char *intel_names_mask[] = {
2663 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7"
2664};
2665static const char *att_names_mask[] = {
2666 "%k0", "%k1", "%k2", "%k3", "%k4", "%k5", "%k6", "%k7"
2667};
2668
2669static const char *names_rounding[] =
2670{
2671 "{rn-sae}",
2672 "{rd-sae}",
2673 "{ru-sae}",
2674 "{rz-sae}"
b9733481
L
2675};
2676
1ceb70f8
L
2677static const struct dis386 reg_table[][8] = {
2678 /* REG_80 */
252b5132 2679 {
bf890a93
IT
2680 { "addA", { Ebh1, Ib }, 0 },
2681 { "orA", { Ebh1, Ib }, 0 },
2682 { "adcA", { Ebh1, Ib }, 0 },
2683 { "sbbA", { Ebh1, Ib }, 0 },
2684 { "andA", { Ebh1, Ib }, 0 },
2685 { "subA", { Ebh1, Ib }, 0 },
2686 { "xorA", { Ebh1, Ib }, 0 },
2687 { "cmpA", { Eb, Ib }, 0 },
252b5132 2688 },
1ceb70f8 2689 /* REG_81 */
252b5132 2690 {
bf890a93
IT
2691 { "addQ", { Evh1, Iv }, 0 },
2692 { "orQ", { Evh1, Iv }, 0 },
2693 { "adcQ", { Evh1, Iv }, 0 },
2694 { "sbbQ", { Evh1, Iv }, 0 },
2695 { "andQ", { Evh1, Iv }, 0 },
2696 { "subQ", { Evh1, Iv }, 0 },
2697 { "xorQ", { Evh1, Iv }, 0 },
2698 { "cmpQ", { Ev, Iv }, 0 },
252b5132 2699 },
7148c369 2700 /* REG_83 */
252b5132 2701 {
bf890a93
IT
2702 { "addQ", { Evh1, sIb }, 0 },
2703 { "orQ", { Evh1, sIb }, 0 },
2704 { "adcQ", { Evh1, sIb }, 0 },
2705 { "sbbQ", { Evh1, sIb }, 0 },
2706 { "andQ", { Evh1, sIb }, 0 },
2707 { "subQ", { Evh1, sIb }, 0 },
2708 { "xorQ", { Evh1, sIb }, 0 },
2709 { "cmpQ", { Ev, sIb }, 0 },
252b5132 2710 },
1ceb70f8 2711 /* REG_8F */
4e7d34a6 2712 {
36938cab 2713 { "pop{P|}", { stackEv }, 0 },
c48244a5 2714 { XOP_8F_TABLE (XOP_09) },
592d1631
L
2715 { Bad_Opcode },
2716 { Bad_Opcode },
2717 { Bad_Opcode },
f88c9eb0 2718 { XOP_8F_TABLE (XOP_09) },
4e7d34a6 2719 },
1ceb70f8 2720 /* REG_C0 */
252b5132 2721 {
bf890a93
IT
2722 { "rolA", { Eb, Ib }, 0 },
2723 { "rorA", { Eb, Ib }, 0 },
2724 { "rclA", { Eb, Ib }, 0 },
2725 { "rcrA", { Eb, Ib }, 0 },
2726 { "shlA", { Eb, Ib }, 0 },
2727 { "shrA", { Eb, Ib }, 0 },
e4bdd679 2728 { "shlA", { Eb, Ib }, 0 },
bf890a93 2729 { "sarA", { Eb, Ib }, 0 },
252b5132 2730 },
1ceb70f8 2731 /* REG_C1 */
252b5132 2732 {
bf890a93
IT
2733 { "rolQ", { Ev, Ib }, 0 },
2734 { "rorQ", { Ev, Ib }, 0 },
2735 { "rclQ", { Ev, Ib }, 0 },
2736 { "rcrQ", { Ev, Ib }, 0 },
2737 { "shlQ", { Ev, Ib }, 0 },
2738 { "shrQ", { Ev, Ib }, 0 },
e4bdd679 2739 { "shlQ", { Ev, Ib }, 0 },
bf890a93 2740 { "sarQ", { Ev, Ib }, 0 },
252b5132 2741 },
1ceb70f8 2742 /* REG_C6 */
4e7d34a6 2743 {
bf890a93 2744 { "movA", { Ebh3, Ib }, 0 },
42164a71
L
2745 { Bad_Opcode },
2746 { Bad_Opcode },
2747 { Bad_Opcode },
2748 { Bad_Opcode },
2749 { Bad_Opcode },
2750 { Bad_Opcode },
2751 { MOD_TABLE (MOD_C6_REG_7) },
4e7d34a6 2752 },
1ceb70f8 2753 /* REG_C7 */
4e7d34a6 2754 {
bf890a93 2755 { "movQ", { Evh3, Iv }, 0 },
42164a71
L
2756 { Bad_Opcode },
2757 { Bad_Opcode },
2758 { Bad_Opcode },
2759 { Bad_Opcode },
2760 { Bad_Opcode },
2761 { Bad_Opcode },
2762 { MOD_TABLE (MOD_C7_REG_7) },
4e7d34a6 2763 },
1ceb70f8 2764 /* REG_D0 */
252b5132 2765 {
bf890a93
IT
2766 { "rolA", { Eb, I1 }, 0 },
2767 { "rorA", { Eb, I1 }, 0 },
2768 { "rclA", { Eb, I1 }, 0 },
2769 { "rcrA", { Eb, I1 }, 0 },
2770 { "shlA", { Eb, I1 }, 0 },
2771 { "shrA", { Eb, I1 }, 0 },
e4bdd679 2772 { "shlA", { Eb, I1 }, 0 },
bf890a93 2773 { "sarA", { Eb, I1 }, 0 },
252b5132 2774 },
1ceb70f8 2775 /* REG_D1 */
252b5132 2776 {
bf890a93
IT
2777 { "rolQ", { Ev, I1 }, 0 },
2778 { "rorQ", { Ev, I1 }, 0 },
2779 { "rclQ", { Ev, I1 }, 0 },
2780 { "rcrQ", { Ev, I1 }, 0 },
2781 { "shlQ", { Ev, I1 }, 0 },
2782 { "shrQ", { Ev, I1 }, 0 },
e4bdd679 2783 { "shlQ", { Ev, I1 }, 0 },
bf890a93 2784 { "sarQ", { Ev, I1 }, 0 },
252b5132 2785 },
1ceb70f8 2786 /* REG_D2 */
252b5132 2787 {
bf890a93
IT
2788 { "rolA", { Eb, CL }, 0 },
2789 { "rorA", { Eb, CL }, 0 },
2790 { "rclA", { Eb, CL }, 0 },
2791 { "rcrA", { Eb, CL }, 0 },
2792 { "shlA", { Eb, CL }, 0 },
2793 { "shrA", { Eb, CL }, 0 },
e4bdd679 2794 { "shlA", { Eb, CL }, 0 },
bf890a93 2795 { "sarA", { Eb, CL }, 0 },
252b5132 2796 },
1ceb70f8 2797 /* REG_D3 */
252b5132 2798 {
bf890a93
IT
2799 { "rolQ", { Ev, CL }, 0 },
2800 { "rorQ", { Ev, CL }, 0 },
2801 { "rclQ", { Ev, CL }, 0 },
2802 { "rcrQ", { Ev, CL }, 0 },
2803 { "shlQ", { Ev, CL }, 0 },
2804 { "shrQ", { Ev, CL }, 0 },
e4bdd679 2805 { "shlQ", { Ev, CL }, 0 },
bf890a93 2806 { "sarQ", { Ev, CL }, 0 },
252b5132 2807 },
1ceb70f8 2808 /* REG_F6 */
252b5132 2809 {
bf890a93 2810 { "testA", { Eb, Ib }, 0 },
7db2c588 2811 { "testA", { Eb, Ib }, 0 },
bf890a93
IT
2812 { "notA", { Ebh1 }, 0 },
2813 { "negA", { Ebh1 }, 0 },
2814 { "mulA", { Eb }, 0 }, /* Don't print the implicit %al register, */
2815 { "imulA", { Eb }, 0 }, /* to distinguish these opcodes from other */
2816 { "divA", { Eb }, 0 }, /* mul/imul opcodes. Do the same for div */
2817 { "idivA", { Eb }, 0 }, /* and idiv for consistency. */
252b5132 2818 },
1ceb70f8 2819 /* REG_F7 */
252b5132 2820 {
bf890a93 2821 { "testQ", { Ev, Iv }, 0 },
7db2c588 2822 { "testQ", { Ev, Iv }, 0 },
bf890a93
IT
2823 { "notQ", { Evh1 }, 0 },
2824 { "negQ", { Evh1 }, 0 },
2825 { "mulQ", { Ev }, 0 }, /* Don't print the implicit register. */
2826 { "imulQ", { Ev }, 0 },
2827 { "divQ", { Ev }, 0 },
2828 { "idivQ", { Ev }, 0 },
252b5132 2829 },
1ceb70f8 2830 /* REG_FE */
252b5132 2831 {
bf890a93
IT
2832 { "incA", { Ebh1 }, 0 },
2833 { "decA", { Ebh1 }, 0 },
252b5132 2834 },
1ceb70f8 2835 /* REG_FF */
252b5132 2836 {
bf890a93
IT
2837 { "incQ", { Evh1 }, 0 },
2838 { "decQ", { Evh1 }, 0 },
36938cab 2839 { "call{@|}", { NOTRACK, indirEv, BND }, 0 },
4a357820 2840 { MOD_TABLE (MOD_FF_REG_3) },
36938cab 2841 { "jmp{@|}", { NOTRACK, indirEv, BND }, 0 },
4a357820 2842 { MOD_TABLE (MOD_FF_REG_5) },
36938cab 2843 { "push{P|}", { stackEv }, 0 },
592d1631 2844 { Bad_Opcode },
252b5132 2845 },
1ceb70f8 2846 /* REG_0F00 */
252b5132 2847 {
bf890a93
IT
2848 { "sldtD", { Sv }, 0 },
2849 { "strD", { Sv }, 0 },
2850 { "lldt", { Ew }, 0 },
2851 { "ltr", { Ew }, 0 },
2852 { "verr", { Ew }, 0 },
2853 { "verw", { Ew }, 0 },
592d1631
L
2854 { Bad_Opcode },
2855 { Bad_Opcode },
252b5132 2856 },
1ceb70f8 2857 /* REG_0F01 */
252b5132 2858 {
1ceb70f8
L
2859 { MOD_TABLE (MOD_0F01_REG_0) },
2860 { MOD_TABLE (MOD_0F01_REG_1) },
2861 { MOD_TABLE (MOD_0F01_REG_2) },
2862 { MOD_TABLE (MOD_0F01_REG_3) },
bf890a93 2863 { "smswD", { Sv }, 0 },
8eab4136 2864 { MOD_TABLE (MOD_0F01_REG_5) },
bf890a93 2865 { "lmsw", { Ew }, 0 },
1ceb70f8 2866 { MOD_TABLE (MOD_0F01_REG_7) },
252b5132 2867 },
b5b1fc4f 2868 /* REG_0F0D */
252b5132 2869 {
bf890a93
IT
2870 { "prefetch", { Mb }, 0 },
2871 { "prefetchw", { Mb }, 0 },
2872 { "prefetchwt1", { Mb }, 0 },
2873 { "prefetch", { Mb }, 0 },
2874 { "prefetch", { Mb }, 0 },
2875 { "prefetch", { Mb }, 0 },
2876 { "prefetch", { Mb }, 0 },
2877 { "prefetch", { Mb }, 0 },
252b5132 2878 },
1ceb70f8 2879 /* REG_0F18 */
252b5132 2880 {
1ceb70f8
L
2881 { MOD_TABLE (MOD_0F18_REG_0) },
2882 { MOD_TABLE (MOD_0F18_REG_1) },
2883 { MOD_TABLE (MOD_0F18_REG_2) },
2884 { MOD_TABLE (MOD_0F18_REG_3) },
31941983
JB
2885 { "nopQ", { Ev }, 0 },
2886 { "nopQ", { Ev }, 0 },
2887 { "nopQ", { Ev }, 0 },
2888 { "nopQ", { Ev }, 0 },
252b5132 2889 },
f8687e93 2890 /* REG_0F1C_P_0_MOD_0 */
c48935d7
IT
2891 {
2892 { "cldemote", { Mb }, 0 },
2893 { "nopQ", { Ev }, 0 },
2894 { "nopQ", { Ev }, 0 },
2895 { "nopQ", { Ev }, 0 },
2896 { "nopQ", { Ev }, 0 },
2897 { "nopQ", { Ev }, 0 },
2898 { "nopQ", { Ev }, 0 },
2899 { "nopQ", { Ev }, 0 },
2900 },
f8687e93 2901 /* REG_0F1E_P_1_MOD_3 */
603555e5 2902 {
31941983
JB
2903 { "nopQ", { Ev }, PREFIX_IGNORED },
2904 { "rdsspK", { Edq }, 0 },
2905 { "nopQ", { Ev }, PREFIX_IGNORED },
2906 { "nopQ", { Ev }, PREFIX_IGNORED },
2907 { "nopQ", { Ev }, PREFIX_IGNORED },
2908 { "nopQ", { Ev }, PREFIX_IGNORED },
2909 { "nopQ", { Ev }, PREFIX_IGNORED },
f8687e93 2910 { RM_TABLE (RM_0F1E_P_1_MOD_3_REG_7) },
603555e5 2911 },
c4694f17
TG
2912 /* REG_0F38D8_PREFIX_1 */
2913 {
2914 { "aesencwide128kl", { M }, 0 },
2915 { "aesdecwide128kl", { M }, 0 },
2916 { "aesencwide256kl", { M }, 0 },
2917 { "aesdecwide256kl", { M }, 0 },
2918 },
c1fa250a
LC
2919 /* REG_0F3A0F_PREFIX_1_MOD_3 */
2920 {
2921 { RM_TABLE (RM_0F3A0F_P_1_MOD_3_REG_0) },
2922 },
00ec1875 2923 /* REG_0F71_MOD_0 */
a6bd098c 2924 {
592d1631
L
2925 { Bad_Opcode },
2926 { Bad_Opcode },
00ec1875 2927 { "psrlw", { MS, Ib }, PREFIX_OPCODE },
592d1631 2928 { Bad_Opcode },
00ec1875 2929 { "psraw", { MS, Ib }, PREFIX_OPCODE },
592d1631 2930 { Bad_Opcode },
00ec1875 2931 { "psllw", { MS, Ib }, PREFIX_OPCODE },
a6bd098c 2932 },
00ec1875 2933 /* REG_0F72_MOD_0 */
a6bd098c 2934 {
592d1631
L
2935 { Bad_Opcode },
2936 { Bad_Opcode },
00ec1875 2937 { "psrld", { MS, Ib }, PREFIX_OPCODE },
592d1631 2938 { Bad_Opcode },
00ec1875 2939 { "psrad", { MS, Ib }, PREFIX_OPCODE },
592d1631 2940 { Bad_Opcode },
00ec1875 2941 { "pslld", { MS, Ib }, PREFIX_OPCODE },
a6bd098c 2942 },
00ec1875 2943 /* REG_0F73_MOD_0 */
252b5132 2944 {
592d1631
L
2945 { Bad_Opcode },
2946 { Bad_Opcode },
00ec1875
JB
2947 { "psrlq", { MS, Ib }, PREFIX_OPCODE },
2948 { "psrldq", { XS, Ib }, PREFIX_DATA },
592d1631
L
2949 { Bad_Opcode },
2950 { Bad_Opcode },
00ec1875
JB
2951 { "psllq", { MS, Ib }, PREFIX_OPCODE },
2952 { "pslldq", { XS, Ib }, PREFIX_DATA },
252b5132 2953 },
1ceb70f8 2954 /* REG_0FA6 */
252b5132 2955 {
bf890a93
IT
2956 { "montmul", { { OP_0f07, 0 } }, 0 },
2957 { "xsha1", { { OP_0f07, 0 } }, 0 },
2958 { "xsha256", { { OP_0f07, 0 } }, 0 },
4e7d34a6 2959 },
1ceb70f8 2960 /* REG_0FA7 */
4e7d34a6 2961 {
bf890a93
IT
2962 { "xstore-rng", { { OP_0f07, 0 } }, 0 },
2963 { "xcrypt-ecb", { { OP_0f07, 0 } }, 0 },
2964 { "xcrypt-cbc", { { OP_0f07, 0 } }, 0 },
2965 { "xcrypt-ctr", { { OP_0f07, 0 } }, 0 },
2966 { "xcrypt-cfb", { { OP_0f07, 0 } }, 0 },
2967 { "xcrypt-ofb", { { OP_0f07, 0 } }, 0 },
4e7d34a6 2968 },
1ceb70f8 2969 /* REG_0FAE */
4e7d34a6 2970 {
1ceb70f8
L
2971 { MOD_TABLE (MOD_0FAE_REG_0) },
2972 { MOD_TABLE (MOD_0FAE_REG_1) },
2973 { MOD_TABLE (MOD_0FAE_REG_2) },
2974 { MOD_TABLE (MOD_0FAE_REG_3) },
475a2301 2975 { MOD_TABLE (MOD_0FAE_REG_4) },
1ceb70f8
L
2976 { MOD_TABLE (MOD_0FAE_REG_5) },
2977 { MOD_TABLE (MOD_0FAE_REG_6) },
2978 { MOD_TABLE (MOD_0FAE_REG_7) },
252b5132 2979 },
1ceb70f8 2980 /* REG_0FBA */
252b5132 2981 {
592d1631
L
2982 { Bad_Opcode },
2983 { Bad_Opcode },
2984 { Bad_Opcode },
2985 { Bad_Opcode },
bf890a93
IT
2986 { "btQ", { Ev, Ib }, 0 },
2987 { "btsQ", { Evh1, Ib }, 0 },
2988 { "btrQ", { Evh1, Ib }, 0 },
2989 { "btcQ", { Evh1, Ib }, 0 },
c608c12e 2990 },
1ceb70f8 2991 /* REG_0FC7 */
c608c12e 2992 {
592d1631 2993 { Bad_Opcode },
bf890a93 2994 { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } }, 0 },
592d1631 2995 { Bad_Opcode },
963f3586
IT
2996 { MOD_TABLE (MOD_0FC7_REG_3) },
2997 { MOD_TABLE (MOD_0FC7_REG_4) },
2998 { MOD_TABLE (MOD_0FC7_REG_5) },
1ceb70f8
L
2999 { MOD_TABLE (MOD_0FC7_REG_6) },
3000 { MOD_TABLE (MOD_0FC7_REG_7) },
252b5132 3001 },
14d10c6c 3002 /* REG_VEX_0F71_M_0 */
c0f3af97 3003 {
592d1631
L
3004 { Bad_Opcode },
3005 { Bad_Opcode },
14d10c6c 3006 { "vpsrlw", { Vex, XS, Ib }, PREFIX_DATA },
592d1631 3007 { Bad_Opcode },
14d10c6c 3008 { "vpsraw", { Vex, XS, Ib }, PREFIX_DATA },
592d1631 3009 { Bad_Opcode },
14d10c6c 3010 { "vpsllw", { Vex, XS, Ib }, PREFIX_DATA },
c0f3af97 3011 },
14d10c6c 3012 /* REG_VEX_0F72_M_0 */
c0f3af97 3013 {
592d1631
L
3014 { Bad_Opcode },
3015 { Bad_Opcode },
14d10c6c 3016 { "vpsrld", { Vex, XS, Ib }, PREFIX_DATA },
592d1631 3017 { Bad_Opcode },
14d10c6c 3018 { "vpsrad", { Vex, XS, Ib }, PREFIX_DATA },
592d1631 3019 { Bad_Opcode },
14d10c6c 3020 { "vpslld", { Vex, XS, Ib }, PREFIX_DATA },
c0f3af97 3021 },
14d10c6c 3022 /* REG_VEX_0F73_M_0 */
c0f3af97 3023 {
592d1631
L
3024 { Bad_Opcode },
3025 { Bad_Opcode },
14d10c6c
JB
3026 { "vpsrlq", { Vex, XS, Ib }, PREFIX_DATA },
3027 { "vpsrldq", { Vex, XS, Ib }, PREFIX_DATA },
592d1631
L
3028 { Bad_Opcode },
3029 { Bad_Opcode },
14d10c6c
JB
3030 { "vpsllq", { Vex, XS, Ib }, PREFIX_DATA },
3031 { "vpslldq", { Vex, XS, Ib }, PREFIX_DATA },
c0f3af97 3032 },
592a252b 3033 /* REG_VEX_0FAE */
c0f3af97 3034 {
592d1631
L
3035 { Bad_Opcode },
3036 { Bad_Opcode },
592a252b
L
3037 { MOD_TABLE (MOD_VEX_0FAE_REG_2) },
3038 { MOD_TABLE (MOD_VEX_0FAE_REG_3) },
c0f3af97 3039 },
260cd341
LC
3040 /* REG_VEX_0F3849_X86_64_P_0_W_0_M_1 */
3041 {
3042 { RM_TABLE (RM_VEX_0F3849_X86_64_P_0_W_0_M_1_R_0) },
3043 },
14d10c6c 3044 /* REG_VEX_0F38F3_L_0 */
f12dc422
L
3045 {
3046 { Bad_Opcode },
14d10c6c
JB
3047 { "blsrS", { VexGdq, Edq }, PREFIX_OPCODE },
3048 { "blsmskS", { VexGdq, Edq }, PREFIX_OPCODE },
3049 { "blsiS", { VexGdq, Edq }, PREFIX_OPCODE },
f12dc422 3050 },
467bbef0 3051 /* REG_0FXOP_09_01_L_0 */
2a2a0f38
QN
3052 {
3053 { Bad_Opcode },
467bbef0
JB
3054 { "blcfill", { VexGdq, Edq }, 0 },
3055 { "blsfill", { VexGdq, Edq }, 0 },
3056 { "blcs", { VexGdq, Edq }, 0 },
3057 { "tzmsk", { VexGdq, Edq }, 0 },
3058 { "blcic", { VexGdq, Edq }, 0 },
3059 { "blsic", { VexGdq, Edq }, 0 },
3060 { "t1mskc", { VexGdq, Edq }, 0 },
2a2a0f38 3061 },
467bbef0 3062 /* REG_0FXOP_09_02_L_0 */
2a2a0f38
QN
3063 {
3064 { Bad_Opcode },
467bbef0 3065 { "blcmsk", { VexGdq, Edq }, 0 },
2a2a0f38
QN
3066 { Bad_Opcode },
3067 { Bad_Opcode },
3068 { Bad_Opcode },
3069 { Bad_Opcode },
467bbef0
JB
3070 { "blci", { VexGdq, Edq }, 0 },
3071 },
3072 /* REG_0FXOP_09_12_M_1_L_0 */
3073 {
3074 { "llwpcb", { Edq }, 0 },
3075 { "slwpcb", { Edq }, 0 },
3076 },
3077 /* REG_0FXOP_0A_12_L_0 */
3078 {
3079 { "lwpins", { VexGdq, Ed, Id }, 0 },
3080 { "lwpval", { VexGdq, Ed, Id }, 0 },
2a2a0f38 3081 },
ad692897
L
3082
3083#include "i386-dis-evex-reg.h"
4e7d34a6
L
3084};
3085
1ceb70f8
L
3086static const struct dis386 prefix_table[][4] = {
3087 /* PREFIX_90 */
252b5132 3088 {
bf890a93
IT
3089 { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } }, 0 },
3090 { "pause", { XX }, 0 },
3091 { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } }, 0 },
507bd325 3092 { NULL, { { NULL, 0 } }, PREFIX_IGNORED }
0f10071e 3093 },
4e7d34a6 3094
81d54bb7
CL
3095 /* PREFIX_0F01_REG_1_RM_4 */
3096 {
3097 { Bad_Opcode },
3098 { Bad_Opcode },
3099 { "tdcall", { Skip_MODRM }, 0 },
3100 { Bad_Opcode },
3101 },
3102
3103 /* PREFIX_0F01_REG_1_RM_5 */
3104 {
3105 { Bad_Opcode },
3106 { Bad_Opcode },
3107 { X86_64_TABLE (X86_64_0F01_REG_1_RM_5_PREFIX_2) },
3108 { Bad_Opcode },
3109 },
3110
3111 /* PREFIX_0F01_REG_1_RM_6 */
3112 {
3113 { Bad_Opcode },
3114 { Bad_Opcode },
3115 { X86_64_TABLE (X86_64_0F01_REG_1_RM_6_PREFIX_2) },
3116 { Bad_Opcode },
3117 },
3118
3119 /* PREFIX_0F01_REG_1_RM_7 */
3120 {
3121 { "encls", { Skip_MODRM }, 0 },
3122 { Bad_Opcode },
3123 { X86_64_TABLE (X86_64_0F01_REG_1_RM_7_PREFIX_2) },
3124 { Bad_Opcode },
3125 },
3126
f9630fa6 3127 /* PREFIX_0F01_REG_3_RM_1 */
a847e322
JB
3128 {
3129 { "vmmcall", { Skip_MODRM }, 0 },
3130 { "vmgexit", { Skip_MODRM }, 0 },
d27c357a
JB
3131 { Bad_Opcode },
3132 { "vmgexit", { Skip_MODRM }, 0 },
a847e322
JB
3133 },
3134
f8687e93 3135 /* PREFIX_0F01_REG_5_MOD_0 */
603555e5
L
3136 {
3137 { Bad_Opcode },
3138 { "rstorssp", { Mq }, PREFIX_OPCODE },
3139 },
3140
f8687e93 3141 /* PREFIX_0F01_REG_5_MOD_3_RM_0 */
603555e5 3142 {
4b27d27c 3143 { "serialize", { Skip_MODRM }, PREFIX_OPCODE },
2234eee6 3144 { "setssbsy", { Skip_MODRM }, PREFIX_OPCODE },
bb651e8b 3145 { Bad_Opcode },
efe30057 3146 { "xsusldtrk", { Skip_MODRM }, PREFIX_OPCODE },
bb651e8b
CL
3147 },
3148
3149 /* PREFIX_0F01_REG_5_MOD_3_RM_1 */
3150 {
3151 { Bad_Opcode },
3152 { Bad_Opcode },
3153 { Bad_Opcode },
3154 { "xresldtrk", { Skip_MODRM }, PREFIX_OPCODE },
603555e5
L
3155 },
3156
f8687e93 3157 /* PREFIX_0F01_REG_5_MOD_3_RM_2 */
603555e5
L
3158 {
3159 { Bad_Opcode },
c2f76402 3160 { "saveprevssp", { Skip_MODRM }, PREFIX_OPCODE },
603555e5
L
3161 },
3162
f64c42a9
LC
3163 /* PREFIX_0F01_REG_5_MOD_3_RM_4 */
3164 {
3165 { Bad_Opcode },
3166 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1) },
3167 },
3168
3169 /* PREFIX_0F01_REG_5_MOD_3_RM_5 */
3170 {
3171 { Bad_Opcode },
3172 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1) },
3173 },
3174
3175 /* PREFIX_0F01_REG_5_MOD_3_RM_6 */
3176 {
3177 { "rdpkru", { Skip_MODRM }, 0 },
3178 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1) },
3179 },
3180
3181 /* PREFIX_0F01_REG_5_MOD_3_RM_7 */
3182 {
3183 { "wrpkru", { Skip_MODRM }, 0 },
3184 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1) },
3185 },
3186
267b8516
JB
3187 /* PREFIX_0F01_REG_7_MOD_3_RM_2 */
3188 {
3189 { "monitorx", { { OP_Monitor, 0 } }, 0 },
142861df 3190 { "mcommit", { Skip_MODRM }, 0 },
267b8516
JB
3191 },
3192
646cc3e0
GG
3193 /* PREFIX_0F01_REG_7_MOD_3_RM_6 */
3194 {
3195 { "invlpgb", { Skip_MODRM }, 0 },
3196 { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1) },
3197 { Bad_Opcode },
3198 { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3) },
3199 },
3200
3201 /* PREFIX_0F01_REG_7_MOD_3_RM_7 */
3202 {
3203 { "tlbsync", { Skip_MODRM }, 0 },
3204 { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1) },
3205 { Bad_Opcode },
3206 { "pvalidate", { Skip_MODRM }, 0 },
3207 },
3208
3233d7d0
IT
3209 /* PREFIX_0F09 */
3210 {
3211 { "wbinvd", { XX }, 0 },
3212 { "wbnoinvd", { XX }, 0 },
3213 },
3214
1ceb70f8 3215 /* PREFIX_0F10 */
cc0ec051 3216 {
507bd325
L
3217 { "movups", { XM, EXx }, PREFIX_OPCODE },
3218 { "movss", { XM, EXd }, PREFIX_OPCODE },
3219 { "movupd", { XM, EXx }, PREFIX_OPCODE },
3220 { "movsd", { XM, EXq }, PREFIX_OPCODE },
30d1c836 3221 },
4e7d34a6 3222
1ceb70f8 3223 /* PREFIX_0F11 */
30d1c836 3224 {
507bd325
L
3225 { "movups", { EXxS, XM }, PREFIX_OPCODE },
3226 { "movss", { EXdS, XM }, PREFIX_OPCODE },
3227 { "movupd", { EXxS, XM }, PREFIX_OPCODE },
3228 { "movsd", { EXqS, XM }, PREFIX_OPCODE },
4e7d34a6 3229 },
252b5132 3230
1ceb70f8 3231 /* PREFIX_0F12 */
c608c12e 3232 {
1ceb70f8 3233 { MOD_TABLE (MOD_0F12_PREFIX_0) },
507bd325 3234 { "movsldup", { XM, EXx }, PREFIX_OPCODE },
18897deb 3235 { MOD_TABLE (MOD_0F12_PREFIX_2) },
507bd325 3236 { "movddup", { XM, EXq }, PREFIX_OPCODE },
c608c12e 3237 },
4e7d34a6 3238
1ceb70f8 3239 /* PREFIX_0F16 */
c608c12e 3240 {
1ceb70f8 3241 { MOD_TABLE (MOD_0F16_PREFIX_0) },
507bd325 3242 { "movshdup", { XM, EXx }, PREFIX_OPCODE },
18897deb 3243 { MOD_TABLE (MOD_0F16_PREFIX_2) },
c608c12e 3244 },
4e7d34a6 3245
7e8b059b
L
3246 /* PREFIX_0F1A */
3247 {
3248 { MOD_TABLE (MOD_0F1A_PREFIX_0) },
bf890a93
IT
3249 { "bndcl", { Gbnd, Ev_bnd }, 0 },
3250 { "bndmov", { Gbnd, Ebnd }, 0 },
3251 { "bndcu", { Gbnd, Ev_bnd }, 0 },
7e8b059b
L
3252 },
3253
3254 /* PREFIX_0F1B */
3255 {
3256 { MOD_TABLE (MOD_0F1B_PREFIX_0) },
3257 { MOD_TABLE (MOD_0F1B_PREFIX_1) },
9f79e886 3258 { "bndmov", { EbndS, Gbnd }, 0 },
bf890a93 3259 { "bndcn", { Gbnd, Ev_bnd }, 0 },
7e8b059b
L
3260 },
3261
c48935d7
IT
3262 /* PREFIX_0F1C */
3263 {
3264 { MOD_TABLE (MOD_0F1C_PREFIX_0) },
31941983
JB
3265 { "nopQ", { Ev }, PREFIX_IGNORED },
3266 { "nopQ", { Ev }, 0 },
3267 { "nopQ", { Ev }, PREFIX_IGNORED },
c48935d7
IT
3268 },
3269
603555e5
L
3270 /* PREFIX_0F1E */
3271 {
31941983 3272 { "nopQ", { Ev }, 0 },
603555e5 3273 { MOD_TABLE (MOD_0F1E_PREFIX_1) },
31941983
JB
3274 { "nopQ", { Ev }, 0 },
3275 { NULL, { XX }, PREFIX_IGNORED },
603555e5
L
3276 },
3277
1ceb70f8 3278 /* PREFIX_0F2A */
c608c12e 3279 {
507bd325 3280 { "cvtpi2ps", { XM, EMCq }, PREFIX_OPCODE },
b24d668c 3281 { "cvtsi2ss{%LQ|}", { XM, Edq }, PREFIX_OPCODE },
507bd325 3282 { "cvtpi2pd", { XM, EMCq }, PREFIX_OPCODE },
b24d668c 3283 { "cvtsi2sd{%LQ|}", { XM, Edq }, 0 },
c608c12e 3284 },
4e7d34a6 3285
1ceb70f8 3286 /* PREFIX_0F2B */
c608c12e 3287 {
75c135a8
L
3288 { MOD_TABLE (MOD_0F2B_PREFIX_0) },
3289 { MOD_TABLE (MOD_0F2B_PREFIX_1) },
3290 { MOD_TABLE (MOD_0F2B_PREFIX_2) },
3291 { MOD_TABLE (MOD_0F2B_PREFIX_3) },
c608c12e 3292 },
4e7d34a6 3293
1ceb70f8 3294 /* PREFIX_0F2C */
c608c12e 3295 {
507bd325 3296 { "cvttps2pi", { MXC, EXq }, PREFIX_OPCODE },
e1a1babd 3297 { "cvttss2si", { Gdq, EXd }, PREFIX_OPCODE },
507bd325 3298 { "cvttpd2pi", { MXC, EXx }, PREFIX_OPCODE },
e1a1babd 3299 { "cvttsd2si", { Gdq, EXq }, PREFIX_OPCODE },
c608c12e 3300 },
4e7d34a6 3301
1ceb70f8 3302 /* PREFIX_0F2D */
c608c12e 3303 {
507bd325 3304 { "cvtps2pi", { MXC, EXq }, PREFIX_OPCODE },
e1a1babd 3305 { "cvtss2si", { Gdq, EXd }, PREFIX_OPCODE },
507bd325 3306 { "cvtpd2pi", { MXC, EXx }, PREFIX_OPCODE },
e1a1babd 3307 { "cvtsd2si", { Gdq, EXq }, PREFIX_OPCODE },
c608c12e 3308 },
4e7d34a6 3309
1ceb70f8 3310 /* PREFIX_0F2E */
c608c12e 3311 {
bf890a93 3312 { "ucomiss",{ XM, EXd }, 0 },
592d1631 3313 { Bad_Opcode },
bf890a93 3314 { "ucomisd",{ XM, EXq }, 0 },
c608c12e 3315 },
4e7d34a6 3316
1ceb70f8 3317 /* PREFIX_0F2F */
c608c12e 3318 {
bf890a93 3319 { "comiss", { XM, EXd }, 0 },
592d1631 3320 { Bad_Opcode },
bf890a93 3321 { "comisd", { XM, EXq }, 0 },
c608c12e 3322 },
4e7d34a6 3323
1ceb70f8 3324 /* PREFIX_0F51 */
c608c12e 3325 {
507bd325
L
3326 { "sqrtps", { XM, EXx }, PREFIX_OPCODE },
3327 { "sqrtss", { XM, EXd }, PREFIX_OPCODE },
3328 { "sqrtpd", { XM, EXx }, PREFIX_OPCODE },
3329 { "sqrtsd", { XM, EXq }, PREFIX_OPCODE },
c608c12e 3330 },
4e7d34a6 3331
1ceb70f8 3332 /* PREFIX_0F52 */
c608c12e 3333 {
507bd325
L
3334 { "rsqrtps",{ XM, EXx }, PREFIX_OPCODE },
3335 { "rsqrtss",{ XM, EXd }, PREFIX_OPCODE },
c608c12e 3336 },
4e7d34a6 3337
1ceb70f8 3338 /* PREFIX_0F53 */
c608c12e 3339 {
507bd325
L
3340 { "rcpps", { XM, EXx }, PREFIX_OPCODE },
3341 { "rcpss", { XM, EXd }, PREFIX_OPCODE },
c608c12e 3342 },
4e7d34a6 3343
1ceb70f8 3344 /* PREFIX_0F58 */
c608c12e 3345 {
507bd325
L
3346 { "addps", { XM, EXx }, PREFIX_OPCODE },
3347 { "addss", { XM, EXd }, PREFIX_OPCODE },
3348 { "addpd", { XM, EXx }, PREFIX_OPCODE },
3349 { "addsd", { XM, EXq }, PREFIX_OPCODE },
c608c12e 3350 },
4e7d34a6 3351
1ceb70f8 3352 /* PREFIX_0F59 */
c608c12e 3353 {
507bd325
L
3354 { "mulps", { XM, EXx }, PREFIX_OPCODE },
3355 { "mulss", { XM, EXd }, PREFIX_OPCODE },
3356 { "mulpd", { XM, EXx }, PREFIX_OPCODE },
3357 { "mulsd", { XM, EXq }, PREFIX_OPCODE },
041bd2e0 3358 },
4e7d34a6 3359
1ceb70f8 3360 /* PREFIX_0F5A */
041bd2e0 3361 {
507bd325
L
3362 { "cvtps2pd", { XM, EXq }, PREFIX_OPCODE },
3363 { "cvtss2sd", { XM, EXd }, PREFIX_OPCODE },
3364 { "cvtpd2ps", { XM, EXx }, PREFIX_OPCODE },
3365 { "cvtsd2ss", { XM, EXq }, PREFIX_OPCODE },
041bd2e0 3366 },
4e7d34a6 3367
1ceb70f8 3368 /* PREFIX_0F5B */
041bd2e0 3369 {
507bd325
L
3370 { "cvtdq2ps", { XM, EXx }, PREFIX_OPCODE },
3371 { "cvttps2dq", { XM, EXx }, PREFIX_OPCODE },
3372 { "cvtps2dq", { XM, EXx }, PREFIX_OPCODE },
041bd2e0 3373 },
4e7d34a6 3374
1ceb70f8 3375 /* PREFIX_0F5C */
041bd2e0 3376 {
507bd325
L
3377 { "subps", { XM, EXx }, PREFIX_OPCODE },
3378 { "subss", { XM, EXd }, PREFIX_OPCODE },
3379 { "subpd", { XM, EXx }, PREFIX_OPCODE },
3380 { "subsd", { XM, EXq }, PREFIX_OPCODE },
041bd2e0 3381 },
4e7d34a6 3382
1ceb70f8 3383 /* PREFIX_0F5D */
041bd2e0 3384 {
507bd325
L
3385 { "minps", { XM, EXx }, PREFIX_OPCODE },
3386 { "minss", { XM, EXd }, PREFIX_OPCODE },
3387 { "minpd", { XM, EXx }, PREFIX_OPCODE },
3388 { "minsd", { XM, EXq }, PREFIX_OPCODE },
041bd2e0 3389 },
4e7d34a6 3390
1ceb70f8 3391 /* PREFIX_0F5E */
041bd2e0 3392 {
507bd325
L
3393 { "divps", { XM, EXx }, PREFIX_OPCODE },
3394 { "divss", { XM, EXd }, PREFIX_OPCODE },
3395 { "divpd", { XM, EXx }, PREFIX_OPCODE },
3396 { "divsd", { XM, EXq }, PREFIX_OPCODE },
041bd2e0 3397 },
4e7d34a6 3398
1ceb70f8 3399 /* PREFIX_0F5F */
041bd2e0 3400 {
507bd325
L
3401 { "maxps", { XM, EXx }, PREFIX_OPCODE },
3402 { "maxss", { XM, EXd }, PREFIX_OPCODE },
3403 { "maxpd", { XM, EXx }, PREFIX_OPCODE },
3404 { "maxsd", { XM, EXq }, PREFIX_OPCODE },
041bd2e0 3405 },
4e7d34a6 3406
1ceb70f8 3407 /* PREFIX_0F60 */
041bd2e0 3408 {
507bd325 3409 { "punpcklbw",{ MX, EMd }, PREFIX_OPCODE },
592d1631 3410 { Bad_Opcode },
507bd325 3411 { "punpcklbw",{ MX, EMx }, PREFIX_OPCODE },
041bd2e0 3412 },
4e7d34a6 3413
1ceb70f8 3414 /* PREFIX_0F61 */
041bd2e0 3415 {
507bd325 3416 { "punpcklwd",{ MX, EMd }, PREFIX_OPCODE },
592d1631 3417 { Bad_Opcode },
507bd325 3418 { "punpcklwd",{ MX, EMx }, PREFIX_OPCODE },
041bd2e0 3419 },
4e7d34a6 3420
1ceb70f8 3421 /* PREFIX_0F62 */
041bd2e0 3422 {
507bd325 3423 { "punpckldq",{ MX, EMd }, PREFIX_OPCODE },
592d1631 3424 { Bad_Opcode },
507bd325 3425 { "punpckldq",{ MX, EMx }, PREFIX_OPCODE },
041bd2e0 3426 },
4e7d34a6 3427
1ceb70f8 3428 /* PREFIX_0F6F */
ca164297 3429 {
507bd325
L
3430 { "movq", { MX, EM }, PREFIX_OPCODE },
3431 { "movdqu", { XM, EXx }, PREFIX_OPCODE },
3432 { "movdqa", { XM, EXx }, PREFIX_OPCODE },
ca164297 3433 },
4e7d34a6 3434
1ceb70f8 3435 /* PREFIX_0F70 */
4e7d34a6 3436 {
507bd325
L
3437 { "pshufw", { MX, EM, Ib }, PREFIX_OPCODE },
3438 { "pshufhw",{ XM, EXx, Ib }, PREFIX_OPCODE },
3439 { "pshufd", { XM, EXx, Ib }, PREFIX_OPCODE },
3440 { "pshuflw",{ XM, EXx, Ib }, PREFIX_OPCODE },
4e7d34a6
L
3441 },
3442
1ceb70f8 3443 /* PREFIX_0F78 */
4e7d34a6 3444 {
bf890a93 3445 {"vmread", { Em, Gm }, 0 },
592d1631 3446 { Bad_Opcode },
bf890a93
IT
3447 {"extrq", { XS, Ib, Ib }, 0 },
3448 {"insertq", { XM, XS, Ib, Ib }, 0 },
4e7d34a6
L
3449 },
3450
1ceb70f8 3451 /* PREFIX_0F79 */
4e7d34a6 3452 {
bf890a93 3453 {"vmwrite", { Gm, Em }, 0 },
592d1631 3454 { Bad_Opcode },
bf890a93
IT
3455 {"extrq", { XM, XS }, 0 },
3456 {"insertq", { XM, XS }, 0 },
4e7d34a6
L
3457 },
3458
1ceb70f8 3459 /* PREFIX_0F7C */
ca164297 3460 {
592d1631
L
3461 { Bad_Opcode },
3462 { Bad_Opcode },
507bd325
L
3463 { "haddpd", { XM, EXx }, PREFIX_OPCODE },
3464 { "haddps", { XM, EXx }, PREFIX_OPCODE },
ca164297 3465 },
4e7d34a6 3466
1ceb70f8 3467 /* PREFIX_0F7D */
ca164297 3468 {
592d1631
L
3469 { Bad_Opcode },
3470 { Bad_Opcode },
507bd325
L
3471 { "hsubpd", { XM, EXx }, PREFIX_OPCODE },
3472 { "hsubps", { XM, EXx }, PREFIX_OPCODE },
ca164297 3473 },
4e7d34a6 3474
1ceb70f8 3475 /* PREFIX_0F7E */
ca164297 3476 {
507bd325
L
3477 { "movK", { Edq, MX }, PREFIX_OPCODE },
3478 { "movq", { XM, EXq }, PREFIX_OPCODE },
3479 { "movK", { Edq, XM }, PREFIX_OPCODE },
ca164297 3480 },
4e7d34a6 3481
1ceb70f8 3482 /* PREFIX_0F7F */
ca164297 3483 {
507bd325
L
3484 { "movq", { EMS, MX }, PREFIX_OPCODE },
3485 { "movdqu", { EXxS, XM }, PREFIX_OPCODE },
3486 { "movdqa", { EXxS, XM }, PREFIX_OPCODE },
ca164297 3487 },
4e7d34a6 3488
f8687e93 3489 /* PREFIX_0FAE_REG_0_MOD_3 */
c7b8aa3a
L
3490 {
3491 { Bad_Opcode },
bf890a93 3492 { "rdfsbase", { Ev }, 0 },
c7b8aa3a
L
3493 },
3494
f8687e93 3495 /* PREFIX_0FAE_REG_1_MOD_3 */
c7b8aa3a
L
3496 {
3497 { Bad_Opcode },
bf890a93 3498 { "rdgsbase", { Ev }, 0 },
c7b8aa3a
L
3499 },
3500
f8687e93 3501 /* PREFIX_0FAE_REG_2_MOD_3 */
c7b8aa3a
L
3502 {
3503 { Bad_Opcode },
bf890a93 3504 { "wrfsbase", { Ev }, 0 },
c7b8aa3a
L
3505 },
3506
f8687e93 3507 /* PREFIX_0FAE_REG_3_MOD_3 */
c7b8aa3a
L
3508 {
3509 { Bad_Opcode },
bf890a93 3510 { "wrgsbase", { Ev }, 0 },
c7b8aa3a
L
3511 },
3512
f8687e93 3513 /* PREFIX_0FAE_REG_4_MOD_0 */
6b40c462
L
3514 {
3515 { "xsave", { FXSAVE }, 0 },
b24d668c 3516 { "ptwrite{%LQ|}", { Edq }, 0 },
6b40c462
L
3517 },
3518
f8687e93 3519 /* PREFIX_0FAE_REG_4_MOD_3 */
6b40c462
L
3520 {
3521 { Bad_Opcode },
b24d668c 3522 { "ptwrite{%LQ|}", { Edq }, 0 },
6b40c462
L
3523 },
3524
f8687e93 3525 /* PREFIX_0FAE_REG_5_MOD_3 */
2234eee6
L
3526 {
3527 { "lfence", { Skip_MODRM }, 0 },
464d2b65 3528 { "incsspK", { Edq }, PREFIX_OPCODE },
603555e5
L
3529 },
3530
f8687e93 3531 /* PREFIX_0FAE_REG_6_MOD_0 */
c5e7287a 3532 {
603555e5
L
3533 { "xsaveopt", { FXSAVE }, PREFIX_OPCODE },
3534 { "clrssbsy", { Mq }, PREFIX_OPCODE },
3535 { "clwb", { Mb }, PREFIX_OPCODE },
c5e7287a
IT
3536 },
3537
f8687e93 3538 /* PREFIX_0FAE_REG_6_MOD_3 */
de89d0a3 3539 {
f8687e93 3540 { RM_TABLE (RM_0FAE_REG_6_MOD_3_P_0) },
de89d0a3 3541 { "umonitor", { Eva }, PREFIX_OPCODE },
ae1d3843
L
3542 { "tpause", { Edq }, PREFIX_OPCODE },
3543 { "umwait", { Edq }, PREFIX_OPCODE },
de89d0a3
IT
3544 },
3545
f8687e93 3546 /* PREFIX_0FAE_REG_7_MOD_0 */
963f3586 3547 {
bf890a93 3548 { "clflush", { Mb }, 0 },
963f3586 3549 { Bad_Opcode },
bf890a93 3550 { "clflushopt", { Mb }, 0 },
963f3586
IT
3551 },
3552
1ceb70f8 3553 /* PREFIX_0FB8 */
ca164297 3554 {
592d1631 3555 { Bad_Opcode },
bf890a93 3556 { "popcntS", { Gv, Ev }, 0 },
ca164297 3557 },
4e7d34a6 3558
f12dc422
L
3559 /* PREFIX_0FBC */
3560 {
bf890a93
IT
3561 { "bsfS", { Gv, Ev }, 0 },
3562 { "tzcntS", { Gv, Ev }, 0 },
3563 { "bsfS", { Gv, Ev }, 0 },
f12dc422
L
3564 },
3565
1ceb70f8 3566 /* PREFIX_0FBD */
050dfa73 3567 {
bf890a93
IT
3568 { "bsrS", { Gv, Ev }, 0 },
3569 { "lzcntS", { Gv, Ev }, 0 },
3570 { "bsrS", { Gv, Ev }, 0 },
050dfa73
MM
3571 },
3572
1ceb70f8 3573 /* PREFIX_0FC2 */
050dfa73 3574 {
507bd325
L
3575 { "cmpps", { XM, EXx, CMP }, PREFIX_OPCODE },
3576 { "cmpss", { XM, EXd, CMP }, PREFIX_OPCODE },
3577 { "cmppd", { XM, EXx, CMP }, PREFIX_OPCODE },
3578 { "cmpsd", { XM, EXq, CMP }, PREFIX_OPCODE },
050dfa73 3579 },
246c51aa 3580
f8687e93 3581 /* PREFIX_0FC7_REG_6_MOD_0 */
92fddf8e 3582 {
bf890a93
IT
3583 { "vmptrld",{ Mq }, 0 },
3584 { "vmxon", { Mq }, 0 },
3585 { "vmclear",{ Mq }, 0 },
92fddf8e
L
3586 },
3587
f8687e93 3588 /* PREFIX_0FC7_REG_6_MOD_3 */
f24bcbaa
L
3589 {
3590 { "rdrand", { Ev }, 0 },
f64c42a9 3591 { X86_64_TABLE (X86_64_0FC7_REG_6_MOD_3_PREFIX_1) },
f24bcbaa
L
3592 { "rdrand", { Ev }, 0 }
3593 },
3594
f8687e93 3595 /* PREFIX_0FC7_REG_7_MOD_3 */
f24bcbaa
L
3596 {
3597 { "rdseed", { Ev }, 0 },
8bc52696 3598 { "rdpid", { Em }, 0 },
f24bcbaa
L
3599 { "rdseed", { Ev }, 0 },
3600 },
3601
1ceb70f8 3602 /* PREFIX_0FD0 */
050dfa73 3603 {
592d1631
L
3604 { Bad_Opcode },
3605 { Bad_Opcode },
bf890a93
IT
3606 { "addsubpd", { XM, EXx }, 0 },
3607 { "addsubps", { XM, EXx }, 0 },
246c51aa 3608 },
050dfa73 3609
1ceb70f8 3610 /* PREFIX_0FD6 */
050dfa73 3611 {
592d1631 3612 { Bad_Opcode },
bf890a93
IT
3613 { "movq2dq",{ XM, MS }, 0 },
3614 { "movq", { EXqS, XM }, 0 },
3615 { "movdq2q",{ MX, XS }, 0 },
050dfa73
MM
3616 },
3617
1ceb70f8 3618 /* PREFIX_0FE6 */
7918206c 3619 {
592d1631 3620 { Bad_Opcode },
507bd325
L
3621 { "cvtdq2pd", { XM, EXq }, PREFIX_OPCODE },
3622 { "cvttpd2dq", { XM, EXx }, PREFIX_OPCODE },
3623 { "cvtpd2dq", { XM, EXx }, PREFIX_OPCODE },
7918206c 3624 },
8b38ad71 3625
1ceb70f8 3626 /* PREFIX_0FE7 */
8b38ad71 3627 {
507bd325 3628 { "movntq", { Mq, MX }, PREFIX_OPCODE },
592d1631 3629 { Bad_Opcode },
75c135a8 3630 { MOD_TABLE (MOD_0FE7_PREFIX_2) },
4e7d34a6
L
3631 },
3632
1ceb70f8 3633 /* PREFIX_0FF0 */
4e7d34a6 3634 {
592d1631
L
3635 { Bad_Opcode },
3636 { Bad_Opcode },
3637 { Bad_Opcode },
1ceb70f8 3638 { MOD_TABLE (MOD_0FF0_PREFIX_3) },
4e7d34a6
L
3639 },
3640
1ceb70f8 3641 /* PREFIX_0FF7 */
4e7d34a6 3642 {
507bd325 3643 { "maskmovq", { MX, MS }, PREFIX_OPCODE },
592d1631 3644 { Bad_Opcode },
507bd325 3645 { "maskmovdqu", { XM, XS }, PREFIX_OPCODE },
8b38ad71 3646 },
42903f7f 3647
c4694f17
TG
3648 /* PREFIX_0F38D8 */
3649 {
3650 { Bad_Opcode },
3651 { REG_TABLE (REG_0F38D8_PREFIX_1) },
3652 },
3653
3654 /* PREFIX_0F38DC */
3655 {
3656 { Bad_Opcode },
3657 { MOD_TABLE (MOD_0F38DC_PREFIX_1) },
3658 { "aesenc", { XM, EXx }, 0 },
3659 },
3660
3661 /* PREFIX_0F38DD */
3662 {
3663 { Bad_Opcode },
3664 { MOD_TABLE (MOD_0F38DD_PREFIX_1) },
3665 { "aesenclast", { XM, EXx }, 0 },
3666 },
3667
3668 /* PREFIX_0F38DE */
3669 {
3670 { Bad_Opcode },
3671 { MOD_TABLE (MOD_0F38DE_PREFIX_1) },
3672 { "aesdec", { XM, EXx }, 0 },
3673 },
3674
3675 /* PREFIX_0F38DF */
3676 {
3677 { Bad_Opcode },
3678 { MOD_TABLE (MOD_0F38DF_PREFIX_1) },
3679 { "aesdeclast", { XM, EXx }, 0 },
3680 },
3681
1ceb70f8 3682 /* PREFIX_0F38F0 */
4e7d34a6 3683 {
9ab00b61 3684 { "movbeS", { Gv, Mv }, PREFIX_OPCODE },
592d1631 3685 { Bad_Opcode },
9ab00b61 3686 { "movbeS", { Gv, Mv }, PREFIX_OPCODE },
2875b28a 3687 { "crc32A", { Gdq, Eb }, PREFIX_OPCODE },
4e7d34a6
L
3688 },
3689
1ceb70f8 3690 /* PREFIX_0F38F1 */
4e7d34a6 3691 {
9ab00b61 3692 { "movbeS", { Mv, Gv }, PREFIX_OPCODE },
592d1631 3693 { Bad_Opcode },
9ab00b61 3694 { "movbeS", { Mv, Gv }, PREFIX_OPCODE },
2875b28a 3695 { "crc32Q", { Gdq, Ev }, PREFIX_OPCODE },
4e7d34a6
L
3696 },
3697
603555e5
L
3698 /* PREFIX_0F38F6 */
3699 {
3700 { MOD_TABLE (MOD_0F38F6_PREFIX_0) },
507bd325
L
3701 { "adoxS", { Gdq, Edq}, PREFIX_OPCODE },
3702 { "adcxS", { Gdq, Edq}, PREFIX_OPCODE },
e2e1fcde
L
3703 { Bad_Opcode },
3704 },
3705
c0a30a9f
L
3706 /* PREFIX_0F38F8 */
3707 {
3708 { Bad_Opcode },
5d79adc4 3709 { MOD_TABLE (MOD_0F38F8_PREFIX_1) },
c0a30a9f 3710 { MOD_TABLE (MOD_0F38F8_PREFIX_2) },
5d79adc4 3711 { MOD_TABLE (MOD_0F38F8_PREFIX_3) },
c0a30a9f 3712 },
c4694f17
TG
3713 /* PREFIX_0F38FA */
3714 {
3715 { Bad_Opcode },
3716 { MOD_TABLE (MOD_0F38FA_PREFIX_1) },
3717 },
3718
3719 /* PREFIX_0F38FB */
3720 {
3721 { Bad_Opcode },
3722 { MOD_TABLE (MOD_0F38FB_PREFIX_1) },
3723 },
c0a30a9f 3724
c1fa250a
LC
3725 /* PREFIX_0F3A0F */
3726 {
3727 { Bad_Opcode },
3728 { MOD_TABLE (MOD_0F3A0F_PREFIX_1)},
3729 },
3730
7531c613 3731 /* PREFIX_VEX_0F10 */
42903f7f 3732 {
7531c613
JB
3733 { "vmovups", { XM, EXx }, 0 },
3734 { "vmovss", { XMScalar, VexScalarR, EXxmm_md }, 0 },
3735 { "vmovupd", { XM, EXx }, 0 },
3736 { "vmovsd", { XMScalar, VexScalarR, EXxmm_mq }, 0 },
42903f7f
L
3737 },
3738
7531c613 3739 /* PREFIX_VEX_0F11 */
42903f7f 3740 {
7531c613
JB
3741 { "vmovups", { EXxS, XM }, 0 },
3742 { "vmovss", { EXdS, VexScalarR, XMScalar }, 0 },
3743 { "vmovupd", { EXxS, XM }, 0 },
3744 { "vmovsd", { EXqS, VexScalarR, XMScalar }, 0 },
42903f7f
L
3745 },
3746
7531c613 3747 /* PREFIX_VEX_0F12 */
42903f7f 3748 {
7531c613
JB
3749 { MOD_TABLE (MOD_VEX_0F12_PREFIX_0) },
3750 { "vmovsldup", { XM, EXx }, 0 },
3751 { MOD_TABLE (MOD_VEX_0F12_PREFIX_2) },
3752 { "vmovddup", { XM, EXymmq }, 0 },
42903f7f
L
3753 },
3754
7531c613 3755 /* PREFIX_VEX_0F16 */
42903f7f 3756 {
7531c613
JB
3757 { MOD_TABLE (MOD_VEX_0F16_PREFIX_0) },
3758 { "vmovshdup", { XM, EXx }, 0 },
3759 { MOD_TABLE (MOD_VEX_0F16_PREFIX_2) },
5f754f58 3760 },
7c52e0e8 3761
592a252b 3762 /* PREFIX_VEX_0F2A */
5f754f58 3763 {
592d1631 3764 { Bad_Opcode },
b24d668c 3765 { "vcvtsi2ss{%LQ|}", { XMScalar, VexScalar, Edq }, 0 },
592d1631 3766 { Bad_Opcode },
b24d668c 3767 { "vcvtsi2sd{%LQ|}", { XMScalar, VexScalar, Edq }, 0 },
5f754f58 3768 },
7c52e0e8 3769
592a252b 3770 /* PREFIX_VEX_0F2C */
5f754f58 3771 {
592d1631 3772 { Bad_Opcode },
17d3c7ec 3773 { "vcvttss2si", { Gdq, EXxmm_md, EXxEVexS }, 0 },
592d1631 3774 { Bad_Opcode },
17d3c7ec 3775 { "vcvttsd2si", { Gdq, EXxmm_mq, EXxEVexS }, 0 },
5f754f58 3776 },
7c52e0e8 3777
592a252b 3778 /* PREFIX_VEX_0F2D */
7c52e0e8 3779 {
592d1631 3780 { Bad_Opcode },
17d3c7ec 3781 { "vcvtss2si", { Gdq, EXxmm_md, EXxEVexR }, 0 },
592d1631 3782 { Bad_Opcode },
17d3c7ec 3783 { "vcvtsd2si", { Gdq, EXxmm_mq, EXxEVexR }, 0 },
7c52e0e8
L
3784 },
3785
592a252b 3786 /* PREFIX_VEX_0F2E */
7c52e0e8 3787 {
17d3c7ec 3788 { "vucomisX", { XMScalar, EXxmm_md, EXxEVexS }, PREFIX_OPCODE },
592d1631 3789 { Bad_Opcode },
17d3c7ec 3790 { "vucomisX", { XMScalar, EXxmm_mq, EXxEVexS }, PREFIX_OPCODE },
7c52e0e8
L
3791 },
3792
592a252b 3793 /* PREFIX_VEX_0F2F */
7c52e0e8 3794 {
17d3c7ec 3795 { "vcomisX", { XMScalar, EXxmm_md, EXxEVexS }, PREFIX_OPCODE },
592d1631 3796 { Bad_Opcode },
17d3c7ec 3797 { "vcomisX", { XMScalar, EXxmm_mq, EXxEVexS }, PREFIX_OPCODE },
7c52e0e8
L
3798 },
3799
43234a1e
L
3800 /* PREFIX_VEX_0F41 */
3801 {
3802 { VEX_LEN_TABLE (VEX_LEN_0F41_P_0) },
1ba585e8
IT
3803 { Bad_Opcode },
3804 { VEX_LEN_TABLE (VEX_LEN_0F41_P_2) },
43234a1e
L
3805 },
3806
3807 /* PREFIX_VEX_0F42 */
3808 {
3809 { VEX_LEN_TABLE (VEX_LEN_0F42_P_0) },
1ba585e8
IT
3810 { Bad_Opcode },
3811 { VEX_LEN_TABLE (VEX_LEN_0F42_P_2) },
43234a1e
L
3812 },
3813
7531c613 3814 /* PREFIX_VEX_0F44 */
c0f3af97 3815 {
7531c613 3816 { VEX_LEN_TABLE (VEX_LEN_0F44_P_0) },
592d1631 3817 { Bad_Opcode },
7531c613 3818 { VEX_LEN_TABLE (VEX_LEN_0F44_P_2) },
c0f3af97
L
3819 },
3820
7531c613 3821 /* PREFIX_VEX_0F45 */
0bfee649 3822 {
7531c613 3823 { VEX_LEN_TABLE (VEX_LEN_0F45_P_0) },
592d1631 3824 { Bad_Opcode },
7531c613 3825 { VEX_LEN_TABLE (VEX_LEN_0F45_P_2) },
0bfee649
L
3826 },
3827
7531c613 3828 /* PREFIX_VEX_0F46 */
43234a1e 3829 {
7531c613 3830 { VEX_LEN_TABLE (VEX_LEN_0F46_P_0) },
43234a1e 3831 { Bad_Opcode },
7531c613 3832 { VEX_LEN_TABLE (VEX_LEN_0F46_P_2) },
43234a1e
L
3833 },
3834
7531c613 3835 /* PREFIX_VEX_0F47 */
1ba585e8 3836 {
7531c613 3837 { VEX_LEN_TABLE (VEX_LEN_0F47_P_0) },
1ba585e8 3838 { Bad_Opcode },
7531c613 3839 { VEX_LEN_TABLE (VEX_LEN_0F47_P_2) },
1ba585e8
IT
3840 },
3841
7531c613 3842 /* PREFIX_VEX_0F4A */
43234a1e 3843 {
7531c613 3844 { VEX_LEN_TABLE (VEX_LEN_0F4A_P_0) },
43234a1e 3845 { Bad_Opcode },
7531c613 3846 { VEX_LEN_TABLE (VEX_LEN_0F4A_P_2) },
43234a1e
L
3847 },
3848
7531c613 3849 /* PREFIX_VEX_0F4B */
1ba585e8 3850 {
7531c613 3851 { VEX_LEN_TABLE (VEX_LEN_0F4B_P_0) },
1ba585e8 3852 { Bad_Opcode },
7531c613 3853 { VEX_LEN_TABLE (VEX_LEN_0F4B_P_2) },
1ba585e8
IT
3854 },
3855
7531c613 3856 /* PREFIX_VEX_0F51 */
6c30d220 3857 {
7531c613
JB
3858 { "vsqrtps", { XM, EXx }, 0 },
3859 { "vsqrtss", { XMScalar, VexScalar, EXxmm_md }, 0 },
3860 { "vsqrtpd", { XM, EXx }, 0 },
3861 { "vsqrtsd", { XMScalar, VexScalar, EXxmm_mq }, 0 },
6c30d220
L
3862 },
3863
7531c613 3864 /* PREFIX_VEX_0F52 */
6c30d220 3865 {
7531c613
JB
3866 { "vrsqrtps", { XM, EXx }, 0 },
3867 { "vrsqrtss", { XMScalar, VexScalar, EXxmm_md }, 0 },
6c30d220
L
3868 },
3869
7531c613 3870 /* PREFIX_VEX_0F53 */
c0f3af97 3871 {
7531c613
JB
3872 { "vrcpps", { XM, EXx }, 0 },
3873 { "vrcpss", { XMScalar, VexScalar, EXxmm_md }, 0 },
c0f3af97
L
3874 },
3875
7531c613 3876 /* PREFIX_VEX_0F58 */
c0f3af97 3877 {
7531c613
JB
3878 { "vaddps", { XM, Vex, EXx }, 0 },
3879 { "vaddss", { XMScalar, VexScalar, EXxmm_md }, 0 },
3880 { "vaddpd", { XM, Vex, EXx }, 0 },
3881 { "vaddsd", { XMScalar, VexScalar, EXxmm_mq }, 0 },
c0f3af97
L
3882 },
3883
7531c613 3884 /* PREFIX_VEX_0F59 */
c0f3af97 3885 {
7531c613
JB
3886 { "vmulps", { XM, Vex, EXx }, 0 },
3887 { "vmulss", { XMScalar, VexScalar, EXxmm_md }, 0 },
3888 { "vmulpd", { XM, Vex, EXx }, 0 },
3889 { "vmulsd", { XMScalar, VexScalar, EXxmm_mq }, 0 },
c0f3af97
L
3890 },
3891
7531c613 3892 /* PREFIX_VEX_0F5A */
ce2f5b3c 3893 {
7531c613
JB
3894 { "vcvtps2pd", { XM, EXxmmq }, 0 },
3895 { "vcvtss2sd", { XMScalar, VexScalar, EXxmm_md }, 0 },
3896 { "vcvtpd2ps%XY",{ XMM, EXx }, 0 },
3897 { "vcvtsd2ss", { XMScalar, VexScalar, EXxmm_mq }, 0 },
ce2f5b3c
L
3898 },
3899
7531c613 3900 /* PREFIX_VEX_0F5B */
6c30d220 3901 {
7531c613
JB
3902 { "vcvtdq2ps", { XM, EXx }, 0 },
3903 { "vcvttps2dq", { XM, EXx }, 0 },
3904 { "vcvtps2dq", { XM, EXx }, 0 },
6c30d220
L
3905 },
3906
7531c613 3907 /* PREFIX_VEX_0F5C */
a683cc34 3908 {
7531c613
JB
3909 { "vsubps", { XM, Vex, EXx }, 0 },
3910 { "vsubss", { XMScalar, VexScalar, EXxmm_md }, 0 },
3911 { "vsubpd", { XM, Vex, EXx }, 0 },
3912 { "vsubsd", { XMScalar, VexScalar, EXxmm_mq }, 0 },
a683cc34
SP
3913 },
3914
7531c613 3915 /* PREFIX_VEX_0F5D */
a683cc34 3916 {
7531c613
JB
3917 { "vminps", { XM, Vex, EXx }, 0 },
3918 { "vminss", { XMScalar, VexScalar, EXxmm_md }, 0 },
3919 { "vminpd", { XM, Vex, EXx }, 0 },
3920 { "vminsd", { XMScalar, VexScalar, EXxmm_mq }, 0 },
a683cc34
SP
3921 },
3922
7531c613 3923 /* PREFIX_VEX_0F5E */
c0f3af97 3924 {
7531c613
JB
3925 { "vdivps", { XM, Vex, EXx }, 0 },
3926 { "vdivss", { XMScalar, VexScalar, EXxmm_md }, 0 },
3927 { "vdivpd", { XM, Vex, EXx }, 0 },
3928 { "vdivsd", { XMScalar, VexScalar, EXxmm_mq }, 0 },
c0f3af97
L
3929 },
3930
7531c613 3931 /* PREFIX_VEX_0F5F */
c0f3af97 3932 {
7531c613
JB
3933 { "vmaxps", { XM, Vex, EXx }, 0 },
3934 { "vmaxss", { XMScalar, VexScalar, EXxmm_md }, 0 },
3935 { "vmaxpd", { XM, Vex, EXx }, 0 },
3936 { "vmaxsd", { XMScalar, VexScalar, EXxmm_mq }, 0 },
c0f3af97
L
3937 },
3938
7531c613 3939 /* PREFIX_VEX_0F6F */
c0f3af97 3940 {
592d1631 3941 { Bad_Opcode },
7531c613
JB
3942 { "vmovdqu", { XM, EXx }, 0 },
3943 { "vmovdqa", { XM, EXx }, 0 },
c0f3af97
L
3944 },
3945
7531c613 3946 /* PREFIX_VEX_0F70 */
922d8de8 3947 {
592d1631 3948 { Bad_Opcode },
7531c613
JB
3949 { "vpshufhw", { XM, EXx, Ib }, 0 },
3950 { "vpshufd", { XM, EXx, Ib }, 0 },
3951 { "vpshuflw", { XM, EXx, Ib }, 0 },
922d8de8
DR
3952 },
3953
7531c613 3954 /* PREFIX_VEX_0F7C */
922d8de8 3955 {
592d1631
L
3956 { Bad_Opcode },
3957 { Bad_Opcode },
7531c613
JB
3958 { "vhaddpd", { XM, Vex, EXx }, 0 },
3959 { "vhaddps", { XM, Vex, EXx }, 0 },
922d8de8
DR
3960 },
3961
7531c613 3962 /* PREFIX_VEX_0F7D */
922d8de8 3963 {
592d1631
L
3964 { Bad_Opcode },
3965 { Bad_Opcode },
7531c613
JB
3966 { "vhsubpd", { XM, Vex, EXx }, 0 },
3967 { "vhsubps", { XM, Vex, EXx }, 0 },
922d8de8
DR
3968 },
3969
7531c613 3970 /* PREFIX_VEX_0F7E */
c0f3af97 3971 {
592d1631 3972 { Bad_Opcode },
7531c613
JB
3973 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_1) },
3974 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_2) },
c0f3af97
L
3975 },
3976
7531c613 3977 /* PREFIX_VEX_0F7F */
c0f3af97 3978 {
592d1631 3979 { Bad_Opcode },
7531c613
JB
3980 { "vmovdqu", { EXxS, XM }, 0 },
3981 { "vmovdqa", { EXxS, XM }, 0 },
c0f3af97
L
3982 },
3983
7531c613 3984 /* PREFIX_VEX_0F90 */
c0f3af97 3985 {
7531c613 3986 { VEX_LEN_TABLE (VEX_LEN_0F90_P_0) },
592d1631 3987 { Bad_Opcode },
7531c613 3988 { VEX_LEN_TABLE (VEX_LEN_0F90_P_2) },
c0f3af97
L
3989 },
3990
7531c613 3991 /* PREFIX_VEX_0F91 */
c0f3af97 3992 {
7531c613 3993 { VEX_LEN_TABLE (VEX_LEN_0F91_P_0) },
592d1631 3994 { Bad_Opcode },
7531c613 3995 { VEX_LEN_TABLE (VEX_LEN_0F91_P_2) },
c0f3af97 3996 },
a5ff0eb2 3997
7531c613 3998 /* PREFIX_VEX_0F92 */
922d8de8 3999 {
7531c613 4000 { VEX_LEN_TABLE (VEX_LEN_0F92_P_0) },
592d1631 4001 { Bad_Opcode },
7531c613
JB
4002 { VEX_LEN_TABLE (VEX_LEN_0F92_P_2) },
4003 { VEX_LEN_TABLE (VEX_LEN_0F92_P_3) },
922d8de8
DR
4004 },
4005
7531c613 4006 /* PREFIX_VEX_0F93 */
922d8de8 4007 {
7531c613 4008 { VEX_LEN_TABLE (VEX_LEN_0F93_P_0) },
592d1631 4009 { Bad_Opcode },
7531c613
JB
4010 { VEX_LEN_TABLE (VEX_LEN_0F93_P_2) },
4011 { VEX_LEN_TABLE (VEX_LEN_0F93_P_3) },
922d8de8
DR
4012 },
4013
7531c613 4014 /* PREFIX_VEX_0F98 */
922d8de8 4015 {
7531c613 4016 { VEX_LEN_TABLE (VEX_LEN_0F98_P_0) },
592d1631 4017 { Bad_Opcode },
7531c613 4018 { VEX_LEN_TABLE (VEX_LEN_0F98_P_2) },
922d8de8
DR
4019 },
4020
7531c613 4021 /* PREFIX_VEX_0F99 */
922d8de8 4022 {
7531c613 4023 { VEX_LEN_TABLE (VEX_LEN_0F99_P_0) },
592d1631 4024 { Bad_Opcode },
7531c613 4025 { VEX_LEN_TABLE (VEX_LEN_0F99_P_2) },
922d8de8
DR
4026 },
4027
7531c613 4028 /* PREFIX_VEX_0FC2 */
922d8de8 4029 {
7531c613
JB
4030 { "vcmpps", { XM, Vex, EXx, CMP }, 0 },
4031 { "vcmpss", { XMScalar, VexScalar, EXxmm_md, CMP }, 0 },
4032 { "vcmppd", { XM, Vex, EXx, CMP }, 0 },
4033 { "vcmpsd", { XMScalar, VexScalar, EXxmm_mq, CMP }, 0 },
922d8de8
DR
4034 },
4035
7531c613 4036 /* PREFIX_VEX_0FD0 */
922d8de8 4037 {
592d1631
L
4038 { Bad_Opcode },
4039 { Bad_Opcode },
7531c613
JB
4040 { "vaddsubpd", { XM, Vex, EXx }, 0 },
4041 { "vaddsubps", { XM, Vex, EXx }, 0 },
922d8de8
DR
4042 },
4043
7531c613 4044 /* PREFIX_VEX_0FE6 */
922d8de8 4045 {
592d1631 4046 { Bad_Opcode },
7531c613
JB
4047 { "vcvtdq2pd", { XM, EXxmmq }, 0 },
4048 { "vcvttpd2dq%XY", { XMM, EXx }, 0 },
4049 { "vcvtpd2dq%XY", { XMM, EXx }, 0 },
922d8de8
DR
4050 },
4051
7531c613 4052 /* PREFIX_VEX_0FF0 */
922d8de8 4053 {
592d1631
L
4054 { Bad_Opcode },
4055 { Bad_Opcode },
7531c613
JB
4056 { Bad_Opcode },
4057 { MOD_TABLE (MOD_VEX_0FF0_PREFIX_3) },
922d8de8
DR
4058 },
4059
7531c613 4060 /* PREFIX_VEX_0F3849_X86_64 */
922d8de8 4061 {
7531c613 4062 { VEX_W_TABLE (VEX_W_0F3849_X86_64_P_0) },
592d1631 4063 { Bad_Opcode },
7531c613
JB
4064 { VEX_W_TABLE (VEX_W_0F3849_X86_64_P_2) },
4065 { VEX_W_TABLE (VEX_W_0F3849_X86_64_P_3) },
922d8de8
DR
4066 },
4067
7531c613 4068 /* PREFIX_VEX_0F384B_X86_64 */
922d8de8 4069 {
592d1631 4070 { Bad_Opcode },
7531c613
JB
4071 { VEX_W_TABLE (VEX_W_0F384B_X86_64_P_1) },
4072 { VEX_W_TABLE (VEX_W_0F384B_X86_64_P_2) },
4073 { VEX_W_TABLE (VEX_W_0F384B_X86_64_P_3) },
922d8de8
DR
4074 },
4075
7531c613 4076 /* PREFIX_VEX_0F385C_X86_64 */
922d8de8 4077 {
592d1631 4078 { Bad_Opcode },
7531c613 4079 { VEX_W_TABLE (VEX_W_0F385C_X86_64_P_1) },
592d1631 4080 { Bad_Opcode },
922d8de8
DR
4081 },
4082
7531c613 4083 /* PREFIX_VEX_0F385E_X86_64 */
922d8de8 4084 {
7531c613
JB
4085 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_0) },
4086 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_1) },
4087 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_2) },
4088 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_3) },
922d8de8
DR
4089 },
4090
14d10c6c 4091 /* PREFIX_VEX_0F38F5_L_0 */
48521003 4092 {
14d10c6c
JB
4093 { "bzhiS", { Gdq, Edq, VexGdq }, 0 },
4094 { "pextS", { Gdq, VexGdq, Edq }, 0 },
48521003 4095 { Bad_Opcode },
14d10c6c 4096 { "pdepS", { Gdq, VexGdq, Edq }, 0 },
48521003
IT
4097 },
4098
14d10c6c 4099 /* PREFIX_VEX_0F38F6_L_0 */
48521003
IT
4100 {
4101 { Bad_Opcode },
4102 { Bad_Opcode },
7531c613 4103 { Bad_Opcode },
14d10c6c 4104 { "mulxS", { Gdq, VexGdq, Edq }, 0 },
48521003
IT
4105 },
4106
14d10c6c 4107 /* PREFIX_VEX_0F38F7_L_0 */
a5ff0eb2 4108 {
14d10c6c
JB
4109 { "bextrS", { Gdq, Edq, VexGdq }, 0 },
4110 { "sarxS", { Gdq, Edq, VexGdq }, 0 },
4111 { "shlxS", { Gdq, Edq, VexGdq }, 0 },
4112 { "shrxS", { Gdq, Edq, VexGdq }, 0 },
a5ff0eb2 4113 },
6c30d220 4114
14d10c6c 4115 /* PREFIX_VEX_0F3AF0_L_0 */
6c30d220
L
4116 {
4117 { Bad_Opcode },
4118 { Bad_Opcode },
4119 { Bad_Opcode },
14d10c6c 4120 { "rorxS", { Gdq, Edq, Ib }, 0 },
6c30d220 4121 },
43234a1e 4122
ad692897 4123#include "i386-dis-evex-prefix.h"
c0f3af97
L
4124};
4125
4126static const struct dis386 x86_64_table[][2] = {
4127 /* X86_64_06 */
4128 {
bf890a93 4129 { "pushP", { es }, 0 },
c0f3af97
L
4130 },
4131
4132 /* X86_64_07 */
4133 {
bf890a93 4134 { "popP", { es }, 0 },
c0f3af97
L
4135 },
4136
1673df32 4137 /* X86_64_0E */
c0f3af97 4138 {
bf890a93 4139 { "pushP", { cs }, 0 },
c0f3af97
L
4140 },
4141
4142 /* X86_64_16 */
4143 {
bf890a93 4144 { "pushP", { ss }, 0 },
c0f3af97
L
4145 },
4146
4147 /* X86_64_17 */
4148 {
bf890a93 4149 { "popP", { ss }, 0 },
c0f3af97
L
4150 },
4151
4152 /* X86_64_1E */
4153 {
bf890a93 4154 { "pushP", { ds }, 0 },
c0f3af97
L
4155 },
4156
4157 /* X86_64_1F */
4158 {
bf890a93 4159 { "popP", { ds }, 0 },
c0f3af97
L
4160 },
4161
4162 /* X86_64_27 */
4163 {
bf890a93 4164 { "daa", { XX }, 0 },
c0f3af97
L
4165 },
4166
4167 /* X86_64_2F */
4168 {
bf890a93 4169 { "das", { XX }, 0 },
c0f3af97
L
4170 },
4171
4172 /* X86_64_37 */
4173 {
bf890a93 4174 { "aaa", { XX }, 0 },
c0f3af97
L
4175 },
4176
4177 /* X86_64_3F */
4178 {
bf890a93 4179 { "aas", { XX }, 0 },
c0f3af97
L
4180 },
4181
4182 /* X86_64_60 */
4183 {
bf890a93 4184 { "pushaP", { XX }, 0 },
c0f3af97
L
4185 },
4186
4187 /* X86_64_61 */
4188 {
bf890a93 4189 { "popaP", { XX }, 0 },
c0f3af97
L
4190 },
4191
4192 /* X86_64_62 */
4193 {
4194 { MOD_TABLE (MOD_62_32BIT) },
43234a1e 4195 { EVEX_TABLE (EVEX_0F) },
c0f3af97
L
4196 },
4197
4198 /* X86_64_63 */
4199 {
bf890a93 4200 { "arpl", { Ew, Gw }, 0 },
bc31405e 4201 { "movs", { { OP_G, movsxd_mode }, { MOVSXD_Fixup, movsxd_mode } }, 0 },
c0f3af97
L
4202 },
4203
4204 /* X86_64_6D */
4205 {
bf890a93
IT
4206 { "ins{R|}", { Yzr, indirDX }, 0 },
4207 { "ins{G|}", { Yzr, indirDX }, 0 },
c0f3af97
L
4208 },
4209
4210 /* X86_64_6F */
4211 {
bf890a93
IT
4212 { "outs{R|}", { indirDXr, Xz }, 0 },
4213 { "outs{G|}", { indirDXr, Xz }, 0 },
c0f3af97
L
4214 },
4215
d039fef3 4216 /* X86_64_82 */
8b89fe14 4217 {
de194d85 4218 /* Opcode 0x82 is an alias of opcode 0x80 in 32-bit mode. */
d039fef3 4219 { REG_TABLE (REG_80) },
8b89fe14
L
4220 },
4221
c0f3af97
L
4222 /* X86_64_9A */
4223 {
36938cab 4224 { "{l|}call{P|}", { Ap }, 0 },
c0f3af97
L
4225 },
4226
aeab2b26
JB
4227 /* X86_64_C2 */
4228 {
4229 { "retP", { Iw, BND }, 0 },
4230 { "ret@", { Iw, BND }, 0 },
4231 },
4232
4233 /* X86_64_C3 */
4234 {
4235 { "retP", { BND }, 0 },
4236 { "ret@", { BND }, 0 },
4237 },
4238
c0f3af97
L
4239 /* X86_64_C4 */
4240 {
4241 { MOD_TABLE (MOD_C4_32BIT) },
4242 { VEX_C4_TABLE (VEX_0F) },
4243 },
4244
4245 /* X86_64_C5 */
4246 {
4247 { MOD_TABLE (MOD_C5_32BIT) },
4248 { VEX_C5_TABLE (VEX_0F) },
4249 },
4250
4251 /* X86_64_CE */
4252 {
bf890a93 4253 { "into", { XX }, 0 },
c0f3af97
L
4254 },
4255
4256 /* X86_64_D4 */
4257 {
bf890a93 4258 { "aam", { Ib }, 0 },
c0f3af97
L
4259 },
4260
4261 /* X86_64_D5 */
4262 {
bf890a93 4263 { "aad", { Ib }, 0 },
c0f3af97
L
4264 },
4265
a72d2af2
L
4266 /* X86_64_E8 */
4267 {
4268 { "callP", { Jv, BND }, 0 },
5db04b09 4269 { "call@", { Jv, BND }, 0 }
a72d2af2
L
4270 },
4271
4272 /* X86_64_E9 */
4273 {
4274 { "jmpP", { Jv, BND }, 0 },
5db04b09 4275 { "jmp@", { Jv, BND }, 0 }
a72d2af2
L
4276 },
4277
c0f3af97
L
4278 /* X86_64_EA */
4279 {
36938cab 4280 { "{l|}jmp{P|}", { Ap }, 0 },
c0f3af97
L
4281 },
4282
4283 /* X86_64_0F01_REG_0 */
4284 {
d1c36125 4285 { "sgdt{Q|Q}", { M }, 0 },
bf890a93 4286 { "sgdt", { M }, 0 },
c0f3af97
L
4287 },
4288
4289 /* X86_64_0F01_REG_1 */
4290 {
d1c36125 4291 { "sidt{Q|Q}", { M }, 0 },
bf890a93 4292 { "sidt", { M }, 0 },
c0f3af97
L
4293 },
4294
81d54bb7
CL
4295 /* X86_64_0F01_REG_1_RM_5_PREFIX_2 */
4296 {
4297 { Bad_Opcode },
4298 { "seamret", { Skip_MODRM }, 0 },
4299 },
4300
4301 /* X86_64_0F01_REG_1_RM_6_PREFIX_2 */
4302 {
4303 { Bad_Opcode },
4304 { "seamops", { Skip_MODRM }, 0 },
4305 },
4306
4307 /* X86_64_0F01_REG_1_RM_7_PREFIX_2 */
4308 {
4309 { Bad_Opcode },
4310 { "seamcall", { Skip_MODRM }, 0 },
4311 },
4312
c0f3af97
L
4313 /* X86_64_0F01_REG_2 */
4314 {
bf890a93
IT
4315 { "lgdt{Q|Q}", { M }, 0 },
4316 { "lgdt", { M }, 0 },
c0f3af97
L
4317 },
4318
4319 /* X86_64_0F01_REG_3 */
4320 {
bf890a93
IT
4321 { "lidt{Q|Q}", { M }, 0 },
4322 { "lidt", { M }, 0 },
c0f3af97 4323 },
260cd341 4324
78467458
JB
4325 {
4326 /* X86_64_0F24 */
4327 { "movZ", { Em, Td }, 0 },
4328 },
4329
4330 {
4331 /* X86_64_0F26 */
4332 { "movZ", { Td, Em }, 0 },
4333 },
4334
260cd341
LC
4335 /* X86_64_VEX_0F3849 */
4336 {
4337 { Bad_Opcode },
4338 { PREFIX_TABLE (PREFIX_VEX_0F3849_X86_64) },
4339 },
4340
4341 /* X86_64_VEX_0F384B */
4342 {
4343 { Bad_Opcode },
4344 { PREFIX_TABLE (PREFIX_VEX_0F384B_X86_64) },
4345 },
4346
4347 /* X86_64_VEX_0F385C */
4348 {
4349 { Bad_Opcode },
4350 { PREFIX_TABLE (PREFIX_VEX_0F385C_X86_64) },
4351 },
4352
4353 /* X86_64_VEX_0F385E */
4354 {
4355 { Bad_Opcode },
4356 { PREFIX_TABLE (PREFIX_VEX_0F385E_X86_64) },
4357 },
f64c42a9
LC
4358
4359 /* X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1 */
4360 {
4361 { Bad_Opcode },
4362 { "uiret", { Skip_MODRM }, 0 },
4363 },
4364
4365 /* X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1 */
4366 {
4367 { Bad_Opcode },
4368 { "testui", { Skip_MODRM }, 0 },
4369 },
4370
4371 /* X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1 */
4372 {
4373 { Bad_Opcode },
4374 { "clui", { Skip_MODRM }, 0 },
4375 },
4376
4377 /* X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1 */
4378 {
4379 { Bad_Opcode },
4380 { "stui", { Skip_MODRM }, 0 },
4381 },
4382
646cc3e0
GG
4383 /* X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1 */
4384 {
4385 { Bad_Opcode },
4386 { "rmpadjust", { Skip_MODRM }, 0 },
4387 },
4388
4389 /* X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3 */
4390 {
4391 { Bad_Opcode },
4392 { "rmpupdate", { Skip_MODRM }, 0 },
4393 },
4394
4395 /* X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1 */
4396 {
4397 { Bad_Opcode },
4398 { "psmash", { Skip_MODRM }, 0 },
4399 },
4400
f64c42a9
LC
4401 /* X86_64_0FC7_REG_6_MOD_3_PREFIX_1 */
4402 {
4403 { Bad_Opcode },
4404 { "senduipi", { Eq }, 0 },
4405 },
c0f3af97
L
4406};
4407
4408static const struct dis386 three_byte_table[][256] = {
c1e679ec
DR
4409
4410 /* THREE_BYTE_0F38 */
c0f3af97
L
4411 {
4412 /* 00 */
507bd325
L
4413 { "pshufb", { MX, EM }, PREFIX_OPCODE },
4414 { "phaddw", { MX, EM }, PREFIX_OPCODE },
4415 { "phaddd", { MX, EM }, PREFIX_OPCODE },
4416 { "phaddsw", { MX, EM }, PREFIX_OPCODE },
4417 { "pmaddubsw", { MX, EM }, PREFIX_OPCODE },
4418 { "phsubw", { MX, EM }, PREFIX_OPCODE },
4419 { "phsubd", { MX, EM }, PREFIX_OPCODE },
4420 { "phsubsw", { MX, EM }, PREFIX_OPCODE },
c0f3af97 4421 /* 08 */
507bd325
L
4422 { "psignb", { MX, EM }, PREFIX_OPCODE },
4423 { "psignw", { MX, EM }, PREFIX_OPCODE },
4424 { "psignd", { MX, EM }, PREFIX_OPCODE },
4425 { "pmulhrsw", { MX, EM }, PREFIX_OPCODE },
592d1631
L
4426 { Bad_Opcode },
4427 { Bad_Opcode },
4428 { Bad_Opcode },
4429 { Bad_Opcode },
f88c9eb0 4430 /* 10 */
7531c613 4431 { "pblendvb", { XM, EXx, XMM0 }, PREFIX_DATA },
592d1631
L
4432 { Bad_Opcode },
4433 { Bad_Opcode },
4434 { Bad_Opcode },
7531c613
JB
4435 { "blendvps", { XM, EXx, XMM0 }, PREFIX_DATA },
4436 { "blendvpd", { XM, EXx, XMM0 }, PREFIX_DATA },
592d1631 4437 { Bad_Opcode },
7531c613 4438 { "ptest", { XM, EXx }, PREFIX_DATA },
f88c9eb0 4439 /* 18 */
592d1631
L
4440 { Bad_Opcode },
4441 { Bad_Opcode },
4442 { Bad_Opcode },
4443 { Bad_Opcode },
507bd325
L
4444 { "pabsb", { MX, EM }, PREFIX_OPCODE },
4445 { "pabsw", { MX, EM }, PREFIX_OPCODE },
4446 { "pabsd", { MX, EM }, PREFIX_OPCODE },
592d1631 4447 { Bad_Opcode },
f88c9eb0 4448 /* 20 */
7531c613
JB
4449 { "pmovsxbw", { XM, EXq }, PREFIX_DATA },
4450 { "pmovsxbd", { XM, EXd }, PREFIX_DATA },
4451 { "pmovsxbq", { XM, EXw }, PREFIX_DATA },
4452 { "pmovsxwd", { XM, EXq }, PREFIX_DATA },
4453 { "pmovsxwq", { XM, EXd }, PREFIX_DATA },
4454 { "pmovsxdq", { XM, EXq }, PREFIX_DATA },
592d1631
L
4455 { Bad_Opcode },
4456 { Bad_Opcode },
f88c9eb0 4457 /* 28 */
7531c613
JB
4458 { "pmuldq", { XM, EXx }, PREFIX_DATA },
4459 { "pcmpeqq", { XM, EXx }, PREFIX_DATA },
4460 { MOD_TABLE (MOD_0F382A) },
4461 { "packusdw", { XM, EXx }, PREFIX_DATA },
592d1631
L
4462 { Bad_Opcode },
4463 { Bad_Opcode },
4464 { Bad_Opcode },
4465 { Bad_Opcode },
f88c9eb0 4466 /* 30 */
7531c613
JB
4467 { "pmovzxbw", { XM, EXq }, PREFIX_DATA },
4468 { "pmovzxbd", { XM, EXd }, PREFIX_DATA },
4469 { "pmovzxbq", { XM, EXw }, PREFIX_DATA },
4470 { "pmovzxwd", { XM, EXq }, PREFIX_DATA },
4471 { "pmovzxwq", { XM, EXd }, PREFIX_DATA },
4472 { "pmovzxdq", { XM, EXq }, PREFIX_DATA },
4473 { Bad_Opcode },
4474 { "pcmpgtq", { XM, EXx }, PREFIX_DATA },
f88c9eb0 4475 /* 38 */
7531c613
JB
4476 { "pminsb", { XM, EXx }, PREFIX_DATA },
4477 { "pminsd", { XM, EXx }, PREFIX_DATA },
4478 { "pminuw", { XM, EXx }, PREFIX_DATA },
4479 { "pminud", { XM, EXx }, PREFIX_DATA },
4480 { "pmaxsb", { XM, EXx }, PREFIX_DATA },
4481 { "pmaxsd", { XM, EXx }, PREFIX_DATA },
4482 { "pmaxuw", { XM, EXx }, PREFIX_DATA },
4483 { "pmaxud", { XM, EXx }, PREFIX_DATA },
f88c9eb0 4484 /* 40 */
7531c613
JB
4485 { "pmulld", { XM, EXx }, PREFIX_DATA },
4486 { "phminposuw", { XM, EXx }, PREFIX_DATA },
592d1631
L
4487 { Bad_Opcode },
4488 { Bad_Opcode },
4489 { Bad_Opcode },
4490 { Bad_Opcode },
4491 { Bad_Opcode },
4492 { Bad_Opcode },
f88c9eb0 4493 /* 48 */
592d1631
L
4494 { Bad_Opcode },
4495 { Bad_Opcode },
4496 { Bad_Opcode },
4497 { Bad_Opcode },
4498 { Bad_Opcode },
4499 { Bad_Opcode },
4500 { Bad_Opcode },
4501 { Bad_Opcode },
f88c9eb0 4502 /* 50 */
592d1631
L
4503 { Bad_Opcode },
4504 { Bad_Opcode },
4505 { Bad_Opcode },
4506 { Bad_Opcode },
4507 { Bad_Opcode },
4508 { Bad_Opcode },
4509 { Bad_Opcode },
4510 { Bad_Opcode },
f88c9eb0 4511 /* 58 */
592d1631
L
4512 { Bad_Opcode },
4513 { Bad_Opcode },
4514 { Bad_Opcode },
4515 { Bad_Opcode },
4516 { Bad_Opcode },
4517 { Bad_Opcode },
4518 { Bad_Opcode },
4519 { Bad_Opcode },
f88c9eb0 4520 /* 60 */
592d1631
L
4521 { Bad_Opcode },
4522 { Bad_Opcode },
4523 { Bad_Opcode },
4524 { Bad_Opcode },
4525 { Bad_Opcode },
4526 { Bad_Opcode },
4527 { Bad_Opcode },
4528 { Bad_Opcode },
f88c9eb0 4529 /* 68 */
592d1631
L
4530 { Bad_Opcode },
4531 { Bad_Opcode },
4532 { Bad_Opcode },
4533 { Bad_Opcode },
4534 { Bad_Opcode },
4535 { Bad_Opcode },
4536 { Bad_Opcode },
4537 { Bad_Opcode },
f88c9eb0 4538 /* 70 */
592d1631
L
4539 { Bad_Opcode },
4540 { Bad_Opcode },
4541 { Bad_Opcode },
4542 { Bad_Opcode },
4543 { Bad_Opcode },
4544 { Bad_Opcode },
4545 { Bad_Opcode },
4546 { Bad_Opcode },
f88c9eb0 4547 /* 78 */
592d1631
L
4548 { Bad_Opcode },
4549 { Bad_Opcode },
4550 { Bad_Opcode },
4551 { Bad_Opcode },
4552 { Bad_Opcode },
4553 { Bad_Opcode },
4554 { Bad_Opcode },
4555 { Bad_Opcode },
f88c9eb0 4556 /* 80 */
7531c613
JB
4557 { "invept", { Gm, Mo }, PREFIX_DATA },
4558 { "invvpid", { Gm, Mo }, PREFIX_DATA },
4559 { "invpcid", { Gm, M }, PREFIX_DATA },
592d1631
L
4560 { Bad_Opcode },
4561 { Bad_Opcode },
4562 { Bad_Opcode },
4563 { Bad_Opcode },
4564 { Bad_Opcode },
f88c9eb0 4565 /* 88 */
592d1631
L
4566 { Bad_Opcode },
4567 { Bad_Opcode },
4568 { Bad_Opcode },
4569 { Bad_Opcode },
4570 { Bad_Opcode },
4571 { Bad_Opcode },
4572 { Bad_Opcode },
4573 { Bad_Opcode },
f88c9eb0 4574 /* 90 */
592d1631
L
4575 { Bad_Opcode },
4576 { Bad_Opcode },
4577 { Bad_Opcode },
4578 { Bad_Opcode },
4579 { Bad_Opcode },
4580 { Bad_Opcode },
4581 { Bad_Opcode },
4582 { Bad_Opcode },
f88c9eb0 4583 /* 98 */
592d1631
L
4584 { Bad_Opcode },
4585 { Bad_Opcode },
4586 { Bad_Opcode },
4587 { Bad_Opcode },
4588 { Bad_Opcode },
4589 { Bad_Opcode },
4590 { Bad_Opcode },
4591 { Bad_Opcode },
f88c9eb0 4592 /* a0 */
592d1631
L
4593 { Bad_Opcode },
4594 { Bad_Opcode },
4595 { Bad_Opcode },
4596 { Bad_Opcode },
4597 { Bad_Opcode },
4598 { Bad_Opcode },
4599 { Bad_Opcode },
4600 { Bad_Opcode },
f88c9eb0 4601 /* a8 */
592d1631
L
4602 { Bad_Opcode },
4603 { Bad_Opcode },
4604 { Bad_Opcode },
4605 { Bad_Opcode },
4606 { Bad_Opcode },
4607 { Bad_Opcode },
4608 { Bad_Opcode },
4609 { Bad_Opcode },
f88c9eb0 4610 /* b0 */
592d1631
L
4611 { Bad_Opcode },
4612 { Bad_Opcode },
4613 { Bad_Opcode },
4614 { Bad_Opcode },
4615 { Bad_Opcode },
4616 { Bad_Opcode },
4617 { Bad_Opcode },
4618 { Bad_Opcode },
f88c9eb0 4619 /* b8 */
592d1631
L
4620 { Bad_Opcode },
4621 { Bad_Opcode },
4622 { Bad_Opcode },
4623 { Bad_Opcode },
4624 { Bad_Opcode },
4625 { Bad_Opcode },
4626 { Bad_Opcode },
4627 { Bad_Opcode },
f88c9eb0 4628 /* c0 */
592d1631
L
4629 { Bad_Opcode },
4630 { Bad_Opcode },
4631 { Bad_Opcode },
4632 { Bad_Opcode },
4633 { Bad_Opcode },
4634 { Bad_Opcode },
4635 { Bad_Opcode },
4636 { Bad_Opcode },
f88c9eb0 4637 /* c8 */
035e7389
JB
4638 { "sha1nexte", { XM, EXxmm }, PREFIX_OPCODE },
4639 { "sha1msg1", { XM, EXxmm }, PREFIX_OPCODE },
4640 { "sha1msg2", { XM, EXxmm }, PREFIX_OPCODE },
4641 { "sha256rnds2", { XM, EXxmm, XMM0 }, PREFIX_OPCODE },
4642 { "sha256msg1", { XM, EXxmm }, PREFIX_OPCODE },
4643 { "sha256msg2", { XM, EXxmm }, PREFIX_OPCODE },
592d1631 4644 { Bad_Opcode },
7531c613 4645 { "gf2p8mulb", { XM, EXxmm }, PREFIX_DATA },
f88c9eb0 4646 /* d0 */
592d1631
L
4647 { Bad_Opcode },
4648 { Bad_Opcode },
4649 { Bad_Opcode },
4650 { Bad_Opcode },
4651 { Bad_Opcode },
4652 { Bad_Opcode },
4653 { Bad_Opcode },
4654 { Bad_Opcode },
f88c9eb0 4655 /* d8 */
c4694f17 4656 { PREFIX_TABLE (PREFIX_0F38D8) },
592d1631
L
4657 { Bad_Opcode },
4658 { Bad_Opcode },
7531c613 4659 { "aesimc", { XM, EXx }, PREFIX_DATA },
c4694f17
TG
4660 { PREFIX_TABLE (PREFIX_0F38DC) },
4661 { PREFIX_TABLE (PREFIX_0F38DD) },
4662 { PREFIX_TABLE (PREFIX_0F38DE) },
4663 { PREFIX_TABLE (PREFIX_0F38DF) },
f88c9eb0 4664 /* e0 */
592d1631
L
4665 { Bad_Opcode },
4666 { Bad_Opcode },
4667 { Bad_Opcode },
4668 { Bad_Opcode },
4669 { Bad_Opcode },
4670 { Bad_Opcode },
4671 { Bad_Opcode },
4672 { Bad_Opcode },
f88c9eb0 4673 /* e8 */
592d1631
L
4674 { Bad_Opcode },
4675 { Bad_Opcode },
4676 { Bad_Opcode },
4677 { Bad_Opcode },
4678 { Bad_Opcode },
4679 { Bad_Opcode },
4680 { Bad_Opcode },
4681 { Bad_Opcode },
f88c9eb0
SP
4682 /* f0 */
4683 { PREFIX_TABLE (PREFIX_0F38F0) },
4684 { PREFIX_TABLE (PREFIX_0F38F1) },
592d1631
L
4685 { Bad_Opcode },
4686 { Bad_Opcode },
4687 { Bad_Opcode },
7531c613 4688 { MOD_TABLE (MOD_0F38F5) },
e2e1fcde 4689 { PREFIX_TABLE (PREFIX_0F38F6) },
592d1631 4690 { Bad_Opcode },
f88c9eb0 4691 /* f8 */
c0a30a9f 4692 { PREFIX_TABLE (PREFIX_0F38F8) },
035e7389 4693 { MOD_TABLE (MOD_0F38F9) },
c4694f17
TG
4694 { PREFIX_TABLE (PREFIX_0F38FA) },
4695 { PREFIX_TABLE (PREFIX_0F38FB) },
592d1631
L
4696 { Bad_Opcode },
4697 { Bad_Opcode },
4698 { Bad_Opcode },
4699 { Bad_Opcode },
f88c9eb0
SP
4700 },
4701 /* THREE_BYTE_0F3A */
4702 {
4703 /* 00 */
592d1631
L
4704 { Bad_Opcode },
4705 { Bad_Opcode },
4706 { Bad_Opcode },
4707 { Bad_Opcode },
4708 { Bad_Opcode },
4709 { Bad_Opcode },
4710 { Bad_Opcode },
4711 { Bad_Opcode },
f88c9eb0 4712 /* 08 */
7531c613
JB
4713 { "roundps", { XM, EXx, Ib }, PREFIX_DATA },
4714 { "roundpd", { XM, EXx, Ib }, PREFIX_DATA },
4715 { "roundss", { XM, EXd, Ib }, PREFIX_DATA },
4716 { "roundsd", { XM, EXq, Ib }, PREFIX_DATA },
4717 { "blendps", { XM, EXx, Ib }, PREFIX_DATA },
4718 { "blendpd", { XM, EXx, Ib }, PREFIX_DATA },
4719 { "pblendw", { XM, EXx, Ib }, PREFIX_DATA },
507bd325 4720 { "palignr", { MX, EM, Ib }, PREFIX_OPCODE },
f88c9eb0 4721 /* 10 */
592d1631
L
4722 { Bad_Opcode },
4723 { Bad_Opcode },
4724 { Bad_Opcode },
4725 { Bad_Opcode },
7531c613
JB
4726 { "pextrb", { Edqb, XM, Ib }, PREFIX_DATA },
4727 { "pextrw", { Edqw, XM, Ib }, PREFIX_DATA },
4728 { "pextrK", { Edq, XM, Ib }, PREFIX_DATA },
4729 { "extractps", { Edqd, XM, Ib }, PREFIX_DATA },
f88c9eb0 4730 /* 18 */
592d1631
L
4731 { Bad_Opcode },
4732 { Bad_Opcode },
4733 { Bad_Opcode },
4734 { Bad_Opcode },
4735 { Bad_Opcode },
4736 { Bad_Opcode },
4737 { Bad_Opcode },
4738 { Bad_Opcode },
f88c9eb0 4739 /* 20 */
7531c613
JB
4740 { "pinsrb", { XM, Edqb, Ib }, PREFIX_DATA },
4741 { "insertps", { XM, EXd, Ib }, PREFIX_DATA },
4742 { "pinsrK", { XM, Edq, Ib }, PREFIX_DATA },
592d1631
L
4743 { Bad_Opcode },
4744 { Bad_Opcode },
4745 { Bad_Opcode },
4746 { Bad_Opcode },
4747 { Bad_Opcode },
f88c9eb0 4748 /* 28 */
592d1631
L
4749 { Bad_Opcode },
4750 { Bad_Opcode },
4751 { Bad_Opcode },
4752 { Bad_Opcode },
4753 { Bad_Opcode },
4754 { Bad_Opcode },
4755 { Bad_Opcode },
4756 { Bad_Opcode },
f88c9eb0 4757 /* 30 */
592d1631
L
4758 { Bad_Opcode },
4759 { Bad_Opcode },
4760 { Bad_Opcode },
4761 { Bad_Opcode },
4762 { Bad_Opcode },
4763 { Bad_Opcode },
4764 { Bad_Opcode },
4765 { Bad_Opcode },
f88c9eb0 4766 /* 38 */
592d1631
L
4767 { Bad_Opcode },
4768 { Bad_Opcode },
4769 { Bad_Opcode },
4770 { Bad_Opcode },
4771 { Bad_Opcode },
4772 { Bad_Opcode },
4773 { Bad_Opcode },
4774 { Bad_Opcode },
f88c9eb0 4775 /* 40 */
7531c613
JB
4776 { "dpps", { XM, EXx, Ib }, PREFIX_DATA },
4777 { "dppd", { XM, EXx, Ib }, PREFIX_DATA },
4778 { "mpsadbw", { XM, EXx, Ib }, PREFIX_DATA },
592d1631 4779 { Bad_Opcode },
7531c613 4780 { "pclmulqdq", { XM, EXx, PCLMUL }, PREFIX_DATA },
592d1631
L
4781 { Bad_Opcode },
4782 { Bad_Opcode },
4783 { Bad_Opcode },
f88c9eb0 4784 /* 48 */
592d1631
L
4785 { Bad_Opcode },
4786 { Bad_Opcode },
4787 { Bad_Opcode },
4788 { Bad_Opcode },
4789 { Bad_Opcode },
4790 { Bad_Opcode },
4791 { Bad_Opcode },
4792 { Bad_Opcode },
f88c9eb0 4793 /* 50 */
592d1631
L
4794 { Bad_Opcode },
4795 { Bad_Opcode },
4796 { Bad_Opcode },
4797 { Bad_Opcode },
4798 { Bad_Opcode },
4799 { Bad_Opcode },
4800 { Bad_Opcode },
4801 { Bad_Opcode },
f88c9eb0 4802 /* 58 */
592d1631
L
4803 { Bad_Opcode },
4804 { Bad_Opcode },
4805 { Bad_Opcode },
4806 { Bad_Opcode },
4807 { Bad_Opcode },
4808 { Bad_Opcode },
4809 { Bad_Opcode },
4810 { Bad_Opcode },
f88c9eb0 4811 /* 60 */
7531c613
JB
4812 { "pcmpestrm!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
4813 { "pcmpestri!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
4814 { "pcmpistrm", { XM, EXx, Ib }, PREFIX_DATA },
4815 { "pcmpistri", { XM, EXx, Ib }, PREFIX_DATA },
592d1631
L
4816 { Bad_Opcode },
4817 { Bad_Opcode },
4818 { Bad_Opcode },
4819 { Bad_Opcode },
f88c9eb0 4820 /* 68 */
592d1631
L
4821 { Bad_Opcode },
4822 { Bad_Opcode },
4823 { Bad_Opcode },
4824 { Bad_Opcode },
4825 { Bad_Opcode },
4826 { Bad_Opcode },
4827 { Bad_Opcode },
4828 { Bad_Opcode },
f88c9eb0 4829 /* 70 */
592d1631
L
4830 { Bad_Opcode },
4831 { Bad_Opcode },
4832 { Bad_Opcode },
4833 { Bad_Opcode },
4834 { Bad_Opcode },
4835 { Bad_Opcode },
4836 { Bad_Opcode },
4837 { Bad_Opcode },
f88c9eb0 4838 /* 78 */
592d1631
L
4839 { Bad_Opcode },
4840 { Bad_Opcode },
4841 { Bad_Opcode },
4842 { Bad_Opcode },
4843 { Bad_Opcode },
4844 { Bad_Opcode },
4845 { Bad_Opcode },
4846 { Bad_Opcode },
f88c9eb0 4847 /* 80 */
592d1631
L
4848 { Bad_Opcode },
4849 { Bad_Opcode },
4850 { Bad_Opcode },
4851 { Bad_Opcode },
4852 { Bad_Opcode },
4853 { Bad_Opcode },
4854 { Bad_Opcode },
4855 { Bad_Opcode },
f88c9eb0 4856 /* 88 */
592d1631
L
4857 { Bad_Opcode },
4858 { Bad_Opcode },
4859 { Bad_Opcode },
4860 { Bad_Opcode },
4861 { Bad_Opcode },
4862 { Bad_Opcode },
4863 { Bad_Opcode },
4864 { Bad_Opcode },
f88c9eb0 4865 /* 90 */
592d1631
L
4866 { Bad_Opcode },
4867 { Bad_Opcode },
4868 { Bad_Opcode },
4869 { Bad_Opcode },
4870 { Bad_Opcode },
4871 { Bad_Opcode },
4872 { Bad_Opcode },
4873 { Bad_Opcode },
f88c9eb0 4874 /* 98 */
592d1631
L
4875 { Bad_Opcode },
4876 { Bad_Opcode },
4877 { Bad_Opcode },
4878 { Bad_Opcode },
4879 { Bad_Opcode },
4880 { Bad_Opcode },
4881 { Bad_Opcode },
4882 { Bad_Opcode },
f88c9eb0 4883 /* a0 */
592d1631
L
4884 { Bad_Opcode },
4885 { Bad_Opcode },
4886 { Bad_Opcode },
4887 { Bad_Opcode },
4888 { Bad_Opcode },
4889 { Bad_Opcode },
4890 { Bad_Opcode },
4891 { Bad_Opcode },
f88c9eb0 4892 /* a8 */
592d1631
L
4893 { Bad_Opcode },
4894 { Bad_Opcode },
4895 { Bad_Opcode },
4896 { Bad_Opcode },
4897 { Bad_Opcode },
4898 { Bad_Opcode },
4899 { Bad_Opcode },
4900 { Bad_Opcode },
f88c9eb0 4901 /* b0 */
592d1631
L
4902 { Bad_Opcode },
4903 { Bad_Opcode },
4904 { Bad_Opcode },
4905 { Bad_Opcode },
4906 { Bad_Opcode },
4907 { Bad_Opcode },
4908 { Bad_Opcode },
4909 { Bad_Opcode },
f88c9eb0 4910 /* b8 */
592d1631
L
4911 { Bad_Opcode },
4912 { Bad_Opcode },
4913 { Bad_Opcode },
4914 { Bad_Opcode },
4915 { Bad_Opcode },
4916 { Bad_Opcode },
4917 { Bad_Opcode },
4918 { Bad_Opcode },
f88c9eb0 4919 /* c0 */
592d1631
L
4920 { Bad_Opcode },
4921 { Bad_Opcode },
4922 { Bad_Opcode },
4923 { Bad_Opcode },
4924 { Bad_Opcode },
4925 { Bad_Opcode },
4926 { Bad_Opcode },
4927 { Bad_Opcode },
f88c9eb0 4928 /* c8 */
592d1631
L
4929 { Bad_Opcode },
4930 { Bad_Opcode },
4931 { Bad_Opcode },
4932 { Bad_Opcode },
035e7389 4933 { "sha1rnds4", { XM, EXxmm, Ib }, PREFIX_OPCODE },
592d1631 4934 { Bad_Opcode },
7531c613
JB
4935 { "gf2p8affineqb", { XM, EXxmm, Ib }, PREFIX_DATA },
4936 { "gf2p8affineinvqb", { XM, EXxmm, Ib }, PREFIX_DATA },
f88c9eb0 4937 /* d0 */
592d1631
L
4938 { Bad_Opcode },
4939 { Bad_Opcode },
4940 { Bad_Opcode },
4941 { Bad_Opcode },
4942 { Bad_Opcode },
4943 { Bad_Opcode },
4944 { Bad_Opcode },
4945 { Bad_Opcode },
f88c9eb0 4946 /* d8 */
592d1631
L
4947 { Bad_Opcode },
4948 { Bad_Opcode },
4949 { Bad_Opcode },
4950 { Bad_Opcode },
4951 { Bad_Opcode },
4952 { Bad_Opcode },
4953 { Bad_Opcode },
7531c613 4954 { "aeskeygenassist", { XM, EXx, Ib }, PREFIX_DATA },
f88c9eb0 4955 /* e0 */
592d1631
L
4956 { Bad_Opcode },
4957 { Bad_Opcode },
4958 { Bad_Opcode },
4959 { Bad_Opcode },
4960 { Bad_Opcode },
592d1631
L
4961 { Bad_Opcode },
4962 { Bad_Opcode },
4963 { Bad_Opcode },
85f10a01 4964 /* e8 */
592d1631
L
4965 { Bad_Opcode },
4966 { Bad_Opcode },
4967 { Bad_Opcode },
4968 { Bad_Opcode },
4969 { Bad_Opcode },
4970 { Bad_Opcode },
4971 { Bad_Opcode },
4972 { Bad_Opcode },
85f10a01 4973 /* f0 */
c1fa250a 4974 { PREFIX_TABLE (PREFIX_0F3A0F) },
592d1631
L
4975 { Bad_Opcode },
4976 { Bad_Opcode },
4977 { Bad_Opcode },
4978 { Bad_Opcode },
4979 { Bad_Opcode },
4980 { Bad_Opcode },
4981 { Bad_Opcode },
85f10a01 4982 /* f8 */
592d1631
L
4983 { Bad_Opcode },
4984 { Bad_Opcode },
4985 { Bad_Opcode },
4986 { Bad_Opcode },
4987 { Bad_Opcode },
4988 { Bad_Opcode },
4989 { Bad_Opcode },
4990 { Bad_Opcode },
85f10a01 4991 },
f88c9eb0
SP
4992};
4993
4994static const struct dis386 xop_table[][256] = {
5dd85c99 4995 /* XOP_08 */
85f10a01
MM
4996 {
4997 /* 00 */
592d1631
L
4998 { Bad_Opcode },
4999 { Bad_Opcode },
5000 { Bad_Opcode },
5001 { Bad_Opcode },
5002 { Bad_Opcode },
5003 { Bad_Opcode },
5004 { Bad_Opcode },
5005 { Bad_Opcode },
85f10a01 5006 /* 08 */
592d1631
L
5007 { Bad_Opcode },
5008 { Bad_Opcode },
5009 { Bad_Opcode },
5010 { Bad_Opcode },
5011 { Bad_Opcode },
5012 { Bad_Opcode },
5013 { Bad_Opcode },
5014 { Bad_Opcode },
85f10a01 5015 /* 10 */
3929df09 5016 { Bad_Opcode },
592d1631
L
5017 { Bad_Opcode },
5018 { Bad_Opcode },
5019 { Bad_Opcode },
5020 { Bad_Opcode },
5021 { Bad_Opcode },
5022 { Bad_Opcode },
5023 { Bad_Opcode },
85f10a01 5024 /* 18 */
592d1631
L
5025 { Bad_Opcode },
5026 { Bad_Opcode },
5027 { Bad_Opcode },
5028 { Bad_Opcode },
5029 { Bad_Opcode },
5030 { Bad_Opcode },
5031 { Bad_Opcode },
5032 { Bad_Opcode },
85f10a01 5033 /* 20 */
592d1631
L
5034 { Bad_Opcode },
5035 { Bad_Opcode },
5036 { Bad_Opcode },
5037 { Bad_Opcode },
5038 { Bad_Opcode },
5039 { Bad_Opcode },
5040 { Bad_Opcode },
5041 { Bad_Opcode },
85f10a01 5042 /* 28 */
592d1631
L
5043 { Bad_Opcode },
5044 { Bad_Opcode },
5045 { Bad_Opcode },
5046 { Bad_Opcode },
5047 { Bad_Opcode },
5048 { Bad_Opcode },
5049 { Bad_Opcode },
5050 { Bad_Opcode },
c0f3af97 5051 /* 30 */
592d1631
L
5052 { Bad_Opcode },
5053 { Bad_Opcode },
5054 { Bad_Opcode },
5055 { Bad_Opcode },
5056 { Bad_Opcode },
5057 { Bad_Opcode },
5058 { Bad_Opcode },
5059 { Bad_Opcode },
c0f3af97 5060 /* 38 */
592d1631
L
5061 { Bad_Opcode },
5062 { Bad_Opcode },
5063 { Bad_Opcode },
5064 { Bad_Opcode },
5065 { Bad_Opcode },
5066 { Bad_Opcode },
5067 { Bad_Opcode },
5068 { Bad_Opcode },
c0f3af97 5069 /* 40 */
592d1631
L
5070 { Bad_Opcode },
5071 { Bad_Opcode },
5072 { Bad_Opcode },
5073 { Bad_Opcode },
5074 { Bad_Opcode },
5075 { Bad_Opcode },
5076 { Bad_Opcode },
5077 { Bad_Opcode },
85f10a01 5078 /* 48 */
592d1631
L
5079 { Bad_Opcode },
5080 { Bad_Opcode },
5081 { Bad_Opcode },
5082 { Bad_Opcode },
5083 { Bad_Opcode },
5084 { Bad_Opcode },
5085 { Bad_Opcode },
5086 { Bad_Opcode },
c0f3af97 5087 /* 50 */
592d1631
L
5088 { Bad_Opcode },
5089 { Bad_Opcode },
5090 { Bad_Opcode },
5091 { Bad_Opcode },
5092 { Bad_Opcode },
5093 { Bad_Opcode },
5094 { Bad_Opcode },
5095 { Bad_Opcode },
85f10a01 5096 /* 58 */
592d1631
L
5097 { Bad_Opcode },
5098 { Bad_Opcode },
5099 { Bad_Opcode },
5100 { Bad_Opcode },
5101 { Bad_Opcode },
5102 { Bad_Opcode },
5103 { Bad_Opcode },
5104 { Bad_Opcode },
c1e679ec 5105 /* 60 */
592d1631
L
5106 { Bad_Opcode },
5107 { Bad_Opcode },
5108 { Bad_Opcode },
5109 { Bad_Opcode },
5110 { Bad_Opcode },
5111 { Bad_Opcode },
5112 { Bad_Opcode },
5113 { Bad_Opcode },
c0f3af97 5114 /* 68 */
592d1631
L
5115 { Bad_Opcode },
5116 { Bad_Opcode },
5117 { Bad_Opcode },
5118 { Bad_Opcode },
5119 { Bad_Opcode },
5120 { Bad_Opcode },
5121 { Bad_Opcode },
5122 { Bad_Opcode },
85f10a01 5123 /* 70 */
592d1631
L
5124 { Bad_Opcode },
5125 { Bad_Opcode },
5126 { Bad_Opcode },
5127 { Bad_Opcode },
5128 { Bad_Opcode },
5129 { Bad_Opcode },
5130 { Bad_Opcode },
5131 { Bad_Opcode },
85f10a01 5132 /* 78 */
592d1631
L
5133 { Bad_Opcode },
5134 { Bad_Opcode },
5135 { Bad_Opcode },
5136 { Bad_Opcode },
5137 { Bad_Opcode },
5138 { Bad_Opcode },
5139 { Bad_Opcode },
5140 { Bad_Opcode },
85f10a01 5141 /* 80 */
592d1631
L
5142 { Bad_Opcode },
5143 { Bad_Opcode },
5144 { Bad_Opcode },
5145 { Bad_Opcode },
5146 { Bad_Opcode },
467bbef0
JB
5147 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_85) },
5148 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_86) },
5149 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_87) },
5dd85c99 5150 /* 88 */
592d1631
L
5151 { Bad_Opcode },
5152 { Bad_Opcode },
5153 { Bad_Opcode },
5154 { Bad_Opcode },
5155 { Bad_Opcode },
5156 { Bad_Opcode },
467bbef0
JB
5157 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_8E) },
5158 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_8F) },
5dd85c99 5159 /* 90 */
592d1631
L
5160 { Bad_Opcode },
5161 { Bad_Opcode },
5162 { Bad_Opcode },
5163 { Bad_Opcode },
5164 { Bad_Opcode },
467bbef0
JB
5165 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_95) },
5166 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_96) },
5167 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_97) },
5dd85c99 5168 /* 98 */
592d1631
L
5169 { Bad_Opcode },
5170 { Bad_Opcode },
5171 { Bad_Opcode },
5172 { Bad_Opcode },
5173 { Bad_Opcode },
5174 { Bad_Opcode },
467bbef0
JB
5175 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_9E) },
5176 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_9F) },
5dd85c99 5177 /* a0 */
592d1631
L
5178 { Bad_Opcode },
5179 { Bad_Opcode },
b13b1bc0 5180 { "vpcmov", { XM, Vex, EXx, XMVexI4 }, 0 },
467bbef0 5181 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_A3) },
592d1631
L
5182 { Bad_Opcode },
5183 { Bad_Opcode },
467bbef0 5184 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_A6) },
592d1631 5185 { Bad_Opcode },
5dd85c99 5186 /* a8 */
592d1631
L
5187 { Bad_Opcode },
5188 { Bad_Opcode },
5189 { Bad_Opcode },
5190 { Bad_Opcode },
5191 { Bad_Opcode },
5192 { Bad_Opcode },
5193 { Bad_Opcode },
5194 { Bad_Opcode },
5dd85c99 5195 /* b0 */
592d1631
L
5196 { Bad_Opcode },
5197 { Bad_Opcode },
5198 { Bad_Opcode },
5199 { Bad_Opcode },
5200 { Bad_Opcode },
5201 { Bad_Opcode },
467bbef0 5202 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_B6) },
592d1631 5203 { Bad_Opcode },
5dd85c99 5204 /* b8 */
592d1631
L
5205 { Bad_Opcode },
5206 { Bad_Opcode },
5207 { Bad_Opcode },
5208 { Bad_Opcode },
5209 { Bad_Opcode },
5210 { Bad_Opcode },
5211 { Bad_Opcode },
5212 { Bad_Opcode },
5dd85c99 5213 /* c0 */
467bbef0
JB
5214 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C0) },
5215 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C1) },
5216 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C2) },
5217 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C3) },
592d1631
L
5218 { Bad_Opcode },
5219 { Bad_Opcode },
5220 { Bad_Opcode },
5221 { Bad_Opcode },
5dd85c99 5222 /* c8 */
592d1631
L
5223 { Bad_Opcode },
5224 { Bad_Opcode },
5225 { Bad_Opcode },
5226 { Bad_Opcode },
ff688e1f
L
5227 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CC) },
5228 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CD) },
5229 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CE) },
5230 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CF) },
5dd85c99 5231 /* d0 */
592d1631
L
5232 { Bad_Opcode },
5233 { Bad_Opcode },
5234 { Bad_Opcode },
5235 { Bad_Opcode },
5236 { Bad_Opcode },
5237 { Bad_Opcode },
5238 { Bad_Opcode },
5239 { Bad_Opcode },
5dd85c99 5240 /* d8 */
592d1631
L
5241 { Bad_Opcode },
5242 { Bad_Opcode },
5243 { Bad_Opcode },
5244 { Bad_Opcode },
5245 { Bad_Opcode },
5246 { Bad_Opcode },
5247 { Bad_Opcode },
5248 { Bad_Opcode },
5dd85c99 5249 /* e0 */
592d1631
L
5250 { Bad_Opcode },
5251 { Bad_Opcode },
5252 { Bad_Opcode },
5253 { Bad_Opcode },
5254 { Bad_Opcode },
5255 { Bad_Opcode },
5256 { Bad_Opcode },
5257 { Bad_Opcode },
5dd85c99 5258 /* e8 */
592d1631
L
5259 { Bad_Opcode },
5260 { Bad_Opcode },
5261 { Bad_Opcode },
5262 { Bad_Opcode },
ff688e1f
L
5263 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EC) },
5264 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_ED) },
5265 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EE) },
5266 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EF) },
5dd85c99 5267 /* f0 */
592d1631
L
5268 { Bad_Opcode },
5269 { Bad_Opcode },
5270 { Bad_Opcode },
5271 { Bad_Opcode },
5272 { Bad_Opcode },
5273 { Bad_Opcode },
5274 { Bad_Opcode },
5275 { Bad_Opcode },
5dd85c99 5276 /* f8 */
592d1631
L
5277 { Bad_Opcode },
5278 { Bad_Opcode },
5279 { Bad_Opcode },
5280 { Bad_Opcode },
5281 { Bad_Opcode },
5282 { Bad_Opcode },
5283 { Bad_Opcode },
5284 { Bad_Opcode },
5dd85c99
SP
5285 },
5286 /* XOP_09 */
5287 {
5288 /* 00 */
592d1631 5289 { Bad_Opcode },
467bbef0
JB
5290 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_01) },
5291 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_02) },
592d1631
L
5292 { Bad_Opcode },
5293 { Bad_Opcode },
5294 { Bad_Opcode },
5295 { Bad_Opcode },
5296 { Bad_Opcode },
5dd85c99 5297 /* 08 */
592d1631
L
5298 { Bad_Opcode },
5299 { Bad_Opcode },
5300 { Bad_Opcode },
5301 { Bad_Opcode },
5302 { Bad_Opcode },
5303 { Bad_Opcode },
5304 { Bad_Opcode },
5305 { Bad_Opcode },
5dd85c99 5306 /* 10 */
592d1631
L
5307 { Bad_Opcode },
5308 { Bad_Opcode },
467bbef0 5309 { MOD_TABLE (MOD_VEX_0FXOP_09_12) },
592d1631
L
5310 { Bad_Opcode },
5311 { Bad_Opcode },
5312 { Bad_Opcode },
5313 { Bad_Opcode },
5314 { Bad_Opcode },
5dd85c99 5315 /* 18 */
592d1631
L
5316 { Bad_Opcode },
5317 { Bad_Opcode },
5318 { Bad_Opcode },
5319 { Bad_Opcode },
5320 { Bad_Opcode },
5321 { Bad_Opcode },
5322 { Bad_Opcode },
5323 { Bad_Opcode },
5dd85c99 5324 /* 20 */
592d1631
L
5325 { Bad_Opcode },
5326 { Bad_Opcode },
5327 { Bad_Opcode },
5328 { Bad_Opcode },
5329 { Bad_Opcode },
5330 { Bad_Opcode },
5331 { Bad_Opcode },
5332 { Bad_Opcode },
5dd85c99 5333 /* 28 */
592d1631
L
5334 { Bad_Opcode },
5335 { Bad_Opcode },
5336 { Bad_Opcode },
5337 { Bad_Opcode },
5338 { Bad_Opcode },
5339 { Bad_Opcode },
5340 { Bad_Opcode },
5341 { Bad_Opcode },
5dd85c99 5342 /* 30 */
592d1631
L
5343 { Bad_Opcode },
5344 { Bad_Opcode },
5345 { Bad_Opcode },
5346 { Bad_Opcode },
5347 { Bad_Opcode },
5348 { Bad_Opcode },
5349 { Bad_Opcode },
5350 { Bad_Opcode },
5dd85c99 5351 /* 38 */
592d1631
L
5352 { Bad_Opcode },
5353 { Bad_Opcode },
5354 { Bad_Opcode },
5355 { Bad_Opcode },
5356 { Bad_Opcode },
5357 { Bad_Opcode },
5358 { Bad_Opcode },
5359 { Bad_Opcode },
5dd85c99 5360 /* 40 */
592d1631
L
5361 { Bad_Opcode },
5362 { Bad_Opcode },
5363 { Bad_Opcode },
5364 { Bad_Opcode },
5365 { Bad_Opcode },
5366 { Bad_Opcode },
5367 { Bad_Opcode },
5368 { Bad_Opcode },
5dd85c99 5369 /* 48 */
592d1631
L
5370 { Bad_Opcode },
5371 { Bad_Opcode },
5372 { Bad_Opcode },
5373 { Bad_Opcode },
5374 { Bad_Opcode },
5375 { Bad_Opcode },
5376 { Bad_Opcode },
5377 { Bad_Opcode },
5dd85c99 5378 /* 50 */
592d1631
L
5379 { Bad_Opcode },
5380 { Bad_Opcode },
5381 { Bad_Opcode },
5382 { Bad_Opcode },
5383 { Bad_Opcode },
5384 { Bad_Opcode },
5385 { Bad_Opcode },
5386 { Bad_Opcode },
5dd85c99 5387 /* 58 */
592d1631
L
5388 { Bad_Opcode },
5389 { Bad_Opcode },
5390 { Bad_Opcode },
5391 { Bad_Opcode },
5392 { Bad_Opcode },
5393 { Bad_Opcode },
5394 { Bad_Opcode },
5395 { Bad_Opcode },
5dd85c99 5396 /* 60 */
592d1631
L
5397 { Bad_Opcode },
5398 { Bad_Opcode },
5399 { Bad_Opcode },
5400 { Bad_Opcode },
5401 { Bad_Opcode },
5402 { Bad_Opcode },
5403 { Bad_Opcode },
5404 { Bad_Opcode },
5dd85c99 5405 /* 68 */
592d1631
L
5406 { Bad_Opcode },
5407 { Bad_Opcode },
5408 { Bad_Opcode },
5409 { Bad_Opcode },
5410 { Bad_Opcode },
5411 { Bad_Opcode },
5412 { Bad_Opcode },
5413 { Bad_Opcode },
5dd85c99 5414 /* 70 */
592d1631
L
5415 { Bad_Opcode },
5416 { Bad_Opcode },
5417 { Bad_Opcode },
5418 { Bad_Opcode },
5419 { Bad_Opcode },
5420 { Bad_Opcode },
5421 { Bad_Opcode },
5422 { Bad_Opcode },
5dd85c99 5423 /* 78 */
592d1631
L
5424 { Bad_Opcode },
5425 { Bad_Opcode },
5426 { Bad_Opcode },
5427 { Bad_Opcode },
5428 { Bad_Opcode },
5429 { Bad_Opcode },
5430 { Bad_Opcode },
5431 { Bad_Opcode },
5dd85c99 5432 /* 80 */
b5b098c2
JB
5433 { VEX_W_TABLE (VEX_W_0FXOP_09_80) },
5434 { VEX_W_TABLE (VEX_W_0FXOP_09_81) },
5435 { VEX_W_TABLE (VEX_W_0FXOP_09_82) },
5436 { VEX_W_TABLE (VEX_W_0FXOP_09_83) },
592d1631
L
5437 { Bad_Opcode },
5438 { Bad_Opcode },
5439 { Bad_Opcode },
5440 { Bad_Opcode },
5dd85c99 5441 /* 88 */
592d1631
L
5442 { Bad_Opcode },
5443 { Bad_Opcode },
5444 { Bad_Opcode },
5445 { Bad_Opcode },
5446 { Bad_Opcode },
5447 { Bad_Opcode },
5448 { Bad_Opcode },
5449 { Bad_Opcode },
5dd85c99 5450 /* 90 */
467bbef0
JB
5451 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_90) },
5452 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_91) },
5453 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_92) },
5454 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_93) },
5455 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_94) },
5456 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_95) },
5457 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_96) },
5458 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_97) },
5dd85c99 5459 /* 98 */
467bbef0
JB
5460 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_98) },
5461 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_99) },
5462 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_9A) },
5463 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_9B) },
592d1631
L
5464 { Bad_Opcode },
5465 { Bad_Opcode },
5466 { Bad_Opcode },
5467 { Bad_Opcode },
5dd85c99 5468 /* a0 */
592d1631
L
5469 { Bad_Opcode },
5470 { Bad_Opcode },
5471 { Bad_Opcode },
5472 { Bad_Opcode },
5473 { Bad_Opcode },
5474 { Bad_Opcode },
5475 { Bad_Opcode },
5476 { Bad_Opcode },
5dd85c99 5477 /* a8 */
592d1631
L
5478 { Bad_Opcode },
5479 { Bad_Opcode },
5480 { Bad_Opcode },
5481 { Bad_Opcode },
5482 { Bad_Opcode },
5483 { Bad_Opcode },
5484 { Bad_Opcode },
5485 { Bad_Opcode },
5dd85c99 5486 /* b0 */
592d1631
L
5487 { Bad_Opcode },
5488 { Bad_Opcode },
5489 { Bad_Opcode },
5490 { Bad_Opcode },
5491 { Bad_Opcode },
5492 { Bad_Opcode },
5493 { Bad_Opcode },
5494 { Bad_Opcode },
5dd85c99 5495 /* b8 */
592d1631
L
5496 { Bad_Opcode },
5497 { Bad_Opcode },
5498 { Bad_Opcode },
5499 { Bad_Opcode },
5500 { Bad_Opcode },
5501 { Bad_Opcode },
5502 { Bad_Opcode },
5503 { Bad_Opcode },
5dd85c99 5504 /* c0 */
592d1631 5505 { Bad_Opcode },
467bbef0
JB
5506 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C1) },
5507 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C2) },
5508 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C3) },
592d1631
L
5509 { Bad_Opcode },
5510 { Bad_Opcode },
467bbef0
JB
5511 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C6) },
5512 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C7) },
5dd85c99 5513 /* c8 */
592d1631
L
5514 { Bad_Opcode },
5515 { Bad_Opcode },
5516 { Bad_Opcode },
467bbef0 5517 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_CB) },
592d1631
L
5518 { Bad_Opcode },
5519 { Bad_Opcode },
5520 { Bad_Opcode },
5521 { Bad_Opcode },
5dd85c99 5522 /* d0 */
592d1631 5523 { Bad_Opcode },
467bbef0
JB
5524 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D1) },
5525 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D2) },
5526 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D3) },
592d1631
L
5527 { Bad_Opcode },
5528 { Bad_Opcode },
467bbef0
JB
5529 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D6) },
5530 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D7) },
5dd85c99 5531 /* d8 */
592d1631
L
5532 { Bad_Opcode },
5533 { Bad_Opcode },
5534 { Bad_Opcode },
467bbef0 5535 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_DB) },
592d1631
L
5536 { Bad_Opcode },
5537 { Bad_Opcode },
5538 { Bad_Opcode },
5539 { Bad_Opcode },
5dd85c99 5540 /* e0 */
592d1631 5541 { Bad_Opcode },
467bbef0
JB
5542 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E1) },
5543 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E2) },
5544 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E3) },
592d1631
L
5545 { Bad_Opcode },
5546 { Bad_Opcode },
5547 { Bad_Opcode },
5548 { Bad_Opcode },
4e7d34a6 5549 /* e8 */
592d1631
L
5550 { Bad_Opcode },
5551 { Bad_Opcode },
5552 { Bad_Opcode },
5553 { Bad_Opcode },
5554 { Bad_Opcode },
5555 { Bad_Opcode },
5556 { Bad_Opcode },
5557 { Bad_Opcode },
4e7d34a6 5558 /* f0 */
592d1631
L
5559 { Bad_Opcode },
5560 { Bad_Opcode },
5561 { Bad_Opcode },
5562 { Bad_Opcode },
5563 { Bad_Opcode },
5564 { Bad_Opcode },
5565 { Bad_Opcode },
5566 { Bad_Opcode },
4e7d34a6 5567 /* f8 */
592d1631
L
5568 { Bad_Opcode },
5569 { Bad_Opcode },
5570 { Bad_Opcode },
5571 { Bad_Opcode },
5572 { Bad_Opcode },
5573 { Bad_Opcode },
5574 { Bad_Opcode },
5575 { Bad_Opcode },
4e7d34a6 5576 },
f88c9eb0 5577 /* XOP_0A */
4e7d34a6
L
5578 {
5579 /* 00 */
592d1631
L
5580 { Bad_Opcode },
5581 { Bad_Opcode },
5582 { Bad_Opcode },
5583 { Bad_Opcode },
5584 { Bad_Opcode },
5585 { Bad_Opcode },
5586 { Bad_Opcode },
5587 { Bad_Opcode },
4e7d34a6 5588 /* 08 */
592d1631
L
5589 { Bad_Opcode },
5590 { Bad_Opcode },
5591 { Bad_Opcode },
5592 { Bad_Opcode },
5593 { Bad_Opcode },
5594 { Bad_Opcode },
5595 { Bad_Opcode },
5596 { Bad_Opcode },
4e7d34a6 5597 /* 10 */
c1dc7af5 5598 { "bextrS", { Gdq, Edq, Id }, 0 },
592d1631 5599 { Bad_Opcode },
467bbef0 5600 { VEX_LEN_TABLE (VEX_LEN_0FXOP_0A_12) },
592d1631
L
5601 { Bad_Opcode },
5602 { Bad_Opcode },
5603 { Bad_Opcode },
5604 { Bad_Opcode },
5605 { Bad_Opcode },
4e7d34a6 5606 /* 18 */
592d1631
L
5607 { Bad_Opcode },
5608 { Bad_Opcode },
5609 { Bad_Opcode },
5610 { Bad_Opcode },
5611 { Bad_Opcode },
5612 { Bad_Opcode },
5613 { Bad_Opcode },
5614 { Bad_Opcode },
4e7d34a6 5615 /* 20 */
592d1631
L
5616 { Bad_Opcode },
5617 { Bad_Opcode },
5618 { Bad_Opcode },
5619 { Bad_Opcode },
5620 { Bad_Opcode },
5621 { Bad_Opcode },
5622 { Bad_Opcode },
5623 { Bad_Opcode },
4e7d34a6 5624 /* 28 */
592d1631
L
5625 { Bad_Opcode },
5626 { Bad_Opcode },
5627 { Bad_Opcode },
5628 { Bad_Opcode },
5629 { Bad_Opcode },
5630 { Bad_Opcode },
5631 { Bad_Opcode },
5632 { Bad_Opcode },
4e7d34a6 5633 /* 30 */
592d1631
L
5634 { Bad_Opcode },
5635 { Bad_Opcode },
5636 { Bad_Opcode },
5637 { Bad_Opcode },
5638 { Bad_Opcode },
5639 { Bad_Opcode },
5640 { Bad_Opcode },
5641 { Bad_Opcode },
c0f3af97 5642 /* 38 */
592d1631
L
5643 { Bad_Opcode },
5644 { Bad_Opcode },
5645 { Bad_Opcode },
5646 { Bad_Opcode },
5647 { Bad_Opcode },
5648 { Bad_Opcode },
5649 { Bad_Opcode },
5650 { Bad_Opcode },
c0f3af97 5651 /* 40 */
592d1631
L
5652 { Bad_Opcode },
5653 { Bad_Opcode },
5654 { Bad_Opcode },
5655 { Bad_Opcode },
5656 { Bad_Opcode },
5657 { Bad_Opcode },
5658 { Bad_Opcode },
5659 { Bad_Opcode },
c1e679ec 5660 /* 48 */
592d1631
L
5661 { Bad_Opcode },
5662 { Bad_Opcode },
5663 { Bad_Opcode },
5664 { Bad_Opcode },
5665 { Bad_Opcode },
5666 { Bad_Opcode },
5667 { Bad_Opcode },
5668 { Bad_Opcode },
c1e679ec 5669 /* 50 */
592d1631
L
5670 { Bad_Opcode },
5671 { Bad_Opcode },
5672 { Bad_Opcode },
5673 { Bad_Opcode },
5674 { Bad_Opcode },
5675 { Bad_Opcode },
5676 { Bad_Opcode },
5677 { Bad_Opcode },
4e7d34a6 5678 /* 58 */
592d1631
L
5679 { Bad_Opcode },
5680 { Bad_Opcode },
5681 { Bad_Opcode },
5682 { Bad_Opcode },
5683 { Bad_Opcode },
5684 { Bad_Opcode },
5685 { Bad_Opcode },
5686 { Bad_Opcode },
4e7d34a6 5687 /* 60 */
592d1631
L
5688 { Bad_Opcode },
5689 { Bad_Opcode },
5690 { Bad_Opcode },
5691 { Bad_Opcode },
5692 { Bad_Opcode },
5693 { Bad_Opcode },
5694 { Bad_Opcode },
5695 { Bad_Opcode },
4e7d34a6 5696 /* 68 */
592d1631
L
5697 { Bad_Opcode },
5698 { Bad_Opcode },
5699 { Bad_Opcode },
5700 { Bad_Opcode },
5701 { Bad_Opcode },
5702 { Bad_Opcode },
5703 { Bad_Opcode },
5704 { Bad_Opcode },
4e7d34a6 5705 /* 70 */
592d1631
L
5706 { Bad_Opcode },
5707 { Bad_Opcode },
5708 { Bad_Opcode },
5709 { Bad_Opcode },
5710 { Bad_Opcode },
5711 { Bad_Opcode },
5712 { Bad_Opcode },
5713 { Bad_Opcode },
4e7d34a6 5714 /* 78 */
592d1631
L
5715 { Bad_Opcode },
5716 { Bad_Opcode },
5717 { Bad_Opcode },
5718 { Bad_Opcode },
5719 { Bad_Opcode },
5720 { Bad_Opcode },
5721 { Bad_Opcode },
5722 { Bad_Opcode },
4e7d34a6 5723 /* 80 */
592d1631
L
5724 { Bad_Opcode },
5725 { Bad_Opcode },
5726 { Bad_Opcode },
5727 { Bad_Opcode },
5728 { Bad_Opcode },
5729 { Bad_Opcode },
5730 { Bad_Opcode },
5731 { Bad_Opcode },
4e7d34a6 5732 /* 88 */
592d1631
L
5733 { Bad_Opcode },
5734 { Bad_Opcode },
5735 { Bad_Opcode },
5736 { Bad_Opcode },
5737 { Bad_Opcode },
5738 { Bad_Opcode },
5739 { Bad_Opcode },
5740 { Bad_Opcode },
4e7d34a6 5741 /* 90 */
592d1631
L
5742 { Bad_Opcode },
5743 { Bad_Opcode },
5744 { Bad_Opcode },
5745 { Bad_Opcode },
5746 { Bad_Opcode },
5747 { Bad_Opcode },
5748 { Bad_Opcode },
5749 { Bad_Opcode },
4e7d34a6 5750 /* 98 */
592d1631
L
5751 { Bad_Opcode },
5752 { Bad_Opcode },
5753 { Bad_Opcode },
5754 { Bad_Opcode },
5755 { Bad_Opcode },
5756 { Bad_Opcode },
5757 { Bad_Opcode },
5758 { Bad_Opcode },
4e7d34a6 5759 /* a0 */
592d1631
L
5760 { Bad_Opcode },
5761 { Bad_Opcode },
5762 { Bad_Opcode },
5763 { Bad_Opcode },
5764 { Bad_Opcode },
5765 { Bad_Opcode },
5766 { Bad_Opcode },
5767 { Bad_Opcode },
4e7d34a6 5768 /* a8 */
592d1631
L
5769 { Bad_Opcode },
5770 { Bad_Opcode },
5771 { Bad_Opcode },
5772 { Bad_Opcode },
5773 { Bad_Opcode },
5774 { Bad_Opcode },
5775 { Bad_Opcode },
5776 { Bad_Opcode },
d5d7db8e 5777 /* b0 */
592d1631
L
5778 { Bad_Opcode },
5779 { Bad_Opcode },
5780 { Bad_Opcode },
5781 { Bad_Opcode },
5782 { Bad_Opcode },
5783 { Bad_Opcode },
5784 { Bad_Opcode },
5785 { Bad_Opcode },
85f10a01 5786 /* b8 */
592d1631
L
5787 { Bad_Opcode },
5788 { Bad_Opcode },
5789 { Bad_Opcode },
5790 { Bad_Opcode },
5791 { Bad_Opcode },
5792 { Bad_Opcode },
5793 { Bad_Opcode },
5794 { Bad_Opcode },
85f10a01 5795 /* c0 */
592d1631
L
5796 { Bad_Opcode },
5797 { Bad_Opcode },
5798 { Bad_Opcode },
5799 { Bad_Opcode },
5800 { Bad_Opcode },
5801 { Bad_Opcode },
5802 { Bad_Opcode },
5803 { Bad_Opcode },
85f10a01 5804 /* c8 */
592d1631
L
5805 { Bad_Opcode },
5806 { Bad_Opcode },
5807 { Bad_Opcode },
5808 { Bad_Opcode },
5809 { Bad_Opcode },
5810 { Bad_Opcode },
5811 { Bad_Opcode },
5812 { Bad_Opcode },
85f10a01 5813 /* d0 */
592d1631
L
5814 { Bad_Opcode },
5815 { Bad_Opcode },
5816 { Bad_Opcode },
5817 { Bad_Opcode },
5818 { Bad_Opcode },
5819 { Bad_Opcode },
5820 { Bad_Opcode },
5821 { Bad_Opcode },
85f10a01 5822 /* d8 */
592d1631
L
5823 { Bad_Opcode },
5824 { Bad_Opcode },
5825 { Bad_Opcode },
5826 { Bad_Opcode },
5827 { Bad_Opcode },
5828 { Bad_Opcode },
5829 { Bad_Opcode },
5830 { Bad_Opcode },
85f10a01 5831 /* e0 */
592d1631
L
5832 { Bad_Opcode },
5833 { Bad_Opcode },
5834 { Bad_Opcode },
5835 { Bad_Opcode },
5836 { Bad_Opcode },
5837 { Bad_Opcode },
5838 { Bad_Opcode },
5839 { Bad_Opcode },
85f10a01 5840 /* e8 */
592d1631
L
5841 { Bad_Opcode },
5842 { Bad_Opcode },
5843 { Bad_Opcode },
5844 { Bad_Opcode },
5845 { Bad_Opcode },
5846 { Bad_Opcode },
5847 { Bad_Opcode },
5848 { Bad_Opcode },
85f10a01 5849 /* f0 */
592d1631
L
5850 { Bad_Opcode },
5851 { Bad_Opcode },
5852 { Bad_Opcode },
5853 { Bad_Opcode },
5854 { Bad_Opcode },
5855 { Bad_Opcode },
5856 { Bad_Opcode },
5857 { Bad_Opcode },
85f10a01 5858 /* f8 */
592d1631
L
5859 { Bad_Opcode },
5860 { Bad_Opcode },
5861 { Bad_Opcode },
5862 { Bad_Opcode },
5863 { Bad_Opcode },
5864 { Bad_Opcode },
5865 { Bad_Opcode },
5866 { Bad_Opcode },
85f10a01 5867 },
c0f3af97
L
5868};
5869
5870static const struct dis386 vex_table[][256] = {
5871 /* VEX_0F */
85f10a01
MM
5872 {
5873 /* 00 */
592d1631
L
5874 { Bad_Opcode },
5875 { Bad_Opcode },
5876 { Bad_Opcode },
5877 { Bad_Opcode },
5878 { Bad_Opcode },
5879 { Bad_Opcode },
5880 { Bad_Opcode },
5881 { Bad_Opcode },
85f10a01 5882 /* 08 */
592d1631
L
5883 { Bad_Opcode },
5884 { Bad_Opcode },
5885 { Bad_Opcode },
5886 { Bad_Opcode },
5887 { Bad_Opcode },
5888 { Bad_Opcode },
5889 { Bad_Opcode },
5890 { Bad_Opcode },
c0f3af97 5891 /* 10 */
592a252b
L
5892 { PREFIX_TABLE (PREFIX_VEX_0F10) },
5893 { PREFIX_TABLE (PREFIX_VEX_0F11) },
5894 { PREFIX_TABLE (PREFIX_VEX_0F12) },
5895 { MOD_TABLE (MOD_VEX_0F13) },
bf926894
JB
5896 { "vunpcklpX", { XM, Vex, EXx }, PREFIX_OPCODE },
5897 { "vunpckhpX", { XM, Vex, EXx }, PREFIX_OPCODE },
592a252b
L
5898 { PREFIX_TABLE (PREFIX_VEX_0F16) },
5899 { MOD_TABLE (MOD_VEX_0F17) },
c0f3af97 5900 /* 18 */
592d1631
L
5901 { Bad_Opcode },
5902 { Bad_Opcode },
5903 { Bad_Opcode },
5904 { Bad_Opcode },
5905 { Bad_Opcode },
5906 { Bad_Opcode },
5907 { Bad_Opcode },
5908 { Bad_Opcode },
c0f3af97 5909 /* 20 */
592d1631
L
5910 { Bad_Opcode },
5911 { Bad_Opcode },
5912 { Bad_Opcode },
5913 { Bad_Opcode },
5914 { Bad_Opcode },
5915 { Bad_Opcode },
5916 { Bad_Opcode },
5917 { Bad_Opcode },
c0f3af97 5918 /* 28 */
bf926894
JB
5919 { "vmovapX", { XM, EXx }, PREFIX_OPCODE },
5920 { "vmovapX", { EXxS, XM }, PREFIX_OPCODE },
592a252b
L
5921 { PREFIX_TABLE (PREFIX_VEX_0F2A) },
5922 { MOD_TABLE (MOD_VEX_0F2B) },
5923 { PREFIX_TABLE (PREFIX_VEX_0F2C) },
5924 { PREFIX_TABLE (PREFIX_VEX_0F2D) },
5925 { PREFIX_TABLE (PREFIX_VEX_0F2E) },
5926 { PREFIX_TABLE (PREFIX_VEX_0F2F) },
85f10a01 5927 /* 30 */
592d1631
L
5928 { Bad_Opcode },
5929 { Bad_Opcode },
5930 { Bad_Opcode },
5931 { Bad_Opcode },
5932 { Bad_Opcode },
5933 { Bad_Opcode },
5934 { Bad_Opcode },
5935 { Bad_Opcode },
4e7d34a6 5936 /* 38 */
592d1631
L
5937 { Bad_Opcode },
5938 { Bad_Opcode },
5939 { Bad_Opcode },
5940 { Bad_Opcode },
5941 { Bad_Opcode },
5942 { Bad_Opcode },
5943 { Bad_Opcode },
5944 { Bad_Opcode },
d5d7db8e 5945 /* 40 */
592d1631 5946 { Bad_Opcode },
43234a1e
L
5947 { PREFIX_TABLE (PREFIX_VEX_0F41) },
5948 { PREFIX_TABLE (PREFIX_VEX_0F42) },
592d1631 5949 { Bad_Opcode },
43234a1e
L
5950 { PREFIX_TABLE (PREFIX_VEX_0F44) },
5951 { PREFIX_TABLE (PREFIX_VEX_0F45) },
5952 { PREFIX_TABLE (PREFIX_VEX_0F46) },
5953 { PREFIX_TABLE (PREFIX_VEX_0F47) },
85f10a01 5954 /* 48 */
592d1631
L
5955 { Bad_Opcode },
5956 { Bad_Opcode },
1ba585e8 5957 { PREFIX_TABLE (PREFIX_VEX_0F4A) },
43234a1e 5958 { PREFIX_TABLE (PREFIX_VEX_0F4B) },
592d1631
L
5959 { Bad_Opcode },
5960 { Bad_Opcode },
5961 { Bad_Opcode },
5962 { Bad_Opcode },
d5d7db8e 5963 /* 50 */
592a252b
L
5964 { MOD_TABLE (MOD_VEX_0F50) },
5965 { PREFIX_TABLE (PREFIX_VEX_0F51) },
5966 { PREFIX_TABLE (PREFIX_VEX_0F52) },
5967 { PREFIX_TABLE (PREFIX_VEX_0F53) },
bf926894
JB
5968 { "vandpX", { XM, Vex, EXx }, PREFIX_OPCODE },
5969 { "vandnpX", { XM, Vex, EXx }, PREFIX_OPCODE },
5970 { "vorpX", { XM, Vex, EXx }, PREFIX_OPCODE },
5971 { "vxorpX", { XM, Vex, EXx }, PREFIX_OPCODE },
c0f3af97 5972 /* 58 */
592a252b
L
5973 { PREFIX_TABLE (PREFIX_VEX_0F58) },
5974 { PREFIX_TABLE (PREFIX_VEX_0F59) },
5975 { PREFIX_TABLE (PREFIX_VEX_0F5A) },
5976 { PREFIX_TABLE (PREFIX_VEX_0F5B) },
5977 { PREFIX_TABLE (PREFIX_VEX_0F5C) },
5978 { PREFIX_TABLE (PREFIX_VEX_0F5D) },
5979 { PREFIX_TABLE (PREFIX_VEX_0F5E) },
5980 { PREFIX_TABLE (PREFIX_VEX_0F5F) },
c0f3af97 5981 /* 60 */
7531c613
JB
5982 { "vpunpcklbw", { XM, Vex, EXx }, PREFIX_DATA },
5983 { "vpunpcklwd", { XM, Vex, EXx }, PREFIX_DATA },
5984 { "vpunpckldq", { XM, Vex, EXx }, PREFIX_DATA },
5985 { "vpacksswb", { XM, Vex, EXx }, PREFIX_DATA },
5986 { "vpcmpgtb", { XM, Vex, EXx }, PREFIX_DATA },
5987 { "vpcmpgtw", { XM, Vex, EXx }, PREFIX_DATA },
5988 { "vpcmpgtd", { XM, Vex, EXx }, PREFIX_DATA },
5989 { "vpackuswb", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 5990 /* 68 */
7531c613
JB
5991 { "vpunpckhbw", { XM, Vex, EXx }, PREFIX_DATA },
5992 { "vpunpckhwd", { XM, Vex, EXx }, PREFIX_DATA },
5993 { "vpunpckhdq", { XM, Vex, EXx }, PREFIX_DATA },
5994 { "vpackssdw", { XM, Vex, EXx }, PREFIX_DATA },
5995 { "vpunpcklqdq", { XM, Vex, EXx }, PREFIX_DATA },
5996 { "vpunpckhqdq", { XM, Vex, EXx }, PREFIX_DATA },
5997 { VEX_LEN_TABLE (VEX_LEN_0F6E) },
592a252b 5998 { PREFIX_TABLE (PREFIX_VEX_0F6F) },
c0f3af97 5999 /* 70 */
592a252b 6000 { PREFIX_TABLE (PREFIX_VEX_0F70) },
14d10c6c
JB
6001 { MOD_TABLE (MOD_VEX_0F71) },
6002 { MOD_TABLE (MOD_VEX_0F72) },
6003 { MOD_TABLE (MOD_VEX_0F73) },
7531c613
JB
6004 { "vpcmpeqb", { XM, Vex, EXx }, PREFIX_DATA },
6005 { "vpcmpeqw", { XM, Vex, EXx }, PREFIX_DATA },
6006 { "vpcmpeqd", { XM, Vex, EXx }, PREFIX_DATA },
035e7389 6007 { VEX_LEN_TABLE (VEX_LEN_0F77) },
c0f3af97 6008 /* 78 */
592d1631
L
6009 { Bad_Opcode },
6010 { Bad_Opcode },
6011 { Bad_Opcode },
6012 { Bad_Opcode },
592a252b
L
6013 { PREFIX_TABLE (PREFIX_VEX_0F7C) },
6014 { PREFIX_TABLE (PREFIX_VEX_0F7D) },
6015 { PREFIX_TABLE (PREFIX_VEX_0F7E) },
6016 { PREFIX_TABLE (PREFIX_VEX_0F7F) },
c0f3af97 6017 /* 80 */
592d1631
L
6018 { Bad_Opcode },
6019 { Bad_Opcode },
6020 { Bad_Opcode },
6021 { Bad_Opcode },
6022 { Bad_Opcode },
6023 { Bad_Opcode },
6024 { Bad_Opcode },
6025 { Bad_Opcode },
c0f3af97 6026 /* 88 */
592d1631
L
6027 { Bad_Opcode },
6028 { Bad_Opcode },
6029 { Bad_Opcode },
6030 { Bad_Opcode },
6031 { Bad_Opcode },
6032 { Bad_Opcode },
6033 { Bad_Opcode },
6034 { Bad_Opcode },
c0f3af97 6035 /* 90 */
43234a1e
L
6036 { PREFIX_TABLE (PREFIX_VEX_0F90) },
6037 { PREFIX_TABLE (PREFIX_VEX_0F91) },
6038 { PREFIX_TABLE (PREFIX_VEX_0F92) },
6039 { PREFIX_TABLE (PREFIX_VEX_0F93) },
592d1631
L
6040 { Bad_Opcode },
6041 { Bad_Opcode },
6042 { Bad_Opcode },
6043 { Bad_Opcode },
c0f3af97 6044 /* 98 */
43234a1e 6045 { PREFIX_TABLE (PREFIX_VEX_0F98) },
1ba585e8 6046 { PREFIX_TABLE (PREFIX_VEX_0F99) },
592d1631
L
6047 { Bad_Opcode },
6048 { Bad_Opcode },
6049 { Bad_Opcode },
6050 { Bad_Opcode },
6051 { Bad_Opcode },
6052 { Bad_Opcode },
c0f3af97 6053 /* a0 */
592d1631
L
6054 { Bad_Opcode },
6055 { Bad_Opcode },
6056 { Bad_Opcode },
6057 { Bad_Opcode },
6058 { Bad_Opcode },
6059 { Bad_Opcode },
6060 { Bad_Opcode },
6061 { Bad_Opcode },
c0f3af97 6062 /* a8 */
592d1631
L
6063 { Bad_Opcode },
6064 { Bad_Opcode },
6065 { Bad_Opcode },
6066 { Bad_Opcode },
6067 { Bad_Opcode },
6068 { Bad_Opcode },
592a252b 6069 { REG_TABLE (REG_VEX_0FAE) },
592d1631 6070 { Bad_Opcode },
c0f3af97 6071 /* b0 */
592d1631
L
6072 { Bad_Opcode },
6073 { Bad_Opcode },
6074 { Bad_Opcode },
6075 { Bad_Opcode },
6076 { Bad_Opcode },
6077 { Bad_Opcode },
6078 { Bad_Opcode },
6079 { Bad_Opcode },
c0f3af97 6080 /* b8 */
592d1631
L
6081 { Bad_Opcode },
6082 { Bad_Opcode },
6083 { Bad_Opcode },
6084 { Bad_Opcode },
6085 { Bad_Opcode },
6086 { Bad_Opcode },
6087 { Bad_Opcode },
6088 { Bad_Opcode },
c0f3af97 6089 /* c0 */
592d1631
L
6090 { Bad_Opcode },
6091 { Bad_Opcode },
592a252b 6092 { PREFIX_TABLE (PREFIX_VEX_0FC2) },
592d1631 6093 { Bad_Opcode },
7531c613
JB
6094 { VEX_LEN_TABLE (VEX_LEN_0FC4) },
6095 { VEX_LEN_TABLE (VEX_LEN_0FC5) },
bf926894 6096 { "vshufpX", { XM, Vex, EXx, Ib }, PREFIX_OPCODE },
592d1631 6097 { Bad_Opcode },
c0f3af97 6098 /* c8 */
592d1631
L
6099 { Bad_Opcode },
6100 { Bad_Opcode },
6101 { Bad_Opcode },
6102 { Bad_Opcode },
6103 { Bad_Opcode },
6104 { Bad_Opcode },
6105 { Bad_Opcode },
6106 { Bad_Opcode },
c0f3af97 6107 /* d0 */
592a252b 6108 { PREFIX_TABLE (PREFIX_VEX_0FD0) },
7531c613
JB
6109 { "vpsrlw", { XM, Vex, EXxmm }, PREFIX_DATA },
6110 { "vpsrld", { XM, Vex, EXxmm }, PREFIX_DATA },
6111 { "vpsrlq", { XM, Vex, EXxmm }, PREFIX_DATA },
6112 { "vpaddq", { XM, Vex, EXx }, PREFIX_DATA },
6113 { "vpmullw", { XM, Vex, EXx }, PREFIX_DATA },
6114 { VEX_LEN_TABLE (VEX_LEN_0FD6) },
6115 { MOD_TABLE (MOD_VEX_0FD7) },
c0f3af97 6116 /* d8 */
7531c613
JB
6117 { "vpsubusb", { XM, Vex, EXx }, PREFIX_DATA },
6118 { "vpsubusw", { XM, Vex, EXx }, PREFIX_DATA },
6119 { "vpminub", { XM, Vex, EXx }, PREFIX_DATA },
6120 { "vpand", { XM, Vex, EXx }, PREFIX_DATA },
6121 { "vpaddusb", { XM, Vex, EXx }, PREFIX_DATA },
6122 { "vpaddusw", { XM, Vex, EXx }, PREFIX_DATA },
6123 { "vpmaxub", { XM, Vex, EXx }, PREFIX_DATA },
6124 { "vpandn", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6125 /* e0 */
7531c613
JB
6126 { "vpavgb", { XM, Vex, EXx }, PREFIX_DATA },
6127 { "vpsraw", { XM, Vex, EXxmm }, PREFIX_DATA },
6128 { "vpsrad", { XM, Vex, EXxmm }, PREFIX_DATA },
6129 { "vpavgw", { XM, Vex, EXx }, PREFIX_DATA },
6130 { "vpmulhuw", { XM, Vex, EXx }, PREFIX_DATA },
6131 { "vpmulhw", { XM, Vex, EXx }, PREFIX_DATA },
592a252b 6132 { PREFIX_TABLE (PREFIX_VEX_0FE6) },
7531c613 6133 { MOD_TABLE (MOD_VEX_0FE7) },
c0f3af97 6134 /* e8 */
7531c613
JB
6135 { "vpsubsb", { XM, Vex, EXx }, PREFIX_DATA },
6136 { "vpsubsw", { XM, Vex, EXx }, PREFIX_DATA },
6137 { "vpminsw", { XM, Vex, EXx }, PREFIX_DATA },
6138 { "vpor", { XM, Vex, EXx }, PREFIX_DATA },
6139 { "vpaddsb", { XM, Vex, EXx }, PREFIX_DATA },
6140 { "vpaddsw", { XM, Vex, EXx }, PREFIX_DATA },
6141 { "vpmaxsw", { XM, Vex, EXx }, PREFIX_DATA },
6142 { "vpxor", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6143 /* f0 */
592a252b 6144 { PREFIX_TABLE (PREFIX_VEX_0FF0) },
7531c613
JB
6145 { "vpsllw", { XM, Vex, EXxmm }, PREFIX_DATA },
6146 { "vpslld", { XM, Vex, EXxmm }, PREFIX_DATA },
6147 { "vpsllq", { XM, Vex, EXxmm }, PREFIX_DATA },
6148 { "vpmuludq", { XM, Vex, EXx }, PREFIX_DATA },
6149 { "vpmaddwd", { XM, Vex, EXx }, PREFIX_DATA },
6150 { "vpsadbw", { XM, Vex, EXx }, PREFIX_DATA },
6151 { VEX_LEN_TABLE (VEX_LEN_0FF7) },
c0f3af97 6152 /* f8 */
7531c613
JB
6153 { "vpsubb", { XM, Vex, EXx }, PREFIX_DATA },
6154 { "vpsubw", { XM, Vex, EXx }, PREFIX_DATA },
6155 { "vpsubd", { XM, Vex, EXx }, PREFIX_DATA },
6156 { "vpsubq", { XM, Vex, EXx }, PREFIX_DATA },
6157 { "vpaddb", { XM, Vex, EXx }, PREFIX_DATA },
6158 { "vpaddw", { XM, Vex, EXx }, PREFIX_DATA },
6159 { "vpaddd", { XM, Vex, EXx }, PREFIX_DATA },
592d1631 6160 { Bad_Opcode },
c0f3af97
L
6161 },
6162 /* VEX_0F38 */
6163 {
6164 /* 00 */
7531c613
JB
6165 { "vpshufb", { XM, Vex, EXx }, PREFIX_DATA },
6166 { "vphaddw", { XM, Vex, EXx }, PREFIX_DATA },
6167 { "vphaddd", { XM, Vex, EXx }, PREFIX_DATA },
6168 { "vphaddsw", { XM, Vex, EXx }, PREFIX_DATA },
6169 { "vpmaddubsw", { XM, Vex, EXx }, PREFIX_DATA },
6170 { "vphsubw", { XM, Vex, EXx }, PREFIX_DATA },
6171 { "vphsubd", { XM, Vex, EXx }, PREFIX_DATA },
6172 { "vphsubsw", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6173 /* 08 */
7531c613
JB
6174 { "vpsignb", { XM, Vex, EXx }, PREFIX_DATA },
6175 { "vpsignw", { XM, Vex, EXx }, PREFIX_DATA },
6176 { "vpsignd", { XM, Vex, EXx }, PREFIX_DATA },
6177 { "vpmulhrsw", { XM, Vex, EXx }, PREFIX_DATA },
6178 { VEX_W_TABLE (VEX_W_0F380C) },
6179 { VEX_W_TABLE (VEX_W_0F380D) },
6180 { VEX_W_TABLE (VEX_W_0F380E) },
6181 { VEX_W_TABLE (VEX_W_0F380F) },
c0f3af97 6182 /* 10 */
592d1631
L
6183 { Bad_Opcode },
6184 { Bad_Opcode },
6185 { Bad_Opcode },
7531c613 6186 { VEX_W_TABLE (VEX_W_0F3813) },
592d1631
L
6187 { Bad_Opcode },
6188 { Bad_Opcode },
7531c613
JB
6189 { VEX_LEN_TABLE (VEX_LEN_0F3816) },
6190 { "vptest", { XM, EXx }, PREFIX_DATA },
c0f3af97 6191 /* 18 */
7531c613
JB
6192 { VEX_W_TABLE (VEX_W_0F3818) },
6193 { VEX_LEN_TABLE (VEX_LEN_0F3819) },
6194 { MOD_TABLE (MOD_VEX_0F381A) },
592d1631 6195 { Bad_Opcode },
7531c613
JB
6196 { "vpabsb", { XM, EXx }, PREFIX_DATA },
6197 { "vpabsw", { XM, EXx }, PREFIX_DATA },
6198 { "vpabsd", { XM, EXx }, PREFIX_DATA },
592d1631 6199 { Bad_Opcode },
c0f3af97 6200 /* 20 */
7531c613
JB
6201 { "vpmovsxbw", { XM, EXxmmq }, PREFIX_DATA },
6202 { "vpmovsxbd", { XM, EXxmmqd }, PREFIX_DATA },
6203 { "vpmovsxbq", { XM, EXxmmdw }, PREFIX_DATA },
6204 { "vpmovsxwd", { XM, EXxmmq }, PREFIX_DATA },
6205 { "vpmovsxwq", { XM, EXxmmqd }, PREFIX_DATA },
6206 { "vpmovsxdq", { XM, EXxmmq }, PREFIX_DATA },
592d1631
L
6207 { Bad_Opcode },
6208 { Bad_Opcode },
c0f3af97 6209 /* 28 */
7531c613
JB
6210 { "vpmuldq", { XM, Vex, EXx }, PREFIX_DATA },
6211 { "vpcmpeqq", { XM, Vex, EXx }, PREFIX_DATA },
6212 { MOD_TABLE (MOD_VEX_0F382A) },
6213 { "vpackusdw", { XM, Vex, EXx }, PREFIX_DATA },
6214 { MOD_TABLE (MOD_VEX_0F382C) },
6215 { MOD_TABLE (MOD_VEX_0F382D) },
6216 { MOD_TABLE (MOD_VEX_0F382E) },
6217 { MOD_TABLE (MOD_VEX_0F382F) },
c0f3af97 6218 /* 30 */
7531c613
JB
6219 { "vpmovzxbw", { XM, EXxmmq }, PREFIX_DATA },
6220 { "vpmovzxbd", { XM, EXxmmqd }, PREFIX_DATA },
6221 { "vpmovzxbq", { XM, EXxmmdw }, PREFIX_DATA },
6222 { "vpmovzxwd", { XM, EXxmmq }, PREFIX_DATA },
6223 { "vpmovzxwq", { XM, EXxmmqd }, PREFIX_DATA },
6224 { "vpmovzxdq", { XM, EXxmmq }, PREFIX_DATA },
6225 { VEX_LEN_TABLE (VEX_LEN_0F3836) },
6226 { "vpcmpgtq", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6227 /* 38 */
7531c613
JB
6228 { "vpminsb", { XM, Vex, EXx }, PREFIX_DATA },
6229 { "vpminsd", { XM, Vex, EXx }, PREFIX_DATA },
6230 { "vpminuw", { XM, Vex, EXx }, PREFIX_DATA },
6231 { "vpminud", { XM, Vex, EXx }, PREFIX_DATA },
6232 { "vpmaxsb", { XM, Vex, EXx }, PREFIX_DATA },
6233 { "vpmaxsd", { XM, Vex, EXx }, PREFIX_DATA },
6234 { "vpmaxuw", { XM, Vex, EXx }, PREFIX_DATA },
6235 { "vpmaxud", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6236 /* 40 */
7531c613
JB
6237 { "vpmulld", { XM, Vex, EXx }, PREFIX_DATA },
6238 { VEX_LEN_TABLE (VEX_LEN_0F3841) },
592d1631
L
6239 { Bad_Opcode },
6240 { Bad_Opcode },
6241 { Bad_Opcode },
7531c613
JB
6242 { "vpsrlv%DQ", { XM, Vex, EXx }, PREFIX_DATA },
6243 { VEX_W_TABLE (VEX_W_0F3846) },
6244 { "vpsllv%DQ", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6245 /* 48 */
592d1631 6246 { Bad_Opcode },
260cd341 6247 { X86_64_TABLE (X86_64_VEX_0F3849) },
592d1631 6248 { Bad_Opcode },
260cd341 6249 { X86_64_TABLE (X86_64_VEX_0F384B) },
592d1631
L
6250 { Bad_Opcode },
6251 { Bad_Opcode },
6252 { Bad_Opcode },
6253 { Bad_Opcode },
c0f3af97 6254 /* 50 */
58bf9b6a
L
6255 { VEX_W_TABLE (VEX_W_0F3850) },
6256 { VEX_W_TABLE (VEX_W_0F3851) },
6257 { VEX_W_TABLE (VEX_W_0F3852) },
6258 { VEX_W_TABLE (VEX_W_0F3853) },
592d1631
L
6259 { Bad_Opcode },
6260 { Bad_Opcode },
6261 { Bad_Opcode },
6262 { Bad_Opcode },
c0f3af97 6263 /* 58 */
7531c613
JB
6264 { VEX_W_TABLE (VEX_W_0F3858) },
6265 { VEX_W_TABLE (VEX_W_0F3859) },
6266 { MOD_TABLE (MOD_VEX_0F385A) },
592d1631 6267 { Bad_Opcode },
260cd341 6268 { X86_64_TABLE (X86_64_VEX_0F385C) },
592d1631 6269 { Bad_Opcode },
260cd341 6270 { X86_64_TABLE (X86_64_VEX_0F385E) },
592d1631 6271 { Bad_Opcode },
c0f3af97 6272 /* 60 */
592d1631
L
6273 { Bad_Opcode },
6274 { Bad_Opcode },
6275 { Bad_Opcode },
6276 { Bad_Opcode },
6277 { Bad_Opcode },
6278 { Bad_Opcode },
6279 { Bad_Opcode },
6280 { Bad_Opcode },
c0f3af97 6281 /* 68 */
592d1631
L
6282 { Bad_Opcode },
6283 { Bad_Opcode },
6284 { Bad_Opcode },
6285 { Bad_Opcode },
6286 { Bad_Opcode },
6287 { Bad_Opcode },
6288 { Bad_Opcode },
6289 { Bad_Opcode },
c0f3af97 6290 /* 70 */
592d1631
L
6291 { Bad_Opcode },
6292 { Bad_Opcode },
6293 { Bad_Opcode },
6294 { Bad_Opcode },
6295 { Bad_Opcode },
6296 { Bad_Opcode },
6297 { Bad_Opcode },
6298 { Bad_Opcode },
c0f3af97 6299 /* 78 */
7531c613
JB
6300 { VEX_W_TABLE (VEX_W_0F3878) },
6301 { VEX_W_TABLE (VEX_W_0F3879) },
592d1631
L
6302 { Bad_Opcode },
6303 { Bad_Opcode },
6304 { Bad_Opcode },
6305 { Bad_Opcode },
6306 { Bad_Opcode },
6307 { Bad_Opcode },
c0f3af97 6308 /* 80 */
592d1631
L
6309 { Bad_Opcode },
6310 { Bad_Opcode },
6311 { Bad_Opcode },
6312 { Bad_Opcode },
6313 { Bad_Opcode },
6314 { Bad_Opcode },
6315 { Bad_Opcode },
6316 { Bad_Opcode },
c0f3af97 6317 /* 88 */
592d1631
L
6318 { Bad_Opcode },
6319 { Bad_Opcode },
6320 { Bad_Opcode },
6321 { Bad_Opcode },
7531c613 6322 { MOD_TABLE (MOD_VEX_0F388C) },
592d1631 6323 { Bad_Opcode },
7531c613 6324 { MOD_TABLE (MOD_VEX_0F388E) },
592d1631 6325 { Bad_Opcode },
c0f3af97 6326 /* 90 */
7531c613
JB
6327 { "vpgatherd%DQ", { XM, MVexVSIBDWpX, Vex }, PREFIX_DATA },
6328 { "vpgatherq%DQ", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, PREFIX_DATA },
6329 { "vgatherdp%XW", { XM, MVexVSIBDWpX, Vex }, PREFIX_DATA },
6330 { "vgatherqp%XW", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, PREFIX_DATA },
592d1631
L
6331 { Bad_Opcode },
6332 { Bad_Opcode },
7531c613
JB
6333 { "vfmaddsub132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6334 { "vfmsubadd132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6335 /* 98 */
7531c613
JB
6336 { "vfmadd132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6337 { "vfmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6338 { "vfmsub132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6339 { "vfmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6340 { "vfnmadd132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6341 { "vfnmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6342 { "vfnmsub132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6343 { "vfnmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
c0f3af97 6344 /* a0 */
592d1631
L
6345 { Bad_Opcode },
6346 { Bad_Opcode },
6347 { Bad_Opcode },
6348 { Bad_Opcode },
6349 { Bad_Opcode },
6350 { Bad_Opcode },
7531c613
JB
6351 { "vfmaddsub213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6352 { "vfmsubadd213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6353 /* a8 */
7531c613
JB
6354 { "vfmadd213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6355 { "vfmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6356 { "vfmsub213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6357 { "vfmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6358 { "vfnmadd213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6359 { "vfnmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6360 { "vfnmsub213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6361 { "vfnmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
c0f3af97 6362 /* b0 */
592d1631
L
6363 { Bad_Opcode },
6364 { Bad_Opcode },
6365 { Bad_Opcode },
6366 { Bad_Opcode },
6367 { Bad_Opcode },
6368 { Bad_Opcode },
7531c613
JB
6369 { "vfmaddsub231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6370 { "vfmsubadd231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6371 /* b8 */
7531c613
JB
6372 { "vfmadd231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6373 { "vfmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6374 { "vfmsub231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6375 { "vfmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6376 { "vfnmadd231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6377 { "vfnmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6378 { "vfnmsub231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6379 { "vfnmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
c0f3af97 6380 /* c0 */
592d1631
L
6381 { Bad_Opcode },
6382 { Bad_Opcode },
6383 { Bad_Opcode },
6384 { Bad_Opcode },
6385 { Bad_Opcode },
6386 { Bad_Opcode },
6387 { Bad_Opcode },
6388 { Bad_Opcode },
c0f3af97 6389 /* c8 */
592d1631
L
6390 { Bad_Opcode },
6391 { Bad_Opcode },
6392 { Bad_Opcode },
6393 { Bad_Opcode },
6394 { Bad_Opcode },
6395 { Bad_Opcode },
6396 { Bad_Opcode },
7531c613 6397 { VEX_W_TABLE (VEX_W_0F38CF) },
c0f3af97 6398 /* d0 */
592d1631
L
6399 { Bad_Opcode },
6400 { Bad_Opcode },
6401 { Bad_Opcode },
6402 { Bad_Opcode },
6403 { Bad_Opcode },
6404 { Bad_Opcode },
6405 { Bad_Opcode },
6406 { Bad_Opcode },
c0f3af97 6407 /* d8 */
592d1631
L
6408 { Bad_Opcode },
6409 { Bad_Opcode },
6410 { Bad_Opcode },
7531c613
JB
6411 { VEX_LEN_TABLE (VEX_LEN_0F38DB) },
6412 { "vaesenc", { XM, Vex, EXx }, PREFIX_DATA },
6413 { "vaesenclast", { XM, Vex, EXx }, PREFIX_DATA },
6414 { "vaesdec", { XM, Vex, EXx }, PREFIX_DATA },
6415 { "vaesdeclast", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6416 /* e0 */
592d1631
L
6417 { Bad_Opcode },
6418 { Bad_Opcode },
6419 { Bad_Opcode },
6420 { Bad_Opcode },
6421 { Bad_Opcode },
6422 { Bad_Opcode },
6423 { Bad_Opcode },
6424 { Bad_Opcode },
c0f3af97 6425 /* e8 */
592d1631
L
6426 { Bad_Opcode },
6427 { Bad_Opcode },
6428 { Bad_Opcode },
6429 { Bad_Opcode },
6430 { Bad_Opcode },
6431 { Bad_Opcode },
6432 { Bad_Opcode },
6433 { Bad_Opcode },
c0f3af97 6434 /* f0 */
592d1631
L
6435 { Bad_Opcode },
6436 { Bad_Opcode },
035e7389 6437 { VEX_LEN_TABLE (VEX_LEN_0F38F2) },
14d10c6c 6438 { VEX_LEN_TABLE (VEX_LEN_0F38F3) },
592d1631 6439 { Bad_Opcode },
14d10c6c
JB
6440 { VEX_LEN_TABLE (VEX_LEN_0F38F5) },
6441 { VEX_LEN_TABLE (VEX_LEN_0F38F6) },
6442 { VEX_LEN_TABLE (VEX_LEN_0F38F7) },
c0f3af97 6443 /* f8 */
592d1631
L
6444 { Bad_Opcode },
6445 { Bad_Opcode },
6446 { Bad_Opcode },
6447 { Bad_Opcode },
6448 { Bad_Opcode },
6449 { Bad_Opcode },
6450 { Bad_Opcode },
6451 { Bad_Opcode },
c0f3af97
L
6452 },
6453 /* VEX_0F3A */
6454 {
6455 /* 00 */
7531c613
JB
6456 { VEX_LEN_TABLE (VEX_LEN_0F3A00) },
6457 { VEX_LEN_TABLE (VEX_LEN_0F3A01) },
6458 { VEX_W_TABLE (VEX_W_0F3A02) },
592d1631 6459 { Bad_Opcode },
7531c613
JB
6460 { VEX_W_TABLE (VEX_W_0F3A04) },
6461 { VEX_W_TABLE (VEX_W_0F3A05) },
6462 { VEX_LEN_TABLE (VEX_LEN_0F3A06) },
592d1631 6463 { Bad_Opcode },
c0f3af97 6464 /* 08 */
7531c613
JB
6465 { "vroundps", { XM, EXx, Ib }, PREFIX_DATA },
6466 { "vroundpd", { XM, EXx, Ib }, PREFIX_DATA },
6467 { "vroundss", { XMScalar, VexScalar, EXxmm_md, Ib }, PREFIX_DATA },
6468 { "vroundsd", { XMScalar, VexScalar, EXxmm_mq, Ib }, PREFIX_DATA },
6469 { "vblendps", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6470 { "vblendpd", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6471 { "vpblendw", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6472 { "vpalignr", { XM, Vex, EXx, Ib }, PREFIX_DATA },
c0f3af97 6473 /* 10 */
592d1631
L
6474 { Bad_Opcode },
6475 { Bad_Opcode },
6476 { Bad_Opcode },
6477 { Bad_Opcode },
7531c613
JB
6478 { VEX_LEN_TABLE (VEX_LEN_0F3A14) },
6479 { VEX_LEN_TABLE (VEX_LEN_0F3A15) },
6480 { VEX_LEN_TABLE (VEX_LEN_0F3A16) },
6481 { VEX_LEN_TABLE (VEX_LEN_0F3A17) },
c0f3af97 6482 /* 18 */
7531c613
JB
6483 { VEX_LEN_TABLE (VEX_LEN_0F3A18) },
6484 { VEX_LEN_TABLE (VEX_LEN_0F3A19) },
592d1631
L
6485 { Bad_Opcode },
6486 { Bad_Opcode },
6487 { Bad_Opcode },
7531c613 6488 { VEX_W_TABLE (VEX_W_0F3A1D) },
592d1631
L
6489 { Bad_Opcode },
6490 { Bad_Opcode },
c0f3af97 6491 /* 20 */
7531c613
JB
6492 { VEX_LEN_TABLE (VEX_LEN_0F3A20) },
6493 { VEX_LEN_TABLE (VEX_LEN_0F3A21) },
6494 { VEX_LEN_TABLE (VEX_LEN_0F3A22) },
592d1631
L
6495 { Bad_Opcode },
6496 { Bad_Opcode },
6497 { Bad_Opcode },
6498 { Bad_Opcode },
6499 { Bad_Opcode },
c0f3af97 6500 /* 28 */
592d1631
L
6501 { Bad_Opcode },
6502 { Bad_Opcode },
6503 { Bad_Opcode },
6504 { Bad_Opcode },
6505 { Bad_Opcode },
6506 { Bad_Opcode },
6507 { Bad_Opcode },
6508 { Bad_Opcode },
c0f3af97 6509 /* 30 */
7531c613
JB
6510 { VEX_LEN_TABLE (VEX_LEN_0F3A30) },
6511 { VEX_LEN_TABLE (VEX_LEN_0F3A31) },
6512 { VEX_LEN_TABLE (VEX_LEN_0F3A32) },
6513 { VEX_LEN_TABLE (VEX_LEN_0F3A33) },
592d1631
L
6514 { Bad_Opcode },
6515 { Bad_Opcode },
6516 { Bad_Opcode },
6517 { Bad_Opcode },
c0f3af97 6518 /* 38 */
7531c613
JB
6519 { VEX_LEN_TABLE (VEX_LEN_0F3A38) },
6520 { VEX_LEN_TABLE (VEX_LEN_0F3A39) },
592d1631
L
6521 { Bad_Opcode },
6522 { Bad_Opcode },
6523 { Bad_Opcode },
6524 { Bad_Opcode },
6525 { Bad_Opcode },
6526 { Bad_Opcode },
c0f3af97 6527 /* 40 */
7531c613
JB
6528 { "vdpps", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6529 { VEX_LEN_TABLE (VEX_LEN_0F3A41) },
6530 { "vmpsadbw", { XM, Vex, EXx, Ib }, PREFIX_DATA },
592d1631 6531 { Bad_Opcode },
7531c613 6532 { "vpclmulqdq", { XM, Vex, EXx, PCLMUL }, PREFIX_DATA },
592d1631 6533 { Bad_Opcode },
7531c613 6534 { VEX_LEN_TABLE (VEX_LEN_0F3A46) },
592d1631 6535 { Bad_Opcode },
c0f3af97 6536 /* 48 */
7531c613
JB
6537 { "vpermil2ps", { XM, Vex, EXx, XMVexI4, VexI4 }, PREFIX_DATA },
6538 { "vpermil2pd", { XM, Vex, EXx, XMVexI4, VexI4 }, PREFIX_DATA },
6539 { VEX_W_TABLE (VEX_W_0F3A4A) },
6540 { VEX_W_TABLE (VEX_W_0F3A4B) },
6541 { VEX_W_TABLE (VEX_W_0F3A4C) },
592d1631
L
6542 { Bad_Opcode },
6543 { Bad_Opcode },
6544 { Bad_Opcode },
c0f3af97 6545 /* 50 */
592d1631
L
6546 { Bad_Opcode },
6547 { Bad_Opcode },
6548 { Bad_Opcode },
6549 { Bad_Opcode },
6550 { Bad_Opcode },
6551 { Bad_Opcode },
6552 { Bad_Opcode },
6553 { Bad_Opcode },
c0f3af97 6554 /* 58 */
592d1631
L
6555 { Bad_Opcode },
6556 { Bad_Opcode },
6557 { Bad_Opcode },
6558 { Bad_Opcode },
7531c613
JB
6559 { "vfmaddsubps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6560 { "vfmaddsubpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6561 { "vfmsubaddps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6562 { "vfmsubaddpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
c0f3af97 6563 /* 60 */
7531c613
JB
6564 { VEX_LEN_TABLE (VEX_LEN_0F3A60) },
6565 { VEX_LEN_TABLE (VEX_LEN_0F3A61) },
6566 { VEX_LEN_TABLE (VEX_LEN_0F3A62) },
6567 { VEX_LEN_TABLE (VEX_LEN_0F3A63) },
592d1631
L
6568 { Bad_Opcode },
6569 { Bad_Opcode },
6570 { Bad_Opcode },
6571 { Bad_Opcode },
c0f3af97 6572 /* 68 */
7531c613
JB
6573 { "vfmaddps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6574 { "vfmaddpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6575 { "vfmaddss", { XMScalar, VexScalar, EXxmm_md, XMVexScalarI4 }, PREFIX_DATA },
6576 { "vfmaddsd", { XMScalar, VexScalar, EXxmm_mq, XMVexScalarI4 }, PREFIX_DATA },
6577 { "vfmsubps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6578 { "vfmsubpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6579 { "vfmsubss", { XMScalar, VexScalar, EXxmm_md, XMVexScalarI4 }, PREFIX_DATA },
6580 { "vfmsubsd", { XMScalar, VexScalar, EXxmm_mq, XMVexScalarI4 }, PREFIX_DATA },
c0f3af97 6581 /* 70 */
592d1631
L
6582 { Bad_Opcode },
6583 { Bad_Opcode },
6584 { Bad_Opcode },
6585 { Bad_Opcode },
6586 { Bad_Opcode },
6587 { Bad_Opcode },
6588 { Bad_Opcode },
6589 { Bad_Opcode },
c0f3af97 6590 /* 78 */
7531c613
JB
6591 { "vfnmaddps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6592 { "vfnmaddpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6593 { "vfnmaddss", { XMScalar, VexScalar, EXxmm_md, XMVexScalarI4 }, PREFIX_DATA },
6594 { "vfnmaddsd", { XMScalar, VexScalar, EXxmm_mq, XMVexScalarI4 }, PREFIX_DATA },
6595 { "vfnmsubps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6596 { "vfnmsubpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6597 { "vfnmsubss", { XMScalar, VexScalar, EXxmm_md, XMVexScalarI4 }, PREFIX_DATA },
6598 { "vfnmsubsd", { XMScalar, VexScalar, EXxmm_mq, XMVexScalarI4 }, PREFIX_DATA },
c0f3af97 6599 /* 80 */
592d1631
L
6600 { Bad_Opcode },
6601 { Bad_Opcode },
6602 { Bad_Opcode },
6603 { Bad_Opcode },
6604 { Bad_Opcode },
6605 { Bad_Opcode },
6606 { Bad_Opcode },
6607 { Bad_Opcode },
c0f3af97 6608 /* 88 */
592d1631
L
6609 { Bad_Opcode },
6610 { Bad_Opcode },
6611 { Bad_Opcode },
6612 { Bad_Opcode },
6613 { Bad_Opcode },
6614 { Bad_Opcode },
6615 { Bad_Opcode },
6616 { Bad_Opcode },
c0f3af97 6617 /* 90 */
592d1631
L
6618 { Bad_Opcode },
6619 { Bad_Opcode },
6620 { Bad_Opcode },
6621 { Bad_Opcode },
6622 { Bad_Opcode },
6623 { Bad_Opcode },
6624 { Bad_Opcode },
6625 { Bad_Opcode },
c0f3af97 6626 /* 98 */
592d1631
L
6627 { Bad_Opcode },
6628 { Bad_Opcode },
6629 { Bad_Opcode },
6630 { Bad_Opcode },
6631 { Bad_Opcode },
6632 { Bad_Opcode },
6633 { Bad_Opcode },
6634 { Bad_Opcode },
c0f3af97 6635 /* a0 */
592d1631
L
6636 { Bad_Opcode },
6637 { Bad_Opcode },
6638 { Bad_Opcode },
6639 { Bad_Opcode },
6640 { Bad_Opcode },
6641 { Bad_Opcode },
6642 { Bad_Opcode },
6643 { Bad_Opcode },
c0f3af97 6644 /* a8 */
592d1631
L
6645 { Bad_Opcode },
6646 { Bad_Opcode },
6647 { Bad_Opcode },
6648 { Bad_Opcode },
6649 { Bad_Opcode },
6650 { Bad_Opcode },
6651 { Bad_Opcode },
6652 { Bad_Opcode },
c0f3af97 6653 /* b0 */
592d1631
L
6654 { Bad_Opcode },
6655 { Bad_Opcode },
6656 { Bad_Opcode },
6657 { Bad_Opcode },
6658 { Bad_Opcode },
6659 { Bad_Opcode },
6660 { Bad_Opcode },
6661 { Bad_Opcode },
c0f3af97 6662 /* b8 */
592d1631
L
6663 { Bad_Opcode },
6664 { Bad_Opcode },
6665 { Bad_Opcode },
6666 { Bad_Opcode },
6667 { Bad_Opcode },
6668 { Bad_Opcode },
6669 { Bad_Opcode },
6670 { Bad_Opcode },
c0f3af97 6671 /* c0 */
592d1631
L
6672 { Bad_Opcode },
6673 { Bad_Opcode },
6674 { Bad_Opcode },
6675 { Bad_Opcode },
6676 { Bad_Opcode },
6677 { Bad_Opcode },
6678 { Bad_Opcode },
6679 { Bad_Opcode },
c0f3af97 6680 /* c8 */
592d1631
L
6681 { Bad_Opcode },
6682 { Bad_Opcode },
6683 { Bad_Opcode },
6684 { Bad_Opcode },
6685 { Bad_Opcode },
6686 { Bad_Opcode },
7531c613
JB
6687 { VEX_W_TABLE (VEX_W_0F3ACE) },
6688 { VEX_W_TABLE (VEX_W_0F3ACF) },
c0f3af97 6689 /* d0 */
592d1631
L
6690 { Bad_Opcode },
6691 { Bad_Opcode },
6692 { Bad_Opcode },
6693 { Bad_Opcode },
6694 { Bad_Opcode },
6695 { Bad_Opcode },
6696 { Bad_Opcode },
6697 { Bad_Opcode },
c0f3af97 6698 /* d8 */
592d1631
L
6699 { Bad_Opcode },
6700 { Bad_Opcode },
6701 { Bad_Opcode },
6702 { Bad_Opcode },
6703 { Bad_Opcode },
6704 { Bad_Opcode },
6705 { Bad_Opcode },
7531c613 6706 { VEX_LEN_TABLE (VEX_LEN_0F3ADF) },
c0f3af97 6707 /* e0 */
592d1631
L
6708 { Bad_Opcode },
6709 { Bad_Opcode },
6710 { Bad_Opcode },
6711 { Bad_Opcode },
6712 { Bad_Opcode },
6713 { Bad_Opcode },
6714 { Bad_Opcode },
6715 { Bad_Opcode },
c0f3af97 6716 /* e8 */
592d1631
L
6717 { Bad_Opcode },
6718 { Bad_Opcode },
6719 { Bad_Opcode },
6720 { Bad_Opcode },
6721 { Bad_Opcode },
6722 { Bad_Opcode },
6723 { Bad_Opcode },
6724 { Bad_Opcode },
c0f3af97 6725 /* f0 */
14d10c6c 6726 { VEX_LEN_TABLE (VEX_LEN_0F3AF0) },
592d1631
L
6727 { Bad_Opcode },
6728 { Bad_Opcode },
6729 { Bad_Opcode },
6730 { Bad_Opcode },
6731 { Bad_Opcode },
6732 { Bad_Opcode },
6733 { Bad_Opcode },
c0f3af97 6734 /* f8 */
592d1631
L
6735 { Bad_Opcode },
6736 { Bad_Opcode },
6737 { Bad_Opcode },
6738 { Bad_Opcode },
6739 { Bad_Opcode },
6740 { Bad_Opcode },
6741 { Bad_Opcode },
6742 { Bad_Opcode },
c0f3af97
L
6743 },
6744};
6745
43234a1e 6746#include "i386-dis-evex.h"
ad692897 6747
c0f3af97 6748static const struct dis386 vex_len_table[][2] = {
18897deb 6749 /* VEX_LEN_0F12_P_0_M_0 / VEX_LEN_0F12_P_2_M_0 */
c0f3af97 6750 {
89e65d17 6751 { "vmovlpX", { XM, Vex, EXq }, 0 },
c0f3af97
L
6752 },
6753
592a252b 6754 /* VEX_LEN_0F12_P_0_M_1 */
c0f3af97 6755 {
89e65d17 6756 { "vmovhlps", { XM, Vex, EXq }, 0 },
c0f3af97
L
6757 },
6758
592a252b 6759 /* VEX_LEN_0F13_M_0 */
c0f3af97 6760 {
bf926894 6761 { "vmovlpX", { EXq, XM }, PREFIX_OPCODE },
c0f3af97
L
6762 },
6763
18897deb 6764 /* VEX_LEN_0F16_P_0_M_0 / VEX_LEN_0F16_P_2_M_0 */
c0f3af97 6765 {
89e65d17 6766 { "vmovhpX", { XM, Vex, EXq }, 0 },
c0f3af97
L
6767 },
6768
592a252b 6769 /* VEX_LEN_0F16_P_0_M_1 */
c0f3af97 6770 {
89e65d17 6771 { "vmovlhps", { XM, Vex, EXq }, 0 },
c0f3af97
L
6772 },
6773
592a252b 6774 /* VEX_LEN_0F17_M_0 */
c0f3af97 6775 {
bf926894 6776 { "vmovhpX", { EXq, XM }, PREFIX_OPCODE },
c0f3af97
L
6777 },
6778
43234a1e
L
6779 /* VEX_LEN_0F41_P_0 */
6780 {
6781 { Bad_Opcode },
6782 { VEX_W_TABLE (VEX_W_0F41_P_0_LEN_1) },
6783 },
1ba585e8
IT
6784 /* VEX_LEN_0F41_P_2 */
6785 {
6786 { Bad_Opcode },
6787 { VEX_W_TABLE (VEX_W_0F41_P_2_LEN_1) },
6788 },
43234a1e
L
6789 /* VEX_LEN_0F42_P_0 */
6790 {
6791 { Bad_Opcode },
6792 { VEX_W_TABLE (VEX_W_0F42_P_0_LEN_1) },
6793 },
1ba585e8
IT
6794 /* VEX_LEN_0F42_P_2 */
6795 {
6796 { Bad_Opcode },
6797 { VEX_W_TABLE (VEX_W_0F42_P_2_LEN_1) },
6798 },
43234a1e
L
6799 /* VEX_LEN_0F44_P_0 */
6800 {
6801 { VEX_W_TABLE (VEX_W_0F44_P_0_LEN_0) },
6802 },
1ba585e8
IT
6803 /* VEX_LEN_0F44_P_2 */
6804 {
6805 { VEX_W_TABLE (VEX_W_0F44_P_2_LEN_0) },
6806 },
43234a1e
L
6807 /* VEX_LEN_0F45_P_0 */
6808 {
6809 { Bad_Opcode },
6810 { VEX_W_TABLE (VEX_W_0F45_P_0_LEN_1) },
6811 },
1ba585e8
IT
6812 /* VEX_LEN_0F45_P_2 */
6813 {
6814 { Bad_Opcode },
6815 { VEX_W_TABLE (VEX_W_0F45_P_2_LEN_1) },
6816 },
43234a1e
L
6817 /* VEX_LEN_0F46_P_0 */
6818 {
6819 { Bad_Opcode },
6820 { VEX_W_TABLE (VEX_W_0F46_P_0_LEN_1) },
6821 },
1ba585e8
IT
6822 /* VEX_LEN_0F46_P_2 */
6823 {
6824 { Bad_Opcode },
6825 { VEX_W_TABLE (VEX_W_0F46_P_2_LEN_1) },
6826 },
43234a1e
L
6827 /* VEX_LEN_0F47_P_0 */
6828 {
6829 { Bad_Opcode },
6830 { VEX_W_TABLE (VEX_W_0F47_P_0_LEN_1) },
6831 },
1ba585e8
IT
6832 /* VEX_LEN_0F47_P_2 */
6833 {
6834 { Bad_Opcode },
6835 { VEX_W_TABLE (VEX_W_0F47_P_2_LEN_1) },
6836 },
6837 /* VEX_LEN_0F4A_P_0 */
6838 {
6839 { Bad_Opcode },
6840 { VEX_W_TABLE (VEX_W_0F4A_P_0_LEN_1) },
6841 },
6842 /* VEX_LEN_0F4A_P_2 */
6843 {
6844 { Bad_Opcode },
6845 { VEX_W_TABLE (VEX_W_0F4A_P_2_LEN_1) },
6846 },
6847 /* VEX_LEN_0F4B_P_0 */
6848 {
6849 { Bad_Opcode },
6850 { VEX_W_TABLE (VEX_W_0F4B_P_0_LEN_1) },
6851 },
43234a1e
L
6852 /* VEX_LEN_0F4B_P_2 */
6853 {
6854 { Bad_Opcode },
6855 { VEX_W_TABLE (VEX_W_0F4B_P_2_LEN_1) },
6856 },
6857
7531c613 6858 /* VEX_LEN_0F6E */
c0f3af97 6859 {
7531c613 6860 { "vmovK", { XMScalar, Edq }, PREFIX_DATA },
c0f3af97
L
6861 },
6862
035e7389 6863 /* VEX_LEN_0F77 */
c0f3af97 6864 {
ec6f095a
L
6865 { "vzeroupper", { XX }, 0 },
6866 { "vzeroall", { XX }, 0 },
c0f3af97
L
6867 },
6868
ec6f095a 6869 /* VEX_LEN_0F7E_P_1 */
c0f3af97 6870 {
5b872f7d 6871 { "vmovq", { XMScalar, EXxmm_mq }, 0 },
c0f3af97
L
6872 },
6873
ec6f095a 6874 /* VEX_LEN_0F7E_P_2 */
c0f3af97 6875 {
ec6f095a 6876 { "vmovK", { Edq, XMScalar }, 0 },
c0f3af97
L
6877 },
6878
ec6f095a 6879 /* VEX_LEN_0F90_P_0 */
c0f3af97 6880 {
ec6f095a 6881 { VEX_W_TABLE (VEX_W_0F90_P_0_LEN_0) },
c0f3af97
L
6882 },
6883
ec6f095a 6884 /* VEX_LEN_0F90_P_2 */
c0f3af97 6885 {
ec6f095a 6886 { VEX_W_TABLE (VEX_W_0F90_P_2_LEN_0) },
c0f3af97
L
6887 },
6888
ec6f095a 6889 /* VEX_LEN_0F91_P_0 */
c0f3af97 6890 {
ec6f095a 6891 { VEX_W_TABLE (VEX_W_0F91_P_0_LEN_0) },
c0f3af97
L
6892 },
6893
ec6f095a 6894 /* VEX_LEN_0F91_P_2 */
c0f3af97 6895 {
ec6f095a 6896 { VEX_W_TABLE (VEX_W_0F91_P_2_LEN_0) },
c0f3af97
L
6897 },
6898
ec6f095a 6899 /* VEX_LEN_0F92_P_0 */
c0f3af97 6900 {
ec6f095a 6901 { VEX_W_TABLE (VEX_W_0F92_P_0_LEN_0) },
c0f3af97
L
6902 },
6903
ec6f095a 6904 /* VEX_LEN_0F92_P_2 */
c0f3af97 6905 {
ec6f095a 6906 { VEX_W_TABLE (VEX_W_0F92_P_2_LEN_0) },
c0f3af97
L
6907 },
6908
ec6f095a 6909 /* VEX_LEN_0F92_P_3 */
c0f3af97 6910 {
58a211d2 6911 { MOD_TABLE (MOD_VEX_0F92_P_3_LEN_0) },
c0f3af97
L
6912 },
6913
ec6f095a 6914 /* VEX_LEN_0F93_P_0 */
c0f3af97 6915 {
ec6f095a 6916 { VEX_W_TABLE (VEX_W_0F93_P_0_LEN_0) },
c0f3af97
L
6917 },
6918
ec6f095a 6919 /* VEX_LEN_0F93_P_2 */
c0f3af97 6920 {
ec6f095a 6921 { VEX_W_TABLE (VEX_W_0F93_P_2_LEN_0) },
c0f3af97
L
6922 },
6923
ec6f095a 6924 /* VEX_LEN_0F93_P_3 */
c0f3af97 6925 {
58a211d2 6926 { MOD_TABLE (MOD_VEX_0F93_P_3_LEN_0) },
c0f3af97
L
6927 },
6928
ec6f095a 6929 /* VEX_LEN_0F98_P_0 */
43234a1e
L
6930 {
6931 { VEX_W_TABLE (VEX_W_0F98_P_0_LEN_0) },
6932 },
6933
1ba585e8
IT
6934 /* VEX_LEN_0F98_P_2 */
6935 {
6936 { VEX_W_TABLE (VEX_W_0F98_P_2_LEN_0) },
6937 },
6938
6939 /* VEX_LEN_0F99_P_0 */
6940 {
6941 { VEX_W_TABLE (VEX_W_0F99_P_0_LEN_0) },
6942 },
6943
6944 /* VEX_LEN_0F99_P_2 */
6945 {
6946 { VEX_W_TABLE (VEX_W_0F99_P_2_LEN_0) },
6947 },
6948
6c30d220 6949 /* VEX_LEN_0FAE_R_2_M_0 */
c0f3af97 6950 {
ec6f095a 6951 { "vldmxcsr", { Md }, 0 },
c0f3af97
L
6952 },
6953
6c30d220 6954 /* VEX_LEN_0FAE_R_3_M_0 */
c0f3af97 6955 {
ec6f095a 6956 { "vstmxcsr", { Md }, 0 },
c0f3af97
L
6957 },
6958
7531c613 6959 /* VEX_LEN_0FC4 */
c0f3af97 6960 {
7531c613 6961 { "vpinsrw", { XM, Vex, Edqw, Ib }, PREFIX_DATA },
c0f3af97
L
6962 },
6963
7531c613 6964 /* VEX_LEN_0FC5 */
c0f3af97 6965 {
7531c613 6966 { "vpextrw", { Gdq, XS, Ib }, PREFIX_DATA },
c0f3af97
L
6967 },
6968
7531c613 6969 /* VEX_LEN_0FD6 */
c0f3af97 6970 {
7531c613 6971 { "vmovq", { EXqS, XMScalar }, PREFIX_DATA },
c0f3af97
L
6972 },
6973
7531c613 6974 /* VEX_LEN_0FF7 */
c0f3af97 6975 {
7531c613 6976 { "vmaskmovdqu", { XM, XS }, PREFIX_DATA },
c0f3af97
L
6977 },
6978
7531c613 6979 /* VEX_LEN_0F3816 */
c0f3af97 6980 {
6c30d220 6981 { Bad_Opcode },
7531c613 6982 { VEX_W_TABLE (VEX_W_0F3816_L_1) },
c0f3af97
L
6983 },
6984
7531c613 6985 /* VEX_LEN_0F3819 */
c0f3af97 6986 {
6c30d220 6987 { Bad_Opcode },
7531c613 6988 { VEX_W_TABLE (VEX_W_0F3819_L_1) },
c0f3af97
L
6989 },
6990
7531c613 6991 /* VEX_LEN_0F381A_M_0 */
c0f3af97 6992 {
6c30d220 6993 { Bad_Opcode },
7531c613 6994 { VEX_W_TABLE (VEX_W_0F381A_M_0_L_1) },
c0f3af97
L
6995 },
6996
7531c613 6997 /* VEX_LEN_0F3836 */
c0f3af97 6998 {
6c30d220 6999 { Bad_Opcode },
7531c613 7000 { VEX_W_TABLE (VEX_W_0F3836) },
c0f3af97
L
7001 },
7002
7531c613 7003 /* VEX_LEN_0F3841 */
c0f3af97 7004 {
7531c613 7005 { "vphminposuw", { XM, EXx }, PREFIX_DATA },
c0f3af97
L
7006 },
7007
260cd341
LC
7008 /* VEX_LEN_0F3849_X86_64_P_0_W_0_M_0 */
7009 {
7010 { "ldtilecfg", { M }, 0 },
7011 },
7012
7013 /* VEX_LEN_0F3849_X86_64_P_0_W_0_M_1_REG_0_RM_0 */
7014 {
7015 { "tilerelease", { Skip_MODRM }, 0 },
7016 },
7017
7018 /* VEX_LEN_0F3849_X86_64_P_2_W_0_M_0 */
7019 {
7020 { "sttilecfg", { M }, 0 },
7021 },
7022
7023 /* VEX_LEN_0F3849_X86_64_P_3_W_0_M_0 */
7024 {
7025 { "tilezero", { TMM, Skip_MODRM }, 0 },
7026 },
7027
7028 /* VEX_LEN_0F384B_X86_64_P_1_W_0_M_0 */
7029 {
7030 { "tilestored", { MVexSIBMEM, TMM }, 0 },
7031 },
7032 /* VEX_LEN_0F384B_X86_64_P_2_W_0_M_0 */
7033 {
7034 { "tileloaddt1", { TMM, MVexSIBMEM }, 0 },
7035 },
7036
7037 /* VEX_LEN_0F384B_X86_64_P_3_W_0_M_0 */
7038 {
7039 { "tileloadd", { TMM, MVexSIBMEM }, 0 },
7040 },
7041
7531c613 7042 /* VEX_LEN_0F385A_M_0 */
6c30d220
L
7043 {
7044 { Bad_Opcode },
7531c613 7045 { VEX_W_TABLE (VEX_W_0F385A_M_0_L_0) },
6c30d220
L
7046 },
7047
260cd341
LC
7048 /* VEX_LEN_0F385C_X86_64_P_1_W_0_M_0 */
7049 {
7050 { "tdpbf16ps", { TMM, EXtmm, VexTmm }, 0 },
7051 },
7052
7053 /* VEX_LEN_0F385E_X86_64_P_0_W_0_M_0 */
7054 {
7055 { "tdpbuud", {TMM, EXtmm, VexTmm }, 0 },
7056 },
7057
7058 /* VEX_LEN_0F385E_X86_64_P_1_W_0_M_0 */
7059 {
7060 { "tdpbsud", {TMM, EXtmm, VexTmm }, 0 },
7061 },
7062
7063 /* VEX_LEN_0F385E_X86_64_P_2_W_0_M_0 */
7064 {
7065 { "tdpbusd", {TMM, EXtmm, VexTmm }, 0 },
7066 },
7067
7068 /* VEX_LEN_0F385E_X86_64_P_3_W_0_M_0 */
7069 {
7070 { "tdpbssd", {TMM, EXtmm, VexTmm }, 0 },
7071 },
7072
7531c613 7073 /* VEX_LEN_0F38DB */
a5ff0eb2 7074 {
7531c613 7075 { "vaesimc", { XM, EXx }, PREFIX_DATA },
a5ff0eb2
L
7076 },
7077
035e7389 7078 /* VEX_LEN_0F38F2 */
f12dc422 7079 {
035e7389 7080 { "andnS", { Gdq, VexGdq, Edq }, PREFIX_OPCODE },
f12dc422
L
7081 },
7082
14d10c6c 7083 /* VEX_LEN_0F38F3 */
6c30d220 7084 {
14d10c6c 7085 { REG_TABLE(REG_VEX_0F38F3_L_0) },
6c30d220
L
7086 },
7087
14d10c6c 7088 /* VEX_LEN_0F38F5 */
f12dc422 7089 {
14d10c6c 7090 { PREFIX_TABLE(PREFIX_VEX_0F38F5_L_0) },
f12dc422
L
7091 },
7092
14d10c6c 7093 /* VEX_LEN_0F38F6 */
6c30d220 7094 {
14d10c6c 7095 { PREFIX_TABLE(PREFIX_VEX_0F38F6_L_0) },
6c30d220
L
7096 },
7097
14d10c6c 7098 /* VEX_LEN_0F38F7 */
6c30d220 7099 {
14d10c6c 7100 { PREFIX_TABLE(PREFIX_VEX_0F38F7_L_0) },
6c30d220
L
7101 },
7102
7531c613 7103 /* VEX_LEN_0F3A00 */
6c30d220
L
7104 {
7105 { Bad_Opcode },
7531c613 7106 { VEX_W_TABLE (VEX_W_0F3A00_L_1) },
6c30d220
L
7107 },
7108
7531c613 7109 /* VEX_LEN_0F3A01 */
6c30d220
L
7110 {
7111 { Bad_Opcode },
7531c613 7112 { VEX_W_TABLE (VEX_W_0F3A01_L_1) },
6c30d220
L
7113 },
7114
7531c613 7115 /* VEX_LEN_0F3A06 */
c0f3af97 7116 {
592d1631 7117 { Bad_Opcode },
7531c613 7118 { VEX_W_TABLE (VEX_W_0F3A06_L_1) },
c0f3af97
L
7119 },
7120
7531c613 7121 /* VEX_LEN_0F3A14 */
c0f3af97 7122 {
7531c613 7123 { "vpextrb", { Edqb, XM, Ib }, PREFIX_DATA },
c0f3af97
L
7124 },
7125
7531c613 7126 /* VEX_LEN_0F3A15 */
c0f3af97 7127 {
7531c613 7128 { "vpextrw", { Edqw, XM, Ib }, PREFIX_DATA },
c0f3af97
L
7129 },
7130
7531c613 7131 /* VEX_LEN_0F3A16 */
c0f3af97 7132 {
7531c613 7133 { "vpextrK", { Edq, XM, Ib }, PREFIX_DATA },
c0f3af97
L
7134 },
7135
7531c613 7136 /* VEX_LEN_0F3A17 */
c0f3af97 7137 {
7531c613 7138 { "vextractps", { Edqd, XM, Ib }, PREFIX_DATA },
c0f3af97
L
7139 },
7140
7531c613 7141 /* VEX_LEN_0F3A18 */
c0f3af97 7142 {
592d1631 7143 { Bad_Opcode },
7531c613 7144 { VEX_W_TABLE (VEX_W_0F3A18_L_1) },
c0f3af97
L
7145 },
7146
7531c613 7147 /* VEX_LEN_0F3A19 */
c0f3af97 7148 {
592d1631 7149 { Bad_Opcode },
7531c613 7150 { VEX_W_TABLE (VEX_W_0F3A19_L_1) },
c0f3af97
L
7151 },
7152
7531c613 7153 /* VEX_LEN_0F3A20 */
c0f3af97 7154 {
7531c613 7155 { "vpinsrb", { XM, Vex, Edqb, Ib }, PREFIX_DATA },
c0f3af97
L
7156 },
7157
7531c613 7158 /* VEX_LEN_0F3A21 */
c0f3af97 7159 {
7531c613 7160 { "vinsertps", { XM, Vex, EXd, Ib }, PREFIX_DATA },
c0f3af97
L
7161 },
7162
7531c613 7163 /* VEX_LEN_0F3A22 */
c0f3af97 7164 {
7531c613 7165 { "vpinsrK", { XM, Vex, Edq, Ib }, PREFIX_DATA },
c0f3af97
L
7166 },
7167
7531c613 7168 /* VEX_LEN_0F3A30 */
43234a1e 7169 {
bb5b3501 7170 { MOD_TABLE (MOD_VEX_0F3A30_L_0) },
43234a1e
L
7171 },
7172
7531c613 7173 /* VEX_LEN_0F3A31 */
1ba585e8 7174 {
bb5b3501 7175 { MOD_TABLE (MOD_VEX_0F3A31_L_0) },
1ba585e8
IT
7176 },
7177
7531c613 7178 /* VEX_LEN_0F3A32 */
43234a1e 7179 {
bb5b3501 7180 { MOD_TABLE (MOD_VEX_0F3A32_L_0) },
43234a1e
L
7181 },
7182
7531c613 7183 /* VEX_LEN_0F3A33 */
1ba585e8 7184 {
bb5b3501 7185 { MOD_TABLE (MOD_VEX_0F3A33_L_0) },
1ba585e8
IT
7186 },
7187
7531c613 7188 /* VEX_LEN_0F3A38 */
c0f3af97 7189 {
6c30d220 7190 { Bad_Opcode },
7531c613 7191 { VEX_W_TABLE (VEX_W_0F3A38_L_1) },
c0f3af97
L
7192 },
7193
7531c613 7194 /* VEX_LEN_0F3A39 */
c0f3af97 7195 {
6c30d220 7196 { Bad_Opcode },
7531c613 7197 { VEX_W_TABLE (VEX_W_0F3A39_L_1) },
6c30d220
L
7198 },
7199
7531c613 7200 /* VEX_LEN_0F3A41 */
6c30d220 7201 {
7531c613 7202 { "vdppd", { XM, Vex, EXx, Ib }, PREFIX_DATA },
c0f3af97
L
7203 },
7204
7531c613 7205 /* VEX_LEN_0F3A46 */
c0f3af97 7206 {
6c30d220 7207 { Bad_Opcode },
7531c613 7208 { VEX_W_TABLE (VEX_W_0F3A46_L_1) },
c0f3af97
L
7209 },
7210
7531c613 7211 /* VEX_LEN_0F3A60 */
c0f3af97 7212 {
7531c613 7213 { "vpcmpestrm!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
c0f3af97
L
7214 },
7215
7531c613 7216 /* VEX_LEN_0F3A61 */
c0f3af97 7217 {
7531c613 7218 { "vpcmpestri!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
c0f3af97
L
7219 },
7220
7531c613 7221 /* VEX_LEN_0F3A62 */
c0f3af97 7222 {
7531c613 7223 { "vpcmpistrm", { XM, EXx, Ib }, PREFIX_DATA },
c0f3af97
L
7224 },
7225
7531c613 7226 /* VEX_LEN_0F3A63 */
c0f3af97 7227 {
7531c613 7228 { "vpcmpistri", { XM, EXx, Ib }, PREFIX_DATA },
c0f3af97
L
7229 },
7230
7531c613 7231 /* VEX_LEN_0F3ADF */
a5ff0eb2 7232 {
7531c613 7233 { "vaeskeygenassist", { XM, EXx, Ib }, PREFIX_DATA },
a5ff0eb2 7234 },
4c807e72 7235
14d10c6c 7236 /* VEX_LEN_0F3AF0 */
6c30d220 7237 {
14d10c6c 7238 { PREFIX_TABLE (PREFIX_VEX_0F3AF0_L_0) },
6c30d220
L
7239 },
7240
467bbef0
JB
7241 /* VEX_LEN_0FXOP_08_85 */
7242 {
7243 { VEX_W_TABLE (VEX_W_0FXOP_08_85_L_0) },
7244 },
7245
7246 /* VEX_LEN_0FXOP_08_86 */
7247 {
7248 { VEX_W_TABLE (VEX_W_0FXOP_08_86_L_0) },
7249 },
7250
7251 /* VEX_LEN_0FXOP_08_87 */
7252 {
7253 { VEX_W_TABLE (VEX_W_0FXOP_08_87_L_0) },
7254 },
7255
7256 /* VEX_LEN_0FXOP_08_8E */
7257 {
7258 { VEX_W_TABLE (VEX_W_0FXOP_08_8E_L_0) },
7259 },
7260
7261 /* VEX_LEN_0FXOP_08_8F */
7262 {
7263 { VEX_W_TABLE (VEX_W_0FXOP_08_8F_L_0) },
7264 },
7265
7266 /* VEX_LEN_0FXOP_08_95 */
7267 {
7268 { VEX_W_TABLE (VEX_W_0FXOP_08_95_L_0) },
7269 },
7270
7271 /* VEX_LEN_0FXOP_08_96 */
7272 {
7273 { VEX_W_TABLE (VEX_W_0FXOP_08_96_L_0) },
7274 },
7275
7276 /* VEX_LEN_0FXOP_08_97 */
7277 {
7278 { VEX_W_TABLE (VEX_W_0FXOP_08_97_L_0) },
7279 },
7280
7281 /* VEX_LEN_0FXOP_08_9E */
7282 {
7283 { VEX_W_TABLE (VEX_W_0FXOP_08_9E_L_0) },
7284 },
7285
7286 /* VEX_LEN_0FXOP_08_9F */
7287 {
7288 { VEX_W_TABLE (VEX_W_0FXOP_08_9F_L_0) },
7289 },
7290
7291 /* VEX_LEN_0FXOP_08_A3 */
7292 {
7293 { "vpperm", { XM, Vex, EXx, XMVexI4 }, 0 },
7294 },
7295
7296 /* VEX_LEN_0FXOP_08_A6 */
7297 {
7298 { VEX_W_TABLE (VEX_W_0FXOP_08_A6_L_0) },
7299 },
7300
7301 /* VEX_LEN_0FXOP_08_B6 */
7302 {
7303 { VEX_W_TABLE (VEX_W_0FXOP_08_B6_L_0) },
7304 },
7305
7306 /* VEX_LEN_0FXOP_08_C0 */
7307 {
7308 { VEX_W_TABLE (VEX_W_0FXOP_08_C0_L_0) },
7309 },
7310
7311 /* VEX_LEN_0FXOP_08_C1 */
7312 {
7313 { VEX_W_TABLE (VEX_W_0FXOP_08_C1_L_0) },
7314 },
7315
7316 /* VEX_LEN_0FXOP_08_C2 */
7317 {
7318 { VEX_W_TABLE (VEX_W_0FXOP_08_C2_L_0) },
7319 },
7320
7321 /* VEX_LEN_0FXOP_08_C3 */
7322 {
7323 { VEX_W_TABLE (VEX_W_0FXOP_08_C3_L_0) },
7324 },
7325
ff688e1f
L
7326 /* VEX_LEN_0FXOP_08_CC */
7327 {
467bbef0 7328 { VEX_W_TABLE (VEX_W_0FXOP_08_CC_L_0) },
ff688e1f
L
7329 },
7330
7331 /* VEX_LEN_0FXOP_08_CD */
7332 {
467bbef0 7333 { VEX_W_TABLE (VEX_W_0FXOP_08_CD_L_0) },
ff688e1f
L
7334 },
7335
7336 /* VEX_LEN_0FXOP_08_CE */
7337 {
467bbef0 7338 { VEX_W_TABLE (VEX_W_0FXOP_08_CE_L_0) },
ff688e1f
L
7339 },
7340
7341 /* VEX_LEN_0FXOP_08_CF */
7342 {
467bbef0 7343 { VEX_W_TABLE (VEX_W_0FXOP_08_CF_L_0) },
ff688e1f
L
7344 },
7345
7346 /* VEX_LEN_0FXOP_08_EC */
7347 {
467bbef0 7348 { VEX_W_TABLE (VEX_W_0FXOP_08_EC_L_0) },
ff688e1f
L
7349 },
7350
7351 /* VEX_LEN_0FXOP_08_ED */
7352 {
467bbef0 7353 { VEX_W_TABLE (VEX_W_0FXOP_08_ED_L_0) },
ff688e1f
L
7354 },
7355
7356 /* VEX_LEN_0FXOP_08_EE */
7357 {
467bbef0 7358 { VEX_W_TABLE (VEX_W_0FXOP_08_EE_L_0) },
ff688e1f
L
7359 },
7360
7361 /* VEX_LEN_0FXOP_08_EF */
7362 {
467bbef0
JB
7363 { VEX_W_TABLE (VEX_W_0FXOP_08_EF_L_0) },
7364 },
7365
7366 /* VEX_LEN_0FXOP_09_01 */
7367 {
7368 { REG_TABLE (REG_0FXOP_09_01_L_0) },
7369 },
7370
7371 /* VEX_LEN_0FXOP_09_02 */
7372 {
7373 { REG_TABLE (REG_0FXOP_09_02_L_0) },
7374 },
7375
7376 /* VEX_LEN_0FXOP_09_12_M_1 */
7377 {
7378 { REG_TABLE (REG_0FXOP_09_12_M_1_L_0) },
ff688e1f
L
7379 },
7380
b5b098c2 7381 /* VEX_LEN_0FXOP_09_82_W_0 */
5dd85c99 7382 {
b5b098c2 7383 { "vfrczss", { XM, EXd }, 0 },
5dd85c99 7384 },
4c807e72 7385
b5b098c2 7386 /* VEX_LEN_0FXOP_09_83_W_0 */
5dd85c99 7387 {
b5b098c2 7388 { "vfrczsd", { XM, EXq }, 0 },
5dd85c99 7389 },
467bbef0
JB
7390
7391 /* VEX_LEN_0FXOP_09_90 */
7392 {
7393 { "vprotb", { XM, EXx, VexW }, 0 },
7394 },
7395
7396 /* VEX_LEN_0FXOP_09_91 */
7397 {
7398 { "vprotw", { XM, EXx, VexW }, 0 },
7399 },
7400
7401 /* VEX_LEN_0FXOP_09_92 */
7402 {
7403 { "vprotd", { XM, EXx, VexW }, 0 },
7404 },
7405
7406 /* VEX_LEN_0FXOP_09_93 */
7407 {
7408 { "vprotq", { XM, EXx, VexW }, 0 },
7409 },
7410
7411 /* VEX_LEN_0FXOP_09_94 */
7412 {
7413 { "vpshlb", { XM, EXx, VexW }, 0 },
7414 },
7415
7416 /* VEX_LEN_0FXOP_09_95 */
7417 {
7418 { "vpshlw", { XM, EXx, VexW }, 0 },
7419 },
7420
7421 /* VEX_LEN_0FXOP_09_96 */
7422 {
7423 { "vpshld", { XM, EXx, VexW }, 0 },
7424 },
7425
7426 /* VEX_LEN_0FXOP_09_97 */
7427 {
7428 { "vpshlq", { XM, EXx, VexW }, 0 },
7429 },
7430
7431 /* VEX_LEN_0FXOP_09_98 */
7432 {
7433 { "vpshab", { XM, EXx, VexW }, 0 },
7434 },
7435
7436 /* VEX_LEN_0FXOP_09_99 */
7437 {
7438 { "vpshaw", { XM, EXx, VexW }, 0 },
7439 },
7440
7441 /* VEX_LEN_0FXOP_09_9A */
7442 {
7443 { "vpshad", { XM, EXx, VexW }, 0 },
7444 },
7445
7446 /* VEX_LEN_0FXOP_09_9B */
7447 {
7448 { "vpshaq", { XM, EXx, VexW }, 0 },
7449 },
7450
7451 /* VEX_LEN_0FXOP_09_C1 */
7452 {
7453 { VEX_W_TABLE (VEX_W_0FXOP_09_C1_L_0) },
7454 },
7455
7456 /* VEX_LEN_0FXOP_09_C2 */
7457 {
7458 { VEX_W_TABLE (VEX_W_0FXOP_09_C2_L_0) },
7459 },
7460
7461 /* VEX_LEN_0FXOP_09_C3 */
7462 {
7463 { VEX_W_TABLE (VEX_W_0FXOP_09_C3_L_0) },
7464 },
7465
7466 /* VEX_LEN_0FXOP_09_C6 */
7467 {
7468 { VEX_W_TABLE (VEX_W_0FXOP_09_C6_L_0) },
7469 },
7470
7471 /* VEX_LEN_0FXOP_09_C7 */
7472 {
7473 { VEX_W_TABLE (VEX_W_0FXOP_09_C7_L_0) },
7474 },
7475
7476 /* VEX_LEN_0FXOP_09_CB */
7477 {
7478 { VEX_W_TABLE (VEX_W_0FXOP_09_CB_L_0) },
7479 },
7480
7481 /* VEX_LEN_0FXOP_09_D1 */
7482 {
7483 { VEX_W_TABLE (VEX_W_0FXOP_09_D1_L_0) },
7484 },
7485
7486 /* VEX_LEN_0FXOP_09_D2 */
7487 {
7488 { VEX_W_TABLE (VEX_W_0FXOP_09_D2_L_0) },
7489 },
7490
7491 /* VEX_LEN_0FXOP_09_D3 */
7492 {
7493 { VEX_W_TABLE (VEX_W_0FXOP_09_D3_L_0) },
7494 },
7495
7496 /* VEX_LEN_0FXOP_09_D6 */
7497 {
7498 { VEX_W_TABLE (VEX_W_0FXOP_09_D6_L_0) },
7499 },
7500
7501 /* VEX_LEN_0FXOP_09_D7 */
7502 {
7503 { VEX_W_TABLE (VEX_W_0FXOP_09_D7_L_0) },
7504 },
7505
7506 /* VEX_LEN_0FXOP_09_DB */
7507 {
7508 { VEX_W_TABLE (VEX_W_0FXOP_09_DB_L_0) },
7509 },
7510
7511 /* VEX_LEN_0FXOP_09_E1 */
7512 {
7513 { VEX_W_TABLE (VEX_W_0FXOP_09_E1_L_0) },
7514 },
7515
7516 /* VEX_LEN_0FXOP_09_E2 */
7517 {
7518 { VEX_W_TABLE (VEX_W_0FXOP_09_E2_L_0) },
7519 },
7520
7521 /* VEX_LEN_0FXOP_09_E3 */
7522 {
7523 { VEX_W_TABLE (VEX_W_0FXOP_09_E3_L_0) },
7524 },
7525
7526 /* VEX_LEN_0FXOP_0A_12 */
7527 {
7528 { REG_TABLE (REG_0FXOP_0A_12_L_0) },
7529 },
331d2d0d
L
7530};
7531
ad692897 7532#include "i386-dis-evex-len.h"
04e2a182 7533
9e30b8e0 7534static const struct dis386 vex_w_table[][2] = {
43234a1e
L
7535 {
7536 /* VEX_W_0F41_P_0_LEN_1 */
ab4e4ed5
AF
7537 { MOD_TABLE (MOD_VEX_W_0_0F41_P_0_LEN_1) },
7538 { MOD_TABLE (MOD_VEX_W_1_0F41_P_0_LEN_1) },
1ba585e8
IT
7539 },
7540 {
7541 /* VEX_W_0F41_P_2_LEN_1 */
ab4e4ed5
AF
7542 { MOD_TABLE (MOD_VEX_W_0_0F41_P_2_LEN_1) },
7543 { MOD_TABLE (MOD_VEX_W_1_0F41_P_2_LEN_1) }
43234a1e
L
7544 },
7545 {
7546 /* VEX_W_0F42_P_0_LEN_1 */
ab4e4ed5
AF
7547 { MOD_TABLE (MOD_VEX_W_0_0F42_P_0_LEN_1) },
7548 { MOD_TABLE (MOD_VEX_W_1_0F42_P_0_LEN_1) },
1ba585e8
IT
7549 },
7550 {
7551 /* VEX_W_0F42_P_2_LEN_1 */
ab4e4ed5
AF
7552 { MOD_TABLE (MOD_VEX_W_0_0F42_P_2_LEN_1) },
7553 { MOD_TABLE (MOD_VEX_W_1_0F42_P_2_LEN_1) },
43234a1e
L
7554 },
7555 {
7556 /* VEX_W_0F44_P_0_LEN_0 */
ab4e4ed5
AF
7557 { MOD_TABLE (MOD_VEX_W_0_0F44_P_0_LEN_1) },
7558 { MOD_TABLE (MOD_VEX_W_1_0F44_P_0_LEN_1) },
1ba585e8
IT
7559 },
7560 {
7561 /* VEX_W_0F44_P_2_LEN_0 */
ab4e4ed5
AF
7562 { MOD_TABLE (MOD_VEX_W_0_0F44_P_2_LEN_1) },
7563 { MOD_TABLE (MOD_VEX_W_1_0F44_P_2_LEN_1) },
43234a1e
L
7564 },
7565 {
ec6f095a
L
7566 /* VEX_W_0F45_P_0_LEN_1 */
7567 { MOD_TABLE (MOD_VEX_W_0_0F45_P_0_LEN_1) },
7568 { MOD_TABLE (MOD_VEX_W_1_0F45_P_0_LEN_1) },
9e30b8e0
L
7569 },
7570 {
ec6f095a
L
7571 /* VEX_W_0F45_P_2_LEN_1 */
7572 { MOD_TABLE (MOD_VEX_W_0_0F45_P_2_LEN_1) },
7573 { MOD_TABLE (MOD_VEX_W_1_0F45_P_2_LEN_1) },
9e30b8e0
L
7574 },
7575 {
ec6f095a
L
7576 /* VEX_W_0F46_P_0_LEN_1 */
7577 { MOD_TABLE (MOD_VEX_W_0_0F46_P_0_LEN_1) },
7578 { MOD_TABLE (MOD_VEX_W_1_0F46_P_0_LEN_1) },
9e30b8e0
L
7579 },
7580 {
ec6f095a
L
7581 /* VEX_W_0F46_P_2_LEN_1 */
7582 { MOD_TABLE (MOD_VEX_W_0_0F46_P_2_LEN_1) },
7583 { MOD_TABLE (MOD_VEX_W_1_0F46_P_2_LEN_1) },
9e30b8e0
L
7584 },
7585 {
ec6f095a
L
7586 /* VEX_W_0F47_P_0_LEN_1 */
7587 { MOD_TABLE (MOD_VEX_W_0_0F47_P_0_LEN_1) },
7588 { MOD_TABLE (MOD_VEX_W_1_0F47_P_0_LEN_1) },
9e30b8e0
L
7589 },
7590 {
ec6f095a
L
7591 /* VEX_W_0F47_P_2_LEN_1 */
7592 { MOD_TABLE (MOD_VEX_W_0_0F47_P_2_LEN_1) },
7593 { MOD_TABLE (MOD_VEX_W_1_0F47_P_2_LEN_1) },
9e30b8e0
L
7594 },
7595 {
ec6f095a
L
7596 /* VEX_W_0F4A_P_0_LEN_1 */
7597 { MOD_TABLE (MOD_VEX_W_0_0F4A_P_0_LEN_1) },
7598 { MOD_TABLE (MOD_VEX_W_1_0F4A_P_0_LEN_1) },
9e30b8e0
L
7599 },
7600 {
ec6f095a
L
7601 /* VEX_W_0F4A_P_2_LEN_1 */
7602 { MOD_TABLE (MOD_VEX_W_0_0F4A_P_2_LEN_1) },
7603 { MOD_TABLE (MOD_VEX_W_1_0F4A_P_2_LEN_1) },
9e30b8e0
L
7604 },
7605 {
ec6f095a
L
7606 /* VEX_W_0F4B_P_0_LEN_1 */
7607 { MOD_TABLE (MOD_VEX_W_0_0F4B_P_0_LEN_1) },
7608 { MOD_TABLE (MOD_VEX_W_1_0F4B_P_0_LEN_1) },
9e30b8e0
L
7609 },
7610 {
ec6f095a
L
7611 /* VEX_W_0F4B_P_2_LEN_1 */
7612 { MOD_TABLE (MOD_VEX_W_0_0F4B_P_2_LEN_1) },
9e30b8e0
L
7613 },
7614 {
ec6f095a
L
7615 /* VEX_W_0F90_P_0_LEN_0 */
7616 { "kmovw", { MaskG, MaskE }, 0 },
7617 { "kmovq", { MaskG, MaskE }, 0 },
9e30b8e0
L
7618 },
7619 {
ec6f095a
L
7620 /* VEX_W_0F90_P_2_LEN_0 */
7621 { "kmovb", { MaskG, MaskBDE }, 0 },
7622 { "kmovd", { MaskG, MaskBDE }, 0 },
9e30b8e0
L
7623 },
7624 {
ec6f095a
L
7625 /* VEX_W_0F91_P_0_LEN_0 */
7626 { MOD_TABLE (MOD_VEX_W_0_0F91_P_0_LEN_0) },
7627 { MOD_TABLE (MOD_VEX_W_1_0F91_P_0_LEN_0) },
9e30b8e0
L
7628 },
7629 {
ec6f095a
L
7630 /* VEX_W_0F91_P_2_LEN_0 */
7631 { MOD_TABLE (MOD_VEX_W_0_0F91_P_2_LEN_0) },
7632 { MOD_TABLE (MOD_VEX_W_1_0F91_P_2_LEN_0) },
9e30b8e0
L
7633 },
7634 {
ec6f095a
L
7635 /* VEX_W_0F92_P_0_LEN_0 */
7636 { MOD_TABLE (MOD_VEX_W_0_0F92_P_0_LEN_0) },
9e30b8e0
L
7637 },
7638 {
ec6f095a
L
7639 /* VEX_W_0F92_P_2_LEN_0 */
7640 { MOD_TABLE (MOD_VEX_W_0_0F92_P_2_LEN_0) },
9e30b8e0 7641 },
9e30b8e0 7642 {
ec6f095a
L
7643 /* VEX_W_0F93_P_0_LEN_0 */
7644 { MOD_TABLE (MOD_VEX_W_0_0F93_P_0_LEN_0) },
9e30b8e0
L
7645 },
7646 {
ec6f095a
L
7647 /* VEX_W_0F93_P_2_LEN_0 */
7648 { MOD_TABLE (MOD_VEX_W_0_0F93_P_2_LEN_0) },
9e30b8e0 7649 },
9e30b8e0 7650 {
ec6f095a
L
7651 /* VEX_W_0F98_P_0_LEN_0 */
7652 { MOD_TABLE (MOD_VEX_W_0_0F98_P_0_LEN_0) },
7653 { MOD_TABLE (MOD_VEX_W_1_0F98_P_0_LEN_0) },
9e30b8e0
L
7654 },
7655 {
ec6f095a
L
7656 /* VEX_W_0F98_P_2_LEN_0 */
7657 { MOD_TABLE (MOD_VEX_W_0_0F98_P_2_LEN_0) },
7658 { MOD_TABLE (MOD_VEX_W_1_0F98_P_2_LEN_0) },
9e30b8e0
L
7659 },
7660 {
ec6f095a
L
7661 /* VEX_W_0F99_P_0_LEN_0 */
7662 { MOD_TABLE (MOD_VEX_W_0_0F99_P_0_LEN_0) },
7663 { MOD_TABLE (MOD_VEX_W_1_0F99_P_0_LEN_0) },
9e30b8e0
L
7664 },
7665 {
ec6f095a
L
7666 /* VEX_W_0F99_P_2_LEN_0 */
7667 { MOD_TABLE (MOD_VEX_W_0_0F99_P_2_LEN_0) },
7668 { MOD_TABLE (MOD_VEX_W_1_0F99_P_2_LEN_0) },
9e30b8e0 7669 },
9e30b8e0 7670 {
7531c613
JB
7671 /* VEX_W_0F380C */
7672 { "vpermilps", { XM, Vex, EXx }, PREFIX_DATA },
9e30b8e0
L
7673 },
7674 {
7531c613
JB
7675 /* VEX_W_0F380D */
7676 { "vpermilpd", { XM, Vex, EXx }, PREFIX_DATA },
9e30b8e0
L
7677 },
7678 {
7531c613
JB
7679 /* VEX_W_0F380E */
7680 { "vtestps", { XM, EXx }, PREFIX_DATA },
9e30b8e0
L
7681 },
7682 {
7531c613
JB
7683 /* VEX_W_0F380F */
7684 { "vtestpd", { XM, EXx }, PREFIX_DATA },
9e30b8e0 7685 },
6431c801 7686 {
7531c613
JB
7687 /* VEX_W_0F3813 */
7688 { "vcvtph2ps", { XM, EXxmmq }, PREFIX_DATA },
6431c801 7689 },
6c30d220 7690 {
7531c613
JB
7691 /* VEX_W_0F3816_L_1 */
7692 { "vpermps", { XM, Vex, EXx }, PREFIX_DATA },
6c30d220 7693 },
bcf2684f 7694 {
7531c613
JB
7695 /* VEX_W_0F3818 */
7696 { "vbroadcastss", { XM, EXxmm_md }, PREFIX_DATA },
bcf2684f 7697 },
9e30b8e0 7698 {
7531c613
JB
7699 /* VEX_W_0F3819_L_1 */
7700 { "vbroadcastsd", { XM, EXxmm_mq }, PREFIX_DATA },
9e30b8e0
L
7701 },
7702 {
7531c613
JB
7703 /* VEX_W_0F381A_M_0_L_1 */
7704 { "vbroadcastf128", { XM, Mxmm }, PREFIX_DATA },
9e30b8e0 7705 },
53aa04a0 7706 {
7531c613
JB
7707 /* VEX_W_0F382C_M_0 */
7708 { "vmaskmovps", { XM, Vex, Mx }, PREFIX_DATA },
53aa04a0
L
7709 },
7710 {
7531c613
JB
7711 /* VEX_W_0F382D_M_0 */
7712 { "vmaskmovpd", { XM, Vex, Mx }, PREFIX_DATA },
53aa04a0
L
7713 },
7714 {
7531c613
JB
7715 /* VEX_W_0F382E_M_0 */
7716 { "vmaskmovps", { Mx, Vex, XM }, PREFIX_DATA },
53aa04a0
L
7717 },
7718 {
7531c613
JB
7719 /* VEX_W_0F382F_M_0 */
7720 { "vmaskmovpd", { Mx, Vex, XM }, PREFIX_DATA },
53aa04a0 7721 },
6c30d220 7722 {
7531c613
JB
7723 /* VEX_W_0F3836 */
7724 { "vpermd", { XM, Vex, EXx }, PREFIX_DATA },
9e30b8e0 7725 },
6c30d220 7726 {
7531c613
JB
7727 /* VEX_W_0F3846 */
7728 { "vpsravd", { XM, Vex, EXx }, PREFIX_DATA },
6c30d220 7729 },
260cd341
LC
7730 {
7731 /* VEX_W_0F3849_X86_64_P_0 */
7732 { MOD_TABLE (MOD_VEX_0F3849_X86_64_P_0_W_0) },
7733 },
7734 {
7735 /* VEX_W_0F3849_X86_64_P_2 */
7736 { MOD_TABLE (MOD_VEX_0F3849_X86_64_P_2_W_0) },
7737 },
7738 {
7739 /* VEX_W_0F3849_X86_64_P_3 */
7740 { MOD_TABLE (MOD_VEX_0F3849_X86_64_P_3_W_0) },
7741 },
7742 {
7743 /* VEX_W_0F384B_X86_64_P_1 */
7744 { MOD_TABLE (MOD_VEX_0F384B_X86_64_P_1_W_0) },
7745 },
7746 {
7747 /* VEX_W_0F384B_X86_64_P_2 */
7748 { MOD_TABLE (MOD_VEX_0F384B_X86_64_P_2_W_0) },
7749 },
7750 {
7751 /* VEX_W_0F384B_X86_64_P_3 */
7752 { MOD_TABLE (MOD_VEX_0F384B_X86_64_P_3_W_0) },
7753 },
58bf9b6a
L
7754 {
7755 /* VEX_W_0F3850 */
7756 { "%XV vpdpbusd", { XM, Vex, EXx }, 0 },
7757 },
7758 {
7759 /* VEX_W_0F3851 */
7760 { "%XV vpdpbusds", { XM, Vex, EXx }, 0 },
7761 },
7762 {
7763 /* VEX_W_0F3852 */
7764 { "%XV vpdpwssd", { XM, Vex, EXx }, 0 },
7765 },
7766 {
7767 /* VEX_W_0F3853 */
7768 { "%XV vpdpwssds", { XM, Vex, EXx }, 0 },
7769 },
6c30d220 7770 {
7531c613
JB
7771 /* VEX_W_0F3858 */
7772 { "vpbroadcastd", { XM, EXxmm_md }, PREFIX_DATA },
6c30d220
L
7773 },
7774 {
7531c613
JB
7775 /* VEX_W_0F3859 */
7776 { "vpbroadcastq", { XM, EXxmm_mq }, PREFIX_DATA },
6c30d220
L
7777 },
7778 {
7531c613
JB
7779 /* VEX_W_0F385A_M_0_L_0 */
7780 { "vbroadcasti128", { XM, Mxmm }, PREFIX_DATA },
6c30d220 7781 },
260cd341
LC
7782 {
7783 /* VEX_W_0F385C_X86_64_P_1 */
7784 { MOD_TABLE (MOD_VEX_0F385C_X86_64_P_1_W_0) },
7785 },
7786 {
7787 /* VEX_W_0F385E_X86_64_P_0 */
7788 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_0_W_0) },
7789 },
7790 {
7791 /* VEX_W_0F385E_X86_64_P_1 */
7792 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_1_W_0) },
7793 },
7794 {
7795 /* VEX_W_0F385E_X86_64_P_2 */
7796 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_2_W_0) },
7797 },
7798 {
7799 /* VEX_W_0F385E_X86_64_P_3 */
7800 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_3_W_0) },
7801 },
6c30d220 7802 {
7531c613
JB
7803 /* VEX_W_0F3878 */
7804 { "vpbroadcastb", { XM, EXxmm_mb }, PREFIX_DATA },
6c30d220
L
7805 },
7806 {
7531c613
JB
7807 /* VEX_W_0F3879 */
7808 { "vpbroadcastw", { XM, EXxmm_mw }, PREFIX_DATA },
6c30d220 7809 },
48521003 7810 {
7531c613
JB
7811 /* VEX_W_0F38CF */
7812 { "vgf2p8mulb", { XM, Vex, EXx }, PREFIX_DATA },
48521003 7813 },
6c30d220 7814 {
7531c613 7815 /* VEX_W_0F3A00_L_1 */
6c30d220 7816 { Bad_Opcode },
7531c613 7817 { "vpermq", { XM, EXx, Ib }, PREFIX_DATA },
6c30d220
L
7818 },
7819 {
7531c613 7820 /* VEX_W_0F3A01_L_1 */
6c30d220 7821 { Bad_Opcode },
7531c613 7822 { "vpermpd", { XM, EXx, Ib }, PREFIX_DATA },
6c30d220
L
7823 },
7824 {
7531c613
JB
7825 /* VEX_W_0F3A02 */
7826 { "vpblendd", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6c30d220 7827 },
9e30b8e0 7828 {
7531c613
JB
7829 /* VEX_W_0F3A04 */
7830 { "vpermilps", { XM, EXx, Ib }, PREFIX_DATA },
9e30b8e0
L
7831 },
7832 {
7531c613
JB
7833 /* VEX_W_0F3A05 */
7834 { "vpermilpd", { XM, EXx, Ib }, PREFIX_DATA },
9e30b8e0
L
7835 },
7836 {
7531c613
JB
7837 /* VEX_W_0F3A06_L_1 */
7838 { "vperm2f128", { XM, Vex, EXx, Ib }, PREFIX_DATA },
9e30b8e0 7839 },
9e30b8e0 7840 {
7531c613
JB
7841 /* VEX_W_0F3A18_L_1 */
7842 { "vinsertf128", { XM, Vex, EXxmm, Ib }, PREFIX_DATA },
9e30b8e0
L
7843 },
7844 {
7531c613
JB
7845 /* VEX_W_0F3A19_L_1 */
7846 { "vextractf128", { EXxmm, XM, Ib }, PREFIX_DATA },
9e30b8e0 7847 },
6431c801 7848 {
7531c613
JB
7849 /* VEX_W_0F3A1D */
7850 { "vcvtps2ph", { EXxmmq, XM, EXxEVexS, Ib }, PREFIX_DATA },
6431c801 7851 },
6c30d220 7852 {
7531c613
JB
7853 /* VEX_W_0F3A38_L_1 */
7854 { "vinserti128", { XM, Vex, EXxmm, Ib }, PREFIX_DATA },
6c30d220
L
7855 },
7856 {
7531c613
JB
7857 /* VEX_W_0F3A39_L_1 */
7858 { "vextracti128", { EXxmm, XM, Ib }, PREFIX_DATA },
6c30d220 7859 },
6c30d220 7860 {
7531c613
JB
7861 /* VEX_W_0F3A46_L_1 */
7862 { "vperm2i128", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6c30d220 7863 },
9e30b8e0 7864 {
7531c613
JB
7865 /* VEX_W_0F3A4A */
7866 { "vblendvps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
9e30b8e0
L
7867 },
7868 {
7531c613
JB
7869 /* VEX_W_0F3A4B */
7870 { "vblendvpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
9e30b8e0
L
7871 },
7872 {
7531c613
JB
7873 /* VEX_W_0F3A4C */
7874 { "vpblendvb", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
9e30b8e0 7875 },
48521003 7876 {
7531c613 7877 /* VEX_W_0F3ACE */
48521003 7878 { Bad_Opcode },
7531c613 7879 { "vgf2p8affineqb", { XM, Vex, EXx, Ib }, PREFIX_DATA },
48521003
IT
7880 },
7881 {
7531c613 7882 /* VEX_W_0F3ACF */
48521003 7883 { Bad_Opcode },
7531c613 7884 { "vgf2p8affineinvqb", { XM, Vex, EXx, Ib }, PREFIX_DATA },
48521003 7885 },
467bbef0
JB
7886 /* VEX_W_0FXOP_08_85_L_0 */
7887 {
7888 { "vpmacssww", { XM, Vex, EXx, XMVexI4 }, 0 },
7889 },
7890 /* VEX_W_0FXOP_08_86_L_0 */
7891 {
7892 { "vpmacsswd", { XM, Vex, EXx, XMVexI4 }, 0 },
7893 },
7894 /* VEX_W_0FXOP_08_87_L_0 */
7895 {
7896 { "vpmacssdql", { XM, Vex, EXx, XMVexI4 }, 0 },
7897 },
7898 /* VEX_W_0FXOP_08_8E_L_0 */
7899 {
7900 { "vpmacssdd", { XM, Vex, EXx, XMVexI4 }, 0 },
7901 },
7902 /* VEX_W_0FXOP_08_8F_L_0 */
7903 {
7904 { "vpmacssdqh", { XM, Vex, EXx, XMVexI4 }, 0 },
7905 },
7906 /* VEX_W_0FXOP_08_95_L_0 */
7907 {
7908 { "vpmacsww", { XM, Vex, EXx, XMVexI4 }, 0 },
7909 },
7910 /* VEX_W_0FXOP_08_96_L_0 */
7911 {
7912 { "vpmacswd", { XM, Vex, EXx, XMVexI4 }, 0 },
7913 },
7914 /* VEX_W_0FXOP_08_97_L_0 */
7915 {
7916 { "vpmacsdql", { XM, Vex, EXx, XMVexI4 }, 0 },
7917 },
7918 /* VEX_W_0FXOP_08_9E_L_0 */
7919 {
7920 { "vpmacsdd", { XM, Vex, EXx, XMVexI4 }, 0 },
7921 },
7922 /* VEX_W_0FXOP_08_9F_L_0 */
7923 {
7924 { "vpmacsdqh", { XM, Vex, EXx, XMVexI4 }, 0 },
7925 },
7926 /* VEX_W_0FXOP_08_A6_L_0 */
7927 {
7928 { "vpmadcsswd", { XM, Vex, EXx, XMVexI4 }, 0 },
7929 },
7930 /* VEX_W_0FXOP_08_B6_L_0 */
7931 {
7932 { "vpmadcswd", { XM, Vex, EXx, XMVexI4 }, 0 },
7933 },
7934 /* VEX_W_0FXOP_08_C0_L_0 */
7935 {
7936 { "vprotb", { XM, EXx, Ib }, 0 },
7937 },
7938 /* VEX_W_0FXOP_08_C1_L_0 */
7939 {
7940 { "vprotw", { XM, EXx, Ib }, 0 },
7941 },
7942 /* VEX_W_0FXOP_08_C2_L_0 */
7943 {
7944 { "vprotd", { XM, EXx, Ib }, 0 },
7945 },
7946 /* VEX_W_0FXOP_08_C3_L_0 */
7947 {
7948 { "vprotq", { XM, EXx, Ib }, 0 },
7949 },
7950 /* VEX_W_0FXOP_08_CC_L_0 */
7951 {
89e65d17 7952 { "vpcomb", { XM, Vex, EXx, VPCOM }, 0 },
467bbef0
JB
7953 },
7954 /* VEX_W_0FXOP_08_CD_L_0 */
7955 {
89e65d17 7956 { "vpcomw", { XM, Vex, EXx, VPCOM }, 0 },
467bbef0
JB
7957 },
7958 /* VEX_W_0FXOP_08_CE_L_0 */
7959 {
89e65d17 7960 { "vpcomd", { XM, Vex, EXx, VPCOM }, 0 },
467bbef0
JB
7961 },
7962 /* VEX_W_0FXOP_08_CF_L_0 */
7963 {
89e65d17 7964 { "vpcomq", { XM, Vex, EXx, VPCOM }, 0 },
467bbef0
JB
7965 },
7966 /* VEX_W_0FXOP_08_EC_L_0 */
7967 {
89e65d17 7968 { "vpcomub", { XM, Vex, EXx, VPCOM }, 0 },
467bbef0
JB
7969 },
7970 /* VEX_W_0FXOP_08_ED_L_0 */
7971 {
89e65d17 7972 { "vpcomuw", { XM, Vex, EXx, VPCOM }, 0 },
467bbef0
JB
7973 },
7974 /* VEX_W_0FXOP_08_EE_L_0 */
7975 {
89e65d17 7976 { "vpcomud", { XM, Vex, EXx, VPCOM }, 0 },
467bbef0
JB
7977 },
7978 /* VEX_W_0FXOP_08_EF_L_0 */
7979 {
89e65d17 7980 { "vpcomuq", { XM, Vex, EXx, VPCOM }, 0 },
467bbef0 7981 },
b5b098c2
JB
7982 /* VEX_W_0FXOP_09_80 */
7983 {
7984 { "vfrczps", { XM, EXx }, 0 },
7985 },
7986 /* VEX_W_0FXOP_09_81 */
7987 {
7988 { "vfrczpd", { XM, EXx }, 0 },
7989 },
7990 /* VEX_W_0FXOP_09_82 */
7991 {
7992 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_82_W_0) },
7993 },
7994 /* VEX_W_0FXOP_09_83 */
7995 {
7996 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_83_W_0) },
7997 },
467bbef0
JB
7998 /* VEX_W_0FXOP_09_C1_L_0 */
7999 {
8000 { "vphaddbw", { XM, EXxmm }, 0 },
8001 },
8002 /* VEX_W_0FXOP_09_C2_L_0 */
8003 {
8004 { "vphaddbd", { XM, EXxmm }, 0 },
8005 },
8006 /* VEX_W_0FXOP_09_C3_L_0 */
8007 {
8008 { "vphaddbq", { XM, EXxmm }, 0 },
8009 },
8010 /* VEX_W_0FXOP_09_C6_L_0 */
8011 {
8012 { "vphaddwd", { XM, EXxmm }, 0 },
8013 },
8014 /* VEX_W_0FXOP_09_C7_L_0 */
8015 {
8016 { "vphaddwq", { XM, EXxmm }, 0 },
8017 },
8018 /* VEX_W_0FXOP_09_CB_L_0 */
8019 {
8020 { "vphadddq", { XM, EXxmm }, 0 },
8021 },
8022 /* VEX_W_0FXOP_09_D1_L_0 */
8023 {
8024 { "vphaddubw", { XM, EXxmm }, 0 },
8025 },
8026 /* VEX_W_0FXOP_09_D2_L_0 */
8027 {
8028 { "vphaddubd", { XM, EXxmm }, 0 },
8029 },
8030 /* VEX_W_0FXOP_09_D3_L_0 */
8031 {
8032 { "vphaddubq", { XM, EXxmm }, 0 },
8033 },
8034 /* VEX_W_0FXOP_09_D6_L_0 */
8035 {
8036 { "vphadduwd", { XM, EXxmm }, 0 },
8037 },
8038 /* VEX_W_0FXOP_09_D7_L_0 */
8039 {
8040 { "vphadduwq", { XM, EXxmm }, 0 },
8041 },
8042 /* VEX_W_0FXOP_09_DB_L_0 */
8043 {
8044 { "vphaddudq", { XM, EXxmm }, 0 },
8045 },
8046 /* VEX_W_0FXOP_09_E1_L_0 */
8047 {
8048 { "vphsubbw", { XM, EXxmm }, 0 },
8049 },
8050 /* VEX_W_0FXOP_09_E2_L_0 */
8051 {
8052 { "vphsubwd", { XM, EXxmm }, 0 },
8053 },
8054 /* VEX_W_0FXOP_09_E3_L_0 */
8055 {
8056 { "vphsubdq", { XM, EXxmm }, 0 },
8057 },
ad692897
L
8058
8059#include "i386-dis-evex-w.h"
9e30b8e0
L
8060};
8061
8062static const struct dis386 mod_table[][2] = {
8063 {
8064 /* MOD_8D */
bf890a93 8065 { "leaS", { Gv, M }, 0 },
9e30b8e0 8066 },
42164a71
L
8067 {
8068 /* MOD_C6_REG_7 */
8069 { Bad_Opcode },
8070 { RM_TABLE (RM_C6_REG_7) },
8071 },
8072 {
8073 /* MOD_C7_REG_7 */
8074 { Bad_Opcode },
8075 { RM_TABLE (RM_C7_REG_7) },
8076 },
4a357820
MZ
8077 {
8078 /* MOD_FF_REG_3 */
8f570d62 8079 { "{l|}call^", { indirEp }, 0 },
4a357820
MZ
8080 },
8081 {
8082 /* MOD_FF_REG_5 */
8f570d62 8083 { "{l|}jmp^", { indirEp }, 0 },
4a357820 8084 },
9e30b8e0
L
8085 {
8086 /* MOD_0F01_REG_0 */
8087 { X86_64_TABLE (X86_64_0F01_REG_0) },
8088 { RM_TABLE (RM_0F01_REG_0) },
8089 },
8090 {
8091 /* MOD_0F01_REG_1 */
8092 { X86_64_TABLE (X86_64_0F01_REG_1) },
8093 { RM_TABLE (RM_0F01_REG_1) },
8094 },
8095 {
8096 /* MOD_0F01_REG_2 */
8097 { X86_64_TABLE (X86_64_0F01_REG_2) },
8098 { RM_TABLE (RM_0F01_REG_2) },
8099 },
8100 {
8101 /* MOD_0F01_REG_3 */
8102 { X86_64_TABLE (X86_64_0F01_REG_3) },
8103 { RM_TABLE (RM_0F01_REG_3) },
8104 },
8eab4136
L
8105 {
8106 /* MOD_0F01_REG_5 */
f8687e93
JB
8107 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_0) },
8108 { RM_TABLE (RM_0F01_REG_5_MOD_3) },
8eab4136 8109 },
9e30b8e0
L
8110 {
8111 /* MOD_0F01_REG_7 */
bf890a93 8112 { "invlpg", { Mb }, 0 },
f8687e93 8113 { RM_TABLE (RM_0F01_REG_7_MOD_3) },
9e30b8e0
L
8114 },
8115 {
8116 /* MOD_0F12_PREFIX_0 */
18897deb
JB
8117 { "movlpX", { XM, EXq }, 0 },
8118 { "movhlps", { XM, EXq }, 0 },
8119 },
8120 {
8121 /* MOD_0F12_PREFIX_2 */
8122 { "movlpX", { XM, EXq }, 0 },
9e30b8e0
L
8123 },
8124 {
8125 /* MOD_0F13 */
507bd325 8126 { "movlpX", { EXq, XM }, PREFIX_OPCODE },
9e30b8e0
L
8127 },
8128 {
8129 /* MOD_0F16_PREFIX_0 */
18897deb 8130 { "movhpX", { XM, EXq }, 0 },
bf890a93 8131 { "movlhps", { XM, EXq }, 0 },
9e30b8e0 8132 },
18897deb
JB
8133 {
8134 /* MOD_0F16_PREFIX_2 */
8135 { "movhpX", { XM, EXq }, 0 },
8136 },
9e30b8e0
L
8137 {
8138 /* MOD_0F17 */
507bd325 8139 { "movhpX", { EXq, XM }, PREFIX_OPCODE },
9e30b8e0
L
8140 },
8141 {
8142 /* MOD_0F18_REG_0 */
bf890a93 8143 { "prefetchnta", { Mb }, 0 },
31941983 8144 { "nopQ", { Ev }, 0 },
9e30b8e0
L
8145 },
8146 {
8147 /* MOD_0F18_REG_1 */
bf890a93 8148 { "prefetcht0", { Mb }, 0 },
31941983 8149 { "nopQ", { Ev }, 0 },
9e30b8e0
L
8150 },
8151 {
8152 /* MOD_0F18_REG_2 */
bf890a93 8153 { "prefetcht1", { Mb }, 0 },
31941983 8154 { "nopQ", { Ev }, 0 },
9e30b8e0
L
8155 },
8156 {
8157 /* MOD_0F18_REG_3 */
bf890a93 8158 { "prefetcht2", { Mb }, 0 },
31941983 8159 { "nopQ", { Ev }, 0 },
d7189fa5 8160 },
7e8b059b
L
8161 {
8162 /* MOD_0F1A_PREFIX_0 */
d276ec69 8163 { "bndldx", { Gbnd, Mv_bnd }, 0 },
bf890a93 8164 { "nopQ", { Ev }, 0 },
7e8b059b
L
8165 },
8166 {
8167 /* MOD_0F1B_PREFIX_0 */
d276ec69 8168 { "bndstx", { Mv_bnd, Gbnd }, 0 },
bf890a93 8169 { "nopQ", { Ev }, 0 },
7e8b059b
L
8170 },
8171 {
8172 /* MOD_0F1B_PREFIX_1 */
d276ec69 8173 { "bndmk", { Gbnd, Mv_bnd }, 0 },
31941983 8174 { "nopQ", { Ev }, PREFIX_IGNORED },
7e8b059b 8175 },
c48935d7
IT
8176 {
8177 /* MOD_0F1C_PREFIX_0 */
f8687e93 8178 { REG_TABLE (REG_0F1C_P_0_MOD_0) },
c48935d7
IT
8179 { "nopQ", { Ev }, 0 },
8180 },
603555e5
L
8181 {
8182 /* MOD_0F1E_PREFIX_1 */
31941983 8183 { "nopQ", { Ev }, PREFIX_IGNORED },
f8687e93 8184 { REG_TABLE (REG_0F1E_P_1_MOD_3) },
603555e5 8185 },
75c135a8
L
8186 {
8187 /* MOD_0F2B_PREFIX_0 */
507bd325 8188 {"movntps", { Mx, XM }, PREFIX_OPCODE },
75c135a8
L
8189 },
8190 {
8191 /* MOD_0F2B_PREFIX_1 */
507bd325 8192 {"movntss", { Md, XM }, PREFIX_OPCODE },
75c135a8
L
8193 },
8194 {
8195 /* MOD_0F2B_PREFIX_2 */
507bd325 8196 {"movntpd", { Mx, XM }, PREFIX_OPCODE },
75c135a8
L
8197 },
8198 {
8199 /* MOD_0F2B_PREFIX_3 */
507bd325 8200 {"movntsd", { Mq, XM }, PREFIX_OPCODE },
75c135a8
L
8201 },
8202 {
a5aaedb9 8203 /* MOD_0F50 */
592d1631 8204 { Bad_Opcode },
507bd325 8205 { "movmskpX", { Gdq, XS }, PREFIX_OPCODE },
75c135a8 8206 },
b844680a 8207 {
00ec1875 8208 /* MOD_0F71 */
592d1631 8209 { Bad_Opcode },
00ec1875 8210 { REG_TABLE (REG_0F71_MOD_0) },
b844680a
L
8211 },
8212 {
00ec1875 8213 /* MOD_0F72 */
592d1631 8214 { Bad_Opcode },
00ec1875 8215 { REG_TABLE (REG_0F72_MOD_0) },
b844680a
L
8216 },
8217 {
00ec1875 8218 /* MOD_0F73 */
592d1631 8219 { Bad_Opcode },
00ec1875 8220 { REG_TABLE (REG_0F73_MOD_0) },
c0f3af97
L
8221 },
8222 {
8223 /* MOD_0FAE_REG_0 */
bf890a93 8224 { "fxsave", { FXSAVE }, 0 },
f8687e93 8225 { PREFIX_TABLE (PREFIX_0FAE_REG_0_MOD_3) },
c0f3af97
L
8226 },
8227 {
8228 /* MOD_0FAE_REG_1 */
bf890a93 8229 { "fxrstor", { FXSAVE }, 0 },
f8687e93 8230 { PREFIX_TABLE (PREFIX_0FAE_REG_1_MOD_3) },
c0f3af97
L
8231 },
8232 {
8233 /* MOD_0FAE_REG_2 */
bf890a93 8234 { "ldmxcsr", { Md }, 0 },
f8687e93 8235 { PREFIX_TABLE (PREFIX_0FAE_REG_2_MOD_3) },
c0f3af97
L
8236 },
8237 {
8238 /* MOD_0FAE_REG_3 */
bf890a93 8239 { "stmxcsr", { Md }, 0 },
f8687e93 8240 { PREFIX_TABLE (PREFIX_0FAE_REG_3_MOD_3) },
c0f3af97
L
8241 },
8242 {
8243 /* MOD_0FAE_REG_4 */
f8687e93
JB
8244 { PREFIX_TABLE (PREFIX_0FAE_REG_4_MOD_0) },
8245 { PREFIX_TABLE (PREFIX_0FAE_REG_4_MOD_3) },
c0f3af97
L
8246 },
8247 {
8248 /* MOD_0FAE_REG_5 */
035e7389 8249 { "xrstor", { FXSAVE }, PREFIX_OPCODE },
f8687e93 8250 { PREFIX_TABLE (PREFIX_0FAE_REG_5_MOD_3) },
c0f3af97
L
8251 },
8252 {
8253 /* MOD_0FAE_REG_6 */
f8687e93
JB
8254 { PREFIX_TABLE (PREFIX_0FAE_REG_6_MOD_0) },
8255 { PREFIX_TABLE (PREFIX_0FAE_REG_6_MOD_3) },
c0f3af97
L
8256 },
8257 {
8258 /* MOD_0FAE_REG_7 */
f8687e93
JB
8259 { PREFIX_TABLE (PREFIX_0FAE_REG_7_MOD_0) },
8260 { RM_TABLE (RM_0FAE_REG_7_MOD_3) },
c0f3af97
L
8261 },
8262 {
8263 /* MOD_0FB2 */
bf890a93 8264 { "lssS", { Gv, Mp }, 0 },
c0f3af97
L
8265 },
8266 {
8267 /* MOD_0FB4 */
bf890a93 8268 { "lfsS", { Gv, Mp }, 0 },
c0f3af97
L
8269 },
8270 {
8271 /* MOD_0FB5 */
bf890a93 8272 { "lgsS", { Gv, Mp }, 0 },
c0f3af97 8273 },
a8484f96
L
8274 {
8275 /* MOD_0FC3 */
035e7389 8276 { "movntiS", { Edq, Gdq }, PREFIX_OPCODE },
a8484f96 8277 },
963f3586
IT
8278 {
8279 /* MOD_0FC7_REG_3 */
a8484f96 8280 { "xrstors", { FXSAVE }, 0 },
963f3586
IT
8281 },
8282 {
8283 /* MOD_0FC7_REG_4 */
bf890a93 8284 { "xsavec", { FXSAVE }, 0 },
963f3586
IT
8285 },
8286 {
8287 /* MOD_0FC7_REG_5 */
bf890a93 8288 { "xsaves", { FXSAVE }, 0 },
963f3586 8289 },
c0f3af97
L
8290 {
8291 /* MOD_0FC7_REG_6 */
f8687e93
JB
8292 { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_0) },
8293 { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_3) }
c0f3af97
L
8294 },
8295 {
8296 /* MOD_0FC7_REG_7 */
bf890a93 8297 { "vmptrst", { Mq }, 0 },
f8687e93 8298 { PREFIX_TABLE (PREFIX_0FC7_REG_7_MOD_3) }
c0f3af97
L
8299 },
8300 {
8301 /* MOD_0FD7 */
592d1631 8302 { Bad_Opcode },
bf890a93 8303 { "pmovmskb", { Gdq, MS }, 0 },
c0f3af97
L
8304 },
8305 {
8306 /* MOD_0FE7_PREFIX_2 */
bf890a93 8307 { "movntdq", { Mx, XM }, 0 },
c0f3af97
L
8308 },
8309 {
8310 /* MOD_0FF0_PREFIX_3 */
bf890a93 8311 { "lddqu", { XM, M }, 0 },
c0f3af97
L
8312 },
8313 {
7531c613
JB
8314 /* MOD_0F382A */
8315 { "movntdqa", { XM, Mx }, PREFIX_DATA },
c0f3af97 8316 },
c4694f17
TG
8317 {
8318 /* MOD_0F38DC_PREFIX_1 */
8319 { "aesenc128kl", { XM, M }, 0 },
8320 { "loadiwkey", { XM, EXx }, 0 },
8321 },
8322 {
8323 /* MOD_0F38DD_PREFIX_1 */
8324 { "aesdec128kl", { XM, M }, 0 },
8325 },
8326 {
8327 /* MOD_0F38DE_PREFIX_1 */
8328 { "aesenc256kl", { XM, M }, 0 },
8329 },
8330 {
8331 /* MOD_0F38DF_PREFIX_1 */
8332 { "aesdec256kl", { XM, M }, 0 },
8333 },
603555e5 8334 {
7531c613
JB
8335 /* MOD_0F38F5 */
8336 { "wrussK", { M, Gdq }, PREFIX_DATA },
603555e5
L
8337 },
8338 {
8339 /* MOD_0F38F6_PREFIX_0 */
8340 { "wrssK", { M, Gdq }, PREFIX_OPCODE },
8341 },
5d79adc4
L
8342 {
8343 /* MOD_0F38F8_PREFIX_1 */
8344 { "enqcmds", { Gva, M }, PREFIX_OPCODE },
8345 },
c0a30a9f
L
8346 {
8347 /* MOD_0F38F8_PREFIX_2 */
8348 { "movdir64b", { Gva, M }, PREFIX_OPCODE },
8349 },
5d79adc4
L
8350 {
8351 /* MOD_0F38F8_PREFIX_3 */
8352 { "enqcmd", { Gva, M }, PREFIX_OPCODE },
8353 },
c0a30a9f 8354 {
035e7389
JB
8355 /* MOD_0F38F9 */
8356 { "movdiri", { Edq, Gdq }, PREFIX_OPCODE },
c0a30a9f 8357 },
c4694f17
TG
8358 {
8359 /* MOD_0F38FA_PREFIX_1 */
8360 { Bad_Opcode },
8361 { "encodekey128", { Gd, Ed }, 0 },
8362 },
8363 {
8364 /* MOD_0F38FB_PREFIX_1 */
8365 { Bad_Opcode },
8366 { "encodekey256", { Gd, Ed }, 0 },
8367 },
c1fa250a
LC
8368 {
8369 /* MOD_0F3A0F_PREFIX_1 */
8370 { Bad_Opcode },
8371 { REG_TABLE (REG_0F3A0F_PREFIX_1_MOD_3) },
8372 },
c0f3af97
L
8373 {
8374 /* MOD_62_32BIT */
bf890a93 8375 { "bound{S|}", { Gv, Ma }, 0 },
43234a1e 8376 { EVEX_TABLE (EVEX_0F) },
c0f3af97
L
8377 },
8378 {
8379 /* MOD_C4_32BIT */
bf890a93 8380 { "lesS", { Gv, Mp }, 0 },
c0f3af97
L
8381 { VEX_C4_TABLE (VEX_0F) },
8382 },
8383 {
8384 /* MOD_C5_32BIT */
bf890a93 8385 { "ldsS", { Gv, Mp }, 0 },
c0f3af97
L
8386 { VEX_C5_TABLE (VEX_0F) },
8387 },
8388 {
592a252b
L
8389 /* MOD_VEX_0F12_PREFIX_0 */
8390 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_0) },
8391 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_1) },
c0f3af97 8392 },
18897deb
JB
8393 {
8394 /* MOD_VEX_0F12_PREFIX_2 */
8395 { VEX_LEN_TABLE (VEX_LEN_0F12_P_2_M_0) },
8396 },
c0f3af97 8397 {
592a252b
L
8398 /* MOD_VEX_0F13 */
8399 { VEX_LEN_TABLE (VEX_LEN_0F13_M_0) },
c0f3af97
L
8400 },
8401 {
592a252b
L
8402 /* MOD_VEX_0F16_PREFIX_0 */
8403 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_0) },
8404 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_1) },
c0f3af97 8405 },
18897deb
JB
8406 {
8407 /* MOD_VEX_0F16_PREFIX_2 */
8408 { VEX_LEN_TABLE (VEX_LEN_0F16_P_2_M_0) },
8409 },
c0f3af97 8410 {
592a252b
L
8411 /* MOD_VEX_0F17 */
8412 { VEX_LEN_TABLE (VEX_LEN_0F17_M_0) },
c0f3af97
L
8413 },
8414 {
592a252b 8415 /* MOD_VEX_0F2B */
bf926894 8416 { "vmovntpX", { Mx, XM }, PREFIX_OPCODE },
c0f3af97 8417 },
ab4e4ed5
AF
8418 {
8419 /* MOD_VEX_W_0_0F41_P_0_LEN_1 */
8420 { Bad_Opcode },
464d2b65 8421 { "kandw", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8422 },
8423 {
8424 /* MOD_VEX_W_1_0F41_P_0_LEN_1 */
8425 { Bad_Opcode },
464d2b65 8426 { "kandq", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8427 },
8428 {
8429 /* MOD_VEX_W_0_0F41_P_2_LEN_1 */
8430 { Bad_Opcode },
464d2b65 8431 { "kandb", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8432 },
8433 {
8434 /* MOD_VEX_W_1_0F41_P_2_LEN_1 */
8435 { Bad_Opcode },
464d2b65 8436 { "kandd", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8437 },
8438 {
8439 /* MOD_VEX_W_0_0F42_P_0_LEN_1 */
8440 { Bad_Opcode },
464d2b65 8441 { "kandnw", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8442 },
8443 {
8444 /* MOD_VEX_W_1_0F42_P_0_LEN_1 */
8445 { Bad_Opcode },
464d2b65 8446 { "kandnq", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8447 },
8448 {
8449 /* MOD_VEX_W_0_0F42_P_2_LEN_1 */
8450 { Bad_Opcode },
464d2b65 8451 { "kandnb", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8452 },
8453 {
8454 /* MOD_VEX_W_1_0F42_P_2_LEN_1 */
8455 { Bad_Opcode },
464d2b65 8456 { "kandnd", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8457 },
8458 {
8459 /* MOD_VEX_W_0_0F44_P_0_LEN_0 */
8460 { Bad_Opcode },
464d2b65 8461 { "knotw", { MaskG, MaskE }, 0 },
ab4e4ed5
AF
8462 },
8463 {
8464 /* MOD_VEX_W_1_0F44_P_0_LEN_0 */
8465 { Bad_Opcode },
464d2b65 8466 { "knotq", { MaskG, MaskE }, 0 },
ab4e4ed5
AF
8467 },
8468 {
8469 /* MOD_VEX_W_0_0F44_P_2_LEN_0 */
8470 { Bad_Opcode },
464d2b65 8471 { "knotb", { MaskG, MaskE }, 0 },
ab4e4ed5
AF
8472 },
8473 {
8474 /* MOD_VEX_W_1_0F44_P_2_LEN_0 */
8475 { Bad_Opcode },
464d2b65 8476 { "knotd", { MaskG, MaskE }, 0 },
ab4e4ed5
AF
8477 },
8478 {
8479 /* MOD_VEX_W_0_0F45_P_0_LEN_1 */
8480 { Bad_Opcode },
464d2b65 8481 { "korw", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8482 },
8483 {
8484 /* MOD_VEX_W_1_0F45_P_0_LEN_1 */
8485 { Bad_Opcode },
464d2b65 8486 { "korq", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8487 },
8488 {
8489 /* MOD_VEX_W_0_0F45_P_2_LEN_1 */
8490 { Bad_Opcode },
464d2b65 8491 { "korb", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8492 },
8493 {
8494 /* MOD_VEX_W_1_0F45_P_2_LEN_1 */
8495 { Bad_Opcode },
464d2b65 8496 { "kord", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8497 },
8498 {
8499 /* MOD_VEX_W_0_0F46_P_0_LEN_1 */
8500 { Bad_Opcode },
464d2b65 8501 { "kxnorw", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8502 },
8503 {
8504 /* MOD_VEX_W_1_0F46_P_0_LEN_1 */
8505 { Bad_Opcode },
464d2b65 8506 { "kxnorq", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8507 },
8508 {
8509 /* MOD_VEX_W_0_0F46_P_2_LEN_1 */
8510 { Bad_Opcode },
464d2b65 8511 { "kxnorb", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8512 },
8513 {
8514 /* MOD_VEX_W_1_0F46_P_2_LEN_1 */
8515 { Bad_Opcode },
464d2b65 8516 { "kxnord", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8517 },
8518 {
8519 /* MOD_VEX_W_0_0F47_P_0_LEN_1 */
8520 { Bad_Opcode },
464d2b65 8521 { "kxorw", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8522 },
8523 {
8524 /* MOD_VEX_W_1_0F47_P_0_LEN_1 */
8525 { Bad_Opcode },
464d2b65 8526 { "kxorq", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8527 },
8528 {
8529 /* MOD_VEX_W_0_0F47_P_2_LEN_1 */
8530 { Bad_Opcode },
464d2b65 8531 { "kxorb", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8532 },
8533 {
8534 /* MOD_VEX_W_1_0F47_P_2_LEN_1 */
8535 { Bad_Opcode },
464d2b65 8536 { "kxord", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8537 },
8538 {
8539 /* MOD_VEX_W_0_0F4A_P_0_LEN_1 */
8540 { Bad_Opcode },
464d2b65 8541 { "kaddw", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8542 },
8543 {
8544 /* MOD_VEX_W_1_0F4A_P_0_LEN_1 */
8545 { Bad_Opcode },
464d2b65 8546 { "kaddq", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8547 },
8548 {
8549 /* MOD_VEX_W_0_0F4A_P_2_LEN_1 */
8550 { Bad_Opcode },
464d2b65 8551 { "kaddb", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8552 },
8553 {
8554 /* MOD_VEX_W_1_0F4A_P_2_LEN_1 */
8555 { Bad_Opcode },
464d2b65 8556 { "kaddd", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8557 },
8558 {
8559 /* MOD_VEX_W_0_0F4B_P_0_LEN_1 */
8560 { Bad_Opcode },
464d2b65 8561 { "kunpckwd", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8562 },
8563 {
8564 /* MOD_VEX_W_1_0F4B_P_0_LEN_1 */
8565 { Bad_Opcode },
464d2b65 8566 { "kunpckdq", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5
AF
8567 },
8568 {
8569 /* MOD_VEX_W_0_0F4B_P_2_LEN_1 */
8570 { Bad_Opcode },
464d2b65 8571 { "kunpckbw", { MaskG, MaskVex, MaskE }, 0 },
ab4e4ed5 8572 },
c0f3af97 8573 {
592a252b 8574 /* MOD_VEX_0F50 */
592d1631 8575 { Bad_Opcode },
bf926894 8576 { "vmovmskpX", { Gdq, XS }, PREFIX_OPCODE },
c0f3af97
L
8577 },
8578 {
14d10c6c 8579 /* MOD_VEX_0F71 */
592d1631 8580 { Bad_Opcode },
14d10c6c 8581 { REG_TABLE (REG_VEX_0F71_M_0) },
b844680a
L
8582 },
8583 {
14d10c6c 8584 /* MOD_VEX_0F72 */
592d1631 8585 { Bad_Opcode },
14d10c6c 8586 { REG_TABLE (REG_VEX_0F72_M_0) },
b844680a 8587 },
d8faab4e 8588 {
14d10c6c 8589 /* MOD_VEX_0F73 */
592d1631 8590 { Bad_Opcode },
14d10c6c 8591 { REG_TABLE (REG_VEX_0F73_M_0) },
876d4bfa 8592 },
ab4e4ed5
AF
8593 {
8594 /* MOD_VEX_W_0_0F91_P_0_LEN_0 */
8595 { "kmovw", { Ew, MaskG }, 0 },
8596 { Bad_Opcode },
8597 },
8598 {
8599 /* MOD_VEX_W_0_0F91_P_0_LEN_0 */
8600 { "kmovq", { Eq, MaskG }, 0 },
8601 { Bad_Opcode },
8602 },
8603 {
8604 /* MOD_VEX_W_0_0F91_P_2_LEN_0 */
8605 { "kmovb", { Eb, MaskG }, 0 },
8606 { Bad_Opcode },
8607 },
8608 {
8609 /* MOD_VEX_W_0_0F91_P_2_LEN_0 */
8610 { "kmovd", { Ed, MaskG }, 0 },
8611 { Bad_Opcode },
8612 },
8613 {
8614 /* MOD_VEX_W_0_0F92_P_0_LEN_0 */
8615 { Bad_Opcode },
464d2b65 8616 { "kmovw", { MaskG, Edq }, 0 },
ab4e4ed5
AF
8617 },
8618 {
8619 /* MOD_VEX_W_0_0F92_P_2_LEN_0 */
8620 { Bad_Opcode },
464d2b65 8621 { "kmovb", { MaskG, Edq }, 0 },
ab4e4ed5
AF
8622 },
8623 {
58a211d2 8624 /* MOD_VEX_0F92_P_3_LEN_0 */
ab4e4ed5 8625 { Bad_Opcode },
464d2b65 8626 { "kmovK", { MaskG, Edq }, 0 },
ab4e4ed5
AF
8627 },
8628 {
8629 /* MOD_VEX_W_0_0F93_P_0_LEN_0 */
8630 { Bad_Opcode },
464d2b65 8631 { "kmovw", { Gdq, MaskE }, 0 },
ab4e4ed5
AF
8632 },
8633 {
8634 /* MOD_VEX_W_0_0F93_P_2_LEN_0 */
8635 { Bad_Opcode },
464d2b65 8636 { "kmovb", { Gdq, MaskE }, 0 },
ab4e4ed5
AF
8637 },
8638 {
58a211d2 8639 /* MOD_VEX_0F93_P_3_LEN_0 */
ab4e4ed5 8640 { Bad_Opcode },
464d2b65 8641 { "kmovK", { Gdq, MaskE }, 0 },
ab4e4ed5
AF
8642 },
8643 {
8644 /* MOD_VEX_W_0_0F98_P_0_LEN_0 */
8645 { Bad_Opcode },
464d2b65 8646 { "kortestw", { MaskG, MaskE }, 0 },
ab4e4ed5
AF
8647 },
8648 {
8649 /* MOD_VEX_W_1_0F98_P_0_LEN_0 */
8650 { Bad_Opcode },
464d2b65 8651 { "kortestq", { MaskG, MaskE }, 0 },
ab4e4ed5
AF
8652 },
8653 {
8654 /* MOD_VEX_W_0_0F98_P_2_LEN_0 */
8655 { Bad_Opcode },
464d2b65 8656 { "kortestb", { MaskG, MaskE }, 0 },
ab4e4ed5
AF
8657 },
8658 {
8659 /* MOD_VEX_W_1_0F98_P_2_LEN_0 */
8660 { Bad_Opcode },
464d2b65 8661 { "kortestd", { MaskG, MaskE }, 0 },
ab4e4ed5
AF
8662 },
8663 {
8664 /* MOD_VEX_W_0_0F99_P_0_LEN_0 */
8665 { Bad_Opcode },
464d2b65 8666 { "ktestw", { MaskG, MaskE }, 0 },
ab4e4ed5
AF
8667 },
8668 {
8669 /* MOD_VEX_W_1_0F99_P_0_LEN_0 */
8670 { Bad_Opcode },
464d2b65 8671 { "ktestq", { MaskG, MaskE }, 0 },
ab4e4ed5
AF
8672 },
8673 {
8674 /* MOD_VEX_W_0_0F99_P_2_LEN_0 */
8675 { Bad_Opcode },
464d2b65 8676 { "ktestb", { MaskG, MaskE }, 0 },
ab4e4ed5
AF
8677 },
8678 {
8679 /* MOD_VEX_W_1_0F99_P_2_LEN_0 */
8680 { Bad_Opcode },
464d2b65 8681 { "ktestd", { MaskG, MaskE }, 0 },
ab4e4ed5 8682 },
876d4bfa 8683 {
592a252b
L
8684 /* MOD_VEX_0FAE_REG_2 */
8685 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_2_M_0) },
876d4bfa 8686 },
bbedc832 8687 {
592a252b
L
8688 /* MOD_VEX_0FAE_REG_3 */
8689 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_3_M_0) },
bbedc832 8690 },
144c41d9 8691 {
7531c613 8692 /* MOD_VEX_0FD7 */
592d1631 8693 { Bad_Opcode },
7531c613 8694 { "vpmovmskb", { Gdq, XS }, PREFIX_DATA },
144c41d9 8695 },
1afd85e3 8696 {
7531c613
JB
8697 /* MOD_VEX_0FE7 */
8698 { "vmovntdq", { Mx, XM }, PREFIX_DATA },
1afd85e3
L
8699 },
8700 {
592a252b 8701 /* MOD_VEX_0FF0_PREFIX_3 */
ec6f095a 8702 { "vlddqu", { XM, M }, 0 },
92fddf8e 8703 },
75c135a8 8704 {
7531c613
JB
8705 /* MOD_VEX_0F381A */
8706 { VEX_LEN_TABLE (VEX_LEN_0F381A_M_0) },
75c135a8 8707 },
1afd85e3 8708 {
7531c613
JB
8709 /* MOD_VEX_0F382A */
8710 { "vmovntdqa", { XM, Mx }, PREFIX_DATA },
1afd85e3 8711 },
75c135a8 8712 {
7531c613
JB
8713 /* MOD_VEX_0F382C */
8714 { VEX_W_TABLE (VEX_W_0F382C_M_0) },
75c135a8 8715 },
1afd85e3 8716 {
7531c613
JB
8717 /* MOD_VEX_0F382D */
8718 { VEX_W_TABLE (VEX_W_0F382D_M_0) },
1afd85e3
L
8719 },
8720 {
7531c613
JB
8721 /* MOD_VEX_0F382E */
8722 { VEX_W_TABLE (VEX_W_0F382E_M_0) },
1afd85e3
L
8723 },
8724 {
7531c613
JB
8725 /* MOD_VEX_0F382F */
8726 { VEX_W_TABLE (VEX_W_0F382F_M_0) },
1afd85e3 8727 },
09d73035
CL
8728 {
8729 /* MOD_VEX_0F3849_X86_64_P_0_W_0 */
8730 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_0_W_0_M_0) },
8731 { REG_TABLE (REG_VEX_0F3849_X86_64_P_0_W_0_M_1) },
8732 },
8733 {
8734 /* MOD_VEX_0F3849_X86_64_P_2_W_0 */
8735 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_2_W_0_M_0) },
8736 },
8737 {
8738 /* MOD_VEX_0F3849_X86_64_P_3_W_0 */
8739 { Bad_Opcode },
8740 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_3_W_0_M_0) },
8741 },
8742 {
8743 /* MOD_VEX_0F384B_X86_64_P_1_W_0 */
8744 { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64_P_1_W_0_M_0) },
8745 },
8746 {
8747 /* MOD_VEX_0F384B_X86_64_P_2_W_0 */
8748 { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64_P_2_W_0_M_0) },
8749 },
8750 {
8751 /* MOD_VEX_0F384B_X86_64_P_3_W_0 */
8752 { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64_P_3_W_0_M_0) },
8753 },
6c30d220 8754 {
7531c613
JB
8755 /* MOD_VEX_0F385A */
8756 { VEX_LEN_TABLE (VEX_LEN_0F385A_M_0) },
6c30d220 8757 },
09d73035
CL
8758 {
8759 /* MOD_VEX_0F385C_X86_64_P_1_W_0 */
8760 { Bad_Opcode },
8761 { VEX_LEN_TABLE (VEX_LEN_0F385C_X86_64_P_1_W_0_M_0) },
8762 },
8763 {
8764 /* MOD_VEX_0F385E_X86_64_P_0_W_0 */
8765 { Bad_Opcode },
8766 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_0_W_0_M_0) },
8767 },
8768 {
8769 /* MOD_VEX_0F385E_X86_64_P_1_W_0 */
8770 { Bad_Opcode },
8771 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_1_W_0_M_0) },
8772 },
8773 {
8774 /* MOD_VEX_0F385E_X86_64_P_2_W_0 */
8775 { Bad_Opcode },
8776 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_2_W_0_M_0) },
8777 },
8778 {
8779 /* MOD_VEX_0F385E_X86_64_P_3_W_0 */
8780 { Bad_Opcode },
8781 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_3_W_0_M_0) },
8782 },
6c30d220 8783 {
7531c613
JB
8784 /* MOD_VEX_0F388C */
8785 { "vpmaskmov%DQ", { XM, Vex, Mx }, PREFIX_DATA },
6c30d220
L
8786 },
8787 {
7531c613
JB
8788 /* MOD_VEX_0F388E */
8789 { "vpmaskmov%DQ", { Mx, Vex, XM }, PREFIX_DATA },
6c30d220 8790 },
ab4e4ed5 8791 {
bb5b3501 8792 /* MOD_VEX_0F3A30_L_0 */
ab4e4ed5 8793 { Bad_Opcode },
464d2b65 8794 { "kshiftr%BW", { MaskG, MaskE, Ib }, PREFIX_DATA },
ab4e4ed5
AF
8795 },
8796 {
bb5b3501 8797 /* MOD_VEX_0F3A31_L_0 */
ab4e4ed5 8798 { Bad_Opcode },
464d2b65 8799 { "kshiftr%DQ", { MaskG, MaskE, Ib }, PREFIX_DATA },
ab4e4ed5
AF
8800 },
8801 {
bb5b3501 8802 /* MOD_VEX_0F3A32_L_0 */
ab4e4ed5 8803 { Bad_Opcode },
464d2b65 8804 { "kshiftl%BW", { MaskG, MaskE, Ib }, PREFIX_DATA },
ab4e4ed5
AF
8805 },
8806 {
bb5b3501 8807 /* MOD_VEX_0F3A33_L_0 */
ab4e4ed5 8808 { Bad_Opcode },
464d2b65 8809 { "kshiftl%DQ", { MaskG, MaskE, Ib }, PREFIX_DATA },
ab4e4ed5 8810 },
467bbef0
JB
8811 {
8812 /* MOD_VEX_0FXOP_09_12 */
8813 { Bad_Opcode },
8814 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_12_M_1) },
8815 },
ad692897
L
8816
8817#include "i386-dis-evex-mod.h"
b844680a
L
8818};
8819
1ceb70f8 8820static const struct dis386 rm_table[][8] = {
42164a71
L
8821 {
8822 /* RM_C6_REG_7 */
bf890a93 8823 { "xabort", { Skip_MODRM, Ib }, 0 },
42164a71
L
8824 },
8825 {
8826 /* RM_C7_REG_7 */
376cd056 8827 { "xbeginT", { Skip_MODRM, Jdqw }, 0 },
42164a71 8828 },
b844680a 8829 {
1ceb70f8 8830 /* RM_0F01_REG_0 */
a4e78aa5 8831 { "enclv", { Skip_MODRM }, 0 },
bf890a93
IT
8832 { "vmcall", { Skip_MODRM }, 0 },
8833 { "vmlaunch", { Skip_MODRM }, 0 },
8834 { "vmresume", { Skip_MODRM }, 0 },
8835 { "vmxoff", { Skip_MODRM }, 0 },
be3a8dca 8836 { "pconfig", { Skip_MODRM }, 0 },
b844680a
L
8837 },
8838 {
1ceb70f8 8839 /* RM_0F01_REG_1 */
bf890a93
IT
8840 { "monitor", { { OP_Monitor, 0 } }, 0 },
8841 { "mwait", { { OP_Mwait, 0 } }, 0 },
8842 { "clac", { Skip_MODRM }, 0 },
8843 { "stac", { Skip_MODRM }, 0 },
81d54bb7
CL
8844 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_4) },
8845 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_5) },
8846 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_6) },
8847 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_7) },
b844680a 8848 },
475a2301
L
8849 {
8850 /* RM_0F01_REG_2 */
bf890a93
IT
8851 { "xgetbv", { Skip_MODRM }, 0 },
8852 { "xsetbv", { Skip_MODRM }, 0 },
8729a6f6
L
8853 { Bad_Opcode },
8854 { Bad_Opcode },
bf890a93
IT
8855 { "vmfunc", { Skip_MODRM }, 0 },
8856 { "xend", { Skip_MODRM }, 0 },
8857 { "xtest", { Skip_MODRM }, 0 },
8858 { "enclu", { Skip_MODRM }, 0 },
475a2301 8859 },
b844680a 8860 {
1ceb70f8 8861 /* RM_0F01_REG_3 */
bf890a93 8862 { "vmrun", { Skip_MODRM }, 0 },
a847e322 8863 { PREFIX_TABLE (PREFIX_0F01_REG_3_RM_1) },
bf890a93
IT
8864 { "vmload", { Skip_MODRM }, 0 },
8865 { "vmsave", { Skip_MODRM }, 0 },
8866 { "stgi", { Skip_MODRM }, 0 },
8867 { "clgi", { Skip_MODRM }, 0 },
8868 { "skinit", { Skip_MODRM }, 0 },
8869 { "invlpga", { Skip_MODRM }, 0 },
4e7d34a6 8870 },
8eab4136 8871 {
f8687e93
JB
8872 /* RM_0F01_REG_5_MOD_3 */
8873 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_0) },
bb651e8b 8874 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_1) },
f8687e93 8875 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_2) },
8eab4136 8876 { Bad_Opcode },
f64c42a9
LC
8877 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_4) },
8878 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_5) },
8879 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_6) },
8880 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_7) },
8eab4136 8881 },
4e7d34a6 8882 {
f8687e93 8883 /* RM_0F01_REG_7_MOD_3 */
bf890a93
IT
8884 { "swapgs", { Skip_MODRM }, 0 },
8885 { "rdtscp", { Skip_MODRM }, 0 },
267b8516 8886 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_2) },
035e7389 8887 { "mwaitx", { { OP_Mwait, eBX_reg } }, PREFIX_OPCODE },
bf890a93 8888 { "clzero", { Skip_MODRM }, 0 },
142861df 8889 { "rdpru", { Skip_MODRM }, 0 },
646cc3e0
GG
8890 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_6) },
8891 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_7) },
b844680a 8892 },
603555e5 8893 {
f8687e93 8894 /* RM_0F1E_P_1_MOD_3_REG_7 */
31941983
JB
8895 { "nopQ", { Ev }, PREFIX_IGNORED },
8896 { "nopQ", { Ev }, PREFIX_IGNORED },
8897 { "endbr64", { Skip_MODRM }, 0 },
8898 { "endbr32", { Skip_MODRM }, 0 },
8899 { "nopQ", { Ev }, PREFIX_IGNORED },
8900 { "nopQ", { Ev }, PREFIX_IGNORED },
8901 { "nopQ", { Ev }, PREFIX_IGNORED },
8902 { "nopQ", { Ev }, PREFIX_IGNORED },
603555e5 8903 },
c1fa250a
LC
8904 {
8905 /* RM_0F3A0F_P_1_MOD_3_REG_0 */
8906 { "hreset", { Skip_MODRM, Ib }, 0 },
8907 },
b844680a 8908 {
f8687e93 8909 /* RM_0FAE_REG_6_MOD_3 */
bf890a93 8910 { "mfence", { Skip_MODRM }, 0 },
b844680a 8911 },
bbedc832 8912 {
f8687e93 8913 /* RM_0FAE_REG_7_MOD_3 */
b5cefcca
L
8914 { "sfence", { Skip_MODRM }, 0 },
8915
144c41d9 8916 },
260cd341
LC
8917 {
8918 /* RM_VEX_0F3849_X86_64_P_0_W_0_M_1_R_0 */
8919 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_0_W_0_M_1_REG_0_RM_0) },
8920 },
b844680a
L
8921};
8922
c608c12e
AM
8923#define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
8924
f16cd0d5
L
8925/* We use the high bit to indicate different name for the same
8926 prefix. */
f16cd0d5 8927#define REP_PREFIX (0xf3 | 0x100)
42164a71
L
8928#define XACQUIRE_PREFIX (0xf2 | 0x200)
8929#define XRELEASE_PREFIX (0xf3 | 0x400)
7e8b059b 8930#define BND_PREFIX (0xf2 | 0x400)
04ef582a 8931#define NOTRACK_PREFIX (0x3e | 0x100)
f16cd0d5 8932
1d67fe3b
TT
8933/* Remember if the current op is a jump instruction. */
8934static bfd_boolean op_is_jump = FALSE;
8935
f16cd0d5 8936static int
26ca5450 8937ckprefix (void)
252b5132 8938{
f16cd0d5 8939 int newrex, i, length;
52b15da3 8940 rex = 0;
252b5132 8941 prefixes = 0;
7d421014 8942 used_prefixes = 0;
52b15da3 8943 rex_used = 0;
f16cd0d5
L
8944 last_lock_prefix = -1;
8945 last_repz_prefix = -1;
8946 last_repnz_prefix = -1;
8947 last_data_prefix = -1;
8948 last_addr_prefix = -1;
8949 last_rex_prefix = -1;
8950 last_seg_prefix = -1;
d9949a36 8951 fwait_prefix = -1;
285ca992 8952 active_seg_prefix = 0;
f310f33d
L
8953 for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
8954 all_prefixes[i] = 0;
8955 i = 0;
f16cd0d5
L
8956 length = 0;
8957 /* The maximum instruction length is 15bytes. */
8958 while (length < MAX_CODE_LENGTH - 1)
252b5132
RH
8959 {
8960 FETCH_DATA (the_info, codep + 1);
52b15da3 8961 newrex = 0;
252b5132
RH
8962 switch (*codep)
8963 {
52b15da3
JH
8964 /* REX prefixes family. */
8965 case 0x40:
8966 case 0x41:
8967 case 0x42:
8968 case 0x43:
8969 case 0x44:
8970 case 0x45:
8971 case 0x46:
8972 case 0x47:
8973 case 0x48:
8974 case 0x49:
8975 case 0x4a:
8976 case 0x4b:
8977 case 0x4c:
8978 case 0x4d:
8979 case 0x4e:
8980 case 0x4f:
f16cd0d5
L
8981 if (address_mode == mode_64bit)
8982 newrex = *codep;
8983 else
8984 return 1;
8985 last_rex_prefix = i;
52b15da3 8986 break;
252b5132
RH
8987 case 0xf3:
8988 prefixes |= PREFIX_REPZ;
f16cd0d5 8989 last_repz_prefix = i;
252b5132
RH
8990 break;
8991 case 0xf2:
8992 prefixes |= PREFIX_REPNZ;
f16cd0d5 8993 last_repnz_prefix = i;
252b5132
RH
8994 break;
8995 case 0xf0:
8996 prefixes |= PREFIX_LOCK;
f16cd0d5 8997 last_lock_prefix = i;
252b5132
RH
8998 break;
8999 case 0x2e:
9000 prefixes |= PREFIX_CS;
f16cd0d5 9001 last_seg_prefix = i;
0fa0fc85
BP
9002
9003 if (address_mode != mode_64bit)
9004 active_seg_prefix = PREFIX_CS;
9005
252b5132
RH
9006 break;
9007 case 0x36:
9008 prefixes |= PREFIX_SS;
f16cd0d5 9009 last_seg_prefix = i;
0fa0fc85
BP
9010
9011 if (address_mode != mode_64bit)
9012 active_seg_prefix = PREFIX_SS;
9013
252b5132
RH
9014 break;
9015 case 0x3e:
9016 prefixes |= PREFIX_DS;
f16cd0d5 9017 last_seg_prefix = i;
0fa0fc85
BP
9018
9019 if (address_mode != mode_64bit)
9020 active_seg_prefix = PREFIX_DS;
9021
252b5132
RH
9022 break;
9023 case 0x26:
9024 prefixes |= PREFIX_ES;
f16cd0d5 9025 last_seg_prefix = i;
0fa0fc85
BP
9026
9027 if (address_mode != mode_64bit)
9028 active_seg_prefix = PREFIX_ES;
9029
252b5132
RH
9030 break;
9031 case 0x64:
9032 prefixes |= PREFIX_FS;
f16cd0d5 9033 last_seg_prefix = i;
285ca992 9034 active_seg_prefix = PREFIX_FS;
252b5132
RH
9035 break;
9036 case 0x65:
9037 prefixes |= PREFIX_GS;
f16cd0d5 9038 last_seg_prefix = i;
285ca992 9039 active_seg_prefix = PREFIX_GS;
252b5132
RH
9040 break;
9041 case 0x66:
9042 prefixes |= PREFIX_DATA;
f16cd0d5 9043 last_data_prefix = i;
252b5132
RH
9044 break;
9045 case 0x67:
9046 prefixes |= PREFIX_ADDR;
f16cd0d5 9047 last_addr_prefix = i;
252b5132 9048 break;
5076851f 9049 case FWAIT_OPCODE:
252b5132
RH
9050 /* fwait is really an instruction. If there are prefixes
9051 before the fwait, they belong to the fwait, *not* to the
9052 following instruction. */
d9949a36 9053 fwait_prefix = i;
3e7d61b2 9054 if (prefixes || rex)
252b5132
RH
9055 {
9056 prefixes |= PREFIX_FWAIT;
9057 codep++;
6c067bbb
RM
9058 /* This ensures that the previous REX prefixes are noticed
9059 as unused prefixes, as in the return case below. */
9060 rex_used = rex;
f16cd0d5 9061 return 1;
252b5132
RH
9062 }
9063 prefixes = PREFIX_FWAIT;
9064 break;
9065 default:
f16cd0d5 9066 return 1;
252b5132 9067 }
52b15da3
JH
9068 /* Rex is ignored when followed by another prefix. */
9069 if (rex)
9070 {
3e7d61b2 9071 rex_used = rex;
f16cd0d5 9072 return 1;
52b15da3 9073 }
f16cd0d5 9074 if (*codep != FWAIT_OPCODE)
4e9ac44a 9075 all_prefixes[i++] = *codep;
52b15da3 9076 rex = newrex;
252b5132 9077 codep++;
f16cd0d5
L
9078 length++;
9079 }
9080 return 0;
9081}
9082
7d421014
ILT
9083/* Return the name of the prefix byte PREF, or NULL if PREF is not a
9084 prefix byte. */
9085
9086static const char *
26ca5450 9087prefix_name (int pref, int sizeflag)
7d421014 9088{
0003779b
L
9089 static const char *rexes [16] =
9090 {
9091 "rex", /* 0x40 */
9092 "rex.B", /* 0x41 */
9093 "rex.X", /* 0x42 */
9094 "rex.XB", /* 0x43 */
9095 "rex.R", /* 0x44 */
9096 "rex.RB", /* 0x45 */
9097 "rex.RX", /* 0x46 */
9098 "rex.RXB", /* 0x47 */
9099 "rex.W", /* 0x48 */
9100 "rex.WB", /* 0x49 */
9101 "rex.WX", /* 0x4a */
9102 "rex.WXB", /* 0x4b */
9103 "rex.WR", /* 0x4c */
9104 "rex.WRB", /* 0x4d */
9105 "rex.WRX", /* 0x4e */
9106 "rex.WRXB", /* 0x4f */
9107 };
9108
7d421014
ILT
9109 switch (pref)
9110 {
52b15da3
JH
9111 /* REX prefixes family. */
9112 case 0x40:
52b15da3 9113 case 0x41:
52b15da3 9114 case 0x42:
52b15da3 9115 case 0x43:
52b15da3 9116 case 0x44:
52b15da3 9117 case 0x45:
52b15da3 9118 case 0x46:
52b15da3 9119 case 0x47:
52b15da3 9120 case 0x48:
52b15da3 9121 case 0x49:
52b15da3 9122 case 0x4a:
52b15da3 9123 case 0x4b:
52b15da3 9124 case 0x4c:
52b15da3 9125 case 0x4d:
52b15da3 9126 case 0x4e:
52b15da3 9127 case 0x4f:
0003779b 9128 return rexes [pref - 0x40];
7d421014
ILT
9129 case 0xf3:
9130 return "repz";
9131 case 0xf2:
9132 return "repnz";
9133 case 0xf0:
9134 return "lock";
9135 case 0x2e:
9136 return "cs";
9137 case 0x36:
9138 return "ss";
9139 case 0x3e:
9140 return "ds";
9141 case 0x26:
9142 return "es";
9143 case 0x64:
9144 return "fs";
9145 case 0x65:
9146 return "gs";
9147 case 0x66:
9148 return (sizeflag & DFLAG) ? "data16" : "data32";
9149 case 0x67:
cb712a9e 9150 if (address_mode == mode_64bit)
db6eb5be 9151 return (sizeflag & AFLAG) ? "addr32" : "addr64";
c1a64871 9152 else
2888cb7a 9153 return (sizeflag & AFLAG) ? "addr16" : "addr32";
7d421014
ILT
9154 case FWAIT_OPCODE:
9155 return "fwait";
f16cd0d5
L
9156 case REP_PREFIX:
9157 return "rep";
42164a71
L
9158 case XACQUIRE_PREFIX:
9159 return "xacquire";
9160 case XRELEASE_PREFIX:
9161 return "xrelease";
7e8b059b
L
9162 case BND_PREFIX:
9163 return "bnd";
04ef582a
L
9164 case NOTRACK_PREFIX:
9165 return "notrack";
7d421014
ILT
9166 default:
9167 return NULL;
9168 }
9169}
9170
ce518a5f
L
9171static char op_out[MAX_OPERANDS][100];
9172static int op_ad, op_index[MAX_OPERANDS];
1d9f512f 9173static int two_source_ops;
ce518a5f
L
9174static bfd_vma op_address[MAX_OPERANDS];
9175static bfd_vma op_riprel[MAX_OPERANDS];
52b15da3 9176static bfd_vma start_pc;
ce518a5f 9177
252b5132
RH
9178/*
9179 * On the 386's of 1988, the maximum length of an instruction is 15 bytes.
9180 * (see topic "Redundant prefixes" in the "Differences from 8086"
9181 * section of the "Virtual 8086 Mode" chapter.)
9182 * 'pc' should be the address of this instruction, it will
9183 * be used to print the target address if this is a relative jump or call
9184 * The function returns the length of this instruction in bytes.
9185 */
9186
252b5132 9187static char intel_syntax;
9d141669 9188static char intel_mnemonic = !SYSV386_COMPAT;
252b5132
RH
9189static char open_char;
9190static char close_char;
9191static char separator_char;
9192static char scale_char;
9193
5db04b09
L
9194enum x86_64_isa
9195{
d835a58b 9196 amd64 = 1,
5db04b09
L
9197 intel64
9198};
9199
9200static enum x86_64_isa isa64;
9201
e396998b
AM
9202/* Here for backwards compatibility. When gdb stops using
9203 print_insn_i386_att and print_insn_i386_intel these functions can
9204 disappear, and print_insn_i386 be merged into print_insn. */
252b5132 9205int
26ca5450 9206print_insn_i386_att (bfd_vma pc, disassemble_info *info)
252b5132
RH
9207{
9208 intel_syntax = 0;
e396998b
AM
9209
9210 return print_insn (pc, info);
252b5132
RH
9211}
9212
9213int
26ca5450 9214print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
252b5132
RH
9215{
9216 intel_syntax = 1;
e396998b
AM
9217
9218 return print_insn (pc, info);
252b5132
RH
9219}
9220
e396998b 9221int
26ca5450 9222print_insn_i386 (bfd_vma pc, disassemble_info *info)
e396998b
AM
9223{
9224 intel_syntax = -1;
9225
9226 return print_insn (pc, info);
9227}
9228
f59a29b9
L
9229void
9230print_i386_disassembler_options (FILE *stream)
9231{
9232 fprintf (stream, _("\n\
9233The following i386/x86-64 specific disassembler options are supported for use\n\
9234with the -M switch (multiple options should be separated by commas):\n"));
9235
9236 fprintf (stream, _(" x86-64 Disassemble in 64bit mode\n"));
9237 fprintf (stream, _(" i386 Disassemble in 32bit mode\n"));
9238 fprintf (stream, _(" i8086 Disassemble in 16bit mode\n"));
9239 fprintf (stream, _(" att Display instruction in AT&T syntax\n"));
9240 fprintf (stream, _(" intel Display instruction in Intel syntax\n"));
9d141669
L
9241 fprintf (stream, _(" att-mnemonic\n"
9242 " Display instruction in AT&T mnemonic\n"));
9243 fprintf (stream, _(" intel-mnemonic\n"
9244 " Display instruction in Intel mnemonic\n"));
f59a29b9
L
9245 fprintf (stream, _(" addr64 Assume 64bit address size\n"));
9246 fprintf (stream, _(" addr32 Assume 32bit address size\n"));
9247 fprintf (stream, _(" addr16 Assume 16bit address size\n"));
9248 fprintf (stream, _(" data32 Assume 32bit data size\n"));
9249 fprintf (stream, _(" data16 Assume 16bit data size\n"));
9250 fprintf (stream, _(" suffix Always display instruction suffix in AT&T syntax\n"));
5db04b09
L
9251 fprintf (stream, _(" amd64 Display instruction in AMD64 ISA\n"));
9252 fprintf (stream, _(" intel64 Display instruction in Intel64 ISA\n"));
f59a29b9
L
9253}
9254
592d1631 9255/* Bad opcode. */
bf890a93 9256static const struct dis386 bad_opcode = { "(bad)", { XX }, 0 };
592d1631 9257
b844680a
L
9258/* Get a pointer to struct dis386 with a valid name. */
9259
9260static const struct dis386 *
8bb15339 9261get_valid_dis386 (const struct dis386 *dp, disassemble_info *info)
b844680a 9262{
91d6fa6a 9263 int vindex, vex_table_index;
b844680a
L
9264
9265 if (dp->name != NULL)
9266 return dp;
9267
9268 switch (dp->op[0].bytemode)
9269 {
1ceb70f8
L
9270 case USE_REG_TABLE:
9271 dp = &reg_table[dp->op[1].bytemode][modrm.reg];
9272 break;
9273
9274 case USE_MOD_TABLE:
91d6fa6a
NC
9275 vindex = modrm.mod == 0x3 ? 1 : 0;
9276 dp = &mod_table[dp->op[1].bytemode][vindex];
1ceb70f8
L
9277 break;
9278
9279 case USE_RM_TABLE:
9280 dp = &rm_table[dp->op[1].bytemode][modrm.rm];
b844680a
L
9281 break;
9282
4e7d34a6 9283 case USE_PREFIX_TABLE:
c0f3af97 9284 if (need_vex)
b844680a 9285 {
c0f3af97
L
9286 /* The prefix in VEX is implicit. */
9287 switch (vex.prefix)
9288 {
9289 case 0:
91d6fa6a 9290 vindex = 0;
c0f3af97
L
9291 break;
9292 case REPE_PREFIX_OPCODE:
91d6fa6a 9293 vindex = 1;
c0f3af97
L
9294 break;
9295 case DATA_PREFIX_OPCODE:
91d6fa6a 9296 vindex = 2;
c0f3af97
L
9297 break;
9298 case REPNE_PREFIX_OPCODE:
91d6fa6a 9299 vindex = 3;
c0f3af97
L
9300 break;
9301 default:
9302 abort ();
9303 break;
9304 }
b844680a 9305 }
7bb15c6f 9306 else
b844680a 9307 {
285ca992
L
9308 int last_prefix = -1;
9309 int prefix = 0;
91d6fa6a 9310 vindex = 0;
285ca992
L
9311 /* We check PREFIX_REPNZ and PREFIX_REPZ before PREFIX_DATA.
9312 When there are multiple PREFIX_REPNZ and PREFIX_REPZ, the
9313 last one wins. */
9314 if ((prefixes & (PREFIX_REPZ | PREFIX_REPNZ)) != 0)
b844680a 9315 {
285ca992 9316 if (last_repz_prefix > last_repnz_prefix)
c0f3af97 9317 {
285ca992
L
9318 vindex = 1;
9319 prefix = PREFIX_REPZ;
9320 last_prefix = last_repz_prefix;
c0f3af97
L
9321 }
9322 else
b844680a 9323 {
285ca992
L
9324 vindex = 3;
9325 prefix = PREFIX_REPNZ;
9326 last_prefix = last_repnz_prefix;
b844680a 9327 }
285ca992 9328
507bd325
L
9329 /* Check if prefix should be ignored. */
9330 if ((((prefix_table[dp->op[1].bytemode][vindex].prefix_requirement
9331 & PREFIX_IGNORED) >> PREFIX_IGNORED_SHIFT)
31941983
JB
9332 & prefix) != 0
9333 && !prefix_table[dp->op[1].bytemode][vindex].name)
285ca992
L
9334 vindex = 0;
9335 }
9336
9337 if (vindex == 0 && (prefixes & PREFIX_DATA) != 0)
9338 {
9339 vindex = 2;
9340 prefix = PREFIX_DATA;
9341 last_prefix = last_data_prefix;
9342 }
9343
9344 if (vindex != 0)
9345 {
9346 used_prefixes |= prefix;
9347 all_prefixes[last_prefix] = 0;
b844680a
L
9348 }
9349 }
91d6fa6a 9350 dp = &prefix_table[dp->op[1].bytemode][vindex];
b844680a
L
9351 break;
9352
4e7d34a6 9353 case USE_X86_64_TABLE:
91d6fa6a
NC
9354 vindex = address_mode == mode_64bit ? 1 : 0;
9355 dp = &x86_64_table[dp->op[1].bytemode][vindex];
b844680a
L
9356 break;
9357
4e7d34a6 9358 case USE_3BYTE_TABLE:
8bb15339 9359 FETCH_DATA (info, codep + 2);
91d6fa6a
NC
9360 vindex = *codep++;
9361 dp = &three_byte_table[dp->op[1].bytemode][vindex];
285ca992 9362 end_codep = codep;
8bb15339
L
9363 modrm.mod = (*codep >> 6) & 3;
9364 modrm.reg = (*codep >> 3) & 7;
9365 modrm.rm = *codep & 7;
9366 break;
9367
c0f3af97
L
9368 case USE_VEX_LEN_TABLE:
9369 if (!need_vex)
9370 abort ();
9371
9372 switch (vex.length)
9373 {
9374 case 128:
91d6fa6a 9375 vindex = 0;
c0f3af97
L
9376 break;
9377 case 256:
91d6fa6a 9378 vindex = 1;
c0f3af97
L
9379 break;
9380 default:
9381 abort ();
9382 break;
9383 }
9384
91d6fa6a 9385 dp = &vex_len_table[dp->op[1].bytemode][vindex];
c0f3af97
L
9386 break;
9387
04e2a182
L
9388 case USE_EVEX_LEN_TABLE:
9389 if (!vex.evex)
9390 abort ();
9391
9392 switch (vex.length)
9393 {
9394 case 128:
9395 vindex = 0;
9396 break;
9397 case 256:
9398 vindex = 1;
9399 break;
9400 case 512:
9401 vindex = 2;
9402 break;
9403 default:
9404 abort ();
9405 break;
9406 }
9407
9408 dp = &evex_len_table[dp->op[1].bytemode][vindex];
9409 break;
9410
f88c9eb0
SP
9411 case USE_XOP_8F_TABLE:
9412 FETCH_DATA (info, codep + 3);
f88c9eb0
SP
9413 rex = ~(*codep >> 5) & 0x7;
9414
9415 /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm". */
9416 switch ((*codep & 0x1f))
9417 {
9418 default:
f07af43e
L
9419 dp = &bad_opcode;
9420 return dp;
5dd85c99
SP
9421 case 0x8:
9422 vex_table_index = XOP_08;
9423 break;
f88c9eb0
SP
9424 case 0x9:
9425 vex_table_index = XOP_09;
9426 break;
9427 case 0xa:
9428 vex_table_index = XOP_0A;
9429 break;
9430 }
9431 codep++;
9432 vex.w = *codep & 0x80;
9433 if (vex.w && address_mode == mode_64bit)
9434 rex |= REX_W;
9435
9436 vex.register_specifier = (~(*codep >> 3)) & 0xf;
abfcb414 9437 if (address_mode != mode_64bit)
f07af43e 9438 {
abfcb414
AP
9439 /* In 16/32-bit mode REX_B is silently ignored. */
9440 rex &= ~REX_B;
f07af43e 9441 }
f88c9eb0
SP
9442
9443 vex.length = (*codep & 0x4) ? 256 : 128;
9444 switch ((*codep & 0x3))
9445 {
9446 case 0:
f88c9eb0
SP
9447 break;
9448 case 1:
9449 vex.prefix = DATA_PREFIX_OPCODE;
9450 break;
9451 case 2:
9452 vex.prefix = REPE_PREFIX_OPCODE;
9453 break;
9454 case 3:
9455 vex.prefix = REPNE_PREFIX_OPCODE;
9456 break;
9457 }
9458 need_vex = 1;
f88c9eb0 9459 codep++;
91d6fa6a
NC
9460 vindex = *codep++;
9461 dp = &xop_table[vex_table_index][vindex];
c48244a5 9462
285ca992 9463 end_codep = codep;
c48244a5
SP
9464 FETCH_DATA (info, codep + 1);
9465 modrm.mod = (*codep >> 6) & 3;
9466 modrm.reg = (*codep >> 3) & 7;
9467 modrm.rm = *codep & 7;
b5b098c2
JB
9468
9469 /* No XOP encoding so far allows for a non-zero embedded prefix. Avoid
9470 having to decode the bits for every otherwise valid encoding. */
9471 if (vex.prefix)
9472 return &bad_opcode;
f88c9eb0
SP
9473 break;
9474
c0f3af97 9475 case USE_VEX_C4_TABLE:
43234a1e 9476 /* VEX prefix. */
c0f3af97 9477 FETCH_DATA (info, codep + 3);
c0f3af97
L
9478 rex = ~(*codep >> 5) & 0x7;
9479 switch ((*codep & 0x1f))
9480 {
9481 default:
f07af43e
L
9482 dp = &bad_opcode;
9483 return dp;
c0f3af97 9484 case 0x1:
f88c9eb0 9485 vex_table_index = VEX_0F;
c0f3af97
L
9486 break;
9487 case 0x2:
f88c9eb0 9488 vex_table_index = VEX_0F38;
c0f3af97
L
9489 break;
9490 case 0x3:
f88c9eb0 9491 vex_table_index = VEX_0F3A;
c0f3af97
L
9492 break;
9493 }
9494 codep++;
9495 vex.w = *codep & 0x80;
9889cbb1 9496 if (address_mode == mode_64bit)
f07af43e 9497 {
9889cbb1
L
9498 if (vex.w)
9499 rex |= REX_W;
9889cbb1
L
9500 }
9501 else
9502 {
9503 /* For the 3-byte VEX prefix in 32-bit mode, the REX_B bit
9504 is ignored, other REX bits are 0 and the highest bit in
5f847646 9505 VEX.vvvv is also ignored (but we mustn't clear it here). */
9889cbb1 9506 rex = 0;
f07af43e 9507 }
5f847646 9508 vex.register_specifier = (~(*codep >> 3)) & 0xf;
c0f3af97
L
9509 vex.length = (*codep & 0x4) ? 256 : 128;
9510 switch ((*codep & 0x3))
9511 {
9512 case 0:
c0f3af97
L
9513 break;
9514 case 1:
9515 vex.prefix = DATA_PREFIX_OPCODE;
9516 break;
9517 case 2:
9518 vex.prefix = REPE_PREFIX_OPCODE;
9519 break;
9520 case 3:
9521 vex.prefix = REPNE_PREFIX_OPCODE;
9522 break;
9523 }
9524 need_vex = 1;
c0f3af97 9525 codep++;
91d6fa6a
NC
9526 vindex = *codep++;
9527 dp = &vex_table[vex_table_index][vindex];
285ca992 9528 end_codep = codep;
53c4d625
JB
9529 /* There is no MODRM byte for VEX0F 77. */
9530 if (vex_table_index != VEX_0F || vindex != 0x77)
c0f3af97
L
9531 {
9532 FETCH_DATA (info, codep + 1);
9533 modrm.mod = (*codep >> 6) & 3;
9534 modrm.reg = (*codep >> 3) & 7;
9535 modrm.rm = *codep & 7;
9536 }
9537 break;
9538
9539 case USE_VEX_C5_TABLE:
43234a1e 9540 /* VEX prefix. */
c0f3af97 9541 FETCH_DATA (info, codep + 2);
c0f3af97
L
9542 rex = (*codep & 0x80) ? 0 : REX_R;
9543
9889cbb1
L
9544 /* For the 2-byte VEX prefix in 32-bit mode, the highest bit in
9545 VEX.vvvv is 1. */
c0f3af97 9546 vex.register_specifier = (~(*codep >> 3)) & 0xf;
c0f3af97
L
9547 vex.length = (*codep & 0x4) ? 256 : 128;
9548 switch ((*codep & 0x3))
9549 {
9550 case 0:
c0f3af97
L
9551 break;
9552 case 1:
9553 vex.prefix = DATA_PREFIX_OPCODE;
9554 break;
9555 case 2:
9556 vex.prefix = REPE_PREFIX_OPCODE;
9557 break;
9558 case 3:
9559 vex.prefix = REPNE_PREFIX_OPCODE;
9560 break;
9561 }
9562 need_vex = 1;
c0f3af97 9563 codep++;
91d6fa6a
NC
9564 vindex = *codep++;
9565 dp = &vex_table[dp->op[1].bytemode][vindex];
285ca992 9566 end_codep = codep;
53c4d625
JB
9567 /* There is no MODRM byte for VEX 77. */
9568 if (vindex != 0x77)
c0f3af97
L
9569 {
9570 FETCH_DATA (info, codep + 1);
9571 modrm.mod = (*codep >> 6) & 3;
9572 modrm.reg = (*codep >> 3) & 7;
9573 modrm.rm = *codep & 7;
9574 }
9575 break;
9576
9e30b8e0
L
9577 case USE_VEX_W_TABLE:
9578 if (!need_vex)
9579 abort ();
9580
9581 dp = &vex_w_table[dp->op[1].bytemode][vex.w ? 1 : 0];
9582 break;
9583
43234a1e
L
9584 case USE_EVEX_TABLE:
9585 two_source_ops = 0;
9586 /* EVEX prefix. */
9587 vex.evex = 1;
9588 FETCH_DATA (info, codep + 4);
43234a1e
L
9589 /* The first byte after 0x62. */
9590 rex = ~(*codep >> 5) & 0x7;
9591 vex.r = *codep & 0x10;
9592 switch ((*codep & 0xf))
9593 {
9594 default:
9595 return &bad_opcode;
9596 case 0x1:
9597 vex_table_index = EVEX_0F;
9598 break;
9599 case 0x2:
9600 vex_table_index = EVEX_0F38;
9601 break;
9602 case 0x3:
9603 vex_table_index = EVEX_0F3A;
9604 break;
9605 }
9606
9607 /* The second byte after 0x62. */
9608 codep++;
9609 vex.w = *codep & 0x80;
9610 if (vex.w && address_mode == mode_64bit)
9611 rex |= REX_W;
9612
9613 vex.register_specifier = (~(*codep >> 3)) & 0xf;
43234a1e
L
9614
9615 /* The U bit. */
9616 if (!(*codep & 0x4))
9617 return &bad_opcode;
9618
9619 switch ((*codep & 0x3))
9620 {
9621 case 0:
43234a1e
L
9622 break;
9623 case 1:
9624 vex.prefix = DATA_PREFIX_OPCODE;
9625 break;
9626 case 2:
9627 vex.prefix = REPE_PREFIX_OPCODE;
9628 break;
9629 case 3:
9630 vex.prefix = REPNE_PREFIX_OPCODE;
9631 break;
9632 }
9633
9634 /* The third byte after 0x62. */
9635 codep++;
9636
9637 /* Remember the static rounding bits. */
9638 vex.ll = (*codep >> 5) & 3;
9639 vex.b = (*codep & 0x10) != 0;
9640
9641 vex.v = *codep & 0x8;
9642 vex.mask_register_specifier = *codep & 0x7;
9643 vex.zeroing = *codep & 0x80;
9644
5f847646
JB
9645 if (address_mode != mode_64bit)
9646 {
9647 /* In 16/32-bit mode silently ignore following bits. */
9648 rex &= ~REX_B;
9649 vex.r = 1;
9650 vex.v = 1;
9651 }
9652
43234a1e 9653 need_vex = 1;
43234a1e
L
9654 codep++;
9655 vindex = *codep++;
9656 dp = &evex_table[vex_table_index][vindex];
285ca992 9657 end_codep = codep;
43234a1e
L
9658 FETCH_DATA (info, codep + 1);
9659 modrm.mod = (*codep >> 6) & 3;
9660 modrm.reg = (*codep >> 3) & 7;
9661 modrm.rm = *codep & 7;
9662
9663 /* Set vector length. */
9664 if (modrm.mod == 3 && vex.b)
9665 vex.length = 512;
9666 else
9667 {
9668 switch (vex.ll)
9669 {
9670 case 0x0:
9671 vex.length = 128;
9672 break;
9673 case 0x1:
9674 vex.length = 256;
9675 break;
9676 case 0x2:
9677 vex.length = 512;
9678 break;
9679 default:
9680 return &bad_opcode;
9681 }
9682 }
9683 break;
9684
592d1631
L
9685 case 0:
9686 dp = &bad_opcode;
9687 break;
9688
b844680a 9689 default:
d34b5006 9690 abort ();
b844680a
L
9691 }
9692
9693 if (dp->name != NULL)
9694 return dp;
9695 else
8bb15339 9696 return get_valid_dis386 (dp, info);
b844680a
L
9697}
9698
dfc8cf43 9699static void
55cf16e1 9700get_sib (disassemble_info *info, int sizeflag)
dfc8cf43
L
9701{
9702 /* If modrm.mod == 3, operand must be register. */
9703 if (need_modrm
55cf16e1 9704 && ((sizeflag & AFLAG) || address_mode == mode_64bit)
dfc8cf43
L
9705 && modrm.mod != 3
9706 && modrm.rm == 4)
9707 {
9708 FETCH_DATA (info, codep + 2);
9709 sib.index = (codep [1] >> 3) & 7;
9710 sib.scale = (codep [1] >> 6) & 3;
9711 sib.base = codep [1] & 7;
9712 }
9713}
9714
e396998b 9715static int
26ca5450 9716print_insn (bfd_vma pc, disassemble_info *info)
252b5132 9717{
2da11e11 9718 const struct dis386 *dp;
252b5132 9719 int i;
ce518a5f 9720 char *op_txt[MAX_OPERANDS];
252b5132 9721 int needcomma;
df18fdba 9722 int sizeflag, orig_sizeflag;
e396998b 9723 const char *p;
252b5132 9724 struct dis_private priv;
f16cd0d5 9725 int prefix_length;
252b5132 9726
d7921315
L
9727 priv.orig_sizeflag = AFLAG | DFLAG;
9728 if ((info->mach & bfd_mach_i386_i386) != 0)
cb712a9e 9729 address_mode = mode_32bit;
2da11e11 9730 else if (info->mach == bfd_mach_i386_i8086)
d7921315
L
9731 {
9732 address_mode = mode_16bit;
9733 priv.orig_sizeflag = 0;
9734 }
2da11e11 9735 else
d7921315
L
9736 address_mode = mode_64bit;
9737
9738 if (intel_syntax == (char) -1)
9739 intel_syntax = (info->mach & bfd_mach_i386_intel_syntax) != 0;
e396998b
AM
9740
9741 for (p = info->disassembler_options; p != NULL; )
9742 {
5db04b09
L
9743 if (CONST_STRNEQ (p, "amd64"))
9744 isa64 = amd64;
9745 else if (CONST_STRNEQ (p, "intel64"))
9746 isa64 = intel64;
9747 else if (CONST_STRNEQ (p, "x86-64"))
e396998b 9748 {
cb712a9e 9749 address_mode = mode_64bit;
2a1bb84c 9750 priv.orig_sizeflag |= AFLAG | DFLAG;
e396998b 9751 }
0112cd26 9752 else if (CONST_STRNEQ (p, "i386"))
e396998b 9753 {
cb712a9e 9754 address_mode = mode_32bit;
2a1bb84c 9755 priv.orig_sizeflag |= AFLAG | DFLAG;
e396998b 9756 }
0112cd26 9757 else if (CONST_STRNEQ (p, "i8086"))
e396998b 9758 {
cb712a9e 9759 address_mode = mode_16bit;
2a1bb84c 9760 priv.orig_sizeflag &= ~(AFLAG | DFLAG);
e396998b 9761 }
0112cd26 9762 else if (CONST_STRNEQ (p, "intel"))
e396998b
AM
9763 {
9764 intel_syntax = 1;
9d141669
L
9765 if (CONST_STRNEQ (p + 5, "-mnemonic"))
9766 intel_mnemonic = 1;
e396998b 9767 }
0112cd26 9768 else if (CONST_STRNEQ (p, "att"))
e396998b
AM
9769 {
9770 intel_syntax = 0;
9d141669
L
9771 if (CONST_STRNEQ (p + 3, "-mnemonic"))
9772 intel_mnemonic = 0;
e396998b 9773 }
0112cd26 9774 else if (CONST_STRNEQ (p, "addr"))
e396998b 9775 {
f59a29b9
L
9776 if (address_mode == mode_64bit)
9777 {
9778 if (p[4] == '3' && p[5] == '2')
9779 priv.orig_sizeflag &= ~AFLAG;
9780 else if (p[4] == '6' && p[5] == '4')
9781 priv.orig_sizeflag |= AFLAG;
9782 }
9783 else
9784 {
9785 if (p[4] == '1' && p[5] == '6')
9786 priv.orig_sizeflag &= ~AFLAG;
9787 else if (p[4] == '3' && p[5] == '2')
9788 priv.orig_sizeflag |= AFLAG;
9789 }
e396998b 9790 }
0112cd26 9791 else if (CONST_STRNEQ (p, "data"))
e396998b
AM
9792 {
9793 if (p[4] == '1' && p[5] == '6')
9794 priv.orig_sizeflag &= ~DFLAG;
9795 else if (p[4] == '3' && p[5] == '2')
9796 priv.orig_sizeflag |= DFLAG;
9797 }
0112cd26 9798 else if (CONST_STRNEQ (p, "suffix"))
e396998b
AM
9799 priv.orig_sizeflag |= SUFFIX_ALWAYS;
9800
9801 p = strchr (p, ',');
9802 if (p != NULL)
9803 p++;
9804 }
9805
c0f92bf9
L
9806 if (address_mode == mode_64bit && sizeof (bfd_vma) < 8)
9807 {
9808 (*info->fprintf_func) (info->stream,
9809 _("64-bit address is disabled"));
9810 return -1;
9811 }
9812
e396998b
AM
9813 if (intel_syntax)
9814 {
9815 names64 = intel_names64;
9816 names32 = intel_names32;
9817 names16 = intel_names16;
9818 names8 = intel_names8;
9819 names8rex = intel_names8rex;
9820 names_seg = intel_names_seg;
b9733481 9821 names_mm = intel_names_mm;
7e8b059b 9822 names_bnd = intel_names_bnd;
b9733481
L
9823 names_xmm = intel_names_xmm;
9824 names_ymm = intel_names_ymm;
43234a1e 9825 names_zmm = intel_names_zmm;
260cd341 9826 names_tmm = intel_names_tmm;
db51cc60
L
9827 index64 = intel_index64;
9828 index32 = intel_index32;
43234a1e 9829 names_mask = intel_names_mask;
e396998b
AM
9830 index16 = intel_index16;
9831 open_char = '[';
9832 close_char = ']';
9833 separator_char = '+';
9834 scale_char = '*';
9835 }
9836 else
9837 {
9838 names64 = att_names64;
9839 names32 = att_names32;
9840 names16 = att_names16;
9841 names8 = att_names8;
9842 names8rex = att_names8rex;
9843 names_seg = att_names_seg;
b9733481 9844 names_mm = att_names_mm;
7e8b059b 9845 names_bnd = att_names_bnd;
b9733481
L
9846 names_xmm = att_names_xmm;
9847 names_ymm = att_names_ymm;
43234a1e 9848 names_zmm = att_names_zmm;
260cd341 9849 names_tmm = att_names_tmm;
db51cc60
L
9850 index64 = att_index64;
9851 index32 = att_index32;
43234a1e 9852 names_mask = att_names_mask;
e396998b
AM
9853 index16 = att_index16;
9854 open_char = '(';
9855 close_char = ')';
9856 separator_char = ',';
9857 scale_char = ',';
9858 }
2da11e11 9859
4fe53c98 9860 /* The output looks better if we put 7 bytes on a line, since that
8a9036a4
L
9861 puts most long word instructions on a single line. Use 8 bytes
9862 for Intel L1OM. */
d7921315 9863 if ((info->mach & bfd_mach_l1om) != 0)
8a9036a4
L
9864 info->bytes_per_line = 8;
9865 else
9866 info->bytes_per_line = 7;
252b5132 9867
26ca5450 9868 info->private_data = &priv;
252b5132
RH
9869 priv.max_fetched = priv.the_buffer;
9870 priv.insn_start = pc;
252b5132
RH
9871
9872 obuf[0] = 0;
ce518a5f
L
9873 for (i = 0; i < MAX_OPERANDS; ++i)
9874 {
9875 op_out[i][0] = 0;
9876 op_index[i] = -1;
9877 }
252b5132
RH
9878
9879 the_info = info;
9880 start_pc = pc;
e396998b
AM
9881 start_codep = priv.the_buffer;
9882 codep = priv.the_buffer;
252b5132 9883
8df14d78 9884 if (OPCODES_SIGSETJMP (priv.bailout) != 0)
5076851f 9885 {
7d421014
ILT
9886 const char *name;
9887
5076851f 9888 /* Getting here means we tried for data but didn't get it. That
e396998b
AM
9889 means we have an incomplete instruction of some sort. Just
9890 print the first byte as a prefix or a .byte pseudo-op. */
9891 if (codep > priv.the_buffer)
5076851f 9892 {
e396998b 9893 name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
7d421014
ILT
9894 if (name != NULL)
9895 (*info->fprintf_func) (info->stream, "%s", name);
9896 else
5076851f 9897 {
7d421014
ILT
9898 /* Just print the first byte as a .byte instruction. */
9899 (*info->fprintf_func) (info->stream, ".byte 0x%x",
e396998b 9900 (unsigned int) priv.the_buffer[0]);
5076851f 9901 }
5076851f 9902
7d421014 9903 return 1;
5076851f
ILT
9904 }
9905
9906 return -1;
9907 }
9908
52b15da3 9909 obufp = obuf;
f16cd0d5
L
9910 sizeflag = priv.orig_sizeflag;
9911
9912 if (!ckprefix () || rex_used)
9913 {
9914 /* Too many prefixes or unused REX prefixes. */
9915 for (i = 0;
f6dd4781 9916 i < (int) ARRAY_SIZE (all_prefixes) && all_prefixes[i];
f16cd0d5 9917 i++)
de882298 9918 (*info->fprintf_func) (info->stream, "%s%s",
6c067bbb 9919 i == 0 ? "" : " ",
f16cd0d5 9920 prefix_name (all_prefixes[i], sizeflag));
de882298 9921 return i;
f16cd0d5 9922 }
252b5132
RH
9923
9924 insn_codep = codep;
9925
9926 FETCH_DATA (info, codep + 1);
9927 two_source_ops = (*codep == 0x62) || (*codep == 0xc8);
9928
3e7d61b2 9929 if (((prefixes & PREFIX_FWAIT)
f16cd0d5 9930 && ((*codep < 0xd8) || (*codep > 0xdf))))
252b5132 9931 {
86a80a50 9932 /* Handle prefixes before fwait. */
d9949a36 9933 for (i = 0; i < fwait_prefix && all_prefixes[i];
86a80a50
L
9934 i++)
9935 (*info->fprintf_func) (info->stream, "%s ",
9936 prefix_name (all_prefixes[i], sizeflag));
f16cd0d5 9937 (*info->fprintf_func) (info->stream, "fwait");
86a80a50 9938 return i + 1;
252b5132
RH
9939 }
9940
252b5132
RH
9941 if (*codep == 0x0f)
9942 {
eec0f4ca 9943 unsigned char threebyte;
5f40e14d
JS
9944
9945 codep++;
9946 FETCH_DATA (info, codep + 1);
9947 threebyte = *codep;
eec0f4ca 9948 dp = &dis386_twobyte[threebyte];
0e9f3bf1 9949 need_modrm = twobyte_has_modrm[threebyte];
eec0f4ca 9950 codep++;
252b5132
RH
9951 }
9952 else
9953 {
6439fc28 9954 dp = &dis386[*codep];
252b5132 9955 need_modrm = onebyte_has_modrm[*codep];
eec0f4ca 9956 codep++;
252b5132 9957 }
246c51aa 9958
df18fdba
L
9959 /* Save sizeflag for printing the extra prefixes later before updating
9960 it for mnemonic and operand processing. The prefix names depend
9961 only on the address mode. */
9962 orig_sizeflag = sizeflag;
c608c12e 9963 if (prefixes & PREFIX_ADDR)
df18fdba 9964 sizeflag ^= AFLAG;
b844680a 9965 if ((prefixes & PREFIX_DATA))
df18fdba 9966 sizeflag ^= DFLAG;
3ffd33cf 9967
285ca992 9968 end_codep = codep;
8bb15339 9969 if (need_modrm)
252b5132
RH
9970 {
9971 FETCH_DATA (info, codep + 1);
7967e09e
L
9972 modrm.mod = (*codep >> 6) & 3;
9973 modrm.reg = (*codep >> 3) & 7;
9974 modrm.rm = *codep & 7;
252b5132 9975 }
0e9f3bf1
L
9976 else
9977 memset (&modrm, 0, sizeof (modrm));
252b5132 9978
42d5f9c6 9979 need_vex = 0;
caf0678c 9980 memset (&vex, 0, sizeof (vex));
55b126d4 9981
ce518a5f 9982 if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
252b5132 9983 {
55cf16e1 9984 get_sib (info, sizeflag);
252b5132
RH
9985 dofloat (sizeflag);
9986 }
9987 else
9988 {
8bb15339 9989 dp = get_valid_dis386 (dp, info);
b844680a 9990 if (dp != NULL && putop (dp->name, sizeflag) == 0)
6c067bbb 9991 {
55cf16e1 9992 get_sib (info, sizeflag);
ce518a5f
L
9993 for (i = 0; i < MAX_OPERANDS; ++i)
9994 {
246c51aa 9995 obufp = op_out[i];
ce518a5f
L
9996 op_ad = MAX_OPERANDS - 1 - i;
9997 if (dp->op[i].rtn)
9998 (*dp->op[i].rtn) (dp->op[i].bytemode, sizeflag);
43234a1e
L
9999 /* For EVEX instruction after the last operand masking
10000 should be printed. */
10001 if (i == 0 && vex.evex)
10002 {
10003 /* Don't print {%k0}. */
10004 if (vex.mask_register_specifier)
10005 {
10006 oappend ("{");
10007 oappend (names_mask[vex.mask_register_specifier]);
10008 oappend ("}");
10009 }
10010 if (vex.zeroing)
10011 oappend ("{z}");
10012 }
ce518a5f 10013 }
6439fc28 10014 }
252b5132
RH
10015 }
10016
1d67fe3b
TT
10017 /* Clear instruction information. */
10018 if (the_info)
10019 {
10020 the_info->insn_info_valid = 0;
10021 the_info->branch_delay_insns = 0;
10022 the_info->data_size = 0;
10023 the_info->insn_type = dis_noninsn;
10024 the_info->target = 0;
10025 the_info->target2 = 0;
10026 }
10027
10028 /* Reset jump operation indicator. */
10029 op_is_jump = FALSE;
10030
10031 {
10032 int jump_detection = 0;
10033
10034 /* Extract flags. */
10035 for (i = 0; i < MAX_OPERANDS; ++i)
10036 {
10037 if ((dp->op[i].rtn == OP_J)
10038 || (dp->op[i].rtn == OP_indirE))
10039 jump_detection |= 1;
10040 else if ((dp->op[i].rtn == BND_Fixup)
10041 || (!dp->op[i].rtn && !dp->op[i].bytemode))
10042 jump_detection |= 2;
10043 else if ((dp->op[i].bytemode == cond_jump_mode)
10044 || (dp->op[i].bytemode == loop_jcxz_mode))
10045 jump_detection |= 4;
10046 }
10047
10048 /* Determine if this is a jump or branch. */
10049 if ((jump_detection & 0x3) == 0x3)
10050 {
10051 op_is_jump = TRUE;
10052 if (jump_detection & 0x4)
10053 the_info->insn_type = dis_condbranch;
10054 else
10055 the_info->insn_type =
10056 (dp->name && !strncmp(dp->name, "call", 4))
10057 ? dis_jsr : dis_branch;
10058 }
10059 }
10060
63c6fc6c
L
10061 /* If VEX.vvvv and EVEX.vvvv are unused, they must be all 1s, which
10062 are all 0s in inverted form. */
10063 if (need_vex && vex.register_specifier != 0)
10064 {
10065 (*info->fprintf_func) (info->stream, "(bad)");
10066 return end_codep - priv.the_buffer;
10067 }
10068
7531c613
JB
10069 switch (dp->prefix_requirement)
10070 {
10071 case PREFIX_DATA:
10072 /* If only the data prefix is marked as mandatory, its absence renders
10073 the encoding invalid. Most other PREFIX_OPCODE rules still apply. */
10074 if (need_vex ? !vex.prefix : !(prefixes & PREFIX_DATA))
10075 {
10076 (*info->fprintf_func) (info->stream, "(bad)");
10077 return end_codep - priv.the_buffer;
10078 }
10079 used_prefixes |= PREFIX_DATA;
10080 /* Fall through. */
10081 case PREFIX_OPCODE:
10082 /* If the mandatory PREFIX_REPZ/PREFIX_REPNZ/PREFIX_DATA prefix is
10083 unused, opcode is invalid. Since the PREFIX_DATA prefix may be
10084 used by putop and MMX/SSE operand and may be overridden by the
10085 PREFIX_REPZ/PREFIX_REPNZ fix, we check the PREFIX_DATA prefix
10086 separately. */
10087 if (((need_vex
10088 ? vex.prefix == REPE_PREFIX_OPCODE
10089 || vex.prefix == REPNE_PREFIX_OPCODE
10090 : (prefixes
10091 & (PREFIX_REPZ | PREFIX_REPNZ)) != 0)
10092 && (used_prefixes
10093 & (PREFIX_REPZ | PREFIX_REPNZ)) == 0)
10094 || (((need_vex
10095 ? vex.prefix == DATA_PREFIX_OPCODE
10096 : ((prefixes
10097 & (PREFIX_REPZ | PREFIX_REPNZ | PREFIX_DATA))
10098 == PREFIX_DATA))
10099 && (used_prefixes & PREFIX_DATA) == 0))
10100 || (vex.evex && dp->prefix_requirement != PREFIX_DATA
10101 && !vex.w != !(used_prefixes & PREFIX_DATA)))
10102 {
10103 (*info->fprintf_func) (info->stream, "(bad)");
10104 return end_codep - priv.the_buffer;
10105 }
10106 break;
31941983
JB
10107
10108 case PREFIX_IGNORED:
10109 /* Zap data size and rep prefixes from used_prefixes and reinstate their
10110 origins in all_prefixes. */
10111 used_prefixes &= ~PREFIX_OPCODE;
10112 if (last_data_prefix >= 0)
10113 all_prefixes[last_repz_prefix] = 0x66;
10114 if (last_repz_prefix >= 0)
10115 all_prefixes[last_repz_prefix] = 0xf3;
10116 if (last_repnz_prefix >= 0)
10117 all_prefixes[last_repnz_prefix] = 0xf2;
10118 break;
7531c613
JB
10119 }
10120
d869730d 10121 /* Check if the REX prefix is used. */
73239888 10122 if ((rex ^ rex_used) == 0 && !need_vex && last_rex_prefix >= 0)
f16cd0d5
L
10123 all_prefixes[last_rex_prefix] = 0;
10124
5e6718e4 10125 /* Check if the SEG prefix is used. */
f16cd0d5
L
10126 if ((prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS | PREFIX_ES
10127 | PREFIX_FS | PREFIX_GS)) != 0
285ca992 10128 && (used_prefixes & active_seg_prefix) != 0)
f16cd0d5
L
10129 all_prefixes[last_seg_prefix] = 0;
10130
5e6718e4 10131 /* Check if the ADDR prefix is used. */
f16cd0d5
L
10132 if ((prefixes & PREFIX_ADDR) != 0
10133 && (used_prefixes & PREFIX_ADDR) != 0)
10134 all_prefixes[last_addr_prefix] = 0;
10135
df18fdba
L
10136 /* Check if the DATA prefix is used. */
10137 if ((prefixes & PREFIX_DATA) != 0
73239888
JB
10138 && (used_prefixes & PREFIX_DATA) != 0
10139 && !need_vex)
df18fdba 10140 all_prefixes[last_data_prefix] = 0;
f16cd0d5 10141
df18fdba 10142 /* Print the extra prefixes. */
f16cd0d5 10143 prefix_length = 0;
f310f33d 10144 for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
f16cd0d5
L
10145 if (all_prefixes[i])
10146 {
10147 const char *name;
df18fdba 10148 name = prefix_name (all_prefixes[i], orig_sizeflag);
f16cd0d5
L
10149 if (name == NULL)
10150 abort ();
10151 prefix_length += strlen (name) + 1;
10152 (*info->fprintf_func) (info->stream, "%s ", name);
10153 }
b844680a 10154
f16cd0d5
L
10155 /* Check maximum code length. */
10156 if ((codep - start_codep) > MAX_CODE_LENGTH)
10157 {
10158 (*info->fprintf_func) (info->stream, "(bad)");
10159 return MAX_CODE_LENGTH;
10160 }
b844680a 10161
ea397f5b 10162 obufp = mnemonicendp;
f16cd0d5 10163 for (i = strlen (obuf) + prefix_length; i < 6; i++)
252b5132
RH
10164 oappend (" ");
10165 oappend (" ");
10166 (*info->fprintf_func) (info->stream, "%s", obuf);
10167
10168 /* The enter and bound instructions are printed with operands in the same
10169 order as the intel book; everything else is printed in reverse order. */
2da11e11 10170 if (intel_syntax || two_source_ops)
252b5132 10171 {
185b1163
L
10172 bfd_vma riprel;
10173
ce518a5f 10174 for (i = 0; i < MAX_OPERANDS; ++i)
6c067bbb 10175 op_txt[i] = op_out[i];
246c51aa 10176
3a8547d2
JB
10177 if (intel_syntax && dp && dp->op[2].rtn == OP_Rounding
10178 && dp->op[3].rtn == OP_E && dp->op[4].rtn == NULL)
10179 {
10180 op_txt[2] = op_out[3];
10181 op_txt[3] = op_out[2];
10182 }
10183
ce518a5f
L
10184 for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
10185 {
6c067bbb
RM
10186 op_ad = op_index[i];
10187 op_index[i] = op_index[MAX_OPERANDS - 1 - i];
10188 op_index[MAX_OPERANDS - 1 - i] = op_ad;
185b1163
L
10189 riprel = op_riprel[i];
10190 op_riprel[i] = op_riprel [MAX_OPERANDS - 1 - i];
10191 op_riprel[MAX_OPERANDS - 1 - i] = riprel;
ce518a5f 10192 }
252b5132
RH
10193 }
10194 else
10195 {
ce518a5f 10196 for (i = 0; i < MAX_OPERANDS; ++i)
6c067bbb 10197 op_txt[MAX_OPERANDS - 1 - i] = op_out[i];
050dfa73
MM
10198 }
10199
ce518a5f
L
10200 needcomma = 0;
10201 for (i = 0; i < MAX_OPERANDS; ++i)
10202 if (*op_txt[i])
10203 {
10204 if (needcomma)
10205 (*info->fprintf_func) (info->stream, ",");
10206 if (op_index[i] != -1 && !op_riprel[i])
1d67fe3b
TT
10207 {
10208 bfd_vma target = (bfd_vma) op_address[op_index[i]];
10209
10210 if (the_info && op_is_jump)
10211 {
10212 the_info->insn_info_valid = 1;
10213 the_info->branch_delay_insns = 0;
10214 the_info->data_size = 0;
10215 the_info->target = target;
10216 the_info->target2 = 0;
10217 }
10218 (*info->print_address_func) (target, info);
10219 }
ce518a5f
L
10220 else
10221 (*info->fprintf_func) (info->stream, "%s", op_txt[i]);
10222 needcomma = 1;
10223 }
050dfa73 10224
ce518a5f 10225 for (i = 0; i < MAX_OPERANDS; i++)
52b15da3
JH
10226 if (op_index[i] != -1 && op_riprel[i])
10227 {
10228 (*info->fprintf_func) (info->stream, " # ");
4fd7268a 10229 (*info->print_address_func) ((bfd_vma) (start_pc + (codep - start_codep)
52b15da3 10230 + op_address[op_index[i]]), info);
185b1163 10231 break;
52b15da3 10232 }
e396998b 10233 return codep - priv.the_buffer;
252b5132
RH
10234}
10235
6439fc28 10236static const char *float_mem[] = {
252b5132 10237 /* d8 */
7c52e0e8
L
10238 "fadd{s|}",
10239 "fmul{s|}",
10240 "fcom{s|}",
10241 "fcomp{s|}",
10242 "fsub{s|}",
10243 "fsubr{s|}",
10244 "fdiv{s|}",
10245 "fdivr{s|}",
db6eb5be 10246 /* d9 */
7c52e0e8 10247 "fld{s|}",
252b5132 10248 "(bad)",
7c52e0e8
L
10249 "fst{s|}",
10250 "fstp{s|}",
d1c36125 10251 "fldenv{C|C}",
252b5132 10252 "fldcw",
d1c36125 10253 "fNstenv{C|C}",
252b5132
RH
10254 "fNstcw",
10255 /* da */
7c52e0e8
L
10256 "fiadd{l|}",
10257 "fimul{l|}",
10258 "ficom{l|}",
10259 "ficomp{l|}",
10260 "fisub{l|}",
10261 "fisubr{l|}",
10262 "fidiv{l|}",
10263 "fidivr{l|}",
252b5132 10264 /* db */
7c52e0e8
L
10265 "fild{l|}",
10266 "fisttp{l|}",
10267 "fist{l|}",
10268 "fistp{l|}",
252b5132 10269 "(bad)",
464dc4af 10270 "fld{t|}",
252b5132 10271 "(bad)",
464dc4af 10272 "fstp{t|}",
252b5132 10273 /* dc */
7c52e0e8
L
10274 "fadd{l|}",
10275 "fmul{l|}",
10276 "fcom{l|}",
10277 "fcomp{l|}",
10278 "fsub{l|}",
10279 "fsubr{l|}",
10280 "fdiv{l|}",
10281 "fdivr{l|}",
252b5132 10282 /* dd */
7c52e0e8
L
10283 "fld{l|}",
10284 "fisttp{ll|}",
10285 "fst{l||}",
10286 "fstp{l|}",
d1c36125 10287 "frstor{C|C}",
252b5132 10288 "(bad)",
d1c36125 10289 "fNsave{C|C}",
252b5132
RH
10290 "fNstsw",
10291 /* de */
ac465521
JB
10292 "fiadd{s|}",
10293 "fimul{s|}",
10294 "ficom{s|}",
10295 "ficomp{s|}",
10296 "fisub{s|}",
10297 "fisubr{s|}",
10298 "fidiv{s|}",
10299 "fidivr{s|}",
252b5132 10300 /* df */
ac465521
JB
10301 "fild{s|}",
10302 "fisttp{s|}",
10303 "fist{s|}",
10304 "fistp{s|}",
252b5132 10305 "fbld",
7c52e0e8 10306 "fild{ll|}",
252b5132 10307 "fbstp",
7c52e0e8 10308 "fistp{ll|}",
1d9f512f
AM
10309};
10310
10311static const unsigned char float_mem_mode[] = {
10312 /* d8 */
10313 d_mode,
10314 d_mode,
10315 d_mode,
10316 d_mode,
10317 d_mode,
10318 d_mode,
10319 d_mode,
10320 d_mode,
10321 /* d9 */
10322 d_mode,
10323 0,
10324 d_mode,
10325 d_mode,
10326 0,
10327 w_mode,
10328 0,
10329 w_mode,
10330 /* da */
10331 d_mode,
10332 d_mode,
10333 d_mode,
10334 d_mode,
10335 d_mode,
10336 d_mode,
10337 d_mode,
10338 d_mode,
10339 /* db */
10340 d_mode,
10341 d_mode,
10342 d_mode,
10343 d_mode,
10344 0,
9306ca4a 10345 t_mode,
1d9f512f 10346 0,
9306ca4a 10347 t_mode,
1d9f512f
AM
10348 /* dc */
10349 q_mode,
10350 q_mode,
10351 q_mode,
10352 q_mode,
10353 q_mode,
10354 q_mode,
10355 q_mode,
10356 q_mode,
10357 /* dd */
10358 q_mode,
10359 q_mode,
10360 q_mode,
10361 q_mode,
10362 0,
10363 0,
10364 0,
10365 w_mode,
10366 /* de */
10367 w_mode,
10368 w_mode,
10369 w_mode,
10370 w_mode,
10371 w_mode,
10372 w_mode,
10373 w_mode,
10374 w_mode,
10375 /* df */
10376 w_mode,
10377 w_mode,
10378 w_mode,
10379 w_mode,
9306ca4a 10380 t_mode,
1d9f512f 10381 q_mode,
9306ca4a 10382 t_mode,
1d9f512f 10383 q_mode
252b5132
RH
10384};
10385
ce518a5f
L
10386#define ST { OP_ST, 0 }
10387#define STi { OP_STi, 0 }
252b5132 10388
48c97fa1
L
10389#define FGRPd9_2 NULL, { { NULL, 1 } }, 0
10390#define FGRPd9_4 NULL, { { NULL, 2 } }, 0
10391#define FGRPd9_5 NULL, { { NULL, 3 } }, 0
10392#define FGRPd9_6 NULL, { { NULL, 4 } }, 0
10393#define FGRPd9_7 NULL, { { NULL, 5 } }, 0
10394#define FGRPda_5 NULL, { { NULL, 6 } }, 0
10395#define FGRPdb_4 NULL, { { NULL, 7 } }, 0
10396#define FGRPde_3 NULL, { { NULL, 8 } }, 0
10397#define FGRPdf_4 NULL, { { NULL, 9 } }, 0
252b5132 10398
2da11e11 10399static const struct dis386 float_reg[][8] = {
252b5132
RH
10400 /* d8 */
10401 {
bf890a93
IT
10402 { "fadd", { ST, STi }, 0 },
10403 { "fmul", { ST, STi }, 0 },
10404 { "fcom", { STi }, 0 },
10405 { "fcomp", { STi }, 0 },
10406 { "fsub", { ST, STi }, 0 },
10407 { "fsubr", { ST, STi }, 0 },
10408 { "fdiv", { ST, STi }, 0 },
10409 { "fdivr", { ST, STi }, 0 },
252b5132
RH
10410 },
10411 /* d9 */
10412 {
bf890a93
IT
10413 { "fld", { STi }, 0 },
10414 { "fxch", { STi }, 0 },
252b5132 10415 { FGRPd9_2 },
592d1631 10416 { Bad_Opcode },
252b5132
RH
10417 { FGRPd9_4 },
10418 { FGRPd9_5 },
10419 { FGRPd9_6 },
10420 { FGRPd9_7 },
10421 },
10422 /* da */
10423 {
bf890a93
IT
10424 { "fcmovb", { ST, STi }, 0 },
10425 { "fcmove", { ST, STi }, 0 },
10426 { "fcmovbe",{ ST, STi }, 0 },
10427 { "fcmovu", { ST, STi }, 0 },
592d1631 10428 { Bad_Opcode },
252b5132 10429 { FGRPda_5 },
592d1631
L
10430 { Bad_Opcode },
10431 { Bad_Opcode },
252b5132
RH
10432 },
10433 /* db */
10434 {
bf890a93
IT
10435 { "fcmovnb",{ ST, STi }, 0 },
10436 { "fcmovne",{ ST, STi }, 0 },
10437 { "fcmovnbe",{ ST, STi }, 0 },
10438 { "fcmovnu",{ ST, STi }, 0 },
252b5132 10439 { FGRPdb_4 },
bf890a93
IT
10440 { "fucomi", { ST, STi }, 0 },
10441 { "fcomi", { ST, STi }, 0 },
592d1631 10442 { Bad_Opcode },
252b5132
RH
10443 },
10444 /* dc */
10445 {
bf890a93
IT
10446 { "fadd", { STi, ST }, 0 },
10447 { "fmul", { STi, ST }, 0 },
592d1631
L
10448 { Bad_Opcode },
10449 { Bad_Opcode },
d53e6b98
JB
10450 { "fsub{!M|r}", { STi, ST }, 0 },
10451 { "fsub{M|}", { STi, ST }, 0 },
10452 { "fdiv{!M|r}", { STi, ST }, 0 },
10453 { "fdiv{M|}", { STi, ST }, 0 },
252b5132
RH
10454 },
10455 /* dd */
10456 {
bf890a93 10457 { "ffree", { STi }, 0 },
592d1631 10458 { Bad_Opcode },
bf890a93
IT
10459 { "fst", { STi }, 0 },
10460 { "fstp", { STi }, 0 },
10461 { "fucom", { STi }, 0 },
10462 { "fucomp", { STi }, 0 },
592d1631
L
10463 { Bad_Opcode },
10464 { Bad_Opcode },
252b5132
RH
10465 },
10466 /* de */
10467 {
bf890a93
IT
10468 { "faddp", { STi, ST }, 0 },
10469 { "fmulp", { STi, ST }, 0 },
592d1631 10470 { Bad_Opcode },
252b5132 10471 { FGRPde_3 },
d53e6b98
JB
10472 { "fsub{!M|r}p", { STi, ST }, 0 },
10473 { "fsub{M|}p", { STi, ST }, 0 },
10474 { "fdiv{!M|r}p", { STi, ST }, 0 },
10475 { "fdiv{M|}p", { STi, ST }, 0 },
252b5132
RH
10476 },
10477 /* df */
10478 {
bf890a93 10479 { "ffreep", { STi }, 0 },
592d1631
L
10480 { Bad_Opcode },
10481 { Bad_Opcode },
10482 { Bad_Opcode },
252b5132 10483 { FGRPdf_4 },
bf890a93
IT
10484 { "fucomip", { ST, STi }, 0 },
10485 { "fcomip", { ST, STi }, 0 },
592d1631 10486 { Bad_Opcode },
252b5132
RH
10487 },
10488};
10489
252b5132 10490static char *fgrps[][8] = {
48c97fa1
L
10491 /* Bad opcode 0 */
10492 {
10493 "(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10494 },
10495
10496 /* d9_2 1 */
252b5132
RH
10497 {
10498 "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10499 },
10500
48c97fa1 10501 /* d9_4 2 */
252b5132
RH
10502 {
10503 "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
10504 },
10505
48c97fa1 10506 /* d9_5 3 */
252b5132
RH
10507 {
10508 "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
10509 },
10510
48c97fa1 10511 /* d9_6 4 */
252b5132
RH
10512 {
10513 "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
10514 },
10515
48c97fa1 10516 /* d9_7 5 */
252b5132
RH
10517 {
10518 "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
10519 },
10520
48c97fa1 10521 /* da_5 6 */
252b5132
RH
10522 {
10523 "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10524 },
10525
48c97fa1 10526 /* db_4 7 */
252b5132 10527 {
309d3373
JB
10528 "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
10529 "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
252b5132
RH
10530 },
10531
48c97fa1 10532 /* de_3 8 */
252b5132
RH
10533 {
10534 "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10535 },
10536
48c97fa1 10537 /* df_4 9 */
252b5132
RH
10538 {
10539 "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10540 },
10541};
10542
b6169b20
L
10543static void
10544swap_operand (void)
10545{
10546 mnemonicendp[0] = '.';
10547 mnemonicendp[1] = 's';
10548 mnemonicendp += 2;
10549}
10550
b844680a
L
10551static void
10552OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED,
10553 int sizeflag ATTRIBUTE_UNUSED)
10554{
10555 /* Skip mod/rm byte. */
10556 MODRM_CHECK;
10557 codep++;
10558}
10559
252b5132 10560static void
26ca5450 10561dofloat (int sizeflag)
252b5132 10562{
2da11e11 10563 const struct dis386 *dp;
252b5132
RH
10564 unsigned char floatop;
10565
10566 floatop = codep[-1];
10567
7967e09e 10568 if (modrm.mod != 3)
252b5132 10569 {
7967e09e 10570 int fp_indx = (floatop - 0xd8) * 8 + modrm.reg;
1d9f512f
AM
10571
10572 putop (float_mem[fp_indx], sizeflag);
ce518a5f 10573 obufp = op_out[0];
6e50d963 10574 op_ad = 2;
1d9f512f 10575 OP_E (float_mem_mode[fp_indx], sizeflag);
252b5132
RH
10576 return;
10577 }
6608db57 10578 /* Skip mod/rm byte. */
4bba6815 10579 MODRM_CHECK;
252b5132
RH
10580 codep++;
10581
7967e09e 10582 dp = &float_reg[floatop - 0xd8][modrm.reg];
252b5132
RH
10583 if (dp->name == NULL)
10584 {
7967e09e 10585 putop (fgrps[dp->op[0].bytemode][modrm.rm], sizeflag);
252b5132 10586
6608db57 10587 /* Instruction fnstsw is only one with strange arg. */
252b5132 10588 if (floatop == 0xdf && codep[-1] == 0xe0)
ce518a5f 10589 strcpy (op_out[0], names16[0]);
252b5132
RH
10590 }
10591 else
10592 {
10593 putop (dp->name, sizeflag);
10594
ce518a5f 10595 obufp = op_out[0];
6e50d963 10596 op_ad = 2;
ce518a5f
L
10597 if (dp->op[0].rtn)
10598 (*dp->op[0].rtn) (dp->op[0].bytemode, sizeflag);
6e50d963 10599
ce518a5f 10600 obufp = op_out[1];
6e50d963 10601 op_ad = 1;
ce518a5f
L
10602 if (dp->op[1].rtn)
10603 (*dp->op[1].rtn) (dp->op[1].bytemode, sizeflag);
252b5132
RH
10604 }
10605}
10606
9ce09ba2
RM
10607/* Like oappend (below), but S is a string starting with '%'.
10608 In Intel syntax, the '%' is elided. */
10609static void
10610oappend_maybe_intel (const char *s)
10611{
10612 oappend (s + intel_syntax);
10613}
10614
252b5132 10615static void
26ca5450 10616OP_ST (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 10617{
9ce09ba2 10618 oappend_maybe_intel ("%st");
252b5132
RH
10619}
10620
252b5132 10621static void
26ca5450 10622OP_STi (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 10623{
7967e09e 10624 sprintf (scratchbuf, "%%st(%d)", modrm.rm);
9ce09ba2 10625 oappend_maybe_intel (scratchbuf);
252b5132
RH
10626}
10627
6608db57 10628/* Capital letters in template are macros. */
6439fc28 10629static int
d3ce72d0 10630putop (const char *in_template, int sizeflag)
252b5132 10631{
2da11e11 10632 const char *p;
9306ca4a 10633 int alt = 0;
9d141669 10634 int cond = 1;
21a3faeb 10635 unsigned int l = 0, len = 0;
98b528ac
L
10636 char last[4];
10637
d3ce72d0 10638 for (p = in_template; *p; p++)
252b5132 10639 {
21a3faeb
JB
10640 if (len > l)
10641 {
10642 if (l >= sizeof (last) || !ISUPPER (*p))
10643 abort ();
10644 last[l++] = *p;
10645 continue;
10646 }
252b5132
RH
10647 switch (*p)
10648 {
10649 default:
10650 *obufp++ = *p;
10651 break;
98b528ac
L
10652 case '%':
10653 len++;
10654 break;
9d141669
L
10655 case '!':
10656 cond = 0;
10657 break;
6439fc28 10658 case '{':
6439fc28 10659 if (intel_syntax)
6439fc28
AM
10660 {
10661 while (*++p != '|')
7c52e0e8
L
10662 if (*p == '}' || *p == '\0')
10663 abort ();
d1c36125 10664 alt = 1;
6439fc28 10665 }
d1c36125 10666 break;
6439fc28
AM
10667 case '|':
10668 while (*++p != '}')
10669 {
10670 if (*p == '\0')
10671 abort ();
10672 }
10673 break;
10674 case '}':
d1c36125 10675 alt = 0;
6439fc28 10676 break;
252b5132 10677 case 'A':
db6eb5be
AM
10678 if (intel_syntax)
10679 break;
0e9f3bf1
L
10680 if ((need_modrm && modrm.mod != 3)
10681 || (sizeflag & SUFFIX_ALWAYS))
252b5132
RH
10682 *obufp++ = 'b';
10683 break;
10684 case 'B':
21a3faeb 10685 if (l == 0)
4b06377f 10686 {
dc1e8a47 10687 case_B:
4b06377f
L
10688 if (intel_syntax)
10689 break;
10690 if (sizeflag & SUFFIX_ALWAYS)
10691 *obufp++ = 'b';
10692 }
21a3faeb 10693 else if (l == 1 && last[0] == 'L')
4b06377f 10694 {
4b06377f
L
10695 if (address_mode == mode_64bit
10696 && !(prefixes & PREFIX_ADDR))
10697 {
10698 *obufp++ = 'a';
10699 *obufp++ = 'b';
10700 *obufp++ = 's';
10701 }
10702
10703 goto case_B;
10704 }
21a3faeb
JB
10705 else
10706 abort ();
252b5132 10707 break;
9306ca4a
JB
10708 case 'C':
10709 if (intel_syntax && !alt)
10710 break;
10711 if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
10712 {
10713 if (sizeflag & DFLAG)
10714 *obufp++ = intel_syntax ? 'd' : 'l';
10715 else
10716 *obufp++ = intel_syntax ? 'w' : 's';
10717 used_prefixes |= (prefixes & PREFIX_DATA);
10718 }
10719 break;
ed7841b3
JB
10720 case 'D':
10721 if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
10722 break;
161a04f6 10723 USED_REX (REX_W);
7967e09e 10724 if (modrm.mod == 3)
ed7841b3 10725 {
161a04f6 10726 if (rex & REX_W)
ed7841b3 10727 *obufp++ = 'q';
ed7841b3 10728 else
f16cd0d5
L
10729 {
10730 if (sizeflag & DFLAG)
10731 *obufp++ = intel_syntax ? 'd' : 'l';
10732 else
10733 *obufp++ = 'w';
10734 used_prefixes |= (prefixes & PREFIX_DATA);
10735 }
ed7841b3
JB
10736 }
10737 else
10738 *obufp++ = 'w';
10739 break;
252b5132 10740 case 'E': /* For jcxz/jecxz */
cb712a9e 10741 if (address_mode == mode_64bit)
c1a64871
JH
10742 {
10743 if (sizeflag & AFLAG)
10744 *obufp++ = 'r';
10745 else
10746 *obufp++ = 'e';
10747 }
10748 else
10749 if (sizeflag & AFLAG)
10750 *obufp++ = 'e';
3ffd33cf
AM
10751 used_prefixes |= (prefixes & PREFIX_ADDR);
10752 break;
10753 case 'F':
db6eb5be
AM
10754 if (intel_syntax)
10755 break;
e396998b 10756 if ((prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
3ffd33cf
AM
10757 {
10758 if (sizeflag & AFLAG)
cb712a9e 10759 *obufp++ = address_mode == mode_64bit ? 'q' : 'l';
3ffd33cf 10760 else
cb712a9e 10761 *obufp++ = address_mode == mode_64bit ? 'l' : 'w';
3ffd33cf
AM
10762 used_prefixes |= (prefixes & PREFIX_ADDR);
10763 }
252b5132 10764 break;
52fd6d94
JB
10765 case 'G':
10766 if (intel_syntax || (obufp[-1] != 's' && !(sizeflag & SUFFIX_ALWAYS)))
10767 break;
161a04f6 10768 if ((rex & REX_W) || (sizeflag & DFLAG))
52fd6d94
JB
10769 *obufp++ = 'l';
10770 else
10771 *obufp++ = 'w';
161a04f6 10772 if (!(rex & REX_W))
52fd6d94
JB
10773 used_prefixes |= (prefixes & PREFIX_DATA);
10774 break;
5dd0794d 10775 case 'H':
db6eb5be
AM
10776 if (intel_syntax)
10777 break;
5dd0794d
AM
10778 if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
10779 || (prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
10780 {
10781 used_prefixes |= prefixes & (PREFIX_CS | PREFIX_DS);
10782 *obufp++ = ',';
10783 *obufp++ = 'p';
632ee6fd
BP
10784
10785 /* Set active_seg_prefix even if not set in 64-bit mode
10786 because here it is a valid branch hint. */
5dd0794d 10787 if (prefixes & PREFIX_DS)
632ee6fd
BP
10788 {
10789 active_seg_prefix = PREFIX_DS;
10790 *obufp++ = 't';
10791 }
5dd0794d 10792 else
632ee6fd
BP
10793 {
10794 active_seg_prefix = PREFIX_CS;
10795 *obufp++ = 'n';
10796 }
5dd0794d
AM
10797 }
10798 break;
42903f7f
L
10799 case 'K':
10800 USED_REX (REX_W);
10801 if (rex & REX_W)
10802 *obufp++ = 'q';
10803 else
10804 *obufp++ = 'd';
10805 break;
252b5132 10806 case 'L':
78467458 10807 abort ();
9d141669
L
10808 case 'M':
10809 if (intel_mnemonic != cond)
10810 *obufp++ = 'r';
10811 break;
252b5132
RH
10812 case 'N':
10813 if ((prefixes & PREFIX_FWAIT) == 0)
10814 *obufp++ = 'n';
7d421014
ILT
10815 else
10816 used_prefixes |= PREFIX_FWAIT;
252b5132 10817 break;
52b15da3 10818 case 'O':
161a04f6
L
10819 USED_REX (REX_W);
10820 if (rex & REX_W)
6439fc28 10821 *obufp++ = 'o';
a35ca55a
JB
10822 else if (intel_syntax && (sizeflag & DFLAG))
10823 *obufp++ = 'q';
52b15da3
JH
10824 else
10825 *obufp++ = 'd';
161a04f6 10826 if (!(rex & REX_W))
a35ca55a 10827 used_prefixes |= (prefixes & PREFIX_DATA);
52b15da3 10828 break;
36938cab
JB
10829 case '@':
10830 if (address_mode == mode_64bit
10831 && (isa64 == intel64 || (rex & REX_W)
10832 || !(prefixes & PREFIX_DATA)))
6439fc28 10833 {
36938cab
JB
10834 if (sizeflag & SUFFIX_ALWAYS)
10835 *obufp++ = 'q';
6439fc28
AM
10836 break;
10837 }
6608db57 10838 /* Fall through. */
252b5132 10839 case 'P':
21a3faeb 10840 if (l == 0)
d9e3625e 10841 {
0e9f3bf1 10842 if ((modrm.mod == 3 || !cond)
c3f5525f 10843 && !(sizeflag & SUFFIX_ALWAYS))
36938cab
JB
10844 break;
10845 /* Fall through. */
10846 case 'T':
10847 if ((!(rex & REX_W) && (prefixes & PREFIX_DATA))
10848 || ((sizeflag & SUFFIX_ALWAYS)
10849 && address_mode != mode_64bit))
4b4c407a 10850 {
36938cab
JB
10851 *obufp++ = (sizeflag & DFLAG) ?
10852 intel_syntax ? 'd' : 'l' : 'w';
10853 used_prefixes |= (prefixes & PREFIX_DATA);
d9e3625e 10854 }
36938cab
JB
10855 else if (sizeflag & SUFFIX_ALWAYS)
10856 *obufp++ = 'q';
d9e3625e 10857 }
21a3faeb 10858 else if (l == 1 && last[0] == 'L')
252b5132 10859 {
4b4c407a
L
10860 if ((prefixes & PREFIX_DATA)
10861 || (rex & REX_W)
10862 || (sizeflag & SUFFIX_ALWAYS))
52b15da3 10863 {
4b4c407a
L
10864 USED_REX (REX_W);
10865 if (rex & REX_W)
10866 *obufp++ = 'q';
10867 else
10868 {
10869 if (sizeflag & DFLAG)
10870 *obufp++ = intel_syntax ? 'd' : 'l';
10871 else
10872 *obufp++ = 'w';
10873 used_prefixes |= (prefixes & PREFIX_DATA);
10874 }
52b15da3 10875 }
252b5132 10876 }
21a3faeb
JB
10877 else
10878 abort ();
252b5132
RH
10879 break;
10880 case 'Q':
21a3faeb 10881 if (l == 0)
252b5132 10882 {
98b528ac
L
10883 if (intel_syntax && !alt)
10884 break;
10885 USED_REX (REX_W);
0e9f3bf1
L
10886 if ((need_modrm && modrm.mod != 3)
10887 || (sizeflag & SUFFIX_ALWAYS))
52b15da3 10888 {
98b528ac
L
10889 if (rex & REX_W)
10890 *obufp++ = 'q';
52b15da3 10891 else
98b528ac
L
10892 {
10893 if (sizeflag & DFLAG)
10894 *obufp++ = intel_syntax ? 'd' : 'l';
10895 else
10896 *obufp++ = 'w';
f16cd0d5 10897 used_prefixes |= (prefixes & PREFIX_DATA);
98b528ac 10898 }
52b15da3 10899 }
98b528ac 10900 }
492a76aa
JB
10901 else if (l == 1 && last[0] == 'D')
10902 *obufp++ = vex.w ? 'q' : 'd';
21a3faeb 10903 else if (l == 1 && last[0] == 'L')
98b528ac 10904 {
b24d668c
JB
10905 if (cond ? modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)
10906 : address_mode != mode_64bit)
98b528ac
L
10907 break;
10908 if ((rex & REX_W))
10909 {
10910 USED_REX (REX_W);
10911 *obufp++ = 'q';
10912 }
5b316d90 10913 else if((address_mode == mode_64bit && cond)
589958d6
JB
10914 || (sizeflag & SUFFIX_ALWAYS))
10915 *obufp++ = intel_syntax? 'd' : 'l';
252b5132 10916 }
21a3faeb
JB
10917 else
10918 abort ();
252b5132
RH
10919 break;
10920 case 'R':
161a04f6
L
10921 USED_REX (REX_W);
10922 if (rex & REX_W)
a35ca55a
JB
10923 *obufp++ = 'q';
10924 else if (sizeflag & DFLAG)
c608c12e 10925 {
a35ca55a 10926 if (intel_syntax)
c608c12e 10927 *obufp++ = 'd';
c608c12e 10928 else
a35ca55a 10929 *obufp++ = 'l';
c608c12e 10930 }
252b5132 10931 else
a35ca55a
JB
10932 *obufp++ = 'w';
10933 if (intel_syntax && !p[1]
161a04f6 10934 && ((rex & REX_W) || (sizeflag & DFLAG)))
a35ca55a 10935 *obufp++ = 'e';
161a04f6 10936 if (!(rex & REX_W))
52b15da3 10937 used_prefixes |= (prefixes & PREFIX_DATA);
252b5132
RH
10938 break;
10939 case 'S':
21a3faeb 10940 if (l == 0)
252b5132 10941 {
dc1e8a47 10942 case_S:
4b06377f
L
10943 if (intel_syntax)
10944 break;
10945 if (sizeflag & SUFFIX_ALWAYS)
52b15da3 10946 {
4b06377f
L
10947 if (rex & REX_W)
10948 *obufp++ = 'q';
52b15da3 10949 else
4b06377f
L
10950 {
10951 if (sizeflag & DFLAG)
10952 *obufp++ = 'l';
10953 else
10954 *obufp++ = 'w';
10955 used_prefixes |= (prefixes & PREFIX_DATA);
10956 }
10957 }
10958 }
21a3faeb 10959 else if (l == 1 && last[0] == 'L')
4b06377f 10960 {
4b06377f
L
10961 if (address_mode == mode_64bit
10962 && !(prefixes & PREFIX_ADDR))
10963 {
10964 *obufp++ = 'a';
10965 *obufp++ = 'b';
10966 *obufp++ = 's';
10967 }
10968
10969 goto case_S;
252b5132 10970 }
21a3faeb
JB
10971 else
10972 abort ();
252b5132 10973 break;
f0e8d0ba
JB
10974 case 'V':
10975 if (l == 0)
10976 abort ();
58bf9b6a
L
10977 else if (l == 1
10978 && (last[0] == 'L' || last[0] == 'X'))
f0e8d0ba 10979 {
58bf9b6a
L
10980 if (last[0] == 'X')
10981 {
10982 *obufp++ = '{';
10983 *obufp++ = 'v';
10984 *obufp++ = 'e';
10985 *obufp++ = 'x';
58bf9b6a
L
10986 *obufp++ = '}';
10987 }
10988 else if (rex & REX_W)
f0e8d0ba
JB
10989 {
10990 *obufp++ = 'a';
10991 *obufp++ = 'b';
10992 *obufp++ = 's';
10993 }
10994 }
10995 else
10996 abort ();
10997 goto case_S;
10998 case 'W':
10999 if (l == 0)
11000 {
11001 /* operand size flag for cwtl, cbtw */
11002 USED_REX (REX_W);
11003 if (rex & REX_W)
11004 {
11005 if (intel_syntax)
11006 *obufp++ = 'd';
11007 else
11008 *obufp++ = 'l';
11009 }
11010 else if (sizeflag & DFLAG)
11011 *obufp++ = 'w';
11012 else
11013 *obufp++ = 'b';
11014 if (!(rex & REX_W))
11015 used_prefixes |= (prefixes & PREFIX_DATA);
11016 }
11017 else if (l == 1)
11018 {
11019 if (!need_vex)
11020 abort ();
11021 if (last[0] == 'X')
11022 *obufp++ = vex.w ? 'd': 's';
11023 else if (last[0] == 'B')
11024 *obufp++ = vex.w ? 'w': 'b';
11025 else
11026 abort ();
11027 }
11028 else
11029 abort ();
11030 break;
041bd2e0 11031 case 'X':
21a3faeb
JB
11032 if (l != 0)
11033 abort ();
bf926894
JB
11034 if (need_vex
11035 ? vex.prefix == DATA_PREFIX_OPCODE
11036 : prefixes & PREFIX_DATA)
c0f3af97 11037 {
bf926894
JB
11038 *obufp++ = 'd';
11039 used_prefixes |= PREFIX_DATA;
c0f3af97 11040 }
041bd2e0 11041 else
bf926894 11042 *obufp++ = 's';
041bd2e0 11043 break;
76f227a5 11044 case 'Y':
21a3faeb 11045 if (l == 1 && last[0] == 'X')
c0f3af97 11046 {
c0f3af97
L
11047 if (!need_vex)
11048 abort ();
11049 if (intel_syntax
04d824a4 11050 || ((modrm.mod == 3 || vex.b) && !(sizeflag & SUFFIX_ALWAYS)))
c0f3af97
L
11051 break;
11052 switch (vex.length)
11053 {
11054 case 128:
11055 *obufp++ = 'x';
11056 break;
11057 case 256:
11058 *obufp++ = 'y';
11059 break;
04d824a4
JB
11060 case 512:
11061 if (!vex.evex)
c0f3af97 11062 default:
04d824a4 11063 abort ();
c0f3af97 11064 }
76f227a5 11065 }
21a3faeb
JB
11066 else
11067 abort ();
76f227a5 11068 break;
78467458
JB
11069 case 'Z':
11070 if (l == 0)
11071 {
11072 /* These insns ignore ModR/M.mod: Force it to 3 for OP_E(). */
11073 modrm.mod = 3;
11074 if (!intel_syntax && (sizeflag & SUFFIX_ALWAYS))
11075 *obufp++ = address_mode == mode_64bit ? 'q' : 'l';
11076 }
11077 else if (l == 1 && last[0] == 'X')
11078 {
11079 if (!need_vex || !vex.evex)
11080 abort ();
11081 if (intel_syntax
11082 || ((modrm.mod == 3 || vex.b) && !(sizeflag & SUFFIX_ALWAYS)))
11083 break;
11084 switch (vex.length)
11085 {
11086 case 128:
11087 *obufp++ = 'x';
11088 break;
11089 case 256:
11090 *obufp++ = 'y';
11091 break;
11092 case 512:
11093 *obufp++ = 'z';
11094 break;
11095 default:
11096 abort ();
11097 }
11098 }
11099 else
11100 abort ();
11101 break;
a72d2af2
L
11102 case '^':
11103 if (intel_syntax)
11104 break;
5990e377
JB
11105 if (isa64 == intel64 && (rex & REX_W))
11106 {
11107 USED_REX (REX_W);
11108 *obufp++ = 'q';
11109 break;
11110 }
a72d2af2
L
11111 if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
11112 {
11113 if (sizeflag & DFLAG)
11114 *obufp++ = 'l';
11115 else
11116 *obufp++ = 'w';
11117 used_prefixes |= (prefixes & PREFIX_DATA);
11118 }
11119 break;
252b5132 11120 }
21a3faeb
JB
11121
11122 if (len == l)
11123 len = l = 0;
252b5132
RH
11124 }
11125 *obufp = 0;
ea397f5b 11126 mnemonicendp = obufp;
6439fc28 11127 return 0;
252b5132
RH
11128}
11129
11130static void
26ca5450 11131oappend (const char *s)
252b5132 11132{
ea397f5b 11133 obufp = stpcpy (obufp, s);
252b5132
RH
11134}
11135
11136static void
26ca5450 11137append_seg (void)
252b5132 11138{
285ca992
L
11139 /* Only print the active segment register. */
11140 if (!active_seg_prefix)
11141 return;
11142
11143 used_prefixes |= active_seg_prefix;
11144 switch (active_seg_prefix)
7d421014 11145 {
285ca992 11146 case PREFIX_CS:
9ce09ba2 11147 oappend_maybe_intel ("%cs:");
285ca992
L
11148 break;
11149 case PREFIX_DS:
9ce09ba2 11150 oappend_maybe_intel ("%ds:");
285ca992
L
11151 break;
11152 case PREFIX_SS:
9ce09ba2 11153 oappend_maybe_intel ("%ss:");
285ca992
L
11154 break;
11155 case PREFIX_ES:
9ce09ba2 11156 oappend_maybe_intel ("%es:");
285ca992
L
11157 break;
11158 case PREFIX_FS:
9ce09ba2 11159 oappend_maybe_intel ("%fs:");
285ca992
L
11160 break;
11161 case PREFIX_GS:
9ce09ba2 11162 oappend_maybe_intel ("%gs:");
285ca992
L
11163 break;
11164 default:
11165 break;
7d421014 11166 }
252b5132
RH
11167}
11168
11169static void
26ca5450 11170OP_indirE (int bytemode, int sizeflag)
252b5132
RH
11171{
11172 if (!intel_syntax)
11173 oappend ("*");
11174 OP_E (bytemode, sizeflag);
11175}
11176
52b15da3 11177static void
26ca5450 11178print_operand_value (char *buf, int hex, bfd_vma disp)
52b15da3 11179{
cb712a9e 11180 if (address_mode == mode_64bit)
52b15da3
JH
11181 {
11182 if (hex)
11183 {
11184 char tmp[30];
11185 int i;
11186 buf[0] = '0';
11187 buf[1] = 'x';
11188 sprintf_vma (tmp, disp);
6608db57 11189 for (i = 0; tmp[i] == '0' && tmp[i + 1]; i++);
52b15da3
JH
11190 strcpy (buf + 2, tmp + i);
11191 }
11192 else
11193 {
11194 bfd_signed_vma v = disp;
11195 char tmp[30];
11196 int i;
11197 if (v < 0)
11198 {
11199 *(buf++) = '-';
11200 v = -disp;
6608db57 11201 /* Check for possible overflow on 0x8000000000000000. */
52b15da3
JH
11202 if (v < 0)
11203 {
11204 strcpy (buf, "9223372036854775808");
11205 return;
11206 }
11207 }
11208 if (!v)
11209 {
11210 strcpy (buf, "0");
11211 return;
11212 }
11213
11214 i = 0;
11215 tmp[29] = 0;
11216 while (v)
11217 {
6608db57 11218 tmp[28 - i] = (v % 10) + '0';
52b15da3
JH
11219 v /= 10;
11220 i++;
11221 }
11222 strcpy (buf, tmp + 29 - i);
11223 }
11224 }
11225 else
11226 {
11227 if (hex)
11228 sprintf (buf, "0x%x", (unsigned int) disp);
11229 else
11230 sprintf (buf, "%d", (int) disp);
11231 }
11232}
11233
5d669648
L
11234/* Put DISP in BUF as signed hex number. */
11235
11236static void
11237print_displacement (char *buf, bfd_vma disp)
11238{
11239 bfd_signed_vma val = disp;
11240 char tmp[30];
11241 int i, j = 0;
11242
11243 if (val < 0)
11244 {
11245 buf[j++] = '-';
11246 val = -disp;
11247
11248 /* Check for possible overflow. */
11249 if (val < 0)
11250 {
11251 switch (address_mode)
11252 {
11253 case mode_64bit:
11254 strcpy (buf + j, "0x8000000000000000");
11255 break;
11256 case mode_32bit:
11257 strcpy (buf + j, "0x80000000");
11258 break;
11259 case mode_16bit:
11260 strcpy (buf + j, "0x8000");
11261 break;
11262 }
11263 return;
11264 }
11265 }
11266
11267 buf[j++] = '0';
11268 buf[j++] = 'x';
11269
0af1713e 11270 sprintf_vma (tmp, (bfd_vma) val);
5d669648
L
11271 for (i = 0; tmp[i] == '0'; i++)
11272 continue;
11273 if (tmp[i] == '\0')
11274 i--;
11275 strcpy (buf + j, tmp + i);
11276}
11277
3f31e633
JB
11278static void
11279intel_operand_size (int bytemode, int sizeflag)
11280{
43234a1e
L
11281 if (vex.evex
11282 && vex.b
11283 && (bytemode == x_mode
11284 || bytemode == evex_half_bcst_xmmq_mode))
11285 {
11286 if (vex.w)
11287 oappend ("QWORD PTR ");
11288 else
11289 oappend ("DWORD PTR ");
11290 return;
11291 }
3f31e633
JB
11292 switch (bytemode)
11293 {
11294 case b_mode:
b6169b20 11295 case b_swap_mode:
42903f7f 11296 case dqb_mode:
1ba585e8 11297 case db_mode:
3f31e633
JB
11298 oappend ("BYTE PTR ");
11299 break;
11300 case w_mode:
1ba585e8 11301 case dw_mode:
3f31e633
JB
11302 case dqw_mode:
11303 oappend ("WORD PTR ");
11304 break;
07f5af7d
L
11305 case indir_v_mode:
11306 if (address_mode == mode_64bit && isa64 == intel64)
11307 {
11308 oappend ("QWORD PTR ");
11309 break;
11310 }
1a0670f3 11311 /* Fall through. */
1a114b12 11312 case stack_v_mode:
7bb15c6f 11313 if (address_mode == mode_64bit && ((sizeflag & DFLAG) || (rex & REX_W)))
3f31e633
JB
11314 {
11315 oappend ("QWORD PTR ");
3f31e633
JB
11316 break;
11317 }
1a0670f3 11318 /* Fall through. */
3f31e633 11319 case v_mode:
b6169b20 11320 case v_swap_mode:
3f31e633 11321 case dq_mode:
161a04f6
L
11322 USED_REX (REX_W);
11323 if (rex & REX_W)
3f31e633 11324 oappend ("QWORD PTR ");
035e7389
JB
11325 else if (bytemode == dq_mode)
11326 oappend ("DWORD PTR ");
3f31e633 11327 else
f16cd0d5 11328 {
035e7389 11329 if (sizeflag & DFLAG)
f16cd0d5
L
11330 oappend ("DWORD PTR ");
11331 else
11332 oappend ("WORD PTR ");
11333 used_prefixes |= (prefixes & PREFIX_DATA);
11334 }
3f31e633 11335 break;
52fd6d94 11336 case z_mode:
161a04f6 11337 if ((rex & REX_W) || (sizeflag & DFLAG))
52fd6d94
JB
11338 *obufp++ = 'D';
11339 oappend ("WORD PTR ");
161a04f6 11340 if (!(rex & REX_W))
52fd6d94
JB
11341 used_prefixes |= (prefixes & PREFIX_DATA);
11342 break;
34b772a6
JB
11343 case a_mode:
11344 if (sizeflag & DFLAG)
11345 oappend ("QWORD PTR ");
11346 else
11347 oappend ("DWORD PTR ");
11348 used_prefixes |= (prefixes & PREFIX_DATA);
11349 break;
bc31405e
L
11350 case movsxd_mode:
11351 if (!(sizeflag & DFLAG) && isa64 == intel64)
11352 oappend ("WORD PTR ");
11353 else
11354 oappend ("DWORD PTR ");
11355 used_prefixes |= (prefixes & PREFIX_DATA);
11356 break;
3f31e633 11357 case d_mode:
fa99fab2 11358 case d_swap_mode:
42903f7f 11359 case dqd_mode:
3f31e633
JB
11360 oappend ("DWORD PTR ");
11361 break;
11362 case q_mode:
b6169b20 11363 case q_swap_mode:
3f31e633
JB
11364 oappend ("QWORD PTR ");
11365 break;
11366 case m_mode:
cb712a9e 11367 if (address_mode == mode_64bit)
3f31e633
JB
11368 oappend ("QWORD PTR ");
11369 else
11370 oappend ("DWORD PTR ");
11371 break;
11372 case f_mode:
11373 if (sizeflag & DFLAG)
11374 oappend ("FWORD PTR ");
11375 else
11376 oappend ("DWORD PTR ");
11377 used_prefixes |= (prefixes & PREFIX_DATA);
11378 break;
11379 case t_mode:
11380 oappend ("TBYTE PTR ");
11381 break;
11382 case x_mode:
b6169b20 11383 case x_swap_mode:
43234a1e
L
11384 case evex_x_gscat_mode:
11385 case evex_x_nobcst_mode:
4726e9a4 11386 case bw_unit_mode:
c0f3af97
L
11387 if (need_vex)
11388 {
11389 switch (vex.length)
11390 {
11391 case 128:
11392 oappend ("XMMWORD PTR ");
11393 break;
11394 case 256:
11395 oappend ("YMMWORD PTR ");
11396 break;
43234a1e
L
11397 case 512:
11398 oappend ("ZMMWORD PTR ");
11399 break;
c0f3af97
L
11400 default:
11401 abort ();
11402 }
11403 }
11404 else
11405 oappend ("XMMWORD PTR ");
11406 break;
11407 case xmm_mode:
3f31e633
JB
11408 oappend ("XMMWORD PTR ");
11409 break;
43234a1e
L
11410 case ymm_mode:
11411 oappend ("YMMWORD PTR ");
11412 break;
c0f3af97 11413 case xmmq_mode:
43234a1e 11414 case evex_half_bcst_xmmq_mode:
c0f3af97
L
11415 if (!need_vex)
11416 abort ();
11417
11418 switch (vex.length)
11419 {
11420 case 128:
11421 oappend ("QWORD PTR ");
11422 break;
11423 case 256:
11424 oappend ("XMMWORD PTR ");
11425 break;
43234a1e
L
11426 case 512:
11427 oappend ("YMMWORD PTR ");
11428 break;
c0f3af97
L
11429 default:
11430 abort ();
11431 }
11432 break;
6c30d220
L
11433 case xmm_mb_mode:
11434 if (!need_vex)
11435 abort ();
11436
11437 switch (vex.length)
11438 {
11439 case 128:
11440 case 256:
43234a1e 11441 case 512:
6c30d220
L
11442 oappend ("BYTE PTR ");
11443 break;
11444 default:
11445 abort ();
11446 }
11447 break;
11448 case xmm_mw_mode:
11449 if (!need_vex)
11450 abort ();
11451
11452 switch (vex.length)
11453 {
11454 case 128:
11455 case 256:
43234a1e 11456 case 512:
6c30d220
L
11457 oappend ("WORD PTR ");
11458 break;
11459 default:
11460 abort ();
11461 }
11462 break;
11463 case xmm_md_mode:
11464 if (!need_vex)
11465 abort ();
11466
11467 switch (vex.length)
11468 {
11469 case 128:
11470 case 256:
43234a1e 11471 case 512:
6c30d220
L
11472 oappend ("DWORD PTR ");
11473 break;
11474 default:
11475 abort ();
11476 }
11477 break;
11478 case xmm_mq_mode:
11479 if (!need_vex)
11480 abort ();
11481
11482 switch (vex.length)
11483 {
11484 case 128:
11485 case 256:
43234a1e 11486 case 512:
6c30d220
L
11487 oappend ("QWORD PTR ");
11488 break;
11489 default:
11490 abort ();
11491 }
11492 break;
11493 case xmmdw_mode:
11494 if (!need_vex)
11495 abort ();
11496
11497 switch (vex.length)
11498 {
11499 case 128:
11500 oappend ("WORD PTR ");
11501 break;
11502 case 256:
11503 oappend ("DWORD PTR ");
11504 break;
43234a1e
L
11505 case 512:
11506 oappend ("QWORD PTR ");
11507 break;
6c30d220
L
11508 default:
11509 abort ();
11510 }
11511 break;
11512 case xmmqd_mode:
11513 if (!need_vex)
11514 abort ();
11515
11516 switch (vex.length)
11517 {
11518 case 128:
11519 oappend ("DWORD PTR ");
11520 break;
11521 case 256:
11522 oappend ("QWORD PTR ");
11523 break;
43234a1e
L
11524 case 512:
11525 oappend ("XMMWORD PTR ");
11526 break;
6c30d220
L
11527 default:
11528 abort ();
11529 }
11530 break;
c0f3af97
L
11531 case ymmq_mode:
11532 if (!need_vex)
11533 abort ();
11534
11535 switch (vex.length)
11536 {
11537 case 128:
11538 oappend ("QWORD PTR ");
11539 break;
11540 case 256:
11541 oappend ("YMMWORD PTR ");
11542 break;
43234a1e
L
11543 case 512:
11544 oappend ("ZMMWORD PTR ");
11545 break;
c0f3af97
L
11546 default:
11547 abort ();
11548 }
11549 break;
6c30d220
L
11550 case ymmxmm_mode:
11551 if (!need_vex)
11552 abort ();
11553
11554 switch (vex.length)
11555 {
11556 case 128:
11557 case 256:
11558 oappend ("XMMWORD PTR ");
11559 break;
11560 default:
11561 abort ();
11562 }
11563 break;
fb9c77c7
L
11564 case o_mode:
11565 oappend ("OWORD PTR ");
11566 break;
1c480963 11567 case vex_scalar_w_dq_mode:
0bfee649
L
11568 if (!need_vex)
11569 abort ();
11570
11571 if (vex.w)
11572 oappend ("QWORD PTR ");
11573 else
11574 oappend ("DWORD PTR ");
11575 break;
43234a1e
L
11576 case vex_vsib_d_w_dq_mode:
11577 case vex_vsib_q_w_dq_mode:
11578 if (!need_vex)
11579 abort ();
11580
11581 if (!vex.evex)
11582 {
11583 if (vex.w)
11584 oappend ("QWORD PTR ");
11585 else
11586 oappend ("DWORD PTR ");
11587 }
11588 else
11589 {
b28d1bda
IT
11590 switch (vex.length)
11591 {
11592 case 128:
11593 oappend ("XMMWORD PTR ");
11594 break;
11595 case 256:
11596 oappend ("YMMWORD PTR ");
11597 break;
11598 case 512:
11599 oappend ("ZMMWORD PTR ");
11600 break;
11601 default:
11602 abort ();
11603 }
43234a1e
L
11604 }
11605 break;
5fc35d96
IT
11606 case vex_vsib_q_w_d_mode:
11607 case vex_vsib_d_w_d_mode:
b28d1bda 11608 if (!need_vex || !vex.evex)
5fc35d96
IT
11609 abort ();
11610
b28d1bda
IT
11611 switch (vex.length)
11612 {
11613 case 128:
11614 oappend ("QWORD PTR ");
11615 break;
11616 case 256:
11617 oappend ("XMMWORD PTR ");
11618 break;
11619 case 512:
11620 oappend ("YMMWORD PTR ");
11621 break;
11622 default:
11623 abort ();
11624 }
5fc35d96
IT
11625
11626 break;
1ba585e8
IT
11627 case mask_bd_mode:
11628 if (!need_vex || vex.length != 128)
11629 abort ();
11630 if (vex.w)
11631 oappend ("DWORD PTR ");
11632 else
11633 oappend ("BYTE PTR ");
11634 break;
43234a1e
L
11635 case mask_mode:
11636 if (!need_vex)
11637 abort ();
1ba585e8
IT
11638 if (vex.w)
11639 oappend ("QWORD PTR ");
11640 else
11641 oappend ("WORD PTR ");
43234a1e 11642 break;
6c75cc62 11643 case v_bnd_mode:
d276ec69 11644 case v_bndmk_mode:
3f31e633
JB
11645 default:
11646 break;
11647 }
11648}
11649
252b5132 11650static void
c0f3af97 11651OP_E_register (int bytemode, int sizeflag)
252b5132 11652{
c0f3af97
L
11653 int reg = modrm.rm;
11654 const char **names;
252b5132 11655
c0f3af97
L
11656 USED_REX (REX_B);
11657 if ((rex & REX_B))
11658 reg += 8;
252b5132 11659
b6169b20 11660 if ((sizeflag & SUFFIX_ALWAYS)
1ba585e8 11661 && (bytemode == b_swap_mode
9f79e886 11662 || bytemode == bnd_swap_mode
60227d64 11663 || bytemode == v_swap_mode))
b6169b20
L
11664 swap_operand ();
11665
c0f3af97 11666 switch (bytemode)
252b5132 11667 {
c0f3af97 11668 case b_mode:
b6169b20 11669 case b_swap_mode:
e184e611
JB
11670 if (reg & 4)
11671 USED_REX (0);
c0f3af97
L
11672 if (rex)
11673 names = names8rex;
11674 else
11675 names = names8;
11676 break;
11677 case w_mode:
11678 names = names16;
11679 break;
11680 case d_mode:
1ba585e8
IT
11681 case dw_mode:
11682 case db_mode:
c0f3af97
L
11683 names = names32;
11684 break;
11685 case q_mode:
11686 names = names64;
11687 break;
11688 case m_mode:
6c75cc62 11689 case v_bnd_mode:
c0f3af97
L
11690 names = address_mode == mode_64bit ? names64 : names32;
11691 break;
7e8b059b 11692 case bnd_mode:
9f79e886 11693 case bnd_swap_mode:
0d96e4df
L
11694 if (reg > 0x3)
11695 {
11696 oappend ("(bad)");
11697 return;
11698 }
7e8b059b
L
11699 names = names_bnd;
11700 break;
07f5af7d
L
11701 case indir_v_mode:
11702 if (address_mode == mode_64bit && isa64 == intel64)
11703 {
11704 names = names64;
11705 break;
11706 }
1a0670f3 11707 /* Fall through. */
c0f3af97 11708 case stack_v_mode:
7bb15c6f 11709 if (address_mode == mode_64bit && ((sizeflag & DFLAG) || (rex & REX_W)))
252b5132 11710 {
c0f3af97 11711 names = names64;
252b5132 11712 break;
252b5132 11713 }
c0f3af97 11714 bytemode = v_mode;
1a0670f3 11715 /* Fall through. */
c0f3af97 11716 case v_mode:
b6169b20 11717 case v_swap_mode:
c0f3af97
L
11718 case dq_mode:
11719 case dqb_mode:
11720 case dqd_mode:
11721 case dqw_mode:
11722 USED_REX (REX_W);
11723 if (rex & REX_W)
11724 names = names64;
035e7389
JB
11725 else if (bytemode != v_mode && bytemode != v_swap_mode)
11726 names = names32;
c0f3af97 11727 else
f16cd0d5 11728 {
035e7389 11729 if (sizeflag & DFLAG)
f16cd0d5
L
11730 names = names32;
11731 else
11732 names = names16;
11733 used_prefixes |= (prefixes & PREFIX_DATA);
11734 }
c0f3af97 11735 break;
bc31405e
L
11736 case movsxd_mode:
11737 if (!(sizeflag & DFLAG) && isa64 == intel64)
11738 names = names16;
11739 else
11740 names = names32;
11741 used_prefixes |= (prefixes & PREFIX_DATA);
11742 break;
de89d0a3
IT
11743 case va_mode:
11744 names = (address_mode == mode_64bit
11745 ? names64 : names32);
11746 if (!(prefixes & PREFIX_ADDR))
aa178437
IT
11747 names = (address_mode == mode_16bit
11748 ? names16 : names);
de89d0a3
IT
11749 else
11750 {
11751 /* Remove "addr16/addr32". */
11752 all_prefixes[last_addr_prefix] = 0;
11753 names = (address_mode != mode_32bit
11754 ? names32 : names16);
11755 used_prefixes |= PREFIX_ADDR;
11756 }
11757 break;
1ba585e8 11758 case mask_bd_mode:
43234a1e 11759 case mask_mode:
9889cbb1
L
11760 if (reg > 0x7)
11761 {
11762 oappend ("(bad)");
11763 return;
11764 }
43234a1e
L
11765 names = names_mask;
11766 break;
c0f3af97
L
11767 case 0:
11768 return;
11769 default:
11770 oappend (INTERNAL_DISASSEMBLER_ERROR);
252b5132
RH
11771 return;
11772 }
c0f3af97
L
11773 oappend (names[reg]);
11774}
11775
11776static void
c1e679ec 11777OP_E_memory (int bytemode, int sizeflag)
c0f3af97
L
11778{
11779 bfd_vma disp = 0;
11780 int add = (rex & REX_B) ? 8 : 0;
11781 int riprel = 0;
43234a1e
L
11782 int shift;
11783
11784 if (vex.evex)
11785 {
11786 /* In EVEX, if operand doesn't allow broadcast, vex.b should be 0. */
11787 if (vex.b
11788 && bytemode != x_mode
90a915bf 11789 && bytemode != xmmq_mode
43234a1e
L
11790 && bytemode != evex_half_bcst_xmmq_mode)
11791 {
11792 BadOp ();
11793 return;
11794 }
11795 switch (bytemode)
11796 {
1ba585e8
IT
11797 case dqw_mode:
11798 case dw_mode:
059edf8b 11799 case xmm_mw_mode:
1ba585e8
IT
11800 shift = 1;
11801 break;
11802 case dqb_mode:
11803 case db_mode:
059edf8b 11804 case xmm_mb_mode:
1ba585e8
IT
11805 shift = 0;
11806 break;
b50c9f31
JB
11807 case dq_mode:
11808 if (address_mode != mode_64bit)
11809 {
059edf8b
JB
11810 case dqd_mode:
11811 case xmm_md_mode:
11812 case d_mode:
11813 case d_swap_mode:
b50c9f31
JB
11814 shift = 2;
11815 break;
11816 }
11817 /* fall through */
4102be5c 11818 case vex_scalar_w_dq_mode:
43234a1e 11819 case vex_vsib_d_w_dq_mode:
5fc35d96 11820 case vex_vsib_d_w_d_mode:
eaa9d1ad 11821 case vex_vsib_q_w_dq_mode:
5fc35d96 11822 case vex_vsib_q_w_d_mode:
43234a1e 11823 case evex_x_gscat_mode:
43234a1e
L
11824 shift = vex.w ? 3 : 2;
11825 break;
43234a1e
L
11826 case x_mode:
11827 case evex_half_bcst_xmmq_mode:
90a915bf 11828 case xmmq_mode:
43234a1e
L
11829 if (vex.b)
11830 {
11831 shift = vex.w ? 3 : 2;
11832 break;
11833 }
1a0670f3 11834 /* Fall through. */
43234a1e
L
11835 case xmmqd_mode:
11836 case xmmdw_mode:
43234a1e
L
11837 case ymmq_mode:
11838 case evex_x_nobcst_mode:
11839 case x_swap_mode:
11840 switch (vex.length)
11841 {
11842 case 128:
11843 shift = 4;
11844 break;
11845 case 256:
11846 shift = 5;
11847 break;
11848 case 512:
11849 shift = 6;
11850 break;
11851 default:
11852 abort ();
11853 }
059edf8b
JB
11854 /* Make necessary corrections to shift for modes that need it. */
11855 if (bytemode == xmmq_mode
11856 || bytemode == evex_half_bcst_xmmq_mode
11857 || (bytemode == ymmq_mode && vex.length == 128))
11858 shift -= 1;
11859 else if (bytemode == xmmqd_mode)
11860 shift -= 2;
11861 else if (bytemode == xmmdw_mode)
11862 shift -= 3;
43234a1e
L
11863 break;
11864 case ymm_mode:
11865 shift = 5;
11866 break;
11867 case xmm_mode:
11868 shift = 4;
11869 break;
11870 case xmm_mq_mode:
11871 case q_mode:
43234a1e 11872 case q_swap_mode:
43234a1e
L
11873 shift = 3;
11874 break;
4726e9a4
JB
11875 case bw_unit_mode:
11876 shift = vex.w ? 1 : 0;
11877 break;
43234a1e
L
11878 default:
11879 abort ();
11880 }
43234a1e
L
11881 }
11882 else
11883 shift = 0;
252b5132 11884
c0f3af97 11885 USED_REX (REX_B);
3f31e633
JB
11886 if (intel_syntax)
11887 intel_operand_size (bytemode, sizeflag);
252b5132
RH
11888 append_seg ();
11889
5d669648 11890 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
252b5132 11891 {
5d669648
L
11892 /* 32/64 bit address mode */
11893 int havedisp;
252b5132
RH
11894 int havesib;
11895 int havebase;
0f7da397 11896 int haveindex;
20afcfb7 11897 int needindex;
1bc60e56 11898 int needaddr32;
82c18208 11899 int base, rbase;
91d6fa6a 11900 int vindex = 0;
252b5132 11901 int scale = 0;
7e8b059b
L
11902 int addr32flag = !((sizeflag & AFLAG)
11903 || bytemode == v_bnd_mode
d276ec69 11904 || bytemode == v_bndmk_mode
9f79e886
JB
11905 || bytemode == bnd_mode
11906 || bytemode == bnd_swap_mode);
6c30d220
L
11907 const char **indexes64 = names64;
11908 const char **indexes32 = names32;
252b5132
RH
11909
11910 havesib = 0;
11911 havebase = 1;
0f7da397 11912 haveindex = 0;
7967e09e 11913 base = modrm.rm;
252b5132
RH
11914
11915 if (base == 4)
11916 {
11917 havesib = 1;
dfc8cf43 11918 vindex = sib.index;
161a04f6
L
11919 USED_REX (REX_X);
11920 if (rex & REX_X)
91d6fa6a 11921 vindex += 8;
6c30d220
L
11922 switch (bytemode)
11923 {
11924 case vex_vsib_d_w_dq_mode:
5fc35d96 11925 case vex_vsib_d_w_d_mode:
6c30d220 11926 case vex_vsib_q_w_dq_mode:
5fc35d96 11927 case vex_vsib_q_w_d_mode:
6c30d220
L
11928 if (!need_vex)
11929 abort ();
43234a1e
L
11930 if (vex.evex)
11931 {
11932 if (!vex.v)
11933 vindex += 16;
11934 }
6c30d220
L
11935
11936 haveindex = 1;
11937 switch (vex.length)
11938 {
11939 case 128:
7bb15c6f 11940 indexes64 = indexes32 = names_xmm;
6c30d220
L
11941 break;
11942 case 256:
5fc35d96
IT
11943 if (!vex.w
11944 || bytemode == vex_vsib_q_w_dq_mode
11945 || bytemode == vex_vsib_q_w_d_mode)
7bb15c6f 11946 indexes64 = indexes32 = names_ymm;
6c30d220 11947 else
7bb15c6f 11948 indexes64 = indexes32 = names_xmm;
6c30d220 11949 break;
43234a1e 11950 case 512:
5fc35d96
IT
11951 if (!vex.w
11952 || bytemode == vex_vsib_q_w_dq_mode
11953 || bytemode == vex_vsib_q_w_d_mode)
43234a1e
L
11954 indexes64 = indexes32 = names_zmm;
11955 else
11956 indexes64 = indexes32 = names_ymm;
11957 break;
6c30d220
L
11958 default:
11959 abort ();
11960 }
11961 break;
11962 default:
11963 haveindex = vindex != 4;
11964 break;
11965 }
11966 scale = sib.scale;
11967 base = sib.base;
252b5132
RH
11968 codep++;
11969 }
260cd341
LC
11970 else
11971 {
11972 /* mandatory non-vector SIB must have sib */
11973 if (bytemode == vex_sibmem_mode)
11974 {
11975 oappend ("(bad)");
11976 return;
11977 }
11978 }
82c18208 11979 rbase = base + add;
252b5132 11980
7967e09e 11981 switch (modrm.mod)
252b5132
RH
11982 {
11983 case 0:
82c18208 11984 if (base == 5)
252b5132
RH
11985 {
11986 havebase = 0;
cb712a9e 11987 if (address_mode == mode_64bit && !havesib)
52b15da3
JH
11988 riprel = 1;
11989 disp = get32s ();
d276ec69
JB
11990 if (riprel && bytemode == v_bndmk_mode)
11991 {
11992 oappend ("(bad)");
11993 return;
11994 }
252b5132
RH
11995 }
11996 break;
11997 case 1:
11998 FETCH_DATA (the_info, codep + 1);
11999 disp = *codep++;
12000 if ((disp & 0x80) != 0)
12001 disp -= 0x100;
43234a1e
L
12002 if (vex.evex && shift > 0)
12003 disp <<= shift;
252b5132
RH
12004 break;
12005 case 2:
52b15da3 12006 disp = get32s ();
252b5132
RH
12007 break;
12008 }
12009
1bc60e56
L
12010 needindex = 0;
12011 needaddr32 = 0;
12012 if (havesib
12013 && !havebase
12014 && !haveindex
12015 && address_mode != mode_16bit)
12016 {
12017 if (address_mode == mode_64bit)
12018 {
8e58ef80
L
12019 if (addr32flag)
12020 {
12021 /* Without base nor index registers, zero-extend the
12022 lower 32-bit displacement to 64 bits. */
12023 disp = (unsigned int) disp;
bf4ba07c 12024 needindex = 1;
8e58ef80 12025 }
1bc60e56
L
12026 needaddr32 = 1;
12027 }
12028 else
12029 {
12030 /* In 32-bit mode, we need index register to tell [offset]
12031 from [eiz*1 + offset]. */
12032 needindex = 1;
12033 }
12034 }
12035
20afcfb7
L
12036 havedisp = (havebase
12037 || needindex
12038 || (havesib && (haveindex || scale != 0)));
5d669648 12039
252b5132 12040 if (!intel_syntax)
82c18208 12041 if (modrm.mod != 0 || base == 5)
db6eb5be 12042 {
5d669648
L
12043 if (havedisp || riprel)
12044 print_displacement (scratchbuf, disp);
12045 else
12046 print_operand_value (scratchbuf, 1, disp);
db6eb5be 12047 oappend (scratchbuf);
52b15da3
JH
12048 if (riprel)
12049 {
12050 set_op (disp, 1);
28596323 12051 oappend (!addr32flag ? "(%rip)" : "(%eip)");
52b15da3 12052 }
db6eb5be 12053 }
2da11e11 12054
c1dc7af5 12055 if ((havebase || haveindex || needindex || needaddr32 || riprel)
a23b33b3
JB
12056 && (address_mode != mode_64bit
12057 || ((bytemode != v_bnd_mode)
12058 && (bytemode != v_bndmk_mode)
12059 && (bytemode != bnd_mode)
12060 && (bytemode != bnd_swap_mode))))
87767711
JB
12061 used_prefixes |= PREFIX_ADDR;
12062
5d669648 12063 if (havedisp || (intel_syntax && riprel))
252b5132 12064 {
252b5132 12065 *obufp++ = open_char;
52b15da3 12066 if (intel_syntax && riprel)
185b1163
L
12067 {
12068 set_op (disp, 1);
28596323 12069 oappend (!addr32flag ? "rip" : "eip");
185b1163 12070 }
db6eb5be 12071 *obufp = '\0';
252b5132 12072 if (havebase)
7e8b059b 12073 oappend (address_mode == mode_64bit && !addr32flag
82c18208 12074 ? names64[rbase] : names32[rbase]);
252b5132
RH
12075 if (havesib)
12076 {
db51cc60
L
12077 /* ESP/RSP won't allow index. If base isn't ESP/RSP,
12078 print index to tell base + index from base. */
12079 if (scale != 0
20afcfb7 12080 || needindex
db51cc60
L
12081 || haveindex
12082 || (havebase && base != ESP_REG_NUM))
252b5132 12083 {
9306ca4a 12084 if (!intel_syntax || havebase)
db6eb5be 12085 {
9306ca4a
JB
12086 *obufp++ = separator_char;
12087 *obufp = '\0';
db6eb5be 12088 }
db51cc60 12089 if (haveindex)
7e8b059b 12090 oappend (address_mode == mode_64bit && !addr32flag
6c30d220 12091 ? indexes64[vindex] : indexes32[vindex]);
db51cc60 12092 else
7e8b059b 12093 oappend (address_mode == mode_64bit && !addr32flag
db51cc60
L
12094 ? index64 : index32);
12095
db6eb5be
AM
12096 *obufp++ = scale_char;
12097 *obufp = '\0';
12098 sprintf (scratchbuf, "%d", 1 << scale);
12099 oappend (scratchbuf);
12100 }
252b5132 12101 }
185b1163 12102 if (intel_syntax
82c18208 12103 && (disp || modrm.mod != 0 || base == 5))
3d456fa1 12104 {
db51cc60 12105 if (!havedisp || (bfd_signed_vma) disp >= 0)
3d456fa1
JB
12106 {
12107 *obufp++ = '+';
12108 *obufp = '\0';
12109 }
05203043 12110 else if (modrm.mod != 1 && disp != -disp)
3d456fa1
JB
12111 {
12112 *obufp++ = '-';
12113 *obufp = '\0';
b4b39349 12114 disp = -disp;
3d456fa1
JB
12115 }
12116
db51cc60
L
12117 if (havedisp)
12118 print_displacement (scratchbuf, disp);
12119 else
12120 print_operand_value (scratchbuf, 1, disp);
3d456fa1
JB
12121 oappend (scratchbuf);
12122 }
252b5132
RH
12123
12124 *obufp++ = close_char;
db6eb5be 12125 *obufp = '\0';
252b5132
RH
12126 }
12127 else if (intel_syntax)
db6eb5be 12128 {
82c18208 12129 if (modrm.mod != 0 || base == 5)
db6eb5be 12130 {
285ca992 12131 if (!active_seg_prefix)
252b5132 12132 {
d708bcba 12133 oappend (names_seg[ds_reg - es_reg]);
252b5132
RH
12134 oappend (":");
12135 }
52b15da3 12136 print_operand_value (scratchbuf, 1, disp);
db6eb5be
AM
12137 oappend (scratchbuf);
12138 }
12139 }
252b5132 12140 }
a23b33b3
JB
12141 else if (bytemode == v_bnd_mode
12142 || bytemode == v_bndmk_mode
12143 || bytemode == bnd_mode
12144 || bytemode == bnd_swap_mode)
12145 {
12146 oappend ("(bad)");
12147 return;
12148 }
252b5132 12149 else
f16cd0d5
L
12150 {
12151 /* 16 bit address mode */
12152 used_prefixes |= prefixes & PREFIX_ADDR;
7967e09e 12153 switch (modrm.mod)
252b5132
RH
12154 {
12155 case 0:
7967e09e 12156 if (modrm.rm == 6)
252b5132
RH
12157 {
12158 disp = get16 ();
12159 if ((disp & 0x8000) != 0)
12160 disp -= 0x10000;
12161 }
12162 break;
12163 case 1:
12164 FETCH_DATA (the_info, codep + 1);
12165 disp = *codep++;
12166 if ((disp & 0x80) != 0)
12167 disp -= 0x100;
65f3ed04
JB
12168 if (vex.evex && shift > 0)
12169 disp <<= shift;
252b5132
RH
12170 break;
12171 case 2:
12172 disp = get16 ();
12173 if ((disp & 0x8000) != 0)
12174 disp -= 0x10000;
12175 break;
12176 }
12177
12178 if (!intel_syntax)
7967e09e 12179 if (modrm.mod != 0 || modrm.rm == 6)
db6eb5be 12180 {
5d669648 12181 print_displacement (scratchbuf, disp);
db6eb5be
AM
12182 oappend (scratchbuf);
12183 }
252b5132 12184
7967e09e 12185 if (modrm.mod != 0 || modrm.rm != 6)
252b5132
RH
12186 {
12187 *obufp++ = open_char;
db6eb5be 12188 *obufp = '\0';
7967e09e 12189 oappend (index16[modrm.rm]);
5d669648
L
12190 if (intel_syntax
12191 && (disp || modrm.mod != 0 || modrm.rm == 6))
3d456fa1 12192 {
5d669648 12193 if ((bfd_signed_vma) disp >= 0)
3d456fa1
JB
12194 {
12195 *obufp++ = '+';
12196 *obufp = '\0';
12197 }
7967e09e 12198 else if (modrm.mod != 1)
3d456fa1
JB
12199 {
12200 *obufp++ = '-';
12201 *obufp = '\0';
b4b39349 12202 disp = -disp;
3d456fa1
JB
12203 }
12204
5d669648 12205 print_displacement (scratchbuf, disp);
3d456fa1
JB
12206 oappend (scratchbuf);
12207 }
12208
db6eb5be
AM
12209 *obufp++ = close_char;
12210 *obufp = '\0';
252b5132 12211 }
3d456fa1
JB
12212 else if (intel_syntax)
12213 {
285ca992 12214 if (!active_seg_prefix)
3d456fa1
JB
12215 {
12216 oappend (names_seg[ds_reg - es_reg]);
12217 oappend (":");
12218 }
12219 print_operand_value (scratchbuf, 1, disp & 0xffff);
12220 oappend (scratchbuf);
12221 }
252b5132 12222 }
43234a1e
L
12223 if (vex.evex && vex.b
12224 && (bytemode == x_mode
90a915bf 12225 || bytemode == xmmq_mode
43234a1e
L
12226 || bytemode == evex_half_bcst_xmmq_mode))
12227 {
90a915bf
IT
12228 if (vex.w
12229 || bytemode == xmmq_mode
12230 || bytemode == evex_half_bcst_xmmq_mode)
b28d1bda
IT
12231 {
12232 switch (vex.length)
12233 {
12234 case 128:
12235 oappend ("{1to2}");
12236 break;
12237 case 256:
12238 oappend ("{1to4}");
12239 break;
12240 case 512:
12241 oappend ("{1to8}");
12242 break;
12243 default:
12244 abort ();
12245 }
12246 }
43234a1e 12247 else
b28d1bda
IT
12248 {
12249 switch (vex.length)
12250 {
12251 case 128:
12252 oappend ("{1to4}");
12253 break;
12254 case 256:
12255 oappend ("{1to8}");
12256 break;
12257 case 512:
12258 oappend ("{1to16}");
12259 break;
12260 default:
12261 abort ();
12262 }
12263 }
43234a1e 12264 }
252b5132
RH
12265}
12266
c0f3af97 12267static void
8b3f93e7 12268OP_E (int bytemode, int sizeflag)
c0f3af97
L
12269{
12270 /* Skip mod/rm byte. */
12271 MODRM_CHECK;
12272 codep++;
12273
12274 if (modrm.mod == 3)
12275 OP_E_register (bytemode, sizeflag);
12276 else
c1e679ec 12277 OP_E_memory (bytemode, sizeflag);
c0f3af97
L
12278}
12279
252b5132 12280static void
26ca5450 12281OP_G (int bytemode, int sizeflag)
252b5132 12282{
52b15da3 12283 int add = 0;
c0a30a9f 12284 const char **names;
161a04f6
L
12285 USED_REX (REX_R);
12286 if (rex & REX_R)
52b15da3 12287 add += 8;
252b5132
RH
12288 switch (bytemode)
12289 {
12290 case b_mode:
e184e611
JB
12291 if (modrm.reg & 4)
12292 USED_REX (0);
52b15da3 12293 if (rex)
7967e09e 12294 oappend (names8rex[modrm.reg + add]);
52b15da3 12295 else
7967e09e 12296 oappend (names8[modrm.reg + add]);
252b5132
RH
12297 break;
12298 case w_mode:
7967e09e 12299 oappend (names16[modrm.reg + add]);
252b5132
RH
12300 break;
12301 case d_mode:
1ba585e8
IT
12302 case db_mode:
12303 case dw_mode:
7967e09e 12304 oappend (names32[modrm.reg + add]);
52b15da3
JH
12305 break;
12306 case q_mode:
7967e09e 12307 oappend (names64[modrm.reg + add]);
252b5132 12308 break;
7e8b059b 12309 case bnd_mode:
0d96e4df
L
12310 if (modrm.reg > 0x3)
12311 {
12312 oappend ("(bad)");
12313 return;
12314 }
7e8b059b
L
12315 oappend (names_bnd[modrm.reg]);
12316 break;
252b5132 12317 case v_mode:
9306ca4a 12318 case dq_mode:
42903f7f
L
12319 case dqb_mode:
12320 case dqd_mode:
9306ca4a 12321 case dqw_mode:
bc31405e 12322 case movsxd_mode:
161a04f6
L
12323 USED_REX (REX_W);
12324 if (rex & REX_W)
7967e09e 12325 oappend (names64[modrm.reg + add]);
035e7389
JB
12326 else if (bytemode != v_mode && bytemode != movsxd_mode)
12327 oappend (names32[modrm.reg + add]);
252b5132 12328 else
f16cd0d5 12329 {
035e7389 12330 if (sizeflag & DFLAG)
f16cd0d5
L
12331 oappend (names32[modrm.reg + add]);
12332 else
12333 oappend (names16[modrm.reg + add]);
12334 used_prefixes |= (prefixes & PREFIX_DATA);
12335 }
252b5132 12336 break;
c0a30a9f
L
12337 case va_mode:
12338 names = (address_mode == mode_64bit
12339 ? names64 : names32);
12340 if (!(prefixes & PREFIX_ADDR))
12341 {
12342 if (address_mode == mode_16bit)
12343 names = names16;
12344 }
12345 else
12346 {
12347 /* Remove "addr16/addr32". */
12348 all_prefixes[last_addr_prefix] = 0;
12349 names = (address_mode != mode_32bit
12350 ? names32 : names16);
12351 used_prefixes |= PREFIX_ADDR;
12352 }
12353 oappend (names[modrm.reg + add]);
12354 break;
90700ea2 12355 case m_mode:
cb712a9e 12356 if (address_mode == mode_64bit)
7967e09e 12357 oappend (names64[modrm.reg + add]);
90700ea2 12358 else
7967e09e 12359 oappend (names32[modrm.reg + add]);
90700ea2 12360 break;
1ba585e8 12361 case mask_bd_mode:
43234a1e 12362 case mask_mode:
9889cbb1
L
12363 if ((modrm.reg + add) > 0x7)
12364 {
12365 oappend ("(bad)");
12366 return;
12367 }
43234a1e
L
12368 oappend (names_mask[modrm.reg + add]);
12369 break;
252b5132
RH
12370 default:
12371 oappend (INTERNAL_DISASSEMBLER_ERROR);
12372 break;
12373 }
12374}
12375
52b15da3 12376static bfd_vma
26ca5450 12377get64 (void)
52b15da3 12378{
5dd0794d 12379 bfd_vma x;
52b15da3 12380#ifdef BFD64
5dd0794d
AM
12381 unsigned int a;
12382 unsigned int b;
12383
52b15da3
JH
12384 FETCH_DATA (the_info, codep + 8);
12385 a = *codep++ & 0xff;
12386 a |= (*codep++ & 0xff) << 8;
12387 a |= (*codep++ & 0xff) << 16;
070fe95d 12388 a |= (*codep++ & 0xffu) << 24;
5dd0794d 12389 b = *codep++ & 0xff;
52b15da3
JH
12390 b |= (*codep++ & 0xff) << 8;
12391 b |= (*codep++ & 0xff) << 16;
070fe95d 12392 b |= (*codep++ & 0xffu) << 24;
52b15da3
JH
12393 x = a + ((bfd_vma) b << 32);
12394#else
6608db57 12395 abort ();
5dd0794d 12396 x = 0;
52b15da3
JH
12397#endif
12398 return x;
12399}
12400
12401static bfd_signed_vma
26ca5450 12402get32 (void)
252b5132 12403{
b4b39349 12404 bfd_vma x = 0;
252b5132
RH
12405
12406 FETCH_DATA (the_info, codep + 4);
b4b39349
AM
12407 x = *codep++ & (bfd_vma) 0xff;
12408 x |= (*codep++ & (bfd_vma) 0xff) << 8;
12409 x |= (*codep++ & (bfd_vma) 0xff) << 16;
12410 x |= (*codep++ & (bfd_vma) 0xff) << 24;
52b15da3
JH
12411 return x;
12412}
12413
12414static bfd_signed_vma
26ca5450 12415get32s (void)
52b15da3 12416{
b4b39349 12417 bfd_vma x = 0;
52b15da3
JH
12418
12419 FETCH_DATA (the_info, codep + 4);
b4b39349
AM
12420 x = *codep++ & (bfd_vma) 0xff;
12421 x |= (*codep++ & (bfd_vma) 0xff) << 8;
12422 x |= (*codep++ & (bfd_vma) 0xff) << 16;
12423 x |= (*codep++ & (bfd_vma) 0xff) << 24;
52b15da3 12424
b4b39349 12425 x = (x ^ ((bfd_vma) 1 << 31)) - ((bfd_vma) 1 << 31);
52b15da3 12426
252b5132
RH
12427 return x;
12428}
12429
12430static int
26ca5450 12431get16 (void)
252b5132
RH
12432{
12433 int x = 0;
12434
12435 FETCH_DATA (the_info, codep + 2);
12436 x = *codep++ & 0xff;
12437 x |= (*codep++ & 0xff) << 8;
12438 return x;
12439}
12440
12441static void
26ca5450 12442set_op (bfd_vma op, int riprel)
252b5132
RH
12443{
12444 op_index[op_ad] = op_ad;
cb712a9e 12445 if (address_mode == mode_64bit)
7081ff04
AJ
12446 {
12447 op_address[op_ad] = op;
12448 op_riprel[op_ad] = riprel;
12449 }
12450 else
12451 {
12452 /* Mask to get a 32-bit address. */
12453 op_address[op_ad] = op & 0xffffffff;
12454 op_riprel[op_ad] = riprel & 0xffffffff;
12455 }
252b5132
RH
12456}
12457
12458static void
26ca5450 12459OP_REG (int code, int sizeflag)
252b5132 12460{
2da11e11 12461 const char *s;
9b60702d 12462 int add;
de882298
RM
12463
12464 switch (code)
12465 {
12466 case es_reg: case ss_reg: case cs_reg:
12467 case ds_reg: case fs_reg: case gs_reg:
12468 oappend (names_seg[code - es_reg]);
12469 return;
12470 }
12471
161a04f6
L
12472 USED_REX (REX_B);
12473 if (rex & REX_B)
52b15da3 12474 add = 8;
9b60702d
L
12475 else
12476 add = 0;
52b15da3
JH
12477
12478 switch (code)
12479 {
52b15da3
JH
12480 case ax_reg: case cx_reg: case dx_reg: case bx_reg:
12481 case sp_reg: case bp_reg: case si_reg: case di_reg:
12482 s = names16[code - ax_reg + add];
12483 break;
e184e611 12484 case ah_reg: case ch_reg: case dh_reg: case bh_reg:
52b15da3 12485 USED_REX (0);
e184e611
JB
12486 /* Fall through. */
12487 case al_reg: case cl_reg: case dl_reg: case bl_reg:
52b15da3
JH
12488 if (rex)
12489 s = names8rex[code - al_reg + add];
12490 else
12491 s = names8[code - al_reg];
12492 break;
6439fc28
AM
12493 case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
12494 case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
7bb15c6f 12495 if (address_mode == mode_64bit
6c067bbb 12496 && ((sizeflag & DFLAG) || (rex & REX_W)))
6439fc28
AM
12497 {
12498 s = names64[code - rAX_reg + add];
12499 break;
12500 }
12501 code += eAX_reg - rAX_reg;
6608db57 12502 /* Fall through. */
52b15da3
JH
12503 case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
12504 case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
161a04f6
L
12505 USED_REX (REX_W);
12506 if (rex & REX_W)
52b15da3 12507 s = names64[code - eAX_reg + add];
52b15da3 12508 else
f16cd0d5
L
12509 {
12510 if (sizeflag & DFLAG)
12511 s = names32[code - eAX_reg + add];
12512 else
12513 s = names16[code - eAX_reg + add];
12514 used_prefixes |= (prefixes & PREFIX_DATA);
12515 }
52b15da3 12516 break;
52b15da3
JH
12517 default:
12518 s = INTERNAL_DISASSEMBLER_ERROR;
12519 break;
12520 }
12521 oappend (s);
12522}
12523
12524static void
26ca5450 12525OP_IMREG (int code, int sizeflag)
52b15da3
JH
12526{
12527 const char *s;
252b5132
RH
12528
12529 switch (code)
12530 {
12531 case indir_dx_reg:
d708bcba 12532 if (intel_syntax)
52fd6d94 12533 s = "dx";
d708bcba 12534 else
db6eb5be 12535 s = "(%dx)";
252b5132 12536 break;
e8b5d5f9
JB
12537 case al_reg: case cl_reg:
12538 s = names8[code - al_reg];
252b5132 12539 break;
e8b5d5f9 12540 case eAX_reg:
161a04f6
L
12541 USED_REX (REX_W);
12542 if (rex & REX_W)
f16cd0d5 12543 {
e8b5d5f9
JB
12544 s = *names64;
12545 break;
f16cd0d5 12546 }
e8b5d5f9 12547 /* Fall through. */
52fd6d94 12548 case z_mode_ax_reg:
161a04f6 12549 if ((rex & REX_W) || (sizeflag & DFLAG))
52fd6d94
JB
12550 s = *names32;
12551 else
12552 s = *names16;
161a04f6 12553 if (!(rex & REX_W))
52fd6d94
JB
12554 used_prefixes |= (prefixes & PREFIX_DATA);
12555 break;
252b5132
RH
12556 default:
12557 s = INTERNAL_DISASSEMBLER_ERROR;
12558 break;
12559 }
12560 oappend (s);
12561}
12562
12563static void
26ca5450 12564OP_I (int bytemode, int sizeflag)
252b5132 12565{
52b15da3
JH
12566 bfd_signed_vma op;
12567 bfd_signed_vma mask = -1;
252b5132
RH
12568
12569 switch (bytemode)
12570 {
12571 case b_mode:
12572 FETCH_DATA (the_info, codep + 1);
52b15da3
JH
12573 op = *codep++;
12574 mask = 0xff;
12575 break;
252b5132 12576 case v_mode:
161a04f6
L
12577 USED_REX (REX_W);
12578 if (rex & REX_W)
52b15da3 12579 op = get32s ();
252b5132 12580 else
52b15da3 12581 {
f16cd0d5
L
12582 if (sizeflag & DFLAG)
12583 {
12584 op = get32 ();
12585 mask = 0xffffffff;
12586 }
12587 else
12588 {
12589 op = get16 ();
12590 mask = 0xfffff;
12591 }
12592 used_prefixes |= (prefixes & PREFIX_DATA);
52b15da3 12593 }
252b5132 12594 break;
c1dc7af5
JB
12595 case d_mode:
12596 mask = 0xffffffff;
12597 op = get32 ();
12598 break;
252b5132 12599 case w_mode:
52b15da3 12600 mask = 0xfffff;
252b5132
RH
12601 op = get16 ();
12602 break;
9306ca4a
JB
12603 case const_1_mode:
12604 if (intel_syntax)
6c067bbb 12605 oappend ("1");
9306ca4a 12606 return;
252b5132
RH
12607 default:
12608 oappend (INTERNAL_DISASSEMBLER_ERROR);
12609 return;
12610 }
12611
52b15da3
JH
12612 op &= mask;
12613 scratchbuf[0] = '$';
d708bcba 12614 print_operand_value (scratchbuf + 1, 1, op);
9ce09ba2 12615 oappend_maybe_intel (scratchbuf);
52b15da3
JH
12616 scratchbuf[0] = '\0';
12617}
12618
12619static void
26ca5450 12620OP_I64 (int bytemode, int sizeflag)
52b15da3 12621{
a280ab8e 12622 if (bytemode != v_mode || address_mode != mode_64bit || !(rex & REX_W))
6439fc28
AM
12623 {
12624 OP_I (bytemode, sizeflag);
12625 return;
12626 }
12627
a280ab8e 12628 USED_REX (REX_W);
52b15da3 12629
52b15da3 12630 scratchbuf[0] = '$';
a280ab8e 12631 print_operand_value (scratchbuf + 1, 1, get64 ());
9ce09ba2 12632 oappend_maybe_intel (scratchbuf);
252b5132
RH
12633 scratchbuf[0] = '\0';
12634}
12635
12636static void
26ca5450 12637OP_sI (int bytemode, int sizeflag)
252b5132 12638{
52b15da3 12639 bfd_signed_vma op;
252b5132
RH
12640
12641 switch (bytemode)
12642 {
12643 case b_mode:
e3949f17 12644 case b_T_mode:
252b5132
RH
12645 FETCH_DATA (the_info, codep + 1);
12646 op = *codep++;
12647 if ((op & 0x80) != 0)
12648 op -= 0x100;
e3949f17
L
12649 if (bytemode == b_T_mode)
12650 {
12651 if (address_mode != mode_64bit
7bb15c6f 12652 || !((sizeflag & DFLAG) || (rex & REX_W)))
e3949f17 12653 {
6c067bbb
RM
12654 /* The operand-size prefix is overridden by a REX prefix. */
12655 if ((sizeflag & DFLAG) || (rex & REX_W))
e3949f17
L
12656 op &= 0xffffffff;
12657 else
12658 op &= 0xffff;
12659 }
12660 }
12661 else
12662 {
12663 if (!(rex & REX_W))
12664 {
12665 if (sizeflag & DFLAG)
12666 op &= 0xffffffff;
12667 else
12668 op &= 0xffff;
12669 }
12670 }
252b5132
RH
12671 break;
12672 case v_mode:
7bb15c6f
RM
12673 /* The operand-size prefix is overridden by a REX prefix. */
12674 if ((sizeflag & DFLAG) || (rex & REX_W))
52b15da3 12675 op = get32s ();
252b5132 12676 else
d9e3625e 12677 op = get16 ();
252b5132
RH
12678 break;
12679 default:
12680 oappend (INTERNAL_DISASSEMBLER_ERROR);
12681 return;
12682 }
52b15da3
JH
12683
12684 scratchbuf[0] = '$';
12685 print_operand_value (scratchbuf + 1, 1, op);
9ce09ba2 12686 oappend_maybe_intel (scratchbuf);
252b5132
RH
12687}
12688
12689static void
26ca5450 12690OP_J (int bytemode, int sizeflag)
252b5132 12691{
52b15da3 12692 bfd_vma disp;
7081ff04 12693 bfd_vma mask = -1;
65ca155d 12694 bfd_vma segment = 0;
252b5132
RH
12695
12696 switch (bytemode)
12697 {
12698 case b_mode:
12699 FETCH_DATA (the_info, codep + 1);
12700 disp = *codep++;
12701 if ((disp & 0x80) != 0)
12702 disp -= 0x100;
12703 break;
12704 case v_mode:
376cd056 12705 case dqw_mode:
5db04b09
L
12706 if ((sizeflag & DFLAG)
12707 || (address_mode == mode_64bit
d835a58b 12708 && ((isa64 == intel64 && bytemode != dqw_mode)
376cd056 12709 || (rex & REX_W))))
52b15da3 12710 disp = get32s ();
252b5132
RH
12711 else
12712 {
12713 disp = get16 ();
206717e8
L
12714 if ((disp & 0x8000) != 0)
12715 disp -= 0x10000;
65ca155d
L
12716 /* In 16bit mode, address is wrapped around at 64k within
12717 the same segment. Otherwise, a data16 prefix on a jump
12718 instruction means that the pc is masked to 16 bits after
12719 the displacement is added! */
12720 mask = 0xffff;
12721 if ((prefixes & PREFIX_DATA) == 0)
4fd7268a 12722 segment = ((start_pc + (codep - start_codep))
65ca155d 12723 & ~((bfd_vma) 0xffff));
252b5132 12724 }
5db04b09 12725 if (address_mode != mode_64bit
d835a58b 12726 || (isa64 != intel64 && !(rex & REX_W)))
f16cd0d5 12727 used_prefixes |= (prefixes & PREFIX_DATA);
252b5132
RH
12728 break;
12729 default:
12730 oappend (INTERNAL_DISASSEMBLER_ERROR);
12731 return;
12732 }
42d5f9c6 12733 disp = ((start_pc + (codep - start_codep) + disp) & mask) | segment;
52b15da3
JH
12734 set_op (disp, 0);
12735 print_operand_value (scratchbuf, 1, disp);
252b5132
RH
12736 oappend (scratchbuf);
12737}
12738
252b5132 12739static void
ed7841b3 12740OP_SEG (int bytemode, int sizeflag)
252b5132 12741{
ed7841b3 12742 if (bytemode == w_mode)
7967e09e 12743 oappend (names_seg[modrm.reg]);
ed7841b3 12744 else
7967e09e 12745 OP_E (modrm.mod == 3 ? bytemode : w_mode, sizeflag);
252b5132
RH
12746}
12747
12748static void
26ca5450 12749OP_DIR (int dummy ATTRIBUTE_UNUSED, int sizeflag)
252b5132
RH
12750{
12751 int seg, offset;
12752
c608c12e 12753 if (sizeflag & DFLAG)
252b5132 12754 {
c608c12e
AM
12755 offset = get32 ();
12756 seg = get16 ();
252b5132 12757 }
c608c12e
AM
12758 else
12759 {
12760 offset = get16 ();
12761 seg = get16 ();
12762 }
7d421014 12763 used_prefixes |= (prefixes & PREFIX_DATA);
d708bcba 12764 if (intel_syntax)
3f31e633 12765 sprintf (scratchbuf, "0x%x:0x%x", seg, offset);
d708bcba
AM
12766 else
12767 sprintf (scratchbuf, "$0x%x,$0x%x", seg, offset);
c608c12e 12768 oappend (scratchbuf);
252b5132
RH
12769}
12770
252b5132 12771static void
3f31e633 12772OP_OFF (int bytemode, int sizeflag)
252b5132 12773{
52b15da3 12774 bfd_vma off;
252b5132 12775
3f31e633
JB
12776 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
12777 intel_operand_size (bytemode, sizeflag);
252b5132
RH
12778 append_seg ();
12779
cb712a9e 12780 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
252b5132
RH
12781 off = get32 ();
12782 else
12783 off = get16 ();
12784
12785 if (intel_syntax)
12786 {
285ca992 12787 if (!active_seg_prefix)
252b5132 12788 {
d708bcba 12789 oappend (names_seg[ds_reg - es_reg]);
252b5132
RH
12790 oappend (":");
12791 }
12792 }
52b15da3
JH
12793 print_operand_value (scratchbuf, 1, off);
12794 oappend (scratchbuf);
12795}
6439fc28 12796
52b15da3 12797static void
3f31e633 12798OP_OFF64 (int bytemode, int sizeflag)
52b15da3
JH
12799{
12800 bfd_vma off;
12801
539e75ad
L
12802 if (address_mode != mode_64bit
12803 || (prefixes & PREFIX_ADDR))
6439fc28
AM
12804 {
12805 OP_OFF (bytemode, sizeflag);
12806 return;
12807 }
12808
3f31e633
JB
12809 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
12810 intel_operand_size (bytemode, sizeflag);
52b15da3
JH
12811 append_seg ();
12812
6608db57 12813 off = get64 ();
52b15da3
JH
12814
12815 if (intel_syntax)
12816 {
285ca992 12817 if (!active_seg_prefix)
52b15da3 12818 {
d708bcba 12819 oappend (names_seg[ds_reg - es_reg]);
52b15da3
JH
12820 oappend (":");
12821 }
12822 }
12823 print_operand_value (scratchbuf, 1, off);
252b5132
RH
12824 oappend (scratchbuf);
12825}
12826
12827static void
26ca5450 12828ptr_reg (int code, int sizeflag)
252b5132 12829{
2da11e11 12830 const char *s;
d708bcba 12831
1d9f512f 12832 *obufp++ = open_char;
20f0a1fc 12833 used_prefixes |= (prefixes & PREFIX_ADDR);
cb712a9e 12834 if (address_mode == mode_64bit)
c1a64871
JH
12835 {
12836 if (!(sizeflag & AFLAG))
db6eb5be 12837 s = names32[code - eAX_reg];
c1a64871 12838 else
db6eb5be 12839 s = names64[code - eAX_reg];
c1a64871 12840 }
52b15da3 12841 else if (sizeflag & AFLAG)
252b5132
RH
12842 s = names32[code - eAX_reg];
12843 else
12844 s = names16[code - eAX_reg];
12845 oappend (s);
1d9f512f
AM
12846 *obufp++ = close_char;
12847 *obufp = 0;
252b5132
RH
12848}
12849
12850static void
26ca5450 12851OP_ESreg (int code, int sizeflag)
252b5132 12852{
9306ca4a 12853 if (intel_syntax)
52fd6d94
JB
12854 {
12855 switch (codep[-1])
12856 {
12857 case 0x6d: /* insw/insl */
12858 intel_operand_size (z_mode, sizeflag);
12859 break;
12860 case 0xa5: /* movsw/movsl/movsq */
12861 case 0xa7: /* cmpsw/cmpsl/cmpsq */
12862 case 0xab: /* stosw/stosl */
12863 case 0xaf: /* scasw/scasl */
12864 intel_operand_size (v_mode, sizeflag);
12865 break;
12866 default:
12867 intel_operand_size (b_mode, sizeflag);
12868 }
12869 }
9ce09ba2 12870 oappend_maybe_intel ("%es:");
252b5132
RH
12871 ptr_reg (code, sizeflag);
12872}
12873
12874static void
26ca5450 12875OP_DSreg (int code, int sizeflag)
252b5132 12876{
9306ca4a 12877 if (intel_syntax)
52fd6d94
JB
12878 {
12879 switch (codep[-1])
12880 {
12881 case 0x6f: /* outsw/outsl */
12882 intel_operand_size (z_mode, sizeflag);
12883 break;
12884 case 0xa5: /* movsw/movsl/movsq */
12885 case 0xa7: /* cmpsw/cmpsl/cmpsq */
12886 case 0xad: /* lodsw/lodsl/lodsq */
12887 intel_operand_size (v_mode, sizeflag);
12888 break;
12889 default:
12890 intel_operand_size (b_mode, sizeflag);
12891 }
12892 }
285ca992
L
12893 /* Set active_seg_prefix to PREFIX_DS if it is unset so that the
12894 default segment register DS is printed. */
12895 if (!active_seg_prefix)
12896 active_seg_prefix = PREFIX_DS;
6608db57 12897 append_seg ();
252b5132
RH
12898 ptr_reg (code, sizeflag);
12899}
12900
252b5132 12901static void
26ca5450 12902OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 12903{
9b60702d 12904 int add;
161a04f6 12905 if (rex & REX_R)
c4a530c5 12906 {
161a04f6 12907 USED_REX (REX_R);
c4a530c5
JB
12908 add = 8;
12909 }
cb712a9e 12910 else if (address_mode != mode_64bit && (prefixes & PREFIX_LOCK))
c4a530c5 12911 {
f16cd0d5 12912 all_prefixes[last_lock_prefix] = 0;
c4a530c5
JB
12913 used_prefixes |= PREFIX_LOCK;
12914 add = 8;
12915 }
9b60702d
L
12916 else
12917 add = 0;
7967e09e 12918 sprintf (scratchbuf, "%%cr%d", modrm.reg + add);
9ce09ba2 12919 oappend_maybe_intel (scratchbuf);
252b5132
RH
12920}
12921
252b5132 12922static void
26ca5450 12923OP_D (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 12924{
9b60702d 12925 int add;
161a04f6
L
12926 USED_REX (REX_R);
12927 if (rex & REX_R)
52b15da3 12928 add = 8;
9b60702d
L
12929 else
12930 add = 0;
d708bcba 12931 if (intel_syntax)
bfbd9438 12932 sprintf (scratchbuf, "dr%d", modrm.reg + add);
d708bcba 12933 else
7967e09e 12934 sprintf (scratchbuf, "%%db%d", modrm.reg + add);
252b5132
RH
12935 oappend (scratchbuf);
12936}
12937
252b5132 12938static void
26ca5450 12939OP_T (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 12940{
7967e09e 12941 sprintf (scratchbuf, "%%tr%d", modrm.reg);
9ce09ba2 12942 oappend_maybe_intel (scratchbuf);
252b5132
RH
12943}
12944
252b5132 12945static void
26ca5450 12946OP_MMX (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 12947{
b9733481
L
12948 int reg = modrm.reg;
12949 const char **names;
12950
041bd2e0
JH
12951 used_prefixes |= (prefixes & PREFIX_DATA);
12952 if (prefixes & PREFIX_DATA)
20f0a1fc 12953 {
b9733481 12954 names = names_xmm;
161a04f6
L
12955 USED_REX (REX_R);
12956 if (rex & REX_R)
b9733481 12957 reg += 8;
20f0a1fc 12958 }
041bd2e0 12959 else
b9733481
L
12960 names = names_mm;
12961 oappend (names[reg]);
252b5132
RH
12962}
12963
c608c12e 12964static void
c0f3af97 12965OP_XMM (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
c608c12e 12966{
b9733481
L
12967 int reg = modrm.reg;
12968 const char **names;
12969
161a04f6
L
12970 USED_REX (REX_R);
12971 if (rex & REX_R)
b9733481 12972 reg += 8;
43234a1e
L
12973 if (vex.evex)
12974 {
12975 if (!vex.r)
12976 reg += 16;
12977 }
12978
539f890d
L
12979 if (need_vex
12980 && bytemode != xmm_mode
43234a1e
L
12981 && bytemode != xmmq_mode
12982 && bytemode != evex_half_bcst_xmmq_mode
12983 && bytemode != ymm_mode
260cd341 12984 && bytemode != tmm_mode
539f890d 12985 && bytemode != scalar_mode)
c0f3af97
L
12986 {
12987 switch (vex.length)
12988 {
12989 case 128:
b9733481 12990 names = names_xmm;
c0f3af97
L
12991 break;
12992 case 256:
5fc35d96
IT
12993 if (vex.w
12994 || (bytemode != vex_vsib_q_w_dq_mode
12995 && bytemode != vex_vsib_q_w_d_mode))
6c30d220
L
12996 names = names_ymm;
12997 else
12998 names = names_xmm;
c0f3af97 12999 break;
43234a1e
L
13000 case 512:
13001 names = names_zmm;
13002 break;
c0f3af97
L
13003 default:
13004 abort ();
13005 }
13006 }
43234a1e
L
13007 else if (bytemode == xmmq_mode
13008 || bytemode == evex_half_bcst_xmmq_mode)
13009 {
13010 switch (vex.length)
13011 {
13012 case 128:
13013 case 256:
13014 names = names_xmm;
13015 break;
13016 case 512:
13017 names = names_ymm;
13018 break;
13019 default:
13020 abort ();
13021 }
13022 }
260cd341
LC
13023 else if (bytemode == tmm_mode)
13024 {
13025 modrm.reg = reg;
13026 if (reg >= 8)
13027 {
13028 oappend ("(bad)");
13029 return;
13030 }
13031 names = names_tmm;
13032 }
43234a1e
L
13033 else if (bytemode == ymm_mode)
13034 names = names_ymm;
c0f3af97 13035 else
b9733481
L
13036 names = names_xmm;
13037 oappend (names[reg]);
c608c12e
AM
13038}
13039
252b5132 13040static void
26ca5450 13041OP_EM (int bytemode, int sizeflag)
252b5132 13042{
b9733481
L
13043 int reg;
13044 const char **names;
13045
7967e09e 13046 if (modrm.mod != 3)
252b5132 13047 {
b6169b20
L
13048 if (intel_syntax
13049 && (bytemode == v_mode || bytemode == v_swap_mode))
9306ca4a
JB
13050 {
13051 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
13052 used_prefixes |= (prefixes & PREFIX_DATA);
6c067bbb 13053 }
252b5132
RH
13054 OP_E (bytemode, sizeflag);
13055 return;
13056 }
13057
b6169b20
L
13058 if ((sizeflag & SUFFIX_ALWAYS) && bytemode == v_swap_mode)
13059 swap_operand ();
13060
6608db57 13061 /* Skip mod/rm byte. */
4bba6815 13062 MODRM_CHECK;
252b5132 13063 codep++;
041bd2e0 13064 used_prefixes |= (prefixes & PREFIX_DATA);
b9733481 13065 reg = modrm.rm;
041bd2e0 13066 if (prefixes & PREFIX_DATA)
20f0a1fc 13067 {
b9733481 13068 names = names_xmm;
161a04f6
L
13069 USED_REX (REX_B);
13070 if (rex & REX_B)
b9733481 13071 reg += 8;
20f0a1fc 13072 }
041bd2e0 13073 else
b9733481
L
13074 names = names_mm;
13075 oappend (names[reg]);
252b5132
RH
13076}
13077
246c51aa
L
13078/* cvt* are the only instructions in sse2 which have
13079 both SSE and MMX operands and also have 0x66 prefix
13080 in their opcode. 0x66 was originally used to differentiate
13081 between SSE and MMX instruction(operands). So we have to handle the
4d9567e0
MM
13082 cvt* separately using OP_EMC and OP_MXC */
13083static void
13084OP_EMC (int bytemode, int sizeflag)
13085{
7967e09e 13086 if (modrm.mod != 3)
4d9567e0
MM
13087 {
13088 if (intel_syntax && bytemode == v_mode)
13089 {
13090 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
13091 used_prefixes |= (prefixes & PREFIX_DATA);
6c067bbb 13092 }
4d9567e0
MM
13093 OP_E (bytemode, sizeflag);
13094 return;
13095 }
246c51aa 13096
4d9567e0
MM
13097 /* Skip mod/rm byte. */
13098 MODRM_CHECK;
13099 codep++;
13100 used_prefixes |= (prefixes & PREFIX_DATA);
b9733481 13101 oappend (names_mm[modrm.rm]);
4d9567e0
MM
13102}
13103
13104static void
13105OP_MXC (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13106{
13107 used_prefixes |= (prefixes & PREFIX_DATA);
b9733481 13108 oappend (names_mm[modrm.reg]);
4d9567e0
MM
13109}
13110
c608c12e 13111static void
26ca5450 13112OP_EX (int bytemode, int sizeflag)
c608c12e 13113{
b9733481
L
13114 int reg;
13115 const char **names;
d6f574e0
L
13116
13117 /* Skip mod/rm byte. */
13118 MODRM_CHECK;
13119 codep++;
13120
7967e09e 13121 if (modrm.mod != 3)
c608c12e 13122 {
c1e679ec 13123 OP_E_memory (bytemode, sizeflag);
c608c12e
AM
13124 return;
13125 }
d6f574e0 13126
b9733481 13127 reg = modrm.rm;
161a04f6
L
13128 USED_REX (REX_B);
13129 if (rex & REX_B)
b9733481 13130 reg += 8;
43234a1e
L
13131 if (vex.evex)
13132 {
13133 USED_REX (REX_X);
13134 if ((rex & REX_X))
13135 reg += 16;
13136 }
c608c12e 13137
b6169b20 13138 if ((sizeflag & SUFFIX_ALWAYS)
fa99fab2
L
13139 && (bytemode == x_swap_mode
13140 || bytemode == d_swap_mode
41f5efc6 13141 || bytemode == q_swap_mode))
b6169b20
L
13142 swap_operand ();
13143
c0f3af97
L
13144 if (need_vex
13145 && bytemode != xmm_mode
6c30d220
L
13146 && bytemode != xmmdw_mode
13147 && bytemode != xmmqd_mode
13148 && bytemode != xmm_mb_mode
13149 && bytemode != xmm_mw_mode
13150 && bytemode != xmm_md_mode
13151 && bytemode != xmm_mq_mode
539f890d 13152 && bytemode != xmmq_mode
43234a1e
L
13153 && bytemode != evex_half_bcst_xmmq_mode
13154 && bytemode != ymm_mode
260cd341 13155 && bytemode != tmm_mode
1c480963 13156 && bytemode != vex_scalar_w_dq_mode)
c0f3af97
L
13157 {
13158 switch (vex.length)
13159 {
13160 case 128:
b9733481 13161 names = names_xmm;
c0f3af97
L
13162 break;
13163 case 256:
b9733481 13164 names = names_ymm;
c0f3af97 13165 break;
43234a1e
L
13166 case 512:
13167 names = names_zmm;
13168 break;
c0f3af97
L
13169 default:
13170 abort ();
13171 }
13172 }
43234a1e
L
13173 else if (bytemode == xmmq_mode
13174 || bytemode == evex_half_bcst_xmmq_mode)
13175 {
13176 switch (vex.length)
13177 {
13178 case 128:
13179 case 256:
13180 names = names_xmm;
13181 break;
13182 case 512:
13183 names = names_ymm;
13184 break;
13185 default:
13186 abort ();
13187 }
13188 }
260cd341
LC
13189 else if (bytemode == tmm_mode)
13190 {
13191 modrm.rm = reg;
13192 if (reg >= 8)
13193 {
13194 oappend ("(bad)");
13195 return;
13196 }
13197 names = names_tmm;
13198 }
43234a1e
L
13199 else if (bytemode == ymm_mode)
13200 names = names_ymm;
c0f3af97 13201 else
b9733481
L
13202 names = names_xmm;
13203 oappend (names[reg]);
c608c12e
AM
13204}
13205
252b5132 13206static void
26ca5450 13207OP_MS (int bytemode, int sizeflag)
252b5132 13208{
7967e09e 13209 if (modrm.mod == 3)
2da11e11
AM
13210 OP_EM (bytemode, sizeflag);
13211 else
6608db57 13212 BadOp ();
252b5132
RH
13213}
13214
992aaec9 13215static void
26ca5450 13216OP_XS (int bytemode, int sizeflag)
992aaec9 13217{
7967e09e 13218 if (modrm.mod == 3)
992aaec9
AM
13219 OP_EX (bytemode, sizeflag);
13220 else
6608db57 13221 BadOp ();
992aaec9
AM
13222}
13223
cc0ec051
AM
13224static void
13225OP_M (int bytemode, int sizeflag)
13226{
7967e09e 13227 if (modrm.mod == 3)
75413a22
L
13228 /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
13229 BadOp ();
cc0ec051
AM
13230 else
13231 OP_E (bytemode, sizeflag);
13232}
13233
13234static void
13235OP_0f07 (int bytemode, int sizeflag)
13236{
7967e09e 13237 if (modrm.mod != 3 || modrm.rm != 0)
cc0ec051
AM
13238 BadOp ();
13239 else
13240 OP_E (bytemode, sizeflag);
13241}
13242
46e883c5 13243/* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
246c51aa 13244 32bit mode and "xchg %rax,%rax" in 64bit mode. */
46e883c5 13245
cc0ec051 13246static void
46e883c5 13247NOP_Fixup1 (int bytemode, int sizeflag)
cc0ec051 13248{
8b38ad71
L
13249 if ((prefixes & PREFIX_DATA) != 0
13250 || (rex != 0
13251 && rex != 0x48
13252 && address_mode == mode_64bit))
46e883c5
L
13253 OP_REG (bytemode, sizeflag);
13254 else
13255 strcpy (obuf, "nop");
13256}
13257
13258static void
13259NOP_Fixup2 (int bytemode, int sizeflag)
13260{
8b38ad71
L
13261 if ((prefixes & PREFIX_DATA) != 0
13262 || (rex != 0
13263 && rex != 0x48
13264 && address_mode == mode_64bit))
46e883c5 13265 OP_IMREG (bytemode, sizeflag);
cc0ec051
AM
13266}
13267
84037f8c 13268static const char *const Suffix3DNow[] = {
252b5132
RH
13269/* 00 */ NULL, NULL, NULL, NULL,
13270/* 04 */ NULL, NULL, NULL, NULL,
13271/* 08 */ NULL, NULL, NULL, NULL,
9e525108 13272/* 0C */ "pi2fw", "pi2fd", NULL, NULL,
252b5132
RH
13273/* 10 */ NULL, NULL, NULL, NULL,
13274/* 14 */ NULL, NULL, NULL, NULL,
13275/* 18 */ NULL, NULL, NULL, NULL,
9e525108 13276/* 1C */ "pf2iw", "pf2id", NULL, NULL,
252b5132
RH
13277/* 20 */ NULL, NULL, NULL, NULL,
13278/* 24 */ NULL, NULL, NULL, NULL,
13279/* 28 */ NULL, NULL, NULL, NULL,
13280/* 2C */ NULL, NULL, NULL, NULL,
13281/* 30 */ NULL, NULL, NULL, NULL,
13282/* 34 */ NULL, NULL, NULL, NULL,
13283/* 38 */ NULL, NULL, NULL, NULL,
13284/* 3C */ NULL, NULL, NULL, NULL,
13285/* 40 */ NULL, NULL, NULL, NULL,
13286/* 44 */ NULL, NULL, NULL, NULL,
13287/* 48 */ NULL, NULL, NULL, NULL,
13288/* 4C */ NULL, NULL, NULL, NULL,
13289/* 50 */ NULL, NULL, NULL, NULL,
13290/* 54 */ NULL, NULL, NULL, NULL,
13291/* 58 */ NULL, NULL, NULL, NULL,
13292/* 5C */ NULL, NULL, NULL, NULL,
13293/* 60 */ NULL, NULL, NULL, NULL,
13294/* 64 */ NULL, NULL, NULL, NULL,
13295/* 68 */ NULL, NULL, NULL, NULL,
13296/* 6C */ NULL, NULL, NULL, NULL,
13297/* 70 */ NULL, NULL, NULL, NULL,
13298/* 74 */ NULL, NULL, NULL, NULL,
13299/* 78 */ NULL, NULL, NULL, NULL,
13300/* 7C */ NULL, NULL, NULL, NULL,
13301/* 80 */ NULL, NULL, NULL, NULL,
13302/* 84 */ NULL, NULL, NULL, NULL,
9e525108
AM
13303/* 88 */ NULL, NULL, "pfnacc", NULL,
13304/* 8C */ NULL, NULL, "pfpnacc", NULL,
252b5132
RH
13305/* 90 */ "pfcmpge", NULL, NULL, NULL,
13306/* 94 */ "pfmin", NULL, "pfrcp", "pfrsqrt",
13307/* 98 */ NULL, NULL, "pfsub", NULL,
13308/* 9C */ NULL, NULL, "pfadd", NULL,
13309/* A0 */ "pfcmpgt", NULL, NULL, NULL,
13310/* A4 */ "pfmax", NULL, "pfrcpit1", "pfrsqit1",
13311/* A8 */ NULL, NULL, "pfsubr", NULL,
13312/* AC */ NULL, NULL, "pfacc", NULL,
13313/* B0 */ "pfcmpeq", NULL, NULL, NULL,
9beff690 13314/* B4 */ "pfmul", NULL, "pfrcpit2", "pmulhrw",
9e525108 13315/* B8 */ NULL, NULL, NULL, "pswapd",
252b5132
RH
13316/* BC */ NULL, NULL, NULL, "pavgusb",
13317/* C0 */ NULL, NULL, NULL, NULL,
13318/* C4 */ NULL, NULL, NULL, NULL,
13319/* C8 */ NULL, NULL, NULL, NULL,
13320/* CC */ NULL, NULL, NULL, NULL,
13321/* D0 */ NULL, NULL, NULL, NULL,
13322/* D4 */ NULL, NULL, NULL, NULL,
13323/* D8 */ NULL, NULL, NULL, NULL,
13324/* DC */ NULL, NULL, NULL, NULL,
13325/* E0 */ NULL, NULL, NULL, NULL,
13326/* E4 */ NULL, NULL, NULL, NULL,
13327/* E8 */ NULL, NULL, NULL, NULL,
13328/* EC */ NULL, NULL, NULL, NULL,
13329/* F0 */ NULL, NULL, NULL, NULL,
13330/* F4 */ NULL, NULL, NULL, NULL,
13331/* F8 */ NULL, NULL, NULL, NULL,
13332/* FC */ NULL, NULL, NULL, NULL,
13333};
13334
13335static void
26ca5450 13336OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132
RH
13337{
13338 const char *mnemonic;
13339
13340 FETCH_DATA (the_info, codep + 1);
13341 /* AMD 3DNow! instructions are specified by an opcode suffix in the
13342 place where an 8-bit immediate would normally go. ie. the last
13343 byte of the instruction. */
ea397f5b 13344 obufp = mnemonicendp;
c608c12e 13345 mnemonic = Suffix3DNow[*codep++ & 0xff];
252b5132 13346 if (mnemonic)
2da11e11 13347 oappend (mnemonic);
252b5132
RH
13348 else
13349 {
13350 /* Since a variable sized modrm/sib chunk is between the start
13351 of the opcode (0x0f0f) and the opcode suffix, we need to do
13352 all the modrm processing first, and don't know until now that
13353 we have a bad opcode. This necessitates some cleaning up. */
ce518a5f
L
13354 op_out[0][0] = '\0';
13355 op_out[1][0] = '\0';
6608db57 13356 BadOp ();
252b5132 13357 }
ea397f5b 13358 mnemonicendp = obufp;
252b5132 13359}
c608c12e 13360
c4de7606 13361static const struct op simd_cmp_op[] =
ea397f5b
L
13362{
13363 { STRING_COMMA_LEN ("eq") },
13364 { STRING_COMMA_LEN ("lt") },
13365 { STRING_COMMA_LEN ("le") },
13366 { STRING_COMMA_LEN ("unord") },
13367 { STRING_COMMA_LEN ("neq") },
13368 { STRING_COMMA_LEN ("nlt") },
13369 { STRING_COMMA_LEN ("nle") },
13370 { STRING_COMMA_LEN ("ord") }
c608c12e
AM
13371};
13372
c4de7606
JB
13373static const struct op vex_cmp_op[] =
13374{
13375 { STRING_COMMA_LEN ("eq_uq") },
13376 { STRING_COMMA_LEN ("nge") },
13377 { STRING_COMMA_LEN ("ngt") },
13378 { STRING_COMMA_LEN ("false") },
13379 { STRING_COMMA_LEN ("neq_oq") },
13380 { STRING_COMMA_LEN ("ge") },
13381 { STRING_COMMA_LEN ("gt") },
13382 { STRING_COMMA_LEN ("true") },
13383 { STRING_COMMA_LEN ("eq_os") },
13384 { STRING_COMMA_LEN ("lt_oq") },
13385 { STRING_COMMA_LEN ("le_oq") },
13386 { STRING_COMMA_LEN ("unord_s") },
13387 { STRING_COMMA_LEN ("neq_us") },
13388 { STRING_COMMA_LEN ("nlt_uq") },
13389 { STRING_COMMA_LEN ("nle_uq") },
13390 { STRING_COMMA_LEN ("ord_s") },
13391 { STRING_COMMA_LEN ("eq_us") },
13392 { STRING_COMMA_LEN ("nge_uq") },
13393 { STRING_COMMA_LEN ("ngt_uq") },
13394 { STRING_COMMA_LEN ("false_os") },
13395 { STRING_COMMA_LEN ("neq_os") },
13396 { STRING_COMMA_LEN ("ge_oq") },
13397 { STRING_COMMA_LEN ("gt_oq") },
13398 { STRING_COMMA_LEN ("true_us") },
13399};
13400
c608c12e 13401static void
ad19981d 13402CMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
c608c12e
AM
13403{
13404 unsigned int cmp_type;
13405
13406 FETCH_DATA (the_info, codep + 1);
13407 cmp_type = *codep++ & 0xff;
c0f3af97 13408 if (cmp_type < ARRAY_SIZE (simd_cmp_op))
c608c12e 13409 {
ad19981d 13410 char suffix [3];
ea397f5b 13411 char *p = mnemonicendp - 2;
ad19981d
L
13412 suffix[0] = p[0];
13413 suffix[1] = p[1];
13414 suffix[2] = '\0';
ea397f5b
L
13415 sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
13416 mnemonicendp += simd_cmp_op[cmp_type].len;
c608c12e 13417 }
c4de7606
JB
13418 else if (need_vex
13419 && cmp_type < ARRAY_SIZE (simd_cmp_op) + ARRAY_SIZE (vex_cmp_op))
13420 {
13421 char suffix [3];
13422 char *p = mnemonicendp - 2;
13423 suffix[0] = p[0];
13424 suffix[1] = p[1];
13425 suffix[2] = '\0';
13426 cmp_type -= ARRAY_SIZE (simd_cmp_op);
13427 sprintf (p, "%s%s", vex_cmp_op[cmp_type].name, suffix);
13428 mnemonicendp += vex_cmp_op[cmp_type].len;
13429 }
c608c12e
AM
13430 else
13431 {
ad19981d
L
13432 /* We have a reserved extension byte. Output it directly. */
13433 scratchbuf[0] = '$';
13434 print_operand_value (scratchbuf + 1, 1, cmp_type);
9ce09ba2 13435 oappend_maybe_intel (scratchbuf);
ad19981d 13436 scratchbuf[0] = '\0';
c608c12e
AM
13437 }
13438}
13439
9916071f 13440static void
7abb8d81 13441OP_Mwait (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
9916071f 13442{
7abb8d81 13443 /* mwait %eax,%ecx / mwaitx %eax,%ecx,%ebx */
b844680a
L
13444 if (!intel_syntax)
13445 {
081e283f
JB
13446 strcpy (op_out[0], names32[0]);
13447 strcpy (op_out[1], names32[1]);
7abb8d81 13448 if (bytemode == eBX_reg)
081e283f 13449 strcpy (op_out[2], names32[3]);
b844680a
L
13450 two_source_ops = 1;
13451 }
13452 /* Skip mod/rm byte. */
13453 MODRM_CHECK;
13454 codep++;
13455}
13456
13457static void
13458OP_Monitor (int bytemode ATTRIBUTE_UNUSED,
13459 int sizeflag ATTRIBUTE_UNUSED)
ca164297 13460{
081e283f 13461 /* monitor %{e,r,}ax,%ecx,%edx" */
b844680a 13462 if (!intel_syntax)
ca164297 13463 {
cb712a9e
L
13464 const char **names = (address_mode == mode_64bit
13465 ? names64 : names32);
1d9f512f 13466
081e283f 13467 if (prefixes & PREFIX_ADDR)
ca164297 13468 {
b844680a 13469 /* Remove "addr16/addr32". */
f16cd0d5 13470 all_prefixes[last_addr_prefix] = 0;
081e283f
JB
13471 names = (address_mode != mode_32bit
13472 ? names32 : names16);
b844680a 13473 used_prefixes |= PREFIX_ADDR;
ca164297 13474 }
081e283f
JB
13475 else if (address_mode == mode_16bit)
13476 names = names16;
13477 strcpy (op_out[0], names[0]);
13478 strcpy (op_out[1], names32[1]);
13479 strcpy (op_out[2], names32[2]);
b844680a 13480 two_source_ops = 1;
ca164297 13481 }
b844680a
L
13482 /* Skip mod/rm byte. */
13483 MODRM_CHECK;
13484 codep++;
30123838
JB
13485}
13486
6608db57
KH
13487static void
13488BadOp (void)
2da11e11 13489{
6608db57
KH
13490 /* Throw away prefixes and 1st. opcode byte. */
13491 codep = insn_codep + 1;
2da11e11
AM
13492 oappend ("(bad)");
13493}
4cc91dba 13494
35c52694
L
13495static void
13496REP_Fixup (int bytemode, int sizeflag)
13497{
13498 /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
13499 lods and stos. */
35c52694 13500 if (prefixes & PREFIX_REPZ)
f16cd0d5 13501 all_prefixes[last_repz_prefix] = REP_PREFIX;
35c52694
L
13502
13503 switch (bytemode)
13504 {
13505 case al_reg:
13506 case eAX_reg:
13507 case indir_dx_reg:
13508 OP_IMREG (bytemode, sizeflag);
13509 break;
13510 case eDI_reg:
13511 OP_ESreg (bytemode, sizeflag);
13512 break;
13513 case eSI_reg:
13514 OP_DSreg (bytemode, sizeflag);
13515 break;
13516 default:
13517 abort ();
13518 break;
13519 }
13520}
f5804c90 13521
d835a58b
JB
13522static void
13523SEP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13524{
13525 if ( isa64 != amd64 )
13526 return;
13527
13528 obufp = obuf;
13529 BadOp ();
13530 mnemonicendp = obufp;
13531 ++codep;
13532}
13533
7e8b059b
L
13534/* For BND-prefixed instructions 0xF2 prefix should be displayed as
13535 "bnd". */
13536
13537static void
13538BND_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13539{
13540 if (prefixes & PREFIX_REPNZ)
13541 all_prefixes[last_repnz_prefix] = BND_PREFIX;
13542}
13543
04ef582a
L
13544/* For NOTRACK-prefixed instructions, 0x3E prefix should be displayed as
13545 "notrack". */
13546
13547static void
13548NOTRACK_Fixup (int bytemode ATTRIBUTE_UNUSED,
13549 int sizeflag ATTRIBUTE_UNUSED)
13550{
0fa0fc85
BP
13551
13552 /* Since active_seg_prefix is not set in 64-bit mode, check whether
13553 we've seen a PREFIX_DS. */
13554 if ((prefixes & PREFIX_DS) != 0
04ef582a
L
13555 && (address_mode != mode_64bit || last_data_prefix < 0))
13556 {
4e9ac44a 13557 /* NOTRACK prefix is only valid on indirect branch instructions.
9fef80d6 13558 NB: DATA prefix is unsupported for Intel64. */
04ef582a
L
13559 active_seg_prefix = 0;
13560 all_prefixes[last_seg_prefix] = NOTRACK_PREFIX;
13561 }
13562}
13563
42164a71
L
13564/* Similar to OP_E. But the 0xf2/0xf3 prefixes should be displayed as
13565 "xacquire"/"xrelease" for memory operand if there is a LOCK prefix.
13566 */
13567
13568static void
13569HLE_Fixup1 (int bytemode, int sizeflag)
13570{
13571 if (modrm.mod != 3
13572 && (prefixes & PREFIX_LOCK) != 0)
13573 {
13574 if (prefixes & PREFIX_REPZ)
13575 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
13576 if (prefixes & PREFIX_REPNZ)
13577 all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
13578 }
13579
13580 OP_E (bytemode, sizeflag);
13581}
13582
13583/* Similar to OP_E. But the 0xf2/0xf3 prefixes should be displayed as
13584 "xacquire"/"xrelease" for memory operand. No check for LOCK prefix.
13585 */
13586
13587static void
13588HLE_Fixup2 (int bytemode, int sizeflag)
13589{
13590 if (modrm.mod != 3)
13591 {
13592 if (prefixes & PREFIX_REPZ)
13593 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
13594 if (prefixes & PREFIX_REPNZ)
13595 all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
13596 }
13597
13598 OP_E (bytemode, sizeflag);
13599}
13600
13601/* Similar to OP_E. But the 0xf3 prefixes should be displayed as
13602 "xrelease" for memory operand. No check for LOCK prefix. */
13603
13604static void
13605HLE_Fixup3 (int bytemode, int sizeflag)
13606{
13607 if (modrm.mod != 3
13608 && last_repz_prefix > last_repnz_prefix
13609 && (prefixes & PREFIX_REPZ) != 0)
13610 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
13611
13612 OP_E (bytemode, sizeflag);
13613}
13614
f5804c90
L
13615static void
13616CMPXCHG8B_Fixup (int bytemode, int sizeflag)
13617{
161a04f6
L
13618 USED_REX (REX_W);
13619 if (rex & REX_W)
f5804c90
L
13620 {
13621 /* Change cmpxchg8b to cmpxchg16b. */
ea397f5b
L
13622 char *p = mnemonicendp - 2;
13623 mnemonicendp = stpcpy (p, "16b");
fb9c77c7 13624 bytemode = o_mode;
f5804c90 13625 }
42164a71
L
13626 else if ((prefixes & PREFIX_LOCK) != 0)
13627 {
13628 if (prefixes & PREFIX_REPZ)
13629 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
13630 if (prefixes & PREFIX_REPNZ)
13631 all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
13632 }
13633
f5804c90
L
13634 OP_M (bytemode, sizeflag);
13635}
42903f7f
L
13636
13637static void
13638XMM_Fixup (int reg, int sizeflag ATTRIBUTE_UNUSED)
13639{
b9733481
L
13640 const char **names;
13641
c0f3af97
L
13642 if (need_vex)
13643 {
13644 switch (vex.length)
13645 {
13646 case 128:
b9733481 13647 names = names_xmm;
c0f3af97
L
13648 break;
13649 case 256:
b9733481 13650 names = names_ymm;
c0f3af97
L
13651 break;
13652 default:
13653 abort ();
13654 }
13655 }
13656 else
b9733481
L
13657 names = names_xmm;
13658 oappend (names[reg]);
42903f7f 13659}
381d071f
L
13660
13661static void
eacc9c89
L
13662FXSAVE_Fixup (int bytemode, int sizeflag)
13663{
13664 /* Add proper suffix to "fxsave" and "fxrstor". */
13665 USED_REX (REX_W);
13666 if (rex & REX_W)
13667 {
13668 char *p = mnemonicendp;
13669 *p++ = '6';
13670 *p++ = '4';
13671 *p = '\0';
13672 mnemonicendp = p;
13673 }
13674 OP_M (bytemode, sizeflag);
15c7c1d8
JB
13675}
13676
c0f3af97
L
13677/* Display the destination register operand for instructions with
13678 VEX. */
13679
13680static void
13681OP_VEX (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13682{
539f890d 13683 int reg;
b9733481
L
13684 const char **names;
13685
c0f3af97
L
13686 if (!need_vex)
13687 abort ();
13688
539f890d 13689 reg = vex.register_specifier;
63c6fc6c 13690 vex.register_specifier = 0;
5f847646
JB
13691 if (address_mode != mode_64bit)
13692 reg &= 7;
13693 else if (vex.evex && !vex.v)
13694 reg += 16;
43234a1e 13695
539f890d
L
13696 if (bytemode == vex_scalar_mode)
13697 {
13698 oappend (names_xmm[reg]);
13699 return;
13700 }
13701
260cd341
LC
13702 if (bytemode == tmm_mode)
13703 {
13704 /* All 3 TMM registers must be distinct. */
13705 if (reg >= 8)
13706 oappend ("(bad)");
13707 else
13708 {
13709 /* This must be the 3rd operand. */
13710 if (obufp != op_out[2])
13711 abort ();
13712 oappend (names_tmm[reg]);
13713 if (reg == modrm.reg || reg == modrm.rm)
13714 strcpy (obufp, "/(bad)");
13715 }
13716
13717 if (modrm.reg == modrm.rm || modrm.reg == reg || modrm.rm == reg)
13718 {
13719 if (modrm.reg <= 8
13720 && (modrm.reg == modrm.rm || modrm.reg == reg))
13721 strcat (op_out[0], "/(bad)");
13722 if (modrm.rm <= 8
13723 && (modrm.rm == modrm.reg || modrm.rm == reg))
13724 strcat (op_out[1], "/(bad)");
13725 }
13726
13727 return;
13728 }
13729
c0f3af97
L
13730 switch (vex.length)
13731 {
13732 case 128:
13733 switch (bytemode)
13734 {
13735 case vex_mode:
6c30d220 13736 case vex_vsib_q_w_dq_mode:
5fc35d96 13737 case vex_vsib_q_w_d_mode:
cb21baef
L
13738 names = names_xmm;
13739 break;
13740 case dq_mode:
390a6789 13741 if (rex & REX_W)
cb21baef
L
13742 names = names64;
13743 else
13744 names = names32;
c0f3af97 13745 break;
1ba585e8 13746 case mask_bd_mode:
43234a1e 13747 case mask_mode:
9889cbb1
L
13748 if (reg > 0x7)
13749 {
13750 oappend ("(bad)");
13751 return;
13752 }
43234a1e
L
13753 names = names_mask;
13754 break;
c0f3af97
L
13755 default:
13756 abort ();
13757 return;
13758 }
c0f3af97
L
13759 break;
13760 case 256:
13761 switch (bytemode)
13762 {
13763 case vex_mode:
6c30d220
L
13764 names = names_ymm;
13765 break;
13766 case vex_vsib_q_w_dq_mode:
5fc35d96 13767 case vex_vsib_q_w_d_mode:
6c30d220 13768 names = vex.w ? names_ymm : names_xmm;
c0f3af97 13769 break;
1ba585e8 13770 case mask_bd_mode:
43234a1e 13771 case mask_mode:
9889cbb1
L
13772 if (reg > 0x7)
13773 {
13774 oappend ("(bad)");
13775 return;
13776 }
43234a1e
L
13777 names = names_mask;
13778 break;
c0f3af97 13779 default:
a37a2806
NC
13780 /* See PR binutils/20893 for a reproducer. */
13781 oappend ("(bad)");
c0f3af97
L
13782 return;
13783 }
c0f3af97 13784 break;
43234a1e
L
13785 case 512:
13786 names = names_zmm;
13787 break;
c0f3af97
L
13788 default:
13789 abort ();
13790 break;
13791 }
539f890d 13792 oappend (names[reg]);
c0f3af97
L
13793}
13794
41f5efc6
JB
13795static void
13796OP_VexR (int bytemode, int sizeflag)
13797{
13798 if (modrm.mod == 3)
13799 OP_VEX (bytemode, sizeflag);
13800}
13801
5dd85c99 13802static void
e6123d0c 13803OP_VexW (int bytemode, int sizeflag)
5dd85c99 13804{
e6123d0c 13805 OP_VEX (bytemode, sizeflag);
5dd85c99 13806
5dd85c99 13807 if (vex.w)
5f847646 13808 {
e6123d0c
JB
13809 /* Swap 2nd and 3rd operands. */
13810 strcpy (scratchbuf, op_out[2]);
13811 strcpy (op_out[2], op_out[1]);
13812 strcpy (op_out[1], scratchbuf);
5f847646 13813 }
5dd85c99
SP
13814}
13815
c0f3af97
L
13816static void
13817OP_REG_VexI4 (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13818{
13819 int reg;
6384fd9e 13820 const char **names = names_xmm;
b9733481 13821
c0f3af97
L
13822 FETCH_DATA (the_info, codep + 1);
13823 reg = *codep++;
13824
6384fd9e 13825 if (bytemode != x_mode && bytemode != scalar_mode)
c0f3af97
L
13826 abort ();
13827
c0f3af97 13828 reg >>= 4;
5f847646
JB
13829 if (address_mode != mode_64bit)
13830 reg &= 7;
dae39acc 13831
6384fd9e
JB
13832 if (bytemode == x_mode && vex.length == 256)
13833 names = names_ymm;
13834
b9733481 13835 oappend (names[reg]);
b13b1bc0
JB
13836
13837 if (vex.w)
13838 {
13839 /* Swap 3rd and 4th operands. */
13840 strcpy (scratchbuf, op_out[3]);
13841 strcpy (op_out[3], op_out[2]);
13842 strcpy (op_out[2], scratchbuf);
13843 }
c0f3af97
L
13844}
13845
922d8de8 13846static void
93abb146
JB
13847OP_VexI4 (int bytemode ATTRIBUTE_UNUSED,
13848 int sizeflag ATTRIBUTE_UNUSED)
922d8de8 13849{
93abb146
JB
13850 scratchbuf[0] = '$';
13851 print_operand_value (scratchbuf + 1, 1, codep[-1] & 0xf);
13852 oappend_maybe_intel (scratchbuf);
922d8de8
DR
13853}
13854
43234a1e
L
13855static void
13856VPCMP_Fixup (int bytemode ATTRIBUTE_UNUSED,
13857 int sizeflag ATTRIBUTE_UNUSED)
13858{
13859 unsigned int cmp_type;
13860
13861 if (!vex.evex)
13862 abort ();
13863
13864 FETCH_DATA (the_info, codep + 1);
13865 cmp_type = *codep++ & 0xff;
13866 /* There are aliases for immediates 0, 1, 2, 4, 5, 6.
13867 If it's the case, print suffix, otherwise - print the immediate. */
13868 if (cmp_type < ARRAY_SIZE (simd_cmp_op)
13869 && cmp_type != 3
13870 && cmp_type != 7)
13871 {
13872 char suffix [3];
13873 char *p = mnemonicendp - 2;
13874
13875 /* vpcmp* can have both one- and two-lettered suffix. */
13876 if (p[0] == 'p')
13877 {
13878 p++;
13879 suffix[0] = p[0];
13880 suffix[1] = '\0';
13881 }
13882 else
13883 {
13884 suffix[0] = p[0];
13885 suffix[1] = p[1];
13886 suffix[2] = '\0';
13887 }
13888
13889 sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
13890 mnemonicendp += simd_cmp_op[cmp_type].len;
13891 }
be92cb14
JB
13892 else
13893 {
13894 /* We have a reserved extension byte. Output it directly. */
13895 scratchbuf[0] = '$';
13896 print_operand_value (scratchbuf + 1, 1, cmp_type);
13897 oappend_maybe_intel (scratchbuf);
13898 scratchbuf[0] = '\0';
13899 }
13900}
13901
13902static const struct op xop_cmp_op[] =
13903{
13904 { STRING_COMMA_LEN ("lt") },
13905 { STRING_COMMA_LEN ("le") },
13906 { STRING_COMMA_LEN ("gt") },
13907 { STRING_COMMA_LEN ("ge") },
13908 { STRING_COMMA_LEN ("eq") },
13909 { STRING_COMMA_LEN ("neq") },
13910 { STRING_COMMA_LEN ("false") },
13911 { STRING_COMMA_LEN ("true") }
13912};
13913
13914static void
13915VPCOM_Fixup (int bytemode ATTRIBUTE_UNUSED,
13916 int sizeflag ATTRIBUTE_UNUSED)
13917{
13918 unsigned int cmp_type;
13919
13920 FETCH_DATA (the_info, codep + 1);
13921 cmp_type = *codep++ & 0xff;
13922 if (cmp_type < ARRAY_SIZE (xop_cmp_op))
13923 {
13924 char suffix[3];
13925 char *p = mnemonicendp - 2;
13926
13927 /* vpcom* can have both one- and two-lettered suffix. */
13928 if (p[0] == 'm')
13929 {
13930 p++;
13931 suffix[0] = p[0];
13932 suffix[1] = '\0';
13933 }
13934 else
13935 {
13936 suffix[0] = p[0];
13937 suffix[1] = p[1];
13938 suffix[2] = '\0';
13939 }
13940
13941 sprintf (p, "%s%s", xop_cmp_op[cmp_type].name, suffix);
13942 mnemonicendp += xop_cmp_op[cmp_type].len;
13943 }
43234a1e
L
13944 else
13945 {
13946 /* We have a reserved extension byte. Output it directly. */
13947 scratchbuf[0] = '$';
13948 print_operand_value (scratchbuf + 1, 1, cmp_type);
9ce09ba2 13949 oappend_maybe_intel (scratchbuf);
43234a1e
L
13950 scratchbuf[0] = '\0';
13951 }
13952}
13953
ea397f5b
L
13954static const struct op pclmul_op[] =
13955{
13956 { STRING_COMMA_LEN ("lql") },
13957 { STRING_COMMA_LEN ("hql") },
13958 { STRING_COMMA_LEN ("lqh") },
13959 { STRING_COMMA_LEN ("hqh") }
c0f3af97
L
13960};
13961
13962static void
13963PCLMUL_Fixup (int bytemode ATTRIBUTE_UNUSED,
13964 int sizeflag ATTRIBUTE_UNUSED)
13965{
13966 unsigned int pclmul_type;
13967
13968 FETCH_DATA (the_info, codep + 1);
13969 pclmul_type = *codep++ & 0xff;
13970 switch (pclmul_type)
13971 {
13972 case 0x10:
13973 pclmul_type = 2;
13974 break;
13975 case 0x11:
13976 pclmul_type = 3;
13977 break;
13978 default:
13979 break;
7bb15c6f 13980 }
c0f3af97
L
13981 if (pclmul_type < ARRAY_SIZE (pclmul_op))
13982 {
13983 char suffix [4];
ea397f5b 13984 char *p = mnemonicendp - 3;
c0f3af97
L
13985 suffix[0] = p[0];
13986 suffix[1] = p[1];
13987 suffix[2] = p[2];
13988 suffix[3] = '\0';
ea397f5b
L
13989 sprintf (p, "%s%s", pclmul_op[pclmul_type].name, suffix);
13990 mnemonicendp += pclmul_op[pclmul_type].len;
c0f3af97
L
13991 }
13992 else
13993 {
13994 /* We have a reserved extension byte. Output it directly. */
13995 scratchbuf[0] = '$';
13996 print_operand_value (scratchbuf + 1, 1, pclmul_type);
9ce09ba2 13997 oappend_maybe_intel (scratchbuf);
c0f3af97
L
13998 scratchbuf[0] = '\0';
13999 }
14000}
14001
bc31405e
L
14002static void
14003MOVSXD_Fixup (int bytemode, int sizeflag)
14004{
14005 /* Add proper suffix to "movsxd". */
14006 char *p = mnemonicendp;
14007
14008 switch (bytemode)
14009 {
14010 case movsxd_mode:
14011 if (intel_syntax)
14012 {
14013 *p++ = 'x';
14014 *p++ = 'd';
14015 goto skip;
14016 }
14017
14018 USED_REX (REX_W);
14019 if (rex & REX_W)
14020 {
14021 *p++ = 'l';
14022 *p++ = 'q';
14023 }
14024 else
14025 {
14026 *p++ = 'x';
14027 *p++ = 'd';
14028 }
14029 break;
14030 default:
14031 oappend (INTERNAL_DISASSEMBLER_ERROR);
14032 break;
14033 }
14034
dc1e8a47 14035 skip:
bc31405e
L
14036 mnemonicendp = p;
14037 *p = '\0';
14038 OP_E (bytemode, sizeflag);
14039}
14040
43234a1e
L
14041static void
14042OP_Mask (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
14043{
14044 if (!vex.evex
1ba585e8 14045 || (bytemode != mask_mode && bytemode != mask_bd_mode))
43234a1e
L
14046 abort ();
14047
14048 USED_REX (REX_R);
14049 if ((rex & REX_R) != 0 || !vex.r)
14050 {
14051 BadOp ();
14052 return;
14053 }
14054
14055 oappend (names_mask [modrm.reg]);
14056}
14057
14058static void
14059OP_Rounding (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
14060{
43234a1e
L
14061 if (modrm.mod == 3 && vex.b)
14062 switch (bytemode)
14063 {
70df6fc9
L
14064 case evex_rounding_64_mode:
14065 if (address_mode != mode_64bit)
14066 {
14067 oappend ("(bad)");
14068 break;
14069 }
14070 /* Fall through. */
43234a1e
L
14071 case evex_rounding_mode:
14072 oappend (names_rounding[vex.ll]);
14073 break;
14074 case evex_sae_mode:
14075 oappend ("{sae}");
14076 break;
14077 default:
6df22cf6 14078 abort ();
43234a1e
L
14079 break;
14080 }
14081}
This page took 2.862487 seconds and 4 git commands to generate.