PE image base fallout
[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
L
413#define MVexVSIBDWpX { OP_M, vex_vsib_d_w_dq_mode }
414#define MVexVSIBQWpX { OP_M, vex_vsib_q_w_dq_mode }
415
260cd341
LC
416#define MVexSIBMEM { OP_M, vex_sibmem_mode }
417
35c52694 418/* Used handle "rep" prefix for string instructions. */
ce518a5f
L
419#define Xbr { REP_Fixup, eSI_reg }
420#define Xvr { REP_Fixup, eSI_reg }
421#define Ybr { REP_Fixup, eDI_reg }
422#define Yvr { REP_Fixup, eDI_reg }
423#define Yzr { REP_Fixup, eDI_reg }
424#define indirDXr { REP_Fixup, indir_dx_reg }
425#define ALr { REP_Fixup, al_reg }
426#define eAXr { REP_Fixup, eAX_reg }
427
42164a71
L
428/* Used handle HLE prefix for lockable instructions. */
429#define Ebh1 { HLE_Fixup1, b_mode }
430#define Evh1 { HLE_Fixup1, v_mode }
431#define Ebh2 { HLE_Fixup2, b_mode }
432#define Evh2 { HLE_Fixup2, v_mode }
433#define Ebh3 { HLE_Fixup3, b_mode }
434#define Evh3 { HLE_Fixup3, v_mode }
435
7e8b059b 436#define BND { BND_Fixup, 0 }
04ef582a 437#define NOTRACK { NOTRACK_Fixup, 0 }
7e8b059b 438
ce518a5f
L
439#define cond_jump_flag { NULL, cond_jump_mode }
440#define loop_jcxz_flag { NULL, loop_jcxz_mode }
3ffd33cf 441
252b5132 442/* bits in sizeflag */
252b5132 443#define SUFFIX_ALWAYS 4
252b5132
RH
444#define AFLAG 2
445#define DFLAG 1
446
51e7da1b
L
447enum
448{
449 /* byte operand */
450 b_mode = 1,
451 /* byte operand with operand swapped */
3873ba12 452 b_swap_mode,
e3949f17
L
453 /* byte operand, sign extend like 'T' suffix */
454 b_T_mode,
51e7da1b 455 /* operand size depends on prefixes */
3873ba12 456 v_mode,
51e7da1b 457 /* operand size depends on prefixes with operand swapped */
3873ba12 458 v_swap_mode,
de89d0a3
IT
459 /* operand size depends on address prefix */
460 va_mode,
51e7da1b 461 /* word operand */
3873ba12 462 w_mode,
51e7da1b 463 /* double word operand */
3873ba12 464 d_mode,
51e7da1b 465 /* double word operand with operand swapped */
3873ba12 466 d_swap_mode,
51e7da1b 467 /* quad word operand */
3873ba12 468 q_mode,
51e7da1b 469 /* quad word operand with operand swapped */
3873ba12 470 q_swap_mode,
51e7da1b 471 /* ten-byte operand */
3873ba12 472 t_mode,
43234a1e
L
473 /* 16-byte XMM, 32-byte YMM or 64-byte ZMM operand. In EVEX with
474 broadcast enabled. */
3873ba12 475 x_mode,
43234a1e
L
476 /* Similar to x_mode, but with different EVEX mem shifts. */
477 evex_x_gscat_mode,
4726e9a4
JB
478 /* Similar to x_mode, but with yet different EVEX mem shifts. */
479 bw_unit_mode,
43234a1e
L
480 /* Similar to x_mode, but with disabled broadcast. */
481 evex_x_nobcst_mode,
482 /* Similar to x_mode, but with operands swapped and disabled broadcast
483 in EVEX. */
3873ba12 484 x_swap_mode,
51e7da1b 485 /* 16-byte XMM operand */
3873ba12 486 xmm_mode,
43234a1e
L
487 /* XMM, XMM or YMM register operand, or quad word, xmmword or ymmword
488 memory operand (depending on vector length). Broadcast isn't
489 allowed. */
3873ba12 490 xmmq_mode,
43234a1e
L
491 /* Same as xmmq_mode, but broadcast is allowed. */
492 evex_half_bcst_xmmq_mode,
6c30d220
L
493 /* XMM register or byte memory operand */
494 xmm_mb_mode,
495 /* XMM register or word memory operand */
496 xmm_mw_mode,
497 /* XMM register or double word memory operand */
498 xmm_md_mode,
499 /* XMM register or quad word memory operand */
500 xmm_mq_mode,
43234a1e 501 /* 16-byte XMM, word, double word or quad word operand. */
6c30d220 502 xmmdw_mode,
43234a1e 503 /* 16-byte XMM, double word, quad word operand or xmm word operand. */
6c30d220 504 xmmqd_mode,
43234a1e
L
505 /* 32-byte YMM operand */
506 ymm_mode,
507 /* quad word, ymmword or zmmword memory operand. */
3873ba12 508 ymmq_mode,
6c30d220
L
509 /* 32-byte YMM or 16-byte word operand */
510 ymmxmm_mode,
260cd341
LC
511 /* TMM operand */
512 tmm_mode,
51e7da1b 513 /* d_mode in 32bit, q_mode in 64bit mode. */
3873ba12 514 m_mode,
51e7da1b 515 /* pair of v_mode operands */
3873ba12
L
516 a_mode,
517 cond_jump_mode,
518 loop_jcxz_mode,
bc31405e 519 movsxd_mode,
7e8b059b 520 v_bnd_mode,
d276ec69
JB
521 /* like v_bnd_mode in 32bit, no RIP-rel in 64bit mode. */
522 v_bndmk_mode,
51e7da1b 523 /* operand size depends on REX prefixes. */
3873ba12 524 dq_mode,
376cd056
JB
525 /* registers like dq_mode, memory like w_mode, displacements like
526 v_mode without considering Intel64 ISA. */
3873ba12 527 dqw_mode,
9f79e886 528 /* bounds operand */
7e8b059b 529 bnd_mode,
9f79e886
JB
530 /* bounds operand with operand swapped */
531 bnd_swap_mode,
51e7da1b 532 /* 4- or 6-byte pointer operand */
3873ba12
L
533 f_mode,
534 const_1_mode,
07f5af7d
L
535 /* v_mode for indirect branch opcodes. */
536 indir_v_mode,
51e7da1b 537 /* v_mode for stack-related opcodes. */
3873ba12 538 stack_v_mode,
51e7da1b 539 /* non-quad operand size depends on prefixes */
3873ba12 540 z_mode,
51e7da1b 541 /* 16-byte operand */
3873ba12 542 o_mode,
51e7da1b 543 /* registers like dq_mode, memory like b_mode. */
3873ba12 544 dqb_mode,
1ba585e8
IT
545 /* registers like d_mode, memory like b_mode. */
546 db_mode,
547 /* registers like d_mode, memory like w_mode. */
548 dw_mode,
51e7da1b 549 /* registers like dq_mode, memory like d_mode. */
3873ba12 550 dqd_mode,
51e7da1b 551 /* normal vex mode */
3873ba12 552 vex_mode,
d55ee72f 553
825bd36c 554 /* Operand size depends on the VEX.W bit, with VSIB dword indices. */
6c30d220 555 vex_vsib_d_w_dq_mode,
825bd36c 556 /* Operand size depends on the VEX.W bit, with VSIB qword indices. */
6c30d220 557 vex_vsib_q_w_dq_mode,
260cd341
LC
558 /* mandatory non-vector SIB. */
559 vex_sibmem_mode,
6c30d220 560
539f890d
L
561 /* scalar, ignore vector length. */
562 scalar_mode,
539f890d
L
563 /* like vex_mode, ignore vector length. */
564 vex_scalar_mode,
825bd36c 565 /* Operand size depends on the VEX.W bit, ignore vector length. */
1c480963 566 vex_scalar_w_dq_mode,
539f890d 567
43234a1e
L
568 /* Static rounding. */
569 evex_rounding_mode,
70df6fc9
L
570 /* Static rounding, 64-bit mode only. */
571 evex_rounding_64_mode,
43234a1e
L
572 /* Supress all exceptions. */
573 evex_sae_mode,
574
575 /* Mask register operand. */
576 mask_mode,
1ba585e8
IT
577 /* Mask register operand. */
578 mask_bd_mode,
43234a1e 579
3873ba12
L
580 es_reg,
581 cs_reg,
582 ss_reg,
583 ds_reg,
584 fs_reg,
585 gs_reg,
d55ee72f 586
3873ba12
L
587 eAX_reg,
588 eCX_reg,
589 eDX_reg,
590 eBX_reg,
591 eSP_reg,
592 eBP_reg,
593 eSI_reg,
594 eDI_reg,
d55ee72f 595
3873ba12
L
596 al_reg,
597 cl_reg,
598 dl_reg,
599 bl_reg,
600 ah_reg,
601 ch_reg,
602 dh_reg,
603 bh_reg,
d55ee72f 604
3873ba12
L
605 ax_reg,
606 cx_reg,
607 dx_reg,
608 bx_reg,
609 sp_reg,
610 bp_reg,
611 si_reg,
612 di_reg,
d55ee72f 613
3873ba12
L
614 rAX_reg,
615 rCX_reg,
616 rDX_reg,
617 rBX_reg,
618 rSP_reg,
619 rBP_reg,
620 rSI_reg,
621 rDI_reg,
d55ee72f 622
3873ba12
L
623 z_mode_ax_reg,
624 indir_dx_reg
51e7da1b 625};
252b5132 626
51e7da1b
L
627enum
628{
629 FLOATCODE = 1,
3873ba12
L
630 USE_REG_TABLE,
631 USE_MOD_TABLE,
632 USE_RM_TABLE,
633 USE_PREFIX_TABLE,
634 USE_X86_64_TABLE,
635 USE_3BYTE_TABLE,
f88c9eb0 636 USE_XOP_8F_TABLE,
3873ba12
L
637 USE_VEX_C4_TABLE,
638 USE_VEX_C5_TABLE,
9e30b8e0 639 USE_VEX_LEN_TABLE,
43234a1e 640 USE_VEX_W_TABLE,
04e2a182
L
641 USE_EVEX_TABLE,
642 USE_EVEX_LEN_TABLE
51e7da1b 643};
6439fc28 644
bf890a93 645#define FLOAT NULL, { { NULL, FLOATCODE } }, 0
4efba78c 646
bf890a93
IT
647#define DIS386(T, I) NULL, { { NULL, (T)}, { NULL, (I) } }, 0
648#define DIS386_PREFIX(T, I, P) NULL, { { NULL, (T)}, { NULL, (I) } }, P
1ceb70f8
L
649#define REG_TABLE(I) DIS386 (USE_REG_TABLE, (I))
650#define MOD_TABLE(I) DIS386 (USE_MOD_TABLE, (I))
651#define RM_TABLE(I) DIS386 (USE_RM_TABLE, (I))
652#define PREFIX_TABLE(I) DIS386 (USE_PREFIX_TABLE, (I))
4e7d34a6
L
653#define X86_64_TABLE(I) DIS386 (USE_X86_64_TABLE, (I))
654#define THREE_BYTE_TABLE(I) DIS386 (USE_3BYTE_TABLE, (I))
bf890a93 655#define THREE_BYTE_TABLE_PREFIX(I, P) DIS386_PREFIX (USE_3BYTE_TABLE, (I), P)
f88c9eb0 656#define XOP_8F_TABLE(I) DIS386 (USE_XOP_8F_TABLE, (I))
c0f3af97
L
657#define VEX_C4_TABLE(I) DIS386 (USE_VEX_C4_TABLE, (I))
658#define VEX_C5_TABLE(I) DIS386 (USE_VEX_C5_TABLE, (I))
659#define VEX_LEN_TABLE(I) DIS386 (USE_VEX_LEN_TABLE, (I))
9e30b8e0 660#define VEX_W_TABLE(I) DIS386 (USE_VEX_W_TABLE, (I))
43234a1e 661#define EVEX_TABLE(I) DIS386 (USE_EVEX_TABLE, (I))
04e2a182 662#define EVEX_LEN_TABLE(I) DIS386 (USE_EVEX_LEN_TABLE, (I))
1ceb70f8 663
51e7da1b
L
664enum
665{
666 REG_80 = 0,
3873ba12 667 REG_81,
7148c369 668 REG_83,
3873ba12
L
669 REG_8F,
670 REG_C0,
671 REG_C1,
672 REG_C6,
673 REG_C7,
674 REG_D0,
675 REG_D1,
676 REG_D2,
677 REG_D3,
678 REG_F6,
679 REG_F7,
680 REG_FE,
681 REG_FF,
682 REG_0F00,
683 REG_0F01,
684 REG_0F0D,
685 REG_0F18,
f8687e93
JB
686 REG_0F1C_P_0_MOD_0,
687 REG_0F1E_P_1_MOD_3,
c4694f17 688 REG_0F38D8_PREFIX_1,
c1fa250a 689 REG_0F3A0F_PREFIX_1_MOD_3,
00ec1875
JB
690 REG_0F71_MOD_0,
691 REG_0F72_MOD_0,
692 REG_0F73_MOD_0,
3873ba12
L
693 REG_0FA6,
694 REG_0FA7,
695 REG_0FAE,
696 REG_0FBA,
697 REG_0FC7,
14d10c6c
JB
698 REG_VEX_0F71_M_0,
699 REG_VEX_0F72_M_0,
700 REG_VEX_0F73_M_0,
592a252b 701 REG_VEX_0FAE,
260cd341 702 REG_VEX_0F3849_X86_64_P_0_W_0_M_1,
14d10c6c 703 REG_VEX_0F38F3_L_0,
467bbef0 704
32e31ad7
JB
705 REG_XOP_09_01_L_0,
706 REG_XOP_09_02_L_0,
707 REG_XOP_09_12_M_1_L_0,
708 REG_XOP_0A_12_L_0,
43234a1e 709
1ba585e8 710 REG_EVEX_0F71,
43234a1e
L
711 REG_EVEX_0F72,
712 REG_EVEX_0F73,
fc681dd6 713 REG_EVEX_0F38C6_M_0_L_2,
b763d508 714 REG_EVEX_0F38C7_M_0_L_2
51e7da1b 715};
1ceb70f8 716
51e7da1b
L
717enum
718{
32e31ad7
JB
719 MOD_62_32BIT = 0,
720 MOD_8D,
721 MOD_C4_32BIT,
722 MOD_C5_32BIT,
42164a71
L
723 MOD_C6_REG_7,
724 MOD_C7_REG_7,
4a357820
MZ
725 MOD_FF_REG_3,
726 MOD_FF_REG_5,
3873ba12
L
727 MOD_0F01_REG_0,
728 MOD_0F01_REG_1,
729 MOD_0F01_REG_2,
730 MOD_0F01_REG_3,
8eab4136 731 MOD_0F01_REG_5,
3873ba12
L
732 MOD_0F01_REG_7,
733 MOD_0F12_PREFIX_0,
18897deb 734 MOD_0F12_PREFIX_2,
3873ba12
L
735 MOD_0F13,
736 MOD_0F16_PREFIX_0,
18897deb 737 MOD_0F16_PREFIX_2,
3873ba12
L
738 MOD_0F17,
739 MOD_0F18_REG_0,
740 MOD_0F18_REG_1,
741 MOD_0F18_REG_2,
742 MOD_0F18_REG_3,
7e8b059b
L
743 MOD_0F1A_PREFIX_0,
744 MOD_0F1B_PREFIX_0,
745 MOD_0F1B_PREFIX_1,
c48935d7 746 MOD_0F1C_PREFIX_0,
603555e5 747 MOD_0F1E_PREFIX_1,
3873ba12
L
748 MOD_0F2B_PREFIX_0,
749 MOD_0F2B_PREFIX_1,
750 MOD_0F2B_PREFIX_2,
751 MOD_0F2B_PREFIX_3,
a5aaedb9 752 MOD_0F50,
00ec1875
JB
753 MOD_0F71,
754 MOD_0F72,
755 MOD_0F73,
3873ba12
L
756 MOD_0FAE_REG_0,
757 MOD_0FAE_REG_1,
758 MOD_0FAE_REG_2,
759 MOD_0FAE_REG_3,
760 MOD_0FAE_REG_4,
761 MOD_0FAE_REG_5,
762 MOD_0FAE_REG_6,
763 MOD_0FAE_REG_7,
764 MOD_0FB2,
765 MOD_0FB4,
766 MOD_0FB5,
a8484f96 767 MOD_0FC3,
963f3586
IT
768 MOD_0FC7_REG_3,
769 MOD_0FC7_REG_4,
770 MOD_0FC7_REG_5,
3873ba12
L
771 MOD_0FC7_REG_6,
772 MOD_0FC7_REG_7,
773 MOD_0FD7,
774 MOD_0FE7_PREFIX_2,
775 MOD_0FF0_PREFIX_3,
7531c613 776 MOD_0F382A,
c4694f17
TG
777 MOD_0F38DC_PREFIX_1,
778 MOD_0F38DD_PREFIX_1,
779 MOD_0F38DE_PREFIX_1,
780 MOD_0F38DF_PREFIX_1,
7531c613 781 MOD_0F38F5,
603555e5 782 MOD_0F38F6_PREFIX_0,
5d79adc4 783 MOD_0F38F8_PREFIX_1,
c0a30a9f 784 MOD_0F38F8_PREFIX_2,
5d79adc4 785 MOD_0F38F8_PREFIX_3,
035e7389 786 MOD_0F38F9,
c4694f17
TG
787 MOD_0F38FA_PREFIX_1,
788 MOD_0F38FB_PREFIX_1,
c1fa250a 789 MOD_0F3A0F_PREFIX_1,
32e31ad7 790
592a252b 791 MOD_VEX_0F12_PREFIX_0,
18897deb 792 MOD_VEX_0F12_PREFIX_2,
592a252b
L
793 MOD_VEX_0F13,
794 MOD_VEX_0F16_PREFIX_0,
18897deb 795 MOD_VEX_0F16_PREFIX_2,
592a252b
L
796 MOD_VEX_0F17,
797 MOD_VEX_0F2B,
13954a31
JB
798 MOD_VEX_0F41_L_1,
799 MOD_VEX_0F42_L_1,
800 MOD_VEX_0F44_L_0,
801 MOD_VEX_0F45_L_1,
802 MOD_VEX_0F46_L_1,
803 MOD_VEX_0F47_L_1,
804 MOD_VEX_0F4A_L_1,
805 MOD_VEX_0F4B_L_1,
592a252b 806 MOD_VEX_0F50,
14d10c6c
JB
807 MOD_VEX_0F71,
808 MOD_VEX_0F72,
809 MOD_VEX_0F73,
13954a31
JB
810 MOD_VEX_0F91_L_0,
811 MOD_VEX_0F92_L_0,
812 MOD_VEX_0F93_L_0,
813 MOD_VEX_0F98_L_0,
814 MOD_VEX_0F99_L_0,
592a252b
L
815 MOD_VEX_0FAE_REG_2,
816 MOD_VEX_0FAE_REG_3,
7531c613
JB
817 MOD_VEX_0FD7,
818 MOD_VEX_0FE7,
592a252b 819 MOD_VEX_0FF0_PREFIX_3,
7531c613
JB
820 MOD_VEX_0F381A,
821 MOD_VEX_0F382A,
822 MOD_VEX_0F382C,
823 MOD_VEX_0F382D,
824 MOD_VEX_0F382E,
825 MOD_VEX_0F382F,
09d73035
CL
826 MOD_VEX_0F3849_X86_64_P_0_W_0,
827 MOD_VEX_0F3849_X86_64_P_2_W_0,
828 MOD_VEX_0F3849_X86_64_P_3_W_0,
829 MOD_VEX_0F384B_X86_64_P_1_W_0,
830 MOD_VEX_0F384B_X86_64_P_2_W_0,
831 MOD_VEX_0F384B_X86_64_P_3_W_0,
7531c613 832 MOD_VEX_0F385A,
09d73035
CL
833 MOD_VEX_0F385C_X86_64_P_1_W_0,
834 MOD_VEX_0F385E_X86_64_P_0_W_0,
835 MOD_VEX_0F385E_X86_64_P_1_W_0,
836 MOD_VEX_0F385E_X86_64_P_2_W_0,
837 MOD_VEX_0F385E_X86_64_P_3_W_0,
7531c613
JB
838 MOD_VEX_0F388C,
839 MOD_VEX_0F388E,
bb5b3501
JB
840 MOD_VEX_0F3A30_L_0,
841 MOD_VEX_0F3A31_L_0,
842 MOD_VEX_0F3A32_L_0,
843 MOD_VEX_0F3A33_L_0,
43234a1e 844
32e31ad7 845 MOD_XOP_09_12,
467bbef0 846
43234a1e 847 MOD_EVEX_0F12_PREFIX_0,
97e6786a
JB
848 MOD_EVEX_0F12_PREFIX_2,
849 MOD_EVEX_0F13,
43234a1e 850 MOD_EVEX_0F16_PREFIX_0,
97e6786a
JB
851 MOD_EVEX_0F16_PREFIX_2,
852 MOD_EVEX_0F17,
853 MOD_EVEX_0F2B,
fc681dd6
JB
854 MOD_EVEX_0F381A,
855 MOD_EVEX_0F381B,
464d2b65
JB
856 MOD_EVEX_0F3828_P_1,
857 MOD_EVEX_0F382A_P_1_W_1,
858 MOD_EVEX_0F3838_P_1,
859 MOD_EVEX_0F383A_P_1_W_0,
fc681dd6
JB
860 MOD_EVEX_0F385A,
861 MOD_EVEX_0F385B,
464d2b65
JB
862 MOD_EVEX_0F387A_W_0,
863 MOD_EVEX_0F387B_W_0,
864 MOD_EVEX_0F387C,
fc681dd6
JB
865 MOD_EVEX_0F38C6,
866 MOD_EVEX_0F38C7
51e7da1b 867};
1ceb70f8 868
51e7da1b
L
869enum
870{
42164a71
L
871 RM_C6_REG_7 = 0,
872 RM_C7_REG_7,
873 RM_0F01_REG_0,
3873ba12
L
874 RM_0F01_REG_1,
875 RM_0F01_REG_2,
876 RM_0F01_REG_3,
f8687e93
JB
877 RM_0F01_REG_5_MOD_3,
878 RM_0F01_REG_7_MOD_3,
879 RM_0F1E_P_1_MOD_3_REG_7,
880 RM_0FAE_REG_6_MOD_3_P_0,
881 RM_0FAE_REG_7_MOD_3,
32e31ad7
JB
882 RM_0F3A0F_P_1_MOD_3_REG_0,
883
260cd341 884 RM_VEX_0F3849_X86_64_P_0_W_0_M_1_R_0
51e7da1b 885};
1ceb70f8 886
51e7da1b
L
887enum
888{
889 PREFIX_90 = 0,
81d54bb7
CL
890 PREFIX_0F01_REG_1_RM_4,
891 PREFIX_0F01_REG_1_RM_5,
892 PREFIX_0F01_REG_1_RM_6,
893 PREFIX_0F01_REG_1_RM_7,
a847e322 894 PREFIX_0F01_REG_3_RM_1,
f8687e93
JB
895 PREFIX_0F01_REG_5_MOD_0,
896 PREFIX_0F01_REG_5_MOD_3_RM_0,
bb651e8b 897 PREFIX_0F01_REG_5_MOD_3_RM_1,
f8687e93 898 PREFIX_0F01_REG_5_MOD_3_RM_2,
f64c42a9
LC
899 PREFIX_0F01_REG_5_MOD_3_RM_4,
900 PREFIX_0F01_REG_5_MOD_3_RM_5,
901 PREFIX_0F01_REG_5_MOD_3_RM_6,
902 PREFIX_0F01_REG_5_MOD_3_RM_7,
267b8516 903 PREFIX_0F01_REG_7_MOD_3_RM_2,
646cc3e0
GG
904 PREFIX_0F01_REG_7_MOD_3_RM_6,
905 PREFIX_0F01_REG_7_MOD_3_RM_7,
3233d7d0 906 PREFIX_0F09,
3873ba12
L
907 PREFIX_0F10,
908 PREFIX_0F11,
909 PREFIX_0F12,
910 PREFIX_0F16,
7e8b059b
L
911 PREFIX_0F1A,
912 PREFIX_0F1B,
c48935d7 913 PREFIX_0F1C,
603555e5 914 PREFIX_0F1E,
3873ba12
L
915 PREFIX_0F2A,
916 PREFIX_0F2B,
917 PREFIX_0F2C,
918 PREFIX_0F2D,
919 PREFIX_0F2E,
920 PREFIX_0F2F,
921 PREFIX_0F51,
922 PREFIX_0F52,
923 PREFIX_0F53,
924 PREFIX_0F58,
925 PREFIX_0F59,
926 PREFIX_0F5A,
927 PREFIX_0F5B,
928 PREFIX_0F5C,
929 PREFIX_0F5D,
930 PREFIX_0F5E,
931 PREFIX_0F5F,
932 PREFIX_0F60,
933 PREFIX_0F61,
934 PREFIX_0F62,
3873ba12
L
935 PREFIX_0F6F,
936 PREFIX_0F70,
3873ba12
L
937 PREFIX_0F78,
938 PREFIX_0F79,
939 PREFIX_0F7C,
940 PREFIX_0F7D,
941 PREFIX_0F7E,
942 PREFIX_0F7F,
f8687e93
JB
943 PREFIX_0FAE_REG_0_MOD_3,
944 PREFIX_0FAE_REG_1_MOD_3,
945 PREFIX_0FAE_REG_2_MOD_3,
946 PREFIX_0FAE_REG_3_MOD_3,
947 PREFIX_0FAE_REG_4_MOD_0,
948 PREFIX_0FAE_REG_4_MOD_3,
f8687e93
JB
949 PREFIX_0FAE_REG_5_MOD_3,
950 PREFIX_0FAE_REG_6_MOD_0,
951 PREFIX_0FAE_REG_6_MOD_3,
952 PREFIX_0FAE_REG_7_MOD_0,
3873ba12 953 PREFIX_0FB8,
f12dc422 954 PREFIX_0FBC,
3873ba12
L
955 PREFIX_0FBD,
956 PREFIX_0FC2,
f8687e93
JB
957 PREFIX_0FC7_REG_6_MOD_0,
958 PREFIX_0FC7_REG_6_MOD_3,
959 PREFIX_0FC7_REG_7_MOD_3,
3873ba12
L
960 PREFIX_0FD0,
961 PREFIX_0FD6,
962 PREFIX_0FE6,
963 PREFIX_0FE7,
964 PREFIX_0FF0,
965 PREFIX_0FF7,
c4694f17
TG
966 PREFIX_0F38D8,
967 PREFIX_0F38DC,
968 PREFIX_0F38DD,
969 PREFIX_0F38DE,
970 PREFIX_0F38DF,
3873ba12
L
971 PREFIX_0F38F0,
972 PREFIX_0F38F1,
e2e1fcde 973 PREFIX_0F38F6,
c0a30a9f 974 PREFIX_0F38F8,
c4694f17
TG
975 PREFIX_0F38FA,
976 PREFIX_0F38FB,
c1fa250a 977 PREFIX_0F3A0F,
592a252b
L
978 PREFIX_VEX_0F10,
979 PREFIX_VEX_0F11,
980 PREFIX_VEX_0F12,
981 PREFIX_VEX_0F16,
982 PREFIX_VEX_0F2A,
983 PREFIX_VEX_0F2C,
984 PREFIX_VEX_0F2D,
985 PREFIX_VEX_0F2E,
986 PREFIX_VEX_0F2F,
13954a31
JB
987 PREFIX_VEX_0F41_L_1_M_1_W_0,
988 PREFIX_VEX_0F41_L_1_M_1_W_1,
989 PREFIX_VEX_0F42_L_1_M_1_W_0,
990 PREFIX_VEX_0F42_L_1_M_1_W_1,
991 PREFIX_VEX_0F44_L_0_M_1_W_0,
992 PREFIX_VEX_0F44_L_0_M_1_W_1,
993 PREFIX_VEX_0F45_L_1_M_1_W_0,
994 PREFIX_VEX_0F45_L_1_M_1_W_1,
995 PREFIX_VEX_0F46_L_1_M_1_W_0,
996 PREFIX_VEX_0F46_L_1_M_1_W_1,
997 PREFIX_VEX_0F47_L_1_M_1_W_0,
998 PREFIX_VEX_0F47_L_1_M_1_W_1,
999 PREFIX_VEX_0F4A_L_1_M_1_W_0,
1000 PREFIX_VEX_0F4A_L_1_M_1_W_1,
1001 PREFIX_VEX_0F4B_L_1_M_1_W_0,
1002 PREFIX_VEX_0F4B_L_1_M_1_W_1,
592a252b
L
1003 PREFIX_VEX_0F51,
1004 PREFIX_VEX_0F52,
1005 PREFIX_VEX_0F53,
1006 PREFIX_VEX_0F58,
1007 PREFIX_VEX_0F59,
1008 PREFIX_VEX_0F5A,
1009 PREFIX_VEX_0F5B,
1010 PREFIX_VEX_0F5C,
1011 PREFIX_VEX_0F5D,
1012 PREFIX_VEX_0F5E,
1013 PREFIX_VEX_0F5F,
592a252b
L
1014 PREFIX_VEX_0F6F,
1015 PREFIX_VEX_0F70,
592a252b
L
1016 PREFIX_VEX_0F7C,
1017 PREFIX_VEX_0F7D,
1018 PREFIX_VEX_0F7E,
1019 PREFIX_VEX_0F7F,
13954a31
JB
1020 PREFIX_VEX_0F90_L_0_W_0,
1021 PREFIX_VEX_0F90_L_0_W_1,
1022 PREFIX_VEX_0F91_L_0_M_0_W_0,
1023 PREFIX_VEX_0F91_L_0_M_0_W_1,
1024 PREFIX_VEX_0F92_L_0_M_1_W_0,
1025 PREFIX_VEX_0F92_L_0_M_1_W_1,
1026 PREFIX_VEX_0F93_L_0_M_1_W_0,
1027 PREFIX_VEX_0F93_L_0_M_1_W_1,
1028 PREFIX_VEX_0F98_L_0_M_1_W_0,
1029 PREFIX_VEX_0F98_L_0_M_1_W_1,
1030 PREFIX_VEX_0F99_L_0_M_1_W_0,
1031 PREFIX_VEX_0F99_L_0_M_1_W_1,
592a252b 1032 PREFIX_VEX_0FC2,
592a252b 1033 PREFIX_VEX_0FD0,
592a252b 1034 PREFIX_VEX_0FE6,
592a252b 1035 PREFIX_VEX_0FF0,
260cd341
LC
1036 PREFIX_VEX_0F3849_X86_64,
1037 PREFIX_VEX_0F384B_X86_64,
260cd341
LC
1038 PREFIX_VEX_0F385C_X86_64,
1039 PREFIX_VEX_0F385E_X86_64,
14d10c6c
JB
1040 PREFIX_VEX_0F38F5_L_0,
1041 PREFIX_VEX_0F38F6_L_0,
1042 PREFIX_VEX_0F38F7_L_0,
1043 PREFIX_VEX_0F3AF0_L_0,
43234a1e
L
1044
1045 PREFIX_EVEX_0F10,
1046 PREFIX_EVEX_0F11,
1047 PREFIX_EVEX_0F12,
43234a1e 1048 PREFIX_EVEX_0F16,
43234a1e 1049 PREFIX_EVEX_0F2A,
43234a1e
L
1050 PREFIX_EVEX_0F51,
1051 PREFIX_EVEX_0F58,
1052 PREFIX_EVEX_0F59,
1053 PREFIX_EVEX_0F5A,
1054 PREFIX_EVEX_0F5B,
1055 PREFIX_EVEX_0F5C,
1056 PREFIX_EVEX_0F5D,
1057 PREFIX_EVEX_0F5E,
1058 PREFIX_EVEX_0F5F,
43234a1e
L
1059 PREFIX_EVEX_0F6F,
1060 PREFIX_EVEX_0F70,
43234a1e
L
1061 PREFIX_EVEX_0F78,
1062 PREFIX_EVEX_0F79,
1063 PREFIX_EVEX_0F7A,
1064 PREFIX_EVEX_0F7B,
1065 PREFIX_EVEX_0F7E,
1066 PREFIX_EVEX_0F7F,
1067 PREFIX_EVEX_0FC2,
43234a1e 1068 PREFIX_EVEX_0FE6,
1ba585e8 1069 PREFIX_EVEX_0F3810,
43234a1e
L
1070 PREFIX_EVEX_0F3811,
1071 PREFIX_EVEX_0F3812,
1072 PREFIX_EVEX_0F3813,
1073 PREFIX_EVEX_0F3814,
1074 PREFIX_EVEX_0F3815,
1ba585e8 1075 PREFIX_EVEX_0F3820,
43234a1e
L
1076 PREFIX_EVEX_0F3821,
1077 PREFIX_EVEX_0F3822,
1078 PREFIX_EVEX_0F3823,
1079 PREFIX_EVEX_0F3824,
1080 PREFIX_EVEX_0F3825,
1ba585e8 1081 PREFIX_EVEX_0F3826,
43234a1e
L
1082 PREFIX_EVEX_0F3827,
1083 PREFIX_EVEX_0F3828,
1084 PREFIX_EVEX_0F3829,
1085 PREFIX_EVEX_0F382A,
1ba585e8 1086 PREFIX_EVEX_0F3830,
43234a1e
L
1087 PREFIX_EVEX_0F3831,
1088 PREFIX_EVEX_0F3832,
1089 PREFIX_EVEX_0F3833,
1090 PREFIX_EVEX_0F3834,
1091 PREFIX_EVEX_0F3835,
1ba585e8 1092 PREFIX_EVEX_0F3838,
43234a1e
L
1093 PREFIX_EVEX_0F3839,
1094 PREFIX_EVEX_0F383A,
47acf0bd
IT
1095 PREFIX_EVEX_0F3852,
1096 PREFIX_EVEX_0F3853,
9186c494 1097 PREFIX_EVEX_0F3868,
53467f57 1098 PREFIX_EVEX_0F3872,
43234a1e
L
1099 PREFIX_EVEX_0F389A,
1100 PREFIX_EVEX_0F389B,
43234a1e
L
1101 PREFIX_EVEX_0F38AA,
1102 PREFIX_EVEX_0F38AB,
51e7da1b 1103};
4e7d34a6 1104
51e7da1b
L
1105enum
1106{
1107 X86_64_06 = 0,
3873ba12 1108 X86_64_07,
1673df32 1109 X86_64_0E,
3873ba12
L
1110 X86_64_16,
1111 X86_64_17,
1112 X86_64_1E,
1113 X86_64_1F,
1114 X86_64_27,
1115 X86_64_2F,
1116 X86_64_37,
1117 X86_64_3F,
1118 X86_64_60,
1119 X86_64_61,
1120 X86_64_62,
1121 X86_64_63,
1122 X86_64_6D,
1123 X86_64_6F,
d039fef3 1124 X86_64_82,
3873ba12 1125 X86_64_9A,
aeab2b26
JB
1126 X86_64_C2,
1127 X86_64_C3,
3873ba12
L
1128 X86_64_C4,
1129 X86_64_C5,
1130 X86_64_CE,
1131 X86_64_D4,
1132 X86_64_D5,
a72d2af2
L
1133 X86_64_E8,
1134 X86_64_E9,
3873ba12
L
1135 X86_64_EA,
1136 X86_64_0F01_REG_0,
1137 X86_64_0F01_REG_1,
81d54bb7
CL
1138 X86_64_0F01_REG_1_RM_5_PREFIX_2,
1139 X86_64_0F01_REG_1_RM_6_PREFIX_2,
1140 X86_64_0F01_REG_1_RM_7_PREFIX_2,
3873ba12 1141 X86_64_0F01_REG_2,
260cd341 1142 X86_64_0F01_REG_3,
f64c42a9
LC
1143 X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1,
1144 X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1,
1145 X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1,
1146 X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1,
646cc3e0
GG
1147 X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1,
1148 X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3,
1149 X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1,
32e31ad7
JB
1150 X86_64_0F24,
1151 X86_64_0F26,
1152 X86_64_0FC7_REG_6_MOD_3_PREFIX_1,
1153
1154 X86_64_VEX_0F3849,
1155 X86_64_VEX_0F384B,
1156 X86_64_VEX_0F385C,
1157 X86_64_VEX_0F385E
51e7da1b 1158};
4e7d34a6 1159
51e7da1b
L
1160enum
1161{
1162 THREE_BYTE_0F38 = 0,
1f334aeb 1163 THREE_BYTE_0F3A
51e7da1b 1164};
4e7d34a6 1165
f88c9eb0
SP
1166enum
1167{
5dd85c99
SP
1168 XOP_08 = 0,
1169 XOP_09,
f88c9eb0
SP
1170 XOP_0A
1171};
1172
51e7da1b
L
1173enum
1174{
1175 VEX_0F = 0,
3873ba12
L
1176 VEX_0F38,
1177 VEX_0F3A
51e7da1b 1178};
c0f3af97 1179
43234a1e
L
1180enum
1181{
1182 EVEX_0F = 0,
1183 EVEX_0F38,
1184 EVEX_0F3A
1185};
1186
51e7da1b
L
1187enum
1188{
ec6f095a 1189 VEX_LEN_0F12_P_0_M_0 = 0,
592a252b 1190 VEX_LEN_0F12_P_0_M_1,
18897deb 1191#define VEX_LEN_0F12_P_2_M_0 VEX_LEN_0F12_P_0_M_0
592a252b
L
1192 VEX_LEN_0F13_M_0,
1193 VEX_LEN_0F16_P_0_M_0,
1194 VEX_LEN_0F16_P_0_M_1,
18897deb 1195#define VEX_LEN_0F16_P_2_M_0 VEX_LEN_0F16_P_0_M_0
592a252b 1196 VEX_LEN_0F17_M_0,
13954a31
JB
1197 VEX_LEN_0F41,
1198 VEX_LEN_0F42,
1199 VEX_LEN_0F44,
1200 VEX_LEN_0F45,
1201 VEX_LEN_0F46,
1202 VEX_LEN_0F47,
1203 VEX_LEN_0F4A,
1204 VEX_LEN_0F4B,
7531c613 1205 VEX_LEN_0F6E,
035e7389 1206 VEX_LEN_0F77,
592a252b
L
1207 VEX_LEN_0F7E_P_1,
1208 VEX_LEN_0F7E_P_2,
13954a31
JB
1209 VEX_LEN_0F90,
1210 VEX_LEN_0F91,
1211 VEX_LEN_0F92,
1212 VEX_LEN_0F93,
1213 VEX_LEN_0F98,
1214 VEX_LEN_0F99,
592a252b
L
1215 VEX_LEN_0FAE_R_2_M_0,
1216 VEX_LEN_0FAE_R_3_M_0,
7531c613
JB
1217 VEX_LEN_0FC4,
1218 VEX_LEN_0FC5,
1219 VEX_LEN_0FD6,
1220 VEX_LEN_0FF7,
1221 VEX_LEN_0F3816,
1222 VEX_LEN_0F3819,
1223 VEX_LEN_0F381A_M_0,
1224 VEX_LEN_0F3836,
1225 VEX_LEN_0F3841,
260cd341
LC
1226 VEX_LEN_0F3849_X86_64_P_0_W_0_M_0,
1227 VEX_LEN_0F3849_X86_64_P_0_W_0_M_1_REG_0_RM_0,
1228 VEX_LEN_0F3849_X86_64_P_2_W_0_M_0,
1229 VEX_LEN_0F3849_X86_64_P_3_W_0_M_0,
1230 VEX_LEN_0F384B_X86_64_P_1_W_0_M_0,
1231 VEX_LEN_0F384B_X86_64_P_2_W_0_M_0,
1232 VEX_LEN_0F384B_X86_64_P_3_W_0_M_0,
7531c613 1233 VEX_LEN_0F385A_M_0,
260cd341
LC
1234 VEX_LEN_0F385C_X86_64_P_1_W_0_M_0,
1235 VEX_LEN_0F385E_X86_64_P_0_W_0_M_0,
1236 VEX_LEN_0F385E_X86_64_P_1_W_0_M_0,
1237 VEX_LEN_0F385E_X86_64_P_2_W_0_M_0,
1238 VEX_LEN_0F385E_X86_64_P_3_W_0_M_0,
7531c613 1239 VEX_LEN_0F38DB,
035e7389 1240 VEX_LEN_0F38F2,
14d10c6c
JB
1241 VEX_LEN_0F38F3,
1242 VEX_LEN_0F38F5,
1243 VEX_LEN_0F38F6,
1244 VEX_LEN_0F38F7,
7531c613
JB
1245 VEX_LEN_0F3A00,
1246 VEX_LEN_0F3A01,
1247 VEX_LEN_0F3A06,
1248 VEX_LEN_0F3A14,
1249 VEX_LEN_0F3A15,
1250 VEX_LEN_0F3A16,
1251 VEX_LEN_0F3A17,
1252 VEX_LEN_0F3A18,
1253 VEX_LEN_0F3A19,
1254 VEX_LEN_0F3A20,
1255 VEX_LEN_0F3A21,
1256 VEX_LEN_0F3A22,
1257 VEX_LEN_0F3A30,
1258 VEX_LEN_0F3A31,
1259 VEX_LEN_0F3A32,
1260 VEX_LEN_0F3A33,
1261 VEX_LEN_0F3A38,
1262 VEX_LEN_0F3A39,
1263 VEX_LEN_0F3A41,
1264 VEX_LEN_0F3A46,
1265 VEX_LEN_0F3A60,
1266 VEX_LEN_0F3A61,
1267 VEX_LEN_0F3A62,
1268 VEX_LEN_0F3A63,
1269 VEX_LEN_0F3ADF,
14d10c6c 1270 VEX_LEN_0F3AF0,
467bbef0
JB
1271 VEX_LEN_0FXOP_08_85,
1272 VEX_LEN_0FXOP_08_86,
1273 VEX_LEN_0FXOP_08_87,
1274 VEX_LEN_0FXOP_08_8E,
1275 VEX_LEN_0FXOP_08_8F,
1276 VEX_LEN_0FXOP_08_95,
1277 VEX_LEN_0FXOP_08_96,
1278 VEX_LEN_0FXOP_08_97,
1279 VEX_LEN_0FXOP_08_9E,
1280 VEX_LEN_0FXOP_08_9F,
1281 VEX_LEN_0FXOP_08_A3,
1282 VEX_LEN_0FXOP_08_A6,
1283 VEX_LEN_0FXOP_08_B6,
1284 VEX_LEN_0FXOP_08_C0,
1285 VEX_LEN_0FXOP_08_C1,
1286 VEX_LEN_0FXOP_08_C2,
1287 VEX_LEN_0FXOP_08_C3,
ff688e1f
L
1288 VEX_LEN_0FXOP_08_CC,
1289 VEX_LEN_0FXOP_08_CD,
1290 VEX_LEN_0FXOP_08_CE,
1291 VEX_LEN_0FXOP_08_CF,
1292 VEX_LEN_0FXOP_08_EC,
1293 VEX_LEN_0FXOP_08_ED,
1294 VEX_LEN_0FXOP_08_EE,
1295 VEX_LEN_0FXOP_08_EF,
467bbef0
JB
1296 VEX_LEN_0FXOP_09_01,
1297 VEX_LEN_0FXOP_09_02,
1298 VEX_LEN_0FXOP_09_12_M_1,
b5b098c2
JB
1299 VEX_LEN_0FXOP_09_82_W_0,
1300 VEX_LEN_0FXOP_09_83_W_0,
467bbef0
JB
1301 VEX_LEN_0FXOP_09_90,
1302 VEX_LEN_0FXOP_09_91,
1303 VEX_LEN_0FXOP_09_92,
1304 VEX_LEN_0FXOP_09_93,
1305 VEX_LEN_0FXOP_09_94,
1306 VEX_LEN_0FXOP_09_95,
1307 VEX_LEN_0FXOP_09_96,
1308 VEX_LEN_0FXOP_09_97,
1309 VEX_LEN_0FXOP_09_98,
1310 VEX_LEN_0FXOP_09_99,
1311 VEX_LEN_0FXOP_09_9A,
1312 VEX_LEN_0FXOP_09_9B,
1313 VEX_LEN_0FXOP_09_C1,
1314 VEX_LEN_0FXOP_09_C2,
1315 VEX_LEN_0FXOP_09_C3,
1316 VEX_LEN_0FXOP_09_C6,
1317 VEX_LEN_0FXOP_09_C7,
1318 VEX_LEN_0FXOP_09_CB,
1319 VEX_LEN_0FXOP_09_D1,
1320 VEX_LEN_0FXOP_09_D2,
1321 VEX_LEN_0FXOP_09_D3,
1322 VEX_LEN_0FXOP_09_D6,
1323 VEX_LEN_0FXOP_09_D7,
1324 VEX_LEN_0FXOP_09_DB,
1325 VEX_LEN_0FXOP_09_E1,
1326 VEX_LEN_0FXOP_09_E2,
1327 VEX_LEN_0FXOP_09_E3,
1328 VEX_LEN_0FXOP_0A_12,
51e7da1b 1329};
c0f3af97 1330
04e2a182
L
1331enum
1332{
85ba7507 1333 EVEX_LEN_0F3816 = 0,
fc681dd6
JB
1334 EVEX_LEN_0F3819,
1335 EVEX_LEN_0F381A_M_0,
1336 EVEX_LEN_0F381B_M_0,
7531c613 1337 EVEX_LEN_0F3836,
fc681dd6
JB
1338 EVEX_LEN_0F385A_M_0,
1339 EVEX_LEN_0F385B_M_0,
1340 EVEX_LEN_0F38C6_M_0,
1341 EVEX_LEN_0F38C7_M_0,
066f82b9
JB
1342 EVEX_LEN_0F3A00,
1343 EVEX_LEN_0F3A01,
fc681dd6
JB
1344 EVEX_LEN_0F3A18,
1345 EVEX_LEN_0F3A19,
1346 EVEX_LEN_0F3A1A,
1347 EVEX_LEN_0F3A1B,
fc681dd6
JB
1348 EVEX_LEN_0F3A23,
1349 EVEX_LEN_0F3A38,
1350 EVEX_LEN_0F3A39,
1351 EVEX_LEN_0F3A3A,
1352 EVEX_LEN_0F3A3B,
1353 EVEX_LEN_0F3A43
04e2a182
L
1354};
1355
9e30b8e0
L
1356enum
1357{
13954a31
JB
1358 VEX_W_0F41_L_1_M_1 = 0,
1359 VEX_W_0F42_L_1_M_1,
1360 VEX_W_0F44_L_0_M_1,
1361 VEX_W_0F45_L_1_M_1,
1362 VEX_W_0F46_L_1_M_1,
1363 VEX_W_0F47_L_1_M_1,
1364 VEX_W_0F4A_L_1_M_1,
1365 VEX_W_0F4B_L_1_M_1,
1366 VEX_W_0F90_L_0,
1367 VEX_W_0F91_L_0_M_0,
1368 VEX_W_0F92_L_0_M_1,
1369 VEX_W_0F93_L_0_M_1,
1370 VEX_W_0F98_L_0_M_1,
1371 VEX_W_0F99_L_0_M_1,
7531c613
JB
1372 VEX_W_0F380C,
1373 VEX_W_0F380D,
1374 VEX_W_0F380E,
1375 VEX_W_0F380F,
1376 VEX_W_0F3813,
1377 VEX_W_0F3816_L_1,
1378 VEX_W_0F3818,
1379 VEX_W_0F3819_L_1,
1380 VEX_W_0F381A_M_0_L_1,
1381 VEX_W_0F382C_M_0,
1382 VEX_W_0F382D_M_0,
1383 VEX_W_0F382E_M_0,
1384 VEX_W_0F382F_M_0,
1385 VEX_W_0F3836,
1386 VEX_W_0F3846,
260cd341
LC
1387 VEX_W_0F3849_X86_64_P_0,
1388 VEX_W_0F3849_X86_64_P_2,
1389 VEX_W_0F3849_X86_64_P_3,
1390 VEX_W_0F384B_X86_64_P_1,
1391 VEX_W_0F384B_X86_64_P_2,
1392 VEX_W_0F384B_X86_64_P_3,
58bf9b6a
L
1393 VEX_W_0F3850,
1394 VEX_W_0F3851,
1395 VEX_W_0F3852,
1396 VEX_W_0F3853,
7531c613
JB
1397 VEX_W_0F3858,
1398 VEX_W_0F3859,
1399 VEX_W_0F385A_M_0_L_0,
260cd341
LC
1400 VEX_W_0F385C_X86_64_P_1,
1401 VEX_W_0F385E_X86_64_P_0,
1402 VEX_W_0F385E_X86_64_P_1,
1403 VEX_W_0F385E_X86_64_P_2,
1404 VEX_W_0F385E_X86_64_P_3,
7531c613
JB
1405 VEX_W_0F3878,
1406 VEX_W_0F3879,
1407 VEX_W_0F38CF,
1408 VEX_W_0F3A00_L_1,
1409 VEX_W_0F3A01_L_1,
1410 VEX_W_0F3A02,
1411 VEX_W_0F3A04,
1412 VEX_W_0F3A05,
1413 VEX_W_0F3A06_L_1,
1414 VEX_W_0F3A18_L_1,
1415 VEX_W_0F3A19_L_1,
1416 VEX_W_0F3A1D,
7531c613
JB
1417 VEX_W_0F3A38_L_1,
1418 VEX_W_0F3A39_L_1,
1419 VEX_W_0F3A46_L_1,
1420 VEX_W_0F3A4A,
1421 VEX_W_0F3A4B,
1422 VEX_W_0F3A4C,
1423 VEX_W_0F3ACE,
1424 VEX_W_0F3ACF,
43234a1e 1425
467bbef0
JB
1426 VEX_W_0FXOP_08_85_L_0,
1427 VEX_W_0FXOP_08_86_L_0,
1428 VEX_W_0FXOP_08_87_L_0,
1429 VEX_W_0FXOP_08_8E_L_0,
1430 VEX_W_0FXOP_08_8F_L_0,
1431 VEX_W_0FXOP_08_95_L_0,
1432 VEX_W_0FXOP_08_96_L_0,
1433 VEX_W_0FXOP_08_97_L_0,
1434 VEX_W_0FXOP_08_9E_L_0,
1435 VEX_W_0FXOP_08_9F_L_0,
1436 VEX_W_0FXOP_08_A6_L_0,
1437 VEX_W_0FXOP_08_B6_L_0,
1438 VEX_W_0FXOP_08_C0_L_0,
1439 VEX_W_0FXOP_08_C1_L_0,
1440 VEX_W_0FXOP_08_C2_L_0,
1441 VEX_W_0FXOP_08_C3_L_0,
1442 VEX_W_0FXOP_08_CC_L_0,
1443 VEX_W_0FXOP_08_CD_L_0,
1444 VEX_W_0FXOP_08_CE_L_0,
1445 VEX_W_0FXOP_08_CF_L_0,
1446 VEX_W_0FXOP_08_EC_L_0,
1447 VEX_W_0FXOP_08_ED_L_0,
1448 VEX_W_0FXOP_08_EE_L_0,
1449 VEX_W_0FXOP_08_EF_L_0,
1450
b5b098c2
JB
1451 VEX_W_0FXOP_09_80,
1452 VEX_W_0FXOP_09_81,
1453 VEX_W_0FXOP_09_82,
1454 VEX_W_0FXOP_09_83,
467bbef0
JB
1455 VEX_W_0FXOP_09_C1_L_0,
1456 VEX_W_0FXOP_09_C2_L_0,
1457 VEX_W_0FXOP_09_C3_L_0,
1458 VEX_W_0FXOP_09_C6_L_0,
1459 VEX_W_0FXOP_09_C7_L_0,
1460 VEX_W_0FXOP_09_CB_L_0,
1461 VEX_W_0FXOP_09_D1_L_0,
1462 VEX_W_0FXOP_09_D2_L_0,
1463 VEX_W_0FXOP_09_D3_L_0,
1464 VEX_W_0FXOP_09_D6_L_0,
1465 VEX_W_0FXOP_09_D7_L_0,
1466 VEX_W_0FXOP_09_DB_L_0,
1467 VEX_W_0FXOP_09_E1_L_0,
1468 VEX_W_0FXOP_09_E2_L_0,
1469 VEX_W_0FXOP_09_E3_L_0,
b5b098c2 1470
36cc073e 1471 EVEX_W_0F10_P_1,
36cc073e 1472 EVEX_W_0F10_P_3,
36cc073e 1473 EVEX_W_0F11_P_1,
36cc073e 1474 EVEX_W_0F11_P_3,
43234a1e
L
1475 EVEX_W_0F12_P_0_M_1,
1476 EVEX_W_0F12_P_1,
43234a1e 1477 EVEX_W_0F12_P_3,
43234a1e
L
1478 EVEX_W_0F16_P_0_M_1,
1479 EVEX_W_0F16_P_1,
43234a1e 1480 EVEX_W_0F2A_P_3,
43234a1e 1481 EVEX_W_0F51_P_1,
43234a1e 1482 EVEX_W_0F51_P_3,
43234a1e 1483 EVEX_W_0F58_P_1,
43234a1e 1484 EVEX_W_0F58_P_3,
43234a1e 1485 EVEX_W_0F59_P_1,
43234a1e
L
1486 EVEX_W_0F59_P_3,
1487 EVEX_W_0F5A_P_0,
1488 EVEX_W_0F5A_P_1,
1489 EVEX_W_0F5A_P_2,
1490 EVEX_W_0F5A_P_3,
1491 EVEX_W_0F5B_P_0,
1492 EVEX_W_0F5B_P_1,
1493 EVEX_W_0F5B_P_2,
43234a1e 1494 EVEX_W_0F5C_P_1,
43234a1e 1495 EVEX_W_0F5C_P_3,
43234a1e 1496 EVEX_W_0F5D_P_1,
43234a1e 1497 EVEX_W_0F5D_P_3,
43234a1e 1498 EVEX_W_0F5E_P_1,
43234a1e 1499 EVEX_W_0F5E_P_3,
43234a1e 1500 EVEX_W_0F5F_P_1,
43234a1e 1501 EVEX_W_0F5F_P_3,
fedfb81e 1502 EVEX_W_0F62,
7531c613 1503 EVEX_W_0F66,
fedfb81e
JB
1504 EVEX_W_0F6A,
1505 EVEX_W_0F6B,
1506 EVEX_W_0F6C,
1507 EVEX_W_0F6D,
43234a1e
L
1508 EVEX_W_0F6F_P_1,
1509 EVEX_W_0F6F_P_2,
1ba585e8 1510 EVEX_W_0F6F_P_3,
43234a1e 1511 EVEX_W_0F70_P_2,
7531c613
JB
1512 EVEX_W_0F72_R_2,
1513 EVEX_W_0F72_R_6,
1514 EVEX_W_0F73_R_2,
1515 EVEX_W_0F73_R_6,
1516 EVEX_W_0F76,
43234a1e 1517 EVEX_W_0F78_P_0,
90a915bf 1518 EVEX_W_0F78_P_2,
43234a1e 1519 EVEX_W_0F79_P_0,
90a915bf 1520 EVEX_W_0F79_P_2,
43234a1e 1521 EVEX_W_0F7A_P_1,
90a915bf 1522 EVEX_W_0F7A_P_2,
43234a1e 1523 EVEX_W_0F7A_P_3,
90a915bf 1524 EVEX_W_0F7B_P_2,
43234a1e
L
1525 EVEX_W_0F7B_P_3,
1526 EVEX_W_0F7E_P_1,
43234a1e
L
1527 EVEX_W_0F7F_P_1,
1528 EVEX_W_0F7F_P_2,
1ba585e8 1529 EVEX_W_0F7F_P_3,
43234a1e 1530 EVEX_W_0FC2_P_1,
43234a1e 1531 EVEX_W_0FC2_P_3,
fedfb81e
JB
1532 EVEX_W_0FD2,
1533 EVEX_W_0FD3,
1534 EVEX_W_0FD4,
85ba7507 1535 EVEX_W_0FD6,
43234a1e
L
1536 EVEX_W_0FE6_P_1,
1537 EVEX_W_0FE6_P_2,
1538 EVEX_W_0FE6_P_3,
7531c613 1539 EVEX_W_0FE7,
fedfb81e
JB
1540 EVEX_W_0FF2,
1541 EVEX_W_0FF3,
1542 EVEX_W_0FF4,
1543 EVEX_W_0FFA,
1544 EVEX_W_0FFB,
1545 EVEX_W_0FFE,
7531c613 1546 EVEX_W_0F380D,
1ba585e8
IT
1547 EVEX_W_0F3810_P_1,
1548 EVEX_W_0F3810_P_2,
43234a1e 1549 EVEX_W_0F3811_P_1,
1ba585e8 1550 EVEX_W_0F3811_P_2,
43234a1e 1551 EVEX_W_0F3812_P_1,
1ba585e8 1552 EVEX_W_0F3812_P_2,
43234a1e
L
1553 EVEX_W_0F3813_P_1,
1554 EVEX_W_0F3813_P_2,
1555 EVEX_W_0F3814_P_1,
1556 EVEX_W_0F3815_P_1,
fc681dd6
JB
1557 EVEX_W_0F3819_L_n,
1558 EVEX_W_0F381A_M_0_L_n,
1559 EVEX_W_0F381B_M_0_L_2,
7531c613
JB
1560 EVEX_W_0F381E,
1561 EVEX_W_0F381F,
1ba585e8 1562 EVEX_W_0F3820_P_1,
43234a1e
L
1563 EVEX_W_0F3821_P_1,
1564 EVEX_W_0F3822_P_1,
1565 EVEX_W_0F3823_P_1,
1566 EVEX_W_0F3824_P_1,
1567 EVEX_W_0F3825_P_1,
1568 EVEX_W_0F3825_P_2,
1569 EVEX_W_0F3828_P_2,
1570 EVEX_W_0F3829_P_2,
1571 EVEX_W_0F382A_P_1,
1572 EVEX_W_0F382A_P_2,
fedfb81e 1573 EVEX_W_0F382B,
1ba585e8 1574 EVEX_W_0F3830_P_1,
43234a1e
L
1575 EVEX_W_0F3831_P_1,
1576 EVEX_W_0F3832_P_1,
1577 EVEX_W_0F3833_P_1,
1578 EVEX_W_0F3834_P_1,
1579 EVEX_W_0F3835_P_1,
1580 EVEX_W_0F3835_P_2,
7531c613 1581 EVEX_W_0F3837,
43234a1e 1582 EVEX_W_0F383A_P_1,
d6aab7a1 1583 EVEX_W_0F3852_P_1,
7531c613 1584 EVEX_W_0F3859,
fc681dd6
JB
1585 EVEX_W_0F385A_M_0_L_n,
1586 EVEX_W_0F385B_M_0_L_2,
7531c613 1587 EVEX_W_0F3870,
d6aab7a1 1588 EVEX_W_0F3872_P_1,
53467f57 1589 EVEX_W_0F3872_P_2,
d6aab7a1 1590 EVEX_W_0F3872_P_3,
7531c613
JB
1591 EVEX_W_0F387A,
1592 EVEX_W_0F387B,
1593 EVEX_W_0F3883,
7531c613 1594
7531c613
JB
1595 EVEX_W_0F3A05,
1596 EVEX_W_0F3A08,
1597 EVEX_W_0F3A09,
1598 EVEX_W_0F3A0A,
1599 EVEX_W_0F3A0B,
fc681dd6
JB
1600 EVEX_W_0F3A18_L_n,
1601 EVEX_W_0F3A19_L_n,
1602 EVEX_W_0F3A1A_L_2,
1603 EVEX_W_0F3A1B_L_2,
7531c613 1604 EVEX_W_0F3A21,
fc681dd6
JB
1605 EVEX_W_0F3A23_L_n,
1606 EVEX_W_0F3A38_L_n,
1607 EVEX_W_0F3A39_L_n,
1608 EVEX_W_0F3A3A_L_2,
1609 EVEX_W_0F3A3B_L_2,
7531c613 1610 EVEX_W_0F3A42,
fc681dd6 1611 EVEX_W_0F3A43_L_n,
7531c613
JB
1612 EVEX_W_0F3A70,
1613 EVEX_W_0F3A72,
9e30b8e0
L
1614};
1615
26ca5450 1616typedef void (*op_rtn) (int bytemode, int sizeflag);
252b5132
RH
1617
1618struct dis386 {
2da11e11 1619 const char *name;
ce518a5f
L
1620 struct
1621 {
1622 op_rtn rtn;
1623 int bytemode;
1624 } op[MAX_OPERANDS];
bf890a93 1625 unsigned int prefix_requirement;
252b5132
RH
1626};
1627
1628/* Upper case letters in the instruction names here are macros.
1629 'A' => print 'b' if no register operands or suffix_always is true
1630 'B' => print 'b' if suffix_always is true
9306ca4a 1631 'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
98b528ac 1632 size prefix
ed7841b3 1633 'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
98b528ac 1634 suffix_always is true
252b5132 1635 'E' => print 'e' if 32-bit form of jcxz
3ffd33cf 1636 'F' => print 'w' or 'l' depending on address size prefix (loop insns)
52fd6d94 1637 'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
5dd0794d 1638 'H' => print ",pt" or ",pn" branch hint
d1c36125 1639 'I' unused.
8f570d62 1640 'J' unused.
42903f7f 1641 'K' => print 'd' or 'q' if rex prefix is present.
78467458 1642 'L' unused.
9d141669 1643 'M' => print 'r' if intel_mnemonic is false.
252b5132 1644 'N' => print 'n' if instruction has no wait "prefix"
a35ca55a 1645 'O' => print 'd' or 'o' (or 'q' in Intel mode)
36938cab
JB
1646 'P' => behave as 'T' except with register operand outside of suffix_always
1647 mode
98b528ac
L
1648 'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
1649 is true
a35ca55a 1650 'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
52b15da3 1651 'S' => print 'w', 'l' or 'q' if suffix_always is true
36938cab
JB
1652 'T' => print 'w', 'l'/'d', or 'q' if instruction has an operand size
1653 prefix or if suffix_always is true.
1654 'U' unused.
c3f5525f 1655 'V' unused.
a35ca55a 1656 'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
9306ca4a 1657 'X' => print 's', 'd' depending on data16 prefix (for XMM)
9646c87b 1658 'Y' unused.
78467458 1659 'Z' => print 'q' in 64bit mode and 'l' otherwise, if suffix_always is true.
9d141669 1660 '!' => change condition from true to false or from false to true.
98b528ac 1661 '%' => add 1 upper case letter to the macro.
5990e377
JB
1662 '^' => print 'w', 'l', or 'q' (Intel64 ISA only) depending on operand size
1663 prefix or suffix_always is true (lcall/ljmp).
36938cab
JB
1664 '@' => in 64bit mode for Intel64 ISA or if instruction
1665 has no operand sizing prefix, print 'q' if suffix_always is true or
1666 nothing otherwise; behave as 'P' in all other cases
98b528ac
L
1667
1668 2 upper case letter macros:
04d824a4
JB
1669 "XY" => print 'x' or 'y' if suffix_always is true or no register
1670 operands and no broadcast.
1671 "XZ" => print 'x', 'y', or 'z' if suffix_always is true or no
1672 register operands and no broadcast.
4b06377f 1673 "XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
58bf9b6a 1674 "XV" => print "{vex3}" pseudo prefix
b24d668c
JB
1675 "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand, cond
1676 being false, or no operand at all in 64bit mode, or if suffix_always
589958d6 1677 is true.
4b06377f
L
1678 "LB" => print "abs" in 64bit mode and behave as 'B' otherwise
1679 "LS" => print "abs" in 64bit mode and behave as 'S' otherwise
1680 "LV" => print "abs" for 64bit operand and behave as 'S' otherwise
492a76aa 1681 "DQ" => print 'd' or 'q' depending on the VEX.W bit
bb5b3501 1682 "BW" => print 'b' or 'w' depending on the VEX.W bit
4b4c407a
L
1683 "LP" => print 'w' or 'l' ('d' in Intel mode) if instruction has
1684 an operand size prefix, or suffix_always is true. print
1685 'q' if rex prefix is present.
52b15da3 1686
6439fc28
AM
1687 Many of the above letters print nothing in Intel mode. See "putop"
1688 for the details.
52b15da3 1689
6439fc28 1690 Braces '{' and '}', and vertical bars '|', indicate alternative
7c52e0e8 1691 mnemonic strings for AT&T and Intel. */
252b5132 1692
6439fc28 1693static const struct dis386 dis386[] = {
252b5132 1694 /* 00 */
bf890a93
IT
1695 { "addB", { Ebh1, Gb }, 0 },
1696 { "addS", { Evh1, Gv }, 0 },
1697 { "addB", { Gb, EbS }, 0 },
1698 { "addS", { Gv, EvS }, 0 },
1699 { "addB", { AL, Ib }, 0 },
1700 { "addS", { eAX, Iv }, 0 },
4e7d34a6
L
1701 { X86_64_TABLE (X86_64_06) },
1702 { X86_64_TABLE (X86_64_07) },
252b5132 1703 /* 08 */
bf890a93
IT
1704 { "orB", { Ebh1, Gb }, 0 },
1705 { "orS", { Evh1, Gv }, 0 },
1706 { "orB", { Gb, EbS }, 0 },
1707 { "orS", { Gv, EvS }, 0 },
1708 { "orB", { AL, Ib }, 0 },
1709 { "orS", { eAX, Iv }, 0 },
1673df32 1710 { X86_64_TABLE (X86_64_0E) },
592d1631 1711 { Bad_Opcode }, /* 0x0f extended opcode escape */
252b5132 1712 /* 10 */
bf890a93
IT
1713 { "adcB", { Ebh1, Gb }, 0 },
1714 { "adcS", { Evh1, Gv }, 0 },
1715 { "adcB", { Gb, EbS }, 0 },
1716 { "adcS", { Gv, EvS }, 0 },
1717 { "adcB", { AL, Ib }, 0 },
1718 { "adcS", { eAX, Iv }, 0 },
4e7d34a6
L
1719 { X86_64_TABLE (X86_64_16) },
1720 { X86_64_TABLE (X86_64_17) },
252b5132 1721 /* 18 */
bf890a93
IT
1722 { "sbbB", { Ebh1, Gb }, 0 },
1723 { "sbbS", { Evh1, Gv }, 0 },
1724 { "sbbB", { Gb, EbS }, 0 },
1725 { "sbbS", { Gv, EvS }, 0 },
1726 { "sbbB", { AL, Ib }, 0 },
1727 { "sbbS", { eAX, Iv }, 0 },
4e7d34a6
L
1728 { X86_64_TABLE (X86_64_1E) },
1729 { X86_64_TABLE (X86_64_1F) },
252b5132 1730 /* 20 */
bf890a93
IT
1731 { "andB", { Ebh1, Gb }, 0 },
1732 { "andS", { Evh1, Gv }, 0 },
1733 { "andB", { Gb, EbS }, 0 },
1734 { "andS", { Gv, EvS }, 0 },
1735 { "andB", { AL, Ib }, 0 },
1736 { "andS", { eAX, Iv }, 0 },
592d1631 1737 { Bad_Opcode }, /* SEG ES prefix */
4e7d34a6 1738 { X86_64_TABLE (X86_64_27) },
252b5132 1739 /* 28 */
bf890a93
IT
1740 { "subB", { Ebh1, Gb }, 0 },
1741 { "subS", { Evh1, Gv }, 0 },
1742 { "subB", { Gb, EbS }, 0 },
1743 { "subS", { Gv, EvS }, 0 },
1744 { "subB", { AL, Ib }, 0 },
1745 { "subS", { eAX, Iv }, 0 },
592d1631 1746 { Bad_Opcode }, /* SEG CS prefix */
4e7d34a6 1747 { X86_64_TABLE (X86_64_2F) },
252b5132 1748 /* 30 */
bf890a93
IT
1749 { "xorB", { Ebh1, Gb }, 0 },
1750 { "xorS", { Evh1, Gv }, 0 },
1751 { "xorB", { Gb, EbS }, 0 },
1752 { "xorS", { Gv, EvS }, 0 },
1753 { "xorB", { AL, Ib }, 0 },
1754 { "xorS", { eAX, Iv }, 0 },
592d1631 1755 { Bad_Opcode }, /* SEG SS prefix */
4e7d34a6 1756 { X86_64_TABLE (X86_64_37) },
252b5132 1757 /* 38 */
bf890a93
IT
1758 { "cmpB", { Eb, Gb }, 0 },
1759 { "cmpS", { Ev, Gv }, 0 },
1760 { "cmpB", { Gb, EbS }, 0 },
1761 { "cmpS", { Gv, EvS }, 0 },
1762 { "cmpB", { AL, Ib }, 0 },
1763 { "cmpS", { eAX, Iv }, 0 },
592d1631 1764 { Bad_Opcode }, /* SEG DS prefix */
4e7d34a6 1765 { X86_64_TABLE (X86_64_3F) },
252b5132 1766 /* 40 */
bf890a93
IT
1767 { "inc{S|}", { RMeAX }, 0 },
1768 { "inc{S|}", { RMeCX }, 0 },
1769 { "inc{S|}", { RMeDX }, 0 },
1770 { "inc{S|}", { RMeBX }, 0 },
1771 { "inc{S|}", { RMeSP }, 0 },
1772 { "inc{S|}", { RMeBP }, 0 },
1773 { "inc{S|}", { RMeSI }, 0 },
1774 { "inc{S|}", { RMeDI }, 0 },
252b5132 1775 /* 48 */
bf890a93
IT
1776 { "dec{S|}", { RMeAX }, 0 },
1777 { "dec{S|}", { RMeCX }, 0 },
1778 { "dec{S|}", { RMeDX }, 0 },
1779 { "dec{S|}", { RMeBX }, 0 },
1780 { "dec{S|}", { RMeSP }, 0 },
1781 { "dec{S|}", { RMeBP }, 0 },
1782 { "dec{S|}", { RMeSI }, 0 },
1783 { "dec{S|}", { RMeDI }, 0 },
252b5132 1784 /* 50 */
c3f5525f
JB
1785 { "push{!P|}", { RMrAX }, 0 },
1786 { "push{!P|}", { RMrCX }, 0 },
1787 { "push{!P|}", { RMrDX }, 0 },
1788 { "push{!P|}", { RMrBX }, 0 },
1789 { "push{!P|}", { RMrSP }, 0 },
1790 { "push{!P|}", { RMrBP }, 0 },
1791 { "push{!P|}", { RMrSI }, 0 },
1792 { "push{!P|}", { RMrDI }, 0 },
252b5132 1793 /* 58 */
c3f5525f
JB
1794 { "pop{!P|}", { RMrAX }, 0 },
1795 { "pop{!P|}", { RMrCX }, 0 },
1796 { "pop{!P|}", { RMrDX }, 0 },
1797 { "pop{!P|}", { RMrBX }, 0 },
1798 { "pop{!P|}", { RMrSP }, 0 },
1799 { "pop{!P|}", { RMrBP }, 0 },
1800 { "pop{!P|}", { RMrSI }, 0 },
1801 { "pop{!P|}", { RMrDI }, 0 },
252b5132 1802 /* 60 */
4e7d34a6
L
1803 { X86_64_TABLE (X86_64_60) },
1804 { X86_64_TABLE (X86_64_61) },
1805 { X86_64_TABLE (X86_64_62) },
1806 { X86_64_TABLE (X86_64_63) },
592d1631
L
1807 { Bad_Opcode }, /* seg fs */
1808 { Bad_Opcode }, /* seg gs */
1809 { Bad_Opcode }, /* op size prefix */
1810 { Bad_Opcode }, /* adr size prefix */
252b5132 1811 /* 68 */
36938cab 1812 { "pushP", { sIv }, 0 },
bf890a93 1813 { "imulS", { Gv, Ev, Iv }, 0 },
36938cab 1814 { "pushP", { sIbT }, 0 },
bf890a93
IT
1815 { "imulS", { Gv, Ev, sIb }, 0 },
1816 { "ins{b|}", { Ybr, indirDX }, 0 },
4e7d34a6 1817 { X86_64_TABLE (X86_64_6D) },
bf890a93 1818 { "outs{b|}", { indirDXr, Xb }, 0 },
4e7d34a6 1819 { X86_64_TABLE (X86_64_6F) },
252b5132 1820 /* 70 */
bf890a93
IT
1821 { "joH", { Jb, BND, cond_jump_flag }, 0 },
1822 { "jnoH", { Jb, BND, cond_jump_flag }, 0 },
1823 { "jbH", { Jb, BND, cond_jump_flag }, 0 },
1824 { "jaeH", { Jb, BND, cond_jump_flag }, 0 },
1825 { "jeH", { Jb, BND, cond_jump_flag }, 0 },
1826 { "jneH", { Jb, BND, cond_jump_flag }, 0 },
1827 { "jbeH", { Jb, BND, cond_jump_flag }, 0 },
1828 { "jaH", { Jb, BND, cond_jump_flag }, 0 },
252b5132 1829 /* 78 */
bf890a93
IT
1830 { "jsH", { Jb, BND, cond_jump_flag }, 0 },
1831 { "jnsH", { Jb, BND, cond_jump_flag }, 0 },
1832 { "jpH", { Jb, BND, cond_jump_flag }, 0 },
1833 { "jnpH", { Jb, BND, cond_jump_flag }, 0 },
1834 { "jlH", { Jb, BND, cond_jump_flag }, 0 },
1835 { "jgeH", { Jb, BND, cond_jump_flag }, 0 },
1836 { "jleH", { Jb, BND, cond_jump_flag }, 0 },
1837 { "jgH", { Jb, BND, cond_jump_flag }, 0 },
252b5132 1838 /* 80 */
1ceb70f8
L
1839 { REG_TABLE (REG_80) },
1840 { REG_TABLE (REG_81) },
d039fef3 1841 { X86_64_TABLE (X86_64_82) },
7148c369 1842 { REG_TABLE (REG_83) },
bf890a93
IT
1843 { "testB", { Eb, Gb }, 0 },
1844 { "testS", { Ev, Gv }, 0 },
1845 { "xchgB", { Ebh2, Gb }, 0 },
1846 { "xchgS", { Evh2, Gv }, 0 },
252b5132 1847 /* 88 */
bf890a93
IT
1848 { "movB", { Ebh3, Gb }, 0 },
1849 { "movS", { Evh3, Gv }, 0 },
1850 { "movB", { Gb, EbS }, 0 },
1851 { "movS", { Gv, EvS }, 0 },
1852 { "movD", { Sv, Sw }, 0 },
1ceb70f8 1853 { MOD_TABLE (MOD_8D) },
bf890a93 1854 { "movD", { Sw, Sv }, 0 },
1ceb70f8 1855 { REG_TABLE (REG_8F) },
252b5132 1856 /* 90 */
1ceb70f8 1857 { PREFIX_TABLE (PREFIX_90) },
bf890a93
IT
1858 { "xchgS", { RMeCX, eAX }, 0 },
1859 { "xchgS", { RMeDX, eAX }, 0 },
1860 { "xchgS", { RMeBX, eAX }, 0 },
1861 { "xchgS", { RMeSP, eAX }, 0 },
1862 { "xchgS", { RMeBP, eAX }, 0 },
1863 { "xchgS", { RMeSI, eAX }, 0 },
1864 { "xchgS", { RMeDI, eAX }, 0 },
252b5132 1865 /* 98 */
bf890a93
IT
1866 { "cW{t|}R", { XX }, 0 },
1867 { "cR{t|}O", { XX }, 0 },
4e7d34a6 1868 { X86_64_TABLE (X86_64_9A) },
592d1631 1869 { Bad_Opcode }, /* fwait */
36938cab
JB
1870 { "pushfP", { XX }, 0 },
1871 { "popfP", { XX }, 0 },
bf890a93
IT
1872 { "sahf", { XX }, 0 },
1873 { "lahf", { XX }, 0 },
252b5132 1874 /* a0 */
bf890a93
IT
1875 { "mov%LB", { AL, Ob }, 0 },
1876 { "mov%LS", { eAX, Ov }, 0 },
1877 { "mov%LB", { Ob, AL }, 0 },
1878 { "mov%LS", { Ov, eAX }, 0 },
1879 { "movs{b|}", { Ybr, Xb }, 0 },
1880 { "movs{R|}", { Yvr, Xv }, 0 },
1881 { "cmps{b|}", { Xb, Yb }, 0 },
1882 { "cmps{R|}", { Xv, Yv }, 0 },
252b5132 1883 /* a8 */
bf890a93
IT
1884 { "testB", { AL, Ib }, 0 },
1885 { "testS", { eAX, Iv }, 0 },
1886 { "stosB", { Ybr, AL }, 0 },
1887 { "stosS", { Yvr, eAX }, 0 },
1888 { "lodsB", { ALr, Xb }, 0 },
1889 { "lodsS", { eAXr, Xv }, 0 },
1890 { "scasB", { AL, Yb }, 0 },
1891 { "scasS", { eAX, Yv }, 0 },
252b5132 1892 /* b0 */
bf890a93
IT
1893 { "movB", { RMAL, Ib }, 0 },
1894 { "movB", { RMCL, Ib }, 0 },
1895 { "movB", { RMDL, Ib }, 0 },
1896 { "movB", { RMBL, Ib }, 0 },
1897 { "movB", { RMAH, Ib }, 0 },
1898 { "movB", { RMCH, Ib }, 0 },
1899 { "movB", { RMDH, Ib }, 0 },
1900 { "movB", { RMBH, Ib }, 0 },
252b5132 1901 /* b8 */
bf890a93
IT
1902 { "mov%LV", { RMeAX, Iv64 }, 0 },
1903 { "mov%LV", { RMeCX, Iv64 }, 0 },
1904 { "mov%LV", { RMeDX, Iv64 }, 0 },
1905 { "mov%LV", { RMeBX, Iv64 }, 0 },
1906 { "mov%LV", { RMeSP, Iv64 }, 0 },
1907 { "mov%LV", { RMeBP, Iv64 }, 0 },
1908 { "mov%LV", { RMeSI, Iv64 }, 0 },
1909 { "mov%LV", { RMeDI, Iv64 }, 0 },
252b5132 1910 /* c0 */
1ceb70f8
L
1911 { REG_TABLE (REG_C0) },
1912 { REG_TABLE (REG_C1) },
aeab2b26
JB
1913 { X86_64_TABLE (X86_64_C2) },
1914 { X86_64_TABLE (X86_64_C3) },
4e7d34a6
L
1915 { X86_64_TABLE (X86_64_C4) },
1916 { X86_64_TABLE (X86_64_C5) },
1ceb70f8
L
1917 { REG_TABLE (REG_C6) },
1918 { REG_TABLE (REG_C7) },
252b5132 1919 /* c8 */
36938cab
JB
1920 { "enterP", { Iw, Ib }, 0 },
1921 { "leaveP", { XX }, 0 },
1922 { "{l|}ret{|f}%LP", { Iw }, 0 },
1923 { "{l|}ret{|f}%LP", { XX }, 0 },
bf890a93
IT
1924 { "int3", { XX }, 0 },
1925 { "int", { Ib }, 0 },
4e7d34a6 1926 { X86_64_TABLE (X86_64_CE) },
bf890a93 1927 { "iret%LP", { XX }, 0 },
252b5132 1928 /* d0 */
1ceb70f8
L
1929 { REG_TABLE (REG_D0) },
1930 { REG_TABLE (REG_D1) },
1931 { REG_TABLE (REG_D2) },
1932 { REG_TABLE (REG_D3) },
4e7d34a6
L
1933 { X86_64_TABLE (X86_64_D4) },
1934 { X86_64_TABLE (X86_64_D5) },
592d1631 1935 { Bad_Opcode },
bf890a93 1936 { "xlat", { DSBX }, 0 },
252b5132
RH
1937 /* d8 */
1938 { FLOAT },
1939 { FLOAT },
1940 { FLOAT },
1941 { FLOAT },
1942 { FLOAT },
1943 { FLOAT },
1944 { FLOAT },
1945 { FLOAT },
1946 /* e0 */
bf890a93
IT
1947 { "loopneFH", { Jb, XX, loop_jcxz_flag }, 0 },
1948 { "loopeFH", { Jb, XX, loop_jcxz_flag }, 0 },
1949 { "loopFH", { Jb, XX, loop_jcxz_flag }, 0 },
1950 { "jEcxzH", { Jb, XX, loop_jcxz_flag }, 0 },
1951 { "inB", { AL, Ib }, 0 },
1952 { "inG", { zAX, Ib }, 0 },
1953 { "outB", { Ib, AL }, 0 },
1954 { "outG", { Ib, zAX }, 0 },
252b5132 1955 /* e8 */
a72d2af2
L
1956 { X86_64_TABLE (X86_64_E8) },
1957 { X86_64_TABLE (X86_64_E9) },
4e7d34a6 1958 { X86_64_TABLE (X86_64_EA) },
bf890a93
IT
1959 { "jmp", { Jb, BND }, 0 },
1960 { "inB", { AL, indirDX }, 0 },
1961 { "inG", { zAX, indirDX }, 0 },
1962 { "outB", { indirDX, AL }, 0 },
1963 { "outG", { indirDX, zAX }, 0 },
252b5132 1964 /* f0 */
592d1631 1965 { Bad_Opcode }, /* lock prefix */
bf890a93 1966 { "icebp", { XX }, 0 },
592d1631
L
1967 { Bad_Opcode }, /* repne */
1968 { Bad_Opcode }, /* repz */
bf890a93
IT
1969 { "hlt", { XX }, 0 },
1970 { "cmc", { XX }, 0 },
1ceb70f8
L
1971 { REG_TABLE (REG_F6) },
1972 { REG_TABLE (REG_F7) },
252b5132 1973 /* f8 */
bf890a93
IT
1974 { "clc", { XX }, 0 },
1975 { "stc", { XX }, 0 },
1976 { "cli", { XX }, 0 },
1977 { "sti", { XX }, 0 },
1978 { "cld", { XX }, 0 },
1979 { "std", { XX }, 0 },
1ceb70f8
L
1980 { REG_TABLE (REG_FE) },
1981 { REG_TABLE (REG_FF) },
252b5132
RH
1982};
1983
6439fc28 1984static const struct dis386 dis386_twobyte[] = {
252b5132 1985 /* 00 */
1ceb70f8
L
1986 { REG_TABLE (REG_0F00 ) },
1987 { REG_TABLE (REG_0F01 ) },
bf890a93
IT
1988 { "larS", { Gv, Ew }, 0 },
1989 { "lslS", { Gv, Ew }, 0 },
592d1631 1990 { Bad_Opcode },
bf890a93
IT
1991 { "syscall", { XX }, 0 },
1992 { "clts", { XX }, 0 },
589958d6 1993 { "sysret%LQ", { XX }, 0 },
252b5132 1994 /* 08 */
bf890a93 1995 { "invd", { XX }, 0 },
3233d7d0 1996 { PREFIX_TABLE (PREFIX_0F09) },
592d1631 1997 { Bad_Opcode },
bf890a93 1998 { "ud2", { XX }, 0 },
592d1631 1999 { Bad_Opcode },
b5b1fc4f 2000 { REG_TABLE (REG_0F0D) },
bf890a93
IT
2001 { "femms", { XX }, 0 },
2002 { "", { MX, EM, OPSUF }, 0 }, /* See OP_3DNowSuffix. */
252b5132 2003 /* 10 */
1ceb70f8
L
2004 { PREFIX_TABLE (PREFIX_0F10) },
2005 { PREFIX_TABLE (PREFIX_0F11) },
2006 { PREFIX_TABLE (PREFIX_0F12) },
2007 { MOD_TABLE (MOD_0F13) },
507bd325
L
2008 { "unpcklpX", { XM, EXx }, PREFIX_OPCODE },
2009 { "unpckhpX", { XM, EXx }, PREFIX_OPCODE },
1ceb70f8
L
2010 { PREFIX_TABLE (PREFIX_0F16) },
2011 { MOD_TABLE (MOD_0F17) },
252b5132 2012 /* 18 */
1ceb70f8 2013 { REG_TABLE (REG_0F18) },
bf890a93 2014 { "nopQ", { Ev }, 0 },
7e8b059b
L
2015 { PREFIX_TABLE (PREFIX_0F1A) },
2016 { PREFIX_TABLE (PREFIX_0F1B) },
c48935d7 2017 { PREFIX_TABLE (PREFIX_0F1C) },
bf890a93 2018 { "nopQ", { Ev }, 0 },
603555e5 2019 { PREFIX_TABLE (PREFIX_0F1E) },
bf890a93 2020 { "nopQ", { Ev }, 0 },
252b5132 2021 /* 20 */
78467458
JB
2022 { "movZ", { Em, Cm }, 0 },
2023 { "movZ", { Em, Dm }, 0 },
2024 { "movZ", { Cm, Em }, 0 },
2025 { "movZ", { Dm, Em }, 0 },
2026 { X86_64_TABLE (X86_64_0F24) },
592d1631 2027 { Bad_Opcode },
78467458 2028 { X86_64_TABLE (X86_64_0F26) },
592d1631 2029 { Bad_Opcode },
252b5132 2030 /* 28 */
507bd325
L
2031 { "movapX", { XM, EXx }, PREFIX_OPCODE },
2032 { "movapX", { EXxS, XM }, PREFIX_OPCODE },
1ceb70f8
L
2033 { PREFIX_TABLE (PREFIX_0F2A) },
2034 { PREFIX_TABLE (PREFIX_0F2B) },
2035 { PREFIX_TABLE (PREFIX_0F2C) },
2036 { PREFIX_TABLE (PREFIX_0F2D) },
2037 { PREFIX_TABLE (PREFIX_0F2E) },
2038 { PREFIX_TABLE (PREFIX_0F2F) },
252b5132 2039 /* 30 */
bf890a93
IT
2040 { "wrmsr", { XX }, 0 },
2041 { "rdtsc", { XX }, 0 },
2042 { "rdmsr", { XX }, 0 },
2043 { "rdpmc", { XX }, 0 },
d835a58b 2044 { "sysenter", { SEP }, 0 },
e93a3b27 2045 { "sysexit%LQ", { SEP }, 0 },
592d1631 2046 { Bad_Opcode },
bf890a93 2047 { "getsec", { XX }, 0 },
252b5132 2048 /* 38 */
507bd325 2049 { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F38, PREFIX_OPCODE) },
592d1631 2050 { Bad_Opcode },
507bd325 2051 { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F3A, PREFIX_OPCODE) },
592d1631
L
2052 { Bad_Opcode },
2053 { Bad_Opcode },
2054 { Bad_Opcode },
2055 { Bad_Opcode },
2056 { Bad_Opcode },
252b5132 2057 /* 40 */
bf890a93
IT
2058 { "cmovoS", { Gv, Ev }, 0 },
2059 { "cmovnoS", { Gv, Ev }, 0 },
2060 { "cmovbS", { Gv, Ev }, 0 },
2061 { "cmovaeS", { Gv, Ev }, 0 },
2062 { "cmoveS", { Gv, Ev }, 0 },
2063 { "cmovneS", { Gv, Ev }, 0 },
2064 { "cmovbeS", { Gv, Ev }, 0 },
2065 { "cmovaS", { Gv, Ev }, 0 },
252b5132 2066 /* 48 */
bf890a93
IT
2067 { "cmovsS", { Gv, Ev }, 0 },
2068 { "cmovnsS", { Gv, Ev }, 0 },
2069 { "cmovpS", { Gv, Ev }, 0 },
2070 { "cmovnpS", { Gv, Ev }, 0 },
2071 { "cmovlS", { Gv, Ev }, 0 },
2072 { "cmovgeS", { Gv, Ev }, 0 },
2073 { "cmovleS", { Gv, Ev }, 0 },
2074 { "cmovgS", { Gv, Ev }, 0 },
252b5132 2075 /* 50 */
a5aaedb9 2076 { MOD_TABLE (MOD_0F50) },
1ceb70f8
L
2077 { PREFIX_TABLE (PREFIX_0F51) },
2078 { PREFIX_TABLE (PREFIX_0F52) },
2079 { PREFIX_TABLE (PREFIX_0F53) },
507bd325
L
2080 { "andpX", { XM, EXx }, PREFIX_OPCODE },
2081 { "andnpX", { XM, EXx }, PREFIX_OPCODE },
2082 { "orpX", { XM, EXx }, PREFIX_OPCODE },
2083 { "xorpX", { XM, EXx }, PREFIX_OPCODE },
252b5132 2084 /* 58 */
1ceb70f8
L
2085 { PREFIX_TABLE (PREFIX_0F58) },
2086 { PREFIX_TABLE (PREFIX_0F59) },
2087 { PREFIX_TABLE (PREFIX_0F5A) },
2088 { PREFIX_TABLE (PREFIX_0F5B) },
2089 { PREFIX_TABLE (PREFIX_0F5C) },
2090 { PREFIX_TABLE (PREFIX_0F5D) },
2091 { PREFIX_TABLE (PREFIX_0F5E) },
2092 { PREFIX_TABLE (PREFIX_0F5F) },
252b5132 2093 /* 60 */
1ceb70f8
L
2094 { PREFIX_TABLE (PREFIX_0F60) },
2095 { PREFIX_TABLE (PREFIX_0F61) },
2096 { PREFIX_TABLE (PREFIX_0F62) },
507bd325
L
2097 { "packsswb", { MX, EM }, PREFIX_OPCODE },
2098 { "pcmpgtb", { MX, EM }, PREFIX_OPCODE },
2099 { "pcmpgtw", { MX, EM }, PREFIX_OPCODE },
2100 { "pcmpgtd", { MX, EM }, PREFIX_OPCODE },
2101 { "packuswb", { MX, EM }, PREFIX_OPCODE },
252b5132 2102 /* 68 */
507bd325
L
2103 { "punpckhbw", { MX, EM }, PREFIX_OPCODE },
2104 { "punpckhwd", { MX, EM }, PREFIX_OPCODE },
2105 { "punpckhdq", { MX, EM }, PREFIX_OPCODE },
2106 { "packssdw", { MX, EM }, PREFIX_OPCODE },
7531c613
JB
2107 { "punpcklqdq", { XM, EXx }, PREFIX_DATA },
2108 { "punpckhqdq", { XM, EXx }, PREFIX_DATA },
507bd325 2109 { "movK", { MX, Edq }, PREFIX_OPCODE },
1ceb70f8 2110 { PREFIX_TABLE (PREFIX_0F6F) },
252b5132 2111 /* 70 */
1ceb70f8 2112 { PREFIX_TABLE (PREFIX_0F70) },
00ec1875
JB
2113 { MOD_TABLE (MOD_0F71) },
2114 { MOD_TABLE (MOD_0F72) },
2115 { MOD_TABLE (MOD_0F73) },
507bd325
L
2116 { "pcmpeqb", { MX, EM }, PREFIX_OPCODE },
2117 { "pcmpeqw", { MX, EM }, PREFIX_OPCODE },
2118 { "pcmpeqd", { MX, EM }, PREFIX_OPCODE },
2119 { "emms", { XX }, PREFIX_OPCODE },
252b5132 2120 /* 78 */
1ceb70f8
L
2121 { PREFIX_TABLE (PREFIX_0F78) },
2122 { PREFIX_TABLE (PREFIX_0F79) },
1f334aeb 2123 { Bad_Opcode },
592d1631 2124 { Bad_Opcode },
1ceb70f8
L
2125 { PREFIX_TABLE (PREFIX_0F7C) },
2126 { PREFIX_TABLE (PREFIX_0F7D) },
2127 { PREFIX_TABLE (PREFIX_0F7E) },
2128 { PREFIX_TABLE (PREFIX_0F7F) },
252b5132 2129 /* 80 */
bf890a93
IT
2130 { "joH", { Jv, BND, cond_jump_flag }, 0 },
2131 { "jnoH", { Jv, BND, cond_jump_flag }, 0 },
2132 { "jbH", { Jv, BND, cond_jump_flag }, 0 },
2133 { "jaeH", { Jv, BND, cond_jump_flag }, 0 },
2134 { "jeH", { Jv, BND, cond_jump_flag }, 0 },
2135 { "jneH", { Jv, BND, cond_jump_flag }, 0 },
2136 { "jbeH", { Jv, BND, cond_jump_flag }, 0 },
2137 { "jaH", { Jv, BND, cond_jump_flag }, 0 },
252b5132 2138 /* 88 */
bf890a93
IT
2139 { "jsH", { Jv, BND, cond_jump_flag }, 0 },
2140 { "jnsH", { Jv, BND, cond_jump_flag }, 0 },
2141 { "jpH", { Jv, BND, cond_jump_flag }, 0 },
2142 { "jnpH", { Jv, BND, cond_jump_flag }, 0 },
2143 { "jlH", { Jv, BND, cond_jump_flag }, 0 },
2144 { "jgeH", { Jv, BND, cond_jump_flag }, 0 },
2145 { "jleH", { Jv, BND, cond_jump_flag }, 0 },
2146 { "jgH", { Jv, BND, cond_jump_flag }, 0 },
252b5132 2147 /* 90 */
bf890a93
IT
2148 { "seto", { Eb }, 0 },
2149 { "setno", { Eb }, 0 },
2150 { "setb", { Eb }, 0 },
2151 { "setae", { Eb }, 0 },
2152 { "sete", { Eb }, 0 },
2153 { "setne", { Eb }, 0 },
2154 { "setbe", { Eb }, 0 },
2155 { "seta", { Eb }, 0 },
252b5132 2156 /* 98 */
bf890a93
IT
2157 { "sets", { Eb }, 0 },
2158 { "setns", { Eb }, 0 },
2159 { "setp", { Eb }, 0 },
2160 { "setnp", { Eb }, 0 },
2161 { "setl", { Eb }, 0 },
2162 { "setge", { Eb }, 0 },
2163 { "setle", { Eb }, 0 },
2164 { "setg", { Eb }, 0 },
252b5132 2165 /* a0 */
36938cab
JB
2166 { "pushP", { fs }, 0 },
2167 { "popP", { fs }, 0 },
bf890a93
IT
2168 { "cpuid", { XX }, 0 },
2169 { "btS", { Ev, Gv }, 0 },
2170 { "shldS", { Ev, Gv, Ib }, 0 },
2171 { "shldS", { Ev, Gv, CL }, 0 },
1ceb70f8
L
2172 { REG_TABLE (REG_0FA6) },
2173 { REG_TABLE (REG_0FA7) },
252b5132 2174 /* a8 */
36938cab
JB
2175 { "pushP", { gs }, 0 },
2176 { "popP", { gs }, 0 },
bf890a93
IT
2177 { "rsm", { XX }, 0 },
2178 { "btsS", { Evh1, Gv }, 0 },
2179 { "shrdS", { Ev, Gv, Ib }, 0 },
2180 { "shrdS", { Ev, Gv, CL }, 0 },
1ceb70f8 2181 { REG_TABLE (REG_0FAE) },
bf890a93 2182 { "imulS", { Gv, Ev }, 0 },
252b5132 2183 /* b0 */
bf890a93
IT
2184 { "cmpxchgB", { Ebh1, Gb }, 0 },
2185 { "cmpxchgS", { Evh1, Gv }, 0 },
1ceb70f8 2186 { MOD_TABLE (MOD_0FB2) },
bf890a93 2187 { "btrS", { Evh1, Gv }, 0 },
1ceb70f8
L
2188 { MOD_TABLE (MOD_0FB4) },
2189 { MOD_TABLE (MOD_0FB5) },
bf890a93
IT
2190 { "movz{bR|x}", { Gv, Eb }, 0 },
2191 { "movz{wR|x}", { Gv, Ew }, 0 }, /* yes, there really is movzww ! */
252b5132 2192 /* b8 */
1ceb70f8 2193 { PREFIX_TABLE (PREFIX_0FB8) },
66f1eba0 2194 { "ud1S", { Gv, Ev }, 0 },
1ceb70f8 2195 { REG_TABLE (REG_0FBA) },
bf890a93 2196 { "btcS", { Evh1, Gv }, 0 },
f12dc422 2197 { PREFIX_TABLE (PREFIX_0FBC) },
1ceb70f8 2198 { PREFIX_TABLE (PREFIX_0FBD) },
bf890a93
IT
2199 { "movs{bR|x}", { Gv, Eb }, 0 },
2200 { "movs{wR|x}", { Gv, Ew }, 0 }, /* yes, there really is movsww ! */
252b5132 2201 /* c0 */
bf890a93
IT
2202 { "xaddB", { Ebh1, Gb }, 0 },
2203 { "xaddS", { Evh1, Gv }, 0 },
1ceb70f8 2204 { PREFIX_TABLE (PREFIX_0FC2) },
a8484f96 2205 { MOD_TABLE (MOD_0FC3) },
507bd325
L
2206 { "pinsrw", { MX, Edqw, Ib }, PREFIX_OPCODE },
2207 { "pextrw", { Gdq, MS, Ib }, PREFIX_OPCODE },
2208 { "shufpX", { XM, EXx, Ib }, PREFIX_OPCODE },
1ceb70f8 2209 { REG_TABLE (REG_0FC7) },
252b5132 2210 /* c8 */
bf890a93
IT
2211 { "bswap", { RMeAX }, 0 },
2212 { "bswap", { RMeCX }, 0 },
2213 { "bswap", { RMeDX }, 0 },
2214 { "bswap", { RMeBX }, 0 },
2215 { "bswap", { RMeSP }, 0 },
2216 { "bswap", { RMeBP }, 0 },
2217 { "bswap", { RMeSI }, 0 },
2218 { "bswap", { RMeDI }, 0 },
252b5132 2219 /* d0 */
1ceb70f8 2220 { PREFIX_TABLE (PREFIX_0FD0) },
507bd325
L
2221 { "psrlw", { MX, EM }, PREFIX_OPCODE },
2222 { "psrld", { MX, EM }, PREFIX_OPCODE },
2223 { "psrlq", { MX, EM }, PREFIX_OPCODE },
2224 { "paddq", { MX, EM }, PREFIX_OPCODE },
2225 { "pmullw", { MX, EM }, PREFIX_OPCODE },
1ceb70f8 2226 { PREFIX_TABLE (PREFIX_0FD6) },
75c135a8 2227 { MOD_TABLE (MOD_0FD7) },
252b5132 2228 /* d8 */
507bd325
L
2229 { "psubusb", { MX, EM }, PREFIX_OPCODE },
2230 { "psubusw", { MX, EM }, PREFIX_OPCODE },
2231 { "pminub", { MX, EM }, PREFIX_OPCODE },
2232 { "pand", { MX, EM }, PREFIX_OPCODE },
2233 { "paddusb", { MX, EM }, PREFIX_OPCODE },
2234 { "paddusw", { MX, EM }, PREFIX_OPCODE },
2235 { "pmaxub", { MX, EM }, PREFIX_OPCODE },
2236 { "pandn", { MX, EM }, PREFIX_OPCODE },
252b5132 2237 /* e0 */
507bd325
L
2238 { "pavgb", { MX, EM }, PREFIX_OPCODE },
2239 { "psraw", { MX, EM }, PREFIX_OPCODE },
2240 { "psrad", { MX, EM }, PREFIX_OPCODE },
2241 { "pavgw", { MX, EM }, PREFIX_OPCODE },
2242 { "pmulhuw", { MX, EM }, PREFIX_OPCODE },
2243 { "pmulhw", { MX, EM }, PREFIX_OPCODE },
1ceb70f8
L
2244 { PREFIX_TABLE (PREFIX_0FE6) },
2245 { PREFIX_TABLE (PREFIX_0FE7) },
252b5132 2246 /* e8 */
507bd325
L
2247 { "psubsb", { MX, EM }, PREFIX_OPCODE },
2248 { "psubsw", { MX, EM }, PREFIX_OPCODE },
2249 { "pminsw", { MX, EM }, PREFIX_OPCODE },
2250 { "por", { MX, EM }, PREFIX_OPCODE },
2251 { "paddsb", { MX, EM }, PREFIX_OPCODE },
2252 { "paddsw", { MX, EM }, PREFIX_OPCODE },
2253 { "pmaxsw", { MX, EM }, PREFIX_OPCODE },
2254 { "pxor", { MX, EM }, PREFIX_OPCODE },
252b5132 2255 /* f0 */
1ceb70f8 2256 { PREFIX_TABLE (PREFIX_0FF0) },
507bd325
L
2257 { "psllw", { MX, EM }, PREFIX_OPCODE },
2258 { "pslld", { MX, EM }, PREFIX_OPCODE },
2259 { "psllq", { MX, EM }, PREFIX_OPCODE },
2260 { "pmuludq", { MX, EM }, PREFIX_OPCODE },
2261 { "pmaddwd", { MX, EM }, PREFIX_OPCODE },
2262 { "psadbw", { MX, EM }, PREFIX_OPCODE },
1ceb70f8 2263 { PREFIX_TABLE (PREFIX_0FF7) },
252b5132 2264 /* f8 */
507bd325
L
2265 { "psubb", { MX, EM }, PREFIX_OPCODE },
2266 { "psubw", { MX, EM }, PREFIX_OPCODE },
2267 { "psubd", { MX, EM }, PREFIX_OPCODE },
2268 { "psubq", { MX, EM }, PREFIX_OPCODE },
2269 { "paddb", { MX, EM }, PREFIX_OPCODE },
2270 { "paddw", { MX, EM }, PREFIX_OPCODE },
2271 { "paddd", { MX, EM }, PREFIX_OPCODE },
66f1eba0 2272 { "ud0S", { Gv, Ev }, 0 },
252b5132
RH
2273};
2274
2275static const unsigned char onebyte_has_modrm[256] = {
c608c12e
AM
2276 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2277 /* ------------------------------- */
2278 /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
2279 /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
2280 /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
2281 /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
2282 /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
2283 /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
2284 /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
2285 /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
2286 /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
2287 /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
2288 /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
2289 /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
2290 /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
2291 /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
2292 /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
2293 /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1 /* f0 */
2294 /* ------------------------------- */
2295 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
252b5132
RH
2296};
2297
2298static const unsigned char twobyte_has_modrm[256] = {
c608c12e
AM
2299 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2300 /* ------------------------------- */
252b5132 2301 /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
b5b1fc4f 2302 /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
85f10a01 2303 /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
331d2d0d 2304 /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
252b5132 2305 /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
4bba6815
AM
2306 /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
2307 /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
85f10a01 2308 /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
252b5132
RH
2309 /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
2310 /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
30d1c836 2311 /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
66f1eba0 2312 /* b0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* bf */
252b5132 2313 /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
ca164297 2314 /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
4bba6815 2315 /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
66f1eba0 2316 /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 /* ff */
c608c12e
AM
2317 /* ------------------------------- */
2318 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2319};
2320
252b5132
RH
2321static char obuf[100];
2322static char *obufp;
ea397f5b 2323static char *mnemonicendp;
252b5132
RH
2324static char scratchbuf[100];
2325static unsigned char *start_codep;
2326static unsigned char *insn_codep;
2327static unsigned char *codep;
285ca992 2328static unsigned char *end_codep;
f16cd0d5
L
2329static int last_lock_prefix;
2330static int last_repz_prefix;
2331static int last_repnz_prefix;
2332static int last_data_prefix;
2333static int last_addr_prefix;
2334static int last_rex_prefix;
2335static int last_seg_prefix;
d9949a36 2336static int fwait_prefix;
285ca992
L
2337/* The active segment register prefix. */
2338static int active_seg_prefix;
f16cd0d5
L
2339#define MAX_CODE_LENGTH 15
2340/* We can up to 14 prefixes since the maximum instruction length is
2341 15bytes. */
2342static int all_prefixes[MAX_CODE_LENGTH - 1];
252b5132 2343static disassemble_info *the_info;
7967e09e
L
2344static struct
2345 {
2346 int mod;
7967e09e 2347 int reg;
484c222e 2348 int rm;
7967e09e
L
2349 }
2350modrm;
4bba6815 2351static unsigned char need_modrm;
dfc8cf43
L
2352static struct
2353 {
2354 int scale;
2355 int index;
2356 int base;
2357 }
2358sib;
c0f3af97
L
2359static struct
2360 {
2361 int register_specifier;
2362 int length;
2363 int prefix;
2364 int w;
43234a1e
L
2365 int evex;
2366 int r;
2367 int v;
2368 int mask_register_specifier;
2369 int zeroing;
2370 int ll;
2371 int b;
c0f3af97
L
2372 }
2373vex;
2374static unsigned char need_vex;
252b5132 2375
ea397f5b
L
2376struct op
2377 {
2378 const char *name;
2379 unsigned int len;
2380 };
2381
4bba6815
AM
2382/* If we are accessing mod/rm/reg without need_modrm set, then the
2383 values are stale. Hitting this abort likely indicates that you
2384 need to update onebyte_has_modrm or twobyte_has_modrm. */
2385#define MODRM_CHECK if (!need_modrm) abort ()
2386
d708bcba
AM
2387static const char **names64;
2388static const char **names32;
2389static const char **names16;
2390static const char **names8;
2391static const char **names8rex;
2392static const char **names_seg;
db51cc60
L
2393static const char *index64;
2394static const char *index32;
d708bcba 2395static const char **index16;
7e8b059b 2396static const char **names_bnd;
d708bcba
AM
2397
2398static const char *intel_names64[] = {
2399 "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
2400 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2401};
2402static const char *intel_names32[] = {
2403 "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
2404 "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
2405};
2406static const char *intel_names16[] = {
2407 "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
2408 "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
2409};
2410static const char *intel_names8[] = {
2411 "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
2412};
2413static const char *intel_names8rex[] = {
2414 "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
2415 "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
2416};
2417static const char *intel_names_seg[] = {
2418 "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
2419};
db51cc60
L
2420static const char *intel_index64 = "riz";
2421static const char *intel_index32 = "eiz";
d708bcba
AM
2422static const char *intel_index16[] = {
2423 "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
2424};
2425
2426static const char *att_names64[] = {
2427 "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
52b15da3
JH
2428 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
2429};
d708bcba
AM
2430static const char *att_names32[] = {
2431 "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
52b15da3 2432 "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
252b5132 2433};
d708bcba
AM
2434static const char *att_names16[] = {
2435 "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
52b15da3 2436 "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
252b5132 2437};
d708bcba
AM
2438static const char *att_names8[] = {
2439 "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
252b5132 2440};
d708bcba
AM
2441static const char *att_names8rex[] = {
2442 "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
52b15da3
JH
2443 "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
2444};
d708bcba
AM
2445static const char *att_names_seg[] = {
2446 "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
252b5132 2447};
db51cc60
L
2448static const char *att_index64 = "%riz";
2449static const char *att_index32 = "%eiz";
d708bcba
AM
2450static const char *att_index16[] = {
2451 "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
252b5132
RH
2452};
2453
b9733481
L
2454static const char **names_mm;
2455static const char *intel_names_mm[] = {
2456 "mm0", "mm1", "mm2", "mm3",
2457 "mm4", "mm5", "mm6", "mm7"
2458};
2459static const char *att_names_mm[] = {
2460 "%mm0", "%mm1", "%mm2", "%mm3",
2461 "%mm4", "%mm5", "%mm6", "%mm7"
2462};
2463
7e8b059b
L
2464static const char *intel_names_bnd[] = {
2465 "bnd0", "bnd1", "bnd2", "bnd3"
2466};
2467
2468static const char *att_names_bnd[] = {
2469 "%bnd0", "%bnd1", "%bnd2", "%bnd3"
2470};
2471
b9733481
L
2472static const char **names_xmm;
2473static const char *intel_names_xmm[] = {
2474 "xmm0", "xmm1", "xmm2", "xmm3",
2475 "xmm4", "xmm5", "xmm6", "xmm7",
2476 "xmm8", "xmm9", "xmm10", "xmm11",
43234a1e
L
2477 "xmm12", "xmm13", "xmm14", "xmm15",
2478 "xmm16", "xmm17", "xmm18", "xmm19",
2479 "xmm20", "xmm21", "xmm22", "xmm23",
2480 "xmm24", "xmm25", "xmm26", "xmm27",
2481 "xmm28", "xmm29", "xmm30", "xmm31"
b9733481
L
2482};
2483static const char *att_names_xmm[] = {
2484 "%xmm0", "%xmm1", "%xmm2", "%xmm3",
2485 "%xmm4", "%xmm5", "%xmm6", "%xmm7",
2486 "%xmm8", "%xmm9", "%xmm10", "%xmm11",
43234a1e
L
2487 "%xmm12", "%xmm13", "%xmm14", "%xmm15",
2488 "%xmm16", "%xmm17", "%xmm18", "%xmm19",
2489 "%xmm20", "%xmm21", "%xmm22", "%xmm23",
2490 "%xmm24", "%xmm25", "%xmm26", "%xmm27",
2491 "%xmm28", "%xmm29", "%xmm30", "%xmm31"
b9733481
L
2492};
2493
2494static const char **names_ymm;
2495static const char *intel_names_ymm[] = {
2496 "ymm0", "ymm1", "ymm2", "ymm3",
2497 "ymm4", "ymm5", "ymm6", "ymm7",
2498 "ymm8", "ymm9", "ymm10", "ymm11",
43234a1e
L
2499 "ymm12", "ymm13", "ymm14", "ymm15",
2500 "ymm16", "ymm17", "ymm18", "ymm19",
2501 "ymm20", "ymm21", "ymm22", "ymm23",
2502 "ymm24", "ymm25", "ymm26", "ymm27",
2503 "ymm28", "ymm29", "ymm30", "ymm31"
b9733481
L
2504};
2505static const char *att_names_ymm[] = {
2506 "%ymm0", "%ymm1", "%ymm2", "%ymm3",
2507 "%ymm4", "%ymm5", "%ymm6", "%ymm7",
2508 "%ymm8", "%ymm9", "%ymm10", "%ymm11",
43234a1e
L
2509 "%ymm12", "%ymm13", "%ymm14", "%ymm15",
2510 "%ymm16", "%ymm17", "%ymm18", "%ymm19",
2511 "%ymm20", "%ymm21", "%ymm22", "%ymm23",
2512 "%ymm24", "%ymm25", "%ymm26", "%ymm27",
2513 "%ymm28", "%ymm29", "%ymm30", "%ymm31"
2514};
2515
2516static const char **names_zmm;
2517static const char *intel_names_zmm[] = {
2518 "zmm0", "zmm1", "zmm2", "zmm3",
2519 "zmm4", "zmm5", "zmm6", "zmm7",
2520 "zmm8", "zmm9", "zmm10", "zmm11",
2521 "zmm12", "zmm13", "zmm14", "zmm15",
2522 "zmm16", "zmm17", "zmm18", "zmm19",
2523 "zmm20", "zmm21", "zmm22", "zmm23",
2524 "zmm24", "zmm25", "zmm26", "zmm27",
2525 "zmm28", "zmm29", "zmm30", "zmm31"
2526};
2527static const char *att_names_zmm[] = {
2528 "%zmm0", "%zmm1", "%zmm2", "%zmm3",
2529 "%zmm4", "%zmm5", "%zmm6", "%zmm7",
2530 "%zmm8", "%zmm9", "%zmm10", "%zmm11",
2531 "%zmm12", "%zmm13", "%zmm14", "%zmm15",
2532 "%zmm16", "%zmm17", "%zmm18", "%zmm19",
2533 "%zmm20", "%zmm21", "%zmm22", "%zmm23",
2534 "%zmm24", "%zmm25", "%zmm26", "%zmm27",
2535 "%zmm28", "%zmm29", "%zmm30", "%zmm31"
2536};
2537
260cd341
LC
2538static const char **names_tmm;
2539static const char *intel_names_tmm[] = {
2540 "tmm0", "tmm1", "tmm2", "tmm3",
2541 "tmm4", "tmm5", "tmm6", "tmm7"
2542};
2543static const char *att_names_tmm[] = {
2544 "%tmm0", "%tmm1", "%tmm2", "%tmm3",
2545 "%tmm4", "%tmm5", "%tmm6", "%tmm7"
2546};
2547
43234a1e
L
2548static const char **names_mask;
2549static const char *intel_names_mask[] = {
2550 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7"
2551};
2552static const char *att_names_mask[] = {
2553 "%k0", "%k1", "%k2", "%k3", "%k4", "%k5", "%k6", "%k7"
2554};
2555
2556static const char *names_rounding[] =
2557{
2558 "{rn-sae}",
2559 "{rd-sae}",
2560 "{ru-sae}",
2561 "{rz-sae}"
b9733481
L
2562};
2563
1ceb70f8
L
2564static const struct dis386 reg_table[][8] = {
2565 /* REG_80 */
252b5132 2566 {
bf890a93
IT
2567 { "addA", { Ebh1, Ib }, 0 },
2568 { "orA", { Ebh1, Ib }, 0 },
2569 { "adcA", { Ebh1, Ib }, 0 },
2570 { "sbbA", { Ebh1, Ib }, 0 },
2571 { "andA", { Ebh1, Ib }, 0 },
2572 { "subA", { Ebh1, Ib }, 0 },
2573 { "xorA", { Ebh1, Ib }, 0 },
2574 { "cmpA", { Eb, Ib }, 0 },
252b5132 2575 },
1ceb70f8 2576 /* REG_81 */
252b5132 2577 {
bf890a93
IT
2578 { "addQ", { Evh1, Iv }, 0 },
2579 { "orQ", { Evh1, Iv }, 0 },
2580 { "adcQ", { Evh1, Iv }, 0 },
2581 { "sbbQ", { Evh1, Iv }, 0 },
2582 { "andQ", { Evh1, Iv }, 0 },
2583 { "subQ", { Evh1, Iv }, 0 },
2584 { "xorQ", { Evh1, Iv }, 0 },
2585 { "cmpQ", { Ev, Iv }, 0 },
252b5132 2586 },
7148c369 2587 /* REG_83 */
252b5132 2588 {
bf890a93
IT
2589 { "addQ", { Evh1, sIb }, 0 },
2590 { "orQ", { Evh1, sIb }, 0 },
2591 { "adcQ", { Evh1, sIb }, 0 },
2592 { "sbbQ", { Evh1, sIb }, 0 },
2593 { "andQ", { Evh1, sIb }, 0 },
2594 { "subQ", { Evh1, sIb }, 0 },
2595 { "xorQ", { Evh1, sIb }, 0 },
2596 { "cmpQ", { Ev, sIb }, 0 },
252b5132 2597 },
1ceb70f8 2598 /* REG_8F */
4e7d34a6 2599 {
36938cab 2600 { "pop{P|}", { stackEv }, 0 },
c48244a5 2601 { XOP_8F_TABLE (XOP_09) },
592d1631
L
2602 { Bad_Opcode },
2603 { Bad_Opcode },
2604 { Bad_Opcode },
f88c9eb0 2605 { XOP_8F_TABLE (XOP_09) },
4e7d34a6 2606 },
1ceb70f8 2607 /* REG_C0 */
252b5132 2608 {
bf890a93
IT
2609 { "rolA", { Eb, Ib }, 0 },
2610 { "rorA", { Eb, Ib }, 0 },
2611 { "rclA", { Eb, Ib }, 0 },
2612 { "rcrA", { Eb, Ib }, 0 },
2613 { "shlA", { Eb, Ib }, 0 },
2614 { "shrA", { Eb, Ib }, 0 },
e4bdd679 2615 { "shlA", { Eb, Ib }, 0 },
bf890a93 2616 { "sarA", { Eb, Ib }, 0 },
252b5132 2617 },
1ceb70f8 2618 /* REG_C1 */
252b5132 2619 {
bf890a93
IT
2620 { "rolQ", { Ev, Ib }, 0 },
2621 { "rorQ", { Ev, Ib }, 0 },
2622 { "rclQ", { Ev, Ib }, 0 },
2623 { "rcrQ", { Ev, Ib }, 0 },
2624 { "shlQ", { Ev, Ib }, 0 },
2625 { "shrQ", { Ev, Ib }, 0 },
e4bdd679 2626 { "shlQ", { Ev, Ib }, 0 },
bf890a93 2627 { "sarQ", { Ev, Ib }, 0 },
252b5132 2628 },
1ceb70f8 2629 /* REG_C6 */
4e7d34a6 2630 {
bf890a93 2631 { "movA", { Ebh3, Ib }, 0 },
42164a71
L
2632 { Bad_Opcode },
2633 { Bad_Opcode },
2634 { Bad_Opcode },
2635 { Bad_Opcode },
2636 { Bad_Opcode },
2637 { Bad_Opcode },
2638 { MOD_TABLE (MOD_C6_REG_7) },
4e7d34a6 2639 },
1ceb70f8 2640 /* REG_C7 */
4e7d34a6 2641 {
bf890a93 2642 { "movQ", { Evh3, Iv }, 0 },
42164a71
L
2643 { Bad_Opcode },
2644 { Bad_Opcode },
2645 { Bad_Opcode },
2646 { Bad_Opcode },
2647 { Bad_Opcode },
2648 { Bad_Opcode },
2649 { MOD_TABLE (MOD_C7_REG_7) },
4e7d34a6 2650 },
1ceb70f8 2651 /* REG_D0 */
252b5132 2652 {
bf890a93
IT
2653 { "rolA", { Eb, I1 }, 0 },
2654 { "rorA", { Eb, I1 }, 0 },
2655 { "rclA", { Eb, I1 }, 0 },
2656 { "rcrA", { Eb, I1 }, 0 },
2657 { "shlA", { Eb, I1 }, 0 },
2658 { "shrA", { Eb, I1 }, 0 },
e4bdd679 2659 { "shlA", { Eb, I1 }, 0 },
bf890a93 2660 { "sarA", { Eb, I1 }, 0 },
252b5132 2661 },
1ceb70f8 2662 /* REG_D1 */
252b5132 2663 {
bf890a93
IT
2664 { "rolQ", { Ev, I1 }, 0 },
2665 { "rorQ", { Ev, I1 }, 0 },
2666 { "rclQ", { Ev, I1 }, 0 },
2667 { "rcrQ", { Ev, I1 }, 0 },
2668 { "shlQ", { Ev, I1 }, 0 },
2669 { "shrQ", { Ev, I1 }, 0 },
e4bdd679 2670 { "shlQ", { Ev, I1 }, 0 },
bf890a93 2671 { "sarQ", { Ev, I1 }, 0 },
252b5132 2672 },
1ceb70f8 2673 /* REG_D2 */
252b5132 2674 {
bf890a93
IT
2675 { "rolA", { Eb, CL }, 0 },
2676 { "rorA", { Eb, CL }, 0 },
2677 { "rclA", { Eb, CL }, 0 },
2678 { "rcrA", { Eb, CL }, 0 },
2679 { "shlA", { Eb, CL }, 0 },
2680 { "shrA", { Eb, CL }, 0 },
e4bdd679 2681 { "shlA", { Eb, CL }, 0 },
bf890a93 2682 { "sarA", { Eb, CL }, 0 },
252b5132 2683 },
1ceb70f8 2684 /* REG_D3 */
252b5132 2685 {
bf890a93
IT
2686 { "rolQ", { Ev, CL }, 0 },
2687 { "rorQ", { Ev, CL }, 0 },
2688 { "rclQ", { Ev, CL }, 0 },
2689 { "rcrQ", { Ev, CL }, 0 },
2690 { "shlQ", { Ev, CL }, 0 },
2691 { "shrQ", { Ev, CL }, 0 },
e4bdd679 2692 { "shlQ", { Ev, CL }, 0 },
bf890a93 2693 { "sarQ", { Ev, CL }, 0 },
252b5132 2694 },
1ceb70f8 2695 /* REG_F6 */
252b5132 2696 {
bf890a93 2697 { "testA", { Eb, Ib }, 0 },
7db2c588 2698 { "testA", { Eb, Ib }, 0 },
bf890a93
IT
2699 { "notA", { Ebh1 }, 0 },
2700 { "negA", { Ebh1 }, 0 },
2701 { "mulA", { Eb }, 0 }, /* Don't print the implicit %al register, */
2702 { "imulA", { Eb }, 0 }, /* to distinguish these opcodes from other */
2703 { "divA", { Eb }, 0 }, /* mul/imul opcodes. Do the same for div */
2704 { "idivA", { Eb }, 0 }, /* and idiv for consistency. */
252b5132 2705 },
1ceb70f8 2706 /* REG_F7 */
252b5132 2707 {
bf890a93 2708 { "testQ", { Ev, Iv }, 0 },
7db2c588 2709 { "testQ", { Ev, Iv }, 0 },
bf890a93
IT
2710 { "notQ", { Evh1 }, 0 },
2711 { "negQ", { Evh1 }, 0 },
2712 { "mulQ", { Ev }, 0 }, /* Don't print the implicit register. */
2713 { "imulQ", { Ev }, 0 },
2714 { "divQ", { Ev }, 0 },
2715 { "idivQ", { Ev }, 0 },
252b5132 2716 },
1ceb70f8 2717 /* REG_FE */
252b5132 2718 {
bf890a93
IT
2719 { "incA", { Ebh1 }, 0 },
2720 { "decA", { Ebh1 }, 0 },
252b5132 2721 },
1ceb70f8 2722 /* REG_FF */
252b5132 2723 {
bf890a93
IT
2724 { "incQ", { Evh1 }, 0 },
2725 { "decQ", { Evh1 }, 0 },
36938cab 2726 { "call{@|}", { NOTRACK, indirEv, BND }, 0 },
4a357820 2727 { MOD_TABLE (MOD_FF_REG_3) },
36938cab 2728 { "jmp{@|}", { NOTRACK, indirEv, BND }, 0 },
4a357820 2729 { MOD_TABLE (MOD_FF_REG_5) },
36938cab 2730 { "push{P|}", { stackEv }, 0 },
592d1631 2731 { Bad_Opcode },
252b5132 2732 },
1ceb70f8 2733 /* REG_0F00 */
252b5132 2734 {
bf890a93
IT
2735 { "sldtD", { Sv }, 0 },
2736 { "strD", { Sv }, 0 },
2737 { "lldt", { Ew }, 0 },
2738 { "ltr", { Ew }, 0 },
2739 { "verr", { Ew }, 0 },
2740 { "verw", { Ew }, 0 },
592d1631
L
2741 { Bad_Opcode },
2742 { Bad_Opcode },
252b5132 2743 },
1ceb70f8 2744 /* REG_0F01 */
252b5132 2745 {
1ceb70f8
L
2746 { MOD_TABLE (MOD_0F01_REG_0) },
2747 { MOD_TABLE (MOD_0F01_REG_1) },
2748 { MOD_TABLE (MOD_0F01_REG_2) },
2749 { MOD_TABLE (MOD_0F01_REG_3) },
bf890a93 2750 { "smswD", { Sv }, 0 },
8eab4136 2751 { MOD_TABLE (MOD_0F01_REG_5) },
bf890a93 2752 { "lmsw", { Ew }, 0 },
1ceb70f8 2753 { MOD_TABLE (MOD_0F01_REG_7) },
252b5132 2754 },
b5b1fc4f 2755 /* REG_0F0D */
252b5132 2756 {
bf890a93
IT
2757 { "prefetch", { Mb }, 0 },
2758 { "prefetchw", { Mb }, 0 },
2759 { "prefetchwt1", { Mb }, 0 },
2760 { "prefetch", { Mb }, 0 },
2761 { "prefetch", { Mb }, 0 },
2762 { "prefetch", { Mb }, 0 },
2763 { "prefetch", { Mb }, 0 },
2764 { "prefetch", { Mb }, 0 },
252b5132 2765 },
1ceb70f8 2766 /* REG_0F18 */
252b5132 2767 {
1ceb70f8
L
2768 { MOD_TABLE (MOD_0F18_REG_0) },
2769 { MOD_TABLE (MOD_0F18_REG_1) },
2770 { MOD_TABLE (MOD_0F18_REG_2) },
2771 { MOD_TABLE (MOD_0F18_REG_3) },
31941983
JB
2772 { "nopQ", { Ev }, 0 },
2773 { "nopQ", { Ev }, 0 },
2774 { "nopQ", { Ev }, 0 },
2775 { "nopQ", { Ev }, 0 },
252b5132 2776 },
f8687e93 2777 /* REG_0F1C_P_0_MOD_0 */
c48935d7
IT
2778 {
2779 { "cldemote", { Mb }, 0 },
2780 { "nopQ", { Ev }, 0 },
2781 { "nopQ", { Ev }, 0 },
2782 { "nopQ", { Ev }, 0 },
2783 { "nopQ", { Ev }, 0 },
2784 { "nopQ", { Ev }, 0 },
2785 { "nopQ", { Ev }, 0 },
2786 { "nopQ", { Ev }, 0 },
2787 },
f8687e93 2788 /* REG_0F1E_P_1_MOD_3 */
603555e5 2789 {
31941983
JB
2790 { "nopQ", { Ev }, PREFIX_IGNORED },
2791 { "rdsspK", { Edq }, 0 },
2792 { "nopQ", { Ev }, PREFIX_IGNORED },
2793 { "nopQ", { Ev }, PREFIX_IGNORED },
2794 { "nopQ", { Ev }, PREFIX_IGNORED },
2795 { "nopQ", { Ev }, PREFIX_IGNORED },
2796 { "nopQ", { Ev }, PREFIX_IGNORED },
f8687e93 2797 { RM_TABLE (RM_0F1E_P_1_MOD_3_REG_7) },
603555e5 2798 },
c4694f17
TG
2799 /* REG_0F38D8_PREFIX_1 */
2800 {
2801 { "aesencwide128kl", { M }, 0 },
2802 { "aesdecwide128kl", { M }, 0 },
2803 { "aesencwide256kl", { M }, 0 },
2804 { "aesdecwide256kl", { M }, 0 },
2805 },
c1fa250a
LC
2806 /* REG_0F3A0F_PREFIX_1_MOD_3 */
2807 {
2808 { RM_TABLE (RM_0F3A0F_P_1_MOD_3_REG_0) },
2809 },
00ec1875 2810 /* REG_0F71_MOD_0 */
a6bd098c 2811 {
592d1631
L
2812 { Bad_Opcode },
2813 { Bad_Opcode },
00ec1875 2814 { "psrlw", { MS, Ib }, PREFIX_OPCODE },
592d1631 2815 { Bad_Opcode },
00ec1875 2816 { "psraw", { MS, Ib }, PREFIX_OPCODE },
592d1631 2817 { Bad_Opcode },
00ec1875 2818 { "psllw", { MS, Ib }, PREFIX_OPCODE },
a6bd098c 2819 },
00ec1875 2820 /* REG_0F72_MOD_0 */
a6bd098c 2821 {
592d1631
L
2822 { Bad_Opcode },
2823 { Bad_Opcode },
00ec1875 2824 { "psrld", { MS, Ib }, PREFIX_OPCODE },
592d1631 2825 { Bad_Opcode },
00ec1875 2826 { "psrad", { MS, Ib }, PREFIX_OPCODE },
592d1631 2827 { Bad_Opcode },
00ec1875 2828 { "pslld", { MS, Ib }, PREFIX_OPCODE },
a6bd098c 2829 },
00ec1875 2830 /* REG_0F73_MOD_0 */
252b5132 2831 {
592d1631
L
2832 { Bad_Opcode },
2833 { Bad_Opcode },
00ec1875
JB
2834 { "psrlq", { MS, Ib }, PREFIX_OPCODE },
2835 { "psrldq", { XS, Ib }, PREFIX_DATA },
592d1631
L
2836 { Bad_Opcode },
2837 { Bad_Opcode },
00ec1875
JB
2838 { "psllq", { MS, Ib }, PREFIX_OPCODE },
2839 { "pslldq", { XS, Ib }, PREFIX_DATA },
252b5132 2840 },
1ceb70f8 2841 /* REG_0FA6 */
252b5132 2842 {
bf890a93
IT
2843 { "montmul", { { OP_0f07, 0 } }, 0 },
2844 { "xsha1", { { OP_0f07, 0 } }, 0 },
2845 { "xsha256", { { OP_0f07, 0 } }, 0 },
4e7d34a6 2846 },
1ceb70f8 2847 /* REG_0FA7 */
4e7d34a6 2848 {
bf890a93
IT
2849 { "xstore-rng", { { OP_0f07, 0 } }, 0 },
2850 { "xcrypt-ecb", { { OP_0f07, 0 } }, 0 },
2851 { "xcrypt-cbc", { { OP_0f07, 0 } }, 0 },
2852 { "xcrypt-ctr", { { OP_0f07, 0 } }, 0 },
2853 { "xcrypt-cfb", { { OP_0f07, 0 } }, 0 },
2854 { "xcrypt-ofb", { { OP_0f07, 0 } }, 0 },
4e7d34a6 2855 },
1ceb70f8 2856 /* REG_0FAE */
4e7d34a6 2857 {
1ceb70f8
L
2858 { MOD_TABLE (MOD_0FAE_REG_0) },
2859 { MOD_TABLE (MOD_0FAE_REG_1) },
2860 { MOD_TABLE (MOD_0FAE_REG_2) },
2861 { MOD_TABLE (MOD_0FAE_REG_3) },
475a2301 2862 { MOD_TABLE (MOD_0FAE_REG_4) },
1ceb70f8
L
2863 { MOD_TABLE (MOD_0FAE_REG_5) },
2864 { MOD_TABLE (MOD_0FAE_REG_6) },
2865 { MOD_TABLE (MOD_0FAE_REG_7) },
252b5132 2866 },
1ceb70f8 2867 /* REG_0FBA */
252b5132 2868 {
592d1631
L
2869 { Bad_Opcode },
2870 { Bad_Opcode },
2871 { Bad_Opcode },
2872 { Bad_Opcode },
bf890a93
IT
2873 { "btQ", { Ev, Ib }, 0 },
2874 { "btsQ", { Evh1, Ib }, 0 },
2875 { "btrQ", { Evh1, Ib }, 0 },
2876 { "btcQ", { Evh1, Ib }, 0 },
c608c12e 2877 },
1ceb70f8 2878 /* REG_0FC7 */
c608c12e 2879 {
592d1631 2880 { Bad_Opcode },
bf890a93 2881 { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } }, 0 },
592d1631 2882 { Bad_Opcode },
963f3586
IT
2883 { MOD_TABLE (MOD_0FC7_REG_3) },
2884 { MOD_TABLE (MOD_0FC7_REG_4) },
2885 { MOD_TABLE (MOD_0FC7_REG_5) },
1ceb70f8
L
2886 { MOD_TABLE (MOD_0FC7_REG_6) },
2887 { MOD_TABLE (MOD_0FC7_REG_7) },
252b5132 2888 },
14d10c6c 2889 /* REG_VEX_0F71_M_0 */
c0f3af97 2890 {
592d1631
L
2891 { Bad_Opcode },
2892 { Bad_Opcode },
14d10c6c 2893 { "vpsrlw", { Vex, XS, Ib }, PREFIX_DATA },
592d1631 2894 { Bad_Opcode },
14d10c6c 2895 { "vpsraw", { Vex, XS, Ib }, PREFIX_DATA },
592d1631 2896 { Bad_Opcode },
14d10c6c 2897 { "vpsllw", { Vex, XS, Ib }, PREFIX_DATA },
c0f3af97 2898 },
14d10c6c 2899 /* REG_VEX_0F72_M_0 */
c0f3af97 2900 {
592d1631
L
2901 { Bad_Opcode },
2902 { Bad_Opcode },
14d10c6c 2903 { "vpsrld", { Vex, XS, Ib }, PREFIX_DATA },
592d1631 2904 { Bad_Opcode },
14d10c6c 2905 { "vpsrad", { Vex, XS, Ib }, PREFIX_DATA },
592d1631 2906 { Bad_Opcode },
14d10c6c 2907 { "vpslld", { Vex, XS, Ib }, PREFIX_DATA },
c0f3af97 2908 },
14d10c6c 2909 /* REG_VEX_0F73_M_0 */
c0f3af97 2910 {
592d1631
L
2911 { Bad_Opcode },
2912 { Bad_Opcode },
14d10c6c
JB
2913 { "vpsrlq", { Vex, XS, Ib }, PREFIX_DATA },
2914 { "vpsrldq", { Vex, XS, Ib }, PREFIX_DATA },
592d1631
L
2915 { Bad_Opcode },
2916 { Bad_Opcode },
14d10c6c
JB
2917 { "vpsllq", { Vex, XS, Ib }, PREFIX_DATA },
2918 { "vpslldq", { Vex, XS, Ib }, PREFIX_DATA },
c0f3af97 2919 },
592a252b 2920 /* REG_VEX_0FAE */
c0f3af97 2921 {
592d1631
L
2922 { Bad_Opcode },
2923 { Bad_Opcode },
592a252b
L
2924 { MOD_TABLE (MOD_VEX_0FAE_REG_2) },
2925 { MOD_TABLE (MOD_VEX_0FAE_REG_3) },
c0f3af97 2926 },
260cd341
LC
2927 /* REG_VEX_0F3849_X86_64_P_0_W_0_M_1 */
2928 {
2929 { RM_TABLE (RM_VEX_0F3849_X86_64_P_0_W_0_M_1_R_0) },
2930 },
14d10c6c 2931 /* REG_VEX_0F38F3_L_0 */
f12dc422
L
2932 {
2933 { Bad_Opcode },
14d10c6c
JB
2934 { "blsrS", { VexGdq, Edq }, PREFIX_OPCODE },
2935 { "blsmskS", { VexGdq, Edq }, PREFIX_OPCODE },
2936 { "blsiS", { VexGdq, Edq }, PREFIX_OPCODE },
f12dc422 2937 },
32e31ad7 2938 /* REG_XOP_09_01_L_0 */
2a2a0f38
QN
2939 {
2940 { Bad_Opcode },
467bbef0
JB
2941 { "blcfill", { VexGdq, Edq }, 0 },
2942 { "blsfill", { VexGdq, Edq }, 0 },
2943 { "blcs", { VexGdq, Edq }, 0 },
2944 { "tzmsk", { VexGdq, Edq }, 0 },
2945 { "blcic", { VexGdq, Edq }, 0 },
2946 { "blsic", { VexGdq, Edq }, 0 },
2947 { "t1mskc", { VexGdq, Edq }, 0 },
2a2a0f38 2948 },
32e31ad7 2949 /* REG_XOP_09_02_L_0 */
2a2a0f38
QN
2950 {
2951 { Bad_Opcode },
467bbef0 2952 { "blcmsk", { VexGdq, Edq }, 0 },
2a2a0f38
QN
2953 { Bad_Opcode },
2954 { Bad_Opcode },
2955 { Bad_Opcode },
2956 { Bad_Opcode },
467bbef0
JB
2957 { "blci", { VexGdq, Edq }, 0 },
2958 },
32e31ad7 2959 /* REG_XOP_09_12_M_1_L_0 */
467bbef0
JB
2960 {
2961 { "llwpcb", { Edq }, 0 },
2962 { "slwpcb", { Edq }, 0 },
2963 },
32e31ad7 2964 /* REG_XOP_0A_12_L_0 */
467bbef0
JB
2965 {
2966 { "lwpins", { VexGdq, Ed, Id }, 0 },
2967 { "lwpval", { VexGdq, Ed, Id }, 0 },
2a2a0f38 2968 },
ad692897
L
2969
2970#include "i386-dis-evex-reg.h"
4e7d34a6
L
2971};
2972
1ceb70f8
L
2973static const struct dis386 prefix_table[][4] = {
2974 /* PREFIX_90 */
252b5132 2975 {
bf890a93
IT
2976 { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } }, 0 },
2977 { "pause", { XX }, 0 },
2978 { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } }, 0 },
507bd325 2979 { NULL, { { NULL, 0 } }, PREFIX_IGNORED }
0f10071e 2980 },
4e7d34a6 2981
81d54bb7
CL
2982 /* PREFIX_0F01_REG_1_RM_4 */
2983 {
2984 { Bad_Opcode },
2985 { Bad_Opcode },
2986 { "tdcall", { Skip_MODRM }, 0 },
2987 { Bad_Opcode },
2988 },
2989
2990 /* PREFIX_0F01_REG_1_RM_5 */
2991 {
2992 { Bad_Opcode },
2993 { Bad_Opcode },
2994 { X86_64_TABLE (X86_64_0F01_REG_1_RM_5_PREFIX_2) },
2995 { Bad_Opcode },
2996 },
2997
2998 /* PREFIX_0F01_REG_1_RM_6 */
2999 {
3000 { Bad_Opcode },
3001 { Bad_Opcode },
3002 { X86_64_TABLE (X86_64_0F01_REG_1_RM_6_PREFIX_2) },
3003 { Bad_Opcode },
3004 },
3005
3006 /* PREFIX_0F01_REG_1_RM_7 */
3007 {
3008 { "encls", { Skip_MODRM }, 0 },
3009 { Bad_Opcode },
3010 { X86_64_TABLE (X86_64_0F01_REG_1_RM_7_PREFIX_2) },
3011 { Bad_Opcode },
3012 },
3013
f9630fa6 3014 /* PREFIX_0F01_REG_3_RM_1 */
a847e322
JB
3015 {
3016 { "vmmcall", { Skip_MODRM }, 0 },
3017 { "vmgexit", { Skip_MODRM }, 0 },
d27c357a
JB
3018 { Bad_Opcode },
3019 { "vmgexit", { Skip_MODRM }, 0 },
a847e322
JB
3020 },
3021
f8687e93 3022 /* PREFIX_0F01_REG_5_MOD_0 */
603555e5
L
3023 {
3024 { Bad_Opcode },
3025 { "rstorssp", { Mq }, PREFIX_OPCODE },
3026 },
3027
f8687e93 3028 /* PREFIX_0F01_REG_5_MOD_3_RM_0 */
603555e5 3029 {
4b27d27c 3030 { "serialize", { Skip_MODRM }, PREFIX_OPCODE },
2234eee6 3031 { "setssbsy", { Skip_MODRM }, PREFIX_OPCODE },
bb651e8b 3032 { Bad_Opcode },
efe30057 3033 { "xsusldtrk", { Skip_MODRM }, PREFIX_OPCODE },
bb651e8b
CL
3034 },
3035
3036 /* PREFIX_0F01_REG_5_MOD_3_RM_1 */
3037 {
3038 { Bad_Opcode },
3039 { Bad_Opcode },
3040 { Bad_Opcode },
3041 { "xresldtrk", { Skip_MODRM }, PREFIX_OPCODE },
603555e5
L
3042 },
3043
f8687e93 3044 /* PREFIX_0F01_REG_5_MOD_3_RM_2 */
603555e5
L
3045 {
3046 { Bad_Opcode },
c2f76402 3047 { "saveprevssp", { Skip_MODRM }, PREFIX_OPCODE },
603555e5
L
3048 },
3049
f64c42a9
LC
3050 /* PREFIX_0F01_REG_5_MOD_3_RM_4 */
3051 {
3052 { Bad_Opcode },
3053 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1) },
3054 },
3055
3056 /* PREFIX_0F01_REG_5_MOD_3_RM_5 */
3057 {
3058 { Bad_Opcode },
3059 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1) },
3060 },
3061
3062 /* PREFIX_0F01_REG_5_MOD_3_RM_6 */
3063 {
3064 { "rdpkru", { Skip_MODRM }, 0 },
3065 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1) },
3066 },
3067
3068 /* PREFIX_0F01_REG_5_MOD_3_RM_7 */
3069 {
3070 { "wrpkru", { Skip_MODRM }, 0 },
3071 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1) },
3072 },
3073
267b8516
JB
3074 /* PREFIX_0F01_REG_7_MOD_3_RM_2 */
3075 {
3076 { "monitorx", { { OP_Monitor, 0 } }, 0 },
142861df 3077 { "mcommit", { Skip_MODRM }, 0 },
267b8516
JB
3078 },
3079
646cc3e0
GG
3080 /* PREFIX_0F01_REG_7_MOD_3_RM_6 */
3081 {
3082 { "invlpgb", { Skip_MODRM }, 0 },
3083 { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1) },
3084 { Bad_Opcode },
3085 { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3) },
3086 },
3087
3088 /* PREFIX_0F01_REG_7_MOD_3_RM_7 */
3089 {
3090 { "tlbsync", { Skip_MODRM }, 0 },
3091 { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1) },
3092 { Bad_Opcode },
3093 { "pvalidate", { Skip_MODRM }, 0 },
3094 },
3095
3233d7d0
IT
3096 /* PREFIX_0F09 */
3097 {
3098 { "wbinvd", { XX }, 0 },
3099 { "wbnoinvd", { XX }, 0 },
3100 },
3101
1ceb70f8 3102 /* PREFIX_0F10 */
cc0ec051 3103 {
507bd325
L
3104 { "movups", { XM, EXx }, PREFIX_OPCODE },
3105 { "movss", { XM, EXd }, PREFIX_OPCODE },
3106 { "movupd", { XM, EXx }, PREFIX_OPCODE },
3107 { "movsd", { XM, EXq }, PREFIX_OPCODE },
30d1c836 3108 },
4e7d34a6 3109
1ceb70f8 3110 /* PREFIX_0F11 */
30d1c836 3111 {
507bd325
L
3112 { "movups", { EXxS, XM }, PREFIX_OPCODE },
3113 { "movss", { EXdS, XM }, PREFIX_OPCODE },
3114 { "movupd", { EXxS, XM }, PREFIX_OPCODE },
3115 { "movsd", { EXqS, XM }, PREFIX_OPCODE },
4e7d34a6 3116 },
252b5132 3117
1ceb70f8 3118 /* PREFIX_0F12 */
c608c12e 3119 {
1ceb70f8 3120 { MOD_TABLE (MOD_0F12_PREFIX_0) },
507bd325 3121 { "movsldup", { XM, EXx }, PREFIX_OPCODE },
18897deb 3122 { MOD_TABLE (MOD_0F12_PREFIX_2) },
507bd325 3123 { "movddup", { XM, EXq }, PREFIX_OPCODE },
c608c12e 3124 },
4e7d34a6 3125
1ceb70f8 3126 /* PREFIX_0F16 */
c608c12e 3127 {
1ceb70f8 3128 { MOD_TABLE (MOD_0F16_PREFIX_0) },
507bd325 3129 { "movshdup", { XM, EXx }, PREFIX_OPCODE },
18897deb 3130 { MOD_TABLE (MOD_0F16_PREFIX_2) },
c608c12e 3131 },
4e7d34a6 3132
7e8b059b
L
3133 /* PREFIX_0F1A */
3134 {
3135 { MOD_TABLE (MOD_0F1A_PREFIX_0) },
bf890a93
IT
3136 { "bndcl", { Gbnd, Ev_bnd }, 0 },
3137 { "bndmov", { Gbnd, Ebnd }, 0 },
3138 { "bndcu", { Gbnd, Ev_bnd }, 0 },
7e8b059b
L
3139 },
3140
3141 /* PREFIX_0F1B */
3142 {
3143 { MOD_TABLE (MOD_0F1B_PREFIX_0) },
3144 { MOD_TABLE (MOD_0F1B_PREFIX_1) },
9f79e886 3145 { "bndmov", { EbndS, Gbnd }, 0 },
bf890a93 3146 { "bndcn", { Gbnd, Ev_bnd }, 0 },
7e8b059b
L
3147 },
3148
c48935d7
IT
3149 /* PREFIX_0F1C */
3150 {
3151 { MOD_TABLE (MOD_0F1C_PREFIX_0) },
31941983
JB
3152 { "nopQ", { Ev }, PREFIX_IGNORED },
3153 { "nopQ", { Ev }, 0 },
3154 { "nopQ", { Ev }, PREFIX_IGNORED },
c48935d7
IT
3155 },
3156
603555e5
L
3157 /* PREFIX_0F1E */
3158 {
31941983 3159 { "nopQ", { Ev }, 0 },
603555e5 3160 { MOD_TABLE (MOD_0F1E_PREFIX_1) },
31941983
JB
3161 { "nopQ", { Ev }, 0 },
3162 { NULL, { XX }, PREFIX_IGNORED },
603555e5
L
3163 },
3164
1ceb70f8 3165 /* PREFIX_0F2A */
c608c12e 3166 {
507bd325 3167 { "cvtpi2ps", { XM, EMCq }, PREFIX_OPCODE },
b24d668c 3168 { "cvtsi2ss{%LQ|}", { XM, Edq }, PREFIX_OPCODE },
507bd325 3169 { "cvtpi2pd", { XM, EMCq }, PREFIX_OPCODE },
b24d668c 3170 { "cvtsi2sd{%LQ|}", { XM, Edq }, 0 },
c608c12e 3171 },
4e7d34a6 3172
1ceb70f8 3173 /* PREFIX_0F2B */
c608c12e 3174 {
75c135a8
L
3175 { MOD_TABLE (MOD_0F2B_PREFIX_0) },
3176 { MOD_TABLE (MOD_0F2B_PREFIX_1) },
3177 { MOD_TABLE (MOD_0F2B_PREFIX_2) },
3178 { MOD_TABLE (MOD_0F2B_PREFIX_3) },
c608c12e 3179 },
4e7d34a6 3180
1ceb70f8 3181 /* PREFIX_0F2C */
c608c12e 3182 {
507bd325 3183 { "cvttps2pi", { MXC, EXq }, PREFIX_OPCODE },
e1a1babd 3184 { "cvttss2si", { Gdq, EXd }, PREFIX_OPCODE },
507bd325 3185 { "cvttpd2pi", { MXC, EXx }, PREFIX_OPCODE },
e1a1babd 3186 { "cvttsd2si", { Gdq, EXq }, PREFIX_OPCODE },
c608c12e 3187 },
4e7d34a6 3188
1ceb70f8 3189 /* PREFIX_0F2D */
c608c12e 3190 {
507bd325 3191 { "cvtps2pi", { MXC, EXq }, PREFIX_OPCODE },
e1a1babd 3192 { "cvtss2si", { Gdq, EXd }, PREFIX_OPCODE },
507bd325 3193 { "cvtpd2pi", { MXC, EXx }, PREFIX_OPCODE },
e1a1babd 3194 { "cvtsd2si", { Gdq, EXq }, PREFIX_OPCODE },
c608c12e 3195 },
4e7d34a6 3196
1ceb70f8 3197 /* PREFIX_0F2E */
c608c12e 3198 {
bf890a93 3199 { "ucomiss",{ XM, EXd }, 0 },
592d1631 3200 { Bad_Opcode },
bf890a93 3201 { "ucomisd",{ XM, EXq }, 0 },
c608c12e 3202 },
4e7d34a6 3203
1ceb70f8 3204 /* PREFIX_0F2F */
c608c12e 3205 {
bf890a93 3206 { "comiss", { XM, EXd }, 0 },
592d1631 3207 { Bad_Opcode },
bf890a93 3208 { "comisd", { XM, EXq }, 0 },
c608c12e 3209 },
4e7d34a6 3210
1ceb70f8 3211 /* PREFIX_0F51 */
c608c12e 3212 {
507bd325
L
3213 { "sqrtps", { XM, EXx }, PREFIX_OPCODE },
3214 { "sqrtss", { XM, EXd }, PREFIX_OPCODE },
3215 { "sqrtpd", { XM, EXx }, PREFIX_OPCODE },
3216 { "sqrtsd", { XM, EXq }, PREFIX_OPCODE },
c608c12e 3217 },
4e7d34a6 3218
1ceb70f8 3219 /* PREFIX_0F52 */
c608c12e 3220 {
507bd325
L
3221 { "rsqrtps",{ XM, EXx }, PREFIX_OPCODE },
3222 { "rsqrtss",{ XM, EXd }, PREFIX_OPCODE },
c608c12e 3223 },
4e7d34a6 3224
1ceb70f8 3225 /* PREFIX_0F53 */
c608c12e 3226 {
507bd325
L
3227 { "rcpps", { XM, EXx }, PREFIX_OPCODE },
3228 { "rcpss", { XM, EXd }, PREFIX_OPCODE },
c608c12e 3229 },
4e7d34a6 3230
1ceb70f8 3231 /* PREFIX_0F58 */
c608c12e 3232 {
507bd325
L
3233 { "addps", { XM, EXx }, PREFIX_OPCODE },
3234 { "addss", { XM, EXd }, PREFIX_OPCODE },
3235 { "addpd", { XM, EXx }, PREFIX_OPCODE },
3236 { "addsd", { XM, EXq }, PREFIX_OPCODE },
c608c12e 3237 },
4e7d34a6 3238
1ceb70f8 3239 /* PREFIX_0F59 */
c608c12e 3240 {
507bd325
L
3241 { "mulps", { XM, EXx }, PREFIX_OPCODE },
3242 { "mulss", { XM, EXd }, PREFIX_OPCODE },
3243 { "mulpd", { XM, EXx }, PREFIX_OPCODE },
3244 { "mulsd", { XM, EXq }, PREFIX_OPCODE },
041bd2e0 3245 },
4e7d34a6 3246
1ceb70f8 3247 /* PREFIX_0F5A */
041bd2e0 3248 {
507bd325
L
3249 { "cvtps2pd", { XM, EXq }, PREFIX_OPCODE },
3250 { "cvtss2sd", { XM, EXd }, PREFIX_OPCODE },
3251 { "cvtpd2ps", { XM, EXx }, PREFIX_OPCODE },
3252 { "cvtsd2ss", { XM, EXq }, PREFIX_OPCODE },
041bd2e0 3253 },
4e7d34a6 3254
1ceb70f8 3255 /* PREFIX_0F5B */
041bd2e0 3256 {
507bd325
L
3257 { "cvtdq2ps", { XM, EXx }, PREFIX_OPCODE },
3258 { "cvttps2dq", { XM, EXx }, PREFIX_OPCODE },
3259 { "cvtps2dq", { XM, EXx }, PREFIX_OPCODE },
041bd2e0 3260 },
4e7d34a6 3261
1ceb70f8 3262 /* PREFIX_0F5C */
041bd2e0 3263 {
507bd325
L
3264 { "subps", { XM, EXx }, PREFIX_OPCODE },
3265 { "subss", { XM, EXd }, PREFIX_OPCODE },
3266 { "subpd", { XM, EXx }, PREFIX_OPCODE },
3267 { "subsd", { XM, EXq }, PREFIX_OPCODE },
041bd2e0 3268 },
4e7d34a6 3269
1ceb70f8 3270 /* PREFIX_0F5D */
041bd2e0 3271 {
507bd325
L
3272 { "minps", { XM, EXx }, PREFIX_OPCODE },
3273 { "minss", { XM, EXd }, PREFIX_OPCODE },
3274 { "minpd", { XM, EXx }, PREFIX_OPCODE },
3275 { "minsd", { XM, EXq }, PREFIX_OPCODE },
041bd2e0 3276 },
4e7d34a6 3277
1ceb70f8 3278 /* PREFIX_0F5E */
041bd2e0 3279 {
507bd325
L
3280 { "divps", { XM, EXx }, PREFIX_OPCODE },
3281 { "divss", { XM, EXd }, PREFIX_OPCODE },
3282 { "divpd", { XM, EXx }, PREFIX_OPCODE },
3283 { "divsd", { XM, EXq }, PREFIX_OPCODE },
041bd2e0 3284 },
4e7d34a6 3285
1ceb70f8 3286 /* PREFIX_0F5F */
041bd2e0 3287 {
507bd325
L
3288 { "maxps", { XM, EXx }, PREFIX_OPCODE },
3289 { "maxss", { XM, EXd }, PREFIX_OPCODE },
3290 { "maxpd", { XM, EXx }, PREFIX_OPCODE },
3291 { "maxsd", { XM, EXq }, PREFIX_OPCODE },
041bd2e0 3292 },
4e7d34a6 3293
1ceb70f8 3294 /* PREFIX_0F60 */
041bd2e0 3295 {
507bd325 3296 { "punpcklbw",{ MX, EMd }, PREFIX_OPCODE },
592d1631 3297 { Bad_Opcode },
507bd325 3298 { "punpcklbw",{ MX, EMx }, PREFIX_OPCODE },
041bd2e0 3299 },
4e7d34a6 3300
1ceb70f8 3301 /* PREFIX_0F61 */
041bd2e0 3302 {
507bd325 3303 { "punpcklwd",{ MX, EMd }, PREFIX_OPCODE },
592d1631 3304 { Bad_Opcode },
507bd325 3305 { "punpcklwd",{ MX, EMx }, PREFIX_OPCODE },
041bd2e0 3306 },
4e7d34a6 3307
1ceb70f8 3308 /* PREFIX_0F62 */
041bd2e0 3309 {
507bd325 3310 { "punpckldq",{ MX, EMd }, PREFIX_OPCODE },
592d1631 3311 { Bad_Opcode },
507bd325 3312 { "punpckldq",{ MX, EMx }, PREFIX_OPCODE },
041bd2e0 3313 },
4e7d34a6 3314
1ceb70f8 3315 /* PREFIX_0F6F */
ca164297 3316 {
507bd325
L
3317 { "movq", { MX, EM }, PREFIX_OPCODE },
3318 { "movdqu", { XM, EXx }, PREFIX_OPCODE },
3319 { "movdqa", { XM, EXx }, PREFIX_OPCODE },
ca164297 3320 },
4e7d34a6 3321
1ceb70f8 3322 /* PREFIX_0F70 */
4e7d34a6 3323 {
507bd325
L
3324 { "pshufw", { MX, EM, Ib }, PREFIX_OPCODE },
3325 { "pshufhw",{ XM, EXx, Ib }, PREFIX_OPCODE },
3326 { "pshufd", { XM, EXx, Ib }, PREFIX_OPCODE },
3327 { "pshuflw",{ XM, EXx, Ib }, PREFIX_OPCODE },
4e7d34a6
L
3328 },
3329
1ceb70f8 3330 /* PREFIX_0F78 */
4e7d34a6 3331 {
bf890a93 3332 {"vmread", { Em, Gm }, 0 },
592d1631 3333 { Bad_Opcode },
bf890a93
IT
3334 {"extrq", { XS, Ib, Ib }, 0 },
3335 {"insertq", { XM, XS, Ib, Ib }, 0 },
4e7d34a6
L
3336 },
3337
1ceb70f8 3338 /* PREFIX_0F79 */
4e7d34a6 3339 {
bf890a93 3340 {"vmwrite", { Gm, Em }, 0 },
592d1631 3341 { Bad_Opcode },
bf890a93
IT
3342 {"extrq", { XM, XS }, 0 },
3343 {"insertq", { XM, XS }, 0 },
4e7d34a6
L
3344 },
3345
1ceb70f8 3346 /* PREFIX_0F7C */
ca164297 3347 {
592d1631
L
3348 { Bad_Opcode },
3349 { Bad_Opcode },
507bd325
L
3350 { "haddpd", { XM, EXx }, PREFIX_OPCODE },
3351 { "haddps", { XM, EXx }, PREFIX_OPCODE },
ca164297 3352 },
4e7d34a6 3353
1ceb70f8 3354 /* PREFIX_0F7D */
ca164297 3355 {
592d1631
L
3356 { Bad_Opcode },
3357 { Bad_Opcode },
507bd325
L
3358 { "hsubpd", { XM, EXx }, PREFIX_OPCODE },
3359 { "hsubps", { XM, EXx }, PREFIX_OPCODE },
ca164297 3360 },
4e7d34a6 3361
1ceb70f8 3362 /* PREFIX_0F7E */
ca164297 3363 {
507bd325
L
3364 { "movK", { Edq, MX }, PREFIX_OPCODE },
3365 { "movq", { XM, EXq }, PREFIX_OPCODE },
3366 { "movK", { Edq, XM }, PREFIX_OPCODE },
ca164297 3367 },
4e7d34a6 3368
1ceb70f8 3369 /* PREFIX_0F7F */
ca164297 3370 {
507bd325
L
3371 { "movq", { EMS, MX }, PREFIX_OPCODE },
3372 { "movdqu", { EXxS, XM }, PREFIX_OPCODE },
3373 { "movdqa", { EXxS, XM }, PREFIX_OPCODE },
ca164297 3374 },
4e7d34a6 3375
f8687e93 3376 /* PREFIX_0FAE_REG_0_MOD_3 */
c7b8aa3a
L
3377 {
3378 { Bad_Opcode },
bf890a93 3379 { "rdfsbase", { Ev }, 0 },
c7b8aa3a
L
3380 },
3381
f8687e93 3382 /* PREFIX_0FAE_REG_1_MOD_3 */
c7b8aa3a
L
3383 {
3384 { Bad_Opcode },
bf890a93 3385 { "rdgsbase", { Ev }, 0 },
c7b8aa3a
L
3386 },
3387
f8687e93 3388 /* PREFIX_0FAE_REG_2_MOD_3 */
c7b8aa3a
L
3389 {
3390 { Bad_Opcode },
bf890a93 3391 { "wrfsbase", { Ev }, 0 },
c7b8aa3a
L
3392 },
3393
f8687e93 3394 /* PREFIX_0FAE_REG_3_MOD_3 */
c7b8aa3a
L
3395 {
3396 { Bad_Opcode },
bf890a93 3397 { "wrgsbase", { Ev }, 0 },
c7b8aa3a
L
3398 },
3399
f8687e93 3400 /* PREFIX_0FAE_REG_4_MOD_0 */
6b40c462
L
3401 {
3402 { "xsave", { FXSAVE }, 0 },
b24d668c 3403 { "ptwrite{%LQ|}", { Edq }, 0 },
6b40c462
L
3404 },
3405
f8687e93 3406 /* PREFIX_0FAE_REG_4_MOD_3 */
6b40c462
L
3407 {
3408 { Bad_Opcode },
b24d668c 3409 { "ptwrite{%LQ|}", { Edq }, 0 },
6b40c462
L
3410 },
3411
f8687e93 3412 /* PREFIX_0FAE_REG_5_MOD_3 */
2234eee6
L
3413 {
3414 { "lfence", { Skip_MODRM }, 0 },
464d2b65 3415 { "incsspK", { Edq }, PREFIX_OPCODE },
603555e5
L
3416 },
3417
f8687e93 3418 /* PREFIX_0FAE_REG_6_MOD_0 */
c5e7287a 3419 {
603555e5
L
3420 { "xsaveopt", { FXSAVE }, PREFIX_OPCODE },
3421 { "clrssbsy", { Mq }, PREFIX_OPCODE },
3422 { "clwb", { Mb }, PREFIX_OPCODE },
c5e7287a
IT
3423 },
3424
f8687e93 3425 /* PREFIX_0FAE_REG_6_MOD_3 */
de89d0a3 3426 {
f8687e93 3427 { RM_TABLE (RM_0FAE_REG_6_MOD_3_P_0) },
de89d0a3 3428 { "umonitor", { Eva }, PREFIX_OPCODE },
ae1d3843
L
3429 { "tpause", { Edq }, PREFIX_OPCODE },
3430 { "umwait", { Edq }, PREFIX_OPCODE },
de89d0a3
IT
3431 },
3432
f8687e93 3433 /* PREFIX_0FAE_REG_7_MOD_0 */
963f3586 3434 {
bf890a93 3435 { "clflush", { Mb }, 0 },
963f3586 3436 { Bad_Opcode },
bf890a93 3437 { "clflushopt", { Mb }, 0 },
963f3586
IT
3438 },
3439
1ceb70f8 3440 /* PREFIX_0FB8 */
ca164297 3441 {
592d1631 3442 { Bad_Opcode },
bf890a93 3443 { "popcntS", { Gv, Ev }, 0 },
ca164297 3444 },
4e7d34a6 3445
f12dc422
L
3446 /* PREFIX_0FBC */
3447 {
bf890a93
IT
3448 { "bsfS", { Gv, Ev }, 0 },
3449 { "tzcntS", { Gv, Ev }, 0 },
3450 { "bsfS", { Gv, Ev }, 0 },
f12dc422
L
3451 },
3452
1ceb70f8 3453 /* PREFIX_0FBD */
050dfa73 3454 {
bf890a93
IT
3455 { "bsrS", { Gv, Ev }, 0 },
3456 { "lzcntS", { Gv, Ev }, 0 },
3457 { "bsrS", { Gv, Ev }, 0 },
050dfa73
MM
3458 },
3459
1ceb70f8 3460 /* PREFIX_0FC2 */
050dfa73 3461 {
507bd325
L
3462 { "cmpps", { XM, EXx, CMP }, PREFIX_OPCODE },
3463 { "cmpss", { XM, EXd, CMP }, PREFIX_OPCODE },
3464 { "cmppd", { XM, EXx, CMP }, PREFIX_OPCODE },
3465 { "cmpsd", { XM, EXq, CMP }, PREFIX_OPCODE },
050dfa73 3466 },
246c51aa 3467
f8687e93 3468 /* PREFIX_0FC7_REG_6_MOD_0 */
92fddf8e 3469 {
bf890a93
IT
3470 { "vmptrld",{ Mq }, 0 },
3471 { "vmxon", { Mq }, 0 },
3472 { "vmclear",{ Mq }, 0 },
92fddf8e
L
3473 },
3474
f8687e93 3475 /* PREFIX_0FC7_REG_6_MOD_3 */
f24bcbaa
L
3476 {
3477 { "rdrand", { Ev }, 0 },
f64c42a9 3478 { X86_64_TABLE (X86_64_0FC7_REG_6_MOD_3_PREFIX_1) },
f24bcbaa
L
3479 { "rdrand", { Ev }, 0 }
3480 },
3481
f8687e93 3482 /* PREFIX_0FC7_REG_7_MOD_3 */
f24bcbaa
L
3483 {
3484 { "rdseed", { Ev }, 0 },
8bc52696 3485 { "rdpid", { Em }, 0 },
f24bcbaa
L
3486 { "rdseed", { Ev }, 0 },
3487 },
3488
1ceb70f8 3489 /* PREFIX_0FD0 */
050dfa73 3490 {
592d1631
L
3491 { Bad_Opcode },
3492 { Bad_Opcode },
bf890a93
IT
3493 { "addsubpd", { XM, EXx }, 0 },
3494 { "addsubps", { XM, EXx }, 0 },
246c51aa 3495 },
050dfa73 3496
1ceb70f8 3497 /* PREFIX_0FD6 */
050dfa73 3498 {
592d1631 3499 { Bad_Opcode },
bf890a93
IT
3500 { "movq2dq",{ XM, MS }, 0 },
3501 { "movq", { EXqS, XM }, 0 },
3502 { "movdq2q",{ MX, XS }, 0 },
050dfa73
MM
3503 },
3504
1ceb70f8 3505 /* PREFIX_0FE6 */
7918206c 3506 {
592d1631 3507 { Bad_Opcode },
507bd325
L
3508 { "cvtdq2pd", { XM, EXq }, PREFIX_OPCODE },
3509 { "cvttpd2dq", { XM, EXx }, PREFIX_OPCODE },
3510 { "cvtpd2dq", { XM, EXx }, PREFIX_OPCODE },
7918206c 3511 },
8b38ad71 3512
1ceb70f8 3513 /* PREFIX_0FE7 */
8b38ad71 3514 {
507bd325 3515 { "movntq", { Mq, MX }, PREFIX_OPCODE },
592d1631 3516 { Bad_Opcode },
75c135a8 3517 { MOD_TABLE (MOD_0FE7_PREFIX_2) },
4e7d34a6
L
3518 },
3519
1ceb70f8 3520 /* PREFIX_0FF0 */
4e7d34a6 3521 {
592d1631
L
3522 { Bad_Opcode },
3523 { Bad_Opcode },
3524 { Bad_Opcode },
1ceb70f8 3525 { MOD_TABLE (MOD_0FF0_PREFIX_3) },
4e7d34a6
L
3526 },
3527
1ceb70f8 3528 /* PREFIX_0FF7 */
4e7d34a6 3529 {
507bd325 3530 { "maskmovq", { MX, MS }, PREFIX_OPCODE },
592d1631 3531 { Bad_Opcode },
507bd325 3532 { "maskmovdqu", { XM, XS }, PREFIX_OPCODE },
8b38ad71 3533 },
42903f7f 3534
c4694f17
TG
3535 /* PREFIX_0F38D8 */
3536 {
3537 { Bad_Opcode },
3538 { REG_TABLE (REG_0F38D8_PREFIX_1) },
3539 },
3540
3541 /* PREFIX_0F38DC */
3542 {
3543 { Bad_Opcode },
3544 { MOD_TABLE (MOD_0F38DC_PREFIX_1) },
3545 { "aesenc", { XM, EXx }, 0 },
3546 },
3547
3548 /* PREFIX_0F38DD */
3549 {
3550 { Bad_Opcode },
3551 { MOD_TABLE (MOD_0F38DD_PREFIX_1) },
3552 { "aesenclast", { XM, EXx }, 0 },
3553 },
3554
3555 /* PREFIX_0F38DE */
3556 {
3557 { Bad_Opcode },
3558 { MOD_TABLE (MOD_0F38DE_PREFIX_1) },
3559 { "aesdec", { XM, EXx }, 0 },
3560 },
3561
3562 /* PREFIX_0F38DF */
3563 {
3564 { Bad_Opcode },
3565 { MOD_TABLE (MOD_0F38DF_PREFIX_1) },
3566 { "aesdeclast", { XM, EXx }, 0 },
3567 },
3568
1ceb70f8 3569 /* PREFIX_0F38F0 */
4e7d34a6 3570 {
9ab00b61 3571 { "movbeS", { Gv, Mv }, PREFIX_OPCODE },
592d1631 3572 { Bad_Opcode },
9ab00b61 3573 { "movbeS", { Gv, Mv }, PREFIX_OPCODE },
2875b28a 3574 { "crc32A", { Gdq, Eb }, PREFIX_OPCODE },
4e7d34a6
L
3575 },
3576
1ceb70f8 3577 /* PREFIX_0F38F1 */
4e7d34a6 3578 {
9ab00b61 3579 { "movbeS", { Mv, Gv }, PREFIX_OPCODE },
592d1631 3580 { Bad_Opcode },
9ab00b61 3581 { "movbeS", { Mv, Gv }, PREFIX_OPCODE },
2875b28a 3582 { "crc32Q", { Gdq, Ev }, PREFIX_OPCODE },
4e7d34a6
L
3583 },
3584
603555e5
L
3585 /* PREFIX_0F38F6 */
3586 {
3587 { MOD_TABLE (MOD_0F38F6_PREFIX_0) },
507bd325
L
3588 { "adoxS", { Gdq, Edq}, PREFIX_OPCODE },
3589 { "adcxS", { Gdq, Edq}, PREFIX_OPCODE },
e2e1fcde
L
3590 { Bad_Opcode },
3591 },
3592
c0a30a9f
L
3593 /* PREFIX_0F38F8 */
3594 {
3595 { Bad_Opcode },
5d79adc4 3596 { MOD_TABLE (MOD_0F38F8_PREFIX_1) },
c0a30a9f 3597 { MOD_TABLE (MOD_0F38F8_PREFIX_2) },
5d79adc4 3598 { MOD_TABLE (MOD_0F38F8_PREFIX_3) },
c0a30a9f 3599 },
c4694f17
TG
3600 /* PREFIX_0F38FA */
3601 {
3602 { Bad_Opcode },
3603 { MOD_TABLE (MOD_0F38FA_PREFIX_1) },
3604 },
3605
3606 /* PREFIX_0F38FB */
3607 {
3608 { Bad_Opcode },
3609 { MOD_TABLE (MOD_0F38FB_PREFIX_1) },
3610 },
c0a30a9f 3611
c1fa250a
LC
3612 /* PREFIX_0F3A0F */
3613 {
3614 { Bad_Opcode },
3615 { MOD_TABLE (MOD_0F3A0F_PREFIX_1)},
3616 },
3617
7531c613 3618 /* PREFIX_VEX_0F10 */
42903f7f 3619 {
7531c613
JB
3620 { "vmovups", { XM, EXx }, 0 },
3621 { "vmovss", { XMScalar, VexScalarR, EXxmm_md }, 0 },
3622 { "vmovupd", { XM, EXx }, 0 },
3623 { "vmovsd", { XMScalar, VexScalarR, EXxmm_mq }, 0 },
42903f7f
L
3624 },
3625
7531c613 3626 /* PREFIX_VEX_0F11 */
42903f7f 3627 {
7531c613
JB
3628 { "vmovups", { EXxS, XM }, 0 },
3629 { "vmovss", { EXdS, VexScalarR, XMScalar }, 0 },
3630 { "vmovupd", { EXxS, XM }, 0 },
3631 { "vmovsd", { EXqS, VexScalarR, XMScalar }, 0 },
42903f7f
L
3632 },
3633
7531c613 3634 /* PREFIX_VEX_0F12 */
42903f7f 3635 {
7531c613
JB
3636 { MOD_TABLE (MOD_VEX_0F12_PREFIX_0) },
3637 { "vmovsldup", { XM, EXx }, 0 },
3638 { MOD_TABLE (MOD_VEX_0F12_PREFIX_2) },
3639 { "vmovddup", { XM, EXymmq }, 0 },
42903f7f
L
3640 },
3641
7531c613 3642 /* PREFIX_VEX_0F16 */
42903f7f 3643 {
7531c613
JB
3644 { MOD_TABLE (MOD_VEX_0F16_PREFIX_0) },
3645 { "vmovshdup", { XM, EXx }, 0 },
3646 { MOD_TABLE (MOD_VEX_0F16_PREFIX_2) },
5f754f58 3647 },
7c52e0e8 3648
592a252b 3649 /* PREFIX_VEX_0F2A */
5f754f58 3650 {
592d1631 3651 { Bad_Opcode },
b24d668c 3652 { "vcvtsi2ss{%LQ|}", { XMScalar, VexScalar, Edq }, 0 },
592d1631 3653 { Bad_Opcode },
b24d668c 3654 { "vcvtsi2sd{%LQ|}", { XMScalar, VexScalar, Edq }, 0 },
5f754f58 3655 },
7c52e0e8 3656
592a252b 3657 /* PREFIX_VEX_0F2C */
5f754f58 3658 {
592d1631 3659 { Bad_Opcode },
17d3c7ec 3660 { "vcvttss2si", { Gdq, EXxmm_md, EXxEVexS }, 0 },
592d1631 3661 { Bad_Opcode },
17d3c7ec 3662 { "vcvttsd2si", { Gdq, EXxmm_mq, EXxEVexS }, 0 },
5f754f58 3663 },
7c52e0e8 3664
592a252b 3665 /* PREFIX_VEX_0F2D */
7c52e0e8 3666 {
592d1631 3667 { Bad_Opcode },
17d3c7ec 3668 { "vcvtss2si", { Gdq, EXxmm_md, EXxEVexR }, 0 },
592d1631 3669 { Bad_Opcode },
17d3c7ec 3670 { "vcvtsd2si", { Gdq, EXxmm_mq, EXxEVexR }, 0 },
7c52e0e8
L
3671 },
3672
592a252b 3673 /* PREFIX_VEX_0F2E */
7c52e0e8 3674 {
17d3c7ec 3675 { "vucomisX", { XMScalar, EXxmm_md, EXxEVexS }, PREFIX_OPCODE },
592d1631 3676 { Bad_Opcode },
17d3c7ec 3677 { "vucomisX", { XMScalar, EXxmm_mq, EXxEVexS }, PREFIX_OPCODE },
7c52e0e8
L
3678 },
3679
592a252b 3680 /* PREFIX_VEX_0F2F */
7c52e0e8 3681 {
17d3c7ec 3682 { "vcomisX", { XMScalar, EXxmm_md, EXxEVexS }, PREFIX_OPCODE },
592d1631 3683 { Bad_Opcode },
17d3c7ec 3684 { "vcomisX", { XMScalar, EXxmm_mq, EXxEVexS }, PREFIX_OPCODE },
7c52e0e8
L
3685 },
3686
13954a31 3687 /* PREFIX_VEX_0F41_L_1_M_1_W_0 */
43234a1e 3688 {
13954a31 3689 { "kandw", { MaskG, MaskVex, MaskE }, 0 },
1ba585e8 3690 { Bad_Opcode },
13954a31 3691 { "kandb", { MaskG, MaskVex, MaskE }, 0 },
43234a1e
L
3692 },
3693
13954a31 3694 /* PREFIX_VEX_0F41_L_1_M_1_W_1 */
43234a1e 3695 {
13954a31 3696 { "kandq", { MaskG, MaskVex, MaskE }, 0 },
1ba585e8 3697 { Bad_Opcode },
13954a31 3698 { "kandd", { MaskG, MaskVex, MaskE }, 0 },
43234a1e
L
3699 },
3700
13954a31 3701 /* PREFIX_VEX_0F42_L_1_M_1_W_0 */
c0f3af97 3702 {
13954a31 3703 { "kandnw", { MaskG, MaskVex, MaskE }, 0 },
592d1631 3704 { Bad_Opcode },
13954a31 3705 { "kandnb", { MaskG, MaskVex, MaskE }, 0 },
c0f3af97
L
3706 },
3707
13954a31 3708 /* PREFIX_VEX_0F42_L_1_M_1_W_1 */
0bfee649 3709 {
13954a31 3710 { "kandnq", { MaskG, MaskVex, MaskE }, 0 },
592d1631 3711 { Bad_Opcode },
13954a31 3712 { "kandnd", { MaskG, MaskVex, MaskE }, 0 },
0bfee649
L
3713 },
3714
13954a31 3715 /* PREFIX_VEX_0F44_L_0_M_1_W_0 */
43234a1e 3716 {
13954a31 3717 { "knotw", { MaskG, MaskE }, 0 },
43234a1e 3718 { Bad_Opcode },
13954a31 3719 { "knotb", { MaskG, MaskE }, 0 },
43234a1e
L
3720 },
3721
13954a31 3722 /* PREFIX_VEX_0F44_L_0_M_1_W_1 */
1ba585e8 3723 {
13954a31 3724 { "knotq", { MaskG, MaskE }, 0 },
1ba585e8 3725 { Bad_Opcode },
13954a31 3726 { "knotd", { MaskG, MaskE }, 0 },
1ba585e8
IT
3727 },
3728
13954a31 3729 /* PREFIX_VEX_0F45_L_1_M_1_W_0 */
43234a1e 3730 {
13954a31 3731 { "korw", { MaskG, MaskVex, MaskE }, 0 },
43234a1e 3732 { Bad_Opcode },
13954a31 3733 { "korb", { MaskG, MaskVex, MaskE }, 0 },
43234a1e
L
3734 },
3735
13954a31 3736 /* PREFIX_VEX_0F45_L_1_M_1_W_1 */
1ba585e8 3737 {
13954a31 3738 { "korq", { MaskG, MaskVex, MaskE }, 0 },
1ba585e8 3739 { Bad_Opcode },
13954a31
JB
3740 { "kord", { MaskG, MaskVex, MaskE }, 0 },
3741 },
3742
3743 /* PREFIX_VEX_0F46_L_1_M_1_W_0 */
3744 {
3745 { "kxnorw", { MaskG, MaskVex, MaskE }, 0 },
3746 { Bad_Opcode },
3747 { "kxnorb", { MaskG, MaskVex, MaskE }, 0 },
3748 },
3749
3750 /* PREFIX_VEX_0F46_L_1_M_1_W_1 */
3751 {
3752 { "kxnorq", { MaskG, MaskVex, MaskE }, 0 },
3753 { Bad_Opcode },
3754 { "kxnord", { MaskG, MaskVex, MaskE }, 0 },
3755 },
3756
3757 /* PREFIX_VEX_0F47_L_1_M_1_W_0 */
3758 {
3759 { "kxorw", { MaskG, MaskVex, MaskE }, 0 },
3760 { Bad_Opcode },
3761 { "kxorb", { MaskG, MaskVex, MaskE }, 0 },
3762 },
3763
3764 /* PREFIX_VEX_0F47_L_1_M_1_W_1 */
3765 {
3766 { "kxorq", { MaskG, MaskVex, MaskE }, 0 },
3767 { Bad_Opcode },
3768 { "kxord", { MaskG, MaskVex, MaskE }, 0 },
3769 },
3770
3771 /* PREFIX_VEX_0F4A_L_1_M_1_W_0 */
3772 {
3773 { "kaddw", { MaskG, MaskVex, MaskE }, 0 },
3774 { Bad_Opcode },
3775 { "kaddb", { MaskG, MaskVex, MaskE }, 0 },
3776 },
3777
3778 /* PREFIX_VEX_0F4A_L_1_M_1_W_1 */
3779 {
3780 { "kaddq", { MaskG, MaskVex, MaskE }, 0 },
3781 { Bad_Opcode },
3782 { "kaddd", { MaskG, MaskVex, MaskE }, 0 },
3783 },
3784
3785 /* PREFIX_VEX_0F4B_L_1_M_1_W_0 */
3786 {
3787 { "kunpckwd", { MaskG, MaskVex, MaskE }, 0 },
3788 { Bad_Opcode },
3789 { "kunpckbw", { MaskG, MaskVex, MaskE }, 0 },
3790 },
3791
3792 /* PREFIX_VEX_0F4B_L_1_M_1_W_1 */
3793 {
3794 { "kunpckdq", { MaskG, MaskVex, MaskE }, 0 },
1ba585e8
IT
3795 },
3796
7531c613 3797 /* PREFIX_VEX_0F51 */
6c30d220 3798 {
7531c613
JB
3799 { "vsqrtps", { XM, EXx }, 0 },
3800 { "vsqrtss", { XMScalar, VexScalar, EXxmm_md }, 0 },
3801 { "vsqrtpd", { XM, EXx }, 0 },
3802 { "vsqrtsd", { XMScalar, VexScalar, EXxmm_mq }, 0 },
6c30d220
L
3803 },
3804
7531c613 3805 /* PREFIX_VEX_0F52 */
6c30d220 3806 {
7531c613
JB
3807 { "vrsqrtps", { XM, EXx }, 0 },
3808 { "vrsqrtss", { XMScalar, VexScalar, EXxmm_md }, 0 },
6c30d220
L
3809 },
3810
7531c613 3811 /* PREFIX_VEX_0F53 */
c0f3af97 3812 {
7531c613
JB
3813 { "vrcpps", { XM, EXx }, 0 },
3814 { "vrcpss", { XMScalar, VexScalar, EXxmm_md }, 0 },
c0f3af97
L
3815 },
3816
7531c613 3817 /* PREFIX_VEX_0F58 */
c0f3af97 3818 {
7531c613
JB
3819 { "vaddps", { XM, Vex, EXx }, 0 },
3820 { "vaddss", { XMScalar, VexScalar, EXxmm_md }, 0 },
3821 { "vaddpd", { XM, Vex, EXx }, 0 },
3822 { "vaddsd", { XMScalar, VexScalar, EXxmm_mq }, 0 },
c0f3af97
L
3823 },
3824
7531c613 3825 /* PREFIX_VEX_0F59 */
c0f3af97 3826 {
7531c613
JB
3827 { "vmulps", { XM, Vex, EXx }, 0 },
3828 { "vmulss", { XMScalar, VexScalar, EXxmm_md }, 0 },
3829 { "vmulpd", { XM, Vex, EXx }, 0 },
3830 { "vmulsd", { XMScalar, VexScalar, EXxmm_mq }, 0 },
c0f3af97
L
3831 },
3832
7531c613 3833 /* PREFIX_VEX_0F5A */
ce2f5b3c 3834 {
7531c613
JB
3835 { "vcvtps2pd", { XM, EXxmmq }, 0 },
3836 { "vcvtss2sd", { XMScalar, VexScalar, EXxmm_md }, 0 },
3837 { "vcvtpd2ps%XY",{ XMM, EXx }, 0 },
3838 { "vcvtsd2ss", { XMScalar, VexScalar, EXxmm_mq }, 0 },
ce2f5b3c
L
3839 },
3840
7531c613 3841 /* PREFIX_VEX_0F5B */
6c30d220 3842 {
7531c613
JB
3843 { "vcvtdq2ps", { XM, EXx }, 0 },
3844 { "vcvttps2dq", { XM, EXx }, 0 },
3845 { "vcvtps2dq", { XM, EXx }, 0 },
6c30d220
L
3846 },
3847
7531c613 3848 /* PREFIX_VEX_0F5C */
a683cc34 3849 {
7531c613
JB
3850 { "vsubps", { XM, Vex, EXx }, 0 },
3851 { "vsubss", { XMScalar, VexScalar, EXxmm_md }, 0 },
3852 { "vsubpd", { XM, Vex, EXx }, 0 },
3853 { "vsubsd", { XMScalar, VexScalar, EXxmm_mq }, 0 },
a683cc34
SP
3854 },
3855
7531c613 3856 /* PREFIX_VEX_0F5D */
a683cc34 3857 {
7531c613
JB
3858 { "vminps", { XM, Vex, EXx }, 0 },
3859 { "vminss", { XMScalar, VexScalar, EXxmm_md }, 0 },
3860 { "vminpd", { XM, Vex, EXx }, 0 },
3861 { "vminsd", { XMScalar, VexScalar, EXxmm_mq }, 0 },
a683cc34
SP
3862 },
3863
7531c613 3864 /* PREFIX_VEX_0F5E */
c0f3af97 3865 {
7531c613
JB
3866 { "vdivps", { XM, Vex, EXx }, 0 },
3867 { "vdivss", { XMScalar, VexScalar, EXxmm_md }, 0 },
3868 { "vdivpd", { XM, Vex, EXx }, 0 },
3869 { "vdivsd", { XMScalar, VexScalar, EXxmm_mq }, 0 },
c0f3af97
L
3870 },
3871
7531c613 3872 /* PREFIX_VEX_0F5F */
c0f3af97 3873 {
7531c613
JB
3874 { "vmaxps", { XM, Vex, EXx }, 0 },
3875 { "vmaxss", { XMScalar, VexScalar, EXxmm_md }, 0 },
3876 { "vmaxpd", { XM, Vex, EXx }, 0 },
3877 { "vmaxsd", { XMScalar, VexScalar, EXxmm_mq }, 0 },
c0f3af97
L
3878 },
3879
7531c613 3880 /* PREFIX_VEX_0F6F */
c0f3af97 3881 {
592d1631 3882 { Bad_Opcode },
7531c613
JB
3883 { "vmovdqu", { XM, EXx }, 0 },
3884 { "vmovdqa", { XM, EXx }, 0 },
c0f3af97
L
3885 },
3886
7531c613 3887 /* PREFIX_VEX_0F70 */
922d8de8 3888 {
592d1631 3889 { Bad_Opcode },
7531c613
JB
3890 { "vpshufhw", { XM, EXx, Ib }, 0 },
3891 { "vpshufd", { XM, EXx, Ib }, 0 },
3892 { "vpshuflw", { XM, EXx, Ib }, 0 },
922d8de8
DR
3893 },
3894
7531c613 3895 /* PREFIX_VEX_0F7C */
922d8de8 3896 {
592d1631
L
3897 { Bad_Opcode },
3898 { Bad_Opcode },
7531c613
JB
3899 { "vhaddpd", { XM, Vex, EXx }, 0 },
3900 { "vhaddps", { XM, Vex, EXx }, 0 },
922d8de8
DR
3901 },
3902
7531c613 3903 /* PREFIX_VEX_0F7D */
922d8de8 3904 {
592d1631
L
3905 { Bad_Opcode },
3906 { Bad_Opcode },
7531c613
JB
3907 { "vhsubpd", { XM, Vex, EXx }, 0 },
3908 { "vhsubps", { XM, Vex, EXx }, 0 },
922d8de8
DR
3909 },
3910
7531c613 3911 /* PREFIX_VEX_0F7E */
c0f3af97 3912 {
592d1631 3913 { Bad_Opcode },
7531c613
JB
3914 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_1) },
3915 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_2) },
c0f3af97
L
3916 },
3917
7531c613 3918 /* PREFIX_VEX_0F7F */
c0f3af97 3919 {
592d1631 3920 { Bad_Opcode },
7531c613
JB
3921 { "vmovdqu", { EXxS, XM }, 0 },
3922 { "vmovdqa", { EXxS, XM }, 0 },
c0f3af97
L
3923 },
3924
13954a31
JB
3925 /* PREFIX_VEX_0F90_L_0_W_0 */
3926 {
3927 { "kmovw", { MaskG, MaskE }, 0 },
3928 { Bad_Opcode },
3929 { "kmovb", { MaskG, MaskBDE }, 0 },
3930 },
3931
3932 /* PREFIX_VEX_0F90_L_0_W_1 */
3933 {
3934 { "kmovq", { MaskG, MaskE }, 0 },
3935 { Bad_Opcode },
3936 { "kmovd", { MaskG, MaskBDE }, 0 },
3937 },
3938
3939 /* PREFIX_VEX_0F91_L_0_M_0_W_0 */
3940 {
3941 { "kmovw", { Ew, MaskG }, 0 },
3942 { Bad_Opcode },
3943 { "kmovb", { Eb, MaskG }, 0 },
3944 },
3945
3946 /* PREFIX_VEX_0F91_L_0_M_0_W_1 */
3947 {
3948 { "kmovq", { Eq, MaskG }, 0 },
3949 { Bad_Opcode },
3950 { "kmovd", { Ed, MaskG }, 0 },
3951 },
3952
3953 /* PREFIX_VEX_0F92_L_0_M_1_W_0 */
3954 {
3955 { "kmovw", { MaskG, Edq }, 0 },
3956 { Bad_Opcode },
3957 { "kmovb", { MaskG, Edq }, 0 },
3958 { "kmovd", { MaskG, Edq }, 0 },
3959 },
3960
3961 /* PREFIX_VEX_0F92_L_0_M_1_W_1 */
c0f3af97 3962 {
592d1631 3963 { Bad_Opcode },
13954a31
JB
3964 { Bad_Opcode },
3965 { Bad_Opcode },
3966 { "kmovK", { MaskG, Edq }, 0 },
c0f3af97
L
3967 },
3968
13954a31 3969 /* PREFIX_VEX_0F93_L_0_M_1_W_0 */
c0f3af97 3970 {
13954a31 3971 { "kmovw", { Gdq, MaskE }, 0 },
592d1631 3972 { Bad_Opcode },
13954a31
JB
3973 { "kmovb", { Gdq, MaskE }, 0 },
3974 { "kmovd", { Gdq, MaskE }, 0 },
c0f3af97 3975 },
a5ff0eb2 3976
13954a31 3977 /* PREFIX_VEX_0F93_L_0_M_1_W_1 */
922d8de8 3978 {
592d1631 3979 { Bad_Opcode },
13954a31
JB
3980 { Bad_Opcode },
3981 { Bad_Opcode },
3982 { "kmovK", { Gdq, MaskE }, 0 },
922d8de8
DR
3983 },
3984
13954a31 3985 /* PREFIX_VEX_0F98_L_0_M_1_W_0 */
922d8de8 3986 {
13954a31 3987 { "kortestw", { MaskG, MaskE }, 0 },
592d1631 3988 { Bad_Opcode },
13954a31 3989 { "kortestb", { MaskG, MaskE }, 0 },
922d8de8
DR
3990 },
3991
13954a31 3992 /* PREFIX_VEX_0F98_L_0_M_1_W_1 */
922d8de8 3993 {
13954a31 3994 { "kortestq", { MaskG, MaskE }, 0 },
592d1631 3995 { Bad_Opcode },
13954a31 3996 { "kortestd", { MaskG, MaskE }, 0 },
922d8de8
DR
3997 },
3998
13954a31 3999 /* PREFIX_VEX_0F99_L_0_M_1_W_0 */
922d8de8 4000 {
13954a31 4001 { "ktestw", { MaskG, MaskE }, 0 },
592d1631 4002 { Bad_Opcode },
13954a31
JB
4003 { "ktestb", { MaskG, MaskE }, 0 },
4004 },
4005
4006 /* PREFIX_VEX_0F99_L_0_M_1_W_1 */
4007 {
4008 { "ktestq", { MaskG, MaskE }, 0 },
4009 { Bad_Opcode },
4010 { "ktestd", { MaskG, MaskE }, 0 },
922d8de8
DR
4011 },
4012
7531c613 4013 /* PREFIX_VEX_0FC2 */
922d8de8 4014 {
7531c613
JB
4015 { "vcmpps", { XM, Vex, EXx, CMP }, 0 },
4016 { "vcmpss", { XMScalar, VexScalar, EXxmm_md, CMP }, 0 },
4017 { "vcmppd", { XM, Vex, EXx, CMP }, 0 },
4018 { "vcmpsd", { XMScalar, VexScalar, EXxmm_mq, CMP }, 0 },
922d8de8
DR
4019 },
4020
7531c613 4021 /* PREFIX_VEX_0FD0 */
922d8de8 4022 {
592d1631
L
4023 { Bad_Opcode },
4024 { Bad_Opcode },
7531c613
JB
4025 { "vaddsubpd", { XM, Vex, EXx }, 0 },
4026 { "vaddsubps", { XM, Vex, EXx }, 0 },
922d8de8
DR
4027 },
4028
7531c613 4029 /* PREFIX_VEX_0FE6 */
922d8de8 4030 {
592d1631 4031 { Bad_Opcode },
7531c613
JB
4032 { "vcvtdq2pd", { XM, EXxmmq }, 0 },
4033 { "vcvttpd2dq%XY", { XMM, EXx }, 0 },
4034 { "vcvtpd2dq%XY", { XMM, EXx }, 0 },
922d8de8
DR
4035 },
4036
7531c613 4037 /* PREFIX_VEX_0FF0 */
922d8de8 4038 {
592d1631
L
4039 { Bad_Opcode },
4040 { Bad_Opcode },
7531c613
JB
4041 { Bad_Opcode },
4042 { MOD_TABLE (MOD_VEX_0FF0_PREFIX_3) },
922d8de8
DR
4043 },
4044
7531c613 4045 /* PREFIX_VEX_0F3849_X86_64 */
922d8de8 4046 {
7531c613 4047 { VEX_W_TABLE (VEX_W_0F3849_X86_64_P_0) },
592d1631 4048 { Bad_Opcode },
7531c613
JB
4049 { VEX_W_TABLE (VEX_W_0F3849_X86_64_P_2) },
4050 { VEX_W_TABLE (VEX_W_0F3849_X86_64_P_3) },
922d8de8
DR
4051 },
4052
7531c613 4053 /* PREFIX_VEX_0F384B_X86_64 */
922d8de8 4054 {
592d1631 4055 { Bad_Opcode },
7531c613
JB
4056 { VEX_W_TABLE (VEX_W_0F384B_X86_64_P_1) },
4057 { VEX_W_TABLE (VEX_W_0F384B_X86_64_P_2) },
4058 { VEX_W_TABLE (VEX_W_0F384B_X86_64_P_3) },
922d8de8
DR
4059 },
4060
7531c613 4061 /* PREFIX_VEX_0F385C_X86_64 */
922d8de8 4062 {
592d1631 4063 { Bad_Opcode },
7531c613 4064 { VEX_W_TABLE (VEX_W_0F385C_X86_64_P_1) },
592d1631 4065 { Bad_Opcode },
922d8de8
DR
4066 },
4067
7531c613 4068 /* PREFIX_VEX_0F385E_X86_64 */
922d8de8 4069 {
7531c613
JB
4070 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_0) },
4071 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_1) },
4072 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_2) },
4073 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_3) },
922d8de8
DR
4074 },
4075
14d10c6c 4076 /* PREFIX_VEX_0F38F5_L_0 */
48521003 4077 {
14d10c6c
JB
4078 { "bzhiS", { Gdq, Edq, VexGdq }, 0 },
4079 { "pextS", { Gdq, VexGdq, Edq }, 0 },
48521003 4080 { Bad_Opcode },
14d10c6c 4081 { "pdepS", { Gdq, VexGdq, Edq }, 0 },
48521003
IT
4082 },
4083
14d10c6c 4084 /* PREFIX_VEX_0F38F6_L_0 */
48521003
IT
4085 {
4086 { Bad_Opcode },
4087 { Bad_Opcode },
7531c613 4088 { Bad_Opcode },
14d10c6c 4089 { "mulxS", { Gdq, VexGdq, Edq }, 0 },
48521003
IT
4090 },
4091
14d10c6c 4092 /* PREFIX_VEX_0F38F7_L_0 */
a5ff0eb2 4093 {
14d10c6c
JB
4094 { "bextrS", { Gdq, Edq, VexGdq }, 0 },
4095 { "sarxS", { Gdq, Edq, VexGdq }, 0 },
4096 { "shlxS", { Gdq, Edq, VexGdq }, 0 },
4097 { "shrxS", { Gdq, Edq, VexGdq }, 0 },
a5ff0eb2 4098 },
6c30d220 4099
14d10c6c 4100 /* PREFIX_VEX_0F3AF0_L_0 */
6c30d220
L
4101 {
4102 { Bad_Opcode },
4103 { Bad_Opcode },
4104 { Bad_Opcode },
14d10c6c 4105 { "rorxS", { Gdq, Edq, Ib }, 0 },
6c30d220 4106 },
43234a1e 4107
ad692897 4108#include "i386-dis-evex-prefix.h"
c0f3af97
L
4109};
4110
4111static const struct dis386 x86_64_table[][2] = {
4112 /* X86_64_06 */
4113 {
bf890a93 4114 { "pushP", { es }, 0 },
c0f3af97
L
4115 },
4116
4117 /* X86_64_07 */
4118 {
bf890a93 4119 { "popP", { es }, 0 },
c0f3af97
L
4120 },
4121
1673df32 4122 /* X86_64_0E */
c0f3af97 4123 {
bf890a93 4124 { "pushP", { cs }, 0 },
c0f3af97
L
4125 },
4126
4127 /* X86_64_16 */
4128 {
bf890a93 4129 { "pushP", { ss }, 0 },
c0f3af97
L
4130 },
4131
4132 /* X86_64_17 */
4133 {
bf890a93 4134 { "popP", { ss }, 0 },
c0f3af97
L
4135 },
4136
4137 /* X86_64_1E */
4138 {
bf890a93 4139 { "pushP", { ds }, 0 },
c0f3af97
L
4140 },
4141
4142 /* X86_64_1F */
4143 {
bf890a93 4144 { "popP", { ds }, 0 },
c0f3af97
L
4145 },
4146
4147 /* X86_64_27 */
4148 {
bf890a93 4149 { "daa", { XX }, 0 },
c0f3af97
L
4150 },
4151
4152 /* X86_64_2F */
4153 {
bf890a93 4154 { "das", { XX }, 0 },
c0f3af97
L
4155 },
4156
4157 /* X86_64_37 */
4158 {
bf890a93 4159 { "aaa", { XX }, 0 },
c0f3af97
L
4160 },
4161
4162 /* X86_64_3F */
4163 {
bf890a93 4164 { "aas", { XX }, 0 },
c0f3af97
L
4165 },
4166
4167 /* X86_64_60 */
4168 {
bf890a93 4169 { "pushaP", { XX }, 0 },
c0f3af97
L
4170 },
4171
4172 /* X86_64_61 */
4173 {
bf890a93 4174 { "popaP", { XX }, 0 },
c0f3af97
L
4175 },
4176
4177 /* X86_64_62 */
4178 {
4179 { MOD_TABLE (MOD_62_32BIT) },
43234a1e 4180 { EVEX_TABLE (EVEX_0F) },
c0f3af97
L
4181 },
4182
4183 /* X86_64_63 */
4184 {
bf890a93 4185 { "arpl", { Ew, Gw }, 0 },
bc31405e 4186 { "movs", { { OP_G, movsxd_mode }, { MOVSXD_Fixup, movsxd_mode } }, 0 },
c0f3af97
L
4187 },
4188
4189 /* X86_64_6D */
4190 {
bf890a93
IT
4191 { "ins{R|}", { Yzr, indirDX }, 0 },
4192 { "ins{G|}", { Yzr, indirDX }, 0 },
c0f3af97
L
4193 },
4194
4195 /* X86_64_6F */
4196 {
bf890a93
IT
4197 { "outs{R|}", { indirDXr, Xz }, 0 },
4198 { "outs{G|}", { indirDXr, Xz }, 0 },
c0f3af97
L
4199 },
4200
d039fef3 4201 /* X86_64_82 */
8b89fe14 4202 {
de194d85 4203 /* Opcode 0x82 is an alias of opcode 0x80 in 32-bit mode. */
d039fef3 4204 { REG_TABLE (REG_80) },
8b89fe14
L
4205 },
4206
c0f3af97
L
4207 /* X86_64_9A */
4208 {
36938cab 4209 { "{l|}call{P|}", { Ap }, 0 },
c0f3af97
L
4210 },
4211
aeab2b26
JB
4212 /* X86_64_C2 */
4213 {
4214 { "retP", { Iw, BND }, 0 },
4215 { "ret@", { Iw, BND }, 0 },
4216 },
4217
4218 /* X86_64_C3 */
4219 {
4220 { "retP", { BND }, 0 },
4221 { "ret@", { BND }, 0 },
4222 },
4223
c0f3af97
L
4224 /* X86_64_C4 */
4225 {
4226 { MOD_TABLE (MOD_C4_32BIT) },
4227 { VEX_C4_TABLE (VEX_0F) },
4228 },
4229
4230 /* X86_64_C5 */
4231 {
4232 { MOD_TABLE (MOD_C5_32BIT) },
4233 { VEX_C5_TABLE (VEX_0F) },
4234 },
4235
4236 /* X86_64_CE */
4237 {
bf890a93 4238 { "into", { XX }, 0 },
c0f3af97
L
4239 },
4240
4241 /* X86_64_D4 */
4242 {
bf890a93 4243 { "aam", { Ib }, 0 },
c0f3af97
L
4244 },
4245
4246 /* X86_64_D5 */
4247 {
bf890a93 4248 { "aad", { Ib }, 0 },
c0f3af97
L
4249 },
4250
a72d2af2
L
4251 /* X86_64_E8 */
4252 {
4253 { "callP", { Jv, BND }, 0 },
5db04b09 4254 { "call@", { Jv, BND }, 0 }
a72d2af2
L
4255 },
4256
4257 /* X86_64_E9 */
4258 {
4259 { "jmpP", { Jv, BND }, 0 },
5db04b09 4260 { "jmp@", { Jv, BND }, 0 }
a72d2af2
L
4261 },
4262
c0f3af97
L
4263 /* X86_64_EA */
4264 {
36938cab 4265 { "{l|}jmp{P|}", { Ap }, 0 },
c0f3af97
L
4266 },
4267
4268 /* X86_64_0F01_REG_0 */
4269 {
d1c36125 4270 { "sgdt{Q|Q}", { M }, 0 },
bf890a93 4271 { "sgdt", { M }, 0 },
c0f3af97
L
4272 },
4273
4274 /* X86_64_0F01_REG_1 */
4275 {
d1c36125 4276 { "sidt{Q|Q}", { M }, 0 },
bf890a93 4277 { "sidt", { M }, 0 },
c0f3af97
L
4278 },
4279
81d54bb7
CL
4280 /* X86_64_0F01_REG_1_RM_5_PREFIX_2 */
4281 {
4282 { Bad_Opcode },
4283 { "seamret", { Skip_MODRM }, 0 },
4284 },
4285
4286 /* X86_64_0F01_REG_1_RM_6_PREFIX_2 */
4287 {
4288 { Bad_Opcode },
4289 { "seamops", { Skip_MODRM }, 0 },
4290 },
4291
4292 /* X86_64_0F01_REG_1_RM_7_PREFIX_2 */
4293 {
4294 { Bad_Opcode },
4295 { "seamcall", { Skip_MODRM }, 0 },
4296 },
4297
c0f3af97
L
4298 /* X86_64_0F01_REG_2 */
4299 {
bf890a93
IT
4300 { "lgdt{Q|Q}", { M }, 0 },
4301 { "lgdt", { M }, 0 },
c0f3af97
L
4302 },
4303
4304 /* X86_64_0F01_REG_3 */
4305 {
bf890a93
IT
4306 { "lidt{Q|Q}", { M }, 0 },
4307 { "lidt", { M }, 0 },
c0f3af97 4308 },
260cd341 4309
32e31ad7 4310 /* X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1 */
78467458 4311 {
32e31ad7
JB
4312 { Bad_Opcode },
4313 { "uiret", { Skip_MODRM }, 0 },
78467458
JB
4314 },
4315
32e31ad7 4316 /* X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1 */
78467458 4317 {
32e31ad7
JB
4318 { Bad_Opcode },
4319 { "testui", { Skip_MODRM }, 0 },
78467458
JB
4320 },
4321
32e31ad7 4322 /* X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1 */
260cd341
LC
4323 {
4324 { Bad_Opcode },
32e31ad7 4325 { "clui", { Skip_MODRM }, 0 },
260cd341
LC
4326 },
4327
32e31ad7 4328 /* X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1 */
260cd341
LC
4329 {
4330 { Bad_Opcode },
32e31ad7 4331 { "stui", { Skip_MODRM }, 0 },
260cd341
LC
4332 },
4333
32e31ad7 4334 /* X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1 */
260cd341
LC
4335 {
4336 { Bad_Opcode },
32e31ad7 4337 { "rmpadjust", { Skip_MODRM }, 0 },
260cd341
LC
4338 },
4339
32e31ad7 4340 /* X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3 */
260cd341
LC
4341 {
4342 { Bad_Opcode },
32e31ad7 4343 { "rmpupdate", { Skip_MODRM }, 0 },
260cd341 4344 },
f64c42a9 4345
32e31ad7 4346 /* X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1 */
f64c42a9
LC
4347 {
4348 { Bad_Opcode },
32e31ad7 4349 { "psmash", { Skip_MODRM }, 0 },
f64c42a9
LC
4350 },
4351
f64c42a9 4352 {
32e31ad7
JB
4353 /* X86_64_0F24 */
4354 { "movZ", { Em, Td }, 0 },
f64c42a9
LC
4355 },
4356
f64c42a9 4357 {
32e31ad7
JB
4358 /* X86_64_0F26 */
4359 { "movZ", { Td, Em }, 0 },
f64c42a9
LC
4360 },
4361
32e31ad7 4362 /* X86_64_0FC7_REG_6_MOD_3_PREFIX_1 */
f64c42a9
LC
4363 {
4364 { Bad_Opcode },
32e31ad7 4365 { "senduipi", { Eq }, 0 },
f64c42a9
LC
4366 },
4367
32e31ad7 4368 /* X86_64_VEX_0F3849 */
646cc3e0
GG
4369 {
4370 { Bad_Opcode },
32e31ad7 4371 { PREFIX_TABLE (PREFIX_VEX_0F3849_X86_64) },
646cc3e0
GG
4372 },
4373
32e31ad7 4374 /* X86_64_VEX_0F384B */
646cc3e0
GG
4375 {
4376 { Bad_Opcode },
32e31ad7 4377 { PREFIX_TABLE (PREFIX_VEX_0F384B_X86_64) },
646cc3e0
GG
4378 },
4379
32e31ad7 4380 /* X86_64_VEX_0F385C */
646cc3e0
GG
4381 {
4382 { Bad_Opcode },
32e31ad7 4383 { PREFIX_TABLE (PREFIX_VEX_0F385C_X86_64) },
646cc3e0
GG
4384 },
4385
32e31ad7 4386 /* X86_64_VEX_0F385E */
f64c42a9
LC
4387 {
4388 { Bad_Opcode },
32e31ad7 4389 { PREFIX_TABLE (PREFIX_VEX_0F385E_X86_64) },
f64c42a9 4390 },
c0f3af97
L
4391};
4392
4393static const struct dis386 three_byte_table[][256] = {
c1e679ec
DR
4394
4395 /* THREE_BYTE_0F38 */
c0f3af97
L
4396 {
4397 /* 00 */
507bd325
L
4398 { "pshufb", { MX, EM }, PREFIX_OPCODE },
4399 { "phaddw", { MX, EM }, PREFIX_OPCODE },
4400 { "phaddd", { MX, EM }, PREFIX_OPCODE },
4401 { "phaddsw", { MX, EM }, PREFIX_OPCODE },
4402 { "pmaddubsw", { MX, EM }, PREFIX_OPCODE },
4403 { "phsubw", { MX, EM }, PREFIX_OPCODE },
4404 { "phsubd", { MX, EM }, PREFIX_OPCODE },
4405 { "phsubsw", { MX, EM }, PREFIX_OPCODE },
c0f3af97 4406 /* 08 */
507bd325
L
4407 { "psignb", { MX, EM }, PREFIX_OPCODE },
4408 { "psignw", { MX, EM }, PREFIX_OPCODE },
4409 { "psignd", { MX, EM }, PREFIX_OPCODE },
4410 { "pmulhrsw", { MX, EM }, PREFIX_OPCODE },
592d1631
L
4411 { Bad_Opcode },
4412 { Bad_Opcode },
4413 { Bad_Opcode },
4414 { Bad_Opcode },
f88c9eb0 4415 /* 10 */
7531c613 4416 { "pblendvb", { XM, EXx, XMM0 }, PREFIX_DATA },
592d1631
L
4417 { Bad_Opcode },
4418 { Bad_Opcode },
4419 { Bad_Opcode },
7531c613
JB
4420 { "blendvps", { XM, EXx, XMM0 }, PREFIX_DATA },
4421 { "blendvpd", { XM, EXx, XMM0 }, PREFIX_DATA },
592d1631 4422 { Bad_Opcode },
7531c613 4423 { "ptest", { XM, EXx }, PREFIX_DATA },
f88c9eb0 4424 /* 18 */
592d1631
L
4425 { Bad_Opcode },
4426 { Bad_Opcode },
4427 { Bad_Opcode },
4428 { Bad_Opcode },
507bd325
L
4429 { "pabsb", { MX, EM }, PREFIX_OPCODE },
4430 { "pabsw", { MX, EM }, PREFIX_OPCODE },
4431 { "pabsd", { MX, EM }, PREFIX_OPCODE },
592d1631 4432 { Bad_Opcode },
f88c9eb0 4433 /* 20 */
7531c613
JB
4434 { "pmovsxbw", { XM, EXq }, PREFIX_DATA },
4435 { "pmovsxbd", { XM, EXd }, PREFIX_DATA },
4436 { "pmovsxbq", { XM, EXw }, PREFIX_DATA },
4437 { "pmovsxwd", { XM, EXq }, PREFIX_DATA },
4438 { "pmovsxwq", { XM, EXd }, PREFIX_DATA },
4439 { "pmovsxdq", { XM, EXq }, PREFIX_DATA },
592d1631
L
4440 { Bad_Opcode },
4441 { Bad_Opcode },
f88c9eb0 4442 /* 28 */
7531c613
JB
4443 { "pmuldq", { XM, EXx }, PREFIX_DATA },
4444 { "pcmpeqq", { XM, EXx }, PREFIX_DATA },
4445 { MOD_TABLE (MOD_0F382A) },
4446 { "packusdw", { XM, EXx }, PREFIX_DATA },
592d1631
L
4447 { Bad_Opcode },
4448 { Bad_Opcode },
4449 { Bad_Opcode },
4450 { Bad_Opcode },
f88c9eb0 4451 /* 30 */
7531c613
JB
4452 { "pmovzxbw", { XM, EXq }, PREFIX_DATA },
4453 { "pmovzxbd", { XM, EXd }, PREFIX_DATA },
4454 { "pmovzxbq", { XM, EXw }, PREFIX_DATA },
4455 { "pmovzxwd", { XM, EXq }, PREFIX_DATA },
4456 { "pmovzxwq", { XM, EXd }, PREFIX_DATA },
4457 { "pmovzxdq", { XM, EXq }, PREFIX_DATA },
4458 { Bad_Opcode },
4459 { "pcmpgtq", { XM, EXx }, PREFIX_DATA },
f88c9eb0 4460 /* 38 */
7531c613
JB
4461 { "pminsb", { XM, EXx }, PREFIX_DATA },
4462 { "pminsd", { XM, EXx }, PREFIX_DATA },
4463 { "pminuw", { XM, EXx }, PREFIX_DATA },
4464 { "pminud", { XM, EXx }, PREFIX_DATA },
4465 { "pmaxsb", { XM, EXx }, PREFIX_DATA },
4466 { "pmaxsd", { XM, EXx }, PREFIX_DATA },
4467 { "pmaxuw", { XM, EXx }, PREFIX_DATA },
4468 { "pmaxud", { XM, EXx }, PREFIX_DATA },
f88c9eb0 4469 /* 40 */
7531c613
JB
4470 { "pmulld", { XM, EXx }, PREFIX_DATA },
4471 { "phminposuw", { XM, EXx }, PREFIX_DATA },
592d1631
L
4472 { Bad_Opcode },
4473 { Bad_Opcode },
4474 { Bad_Opcode },
4475 { Bad_Opcode },
4476 { Bad_Opcode },
4477 { Bad_Opcode },
f88c9eb0 4478 /* 48 */
592d1631
L
4479 { Bad_Opcode },
4480 { Bad_Opcode },
4481 { Bad_Opcode },
4482 { Bad_Opcode },
4483 { Bad_Opcode },
4484 { Bad_Opcode },
4485 { Bad_Opcode },
4486 { Bad_Opcode },
f88c9eb0 4487 /* 50 */
592d1631
L
4488 { Bad_Opcode },
4489 { Bad_Opcode },
4490 { Bad_Opcode },
4491 { Bad_Opcode },
4492 { Bad_Opcode },
4493 { Bad_Opcode },
4494 { Bad_Opcode },
4495 { Bad_Opcode },
f88c9eb0 4496 /* 58 */
592d1631
L
4497 { Bad_Opcode },
4498 { Bad_Opcode },
4499 { Bad_Opcode },
4500 { Bad_Opcode },
4501 { Bad_Opcode },
4502 { Bad_Opcode },
4503 { Bad_Opcode },
4504 { Bad_Opcode },
f88c9eb0 4505 /* 60 */
592d1631
L
4506 { Bad_Opcode },
4507 { Bad_Opcode },
4508 { Bad_Opcode },
4509 { Bad_Opcode },
4510 { Bad_Opcode },
4511 { Bad_Opcode },
4512 { Bad_Opcode },
4513 { Bad_Opcode },
f88c9eb0 4514 /* 68 */
592d1631
L
4515 { Bad_Opcode },
4516 { Bad_Opcode },
4517 { Bad_Opcode },
4518 { Bad_Opcode },
4519 { Bad_Opcode },
4520 { Bad_Opcode },
4521 { Bad_Opcode },
4522 { Bad_Opcode },
f88c9eb0 4523 /* 70 */
592d1631
L
4524 { Bad_Opcode },
4525 { Bad_Opcode },
4526 { Bad_Opcode },
4527 { Bad_Opcode },
4528 { Bad_Opcode },
4529 { Bad_Opcode },
4530 { Bad_Opcode },
4531 { Bad_Opcode },
f88c9eb0 4532 /* 78 */
592d1631
L
4533 { Bad_Opcode },
4534 { Bad_Opcode },
4535 { Bad_Opcode },
4536 { Bad_Opcode },
4537 { Bad_Opcode },
4538 { Bad_Opcode },
4539 { Bad_Opcode },
4540 { Bad_Opcode },
f88c9eb0 4541 /* 80 */
7531c613
JB
4542 { "invept", { Gm, Mo }, PREFIX_DATA },
4543 { "invvpid", { Gm, Mo }, PREFIX_DATA },
4544 { "invpcid", { Gm, M }, PREFIX_DATA },
592d1631
L
4545 { Bad_Opcode },
4546 { Bad_Opcode },
4547 { Bad_Opcode },
4548 { Bad_Opcode },
4549 { Bad_Opcode },
f88c9eb0 4550 /* 88 */
592d1631
L
4551 { Bad_Opcode },
4552 { Bad_Opcode },
4553 { Bad_Opcode },
4554 { Bad_Opcode },
4555 { Bad_Opcode },
4556 { Bad_Opcode },
4557 { Bad_Opcode },
4558 { Bad_Opcode },
f88c9eb0 4559 /* 90 */
592d1631
L
4560 { Bad_Opcode },
4561 { Bad_Opcode },
4562 { Bad_Opcode },
4563 { Bad_Opcode },
4564 { Bad_Opcode },
4565 { Bad_Opcode },
4566 { Bad_Opcode },
4567 { Bad_Opcode },
f88c9eb0 4568 /* 98 */
592d1631
L
4569 { Bad_Opcode },
4570 { Bad_Opcode },
4571 { Bad_Opcode },
4572 { Bad_Opcode },
4573 { Bad_Opcode },
4574 { Bad_Opcode },
4575 { Bad_Opcode },
4576 { Bad_Opcode },
f88c9eb0 4577 /* a0 */
592d1631
L
4578 { Bad_Opcode },
4579 { Bad_Opcode },
4580 { Bad_Opcode },
4581 { Bad_Opcode },
4582 { Bad_Opcode },
4583 { Bad_Opcode },
4584 { Bad_Opcode },
4585 { Bad_Opcode },
f88c9eb0 4586 /* a8 */
592d1631
L
4587 { Bad_Opcode },
4588 { Bad_Opcode },
4589 { Bad_Opcode },
4590 { Bad_Opcode },
4591 { Bad_Opcode },
4592 { Bad_Opcode },
4593 { Bad_Opcode },
4594 { Bad_Opcode },
f88c9eb0 4595 /* b0 */
592d1631
L
4596 { Bad_Opcode },
4597 { Bad_Opcode },
4598 { Bad_Opcode },
4599 { Bad_Opcode },
4600 { Bad_Opcode },
4601 { Bad_Opcode },
4602 { Bad_Opcode },
4603 { Bad_Opcode },
f88c9eb0 4604 /* b8 */
592d1631
L
4605 { Bad_Opcode },
4606 { Bad_Opcode },
4607 { Bad_Opcode },
4608 { Bad_Opcode },
4609 { Bad_Opcode },
4610 { Bad_Opcode },
4611 { Bad_Opcode },
4612 { Bad_Opcode },
f88c9eb0 4613 /* c0 */
592d1631
L
4614 { Bad_Opcode },
4615 { Bad_Opcode },
4616 { Bad_Opcode },
4617 { Bad_Opcode },
4618 { Bad_Opcode },
4619 { Bad_Opcode },
4620 { Bad_Opcode },
4621 { Bad_Opcode },
f88c9eb0 4622 /* c8 */
035e7389
JB
4623 { "sha1nexte", { XM, EXxmm }, PREFIX_OPCODE },
4624 { "sha1msg1", { XM, EXxmm }, PREFIX_OPCODE },
4625 { "sha1msg2", { XM, EXxmm }, PREFIX_OPCODE },
4626 { "sha256rnds2", { XM, EXxmm, XMM0 }, PREFIX_OPCODE },
4627 { "sha256msg1", { XM, EXxmm }, PREFIX_OPCODE },
4628 { "sha256msg2", { XM, EXxmm }, PREFIX_OPCODE },
592d1631 4629 { Bad_Opcode },
7531c613 4630 { "gf2p8mulb", { XM, EXxmm }, PREFIX_DATA },
f88c9eb0 4631 /* d0 */
592d1631
L
4632 { Bad_Opcode },
4633 { Bad_Opcode },
4634 { Bad_Opcode },
4635 { Bad_Opcode },
4636 { Bad_Opcode },
4637 { Bad_Opcode },
4638 { Bad_Opcode },
4639 { Bad_Opcode },
f88c9eb0 4640 /* d8 */
c4694f17 4641 { PREFIX_TABLE (PREFIX_0F38D8) },
592d1631
L
4642 { Bad_Opcode },
4643 { Bad_Opcode },
7531c613 4644 { "aesimc", { XM, EXx }, PREFIX_DATA },
c4694f17
TG
4645 { PREFIX_TABLE (PREFIX_0F38DC) },
4646 { PREFIX_TABLE (PREFIX_0F38DD) },
4647 { PREFIX_TABLE (PREFIX_0F38DE) },
4648 { PREFIX_TABLE (PREFIX_0F38DF) },
f88c9eb0 4649 /* e0 */
592d1631
L
4650 { Bad_Opcode },
4651 { Bad_Opcode },
4652 { Bad_Opcode },
4653 { Bad_Opcode },
4654 { Bad_Opcode },
4655 { Bad_Opcode },
4656 { Bad_Opcode },
4657 { Bad_Opcode },
f88c9eb0 4658 /* e8 */
592d1631
L
4659 { Bad_Opcode },
4660 { Bad_Opcode },
4661 { Bad_Opcode },
4662 { Bad_Opcode },
4663 { Bad_Opcode },
4664 { Bad_Opcode },
4665 { Bad_Opcode },
4666 { Bad_Opcode },
f88c9eb0
SP
4667 /* f0 */
4668 { PREFIX_TABLE (PREFIX_0F38F0) },
4669 { PREFIX_TABLE (PREFIX_0F38F1) },
592d1631
L
4670 { Bad_Opcode },
4671 { Bad_Opcode },
4672 { Bad_Opcode },
7531c613 4673 { MOD_TABLE (MOD_0F38F5) },
e2e1fcde 4674 { PREFIX_TABLE (PREFIX_0F38F6) },
592d1631 4675 { Bad_Opcode },
f88c9eb0 4676 /* f8 */
c0a30a9f 4677 { PREFIX_TABLE (PREFIX_0F38F8) },
035e7389 4678 { MOD_TABLE (MOD_0F38F9) },
c4694f17
TG
4679 { PREFIX_TABLE (PREFIX_0F38FA) },
4680 { PREFIX_TABLE (PREFIX_0F38FB) },
592d1631
L
4681 { Bad_Opcode },
4682 { Bad_Opcode },
4683 { Bad_Opcode },
4684 { Bad_Opcode },
f88c9eb0
SP
4685 },
4686 /* THREE_BYTE_0F3A */
4687 {
4688 /* 00 */
592d1631
L
4689 { Bad_Opcode },
4690 { Bad_Opcode },
4691 { Bad_Opcode },
4692 { Bad_Opcode },
4693 { Bad_Opcode },
4694 { Bad_Opcode },
4695 { Bad_Opcode },
4696 { Bad_Opcode },
f88c9eb0 4697 /* 08 */
7531c613
JB
4698 { "roundps", { XM, EXx, Ib }, PREFIX_DATA },
4699 { "roundpd", { XM, EXx, Ib }, PREFIX_DATA },
4700 { "roundss", { XM, EXd, Ib }, PREFIX_DATA },
4701 { "roundsd", { XM, EXq, Ib }, PREFIX_DATA },
4702 { "blendps", { XM, EXx, Ib }, PREFIX_DATA },
4703 { "blendpd", { XM, EXx, Ib }, PREFIX_DATA },
4704 { "pblendw", { XM, EXx, Ib }, PREFIX_DATA },
507bd325 4705 { "palignr", { MX, EM, Ib }, PREFIX_OPCODE },
f88c9eb0 4706 /* 10 */
592d1631
L
4707 { Bad_Opcode },
4708 { Bad_Opcode },
4709 { Bad_Opcode },
4710 { Bad_Opcode },
7531c613
JB
4711 { "pextrb", { Edqb, XM, Ib }, PREFIX_DATA },
4712 { "pextrw", { Edqw, XM, Ib }, PREFIX_DATA },
4713 { "pextrK", { Edq, XM, Ib }, PREFIX_DATA },
4714 { "extractps", { Edqd, XM, Ib }, PREFIX_DATA },
f88c9eb0 4715 /* 18 */
592d1631
L
4716 { Bad_Opcode },
4717 { Bad_Opcode },
4718 { Bad_Opcode },
4719 { Bad_Opcode },
4720 { Bad_Opcode },
4721 { Bad_Opcode },
4722 { Bad_Opcode },
4723 { Bad_Opcode },
f88c9eb0 4724 /* 20 */
7531c613
JB
4725 { "pinsrb", { XM, Edqb, Ib }, PREFIX_DATA },
4726 { "insertps", { XM, EXd, Ib }, PREFIX_DATA },
4727 { "pinsrK", { XM, Edq, Ib }, PREFIX_DATA },
592d1631
L
4728 { Bad_Opcode },
4729 { Bad_Opcode },
4730 { Bad_Opcode },
4731 { Bad_Opcode },
4732 { Bad_Opcode },
f88c9eb0 4733 /* 28 */
592d1631
L
4734 { Bad_Opcode },
4735 { Bad_Opcode },
4736 { Bad_Opcode },
4737 { Bad_Opcode },
4738 { Bad_Opcode },
4739 { Bad_Opcode },
4740 { Bad_Opcode },
4741 { Bad_Opcode },
f88c9eb0 4742 /* 30 */
592d1631
L
4743 { Bad_Opcode },
4744 { Bad_Opcode },
4745 { Bad_Opcode },
4746 { Bad_Opcode },
4747 { Bad_Opcode },
4748 { Bad_Opcode },
4749 { Bad_Opcode },
4750 { Bad_Opcode },
f88c9eb0 4751 /* 38 */
592d1631
L
4752 { Bad_Opcode },
4753 { Bad_Opcode },
4754 { Bad_Opcode },
4755 { Bad_Opcode },
4756 { Bad_Opcode },
4757 { Bad_Opcode },
4758 { Bad_Opcode },
4759 { Bad_Opcode },
f88c9eb0 4760 /* 40 */
7531c613
JB
4761 { "dpps", { XM, EXx, Ib }, PREFIX_DATA },
4762 { "dppd", { XM, EXx, Ib }, PREFIX_DATA },
4763 { "mpsadbw", { XM, EXx, Ib }, PREFIX_DATA },
592d1631 4764 { Bad_Opcode },
7531c613 4765 { "pclmulqdq", { XM, EXx, PCLMUL }, PREFIX_DATA },
592d1631
L
4766 { Bad_Opcode },
4767 { Bad_Opcode },
4768 { Bad_Opcode },
f88c9eb0 4769 /* 48 */
592d1631
L
4770 { Bad_Opcode },
4771 { Bad_Opcode },
4772 { Bad_Opcode },
4773 { Bad_Opcode },
4774 { Bad_Opcode },
4775 { Bad_Opcode },
4776 { Bad_Opcode },
4777 { Bad_Opcode },
f88c9eb0 4778 /* 50 */
592d1631
L
4779 { Bad_Opcode },
4780 { Bad_Opcode },
4781 { Bad_Opcode },
4782 { Bad_Opcode },
4783 { Bad_Opcode },
4784 { Bad_Opcode },
4785 { Bad_Opcode },
4786 { Bad_Opcode },
f88c9eb0 4787 /* 58 */
592d1631
L
4788 { Bad_Opcode },
4789 { Bad_Opcode },
4790 { Bad_Opcode },
4791 { Bad_Opcode },
4792 { Bad_Opcode },
4793 { Bad_Opcode },
4794 { Bad_Opcode },
4795 { Bad_Opcode },
f88c9eb0 4796 /* 60 */
7531c613
JB
4797 { "pcmpestrm!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
4798 { "pcmpestri!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
4799 { "pcmpistrm", { XM, EXx, Ib }, PREFIX_DATA },
4800 { "pcmpistri", { XM, EXx, Ib }, PREFIX_DATA },
592d1631
L
4801 { Bad_Opcode },
4802 { Bad_Opcode },
4803 { Bad_Opcode },
4804 { Bad_Opcode },
f88c9eb0 4805 /* 68 */
592d1631
L
4806 { Bad_Opcode },
4807 { Bad_Opcode },
4808 { Bad_Opcode },
4809 { Bad_Opcode },
4810 { Bad_Opcode },
4811 { Bad_Opcode },
4812 { Bad_Opcode },
4813 { Bad_Opcode },
f88c9eb0 4814 /* 70 */
592d1631
L
4815 { Bad_Opcode },
4816 { Bad_Opcode },
4817 { Bad_Opcode },
4818 { Bad_Opcode },
4819 { Bad_Opcode },
4820 { Bad_Opcode },
4821 { Bad_Opcode },
4822 { Bad_Opcode },
f88c9eb0 4823 /* 78 */
592d1631
L
4824 { Bad_Opcode },
4825 { Bad_Opcode },
4826 { Bad_Opcode },
4827 { Bad_Opcode },
4828 { Bad_Opcode },
4829 { Bad_Opcode },
4830 { Bad_Opcode },
4831 { Bad_Opcode },
f88c9eb0 4832 /* 80 */
592d1631
L
4833 { Bad_Opcode },
4834 { Bad_Opcode },
4835 { Bad_Opcode },
4836 { Bad_Opcode },
4837 { Bad_Opcode },
4838 { Bad_Opcode },
4839 { Bad_Opcode },
4840 { Bad_Opcode },
f88c9eb0 4841 /* 88 */
592d1631
L
4842 { Bad_Opcode },
4843 { Bad_Opcode },
4844 { Bad_Opcode },
4845 { Bad_Opcode },
4846 { Bad_Opcode },
4847 { Bad_Opcode },
4848 { Bad_Opcode },
4849 { Bad_Opcode },
f88c9eb0 4850 /* 90 */
592d1631
L
4851 { Bad_Opcode },
4852 { Bad_Opcode },
4853 { Bad_Opcode },
4854 { Bad_Opcode },
4855 { Bad_Opcode },
4856 { Bad_Opcode },
4857 { Bad_Opcode },
4858 { Bad_Opcode },
f88c9eb0 4859 /* 98 */
592d1631
L
4860 { Bad_Opcode },
4861 { Bad_Opcode },
4862 { Bad_Opcode },
4863 { Bad_Opcode },
4864 { Bad_Opcode },
4865 { Bad_Opcode },
4866 { Bad_Opcode },
4867 { Bad_Opcode },
f88c9eb0 4868 /* a0 */
592d1631
L
4869 { Bad_Opcode },
4870 { Bad_Opcode },
4871 { Bad_Opcode },
4872 { Bad_Opcode },
4873 { Bad_Opcode },
4874 { Bad_Opcode },
4875 { Bad_Opcode },
4876 { Bad_Opcode },
f88c9eb0 4877 /* a8 */
592d1631
L
4878 { Bad_Opcode },
4879 { Bad_Opcode },
4880 { Bad_Opcode },
4881 { Bad_Opcode },
4882 { Bad_Opcode },
4883 { Bad_Opcode },
4884 { Bad_Opcode },
4885 { Bad_Opcode },
f88c9eb0 4886 /* b0 */
592d1631
L
4887 { Bad_Opcode },
4888 { Bad_Opcode },
4889 { Bad_Opcode },
4890 { Bad_Opcode },
4891 { Bad_Opcode },
4892 { Bad_Opcode },
4893 { Bad_Opcode },
4894 { Bad_Opcode },
f88c9eb0 4895 /* b8 */
592d1631
L
4896 { Bad_Opcode },
4897 { Bad_Opcode },
4898 { Bad_Opcode },
4899 { Bad_Opcode },
4900 { Bad_Opcode },
4901 { Bad_Opcode },
4902 { Bad_Opcode },
4903 { Bad_Opcode },
f88c9eb0 4904 /* c0 */
592d1631
L
4905 { Bad_Opcode },
4906 { Bad_Opcode },
4907 { Bad_Opcode },
4908 { Bad_Opcode },
4909 { Bad_Opcode },
4910 { Bad_Opcode },
4911 { Bad_Opcode },
4912 { Bad_Opcode },
f88c9eb0 4913 /* c8 */
592d1631
L
4914 { Bad_Opcode },
4915 { Bad_Opcode },
4916 { Bad_Opcode },
4917 { Bad_Opcode },
035e7389 4918 { "sha1rnds4", { XM, EXxmm, Ib }, PREFIX_OPCODE },
592d1631 4919 { Bad_Opcode },
7531c613
JB
4920 { "gf2p8affineqb", { XM, EXxmm, Ib }, PREFIX_DATA },
4921 { "gf2p8affineinvqb", { XM, EXxmm, Ib }, PREFIX_DATA },
f88c9eb0 4922 /* d0 */
592d1631
L
4923 { Bad_Opcode },
4924 { Bad_Opcode },
4925 { Bad_Opcode },
4926 { Bad_Opcode },
4927 { Bad_Opcode },
4928 { Bad_Opcode },
4929 { Bad_Opcode },
4930 { Bad_Opcode },
f88c9eb0 4931 /* d8 */
592d1631
L
4932 { Bad_Opcode },
4933 { Bad_Opcode },
4934 { Bad_Opcode },
4935 { Bad_Opcode },
4936 { Bad_Opcode },
4937 { Bad_Opcode },
4938 { Bad_Opcode },
7531c613 4939 { "aeskeygenassist", { XM, EXx, Ib }, PREFIX_DATA },
f88c9eb0 4940 /* e0 */
592d1631
L
4941 { Bad_Opcode },
4942 { Bad_Opcode },
4943 { Bad_Opcode },
4944 { Bad_Opcode },
4945 { Bad_Opcode },
592d1631
L
4946 { Bad_Opcode },
4947 { Bad_Opcode },
4948 { Bad_Opcode },
85f10a01 4949 /* e8 */
592d1631
L
4950 { Bad_Opcode },
4951 { Bad_Opcode },
4952 { Bad_Opcode },
4953 { Bad_Opcode },
4954 { Bad_Opcode },
4955 { Bad_Opcode },
4956 { Bad_Opcode },
4957 { Bad_Opcode },
85f10a01 4958 /* f0 */
c1fa250a 4959 { PREFIX_TABLE (PREFIX_0F3A0F) },
592d1631
L
4960 { Bad_Opcode },
4961 { Bad_Opcode },
4962 { Bad_Opcode },
4963 { Bad_Opcode },
4964 { Bad_Opcode },
4965 { Bad_Opcode },
4966 { Bad_Opcode },
85f10a01 4967 /* f8 */
592d1631
L
4968 { Bad_Opcode },
4969 { Bad_Opcode },
4970 { Bad_Opcode },
4971 { Bad_Opcode },
4972 { Bad_Opcode },
4973 { Bad_Opcode },
4974 { Bad_Opcode },
4975 { Bad_Opcode },
85f10a01 4976 },
f88c9eb0
SP
4977};
4978
4979static const struct dis386 xop_table[][256] = {
5dd85c99 4980 /* XOP_08 */
85f10a01
MM
4981 {
4982 /* 00 */
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 /* 08 */
592d1631
L
4992 { Bad_Opcode },
4993 { Bad_Opcode },
4994 { Bad_Opcode },
4995 { Bad_Opcode },
4996 { Bad_Opcode },
4997 { Bad_Opcode },
4998 { Bad_Opcode },
4999 { Bad_Opcode },
85f10a01 5000 /* 10 */
3929df09 5001 { Bad_Opcode },
592d1631
L
5002 { Bad_Opcode },
5003 { Bad_Opcode },
5004 { Bad_Opcode },
5005 { Bad_Opcode },
5006 { Bad_Opcode },
5007 { Bad_Opcode },
5008 { Bad_Opcode },
85f10a01 5009 /* 18 */
592d1631
L
5010 { Bad_Opcode },
5011 { Bad_Opcode },
5012 { Bad_Opcode },
5013 { Bad_Opcode },
5014 { Bad_Opcode },
5015 { Bad_Opcode },
5016 { Bad_Opcode },
5017 { Bad_Opcode },
85f10a01 5018 /* 20 */
592d1631
L
5019 { Bad_Opcode },
5020 { Bad_Opcode },
5021 { Bad_Opcode },
5022 { Bad_Opcode },
5023 { Bad_Opcode },
5024 { Bad_Opcode },
5025 { Bad_Opcode },
5026 { Bad_Opcode },
85f10a01 5027 /* 28 */
592d1631
L
5028 { Bad_Opcode },
5029 { Bad_Opcode },
5030 { Bad_Opcode },
5031 { Bad_Opcode },
5032 { Bad_Opcode },
5033 { Bad_Opcode },
5034 { Bad_Opcode },
5035 { Bad_Opcode },
c0f3af97 5036 /* 30 */
592d1631
L
5037 { Bad_Opcode },
5038 { Bad_Opcode },
5039 { Bad_Opcode },
5040 { Bad_Opcode },
5041 { Bad_Opcode },
5042 { Bad_Opcode },
5043 { Bad_Opcode },
5044 { Bad_Opcode },
c0f3af97 5045 /* 38 */
592d1631
L
5046 { Bad_Opcode },
5047 { Bad_Opcode },
5048 { Bad_Opcode },
5049 { Bad_Opcode },
5050 { Bad_Opcode },
5051 { Bad_Opcode },
5052 { Bad_Opcode },
5053 { Bad_Opcode },
c0f3af97 5054 /* 40 */
592d1631
L
5055 { Bad_Opcode },
5056 { Bad_Opcode },
5057 { Bad_Opcode },
5058 { Bad_Opcode },
5059 { Bad_Opcode },
5060 { Bad_Opcode },
5061 { Bad_Opcode },
5062 { Bad_Opcode },
85f10a01 5063 /* 48 */
592d1631
L
5064 { Bad_Opcode },
5065 { Bad_Opcode },
5066 { Bad_Opcode },
5067 { Bad_Opcode },
5068 { Bad_Opcode },
5069 { Bad_Opcode },
5070 { Bad_Opcode },
5071 { Bad_Opcode },
c0f3af97 5072 /* 50 */
592d1631
L
5073 { Bad_Opcode },
5074 { Bad_Opcode },
5075 { Bad_Opcode },
5076 { Bad_Opcode },
5077 { Bad_Opcode },
5078 { Bad_Opcode },
5079 { Bad_Opcode },
5080 { Bad_Opcode },
85f10a01 5081 /* 58 */
592d1631
L
5082 { Bad_Opcode },
5083 { Bad_Opcode },
5084 { Bad_Opcode },
5085 { Bad_Opcode },
5086 { Bad_Opcode },
5087 { Bad_Opcode },
5088 { Bad_Opcode },
5089 { Bad_Opcode },
c1e679ec 5090 /* 60 */
592d1631
L
5091 { Bad_Opcode },
5092 { Bad_Opcode },
5093 { Bad_Opcode },
5094 { Bad_Opcode },
5095 { Bad_Opcode },
5096 { Bad_Opcode },
5097 { Bad_Opcode },
5098 { Bad_Opcode },
c0f3af97 5099 /* 68 */
592d1631
L
5100 { Bad_Opcode },
5101 { Bad_Opcode },
5102 { Bad_Opcode },
5103 { Bad_Opcode },
5104 { Bad_Opcode },
5105 { Bad_Opcode },
5106 { Bad_Opcode },
5107 { Bad_Opcode },
85f10a01 5108 /* 70 */
592d1631
L
5109 { Bad_Opcode },
5110 { Bad_Opcode },
5111 { Bad_Opcode },
5112 { Bad_Opcode },
5113 { Bad_Opcode },
5114 { Bad_Opcode },
5115 { Bad_Opcode },
5116 { Bad_Opcode },
85f10a01 5117 /* 78 */
592d1631
L
5118 { Bad_Opcode },
5119 { Bad_Opcode },
5120 { Bad_Opcode },
5121 { Bad_Opcode },
5122 { Bad_Opcode },
5123 { Bad_Opcode },
5124 { Bad_Opcode },
5125 { Bad_Opcode },
85f10a01 5126 /* 80 */
592d1631
L
5127 { Bad_Opcode },
5128 { Bad_Opcode },
5129 { Bad_Opcode },
5130 { Bad_Opcode },
5131 { Bad_Opcode },
467bbef0
JB
5132 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_85) },
5133 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_86) },
5134 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_87) },
5dd85c99 5135 /* 88 */
592d1631
L
5136 { Bad_Opcode },
5137 { Bad_Opcode },
5138 { Bad_Opcode },
5139 { Bad_Opcode },
5140 { Bad_Opcode },
5141 { Bad_Opcode },
467bbef0
JB
5142 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_8E) },
5143 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_8F) },
5dd85c99 5144 /* 90 */
592d1631
L
5145 { Bad_Opcode },
5146 { Bad_Opcode },
5147 { Bad_Opcode },
5148 { Bad_Opcode },
5149 { Bad_Opcode },
467bbef0
JB
5150 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_95) },
5151 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_96) },
5152 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_97) },
5dd85c99 5153 /* 98 */
592d1631
L
5154 { Bad_Opcode },
5155 { Bad_Opcode },
5156 { Bad_Opcode },
5157 { Bad_Opcode },
5158 { Bad_Opcode },
5159 { Bad_Opcode },
467bbef0
JB
5160 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_9E) },
5161 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_9F) },
5dd85c99 5162 /* a0 */
592d1631
L
5163 { Bad_Opcode },
5164 { Bad_Opcode },
b13b1bc0 5165 { "vpcmov", { XM, Vex, EXx, XMVexI4 }, 0 },
467bbef0 5166 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_A3) },
592d1631
L
5167 { Bad_Opcode },
5168 { Bad_Opcode },
467bbef0 5169 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_A6) },
592d1631 5170 { Bad_Opcode },
5dd85c99 5171 /* a8 */
592d1631
L
5172 { Bad_Opcode },
5173 { Bad_Opcode },
5174 { Bad_Opcode },
5175 { Bad_Opcode },
5176 { Bad_Opcode },
5177 { Bad_Opcode },
5178 { Bad_Opcode },
5179 { Bad_Opcode },
5dd85c99 5180 /* b0 */
592d1631
L
5181 { Bad_Opcode },
5182 { Bad_Opcode },
5183 { Bad_Opcode },
5184 { Bad_Opcode },
5185 { Bad_Opcode },
5186 { Bad_Opcode },
467bbef0 5187 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_B6) },
592d1631 5188 { Bad_Opcode },
5dd85c99 5189 /* b8 */
592d1631
L
5190 { Bad_Opcode },
5191 { Bad_Opcode },
5192 { Bad_Opcode },
5193 { Bad_Opcode },
5194 { Bad_Opcode },
5195 { Bad_Opcode },
5196 { Bad_Opcode },
5197 { Bad_Opcode },
5dd85c99 5198 /* c0 */
467bbef0
JB
5199 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C0) },
5200 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C1) },
5201 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C2) },
5202 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C3) },
592d1631
L
5203 { Bad_Opcode },
5204 { Bad_Opcode },
5205 { Bad_Opcode },
5206 { Bad_Opcode },
5dd85c99 5207 /* c8 */
592d1631
L
5208 { Bad_Opcode },
5209 { Bad_Opcode },
5210 { Bad_Opcode },
5211 { Bad_Opcode },
ff688e1f
L
5212 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CC) },
5213 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CD) },
5214 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CE) },
5215 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CF) },
5dd85c99 5216 /* d0 */
592d1631
L
5217 { Bad_Opcode },
5218 { Bad_Opcode },
5219 { Bad_Opcode },
5220 { Bad_Opcode },
5221 { Bad_Opcode },
5222 { Bad_Opcode },
5223 { Bad_Opcode },
5224 { Bad_Opcode },
5dd85c99 5225 /* d8 */
592d1631
L
5226 { Bad_Opcode },
5227 { Bad_Opcode },
5228 { Bad_Opcode },
5229 { Bad_Opcode },
5230 { Bad_Opcode },
5231 { Bad_Opcode },
5232 { Bad_Opcode },
5233 { Bad_Opcode },
5dd85c99 5234 /* e0 */
592d1631
L
5235 { Bad_Opcode },
5236 { Bad_Opcode },
5237 { Bad_Opcode },
5238 { Bad_Opcode },
5239 { Bad_Opcode },
5240 { Bad_Opcode },
5241 { Bad_Opcode },
5242 { Bad_Opcode },
5dd85c99 5243 /* e8 */
592d1631
L
5244 { Bad_Opcode },
5245 { Bad_Opcode },
5246 { Bad_Opcode },
5247 { Bad_Opcode },
ff688e1f
L
5248 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EC) },
5249 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_ED) },
5250 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EE) },
5251 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EF) },
5dd85c99 5252 /* f0 */
592d1631
L
5253 { Bad_Opcode },
5254 { Bad_Opcode },
5255 { Bad_Opcode },
5256 { Bad_Opcode },
5257 { Bad_Opcode },
5258 { Bad_Opcode },
5259 { Bad_Opcode },
5260 { Bad_Opcode },
5dd85c99 5261 /* f8 */
592d1631
L
5262 { Bad_Opcode },
5263 { Bad_Opcode },
5264 { Bad_Opcode },
5265 { Bad_Opcode },
5266 { Bad_Opcode },
5267 { Bad_Opcode },
5268 { Bad_Opcode },
5269 { Bad_Opcode },
5dd85c99
SP
5270 },
5271 /* XOP_09 */
5272 {
5273 /* 00 */
592d1631 5274 { Bad_Opcode },
467bbef0
JB
5275 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_01) },
5276 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_02) },
592d1631
L
5277 { Bad_Opcode },
5278 { Bad_Opcode },
5279 { Bad_Opcode },
5280 { Bad_Opcode },
5281 { Bad_Opcode },
5dd85c99 5282 /* 08 */
592d1631
L
5283 { Bad_Opcode },
5284 { Bad_Opcode },
5285 { Bad_Opcode },
5286 { Bad_Opcode },
5287 { Bad_Opcode },
5288 { Bad_Opcode },
5289 { Bad_Opcode },
5290 { Bad_Opcode },
5dd85c99 5291 /* 10 */
592d1631
L
5292 { Bad_Opcode },
5293 { Bad_Opcode },
32e31ad7 5294 { MOD_TABLE (MOD_XOP_09_12) },
592d1631
L
5295 { Bad_Opcode },
5296 { Bad_Opcode },
5297 { Bad_Opcode },
5298 { Bad_Opcode },
5299 { Bad_Opcode },
5dd85c99 5300 /* 18 */
592d1631
L
5301 { Bad_Opcode },
5302 { Bad_Opcode },
5303 { Bad_Opcode },
5304 { Bad_Opcode },
5305 { Bad_Opcode },
5306 { Bad_Opcode },
5307 { Bad_Opcode },
5308 { Bad_Opcode },
5dd85c99 5309 /* 20 */
592d1631
L
5310 { Bad_Opcode },
5311 { Bad_Opcode },
5312 { Bad_Opcode },
5313 { Bad_Opcode },
5314 { Bad_Opcode },
5315 { Bad_Opcode },
5316 { Bad_Opcode },
5317 { Bad_Opcode },
5dd85c99 5318 /* 28 */
592d1631
L
5319 { Bad_Opcode },
5320 { Bad_Opcode },
5321 { Bad_Opcode },
5322 { Bad_Opcode },
5323 { Bad_Opcode },
5324 { Bad_Opcode },
5325 { Bad_Opcode },
5326 { Bad_Opcode },
5dd85c99 5327 /* 30 */
592d1631
L
5328 { Bad_Opcode },
5329 { Bad_Opcode },
5330 { Bad_Opcode },
5331 { Bad_Opcode },
5332 { Bad_Opcode },
5333 { Bad_Opcode },
5334 { Bad_Opcode },
5335 { Bad_Opcode },
5dd85c99 5336 /* 38 */
592d1631
L
5337 { Bad_Opcode },
5338 { Bad_Opcode },
5339 { Bad_Opcode },
5340 { Bad_Opcode },
5341 { Bad_Opcode },
5342 { Bad_Opcode },
5343 { Bad_Opcode },
5344 { Bad_Opcode },
5dd85c99 5345 /* 40 */
592d1631
L
5346 { Bad_Opcode },
5347 { Bad_Opcode },
5348 { Bad_Opcode },
5349 { Bad_Opcode },
5350 { Bad_Opcode },
5351 { Bad_Opcode },
5352 { Bad_Opcode },
5353 { Bad_Opcode },
5dd85c99 5354 /* 48 */
592d1631
L
5355 { Bad_Opcode },
5356 { Bad_Opcode },
5357 { Bad_Opcode },
5358 { Bad_Opcode },
5359 { Bad_Opcode },
5360 { Bad_Opcode },
5361 { Bad_Opcode },
5362 { Bad_Opcode },
5dd85c99 5363 /* 50 */
592d1631
L
5364 { Bad_Opcode },
5365 { Bad_Opcode },
5366 { Bad_Opcode },
5367 { Bad_Opcode },
5368 { Bad_Opcode },
5369 { Bad_Opcode },
5370 { Bad_Opcode },
5371 { Bad_Opcode },
5dd85c99 5372 /* 58 */
592d1631
L
5373 { Bad_Opcode },
5374 { Bad_Opcode },
5375 { Bad_Opcode },
5376 { Bad_Opcode },
5377 { Bad_Opcode },
5378 { Bad_Opcode },
5379 { Bad_Opcode },
5380 { Bad_Opcode },
5dd85c99 5381 /* 60 */
592d1631
L
5382 { Bad_Opcode },
5383 { Bad_Opcode },
5384 { Bad_Opcode },
5385 { Bad_Opcode },
5386 { Bad_Opcode },
5387 { Bad_Opcode },
5388 { Bad_Opcode },
5389 { Bad_Opcode },
5dd85c99 5390 /* 68 */
592d1631
L
5391 { Bad_Opcode },
5392 { Bad_Opcode },
5393 { Bad_Opcode },
5394 { Bad_Opcode },
5395 { Bad_Opcode },
5396 { Bad_Opcode },
5397 { Bad_Opcode },
5398 { Bad_Opcode },
5dd85c99 5399 /* 70 */
592d1631
L
5400 { Bad_Opcode },
5401 { Bad_Opcode },
5402 { Bad_Opcode },
5403 { Bad_Opcode },
5404 { Bad_Opcode },
5405 { Bad_Opcode },
5406 { Bad_Opcode },
5407 { Bad_Opcode },
5dd85c99 5408 /* 78 */
592d1631
L
5409 { Bad_Opcode },
5410 { Bad_Opcode },
5411 { Bad_Opcode },
5412 { Bad_Opcode },
5413 { Bad_Opcode },
5414 { Bad_Opcode },
5415 { Bad_Opcode },
5416 { Bad_Opcode },
5dd85c99 5417 /* 80 */
b5b098c2
JB
5418 { VEX_W_TABLE (VEX_W_0FXOP_09_80) },
5419 { VEX_W_TABLE (VEX_W_0FXOP_09_81) },
5420 { VEX_W_TABLE (VEX_W_0FXOP_09_82) },
5421 { VEX_W_TABLE (VEX_W_0FXOP_09_83) },
592d1631
L
5422 { Bad_Opcode },
5423 { Bad_Opcode },
5424 { Bad_Opcode },
5425 { Bad_Opcode },
5dd85c99 5426 /* 88 */
592d1631
L
5427 { Bad_Opcode },
5428 { Bad_Opcode },
5429 { Bad_Opcode },
5430 { Bad_Opcode },
5431 { Bad_Opcode },
5432 { Bad_Opcode },
5433 { Bad_Opcode },
5434 { Bad_Opcode },
5dd85c99 5435 /* 90 */
467bbef0
JB
5436 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_90) },
5437 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_91) },
5438 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_92) },
5439 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_93) },
5440 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_94) },
5441 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_95) },
5442 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_96) },
5443 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_97) },
5dd85c99 5444 /* 98 */
467bbef0
JB
5445 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_98) },
5446 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_99) },
5447 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_9A) },
5448 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_9B) },
592d1631
L
5449 { Bad_Opcode },
5450 { Bad_Opcode },
5451 { Bad_Opcode },
5452 { Bad_Opcode },
5dd85c99 5453 /* a0 */
592d1631
L
5454 { Bad_Opcode },
5455 { Bad_Opcode },
5456 { Bad_Opcode },
5457 { Bad_Opcode },
5458 { Bad_Opcode },
5459 { Bad_Opcode },
5460 { Bad_Opcode },
5461 { Bad_Opcode },
5dd85c99 5462 /* a8 */
592d1631
L
5463 { Bad_Opcode },
5464 { Bad_Opcode },
5465 { Bad_Opcode },
5466 { Bad_Opcode },
5467 { Bad_Opcode },
5468 { Bad_Opcode },
5469 { Bad_Opcode },
5470 { Bad_Opcode },
5dd85c99 5471 /* b0 */
592d1631
L
5472 { Bad_Opcode },
5473 { Bad_Opcode },
5474 { Bad_Opcode },
5475 { Bad_Opcode },
5476 { Bad_Opcode },
5477 { Bad_Opcode },
5478 { Bad_Opcode },
5479 { Bad_Opcode },
5dd85c99 5480 /* b8 */
592d1631
L
5481 { Bad_Opcode },
5482 { Bad_Opcode },
5483 { Bad_Opcode },
5484 { Bad_Opcode },
5485 { Bad_Opcode },
5486 { Bad_Opcode },
5487 { Bad_Opcode },
5488 { Bad_Opcode },
5dd85c99 5489 /* c0 */
592d1631 5490 { Bad_Opcode },
467bbef0
JB
5491 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C1) },
5492 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C2) },
5493 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C3) },
592d1631
L
5494 { Bad_Opcode },
5495 { Bad_Opcode },
467bbef0
JB
5496 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C6) },
5497 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C7) },
5dd85c99 5498 /* c8 */
592d1631
L
5499 { Bad_Opcode },
5500 { Bad_Opcode },
5501 { Bad_Opcode },
467bbef0 5502 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_CB) },
592d1631
L
5503 { Bad_Opcode },
5504 { Bad_Opcode },
5505 { Bad_Opcode },
5506 { Bad_Opcode },
5dd85c99 5507 /* d0 */
592d1631 5508 { Bad_Opcode },
467bbef0
JB
5509 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D1) },
5510 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D2) },
5511 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D3) },
592d1631
L
5512 { Bad_Opcode },
5513 { Bad_Opcode },
467bbef0
JB
5514 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D6) },
5515 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D7) },
5dd85c99 5516 /* d8 */
592d1631
L
5517 { Bad_Opcode },
5518 { Bad_Opcode },
5519 { Bad_Opcode },
467bbef0 5520 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_DB) },
592d1631
L
5521 { Bad_Opcode },
5522 { Bad_Opcode },
5523 { Bad_Opcode },
5524 { Bad_Opcode },
5dd85c99 5525 /* e0 */
592d1631 5526 { Bad_Opcode },
467bbef0
JB
5527 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E1) },
5528 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E2) },
5529 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E3) },
592d1631
L
5530 { Bad_Opcode },
5531 { Bad_Opcode },
5532 { Bad_Opcode },
5533 { Bad_Opcode },
4e7d34a6 5534 /* e8 */
592d1631
L
5535 { Bad_Opcode },
5536 { Bad_Opcode },
5537 { Bad_Opcode },
5538 { Bad_Opcode },
5539 { Bad_Opcode },
5540 { Bad_Opcode },
5541 { Bad_Opcode },
5542 { Bad_Opcode },
4e7d34a6 5543 /* f0 */
592d1631
L
5544 { Bad_Opcode },
5545 { Bad_Opcode },
5546 { Bad_Opcode },
5547 { Bad_Opcode },
5548 { Bad_Opcode },
5549 { Bad_Opcode },
5550 { Bad_Opcode },
5551 { Bad_Opcode },
4e7d34a6 5552 /* f8 */
592d1631
L
5553 { Bad_Opcode },
5554 { Bad_Opcode },
5555 { Bad_Opcode },
5556 { Bad_Opcode },
5557 { Bad_Opcode },
5558 { Bad_Opcode },
5559 { Bad_Opcode },
5560 { Bad_Opcode },
4e7d34a6 5561 },
f88c9eb0 5562 /* XOP_0A */
4e7d34a6
L
5563 {
5564 /* 00 */
592d1631
L
5565 { Bad_Opcode },
5566 { Bad_Opcode },
5567 { Bad_Opcode },
5568 { Bad_Opcode },
5569 { Bad_Opcode },
5570 { Bad_Opcode },
5571 { Bad_Opcode },
5572 { Bad_Opcode },
4e7d34a6 5573 /* 08 */
592d1631
L
5574 { Bad_Opcode },
5575 { Bad_Opcode },
5576 { Bad_Opcode },
5577 { Bad_Opcode },
5578 { Bad_Opcode },
5579 { Bad_Opcode },
5580 { Bad_Opcode },
5581 { Bad_Opcode },
4e7d34a6 5582 /* 10 */
c1dc7af5 5583 { "bextrS", { Gdq, Edq, Id }, 0 },
592d1631 5584 { Bad_Opcode },
467bbef0 5585 { VEX_LEN_TABLE (VEX_LEN_0FXOP_0A_12) },
592d1631
L
5586 { Bad_Opcode },
5587 { Bad_Opcode },
5588 { Bad_Opcode },
5589 { Bad_Opcode },
5590 { Bad_Opcode },
4e7d34a6 5591 /* 18 */
592d1631
L
5592 { Bad_Opcode },
5593 { Bad_Opcode },
5594 { Bad_Opcode },
5595 { Bad_Opcode },
5596 { Bad_Opcode },
5597 { Bad_Opcode },
5598 { Bad_Opcode },
5599 { Bad_Opcode },
4e7d34a6 5600 /* 20 */
592d1631
L
5601 { Bad_Opcode },
5602 { Bad_Opcode },
5603 { Bad_Opcode },
5604 { Bad_Opcode },
5605 { Bad_Opcode },
5606 { Bad_Opcode },
5607 { Bad_Opcode },
5608 { Bad_Opcode },
4e7d34a6 5609 /* 28 */
592d1631
L
5610 { Bad_Opcode },
5611 { Bad_Opcode },
5612 { Bad_Opcode },
5613 { Bad_Opcode },
5614 { Bad_Opcode },
5615 { Bad_Opcode },
5616 { Bad_Opcode },
5617 { Bad_Opcode },
4e7d34a6 5618 /* 30 */
592d1631
L
5619 { Bad_Opcode },
5620 { Bad_Opcode },
5621 { Bad_Opcode },
5622 { Bad_Opcode },
5623 { Bad_Opcode },
5624 { Bad_Opcode },
5625 { Bad_Opcode },
5626 { Bad_Opcode },
c0f3af97 5627 /* 38 */
592d1631
L
5628 { Bad_Opcode },
5629 { Bad_Opcode },
5630 { Bad_Opcode },
5631 { Bad_Opcode },
5632 { Bad_Opcode },
5633 { Bad_Opcode },
5634 { Bad_Opcode },
5635 { Bad_Opcode },
c0f3af97 5636 /* 40 */
592d1631
L
5637 { Bad_Opcode },
5638 { Bad_Opcode },
5639 { Bad_Opcode },
5640 { Bad_Opcode },
5641 { Bad_Opcode },
5642 { Bad_Opcode },
5643 { Bad_Opcode },
5644 { Bad_Opcode },
c1e679ec 5645 /* 48 */
592d1631
L
5646 { Bad_Opcode },
5647 { Bad_Opcode },
5648 { Bad_Opcode },
5649 { Bad_Opcode },
5650 { Bad_Opcode },
5651 { Bad_Opcode },
5652 { Bad_Opcode },
5653 { Bad_Opcode },
c1e679ec 5654 /* 50 */
592d1631
L
5655 { Bad_Opcode },
5656 { Bad_Opcode },
5657 { Bad_Opcode },
5658 { Bad_Opcode },
5659 { Bad_Opcode },
5660 { Bad_Opcode },
5661 { Bad_Opcode },
5662 { Bad_Opcode },
4e7d34a6 5663 /* 58 */
592d1631
L
5664 { Bad_Opcode },
5665 { Bad_Opcode },
5666 { Bad_Opcode },
5667 { Bad_Opcode },
5668 { Bad_Opcode },
5669 { Bad_Opcode },
5670 { Bad_Opcode },
5671 { Bad_Opcode },
4e7d34a6 5672 /* 60 */
592d1631
L
5673 { Bad_Opcode },
5674 { Bad_Opcode },
5675 { Bad_Opcode },
5676 { Bad_Opcode },
5677 { Bad_Opcode },
5678 { Bad_Opcode },
5679 { Bad_Opcode },
5680 { Bad_Opcode },
4e7d34a6 5681 /* 68 */
592d1631
L
5682 { Bad_Opcode },
5683 { Bad_Opcode },
5684 { Bad_Opcode },
5685 { Bad_Opcode },
5686 { Bad_Opcode },
5687 { Bad_Opcode },
5688 { Bad_Opcode },
5689 { Bad_Opcode },
4e7d34a6 5690 /* 70 */
592d1631
L
5691 { Bad_Opcode },
5692 { Bad_Opcode },
5693 { Bad_Opcode },
5694 { Bad_Opcode },
5695 { Bad_Opcode },
5696 { Bad_Opcode },
5697 { Bad_Opcode },
5698 { Bad_Opcode },
4e7d34a6 5699 /* 78 */
592d1631
L
5700 { Bad_Opcode },
5701 { Bad_Opcode },
5702 { Bad_Opcode },
5703 { Bad_Opcode },
5704 { Bad_Opcode },
5705 { Bad_Opcode },
5706 { Bad_Opcode },
5707 { Bad_Opcode },
4e7d34a6 5708 /* 80 */
592d1631
L
5709 { Bad_Opcode },
5710 { Bad_Opcode },
5711 { Bad_Opcode },
5712 { Bad_Opcode },
5713 { Bad_Opcode },
5714 { Bad_Opcode },
5715 { Bad_Opcode },
5716 { Bad_Opcode },
4e7d34a6 5717 /* 88 */
592d1631
L
5718 { Bad_Opcode },
5719 { Bad_Opcode },
5720 { Bad_Opcode },
5721 { Bad_Opcode },
5722 { Bad_Opcode },
5723 { Bad_Opcode },
5724 { Bad_Opcode },
5725 { Bad_Opcode },
4e7d34a6 5726 /* 90 */
592d1631
L
5727 { Bad_Opcode },
5728 { Bad_Opcode },
5729 { Bad_Opcode },
5730 { Bad_Opcode },
5731 { Bad_Opcode },
5732 { Bad_Opcode },
5733 { Bad_Opcode },
5734 { Bad_Opcode },
4e7d34a6 5735 /* 98 */
592d1631
L
5736 { Bad_Opcode },
5737 { Bad_Opcode },
5738 { Bad_Opcode },
5739 { Bad_Opcode },
5740 { Bad_Opcode },
5741 { Bad_Opcode },
5742 { Bad_Opcode },
5743 { Bad_Opcode },
4e7d34a6 5744 /* a0 */
592d1631
L
5745 { Bad_Opcode },
5746 { Bad_Opcode },
5747 { Bad_Opcode },
5748 { Bad_Opcode },
5749 { Bad_Opcode },
5750 { Bad_Opcode },
5751 { Bad_Opcode },
5752 { Bad_Opcode },
4e7d34a6 5753 /* a8 */
592d1631
L
5754 { Bad_Opcode },
5755 { Bad_Opcode },
5756 { Bad_Opcode },
5757 { Bad_Opcode },
5758 { Bad_Opcode },
5759 { Bad_Opcode },
5760 { Bad_Opcode },
5761 { Bad_Opcode },
d5d7db8e 5762 /* b0 */
592d1631
L
5763 { Bad_Opcode },
5764 { Bad_Opcode },
5765 { Bad_Opcode },
5766 { Bad_Opcode },
5767 { Bad_Opcode },
5768 { Bad_Opcode },
5769 { Bad_Opcode },
5770 { Bad_Opcode },
85f10a01 5771 /* b8 */
592d1631
L
5772 { Bad_Opcode },
5773 { Bad_Opcode },
5774 { Bad_Opcode },
5775 { Bad_Opcode },
5776 { Bad_Opcode },
5777 { Bad_Opcode },
5778 { Bad_Opcode },
5779 { Bad_Opcode },
85f10a01 5780 /* c0 */
592d1631
L
5781 { Bad_Opcode },
5782 { Bad_Opcode },
5783 { Bad_Opcode },
5784 { Bad_Opcode },
5785 { Bad_Opcode },
5786 { Bad_Opcode },
5787 { Bad_Opcode },
5788 { Bad_Opcode },
85f10a01 5789 /* c8 */
592d1631
L
5790 { Bad_Opcode },
5791 { Bad_Opcode },
5792 { Bad_Opcode },
5793 { Bad_Opcode },
5794 { Bad_Opcode },
5795 { Bad_Opcode },
5796 { Bad_Opcode },
5797 { Bad_Opcode },
85f10a01 5798 /* d0 */
592d1631
L
5799 { Bad_Opcode },
5800 { Bad_Opcode },
5801 { Bad_Opcode },
5802 { Bad_Opcode },
5803 { Bad_Opcode },
5804 { Bad_Opcode },
5805 { Bad_Opcode },
5806 { Bad_Opcode },
85f10a01 5807 /* d8 */
592d1631
L
5808 { Bad_Opcode },
5809 { Bad_Opcode },
5810 { Bad_Opcode },
5811 { Bad_Opcode },
5812 { Bad_Opcode },
5813 { Bad_Opcode },
5814 { Bad_Opcode },
5815 { Bad_Opcode },
85f10a01 5816 /* e0 */
592d1631
L
5817 { Bad_Opcode },
5818 { Bad_Opcode },
5819 { Bad_Opcode },
5820 { Bad_Opcode },
5821 { Bad_Opcode },
5822 { Bad_Opcode },
5823 { Bad_Opcode },
5824 { Bad_Opcode },
85f10a01 5825 /* e8 */
592d1631
L
5826 { Bad_Opcode },
5827 { Bad_Opcode },
5828 { Bad_Opcode },
5829 { Bad_Opcode },
5830 { Bad_Opcode },
5831 { Bad_Opcode },
5832 { Bad_Opcode },
5833 { Bad_Opcode },
85f10a01 5834 /* f0 */
592d1631
L
5835 { Bad_Opcode },
5836 { Bad_Opcode },
5837 { Bad_Opcode },
5838 { Bad_Opcode },
5839 { Bad_Opcode },
5840 { Bad_Opcode },
5841 { Bad_Opcode },
5842 { Bad_Opcode },
85f10a01 5843 /* f8 */
592d1631
L
5844 { Bad_Opcode },
5845 { Bad_Opcode },
5846 { Bad_Opcode },
5847 { Bad_Opcode },
5848 { Bad_Opcode },
5849 { Bad_Opcode },
5850 { Bad_Opcode },
5851 { Bad_Opcode },
85f10a01 5852 },
c0f3af97
L
5853};
5854
5855static const struct dis386 vex_table[][256] = {
5856 /* VEX_0F */
85f10a01
MM
5857 {
5858 /* 00 */
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 /* 08 */
592d1631
L
5868 { Bad_Opcode },
5869 { Bad_Opcode },
5870 { Bad_Opcode },
5871 { Bad_Opcode },
5872 { Bad_Opcode },
5873 { Bad_Opcode },
5874 { Bad_Opcode },
5875 { Bad_Opcode },
c0f3af97 5876 /* 10 */
592a252b
L
5877 { PREFIX_TABLE (PREFIX_VEX_0F10) },
5878 { PREFIX_TABLE (PREFIX_VEX_0F11) },
5879 { PREFIX_TABLE (PREFIX_VEX_0F12) },
5880 { MOD_TABLE (MOD_VEX_0F13) },
bf926894
JB
5881 { "vunpcklpX", { XM, Vex, EXx }, PREFIX_OPCODE },
5882 { "vunpckhpX", { XM, Vex, EXx }, PREFIX_OPCODE },
592a252b
L
5883 { PREFIX_TABLE (PREFIX_VEX_0F16) },
5884 { MOD_TABLE (MOD_VEX_0F17) },
c0f3af97 5885 /* 18 */
592d1631
L
5886 { Bad_Opcode },
5887 { Bad_Opcode },
5888 { Bad_Opcode },
5889 { Bad_Opcode },
5890 { Bad_Opcode },
5891 { Bad_Opcode },
5892 { Bad_Opcode },
5893 { Bad_Opcode },
c0f3af97 5894 /* 20 */
592d1631
L
5895 { Bad_Opcode },
5896 { Bad_Opcode },
5897 { Bad_Opcode },
5898 { Bad_Opcode },
5899 { Bad_Opcode },
5900 { Bad_Opcode },
5901 { Bad_Opcode },
5902 { Bad_Opcode },
c0f3af97 5903 /* 28 */
bf926894
JB
5904 { "vmovapX", { XM, EXx }, PREFIX_OPCODE },
5905 { "vmovapX", { EXxS, XM }, PREFIX_OPCODE },
592a252b
L
5906 { PREFIX_TABLE (PREFIX_VEX_0F2A) },
5907 { MOD_TABLE (MOD_VEX_0F2B) },
5908 { PREFIX_TABLE (PREFIX_VEX_0F2C) },
5909 { PREFIX_TABLE (PREFIX_VEX_0F2D) },
5910 { PREFIX_TABLE (PREFIX_VEX_0F2E) },
5911 { PREFIX_TABLE (PREFIX_VEX_0F2F) },
85f10a01 5912 /* 30 */
592d1631
L
5913 { Bad_Opcode },
5914 { Bad_Opcode },
5915 { Bad_Opcode },
5916 { Bad_Opcode },
5917 { Bad_Opcode },
5918 { Bad_Opcode },
5919 { Bad_Opcode },
5920 { Bad_Opcode },
4e7d34a6 5921 /* 38 */
592d1631
L
5922 { Bad_Opcode },
5923 { Bad_Opcode },
5924 { Bad_Opcode },
5925 { Bad_Opcode },
5926 { Bad_Opcode },
5927 { Bad_Opcode },
5928 { Bad_Opcode },
5929 { Bad_Opcode },
d5d7db8e 5930 /* 40 */
592d1631 5931 { Bad_Opcode },
13954a31
JB
5932 { VEX_LEN_TABLE (VEX_LEN_0F41) },
5933 { VEX_LEN_TABLE (VEX_LEN_0F42) },
592d1631 5934 { Bad_Opcode },
13954a31
JB
5935 { VEX_LEN_TABLE (VEX_LEN_0F44) },
5936 { VEX_LEN_TABLE (VEX_LEN_0F45) },
5937 { VEX_LEN_TABLE (VEX_LEN_0F46) },
5938 { VEX_LEN_TABLE (VEX_LEN_0F47) },
85f10a01 5939 /* 48 */
592d1631
L
5940 { Bad_Opcode },
5941 { Bad_Opcode },
13954a31
JB
5942 { VEX_LEN_TABLE (VEX_LEN_0F4A) },
5943 { VEX_LEN_TABLE (VEX_LEN_0F4B) },
592d1631
L
5944 { Bad_Opcode },
5945 { Bad_Opcode },
5946 { Bad_Opcode },
5947 { Bad_Opcode },
d5d7db8e 5948 /* 50 */
592a252b
L
5949 { MOD_TABLE (MOD_VEX_0F50) },
5950 { PREFIX_TABLE (PREFIX_VEX_0F51) },
5951 { PREFIX_TABLE (PREFIX_VEX_0F52) },
5952 { PREFIX_TABLE (PREFIX_VEX_0F53) },
bf926894
JB
5953 { "vandpX", { XM, Vex, EXx }, PREFIX_OPCODE },
5954 { "vandnpX", { XM, Vex, EXx }, PREFIX_OPCODE },
5955 { "vorpX", { XM, Vex, EXx }, PREFIX_OPCODE },
5956 { "vxorpX", { XM, Vex, EXx }, PREFIX_OPCODE },
c0f3af97 5957 /* 58 */
592a252b
L
5958 { PREFIX_TABLE (PREFIX_VEX_0F58) },
5959 { PREFIX_TABLE (PREFIX_VEX_0F59) },
5960 { PREFIX_TABLE (PREFIX_VEX_0F5A) },
5961 { PREFIX_TABLE (PREFIX_VEX_0F5B) },
5962 { PREFIX_TABLE (PREFIX_VEX_0F5C) },
5963 { PREFIX_TABLE (PREFIX_VEX_0F5D) },
5964 { PREFIX_TABLE (PREFIX_VEX_0F5E) },
5965 { PREFIX_TABLE (PREFIX_VEX_0F5F) },
c0f3af97 5966 /* 60 */
7531c613
JB
5967 { "vpunpcklbw", { XM, Vex, EXx }, PREFIX_DATA },
5968 { "vpunpcklwd", { XM, Vex, EXx }, PREFIX_DATA },
5969 { "vpunpckldq", { XM, Vex, EXx }, PREFIX_DATA },
5970 { "vpacksswb", { XM, Vex, EXx }, PREFIX_DATA },
5971 { "vpcmpgtb", { XM, Vex, EXx }, PREFIX_DATA },
5972 { "vpcmpgtw", { XM, Vex, EXx }, PREFIX_DATA },
5973 { "vpcmpgtd", { XM, Vex, EXx }, PREFIX_DATA },
5974 { "vpackuswb", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 5975 /* 68 */
7531c613
JB
5976 { "vpunpckhbw", { XM, Vex, EXx }, PREFIX_DATA },
5977 { "vpunpckhwd", { XM, Vex, EXx }, PREFIX_DATA },
5978 { "vpunpckhdq", { XM, Vex, EXx }, PREFIX_DATA },
5979 { "vpackssdw", { XM, Vex, EXx }, PREFIX_DATA },
5980 { "vpunpcklqdq", { XM, Vex, EXx }, PREFIX_DATA },
5981 { "vpunpckhqdq", { XM, Vex, EXx }, PREFIX_DATA },
5982 { VEX_LEN_TABLE (VEX_LEN_0F6E) },
592a252b 5983 { PREFIX_TABLE (PREFIX_VEX_0F6F) },
c0f3af97 5984 /* 70 */
592a252b 5985 { PREFIX_TABLE (PREFIX_VEX_0F70) },
14d10c6c
JB
5986 { MOD_TABLE (MOD_VEX_0F71) },
5987 { MOD_TABLE (MOD_VEX_0F72) },
5988 { MOD_TABLE (MOD_VEX_0F73) },
7531c613
JB
5989 { "vpcmpeqb", { XM, Vex, EXx }, PREFIX_DATA },
5990 { "vpcmpeqw", { XM, Vex, EXx }, PREFIX_DATA },
5991 { "vpcmpeqd", { XM, Vex, EXx }, PREFIX_DATA },
035e7389 5992 { VEX_LEN_TABLE (VEX_LEN_0F77) },
c0f3af97 5993 /* 78 */
592d1631
L
5994 { Bad_Opcode },
5995 { Bad_Opcode },
5996 { Bad_Opcode },
5997 { Bad_Opcode },
592a252b
L
5998 { PREFIX_TABLE (PREFIX_VEX_0F7C) },
5999 { PREFIX_TABLE (PREFIX_VEX_0F7D) },
6000 { PREFIX_TABLE (PREFIX_VEX_0F7E) },
6001 { PREFIX_TABLE (PREFIX_VEX_0F7F) },
c0f3af97 6002 /* 80 */
592d1631
L
6003 { Bad_Opcode },
6004 { Bad_Opcode },
6005 { Bad_Opcode },
6006 { Bad_Opcode },
6007 { Bad_Opcode },
6008 { Bad_Opcode },
6009 { Bad_Opcode },
6010 { Bad_Opcode },
c0f3af97 6011 /* 88 */
592d1631
L
6012 { Bad_Opcode },
6013 { Bad_Opcode },
6014 { Bad_Opcode },
6015 { Bad_Opcode },
6016 { Bad_Opcode },
6017 { Bad_Opcode },
6018 { Bad_Opcode },
6019 { Bad_Opcode },
c0f3af97 6020 /* 90 */
13954a31
JB
6021 { VEX_LEN_TABLE (VEX_LEN_0F90) },
6022 { VEX_LEN_TABLE (VEX_LEN_0F91) },
6023 { VEX_LEN_TABLE (VEX_LEN_0F92) },
6024 { VEX_LEN_TABLE (VEX_LEN_0F93) },
592d1631
L
6025 { Bad_Opcode },
6026 { Bad_Opcode },
6027 { Bad_Opcode },
6028 { Bad_Opcode },
c0f3af97 6029 /* 98 */
13954a31
JB
6030 { VEX_LEN_TABLE (VEX_LEN_0F98) },
6031 { VEX_LEN_TABLE (VEX_LEN_0F99) },
592d1631
L
6032 { Bad_Opcode },
6033 { Bad_Opcode },
6034 { Bad_Opcode },
6035 { Bad_Opcode },
6036 { Bad_Opcode },
6037 { Bad_Opcode },
c0f3af97 6038 /* a0 */
592d1631
L
6039 { Bad_Opcode },
6040 { Bad_Opcode },
6041 { Bad_Opcode },
6042 { Bad_Opcode },
6043 { Bad_Opcode },
6044 { Bad_Opcode },
6045 { Bad_Opcode },
6046 { Bad_Opcode },
c0f3af97 6047 /* a8 */
592d1631
L
6048 { Bad_Opcode },
6049 { Bad_Opcode },
6050 { Bad_Opcode },
6051 { Bad_Opcode },
6052 { Bad_Opcode },
6053 { Bad_Opcode },
592a252b 6054 { REG_TABLE (REG_VEX_0FAE) },
592d1631 6055 { Bad_Opcode },
c0f3af97 6056 /* b0 */
592d1631
L
6057 { Bad_Opcode },
6058 { Bad_Opcode },
6059 { Bad_Opcode },
6060 { Bad_Opcode },
6061 { Bad_Opcode },
6062 { Bad_Opcode },
6063 { Bad_Opcode },
6064 { Bad_Opcode },
c0f3af97 6065 /* b8 */
592d1631
L
6066 { Bad_Opcode },
6067 { Bad_Opcode },
6068 { Bad_Opcode },
6069 { Bad_Opcode },
6070 { Bad_Opcode },
6071 { Bad_Opcode },
6072 { Bad_Opcode },
6073 { Bad_Opcode },
c0f3af97 6074 /* c0 */
592d1631
L
6075 { Bad_Opcode },
6076 { Bad_Opcode },
592a252b 6077 { PREFIX_TABLE (PREFIX_VEX_0FC2) },
592d1631 6078 { Bad_Opcode },
7531c613
JB
6079 { VEX_LEN_TABLE (VEX_LEN_0FC4) },
6080 { VEX_LEN_TABLE (VEX_LEN_0FC5) },
bf926894 6081 { "vshufpX", { XM, Vex, EXx, Ib }, PREFIX_OPCODE },
592d1631 6082 { Bad_Opcode },
c0f3af97 6083 /* c8 */
592d1631
L
6084 { Bad_Opcode },
6085 { Bad_Opcode },
6086 { Bad_Opcode },
6087 { Bad_Opcode },
6088 { Bad_Opcode },
6089 { Bad_Opcode },
6090 { Bad_Opcode },
6091 { Bad_Opcode },
c0f3af97 6092 /* d0 */
592a252b 6093 { PREFIX_TABLE (PREFIX_VEX_0FD0) },
7531c613
JB
6094 { "vpsrlw", { XM, Vex, EXxmm }, PREFIX_DATA },
6095 { "vpsrld", { XM, Vex, EXxmm }, PREFIX_DATA },
6096 { "vpsrlq", { XM, Vex, EXxmm }, PREFIX_DATA },
6097 { "vpaddq", { XM, Vex, EXx }, PREFIX_DATA },
6098 { "vpmullw", { XM, Vex, EXx }, PREFIX_DATA },
6099 { VEX_LEN_TABLE (VEX_LEN_0FD6) },
6100 { MOD_TABLE (MOD_VEX_0FD7) },
c0f3af97 6101 /* d8 */
7531c613
JB
6102 { "vpsubusb", { XM, Vex, EXx }, PREFIX_DATA },
6103 { "vpsubusw", { XM, Vex, EXx }, PREFIX_DATA },
6104 { "vpminub", { XM, Vex, EXx }, PREFIX_DATA },
6105 { "vpand", { XM, Vex, EXx }, PREFIX_DATA },
6106 { "vpaddusb", { XM, Vex, EXx }, PREFIX_DATA },
6107 { "vpaddusw", { XM, Vex, EXx }, PREFIX_DATA },
6108 { "vpmaxub", { XM, Vex, EXx }, PREFIX_DATA },
6109 { "vpandn", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6110 /* e0 */
7531c613
JB
6111 { "vpavgb", { XM, Vex, EXx }, PREFIX_DATA },
6112 { "vpsraw", { XM, Vex, EXxmm }, PREFIX_DATA },
6113 { "vpsrad", { XM, Vex, EXxmm }, PREFIX_DATA },
6114 { "vpavgw", { XM, Vex, EXx }, PREFIX_DATA },
6115 { "vpmulhuw", { XM, Vex, EXx }, PREFIX_DATA },
6116 { "vpmulhw", { XM, Vex, EXx }, PREFIX_DATA },
592a252b 6117 { PREFIX_TABLE (PREFIX_VEX_0FE6) },
7531c613 6118 { MOD_TABLE (MOD_VEX_0FE7) },
c0f3af97 6119 /* e8 */
7531c613
JB
6120 { "vpsubsb", { XM, Vex, EXx }, PREFIX_DATA },
6121 { "vpsubsw", { XM, Vex, EXx }, PREFIX_DATA },
6122 { "vpminsw", { XM, Vex, EXx }, PREFIX_DATA },
6123 { "vpor", { XM, Vex, EXx }, PREFIX_DATA },
6124 { "vpaddsb", { XM, Vex, EXx }, PREFIX_DATA },
6125 { "vpaddsw", { XM, Vex, EXx }, PREFIX_DATA },
6126 { "vpmaxsw", { XM, Vex, EXx }, PREFIX_DATA },
6127 { "vpxor", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6128 /* f0 */
592a252b 6129 { PREFIX_TABLE (PREFIX_VEX_0FF0) },
7531c613
JB
6130 { "vpsllw", { XM, Vex, EXxmm }, PREFIX_DATA },
6131 { "vpslld", { XM, Vex, EXxmm }, PREFIX_DATA },
6132 { "vpsllq", { XM, Vex, EXxmm }, PREFIX_DATA },
6133 { "vpmuludq", { XM, Vex, EXx }, PREFIX_DATA },
6134 { "vpmaddwd", { XM, Vex, EXx }, PREFIX_DATA },
6135 { "vpsadbw", { XM, Vex, EXx }, PREFIX_DATA },
6136 { VEX_LEN_TABLE (VEX_LEN_0FF7) },
c0f3af97 6137 /* f8 */
7531c613
JB
6138 { "vpsubb", { XM, Vex, EXx }, PREFIX_DATA },
6139 { "vpsubw", { XM, Vex, EXx }, PREFIX_DATA },
6140 { "vpsubd", { XM, Vex, EXx }, PREFIX_DATA },
6141 { "vpsubq", { XM, Vex, EXx }, PREFIX_DATA },
6142 { "vpaddb", { XM, Vex, EXx }, PREFIX_DATA },
6143 { "vpaddw", { XM, Vex, EXx }, PREFIX_DATA },
6144 { "vpaddd", { XM, Vex, EXx }, PREFIX_DATA },
592d1631 6145 { Bad_Opcode },
c0f3af97
L
6146 },
6147 /* VEX_0F38 */
6148 {
6149 /* 00 */
7531c613
JB
6150 { "vpshufb", { XM, Vex, EXx }, PREFIX_DATA },
6151 { "vphaddw", { XM, Vex, EXx }, PREFIX_DATA },
6152 { "vphaddd", { XM, Vex, EXx }, PREFIX_DATA },
6153 { "vphaddsw", { XM, Vex, EXx }, PREFIX_DATA },
6154 { "vpmaddubsw", { XM, Vex, EXx }, PREFIX_DATA },
6155 { "vphsubw", { XM, Vex, EXx }, PREFIX_DATA },
6156 { "vphsubd", { XM, Vex, EXx }, PREFIX_DATA },
6157 { "vphsubsw", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6158 /* 08 */
7531c613
JB
6159 { "vpsignb", { XM, Vex, EXx }, PREFIX_DATA },
6160 { "vpsignw", { XM, Vex, EXx }, PREFIX_DATA },
6161 { "vpsignd", { XM, Vex, EXx }, PREFIX_DATA },
6162 { "vpmulhrsw", { XM, Vex, EXx }, PREFIX_DATA },
6163 { VEX_W_TABLE (VEX_W_0F380C) },
6164 { VEX_W_TABLE (VEX_W_0F380D) },
6165 { VEX_W_TABLE (VEX_W_0F380E) },
6166 { VEX_W_TABLE (VEX_W_0F380F) },
c0f3af97 6167 /* 10 */
592d1631
L
6168 { Bad_Opcode },
6169 { Bad_Opcode },
6170 { Bad_Opcode },
7531c613 6171 { VEX_W_TABLE (VEX_W_0F3813) },
592d1631
L
6172 { Bad_Opcode },
6173 { Bad_Opcode },
7531c613
JB
6174 { VEX_LEN_TABLE (VEX_LEN_0F3816) },
6175 { "vptest", { XM, EXx }, PREFIX_DATA },
c0f3af97 6176 /* 18 */
7531c613
JB
6177 { VEX_W_TABLE (VEX_W_0F3818) },
6178 { VEX_LEN_TABLE (VEX_LEN_0F3819) },
6179 { MOD_TABLE (MOD_VEX_0F381A) },
592d1631 6180 { Bad_Opcode },
7531c613
JB
6181 { "vpabsb", { XM, EXx }, PREFIX_DATA },
6182 { "vpabsw", { XM, EXx }, PREFIX_DATA },
6183 { "vpabsd", { XM, EXx }, PREFIX_DATA },
592d1631 6184 { Bad_Opcode },
c0f3af97 6185 /* 20 */
7531c613
JB
6186 { "vpmovsxbw", { XM, EXxmmq }, PREFIX_DATA },
6187 { "vpmovsxbd", { XM, EXxmmqd }, PREFIX_DATA },
6188 { "vpmovsxbq", { XM, EXxmmdw }, PREFIX_DATA },
6189 { "vpmovsxwd", { XM, EXxmmq }, PREFIX_DATA },
6190 { "vpmovsxwq", { XM, EXxmmqd }, PREFIX_DATA },
6191 { "vpmovsxdq", { XM, EXxmmq }, PREFIX_DATA },
592d1631
L
6192 { Bad_Opcode },
6193 { Bad_Opcode },
c0f3af97 6194 /* 28 */
7531c613
JB
6195 { "vpmuldq", { XM, Vex, EXx }, PREFIX_DATA },
6196 { "vpcmpeqq", { XM, Vex, EXx }, PREFIX_DATA },
6197 { MOD_TABLE (MOD_VEX_0F382A) },
6198 { "vpackusdw", { XM, Vex, EXx }, PREFIX_DATA },
6199 { MOD_TABLE (MOD_VEX_0F382C) },
6200 { MOD_TABLE (MOD_VEX_0F382D) },
6201 { MOD_TABLE (MOD_VEX_0F382E) },
6202 { MOD_TABLE (MOD_VEX_0F382F) },
c0f3af97 6203 /* 30 */
7531c613
JB
6204 { "vpmovzxbw", { XM, EXxmmq }, PREFIX_DATA },
6205 { "vpmovzxbd", { XM, EXxmmqd }, PREFIX_DATA },
6206 { "vpmovzxbq", { XM, EXxmmdw }, PREFIX_DATA },
6207 { "vpmovzxwd", { XM, EXxmmq }, PREFIX_DATA },
6208 { "vpmovzxwq", { XM, EXxmmqd }, PREFIX_DATA },
6209 { "vpmovzxdq", { XM, EXxmmq }, PREFIX_DATA },
6210 { VEX_LEN_TABLE (VEX_LEN_0F3836) },
6211 { "vpcmpgtq", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6212 /* 38 */
7531c613
JB
6213 { "vpminsb", { XM, Vex, EXx }, PREFIX_DATA },
6214 { "vpminsd", { XM, Vex, EXx }, PREFIX_DATA },
6215 { "vpminuw", { XM, Vex, EXx }, PREFIX_DATA },
6216 { "vpminud", { XM, Vex, EXx }, PREFIX_DATA },
6217 { "vpmaxsb", { XM, Vex, EXx }, PREFIX_DATA },
6218 { "vpmaxsd", { XM, Vex, EXx }, PREFIX_DATA },
6219 { "vpmaxuw", { XM, Vex, EXx }, PREFIX_DATA },
6220 { "vpmaxud", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6221 /* 40 */
7531c613
JB
6222 { "vpmulld", { XM, Vex, EXx }, PREFIX_DATA },
6223 { VEX_LEN_TABLE (VEX_LEN_0F3841) },
592d1631
L
6224 { Bad_Opcode },
6225 { Bad_Opcode },
6226 { Bad_Opcode },
7531c613
JB
6227 { "vpsrlv%DQ", { XM, Vex, EXx }, PREFIX_DATA },
6228 { VEX_W_TABLE (VEX_W_0F3846) },
6229 { "vpsllv%DQ", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6230 /* 48 */
592d1631 6231 { Bad_Opcode },
260cd341 6232 { X86_64_TABLE (X86_64_VEX_0F3849) },
592d1631 6233 { Bad_Opcode },
260cd341 6234 { X86_64_TABLE (X86_64_VEX_0F384B) },
592d1631
L
6235 { Bad_Opcode },
6236 { Bad_Opcode },
6237 { Bad_Opcode },
6238 { Bad_Opcode },
c0f3af97 6239 /* 50 */
58bf9b6a
L
6240 { VEX_W_TABLE (VEX_W_0F3850) },
6241 { VEX_W_TABLE (VEX_W_0F3851) },
6242 { VEX_W_TABLE (VEX_W_0F3852) },
6243 { VEX_W_TABLE (VEX_W_0F3853) },
592d1631
L
6244 { Bad_Opcode },
6245 { Bad_Opcode },
6246 { Bad_Opcode },
6247 { Bad_Opcode },
c0f3af97 6248 /* 58 */
7531c613
JB
6249 { VEX_W_TABLE (VEX_W_0F3858) },
6250 { VEX_W_TABLE (VEX_W_0F3859) },
6251 { MOD_TABLE (MOD_VEX_0F385A) },
592d1631 6252 { Bad_Opcode },
260cd341 6253 { X86_64_TABLE (X86_64_VEX_0F385C) },
592d1631 6254 { Bad_Opcode },
260cd341 6255 { X86_64_TABLE (X86_64_VEX_0F385E) },
592d1631 6256 { Bad_Opcode },
c0f3af97 6257 /* 60 */
592d1631
L
6258 { Bad_Opcode },
6259 { Bad_Opcode },
6260 { Bad_Opcode },
6261 { Bad_Opcode },
6262 { Bad_Opcode },
6263 { Bad_Opcode },
6264 { Bad_Opcode },
6265 { Bad_Opcode },
c0f3af97 6266 /* 68 */
592d1631
L
6267 { Bad_Opcode },
6268 { Bad_Opcode },
6269 { Bad_Opcode },
6270 { Bad_Opcode },
6271 { Bad_Opcode },
6272 { Bad_Opcode },
6273 { Bad_Opcode },
6274 { Bad_Opcode },
c0f3af97 6275 /* 70 */
592d1631
L
6276 { Bad_Opcode },
6277 { Bad_Opcode },
6278 { Bad_Opcode },
6279 { Bad_Opcode },
6280 { Bad_Opcode },
6281 { Bad_Opcode },
6282 { Bad_Opcode },
6283 { Bad_Opcode },
c0f3af97 6284 /* 78 */
7531c613
JB
6285 { VEX_W_TABLE (VEX_W_0F3878) },
6286 { VEX_W_TABLE (VEX_W_0F3879) },
592d1631
L
6287 { Bad_Opcode },
6288 { Bad_Opcode },
6289 { Bad_Opcode },
6290 { Bad_Opcode },
6291 { Bad_Opcode },
6292 { Bad_Opcode },
c0f3af97 6293 /* 80 */
592d1631
L
6294 { Bad_Opcode },
6295 { Bad_Opcode },
6296 { Bad_Opcode },
6297 { Bad_Opcode },
6298 { Bad_Opcode },
6299 { Bad_Opcode },
6300 { Bad_Opcode },
6301 { Bad_Opcode },
c0f3af97 6302 /* 88 */
592d1631
L
6303 { Bad_Opcode },
6304 { Bad_Opcode },
6305 { Bad_Opcode },
6306 { Bad_Opcode },
7531c613 6307 { MOD_TABLE (MOD_VEX_0F388C) },
592d1631 6308 { Bad_Opcode },
7531c613 6309 { MOD_TABLE (MOD_VEX_0F388E) },
592d1631 6310 { Bad_Opcode },
c0f3af97 6311 /* 90 */
7531c613
JB
6312 { "vpgatherd%DQ", { XM, MVexVSIBDWpX, Vex }, PREFIX_DATA },
6313 { "vpgatherq%DQ", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, PREFIX_DATA },
6314 { "vgatherdp%XW", { XM, MVexVSIBDWpX, Vex }, PREFIX_DATA },
6315 { "vgatherqp%XW", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, PREFIX_DATA },
592d1631
L
6316 { Bad_Opcode },
6317 { Bad_Opcode },
7531c613
JB
6318 { "vfmaddsub132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6319 { "vfmsubadd132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6320 /* 98 */
7531c613
JB
6321 { "vfmadd132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6322 { "vfmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6323 { "vfmsub132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6324 { "vfmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6325 { "vfnmadd132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6326 { "vfnmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6327 { "vfnmsub132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6328 { "vfnmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
c0f3af97 6329 /* a0 */
592d1631
L
6330 { Bad_Opcode },
6331 { Bad_Opcode },
6332 { Bad_Opcode },
6333 { Bad_Opcode },
6334 { Bad_Opcode },
6335 { Bad_Opcode },
7531c613
JB
6336 { "vfmaddsub213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6337 { "vfmsubadd213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6338 /* a8 */
7531c613
JB
6339 { "vfmadd213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6340 { "vfmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6341 { "vfmsub213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6342 { "vfmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6343 { "vfnmadd213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6344 { "vfnmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6345 { "vfnmsub213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6346 { "vfnmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
c0f3af97 6347 /* b0 */
592d1631
L
6348 { Bad_Opcode },
6349 { Bad_Opcode },
6350 { Bad_Opcode },
6351 { Bad_Opcode },
6352 { Bad_Opcode },
6353 { Bad_Opcode },
7531c613
JB
6354 { "vfmaddsub231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6355 { "vfmsubadd231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6356 /* b8 */
7531c613
JB
6357 { "vfmadd231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6358 { "vfmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6359 { "vfmsub231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6360 { "vfmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6361 { "vfnmadd231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6362 { "vfnmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6363 { "vfnmsub231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6364 { "vfnmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
c0f3af97 6365 /* c0 */
592d1631
L
6366 { Bad_Opcode },
6367 { Bad_Opcode },
6368 { Bad_Opcode },
6369 { Bad_Opcode },
6370 { Bad_Opcode },
6371 { Bad_Opcode },
6372 { Bad_Opcode },
6373 { Bad_Opcode },
c0f3af97 6374 /* c8 */
592d1631
L
6375 { Bad_Opcode },
6376 { Bad_Opcode },
6377 { Bad_Opcode },
6378 { Bad_Opcode },
6379 { Bad_Opcode },
6380 { Bad_Opcode },
6381 { Bad_Opcode },
7531c613 6382 { VEX_W_TABLE (VEX_W_0F38CF) },
c0f3af97 6383 /* d0 */
592d1631
L
6384 { Bad_Opcode },
6385 { Bad_Opcode },
6386 { Bad_Opcode },
6387 { Bad_Opcode },
6388 { Bad_Opcode },
6389 { Bad_Opcode },
6390 { Bad_Opcode },
6391 { Bad_Opcode },
c0f3af97 6392 /* d8 */
592d1631
L
6393 { Bad_Opcode },
6394 { Bad_Opcode },
6395 { Bad_Opcode },
7531c613
JB
6396 { VEX_LEN_TABLE (VEX_LEN_0F38DB) },
6397 { "vaesenc", { XM, Vex, EXx }, PREFIX_DATA },
6398 { "vaesenclast", { XM, Vex, EXx }, PREFIX_DATA },
6399 { "vaesdec", { XM, Vex, EXx }, PREFIX_DATA },
6400 { "vaesdeclast", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6401 /* e0 */
592d1631
L
6402 { Bad_Opcode },
6403 { Bad_Opcode },
6404 { Bad_Opcode },
6405 { Bad_Opcode },
6406 { Bad_Opcode },
6407 { Bad_Opcode },
6408 { Bad_Opcode },
6409 { Bad_Opcode },
c0f3af97 6410 /* e8 */
592d1631
L
6411 { Bad_Opcode },
6412 { Bad_Opcode },
6413 { Bad_Opcode },
6414 { Bad_Opcode },
6415 { Bad_Opcode },
6416 { Bad_Opcode },
6417 { Bad_Opcode },
6418 { Bad_Opcode },
c0f3af97 6419 /* f0 */
592d1631
L
6420 { Bad_Opcode },
6421 { Bad_Opcode },
035e7389 6422 { VEX_LEN_TABLE (VEX_LEN_0F38F2) },
14d10c6c 6423 { VEX_LEN_TABLE (VEX_LEN_0F38F3) },
592d1631 6424 { Bad_Opcode },
14d10c6c
JB
6425 { VEX_LEN_TABLE (VEX_LEN_0F38F5) },
6426 { VEX_LEN_TABLE (VEX_LEN_0F38F6) },
6427 { VEX_LEN_TABLE (VEX_LEN_0F38F7) },
c0f3af97 6428 /* f8 */
592d1631
L
6429 { Bad_Opcode },
6430 { Bad_Opcode },
6431 { Bad_Opcode },
6432 { Bad_Opcode },
6433 { Bad_Opcode },
6434 { Bad_Opcode },
6435 { Bad_Opcode },
6436 { Bad_Opcode },
c0f3af97
L
6437 },
6438 /* VEX_0F3A */
6439 {
6440 /* 00 */
7531c613
JB
6441 { VEX_LEN_TABLE (VEX_LEN_0F3A00) },
6442 { VEX_LEN_TABLE (VEX_LEN_0F3A01) },
6443 { VEX_W_TABLE (VEX_W_0F3A02) },
592d1631 6444 { Bad_Opcode },
7531c613
JB
6445 { VEX_W_TABLE (VEX_W_0F3A04) },
6446 { VEX_W_TABLE (VEX_W_0F3A05) },
6447 { VEX_LEN_TABLE (VEX_LEN_0F3A06) },
592d1631 6448 { Bad_Opcode },
c0f3af97 6449 /* 08 */
7531c613
JB
6450 { "vroundps", { XM, EXx, Ib }, PREFIX_DATA },
6451 { "vroundpd", { XM, EXx, Ib }, PREFIX_DATA },
6452 { "vroundss", { XMScalar, VexScalar, EXxmm_md, Ib }, PREFIX_DATA },
6453 { "vroundsd", { XMScalar, VexScalar, EXxmm_mq, Ib }, PREFIX_DATA },
6454 { "vblendps", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6455 { "vblendpd", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6456 { "vpblendw", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6457 { "vpalignr", { XM, Vex, EXx, Ib }, PREFIX_DATA },
c0f3af97 6458 /* 10 */
592d1631
L
6459 { Bad_Opcode },
6460 { Bad_Opcode },
6461 { Bad_Opcode },
6462 { Bad_Opcode },
7531c613
JB
6463 { VEX_LEN_TABLE (VEX_LEN_0F3A14) },
6464 { VEX_LEN_TABLE (VEX_LEN_0F3A15) },
6465 { VEX_LEN_TABLE (VEX_LEN_0F3A16) },
6466 { VEX_LEN_TABLE (VEX_LEN_0F3A17) },
c0f3af97 6467 /* 18 */
7531c613
JB
6468 { VEX_LEN_TABLE (VEX_LEN_0F3A18) },
6469 { VEX_LEN_TABLE (VEX_LEN_0F3A19) },
592d1631
L
6470 { Bad_Opcode },
6471 { Bad_Opcode },
6472 { Bad_Opcode },
7531c613 6473 { VEX_W_TABLE (VEX_W_0F3A1D) },
592d1631
L
6474 { Bad_Opcode },
6475 { Bad_Opcode },
c0f3af97 6476 /* 20 */
7531c613
JB
6477 { VEX_LEN_TABLE (VEX_LEN_0F3A20) },
6478 { VEX_LEN_TABLE (VEX_LEN_0F3A21) },
6479 { VEX_LEN_TABLE (VEX_LEN_0F3A22) },
592d1631
L
6480 { Bad_Opcode },
6481 { Bad_Opcode },
6482 { Bad_Opcode },
6483 { Bad_Opcode },
6484 { Bad_Opcode },
c0f3af97 6485 /* 28 */
592d1631
L
6486 { Bad_Opcode },
6487 { Bad_Opcode },
6488 { Bad_Opcode },
6489 { Bad_Opcode },
6490 { Bad_Opcode },
6491 { Bad_Opcode },
6492 { Bad_Opcode },
6493 { Bad_Opcode },
c0f3af97 6494 /* 30 */
7531c613
JB
6495 { VEX_LEN_TABLE (VEX_LEN_0F3A30) },
6496 { VEX_LEN_TABLE (VEX_LEN_0F3A31) },
6497 { VEX_LEN_TABLE (VEX_LEN_0F3A32) },
6498 { VEX_LEN_TABLE (VEX_LEN_0F3A33) },
592d1631
L
6499 { Bad_Opcode },
6500 { Bad_Opcode },
6501 { Bad_Opcode },
6502 { Bad_Opcode },
c0f3af97 6503 /* 38 */
7531c613
JB
6504 { VEX_LEN_TABLE (VEX_LEN_0F3A38) },
6505 { VEX_LEN_TABLE (VEX_LEN_0F3A39) },
592d1631
L
6506 { Bad_Opcode },
6507 { Bad_Opcode },
6508 { Bad_Opcode },
6509 { Bad_Opcode },
6510 { Bad_Opcode },
6511 { Bad_Opcode },
c0f3af97 6512 /* 40 */
7531c613
JB
6513 { "vdpps", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6514 { VEX_LEN_TABLE (VEX_LEN_0F3A41) },
6515 { "vmpsadbw", { XM, Vex, EXx, Ib }, PREFIX_DATA },
592d1631 6516 { Bad_Opcode },
7531c613 6517 { "vpclmulqdq", { XM, Vex, EXx, PCLMUL }, PREFIX_DATA },
592d1631 6518 { Bad_Opcode },
7531c613 6519 { VEX_LEN_TABLE (VEX_LEN_0F3A46) },
592d1631 6520 { Bad_Opcode },
c0f3af97 6521 /* 48 */
7531c613
JB
6522 { "vpermil2ps", { XM, Vex, EXx, XMVexI4, VexI4 }, PREFIX_DATA },
6523 { "vpermil2pd", { XM, Vex, EXx, XMVexI4, VexI4 }, PREFIX_DATA },
6524 { VEX_W_TABLE (VEX_W_0F3A4A) },
6525 { VEX_W_TABLE (VEX_W_0F3A4B) },
6526 { VEX_W_TABLE (VEX_W_0F3A4C) },
592d1631
L
6527 { Bad_Opcode },
6528 { Bad_Opcode },
6529 { Bad_Opcode },
c0f3af97 6530 /* 50 */
592d1631
L
6531 { Bad_Opcode },
6532 { Bad_Opcode },
6533 { Bad_Opcode },
6534 { Bad_Opcode },
6535 { Bad_Opcode },
6536 { Bad_Opcode },
6537 { Bad_Opcode },
6538 { Bad_Opcode },
c0f3af97 6539 /* 58 */
592d1631
L
6540 { Bad_Opcode },
6541 { Bad_Opcode },
6542 { Bad_Opcode },
6543 { Bad_Opcode },
7531c613
JB
6544 { "vfmaddsubps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6545 { "vfmaddsubpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6546 { "vfmsubaddps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6547 { "vfmsubaddpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
c0f3af97 6548 /* 60 */
7531c613
JB
6549 { VEX_LEN_TABLE (VEX_LEN_0F3A60) },
6550 { VEX_LEN_TABLE (VEX_LEN_0F3A61) },
6551 { VEX_LEN_TABLE (VEX_LEN_0F3A62) },
6552 { VEX_LEN_TABLE (VEX_LEN_0F3A63) },
592d1631
L
6553 { Bad_Opcode },
6554 { Bad_Opcode },
6555 { Bad_Opcode },
6556 { Bad_Opcode },
c0f3af97 6557 /* 68 */
7531c613
JB
6558 { "vfmaddps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6559 { "vfmaddpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6560 { "vfmaddss", { XMScalar, VexScalar, EXxmm_md, XMVexScalarI4 }, PREFIX_DATA },
6561 { "vfmaddsd", { XMScalar, VexScalar, EXxmm_mq, XMVexScalarI4 }, PREFIX_DATA },
6562 { "vfmsubps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6563 { "vfmsubpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6564 { "vfmsubss", { XMScalar, VexScalar, EXxmm_md, XMVexScalarI4 }, PREFIX_DATA },
6565 { "vfmsubsd", { XMScalar, VexScalar, EXxmm_mq, XMVexScalarI4 }, PREFIX_DATA },
c0f3af97 6566 /* 70 */
592d1631
L
6567 { Bad_Opcode },
6568 { Bad_Opcode },
6569 { Bad_Opcode },
6570 { Bad_Opcode },
6571 { Bad_Opcode },
6572 { Bad_Opcode },
6573 { Bad_Opcode },
6574 { Bad_Opcode },
c0f3af97 6575 /* 78 */
7531c613
JB
6576 { "vfnmaddps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6577 { "vfnmaddpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6578 { "vfnmaddss", { XMScalar, VexScalar, EXxmm_md, XMVexScalarI4 }, PREFIX_DATA },
6579 { "vfnmaddsd", { XMScalar, VexScalar, EXxmm_mq, XMVexScalarI4 }, PREFIX_DATA },
6580 { "vfnmsubps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6581 { "vfnmsubpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6582 { "vfnmsubss", { XMScalar, VexScalar, EXxmm_md, XMVexScalarI4 }, PREFIX_DATA },
6583 { "vfnmsubsd", { XMScalar, VexScalar, EXxmm_mq, XMVexScalarI4 }, PREFIX_DATA },
c0f3af97 6584 /* 80 */
592d1631
L
6585 { Bad_Opcode },
6586 { Bad_Opcode },
6587 { Bad_Opcode },
6588 { Bad_Opcode },
6589 { Bad_Opcode },
6590 { Bad_Opcode },
6591 { Bad_Opcode },
6592 { Bad_Opcode },
c0f3af97 6593 /* 88 */
592d1631
L
6594 { Bad_Opcode },
6595 { Bad_Opcode },
6596 { Bad_Opcode },
6597 { Bad_Opcode },
6598 { Bad_Opcode },
6599 { Bad_Opcode },
6600 { Bad_Opcode },
6601 { Bad_Opcode },
c0f3af97 6602 /* 90 */
592d1631
L
6603 { Bad_Opcode },
6604 { Bad_Opcode },
6605 { Bad_Opcode },
6606 { Bad_Opcode },
6607 { Bad_Opcode },
6608 { Bad_Opcode },
6609 { Bad_Opcode },
6610 { Bad_Opcode },
c0f3af97 6611 /* 98 */
592d1631
L
6612 { Bad_Opcode },
6613 { Bad_Opcode },
6614 { Bad_Opcode },
6615 { Bad_Opcode },
6616 { Bad_Opcode },
6617 { Bad_Opcode },
6618 { Bad_Opcode },
6619 { Bad_Opcode },
c0f3af97 6620 /* a0 */
592d1631
L
6621 { Bad_Opcode },
6622 { Bad_Opcode },
6623 { Bad_Opcode },
6624 { Bad_Opcode },
6625 { Bad_Opcode },
6626 { Bad_Opcode },
6627 { Bad_Opcode },
6628 { Bad_Opcode },
c0f3af97 6629 /* a8 */
592d1631
L
6630 { Bad_Opcode },
6631 { Bad_Opcode },
6632 { Bad_Opcode },
6633 { Bad_Opcode },
6634 { Bad_Opcode },
6635 { Bad_Opcode },
6636 { Bad_Opcode },
6637 { Bad_Opcode },
c0f3af97 6638 /* b0 */
592d1631
L
6639 { Bad_Opcode },
6640 { Bad_Opcode },
6641 { Bad_Opcode },
6642 { Bad_Opcode },
6643 { Bad_Opcode },
6644 { Bad_Opcode },
6645 { Bad_Opcode },
6646 { Bad_Opcode },
c0f3af97 6647 /* b8 */
592d1631
L
6648 { Bad_Opcode },
6649 { Bad_Opcode },
6650 { Bad_Opcode },
6651 { Bad_Opcode },
6652 { Bad_Opcode },
6653 { Bad_Opcode },
6654 { Bad_Opcode },
6655 { Bad_Opcode },
c0f3af97 6656 /* c0 */
592d1631
L
6657 { Bad_Opcode },
6658 { Bad_Opcode },
6659 { Bad_Opcode },
6660 { Bad_Opcode },
6661 { Bad_Opcode },
6662 { Bad_Opcode },
6663 { Bad_Opcode },
6664 { Bad_Opcode },
c0f3af97 6665 /* c8 */
592d1631
L
6666 { Bad_Opcode },
6667 { Bad_Opcode },
6668 { Bad_Opcode },
6669 { Bad_Opcode },
6670 { Bad_Opcode },
6671 { Bad_Opcode },
7531c613
JB
6672 { VEX_W_TABLE (VEX_W_0F3ACE) },
6673 { VEX_W_TABLE (VEX_W_0F3ACF) },
c0f3af97 6674 /* d0 */
592d1631
L
6675 { Bad_Opcode },
6676 { Bad_Opcode },
6677 { Bad_Opcode },
6678 { Bad_Opcode },
6679 { Bad_Opcode },
6680 { Bad_Opcode },
6681 { Bad_Opcode },
6682 { Bad_Opcode },
c0f3af97 6683 /* d8 */
592d1631
L
6684 { Bad_Opcode },
6685 { Bad_Opcode },
6686 { Bad_Opcode },
6687 { Bad_Opcode },
6688 { Bad_Opcode },
6689 { Bad_Opcode },
6690 { Bad_Opcode },
7531c613 6691 { VEX_LEN_TABLE (VEX_LEN_0F3ADF) },
c0f3af97 6692 /* e0 */
592d1631
L
6693 { Bad_Opcode },
6694 { Bad_Opcode },
6695 { Bad_Opcode },
6696 { Bad_Opcode },
6697 { Bad_Opcode },
6698 { Bad_Opcode },
6699 { Bad_Opcode },
6700 { Bad_Opcode },
c0f3af97 6701 /* e8 */
592d1631
L
6702 { Bad_Opcode },
6703 { Bad_Opcode },
6704 { Bad_Opcode },
6705 { Bad_Opcode },
6706 { Bad_Opcode },
6707 { Bad_Opcode },
6708 { Bad_Opcode },
6709 { Bad_Opcode },
c0f3af97 6710 /* f0 */
14d10c6c 6711 { VEX_LEN_TABLE (VEX_LEN_0F3AF0) },
592d1631
L
6712 { Bad_Opcode },
6713 { Bad_Opcode },
6714 { Bad_Opcode },
6715 { Bad_Opcode },
6716 { Bad_Opcode },
6717 { Bad_Opcode },
6718 { Bad_Opcode },
c0f3af97 6719 /* f8 */
592d1631
L
6720 { Bad_Opcode },
6721 { Bad_Opcode },
6722 { Bad_Opcode },
6723 { Bad_Opcode },
6724 { Bad_Opcode },
6725 { Bad_Opcode },
6726 { Bad_Opcode },
6727 { Bad_Opcode },
c0f3af97
L
6728 },
6729};
6730
43234a1e 6731#include "i386-dis-evex.h"
ad692897 6732
c0f3af97 6733static const struct dis386 vex_len_table[][2] = {
18897deb 6734 /* VEX_LEN_0F12_P_0_M_0 / VEX_LEN_0F12_P_2_M_0 */
c0f3af97 6735 {
89e65d17 6736 { "vmovlpX", { XM, Vex, EXq }, 0 },
c0f3af97
L
6737 },
6738
592a252b 6739 /* VEX_LEN_0F12_P_0_M_1 */
c0f3af97 6740 {
89e65d17 6741 { "vmovhlps", { XM, Vex, EXq }, 0 },
c0f3af97
L
6742 },
6743
592a252b 6744 /* VEX_LEN_0F13_M_0 */
c0f3af97 6745 {
bf926894 6746 { "vmovlpX", { EXq, XM }, PREFIX_OPCODE },
c0f3af97
L
6747 },
6748
18897deb 6749 /* VEX_LEN_0F16_P_0_M_0 / VEX_LEN_0F16_P_2_M_0 */
c0f3af97 6750 {
89e65d17 6751 { "vmovhpX", { XM, Vex, EXq }, 0 },
c0f3af97
L
6752 },
6753
592a252b 6754 /* VEX_LEN_0F16_P_0_M_1 */
c0f3af97 6755 {
89e65d17 6756 { "vmovlhps", { XM, Vex, EXq }, 0 },
c0f3af97
L
6757 },
6758
592a252b 6759 /* VEX_LEN_0F17_M_0 */
c0f3af97 6760 {
bf926894 6761 { "vmovhpX", { EXq, XM }, PREFIX_OPCODE },
c0f3af97
L
6762 },
6763
13954a31 6764 /* VEX_LEN_0F41 */
43234a1e
L
6765 {
6766 { Bad_Opcode },
13954a31 6767 { MOD_TABLE (MOD_VEX_0F41_L_1) },
43234a1e 6768 },
13954a31
JB
6769
6770 /* VEX_LEN_0F42 */
1ba585e8
IT
6771 {
6772 { Bad_Opcode },
13954a31 6773 { MOD_TABLE (MOD_VEX_0F42_L_1) },
1ba585e8 6774 },
13954a31
JB
6775
6776 /* VEX_LEN_0F44 */
43234a1e 6777 {
13954a31 6778 { MOD_TABLE (MOD_VEX_0F44_L_0) },
43234a1e 6779 },
13954a31
JB
6780
6781 /* VEX_LEN_0F45 */
1ba585e8
IT
6782 {
6783 { Bad_Opcode },
13954a31 6784 { MOD_TABLE (MOD_VEX_0F45_L_1) },
1ba585e8 6785 },
13954a31
JB
6786
6787 /* VEX_LEN_0F46 */
1ba585e8
IT
6788 {
6789 { Bad_Opcode },
13954a31 6790 { MOD_TABLE (MOD_VEX_0F46_L_1) },
1ba585e8 6791 },
13954a31
JB
6792
6793 /* VEX_LEN_0F47 */
1ba585e8
IT
6794 {
6795 { Bad_Opcode },
13954a31 6796 { MOD_TABLE (MOD_VEX_0F47_L_1) },
1ba585e8 6797 },
13954a31
JB
6798
6799 /* VEX_LEN_0F4A */
1ba585e8
IT
6800 {
6801 { Bad_Opcode },
13954a31 6802 { MOD_TABLE (MOD_VEX_0F4A_L_1) },
1ba585e8 6803 },
13954a31
JB
6804
6805 /* VEX_LEN_0F4B */
43234a1e
L
6806 {
6807 { Bad_Opcode },
13954a31 6808 { MOD_TABLE (MOD_VEX_0F4B_L_1) },
43234a1e
L
6809 },
6810
7531c613 6811 /* VEX_LEN_0F6E */
c0f3af97 6812 {
7531c613 6813 { "vmovK", { XMScalar, Edq }, PREFIX_DATA },
c0f3af97
L
6814 },
6815
035e7389 6816 /* VEX_LEN_0F77 */
c0f3af97 6817 {
ec6f095a
L
6818 { "vzeroupper", { XX }, 0 },
6819 { "vzeroall", { XX }, 0 },
c0f3af97
L
6820 },
6821
ec6f095a 6822 /* VEX_LEN_0F7E_P_1 */
c0f3af97 6823 {
5b872f7d 6824 { "vmovq", { XMScalar, EXxmm_mq }, 0 },
c0f3af97
L
6825 },
6826
ec6f095a 6827 /* VEX_LEN_0F7E_P_2 */
c0f3af97 6828 {
ec6f095a 6829 { "vmovK", { Edq, XMScalar }, 0 },
c0f3af97
L
6830 },
6831
13954a31 6832 /* VEX_LEN_0F90 */
c0f3af97 6833 {
13954a31 6834 { VEX_W_TABLE (VEX_W_0F90_L_0) },
c0f3af97
L
6835 },
6836
13954a31 6837 /* VEX_LEN_0F91 */
c0f3af97 6838 {
13954a31 6839 { MOD_TABLE (MOD_VEX_0F91_L_0) },
c0f3af97
L
6840 },
6841
13954a31 6842 /* VEX_LEN_0F92 */
c0f3af97 6843 {
13954a31 6844 { MOD_TABLE (MOD_VEX_0F92_L_0) },
c0f3af97
L
6845 },
6846
13954a31 6847 /* VEX_LEN_0F93 */
c0f3af97 6848 {
13954a31 6849 { MOD_TABLE (MOD_VEX_0F93_L_0) },
c0f3af97
L
6850 },
6851
13954a31 6852 /* VEX_LEN_0F98 */
43234a1e 6853 {
13954a31 6854 { MOD_TABLE (MOD_VEX_0F98_L_0) },
43234a1e
L
6855 },
6856
13954a31 6857 /* VEX_LEN_0F99 */
1ba585e8 6858 {
13954a31 6859 { MOD_TABLE (MOD_VEX_0F99_L_0) },
1ba585e8
IT
6860 },
6861
6c30d220 6862 /* VEX_LEN_0FAE_R_2_M_0 */
c0f3af97 6863 {
ec6f095a 6864 { "vldmxcsr", { Md }, 0 },
c0f3af97
L
6865 },
6866
6c30d220 6867 /* VEX_LEN_0FAE_R_3_M_0 */
c0f3af97 6868 {
ec6f095a 6869 { "vstmxcsr", { Md }, 0 },
c0f3af97
L
6870 },
6871
7531c613 6872 /* VEX_LEN_0FC4 */
c0f3af97 6873 {
7531c613 6874 { "vpinsrw", { XM, Vex, Edqw, Ib }, PREFIX_DATA },
c0f3af97
L
6875 },
6876
7531c613 6877 /* VEX_LEN_0FC5 */
c0f3af97 6878 {
7531c613 6879 { "vpextrw", { Gdq, XS, Ib }, PREFIX_DATA },
c0f3af97
L
6880 },
6881
7531c613 6882 /* VEX_LEN_0FD6 */
c0f3af97 6883 {
7531c613 6884 { "vmovq", { EXqS, XMScalar }, PREFIX_DATA },
c0f3af97
L
6885 },
6886
7531c613 6887 /* VEX_LEN_0FF7 */
c0f3af97 6888 {
7531c613 6889 { "vmaskmovdqu", { XM, XS }, PREFIX_DATA },
c0f3af97
L
6890 },
6891
7531c613 6892 /* VEX_LEN_0F3816 */
c0f3af97 6893 {
6c30d220 6894 { Bad_Opcode },
7531c613 6895 { VEX_W_TABLE (VEX_W_0F3816_L_1) },
c0f3af97
L
6896 },
6897
7531c613 6898 /* VEX_LEN_0F3819 */
c0f3af97 6899 {
6c30d220 6900 { Bad_Opcode },
7531c613 6901 { VEX_W_TABLE (VEX_W_0F3819_L_1) },
c0f3af97
L
6902 },
6903
7531c613 6904 /* VEX_LEN_0F381A_M_0 */
c0f3af97 6905 {
6c30d220 6906 { Bad_Opcode },
7531c613 6907 { VEX_W_TABLE (VEX_W_0F381A_M_0_L_1) },
c0f3af97
L
6908 },
6909
7531c613 6910 /* VEX_LEN_0F3836 */
c0f3af97 6911 {
6c30d220 6912 { Bad_Opcode },
7531c613 6913 { VEX_W_TABLE (VEX_W_0F3836) },
c0f3af97
L
6914 },
6915
7531c613 6916 /* VEX_LEN_0F3841 */
c0f3af97 6917 {
7531c613 6918 { "vphminposuw", { XM, EXx }, PREFIX_DATA },
c0f3af97
L
6919 },
6920
260cd341
LC
6921 /* VEX_LEN_0F3849_X86_64_P_0_W_0_M_0 */
6922 {
6923 { "ldtilecfg", { M }, 0 },
6924 },
6925
6926 /* VEX_LEN_0F3849_X86_64_P_0_W_0_M_1_REG_0_RM_0 */
6927 {
6928 { "tilerelease", { Skip_MODRM }, 0 },
6929 },
6930
6931 /* VEX_LEN_0F3849_X86_64_P_2_W_0_M_0 */
6932 {
6933 { "sttilecfg", { M }, 0 },
6934 },
6935
6936 /* VEX_LEN_0F3849_X86_64_P_3_W_0_M_0 */
6937 {
6938 { "tilezero", { TMM, Skip_MODRM }, 0 },
6939 },
6940
6941 /* VEX_LEN_0F384B_X86_64_P_1_W_0_M_0 */
6942 {
6943 { "tilestored", { MVexSIBMEM, TMM }, 0 },
6944 },
6945 /* VEX_LEN_0F384B_X86_64_P_2_W_0_M_0 */
6946 {
6947 { "tileloaddt1", { TMM, MVexSIBMEM }, 0 },
6948 },
6949
6950 /* VEX_LEN_0F384B_X86_64_P_3_W_0_M_0 */
6951 {
6952 { "tileloadd", { TMM, MVexSIBMEM }, 0 },
6953 },
6954
7531c613 6955 /* VEX_LEN_0F385A_M_0 */
6c30d220
L
6956 {
6957 { Bad_Opcode },
7531c613 6958 { VEX_W_TABLE (VEX_W_0F385A_M_0_L_0) },
6c30d220
L
6959 },
6960
260cd341
LC
6961 /* VEX_LEN_0F385C_X86_64_P_1_W_0_M_0 */
6962 {
6963 { "tdpbf16ps", { TMM, EXtmm, VexTmm }, 0 },
6964 },
6965
6966 /* VEX_LEN_0F385E_X86_64_P_0_W_0_M_0 */
6967 {
6968 { "tdpbuud", {TMM, EXtmm, VexTmm }, 0 },
6969 },
6970
6971 /* VEX_LEN_0F385E_X86_64_P_1_W_0_M_0 */
6972 {
6973 { "tdpbsud", {TMM, EXtmm, VexTmm }, 0 },
6974 },
6975
6976 /* VEX_LEN_0F385E_X86_64_P_2_W_0_M_0 */
6977 {
6978 { "tdpbusd", {TMM, EXtmm, VexTmm }, 0 },
6979 },
6980
6981 /* VEX_LEN_0F385E_X86_64_P_3_W_0_M_0 */
6982 {
6983 { "tdpbssd", {TMM, EXtmm, VexTmm }, 0 },
6984 },
6985
7531c613 6986 /* VEX_LEN_0F38DB */
a5ff0eb2 6987 {
7531c613 6988 { "vaesimc", { XM, EXx }, PREFIX_DATA },
a5ff0eb2
L
6989 },
6990
035e7389 6991 /* VEX_LEN_0F38F2 */
f12dc422 6992 {
035e7389 6993 { "andnS", { Gdq, VexGdq, Edq }, PREFIX_OPCODE },
f12dc422
L
6994 },
6995
14d10c6c 6996 /* VEX_LEN_0F38F3 */
6c30d220 6997 {
14d10c6c 6998 { REG_TABLE(REG_VEX_0F38F3_L_0) },
6c30d220
L
6999 },
7000
14d10c6c 7001 /* VEX_LEN_0F38F5 */
f12dc422 7002 {
14d10c6c 7003 { PREFIX_TABLE(PREFIX_VEX_0F38F5_L_0) },
f12dc422
L
7004 },
7005
14d10c6c 7006 /* VEX_LEN_0F38F6 */
6c30d220 7007 {
14d10c6c 7008 { PREFIX_TABLE(PREFIX_VEX_0F38F6_L_0) },
6c30d220
L
7009 },
7010
14d10c6c 7011 /* VEX_LEN_0F38F7 */
6c30d220 7012 {
14d10c6c 7013 { PREFIX_TABLE(PREFIX_VEX_0F38F7_L_0) },
6c30d220
L
7014 },
7015
7531c613 7016 /* VEX_LEN_0F3A00 */
6c30d220
L
7017 {
7018 { Bad_Opcode },
7531c613 7019 { VEX_W_TABLE (VEX_W_0F3A00_L_1) },
6c30d220
L
7020 },
7021
7531c613 7022 /* VEX_LEN_0F3A01 */
6c30d220
L
7023 {
7024 { Bad_Opcode },
7531c613 7025 { VEX_W_TABLE (VEX_W_0F3A01_L_1) },
6c30d220
L
7026 },
7027
7531c613 7028 /* VEX_LEN_0F3A06 */
c0f3af97 7029 {
592d1631 7030 { Bad_Opcode },
7531c613 7031 { VEX_W_TABLE (VEX_W_0F3A06_L_1) },
c0f3af97
L
7032 },
7033
7531c613 7034 /* VEX_LEN_0F3A14 */
c0f3af97 7035 {
7531c613 7036 { "vpextrb", { Edqb, XM, Ib }, PREFIX_DATA },
c0f3af97
L
7037 },
7038
7531c613 7039 /* VEX_LEN_0F3A15 */
c0f3af97 7040 {
7531c613 7041 { "vpextrw", { Edqw, XM, Ib }, PREFIX_DATA },
c0f3af97
L
7042 },
7043
7531c613 7044 /* VEX_LEN_0F3A16 */
c0f3af97 7045 {
7531c613 7046 { "vpextrK", { Edq, XM, Ib }, PREFIX_DATA },
c0f3af97
L
7047 },
7048
7531c613 7049 /* VEX_LEN_0F3A17 */
c0f3af97 7050 {
7531c613 7051 { "vextractps", { Edqd, XM, Ib }, PREFIX_DATA },
c0f3af97
L
7052 },
7053
7531c613 7054 /* VEX_LEN_0F3A18 */
c0f3af97 7055 {
592d1631 7056 { Bad_Opcode },
7531c613 7057 { VEX_W_TABLE (VEX_W_0F3A18_L_1) },
c0f3af97
L
7058 },
7059
7531c613 7060 /* VEX_LEN_0F3A19 */
c0f3af97 7061 {
592d1631 7062 { Bad_Opcode },
7531c613 7063 { VEX_W_TABLE (VEX_W_0F3A19_L_1) },
c0f3af97
L
7064 },
7065
7531c613 7066 /* VEX_LEN_0F3A20 */
c0f3af97 7067 {
7531c613 7068 { "vpinsrb", { XM, Vex, Edqb, Ib }, PREFIX_DATA },
c0f3af97
L
7069 },
7070
7531c613 7071 /* VEX_LEN_0F3A21 */
c0f3af97 7072 {
7531c613 7073 { "vinsertps", { XM, Vex, EXd, Ib }, PREFIX_DATA },
c0f3af97
L
7074 },
7075
7531c613 7076 /* VEX_LEN_0F3A22 */
c0f3af97 7077 {
7531c613 7078 { "vpinsrK", { XM, Vex, Edq, Ib }, PREFIX_DATA },
c0f3af97
L
7079 },
7080
7531c613 7081 /* VEX_LEN_0F3A30 */
43234a1e 7082 {
bb5b3501 7083 { MOD_TABLE (MOD_VEX_0F3A30_L_0) },
43234a1e
L
7084 },
7085
7531c613 7086 /* VEX_LEN_0F3A31 */
1ba585e8 7087 {
bb5b3501 7088 { MOD_TABLE (MOD_VEX_0F3A31_L_0) },
1ba585e8
IT
7089 },
7090
7531c613 7091 /* VEX_LEN_0F3A32 */
43234a1e 7092 {
bb5b3501 7093 { MOD_TABLE (MOD_VEX_0F3A32_L_0) },
43234a1e
L
7094 },
7095
7531c613 7096 /* VEX_LEN_0F3A33 */
1ba585e8 7097 {
bb5b3501 7098 { MOD_TABLE (MOD_VEX_0F3A33_L_0) },
1ba585e8
IT
7099 },
7100
7531c613 7101 /* VEX_LEN_0F3A38 */
c0f3af97 7102 {
6c30d220 7103 { Bad_Opcode },
7531c613 7104 { VEX_W_TABLE (VEX_W_0F3A38_L_1) },
c0f3af97
L
7105 },
7106
7531c613 7107 /* VEX_LEN_0F3A39 */
c0f3af97 7108 {
6c30d220 7109 { Bad_Opcode },
7531c613 7110 { VEX_W_TABLE (VEX_W_0F3A39_L_1) },
6c30d220
L
7111 },
7112
7531c613 7113 /* VEX_LEN_0F3A41 */
6c30d220 7114 {
7531c613 7115 { "vdppd", { XM, Vex, EXx, Ib }, PREFIX_DATA },
c0f3af97
L
7116 },
7117
7531c613 7118 /* VEX_LEN_0F3A46 */
c0f3af97 7119 {
6c30d220 7120 { Bad_Opcode },
7531c613 7121 { VEX_W_TABLE (VEX_W_0F3A46_L_1) },
c0f3af97
L
7122 },
7123
7531c613 7124 /* VEX_LEN_0F3A60 */
c0f3af97 7125 {
7531c613 7126 { "vpcmpestrm!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
c0f3af97
L
7127 },
7128
7531c613 7129 /* VEX_LEN_0F3A61 */
c0f3af97 7130 {
7531c613 7131 { "vpcmpestri!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
c0f3af97
L
7132 },
7133
7531c613 7134 /* VEX_LEN_0F3A62 */
c0f3af97 7135 {
7531c613 7136 { "vpcmpistrm", { XM, EXx, Ib }, PREFIX_DATA },
c0f3af97
L
7137 },
7138
7531c613 7139 /* VEX_LEN_0F3A63 */
c0f3af97 7140 {
7531c613 7141 { "vpcmpistri", { XM, EXx, Ib }, PREFIX_DATA },
c0f3af97
L
7142 },
7143
7531c613 7144 /* VEX_LEN_0F3ADF */
a5ff0eb2 7145 {
7531c613 7146 { "vaeskeygenassist", { XM, EXx, Ib }, PREFIX_DATA },
a5ff0eb2 7147 },
4c807e72 7148
14d10c6c 7149 /* VEX_LEN_0F3AF0 */
6c30d220 7150 {
14d10c6c 7151 { PREFIX_TABLE (PREFIX_VEX_0F3AF0_L_0) },
6c30d220
L
7152 },
7153
467bbef0
JB
7154 /* VEX_LEN_0FXOP_08_85 */
7155 {
7156 { VEX_W_TABLE (VEX_W_0FXOP_08_85_L_0) },
7157 },
7158
7159 /* VEX_LEN_0FXOP_08_86 */
7160 {
7161 { VEX_W_TABLE (VEX_W_0FXOP_08_86_L_0) },
7162 },
7163
7164 /* VEX_LEN_0FXOP_08_87 */
7165 {
7166 { VEX_W_TABLE (VEX_W_0FXOP_08_87_L_0) },
7167 },
7168
7169 /* VEX_LEN_0FXOP_08_8E */
7170 {
7171 { VEX_W_TABLE (VEX_W_0FXOP_08_8E_L_0) },
7172 },
7173
7174 /* VEX_LEN_0FXOP_08_8F */
7175 {
7176 { VEX_W_TABLE (VEX_W_0FXOP_08_8F_L_0) },
7177 },
7178
7179 /* VEX_LEN_0FXOP_08_95 */
7180 {
7181 { VEX_W_TABLE (VEX_W_0FXOP_08_95_L_0) },
7182 },
7183
7184 /* VEX_LEN_0FXOP_08_96 */
7185 {
7186 { VEX_W_TABLE (VEX_W_0FXOP_08_96_L_0) },
7187 },
7188
7189 /* VEX_LEN_0FXOP_08_97 */
7190 {
7191 { VEX_W_TABLE (VEX_W_0FXOP_08_97_L_0) },
7192 },
7193
7194 /* VEX_LEN_0FXOP_08_9E */
7195 {
7196 { VEX_W_TABLE (VEX_W_0FXOP_08_9E_L_0) },
7197 },
7198
7199 /* VEX_LEN_0FXOP_08_9F */
7200 {
7201 { VEX_W_TABLE (VEX_W_0FXOP_08_9F_L_0) },
7202 },
7203
7204 /* VEX_LEN_0FXOP_08_A3 */
7205 {
7206 { "vpperm", { XM, Vex, EXx, XMVexI4 }, 0 },
7207 },
7208
7209 /* VEX_LEN_0FXOP_08_A6 */
7210 {
7211 { VEX_W_TABLE (VEX_W_0FXOP_08_A6_L_0) },
7212 },
7213
7214 /* VEX_LEN_0FXOP_08_B6 */
7215 {
7216 { VEX_W_TABLE (VEX_W_0FXOP_08_B6_L_0) },
7217 },
7218
7219 /* VEX_LEN_0FXOP_08_C0 */
7220 {
7221 { VEX_W_TABLE (VEX_W_0FXOP_08_C0_L_0) },
7222 },
7223
7224 /* VEX_LEN_0FXOP_08_C1 */
7225 {
7226 { VEX_W_TABLE (VEX_W_0FXOP_08_C1_L_0) },
7227 },
7228
7229 /* VEX_LEN_0FXOP_08_C2 */
7230 {
7231 { VEX_W_TABLE (VEX_W_0FXOP_08_C2_L_0) },
7232 },
7233
7234 /* VEX_LEN_0FXOP_08_C3 */
7235 {
7236 { VEX_W_TABLE (VEX_W_0FXOP_08_C3_L_0) },
7237 },
7238
ff688e1f
L
7239 /* VEX_LEN_0FXOP_08_CC */
7240 {
467bbef0 7241 { VEX_W_TABLE (VEX_W_0FXOP_08_CC_L_0) },
ff688e1f
L
7242 },
7243
7244 /* VEX_LEN_0FXOP_08_CD */
7245 {
467bbef0 7246 { VEX_W_TABLE (VEX_W_0FXOP_08_CD_L_0) },
ff688e1f
L
7247 },
7248
7249 /* VEX_LEN_0FXOP_08_CE */
7250 {
467bbef0 7251 { VEX_W_TABLE (VEX_W_0FXOP_08_CE_L_0) },
ff688e1f
L
7252 },
7253
7254 /* VEX_LEN_0FXOP_08_CF */
7255 {
467bbef0 7256 { VEX_W_TABLE (VEX_W_0FXOP_08_CF_L_0) },
ff688e1f
L
7257 },
7258
7259 /* VEX_LEN_0FXOP_08_EC */
7260 {
467bbef0 7261 { VEX_W_TABLE (VEX_W_0FXOP_08_EC_L_0) },
ff688e1f
L
7262 },
7263
7264 /* VEX_LEN_0FXOP_08_ED */
7265 {
467bbef0 7266 { VEX_W_TABLE (VEX_W_0FXOP_08_ED_L_0) },
ff688e1f
L
7267 },
7268
7269 /* VEX_LEN_0FXOP_08_EE */
7270 {
467bbef0 7271 { VEX_W_TABLE (VEX_W_0FXOP_08_EE_L_0) },
ff688e1f
L
7272 },
7273
7274 /* VEX_LEN_0FXOP_08_EF */
7275 {
467bbef0
JB
7276 { VEX_W_TABLE (VEX_W_0FXOP_08_EF_L_0) },
7277 },
7278
7279 /* VEX_LEN_0FXOP_09_01 */
7280 {
32e31ad7 7281 { REG_TABLE (REG_XOP_09_01_L_0) },
467bbef0
JB
7282 },
7283
7284 /* VEX_LEN_0FXOP_09_02 */
7285 {
32e31ad7 7286 { REG_TABLE (REG_XOP_09_02_L_0) },
467bbef0
JB
7287 },
7288
7289 /* VEX_LEN_0FXOP_09_12_M_1 */
7290 {
32e31ad7 7291 { REG_TABLE (REG_XOP_09_12_M_1_L_0) },
ff688e1f
L
7292 },
7293
b5b098c2 7294 /* VEX_LEN_0FXOP_09_82_W_0 */
5dd85c99 7295 {
b5b098c2 7296 { "vfrczss", { XM, EXd }, 0 },
5dd85c99 7297 },
4c807e72 7298
b5b098c2 7299 /* VEX_LEN_0FXOP_09_83_W_0 */
5dd85c99 7300 {
b5b098c2 7301 { "vfrczsd", { XM, EXq }, 0 },
5dd85c99 7302 },
467bbef0
JB
7303
7304 /* VEX_LEN_0FXOP_09_90 */
7305 {
7306 { "vprotb", { XM, EXx, VexW }, 0 },
7307 },
7308
7309 /* VEX_LEN_0FXOP_09_91 */
7310 {
7311 { "vprotw", { XM, EXx, VexW }, 0 },
7312 },
7313
7314 /* VEX_LEN_0FXOP_09_92 */
7315 {
7316 { "vprotd", { XM, EXx, VexW }, 0 },
7317 },
7318
7319 /* VEX_LEN_0FXOP_09_93 */
7320 {
7321 { "vprotq", { XM, EXx, VexW }, 0 },
7322 },
7323
7324 /* VEX_LEN_0FXOP_09_94 */
7325 {
7326 { "vpshlb", { XM, EXx, VexW }, 0 },
7327 },
7328
7329 /* VEX_LEN_0FXOP_09_95 */
7330 {
7331 { "vpshlw", { XM, EXx, VexW }, 0 },
7332 },
7333
7334 /* VEX_LEN_0FXOP_09_96 */
7335 {
7336 { "vpshld", { XM, EXx, VexW }, 0 },
7337 },
7338
7339 /* VEX_LEN_0FXOP_09_97 */
7340 {
7341 { "vpshlq", { XM, EXx, VexW }, 0 },
7342 },
7343
7344 /* VEX_LEN_0FXOP_09_98 */
7345 {
7346 { "vpshab", { XM, EXx, VexW }, 0 },
7347 },
7348
7349 /* VEX_LEN_0FXOP_09_99 */
7350 {
7351 { "vpshaw", { XM, EXx, VexW }, 0 },
7352 },
7353
7354 /* VEX_LEN_0FXOP_09_9A */
7355 {
7356 { "vpshad", { XM, EXx, VexW }, 0 },
7357 },
7358
7359 /* VEX_LEN_0FXOP_09_9B */
7360 {
7361 { "vpshaq", { XM, EXx, VexW }, 0 },
7362 },
7363
7364 /* VEX_LEN_0FXOP_09_C1 */
7365 {
7366 { VEX_W_TABLE (VEX_W_0FXOP_09_C1_L_0) },
7367 },
7368
7369 /* VEX_LEN_0FXOP_09_C2 */
7370 {
7371 { VEX_W_TABLE (VEX_W_0FXOP_09_C2_L_0) },
7372 },
7373
7374 /* VEX_LEN_0FXOP_09_C3 */
7375 {
7376 { VEX_W_TABLE (VEX_W_0FXOP_09_C3_L_0) },
7377 },
7378
7379 /* VEX_LEN_0FXOP_09_C6 */
7380 {
7381 { VEX_W_TABLE (VEX_W_0FXOP_09_C6_L_0) },
7382 },
7383
7384 /* VEX_LEN_0FXOP_09_C7 */
7385 {
7386 { VEX_W_TABLE (VEX_W_0FXOP_09_C7_L_0) },
7387 },
7388
7389 /* VEX_LEN_0FXOP_09_CB */
7390 {
7391 { VEX_W_TABLE (VEX_W_0FXOP_09_CB_L_0) },
7392 },
7393
7394 /* VEX_LEN_0FXOP_09_D1 */
7395 {
7396 { VEX_W_TABLE (VEX_W_0FXOP_09_D1_L_0) },
7397 },
7398
7399 /* VEX_LEN_0FXOP_09_D2 */
7400 {
7401 { VEX_W_TABLE (VEX_W_0FXOP_09_D2_L_0) },
7402 },
7403
7404 /* VEX_LEN_0FXOP_09_D3 */
7405 {
7406 { VEX_W_TABLE (VEX_W_0FXOP_09_D3_L_0) },
7407 },
7408
7409 /* VEX_LEN_0FXOP_09_D6 */
7410 {
7411 { VEX_W_TABLE (VEX_W_0FXOP_09_D6_L_0) },
7412 },
7413
7414 /* VEX_LEN_0FXOP_09_D7 */
7415 {
7416 { VEX_W_TABLE (VEX_W_0FXOP_09_D7_L_0) },
7417 },
7418
7419 /* VEX_LEN_0FXOP_09_DB */
7420 {
7421 { VEX_W_TABLE (VEX_W_0FXOP_09_DB_L_0) },
7422 },
7423
7424 /* VEX_LEN_0FXOP_09_E1 */
7425 {
7426 { VEX_W_TABLE (VEX_W_0FXOP_09_E1_L_0) },
7427 },
7428
7429 /* VEX_LEN_0FXOP_09_E2 */
7430 {
7431 { VEX_W_TABLE (VEX_W_0FXOP_09_E2_L_0) },
7432 },
7433
7434 /* VEX_LEN_0FXOP_09_E3 */
7435 {
7436 { VEX_W_TABLE (VEX_W_0FXOP_09_E3_L_0) },
7437 },
7438
7439 /* VEX_LEN_0FXOP_0A_12 */
7440 {
32e31ad7 7441 { REG_TABLE (REG_XOP_0A_12_L_0) },
467bbef0 7442 },
331d2d0d
L
7443};
7444
ad692897 7445#include "i386-dis-evex-len.h"
04e2a182 7446
9e30b8e0 7447static const struct dis386 vex_w_table[][2] = {
43234a1e 7448 {
13954a31
JB
7449 /* VEX_W_0F41_L_1_M_1 */
7450 { PREFIX_TABLE (PREFIX_VEX_0F41_L_1_M_1_W_0) },
7451 { PREFIX_TABLE (PREFIX_VEX_0F41_L_1_M_1_W_1) },
1ba585e8
IT
7452 },
7453 {
13954a31
JB
7454 /* VEX_W_0F42_L_1_M_1 */
7455 { PREFIX_TABLE (PREFIX_VEX_0F42_L_1_M_1_W_0) },
7456 { PREFIX_TABLE (PREFIX_VEX_0F42_L_1_M_1_W_1) },
43234a1e
L
7457 },
7458 {
13954a31
JB
7459 /* VEX_W_0F44_L_0_M_1 */
7460 { PREFIX_TABLE (PREFIX_VEX_0F44_L_0_M_1_W_0) },
7461 { PREFIX_TABLE (PREFIX_VEX_0F44_L_0_M_1_W_1) },
1ba585e8
IT
7462 },
7463 {
13954a31
JB
7464 /* VEX_W_0F45_L_1_M_1 */
7465 { PREFIX_TABLE (PREFIX_VEX_0F45_L_1_M_1_W_0) },
7466 { PREFIX_TABLE (PREFIX_VEX_0F45_L_1_M_1_W_1) },
43234a1e
L
7467 },
7468 {
13954a31
JB
7469 /* VEX_W_0F46_L_1_M_1 */
7470 { PREFIX_TABLE (PREFIX_VEX_0F46_L_1_M_1_W_0) },
7471 { PREFIX_TABLE (PREFIX_VEX_0F46_L_1_M_1_W_1) },
9e30b8e0
L
7472 },
7473 {
13954a31
JB
7474 /* VEX_W_0F47_L_1_M_1 */
7475 { PREFIX_TABLE (PREFIX_VEX_0F47_L_1_M_1_W_0) },
7476 { PREFIX_TABLE (PREFIX_VEX_0F47_L_1_M_1_W_1) },
9e30b8e0
L
7477 },
7478 {
13954a31
JB
7479 /* VEX_W_0F4A_L_1_M_1 */
7480 { PREFIX_TABLE (PREFIX_VEX_0F4A_L_1_M_1_W_0) },
7481 { PREFIX_TABLE (PREFIX_VEX_0F4A_L_1_M_1_W_1) },
9e30b8e0
L
7482 },
7483 {
13954a31
JB
7484 /* VEX_W_0F4B_L_1_M_1 */
7485 { PREFIX_TABLE (PREFIX_VEX_0F4B_L_1_M_1_W_0) },
7486 { PREFIX_TABLE (PREFIX_VEX_0F4B_L_1_M_1_W_1) },
9e30b8e0
L
7487 },
7488 {
13954a31
JB
7489 /* VEX_W_0F90_L_0 */
7490 { PREFIX_TABLE (PREFIX_VEX_0F90_L_0_W_0) },
7491 { PREFIX_TABLE (PREFIX_VEX_0F90_L_0_W_1) },
9e30b8e0
L
7492 },
7493 {
13954a31
JB
7494 /* VEX_W_0F91_L_0_M_0 */
7495 { PREFIX_TABLE (PREFIX_VEX_0F91_L_0_M_0_W_0) },
7496 { PREFIX_TABLE (PREFIX_VEX_0F91_L_0_M_0_W_1) },
9e30b8e0
L
7497 },
7498 {
13954a31
JB
7499 /* VEX_W_0F92_L_0_M_1 */
7500 { PREFIX_TABLE (PREFIX_VEX_0F92_L_0_M_1_W_0) },
7501 { PREFIX_TABLE (PREFIX_VEX_0F92_L_0_M_1_W_1) },
9e30b8e0
L
7502 },
7503 {
13954a31
JB
7504 /* VEX_W_0F93_L_0_M_1 */
7505 { PREFIX_TABLE (PREFIX_VEX_0F93_L_0_M_1_W_0) },
7506 { PREFIX_TABLE (PREFIX_VEX_0F93_L_0_M_1_W_1) },
9e30b8e0
L
7507 },
7508 {
13954a31
JB
7509 /* VEX_W_0F98_L_0_M_1 */
7510 { PREFIX_TABLE (PREFIX_VEX_0F98_L_0_M_1_W_0) },
7511 { PREFIX_TABLE (PREFIX_VEX_0F98_L_0_M_1_W_1) },
9e30b8e0
L
7512 },
7513 {
13954a31
JB
7514 /* VEX_W_0F99_L_0_M_1 */
7515 { PREFIX_TABLE (PREFIX_VEX_0F99_L_0_M_1_W_0) },
7516 { PREFIX_TABLE (PREFIX_VEX_0F99_L_0_M_1_W_1) },
9e30b8e0 7517 },
9e30b8e0 7518 {
7531c613
JB
7519 /* VEX_W_0F380C */
7520 { "vpermilps", { XM, Vex, EXx }, PREFIX_DATA },
9e30b8e0
L
7521 },
7522 {
7531c613
JB
7523 /* VEX_W_0F380D */
7524 { "vpermilpd", { XM, Vex, EXx }, PREFIX_DATA },
9e30b8e0
L
7525 },
7526 {
7531c613
JB
7527 /* VEX_W_0F380E */
7528 { "vtestps", { XM, EXx }, PREFIX_DATA },
9e30b8e0
L
7529 },
7530 {
7531c613
JB
7531 /* VEX_W_0F380F */
7532 { "vtestpd", { XM, EXx }, PREFIX_DATA },
9e30b8e0 7533 },
6431c801 7534 {
7531c613
JB
7535 /* VEX_W_0F3813 */
7536 { "vcvtph2ps", { XM, EXxmmq }, PREFIX_DATA },
6431c801 7537 },
6c30d220 7538 {
7531c613
JB
7539 /* VEX_W_0F3816_L_1 */
7540 { "vpermps", { XM, Vex, EXx }, PREFIX_DATA },
6c30d220 7541 },
bcf2684f 7542 {
7531c613
JB
7543 /* VEX_W_0F3818 */
7544 { "vbroadcastss", { XM, EXxmm_md }, PREFIX_DATA },
bcf2684f 7545 },
9e30b8e0 7546 {
7531c613
JB
7547 /* VEX_W_0F3819_L_1 */
7548 { "vbroadcastsd", { XM, EXxmm_mq }, PREFIX_DATA },
9e30b8e0
L
7549 },
7550 {
7531c613
JB
7551 /* VEX_W_0F381A_M_0_L_1 */
7552 { "vbroadcastf128", { XM, Mxmm }, PREFIX_DATA },
9e30b8e0 7553 },
53aa04a0 7554 {
7531c613
JB
7555 /* VEX_W_0F382C_M_0 */
7556 { "vmaskmovps", { XM, Vex, Mx }, PREFIX_DATA },
53aa04a0
L
7557 },
7558 {
7531c613
JB
7559 /* VEX_W_0F382D_M_0 */
7560 { "vmaskmovpd", { XM, Vex, Mx }, PREFIX_DATA },
53aa04a0
L
7561 },
7562 {
7531c613
JB
7563 /* VEX_W_0F382E_M_0 */
7564 { "vmaskmovps", { Mx, Vex, XM }, PREFIX_DATA },
53aa04a0
L
7565 },
7566 {
7531c613
JB
7567 /* VEX_W_0F382F_M_0 */
7568 { "vmaskmovpd", { Mx, Vex, XM }, PREFIX_DATA },
53aa04a0 7569 },
6c30d220 7570 {
7531c613
JB
7571 /* VEX_W_0F3836 */
7572 { "vpermd", { XM, Vex, EXx }, PREFIX_DATA },
9e30b8e0 7573 },
6c30d220 7574 {
7531c613
JB
7575 /* VEX_W_0F3846 */
7576 { "vpsravd", { XM, Vex, EXx }, PREFIX_DATA },
6c30d220 7577 },
260cd341
LC
7578 {
7579 /* VEX_W_0F3849_X86_64_P_0 */
7580 { MOD_TABLE (MOD_VEX_0F3849_X86_64_P_0_W_0) },
7581 },
7582 {
7583 /* VEX_W_0F3849_X86_64_P_2 */
7584 { MOD_TABLE (MOD_VEX_0F3849_X86_64_P_2_W_0) },
7585 },
7586 {
7587 /* VEX_W_0F3849_X86_64_P_3 */
7588 { MOD_TABLE (MOD_VEX_0F3849_X86_64_P_3_W_0) },
7589 },
7590 {
7591 /* VEX_W_0F384B_X86_64_P_1 */
7592 { MOD_TABLE (MOD_VEX_0F384B_X86_64_P_1_W_0) },
7593 },
7594 {
7595 /* VEX_W_0F384B_X86_64_P_2 */
7596 { MOD_TABLE (MOD_VEX_0F384B_X86_64_P_2_W_0) },
7597 },
7598 {
7599 /* VEX_W_0F384B_X86_64_P_3 */
7600 { MOD_TABLE (MOD_VEX_0F384B_X86_64_P_3_W_0) },
7601 },
58bf9b6a
L
7602 {
7603 /* VEX_W_0F3850 */
7604 { "%XV vpdpbusd", { XM, Vex, EXx }, 0 },
7605 },
7606 {
7607 /* VEX_W_0F3851 */
7608 { "%XV vpdpbusds", { XM, Vex, EXx }, 0 },
7609 },
7610 {
7611 /* VEX_W_0F3852 */
7612 { "%XV vpdpwssd", { XM, Vex, EXx }, 0 },
7613 },
7614 {
7615 /* VEX_W_0F3853 */
7616 { "%XV vpdpwssds", { XM, Vex, EXx }, 0 },
7617 },
6c30d220 7618 {
7531c613
JB
7619 /* VEX_W_0F3858 */
7620 { "vpbroadcastd", { XM, EXxmm_md }, PREFIX_DATA },
6c30d220
L
7621 },
7622 {
7531c613
JB
7623 /* VEX_W_0F3859 */
7624 { "vpbroadcastq", { XM, EXxmm_mq }, PREFIX_DATA },
6c30d220
L
7625 },
7626 {
7531c613
JB
7627 /* VEX_W_0F385A_M_0_L_0 */
7628 { "vbroadcasti128", { XM, Mxmm }, PREFIX_DATA },
6c30d220 7629 },
260cd341
LC
7630 {
7631 /* VEX_W_0F385C_X86_64_P_1 */
7632 { MOD_TABLE (MOD_VEX_0F385C_X86_64_P_1_W_0) },
7633 },
7634 {
7635 /* VEX_W_0F385E_X86_64_P_0 */
7636 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_0_W_0) },
7637 },
7638 {
7639 /* VEX_W_0F385E_X86_64_P_1 */
7640 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_1_W_0) },
7641 },
7642 {
7643 /* VEX_W_0F385E_X86_64_P_2 */
7644 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_2_W_0) },
7645 },
7646 {
7647 /* VEX_W_0F385E_X86_64_P_3 */
7648 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_3_W_0) },
7649 },
6c30d220 7650 {
7531c613
JB
7651 /* VEX_W_0F3878 */
7652 { "vpbroadcastb", { XM, EXxmm_mb }, PREFIX_DATA },
6c30d220
L
7653 },
7654 {
7531c613
JB
7655 /* VEX_W_0F3879 */
7656 { "vpbroadcastw", { XM, EXxmm_mw }, PREFIX_DATA },
6c30d220 7657 },
48521003 7658 {
7531c613
JB
7659 /* VEX_W_0F38CF */
7660 { "vgf2p8mulb", { XM, Vex, EXx }, PREFIX_DATA },
48521003 7661 },
6c30d220 7662 {
7531c613 7663 /* VEX_W_0F3A00_L_1 */
6c30d220 7664 { Bad_Opcode },
7531c613 7665 { "vpermq", { XM, EXx, Ib }, PREFIX_DATA },
6c30d220
L
7666 },
7667 {
7531c613 7668 /* VEX_W_0F3A01_L_1 */
6c30d220 7669 { Bad_Opcode },
7531c613 7670 { "vpermpd", { XM, EXx, Ib }, PREFIX_DATA },
6c30d220
L
7671 },
7672 {
7531c613
JB
7673 /* VEX_W_0F3A02 */
7674 { "vpblendd", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6c30d220 7675 },
9e30b8e0 7676 {
7531c613
JB
7677 /* VEX_W_0F3A04 */
7678 { "vpermilps", { XM, EXx, Ib }, PREFIX_DATA },
9e30b8e0
L
7679 },
7680 {
7531c613
JB
7681 /* VEX_W_0F3A05 */
7682 { "vpermilpd", { XM, EXx, Ib }, PREFIX_DATA },
9e30b8e0
L
7683 },
7684 {
7531c613
JB
7685 /* VEX_W_0F3A06_L_1 */
7686 { "vperm2f128", { XM, Vex, EXx, Ib }, PREFIX_DATA },
9e30b8e0 7687 },
9e30b8e0 7688 {
7531c613
JB
7689 /* VEX_W_0F3A18_L_1 */
7690 { "vinsertf128", { XM, Vex, EXxmm, Ib }, PREFIX_DATA },
9e30b8e0
L
7691 },
7692 {
7531c613
JB
7693 /* VEX_W_0F3A19_L_1 */
7694 { "vextractf128", { EXxmm, XM, Ib }, PREFIX_DATA },
9e30b8e0 7695 },
6431c801 7696 {
7531c613
JB
7697 /* VEX_W_0F3A1D */
7698 { "vcvtps2ph", { EXxmmq, XM, EXxEVexS, Ib }, PREFIX_DATA },
6431c801 7699 },
6c30d220 7700 {
7531c613
JB
7701 /* VEX_W_0F3A38_L_1 */
7702 { "vinserti128", { XM, Vex, EXxmm, Ib }, PREFIX_DATA },
6c30d220
L
7703 },
7704 {
7531c613
JB
7705 /* VEX_W_0F3A39_L_1 */
7706 { "vextracti128", { EXxmm, XM, Ib }, PREFIX_DATA },
6c30d220 7707 },
6c30d220 7708 {
7531c613
JB
7709 /* VEX_W_0F3A46_L_1 */
7710 { "vperm2i128", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6c30d220 7711 },
9e30b8e0 7712 {
7531c613
JB
7713 /* VEX_W_0F3A4A */
7714 { "vblendvps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
9e30b8e0
L
7715 },
7716 {
7531c613
JB
7717 /* VEX_W_0F3A4B */
7718 { "vblendvpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
9e30b8e0
L
7719 },
7720 {
7531c613
JB
7721 /* VEX_W_0F3A4C */
7722 { "vpblendvb", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
9e30b8e0 7723 },
48521003 7724 {
7531c613 7725 /* VEX_W_0F3ACE */
48521003 7726 { Bad_Opcode },
7531c613 7727 { "vgf2p8affineqb", { XM, Vex, EXx, Ib }, PREFIX_DATA },
48521003
IT
7728 },
7729 {
7531c613 7730 /* VEX_W_0F3ACF */
48521003 7731 { Bad_Opcode },
7531c613 7732 { "vgf2p8affineinvqb", { XM, Vex, EXx, Ib }, PREFIX_DATA },
48521003 7733 },
467bbef0
JB
7734 /* VEX_W_0FXOP_08_85_L_0 */
7735 {
7736 { "vpmacssww", { XM, Vex, EXx, XMVexI4 }, 0 },
7737 },
7738 /* VEX_W_0FXOP_08_86_L_0 */
7739 {
7740 { "vpmacsswd", { XM, Vex, EXx, XMVexI4 }, 0 },
7741 },
7742 /* VEX_W_0FXOP_08_87_L_0 */
7743 {
7744 { "vpmacssdql", { XM, Vex, EXx, XMVexI4 }, 0 },
7745 },
7746 /* VEX_W_0FXOP_08_8E_L_0 */
7747 {
7748 { "vpmacssdd", { XM, Vex, EXx, XMVexI4 }, 0 },
7749 },
7750 /* VEX_W_0FXOP_08_8F_L_0 */
7751 {
7752 { "vpmacssdqh", { XM, Vex, EXx, XMVexI4 }, 0 },
7753 },
7754 /* VEX_W_0FXOP_08_95_L_0 */
7755 {
7756 { "vpmacsww", { XM, Vex, EXx, XMVexI4 }, 0 },
7757 },
7758 /* VEX_W_0FXOP_08_96_L_0 */
7759 {
7760 { "vpmacswd", { XM, Vex, EXx, XMVexI4 }, 0 },
7761 },
7762 /* VEX_W_0FXOP_08_97_L_0 */
7763 {
7764 { "vpmacsdql", { XM, Vex, EXx, XMVexI4 }, 0 },
7765 },
7766 /* VEX_W_0FXOP_08_9E_L_0 */
7767 {
7768 { "vpmacsdd", { XM, Vex, EXx, XMVexI4 }, 0 },
7769 },
7770 /* VEX_W_0FXOP_08_9F_L_0 */
7771 {
7772 { "vpmacsdqh", { XM, Vex, EXx, XMVexI4 }, 0 },
7773 },
7774 /* VEX_W_0FXOP_08_A6_L_0 */
7775 {
7776 { "vpmadcsswd", { XM, Vex, EXx, XMVexI4 }, 0 },
7777 },
7778 /* VEX_W_0FXOP_08_B6_L_0 */
7779 {
7780 { "vpmadcswd", { XM, Vex, EXx, XMVexI4 }, 0 },
7781 },
7782 /* VEX_W_0FXOP_08_C0_L_0 */
7783 {
7784 { "vprotb", { XM, EXx, Ib }, 0 },
7785 },
7786 /* VEX_W_0FXOP_08_C1_L_0 */
7787 {
7788 { "vprotw", { XM, EXx, Ib }, 0 },
7789 },
7790 /* VEX_W_0FXOP_08_C2_L_0 */
7791 {
7792 { "vprotd", { XM, EXx, Ib }, 0 },
7793 },
7794 /* VEX_W_0FXOP_08_C3_L_0 */
7795 {
7796 { "vprotq", { XM, EXx, Ib }, 0 },
7797 },
7798 /* VEX_W_0FXOP_08_CC_L_0 */
7799 {
89e65d17 7800 { "vpcomb", { XM, Vex, EXx, VPCOM }, 0 },
467bbef0
JB
7801 },
7802 /* VEX_W_0FXOP_08_CD_L_0 */
7803 {
89e65d17 7804 { "vpcomw", { XM, Vex, EXx, VPCOM }, 0 },
467bbef0
JB
7805 },
7806 /* VEX_W_0FXOP_08_CE_L_0 */
7807 {
89e65d17 7808 { "vpcomd", { XM, Vex, EXx, VPCOM }, 0 },
467bbef0
JB
7809 },
7810 /* VEX_W_0FXOP_08_CF_L_0 */
7811 {
89e65d17 7812 { "vpcomq", { XM, Vex, EXx, VPCOM }, 0 },
467bbef0
JB
7813 },
7814 /* VEX_W_0FXOP_08_EC_L_0 */
7815 {
89e65d17 7816 { "vpcomub", { XM, Vex, EXx, VPCOM }, 0 },
467bbef0
JB
7817 },
7818 /* VEX_W_0FXOP_08_ED_L_0 */
7819 {
89e65d17 7820 { "vpcomuw", { XM, Vex, EXx, VPCOM }, 0 },
467bbef0
JB
7821 },
7822 /* VEX_W_0FXOP_08_EE_L_0 */
7823 {
89e65d17 7824 { "vpcomud", { XM, Vex, EXx, VPCOM }, 0 },
467bbef0
JB
7825 },
7826 /* VEX_W_0FXOP_08_EF_L_0 */
7827 {
89e65d17 7828 { "vpcomuq", { XM, Vex, EXx, VPCOM }, 0 },
467bbef0 7829 },
b5b098c2
JB
7830 /* VEX_W_0FXOP_09_80 */
7831 {
7832 { "vfrczps", { XM, EXx }, 0 },
7833 },
7834 /* VEX_W_0FXOP_09_81 */
7835 {
7836 { "vfrczpd", { XM, EXx }, 0 },
7837 },
7838 /* VEX_W_0FXOP_09_82 */
7839 {
7840 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_82_W_0) },
7841 },
7842 /* VEX_W_0FXOP_09_83 */
7843 {
7844 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_83_W_0) },
7845 },
467bbef0
JB
7846 /* VEX_W_0FXOP_09_C1_L_0 */
7847 {
7848 { "vphaddbw", { XM, EXxmm }, 0 },
7849 },
7850 /* VEX_W_0FXOP_09_C2_L_0 */
7851 {
7852 { "vphaddbd", { XM, EXxmm }, 0 },
7853 },
7854 /* VEX_W_0FXOP_09_C3_L_0 */
7855 {
7856 { "vphaddbq", { XM, EXxmm }, 0 },
7857 },
7858 /* VEX_W_0FXOP_09_C6_L_0 */
7859 {
7860 { "vphaddwd", { XM, EXxmm }, 0 },
7861 },
7862 /* VEX_W_0FXOP_09_C7_L_0 */
7863 {
7864 { "vphaddwq", { XM, EXxmm }, 0 },
7865 },
7866 /* VEX_W_0FXOP_09_CB_L_0 */
7867 {
7868 { "vphadddq", { XM, EXxmm }, 0 },
7869 },
7870 /* VEX_W_0FXOP_09_D1_L_0 */
7871 {
7872 { "vphaddubw", { XM, EXxmm }, 0 },
7873 },
7874 /* VEX_W_0FXOP_09_D2_L_0 */
7875 {
7876 { "vphaddubd", { XM, EXxmm }, 0 },
7877 },
7878 /* VEX_W_0FXOP_09_D3_L_0 */
7879 {
7880 { "vphaddubq", { XM, EXxmm }, 0 },
7881 },
7882 /* VEX_W_0FXOP_09_D6_L_0 */
7883 {
7884 { "vphadduwd", { XM, EXxmm }, 0 },
7885 },
7886 /* VEX_W_0FXOP_09_D7_L_0 */
7887 {
7888 { "vphadduwq", { XM, EXxmm }, 0 },
7889 },
7890 /* VEX_W_0FXOP_09_DB_L_0 */
7891 {
7892 { "vphaddudq", { XM, EXxmm }, 0 },
7893 },
7894 /* VEX_W_0FXOP_09_E1_L_0 */
7895 {
7896 { "vphsubbw", { XM, EXxmm }, 0 },
7897 },
7898 /* VEX_W_0FXOP_09_E2_L_0 */
7899 {
7900 { "vphsubwd", { XM, EXxmm }, 0 },
7901 },
7902 /* VEX_W_0FXOP_09_E3_L_0 */
7903 {
7904 { "vphsubdq", { XM, EXxmm }, 0 },
7905 },
ad692897
L
7906
7907#include "i386-dis-evex-w.h"
9e30b8e0
L
7908};
7909
7910static const struct dis386 mod_table[][2] = {
32e31ad7
JB
7911 {
7912 /* MOD_62_32BIT */
7913 { "bound{S|}", { Gv, Ma }, 0 },
7914 { EVEX_TABLE (EVEX_0F) },
7915 },
9e30b8e0
L
7916 {
7917 /* MOD_8D */
bf890a93 7918 { "leaS", { Gv, M }, 0 },
9e30b8e0 7919 },
32e31ad7
JB
7920 {
7921 /* MOD_C4_32BIT */
7922 { "lesS", { Gv, Mp }, 0 },
7923 { VEX_C4_TABLE (VEX_0F) },
7924 },
7925 {
7926 /* MOD_C5_32BIT */
7927 { "ldsS", { Gv, Mp }, 0 },
7928 { VEX_C5_TABLE (VEX_0F) },
7929 },
42164a71
L
7930 {
7931 /* MOD_C6_REG_7 */
7932 { Bad_Opcode },
7933 { RM_TABLE (RM_C6_REG_7) },
7934 },
7935 {
7936 /* MOD_C7_REG_7 */
7937 { Bad_Opcode },
7938 { RM_TABLE (RM_C7_REG_7) },
7939 },
4a357820
MZ
7940 {
7941 /* MOD_FF_REG_3 */
8f570d62 7942 { "{l|}call^", { indirEp }, 0 },
4a357820
MZ
7943 },
7944 {
7945 /* MOD_FF_REG_5 */
8f570d62 7946 { "{l|}jmp^", { indirEp }, 0 },
4a357820 7947 },
9e30b8e0
L
7948 {
7949 /* MOD_0F01_REG_0 */
7950 { X86_64_TABLE (X86_64_0F01_REG_0) },
7951 { RM_TABLE (RM_0F01_REG_0) },
7952 },
7953 {
7954 /* MOD_0F01_REG_1 */
7955 { X86_64_TABLE (X86_64_0F01_REG_1) },
7956 { RM_TABLE (RM_0F01_REG_1) },
7957 },
7958 {
7959 /* MOD_0F01_REG_2 */
7960 { X86_64_TABLE (X86_64_0F01_REG_2) },
7961 { RM_TABLE (RM_0F01_REG_2) },
7962 },
7963 {
7964 /* MOD_0F01_REG_3 */
7965 { X86_64_TABLE (X86_64_0F01_REG_3) },
7966 { RM_TABLE (RM_0F01_REG_3) },
7967 },
8eab4136
L
7968 {
7969 /* MOD_0F01_REG_5 */
f8687e93
JB
7970 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_0) },
7971 { RM_TABLE (RM_0F01_REG_5_MOD_3) },
8eab4136 7972 },
9e30b8e0
L
7973 {
7974 /* MOD_0F01_REG_7 */
bf890a93 7975 { "invlpg", { Mb }, 0 },
f8687e93 7976 { RM_TABLE (RM_0F01_REG_7_MOD_3) },
9e30b8e0
L
7977 },
7978 {
7979 /* MOD_0F12_PREFIX_0 */
18897deb
JB
7980 { "movlpX", { XM, EXq }, 0 },
7981 { "movhlps", { XM, EXq }, 0 },
7982 },
7983 {
7984 /* MOD_0F12_PREFIX_2 */
7985 { "movlpX", { XM, EXq }, 0 },
9e30b8e0
L
7986 },
7987 {
7988 /* MOD_0F13 */
507bd325 7989 { "movlpX", { EXq, XM }, PREFIX_OPCODE },
9e30b8e0
L
7990 },
7991 {
7992 /* MOD_0F16_PREFIX_0 */
18897deb 7993 { "movhpX", { XM, EXq }, 0 },
bf890a93 7994 { "movlhps", { XM, EXq }, 0 },
9e30b8e0 7995 },
18897deb
JB
7996 {
7997 /* MOD_0F16_PREFIX_2 */
7998 { "movhpX", { XM, EXq }, 0 },
7999 },
9e30b8e0
L
8000 {
8001 /* MOD_0F17 */
507bd325 8002 { "movhpX", { EXq, XM }, PREFIX_OPCODE },
9e30b8e0
L
8003 },
8004 {
8005 /* MOD_0F18_REG_0 */
bf890a93 8006 { "prefetchnta", { Mb }, 0 },
31941983 8007 { "nopQ", { Ev }, 0 },
9e30b8e0
L
8008 },
8009 {
8010 /* MOD_0F18_REG_1 */
bf890a93 8011 { "prefetcht0", { Mb }, 0 },
31941983 8012 { "nopQ", { Ev }, 0 },
9e30b8e0
L
8013 },
8014 {
8015 /* MOD_0F18_REG_2 */
bf890a93 8016 { "prefetcht1", { Mb }, 0 },
31941983 8017 { "nopQ", { Ev }, 0 },
9e30b8e0
L
8018 },
8019 {
8020 /* MOD_0F18_REG_3 */
bf890a93 8021 { "prefetcht2", { Mb }, 0 },
31941983 8022 { "nopQ", { Ev }, 0 },
d7189fa5 8023 },
7e8b059b
L
8024 {
8025 /* MOD_0F1A_PREFIX_0 */
d276ec69 8026 { "bndldx", { Gbnd, Mv_bnd }, 0 },
bf890a93 8027 { "nopQ", { Ev }, 0 },
7e8b059b
L
8028 },
8029 {
8030 /* MOD_0F1B_PREFIX_0 */
d276ec69 8031 { "bndstx", { Mv_bnd, Gbnd }, 0 },
bf890a93 8032 { "nopQ", { Ev }, 0 },
7e8b059b
L
8033 },
8034 {
8035 /* MOD_0F1B_PREFIX_1 */
d276ec69 8036 { "bndmk", { Gbnd, Mv_bnd }, 0 },
31941983 8037 { "nopQ", { Ev }, PREFIX_IGNORED },
7e8b059b 8038 },
c48935d7
IT
8039 {
8040 /* MOD_0F1C_PREFIX_0 */
f8687e93 8041 { REG_TABLE (REG_0F1C_P_0_MOD_0) },
c48935d7
IT
8042 { "nopQ", { Ev }, 0 },
8043 },
603555e5
L
8044 {
8045 /* MOD_0F1E_PREFIX_1 */
31941983 8046 { "nopQ", { Ev }, PREFIX_IGNORED },
f8687e93 8047 { REG_TABLE (REG_0F1E_P_1_MOD_3) },
603555e5 8048 },
75c135a8
L
8049 {
8050 /* MOD_0F2B_PREFIX_0 */
507bd325 8051 {"movntps", { Mx, XM }, PREFIX_OPCODE },
75c135a8
L
8052 },
8053 {
8054 /* MOD_0F2B_PREFIX_1 */
507bd325 8055 {"movntss", { Md, XM }, PREFIX_OPCODE },
75c135a8
L
8056 },
8057 {
8058 /* MOD_0F2B_PREFIX_2 */
507bd325 8059 {"movntpd", { Mx, XM }, PREFIX_OPCODE },
75c135a8
L
8060 },
8061 {
8062 /* MOD_0F2B_PREFIX_3 */
507bd325 8063 {"movntsd", { Mq, XM }, PREFIX_OPCODE },
75c135a8
L
8064 },
8065 {
a5aaedb9 8066 /* MOD_0F50 */
592d1631 8067 { Bad_Opcode },
507bd325 8068 { "movmskpX", { Gdq, XS }, PREFIX_OPCODE },
75c135a8 8069 },
b844680a 8070 {
00ec1875 8071 /* MOD_0F71 */
592d1631 8072 { Bad_Opcode },
00ec1875 8073 { REG_TABLE (REG_0F71_MOD_0) },
b844680a
L
8074 },
8075 {
00ec1875 8076 /* MOD_0F72 */
592d1631 8077 { Bad_Opcode },
00ec1875 8078 { REG_TABLE (REG_0F72_MOD_0) },
b844680a
L
8079 },
8080 {
00ec1875 8081 /* MOD_0F73 */
592d1631 8082 { Bad_Opcode },
00ec1875 8083 { REG_TABLE (REG_0F73_MOD_0) },
c0f3af97
L
8084 },
8085 {
8086 /* MOD_0FAE_REG_0 */
bf890a93 8087 { "fxsave", { FXSAVE }, 0 },
f8687e93 8088 { PREFIX_TABLE (PREFIX_0FAE_REG_0_MOD_3) },
c0f3af97
L
8089 },
8090 {
8091 /* MOD_0FAE_REG_1 */
bf890a93 8092 { "fxrstor", { FXSAVE }, 0 },
f8687e93 8093 { PREFIX_TABLE (PREFIX_0FAE_REG_1_MOD_3) },
c0f3af97
L
8094 },
8095 {
8096 /* MOD_0FAE_REG_2 */
bf890a93 8097 { "ldmxcsr", { Md }, 0 },
f8687e93 8098 { PREFIX_TABLE (PREFIX_0FAE_REG_2_MOD_3) },
c0f3af97
L
8099 },
8100 {
8101 /* MOD_0FAE_REG_3 */
bf890a93 8102 { "stmxcsr", { Md }, 0 },
f8687e93 8103 { PREFIX_TABLE (PREFIX_0FAE_REG_3_MOD_3) },
c0f3af97
L
8104 },
8105 {
8106 /* MOD_0FAE_REG_4 */
f8687e93
JB
8107 { PREFIX_TABLE (PREFIX_0FAE_REG_4_MOD_0) },
8108 { PREFIX_TABLE (PREFIX_0FAE_REG_4_MOD_3) },
c0f3af97
L
8109 },
8110 {
8111 /* MOD_0FAE_REG_5 */
035e7389 8112 { "xrstor", { FXSAVE }, PREFIX_OPCODE },
f8687e93 8113 { PREFIX_TABLE (PREFIX_0FAE_REG_5_MOD_3) },
c0f3af97
L
8114 },
8115 {
8116 /* MOD_0FAE_REG_6 */
f8687e93
JB
8117 { PREFIX_TABLE (PREFIX_0FAE_REG_6_MOD_0) },
8118 { PREFIX_TABLE (PREFIX_0FAE_REG_6_MOD_3) },
c0f3af97
L
8119 },
8120 {
8121 /* MOD_0FAE_REG_7 */
f8687e93
JB
8122 { PREFIX_TABLE (PREFIX_0FAE_REG_7_MOD_0) },
8123 { RM_TABLE (RM_0FAE_REG_7_MOD_3) },
c0f3af97
L
8124 },
8125 {
8126 /* MOD_0FB2 */
bf890a93 8127 { "lssS", { Gv, Mp }, 0 },
c0f3af97
L
8128 },
8129 {
8130 /* MOD_0FB4 */
bf890a93 8131 { "lfsS", { Gv, Mp }, 0 },
c0f3af97
L
8132 },
8133 {
8134 /* MOD_0FB5 */
bf890a93 8135 { "lgsS", { Gv, Mp }, 0 },
c0f3af97 8136 },
a8484f96
L
8137 {
8138 /* MOD_0FC3 */
035e7389 8139 { "movntiS", { Edq, Gdq }, PREFIX_OPCODE },
a8484f96 8140 },
963f3586
IT
8141 {
8142 /* MOD_0FC7_REG_3 */
a8484f96 8143 { "xrstors", { FXSAVE }, 0 },
963f3586
IT
8144 },
8145 {
8146 /* MOD_0FC7_REG_4 */
bf890a93 8147 { "xsavec", { FXSAVE }, 0 },
963f3586
IT
8148 },
8149 {
8150 /* MOD_0FC7_REG_5 */
bf890a93 8151 { "xsaves", { FXSAVE }, 0 },
963f3586 8152 },
c0f3af97
L
8153 {
8154 /* MOD_0FC7_REG_6 */
f8687e93
JB
8155 { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_0) },
8156 { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_3) }
c0f3af97
L
8157 },
8158 {
8159 /* MOD_0FC7_REG_7 */
bf890a93 8160 { "vmptrst", { Mq }, 0 },
f8687e93 8161 { PREFIX_TABLE (PREFIX_0FC7_REG_7_MOD_3) }
c0f3af97
L
8162 },
8163 {
8164 /* MOD_0FD7 */
592d1631 8165 { Bad_Opcode },
bf890a93 8166 { "pmovmskb", { Gdq, MS }, 0 },
c0f3af97
L
8167 },
8168 {
8169 /* MOD_0FE7_PREFIX_2 */
bf890a93 8170 { "movntdq", { Mx, XM }, 0 },
c0f3af97
L
8171 },
8172 {
8173 /* MOD_0FF0_PREFIX_3 */
bf890a93 8174 { "lddqu", { XM, M }, 0 },
c0f3af97
L
8175 },
8176 {
7531c613
JB
8177 /* MOD_0F382A */
8178 { "movntdqa", { XM, Mx }, PREFIX_DATA },
c0f3af97 8179 },
c4694f17
TG
8180 {
8181 /* MOD_0F38DC_PREFIX_1 */
8182 { "aesenc128kl", { XM, M }, 0 },
8183 { "loadiwkey", { XM, EXx }, 0 },
8184 },
8185 {
8186 /* MOD_0F38DD_PREFIX_1 */
8187 { "aesdec128kl", { XM, M }, 0 },
8188 },
8189 {
8190 /* MOD_0F38DE_PREFIX_1 */
8191 { "aesenc256kl", { XM, M }, 0 },
8192 },
8193 {
8194 /* MOD_0F38DF_PREFIX_1 */
8195 { "aesdec256kl", { XM, M }, 0 },
8196 },
603555e5 8197 {
7531c613
JB
8198 /* MOD_0F38F5 */
8199 { "wrussK", { M, Gdq }, PREFIX_DATA },
603555e5
L
8200 },
8201 {
8202 /* MOD_0F38F6_PREFIX_0 */
8203 { "wrssK", { M, Gdq }, PREFIX_OPCODE },
8204 },
5d79adc4
L
8205 {
8206 /* MOD_0F38F8_PREFIX_1 */
8207 { "enqcmds", { Gva, M }, PREFIX_OPCODE },
8208 },
c0a30a9f
L
8209 {
8210 /* MOD_0F38F8_PREFIX_2 */
8211 { "movdir64b", { Gva, M }, PREFIX_OPCODE },
8212 },
5d79adc4
L
8213 {
8214 /* MOD_0F38F8_PREFIX_3 */
8215 { "enqcmd", { Gva, M }, PREFIX_OPCODE },
8216 },
c0a30a9f 8217 {
035e7389
JB
8218 /* MOD_0F38F9 */
8219 { "movdiri", { Edq, Gdq }, PREFIX_OPCODE },
c0a30a9f 8220 },
c4694f17
TG
8221 {
8222 /* MOD_0F38FA_PREFIX_1 */
8223 { Bad_Opcode },
8224 { "encodekey128", { Gd, Ed }, 0 },
8225 },
8226 {
8227 /* MOD_0F38FB_PREFIX_1 */
8228 { Bad_Opcode },
8229 { "encodekey256", { Gd, Ed }, 0 },
8230 },
c1fa250a
LC
8231 {
8232 /* MOD_0F3A0F_PREFIX_1 */
8233 { Bad_Opcode },
8234 { REG_TABLE (REG_0F3A0F_PREFIX_1_MOD_3) },
8235 },
c0f3af97 8236 {
592a252b
L
8237 /* MOD_VEX_0F12_PREFIX_0 */
8238 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_0) },
8239 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_1) },
c0f3af97 8240 },
18897deb
JB
8241 {
8242 /* MOD_VEX_0F12_PREFIX_2 */
8243 { VEX_LEN_TABLE (VEX_LEN_0F12_P_2_M_0) },
8244 },
c0f3af97 8245 {
592a252b
L
8246 /* MOD_VEX_0F13 */
8247 { VEX_LEN_TABLE (VEX_LEN_0F13_M_0) },
c0f3af97
L
8248 },
8249 {
592a252b
L
8250 /* MOD_VEX_0F16_PREFIX_0 */
8251 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_0) },
8252 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_1) },
c0f3af97 8253 },
18897deb
JB
8254 {
8255 /* MOD_VEX_0F16_PREFIX_2 */
8256 { VEX_LEN_TABLE (VEX_LEN_0F16_P_2_M_0) },
8257 },
c0f3af97 8258 {
592a252b
L
8259 /* MOD_VEX_0F17 */
8260 { VEX_LEN_TABLE (VEX_LEN_0F17_M_0) },
c0f3af97
L
8261 },
8262 {
592a252b 8263 /* MOD_VEX_0F2B */
bf926894 8264 { "vmovntpX", { Mx, XM }, PREFIX_OPCODE },
c0f3af97 8265 },
ab4e4ed5 8266 {
13954a31 8267 /* MOD_VEX_0F41_L_1 */
ab4e4ed5 8268 { Bad_Opcode },
13954a31 8269 { VEX_W_TABLE (VEX_W_0F41_L_1_M_1) },
ab4e4ed5
AF
8270 },
8271 {
13954a31 8272 /* MOD_VEX_0F42_L_1 */
ab4e4ed5 8273 { Bad_Opcode },
13954a31 8274 { VEX_W_TABLE (VEX_W_0F42_L_1_M_1) },
ab4e4ed5
AF
8275 },
8276 {
13954a31 8277 /* MOD_VEX_0F44_L_0 */
ab4e4ed5 8278 { Bad_Opcode },
13954a31 8279 { VEX_W_TABLE (VEX_W_0F44_L_0_M_1) },
ab4e4ed5
AF
8280 },
8281 {
13954a31 8282 /* MOD_VEX_0F45_L_1 */
ab4e4ed5 8283 { Bad_Opcode },
13954a31 8284 { VEX_W_TABLE (VEX_W_0F45_L_1_M_1) },
ab4e4ed5
AF
8285 },
8286 {
13954a31 8287 /* MOD_VEX_0F46_L_1 */
ab4e4ed5 8288 { Bad_Opcode },
13954a31 8289 { VEX_W_TABLE (VEX_W_0F46_L_1_M_1) },
ab4e4ed5
AF
8290 },
8291 {
13954a31 8292 /* MOD_VEX_0F47_L_1 */
ab4e4ed5 8293 { Bad_Opcode },
13954a31 8294 { VEX_W_TABLE (VEX_W_0F47_L_1_M_1) },
ab4e4ed5
AF
8295 },
8296 {
13954a31 8297 /* MOD_VEX_0F4A_L_1 */
ab4e4ed5 8298 { Bad_Opcode },
13954a31 8299 { VEX_W_TABLE (VEX_W_0F4A_L_1_M_1) },
ab4e4ed5
AF
8300 },
8301 {
13954a31 8302 /* MOD_VEX_0F4B_L_1 */
ab4e4ed5 8303 { Bad_Opcode },
13954a31 8304 { VEX_W_TABLE (VEX_W_0F4B_L_1_M_1) },
ab4e4ed5 8305 },
c0f3af97 8306 {
592a252b 8307 /* MOD_VEX_0F50 */
592d1631 8308 { Bad_Opcode },
bf926894 8309 { "vmovmskpX", { Gdq, XS }, PREFIX_OPCODE },
c0f3af97
L
8310 },
8311 {
14d10c6c 8312 /* MOD_VEX_0F71 */
592d1631 8313 { Bad_Opcode },
14d10c6c 8314 { REG_TABLE (REG_VEX_0F71_M_0) },
b844680a
L
8315 },
8316 {
14d10c6c 8317 /* MOD_VEX_0F72 */
592d1631 8318 { Bad_Opcode },
14d10c6c 8319 { REG_TABLE (REG_VEX_0F72_M_0) },
b844680a 8320 },
d8faab4e 8321 {
14d10c6c 8322 /* MOD_VEX_0F73 */
592d1631 8323 { Bad_Opcode },
14d10c6c 8324 { REG_TABLE (REG_VEX_0F73_M_0) },
876d4bfa 8325 },
ab4e4ed5 8326 {
13954a31
JB
8327 /* MOD_VEX_0F91_L_0 */
8328 { VEX_W_TABLE (VEX_W_0F91_L_0_M_0) },
ab4e4ed5
AF
8329 },
8330 {
13954a31 8331 /* MOD_VEX_0F92_L_0 */
ab4e4ed5 8332 { Bad_Opcode },
13954a31 8333 { VEX_W_TABLE (VEX_W_0F92_L_0_M_1) },
ab4e4ed5
AF
8334 },
8335 {
13954a31 8336 /* MOD_VEX_0F93_L_0 */
ab4e4ed5 8337 { Bad_Opcode },
13954a31 8338 { VEX_W_TABLE (VEX_W_0F93_L_0_M_1) },
ab4e4ed5
AF
8339 },
8340 {
13954a31 8341 /* MOD_VEX_0F98_L_0 */
ab4e4ed5 8342 { Bad_Opcode },
13954a31 8343 { VEX_W_TABLE (VEX_W_0F98_L_0_M_1) },
ab4e4ed5
AF
8344 },
8345 {
13954a31 8346 /* MOD_VEX_0F99_L_0 */
ab4e4ed5 8347 { Bad_Opcode },
13954a31 8348 { VEX_W_TABLE (VEX_W_0F99_L_0_M_1) },
ab4e4ed5 8349 },
876d4bfa 8350 {
592a252b
L
8351 /* MOD_VEX_0FAE_REG_2 */
8352 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_2_M_0) },
876d4bfa 8353 },
bbedc832 8354 {
592a252b
L
8355 /* MOD_VEX_0FAE_REG_3 */
8356 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_3_M_0) },
bbedc832 8357 },
144c41d9 8358 {
7531c613 8359 /* MOD_VEX_0FD7 */
592d1631 8360 { Bad_Opcode },
7531c613 8361 { "vpmovmskb", { Gdq, XS }, PREFIX_DATA },
144c41d9 8362 },
1afd85e3 8363 {
7531c613
JB
8364 /* MOD_VEX_0FE7 */
8365 { "vmovntdq", { Mx, XM }, PREFIX_DATA },
1afd85e3
L
8366 },
8367 {
592a252b 8368 /* MOD_VEX_0FF0_PREFIX_3 */
ec6f095a 8369 { "vlddqu", { XM, M }, 0 },
92fddf8e 8370 },
75c135a8 8371 {
7531c613
JB
8372 /* MOD_VEX_0F381A */
8373 { VEX_LEN_TABLE (VEX_LEN_0F381A_M_0) },
75c135a8 8374 },
1afd85e3 8375 {
7531c613
JB
8376 /* MOD_VEX_0F382A */
8377 { "vmovntdqa", { XM, Mx }, PREFIX_DATA },
1afd85e3 8378 },
75c135a8 8379 {
7531c613
JB
8380 /* MOD_VEX_0F382C */
8381 { VEX_W_TABLE (VEX_W_0F382C_M_0) },
75c135a8 8382 },
1afd85e3 8383 {
7531c613
JB
8384 /* MOD_VEX_0F382D */
8385 { VEX_W_TABLE (VEX_W_0F382D_M_0) },
1afd85e3
L
8386 },
8387 {
7531c613
JB
8388 /* MOD_VEX_0F382E */
8389 { VEX_W_TABLE (VEX_W_0F382E_M_0) },
1afd85e3
L
8390 },
8391 {
7531c613
JB
8392 /* MOD_VEX_0F382F */
8393 { VEX_W_TABLE (VEX_W_0F382F_M_0) },
1afd85e3 8394 },
09d73035
CL
8395 {
8396 /* MOD_VEX_0F3849_X86_64_P_0_W_0 */
8397 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_0_W_0_M_0) },
8398 { REG_TABLE (REG_VEX_0F3849_X86_64_P_0_W_0_M_1) },
8399 },
8400 {
8401 /* MOD_VEX_0F3849_X86_64_P_2_W_0 */
8402 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_2_W_0_M_0) },
8403 },
8404 {
8405 /* MOD_VEX_0F3849_X86_64_P_3_W_0 */
8406 { Bad_Opcode },
8407 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_3_W_0_M_0) },
8408 },
8409 {
8410 /* MOD_VEX_0F384B_X86_64_P_1_W_0 */
8411 { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64_P_1_W_0_M_0) },
8412 },
8413 {
8414 /* MOD_VEX_0F384B_X86_64_P_2_W_0 */
8415 { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64_P_2_W_0_M_0) },
8416 },
8417 {
8418 /* MOD_VEX_0F384B_X86_64_P_3_W_0 */
8419 { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64_P_3_W_0_M_0) },
8420 },
6c30d220 8421 {
7531c613
JB
8422 /* MOD_VEX_0F385A */
8423 { VEX_LEN_TABLE (VEX_LEN_0F385A_M_0) },
6c30d220 8424 },
09d73035
CL
8425 {
8426 /* MOD_VEX_0F385C_X86_64_P_1_W_0 */
8427 { Bad_Opcode },
8428 { VEX_LEN_TABLE (VEX_LEN_0F385C_X86_64_P_1_W_0_M_0) },
8429 },
8430 {
8431 /* MOD_VEX_0F385E_X86_64_P_0_W_0 */
8432 { Bad_Opcode },
8433 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_0_W_0_M_0) },
8434 },
8435 {
8436 /* MOD_VEX_0F385E_X86_64_P_1_W_0 */
8437 { Bad_Opcode },
8438 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_1_W_0_M_0) },
8439 },
8440 {
8441 /* MOD_VEX_0F385E_X86_64_P_2_W_0 */
8442 { Bad_Opcode },
8443 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_2_W_0_M_0) },
8444 },
8445 {
8446 /* MOD_VEX_0F385E_X86_64_P_3_W_0 */
8447 { Bad_Opcode },
8448 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_3_W_0_M_0) },
8449 },
6c30d220 8450 {
7531c613
JB
8451 /* MOD_VEX_0F388C */
8452 { "vpmaskmov%DQ", { XM, Vex, Mx }, PREFIX_DATA },
6c30d220
L
8453 },
8454 {
7531c613
JB
8455 /* MOD_VEX_0F388E */
8456 { "vpmaskmov%DQ", { Mx, Vex, XM }, PREFIX_DATA },
6c30d220 8457 },
ab4e4ed5 8458 {
bb5b3501 8459 /* MOD_VEX_0F3A30_L_0 */
ab4e4ed5 8460 { Bad_Opcode },
464d2b65 8461 { "kshiftr%BW", { MaskG, MaskE, Ib }, PREFIX_DATA },
ab4e4ed5
AF
8462 },
8463 {
bb5b3501 8464 /* MOD_VEX_0F3A31_L_0 */
ab4e4ed5 8465 { Bad_Opcode },
464d2b65 8466 { "kshiftr%DQ", { MaskG, MaskE, Ib }, PREFIX_DATA },
ab4e4ed5
AF
8467 },
8468 {
bb5b3501 8469 /* MOD_VEX_0F3A32_L_0 */
ab4e4ed5 8470 { Bad_Opcode },
464d2b65 8471 { "kshiftl%BW", { MaskG, MaskE, Ib }, PREFIX_DATA },
ab4e4ed5
AF
8472 },
8473 {
bb5b3501 8474 /* MOD_VEX_0F3A33_L_0 */
ab4e4ed5 8475 { Bad_Opcode },
464d2b65 8476 { "kshiftl%DQ", { MaskG, MaskE, Ib }, PREFIX_DATA },
ab4e4ed5 8477 },
467bbef0 8478 {
32e31ad7 8479 /* MOD_XOP_09_12 */
467bbef0
JB
8480 { Bad_Opcode },
8481 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_12_M_1) },
8482 },
ad692897
L
8483
8484#include "i386-dis-evex-mod.h"
b844680a
L
8485};
8486
1ceb70f8 8487static const struct dis386 rm_table[][8] = {
42164a71
L
8488 {
8489 /* RM_C6_REG_7 */
bf890a93 8490 { "xabort", { Skip_MODRM, Ib }, 0 },
42164a71
L
8491 },
8492 {
8493 /* RM_C7_REG_7 */
376cd056 8494 { "xbeginT", { Skip_MODRM, Jdqw }, 0 },
42164a71 8495 },
b844680a 8496 {
1ceb70f8 8497 /* RM_0F01_REG_0 */
a4e78aa5 8498 { "enclv", { Skip_MODRM }, 0 },
bf890a93
IT
8499 { "vmcall", { Skip_MODRM }, 0 },
8500 { "vmlaunch", { Skip_MODRM }, 0 },
8501 { "vmresume", { Skip_MODRM }, 0 },
8502 { "vmxoff", { Skip_MODRM }, 0 },
be3a8dca 8503 { "pconfig", { Skip_MODRM }, 0 },
b844680a
L
8504 },
8505 {
1ceb70f8 8506 /* RM_0F01_REG_1 */
bf890a93
IT
8507 { "monitor", { { OP_Monitor, 0 } }, 0 },
8508 { "mwait", { { OP_Mwait, 0 } }, 0 },
8509 { "clac", { Skip_MODRM }, 0 },
8510 { "stac", { Skip_MODRM }, 0 },
81d54bb7
CL
8511 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_4) },
8512 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_5) },
8513 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_6) },
8514 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_7) },
b844680a 8515 },
475a2301
L
8516 {
8517 /* RM_0F01_REG_2 */
bf890a93
IT
8518 { "xgetbv", { Skip_MODRM }, 0 },
8519 { "xsetbv", { Skip_MODRM }, 0 },
8729a6f6
L
8520 { Bad_Opcode },
8521 { Bad_Opcode },
bf890a93
IT
8522 { "vmfunc", { Skip_MODRM }, 0 },
8523 { "xend", { Skip_MODRM }, 0 },
8524 { "xtest", { Skip_MODRM }, 0 },
8525 { "enclu", { Skip_MODRM }, 0 },
475a2301 8526 },
b844680a 8527 {
1ceb70f8 8528 /* RM_0F01_REG_3 */
bf890a93 8529 { "vmrun", { Skip_MODRM }, 0 },
a847e322 8530 { PREFIX_TABLE (PREFIX_0F01_REG_3_RM_1) },
bf890a93
IT
8531 { "vmload", { Skip_MODRM }, 0 },
8532 { "vmsave", { Skip_MODRM }, 0 },
8533 { "stgi", { Skip_MODRM }, 0 },
8534 { "clgi", { Skip_MODRM }, 0 },
8535 { "skinit", { Skip_MODRM }, 0 },
8536 { "invlpga", { Skip_MODRM }, 0 },
4e7d34a6 8537 },
8eab4136 8538 {
f8687e93
JB
8539 /* RM_0F01_REG_5_MOD_3 */
8540 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_0) },
bb651e8b 8541 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_1) },
f8687e93 8542 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_2) },
8eab4136 8543 { Bad_Opcode },
f64c42a9
LC
8544 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_4) },
8545 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_5) },
8546 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_6) },
8547 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_7) },
8eab4136 8548 },
4e7d34a6 8549 {
f8687e93 8550 /* RM_0F01_REG_7_MOD_3 */
bf890a93
IT
8551 { "swapgs", { Skip_MODRM }, 0 },
8552 { "rdtscp", { Skip_MODRM }, 0 },
267b8516 8553 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_2) },
035e7389 8554 { "mwaitx", { { OP_Mwait, eBX_reg } }, PREFIX_OPCODE },
bf890a93 8555 { "clzero", { Skip_MODRM }, 0 },
142861df 8556 { "rdpru", { Skip_MODRM }, 0 },
646cc3e0
GG
8557 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_6) },
8558 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_7) },
b844680a 8559 },
603555e5 8560 {
f8687e93 8561 /* RM_0F1E_P_1_MOD_3_REG_7 */
31941983
JB
8562 { "nopQ", { Ev }, PREFIX_IGNORED },
8563 { "nopQ", { Ev }, PREFIX_IGNORED },
8564 { "endbr64", { Skip_MODRM }, 0 },
8565 { "endbr32", { Skip_MODRM }, 0 },
8566 { "nopQ", { Ev }, PREFIX_IGNORED },
8567 { "nopQ", { Ev }, PREFIX_IGNORED },
8568 { "nopQ", { Ev }, PREFIX_IGNORED },
8569 { "nopQ", { Ev }, PREFIX_IGNORED },
603555e5 8570 },
b844680a 8571 {
f8687e93 8572 /* RM_0FAE_REG_6_MOD_3 */
bf890a93 8573 { "mfence", { Skip_MODRM }, 0 },
b844680a 8574 },
bbedc832 8575 {
f8687e93 8576 /* RM_0FAE_REG_7_MOD_3 */
b5cefcca 8577 { "sfence", { Skip_MODRM }, 0 },
32e31ad7
JB
8578 },
8579 {
8580 /* RM_0F3A0F_P_1_MOD_3_REG_0 */
8581 { "hreset", { Skip_MODRM, Ib }, 0 },
144c41d9 8582 },
260cd341
LC
8583 {
8584 /* RM_VEX_0F3849_X86_64_P_0_W_0_M_1_R_0 */
8585 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_0_W_0_M_1_REG_0_RM_0) },
8586 },
b844680a
L
8587};
8588
c608c12e
AM
8589#define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
8590
f16cd0d5
L
8591/* We use the high bit to indicate different name for the same
8592 prefix. */
f16cd0d5 8593#define REP_PREFIX (0xf3 | 0x100)
42164a71
L
8594#define XACQUIRE_PREFIX (0xf2 | 0x200)
8595#define XRELEASE_PREFIX (0xf3 | 0x400)
7e8b059b 8596#define BND_PREFIX (0xf2 | 0x400)
04ef582a 8597#define NOTRACK_PREFIX (0x3e | 0x100)
f16cd0d5 8598
1d67fe3b
TT
8599/* Remember if the current op is a jump instruction. */
8600static bfd_boolean op_is_jump = FALSE;
8601
f16cd0d5 8602static int
26ca5450 8603ckprefix (void)
252b5132 8604{
f16cd0d5 8605 int newrex, i, length;
52b15da3 8606 rex = 0;
252b5132 8607 prefixes = 0;
7d421014 8608 used_prefixes = 0;
52b15da3 8609 rex_used = 0;
f16cd0d5
L
8610 last_lock_prefix = -1;
8611 last_repz_prefix = -1;
8612 last_repnz_prefix = -1;
8613 last_data_prefix = -1;
8614 last_addr_prefix = -1;
8615 last_rex_prefix = -1;
8616 last_seg_prefix = -1;
d9949a36 8617 fwait_prefix = -1;
285ca992 8618 active_seg_prefix = 0;
f310f33d
L
8619 for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
8620 all_prefixes[i] = 0;
8621 i = 0;
f16cd0d5
L
8622 length = 0;
8623 /* The maximum instruction length is 15bytes. */
8624 while (length < MAX_CODE_LENGTH - 1)
252b5132
RH
8625 {
8626 FETCH_DATA (the_info, codep + 1);
52b15da3 8627 newrex = 0;
252b5132
RH
8628 switch (*codep)
8629 {
52b15da3
JH
8630 /* REX prefixes family. */
8631 case 0x40:
8632 case 0x41:
8633 case 0x42:
8634 case 0x43:
8635 case 0x44:
8636 case 0x45:
8637 case 0x46:
8638 case 0x47:
8639 case 0x48:
8640 case 0x49:
8641 case 0x4a:
8642 case 0x4b:
8643 case 0x4c:
8644 case 0x4d:
8645 case 0x4e:
8646 case 0x4f:
f16cd0d5
L
8647 if (address_mode == mode_64bit)
8648 newrex = *codep;
8649 else
8650 return 1;
8651 last_rex_prefix = i;
52b15da3 8652 break;
252b5132
RH
8653 case 0xf3:
8654 prefixes |= PREFIX_REPZ;
f16cd0d5 8655 last_repz_prefix = i;
252b5132
RH
8656 break;
8657 case 0xf2:
8658 prefixes |= PREFIX_REPNZ;
f16cd0d5 8659 last_repnz_prefix = i;
252b5132
RH
8660 break;
8661 case 0xf0:
8662 prefixes |= PREFIX_LOCK;
f16cd0d5 8663 last_lock_prefix = i;
252b5132
RH
8664 break;
8665 case 0x2e:
8666 prefixes |= PREFIX_CS;
f16cd0d5 8667 last_seg_prefix = i;
0fa0fc85
BP
8668
8669 if (address_mode != mode_64bit)
8670 active_seg_prefix = PREFIX_CS;
8671
252b5132
RH
8672 break;
8673 case 0x36:
8674 prefixes |= PREFIX_SS;
f16cd0d5 8675 last_seg_prefix = i;
0fa0fc85
BP
8676
8677 if (address_mode != mode_64bit)
8678 active_seg_prefix = PREFIX_SS;
8679
252b5132
RH
8680 break;
8681 case 0x3e:
8682 prefixes |= PREFIX_DS;
f16cd0d5 8683 last_seg_prefix = i;
0fa0fc85
BP
8684
8685 if (address_mode != mode_64bit)
8686 active_seg_prefix = PREFIX_DS;
8687
252b5132
RH
8688 break;
8689 case 0x26:
8690 prefixes |= PREFIX_ES;
f16cd0d5 8691 last_seg_prefix = i;
0fa0fc85
BP
8692
8693 if (address_mode != mode_64bit)
8694 active_seg_prefix = PREFIX_ES;
8695
252b5132
RH
8696 break;
8697 case 0x64:
8698 prefixes |= PREFIX_FS;
f16cd0d5 8699 last_seg_prefix = i;
285ca992 8700 active_seg_prefix = PREFIX_FS;
252b5132
RH
8701 break;
8702 case 0x65:
8703 prefixes |= PREFIX_GS;
f16cd0d5 8704 last_seg_prefix = i;
285ca992 8705 active_seg_prefix = PREFIX_GS;
252b5132
RH
8706 break;
8707 case 0x66:
8708 prefixes |= PREFIX_DATA;
f16cd0d5 8709 last_data_prefix = i;
252b5132
RH
8710 break;
8711 case 0x67:
8712 prefixes |= PREFIX_ADDR;
f16cd0d5 8713 last_addr_prefix = i;
252b5132 8714 break;
5076851f 8715 case FWAIT_OPCODE:
252b5132
RH
8716 /* fwait is really an instruction. If there are prefixes
8717 before the fwait, they belong to the fwait, *not* to the
8718 following instruction. */
d9949a36 8719 fwait_prefix = i;
3e7d61b2 8720 if (prefixes || rex)
252b5132
RH
8721 {
8722 prefixes |= PREFIX_FWAIT;
8723 codep++;
6c067bbb
RM
8724 /* This ensures that the previous REX prefixes are noticed
8725 as unused prefixes, as in the return case below. */
8726 rex_used = rex;
f16cd0d5 8727 return 1;
252b5132
RH
8728 }
8729 prefixes = PREFIX_FWAIT;
8730 break;
8731 default:
f16cd0d5 8732 return 1;
252b5132 8733 }
52b15da3
JH
8734 /* Rex is ignored when followed by another prefix. */
8735 if (rex)
8736 {
3e7d61b2 8737 rex_used = rex;
f16cd0d5 8738 return 1;
52b15da3 8739 }
f16cd0d5 8740 if (*codep != FWAIT_OPCODE)
4e9ac44a 8741 all_prefixes[i++] = *codep;
52b15da3 8742 rex = newrex;
252b5132 8743 codep++;
f16cd0d5
L
8744 length++;
8745 }
8746 return 0;
8747}
8748
7d421014
ILT
8749/* Return the name of the prefix byte PREF, or NULL if PREF is not a
8750 prefix byte. */
8751
8752static const char *
26ca5450 8753prefix_name (int pref, int sizeflag)
7d421014 8754{
0003779b
L
8755 static const char *rexes [16] =
8756 {
8757 "rex", /* 0x40 */
8758 "rex.B", /* 0x41 */
8759 "rex.X", /* 0x42 */
8760 "rex.XB", /* 0x43 */
8761 "rex.R", /* 0x44 */
8762 "rex.RB", /* 0x45 */
8763 "rex.RX", /* 0x46 */
8764 "rex.RXB", /* 0x47 */
8765 "rex.W", /* 0x48 */
8766 "rex.WB", /* 0x49 */
8767 "rex.WX", /* 0x4a */
8768 "rex.WXB", /* 0x4b */
8769 "rex.WR", /* 0x4c */
8770 "rex.WRB", /* 0x4d */
8771 "rex.WRX", /* 0x4e */
8772 "rex.WRXB", /* 0x4f */
8773 };
8774
7d421014
ILT
8775 switch (pref)
8776 {
52b15da3
JH
8777 /* REX prefixes family. */
8778 case 0x40:
52b15da3 8779 case 0x41:
52b15da3 8780 case 0x42:
52b15da3 8781 case 0x43:
52b15da3 8782 case 0x44:
52b15da3 8783 case 0x45:
52b15da3 8784 case 0x46:
52b15da3 8785 case 0x47:
52b15da3 8786 case 0x48:
52b15da3 8787 case 0x49:
52b15da3 8788 case 0x4a:
52b15da3 8789 case 0x4b:
52b15da3 8790 case 0x4c:
52b15da3 8791 case 0x4d:
52b15da3 8792 case 0x4e:
52b15da3 8793 case 0x4f:
0003779b 8794 return rexes [pref - 0x40];
7d421014
ILT
8795 case 0xf3:
8796 return "repz";
8797 case 0xf2:
8798 return "repnz";
8799 case 0xf0:
8800 return "lock";
8801 case 0x2e:
8802 return "cs";
8803 case 0x36:
8804 return "ss";
8805 case 0x3e:
8806 return "ds";
8807 case 0x26:
8808 return "es";
8809 case 0x64:
8810 return "fs";
8811 case 0x65:
8812 return "gs";
8813 case 0x66:
8814 return (sizeflag & DFLAG) ? "data16" : "data32";
8815 case 0x67:
cb712a9e 8816 if (address_mode == mode_64bit)
db6eb5be 8817 return (sizeflag & AFLAG) ? "addr32" : "addr64";
c1a64871 8818 else
2888cb7a 8819 return (sizeflag & AFLAG) ? "addr16" : "addr32";
7d421014
ILT
8820 case FWAIT_OPCODE:
8821 return "fwait";
f16cd0d5
L
8822 case REP_PREFIX:
8823 return "rep";
42164a71
L
8824 case XACQUIRE_PREFIX:
8825 return "xacquire";
8826 case XRELEASE_PREFIX:
8827 return "xrelease";
7e8b059b
L
8828 case BND_PREFIX:
8829 return "bnd";
04ef582a
L
8830 case NOTRACK_PREFIX:
8831 return "notrack";
7d421014
ILT
8832 default:
8833 return NULL;
8834 }
8835}
8836
ce518a5f
L
8837static char op_out[MAX_OPERANDS][100];
8838static int op_ad, op_index[MAX_OPERANDS];
1d9f512f 8839static int two_source_ops;
ce518a5f
L
8840static bfd_vma op_address[MAX_OPERANDS];
8841static bfd_vma op_riprel[MAX_OPERANDS];
52b15da3 8842static bfd_vma start_pc;
ce518a5f 8843
252b5132
RH
8844/*
8845 * On the 386's of 1988, the maximum length of an instruction is 15 bytes.
8846 * (see topic "Redundant prefixes" in the "Differences from 8086"
8847 * section of the "Virtual 8086 Mode" chapter.)
8848 * 'pc' should be the address of this instruction, it will
8849 * be used to print the target address if this is a relative jump or call
8850 * The function returns the length of this instruction in bytes.
8851 */
8852
252b5132 8853static char intel_syntax;
9d141669 8854static char intel_mnemonic = !SYSV386_COMPAT;
252b5132
RH
8855static char open_char;
8856static char close_char;
8857static char separator_char;
8858static char scale_char;
8859
5db04b09
L
8860enum x86_64_isa
8861{
d835a58b 8862 amd64 = 1,
5db04b09
L
8863 intel64
8864};
8865
8866static enum x86_64_isa isa64;
8867
e396998b
AM
8868/* Here for backwards compatibility. When gdb stops using
8869 print_insn_i386_att and print_insn_i386_intel these functions can
8870 disappear, and print_insn_i386 be merged into print_insn. */
252b5132 8871int
26ca5450 8872print_insn_i386_att (bfd_vma pc, disassemble_info *info)
252b5132
RH
8873{
8874 intel_syntax = 0;
e396998b
AM
8875
8876 return print_insn (pc, info);
252b5132
RH
8877}
8878
8879int
26ca5450 8880print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
252b5132
RH
8881{
8882 intel_syntax = 1;
e396998b
AM
8883
8884 return print_insn (pc, info);
252b5132
RH
8885}
8886
e396998b 8887int
26ca5450 8888print_insn_i386 (bfd_vma pc, disassemble_info *info)
e396998b
AM
8889{
8890 intel_syntax = -1;
8891
8892 return print_insn (pc, info);
8893}
8894
f59a29b9
L
8895void
8896print_i386_disassembler_options (FILE *stream)
8897{
8898 fprintf (stream, _("\n\
8899The following i386/x86-64 specific disassembler options are supported for use\n\
8900with the -M switch (multiple options should be separated by commas):\n"));
8901
8902 fprintf (stream, _(" x86-64 Disassemble in 64bit mode\n"));
8903 fprintf (stream, _(" i386 Disassemble in 32bit mode\n"));
8904 fprintf (stream, _(" i8086 Disassemble in 16bit mode\n"));
8905 fprintf (stream, _(" att Display instruction in AT&T syntax\n"));
8906 fprintf (stream, _(" intel Display instruction in Intel syntax\n"));
9d141669
L
8907 fprintf (stream, _(" att-mnemonic\n"
8908 " Display instruction in AT&T mnemonic\n"));
8909 fprintf (stream, _(" intel-mnemonic\n"
8910 " Display instruction in Intel mnemonic\n"));
f59a29b9
L
8911 fprintf (stream, _(" addr64 Assume 64bit address size\n"));
8912 fprintf (stream, _(" addr32 Assume 32bit address size\n"));
8913 fprintf (stream, _(" addr16 Assume 16bit address size\n"));
8914 fprintf (stream, _(" data32 Assume 32bit data size\n"));
8915 fprintf (stream, _(" data16 Assume 16bit data size\n"));
8916 fprintf (stream, _(" suffix Always display instruction suffix in AT&T syntax\n"));
5db04b09
L
8917 fprintf (stream, _(" amd64 Display instruction in AMD64 ISA\n"));
8918 fprintf (stream, _(" intel64 Display instruction in Intel64 ISA\n"));
f59a29b9
L
8919}
8920
592d1631 8921/* Bad opcode. */
bf890a93 8922static const struct dis386 bad_opcode = { "(bad)", { XX }, 0 };
592d1631 8923
b844680a
L
8924/* Get a pointer to struct dis386 with a valid name. */
8925
8926static const struct dis386 *
8bb15339 8927get_valid_dis386 (const struct dis386 *dp, disassemble_info *info)
b844680a 8928{
91d6fa6a 8929 int vindex, vex_table_index;
b844680a
L
8930
8931 if (dp->name != NULL)
8932 return dp;
8933
8934 switch (dp->op[0].bytemode)
8935 {
1ceb70f8
L
8936 case USE_REG_TABLE:
8937 dp = &reg_table[dp->op[1].bytemode][modrm.reg];
8938 break;
8939
8940 case USE_MOD_TABLE:
91d6fa6a
NC
8941 vindex = modrm.mod == 0x3 ? 1 : 0;
8942 dp = &mod_table[dp->op[1].bytemode][vindex];
1ceb70f8
L
8943 break;
8944
8945 case USE_RM_TABLE:
8946 dp = &rm_table[dp->op[1].bytemode][modrm.rm];
b844680a
L
8947 break;
8948
4e7d34a6 8949 case USE_PREFIX_TABLE:
c0f3af97 8950 if (need_vex)
b844680a 8951 {
c0f3af97
L
8952 /* The prefix in VEX is implicit. */
8953 switch (vex.prefix)
8954 {
8955 case 0:
91d6fa6a 8956 vindex = 0;
c0f3af97
L
8957 break;
8958 case REPE_PREFIX_OPCODE:
91d6fa6a 8959 vindex = 1;
c0f3af97
L
8960 break;
8961 case DATA_PREFIX_OPCODE:
91d6fa6a 8962 vindex = 2;
c0f3af97
L
8963 break;
8964 case REPNE_PREFIX_OPCODE:
91d6fa6a 8965 vindex = 3;
c0f3af97
L
8966 break;
8967 default:
8968 abort ();
8969 break;
8970 }
b844680a 8971 }
7bb15c6f 8972 else
b844680a 8973 {
285ca992
L
8974 int last_prefix = -1;
8975 int prefix = 0;
91d6fa6a 8976 vindex = 0;
285ca992
L
8977 /* We check PREFIX_REPNZ and PREFIX_REPZ before PREFIX_DATA.
8978 When there are multiple PREFIX_REPNZ and PREFIX_REPZ, the
8979 last one wins. */
8980 if ((prefixes & (PREFIX_REPZ | PREFIX_REPNZ)) != 0)
b844680a 8981 {
285ca992 8982 if (last_repz_prefix > last_repnz_prefix)
c0f3af97 8983 {
285ca992
L
8984 vindex = 1;
8985 prefix = PREFIX_REPZ;
8986 last_prefix = last_repz_prefix;
c0f3af97
L
8987 }
8988 else
b844680a 8989 {
285ca992
L
8990 vindex = 3;
8991 prefix = PREFIX_REPNZ;
8992 last_prefix = last_repnz_prefix;
b844680a 8993 }
285ca992 8994
507bd325
L
8995 /* Check if prefix should be ignored. */
8996 if ((((prefix_table[dp->op[1].bytemode][vindex].prefix_requirement
8997 & PREFIX_IGNORED) >> PREFIX_IGNORED_SHIFT)
31941983
JB
8998 & prefix) != 0
8999 && !prefix_table[dp->op[1].bytemode][vindex].name)
285ca992
L
9000 vindex = 0;
9001 }
9002
9003 if (vindex == 0 && (prefixes & PREFIX_DATA) != 0)
9004 {
9005 vindex = 2;
9006 prefix = PREFIX_DATA;
9007 last_prefix = last_data_prefix;
9008 }
9009
9010 if (vindex != 0)
9011 {
9012 used_prefixes |= prefix;
9013 all_prefixes[last_prefix] = 0;
b844680a
L
9014 }
9015 }
91d6fa6a 9016 dp = &prefix_table[dp->op[1].bytemode][vindex];
b844680a
L
9017 break;
9018
4e7d34a6 9019 case USE_X86_64_TABLE:
91d6fa6a
NC
9020 vindex = address_mode == mode_64bit ? 1 : 0;
9021 dp = &x86_64_table[dp->op[1].bytemode][vindex];
b844680a
L
9022 break;
9023
4e7d34a6 9024 case USE_3BYTE_TABLE:
8bb15339 9025 FETCH_DATA (info, codep + 2);
91d6fa6a
NC
9026 vindex = *codep++;
9027 dp = &three_byte_table[dp->op[1].bytemode][vindex];
285ca992 9028 end_codep = codep;
8bb15339
L
9029 modrm.mod = (*codep >> 6) & 3;
9030 modrm.reg = (*codep >> 3) & 7;
9031 modrm.rm = *codep & 7;
9032 break;
9033
c0f3af97
L
9034 case USE_VEX_LEN_TABLE:
9035 if (!need_vex)
9036 abort ();
9037
9038 switch (vex.length)
9039 {
9040 case 128:
91d6fa6a 9041 vindex = 0;
c0f3af97 9042 break;
85ba7507
JB
9043 case 512:
9044 /* This allows re-using in particular table entries where only
9045 128-bit operand size (VEX.L=0 / EVEX.L'L=0) are valid. */
9046 if (vex.evex)
9047 {
c0f3af97 9048 case 256:
85ba7507
JB
9049 vindex = 1;
9050 break;
9051 }
9052 /* Fall through. */
c0f3af97
L
9053 default:
9054 abort ();
9055 break;
9056 }
9057
91d6fa6a 9058 dp = &vex_len_table[dp->op[1].bytemode][vindex];
c0f3af97
L
9059 break;
9060
04e2a182
L
9061 case USE_EVEX_LEN_TABLE:
9062 if (!vex.evex)
9063 abort ();
9064
9065 switch (vex.length)
9066 {
9067 case 128:
9068 vindex = 0;
9069 break;
9070 case 256:
9071 vindex = 1;
9072 break;
9073 case 512:
9074 vindex = 2;
9075 break;
9076 default:
9077 abort ();
9078 break;
9079 }
9080
9081 dp = &evex_len_table[dp->op[1].bytemode][vindex];
9082 break;
9083
f88c9eb0
SP
9084 case USE_XOP_8F_TABLE:
9085 FETCH_DATA (info, codep + 3);
f88c9eb0
SP
9086 rex = ~(*codep >> 5) & 0x7;
9087
9088 /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm". */
9089 switch ((*codep & 0x1f))
9090 {
9091 default:
f07af43e
L
9092 dp = &bad_opcode;
9093 return dp;
5dd85c99
SP
9094 case 0x8:
9095 vex_table_index = XOP_08;
9096 break;
f88c9eb0
SP
9097 case 0x9:
9098 vex_table_index = XOP_09;
9099 break;
9100 case 0xa:
9101 vex_table_index = XOP_0A;
9102 break;
9103 }
9104 codep++;
9105 vex.w = *codep & 0x80;
9106 if (vex.w && address_mode == mode_64bit)
9107 rex |= REX_W;
9108
9109 vex.register_specifier = (~(*codep >> 3)) & 0xf;
abfcb414 9110 if (address_mode != mode_64bit)
f07af43e 9111 {
abfcb414
AP
9112 /* In 16/32-bit mode REX_B is silently ignored. */
9113 rex &= ~REX_B;
f07af43e 9114 }
f88c9eb0
SP
9115
9116 vex.length = (*codep & 0x4) ? 256 : 128;
9117 switch ((*codep & 0x3))
9118 {
9119 case 0:
f88c9eb0
SP
9120 break;
9121 case 1:
9122 vex.prefix = DATA_PREFIX_OPCODE;
9123 break;
9124 case 2:
9125 vex.prefix = REPE_PREFIX_OPCODE;
9126 break;
9127 case 3:
9128 vex.prefix = REPNE_PREFIX_OPCODE;
9129 break;
9130 }
9131 need_vex = 1;
f88c9eb0 9132 codep++;
91d6fa6a
NC
9133 vindex = *codep++;
9134 dp = &xop_table[vex_table_index][vindex];
c48244a5 9135
285ca992 9136 end_codep = codep;
c48244a5
SP
9137 FETCH_DATA (info, codep + 1);
9138 modrm.mod = (*codep >> 6) & 3;
9139 modrm.reg = (*codep >> 3) & 7;
9140 modrm.rm = *codep & 7;
b5b098c2
JB
9141
9142 /* No XOP encoding so far allows for a non-zero embedded prefix. Avoid
9143 having to decode the bits for every otherwise valid encoding. */
9144 if (vex.prefix)
9145 return &bad_opcode;
f88c9eb0
SP
9146 break;
9147
c0f3af97 9148 case USE_VEX_C4_TABLE:
43234a1e 9149 /* VEX prefix. */
c0f3af97 9150 FETCH_DATA (info, codep + 3);
c0f3af97
L
9151 rex = ~(*codep >> 5) & 0x7;
9152 switch ((*codep & 0x1f))
9153 {
9154 default:
f07af43e
L
9155 dp = &bad_opcode;
9156 return dp;
c0f3af97 9157 case 0x1:
f88c9eb0 9158 vex_table_index = VEX_0F;
c0f3af97
L
9159 break;
9160 case 0x2:
f88c9eb0 9161 vex_table_index = VEX_0F38;
c0f3af97
L
9162 break;
9163 case 0x3:
f88c9eb0 9164 vex_table_index = VEX_0F3A;
c0f3af97
L
9165 break;
9166 }
9167 codep++;
9168 vex.w = *codep & 0x80;
9889cbb1 9169 if (address_mode == mode_64bit)
f07af43e 9170 {
9889cbb1
L
9171 if (vex.w)
9172 rex |= REX_W;
9889cbb1
L
9173 }
9174 else
9175 {
9176 /* For the 3-byte VEX prefix in 32-bit mode, the REX_B bit
9177 is ignored, other REX bits are 0 and the highest bit in
5f847646 9178 VEX.vvvv is also ignored (but we mustn't clear it here). */
9889cbb1 9179 rex = 0;
f07af43e 9180 }
5f847646 9181 vex.register_specifier = (~(*codep >> 3)) & 0xf;
c0f3af97
L
9182 vex.length = (*codep & 0x4) ? 256 : 128;
9183 switch ((*codep & 0x3))
9184 {
9185 case 0:
c0f3af97
L
9186 break;
9187 case 1:
9188 vex.prefix = DATA_PREFIX_OPCODE;
9189 break;
9190 case 2:
9191 vex.prefix = REPE_PREFIX_OPCODE;
9192 break;
9193 case 3:
9194 vex.prefix = REPNE_PREFIX_OPCODE;
9195 break;
9196 }
9197 need_vex = 1;
c0f3af97 9198 codep++;
91d6fa6a
NC
9199 vindex = *codep++;
9200 dp = &vex_table[vex_table_index][vindex];
285ca992 9201 end_codep = codep;
53c4d625
JB
9202 /* There is no MODRM byte for VEX0F 77. */
9203 if (vex_table_index != VEX_0F || vindex != 0x77)
c0f3af97
L
9204 {
9205 FETCH_DATA (info, codep + 1);
9206 modrm.mod = (*codep >> 6) & 3;
9207 modrm.reg = (*codep >> 3) & 7;
9208 modrm.rm = *codep & 7;
9209 }
9210 break;
9211
9212 case USE_VEX_C5_TABLE:
43234a1e 9213 /* VEX prefix. */
c0f3af97 9214 FETCH_DATA (info, codep + 2);
c0f3af97
L
9215 rex = (*codep & 0x80) ? 0 : REX_R;
9216
9889cbb1
L
9217 /* For the 2-byte VEX prefix in 32-bit mode, the highest bit in
9218 VEX.vvvv is 1. */
c0f3af97 9219 vex.register_specifier = (~(*codep >> 3)) & 0xf;
c0f3af97
L
9220 vex.length = (*codep & 0x4) ? 256 : 128;
9221 switch ((*codep & 0x3))
9222 {
9223 case 0:
c0f3af97
L
9224 break;
9225 case 1:
9226 vex.prefix = DATA_PREFIX_OPCODE;
9227 break;
9228 case 2:
9229 vex.prefix = REPE_PREFIX_OPCODE;
9230 break;
9231 case 3:
9232 vex.prefix = REPNE_PREFIX_OPCODE;
9233 break;
9234 }
9235 need_vex = 1;
c0f3af97 9236 codep++;
91d6fa6a
NC
9237 vindex = *codep++;
9238 dp = &vex_table[dp->op[1].bytemode][vindex];
285ca992 9239 end_codep = codep;
53c4d625
JB
9240 /* There is no MODRM byte for VEX 77. */
9241 if (vindex != 0x77)
c0f3af97
L
9242 {
9243 FETCH_DATA (info, codep + 1);
9244 modrm.mod = (*codep >> 6) & 3;
9245 modrm.reg = (*codep >> 3) & 7;
9246 modrm.rm = *codep & 7;
9247 }
9248 break;
9249
9e30b8e0
L
9250 case USE_VEX_W_TABLE:
9251 if (!need_vex)
9252 abort ();
9253
9254 dp = &vex_w_table[dp->op[1].bytemode][vex.w ? 1 : 0];
9255 break;
9256
43234a1e
L
9257 case USE_EVEX_TABLE:
9258 two_source_ops = 0;
9259 /* EVEX prefix. */
9260 vex.evex = 1;
9261 FETCH_DATA (info, codep + 4);
43234a1e
L
9262 /* The first byte after 0x62. */
9263 rex = ~(*codep >> 5) & 0x7;
9264 vex.r = *codep & 0x10;
9265 switch ((*codep & 0xf))
9266 {
9267 default:
9268 return &bad_opcode;
9269 case 0x1:
9270 vex_table_index = EVEX_0F;
9271 break;
9272 case 0x2:
9273 vex_table_index = EVEX_0F38;
9274 break;
9275 case 0x3:
9276 vex_table_index = EVEX_0F3A;
9277 break;
9278 }
9279
9280 /* The second byte after 0x62. */
9281 codep++;
9282 vex.w = *codep & 0x80;
9283 if (vex.w && address_mode == mode_64bit)
9284 rex |= REX_W;
9285
9286 vex.register_specifier = (~(*codep >> 3)) & 0xf;
43234a1e
L
9287
9288 /* The U bit. */
9289 if (!(*codep & 0x4))
9290 return &bad_opcode;
9291
9292 switch ((*codep & 0x3))
9293 {
9294 case 0:
43234a1e
L
9295 break;
9296 case 1:
9297 vex.prefix = DATA_PREFIX_OPCODE;
9298 break;
9299 case 2:
9300 vex.prefix = REPE_PREFIX_OPCODE;
9301 break;
9302 case 3:
9303 vex.prefix = REPNE_PREFIX_OPCODE;
9304 break;
9305 }
9306
9307 /* The third byte after 0x62. */
9308 codep++;
9309
9310 /* Remember the static rounding bits. */
9311 vex.ll = (*codep >> 5) & 3;
9312 vex.b = (*codep & 0x10) != 0;
9313
9314 vex.v = *codep & 0x8;
9315 vex.mask_register_specifier = *codep & 0x7;
9316 vex.zeroing = *codep & 0x80;
9317
5f847646
JB
9318 if (address_mode != mode_64bit)
9319 {
9320 /* In 16/32-bit mode silently ignore following bits. */
9321 rex &= ~REX_B;
9322 vex.r = 1;
9323 vex.v = 1;
9324 }
9325
43234a1e 9326 need_vex = 1;
43234a1e
L
9327 codep++;
9328 vindex = *codep++;
9329 dp = &evex_table[vex_table_index][vindex];
285ca992 9330 end_codep = codep;
43234a1e
L
9331 FETCH_DATA (info, codep + 1);
9332 modrm.mod = (*codep >> 6) & 3;
9333 modrm.reg = (*codep >> 3) & 7;
9334 modrm.rm = *codep & 7;
9335
9336 /* Set vector length. */
9337 if (modrm.mod == 3 && vex.b)
9338 vex.length = 512;
9339 else
9340 {
9341 switch (vex.ll)
9342 {
9343 case 0x0:
9344 vex.length = 128;
9345 break;
9346 case 0x1:
9347 vex.length = 256;
9348 break;
9349 case 0x2:
9350 vex.length = 512;
9351 break;
9352 default:
9353 return &bad_opcode;
9354 }
9355 }
9356 break;
9357
592d1631
L
9358 case 0:
9359 dp = &bad_opcode;
9360 break;
9361
b844680a 9362 default:
d34b5006 9363 abort ();
b844680a
L
9364 }
9365
9366 if (dp->name != NULL)
9367 return dp;
9368 else
8bb15339 9369 return get_valid_dis386 (dp, info);
b844680a
L
9370}
9371
dfc8cf43 9372static void
55cf16e1 9373get_sib (disassemble_info *info, int sizeflag)
dfc8cf43
L
9374{
9375 /* If modrm.mod == 3, operand must be register. */
9376 if (need_modrm
55cf16e1 9377 && ((sizeflag & AFLAG) || address_mode == mode_64bit)
dfc8cf43
L
9378 && modrm.mod != 3
9379 && modrm.rm == 4)
9380 {
9381 FETCH_DATA (info, codep + 2);
9382 sib.index = (codep [1] >> 3) & 7;
9383 sib.scale = (codep [1] >> 6) & 3;
9384 sib.base = codep [1] & 7;
9385 }
9386}
9387
e396998b 9388static int
26ca5450 9389print_insn (bfd_vma pc, disassemble_info *info)
252b5132 9390{
2da11e11 9391 const struct dis386 *dp;
252b5132 9392 int i;
ce518a5f 9393 char *op_txt[MAX_OPERANDS];
252b5132 9394 int needcomma;
df18fdba 9395 int sizeflag, orig_sizeflag;
e396998b 9396 const char *p;
252b5132 9397 struct dis_private priv;
f16cd0d5 9398 int prefix_length;
252b5132 9399
d7921315
L
9400 priv.orig_sizeflag = AFLAG | DFLAG;
9401 if ((info->mach & bfd_mach_i386_i386) != 0)
cb712a9e 9402 address_mode = mode_32bit;
2da11e11 9403 else if (info->mach == bfd_mach_i386_i8086)
d7921315
L
9404 {
9405 address_mode = mode_16bit;
9406 priv.orig_sizeflag = 0;
9407 }
2da11e11 9408 else
d7921315
L
9409 address_mode = mode_64bit;
9410
9411 if (intel_syntax == (char) -1)
9412 intel_syntax = (info->mach & bfd_mach_i386_intel_syntax) != 0;
e396998b
AM
9413
9414 for (p = info->disassembler_options; p != NULL; )
9415 {
5db04b09
L
9416 if (CONST_STRNEQ (p, "amd64"))
9417 isa64 = amd64;
9418 else if (CONST_STRNEQ (p, "intel64"))
9419 isa64 = intel64;
9420 else if (CONST_STRNEQ (p, "x86-64"))
e396998b 9421 {
cb712a9e 9422 address_mode = mode_64bit;
2a1bb84c 9423 priv.orig_sizeflag |= AFLAG | DFLAG;
e396998b 9424 }
0112cd26 9425 else if (CONST_STRNEQ (p, "i386"))
e396998b 9426 {
cb712a9e 9427 address_mode = mode_32bit;
2a1bb84c 9428 priv.orig_sizeflag |= AFLAG | DFLAG;
e396998b 9429 }
0112cd26 9430 else if (CONST_STRNEQ (p, "i8086"))
e396998b 9431 {
cb712a9e 9432 address_mode = mode_16bit;
2a1bb84c 9433 priv.orig_sizeflag &= ~(AFLAG | DFLAG);
e396998b 9434 }
0112cd26 9435 else if (CONST_STRNEQ (p, "intel"))
e396998b
AM
9436 {
9437 intel_syntax = 1;
9d141669
L
9438 if (CONST_STRNEQ (p + 5, "-mnemonic"))
9439 intel_mnemonic = 1;
e396998b 9440 }
0112cd26 9441 else if (CONST_STRNEQ (p, "att"))
e396998b
AM
9442 {
9443 intel_syntax = 0;
9d141669
L
9444 if (CONST_STRNEQ (p + 3, "-mnemonic"))
9445 intel_mnemonic = 0;
e396998b 9446 }
0112cd26 9447 else if (CONST_STRNEQ (p, "addr"))
e396998b 9448 {
f59a29b9
L
9449 if (address_mode == mode_64bit)
9450 {
9451 if (p[4] == '3' && p[5] == '2')
9452 priv.orig_sizeflag &= ~AFLAG;
9453 else if (p[4] == '6' && p[5] == '4')
9454 priv.orig_sizeflag |= AFLAG;
9455 }
9456 else
9457 {
9458 if (p[4] == '1' && p[5] == '6')
9459 priv.orig_sizeflag &= ~AFLAG;
9460 else if (p[4] == '3' && p[5] == '2')
9461 priv.orig_sizeflag |= AFLAG;
9462 }
e396998b 9463 }
0112cd26 9464 else if (CONST_STRNEQ (p, "data"))
e396998b
AM
9465 {
9466 if (p[4] == '1' && p[5] == '6')
9467 priv.orig_sizeflag &= ~DFLAG;
9468 else if (p[4] == '3' && p[5] == '2')
9469 priv.orig_sizeflag |= DFLAG;
9470 }
0112cd26 9471 else if (CONST_STRNEQ (p, "suffix"))
e396998b
AM
9472 priv.orig_sizeflag |= SUFFIX_ALWAYS;
9473
9474 p = strchr (p, ',');
9475 if (p != NULL)
9476 p++;
9477 }
9478
c0f92bf9
L
9479 if (address_mode == mode_64bit && sizeof (bfd_vma) < 8)
9480 {
9481 (*info->fprintf_func) (info->stream,
9482 _("64-bit address is disabled"));
9483 return -1;
9484 }
9485
e396998b
AM
9486 if (intel_syntax)
9487 {
9488 names64 = intel_names64;
9489 names32 = intel_names32;
9490 names16 = intel_names16;
9491 names8 = intel_names8;
9492 names8rex = intel_names8rex;
9493 names_seg = intel_names_seg;
b9733481 9494 names_mm = intel_names_mm;
7e8b059b 9495 names_bnd = intel_names_bnd;
b9733481
L
9496 names_xmm = intel_names_xmm;
9497 names_ymm = intel_names_ymm;
43234a1e 9498 names_zmm = intel_names_zmm;
260cd341 9499 names_tmm = intel_names_tmm;
db51cc60
L
9500 index64 = intel_index64;
9501 index32 = intel_index32;
43234a1e 9502 names_mask = intel_names_mask;
e396998b
AM
9503 index16 = intel_index16;
9504 open_char = '[';
9505 close_char = ']';
9506 separator_char = '+';
9507 scale_char = '*';
9508 }
9509 else
9510 {
9511 names64 = att_names64;
9512 names32 = att_names32;
9513 names16 = att_names16;
9514 names8 = att_names8;
9515 names8rex = att_names8rex;
9516 names_seg = att_names_seg;
b9733481 9517 names_mm = att_names_mm;
7e8b059b 9518 names_bnd = att_names_bnd;
b9733481
L
9519 names_xmm = att_names_xmm;
9520 names_ymm = att_names_ymm;
43234a1e 9521 names_zmm = att_names_zmm;
260cd341 9522 names_tmm = att_names_tmm;
db51cc60
L
9523 index64 = att_index64;
9524 index32 = att_index32;
43234a1e 9525 names_mask = att_names_mask;
e396998b
AM
9526 index16 = att_index16;
9527 open_char = '(';
9528 close_char = ')';
9529 separator_char = ',';
9530 scale_char = ',';
9531 }
2da11e11 9532
4fe53c98 9533 /* The output looks better if we put 7 bytes on a line, since that
8a9036a4
L
9534 puts most long word instructions on a single line. Use 8 bytes
9535 for Intel L1OM. */
d7921315 9536 if ((info->mach & bfd_mach_l1om) != 0)
8a9036a4
L
9537 info->bytes_per_line = 8;
9538 else
9539 info->bytes_per_line = 7;
252b5132 9540
26ca5450 9541 info->private_data = &priv;
252b5132
RH
9542 priv.max_fetched = priv.the_buffer;
9543 priv.insn_start = pc;
252b5132
RH
9544
9545 obuf[0] = 0;
ce518a5f
L
9546 for (i = 0; i < MAX_OPERANDS; ++i)
9547 {
9548 op_out[i][0] = 0;
9549 op_index[i] = -1;
9550 }
252b5132
RH
9551
9552 the_info = info;
9553 start_pc = pc;
e396998b
AM
9554 start_codep = priv.the_buffer;
9555 codep = priv.the_buffer;
252b5132 9556
8df14d78 9557 if (OPCODES_SIGSETJMP (priv.bailout) != 0)
5076851f 9558 {
7d421014
ILT
9559 const char *name;
9560
5076851f 9561 /* Getting here means we tried for data but didn't get it. That
e396998b
AM
9562 means we have an incomplete instruction of some sort. Just
9563 print the first byte as a prefix or a .byte pseudo-op. */
9564 if (codep > priv.the_buffer)
5076851f 9565 {
e396998b 9566 name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
7d421014
ILT
9567 if (name != NULL)
9568 (*info->fprintf_func) (info->stream, "%s", name);
9569 else
5076851f 9570 {
7d421014
ILT
9571 /* Just print the first byte as a .byte instruction. */
9572 (*info->fprintf_func) (info->stream, ".byte 0x%x",
e396998b 9573 (unsigned int) priv.the_buffer[0]);
5076851f 9574 }
5076851f 9575
7d421014 9576 return 1;
5076851f
ILT
9577 }
9578
9579 return -1;
9580 }
9581
52b15da3 9582 obufp = obuf;
f16cd0d5
L
9583 sizeflag = priv.orig_sizeflag;
9584
9585 if (!ckprefix () || rex_used)
9586 {
9587 /* Too many prefixes or unused REX prefixes. */
9588 for (i = 0;
f6dd4781 9589 i < (int) ARRAY_SIZE (all_prefixes) && all_prefixes[i];
f16cd0d5 9590 i++)
de882298 9591 (*info->fprintf_func) (info->stream, "%s%s",
6c067bbb 9592 i == 0 ? "" : " ",
f16cd0d5 9593 prefix_name (all_prefixes[i], sizeflag));
de882298 9594 return i;
f16cd0d5 9595 }
252b5132
RH
9596
9597 insn_codep = codep;
9598
9599 FETCH_DATA (info, codep + 1);
9600 two_source_ops = (*codep == 0x62) || (*codep == 0xc8);
9601
3e7d61b2 9602 if (((prefixes & PREFIX_FWAIT)
f16cd0d5 9603 && ((*codep < 0xd8) || (*codep > 0xdf))))
252b5132 9604 {
86a80a50 9605 /* Handle prefixes before fwait. */
d9949a36 9606 for (i = 0; i < fwait_prefix && all_prefixes[i];
86a80a50
L
9607 i++)
9608 (*info->fprintf_func) (info->stream, "%s ",
9609 prefix_name (all_prefixes[i], sizeflag));
f16cd0d5 9610 (*info->fprintf_func) (info->stream, "fwait");
86a80a50 9611 return i + 1;
252b5132
RH
9612 }
9613
252b5132
RH
9614 if (*codep == 0x0f)
9615 {
eec0f4ca 9616 unsigned char threebyte;
5f40e14d
JS
9617
9618 codep++;
9619 FETCH_DATA (info, codep + 1);
9620 threebyte = *codep;
eec0f4ca 9621 dp = &dis386_twobyte[threebyte];
0e9f3bf1 9622 need_modrm = twobyte_has_modrm[threebyte];
eec0f4ca 9623 codep++;
252b5132
RH
9624 }
9625 else
9626 {
6439fc28 9627 dp = &dis386[*codep];
252b5132 9628 need_modrm = onebyte_has_modrm[*codep];
eec0f4ca 9629 codep++;
252b5132 9630 }
246c51aa 9631
df18fdba
L
9632 /* Save sizeflag for printing the extra prefixes later before updating
9633 it for mnemonic and operand processing. The prefix names depend
9634 only on the address mode. */
9635 orig_sizeflag = sizeflag;
c608c12e 9636 if (prefixes & PREFIX_ADDR)
df18fdba 9637 sizeflag ^= AFLAG;
b844680a 9638 if ((prefixes & PREFIX_DATA))
df18fdba 9639 sizeflag ^= DFLAG;
3ffd33cf 9640
285ca992 9641 end_codep = codep;
8bb15339 9642 if (need_modrm)
252b5132
RH
9643 {
9644 FETCH_DATA (info, codep + 1);
7967e09e
L
9645 modrm.mod = (*codep >> 6) & 3;
9646 modrm.reg = (*codep >> 3) & 7;
9647 modrm.rm = *codep & 7;
252b5132 9648 }
0e9f3bf1
L
9649 else
9650 memset (&modrm, 0, sizeof (modrm));
252b5132 9651
42d5f9c6 9652 need_vex = 0;
caf0678c 9653 memset (&vex, 0, sizeof (vex));
55b126d4 9654
ce518a5f 9655 if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
252b5132 9656 {
55cf16e1 9657 get_sib (info, sizeflag);
252b5132
RH
9658 dofloat (sizeflag);
9659 }
9660 else
9661 {
8bb15339 9662 dp = get_valid_dis386 (dp, info);
b844680a 9663 if (dp != NULL && putop (dp->name, sizeflag) == 0)
6c067bbb 9664 {
55cf16e1 9665 get_sib (info, sizeflag);
ce518a5f
L
9666 for (i = 0; i < MAX_OPERANDS; ++i)
9667 {
246c51aa 9668 obufp = op_out[i];
ce518a5f
L
9669 op_ad = MAX_OPERANDS - 1 - i;
9670 if (dp->op[i].rtn)
9671 (*dp->op[i].rtn) (dp->op[i].bytemode, sizeflag);
43234a1e
L
9672 /* For EVEX instruction after the last operand masking
9673 should be printed. */
9674 if (i == 0 && vex.evex)
9675 {
9676 /* Don't print {%k0}. */
9677 if (vex.mask_register_specifier)
9678 {
9679 oappend ("{");
9680 oappend (names_mask[vex.mask_register_specifier]);
9681 oappend ("}");
9682 }
9683 if (vex.zeroing)
9684 oappend ("{z}");
9685 }
ce518a5f 9686 }
6439fc28 9687 }
252b5132
RH
9688 }
9689
1d67fe3b
TT
9690 /* Clear instruction information. */
9691 if (the_info)
9692 {
9693 the_info->insn_info_valid = 0;
9694 the_info->branch_delay_insns = 0;
9695 the_info->data_size = 0;
9696 the_info->insn_type = dis_noninsn;
9697 the_info->target = 0;
9698 the_info->target2 = 0;
9699 }
9700
9701 /* Reset jump operation indicator. */
9702 op_is_jump = FALSE;
9703
9704 {
9705 int jump_detection = 0;
9706
9707 /* Extract flags. */
9708 for (i = 0; i < MAX_OPERANDS; ++i)
9709 {
9710 if ((dp->op[i].rtn == OP_J)
9711 || (dp->op[i].rtn == OP_indirE))
9712 jump_detection |= 1;
9713 else if ((dp->op[i].rtn == BND_Fixup)
9714 || (!dp->op[i].rtn && !dp->op[i].bytemode))
9715 jump_detection |= 2;
9716 else if ((dp->op[i].bytemode == cond_jump_mode)
9717 || (dp->op[i].bytemode == loop_jcxz_mode))
9718 jump_detection |= 4;
9719 }
9720
9721 /* Determine if this is a jump or branch. */
9722 if ((jump_detection & 0x3) == 0x3)
9723 {
9724 op_is_jump = TRUE;
9725 if (jump_detection & 0x4)
9726 the_info->insn_type = dis_condbranch;
9727 else
9728 the_info->insn_type =
9729 (dp->name && !strncmp(dp->name, "call", 4))
9730 ? dis_jsr : dis_branch;
9731 }
9732 }
9733
63c6fc6c
L
9734 /* If VEX.vvvv and EVEX.vvvv are unused, they must be all 1s, which
9735 are all 0s in inverted form. */
9736 if (need_vex && vex.register_specifier != 0)
9737 {
9738 (*info->fprintf_func) (info->stream, "(bad)");
9739 return end_codep - priv.the_buffer;
9740 }
9741
7531c613
JB
9742 switch (dp->prefix_requirement)
9743 {
9744 case PREFIX_DATA:
9745 /* If only the data prefix is marked as mandatory, its absence renders
9746 the encoding invalid. Most other PREFIX_OPCODE rules still apply. */
9747 if (need_vex ? !vex.prefix : !(prefixes & PREFIX_DATA))
9748 {
9749 (*info->fprintf_func) (info->stream, "(bad)");
9750 return end_codep - priv.the_buffer;
9751 }
9752 used_prefixes |= PREFIX_DATA;
9753 /* Fall through. */
9754 case PREFIX_OPCODE:
9755 /* If the mandatory PREFIX_REPZ/PREFIX_REPNZ/PREFIX_DATA prefix is
9756 unused, opcode is invalid. Since the PREFIX_DATA prefix may be
9757 used by putop and MMX/SSE operand and may be overridden by the
9758 PREFIX_REPZ/PREFIX_REPNZ fix, we check the PREFIX_DATA prefix
9759 separately. */
9760 if (((need_vex
9761 ? vex.prefix == REPE_PREFIX_OPCODE
9762 || vex.prefix == REPNE_PREFIX_OPCODE
9763 : (prefixes
9764 & (PREFIX_REPZ | PREFIX_REPNZ)) != 0)
9765 && (used_prefixes
9766 & (PREFIX_REPZ | PREFIX_REPNZ)) == 0)
9767 || (((need_vex
9768 ? vex.prefix == DATA_PREFIX_OPCODE
9769 : ((prefixes
9770 & (PREFIX_REPZ | PREFIX_REPNZ | PREFIX_DATA))
9771 == PREFIX_DATA))
9772 && (used_prefixes & PREFIX_DATA) == 0))
9773 || (vex.evex && dp->prefix_requirement != PREFIX_DATA
9774 && !vex.w != !(used_prefixes & PREFIX_DATA)))
9775 {
9776 (*info->fprintf_func) (info->stream, "(bad)");
9777 return end_codep - priv.the_buffer;
9778 }
9779 break;
31941983
JB
9780
9781 case PREFIX_IGNORED:
9782 /* Zap data size and rep prefixes from used_prefixes and reinstate their
9783 origins in all_prefixes. */
9784 used_prefixes &= ~PREFIX_OPCODE;
9785 if (last_data_prefix >= 0)
9786 all_prefixes[last_repz_prefix] = 0x66;
9787 if (last_repz_prefix >= 0)
9788 all_prefixes[last_repz_prefix] = 0xf3;
9789 if (last_repnz_prefix >= 0)
9790 all_prefixes[last_repnz_prefix] = 0xf2;
9791 break;
7531c613
JB
9792 }
9793
d869730d 9794 /* Check if the REX prefix is used. */
73239888 9795 if ((rex ^ rex_used) == 0 && !need_vex && last_rex_prefix >= 0)
f16cd0d5
L
9796 all_prefixes[last_rex_prefix] = 0;
9797
5e6718e4 9798 /* Check if the SEG prefix is used. */
f16cd0d5
L
9799 if ((prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS | PREFIX_ES
9800 | PREFIX_FS | PREFIX_GS)) != 0
285ca992 9801 && (used_prefixes & active_seg_prefix) != 0)
f16cd0d5
L
9802 all_prefixes[last_seg_prefix] = 0;
9803
5e6718e4 9804 /* Check if the ADDR prefix is used. */
f16cd0d5
L
9805 if ((prefixes & PREFIX_ADDR) != 0
9806 && (used_prefixes & PREFIX_ADDR) != 0)
9807 all_prefixes[last_addr_prefix] = 0;
9808
df18fdba
L
9809 /* Check if the DATA prefix is used. */
9810 if ((prefixes & PREFIX_DATA) != 0
73239888
JB
9811 && (used_prefixes & PREFIX_DATA) != 0
9812 && !need_vex)
df18fdba 9813 all_prefixes[last_data_prefix] = 0;
f16cd0d5 9814
df18fdba 9815 /* Print the extra prefixes. */
f16cd0d5 9816 prefix_length = 0;
f310f33d 9817 for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
f16cd0d5
L
9818 if (all_prefixes[i])
9819 {
9820 const char *name;
df18fdba 9821 name = prefix_name (all_prefixes[i], orig_sizeflag);
f16cd0d5
L
9822 if (name == NULL)
9823 abort ();
9824 prefix_length += strlen (name) + 1;
9825 (*info->fprintf_func) (info->stream, "%s ", name);
9826 }
b844680a 9827
f16cd0d5
L
9828 /* Check maximum code length. */
9829 if ((codep - start_codep) > MAX_CODE_LENGTH)
9830 {
9831 (*info->fprintf_func) (info->stream, "(bad)");
9832 return MAX_CODE_LENGTH;
9833 }
b844680a 9834
ea397f5b 9835 obufp = mnemonicendp;
f16cd0d5 9836 for (i = strlen (obuf) + prefix_length; i < 6; i++)
252b5132
RH
9837 oappend (" ");
9838 oappend (" ");
9839 (*info->fprintf_func) (info->stream, "%s", obuf);
9840
9841 /* The enter and bound instructions are printed with operands in the same
9842 order as the intel book; everything else is printed in reverse order. */
2da11e11 9843 if (intel_syntax || two_source_ops)
252b5132 9844 {
185b1163
L
9845 bfd_vma riprel;
9846
ce518a5f 9847 for (i = 0; i < MAX_OPERANDS; ++i)
6c067bbb 9848 op_txt[i] = op_out[i];
246c51aa 9849
3a8547d2
JB
9850 if (intel_syntax && dp && dp->op[2].rtn == OP_Rounding
9851 && dp->op[3].rtn == OP_E && dp->op[4].rtn == NULL)
9852 {
9853 op_txt[2] = op_out[3];
9854 op_txt[3] = op_out[2];
9855 }
9856
ce518a5f
L
9857 for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
9858 {
6c067bbb
RM
9859 op_ad = op_index[i];
9860 op_index[i] = op_index[MAX_OPERANDS - 1 - i];
9861 op_index[MAX_OPERANDS - 1 - i] = op_ad;
185b1163
L
9862 riprel = op_riprel[i];
9863 op_riprel[i] = op_riprel [MAX_OPERANDS - 1 - i];
9864 op_riprel[MAX_OPERANDS - 1 - i] = riprel;
ce518a5f 9865 }
252b5132
RH
9866 }
9867 else
9868 {
ce518a5f 9869 for (i = 0; i < MAX_OPERANDS; ++i)
6c067bbb 9870 op_txt[MAX_OPERANDS - 1 - i] = op_out[i];
050dfa73
MM
9871 }
9872
ce518a5f
L
9873 needcomma = 0;
9874 for (i = 0; i < MAX_OPERANDS; ++i)
9875 if (*op_txt[i])
9876 {
9877 if (needcomma)
9878 (*info->fprintf_func) (info->stream, ",");
9879 if (op_index[i] != -1 && !op_riprel[i])
1d67fe3b
TT
9880 {
9881 bfd_vma target = (bfd_vma) op_address[op_index[i]];
9882
9883 if (the_info && op_is_jump)
9884 {
9885 the_info->insn_info_valid = 1;
9886 the_info->branch_delay_insns = 0;
9887 the_info->data_size = 0;
9888 the_info->target = target;
9889 the_info->target2 = 0;
9890 }
9891 (*info->print_address_func) (target, info);
9892 }
ce518a5f
L
9893 else
9894 (*info->fprintf_func) (info->stream, "%s", op_txt[i]);
9895 needcomma = 1;
9896 }
050dfa73 9897
ce518a5f 9898 for (i = 0; i < MAX_OPERANDS; i++)
52b15da3
JH
9899 if (op_index[i] != -1 && op_riprel[i])
9900 {
9901 (*info->fprintf_func) (info->stream, " # ");
4fd7268a 9902 (*info->print_address_func) ((bfd_vma) (start_pc + (codep - start_codep)
52b15da3 9903 + op_address[op_index[i]]), info);
185b1163 9904 break;
52b15da3 9905 }
e396998b 9906 return codep - priv.the_buffer;
252b5132
RH
9907}
9908
6439fc28 9909static const char *float_mem[] = {
252b5132 9910 /* d8 */
7c52e0e8
L
9911 "fadd{s|}",
9912 "fmul{s|}",
9913 "fcom{s|}",
9914 "fcomp{s|}",
9915 "fsub{s|}",
9916 "fsubr{s|}",
9917 "fdiv{s|}",
9918 "fdivr{s|}",
db6eb5be 9919 /* d9 */
7c52e0e8 9920 "fld{s|}",
252b5132 9921 "(bad)",
7c52e0e8
L
9922 "fst{s|}",
9923 "fstp{s|}",
d1c36125 9924 "fldenv{C|C}",
252b5132 9925 "fldcw",
d1c36125 9926 "fNstenv{C|C}",
252b5132
RH
9927 "fNstcw",
9928 /* da */
7c52e0e8
L
9929 "fiadd{l|}",
9930 "fimul{l|}",
9931 "ficom{l|}",
9932 "ficomp{l|}",
9933 "fisub{l|}",
9934 "fisubr{l|}",
9935 "fidiv{l|}",
9936 "fidivr{l|}",
252b5132 9937 /* db */
7c52e0e8
L
9938 "fild{l|}",
9939 "fisttp{l|}",
9940 "fist{l|}",
9941 "fistp{l|}",
252b5132 9942 "(bad)",
464dc4af 9943 "fld{t|}",
252b5132 9944 "(bad)",
464dc4af 9945 "fstp{t|}",
252b5132 9946 /* dc */
7c52e0e8
L
9947 "fadd{l|}",
9948 "fmul{l|}",
9949 "fcom{l|}",
9950 "fcomp{l|}",
9951 "fsub{l|}",
9952 "fsubr{l|}",
9953 "fdiv{l|}",
9954 "fdivr{l|}",
252b5132 9955 /* dd */
7c52e0e8
L
9956 "fld{l|}",
9957 "fisttp{ll|}",
9958 "fst{l||}",
9959 "fstp{l|}",
d1c36125 9960 "frstor{C|C}",
252b5132 9961 "(bad)",
d1c36125 9962 "fNsave{C|C}",
252b5132
RH
9963 "fNstsw",
9964 /* de */
ac465521
JB
9965 "fiadd{s|}",
9966 "fimul{s|}",
9967 "ficom{s|}",
9968 "ficomp{s|}",
9969 "fisub{s|}",
9970 "fisubr{s|}",
9971 "fidiv{s|}",
9972 "fidivr{s|}",
252b5132 9973 /* df */
ac465521
JB
9974 "fild{s|}",
9975 "fisttp{s|}",
9976 "fist{s|}",
9977 "fistp{s|}",
252b5132 9978 "fbld",
7c52e0e8 9979 "fild{ll|}",
252b5132 9980 "fbstp",
7c52e0e8 9981 "fistp{ll|}",
1d9f512f
AM
9982};
9983
9984static const unsigned char float_mem_mode[] = {
9985 /* d8 */
9986 d_mode,
9987 d_mode,
9988 d_mode,
9989 d_mode,
9990 d_mode,
9991 d_mode,
9992 d_mode,
9993 d_mode,
9994 /* d9 */
9995 d_mode,
9996 0,
9997 d_mode,
9998 d_mode,
9999 0,
10000 w_mode,
10001 0,
10002 w_mode,
10003 /* da */
10004 d_mode,
10005 d_mode,
10006 d_mode,
10007 d_mode,
10008 d_mode,
10009 d_mode,
10010 d_mode,
10011 d_mode,
10012 /* db */
10013 d_mode,
10014 d_mode,
10015 d_mode,
10016 d_mode,
10017 0,
9306ca4a 10018 t_mode,
1d9f512f 10019 0,
9306ca4a 10020 t_mode,
1d9f512f
AM
10021 /* dc */
10022 q_mode,
10023 q_mode,
10024 q_mode,
10025 q_mode,
10026 q_mode,
10027 q_mode,
10028 q_mode,
10029 q_mode,
10030 /* dd */
10031 q_mode,
10032 q_mode,
10033 q_mode,
10034 q_mode,
10035 0,
10036 0,
10037 0,
10038 w_mode,
10039 /* de */
10040 w_mode,
10041 w_mode,
10042 w_mode,
10043 w_mode,
10044 w_mode,
10045 w_mode,
10046 w_mode,
10047 w_mode,
10048 /* df */
10049 w_mode,
10050 w_mode,
10051 w_mode,
10052 w_mode,
9306ca4a 10053 t_mode,
1d9f512f 10054 q_mode,
9306ca4a 10055 t_mode,
1d9f512f 10056 q_mode
252b5132
RH
10057};
10058
ce518a5f
L
10059#define ST { OP_ST, 0 }
10060#define STi { OP_STi, 0 }
252b5132 10061
48c97fa1
L
10062#define FGRPd9_2 NULL, { { NULL, 1 } }, 0
10063#define FGRPd9_4 NULL, { { NULL, 2 } }, 0
10064#define FGRPd9_5 NULL, { { NULL, 3 } }, 0
10065#define FGRPd9_6 NULL, { { NULL, 4 } }, 0
10066#define FGRPd9_7 NULL, { { NULL, 5 } }, 0
10067#define FGRPda_5 NULL, { { NULL, 6 } }, 0
10068#define FGRPdb_4 NULL, { { NULL, 7 } }, 0
10069#define FGRPde_3 NULL, { { NULL, 8 } }, 0
10070#define FGRPdf_4 NULL, { { NULL, 9 } }, 0
252b5132 10071
2da11e11 10072static const struct dis386 float_reg[][8] = {
252b5132
RH
10073 /* d8 */
10074 {
bf890a93
IT
10075 { "fadd", { ST, STi }, 0 },
10076 { "fmul", { ST, STi }, 0 },
10077 { "fcom", { STi }, 0 },
10078 { "fcomp", { STi }, 0 },
10079 { "fsub", { ST, STi }, 0 },
10080 { "fsubr", { ST, STi }, 0 },
10081 { "fdiv", { ST, STi }, 0 },
10082 { "fdivr", { ST, STi }, 0 },
252b5132
RH
10083 },
10084 /* d9 */
10085 {
bf890a93
IT
10086 { "fld", { STi }, 0 },
10087 { "fxch", { STi }, 0 },
252b5132 10088 { FGRPd9_2 },
592d1631 10089 { Bad_Opcode },
252b5132
RH
10090 { FGRPd9_4 },
10091 { FGRPd9_5 },
10092 { FGRPd9_6 },
10093 { FGRPd9_7 },
10094 },
10095 /* da */
10096 {
bf890a93
IT
10097 { "fcmovb", { ST, STi }, 0 },
10098 { "fcmove", { ST, STi }, 0 },
10099 { "fcmovbe",{ ST, STi }, 0 },
10100 { "fcmovu", { ST, STi }, 0 },
592d1631 10101 { Bad_Opcode },
252b5132 10102 { FGRPda_5 },
592d1631
L
10103 { Bad_Opcode },
10104 { Bad_Opcode },
252b5132
RH
10105 },
10106 /* db */
10107 {
bf890a93
IT
10108 { "fcmovnb",{ ST, STi }, 0 },
10109 { "fcmovne",{ ST, STi }, 0 },
10110 { "fcmovnbe",{ ST, STi }, 0 },
10111 { "fcmovnu",{ ST, STi }, 0 },
252b5132 10112 { FGRPdb_4 },
bf890a93
IT
10113 { "fucomi", { ST, STi }, 0 },
10114 { "fcomi", { ST, STi }, 0 },
592d1631 10115 { Bad_Opcode },
252b5132
RH
10116 },
10117 /* dc */
10118 {
bf890a93
IT
10119 { "fadd", { STi, ST }, 0 },
10120 { "fmul", { STi, ST }, 0 },
592d1631
L
10121 { Bad_Opcode },
10122 { Bad_Opcode },
d53e6b98
JB
10123 { "fsub{!M|r}", { STi, ST }, 0 },
10124 { "fsub{M|}", { STi, ST }, 0 },
10125 { "fdiv{!M|r}", { STi, ST }, 0 },
10126 { "fdiv{M|}", { STi, ST }, 0 },
252b5132
RH
10127 },
10128 /* dd */
10129 {
bf890a93 10130 { "ffree", { STi }, 0 },
592d1631 10131 { Bad_Opcode },
bf890a93
IT
10132 { "fst", { STi }, 0 },
10133 { "fstp", { STi }, 0 },
10134 { "fucom", { STi }, 0 },
10135 { "fucomp", { STi }, 0 },
592d1631
L
10136 { Bad_Opcode },
10137 { Bad_Opcode },
252b5132
RH
10138 },
10139 /* de */
10140 {
bf890a93
IT
10141 { "faddp", { STi, ST }, 0 },
10142 { "fmulp", { STi, ST }, 0 },
592d1631 10143 { Bad_Opcode },
252b5132 10144 { FGRPde_3 },
d53e6b98
JB
10145 { "fsub{!M|r}p", { STi, ST }, 0 },
10146 { "fsub{M|}p", { STi, ST }, 0 },
10147 { "fdiv{!M|r}p", { STi, ST }, 0 },
10148 { "fdiv{M|}p", { STi, ST }, 0 },
252b5132
RH
10149 },
10150 /* df */
10151 {
bf890a93 10152 { "ffreep", { STi }, 0 },
592d1631
L
10153 { Bad_Opcode },
10154 { Bad_Opcode },
10155 { Bad_Opcode },
252b5132 10156 { FGRPdf_4 },
bf890a93
IT
10157 { "fucomip", { ST, STi }, 0 },
10158 { "fcomip", { ST, STi }, 0 },
592d1631 10159 { Bad_Opcode },
252b5132
RH
10160 },
10161};
10162
252b5132 10163static char *fgrps[][8] = {
48c97fa1
L
10164 /* Bad opcode 0 */
10165 {
10166 "(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10167 },
10168
10169 /* d9_2 1 */
252b5132
RH
10170 {
10171 "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10172 },
10173
48c97fa1 10174 /* d9_4 2 */
252b5132
RH
10175 {
10176 "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
10177 },
10178
48c97fa1 10179 /* d9_5 3 */
252b5132
RH
10180 {
10181 "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
10182 },
10183
48c97fa1 10184 /* d9_6 4 */
252b5132
RH
10185 {
10186 "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
10187 },
10188
48c97fa1 10189 /* d9_7 5 */
252b5132
RH
10190 {
10191 "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
10192 },
10193
48c97fa1 10194 /* da_5 6 */
252b5132
RH
10195 {
10196 "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10197 },
10198
48c97fa1 10199 /* db_4 7 */
252b5132 10200 {
309d3373
JB
10201 "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
10202 "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
252b5132
RH
10203 },
10204
48c97fa1 10205 /* de_3 8 */
252b5132
RH
10206 {
10207 "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10208 },
10209
48c97fa1 10210 /* df_4 9 */
252b5132
RH
10211 {
10212 "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10213 },
10214};
10215
b6169b20
L
10216static void
10217swap_operand (void)
10218{
10219 mnemonicendp[0] = '.';
10220 mnemonicendp[1] = 's';
10221 mnemonicendp += 2;
10222}
10223
b844680a
L
10224static void
10225OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED,
10226 int sizeflag ATTRIBUTE_UNUSED)
10227{
10228 /* Skip mod/rm byte. */
10229 MODRM_CHECK;
10230 codep++;
10231}
10232
252b5132 10233static void
26ca5450 10234dofloat (int sizeflag)
252b5132 10235{
2da11e11 10236 const struct dis386 *dp;
252b5132
RH
10237 unsigned char floatop;
10238
10239 floatop = codep[-1];
10240
7967e09e 10241 if (modrm.mod != 3)
252b5132 10242 {
7967e09e 10243 int fp_indx = (floatop - 0xd8) * 8 + modrm.reg;
1d9f512f
AM
10244
10245 putop (float_mem[fp_indx], sizeflag);
ce518a5f 10246 obufp = op_out[0];
6e50d963 10247 op_ad = 2;
1d9f512f 10248 OP_E (float_mem_mode[fp_indx], sizeflag);
252b5132
RH
10249 return;
10250 }
6608db57 10251 /* Skip mod/rm byte. */
4bba6815 10252 MODRM_CHECK;
252b5132
RH
10253 codep++;
10254
7967e09e 10255 dp = &float_reg[floatop - 0xd8][modrm.reg];
252b5132
RH
10256 if (dp->name == NULL)
10257 {
7967e09e 10258 putop (fgrps[dp->op[0].bytemode][modrm.rm], sizeflag);
252b5132 10259
6608db57 10260 /* Instruction fnstsw is only one with strange arg. */
252b5132 10261 if (floatop == 0xdf && codep[-1] == 0xe0)
ce518a5f 10262 strcpy (op_out[0], names16[0]);
252b5132
RH
10263 }
10264 else
10265 {
10266 putop (dp->name, sizeflag);
10267
ce518a5f 10268 obufp = op_out[0];
6e50d963 10269 op_ad = 2;
ce518a5f
L
10270 if (dp->op[0].rtn)
10271 (*dp->op[0].rtn) (dp->op[0].bytemode, sizeflag);
6e50d963 10272
ce518a5f 10273 obufp = op_out[1];
6e50d963 10274 op_ad = 1;
ce518a5f
L
10275 if (dp->op[1].rtn)
10276 (*dp->op[1].rtn) (dp->op[1].bytemode, sizeflag);
252b5132
RH
10277 }
10278}
10279
9ce09ba2
RM
10280/* Like oappend (below), but S is a string starting with '%'.
10281 In Intel syntax, the '%' is elided. */
10282static void
10283oappend_maybe_intel (const char *s)
10284{
10285 oappend (s + intel_syntax);
10286}
10287
252b5132 10288static void
26ca5450 10289OP_ST (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 10290{
9ce09ba2 10291 oappend_maybe_intel ("%st");
252b5132
RH
10292}
10293
252b5132 10294static void
26ca5450 10295OP_STi (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 10296{
7967e09e 10297 sprintf (scratchbuf, "%%st(%d)", modrm.rm);
9ce09ba2 10298 oappend_maybe_intel (scratchbuf);
252b5132
RH
10299}
10300
6608db57 10301/* Capital letters in template are macros. */
6439fc28 10302static int
d3ce72d0 10303putop (const char *in_template, int sizeflag)
252b5132 10304{
2da11e11 10305 const char *p;
9306ca4a 10306 int alt = 0;
9d141669 10307 int cond = 1;
21a3faeb 10308 unsigned int l = 0, len = 0;
98b528ac
L
10309 char last[4];
10310
d3ce72d0 10311 for (p = in_template; *p; p++)
252b5132 10312 {
21a3faeb
JB
10313 if (len > l)
10314 {
10315 if (l >= sizeof (last) || !ISUPPER (*p))
10316 abort ();
10317 last[l++] = *p;
10318 continue;
10319 }
252b5132
RH
10320 switch (*p)
10321 {
10322 default:
10323 *obufp++ = *p;
10324 break;
98b528ac
L
10325 case '%':
10326 len++;
10327 break;
9d141669
L
10328 case '!':
10329 cond = 0;
10330 break;
6439fc28 10331 case '{':
6439fc28 10332 if (intel_syntax)
6439fc28
AM
10333 {
10334 while (*++p != '|')
7c52e0e8
L
10335 if (*p == '}' || *p == '\0')
10336 abort ();
d1c36125 10337 alt = 1;
6439fc28 10338 }
d1c36125 10339 break;
6439fc28
AM
10340 case '|':
10341 while (*++p != '}')
10342 {
10343 if (*p == '\0')
10344 abort ();
10345 }
10346 break;
10347 case '}':
d1c36125 10348 alt = 0;
6439fc28 10349 break;
252b5132 10350 case 'A':
db6eb5be
AM
10351 if (intel_syntax)
10352 break;
0e9f3bf1
L
10353 if ((need_modrm && modrm.mod != 3)
10354 || (sizeflag & SUFFIX_ALWAYS))
252b5132
RH
10355 *obufp++ = 'b';
10356 break;
10357 case 'B':
21a3faeb 10358 if (l == 0)
4b06377f 10359 {
dc1e8a47 10360 case_B:
4b06377f
L
10361 if (intel_syntax)
10362 break;
10363 if (sizeflag & SUFFIX_ALWAYS)
10364 *obufp++ = 'b';
10365 }
21a3faeb 10366 else if (l == 1 && last[0] == 'L')
4b06377f 10367 {
4b06377f
L
10368 if (address_mode == mode_64bit
10369 && !(prefixes & PREFIX_ADDR))
10370 {
10371 *obufp++ = 'a';
10372 *obufp++ = 'b';
10373 *obufp++ = 's';
10374 }
10375
10376 goto case_B;
10377 }
21a3faeb
JB
10378 else
10379 abort ();
252b5132 10380 break;
9306ca4a
JB
10381 case 'C':
10382 if (intel_syntax && !alt)
10383 break;
10384 if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
10385 {
10386 if (sizeflag & DFLAG)
10387 *obufp++ = intel_syntax ? 'd' : 'l';
10388 else
10389 *obufp++ = intel_syntax ? 'w' : 's';
10390 used_prefixes |= (prefixes & PREFIX_DATA);
10391 }
10392 break;
ed7841b3
JB
10393 case 'D':
10394 if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
10395 break;
161a04f6 10396 USED_REX (REX_W);
7967e09e 10397 if (modrm.mod == 3)
ed7841b3 10398 {
161a04f6 10399 if (rex & REX_W)
ed7841b3 10400 *obufp++ = 'q';
ed7841b3 10401 else
f16cd0d5
L
10402 {
10403 if (sizeflag & DFLAG)
10404 *obufp++ = intel_syntax ? 'd' : 'l';
10405 else
10406 *obufp++ = 'w';
10407 used_prefixes |= (prefixes & PREFIX_DATA);
10408 }
ed7841b3
JB
10409 }
10410 else
10411 *obufp++ = 'w';
10412 break;
252b5132 10413 case 'E': /* For jcxz/jecxz */
cb712a9e 10414 if (address_mode == mode_64bit)
c1a64871
JH
10415 {
10416 if (sizeflag & AFLAG)
10417 *obufp++ = 'r';
10418 else
10419 *obufp++ = 'e';
10420 }
10421 else
10422 if (sizeflag & AFLAG)
10423 *obufp++ = 'e';
3ffd33cf
AM
10424 used_prefixes |= (prefixes & PREFIX_ADDR);
10425 break;
10426 case 'F':
db6eb5be
AM
10427 if (intel_syntax)
10428 break;
e396998b 10429 if ((prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
3ffd33cf
AM
10430 {
10431 if (sizeflag & AFLAG)
cb712a9e 10432 *obufp++ = address_mode == mode_64bit ? 'q' : 'l';
3ffd33cf 10433 else
cb712a9e 10434 *obufp++ = address_mode == mode_64bit ? 'l' : 'w';
3ffd33cf
AM
10435 used_prefixes |= (prefixes & PREFIX_ADDR);
10436 }
252b5132 10437 break;
52fd6d94
JB
10438 case 'G':
10439 if (intel_syntax || (obufp[-1] != 's' && !(sizeflag & SUFFIX_ALWAYS)))
10440 break;
161a04f6 10441 if ((rex & REX_W) || (sizeflag & DFLAG))
52fd6d94
JB
10442 *obufp++ = 'l';
10443 else
10444 *obufp++ = 'w';
161a04f6 10445 if (!(rex & REX_W))
52fd6d94
JB
10446 used_prefixes |= (prefixes & PREFIX_DATA);
10447 break;
5dd0794d 10448 case 'H':
db6eb5be
AM
10449 if (intel_syntax)
10450 break;
5dd0794d
AM
10451 if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
10452 || (prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
10453 {
10454 used_prefixes |= prefixes & (PREFIX_CS | PREFIX_DS);
10455 *obufp++ = ',';
10456 *obufp++ = 'p';
632ee6fd
BP
10457
10458 /* Set active_seg_prefix even if not set in 64-bit mode
10459 because here it is a valid branch hint. */
5dd0794d 10460 if (prefixes & PREFIX_DS)
632ee6fd
BP
10461 {
10462 active_seg_prefix = PREFIX_DS;
10463 *obufp++ = 't';
10464 }
5dd0794d 10465 else
632ee6fd
BP
10466 {
10467 active_seg_prefix = PREFIX_CS;
10468 *obufp++ = 'n';
10469 }
5dd0794d
AM
10470 }
10471 break;
42903f7f
L
10472 case 'K':
10473 USED_REX (REX_W);
10474 if (rex & REX_W)
10475 *obufp++ = 'q';
10476 else
10477 *obufp++ = 'd';
10478 break;
252b5132 10479 case 'L':
78467458 10480 abort ();
9d141669
L
10481 case 'M':
10482 if (intel_mnemonic != cond)
10483 *obufp++ = 'r';
10484 break;
252b5132
RH
10485 case 'N':
10486 if ((prefixes & PREFIX_FWAIT) == 0)
10487 *obufp++ = 'n';
7d421014
ILT
10488 else
10489 used_prefixes |= PREFIX_FWAIT;
252b5132 10490 break;
52b15da3 10491 case 'O':
161a04f6
L
10492 USED_REX (REX_W);
10493 if (rex & REX_W)
6439fc28 10494 *obufp++ = 'o';
a35ca55a
JB
10495 else if (intel_syntax && (sizeflag & DFLAG))
10496 *obufp++ = 'q';
52b15da3
JH
10497 else
10498 *obufp++ = 'd';
161a04f6 10499 if (!(rex & REX_W))
a35ca55a 10500 used_prefixes |= (prefixes & PREFIX_DATA);
52b15da3 10501 break;
36938cab
JB
10502 case '@':
10503 if (address_mode == mode_64bit
10504 && (isa64 == intel64 || (rex & REX_W)
10505 || !(prefixes & PREFIX_DATA)))
6439fc28 10506 {
36938cab
JB
10507 if (sizeflag & SUFFIX_ALWAYS)
10508 *obufp++ = 'q';
6439fc28
AM
10509 break;
10510 }
6608db57 10511 /* Fall through. */
252b5132 10512 case 'P':
21a3faeb 10513 if (l == 0)
d9e3625e 10514 {
0e9f3bf1 10515 if ((modrm.mod == 3 || !cond)
c3f5525f 10516 && !(sizeflag & SUFFIX_ALWAYS))
36938cab
JB
10517 break;
10518 /* Fall through. */
10519 case 'T':
10520 if ((!(rex & REX_W) && (prefixes & PREFIX_DATA))
10521 || ((sizeflag & SUFFIX_ALWAYS)
10522 && address_mode != mode_64bit))
4b4c407a 10523 {
36938cab
JB
10524 *obufp++ = (sizeflag & DFLAG) ?
10525 intel_syntax ? 'd' : 'l' : 'w';
10526 used_prefixes |= (prefixes & PREFIX_DATA);
d9e3625e 10527 }
36938cab
JB
10528 else if (sizeflag & SUFFIX_ALWAYS)
10529 *obufp++ = 'q';
d9e3625e 10530 }
21a3faeb 10531 else if (l == 1 && last[0] == 'L')
252b5132 10532 {
4b4c407a
L
10533 if ((prefixes & PREFIX_DATA)
10534 || (rex & REX_W)
10535 || (sizeflag & SUFFIX_ALWAYS))
52b15da3 10536 {
4b4c407a
L
10537 USED_REX (REX_W);
10538 if (rex & REX_W)
10539 *obufp++ = 'q';
10540 else
10541 {
10542 if (sizeflag & DFLAG)
10543 *obufp++ = intel_syntax ? 'd' : 'l';
10544 else
10545 *obufp++ = 'w';
10546 used_prefixes |= (prefixes & PREFIX_DATA);
10547 }
52b15da3 10548 }
252b5132 10549 }
21a3faeb
JB
10550 else
10551 abort ();
252b5132
RH
10552 break;
10553 case 'Q':
21a3faeb 10554 if (l == 0)
252b5132 10555 {
98b528ac
L
10556 if (intel_syntax && !alt)
10557 break;
10558 USED_REX (REX_W);
0e9f3bf1
L
10559 if ((need_modrm && modrm.mod != 3)
10560 || (sizeflag & SUFFIX_ALWAYS))
52b15da3 10561 {
98b528ac
L
10562 if (rex & REX_W)
10563 *obufp++ = 'q';
52b15da3 10564 else
98b528ac
L
10565 {
10566 if (sizeflag & DFLAG)
10567 *obufp++ = intel_syntax ? 'd' : 'l';
10568 else
10569 *obufp++ = 'w';
f16cd0d5 10570 used_prefixes |= (prefixes & PREFIX_DATA);
98b528ac 10571 }
52b15da3 10572 }
98b528ac 10573 }
492a76aa
JB
10574 else if (l == 1 && last[0] == 'D')
10575 *obufp++ = vex.w ? 'q' : 'd';
21a3faeb 10576 else if (l == 1 && last[0] == 'L')
98b528ac 10577 {
b24d668c
JB
10578 if (cond ? modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)
10579 : address_mode != mode_64bit)
98b528ac
L
10580 break;
10581 if ((rex & REX_W))
10582 {
10583 USED_REX (REX_W);
10584 *obufp++ = 'q';
10585 }
5b316d90 10586 else if((address_mode == mode_64bit && cond)
589958d6
JB
10587 || (sizeflag & SUFFIX_ALWAYS))
10588 *obufp++ = intel_syntax? 'd' : 'l';
252b5132 10589 }
21a3faeb
JB
10590 else
10591 abort ();
252b5132
RH
10592 break;
10593 case 'R':
161a04f6
L
10594 USED_REX (REX_W);
10595 if (rex & REX_W)
a35ca55a
JB
10596 *obufp++ = 'q';
10597 else if (sizeflag & DFLAG)
c608c12e 10598 {
a35ca55a 10599 if (intel_syntax)
c608c12e 10600 *obufp++ = 'd';
c608c12e 10601 else
a35ca55a 10602 *obufp++ = 'l';
c608c12e 10603 }
252b5132 10604 else
a35ca55a
JB
10605 *obufp++ = 'w';
10606 if (intel_syntax && !p[1]
161a04f6 10607 && ((rex & REX_W) || (sizeflag & DFLAG)))
a35ca55a 10608 *obufp++ = 'e';
161a04f6 10609 if (!(rex & REX_W))
52b15da3 10610 used_prefixes |= (prefixes & PREFIX_DATA);
252b5132
RH
10611 break;
10612 case 'S':
21a3faeb 10613 if (l == 0)
252b5132 10614 {
dc1e8a47 10615 case_S:
4b06377f
L
10616 if (intel_syntax)
10617 break;
10618 if (sizeflag & SUFFIX_ALWAYS)
52b15da3 10619 {
4b06377f
L
10620 if (rex & REX_W)
10621 *obufp++ = 'q';
52b15da3 10622 else
4b06377f
L
10623 {
10624 if (sizeflag & DFLAG)
10625 *obufp++ = 'l';
10626 else
10627 *obufp++ = 'w';
10628 used_prefixes |= (prefixes & PREFIX_DATA);
10629 }
10630 }
10631 }
21a3faeb 10632 else if (l == 1 && last[0] == 'L')
4b06377f 10633 {
4b06377f
L
10634 if (address_mode == mode_64bit
10635 && !(prefixes & PREFIX_ADDR))
10636 {
10637 *obufp++ = 'a';
10638 *obufp++ = 'b';
10639 *obufp++ = 's';
10640 }
10641
10642 goto case_S;
252b5132 10643 }
21a3faeb
JB
10644 else
10645 abort ();
252b5132 10646 break;
f0e8d0ba
JB
10647 case 'V':
10648 if (l == 0)
10649 abort ();
58bf9b6a
L
10650 else if (l == 1
10651 && (last[0] == 'L' || last[0] == 'X'))
f0e8d0ba 10652 {
58bf9b6a
L
10653 if (last[0] == 'X')
10654 {
10655 *obufp++ = '{';
10656 *obufp++ = 'v';
10657 *obufp++ = 'e';
10658 *obufp++ = 'x';
58bf9b6a
L
10659 *obufp++ = '}';
10660 }
10661 else if (rex & REX_W)
f0e8d0ba
JB
10662 {
10663 *obufp++ = 'a';
10664 *obufp++ = 'b';
10665 *obufp++ = 's';
10666 }
10667 }
10668 else
10669 abort ();
10670 goto case_S;
10671 case 'W':
10672 if (l == 0)
10673 {
10674 /* operand size flag for cwtl, cbtw */
10675 USED_REX (REX_W);
10676 if (rex & REX_W)
10677 {
10678 if (intel_syntax)
10679 *obufp++ = 'd';
10680 else
10681 *obufp++ = 'l';
10682 }
10683 else if (sizeflag & DFLAG)
10684 *obufp++ = 'w';
10685 else
10686 *obufp++ = 'b';
10687 if (!(rex & REX_W))
10688 used_prefixes |= (prefixes & PREFIX_DATA);
10689 }
10690 else if (l == 1)
10691 {
10692 if (!need_vex)
10693 abort ();
10694 if (last[0] == 'X')
10695 *obufp++ = vex.w ? 'd': 's';
10696 else if (last[0] == 'B')
10697 *obufp++ = vex.w ? 'w': 'b';
10698 else
10699 abort ();
10700 }
10701 else
10702 abort ();
10703 break;
041bd2e0 10704 case 'X':
21a3faeb
JB
10705 if (l != 0)
10706 abort ();
bf926894
JB
10707 if (need_vex
10708 ? vex.prefix == DATA_PREFIX_OPCODE
10709 : prefixes & PREFIX_DATA)
c0f3af97 10710 {
bf926894
JB
10711 *obufp++ = 'd';
10712 used_prefixes |= PREFIX_DATA;
c0f3af97 10713 }
041bd2e0 10714 else
bf926894 10715 *obufp++ = 's';
041bd2e0 10716 break;
76f227a5 10717 case 'Y':
21a3faeb 10718 if (l == 1 && last[0] == 'X')
c0f3af97 10719 {
c0f3af97
L
10720 if (!need_vex)
10721 abort ();
10722 if (intel_syntax
04d824a4 10723 || ((modrm.mod == 3 || vex.b) && !(sizeflag & SUFFIX_ALWAYS)))
c0f3af97
L
10724 break;
10725 switch (vex.length)
10726 {
10727 case 128:
10728 *obufp++ = 'x';
10729 break;
10730 case 256:
10731 *obufp++ = 'y';
10732 break;
04d824a4
JB
10733 case 512:
10734 if (!vex.evex)
c0f3af97 10735 default:
04d824a4 10736 abort ();
c0f3af97 10737 }
76f227a5 10738 }
21a3faeb
JB
10739 else
10740 abort ();
76f227a5 10741 break;
78467458
JB
10742 case 'Z':
10743 if (l == 0)
10744 {
10745 /* These insns ignore ModR/M.mod: Force it to 3 for OP_E(). */
10746 modrm.mod = 3;
10747 if (!intel_syntax && (sizeflag & SUFFIX_ALWAYS))
10748 *obufp++ = address_mode == mode_64bit ? 'q' : 'l';
10749 }
10750 else if (l == 1 && last[0] == 'X')
10751 {
ac7a2311 10752 if (!vex.evex)
78467458
JB
10753 abort ();
10754 if (intel_syntax
10755 || ((modrm.mod == 3 || vex.b) && !(sizeflag & SUFFIX_ALWAYS)))
10756 break;
10757 switch (vex.length)
10758 {
10759 case 128:
10760 *obufp++ = 'x';
10761 break;
10762 case 256:
10763 *obufp++ = 'y';
10764 break;
10765 case 512:
10766 *obufp++ = 'z';
10767 break;
10768 default:
10769 abort ();
10770 }
10771 }
10772 else
10773 abort ();
10774 break;
a72d2af2
L
10775 case '^':
10776 if (intel_syntax)
10777 break;
5990e377
JB
10778 if (isa64 == intel64 && (rex & REX_W))
10779 {
10780 USED_REX (REX_W);
10781 *obufp++ = 'q';
10782 break;
10783 }
a72d2af2
L
10784 if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
10785 {
10786 if (sizeflag & DFLAG)
10787 *obufp++ = 'l';
10788 else
10789 *obufp++ = 'w';
10790 used_prefixes |= (prefixes & PREFIX_DATA);
10791 }
10792 break;
252b5132 10793 }
21a3faeb
JB
10794
10795 if (len == l)
10796 len = l = 0;
252b5132
RH
10797 }
10798 *obufp = 0;
ea397f5b 10799 mnemonicendp = obufp;
6439fc28 10800 return 0;
252b5132
RH
10801}
10802
10803static void
26ca5450 10804oappend (const char *s)
252b5132 10805{
ea397f5b 10806 obufp = stpcpy (obufp, s);
252b5132
RH
10807}
10808
10809static void
26ca5450 10810append_seg (void)
252b5132 10811{
285ca992
L
10812 /* Only print the active segment register. */
10813 if (!active_seg_prefix)
10814 return;
10815
10816 used_prefixes |= active_seg_prefix;
10817 switch (active_seg_prefix)
7d421014 10818 {
285ca992 10819 case PREFIX_CS:
9ce09ba2 10820 oappend_maybe_intel ("%cs:");
285ca992
L
10821 break;
10822 case PREFIX_DS:
9ce09ba2 10823 oappend_maybe_intel ("%ds:");
285ca992
L
10824 break;
10825 case PREFIX_SS:
9ce09ba2 10826 oappend_maybe_intel ("%ss:");
285ca992
L
10827 break;
10828 case PREFIX_ES:
9ce09ba2 10829 oappend_maybe_intel ("%es:");
285ca992
L
10830 break;
10831 case PREFIX_FS:
9ce09ba2 10832 oappend_maybe_intel ("%fs:");
285ca992
L
10833 break;
10834 case PREFIX_GS:
9ce09ba2 10835 oappend_maybe_intel ("%gs:");
285ca992
L
10836 break;
10837 default:
10838 break;
7d421014 10839 }
252b5132
RH
10840}
10841
10842static void
26ca5450 10843OP_indirE (int bytemode, int sizeflag)
252b5132
RH
10844{
10845 if (!intel_syntax)
10846 oappend ("*");
10847 OP_E (bytemode, sizeflag);
10848}
10849
52b15da3 10850static void
26ca5450 10851print_operand_value (char *buf, int hex, bfd_vma disp)
52b15da3 10852{
cb712a9e 10853 if (address_mode == mode_64bit)
52b15da3
JH
10854 {
10855 if (hex)
10856 {
10857 char tmp[30];
10858 int i;
10859 buf[0] = '0';
10860 buf[1] = 'x';
10861 sprintf_vma (tmp, disp);
6608db57 10862 for (i = 0; tmp[i] == '0' && tmp[i + 1]; i++);
52b15da3
JH
10863 strcpy (buf + 2, tmp + i);
10864 }
10865 else
10866 {
10867 bfd_signed_vma v = disp;
10868 char tmp[30];
10869 int i;
10870 if (v < 0)
10871 {
10872 *(buf++) = '-';
10873 v = -disp;
6608db57 10874 /* Check for possible overflow on 0x8000000000000000. */
52b15da3
JH
10875 if (v < 0)
10876 {
10877 strcpy (buf, "9223372036854775808");
10878 return;
10879 }
10880 }
10881 if (!v)
10882 {
10883 strcpy (buf, "0");
10884 return;
10885 }
10886
10887 i = 0;
10888 tmp[29] = 0;
10889 while (v)
10890 {
6608db57 10891 tmp[28 - i] = (v % 10) + '0';
52b15da3
JH
10892 v /= 10;
10893 i++;
10894 }
10895 strcpy (buf, tmp + 29 - i);
10896 }
10897 }
10898 else
10899 {
10900 if (hex)
10901 sprintf (buf, "0x%x", (unsigned int) disp);
10902 else
10903 sprintf (buf, "%d", (int) disp);
10904 }
10905}
10906
5d669648
L
10907/* Put DISP in BUF as signed hex number. */
10908
10909static void
10910print_displacement (char *buf, bfd_vma disp)
10911{
10912 bfd_signed_vma val = disp;
10913 char tmp[30];
10914 int i, j = 0;
10915
10916 if (val < 0)
10917 {
10918 buf[j++] = '-';
10919 val = -disp;
10920
10921 /* Check for possible overflow. */
10922 if (val < 0)
10923 {
10924 switch (address_mode)
10925 {
10926 case mode_64bit:
10927 strcpy (buf + j, "0x8000000000000000");
10928 break;
10929 case mode_32bit:
10930 strcpy (buf + j, "0x80000000");
10931 break;
10932 case mode_16bit:
10933 strcpy (buf + j, "0x8000");
10934 break;
10935 }
10936 return;
10937 }
10938 }
10939
10940 buf[j++] = '0';
10941 buf[j++] = 'x';
10942
0af1713e 10943 sprintf_vma (tmp, (bfd_vma) val);
5d669648
L
10944 for (i = 0; tmp[i] == '0'; i++)
10945 continue;
10946 if (tmp[i] == '\0')
10947 i--;
10948 strcpy (buf + j, tmp + i);
10949}
10950
3f31e633
JB
10951static void
10952intel_operand_size (int bytemode, int sizeflag)
10953{
ac7a2311 10954 if (vex.b
43234a1e
L
10955 && (bytemode == x_mode
10956 || bytemode == evex_half_bcst_xmmq_mode))
10957 {
10958 if (vex.w)
10959 oappend ("QWORD PTR ");
10960 else
10961 oappend ("DWORD PTR ");
10962 return;
10963 }
3f31e633
JB
10964 switch (bytemode)
10965 {
10966 case b_mode:
b6169b20 10967 case b_swap_mode:
42903f7f 10968 case dqb_mode:
1ba585e8 10969 case db_mode:
3f31e633
JB
10970 oappend ("BYTE PTR ");
10971 break;
10972 case w_mode:
1ba585e8 10973 case dw_mode:
3f31e633
JB
10974 case dqw_mode:
10975 oappend ("WORD PTR ");
10976 break;
07f5af7d
L
10977 case indir_v_mode:
10978 if (address_mode == mode_64bit && isa64 == intel64)
10979 {
10980 oappend ("QWORD PTR ");
10981 break;
10982 }
1a0670f3 10983 /* Fall through. */
1a114b12 10984 case stack_v_mode:
7bb15c6f 10985 if (address_mode == mode_64bit && ((sizeflag & DFLAG) || (rex & REX_W)))
3f31e633
JB
10986 {
10987 oappend ("QWORD PTR ");
3f31e633
JB
10988 break;
10989 }
1a0670f3 10990 /* Fall through. */
3f31e633 10991 case v_mode:
b6169b20 10992 case v_swap_mode:
3f31e633 10993 case dq_mode:
161a04f6
L
10994 USED_REX (REX_W);
10995 if (rex & REX_W)
3f31e633 10996 oappend ("QWORD PTR ");
035e7389
JB
10997 else if (bytemode == dq_mode)
10998 oappend ("DWORD PTR ");
3f31e633 10999 else
f16cd0d5 11000 {
035e7389 11001 if (sizeflag & DFLAG)
f16cd0d5
L
11002 oappend ("DWORD PTR ");
11003 else
11004 oappend ("WORD PTR ");
11005 used_prefixes |= (prefixes & PREFIX_DATA);
11006 }
3f31e633 11007 break;
52fd6d94 11008 case z_mode:
161a04f6 11009 if ((rex & REX_W) || (sizeflag & DFLAG))
52fd6d94
JB
11010 *obufp++ = 'D';
11011 oappend ("WORD PTR ");
161a04f6 11012 if (!(rex & REX_W))
52fd6d94
JB
11013 used_prefixes |= (prefixes & PREFIX_DATA);
11014 break;
34b772a6
JB
11015 case a_mode:
11016 if (sizeflag & DFLAG)
11017 oappend ("QWORD PTR ");
11018 else
11019 oappend ("DWORD PTR ");
11020 used_prefixes |= (prefixes & PREFIX_DATA);
11021 break;
bc31405e
L
11022 case movsxd_mode:
11023 if (!(sizeflag & DFLAG) && isa64 == intel64)
11024 oappend ("WORD PTR ");
11025 else
11026 oappend ("DWORD PTR ");
11027 used_prefixes |= (prefixes & PREFIX_DATA);
11028 break;
3f31e633 11029 case d_mode:
fa99fab2 11030 case d_swap_mode:
42903f7f 11031 case dqd_mode:
3f31e633
JB
11032 oappend ("DWORD PTR ");
11033 break;
11034 case q_mode:
b6169b20 11035 case q_swap_mode:
3f31e633
JB
11036 oappend ("QWORD PTR ");
11037 break;
11038 case m_mode:
cb712a9e 11039 if (address_mode == mode_64bit)
3f31e633
JB
11040 oappend ("QWORD PTR ");
11041 else
11042 oappend ("DWORD PTR ");
11043 break;
11044 case f_mode:
11045 if (sizeflag & DFLAG)
11046 oappend ("FWORD PTR ");
11047 else
11048 oappend ("DWORD PTR ");
11049 used_prefixes |= (prefixes & PREFIX_DATA);
11050 break;
11051 case t_mode:
11052 oappend ("TBYTE PTR ");
11053 break;
11054 case x_mode:
b6169b20 11055 case x_swap_mode:
43234a1e
L
11056 case evex_x_gscat_mode:
11057 case evex_x_nobcst_mode:
4726e9a4 11058 case bw_unit_mode:
c0f3af97
L
11059 if (need_vex)
11060 {
11061 switch (vex.length)
11062 {
11063 case 128:
11064 oappend ("XMMWORD PTR ");
11065 break;
11066 case 256:
11067 oappend ("YMMWORD PTR ");
11068 break;
43234a1e
L
11069 case 512:
11070 oappend ("ZMMWORD PTR ");
11071 break;
c0f3af97
L
11072 default:
11073 abort ();
11074 }
11075 }
11076 else
11077 oappend ("XMMWORD PTR ");
11078 break;
11079 case xmm_mode:
3f31e633
JB
11080 oappend ("XMMWORD PTR ");
11081 break;
43234a1e
L
11082 case ymm_mode:
11083 oappend ("YMMWORD PTR ");
11084 break;
c0f3af97 11085 case xmmq_mode:
43234a1e 11086 case evex_half_bcst_xmmq_mode:
c0f3af97
L
11087 if (!need_vex)
11088 abort ();
11089
11090 switch (vex.length)
11091 {
11092 case 128:
11093 oappend ("QWORD PTR ");
11094 break;
11095 case 256:
11096 oappend ("XMMWORD PTR ");
11097 break;
43234a1e
L
11098 case 512:
11099 oappend ("YMMWORD PTR ");
11100 break;
c0f3af97
L
11101 default:
11102 abort ();
11103 }
11104 break;
6c30d220
L
11105 case xmm_mb_mode:
11106 if (!need_vex)
11107 abort ();
11108
11109 switch (vex.length)
11110 {
11111 case 128:
11112 case 256:
43234a1e 11113 case 512:
6c30d220
L
11114 oappend ("BYTE PTR ");
11115 break;
11116 default:
11117 abort ();
11118 }
11119 break;
11120 case xmm_mw_mode:
11121 if (!need_vex)
11122 abort ();
11123
11124 switch (vex.length)
11125 {
11126 case 128:
11127 case 256:
43234a1e 11128 case 512:
6c30d220
L
11129 oappend ("WORD PTR ");
11130 break;
11131 default:
11132 abort ();
11133 }
11134 break;
11135 case xmm_md_mode:
11136 if (!need_vex)
11137 abort ();
11138
11139 switch (vex.length)
11140 {
11141 case 128:
11142 case 256:
43234a1e 11143 case 512:
6c30d220
L
11144 oappend ("DWORD PTR ");
11145 break;
11146 default:
11147 abort ();
11148 }
11149 break;
11150 case xmm_mq_mode:
11151 if (!need_vex)
11152 abort ();
11153
11154 switch (vex.length)
11155 {
11156 case 128:
11157 case 256:
43234a1e 11158 case 512:
6c30d220
L
11159 oappend ("QWORD PTR ");
11160 break;
11161 default:
11162 abort ();
11163 }
11164 break;
11165 case xmmdw_mode:
11166 if (!need_vex)
11167 abort ();
11168
11169 switch (vex.length)
11170 {
11171 case 128:
11172 oappend ("WORD PTR ");
11173 break;
11174 case 256:
11175 oappend ("DWORD PTR ");
11176 break;
43234a1e
L
11177 case 512:
11178 oappend ("QWORD PTR ");
11179 break;
6c30d220
L
11180 default:
11181 abort ();
11182 }
11183 break;
11184 case xmmqd_mode:
11185 if (!need_vex)
11186 abort ();
11187
11188 switch (vex.length)
11189 {
11190 case 128:
11191 oappend ("DWORD PTR ");
11192 break;
11193 case 256:
11194 oappend ("QWORD PTR ");
11195 break;
43234a1e
L
11196 case 512:
11197 oappend ("XMMWORD PTR ");
11198 break;
6c30d220
L
11199 default:
11200 abort ();
11201 }
11202 break;
c0f3af97
L
11203 case ymmq_mode:
11204 if (!need_vex)
11205 abort ();
11206
11207 switch (vex.length)
11208 {
11209 case 128:
11210 oappend ("QWORD PTR ");
11211 break;
11212 case 256:
11213 oappend ("YMMWORD PTR ");
11214 break;
43234a1e
L
11215 case 512:
11216 oappend ("ZMMWORD PTR ");
11217 break;
c0f3af97
L
11218 default:
11219 abort ();
11220 }
11221 break;
6c30d220
L
11222 case ymmxmm_mode:
11223 if (!need_vex)
11224 abort ();
11225
11226 switch (vex.length)
11227 {
11228 case 128:
11229 case 256:
11230 oappend ("XMMWORD PTR ");
11231 break;
11232 default:
11233 abort ();
11234 }
11235 break;
fb9c77c7
L
11236 case o_mode:
11237 oappend ("OWORD PTR ");
11238 break;
1c480963 11239 case vex_scalar_w_dq_mode:
0bfee649
L
11240 if (!need_vex)
11241 abort ();
11242
11243 if (vex.w)
11244 oappend ("QWORD PTR ");
11245 else
11246 oappend ("DWORD PTR ");
11247 break;
43234a1e
L
11248 case vex_vsib_d_w_dq_mode:
11249 case vex_vsib_q_w_dq_mode:
11250 if (!need_vex)
11251 abort ();
11252
b763d508
JB
11253 if (vex.w)
11254 oappend ("QWORD PTR ");
43234a1e 11255 else
b763d508 11256 oappend ("DWORD PTR ");
5fc35d96 11257 break;
1ba585e8
IT
11258 case mask_bd_mode:
11259 if (!need_vex || vex.length != 128)
11260 abort ();
11261 if (vex.w)
11262 oappend ("DWORD PTR ");
11263 else
11264 oappend ("BYTE PTR ");
11265 break;
43234a1e
L
11266 case mask_mode:
11267 if (!need_vex)
11268 abort ();
1ba585e8
IT
11269 if (vex.w)
11270 oappend ("QWORD PTR ");
11271 else
11272 oappend ("WORD PTR ");
43234a1e 11273 break;
6c75cc62 11274 case v_bnd_mode:
d276ec69 11275 case v_bndmk_mode:
3f31e633
JB
11276 default:
11277 break;
11278 }
11279}
11280
252b5132 11281static void
c0f3af97 11282OP_E_register (int bytemode, int sizeflag)
252b5132 11283{
c0f3af97
L
11284 int reg = modrm.rm;
11285 const char **names;
252b5132 11286
c0f3af97
L
11287 USED_REX (REX_B);
11288 if ((rex & REX_B))
11289 reg += 8;
252b5132 11290
b6169b20 11291 if ((sizeflag & SUFFIX_ALWAYS)
1ba585e8 11292 && (bytemode == b_swap_mode
9f79e886 11293 || bytemode == bnd_swap_mode
60227d64 11294 || bytemode == v_swap_mode))
b6169b20
L
11295 swap_operand ();
11296
c0f3af97 11297 switch (bytemode)
252b5132 11298 {
c0f3af97 11299 case b_mode:
b6169b20 11300 case b_swap_mode:
e184e611
JB
11301 if (reg & 4)
11302 USED_REX (0);
c0f3af97
L
11303 if (rex)
11304 names = names8rex;
11305 else
11306 names = names8;
11307 break;
11308 case w_mode:
11309 names = names16;
11310 break;
11311 case d_mode:
1ba585e8
IT
11312 case dw_mode:
11313 case db_mode:
c0f3af97
L
11314 names = names32;
11315 break;
11316 case q_mode:
11317 names = names64;
11318 break;
11319 case m_mode:
6c75cc62 11320 case v_bnd_mode:
c0f3af97
L
11321 names = address_mode == mode_64bit ? names64 : names32;
11322 break;
7e8b059b 11323 case bnd_mode:
9f79e886 11324 case bnd_swap_mode:
0d96e4df
L
11325 if (reg > 0x3)
11326 {
11327 oappend ("(bad)");
11328 return;
11329 }
7e8b059b
L
11330 names = names_bnd;
11331 break;
07f5af7d
L
11332 case indir_v_mode:
11333 if (address_mode == mode_64bit && isa64 == intel64)
11334 {
11335 names = names64;
11336 break;
11337 }
1a0670f3 11338 /* Fall through. */
c0f3af97 11339 case stack_v_mode:
7bb15c6f 11340 if (address_mode == mode_64bit && ((sizeflag & DFLAG) || (rex & REX_W)))
252b5132 11341 {
c0f3af97 11342 names = names64;
252b5132 11343 break;
252b5132 11344 }
c0f3af97 11345 bytemode = v_mode;
1a0670f3 11346 /* Fall through. */
c0f3af97 11347 case v_mode:
b6169b20 11348 case v_swap_mode:
c0f3af97
L
11349 case dq_mode:
11350 case dqb_mode:
11351 case dqd_mode:
11352 case dqw_mode:
11353 USED_REX (REX_W);
11354 if (rex & REX_W)
11355 names = names64;
035e7389
JB
11356 else if (bytemode != v_mode && bytemode != v_swap_mode)
11357 names = names32;
c0f3af97 11358 else
f16cd0d5 11359 {
035e7389 11360 if (sizeflag & DFLAG)
f16cd0d5
L
11361 names = names32;
11362 else
11363 names = names16;
11364 used_prefixes |= (prefixes & PREFIX_DATA);
11365 }
c0f3af97 11366 break;
bc31405e
L
11367 case movsxd_mode:
11368 if (!(sizeflag & DFLAG) && isa64 == intel64)
11369 names = names16;
11370 else
11371 names = names32;
11372 used_prefixes |= (prefixes & PREFIX_DATA);
11373 break;
de89d0a3
IT
11374 case va_mode:
11375 names = (address_mode == mode_64bit
11376 ? names64 : names32);
11377 if (!(prefixes & PREFIX_ADDR))
aa178437
IT
11378 names = (address_mode == mode_16bit
11379 ? names16 : names);
de89d0a3
IT
11380 else
11381 {
11382 /* Remove "addr16/addr32". */
11383 all_prefixes[last_addr_prefix] = 0;
11384 names = (address_mode != mode_32bit
11385 ? names32 : names16);
11386 used_prefixes |= PREFIX_ADDR;
11387 }
11388 break;
1ba585e8 11389 case mask_bd_mode:
43234a1e 11390 case mask_mode:
9889cbb1
L
11391 if (reg > 0x7)
11392 {
11393 oappend ("(bad)");
11394 return;
11395 }
43234a1e
L
11396 names = names_mask;
11397 break;
c0f3af97
L
11398 case 0:
11399 return;
11400 default:
11401 oappend (INTERNAL_DISASSEMBLER_ERROR);
252b5132
RH
11402 return;
11403 }
c0f3af97
L
11404 oappend (names[reg]);
11405}
11406
11407static void
c1e679ec 11408OP_E_memory (int bytemode, int sizeflag)
c0f3af97
L
11409{
11410 bfd_vma disp = 0;
11411 int add = (rex & REX_B) ? 8 : 0;
11412 int riprel = 0;
43234a1e
L
11413 int shift;
11414
11415 if (vex.evex)
11416 {
11417 /* In EVEX, if operand doesn't allow broadcast, vex.b should be 0. */
11418 if (vex.b
11419 && bytemode != x_mode
11420 && bytemode != evex_half_bcst_xmmq_mode)
11421 {
11422 BadOp ();
11423 return;
11424 }
11425 switch (bytemode)
11426 {
1ba585e8
IT
11427 case dqw_mode:
11428 case dw_mode:
059edf8b 11429 case xmm_mw_mode:
1ba585e8
IT
11430 shift = 1;
11431 break;
11432 case dqb_mode:
11433 case db_mode:
059edf8b 11434 case xmm_mb_mode:
1ba585e8
IT
11435 shift = 0;
11436 break;
b50c9f31
JB
11437 case dq_mode:
11438 if (address_mode != mode_64bit)
11439 {
059edf8b
JB
11440 case dqd_mode:
11441 case xmm_md_mode:
11442 case d_mode:
11443 case d_swap_mode:
b50c9f31
JB
11444 shift = 2;
11445 break;
11446 }
11447 /* fall through */
4102be5c 11448 case vex_scalar_w_dq_mode:
43234a1e 11449 case vex_vsib_d_w_dq_mode:
eaa9d1ad 11450 case vex_vsib_q_w_dq_mode:
43234a1e 11451 case evex_x_gscat_mode:
43234a1e
L
11452 shift = vex.w ? 3 : 2;
11453 break;
43234a1e
L
11454 case x_mode:
11455 case evex_half_bcst_xmmq_mode:
11456 if (vex.b)
11457 {
11458 shift = vex.w ? 3 : 2;
11459 break;
11460 }
1a0670f3 11461 /* Fall through. */
43234a1e
L
11462 case xmmqd_mode:
11463 case xmmdw_mode:
da944c8a 11464 case xmmq_mode:
43234a1e
L
11465 case ymmq_mode:
11466 case evex_x_nobcst_mode:
11467 case x_swap_mode:
11468 switch (vex.length)
11469 {
11470 case 128:
11471 shift = 4;
11472 break;
11473 case 256:
11474 shift = 5;
11475 break;
11476 case 512:
11477 shift = 6;
11478 break;
11479 default:
11480 abort ();
11481 }
059edf8b
JB
11482 /* Make necessary corrections to shift for modes that need it. */
11483 if (bytemode == xmmq_mode
11484 || bytemode == evex_half_bcst_xmmq_mode
11485 || (bytemode == ymmq_mode && vex.length == 128))
11486 shift -= 1;
11487 else if (bytemode == xmmqd_mode)
11488 shift -= 2;
11489 else if (bytemode == xmmdw_mode)
11490 shift -= 3;
43234a1e
L
11491 break;
11492 case ymm_mode:
11493 shift = 5;
11494 break;
11495 case xmm_mode:
11496 shift = 4;
11497 break;
11498 case xmm_mq_mode:
11499 case q_mode:
43234a1e 11500 case q_swap_mode:
43234a1e
L
11501 shift = 3;
11502 break;
4726e9a4
JB
11503 case bw_unit_mode:
11504 shift = vex.w ? 1 : 0;
11505 break;
43234a1e
L
11506 default:
11507 abort ();
11508 }
43234a1e
L
11509 }
11510 else
11511 shift = 0;
252b5132 11512
c0f3af97 11513 USED_REX (REX_B);
3f31e633
JB
11514 if (intel_syntax)
11515 intel_operand_size (bytemode, sizeflag);
252b5132
RH
11516 append_seg ();
11517
5d669648 11518 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
252b5132 11519 {
5d669648
L
11520 /* 32/64 bit address mode */
11521 int havedisp;
252b5132
RH
11522 int havesib;
11523 int havebase;
0f7da397 11524 int haveindex;
20afcfb7 11525 int needindex;
1bc60e56 11526 int needaddr32;
82c18208 11527 int base, rbase;
91d6fa6a 11528 int vindex = 0;
252b5132 11529 int scale = 0;
7e8b059b
L
11530 int addr32flag = !((sizeflag & AFLAG)
11531 || bytemode == v_bnd_mode
d276ec69 11532 || bytemode == v_bndmk_mode
9f79e886
JB
11533 || bytemode == bnd_mode
11534 || bytemode == bnd_swap_mode);
6c30d220
L
11535 const char **indexes64 = names64;
11536 const char **indexes32 = names32;
252b5132
RH
11537
11538 havesib = 0;
11539 havebase = 1;
0f7da397 11540 haveindex = 0;
7967e09e 11541 base = modrm.rm;
252b5132
RH
11542
11543 if (base == 4)
11544 {
11545 havesib = 1;
dfc8cf43 11546 vindex = sib.index;
161a04f6
L
11547 USED_REX (REX_X);
11548 if (rex & REX_X)
91d6fa6a 11549 vindex += 8;
6c30d220
L
11550 switch (bytemode)
11551 {
11552 case vex_vsib_d_w_dq_mode:
11553 case vex_vsib_q_w_dq_mode:
11554 if (!need_vex)
11555 abort ();
43234a1e
L
11556 if (vex.evex)
11557 {
11558 if (!vex.v)
11559 vindex += 16;
11560 }
6c30d220
L
11561
11562 haveindex = 1;
11563 switch (vex.length)
11564 {
11565 case 128:
7bb15c6f 11566 indexes64 = indexes32 = names_xmm;
6c30d220
L
11567 break;
11568 case 256:
5fc35d96 11569 if (!vex.w
b763d508 11570 || bytemode == vex_vsib_q_w_dq_mode)
7bb15c6f 11571 indexes64 = indexes32 = names_ymm;
6c30d220 11572 else
7bb15c6f 11573 indexes64 = indexes32 = names_xmm;
6c30d220 11574 break;
43234a1e 11575 case 512:
5fc35d96 11576 if (!vex.w
b763d508 11577 || bytemode == vex_vsib_q_w_dq_mode)
43234a1e
L
11578 indexes64 = indexes32 = names_zmm;
11579 else
11580 indexes64 = indexes32 = names_ymm;
11581 break;
6c30d220
L
11582 default:
11583 abort ();
11584 }
11585 break;
11586 default:
11587 haveindex = vindex != 4;
11588 break;
11589 }
11590 scale = sib.scale;
11591 base = sib.base;
252b5132
RH
11592 codep++;
11593 }
260cd341
LC
11594 else
11595 {
11596 /* mandatory non-vector SIB must have sib */
11597 if (bytemode == vex_sibmem_mode)
11598 {
11599 oappend ("(bad)");
11600 return;
11601 }
11602 }
82c18208 11603 rbase = base + add;
252b5132 11604
7967e09e 11605 switch (modrm.mod)
252b5132
RH
11606 {
11607 case 0:
82c18208 11608 if (base == 5)
252b5132
RH
11609 {
11610 havebase = 0;
cb712a9e 11611 if (address_mode == mode_64bit && !havesib)
52b15da3
JH
11612 riprel = 1;
11613 disp = get32s ();
d276ec69
JB
11614 if (riprel && bytemode == v_bndmk_mode)
11615 {
11616 oappend ("(bad)");
11617 return;
11618 }
252b5132
RH
11619 }
11620 break;
11621 case 1:
11622 FETCH_DATA (the_info, codep + 1);
11623 disp = *codep++;
11624 if ((disp & 0x80) != 0)
11625 disp -= 0x100;
43234a1e
L
11626 if (vex.evex && shift > 0)
11627 disp <<= shift;
252b5132
RH
11628 break;
11629 case 2:
52b15da3 11630 disp = get32s ();
252b5132
RH
11631 break;
11632 }
11633
1bc60e56
L
11634 needindex = 0;
11635 needaddr32 = 0;
11636 if (havesib
11637 && !havebase
11638 && !haveindex
11639 && address_mode != mode_16bit)
11640 {
11641 if (address_mode == mode_64bit)
11642 {
8e58ef80
L
11643 if (addr32flag)
11644 {
11645 /* Without base nor index registers, zero-extend the
11646 lower 32-bit displacement to 64 bits. */
11647 disp = (unsigned int) disp;
bf4ba07c 11648 needindex = 1;
8e58ef80 11649 }
1bc60e56
L
11650 needaddr32 = 1;
11651 }
11652 else
11653 {
11654 /* In 32-bit mode, we need index register to tell [offset]
11655 from [eiz*1 + offset]. */
11656 needindex = 1;
11657 }
11658 }
11659
20afcfb7
L
11660 havedisp = (havebase
11661 || needindex
11662 || (havesib && (haveindex || scale != 0)));
5d669648 11663
252b5132 11664 if (!intel_syntax)
82c18208 11665 if (modrm.mod != 0 || base == 5)
db6eb5be 11666 {
5d669648
L
11667 if (havedisp || riprel)
11668 print_displacement (scratchbuf, disp);
11669 else
11670 print_operand_value (scratchbuf, 1, disp);
db6eb5be 11671 oappend (scratchbuf);
52b15da3
JH
11672 if (riprel)
11673 {
11674 set_op (disp, 1);
28596323 11675 oappend (!addr32flag ? "(%rip)" : "(%eip)");
52b15da3 11676 }
db6eb5be 11677 }
2da11e11 11678
c1dc7af5 11679 if ((havebase || haveindex || needindex || needaddr32 || riprel)
a23b33b3
JB
11680 && (address_mode != mode_64bit
11681 || ((bytemode != v_bnd_mode)
11682 && (bytemode != v_bndmk_mode)
11683 && (bytemode != bnd_mode)
11684 && (bytemode != bnd_swap_mode))))
87767711
JB
11685 used_prefixes |= PREFIX_ADDR;
11686
5d669648 11687 if (havedisp || (intel_syntax && riprel))
252b5132 11688 {
252b5132 11689 *obufp++ = open_char;
52b15da3 11690 if (intel_syntax && riprel)
185b1163
L
11691 {
11692 set_op (disp, 1);
28596323 11693 oappend (!addr32flag ? "rip" : "eip");
185b1163 11694 }
db6eb5be 11695 *obufp = '\0';
252b5132 11696 if (havebase)
7e8b059b 11697 oappend (address_mode == mode_64bit && !addr32flag
82c18208 11698 ? names64[rbase] : names32[rbase]);
252b5132
RH
11699 if (havesib)
11700 {
db51cc60
L
11701 /* ESP/RSP won't allow index. If base isn't ESP/RSP,
11702 print index to tell base + index from base. */
11703 if (scale != 0
20afcfb7 11704 || needindex
db51cc60
L
11705 || haveindex
11706 || (havebase && base != ESP_REG_NUM))
252b5132 11707 {
9306ca4a 11708 if (!intel_syntax || havebase)
db6eb5be 11709 {
9306ca4a
JB
11710 *obufp++ = separator_char;
11711 *obufp = '\0';
db6eb5be 11712 }
db51cc60 11713 if (haveindex)
7e8b059b 11714 oappend (address_mode == mode_64bit && !addr32flag
6c30d220 11715 ? indexes64[vindex] : indexes32[vindex]);
db51cc60 11716 else
7e8b059b 11717 oappend (address_mode == mode_64bit && !addr32flag
db51cc60
L
11718 ? index64 : index32);
11719
db6eb5be
AM
11720 *obufp++ = scale_char;
11721 *obufp = '\0';
11722 sprintf (scratchbuf, "%d", 1 << scale);
11723 oappend (scratchbuf);
11724 }
252b5132 11725 }
185b1163 11726 if (intel_syntax
82c18208 11727 && (disp || modrm.mod != 0 || base == 5))
3d456fa1 11728 {
db51cc60 11729 if (!havedisp || (bfd_signed_vma) disp >= 0)
3d456fa1
JB
11730 {
11731 *obufp++ = '+';
11732 *obufp = '\0';
11733 }
05203043 11734 else if (modrm.mod != 1 && disp != -disp)
3d456fa1
JB
11735 {
11736 *obufp++ = '-';
11737 *obufp = '\0';
b4b39349 11738 disp = -disp;
3d456fa1
JB
11739 }
11740
db51cc60
L
11741 if (havedisp)
11742 print_displacement (scratchbuf, disp);
11743 else
11744 print_operand_value (scratchbuf, 1, disp);
3d456fa1
JB
11745 oappend (scratchbuf);
11746 }
252b5132
RH
11747
11748 *obufp++ = close_char;
db6eb5be 11749 *obufp = '\0';
252b5132
RH
11750 }
11751 else if (intel_syntax)
db6eb5be 11752 {
82c18208 11753 if (modrm.mod != 0 || base == 5)
db6eb5be 11754 {
285ca992 11755 if (!active_seg_prefix)
252b5132 11756 {
d708bcba 11757 oappend (names_seg[ds_reg - es_reg]);
252b5132
RH
11758 oappend (":");
11759 }
52b15da3 11760 print_operand_value (scratchbuf, 1, disp);
db6eb5be
AM
11761 oappend (scratchbuf);
11762 }
11763 }
252b5132 11764 }
a23b33b3
JB
11765 else if (bytemode == v_bnd_mode
11766 || bytemode == v_bndmk_mode
11767 || bytemode == bnd_mode
11768 || bytemode == bnd_swap_mode)
11769 {
11770 oappend ("(bad)");
11771 return;
11772 }
252b5132 11773 else
f16cd0d5
L
11774 {
11775 /* 16 bit address mode */
11776 used_prefixes |= prefixes & PREFIX_ADDR;
7967e09e 11777 switch (modrm.mod)
252b5132
RH
11778 {
11779 case 0:
7967e09e 11780 if (modrm.rm == 6)
252b5132
RH
11781 {
11782 disp = get16 ();
11783 if ((disp & 0x8000) != 0)
11784 disp -= 0x10000;
11785 }
11786 break;
11787 case 1:
11788 FETCH_DATA (the_info, codep + 1);
11789 disp = *codep++;
11790 if ((disp & 0x80) != 0)
11791 disp -= 0x100;
65f3ed04
JB
11792 if (vex.evex && shift > 0)
11793 disp <<= shift;
252b5132
RH
11794 break;
11795 case 2:
11796 disp = get16 ();
11797 if ((disp & 0x8000) != 0)
11798 disp -= 0x10000;
11799 break;
11800 }
11801
11802 if (!intel_syntax)
7967e09e 11803 if (modrm.mod != 0 || modrm.rm == 6)
db6eb5be 11804 {
5d669648 11805 print_displacement (scratchbuf, disp);
db6eb5be
AM
11806 oappend (scratchbuf);
11807 }
252b5132 11808
7967e09e 11809 if (modrm.mod != 0 || modrm.rm != 6)
252b5132
RH
11810 {
11811 *obufp++ = open_char;
db6eb5be 11812 *obufp = '\0';
7967e09e 11813 oappend (index16[modrm.rm]);
5d669648
L
11814 if (intel_syntax
11815 && (disp || modrm.mod != 0 || modrm.rm == 6))
3d456fa1 11816 {
5d669648 11817 if ((bfd_signed_vma) disp >= 0)
3d456fa1
JB
11818 {
11819 *obufp++ = '+';
11820 *obufp = '\0';
11821 }
7967e09e 11822 else if (modrm.mod != 1)
3d456fa1
JB
11823 {
11824 *obufp++ = '-';
11825 *obufp = '\0';
b4b39349 11826 disp = -disp;
3d456fa1
JB
11827 }
11828
5d669648 11829 print_displacement (scratchbuf, disp);
3d456fa1
JB
11830 oappend (scratchbuf);
11831 }
11832
db6eb5be
AM
11833 *obufp++ = close_char;
11834 *obufp = '\0';
252b5132 11835 }
3d456fa1
JB
11836 else if (intel_syntax)
11837 {
285ca992 11838 if (!active_seg_prefix)
3d456fa1
JB
11839 {
11840 oappend (names_seg[ds_reg - es_reg]);
11841 oappend (":");
11842 }
11843 print_operand_value (scratchbuf, 1, disp & 0xffff);
11844 oappend (scratchbuf);
11845 }
252b5132 11846 }
ac7a2311 11847 if (vex.b
43234a1e
L
11848 && (bytemode == x_mode
11849 || bytemode == evex_half_bcst_xmmq_mode))
11850 {
90a915bf 11851 if (vex.w
90a915bf 11852 || bytemode == evex_half_bcst_xmmq_mode)
b28d1bda
IT
11853 {
11854 switch (vex.length)
11855 {
11856 case 128:
11857 oappend ("{1to2}");
11858 break;
11859 case 256:
11860 oappend ("{1to4}");
11861 break;
11862 case 512:
11863 oappend ("{1to8}");
11864 break;
11865 default:
11866 abort ();
11867 }
11868 }
43234a1e 11869 else
b28d1bda
IT
11870 {
11871 switch (vex.length)
11872 {
11873 case 128:
11874 oappend ("{1to4}");
11875 break;
11876 case 256:
11877 oappend ("{1to8}");
11878 break;
11879 case 512:
11880 oappend ("{1to16}");
11881 break;
11882 default:
11883 abort ();
11884 }
11885 }
43234a1e 11886 }
252b5132
RH
11887}
11888
c0f3af97 11889static void
8b3f93e7 11890OP_E (int bytemode, int sizeflag)
c0f3af97
L
11891{
11892 /* Skip mod/rm byte. */
11893 MODRM_CHECK;
11894 codep++;
11895
11896 if (modrm.mod == 3)
11897 OP_E_register (bytemode, sizeflag);
11898 else
c1e679ec 11899 OP_E_memory (bytemode, sizeflag);
c0f3af97
L
11900}
11901
252b5132 11902static void
26ca5450 11903OP_G (int bytemode, int sizeflag)
252b5132 11904{
52b15da3 11905 int add = 0;
c0a30a9f 11906 const char **names;
161a04f6
L
11907 USED_REX (REX_R);
11908 if (rex & REX_R)
52b15da3 11909 add += 8;
252b5132
RH
11910 switch (bytemode)
11911 {
11912 case b_mode:
e184e611
JB
11913 if (modrm.reg & 4)
11914 USED_REX (0);
52b15da3 11915 if (rex)
7967e09e 11916 oappend (names8rex[modrm.reg + add]);
52b15da3 11917 else
7967e09e 11918 oappend (names8[modrm.reg + add]);
252b5132
RH
11919 break;
11920 case w_mode:
7967e09e 11921 oappend (names16[modrm.reg + add]);
252b5132
RH
11922 break;
11923 case d_mode:
1ba585e8
IT
11924 case db_mode:
11925 case dw_mode:
7967e09e 11926 oappend (names32[modrm.reg + add]);
52b15da3
JH
11927 break;
11928 case q_mode:
7967e09e 11929 oappend (names64[modrm.reg + add]);
252b5132 11930 break;
7e8b059b 11931 case bnd_mode:
0d96e4df
L
11932 if (modrm.reg > 0x3)
11933 {
11934 oappend ("(bad)");
11935 return;
11936 }
7e8b059b
L
11937 oappend (names_bnd[modrm.reg]);
11938 break;
252b5132 11939 case v_mode:
9306ca4a 11940 case dq_mode:
42903f7f
L
11941 case dqb_mode:
11942 case dqd_mode:
9306ca4a 11943 case dqw_mode:
bc31405e 11944 case movsxd_mode:
161a04f6
L
11945 USED_REX (REX_W);
11946 if (rex & REX_W)
7967e09e 11947 oappend (names64[modrm.reg + add]);
035e7389
JB
11948 else if (bytemode != v_mode && bytemode != movsxd_mode)
11949 oappend (names32[modrm.reg + add]);
252b5132 11950 else
f16cd0d5 11951 {
035e7389 11952 if (sizeflag & DFLAG)
f16cd0d5
L
11953 oappend (names32[modrm.reg + add]);
11954 else
11955 oappend (names16[modrm.reg + add]);
11956 used_prefixes |= (prefixes & PREFIX_DATA);
11957 }
252b5132 11958 break;
c0a30a9f
L
11959 case va_mode:
11960 names = (address_mode == mode_64bit
11961 ? names64 : names32);
11962 if (!(prefixes & PREFIX_ADDR))
11963 {
11964 if (address_mode == mode_16bit)
11965 names = names16;
11966 }
11967 else
11968 {
11969 /* Remove "addr16/addr32". */
11970 all_prefixes[last_addr_prefix] = 0;
11971 names = (address_mode != mode_32bit
11972 ? names32 : names16);
11973 used_prefixes |= PREFIX_ADDR;
11974 }
11975 oappend (names[modrm.reg + add]);
11976 break;
90700ea2 11977 case m_mode:
cb712a9e 11978 if (address_mode == mode_64bit)
7967e09e 11979 oappend (names64[modrm.reg + add]);
90700ea2 11980 else
7967e09e 11981 oappend (names32[modrm.reg + add]);
90700ea2 11982 break;
1ba585e8 11983 case mask_bd_mode:
43234a1e 11984 case mask_mode:
9889cbb1
L
11985 if ((modrm.reg + add) > 0x7)
11986 {
11987 oappend ("(bad)");
11988 return;
11989 }
43234a1e
L
11990 oappend (names_mask[modrm.reg + add]);
11991 break;
252b5132
RH
11992 default:
11993 oappend (INTERNAL_DISASSEMBLER_ERROR);
11994 break;
11995 }
11996}
11997
52b15da3 11998static bfd_vma
26ca5450 11999get64 (void)
52b15da3 12000{
5dd0794d 12001 bfd_vma x;
52b15da3 12002#ifdef BFD64
5dd0794d
AM
12003 unsigned int a;
12004 unsigned int b;
12005
52b15da3
JH
12006 FETCH_DATA (the_info, codep + 8);
12007 a = *codep++ & 0xff;
12008 a |= (*codep++ & 0xff) << 8;
12009 a |= (*codep++ & 0xff) << 16;
070fe95d 12010 a |= (*codep++ & 0xffu) << 24;
5dd0794d 12011 b = *codep++ & 0xff;
52b15da3
JH
12012 b |= (*codep++ & 0xff) << 8;
12013 b |= (*codep++ & 0xff) << 16;
070fe95d 12014 b |= (*codep++ & 0xffu) << 24;
52b15da3
JH
12015 x = a + ((bfd_vma) b << 32);
12016#else
6608db57 12017 abort ();
5dd0794d 12018 x = 0;
52b15da3
JH
12019#endif
12020 return x;
12021}
12022
12023static bfd_signed_vma
26ca5450 12024get32 (void)
252b5132 12025{
b4b39349 12026 bfd_vma x = 0;
252b5132
RH
12027
12028 FETCH_DATA (the_info, codep + 4);
b4b39349
AM
12029 x = *codep++ & (bfd_vma) 0xff;
12030 x |= (*codep++ & (bfd_vma) 0xff) << 8;
12031 x |= (*codep++ & (bfd_vma) 0xff) << 16;
12032 x |= (*codep++ & (bfd_vma) 0xff) << 24;
52b15da3
JH
12033 return x;
12034}
12035
12036static bfd_signed_vma
26ca5450 12037get32s (void)
52b15da3 12038{
b4b39349 12039 bfd_vma x = 0;
52b15da3
JH
12040
12041 FETCH_DATA (the_info, codep + 4);
b4b39349
AM
12042 x = *codep++ & (bfd_vma) 0xff;
12043 x |= (*codep++ & (bfd_vma) 0xff) << 8;
12044 x |= (*codep++ & (bfd_vma) 0xff) << 16;
12045 x |= (*codep++ & (bfd_vma) 0xff) << 24;
52b15da3 12046
b4b39349 12047 x = (x ^ ((bfd_vma) 1 << 31)) - ((bfd_vma) 1 << 31);
52b15da3 12048
252b5132
RH
12049 return x;
12050}
12051
12052static int
26ca5450 12053get16 (void)
252b5132
RH
12054{
12055 int x = 0;
12056
12057 FETCH_DATA (the_info, codep + 2);
12058 x = *codep++ & 0xff;
12059 x |= (*codep++ & 0xff) << 8;
12060 return x;
12061}
12062
12063static void
26ca5450 12064set_op (bfd_vma op, int riprel)
252b5132
RH
12065{
12066 op_index[op_ad] = op_ad;
cb712a9e 12067 if (address_mode == mode_64bit)
7081ff04
AJ
12068 {
12069 op_address[op_ad] = op;
12070 op_riprel[op_ad] = riprel;
12071 }
12072 else
12073 {
12074 /* Mask to get a 32-bit address. */
12075 op_address[op_ad] = op & 0xffffffff;
12076 op_riprel[op_ad] = riprel & 0xffffffff;
12077 }
252b5132
RH
12078}
12079
12080static void
26ca5450 12081OP_REG (int code, int sizeflag)
252b5132 12082{
2da11e11 12083 const char *s;
9b60702d 12084 int add;
de882298
RM
12085
12086 switch (code)
12087 {
12088 case es_reg: case ss_reg: case cs_reg:
12089 case ds_reg: case fs_reg: case gs_reg:
12090 oappend (names_seg[code - es_reg]);
12091 return;
12092 }
12093
161a04f6
L
12094 USED_REX (REX_B);
12095 if (rex & REX_B)
52b15da3 12096 add = 8;
9b60702d
L
12097 else
12098 add = 0;
52b15da3
JH
12099
12100 switch (code)
12101 {
52b15da3
JH
12102 case ax_reg: case cx_reg: case dx_reg: case bx_reg:
12103 case sp_reg: case bp_reg: case si_reg: case di_reg:
12104 s = names16[code - ax_reg + add];
12105 break;
e184e611 12106 case ah_reg: case ch_reg: case dh_reg: case bh_reg:
52b15da3 12107 USED_REX (0);
e184e611
JB
12108 /* Fall through. */
12109 case al_reg: case cl_reg: case dl_reg: case bl_reg:
52b15da3
JH
12110 if (rex)
12111 s = names8rex[code - al_reg + add];
12112 else
12113 s = names8[code - al_reg];
12114 break;
6439fc28
AM
12115 case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
12116 case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
7bb15c6f 12117 if (address_mode == mode_64bit
6c067bbb 12118 && ((sizeflag & DFLAG) || (rex & REX_W)))
6439fc28
AM
12119 {
12120 s = names64[code - rAX_reg + add];
12121 break;
12122 }
12123 code += eAX_reg - rAX_reg;
6608db57 12124 /* Fall through. */
52b15da3
JH
12125 case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
12126 case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
161a04f6
L
12127 USED_REX (REX_W);
12128 if (rex & REX_W)
52b15da3 12129 s = names64[code - eAX_reg + add];
52b15da3 12130 else
f16cd0d5
L
12131 {
12132 if (sizeflag & DFLAG)
12133 s = names32[code - eAX_reg + add];
12134 else
12135 s = names16[code - eAX_reg + add];
12136 used_prefixes |= (prefixes & PREFIX_DATA);
12137 }
52b15da3 12138 break;
52b15da3
JH
12139 default:
12140 s = INTERNAL_DISASSEMBLER_ERROR;
12141 break;
12142 }
12143 oappend (s);
12144}
12145
12146static void
26ca5450 12147OP_IMREG (int code, int sizeflag)
52b15da3
JH
12148{
12149 const char *s;
252b5132
RH
12150
12151 switch (code)
12152 {
12153 case indir_dx_reg:
d708bcba 12154 if (intel_syntax)
52fd6d94 12155 s = "dx";
d708bcba 12156 else
db6eb5be 12157 s = "(%dx)";
252b5132 12158 break;
e8b5d5f9
JB
12159 case al_reg: case cl_reg:
12160 s = names8[code - al_reg];
252b5132 12161 break;
e8b5d5f9 12162 case eAX_reg:
161a04f6
L
12163 USED_REX (REX_W);
12164 if (rex & REX_W)
f16cd0d5 12165 {
e8b5d5f9
JB
12166 s = *names64;
12167 break;
f16cd0d5 12168 }
e8b5d5f9 12169 /* Fall through. */
52fd6d94 12170 case z_mode_ax_reg:
161a04f6 12171 if ((rex & REX_W) || (sizeflag & DFLAG))
52fd6d94
JB
12172 s = *names32;
12173 else
12174 s = *names16;
161a04f6 12175 if (!(rex & REX_W))
52fd6d94
JB
12176 used_prefixes |= (prefixes & PREFIX_DATA);
12177 break;
252b5132
RH
12178 default:
12179 s = INTERNAL_DISASSEMBLER_ERROR;
12180 break;
12181 }
12182 oappend (s);
12183}
12184
12185static void
26ca5450 12186OP_I (int bytemode, int sizeflag)
252b5132 12187{
52b15da3
JH
12188 bfd_signed_vma op;
12189 bfd_signed_vma mask = -1;
252b5132
RH
12190
12191 switch (bytemode)
12192 {
12193 case b_mode:
12194 FETCH_DATA (the_info, codep + 1);
52b15da3
JH
12195 op = *codep++;
12196 mask = 0xff;
12197 break;
252b5132 12198 case v_mode:
161a04f6
L
12199 USED_REX (REX_W);
12200 if (rex & REX_W)
52b15da3 12201 op = get32s ();
252b5132 12202 else
52b15da3 12203 {
f16cd0d5
L
12204 if (sizeflag & DFLAG)
12205 {
12206 op = get32 ();
12207 mask = 0xffffffff;
12208 }
12209 else
12210 {
12211 op = get16 ();
12212 mask = 0xfffff;
12213 }
12214 used_prefixes |= (prefixes & PREFIX_DATA);
52b15da3 12215 }
252b5132 12216 break;
c1dc7af5
JB
12217 case d_mode:
12218 mask = 0xffffffff;
12219 op = get32 ();
12220 break;
252b5132 12221 case w_mode:
52b15da3 12222 mask = 0xfffff;
252b5132
RH
12223 op = get16 ();
12224 break;
9306ca4a
JB
12225 case const_1_mode:
12226 if (intel_syntax)
6c067bbb 12227 oappend ("1");
9306ca4a 12228 return;
252b5132
RH
12229 default:
12230 oappend (INTERNAL_DISASSEMBLER_ERROR);
12231 return;
12232 }
12233
52b15da3
JH
12234 op &= mask;
12235 scratchbuf[0] = '$';
d708bcba 12236 print_operand_value (scratchbuf + 1, 1, op);
9ce09ba2 12237 oappend_maybe_intel (scratchbuf);
52b15da3
JH
12238 scratchbuf[0] = '\0';
12239}
12240
12241static void
26ca5450 12242OP_I64 (int bytemode, int sizeflag)
52b15da3 12243{
a280ab8e 12244 if (bytemode != v_mode || address_mode != mode_64bit || !(rex & REX_W))
6439fc28
AM
12245 {
12246 OP_I (bytemode, sizeflag);
12247 return;
12248 }
12249
a280ab8e 12250 USED_REX (REX_W);
52b15da3 12251
52b15da3 12252 scratchbuf[0] = '$';
a280ab8e 12253 print_operand_value (scratchbuf + 1, 1, get64 ());
9ce09ba2 12254 oappend_maybe_intel (scratchbuf);
252b5132
RH
12255 scratchbuf[0] = '\0';
12256}
12257
12258static void
26ca5450 12259OP_sI (int bytemode, int sizeflag)
252b5132 12260{
52b15da3 12261 bfd_signed_vma op;
252b5132
RH
12262
12263 switch (bytemode)
12264 {
12265 case b_mode:
e3949f17 12266 case b_T_mode:
252b5132
RH
12267 FETCH_DATA (the_info, codep + 1);
12268 op = *codep++;
12269 if ((op & 0x80) != 0)
12270 op -= 0x100;
e3949f17
L
12271 if (bytemode == b_T_mode)
12272 {
12273 if (address_mode != mode_64bit
7bb15c6f 12274 || !((sizeflag & DFLAG) || (rex & REX_W)))
e3949f17 12275 {
6c067bbb
RM
12276 /* The operand-size prefix is overridden by a REX prefix. */
12277 if ((sizeflag & DFLAG) || (rex & REX_W))
e3949f17
L
12278 op &= 0xffffffff;
12279 else
12280 op &= 0xffff;
12281 }
12282 }
12283 else
12284 {
12285 if (!(rex & REX_W))
12286 {
12287 if (sizeflag & DFLAG)
12288 op &= 0xffffffff;
12289 else
12290 op &= 0xffff;
12291 }
12292 }
252b5132
RH
12293 break;
12294 case v_mode:
7bb15c6f
RM
12295 /* The operand-size prefix is overridden by a REX prefix. */
12296 if ((sizeflag & DFLAG) || (rex & REX_W))
52b15da3 12297 op = get32s ();
252b5132 12298 else
d9e3625e 12299 op = get16 ();
252b5132
RH
12300 break;
12301 default:
12302 oappend (INTERNAL_DISASSEMBLER_ERROR);
12303 return;
12304 }
52b15da3
JH
12305
12306 scratchbuf[0] = '$';
12307 print_operand_value (scratchbuf + 1, 1, op);
9ce09ba2 12308 oappend_maybe_intel (scratchbuf);
252b5132
RH
12309}
12310
12311static void
26ca5450 12312OP_J (int bytemode, int sizeflag)
252b5132 12313{
52b15da3 12314 bfd_vma disp;
7081ff04 12315 bfd_vma mask = -1;
65ca155d 12316 bfd_vma segment = 0;
252b5132
RH
12317
12318 switch (bytemode)
12319 {
12320 case b_mode:
12321 FETCH_DATA (the_info, codep + 1);
12322 disp = *codep++;
12323 if ((disp & 0x80) != 0)
12324 disp -= 0x100;
12325 break;
12326 case v_mode:
376cd056 12327 case dqw_mode:
5db04b09
L
12328 if ((sizeflag & DFLAG)
12329 || (address_mode == mode_64bit
d835a58b 12330 && ((isa64 == intel64 && bytemode != dqw_mode)
376cd056 12331 || (rex & REX_W))))
52b15da3 12332 disp = get32s ();
252b5132
RH
12333 else
12334 {
12335 disp = get16 ();
206717e8
L
12336 if ((disp & 0x8000) != 0)
12337 disp -= 0x10000;
65ca155d
L
12338 /* In 16bit mode, address is wrapped around at 64k within
12339 the same segment. Otherwise, a data16 prefix on a jump
12340 instruction means that the pc is masked to 16 bits after
12341 the displacement is added! */
12342 mask = 0xffff;
12343 if ((prefixes & PREFIX_DATA) == 0)
4fd7268a 12344 segment = ((start_pc + (codep - start_codep))
65ca155d 12345 & ~((bfd_vma) 0xffff));
252b5132 12346 }
5db04b09 12347 if (address_mode != mode_64bit
d835a58b 12348 || (isa64 != intel64 && !(rex & REX_W)))
f16cd0d5 12349 used_prefixes |= (prefixes & PREFIX_DATA);
252b5132
RH
12350 break;
12351 default:
12352 oappend (INTERNAL_DISASSEMBLER_ERROR);
12353 return;
12354 }
42d5f9c6 12355 disp = ((start_pc + (codep - start_codep) + disp) & mask) | segment;
52b15da3
JH
12356 set_op (disp, 0);
12357 print_operand_value (scratchbuf, 1, disp);
252b5132
RH
12358 oappend (scratchbuf);
12359}
12360
252b5132 12361static void
ed7841b3 12362OP_SEG (int bytemode, int sizeflag)
252b5132 12363{
ed7841b3 12364 if (bytemode == w_mode)
7967e09e 12365 oappend (names_seg[modrm.reg]);
ed7841b3 12366 else
7967e09e 12367 OP_E (modrm.mod == 3 ? bytemode : w_mode, sizeflag);
252b5132
RH
12368}
12369
12370static void
26ca5450 12371OP_DIR (int dummy ATTRIBUTE_UNUSED, int sizeflag)
252b5132
RH
12372{
12373 int seg, offset;
12374
c608c12e 12375 if (sizeflag & DFLAG)
252b5132 12376 {
c608c12e
AM
12377 offset = get32 ();
12378 seg = get16 ();
252b5132 12379 }
c608c12e
AM
12380 else
12381 {
12382 offset = get16 ();
12383 seg = get16 ();
12384 }
7d421014 12385 used_prefixes |= (prefixes & PREFIX_DATA);
d708bcba 12386 if (intel_syntax)
3f31e633 12387 sprintf (scratchbuf, "0x%x:0x%x", seg, offset);
d708bcba
AM
12388 else
12389 sprintf (scratchbuf, "$0x%x,$0x%x", seg, offset);
c608c12e 12390 oappend (scratchbuf);
252b5132
RH
12391}
12392
252b5132 12393static void
3f31e633 12394OP_OFF (int bytemode, int sizeflag)
252b5132 12395{
52b15da3 12396 bfd_vma off;
252b5132 12397
3f31e633
JB
12398 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
12399 intel_operand_size (bytemode, sizeflag);
252b5132
RH
12400 append_seg ();
12401
cb712a9e 12402 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
252b5132
RH
12403 off = get32 ();
12404 else
12405 off = get16 ();
12406
12407 if (intel_syntax)
12408 {
285ca992 12409 if (!active_seg_prefix)
252b5132 12410 {
d708bcba 12411 oappend (names_seg[ds_reg - es_reg]);
252b5132
RH
12412 oappend (":");
12413 }
12414 }
52b15da3
JH
12415 print_operand_value (scratchbuf, 1, off);
12416 oappend (scratchbuf);
12417}
6439fc28 12418
52b15da3 12419static void
3f31e633 12420OP_OFF64 (int bytemode, int sizeflag)
52b15da3
JH
12421{
12422 bfd_vma off;
12423
539e75ad
L
12424 if (address_mode != mode_64bit
12425 || (prefixes & PREFIX_ADDR))
6439fc28
AM
12426 {
12427 OP_OFF (bytemode, sizeflag);
12428 return;
12429 }
12430
3f31e633
JB
12431 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
12432 intel_operand_size (bytemode, sizeflag);
52b15da3
JH
12433 append_seg ();
12434
6608db57 12435 off = get64 ();
52b15da3
JH
12436
12437 if (intel_syntax)
12438 {
285ca992 12439 if (!active_seg_prefix)
52b15da3 12440 {
d708bcba 12441 oappend (names_seg[ds_reg - es_reg]);
52b15da3
JH
12442 oappend (":");
12443 }
12444 }
12445 print_operand_value (scratchbuf, 1, off);
252b5132
RH
12446 oappend (scratchbuf);
12447}
12448
12449static void
26ca5450 12450ptr_reg (int code, int sizeflag)
252b5132 12451{
2da11e11 12452 const char *s;
d708bcba 12453
1d9f512f 12454 *obufp++ = open_char;
20f0a1fc 12455 used_prefixes |= (prefixes & PREFIX_ADDR);
cb712a9e 12456 if (address_mode == mode_64bit)
c1a64871
JH
12457 {
12458 if (!(sizeflag & AFLAG))
db6eb5be 12459 s = names32[code - eAX_reg];
c1a64871 12460 else
db6eb5be 12461 s = names64[code - eAX_reg];
c1a64871 12462 }
52b15da3 12463 else if (sizeflag & AFLAG)
252b5132
RH
12464 s = names32[code - eAX_reg];
12465 else
12466 s = names16[code - eAX_reg];
12467 oappend (s);
1d9f512f
AM
12468 *obufp++ = close_char;
12469 *obufp = 0;
252b5132
RH
12470}
12471
12472static void
26ca5450 12473OP_ESreg (int code, int sizeflag)
252b5132 12474{
9306ca4a 12475 if (intel_syntax)
52fd6d94
JB
12476 {
12477 switch (codep[-1])
12478 {
12479 case 0x6d: /* insw/insl */
12480 intel_operand_size (z_mode, sizeflag);
12481 break;
12482 case 0xa5: /* movsw/movsl/movsq */
12483 case 0xa7: /* cmpsw/cmpsl/cmpsq */
12484 case 0xab: /* stosw/stosl */
12485 case 0xaf: /* scasw/scasl */
12486 intel_operand_size (v_mode, sizeflag);
12487 break;
12488 default:
12489 intel_operand_size (b_mode, sizeflag);
12490 }
12491 }
9ce09ba2 12492 oappend_maybe_intel ("%es:");
252b5132
RH
12493 ptr_reg (code, sizeflag);
12494}
12495
12496static void
26ca5450 12497OP_DSreg (int code, int sizeflag)
252b5132 12498{
9306ca4a 12499 if (intel_syntax)
52fd6d94
JB
12500 {
12501 switch (codep[-1])
12502 {
12503 case 0x6f: /* outsw/outsl */
12504 intel_operand_size (z_mode, sizeflag);
12505 break;
12506 case 0xa5: /* movsw/movsl/movsq */
12507 case 0xa7: /* cmpsw/cmpsl/cmpsq */
12508 case 0xad: /* lodsw/lodsl/lodsq */
12509 intel_operand_size (v_mode, sizeflag);
12510 break;
12511 default:
12512 intel_operand_size (b_mode, sizeflag);
12513 }
12514 }
285ca992
L
12515 /* Set active_seg_prefix to PREFIX_DS if it is unset so that the
12516 default segment register DS is printed. */
12517 if (!active_seg_prefix)
12518 active_seg_prefix = PREFIX_DS;
6608db57 12519 append_seg ();
252b5132
RH
12520 ptr_reg (code, sizeflag);
12521}
12522
252b5132 12523static void
26ca5450 12524OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 12525{
9b60702d 12526 int add;
161a04f6 12527 if (rex & REX_R)
c4a530c5 12528 {
161a04f6 12529 USED_REX (REX_R);
c4a530c5
JB
12530 add = 8;
12531 }
cb712a9e 12532 else if (address_mode != mode_64bit && (prefixes & PREFIX_LOCK))
c4a530c5 12533 {
f16cd0d5 12534 all_prefixes[last_lock_prefix] = 0;
c4a530c5
JB
12535 used_prefixes |= PREFIX_LOCK;
12536 add = 8;
12537 }
9b60702d
L
12538 else
12539 add = 0;
7967e09e 12540 sprintf (scratchbuf, "%%cr%d", modrm.reg + add);
9ce09ba2 12541 oappend_maybe_intel (scratchbuf);
252b5132
RH
12542}
12543
252b5132 12544static void
26ca5450 12545OP_D (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 12546{
9b60702d 12547 int add;
161a04f6
L
12548 USED_REX (REX_R);
12549 if (rex & REX_R)
52b15da3 12550 add = 8;
9b60702d
L
12551 else
12552 add = 0;
d708bcba 12553 if (intel_syntax)
bfbd9438 12554 sprintf (scratchbuf, "dr%d", modrm.reg + add);
d708bcba 12555 else
7967e09e 12556 sprintf (scratchbuf, "%%db%d", modrm.reg + add);
252b5132
RH
12557 oappend (scratchbuf);
12558}
12559
252b5132 12560static void
26ca5450 12561OP_T (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 12562{
7967e09e 12563 sprintf (scratchbuf, "%%tr%d", modrm.reg);
9ce09ba2 12564 oappend_maybe_intel (scratchbuf);
252b5132
RH
12565}
12566
252b5132 12567static void
26ca5450 12568OP_MMX (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 12569{
b9733481
L
12570 int reg = modrm.reg;
12571 const char **names;
12572
041bd2e0
JH
12573 used_prefixes |= (prefixes & PREFIX_DATA);
12574 if (prefixes & PREFIX_DATA)
20f0a1fc 12575 {
b9733481 12576 names = names_xmm;
161a04f6
L
12577 USED_REX (REX_R);
12578 if (rex & REX_R)
b9733481 12579 reg += 8;
20f0a1fc 12580 }
041bd2e0 12581 else
b9733481
L
12582 names = names_mm;
12583 oappend (names[reg]);
252b5132
RH
12584}
12585
c608c12e 12586static void
c0f3af97 12587OP_XMM (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
c608c12e 12588{
b9733481
L
12589 int reg = modrm.reg;
12590 const char **names;
12591
161a04f6
L
12592 USED_REX (REX_R);
12593 if (rex & REX_R)
b9733481 12594 reg += 8;
43234a1e
L
12595 if (vex.evex)
12596 {
12597 if (!vex.r)
12598 reg += 16;
12599 }
12600
fd1fd061
JB
12601 if (bytemode == xmmq_mode
12602 || bytemode == evex_half_bcst_xmmq_mode)
43234a1e
L
12603 {
12604 switch (vex.length)
12605 {
12606 case 128:
12607 case 256:
12608 names = names_xmm;
12609 break;
12610 case 512:
12611 names = names_ymm;
12612 break;
12613 default:
12614 abort ();
12615 }
12616 }
fd1fd061
JB
12617 else if (bytemode == ymm_mode)
12618 names = names_ymm;
260cd341
LC
12619 else if (bytemode == tmm_mode)
12620 {
12621 modrm.reg = reg;
12622 if (reg >= 8)
12623 {
12624 oappend ("(bad)");
12625 return;
12626 }
12627 names = names_tmm;
12628 }
fd1fd061
JB
12629 else if (need_vex
12630 && bytemode != xmm_mode
12631 && bytemode != scalar_mode)
12632 {
12633 switch (vex.length)
12634 {
12635 case 128:
12636 names = names_xmm;
12637 break;
12638 case 256:
12639 if (vex.w
12640 || bytemode != vex_vsib_q_w_dq_mode)
12641 names = names_ymm;
12642 else
12643 names = names_xmm;
12644 break;
12645 case 512:
12646 if (vex.w
12647 || bytemode != vex_vsib_q_w_dq_mode)
12648 names = names_zmm;
12649 else
12650 names = names_ymm;
12651 break;
12652 default:
12653 abort ();
12654 }
12655 }
c0f3af97 12656 else
b9733481
L
12657 names = names_xmm;
12658 oappend (names[reg]);
c608c12e
AM
12659}
12660
252b5132 12661static void
26ca5450 12662OP_EM (int bytemode, int sizeflag)
252b5132 12663{
b9733481
L
12664 int reg;
12665 const char **names;
12666
7967e09e 12667 if (modrm.mod != 3)
252b5132 12668 {
b6169b20
L
12669 if (intel_syntax
12670 && (bytemode == v_mode || bytemode == v_swap_mode))
9306ca4a
JB
12671 {
12672 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
12673 used_prefixes |= (prefixes & PREFIX_DATA);
6c067bbb 12674 }
252b5132
RH
12675 OP_E (bytemode, sizeflag);
12676 return;
12677 }
12678
b6169b20
L
12679 if ((sizeflag & SUFFIX_ALWAYS) && bytemode == v_swap_mode)
12680 swap_operand ();
12681
6608db57 12682 /* Skip mod/rm byte. */
4bba6815 12683 MODRM_CHECK;
252b5132 12684 codep++;
041bd2e0 12685 used_prefixes |= (prefixes & PREFIX_DATA);
b9733481 12686 reg = modrm.rm;
041bd2e0 12687 if (prefixes & PREFIX_DATA)
20f0a1fc 12688 {
b9733481 12689 names = names_xmm;
161a04f6
L
12690 USED_REX (REX_B);
12691 if (rex & REX_B)
b9733481 12692 reg += 8;
20f0a1fc 12693 }
041bd2e0 12694 else
b9733481
L
12695 names = names_mm;
12696 oappend (names[reg]);
252b5132
RH
12697}
12698
246c51aa
L
12699/* cvt* are the only instructions in sse2 which have
12700 both SSE and MMX operands and also have 0x66 prefix
12701 in their opcode. 0x66 was originally used to differentiate
12702 between SSE and MMX instruction(operands). So we have to handle the
4d9567e0
MM
12703 cvt* separately using OP_EMC and OP_MXC */
12704static void
12705OP_EMC (int bytemode, int sizeflag)
12706{
7967e09e 12707 if (modrm.mod != 3)
4d9567e0
MM
12708 {
12709 if (intel_syntax && bytemode == v_mode)
12710 {
12711 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
12712 used_prefixes |= (prefixes & PREFIX_DATA);
6c067bbb 12713 }
4d9567e0
MM
12714 OP_E (bytemode, sizeflag);
12715 return;
12716 }
246c51aa 12717
4d9567e0
MM
12718 /* Skip mod/rm byte. */
12719 MODRM_CHECK;
12720 codep++;
12721 used_prefixes |= (prefixes & PREFIX_DATA);
b9733481 12722 oappend (names_mm[modrm.rm]);
4d9567e0
MM
12723}
12724
12725static void
12726OP_MXC (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12727{
12728 used_prefixes |= (prefixes & PREFIX_DATA);
b9733481 12729 oappend (names_mm[modrm.reg]);
4d9567e0
MM
12730}
12731
c608c12e 12732static void
26ca5450 12733OP_EX (int bytemode, int sizeflag)
c608c12e 12734{
b9733481
L
12735 int reg;
12736 const char **names;
d6f574e0
L
12737
12738 /* Skip mod/rm byte. */
12739 MODRM_CHECK;
12740 codep++;
12741
7967e09e 12742 if (modrm.mod != 3)
c608c12e 12743 {
c1e679ec 12744 OP_E_memory (bytemode, sizeflag);
c608c12e
AM
12745 return;
12746 }
d6f574e0 12747
b9733481 12748 reg = modrm.rm;
161a04f6
L
12749 USED_REX (REX_B);
12750 if (rex & REX_B)
b9733481 12751 reg += 8;
43234a1e
L
12752 if (vex.evex)
12753 {
12754 USED_REX (REX_X);
12755 if ((rex & REX_X))
12756 reg += 16;
12757 }
c608c12e 12758
b6169b20 12759 if ((sizeflag & SUFFIX_ALWAYS)
fa99fab2
L
12760 && (bytemode == x_swap_mode
12761 || bytemode == d_swap_mode
41f5efc6 12762 || bytemode == q_swap_mode))
b6169b20
L
12763 swap_operand ();
12764
c0f3af97
L
12765 if (need_vex
12766 && bytemode != xmm_mode
6c30d220
L
12767 && bytemode != xmmdw_mode
12768 && bytemode != xmmqd_mode
12769 && bytemode != xmm_mb_mode
12770 && bytemode != xmm_mw_mode
12771 && bytemode != xmm_md_mode
12772 && bytemode != xmm_mq_mode
539f890d 12773 && bytemode != xmmq_mode
43234a1e
L
12774 && bytemode != evex_half_bcst_xmmq_mode
12775 && bytemode != ymm_mode
260cd341 12776 && bytemode != tmm_mode
1c480963 12777 && bytemode != vex_scalar_w_dq_mode)
c0f3af97
L
12778 {
12779 switch (vex.length)
12780 {
12781 case 128:
b9733481 12782 names = names_xmm;
c0f3af97
L
12783 break;
12784 case 256:
b9733481 12785 names = names_ymm;
c0f3af97 12786 break;
43234a1e
L
12787 case 512:
12788 names = names_zmm;
12789 break;
c0f3af97
L
12790 default:
12791 abort ();
12792 }
12793 }
43234a1e
L
12794 else if (bytemode == xmmq_mode
12795 || bytemode == evex_half_bcst_xmmq_mode)
12796 {
12797 switch (vex.length)
12798 {
12799 case 128:
12800 case 256:
12801 names = names_xmm;
12802 break;
12803 case 512:
12804 names = names_ymm;
12805 break;
12806 default:
12807 abort ();
12808 }
12809 }
260cd341
LC
12810 else if (bytemode == tmm_mode)
12811 {
12812 modrm.rm = reg;
12813 if (reg >= 8)
12814 {
12815 oappend ("(bad)");
12816 return;
12817 }
12818 names = names_tmm;
12819 }
43234a1e
L
12820 else if (bytemode == ymm_mode)
12821 names = names_ymm;
c0f3af97 12822 else
b9733481
L
12823 names = names_xmm;
12824 oappend (names[reg]);
c608c12e
AM
12825}
12826
252b5132 12827static void
26ca5450 12828OP_MS (int bytemode, int sizeflag)
252b5132 12829{
7967e09e 12830 if (modrm.mod == 3)
2da11e11
AM
12831 OP_EM (bytemode, sizeflag);
12832 else
6608db57 12833 BadOp ();
252b5132
RH
12834}
12835
992aaec9 12836static void
26ca5450 12837OP_XS (int bytemode, int sizeflag)
992aaec9 12838{
7967e09e 12839 if (modrm.mod == 3)
992aaec9
AM
12840 OP_EX (bytemode, sizeflag);
12841 else
6608db57 12842 BadOp ();
992aaec9
AM
12843}
12844
cc0ec051
AM
12845static void
12846OP_M (int bytemode, int sizeflag)
12847{
7967e09e 12848 if (modrm.mod == 3)
75413a22
L
12849 /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
12850 BadOp ();
cc0ec051
AM
12851 else
12852 OP_E (bytemode, sizeflag);
12853}
12854
12855static void
12856OP_0f07 (int bytemode, int sizeflag)
12857{
7967e09e 12858 if (modrm.mod != 3 || modrm.rm != 0)
cc0ec051
AM
12859 BadOp ();
12860 else
12861 OP_E (bytemode, sizeflag);
12862}
12863
46e883c5 12864/* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
246c51aa 12865 32bit mode and "xchg %rax,%rax" in 64bit mode. */
46e883c5 12866
cc0ec051 12867static void
46e883c5 12868NOP_Fixup1 (int bytemode, int sizeflag)
cc0ec051 12869{
8b38ad71
L
12870 if ((prefixes & PREFIX_DATA) != 0
12871 || (rex != 0
12872 && rex != 0x48
12873 && address_mode == mode_64bit))
46e883c5
L
12874 OP_REG (bytemode, sizeflag);
12875 else
12876 strcpy (obuf, "nop");
12877}
12878
12879static void
12880NOP_Fixup2 (int bytemode, int sizeflag)
12881{
8b38ad71
L
12882 if ((prefixes & PREFIX_DATA) != 0
12883 || (rex != 0
12884 && rex != 0x48
12885 && address_mode == mode_64bit))
46e883c5 12886 OP_IMREG (bytemode, sizeflag);
cc0ec051
AM
12887}
12888
84037f8c 12889static const char *const Suffix3DNow[] = {
252b5132
RH
12890/* 00 */ NULL, NULL, NULL, NULL,
12891/* 04 */ NULL, NULL, NULL, NULL,
12892/* 08 */ NULL, NULL, NULL, NULL,
9e525108 12893/* 0C */ "pi2fw", "pi2fd", NULL, NULL,
252b5132
RH
12894/* 10 */ NULL, NULL, NULL, NULL,
12895/* 14 */ NULL, NULL, NULL, NULL,
12896/* 18 */ NULL, NULL, NULL, NULL,
9e525108 12897/* 1C */ "pf2iw", "pf2id", NULL, NULL,
252b5132
RH
12898/* 20 */ NULL, NULL, NULL, NULL,
12899/* 24 */ NULL, NULL, NULL, NULL,
12900/* 28 */ NULL, NULL, NULL, NULL,
12901/* 2C */ NULL, NULL, NULL, NULL,
12902/* 30 */ NULL, NULL, NULL, NULL,
12903/* 34 */ NULL, NULL, NULL, NULL,
12904/* 38 */ NULL, NULL, NULL, NULL,
12905/* 3C */ NULL, NULL, NULL, NULL,
12906/* 40 */ NULL, NULL, NULL, NULL,
12907/* 44 */ NULL, NULL, NULL, NULL,
12908/* 48 */ NULL, NULL, NULL, NULL,
12909/* 4C */ NULL, NULL, NULL, NULL,
12910/* 50 */ NULL, NULL, NULL, NULL,
12911/* 54 */ NULL, NULL, NULL, NULL,
12912/* 58 */ NULL, NULL, NULL, NULL,
12913/* 5C */ NULL, NULL, NULL, NULL,
12914/* 60 */ NULL, NULL, NULL, NULL,
12915/* 64 */ NULL, NULL, NULL, NULL,
12916/* 68 */ NULL, NULL, NULL, NULL,
12917/* 6C */ NULL, NULL, NULL, NULL,
12918/* 70 */ NULL, NULL, NULL, NULL,
12919/* 74 */ NULL, NULL, NULL, NULL,
12920/* 78 */ NULL, NULL, NULL, NULL,
12921/* 7C */ NULL, NULL, NULL, NULL,
12922/* 80 */ NULL, NULL, NULL, NULL,
12923/* 84 */ NULL, NULL, NULL, NULL,
9e525108
AM
12924/* 88 */ NULL, NULL, "pfnacc", NULL,
12925/* 8C */ NULL, NULL, "pfpnacc", NULL,
252b5132
RH
12926/* 90 */ "pfcmpge", NULL, NULL, NULL,
12927/* 94 */ "pfmin", NULL, "pfrcp", "pfrsqrt",
12928/* 98 */ NULL, NULL, "pfsub", NULL,
12929/* 9C */ NULL, NULL, "pfadd", NULL,
12930/* A0 */ "pfcmpgt", NULL, NULL, NULL,
12931/* A4 */ "pfmax", NULL, "pfrcpit1", "pfrsqit1",
12932/* A8 */ NULL, NULL, "pfsubr", NULL,
12933/* AC */ NULL, NULL, "pfacc", NULL,
12934/* B0 */ "pfcmpeq", NULL, NULL, NULL,
9beff690 12935/* B4 */ "pfmul", NULL, "pfrcpit2", "pmulhrw",
9e525108 12936/* B8 */ NULL, NULL, NULL, "pswapd",
252b5132
RH
12937/* BC */ NULL, NULL, NULL, "pavgusb",
12938/* C0 */ NULL, NULL, NULL, NULL,
12939/* C4 */ NULL, NULL, NULL, NULL,
12940/* C8 */ NULL, NULL, NULL, NULL,
12941/* CC */ NULL, NULL, NULL, NULL,
12942/* D0 */ NULL, NULL, NULL, NULL,
12943/* D4 */ NULL, NULL, NULL, NULL,
12944/* D8 */ NULL, NULL, NULL, NULL,
12945/* DC */ NULL, NULL, NULL, NULL,
12946/* E0 */ NULL, NULL, NULL, NULL,
12947/* E4 */ NULL, NULL, NULL, NULL,
12948/* E8 */ NULL, NULL, NULL, NULL,
12949/* EC */ NULL, NULL, NULL, NULL,
12950/* F0 */ NULL, NULL, NULL, NULL,
12951/* F4 */ NULL, NULL, NULL, NULL,
12952/* F8 */ NULL, NULL, NULL, NULL,
12953/* FC */ NULL, NULL, NULL, NULL,
12954};
12955
12956static void
26ca5450 12957OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132
RH
12958{
12959 const char *mnemonic;
12960
12961 FETCH_DATA (the_info, codep + 1);
12962 /* AMD 3DNow! instructions are specified by an opcode suffix in the
12963 place where an 8-bit immediate would normally go. ie. the last
12964 byte of the instruction. */
ea397f5b 12965 obufp = mnemonicendp;
c608c12e 12966 mnemonic = Suffix3DNow[*codep++ & 0xff];
252b5132 12967 if (mnemonic)
2da11e11 12968 oappend (mnemonic);
252b5132
RH
12969 else
12970 {
12971 /* Since a variable sized modrm/sib chunk is between the start
12972 of the opcode (0x0f0f) and the opcode suffix, we need to do
12973 all the modrm processing first, and don't know until now that
12974 we have a bad opcode. This necessitates some cleaning up. */
ce518a5f
L
12975 op_out[0][0] = '\0';
12976 op_out[1][0] = '\0';
6608db57 12977 BadOp ();
252b5132 12978 }
ea397f5b 12979 mnemonicendp = obufp;
252b5132 12980}
c608c12e 12981
c4de7606 12982static const struct op simd_cmp_op[] =
ea397f5b
L
12983{
12984 { STRING_COMMA_LEN ("eq") },
12985 { STRING_COMMA_LEN ("lt") },
12986 { STRING_COMMA_LEN ("le") },
12987 { STRING_COMMA_LEN ("unord") },
12988 { STRING_COMMA_LEN ("neq") },
12989 { STRING_COMMA_LEN ("nlt") },
12990 { STRING_COMMA_LEN ("nle") },
12991 { STRING_COMMA_LEN ("ord") }
c608c12e
AM
12992};
12993
c4de7606
JB
12994static const struct op vex_cmp_op[] =
12995{
12996 { STRING_COMMA_LEN ("eq_uq") },
12997 { STRING_COMMA_LEN ("nge") },
12998 { STRING_COMMA_LEN ("ngt") },
12999 { STRING_COMMA_LEN ("false") },
13000 { STRING_COMMA_LEN ("neq_oq") },
13001 { STRING_COMMA_LEN ("ge") },
13002 { STRING_COMMA_LEN ("gt") },
13003 { STRING_COMMA_LEN ("true") },
13004 { STRING_COMMA_LEN ("eq_os") },
13005 { STRING_COMMA_LEN ("lt_oq") },
13006 { STRING_COMMA_LEN ("le_oq") },
13007 { STRING_COMMA_LEN ("unord_s") },
13008 { STRING_COMMA_LEN ("neq_us") },
13009 { STRING_COMMA_LEN ("nlt_uq") },
13010 { STRING_COMMA_LEN ("nle_uq") },
13011 { STRING_COMMA_LEN ("ord_s") },
13012 { STRING_COMMA_LEN ("eq_us") },
13013 { STRING_COMMA_LEN ("nge_uq") },
13014 { STRING_COMMA_LEN ("ngt_uq") },
13015 { STRING_COMMA_LEN ("false_os") },
13016 { STRING_COMMA_LEN ("neq_os") },
13017 { STRING_COMMA_LEN ("ge_oq") },
13018 { STRING_COMMA_LEN ("gt_oq") },
13019 { STRING_COMMA_LEN ("true_us") },
13020};
13021
c608c12e 13022static void
ad19981d 13023CMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
c608c12e
AM
13024{
13025 unsigned int cmp_type;
13026
13027 FETCH_DATA (the_info, codep + 1);
13028 cmp_type = *codep++ & 0xff;
c0f3af97 13029 if (cmp_type < ARRAY_SIZE (simd_cmp_op))
c608c12e 13030 {
ad19981d 13031 char suffix [3];
ea397f5b 13032 char *p = mnemonicendp - 2;
ad19981d
L
13033 suffix[0] = p[0];
13034 suffix[1] = p[1];
13035 suffix[2] = '\0';
ea397f5b
L
13036 sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
13037 mnemonicendp += simd_cmp_op[cmp_type].len;
c608c12e 13038 }
c4de7606
JB
13039 else if (need_vex
13040 && cmp_type < ARRAY_SIZE (simd_cmp_op) + ARRAY_SIZE (vex_cmp_op))
13041 {
13042 char suffix [3];
13043 char *p = mnemonicendp - 2;
13044 suffix[0] = p[0];
13045 suffix[1] = p[1];
13046 suffix[2] = '\0';
13047 cmp_type -= ARRAY_SIZE (simd_cmp_op);
13048 sprintf (p, "%s%s", vex_cmp_op[cmp_type].name, suffix);
13049 mnemonicendp += vex_cmp_op[cmp_type].len;
13050 }
c608c12e
AM
13051 else
13052 {
ad19981d
L
13053 /* We have a reserved extension byte. Output it directly. */
13054 scratchbuf[0] = '$';
13055 print_operand_value (scratchbuf + 1, 1, cmp_type);
9ce09ba2 13056 oappend_maybe_intel (scratchbuf);
ad19981d 13057 scratchbuf[0] = '\0';
c608c12e
AM
13058 }
13059}
13060
9916071f 13061static void
7abb8d81 13062OP_Mwait (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
9916071f 13063{
7abb8d81 13064 /* mwait %eax,%ecx / mwaitx %eax,%ecx,%ebx */
b844680a
L
13065 if (!intel_syntax)
13066 {
081e283f
JB
13067 strcpy (op_out[0], names32[0]);
13068 strcpy (op_out[1], names32[1]);
7abb8d81 13069 if (bytemode == eBX_reg)
081e283f 13070 strcpy (op_out[2], names32[3]);
b844680a
L
13071 two_source_ops = 1;
13072 }
13073 /* Skip mod/rm byte. */
13074 MODRM_CHECK;
13075 codep++;
13076}
13077
13078static void
13079OP_Monitor (int bytemode ATTRIBUTE_UNUSED,
13080 int sizeflag ATTRIBUTE_UNUSED)
ca164297 13081{
081e283f 13082 /* monitor %{e,r,}ax,%ecx,%edx" */
b844680a 13083 if (!intel_syntax)
ca164297 13084 {
cb712a9e
L
13085 const char **names = (address_mode == mode_64bit
13086 ? names64 : names32);
1d9f512f 13087
081e283f 13088 if (prefixes & PREFIX_ADDR)
ca164297 13089 {
b844680a 13090 /* Remove "addr16/addr32". */
f16cd0d5 13091 all_prefixes[last_addr_prefix] = 0;
081e283f
JB
13092 names = (address_mode != mode_32bit
13093 ? names32 : names16);
b844680a 13094 used_prefixes |= PREFIX_ADDR;
ca164297 13095 }
081e283f
JB
13096 else if (address_mode == mode_16bit)
13097 names = names16;
13098 strcpy (op_out[0], names[0]);
13099 strcpy (op_out[1], names32[1]);
13100 strcpy (op_out[2], names32[2]);
b844680a 13101 two_source_ops = 1;
ca164297 13102 }
b844680a
L
13103 /* Skip mod/rm byte. */
13104 MODRM_CHECK;
13105 codep++;
30123838
JB
13106}
13107
6608db57
KH
13108static void
13109BadOp (void)
2da11e11 13110{
6608db57
KH
13111 /* Throw away prefixes and 1st. opcode byte. */
13112 codep = insn_codep + 1;
2da11e11
AM
13113 oappend ("(bad)");
13114}
4cc91dba 13115
35c52694
L
13116static void
13117REP_Fixup (int bytemode, int sizeflag)
13118{
13119 /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
13120 lods and stos. */
35c52694 13121 if (prefixes & PREFIX_REPZ)
f16cd0d5 13122 all_prefixes[last_repz_prefix] = REP_PREFIX;
35c52694
L
13123
13124 switch (bytemode)
13125 {
13126 case al_reg:
13127 case eAX_reg:
13128 case indir_dx_reg:
13129 OP_IMREG (bytemode, sizeflag);
13130 break;
13131 case eDI_reg:
13132 OP_ESreg (bytemode, sizeflag);
13133 break;
13134 case eSI_reg:
13135 OP_DSreg (bytemode, sizeflag);
13136 break;
13137 default:
13138 abort ();
13139 break;
13140 }
13141}
f5804c90 13142
d835a58b
JB
13143static void
13144SEP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13145{
13146 if ( isa64 != amd64 )
13147 return;
13148
13149 obufp = obuf;
13150 BadOp ();
13151 mnemonicendp = obufp;
13152 ++codep;
13153}
13154
7e8b059b
L
13155/* For BND-prefixed instructions 0xF2 prefix should be displayed as
13156 "bnd". */
13157
13158static void
13159BND_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13160{
13161 if (prefixes & PREFIX_REPNZ)
13162 all_prefixes[last_repnz_prefix] = BND_PREFIX;
13163}
13164
04ef582a
L
13165/* For NOTRACK-prefixed instructions, 0x3E prefix should be displayed as
13166 "notrack". */
13167
13168static void
13169NOTRACK_Fixup (int bytemode ATTRIBUTE_UNUSED,
13170 int sizeflag ATTRIBUTE_UNUSED)
13171{
0fa0fc85
BP
13172
13173 /* Since active_seg_prefix is not set in 64-bit mode, check whether
13174 we've seen a PREFIX_DS. */
13175 if ((prefixes & PREFIX_DS) != 0
04ef582a
L
13176 && (address_mode != mode_64bit || last_data_prefix < 0))
13177 {
4e9ac44a 13178 /* NOTRACK prefix is only valid on indirect branch instructions.
9fef80d6 13179 NB: DATA prefix is unsupported for Intel64. */
04ef582a
L
13180 active_seg_prefix = 0;
13181 all_prefixes[last_seg_prefix] = NOTRACK_PREFIX;
13182 }
13183}
13184
42164a71
L
13185/* Similar to OP_E. But the 0xf2/0xf3 prefixes should be displayed as
13186 "xacquire"/"xrelease" for memory operand if there is a LOCK prefix.
13187 */
13188
13189static void
13190HLE_Fixup1 (int bytemode, int sizeflag)
13191{
13192 if (modrm.mod != 3
13193 && (prefixes & PREFIX_LOCK) != 0)
13194 {
13195 if (prefixes & PREFIX_REPZ)
13196 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
13197 if (prefixes & PREFIX_REPNZ)
13198 all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
13199 }
13200
13201 OP_E (bytemode, sizeflag);
13202}
13203
13204/* Similar to OP_E. But the 0xf2/0xf3 prefixes should be displayed as
13205 "xacquire"/"xrelease" for memory operand. No check for LOCK prefix.
13206 */
13207
13208static void
13209HLE_Fixup2 (int bytemode, int sizeflag)
13210{
13211 if (modrm.mod != 3)
13212 {
13213 if (prefixes & PREFIX_REPZ)
13214 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
13215 if (prefixes & PREFIX_REPNZ)
13216 all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
13217 }
13218
13219 OP_E (bytemode, sizeflag);
13220}
13221
13222/* Similar to OP_E. But the 0xf3 prefixes should be displayed as
13223 "xrelease" for memory operand. No check for LOCK prefix. */
13224
13225static void
13226HLE_Fixup3 (int bytemode, int sizeflag)
13227{
13228 if (modrm.mod != 3
13229 && last_repz_prefix > last_repnz_prefix
13230 && (prefixes & PREFIX_REPZ) != 0)
13231 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
13232
13233 OP_E (bytemode, sizeflag);
13234}
13235
f5804c90
L
13236static void
13237CMPXCHG8B_Fixup (int bytemode, int sizeflag)
13238{
161a04f6
L
13239 USED_REX (REX_W);
13240 if (rex & REX_W)
f5804c90
L
13241 {
13242 /* Change cmpxchg8b to cmpxchg16b. */
ea397f5b
L
13243 char *p = mnemonicendp - 2;
13244 mnemonicendp = stpcpy (p, "16b");
fb9c77c7 13245 bytemode = o_mode;
f5804c90 13246 }
42164a71
L
13247 else if ((prefixes & PREFIX_LOCK) != 0)
13248 {
13249 if (prefixes & PREFIX_REPZ)
13250 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
13251 if (prefixes & PREFIX_REPNZ)
13252 all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
13253 }
13254
f5804c90
L
13255 OP_M (bytemode, sizeflag);
13256}
42903f7f
L
13257
13258static void
13259XMM_Fixup (int reg, int sizeflag ATTRIBUTE_UNUSED)
13260{
b9733481
L
13261 const char **names;
13262
c0f3af97
L
13263 if (need_vex)
13264 {
13265 switch (vex.length)
13266 {
13267 case 128:
b9733481 13268 names = names_xmm;
c0f3af97
L
13269 break;
13270 case 256:
b9733481 13271 names = names_ymm;
c0f3af97
L
13272 break;
13273 default:
13274 abort ();
13275 }
13276 }
13277 else
b9733481
L
13278 names = names_xmm;
13279 oappend (names[reg]);
42903f7f 13280}
381d071f
L
13281
13282static void
eacc9c89
L
13283FXSAVE_Fixup (int bytemode, int sizeflag)
13284{
13285 /* Add proper suffix to "fxsave" and "fxrstor". */
13286 USED_REX (REX_W);
13287 if (rex & REX_W)
13288 {
13289 char *p = mnemonicendp;
13290 *p++ = '6';
13291 *p++ = '4';
13292 *p = '\0';
13293 mnemonicendp = p;
13294 }
13295 OP_M (bytemode, sizeflag);
15c7c1d8
JB
13296}
13297
c0f3af97
L
13298/* Display the destination register operand for instructions with
13299 VEX. */
13300
13301static void
13302OP_VEX (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13303{
539f890d 13304 int reg;
b9733481
L
13305 const char **names;
13306
c0f3af97
L
13307 if (!need_vex)
13308 abort ();
13309
539f890d 13310 reg = vex.register_specifier;
63c6fc6c 13311 vex.register_specifier = 0;
5f847646
JB
13312 if (address_mode != mode_64bit)
13313 reg &= 7;
13314 else if (vex.evex && !vex.v)
13315 reg += 16;
43234a1e 13316
539f890d
L
13317 if (bytemode == vex_scalar_mode)
13318 {
13319 oappend (names_xmm[reg]);
13320 return;
13321 }
13322
260cd341
LC
13323 if (bytemode == tmm_mode)
13324 {
13325 /* All 3 TMM registers must be distinct. */
13326 if (reg >= 8)
13327 oappend ("(bad)");
13328 else
13329 {
13330 /* This must be the 3rd operand. */
13331 if (obufp != op_out[2])
13332 abort ();
13333 oappend (names_tmm[reg]);
13334 if (reg == modrm.reg || reg == modrm.rm)
13335 strcpy (obufp, "/(bad)");
13336 }
13337
13338 if (modrm.reg == modrm.rm || modrm.reg == reg || modrm.rm == reg)
13339 {
13340 if (modrm.reg <= 8
13341 && (modrm.reg == modrm.rm || modrm.reg == reg))
13342 strcat (op_out[0], "/(bad)");
13343 if (modrm.rm <= 8
13344 && (modrm.rm == modrm.reg || modrm.rm == reg))
13345 strcat (op_out[1], "/(bad)");
13346 }
13347
13348 return;
13349 }
13350
c0f3af97
L
13351 switch (vex.length)
13352 {
13353 case 128:
13354 switch (bytemode)
13355 {
13356 case vex_mode:
6c30d220 13357 case vex_vsib_q_w_dq_mode:
cb21baef
L
13358 names = names_xmm;
13359 break;
13360 case dq_mode:
390a6789 13361 if (rex & REX_W)
cb21baef
L
13362 names = names64;
13363 else
13364 names = names32;
c0f3af97 13365 break;
1ba585e8 13366 case mask_bd_mode:
43234a1e 13367 case mask_mode:
9889cbb1
L
13368 if (reg > 0x7)
13369 {
13370 oappend ("(bad)");
13371 return;
13372 }
43234a1e
L
13373 names = names_mask;
13374 break;
c0f3af97
L
13375 default:
13376 abort ();
13377 return;
13378 }
c0f3af97
L
13379 break;
13380 case 256:
13381 switch (bytemode)
13382 {
13383 case vex_mode:
6c30d220
L
13384 names = names_ymm;
13385 break;
13386 case vex_vsib_q_w_dq_mode:
13387 names = vex.w ? names_ymm : names_xmm;
c0f3af97 13388 break;
1ba585e8 13389 case mask_bd_mode:
43234a1e 13390 case mask_mode:
9889cbb1
L
13391 if (reg > 0x7)
13392 {
13393 oappend ("(bad)");
13394 return;
13395 }
43234a1e
L
13396 names = names_mask;
13397 break;
c0f3af97 13398 default:
a37a2806
NC
13399 /* See PR binutils/20893 for a reproducer. */
13400 oappend ("(bad)");
c0f3af97
L
13401 return;
13402 }
c0f3af97 13403 break;
43234a1e
L
13404 case 512:
13405 names = names_zmm;
13406 break;
c0f3af97
L
13407 default:
13408 abort ();
13409 break;
13410 }
539f890d 13411 oappend (names[reg]);
c0f3af97
L
13412}
13413
41f5efc6
JB
13414static void
13415OP_VexR (int bytemode, int sizeflag)
13416{
13417 if (modrm.mod == 3)
13418 OP_VEX (bytemode, sizeflag);
13419}
13420
5dd85c99 13421static void
e6123d0c 13422OP_VexW (int bytemode, int sizeflag)
5dd85c99 13423{
e6123d0c 13424 OP_VEX (bytemode, sizeflag);
5dd85c99 13425
5dd85c99 13426 if (vex.w)
5f847646 13427 {
e6123d0c
JB
13428 /* Swap 2nd and 3rd operands. */
13429 strcpy (scratchbuf, op_out[2]);
13430 strcpy (op_out[2], op_out[1]);
13431 strcpy (op_out[1], scratchbuf);
5f847646 13432 }
5dd85c99
SP
13433}
13434
c0f3af97
L
13435static void
13436OP_REG_VexI4 (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13437{
13438 int reg;
6384fd9e 13439 const char **names = names_xmm;
b9733481 13440
c0f3af97
L
13441 FETCH_DATA (the_info, codep + 1);
13442 reg = *codep++;
13443
6384fd9e 13444 if (bytemode != x_mode && bytemode != scalar_mode)
c0f3af97
L
13445 abort ();
13446
c0f3af97 13447 reg >>= 4;
5f847646
JB
13448 if (address_mode != mode_64bit)
13449 reg &= 7;
dae39acc 13450
6384fd9e
JB
13451 if (bytemode == x_mode && vex.length == 256)
13452 names = names_ymm;
13453
b9733481 13454 oappend (names[reg]);
b13b1bc0
JB
13455
13456 if (vex.w)
13457 {
13458 /* Swap 3rd and 4th operands. */
13459 strcpy (scratchbuf, op_out[3]);
13460 strcpy (op_out[3], op_out[2]);
13461 strcpy (op_out[2], scratchbuf);
13462 }
c0f3af97
L
13463}
13464
922d8de8 13465static void
93abb146
JB
13466OP_VexI4 (int bytemode ATTRIBUTE_UNUSED,
13467 int sizeflag ATTRIBUTE_UNUSED)
922d8de8 13468{
93abb146
JB
13469 scratchbuf[0] = '$';
13470 print_operand_value (scratchbuf + 1, 1, codep[-1] & 0xf);
13471 oappend_maybe_intel (scratchbuf);
922d8de8
DR
13472}
13473
43234a1e
L
13474static void
13475VPCMP_Fixup (int bytemode ATTRIBUTE_UNUSED,
13476 int sizeflag ATTRIBUTE_UNUSED)
13477{
13478 unsigned int cmp_type;
13479
13480 if (!vex.evex)
13481 abort ();
13482
13483 FETCH_DATA (the_info, codep + 1);
13484 cmp_type = *codep++ & 0xff;
13485 /* There are aliases for immediates 0, 1, 2, 4, 5, 6.
13486 If it's the case, print suffix, otherwise - print the immediate. */
13487 if (cmp_type < ARRAY_SIZE (simd_cmp_op)
13488 && cmp_type != 3
13489 && cmp_type != 7)
13490 {
13491 char suffix [3];
13492 char *p = mnemonicendp - 2;
13493
13494 /* vpcmp* can have both one- and two-lettered suffix. */
13495 if (p[0] == 'p')
13496 {
13497 p++;
13498 suffix[0] = p[0];
13499 suffix[1] = '\0';
13500 }
13501 else
13502 {
13503 suffix[0] = p[0];
13504 suffix[1] = p[1];
13505 suffix[2] = '\0';
13506 }
13507
13508 sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
13509 mnemonicendp += simd_cmp_op[cmp_type].len;
13510 }
be92cb14
JB
13511 else
13512 {
13513 /* We have a reserved extension byte. Output it directly. */
13514 scratchbuf[0] = '$';
13515 print_operand_value (scratchbuf + 1, 1, cmp_type);
13516 oappend_maybe_intel (scratchbuf);
13517 scratchbuf[0] = '\0';
13518 }
13519}
13520
13521static const struct op xop_cmp_op[] =
13522{
13523 { STRING_COMMA_LEN ("lt") },
13524 { STRING_COMMA_LEN ("le") },
13525 { STRING_COMMA_LEN ("gt") },
13526 { STRING_COMMA_LEN ("ge") },
13527 { STRING_COMMA_LEN ("eq") },
13528 { STRING_COMMA_LEN ("neq") },
13529 { STRING_COMMA_LEN ("false") },
13530 { STRING_COMMA_LEN ("true") }
13531};
13532
13533static void
13534VPCOM_Fixup (int bytemode ATTRIBUTE_UNUSED,
13535 int sizeflag ATTRIBUTE_UNUSED)
13536{
13537 unsigned int cmp_type;
13538
13539 FETCH_DATA (the_info, codep + 1);
13540 cmp_type = *codep++ & 0xff;
13541 if (cmp_type < ARRAY_SIZE (xop_cmp_op))
13542 {
13543 char suffix[3];
13544 char *p = mnemonicendp - 2;
13545
13546 /* vpcom* can have both one- and two-lettered suffix. */
13547 if (p[0] == 'm')
13548 {
13549 p++;
13550 suffix[0] = p[0];
13551 suffix[1] = '\0';
13552 }
13553 else
13554 {
13555 suffix[0] = p[0];
13556 suffix[1] = p[1];
13557 suffix[2] = '\0';
13558 }
13559
13560 sprintf (p, "%s%s", xop_cmp_op[cmp_type].name, suffix);
13561 mnemonicendp += xop_cmp_op[cmp_type].len;
13562 }
43234a1e
L
13563 else
13564 {
13565 /* We have a reserved extension byte. Output it directly. */
13566 scratchbuf[0] = '$';
13567 print_operand_value (scratchbuf + 1, 1, cmp_type);
9ce09ba2 13568 oappend_maybe_intel (scratchbuf);
43234a1e
L
13569 scratchbuf[0] = '\0';
13570 }
13571}
13572
ea397f5b
L
13573static const struct op pclmul_op[] =
13574{
13575 { STRING_COMMA_LEN ("lql") },
13576 { STRING_COMMA_LEN ("hql") },
13577 { STRING_COMMA_LEN ("lqh") },
13578 { STRING_COMMA_LEN ("hqh") }
c0f3af97
L
13579};
13580
13581static void
13582PCLMUL_Fixup (int bytemode ATTRIBUTE_UNUSED,
13583 int sizeflag ATTRIBUTE_UNUSED)
13584{
13585 unsigned int pclmul_type;
13586
13587 FETCH_DATA (the_info, codep + 1);
13588 pclmul_type = *codep++ & 0xff;
13589 switch (pclmul_type)
13590 {
13591 case 0x10:
13592 pclmul_type = 2;
13593 break;
13594 case 0x11:
13595 pclmul_type = 3;
13596 break;
13597 default:
13598 break;
7bb15c6f 13599 }
c0f3af97
L
13600 if (pclmul_type < ARRAY_SIZE (pclmul_op))
13601 {
13602 char suffix [4];
ea397f5b 13603 char *p = mnemonicendp - 3;
c0f3af97
L
13604 suffix[0] = p[0];
13605 suffix[1] = p[1];
13606 suffix[2] = p[2];
13607 suffix[3] = '\0';
ea397f5b
L
13608 sprintf (p, "%s%s", pclmul_op[pclmul_type].name, suffix);
13609 mnemonicendp += pclmul_op[pclmul_type].len;
c0f3af97
L
13610 }
13611 else
13612 {
13613 /* We have a reserved extension byte. Output it directly. */
13614 scratchbuf[0] = '$';
13615 print_operand_value (scratchbuf + 1, 1, pclmul_type);
9ce09ba2 13616 oappend_maybe_intel (scratchbuf);
c0f3af97
L
13617 scratchbuf[0] = '\0';
13618 }
13619}
13620
bc31405e
L
13621static void
13622MOVSXD_Fixup (int bytemode, int sizeflag)
13623{
13624 /* Add proper suffix to "movsxd". */
13625 char *p = mnemonicendp;
13626
13627 switch (bytemode)
13628 {
13629 case movsxd_mode:
13630 if (intel_syntax)
13631 {
13632 *p++ = 'x';
13633 *p++ = 'd';
13634 goto skip;
13635 }
13636
13637 USED_REX (REX_W);
13638 if (rex & REX_W)
13639 {
13640 *p++ = 'l';
13641 *p++ = 'q';
13642 }
13643 else
13644 {
13645 *p++ = 'x';
13646 *p++ = 'd';
13647 }
13648 break;
13649 default:
13650 oappend (INTERNAL_DISASSEMBLER_ERROR);
13651 break;
13652 }
13653
dc1e8a47 13654 skip:
bc31405e
L
13655 mnemonicendp = p;
13656 *p = '\0';
13657 OP_E (bytemode, sizeflag);
13658}
13659
43234a1e
L
13660static void
13661OP_Mask (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13662{
13663 if (!vex.evex
1ba585e8 13664 || (bytemode != mask_mode && bytemode != mask_bd_mode))
43234a1e
L
13665 abort ();
13666
13667 USED_REX (REX_R);
13668 if ((rex & REX_R) != 0 || !vex.r)
13669 {
13670 BadOp ();
13671 return;
13672 }
13673
13674 oappend (names_mask [modrm.reg]);
13675}
13676
13677static void
13678OP_Rounding (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13679{
43234a1e
L
13680 if (modrm.mod == 3 && vex.b)
13681 switch (bytemode)
13682 {
70df6fc9
L
13683 case evex_rounding_64_mode:
13684 if (address_mode != mode_64bit)
13685 {
13686 oappend ("(bad)");
13687 break;
13688 }
13689 /* Fall through. */
43234a1e
L
13690 case evex_rounding_mode:
13691 oappend (names_rounding[vex.ll]);
13692 break;
13693 case evex_sae_mode:
13694 oappend ("{sae}");
13695 break;
13696 default:
6df22cf6 13697 abort ();
43234a1e
L
13698 break;
13699 }
13700}
This page took 3.135034 seconds and 4 git commands to generate.