]> Git Repo - binutils.git/blame - opcodes/i386-dis.c
x86: simplify decode of opcodes valid only without any (embedded) prefix
[binutils.git] / opcodes / i386-dis.c
CommitLineData
252b5132 1/* Print i386 instructions for GDB, the GNU debugger.
b3adc24a 2 Copyright (C) 1988-2020 Free Software Foundation, Inc.
252b5132 3
9b201bb5 4 This file is part of the GNU opcodes library.
20f0a1fc 5
9b201bb5 6 This library is free software; you can redistribute it and/or modify
20f0a1fc 7 it under the terms of the GNU General Public License as published by
9b201bb5
NC
8 the Free Software Foundation; either version 3, or (at your option)
9 any later version.
20f0a1fc 10
9b201bb5
NC
11 It is distributed in the hope that it will be useful, but WITHOUT
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
14 License for more details.
20f0a1fc
NC
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
9b201bb5
NC
18 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19 MA 02110-1301, USA. */
20
20f0a1fc
NC
21
22/* 80386 instruction printer by Pace Willisson ([email protected])
23 July 1988
24 modified by John Hassey ([email protected])
25 x86-64 support added by Jan Hubicka ([email protected])
26 VIA PadLock support by Michal Ludvig ([email protected]). */
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);
6f74c397 80static void OP_R (int, int);
26ca5450
AJ
81static void OP_MMX (int, int);
82static void OP_XMM (int, int);
83static void OP_EM (int, int);
84static void OP_EX (int, int);
4d9567e0
MM
85static void OP_EMC (int,int);
86static void OP_MXC (int,int);
26ca5450
AJ
87static void OP_MS (int, int);
88static void OP_XS (int, int);
cc0ec051 89static void OP_M (int, int);
c0f3af97 90static void OP_VEX (int, int);
41f5efc6 91static void OP_VexR (int, int);
e6123d0c 92static void OP_VexW (int, int);
43234a1e 93static void OP_Rounding (int, int);
c0f3af97 94static void OP_REG_VexI4 (int, int);
93abb146 95static void OP_VexI4 (int, int);
c0f3af97 96static void PCLMUL_Fixup (int, int);
43234a1e 97static void VPCMP_Fixup (int, int);
be92cb14 98static void VPCOM_Fixup (int, int);
cc0ec051 99static void OP_0f07 (int, int);
b844680a
L
100static void OP_Monitor (int, int);
101static void OP_Mwait (int, int);
46e883c5
L
102static void NOP_Fixup1 (int, int);
103static void NOP_Fixup2 (int, int);
26ca5450 104static void OP_3DNowSuffix (int, int);
ad19981d 105static void CMP_Fixup (int, int);
26ca5450 106static void BadOp (void);
35c52694 107static void REP_Fixup (int, int);
d835a58b 108static void SEP_Fixup (int, int);
7e8b059b 109static void BND_Fixup (int, int);
04ef582a 110static void NOTRACK_Fixup (int, int);
42164a71
L
111static void HLE_Fixup1 (int, int);
112static void HLE_Fixup2 (int, int);
113static void HLE_Fixup3 (int, int);
f5804c90 114static void CMPXCHG8B_Fixup (int, int);
42903f7f 115static void XMM_Fixup (int, int);
eacc9c89 116static void FXSAVE_Fixup (int, int);
c1e679ec 117
bc31405e 118static void MOVSXD_Fixup (int, int);
252b5132 119
43234a1e
L
120static void OP_Mask (int, int);
121
6608db57 122struct dis_private {
252b5132
RH
123 /* Points to first byte not fetched. */
124 bfd_byte *max_fetched;
0b1cf022 125 bfd_byte the_buffer[MAX_MNEM_SIZE];
252b5132 126 bfd_vma insn_start;
e396998b 127 int orig_sizeflag;
8df14d78 128 OPCODES_SIGJMP_BUF bailout;
252b5132
RH
129};
130
cb712a9e
L
131enum address_mode
132{
133 mode_16bit,
134 mode_32bit,
135 mode_64bit
136};
137
138enum address_mode address_mode;
52b15da3 139
5076851f
ILT
140/* Flags for the prefixes for the current instruction. See below. */
141static int prefixes;
142
52b15da3
JH
143/* REX prefix the current instruction. See below. */
144static int rex;
145/* Bits of REX we've already used. */
146static int rex_used;
52b15da3
JH
147/* Mark parts used in the REX prefix. When we are testing for
148 empty prefix (for 8bit register REX extension), just mask it
149 out. Otherwise test for REX bit is excuse for existence of REX
150 only in case value is nonzero. */
151#define USED_REX(value) \
152 { \
153 if (value) \
161a04f6
L
154 { \
155 if ((rex & value)) \
156 rex_used |= (value) | REX_OPCODE; \
157 } \
52b15da3 158 else \
161a04f6 159 rex_used |= REX_OPCODE; \
52b15da3
JH
160 }
161
7d421014
ILT
162/* Flags for prefixes which we somehow handled when printing the
163 current instruction. */
164static int used_prefixes;
165
5076851f
ILT
166/* Flags stored in PREFIXES. */
167#define PREFIX_REPZ 1
168#define PREFIX_REPNZ 2
169#define PREFIX_LOCK 4
170#define PREFIX_CS 8
171#define PREFIX_SS 0x10
172#define PREFIX_DS 0x20
173#define PREFIX_ES 0x40
174#define PREFIX_FS 0x80
175#define PREFIX_GS 0x100
176#define PREFIX_DATA 0x200
177#define PREFIX_ADDR 0x400
178#define PREFIX_FWAIT 0x800
179
252b5132
RH
180/* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
181 to ADDR (exclusive) are valid. Returns 1 for success, longjmps
182 on error. */
183#define FETCH_DATA(info, addr) \
6608db57 184 ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \
252b5132
RH
185 ? 1 : fetch_data ((info), (addr)))
186
187static int
26ca5450 188fetch_data (struct disassemble_info *info, bfd_byte *addr)
252b5132
RH
189{
190 int status;
6608db57 191 struct dis_private *priv = (struct dis_private *) info->private_data;
252b5132
RH
192 bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer);
193
0b1cf022 194 if (addr <= priv->the_buffer + MAX_MNEM_SIZE)
272c9217
JB
195 status = (*info->read_memory_func) (start,
196 priv->max_fetched,
197 addr - priv->max_fetched,
198 info);
199 else
200 status = -1;
252b5132
RH
201 if (status != 0)
202 {
7d421014 203 /* If we did manage to read at least one byte, then
db6eb5be
AM
204 print_insn_i386 will do something sensible. Otherwise, print
205 an error. We do that here because this is where we know
206 STATUS. */
7d421014 207 if (priv->max_fetched == priv->the_buffer)
5076851f 208 (*info->memory_error_func) (status, start, info);
8df14d78 209 OPCODES_SIGLONGJMP (priv->bailout, 1);
252b5132
RH
210 }
211 else
212 priv->max_fetched = addr;
213 return 1;
214}
215
bf890a93 216/* Possible values for prefix requirement. */
507bd325
L
217#define PREFIX_IGNORED_SHIFT 16
218#define PREFIX_IGNORED_REPZ (PREFIX_REPZ << PREFIX_IGNORED_SHIFT)
219#define PREFIX_IGNORED_REPNZ (PREFIX_REPNZ << PREFIX_IGNORED_SHIFT)
220#define PREFIX_IGNORED_DATA (PREFIX_DATA << PREFIX_IGNORED_SHIFT)
221#define PREFIX_IGNORED_ADDR (PREFIX_ADDR << PREFIX_IGNORED_SHIFT)
222#define PREFIX_IGNORED_LOCK (PREFIX_LOCK << PREFIX_IGNORED_SHIFT)
223
224/* Opcode prefixes. */
225#define PREFIX_OPCODE (PREFIX_REPZ \
226 | PREFIX_REPNZ \
227 | PREFIX_DATA)
228
229/* Prefixes ignored. */
230#define PREFIX_IGNORED (PREFIX_IGNORED_REPZ \
231 | PREFIX_IGNORED_REPNZ \
232 | PREFIX_IGNORED_DATA)
bf890a93 233
ce518a5f 234#define XX { NULL, 0 }
507bd325 235#define Bad_Opcode NULL, { { NULL, 0 } }, 0
ce518a5f
L
236
237#define Eb { OP_E, b_mode }
7e8b059b 238#define Ebnd { OP_E, bnd_mode }
b6169b20 239#define EbS { OP_E, b_swap_mode }
9f79e886 240#define EbndS { OP_E, bnd_swap_mode }
ce518a5f 241#define Ev { OP_E, v_mode }
de89d0a3 242#define Eva { OP_E, va_mode }
7e8b059b 243#define Ev_bnd { OP_E, v_bnd_mode }
b6169b20 244#define EvS { OP_E, v_swap_mode }
ce518a5f
L
245#define Ed { OP_E, d_mode }
246#define Edq { OP_E, dq_mode }
247#define Edqw { OP_E, dqw_mode }
42903f7f 248#define Edqb { OP_E, dqb_mode }
1ba585e8
IT
249#define Edb { OP_E, db_mode }
250#define Edw { OP_E, dw_mode }
42903f7f 251#define Edqd { OP_E, dqd_mode }
09335d05 252#define Eq { OP_E, q_mode }
07f5af7d 253#define indirEv { OP_indirE, indir_v_mode }
ce518a5f
L
254#define indirEp { OP_indirE, f_mode }
255#define stackEv { OP_E, stack_v_mode }
256#define Em { OP_E, m_mode }
257#define Ew { OP_E, w_mode }
258#define M { OP_M, 0 } /* lea, lgdt, etc. */
34b772a6 259#define Ma { OP_M, a_mode }
b844680a 260#define Mb { OP_M, b_mode }
d9a5e5e5 261#define Md { OP_M, d_mode }
f1f8f695 262#define Mo { OP_M, o_mode }
ce518a5f
L
263#define Mp { OP_M, f_mode } /* 32 or 48 bit memory operand for LDS, LES etc */
264#define Mq { OP_M, q_mode }
9ab00b61 265#define Mv { OP_M, v_mode }
d276ec69 266#define Mv_bnd { OP_M, v_bndmk_mode }
4ee52178 267#define Mx { OP_M, x_mode }
c0f3af97 268#define Mxmm { OP_M, xmm_mode }
ce518a5f 269#define Gb { OP_G, b_mode }
7e8b059b 270#define Gbnd { OP_G, bnd_mode }
ce518a5f
L
271#define Gv { OP_G, v_mode }
272#define Gd { OP_G, d_mode }
273#define Gdq { OP_G, dq_mode }
274#define Gm { OP_G, m_mode }
c0a30a9f 275#define Gva { OP_G, va_mode }
ce518a5f 276#define Gw { OP_G, w_mode }
6f74c397 277#define Rd { OP_R, d_mode }
43234a1e 278#define Rdq { OP_R, dq_mode }
6f74c397 279#define Rm { OP_R, m_mode }
ce518a5f
L
280#define Ib { OP_I, b_mode }
281#define sIb { OP_sI, b_mode } /* sign extened byte */
e3949f17 282#define sIbT { OP_sI, b_T_mode } /* sign extened byte like 'T' */
ce518a5f 283#define Iv { OP_I, v_mode }
7bb15c6f 284#define sIv { OP_sI, v_mode }
ce518a5f 285#define Iv64 { OP_I64, v_mode }
c1dc7af5 286#define Id { OP_I, d_mode }
ce518a5f
L
287#define Iw { OP_I, w_mode }
288#define I1 { OP_I, const_1_mode }
289#define Jb { OP_J, b_mode }
290#define Jv { OP_J, v_mode }
376cd056 291#define Jdqw { OP_J, dqw_mode }
ce518a5f
L
292#define Cm { OP_C, m_mode }
293#define Dm { OP_D, m_mode }
294#define Td { OP_T, d_mode }
b844680a 295#define Skip_MODRM { OP_Skip_MODRM, 0 }
ce518a5f
L
296
297#define RMeAX { OP_REG, eAX_reg }
298#define RMeBX { OP_REG, eBX_reg }
299#define RMeCX { OP_REG, eCX_reg }
300#define RMeDX { OP_REG, eDX_reg }
301#define RMeSP { OP_REG, eSP_reg }
302#define RMeBP { OP_REG, eBP_reg }
303#define RMeSI { OP_REG, eSI_reg }
304#define RMeDI { OP_REG, eDI_reg }
305#define RMrAX { OP_REG, rAX_reg }
306#define RMrBX { OP_REG, rBX_reg }
307#define RMrCX { OP_REG, rCX_reg }
308#define RMrDX { OP_REG, rDX_reg }
309#define RMrSP { OP_REG, rSP_reg }
310#define RMrBP { OP_REG, rBP_reg }
311#define RMrSI { OP_REG, rSI_reg }
312#define RMrDI { OP_REG, rDI_reg }
313#define RMAL { OP_REG, al_reg }
ce518a5f
L
314#define RMCL { OP_REG, cl_reg }
315#define RMDL { OP_REG, dl_reg }
316#define RMBL { OP_REG, bl_reg }
317#define RMAH { OP_REG, ah_reg }
318#define RMCH { OP_REG, ch_reg }
319#define RMDH { OP_REG, dh_reg }
320#define RMBH { OP_REG, bh_reg }
321#define RMAX { OP_REG, ax_reg }
322#define RMDX { OP_REG, dx_reg }
323
324#define eAX { OP_IMREG, eAX_reg }
ce518a5f
L
325#define AL { OP_IMREG, al_reg }
326#define CL { OP_IMREG, cl_reg }
ce518a5f
L
327#define zAX { OP_IMREG, z_mode_ax_reg }
328#define indirDX { OP_IMREG, indir_dx_reg }
329
330#define Sw { OP_SEG, w_mode }
331#define Sv { OP_SEG, v_mode }
332#define Ap { OP_DIR, 0 }
333#define Ob { OP_OFF64, b_mode }
334#define Ov { OP_OFF64, v_mode }
335#define Xb { OP_DSreg, eSI_reg }
336#define Xv { OP_DSreg, eSI_reg }
337#define Xz { OP_DSreg, eSI_reg }
338#define Yb { OP_ESreg, eDI_reg }
339#define Yv { OP_ESreg, eDI_reg }
340#define DSBX { OP_DSreg, eBX_reg }
341
342#define es { OP_REG, es_reg }
343#define ss { OP_REG, ss_reg }
344#define cs { OP_REG, cs_reg }
345#define ds { OP_REG, ds_reg }
346#define fs { OP_REG, fs_reg }
347#define gs { OP_REG, gs_reg }
348
349#define MX { OP_MMX, 0 }
350#define XM { OP_XMM, 0 }
539f890d 351#define XMScalar { OP_XMM, scalar_mode }
6c30d220 352#define XMGatherQ { OP_XMM, vex_vsib_q_w_dq_mode }
c0f3af97 353#define XMM { OP_XMM, xmm_mode }
260cd341 354#define TMM { OP_XMM, tmm_mode }
43234a1e 355#define XMxmmq { OP_XMM, xmmq_mode }
ce518a5f 356#define EM { OP_EM, v_mode }
b6169b20 357#define EMS { OP_EM, v_swap_mode }
09a2c6cf 358#define EMd { OP_EM, d_mode }
14051056 359#define EMx { OP_EM, x_mode }
4726e9a4 360#define EXbwUnit { OP_EX, bw_unit_mode }
8976381e 361#define EXw { OP_EX, w_mode }
09a2c6cf 362#define EXd { OP_EX, d_mode }
fa99fab2 363#define EXdS { OP_EX, d_swap_mode }
09a2c6cf 364#define EXq { OP_EX, q_mode }
b6169b20 365#define EXqS { OP_EX, q_swap_mode }
09a2c6cf 366#define EXx { OP_EX, x_mode }
b6169b20 367#define EXxS { OP_EX, x_swap_mode }
c0f3af97 368#define EXxmm { OP_EX, xmm_mode }
43234a1e 369#define EXymm { OP_EX, ymm_mode }
260cd341 370#define EXtmm { OP_EX, tmm_mode }
c0f3af97 371#define EXxmmq { OP_EX, xmmq_mode }
43234a1e 372#define EXEvexHalfBcstXmmq { OP_EX, evex_half_bcst_xmmq_mode }
6c30d220
L
373#define EXxmm_mb { OP_EX, xmm_mb_mode }
374#define EXxmm_mw { OP_EX, xmm_mw_mode }
375#define EXxmm_md { OP_EX, xmm_md_mode }
376#define EXxmm_mq { OP_EX, xmm_mq_mode }
377#define EXxmmdw { OP_EX, xmmdw_mode }
378#define EXxmmqd { OP_EX, xmmqd_mode }
c0f3af97 379#define EXymmq { OP_EX, ymmq_mode }
1c480963 380#define EXVexWdqScalar { OP_EX, vex_scalar_w_dq_mode }
43234a1e
L
381#define EXEvexXGscat { OP_EX, evex_x_gscat_mode }
382#define EXEvexXNoBcst { OP_EX, evex_x_nobcst_mode }
ce518a5f
L
383#define MS { OP_MS, v_mode }
384#define XS { OP_XS, v_mode }
09335d05 385#define EMCq { OP_EMC, q_mode }
ce518a5f 386#define MXC { OP_MXC, 0 }
ce518a5f 387#define OPSUF { OP_3DNowSuffix, 0 }
d835a58b 388#define SEP { SEP_Fixup, 0 }
ad19981d 389#define CMP { CMP_Fixup, 0 }
42903f7f 390#define XMM0 { XMM_Fixup, 0 }
eacc9c89 391#define FXSAVE { FXSAVE_Fixup, 0 }
252b5132 392
c0f3af97 393#define Vex { OP_VEX, vex_mode }
e6123d0c 394#define VexW { OP_VexW, vex_mode }
539f890d 395#define VexScalar { OP_VEX, vex_scalar_mode }
41f5efc6 396#define VexScalarR { OP_VexR, vex_scalar_mode }
6c30d220 397#define VexGatherQ { OP_VEX, vex_vsib_q_w_dq_mode }
cb21baef 398#define VexGdq { OP_VEX, dq_mode }
260cd341 399#define VexTmm { OP_VEX, tmm_mode }
c0f3af97 400#define XMVexI4 { OP_REG_VexI4, x_mode }
6384fd9e 401#define XMVexScalarI4 { OP_REG_VexI4, scalar_mode }
93abb146 402#define VexI4 { OP_VexI4, 0 }
c0f3af97 403#define PCLMUL { PCLMUL_Fixup, 0 }
43234a1e 404#define VPCMP { VPCMP_Fixup, 0 }
be92cb14 405#define VPCOM { VPCOM_Fixup, 0 }
43234a1e
L
406
407#define EXxEVexR { OP_Rounding, evex_rounding_mode }
70df6fc9 408#define EXxEVexR64 { OP_Rounding, evex_rounding_64_mode }
43234a1e
L
409#define EXxEVexS { OP_Rounding, evex_sae_mode }
410
411#define XMask { OP_Mask, mask_mode }
412#define MaskG { OP_G, mask_mode }
413#define MaskE { OP_E, mask_mode }
1ba585e8 414#define MaskBDE { OP_E, mask_bd_mode }
43234a1e
L
415#define MaskR { OP_R, mask_mode }
416#define MaskVex { OP_VEX, mask_mode }
c0f3af97 417
6c30d220 418#define MVexVSIBDWpX { OP_M, vex_vsib_d_w_dq_mode }
5fc35d96 419#define MVexVSIBDQWpX { OP_M, vex_vsib_d_w_d_mode }
6c30d220 420#define MVexVSIBQWpX { OP_M, vex_vsib_q_w_dq_mode }
5fc35d96 421#define MVexVSIBQDWpX { OP_M, vex_vsib_q_w_d_mode }
6c30d220 422
260cd341
LC
423#define MVexSIBMEM { OP_M, vex_sibmem_mode }
424
35c52694 425/* Used handle "rep" prefix for string instructions. */
ce518a5f
L
426#define Xbr { REP_Fixup, eSI_reg }
427#define Xvr { REP_Fixup, eSI_reg }
428#define Ybr { REP_Fixup, eDI_reg }
429#define Yvr { REP_Fixup, eDI_reg }
430#define Yzr { REP_Fixup, eDI_reg }
431#define indirDXr { REP_Fixup, indir_dx_reg }
432#define ALr { REP_Fixup, al_reg }
433#define eAXr { REP_Fixup, eAX_reg }
434
42164a71
L
435/* Used handle HLE prefix for lockable instructions. */
436#define Ebh1 { HLE_Fixup1, b_mode }
437#define Evh1 { HLE_Fixup1, v_mode }
438#define Ebh2 { HLE_Fixup2, b_mode }
439#define Evh2 { HLE_Fixup2, v_mode }
440#define Ebh3 { HLE_Fixup3, b_mode }
441#define Evh3 { HLE_Fixup3, v_mode }
442
7e8b059b 443#define BND { BND_Fixup, 0 }
04ef582a 444#define NOTRACK { NOTRACK_Fixup, 0 }
7e8b059b 445
ce518a5f
L
446#define cond_jump_flag { NULL, cond_jump_mode }
447#define loop_jcxz_flag { NULL, loop_jcxz_mode }
3ffd33cf 448
252b5132 449/* bits in sizeflag */
252b5132 450#define SUFFIX_ALWAYS 4
252b5132
RH
451#define AFLAG 2
452#define DFLAG 1
453
51e7da1b
L
454enum
455{
456 /* byte operand */
457 b_mode = 1,
458 /* byte operand with operand swapped */
3873ba12 459 b_swap_mode,
e3949f17
L
460 /* byte operand, sign extend like 'T' suffix */
461 b_T_mode,
51e7da1b 462 /* operand size depends on prefixes */
3873ba12 463 v_mode,
51e7da1b 464 /* operand size depends on prefixes with operand swapped */
3873ba12 465 v_swap_mode,
de89d0a3
IT
466 /* operand size depends on address prefix */
467 va_mode,
51e7da1b 468 /* word operand */
3873ba12 469 w_mode,
51e7da1b 470 /* double word operand */
3873ba12 471 d_mode,
51e7da1b 472 /* double word operand with operand swapped */
3873ba12 473 d_swap_mode,
51e7da1b 474 /* quad word operand */
3873ba12 475 q_mode,
51e7da1b 476 /* quad word operand with operand swapped */
3873ba12 477 q_swap_mode,
51e7da1b 478 /* ten-byte operand */
3873ba12 479 t_mode,
43234a1e
L
480 /* 16-byte XMM, 32-byte YMM or 64-byte ZMM operand. In EVEX with
481 broadcast enabled. */
3873ba12 482 x_mode,
43234a1e
L
483 /* Similar to x_mode, but with different EVEX mem shifts. */
484 evex_x_gscat_mode,
4726e9a4
JB
485 /* Similar to x_mode, but with yet different EVEX mem shifts. */
486 bw_unit_mode,
43234a1e
L
487 /* Similar to x_mode, but with disabled broadcast. */
488 evex_x_nobcst_mode,
489 /* Similar to x_mode, but with operands swapped and disabled broadcast
490 in EVEX. */
3873ba12 491 x_swap_mode,
51e7da1b 492 /* 16-byte XMM operand */
3873ba12 493 xmm_mode,
43234a1e
L
494 /* XMM, XMM or YMM register operand, or quad word, xmmword or ymmword
495 memory operand (depending on vector length). Broadcast isn't
496 allowed. */
3873ba12 497 xmmq_mode,
43234a1e
L
498 /* Same as xmmq_mode, but broadcast is allowed. */
499 evex_half_bcst_xmmq_mode,
6c30d220
L
500 /* XMM register or byte memory operand */
501 xmm_mb_mode,
502 /* XMM register or word memory operand */
503 xmm_mw_mode,
504 /* XMM register or double word memory operand */
505 xmm_md_mode,
506 /* XMM register or quad word memory operand */
507 xmm_mq_mode,
43234a1e 508 /* 16-byte XMM, word, double word or quad word operand. */
6c30d220 509 xmmdw_mode,
43234a1e 510 /* 16-byte XMM, double word, quad word operand or xmm word operand. */
6c30d220 511 xmmqd_mode,
43234a1e
L
512 /* 32-byte YMM operand */
513 ymm_mode,
514 /* quad word, ymmword or zmmword memory operand. */
3873ba12 515 ymmq_mode,
6c30d220
L
516 /* 32-byte YMM or 16-byte word operand */
517 ymmxmm_mode,
260cd341
LC
518 /* TMM operand */
519 tmm_mode,
51e7da1b 520 /* d_mode in 32bit, q_mode in 64bit mode. */
3873ba12 521 m_mode,
51e7da1b 522 /* pair of v_mode operands */
3873ba12
L
523 a_mode,
524 cond_jump_mode,
525 loop_jcxz_mode,
bc31405e 526 movsxd_mode,
7e8b059b 527 v_bnd_mode,
d276ec69
JB
528 /* like v_bnd_mode in 32bit, no RIP-rel in 64bit mode. */
529 v_bndmk_mode,
51e7da1b 530 /* operand size depends on REX prefixes. */
3873ba12 531 dq_mode,
376cd056
JB
532 /* registers like dq_mode, memory like w_mode, displacements like
533 v_mode without considering Intel64 ISA. */
3873ba12 534 dqw_mode,
9f79e886 535 /* bounds operand */
7e8b059b 536 bnd_mode,
9f79e886
JB
537 /* bounds operand with operand swapped */
538 bnd_swap_mode,
51e7da1b 539 /* 4- or 6-byte pointer operand */
3873ba12
L
540 f_mode,
541 const_1_mode,
07f5af7d
L
542 /* v_mode for indirect branch opcodes. */
543 indir_v_mode,
51e7da1b 544 /* v_mode for stack-related opcodes. */
3873ba12 545 stack_v_mode,
51e7da1b 546 /* non-quad operand size depends on prefixes */
3873ba12 547 z_mode,
51e7da1b 548 /* 16-byte operand */
3873ba12 549 o_mode,
51e7da1b 550 /* registers like dq_mode, memory like b_mode. */
3873ba12 551 dqb_mode,
1ba585e8
IT
552 /* registers like d_mode, memory like b_mode. */
553 db_mode,
554 /* registers like d_mode, memory like w_mode. */
555 dw_mode,
51e7da1b 556 /* registers like dq_mode, memory like d_mode. */
3873ba12 557 dqd_mode,
51e7da1b 558 /* normal vex mode */
3873ba12 559 vex_mode,
d55ee72f 560
825bd36c 561 /* Operand size depends on the VEX.W bit, with VSIB dword indices. */
6c30d220 562 vex_vsib_d_w_dq_mode,
5fc35d96
IT
563 /* Similar to vex_vsib_d_w_dq_mode, with smaller memory. */
564 vex_vsib_d_w_d_mode,
825bd36c 565 /* Operand size depends on the VEX.W bit, with VSIB qword indices. */
6c30d220 566 vex_vsib_q_w_dq_mode,
5fc35d96
IT
567 /* Similar to vex_vsib_q_w_dq_mode, with smaller memory. */
568 vex_vsib_q_w_d_mode,
260cd341
LC
569 /* mandatory non-vector SIB. */
570 vex_sibmem_mode,
6c30d220 571
539f890d
L
572 /* scalar, ignore vector length. */
573 scalar_mode,
539f890d
L
574 /* like vex_mode, ignore vector length. */
575 vex_scalar_mode,
825bd36c 576 /* Operand size depends on the VEX.W bit, ignore vector length. */
1c480963 577 vex_scalar_w_dq_mode,
539f890d 578
43234a1e
L
579 /* Static rounding. */
580 evex_rounding_mode,
70df6fc9
L
581 /* Static rounding, 64-bit mode only. */
582 evex_rounding_64_mode,
43234a1e
L
583 /* Supress all exceptions. */
584 evex_sae_mode,
585
586 /* Mask register operand. */
587 mask_mode,
1ba585e8
IT
588 /* Mask register operand. */
589 mask_bd_mode,
43234a1e 590
3873ba12
L
591 es_reg,
592 cs_reg,
593 ss_reg,
594 ds_reg,
595 fs_reg,
596 gs_reg,
d55ee72f 597
3873ba12
L
598 eAX_reg,
599 eCX_reg,
600 eDX_reg,
601 eBX_reg,
602 eSP_reg,
603 eBP_reg,
604 eSI_reg,
605 eDI_reg,
d55ee72f 606
3873ba12
L
607 al_reg,
608 cl_reg,
609 dl_reg,
610 bl_reg,
611 ah_reg,
612 ch_reg,
613 dh_reg,
614 bh_reg,
d55ee72f 615
3873ba12
L
616 ax_reg,
617 cx_reg,
618 dx_reg,
619 bx_reg,
620 sp_reg,
621 bp_reg,
622 si_reg,
623 di_reg,
d55ee72f 624
3873ba12
L
625 rAX_reg,
626 rCX_reg,
627 rDX_reg,
628 rBX_reg,
629 rSP_reg,
630 rBP_reg,
631 rSI_reg,
632 rDI_reg,
d55ee72f 633
3873ba12
L
634 z_mode_ax_reg,
635 indir_dx_reg
51e7da1b 636};
252b5132 637
51e7da1b
L
638enum
639{
640 FLOATCODE = 1,
3873ba12
L
641 USE_REG_TABLE,
642 USE_MOD_TABLE,
643 USE_RM_TABLE,
644 USE_PREFIX_TABLE,
645 USE_X86_64_TABLE,
646 USE_3BYTE_TABLE,
f88c9eb0 647 USE_XOP_8F_TABLE,
3873ba12
L
648 USE_VEX_C4_TABLE,
649 USE_VEX_C5_TABLE,
9e30b8e0 650 USE_VEX_LEN_TABLE,
43234a1e 651 USE_VEX_W_TABLE,
04e2a182
L
652 USE_EVEX_TABLE,
653 USE_EVEX_LEN_TABLE
51e7da1b 654};
6439fc28 655
bf890a93 656#define FLOAT NULL, { { NULL, FLOATCODE } }, 0
4efba78c 657
bf890a93
IT
658#define DIS386(T, I) NULL, { { NULL, (T)}, { NULL, (I) } }, 0
659#define DIS386_PREFIX(T, I, P) NULL, { { NULL, (T)}, { NULL, (I) } }, P
1ceb70f8
L
660#define REG_TABLE(I) DIS386 (USE_REG_TABLE, (I))
661#define MOD_TABLE(I) DIS386 (USE_MOD_TABLE, (I))
662#define RM_TABLE(I) DIS386 (USE_RM_TABLE, (I))
663#define PREFIX_TABLE(I) DIS386 (USE_PREFIX_TABLE, (I))
4e7d34a6
L
664#define X86_64_TABLE(I) DIS386 (USE_X86_64_TABLE, (I))
665#define THREE_BYTE_TABLE(I) DIS386 (USE_3BYTE_TABLE, (I))
bf890a93 666#define THREE_BYTE_TABLE_PREFIX(I, P) DIS386_PREFIX (USE_3BYTE_TABLE, (I), P)
f88c9eb0 667#define XOP_8F_TABLE(I) DIS386 (USE_XOP_8F_TABLE, (I))
c0f3af97
L
668#define VEX_C4_TABLE(I) DIS386 (USE_VEX_C4_TABLE, (I))
669#define VEX_C5_TABLE(I) DIS386 (USE_VEX_C5_TABLE, (I))
670#define VEX_LEN_TABLE(I) DIS386 (USE_VEX_LEN_TABLE, (I))
9e30b8e0 671#define VEX_W_TABLE(I) DIS386 (USE_VEX_W_TABLE, (I))
43234a1e 672#define EVEX_TABLE(I) DIS386 (USE_EVEX_TABLE, (I))
04e2a182 673#define EVEX_LEN_TABLE(I) DIS386 (USE_EVEX_LEN_TABLE, (I))
1ceb70f8 674
51e7da1b
L
675enum
676{
677 REG_80 = 0,
3873ba12 678 REG_81,
7148c369 679 REG_83,
3873ba12
L
680 REG_8F,
681 REG_C0,
682 REG_C1,
683 REG_C6,
684 REG_C7,
685 REG_D0,
686 REG_D1,
687 REG_D2,
688 REG_D3,
689 REG_F6,
690 REG_F7,
691 REG_FE,
692 REG_FF,
693 REG_0F00,
694 REG_0F01,
695 REG_0F0D,
696 REG_0F18,
f8687e93
JB
697 REG_0F1C_P_0_MOD_0,
698 REG_0F1E_P_1_MOD_3,
3873ba12
L
699 REG_0F71,
700 REG_0F72,
701 REG_0F73,
702 REG_0FA6,
703 REG_0FA7,
704 REG_0FAE,
705 REG_0FBA,
706 REG_0FC7,
592a252b
L
707 REG_VEX_0F71,
708 REG_VEX_0F72,
709 REG_VEX_0F73,
710 REG_VEX_0FAE,
260cd341 711 REG_VEX_0F3849_X86_64_P_0_W_0_M_1,
f12dc422 712 REG_VEX_0F38F3,
467bbef0
JB
713
714 REG_0FXOP_09_01_L_0,
715 REG_0FXOP_09_02_L_0,
716 REG_0FXOP_09_12_M_1_L_0,
717 REG_0FXOP_0A_12_L_0,
43234a1e 718
1ba585e8 719 REG_EVEX_0F71,
43234a1e
L
720 REG_EVEX_0F72,
721 REG_EVEX_0F73,
722 REG_EVEX_0F38C6,
723 REG_EVEX_0F38C7
51e7da1b 724};
1ceb70f8 725
51e7da1b
L
726enum
727{
728 MOD_8D = 0,
42164a71
L
729 MOD_C6_REG_7,
730 MOD_C7_REG_7,
4a357820
MZ
731 MOD_FF_REG_3,
732 MOD_FF_REG_5,
3873ba12
L
733 MOD_0F01_REG_0,
734 MOD_0F01_REG_1,
735 MOD_0F01_REG_2,
736 MOD_0F01_REG_3,
8eab4136 737 MOD_0F01_REG_5,
3873ba12
L
738 MOD_0F01_REG_7,
739 MOD_0F12_PREFIX_0,
18897deb 740 MOD_0F12_PREFIX_2,
3873ba12
L
741 MOD_0F13,
742 MOD_0F16_PREFIX_0,
18897deb 743 MOD_0F16_PREFIX_2,
3873ba12
L
744 MOD_0F17,
745 MOD_0F18_REG_0,
746 MOD_0F18_REG_1,
747 MOD_0F18_REG_2,
748 MOD_0F18_REG_3,
d7189fa5
RM
749 MOD_0F18_REG_4,
750 MOD_0F18_REG_5,
751 MOD_0F18_REG_6,
752 MOD_0F18_REG_7,
7e8b059b
L
753 MOD_0F1A_PREFIX_0,
754 MOD_0F1B_PREFIX_0,
755 MOD_0F1B_PREFIX_1,
c48935d7 756 MOD_0F1C_PREFIX_0,
603555e5 757 MOD_0F1E_PREFIX_1,
3873ba12
L
758 MOD_0F24,
759 MOD_0F26,
760 MOD_0F2B_PREFIX_0,
761 MOD_0F2B_PREFIX_1,
762 MOD_0F2B_PREFIX_2,
763 MOD_0F2B_PREFIX_3,
a5aaedb9 764 MOD_0F50,
3873ba12
L
765 MOD_0F71_REG_2,
766 MOD_0F71_REG_4,
767 MOD_0F71_REG_6,
768 MOD_0F72_REG_2,
769 MOD_0F72_REG_4,
770 MOD_0F72_REG_6,
771 MOD_0F73_REG_2,
772 MOD_0F73_REG_3,
773 MOD_0F73_REG_6,
774 MOD_0F73_REG_7,
775 MOD_0FAE_REG_0,
776 MOD_0FAE_REG_1,
777 MOD_0FAE_REG_2,
778 MOD_0FAE_REG_3,
779 MOD_0FAE_REG_4,
780 MOD_0FAE_REG_5,
781 MOD_0FAE_REG_6,
782 MOD_0FAE_REG_7,
783 MOD_0FB2,
784 MOD_0FB4,
785 MOD_0FB5,
a8484f96 786 MOD_0FC3,
963f3586
IT
787 MOD_0FC7_REG_3,
788 MOD_0FC7_REG_4,
789 MOD_0FC7_REG_5,
3873ba12
L
790 MOD_0FC7_REG_6,
791 MOD_0FC7_REG_7,
792 MOD_0FD7,
793 MOD_0FE7_PREFIX_2,
794 MOD_0FF0_PREFIX_3,
7531c613 795 MOD_0F382A,
260cd341
LC
796 MOD_VEX_0F3849_X86_64_P_0_W_0,
797 MOD_VEX_0F3849_X86_64_P_2_W_0,
798 MOD_VEX_0F3849_X86_64_P_3_W_0,
799 MOD_VEX_0F384B_X86_64_P_1_W_0,
800 MOD_VEX_0F384B_X86_64_P_2_W_0,
801 MOD_VEX_0F384B_X86_64_P_3_W_0,
802 MOD_VEX_0F385C_X86_64_P_1_W_0,
803 MOD_VEX_0F385E_X86_64_P_0_W_0,
804 MOD_VEX_0F385E_X86_64_P_1_W_0,
805 MOD_VEX_0F385E_X86_64_P_2_W_0,
806 MOD_VEX_0F385E_X86_64_P_3_W_0,
7531c613 807 MOD_0F38F5,
603555e5 808 MOD_0F38F6_PREFIX_0,
5d79adc4 809 MOD_0F38F8_PREFIX_1,
c0a30a9f 810 MOD_0F38F8_PREFIX_2,
5d79adc4 811 MOD_0F38F8_PREFIX_3,
035e7389 812 MOD_0F38F9,
3873ba12
L
813 MOD_62_32BIT,
814 MOD_C4_32BIT,
815 MOD_C5_32BIT,
592a252b 816 MOD_VEX_0F12_PREFIX_0,
18897deb 817 MOD_VEX_0F12_PREFIX_2,
592a252b
L
818 MOD_VEX_0F13,
819 MOD_VEX_0F16_PREFIX_0,
18897deb 820 MOD_VEX_0F16_PREFIX_2,
592a252b
L
821 MOD_VEX_0F17,
822 MOD_VEX_0F2B,
ab4e4ed5
AF
823 MOD_VEX_W_0_0F41_P_0_LEN_1,
824 MOD_VEX_W_1_0F41_P_0_LEN_1,
825 MOD_VEX_W_0_0F41_P_2_LEN_1,
826 MOD_VEX_W_1_0F41_P_2_LEN_1,
827 MOD_VEX_W_0_0F42_P_0_LEN_1,
828 MOD_VEX_W_1_0F42_P_0_LEN_1,
829 MOD_VEX_W_0_0F42_P_2_LEN_1,
830 MOD_VEX_W_1_0F42_P_2_LEN_1,
831 MOD_VEX_W_0_0F44_P_0_LEN_1,
832 MOD_VEX_W_1_0F44_P_0_LEN_1,
833 MOD_VEX_W_0_0F44_P_2_LEN_1,
834 MOD_VEX_W_1_0F44_P_2_LEN_1,
835 MOD_VEX_W_0_0F45_P_0_LEN_1,
836 MOD_VEX_W_1_0F45_P_0_LEN_1,
837 MOD_VEX_W_0_0F45_P_2_LEN_1,
838 MOD_VEX_W_1_0F45_P_2_LEN_1,
839 MOD_VEX_W_0_0F46_P_0_LEN_1,
840 MOD_VEX_W_1_0F46_P_0_LEN_1,
841 MOD_VEX_W_0_0F46_P_2_LEN_1,
842 MOD_VEX_W_1_0F46_P_2_LEN_1,
843 MOD_VEX_W_0_0F47_P_0_LEN_1,
844 MOD_VEX_W_1_0F47_P_0_LEN_1,
845 MOD_VEX_W_0_0F47_P_2_LEN_1,
846 MOD_VEX_W_1_0F47_P_2_LEN_1,
847 MOD_VEX_W_0_0F4A_P_0_LEN_1,
848 MOD_VEX_W_1_0F4A_P_0_LEN_1,
849 MOD_VEX_W_0_0F4A_P_2_LEN_1,
850 MOD_VEX_W_1_0F4A_P_2_LEN_1,
851 MOD_VEX_W_0_0F4B_P_0_LEN_1,
852 MOD_VEX_W_1_0F4B_P_0_LEN_1,
853 MOD_VEX_W_0_0F4B_P_2_LEN_1,
592a252b
L
854 MOD_VEX_0F50,
855 MOD_VEX_0F71_REG_2,
856 MOD_VEX_0F71_REG_4,
857 MOD_VEX_0F71_REG_6,
858 MOD_VEX_0F72_REG_2,
859 MOD_VEX_0F72_REG_4,
860 MOD_VEX_0F72_REG_6,
861 MOD_VEX_0F73_REG_2,
862 MOD_VEX_0F73_REG_3,
863 MOD_VEX_0F73_REG_6,
864 MOD_VEX_0F73_REG_7,
ab4e4ed5
AF
865 MOD_VEX_W_0_0F91_P_0_LEN_0,
866 MOD_VEX_W_1_0F91_P_0_LEN_0,
867 MOD_VEX_W_0_0F91_P_2_LEN_0,
868 MOD_VEX_W_1_0F91_P_2_LEN_0,
869 MOD_VEX_W_0_0F92_P_0_LEN_0,
870 MOD_VEX_W_0_0F92_P_2_LEN_0,
58a211d2 871 MOD_VEX_0F92_P_3_LEN_0,
ab4e4ed5
AF
872 MOD_VEX_W_0_0F93_P_0_LEN_0,
873 MOD_VEX_W_0_0F93_P_2_LEN_0,
58a211d2 874 MOD_VEX_0F93_P_3_LEN_0,
ab4e4ed5
AF
875 MOD_VEX_W_0_0F98_P_0_LEN_0,
876 MOD_VEX_W_1_0F98_P_0_LEN_0,
877 MOD_VEX_W_0_0F98_P_2_LEN_0,
878 MOD_VEX_W_1_0F98_P_2_LEN_0,
879 MOD_VEX_W_0_0F99_P_0_LEN_0,
880 MOD_VEX_W_1_0F99_P_0_LEN_0,
881 MOD_VEX_W_0_0F99_P_2_LEN_0,
882 MOD_VEX_W_1_0F99_P_2_LEN_0,
592a252b
L
883 MOD_VEX_0FAE_REG_2,
884 MOD_VEX_0FAE_REG_3,
7531c613
JB
885 MOD_VEX_0FD7,
886 MOD_VEX_0FE7,
592a252b 887 MOD_VEX_0FF0_PREFIX_3,
7531c613
JB
888 MOD_VEX_0F381A,
889 MOD_VEX_0F382A,
890 MOD_VEX_0F382C,
891 MOD_VEX_0F382D,
892 MOD_VEX_0F382E,
893 MOD_VEX_0F382F,
894 MOD_VEX_0F385A,
895 MOD_VEX_0F388C,
896 MOD_VEX_0F388E,
bb5b3501
JB
897 MOD_VEX_0F3A30_L_0,
898 MOD_VEX_0F3A31_L_0,
899 MOD_VEX_0F3A32_L_0,
900 MOD_VEX_0F3A33_L_0,
43234a1e 901
467bbef0
JB
902 MOD_VEX_0FXOP_09_12,
903
43234a1e 904 MOD_EVEX_0F12_PREFIX_0,
97e6786a
JB
905 MOD_EVEX_0F12_PREFIX_2,
906 MOD_EVEX_0F13,
43234a1e 907 MOD_EVEX_0F16_PREFIX_0,
97e6786a
JB
908 MOD_EVEX_0F16_PREFIX_2,
909 MOD_EVEX_0F17,
910 MOD_EVEX_0F2B,
7531c613
JB
911 MOD_EVEX_0F381A_W_0,
912 MOD_EVEX_0F381A_W_1,
913 MOD_EVEX_0F381B_W_0,
914 MOD_EVEX_0F381B_W_1,
915 MOD_EVEX_0F385A_W_0,
916 MOD_EVEX_0F385A_W_1,
917 MOD_EVEX_0F385B_W_0,
918 MOD_EVEX_0F385B_W_1,
43234a1e
L
919 MOD_EVEX_0F38C6_REG_1,
920 MOD_EVEX_0F38C6_REG_2,
921 MOD_EVEX_0F38C6_REG_5,
922 MOD_EVEX_0F38C6_REG_6,
923 MOD_EVEX_0F38C7_REG_1,
924 MOD_EVEX_0F38C7_REG_2,
925 MOD_EVEX_0F38C7_REG_5,
926 MOD_EVEX_0F38C7_REG_6
51e7da1b 927};
1ceb70f8 928
51e7da1b
L
929enum
930{
42164a71
L
931 RM_C6_REG_7 = 0,
932 RM_C7_REG_7,
933 RM_0F01_REG_0,
3873ba12
L
934 RM_0F01_REG_1,
935 RM_0F01_REG_2,
936 RM_0F01_REG_3,
f8687e93
JB
937 RM_0F01_REG_5_MOD_3,
938 RM_0F01_REG_7_MOD_3,
939 RM_0F1E_P_1_MOD_3_REG_7,
940 RM_0FAE_REG_6_MOD_3_P_0,
941 RM_0FAE_REG_7_MOD_3,
260cd341 942 RM_VEX_0F3849_X86_64_P_0_W_0_M_1_R_0
51e7da1b 943};
1ceb70f8 944
51e7da1b
L
945enum
946{
947 PREFIX_90 = 0,
a847e322 948 PREFIX_0F01_REG_3_RM_1,
f8687e93
JB
949 PREFIX_0F01_REG_5_MOD_0,
950 PREFIX_0F01_REG_5_MOD_3_RM_0,
bb651e8b 951 PREFIX_0F01_REG_5_MOD_3_RM_1,
f8687e93 952 PREFIX_0F01_REG_5_MOD_3_RM_2,
267b8516 953 PREFIX_0F01_REG_7_MOD_3_RM_2,
3233d7d0 954 PREFIX_0F09,
3873ba12
L
955 PREFIX_0F10,
956 PREFIX_0F11,
957 PREFIX_0F12,
958 PREFIX_0F16,
7e8b059b
L
959 PREFIX_0F1A,
960 PREFIX_0F1B,
c48935d7 961 PREFIX_0F1C,
603555e5 962 PREFIX_0F1E,
3873ba12
L
963 PREFIX_0F2A,
964 PREFIX_0F2B,
965 PREFIX_0F2C,
966 PREFIX_0F2D,
967 PREFIX_0F2E,
968 PREFIX_0F2F,
969 PREFIX_0F51,
970 PREFIX_0F52,
971 PREFIX_0F53,
972 PREFIX_0F58,
973 PREFIX_0F59,
974 PREFIX_0F5A,
975 PREFIX_0F5B,
976 PREFIX_0F5C,
977 PREFIX_0F5D,
978 PREFIX_0F5E,
979 PREFIX_0F5F,
980 PREFIX_0F60,
981 PREFIX_0F61,
982 PREFIX_0F62,
3873ba12
L
983 PREFIX_0F6F,
984 PREFIX_0F70,
3873ba12
L
985 PREFIX_0F78,
986 PREFIX_0F79,
987 PREFIX_0F7C,
988 PREFIX_0F7D,
989 PREFIX_0F7E,
990 PREFIX_0F7F,
f8687e93
JB
991 PREFIX_0FAE_REG_0_MOD_3,
992 PREFIX_0FAE_REG_1_MOD_3,
993 PREFIX_0FAE_REG_2_MOD_3,
994 PREFIX_0FAE_REG_3_MOD_3,
995 PREFIX_0FAE_REG_4_MOD_0,
996 PREFIX_0FAE_REG_4_MOD_3,
f8687e93
JB
997 PREFIX_0FAE_REG_5_MOD_3,
998 PREFIX_0FAE_REG_6_MOD_0,
999 PREFIX_0FAE_REG_6_MOD_3,
1000 PREFIX_0FAE_REG_7_MOD_0,
3873ba12 1001 PREFIX_0FB8,
f12dc422 1002 PREFIX_0FBC,
3873ba12
L
1003 PREFIX_0FBD,
1004 PREFIX_0FC2,
f8687e93
JB
1005 PREFIX_0FC7_REG_6_MOD_0,
1006 PREFIX_0FC7_REG_6_MOD_3,
1007 PREFIX_0FC7_REG_7_MOD_3,
3873ba12
L
1008 PREFIX_0FD0,
1009 PREFIX_0FD6,
1010 PREFIX_0FE6,
1011 PREFIX_0FE7,
1012 PREFIX_0FF0,
1013 PREFIX_0FF7,
3873ba12
L
1014 PREFIX_0F38F0,
1015 PREFIX_0F38F1,
e2e1fcde 1016 PREFIX_0F38F6,
c0a30a9f 1017 PREFIX_0F38F8,
592a252b
L
1018 PREFIX_VEX_0F10,
1019 PREFIX_VEX_0F11,
1020 PREFIX_VEX_0F12,
1021 PREFIX_VEX_0F16,
1022 PREFIX_VEX_0F2A,
1023 PREFIX_VEX_0F2C,
1024 PREFIX_VEX_0F2D,
1025 PREFIX_VEX_0F2E,
1026 PREFIX_VEX_0F2F,
43234a1e
L
1027 PREFIX_VEX_0F41,
1028 PREFIX_VEX_0F42,
1029 PREFIX_VEX_0F44,
1030 PREFIX_VEX_0F45,
1031 PREFIX_VEX_0F46,
1032 PREFIX_VEX_0F47,
1ba585e8 1033 PREFIX_VEX_0F4A,
43234a1e 1034 PREFIX_VEX_0F4B,
592a252b
L
1035 PREFIX_VEX_0F51,
1036 PREFIX_VEX_0F52,
1037 PREFIX_VEX_0F53,
1038 PREFIX_VEX_0F58,
1039 PREFIX_VEX_0F59,
1040 PREFIX_VEX_0F5A,
1041 PREFIX_VEX_0F5B,
1042 PREFIX_VEX_0F5C,
1043 PREFIX_VEX_0F5D,
1044 PREFIX_VEX_0F5E,
1045 PREFIX_VEX_0F5F,
592a252b
L
1046 PREFIX_VEX_0F6F,
1047 PREFIX_VEX_0F70,
592a252b
L
1048 PREFIX_VEX_0F7C,
1049 PREFIX_VEX_0F7D,
1050 PREFIX_VEX_0F7E,
1051 PREFIX_VEX_0F7F,
43234a1e
L
1052 PREFIX_VEX_0F90,
1053 PREFIX_VEX_0F91,
1054 PREFIX_VEX_0F92,
1055 PREFIX_VEX_0F93,
1056 PREFIX_VEX_0F98,
1ba585e8 1057 PREFIX_VEX_0F99,
592a252b 1058 PREFIX_VEX_0FC2,
592a252b 1059 PREFIX_VEX_0FD0,
592a252b 1060 PREFIX_VEX_0FE6,
592a252b 1061 PREFIX_VEX_0FF0,
260cd341
LC
1062 PREFIX_VEX_0F3849_X86_64,
1063 PREFIX_VEX_0F384B_X86_64,
260cd341
LC
1064 PREFIX_VEX_0F385C_X86_64,
1065 PREFIX_VEX_0F385E_X86_64,
6c30d220
L
1066 PREFIX_VEX_0F38F5,
1067 PREFIX_VEX_0F38F6,
f12dc422 1068 PREFIX_VEX_0F38F7,
43234a1e
L
1069 PREFIX_VEX_0F3AF0,
1070
1071 PREFIX_EVEX_0F10,
1072 PREFIX_EVEX_0F11,
1073 PREFIX_EVEX_0F12,
43234a1e 1074 PREFIX_EVEX_0F16,
43234a1e 1075 PREFIX_EVEX_0F2A,
43234a1e
L
1076 PREFIX_EVEX_0F51,
1077 PREFIX_EVEX_0F58,
1078 PREFIX_EVEX_0F59,
1079 PREFIX_EVEX_0F5A,
1080 PREFIX_EVEX_0F5B,
1081 PREFIX_EVEX_0F5C,
1082 PREFIX_EVEX_0F5D,
1083 PREFIX_EVEX_0F5E,
1084 PREFIX_EVEX_0F5F,
43234a1e
L
1085 PREFIX_EVEX_0F6F,
1086 PREFIX_EVEX_0F70,
43234a1e
L
1087 PREFIX_EVEX_0F78,
1088 PREFIX_EVEX_0F79,
1089 PREFIX_EVEX_0F7A,
1090 PREFIX_EVEX_0F7B,
1091 PREFIX_EVEX_0F7E,
1092 PREFIX_EVEX_0F7F,
1093 PREFIX_EVEX_0FC2,
43234a1e 1094 PREFIX_EVEX_0FE6,
1ba585e8 1095 PREFIX_EVEX_0F3810,
43234a1e
L
1096 PREFIX_EVEX_0F3811,
1097 PREFIX_EVEX_0F3812,
1098 PREFIX_EVEX_0F3813,
1099 PREFIX_EVEX_0F3814,
1100 PREFIX_EVEX_0F3815,
1ba585e8 1101 PREFIX_EVEX_0F3820,
43234a1e
L
1102 PREFIX_EVEX_0F3821,
1103 PREFIX_EVEX_0F3822,
1104 PREFIX_EVEX_0F3823,
1105 PREFIX_EVEX_0F3824,
1106 PREFIX_EVEX_0F3825,
1ba585e8 1107 PREFIX_EVEX_0F3826,
43234a1e
L
1108 PREFIX_EVEX_0F3827,
1109 PREFIX_EVEX_0F3828,
1110 PREFIX_EVEX_0F3829,
1111 PREFIX_EVEX_0F382A,
1ba585e8 1112 PREFIX_EVEX_0F3830,
43234a1e
L
1113 PREFIX_EVEX_0F3831,
1114 PREFIX_EVEX_0F3832,
1115 PREFIX_EVEX_0F3833,
1116 PREFIX_EVEX_0F3834,
1117 PREFIX_EVEX_0F3835,
1ba585e8 1118 PREFIX_EVEX_0F3838,
43234a1e
L
1119 PREFIX_EVEX_0F3839,
1120 PREFIX_EVEX_0F383A,
47acf0bd
IT
1121 PREFIX_EVEX_0F3852,
1122 PREFIX_EVEX_0F3853,
9186c494 1123 PREFIX_EVEX_0F3868,
53467f57 1124 PREFIX_EVEX_0F3872,
43234a1e
L
1125 PREFIX_EVEX_0F389A,
1126 PREFIX_EVEX_0F389B,
43234a1e
L
1127 PREFIX_EVEX_0F38AA,
1128 PREFIX_EVEX_0F38AB,
51e7da1b 1129};
4e7d34a6 1130
51e7da1b
L
1131enum
1132{
1133 X86_64_06 = 0,
3873ba12 1134 X86_64_07,
1673df32 1135 X86_64_0E,
3873ba12
L
1136 X86_64_16,
1137 X86_64_17,
1138 X86_64_1E,
1139 X86_64_1F,
1140 X86_64_27,
1141 X86_64_2F,
1142 X86_64_37,
1143 X86_64_3F,
1144 X86_64_60,
1145 X86_64_61,
1146 X86_64_62,
1147 X86_64_63,
1148 X86_64_6D,
1149 X86_64_6F,
d039fef3 1150 X86_64_82,
3873ba12 1151 X86_64_9A,
aeab2b26
JB
1152 X86_64_C2,
1153 X86_64_C3,
3873ba12
L
1154 X86_64_C4,
1155 X86_64_C5,
1156 X86_64_CE,
1157 X86_64_D4,
1158 X86_64_D5,
a72d2af2
L
1159 X86_64_E8,
1160 X86_64_E9,
3873ba12
L
1161 X86_64_EA,
1162 X86_64_0F01_REG_0,
1163 X86_64_0F01_REG_1,
1164 X86_64_0F01_REG_2,
260cd341
LC
1165 X86_64_0F01_REG_3,
1166 X86_64_VEX_0F3849,
1167 X86_64_VEX_0F384B,
1168 X86_64_VEX_0F385C,
1169 X86_64_VEX_0F385E
51e7da1b 1170};
4e7d34a6 1171
51e7da1b
L
1172enum
1173{
1174 THREE_BYTE_0F38 = 0,
1f334aeb 1175 THREE_BYTE_0F3A
51e7da1b 1176};
4e7d34a6 1177
f88c9eb0
SP
1178enum
1179{
5dd85c99
SP
1180 XOP_08 = 0,
1181 XOP_09,
f88c9eb0
SP
1182 XOP_0A
1183};
1184
51e7da1b
L
1185enum
1186{
1187 VEX_0F = 0,
3873ba12
L
1188 VEX_0F38,
1189 VEX_0F3A
51e7da1b 1190};
c0f3af97 1191
43234a1e
L
1192enum
1193{
1194 EVEX_0F = 0,
1195 EVEX_0F38,
1196 EVEX_0F3A
1197};
1198
51e7da1b
L
1199enum
1200{
ec6f095a 1201 VEX_LEN_0F12_P_0_M_0 = 0,
592a252b 1202 VEX_LEN_0F12_P_0_M_1,
18897deb 1203#define VEX_LEN_0F12_P_2_M_0 VEX_LEN_0F12_P_0_M_0
592a252b
L
1204 VEX_LEN_0F13_M_0,
1205 VEX_LEN_0F16_P_0_M_0,
1206 VEX_LEN_0F16_P_0_M_1,
18897deb 1207#define VEX_LEN_0F16_P_2_M_0 VEX_LEN_0F16_P_0_M_0
592a252b 1208 VEX_LEN_0F17_M_0,
43234a1e 1209 VEX_LEN_0F41_P_0,
1ba585e8 1210 VEX_LEN_0F41_P_2,
43234a1e 1211 VEX_LEN_0F42_P_0,
1ba585e8 1212 VEX_LEN_0F42_P_2,
43234a1e 1213 VEX_LEN_0F44_P_0,
1ba585e8 1214 VEX_LEN_0F44_P_2,
43234a1e 1215 VEX_LEN_0F45_P_0,
1ba585e8 1216 VEX_LEN_0F45_P_2,
43234a1e 1217 VEX_LEN_0F46_P_0,
1ba585e8 1218 VEX_LEN_0F46_P_2,
43234a1e 1219 VEX_LEN_0F47_P_0,
1ba585e8
IT
1220 VEX_LEN_0F47_P_2,
1221 VEX_LEN_0F4A_P_0,
1222 VEX_LEN_0F4A_P_2,
1223 VEX_LEN_0F4B_P_0,
43234a1e 1224 VEX_LEN_0F4B_P_2,
7531c613 1225 VEX_LEN_0F6E,
035e7389 1226 VEX_LEN_0F77,
592a252b
L
1227 VEX_LEN_0F7E_P_1,
1228 VEX_LEN_0F7E_P_2,
43234a1e 1229 VEX_LEN_0F90_P_0,
1ba585e8 1230 VEX_LEN_0F90_P_2,
43234a1e 1231 VEX_LEN_0F91_P_0,
1ba585e8 1232 VEX_LEN_0F91_P_2,
43234a1e 1233 VEX_LEN_0F92_P_0,
90a915bf 1234 VEX_LEN_0F92_P_2,
1ba585e8 1235 VEX_LEN_0F92_P_3,
43234a1e 1236 VEX_LEN_0F93_P_0,
90a915bf 1237 VEX_LEN_0F93_P_2,
1ba585e8 1238 VEX_LEN_0F93_P_3,
43234a1e 1239 VEX_LEN_0F98_P_0,
1ba585e8
IT
1240 VEX_LEN_0F98_P_2,
1241 VEX_LEN_0F99_P_0,
1242 VEX_LEN_0F99_P_2,
592a252b
L
1243 VEX_LEN_0FAE_R_2_M_0,
1244 VEX_LEN_0FAE_R_3_M_0,
7531c613
JB
1245 VEX_LEN_0FC4,
1246 VEX_LEN_0FC5,
1247 VEX_LEN_0FD6,
1248 VEX_LEN_0FF7,
1249 VEX_LEN_0F3816,
1250 VEX_LEN_0F3819,
1251 VEX_LEN_0F381A_M_0,
1252 VEX_LEN_0F3836,
1253 VEX_LEN_0F3841,
260cd341
LC
1254 VEX_LEN_0F3849_X86_64_P_0_W_0_M_0,
1255 VEX_LEN_0F3849_X86_64_P_0_W_0_M_1_REG_0_RM_0,
1256 VEX_LEN_0F3849_X86_64_P_2_W_0_M_0,
1257 VEX_LEN_0F3849_X86_64_P_3_W_0_M_0,
1258 VEX_LEN_0F384B_X86_64_P_1_W_0_M_0,
1259 VEX_LEN_0F384B_X86_64_P_2_W_0_M_0,
1260 VEX_LEN_0F384B_X86_64_P_3_W_0_M_0,
7531c613 1261 VEX_LEN_0F385A_M_0,
260cd341
LC
1262 VEX_LEN_0F385C_X86_64_P_1_W_0_M_0,
1263 VEX_LEN_0F385E_X86_64_P_0_W_0_M_0,
1264 VEX_LEN_0F385E_X86_64_P_1_W_0_M_0,
1265 VEX_LEN_0F385E_X86_64_P_2_W_0_M_0,
1266 VEX_LEN_0F385E_X86_64_P_3_W_0_M_0,
7531c613 1267 VEX_LEN_0F38DB,
035e7389
JB
1268 VEX_LEN_0F38F2,
1269 VEX_LEN_0F38F3_R_1,
1270 VEX_LEN_0F38F3_R_2,
1271 VEX_LEN_0F38F3_R_3,
6c30d220
L
1272 VEX_LEN_0F38F5_P_0,
1273 VEX_LEN_0F38F5_P_1,
1274 VEX_LEN_0F38F5_P_3,
1275 VEX_LEN_0F38F6_P_3,
f12dc422 1276 VEX_LEN_0F38F7_P_0,
6c30d220
L
1277 VEX_LEN_0F38F7_P_1,
1278 VEX_LEN_0F38F7_P_2,
1279 VEX_LEN_0F38F7_P_3,
7531c613
JB
1280 VEX_LEN_0F3A00,
1281 VEX_LEN_0F3A01,
1282 VEX_LEN_0F3A06,
1283 VEX_LEN_0F3A14,
1284 VEX_LEN_0F3A15,
1285 VEX_LEN_0F3A16,
1286 VEX_LEN_0F3A17,
1287 VEX_LEN_0F3A18,
1288 VEX_LEN_0F3A19,
1289 VEX_LEN_0F3A20,
1290 VEX_LEN_0F3A21,
1291 VEX_LEN_0F3A22,
1292 VEX_LEN_0F3A30,
1293 VEX_LEN_0F3A31,
1294 VEX_LEN_0F3A32,
1295 VEX_LEN_0F3A33,
1296 VEX_LEN_0F3A38,
1297 VEX_LEN_0F3A39,
1298 VEX_LEN_0F3A41,
1299 VEX_LEN_0F3A46,
1300 VEX_LEN_0F3A60,
1301 VEX_LEN_0F3A61,
1302 VEX_LEN_0F3A62,
1303 VEX_LEN_0F3A63,
1304 VEX_LEN_0F3ADF,
6c30d220 1305 VEX_LEN_0F3AF0_P_3,
467bbef0
JB
1306 VEX_LEN_0FXOP_08_85,
1307 VEX_LEN_0FXOP_08_86,
1308 VEX_LEN_0FXOP_08_87,
1309 VEX_LEN_0FXOP_08_8E,
1310 VEX_LEN_0FXOP_08_8F,
1311 VEX_LEN_0FXOP_08_95,
1312 VEX_LEN_0FXOP_08_96,
1313 VEX_LEN_0FXOP_08_97,
1314 VEX_LEN_0FXOP_08_9E,
1315 VEX_LEN_0FXOP_08_9F,
1316 VEX_LEN_0FXOP_08_A3,
1317 VEX_LEN_0FXOP_08_A6,
1318 VEX_LEN_0FXOP_08_B6,
1319 VEX_LEN_0FXOP_08_C0,
1320 VEX_LEN_0FXOP_08_C1,
1321 VEX_LEN_0FXOP_08_C2,
1322 VEX_LEN_0FXOP_08_C3,
ff688e1f
L
1323 VEX_LEN_0FXOP_08_CC,
1324 VEX_LEN_0FXOP_08_CD,
1325 VEX_LEN_0FXOP_08_CE,
1326 VEX_LEN_0FXOP_08_CF,
1327 VEX_LEN_0FXOP_08_EC,
1328 VEX_LEN_0FXOP_08_ED,
1329 VEX_LEN_0FXOP_08_EE,
1330 VEX_LEN_0FXOP_08_EF,
467bbef0
JB
1331 VEX_LEN_0FXOP_09_01,
1332 VEX_LEN_0FXOP_09_02,
1333 VEX_LEN_0FXOP_09_12_M_1,
b5b098c2
JB
1334 VEX_LEN_0FXOP_09_82_W_0,
1335 VEX_LEN_0FXOP_09_83_W_0,
467bbef0
JB
1336 VEX_LEN_0FXOP_09_90,
1337 VEX_LEN_0FXOP_09_91,
1338 VEX_LEN_0FXOP_09_92,
1339 VEX_LEN_0FXOP_09_93,
1340 VEX_LEN_0FXOP_09_94,
1341 VEX_LEN_0FXOP_09_95,
1342 VEX_LEN_0FXOP_09_96,
1343 VEX_LEN_0FXOP_09_97,
1344 VEX_LEN_0FXOP_09_98,
1345 VEX_LEN_0FXOP_09_99,
1346 VEX_LEN_0FXOP_09_9A,
1347 VEX_LEN_0FXOP_09_9B,
1348 VEX_LEN_0FXOP_09_C1,
1349 VEX_LEN_0FXOP_09_C2,
1350 VEX_LEN_0FXOP_09_C3,
1351 VEX_LEN_0FXOP_09_C6,
1352 VEX_LEN_0FXOP_09_C7,
1353 VEX_LEN_0FXOP_09_CB,
1354 VEX_LEN_0FXOP_09_D1,
1355 VEX_LEN_0FXOP_09_D2,
1356 VEX_LEN_0FXOP_09_D3,
1357 VEX_LEN_0FXOP_09_D6,
1358 VEX_LEN_0FXOP_09_D7,
1359 VEX_LEN_0FXOP_09_DB,
1360 VEX_LEN_0FXOP_09_E1,
1361 VEX_LEN_0FXOP_09_E2,
1362 VEX_LEN_0FXOP_09_E3,
1363 VEX_LEN_0FXOP_0A_12,
51e7da1b 1364};
c0f3af97 1365
04e2a182
L
1366enum
1367{
7531c613 1368 EVEX_LEN_0F6E = 0,
04e2a182
L
1369 EVEX_LEN_0F7E_P_1,
1370 EVEX_LEN_0F7E_P_2,
7531c613
JB
1371 EVEX_LEN_0FC4,
1372 EVEX_LEN_0FC5,
1373 EVEX_LEN_0FD6,
1374 EVEX_LEN_0F3816,
1375 EVEX_LEN_0F3819_W_0,
1376 EVEX_LEN_0F3819_W_1,
1377 EVEX_LEN_0F381A_W_0_M_0,
1378 EVEX_LEN_0F381A_W_1_M_0,
1379 EVEX_LEN_0F381B_W_0_M_0,
1380 EVEX_LEN_0F381B_W_1_M_0,
1381 EVEX_LEN_0F3836,
1382 EVEX_LEN_0F385A_W_0_M_0,
1383 EVEX_LEN_0F385A_W_1_M_0,
1384 EVEX_LEN_0F385B_W_0_M_0,
1385 EVEX_LEN_0F385B_W_1_M_0,
1386 EVEX_LEN_0F38C6_R_1_M_0,
1387 EVEX_LEN_0F38C6_R_2_M_0,
1388 EVEX_LEN_0F38C6_R_5_M_0,
1389 EVEX_LEN_0F38C6_R_6_M_0,
1390 EVEX_LEN_0F38C7_R_1_M_0_W_0,
1391 EVEX_LEN_0F38C7_R_1_M_0_W_1,
1392 EVEX_LEN_0F38C7_R_2_M_0_W_0,
1393 EVEX_LEN_0F38C7_R_2_M_0_W_1,
1394 EVEX_LEN_0F38C7_R_5_M_0_W_0,
1395 EVEX_LEN_0F38C7_R_5_M_0_W_1,
1396 EVEX_LEN_0F38C7_R_6_M_0_W_0,
1397 EVEX_LEN_0F38C7_R_6_M_0_W_1,
1398 EVEX_LEN_0F3A00_W_1,
1399 EVEX_LEN_0F3A01_W_1,
1400 EVEX_LEN_0F3A14,
1401 EVEX_LEN_0F3A15,
1402 EVEX_LEN_0F3A16,
1403 EVEX_LEN_0F3A17,
1404 EVEX_LEN_0F3A18_W_0,
1405 EVEX_LEN_0F3A18_W_1,
1406 EVEX_LEN_0F3A19_W_0,
1407 EVEX_LEN_0F3A19_W_1,
1408 EVEX_LEN_0F3A1A_W_0,
1409 EVEX_LEN_0F3A1A_W_1,
1410 EVEX_LEN_0F3A1B_W_0,
1411 EVEX_LEN_0F3A1B_W_1,
1412 EVEX_LEN_0F3A20,
1413 EVEX_LEN_0F3A21_W_0,
1414 EVEX_LEN_0F3A22,
1415 EVEX_LEN_0F3A23_W_0,
1416 EVEX_LEN_0F3A23_W_1,
1417 EVEX_LEN_0F3A38_W_0,
1418 EVEX_LEN_0F3A38_W_1,
1419 EVEX_LEN_0F3A39_W_0,
1420 EVEX_LEN_0F3A39_W_1,
1421 EVEX_LEN_0F3A3A_W_0,
1422 EVEX_LEN_0F3A3A_W_1,
1423 EVEX_LEN_0F3A3B_W_0,
1424 EVEX_LEN_0F3A3B_W_1,
1425 EVEX_LEN_0F3A43_W_0,
1426 EVEX_LEN_0F3A43_W_1
04e2a182
L
1427};
1428
9e30b8e0
L
1429enum
1430{
ec6f095a 1431 VEX_W_0F41_P_0_LEN_1 = 0,
1ba585e8 1432 VEX_W_0F41_P_2_LEN_1,
43234a1e 1433 VEX_W_0F42_P_0_LEN_1,
1ba585e8 1434 VEX_W_0F42_P_2_LEN_1,
43234a1e 1435 VEX_W_0F44_P_0_LEN_0,
1ba585e8 1436 VEX_W_0F44_P_2_LEN_0,
43234a1e 1437 VEX_W_0F45_P_0_LEN_1,
1ba585e8 1438 VEX_W_0F45_P_2_LEN_1,
43234a1e 1439 VEX_W_0F46_P_0_LEN_1,
1ba585e8 1440 VEX_W_0F46_P_2_LEN_1,
43234a1e 1441 VEX_W_0F47_P_0_LEN_1,
1ba585e8
IT
1442 VEX_W_0F47_P_2_LEN_1,
1443 VEX_W_0F4A_P_0_LEN_1,
1444 VEX_W_0F4A_P_2_LEN_1,
1445 VEX_W_0F4B_P_0_LEN_1,
43234a1e 1446 VEX_W_0F4B_P_2_LEN_1,
43234a1e 1447 VEX_W_0F90_P_0_LEN_0,
1ba585e8 1448 VEX_W_0F90_P_2_LEN_0,
43234a1e 1449 VEX_W_0F91_P_0_LEN_0,
1ba585e8 1450 VEX_W_0F91_P_2_LEN_0,
43234a1e 1451 VEX_W_0F92_P_0_LEN_0,
90a915bf 1452 VEX_W_0F92_P_2_LEN_0,
43234a1e 1453 VEX_W_0F93_P_0_LEN_0,
90a915bf 1454 VEX_W_0F93_P_2_LEN_0,
43234a1e 1455 VEX_W_0F98_P_0_LEN_0,
1ba585e8
IT
1456 VEX_W_0F98_P_2_LEN_0,
1457 VEX_W_0F99_P_0_LEN_0,
1458 VEX_W_0F99_P_2_LEN_0,
7531c613
JB
1459 VEX_W_0F380C,
1460 VEX_W_0F380D,
1461 VEX_W_0F380E,
1462 VEX_W_0F380F,
1463 VEX_W_0F3813,
1464 VEX_W_0F3816_L_1,
1465 VEX_W_0F3818,
1466 VEX_W_0F3819_L_1,
1467 VEX_W_0F381A_M_0_L_1,
1468 VEX_W_0F382C_M_0,
1469 VEX_W_0F382D_M_0,
1470 VEX_W_0F382E_M_0,
1471 VEX_W_0F382F_M_0,
1472 VEX_W_0F3836,
1473 VEX_W_0F3846,
260cd341
LC
1474 VEX_W_0F3849_X86_64_P_0,
1475 VEX_W_0F3849_X86_64_P_2,
1476 VEX_W_0F3849_X86_64_P_3,
1477 VEX_W_0F384B_X86_64_P_1,
1478 VEX_W_0F384B_X86_64_P_2,
1479 VEX_W_0F384B_X86_64_P_3,
7531c613
JB
1480 VEX_W_0F3858,
1481 VEX_W_0F3859,
1482 VEX_W_0F385A_M_0_L_0,
260cd341
LC
1483 VEX_W_0F385C_X86_64_P_1,
1484 VEX_W_0F385E_X86_64_P_0,
1485 VEX_W_0F385E_X86_64_P_1,
1486 VEX_W_0F385E_X86_64_P_2,
1487 VEX_W_0F385E_X86_64_P_3,
7531c613
JB
1488 VEX_W_0F3878,
1489 VEX_W_0F3879,
1490 VEX_W_0F38CF,
1491 VEX_W_0F3A00_L_1,
1492 VEX_W_0F3A01_L_1,
1493 VEX_W_0F3A02,
1494 VEX_W_0F3A04,
1495 VEX_W_0F3A05,
1496 VEX_W_0F3A06_L_1,
1497 VEX_W_0F3A18_L_1,
1498 VEX_W_0F3A19_L_1,
1499 VEX_W_0F3A1D,
7531c613
JB
1500 VEX_W_0F3A38_L_1,
1501 VEX_W_0F3A39_L_1,
1502 VEX_W_0F3A46_L_1,
1503 VEX_W_0F3A4A,
1504 VEX_W_0F3A4B,
1505 VEX_W_0F3A4C,
1506 VEX_W_0F3ACE,
1507 VEX_W_0F3ACF,
43234a1e 1508
467bbef0
JB
1509 VEX_W_0FXOP_08_85_L_0,
1510 VEX_W_0FXOP_08_86_L_0,
1511 VEX_W_0FXOP_08_87_L_0,
1512 VEX_W_0FXOP_08_8E_L_0,
1513 VEX_W_0FXOP_08_8F_L_0,
1514 VEX_W_0FXOP_08_95_L_0,
1515 VEX_W_0FXOP_08_96_L_0,
1516 VEX_W_0FXOP_08_97_L_0,
1517 VEX_W_0FXOP_08_9E_L_0,
1518 VEX_W_0FXOP_08_9F_L_0,
1519 VEX_W_0FXOP_08_A6_L_0,
1520 VEX_W_0FXOP_08_B6_L_0,
1521 VEX_W_0FXOP_08_C0_L_0,
1522 VEX_W_0FXOP_08_C1_L_0,
1523 VEX_W_0FXOP_08_C2_L_0,
1524 VEX_W_0FXOP_08_C3_L_0,
1525 VEX_W_0FXOP_08_CC_L_0,
1526 VEX_W_0FXOP_08_CD_L_0,
1527 VEX_W_0FXOP_08_CE_L_0,
1528 VEX_W_0FXOP_08_CF_L_0,
1529 VEX_W_0FXOP_08_EC_L_0,
1530 VEX_W_0FXOP_08_ED_L_0,
1531 VEX_W_0FXOP_08_EE_L_0,
1532 VEX_W_0FXOP_08_EF_L_0,
1533
b5b098c2
JB
1534 VEX_W_0FXOP_09_80,
1535 VEX_W_0FXOP_09_81,
1536 VEX_W_0FXOP_09_82,
1537 VEX_W_0FXOP_09_83,
467bbef0
JB
1538 VEX_W_0FXOP_09_C1_L_0,
1539 VEX_W_0FXOP_09_C2_L_0,
1540 VEX_W_0FXOP_09_C3_L_0,
1541 VEX_W_0FXOP_09_C6_L_0,
1542 VEX_W_0FXOP_09_C7_L_0,
1543 VEX_W_0FXOP_09_CB_L_0,
1544 VEX_W_0FXOP_09_D1_L_0,
1545 VEX_W_0FXOP_09_D2_L_0,
1546 VEX_W_0FXOP_09_D3_L_0,
1547 VEX_W_0FXOP_09_D6_L_0,
1548 VEX_W_0FXOP_09_D7_L_0,
1549 VEX_W_0FXOP_09_DB_L_0,
1550 VEX_W_0FXOP_09_E1_L_0,
1551 VEX_W_0FXOP_09_E2_L_0,
1552 VEX_W_0FXOP_09_E3_L_0,
b5b098c2 1553
36cc073e 1554 EVEX_W_0F10_P_1,
36cc073e 1555 EVEX_W_0F10_P_3,
36cc073e 1556 EVEX_W_0F11_P_1,
36cc073e 1557 EVEX_W_0F11_P_3,
43234a1e
L
1558 EVEX_W_0F12_P_0_M_1,
1559 EVEX_W_0F12_P_1,
43234a1e 1560 EVEX_W_0F12_P_3,
43234a1e
L
1561 EVEX_W_0F16_P_0_M_1,
1562 EVEX_W_0F16_P_1,
43234a1e 1563 EVEX_W_0F2A_P_3,
43234a1e 1564 EVEX_W_0F51_P_1,
43234a1e 1565 EVEX_W_0F51_P_3,
43234a1e 1566 EVEX_W_0F58_P_1,
43234a1e 1567 EVEX_W_0F58_P_3,
43234a1e 1568 EVEX_W_0F59_P_1,
43234a1e
L
1569 EVEX_W_0F59_P_3,
1570 EVEX_W_0F5A_P_0,
1571 EVEX_W_0F5A_P_1,
1572 EVEX_W_0F5A_P_2,
1573 EVEX_W_0F5A_P_3,
1574 EVEX_W_0F5B_P_0,
1575 EVEX_W_0F5B_P_1,
1576 EVEX_W_0F5B_P_2,
43234a1e 1577 EVEX_W_0F5C_P_1,
43234a1e 1578 EVEX_W_0F5C_P_3,
43234a1e 1579 EVEX_W_0F5D_P_1,
43234a1e 1580 EVEX_W_0F5D_P_3,
43234a1e 1581 EVEX_W_0F5E_P_1,
43234a1e 1582 EVEX_W_0F5E_P_3,
43234a1e 1583 EVEX_W_0F5F_P_1,
43234a1e 1584 EVEX_W_0F5F_P_3,
fedfb81e 1585 EVEX_W_0F62,
7531c613 1586 EVEX_W_0F66,
fedfb81e
JB
1587 EVEX_W_0F6A,
1588 EVEX_W_0F6B,
1589 EVEX_W_0F6C,
1590 EVEX_W_0F6D,
43234a1e
L
1591 EVEX_W_0F6F_P_1,
1592 EVEX_W_0F6F_P_2,
1ba585e8 1593 EVEX_W_0F6F_P_3,
43234a1e 1594 EVEX_W_0F70_P_2,
7531c613
JB
1595 EVEX_W_0F72_R_2,
1596 EVEX_W_0F72_R_6,
1597 EVEX_W_0F73_R_2,
1598 EVEX_W_0F73_R_6,
1599 EVEX_W_0F76,
43234a1e 1600 EVEX_W_0F78_P_0,
90a915bf 1601 EVEX_W_0F78_P_2,
43234a1e 1602 EVEX_W_0F79_P_0,
90a915bf 1603 EVEX_W_0F79_P_2,
43234a1e 1604 EVEX_W_0F7A_P_1,
90a915bf 1605 EVEX_W_0F7A_P_2,
43234a1e 1606 EVEX_W_0F7A_P_3,
90a915bf 1607 EVEX_W_0F7B_P_2,
43234a1e
L
1608 EVEX_W_0F7B_P_3,
1609 EVEX_W_0F7E_P_1,
43234a1e
L
1610 EVEX_W_0F7F_P_1,
1611 EVEX_W_0F7F_P_2,
1ba585e8 1612 EVEX_W_0F7F_P_3,
43234a1e 1613 EVEX_W_0FC2_P_1,
43234a1e 1614 EVEX_W_0FC2_P_3,
fedfb81e
JB
1615 EVEX_W_0FD2,
1616 EVEX_W_0FD3,
1617 EVEX_W_0FD4,
7531c613 1618 EVEX_W_0FD6_L_0,
43234a1e
L
1619 EVEX_W_0FE6_P_1,
1620 EVEX_W_0FE6_P_2,
1621 EVEX_W_0FE6_P_3,
7531c613 1622 EVEX_W_0FE7,
fedfb81e
JB
1623 EVEX_W_0FF2,
1624 EVEX_W_0FF3,
1625 EVEX_W_0FF4,
1626 EVEX_W_0FFA,
1627 EVEX_W_0FFB,
1628 EVEX_W_0FFE,
7531c613 1629 EVEX_W_0F380D,
1ba585e8
IT
1630 EVEX_W_0F3810_P_1,
1631 EVEX_W_0F3810_P_2,
43234a1e 1632 EVEX_W_0F3811_P_1,
1ba585e8 1633 EVEX_W_0F3811_P_2,
43234a1e 1634 EVEX_W_0F3812_P_1,
1ba585e8 1635 EVEX_W_0F3812_P_2,
43234a1e
L
1636 EVEX_W_0F3813_P_1,
1637 EVEX_W_0F3813_P_2,
1638 EVEX_W_0F3814_P_1,
1639 EVEX_W_0F3815_P_1,
7531c613
JB
1640 EVEX_W_0F3819,
1641 EVEX_W_0F381A,
1642 EVEX_W_0F381B,
1643 EVEX_W_0F381E,
1644 EVEX_W_0F381F,
1ba585e8 1645 EVEX_W_0F3820_P_1,
43234a1e
L
1646 EVEX_W_0F3821_P_1,
1647 EVEX_W_0F3822_P_1,
1648 EVEX_W_0F3823_P_1,
1649 EVEX_W_0F3824_P_1,
1650 EVEX_W_0F3825_P_1,
1651 EVEX_W_0F3825_P_2,
1652 EVEX_W_0F3828_P_2,
1653 EVEX_W_0F3829_P_2,
1654 EVEX_W_0F382A_P_1,
1655 EVEX_W_0F382A_P_2,
fedfb81e 1656 EVEX_W_0F382B,
1ba585e8 1657 EVEX_W_0F3830_P_1,
43234a1e
L
1658 EVEX_W_0F3831_P_1,
1659 EVEX_W_0F3832_P_1,
1660 EVEX_W_0F3833_P_1,
1661 EVEX_W_0F3834_P_1,
1662 EVEX_W_0F3835_P_1,
1663 EVEX_W_0F3835_P_2,
7531c613 1664 EVEX_W_0F3837,
43234a1e 1665 EVEX_W_0F383A_P_1,
d6aab7a1 1666 EVEX_W_0F3852_P_1,
7531c613
JB
1667 EVEX_W_0F3859,
1668 EVEX_W_0F385A,
1669 EVEX_W_0F385B,
1670 EVEX_W_0F3870,
d6aab7a1 1671 EVEX_W_0F3872_P_1,
53467f57 1672 EVEX_W_0F3872_P_2,
d6aab7a1 1673 EVEX_W_0F3872_P_3,
7531c613
JB
1674 EVEX_W_0F387A,
1675 EVEX_W_0F387B,
1676 EVEX_W_0F3883,
1677 EVEX_W_0F3891,
1678 EVEX_W_0F3893,
1679 EVEX_W_0F38A1,
1680 EVEX_W_0F38A3,
1681 EVEX_W_0F38C7_R_1_M_0,
1682 EVEX_W_0F38C7_R_2_M_0,
1683 EVEX_W_0F38C7_R_5_M_0,
1684 EVEX_W_0F38C7_R_6_M_0,
1685
1686 EVEX_W_0F3A00,
1687 EVEX_W_0F3A01,
1688 EVEX_W_0F3A05,
1689 EVEX_W_0F3A08,
1690 EVEX_W_0F3A09,
1691 EVEX_W_0F3A0A,
1692 EVEX_W_0F3A0B,
1693 EVEX_W_0F3A18,
1694 EVEX_W_0F3A19,
1695 EVEX_W_0F3A1A,
1696 EVEX_W_0F3A1B,
1697 EVEX_W_0F3A21,
1698 EVEX_W_0F3A23,
1699 EVEX_W_0F3A38,
1700 EVEX_W_0F3A39,
1701 EVEX_W_0F3A3A,
1702 EVEX_W_0F3A3B,
1703 EVEX_W_0F3A42,
1704 EVEX_W_0F3A43,
1705 EVEX_W_0F3A70,
1706 EVEX_W_0F3A72,
9e30b8e0
L
1707};
1708
26ca5450 1709typedef void (*op_rtn) (int bytemode, int sizeflag);
252b5132
RH
1710
1711struct dis386 {
2da11e11 1712 const char *name;
ce518a5f
L
1713 struct
1714 {
1715 op_rtn rtn;
1716 int bytemode;
1717 } op[MAX_OPERANDS];
bf890a93 1718 unsigned int prefix_requirement;
252b5132
RH
1719};
1720
1721/* Upper case letters in the instruction names here are macros.
1722 'A' => print 'b' if no register operands or suffix_always is true
1723 'B' => print 'b' if suffix_always is true
9306ca4a 1724 'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
98b528ac 1725 size prefix
ed7841b3 1726 'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
98b528ac 1727 suffix_always is true
252b5132 1728 'E' => print 'e' if 32-bit form of jcxz
3ffd33cf 1729 'F' => print 'w' or 'l' depending on address size prefix (loop insns)
52fd6d94 1730 'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
5dd0794d 1731 'H' => print ",pt" or ",pn" branch hint
d1c36125 1732 'I' unused.
8f570d62 1733 'J' unused.
42903f7f 1734 'K' => print 'd' or 'q' if rex prefix is present.
252b5132 1735 'L' => print 'l' if suffix_always is true
9d141669 1736 'M' => print 'r' if intel_mnemonic is false.
252b5132 1737 'N' => print 'n' if instruction has no wait "prefix"
a35ca55a 1738 'O' => print 'd' or 'o' (or 'q' in Intel mode)
52b15da3 1739 'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix,
98b528ac
L
1740 or suffix_always is true. print 'q' if rex prefix is present.
1741 'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
1742 is true
a35ca55a 1743 'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
52b15da3 1744 'S' => print 'w', 'l' or 'q' if suffix_always is true
a72d2af2
L
1745 'T' => print 'q' in 64bit mode if instruction has no operand size
1746 prefix and behave as 'P' otherwise
1747 'U' => print 'q' in 64bit mode if instruction has no operand size
1748 prefix and behave as 'Q' otherwise
1749 'V' => print 'q' in 64bit mode if instruction has no operand size
1750 prefix and behave as 'S' otherwise
a35ca55a 1751 'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
9306ca4a 1752 'X' => print 's', 'd' depending on data16 prefix (for XMM)
9646c87b 1753 'Y' unused.
6dd5059a 1754 'Z' => print 'q' in 64bit mode and behave as 'L' otherwise
9d141669 1755 '!' => change condition from true to false or from false to true.
98b528ac 1756 '%' => add 1 upper case letter to the macro.
5990e377
JB
1757 '^' => print 'w', 'l', or 'q' (Intel64 ISA only) depending on operand size
1758 prefix or suffix_always is true (lcall/ljmp).
5db04b09
L
1759 '@' => print 'q' for Intel64 ISA, 'w' or 'q' for AMD64 ISA depending
1760 on operand size prefix.
07f5af7d
L
1761 '&' => print 'q' in 64bit mode for Intel64 ISA or if instruction
1762 has no operand size prefix for AMD64 ISA, behave as 'P'
1763 otherwise
98b528ac
L
1764
1765 2 upper case letter macros:
04d824a4
JB
1766 "XY" => print 'x' or 'y' if suffix_always is true or no register
1767 operands and no broadcast.
1768 "XZ" => print 'x', 'y', or 'z' if suffix_always is true or no
1769 register operands and no broadcast.
4b06377f 1770 "XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
b24d668c
JB
1771 "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand, cond
1772 being false, or no operand at all in 64bit mode, or if suffix_always
589958d6 1773 is true.
4b06377f
L
1774 "LB" => print "abs" in 64bit mode and behave as 'B' otherwise
1775 "LS" => print "abs" in 64bit mode and behave as 'S' otherwise
1776 "LV" => print "abs" for 64bit operand and behave as 'S' otherwise
492a76aa 1777 "DQ" => print 'd' or 'q' depending on the VEX.W bit
bb5b3501 1778 "BW" => print 'b' or 'w' depending on the VEX.W bit
4b4c407a
L
1779 "LP" => print 'w' or 'l' ('d' in Intel mode) if instruction has
1780 an operand size prefix, or suffix_always is true. print
1781 'q' if rex prefix is present.
52b15da3 1782
6439fc28
AM
1783 Many of the above letters print nothing in Intel mode. See "putop"
1784 for the details.
52b15da3 1785
6439fc28 1786 Braces '{' and '}', and vertical bars '|', indicate alternative
7c52e0e8 1787 mnemonic strings for AT&T and Intel. */
252b5132 1788
6439fc28 1789static const struct dis386 dis386[] = {
252b5132 1790 /* 00 */
bf890a93
IT
1791 { "addB", { Ebh1, Gb }, 0 },
1792 { "addS", { Evh1, Gv }, 0 },
1793 { "addB", { Gb, EbS }, 0 },
1794 { "addS", { Gv, EvS }, 0 },
1795 { "addB", { AL, Ib }, 0 },
1796 { "addS", { eAX, Iv }, 0 },
4e7d34a6
L
1797 { X86_64_TABLE (X86_64_06) },
1798 { X86_64_TABLE (X86_64_07) },
252b5132 1799 /* 08 */
bf890a93
IT
1800 { "orB", { Ebh1, Gb }, 0 },
1801 { "orS", { Evh1, Gv }, 0 },
1802 { "orB", { Gb, EbS }, 0 },
1803 { "orS", { Gv, EvS }, 0 },
1804 { "orB", { AL, Ib }, 0 },
1805 { "orS", { eAX, Iv }, 0 },
1673df32 1806 { X86_64_TABLE (X86_64_0E) },
592d1631 1807 { Bad_Opcode }, /* 0x0f extended opcode escape */
252b5132 1808 /* 10 */
bf890a93
IT
1809 { "adcB", { Ebh1, Gb }, 0 },
1810 { "adcS", { Evh1, Gv }, 0 },
1811 { "adcB", { Gb, EbS }, 0 },
1812 { "adcS", { Gv, EvS }, 0 },
1813 { "adcB", { AL, Ib }, 0 },
1814 { "adcS", { eAX, Iv }, 0 },
4e7d34a6
L
1815 { X86_64_TABLE (X86_64_16) },
1816 { X86_64_TABLE (X86_64_17) },
252b5132 1817 /* 18 */
bf890a93
IT
1818 { "sbbB", { Ebh1, Gb }, 0 },
1819 { "sbbS", { Evh1, Gv }, 0 },
1820 { "sbbB", { Gb, EbS }, 0 },
1821 { "sbbS", { Gv, EvS }, 0 },
1822 { "sbbB", { AL, Ib }, 0 },
1823 { "sbbS", { eAX, Iv }, 0 },
4e7d34a6
L
1824 { X86_64_TABLE (X86_64_1E) },
1825 { X86_64_TABLE (X86_64_1F) },
252b5132 1826 /* 20 */
bf890a93
IT
1827 { "andB", { Ebh1, Gb }, 0 },
1828 { "andS", { Evh1, Gv }, 0 },
1829 { "andB", { Gb, EbS }, 0 },
1830 { "andS", { Gv, EvS }, 0 },
1831 { "andB", { AL, Ib }, 0 },
1832 { "andS", { eAX, Iv }, 0 },
592d1631 1833 { Bad_Opcode }, /* SEG ES prefix */
4e7d34a6 1834 { X86_64_TABLE (X86_64_27) },
252b5132 1835 /* 28 */
bf890a93
IT
1836 { "subB", { Ebh1, Gb }, 0 },
1837 { "subS", { Evh1, Gv }, 0 },
1838 { "subB", { Gb, EbS }, 0 },
1839 { "subS", { Gv, EvS }, 0 },
1840 { "subB", { AL, Ib }, 0 },
1841 { "subS", { eAX, Iv }, 0 },
592d1631 1842 { Bad_Opcode }, /* SEG CS prefix */
4e7d34a6 1843 { X86_64_TABLE (X86_64_2F) },
252b5132 1844 /* 30 */
bf890a93
IT
1845 { "xorB", { Ebh1, Gb }, 0 },
1846 { "xorS", { Evh1, Gv }, 0 },
1847 { "xorB", { Gb, EbS }, 0 },
1848 { "xorS", { Gv, EvS }, 0 },
1849 { "xorB", { AL, Ib }, 0 },
1850 { "xorS", { eAX, Iv }, 0 },
592d1631 1851 { Bad_Opcode }, /* SEG SS prefix */
4e7d34a6 1852 { X86_64_TABLE (X86_64_37) },
252b5132 1853 /* 38 */
bf890a93
IT
1854 { "cmpB", { Eb, Gb }, 0 },
1855 { "cmpS", { Ev, Gv }, 0 },
1856 { "cmpB", { Gb, EbS }, 0 },
1857 { "cmpS", { Gv, EvS }, 0 },
1858 { "cmpB", { AL, Ib }, 0 },
1859 { "cmpS", { eAX, Iv }, 0 },
592d1631 1860 { Bad_Opcode }, /* SEG DS prefix */
4e7d34a6 1861 { X86_64_TABLE (X86_64_3F) },
252b5132 1862 /* 40 */
bf890a93
IT
1863 { "inc{S|}", { RMeAX }, 0 },
1864 { "inc{S|}", { RMeCX }, 0 },
1865 { "inc{S|}", { RMeDX }, 0 },
1866 { "inc{S|}", { RMeBX }, 0 },
1867 { "inc{S|}", { RMeSP }, 0 },
1868 { "inc{S|}", { RMeBP }, 0 },
1869 { "inc{S|}", { RMeSI }, 0 },
1870 { "inc{S|}", { RMeDI }, 0 },
252b5132 1871 /* 48 */
bf890a93
IT
1872 { "dec{S|}", { RMeAX }, 0 },
1873 { "dec{S|}", { RMeCX }, 0 },
1874 { "dec{S|}", { RMeDX }, 0 },
1875 { "dec{S|}", { RMeBX }, 0 },
1876 { "dec{S|}", { RMeSP }, 0 },
1877 { "dec{S|}", { RMeBP }, 0 },
1878 { "dec{S|}", { RMeSI }, 0 },
1879 { "dec{S|}", { RMeDI }, 0 },
252b5132 1880 /* 50 */
bf890a93
IT
1881 { "pushV", { RMrAX }, 0 },
1882 { "pushV", { RMrCX }, 0 },
1883 { "pushV", { RMrDX }, 0 },
1884 { "pushV", { RMrBX }, 0 },
1885 { "pushV", { RMrSP }, 0 },
1886 { "pushV", { RMrBP }, 0 },
1887 { "pushV", { RMrSI }, 0 },
1888 { "pushV", { RMrDI }, 0 },
252b5132 1889 /* 58 */
bf890a93
IT
1890 { "popV", { RMrAX }, 0 },
1891 { "popV", { RMrCX }, 0 },
1892 { "popV", { RMrDX }, 0 },
1893 { "popV", { RMrBX }, 0 },
1894 { "popV", { RMrSP }, 0 },
1895 { "popV", { RMrBP }, 0 },
1896 { "popV", { RMrSI }, 0 },
1897 { "popV", { RMrDI }, 0 },
252b5132 1898 /* 60 */
4e7d34a6
L
1899 { X86_64_TABLE (X86_64_60) },
1900 { X86_64_TABLE (X86_64_61) },
1901 { X86_64_TABLE (X86_64_62) },
1902 { X86_64_TABLE (X86_64_63) },
592d1631
L
1903 { Bad_Opcode }, /* seg fs */
1904 { Bad_Opcode }, /* seg gs */
1905 { Bad_Opcode }, /* op size prefix */
1906 { Bad_Opcode }, /* adr size prefix */
252b5132 1907 /* 68 */
bf890a93
IT
1908 { "pushT", { sIv }, 0 },
1909 { "imulS", { Gv, Ev, Iv }, 0 },
1910 { "pushT", { sIbT }, 0 },
1911 { "imulS", { Gv, Ev, sIb }, 0 },
1912 { "ins{b|}", { Ybr, indirDX }, 0 },
4e7d34a6 1913 { X86_64_TABLE (X86_64_6D) },
bf890a93 1914 { "outs{b|}", { indirDXr, Xb }, 0 },
4e7d34a6 1915 { X86_64_TABLE (X86_64_6F) },
252b5132 1916 /* 70 */
bf890a93
IT
1917 { "joH", { Jb, BND, cond_jump_flag }, 0 },
1918 { "jnoH", { Jb, BND, cond_jump_flag }, 0 },
1919 { "jbH", { Jb, BND, cond_jump_flag }, 0 },
1920 { "jaeH", { Jb, BND, cond_jump_flag }, 0 },
1921 { "jeH", { Jb, BND, cond_jump_flag }, 0 },
1922 { "jneH", { Jb, BND, cond_jump_flag }, 0 },
1923 { "jbeH", { Jb, BND, cond_jump_flag }, 0 },
1924 { "jaH", { Jb, BND, cond_jump_flag }, 0 },
252b5132 1925 /* 78 */
bf890a93
IT
1926 { "jsH", { Jb, BND, cond_jump_flag }, 0 },
1927 { "jnsH", { Jb, BND, cond_jump_flag }, 0 },
1928 { "jpH", { Jb, BND, cond_jump_flag }, 0 },
1929 { "jnpH", { Jb, BND, cond_jump_flag }, 0 },
1930 { "jlH", { Jb, BND, cond_jump_flag }, 0 },
1931 { "jgeH", { Jb, BND, cond_jump_flag }, 0 },
1932 { "jleH", { Jb, BND, cond_jump_flag }, 0 },
1933 { "jgH", { Jb, BND, cond_jump_flag }, 0 },
252b5132 1934 /* 80 */
1ceb70f8
L
1935 { REG_TABLE (REG_80) },
1936 { REG_TABLE (REG_81) },
d039fef3 1937 { X86_64_TABLE (X86_64_82) },
7148c369 1938 { REG_TABLE (REG_83) },
bf890a93
IT
1939 { "testB", { Eb, Gb }, 0 },
1940 { "testS", { Ev, Gv }, 0 },
1941 { "xchgB", { Ebh2, Gb }, 0 },
1942 { "xchgS", { Evh2, Gv }, 0 },
252b5132 1943 /* 88 */
bf890a93
IT
1944 { "movB", { Ebh3, Gb }, 0 },
1945 { "movS", { Evh3, Gv }, 0 },
1946 { "movB", { Gb, EbS }, 0 },
1947 { "movS", { Gv, EvS }, 0 },
1948 { "movD", { Sv, Sw }, 0 },
1ceb70f8 1949 { MOD_TABLE (MOD_8D) },
bf890a93 1950 { "movD", { Sw, Sv }, 0 },
1ceb70f8 1951 { REG_TABLE (REG_8F) },
252b5132 1952 /* 90 */
1ceb70f8 1953 { PREFIX_TABLE (PREFIX_90) },
bf890a93
IT
1954 { "xchgS", { RMeCX, eAX }, 0 },
1955 { "xchgS", { RMeDX, eAX }, 0 },
1956 { "xchgS", { RMeBX, eAX }, 0 },
1957 { "xchgS", { RMeSP, eAX }, 0 },
1958 { "xchgS", { RMeBP, eAX }, 0 },
1959 { "xchgS", { RMeSI, eAX }, 0 },
1960 { "xchgS", { RMeDI, eAX }, 0 },
252b5132 1961 /* 98 */
bf890a93
IT
1962 { "cW{t|}R", { XX }, 0 },
1963 { "cR{t|}O", { XX }, 0 },
4e7d34a6 1964 { X86_64_TABLE (X86_64_9A) },
592d1631 1965 { Bad_Opcode }, /* fwait */
bf890a93
IT
1966 { "pushfT", { XX }, 0 },
1967 { "popfT", { XX }, 0 },
1968 { "sahf", { XX }, 0 },
1969 { "lahf", { XX }, 0 },
252b5132 1970 /* a0 */
bf890a93
IT
1971 { "mov%LB", { AL, Ob }, 0 },
1972 { "mov%LS", { eAX, Ov }, 0 },
1973 { "mov%LB", { Ob, AL }, 0 },
1974 { "mov%LS", { Ov, eAX }, 0 },
1975 { "movs{b|}", { Ybr, Xb }, 0 },
1976 { "movs{R|}", { Yvr, Xv }, 0 },
1977 { "cmps{b|}", { Xb, Yb }, 0 },
1978 { "cmps{R|}", { Xv, Yv }, 0 },
252b5132 1979 /* a8 */
bf890a93
IT
1980 { "testB", { AL, Ib }, 0 },
1981 { "testS", { eAX, Iv }, 0 },
1982 { "stosB", { Ybr, AL }, 0 },
1983 { "stosS", { Yvr, eAX }, 0 },
1984 { "lodsB", { ALr, Xb }, 0 },
1985 { "lodsS", { eAXr, Xv }, 0 },
1986 { "scasB", { AL, Yb }, 0 },
1987 { "scasS", { eAX, Yv }, 0 },
252b5132 1988 /* b0 */
bf890a93
IT
1989 { "movB", { RMAL, Ib }, 0 },
1990 { "movB", { RMCL, Ib }, 0 },
1991 { "movB", { RMDL, Ib }, 0 },
1992 { "movB", { RMBL, Ib }, 0 },
1993 { "movB", { RMAH, Ib }, 0 },
1994 { "movB", { RMCH, Ib }, 0 },
1995 { "movB", { RMDH, Ib }, 0 },
1996 { "movB", { RMBH, Ib }, 0 },
252b5132 1997 /* b8 */
bf890a93
IT
1998 { "mov%LV", { RMeAX, Iv64 }, 0 },
1999 { "mov%LV", { RMeCX, Iv64 }, 0 },
2000 { "mov%LV", { RMeDX, Iv64 }, 0 },
2001 { "mov%LV", { RMeBX, Iv64 }, 0 },
2002 { "mov%LV", { RMeSP, Iv64 }, 0 },
2003 { "mov%LV", { RMeBP, Iv64 }, 0 },
2004 { "mov%LV", { RMeSI, Iv64 }, 0 },
2005 { "mov%LV", { RMeDI, Iv64 }, 0 },
252b5132 2006 /* c0 */
1ceb70f8
L
2007 { REG_TABLE (REG_C0) },
2008 { REG_TABLE (REG_C1) },
aeab2b26
JB
2009 { X86_64_TABLE (X86_64_C2) },
2010 { X86_64_TABLE (X86_64_C3) },
4e7d34a6
L
2011 { X86_64_TABLE (X86_64_C4) },
2012 { X86_64_TABLE (X86_64_C5) },
1ceb70f8
L
2013 { REG_TABLE (REG_C6) },
2014 { REG_TABLE (REG_C7) },
252b5132 2015 /* c8 */
bf890a93
IT
2016 { "enterT", { Iw, Ib }, 0 },
2017 { "leaveT", { XX }, 0 },
8f570d62
JB
2018 { "{l|}ret{|f}P", { Iw }, 0 },
2019 { "{l|}ret{|f}P", { XX }, 0 },
bf890a93
IT
2020 { "int3", { XX }, 0 },
2021 { "int", { Ib }, 0 },
4e7d34a6 2022 { X86_64_TABLE (X86_64_CE) },
bf890a93 2023 { "iret%LP", { XX }, 0 },
252b5132 2024 /* d0 */
1ceb70f8
L
2025 { REG_TABLE (REG_D0) },
2026 { REG_TABLE (REG_D1) },
2027 { REG_TABLE (REG_D2) },
2028 { REG_TABLE (REG_D3) },
4e7d34a6
L
2029 { X86_64_TABLE (X86_64_D4) },
2030 { X86_64_TABLE (X86_64_D5) },
592d1631 2031 { Bad_Opcode },
bf890a93 2032 { "xlat", { DSBX }, 0 },
252b5132
RH
2033 /* d8 */
2034 { FLOAT },
2035 { FLOAT },
2036 { FLOAT },
2037 { FLOAT },
2038 { FLOAT },
2039 { FLOAT },
2040 { FLOAT },
2041 { FLOAT },
2042 /* e0 */
bf890a93
IT
2043 { "loopneFH", { Jb, XX, loop_jcxz_flag }, 0 },
2044 { "loopeFH", { Jb, XX, loop_jcxz_flag }, 0 },
2045 { "loopFH", { Jb, XX, loop_jcxz_flag }, 0 },
2046 { "jEcxzH", { Jb, XX, loop_jcxz_flag }, 0 },
2047 { "inB", { AL, Ib }, 0 },
2048 { "inG", { zAX, Ib }, 0 },
2049 { "outB", { Ib, AL }, 0 },
2050 { "outG", { Ib, zAX }, 0 },
252b5132 2051 /* e8 */
a72d2af2
L
2052 { X86_64_TABLE (X86_64_E8) },
2053 { X86_64_TABLE (X86_64_E9) },
4e7d34a6 2054 { X86_64_TABLE (X86_64_EA) },
bf890a93
IT
2055 { "jmp", { Jb, BND }, 0 },
2056 { "inB", { AL, indirDX }, 0 },
2057 { "inG", { zAX, indirDX }, 0 },
2058 { "outB", { indirDX, AL }, 0 },
2059 { "outG", { indirDX, zAX }, 0 },
252b5132 2060 /* f0 */
592d1631 2061 { Bad_Opcode }, /* lock prefix */
bf890a93 2062 { "icebp", { XX }, 0 },
592d1631
L
2063 { Bad_Opcode }, /* repne */
2064 { Bad_Opcode }, /* repz */
bf890a93
IT
2065 { "hlt", { XX }, 0 },
2066 { "cmc", { XX }, 0 },
1ceb70f8
L
2067 { REG_TABLE (REG_F6) },
2068 { REG_TABLE (REG_F7) },
252b5132 2069 /* f8 */
bf890a93
IT
2070 { "clc", { XX }, 0 },
2071 { "stc", { XX }, 0 },
2072 { "cli", { XX }, 0 },
2073 { "sti", { XX }, 0 },
2074 { "cld", { XX }, 0 },
2075 { "std", { XX }, 0 },
1ceb70f8
L
2076 { REG_TABLE (REG_FE) },
2077 { REG_TABLE (REG_FF) },
252b5132
RH
2078};
2079
6439fc28 2080static const struct dis386 dis386_twobyte[] = {
252b5132 2081 /* 00 */
1ceb70f8
L
2082 { REG_TABLE (REG_0F00 ) },
2083 { REG_TABLE (REG_0F01 ) },
bf890a93
IT
2084 { "larS", { Gv, Ew }, 0 },
2085 { "lslS", { Gv, Ew }, 0 },
592d1631 2086 { Bad_Opcode },
bf890a93
IT
2087 { "syscall", { XX }, 0 },
2088 { "clts", { XX }, 0 },
589958d6 2089 { "sysret%LQ", { XX }, 0 },
252b5132 2090 /* 08 */
bf890a93 2091 { "invd", { XX }, 0 },
3233d7d0 2092 { PREFIX_TABLE (PREFIX_0F09) },
592d1631 2093 { Bad_Opcode },
bf890a93 2094 { "ud2", { XX }, 0 },
592d1631 2095 { Bad_Opcode },
b5b1fc4f 2096 { REG_TABLE (REG_0F0D) },
bf890a93
IT
2097 { "femms", { XX }, 0 },
2098 { "", { MX, EM, OPSUF }, 0 }, /* See OP_3DNowSuffix. */
252b5132 2099 /* 10 */
1ceb70f8
L
2100 { PREFIX_TABLE (PREFIX_0F10) },
2101 { PREFIX_TABLE (PREFIX_0F11) },
2102 { PREFIX_TABLE (PREFIX_0F12) },
2103 { MOD_TABLE (MOD_0F13) },
507bd325
L
2104 { "unpcklpX", { XM, EXx }, PREFIX_OPCODE },
2105 { "unpckhpX", { XM, EXx }, PREFIX_OPCODE },
1ceb70f8
L
2106 { PREFIX_TABLE (PREFIX_0F16) },
2107 { MOD_TABLE (MOD_0F17) },
252b5132 2108 /* 18 */
1ceb70f8 2109 { REG_TABLE (REG_0F18) },
bf890a93 2110 { "nopQ", { Ev }, 0 },
7e8b059b
L
2111 { PREFIX_TABLE (PREFIX_0F1A) },
2112 { PREFIX_TABLE (PREFIX_0F1B) },
c48935d7 2113 { PREFIX_TABLE (PREFIX_0F1C) },
bf890a93 2114 { "nopQ", { Ev }, 0 },
603555e5 2115 { PREFIX_TABLE (PREFIX_0F1E) },
bf890a93 2116 { "nopQ", { Ev }, 0 },
252b5132 2117 /* 20 */
bf890a93
IT
2118 { "movZ", { Rm, Cm }, 0 },
2119 { "movZ", { Rm, Dm }, 0 },
2120 { "movZ", { Cm, Rm }, 0 },
2121 { "movZ", { Dm, Rm }, 0 },
1ceb70f8 2122 { MOD_TABLE (MOD_0F24) },
592d1631 2123 { Bad_Opcode },
1ceb70f8 2124 { MOD_TABLE (MOD_0F26) },
592d1631 2125 { Bad_Opcode },
252b5132 2126 /* 28 */
507bd325
L
2127 { "movapX", { XM, EXx }, PREFIX_OPCODE },
2128 { "movapX", { EXxS, XM }, PREFIX_OPCODE },
1ceb70f8
L
2129 { PREFIX_TABLE (PREFIX_0F2A) },
2130 { PREFIX_TABLE (PREFIX_0F2B) },
2131 { PREFIX_TABLE (PREFIX_0F2C) },
2132 { PREFIX_TABLE (PREFIX_0F2D) },
2133 { PREFIX_TABLE (PREFIX_0F2E) },
2134 { PREFIX_TABLE (PREFIX_0F2F) },
252b5132 2135 /* 30 */
bf890a93
IT
2136 { "wrmsr", { XX }, 0 },
2137 { "rdtsc", { XX }, 0 },
2138 { "rdmsr", { XX }, 0 },
2139 { "rdpmc", { XX }, 0 },
d835a58b
JB
2140 { "sysenter", { SEP }, 0 },
2141 { "sysexit", { SEP }, 0 },
592d1631 2142 { Bad_Opcode },
bf890a93 2143 { "getsec", { XX }, 0 },
252b5132 2144 /* 38 */
507bd325 2145 { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F38, PREFIX_OPCODE) },
592d1631 2146 { Bad_Opcode },
507bd325 2147 { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F3A, PREFIX_OPCODE) },
592d1631
L
2148 { Bad_Opcode },
2149 { Bad_Opcode },
2150 { Bad_Opcode },
2151 { Bad_Opcode },
2152 { Bad_Opcode },
252b5132 2153 /* 40 */
bf890a93
IT
2154 { "cmovoS", { Gv, Ev }, 0 },
2155 { "cmovnoS", { Gv, Ev }, 0 },
2156 { "cmovbS", { Gv, Ev }, 0 },
2157 { "cmovaeS", { Gv, Ev }, 0 },
2158 { "cmoveS", { Gv, Ev }, 0 },
2159 { "cmovneS", { Gv, Ev }, 0 },
2160 { "cmovbeS", { Gv, Ev }, 0 },
2161 { "cmovaS", { Gv, Ev }, 0 },
252b5132 2162 /* 48 */
bf890a93
IT
2163 { "cmovsS", { Gv, Ev }, 0 },
2164 { "cmovnsS", { Gv, Ev }, 0 },
2165 { "cmovpS", { Gv, Ev }, 0 },
2166 { "cmovnpS", { Gv, Ev }, 0 },
2167 { "cmovlS", { Gv, Ev }, 0 },
2168 { "cmovgeS", { Gv, Ev }, 0 },
2169 { "cmovleS", { Gv, Ev }, 0 },
2170 { "cmovgS", { Gv, Ev }, 0 },
252b5132 2171 /* 50 */
a5aaedb9 2172 { MOD_TABLE (MOD_0F50) },
1ceb70f8
L
2173 { PREFIX_TABLE (PREFIX_0F51) },
2174 { PREFIX_TABLE (PREFIX_0F52) },
2175 { PREFIX_TABLE (PREFIX_0F53) },
507bd325
L
2176 { "andpX", { XM, EXx }, PREFIX_OPCODE },
2177 { "andnpX", { XM, EXx }, PREFIX_OPCODE },
2178 { "orpX", { XM, EXx }, PREFIX_OPCODE },
2179 { "xorpX", { XM, EXx }, PREFIX_OPCODE },
252b5132 2180 /* 58 */
1ceb70f8
L
2181 { PREFIX_TABLE (PREFIX_0F58) },
2182 { PREFIX_TABLE (PREFIX_0F59) },
2183 { PREFIX_TABLE (PREFIX_0F5A) },
2184 { PREFIX_TABLE (PREFIX_0F5B) },
2185 { PREFIX_TABLE (PREFIX_0F5C) },
2186 { PREFIX_TABLE (PREFIX_0F5D) },
2187 { PREFIX_TABLE (PREFIX_0F5E) },
2188 { PREFIX_TABLE (PREFIX_0F5F) },
252b5132 2189 /* 60 */
1ceb70f8
L
2190 { PREFIX_TABLE (PREFIX_0F60) },
2191 { PREFIX_TABLE (PREFIX_0F61) },
2192 { PREFIX_TABLE (PREFIX_0F62) },
507bd325
L
2193 { "packsswb", { MX, EM }, PREFIX_OPCODE },
2194 { "pcmpgtb", { MX, EM }, PREFIX_OPCODE },
2195 { "pcmpgtw", { MX, EM }, PREFIX_OPCODE },
2196 { "pcmpgtd", { MX, EM }, PREFIX_OPCODE },
2197 { "packuswb", { MX, EM }, PREFIX_OPCODE },
252b5132 2198 /* 68 */
507bd325
L
2199 { "punpckhbw", { MX, EM }, PREFIX_OPCODE },
2200 { "punpckhwd", { MX, EM }, PREFIX_OPCODE },
2201 { "punpckhdq", { MX, EM }, PREFIX_OPCODE },
2202 { "packssdw", { MX, EM }, PREFIX_OPCODE },
7531c613
JB
2203 { "punpcklqdq", { XM, EXx }, PREFIX_DATA },
2204 { "punpckhqdq", { XM, EXx }, PREFIX_DATA },
507bd325 2205 { "movK", { MX, Edq }, PREFIX_OPCODE },
1ceb70f8 2206 { PREFIX_TABLE (PREFIX_0F6F) },
252b5132 2207 /* 70 */
1ceb70f8
L
2208 { PREFIX_TABLE (PREFIX_0F70) },
2209 { REG_TABLE (REG_0F71) },
2210 { REG_TABLE (REG_0F72) },
2211 { REG_TABLE (REG_0F73) },
507bd325
L
2212 { "pcmpeqb", { MX, EM }, PREFIX_OPCODE },
2213 { "pcmpeqw", { MX, EM }, PREFIX_OPCODE },
2214 { "pcmpeqd", { MX, EM }, PREFIX_OPCODE },
2215 { "emms", { XX }, PREFIX_OPCODE },
252b5132 2216 /* 78 */
1ceb70f8
L
2217 { PREFIX_TABLE (PREFIX_0F78) },
2218 { PREFIX_TABLE (PREFIX_0F79) },
1f334aeb 2219 { Bad_Opcode },
592d1631 2220 { Bad_Opcode },
1ceb70f8
L
2221 { PREFIX_TABLE (PREFIX_0F7C) },
2222 { PREFIX_TABLE (PREFIX_0F7D) },
2223 { PREFIX_TABLE (PREFIX_0F7E) },
2224 { PREFIX_TABLE (PREFIX_0F7F) },
252b5132 2225 /* 80 */
bf890a93
IT
2226 { "joH", { Jv, BND, cond_jump_flag }, 0 },
2227 { "jnoH", { Jv, BND, cond_jump_flag }, 0 },
2228 { "jbH", { Jv, BND, cond_jump_flag }, 0 },
2229 { "jaeH", { Jv, BND, cond_jump_flag }, 0 },
2230 { "jeH", { Jv, BND, cond_jump_flag }, 0 },
2231 { "jneH", { Jv, BND, cond_jump_flag }, 0 },
2232 { "jbeH", { Jv, BND, cond_jump_flag }, 0 },
2233 { "jaH", { Jv, BND, cond_jump_flag }, 0 },
252b5132 2234 /* 88 */
bf890a93
IT
2235 { "jsH", { Jv, BND, cond_jump_flag }, 0 },
2236 { "jnsH", { Jv, BND, cond_jump_flag }, 0 },
2237 { "jpH", { Jv, BND, cond_jump_flag }, 0 },
2238 { "jnpH", { Jv, BND, cond_jump_flag }, 0 },
2239 { "jlH", { Jv, BND, cond_jump_flag }, 0 },
2240 { "jgeH", { Jv, BND, cond_jump_flag }, 0 },
2241 { "jleH", { Jv, BND, cond_jump_flag }, 0 },
2242 { "jgH", { Jv, BND, cond_jump_flag }, 0 },
252b5132 2243 /* 90 */
bf890a93
IT
2244 { "seto", { Eb }, 0 },
2245 { "setno", { Eb }, 0 },
2246 { "setb", { Eb }, 0 },
2247 { "setae", { Eb }, 0 },
2248 { "sete", { Eb }, 0 },
2249 { "setne", { Eb }, 0 },
2250 { "setbe", { Eb }, 0 },
2251 { "seta", { Eb }, 0 },
252b5132 2252 /* 98 */
bf890a93
IT
2253 { "sets", { Eb }, 0 },
2254 { "setns", { Eb }, 0 },
2255 { "setp", { Eb }, 0 },
2256 { "setnp", { Eb }, 0 },
2257 { "setl", { Eb }, 0 },
2258 { "setge", { Eb }, 0 },
2259 { "setle", { Eb }, 0 },
2260 { "setg", { Eb }, 0 },
252b5132 2261 /* a0 */
bf890a93
IT
2262 { "pushT", { fs }, 0 },
2263 { "popT", { fs }, 0 },
2264 { "cpuid", { XX }, 0 },
2265 { "btS", { Ev, Gv }, 0 },
2266 { "shldS", { Ev, Gv, Ib }, 0 },
2267 { "shldS", { Ev, Gv, CL }, 0 },
1ceb70f8
L
2268 { REG_TABLE (REG_0FA6) },
2269 { REG_TABLE (REG_0FA7) },
252b5132 2270 /* a8 */
bf890a93
IT
2271 { "pushT", { gs }, 0 },
2272 { "popT", { gs }, 0 },
2273 { "rsm", { XX }, 0 },
2274 { "btsS", { Evh1, Gv }, 0 },
2275 { "shrdS", { Ev, Gv, Ib }, 0 },
2276 { "shrdS", { Ev, Gv, CL }, 0 },
1ceb70f8 2277 { REG_TABLE (REG_0FAE) },
bf890a93 2278 { "imulS", { Gv, Ev }, 0 },
252b5132 2279 /* b0 */
bf890a93
IT
2280 { "cmpxchgB", { Ebh1, Gb }, 0 },
2281 { "cmpxchgS", { Evh1, Gv }, 0 },
1ceb70f8 2282 { MOD_TABLE (MOD_0FB2) },
bf890a93 2283 { "btrS", { Evh1, Gv }, 0 },
1ceb70f8
L
2284 { MOD_TABLE (MOD_0FB4) },
2285 { MOD_TABLE (MOD_0FB5) },
bf890a93
IT
2286 { "movz{bR|x}", { Gv, Eb }, 0 },
2287 { "movz{wR|x}", { Gv, Ew }, 0 }, /* yes, there really is movzww ! */
252b5132 2288 /* b8 */
1ceb70f8 2289 { PREFIX_TABLE (PREFIX_0FB8) },
66f1eba0 2290 { "ud1S", { Gv, Ev }, 0 },
1ceb70f8 2291 { REG_TABLE (REG_0FBA) },
bf890a93 2292 { "btcS", { Evh1, Gv }, 0 },
f12dc422 2293 { PREFIX_TABLE (PREFIX_0FBC) },
1ceb70f8 2294 { PREFIX_TABLE (PREFIX_0FBD) },
bf890a93
IT
2295 { "movs{bR|x}", { Gv, Eb }, 0 },
2296 { "movs{wR|x}", { Gv, Ew }, 0 }, /* yes, there really is movsww ! */
252b5132 2297 /* c0 */
bf890a93
IT
2298 { "xaddB", { Ebh1, Gb }, 0 },
2299 { "xaddS", { Evh1, Gv }, 0 },
1ceb70f8 2300 { PREFIX_TABLE (PREFIX_0FC2) },
a8484f96 2301 { MOD_TABLE (MOD_0FC3) },
507bd325
L
2302 { "pinsrw", { MX, Edqw, Ib }, PREFIX_OPCODE },
2303 { "pextrw", { Gdq, MS, Ib }, PREFIX_OPCODE },
2304 { "shufpX", { XM, EXx, Ib }, PREFIX_OPCODE },
1ceb70f8 2305 { REG_TABLE (REG_0FC7) },
252b5132 2306 /* c8 */
bf890a93
IT
2307 { "bswap", { RMeAX }, 0 },
2308 { "bswap", { RMeCX }, 0 },
2309 { "bswap", { RMeDX }, 0 },
2310 { "bswap", { RMeBX }, 0 },
2311 { "bswap", { RMeSP }, 0 },
2312 { "bswap", { RMeBP }, 0 },
2313 { "bswap", { RMeSI }, 0 },
2314 { "bswap", { RMeDI }, 0 },
252b5132 2315 /* d0 */
1ceb70f8 2316 { PREFIX_TABLE (PREFIX_0FD0) },
507bd325
L
2317 { "psrlw", { MX, EM }, PREFIX_OPCODE },
2318 { "psrld", { MX, EM }, PREFIX_OPCODE },
2319 { "psrlq", { MX, EM }, PREFIX_OPCODE },
2320 { "paddq", { MX, EM }, PREFIX_OPCODE },
2321 { "pmullw", { MX, EM }, PREFIX_OPCODE },
1ceb70f8 2322 { PREFIX_TABLE (PREFIX_0FD6) },
75c135a8 2323 { MOD_TABLE (MOD_0FD7) },
252b5132 2324 /* d8 */
507bd325
L
2325 { "psubusb", { MX, EM }, PREFIX_OPCODE },
2326 { "psubusw", { MX, EM }, PREFIX_OPCODE },
2327 { "pminub", { MX, EM }, PREFIX_OPCODE },
2328 { "pand", { MX, EM }, PREFIX_OPCODE },
2329 { "paddusb", { MX, EM }, PREFIX_OPCODE },
2330 { "paddusw", { MX, EM }, PREFIX_OPCODE },
2331 { "pmaxub", { MX, EM }, PREFIX_OPCODE },
2332 { "pandn", { MX, EM }, PREFIX_OPCODE },
252b5132 2333 /* e0 */
507bd325
L
2334 { "pavgb", { MX, EM }, PREFIX_OPCODE },
2335 { "psraw", { MX, EM }, PREFIX_OPCODE },
2336 { "psrad", { MX, EM }, PREFIX_OPCODE },
2337 { "pavgw", { MX, EM }, PREFIX_OPCODE },
2338 { "pmulhuw", { MX, EM }, PREFIX_OPCODE },
2339 { "pmulhw", { MX, EM }, PREFIX_OPCODE },
1ceb70f8
L
2340 { PREFIX_TABLE (PREFIX_0FE6) },
2341 { PREFIX_TABLE (PREFIX_0FE7) },
252b5132 2342 /* e8 */
507bd325
L
2343 { "psubsb", { MX, EM }, PREFIX_OPCODE },
2344 { "psubsw", { MX, EM }, PREFIX_OPCODE },
2345 { "pminsw", { MX, EM }, PREFIX_OPCODE },
2346 { "por", { MX, EM }, PREFIX_OPCODE },
2347 { "paddsb", { MX, EM }, PREFIX_OPCODE },
2348 { "paddsw", { MX, EM }, PREFIX_OPCODE },
2349 { "pmaxsw", { MX, EM }, PREFIX_OPCODE },
2350 { "pxor", { MX, EM }, PREFIX_OPCODE },
252b5132 2351 /* f0 */
1ceb70f8 2352 { PREFIX_TABLE (PREFIX_0FF0) },
507bd325
L
2353 { "psllw", { MX, EM }, PREFIX_OPCODE },
2354 { "pslld", { MX, EM }, PREFIX_OPCODE },
2355 { "psllq", { MX, EM }, PREFIX_OPCODE },
2356 { "pmuludq", { MX, EM }, PREFIX_OPCODE },
2357 { "pmaddwd", { MX, EM }, PREFIX_OPCODE },
2358 { "psadbw", { MX, EM }, PREFIX_OPCODE },
1ceb70f8 2359 { PREFIX_TABLE (PREFIX_0FF7) },
252b5132 2360 /* f8 */
507bd325
L
2361 { "psubb", { MX, EM }, PREFIX_OPCODE },
2362 { "psubw", { MX, EM }, PREFIX_OPCODE },
2363 { "psubd", { MX, EM }, PREFIX_OPCODE },
2364 { "psubq", { MX, EM }, PREFIX_OPCODE },
2365 { "paddb", { MX, EM }, PREFIX_OPCODE },
2366 { "paddw", { MX, EM }, PREFIX_OPCODE },
2367 { "paddd", { MX, EM }, PREFIX_OPCODE },
66f1eba0 2368 { "ud0S", { Gv, Ev }, 0 },
252b5132
RH
2369};
2370
2371static const unsigned char onebyte_has_modrm[256] = {
c608c12e
AM
2372 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2373 /* ------------------------------- */
2374 /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
2375 /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
2376 /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
2377 /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
2378 /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
2379 /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
2380 /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
2381 /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
2382 /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
2383 /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
2384 /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
2385 /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
2386 /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
2387 /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
2388 /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
2389 /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1 /* f0 */
2390 /* ------------------------------- */
2391 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
252b5132
RH
2392};
2393
2394static const unsigned char twobyte_has_modrm[256] = {
c608c12e
AM
2395 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2396 /* ------------------------------- */
252b5132 2397 /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
b5b1fc4f 2398 /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
85f10a01 2399 /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
331d2d0d 2400 /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
252b5132 2401 /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
4bba6815
AM
2402 /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
2403 /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
85f10a01 2404 /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
252b5132
RH
2405 /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
2406 /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
30d1c836 2407 /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
66f1eba0 2408 /* b0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* bf */
252b5132 2409 /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
ca164297 2410 /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
4bba6815 2411 /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
66f1eba0 2412 /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 /* ff */
c608c12e
AM
2413 /* ------------------------------- */
2414 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2415};
2416
252b5132
RH
2417static char obuf[100];
2418static char *obufp;
ea397f5b 2419static char *mnemonicendp;
252b5132
RH
2420static char scratchbuf[100];
2421static unsigned char *start_codep;
2422static unsigned char *insn_codep;
2423static unsigned char *codep;
285ca992 2424static unsigned char *end_codep;
f16cd0d5
L
2425static int last_lock_prefix;
2426static int last_repz_prefix;
2427static int last_repnz_prefix;
2428static int last_data_prefix;
2429static int last_addr_prefix;
2430static int last_rex_prefix;
2431static int last_seg_prefix;
d9949a36 2432static int fwait_prefix;
285ca992
L
2433/* The active segment register prefix. */
2434static int active_seg_prefix;
f16cd0d5
L
2435#define MAX_CODE_LENGTH 15
2436/* We can up to 14 prefixes since the maximum instruction length is
2437 15bytes. */
2438static int all_prefixes[MAX_CODE_LENGTH - 1];
252b5132 2439static disassemble_info *the_info;
7967e09e
L
2440static struct
2441 {
2442 int mod;
7967e09e 2443 int reg;
484c222e 2444 int rm;
7967e09e
L
2445 }
2446modrm;
4bba6815 2447static unsigned char need_modrm;
dfc8cf43
L
2448static struct
2449 {
2450 int scale;
2451 int index;
2452 int base;
2453 }
2454sib;
c0f3af97
L
2455static struct
2456 {
2457 int register_specifier;
2458 int length;
2459 int prefix;
2460 int w;
43234a1e
L
2461 int evex;
2462 int r;
2463 int v;
2464 int mask_register_specifier;
2465 int zeroing;
2466 int ll;
2467 int b;
c0f3af97
L
2468 }
2469vex;
2470static unsigned char need_vex;
252b5132 2471
ea397f5b
L
2472struct op
2473 {
2474 const char *name;
2475 unsigned int len;
2476 };
2477
4bba6815
AM
2478/* If we are accessing mod/rm/reg without need_modrm set, then the
2479 values are stale. Hitting this abort likely indicates that you
2480 need to update onebyte_has_modrm or twobyte_has_modrm. */
2481#define MODRM_CHECK if (!need_modrm) abort ()
2482
d708bcba
AM
2483static const char **names64;
2484static const char **names32;
2485static const char **names16;
2486static const char **names8;
2487static const char **names8rex;
2488static const char **names_seg;
db51cc60
L
2489static const char *index64;
2490static const char *index32;
d708bcba 2491static const char **index16;
7e8b059b 2492static const char **names_bnd;
d708bcba
AM
2493
2494static const char *intel_names64[] = {
2495 "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
2496 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2497};
2498static const char *intel_names32[] = {
2499 "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
2500 "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
2501};
2502static const char *intel_names16[] = {
2503 "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
2504 "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
2505};
2506static const char *intel_names8[] = {
2507 "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
2508};
2509static const char *intel_names8rex[] = {
2510 "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
2511 "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
2512};
2513static const char *intel_names_seg[] = {
2514 "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
2515};
db51cc60
L
2516static const char *intel_index64 = "riz";
2517static const char *intel_index32 = "eiz";
d708bcba
AM
2518static const char *intel_index16[] = {
2519 "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
2520};
2521
2522static const char *att_names64[] = {
2523 "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
52b15da3
JH
2524 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
2525};
d708bcba
AM
2526static const char *att_names32[] = {
2527 "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
52b15da3 2528 "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
252b5132 2529};
d708bcba
AM
2530static const char *att_names16[] = {
2531 "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
52b15da3 2532 "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
252b5132 2533};
d708bcba
AM
2534static const char *att_names8[] = {
2535 "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
252b5132 2536};
d708bcba
AM
2537static const char *att_names8rex[] = {
2538 "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
52b15da3
JH
2539 "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
2540};
d708bcba
AM
2541static const char *att_names_seg[] = {
2542 "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
252b5132 2543};
db51cc60
L
2544static const char *att_index64 = "%riz";
2545static const char *att_index32 = "%eiz";
d708bcba
AM
2546static const char *att_index16[] = {
2547 "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
252b5132
RH
2548};
2549
b9733481
L
2550static const char **names_mm;
2551static const char *intel_names_mm[] = {
2552 "mm0", "mm1", "mm2", "mm3",
2553 "mm4", "mm5", "mm6", "mm7"
2554};
2555static const char *att_names_mm[] = {
2556 "%mm0", "%mm1", "%mm2", "%mm3",
2557 "%mm4", "%mm5", "%mm6", "%mm7"
2558};
2559
7e8b059b
L
2560static const char *intel_names_bnd[] = {
2561 "bnd0", "bnd1", "bnd2", "bnd3"
2562};
2563
2564static const char *att_names_bnd[] = {
2565 "%bnd0", "%bnd1", "%bnd2", "%bnd3"
2566};
2567
b9733481
L
2568static const char **names_xmm;
2569static const char *intel_names_xmm[] = {
2570 "xmm0", "xmm1", "xmm2", "xmm3",
2571 "xmm4", "xmm5", "xmm6", "xmm7",
2572 "xmm8", "xmm9", "xmm10", "xmm11",
43234a1e
L
2573 "xmm12", "xmm13", "xmm14", "xmm15",
2574 "xmm16", "xmm17", "xmm18", "xmm19",
2575 "xmm20", "xmm21", "xmm22", "xmm23",
2576 "xmm24", "xmm25", "xmm26", "xmm27",
2577 "xmm28", "xmm29", "xmm30", "xmm31"
b9733481
L
2578};
2579static const char *att_names_xmm[] = {
2580 "%xmm0", "%xmm1", "%xmm2", "%xmm3",
2581 "%xmm4", "%xmm5", "%xmm6", "%xmm7",
2582 "%xmm8", "%xmm9", "%xmm10", "%xmm11",
43234a1e
L
2583 "%xmm12", "%xmm13", "%xmm14", "%xmm15",
2584 "%xmm16", "%xmm17", "%xmm18", "%xmm19",
2585 "%xmm20", "%xmm21", "%xmm22", "%xmm23",
2586 "%xmm24", "%xmm25", "%xmm26", "%xmm27",
2587 "%xmm28", "%xmm29", "%xmm30", "%xmm31"
b9733481
L
2588};
2589
2590static const char **names_ymm;
2591static const char *intel_names_ymm[] = {
2592 "ymm0", "ymm1", "ymm2", "ymm3",
2593 "ymm4", "ymm5", "ymm6", "ymm7",
2594 "ymm8", "ymm9", "ymm10", "ymm11",
43234a1e
L
2595 "ymm12", "ymm13", "ymm14", "ymm15",
2596 "ymm16", "ymm17", "ymm18", "ymm19",
2597 "ymm20", "ymm21", "ymm22", "ymm23",
2598 "ymm24", "ymm25", "ymm26", "ymm27",
2599 "ymm28", "ymm29", "ymm30", "ymm31"
b9733481
L
2600};
2601static const char *att_names_ymm[] = {
2602 "%ymm0", "%ymm1", "%ymm2", "%ymm3",
2603 "%ymm4", "%ymm5", "%ymm6", "%ymm7",
2604 "%ymm8", "%ymm9", "%ymm10", "%ymm11",
43234a1e
L
2605 "%ymm12", "%ymm13", "%ymm14", "%ymm15",
2606 "%ymm16", "%ymm17", "%ymm18", "%ymm19",
2607 "%ymm20", "%ymm21", "%ymm22", "%ymm23",
2608 "%ymm24", "%ymm25", "%ymm26", "%ymm27",
2609 "%ymm28", "%ymm29", "%ymm30", "%ymm31"
2610};
2611
2612static const char **names_zmm;
2613static const char *intel_names_zmm[] = {
2614 "zmm0", "zmm1", "zmm2", "zmm3",
2615 "zmm4", "zmm5", "zmm6", "zmm7",
2616 "zmm8", "zmm9", "zmm10", "zmm11",
2617 "zmm12", "zmm13", "zmm14", "zmm15",
2618 "zmm16", "zmm17", "zmm18", "zmm19",
2619 "zmm20", "zmm21", "zmm22", "zmm23",
2620 "zmm24", "zmm25", "zmm26", "zmm27",
2621 "zmm28", "zmm29", "zmm30", "zmm31"
2622};
2623static const char *att_names_zmm[] = {
2624 "%zmm0", "%zmm1", "%zmm2", "%zmm3",
2625 "%zmm4", "%zmm5", "%zmm6", "%zmm7",
2626 "%zmm8", "%zmm9", "%zmm10", "%zmm11",
2627 "%zmm12", "%zmm13", "%zmm14", "%zmm15",
2628 "%zmm16", "%zmm17", "%zmm18", "%zmm19",
2629 "%zmm20", "%zmm21", "%zmm22", "%zmm23",
2630 "%zmm24", "%zmm25", "%zmm26", "%zmm27",
2631 "%zmm28", "%zmm29", "%zmm30", "%zmm31"
2632};
2633
260cd341
LC
2634static const char **names_tmm;
2635static const char *intel_names_tmm[] = {
2636 "tmm0", "tmm1", "tmm2", "tmm3",
2637 "tmm4", "tmm5", "tmm6", "tmm7"
2638};
2639static const char *att_names_tmm[] = {
2640 "%tmm0", "%tmm1", "%tmm2", "%tmm3",
2641 "%tmm4", "%tmm5", "%tmm6", "%tmm7"
2642};
2643
43234a1e
L
2644static const char **names_mask;
2645static const char *intel_names_mask[] = {
2646 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7"
2647};
2648static const char *att_names_mask[] = {
2649 "%k0", "%k1", "%k2", "%k3", "%k4", "%k5", "%k6", "%k7"
2650};
2651
2652static const char *names_rounding[] =
2653{
2654 "{rn-sae}",
2655 "{rd-sae}",
2656 "{ru-sae}",
2657 "{rz-sae}"
b9733481
L
2658};
2659
1ceb70f8
L
2660static const struct dis386 reg_table[][8] = {
2661 /* REG_80 */
252b5132 2662 {
bf890a93
IT
2663 { "addA", { Ebh1, Ib }, 0 },
2664 { "orA", { Ebh1, Ib }, 0 },
2665 { "adcA", { Ebh1, Ib }, 0 },
2666 { "sbbA", { Ebh1, Ib }, 0 },
2667 { "andA", { Ebh1, Ib }, 0 },
2668 { "subA", { Ebh1, Ib }, 0 },
2669 { "xorA", { Ebh1, Ib }, 0 },
2670 { "cmpA", { Eb, Ib }, 0 },
252b5132 2671 },
1ceb70f8 2672 /* REG_81 */
252b5132 2673 {
bf890a93
IT
2674 { "addQ", { Evh1, Iv }, 0 },
2675 { "orQ", { Evh1, Iv }, 0 },
2676 { "adcQ", { Evh1, Iv }, 0 },
2677 { "sbbQ", { Evh1, Iv }, 0 },
2678 { "andQ", { Evh1, Iv }, 0 },
2679 { "subQ", { Evh1, Iv }, 0 },
2680 { "xorQ", { Evh1, Iv }, 0 },
2681 { "cmpQ", { Ev, Iv }, 0 },
252b5132 2682 },
7148c369 2683 /* REG_83 */
252b5132 2684 {
bf890a93
IT
2685 { "addQ", { Evh1, sIb }, 0 },
2686 { "orQ", { Evh1, sIb }, 0 },
2687 { "adcQ", { Evh1, sIb }, 0 },
2688 { "sbbQ", { Evh1, sIb }, 0 },
2689 { "andQ", { Evh1, sIb }, 0 },
2690 { "subQ", { Evh1, sIb }, 0 },
2691 { "xorQ", { Evh1, sIb }, 0 },
2692 { "cmpQ", { Ev, sIb }, 0 },
252b5132 2693 },
1ceb70f8 2694 /* REG_8F */
4e7d34a6 2695 {
bf890a93 2696 { "popU", { stackEv }, 0 },
c48244a5 2697 { XOP_8F_TABLE (XOP_09) },
592d1631
L
2698 { Bad_Opcode },
2699 { Bad_Opcode },
2700 { Bad_Opcode },
f88c9eb0 2701 { XOP_8F_TABLE (XOP_09) },
4e7d34a6 2702 },
1ceb70f8 2703 /* REG_C0 */
252b5132 2704 {
bf890a93
IT
2705 { "rolA", { Eb, Ib }, 0 },
2706 { "rorA", { Eb, Ib }, 0 },
2707 { "rclA", { Eb, Ib }, 0 },
2708 { "rcrA", { Eb, Ib }, 0 },
2709 { "shlA", { Eb, Ib }, 0 },
2710 { "shrA", { Eb, Ib }, 0 },
e4bdd679 2711 { "shlA", { Eb, Ib }, 0 },
bf890a93 2712 { "sarA", { Eb, Ib }, 0 },
252b5132 2713 },
1ceb70f8 2714 /* REG_C1 */
252b5132 2715 {
bf890a93
IT
2716 { "rolQ", { Ev, Ib }, 0 },
2717 { "rorQ", { Ev, Ib }, 0 },
2718 { "rclQ", { Ev, Ib }, 0 },
2719 { "rcrQ", { Ev, Ib }, 0 },
2720 { "shlQ", { Ev, Ib }, 0 },
2721 { "shrQ", { Ev, Ib }, 0 },
e4bdd679 2722 { "shlQ", { Ev, Ib }, 0 },
bf890a93 2723 { "sarQ", { Ev, Ib }, 0 },
252b5132 2724 },
1ceb70f8 2725 /* REG_C6 */
4e7d34a6 2726 {
bf890a93 2727 { "movA", { Ebh3, Ib }, 0 },
42164a71
L
2728 { Bad_Opcode },
2729 { Bad_Opcode },
2730 { Bad_Opcode },
2731 { Bad_Opcode },
2732 { Bad_Opcode },
2733 { Bad_Opcode },
2734 { MOD_TABLE (MOD_C6_REG_7) },
4e7d34a6 2735 },
1ceb70f8 2736 /* REG_C7 */
4e7d34a6 2737 {
bf890a93 2738 { "movQ", { Evh3, Iv }, 0 },
42164a71
L
2739 { Bad_Opcode },
2740 { Bad_Opcode },
2741 { Bad_Opcode },
2742 { Bad_Opcode },
2743 { Bad_Opcode },
2744 { Bad_Opcode },
2745 { MOD_TABLE (MOD_C7_REG_7) },
4e7d34a6 2746 },
1ceb70f8 2747 /* REG_D0 */
252b5132 2748 {
bf890a93
IT
2749 { "rolA", { Eb, I1 }, 0 },
2750 { "rorA", { Eb, I1 }, 0 },
2751 { "rclA", { Eb, I1 }, 0 },
2752 { "rcrA", { Eb, I1 }, 0 },
2753 { "shlA", { Eb, I1 }, 0 },
2754 { "shrA", { Eb, I1 }, 0 },
e4bdd679 2755 { "shlA", { Eb, I1 }, 0 },
bf890a93 2756 { "sarA", { Eb, I1 }, 0 },
252b5132 2757 },
1ceb70f8 2758 /* REG_D1 */
252b5132 2759 {
bf890a93
IT
2760 { "rolQ", { Ev, I1 }, 0 },
2761 { "rorQ", { Ev, I1 }, 0 },
2762 { "rclQ", { Ev, I1 }, 0 },
2763 { "rcrQ", { Ev, I1 }, 0 },
2764 { "shlQ", { Ev, I1 }, 0 },
2765 { "shrQ", { Ev, I1 }, 0 },
e4bdd679 2766 { "shlQ", { Ev, I1 }, 0 },
bf890a93 2767 { "sarQ", { Ev, I1 }, 0 },
252b5132 2768 },
1ceb70f8 2769 /* REG_D2 */
252b5132 2770 {
bf890a93
IT
2771 { "rolA", { Eb, CL }, 0 },
2772 { "rorA", { Eb, CL }, 0 },
2773 { "rclA", { Eb, CL }, 0 },
2774 { "rcrA", { Eb, CL }, 0 },
2775 { "shlA", { Eb, CL }, 0 },
2776 { "shrA", { Eb, CL }, 0 },
e4bdd679 2777 { "shlA", { Eb, CL }, 0 },
bf890a93 2778 { "sarA", { Eb, CL }, 0 },
252b5132 2779 },
1ceb70f8 2780 /* REG_D3 */
252b5132 2781 {
bf890a93
IT
2782 { "rolQ", { Ev, CL }, 0 },
2783 { "rorQ", { Ev, CL }, 0 },
2784 { "rclQ", { Ev, CL }, 0 },
2785 { "rcrQ", { Ev, CL }, 0 },
2786 { "shlQ", { Ev, CL }, 0 },
2787 { "shrQ", { Ev, CL }, 0 },
e4bdd679 2788 { "shlQ", { Ev, CL }, 0 },
bf890a93 2789 { "sarQ", { Ev, CL }, 0 },
252b5132 2790 },
1ceb70f8 2791 /* REG_F6 */
252b5132 2792 {
bf890a93 2793 { "testA", { Eb, Ib }, 0 },
7db2c588 2794 { "testA", { Eb, Ib }, 0 },
bf890a93
IT
2795 { "notA", { Ebh1 }, 0 },
2796 { "negA", { Ebh1 }, 0 },
2797 { "mulA", { Eb }, 0 }, /* Don't print the implicit %al register, */
2798 { "imulA", { Eb }, 0 }, /* to distinguish these opcodes from other */
2799 { "divA", { Eb }, 0 }, /* mul/imul opcodes. Do the same for div */
2800 { "idivA", { Eb }, 0 }, /* and idiv for consistency. */
252b5132 2801 },
1ceb70f8 2802 /* REG_F7 */
252b5132 2803 {
bf890a93 2804 { "testQ", { Ev, Iv }, 0 },
7db2c588 2805 { "testQ", { Ev, Iv }, 0 },
bf890a93
IT
2806 { "notQ", { Evh1 }, 0 },
2807 { "negQ", { Evh1 }, 0 },
2808 { "mulQ", { Ev }, 0 }, /* Don't print the implicit register. */
2809 { "imulQ", { Ev }, 0 },
2810 { "divQ", { Ev }, 0 },
2811 { "idivQ", { Ev }, 0 },
252b5132 2812 },
1ceb70f8 2813 /* REG_FE */
252b5132 2814 {
bf890a93
IT
2815 { "incA", { Ebh1 }, 0 },
2816 { "decA", { Ebh1 }, 0 },
252b5132 2817 },
1ceb70f8 2818 /* REG_FF */
252b5132 2819 {
bf890a93
IT
2820 { "incQ", { Evh1 }, 0 },
2821 { "decQ", { Evh1 }, 0 },
9fef80d6 2822 { "call{&|}", { NOTRACK, indirEv, BND }, 0 },
4a357820 2823 { MOD_TABLE (MOD_FF_REG_3) },
9fef80d6 2824 { "jmp{&|}", { NOTRACK, indirEv, BND }, 0 },
4a357820 2825 { MOD_TABLE (MOD_FF_REG_5) },
bf890a93 2826 { "pushU", { stackEv }, 0 },
592d1631 2827 { Bad_Opcode },
252b5132 2828 },
1ceb70f8 2829 /* REG_0F00 */
252b5132 2830 {
bf890a93
IT
2831 { "sldtD", { Sv }, 0 },
2832 { "strD", { Sv }, 0 },
2833 { "lldt", { Ew }, 0 },
2834 { "ltr", { Ew }, 0 },
2835 { "verr", { Ew }, 0 },
2836 { "verw", { Ew }, 0 },
592d1631
L
2837 { Bad_Opcode },
2838 { Bad_Opcode },
252b5132 2839 },
1ceb70f8 2840 /* REG_0F01 */
252b5132 2841 {
1ceb70f8
L
2842 { MOD_TABLE (MOD_0F01_REG_0) },
2843 { MOD_TABLE (MOD_0F01_REG_1) },
2844 { MOD_TABLE (MOD_0F01_REG_2) },
2845 { MOD_TABLE (MOD_0F01_REG_3) },
bf890a93 2846 { "smswD", { Sv }, 0 },
8eab4136 2847 { MOD_TABLE (MOD_0F01_REG_5) },
bf890a93 2848 { "lmsw", { Ew }, 0 },
1ceb70f8 2849 { MOD_TABLE (MOD_0F01_REG_7) },
252b5132 2850 },
b5b1fc4f 2851 /* REG_0F0D */
252b5132 2852 {
bf890a93
IT
2853 { "prefetch", { Mb }, 0 },
2854 { "prefetchw", { Mb }, 0 },
2855 { "prefetchwt1", { Mb }, 0 },
2856 { "prefetch", { Mb }, 0 },
2857 { "prefetch", { Mb }, 0 },
2858 { "prefetch", { Mb }, 0 },
2859 { "prefetch", { Mb }, 0 },
2860 { "prefetch", { Mb }, 0 },
252b5132 2861 },
1ceb70f8 2862 /* REG_0F18 */
252b5132 2863 {
1ceb70f8
L
2864 { MOD_TABLE (MOD_0F18_REG_0) },
2865 { MOD_TABLE (MOD_0F18_REG_1) },
2866 { MOD_TABLE (MOD_0F18_REG_2) },
2867 { MOD_TABLE (MOD_0F18_REG_3) },
d7189fa5
RM
2868 { MOD_TABLE (MOD_0F18_REG_4) },
2869 { MOD_TABLE (MOD_0F18_REG_5) },
2870 { MOD_TABLE (MOD_0F18_REG_6) },
2871 { MOD_TABLE (MOD_0F18_REG_7) },
252b5132 2872 },
f8687e93 2873 /* REG_0F1C_P_0_MOD_0 */
c48935d7
IT
2874 {
2875 { "cldemote", { Mb }, 0 },
2876 { "nopQ", { Ev }, 0 },
2877 { "nopQ", { Ev }, 0 },
2878 { "nopQ", { Ev }, 0 },
2879 { "nopQ", { Ev }, 0 },
2880 { "nopQ", { Ev }, 0 },
2881 { "nopQ", { Ev }, 0 },
2882 { "nopQ", { Ev }, 0 },
2883 },
f8687e93 2884 /* REG_0F1E_P_1_MOD_3 */
603555e5
L
2885 {
2886 { "nopQ", { Ev }, 0 },
2887 { "rdsspK", { Rdq }, PREFIX_OPCODE },
2888 { "nopQ", { Ev }, 0 },
2889 { "nopQ", { Ev }, 0 },
2890 { "nopQ", { Ev }, 0 },
2891 { "nopQ", { Ev }, 0 },
2892 { "nopQ", { Ev }, 0 },
f8687e93 2893 { RM_TABLE (RM_0F1E_P_1_MOD_3_REG_7) },
603555e5 2894 },
1ceb70f8 2895 /* REG_0F71 */
a6bd098c 2896 {
592d1631
L
2897 { Bad_Opcode },
2898 { Bad_Opcode },
1ceb70f8 2899 { MOD_TABLE (MOD_0F71_REG_2) },
592d1631 2900 { Bad_Opcode },
1ceb70f8 2901 { MOD_TABLE (MOD_0F71_REG_4) },
592d1631 2902 { Bad_Opcode },
1ceb70f8 2903 { MOD_TABLE (MOD_0F71_REG_6) },
a6bd098c 2904 },
1ceb70f8 2905 /* REG_0F72 */
a6bd098c 2906 {
592d1631
L
2907 { Bad_Opcode },
2908 { Bad_Opcode },
1ceb70f8 2909 { MOD_TABLE (MOD_0F72_REG_2) },
592d1631 2910 { Bad_Opcode },
1ceb70f8 2911 { MOD_TABLE (MOD_0F72_REG_4) },
592d1631 2912 { Bad_Opcode },
1ceb70f8 2913 { MOD_TABLE (MOD_0F72_REG_6) },
a6bd098c 2914 },
1ceb70f8 2915 /* REG_0F73 */
252b5132 2916 {
592d1631
L
2917 { Bad_Opcode },
2918 { Bad_Opcode },
1ceb70f8
L
2919 { MOD_TABLE (MOD_0F73_REG_2) },
2920 { MOD_TABLE (MOD_0F73_REG_3) },
592d1631
L
2921 { Bad_Opcode },
2922 { Bad_Opcode },
1ceb70f8
L
2923 { MOD_TABLE (MOD_0F73_REG_6) },
2924 { MOD_TABLE (MOD_0F73_REG_7) },
252b5132 2925 },
1ceb70f8 2926 /* REG_0FA6 */
252b5132 2927 {
bf890a93
IT
2928 { "montmul", { { OP_0f07, 0 } }, 0 },
2929 { "xsha1", { { OP_0f07, 0 } }, 0 },
2930 { "xsha256", { { OP_0f07, 0 } }, 0 },
4e7d34a6 2931 },
1ceb70f8 2932 /* REG_0FA7 */
4e7d34a6 2933 {
bf890a93
IT
2934 { "xstore-rng", { { OP_0f07, 0 } }, 0 },
2935 { "xcrypt-ecb", { { OP_0f07, 0 } }, 0 },
2936 { "xcrypt-cbc", { { OP_0f07, 0 } }, 0 },
2937 { "xcrypt-ctr", { { OP_0f07, 0 } }, 0 },
2938 { "xcrypt-cfb", { { OP_0f07, 0 } }, 0 },
2939 { "xcrypt-ofb", { { OP_0f07, 0 } }, 0 },
4e7d34a6 2940 },
1ceb70f8 2941 /* REG_0FAE */
4e7d34a6 2942 {
1ceb70f8
L
2943 { MOD_TABLE (MOD_0FAE_REG_0) },
2944 { MOD_TABLE (MOD_0FAE_REG_1) },
2945 { MOD_TABLE (MOD_0FAE_REG_2) },
2946 { MOD_TABLE (MOD_0FAE_REG_3) },
475a2301 2947 { MOD_TABLE (MOD_0FAE_REG_4) },
1ceb70f8
L
2948 { MOD_TABLE (MOD_0FAE_REG_5) },
2949 { MOD_TABLE (MOD_0FAE_REG_6) },
2950 { MOD_TABLE (MOD_0FAE_REG_7) },
252b5132 2951 },
1ceb70f8 2952 /* REG_0FBA */
252b5132 2953 {
592d1631
L
2954 { Bad_Opcode },
2955 { Bad_Opcode },
2956 { Bad_Opcode },
2957 { Bad_Opcode },
bf890a93
IT
2958 { "btQ", { Ev, Ib }, 0 },
2959 { "btsQ", { Evh1, Ib }, 0 },
2960 { "btrQ", { Evh1, Ib }, 0 },
2961 { "btcQ", { Evh1, Ib }, 0 },
c608c12e 2962 },
1ceb70f8 2963 /* REG_0FC7 */
c608c12e 2964 {
592d1631 2965 { Bad_Opcode },
bf890a93 2966 { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } }, 0 },
592d1631 2967 { Bad_Opcode },
963f3586
IT
2968 { MOD_TABLE (MOD_0FC7_REG_3) },
2969 { MOD_TABLE (MOD_0FC7_REG_4) },
2970 { MOD_TABLE (MOD_0FC7_REG_5) },
1ceb70f8
L
2971 { MOD_TABLE (MOD_0FC7_REG_6) },
2972 { MOD_TABLE (MOD_0FC7_REG_7) },
252b5132 2973 },
592a252b 2974 /* REG_VEX_0F71 */
c0f3af97 2975 {
592d1631
L
2976 { Bad_Opcode },
2977 { Bad_Opcode },
592a252b 2978 { MOD_TABLE (MOD_VEX_0F71_REG_2) },
592d1631 2979 { Bad_Opcode },
592a252b 2980 { MOD_TABLE (MOD_VEX_0F71_REG_4) },
592d1631 2981 { Bad_Opcode },
592a252b 2982 { MOD_TABLE (MOD_VEX_0F71_REG_6) },
c0f3af97 2983 },
592a252b 2984 /* REG_VEX_0F72 */
c0f3af97 2985 {
592d1631
L
2986 { Bad_Opcode },
2987 { Bad_Opcode },
592a252b 2988 { MOD_TABLE (MOD_VEX_0F72_REG_2) },
592d1631 2989 { Bad_Opcode },
592a252b 2990 { MOD_TABLE (MOD_VEX_0F72_REG_4) },
592d1631 2991 { Bad_Opcode },
592a252b 2992 { MOD_TABLE (MOD_VEX_0F72_REG_6) },
c0f3af97 2993 },
592a252b 2994 /* REG_VEX_0F73 */
c0f3af97 2995 {
592d1631
L
2996 { Bad_Opcode },
2997 { Bad_Opcode },
592a252b
L
2998 { MOD_TABLE (MOD_VEX_0F73_REG_2) },
2999 { MOD_TABLE (MOD_VEX_0F73_REG_3) },
592d1631
L
3000 { Bad_Opcode },
3001 { Bad_Opcode },
592a252b
L
3002 { MOD_TABLE (MOD_VEX_0F73_REG_6) },
3003 { MOD_TABLE (MOD_VEX_0F73_REG_7) },
c0f3af97 3004 },
592a252b 3005 /* REG_VEX_0FAE */
c0f3af97 3006 {
592d1631
L
3007 { Bad_Opcode },
3008 { Bad_Opcode },
592a252b
L
3009 { MOD_TABLE (MOD_VEX_0FAE_REG_2) },
3010 { MOD_TABLE (MOD_VEX_0FAE_REG_3) },
c0f3af97 3011 },
260cd341
LC
3012 /* REG_VEX_0F3849_X86_64_P_0_W_0_M_1 */
3013 {
3014 { RM_TABLE (RM_VEX_0F3849_X86_64_P_0_W_0_M_1_R_0) },
3015 },
f12dc422
L
3016 /* REG_VEX_0F38F3 */
3017 {
3018 { Bad_Opcode },
035e7389
JB
3019 { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_1) },
3020 { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_2) },
3021 { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_3) },
f12dc422 3022 },
467bbef0 3023 /* REG_0FXOP_09_01_L_0 */
2a2a0f38
QN
3024 {
3025 { Bad_Opcode },
467bbef0
JB
3026 { "blcfill", { VexGdq, Edq }, 0 },
3027 { "blsfill", { VexGdq, Edq }, 0 },
3028 { "blcs", { VexGdq, Edq }, 0 },
3029 { "tzmsk", { VexGdq, Edq }, 0 },
3030 { "blcic", { VexGdq, Edq }, 0 },
3031 { "blsic", { VexGdq, Edq }, 0 },
3032 { "t1mskc", { VexGdq, Edq }, 0 },
2a2a0f38 3033 },
467bbef0 3034 /* REG_0FXOP_09_02_L_0 */
2a2a0f38
QN
3035 {
3036 { Bad_Opcode },
467bbef0 3037 { "blcmsk", { VexGdq, Edq }, 0 },
2a2a0f38
QN
3038 { Bad_Opcode },
3039 { Bad_Opcode },
3040 { Bad_Opcode },
3041 { Bad_Opcode },
467bbef0
JB
3042 { "blci", { VexGdq, Edq }, 0 },
3043 },
3044 /* REG_0FXOP_09_12_M_1_L_0 */
3045 {
3046 { "llwpcb", { Edq }, 0 },
3047 { "slwpcb", { Edq }, 0 },
3048 },
3049 /* REG_0FXOP_0A_12_L_0 */
3050 {
3051 { "lwpins", { VexGdq, Ed, Id }, 0 },
3052 { "lwpval", { VexGdq, Ed, Id }, 0 },
2a2a0f38 3053 },
ad692897
L
3054
3055#include "i386-dis-evex-reg.h"
4e7d34a6
L
3056};
3057
1ceb70f8
L
3058static const struct dis386 prefix_table[][4] = {
3059 /* PREFIX_90 */
252b5132 3060 {
bf890a93
IT
3061 { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } }, 0 },
3062 { "pause", { XX }, 0 },
3063 { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } }, 0 },
507bd325 3064 { NULL, { { NULL, 0 } }, PREFIX_IGNORED }
0f10071e 3065 },
4e7d34a6 3066
f9630fa6 3067 /* PREFIX_0F01_REG_3_RM_1 */
a847e322
JB
3068 {
3069 { "vmmcall", { Skip_MODRM }, 0 },
3070 { "vmgexit", { Skip_MODRM }, 0 },
d27c357a
JB
3071 { Bad_Opcode },
3072 { "vmgexit", { Skip_MODRM }, 0 },
a847e322
JB
3073 },
3074
f8687e93 3075 /* PREFIX_0F01_REG_5_MOD_0 */
603555e5
L
3076 {
3077 { Bad_Opcode },
3078 { "rstorssp", { Mq }, PREFIX_OPCODE },
3079 },
3080
f8687e93 3081 /* PREFIX_0F01_REG_5_MOD_3_RM_0 */
603555e5 3082 {
4b27d27c 3083 { "serialize", { Skip_MODRM }, PREFIX_OPCODE },
2234eee6 3084 { "setssbsy", { Skip_MODRM }, PREFIX_OPCODE },
bb651e8b 3085 { Bad_Opcode },
efe30057 3086 { "xsusldtrk", { Skip_MODRM }, PREFIX_OPCODE },
bb651e8b
CL
3087 },
3088
3089 /* PREFIX_0F01_REG_5_MOD_3_RM_1 */
3090 {
3091 { Bad_Opcode },
3092 { Bad_Opcode },
3093 { Bad_Opcode },
3094 { "xresldtrk", { Skip_MODRM }, PREFIX_OPCODE },
603555e5
L
3095 },
3096
f8687e93 3097 /* PREFIX_0F01_REG_5_MOD_3_RM_2 */
603555e5
L
3098 {
3099 { Bad_Opcode },
c2f76402 3100 { "saveprevssp", { Skip_MODRM }, PREFIX_OPCODE },
603555e5
L
3101 },
3102
267b8516
JB
3103 /* PREFIX_0F01_REG_7_MOD_3_RM_2 */
3104 {
3105 { "monitorx", { { OP_Monitor, 0 } }, 0 },
142861df 3106 { "mcommit", { Skip_MODRM }, 0 },
267b8516
JB
3107 },
3108
3233d7d0
IT
3109 /* PREFIX_0F09 */
3110 {
3111 { "wbinvd", { XX }, 0 },
3112 { "wbnoinvd", { XX }, 0 },
3113 },
3114
1ceb70f8 3115 /* PREFIX_0F10 */
cc0ec051 3116 {
507bd325
L
3117 { "movups", { XM, EXx }, PREFIX_OPCODE },
3118 { "movss", { XM, EXd }, PREFIX_OPCODE },
3119 { "movupd", { XM, EXx }, PREFIX_OPCODE },
3120 { "movsd", { XM, EXq }, PREFIX_OPCODE },
30d1c836 3121 },
4e7d34a6 3122
1ceb70f8 3123 /* PREFIX_0F11 */
30d1c836 3124 {
507bd325
L
3125 { "movups", { EXxS, XM }, PREFIX_OPCODE },
3126 { "movss", { EXdS, XM }, PREFIX_OPCODE },
3127 { "movupd", { EXxS, XM }, PREFIX_OPCODE },
3128 { "movsd", { EXqS, XM }, PREFIX_OPCODE },
4e7d34a6 3129 },
252b5132 3130
1ceb70f8 3131 /* PREFIX_0F12 */
c608c12e 3132 {
1ceb70f8 3133 { MOD_TABLE (MOD_0F12_PREFIX_0) },
507bd325 3134 { "movsldup", { XM, EXx }, PREFIX_OPCODE },
18897deb 3135 { MOD_TABLE (MOD_0F12_PREFIX_2) },
507bd325 3136 { "movddup", { XM, EXq }, PREFIX_OPCODE },
c608c12e 3137 },
4e7d34a6 3138
1ceb70f8 3139 /* PREFIX_0F16 */
c608c12e 3140 {
1ceb70f8 3141 { MOD_TABLE (MOD_0F16_PREFIX_0) },
507bd325 3142 { "movshdup", { XM, EXx }, PREFIX_OPCODE },
18897deb 3143 { MOD_TABLE (MOD_0F16_PREFIX_2) },
c608c12e 3144 },
4e7d34a6 3145
7e8b059b
L
3146 /* PREFIX_0F1A */
3147 {
3148 { MOD_TABLE (MOD_0F1A_PREFIX_0) },
bf890a93
IT
3149 { "bndcl", { Gbnd, Ev_bnd }, 0 },
3150 { "bndmov", { Gbnd, Ebnd }, 0 },
3151 { "bndcu", { Gbnd, Ev_bnd }, 0 },
7e8b059b
L
3152 },
3153
3154 /* PREFIX_0F1B */
3155 {
3156 { MOD_TABLE (MOD_0F1B_PREFIX_0) },
3157 { MOD_TABLE (MOD_0F1B_PREFIX_1) },
9f79e886 3158 { "bndmov", { EbndS, Gbnd }, 0 },
bf890a93 3159 { "bndcn", { Gbnd, Ev_bnd }, 0 },
7e8b059b
L
3160 },
3161
c48935d7
IT
3162 /* PREFIX_0F1C */
3163 {
3164 { MOD_TABLE (MOD_0F1C_PREFIX_0) },
3165 { "nopQ", { Ev }, PREFIX_OPCODE },
3166 { "nopQ", { Ev }, PREFIX_OPCODE },
3167 { "nopQ", { Ev }, PREFIX_OPCODE },
3168 },
3169
603555e5
L
3170 /* PREFIX_0F1E */
3171 {
3172 { "nopQ", { Ev }, PREFIX_OPCODE },
3173 { MOD_TABLE (MOD_0F1E_PREFIX_1) },
3174 { "nopQ", { Ev }, PREFIX_OPCODE },
3175 { "nopQ", { Ev }, PREFIX_OPCODE },
3176 },
3177
1ceb70f8 3178 /* PREFIX_0F2A */
c608c12e 3179 {
507bd325 3180 { "cvtpi2ps", { XM, EMCq }, PREFIX_OPCODE },
b24d668c 3181 { "cvtsi2ss{%LQ|}", { XM, Edq }, PREFIX_OPCODE },
507bd325 3182 { "cvtpi2pd", { XM, EMCq }, PREFIX_OPCODE },
b24d668c 3183 { "cvtsi2sd{%LQ|}", { XM, Edq }, 0 },
c608c12e 3184 },
4e7d34a6 3185
1ceb70f8 3186 /* PREFIX_0F2B */
c608c12e 3187 {
75c135a8
L
3188 { MOD_TABLE (MOD_0F2B_PREFIX_0) },
3189 { MOD_TABLE (MOD_0F2B_PREFIX_1) },
3190 { MOD_TABLE (MOD_0F2B_PREFIX_2) },
3191 { MOD_TABLE (MOD_0F2B_PREFIX_3) },
c608c12e 3192 },
4e7d34a6 3193
1ceb70f8 3194 /* PREFIX_0F2C */
c608c12e 3195 {
507bd325 3196 { "cvttps2pi", { MXC, EXq }, PREFIX_OPCODE },
e1a1babd 3197 { "cvttss2si", { Gdq, EXd }, PREFIX_OPCODE },
507bd325 3198 { "cvttpd2pi", { MXC, EXx }, PREFIX_OPCODE },
e1a1babd 3199 { "cvttsd2si", { Gdq, EXq }, PREFIX_OPCODE },
c608c12e 3200 },
4e7d34a6 3201
1ceb70f8 3202 /* PREFIX_0F2D */
c608c12e 3203 {
507bd325 3204 { "cvtps2pi", { MXC, EXq }, PREFIX_OPCODE },
e1a1babd 3205 { "cvtss2si", { Gdq, EXd }, PREFIX_OPCODE },
507bd325 3206 { "cvtpd2pi", { MXC, EXx }, PREFIX_OPCODE },
e1a1babd 3207 { "cvtsd2si", { Gdq, EXq }, PREFIX_OPCODE },
c608c12e 3208 },
4e7d34a6 3209
1ceb70f8 3210 /* PREFIX_0F2E */
c608c12e 3211 {
bf890a93 3212 { "ucomiss",{ XM, EXd }, 0 },
592d1631 3213 { Bad_Opcode },
bf890a93 3214 { "ucomisd",{ XM, EXq }, 0 },
c608c12e 3215 },
4e7d34a6 3216
1ceb70f8 3217 /* PREFIX_0F2F */
c608c12e 3218 {
bf890a93 3219 { "comiss", { XM, EXd }, 0 },
592d1631 3220 { Bad_Opcode },
bf890a93 3221 { "comisd", { XM, EXq }, 0 },
c608c12e 3222 },
4e7d34a6 3223
1ceb70f8 3224 /* PREFIX_0F51 */
c608c12e 3225 {
507bd325
L
3226 { "sqrtps", { XM, EXx }, PREFIX_OPCODE },
3227 { "sqrtss", { XM, EXd }, PREFIX_OPCODE },
3228 { "sqrtpd", { XM, EXx }, PREFIX_OPCODE },
3229 { "sqrtsd", { XM, EXq }, PREFIX_OPCODE },
c608c12e 3230 },
4e7d34a6 3231
1ceb70f8 3232 /* PREFIX_0F52 */
c608c12e 3233 {
507bd325
L
3234 { "rsqrtps",{ XM, EXx }, PREFIX_OPCODE },
3235 { "rsqrtss",{ XM, EXd }, PREFIX_OPCODE },
c608c12e 3236 },
4e7d34a6 3237
1ceb70f8 3238 /* PREFIX_0F53 */
c608c12e 3239 {
507bd325
L
3240 { "rcpps", { XM, EXx }, PREFIX_OPCODE },
3241 { "rcpss", { XM, EXd }, PREFIX_OPCODE },
c608c12e 3242 },
4e7d34a6 3243
1ceb70f8 3244 /* PREFIX_0F58 */
c608c12e 3245 {
507bd325
L
3246 { "addps", { XM, EXx }, PREFIX_OPCODE },
3247 { "addss", { XM, EXd }, PREFIX_OPCODE },
3248 { "addpd", { XM, EXx }, PREFIX_OPCODE },
3249 { "addsd", { XM, EXq }, PREFIX_OPCODE },
c608c12e 3250 },
4e7d34a6 3251
1ceb70f8 3252 /* PREFIX_0F59 */
c608c12e 3253 {
507bd325
L
3254 { "mulps", { XM, EXx }, PREFIX_OPCODE },
3255 { "mulss", { XM, EXd }, PREFIX_OPCODE },
3256 { "mulpd", { XM, EXx }, PREFIX_OPCODE },
3257 { "mulsd", { XM, EXq }, PREFIX_OPCODE },
041bd2e0 3258 },
4e7d34a6 3259
1ceb70f8 3260 /* PREFIX_0F5A */
041bd2e0 3261 {
507bd325
L
3262 { "cvtps2pd", { XM, EXq }, PREFIX_OPCODE },
3263 { "cvtss2sd", { XM, EXd }, PREFIX_OPCODE },
3264 { "cvtpd2ps", { XM, EXx }, PREFIX_OPCODE },
3265 { "cvtsd2ss", { XM, EXq }, PREFIX_OPCODE },
041bd2e0 3266 },
4e7d34a6 3267
1ceb70f8 3268 /* PREFIX_0F5B */
041bd2e0 3269 {
507bd325
L
3270 { "cvtdq2ps", { XM, EXx }, PREFIX_OPCODE },
3271 { "cvttps2dq", { XM, EXx }, PREFIX_OPCODE },
3272 { "cvtps2dq", { XM, EXx }, PREFIX_OPCODE },
041bd2e0 3273 },
4e7d34a6 3274
1ceb70f8 3275 /* PREFIX_0F5C */
041bd2e0 3276 {
507bd325
L
3277 { "subps", { XM, EXx }, PREFIX_OPCODE },
3278 { "subss", { XM, EXd }, PREFIX_OPCODE },
3279 { "subpd", { XM, EXx }, PREFIX_OPCODE },
3280 { "subsd", { XM, EXq }, PREFIX_OPCODE },
041bd2e0 3281 },
4e7d34a6 3282
1ceb70f8 3283 /* PREFIX_0F5D */
041bd2e0 3284 {
507bd325
L
3285 { "minps", { XM, EXx }, PREFIX_OPCODE },
3286 { "minss", { XM, EXd }, PREFIX_OPCODE },
3287 { "minpd", { XM, EXx }, PREFIX_OPCODE },
3288 { "minsd", { XM, EXq }, PREFIX_OPCODE },
041bd2e0 3289 },
4e7d34a6 3290
1ceb70f8 3291 /* PREFIX_0F5E */
041bd2e0 3292 {
507bd325
L
3293 { "divps", { XM, EXx }, PREFIX_OPCODE },
3294 { "divss", { XM, EXd }, PREFIX_OPCODE },
3295 { "divpd", { XM, EXx }, PREFIX_OPCODE },
3296 { "divsd", { XM, EXq }, PREFIX_OPCODE },
041bd2e0 3297 },
4e7d34a6 3298
1ceb70f8 3299 /* PREFIX_0F5F */
041bd2e0 3300 {
507bd325
L
3301 { "maxps", { XM, EXx }, PREFIX_OPCODE },
3302 { "maxss", { XM, EXd }, PREFIX_OPCODE },
3303 { "maxpd", { XM, EXx }, PREFIX_OPCODE },
3304 { "maxsd", { XM, EXq }, PREFIX_OPCODE },
041bd2e0 3305 },
4e7d34a6 3306
1ceb70f8 3307 /* PREFIX_0F60 */
041bd2e0 3308 {
507bd325 3309 { "punpcklbw",{ MX, EMd }, PREFIX_OPCODE },
592d1631 3310 { Bad_Opcode },
507bd325 3311 { "punpcklbw",{ MX, EMx }, PREFIX_OPCODE },
041bd2e0 3312 },
4e7d34a6 3313
1ceb70f8 3314 /* PREFIX_0F61 */
041bd2e0 3315 {
507bd325 3316 { "punpcklwd",{ MX, EMd }, PREFIX_OPCODE },
592d1631 3317 { Bad_Opcode },
507bd325 3318 { "punpcklwd",{ MX, EMx }, PREFIX_OPCODE },
041bd2e0 3319 },
4e7d34a6 3320
1ceb70f8 3321 /* PREFIX_0F62 */
041bd2e0 3322 {
507bd325 3323 { "punpckldq",{ MX, EMd }, PREFIX_OPCODE },
592d1631 3324 { Bad_Opcode },
507bd325 3325 { "punpckldq",{ MX, EMx }, PREFIX_OPCODE },
041bd2e0 3326 },
4e7d34a6 3327
1ceb70f8 3328 /* PREFIX_0F6F */
ca164297 3329 {
507bd325
L
3330 { "movq", { MX, EM }, PREFIX_OPCODE },
3331 { "movdqu", { XM, EXx }, PREFIX_OPCODE },
3332 { "movdqa", { XM, EXx }, PREFIX_OPCODE },
ca164297 3333 },
4e7d34a6 3334
1ceb70f8 3335 /* PREFIX_0F70 */
4e7d34a6 3336 {
507bd325
L
3337 { "pshufw", { MX, EM, Ib }, PREFIX_OPCODE },
3338 { "pshufhw",{ XM, EXx, Ib }, PREFIX_OPCODE },
3339 { "pshufd", { XM, EXx, Ib }, PREFIX_OPCODE },
3340 { "pshuflw",{ XM, EXx, Ib }, PREFIX_OPCODE },
4e7d34a6
L
3341 },
3342
1ceb70f8 3343 /* PREFIX_0F78 */
4e7d34a6 3344 {
bf890a93 3345 {"vmread", { Em, Gm }, 0 },
592d1631 3346 { Bad_Opcode },
bf890a93
IT
3347 {"extrq", { XS, Ib, Ib }, 0 },
3348 {"insertq", { XM, XS, Ib, Ib }, 0 },
4e7d34a6
L
3349 },
3350
1ceb70f8 3351 /* PREFIX_0F79 */
4e7d34a6 3352 {
bf890a93 3353 {"vmwrite", { Gm, Em }, 0 },
592d1631 3354 { Bad_Opcode },
bf890a93
IT
3355 {"extrq", { XM, XS }, 0 },
3356 {"insertq", { XM, XS }, 0 },
4e7d34a6
L
3357 },
3358
1ceb70f8 3359 /* PREFIX_0F7C */
ca164297 3360 {
592d1631
L
3361 { Bad_Opcode },
3362 { Bad_Opcode },
507bd325
L
3363 { "haddpd", { XM, EXx }, PREFIX_OPCODE },
3364 { "haddps", { XM, EXx }, PREFIX_OPCODE },
ca164297 3365 },
4e7d34a6 3366
1ceb70f8 3367 /* PREFIX_0F7D */
ca164297 3368 {
592d1631
L
3369 { Bad_Opcode },
3370 { Bad_Opcode },
507bd325
L
3371 { "hsubpd", { XM, EXx }, PREFIX_OPCODE },
3372 { "hsubps", { XM, EXx }, PREFIX_OPCODE },
ca164297 3373 },
4e7d34a6 3374
1ceb70f8 3375 /* PREFIX_0F7E */
ca164297 3376 {
507bd325
L
3377 { "movK", { Edq, MX }, PREFIX_OPCODE },
3378 { "movq", { XM, EXq }, PREFIX_OPCODE },
3379 { "movK", { Edq, XM }, PREFIX_OPCODE },
ca164297 3380 },
4e7d34a6 3381
1ceb70f8 3382 /* PREFIX_0F7F */
ca164297 3383 {
507bd325
L
3384 { "movq", { EMS, MX }, PREFIX_OPCODE },
3385 { "movdqu", { EXxS, XM }, PREFIX_OPCODE },
3386 { "movdqa", { EXxS, XM }, PREFIX_OPCODE },
ca164297 3387 },
4e7d34a6 3388
f8687e93 3389 /* PREFIX_0FAE_REG_0_MOD_3 */
c7b8aa3a
L
3390 {
3391 { Bad_Opcode },
bf890a93 3392 { "rdfsbase", { Ev }, 0 },
c7b8aa3a
L
3393 },
3394
f8687e93 3395 /* PREFIX_0FAE_REG_1_MOD_3 */
c7b8aa3a
L
3396 {
3397 { Bad_Opcode },
bf890a93 3398 { "rdgsbase", { Ev }, 0 },
c7b8aa3a
L
3399 },
3400
f8687e93 3401 /* PREFIX_0FAE_REG_2_MOD_3 */
c7b8aa3a
L
3402 {
3403 { Bad_Opcode },
bf890a93 3404 { "wrfsbase", { Ev }, 0 },
c7b8aa3a
L
3405 },
3406
f8687e93 3407 /* PREFIX_0FAE_REG_3_MOD_3 */
c7b8aa3a
L
3408 {
3409 { Bad_Opcode },
bf890a93 3410 { "wrgsbase", { Ev }, 0 },
c7b8aa3a
L
3411 },
3412
f8687e93 3413 /* PREFIX_0FAE_REG_4_MOD_0 */
6b40c462
L
3414 {
3415 { "xsave", { FXSAVE }, 0 },
b24d668c 3416 { "ptwrite{%LQ|}", { Edq }, 0 },
6b40c462
L
3417 },
3418
f8687e93 3419 /* PREFIX_0FAE_REG_4_MOD_3 */
6b40c462
L
3420 {
3421 { Bad_Opcode },
b24d668c 3422 { "ptwrite{%LQ|}", { Edq }, 0 },
6b40c462
L
3423 },
3424
f8687e93 3425 /* PREFIX_0FAE_REG_5_MOD_3 */
2234eee6
L
3426 {
3427 { "lfence", { Skip_MODRM }, 0 },
3428 { "incsspK", { Rdq }, PREFIX_OPCODE },
603555e5
L
3429 },
3430
f8687e93 3431 /* PREFIX_0FAE_REG_6_MOD_0 */
c5e7287a 3432 {
603555e5
L
3433 { "xsaveopt", { FXSAVE }, PREFIX_OPCODE },
3434 { "clrssbsy", { Mq }, PREFIX_OPCODE },
3435 { "clwb", { Mb }, PREFIX_OPCODE },
c5e7287a
IT
3436 },
3437
f8687e93 3438 /* PREFIX_0FAE_REG_6_MOD_3 */
de89d0a3 3439 {
f8687e93 3440 { RM_TABLE (RM_0FAE_REG_6_MOD_3_P_0) },
de89d0a3 3441 { "umonitor", { Eva }, PREFIX_OPCODE },
ae1d3843
L
3442 { "tpause", { Edq }, PREFIX_OPCODE },
3443 { "umwait", { Edq }, PREFIX_OPCODE },
de89d0a3
IT
3444 },
3445
f8687e93 3446 /* PREFIX_0FAE_REG_7_MOD_0 */
963f3586 3447 {
bf890a93 3448 { "clflush", { Mb }, 0 },
963f3586 3449 { Bad_Opcode },
bf890a93 3450 { "clflushopt", { Mb }, 0 },
963f3586
IT
3451 },
3452
1ceb70f8 3453 /* PREFIX_0FB8 */
ca164297 3454 {
592d1631 3455 { Bad_Opcode },
bf890a93 3456 { "popcntS", { Gv, Ev }, 0 },
ca164297 3457 },
4e7d34a6 3458
f12dc422
L
3459 /* PREFIX_0FBC */
3460 {
bf890a93
IT
3461 { "bsfS", { Gv, Ev }, 0 },
3462 { "tzcntS", { Gv, Ev }, 0 },
3463 { "bsfS", { Gv, Ev }, 0 },
f12dc422
L
3464 },
3465
1ceb70f8 3466 /* PREFIX_0FBD */
050dfa73 3467 {
bf890a93
IT
3468 { "bsrS", { Gv, Ev }, 0 },
3469 { "lzcntS", { Gv, Ev }, 0 },
3470 { "bsrS", { Gv, Ev }, 0 },
050dfa73
MM
3471 },
3472
1ceb70f8 3473 /* PREFIX_0FC2 */
050dfa73 3474 {
507bd325
L
3475 { "cmpps", { XM, EXx, CMP }, PREFIX_OPCODE },
3476 { "cmpss", { XM, EXd, CMP }, PREFIX_OPCODE },
3477 { "cmppd", { XM, EXx, CMP }, PREFIX_OPCODE },
3478 { "cmpsd", { XM, EXq, CMP }, PREFIX_OPCODE },
050dfa73 3479 },
246c51aa 3480
f8687e93 3481 /* PREFIX_0FC7_REG_6_MOD_0 */
92fddf8e 3482 {
bf890a93
IT
3483 { "vmptrld",{ Mq }, 0 },
3484 { "vmxon", { Mq }, 0 },
3485 { "vmclear",{ Mq }, 0 },
92fddf8e
L
3486 },
3487
f8687e93 3488 /* PREFIX_0FC7_REG_6_MOD_3 */
f24bcbaa
L
3489 {
3490 { "rdrand", { Ev }, 0 },
3491 { Bad_Opcode },
3492 { "rdrand", { Ev }, 0 }
3493 },
3494
f8687e93 3495 /* PREFIX_0FC7_REG_7_MOD_3 */
f24bcbaa
L
3496 {
3497 { "rdseed", { Ev }, 0 },
8bc52696 3498 { "rdpid", { Em }, 0 },
f24bcbaa
L
3499 { "rdseed", { Ev }, 0 },
3500 },
3501
1ceb70f8 3502 /* PREFIX_0FD0 */
050dfa73 3503 {
592d1631
L
3504 { Bad_Opcode },
3505 { Bad_Opcode },
bf890a93
IT
3506 { "addsubpd", { XM, EXx }, 0 },
3507 { "addsubps", { XM, EXx }, 0 },
246c51aa 3508 },
050dfa73 3509
1ceb70f8 3510 /* PREFIX_0FD6 */
050dfa73 3511 {
592d1631 3512 { Bad_Opcode },
bf890a93
IT
3513 { "movq2dq",{ XM, MS }, 0 },
3514 { "movq", { EXqS, XM }, 0 },
3515 { "movdq2q",{ MX, XS }, 0 },
050dfa73
MM
3516 },
3517
1ceb70f8 3518 /* PREFIX_0FE6 */
7918206c 3519 {
592d1631 3520 { Bad_Opcode },
507bd325
L
3521 { "cvtdq2pd", { XM, EXq }, PREFIX_OPCODE },
3522 { "cvttpd2dq", { XM, EXx }, PREFIX_OPCODE },
3523 { "cvtpd2dq", { XM, EXx }, PREFIX_OPCODE },
7918206c 3524 },
8b38ad71 3525
1ceb70f8 3526 /* PREFIX_0FE7 */
8b38ad71 3527 {
507bd325 3528 { "movntq", { Mq, MX }, PREFIX_OPCODE },
592d1631 3529 { Bad_Opcode },
75c135a8 3530 { MOD_TABLE (MOD_0FE7_PREFIX_2) },
4e7d34a6
L
3531 },
3532
1ceb70f8 3533 /* PREFIX_0FF0 */
4e7d34a6 3534 {
592d1631
L
3535 { Bad_Opcode },
3536 { Bad_Opcode },
3537 { Bad_Opcode },
1ceb70f8 3538 { MOD_TABLE (MOD_0FF0_PREFIX_3) },
4e7d34a6
L
3539 },
3540
1ceb70f8 3541 /* PREFIX_0FF7 */
4e7d34a6 3542 {
507bd325 3543 { "maskmovq", { MX, MS }, PREFIX_OPCODE },
592d1631 3544 { Bad_Opcode },
507bd325 3545 { "maskmovdqu", { XM, XS }, PREFIX_OPCODE },
8b38ad71 3546 },
42903f7f 3547
1ceb70f8 3548 /* PREFIX_0F38F0 */
4e7d34a6 3549 {
9ab00b61 3550 { "movbeS", { Gv, Mv }, PREFIX_OPCODE },
592d1631 3551 { Bad_Opcode },
9ab00b61 3552 { "movbeS", { Gv, Mv }, PREFIX_OPCODE },
2875b28a 3553 { "crc32A", { Gdq, Eb }, PREFIX_OPCODE },
4e7d34a6
L
3554 },
3555
1ceb70f8 3556 /* PREFIX_0F38F1 */
4e7d34a6 3557 {
9ab00b61 3558 { "movbeS", { Mv, Gv }, PREFIX_OPCODE },
592d1631 3559 { Bad_Opcode },
9ab00b61 3560 { "movbeS", { Mv, Gv }, PREFIX_OPCODE },
2875b28a 3561 { "crc32Q", { Gdq, Ev }, PREFIX_OPCODE },
4e7d34a6
L
3562 },
3563
603555e5
L
3564 /* PREFIX_0F38F6 */
3565 {
3566 { MOD_TABLE (MOD_0F38F6_PREFIX_0) },
507bd325
L
3567 { "adoxS", { Gdq, Edq}, PREFIX_OPCODE },
3568 { "adcxS", { Gdq, Edq}, PREFIX_OPCODE },
e2e1fcde
L
3569 { Bad_Opcode },
3570 },
3571
c0a30a9f
L
3572 /* PREFIX_0F38F8 */
3573 {
3574 { Bad_Opcode },
5d79adc4 3575 { MOD_TABLE (MOD_0F38F8_PREFIX_1) },
c0a30a9f 3576 { MOD_TABLE (MOD_0F38F8_PREFIX_2) },
5d79adc4 3577 { MOD_TABLE (MOD_0F38F8_PREFIX_3) },
c0a30a9f
L
3578 },
3579
7531c613 3580 /* PREFIX_VEX_0F10 */
42903f7f 3581 {
7531c613
JB
3582 { "vmovups", { XM, EXx }, 0 },
3583 { "vmovss", { XMScalar, VexScalarR, EXxmm_md }, 0 },
3584 { "vmovupd", { XM, EXx }, 0 },
3585 { "vmovsd", { XMScalar, VexScalarR, EXxmm_mq }, 0 },
42903f7f
L
3586 },
3587
7531c613 3588 /* PREFIX_VEX_0F11 */
42903f7f 3589 {
7531c613
JB
3590 { "vmovups", { EXxS, XM }, 0 },
3591 { "vmovss", { EXdS, VexScalarR, XMScalar }, 0 },
3592 { "vmovupd", { EXxS, XM }, 0 },
3593 { "vmovsd", { EXqS, VexScalarR, XMScalar }, 0 },
42903f7f
L
3594 },
3595
7531c613 3596 /* PREFIX_VEX_0F12 */
42903f7f 3597 {
7531c613
JB
3598 { MOD_TABLE (MOD_VEX_0F12_PREFIX_0) },
3599 { "vmovsldup", { XM, EXx }, 0 },
3600 { MOD_TABLE (MOD_VEX_0F12_PREFIX_2) },
3601 { "vmovddup", { XM, EXymmq }, 0 },
42903f7f
L
3602 },
3603
7531c613 3604 /* PREFIX_VEX_0F16 */
42903f7f 3605 {
7531c613
JB
3606 { MOD_TABLE (MOD_VEX_0F16_PREFIX_0) },
3607 { "vmovshdup", { XM, EXx }, 0 },
3608 { MOD_TABLE (MOD_VEX_0F16_PREFIX_2) },
5f754f58 3609 },
7c52e0e8 3610
592a252b 3611 /* PREFIX_VEX_0F2A */
5f754f58 3612 {
592d1631 3613 { Bad_Opcode },
b24d668c 3614 { "vcvtsi2ss{%LQ|}", { XMScalar, VexScalar, Edq }, 0 },
592d1631 3615 { Bad_Opcode },
b24d668c 3616 { "vcvtsi2sd{%LQ|}", { XMScalar, VexScalar, Edq }, 0 },
5f754f58 3617 },
7c52e0e8 3618
592a252b 3619 /* PREFIX_VEX_0F2C */
5f754f58 3620 {
592d1631 3621 { Bad_Opcode },
17d3c7ec 3622 { "vcvttss2si", { Gdq, EXxmm_md, EXxEVexS }, 0 },
592d1631 3623 { Bad_Opcode },
17d3c7ec 3624 { "vcvttsd2si", { Gdq, EXxmm_mq, EXxEVexS }, 0 },
5f754f58 3625 },
7c52e0e8 3626
592a252b 3627 /* PREFIX_VEX_0F2D */
7c52e0e8 3628 {
592d1631 3629 { Bad_Opcode },
17d3c7ec 3630 { "vcvtss2si", { Gdq, EXxmm_md, EXxEVexR }, 0 },
592d1631 3631 { Bad_Opcode },
17d3c7ec 3632 { "vcvtsd2si", { Gdq, EXxmm_mq, EXxEVexR }, 0 },
7c52e0e8
L
3633 },
3634
592a252b 3635 /* PREFIX_VEX_0F2E */
7c52e0e8 3636 {
17d3c7ec 3637 { "vucomisX", { XMScalar, EXxmm_md, EXxEVexS }, PREFIX_OPCODE },
592d1631 3638 { Bad_Opcode },
17d3c7ec 3639 { "vucomisX", { XMScalar, EXxmm_mq, EXxEVexS }, PREFIX_OPCODE },
7c52e0e8
L
3640 },
3641
592a252b 3642 /* PREFIX_VEX_0F2F */
7c52e0e8 3643 {
17d3c7ec 3644 { "vcomisX", { XMScalar, EXxmm_md, EXxEVexS }, PREFIX_OPCODE },
592d1631 3645 { Bad_Opcode },
17d3c7ec 3646 { "vcomisX", { XMScalar, EXxmm_mq, EXxEVexS }, PREFIX_OPCODE },
7c52e0e8
L
3647 },
3648
43234a1e
L
3649 /* PREFIX_VEX_0F41 */
3650 {
3651 { VEX_LEN_TABLE (VEX_LEN_0F41_P_0) },
1ba585e8
IT
3652 { Bad_Opcode },
3653 { VEX_LEN_TABLE (VEX_LEN_0F41_P_2) },
43234a1e
L
3654 },
3655
3656 /* PREFIX_VEX_0F42 */
3657 {
3658 { VEX_LEN_TABLE (VEX_LEN_0F42_P_0) },
1ba585e8
IT
3659 { Bad_Opcode },
3660 { VEX_LEN_TABLE (VEX_LEN_0F42_P_2) },
43234a1e
L
3661 },
3662
7531c613 3663 /* PREFIX_VEX_0F44 */
c0f3af97 3664 {
7531c613 3665 { VEX_LEN_TABLE (VEX_LEN_0F44_P_0) },
592d1631 3666 { Bad_Opcode },
7531c613 3667 { VEX_LEN_TABLE (VEX_LEN_0F44_P_2) },
c0f3af97
L
3668 },
3669
7531c613 3670 /* PREFIX_VEX_0F45 */
0bfee649 3671 {
7531c613 3672 { VEX_LEN_TABLE (VEX_LEN_0F45_P_0) },
592d1631 3673 { Bad_Opcode },
7531c613 3674 { VEX_LEN_TABLE (VEX_LEN_0F45_P_2) },
0bfee649
L
3675 },
3676
7531c613 3677 /* PREFIX_VEX_0F46 */
43234a1e 3678 {
7531c613 3679 { VEX_LEN_TABLE (VEX_LEN_0F46_P_0) },
43234a1e 3680 { Bad_Opcode },
7531c613 3681 { VEX_LEN_TABLE (VEX_LEN_0F46_P_2) },
43234a1e
L
3682 },
3683
7531c613 3684 /* PREFIX_VEX_0F47 */
1ba585e8 3685 {
7531c613 3686 { VEX_LEN_TABLE (VEX_LEN_0F47_P_0) },
1ba585e8 3687 { Bad_Opcode },
7531c613 3688 { VEX_LEN_TABLE (VEX_LEN_0F47_P_2) },
1ba585e8
IT
3689 },
3690
7531c613 3691 /* PREFIX_VEX_0F4A */
43234a1e 3692 {
7531c613 3693 { VEX_LEN_TABLE (VEX_LEN_0F4A_P_0) },
43234a1e 3694 { Bad_Opcode },
7531c613 3695 { VEX_LEN_TABLE (VEX_LEN_0F4A_P_2) },
43234a1e
L
3696 },
3697
7531c613 3698 /* PREFIX_VEX_0F4B */
1ba585e8 3699 {
7531c613 3700 { VEX_LEN_TABLE (VEX_LEN_0F4B_P_0) },
1ba585e8 3701 { Bad_Opcode },
7531c613 3702 { VEX_LEN_TABLE (VEX_LEN_0F4B_P_2) },
1ba585e8
IT
3703 },
3704
7531c613 3705 /* PREFIX_VEX_0F51 */
6c30d220 3706 {
7531c613
JB
3707 { "vsqrtps", { XM, EXx }, 0 },
3708 { "vsqrtss", { XMScalar, VexScalar, EXxmm_md }, 0 },
3709 { "vsqrtpd", { XM, EXx }, 0 },
3710 { "vsqrtsd", { XMScalar, VexScalar, EXxmm_mq }, 0 },
6c30d220
L
3711 },
3712
7531c613 3713 /* PREFIX_VEX_0F52 */
6c30d220 3714 {
7531c613
JB
3715 { "vrsqrtps", { XM, EXx }, 0 },
3716 { "vrsqrtss", { XMScalar, VexScalar, EXxmm_md }, 0 },
6c30d220
L
3717 },
3718
7531c613 3719 /* PREFIX_VEX_0F53 */
c0f3af97 3720 {
7531c613
JB
3721 { "vrcpps", { XM, EXx }, 0 },
3722 { "vrcpss", { XMScalar, VexScalar, EXxmm_md }, 0 },
c0f3af97
L
3723 },
3724
7531c613 3725 /* PREFIX_VEX_0F58 */
c0f3af97 3726 {
7531c613
JB
3727 { "vaddps", { XM, Vex, EXx }, 0 },
3728 { "vaddss", { XMScalar, VexScalar, EXxmm_md }, 0 },
3729 { "vaddpd", { XM, Vex, EXx }, 0 },
3730 { "vaddsd", { XMScalar, VexScalar, EXxmm_mq }, 0 },
c0f3af97
L
3731 },
3732
7531c613 3733 /* PREFIX_VEX_0F59 */
c0f3af97 3734 {
7531c613
JB
3735 { "vmulps", { XM, Vex, EXx }, 0 },
3736 { "vmulss", { XMScalar, VexScalar, EXxmm_md }, 0 },
3737 { "vmulpd", { XM, Vex, EXx }, 0 },
3738 { "vmulsd", { XMScalar, VexScalar, EXxmm_mq }, 0 },
c0f3af97
L
3739 },
3740
7531c613 3741 /* PREFIX_VEX_0F5A */
ce2f5b3c 3742 {
7531c613
JB
3743 { "vcvtps2pd", { XM, EXxmmq }, 0 },
3744 { "vcvtss2sd", { XMScalar, VexScalar, EXxmm_md }, 0 },
3745 { "vcvtpd2ps%XY",{ XMM, EXx }, 0 },
3746 { "vcvtsd2ss", { XMScalar, VexScalar, EXxmm_mq }, 0 },
ce2f5b3c
L
3747 },
3748
7531c613 3749 /* PREFIX_VEX_0F5B */
6c30d220 3750 {
7531c613
JB
3751 { "vcvtdq2ps", { XM, EXx }, 0 },
3752 { "vcvttps2dq", { XM, EXx }, 0 },
3753 { "vcvtps2dq", { XM, EXx }, 0 },
6c30d220
L
3754 },
3755
7531c613 3756 /* PREFIX_VEX_0F5C */
a683cc34 3757 {
7531c613
JB
3758 { "vsubps", { XM, Vex, EXx }, 0 },
3759 { "vsubss", { XMScalar, VexScalar, EXxmm_md }, 0 },
3760 { "vsubpd", { XM, Vex, EXx }, 0 },
3761 { "vsubsd", { XMScalar, VexScalar, EXxmm_mq }, 0 },
a683cc34
SP
3762 },
3763
7531c613 3764 /* PREFIX_VEX_0F5D */
a683cc34 3765 {
7531c613
JB
3766 { "vminps", { XM, Vex, EXx }, 0 },
3767 { "vminss", { XMScalar, VexScalar, EXxmm_md }, 0 },
3768 { "vminpd", { XM, Vex, EXx }, 0 },
3769 { "vminsd", { XMScalar, VexScalar, EXxmm_mq }, 0 },
a683cc34
SP
3770 },
3771
7531c613 3772 /* PREFIX_VEX_0F5E */
c0f3af97 3773 {
7531c613
JB
3774 { "vdivps", { XM, Vex, EXx }, 0 },
3775 { "vdivss", { XMScalar, VexScalar, EXxmm_md }, 0 },
3776 { "vdivpd", { XM, Vex, EXx }, 0 },
3777 { "vdivsd", { XMScalar, VexScalar, EXxmm_mq }, 0 },
c0f3af97
L
3778 },
3779
7531c613 3780 /* PREFIX_VEX_0F5F */
c0f3af97 3781 {
7531c613
JB
3782 { "vmaxps", { XM, Vex, EXx }, 0 },
3783 { "vmaxss", { XMScalar, VexScalar, EXxmm_md }, 0 },
3784 { "vmaxpd", { XM, Vex, EXx }, 0 },
3785 { "vmaxsd", { XMScalar, VexScalar, EXxmm_mq }, 0 },
c0f3af97
L
3786 },
3787
7531c613 3788 /* PREFIX_VEX_0F6F */
c0f3af97 3789 {
592d1631 3790 { Bad_Opcode },
7531c613
JB
3791 { "vmovdqu", { XM, EXx }, 0 },
3792 { "vmovdqa", { XM, EXx }, 0 },
c0f3af97
L
3793 },
3794
7531c613 3795 /* PREFIX_VEX_0F70 */
922d8de8 3796 {
592d1631 3797 { Bad_Opcode },
7531c613
JB
3798 { "vpshufhw", { XM, EXx, Ib }, 0 },
3799 { "vpshufd", { XM, EXx, Ib }, 0 },
3800 { "vpshuflw", { XM, EXx, Ib }, 0 },
922d8de8
DR
3801 },
3802
7531c613 3803 /* PREFIX_VEX_0F7C */
922d8de8 3804 {
592d1631
L
3805 { Bad_Opcode },
3806 { Bad_Opcode },
7531c613
JB
3807 { "vhaddpd", { XM, Vex, EXx }, 0 },
3808 { "vhaddps", { XM, Vex, EXx }, 0 },
922d8de8
DR
3809 },
3810
7531c613 3811 /* PREFIX_VEX_0F7D */
922d8de8 3812 {
592d1631
L
3813 { Bad_Opcode },
3814 { Bad_Opcode },
7531c613
JB
3815 { "vhsubpd", { XM, Vex, EXx }, 0 },
3816 { "vhsubps", { XM, Vex, EXx }, 0 },
922d8de8
DR
3817 },
3818
7531c613 3819 /* PREFIX_VEX_0F7E */
c0f3af97 3820 {
592d1631 3821 { Bad_Opcode },
7531c613
JB
3822 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_1) },
3823 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_2) },
c0f3af97
L
3824 },
3825
7531c613 3826 /* PREFIX_VEX_0F7F */
c0f3af97 3827 {
592d1631 3828 { Bad_Opcode },
7531c613
JB
3829 { "vmovdqu", { EXxS, XM }, 0 },
3830 { "vmovdqa", { EXxS, XM }, 0 },
c0f3af97
L
3831 },
3832
7531c613 3833 /* PREFIX_VEX_0F90 */
c0f3af97 3834 {
7531c613 3835 { VEX_LEN_TABLE (VEX_LEN_0F90_P_0) },
592d1631 3836 { Bad_Opcode },
7531c613 3837 { VEX_LEN_TABLE (VEX_LEN_0F90_P_2) },
c0f3af97
L
3838 },
3839
7531c613 3840 /* PREFIX_VEX_0F91 */
c0f3af97 3841 {
7531c613 3842 { VEX_LEN_TABLE (VEX_LEN_0F91_P_0) },
592d1631 3843 { Bad_Opcode },
7531c613 3844 { VEX_LEN_TABLE (VEX_LEN_0F91_P_2) },
c0f3af97 3845 },
a5ff0eb2 3846
7531c613 3847 /* PREFIX_VEX_0F92 */
922d8de8 3848 {
7531c613 3849 { VEX_LEN_TABLE (VEX_LEN_0F92_P_0) },
592d1631 3850 { Bad_Opcode },
7531c613
JB
3851 { VEX_LEN_TABLE (VEX_LEN_0F92_P_2) },
3852 { VEX_LEN_TABLE (VEX_LEN_0F92_P_3) },
922d8de8
DR
3853 },
3854
7531c613 3855 /* PREFIX_VEX_0F93 */
922d8de8 3856 {
7531c613 3857 { VEX_LEN_TABLE (VEX_LEN_0F93_P_0) },
592d1631 3858 { Bad_Opcode },
7531c613
JB
3859 { VEX_LEN_TABLE (VEX_LEN_0F93_P_2) },
3860 { VEX_LEN_TABLE (VEX_LEN_0F93_P_3) },
922d8de8
DR
3861 },
3862
7531c613 3863 /* PREFIX_VEX_0F98 */
922d8de8 3864 {
7531c613 3865 { VEX_LEN_TABLE (VEX_LEN_0F98_P_0) },
592d1631 3866 { Bad_Opcode },
7531c613 3867 { VEX_LEN_TABLE (VEX_LEN_0F98_P_2) },
922d8de8
DR
3868 },
3869
7531c613 3870 /* PREFIX_VEX_0F99 */
922d8de8 3871 {
7531c613 3872 { VEX_LEN_TABLE (VEX_LEN_0F99_P_0) },
592d1631 3873 { Bad_Opcode },
7531c613 3874 { VEX_LEN_TABLE (VEX_LEN_0F99_P_2) },
922d8de8
DR
3875 },
3876
7531c613 3877 /* PREFIX_VEX_0FC2 */
922d8de8 3878 {
7531c613
JB
3879 { "vcmpps", { XM, Vex, EXx, CMP }, 0 },
3880 { "vcmpss", { XMScalar, VexScalar, EXxmm_md, CMP }, 0 },
3881 { "vcmppd", { XM, Vex, EXx, CMP }, 0 },
3882 { "vcmpsd", { XMScalar, VexScalar, EXxmm_mq, CMP }, 0 },
922d8de8
DR
3883 },
3884
7531c613 3885 /* PREFIX_VEX_0FD0 */
922d8de8 3886 {
592d1631
L
3887 { Bad_Opcode },
3888 { Bad_Opcode },
7531c613
JB
3889 { "vaddsubpd", { XM, Vex, EXx }, 0 },
3890 { "vaddsubps", { XM, Vex, EXx }, 0 },
922d8de8
DR
3891 },
3892
7531c613 3893 /* PREFIX_VEX_0FE6 */
922d8de8 3894 {
592d1631 3895 { Bad_Opcode },
7531c613
JB
3896 { "vcvtdq2pd", { XM, EXxmmq }, 0 },
3897 { "vcvttpd2dq%XY", { XMM, EXx }, 0 },
3898 { "vcvtpd2dq%XY", { XMM, EXx }, 0 },
922d8de8
DR
3899 },
3900
7531c613 3901 /* PREFIX_VEX_0FF0 */
922d8de8 3902 {
592d1631
L
3903 { Bad_Opcode },
3904 { Bad_Opcode },
7531c613
JB
3905 { Bad_Opcode },
3906 { MOD_TABLE (MOD_VEX_0FF0_PREFIX_3) },
922d8de8
DR
3907 },
3908
7531c613 3909 /* PREFIX_VEX_0F3849_X86_64 */
922d8de8 3910 {
7531c613 3911 { VEX_W_TABLE (VEX_W_0F3849_X86_64_P_0) },
592d1631 3912 { Bad_Opcode },
7531c613
JB
3913 { VEX_W_TABLE (VEX_W_0F3849_X86_64_P_2) },
3914 { VEX_W_TABLE (VEX_W_0F3849_X86_64_P_3) },
922d8de8
DR
3915 },
3916
7531c613 3917 /* PREFIX_VEX_0F384B_X86_64 */
922d8de8 3918 {
592d1631 3919 { Bad_Opcode },
7531c613
JB
3920 { VEX_W_TABLE (VEX_W_0F384B_X86_64_P_1) },
3921 { VEX_W_TABLE (VEX_W_0F384B_X86_64_P_2) },
3922 { VEX_W_TABLE (VEX_W_0F384B_X86_64_P_3) },
922d8de8
DR
3923 },
3924
7531c613 3925 /* PREFIX_VEX_0F385C_X86_64 */
922d8de8 3926 {
592d1631 3927 { Bad_Opcode },
7531c613 3928 { VEX_W_TABLE (VEX_W_0F385C_X86_64_P_1) },
592d1631 3929 { Bad_Opcode },
922d8de8
DR
3930 },
3931
7531c613 3932 /* PREFIX_VEX_0F385E_X86_64 */
922d8de8 3933 {
7531c613
JB
3934 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_0) },
3935 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_1) },
3936 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_2) },
3937 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_3) },
922d8de8
DR
3938 },
3939
7531c613 3940 /* PREFIX_VEX_0F38F5 */
48521003 3941 {
7531c613
JB
3942 { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_0) },
3943 { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_1) },
48521003 3944 { Bad_Opcode },
7531c613 3945 { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_3) },
48521003
IT
3946 },
3947
7531c613 3948 /* PREFIX_VEX_0F38F6 */
48521003
IT
3949 {
3950 { Bad_Opcode },
3951 { Bad_Opcode },
7531c613
JB
3952 { Bad_Opcode },
3953 { VEX_LEN_TABLE (VEX_LEN_0F38F6_P_3) },
48521003
IT
3954 },
3955
7531c613 3956 /* PREFIX_VEX_0F38F7 */
a5ff0eb2 3957 {
7531c613
JB
3958 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_0) },
3959 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_1) },
3960 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_2) },
3961 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_3) },
a5ff0eb2 3962 },
6c30d220
L
3963
3964 /* PREFIX_VEX_0F3AF0 */
3965 {
3966 { Bad_Opcode },
3967 { Bad_Opcode },
3968 { Bad_Opcode },
3969 { VEX_LEN_TABLE (VEX_LEN_0F3AF0_P_3) },
3970 },
43234a1e 3971
ad692897 3972#include "i386-dis-evex-prefix.h"
c0f3af97
L
3973};
3974
3975static const struct dis386 x86_64_table[][2] = {
3976 /* X86_64_06 */
3977 {
bf890a93 3978 { "pushP", { es }, 0 },
c0f3af97
L
3979 },
3980
3981 /* X86_64_07 */
3982 {
bf890a93 3983 { "popP", { es }, 0 },
c0f3af97
L
3984 },
3985
1673df32 3986 /* X86_64_0E */
c0f3af97 3987 {
bf890a93 3988 { "pushP", { cs }, 0 },
c0f3af97
L
3989 },
3990
3991 /* X86_64_16 */
3992 {
bf890a93 3993 { "pushP", { ss }, 0 },
c0f3af97
L
3994 },
3995
3996 /* X86_64_17 */
3997 {
bf890a93 3998 { "popP", { ss }, 0 },
c0f3af97
L
3999 },
4000
4001 /* X86_64_1E */
4002 {
bf890a93 4003 { "pushP", { ds }, 0 },
c0f3af97
L
4004 },
4005
4006 /* X86_64_1F */
4007 {
bf890a93 4008 { "popP", { ds }, 0 },
c0f3af97
L
4009 },
4010
4011 /* X86_64_27 */
4012 {
bf890a93 4013 { "daa", { XX }, 0 },
c0f3af97
L
4014 },
4015
4016 /* X86_64_2F */
4017 {
bf890a93 4018 { "das", { XX }, 0 },
c0f3af97
L
4019 },
4020
4021 /* X86_64_37 */
4022 {
bf890a93 4023 { "aaa", { XX }, 0 },
c0f3af97
L
4024 },
4025
4026 /* X86_64_3F */
4027 {
bf890a93 4028 { "aas", { XX }, 0 },
c0f3af97
L
4029 },
4030
4031 /* X86_64_60 */
4032 {
bf890a93 4033 { "pushaP", { XX }, 0 },
c0f3af97
L
4034 },
4035
4036 /* X86_64_61 */
4037 {
bf890a93 4038 { "popaP", { XX }, 0 },
c0f3af97
L
4039 },
4040
4041 /* X86_64_62 */
4042 {
4043 { MOD_TABLE (MOD_62_32BIT) },
43234a1e 4044 { EVEX_TABLE (EVEX_0F) },
c0f3af97
L
4045 },
4046
4047 /* X86_64_63 */
4048 {
bf890a93 4049 { "arpl", { Ew, Gw }, 0 },
bc31405e 4050 { "movs", { { OP_G, movsxd_mode }, { MOVSXD_Fixup, movsxd_mode } }, 0 },
c0f3af97
L
4051 },
4052
4053 /* X86_64_6D */
4054 {
bf890a93
IT
4055 { "ins{R|}", { Yzr, indirDX }, 0 },
4056 { "ins{G|}", { Yzr, indirDX }, 0 },
c0f3af97
L
4057 },
4058
4059 /* X86_64_6F */
4060 {
bf890a93
IT
4061 { "outs{R|}", { indirDXr, Xz }, 0 },
4062 { "outs{G|}", { indirDXr, Xz }, 0 },
c0f3af97
L
4063 },
4064
d039fef3 4065 /* X86_64_82 */
8b89fe14 4066 {
de194d85 4067 /* Opcode 0x82 is an alias of opcode 0x80 in 32-bit mode. */
d039fef3 4068 { REG_TABLE (REG_80) },
8b89fe14
L
4069 },
4070
c0f3af97
L
4071 /* X86_64_9A */
4072 {
8f570d62 4073 { "{l|}call{T|}", { Ap }, 0 },
c0f3af97
L
4074 },
4075
aeab2b26
JB
4076 /* X86_64_C2 */
4077 {
4078 { "retP", { Iw, BND }, 0 },
4079 { "ret@", { Iw, BND }, 0 },
4080 },
4081
4082 /* X86_64_C3 */
4083 {
4084 { "retP", { BND }, 0 },
4085 { "ret@", { BND }, 0 },
4086 },
4087
c0f3af97
L
4088 /* X86_64_C4 */
4089 {
4090 { MOD_TABLE (MOD_C4_32BIT) },
4091 { VEX_C4_TABLE (VEX_0F) },
4092 },
4093
4094 /* X86_64_C5 */
4095 {
4096 { MOD_TABLE (MOD_C5_32BIT) },
4097 { VEX_C5_TABLE (VEX_0F) },
4098 },
4099
4100 /* X86_64_CE */
4101 {
bf890a93 4102 { "into", { XX }, 0 },
c0f3af97
L
4103 },
4104
4105 /* X86_64_D4 */
4106 {
bf890a93 4107 { "aam", { Ib }, 0 },
c0f3af97
L
4108 },
4109
4110 /* X86_64_D5 */
4111 {
bf890a93 4112 { "aad", { Ib }, 0 },
c0f3af97
L
4113 },
4114
a72d2af2
L
4115 /* X86_64_E8 */
4116 {
4117 { "callP", { Jv, BND }, 0 },
5db04b09 4118 { "call@", { Jv, BND }, 0 }
a72d2af2
L
4119 },
4120
4121 /* X86_64_E9 */
4122 {
4123 { "jmpP", { Jv, BND }, 0 },
5db04b09 4124 { "jmp@", { Jv, BND }, 0 }
a72d2af2
L
4125 },
4126
c0f3af97
L
4127 /* X86_64_EA */
4128 {
8f570d62 4129 { "{l|}jmp{T|}", { Ap }, 0 },
c0f3af97
L
4130 },
4131
4132 /* X86_64_0F01_REG_0 */
4133 {
d1c36125 4134 { "sgdt{Q|Q}", { M }, 0 },
bf890a93 4135 { "sgdt", { M }, 0 },
c0f3af97
L
4136 },
4137
4138 /* X86_64_0F01_REG_1 */
4139 {
d1c36125 4140 { "sidt{Q|Q}", { M }, 0 },
bf890a93 4141 { "sidt", { M }, 0 },
c0f3af97
L
4142 },
4143
4144 /* X86_64_0F01_REG_2 */
4145 {
bf890a93
IT
4146 { "lgdt{Q|Q}", { M }, 0 },
4147 { "lgdt", { M }, 0 },
c0f3af97
L
4148 },
4149
4150 /* X86_64_0F01_REG_3 */
4151 {
bf890a93
IT
4152 { "lidt{Q|Q}", { M }, 0 },
4153 { "lidt", { M }, 0 },
c0f3af97 4154 },
260cd341
LC
4155
4156 /* X86_64_VEX_0F3849 */
4157 {
4158 { Bad_Opcode },
4159 { PREFIX_TABLE (PREFIX_VEX_0F3849_X86_64) },
4160 },
4161
4162 /* X86_64_VEX_0F384B */
4163 {
4164 { Bad_Opcode },
4165 { PREFIX_TABLE (PREFIX_VEX_0F384B_X86_64) },
4166 },
4167
4168 /* X86_64_VEX_0F385C */
4169 {
4170 { Bad_Opcode },
4171 { PREFIX_TABLE (PREFIX_VEX_0F385C_X86_64) },
4172 },
4173
4174 /* X86_64_VEX_0F385E */
4175 {
4176 { Bad_Opcode },
4177 { PREFIX_TABLE (PREFIX_VEX_0F385E_X86_64) },
4178 },
c0f3af97
L
4179};
4180
4181static const struct dis386 three_byte_table[][256] = {
c1e679ec
DR
4182
4183 /* THREE_BYTE_0F38 */
c0f3af97
L
4184 {
4185 /* 00 */
507bd325
L
4186 { "pshufb", { MX, EM }, PREFIX_OPCODE },
4187 { "phaddw", { MX, EM }, PREFIX_OPCODE },
4188 { "phaddd", { MX, EM }, PREFIX_OPCODE },
4189 { "phaddsw", { MX, EM }, PREFIX_OPCODE },
4190 { "pmaddubsw", { MX, EM }, PREFIX_OPCODE },
4191 { "phsubw", { MX, EM }, PREFIX_OPCODE },
4192 { "phsubd", { MX, EM }, PREFIX_OPCODE },
4193 { "phsubsw", { MX, EM }, PREFIX_OPCODE },
c0f3af97 4194 /* 08 */
507bd325
L
4195 { "psignb", { MX, EM }, PREFIX_OPCODE },
4196 { "psignw", { MX, EM }, PREFIX_OPCODE },
4197 { "psignd", { MX, EM }, PREFIX_OPCODE },
4198 { "pmulhrsw", { MX, EM }, PREFIX_OPCODE },
592d1631
L
4199 { Bad_Opcode },
4200 { Bad_Opcode },
4201 { Bad_Opcode },
4202 { Bad_Opcode },
f88c9eb0 4203 /* 10 */
7531c613 4204 { "pblendvb", { XM, EXx, XMM0 }, PREFIX_DATA },
592d1631
L
4205 { Bad_Opcode },
4206 { Bad_Opcode },
4207 { Bad_Opcode },
7531c613
JB
4208 { "blendvps", { XM, EXx, XMM0 }, PREFIX_DATA },
4209 { "blendvpd", { XM, EXx, XMM0 }, PREFIX_DATA },
592d1631 4210 { Bad_Opcode },
7531c613 4211 { "ptest", { XM, EXx }, PREFIX_DATA },
f88c9eb0 4212 /* 18 */
592d1631
L
4213 { Bad_Opcode },
4214 { Bad_Opcode },
4215 { Bad_Opcode },
4216 { Bad_Opcode },
507bd325
L
4217 { "pabsb", { MX, EM }, PREFIX_OPCODE },
4218 { "pabsw", { MX, EM }, PREFIX_OPCODE },
4219 { "pabsd", { MX, EM }, PREFIX_OPCODE },
592d1631 4220 { Bad_Opcode },
f88c9eb0 4221 /* 20 */
7531c613
JB
4222 { "pmovsxbw", { XM, EXq }, PREFIX_DATA },
4223 { "pmovsxbd", { XM, EXd }, PREFIX_DATA },
4224 { "pmovsxbq", { XM, EXw }, PREFIX_DATA },
4225 { "pmovsxwd", { XM, EXq }, PREFIX_DATA },
4226 { "pmovsxwq", { XM, EXd }, PREFIX_DATA },
4227 { "pmovsxdq", { XM, EXq }, PREFIX_DATA },
592d1631
L
4228 { Bad_Opcode },
4229 { Bad_Opcode },
f88c9eb0 4230 /* 28 */
7531c613
JB
4231 { "pmuldq", { XM, EXx }, PREFIX_DATA },
4232 { "pcmpeqq", { XM, EXx }, PREFIX_DATA },
4233 { MOD_TABLE (MOD_0F382A) },
4234 { "packusdw", { XM, EXx }, PREFIX_DATA },
592d1631
L
4235 { Bad_Opcode },
4236 { Bad_Opcode },
4237 { Bad_Opcode },
4238 { Bad_Opcode },
f88c9eb0 4239 /* 30 */
7531c613
JB
4240 { "pmovzxbw", { XM, EXq }, PREFIX_DATA },
4241 { "pmovzxbd", { XM, EXd }, PREFIX_DATA },
4242 { "pmovzxbq", { XM, EXw }, PREFIX_DATA },
4243 { "pmovzxwd", { XM, EXq }, PREFIX_DATA },
4244 { "pmovzxwq", { XM, EXd }, PREFIX_DATA },
4245 { "pmovzxdq", { XM, EXq }, PREFIX_DATA },
4246 { Bad_Opcode },
4247 { "pcmpgtq", { XM, EXx }, PREFIX_DATA },
f88c9eb0 4248 /* 38 */
7531c613
JB
4249 { "pminsb", { XM, EXx }, PREFIX_DATA },
4250 { "pminsd", { XM, EXx }, PREFIX_DATA },
4251 { "pminuw", { XM, EXx }, PREFIX_DATA },
4252 { "pminud", { XM, EXx }, PREFIX_DATA },
4253 { "pmaxsb", { XM, EXx }, PREFIX_DATA },
4254 { "pmaxsd", { XM, EXx }, PREFIX_DATA },
4255 { "pmaxuw", { XM, EXx }, PREFIX_DATA },
4256 { "pmaxud", { XM, EXx }, PREFIX_DATA },
f88c9eb0 4257 /* 40 */
7531c613
JB
4258 { "pmulld", { XM, EXx }, PREFIX_DATA },
4259 { "phminposuw", { XM, EXx }, PREFIX_DATA },
592d1631
L
4260 { Bad_Opcode },
4261 { Bad_Opcode },
4262 { Bad_Opcode },
4263 { Bad_Opcode },
4264 { Bad_Opcode },
4265 { Bad_Opcode },
f88c9eb0 4266 /* 48 */
592d1631
L
4267 { Bad_Opcode },
4268 { Bad_Opcode },
4269 { Bad_Opcode },
4270 { Bad_Opcode },
4271 { Bad_Opcode },
4272 { Bad_Opcode },
4273 { Bad_Opcode },
4274 { Bad_Opcode },
f88c9eb0 4275 /* 50 */
592d1631
L
4276 { Bad_Opcode },
4277 { Bad_Opcode },
4278 { Bad_Opcode },
4279 { Bad_Opcode },
4280 { Bad_Opcode },
4281 { Bad_Opcode },
4282 { Bad_Opcode },
4283 { Bad_Opcode },
f88c9eb0 4284 /* 58 */
592d1631
L
4285 { Bad_Opcode },
4286 { Bad_Opcode },
4287 { Bad_Opcode },
4288 { Bad_Opcode },
4289 { Bad_Opcode },
4290 { Bad_Opcode },
4291 { Bad_Opcode },
4292 { Bad_Opcode },
f88c9eb0 4293 /* 60 */
592d1631
L
4294 { Bad_Opcode },
4295 { Bad_Opcode },
4296 { Bad_Opcode },
4297 { Bad_Opcode },
4298 { Bad_Opcode },
4299 { Bad_Opcode },
4300 { Bad_Opcode },
4301 { Bad_Opcode },
f88c9eb0 4302 /* 68 */
592d1631
L
4303 { Bad_Opcode },
4304 { Bad_Opcode },
4305 { Bad_Opcode },
4306 { Bad_Opcode },
4307 { Bad_Opcode },
4308 { Bad_Opcode },
4309 { Bad_Opcode },
4310 { Bad_Opcode },
f88c9eb0 4311 /* 70 */
592d1631
L
4312 { Bad_Opcode },
4313 { Bad_Opcode },
4314 { Bad_Opcode },
4315 { Bad_Opcode },
4316 { Bad_Opcode },
4317 { Bad_Opcode },
4318 { Bad_Opcode },
4319 { Bad_Opcode },
f88c9eb0 4320 /* 78 */
592d1631
L
4321 { Bad_Opcode },
4322 { Bad_Opcode },
4323 { Bad_Opcode },
4324 { Bad_Opcode },
4325 { Bad_Opcode },
4326 { Bad_Opcode },
4327 { Bad_Opcode },
4328 { Bad_Opcode },
f88c9eb0 4329 /* 80 */
7531c613
JB
4330 { "invept", { Gm, Mo }, PREFIX_DATA },
4331 { "invvpid", { Gm, Mo }, PREFIX_DATA },
4332 { "invpcid", { Gm, M }, PREFIX_DATA },
592d1631
L
4333 { Bad_Opcode },
4334 { Bad_Opcode },
4335 { Bad_Opcode },
4336 { Bad_Opcode },
4337 { Bad_Opcode },
f88c9eb0 4338 /* 88 */
592d1631
L
4339 { Bad_Opcode },
4340 { Bad_Opcode },
4341 { Bad_Opcode },
4342 { Bad_Opcode },
4343 { Bad_Opcode },
4344 { Bad_Opcode },
4345 { Bad_Opcode },
4346 { Bad_Opcode },
f88c9eb0 4347 /* 90 */
592d1631
L
4348 { Bad_Opcode },
4349 { Bad_Opcode },
4350 { Bad_Opcode },
4351 { Bad_Opcode },
4352 { Bad_Opcode },
4353 { Bad_Opcode },
4354 { Bad_Opcode },
4355 { Bad_Opcode },
f88c9eb0 4356 /* 98 */
592d1631
L
4357 { Bad_Opcode },
4358 { Bad_Opcode },
4359 { Bad_Opcode },
4360 { Bad_Opcode },
4361 { Bad_Opcode },
4362 { Bad_Opcode },
4363 { Bad_Opcode },
4364 { Bad_Opcode },
f88c9eb0 4365 /* a0 */
592d1631
L
4366 { Bad_Opcode },
4367 { Bad_Opcode },
4368 { Bad_Opcode },
4369 { Bad_Opcode },
4370 { Bad_Opcode },
4371 { Bad_Opcode },
4372 { Bad_Opcode },
4373 { Bad_Opcode },
f88c9eb0 4374 /* a8 */
592d1631
L
4375 { Bad_Opcode },
4376 { Bad_Opcode },
4377 { Bad_Opcode },
4378 { Bad_Opcode },
4379 { Bad_Opcode },
4380 { Bad_Opcode },
4381 { Bad_Opcode },
4382 { Bad_Opcode },
f88c9eb0 4383 /* b0 */
592d1631
L
4384 { Bad_Opcode },
4385 { Bad_Opcode },
4386 { Bad_Opcode },
4387 { Bad_Opcode },
4388 { Bad_Opcode },
4389 { Bad_Opcode },
4390 { Bad_Opcode },
4391 { Bad_Opcode },
f88c9eb0 4392 /* b8 */
592d1631
L
4393 { Bad_Opcode },
4394 { Bad_Opcode },
4395 { Bad_Opcode },
4396 { Bad_Opcode },
4397 { Bad_Opcode },
4398 { Bad_Opcode },
4399 { Bad_Opcode },
4400 { Bad_Opcode },
f88c9eb0 4401 /* c0 */
592d1631
L
4402 { Bad_Opcode },
4403 { Bad_Opcode },
4404 { Bad_Opcode },
4405 { Bad_Opcode },
4406 { Bad_Opcode },
4407 { Bad_Opcode },
4408 { Bad_Opcode },
4409 { Bad_Opcode },
f88c9eb0 4410 /* c8 */
035e7389
JB
4411 { "sha1nexte", { XM, EXxmm }, PREFIX_OPCODE },
4412 { "sha1msg1", { XM, EXxmm }, PREFIX_OPCODE },
4413 { "sha1msg2", { XM, EXxmm }, PREFIX_OPCODE },
4414 { "sha256rnds2", { XM, EXxmm, XMM0 }, PREFIX_OPCODE },
4415 { "sha256msg1", { XM, EXxmm }, PREFIX_OPCODE },
4416 { "sha256msg2", { XM, EXxmm }, PREFIX_OPCODE },
592d1631 4417 { Bad_Opcode },
7531c613 4418 { "gf2p8mulb", { XM, EXxmm }, PREFIX_DATA },
f88c9eb0 4419 /* d0 */
592d1631
L
4420 { Bad_Opcode },
4421 { Bad_Opcode },
4422 { Bad_Opcode },
4423 { Bad_Opcode },
4424 { Bad_Opcode },
4425 { Bad_Opcode },
4426 { Bad_Opcode },
4427 { Bad_Opcode },
f88c9eb0 4428 /* d8 */
592d1631
L
4429 { Bad_Opcode },
4430 { Bad_Opcode },
4431 { Bad_Opcode },
7531c613
JB
4432 { "aesimc", { XM, EXx }, PREFIX_DATA },
4433 { "aesenc", { XM, EXx }, PREFIX_DATA },
4434 { "aesenclast", { XM, EXx }, PREFIX_DATA },
4435 { "aesdec", { XM, EXx }, PREFIX_DATA },
4436 { "aesdeclast", { XM, EXx }, PREFIX_DATA },
f88c9eb0 4437 /* e0 */
592d1631
L
4438 { Bad_Opcode },
4439 { Bad_Opcode },
4440 { Bad_Opcode },
4441 { Bad_Opcode },
4442 { Bad_Opcode },
4443 { Bad_Opcode },
4444 { Bad_Opcode },
4445 { Bad_Opcode },
f88c9eb0 4446 /* e8 */
592d1631
L
4447 { Bad_Opcode },
4448 { Bad_Opcode },
4449 { Bad_Opcode },
4450 { Bad_Opcode },
4451 { Bad_Opcode },
4452 { Bad_Opcode },
4453 { Bad_Opcode },
4454 { Bad_Opcode },
f88c9eb0
SP
4455 /* f0 */
4456 { PREFIX_TABLE (PREFIX_0F38F0) },
4457 { PREFIX_TABLE (PREFIX_0F38F1) },
592d1631
L
4458 { Bad_Opcode },
4459 { Bad_Opcode },
4460 { Bad_Opcode },
7531c613 4461 { MOD_TABLE (MOD_0F38F5) },
e2e1fcde 4462 { PREFIX_TABLE (PREFIX_0F38F6) },
592d1631 4463 { Bad_Opcode },
f88c9eb0 4464 /* f8 */
c0a30a9f 4465 { PREFIX_TABLE (PREFIX_0F38F8) },
035e7389 4466 { MOD_TABLE (MOD_0F38F9) },
592d1631
L
4467 { Bad_Opcode },
4468 { Bad_Opcode },
4469 { Bad_Opcode },
4470 { Bad_Opcode },
4471 { Bad_Opcode },
4472 { Bad_Opcode },
f88c9eb0
SP
4473 },
4474 /* THREE_BYTE_0F3A */
4475 {
4476 /* 00 */
592d1631
L
4477 { Bad_Opcode },
4478 { Bad_Opcode },
4479 { Bad_Opcode },
4480 { Bad_Opcode },
4481 { Bad_Opcode },
4482 { Bad_Opcode },
4483 { Bad_Opcode },
4484 { Bad_Opcode },
f88c9eb0 4485 /* 08 */
7531c613
JB
4486 { "roundps", { XM, EXx, Ib }, PREFIX_DATA },
4487 { "roundpd", { XM, EXx, Ib }, PREFIX_DATA },
4488 { "roundss", { XM, EXd, Ib }, PREFIX_DATA },
4489 { "roundsd", { XM, EXq, Ib }, PREFIX_DATA },
4490 { "blendps", { XM, EXx, Ib }, PREFIX_DATA },
4491 { "blendpd", { XM, EXx, Ib }, PREFIX_DATA },
4492 { "pblendw", { XM, EXx, Ib }, PREFIX_DATA },
507bd325 4493 { "palignr", { MX, EM, Ib }, PREFIX_OPCODE },
f88c9eb0 4494 /* 10 */
592d1631
L
4495 { Bad_Opcode },
4496 { Bad_Opcode },
4497 { Bad_Opcode },
4498 { Bad_Opcode },
7531c613
JB
4499 { "pextrb", { Edqb, XM, Ib }, PREFIX_DATA },
4500 { "pextrw", { Edqw, XM, Ib }, PREFIX_DATA },
4501 { "pextrK", { Edq, XM, Ib }, PREFIX_DATA },
4502 { "extractps", { Edqd, XM, Ib }, PREFIX_DATA },
f88c9eb0 4503 /* 18 */
592d1631
L
4504 { Bad_Opcode },
4505 { Bad_Opcode },
4506 { Bad_Opcode },
4507 { Bad_Opcode },
4508 { Bad_Opcode },
4509 { Bad_Opcode },
4510 { Bad_Opcode },
4511 { Bad_Opcode },
f88c9eb0 4512 /* 20 */
7531c613
JB
4513 { "pinsrb", { XM, Edqb, Ib }, PREFIX_DATA },
4514 { "insertps", { XM, EXd, Ib }, PREFIX_DATA },
4515 { "pinsrK", { XM, Edq, Ib }, PREFIX_DATA },
592d1631
L
4516 { Bad_Opcode },
4517 { Bad_Opcode },
4518 { Bad_Opcode },
4519 { Bad_Opcode },
4520 { Bad_Opcode },
f88c9eb0 4521 /* 28 */
592d1631
L
4522 { Bad_Opcode },
4523 { Bad_Opcode },
4524 { Bad_Opcode },
4525 { Bad_Opcode },
4526 { Bad_Opcode },
4527 { Bad_Opcode },
4528 { Bad_Opcode },
4529 { Bad_Opcode },
f88c9eb0 4530 /* 30 */
592d1631
L
4531 { Bad_Opcode },
4532 { Bad_Opcode },
4533 { Bad_Opcode },
4534 { Bad_Opcode },
4535 { Bad_Opcode },
4536 { Bad_Opcode },
4537 { Bad_Opcode },
4538 { Bad_Opcode },
f88c9eb0 4539 /* 38 */
592d1631
L
4540 { Bad_Opcode },
4541 { Bad_Opcode },
4542 { Bad_Opcode },
4543 { Bad_Opcode },
4544 { Bad_Opcode },
4545 { Bad_Opcode },
4546 { Bad_Opcode },
4547 { Bad_Opcode },
f88c9eb0 4548 /* 40 */
7531c613
JB
4549 { "dpps", { XM, EXx, Ib }, PREFIX_DATA },
4550 { "dppd", { XM, EXx, Ib }, PREFIX_DATA },
4551 { "mpsadbw", { XM, EXx, Ib }, PREFIX_DATA },
592d1631 4552 { Bad_Opcode },
7531c613 4553 { "pclmulqdq", { XM, EXx, PCLMUL }, PREFIX_DATA },
592d1631
L
4554 { Bad_Opcode },
4555 { Bad_Opcode },
4556 { Bad_Opcode },
f88c9eb0 4557 /* 48 */
592d1631
L
4558 { Bad_Opcode },
4559 { Bad_Opcode },
4560 { Bad_Opcode },
4561 { Bad_Opcode },
4562 { Bad_Opcode },
4563 { Bad_Opcode },
4564 { Bad_Opcode },
4565 { Bad_Opcode },
f88c9eb0 4566 /* 50 */
592d1631
L
4567 { Bad_Opcode },
4568 { Bad_Opcode },
4569 { Bad_Opcode },
4570 { Bad_Opcode },
4571 { Bad_Opcode },
4572 { Bad_Opcode },
4573 { Bad_Opcode },
4574 { Bad_Opcode },
f88c9eb0 4575 /* 58 */
592d1631
L
4576 { Bad_Opcode },
4577 { Bad_Opcode },
4578 { Bad_Opcode },
4579 { Bad_Opcode },
4580 { Bad_Opcode },
4581 { Bad_Opcode },
4582 { Bad_Opcode },
4583 { Bad_Opcode },
f88c9eb0 4584 /* 60 */
7531c613
JB
4585 { "pcmpestrm!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
4586 { "pcmpestri!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
4587 { "pcmpistrm", { XM, EXx, Ib }, PREFIX_DATA },
4588 { "pcmpistri", { XM, EXx, Ib }, PREFIX_DATA },
592d1631
L
4589 { Bad_Opcode },
4590 { Bad_Opcode },
4591 { Bad_Opcode },
4592 { Bad_Opcode },
f88c9eb0 4593 /* 68 */
592d1631
L
4594 { Bad_Opcode },
4595 { Bad_Opcode },
4596 { Bad_Opcode },
4597 { Bad_Opcode },
4598 { Bad_Opcode },
4599 { Bad_Opcode },
4600 { Bad_Opcode },
4601 { Bad_Opcode },
f88c9eb0 4602 /* 70 */
592d1631
L
4603 { Bad_Opcode },
4604 { Bad_Opcode },
4605 { Bad_Opcode },
4606 { Bad_Opcode },
4607 { Bad_Opcode },
4608 { Bad_Opcode },
4609 { Bad_Opcode },
4610 { Bad_Opcode },
f88c9eb0 4611 /* 78 */
592d1631
L
4612 { Bad_Opcode },
4613 { Bad_Opcode },
4614 { Bad_Opcode },
4615 { Bad_Opcode },
4616 { Bad_Opcode },
4617 { Bad_Opcode },
4618 { Bad_Opcode },
4619 { Bad_Opcode },
f88c9eb0 4620 /* 80 */
592d1631
L
4621 { Bad_Opcode },
4622 { Bad_Opcode },
4623 { Bad_Opcode },
4624 { Bad_Opcode },
4625 { Bad_Opcode },
4626 { Bad_Opcode },
4627 { Bad_Opcode },
4628 { Bad_Opcode },
f88c9eb0 4629 /* 88 */
592d1631
L
4630 { Bad_Opcode },
4631 { Bad_Opcode },
4632 { Bad_Opcode },
4633 { Bad_Opcode },
4634 { Bad_Opcode },
4635 { Bad_Opcode },
4636 { Bad_Opcode },
4637 { Bad_Opcode },
f88c9eb0 4638 /* 90 */
592d1631
L
4639 { Bad_Opcode },
4640 { Bad_Opcode },
4641 { Bad_Opcode },
4642 { Bad_Opcode },
4643 { Bad_Opcode },
4644 { Bad_Opcode },
4645 { Bad_Opcode },
4646 { Bad_Opcode },
f88c9eb0 4647 /* 98 */
592d1631
L
4648 { Bad_Opcode },
4649 { Bad_Opcode },
4650 { Bad_Opcode },
4651 { Bad_Opcode },
4652 { Bad_Opcode },
4653 { Bad_Opcode },
4654 { Bad_Opcode },
4655 { Bad_Opcode },
f88c9eb0 4656 /* a0 */
592d1631
L
4657 { Bad_Opcode },
4658 { Bad_Opcode },
4659 { Bad_Opcode },
4660 { Bad_Opcode },
4661 { Bad_Opcode },
4662 { Bad_Opcode },
4663 { Bad_Opcode },
4664 { Bad_Opcode },
f88c9eb0 4665 /* a8 */
592d1631
L
4666 { Bad_Opcode },
4667 { Bad_Opcode },
4668 { Bad_Opcode },
4669 { Bad_Opcode },
4670 { Bad_Opcode },
4671 { Bad_Opcode },
4672 { Bad_Opcode },
4673 { Bad_Opcode },
f88c9eb0 4674 /* b0 */
592d1631
L
4675 { Bad_Opcode },
4676 { Bad_Opcode },
4677 { Bad_Opcode },
4678 { Bad_Opcode },
4679 { Bad_Opcode },
4680 { Bad_Opcode },
4681 { Bad_Opcode },
4682 { Bad_Opcode },
f88c9eb0 4683 /* b8 */
592d1631
L
4684 { Bad_Opcode },
4685 { Bad_Opcode },
4686 { Bad_Opcode },
4687 { Bad_Opcode },
4688 { Bad_Opcode },
4689 { Bad_Opcode },
4690 { Bad_Opcode },
4691 { Bad_Opcode },
f88c9eb0 4692 /* c0 */
592d1631
L
4693 { Bad_Opcode },
4694 { Bad_Opcode },
4695 { Bad_Opcode },
4696 { Bad_Opcode },
4697 { Bad_Opcode },
4698 { Bad_Opcode },
4699 { Bad_Opcode },
4700 { Bad_Opcode },
f88c9eb0 4701 /* c8 */
592d1631
L
4702 { Bad_Opcode },
4703 { Bad_Opcode },
4704 { Bad_Opcode },
4705 { Bad_Opcode },
035e7389 4706 { "sha1rnds4", { XM, EXxmm, Ib }, PREFIX_OPCODE },
592d1631 4707 { Bad_Opcode },
7531c613
JB
4708 { "gf2p8affineqb", { XM, EXxmm, Ib }, PREFIX_DATA },
4709 { "gf2p8affineinvqb", { XM, EXxmm, Ib }, PREFIX_DATA },
f88c9eb0 4710 /* d0 */
592d1631
L
4711 { Bad_Opcode },
4712 { Bad_Opcode },
4713 { Bad_Opcode },
4714 { Bad_Opcode },
4715 { Bad_Opcode },
4716 { Bad_Opcode },
4717 { Bad_Opcode },
4718 { Bad_Opcode },
f88c9eb0 4719 /* d8 */
592d1631
L
4720 { Bad_Opcode },
4721 { Bad_Opcode },
4722 { Bad_Opcode },
4723 { Bad_Opcode },
4724 { Bad_Opcode },
4725 { Bad_Opcode },
4726 { Bad_Opcode },
7531c613 4727 { "aeskeygenassist", { XM, EXx, Ib }, PREFIX_DATA },
f88c9eb0 4728 /* e0 */
592d1631
L
4729 { Bad_Opcode },
4730 { Bad_Opcode },
4731 { Bad_Opcode },
4732 { Bad_Opcode },
4733 { Bad_Opcode },
592d1631
L
4734 { Bad_Opcode },
4735 { Bad_Opcode },
4736 { Bad_Opcode },
85f10a01 4737 /* e8 */
592d1631
L
4738 { Bad_Opcode },
4739 { Bad_Opcode },
4740 { Bad_Opcode },
4741 { Bad_Opcode },
4742 { Bad_Opcode },
4743 { Bad_Opcode },
4744 { Bad_Opcode },
4745 { Bad_Opcode },
85f10a01 4746 /* f0 */
592d1631
L
4747 { Bad_Opcode },
4748 { Bad_Opcode },
4749 { Bad_Opcode },
4750 { Bad_Opcode },
4751 { Bad_Opcode },
4752 { Bad_Opcode },
4753 { Bad_Opcode },
4754 { Bad_Opcode },
85f10a01 4755 /* f8 */
592d1631
L
4756 { Bad_Opcode },
4757 { Bad_Opcode },
4758 { Bad_Opcode },
4759 { Bad_Opcode },
4760 { Bad_Opcode },
4761 { Bad_Opcode },
4762 { Bad_Opcode },
4763 { Bad_Opcode },
85f10a01 4764 },
f88c9eb0
SP
4765};
4766
4767static const struct dis386 xop_table[][256] = {
5dd85c99 4768 /* XOP_08 */
85f10a01
MM
4769 {
4770 /* 00 */
592d1631
L
4771 { Bad_Opcode },
4772 { Bad_Opcode },
4773 { Bad_Opcode },
4774 { Bad_Opcode },
4775 { Bad_Opcode },
4776 { Bad_Opcode },
4777 { Bad_Opcode },
4778 { Bad_Opcode },
85f10a01 4779 /* 08 */
592d1631
L
4780 { Bad_Opcode },
4781 { Bad_Opcode },
4782 { Bad_Opcode },
4783 { Bad_Opcode },
4784 { Bad_Opcode },
4785 { Bad_Opcode },
4786 { Bad_Opcode },
4787 { Bad_Opcode },
85f10a01 4788 /* 10 */
3929df09 4789 { Bad_Opcode },
592d1631
L
4790 { Bad_Opcode },
4791 { Bad_Opcode },
4792 { Bad_Opcode },
4793 { Bad_Opcode },
4794 { Bad_Opcode },
4795 { Bad_Opcode },
4796 { Bad_Opcode },
85f10a01 4797 /* 18 */
592d1631
L
4798 { Bad_Opcode },
4799 { Bad_Opcode },
4800 { Bad_Opcode },
4801 { Bad_Opcode },
4802 { Bad_Opcode },
4803 { Bad_Opcode },
4804 { Bad_Opcode },
4805 { Bad_Opcode },
85f10a01 4806 /* 20 */
592d1631
L
4807 { Bad_Opcode },
4808 { Bad_Opcode },
4809 { Bad_Opcode },
4810 { Bad_Opcode },
4811 { Bad_Opcode },
4812 { Bad_Opcode },
4813 { Bad_Opcode },
4814 { Bad_Opcode },
85f10a01 4815 /* 28 */
592d1631
L
4816 { Bad_Opcode },
4817 { Bad_Opcode },
4818 { Bad_Opcode },
4819 { Bad_Opcode },
4820 { Bad_Opcode },
4821 { Bad_Opcode },
4822 { Bad_Opcode },
4823 { Bad_Opcode },
c0f3af97 4824 /* 30 */
592d1631
L
4825 { Bad_Opcode },
4826 { Bad_Opcode },
4827 { Bad_Opcode },
4828 { Bad_Opcode },
4829 { Bad_Opcode },
4830 { Bad_Opcode },
4831 { Bad_Opcode },
4832 { Bad_Opcode },
c0f3af97 4833 /* 38 */
592d1631
L
4834 { Bad_Opcode },
4835 { Bad_Opcode },
4836 { Bad_Opcode },
4837 { Bad_Opcode },
4838 { Bad_Opcode },
4839 { Bad_Opcode },
4840 { Bad_Opcode },
4841 { Bad_Opcode },
c0f3af97 4842 /* 40 */
592d1631
L
4843 { Bad_Opcode },
4844 { Bad_Opcode },
4845 { Bad_Opcode },
4846 { Bad_Opcode },
4847 { Bad_Opcode },
4848 { Bad_Opcode },
4849 { Bad_Opcode },
4850 { Bad_Opcode },
85f10a01 4851 /* 48 */
592d1631
L
4852 { Bad_Opcode },
4853 { Bad_Opcode },
4854 { Bad_Opcode },
4855 { Bad_Opcode },
4856 { Bad_Opcode },
4857 { Bad_Opcode },
4858 { Bad_Opcode },
4859 { Bad_Opcode },
c0f3af97 4860 /* 50 */
592d1631
L
4861 { Bad_Opcode },
4862 { Bad_Opcode },
4863 { Bad_Opcode },
4864 { Bad_Opcode },
4865 { Bad_Opcode },
4866 { Bad_Opcode },
4867 { Bad_Opcode },
4868 { Bad_Opcode },
85f10a01 4869 /* 58 */
592d1631
L
4870 { Bad_Opcode },
4871 { Bad_Opcode },
4872 { Bad_Opcode },
4873 { Bad_Opcode },
4874 { Bad_Opcode },
4875 { Bad_Opcode },
4876 { Bad_Opcode },
4877 { Bad_Opcode },
c1e679ec 4878 /* 60 */
592d1631
L
4879 { Bad_Opcode },
4880 { Bad_Opcode },
4881 { Bad_Opcode },
4882 { Bad_Opcode },
4883 { Bad_Opcode },
4884 { Bad_Opcode },
4885 { Bad_Opcode },
4886 { Bad_Opcode },
c0f3af97 4887 /* 68 */
592d1631
L
4888 { Bad_Opcode },
4889 { Bad_Opcode },
4890 { Bad_Opcode },
4891 { Bad_Opcode },
4892 { Bad_Opcode },
4893 { Bad_Opcode },
4894 { Bad_Opcode },
4895 { Bad_Opcode },
85f10a01 4896 /* 70 */
592d1631
L
4897 { Bad_Opcode },
4898 { Bad_Opcode },
4899 { Bad_Opcode },
4900 { Bad_Opcode },
4901 { Bad_Opcode },
4902 { Bad_Opcode },
4903 { Bad_Opcode },
4904 { Bad_Opcode },
85f10a01 4905 /* 78 */
592d1631
L
4906 { Bad_Opcode },
4907 { Bad_Opcode },
4908 { Bad_Opcode },
4909 { Bad_Opcode },
4910 { Bad_Opcode },
4911 { Bad_Opcode },
4912 { Bad_Opcode },
4913 { Bad_Opcode },
85f10a01 4914 /* 80 */
592d1631
L
4915 { Bad_Opcode },
4916 { Bad_Opcode },
4917 { Bad_Opcode },
4918 { Bad_Opcode },
4919 { Bad_Opcode },
467bbef0
JB
4920 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_85) },
4921 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_86) },
4922 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_87) },
5dd85c99 4923 /* 88 */
592d1631
L
4924 { Bad_Opcode },
4925 { Bad_Opcode },
4926 { Bad_Opcode },
4927 { Bad_Opcode },
4928 { Bad_Opcode },
4929 { Bad_Opcode },
467bbef0
JB
4930 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_8E) },
4931 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_8F) },
5dd85c99 4932 /* 90 */
592d1631
L
4933 { Bad_Opcode },
4934 { Bad_Opcode },
4935 { Bad_Opcode },
4936 { Bad_Opcode },
4937 { Bad_Opcode },
467bbef0
JB
4938 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_95) },
4939 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_96) },
4940 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_97) },
5dd85c99 4941 /* 98 */
592d1631
L
4942 { Bad_Opcode },
4943 { Bad_Opcode },
4944 { Bad_Opcode },
4945 { Bad_Opcode },
4946 { Bad_Opcode },
4947 { Bad_Opcode },
467bbef0
JB
4948 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_9E) },
4949 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_9F) },
5dd85c99 4950 /* a0 */
592d1631
L
4951 { Bad_Opcode },
4952 { Bad_Opcode },
b13b1bc0 4953 { "vpcmov", { XM, Vex, EXx, XMVexI4 }, 0 },
467bbef0 4954 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_A3) },
592d1631
L
4955 { Bad_Opcode },
4956 { Bad_Opcode },
467bbef0 4957 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_A6) },
592d1631 4958 { Bad_Opcode },
5dd85c99 4959 /* a8 */
592d1631
L
4960 { Bad_Opcode },
4961 { Bad_Opcode },
4962 { Bad_Opcode },
4963 { Bad_Opcode },
4964 { Bad_Opcode },
4965 { Bad_Opcode },
4966 { Bad_Opcode },
4967 { Bad_Opcode },
5dd85c99 4968 /* b0 */
592d1631
L
4969 { Bad_Opcode },
4970 { Bad_Opcode },
4971 { Bad_Opcode },
4972 { Bad_Opcode },
4973 { Bad_Opcode },
4974 { Bad_Opcode },
467bbef0 4975 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_B6) },
592d1631 4976 { Bad_Opcode },
5dd85c99 4977 /* b8 */
592d1631
L
4978 { Bad_Opcode },
4979 { Bad_Opcode },
4980 { Bad_Opcode },
4981 { Bad_Opcode },
4982 { Bad_Opcode },
4983 { Bad_Opcode },
4984 { Bad_Opcode },
4985 { Bad_Opcode },
5dd85c99 4986 /* c0 */
467bbef0
JB
4987 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C0) },
4988 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C1) },
4989 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C2) },
4990 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C3) },
592d1631
L
4991 { Bad_Opcode },
4992 { Bad_Opcode },
4993 { Bad_Opcode },
4994 { Bad_Opcode },
5dd85c99 4995 /* c8 */
592d1631
L
4996 { Bad_Opcode },
4997 { Bad_Opcode },
4998 { Bad_Opcode },
4999 { Bad_Opcode },
ff688e1f
L
5000 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CC) },
5001 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CD) },
5002 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CE) },
5003 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CF) },
5dd85c99 5004 /* d0 */
592d1631
L
5005 { Bad_Opcode },
5006 { Bad_Opcode },
5007 { Bad_Opcode },
5008 { Bad_Opcode },
5009 { Bad_Opcode },
5010 { Bad_Opcode },
5011 { Bad_Opcode },
5012 { Bad_Opcode },
5dd85c99 5013 /* d8 */
592d1631
L
5014 { Bad_Opcode },
5015 { Bad_Opcode },
5016 { Bad_Opcode },
5017 { Bad_Opcode },
5018 { Bad_Opcode },
5019 { Bad_Opcode },
5020 { Bad_Opcode },
5021 { Bad_Opcode },
5dd85c99 5022 /* e0 */
592d1631
L
5023 { Bad_Opcode },
5024 { Bad_Opcode },
5025 { Bad_Opcode },
5026 { Bad_Opcode },
5027 { Bad_Opcode },
5028 { Bad_Opcode },
5029 { Bad_Opcode },
5030 { Bad_Opcode },
5dd85c99 5031 /* e8 */
592d1631
L
5032 { Bad_Opcode },
5033 { Bad_Opcode },
5034 { Bad_Opcode },
5035 { Bad_Opcode },
ff688e1f
L
5036 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EC) },
5037 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_ED) },
5038 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EE) },
5039 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EF) },
5dd85c99 5040 /* f0 */
592d1631
L
5041 { Bad_Opcode },
5042 { Bad_Opcode },
5043 { Bad_Opcode },
5044 { Bad_Opcode },
5045 { Bad_Opcode },
5046 { Bad_Opcode },
5047 { Bad_Opcode },
5048 { Bad_Opcode },
5dd85c99 5049 /* f8 */
592d1631
L
5050 { Bad_Opcode },
5051 { Bad_Opcode },
5052 { Bad_Opcode },
5053 { Bad_Opcode },
5054 { Bad_Opcode },
5055 { Bad_Opcode },
5056 { Bad_Opcode },
5057 { Bad_Opcode },
5dd85c99
SP
5058 },
5059 /* XOP_09 */
5060 {
5061 /* 00 */
592d1631 5062 { Bad_Opcode },
467bbef0
JB
5063 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_01) },
5064 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_02) },
592d1631
L
5065 { Bad_Opcode },
5066 { Bad_Opcode },
5067 { Bad_Opcode },
5068 { Bad_Opcode },
5069 { Bad_Opcode },
5dd85c99 5070 /* 08 */
592d1631
L
5071 { Bad_Opcode },
5072 { Bad_Opcode },
5073 { Bad_Opcode },
5074 { Bad_Opcode },
5075 { Bad_Opcode },
5076 { Bad_Opcode },
5077 { Bad_Opcode },
5078 { Bad_Opcode },
5dd85c99 5079 /* 10 */
592d1631
L
5080 { Bad_Opcode },
5081 { Bad_Opcode },
467bbef0 5082 { MOD_TABLE (MOD_VEX_0FXOP_09_12) },
592d1631
L
5083 { Bad_Opcode },
5084 { Bad_Opcode },
5085 { Bad_Opcode },
5086 { Bad_Opcode },
5087 { Bad_Opcode },
5dd85c99 5088 /* 18 */
592d1631
L
5089 { Bad_Opcode },
5090 { Bad_Opcode },
5091 { Bad_Opcode },
5092 { Bad_Opcode },
5093 { Bad_Opcode },
5094 { Bad_Opcode },
5095 { Bad_Opcode },
5096 { Bad_Opcode },
5dd85c99 5097 /* 20 */
592d1631
L
5098 { Bad_Opcode },
5099 { Bad_Opcode },
5100 { Bad_Opcode },
5101 { Bad_Opcode },
5102 { Bad_Opcode },
5103 { Bad_Opcode },
5104 { Bad_Opcode },
5105 { Bad_Opcode },
5dd85c99 5106 /* 28 */
592d1631
L
5107 { Bad_Opcode },
5108 { Bad_Opcode },
5109 { Bad_Opcode },
5110 { Bad_Opcode },
5111 { Bad_Opcode },
5112 { Bad_Opcode },
5113 { Bad_Opcode },
5114 { Bad_Opcode },
5dd85c99 5115 /* 30 */
592d1631
L
5116 { Bad_Opcode },
5117 { Bad_Opcode },
5118 { Bad_Opcode },
5119 { Bad_Opcode },
5120 { Bad_Opcode },
5121 { Bad_Opcode },
5122 { Bad_Opcode },
5123 { Bad_Opcode },
5dd85c99 5124 /* 38 */
592d1631
L
5125 { Bad_Opcode },
5126 { Bad_Opcode },
5127 { Bad_Opcode },
5128 { Bad_Opcode },
5129 { Bad_Opcode },
5130 { Bad_Opcode },
5131 { Bad_Opcode },
5132 { Bad_Opcode },
5dd85c99 5133 /* 40 */
592d1631
L
5134 { Bad_Opcode },
5135 { Bad_Opcode },
5136 { Bad_Opcode },
5137 { Bad_Opcode },
5138 { Bad_Opcode },
5139 { Bad_Opcode },
5140 { Bad_Opcode },
5141 { Bad_Opcode },
5dd85c99 5142 /* 48 */
592d1631
L
5143 { Bad_Opcode },
5144 { Bad_Opcode },
5145 { Bad_Opcode },
5146 { Bad_Opcode },
5147 { Bad_Opcode },
5148 { Bad_Opcode },
5149 { Bad_Opcode },
5150 { Bad_Opcode },
5dd85c99 5151 /* 50 */
592d1631
L
5152 { Bad_Opcode },
5153 { Bad_Opcode },
5154 { Bad_Opcode },
5155 { Bad_Opcode },
5156 { Bad_Opcode },
5157 { Bad_Opcode },
5158 { Bad_Opcode },
5159 { Bad_Opcode },
5dd85c99 5160 /* 58 */
592d1631
L
5161 { Bad_Opcode },
5162 { Bad_Opcode },
5163 { Bad_Opcode },
5164 { Bad_Opcode },
5165 { Bad_Opcode },
5166 { Bad_Opcode },
5167 { Bad_Opcode },
5168 { Bad_Opcode },
5dd85c99 5169 /* 60 */
592d1631
L
5170 { Bad_Opcode },
5171 { Bad_Opcode },
5172 { Bad_Opcode },
5173 { Bad_Opcode },
5174 { Bad_Opcode },
5175 { Bad_Opcode },
5176 { Bad_Opcode },
5177 { Bad_Opcode },
5dd85c99 5178 /* 68 */
592d1631
L
5179 { Bad_Opcode },
5180 { Bad_Opcode },
5181 { Bad_Opcode },
5182 { Bad_Opcode },
5183 { Bad_Opcode },
5184 { Bad_Opcode },
5185 { Bad_Opcode },
5186 { Bad_Opcode },
5dd85c99 5187 /* 70 */
592d1631
L
5188 { Bad_Opcode },
5189 { Bad_Opcode },
5190 { Bad_Opcode },
5191 { Bad_Opcode },
5192 { Bad_Opcode },
5193 { Bad_Opcode },
5194 { Bad_Opcode },
5195 { Bad_Opcode },
5dd85c99 5196 /* 78 */
592d1631
L
5197 { Bad_Opcode },
5198 { Bad_Opcode },
5199 { Bad_Opcode },
5200 { Bad_Opcode },
5201 { Bad_Opcode },
5202 { Bad_Opcode },
5203 { Bad_Opcode },
5204 { Bad_Opcode },
5dd85c99 5205 /* 80 */
b5b098c2
JB
5206 { VEX_W_TABLE (VEX_W_0FXOP_09_80) },
5207 { VEX_W_TABLE (VEX_W_0FXOP_09_81) },
5208 { VEX_W_TABLE (VEX_W_0FXOP_09_82) },
5209 { VEX_W_TABLE (VEX_W_0FXOP_09_83) },
592d1631
L
5210 { Bad_Opcode },
5211 { Bad_Opcode },
5212 { Bad_Opcode },
5213 { Bad_Opcode },
5dd85c99 5214 /* 88 */
592d1631
L
5215 { Bad_Opcode },
5216 { Bad_Opcode },
5217 { Bad_Opcode },
5218 { Bad_Opcode },
5219 { Bad_Opcode },
5220 { Bad_Opcode },
5221 { Bad_Opcode },
5222 { Bad_Opcode },
5dd85c99 5223 /* 90 */
467bbef0
JB
5224 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_90) },
5225 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_91) },
5226 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_92) },
5227 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_93) },
5228 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_94) },
5229 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_95) },
5230 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_96) },
5231 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_97) },
5dd85c99 5232 /* 98 */
467bbef0
JB
5233 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_98) },
5234 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_99) },
5235 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_9A) },
5236 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_9B) },
592d1631
L
5237 { Bad_Opcode },
5238 { Bad_Opcode },
5239 { Bad_Opcode },
5240 { Bad_Opcode },
5dd85c99 5241 /* a0 */
592d1631
L
5242 { Bad_Opcode },
5243 { Bad_Opcode },
5244 { Bad_Opcode },
5245 { Bad_Opcode },
5246 { Bad_Opcode },
5247 { Bad_Opcode },
5248 { Bad_Opcode },
5249 { Bad_Opcode },
5dd85c99 5250 /* a8 */
592d1631
L
5251 { Bad_Opcode },
5252 { Bad_Opcode },
5253 { Bad_Opcode },
5254 { Bad_Opcode },
5255 { Bad_Opcode },
5256 { Bad_Opcode },
5257 { Bad_Opcode },
5258 { Bad_Opcode },
5dd85c99 5259 /* b0 */
592d1631
L
5260 { Bad_Opcode },
5261 { Bad_Opcode },
5262 { Bad_Opcode },
5263 { Bad_Opcode },
5264 { Bad_Opcode },
5265 { Bad_Opcode },
5266 { Bad_Opcode },
5267 { Bad_Opcode },
5dd85c99 5268 /* b8 */
592d1631
L
5269 { Bad_Opcode },
5270 { Bad_Opcode },
5271 { Bad_Opcode },
5272 { Bad_Opcode },
5273 { Bad_Opcode },
5274 { Bad_Opcode },
5275 { Bad_Opcode },
5276 { Bad_Opcode },
5dd85c99 5277 /* c0 */
592d1631 5278 { Bad_Opcode },
467bbef0
JB
5279 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C1) },
5280 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C2) },
5281 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C3) },
592d1631
L
5282 { Bad_Opcode },
5283 { Bad_Opcode },
467bbef0
JB
5284 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C6) },
5285 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C7) },
5dd85c99 5286 /* c8 */
592d1631
L
5287 { Bad_Opcode },
5288 { Bad_Opcode },
5289 { Bad_Opcode },
467bbef0 5290 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_CB) },
592d1631
L
5291 { Bad_Opcode },
5292 { Bad_Opcode },
5293 { Bad_Opcode },
5294 { Bad_Opcode },
5dd85c99 5295 /* d0 */
592d1631 5296 { Bad_Opcode },
467bbef0
JB
5297 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D1) },
5298 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D2) },
5299 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D3) },
592d1631
L
5300 { Bad_Opcode },
5301 { Bad_Opcode },
467bbef0
JB
5302 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D6) },
5303 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D7) },
5dd85c99 5304 /* d8 */
592d1631
L
5305 { Bad_Opcode },
5306 { Bad_Opcode },
5307 { Bad_Opcode },
467bbef0 5308 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_DB) },
592d1631
L
5309 { Bad_Opcode },
5310 { Bad_Opcode },
5311 { Bad_Opcode },
5312 { Bad_Opcode },
5dd85c99 5313 /* e0 */
592d1631 5314 { Bad_Opcode },
467bbef0
JB
5315 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E1) },
5316 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E2) },
5317 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E3) },
592d1631
L
5318 { Bad_Opcode },
5319 { Bad_Opcode },
5320 { Bad_Opcode },
5321 { Bad_Opcode },
4e7d34a6 5322 /* e8 */
592d1631
L
5323 { Bad_Opcode },
5324 { Bad_Opcode },
5325 { Bad_Opcode },
5326 { Bad_Opcode },
5327 { Bad_Opcode },
5328 { Bad_Opcode },
5329 { Bad_Opcode },
5330 { Bad_Opcode },
4e7d34a6 5331 /* f0 */
592d1631
L
5332 { Bad_Opcode },
5333 { Bad_Opcode },
5334 { Bad_Opcode },
5335 { Bad_Opcode },
5336 { Bad_Opcode },
5337 { Bad_Opcode },
5338 { Bad_Opcode },
5339 { Bad_Opcode },
4e7d34a6 5340 /* f8 */
592d1631
L
5341 { Bad_Opcode },
5342 { Bad_Opcode },
5343 { Bad_Opcode },
5344 { Bad_Opcode },
5345 { Bad_Opcode },
5346 { Bad_Opcode },
5347 { Bad_Opcode },
5348 { Bad_Opcode },
4e7d34a6 5349 },
f88c9eb0 5350 /* XOP_0A */
4e7d34a6
L
5351 {
5352 /* 00 */
592d1631
L
5353 { Bad_Opcode },
5354 { Bad_Opcode },
5355 { Bad_Opcode },
5356 { Bad_Opcode },
5357 { Bad_Opcode },
5358 { Bad_Opcode },
5359 { Bad_Opcode },
5360 { Bad_Opcode },
4e7d34a6 5361 /* 08 */
592d1631
L
5362 { Bad_Opcode },
5363 { Bad_Opcode },
5364 { Bad_Opcode },
5365 { Bad_Opcode },
5366 { Bad_Opcode },
5367 { Bad_Opcode },
5368 { Bad_Opcode },
5369 { Bad_Opcode },
4e7d34a6 5370 /* 10 */
c1dc7af5 5371 { "bextrS", { Gdq, Edq, Id }, 0 },
592d1631 5372 { Bad_Opcode },
467bbef0 5373 { VEX_LEN_TABLE (VEX_LEN_0FXOP_0A_12) },
592d1631
L
5374 { Bad_Opcode },
5375 { Bad_Opcode },
5376 { Bad_Opcode },
5377 { Bad_Opcode },
5378 { Bad_Opcode },
4e7d34a6 5379 /* 18 */
592d1631
L
5380 { Bad_Opcode },
5381 { Bad_Opcode },
5382 { Bad_Opcode },
5383 { Bad_Opcode },
5384 { Bad_Opcode },
5385 { Bad_Opcode },
5386 { Bad_Opcode },
5387 { Bad_Opcode },
4e7d34a6 5388 /* 20 */
592d1631
L
5389 { Bad_Opcode },
5390 { Bad_Opcode },
5391 { Bad_Opcode },
5392 { Bad_Opcode },
5393 { Bad_Opcode },
5394 { Bad_Opcode },
5395 { Bad_Opcode },
5396 { Bad_Opcode },
4e7d34a6 5397 /* 28 */
592d1631
L
5398 { Bad_Opcode },
5399 { Bad_Opcode },
5400 { Bad_Opcode },
5401 { Bad_Opcode },
5402 { Bad_Opcode },
5403 { Bad_Opcode },
5404 { Bad_Opcode },
5405 { Bad_Opcode },
4e7d34a6 5406 /* 30 */
592d1631
L
5407 { Bad_Opcode },
5408 { Bad_Opcode },
5409 { Bad_Opcode },
5410 { Bad_Opcode },
5411 { Bad_Opcode },
5412 { Bad_Opcode },
5413 { Bad_Opcode },
5414 { Bad_Opcode },
c0f3af97 5415 /* 38 */
592d1631
L
5416 { Bad_Opcode },
5417 { Bad_Opcode },
5418 { Bad_Opcode },
5419 { Bad_Opcode },
5420 { Bad_Opcode },
5421 { Bad_Opcode },
5422 { Bad_Opcode },
5423 { Bad_Opcode },
c0f3af97 5424 /* 40 */
592d1631
L
5425 { Bad_Opcode },
5426 { Bad_Opcode },
5427 { Bad_Opcode },
5428 { Bad_Opcode },
5429 { Bad_Opcode },
5430 { Bad_Opcode },
5431 { Bad_Opcode },
5432 { Bad_Opcode },
c1e679ec 5433 /* 48 */
592d1631
L
5434 { Bad_Opcode },
5435 { Bad_Opcode },
5436 { Bad_Opcode },
5437 { Bad_Opcode },
5438 { Bad_Opcode },
5439 { Bad_Opcode },
5440 { Bad_Opcode },
5441 { Bad_Opcode },
c1e679ec 5442 /* 50 */
592d1631
L
5443 { Bad_Opcode },
5444 { Bad_Opcode },
5445 { Bad_Opcode },
5446 { Bad_Opcode },
5447 { Bad_Opcode },
5448 { Bad_Opcode },
5449 { Bad_Opcode },
5450 { Bad_Opcode },
4e7d34a6 5451 /* 58 */
592d1631
L
5452 { Bad_Opcode },
5453 { Bad_Opcode },
5454 { Bad_Opcode },
5455 { Bad_Opcode },
5456 { Bad_Opcode },
5457 { Bad_Opcode },
5458 { Bad_Opcode },
5459 { Bad_Opcode },
4e7d34a6 5460 /* 60 */
592d1631
L
5461 { Bad_Opcode },
5462 { Bad_Opcode },
5463 { Bad_Opcode },
5464 { Bad_Opcode },
5465 { Bad_Opcode },
5466 { Bad_Opcode },
5467 { Bad_Opcode },
5468 { Bad_Opcode },
4e7d34a6 5469 /* 68 */
592d1631
L
5470 { Bad_Opcode },
5471 { Bad_Opcode },
5472 { Bad_Opcode },
5473 { Bad_Opcode },
5474 { Bad_Opcode },
5475 { Bad_Opcode },
5476 { Bad_Opcode },
5477 { Bad_Opcode },
4e7d34a6 5478 /* 70 */
592d1631
L
5479 { Bad_Opcode },
5480 { Bad_Opcode },
5481 { Bad_Opcode },
5482 { Bad_Opcode },
5483 { Bad_Opcode },
5484 { Bad_Opcode },
5485 { Bad_Opcode },
5486 { Bad_Opcode },
4e7d34a6 5487 /* 78 */
592d1631
L
5488 { Bad_Opcode },
5489 { Bad_Opcode },
5490 { Bad_Opcode },
5491 { Bad_Opcode },
5492 { Bad_Opcode },
5493 { Bad_Opcode },
5494 { Bad_Opcode },
5495 { Bad_Opcode },
4e7d34a6 5496 /* 80 */
592d1631
L
5497 { Bad_Opcode },
5498 { Bad_Opcode },
5499 { Bad_Opcode },
5500 { Bad_Opcode },
5501 { Bad_Opcode },
5502 { Bad_Opcode },
5503 { Bad_Opcode },
5504 { Bad_Opcode },
4e7d34a6 5505 /* 88 */
592d1631
L
5506 { Bad_Opcode },
5507 { Bad_Opcode },
5508 { Bad_Opcode },
5509 { Bad_Opcode },
5510 { Bad_Opcode },
5511 { Bad_Opcode },
5512 { Bad_Opcode },
5513 { Bad_Opcode },
4e7d34a6 5514 /* 90 */
592d1631
L
5515 { Bad_Opcode },
5516 { Bad_Opcode },
5517 { Bad_Opcode },
5518 { Bad_Opcode },
5519 { Bad_Opcode },
5520 { Bad_Opcode },
5521 { Bad_Opcode },
5522 { Bad_Opcode },
4e7d34a6 5523 /* 98 */
592d1631
L
5524 { Bad_Opcode },
5525 { Bad_Opcode },
5526 { Bad_Opcode },
5527 { Bad_Opcode },
5528 { Bad_Opcode },
5529 { Bad_Opcode },
5530 { Bad_Opcode },
5531 { Bad_Opcode },
4e7d34a6 5532 /* a0 */
592d1631
L
5533 { Bad_Opcode },
5534 { Bad_Opcode },
5535 { Bad_Opcode },
5536 { Bad_Opcode },
5537 { Bad_Opcode },
5538 { Bad_Opcode },
5539 { Bad_Opcode },
5540 { Bad_Opcode },
4e7d34a6 5541 /* a8 */
592d1631
L
5542 { Bad_Opcode },
5543 { Bad_Opcode },
5544 { Bad_Opcode },
5545 { Bad_Opcode },
5546 { Bad_Opcode },
5547 { Bad_Opcode },
5548 { Bad_Opcode },
5549 { Bad_Opcode },
d5d7db8e 5550 /* b0 */
592d1631
L
5551 { Bad_Opcode },
5552 { Bad_Opcode },
5553 { Bad_Opcode },
5554 { Bad_Opcode },
5555 { Bad_Opcode },
5556 { Bad_Opcode },
5557 { Bad_Opcode },
5558 { Bad_Opcode },
85f10a01 5559 /* b8 */
592d1631
L
5560 { Bad_Opcode },
5561 { Bad_Opcode },
5562 { Bad_Opcode },
5563 { Bad_Opcode },
5564 { Bad_Opcode },
5565 { Bad_Opcode },
5566 { Bad_Opcode },
5567 { Bad_Opcode },
85f10a01 5568 /* c0 */
592d1631
L
5569 { Bad_Opcode },
5570 { Bad_Opcode },
5571 { Bad_Opcode },
5572 { Bad_Opcode },
5573 { Bad_Opcode },
5574 { Bad_Opcode },
5575 { Bad_Opcode },
5576 { Bad_Opcode },
85f10a01 5577 /* c8 */
592d1631
L
5578 { Bad_Opcode },
5579 { Bad_Opcode },
5580 { Bad_Opcode },
5581 { Bad_Opcode },
5582 { Bad_Opcode },
5583 { Bad_Opcode },
5584 { Bad_Opcode },
5585 { Bad_Opcode },
85f10a01 5586 /* d0 */
592d1631
L
5587 { Bad_Opcode },
5588 { Bad_Opcode },
5589 { Bad_Opcode },
5590 { Bad_Opcode },
5591 { Bad_Opcode },
5592 { Bad_Opcode },
5593 { Bad_Opcode },
5594 { Bad_Opcode },
85f10a01 5595 /* d8 */
592d1631
L
5596 { Bad_Opcode },
5597 { Bad_Opcode },
5598 { Bad_Opcode },
5599 { Bad_Opcode },
5600 { Bad_Opcode },
5601 { Bad_Opcode },
5602 { Bad_Opcode },
5603 { Bad_Opcode },
85f10a01 5604 /* e0 */
592d1631
L
5605 { Bad_Opcode },
5606 { Bad_Opcode },
5607 { Bad_Opcode },
5608 { Bad_Opcode },
5609 { Bad_Opcode },
5610 { Bad_Opcode },
5611 { Bad_Opcode },
5612 { Bad_Opcode },
85f10a01 5613 /* e8 */
592d1631
L
5614 { Bad_Opcode },
5615 { Bad_Opcode },
5616 { Bad_Opcode },
5617 { Bad_Opcode },
5618 { Bad_Opcode },
5619 { Bad_Opcode },
5620 { Bad_Opcode },
5621 { Bad_Opcode },
85f10a01 5622 /* f0 */
592d1631
L
5623 { Bad_Opcode },
5624 { Bad_Opcode },
5625 { Bad_Opcode },
5626 { Bad_Opcode },
5627 { Bad_Opcode },
5628 { Bad_Opcode },
5629 { Bad_Opcode },
5630 { Bad_Opcode },
85f10a01 5631 /* f8 */
592d1631
L
5632 { Bad_Opcode },
5633 { Bad_Opcode },
5634 { Bad_Opcode },
5635 { Bad_Opcode },
5636 { Bad_Opcode },
5637 { Bad_Opcode },
5638 { Bad_Opcode },
5639 { Bad_Opcode },
85f10a01 5640 },
c0f3af97
L
5641};
5642
5643static const struct dis386 vex_table[][256] = {
5644 /* VEX_0F */
85f10a01
MM
5645 {
5646 /* 00 */
592d1631
L
5647 { Bad_Opcode },
5648 { Bad_Opcode },
5649 { Bad_Opcode },
5650 { Bad_Opcode },
5651 { Bad_Opcode },
5652 { Bad_Opcode },
5653 { Bad_Opcode },
5654 { Bad_Opcode },
85f10a01 5655 /* 08 */
592d1631
L
5656 { Bad_Opcode },
5657 { Bad_Opcode },
5658 { Bad_Opcode },
5659 { Bad_Opcode },
5660 { Bad_Opcode },
5661 { Bad_Opcode },
5662 { Bad_Opcode },
5663 { Bad_Opcode },
c0f3af97 5664 /* 10 */
592a252b
L
5665 { PREFIX_TABLE (PREFIX_VEX_0F10) },
5666 { PREFIX_TABLE (PREFIX_VEX_0F11) },
5667 { PREFIX_TABLE (PREFIX_VEX_0F12) },
5668 { MOD_TABLE (MOD_VEX_0F13) },
bf926894
JB
5669 { "vunpcklpX", { XM, Vex, EXx }, PREFIX_OPCODE },
5670 { "vunpckhpX", { XM, Vex, EXx }, PREFIX_OPCODE },
592a252b
L
5671 { PREFIX_TABLE (PREFIX_VEX_0F16) },
5672 { MOD_TABLE (MOD_VEX_0F17) },
c0f3af97 5673 /* 18 */
592d1631
L
5674 { Bad_Opcode },
5675 { Bad_Opcode },
5676 { Bad_Opcode },
5677 { Bad_Opcode },
5678 { Bad_Opcode },
5679 { Bad_Opcode },
5680 { Bad_Opcode },
5681 { Bad_Opcode },
c0f3af97 5682 /* 20 */
592d1631
L
5683 { Bad_Opcode },
5684 { Bad_Opcode },
5685 { Bad_Opcode },
5686 { Bad_Opcode },
5687 { Bad_Opcode },
5688 { Bad_Opcode },
5689 { Bad_Opcode },
5690 { Bad_Opcode },
c0f3af97 5691 /* 28 */
bf926894
JB
5692 { "vmovapX", { XM, EXx }, PREFIX_OPCODE },
5693 { "vmovapX", { EXxS, XM }, PREFIX_OPCODE },
592a252b
L
5694 { PREFIX_TABLE (PREFIX_VEX_0F2A) },
5695 { MOD_TABLE (MOD_VEX_0F2B) },
5696 { PREFIX_TABLE (PREFIX_VEX_0F2C) },
5697 { PREFIX_TABLE (PREFIX_VEX_0F2D) },
5698 { PREFIX_TABLE (PREFIX_VEX_0F2E) },
5699 { PREFIX_TABLE (PREFIX_VEX_0F2F) },
85f10a01 5700 /* 30 */
592d1631
L
5701 { Bad_Opcode },
5702 { Bad_Opcode },
5703 { Bad_Opcode },
5704 { Bad_Opcode },
5705 { Bad_Opcode },
5706 { Bad_Opcode },
5707 { Bad_Opcode },
5708 { Bad_Opcode },
4e7d34a6 5709 /* 38 */
592d1631
L
5710 { Bad_Opcode },
5711 { Bad_Opcode },
5712 { Bad_Opcode },
5713 { Bad_Opcode },
5714 { Bad_Opcode },
5715 { Bad_Opcode },
5716 { Bad_Opcode },
5717 { Bad_Opcode },
d5d7db8e 5718 /* 40 */
592d1631 5719 { Bad_Opcode },
43234a1e
L
5720 { PREFIX_TABLE (PREFIX_VEX_0F41) },
5721 { PREFIX_TABLE (PREFIX_VEX_0F42) },
592d1631 5722 { Bad_Opcode },
43234a1e
L
5723 { PREFIX_TABLE (PREFIX_VEX_0F44) },
5724 { PREFIX_TABLE (PREFIX_VEX_0F45) },
5725 { PREFIX_TABLE (PREFIX_VEX_0F46) },
5726 { PREFIX_TABLE (PREFIX_VEX_0F47) },
85f10a01 5727 /* 48 */
592d1631
L
5728 { Bad_Opcode },
5729 { Bad_Opcode },
1ba585e8 5730 { PREFIX_TABLE (PREFIX_VEX_0F4A) },
43234a1e 5731 { PREFIX_TABLE (PREFIX_VEX_0F4B) },
592d1631
L
5732 { Bad_Opcode },
5733 { Bad_Opcode },
5734 { Bad_Opcode },
5735 { Bad_Opcode },
d5d7db8e 5736 /* 50 */
592a252b
L
5737 { MOD_TABLE (MOD_VEX_0F50) },
5738 { PREFIX_TABLE (PREFIX_VEX_0F51) },
5739 { PREFIX_TABLE (PREFIX_VEX_0F52) },
5740 { PREFIX_TABLE (PREFIX_VEX_0F53) },
bf926894
JB
5741 { "vandpX", { XM, Vex, EXx }, PREFIX_OPCODE },
5742 { "vandnpX", { XM, Vex, EXx }, PREFIX_OPCODE },
5743 { "vorpX", { XM, Vex, EXx }, PREFIX_OPCODE },
5744 { "vxorpX", { XM, Vex, EXx }, PREFIX_OPCODE },
c0f3af97 5745 /* 58 */
592a252b
L
5746 { PREFIX_TABLE (PREFIX_VEX_0F58) },
5747 { PREFIX_TABLE (PREFIX_VEX_0F59) },
5748 { PREFIX_TABLE (PREFIX_VEX_0F5A) },
5749 { PREFIX_TABLE (PREFIX_VEX_0F5B) },
5750 { PREFIX_TABLE (PREFIX_VEX_0F5C) },
5751 { PREFIX_TABLE (PREFIX_VEX_0F5D) },
5752 { PREFIX_TABLE (PREFIX_VEX_0F5E) },
5753 { PREFIX_TABLE (PREFIX_VEX_0F5F) },
c0f3af97 5754 /* 60 */
7531c613
JB
5755 { "vpunpcklbw", { XM, Vex, EXx }, PREFIX_DATA },
5756 { "vpunpcklwd", { XM, Vex, EXx }, PREFIX_DATA },
5757 { "vpunpckldq", { XM, Vex, EXx }, PREFIX_DATA },
5758 { "vpacksswb", { XM, Vex, EXx }, PREFIX_DATA },
5759 { "vpcmpgtb", { XM, Vex, EXx }, PREFIX_DATA },
5760 { "vpcmpgtw", { XM, Vex, EXx }, PREFIX_DATA },
5761 { "vpcmpgtd", { XM, Vex, EXx }, PREFIX_DATA },
5762 { "vpackuswb", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 5763 /* 68 */
7531c613
JB
5764 { "vpunpckhbw", { XM, Vex, EXx }, PREFIX_DATA },
5765 { "vpunpckhwd", { XM, Vex, EXx }, PREFIX_DATA },
5766 { "vpunpckhdq", { XM, Vex, EXx }, PREFIX_DATA },
5767 { "vpackssdw", { XM, Vex, EXx }, PREFIX_DATA },
5768 { "vpunpcklqdq", { XM, Vex, EXx }, PREFIX_DATA },
5769 { "vpunpckhqdq", { XM, Vex, EXx }, PREFIX_DATA },
5770 { VEX_LEN_TABLE (VEX_LEN_0F6E) },
592a252b 5771 { PREFIX_TABLE (PREFIX_VEX_0F6F) },
c0f3af97 5772 /* 70 */
592a252b
L
5773 { PREFIX_TABLE (PREFIX_VEX_0F70) },
5774 { REG_TABLE (REG_VEX_0F71) },
5775 { REG_TABLE (REG_VEX_0F72) },
5776 { REG_TABLE (REG_VEX_0F73) },
7531c613
JB
5777 { "vpcmpeqb", { XM, Vex, EXx }, PREFIX_DATA },
5778 { "vpcmpeqw", { XM, Vex, EXx }, PREFIX_DATA },
5779 { "vpcmpeqd", { XM, Vex, EXx }, PREFIX_DATA },
035e7389 5780 { VEX_LEN_TABLE (VEX_LEN_0F77) },
c0f3af97 5781 /* 78 */
592d1631
L
5782 { Bad_Opcode },
5783 { Bad_Opcode },
5784 { Bad_Opcode },
5785 { Bad_Opcode },
592a252b
L
5786 { PREFIX_TABLE (PREFIX_VEX_0F7C) },
5787 { PREFIX_TABLE (PREFIX_VEX_0F7D) },
5788 { PREFIX_TABLE (PREFIX_VEX_0F7E) },
5789 { PREFIX_TABLE (PREFIX_VEX_0F7F) },
c0f3af97 5790 /* 80 */
592d1631
L
5791 { Bad_Opcode },
5792 { Bad_Opcode },
5793 { Bad_Opcode },
5794 { Bad_Opcode },
5795 { Bad_Opcode },
5796 { Bad_Opcode },
5797 { Bad_Opcode },
5798 { Bad_Opcode },
c0f3af97 5799 /* 88 */
592d1631
L
5800 { Bad_Opcode },
5801 { Bad_Opcode },
5802 { Bad_Opcode },
5803 { Bad_Opcode },
5804 { Bad_Opcode },
5805 { Bad_Opcode },
5806 { Bad_Opcode },
5807 { Bad_Opcode },
c0f3af97 5808 /* 90 */
43234a1e
L
5809 { PREFIX_TABLE (PREFIX_VEX_0F90) },
5810 { PREFIX_TABLE (PREFIX_VEX_0F91) },
5811 { PREFIX_TABLE (PREFIX_VEX_0F92) },
5812 { PREFIX_TABLE (PREFIX_VEX_0F93) },
592d1631
L
5813 { Bad_Opcode },
5814 { Bad_Opcode },
5815 { Bad_Opcode },
5816 { Bad_Opcode },
c0f3af97 5817 /* 98 */
43234a1e 5818 { PREFIX_TABLE (PREFIX_VEX_0F98) },
1ba585e8 5819 { PREFIX_TABLE (PREFIX_VEX_0F99) },
592d1631
L
5820 { Bad_Opcode },
5821 { Bad_Opcode },
5822 { Bad_Opcode },
5823 { Bad_Opcode },
5824 { Bad_Opcode },
5825 { Bad_Opcode },
c0f3af97 5826 /* a0 */
592d1631
L
5827 { Bad_Opcode },
5828 { Bad_Opcode },
5829 { Bad_Opcode },
5830 { Bad_Opcode },
5831 { Bad_Opcode },
5832 { Bad_Opcode },
5833 { Bad_Opcode },
5834 { Bad_Opcode },
c0f3af97 5835 /* a8 */
592d1631
L
5836 { Bad_Opcode },
5837 { Bad_Opcode },
5838 { Bad_Opcode },
5839 { Bad_Opcode },
5840 { Bad_Opcode },
5841 { Bad_Opcode },
592a252b 5842 { REG_TABLE (REG_VEX_0FAE) },
592d1631 5843 { Bad_Opcode },
c0f3af97 5844 /* b0 */
592d1631
L
5845 { Bad_Opcode },
5846 { Bad_Opcode },
5847 { Bad_Opcode },
5848 { Bad_Opcode },
5849 { Bad_Opcode },
5850 { Bad_Opcode },
5851 { Bad_Opcode },
5852 { Bad_Opcode },
c0f3af97 5853 /* b8 */
592d1631
L
5854 { Bad_Opcode },
5855 { Bad_Opcode },
5856 { Bad_Opcode },
5857 { Bad_Opcode },
5858 { Bad_Opcode },
5859 { Bad_Opcode },
5860 { Bad_Opcode },
5861 { Bad_Opcode },
c0f3af97 5862 /* c0 */
592d1631
L
5863 { Bad_Opcode },
5864 { Bad_Opcode },
592a252b 5865 { PREFIX_TABLE (PREFIX_VEX_0FC2) },
592d1631 5866 { Bad_Opcode },
7531c613
JB
5867 { VEX_LEN_TABLE (VEX_LEN_0FC4) },
5868 { VEX_LEN_TABLE (VEX_LEN_0FC5) },
bf926894 5869 { "vshufpX", { XM, Vex, EXx, Ib }, PREFIX_OPCODE },
592d1631 5870 { Bad_Opcode },
c0f3af97 5871 /* c8 */
592d1631
L
5872 { Bad_Opcode },
5873 { Bad_Opcode },
5874 { Bad_Opcode },
5875 { Bad_Opcode },
5876 { Bad_Opcode },
5877 { Bad_Opcode },
5878 { Bad_Opcode },
5879 { Bad_Opcode },
c0f3af97 5880 /* d0 */
592a252b 5881 { PREFIX_TABLE (PREFIX_VEX_0FD0) },
7531c613
JB
5882 { "vpsrlw", { XM, Vex, EXxmm }, PREFIX_DATA },
5883 { "vpsrld", { XM, Vex, EXxmm }, PREFIX_DATA },
5884 { "vpsrlq", { XM, Vex, EXxmm }, PREFIX_DATA },
5885 { "vpaddq", { XM, Vex, EXx }, PREFIX_DATA },
5886 { "vpmullw", { XM, Vex, EXx }, PREFIX_DATA },
5887 { VEX_LEN_TABLE (VEX_LEN_0FD6) },
5888 { MOD_TABLE (MOD_VEX_0FD7) },
c0f3af97 5889 /* d8 */
7531c613
JB
5890 { "vpsubusb", { XM, Vex, EXx }, PREFIX_DATA },
5891 { "vpsubusw", { XM, Vex, EXx }, PREFIX_DATA },
5892 { "vpminub", { XM, Vex, EXx }, PREFIX_DATA },
5893 { "vpand", { XM, Vex, EXx }, PREFIX_DATA },
5894 { "vpaddusb", { XM, Vex, EXx }, PREFIX_DATA },
5895 { "vpaddusw", { XM, Vex, EXx }, PREFIX_DATA },
5896 { "vpmaxub", { XM, Vex, EXx }, PREFIX_DATA },
5897 { "vpandn", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 5898 /* e0 */
7531c613
JB
5899 { "vpavgb", { XM, Vex, EXx }, PREFIX_DATA },
5900 { "vpsraw", { XM, Vex, EXxmm }, PREFIX_DATA },
5901 { "vpsrad", { XM, Vex, EXxmm }, PREFIX_DATA },
5902 { "vpavgw", { XM, Vex, EXx }, PREFIX_DATA },
5903 { "vpmulhuw", { XM, Vex, EXx }, PREFIX_DATA },
5904 { "vpmulhw", { XM, Vex, EXx }, PREFIX_DATA },
592a252b 5905 { PREFIX_TABLE (PREFIX_VEX_0FE6) },
7531c613 5906 { MOD_TABLE (MOD_VEX_0FE7) },
c0f3af97 5907 /* e8 */
7531c613
JB
5908 { "vpsubsb", { XM, Vex, EXx }, PREFIX_DATA },
5909 { "vpsubsw", { XM, Vex, EXx }, PREFIX_DATA },
5910 { "vpminsw", { XM, Vex, EXx }, PREFIX_DATA },
5911 { "vpor", { XM, Vex, EXx }, PREFIX_DATA },
5912 { "vpaddsb", { XM, Vex, EXx }, PREFIX_DATA },
5913 { "vpaddsw", { XM, Vex, EXx }, PREFIX_DATA },
5914 { "vpmaxsw", { XM, Vex, EXx }, PREFIX_DATA },
5915 { "vpxor", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 5916 /* f0 */
592a252b 5917 { PREFIX_TABLE (PREFIX_VEX_0FF0) },
7531c613
JB
5918 { "vpsllw", { XM, Vex, EXxmm }, PREFIX_DATA },
5919 { "vpslld", { XM, Vex, EXxmm }, PREFIX_DATA },
5920 { "vpsllq", { XM, Vex, EXxmm }, PREFIX_DATA },
5921 { "vpmuludq", { XM, Vex, EXx }, PREFIX_DATA },
5922 { "vpmaddwd", { XM, Vex, EXx }, PREFIX_DATA },
5923 { "vpsadbw", { XM, Vex, EXx }, PREFIX_DATA },
5924 { VEX_LEN_TABLE (VEX_LEN_0FF7) },
c0f3af97 5925 /* f8 */
7531c613
JB
5926 { "vpsubb", { XM, Vex, EXx }, PREFIX_DATA },
5927 { "vpsubw", { XM, Vex, EXx }, PREFIX_DATA },
5928 { "vpsubd", { XM, Vex, EXx }, PREFIX_DATA },
5929 { "vpsubq", { XM, Vex, EXx }, PREFIX_DATA },
5930 { "vpaddb", { XM, Vex, EXx }, PREFIX_DATA },
5931 { "vpaddw", { XM, Vex, EXx }, PREFIX_DATA },
5932 { "vpaddd", { XM, Vex, EXx }, PREFIX_DATA },
592d1631 5933 { Bad_Opcode },
c0f3af97
L
5934 },
5935 /* VEX_0F38 */
5936 {
5937 /* 00 */
7531c613
JB
5938 { "vpshufb", { XM, Vex, EXx }, PREFIX_DATA },
5939 { "vphaddw", { XM, Vex, EXx }, PREFIX_DATA },
5940 { "vphaddd", { XM, Vex, EXx }, PREFIX_DATA },
5941 { "vphaddsw", { XM, Vex, EXx }, PREFIX_DATA },
5942 { "vpmaddubsw", { XM, Vex, EXx }, PREFIX_DATA },
5943 { "vphsubw", { XM, Vex, EXx }, PREFIX_DATA },
5944 { "vphsubd", { XM, Vex, EXx }, PREFIX_DATA },
5945 { "vphsubsw", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 5946 /* 08 */
7531c613
JB
5947 { "vpsignb", { XM, Vex, EXx }, PREFIX_DATA },
5948 { "vpsignw", { XM, Vex, EXx }, PREFIX_DATA },
5949 { "vpsignd", { XM, Vex, EXx }, PREFIX_DATA },
5950 { "vpmulhrsw", { XM, Vex, EXx }, PREFIX_DATA },
5951 { VEX_W_TABLE (VEX_W_0F380C) },
5952 { VEX_W_TABLE (VEX_W_0F380D) },
5953 { VEX_W_TABLE (VEX_W_0F380E) },
5954 { VEX_W_TABLE (VEX_W_0F380F) },
c0f3af97 5955 /* 10 */
592d1631
L
5956 { Bad_Opcode },
5957 { Bad_Opcode },
5958 { Bad_Opcode },
7531c613 5959 { VEX_W_TABLE (VEX_W_0F3813) },
592d1631
L
5960 { Bad_Opcode },
5961 { Bad_Opcode },
7531c613
JB
5962 { VEX_LEN_TABLE (VEX_LEN_0F3816) },
5963 { "vptest", { XM, EXx }, PREFIX_DATA },
c0f3af97 5964 /* 18 */
7531c613
JB
5965 { VEX_W_TABLE (VEX_W_0F3818) },
5966 { VEX_LEN_TABLE (VEX_LEN_0F3819) },
5967 { MOD_TABLE (MOD_VEX_0F381A) },
592d1631 5968 { Bad_Opcode },
7531c613
JB
5969 { "vpabsb", { XM, EXx }, PREFIX_DATA },
5970 { "vpabsw", { XM, EXx }, PREFIX_DATA },
5971 { "vpabsd", { XM, EXx }, PREFIX_DATA },
592d1631 5972 { Bad_Opcode },
c0f3af97 5973 /* 20 */
7531c613
JB
5974 { "vpmovsxbw", { XM, EXxmmq }, PREFIX_DATA },
5975 { "vpmovsxbd", { XM, EXxmmqd }, PREFIX_DATA },
5976 { "vpmovsxbq", { XM, EXxmmdw }, PREFIX_DATA },
5977 { "vpmovsxwd", { XM, EXxmmq }, PREFIX_DATA },
5978 { "vpmovsxwq", { XM, EXxmmqd }, PREFIX_DATA },
5979 { "vpmovsxdq", { XM, EXxmmq }, PREFIX_DATA },
592d1631
L
5980 { Bad_Opcode },
5981 { Bad_Opcode },
c0f3af97 5982 /* 28 */
7531c613
JB
5983 { "vpmuldq", { XM, Vex, EXx }, PREFIX_DATA },
5984 { "vpcmpeqq", { XM, Vex, EXx }, PREFIX_DATA },
5985 { MOD_TABLE (MOD_VEX_0F382A) },
5986 { "vpackusdw", { XM, Vex, EXx }, PREFIX_DATA },
5987 { MOD_TABLE (MOD_VEX_0F382C) },
5988 { MOD_TABLE (MOD_VEX_0F382D) },
5989 { MOD_TABLE (MOD_VEX_0F382E) },
5990 { MOD_TABLE (MOD_VEX_0F382F) },
c0f3af97 5991 /* 30 */
7531c613
JB
5992 { "vpmovzxbw", { XM, EXxmmq }, PREFIX_DATA },
5993 { "vpmovzxbd", { XM, EXxmmqd }, PREFIX_DATA },
5994 { "vpmovzxbq", { XM, EXxmmdw }, PREFIX_DATA },
5995 { "vpmovzxwd", { XM, EXxmmq }, PREFIX_DATA },
5996 { "vpmovzxwq", { XM, EXxmmqd }, PREFIX_DATA },
5997 { "vpmovzxdq", { XM, EXxmmq }, PREFIX_DATA },
5998 { VEX_LEN_TABLE (VEX_LEN_0F3836) },
5999 { "vpcmpgtq", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6000 /* 38 */
7531c613
JB
6001 { "vpminsb", { XM, Vex, EXx }, PREFIX_DATA },
6002 { "vpminsd", { XM, Vex, EXx }, PREFIX_DATA },
6003 { "vpminuw", { XM, Vex, EXx }, PREFIX_DATA },
6004 { "vpminud", { XM, Vex, EXx }, PREFIX_DATA },
6005 { "vpmaxsb", { XM, Vex, EXx }, PREFIX_DATA },
6006 { "vpmaxsd", { XM, Vex, EXx }, PREFIX_DATA },
6007 { "vpmaxuw", { XM, Vex, EXx }, PREFIX_DATA },
6008 { "vpmaxud", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6009 /* 40 */
7531c613
JB
6010 { "vpmulld", { XM, Vex, EXx }, PREFIX_DATA },
6011 { VEX_LEN_TABLE (VEX_LEN_0F3841) },
592d1631
L
6012 { Bad_Opcode },
6013 { Bad_Opcode },
6014 { Bad_Opcode },
7531c613
JB
6015 { "vpsrlv%DQ", { XM, Vex, EXx }, PREFIX_DATA },
6016 { VEX_W_TABLE (VEX_W_0F3846) },
6017 { "vpsllv%DQ", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6018 /* 48 */
592d1631 6019 { Bad_Opcode },
260cd341 6020 { X86_64_TABLE (X86_64_VEX_0F3849) },
592d1631 6021 { Bad_Opcode },
260cd341 6022 { X86_64_TABLE (X86_64_VEX_0F384B) },
592d1631
L
6023 { Bad_Opcode },
6024 { Bad_Opcode },
6025 { Bad_Opcode },
6026 { Bad_Opcode },
c0f3af97 6027 /* 50 */
592d1631
L
6028 { Bad_Opcode },
6029 { Bad_Opcode },
6030 { Bad_Opcode },
6031 { Bad_Opcode },
6032 { Bad_Opcode },
6033 { Bad_Opcode },
6034 { Bad_Opcode },
6035 { Bad_Opcode },
c0f3af97 6036 /* 58 */
7531c613
JB
6037 { VEX_W_TABLE (VEX_W_0F3858) },
6038 { VEX_W_TABLE (VEX_W_0F3859) },
6039 { MOD_TABLE (MOD_VEX_0F385A) },
592d1631 6040 { Bad_Opcode },
260cd341 6041 { X86_64_TABLE (X86_64_VEX_0F385C) },
592d1631 6042 { Bad_Opcode },
260cd341 6043 { X86_64_TABLE (X86_64_VEX_0F385E) },
592d1631 6044 { Bad_Opcode },
c0f3af97 6045 /* 60 */
592d1631
L
6046 { Bad_Opcode },
6047 { Bad_Opcode },
6048 { Bad_Opcode },
6049 { Bad_Opcode },
6050 { Bad_Opcode },
6051 { Bad_Opcode },
6052 { Bad_Opcode },
6053 { Bad_Opcode },
c0f3af97 6054 /* 68 */
592d1631
L
6055 { Bad_Opcode },
6056 { Bad_Opcode },
6057 { Bad_Opcode },
6058 { Bad_Opcode },
6059 { Bad_Opcode },
6060 { Bad_Opcode },
6061 { Bad_Opcode },
6062 { Bad_Opcode },
c0f3af97 6063 /* 70 */
592d1631
L
6064 { Bad_Opcode },
6065 { Bad_Opcode },
6066 { Bad_Opcode },
6067 { Bad_Opcode },
6068 { Bad_Opcode },
6069 { Bad_Opcode },
6070 { Bad_Opcode },
6071 { Bad_Opcode },
c0f3af97 6072 /* 78 */
7531c613
JB
6073 { VEX_W_TABLE (VEX_W_0F3878) },
6074 { VEX_W_TABLE (VEX_W_0F3879) },
592d1631
L
6075 { Bad_Opcode },
6076 { Bad_Opcode },
6077 { Bad_Opcode },
6078 { Bad_Opcode },
6079 { Bad_Opcode },
6080 { Bad_Opcode },
c0f3af97 6081 /* 80 */
592d1631
L
6082 { Bad_Opcode },
6083 { Bad_Opcode },
6084 { Bad_Opcode },
6085 { Bad_Opcode },
6086 { Bad_Opcode },
6087 { Bad_Opcode },
6088 { Bad_Opcode },
6089 { Bad_Opcode },
c0f3af97 6090 /* 88 */
592d1631
L
6091 { Bad_Opcode },
6092 { Bad_Opcode },
6093 { Bad_Opcode },
6094 { Bad_Opcode },
7531c613 6095 { MOD_TABLE (MOD_VEX_0F388C) },
592d1631 6096 { Bad_Opcode },
7531c613 6097 { MOD_TABLE (MOD_VEX_0F388E) },
592d1631 6098 { Bad_Opcode },
c0f3af97 6099 /* 90 */
7531c613
JB
6100 { "vpgatherd%DQ", { XM, MVexVSIBDWpX, Vex }, PREFIX_DATA },
6101 { "vpgatherq%DQ", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, PREFIX_DATA },
6102 { "vgatherdp%XW", { XM, MVexVSIBDWpX, Vex }, PREFIX_DATA },
6103 { "vgatherqp%XW", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, PREFIX_DATA },
592d1631
L
6104 { Bad_Opcode },
6105 { Bad_Opcode },
7531c613
JB
6106 { "vfmaddsub132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6107 { "vfmsubadd132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6108 /* 98 */
7531c613
JB
6109 { "vfmadd132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6110 { "vfmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6111 { "vfmsub132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6112 { "vfmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6113 { "vfnmadd132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6114 { "vfnmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6115 { "vfnmsub132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6116 { "vfnmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
c0f3af97 6117 /* a0 */
592d1631
L
6118 { Bad_Opcode },
6119 { Bad_Opcode },
6120 { Bad_Opcode },
6121 { Bad_Opcode },
6122 { Bad_Opcode },
6123 { Bad_Opcode },
7531c613
JB
6124 { "vfmaddsub213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6125 { "vfmsubadd213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6126 /* a8 */
7531c613
JB
6127 { "vfmadd213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6128 { "vfmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6129 { "vfmsub213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6130 { "vfmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6131 { "vfnmadd213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6132 { "vfnmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6133 { "vfnmsub213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6134 { "vfnmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
c0f3af97 6135 /* b0 */
592d1631
L
6136 { Bad_Opcode },
6137 { Bad_Opcode },
6138 { Bad_Opcode },
6139 { Bad_Opcode },
6140 { Bad_Opcode },
6141 { Bad_Opcode },
7531c613
JB
6142 { "vfmaddsub231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6143 { "vfmsubadd231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6144 /* b8 */
7531c613
JB
6145 { "vfmadd231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6146 { "vfmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6147 { "vfmsub231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6148 { "vfmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6149 { "vfnmadd231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6150 { "vfnmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6151 { "vfnmsub231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6152 { "vfnmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
c0f3af97 6153 /* c0 */
592d1631
L
6154 { Bad_Opcode },
6155 { Bad_Opcode },
6156 { Bad_Opcode },
6157 { Bad_Opcode },
6158 { Bad_Opcode },
6159 { Bad_Opcode },
6160 { Bad_Opcode },
6161 { Bad_Opcode },
c0f3af97 6162 /* c8 */
592d1631
L
6163 { Bad_Opcode },
6164 { Bad_Opcode },
6165 { Bad_Opcode },
6166 { Bad_Opcode },
6167 { Bad_Opcode },
6168 { Bad_Opcode },
6169 { Bad_Opcode },
7531c613 6170 { VEX_W_TABLE (VEX_W_0F38CF) },
c0f3af97 6171 /* d0 */
592d1631
L
6172 { Bad_Opcode },
6173 { Bad_Opcode },
6174 { Bad_Opcode },
6175 { Bad_Opcode },
6176 { Bad_Opcode },
6177 { Bad_Opcode },
6178 { Bad_Opcode },
6179 { Bad_Opcode },
c0f3af97 6180 /* d8 */
592d1631
L
6181 { Bad_Opcode },
6182 { Bad_Opcode },
6183 { Bad_Opcode },
7531c613
JB
6184 { VEX_LEN_TABLE (VEX_LEN_0F38DB) },
6185 { "vaesenc", { XM, Vex, EXx }, PREFIX_DATA },
6186 { "vaesenclast", { XM, Vex, EXx }, PREFIX_DATA },
6187 { "vaesdec", { XM, Vex, EXx }, PREFIX_DATA },
6188 { "vaesdeclast", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6189 /* e0 */
592d1631
L
6190 { Bad_Opcode },
6191 { Bad_Opcode },
6192 { Bad_Opcode },
6193 { Bad_Opcode },
6194 { Bad_Opcode },
6195 { Bad_Opcode },
6196 { Bad_Opcode },
6197 { Bad_Opcode },
c0f3af97 6198 /* e8 */
592d1631
L
6199 { Bad_Opcode },
6200 { Bad_Opcode },
6201 { Bad_Opcode },
6202 { Bad_Opcode },
6203 { Bad_Opcode },
6204 { Bad_Opcode },
6205 { Bad_Opcode },
6206 { Bad_Opcode },
c0f3af97 6207 /* f0 */
592d1631
L
6208 { Bad_Opcode },
6209 { Bad_Opcode },
035e7389 6210 { VEX_LEN_TABLE (VEX_LEN_0F38F2) },
f12dc422 6211 { REG_TABLE (REG_VEX_0F38F3) },
592d1631 6212 { Bad_Opcode },
6c30d220
L
6213 { PREFIX_TABLE (PREFIX_VEX_0F38F5) },
6214 { PREFIX_TABLE (PREFIX_VEX_0F38F6) },
f12dc422 6215 { PREFIX_TABLE (PREFIX_VEX_0F38F7) },
c0f3af97 6216 /* f8 */
592d1631
L
6217 { Bad_Opcode },
6218 { Bad_Opcode },
6219 { Bad_Opcode },
6220 { Bad_Opcode },
6221 { Bad_Opcode },
6222 { Bad_Opcode },
6223 { Bad_Opcode },
6224 { Bad_Opcode },
c0f3af97
L
6225 },
6226 /* VEX_0F3A */
6227 {
6228 /* 00 */
7531c613
JB
6229 { VEX_LEN_TABLE (VEX_LEN_0F3A00) },
6230 { VEX_LEN_TABLE (VEX_LEN_0F3A01) },
6231 { VEX_W_TABLE (VEX_W_0F3A02) },
592d1631 6232 { Bad_Opcode },
7531c613
JB
6233 { VEX_W_TABLE (VEX_W_0F3A04) },
6234 { VEX_W_TABLE (VEX_W_0F3A05) },
6235 { VEX_LEN_TABLE (VEX_LEN_0F3A06) },
592d1631 6236 { Bad_Opcode },
c0f3af97 6237 /* 08 */
7531c613
JB
6238 { "vroundps", { XM, EXx, Ib }, PREFIX_DATA },
6239 { "vroundpd", { XM, EXx, Ib }, PREFIX_DATA },
6240 { "vroundss", { XMScalar, VexScalar, EXxmm_md, Ib }, PREFIX_DATA },
6241 { "vroundsd", { XMScalar, VexScalar, EXxmm_mq, Ib }, PREFIX_DATA },
6242 { "vblendps", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6243 { "vblendpd", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6244 { "vpblendw", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6245 { "vpalignr", { XM, Vex, EXx, Ib }, PREFIX_DATA },
c0f3af97 6246 /* 10 */
592d1631
L
6247 { Bad_Opcode },
6248 { Bad_Opcode },
6249 { Bad_Opcode },
6250 { Bad_Opcode },
7531c613
JB
6251 { VEX_LEN_TABLE (VEX_LEN_0F3A14) },
6252 { VEX_LEN_TABLE (VEX_LEN_0F3A15) },
6253 { VEX_LEN_TABLE (VEX_LEN_0F3A16) },
6254 { VEX_LEN_TABLE (VEX_LEN_0F3A17) },
c0f3af97 6255 /* 18 */
7531c613
JB
6256 { VEX_LEN_TABLE (VEX_LEN_0F3A18) },
6257 { VEX_LEN_TABLE (VEX_LEN_0F3A19) },
592d1631
L
6258 { Bad_Opcode },
6259 { Bad_Opcode },
6260 { Bad_Opcode },
7531c613 6261 { VEX_W_TABLE (VEX_W_0F3A1D) },
592d1631
L
6262 { Bad_Opcode },
6263 { Bad_Opcode },
c0f3af97 6264 /* 20 */
7531c613
JB
6265 { VEX_LEN_TABLE (VEX_LEN_0F3A20) },
6266 { VEX_LEN_TABLE (VEX_LEN_0F3A21) },
6267 { VEX_LEN_TABLE (VEX_LEN_0F3A22) },
592d1631
L
6268 { Bad_Opcode },
6269 { Bad_Opcode },
6270 { Bad_Opcode },
6271 { Bad_Opcode },
6272 { Bad_Opcode },
c0f3af97 6273 /* 28 */
592d1631
L
6274 { Bad_Opcode },
6275 { Bad_Opcode },
6276 { Bad_Opcode },
6277 { Bad_Opcode },
6278 { Bad_Opcode },
6279 { Bad_Opcode },
6280 { Bad_Opcode },
6281 { Bad_Opcode },
c0f3af97 6282 /* 30 */
7531c613
JB
6283 { VEX_LEN_TABLE (VEX_LEN_0F3A30) },
6284 { VEX_LEN_TABLE (VEX_LEN_0F3A31) },
6285 { VEX_LEN_TABLE (VEX_LEN_0F3A32) },
6286 { VEX_LEN_TABLE (VEX_LEN_0F3A33) },
592d1631
L
6287 { Bad_Opcode },
6288 { Bad_Opcode },
6289 { Bad_Opcode },
6290 { Bad_Opcode },
c0f3af97 6291 /* 38 */
7531c613
JB
6292 { VEX_LEN_TABLE (VEX_LEN_0F3A38) },
6293 { VEX_LEN_TABLE (VEX_LEN_0F3A39) },
592d1631
L
6294 { Bad_Opcode },
6295 { Bad_Opcode },
6296 { Bad_Opcode },
6297 { Bad_Opcode },
6298 { Bad_Opcode },
6299 { Bad_Opcode },
c0f3af97 6300 /* 40 */
7531c613
JB
6301 { "vdpps", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6302 { VEX_LEN_TABLE (VEX_LEN_0F3A41) },
6303 { "vmpsadbw", { XM, Vex, EXx, Ib }, PREFIX_DATA },
592d1631 6304 { Bad_Opcode },
7531c613 6305 { "vpclmulqdq", { XM, Vex, EXx, PCLMUL }, PREFIX_DATA },
592d1631 6306 { Bad_Opcode },
7531c613 6307 { VEX_LEN_TABLE (VEX_LEN_0F3A46) },
592d1631 6308 { Bad_Opcode },
c0f3af97 6309 /* 48 */
7531c613
JB
6310 { "vpermil2ps", { XM, Vex, EXx, XMVexI4, VexI4 }, PREFIX_DATA },
6311 { "vpermil2pd", { XM, Vex, EXx, XMVexI4, VexI4 }, PREFIX_DATA },
6312 { VEX_W_TABLE (VEX_W_0F3A4A) },
6313 { VEX_W_TABLE (VEX_W_0F3A4B) },
6314 { VEX_W_TABLE (VEX_W_0F3A4C) },
592d1631
L
6315 { Bad_Opcode },
6316 { Bad_Opcode },
6317 { Bad_Opcode },
c0f3af97 6318 /* 50 */
592d1631
L
6319 { Bad_Opcode },
6320 { Bad_Opcode },
6321 { Bad_Opcode },
6322 { Bad_Opcode },
6323 { Bad_Opcode },
6324 { Bad_Opcode },
6325 { Bad_Opcode },
6326 { Bad_Opcode },
c0f3af97 6327 /* 58 */
592d1631
L
6328 { Bad_Opcode },
6329 { Bad_Opcode },
6330 { Bad_Opcode },
6331 { Bad_Opcode },
7531c613
JB
6332 { "vfmaddsubps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6333 { "vfmaddsubpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6334 { "vfmsubaddps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6335 { "vfmsubaddpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
c0f3af97 6336 /* 60 */
7531c613
JB
6337 { VEX_LEN_TABLE (VEX_LEN_0F3A60) },
6338 { VEX_LEN_TABLE (VEX_LEN_0F3A61) },
6339 { VEX_LEN_TABLE (VEX_LEN_0F3A62) },
6340 { VEX_LEN_TABLE (VEX_LEN_0F3A63) },
592d1631
L
6341 { Bad_Opcode },
6342 { Bad_Opcode },
6343 { Bad_Opcode },
6344 { Bad_Opcode },
c0f3af97 6345 /* 68 */
7531c613
JB
6346 { "vfmaddps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6347 { "vfmaddpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6348 { "vfmaddss", { XMScalar, VexScalar, EXxmm_md, XMVexScalarI4 }, PREFIX_DATA },
6349 { "vfmaddsd", { XMScalar, VexScalar, EXxmm_mq, XMVexScalarI4 }, PREFIX_DATA },
6350 { "vfmsubps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6351 { "vfmsubpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6352 { "vfmsubss", { XMScalar, VexScalar, EXxmm_md, XMVexScalarI4 }, PREFIX_DATA },
6353 { "vfmsubsd", { XMScalar, VexScalar, EXxmm_mq, XMVexScalarI4 }, PREFIX_DATA },
c0f3af97 6354 /* 70 */
592d1631
L
6355 { Bad_Opcode },
6356 { Bad_Opcode },
6357 { Bad_Opcode },
6358 { Bad_Opcode },
6359 { Bad_Opcode },
6360 { Bad_Opcode },
6361 { Bad_Opcode },
6362 { Bad_Opcode },
c0f3af97 6363 /* 78 */
7531c613
JB
6364 { "vfnmaddps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6365 { "vfnmaddpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6366 { "vfnmaddss", { XMScalar, VexScalar, EXxmm_md, XMVexScalarI4 }, PREFIX_DATA },
6367 { "vfnmaddsd", { XMScalar, VexScalar, EXxmm_mq, XMVexScalarI4 }, PREFIX_DATA },
6368 { "vfnmsubps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6369 { "vfnmsubpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6370 { "vfnmsubss", { XMScalar, VexScalar, EXxmm_md, XMVexScalarI4 }, PREFIX_DATA },
6371 { "vfnmsubsd", { XMScalar, VexScalar, EXxmm_mq, XMVexScalarI4 }, PREFIX_DATA },
c0f3af97 6372 /* 80 */
592d1631
L
6373 { Bad_Opcode },
6374 { Bad_Opcode },
6375 { Bad_Opcode },
6376 { Bad_Opcode },
6377 { Bad_Opcode },
6378 { Bad_Opcode },
6379 { Bad_Opcode },
6380 { Bad_Opcode },
c0f3af97 6381 /* 88 */
592d1631
L
6382 { Bad_Opcode },
6383 { Bad_Opcode },
6384 { Bad_Opcode },
6385 { Bad_Opcode },
6386 { Bad_Opcode },
6387 { Bad_Opcode },
6388 { Bad_Opcode },
6389 { Bad_Opcode },
c0f3af97 6390 /* 90 */
592d1631
L
6391 { Bad_Opcode },
6392 { Bad_Opcode },
6393 { Bad_Opcode },
6394 { Bad_Opcode },
6395 { Bad_Opcode },
6396 { Bad_Opcode },
6397 { Bad_Opcode },
6398 { Bad_Opcode },
c0f3af97 6399 /* 98 */
592d1631
L
6400 { Bad_Opcode },
6401 { Bad_Opcode },
6402 { Bad_Opcode },
6403 { Bad_Opcode },
6404 { Bad_Opcode },
6405 { Bad_Opcode },
6406 { Bad_Opcode },
6407 { Bad_Opcode },
c0f3af97 6408 /* a0 */
592d1631
L
6409 { Bad_Opcode },
6410 { Bad_Opcode },
6411 { Bad_Opcode },
6412 { Bad_Opcode },
6413 { Bad_Opcode },
6414 { Bad_Opcode },
6415 { Bad_Opcode },
6416 { Bad_Opcode },
c0f3af97 6417 /* a8 */
592d1631
L
6418 { Bad_Opcode },
6419 { Bad_Opcode },
6420 { Bad_Opcode },
6421 { Bad_Opcode },
6422 { Bad_Opcode },
6423 { Bad_Opcode },
6424 { Bad_Opcode },
6425 { Bad_Opcode },
c0f3af97 6426 /* b0 */
592d1631
L
6427 { Bad_Opcode },
6428 { Bad_Opcode },
6429 { Bad_Opcode },
6430 { Bad_Opcode },
6431 { Bad_Opcode },
6432 { Bad_Opcode },
6433 { Bad_Opcode },
6434 { Bad_Opcode },
c0f3af97 6435 /* b8 */
592d1631
L
6436 { Bad_Opcode },
6437 { Bad_Opcode },
6438 { Bad_Opcode },
6439 { Bad_Opcode },
6440 { Bad_Opcode },
6441 { Bad_Opcode },
6442 { Bad_Opcode },
6443 { Bad_Opcode },
c0f3af97 6444 /* c0 */
592d1631
L
6445 { Bad_Opcode },
6446 { Bad_Opcode },
6447 { Bad_Opcode },
6448 { Bad_Opcode },
6449 { Bad_Opcode },
6450 { Bad_Opcode },
6451 { Bad_Opcode },
6452 { Bad_Opcode },
c0f3af97 6453 /* c8 */
592d1631
L
6454 { Bad_Opcode },
6455 { Bad_Opcode },
6456 { Bad_Opcode },
6457 { Bad_Opcode },
6458 { Bad_Opcode },
6459 { Bad_Opcode },
7531c613
JB
6460 { VEX_W_TABLE (VEX_W_0F3ACE) },
6461 { VEX_W_TABLE (VEX_W_0F3ACF) },
c0f3af97 6462 /* d0 */
592d1631
L
6463 { Bad_Opcode },
6464 { Bad_Opcode },
6465 { Bad_Opcode },
6466 { Bad_Opcode },
6467 { Bad_Opcode },
6468 { Bad_Opcode },
6469 { Bad_Opcode },
6470 { Bad_Opcode },
c0f3af97 6471 /* d8 */
592d1631
L
6472 { Bad_Opcode },
6473 { Bad_Opcode },
6474 { Bad_Opcode },
6475 { Bad_Opcode },
6476 { Bad_Opcode },
6477 { Bad_Opcode },
6478 { Bad_Opcode },
7531c613 6479 { VEX_LEN_TABLE (VEX_LEN_0F3ADF) },
c0f3af97 6480 /* e0 */
592d1631
L
6481 { Bad_Opcode },
6482 { Bad_Opcode },
6483 { Bad_Opcode },
6484 { Bad_Opcode },
6485 { Bad_Opcode },
6486 { Bad_Opcode },
6487 { Bad_Opcode },
6488 { Bad_Opcode },
c0f3af97 6489 /* e8 */
592d1631
L
6490 { Bad_Opcode },
6491 { Bad_Opcode },
6492 { Bad_Opcode },
6493 { Bad_Opcode },
6494 { Bad_Opcode },
6495 { Bad_Opcode },
6496 { Bad_Opcode },
6497 { Bad_Opcode },
c0f3af97 6498 /* f0 */
6c30d220 6499 { PREFIX_TABLE (PREFIX_VEX_0F3AF0) },
592d1631
L
6500 { Bad_Opcode },
6501 { Bad_Opcode },
6502 { Bad_Opcode },
6503 { Bad_Opcode },
6504 { Bad_Opcode },
6505 { Bad_Opcode },
6506 { Bad_Opcode },
c0f3af97 6507 /* f8 */
592d1631
L
6508 { Bad_Opcode },
6509 { Bad_Opcode },
6510 { Bad_Opcode },
6511 { Bad_Opcode },
6512 { Bad_Opcode },
6513 { Bad_Opcode },
6514 { Bad_Opcode },
6515 { Bad_Opcode },
c0f3af97
L
6516 },
6517};
6518
43234a1e 6519#include "i386-dis-evex.h"
ad692897 6520
c0f3af97 6521static const struct dis386 vex_len_table[][2] = {
18897deb 6522 /* VEX_LEN_0F12_P_0_M_0 / VEX_LEN_0F12_P_2_M_0 */
c0f3af97 6523 {
89e65d17 6524 { "vmovlpX", { XM, Vex, EXq }, 0 },
c0f3af97
L
6525 },
6526
592a252b 6527 /* VEX_LEN_0F12_P_0_M_1 */
c0f3af97 6528 {
89e65d17 6529 { "vmovhlps", { XM, Vex, EXq }, 0 },
c0f3af97
L
6530 },
6531
592a252b 6532 /* VEX_LEN_0F13_M_0 */
c0f3af97 6533 {
bf926894 6534 { "vmovlpX", { EXq, XM }, PREFIX_OPCODE },
c0f3af97
L
6535 },
6536
18897deb 6537 /* VEX_LEN_0F16_P_0_M_0 / VEX_LEN_0F16_P_2_M_0 */
c0f3af97 6538 {
89e65d17 6539 { "vmovhpX", { XM, Vex, EXq }, 0 },
c0f3af97
L
6540 },
6541
592a252b 6542 /* VEX_LEN_0F16_P_0_M_1 */
c0f3af97 6543 {
89e65d17 6544 { "vmovlhps", { XM, Vex, EXq }, 0 },
c0f3af97
L
6545 },
6546
592a252b 6547 /* VEX_LEN_0F17_M_0 */
c0f3af97 6548 {
bf926894 6549 { "vmovhpX", { EXq, XM }, PREFIX_OPCODE },
c0f3af97
L
6550 },
6551
43234a1e
L
6552 /* VEX_LEN_0F41_P_0 */
6553 {
6554 { Bad_Opcode },
6555 { VEX_W_TABLE (VEX_W_0F41_P_0_LEN_1) },
6556 },
1ba585e8
IT
6557 /* VEX_LEN_0F41_P_2 */
6558 {
6559 { Bad_Opcode },
6560 { VEX_W_TABLE (VEX_W_0F41_P_2_LEN_1) },
6561 },
43234a1e
L
6562 /* VEX_LEN_0F42_P_0 */
6563 {
6564 { Bad_Opcode },
6565 { VEX_W_TABLE (VEX_W_0F42_P_0_LEN_1) },
6566 },
1ba585e8
IT
6567 /* VEX_LEN_0F42_P_2 */
6568 {
6569 { Bad_Opcode },
6570 { VEX_W_TABLE (VEX_W_0F42_P_2_LEN_1) },
6571 },
43234a1e
L
6572 /* VEX_LEN_0F44_P_0 */
6573 {
6574 { VEX_W_TABLE (VEX_W_0F44_P_0_LEN_0) },
6575 },
1ba585e8
IT
6576 /* VEX_LEN_0F44_P_2 */
6577 {
6578 { VEX_W_TABLE (VEX_W_0F44_P_2_LEN_0) },
6579 },
43234a1e
L
6580 /* VEX_LEN_0F45_P_0 */
6581 {
6582 { Bad_Opcode },
6583 { VEX_W_TABLE (VEX_W_0F45_P_0_LEN_1) },
6584 },
1ba585e8
IT
6585 /* VEX_LEN_0F45_P_2 */
6586 {
6587 { Bad_Opcode },
6588 { VEX_W_TABLE (VEX_W_0F45_P_2_LEN_1) },
6589 },
43234a1e
L
6590 /* VEX_LEN_0F46_P_0 */
6591 {
6592 { Bad_Opcode },
6593 { VEX_W_TABLE (VEX_W_0F46_P_0_LEN_1) },
6594 },
1ba585e8
IT
6595 /* VEX_LEN_0F46_P_2 */
6596 {
6597 { Bad_Opcode },
6598 { VEX_W_TABLE (VEX_W_0F46_P_2_LEN_1) },
6599 },
43234a1e
L
6600 /* VEX_LEN_0F47_P_0 */
6601 {
6602 { Bad_Opcode },
6603 { VEX_W_TABLE (VEX_W_0F47_P_0_LEN_1) },
6604 },
1ba585e8
IT
6605 /* VEX_LEN_0F47_P_2 */
6606 {
6607 { Bad_Opcode },
6608 { VEX_W_TABLE (VEX_W_0F47_P_2_LEN_1) },
6609 },
6610 /* VEX_LEN_0F4A_P_0 */
6611 {
6612 { Bad_Opcode },
6613 { VEX_W_TABLE (VEX_W_0F4A_P_0_LEN_1) },
6614 },
6615 /* VEX_LEN_0F4A_P_2 */
6616 {
6617 { Bad_Opcode },
6618 { VEX_W_TABLE (VEX_W_0F4A_P_2_LEN_1) },
6619 },
6620 /* VEX_LEN_0F4B_P_0 */
6621 {
6622 { Bad_Opcode },
6623 { VEX_W_TABLE (VEX_W_0F4B_P_0_LEN_1) },
6624 },
43234a1e
L
6625 /* VEX_LEN_0F4B_P_2 */
6626 {
6627 { Bad_Opcode },
6628 { VEX_W_TABLE (VEX_W_0F4B_P_2_LEN_1) },
6629 },
6630
7531c613 6631 /* VEX_LEN_0F6E */
c0f3af97 6632 {
7531c613 6633 { "vmovK", { XMScalar, Edq }, PREFIX_DATA },
c0f3af97
L
6634 },
6635
035e7389 6636 /* VEX_LEN_0F77 */
c0f3af97 6637 {
ec6f095a
L
6638 { "vzeroupper", { XX }, 0 },
6639 { "vzeroall", { XX }, 0 },
c0f3af97
L
6640 },
6641
ec6f095a 6642 /* VEX_LEN_0F7E_P_1 */
c0f3af97 6643 {
5b872f7d 6644 { "vmovq", { XMScalar, EXxmm_mq }, 0 },
c0f3af97
L
6645 },
6646
ec6f095a 6647 /* VEX_LEN_0F7E_P_2 */
c0f3af97 6648 {
ec6f095a 6649 { "vmovK", { Edq, XMScalar }, 0 },
c0f3af97
L
6650 },
6651
ec6f095a 6652 /* VEX_LEN_0F90_P_0 */
c0f3af97 6653 {
ec6f095a 6654 { VEX_W_TABLE (VEX_W_0F90_P_0_LEN_0) },
c0f3af97
L
6655 },
6656
ec6f095a 6657 /* VEX_LEN_0F90_P_2 */
c0f3af97 6658 {
ec6f095a 6659 { VEX_W_TABLE (VEX_W_0F90_P_2_LEN_0) },
c0f3af97
L
6660 },
6661
ec6f095a 6662 /* VEX_LEN_0F91_P_0 */
c0f3af97 6663 {
ec6f095a 6664 { VEX_W_TABLE (VEX_W_0F91_P_0_LEN_0) },
c0f3af97
L
6665 },
6666
ec6f095a 6667 /* VEX_LEN_0F91_P_2 */
c0f3af97 6668 {
ec6f095a 6669 { VEX_W_TABLE (VEX_W_0F91_P_2_LEN_0) },
c0f3af97
L
6670 },
6671
ec6f095a 6672 /* VEX_LEN_0F92_P_0 */
c0f3af97 6673 {
ec6f095a 6674 { VEX_W_TABLE (VEX_W_0F92_P_0_LEN_0) },
c0f3af97
L
6675 },
6676
ec6f095a 6677 /* VEX_LEN_0F92_P_2 */
c0f3af97 6678 {
ec6f095a 6679 { VEX_W_TABLE (VEX_W_0F92_P_2_LEN_0) },
c0f3af97
L
6680 },
6681
ec6f095a 6682 /* VEX_LEN_0F92_P_3 */
c0f3af97 6683 {
58a211d2 6684 { MOD_TABLE (MOD_VEX_0F92_P_3_LEN_0) },
c0f3af97
L
6685 },
6686
ec6f095a 6687 /* VEX_LEN_0F93_P_0 */
c0f3af97 6688 {
ec6f095a 6689 { VEX_W_TABLE (VEX_W_0F93_P_0_LEN_0) },
c0f3af97
L
6690 },
6691
ec6f095a 6692 /* VEX_LEN_0F93_P_2 */
c0f3af97 6693 {
ec6f095a 6694 { VEX_W_TABLE (VEX_W_0F93_P_2_LEN_0) },
c0f3af97
L
6695 },
6696
ec6f095a 6697 /* VEX_LEN_0F93_P_3 */
c0f3af97 6698 {
58a211d2 6699 { MOD_TABLE (MOD_VEX_0F93_P_3_LEN_0) },
c0f3af97
L
6700 },
6701
ec6f095a 6702 /* VEX_LEN_0F98_P_0 */
43234a1e
L
6703 {
6704 { VEX_W_TABLE (VEX_W_0F98_P_0_LEN_0) },
6705 },
6706
1ba585e8
IT
6707 /* VEX_LEN_0F98_P_2 */
6708 {
6709 { VEX_W_TABLE (VEX_W_0F98_P_2_LEN_0) },
6710 },
6711
6712 /* VEX_LEN_0F99_P_0 */
6713 {
6714 { VEX_W_TABLE (VEX_W_0F99_P_0_LEN_0) },
6715 },
6716
6717 /* VEX_LEN_0F99_P_2 */
6718 {
6719 { VEX_W_TABLE (VEX_W_0F99_P_2_LEN_0) },
6720 },
6721
6c30d220 6722 /* VEX_LEN_0FAE_R_2_M_0 */
c0f3af97 6723 {
ec6f095a 6724 { "vldmxcsr", { Md }, 0 },
c0f3af97
L
6725 },
6726
6c30d220 6727 /* VEX_LEN_0FAE_R_3_M_0 */
c0f3af97 6728 {
ec6f095a 6729 { "vstmxcsr", { Md }, 0 },
c0f3af97
L
6730 },
6731
7531c613 6732 /* VEX_LEN_0FC4 */
c0f3af97 6733 {
7531c613 6734 { "vpinsrw", { XM, Vex, Edqw, Ib }, PREFIX_DATA },
c0f3af97
L
6735 },
6736
7531c613 6737 /* VEX_LEN_0FC5 */
c0f3af97 6738 {
7531c613 6739 { "vpextrw", { Gdq, XS, Ib }, PREFIX_DATA },
c0f3af97
L
6740 },
6741
7531c613 6742 /* VEX_LEN_0FD6 */
c0f3af97 6743 {
7531c613 6744 { "vmovq", { EXqS, XMScalar }, PREFIX_DATA },
c0f3af97
L
6745 },
6746
7531c613 6747 /* VEX_LEN_0FF7 */
c0f3af97 6748 {
7531c613 6749 { "vmaskmovdqu", { XM, XS }, PREFIX_DATA },
c0f3af97
L
6750 },
6751
7531c613 6752 /* VEX_LEN_0F3816 */
c0f3af97 6753 {
6c30d220 6754 { Bad_Opcode },
7531c613 6755 { VEX_W_TABLE (VEX_W_0F3816_L_1) },
c0f3af97
L
6756 },
6757
7531c613 6758 /* VEX_LEN_0F3819 */
c0f3af97 6759 {
6c30d220 6760 { Bad_Opcode },
7531c613 6761 { VEX_W_TABLE (VEX_W_0F3819_L_1) },
c0f3af97
L
6762 },
6763
7531c613 6764 /* VEX_LEN_0F381A_M_0 */
c0f3af97 6765 {
6c30d220 6766 { Bad_Opcode },
7531c613 6767 { VEX_W_TABLE (VEX_W_0F381A_M_0_L_1) },
c0f3af97
L
6768 },
6769
7531c613 6770 /* VEX_LEN_0F3836 */
c0f3af97 6771 {
6c30d220 6772 { Bad_Opcode },
7531c613 6773 { VEX_W_TABLE (VEX_W_0F3836) },
c0f3af97
L
6774 },
6775
7531c613 6776 /* VEX_LEN_0F3841 */
c0f3af97 6777 {
7531c613 6778 { "vphminposuw", { XM, EXx }, PREFIX_DATA },
c0f3af97
L
6779 },
6780
260cd341
LC
6781 /* VEX_LEN_0F3849_X86_64_P_0_W_0_M_0 */
6782 {
6783 { "ldtilecfg", { M }, 0 },
6784 },
6785
6786 /* VEX_LEN_0F3849_X86_64_P_0_W_0_M_1_REG_0_RM_0 */
6787 {
6788 { "tilerelease", { Skip_MODRM }, 0 },
6789 },
6790
6791 /* VEX_LEN_0F3849_X86_64_P_2_W_0_M_0 */
6792 {
6793 { "sttilecfg", { M }, 0 },
6794 },
6795
6796 /* VEX_LEN_0F3849_X86_64_P_3_W_0_M_0 */
6797 {
6798 { "tilezero", { TMM, Skip_MODRM }, 0 },
6799 },
6800
6801 /* VEX_LEN_0F384B_X86_64_P_1_W_0_M_0 */
6802 {
6803 { "tilestored", { MVexSIBMEM, TMM }, 0 },
6804 },
6805 /* VEX_LEN_0F384B_X86_64_P_2_W_0_M_0 */
6806 {
6807 { "tileloaddt1", { TMM, MVexSIBMEM }, 0 },
6808 },
6809
6810 /* VEX_LEN_0F384B_X86_64_P_3_W_0_M_0 */
6811 {
6812 { "tileloadd", { TMM, MVexSIBMEM }, 0 },
6813 },
6814
7531c613 6815 /* VEX_LEN_0F385A_M_0 */
6c30d220
L
6816 {
6817 { Bad_Opcode },
7531c613 6818 { VEX_W_TABLE (VEX_W_0F385A_M_0_L_0) },
6c30d220
L
6819 },
6820
260cd341
LC
6821 /* VEX_LEN_0F385C_X86_64_P_1_W_0_M_0 */
6822 {
6823 { "tdpbf16ps", { TMM, EXtmm, VexTmm }, 0 },
6824 },
6825
6826 /* VEX_LEN_0F385E_X86_64_P_0_W_0_M_0 */
6827 {
6828 { "tdpbuud", {TMM, EXtmm, VexTmm }, 0 },
6829 },
6830
6831 /* VEX_LEN_0F385E_X86_64_P_1_W_0_M_0 */
6832 {
6833 { "tdpbsud", {TMM, EXtmm, VexTmm }, 0 },
6834 },
6835
6836 /* VEX_LEN_0F385E_X86_64_P_2_W_0_M_0 */
6837 {
6838 { "tdpbusd", {TMM, EXtmm, VexTmm }, 0 },
6839 },
6840
6841 /* VEX_LEN_0F385E_X86_64_P_3_W_0_M_0 */
6842 {
6843 { "tdpbssd", {TMM, EXtmm, VexTmm }, 0 },
6844 },
6845
7531c613 6846 /* VEX_LEN_0F38DB */
a5ff0eb2 6847 {
7531c613 6848 { "vaesimc", { XM, EXx }, PREFIX_DATA },
a5ff0eb2
L
6849 },
6850
035e7389 6851 /* VEX_LEN_0F38F2 */
f12dc422 6852 {
035e7389 6853 { "andnS", { Gdq, VexGdq, Edq }, PREFIX_OPCODE },
f12dc422
L
6854 },
6855
035e7389 6856 /* VEX_LEN_0F38F3_R_1 */
f12dc422 6857 {
035e7389 6858 { "blsrS", { VexGdq, Edq }, PREFIX_OPCODE },
f12dc422
L
6859 },
6860
035e7389 6861 /* VEX_LEN_0F38F3_R_2 */
f12dc422 6862 {
035e7389 6863 { "blsmskS", { VexGdq, Edq }, PREFIX_OPCODE },
f12dc422
L
6864 },
6865
035e7389 6866 /* VEX_LEN_0F38F3_R_3 */
f12dc422 6867 {
035e7389 6868 { "blsiS", { VexGdq, Edq }, PREFIX_OPCODE },
f12dc422
L
6869 },
6870
6c30d220
L
6871 /* VEX_LEN_0F38F5_P_0 */
6872 {
bf890a93 6873 { "bzhiS", { Gdq, Edq, VexGdq }, 0 },
6c30d220
L
6874 },
6875
6876 /* VEX_LEN_0F38F5_P_1 */
6877 {
bf890a93 6878 { "pextS", { Gdq, VexGdq, Edq }, 0 },
6c30d220
L
6879 },
6880
6881 /* VEX_LEN_0F38F5_P_3 */
6882 {
bf890a93 6883 { "pdepS", { Gdq, VexGdq, Edq }, 0 },
6c30d220
L
6884 },
6885
6886 /* VEX_LEN_0F38F6_P_3 */
6887 {
bf890a93 6888 { "mulxS", { Gdq, VexGdq, Edq }, 0 },
6c30d220
L
6889 },
6890
f12dc422
L
6891 /* VEX_LEN_0F38F7_P_0 */
6892 {
bf890a93 6893 { "bextrS", { Gdq, Edq, VexGdq }, 0 },
f12dc422
L
6894 },
6895
6c30d220
L
6896 /* VEX_LEN_0F38F7_P_1 */
6897 {
bf890a93 6898 { "sarxS", { Gdq, Edq, VexGdq }, 0 },
6c30d220
L
6899 },
6900
6901 /* VEX_LEN_0F38F7_P_2 */
6902 {
bf890a93 6903 { "shlxS", { Gdq, Edq, VexGdq }, 0 },
6c30d220
L
6904 },
6905
6906 /* VEX_LEN_0F38F7_P_3 */
6907 {
bf890a93 6908 { "shrxS", { Gdq, Edq, VexGdq }, 0 },
6c30d220
L
6909 },
6910
7531c613 6911 /* VEX_LEN_0F3A00 */
6c30d220
L
6912 {
6913 { Bad_Opcode },
7531c613 6914 { VEX_W_TABLE (VEX_W_0F3A00_L_1) },
6c30d220
L
6915 },
6916
7531c613 6917 /* VEX_LEN_0F3A01 */
6c30d220
L
6918 {
6919 { Bad_Opcode },
7531c613 6920 { VEX_W_TABLE (VEX_W_0F3A01_L_1) },
6c30d220
L
6921 },
6922
7531c613 6923 /* VEX_LEN_0F3A06 */
c0f3af97 6924 {
592d1631 6925 { Bad_Opcode },
7531c613 6926 { VEX_W_TABLE (VEX_W_0F3A06_L_1) },
c0f3af97
L
6927 },
6928
7531c613 6929 /* VEX_LEN_0F3A14 */
c0f3af97 6930 {
7531c613 6931 { "vpextrb", { Edqb, XM, Ib }, PREFIX_DATA },
c0f3af97
L
6932 },
6933
7531c613 6934 /* VEX_LEN_0F3A15 */
c0f3af97 6935 {
7531c613 6936 { "vpextrw", { Edqw, XM, Ib }, PREFIX_DATA },
c0f3af97
L
6937 },
6938
7531c613 6939 /* VEX_LEN_0F3A16 */
c0f3af97 6940 {
7531c613 6941 { "vpextrK", { Edq, XM, Ib }, PREFIX_DATA },
c0f3af97
L
6942 },
6943
7531c613 6944 /* VEX_LEN_0F3A17 */
c0f3af97 6945 {
7531c613 6946 { "vextractps", { Edqd, XM, Ib }, PREFIX_DATA },
c0f3af97
L
6947 },
6948
7531c613 6949 /* VEX_LEN_0F3A18 */
c0f3af97 6950 {
592d1631 6951 { Bad_Opcode },
7531c613 6952 { VEX_W_TABLE (VEX_W_0F3A18_L_1) },
c0f3af97
L
6953 },
6954
7531c613 6955 /* VEX_LEN_0F3A19 */
c0f3af97 6956 {
592d1631 6957 { Bad_Opcode },
7531c613 6958 { VEX_W_TABLE (VEX_W_0F3A19_L_1) },
c0f3af97
L
6959 },
6960
7531c613 6961 /* VEX_LEN_0F3A20 */
c0f3af97 6962 {
7531c613 6963 { "vpinsrb", { XM, Vex, Edqb, Ib }, PREFIX_DATA },
c0f3af97
L
6964 },
6965
7531c613 6966 /* VEX_LEN_0F3A21 */
c0f3af97 6967 {
7531c613 6968 { "vinsertps", { XM, Vex, EXd, Ib }, PREFIX_DATA },
c0f3af97
L
6969 },
6970
7531c613 6971 /* VEX_LEN_0F3A22 */
c0f3af97 6972 {
7531c613 6973 { "vpinsrK", { XM, Vex, Edq, Ib }, PREFIX_DATA },
c0f3af97
L
6974 },
6975
7531c613 6976 /* VEX_LEN_0F3A30 */
43234a1e 6977 {
bb5b3501 6978 { MOD_TABLE (MOD_VEX_0F3A30_L_0) },
43234a1e
L
6979 },
6980
7531c613 6981 /* VEX_LEN_0F3A31 */
1ba585e8 6982 {
bb5b3501 6983 { MOD_TABLE (MOD_VEX_0F3A31_L_0) },
1ba585e8
IT
6984 },
6985
7531c613 6986 /* VEX_LEN_0F3A32 */
43234a1e 6987 {
bb5b3501 6988 { MOD_TABLE (MOD_VEX_0F3A32_L_0) },
43234a1e
L
6989 },
6990
7531c613 6991 /* VEX_LEN_0F3A33 */
1ba585e8 6992 {
bb5b3501 6993 { MOD_TABLE (MOD_VEX_0F3A33_L_0) },
1ba585e8
IT
6994 },
6995
7531c613 6996 /* VEX_LEN_0F3A38 */
c0f3af97 6997 {
6c30d220 6998 { Bad_Opcode },
7531c613 6999 { VEX_W_TABLE (VEX_W_0F3A38_L_1) },
c0f3af97
L
7000 },
7001
7531c613 7002 /* VEX_LEN_0F3A39 */
c0f3af97 7003 {
6c30d220 7004 { Bad_Opcode },
7531c613 7005 { VEX_W_TABLE (VEX_W_0F3A39_L_1) },
6c30d220
L
7006 },
7007
7531c613 7008 /* VEX_LEN_0F3A41 */
6c30d220 7009 {
7531c613 7010 { "vdppd", { XM, Vex, EXx, Ib }, PREFIX_DATA },
c0f3af97
L
7011 },
7012
7531c613 7013 /* VEX_LEN_0F3A46 */
c0f3af97 7014 {
6c30d220 7015 { Bad_Opcode },
7531c613 7016 { VEX_W_TABLE (VEX_W_0F3A46_L_1) },
c0f3af97
L
7017 },
7018
7531c613 7019 /* VEX_LEN_0F3A60 */
c0f3af97 7020 {
7531c613 7021 { "vpcmpestrm!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
c0f3af97
L
7022 },
7023
7531c613 7024 /* VEX_LEN_0F3A61 */
c0f3af97 7025 {
7531c613 7026 { "vpcmpestri!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
c0f3af97
L
7027 },
7028
7531c613 7029 /* VEX_LEN_0F3A62 */
c0f3af97 7030 {
7531c613 7031 { "vpcmpistrm", { XM, EXx, Ib }, PREFIX_DATA },
c0f3af97
L
7032 },
7033
7531c613 7034 /* VEX_LEN_0F3A63 */
c0f3af97 7035 {
7531c613 7036 { "vpcmpistri", { XM, EXx, Ib }, PREFIX_DATA },
c0f3af97
L
7037 },
7038
7531c613 7039 /* VEX_LEN_0F3ADF */
a5ff0eb2 7040 {
7531c613 7041 { "vaeskeygenassist", { XM, EXx, Ib }, PREFIX_DATA },
a5ff0eb2 7042 },
4c807e72 7043
6c30d220
L
7044 /* VEX_LEN_0F3AF0_P_3 */
7045 {
bf890a93 7046 { "rorxS", { Gdq, Edq, Ib }, 0 },
6c30d220
L
7047 },
7048
467bbef0
JB
7049 /* VEX_LEN_0FXOP_08_85 */
7050 {
7051 { VEX_W_TABLE (VEX_W_0FXOP_08_85_L_0) },
7052 },
7053
7054 /* VEX_LEN_0FXOP_08_86 */
7055 {
7056 { VEX_W_TABLE (VEX_W_0FXOP_08_86_L_0) },
7057 },
7058
7059 /* VEX_LEN_0FXOP_08_87 */
7060 {
7061 { VEX_W_TABLE (VEX_W_0FXOP_08_87_L_0) },
7062 },
7063
7064 /* VEX_LEN_0FXOP_08_8E */
7065 {
7066 { VEX_W_TABLE (VEX_W_0FXOP_08_8E_L_0) },
7067 },
7068
7069 /* VEX_LEN_0FXOP_08_8F */
7070 {
7071 { VEX_W_TABLE (VEX_W_0FXOP_08_8F_L_0) },
7072 },
7073
7074 /* VEX_LEN_0FXOP_08_95 */
7075 {
7076 { VEX_W_TABLE (VEX_W_0FXOP_08_95_L_0) },
7077 },
7078
7079 /* VEX_LEN_0FXOP_08_96 */
7080 {
7081 { VEX_W_TABLE (VEX_W_0FXOP_08_96_L_0) },
7082 },
7083
7084 /* VEX_LEN_0FXOP_08_97 */
7085 {
7086 { VEX_W_TABLE (VEX_W_0FXOP_08_97_L_0) },
7087 },
7088
7089 /* VEX_LEN_0FXOP_08_9E */
7090 {
7091 { VEX_W_TABLE (VEX_W_0FXOP_08_9E_L_0) },
7092 },
7093
7094 /* VEX_LEN_0FXOP_08_9F */
7095 {
7096 { VEX_W_TABLE (VEX_W_0FXOP_08_9F_L_0) },
7097 },
7098
7099 /* VEX_LEN_0FXOP_08_A3 */
7100 {
7101 { "vpperm", { XM, Vex, EXx, XMVexI4 }, 0 },
7102 },
7103
7104 /* VEX_LEN_0FXOP_08_A6 */
7105 {
7106 { VEX_W_TABLE (VEX_W_0FXOP_08_A6_L_0) },
7107 },
7108
7109 /* VEX_LEN_0FXOP_08_B6 */
7110 {
7111 { VEX_W_TABLE (VEX_W_0FXOP_08_B6_L_0) },
7112 },
7113
7114 /* VEX_LEN_0FXOP_08_C0 */
7115 {
7116 { VEX_W_TABLE (VEX_W_0FXOP_08_C0_L_0) },
7117 },
7118
7119 /* VEX_LEN_0FXOP_08_C1 */
7120 {
7121 { VEX_W_TABLE (VEX_W_0FXOP_08_C1_L_0) },
7122 },
7123
7124 /* VEX_LEN_0FXOP_08_C2 */
7125 {
7126 { VEX_W_TABLE (VEX_W_0FXOP_08_C2_L_0) },
7127 },
7128
7129 /* VEX_LEN_0FXOP_08_C3 */
7130 {
7131 { VEX_W_TABLE (VEX_W_0FXOP_08_C3_L_0) },
7132 },
7133
ff688e1f
L
7134 /* VEX_LEN_0FXOP_08_CC */
7135 {
467bbef0 7136 { VEX_W_TABLE (VEX_W_0FXOP_08_CC_L_0) },
ff688e1f
L
7137 },
7138
7139 /* VEX_LEN_0FXOP_08_CD */
7140 {
467bbef0 7141 { VEX_W_TABLE (VEX_W_0FXOP_08_CD_L_0) },
ff688e1f
L
7142 },
7143
7144 /* VEX_LEN_0FXOP_08_CE */
7145 {
467bbef0 7146 { VEX_W_TABLE (VEX_W_0FXOP_08_CE_L_0) },
ff688e1f
L
7147 },
7148
7149 /* VEX_LEN_0FXOP_08_CF */
7150 {
467bbef0 7151 { VEX_W_TABLE (VEX_W_0FXOP_08_CF_L_0) },
ff688e1f
L
7152 },
7153
7154 /* VEX_LEN_0FXOP_08_EC */
7155 {
467bbef0 7156 { VEX_W_TABLE (VEX_W_0FXOP_08_EC_L_0) },
ff688e1f
L
7157 },
7158
7159 /* VEX_LEN_0FXOP_08_ED */
7160 {
467bbef0 7161 { VEX_W_TABLE (VEX_W_0FXOP_08_ED_L_0) },
ff688e1f
L
7162 },
7163
7164 /* VEX_LEN_0FXOP_08_EE */
7165 {
467bbef0 7166 { VEX_W_TABLE (VEX_W_0FXOP_08_EE_L_0) },
ff688e1f
L
7167 },
7168
7169 /* VEX_LEN_0FXOP_08_EF */
7170 {
467bbef0
JB
7171 { VEX_W_TABLE (VEX_W_0FXOP_08_EF_L_0) },
7172 },
7173
7174 /* VEX_LEN_0FXOP_09_01 */
7175 {
7176 { REG_TABLE (REG_0FXOP_09_01_L_0) },
7177 },
7178
7179 /* VEX_LEN_0FXOP_09_02 */
7180 {
7181 { REG_TABLE (REG_0FXOP_09_02_L_0) },
7182 },
7183
7184 /* VEX_LEN_0FXOP_09_12_M_1 */
7185 {
7186 { REG_TABLE (REG_0FXOP_09_12_M_1_L_0) },
ff688e1f
L
7187 },
7188
b5b098c2 7189 /* VEX_LEN_0FXOP_09_82_W_0 */
5dd85c99 7190 {
b5b098c2 7191 { "vfrczss", { XM, EXd }, 0 },
5dd85c99 7192 },
4c807e72 7193
b5b098c2 7194 /* VEX_LEN_0FXOP_09_83_W_0 */
5dd85c99 7195 {
b5b098c2 7196 { "vfrczsd", { XM, EXq }, 0 },
5dd85c99 7197 },
467bbef0
JB
7198
7199 /* VEX_LEN_0FXOP_09_90 */
7200 {
7201 { "vprotb", { XM, EXx, VexW }, 0 },
7202 },
7203
7204 /* VEX_LEN_0FXOP_09_91 */
7205 {
7206 { "vprotw", { XM, EXx, VexW }, 0 },
7207 },
7208
7209 /* VEX_LEN_0FXOP_09_92 */
7210 {
7211 { "vprotd", { XM, EXx, VexW }, 0 },
7212 },
7213
7214 /* VEX_LEN_0FXOP_09_93 */
7215 {
7216 { "vprotq", { XM, EXx, VexW }, 0 },
7217 },
7218
7219 /* VEX_LEN_0FXOP_09_94 */
7220 {
7221 { "vpshlb", { XM, EXx, VexW }, 0 },
7222 },
7223
7224 /* VEX_LEN_0FXOP_09_95 */
7225 {
7226 { "vpshlw", { XM, EXx, VexW }, 0 },
7227 },
7228
7229 /* VEX_LEN_0FXOP_09_96 */
7230 {
7231 { "vpshld", { XM, EXx, VexW }, 0 },
7232 },
7233
7234 /* VEX_LEN_0FXOP_09_97 */
7235 {
7236 { "vpshlq", { XM, EXx, VexW }, 0 },
7237 },
7238
7239 /* VEX_LEN_0FXOP_09_98 */
7240 {
7241 { "vpshab", { XM, EXx, VexW }, 0 },
7242 },
7243
7244 /* VEX_LEN_0FXOP_09_99 */
7245 {
7246 { "vpshaw", { XM, EXx, VexW }, 0 },
7247 },
7248
7249 /* VEX_LEN_0FXOP_09_9A */
7250 {
7251 { "vpshad", { XM, EXx, VexW }, 0 },
7252 },
7253
7254 /* VEX_LEN_0FXOP_09_9B */
7255 {
7256 { "vpshaq", { XM, EXx, VexW }, 0 },
7257 },
7258
7259 /* VEX_LEN_0FXOP_09_C1 */
7260 {
7261 { VEX_W_TABLE (VEX_W_0FXOP_09_C1_L_0) },
7262 },
7263
7264 /* VEX_LEN_0FXOP_09_C2 */
7265 {
7266 { VEX_W_TABLE (VEX_W_0FXOP_09_C2_L_0) },
7267 },
7268
7269 /* VEX_LEN_0FXOP_09_C3 */
7270 {
7271 { VEX_W_TABLE (VEX_W_0FXOP_09_C3_L_0) },
7272 },
7273
7274 /* VEX_LEN_0FXOP_09_C6 */
7275 {
7276 { VEX_W_TABLE (VEX_W_0FXOP_09_C6_L_0) },
7277 },
7278
7279 /* VEX_LEN_0FXOP_09_C7 */
7280 {
7281 { VEX_W_TABLE (VEX_W_0FXOP_09_C7_L_0) },
7282 },
7283
7284 /* VEX_LEN_0FXOP_09_CB */
7285 {
7286 { VEX_W_TABLE (VEX_W_0FXOP_09_CB_L_0) },
7287 },
7288
7289 /* VEX_LEN_0FXOP_09_D1 */
7290 {
7291 { VEX_W_TABLE (VEX_W_0FXOP_09_D1_L_0) },
7292 },
7293
7294 /* VEX_LEN_0FXOP_09_D2 */
7295 {
7296 { VEX_W_TABLE (VEX_W_0FXOP_09_D2_L_0) },
7297 },
7298
7299 /* VEX_LEN_0FXOP_09_D3 */
7300 {
7301 { VEX_W_TABLE (VEX_W_0FXOP_09_D3_L_0) },
7302 },
7303
7304 /* VEX_LEN_0FXOP_09_D6 */
7305 {
7306 { VEX_W_TABLE (VEX_W_0FXOP_09_D6_L_0) },
7307 },
7308
7309 /* VEX_LEN_0FXOP_09_D7 */
7310 {
7311 { VEX_W_TABLE (VEX_W_0FXOP_09_D7_L_0) },
7312 },
7313
7314 /* VEX_LEN_0FXOP_09_DB */
7315 {
7316 { VEX_W_TABLE (VEX_W_0FXOP_09_DB_L_0) },
7317 },
7318
7319 /* VEX_LEN_0FXOP_09_E1 */
7320 {
7321 { VEX_W_TABLE (VEX_W_0FXOP_09_E1_L_0) },
7322 },
7323
7324 /* VEX_LEN_0FXOP_09_E2 */
7325 {
7326 { VEX_W_TABLE (VEX_W_0FXOP_09_E2_L_0) },
7327 },
7328
7329 /* VEX_LEN_0FXOP_09_E3 */
7330 {
7331 { VEX_W_TABLE (VEX_W_0FXOP_09_E3_L_0) },
7332 },
7333
7334 /* VEX_LEN_0FXOP_0A_12 */
7335 {
7336 { REG_TABLE (REG_0FXOP_0A_12_L_0) },
7337 },
331d2d0d
L
7338};
7339
ad692897 7340#include "i386-dis-evex-len.h"
04e2a182 7341
9e30b8e0 7342static const struct dis386 vex_w_table[][2] = {
43234a1e
L
7343 {
7344 /* VEX_W_0F41_P_0_LEN_1 */
ab4e4ed5
AF
7345 { MOD_TABLE (MOD_VEX_W_0_0F41_P_0_LEN_1) },
7346 { MOD_TABLE (MOD_VEX_W_1_0F41_P_0_LEN_1) },
1ba585e8
IT
7347 },
7348 {
7349 /* VEX_W_0F41_P_2_LEN_1 */
ab4e4ed5
AF
7350 { MOD_TABLE (MOD_VEX_W_0_0F41_P_2_LEN_1) },
7351 { MOD_TABLE (MOD_VEX_W_1_0F41_P_2_LEN_1) }
43234a1e
L
7352 },
7353 {
7354 /* VEX_W_0F42_P_0_LEN_1 */
ab4e4ed5
AF
7355 { MOD_TABLE (MOD_VEX_W_0_0F42_P_0_LEN_1) },
7356 { MOD_TABLE (MOD_VEX_W_1_0F42_P_0_LEN_1) },
1ba585e8
IT
7357 },
7358 {
7359 /* VEX_W_0F42_P_2_LEN_1 */
ab4e4ed5
AF
7360 { MOD_TABLE (MOD_VEX_W_0_0F42_P_2_LEN_1) },
7361 { MOD_TABLE (MOD_VEX_W_1_0F42_P_2_LEN_1) },
43234a1e
L
7362 },
7363 {
7364 /* VEX_W_0F44_P_0_LEN_0 */
ab4e4ed5
AF
7365 { MOD_TABLE (MOD_VEX_W_0_0F44_P_0_LEN_1) },
7366 { MOD_TABLE (MOD_VEX_W_1_0F44_P_0_LEN_1) },
1ba585e8
IT
7367 },
7368 {
7369 /* VEX_W_0F44_P_2_LEN_0 */
ab4e4ed5
AF
7370 { MOD_TABLE (MOD_VEX_W_0_0F44_P_2_LEN_1) },
7371 { MOD_TABLE (MOD_VEX_W_1_0F44_P_2_LEN_1) },
43234a1e
L
7372 },
7373 {
ec6f095a
L
7374 /* VEX_W_0F45_P_0_LEN_1 */
7375 { MOD_TABLE (MOD_VEX_W_0_0F45_P_0_LEN_1) },
7376 { MOD_TABLE (MOD_VEX_W_1_0F45_P_0_LEN_1) },
9e30b8e0
L
7377 },
7378 {
ec6f095a
L
7379 /* VEX_W_0F45_P_2_LEN_1 */
7380 { MOD_TABLE (MOD_VEX_W_0_0F45_P_2_LEN_1) },
7381 { MOD_TABLE (MOD_VEX_W_1_0F45_P_2_LEN_1) },
9e30b8e0
L
7382 },
7383 {
ec6f095a
L
7384 /* VEX_W_0F46_P_0_LEN_1 */
7385 { MOD_TABLE (MOD_VEX_W_0_0F46_P_0_LEN_1) },
7386 { MOD_TABLE (MOD_VEX_W_1_0F46_P_0_LEN_1) },
9e30b8e0
L
7387 },
7388 {
ec6f095a
L
7389 /* VEX_W_0F46_P_2_LEN_1 */
7390 { MOD_TABLE (MOD_VEX_W_0_0F46_P_2_LEN_1) },
7391 { MOD_TABLE (MOD_VEX_W_1_0F46_P_2_LEN_1) },
9e30b8e0
L
7392 },
7393 {
ec6f095a
L
7394 /* VEX_W_0F47_P_0_LEN_1 */
7395 { MOD_TABLE (MOD_VEX_W_0_0F47_P_0_LEN_1) },
7396 { MOD_TABLE (MOD_VEX_W_1_0F47_P_0_LEN_1) },
9e30b8e0
L
7397 },
7398 {
ec6f095a
L
7399 /* VEX_W_0F47_P_2_LEN_1 */
7400 { MOD_TABLE (MOD_VEX_W_0_0F47_P_2_LEN_1) },
7401 { MOD_TABLE (MOD_VEX_W_1_0F47_P_2_LEN_1) },
9e30b8e0
L
7402 },
7403 {
ec6f095a
L
7404 /* VEX_W_0F4A_P_0_LEN_1 */
7405 { MOD_TABLE (MOD_VEX_W_0_0F4A_P_0_LEN_1) },
7406 { MOD_TABLE (MOD_VEX_W_1_0F4A_P_0_LEN_1) },
9e30b8e0
L
7407 },
7408 {
ec6f095a
L
7409 /* VEX_W_0F4A_P_2_LEN_1 */
7410 { MOD_TABLE (MOD_VEX_W_0_0F4A_P_2_LEN_1) },
7411 { MOD_TABLE (MOD_VEX_W_1_0F4A_P_2_LEN_1) },
9e30b8e0
L
7412 },
7413 {
ec6f095a
L
7414 /* VEX_W_0F4B_P_0_LEN_1 */
7415 { MOD_TABLE (MOD_VEX_W_0_0F4B_P_0_LEN_1) },
7416 { MOD_TABLE (MOD_VEX_W_1_0F4B_P_0_LEN_1) },
9e30b8e0
L
7417 },
7418 {
ec6f095a
L
7419 /* VEX_W_0F4B_P_2_LEN_1 */
7420 { MOD_TABLE (MOD_VEX_W_0_0F4B_P_2_LEN_1) },
9e30b8e0
L
7421 },
7422 {
ec6f095a
L
7423 /* VEX_W_0F90_P_0_LEN_0 */
7424 { "kmovw", { MaskG, MaskE }, 0 },
7425 { "kmovq", { MaskG, MaskE }, 0 },
9e30b8e0
L
7426 },
7427 {
ec6f095a
L
7428 /* VEX_W_0F90_P_2_LEN_0 */
7429 { "kmovb", { MaskG, MaskBDE }, 0 },
7430 { "kmovd", { MaskG, MaskBDE }, 0 },
9e30b8e0
L
7431 },
7432 {
ec6f095a
L
7433 /* VEX_W_0F91_P_0_LEN_0 */
7434 { MOD_TABLE (MOD_VEX_W_0_0F91_P_0_LEN_0) },
7435 { MOD_TABLE (MOD_VEX_W_1_0F91_P_0_LEN_0) },
9e30b8e0
L
7436 },
7437 {
ec6f095a
L
7438 /* VEX_W_0F91_P_2_LEN_0 */
7439 { MOD_TABLE (MOD_VEX_W_0_0F91_P_2_LEN_0) },
7440 { MOD_TABLE (MOD_VEX_W_1_0F91_P_2_LEN_0) },
9e30b8e0
L
7441 },
7442 {
ec6f095a
L
7443 /* VEX_W_0F92_P_0_LEN_0 */
7444 { MOD_TABLE (MOD_VEX_W_0_0F92_P_0_LEN_0) },
9e30b8e0
L
7445 },
7446 {
ec6f095a
L
7447 /* VEX_W_0F92_P_2_LEN_0 */
7448 { MOD_TABLE (MOD_VEX_W_0_0F92_P_2_LEN_0) },
9e30b8e0 7449 },
9e30b8e0 7450 {
ec6f095a
L
7451 /* VEX_W_0F93_P_0_LEN_0 */
7452 { MOD_TABLE (MOD_VEX_W_0_0F93_P_0_LEN_0) },
9e30b8e0
L
7453 },
7454 {
ec6f095a
L
7455 /* VEX_W_0F93_P_2_LEN_0 */
7456 { MOD_TABLE (MOD_VEX_W_0_0F93_P_2_LEN_0) },
9e30b8e0 7457 },
9e30b8e0 7458 {
ec6f095a
L
7459 /* VEX_W_0F98_P_0_LEN_0 */
7460 { MOD_TABLE (MOD_VEX_W_0_0F98_P_0_LEN_0) },
7461 { MOD_TABLE (MOD_VEX_W_1_0F98_P_0_LEN_0) },
9e30b8e0
L
7462 },
7463 {
ec6f095a
L
7464 /* VEX_W_0F98_P_2_LEN_0 */
7465 { MOD_TABLE (MOD_VEX_W_0_0F98_P_2_LEN_0) },
7466 { MOD_TABLE (MOD_VEX_W_1_0F98_P_2_LEN_0) },
9e30b8e0
L
7467 },
7468 {
ec6f095a
L
7469 /* VEX_W_0F99_P_0_LEN_0 */
7470 { MOD_TABLE (MOD_VEX_W_0_0F99_P_0_LEN_0) },
7471 { MOD_TABLE (MOD_VEX_W_1_0F99_P_0_LEN_0) },
9e30b8e0
L
7472 },
7473 {
ec6f095a
L
7474 /* VEX_W_0F99_P_2_LEN_0 */
7475 { MOD_TABLE (MOD_VEX_W_0_0F99_P_2_LEN_0) },
7476 { MOD_TABLE (MOD_VEX_W_1_0F99_P_2_LEN_0) },
9e30b8e0 7477 },
9e30b8e0 7478 {
7531c613
JB
7479 /* VEX_W_0F380C */
7480 { "vpermilps", { XM, Vex, EXx }, PREFIX_DATA },
9e30b8e0
L
7481 },
7482 {
7531c613
JB
7483 /* VEX_W_0F380D */
7484 { "vpermilpd", { XM, Vex, EXx }, PREFIX_DATA },
9e30b8e0
L
7485 },
7486 {
7531c613
JB
7487 /* VEX_W_0F380E */
7488 { "vtestps", { XM, EXx }, PREFIX_DATA },
9e30b8e0
L
7489 },
7490 {
7531c613
JB
7491 /* VEX_W_0F380F */
7492 { "vtestpd", { XM, EXx }, PREFIX_DATA },
9e30b8e0 7493 },
6431c801 7494 {
7531c613
JB
7495 /* VEX_W_0F3813 */
7496 { "vcvtph2ps", { XM, EXxmmq }, PREFIX_DATA },
6431c801 7497 },
6c30d220 7498 {
7531c613
JB
7499 /* VEX_W_0F3816_L_1 */
7500 { "vpermps", { XM, Vex, EXx }, PREFIX_DATA },
6c30d220 7501 },
bcf2684f 7502 {
7531c613
JB
7503 /* VEX_W_0F3818 */
7504 { "vbroadcastss", { XM, EXxmm_md }, PREFIX_DATA },
bcf2684f 7505 },
9e30b8e0 7506 {
7531c613
JB
7507 /* VEX_W_0F3819_L_1 */
7508 { "vbroadcastsd", { XM, EXxmm_mq }, PREFIX_DATA },
9e30b8e0
L
7509 },
7510 {
7531c613
JB
7511 /* VEX_W_0F381A_M_0_L_1 */
7512 { "vbroadcastf128", { XM, Mxmm }, PREFIX_DATA },
9e30b8e0 7513 },
53aa04a0 7514 {
7531c613
JB
7515 /* VEX_W_0F382C_M_0 */
7516 { "vmaskmovps", { XM, Vex, Mx }, PREFIX_DATA },
53aa04a0
L
7517 },
7518 {
7531c613
JB
7519 /* VEX_W_0F382D_M_0 */
7520 { "vmaskmovpd", { XM, Vex, Mx }, PREFIX_DATA },
53aa04a0
L
7521 },
7522 {
7531c613
JB
7523 /* VEX_W_0F382E_M_0 */
7524 { "vmaskmovps", { Mx, Vex, XM }, PREFIX_DATA },
53aa04a0
L
7525 },
7526 {
7531c613
JB
7527 /* VEX_W_0F382F_M_0 */
7528 { "vmaskmovpd", { Mx, Vex, XM }, PREFIX_DATA },
53aa04a0 7529 },
6c30d220 7530 {
7531c613
JB
7531 /* VEX_W_0F3836 */
7532 { "vpermd", { XM, Vex, EXx }, PREFIX_DATA },
9e30b8e0 7533 },
6c30d220 7534 {
7531c613
JB
7535 /* VEX_W_0F3846 */
7536 { "vpsravd", { XM, Vex, EXx }, PREFIX_DATA },
6c30d220 7537 },
260cd341
LC
7538 {
7539 /* VEX_W_0F3849_X86_64_P_0 */
7540 { MOD_TABLE (MOD_VEX_0F3849_X86_64_P_0_W_0) },
7541 },
7542 {
7543 /* VEX_W_0F3849_X86_64_P_2 */
7544 { MOD_TABLE (MOD_VEX_0F3849_X86_64_P_2_W_0) },
7545 },
7546 {
7547 /* VEX_W_0F3849_X86_64_P_3 */
7548 { MOD_TABLE (MOD_VEX_0F3849_X86_64_P_3_W_0) },
7549 },
7550 {
7551 /* VEX_W_0F384B_X86_64_P_1 */
7552 { MOD_TABLE (MOD_VEX_0F384B_X86_64_P_1_W_0) },
7553 },
7554 {
7555 /* VEX_W_0F384B_X86_64_P_2 */
7556 { MOD_TABLE (MOD_VEX_0F384B_X86_64_P_2_W_0) },
7557 },
7558 {
7559 /* VEX_W_0F384B_X86_64_P_3 */
7560 { MOD_TABLE (MOD_VEX_0F384B_X86_64_P_3_W_0) },
7561 },
6c30d220 7562 {
7531c613
JB
7563 /* VEX_W_0F3858 */
7564 { "vpbroadcastd", { XM, EXxmm_md }, PREFIX_DATA },
6c30d220
L
7565 },
7566 {
7531c613
JB
7567 /* VEX_W_0F3859 */
7568 { "vpbroadcastq", { XM, EXxmm_mq }, PREFIX_DATA },
6c30d220
L
7569 },
7570 {
7531c613
JB
7571 /* VEX_W_0F385A_M_0_L_0 */
7572 { "vbroadcasti128", { XM, Mxmm }, PREFIX_DATA },
6c30d220 7573 },
260cd341
LC
7574 {
7575 /* VEX_W_0F385C_X86_64_P_1 */
7576 { MOD_TABLE (MOD_VEX_0F385C_X86_64_P_1_W_0) },
7577 },
7578 {
7579 /* VEX_W_0F385E_X86_64_P_0 */
7580 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_0_W_0) },
7581 },
7582 {
7583 /* VEX_W_0F385E_X86_64_P_1 */
7584 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_1_W_0) },
7585 },
7586 {
7587 /* VEX_W_0F385E_X86_64_P_2 */
7588 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_2_W_0) },
7589 },
7590 {
7591 /* VEX_W_0F385E_X86_64_P_3 */
7592 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_3_W_0) },
7593 },
6c30d220 7594 {
7531c613
JB
7595 /* VEX_W_0F3878 */
7596 { "vpbroadcastb", { XM, EXxmm_mb }, PREFIX_DATA },
6c30d220
L
7597 },
7598 {
7531c613
JB
7599 /* VEX_W_0F3879 */
7600 { "vpbroadcastw", { XM, EXxmm_mw }, PREFIX_DATA },
6c30d220 7601 },
48521003 7602 {
7531c613
JB
7603 /* VEX_W_0F38CF */
7604 { "vgf2p8mulb", { XM, Vex, EXx }, PREFIX_DATA },
48521003 7605 },
6c30d220 7606 {
7531c613 7607 /* VEX_W_0F3A00_L_1 */
6c30d220 7608 { Bad_Opcode },
7531c613 7609 { "vpermq", { XM, EXx, Ib }, PREFIX_DATA },
6c30d220
L
7610 },
7611 {
7531c613 7612 /* VEX_W_0F3A01_L_1 */
6c30d220 7613 { Bad_Opcode },
7531c613 7614 { "vpermpd", { XM, EXx, Ib }, PREFIX_DATA },
6c30d220
L
7615 },
7616 {
7531c613
JB
7617 /* VEX_W_0F3A02 */
7618 { "vpblendd", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6c30d220 7619 },
9e30b8e0 7620 {
7531c613
JB
7621 /* VEX_W_0F3A04 */
7622 { "vpermilps", { XM, EXx, Ib }, PREFIX_DATA },
9e30b8e0
L
7623 },
7624 {
7531c613
JB
7625 /* VEX_W_0F3A05 */
7626 { "vpermilpd", { XM, EXx, Ib }, PREFIX_DATA },
9e30b8e0
L
7627 },
7628 {
7531c613
JB
7629 /* VEX_W_0F3A06_L_1 */
7630 { "vperm2f128", { XM, Vex, EXx, Ib }, PREFIX_DATA },
9e30b8e0 7631 },
9e30b8e0 7632 {
7531c613
JB
7633 /* VEX_W_0F3A18_L_1 */
7634 { "vinsertf128", { XM, Vex, EXxmm, Ib }, PREFIX_DATA },
9e30b8e0
L
7635 },
7636 {
7531c613
JB
7637 /* VEX_W_0F3A19_L_1 */
7638 { "vextractf128", { EXxmm, XM, Ib }, PREFIX_DATA },
9e30b8e0 7639 },
6431c801 7640 {
7531c613
JB
7641 /* VEX_W_0F3A1D */
7642 { "vcvtps2ph", { EXxmmq, XM, EXxEVexS, Ib }, PREFIX_DATA },
6431c801 7643 },
6c30d220 7644 {
7531c613
JB
7645 /* VEX_W_0F3A38_L_1 */
7646 { "vinserti128", { XM, Vex, EXxmm, Ib }, PREFIX_DATA },
6c30d220
L
7647 },
7648 {
7531c613
JB
7649 /* VEX_W_0F3A39_L_1 */
7650 { "vextracti128", { EXxmm, XM, Ib }, PREFIX_DATA },
6c30d220 7651 },
6c30d220 7652 {
7531c613
JB
7653 /* VEX_W_0F3A46_L_1 */
7654 { "vperm2i128", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6c30d220 7655 },
9e30b8e0 7656 {
7531c613
JB
7657 /* VEX_W_0F3A4A */
7658 { "vblendvps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
9e30b8e0
L
7659 },
7660 {
7531c613
JB
7661 /* VEX_W_0F3A4B */
7662 { "vblendvpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
9e30b8e0
L
7663 },
7664 {
7531c613
JB
7665 /* VEX_W_0F3A4C */
7666 { "vpblendvb", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
9e30b8e0 7667 },
48521003 7668 {
7531c613 7669 /* VEX_W_0F3ACE */
48521003 7670 { Bad_Opcode },
7531c613 7671 { "vgf2p8affineqb", { XM, Vex, EXx, Ib }, PREFIX_DATA },
48521003
IT
7672 },
7673 {
7531c613 7674 /* VEX_W_0F3ACF */
48521003 7675 { Bad_Opcode },
7531c613 7676 { "vgf2p8affineinvqb", { XM, Vex, EXx, Ib }, PREFIX_DATA },
48521003 7677 },
467bbef0
JB
7678 /* VEX_W_0FXOP_08_85_L_0 */
7679 {
7680 { "vpmacssww", { XM, Vex, EXx, XMVexI4 }, 0 },
7681 },
7682 /* VEX_W_0FXOP_08_86_L_0 */
7683 {
7684 { "vpmacsswd", { XM, Vex, EXx, XMVexI4 }, 0 },
7685 },
7686 /* VEX_W_0FXOP_08_87_L_0 */
7687 {
7688 { "vpmacssdql", { XM, Vex, EXx, XMVexI4 }, 0 },
7689 },
7690 /* VEX_W_0FXOP_08_8E_L_0 */
7691 {
7692 { "vpmacssdd", { XM, Vex, EXx, XMVexI4 }, 0 },
7693 },
7694 /* VEX_W_0FXOP_08_8F_L_0 */
7695 {
7696 { "vpmacssdqh", { XM, Vex, EXx, XMVexI4 }, 0 },
7697 },
7698 /* VEX_W_0FXOP_08_95_L_0 */
7699 {
7700 { "vpmacsww", { XM, Vex, EXx, XMVexI4 }, 0 },
7701 },
7702 /* VEX_W_0FXOP_08_96_L_0 */
7703 {
7704 { "vpmacswd", { XM, Vex, EXx, XMVexI4 }, 0 },
7705 },
7706 /* VEX_W_0FXOP_08_97_L_0 */
7707 {
7708 { "vpmacsdql", { XM, Vex, EXx, XMVexI4 }, 0 },
7709 },
7710 /* VEX_W_0FXOP_08_9E_L_0 */
7711 {
7712 { "vpmacsdd", { XM, Vex, EXx, XMVexI4 }, 0 },
7713 },
7714 /* VEX_W_0FXOP_08_9F_L_0 */
7715 {
7716 { "vpmacsdqh", { XM, Vex, EXx, XMVexI4 }, 0 },
7717 },
7718 /* VEX_W_0FXOP_08_A6_L_0 */
7719 {
7720 { "vpmadcsswd", { XM, Vex, EXx, XMVexI4 }, 0 },
7721 },
7722 /* VEX_W_0FXOP_08_B6_L_0 */
7723 {
7724 { "vpmadcswd", { XM, Vex, EXx, XMVexI4 }, 0 },
7725 },
7726 /* VEX_W_0FXOP_08_C0_L_0 */
7727 {
7728 { "vprotb", { XM, EXx, Ib }, 0 },
7729 },
7730 /* VEX_W_0FXOP_08_C1_L_0 */
7731 {
7732 { "vprotw", { XM, EXx, Ib }, 0 },
7733 },
7734 /* VEX_W_0FXOP_08_C2_L_0 */
7735 {
7736 { "vprotd", { XM, EXx, Ib }, 0 },
7737 },
7738 /* VEX_W_0FXOP_08_C3_L_0 */
7739 {
7740 { "vprotq", { XM, EXx, Ib }, 0 },
7741 },
7742 /* VEX_W_0FXOP_08_CC_L_0 */
7743 {
89e65d17 7744 { "vpcomb", { XM, Vex, EXx, VPCOM }, 0 },
467bbef0
JB
7745 },
7746 /* VEX_W_0FXOP_08_CD_L_0 */
7747 {
89e65d17 7748 { "vpcomw", { XM, Vex, EXx, VPCOM }, 0 },
467bbef0
JB
7749 },
7750 /* VEX_W_0FXOP_08_CE_L_0 */
7751 {
89e65d17 7752 { "vpcomd", { XM, Vex, EXx, VPCOM }, 0 },
467bbef0
JB
7753 },
7754 /* VEX_W_0FXOP_08_CF_L_0 */
7755 {
89e65d17 7756 { "vpcomq", { XM, Vex, EXx, VPCOM }, 0 },
467bbef0
JB
7757 },
7758 /* VEX_W_0FXOP_08_EC_L_0 */
7759 {
89e65d17 7760 { "vpcomub", { XM, Vex, EXx, VPCOM }, 0 },
467bbef0
JB
7761 },
7762 /* VEX_W_0FXOP_08_ED_L_0 */
7763 {
89e65d17 7764 { "vpcomuw", { XM, Vex, EXx, VPCOM }, 0 },
467bbef0
JB
7765 },
7766 /* VEX_W_0FXOP_08_EE_L_0 */
7767 {
89e65d17 7768 { "vpcomud", { XM, Vex, EXx, VPCOM }, 0 },
467bbef0
JB
7769 },
7770 /* VEX_W_0FXOP_08_EF_L_0 */
7771 {
89e65d17 7772 { "vpcomuq", { XM, Vex, EXx, VPCOM }, 0 },
467bbef0 7773 },
b5b098c2
JB
7774 /* VEX_W_0FXOP_09_80 */
7775 {
7776 { "vfrczps", { XM, EXx }, 0 },
7777 },
7778 /* VEX_W_0FXOP_09_81 */
7779 {
7780 { "vfrczpd", { XM, EXx }, 0 },
7781 },
7782 /* VEX_W_0FXOP_09_82 */
7783 {
7784 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_82_W_0) },
7785 },
7786 /* VEX_W_0FXOP_09_83 */
7787 {
7788 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_83_W_0) },
7789 },
467bbef0
JB
7790 /* VEX_W_0FXOP_09_C1_L_0 */
7791 {
7792 { "vphaddbw", { XM, EXxmm }, 0 },
7793 },
7794 /* VEX_W_0FXOP_09_C2_L_0 */
7795 {
7796 { "vphaddbd", { XM, EXxmm }, 0 },
7797 },
7798 /* VEX_W_0FXOP_09_C3_L_0 */
7799 {
7800 { "vphaddbq", { XM, EXxmm }, 0 },
7801 },
7802 /* VEX_W_0FXOP_09_C6_L_0 */
7803 {
7804 { "vphaddwd", { XM, EXxmm }, 0 },
7805 },
7806 /* VEX_W_0FXOP_09_C7_L_0 */
7807 {
7808 { "vphaddwq", { XM, EXxmm }, 0 },
7809 },
7810 /* VEX_W_0FXOP_09_CB_L_0 */
7811 {
7812 { "vphadddq", { XM, EXxmm }, 0 },
7813 },
7814 /* VEX_W_0FXOP_09_D1_L_0 */
7815 {
7816 { "vphaddubw", { XM, EXxmm }, 0 },
7817 },
7818 /* VEX_W_0FXOP_09_D2_L_0 */
7819 {
7820 { "vphaddubd", { XM, EXxmm }, 0 },
7821 },
7822 /* VEX_W_0FXOP_09_D3_L_0 */
7823 {
7824 { "vphaddubq", { XM, EXxmm }, 0 },
7825 },
7826 /* VEX_W_0FXOP_09_D6_L_0 */
7827 {
7828 { "vphadduwd", { XM, EXxmm }, 0 },
7829 },
7830 /* VEX_W_0FXOP_09_D7_L_0 */
7831 {
7832 { "vphadduwq", { XM, EXxmm }, 0 },
7833 },
7834 /* VEX_W_0FXOP_09_DB_L_0 */
7835 {
7836 { "vphaddudq", { XM, EXxmm }, 0 },
7837 },
7838 /* VEX_W_0FXOP_09_E1_L_0 */
7839 {
7840 { "vphsubbw", { XM, EXxmm }, 0 },
7841 },
7842 /* VEX_W_0FXOP_09_E2_L_0 */
7843 {
7844 { "vphsubwd", { XM, EXxmm }, 0 },
7845 },
7846 /* VEX_W_0FXOP_09_E3_L_0 */
7847 {
7848 { "vphsubdq", { XM, EXxmm }, 0 },
7849 },
ad692897
L
7850
7851#include "i386-dis-evex-w.h"
9e30b8e0
L
7852};
7853
7854static const struct dis386 mod_table[][2] = {
7855 {
7856 /* MOD_8D */
bf890a93 7857 { "leaS", { Gv, M }, 0 },
9e30b8e0 7858 },
42164a71
L
7859 {
7860 /* MOD_C6_REG_7 */
7861 { Bad_Opcode },
7862 { RM_TABLE (RM_C6_REG_7) },
7863 },
7864 {
7865 /* MOD_C7_REG_7 */
7866 { Bad_Opcode },
7867 { RM_TABLE (RM_C7_REG_7) },
7868 },
4a357820
MZ
7869 {
7870 /* MOD_FF_REG_3 */
8f570d62 7871 { "{l|}call^", { indirEp }, 0 },
4a357820
MZ
7872 },
7873 {
7874 /* MOD_FF_REG_5 */
8f570d62 7875 { "{l|}jmp^", { indirEp }, 0 },
4a357820 7876 },
9e30b8e0
L
7877 {
7878 /* MOD_0F01_REG_0 */
7879 { X86_64_TABLE (X86_64_0F01_REG_0) },
7880 { RM_TABLE (RM_0F01_REG_0) },
7881 },
7882 {
7883 /* MOD_0F01_REG_1 */
7884 { X86_64_TABLE (X86_64_0F01_REG_1) },
7885 { RM_TABLE (RM_0F01_REG_1) },
7886 },
7887 {
7888 /* MOD_0F01_REG_2 */
7889 { X86_64_TABLE (X86_64_0F01_REG_2) },
7890 { RM_TABLE (RM_0F01_REG_2) },
7891 },
7892 {
7893 /* MOD_0F01_REG_3 */
7894 { X86_64_TABLE (X86_64_0F01_REG_3) },
7895 { RM_TABLE (RM_0F01_REG_3) },
7896 },
8eab4136
L
7897 {
7898 /* MOD_0F01_REG_5 */
f8687e93
JB
7899 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_0) },
7900 { RM_TABLE (RM_0F01_REG_5_MOD_3) },
8eab4136 7901 },
9e30b8e0
L
7902 {
7903 /* MOD_0F01_REG_7 */
bf890a93 7904 { "invlpg", { Mb }, 0 },
f8687e93 7905 { RM_TABLE (RM_0F01_REG_7_MOD_3) },
9e30b8e0
L
7906 },
7907 {
7908 /* MOD_0F12_PREFIX_0 */
18897deb
JB
7909 { "movlpX", { XM, EXq }, 0 },
7910 { "movhlps", { XM, EXq }, 0 },
7911 },
7912 {
7913 /* MOD_0F12_PREFIX_2 */
7914 { "movlpX", { XM, EXq }, 0 },
9e30b8e0
L
7915 },
7916 {
7917 /* MOD_0F13 */
507bd325 7918 { "movlpX", { EXq, XM }, PREFIX_OPCODE },
9e30b8e0
L
7919 },
7920 {
7921 /* MOD_0F16_PREFIX_0 */
18897deb 7922 { "movhpX", { XM, EXq }, 0 },
bf890a93 7923 { "movlhps", { XM, EXq }, 0 },
9e30b8e0 7924 },
18897deb
JB
7925 {
7926 /* MOD_0F16_PREFIX_2 */
7927 { "movhpX", { XM, EXq }, 0 },
7928 },
9e30b8e0
L
7929 {
7930 /* MOD_0F17 */
507bd325 7931 { "movhpX", { EXq, XM }, PREFIX_OPCODE },
9e30b8e0
L
7932 },
7933 {
7934 /* MOD_0F18_REG_0 */
bf890a93 7935 { "prefetchnta", { Mb }, 0 },
9e30b8e0
L
7936 },
7937 {
7938 /* MOD_0F18_REG_1 */
bf890a93 7939 { "prefetcht0", { Mb }, 0 },
9e30b8e0
L
7940 },
7941 {
7942 /* MOD_0F18_REG_2 */
bf890a93 7943 { "prefetcht1", { Mb }, 0 },
9e30b8e0
L
7944 },
7945 {
7946 /* MOD_0F18_REG_3 */
bf890a93 7947 { "prefetcht2", { Mb }, 0 },
9e30b8e0 7948 },
d7189fa5
RM
7949 {
7950 /* MOD_0F18_REG_4 */
bf890a93 7951 { "nop/reserved", { Mb }, 0 },
d7189fa5
RM
7952 },
7953 {
7954 /* MOD_0F18_REG_5 */
bf890a93 7955 { "nop/reserved", { Mb }, 0 },
d7189fa5
RM
7956 },
7957 {
7958 /* MOD_0F18_REG_6 */
bf890a93 7959 { "nop/reserved", { Mb }, 0 },
d7189fa5
RM
7960 },
7961 {
7962 /* MOD_0F18_REG_7 */
bf890a93 7963 { "nop/reserved", { Mb }, 0 },
d7189fa5 7964 },
7e8b059b
L
7965 {
7966 /* MOD_0F1A_PREFIX_0 */
d276ec69 7967 { "bndldx", { Gbnd, Mv_bnd }, 0 },
bf890a93 7968 { "nopQ", { Ev }, 0 },
7e8b059b
L
7969 },
7970 {
7971 /* MOD_0F1B_PREFIX_0 */
d276ec69 7972 { "bndstx", { Mv_bnd, Gbnd }, 0 },
bf890a93 7973 { "nopQ", { Ev }, 0 },
7e8b059b
L
7974 },
7975 {
7976 /* MOD_0F1B_PREFIX_1 */
d276ec69 7977 { "bndmk", { Gbnd, Mv_bnd }, 0 },
bf890a93 7978 { "nopQ", { Ev }, 0 },
7e8b059b 7979 },
c48935d7
IT
7980 {
7981 /* MOD_0F1C_PREFIX_0 */
f8687e93 7982 { REG_TABLE (REG_0F1C_P_0_MOD_0) },
c48935d7
IT
7983 { "nopQ", { Ev }, 0 },
7984 },
603555e5
L
7985 {
7986 /* MOD_0F1E_PREFIX_1 */
7987 { "nopQ", { Ev }, 0 },
f8687e93 7988 { REG_TABLE (REG_0F1E_P_1_MOD_3) },
603555e5 7989 },
b844680a 7990 {
92fddf8e 7991 /* MOD_0F24 */
7bb15c6f 7992 { Bad_Opcode },
bf890a93 7993 { "movL", { Rd, Td }, 0 },
b844680a
L
7994 },
7995 {
92fddf8e 7996 /* MOD_0F26 */
592d1631 7997 { Bad_Opcode },
bf890a93 7998 { "movL", { Td, Rd }, 0 },
b844680a 7999 },
75c135a8
L
8000 {
8001 /* MOD_0F2B_PREFIX_0 */
507bd325 8002 {"movntps", { Mx, XM }, PREFIX_OPCODE },
75c135a8
L
8003 },
8004 {
8005 /* MOD_0F2B_PREFIX_1 */
507bd325 8006 {"movntss", { Md, XM }, PREFIX_OPCODE },
75c135a8
L
8007 },
8008 {
8009 /* MOD_0F2B_PREFIX_2 */
507bd325 8010 {"movntpd", { Mx, XM }, PREFIX_OPCODE },
75c135a8
L
8011 },
8012 {
8013 /* MOD_0F2B_PREFIX_3 */
507bd325 8014 {"movntsd", { Mq, XM }, PREFIX_OPCODE },
75c135a8
L
8015 },
8016 {
a5aaedb9 8017 /* MOD_0F50 */
592d1631 8018 { Bad_Opcode },
507bd325 8019 { "movmskpX", { Gdq, XS }, PREFIX_OPCODE },
75c135a8 8020 },
b844680a 8021 {
1ceb70f8 8022 /* MOD_0F71_REG_2 */
592d1631 8023 { Bad_Opcode },
7531c613 8024 { "psrlw", { MS, Ib }, PREFIX_OPCODE },
b844680a
L
8025 },
8026 {
1ceb70f8 8027 /* MOD_0F71_REG_4 */
592d1631 8028 { Bad_Opcode },
7531c613 8029 { "psraw", { MS, Ib }, PREFIX_OPCODE },
b844680a
L
8030 },
8031 {
1ceb70f8 8032 /* MOD_0F71_REG_6 */
592d1631 8033 { Bad_Opcode },
7531c613 8034 { "psllw", { MS, Ib }, PREFIX_OPCODE },
b844680a
L
8035 },
8036 {
1ceb70f8 8037 /* MOD_0F72_REG_2 */
592d1631 8038 { Bad_Opcode },
7531c613 8039 { "psrld", { MS, Ib }, PREFIX_OPCODE },
b844680a
L
8040 },
8041 {
1ceb70f8 8042 /* MOD_0F72_REG_4 */
592d1631 8043 { Bad_Opcode },
7531c613 8044 { "psrad", { MS, Ib }, PREFIX_OPCODE },
b844680a
L
8045 },
8046 {
1ceb70f8 8047 /* MOD_0F72_REG_6 */
592d1631 8048 { Bad_Opcode },
7531c613 8049 { "pslld", { MS, Ib }, PREFIX_OPCODE },
b844680a
L
8050 },
8051 {
1ceb70f8 8052 /* MOD_0F73_REG_2 */
592d1631 8053 { Bad_Opcode },
7531c613 8054 { "psrlq", { MS, Ib }, PREFIX_OPCODE },
b844680a
L
8055 },
8056 {
1ceb70f8 8057 /* MOD_0F73_REG_3 */
592d1631 8058 { Bad_Opcode },
7531c613 8059 { "psrldq", { XS, Ib }, PREFIX_DATA },
c0f3af97
L
8060 },
8061 {
8062 /* MOD_0F73_REG_6 */
592d1631 8063 { Bad_Opcode },
7531c613 8064 { "psllq", { MS, Ib }, PREFIX_OPCODE },
c0f3af97
L
8065 },
8066 {
8067 /* MOD_0F73_REG_7 */
592d1631 8068 { Bad_Opcode },
7531c613 8069 { "pslldq", { XS, Ib }, PREFIX_DATA },
c0f3af97
L
8070 },
8071 {
8072 /* MOD_0FAE_REG_0 */
bf890a93 8073 { "fxsave", { FXSAVE }, 0 },
f8687e93 8074 { PREFIX_TABLE (PREFIX_0FAE_REG_0_MOD_3) },
c0f3af97
L
8075 },
8076 {
8077 /* MOD_0FAE_REG_1 */
bf890a93 8078 { "fxrstor", { FXSAVE }, 0 },
f8687e93 8079 { PREFIX_TABLE (PREFIX_0FAE_REG_1_MOD_3) },
c0f3af97
L
8080 },
8081 {
8082 /* MOD_0FAE_REG_2 */
bf890a93 8083 { "ldmxcsr", { Md }, 0 },
f8687e93 8084 { PREFIX_TABLE (PREFIX_0FAE_REG_2_MOD_3) },
c0f3af97
L
8085 },
8086 {
8087 /* MOD_0FAE_REG_3 */
bf890a93 8088 { "stmxcsr", { Md }, 0 },
f8687e93 8089 { PREFIX_TABLE (PREFIX_0FAE_REG_3_MOD_3) },
c0f3af97
L
8090 },
8091 {
8092 /* MOD_0FAE_REG_4 */
f8687e93
JB
8093 { PREFIX_TABLE (PREFIX_0FAE_REG_4_MOD_0) },
8094 { PREFIX_TABLE (PREFIX_0FAE_REG_4_MOD_3) },
c0f3af97
L
8095 },
8096 {
8097 /* MOD_0FAE_REG_5 */
035e7389 8098 { "xrstor", { FXSAVE }, PREFIX_OPCODE },
f8687e93 8099 { PREFIX_TABLE (PREFIX_0FAE_REG_5_MOD_3) },
c0f3af97
L
8100 },
8101 {
8102 /* MOD_0FAE_REG_6 */
f8687e93
JB
8103 { PREFIX_TABLE (PREFIX_0FAE_REG_6_MOD_0) },
8104 { PREFIX_TABLE (PREFIX_0FAE_REG_6_MOD_3) },
c0f3af97
L
8105 },
8106 {
8107 /* MOD_0FAE_REG_7 */
f8687e93
JB
8108 { PREFIX_TABLE (PREFIX_0FAE_REG_7_MOD_0) },
8109 { RM_TABLE (RM_0FAE_REG_7_MOD_3) },
c0f3af97
L
8110 },
8111 {
8112 /* MOD_0FB2 */
bf890a93 8113 { "lssS", { Gv, Mp }, 0 },
c0f3af97
L
8114 },
8115 {
8116 /* MOD_0FB4 */
bf890a93 8117 { "lfsS", { Gv, Mp }, 0 },
c0f3af97
L
8118 },
8119 {
8120 /* MOD_0FB5 */
bf890a93 8121 { "lgsS", { Gv, Mp }, 0 },
c0f3af97 8122 },
a8484f96
L
8123 {
8124 /* MOD_0FC3 */
035e7389 8125 { "movntiS", { Edq, Gdq }, PREFIX_OPCODE },
a8484f96 8126 },
963f3586
IT
8127 {
8128 /* MOD_0FC7_REG_3 */
a8484f96 8129 { "xrstors", { FXSAVE }, 0 },
963f3586
IT
8130 },
8131 {
8132 /* MOD_0FC7_REG_4 */
bf890a93 8133 { "xsavec", { FXSAVE }, 0 },
963f3586
IT
8134 },
8135 {
8136 /* MOD_0FC7_REG_5 */
bf890a93 8137 { "xsaves", { FXSAVE }, 0 },
963f3586 8138 },
c0f3af97
L
8139 {
8140 /* MOD_0FC7_REG_6 */
f8687e93
JB
8141 { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_0) },
8142 { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_3) }
c0f3af97
L
8143 },
8144 {
8145 /* MOD_0FC7_REG_7 */
bf890a93 8146 { "vmptrst", { Mq }, 0 },
f8687e93 8147 { PREFIX_TABLE (PREFIX_0FC7_REG_7_MOD_3) }
c0f3af97
L
8148 },
8149 {
8150 /* MOD_0FD7 */
592d1631 8151 { Bad_Opcode },
bf890a93 8152 { "pmovmskb", { Gdq, MS }, 0 },
c0f3af97
L
8153 },
8154 {
8155 /* MOD_0FE7_PREFIX_2 */
bf890a93 8156 { "movntdq", { Mx, XM }, 0 },
c0f3af97
L
8157 },
8158 {
8159 /* MOD_0FF0_PREFIX_3 */
bf890a93 8160 { "lddqu", { XM, M }, 0 },
c0f3af97
L
8161 },
8162 {
7531c613
JB
8163 /* MOD_0F382A */
8164 { "movntdqa", { XM, Mx }, PREFIX_DATA },
c0f3af97 8165 },
260cd341
LC
8166 {
8167 /* MOD_VEX_0F3849_X86_64_P_0_W_0 */
8168 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_0_W_0_M_0) },
8169 { REG_TABLE (REG_VEX_0F3849_X86_64_P_0_W_0_M_1) },
8170 },
8171 {
8172 /* MOD_VEX_0F3849_X86_64_P_2_W_0 */
8173 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_2_W_0_M_0) },
8174 },
8175 {
8176 /* MOD_VEX_0F3849_X86_64_P_3_W_0 */
8177 { Bad_Opcode },
8178 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_3_W_0_M_0) },
8179 },
8180 {
8181 /* MOD_VEX_0F384B_X86_64_P_1_W_0 */
8182 { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64_P_1_W_0_M_0) },
8183 },
8184 {
8185 /* MOD_VEX_0F384B_X86_64_P_2_W_0 */
8186 { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64_P_2_W_0_M_0) },
8187 },
8188 {
8189 /* MOD_VEX_0F384B_X86_64_P_3_W_0 */
8190 { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64_P_3_W_0_M_0) },
8191 },
8192 {
8193 /* MOD_VEX_0F385C_X86_64_P_1_W_0 */
8194 { Bad_Opcode },
8195 { VEX_LEN_TABLE (VEX_LEN_0F385C_X86_64_P_1_W_0_M_0) },
8196 },
8197 {
8198 /* MOD_VEX_0F385E_X86_64_P_0_W_0 */
8199 { Bad_Opcode },
8200 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_0_W_0_M_0) },
8201 },
8202 {
8203 /* MOD_VEX_0F385E_X86_64_P_1_W_0 */
8204 { Bad_Opcode },
8205 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_1_W_0_M_0) },
8206 },
8207 {
8208 /* MOD_VEX_0F385E_X86_64_P_2_W_0 */
8209 { Bad_Opcode },
8210 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_2_W_0_M_0) },
8211 },
8212 {
8213 /* MOD_VEX_0F385E_X86_64_P_3_W_0 */
8214 { Bad_Opcode },
8215 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_3_W_0_M_0) },
8216 },
603555e5 8217 {
7531c613
JB
8218 /* MOD_0F38F5 */
8219 { "wrussK", { M, Gdq }, PREFIX_DATA },
603555e5
L
8220 },
8221 {
8222 /* MOD_0F38F6_PREFIX_0 */
8223 { "wrssK", { M, Gdq }, PREFIX_OPCODE },
8224 },
5d79adc4
L
8225 {
8226 /* MOD_0F38F8_PREFIX_1 */
8227 { "enqcmds", { Gva, M }, PREFIX_OPCODE },
8228 },
c0a30a9f
L
8229 {
8230 /* MOD_0F38F8_PREFIX_2 */
8231 { "movdir64b", { Gva, M }, PREFIX_OPCODE },
8232 },
5d79adc4
L
8233 {
8234 /* MOD_0F38F8_PREFIX_3 */
8235 { "enqcmd", { Gva, M }, PREFIX_OPCODE },
8236 },
c0a30a9f 8237 {
035e7389
JB
8238 /* MOD_0F38F9 */
8239 { "movdiri", { Edq, Gdq }, PREFIX_OPCODE },
c0a30a9f 8240 },
c0f3af97
L
8241 {
8242 /* MOD_62_32BIT */
bf890a93 8243 { "bound{S|}", { Gv, Ma }, 0 },
43234a1e 8244 { EVEX_TABLE (EVEX_0F) },
c0f3af97
L
8245 },
8246 {
8247 /* MOD_C4_32BIT */
bf890a93 8248 { "lesS", { Gv, Mp }, 0 },
c0f3af97
L
8249 { VEX_C4_TABLE (VEX_0F) },
8250 },
8251 {
8252 /* MOD_C5_32BIT */
bf890a93 8253 { "ldsS", { Gv, Mp }, 0 },
c0f3af97
L
8254 { VEX_C5_TABLE (VEX_0F) },
8255 },
8256 {
592a252b
L
8257 /* MOD_VEX_0F12_PREFIX_0 */
8258 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_0) },
8259 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_1) },
c0f3af97 8260 },
18897deb
JB
8261 {
8262 /* MOD_VEX_0F12_PREFIX_2 */
8263 { VEX_LEN_TABLE (VEX_LEN_0F12_P_2_M_0) },
8264 },
c0f3af97 8265 {
592a252b
L
8266 /* MOD_VEX_0F13 */
8267 { VEX_LEN_TABLE (VEX_LEN_0F13_M_0) },
c0f3af97
L
8268 },
8269 {
592a252b
L
8270 /* MOD_VEX_0F16_PREFIX_0 */
8271 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_0) },
8272 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_1) },
c0f3af97 8273 },
18897deb
JB
8274 {
8275 /* MOD_VEX_0F16_PREFIX_2 */
8276 { VEX_LEN_TABLE (VEX_LEN_0F16_P_2_M_0) },
8277 },
c0f3af97 8278 {
592a252b
L
8279 /* MOD_VEX_0F17 */
8280 { VEX_LEN_TABLE (VEX_LEN_0F17_M_0) },
c0f3af97
L
8281 },
8282 {
592a252b 8283 /* MOD_VEX_0F2B */
bf926894 8284 { "vmovntpX", { Mx, XM }, PREFIX_OPCODE },
c0f3af97 8285 },
ab4e4ed5
AF
8286 {
8287 /* MOD_VEX_W_0_0F41_P_0_LEN_1 */
8288 { Bad_Opcode },
8289 { "kandw", { MaskG, MaskVex, MaskR }, 0 },
8290 },
8291 {
8292 /* MOD_VEX_W_1_0F41_P_0_LEN_1 */
8293 { Bad_Opcode },
8294 { "kandq", { MaskG, MaskVex, MaskR }, 0 },
8295 },
8296 {
8297 /* MOD_VEX_W_0_0F41_P_2_LEN_1 */
8298 { Bad_Opcode },
8299 { "kandb", { MaskG, MaskVex, MaskR }, 0 },
8300 },
8301 {
8302 /* MOD_VEX_W_1_0F41_P_2_LEN_1 */
8303 { Bad_Opcode },
8304 { "kandd", { MaskG, MaskVex, MaskR }, 0 },
8305 },
8306 {
8307 /* MOD_VEX_W_0_0F42_P_0_LEN_1 */
8308 { Bad_Opcode },
8309 { "kandnw", { MaskG, MaskVex, MaskR }, 0 },
8310 },
8311 {
8312 /* MOD_VEX_W_1_0F42_P_0_LEN_1 */
8313 { Bad_Opcode },
8314 { "kandnq", { MaskG, MaskVex, MaskR }, 0 },
8315 },
8316 {
8317 /* MOD_VEX_W_0_0F42_P_2_LEN_1 */
8318 { Bad_Opcode },
8319 { "kandnb", { MaskG, MaskVex, MaskR }, 0 },
8320 },
8321 {
8322 /* MOD_VEX_W_1_0F42_P_2_LEN_1 */
8323 { Bad_Opcode },
8324 { "kandnd", { MaskG, MaskVex, MaskR }, 0 },
8325 },
8326 {
8327 /* MOD_VEX_W_0_0F44_P_0_LEN_0 */
8328 { Bad_Opcode },
8329 { "knotw", { MaskG, MaskR }, 0 },
8330 },
8331 {
8332 /* MOD_VEX_W_1_0F44_P_0_LEN_0 */
8333 { Bad_Opcode },
8334 { "knotq", { MaskG, MaskR }, 0 },
8335 },
8336 {
8337 /* MOD_VEX_W_0_0F44_P_2_LEN_0 */
8338 { Bad_Opcode },
8339 { "knotb", { MaskG, MaskR }, 0 },
8340 },
8341 {
8342 /* MOD_VEX_W_1_0F44_P_2_LEN_0 */
8343 { Bad_Opcode },
8344 { "knotd", { MaskG, MaskR }, 0 },
8345 },
8346 {
8347 /* MOD_VEX_W_0_0F45_P_0_LEN_1 */
8348 { Bad_Opcode },
8349 { "korw", { MaskG, MaskVex, MaskR }, 0 },
8350 },
8351 {
8352 /* MOD_VEX_W_1_0F45_P_0_LEN_1 */
8353 { Bad_Opcode },
8354 { "korq", { MaskG, MaskVex, MaskR }, 0 },
8355 },
8356 {
8357 /* MOD_VEX_W_0_0F45_P_2_LEN_1 */
8358 { Bad_Opcode },
8359 { "korb", { MaskG, MaskVex, MaskR }, 0 },
8360 },
8361 {
8362 /* MOD_VEX_W_1_0F45_P_2_LEN_1 */
8363 { Bad_Opcode },
8364 { "kord", { MaskG, MaskVex, MaskR }, 0 },
8365 },
8366 {
8367 /* MOD_VEX_W_0_0F46_P_0_LEN_1 */
8368 { Bad_Opcode },
8369 { "kxnorw", { MaskG, MaskVex, MaskR }, 0 },
8370 },
8371 {
8372 /* MOD_VEX_W_1_0F46_P_0_LEN_1 */
8373 { Bad_Opcode },
8374 { "kxnorq", { MaskG, MaskVex, MaskR }, 0 },
8375 },
8376 {
8377 /* MOD_VEX_W_0_0F46_P_2_LEN_1 */
8378 { Bad_Opcode },
8379 { "kxnorb", { MaskG, MaskVex, MaskR }, 0 },
8380 },
8381 {
8382 /* MOD_VEX_W_1_0F46_P_2_LEN_1 */
8383 { Bad_Opcode },
8384 { "kxnord", { MaskG, MaskVex, MaskR }, 0 },
8385 },
8386 {
8387 /* MOD_VEX_W_0_0F47_P_0_LEN_1 */
8388 { Bad_Opcode },
8389 { "kxorw", { MaskG, MaskVex, MaskR }, 0 },
8390 },
8391 {
8392 /* MOD_VEX_W_1_0F47_P_0_LEN_1 */
8393 { Bad_Opcode },
8394 { "kxorq", { MaskG, MaskVex, MaskR }, 0 },
8395 },
8396 {
8397 /* MOD_VEX_W_0_0F47_P_2_LEN_1 */
8398 { Bad_Opcode },
8399 { "kxorb", { MaskG, MaskVex, MaskR }, 0 },
8400 },
8401 {
8402 /* MOD_VEX_W_1_0F47_P_2_LEN_1 */
8403 { Bad_Opcode },
8404 { "kxord", { MaskG, MaskVex, MaskR }, 0 },
8405 },
8406 {
8407 /* MOD_VEX_W_0_0F4A_P_0_LEN_1 */
8408 { Bad_Opcode },
8409 { "kaddw", { MaskG, MaskVex, MaskR }, 0 },
8410 },
8411 {
8412 /* MOD_VEX_W_1_0F4A_P_0_LEN_1 */
8413 { Bad_Opcode },
8414 { "kaddq", { MaskG, MaskVex, MaskR }, 0 },
8415 },
8416 {
8417 /* MOD_VEX_W_0_0F4A_P_2_LEN_1 */
8418 { Bad_Opcode },
8419 { "kaddb", { MaskG, MaskVex, MaskR }, 0 },
8420 },
8421 {
8422 /* MOD_VEX_W_1_0F4A_P_2_LEN_1 */
8423 { Bad_Opcode },
8424 { "kaddd", { MaskG, MaskVex, MaskR }, 0 },
8425 },
8426 {
8427 /* MOD_VEX_W_0_0F4B_P_0_LEN_1 */
8428 { Bad_Opcode },
8429 { "kunpckwd", { MaskG, MaskVex, MaskR }, 0 },
8430 },
8431 {
8432 /* MOD_VEX_W_1_0F4B_P_0_LEN_1 */
8433 { Bad_Opcode },
8434 { "kunpckdq", { MaskG, MaskVex, MaskR }, 0 },
8435 },
8436 {
8437 /* MOD_VEX_W_0_0F4B_P_2_LEN_1 */
8438 { Bad_Opcode },
8439 { "kunpckbw", { MaskG, MaskVex, MaskR }, 0 },
8440 },
c0f3af97 8441 {
592a252b 8442 /* MOD_VEX_0F50 */
592d1631 8443 { Bad_Opcode },
bf926894 8444 { "vmovmskpX", { Gdq, XS }, PREFIX_OPCODE },
c0f3af97
L
8445 },
8446 {
592a252b 8447 /* MOD_VEX_0F71_REG_2 */
592d1631 8448 { Bad_Opcode },
7531c613 8449 { "vpsrlw", { Vex, XS, Ib }, PREFIX_DATA },
b844680a
L
8450 },
8451 {
592a252b 8452 /* MOD_VEX_0F71_REG_4 */
592d1631 8453 { Bad_Opcode },
7531c613 8454 { "vpsraw", { Vex, XS, Ib }, PREFIX_DATA },
b844680a
L
8455 },
8456 {
592a252b 8457 /* MOD_VEX_0F71_REG_6 */
592d1631 8458 { Bad_Opcode },
7531c613 8459 { "vpsllw", { Vex, XS, Ib }, PREFIX_DATA },
b844680a
L
8460 },
8461 {
592a252b 8462 /* MOD_VEX_0F72_REG_2 */
592d1631 8463 { Bad_Opcode },
7531c613 8464 { "vpsrld", { Vex, XS, Ib }, PREFIX_DATA },
b844680a 8465 },
d8faab4e 8466 {
592a252b 8467 /* MOD_VEX_0F72_REG_4 */
592d1631 8468 { Bad_Opcode },
7531c613 8469 { "vpsrad", { Vex, XS, Ib }, PREFIX_DATA },
d8faab4e
L
8470 },
8471 {
592a252b 8472 /* MOD_VEX_0F72_REG_6 */
592d1631 8473 { Bad_Opcode },
7531c613 8474 { "vpslld", { Vex, XS, Ib }, PREFIX_DATA },
d8faab4e 8475 },
876d4bfa 8476 {
592a252b 8477 /* MOD_VEX_0F73_REG_2 */
592d1631 8478 { Bad_Opcode },
7531c613 8479 { "vpsrlq", { Vex, XS, Ib }, PREFIX_DATA },
876d4bfa
L
8480 },
8481 {
592a252b 8482 /* MOD_VEX_0F73_REG_3 */
592d1631 8483 { Bad_Opcode },
7531c613 8484 { "vpsrldq", { Vex, XS, Ib }, PREFIX_DATA },
475a2301
L
8485 },
8486 {
592a252b 8487 /* MOD_VEX_0F73_REG_6 */
592d1631 8488 { Bad_Opcode },
7531c613 8489 { "vpsllq", { Vex, XS, Ib }, PREFIX_DATA },
876d4bfa
L
8490 },
8491 {
592a252b 8492 /* MOD_VEX_0F73_REG_7 */
592d1631 8493 { Bad_Opcode },
7531c613 8494 { "vpslldq", { Vex, XS, Ib }, PREFIX_DATA },
876d4bfa 8495 },
ab4e4ed5
AF
8496 {
8497 /* MOD_VEX_W_0_0F91_P_0_LEN_0 */
8498 { "kmovw", { Ew, MaskG }, 0 },
8499 { Bad_Opcode },
8500 },
8501 {
8502 /* MOD_VEX_W_0_0F91_P_0_LEN_0 */
8503 { "kmovq", { Eq, MaskG }, 0 },
8504 { Bad_Opcode },
8505 },
8506 {
8507 /* MOD_VEX_W_0_0F91_P_2_LEN_0 */
8508 { "kmovb", { Eb, MaskG }, 0 },
8509 { Bad_Opcode },
8510 },
8511 {
8512 /* MOD_VEX_W_0_0F91_P_2_LEN_0 */
8513 { "kmovd", { Ed, MaskG }, 0 },
8514 { Bad_Opcode },
8515 },
8516 {
8517 /* MOD_VEX_W_0_0F92_P_0_LEN_0 */
8518 { Bad_Opcode },
8519 { "kmovw", { MaskG, Rdq }, 0 },
8520 },
8521 {
8522 /* MOD_VEX_W_0_0F92_P_2_LEN_0 */
8523 { Bad_Opcode },
8524 { "kmovb", { MaskG, Rdq }, 0 },
8525 },
8526 {
58a211d2 8527 /* MOD_VEX_0F92_P_3_LEN_0 */
ab4e4ed5 8528 { Bad_Opcode },
58a211d2 8529 { "kmovK", { MaskG, Rdq }, 0 },
ab4e4ed5
AF
8530 },
8531 {
8532 /* MOD_VEX_W_0_0F93_P_0_LEN_0 */
8533 { Bad_Opcode },
8534 { "kmovw", { Gdq, MaskR }, 0 },
8535 },
8536 {
8537 /* MOD_VEX_W_0_0F93_P_2_LEN_0 */
8538 { Bad_Opcode },
8539 { "kmovb", { Gdq, MaskR }, 0 },
8540 },
8541 {
58a211d2 8542 /* MOD_VEX_0F93_P_3_LEN_0 */
ab4e4ed5 8543 { Bad_Opcode },
58a211d2 8544 { "kmovK", { Gdq, MaskR }, 0 },
ab4e4ed5
AF
8545 },
8546 {
8547 /* MOD_VEX_W_0_0F98_P_0_LEN_0 */
8548 { Bad_Opcode },
8549 { "kortestw", { MaskG, MaskR }, 0 },
8550 },
8551 {
8552 /* MOD_VEX_W_1_0F98_P_0_LEN_0 */
8553 { Bad_Opcode },
8554 { "kortestq", { MaskG, MaskR }, 0 },
8555 },
8556 {
8557 /* MOD_VEX_W_0_0F98_P_2_LEN_0 */
8558 { Bad_Opcode },
8559 { "kortestb", { MaskG, MaskR }, 0 },
8560 },
8561 {
8562 /* MOD_VEX_W_1_0F98_P_2_LEN_0 */
8563 { Bad_Opcode },
8564 { "kortestd", { MaskG, MaskR }, 0 },
8565 },
8566 {
8567 /* MOD_VEX_W_0_0F99_P_0_LEN_0 */
8568 { Bad_Opcode },
8569 { "ktestw", { MaskG, MaskR }, 0 },
8570 },
8571 {
8572 /* MOD_VEX_W_1_0F99_P_0_LEN_0 */
8573 { Bad_Opcode },
8574 { "ktestq", { MaskG, MaskR }, 0 },
8575 },
8576 {
8577 /* MOD_VEX_W_0_0F99_P_2_LEN_0 */
8578 { Bad_Opcode },
8579 { "ktestb", { MaskG, MaskR }, 0 },
8580 },
8581 {
8582 /* MOD_VEX_W_1_0F99_P_2_LEN_0 */
8583 { Bad_Opcode },
8584 { "ktestd", { MaskG, MaskR }, 0 },
8585 },
876d4bfa 8586 {
592a252b
L
8587 /* MOD_VEX_0FAE_REG_2 */
8588 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_2_M_0) },
876d4bfa 8589 },
bbedc832 8590 {
592a252b
L
8591 /* MOD_VEX_0FAE_REG_3 */
8592 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_3_M_0) },
bbedc832 8593 },
144c41d9 8594 {
7531c613 8595 /* MOD_VEX_0FD7 */
592d1631 8596 { Bad_Opcode },
7531c613 8597 { "vpmovmskb", { Gdq, XS }, PREFIX_DATA },
144c41d9 8598 },
1afd85e3 8599 {
7531c613
JB
8600 /* MOD_VEX_0FE7 */
8601 { "vmovntdq", { Mx, XM }, PREFIX_DATA },
1afd85e3
L
8602 },
8603 {
592a252b 8604 /* MOD_VEX_0FF0_PREFIX_3 */
ec6f095a 8605 { "vlddqu", { XM, M }, 0 },
92fddf8e 8606 },
75c135a8 8607 {
7531c613
JB
8608 /* MOD_VEX_0F381A */
8609 { VEX_LEN_TABLE (VEX_LEN_0F381A_M_0) },
75c135a8 8610 },
1afd85e3 8611 {
7531c613
JB
8612 /* MOD_VEX_0F382A */
8613 { "vmovntdqa", { XM, Mx }, PREFIX_DATA },
1afd85e3 8614 },
75c135a8 8615 {
7531c613
JB
8616 /* MOD_VEX_0F382C */
8617 { VEX_W_TABLE (VEX_W_0F382C_M_0) },
75c135a8 8618 },
1afd85e3 8619 {
7531c613
JB
8620 /* MOD_VEX_0F382D */
8621 { VEX_W_TABLE (VEX_W_0F382D_M_0) },
1afd85e3
L
8622 },
8623 {
7531c613
JB
8624 /* MOD_VEX_0F382E */
8625 { VEX_W_TABLE (VEX_W_0F382E_M_0) },
1afd85e3
L
8626 },
8627 {
7531c613
JB
8628 /* MOD_VEX_0F382F */
8629 { VEX_W_TABLE (VEX_W_0F382F_M_0) },
1afd85e3 8630 },
6c30d220 8631 {
7531c613
JB
8632 /* MOD_VEX_0F385A */
8633 { VEX_LEN_TABLE (VEX_LEN_0F385A_M_0) },
6c30d220
L
8634 },
8635 {
7531c613
JB
8636 /* MOD_VEX_0F388C */
8637 { "vpmaskmov%DQ", { XM, Vex, Mx }, PREFIX_DATA },
6c30d220
L
8638 },
8639 {
7531c613
JB
8640 /* MOD_VEX_0F388E */
8641 { "vpmaskmov%DQ", { Mx, Vex, XM }, PREFIX_DATA },
6c30d220 8642 },
ab4e4ed5 8643 {
bb5b3501 8644 /* MOD_VEX_0F3A30_L_0 */
ab4e4ed5 8645 { Bad_Opcode },
bb5b3501 8646 { "kshiftr%BW", { MaskG, MaskR, Ib }, PREFIX_DATA },
ab4e4ed5
AF
8647 },
8648 {
bb5b3501 8649 /* MOD_VEX_0F3A31_L_0 */
ab4e4ed5 8650 { Bad_Opcode },
bb5b3501 8651 { "kshiftr%DQ", { MaskG, MaskR, Ib }, PREFIX_DATA },
ab4e4ed5
AF
8652 },
8653 {
bb5b3501 8654 /* MOD_VEX_0F3A32_L_0 */
ab4e4ed5 8655 { Bad_Opcode },
bb5b3501 8656 { "kshiftl%BW", { MaskG, MaskR, Ib }, PREFIX_DATA },
ab4e4ed5
AF
8657 },
8658 {
bb5b3501 8659 /* MOD_VEX_0F3A33_L_0 */
ab4e4ed5 8660 { Bad_Opcode },
bb5b3501 8661 { "kshiftl%DQ", { MaskG, MaskR, Ib }, PREFIX_DATA },
ab4e4ed5 8662 },
467bbef0
JB
8663 {
8664 /* MOD_VEX_0FXOP_09_12 */
8665 { Bad_Opcode },
8666 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_12_M_1) },
8667 },
ad692897
L
8668
8669#include "i386-dis-evex-mod.h"
b844680a
L
8670};
8671
1ceb70f8 8672static const struct dis386 rm_table[][8] = {
42164a71
L
8673 {
8674 /* RM_C6_REG_7 */
bf890a93 8675 { "xabort", { Skip_MODRM, Ib }, 0 },
42164a71
L
8676 },
8677 {
8678 /* RM_C7_REG_7 */
376cd056 8679 { "xbeginT", { Skip_MODRM, Jdqw }, 0 },
42164a71 8680 },
b844680a 8681 {
1ceb70f8 8682 /* RM_0F01_REG_0 */
a4e78aa5 8683 { "enclv", { Skip_MODRM }, 0 },
bf890a93
IT
8684 { "vmcall", { Skip_MODRM }, 0 },
8685 { "vmlaunch", { Skip_MODRM }, 0 },
8686 { "vmresume", { Skip_MODRM }, 0 },
8687 { "vmxoff", { Skip_MODRM }, 0 },
be3a8dca 8688 { "pconfig", { Skip_MODRM }, 0 },
b844680a
L
8689 },
8690 {
1ceb70f8 8691 /* RM_0F01_REG_1 */
bf890a93
IT
8692 { "monitor", { { OP_Monitor, 0 } }, 0 },
8693 { "mwait", { { OP_Mwait, 0 } }, 0 },
8694 { "clac", { Skip_MODRM }, 0 },
8695 { "stac", { Skip_MODRM }, 0 },
2cf200a4
IT
8696 { Bad_Opcode },
8697 { Bad_Opcode },
8698 { Bad_Opcode },
bf890a93 8699 { "encls", { Skip_MODRM }, 0 },
b844680a 8700 },
475a2301
L
8701 {
8702 /* RM_0F01_REG_2 */
bf890a93
IT
8703 { "xgetbv", { Skip_MODRM }, 0 },
8704 { "xsetbv", { Skip_MODRM }, 0 },
8729a6f6
L
8705 { Bad_Opcode },
8706 { Bad_Opcode },
bf890a93
IT
8707 { "vmfunc", { Skip_MODRM }, 0 },
8708 { "xend", { Skip_MODRM }, 0 },
8709 { "xtest", { Skip_MODRM }, 0 },
8710 { "enclu", { Skip_MODRM }, 0 },
475a2301 8711 },
b844680a 8712 {
1ceb70f8 8713 /* RM_0F01_REG_3 */
bf890a93 8714 { "vmrun", { Skip_MODRM }, 0 },
a847e322 8715 { PREFIX_TABLE (PREFIX_0F01_REG_3_RM_1) },
bf890a93
IT
8716 { "vmload", { Skip_MODRM }, 0 },
8717 { "vmsave", { Skip_MODRM }, 0 },
8718 { "stgi", { Skip_MODRM }, 0 },
8719 { "clgi", { Skip_MODRM }, 0 },
8720 { "skinit", { Skip_MODRM }, 0 },
8721 { "invlpga", { Skip_MODRM }, 0 },
4e7d34a6 8722 },
8eab4136 8723 {
f8687e93
JB
8724 /* RM_0F01_REG_5_MOD_3 */
8725 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_0) },
bb651e8b 8726 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_1) },
f8687e93 8727 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_2) },
8eab4136
L
8728 { Bad_Opcode },
8729 { Bad_Opcode },
8730 { Bad_Opcode },
8731 { "rdpkru", { Skip_MODRM }, 0 },
8732 { "wrpkru", { Skip_MODRM }, 0 },
8733 },
4e7d34a6 8734 {
f8687e93 8735 /* RM_0F01_REG_7_MOD_3 */
bf890a93
IT
8736 { "swapgs", { Skip_MODRM }, 0 },
8737 { "rdtscp", { Skip_MODRM }, 0 },
267b8516 8738 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_2) },
035e7389 8739 { "mwaitx", { { OP_Mwait, eBX_reg } }, PREFIX_OPCODE },
bf890a93 8740 { "clzero", { Skip_MODRM }, 0 },
142861df 8741 { "rdpru", { Skip_MODRM }, 0 },
b844680a 8742 },
603555e5 8743 {
f8687e93 8744 /* RM_0F1E_P_1_MOD_3_REG_7 */
603555e5
L
8745 { "nopQ", { Ev }, 0 },
8746 { "nopQ", { Ev }, 0 },
8747 { "endbr64", { Skip_MODRM }, PREFIX_OPCODE },
8748 { "endbr32", { Skip_MODRM }, PREFIX_OPCODE },
8749 { "nopQ", { Ev }, 0 },
8750 { "nopQ", { Ev }, 0 },
8751 { "nopQ", { Ev }, 0 },
8752 { "nopQ", { Ev }, 0 },
8753 },
b844680a 8754 {
f8687e93 8755 /* RM_0FAE_REG_6_MOD_3 */
bf890a93 8756 { "mfence", { Skip_MODRM }, 0 },
b844680a 8757 },
bbedc832 8758 {
f8687e93 8759 /* RM_0FAE_REG_7_MOD_3 */
b5cefcca
L
8760 { "sfence", { Skip_MODRM }, 0 },
8761
144c41d9 8762 },
260cd341
LC
8763 {
8764 /* RM_VEX_0F3849_X86_64_P_0_W_0_M_1_R_0 */
8765 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_0_W_0_M_1_REG_0_RM_0) },
8766 },
b844680a
L
8767};
8768
c608c12e
AM
8769#define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
8770
f16cd0d5
L
8771/* We use the high bit to indicate different name for the same
8772 prefix. */
f16cd0d5 8773#define REP_PREFIX (0xf3 | 0x100)
42164a71
L
8774#define XACQUIRE_PREFIX (0xf2 | 0x200)
8775#define XRELEASE_PREFIX (0xf3 | 0x400)
7e8b059b 8776#define BND_PREFIX (0xf2 | 0x400)
04ef582a 8777#define NOTRACK_PREFIX (0x3e | 0x100)
f16cd0d5 8778
1d67fe3b
TT
8779/* Remember if the current op is a jump instruction. */
8780static bfd_boolean op_is_jump = FALSE;
8781
f16cd0d5 8782static int
26ca5450 8783ckprefix (void)
252b5132 8784{
f16cd0d5 8785 int newrex, i, length;
52b15da3 8786 rex = 0;
252b5132 8787 prefixes = 0;
7d421014 8788 used_prefixes = 0;
52b15da3 8789 rex_used = 0;
f16cd0d5
L
8790 last_lock_prefix = -1;
8791 last_repz_prefix = -1;
8792 last_repnz_prefix = -1;
8793 last_data_prefix = -1;
8794 last_addr_prefix = -1;
8795 last_rex_prefix = -1;
8796 last_seg_prefix = -1;
d9949a36 8797 fwait_prefix = -1;
285ca992 8798 active_seg_prefix = 0;
f310f33d
L
8799 for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
8800 all_prefixes[i] = 0;
8801 i = 0;
f16cd0d5
L
8802 length = 0;
8803 /* The maximum instruction length is 15bytes. */
8804 while (length < MAX_CODE_LENGTH - 1)
252b5132
RH
8805 {
8806 FETCH_DATA (the_info, codep + 1);
52b15da3 8807 newrex = 0;
252b5132
RH
8808 switch (*codep)
8809 {
52b15da3
JH
8810 /* REX prefixes family. */
8811 case 0x40:
8812 case 0x41:
8813 case 0x42:
8814 case 0x43:
8815 case 0x44:
8816 case 0x45:
8817 case 0x46:
8818 case 0x47:
8819 case 0x48:
8820 case 0x49:
8821 case 0x4a:
8822 case 0x4b:
8823 case 0x4c:
8824 case 0x4d:
8825 case 0x4e:
8826 case 0x4f:
f16cd0d5
L
8827 if (address_mode == mode_64bit)
8828 newrex = *codep;
8829 else
8830 return 1;
8831 last_rex_prefix = i;
52b15da3 8832 break;
252b5132
RH
8833 case 0xf3:
8834 prefixes |= PREFIX_REPZ;
f16cd0d5 8835 last_repz_prefix = i;
252b5132
RH
8836 break;
8837 case 0xf2:
8838 prefixes |= PREFIX_REPNZ;
f16cd0d5 8839 last_repnz_prefix = i;
252b5132
RH
8840 break;
8841 case 0xf0:
8842 prefixes |= PREFIX_LOCK;
f16cd0d5 8843 last_lock_prefix = i;
252b5132
RH
8844 break;
8845 case 0x2e:
8846 prefixes |= PREFIX_CS;
f16cd0d5 8847 last_seg_prefix = i;
285ca992 8848 active_seg_prefix = PREFIX_CS;
252b5132
RH
8849 break;
8850 case 0x36:
8851 prefixes |= PREFIX_SS;
f16cd0d5 8852 last_seg_prefix = i;
285ca992 8853 active_seg_prefix = PREFIX_SS;
252b5132
RH
8854 break;
8855 case 0x3e:
8856 prefixes |= PREFIX_DS;
f16cd0d5 8857 last_seg_prefix = i;
285ca992 8858 active_seg_prefix = PREFIX_DS;
252b5132
RH
8859 break;
8860 case 0x26:
8861 prefixes |= PREFIX_ES;
f16cd0d5 8862 last_seg_prefix = i;
285ca992 8863 active_seg_prefix = PREFIX_ES;
252b5132
RH
8864 break;
8865 case 0x64:
8866 prefixes |= PREFIX_FS;
f16cd0d5 8867 last_seg_prefix = i;
285ca992 8868 active_seg_prefix = PREFIX_FS;
252b5132
RH
8869 break;
8870 case 0x65:
8871 prefixes |= PREFIX_GS;
f16cd0d5 8872 last_seg_prefix = i;
285ca992 8873 active_seg_prefix = PREFIX_GS;
252b5132
RH
8874 break;
8875 case 0x66:
8876 prefixes |= PREFIX_DATA;
f16cd0d5 8877 last_data_prefix = i;
252b5132
RH
8878 break;
8879 case 0x67:
8880 prefixes |= PREFIX_ADDR;
f16cd0d5 8881 last_addr_prefix = i;
252b5132 8882 break;
5076851f 8883 case FWAIT_OPCODE:
252b5132
RH
8884 /* fwait is really an instruction. If there are prefixes
8885 before the fwait, they belong to the fwait, *not* to the
8886 following instruction. */
d9949a36 8887 fwait_prefix = i;
3e7d61b2 8888 if (prefixes || rex)
252b5132
RH
8889 {
8890 prefixes |= PREFIX_FWAIT;
8891 codep++;
6c067bbb
RM
8892 /* This ensures that the previous REX prefixes are noticed
8893 as unused prefixes, as in the return case below. */
8894 rex_used = rex;
f16cd0d5 8895 return 1;
252b5132
RH
8896 }
8897 prefixes = PREFIX_FWAIT;
8898 break;
8899 default:
f16cd0d5 8900 return 1;
252b5132 8901 }
52b15da3
JH
8902 /* Rex is ignored when followed by another prefix. */
8903 if (rex)
8904 {
3e7d61b2 8905 rex_used = rex;
f16cd0d5 8906 return 1;
52b15da3 8907 }
f16cd0d5 8908 if (*codep != FWAIT_OPCODE)
4e9ac44a 8909 all_prefixes[i++] = *codep;
52b15da3 8910 rex = newrex;
252b5132 8911 codep++;
f16cd0d5
L
8912 length++;
8913 }
8914 return 0;
8915}
8916
7d421014
ILT
8917/* Return the name of the prefix byte PREF, or NULL if PREF is not a
8918 prefix byte. */
8919
8920static const char *
26ca5450 8921prefix_name (int pref, int sizeflag)
7d421014 8922{
0003779b
L
8923 static const char *rexes [16] =
8924 {
8925 "rex", /* 0x40 */
8926 "rex.B", /* 0x41 */
8927 "rex.X", /* 0x42 */
8928 "rex.XB", /* 0x43 */
8929 "rex.R", /* 0x44 */
8930 "rex.RB", /* 0x45 */
8931 "rex.RX", /* 0x46 */
8932 "rex.RXB", /* 0x47 */
8933 "rex.W", /* 0x48 */
8934 "rex.WB", /* 0x49 */
8935 "rex.WX", /* 0x4a */
8936 "rex.WXB", /* 0x4b */
8937 "rex.WR", /* 0x4c */
8938 "rex.WRB", /* 0x4d */
8939 "rex.WRX", /* 0x4e */
8940 "rex.WRXB", /* 0x4f */
8941 };
8942
7d421014
ILT
8943 switch (pref)
8944 {
52b15da3
JH
8945 /* REX prefixes family. */
8946 case 0x40:
52b15da3 8947 case 0x41:
52b15da3 8948 case 0x42:
52b15da3 8949 case 0x43:
52b15da3 8950 case 0x44:
52b15da3 8951 case 0x45:
52b15da3 8952 case 0x46:
52b15da3 8953 case 0x47:
52b15da3 8954 case 0x48:
52b15da3 8955 case 0x49:
52b15da3 8956 case 0x4a:
52b15da3 8957 case 0x4b:
52b15da3 8958 case 0x4c:
52b15da3 8959 case 0x4d:
52b15da3 8960 case 0x4e:
52b15da3 8961 case 0x4f:
0003779b 8962 return rexes [pref - 0x40];
7d421014
ILT
8963 case 0xf3:
8964 return "repz";
8965 case 0xf2:
8966 return "repnz";
8967 case 0xf0:
8968 return "lock";
8969 case 0x2e:
8970 return "cs";
8971 case 0x36:
8972 return "ss";
8973 case 0x3e:
8974 return "ds";
8975 case 0x26:
8976 return "es";
8977 case 0x64:
8978 return "fs";
8979 case 0x65:
8980 return "gs";
8981 case 0x66:
8982 return (sizeflag & DFLAG) ? "data16" : "data32";
8983 case 0x67:
cb712a9e 8984 if (address_mode == mode_64bit)
db6eb5be 8985 return (sizeflag & AFLAG) ? "addr32" : "addr64";
c1a64871 8986 else
2888cb7a 8987 return (sizeflag & AFLAG) ? "addr16" : "addr32";
7d421014
ILT
8988 case FWAIT_OPCODE:
8989 return "fwait";
f16cd0d5
L
8990 case REP_PREFIX:
8991 return "rep";
42164a71
L
8992 case XACQUIRE_PREFIX:
8993 return "xacquire";
8994 case XRELEASE_PREFIX:
8995 return "xrelease";
7e8b059b
L
8996 case BND_PREFIX:
8997 return "bnd";
04ef582a
L
8998 case NOTRACK_PREFIX:
8999 return "notrack";
7d421014
ILT
9000 default:
9001 return NULL;
9002 }
9003}
9004
ce518a5f
L
9005static char op_out[MAX_OPERANDS][100];
9006static int op_ad, op_index[MAX_OPERANDS];
1d9f512f 9007static int two_source_ops;
ce518a5f
L
9008static bfd_vma op_address[MAX_OPERANDS];
9009static bfd_vma op_riprel[MAX_OPERANDS];
52b15da3 9010static bfd_vma start_pc;
ce518a5f 9011
252b5132
RH
9012/*
9013 * On the 386's of 1988, the maximum length of an instruction is 15 bytes.
9014 * (see topic "Redundant prefixes" in the "Differences from 8086"
9015 * section of the "Virtual 8086 Mode" chapter.)
9016 * 'pc' should be the address of this instruction, it will
9017 * be used to print the target address if this is a relative jump or call
9018 * The function returns the length of this instruction in bytes.
9019 */
9020
252b5132 9021static char intel_syntax;
9d141669 9022static char intel_mnemonic = !SYSV386_COMPAT;
252b5132
RH
9023static char open_char;
9024static char close_char;
9025static char separator_char;
9026static char scale_char;
9027
5db04b09
L
9028enum x86_64_isa
9029{
d835a58b 9030 amd64 = 1,
5db04b09
L
9031 intel64
9032};
9033
9034static enum x86_64_isa isa64;
9035
e396998b
AM
9036/* Here for backwards compatibility. When gdb stops using
9037 print_insn_i386_att and print_insn_i386_intel these functions can
9038 disappear, and print_insn_i386 be merged into print_insn. */
252b5132 9039int
26ca5450 9040print_insn_i386_att (bfd_vma pc, disassemble_info *info)
252b5132
RH
9041{
9042 intel_syntax = 0;
e396998b
AM
9043
9044 return print_insn (pc, info);
252b5132
RH
9045}
9046
9047int
26ca5450 9048print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
252b5132
RH
9049{
9050 intel_syntax = 1;
e396998b
AM
9051
9052 return print_insn (pc, info);
252b5132
RH
9053}
9054
e396998b 9055int
26ca5450 9056print_insn_i386 (bfd_vma pc, disassemble_info *info)
e396998b
AM
9057{
9058 intel_syntax = -1;
9059
9060 return print_insn (pc, info);
9061}
9062
f59a29b9
L
9063void
9064print_i386_disassembler_options (FILE *stream)
9065{
9066 fprintf (stream, _("\n\
9067The following i386/x86-64 specific disassembler options are supported for use\n\
9068with the -M switch (multiple options should be separated by commas):\n"));
9069
9070 fprintf (stream, _(" x86-64 Disassemble in 64bit mode\n"));
9071 fprintf (stream, _(" i386 Disassemble in 32bit mode\n"));
9072 fprintf (stream, _(" i8086 Disassemble in 16bit mode\n"));
9073 fprintf (stream, _(" att Display instruction in AT&T syntax\n"));
9074 fprintf (stream, _(" intel Display instruction in Intel syntax\n"));
9d141669
L
9075 fprintf (stream, _(" att-mnemonic\n"
9076 " Display instruction in AT&T mnemonic\n"));
9077 fprintf (stream, _(" intel-mnemonic\n"
9078 " Display instruction in Intel mnemonic\n"));
f59a29b9
L
9079 fprintf (stream, _(" addr64 Assume 64bit address size\n"));
9080 fprintf (stream, _(" addr32 Assume 32bit address size\n"));
9081 fprintf (stream, _(" addr16 Assume 16bit address size\n"));
9082 fprintf (stream, _(" data32 Assume 32bit data size\n"));
9083 fprintf (stream, _(" data16 Assume 16bit data size\n"));
9084 fprintf (stream, _(" suffix Always display instruction suffix in AT&T syntax\n"));
5db04b09
L
9085 fprintf (stream, _(" amd64 Display instruction in AMD64 ISA\n"));
9086 fprintf (stream, _(" intel64 Display instruction in Intel64 ISA\n"));
f59a29b9
L
9087}
9088
592d1631 9089/* Bad opcode. */
bf890a93 9090static const struct dis386 bad_opcode = { "(bad)", { XX }, 0 };
592d1631 9091
b844680a
L
9092/* Get a pointer to struct dis386 with a valid name. */
9093
9094static const struct dis386 *
8bb15339 9095get_valid_dis386 (const struct dis386 *dp, disassemble_info *info)
b844680a 9096{
91d6fa6a 9097 int vindex, vex_table_index;
b844680a
L
9098
9099 if (dp->name != NULL)
9100 return dp;
9101
9102 switch (dp->op[0].bytemode)
9103 {
1ceb70f8
L
9104 case USE_REG_TABLE:
9105 dp = &reg_table[dp->op[1].bytemode][modrm.reg];
9106 break;
9107
9108 case USE_MOD_TABLE:
91d6fa6a
NC
9109 vindex = modrm.mod == 0x3 ? 1 : 0;
9110 dp = &mod_table[dp->op[1].bytemode][vindex];
1ceb70f8
L
9111 break;
9112
9113 case USE_RM_TABLE:
9114 dp = &rm_table[dp->op[1].bytemode][modrm.rm];
b844680a
L
9115 break;
9116
4e7d34a6 9117 case USE_PREFIX_TABLE:
c0f3af97 9118 if (need_vex)
b844680a 9119 {
c0f3af97
L
9120 /* The prefix in VEX is implicit. */
9121 switch (vex.prefix)
9122 {
9123 case 0:
91d6fa6a 9124 vindex = 0;
c0f3af97
L
9125 break;
9126 case REPE_PREFIX_OPCODE:
91d6fa6a 9127 vindex = 1;
c0f3af97
L
9128 break;
9129 case DATA_PREFIX_OPCODE:
91d6fa6a 9130 vindex = 2;
c0f3af97
L
9131 break;
9132 case REPNE_PREFIX_OPCODE:
91d6fa6a 9133 vindex = 3;
c0f3af97
L
9134 break;
9135 default:
9136 abort ();
9137 break;
9138 }
b844680a 9139 }
7bb15c6f 9140 else
b844680a 9141 {
285ca992
L
9142 int last_prefix = -1;
9143 int prefix = 0;
91d6fa6a 9144 vindex = 0;
285ca992
L
9145 /* We check PREFIX_REPNZ and PREFIX_REPZ before PREFIX_DATA.
9146 When there are multiple PREFIX_REPNZ and PREFIX_REPZ, the
9147 last one wins. */
9148 if ((prefixes & (PREFIX_REPZ | PREFIX_REPNZ)) != 0)
b844680a 9149 {
285ca992 9150 if (last_repz_prefix > last_repnz_prefix)
c0f3af97 9151 {
285ca992
L
9152 vindex = 1;
9153 prefix = PREFIX_REPZ;
9154 last_prefix = last_repz_prefix;
c0f3af97
L
9155 }
9156 else
b844680a 9157 {
285ca992
L
9158 vindex = 3;
9159 prefix = PREFIX_REPNZ;
9160 last_prefix = last_repnz_prefix;
b844680a 9161 }
285ca992 9162
507bd325
L
9163 /* Check if prefix should be ignored. */
9164 if ((((prefix_table[dp->op[1].bytemode][vindex].prefix_requirement
9165 & PREFIX_IGNORED) >> PREFIX_IGNORED_SHIFT)
9166 & prefix) != 0)
285ca992
L
9167 vindex = 0;
9168 }
9169
9170 if (vindex == 0 && (prefixes & PREFIX_DATA) != 0)
9171 {
9172 vindex = 2;
9173 prefix = PREFIX_DATA;
9174 last_prefix = last_data_prefix;
9175 }
9176
9177 if (vindex != 0)
9178 {
9179 used_prefixes |= prefix;
9180 all_prefixes[last_prefix] = 0;
b844680a
L
9181 }
9182 }
91d6fa6a 9183 dp = &prefix_table[dp->op[1].bytemode][vindex];
b844680a
L
9184 break;
9185
4e7d34a6 9186 case USE_X86_64_TABLE:
91d6fa6a
NC
9187 vindex = address_mode == mode_64bit ? 1 : 0;
9188 dp = &x86_64_table[dp->op[1].bytemode][vindex];
b844680a
L
9189 break;
9190
4e7d34a6 9191 case USE_3BYTE_TABLE:
8bb15339 9192 FETCH_DATA (info, codep + 2);
91d6fa6a
NC
9193 vindex = *codep++;
9194 dp = &three_byte_table[dp->op[1].bytemode][vindex];
285ca992 9195 end_codep = codep;
8bb15339
L
9196 modrm.mod = (*codep >> 6) & 3;
9197 modrm.reg = (*codep >> 3) & 7;
9198 modrm.rm = *codep & 7;
9199 break;
9200
c0f3af97
L
9201 case USE_VEX_LEN_TABLE:
9202 if (!need_vex)
9203 abort ();
9204
9205 switch (vex.length)
9206 {
9207 case 128:
91d6fa6a 9208 vindex = 0;
c0f3af97
L
9209 break;
9210 case 256:
91d6fa6a 9211 vindex = 1;
c0f3af97
L
9212 break;
9213 default:
9214 abort ();
9215 break;
9216 }
9217
91d6fa6a 9218 dp = &vex_len_table[dp->op[1].bytemode][vindex];
c0f3af97
L
9219 break;
9220
04e2a182
L
9221 case USE_EVEX_LEN_TABLE:
9222 if (!vex.evex)
9223 abort ();
9224
9225 switch (vex.length)
9226 {
9227 case 128:
9228 vindex = 0;
9229 break;
9230 case 256:
9231 vindex = 1;
9232 break;
9233 case 512:
9234 vindex = 2;
9235 break;
9236 default:
9237 abort ();
9238 break;
9239 }
9240
9241 dp = &evex_len_table[dp->op[1].bytemode][vindex];
9242 break;
9243
f88c9eb0
SP
9244 case USE_XOP_8F_TABLE:
9245 FETCH_DATA (info, codep + 3);
f88c9eb0
SP
9246 rex = ~(*codep >> 5) & 0x7;
9247
9248 /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm". */
9249 switch ((*codep & 0x1f))
9250 {
9251 default:
f07af43e
L
9252 dp = &bad_opcode;
9253 return dp;
5dd85c99
SP
9254 case 0x8:
9255 vex_table_index = XOP_08;
9256 break;
f88c9eb0
SP
9257 case 0x9:
9258 vex_table_index = XOP_09;
9259 break;
9260 case 0xa:
9261 vex_table_index = XOP_0A;
9262 break;
9263 }
9264 codep++;
9265 vex.w = *codep & 0x80;
9266 if (vex.w && address_mode == mode_64bit)
9267 rex |= REX_W;
9268
9269 vex.register_specifier = (~(*codep >> 3)) & 0xf;
abfcb414 9270 if (address_mode != mode_64bit)
f07af43e 9271 {
abfcb414
AP
9272 /* In 16/32-bit mode REX_B is silently ignored. */
9273 rex &= ~REX_B;
f07af43e 9274 }
f88c9eb0
SP
9275
9276 vex.length = (*codep & 0x4) ? 256 : 128;
9277 switch ((*codep & 0x3))
9278 {
9279 case 0:
f88c9eb0
SP
9280 break;
9281 case 1:
9282 vex.prefix = DATA_PREFIX_OPCODE;
9283 break;
9284 case 2:
9285 vex.prefix = REPE_PREFIX_OPCODE;
9286 break;
9287 case 3:
9288 vex.prefix = REPNE_PREFIX_OPCODE;
9289 break;
9290 }
9291 need_vex = 1;
f88c9eb0 9292 codep++;
91d6fa6a
NC
9293 vindex = *codep++;
9294 dp = &xop_table[vex_table_index][vindex];
c48244a5 9295
285ca992 9296 end_codep = codep;
c48244a5
SP
9297 FETCH_DATA (info, codep + 1);
9298 modrm.mod = (*codep >> 6) & 3;
9299 modrm.reg = (*codep >> 3) & 7;
9300 modrm.rm = *codep & 7;
b5b098c2
JB
9301
9302 /* No XOP encoding so far allows for a non-zero embedded prefix. Avoid
9303 having to decode the bits for every otherwise valid encoding. */
9304 if (vex.prefix)
9305 return &bad_opcode;
f88c9eb0
SP
9306 break;
9307
c0f3af97 9308 case USE_VEX_C4_TABLE:
43234a1e 9309 /* VEX prefix. */
c0f3af97 9310 FETCH_DATA (info, codep + 3);
c0f3af97
L
9311 rex = ~(*codep >> 5) & 0x7;
9312 switch ((*codep & 0x1f))
9313 {
9314 default:
f07af43e
L
9315 dp = &bad_opcode;
9316 return dp;
c0f3af97 9317 case 0x1:
f88c9eb0 9318 vex_table_index = VEX_0F;
c0f3af97
L
9319 break;
9320 case 0x2:
f88c9eb0 9321 vex_table_index = VEX_0F38;
c0f3af97
L
9322 break;
9323 case 0x3:
f88c9eb0 9324 vex_table_index = VEX_0F3A;
c0f3af97
L
9325 break;
9326 }
9327 codep++;
9328 vex.w = *codep & 0x80;
9889cbb1 9329 if (address_mode == mode_64bit)
f07af43e 9330 {
9889cbb1
L
9331 if (vex.w)
9332 rex |= REX_W;
9889cbb1
L
9333 }
9334 else
9335 {
9336 /* For the 3-byte VEX prefix in 32-bit mode, the REX_B bit
9337 is ignored, other REX bits are 0 and the highest bit in
5f847646 9338 VEX.vvvv is also ignored (but we mustn't clear it here). */
9889cbb1 9339 rex = 0;
f07af43e 9340 }
5f847646 9341 vex.register_specifier = (~(*codep >> 3)) & 0xf;
c0f3af97
L
9342 vex.length = (*codep & 0x4) ? 256 : 128;
9343 switch ((*codep & 0x3))
9344 {
9345 case 0:
c0f3af97
L
9346 break;
9347 case 1:
9348 vex.prefix = DATA_PREFIX_OPCODE;
9349 break;
9350 case 2:
9351 vex.prefix = REPE_PREFIX_OPCODE;
9352 break;
9353 case 3:
9354 vex.prefix = REPNE_PREFIX_OPCODE;
9355 break;
9356 }
9357 need_vex = 1;
c0f3af97 9358 codep++;
91d6fa6a
NC
9359 vindex = *codep++;
9360 dp = &vex_table[vex_table_index][vindex];
285ca992 9361 end_codep = codep;
53c4d625
JB
9362 /* There is no MODRM byte for VEX0F 77. */
9363 if (vex_table_index != VEX_0F || vindex != 0x77)
c0f3af97
L
9364 {
9365 FETCH_DATA (info, codep + 1);
9366 modrm.mod = (*codep >> 6) & 3;
9367 modrm.reg = (*codep >> 3) & 7;
9368 modrm.rm = *codep & 7;
9369 }
9370 break;
9371
9372 case USE_VEX_C5_TABLE:
43234a1e 9373 /* VEX prefix. */
c0f3af97 9374 FETCH_DATA (info, codep + 2);
c0f3af97
L
9375 rex = (*codep & 0x80) ? 0 : REX_R;
9376
9889cbb1
L
9377 /* For the 2-byte VEX prefix in 32-bit mode, the highest bit in
9378 VEX.vvvv is 1. */
c0f3af97 9379 vex.register_specifier = (~(*codep >> 3)) & 0xf;
c0f3af97
L
9380 vex.length = (*codep & 0x4) ? 256 : 128;
9381 switch ((*codep & 0x3))
9382 {
9383 case 0:
c0f3af97
L
9384 break;
9385 case 1:
9386 vex.prefix = DATA_PREFIX_OPCODE;
9387 break;
9388 case 2:
9389 vex.prefix = REPE_PREFIX_OPCODE;
9390 break;
9391 case 3:
9392 vex.prefix = REPNE_PREFIX_OPCODE;
9393 break;
9394 }
9395 need_vex = 1;
c0f3af97 9396 codep++;
91d6fa6a
NC
9397 vindex = *codep++;
9398 dp = &vex_table[dp->op[1].bytemode][vindex];
285ca992 9399 end_codep = codep;
53c4d625
JB
9400 /* There is no MODRM byte for VEX 77. */
9401 if (vindex != 0x77)
c0f3af97
L
9402 {
9403 FETCH_DATA (info, codep + 1);
9404 modrm.mod = (*codep >> 6) & 3;
9405 modrm.reg = (*codep >> 3) & 7;
9406 modrm.rm = *codep & 7;
9407 }
9408 break;
9409
9e30b8e0
L
9410 case USE_VEX_W_TABLE:
9411 if (!need_vex)
9412 abort ();
9413
9414 dp = &vex_w_table[dp->op[1].bytemode][vex.w ? 1 : 0];
9415 break;
9416
43234a1e
L
9417 case USE_EVEX_TABLE:
9418 two_source_ops = 0;
9419 /* EVEX prefix. */
9420 vex.evex = 1;
9421 FETCH_DATA (info, codep + 4);
43234a1e
L
9422 /* The first byte after 0x62. */
9423 rex = ~(*codep >> 5) & 0x7;
9424 vex.r = *codep & 0x10;
9425 switch ((*codep & 0xf))
9426 {
9427 default:
9428 return &bad_opcode;
9429 case 0x1:
9430 vex_table_index = EVEX_0F;
9431 break;
9432 case 0x2:
9433 vex_table_index = EVEX_0F38;
9434 break;
9435 case 0x3:
9436 vex_table_index = EVEX_0F3A;
9437 break;
9438 }
9439
9440 /* The second byte after 0x62. */
9441 codep++;
9442 vex.w = *codep & 0x80;
9443 if (vex.w && address_mode == mode_64bit)
9444 rex |= REX_W;
9445
9446 vex.register_specifier = (~(*codep >> 3)) & 0xf;
43234a1e
L
9447
9448 /* The U bit. */
9449 if (!(*codep & 0x4))
9450 return &bad_opcode;
9451
9452 switch ((*codep & 0x3))
9453 {
9454 case 0:
43234a1e
L
9455 break;
9456 case 1:
9457 vex.prefix = DATA_PREFIX_OPCODE;
9458 break;
9459 case 2:
9460 vex.prefix = REPE_PREFIX_OPCODE;
9461 break;
9462 case 3:
9463 vex.prefix = REPNE_PREFIX_OPCODE;
9464 break;
9465 }
9466
9467 /* The third byte after 0x62. */
9468 codep++;
9469
9470 /* Remember the static rounding bits. */
9471 vex.ll = (*codep >> 5) & 3;
9472 vex.b = (*codep & 0x10) != 0;
9473
9474 vex.v = *codep & 0x8;
9475 vex.mask_register_specifier = *codep & 0x7;
9476 vex.zeroing = *codep & 0x80;
9477
5f847646
JB
9478 if (address_mode != mode_64bit)
9479 {
9480 /* In 16/32-bit mode silently ignore following bits. */
9481 rex &= ~REX_B;
9482 vex.r = 1;
9483 vex.v = 1;
9484 }
9485
43234a1e 9486 need_vex = 1;
43234a1e
L
9487 codep++;
9488 vindex = *codep++;
9489 dp = &evex_table[vex_table_index][vindex];
285ca992 9490 end_codep = codep;
43234a1e
L
9491 FETCH_DATA (info, codep + 1);
9492 modrm.mod = (*codep >> 6) & 3;
9493 modrm.reg = (*codep >> 3) & 7;
9494 modrm.rm = *codep & 7;
9495
9496 /* Set vector length. */
9497 if (modrm.mod == 3 && vex.b)
9498 vex.length = 512;
9499 else
9500 {
9501 switch (vex.ll)
9502 {
9503 case 0x0:
9504 vex.length = 128;
9505 break;
9506 case 0x1:
9507 vex.length = 256;
9508 break;
9509 case 0x2:
9510 vex.length = 512;
9511 break;
9512 default:
9513 return &bad_opcode;
9514 }
9515 }
9516 break;
9517
592d1631
L
9518 case 0:
9519 dp = &bad_opcode;
9520 break;
9521
b844680a 9522 default:
d34b5006 9523 abort ();
b844680a
L
9524 }
9525
9526 if (dp->name != NULL)
9527 return dp;
9528 else
8bb15339 9529 return get_valid_dis386 (dp, info);
b844680a
L
9530}
9531
dfc8cf43 9532static void
55cf16e1 9533get_sib (disassemble_info *info, int sizeflag)
dfc8cf43
L
9534{
9535 /* If modrm.mod == 3, operand must be register. */
9536 if (need_modrm
55cf16e1 9537 && ((sizeflag & AFLAG) || address_mode == mode_64bit)
dfc8cf43
L
9538 && modrm.mod != 3
9539 && modrm.rm == 4)
9540 {
9541 FETCH_DATA (info, codep + 2);
9542 sib.index = (codep [1] >> 3) & 7;
9543 sib.scale = (codep [1] >> 6) & 3;
9544 sib.base = codep [1] & 7;
9545 }
9546}
9547
e396998b 9548static int
26ca5450 9549print_insn (bfd_vma pc, disassemble_info *info)
252b5132 9550{
2da11e11 9551 const struct dis386 *dp;
252b5132 9552 int i;
ce518a5f 9553 char *op_txt[MAX_OPERANDS];
252b5132 9554 int needcomma;
df18fdba 9555 int sizeflag, orig_sizeflag;
e396998b 9556 const char *p;
252b5132 9557 struct dis_private priv;
f16cd0d5 9558 int prefix_length;
252b5132 9559
d7921315
L
9560 priv.orig_sizeflag = AFLAG | DFLAG;
9561 if ((info->mach & bfd_mach_i386_i386) != 0)
cb712a9e 9562 address_mode = mode_32bit;
2da11e11 9563 else if (info->mach == bfd_mach_i386_i8086)
d7921315
L
9564 {
9565 address_mode = mode_16bit;
9566 priv.orig_sizeflag = 0;
9567 }
2da11e11 9568 else
d7921315
L
9569 address_mode = mode_64bit;
9570
9571 if (intel_syntax == (char) -1)
9572 intel_syntax = (info->mach & bfd_mach_i386_intel_syntax) != 0;
e396998b
AM
9573
9574 for (p = info->disassembler_options; p != NULL; )
9575 {
5db04b09
L
9576 if (CONST_STRNEQ (p, "amd64"))
9577 isa64 = amd64;
9578 else if (CONST_STRNEQ (p, "intel64"))
9579 isa64 = intel64;
9580 else if (CONST_STRNEQ (p, "x86-64"))
e396998b 9581 {
cb712a9e 9582 address_mode = mode_64bit;
2a1bb84c 9583 priv.orig_sizeflag |= AFLAG | DFLAG;
e396998b 9584 }
0112cd26 9585 else if (CONST_STRNEQ (p, "i386"))
e396998b 9586 {
cb712a9e 9587 address_mode = mode_32bit;
2a1bb84c 9588 priv.orig_sizeflag |= AFLAG | DFLAG;
e396998b 9589 }
0112cd26 9590 else if (CONST_STRNEQ (p, "i8086"))
e396998b 9591 {
cb712a9e 9592 address_mode = mode_16bit;
2a1bb84c 9593 priv.orig_sizeflag &= ~(AFLAG | DFLAG);
e396998b 9594 }
0112cd26 9595 else if (CONST_STRNEQ (p, "intel"))
e396998b
AM
9596 {
9597 intel_syntax = 1;
9d141669
L
9598 if (CONST_STRNEQ (p + 5, "-mnemonic"))
9599 intel_mnemonic = 1;
e396998b 9600 }
0112cd26 9601 else if (CONST_STRNEQ (p, "att"))
e396998b
AM
9602 {
9603 intel_syntax = 0;
9d141669
L
9604 if (CONST_STRNEQ (p + 3, "-mnemonic"))
9605 intel_mnemonic = 0;
e396998b 9606 }
0112cd26 9607 else if (CONST_STRNEQ (p, "addr"))
e396998b 9608 {
f59a29b9
L
9609 if (address_mode == mode_64bit)
9610 {
9611 if (p[4] == '3' && p[5] == '2')
9612 priv.orig_sizeflag &= ~AFLAG;
9613 else if (p[4] == '6' && p[5] == '4')
9614 priv.orig_sizeflag |= AFLAG;
9615 }
9616 else
9617 {
9618 if (p[4] == '1' && p[5] == '6')
9619 priv.orig_sizeflag &= ~AFLAG;
9620 else if (p[4] == '3' && p[5] == '2')
9621 priv.orig_sizeflag |= AFLAG;
9622 }
e396998b 9623 }
0112cd26 9624 else if (CONST_STRNEQ (p, "data"))
e396998b
AM
9625 {
9626 if (p[4] == '1' && p[5] == '6')
9627 priv.orig_sizeflag &= ~DFLAG;
9628 else if (p[4] == '3' && p[5] == '2')
9629 priv.orig_sizeflag |= DFLAG;
9630 }
0112cd26 9631 else if (CONST_STRNEQ (p, "suffix"))
e396998b
AM
9632 priv.orig_sizeflag |= SUFFIX_ALWAYS;
9633
9634 p = strchr (p, ',');
9635 if (p != NULL)
9636 p++;
9637 }
9638
c0f92bf9
L
9639 if (address_mode == mode_64bit && sizeof (bfd_vma) < 8)
9640 {
9641 (*info->fprintf_func) (info->stream,
9642 _("64-bit address is disabled"));
9643 return -1;
9644 }
9645
e396998b
AM
9646 if (intel_syntax)
9647 {
9648 names64 = intel_names64;
9649 names32 = intel_names32;
9650 names16 = intel_names16;
9651 names8 = intel_names8;
9652 names8rex = intel_names8rex;
9653 names_seg = intel_names_seg;
b9733481 9654 names_mm = intel_names_mm;
7e8b059b 9655 names_bnd = intel_names_bnd;
b9733481
L
9656 names_xmm = intel_names_xmm;
9657 names_ymm = intel_names_ymm;
43234a1e 9658 names_zmm = intel_names_zmm;
260cd341 9659 names_tmm = intel_names_tmm;
db51cc60
L
9660 index64 = intel_index64;
9661 index32 = intel_index32;
43234a1e 9662 names_mask = intel_names_mask;
e396998b
AM
9663 index16 = intel_index16;
9664 open_char = '[';
9665 close_char = ']';
9666 separator_char = '+';
9667 scale_char = '*';
9668 }
9669 else
9670 {
9671 names64 = att_names64;
9672 names32 = att_names32;
9673 names16 = att_names16;
9674 names8 = att_names8;
9675 names8rex = att_names8rex;
9676 names_seg = att_names_seg;
b9733481 9677 names_mm = att_names_mm;
7e8b059b 9678 names_bnd = att_names_bnd;
b9733481
L
9679 names_xmm = att_names_xmm;
9680 names_ymm = att_names_ymm;
43234a1e 9681 names_zmm = att_names_zmm;
260cd341 9682 names_tmm = att_names_tmm;
db51cc60
L
9683 index64 = att_index64;
9684 index32 = att_index32;
43234a1e 9685 names_mask = att_names_mask;
e396998b
AM
9686 index16 = att_index16;
9687 open_char = '(';
9688 close_char = ')';
9689 separator_char = ',';
9690 scale_char = ',';
9691 }
2da11e11 9692
4fe53c98 9693 /* The output looks better if we put 7 bytes on a line, since that
8a9036a4
L
9694 puts most long word instructions on a single line. Use 8 bytes
9695 for Intel L1OM. */
d7921315 9696 if ((info->mach & bfd_mach_l1om) != 0)
8a9036a4
L
9697 info->bytes_per_line = 8;
9698 else
9699 info->bytes_per_line = 7;
252b5132 9700
26ca5450 9701 info->private_data = &priv;
252b5132
RH
9702 priv.max_fetched = priv.the_buffer;
9703 priv.insn_start = pc;
252b5132
RH
9704
9705 obuf[0] = 0;
ce518a5f
L
9706 for (i = 0; i < MAX_OPERANDS; ++i)
9707 {
9708 op_out[i][0] = 0;
9709 op_index[i] = -1;
9710 }
252b5132
RH
9711
9712 the_info = info;
9713 start_pc = pc;
e396998b
AM
9714 start_codep = priv.the_buffer;
9715 codep = priv.the_buffer;
252b5132 9716
8df14d78 9717 if (OPCODES_SIGSETJMP (priv.bailout) != 0)
5076851f 9718 {
7d421014
ILT
9719 const char *name;
9720
5076851f 9721 /* Getting here means we tried for data but didn't get it. That
e396998b
AM
9722 means we have an incomplete instruction of some sort. Just
9723 print the first byte as a prefix or a .byte pseudo-op. */
9724 if (codep > priv.the_buffer)
5076851f 9725 {
e396998b 9726 name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
7d421014
ILT
9727 if (name != NULL)
9728 (*info->fprintf_func) (info->stream, "%s", name);
9729 else
5076851f 9730 {
7d421014
ILT
9731 /* Just print the first byte as a .byte instruction. */
9732 (*info->fprintf_func) (info->stream, ".byte 0x%x",
e396998b 9733 (unsigned int) priv.the_buffer[0]);
5076851f 9734 }
5076851f 9735
7d421014 9736 return 1;
5076851f
ILT
9737 }
9738
9739 return -1;
9740 }
9741
52b15da3 9742 obufp = obuf;
f16cd0d5
L
9743 sizeflag = priv.orig_sizeflag;
9744
9745 if (!ckprefix () || rex_used)
9746 {
9747 /* Too many prefixes or unused REX prefixes. */
9748 for (i = 0;
f6dd4781 9749 i < (int) ARRAY_SIZE (all_prefixes) && all_prefixes[i];
f16cd0d5 9750 i++)
de882298 9751 (*info->fprintf_func) (info->stream, "%s%s",
6c067bbb 9752 i == 0 ? "" : " ",
f16cd0d5 9753 prefix_name (all_prefixes[i], sizeflag));
de882298 9754 return i;
f16cd0d5 9755 }
252b5132
RH
9756
9757 insn_codep = codep;
9758
9759 FETCH_DATA (info, codep + 1);
9760 two_source_ops = (*codep == 0x62) || (*codep == 0xc8);
9761
3e7d61b2 9762 if (((prefixes & PREFIX_FWAIT)
f16cd0d5 9763 && ((*codep < 0xd8) || (*codep > 0xdf))))
252b5132 9764 {
86a80a50 9765 /* Handle prefixes before fwait. */
d9949a36 9766 for (i = 0; i < fwait_prefix && all_prefixes[i];
86a80a50
L
9767 i++)
9768 (*info->fprintf_func) (info->stream, "%s ",
9769 prefix_name (all_prefixes[i], sizeflag));
f16cd0d5 9770 (*info->fprintf_func) (info->stream, "fwait");
86a80a50 9771 return i + 1;
252b5132
RH
9772 }
9773
252b5132
RH
9774 if (*codep == 0x0f)
9775 {
eec0f4ca 9776 unsigned char threebyte;
5f40e14d
JS
9777
9778 codep++;
9779 FETCH_DATA (info, codep + 1);
9780 threebyte = *codep;
eec0f4ca 9781 dp = &dis386_twobyte[threebyte];
252b5132 9782 need_modrm = twobyte_has_modrm[*codep];
eec0f4ca 9783 codep++;
252b5132
RH
9784 }
9785 else
9786 {
6439fc28 9787 dp = &dis386[*codep];
252b5132 9788 need_modrm = onebyte_has_modrm[*codep];
eec0f4ca 9789 codep++;
252b5132 9790 }
246c51aa 9791
df18fdba
L
9792 /* Save sizeflag for printing the extra prefixes later before updating
9793 it for mnemonic and operand processing. The prefix names depend
9794 only on the address mode. */
9795 orig_sizeflag = sizeflag;
c608c12e 9796 if (prefixes & PREFIX_ADDR)
df18fdba 9797 sizeflag ^= AFLAG;
b844680a 9798 if ((prefixes & PREFIX_DATA))
df18fdba 9799 sizeflag ^= DFLAG;
3ffd33cf 9800
285ca992 9801 end_codep = codep;
8bb15339 9802 if (need_modrm)
252b5132
RH
9803 {
9804 FETCH_DATA (info, codep + 1);
7967e09e
L
9805 modrm.mod = (*codep >> 6) & 3;
9806 modrm.reg = (*codep >> 3) & 7;
9807 modrm.rm = *codep & 7;
252b5132
RH
9808 }
9809
42d5f9c6 9810 need_vex = 0;
caf0678c 9811 memset (&vex, 0, sizeof (vex));
55b126d4 9812
ce518a5f 9813 if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
252b5132 9814 {
55cf16e1 9815 get_sib (info, sizeflag);
252b5132
RH
9816 dofloat (sizeflag);
9817 }
9818 else
9819 {
8bb15339 9820 dp = get_valid_dis386 (dp, info);
b844680a 9821 if (dp != NULL && putop (dp->name, sizeflag) == 0)
6c067bbb 9822 {
55cf16e1 9823 get_sib (info, sizeflag);
ce518a5f
L
9824 for (i = 0; i < MAX_OPERANDS; ++i)
9825 {
246c51aa 9826 obufp = op_out[i];
ce518a5f
L
9827 op_ad = MAX_OPERANDS - 1 - i;
9828 if (dp->op[i].rtn)
9829 (*dp->op[i].rtn) (dp->op[i].bytemode, sizeflag);
43234a1e
L
9830 /* For EVEX instruction after the last operand masking
9831 should be printed. */
9832 if (i == 0 && vex.evex)
9833 {
9834 /* Don't print {%k0}. */
9835 if (vex.mask_register_specifier)
9836 {
9837 oappend ("{");
9838 oappend (names_mask[vex.mask_register_specifier]);
9839 oappend ("}");
9840 }
9841 if (vex.zeroing)
9842 oappend ("{z}");
9843 }
ce518a5f 9844 }
6439fc28 9845 }
252b5132
RH
9846 }
9847
1d67fe3b
TT
9848 /* Clear instruction information. */
9849 if (the_info)
9850 {
9851 the_info->insn_info_valid = 0;
9852 the_info->branch_delay_insns = 0;
9853 the_info->data_size = 0;
9854 the_info->insn_type = dis_noninsn;
9855 the_info->target = 0;
9856 the_info->target2 = 0;
9857 }
9858
9859 /* Reset jump operation indicator. */
9860 op_is_jump = FALSE;
9861
9862 {
9863 int jump_detection = 0;
9864
9865 /* Extract flags. */
9866 for (i = 0; i < MAX_OPERANDS; ++i)
9867 {
9868 if ((dp->op[i].rtn == OP_J)
9869 || (dp->op[i].rtn == OP_indirE))
9870 jump_detection |= 1;
9871 else if ((dp->op[i].rtn == BND_Fixup)
9872 || (!dp->op[i].rtn && !dp->op[i].bytemode))
9873 jump_detection |= 2;
9874 else if ((dp->op[i].bytemode == cond_jump_mode)
9875 || (dp->op[i].bytemode == loop_jcxz_mode))
9876 jump_detection |= 4;
9877 }
9878
9879 /* Determine if this is a jump or branch. */
9880 if ((jump_detection & 0x3) == 0x3)
9881 {
9882 op_is_jump = TRUE;
9883 if (jump_detection & 0x4)
9884 the_info->insn_type = dis_condbranch;
9885 else
9886 the_info->insn_type =
9887 (dp->name && !strncmp(dp->name, "call", 4))
9888 ? dis_jsr : dis_branch;
9889 }
9890 }
9891
63c6fc6c
L
9892 /* If VEX.vvvv and EVEX.vvvv are unused, they must be all 1s, which
9893 are all 0s in inverted form. */
9894 if (need_vex && vex.register_specifier != 0)
9895 {
9896 (*info->fprintf_func) (info->stream, "(bad)");
9897 return end_codep - priv.the_buffer;
9898 }
9899
7531c613
JB
9900 switch (dp->prefix_requirement)
9901 {
9902 case PREFIX_DATA:
9903 /* If only the data prefix is marked as mandatory, its absence renders
9904 the encoding invalid. Most other PREFIX_OPCODE rules still apply. */
9905 if (need_vex ? !vex.prefix : !(prefixes & PREFIX_DATA))
9906 {
9907 (*info->fprintf_func) (info->stream, "(bad)");
9908 return end_codep - priv.the_buffer;
9909 }
9910 used_prefixes |= PREFIX_DATA;
9911 /* Fall through. */
9912 case PREFIX_OPCODE:
9913 /* If the mandatory PREFIX_REPZ/PREFIX_REPNZ/PREFIX_DATA prefix is
9914 unused, opcode is invalid. Since the PREFIX_DATA prefix may be
9915 used by putop and MMX/SSE operand and may be overridden by the
9916 PREFIX_REPZ/PREFIX_REPNZ fix, we check the PREFIX_DATA prefix
9917 separately. */
9918 if (((need_vex
9919 ? vex.prefix == REPE_PREFIX_OPCODE
9920 || vex.prefix == REPNE_PREFIX_OPCODE
9921 : (prefixes
9922 & (PREFIX_REPZ | PREFIX_REPNZ)) != 0)
9923 && (used_prefixes
9924 & (PREFIX_REPZ | PREFIX_REPNZ)) == 0)
9925 || (((need_vex
9926 ? vex.prefix == DATA_PREFIX_OPCODE
9927 : ((prefixes
9928 & (PREFIX_REPZ | PREFIX_REPNZ | PREFIX_DATA))
9929 == PREFIX_DATA))
9930 && (used_prefixes & PREFIX_DATA) == 0))
9931 || (vex.evex && dp->prefix_requirement != PREFIX_DATA
9932 && !vex.w != !(used_prefixes & PREFIX_DATA)))
9933 {
9934 (*info->fprintf_func) (info->stream, "(bad)");
9935 return end_codep - priv.the_buffer;
9936 }
9937 break;
9938 }
9939
d869730d 9940 /* Check if the REX prefix is used. */
73239888 9941 if ((rex ^ rex_used) == 0 && !need_vex && last_rex_prefix >= 0)
f16cd0d5
L
9942 all_prefixes[last_rex_prefix] = 0;
9943
5e6718e4 9944 /* Check if the SEG prefix is used. */
f16cd0d5
L
9945 if ((prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS | PREFIX_ES
9946 | PREFIX_FS | PREFIX_GS)) != 0
285ca992 9947 && (used_prefixes & active_seg_prefix) != 0)
f16cd0d5
L
9948 all_prefixes[last_seg_prefix] = 0;
9949
5e6718e4 9950 /* Check if the ADDR prefix is used. */
f16cd0d5
L
9951 if ((prefixes & PREFIX_ADDR) != 0
9952 && (used_prefixes & PREFIX_ADDR) != 0)
9953 all_prefixes[last_addr_prefix] = 0;
9954
df18fdba
L
9955 /* Check if the DATA prefix is used. */
9956 if ((prefixes & PREFIX_DATA) != 0
73239888
JB
9957 && (used_prefixes & PREFIX_DATA) != 0
9958 && !need_vex)
df18fdba 9959 all_prefixes[last_data_prefix] = 0;
f16cd0d5 9960
df18fdba 9961 /* Print the extra prefixes. */
f16cd0d5 9962 prefix_length = 0;
f310f33d 9963 for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
f16cd0d5
L
9964 if (all_prefixes[i])
9965 {
9966 const char *name;
df18fdba 9967 name = prefix_name (all_prefixes[i], orig_sizeflag);
f16cd0d5
L
9968 if (name == NULL)
9969 abort ();
9970 prefix_length += strlen (name) + 1;
9971 (*info->fprintf_func) (info->stream, "%s ", name);
9972 }
b844680a 9973
f16cd0d5
L
9974 /* Check maximum code length. */
9975 if ((codep - start_codep) > MAX_CODE_LENGTH)
9976 {
9977 (*info->fprintf_func) (info->stream, "(bad)");
9978 return MAX_CODE_LENGTH;
9979 }
b844680a 9980
ea397f5b 9981 obufp = mnemonicendp;
f16cd0d5 9982 for (i = strlen (obuf) + prefix_length; i < 6; i++)
252b5132
RH
9983 oappend (" ");
9984 oappend (" ");
9985 (*info->fprintf_func) (info->stream, "%s", obuf);
9986
9987 /* The enter and bound instructions are printed with operands in the same
9988 order as the intel book; everything else is printed in reverse order. */
2da11e11 9989 if (intel_syntax || two_source_ops)
252b5132 9990 {
185b1163
L
9991 bfd_vma riprel;
9992
ce518a5f 9993 for (i = 0; i < MAX_OPERANDS; ++i)
6c067bbb 9994 op_txt[i] = op_out[i];
246c51aa 9995
3a8547d2
JB
9996 if (intel_syntax && dp && dp->op[2].rtn == OP_Rounding
9997 && dp->op[3].rtn == OP_E && dp->op[4].rtn == NULL)
9998 {
9999 op_txt[2] = op_out[3];
10000 op_txt[3] = op_out[2];
10001 }
10002
ce518a5f
L
10003 for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
10004 {
6c067bbb
RM
10005 op_ad = op_index[i];
10006 op_index[i] = op_index[MAX_OPERANDS - 1 - i];
10007 op_index[MAX_OPERANDS - 1 - i] = op_ad;
185b1163
L
10008 riprel = op_riprel[i];
10009 op_riprel[i] = op_riprel [MAX_OPERANDS - 1 - i];
10010 op_riprel[MAX_OPERANDS - 1 - i] = riprel;
ce518a5f 10011 }
252b5132
RH
10012 }
10013 else
10014 {
ce518a5f 10015 for (i = 0; i < MAX_OPERANDS; ++i)
6c067bbb 10016 op_txt[MAX_OPERANDS - 1 - i] = op_out[i];
050dfa73
MM
10017 }
10018
ce518a5f
L
10019 needcomma = 0;
10020 for (i = 0; i < MAX_OPERANDS; ++i)
10021 if (*op_txt[i])
10022 {
10023 if (needcomma)
10024 (*info->fprintf_func) (info->stream, ",");
10025 if (op_index[i] != -1 && !op_riprel[i])
1d67fe3b
TT
10026 {
10027 bfd_vma target = (bfd_vma) op_address[op_index[i]];
10028
10029 if (the_info && op_is_jump)
10030 {
10031 the_info->insn_info_valid = 1;
10032 the_info->branch_delay_insns = 0;
10033 the_info->data_size = 0;
10034 the_info->target = target;
10035 the_info->target2 = 0;
10036 }
10037 (*info->print_address_func) (target, info);
10038 }
ce518a5f
L
10039 else
10040 (*info->fprintf_func) (info->stream, "%s", op_txt[i]);
10041 needcomma = 1;
10042 }
050dfa73 10043
ce518a5f 10044 for (i = 0; i < MAX_OPERANDS; i++)
52b15da3
JH
10045 if (op_index[i] != -1 && op_riprel[i])
10046 {
10047 (*info->fprintf_func) (info->stream, " # ");
4fd7268a 10048 (*info->print_address_func) ((bfd_vma) (start_pc + (codep - start_codep)
52b15da3 10049 + op_address[op_index[i]]), info);
185b1163 10050 break;
52b15da3 10051 }
e396998b 10052 return codep - priv.the_buffer;
252b5132
RH
10053}
10054
6439fc28 10055static const char *float_mem[] = {
252b5132 10056 /* d8 */
7c52e0e8
L
10057 "fadd{s|}",
10058 "fmul{s|}",
10059 "fcom{s|}",
10060 "fcomp{s|}",
10061 "fsub{s|}",
10062 "fsubr{s|}",
10063 "fdiv{s|}",
10064 "fdivr{s|}",
db6eb5be 10065 /* d9 */
7c52e0e8 10066 "fld{s|}",
252b5132 10067 "(bad)",
7c52e0e8
L
10068 "fst{s|}",
10069 "fstp{s|}",
d1c36125 10070 "fldenv{C|C}",
252b5132 10071 "fldcw",
d1c36125 10072 "fNstenv{C|C}",
252b5132
RH
10073 "fNstcw",
10074 /* da */
7c52e0e8
L
10075 "fiadd{l|}",
10076 "fimul{l|}",
10077 "ficom{l|}",
10078 "ficomp{l|}",
10079 "fisub{l|}",
10080 "fisubr{l|}",
10081 "fidiv{l|}",
10082 "fidivr{l|}",
252b5132 10083 /* db */
7c52e0e8
L
10084 "fild{l|}",
10085 "fisttp{l|}",
10086 "fist{l|}",
10087 "fistp{l|}",
252b5132 10088 "(bad)",
464dc4af 10089 "fld{t|}",
252b5132 10090 "(bad)",
464dc4af 10091 "fstp{t|}",
252b5132 10092 /* dc */
7c52e0e8
L
10093 "fadd{l|}",
10094 "fmul{l|}",
10095 "fcom{l|}",
10096 "fcomp{l|}",
10097 "fsub{l|}",
10098 "fsubr{l|}",
10099 "fdiv{l|}",
10100 "fdivr{l|}",
252b5132 10101 /* dd */
7c52e0e8
L
10102 "fld{l|}",
10103 "fisttp{ll|}",
10104 "fst{l||}",
10105 "fstp{l|}",
d1c36125 10106 "frstor{C|C}",
252b5132 10107 "(bad)",
d1c36125 10108 "fNsave{C|C}",
252b5132
RH
10109 "fNstsw",
10110 /* de */
ac465521
JB
10111 "fiadd{s|}",
10112 "fimul{s|}",
10113 "ficom{s|}",
10114 "ficomp{s|}",
10115 "fisub{s|}",
10116 "fisubr{s|}",
10117 "fidiv{s|}",
10118 "fidivr{s|}",
252b5132 10119 /* df */
ac465521
JB
10120 "fild{s|}",
10121 "fisttp{s|}",
10122 "fist{s|}",
10123 "fistp{s|}",
252b5132 10124 "fbld",
7c52e0e8 10125 "fild{ll|}",
252b5132 10126 "fbstp",
7c52e0e8 10127 "fistp{ll|}",
1d9f512f
AM
10128};
10129
10130static const unsigned char float_mem_mode[] = {
10131 /* d8 */
10132 d_mode,
10133 d_mode,
10134 d_mode,
10135 d_mode,
10136 d_mode,
10137 d_mode,
10138 d_mode,
10139 d_mode,
10140 /* d9 */
10141 d_mode,
10142 0,
10143 d_mode,
10144 d_mode,
10145 0,
10146 w_mode,
10147 0,
10148 w_mode,
10149 /* da */
10150 d_mode,
10151 d_mode,
10152 d_mode,
10153 d_mode,
10154 d_mode,
10155 d_mode,
10156 d_mode,
10157 d_mode,
10158 /* db */
10159 d_mode,
10160 d_mode,
10161 d_mode,
10162 d_mode,
10163 0,
9306ca4a 10164 t_mode,
1d9f512f 10165 0,
9306ca4a 10166 t_mode,
1d9f512f
AM
10167 /* dc */
10168 q_mode,
10169 q_mode,
10170 q_mode,
10171 q_mode,
10172 q_mode,
10173 q_mode,
10174 q_mode,
10175 q_mode,
10176 /* dd */
10177 q_mode,
10178 q_mode,
10179 q_mode,
10180 q_mode,
10181 0,
10182 0,
10183 0,
10184 w_mode,
10185 /* de */
10186 w_mode,
10187 w_mode,
10188 w_mode,
10189 w_mode,
10190 w_mode,
10191 w_mode,
10192 w_mode,
10193 w_mode,
10194 /* df */
10195 w_mode,
10196 w_mode,
10197 w_mode,
10198 w_mode,
9306ca4a 10199 t_mode,
1d9f512f 10200 q_mode,
9306ca4a 10201 t_mode,
1d9f512f 10202 q_mode
252b5132
RH
10203};
10204
ce518a5f
L
10205#define ST { OP_ST, 0 }
10206#define STi { OP_STi, 0 }
252b5132 10207
48c97fa1
L
10208#define FGRPd9_2 NULL, { { NULL, 1 } }, 0
10209#define FGRPd9_4 NULL, { { NULL, 2 } }, 0
10210#define FGRPd9_5 NULL, { { NULL, 3 } }, 0
10211#define FGRPd9_6 NULL, { { NULL, 4 } }, 0
10212#define FGRPd9_7 NULL, { { NULL, 5 } }, 0
10213#define FGRPda_5 NULL, { { NULL, 6 } }, 0
10214#define FGRPdb_4 NULL, { { NULL, 7 } }, 0
10215#define FGRPde_3 NULL, { { NULL, 8 } }, 0
10216#define FGRPdf_4 NULL, { { NULL, 9 } }, 0
252b5132 10217
2da11e11 10218static const struct dis386 float_reg[][8] = {
252b5132
RH
10219 /* d8 */
10220 {
bf890a93
IT
10221 { "fadd", { ST, STi }, 0 },
10222 { "fmul", { ST, STi }, 0 },
10223 { "fcom", { STi }, 0 },
10224 { "fcomp", { STi }, 0 },
10225 { "fsub", { ST, STi }, 0 },
10226 { "fsubr", { ST, STi }, 0 },
10227 { "fdiv", { ST, STi }, 0 },
10228 { "fdivr", { ST, STi }, 0 },
252b5132
RH
10229 },
10230 /* d9 */
10231 {
bf890a93
IT
10232 { "fld", { STi }, 0 },
10233 { "fxch", { STi }, 0 },
252b5132 10234 { FGRPd9_2 },
592d1631 10235 { Bad_Opcode },
252b5132
RH
10236 { FGRPd9_4 },
10237 { FGRPd9_5 },
10238 { FGRPd9_6 },
10239 { FGRPd9_7 },
10240 },
10241 /* da */
10242 {
bf890a93
IT
10243 { "fcmovb", { ST, STi }, 0 },
10244 { "fcmove", { ST, STi }, 0 },
10245 { "fcmovbe",{ ST, STi }, 0 },
10246 { "fcmovu", { ST, STi }, 0 },
592d1631 10247 { Bad_Opcode },
252b5132 10248 { FGRPda_5 },
592d1631
L
10249 { Bad_Opcode },
10250 { Bad_Opcode },
252b5132
RH
10251 },
10252 /* db */
10253 {
bf890a93
IT
10254 { "fcmovnb",{ ST, STi }, 0 },
10255 { "fcmovne",{ ST, STi }, 0 },
10256 { "fcmovnbe",{ ST, STi }, 0 },
10257 { "fcmovnu",{ ST, STi }, 0 },
252b5132 10258 { FGRPdb_4 },
bf890a93
IT
10259 { "fucomi", { ST, STi }, 0 },
10260 { "fcomi", { ST, STi }, 0 },
592d1631 10261 { Bad_Opcode },
252b5132
RH
10262 },
10263 /* dc */
10264 {
bf890a93
IT
10265 { "fadd", { STi, ST }, 0 },
10266 { "fmul", { STi, ST }, 0 },
592d1631
L
10267 { Bad_Opcode },
10268 { Bad_Opcode },
d53e6b98
JB
10269 { "fsub{!M|r}", { STi, ST }, 0 },
10270 { "fsub{M|}", { STi, ST }, 0 },
10271 { "fdiv{!M|r}", { STi, ST }, 0 },
10272 { "fdiv{M|}", { STi, ST }, 0 },
252b5132
RH
10273 },
10274 /* dd */
10275 {
bf890a93 10276 { "ffree", { STi }, 0 },
592d1631 10277 { Bad_Opcode },
bf890a93
IT
10278 { "fst", { STi }, 0 },
10279 { "fstp", { STi }, 0 },
10280 { "fucom", { STi }, 0 },
10281 { "fucomp", { STi }, 0 },
592d1631
L
10282 { Bad_Opcode },
10283 { Bad_Opcode },
252b5132
RH
10284 },
10285 /* de */
10286 {
bf890a93
IT
10287 { "faddp", { STi, ST }, 0 },
10288 { "fmulp", { STi, ST }, 0 },
592d1631 10289 { Bad_Opcode },
252b5132 10290 { FGRPde_3 },
d53e6b98
JB
10291 { "fsub{!M|r}p", { STi, ST }, 0 },
10292 { "fsub{M|}p", { STi, ST }, 0 },
10293 { "fdiv{!M|r}p", { STi, ST }, 0 },
10294 { "fdiv{M|}p", { STi, ST }, 0 },
252b5132
RH
10295 },
10296 /* df */
10297 {
bf890a93 10298 { "ffreep", { STi }, 0 },
592d1631
L
10299 { Bad_Opcode },
10300 { Bad_Opcode },
10301 { Bad_Opcode },
252b5132 10302 { FGRPdf_4 },
bf890a93
IT
10303 { "fucomip", { ST, STi }, 0 },
10304 { "fcomip", { ST, STi }, 0 },
592d1631 10305 { Bad_Opcode },
252b5132
RH
10306 },
10307};
10308
252b5132 10309static char *fgrps[][8] = {
48c97fa1
L
10310 /* Bad opcode 0 */
10311 {
10312 "(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10313 },
10314
10315 /* d9_2 1 */
252b5132
RH
10316 {
10317 "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10318 },
10319
48c97fa1 10320 /* d9_4 2 */
252b5132
RH
10321 {
10322 "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
10323 },
10324
48c97fa1 10325 /* d9_5 3 */
252b5132
RH
10326 {
10327 "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
10328 },
10329
48c97fa1 10330 /* d9_6 4 */
252b5132
RH
10331 {
10332 "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
10333 },
10334
48c97fa1 10335 /* d9_7 5 */
252b5132
RH
10336 {
10337 "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
10338 },
10339
48c97fa1 10340 /* da_5 6 */
252b5132
RH
10341 {
10342 "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10343 },
10344
48c97fa1 10345 /* db_4 7 */
252b5132 10346 {
309d3373
JB
10347 "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
10348 "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
252b5132
RH
10349 },
10350
48c97fa1 10351 /* de_3 8 */
252b5132
RH
10352 {
10353 "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10354 },
10355
48c97fa1 10356 /* df_4 9 */
252b5132
RH
10357 {
10358 "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10359 },
10360};
10361
b6169b20
L
10362static void
10363swap_operand (void)
10364{
10365 mnemonicendp[0] = '.';
10366 mnemonicendp[1] = 's';
10367 mnemonicendp += 2;
10368}
10369
b844680a
L
10370static void
10371OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED,
10372 int sizeflag ATTRIBUTE_UNUSED)
10373{
10374 /* Skip mod/rm byte. */
10375 MODRM_CHECK;
10376 codep++;
10377}
10378
252b5132 10379static void
26ca5450 10380dofloat (int sizeflag)
252b5132 10381{
2da11e11 10382 const struct dis386 *dp;
252b5132
RH
10383 unsigned char floatop;
10384
10385 floatop = codep[-1];
10386
7967e09e 10387 if (modrm.mod != 3)
252b5132 10388 {
7967e09e 10389 int fp_indx = (floatop - 0xd8) * 8 + modrm.reg;
1d9f512f
AM
10390
10391 putop (float_mem[fp_indx], sizeflag);
ce518a5f 10392 obufp = op_out[0];
6e50d963 10393 op_ad = 2;
1d9f512f 10394 OP_E (float_mem_mode[fp_indx], sizeflag);
252b5132
RH
10395 return;
10396 }
6608db57 10397 /* Skip mod/rm byte. */
4bba6815 10398 MODRM_CHECK;
252b5132
RH
10399 codep++;
10400
7967e09e 10401 dp = &float_reg[floatop - 0xd8][modrm.reg];
252b5132
RH
10402 if (dp->name == NULL)
10403 {
7967e09e 10404 putop (fgrps[dp->op[0].bytemode][modrm.rm], sizeflag);
252b5132 10405
6608db57 10406 /* Instruction fnstsw is only one with strange arg. */
252b5132 10407 if (floatop == 0xdf && codep[-1] == 0xe0)
ce518a5f 10408 strcpy (op_out[0], names16[0]);
252b5132
RH
10409 }
10410 else
10411 {
10412 putop (dp->name, sizeflag);
10413
ce518a5f 10414 obufp = op_out[0];
6e50d963 10415 op_ad = 2;
ce518a5f
L
10416 if (dp->op[0].rtn)
10417 (*dp->op[0].rtn) (dp->op[0].bytemode, sizeflag);
6e50d963 10418
ce518a5f 10419 obufp = op_out[1];
6e50d963 10420 op_ad = 1;
ce518a5f
L
10421 if (dp->op[1].rtn)
10422 (*dp->op[1].rtn) (dp->op[1].bytemode, sizeflag);
252b5132
RH
10423 }
10424}
10425
9ce09ba2
RM
10426/* Like oappend (below), but S is a string starting with '%'.
10427 In Intel syntax, the '%' is elided. */
10428static void
10429oappend_maybe_intel (const char *s)
10430{
10431 oappend (s + intel_syntax);
10432}
10433
252b5132 10434static void
26ca5450 10435OP_ST (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 10436{
9ce09ba2 10437 oappend_maybe_intel ("%st");
252b5132
RH
10438}
10439
252b5132 10440static void
26ca5450 10441OP_STi (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 10442{
7967e09e 10443 sprintf (scratchbuf, "%%st(%d)", modrm.rm);
9ce09ba2 10444 oappend_maybe_intel (scratchbuf);
252b5132
RH
10445}
10446
6608db57 10447/* Capital letters in template are macros. */
6439fc28 10448static int
d3ce72d0 10449putop (const char *in_template, int sizeflag)
252b5132 10450{
2da11e11 10451 const char *p;
9306ca4a 10452 int alt = 0;
9d141669 10453 int cond = 1;
21a3faeb 10454 unsigned int l = 0, len = 0;
98b528ac
L
10455 char last[4];
10456
d3ce72d0 10457 for (p = in_template; *p; p++)
252b5132 10458 {
21a3faeb
JB
10459 if (len > l)
10460 {
10461 if (l >= sizeof (last) || !ISUPPER (*p))
10462 abort ();
10463 last[l++] = *p;
10464 continue;
10465 }
252b5132
RH
10466 switch (*p)
10467 {
10468 default:
10469 *obufp++ = *p;
10470 break;
98b528ac
L
10471 case '%':
10472 len++;
10473 break;
9d141669
L
10474 case '!':
10475 cond = 0;
10476 break;
6439fc28 10477 case '{':
6439fc28 10478 if (intel_syntax)
6439fc28
AM
10479 {
10480 while (*++p != '|')
7c52e0e8
L
10481 if (*p == '}' || *p == '\0')
10482 abort ();
d1c36125 10483 alt = 1;
6439fc28 10484 }
d1c36125 10485 break;
6439fc28
AM
10486 case '|':
10487 while (*++p != '}')
10488 {
10489 if (*p == '\0')
10490 abort ();
10491 }
10492 break;
10493 case '}':
d1c36125 10494 alt = 0;
6439fc28 10495 break;
252b5132 10496 case 'A':
db6eb5be
AM
10497 if (intel_syntax)
10498 break;
7967e09e 10499 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
252b5132
RH
10500 *obufp++ = 'b';
10501 break;
10502 case 'B':
21a3faeb 10503 if (l == 0)
4b06377f 10504 {
dc1e8a47 10505 case_B:
4b06377f
L
10506 if (intel_syntax)
10507 break;
10508 if (sizeflag & SUFFIX_ALWAYS)
10509 *obufp++ = 'b';
10510 }
21a3faeb 10511 else if (l == 1 && last[0] == 'L')
4b06377f 10512 {
4b06377f
L
10513 if (address_mode == mode_64bit
10514 && !(prefixes & PREFIX_ADDR))
10515 {
10516 *obufp++ = 'a';
10517 *obufp++ = 'b';
10518 *obufp++ = 's';
10519 }
10520
10521 goto case_B;
10522 }
21a3faeb
JB
10523 else
10524 abort ();
252b5132 10525 break;
9306ca4a
JB
10526 case 'C':
10527 if (intel_syntax && !alt)
10528 break;
10529 if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
10530 {
10531 if (sizeflag & DFLAG)
10532 *obufp++ = intel_syntax ? 'd' : 'l';
10533 else
10534 *obufp++ = intel_syntax ? 'w' : 's';
10535 used_prefixes |= (prefixes & PREFIX_DATA);
10536 }
10537 break;
ed7841b3
JB
10538 case 'D':
10539 if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
10540 break;
161a04f6 10541 USED_REX (REX_W);
7967e09e 10542 if (modrm.mod == 3)
ed7841b3 10543 {
161a04f6 10544 if (rex & REX_W)
ed7841b3 10545 *obufp++ = 'q';
ed7841b3 10546 else
f16cd0d5
L
10547 {
10548 if (sizeflag & DFLAG)
10549 *obufp++ = intel_syntax ? 'd' : 'l';
10550 else
10551 *obufp++ = 'w';
10552 used_prefixes |= (prefixes & PREFIX_DATA);
10553 }
ed7841b3
JB
10554 }
10555 else
10556 *obufp++ = 'w';
10557 break;
252b5132 10558 case 'E': /* For jcxz/jecxz */
cb712a9e 10559 if (address_mode == mode_64bit)
c1a64871
JH
10560 {
10561 if (sizeflag & AFLAG)
10562 *obufp++ = 'r';
10563 else
10564 *obufp++ = 'e';
10565 }
10566 else
10567 if (sizeflag & AFLAG)
10568 *obufp++ = 'e';
3ffd33cf
AM
10569 used_prefixes |= (prefixes & PREFIX_ADDR);
10570 break;
10571 case 'F':
db6eb5be
AM
10572 if (intel_syntax)
10573 break;
e396998b 10574 if ((prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
3ffd33cf
AM
10575 {
10576 if (sizeflag & AFLAG)
cb712a9e 10577 *obufp++ = address_mode == mode_64bit ? 'q' : 'l';
3ffd33cf 10578 else
cb712a9e 10579 *obufp++ = address_mode == mode_64bit ? 'l' : 'w';
3ffd33cf
AM
10580 used_prefixes |= (prefixes & PREFIX_ADDR);
10581 }
252b5132 10582 break;
52fd6d94
JB
10583 case 'G':
10584 if (intel_syntax || (obufp[-1] != 's' && !(sizeflag & SUFFIX_ALWAYS)))
10585 break;
161a04f6 10586 if ((rex & REX_W) || (sizeflag & DFLAG))
52fd6d94
JB
10587 *obufp++ = 'l';
10588 else
10589 *obufp++ = 'w';
161a04f6 10590 if (!(rex & REX_W))
52fd6d94
JB
10591 used_prefixes |= (prefixes & PREFIX_DATA);
10592 break;
5dd0794d 10593 case 'H':
db6eb5be
AM
10594 if (intel_syntax)
10595 break;
5dd0794d
AM
10596 if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
10597 || (prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
10598 {
10599 used_prefixes |= prefixes & (PREFIX_CS | PREFIX_DS);
10600 *obufp++ = ',';
10601 *obufp++ = 'p';
10602 if (prefixes & PREFIX_DS)
10603 *obufp++ = 't';
10604 else
10605 *obufp++ = 'n';
10606 }
10607 break;
42903f7f
L
10608 case 'K':
10609 USED_REX (REX_W);
10610 if (rex & REX_W)
10611 *obufp++ = 'q';
10612 else
10613 *obufp++ = 'd';
10614 break;
6dd5059a 10615 case 'Z':
21a3faeb 10616 if (l != 0)
04d824a4 10617 {
21a3faeb
JB
10618 if (l != 1 || last[0] != 'X')
10619 abort ();
04d824a4
JB
10620 if (!need_vex || !vex.evex)
10621 abort ();
10622 if (intel_syntax
10623 || ((modrm.mod == 3 || vex.b) && !(sizeflag & SUFFIX_ALWAYS)))
10624 break;
10625 switch (vex.length)
10626 {
10627 case 128:
10628 *obufp++ = 'x';
10629 break;
10630 case 256:
10631 *obufp++ = 'y';
10632 break;
10633 case 512:
10634 *obufp++ = 'z';
10635 break;
10636 default:
10637 abort ();
10638 }
10639 break;
10640 }
6dd5059a
L
10641 if (intel_syntax)
10642 break;
10643 if (address_mode == mode_64bit && (sizeflag & SUFFIX_ALWAYS))
10644 {
10645 *obufp++ = 'q';
10646 break;
10647 }
10648 /* Fall through. */
98b528ac 10649 goto case_L;
252b5132 10650 case 'L':
21a3faeb
JB
10651 if (l != 0)
10652 abort ();
dc1e8a47 10653 case_L:
db6eb5be
AM
10654 if (intel_syntax)
10655 break;
252b5132
RH
10656 if (sizeflag & SUFFIX_ALWAYS)
10657 *obufp++ = 'l';
252b5132 10658 break;
9d141669
L
10659 case 'M':
10660 if (intel_mnemonic != cond)
10661 *obufp++ = 'r';
10662 break;
252b5132
RH
10663 case 'N':
10664 if ((prefixes & PREFIX_FWAIT) == 0)
10665 *obufp++ = 'n';
7d421014
ILT
10666 else
10667 used_prefixes |= PREFIX_FWAIT;
252b5132 10668 break;
52b15da3 10669 case 'O':
161a04f6
L
10670 USED_REX (REX_W);
10671 if (rex & REX_W)
6439fc28 10672 *obufp++ = 'o';
a35ca55a
JB
10673 else if (intel_syntax && (sizeflag & DFLAG))
10674 *obufp++ = 'q';
52b15da3
JH
10675 else
10676 *obufp++ = 'd';
161a04f6 10677 if (!(rex & REX_W))
a35ca55a 10678 used_prefixes |= (prefixes & PREFIX_DATA);
52b15da3 10679 break;
07f5af7d
L
10680 case '&':
10681 if (!intel_syntax
10682 && address_mode == mode_64bit
10683 && isa64 == intel64)
10684 {
10685 *obufp++ = 'q';
10686 break;
10687 }
10688 /* Fall through. */
6439fc28 10689 case 'T':
d9e3625e
L
10690 if (!intel_syntax
10691 && address_mode == mode_64bit
7bb15c6f 10692 && ((sizeflag & DFLAG) || (rex & REX_W)))
6439fc28
AM
10693 {
10694 *obufp++ = 'q';
10695 break;
10696 }
6608db57 10697 /* Fall through. */
4b4c407a 10698 goto case_P;
252b5132 10699 case 'P':
21a3faeb 10700 if (l == 0)
d9e3625e 10701 {
dc1e8a47 10702 case_P:
4b4c407a 10703 if (intel_syntax)
d9e3625e 10704 {
4b4c407a
L
10705 if ((rex & REX_W) == 0
10706 && (prefixes & PREFIX_DATA))
10707 {
10708 if ((sizeflag & DFLAG) == 0)
10709 *obufp++ = 'w';
10710 used_prefixes |= (prefixes & PREFIX_DATA);
10711 }
10712 break;
10713 }
10714 if ((prefixes & PREFIX_DATA)
10715 || (rex & REX_W)
10716 || (sizeflag & SUFFIX_ALWAYS))
10717 {
10718 USED_REX (REX_W);
10719 if (rex & REX_W)
10720 *obufp++ = 'q';
10721 else
10722 {
10723 if (sizeflag & DFLAG)
10724 *obufp++ = 'l';
10725 else
10726 *obufp++ = 'w';
10727 used_prefixes |= (prefixes & PREFIX_DATA);
10728 }
d9e3625e 10729 }
d9e3625e 10730 }
21a3faeb 10731 else if (l == 1 && last[0] == 'L')
252b5132 10732 {
4b4c407a
L
10733 if ((prefixes & PREFIX_DATA)
10734 || (rex & REX_W)
10735 || (sizeflag & SUFFIX_ALWAYS))
52b15da3 10736 {
4b4c407a
L
10737 USED_REX (REX_W);
10738 if (rex & REX_W)
10739 *obufp++ = 'q';
10740 else
10741 {
10742 if (sizeflag & DFLAG)
10743 *obufp++ = intel_syntax ? 'd' : 'l';
10744 else
10745 *obufp++ = 'w';
10746 used_prefixes |= (prefixes & PREFIX_DATA);
10747 }
52b15da3 10748 }
252b5132 10749 }
21a3faeb
JB
10750 else
10751 abort ();
252b5132 10752 break;
6439fc28 10753 case 'U':
db6eb5be
AM
10754 if (intel_syntax)
10755 break;
7bb15c6f 10756 if (address_mode == mode_64bit
6c067bbb 10757 && ((sizeflag & DFLAG) || (rex & REX_W)))
6439fc28 10758 {
7967e09e 10759 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
1a114b12 10760 *obufp++ = 'q';
6439fc28
AM
10761 break;
10762 }
6608db57 10763 /* Fall through. */
98b528ac 10764 goto case_Q;
252b5132 10765 case 'Q':
21a3faeb 10766 if (l == 0)
252b5132 10767 {
dc1e8a47 10768 case_Q:
98b528ac
L
10769 if (intel_syntax && !alt)
10770 break;
10771 USED_REX (REX_W);
10772 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
52b15da3 10773 {
98b528ac
L
10774 if (rex & REX_W)
10775 *obufp++ = 'q';
52b15da3 10776 else
98b528ac
L
10777 {
10778 if (sizeflag & DFLAG)
10779 *obufp++ = intel_syntax ? 'd' : 'l';
10780 else
10781 *obufp++ = 'w';
f16cd0d5 10782 used_prefixes |= (prefixes & PREFIX_DATA);
98b528ac 10783 }
52b15da3 10784 }
98b528ac 10785 }
492a76aa
JB
10786 else if (l == 1 && last[0] == 'D')
10787 *obufp++ = vex.w ? 'q' : 'd';
21a3faeb 10788 else if (l == 1 && last[0] == 'L')
98b528ac 10789 {
b24d668c
JB
10790 if (cond ? modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)
10791 : address_mode != mode_64bit)
98b528ac
L
10792 break;
10793 if ((rex & REX_W))
10794 {
10795 USED_REX (REX_W);
10796 *obufp++ = 'q';
10797 }
b24d668c 10798 else if((address_mode == mode_64bit && need_modrm && cond)
589958d6
JB
10799 || (sizeflag & SUFFIX_ALWAYS))
10800 *obufp++ = intel_syntax? 'd' : 'l';
252b5132 10801 }
21a3faeb
JB
10802 else
10803 abort ();
252b5132
RH
10804 break;
10805 case 'R':
161a04f6
L
10806 USED_REX (REX_W);
10807 if (rex & REX_W)
a35ca55a
JB
10808 *obufp++ = 'q';
10809 else if (sizeflag & DFLAG)
c608c12e 10810 {
a35ca55a 10811 if (intel_syntax)
c608c12e 10812 *obufp++ = 'd';
c608c12e 10813 else
a35ca55a 10814 *obufp++ = 'l';
c608c12e 10815 }
252b5132 10816 else
a35ca55a
JB
10817 *obufp++ = 'w';
10818 if (intel_syntax && !p[1]
161a04f6 10819 && ((rex & REX_W) || (sizeflag & DFLAG)))
a35ca55a 10820 *obufp++ = 'e';
161a04f6 10821 if (!(rex & REX_W))
52b15da3 10822 used_prefixes |= (prefixes & PREFIX_DATA);
252b5132 10823 break;
1a114b12 10824 case 'V':
21a3faeb 10825 if (l == 0)
1a114b12 10826 {
4b06377f
L
10827 if (intel_syntax)
10828 break;
7bb15c6f 10829 if (address_mode == mode_64bit
6c067bbb 10830 && ((sizeflag & DFLAG) || (rex & REX_W)))
4b06377f
L
10831 {
10832 if (sizeflag & SUFFIX_ALWAYS)
10833 *obufp++ = 'q';
10834 break;
10835 }
10836 }
21a3faeb 10837 else if (l == 1 && last[0] == 'L')
4b06377f 10838 {
4b06377f
L
10839 if (rex & REX_W)
10840 {
10841 *obufp++ = 'a';
10842 *obufp++ = 'b';
10843 *obufp++ = 's';
10844 }
1a114b12 10845 }
21a3faeb
JB
10846 else
10847 abort ();
1a114b12 10848 /* Fall through. */
4b06377f 10849 goto case_S;
252b5132 10850 case 'S':
21a3faeb 10851 if (l == 0)
252b5132 10852 {
dc1e8a47 10853 case_S:
4b06377f
L
10854 if (intel_syntax)
10855 break;
10856 if (sizeflag & SUFFIX_ALWAYS)
52b15da3 10857 {
4b06377f
L
10858 if (rex & REX_W)
10859 *obufp++ = 'q';
52b15da3 10860 else
4b06377f
L
10861 {
10862 if (sizeflag & DFLAG)
10863 *obufp++ = 'l';
10864 else
10865 *obufp++ = 'w';
10866 used_prefixes |= (prefixes & PREFIX_DATA);
10867 }
10868 }
10869 }
21a3faeb 10870 else if (l == 1 && last[0] == 'L')
4b06377f 10871 {
4b06377f
L
10872 if (address_mode == mode_64bit
10873 && !(prefixes & PREFIX_ADDR))
10874 {
10875 *obufp++ = 'a';
10876 *obufp++ = 'b';
10877 *obufp++ = 's';
10878 }
10879
10880 goto case_S;
252b5132 10881 }
21a3faeb
JB
10882 else
10883 abort ();
252b5132 10884 break;
041bd2e0 10885 case 'X':
21a3faeb
JB
10886 if (l != 0)
10887 abort ();
bf926894
JB
10888 if (need_vex
10889 ? vex.prefix == DATA_PREFIX_OPCODE
10890 : prefixes & PREFIX_DATA)
c0f3af97 10891 {
bf926894
JB
10892 *obufp++ = 'd';
10893 used_prefixes |= PREFIX_DATA;
c0f3af97 10894 }
041bd2e0 10895 else
bf926894 10896 *obufp++ = 's';
041bd2e0 10897 break;
76f227a5 10898 case 'Y':
21a3faeb 10899 if (l == 1 && last[0] == 'X')
c0f3af97 10900 {
c0f3af97
L
10901 if (!need_vex)
10902 abort ();
10903 if (intel_syntax
04d824a4 10904 || ((modrm.mod == 3 || vex.b) && !(sizeflag & SUFFIX_ALWAYS)))
c0f3af97
L
10905 break;
10906 switch (vex.length)
10907 {
10908 case 128:
10909 *obufp++ = 'x';
10910 break;
10911 case 256:
10912 *obufp++ = 'y';
10913 break;
04d824a4
JB
10914 case 512:
10915 if (!vex.evex)
c0f3af97 10916 default:
04d824a4 10917 abort ();
c0f3af97 10918 }
76f227a5 10919 }
21a3faeb
JB
10920 else
10921 abort ();
76f227a5 10922 break;
252b5132 10923 case 'W':
21a3faeb 10924 if (l == 0)
a35ca55a 10925 {
0bfee649
L
10926 /* operand size flag for cwtl, cbtw */
10927 USED_REX (REX_W);
10928 if (rex & REX_W)
10929 {
10930 if (intel_syntax)
10931 *obufp++ = 'd';
10932 else
10933 *obufp++ = 'l';
10934 }
10935 else if (sizeflag & DFLAG)
10936 *obufp++ = 'w';
a35ca55a 10937 else
0bfee649
L
10938 *obufp++ = 'b';
10939 if (!(rex & REX_W))
10940 used_prefixes |= (prefixes & PREFIX_DATA);
a35ca55a 10941 }
21a3faeb 10942 else if (l == 1)
0bfee649 10943 {
0bfee649
L
10944 if (!need_vex)
10945 abort ();
6c30d220
L
10946 if (last[0] == 'X')
10947 *obufp++ = vex.w ? 'd': 's';
931452b6
JB
10948 else if (last[0] == 'B')
10949 *obufp++ = vex.w ? 'w': 'b';
21a3faeb
JB
10950 else
10951 abort ();
0bfee649 10952 }
21a3faeb
JB
10953 else
10954 abort ();
252b5132 10955 break;
a72d2af2
L
10956 case '^':
10957 if (intel_syntax)
10958 break;
5990e377
JB
10959 if (isa64 == intel64 && (rex & REX_W))
10960 {
10961 USED_REX (REX_W);
10962 *obufp++ = 'q';
10963 break;
10964 }
a72d2af2
L
10965 if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
10966 {
10967 if (sizeflag & DFLAG)
10968 *obufp++ = 'l';
10969 else
10970 *obufp++ = 'w';
10971 used_prefixes |= (prefixes & PREFIX_DATA);
10972 }
10973 break;
5db04b09
L
10974 case '@':
10975 if (intel_syntax)
10976 break;
10977 if (address_mode == mode_64bit
10978 && (isa64 == intel64
10979 || ((sizeflag & DFLAG) || (rex & REX_W))))
10980 *obufp++ = 'q';
10981 else if ((prefixes & PREFIX_DATA))
10982 {
10983 if (!(sizeflag & DFLAG))
10984 *obufp++ = 'w';
10985 used_prefixes |= (prefixes & PREFIX_DATA);
10986 }
10987 break;
252b5132 10988 }
21a3faeb
JB
10989
10990 if (len == l)
10991 len = l = 0;
252b5132
RH
10992 }
10993 *obufp = 0;
ea397f5b 10994 mnemonicendp = obufp;
6439fc28 10995 return 0;
252b5132
RH
10996}
10997
10998static void
26ca5450 10999oappend (const char *s)
252b5132 11000{
ea397f5b 11001 obufp = stpcpy (obufp, s);
252b5132
RH
11002}
11003
11004static void
26ca5450 11005append_seg (void)
252b5132 11006{
285ca992
L
11007 /* Only print the active segment register. */
11008 if (!active_seg_prefix)
11009 return;
11010
11011 used_prefixes |= active_seg_prefix;
11012 switch (active_seg_prefix)
7d421014 11013 {
285ca992 11014 case PREFIX_CS:
9ce09ba2 11015 oappend_maybe_intel ("%cs:");
285ca992
L
11016 break;
11017 case PREFIX_DS:
9ce09ba2 11018 oappend_maybe_intel ("%ds:");
285ca992
L
11019 break;
11020 case PREFIX_SS:
9ce09ba2 11021 oappend_maybe_intel ("%ss:");
285ca992
L
11022 break;
11023 case PREFIX_ES:
9ce09ba2 11024 oappend_maybe_intel ("%es:");
285ca992
L
11025 break;
11026 case PREFIX_FS:
9ce09ba2 11027 oappend_maybe_intel ("%fs:");
285ca992
L
11028 break;
11029 case PREFIX_GS:
9ce09ba2 11030 oappend_maybe_intel ("%gs:");
285ca992
L
11031 break;
11032 default:
11033 break;
7d421014 11034 }
252b5132
RH
11035}
11036
11037static void
26ca5450 11038OP_indirE (int bytemode, int sizeflag)
252b5132
RH
11039{
11040 if (!intel_syntax)
11041 oappend ("*");
11042 OP_E (bytemode, sizeflag);
11043}
11044
52b15da3 11045static void
26ca5450 11046print_operand_value (char *buf, int hex, bfd_vma disp)
52b15da3 11047{
cb712a9e 11048 if (address_mode == mode_64bit)
52b15da3
JH
11049 {
11050 if (hex)
11051 {
11052 char tmp[30];
11053 int i;
11054 buf[0] = '0';
11055 buf[1] = 'x';
11056 sprintf_vma (tmp, disp);
6608db57 11057 for (i = 0; tmp[i] == '0' && tmp[i + 1]; i++);
52b15da3
JH
11058 strcpy (buf + 2, tmp + i);
11059 }
11060 else
11061 {
11062 bfd_signed_vma v = disp;
11063 char tmp[30];
11064 int i;
11065 if (v < 0)
11066 {
11067 *(buf++) = '-';
11068 v = -disp;
6608db57 11069 /* Check for possible overflow on 0x8000000000000000. */
52b15da3
JH
11070 if (v < 0)
11071 {
11072 strcpy (buf, "9223372036854775808");
11073 return;
11074 }
11075 }
11076 if (!v)
11077 {
11078 strcpy (buf, "0");
11079 return;
11080 }
11081
11082 i = 0;
11083 tmp[29] = 0;
11084 while (v)
11085 {
6608db57 11086 tmp[28 - i] = (v % 10) + '0';
52b15da3
JH
11087 v /= 10;
11088 i++;
11089 }
11090 strcpy (buf, tmp + 29 - i);
11091 }
11092 }
11093 else
11094 {
11095 if (hex)
11096 sprintf (buf, "0x%x", (unsigned int) disp);
11097 else
11098 sprintf (buf, "%d", (int) disp);
11099 }
11100}
11101
5d669648
L
11102/* Put DISP in BUF as signed hex number. */
11103
11104static void
11105print_displacement (char *buf, bfd_vma disp)
11106{
11107 bfd_signed_vma val = disp;
11108 char tmp[30];
11109 int i, j = 0;
11110
11111 if (val < 0)
11112 {
11113 buf[j++] = '-';
11114 val = -disp;
11115
11116 /* Check for possible overflow. */
11117 if (val < 0)
11118 {
11119 switch (address_mode)
11120 {
11121 case mode_64bit:
11122 strcpy (buf + j, "0x8000000000000000");
11123 break;
11124 case mode_32bit:
11125 strcpy (buf + j, "0x80000000");
11126 break;
11127 case mode_16bit:
11128 strcpy (buf + j, "0x8000");
11129 break;
11130 }
11131 return;
11132 }
11133 }
11134
11135 buf[j++] = '0';
11136 buf[j++] = 'x';
11137
0af1713e 11138 sprintf_vma (tmp, (bfd_vma) val);
5d669648
L
11139 for (i = 0; tmp[i] == '0'; i++)
11140 continue;
11141 if (tmp[i] == '\0')
11142 i--;
11143 strcpy (buf + j, tmp + i);
11144}
11145
3f31e633
JB
11146static void
11147intel_operand_size (int bytemode, int sizeflag)
11148{
43234a1e
L
11149 if (vex.evex
11150 && vex.b
11151 && (bytemode == x_mode
11152 || bytemode == evex_half_bcst_xmmq_mode))
11153 {
11154 if (vex.w)
11155 oappend ("QWORD PTR ");
11156 else
11157 oappend ("DWORD PTR ");
11158 return;
11159 }
3f31e633
JB
11160 switch (bytemode)
11161 {
11162 case b_mode:
b6169b20 11163 case b_swap_mode:
42903f7f 11164 case dqb_mode:
1ba585e8 11165 case db_mode:
3f31e633
JB
11166 oappend ("BYTE PTR ");
11167 break;
11168 case w_mode:
1ba585e8 11169 case dw_mode:
3f31e633
JB
11170 case dqw_mode:
11171 oappend ("WORD PTR ");
11172 break;
07f5af7d
L
11173 case indir_v_mode:
11174 if (address_mode == mode_64bit && isa64 == intel64)
11175 {
11176 oappend ("QWORD PTR ");
11177 break;
11178 }
1a0670f3 11179 /* Fall through. */
1a114b12 11180 case stack_v_mode:
7bb15c6f 11181 if (address_mode == mode_64bit && ((sizeflag & DFLAG) || (rex & REX_W)))
3f31e633
JB
11182 {
11183 oappend ("QWORD PTR ");
3f31e633
JB
11184 break;
11185 }
1a0670f3 11186 /* Fall through. */
3f31e633 11187 case v_mode:
b6169b20 11188 case v_swap_mode:
3f31e633 11189 case dq_mode:
161a04f6
L
11190 USED_REX (REX_W);
11191 if (rex & REX_W)
3f31e633 11192 oappend ("QWORD PTR ");
035e7389
JB
11193 else if (bytemode == dq_mode)
11194 oappend ("DWORD PTR ");
3f31e633 11195 else
f16cd0d5 11196 {
035e7389 11197 if (sizeflag & DFLAG)
f16cd0d5
L
11198 oappend ("DWORD PTR ");
11199 else
11200 oappend ("WORD PTR ");
11201 used_prefixes |= (prefixes & PREFIX_DATA);
11202 }
3f31e633 11203 break;
52fd6d94 11204 case z_mode:
161a04f6 11205 if ((rex & REX_W) || (sizeflag & DFLAG))
52fd6d94
JB
11206 *obufp++ = 'D';
11207 oappend ("WORD PTR ");
161a04f6 11208 if (!(rex & REX_W))
52fd6d94
JB
11209 used_prefixes |= (prefixes & PREFIX_DATA);
11210 break;
34b772a6
JB
11211 case a_mode:
11212 if (sizeflag & DFLAG)
11213 oappend ("QWORD PTR ");
11214 else
11215 oappend ("DWORD PTR ");
11216 used_prefixes |= (prefixes & PREFIX_DATA);
11217 break;
bc31405e
L
11218 case movsxd_mode:
11219 if (!(sizeflag & DFLAG) && isa64 == intel64)
11220 oappend ("WORD PTR ");
11221 else
11222 oappend ("DWORD PTR ");
11223 used_prefixes |= (prefixes & PREFIX_DATA);
11224 break;
3f31e633 11225 case d_mode:
fa99fab2 11226 case d_swap_mode:
42903f7f 11227 case dqd_mode:
3f31e633
JB
11228 oappend ("DWORD PTR ");
11229 break;
11230 case q_mode:
b6169b20 11231 case q_swap_mode:
3f31e633
JB
11232 oappend ("QWORD PTR ");
11233 break;
11234 case m_mode:
cb712a9e 11235 if (address_mode == mode_64bit)
3f31e633
JB
11236 oappend ("QWORD PTR ");
11237 else
11238 oappend ("DWORD PTR ");
11239 break;
11240 case f_mode:
11241 if (sizeflag & DFLAG)
11242 oappend ("FWORD PTR ");
11243 else
11244 oappend ("DWORD PTR ");
11245 used_prefixes |= (prefixes & PREFIX_DATA);
11246 break;
11247 case t_mode:
11248 oappend ("TBYTE PTR ");
11249 break;
11250 case x_mode:
b6169b20 11251 case x_swap_mode:
43234a1e
L
11252 case evex_x_gscat_mode:
11253 case evex_x_nobcst_mode:
4726e9a4 11254 case bw_unit_mode:
c0f3af97
L
11255 if (need_vex)
11256 {
11257 switch (vex.length)
11258 {
11259 case 128:
11260 oappend ("XMMWORD PTR ");
11261 break;
11262 case 256:
11263 oappend ("YMMWORD PTR ");
11264 break;
43234a1e
L
11265 case 512:
11266 oappend ("ZMMWORD PTR ");
11267 break;
c0f3af97
L
11268 default:
11269 abort ();
11270 }
11271 }
11272 else
11273 oappend ("XMMWORD PTR ");
11274 break;
11275 case xmm_mode:
3f31e633
JB
11276 oappend ("XMMWORD PTR ");
11277 break;
43234a1e
L
11278 case ymm_mode:
11279 oappend ("YMMWORD PTR ");
11280 break;
c0f3af97 11281 case xmmq_mode:
43234a1e 11282 case evex_half_bcst_xmmq_mode:
c0f3af97
L
11283 if (!need_vex)
11284 abort ();
11285
11286 switch (vex.length)
11287 {
11288 case 128:
11289 oappend ("QWORD PTR ");
11290 break;
11291 case 256:
11292 oappend ("XMMWORD PTR ");
11293 break;
43234a1e
L
11294 case 512:
11295 oappend ("YMMWORD PTR ");
11296 break;
c0f3af97
L
11297 default:
11298 abort ();
11299 }
11300 break;
6c30d220
L
11301 case xmm_mb_mode:
11302 if (!need_vex)
11303 abort ();
11304
11305 switch (vex.length)
11306 {
11307 case 128:
11308 case 256:
43234a1e 11309 case 512:
6c30d220
L
11310 oappend ("BYTE PTR ");
11311 break;
11312 default:
11313 abort ();
11314 }
11315 break;
11316 case xmm_mw_mode:
11317 if (!need_vex)
11318 abort ();
11319
11320 switch (vex.length)
11321 {
11322 case 128:
11323 case 256:
43234a1e 11324 case 512:
6c30d220
L
11325 oappend ("WORD PTR ");
11326 break;
11327 default:
11328 abort ();
11329 }
11330 break;
11331 case xmm_md_mode:
11332 if (!need_vex)
11333 abort ();
11334
11335 switch (vex.length)
11336 {
11337 case 128:
11338 case 256:
43234a1e 11339 case 512:
6c30d220
L
11340 oappend ("DWORD PTR ");
11341 break;
11342 default:
11343 abort ();
11344 }
11345 break;
11346 case xmm_mq_mode:
11347 if (!need_vex)
11348 abort ();
11349
11350 switch (vex.length)
11351 {
11352 case 128:
11353 case 256:
43234a1e 11354 case 512:
6c30d220
L
11355 oappend ("QWORD PTR ");
11356 break;
11357 default:
11358 abort ();
11359 }
11360 break;
11361 case xmmdw_mode:
11362 if (!need_vex)
11363 abort ();
11364
11365 switch (vex.length)
11366 {
11367 case 128:
11368 oappend ("WORD PTR ");
11369 break;
11370 case 256:
11371 oappend ("DWORD PTR ");
11372 break;
43234a1e
L
11373 case 512:
11374 oappend ("QWORD PTR ");
11375 break;
6c30d220
L
11376 default:
11377 abort ();
11378 }
11379 break;
11380 case xmmqd_mode:
11381 if (!need_vex)
11382 abort ();
11383
11384 switch (vex.length)
11385 {
11386 case 128:
11387 oappend ("DWORD PTR ");
11388 break;
11389 case 256:
11390 oappend ("QWORD PTR ");
11391 break;
43234a1e
L
11392 case 512:
11393 oappend ("XMMWORD PTR ");
11394 break;
6c30d220
L
11395 default:
11396 abort ();
11397 }
11398 break;
c0f3af97
L
11399 case ymmq_mode:
11400 if (!need_vex)
11401 abort ();
11402
11403 switch (vex.length)
11404 {
11405 case 128:
11406 oappend ("QWORD PTR ");
11407 break;
11408 case 256:
11409 oappend ("YMMWORD PTR ");
11410 break;
43234a1e
L
11411 case 512:
11412 oappend ("ZMMWORD PTR ");
11413 break;
c0f3af97
L
11414 default:
11415 abort ();
11416 }
11417 break;
6c30d220
L
11418 case ymmxmm_mode:
11419 if (!need_vex)
11420 abort ();
11421
11422 switch (vex.length)
11423 {
11424 case 128:
11425 case 256:
11426 oappend ("XMMWORD PTR ");
11427 break;
11428 default:
11429 abort ();
11430 }
11431 break;
fb9c77c7
L
11432 case o_mode:
11433 oappend ("OWORD PTR ");
11434 break;
1c480963 11435 case vex_scalar_w_dq_mode:
0bfee649
L
11436 if (!need_vex)
11437 abort ();
11438
11439 if (vex.w)
11440 oappend ("QWORD PTR ");
11441 else
11442 oappend ("DWORD PTR ");
11443 break;
43234a1e
L
11444 case vex_vsib_d_w_dq_mode:
11445 case vex_vsib_q_w_dq_mode:
11446 if (!need_vex)
11447 abort ();
11448
11449 if (!vex.evex)
11450 {
11451 if (vex.w)
11452 oappend ("QWORD PTR ");
11453 else
11454 oappend ("DWORD PTR ");
11455 }
11456 else
11457 {
b28d1bda
IT
11458 switch (vex.length)
11459 {
11460 case 128:
11461 oappend ("XMMWORD PTR ");
11462 break;
11463 case 256:
11464 oappend ("YMMWORD PTR ");
11465 break;
11466 case 512:
11467 oappend ("ZMMWORD PTR ");
11468 break;
11469 default:
11470 abort ();
11471 }
43234a1e
L
11472 }
11473 break;
5fc35d96
IT
11474 case vex_vsib_q_w_d_mode:
11475 case vex_vsib_d_w_d_mode:
b28d1bda 11476 if (!need_vex || !vex.evex)
5fc35d96
IT
11477 abort ();
11478
b28d1bda
IT
11479 switch (vex.length)
11480 {
11481 case 128:
11482 oappend ("QWORD PTR ");
11483 break;
11484 case 256:
11485 oappend ("XMMWORD PTR ");
11486 break;
11487 case 512:
11488 oappend ("YMMWORD PTR ");
11489 break;
11490 default:
11491 abort ();
11492 }
5fc35d96
IT
11493
11494 break;
1ba585e8
IT
11495 case mask_bd_mode:
11496 if (!need_vex || vex.length != 128)
11497 abort ();
11498 if (vex.w)
11499 oappend ("DWORD PTR ");
11500 else
11501 oappend ("BYTE PTR ");
11502 break;
43234a1e
L
11503 case mask_mode:
11504 if (!need_vex)
11505 abort ();
1ba585e8
IT
11506 if (vex.w)
11507 oappend ("QWORD PTR ");
11508 else
11509 oappend ("WORD PTR ");
43234a1e 11510 break;
6c75cc62 11511 case v_bnd_mode:
d276ec69 11512 case v_bndmk_mode:
3f31e633
JB
11513 default:
11514 break;
11515 }
11516}
11517
252b5132 11518static void
c0f3af97 11519OP_E_register (int bytemode, int sizeflag)
252b5132 11520{
c0f3af97
L
11521 int reg = modrm.rm;
11522 const char **names;
252b5132 11523
c0f3af97
L
11524 USED_REX (REX_B);
11525 if ((rex & REX_B))
11526 reg += 8;
252b5132 11527
b6169b20 11528 if ((sizeflag & SUFFIX_ALWAYS)
1ba585e8 11529 && (bytemode == b_swap_mode
9f79e886 11530 || bytemode == bnd_swap_mode
60227d64 11531 || bytemode == v_swap_mode))
b6169b20
L
11532 swap_operand ();
11533
c0f3af97 11534 switch (bytemode)
252b5132 11535 {
c0f3af97 11536 case b_mode:
b6169b20 11537 case b_swap_mode:
e184e611
JB
11538 if (reg & 4)
11539 USED_REX (0);
c0f3af97
L
11540 if (rex)
11541 names = names8rex;
11542 else
11543 names = names8;
11544 break;
11545 case w_mode:
11546 names = names16;
11547 break;
11548 case d_mode:
1ba585e8
IT
11549 case dw_mode:
11550 case db_mode:
c0f3af97
L
11551 names = names32;
11552 break;
11553 case q_mode:
11554 names = names64;
11555 break;
11556 case m_mode:
6c75cc62 11557 case v_bnd_mode:
c0f3af97
L
11558 names = address_mode == mode_64bit ? names64 : names32;
11559 break;
7e8b059b 11560 case bnd_mode:
9f79e886 11561 case bnd_swap_mode:
0d96e4df
L
11562 if (reg > 0x3)
11563 {
11564 oappend ("(bad)");
11565 return;
11566 }
7e8b059b
L
11567 names = names_bnd;
11568 break;
07f5af7d
L
11569 case indir_v_mode:
11570 if (address_mode == mode_64bit && isa64 == intel64)
11571 {
11572 names = names64;
11573 break;
11574 }
1a0670f3 11575 /* Fall through. */
c0f3af97 11576 case stack_v_mode:
7bb15c6f 11577 if (address_mode == mode_64bit && ((sizeflag & DFLAG) || (rex & REX_W)))
252b5132 11578 {
c0f3af97 11579 names = names64;
252b5132 11580 break;
252b5132 11581 }
c0f3af97 11582 bytemode = v_mode;
1a0670f3 11583 /* Fall through. */
c0f3af97 11584 case v_mode:
b6169b20 11585 case v_swap_mode:
c0f3af97
L
11586 case dq_mode:
11587 case dqb_mode:
11588 case dqd_mode:
11589 case dqw_mode:
11590 USED_REX (REX_W);
11591 if (rex & REX_W)
11592 names = names64;
035e7389
JB
11593 else if (bytemode != v_mode && bytemode != v_swap_mode)
11594 names = names32;
c0f3af97 11595 else
f16cd0d5 11596 {
035e7389 11597 if (sizeflag & DFLAG)
f16cd0d5
L
11598 names = names32;
11599 else
11600 names = names16;
11601 used_prefixes |= (prefixes & PREFIX_DATA);
11602 }
c0f3af97 11603 break;
bc31405e
L
11604 case movsxd_mode:
11605 if (!(sizeflag & DFLAG) && isa64 == intel64)
11606 names = names16;
11607 else
11608 names = names32;
11609 used_prefixes |= (prefixes & PREFIX_DATA);
11610 break;
de89d0a3
IT
11611 case va_mode:
11612 names = (address_mode == mode_64bit
11613 ? names64 : names32);
11614 if (!(prefixes & PREFIX_ADDR))
aa178437
IT
11615 names = (address_mode == mode_16bit
11616 ? names16 : names);
de89d0a3
IT
11617 else
11618 {
11619 /* Remove "addr16/addr32". */
11620 all_prefixes[last_addr_prefix] = 0;
11621 names = (address_mode != mode_32bit
11622 ? names32 : names16);
11623 used_prefixes |= PREFIX_ADDR;
11624 }
11625 break;
1ba585e8 11626 case mask_bd_mode:
43234a1e 11627 case mask_mode:
9889cbb1
L
11628 if (reg > 0x7)
11629 {
11630 oappend ("(bad)");
11631 return;
11632 }
43234a1e
L
11633 names = names_mask;
11634 break;
c0f3af97
L
11635 case 0:
11636 return;
11637 default:
11638 oappend (INTERNAL_DISASSEMBLER_ERROR);
252b5132
RH
11639 return;
11640 }
c0f3af97
L
11641 oappend (names[reg]);
11642}
11643
11644static void
c1e679ec 11645OP_E_memory (int bytemode, int sizeflag)
c0f3af97
L
11646{
11647 bfd_vma disp = 0;
11648 int add = (rex & REX_B) ? 8 : 0;
11649 int riprel = 0;
43234a1e
L
11650 int shift;
11651
11652 if (vex.evex)
11653 {
11654 /* In EVEX, if operand doesn't allow broadcast, vex.b should be 0. */
11655 if (vex.b
11656 && bytemode != x_mode
90a915bf 11657 && bytemode != xmmq_mode
43234a1e
L
11658 && bytemode != evex_half_bcst_xmmq_mode)
11659 {
11660 BadOp ();
11661 return;
11662 }
11663 switch (bytemode)
11664 {
1ba585e8
IT
11665 case dqw_mode:
11666 case dw_mode:
059edf8b 11667 case xmm_mw_mode:
1ba585e8
IT
11668 shift = 1;
11669 break;
11670 case dqb_mode:
11671 case db_mode:
059edf8b 11672 case xmm_mb_mode:
1ba585e8
IT
11673 shift = 0;
11674 break;
b50c9f31
JB
11675 case dq_mode:
11676 if (address_mode != mode_64bit)
11677 {
059edf8b
JB
11678 case dqd_mode:
11679 case xmm_md_mode:
11680 case d_mode:
11681 case d_swap_mode:
b50c9f31
JB
11682 shift = 2;
11683 break;
11684 }
11685 /* fall through */
4102be5c 11686 case vex_scalar_w_dq_mode:
43234a1e 11687 case vex_vsib_d_w_dq_mode:
5fc35d96 11688 case vex_vsib_d_w_d_mode:
eaa9d1ad 11689 case vex_vsib_q_w_dq_mode:
5fc35d96 11690 case vex_vsib_q_w_d_mode:
43234a1e 11691 case evex_x_gscat_mode:
43234a1e
L
11692 shift = vex.w ? 3 : 2;
11693 break;
43234a1e
L
11694 case x_mode:
11695 case evex_half_bcst_xmmq_mode:
90a915bf 11696 case xmmq_mode:
43234a1e
L
11697 if (vex.b)
11698 {
11699 shift = vex.w ? 3 : 2;
11700 break;
11701 }
1a0670f3 11702 /* Fall through. */
43234a1e
L
11703 case xmmqd_mode:
11704 case xmmdw_mode:
43234a1e
L
11705 case ymmq_mode:
11706 case evex_x_nobcst_mode:
11707 case x_swap_mode:
11708 switch (vex.length)
11709 {
11710 case 128:
11711 shift = 4;
11712 break;
11713 case 256:
11714 shift = 5;
11715 break;
11716 case 512:
11717 shift = 6;
11718 break;
11719 default:
11720 abort ();
11721 }
059edf8b
JB
11722 /* Make necessary corrections to shift for modes that need it. */
11723 if (bytemode == xmmq_mode
11724 || bytemode == evex_half_bcst_xmmq_mode
11725 || (bytemode == ymmq_mode && vex.length == 128))
11726 shift -= 1;
11727 else if (bytemode == xmmqd_mode)
11728 shift -= 2;
11729 else if (bytemode == xmmdw_mode)
11730 shift -= 3;
43234a1e
L
11731 break;
11732 case ymm_mode:
11733 shift = 5;
11734 break;
11735 case xmm_mode:
11736 shift = 4;
11737 break;
11738 case xmm_mq_mode:
11739 case q_mode:
43234a1e 11740 case q_swap_mode:
43234a1e
L
11741 shift = 3;
11742 break;
4726e9a4
JB
11743 case bw_unit_mode:
11744 shift = vex.w ? 1 : 0;
11745 break;
43234a1e
L
11746 default:
11747 abort ();
11748 }
43234a1e
L
11749 }
11750 else
11751 shift = 0;
252b5132 11752
c0f3af97 11753 USED_REX (REX_B);
3f31e633
JB
11754 if (intel_syntax)
11755 intel_operand_size (bytemode, sizeflag);
252b5132
RH
11756 append_seg ();
11757
5d669648 11758 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
252b5132 11759 {
5d669648
L
11760 /* 32/64 bit address mode */
11761 int havedisp;
252b5132
RH
11762 int havesib;
11763 int havebase;
0f7da397 11764 int haveindex;
20afcfb7 11765 int needindex;
1bc60e56 11766 int needaddr32;
82c18208 11767 int base, rbase;
91d6fa6a 11768 int vindex = 0;
252b5132 11769 int scale = 0;
7e8b059b
L
11770 int addr32flag = !((sizeflag & AFLAG)
11771 || bytemode == v_bnd_mode
d276ec69 11772 || bytemode == v_bndmk_mode
9f79e886
JB
11773 || bytemode == bnd_mode
11774 || bytemode == bnd_swap_mode);
6c30d220
L
11775 const char **indexes64 = names64;
11776 const char **indexes32 = names32;
252b5132
RH
11777
11778 havesib = 0;
11779 havebase = 1;
0f7da397 11780 haveindex = 0;
7967e09e 11781 base = modrm.rm;
252b5132
RH
11782
11783 if (base == 4)
11784 {
11785 havesib = 1;
dfc8cf43 11786 vindex = sib.index;
161a04f6
L
11787 USED_REX (REX_X);
11788 if (rex & REX_X)
91d6fa6a 11789 vindex += 8;
6c30d220
L
11790 switch (bytemode)
11791 {
11792 case vex_vsib_d_w_dq_mode:
5fc35d96 11793 case vex_vsib_d_w_d_mode:
6c30d220 11794 case vex_vsib_q_w_dq_mode:
5fc35d96 11795 case vex_vsib_q_w_d_mode:
6c30d220
L
11796 if (!need_vex)
11797 abort ();
43234a1e
L
11798 if (vex.evex)
11799 {
11800 if (!vex.v)
11801 vindex += 16;
11802 }
6c30d220
L
11803
11804 haveindex = 1;
11805 switch (vex.length)
11806 {
11807 case 128:
7bb15c6f 11808 indexes64 = indexes32 = names_xmm;
6c30d220
L
11809 break;
11810 case 256:
5fc35d96
IT
11811 if (!vex.w
11812 || bytemode == vex_vsib_q_w_dq_mode
11813 || bytemode == vex_vsib_q_w_d_mode)
7bb15c6f 11814 indexes64 = indexes32 = names_ymm;
6c30d220 11815 else
7bb15c6f 11816 indexes64 = indexes32 = names_xmm;
6c30d220 11817 break;
43234a1e 11818 case 512:
5fc35d96
IT
11819 if (!vex.w
11820 || bytemode == vex_vsib_q_w_dq_mode
11821 || bytemode == vex_vsib_q_w_d_mode)
43234a1e
L
11822 indexes64 = indexes32 = names_zmm;
11823 else
11824 indexes64 = indexes32 = names_ymm;
11825 break;
6c30d220
L
11826 default:
11827 abort ();
11828 }
11829 break;
11830 default:
11831 haveindex = vindex != 4;
11832 break;
11833 }
11834 scale = sib.scale;
11835 base = sib.base;
252b5132
RH
11836 codep++;
11837 }
260cd341
LC
11838 else
11839 {
11840 /* mandatory non-vector SIB must have sib */
11841 if (bytemode == vex_sibmem_mode)
11842 {
11843 oappend ("(bad)");
11844 return;
11845 }
11846 }
82c18208 11847 rbase = base + add;
252b5132 11848
7967e09e 11849 switch (modrm.mod)
252b5132
RH
11850 {
11851 case 0:
82c18208 11852 if (base == 5)
252b5132
RH
11853 {
11854 havebase = 0;
cb712a9e 11855 if (address_mode == mode_64bit && !havesib)
52b15da3
JH
11856 riprel = 1;
11857 disp = get32s ();
d276ec69
JB
11858 if (riprel && bytemode == v_bndmk_mode)
11859 {
11860 oappend ("(bad)");
11861 return;
11862 }
252b5132
RH
11863 }
11864 break;
11865 case 1:
11866 FETCH_DATA (the_info, codep + 1);
11867 disp = *codep++;
11868 if ((disp & 0x80) != 0)
11869 disp -= 0x100;
43234a1e
L
11870 if (vex.evex && shift > 0)
11871 disp <<= shift;
252b5132
RH
11872 break;
11873 case 2:
52b15da3 11874 disp = get32s ();
252b5132
RH
11875 break;
11876 }
11877
1bc60e56
L
11878 needindex = 0;
11879 needaddr32 = 0;
11880 if (havesib
11881 && !havebase
11882 && !haveindex
11883 && address_mode != mode_16bit)
11884 {
11885 if (address_mode == mode_64bit)
11886 {
11887 /* Display eiz instead of addr32. */
11888 needindex = addr32flag;
11889 needaddr32 = 1;
11890 }
11891 else
11892 {
11893 /* In 32-bit mode, we need index register to tell [offset]
11894 from [eiz*1 + offset]. */
11895 needindex = 1;
11896 }
11897 }
11898
20afcfb7
L
11899 havedisp = (havebase
11900 || needindex
11901 || (havesib && (haveindex || scale != 0)));
5d669648 11902
252b5132 11903 if (!intel_syntax)
82c18208 11904 if (modrm.mod != 0 || base == 5)
db6eb5be 11905 {
5d669648
L
11906 if (havedisp || riprel)
11907 print_displacement (scratchbuf, disp);
11908 else
11909 print_operand_value (scratchbuf, 1, disp);
db6eb5be 11910 oappend (scratchbuf);
52b15da3
JH
11911 if (riprel)
11912 {
11913 set_op (disp, 1);
28596323 11914 oappend (!addr32flag ? "(%rip)" : "(%eip)");
52b15da3 11915 }
db6eb5be 11916 }
2da11e11 11917
c1dc7af5 11918 if ((havebase || haveindex || needindex || needaddr32 || riprel)
a23b33b3
JB
11919 && (address_mode != mode_64bit
11920 || ((bytemode != v_bnd_mode)
11921 && (bytemode != v_bndmk_mode)
11922 && (bytemode != bnd_mode)
11923 && (bytemode != bnd_swap_mode))))
87767711
JB
11924 used_prefixes |= PREFIX_ADDR;
11925
5d669648 11926 if (havedisp || (intel_syntax && riprel))
252b5132 11927 {
252b5132 11928 *obufp++ = open_char;
52b15da3 11929 if (intel_syntax && riprel)
185b1163
L
11930 {
11931 set_op (disp, 1);
28596323 11932 oappend (!addr32flag ? "rip" : "eip");
185b1163 11933 }
db6eb5be 11934 *obufp = '\0';
252b5132 11935 if (havebase)
7e8b059b 11936 oappend (address_mode == mode_64bit && !addr32flag
82c18208 11937 ? names64[rbase] : names32[rbase]);
252b5132
RH
11938 if (havesib)
11939 {
db51cc60
L
11940 /* ESP/RSP won't allow index. If base isn't ESP/RSP,
11941 print index to tell base + index from base. */
11942 if (scale != 0
20afcfb7 11943 || needindex
db51cc60
L
11944 || haveindex
11945 || (havebase && base != ESP_REG_NUM))
252b5132 11946 {
9306ca4a 11947 if (!intel_syntax || havebase)
db6eb5be 11948 {
9306ca4a
JB
11949 *obufp++ = separator_char;
11950 *obufp = '\0';
db6eb5be 11951 }
db51cc60 11952 if (haveindex)
7e8b059b 11953 oappend (address_mode == mode_64bit && !addr32flag
6c30d220 11954 ? indexes64[vindex] : indexes32[vindex]);
db51cc60 11955 else
7e8b059b 11956 oappend (address_mode == mode_64bit && !addr32flag
db51cc60
L
11957 ? index64 : index32);
11958
db6eb5be
AM
11959 *obufp++ = scale_char;
11960 *obufp = '\0';
11961 sprintf (scratchbuf, "%d", 1 << scale);
11962 oappend (scratchbuf);
11963 }
252b5132 11964 }
185b1163 11965 if (intel_syntax
82c18208 11966 && (disp || modrm.mod != 0 || base == 5))
3d456fa1 11967 {
db51cc60 11968 if (!havedisp || (bfd_signed_vma) disp >= 0)
3d456fa1
JB
11969 {
11970 *obufp++ = '+';
11971 *obufp = '\0';
11972 }
05203043 11973 else if (modrm.mod != 1 && disp != -disp)
3d456fa1
JB
11974 {
11975 *obufp++ = '-';
11976 *obufp = '\0';
11977 disp = - (bfd_signed_vma) disp;
11978 }
11979
db51cc60
L
11980 if (havedisp)
11981 print_displacement (scratchbuf, disp);
11982 else
11983 print_operand_value (scratchbuf, 1, disp);
3d456fa1
JB
11984 oappend (scratchbuf);
11985 }
252b5132
RH
11986
11987 *obufp++ = close_char;
db6eb5be 11988 *obufp = '\0';
252b5132
RH
11989 }
11990 else if (intel_syntax)
db6eb5be 11991 {
82c18208 11992 if (modrm.mod != 0 || base == 5)
db6eb5be 11993 {
285ca992 11994 if (!active_seg_prefix)
252b5132 11995 {
d708bcba 11996 oappend (names_seg[ds_reg - es_reg]);
252b5132
RH
11997 oappend (":");
11998 }
52b15da3 11999 print_operand_value (scratchbuf, 1, disp);
db6eb5be
AM
12000 oappend (scratchbuf);
12001 }
12002 }
252b5132 12003 }
a23b33b3
JB
12004 else if (bytemode == v_bnd_mode
12005 || bytemode == v_bndmk_mode
12006 || bytemode == bnd_mode
12007 || bytemode == bnd_swap_mode)
12008 {
12009 oappend ("(bad)");
12010 return;
12011 }
252b5132 12012 else
f16cd0d5
L
12013 {
12014 /* 16 bit address mode */
12015 used_prefixes |= prefixes & PREFIX_ADDR;
7967e09e 12016 switch (modrm.mod)
252b5132
RH
12017 {
12018 case 0:
7967e09e 12019 if (modrm.rm == 6)
252b5132
RH
12020 {
12021 disp = get16 ();
12022 if ((disp & 0x8000) != 0)
12023 disp -= 0x10000;
12024 }
12025 break;
12026 case 1:
12027 FETCH_DATA (the_info, codep + 1);
12028 disp = *codep++;
12029 if ((disp & 0x80) != 0)
12030 disp -= 0x100;
65f3ed04
JB
12031 if (vex.evex && shift > 0)
12032 disp <<= shift;
252b5132
RH
12033 break;
12034 case 2:
12035 disp = get16 ();
12036 if ((disp & 0x8000) != 0)
12037 disp -= 0x10000;
12038 break;
12039 }
12040
12041 if (!intel_syntax)
7967e09e 12042 if (modrm.mod != 0 || modrm.rm == 6)
db6eb5be 12043 {
5d669648 12044 print_displacement (scratchbuf, disp);
db6eb5be
AM
12045 oappend (scratchbuf);
12046 }
252b5132 12047
7967e09e 12048 if (modrm.mod != 0 || modrm.rm != 6)
252b5132
RH
12049 {
12050 *obufp++ = open_char;
db6eb5be 12051 *obufp = '\0';
7967e09e 12052 oappend (index16[modrm.rm]);
5d669648
L
12053 if (intel_syntax
12054 && (disp || modrm.mod != 0 || modrm.rm == 6))
3d456fa1 12055 {
5d669648 12056 if ((bfd_signed_vma) disp >= 0)
3d456fa1
JB
12057 {
12058 *obufp++ = '+';
12059 *obufp = '\0';
12060 }
7967e09e 12061 else if (modrm.mod != 1)
3d456fa1
JB
12062 {
12063 *obufp++ = '-';
12064 *obufp = '\0';
12065 disp = - (bfd_signed_vma) disp;
12066 }
12067
5d669648 12068 print_displacement (scratchbuf, disp);
3d456fa1
JB
12069 oappend (scratchbuf);
12070 }
12071
db6eb5be
AM
12072 *obufp++ = close_char;
12073 *obufp = '\0';
252b5132 12074 }
3d456fa1
JB
12075 else if (intel_syntax)
12076 {
285ca992 12077 if (!active_seg_prefix)
3d456fa1
JB
12078 {
12079 oappend (names_seg[ds_reg - es_reg]);
12080 oappend (":");
12081 }
12082 print_operand_value (scratchbuf, 1, disp & 0xffff);
12083 oappend (scratchbuf);
12084 }
252b5132 12085 }
43234a1e
L
12086 if (vex.evex && vex.b
12087 && (bytemode == x_mode
90a915bf 12088 || bytemode == xmmq_mode
43234a1e
L
12089 || bytemode == evex_half_bcst_xmmq_mode))
12090 {
90a915bf
IT
12091 if (vex.w
12092 || bytemode == xmmq_mode
12093 || bytemode == evex_half_bcst_xmmq_mode)
b28d1bda
IT
12094 {
12095 switch (vex.length)
12096 {
12097 case 128:
12098 oappend ("{1to2}");
12099 break;
12100 case 256:
12101 oappend ("{1to4}");
12102 break;
12103 case 512:
12104 oappend ("{1to8}");
12105 break;
12106 default:
12107 abort ();
12108 }
12109 }
43234a1e 12110 else
b28d1bda
IT
12111 {
12112 switch (vex.length)
12113 {
12114 case 128:
12115 oappend ("{1to4}");
12116 break;
12117 case 256:
12118 oappend ("{1to8}");
12119 break;
12120 case 512:
12121 oappend ("{1to16}");
12122 break;
12123 default:
12124 abort ();
12125 }
12126 }
43234a1e 12127 }
252b5132
RH
12128}
12129
c0f3af97 12130static void
8b3f93e7 12131OP_E (int bytemode, int sizeflag)
c0f3af97
L
12132{
12133 /* Skip mod/rm byte. */
12134 MODRM_CHECK;
12135 codep++;
12136
12137 if (modrm.mod == 3)
12138 OP_E_register (bytemode, sizeflag);
12139 else
c1e679ec 12140 OP_E_memory (bytemode, sizeflag);
c0f3af97
L
12141}
12142
252b5132 12143static void
26ca5450 12144OP_G (int bytemode, int sizeflag)
252b5132 12145{
52b15da3 12146 int add = 0;
c0a30a9f 12147 const char **names;
161a04f6
L
12148 USED_REX (REX_R);
12149 if (rex & REX_R)
52b15da3 12150 add += 8;
252b5132
RH
12151 switch (bytemode)
12152 {
12153 case b_mode:
e184e611
JB
12154 if (modrm.reg & 4)
12155 USED_REX (0);
52b15da3 12156 if (rex)
7967e09e 12157 oappend (names8rex[modrm.reg + add]);
52b15da3 12158 else
7967e09e 12159 oappend (names8[modrm.reg + add]);
252b5132
RH
12160 break;
12161 case w_mode:
7967e09e 12162 oappend (names16[modrm.reg + add]);
252b5132
RH
12163 break;
12164 case d_mode:
1ba585e8
IT
12165 case db_mode:
12166 case dw_mode:
7967e09e 12167 oappend (names32[modrm.reg + add]);
52b15da3
JH
12168 break;
12169 case q_mode:
7967e09e 12170 oappend (names64[modrm.reg + add]);
252b5132 12171 break;
7e8b059b 12172 case bnd_mode:
0d96e4df
L
12173 if (modrm.reg > 0x3)
12174 {
12175 oappend ("(bad)");
12176 return;
12177 }
7e8b059b
L
12178 oappend (names_bnd[modrm.reg]);
12179 break;
252b5132 12180 case v_mode:
9306ca4a 12181 case dq_mode:
42903f7f
L
12182 case dqb_mode:
12183 case dqd_mode:
9306ca4a 12184 case dqw_mode:
bc31405e 12185 case movsxd_mode:
161a04f6
L
12186 USED_REX (REX_W);
12187 if (rex & REX_W)
7967e09e 12188 oappend (names64[modrm.reg + add]);
035e7389
JB
12189 else if (bytemode != v_mode && bytemode != movsxd_mode)
12190 oappend (names32[modrm.reg + add]);
252b5132 12191 else
f16cd0d5 12192 {
035e7389 12193 if (sizeflag & DFLAG)
f16cd0d5
L
12194 oappend (names32[modrm.reg + add]);
12195 else
12196 oappend (names16[modrm.reg + add]);
12197 used_prefixes |= (prefixes & PREFIX_DATA);
12198 }
252b5132 12199 break;
c0a30a9f
L
12200 case va_mode:
12201 names = (address_mode == mode_64bit
12202 ? names64 : names32);
12203 if (!(prefixes & PREFIX_ADDR))
12204 {
12205 if (address_mode == mode_16bit)
12206 names = names16;
12207 }
12208 else
12209 {
12210 /* Remove "addr16/addr32". */
12211 all_prefixes[last_addr_prefix] = 0;
12212 names = (address_mode != mode_32bit
12213 ? names32 : names16);
12214 used_prefixes |= PREFIX_ADDR;
12215 }
12216 oappend (names[modrm.reg + add]);
12217 break;
90700ea2 12218 case m_mode:
cb712a9e 12219 if (address_mode == mode_64bit)
7967e09e 12220 oappend (names64[modrm.reg + add]);
90700ea2 12221 else
7967e09e 12222 oappend (names32[modrm.reg + add]);
90700ea2 12223 break;
1ba585e8 12224 case mask_bd_mode:
43234a1e 12225 case mask_mode:
9889cbb1
L
12226 if ((modrm.reg + add) > 0x7)
12227 {
12228 oappend ("(bad)");
12229 return;
12230 }
43234a1e
L
12231 oappend (names_mask[modrm.reg + add]);
12232 break;
252b5132
RH
12233 default:
12234 oappend (INTERNAL_DISASSEMBLER_ERROR);
12235 break;
12236 }
12237}
12238
52b15da3 12239static bfd_vma
26ca5450 12240get64 (void)
52b15da3 12241{
5dd0794d 12242 bfd_vma x;
52b15da3 12243#ifdef BFD64
5dd0794d
AM
12244 unsigned int a;
12245 unsigned int b;
12246
52b15da3
JH
12247 FETCH_DATA (the_info, codep + 8);
12248 a = *codep++ & 0xff;
12249 a |= (*codep++ & 0xff) << 8;
12250 a |= (*codep++ & 0xff) << 16;
070fe95d 12251 a |= (*codep++ & 0xffu) << 24;
5dd0794d 12252 b = *codep++ & 0xff;
52b15da3
JH
12253 b |= (*codep++ & 0xff) << 8;
12254 b |= (*codep++ & 0xff) << 16;
070fe95d 12255 b |= (*codep++ & 0xffu) << 24;
52b15da3
JH
12256 x = a + ((bfd_vma) b << 32);
12257#else
6608db57 12258 abort ();
5dd0794d 12259 x = 0;
52b15da3
JH
12260#endif
12261 return x;
12262}
12263
12264static bfd_signed_vma
26ca5450 12265get32 (void)
252b5132 12266{
52b15da3 12267 bfd_signed_vma x = 0;
252b5132
RH
12268
12269 FETCH_DATA (the_info, codep + 4);
52b15da3
JH
12270 x = *codep++ & (bfd_signed_vma) 0xff;
12271 x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
12272 x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
12273 x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
12274 return x;
12275}
12276
12277static bfd_signed_vma
26ca5450 12278get32s (void)
52b15da3
JH
12279{
12280 bfd_signed_vma x = 0;
12281
12282 FETCH_DATA (the_info, codep + 4);
12283 x = *codep++ & (bfd_signed_vma) 0xff;
12284 x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
12285 x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
12286 x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
12287
12288 x = (x ^ ((bfd_signed_vma) 1 << 31)) - ((bfd_signed_vma) 1 << 31);
12289
252b5132
RH
12290 return x;
12291}
12292
12293static int
26ca5450 12294get16 (void)
252b5132
RH
12295{
12296 int x = 0;
12297
12298 FETCH_DATA (the_info, codep + 2);
12299 x = *codep++ & 0xff;
12300 x |= (*codep++ & 0xff) << 8;
12301 return x;
12302}
12303
12304static void
26ca5450 12305set_op (bfd_vma op, int riprel)
252b5132
RH
12306{
12307 op_index[op_ad] = op_ad;
cb712a9e 12308 if (address_mode == mode_64bit)
7081ff04
AJ
12309 {
12310 op_address[op_ad] = op;
12311 op_riprel[op_ad] = riprel;
12312 }
12313 else
12314 {
12315 /* Mask to get a 32-bit address. */
12316 op_address[op_ad] = op & 0xffffffff;
12317 op_riprel[op_ad] = riprel & 0xffffffff;
12318 }
252b5132
RH
12319}
12320
12321static void
26ca5450 12322OP_REG (int code, int sizeflag)
252b5132 12323{
2da11e11 12324 const char *s;
9b60702d 12325 int add;
de882298
RM
12326
12327 switch (code)
12328 {
12329 case es_reg: case ss_reg: case cs_reg:
12330 case ds_reg: case fs_reg: case gs_reg:
12331 oappend (names_seg[code - es_reg]);
12332 return;
12333 }
12334
161a04f6
L
12335 USED_REX (REX_B);
12336 if (rex & REX_B)
52b15da3 12337 add = 8;
9b60702d
L
12338 else
12339 add = 0;
52b15da3
JH
12340
12341 switch (code)
12342 {
52b15da3
JH
12343 case ax_reg: case cx_reg: case dx_reg: case bx_reg:
12344 case sp_reg: case bp_reg: case si_reg: case di_reg:
12345 s = names16[code - ax_reg + add];
12346 break;
e184e611 12347 case ah_reg: case ch_reg: case dh_reg: case bh_reg:
52b15da3 12348 USED_REX (0);
e184e611
JB
12349 /* Fall through. */
12350 case al_reg: case cl_reg: case dl_reg: case bl_reg:
52b15da3
JH
12351 if (rex)
12352 s = names8rex[code - al_reg + add];
12353 else
12354 s = names8[code - al_reg];
12355 break;
6439fc28
AM
12356 case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
12357 case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
7bb15c6f 12358 if (address_mode == mode_64bit
6c067bbb 12359 && ((sizeflag & DFLAG) || (rex & REX_W)))
6439fc28
AM
12360 {
12361 s = names64[code - rAX_reg + add];
12362 break;
12363 }
12364 code += eAX_reg - rAX_reg;
6608db57 12365 /* Fall through. */
52b15da3
JH
12366 case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
12367 case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
161a04f6
L
12368 USED_REX (REX_W);
12369 if (rex & REX_W)
52b15da3 12370 s = names64[code - eAX_reg + add];
52b15da3 12371 else
f16cd0d5
L
12372 {
12373 if (sizeflag & DFLAG)
12374 s = names32[code - eAX_reg + add];
12375 else
12376 s = names16[code - eAX_reg + add];
12377 used_prefixes |= (prefixes & PREFIX_DATA);
12378 }
52b15da3 12379 break;
52b15da3
JH
12380 default:
12381 s = INTERNAL_DISASSEMBLER_ERROR;
12382 break;
12383 }
12384 oappend (s);
12385}
12386
12387static void
26ca5450 12388OP_IMREG (int code, int sizeflag)
52b15da3
JH
12389{
12390 const char *s;
252b5132
RH
12391
12392 switch (code)
12393 {
12394 case indir_dx_reg:
d708bcba 12395 if (intel_syntax)
52fd6d94 12396 s = "dx";
d708bcba 12397 else
db6eb5be 12398 s = "(%dx)";
252b5132 12399 break;
e8b5d5f9
JB
12400 case al_reg: case cl_reg:
12401 s = names8[code - al_reg];
252b5132 12402 break;
e8b5d5f9 12403 case eAX_reg:
161a04f6
L
12404 USED_REX (REX_W);
12405 if (rex & REX_W)
f16cd0d5 12406 {
e8b5d5f9
JB
12407 s = *names64;
12408 break;
f16cd0d5 12409 }
e8b5d5f9 12410 /* Fall through. */
52fd6d94 12411 case z_mode_ax_reg:
161a04f6 12412 if ((rex & REX_W) || (sizeflag & DFLAG))
52fd6d94
JB
12413 s = *names32;
12414 else
12415 s = *names16;
161a04f6 12416 if (!(rex & REX_W))
52fd6d94
JB
12417 used_prefixes |= (prefixes & PREFIX_DATA);
12418 break;
252b5132
RH
12419 default:
12420 s = INTERNAL_DISASSEMBLER_ERROR;
12421 break;
12422 }
12423 oappend (s);
12424}
12425
12426static void
26ca5450 12427OP_I (int bytemode, int sizeflag)
252b5132 12428{
52b15da3
JH
12429 bfd_signed_vma op;
12430 bfd_signed_vma mask = -1;
252b5132
RH
12431
12432 switch (bytemode)
12433 {
12434 case b_mode:
12435 FETCH_DATA (the_info, codep + 1);
52b15da3
JH
12436 op = *codep++;
12437 mask = 0xff;
12438 break;
252b5132 12439 case v_mode:
161a04f6
L
12440 USED_REX (REX_W);
12441 if (rex & REX_W)
52b15da3 12442 op = get32s ();
252b5132 12443 else
52b15da3 12444 {
f16cd0d5
L
12445 if (sizeflag & DFLAG)
12446 {
12447 op = get32 ();
12448 mask = 0xffffffff;
12449 }
12450 else
12451 {
12452 op = get16 ();
12453 mask = 0xfffff;
12454 }
12455 used_prefixes |= (prefixes & PREFIX_DATA);
52b15da3 12456 }
252b5132 12457 break;
c1dc7af5
JB
12458 case d_mode:
12459 mask = 0xffffffff;
12460 op = get32 ();
12461 break;
252b5132 12462 case w_mode:
52b15da3 12463 mask = 0xfffff;
252b5132
RH
12464 op = get16 ();
12465 break;
9306ca4a
JB
12466 case const_1_mode:
12467 if (intel_syntax)
6c067bbb 12468 oappend ("1");
9306ca4a 12469 return;
252b5132
RH
12470 default:
12471 oappend (INTERNAL_DISASSEMBLER_ERROR);
12472 return;
12473 }
12474
52b15da3
JH
12475 op &= mask;
12476 scratchbuf[0] = '$';
d708bcba 12477 print_operand_value (scratchbuf + 1, 1, op);
9ce09ba2 12478 oappend_maybe_intel (scratchbuf);
52b15da3
JH
12479 scratchbuf[0] = '\0';
12480}
12481
12482static void
26ca5450 12483OP_I64 (int bytemode, int sizeflag)
52b15da3 12484{
a280ab8e 12485 if (bytemode != v_mode || address_mode != mode_64bit || !(rex & REX_W))
6439fc28
AM
12486 {
12487 OP_I (bytemode, sizeflag);
12488 return;
12489 }
12490
a280ab8e 12491 USED_REX (REX_W);
52b15da3 12492
52b15da3 12493 scratchbuf[0] = '$';
a280ab8e 12494 print_operand_value (scratchbuf + 1, 1, get64 ());
9ce09ba2 12495 oappend_maybe_intel (scratchbuf);
252b5132
RH
12496 scratchbuf[0] = '\0';
12497}
12498
12499static void
26ca5450 12500OP_sI (int bytemode, int sizeflag)
252b5132 12501{
52b15da3 12502 bfd_signed_vma op;
252b5132
RH
12503
12504 switch (bytemode)
12505 {
12506 case b_mode:
e3949f17 12507 case b_T_mode:
252b5132
RH
12508 FETCH_DATA (the_info, codep + 1);
12509 op = *codep++;
12510 if ((op & 0x80) != 0)
12511 op -= 0x100;
e3949f17
L
12512 if (bytemode == b_T_mode)
12513 {
12514 if (address_mode != mode_64bit
7bb15c6f 12515 || !((sizeflag & DFLAG) || (rex & REX_W)))
e3949f17 12516 {
6c067bbb
RM
12517 /* The operand-size prefix is overridden by a REX prefix. */
12518 if ((sizeflag & DFLAG) || (rex & REX_W))
e3949f17
L
12519 op &= 0xffffffff;
12520 else
12521 op &= 0xffff;
12522 }
12523 }
12524 else
12525 {
12526 if (!(rex & REX_W))
12527 {
12528 if (sizeflag & DFLAG)
12529 op &= 0xffffffff;
12530 else
12531 op &= 0xffff;
12532 }
12533 }
252b5132
RH
12534 break;
12535 case v_mode:
7bb15c6f
RM
12536 /* The operand-size prefix is overridden by a REX prefix. */
12537 if ((sizeflag & DFLAG) || (rex & REX_W))
52b15da3 12538 op = get32s ();
252b5132 12539 else
d9e3625e 12540 op = get16 ();
252b5132
RH
12541 break;
12542 default:
12543 oappend (INTERNAL_DISASSEMBLER_ERROR);
12544 return;
12545 }
52b15da3
JH
12546
12547 scratchbuf[0] = '$';
12548 print_operand_value (scratchbuf + 1, 1, op);
9ce09ba2 12549 oappend_maybe_intel (scratchbuf);
252b5132
RH
12550}
12551
12552static void
26ca5450 12553OP_J (int bytemode, int sizeflag)
252b5132 12554{
52b15da3 12555 bfd_vma disp;
7081ff04 12556 bfd_vma mask = -1;
65ca155d 12557 bfd_vma segment = 0;
252b5132
RH
12558
12559 switch (bytemode)
12560 {
12561 case b_mode:
12562 FETCH_DATA (the_info, codep + 1);
12563 disp = *codep++;
12564 if ((disp & 0x80) != 0)
12565 disp -= 0x100;
12566 break;
12567 case v_mode:
d835a58b 12568 if (isa64 != intel64)
376cd056 12569 case dqw_mode:
5db04b09
L
12570 USED_REX (REX_W);
12571 if ((sizeflag & DFLAG)
12572 || (address_mode == mode_64bit
d835a58b 12573 && ((isa64 == intel64 && bytemode != dqw_mode)
376cd056 12574 || (rex & REX_W))))
52b15da3 12575 disp = get32s ();
252b5132
RH
12576 else
12577 {
12578 disp = get16 ();
206717e8
L
12579 if ((disp & 0x8000) != 0)
12580 disp -= 0x10000;
65ca155d
L
12581 /* In 16bit mode, address is wrapped around at 64k within
12582 the same segment. Otherwise, a data16 prefix on a jump
12583 instruction means that the pc is masked to 16 bits after
12584 the displacement is added! */
12585 mask = 0xffff;
12586 if ((prefixes & PREFIX_DATA) == 0)
4fd7268a 12587 segment = ((start_pc + (codep - start_codep))
65ca155d 12588 & ~((bfd_vma) 0xffff));
252b5132 12589 }
5db04b09 12590 if (address_mode != mode_64bit
d835a58b 12591 || (isa64 != intel64 && !(rex & REX_W)))
f16cd0d5 12592 used_prefixes |= (prefixes & PREFIX_DATA);
252b5132
RH
12593 break;
12594 default:
12595 oappend (INTERNAL_DISASSEMBLER_ERROR);
12596 return;
12597 }
42d5f9c6 12598 disp = ((start_pc + (codep - start_codep) + disp) & mask) | segment;
52b15da3
JH
12599 set_op (disp, 0);
12600 print_operand_value (scratchbuf, 1, disp);
252b5132
RH
12601 oappend (scratchbuf);
12602}
12603
252b5132 12604static void
ed7841b3 12605OP_SEG (int bytemode, int sizeflag)
252b5132 12606{
ed7841b3 12607 if (bytemode == w_mode)
7967e09e 12608 oappend (names_seg[modrm.reg]);
ed7841b3 12609 else
7967e09e 12610 OP_E (modrm.mod == 3 ? bytemode : w_mode, sizeflag);
252b5132
RH
12611}
12612
12613static void
26ca5450 12614OP_DIR (int dummy ATTRIBUTE_UNUSED, int sizeflag)
252b5132
RH
12615{
12616 int seg, offset;
12617
c608c12e 12618 if (sizeflag & DFLAG)
252b5132 12619 {
c608c12e
AM
12620 offset = get32 ();
12621 seg = get16 ();
252b5132 12622 }
c608c12e
AM
12623 else
12624 {
12625 offset = get16 ();
12626 seg = get16 ();
12627 }
7d421014 12628 used_prefixes |= (prefixes & PREFIX_DATA);
d708bcba 12629 if (intel_syntax)
3f31e633 12630 sprintf (scratchbuf, "0x%x:0x%x", seg, offset);
d708bcba
AM
12631 else
12632 sprintf (scratchbuf, "$0x%x,$0x%x", seg, offset);
c608c12e 12633 oappend (scratchbuf);
252b5132
RH
12634}
12635
252b5132 12636static void
3f31e633 12637OP_OFF (int bytemode, int sizeflag)
252b5132 12638{
52b15da3 12639 bfd_vma off;
252b5132 12640
3f31e633
JB
12641 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
12642 intel_operand_size (bytemode, sizeflag);
252b5132
RH
12643 append_seg ();
12644
cb712a9e 12645 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
252b5132
RH
12646 off = get32 ();
12647 else
12648 off = get16 ();
12649
12650 if (intel_syntax)
12651 {
285ca992 12652 if (!active_seg_prefix)
252b5132 12653 {
d708bcba 12654 oappend (names_seg[ds_reg - es_reg]);
252b5132
RH
12655 oappend (":");
12656 }
12657 }
52b15da3
JH
12658 print_operand_value (scratchbuf, 1, off);
12659 oappend (scratchbuf);
12660}
6439fc28 12661
52b15da3 12662static void
3f31e633 12663OP_OFF64 (int bytemode, int sizeflag)
52b15da3
JH
12664{
12665 bfd_vma off;
12666
539e75ad
L
12667 if (address_mode != mode_64bit
12668 || (prefixes & PREFIX_ADDR))
6439fc28
AM
12669 {
12670 OP_OFF (bytemode, sizeflag);
12671 return;
12672 }
12673
3f31e633
JB
12674 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
12675 intel_operand_size (bytemode, sizeflag);
52b15da3
JH
12676 append_seg ();
12677
6608db57 12678 off = get64 ();
52b15da3
JH
12679
12680 if (intel_syntax)
12681 {
285ca992 12682 if (!active_seg_prefix)
52b15da3 12683 {
d708bcba 12684 oappend (names_seg[ds_reg - es_reg]);
52b15da3
JH
12685 oappend (":");
12686 }
12687 }
12688 print_operand_value (scratchbuf, 1, off);
252b5132
RH
12689 oappend (scratchbuf);
12690}
12691
12692static void
26ca5450 12693ptr_reg (int code, int sizeflag)
252b5132 12694{
2da11e11 12695 const char *s;
d708bcba 12696
1d9f512f 12697 *obufp++ = open_char;
20f0a1fc 12698 used_prefixes |= (prefixes & PREFIX_ADDR);
cb712a9e 12699 if (address_mode == mode_64bit)
c1a64871
JH
12700 {
12701 if (!(sizeflag & AFLAG))
db6eb5be 12702 s = names32[code - eAX_reg];
c1a64871 12703 else
db6eb5be 12704 s = names64[code - eAX_reg];
c1a64871 12705 }
52b15da3 12706 else if (sizeflag & AFLAG)
252b5132
RH
12707 s = names32[code - eAX_reg];
12708 else
12709 s = names16[code - eAX_reg];
12710 oappend (s);
1d9f512f
AM
12711 *obufp++ = close_char;
12712 *obufp = 0;
252b5132
RH
12713}
12714
12715static void
26ca5450 12716OP_ESreg (int code, int sizeflag)
252b5132 12717{
9306ca4a 12718 if (intel_syntax)
52fd6d94
JB
12719 {
12720 switch (codep[-1])
12721 {
12722 case 0x6d: /* insw/insl */
12723 intel_operand_size (z_mode, sizeflag);
12724 break;
12725 case 0xa5: /* movsw/movsl/movsq */
12726 case 0xa7: /* cmpsw/cmpsl/cmpsq */
12727 case 0xab: /* stosw/stosl */
12728 case 0xaf: /* scasw/scasl */
12729 intel_operand_size (v_mode, sizeflag);
12730 break;
12731 default:
12732 intel_operand_size (b_mode, sizeflag);
12733 }
12734 }
9ce09ba2 12735 oappend_maybe_intel ("%es:");
252b5132
RH
12736 ptr_reg (code, sizeflag);
12737}
12738
12739static void
26ca5450 12740OP_DSreg (int code, int sizeflag)
252b5132 12741{
9306ca4a 12742 if (intel_syntax)
52fd6d94
JB
12743 {
12744 switch (codep[-1])
12745 {
12746 case 0x6f: /* outsw/outsl */
12747 intel_operand_size (z_mode, sizeflag);
12748 break;
12749 case 0xa5: /* movsw/movsl/movsq */
12750 case 0xa7: /* cmpsw/cmpsl/cmpsq */
12751 case 0xad: /* lodsw/lodsl/lodsq */
12752 intel_operand_size (v_mode, sizeflag);
12753 break;
12754 default:
12755 intel_operand_size (b_mode, sizeflag);
12756 }
12757 }
285ca992
L
12758 /* Set active_seg_prefix to PREFIX_DS if it is unset so that the
12759 default segment register DS is printed. */
12760 if (!active_seg_prefix)
12761 active_seg_prefix = PREFIX_DS;
6608db57 12762 append_seg ();
252b5132
RH
12763 ptr_reg (code, sizeflag);
12764}
12765
252b5132 12766static void
26ca5450 12767OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 12768{
9b60702d 12769 int add;
161a04f6 12770 if (rex & REX_R)
c4a530c5 12771 {
161a04f6 12772 USED_REX (REX_R);
c4a530c5
JB
12773 add = 8;
12774 }
cb712a9e 12775 else if (address_mode != mode_64bit && (prefixes & PREFIX_LOCK))
c4a530c5 12776 {
f16cd0d5 12777 all_prefixes[last_lock_prefix] = 0;
c4a530c5
JB
12778 used_prefixes |= PREFIX_LOCK;
12779 add = 8;
12780 }
9b60702d
L
12781 else
12782 add = 0;
7967e09e 12783 sprintf (scratchbuf, "%%cr%d", modrm.reg + add);
9ce09ba2 12784 oappend_maybe_intel (scratchbuf);
252b5132
RH
12785}
12786
252b5132 12787static void
26ca5450 12788OP_D (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 12789{
9b60702d 12790 int add;
161a04f6
L
12791 USED_REX (REX_R);
12792 if (rex & REX_R)
52b15da3 12793 add = 8;
9b60702d
L
12794 else
12795 add = 0;
d708bcba 12796 if (intel_syntax)
7967e09e 12797 sprintf (scratchbuf, "db%d", modrm.reg + add);
d708bcba 12798 else
7967e09e 12799 sprintf (scratchbuf, "%%db%d", modrm.reg + add);
252b5132
RH
12800 oappend (scratchbuf);
12801}
12802
252b5132 12803static void
26ca5450 12804OP_T (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 12805{
7967e09e 12806 sprintf (scratchbuf, "%%tr%d", modrm.reg);
9ce09ba2 12807 oappend_maybe_intel (scratchbuf);
252b5132
RH
12808}
12809
12810static void
6f74c397 12811OP_R (int bytemode, int sizeflag)
252b5132 12812{
68f34464
L
12813 /* Skip mod/rm byte. */
12814 MODRM_CHECK;
12815 codep++;
12816 OP_E_register (bytemode, sizeflag);
252b5132
RH
12817}
12818
12819static void
26ca5450 12820OP_MMX (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 12821{
b9733481
L
12822 int reg = modrm.reg;
12823 const char **names;
12824
041bd2e0
JH
12825 used_prefixes |= (prefixes & PREFIX_DATA);
12826 if (prefixes & PREFIX_DATA)
20f0a1fc 12827 {
b9733481 12828 names = names_xmm;
161a04f6
L
12829 USED_REX (REX_R);
12830 if (rex & REX_R)
b9733481 12831 reg += 8;
20f0a1fc 12832 }
041bd2e0 12833 else
b9733481
L
12834 names = names_mm;
12835 oappend (names[reg]);
252b5132
RH
12836}
12837
c608c12e 12838static void
c0f3af97 12839OP_XMM (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
c608c12e 12840{
b9733481
L
12841 int reg = modrm.reg;
12842 const char **names;
12843
161a04f6
L
12844 USED_REX (REX_R);
12845 if (rex & REX_R)
b9733481 12846 reg += 8;
43234a1e
L
12847 if (vex.evex)
12848 {
12849 if (!vex.r)
12850 reg += 16;
12851 }
12852
539f890d
L
12853 if (need_vex
12854 && bytemode != xmm_mode
43234a1e
L
12855 && bytemode != xmmq_mode
12856 && bytemode != evex_half_bcst_xmmq_mode
12857 && bytemode != ymm_mode
260cd341 12858 && bytemode != tmm_mode
539f890d 12859 && bytemode != scalar_mode)
c0f3af97
L
12860 {
12861 switch (vex.length)
12862 {
12863 case 128:
b9733481 12864 names = names_xmm;
c0f3af97
L
12865 break;
12866 case 256:
5fc35d96
IT
12867 if (vex.w
12868 || (bytemode != vex_vsib_q_w_dq_mode
12869 && bytemode != vex_vsib_q_w_d_mode))
6c30d220
L
12870 names = names_ymm;
12871 else
12872 names = names_xmm;
c0f3af97 12873 break;
43234a1e
L
12874 case 512:
12875 names = names_zmm;
12876 break;
c0f3af97
L
12877 default:
12878 abort ();
12879 }
12880 }
43234a1e
L
12881 else if (bytemode == xmmq_mode
12882 || bytemode == evex_half_bcst_xmmq_mode)
12883 {
12884 switch (vex.length)
12885 {
12886 case 128:
12887 case 256:
12888 names = names_xmm;
12889 break;
12890 case 512:
12891 names = names_ymm;
12892 break;
12893 default:
12894 abort ();
12895 }
12896 }
260cd341
LC
12897 else if (bytemode == tmm_mode)
12898 {
12899 modrm.reg = reg;
12900 if (reg >= 8)
12901 {
12902 oappend ("(bad)");
12903 return;
12904 }
12905 names = names_tmm;
12906 }
43234a1e
L
12907 else if (bytemode == ymm_mode)
12908 names = names_ymm;
c0f3af97 12909 else
b9733481
L
12910 names = names_xmm;
12911 oappend (names[reg]);
c608c12e
AM
12912}
12913
252b5132 12914static void
26ca5450 12915OP_EM (int bytemode, int sizeflag)
252b5132 12916{
b9733481
L
12917 int reg;
12918 const char **names;
12919
7967e09e 12920 if (modrm.mod != 3)
252b5132 12921 {
b6169b20
L
12922 if (intel_syntax
12923 && (bytemode == v_mode || bytemode == v_swap_mode))
9306ca4a
JB
12924 {
12925 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
12926 used_prefixes |= (prefixes & PREFIX_DATA);
6c067bbb 12927 }
252b5132
RH
12928 OP_E (bytemode, sizeflag);
12929 return;
12930 }
12931
b6169b20
L
12932 if ((sizeflag & SUFFIX_ALWAYS) && bytemode == v_swap_mode)
12933 swap_operand ();
12934
6608db57 12935 /* Skip mod/rm byte. */
4bba6815 12936 MODRM_CHECK;
252b5132 12937 codep++;
041bd2e0 12938 used_prefixes |= (prefixes & PREFIX_DATA);
b9733481 12939 reg = modrm.rm;
041bd2e0 12940 if (prefixes & PREFIX_DATA)
20f0a1fc 12941 {
b9733481 12942 names = names_xmm;
161a04f6
L
12943 USED_REX (REX_B);
12944 if (rex & REX_B)
b9733481 12945 reg += 8;
20f0a1fc 12946 }
041bd2e0 12947 else
b9733481
L
12948 names = names_mm;
12949 oappend (names[reg]);
252b5132
RH
12950}
12951
246c51aa
L
12952/* cvt* are the only instructions in sse2 which have
12953 both SSE and MMX operands and also have 0x66 prefix
12954 in their opcode. 0x66 was originally used to differentiate
12955 between SSE and MMX instruction(operands). So we have to handle the
4d9567e0
MM
12956 cvt* separately using OP_EMC and OP_MXC */
12957static void
12958OP_EMC (int bytemode, int sizeflag)
12959{
7967e09e 12960 if (modrm.mod != 3)
4d9567e0
MM
12961 {
12962 if (intel_syntax && bytemode == v_mode)
12963 {
12964 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
12965 used_prefixes |= (prefixes & PREFIX_DATA);
6c067bbb 12966 }
4d9567e0
MM
12967 OP_E (bytemode, sizeflag);
12968 return;
12969 }
246c51aa 12970
4d9567e0
MM
12971 /* Skip mod/rm byte. */
12972 MODRM_CHECK;
12973 codep++;
12974 used_prefixes |= (prefixes & PREFIX_DATA);
b9733481 12975 oappend (names_mm[modrm.rm]);
4d9567e0
MM
12976}
12977
12978static void
12979OP_MXC (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12980{
12981 used_prefixes |= (prefixes & PREFIX_DATA);
b9733481 12982 oappend (names_mm[modrm.reg]);
4d9567e0
MM
12983}
12984
c608c12e 12985static void
26ca5450 12986OP_EX (int bytemode, int sizeflag)
c608c12e 12987{
b9733481
L
12988 int reg;
12989 const char **names;
d6f574e0
L
12990
12991 /* Skip mod/rm byte. */
12992 MODRM_CHECK;
12993 codep++;
12994
7967e09e 12995 if (modrm.mod != 3)
c608c12e 12996 {
c1e679ec 12997 OP_E_memory (bytemode, sizeflag);
c608c12e
AM
12998 return;
12999 }
d6f574e0 13000
b9733481 13001 reg = modrm.rm;
161a04f6
L
13002 USED_REX (REX_B);
13003 if (rex & REX_B)
b9733481 13004 reg += 8;
43234a1e
L
13005 if (vex.evex)
13006 {
13007 USED_REX (REX_X);
13008 if ((rex & REX_X))
13009 reg += 16;
13010 }
c608c12e 13011
b6169b20 13012 if ((sizeflag & SUFFIX_ALWAYS)
fa99fab2
L
13013 && (bytemode == x_swap_mode
13014 || bytemode == d_swap_mode
41f5efc6 13015 || bytemode == q_swap_mode))
b6169b20
L
13016 swap_operand ();
13017
c0f3af97
L
13018 if (need_vex
13019 && bytemode != xmm_mode
6c30d220
L
13020 && bytemode != xmmdw_mode
13021 && bytemode != xmmqd_mode
13022 && bytemode != xmm_mb_mode
13023 && bytemode != xmm_mw_mode
13024 && bytemode != xmm_md_mode
13025 && bytemode != xmm_mq_mode
539f890d 13026 && bytemode != xmmq_mode
43234a1e
L
13027 && bytemode != evex_half_bcst_xmmq_mode
13028 && bytemode != ymm_mode
260cd341 13029 && bytemode != tmm_mode
1c480963 13030 && bytemode != vex_scalar_w_dq_mode)
c0f3af97
L
13031 {
13032 switch (vex.length)
13033 {
13034 case 128:
b9733481 13035 names = names_xmm;
c0f3af97
L
13036 break;
13037 case 256:
b9733481 13038 names = names_ymm;
c0f3af97 13039 break;
43234a1e
L
13040 case 512:
13041 names = names_zmm;
13042 break;
c0f3af97
L
13043 default:
13044 abort ();
13045 }
13046 }
43234a1e
L
13047 else if (bytemode == xmmq_mode
13048 || bytemode == evex_half_bcst_xmmq_mode)
13049 {
13050 switch (vex.length)
13051 {
13052 case 128:
13053 case 256:
13054 names = names_xmm;
13055 break;
13056 case 512:
13057 names = names_ymm;
13058 break;
13059 default:
13060 abort ();
13061 }
13062 }
260cd341
LC
13063 else if (bytemode == tmm_mode)
13064 {
13065 modrm.rm = reg;
13066 if (reg >= 8)
13067 {
13068 oappend ("(bad)");
13069 return;
13070 }
13071 names = names_tmm;
13072 }
43234a1e
L
13073 else if (bytemode == ymm_mode)
13074 names = names_ymm;
c0f3af97 13075 else
b9733481
L
13076 names = names_xmm;
13077 oappend (names[reg]);
c608c12e
AM
13078}
13079
252b5132 13080static void
26ca5450 13081OP_MS (int bytemode, int sizeflag)
252b5132 13082{
7967e09e 13083 if (modrm.mod == 3)
2da11e11
AM
13084 OP_EM (bytemode, sizeflag);
13085 else
6608db57 13086 BadOp ();
252b5132
RH
13087}
13088
992aaec9 13089static void
26ca5450 13090OP_XS (int bytemode, int sizeflag)
992aaec9 13091{
7967e09e 13092 if (modrm.mod == 3)
992aaec9
AM
13093 OP_EX (bytemode, sizeflag);
13094 else
6608db57 13095 BadOp ();
992aaec9
AM
13096}
13097
cc0ec051
AM
13098static void
13099OP_M (int bytemode, int sizeflag)
13100{
7967e09e 13101 if (modrm.mod == 3)
75413a22
L
13102 /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
13103 BadOp ();
cc0ec051
AM
13104 else
13105 OP_E (bytemode, sizeflag);
13106}
13107
13108static void
13109OP_0f07 (int bytemode, int sizeflag)
13110{
7967e09e 13111 if (modrm.mod != 3 || modrm.rm != 0)
cc0ec051
AM
13112 BadOp ();
13113 else
13114 OP_E (bytemode, sizeflag);
13115}
13116
46e883c5 13117/* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
246c51aa 13118 32bit mode and "xchg %rax,%rax" in 64bit mode. */
46e883c5 13119
cc0ec051 13120static void
46e883c5 13121NOP_Fixup1 (int bytemode, int sizeflag)
cc0ec051 13122{
8b38ad71
L
13123 if ((prefixes & PREFIX_DATA) != 0
13124 || (rex != 0
13125 && rex != 0x48
13126 && address_mode == mode_64bit))
46e883c5
L
13127 OP_REG (bytemode, sizeflag);
13128 else
13129 strcpy (obuf, "nop");
13130}
13131
13132static void
13133NOP_Fixup2 (int bytemode, int sizeflag)
13134{
8b38ad71
L
13135 if ((prefixes & PREFIX_DATA) != 0
13136 || (rex != 0
13137 && rex != 0x48
13138 && address_mode == mode_64bit))
46e883c5 13139 OP_IMREG (bytemode, sizeflag);
cc0ec051
AM
13140}
13141
84037f8c 13142static const char *const Suffix3DNow[] = {
252b5132
RH
13143/* 00 */ NULL, NULL, NULL, NULL,
13144/* 04 */ NULL, NULL, NULL, NULL,
13145/* 08 */ NULL, NULL, NULL, NULL,
9e525108 13146/* 0C */ "pi2fw", "pi2fd", NULL, NULL,
252b5132
RH
13147/* 10 */ NULL, NULL, NULL, NULL,
13148/* 14 */ NULL, NULL, NULL, NULL,
13149/* 18 */ NULL, NULL, NULL, NULL,
9e525108 13150/* 1C */ "pf2iw", "pf2id", NULL, NULL,
252b5132
RH
13151/* 20 */ NULL, NULL, NULL, NULL,
13152/* 24 */ NULL, NULL, NULL, NULL,
13153/* 28 */ NULL, NULL, NULL, NULL,
13154/* 2C */ NULL, NULL, NULL, NULL,
13155/* 30 */ NULL, NULL, NULL, NULL,
13156/* 34 */ NULL, NULL, NULL, NULL,
13157/* 38 */ NULL, NULL, NULL, NULL,
13158/* 3C */ NULL, NULL, NULL, NULL,
13159/* 40 */ NULL, NULL, NULL, NULL,
13160/* 44 */ NULL, NULL, NULL, NULL,
13161/* 48 */ NULL, NULL, NULL, NULL,
13162/* 4C */ NULL, NULL, NULL, NULL,
13163/* 50 */ NULL, NULL, NULL, NULL,
13164/* 54 */ NULL, NULL, NULL, NULL,
13165/* 58 */ NULL, NULL, NULL, NULL,
13166/* 5C */ NULL, NULL, NULL, NULL,
13167/* 60 */ NULL, NULL, NULL, NULL,
13168/* 64 */ NULL, NULL, NULL, NULL,
13169/* 68 */ NULL, NULL, NULL, NULL,
13170/* 6C */ NULL, NULL, NULL, NULL,
13171/* 70 */ NULL, NULL, NULL, NULL,
13172/* 74 */ NULL, NULL, NULL, NULL,
13173/* 78 */ NULL, NULL, NULL, NULL,
13174/* 7C */ NULL, NULL, NULL, NULL,
13175/* 80 */ NULL, NULL, NULL, NULL,
13176/* 84 */ NULL, NULL, NULL, NULL,
9e525108
AM
13177/* 88 */ NULL, NULL, "pfnacc", NULL,
13178/* 8C */ NULL, NULL, "pfpnacc", NULL,
252b5132
RH
13179/* 90 */ "pfcmpge", NULL, NULL, NULL,
13180/* 94 */ "pfmin", NULL, "pfrcp", "pfrsqrt",
13181/* 98 */ NULL, NULL, "pfsub", NULL,
13182/* 9C */ NULL, NULL, "pfadd", NULL,
13183/* A0 */ "pfcmpgt", NULL, NULL, NULL,
13184/* A4 */ "pfmax", NULL, "pfrcpit1", "pfrsqit1",
13185/* A8 */ NULL, NULL, "pfsubr", NULL,
13186/* AC */ NULL, NULL, "pfacc", NULL,
13187/* B0 */ "pfcmpeq", NULL, NULL, NULL,
9beff690 13188/* B4 */ "pfmul", NULL, "pfrcpit2", "pmulhrw",
9e525108 13189/* B8 */ NULL, NULL, NULL, "pswapd",
252b5132
RH
13190/* BC */ NULL, NULL, NULL, "pavgusb",
13191/* C0 */ NULL, NULL, NULL, NULL,
13192/* C4 */ NULL, NULL, NULL, NULL,
13193/* C8 */ NULL, NULL, NULL, NULL,
13194/* CC */ NULL, NULL, NULL, NULL,
13195/* D0 */ NULL, NULL, NULL, NULL,
13196/* D4 */ NULL, NULL, NULL, NULL,
13197/* D8 */ NULL, NULL, NULL, NULL,
13198/* DC */ NULL, NULL, NULL, NULL,
13199/* E0 */ NULL, NULL, NULL, NULL,
13200/* E4 */ NULL, NULL, NULL, NULL,
13201/* E8 */ NULL, NULL, NULL, NULL,
13202/* EC */ NULL, NULL, NULL, NULL,
13203/* F0 */ NULL, NULL, NULL, NULL,
13204/* F4 */ NULL, NULL, NULL, NULL,
13205/* F8 */ NULL, NULL, NULL, NULL,
13206/* FC */ NULL, NULL, NULL, NULL,
13207};
13208
13209static void
26ca5450 13210OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132
RH
13211{
13212 const char *mnemonic;
13213
13214 FETCH_DATA (the_info, codep + 1);
13215 /* AMD 3DNow! instructions are specified by an opcode suffix in the
13216 place where an 8-bit immediate would normally go. ie. the last
13217 byte of the instruction. */
ea397f5b 13218 obufp = mnemonicendp;
c608c12e 13219 mnemonic = Suffix3DNow[*codep++ & 0xff];
252b5132 13220 if (mnemonic)
2da11e11 13221 oappend (mnemonic);
252b5132
RH
13222 else
13223 {
13224 /* Since a variable sized modrm/sib chunk is between the start
13225 of the opcode (0x0f0f) and the opcode suffix, we need to do
13226 all the modrm processing first, and don't know until now that
13227 we have a bad opcode. This necessitates some cleaning up. */
ce518a5f
L
13228 op_out[0][0] = '\0';
13229 op_out[1][0] = '\0';
6608db57 13230 BadOp ();
252b5132 13231 }
ea397f5b 13232 mnemonicendp = obufp;
252b5132 13233}
c608c12e 13234
c4de7606 13235static const struct op simd_cmp_op[] =
ea397f5b
L
13236{
13237 { STRING_COMMA_LEN ("eq") },
13238 { STRING_COMMA_LEN ("lt") },
13239 { STRING_COMMA_LEN ("le") },
13240 { STRING_COMMA_LEN ("unord") },
13241 { STRING_COMMA_LEN ("neq") },
13242 { STRING_COMMA_LEN ("nlt") },
13243 { STRING_COMMA_LEN ("nle") },
13244 { STRING_COMMA_LEN ("ord") }
c608c12e
AM
13245};
13246
c4de7606
JB
13247static const struct op vex_cmp_op[] =
13248{
13249 { STRING_COMMA_LEN ("eq_uq") },
13250 { STRING_COMMA_LEN ("nge") },
13251 { STRING_COMMA_LEN ("ngt") },
13252 { STRING_COMMA_LEN ("false") },
13253 { STRING_COMMA_LEN ("neq_oq") },
13254 { STRING_COMMA_LEN ("ge") },
13255 { STRING_COMMA_LEN ("gt") },
13256 { STRING_COMMA_LEN ("true") },
13257 { STRING_COMMA_LEN ("eq_os") },
13258 { STRING_COMMA_LEN ("lt_oq") },
13259 { STRING_COMMA_LEN ("le_oq") },
13260 { STRING_COMMA_LEN ("unord_s") },
13261 { STRING_COMMA_LEN ("neq_us") },
13262 { STRING_COMMA_LEN ("nlt_uq") },
13263 { STRING_COMMA_LEN ("nle_uq") },
13264 { STRING_COMMA_LEN ("ord_s") },
13265 { STRING_COMMA_LEN ("eq_us") },
13266 { STRING_COMMA_LEN ("nge_uq") },
13267 { STRING_COMMA_LEN ("ngt_uq") },
13268 { STRING_COMMA_LEN ("false_os") },
13269 { STRING_COMMA_LEN ("neq_os") },
13270 { STRING_COMMA_LEN ("ge_oq") },
13271 { STRING_COMMA_LEN ("gt_oq") },
13272 { STRING_COMMA_LEN ("true_us") },
13273};
13274
c608c12e 13275static void
ad19981d 13276CMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
c608c12e
AM
13277{
13278 unsigned int cmp_type;
13279
13280 FETCH_DATA (the_info, codep + 1);
13281 cmp_type = *codep++ & 0xff;
c0f3af97 13282 if (cmp_type < ARRAY_SIZE (simd_cmp_op))
c608c12e 13283 {
ad19981d 13284 char suffix [3];
ea397f5b 13285 char *p = mnemonicendp - 2;
ad19981d
L
13286 suffix[0] = p[0];
13287 suffix[1] = p[1];
13288 suffix[2] = '\0';
ea397f5b
L
13289 sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
13290 mnemonicendp += simd_cmp_op[cmp_type].len;
c608c12e 13291 }
c4de7606
JB
13292 else if (need_vex
13293 && cmp_type < ARRAY_SIZE (simd_cmp_op) + ARRAY_SIZE (vex_cmp_op))
13294 {
13295 char suffix [3];
13296 char *p = mnemonicendp - 2;
13297 suffix[0] = p[0];
13298 suffix[1] = p[1];
13299 suffix[2] = '\0';
13300 cmp_type -= ARRAY_SIZE (simd_cmp_op);
13301 sprintf (p, "%s%s", vex_cmp_op[cmp_type].name, suffix);
13302 mnemonicendp += vex_cmp_op[cmp_type].len;
13303 }
c608c12e
AM
13304 else
13305 {
ad19981d
L
13306 /* We have a reserved extension byte. Output it directly. */
13307 scratchbuf[0] = '$';
13308 print_operand_value (scratchbuf + 1, 1, cmp_type);
9ce09ba2 13309 oappend_maybe_intel (scratchbuf);
ad19981d 13310 scratchbuf[0] = '\0';
c608c12e
AM
13311 }
13312}
13313
9916071f 13314static void
7abb8d81 13315OP_Mwait (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
9916071f 13316{
7abb8d81 13317 /* mwait %eax,%ecx / mwaitx %eax,%ecx,%ebx */
b844680a
L
13318 if (!intel_syntax)
13319 {
081e283f
JB
13320 strcpy (op_out[0], names32[0]);
13321 strcpy (op_out[1], names32[1]);
7abb8d81 13322 if (bytemode == eBX_reg)
081e283f 13323 strcpy (op_out[2], names32[3]);
b844680a
L
13324 two_source_ops = 1;
13325 }
13326 /* Skip mod/rm byte. */
13327 MODRM_CHECK;
13328 codep++;
13329}
13330
13331static void
13332OP_Monitor (int bytemode ATTRIBUTE_UNUSED,
13333 int sizeflag ATTRIBUTE_UNUSED)
ca164297 13334{
081e283f 13335 /* monitor %{e,r,}ax,%ecx,%edx" */
b844680a 13336 if (!intel_syntax)
ca164297 13337 {
cb712a9e
L
13338 const char **names = (address_mode == mode_64bit
13339 ? names64 : names32);
1d9f512f 13340
081e283f 13341 if (prefixes & PREFIX_ADDR)
ca164297 13342 {
b844680a 13343 /* Remove "addr16/addr32". */
f16cd0d5 13344 all_prefixes[last_addr_prefix] = 0;
081e283f
JB
13345 names = (address_mode != mode_32bit
13346 ? names32 : names16);
b844680a 13347 used_prefixes |= PREFIX_ADDR;
ca164297 13348 }
081e283f
JB
13349 else if (address_mode == mode_16bit)
13350 names = names16;
13351 strcpy (op_out[0], names[0]);
13352 strcpy (op_out[1], names32[1]);
13353 strcpy (op_out[2], names32[2]);
b844680a 13354 two_source_ops = 1;
ca164297 13355 }
b844680a
L
13356 /* Skip mod/rm byte. */
13357 MODRM_CHECK;
13358 codep++;
30123838
JB
13359}
13360
6608db57
KH
13361static void
13362BadOp (void)
2da11e11 13363{
6608db57
KH
13364 /* Throw away prefixes and 1st. opcode byte. */
13365 codep = insn_codep + 1;
2da11e11
AM
13366 oappend ("(bad)");
13367}
4cc91dba 13368
35c52694
L
13369static void
13370REP_Fixup (int bytemode, int sizeflag)
13371{
13372 /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
13373 lods and stos. */
35c52694 13374 if (prefixes & PREFIX_REPZ)
f16cd0d5 13375 all_prefixes[last_repz_prefix] = REP_PREFIX;
35c52694
L
13376
13377 switch (bytemode)
13378 {
13379 case al_reg:
13380 case eAX_reg:
13381 case indir_dx_reg:
13382 OP_IMREG (bytemode, sizeflag);
13383 break;
13384 case eDI_reg:
13385 OP_ESreg (bytemode, sizeflag);
13386 break;
13387 case eSI_reg:
13388 OP_DSreg (bytemode, sizeflag);
13389 break;
13390 default:
13391 abort ();
13392 break;
13393 }
13394}
f5804c90 13395
d835a58b
JB
13396static void
13397SEP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13398{
13399 if ( isa64 != amd64 )
13400 return;
13401
13402 obufp = obuf;
13403 BadOp ();
13404 mnemonicendp = obufp;
13405 ++codep;
13406}
13407
7e8b059b
L
13408/* For BND-prefixed instructions 0xF2 prefix should be displayed as
13409 "bnd". */
13410
13411static void
13412BND_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13413{
13414 if (prefixes & PREFIX_REPNZ)
13415 all_prefixes[last_repnz_prefix] = BND_PREFIX;
13416}
13417
04ef582a
L
13418/* For NOTRACK-prefixed instructions, 0x3E prefix should be displayed as
13419 "notrack". */
13420
13421static void
13422NOTRACK_Fixup (int bytemode ATTRIBUTE_UNUSED,
13423 int sizeflag ATTRIBUTE_UNUSED)
13424{
9fef80d6 13425 if (active_seg_prefix == PREFIX_DS
04ef582a
L
13426 && (address_mode != mode_64bit || last_data_prefix < 0))
13427 {
4e9ac44a 13428 /* NOTRACK prefix is only valid on indirect branch instructions.
9fef80d6 13429 NB: DATA prefix is unsupported for Intel64. */
04ef582a
L
13430 active_seg_prefix = 0;
13431 all_prefixes[last_seg_prefix] = NOTRACK_PREFIX;
13432 }
13433}
13434
42164a71
L
13435/* Similar to OP_E. But the 0xf2/0xf3 prefixes should be displayed as
13436 "xacquire"/"xrelease" for memory operand if there is a LOCK prefix.
13437 */
13438
13439static void
13440HLE_Fixup1 (int bytemode, int sizeflag)
13441{
13442 if (modrm.mod != 3
13443 && (prefixes & PREFIX_LOCK) != 0)
13444 {
13445 if (prefixes & PREFIX_REPZ)
13446 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
13447 if (prefixes & PREFIX_REPNZ)
13448 all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
13449 }
13450
13451 OP_E (bytemode, sizeflag);
13452}
13453
13454/* Similar to OP_E. But the 0xf2/0xf3 prefixes should be displayed as
13455 "xacquire"/"xrelease" for memory operand. No check for LOCK prefix.
13456 */
13457
13458static void
13459HLE_Fixup2 (int bytemode, int sizeflag)
13460{
13461 if (modrm.mod != 3)
13462 {
13463 if (prefixes & PREFIX_REPZ)
13464 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
13465 if (prefixes & PREFIX_REPNZ)
13466 all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
13467 }
13468
13469 OP_E (bytemode, sizeflag);
13470}
13471
13472/* Similar to OP_E. But the 0xf3 prefixes should be displayed as
13473 "xrelease" for memory operand. No check for LOCK prefix. */
13474
13475static void
13476HLE_Fixup3 (int bytemode, int sizeflag)
13477{
13478 if (modrm.mod != 3
13479 && last_repz_prefix > last_repnz_prefix
13480 && (prefixes & PREFIX_REPZ) != 0)
13481 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
13482
13483 OP_E (bytemode, sizeflag);
13484}
13485
f5804c90
L
13486static void
13487CMPXCHG8B_Fixup (int bytemode, int sizeflag)
13488{
161a04f6
L
13489 USED_REX (REX_W);
13490 if (rex & REX_W)
f5804c90
L
13491 {
13492 /* Change cmpxchg8b to cmpxchg16b. */
ea397f5b
L
13493 char *p = mnemonicendp - 2;
13494 mnemonicendp = stpcpy (p, "16b");
fb9c77c7 13495 bytemode = o_mode;
f5804c90 13496 }
42164a71
L
13497 else if ((prefixes & PREFIX_LOCK) != 0)
13498 {
13499 if (prefixes & PREFIX_REPZ)
13500 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
13501 if (prefixes & PREFIX_REPNZ)
13502 all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
13503 }
13504
f5804c90
L
13505 OP_M (bytemode, sizeflag);
13506}
42903f7f
L
13507
13508static void
13509XMM_Fixup (int reg, int sizeflag ATTRIBUTE_UNUSED)
13510{
b9733481
L
13511 const char **names;
13512
c0f3af97
L
13513 if (need_vex)
13514 {
13515 switch (vex.length)
13516 {
13517 case 128:
b9733481 13518 names = names_xmm;
c0f3af97
L
13519 break;
13520 case 256:
b9733481 13521 names = names_ymm;
c0f3af97
L
13522 break;
13523 default:
13524 abort ();
13525 }
13526 }
13527 else
b9733481
L
13528 names = names_xmm;
13529 oappend (names[reg]);
42903f7f 13530}
381d071f
L
13531
13532static void
eacc9c89
L
13533FXSAVE_Fixup (int bytemode, int sizeflag)
13534{
13535 /* Add proper suffix to "fxsave" and "fxrstor". */
13536 USED_REX (REX_W);
13537 if (rex & REX_W)
13538 {
13539 char *p = mnemonicendp;
13540 *p++ = '6';
13541 *p++ = '4';
13542 *p = '\0';
13543 mnemonicendp = p;
13544 }
13545 OP_M (bytemode, sizeflag);
15c7c1d8
JB
13546}
13547
c0f3af97
L
13548/* Display the destination register operand for instructions with
13549 VEX. */
13550
13551static void
13552OP_VEX (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13553{
539f890d 13554 int reg;
b9733481
L
13555 const char **names;
13556
c0f3af97
L
13557 if (!need_vex)
13558 abort ();
13559
539f890d 13560 reg = vex.register_specifier;
63c6fc6c 13561 vex.register_specifier = 0;
5f847646
JB
13562 if (address_mode != mode_64bit)
13563 reg &= 7;
13564 else if (vex.evex && !vex.v)
13565 reg += 16;
43234a1e 13566
539f890d
L
13567 if (bytemode == vex_scalar_mode)
13568 {
13569 oappend (names_xmm[reg]);
13570 return;
13571 }
13572
260cd341
LC
13573 if (bytemode == tmm_mode)
13574 {
13575 /* All 3 TMM registers must be distinct. */
13576 if (reg >= 8)
13577 oappend ("(bad)");
13578 else
13579 {
13580 /* This must be the 3rd operand. */
13581 if (obufp != op_out[2])
13582 abort ();
13583 oappend (names_tmm[reg]);
13584 if (reg == modrm.reg || reg == modrm.rm)
13585 strcpy (obufp, "/(bad)");
13586 }
13587
13588 if (modrm.reg == modrm.rm || modrm.reg == reg || modrm.rm == reg)
13589 {
13590 if (modrm.reg <= 8
13591 && (modrm.reg == modrm.rm || modrm.reg == reg))
13592 strcat (op_out[0], "/(bad)");
13593 if (modrm.rm <= 8
13594 && (modrm.rm == modrm.reg || modrm.rm == reg))
13595 strcat (op_out[1], "/(bad)");
13596 }
13597
13598 return;
13599 }
13600
c0f3af97
L
13601 switch (vex.length)
13602 {
13603 case 128:
13604 switch (bytemode)
13605 {
13606 case vex_mode:
6c30d220 13607 case vex_vsib_q_w_dq_mode:
5fc35d96 13608 case vex_vsib_q_w_d_mode:
cb21baef
L
13609 names = names_xmm;
13610 break;
13611 case dq_mode:
390a6789 13612 if (rex & REX_W)
cb21baef
L
13613 names = names64;
13614 else
13615 names = names32;
c0f3af97 13616 break;
1ba585e8 13617 case mask_bd_mode:
43234a1e 13618 case mask_mode:
9889cbb1
L
13619 if (reg > 0x7)
13620 {
13621 oappend ("(bad)");
13622 return;
13623 }
43234a1e
L
13624 names = names_mask;
13625 break;
c0f3af97
L
13626 default:
13627 abort ();
13628 return;
13629 }
c0f3af97
L
13630 break;
13631 case 256:
13632 switch (bytemode)
13633 {
13634 case vex_mode:
6c30d220
L
13635 names = names_ymm;
13636 break;
13637 case vex_vsib_q_w_dq_mode:
5fc35d96 13638 case vex_vsib_q_w_d_mode:
6c30d220 13639 names = vex.w ? names_ymm : names_xmm;
c0f3af97 13640 break;
1ba585e8 13641 case mask_bd_mode:
43234a1e 13642 case mask_mode:
9889cbb1
L
13643 if (reg > 0x7)
13644 {
13645 oappend ("(bad)");
13646 return;
13647 }
43234a1e
L
13648 names = names_mask;
13649 break;
c0f3af97 13650 default:
a37a2806
NC
13651 /* See PR binutils/20893 for a reproducer. */
13652 oappend ("(bad)");
c0f3af97
L
13653 return;
13654 }
c0f3af97 13655 break;
43234a1e
L
13656 case 512:
13657 names = names_zmm;
13658 break;
c0f3af97
L
13659 default:
13660 abort ();
13661 break;
13662 }
539f890d 13663 oappend (names[reg]);
c0f3af97
L
13664}
13665
41f5efc6
JB
13666static void
13667OP_VexR (int bytemode, int sizeflag)
13668{
13669 if (modrm.mod == 3)
13670 OP_VEX (bytemode, sizeflag);
13671}
13672
5dd85c99 13673static void
e6123d0c 13674OP_VexW (int bytemode, int sizeflag)
5dd85c99 13675{
e6123d0c 13676 OP_VEX (bytemode, sizeflag);
5dd85c99 13677
5dd85c99 13678 if (vex.w)
5f847646 13679 {
e6123d0c
JB
13680 /* Swap 2nd and 3rd operands. */
13681 strcpy (scratchbuf, op_out[2]);
13682 strcpy (op_out[2], op_out[1]);
13683 strcpy (op_out[1], scratchbuf);
5f847646 13684 }
5dd85c99
SP
13685}
13686
c0f3af97
L
13687static void
13688OP_REG_VexI4 (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13689{
13690 int reg;
6384fd9e 13691 const char **names = names_xmm;
b9733481 13692
c0f3af97
L
13693 FETCH_DATA (the_info, codep + 1);
13694 reg = *codep++;
13695
6384fd9e 13696 if (bytemode != x_mode && bytemode != scalar_mode)
c0f3af97
L
13697 abort ();
13698
c0f3af97 13699 reg >>= 4;
5f847646
JB
13700 if (address_mode != mode_64bit)
13701 reg &= 7;
dae39acc 13702
6384fd9e
JB
13703 if (bytemode == x_mode && vex.length == 256)
13704 names = names_ymm;
13705
b9733481 13706 oappend (names[reg]);
b13b1bc0
JB
13707
13708 if (vex.w)
13709 {
13710 /* Swap 3rd and 4th operands. */
13711 strcpy (scratchbuf, op_out[3]);
13712 strcpy (op_out[3], op_out[2]);
13713 strcpy (op_out[2], scratchbuf);
13714 }
c0f3af97
L
13715}
13716
922d8de8 13717static void
93abb146
JB
13718OP_VexI4 (int bytemode ATTRIBUTE_UNUSED,
13719 int sizeflag ATTRIBUTE_UNUSED)
922d8de8 13720{
93abb146
JB
13721 scratchbuf[0] = '$';
13722 print_operand_value (scratchbuf + 1, 1, codep[-1] & 0xf);
13723 oappend_maybe_intel (scratchbuf);
922d8de8
DR
13724}
13725
43234a1e
L
13726static void
13727VPCMP_Fixup (int bytemode ATTRIBUTE_UNUSED,
13728 int sizeflag ATTRIBUTE_UNUSED)
13729{
13730 unsigned int cmp_type;
13731
13732 if (!vex.evex)
13733 abort ();
13734
13735 FETCH_DATA (the_info, codep + 1);
13736 cmp_type = *codep++ & 0xff;
13737 /* There are aliases for immediates 0, 1, 2, 4, 5, 6.
13738 If it's the case, print suffix, otherwise - print the immediate. */
13739 if (cmp_type < ARRAY_SIZE (simd_cmp_op)
13740 && cmp_type != 3
13741 && cmp_type != 7)
13742 {
13743 char suffix [3];
13744 char *p = mnemonicendp - 2;
13745
13746 /* vpcmp* can have both one- and two-lettered suffix. */
13747 if (p[0] == 'p')
13748 {
13749 p++;
13750 suffix[0] = p[0];
13751 suffix[1] = '\0';
13752 }
13753 else
13754 {
13755 suffix[0] = p[0];
13756 suffix[1] = p[1];
13757 suffix[2] = '\0';
13758 }
13759
13760 sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
13761 mnemonicendp += simd_cmp_op[cmp_type].len;
13762 }
be92cb14
JB
13763 else
13764 {
13765 /* We have a reserved extension byte. Output it directly. */
13766 scratchbuf[0] = '$';
13767 print_operand_value (scratchbuf + 1, 1, cmp_type);
13768 oappend_maybe_intel (scratchbuf);
13769 scratchbuf[0] = '\0';
13770 }
13771}
13772
13773static const struct op xop_cmp_op[] =
13774{
13775 { STRING_COMMA_LEN ("lt") },
13776 { STRING_COMMA_LEN ("le") },
13777 { STRING_COMMA_LEN ("gt") },
13778 { STRING_COMMA_LEN ("ge") },
13779 { STRING_COMMA_LEN ("eq") },
13780 { STRING_COMMA_LEN ("neq") },
13781 { STRING_COMMA_LEN ("false") },
13782 { STRING_COMMA_LEN ("true") }
13783};
13784
13785static void
13786VPCOM_Fixup (int bytemode ATTRIBUTE_UNUSED,
13787 int sizeflag ATTRIBUTE_UNUSED)
13788{
13789 unsigned int cmp_type;
13790
13791 FETCH_DATA (the_info, codep + 1);
13792 cmp_type = *codep++ & 0xff;
13793 if (cmp_type < ARRAY_SIZE (xop_cmp_op))
13794 {
13795 char suffix[3];
13796 char *p = mnemonicendp - 2;
13797
13798 /* vpcom* can have both one- and two-lettered suffix. */
13799 if (p[0] == 'm')
13800 {
13801 p++;
13802 suffix[0] = p[0];
13803 suffix[1] = '\0';
13804 }
13805 else
13806 {
13807 suffix[0] = p[0];
13808 suffix[1] = p[1];
13809 suffix[2] = '\0';
13810 }
13811
13812 sprintf (p, "%s%s", xop_cmp_op[cmp_type].name, suffix);
13813 mnemonicendp += xop_cmp_op[cmp_type].len;
13814 }
43234a1e
L
13815 else
13816 {
13817 /* We have a reserved extension byte. Output it directly. */
13818 scratchbuf[0] = '$';
13819 print_operand_value (scratchbuf + 1, 1, cmp_type);
9ce09ba2 13820 oappend_maybe_intel (scratchbuf);
43234a1e
L
13821 scratchbuf[0] = '\0';
13822 }
13823}
13824
ea397f5b
L
13825static const struct op pclmul_op[] =
13826{
13827 { STRING_COMMA_LEN ("lql") },
13828 { STRING_COMMA_LEN ("hql") },
13829 { STRING_COMMA_LEN ("lqh") },
13830 { STRING_COMMA_LEN ("hqh") }
c0f3af97
L
13831};
13832
13833static void
13834PCLMUL_Fixup (int bytemode ATTRIBUTE_UNUSED,
13835 int sizeflag ATTRIBUTE_UNUSED)
13836{
13837 unsigned int pclmul_type;
13838
13839 FETCH_DATA (the_info, codep + 1);
13840 pclmul_type = *codep++ & 0xff;
13841 switch (pclmul_type)
13842 {
13843 case 0x10:
13844 pclmul_type = 2;
13845 break;
13846 case 0x11:
13847 pclmul_type = 3;
13848 break;
13849 default:
13850 break;
7bb15c6f 13851 }
c0f3af97
L
13852 if (pclmul_type < ARRAY_SIZE (pclmul_op))
13853 {
13854 char suffix [4];
ea397f5b 13855 char *p = mnemonicendp - 3;
c0f3af97
L
13856 suffix[0] = p[0];
13857 suffix[1] = p[1];
13858 suffix[2] = p[2];
13859 suffix[3] = '\0';
ea397f5b
L
13860 sprintf (p, "%s%s", pclmul_op[pclmul_type].name, suffix);
13861 mnemonicendp += pclmul_op[pclmul_type].len;
c0f3af97
L
13862 }
13863 else
13864 {
13865 /* We have a reserved extension byte. Output it directly. */
13866 scratchbuf[0] = '$';
13867 print_operand_value (scratchbuf + 1, 1, pclmul_type);
9ce09ba2 13868 oappend_maybe_intel (scratchbuf);
c0f3af97
L
13869 scratchbuf[0] = '\0';
13870 }
13871}
13872
bc31405e
L
13873static void
13874MOVSXD_Fixup (int bytemode, int sizeflag)
13875{
13876 /* Add proper suffix to "movsxd". */
13877 char *p = mnemonicendp;
13878
13879 switch (bytemode)
13880 {
13881 case movsxd_mode:
13882 if (intel_syntax)
13883 {
13884 *p++ = 'x';
13885 *p++ = 'd';
13886 goto skip;
13887 }
13888
13889 USED_REX (REX_W);
13890 if (rex & REX_W)
13891 {
13892 *p++ = 'l';
13893 *p++ = 'q';
13894 }
13895 else
13896 {
13897 *p++ = 'x';
13898 *p++ = 'd';
13899 }
13900 break;
13901 default:
13902 oappend (INTERNAL_DISASSEMBLER_ERROR);
13903 break;
13904 }
13905
dc1e8a47 13906 skip:
bc31405e
L
13907 mnemonicendp = p;
13908 *p = '\0';
13909 OP_E (bytemode, sizeflag);
13910}
13911
43234a1e
L
13912static void
13913OP_Mask (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13914{
13915 if (!vex.evex
1ba585e8 13916 || (bytemode != mask_mode && bytemode != mask_bd_mode))
43234a1e
L
13917 abort ();
13918
13919 USED_REX (REX_R);
13920 if ((rex & REX_R) != 0 || !vex.r)
13921 {
13922 BadOp ();
13923 return;
13924 }
13925
13926 oappend (names_mask [modrm.reg]);
13927}
13928
13929static void
13930OP_Rounding (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13931{
43234a1e
L
13932 if (modrm.mod == 3 && vex.b)
13933 switch (bytemode)
13934 {
70df6fc9
L
13935 case evex_rounding_64_mode:
13936 if (address_mode != mode_64bit)
13937 {
13938 oappend ("(bad)");
13939 break;
13940 }
13941 /* Fall through. */
43234a1e
L
13942 case evex_rounding_mode:
13943 oappend (names_rounding[vex.ll]);
13944 break;
13945 case evex_sae_mode:
13946 oappend ("{sae}");
13947 break;
13948 default:
6df22cf6 13949 abort ();
43234a1e
L
13950 break;
13951 }
13952}
This page took 4.961237 seconds and 4 git commands to generate.