]> Git Repo - binutils.git/blame - opcodes/i386-dis.c
[gdb/testsuite] Fix clone-new-thread-event.c with glibc 2.30
[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,
c0a30a9f 812 MOD_0F38F9_PREFIX_0,
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,
897 MOD_VEX_0F3A30_L_0_W_0,
898 MOD_VEX_0F3A30_L_0_W_1,
899 MOD_VEX_0F3A31_L_0_W_0,
900 MOD_VEX_0F3A31_L_0_W_1,
901 MOD_VEX_0F3A32_L_0_W_0,
902 MOD_VEX_0F3A32_L_0_W_1,
903 MOD_VEX_0F3A33_L_0_W_0,
904 MOD_VEX_0F3A33_L_0_W_1,
43234a1e 905
467bbef0
JB
906 MOD_VEX_0FXOP_09_12,
907
43234a1e 908 MOD_EVEX_0F12_PREFIX_0,
97e6786a
JB
909 MOD_EVEX_0F12_PREFIX_2,
910 MOD_EVEX_0F13,
43234a1e 911 MOD_EVEX_0F16_PREFIX_0,
97e6786a
JB
912 MOD_EVEX_0F16_PREFIX_2,
913 MOD_EVEX_0F17,
914 MOD_EVEX_0F2B,
7531c613
JB
915 MOD_EVEX_0F381A_W_0,
916 MOD_EVEX_0F381A_W_1,
917 MOD_EVEX_0F381B_W_0,
918 MOD_EVEX_0F381B_W_1,
919 MOD_EVEX_0F385A_W_0,
920 MOD_EVEX_0F385A_W_1,
921 MOD_EVEX_0F385B_W_0,
922 MOD_EVEX_0F385B_W_1,
43234a1e
L
923 MOD_EVEX_0F38C6_REG_1,
924 MOD_EVEX_0F38C6_REG_2,
925 MOD_EVEX_0F38C6_REG_5,
926 MOD_EVEX_0F38C6_REG_6,
927 MOD_EVEX_0F38C7_REG_1,
928 MOD_EVEX_0F38C7_REG_2,
929 MOD_EVEX_0F38C7_REG_5,
930 MOD_EVEX_0F38C7_REG_6
51e7da1b 931};
1ceb70f8 932
51e7da1b
L
933enum
934{
42164a71
L
935 RM_C6_REG_7 = 0,
936 RM_C7_REG_7,
937 RM_0F01_REG_0,
3873ba12
L
938 RM_0F01_REG_1,
939 RM_0F01_REG_2,
940 RM_0F01_REG_3,
f8687e93
JB
941 RM_0F01_REG_5_MOD_3,
942 RM_0F01_REG_7_MOD_3,
943 RM_0F1E_P_1_MOD_3_REG_7,
944 RM_0FAE_REG_6_MOD_3_P_0,
945 RM_0FAE_REG_7_MOD_3,
260cd341 946 RM_VEX_0F3849_X86_64_P_0_W_0_M_1_R_0
51e7da1b 947};
1ceb70f8 948
51e7da1b
L
949enum
950{
951 PREFIX_90 = 0,
a847e322 952 PREFIX_0F01_REG_3_RM_1,
f8687e93
JB
953 PREFIX_0F01_REG_5_MOD_0,
954 PREFIX_0F01_REG_5_MOD_3_RM_0,
bb651e8b 955 PREFIX_0F01_REG_5_MOD_3_RM_1,
f8687e93 956 PREFIX_0F01_REG_5_MOD_3_RM_2,
267b8516
JB
957 PREFIX_0F01_REG_7_MOD_3_RM_2,
958 PREFIX_0F01_REG_7_MOD_3_RM_3,
3233d7d0 959 PREFIX_0F09,
3873ba12
L
960 PREFIX_0F10,
961 PREFIX_0F11,
962 PREFIX_0F12,
963 PREFIX_0F16,
7e8b059b
L
964 PREFIX_0F1A,
965 PREFIX_0F1B,
c48935d7 966 PREFIX_0F1C,
603555e5 967 PREFIX_0F1E,
3873ba12
L
968 PREFIX_0F2A,
969 PREFIX_0F2B,
970 PREFIX_0F2C,
971 PREFIX_0F2D,
972 PREFIX_0F2E,
973 PREFIX_0F2F,
974 PREFIX_0F51,
975 PREFIX_0F52,
976 PREFIX_0F53,
977 PREFIX_0F58,
978 PREFIX_0F59,
979 PREFIX_0F5A,
980 PREFIX_0F5B,
981 PREFIX_0F5C,
982 PREFIX_0F5D,
983 PREFIX_0F5E,
984 PREFIX_0F5F,
985 PREFIX_0F60,
986 PREFIX_0F61,
987 PREFIX_0F62,
3873ba12
L
988 PREFIX_0F6F,
989 PREFIX_0F70,
3873ba12
L
990 PREFIX_0F78,
991 PREFIX_0F79,
992 PREFIX_0F7C,
993 PREFIX_0F7D,
994 PREFIX_0F7E,
995 PREFIX_0F7F,
f8687e93
JB
996 PREFIX_0FAE_REG_0_MOD_3,
997 PREFIX_0FAE_REG_1_MOD_3,
998 PREFIX_0FAE_REG_2_MOD_3,
999 PREFIX_0FAE_REG_3_MOD_3,
1000 PREFIX_0FAE_REG_4_MOD_0,
1001 PREFIX_0FAE_REG_4_MOD_3,
1002 PREFIX_0FAE_REG_5_MOD_0,
1003 PREFIX_0FAE_REG_5_MOD_3,
1004 PREFIX_0FAE_REG_6_MOD_0,
1005 PREFIX_0FAE_REG_6_MOD_3,
1006 PREFIX_0FAE_REG_7_MOD_0,
3873ba12 1007 PREFIX_0FB8,
f12dc422 1008 PREFIX_0FBC,
3873ba12
L
1009 PREFIX_0FBD,
1010 PREFIX_0FC2,
f8687e93
JB
1011 PREFIX_0FC3_MOD_0,
1012 PREFIX_0FC7_REG_6_MOD_0,
1013 PREFIX_0FC7_REG_6_MOD_3,
1014 PREFIX_0FC7_REG_7_MOD_3,
3873ba12
L
1015 PREFIX_0FD0,
1016 PREFIX_0FD6,
1017 PREFIX_0FE6,
1018 PREFIX_0FE7,
1019 PREFIX_0FF0,
1020 PREFIX_0FF7,
a0046408
L
1021 PREFIX_0F38C8,
1022 PREFIX_0F38C9,
1023 PREFIX_0F38CA,
1024 PREFIX_0F38CB,
1025 PREFIX_0F38CC,
1026 PREFIX_0F38CD,
3873ba12
L
1027 PREFIX_0F38F0,
1028 PREFIX_0F38F1,
e2e1fcde 1029 PREFIX_0F38F6,
c0a30a9f
L
1030 PREFIX_0F38F8,
1031 PREFIX_0F38F9,
a0046408 1032 PREFIX_0F3ACC,
592a252b
L
1033 PREFIX_VEX_0F10,
1034 PREFIX_VEX_0F11,
1035 PREFIX_VEX_0F12,
1036 PREFIX_VEX_0F16,
1037 PREFIX_VEX_0F2A,
1038 PREFIX_VEX_0F2C,
1039 PREFIX_VEX_0F2D,
1040 PREFIX_VEX_0F2E,
1041 PREFIX_VEX_0F2F,
43234a1e
L
1042 PREFIX_VEX_0F41,
1043 PREFIX_VEX_0F42,
1044 PREFIX_VEX_0F44,
1045 PREFIX_VEX_0F45,
1046 PREFIX_VEX_0F46,
1047 PREFIX_VEX_0F47,
1ba585e8 1048 PREFIX_VEX_0F4A,
43234a1e 1049 PREFIX_VEX_0F4B,
592a252b
L
1050 PREFIX_VEX_0F51,
1051 PREFIX_VEX_0F52,
1052 PREFIX_VEX_0F53,
1053 PREFIX_VEX_0F58,
1054 PREFIX_VEX_0F59,
1055 PREFIX_VEX_0F5A,
1056 PREFIX_VEX_0F5B,
1057 PREFIX_VEX_0F5C,
1058 PREFIX_VEX_0F5D,
1059 PREFIX_VEX_0F5E,
1060 PREFIX_VEX_0F5F,
592a252b
L
1061 PREFIX_VEX_0F6F,
1062 PREFIX_VEX_0F70,
592a252b
L
1063 PREFIX_VEX_0F77,
1064 PREFIX_VEX_0F7C,
1065 PREFIX_VEX_0F7D,
1066 PREFIX_VEX_0F7E,
1067 PREFIX_VEX_0F7F,
43234a1e
L
1068 PREFIX_VEX_0F90,
1069 PREFIX_VEX_0F91,
1070 PREFIX_VEX_0F92,
1071 PREFIX_VEX_0F93,
1072 PREFIX_VEX_0F98,
1ba585e8 1073 PREFIX_VEX_0F99,
592a252b 1074 PREFIX_VEX_0FC2,
592a252b 1075 PREFIX_VEX_0FD0,
592a252b 1076 PREFIX_VEX_0FE6,
592a252b 1077 PREFIX_VEX_0FF0,
260cd341
LC
1078 PREFIX_VEX_0F3849_X86_64,
1079 PREFIX_VEX_0F384B_X86_64,
260cd341
LC
1080 PREFIX_VEX_0F385C_X86_64,
1081 PREFIX_VEX_0F385E_X86_64,
f12dc422
L
1082 PREFIX_VEX_0F38F2,
1083 PREFIX_VEX_0F38F3_REG_1,
1084 PREFIX_VEX_0F38F3_REG_2,
1085 PREFIX_VEX_0F38F3_REG_3,
6c30d220
L
1086 PREFIX_VEX_0F38F5,
1087 PREFIX_VEX_0F38F6,
f12dc422 1088 PREFIX_VEX_0F38F7,
43234a1e
L
1089 PREFIX_VEX_0F3AF0,
1090
1091 PREFIX_EVEX_0F10,
1092 PREFIX_EVEX_0F11,
1093 PREFIX_EVEX_0F12,
43234a1e 1094 PREFIX_EVEX_0F16,
43234a1e 1095 PREFIX_EVEX_0F2A,
43234a1e
L
1096 PREFIX_EVEX_0F51,
1097 PREFIX_EVEX_0F58,
1098 PREFIX_EVEX_0F59,
1099 PREFIX_EVEX_0F5A,
1100 PREFIX_EVEX_0F5B,
1101 PREFIX_EVEX_0F5C,
1102 PREFIX_EVEX_0F5D,
1103 PREFIX_EVEX_0F5E,
1104 PREFIX_EVEX_0F5F,
43234a1e
L
1105 PREFIX_EVEX_0F6F,
1106 PREFIX_EVEX_0F70,
43234a1e
L
1107 PREFIX_EVEX_0F78,
1108 PREFIX_EVEX_0F79,
1109 PREFIX_EVEX_0F7A,
1110 PREFIX_EVEX_0F7B,
1111 PREFIX_EVEX_0F7E,
1112 PREFIX_EVEX_0F7F,
1113 PREFIX_EVEX_0FC2,
43234a1e 1114 PREFIX_EVEX_0FE6,
1ba585e8 1115 PREFIX_EVEX_0F3810,
43234a1e
L
1116 PREFIX_EVEX_0F3811,
1117 PREFIX_EVEX_0F3812,
1118 PREFIX_EVEX_0F3813,
1119 PREFIX_EVEX_0F3814,
1120 PREFIX_EVEX_0F3815,
1ba585e8 1121 PREFIX_EVEX_0F3820,
43234a1e
L
1122 PREFIX_EVEX_0F3821,
1123 PREFIX_EVEX_0F3822,
1124 PREFIX_EVEX_0F3823,
1125 PREFIX_EVEX_0F3824,
1126 PREFIX_EVEX_0F3825,
1ba585e8 1127 PREFIX_EVEX_0F3826,
43234a1e
L
1128 PREFIX_EVEX_0F3827,
1129 PREFIX_EVEX_0F3828,
1130 PREFIX_EVEX_0F3829,
1131 PREFIX_EVEX_0F382A,
1ba585e8 1132 PREFIX_EVEX_0F3830,
43234a1e
L
1133 PREFIX_EVEX_0F3831,
1134 PREFIX_EVEX_0F3832,
1135 PREFIX_EVEX_0F3833,
1136 PREFIX_EVEX_0F3834,
1137 PREFIX_EVEX_0F3835,
1ba585e8 1138 PREFIX_EVEX_0F3838,
43234a1e
L
1139 PREFIX_EVEX_0F3839,
1140 PREFIX_EVEX_0F383A,
47acf0bd
IT
1141 PREFIX_EVEX_0F3852,
1142 PREFIX_EVEX_0F3853,
9186c494 1143 PREFIX_EVEX_0F3868,
53467f57 1144 PREFIX_EVEX_0F3872,
43234a1e
L
1145 PREFIX_EVEX_0F389A,
1146 PREFIX_EVEX_0F389B,
43234a1e
L
1147 PREFIX_EVEX_0F38AA,
1148 PREFIX_EVEX_0F38AB,
51e7da1b 1149};
4e7d34a6 1150
51e7da1b
L
1151enum
1152{
1153 X86_64_06 = 0,
3873ba12 1154 X86_64_07,
1673df32 1155 X86_64_0E,
3873ba12
L
1156 X86_64_16,
1157 X86_64_17,
1158 X86_64_1E,
1159 X86_64_1F,
1160 X86_64_27,
1161 X86_64_2F,
1162 X86_64_37,
1163 X86_64_3F,
1164 X86_64_60,
1165 X86_64_61,
1166 X86_64_62,
1167 X86_64_63,
1168 X86_64_6D,
1169 X86_64_6F,
d039fef3 1170 X86_64_82,
3873ba12 1171 X86_64_9A,
aeab2b26
JB
1172 X86_64_C2,
1173 X86_64_C3,
3873ba12
L
1174 X86_64_C4,
1175 X86_64_C5,
1176 X86_64_CE,
1177 X86_64_D4,
1178 X86_64_D5,
a72d2af2
L
1179 X86_64_E8,
1180 X86_64_E9,
3873ba12
L
1181 X86_64_EA,
1182 X86_64_0F01_REG_0,
1183 X86_64_0F01_REG_1,
1184 X86_64_0F01_REG_2,
260cd341
LC
1185 X86_64_0F01_REG_3,
1186 X86_64_VEX_0F3849,
1187 X86_64_VEX_0F384B,
1188 X86_64_VEX_0F385C,
1189 X86_64_VEX_0F385E
51e7da1b 1190};
4e7d34a6 1191
51e7da1b
L
1192enum
1193{
1194 THREE_BYTE_0F38 = 0,
1f334aeb 1195 THREE_BYTE_0F3A
51e7da1b 1196};
4e7d34a6 1197
f88c9eb0
SP
1198enum
1199{
5dd85c99
SP
1200 XOP_08 = 0,
1201 XOP_09,
f88c9eb0
SP
1202 XOP_0A
1203};
1204
51e7da1b
L
1205enum
1206{
1207 VEX_0F = 0,
3873ba12
L
1208 VEX_0F38,
1209 VEX_0F3A
51e7da1b 1210};
c0f3af97 1211
43234a1e
L
1212enum
1213{
1214 EVEX_0F = 0,
1215 EVEX_0F38,
1216 EVEX_0F3A
1217};
1218
51e7da1b
L
1219enum
1220{
ec6f095a 1221 VEX_LEN_0F12_P_0_M_0 = 0,
592a252b 1222 VEX_LEN_0F12_P_0_M_1,
18897deb 1223#define VEX_LEN_0F12_P_2_M_0 VEX_LEN_0F12_P_0_M_0
592a252b
L
1224 VEX_LEN_0F13_M_0,
1225 VEX_LEN_0F16_P_0_M_0,
1226 VEX_LEN_0F16_P_0_M_1,
18897deb 1227#define VEX_LEN_0F16_P_2_M_0 VEX_LEN_0F16_P_0_M_0
592a252b 1228 VEX_LEN_0F17_M_0,
43234a1e 1229 VEX_LEN_0F41_P_0,
1ba585e8 1230 VEX_LEN_0F41_P_2,
43234a1e 1231 VEX_LEN_0F42_P_0,
1ba585e8 1232 VEX_LEN_0F42_P_2,
43234a1e 1233 VEX_LEN_0F44_P_0,
1ba585e8 1234 VEX_LEN_0F44_P_2,
43234a1e 1235 VEX_LEN_0F45_P_0,
1ba585e8 1236 VEX_LEN_0F45_P_2,
43234a1e 1237 VEX_LEN_0F46_P_0,
1ba585e8 1238 VEX_LEN_0F46_P_2,
43234a1e 1239 VEX_LEN_0F47_P_0,
1ba585e8
IT
1240 VEX_LEN_0F47_P_2,
1241 VEX_LEN_0F4A_P_0,
1242 VEX_LEN_0F4A_P_2,
1243 VEX_LEN_0F4B_P_0,
43234a1e 1244 VEX_LEN_0F4B_P_2,
7531c613 1245 VEX_LEN_0F6E,
ec6f095a 1246 VEX_LEN_0F77_P_0,
592a252b
L
1247 VEX_LEN_0F7E_P_1,
1248 VEX_LEN_0F7E_P_2,
43234a1e 1249 VEX_LEN_0F90_P_0,
1ba585e8 1250 VEX_LEN_0F90_P_2,
43234a1e 1251 VEX_LEN_0F91_P_0,
1ba585e8 1252 VEX_LEN_0F91_P_2,
43234a1e 1253 VEX_LEN_0F92_P_0,
90a915bf 1254 VEX_LEN_0F92_P_2,
1ba585e8 1255 VEX_LEN_0F92_P_3,
43234a1e 1256 VEX_LEN_0F93_P_0,
90a915bf 1257 VEX_LEN_0F93_P_2,
1ba585e8 1258 VEX_LEN_0F93_P_3,
43234a1e 1259 VEX_LEN_0F98_P_0,
1ba585e8
IT
1260 VEX_LEN_0F98_P_2,
1261 VEX_LEN_0F99_P_0,
1262 VEX_LEN_0F99_P_2,
592a252b
L
1263 VEX_LEN_0FAE_R_2_M_0,
1264 VEX_LEN_0FAE_R_3_M_0,
7531c613
JB
1265 VEX_LEN_0FC4,
1266 VEX_LEN_0FC5,
1267 VEX_LEN_0FD6,
1268 VEX_LEN_0FF7,
1269 VEX_LEN_0F3816,
1270 VEX_LEN_0F3819,
1271 VEX_LEN_0F381A_M_0,
1272 VEX_LEN_0F3836,
1273 VEX_LEN_0F3841,
260cd341
LC
1274 VEX_LEN_0F3849_X86_64_P_0_W_0_M_0,
1275 VEX_LEN_0F3849_X86_64_P_0_W_0_M_1_REG_0_RM_0,
1276 VEX_LEN_0F3849_X86_64_P_2_W_0_M_0,
1277 VEX_LEN_0F3849_X86_64_P_3_W_0_M_0,
1278 VEX_LEN_0F384B_X86_64_P_1_W_0_M_0,
1279 VEX_LEN_0F384B_X86_64_P_2_W_0_M_0,
1280 VEX_LEN_0F384B_X86_64_P_3_W_0_M_0,
7531c613 1281 VEX_LEN_0F385A_M_0,
260cd341
LC
1282 VEX_LEN_0F385C_X86_64_P_1_W_0_M_0,
1283 VEX_LEN_0F385E_X86_64_P_0_W_0_M_0,
1284 VEX_LEN_0F385E_X86_64_P_1_W_0_M_0,
1285 VEX_LEN_0F385E_X86_64_P_2_W_0_M_0,
1286 VEX_LEN_0F385E_X86_64_P_3_W_0_M_0,
7531c613 1287 VEX_LEN_0F38DB,
f12dc422
L
1288 VEX_LEN_0F38F2_P_0,
1289 VEX_LEN_0F38F3_R_1_P_0,
1290 VEX_LEN_0F38F3_R_2_P_0,
1291 VEX_LEN_0F38F3_R_3_P_0,
6c30d220
L
1292 VEX_LEN_0F38F5_P_0,
1293 VEX_LEN_0F38F5_P_1,
1294 VEX_LEN_0F38F5_P_3,
1295 VEX_LEN_0F38F6_P_3,
f12dc422 1296 VEX_LEN_0F38F7_P_0,
6c30d220
L
1297 VEX_LEN_0F38F7_P_1,
1298 VEX_LEN_0F38F7_P_2,
1299 VEX_LEN_0F38F7_P_3,
7531c613
JB
1300 VEX_LEN_0F3A00,
1301 VEX_LEN_0F3A01,
1302 VEX_LEN_0F3A06,
1303 VEX_LEN_0F3A14,
1304 VEX_LEN_0F3A15,
1305 VEX_LEN_0F3A16,
1306 VEX_LEN_0F3A17,
1307 VEX_LEN_0F3A18,
1308 VEX_LEN_0F3A19,
1309 VEX_LEN_0F3A20,
1310 VEX_LEN_0F3A21,
1311 VEX_LEN_0F3A22,
1312 VEX_LEN_0F3A30,
1313 VEX_LEN_0F3A31,
1314 VEX_LEN_0F3A32,
1315 VEX_LEN_0F3A33,
1316 VEX_LEN_0F3A38,
1317 VEX_LEN_0F3A39,
1318 VEX_LEN_0F3A41,
1319 VEX_LEN_0F3A46,
1320 VEX_LEN_0F3A60,
1321 VEX_LEN_0F3A61,
1322 VEX_LEN_0F3A62,
1323 VEX_LEN_0F3A63,
1324 VEX_LEN_0F3ADF,
6c30d220 1325 VEX_LEN_0F3AF0_P_3,
467bbef0
JB
1326 VEX_LEN_0FXOP_08_85,
1327 VEX_LEN_0FXOP_08_86,
1328 VEX_LEN_0FXOP_08_87,
1329 VEX_LEN_0FXOP_08_8E,
1330 VEX_LEN_0FXOP_08_8F,
1331 VEX_LEN_0FXOP_08_95,
1332 VEX_LEN_0FXOP_08_96,
1333 VEX_LEN_0FXOP_08_97,
1334 VEX_LEN_0FXOP_08_9E,
1335 VEX_LEN_0FXOP_08_9F,
1336 VEX_LEN_0FXOP_08_A3,
1337 VEX_LEN_0FXOP_08_A6,
1338 VEX_LEN_0FXOP_08_B6,
1339 VEX_LEN_0FXOP_08_C0,
1340 VEX_LEN_0FXOP_08_C1,
1341 VEX_LEN_0FXOP_08_C2,
1342 VEX_LEN_0FXOP_08_C3,
ff688e1f
L
1343 VEX_LEN_0FXOP_08_CC,
1344 VEX_LEN_0FXOP_08_CD,
1345 VEX_LEN_0FXOP_08_CE,
1346 VEX_LEN_0FXOP_08_CF,
1347 VEX_LEN_0FXOP_08_EC,
1348 VEX_LEN_0FXOP_08_ED,
1349 VEX_LEN_0FXOP_08_EE,
1350 VEX_LEN_0FXOP_08_EF,
467bbef0
JB
1351 VEX_LEN_0FXOP_09_01,
1352 VEX_LEN_0FXOP_09_02,
1353 VEX_LEN_0FXOP_09_12_M_1,
b5b098c2
JB
1354 VEX_LEN_0FXOP_09_82_W_0,
1355 VEX_LEN_0FXOP_09_83_W_0,
467bbef0
JB
1356 VEX_LEN_0FXOP_09_90,
1357 VEX_LEN_0FXOP_09_91,
1358 VEX_LEN_0FXOP_09_92,
1359 VEX_LEN_0FXOP_09_93,
1360 VEX_LEN_0FXOP_09_94,
1361 VEX_LEN_0FXOP_09_95,
1362 VEX_LEN_0FXOP_09_96,
1363 VEX_LEN_0FXOP_09_97,
1364 VEX_LEN_0FXOP_09_98,
1365 VEX_LEN_0FXOP_09_99,
1366 VEX_LEN_0FXOP_09_9A,
1367 VEX_LEN_0FXOP_09_9B,
1368 VEX_LEN_0FXOP_09_C1,
1369 VEX_LEN_0FXOP_09_C2,
1370 VEX_LEN_0FXOP_09_C3,
1371 VEX_LEN_0FXOP_09_C6,
1372 VEX_LEN_0FXOP_09_C7,
1373 VEX_LEN_0FXOP_09_CB,
1374 VEX_LEN_0FXOP_09_D1,
1375 VEX_LEN_0FXOP_09_D2,
1376 VEX_LEN_0FXOP_09_D3,
1377 VEX_LEN_0FXOP_09_D6,
1378 VEX_LEN_0FXOP_09_D7,
1379 VEX_LEN_0FXOP_09_DB,
1380 VEX_LEN_0FXOP_09_E1,
1381 VEX_LEN_0FXOP_09_E2,
1382 VEX_LEN_0FXOP_09_E3,
1383 VEX_LEN_0FXOP_0A_12,
51e7da1b 1384};
c0f3af97 1385
04e2a182
L
1386enum
1387{
7531c613 1388 EVEX_LEN_0F6E = 0,
04e2a182
L
1389 EVEX_LEN_0F7E_P_1,
1390 EVEX_LEN_0F7E_P_2,
7531c613
JB
1391 EVEX_LEN_0FC4,
1392 EVEX_LEN_0FC5,
1393 EVEX_LEN_0FD6,
1394 EVEX_LEN_0F3816,
1395 EVEX_LEN_0F3819_W_0,
1396 EVEX_LEN_0F3819_W_1,
1397 EVEX_LEN_0F381A_W_0_M_0,
1398 EVEX_LEN_0F381A_W_1_M_0,
1399 EVEX_LEN_0F381B_W_0_M_0,
1400 EVEX_LEN_0F381B_W_1_M_0,
1401 EVEX_LEN_0F3836,
1402 EVEX_LEN_0F385A_W_0_M_0,
1403 EVEX_LEN_0F385A_W_1_M_0,
1404 EVEX_LEN_0F385B_W_0_M_0,
1405 EVEX_LEN_0F385B_W_1_M_0,
1406 EVEX_LEN_0F38C6_R_1_M_0,
1407 EVEX_LEN_0F38C6_R_2_M_0,
1408 EVEX_LEN_0F38C6_R_5_M_0,
1409 EVEX_LEN_0F38C6_R_6_M_0,
1410 EVEX_LEN_0F38C7_R_1_M_0_W_0,
1411 EVEX_LEN_0F38C7_R_1_M_0_W_1,
1412 EVEX_LEN_0F38C7_R_2_M_0_W_0,
1413 EVEX_LEN_0F38C7_R_2_M_0_W_1,
1414 EVEX_LEN_0F38C7_R_5_M_0_W_0,
1415 EVEX_LEN_0F38C7_R_5_M_0_W_1,
1416 EVEX_LEN_0F38C7_R_6_M_0_W_0,
1417 EVEX_LEN_0F38C7_R_6_M_0_W_1,
1418 EVEX_LEN_0F3A00_W_1,
1419 EVEX_LEN_0F3A01_W_1,
1420 EVEX_LEN_0F3A14,
1421 EVEX_LEN_0F3A15,
1422 EVEX_LEN_0F3A16,
1423 EVEX_LEN_0F3A17,
1424 EVEX_LEN_0F3A18_W_0,
1425 EVEX_LEN_0F3A18_W_1,
1426 EVEX_LEN_0F3A19_W_0,
1427 EVEX_LEN_0F3A19_W_1,
1428 EVEX_LEN_0F3A1A_W_0,
1429 EVEX_LEN_0F3A1A_W_1,
1430 EVEX_LEN_0F3A1B_W_0,
1431 EVEX_LEN_0F3A1B_W_1,
1432 EVEX_LEN_0F3A20,
1433 EVEX_LEN_0F3A21_W_0,
1434 EVEX_LEN_0F3A22,
1435 EVEX_LEN_0F3A23_W_0,
1436 EVEX_LEN_0F3A23_W_1,
1437 EVEX_LEN_0F3A38_W_0,
1438 EVEX_LEN_0F3A38_W_1,
1439 EVEX_LEN_0F3A39_W_0,
1440 EVEX_LEN_0F3A39_W_1,
1441 EVEX_LEN_0F3A3A_W_0,
1442 EVEX_LEN_0F3A3A_W_1,
1443 EVEX_LEN_0F3A3B_W_0,
1444 EVEX_LEN_0F3A3B_W_1,
1445 EVEX_LEN_0F3A43_W_0,
1446 EVEX_LEN_0F3A43_W_1
04e2a182
L
1447};
1448
9e30b8e0
L
1449enum
1450{
ec6f095a 1451 VEX_W_0F41_P_0_LEN_1 = 0,
1ba585e8 1452 VEX_W_0F41_P_2_LEN_1,
43234a1e 1453 VEX_W_0F42_P_0_LEN_1,
1ba585e8 1454 VEX_W_0F42_P_2_LEN_1,
43234a1e 1455 VEX_W_0F44_P_0_LEN_0,
1ba585e8 1456 VEX_W_0F44_P_2_LEN_0,
43234a1e 1457 VEX_W_0F45_P_0_LEN_1,
1ba585e8 1458 VEX_W_0F45_P_2_LEN_1,
43234a1e 1459 VEX_W_0F46_P_0_LEN_1,
1ba585e8 1460 VEX_W_0F46_P_2_LEN_1,
43234a1e 1461 VEX_W_0F47_P_0_LEN_1,
1ba585e8
IT
1462 VEX_W_0F47_P_2_LEN_1,
1463 VEX_W_0F4A_P_0_LEN_1,
1464 VEX_W_0F4A_P_2_LEN_1,
1465 VEX_W_0F4B_P_0_LEN_1,
43234a1e 1466 VEX_W_0F4B_P_2_LEN_1,
43234a1e 1467 VEX_W_0F90_P_0_LEN_0,
1ba585e8 1468 VEX_W_0F90_P_2_LEN_0,
43234a1e 1469 VEX_W_0F91_P_0_LEN_0,
1ba585e8 1470 VEX_W_0F91_P_2_LEN_0,
43234a1e 1471 VEX_W_0F92_P_0_LEN_0,
90a915bf 1472 VEX_W_0F92_P_2_LEN_0,
43234a1e 1473 VEX_W_0F93_P_0_LEN_0,
90a915bf 1474 VEX_W_0F93_P_2_LEN_0,
43234a1e 1475 VEX_W_0F98_P_0_LEN_0,
1ba585e8
IT
1476 VEX_W_0F98_P_2_LEN_0,
1477 VEX_W_0F99_P_0_LEN_0,
1478 VEX_W_0F99_P_2_LEN_0,
7531c613
JB
1479 VEX_W_0F380C,
1480 VEX_W_0F380D,
1481 VEX_W_0F380E,
1482 VEX_W_0F380F,
1483 VEX_W_0F3813,
1484 VEX_W_0F3816_L_1,
1485 VEX_W_0F3818,
1486 VEX_W_0F3819_L_1,
1487 VEX_W_0F381A_M_0_L_1,
1488 VEX_W_0F382C_M_0,
1489 VEX_W_0F382D_M_0,
1490 VEX_W_0F382E_M_0,
1491 VEX_W_0F382F_M_0,
1492 VEX_W_0F3836,
1493 VEX_W_0F3846,
260cd341
LC
1494 VEX_W_0F3849_X86_64_P_0,
1495 VEX_W_0F3849_X86_64_P_2,
1496 VEX_W_0F3849_X86_64_P_3,
1497 VEX_W_0F384B_X86_64_P_1,
1498 VEX_W_0F384B_X86_64_P_2,
1499 VEX_W_0F384B_X86_64_P_3,
7531c613
JB
1500 VEX_W_0F3858,
1501 VEX_W_0F3859,
1502 VEX_W_0F385A_M_0_L_0,
260cd341
LC
1503 VEX_W_0F385C_X86_64_P_1,
1504 VEX_W_0F385E_X86_64_P_0,
1505 VEX_W_0F385E_X86_64_P_1,
1506 VEX_W_0F385E_X86_64_P_2,
1507 VEX_W_0F385E_X86_64_P_3,
7531c613
JB
1508 VEX_W_0F3878,
1509 VEX_W_0F3879,
1510 VEX_W_0F38CF,
1511 VEX_W_0F3A00_L_1,
1512 VEX_W_0F3A01_L_1,
1513 VEX_W_0F3A02,
1514 VEX_W_0F3A04,
1515 VEX_W_0F3A05,
1516 VEX_W_0F3A06_L_1,
1517 VEX_W_0F3A18_L_1,
1518 VEX_W_0F3A19_L_1,
1519 VEX_W_0F3A1D,
1520 VEX_W_0F3A30_L_0,
1521 VEX_W_0F3A31_L_0,
1522 VEX_W_0F3A32_L_0,
1523 VEX_W_0F3A33_L_0,
1524 VEX_W_0F3A38_L_1,
1525 VEX_W_0F3A39_L_1,
1526 VEX_W_0F3A46_L_1,
1527 VEX_W_0F3A4A,
1528 VEX_W_0F3A4B,
1529 VEX_W_0F3A4C,
1530 VEX_W_0F3ACE,
1531 VEX_W_0F3ACF,
43234a1e 1532
467bbef0
JB
1533 VEX_W_0FXOP_08_85_L_0,
1534 VEX_W_0FXOP_08_86_L_0,
1535 VEX_W_0FXOP_08_87_L_0,
1536 VEX_W_0FXOP_08_8E_L_0,
1537 VEX_W_0FXOP_08_8F_L_0,
1538 VEX_W_0FXOP_08_95_L_0,
1539 VEX_W_0FXOP_08_96_L_0,
1540 VEX_W_0FXOP_08_97_L_0,
1541 VEX_W_0FXOP_08_9E_L_0,
1542 VEX_W_0FXOP_08_9F_L_0,
1543 VEX_W_0FXOP_08_A6_L_0,
1544 VEX_W_0FXOP_08_B6_L_0,
1545 VEX_W_0FXOP_08_C0_L_0,
1546 VEX_W_0FXOP_08_C1_L_0,
1547 VEX_W_0FXOP_08_C2_L_0,
1548 VEX_W_0FXOP_08_C3_L_0,
1549 VEX_W_0FXOP_08_CC_L_0,
1550 VEX_W_0FXOP_08_CD_L_0,
1551 VEX_W_0FXOP_08_CE_L_0,
1552 VEX_W_0FXOP_08_CF_L_0,
1553 VEX_W_0FXOP_08_EC_L_0,
1554 VEX_W_0FXOP_08_ED_L_0,
1555 VEX_W_0FXOP_08_EE_L_0,
1556 VEX_W_0FXOP_08_EF_L_0,
1557
b5b098c2
JB
1558 VEX_W_0FXOP_09_80,
1559 VEX_W_0FXOP_09_81,
1560 VEX_W_0FXOP_09_82,
1561 VEX_W_0FXOP_09_83,
467bbef0
JB
1562 VEX_W_0FXOP_09_C1_L_0,
1563 VEX_W_0FXOP_09_C2_L_0,
1564 VEX_W_0FXOP_09_C3_L_0,
1565 VEX_W_0FXOP_09_C6_L_0,
1566 VEX_W_0FXOP_09_C7_L_0,
1567 VEX_W_0FXOP_09_CB_L_0,
1568 VEX_W_0FXOP_09_D1_L_0,
1569 VEX_W_0FXOP_09_D2_L_0,
1570 VEX_W_0FXOP_09_D3_L_0,
1571 VEX_W_0FXOP_09_D6_L_0,
1572 VEX_W_0FXOP_09_D7_L_0,
1573 VEX_W_0FXOP_09_DB_L_0,
1574 VEX_W_0FXOP_09_E1_L_0,
1575 VEX_W_0FXOP_09_E2_L_0,
1576 VEX_W_0FXOP_09_E3_L_0,
b5b098c2 1577
36cc073e 1578 EVEX_W_0F10_P_1,
36cc073e 1579 EVEX_W_0F10_P_3,
36cc073e 1580 EVEX_W_0F11_P_1,
36cc073e 1581 EVEX_W_0F11_P_3,
43234a1e
L
1582 EVEX_W_0F12_P_0_M_1,
1583 EVEX_W_0F12_P_1,
43234a1e 1584 EVEX_W_0F12_P_3,
43234a1e
L
1585 EVEX_W_0F16_P_0_M_1,
1586 EVEX_W_0F16_P_1,
43234a1e 1587 EVEX_W_0F2A_P_3,
43234a1e 1588 EVEX_W_0F51_P_1,
43234a1e 1589 EVEX_W_0F51_P_3,
43234a1e 1590 EVEX_W_0F58_P_1,
43234a1e 1591 EVEX_W_0F58_P_3,
43234a1e 1592 EVEX_W_0F59_P_1,
43234a1e
L
1593 EVEX_W_0F59_P_3,
1594 EVEX_W_0F5A_P_0,
1595 EVEX_W_0F5A_P_1,
1596 EVEX_W_0F5A_P_2,
1597 EVEX_W_0F5A_P_3,
1598 EVEX_W_0F5B_P_0,
1599 EVEX_W_0F5B_P_1,
1600 EVEX_W_0F5B_P_2,
43234a1e 1601 EVEX_W_0F5C_P_1,
43234a1e 1602 EVEX_W_0F5C_P_3,
43234a1e 1603 EVEX_W_0F5D_P_1,
43234a1e 1604 EVEX_W_0F5D_P_3,
43234a1e 1605 EVEX_W_0F5E_P_1,
43234a1e 1606 EVEX_W_0F5E_P_3,
43234a1e 1607 EVEX_W_0F5F_P_1,
43234a1e 1608 EVEX_W_0F5F_P_3,
fedfb81e 1609 EVEX_W_0F62,
7531c613 1610 EVEX_W_0F66,
fedfb81e
JB
1611 EVEX_W_0F6A,
1612 EVEX_W_0F6B,
1613 EVEX_W_0F6C,
1614 EVEX_W_0F6D,
43234a1e
L
1615 EVEX_W_0F6F_P_1,
1616 EVEX_W_0F6F_P_2,
1ba585e8 1617 EVEX_W_0F6F_P_3,
43234a1e 1618 EVEX_W_0F70_P_2,
7531c613
JB
1619 EVEX_W_0F72_R_2,
1620 EVEX_W_0F72_R_6,
1621 EVEX_W_0F73_R_2,
1622 EVEX_W_0F73_R_6,
1623 EVEX_W_0F76,
43234a1e 1624 EVEX_W_0F78_P_0,
90a915bf 1625 EVEX_W_0F78_P_2,
43234a1e 1626 EVEX_W_0F79_P_0,
90a915bf 1627 EVEX_W_0F79_P_2,
43234a1e 1628 EVEX_W_0F7A_P_1,
90a915bf 1629 EVEX_W_0F7A_P_2,
43234a1e 1630 EVEX_W_0F7A_P_3,
90a915bf 1631 EVEX_W_0F7B_P_2,
43234a1e
L
1632 EVEX_W_0F7B_P_3,
1633 EVEX_W_0F7E_P_1,
43234a1e
L
1634 EVEX_W_0F7F_P_1,
1635 EVEX_W_0F7F_P_2,
1ba585e8 1636 EVEX_W_0F7F_P_3,
43234a1e 1637 EVEX_W_0FC2_P_1,
43234a1e 1638 EVEX_W_0FC2_P_3,
fedfb81e
JB
1639 EVEX_W_0FD2,
1640 EVEX_W_0FD3,
1641 EVEX_W_0FD4,
7531c613 1642 EVEX_W_0FD6_L_0,
43234a1e
L
1643 EVEX_W_0FE6_P_1,
1644 EVEX_W_0FE6_P_2,
1645 EVEX_W_0FE6_P_3,
7531c613 1646 EVEX_W_0FE7,
fedfb81e
JB
1647 EVEX_W_0FF2,
1648 EVEX_W_0FF3,
1649 EVEX_W_0FF4,
1650 EVEX_W_0FFA,
1651 EVEX_W_0FFB,
1652 EVEX_W_0FFE,
7531c613 1653 EVEX_W_0F380D,
1ba585e8
IT
1654 EVEX_W_0F3810_P_1,
1655 EVEX_W_0F3810_P_2,
43234a1e 1656 EVEX_W_0F3811_P_1,
1ba585e8 1657 EVEX_W_0F3811_P_2,
43234a1e 1658 EVEX_W_0F3812_P_1,
1ba585e8 1659 EVEX_W_0F3812_P_2,
43234a1e
L
1660 EVEX_W_0F3813_P_1,
1661 EVEX_W_0F3813_P_2,
1662 EVEX_W_0F3814_P_1,
1663 EVEX_W_0F3815_P_1,
7531c613
JB
1664 EVEX_W_0F3819,
1665 EVEX_W_0F381A,
1666 EVEX_W_0F381B,
1667 EVEX_W_0F381E,
1668 EVEX_W_0F381F,
1ba585e8 1669 EVEX_W_0F3820_P_1,
43234a1e
L
1670 EVEX_W_0F3821_P_1,
1671 EVEX_W_0F3822_P_1,
1672 EVEX_W_0F3823_P_1,
1673 EVEX_W_0F3824_P_1,
1674 EVEX_W_0F3825_P_1,
1675 EVEX_W_0F3825_P_2,
1676 EVEX_W_0F3828_P_2,
1677 EVEX_W_0F3829_P_2,
1678 EVEX_W_0F382A_P_1,
1679 EVEX_W_0F382A_P_2,
fedfb81e 1680 EVEX_W_0F382B,
1ba585e8 1681 EVEX_W_0F3830_P_1,
43234a1e
L
1682 EVEX_W_0F3831_P_1,
1683 EVEX_W_0F3832_P_1,
1684 EVEX_W_0F3833_P_1,
1685 EVEX_W_0F3834_P_1,
1686 EVEX_W_0F3835_P_1,
1687 EVEX_W_0F3835_P_2,
7531c613 1688 EVEX_W_0F3837,
43234a1e 1689 EVEX_W_0F383A_P_1,
d6aab7a1 1690 EVEX_W_0F3852_P_1,
7531c613
JB
1691 EVEX_W_0F3859,
1692 EVEX_W_0F385A,
1693 EVEX_W_0F385B,
1694 EVEX_W_0F3870,
d6aab7a1 1695 EVEX_W_0F3872_P_1,
53467f57 1696 EVEX_W_0F3872_P_2,
d6aab7a1 1697 EVEX_W_0F3872_P_3,
7531c613
JB
1698 EVEX_W_0F387A,
1699 EVEX_W_0F387B,
1700 EVEX_W_0F3883,
1701 EVEX_W_0F3891,
1702 EVEX_W_0F3893,
1703 EVEX_W_0F38A1,
1704 EVEX_W_0F38A3,
1705 EVEX_W_0F38C7_R_1_M_0,
1706 EVEX_W_0F38C7_R_2_M_0,
1707 EVEX_W_0F38C7_R_5_M_0,
1708 EVEX_W_0F38C7_R_6_M_0,
1709
1710 EVEX_W_0F3A00,
1711 EVEX_W_0F3A01,
1712 EVEX_W_0F3A05,
1713 EVEX_W_0F3A08,
1714 EVEX_W_0F3A09,
1715 EVEX_W_0F3A0A,
1716 EVEX_W_0F3A0B,
1717 EVEX_W_0F3A18,
1718 EVEX_W_0F3A19,
1719 EVEX_W_0F3A1A,
1720 EVEX_W_0F3A1B,
1721 EVEX_W_0F3A21,
1722 EVEX_W_0F3A23,
1723 EVEX_W_0F3A38,
1724 EVEX_W_0F3A39,
1725 EVEX_W_0F3A3A,
1726 EVEX_W_0F3A3B,
1727 EVEX_W_0F3A42,
1728 EVEX_W_0F3A43,
1729 EVEX_W_0F3A70,
1730 EVEX_W_0F3A72,
9e30b8e0
L
1731};
1732
26ca5450 1733typedef void (*op_rtn) (int bytemode, int sizeflag);
252b5132
RH
1734
1735struct dis386 {
2da11e11 1736 const char *name;
ce518a5f
L
1737 struct
1738 {
1739 op_rtn rtn;
1740 int bytemode;
1741 } op[MAX_OPERANDS];
bf890a93 1742 unsigned int prefix_requirement;
252b5132
RH
1743};
1744
1745/* Upper case letters in the instruction names here are macros.
1746 'A' => print 'b' if no register operands or suffix_always is true
1747 'B' => print 'b' if suffix_always is true
9306ca4a 1748 'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
98b528ac 1749 size prefix
ed7841b3 1750 'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
98b528ac 1751 suffix_always is true
252b5132 1752 'E' => print 'e' if 32-bit form of jcxz
3ffd33cf 1753 'F' => print 'w' or 'l' depending on address size prefix (loop insns)
52fd6d94 1754 'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
5dd0794d 1755 'H' => print ",pt" or ",pn" branch hint
d1c36125 1756 'I' unused.
8f570d62 1757 'J' unused.
42903f7f 1758 'K' => print 'd' or 'q' if rex prefix is present.
252b5132 1759 'L' => print 'l' if suffix_always is true
9d141669 1760 'M' => print 'r' if intel_mnemonic is false.
252b5132 1761 'N' => print 'n' if instruction has no wait "prefix"
a35ca55a 1762 'O' => print 'd' or 'o' (or 'q' in Intel mode)
52b15da3 1763 'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix,
98b528ac
L
1764 or suffix_always is true. print 'q' if rex prefix is present.
1765 'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
1766 is true
a35ca55a 1767 'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
52b15da3 1768 'S' => print 'w', 'l' or 'q' if suffix_always is true
a72d2af2
L
1769 'T' => print 'q' in 64bit mode if instruction has no operand size
1770 prefix and behave as 'P' otherwise
1771 'U' => print 'q' in 64bit mode if instruction has no operand size
1772 prefix and behave as 'Q' otherwise
1773 'V' => print 'q' in 64bit mode if instruction has no operand size
1774 prefix and behave as 'S' otherwise
a35ca55a 1775 'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
9306ca4a 1776 'X' => print 's', 'd' depending on data16 prefix (for XMM)
9646c87b 1777 'Y' unused.
6dd5059a 1778 'Z' => print 'q' in 64bit mode and behave as 'L' otherwise
9d141669 1779 '!' => change condition from true to false or from false to true.
98b528ac 1780 '%' => add 1 upper case letter to the macro.
5990e377
JB
1781 '^' => print 'w', 'l', or 'q' (Intel64 ISA only) depending on operand size
1782 prefix or suffix_always is true (lcall/ljmp).
5db04b09
L
1783 '@' => print 'q' for Intel64 ISA, 'w' or 'q' for AMD64 ISA depending
1784 on operand size prefix.
07f5af7d
L
1785 '&' => print 'q' in 64bit mode for Intel64 ISA or if instruction
1786 has no operand size prefix for AMD64 ISA, behave as 'P'
1787 otherwise
98b528ac
L
1788
1789 2 upper case letter macros:
04d824a4
JB
1790 "XY" => print 'x' or 'y' if suffix_always is true or no register
1791 operands and no broadcast.
1792 "XZ" => print 'x', 'y', or 'z' if suffix_always is true or no
1793 register operands and no broadcast.
4b06377f 1794 "XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
b24d668c
JB
1795 "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand, cond
1796 being false, or no operand at all in 64bit mode, or if suffix_always
589958d6 1797 is true.
4b06377f
L
1798 "LB" => print "abs" in 64bit mode and behave as 'B' otherwise
1799 "LS" => print "abs" in 64bit mode and behave as 'S' otherwise
1800 "LV" => print "abs" for 64bit operand and behave as 'S' otherwise
492a76aa 1801 "DQ" => print 'd' or 'q' depending on the VEX.W bit
931452b6 1802 "BW" => print 'b' or 'w' depending on the EVEX.W bit
4b4c407a
L
1803 "LP" => print 'w' or 'l' ('d' in Intel mode) if instruction has
1804 an operand size prefix, or suffix_always is true. print
1805 'q' if rex prefix is present.
52b15da3 1806
6439fc28
AM
1807 Many of the above letters print nothing in Intel mode. See "putop"
1808 for the details.
52b15da3 1809
6439fc28 1810 Braces '{' and '}', and vertical bars '|', indicate alternative
7c52e0e8 1811 mnemonic strings for AT&T and Intel. */
252b5132 1812
6439fc28 1813static const struct dis386 dis386[] = {
252b5132 1814 /* 00 */
bf890a93
IT
1815 { "addB", { Ebh1, Gb }, 0 },
1816 { "addS", { Evh1, Gv }, 0 },
1817 { "addB", { Gb, EbS }, 0 },
1818 { "addS", { Gv, EvS }, 0 },
1819 { "addB", { AL, Ib }, 0 },
1820 { "addS", { eAX, Iv }, 0 },
4e7d34a6
L
1821 { X86_64_TABLE (X86_64_06) },
1822 { X86_64_TABLE (X86_64_07) },
252b5132 1823 /* 08 */
bf890a93
IT
1824 { "orB", { Ebh1, Gb }, 0 },
1825 { "orS", { Evh1, Gv }, 0 },
1826 { "orB", { Gb, EbS }, 0 },
1827 { "orS", { Gv, EvS }, 0 },
1828 { "orB", { AL, Ib }, 0 },
1829 { "orS", { eAX, Iv }, 0 },
1673df32 1830 { X86_64_TABLE (X86_64_0E) },
592d1631 1831 { Bad_Opcode }, /* 0x0f extended opcode escape */
252b5132 1832 /* 10 */
bf890a93
IT
1833 { "adcB", { Ebh1, Gb }, 0 },
1834 { "adcS", { Evh1, Gv }, 0 },
1835 { "adcB", { Gb, EbS }, 0 },
1836 { "adcS", { Gv, EvS }, 0 },
1837 { "adcB", { AL, Ib }, 0 },
1838 { "adcS", { eAX, Iv }, 0 },
4e7d34a6
L
1839 { X86_64_TABLE (X86_64_16) },
1840 { X86_64_TABLE (X86_64_17) },
252b5132 1841 /* 18 */
bf890a93
IT
1842 { "sbbB", { Ebh1, Gb }, 0 },
1843 { "sbbS", { Evh1, Gv }, 0 },
1844 { "sbbB", { Gb, EbS }, 0 },
1845 { "sbbS", { Gv, EvS }, 0 },
1846 { "sbbB", { AL, Ib }, 0 },
1847 { "sbbS", { eAX, Iv }, 0 },
4e7d34a6
L
1848 { X86_64_TABLE (X86_64_1E) },
1849 { X86_64_TABLE (X86_64_1F) },
252b5132 1850 /* 20 */
bf890a93
IT
1851 { "andB", { Ebh1, Gb }, 0 },
1852 { "andS", { Evh1, Gv }, 0 },
1853 { "andB", { Gb, EbS }, 0 },
1854 { "andS", { Gv, EvS }, 0 },
1855 { "andB", { AL, Ib }, 0 },
1856 { "andS", { eAX, Iv }, 0 },
592d1631 1857 { Bad_Opcode }, /* SEG ES prefix */
4e7d34a6 1858 { X86_64_TABLE (X86_64_27) },
252b5132 1859 /* 28 */
bf890a93
IT
1860 { "subB", { Ebh1, Gb }, 0 },
1861 { "subS", { Evh1, Gv }, 0 },
1862 { "subB", { Gb, EbS }, 0 },
1863 { "subS", { Gv, EvS }, 0 },
1864 { "subB", { AL, Ib }, 0 },
1865 { "subS", { eAX, Iv }, 0 },
592d1631 1866 { Bad_Opcode }, /* SEG CS prefix */
4e7d34a6 1867 { X86_64_TABLE (X86_64_2F) },
252b5132 1868 /* 30 */
bf890a93
IT
1869 { "xorB", { Ebh1, Gb }, 0 },
1870 { "xorS", { Evh1, Gv }, 0 },
1871 { "xorB", { Gb, EbS }, 0 },
1872 { "xorS", { Gv, EvS }, 0 },
1873 { "xorB", { AL, Ib }, 0 },
1874 { "xorS", { eAX, Iv }, 0 },
592d1631 1875 { Bad_Opcode }, /* SEG SS prefix */
4e7d34a6 1876 { X86_64_TABLE (X86_64_37) },
252b5132 1877 /* 38 */
bf890a93
IT
1878 { "cmpB", { Eb, Gb }, 0 },
1879 { "cmpS", { Ev, Gv }, 0 },
1880 { "cmpB", { Gb, EbS }, 0 },
1881 { "cmpS", { Gv, EvS }, 0 },
1882 { "cmpB", { AL, Ib }, 0 },
1883 { "cmpS", { eAX, Iv }, 0 },
592d1631 1884 { Bad_Opcode }, /* SEG DS prefix */
4e7d34a6 1885 { X86_64_TABLE (X86_64_3F) },
252b5132 1886 /* 40 */
bf890a93
IT
1887 { "inc{S|}", { RMeAX }, 0 },
1888 { "inc{S|}", { RMeCX }, 0 },
1889 { "inc{S|}", { RMeDX }, 0 },
1890 { "inc{S|}", { RMeBX }, 0 },
1891 { "inc{S|}", { RMeSP }, 0 },
1892 { "inc{S|}", { RMeBP }, 0 },
1893 { "inc{S|}", { RMeSI }, 0 },
1894 { "inc{S|}", { RMeDI }, 0 },
252b5132 1895 /* 48 */
bf890a93
IT
1896 { "dec{S|}", { RMeAX }, 0 },
1897 { "dec{S|}", { RMeCX }, 0 },
1898 { "dec{S|}", { RMeDX }, 0 },
1899 { "dec{S|}", { RMeBX }, 0 },
1900 { "dec{S|}", { RMeSP }, 0 },
1901 { "dec{S|}", { RMeBP }, 0 },
1902 { "dec{S|}", { RMeSI }, 0 },
1903 { "dec{S|}", { RMeDI }, 0 },
252b5132 1904 /* 50 */
bf890a93
IT
1905 { "pushV", { RMrAX }, 0 },
1906 { "pushV", { RMrCX }, 0 },
1907 { "pushV", { RMrDX }, 0 },
1908 { "pushV", { RMrBX }, 0 },
1909 { "pushV", { RMrSP }, 0 },
1910 { "pushV", { RMrBP }, 0 },
1911 { "pushV", { RMrSI }, 0 },
1912 { "pushV", { RMrDI }, 0 },
252b5132 1913 /* 58 */
bf890a93
IT
1914 { "popV", { RMrAX }, 0 },
1915 { "popV", { RMrCX }, 0 },
1916 { "popV", { RMrDX }, 0 },
1917 { "popV", { RMrBX }, 0 },
1918 { "popV", { RMrSP }, 0 },
1919 { "popV", { RMrBP }, 0 },
1920 { "popV", { RMrSI }, 0 },
1921 { "popV", { RMrDI }, 0 },
252b5132 1922 /* 60 */
4e7d34a6
L
1923 { X86_64_TABLE (X86_64_60) },
1924 { X86_64_TABLE (X86_64_61) },
1925 { X86_64_TABLE (X86_64_62) },
1926 { X86_64_TABLE (X86_64_63) },
592d1631
L
1927 { Bad_Opcode }, /* seg fs */
1928 { Bad_Opcode }, /* seg gs */
1929 { Bad_Opcode }, /* op size prefix */
1930 { Bad_Opcode }, /* adr size prefix */
252b5132 1931 /* 68 */
bf890a93
IT
1932 { "pushT", { sIv }, 0 },
1933 { "imulS", { Gv, Ev, Iv }, 0 },
1934 { "pushT", { sIbT }, 0 },
1935 { "imulS", { Gv, Ev, sIb }, 0 },
1936 { "ins{b|}", { Ybr, indirDX }, 0 },
4e7d34a6 1937 { X86_64_TABLE (X86_64_6D) },
bf890a93 1938 { "outs{b|}", { indirDXr, Xb }, 0 },
4e7d34a6 1939 { X86_64_TABLE (X86_64_6F) },
252b5132 1940 /* 70 */
bf890a93
IT
1941 { "joH", { Jb, BND, cond_jump_flag }, 0 },
1942 { "jnoH", { Jb, BND, cond_jump_flag }, 0 },
1943 { "jbH", { Jb, BND, cond_jump_flag }, 0 },
1944 { "jaeH", { Jb, BND, cond_jump_flag }, 0 },
1945 { "jeH", { Jb, BND, cond_jump_flag }, 0 },
1946 { "jneH", { Jb, BND, cond_jump_flag }, 0 },
1947 { "jbeH", { Jb, BND, cond_jump_flag }, 0 },
1948 { "jaH", { Jb, BND, cond_jump_flag }, 0 },
252b5132 1949 /* 78 */
bf890a93
IT
1950 { "jsH", { Jb, BND, cond_jump_flag }, 0 },
1951 { "jnsH", { Jb, BND, cond_jump_flag }, 0 },
1952 { "jpH", { Jb, BND, cond_jump_flag }, 0 },
1953 { "jnpH", { Jb, BND, cond_jump_flag }, 0 },
1954 { "jlH", { Jb, BND, cond_jump_flag }, 0 },
1955 { "jgeH", { Jb, BND, cond_jump_flag }, 0 },
1956 { "jleH", { Jb, BND, cond_jump_flag }, 0 },
1957 { "jgH", { Jb, BND, cond_jump_flag }, 0 },
252b5132 1958 /* 80 */
1ceb70f8
L
1959 { REG_TABLE (REG_80) },
1960 { REG_TABLE (REG_81) },
d039fef3 1961 { X86_64_TABLE (X86_64_82) },
7148c369 1962 { REG_TABLE (REG_83) },
bf890a93
IT
1963 { "testB", { Eb, Gb }, 0 },
1964 { "testS", { Ev, Gv }, 0 },
1965 { "xchgB", { Ebh2, Gb }, 0 },
1966 { "xchgS", { Evh2, Gv }, 0 },
252b5132 1967 /* 88 */
bf890a93
IT
1968 { "movB", { Ebh3, Gb }, 0 },
1969 { "movS", { Evh3, Gv }, 0 },
1970 { "movB", { Gb, EbS }, 0 },
1971 { "movS", { Gv, EvS }, 0 },
1972 { "movD", { Sv, Sw }, 0 },
1ceb70f8 1973 { MOD_TABLE (MOD_8D) },
bf890a93 1974 { "movD", { Sw, Sv }, 0 },
1ceb70f8 1975 { REG_TABLE (REG_8F) },
252b5132 1976 /* 90 */
1ceb70f8 1977 { PREFIX_TABLE (PREFIX_90) },
bf890a93
IT
1978 { "xchgS", { RMeCX, eAX }, 0 },
1979 { "xchgS", { RMeDX, eAX }, 0 },
1980 { "xchgS", { RMeBX, eAX }, 0 },
1981 { "xchgS", { RMeSP, eAX }, 0 },
1982 { "xchgS", { RMeBP, eAX }, 0 },
1983 { "xchgS", { RMeSI, eAX }, 0 },
1984 { "xchgS", { RMeDI, eAX }, 0 },
252b5132 1985 /* 98 */
bf890a93
IT
1986 { "cW{t|}R", { XX }, 0 },
1987 { "cR{t|}O", { XX }, 0 },
4e7d34a6 1988 { X86_64_TABLE (X86_64_9A) },
592d1631 1989 { Bad_Opcode }, /* fwait */
bf890a93
IT
1990 { "pushfT", { XX }, 0 },
1991 { "popfT", { XX }, 0 },
1992 { "sahf", { XX }, 0 },
1993 { "lahf", { XX }, 0 },
252b5132 1994 /* a0 */
bf890a93
IT
1995 { "mov%LB", { AL, Ob }, 0 },
1996 { "mov%LS", { eAX, Ov }, 0 },
1997 { "mov%LB", { Ob, AL }, 0 },
1998 { "mov%LS", { Ov, eAX }, 0 },
1999 { "movs{b|}", { Ybr, Xb }, 0 },
2000 { "movs{R|}", { Yvr, Xv }, 0 },
2001 { "cmps{b|}", { Xb, Yb }, 0 },
2002 { "cmps{R|}", { Xv, Yv }, 0 },
252b5132 2003 /* a8 */
bf890a93
IT
2004 { "testB", { AL, Ib }, 0 },
2005 { "testS", { eAX, Iv }, 0 },
2006 { "stosB", { Ybr, AL }, 0 },
2007 { "stosS", { Yvr, eAX }, 0 },
2008 { "lodsB", { ALr, Xb }, 0 },
2009 { "lodsS", { eAXr, Xv }, 0 },
2010 { "scasB", { AL, Yb }, 0 },
2011 { "scasS", { eAX, Yv }, 0 },
252b5132 2012 /* b0 */
bf890a93
IT
2013 { "movB", { RMAL, Ib }, 0 },
2014 { "movB", { RMCL, Ib }, 0 },
2015 { "movB", { RMDL, Ib }, 0 },
2016 { "movB", { RMBL, Ib }, 0 },
2017 { "movB", { RMAH, Ib }, 0 },
2018 { "movB", { RMCH, Ib }, 0 },
2019 { "movB", { RMDH, Ib }, 0 },
2020 { "movB", { RMBH, Ib }, 0 },
252b5132 2021 /* b8 */
bf890a93
IT
2022 { "mov%LV", { RMeAX, Iv64 }, 0 },
2023 { "mov%LV", { RMeCX, Iv64 }, 0 },
2024 { "mov%LV", { RMeDX, Iv64 }, 0 },
2025 { "mov%LV", { RMeBX, Iv64 }, 0 },
2026 { "mov%LV", { RMeSP, Iv64 }, 0 },
2027 { "mov%LV", { RMeBP, Iv64 }, 0 },
2028 { "mov%LV", { RMeSI, Iv64 }, 0 },
2029 { "mov%LV", { RMeDI, Iv64 }, 0 },
252b5132 2030 /* c0 */
1ceb70f8
L
2031 { REG_TABLE (REG_C0) },
2032 { REG_TABLE (REG_C1) },
aeab2b26
JB
2033 { X86_64_TABLE (X86_64_C2) },
2034 { X86_64_TABLE (X86_64_C3) },
4e7d34a6
L
2035 { X86_64_TABLE (X86_64_C4) },
2036 { X86_64_TABLE (X86_64_C5) },
1ceb70f8
L
2037 { REG_TABLE (REG_C6) },
2038 { REG_TABLE (REG_C7) },
252b5132 2039 /* c8 */
bf890a93
IT
2040 { "enterT", { Iw, Ib }, 0 },
2041 { "leaveT", { XX }, 0 },
8f570d62
JB
2042 { "{l|}ret{|f}P", { Iw }, 0 },
2043 { "{l|}ret{|f}P", { XX }, 0 },
bf890a93
IT
2044 { "int3", { XX }, 0 },
2045 { "int", { Ib }, 0 },
4e7d34a6 2046 { X86_64_TABLE (X86_64_CE) },
bf890a93 2047 { "iret%LP", { XX }, 0 },
252b5132 2048 /* d0 */
1ceb70f8
L
2049 { REG_TABLE (REG_D0) },
2050 { REG_TABLE (REG_D1) },
2051 { REG_TABLE (REG_D2) },
2052 { REG_TABLE (REG_D3) },
4e7d34a6
L
2053 { X86_64_TABLE (X86_64_D4) },
2054 { X86_64_TABLE (X86_64_D5) },
592d1631 2055 { Bad_Opcode },
bf890a93 2056 { "xlat", { DSBX }, 0 },
252b5132
RH
2057 /* d8 */
2058 { FLOAT },
2059 { FLOAT },
2060 { FLOAT },
2061 { FLOAT },
2062 { FLOAT },
2063 { FLOAT },
2064 { FLOAT },
2065 { FLOAT },
2066 /* e0 */
bf890a93
IT
2067 { "loopneFH", { Jb, XX, loop_jcxz_flag }, 0 },
2068 { "loopeFH", { Jb, XX, loop_jcxz_flag }, 0 },
2069 { "loopFH", { Jb, XX, loop_jcxz_flag }, 0 },
2070 { "jEcxzH", { Jb, XX, loop_jcxz_flag }, 0 },
2071 { "inB", { AL, Ib }, 0 },
2072 { "inG", { zAX, Ib }, 0 },
2073 { "outB", { Ib, AL }, 0 },
2074 { "outG", { Ib, zAX }, 0 },
252b5132 2075 /* e8 */
a72d2af2
L
2076 { X86_64_TABLE (X86_64_E8) },
2077 { X86_64_TABLE (X86_64_E9) },
4e7d34a6 2078 { X86_64_TABLE (X86_64_EA) },
bf890a93
IT
2079 { "jmp", { Jb, BND }, 0 },
2080 { "inB", { AL, indirDX }, 0 },
2081 { "inG", { zAX, indirDX }, 0 },
2082 { "outB", { indirDX, AL }, 0 },
2083 { "outG", { indirDX, zAX }, 0 },
252b5132 2084 /* f0 */
592d1631 2085 { Bad_Opcode }, /* lock prefix */
bf890a93 2086 { "icebp", { XX }, 0 },
592d1631
L
2087 { Bad_Opcode }, /* repne */
2088 { Bad_Opcode }, /* repz */
bf890a93
IT
2089 { "hlt", { XX }, 0 },
2090 { "cmc", { XX }, 0 },
1ceb70f8
L
2091 { REG_TABLE (REG_F6) },
2092 { REG_TABLE (REG_F7) },
252b5132 2093 /* f8 */
bf890a93
IT
2094 { "clc", { XX }, 0 },
2095 { "stc", { XX }, 0 },
2096 { "cli", { XX }, 0 },
2097 { "sti", { XX }, 0 },
2098 { "cld", { XX }, 0 },
2099 { "std", { XX }, 0 },
1ceb70f8
L
2100 { REG_TABLE (REG_FE) },
2101 { REG_TABLE (REG_FF) },
252b5132
RH
2102};
2103
6439fc28 2104static const struct dis386 dis386_twobyte[] = {
252b5132 2105 /* 00 */
1ceb70f8
L
2106 { REG_TABLE (REG_0F00 ) },
2107 { REG_TABLE (REG_0F01 ) },
bf890a93
IT
2108 { "larS", { Gv, Ew }, 0 },
2109 { "lslS", { Gv, Ew }, 0 },
592d1631 2110 { Bad_Opcode },
bf890a93
IT
2111 { "syscall", { XX }, 0 },
2112 { "clts", { XX }, 0 },
589958d6 2113 { "sysret%LQ", { XX }, 0 },
252b5132 2114 /* 08 */
bf890a93 2115 { "invd", { XX }, 0 },
3233d7d0 2116 { PREFIX_TABLE (PREFIX_0F09) },
592d1631 2117 { Bad_Opcode },
bf890a93 2118 { "ud2", { XX }, 0 },
592d1631 2119 { Bad_Opcode },
b5b1fc4f 2120 { REG_TABLE (REG_0F0D) },
bf890a93
IT
2121 { "femms", { XX }, 0 },
2122 { "", { MX, EM, OPSUF }, 0 }, /* See OP_3DNowSuffix. */
252b5132 2123 /* 10 */
1ceb70f8
L
2124 { PREFIX_TABLE (PREFIX_0F10) },
2125 { PREFIX_TABLE (PREFIX_0F11) },
2126 { PREFIX_TABLE (PREFIX_0F12) },
2127 { MOD_TABLE (MOD_0F13) },
507bd325
L
2128 { "unpcklpX", { XM, EXx }, PREFIX_OPCODE },
2129 { "unpckhpX", { XM, EXx }, PREFIX_OPCODE },
1ceb70f8
L
2130 { PREFIX_TABLE (PREFIX_0F16) },
2131 { MOD_TABLE (MOD_0F17) },
252b5132 2132 /* 18 */
1ceb70f8 2133 { REG_TABLE (REG_0F18) },
bf890a93 2134 { "nopQ", { Ev }, 0 },
7e8b059b
L
2135 { PREFIX_TABLE (PREFIX_0F1A) },
2136 { PREFIX_TABLE (PREFIX_0F1B) },
c48935d7 2137 { PREFIX_TABLE (PREFIX_0F1C) },
bf890a93 2138 { "nopQ", { Ev }, 0 },
603555e5 2139 { PREFIX_TABLE (PREFIX_0F1E) },
bf890a93 2140 { "nopQ", { Ev }, 0 },
252b5132 2141 /* 20 */
bf890a93
IT
2142 { "movZ", { Rm, Cm }, 0 },
2143 { "movZ", { Rm, Dm }, 0 },
2144 { "movZ", { Cm, Rm }, 0 },
2145 { "movZ", { Dm, Rm }, 0 },
1ceb70f8 2146 { MOD_TABLE (MOD_0F24) },
592d1631 2147 { Bad_Opcode },
1ceb70f8 2148 { MOD_TABLE (MOD_0F26) },
592d1631 2149 { Bad_Opcode },
252b5132 2150 /* 28 */
507bd325
L
2151 { "movapX", { XM, EXx }, PREFIX_OPCODE },
2152 { "movapX", { EXxS, XM }, PREFIX_OPCODE },
1ceb70f8
L
2153 { PREFIX_TABLE (PREFIX_0F2A) },
2154 { PREFIX_TABLE (PREFIX_0F2B) },
2155 { PREFIX_TABLE (PREFIX_0F2C) },
2156 { PREFIX_TABLE (PREFIX_0F2D) },
2157 { PREFIX_TABLE (PREFIX_0F2E) },
2158 { PREFIX_TABLE (PREFIX_0F2F) },
252b5132 2159 /* 30 */
bf890a93
IT
2160 { "wrmsr", { XX }, 0 },
2161 { "rdtsc", { XX }, 0 },
2162 { "rdmsr", { XX }, 0 },
2163 { "rdpmc", { XX }, 0 },
d835a58b
JB
2164 { "sysenter", { SEP }, 0 },
2165 { "sysexit", { SEP }, 0 },
592d1631 2166 { Bad_Opcode },
bf890a93 2167 { "getsec", { XX }, 0 },
252b5132 2168 /* 38 */
507bd325 2169 { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F38, PREFIX_OPCODE) },
592d1631 2170 { Bad_Opcode },
507bd325 2171 { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F3A, PREFIX_OPCODE) },
592d1631
L
2172 { Bad_Opcode },
2173 { Bad_Opcode },
2174 { Bad_Opcode },
2175 { Bad_Opcode },
2176 { Bad_Opcode },
252b5132 2177 /* 40 */
bf890a93
IT
2178 { "cmovoS", { Gv, Ev }, 0 },
2179 { "cmovnoS", { Gv, Ev }, 0 },
2180 { "cmovbS", { Gv, Ev }, 0 },
2181 { "cmovaeS", { Gv, Ev }, 0 },
2182 { "cmoveS", { Gv, Ev }, 0 },
2183 { "cmovneS", { Gv, Ev }, 0 },
2184 { "cmovbeS", { Gv, Ev }, 0 },
2185 { "cmovaS", { Gv, Ev }, 0 },
252b5132 2186 /* 48 */
bf890a93
IT
2187 { "cmovsS", { Gv, Ev }, 0 },
2188 { "cmovnsS", { Gv, Ev }, 0 },
2189 { "cmovpS", { Gv, Ev }, 0 },
2190 { "cmovnpS", { Gv, Ev }, 0 },
2191 { "cmovlS", { Gv, Ev }, 0 },
2192 { "cmovgeS", { Gv, Ev }, 0 },
2193 { "cmovleS", { Gv, Ev }, 0 },
2194 { "cmovgS", { Gv, Ev }, 0 },
252b5132 2195 /* 50 */
a5aaedb9 2196 { MOD_TABLE (MOD_0F50) },
1ceb70f8
L
2197 { PREFIX_TABLE (PREFIX_0F51) },
2198 { PREFIX_TABLE (PREFIX_0F52) },
2199 { PREFIX_TABLE (PREFIX_0F53) },
507bd325
L
2200 { "andpX", { XM, EXx }, PREFIX_OPCODE },
2201 { "andnpX", { XM, EXx }, PREFIX_OPCODE },
2202 { "orpX", { XM, EXx }, PREFIX_OPCODE },
2203 { "xorpX", { XM, EXx }, PREFIX_OPCODE },
252b5132 2204 /* 58 */
1ceb70f8
L
2205 { PREFIX_TABLE (PREFIX_0F58) },
2206 { PREFIX_TABLE (PREFIX_0F59) },
2207 { PREFIX_TABLE (PREFIX_0F5A) },
2208 { PREFIX_TABLE (PREFIX_0F5B) },
2209 { PREFIX_TABLE (PREFIX_0F5C) },
2210 { PREFIX_TABLE (PREFIX_0F5D) },
2211 { PREFIX_TABLE (PREFIX_0F5E) },
2212 { PREFIX_TABLE (PREFIX_0F5F) },
252b5132 2213 /* 60 */
1ceb70f8
L
2214 { PREFIX_TABLE (PREFIX_0F60) },
2215 { PREFIX_TABLE (PREFIX_0F61) },
2216 { PREFIX_TABLE (PREFIX_0F62) },
507bd325
L
2217 { "packsswb", { MX, EM }, PREFIX_OPCODE },
2218 { "pcmpgtb", { MX, EM }, PREFIX_OPCODE },
2219 { "pcmpgtw", { MX, EM }, PREFIX_OPCODE },
2220 { "pcmpgtd", { MX, EM }, PREFIX_OPCODE },
2221 { "packuswb", { MX, EM }, PREFIX_OPCODE },
252b5132 2222 /* 68 */
507bd325
L
2223 { "punpckhbw", { MX, EM }, PREFIX_OPCODE },
2224 { "punpckhwd", { MX, EM }, PREFIX_OPCODE },
2225 { "punpckhdq", { MX, EM }, PREFIX_OPCODE },
2226 { "packssdw", { MX, EM }, PREFIX_OPCODE },
7531c613
JB
2227 { "punpcklqdq", { XM, EXx }, PREFIX_DATA },
2228 { "punpckhqdq", { XM, EXx }, PREFIX_DATA },
507bd325 2229 { "movK", { MX, Edq }, PREFIX_OPCODE },
1ceb70f8 2230 { PREFIX_TABLE (PREFIX_0F6F) },
252b5132 2231 /* 70 */
1ceb70f8
L
2232 { PREFIX_TABLE (PREFIX_0F70) },
2233 { REG_TABLE (REG_0F71) },
2234 { REG_TABLE (REG_0F72) },
2235 { REG_TABLE (REG_0F73) },
507bd325
L
2236 { "pcmpeqb", { MX, EM }, PREFIX_OPCODE },
2237 { "pcmpeqw", { MX, EM }, PREFIX_OPCODE },
2238 { "pcmpeqd", { MX, EM }, PREFIX_OPCODE },
2239 { "emms", { XX }, PREFIX_OPCODE },
252b5132 2240 /* 78 */
1ceb70f8
L
2241 { PREFIX_TABLE (PREFIX_0F78) },
2242 { PREFIX_TABLE (PREFIX_0F79) },
1f334aeb 2243 { Bad_Opcode },
592d1631 2244 { Bad_Opcode },
1ceb70f8
L
2245 { PREFIX_TABLE (PREFIX_0F7C) },
2246 { PREFIX_TABLE (PREFIX_0F7D) },
2247 { PREFIX_TABLE (PREFIX_0F7E) },
2248 { PREFIX_TABLE (PREFIX_0F7F) },
252b5132 2249 /* 80 */
bf890a93
IT
2250 { "joH", { Jv, BND, cond_jump_flag }, 0 },
2251 { "jnoH", { Jv, BND, cond_jump_flag }, 0 },
2252 { "jbH", { Jv, BND, cond_jump_flag }, 0 },
2253 { "jaeH", { Jv, BND, cond_jump_flag }, 0 },
2254 { "jeH", { Jv, BND, cond_jump_flag }, 0 },
2255 { "jneH", { Jv, BND, cond_jump_flag }, 0 },
2256 { "jbeH", { Jv, BND, cond_jump_flag }, 0 },
2257 { "jaH", { Jv, BND, cond_jump_flag }, 0 },
252b5132 2258 /* 88 */
bf890a93
IT
2259 { "jsH", { Jv, BND, cond_jump_flag }, 0 },
2260 { "jnsH", { Jv, BND, cond_jump_flag }, 0 },
2261 { "jpH", { Jv, BND, cond_jump_flag }, 0 },
2262 { "jnpH", { Jv, BND, cond_jump_flag }, 0 },
2263 { "jlH", { Jv, BND, cond_jump_flag }, 0 },
2264 { "jgeH", { Jv, BND, cond_jump_flag }, 0 },
2265 { "jleH", { Jv, BND, cond_jump_flag }, 0 },
2266 { "jgH", { Jv, BND, cond_jump_flag }, 0 },
252b5132 2267 /* 90 */
bf890a93
IT
2268 { "seto", { Eb }, 0 },
2269 { "setno", { Eb }, 0 },
2270 { "setb", { Eb }, 0 },
2271 { "setae", { Eb }, 0 },
2272 { "sete", { Eb }, 0 },
2273 { "setne", { Eb }, 0 },
2274 { "setbe", { Eb }, 0 },
2275 { "seta", { Eb }, 0 },
252b5132 2276 /* 98 */
bf890a93
IT
2277 { "sets", { Eb }, 0 },
2278 { "setns", { Eb }, 0 },
2279 { "setp", { Eb }, 0 },
2280 { "setnp", { Eb }, 0 },
2281 { "setl", { Eb }, 0 },
2282 { "setge", { Eb }, 0 },
2283 { "setle", { Eb }, 0 },
2284 { "setg", { Eb }, 0 },
252b5132 2285 /* a0 */
bf890a93
IT
2286 { "pushT", { fs }, 0 },
2287 { "popT", { fs }, 0 },
2288 { "cpuid", { XX }, 0 },
2289 { "btS", { Ev, Gv }, 0 },
2290 { "shldS", { Ev, Gv, Ib }, 0 },
2291 { "shldS", { Ev, Gv, CL }, 0 },
1ceb70f8
L
2292 { REG_TABLE (REG_0FA6) },
2293 { REG_TABLE (REG_0FA7) },
252b5132 2294 /* a8 */
bf890a93
IT
2295 { "pushT", { gs }, 0 },
2296 { "popT", { gs }, 0 },
2297 { "rsm", { XX }, 0 },
2298 { "btsS", { Evh1, Gv }, 0 },
2299 { "shrdS", { Ev, Gv, Ib }, 0 },
2300 { "shrdS", { Ev, Gv, CL }, 0 },
1ceb70f8 2301 { REG_TABLE (REG_0FAE) },
bf890a93 2302 { "imulS", { Gv, Ev }, 0 },
252b5132 2303 /* b0 */
bf890a93
IT
2304 { "cmpxchgB", { Ebh1, Gb }, 0 },
2305 { "cmpxchgS", { Evh1, Gv }, 0 },
1ceb70f8 2306 { MOD_TABLE (MOD_0FB2) },
bf890a93 2307 { "btrS", { Evh1, Gv }, 0 },
1ceb70f8
L
2308 { MOD_TABLE (MOD_0FB4) },
2309 { MOD_TABLE (MOD_0FB5) },
bf890a93
IT
2310 { "movz{bR|x}", { Gv, Eb }, 0 },
2311 { "movz{wR|x}", { Gv, Ew }, 0 }, /* yes, there really is movzww ! */
252b5132 2312 /* b8 */
1ceb70f8 2313 { PREFIX_TABLE (PREFIX_0FB8) },
66f1eba0 2314 { "ud1S", { Gv, Ev }, 0 },
1ceb70f8 2315 { REG_TABLE (REG_0FBA) },
bf890a93 2316 { "btcS", { Evh1, Gv }, 0 },
f12dc422 2317 { PREFIX_TABLE (PREFIX_0FBC) },
1ceb70f8 2318 { PREFIX_TABLE (PREFIX_0FBD) },
bf890a93
IT
2319 { "movs{bR|x}", { Gv, Eb }, 0 },
2320 { "movs{wR|x}", { Gv, Ew }, 0 }, /* yes, there really is movsww ! */
252b5132 2321 /* c0 */
bf890a93
IT
2322 { "xaddB", { Ebh1, Gb }, 0 },
2323 { "xaddS", { Evh1, Gv }, 0 },
1ceb70f8 2324 { PREFIX_TABLE (PREFIX_0FC2) },
a8484f96 2325 { MOD_TABLE (MOD_0FC3) },
507bd325
L
2326 { "pinsrw", { MX, Edqw, Ib }, PREFIX_OPCODE },
2327 { "pextrw", { Gdq, MS, Ib }, PREFIX_OPCODE },
2328 { "shufpX", { XM, EXx, Ib }, PREFIX_OPCODE },
1ceb70f8 2329 { REG_TABLE (REG_0FC7) },
252b5132 2330 /* c8 */
bf890a93
IT
2331 { "bswap", { RMeAX }, 0 },
2332 { "bswap", { RMeCX }, 0 },
2333 { "bswap", { RMeDX }, 0 },
2334 { "bswap", { RMeBX }, 0 },
2335 { "bswap", { RMeSP }, 0 },
2336 { "bswap", { RMeBP }, 0 },
2337 { "bswap", { RMeSI }, 0 },
2338 { "bswap", { RMeDI }, 0 },
252b5132 2339 /* d0 */
1ceb70f8 2340 { PREFIX_TABLE (PREFIX_0FD0) },
507bd325
L
2341 { "psrlw", { MX, EM }, PREFIX_OPCODE },
2342 { "psrld", { MX, EM }, PREFIX_OPCODE },
2343 { "psrlq", { MX, EM }, PREFIX_OPCODE },
2344 { "paddq", { MX, EM }, PREFIX_OPCODE },
2345 { "pmullw", { MX, EM }, PREFIX_OPCODE },
1ceb70f8 2346 { PREFIX_TABLE (PREFIX_0FD6) },
75c135a8 2347 { MOD_TABLE (MOD_0FD7) },
252b5132 2348 /* d8 */
507bd325
L
2349 { "psubusb", { MX, EM }, PREFIX_OPCODE },
2350 { "psubusw", { MX, EM }, PREFIX_OPCODE },
2351 { "pminub", { MX, EM }, PREFIX_OPCODE },
2352 { "pand", { MX, EM }, PREFIX_OPCODE },
2353 { "paddusb", { MX, EM }, PREFIX_OPCODE },
2354 { "paddusw", { MX, EM }, PREFIX_OPCODE },
2355 { "pmaxub", { MX, EM }, PREFIX_OPCODE },
2356 { "pandn", { MX, EM }, PREFIX_OPCODE },
252b5132 2357 /* e0 */
507bd325
L
2358 { "pavgb", { MX, EM }, PREFIX_OPCODE },
2359 { "psraw", { MX, EM }, PREFIX_OPCODE },
2360 { "psrad", { MX, EM }, PREFIX_OPCODE },
2361 { "pavgw", { MX, EM }, PREFIX_OPCODE },
2362 { "pmulhuw", { MX, EM }, PREFIX_OPCODE },
2363 { "pmulhw", { MX, EM }, PREFIX_OPCODE },
1ceb70f8
L
2364 { PREFIX_TABLE (PREFIX_0FE6) },
2365 { PREFIX_TABLE (PREFIX_0FE7) },
252b5132 2366 /* e8 */
507bd325
L
2367 { "psubsb", { MX, EM }, PREFIX_OPCODE },
2368 { "psubsw", { MX, EM }, PREFIX_OPCODE },
2369 { "pminsw", { MX, EM }, PREFIX_OPCODE },
2370 { "por", { MX, EM }, PREFIX_OPCODE },
2371 { "paddsb", { MX, EM }, PREFIX_OPCODE },
2372 { "paddsw", { MX, EM }, PREFIX_OPCODE },
2373 { "pmaxsw", { MX, EM }, PREFIX_OPCODE },
2374 { "pxor", { MX, EM }, PREFIX_OPCODE },
252b5132 2375 /* f0 */
1ceb70f8 2376 { PREFIX_TABLE (PREFIX_0FF0) },
507bd325
L
2377 { "psllw", { MX, EM }, PREFIX_OPCODE },
2378 { "pslld", { MX, EM }, PREFIX_OPCODE },
2379 { "psllq", { MX, EM }, PREFIX_OPCODE },
2380 { "pmuludq", { MX, EM }, PREFIX_OPCODE },
2381 { "pmaddwd", { MX, EM }, PREFIX_OPCODE },
2382 { "psadbw", { MX, EM }, PREFIX_OPCODE },
1ceb70f8 2383 { PREFIX_TABLE (PREFIX_0FF7) },
252b5132 2384 /* f8 */
507bd325
L
2385 { "psubb", { MX, EM }, PREFIX_OPCODE },
2386 { "psubw", { MX, EM }, PREFIX_OPCODE },
2387 { "psubd", { MX, EM }, PREFIX_OPCODE },
2388 { "psubq", { MX, EM }, PREFIX_OPCODE },
2389 { "paddb", { MX, EM }, PREFIX_OPCODE },
2390 { "paddw", { MX, EM }, PREFIX_OPCODE },
2391 { "paddd", { MX, EM }, PREFIX_OPCODE },
66f1eba0 2392 { "ud0S", { Gv, Ev }, 0 },
252b5132
RH
2393};
2394
2395static const unsigned char onebyte_has_modrm[256] = {
c608c12e
AM
2396 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2397 /* ------------------------------- */
2398 /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
2399 /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
2400 /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
2401 /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
2402 /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
2403 /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
2404 /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
2405 /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
2406 /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
2407 /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
2408 /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
2409 /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
2410 /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
2411 /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
2412 /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
2413 /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1 /* f0 */
2414 /* ------------------------------- */
2415 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
252b5132
RH
2416};
2417
2418static const unsigned char twobyte_has_modrm[256] = {
c608c12e
AM
2419 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2420 /* ------------------------------- */
252b5132 2421 /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
b5b1fc4f 2422 /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
85f10a01 2423 /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
331d2d0d 2424 /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
252b5132 2425 /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
4bba6815
AM
2426 /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
2427 /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
85f10a01 2428 /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
252b5132
RH
2429 /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
2430 /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
30d1c836 2431 /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
66f1eba0 2432 /* b0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* bf */
252b5132 2433 /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
ca164297 2434 /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
4bba6815 2435 /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
66f1eba0 2436 /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 /* ff */
c608c12e
AM
2437 /* ------------------------------- */
2438 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2439};
2440
252b5132
RH
2441static char obuf[100];
2442static char *obufp;
ea397f5b 2443static char *mnemonicendp;
252b5132
RH
2444static char scratchbuf[100];
2445static unsigned char *start_codep;
2446static unsigned char *insn_codep;
2447static unsigned char *codep;
285ca992 2448static unsigned char *end_codep;
f16cd0d5
L
2449static int last_lock_prefix;
2450static int last_repz_prefix;
2451static int last_repnz_prefix;
2452static int last_data_prefix;
2453static int last_addr_prefix;
2454static int last_rex_prefix;
2455static int last_seg_prefix;
d9949a36 2456static int fwait_prefix;
285ca992
L
2457/* The active segment register prefix. */
2458static int active_seg_prefix;
f16cd0d5
L
2459#define MAX_CODE_LENGTH 15
2460/* We can up to 14 prefixes since the maximum instruction length is
2461 15bytes. */
2462static int all_prefixes[MAX_CODE_LENGTH - 1];
252b5132 2463static disassemble_info *the_info;
7967e09e
L
2464static struct
2465 {
2466 int mod;
7967e09e 2467 int reg;
484c222e 2468 int rm;
7967e09e
L
2469 }
2470modrm;
4bba6815 2471static unsigned char need_modrm;
dfc8cf43
L
2472static struct
2473 {
2474 int scale;
2475 int index;
2476 int base;
2477 }
2478sib;
c0f3af97
L
2479static struct
2480 {
2481 int register_specifier;
2482 int length;
2483 int prefix;
2484 int w;
43234a1e
L
2485 int evex;
2486 int r;
2487 int v;
2488 int mask_register_specifier;
2489 int zeroing;
2490 int ll;
2491 int b;
c0f3af97
L
2492 }
2493vex;
2494static unsigned char need_vex;
252b5132 2495
ea397f5b
L
2496struct op
2497 {
2498 const char *name;
2499 unsigned int len;
2500 };
2501
4bba6815
AM
2502/* If we are accessing mod/rm/reg without need_modrm set, then the
2503 values are stale. Hitting this abort likely indicates that you
2504 need to update onebyte_has_modrm or twobyte_has_modrm. */
2505#define MODRM_CHECK if (!need_modrm) abort ()
2506
d708bcba
AM
2507static const char **names64;
2508static const char **names32;
2509static const char **names16;
2510static const char **names8;
2511static const char **names8rex;
2512static const char **names_seg;
db51cc60
L
2513static const char *index64;
2514static const char *index32;
d708bcba 2515static const char **index16;
7e8b059b 2516static const char **names_bnd;
d708bcba
AM
2517
2518static const char *intel_names64[] = {
2519 "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
2520 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2521};
2522static const char *intel_names32[] = {
2523 "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
2524 "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
2525};
2526static const char *intel_names16[] = {
2527 "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
2528 "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
2529};
2530static const char *intel_names8[] = {
2531 "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
2532};
2533static const char *intel_names8rex[] = {
2534 "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
2535 "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
2536};
2537static const char *intel_names_seg[] = {
2538 "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
2539};
db51cc60
L
2540static const char *intel_index64 = "riz";
2541static const char *intel_index32 = "eiz";
d708bcba
AM
2542static const char *intel_index16[] = {
2543 "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
2544};
2545
2546static const char *att_names64[] = {
2547 "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
52b15da3
JH
2548 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
2549};
d708bcba
AM
2550static const char *att_names32[] = {
2551 "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
52b15da3 2552 "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
252b5132 2553};
d708bcba
AM
2554static const char *att_names16[] = {
2555 "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
52b15da3 2556 "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
252b5132 2557};
d708bcba
AM
2558static const char *att_names8[] = {
2559 "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
252b5132 2560};
d708bcba
AM
2561static const char *att_names8rex[] = {
2562 "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
52b15da3
JH
2563 "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
2564};
d708bcba
AM
2565static const char *att_names_seg[] = {
2566 "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
252b5132 2567};
db51cc60
L
2568static const char *att_index64 = "%riz";
2569static const char *att_index32 = "%eiz";
d708bcba
AM
2570static const char *att_index16[] = {
2571 "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
252b5132
RH
2572};
2573
b9733481
L
2574static const char **names_mm;
2575static const char *intel_names_mm[] = {
2576 "mm0", "mm1", "mm2", "mm3",
2577 "mm4", "mm5", "mm6", "mm7"
2578};
2579static const char *att_names_mm[] = {
2580 "%mm0", "%mm1", "%mm2", "%mm3",
2581 "%mm4", "%mm5", "%mm6", "%mm7"
2582};
2583
7e8b059b
L
2584static const char *intel_names_bnd[] = {
2585 "bnd0", "bnd1", "bnd2", "bnd3"
2586};
2587
2588static const char *att_names_bnd[] = {
2589 "%bnd0", "%bnd1", "%bnd2", "%bnd3"
2590};
2591
b9733481
L
2592static const char **names_xmm;
2593static const char *intel_names_xmm[] = {
2594 "xmm0", "xmm1", "xmm2", "xmm3",
2595 "xmm4", "xmm5", "xmm6", "xmm7",
2596 "xmm8", "xmm9", "xmm10", "xmm11",
43234a1e
L
2597 "xmm12", "xmm13", "xmm14", "xmm15",
2598 "xmm16", "xmm17", "xmm18", "xmm19",
2599 "xmm20", "xmm21", "xmm22", "xmm23",
2600 "xmm24", "xmm25", "xmm26", "xmm27",
2601 "xmm28", "xmm29", "xmm30", "xmm31"
b9733481
L
2602};
2603static const char *att_names_xmm[] = {
2604 "%xmm0", "%xmm1", "%xmm2", "%xmm3",
2605 "%xmm4", "%xmm5", "%xmm6", "%xmm7",
2606 "%xmm8", "%xmm9", "%xmm10", "%xmm11",
43234a1e
L
2607 "%xmm12", "%xmm13", "%xmm14", "%xmm15",
2608 "%xmm16", "%xmm17", "%xmm18", "%xmm19",
2609 "%xmm20", "%xmm21", "%xmm22", "%xmm23",
2610 "%xmm24", "%xmm25", "%xmm26", "%xmm27",
2611 "%xmm28", "%xmm29", "%xmm30", "%xmm31"
b9733481
L
2612};
2613
2614static const char **names_ymm;
2615static const char *intel_names_ymm[] = {
2616 "ymm0", "ymm1", "ymm2", "ymm3",
2617 "ymm4", "ymm5", "ymm6", "ymm7",
2618 "ymm8", "ymm9", "ymm10", "ymm11",
43234a1e
L
2619 "ymm12", "ymm13", "ymm14", "ymm15",
2620 "ymm16", "ymm17", "ymm18", "ymm19",
2621 "ymm20", "ymm21", "ymm22", "ymm23",
2622 "ymm24", "ymm25", "ymm26", "ymm27",
2623 "ymm28", "ymm29", "ymm30", "ymm31"
b9733481
L
2624};
2625static const char *att_names_ymm[] = {
2626 "%ymm0", "%ymm1", "%ymm2", "%ymm3",
2627 "%ymm4", "%ymm5", "%ymm6", "%ymm7",
2628 "%ymm8", "%ymm9", "%ymm10", "%ymm11",
43234a1e
L
2629 "%ymm12", "%ymm13", "%ymm14", "%ymm15",
2630 "%ymm16", "%ymm17", "%ymm18", "%ymm19",
2631 "%ymm20", "%ymm21", "%ymm22", "%ymm23",
2632 "%ymm24", "%ymm25", "%ymm26", "%ymm27",
2633 "%ymm28", "%ymm29", "%ymm30", "%ymm31"
2634};
2635
2636static const char **names_zmm;
2637static const char *intel_names_zmm[] = {
2638 "zmm0", "zmm1", "zmm2", "zmm3",
2639 "zmm4", "zmm5", "zmm6", "zmm7",
2640 "zmm8", "zmm9", "zmm10", "zmm11",
2641 "zmm12", "zmm13", "zmm14", "zmm15",
2642 "zmm16", "zmm17", "zmm18", "zmm19",
2643 "zmm20", "zmm21", "zmm22", "zmm23",
2644 "zmm24", "zmm25", "zmm26", "zmm27",
2645 "zmm28", "zmm29", "zmm30", "zmm31"
2646};
2647static const char *att_names_zmm[] = {
2648 "%zmm0", "%zmm1", "%zmm2", "%zmm3",
2649 "%zmm4", "%zmm5", "%zmm6", "%zmm7",
2650 "%zmm8", "%zmm9", "%zmm10", "%zmm11",
2651 "%zmm12", "%zmm13", "%zmm14", "%zmm15",
2652 "%zmm16", "%zmm17", "%zmm18", "%zmm19",
2653 "%zmm20", "%zmm21", "%zmm22", "%zmm23",
2654 "%zmm24", "%zmm25", "%zmm26", "%zmm27",
2655 "%zmm28", "%zmm29", "%zmm30", "%zmm31"
2656};
2657
260cd341
LC
2658static const char **names_tmm;
2659static const char *intel_names_tmm[] = {
2660 "tmm0", "tmm1", "tmm2", "tmm3",
2661 "tmm4", "tmm5", "tmm6", "tmm7"
2662};
2663static const char *att_names_tmm[] = {
2664 "%tmm0", "%tmm1", "%tmm2", "%tmm3",
2665 "%tmm4", "%tmm5", "%tmm6", "%tmm7"
2666};
2667
43234a1e
L
2668static const char **names_mask;
2669static const char *intel_names_mask[] = {
2670 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7"
2671};
2672static const char *att_names_mask[] = {
2673 "%k0", "%k1", "%k2", "%k3", "%k4", "%k5", "%k6", "%k7"
2674};
2675
2676static const char *names_rounding[] =
2677{
2678 "{rn-sae}",
2679 "{rd-sae}",
2680 "{ru-sae}",
2681 "{rz-sae}"
b9733481
L
2682};
2683
1ceb70f8
L
2684static const struct dis386 reg_table[][8] = {
2685 /* REG_80 */
252b5132 2686 {
bf890a93
IT
2687 { "addA", { Ebh1, Ib }, 0 },
2688 { "orA", { Ebh1, Ib }, 0 },
2689 { "adcA", { Ebh1, Ib }, 0 },
2690 { "sbbA", { Ebh1, Ib }, 0 },
2691 { "andA", { Ebh1, Ib }, 0 },
2692 { "subA", { Ebh1, Ib }, 0 },
2693 { "xorA", { Ebh1, Ib }, 0 },
2694 { "cmpA", { Eb, Ib }, 0 },
252b5132 2695 },
1ceb70f8 2696 /* REG_81 */
252b5132 2697 {
bf890a93
IT
2698 { "addQ", { Evh1, Iv }, 0 },
2699 { "orQ", { Evh1, Iv }, 0 },
2700 { "adcQ", { Evh1, Iv }, 0 },
2701 { "sbbQ", { Evh1, Iv }, 0 },
2702 { "andQ", { Evh1, Iv }, 0 },
2703 { "subQ", { Evh1, Iv }, 0 },
2704 { "xorQ", { Evh1, Iv }, 0 },
2705 { "cmpQ", { Ev, Iv }, 0 },
252b5132 2706 },
7148c369 2707 /* REG_83 */
252b5132 2708 {
bf890a93
IT
2709 { "addQ", { Evh1, sIb }, 0 },
2710 { "orQ", { Evh1, sIb }, 0 },
2711 { "adcQ", { Evh1, sIb }, 0 },
2712 { "sbbQ", { Evh1, sIb }, 0 },
2713 { "andQ", { Evh1, sIb }, 0 },
2714 { "subQ", { Evh1, sIb }, 0 },
2715 { "xorQ", { Evh1, sIb }, 0 },
2716 { "cmpQ", { Ev, sIb }, 0 },
252b5132 2717 },
1ceb70f8 2718 /* REG_8F */
4e7d34a6 2719 {
bf890a93 2720 { "popU", { stackEv }, 0 },
c48244a5 2721 { XOP_8F_TABLE (XOP_09) },
592d1631
L
2722 { Bad_Opcode },
2723 { Bad_Opcode },
2724 { Bad_Opcode },
f88c9eb0 2725 { XOP_8F_TABLE (XOP_09) },
4e7d34a6 2726 },
1ceb70f8 2727 /* REG_C0 */
252b5132 2728 {
bf890a93
IT
2729 { "rolA", { Eb, Ib }, 0 },
2730 { "rorA", { Eb, Ib }, 0 },
2731 { "rclA", { Eb, Ib }, 0 },
2732 { "rcrA", { Eb, Ib }, 0 },
2733 { "shlA", { Eb, Ib }, 0 },
2734 { "shrA", { Eb, Ib }, 0 },
e4bdd679 2735 { "shlA", { Eb, Ib }, 0 },
bf890a93 2736 { "sarA", { Eb, Ib }, 0 },
252b5132 2737 },
1ceb70f8 2738 /* REG_C1 */
252b5132 2739 {
bf890a93
IT
2740 { "rolQ", { Ev, Ib }, 0 },
2741 { "rorQ", { Ev, Ib }, 0 },
2742 { "rclQ", { Ev, Ib }, 0 },
2743 { "rcrQ", { Ev, Ib }, 0 },
2744 { "shlQ", { Ev, Ib }, 0 },
2745 { "shrQ", { Ev, Ib }, 0 },
e4bdd679 2746 { "shlQ", { Ev, Ib }, 0 },
bf890a93 2747 { "sarQ", { Ev, Ib }, 0 },
252b5132 2748 },
1ceb70f8 2749 /* REG_C6 */
4e7d34a6 2750 {
bf890a93 2751 { "movA", { Ebh3, Ib }, 0 },
42164a71
L
2752 { Bad_Opcode },
2753 { Bad_Opcode },
2754 { Bad_Opcode },
2755 { Bad_Opcode },
2756 { Bad_Opcode },
2757 { Bad_Opcode },
2758 { MOD_TABLE (MOD_C6_REG_7) },
4e7d34a6 2759 },
1ceb70f8 2760 /* REG_C7 */
4e7d34a6 2761 {
bf890a93 2762 { "movQ", { Evh3, Iv }, 0 },
42164a71
L
2763 { Bad_Opcode },
2764 { Bad_Opcode },
2765 { Bad_Opcode },
2766 { Bad_Opcode },
2767 { Bad_Opcode },
2768 { Bad_Opcode },
2769 { MOD_TABLE (MOD_C7_REG_7) },
4e7d34a6 2770 },
1ceb70f8 2771 /* REG_D0 */
252b5132 2772 {
bf890a93
IT
2773 { "rolA", { Eb, I1 }, 0 },
2774 { "rorA", { Eb, I1 }, 0 },
2775 { "rclA", { Eb, I1 }, 0 },
2776 { "rcrA", { Eb, I1 }, 0 },
2777 { "shlA", { Eb, I1 }, 0 },
2778 { "shrA", { Eb, I1 }, 0 },
e4bdd679 2779 { "shlA", { Eb, I1 }, 0 },
bf890a93 2780 { "sarA", { Eb, I1 }, 0 },
252b5132 2781 },
1ceb70f8 2782 /* REG_D1 */
252b5132 2783 {
bf890a93
IT
2784 { "rolQ", { Ev, I1 }, 0 },
2785 { "rorQ", { Ev, I1 }, 0 },
2786 { "rclQ", { Ev, I1 }, 0 },
2787 { "rcrQ", { Ev, I1 }, 0 },
2788 { "shlQ", { Ev, I1 }, 0 },
2789 { "shrQ", { Ev, I1 }, 0 },
e4bdd679 2790 { "shlQ", { Ev, I1 }, 0 },
bf890a93 2791 { "sarQ", { Ev, I1 }, 0 },
252b5132 2792 },
1ceb70f8 2793 /* REG_D2 */
252b5132 2794 {
bf890a93
IT
2795 { "rolA", { Eb, CL }, 0 },
2796 { "rorA", { Eb, CL }, 0 },
2797 { "rclA", { Eb, CL }, 0 },
2798 { "rcrA", { Eb, CL }, 0 },
2799 { "shlA", { Eb, CL }, 0 },
2800 { "shrA", { Eb, CL }, 0 },
e4bdd679 2801 { "shlA", { Eb, CL }, 0 },
bf890a93 2802 { "sarA", { Eb, CL }, 0 },
252b5132 2803 },
1ceb70f8 2804 /* REG_D3 */
252b5132 2805 {
bf890a93
IT
2806 { "rolQ", { Ev, CL }, 0 },
2807 { "rorQ", { Ev, CL }, 0 },
2808 { "rclQ", { Ev, CL }, 0 },
2809 { "rcrQ", { Ev, CL }, 0 },
2810 { "shlQ", { Ev, CL }, 0 },
2811 { "shrQ", { Ev, CL }, 0 },
e4bdd679 2812 { "shlQ", { Ev, CL }, 0 },
bf890a93 2813 { "sarQ", { Ev, CL }, 0 },
252b5132 2814 },
1ceb70f8 2815 /* REG_F6 */
252b5132 2816 {
bf890a93 2817 { "testA", { Eb, Ib }, 0 },
7db2c588 2818 { "testA", { Eb, Ib }, 0 },
bf890a93
IT
2819 { "notA", { Ebh1 }, 0 },
2820 { "negA", { Ebh1 }, 0 },
2821 { "mulA", { Eb }, 0 }, /* Don't print the implicit %al register, */
2822 { "imulA", { Eb }, 0 }, /* to distinguish these opcodes from other */
2823 { "divA", { Eb }, 0 }, /* mul/imul opcodes. Do the same for div */
2824 { "idivA", { Eb }, 0 }, /* and idiv for consistency. */
252b5132 2825 },
1ceb70f8 2826 /* REG_F7 */
252b5132 2827 {
bf890a93 2828 { "testQ", { Ev, Iv }, 0 },
7db2c588 2829 { "testQ", { Ev, Iv }, 0 },
bf890a93
IT
2830 { "notQ", { Evh1 }, 0 },
2831 { "negQ", { Evh1 }, 0 },
2832 { "mulQ", { Ev }, 0 }, /* Don't print the implicit register. */
2833 { "imulQ", { Ev }, 0 },
2834 { "divQ", { Ev }, 0 },
2835 { "idivQ", { Ev }, 0 },
252b5132 2836 },
1ceb70f8 2837 /* REG_FE */
252b5132 2838 {
bf890a93
IT
2839 { "incA", { Ebh1 }, 0 },
2840 { "decA", { Ebh1 }, 0 },
252b5132 2841 },
1ceb70f8 2842 /* REG_FF */
252b5132 2843 {
bf890a93
IT
2844 { "incQ", { Evh1 }, 0 },
2845 { "decQ", { Evh1 }, 0 },
9fef80d6 2846 { "call{&|}", { NOTRACK, indirEv, BND }, 0 },
4a357820 2847 { MOD_TABLE (MOD_FF_REG_3) },
9fef80d6 2848 { "jmp{&|}", { NOTRACK, indirEv, BND }, 0 },
4a357820 2849 { MOD_TABLE (MOD_FF_REG_5) },
bf890a93 2850 { "pushU", { stackEv }, 0 },
592d1631 2851 { Bad_Opcode },
252b5132 2852 },
1ceb70f8 2853 /* REG_0F00 */
252b5132 2854 {
bf890a93
IT
2855 { "sldtD", { Sv }, 0 },
2856 { "strD", { Sv }, 0 },
2857 { "lldt", { Ew }, 0 },
2858 { "ltr", { Ew }, 0 },
2859 { "verr", { Ew }, 0 },
2860 { "verw", { Ew }, 0 },
592d1631
L
2861 { Bad_Opcode },
2862 { Bad_Opcode },
252b5132 2863 },
1ceb70f8 2864 /* REG_0F01 */
252b5132 2865 {
1ceb70f8
L
2866 { MOD_TABLE (MOD_0F01_REG_0) },
2867 { MOD_TABLE (MOD_0F01_REG_1) },
2868 { MOD_TABLE (MOD_0F01_REG_2) },
2869 { MOD_TABLE (MOD_0F01_REG_3) },
bf890a93 2870 { "smswD", { Sv }, 0 },
8eab4136 2871 { MOD_TABLE (MOD_0F01_REG_5) },
bf890a93 2872 { "lmsw", { Ew }, 0 },
1ceb70f8 2873 { MOD_TABLE (MOD_0F01_REG_7) },
252b5132 2874 },
b5b1fc4f 2875 /* REG_0F0D */
252b5132 2876 {
bf890a93
IT
2877 { "prefetch", { Mb }, 0 },
2878 { "prefetchw", { Mb }, 0 },
2879 { "prefetchwt1", { Mb }, 0 },
2880 { "prefetch", { Mb }, 0 },
2881 { "prefetch", { Mb }, 0 },
2882 { "prefetch", { Mb }, 0 },
2883 { "prefetch", { Mb }, 0 },
2884 { "prefetch", { Mb }, 0 },
252b5132 2885 },
1ceb70f8 2886 /* REG_0F18 */
252b5132 2887 {
1ceb70f8
L
2888 { MOD_TABLE (MOD_0F18_REG_0) },
2889 { MOD_TABLE (MOD_0F18_REG_1) },
2890 { MOD_TABLE (MOD_0F18_REG_2) },
2891 { MOD_TABLE (MOD_0F18_REG_3) },
d7189fa5
RM
2892 { MOD_TABLE (MOD_0F18_REG_4) },
2893 { MOD_TABLE (MOD_0F18_REG_5) },
2894 { MOD_TABLE (MOD_0F18_REG_6) },
2895 { MOD_TABLE (MOD_0F18_REG_7) },
252b5132 2896 },
f8687e93 2897 /* REG_0F1C_P_0_MOD_0 */
c48935d7
IT
2898 {
2899 { "cldemote", { Mb }, 0 },
2900 { "nopQ", { Ev }, 0 },
2901 { "nopQ", { Ev }, 0 },
2902 { "nopQ", { Ev }, 0 },
2903 { "nopQ", { Ev }, 0 },
2904 { "nopQ", { Ev }, 0 },
2905 { "nopQ", { Ev }, 0 },
2906 { "nopQ", { Ev }, 0 },
2907 },
f8687e93 2908 /* REG_0F1E_P_1_MOD_3 */
603555e5
L
2909 {
2910 { "nopQ", { Ev }, 0 },
2911 { "rdsspK", { Rdq }, PREFIX_OPCODE },
2912 { "nopQ", { Ev }, 0 },
2913 { "nopQ", { Ev }, 0 },
2914 { "nopQ", { Ev }, 0 },
2915 { "nopQ", { Ev }, 0 },
2916 { "nopQ", { Ev }, 0 },
f8687e93 2917 { RM_TABLE (RM_0F1E_P_1_MOD_3_REG_7) },
603555e5 2918 },
1ceb70f8 2919 /* REG_0F71 */
a6bd098c 2920 {
592d1631
L
2921 { Bad_Opcode },
2922 { Bad_Opcode },
1ceb70f8 2923 { MOD_TABLE (MOD_0F71_REG_2) },
592d1631 2924 { Bad_Opcode },
1ceb70f8 2925 { MOD_TABLE (MOD_0F71_REG_4) },
592d1631 2926 { Bad_Opcode },
1ceb70f8 2927 { MOD_TABLE (MOD_0F71_REG_6) },
a6bd098c 2928 },
1ceb70f8 2929 /* REG_0F72 */
a6bd098c 2930 {
592d1631
L
2931 { Bad_Opcode },
2932 { Bad_Opcode },
1ceb70f8 2933 { MOD_TABLE (MOD_0F72_REG_2) },
592d1631 2934 { Bad_Opcode },
1ceb70f8 2935 { MOD_TABLE (MOD_0F72_REG_4) },
592d1631 2936 { Bad_Opcode },
1ceb70f8 2937 { MOD_TABLE (MOD_0F72_REG_6) },
a6bd098c 2938 },
1ceb70f8 2939 /* REG_0F73 */
252b5132 2940 {
592d1631
L
2941 { Bad_Opcode },
2942 { Bad_Opcode },
1ceb70f8
L
2943 { MOD_TABLE (MOD_0F73_REG_2) },
2944 { MOD_TABLE (MOD_0F73_REG_3) },
592d1631
L
2945 { Bad_Opcode },
2946 { Bad_Opcode },
1ceb70f8
L
2947 { MOD_TABLE (MOD_0F73_REG_6) },
2948 { MOD_TABLE (MOD_0F73_REG_7) },
252b5132 2949 },
1ceb70f8 2950 /* REG_0FA6 */
252b5132 2951 {
bf890a93
IT
2952 { "montmul", { { OP_0f07, 0 } }, 0 },
2953 { "xsha1", { { OP_0f07, 0 } }, 0 },
2954 { "xsha256", { { OP_0f07, 0 } }, 0 },
4e7d34a6 2955 },
1ceb70f8 2956 /* REG_0FA7 */
4e7d34a6 2957 {
bf890a93
IT
2958 { "xstore-rng", { { OP_0f07, 0 } }, 0 },
2959 { "xcrypt-ecb", { { OP_0f07, 0 } }, 0 },
2960 { "xcrypt-cbc", { { OP_0f07, 0 } }, 0 },
2961 { "xcrypt-ctr", { { OP_0f07, 0 } }, 0 },
2962 { "xcrypt-cfb", { { OP_0f07, 0 } }, 0 },
2963 { "xcrypt-ofb", { { OP_0f07, 0 } }, 0 },
4e7d34a6 2964 },
1ceb70f8 2965 /* REG_0FAE */
4e7d34a6 2966 {
1ceb70f8
L
2967 { MOD_TABLE (MOD_0FAE_REG_0) },
2968 { MOD_TABLE (MOD_0FAE_REG_1) },
2969 { MOD_TABLE (MOD_0FAE_REG_2) },
2970 { MOD_TABLE (MOD_0FAE_REG_3) },
475a2301 2971 { MOD_TABLE (MOD_0FAE_REG_4) },
1ceb70f8
L
2972 { MOD_TABLE (MOD_0FAE_REG_5) },
2973 { MOD_TABLE (MOD_0FAE_REG_6) },
2974 { MOD_TABLE (MOD_0FAE_REG_7) },
252b5132 2975 },
1ceb70f8 2976 /* REG_0FBA */
252b5132 2977 {
592d1631
L
2978 { Bad_Opcode },
2979 { Bad_Opcode },
2980 { Bad_Opcode },
2981 { Bad_Opcode },
bf890a93
IT
2982 { "btQ", { Ev, Ib }, 0 },
2983 { "btsQ", { Evh1, Ib }, 0 },
2984 { "btrQ", { Evh1, Ib }, 0 },
2985 { "btcQ", { Evh1, Ib }, 0 },
c608c12e 2986 },
1ceb70f8 2987 /* REG_0FC7 */
c608c12e 2988 {
592d1631 2989 { Bad_Opcode },
bf890a93 2990 { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } }, 0 },
592d1631 2991 { Bad_Opcode },
963f3586
IT
2992 { MOD_TABLE (MOD_0FC7_REG_3) },
2993 { MOD_TABLE (MOD_0FC7_REG_4) },
2994 { MOD_TABLE (MOD_0FC7_REG_5) },
1ceb70f8
L
2995 { MOD_TABLE (MOD_0FC7_REG_6) },
2996 { MOD_TABLE (MOD_0FC7_REG_7) },
252b5132 2997 },
592a252b 2998 /* REG_VEX_0F71 */
c0f3af97 2999 {
592d1631
L
3000 { Bad_Opcode },
3001 { Bad_Opcode },
592a252b 3002 { MOD_TABLE (MOD_VEX_0F71_REG_2) },
592d1631 3003 { Bad_Opcode },
592a252b 3004 { MOD_TABLE (MOD_VEX_0F71_REG_4) },
592d1631 3005 { Bad_Opcode },
592a252b 3006 { MOD_TABLE (MOD_VEX_0F71_REG_6) },
c0f3af97 3007 },
592a252b 3008 /* REG_VEX_0F72 */
c0f3af97 3009 {
592d1631
L
3010 { Bad_Opcode },
3011 { Bad_Opcode },
592a252b 3012 { MOD_TABLE (MOD_VEX_0F72_REG_2) },
592d1631 3013 { Bad_Opcode },
592a252b 3014 { MOD_TABLE (MOD_VEX_0F72_REG_4) },
592d1631 3015 { Bad_Opcode },
592a252b 3016 { MOD_TABLE (MOD_VEX_0F72_REG_6) },
c0f3af97 3017 },
592a252b 3018 /* REG_VEX_0F73 */
c0f3af97 3019 {
592d1631
L
3020 { Bad_Opcode },
3021 { Bad_Opcode },
592a252b
L
3022 { MOD_TABLE (MOD_VEX_0F73_REG_2) },
3023 { MOD_TABLE (MOD_VEX_0F73_REG_3) },
592d1631
L
3024 { Bad_Opcode },
3025 { Bad_Opcode },
592a252b
L
3026 { MOD_TABLE (MOD_VEX_0F73_REG_6) },
3027 { MOD_TABLE (MOD_VEX_0F73_REG_7) },
c0f3af97 3028 },
592a252b 3029 /* REG_VEX_0FAE */
c0f3af97 3030 {
592d1631
L
3031 { Bad_Opcode },
3032 { Bad_Opcode },
592a252b
L
3033 { MOD_TABLE (MOD_VEX_0FAE_REG_2) },
3034 { MOD_TABLE (MOD_VEX_0FAE_REG_3) },
c0f3af97 3035 },
260cd341
LC
3036 /* REG_VEX_0F3849_X86_64_P_0_W_0_M_1 */
3037 {
3038 { RM_TABLE (RM_VEX_0F3849_X86_64_P_0_W_0_M_1_R_0) },
3039 },
f12dc422
L
3040 /* REG_VEX_0F38F3 */
3041 {
3042 { Bad_Opcode },
3043 { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_1) },
3044 { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_2) },
3045 { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_3) },
3046 },
467bbef0 3047 /* REG_0FXOP_09_01_L_0 */
2a2a0f38
QN
3048 {
3049 { Bad_Opcode },
467bbef0
JB
3050 { "blcfill", { VexGdq, Edq }, 0 },
3051 { "blsfill", { VexGdq, Edq }, 0 },
3052 { "blcs", { VexGdq, Edq }, 0 },
3053 { "tzmsk", { VexGdq, Edq }, 0 },
3054 { "blcic", { VexGdq, Edq }, 0 },
3055 { "blsic", { VexGdq, Edq }, 0 },
3056 { "t1mskc", { VexGdq, Edq }, 0 },
2a2a0f38 3057 },
467bbef0 3058 /* REG_0FXOP_09_02_L_0 */
2a2a0f38
QN
3059 {
3060 { Bad_Opcode },
467bbef0 3061 { "blcmsk", { VexGdq, Edq }, 0 },
2a2a0f38
QN
3062 { Bad_Opcode },
3063 { Bad_Opcode },
3064 { Bad_Opcode },
3065 { Bad_Opcode },
467bbef0
JB
3066 { "blci", { VexGdq, Edq }, 0 },
3067 },
3068 /* REG_0FXOP_09_12_M_1_L_0 */
3069 {
3070 { "llwpcb", { Edq }, 0 },
3071 { "slwpcb", { Edq }, 0 },
3072 },
3073 /* REG_0FXOP_0A_12_L_0 */
3074 {
3075 { "lwpins", { VexGdq, Ed, Id }, 0 },
3076 { "lwpval", { VexGdq, Ed, Id }, 0 },
2a2a0f38 3077 },
ad692897
L
3078
3079#include "i386-dis-evex-reg.h"
4e7d34a6
L
3080};
3081
1ceb70f8
L
3082static const struct dis386 prefix_table[][4] = {
3083 /* PREFIX_90 */
252b5132 3084 {
bf890a93
IT
3085 { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } }, 0 },
3086 { "pause", { XX }, 0 },
3087 { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } }, 0 },
507bd325 3088 { NULL, { { NULL, 0 } }, PREFIX_IGNORED }
0f10071e 3089 },
4e7d34a6 3090
f9630fa6 3091 /* PREFIX_0F01_REG_3_RM_1 */
a847e322
JB
3092 {
3093 { "vmmcall", { Skip_MODRM }, 0 },
3094 { "vmgexit", { Skip_MODRM }, 0 },
d27c357a
JB
3095 { Bad_Opcode },
3096 { "vmgexit", { Skip_MODRM }, 0 },
a847e322
JB
3097 },
3098
f8687e93 3099 /* PREFIX_0F01_REG_5_MOD_0 */
603555e5
L
3100 {
3101 { Bad_Opcode },
3102 { "rstorssp", { Mq }, PREFIX_OPCODE },
3103 },
3104
f8687e93 3105 /* PREFIX_0F01_REG_5_MOD_3_RM_0 */
603555e5 3106 {
4b27d27c 3107 { "serialize", { Skip_MODRM }, PREFIX_OPCODE },
2234eee6 3108 { "setssbsy", { Skip_MODRM }, PREFIX_OPCODE },
bb651e8b 3109 { Bad_Opcode },
efe30057 3110 { "xsusldtrk", { Skip_MODRM }, PREFIX_OPCODE },
bb651e8b
CL
3111 },
3112
3113 /* PREFIX_0F01_REG_5_MOD_3_RM_1 */
3114 {
3115 { Bad_Opcode },
3116 { Bad_Opcode },
3117 { Bad_Opcode },
3118 { "xresldtrk", { Skip_MODRM }, PREFIX_OPCODE },
603555e5
L
3119 },
3120
f8687e93 3121 /* PREFIX_0F01_REG_5_MOD_3_RM_2 */
603555e5
L
3122 {
3123 { Bad_Opcode },
c2f76402 3124 { "saveprevssp", { Skip_MODRM }, PREFIX_OPCODE },
603555e5
L
3125 },
3126
267b8516
JB
3127 /* PREFIX_0F01_REG_7_MOD_3_RM_2 */
3128 {
3129 { "monitorx", { { OP_Monitor, 0 } }, 0 },
142861df 3130 { "mcommit", { Skip_MODRM }, 0 },
267b8516
JB
3131 },
3132
3133 /* PREFIX_0F01_REG_7_MOD_3_RM_3 */
3134 {
7abb8d81 3135 { "mwaitx", { { OP_Mwait, eBX_reg } }, 0 },
267b8516
JB
3136 },
3137
3233d7d0
IT
3138 /* PREFIX_0F09 */
3139 {
3140 { "wbinvd", { XX }, 0 },
3141 { "wbnoinvd", { XX }, 0 },
3142 },
3143
1ceb70f8 3144 /* PREFIX_0F10 */
cc0ec051 3145 {
507bd325
L
3146 { "movups", { XM, EXx }, PREFIX_OPCODE },
3147 { "movss", { XM, EXd }, PREFIX_OPCODE },
3148 { "movupd", { XM, EXx }, PREFIX_OPCODE },
3149 { "movsd", { XM, EXq }, PREFIX_OPCODE },
30d1c836 3150 },
4e7d34a6 3151
1ceb70f8 3152 /* PREFIX_0F11 */
30d1c836 3153 {
507bd325
L
3154 { "movups", { EXxS, XM }, PREFIX_OPCODE },
3155 { "movss", { EXdS, XM }, PREFIX_OPCODE },
3156 { "movupd", { EXxS, XM }, PREFIX_OPCODE },
3157 { "movsd", { EXqS, XM }, PREFIX_OPCODE },
4e7d34a6 3158 },
252b5132 3159
1ceb70f8 3160 /* PREFIX_0F12 */
c608c12e 3161 {
1ceb70f8 3162 { MOD_TABLE (MOD_0F12_PREFIX_0) },
507bd325 3163 { "movsldup", { XM, EXx }, PREFIX_OPCODE },
18897deb 3164 { MOD_TABLE (MOD_0F12_PREFIX_2) },
507bd325 3165 { "movddup", { XM, EXq }, PREFIX_OPCODE },
c608c12e 3166 },
4e7d34a6 3167
1ceb70f8 3168 /* PREFIX_0F16 */
c608c12e 3169 {
1ceb70f8 3170 { MOD_TABLE (MOD_0F16_PREFIX_0) },
507bd325 3171 { "movshdup", { XM, EXx }, PREFIX_OPCODE },
18897deb 3172 { MOD_TABLE (MOD_0F16_PREFIX_2) },
c608c12e 3173 },
4e7d34a6 3174
7e8b059b
L
3175 /* PREFIX_0F1A */
3176 {
3177 { MOD_TABLE (MOD_0F1A_PREFIX_0) },
bf890a93
IT
3178 { "bndcl", { Gbnd, Ev_bnd }, 0 },
3179 { "bndmov", { Gbnd, Ebnd }, 0 },
3180 { "bndcu", { Gbnd, Ev_bnd }, 0 },
7e8b059b
L
3181 },
3182
3183 /* PREFIX_0F1B */
3184 {
3185 { MOD_TABLE (MOD_0F1B_PREFIX_0) },
3186 { MOD_TABLE (MOD_0F1B_PREFIX_1) },
9f79e886 3187 { "bndmov", { EbndS, Gbnd }, 0 },
bf890a93 3188 { "bndcn", { Gbnd, Ev_bnd }, 0 },
7e8b059b
L
3189 },
3190
c48935d7
IT
3191 /* PREFIX_0F1C */
3192 {
3193 { MOD_TABLE (MOD_0F1C_PREFIX_0) },
3194 { "nopQ", { Ev }, PREFIX_OPCODE },
3195 { "nopQ", { Ev }, PREFIX_OPCODE },
3196 { "nopQ", { Ev }, PREFIX_OPCODE },
3197 },
3198
603555e5
L
3199 /* PREFIX_0F1E */
3200 {
3201 { "nopQ", { Ev }, PREFIX_OPCODE },
3202 { MOD_TABLE (MOD_0F1E_PREFIX_1) },
3203 { "nopQ", { Ev }, PREFIX_OPCODE },
3204 { "nopQ", { Ev }, PREFIX_OPCODE },
3205 },
3206
1ceb70f8 3207 /* PREFIX_0F2A */
c608c12e 3208 {
507bd325 3209 { "cvtpi2ps", { XM, EMCq }, PREFIX_OPCODE },
b24d668c 3210 { "cvtsi2ss{%LQ|}", { XM, Edq }, PREFIX_OPCODE },
507bd325 3211 { "cvtpi2pd", { XM, EMCq }, PREFIX_OPCODE },
b24d668c 3212 { "cvtsi2sd{%LQ|}", { XM, Edq }, 0 },
c608c12e 3213 },
4e7d34a6 3214
1ceb70f8 3215 /* PREFIX_0F2B */
c608c12e 3216 {
75c135a8
L
3217 { MOD_TABLE (MOD_0F2B_PREFIX_0) },
3218 { MOD_TABLE (MOD_0F2B_PREFIX_1) },
3219 { MOD_TABLE (MOD_0F2B_PREFIX_2) },
3220 { MOD_TABLE (MOD_0F2B_PREFIX_3) },
c608c12e 3221 },
4e7d34a6 3222
1ceb70f8 3223 /* PREFIX_0F2C */
c608c12e 3224 {
507bd325 3225 { "cvttps2pi", { MXC, EXq }, PREFIX_OPCODE },
e1a1babd 3226 { "cvttss2si", { Gdq, EXd }, PREFIX_OPCODE },
507bd325 3227 { "cvttpd2pi", { MXC, EXx }, PREFIX_OPCODE },
e1a1babd 3228 { "cvttsd2si", { Gdq, EXq }, PREFIX_OPCODE },
c608c12e 3229 },
4e7d34a6 3230
1ceb70f8 3231 /* PREFIX_0F2D */
c608c12e 3232 {
507bd325 3233 { "cvtps2pi", { MXC, EXq }, PREFIX_OPCODE },
e1a1babd 3234 { "cvtss2si", { Gdq, EXd }, PREFIX_OPCODE },
507bd325 3235 { "cvtpd2pi", { MXC, EXx }, PREFIX_OPCODE },
e1a1babd 3236 { "cvtsd2si", { Gdq, EXq }, PREFIX_OPCODE },
c608c12e 3237 },
4e7d34a6 3238
1ceb70f8 3239 /* PREFIX_0F2E */
c608c12e 3240 {
bf890a93 3241 { "ucomiss",{ XM, EXd }, 0 },
592d1631 3242 { Bad_Opcode },
bf890a93 3243 { "ucomisd",{ XM, EXq }, 0 },
c608c12e 3244 },
4e7d34a6 3245
1ceb70f8 3246 /* PREFIX_0F2F */
c608c12e 3247 {
bf890a93 3248 { "comiss", { XM, EXd }, 0 },
592d1631 3249 { Bad_Opcode },
bf890a93 3250 { "comisd", { XM, EXq }, 0 },
c608c12e 3251 },
4e7d34a6 3252
1ceb70f8 3253 /* PREFIX_0F51 */
c608c12e 3254 {
507bd325
L
3255 { "sqrtps", { XM, EXx }, PREFIX_OPCODE },
3256 { "sqrtss", { XM, EXd }, PREFIX_OPCODE },
3257 { "sqrtpd", { XM, EXx }, PREFIX_OPCODE },
3258 { "sqrtsd", { XM, EXq }, PREFIX_OPCODE },
c608c12e 3259 },
4e7d34a6 3260
1ceb70f8 3261 /* PREFIX_0F52 */
c608c12e 3262 {
507bd325
L
3263 { "rsqrtps",{ XM, EXx }, PREFIX_OPCODE },
3264 { "rsqrtss",{ XM, EXd }, PREFIX_OPCODE },
c608c12e 3265 },
4e7d34a6 3266
1ceb70f8 3267 /* PREFIX_0F53 */
c608c12e 3268 {
507bd325
L
3269 { "rcpps", { XM, EXx }, PREFIX_OPCODE },
3270 { "rcpss", { XM, EXd }, PREFIX_OPCODE },
c608c12e 3271 },
4e7d34a6 3272
1ceb70f8 3273 /* PREFIX_0F58 */
c608c12e 3274 {
507bd325
L
3275 { "addps", { XM, EXx }, PREFIX_OPCODE },
3276 { "addss", { XM, EXd }, PREFIX_OPCODE },
3277 { "addpd", { XM, EXx }, PREFIX_OPCODE },
3278 { "addsd", { XM, EXq }, PREFIX_OPCODE },
c608c12e 3279 },
4e7d34a6 3280
1ceb70f8 3281 /* PREFIX_0F59 */
c608c12e 3282 {
507bd325
L
3283 { "mulps", { XM, EXx }, PREFIX_OPCODE },
3284 { "mulss", { XM, EXd }, PREFIX_OPCODE },
3285 { "mulpd", { XM, EXx }, PREFIX_OPCODE },
3286 { "mulsd", { XM, EXq }, PREFIX_OPCODE },
041bd2e0 3287 },
4e7d34a6 3288
1ceb70f8 3289 /* PREFIX_0F5A */
041bd2e0 3290 {
507bd325
L
3291 { "cvtps2pd", { XM, EXq }, PREFIX_OPCODE },
3292 { "cvtss2sd", { XM, EXd }, PREFIX_OPCODE },
3293 { "cvtpd2ps", { XM, EXx }, PREFIX_OPCODE },
3294 { "cvtsd2ss", { XM, EXq }, PREFIX_OPCODE },
041bd2e0 3295 },
4e7d34a6 3296
1ceb70f8 3297 /* PREFIX_0F5B */
041bd2e0 3298 {
507bd325
L
3299 { "cvtdq2ps", { XM, EXx }, PREFIX_OPCODE },
3300 { "cvttps2dq", { XM, EXx }, PREFIX_OPCODE },
3301 { "cvtps2dq", { XM, EXx }, PREFIX_OPCODE },
041bd2e0 3302 },
4e7d34a6 3303
1ceb70f8 3304 /* PREFIX_0F5C */
041bd2e0 3305 {
507bd325
L
3306 { "subps", { XM, EXx }, PREFIX_OPCODE },
3307 { "subss", { XM, EXd }, PREFIX_OPCODE },
3308 { "subpd", { XM, EXx }, PREFIX_OPCODE },
3309 { "subsd", { XM, EXq }, PREFIX_OPCODE },
041bd2e0 3310 },
4e7d34a6 3311
1ceb70f8 3312 /* PREFIX_0F5D */
041bd2e0 3313 {
507bd325
L
3314 { "minps", { XM, EXx }, PREFIX_OPCODE },
3315 { "minss", { XM, EXd }, PREFIX_OPCODE },
3316 { "minpd", { XM, EXx }, PREFIX_OPCODE },
3317 { "minsd", { XM, EXq }, PREFIX_OPCODE },
041bd2e0 3318 },
4e7d34a6 3319
1ceb70f8 3320 /* PREFIX_0F5E */
041bd2e0 3321 {
507bd325
L
3322 { "divps", { XM, EXx }, PREFIX_OPCODE },
3323 { "divss", { XM, EXd }, PREFIX_OPCODE },
3324 { "divpd", { XM, EXx }, PREFIX_OPCODE },
3325 { "divsd", { XM, EXq }, PREFIX_OPCODE },
041bd2e0 3326 },
4e7d34a6 3327
1ceb70f8 3328 /* PREFIX_0F5F */
041bd2e0 3329 {
507bd325
L
3330 { "maxps", { XM, EXx }, PREFIX_OPCODE },
3331 { "maxss", { XM, EXd }, PREFIX_OPCODE },
3332 { "maxpd", { XM, EXx }, PREFIX_OPCODE },
3333 { "maxsd", { XM, EXq }, PREFIX_OPCODE },
041bd2e0 3334 },
4e7d34a6 3335
1ceb70f8 3336 /* PREFIX_0F60 */
041bd2e0 3337 {
507bd325 3338 { "punpcklbw",{ MX, EMd }, PREFIX_OPCODE },
592d1631 3339 { Bad_Opcode },
507bd325 3340 { "punpcklbw",{ MX, EMx }, PREFIX_OPCODE },
041bd2e0 3341 },
4e7d34a6 3342
1ceb70f8 3343 /* PREFIX_0F61 */
041bd2e0 3344 {
507bd325 3345 { "punpcklwd",{ MX, EMd }, PREFIX_OPCODE },
592d1631 3346 { Bad_Opcode },
507bd325 3347 { "punpcklwd",{ MX, EMx }, PREFIX_OPCODE },
041bd2e0 3348 },
4e7d34a6 3349
1ceb70f8 3350 /* PREFIX_0F62 */
041bd2e0 3351 {
507bd325 3352 { "punpckldq",{ MX, EMd }, PREFIX_OPCODE },
592d1631 3353 { Bad_Opcode },
507bd325 3354 { "punpckldq",{ MX, EMx }, PREFIX_OPCODE },
041bd2e0 3355 },
4e7d34a6 3356
1ceb70f8 3357 /* PREFIX_0F6F */
ca164297 3358 {
507bd325
L
3359 { "movq", { MX, EM }, PREFIX_OPCODE },
3360 { "movdqu", { XM, EXx }, PREFIX_OPCODE },
3361 { "movdqa", { XM, EXx }, PREFIX_OPCODE },
ca164297 3362 },
4e7d34a6 3363
1ceb70f8 3364 /* PREFIX_0F70 */
4e7d34a6 3365 {
507bd325
L
3366 { "pshufw", { MX, EM, Ib }, PREFIX_OPCODE },
3367 { "pshufhw",{ XM, EXx, Ib }, PREFIX_OPCODE },
3368 { "pshufd", { XM, EXx, Ib }, PREFIX_OPCODE },
3369 { "pshuflw",{ XM, EXx, Ib }, PREFIX_OPCODE },
4e7d34a6
L
3370 },
3371
1ceb70f8 3372 /* PREFIX_0F78 */
4e7d34a6 3373 {
bf890a93 3374 {"vmread", { Em, Gm }, 0 },
592d1631 3375 { Bad_Opcode },
bf890a93
IT
3376 {"extrq", { XS, Ib, Ib }, 0 },
3377 {"insertq", { XM, XS, Ib, Ib }, 0 },
4e7d34a6
L
3378 },
3379
1ceb70f8 3380 /* PREFIX_0F79 */
4e7d34a6 3381 {
bf890a93 3382 {"vmwrite", { Gm, Em }, 0 },
592d1631 3383 { Bad_Opcode },
bf890a93
IT
3384 {"extrq", { XM, XS }, 0 },
3385 {"insertq", { XM, XS }, 0 },
4e7d34a6
L
3386 },
3387
1ceb70f8 3388 /* PREFIX_0F7C */
ca164297 3389 {
592d1631
L
3390 { Bad_Opcode },
3391 { Bad_Opcode },
507bd325
L
3392 { "haddpd", { XM, EXx }, PREFIX_OPCODE },
3393 { "haddps", { XM, EXx }, PREFIX_OPCODE },
ca164297 3394 },
4e7d34a6 3395
1ceb70f8 3396 /* PREFIX_0F7D */
ca164297 3397 {
592d1631
L
3398 { Bad_Opcode },
3399 { Bad_Opcode },
507bd325
L
3400 { "hsubpd", { XM, EXx }, PREFIX_OPCODE },
3401 { "hsubps", { XM, EXx }, PREFIX_OPCODE },
ca164297 3402 },
4e7d34a6 3403
1ceb70f8 3404 /* PREFIX_0F7E */
ca164297 3405 {
507bd325
L
3406 { "movK", { Edq, MX }, PREFIX_OPCODE },
3407 { "movq", { XM, EXq }, PREFIX_OPCODE },
3408 { "movK", { Edq, XM }, PREFIX_OPCODE },
ca164297 3409 },
4e7d34a6 3410
1ceb70f8 3411 /* PREFIX_0F7F */
ca164297 3412 {
507bd325
L
3413 { "movq", { EMS, MX }, PREFIX_OPCODE },
3414 { "movdqu", { EXxS, XM }, PREFIX_OPCODE },
3415 { "movdqa", { EXxS, XM }, PREFIX_OPCODE },
ca164297 3416 },
4e7d34a6 3417
f8687e93 3418 /* PREFIX_0FAE_REG_0_MOD_3 */
c7b8aa3a
L
3419 {
3420 { Bad_Opcode },
bf890a93 3421 { "rdfsbase", { Ev }, 0 },
c7b8aa3a
L
3422 },
3423
f8687e93 3424 /* PREFIX_0FAE_REG_1_MOD_3 */
c7b8aa3a
L
3425 {
3426 { Bad_Opcode },
bf890a93 3427 { "rdgsbase", { Ev }, 0 },
c7b8aa3a
L
3428 },
3429
f8687e93 3430 /* PREFIX_0FAE_REG_2_MOD_3 */
c7b8aa3a
L
3431 {
3432 { Bad_Opcode },
bf890a93 3433 { "wrfsbase", { Ev }, 0 },
c7b8aa3a
L
3434 },
3435
f8687e93 3436 /* PREFIX_0FAE_REG_3_MOD_3 */
c7b8aa3a
L
3437 {
3438 { Bad_Opcode },
bf890a93 3439 { "wrgsbase", { Ev }, 0 },
c7b8aa3a
L
3440 },
3441
f8687e93 3442 /* PREFIX_0FAE_REG_4_MOD_0 */
6b40c462
L
3443 {
3444 { "xsave", { FXSAVE }, 0 },
b24d668c 3445 { "ptwrite{%LQ|}", { Edq }, 0 },
6b40c462
L
3446 },
3447
f8687e93 3448 /* PREFIX_0FAE_REG_4_MOD_3 */
6b40c462
L
3449 {
3450 { Bad_Opcode },
b24d668c 3451 { "ptwrite{%LQ|}", { Edq }, 0 },
6b40c462
L
3452 },
3453
f8687e93 3454 /* PREFIX_0FAE_REG_5_MOD_0 */
603555e5
L
3455 {
3456 { "xrstor", { FXSAVE }, PREFIX_OPCODE },
2234eee6
L
3457 },
3458
f8687e93 3459 /* PREFIX_0FAE_REG_5_MOD_3 */
2234eee6
L
3460 {
3461 { "lfence", { Skip_MODRM }, 0 },
3462 { "incsspK", { Rdq }, PREFIX_OPCODE },
603555e5
L
3463 },
3464
f8687e93 3465 /* PREFIX_0FAE_REG_6_MOD_0 */
c5e7287a 3466 {
603555e5
L
3467 { "xsaveopt", { FXSAVE }, PREFIX_OPCODE },
3468 { "clrssbsy", { Mq }, PREFIX_OPCODE },
3469 { "clwb", { Mb }, PREFIX_OPCODE },
c5e7287a
IT
3470 },
3471
f8687e93 3472 /* PREFIX_0FAE_REG_6_MOD_3 */
de89d0a3 3473 {
f8687e93 3474 { RM_TABLE (RM_0FAE_REG_6_MOD_3_P_0) },
de89d0a3 3475 { "umonitor", { Eva }, PREFIX_OPCODE },
ae1d3843
L
3476 { "tpause", { Edq }, PREFIX_OPCODE },
3477 { "umwait", { Edq }, PREFIX_OPCODE },
de89d0a3
IT
3478 },
3479
f8687e93 3480 /* PREFIX_0FAE_REG_7_MOD_0 */
963f3586 3481 {
bf890a93 3482 { "clflush", { Mb }, 0 },
963f3586 3483 { Bad_Opcode },
bf890a93 3484 { "clflushopt", { Mb }, 0 },
963f3586
IT
3485 },
3486
1ceb70f8 3487 /* PREFIX_0FB8 */
ca164297 3488 {
592d1631 3489 { Bad_Opcode },
bf890a93 3490 { "popcntS", { Gv, Ev }, 0 },
ca164297 3491 },
4e7d34a6 3492
f12dc422
L
3493 /* PREFIX_0FBC */
3494 {
bf890a93
IT
3495 { "bsfS", { Gv, Ev }, 0 },
3496 { "tzcntS", { Gv, Ev }, 0 },
3497 { "bsfS", { Gv, Ev }, 0 },
f12dc422
L
3498 },
3499
1ceb70f8 3500 /* PREFIX_0FBD */
050dfa73 3501 {
bf890a93
IT
3502 { "bsrS", { Gv, Ev }, 0 },
3503 { "lzcntS", { Gv, Ev }, 0 },
3504 { "bsrS", { Gv, Ev }, 0 },
050dfa73
MM
3505 },
3506
1ceb70f8 3507 /* PREFIX_0FC2 */
050dfa73 3508 {
507bd325
L
3509 { "cmpps", { XM, EXx, CMP }, PREFIX_OPCODE },
3510 { "cmpss", { XM, EXd, CMP }, PREFIX_OPCODE },
3511 { "cmppd", { XM, EXx, CMP }, PREFIX_OPCODE },
3512 { "cmpsd", { XM, EXq, CMP }, PREFIX_OPCODE },
050dfa73 3513 },
246c51aa 3514
f8687e93 3515 /* PREFIX_0FC3_MOD_0 */
4ee52178 3516 {
e1a1babd 3517 { "movntiS", { Edq, Gdq }, PREFIX_OPCODE },
4ee52178
L
3518 },
3519
f8687e93 3520 /* PREFIX_0FC7_REG_6_MOD_0 */
92fddf8e 3521 {
bf890a93
IT
3522 { "vmptrld",{ Mq }, 0 },
3523 { "vmxon", { Mq }, 0 },
3524 { "vmclear",{ Mq }, 0 },
92fddf8e
L
3525 },
3526
f8687e93 3527 /* PREFIX_0FC7_REG_6_MOD_3 */
f24bcbaa
L
3528 {
3529 { "rdrand", { Ev }, 0 },
3530 { Bad_Opcode },
3531 { "rdrand", { Ev }, 0 }
3532 },
3533
f8687e93 3534 /* PREFIX_0FC7_REG_7_MOD_3 */
f24bcbaa
L
3535 {
3536 { "rdseed", { Ev }, 0 },
8bc52696 3537 { "rdpid", { Em }, 0 },
f24bcbaa
L
3538 { "rdseed", { Ev }, 0 },
3539 },
3540
1ceb70f8 3541 /* PREFIX_0FD0 */
050dfa73 3542 {
592d1631
L
3543 { Bad_Opcode },
3544 { Bad_Opcode },
bf890a93
IT
3545 { "addsubpd", { XM, EXx }, 0 },
3546 { "addsubps", { XM, EXx }, 0 },
246c51aa 3547 },
050dfa73 3548
1ceb70f8 3549 /* PREFIX_0FD6 */
050dfa73 3550 {
592d1631 3551 { Bad_Opcode },
bf890a93
IT
3552 { "movq2dq",{ XM, MS }, 0 },
3553 { "movq", { EXqS, XM }, 0 },
3554 { "movdq2q",{ MX, XS }, 0 },
050dfa73
MM
3555 },
3556
1ceb70f8 3557 /* PREFIX_0FE6 */
7918206c 3558 {
592d1631 3559 { Bad_Opcode },
507bd325
L
3560 { "cvtdq2pd", { XM, EXq }, PREFIX_OPCODE },
3561 { "cvttpd2dq", { XM, EXx }, PREFIX_OPCODE },
3562 { "cvtpd2dq", { XM, EXx }, PREFIX_OPCODE },
7918206c 3563 },
8b38ad71 3564
1ceb70f8 3565 /* PREFIX_0FE7 */
8b38ad71 3566 {
507bd325 3567 { "movntq", { Mq, MX }, PREFIX_OPCODE },
592d1631 3568 { Bad_Opcode },
75c135a8 3569 { MOD_TABLE (MOD_0FE7_PREFIX_2) },
4e7d34a6
L
3570 },
3571
1ceb70f8 3572 /* PREFIX_0FF0 */
4e7d34a6 3573 {
592d1631
L
3574 { Bad_Opcode },
3575 { Bad_Opcode },
3576 { Bad_Opcode },
1ceb70f8 3577 { MOD_TABLE (MOD_0FF0_PREFIX_3) },
4e7d34a6
L
3578 },
3579
1ceb70f8 3580 /* PREFIX_0FF7 */
4e7d34a6 3581 {
507bd325 3582 { "maskmovq", { MX, MS }, PREFIX_OPCODE },
592d1631 3583 { Bad_Opcode },
507bd325 3584 { "maskmovdqu", { XM, XS }, PREFIX_OPCODE },
8b38ad71 3585 },
42903f7f 3586
a0046408
L
3587 /* PREFIX_0F38C8 */
3588 {
507bd325 3589 { "sha1nexte", { XM, EXxmm }, PREFIX_OPCODE },
a0046408
L
3590 },
3591
3592 /* PREFIX_0F38C9 */
3593 {
507bd325 3594 { "sha1msg1", { XM, EXxmm }, PREFIX_OPCODE },
a0046408
L
3595 },
3596
3597 /* PREFIX_0F38CA */
3598 {
507bd325 3599 { "sha1msg2", { XM, EXxmm }, PREFIX_OPCODE },
a0046408
L
3600 },
3601
3602 /* PREFIX_0F38CB */
3603 {
507bd325 3604 { "sha256rnds2", { XM, EXxmm, XMM0 }, PREFIX_OPCODE },
a0046408
L
3605 },
3606
3607 /* PREFIX_0F38CC */
3608 {
507bd325 3609 { "sha256msg1", { XM, EXxmm }, PREFIX_OPCODE },
a0046408
L
3610 },
3611
3612 /* PREFIX_0F38CD */
3613 {
507bd325 3614 { "sha256msg2", { XM, EXxmm }, PREFIX_OPCODE },
a0046408
L
3615 },
3616
1ceb70f8 3617 /* PREFIX_0F38F0 */
4e7d34a6 3618 {
9ab00b61 3619 { "movbeS", { Gv, Mv }, PREFIX_OPCODE },
592d1631 3620 { Bad_Opcode },
9ab00b61 3621 { "movbeS", { Gv, Mv }, PREFIX_OPCODE },
2875b28a 3622 { "crc32A", { Gdq, Eb }, PREFIX_OPCODE },
4e7d34a6
L
3623 },
3624
1ceb70f8 3625 /* PREFIX_0F38F1 */
4e7d34a6 3626 {
9ab00b61 3627 { "movbeS", { Mv, Gv }, PREFIX_OPCODE },
592d1631 3628 { Bad_Opcode },
9ab00b61 3629 { "movbeS", { Mv, Gv }, PREFIX_OPCODE },
2875b28a 3630 { "crc32Q", { Gdq, Ev }, PREFIX_OPCODE },
4e7d34a6
L
3631 },
3632
603555e5
L
3633 /* PREFIX_0F38F6 */
3634 {
3635 { MOD_TABLE (MOD_0F38F6_PREFIX_0) },
507bd325
L
3636 { "adoxS", { Gdq, Edq}, PREFIX_OPCODE },
3637 { "adcxS", { Gdq, Edq}, PREFIX_OPCODE },
e2e1fcde
L
3638 { Bad_Opcode },
3639 },
3640
c0a30a9f
L
3641 /* PREFIX_0F38F8 */
3642 {
3643 { Bad_Opcode },
5d79adc4 3644 { MOD_TABLE (MOD_0F38F8_PREFIX_1) },
c0a30a9f 3645 { MOD_TABLE (MOD_0F38F8_PREFIX_2) },
5d79adc4 3646 { MOD_TABLE (MOD_0F38F8_PREFIX_3) },
c0a30a9f
L
3647 },
3648
3649 /* PREFIX_0F38F9 */
3650 {
3651 { MOD_TABLE (MOD_0F38F9_PREFIX_0) },
3652 },
3653
7531c613 3654 /* PREFIX_0F3ACC */
42903f7f 3655 {
7531c613 3656 { "sha1rnds4", { XM, EXxmm, Ib }, PREFIX_OPCODE },
42903f7f
L
3657 },
3658
7531c613 3659 /* PREFIX_VEX_0F10 */
42903f7f 3660 {
7531c613
JB
3661 { "vmovups", { XM, EXx }, 0 },
3662 { "vmovss", { XMScalar, VexScalarR, EXxmm_md }, 0 },
3663 { "vmovupd", { XM, EXx }, 0 },
3664 { "vmovsd", { XMScalar, VexScalarR, EXxmm_mq }, 0 },
42903f7f
L
3665 },
3666
7531c613 3667 /* PREFIX_VEX_0F11 */
42903f7f 3668 {
7531c613
JB
3669 { "vmovups", { EXxS, XM }, 0 },
3670 { "vmovss", { EXdS, VexScalarR, XMScalar }, 0 },
3671 { "vmovupd", { EXxS, XM }, 0 },
3672 { "vmovsd", { EXqS, VexScalarR, XMScalar }, 0 },
42903f7f
L
3673 },
3674
7531c613 3675 /* PREFIX_VEX_0F12 */
42903f7f 3676 {
7531c613
JB
3677 { MOD_TABLE (MOD_VEX_0F12_PREFIX_0) },
3678 { "vmovsldup", { XM, EXx }, 0 },
3679 { MOD_TABLE (MOD_VEX_0F12_PREFIX_2) },
3680 { "vmovddup", { XM, EXymmq }, 0 },
42903f7f
L
3681 },
3682
7531c613 3683 /* PREFIX_VEX_0F16 */
42903f7f 3684 {
7531c613
JB
3685 { MOD_TABLE (MOD_VEX_0F16_PREFIX_0) },
3686 { "vmovshdup", { XM, EXx }, 0 },
3687 { MOD_TABLE (MOD_VEX_0F16_PREFIX_2) },
5f754f58 3688 },
7c52e0e8 3689
592a252b 3690 /* PREFIX_VEX_0F2A */
5f754f58 3691 {
592d1631 3692 { Bad_Opcode },
b24d668c 3693 { "vcvtsi2ss{%LQ|}", { XMScalar, VexScalar, Edq }, 0 },
592d1631 3694 { Bad_Opcode },
b24d668c 3695 { "vcvtsi2sd{%LQ|}", { XMScalar, VexScalar, Edq }, 0 },
5f754f58 3696 },
7c52e0e8 3697
592a252b 3698 /* PREFIX_VEX_0F2C */
5f754f58 3699 {
592d1631 3700 { Bad_Opcode },
17d3c7ec 3701 { "vcvttss2si", { Gdq, EXxmm_md, EXxEVexS }, 0 },
592d1631 3702 { Bad_Opcode },
17d3c7ec 3703 { "vcvttsd2si", { Gdq, EXxmm_mq, EXxEVexS }, 0 },
5f754f58 3704 },
7c52e0e8 3705
592a252b 3706 /* PREFIX_VEX_0F2D */
7c52e0e8 3707 {
592d1631 3708 { Bad_Opcode },
17d3c7ec 3709 { "vcvtss2si", { Gdq, EXxmm_md, EXxEVexR }, 0 },
592d1631 3710 { Bad_Opcode },
17d3c7ec 3711 { "vcvtsd2si", { Gdq, EXxmm_mq, EXxEVexR }, 0 },
7c52e0e8
L
3712 },
3713
592a252b 3714 /* PREFIX_VEX_0F2E */
7c52e0e8 3715 {
17d3c7ec 3716 { "vucomisX", { XMScalar, EXxmm_md, EXxEVexS }, PREFIX_OPCODE },
592d1631 3717 { Bad_Opcode },
17d3c7ec 3718 { "vucomisX", { XMScalar, EXxmm_mq, EXxEVexS }, PREFIX_OPCODE },
7c52e0e8
L
3719 },
3720
592a252b 3721 /* PREFIX_VEX_0F2F */
7c52e0e8 3722 {
17d3c7ec 3723 { "vcomisX", { XMScalar, EXxmm_md, EXxEVexS }, PREFIX_OPCODE },
592d1631 3724 { Bad_Opcode },
17d3c7ec 3725 { "vcomisX", { XMScalar, EXxmm_mq, EXxEVexS }, PREFIX_OPCODE },
7c52e0e8
L
3726 },
3727
43234a1e
L
3728 /* PREFIX_VEX_0F41 */
3729 {
3730 { VEX_LEN_TABLE (VEX_LEN_0F41_P_0) },
1ba585e8
IT
3731 { Bad_Opcode },
3732 { VEX_LEN_TABLE (VEX_LEN_0F41_P_2) },
43234a1e
L
3733 },
3734
3735 /* PREFIX_VEX_0F42 */
3736 {
3737 { VEX_LEN_TABLE (VEX_LEN_0F42_P_0) },
1ba585e8
IT
3738 { Bad_Opcode },
3739 { VEX_LEN_TABLE (VEX_LEN_0F42_P_2) },
43234a1e
L
3740 },
3741
7531c613 3742 /* PREFIX_VEX_0F44 */
c0f3af97 3743 {
7531c613 3744 { VEX_LEN_TABLE (VEX_LEN_0F44_P_0) },
592d1631 3745 { Bad_Opcode },
7531c613 3746 { VEX_LEN_TABLE (VEX_LEN_0F44_P_2) },
c0f3af97
L
3747 },
3748
7531c613 3749 /* PREFIX_VEX_0F45 */
0bfee649 3750 {
7531c613 3751 { VEX_LEN_TABLE (VEX_LEN_0F45_P_0) },
592d1631 3752 { Bad_Opcode },
7531c613 3753 { VEX_LEN_TABLE (VEX_LEN_0F45_P_2) },
0bfee649
L
3754 },
3755
7531c613 3756 /* PREFIX_VEX_0F46 */
43234a1e 3757 {
7531c613 3758 { VEX_LEN_TABLE (VEX_LEN_0F46_P_0) },
43234a1e 3759 { Bad_Opcode },
7531c613 3760 { VEX_LEN_TABLE (VEX_LEN_0F46_P_2) },
43234a1e
L
3761 },
3762
7531c613 3763 /* PREFIX_VEX_0F47 */
1ba585e8 3764 {
7531c613 3765 { VEX_LEN_TABLE (VEX_LEN_0F47_P_0) },
1ba585e8 3766 { Bad_Opcode },
7531c613 3767 { VEX_LEN_TABLE (VEX_LEN_0F47_P_2) },
1ba585e8
IT
3768 },
3769
7531c613 3770 /* PREFIX_VEX_0F4A */
43234a1e 3771 {
7531c613 3772 { VEX_LEN_TABLE (VEX_LEN_0F4A_P_0) },
43234a1e 3773 { Bad_Opcode },
7531c613 3774 { VEX_LEN_TABLE (VEX_LEN_0F4A_P_2) },
43234a1e
L
3775 },
3776
7531c613 3777 /* PREFIX_VEX_0F4B */
1ba585e8 3778 {
7531c613 3779 { VEX_LEN_TABLE (VEX_LEN_0F4B_P_0) },
1ba585e8 3780 { Bad_Opcode },
7531c613 3781 { VEX_LEN_TABLE (VEX_LEN_0F4B_P_2) },
1ba585e8
IT
3782 },
3783
7531c613 3784 /* PREFIX_VEX_0F51 */
6c30d220 3785 {
7531c613
JB
3786 { "vsqrtps", { XM, EXx }, 0 },
3787 { "vsqrtss", { XMScalar, VexScalar, EXxmm_md }, 0 },
3788 { "vsqrtpd", { XM, EXx }, 0 },
3789 { "vsqrtsd", { XMScalar, VexScalar, EXxmm_mq }, 0 },
6c30d220
L
3790 },
3791
7531c613 3792 /* PREFIX_VEX_0F52 */
6c30d220 3793 {
7531c613
JB
3794 { "vrsqrtps", { XM, EXx }, 0 },
3795 { "vrsqrtss", { XMScalar, VexScalar, EXxmm_md }, 0 },
6c30d220
L
3796 },
3797
7531c613 3798 /* PREFIX_VEX_0F53 */
c0f3af97 3799 {
7531c613
JB
3800 { "vrcpps", { XM, EXx }, 0 },
3801 { "vrcpss", { XMScalar, VexScalar, EXxmm_md }, 0 },
c0f3af97
L
3802 },
3803
7531c613 3804 /* PREFIX_VEX_0F58 */
c0f3af97 3805 {
7531c613
JB
3806 { "vaddps", { XM, Vex, EXx }, 0 },
3807 { "vaddss", { XMScalar, VexScalar, EXxmm_md }, 0 },
3808 { "vaddpd", { XM, Vex, EXx }, 0 },
3809 { "vaddsd", { XMScalar, VexScalar, EXxmm_mq }, 0 },
c0f3af97
L
3810 },
3811
7531c613 3812 /* PREFIX_VEX_0F59 */
c0f3af97 3813 {
7531c613
JB
3814 { "vmulps", { XM, Vex, EXx }, 0 },
3815 { "vmulss", { XMScalar, VexScalar, EXxmm_md }, 0 },
3816 { "vmulpd", { XM, Vex, EXx }, 0 },
3817 { "vmulsd", { XMScalar, VexScalar, EXxmm_mq }, 0 },
c0f3af97
L
3818 },
3819
7531c613 3820 /* PREFIX_VEX_0F5A */
ce2f5b3c 3821 {
7531c613
JB
3822 { "vcvtps2pd", { XM, EXxmmq }, 0 },
3823 { "vcvtss2sd", { XMScalar, VexScalar, EXxmm_md }, 0 },
3824 { "vcvtpd2ps%XY",{ XMM, EXx }, 0 },
3825 { "vcvtsd2ss", { XMScalar, VexScalar, EXxmm_mq }, 0 },
ce2f5b3c
L
3826 },
3827
7531c613 3828 /* PREFIX_VEX_0F5B */
6c30d220 3829 {
7531c613
JB
3830 { "vcvtdq2ps", { XM, EXx }, 0 },
3831 { "vcvttps2dq", { XM, EXx }, 0 },
3832 { "vcvtps2dq", { XM, EXx }, 0 },
6c30d220
L
3833 },
3834
7531c613 3835 /* PREFIX_VEX_0F5C */
a683cc34 3836 {
7531c613
JB
3837 { "vsubps", { XM, Vex, EXx }, 0 },
3838 { "vsubss", { XMScalar, VexScalar, EXxmm_md }, 0 },
3839 { "vsubpd", { XM, Vex, EXx }, 0 },
3840 { "vsubsd", { XMScalar, VexScalar, EXxmm_mq }, 0 },
a683cc34
SP
3841 },
3842
7531c613 3843 /* PREFIX_VEX_0F5D */
a683cc34 3844 {
7531c613
JB
3845 { "vminps", { XM, Vex, EXx }, 0 },
3846 { "vminss", { XMScalar, VexScalar, EXxmm_md }, 0 },
3847 { "vminpd", { XM, Vex, EXx }, 0 },
3848 { "vminsd", { XMScalar, VexScalar, EXxmm_mq }, 0 },
a683cc34
SP
3849 },
3850
7531c613 3851 /* PREFIX_VEX_0F5E */
c0f3af97 3852 {
7531c613
JB
3853 { "vdivps", { XM, Vex, EXx }, 0 },
3854 { "vdivss", { XMScalar, VexScalar, EXxmm_md }, 0 },
3855 { "vdivpd", { XM, Vex, EXx }, 0 },
3856 { "vdivsd", { XMScalar, VexScalar, EXxmm_mq }, 0 },
c0f3af97
L
3857 },
3858
7531c613 3859 /* PREFIX_VEX_0F5F */
c0f3af97 3860 {
7531c613
JB
3861 { "vmaxps", { XM, Vex, EXx }, 0 },
3862 { "vmaxss", { XMScalar, VexScalar, EXxmm_md }, 0 },
3863 { "vmaxpd", { XM, Vex, EXx }, 0 },
3864 { "vmaxsd", { XMScalar, VexScalar, EXxmm_mq }, 0 },
c0f3af97
L
3865 },
3866
7531c613 3867 /* PREFIX_VEX_0F6F */
c0f3af97 3868 {
592d1631 3869 { Bad_Opcode },
7531c613
JB
3870 { "vmovdqu", { XM, EXx }, 0 },
3871 { "vmovdqa", { XM, EXx }, 0 },
c0f3af97
L
3872 },
3873
7531c613 3874 /* PREFIX_VEX_0F70 */
922d8de8 3875 {
592d1631 3876 { Bad_Opcode },
7531c613
JB
3877 { "vpshufhw", { XM, EXx, Ib }, 0 },
3878 { "vpshufd", { XM, EXx, Ib }, 0 },
3879 { "vpshuflw", { XM, EXx, Ib }, 0 },
922d8de8
DR
3880 },
3881
7531c613 3882 /* PREFIX_VEX_0F77 */
922d8de8 3883 {
7531c613 3884 { VEX_LEN_TABLE (VEX_LEN_0F77_P_0) },
922d8de8
DR
3885 },
3886
7531c613 3887 /* PREFIX_VEX_0F7C */
922d8de8 3888 {
592d1631
L
3889 { Bad_Opcode },
3890 { Bad_Opcode },
7531c613
JB
3891 { "vhaddpd", { XM, Vex, EXx }, 0 },
3892 { "vhaddps", { XM, Vex, EXx }, 0 },
922d8de8
DR
3893 },
3894
7531c613 3895 /* PREFIX_VEX_0F7D */
922d8de8 3896 {
592d1631
L
3897 { Bad_Opcode },
3898 { Bad_Opcode },
7531c613
JB
3899 { "vhsubpd", { XM, Vex, EXx }, 0 },
3900 { "vhsubps", { XM, Vex, EXx }, 0 },
922d8de8
DR
3901 },
3902
7531c613 3903 /* PREFIX_VEX_0F7E */
c0f3af97 3904 {
592d1631 3905 { Bad_Opcode },
7531c613
JB
3906 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_1) },
3907 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_2) },
c0f3af97
L
3908 },
3909
7531c613 3910 /* PREFIX_VEX_0F7F */
c0f3af97 3911 {
592d1631 3912 { Bad_Opcode },
7531c613
JB
3913 { "vmovdqu", { EXxS, XM }, 0 },
3914 { "vmovdqa", { EXxS, XM }, 0 },
c0f3af97
L
3915 },
3916
7531c613 3917 /* PREFIX_VEX_0F90 */
c0f3af97 3918 {
7531c613 3919 { VEX_LEN_TABLE (VEX_LEN_0F90_P_0) },
592d1631 3920 { Bad_Opcode },
7531c613 3921 { VEX_LEN_TABLE (VEX_LEN_0F90_P_2) },
c0f3af97
L
3922 },
3923
7531c613 3924 /* PREFIX_VEX_0F91 */
c0f3af97 3925 {
7531c613 3926 { VEX_LEN_TABLE (VEX_LEN_0F91_P_0) },
592d1631 3927 { Bad_Opcode },
7531c613 3928 { VEX_LEN_TABLE (VEX_LEN_0F91_P_2) },
c0f3af97 3929 },
a5ff0eb2 3930
7531c613 3931 /* PREFIX_VEX_0F92 */
922d8de8 3932 {
7531c613 3933 { VEX_LEN_TABLE (VEX_LEN_0F92_P_0) },
592d1631 3934 { Bad_Opcode },
7531c613
JB
3935 { VEX_LEN_TABLE (VEX_LEN_0F92_P_2) },
3936 { VEX_LEN_TABLE (VEX_LEN_0F92_P_3) },
922d8de8
DR
3937 },
3938
7531c613 3939 /* PREFIX_VEX_0F93 */
922d8de8 3940 {
7531c613 3941 { VEX_LEN_TABLE (VEX_LEN_0F93_P_0) },
592d1631 3942 { Bad_Opcode },
7531c613
JB
3943 { VEX_LEN_TABLE (VEX_LEN_0F93_P_2) },
3944 { VEX_LEN_TABLE (VEX_LEN_0F93_P_3) },
922d8de8
DR
3945 },
3946
7531c613 3947 /* PREFIX_VEX_0F98 */
922d8de8 3948 {
7531c613 3949 { VEX_LEN_TABLE (VEX_LEN_0F98_P_0) },
592d1631 3950 { Bad_Opcode },
7531c613 3951 { VEX_LEN_TABLE (VEX_LEN_0F98_P_2) },
922d8de8
DR
3952 },
3953
7531c613 3954 /* PREFIX_VEX_0F99 */
922d8de8 3955 {
7531c613 3956 { VEX_LEN_TABLE (VEX_LEN_0F99_P_0) },
592d1631 3957 { Bad_Opcode },
7531c613 3958 { VEX_LEN_TABLE (VEX_LEN_0F99_P_2) },
922d8de8
DR
3959 },
3960
7531c613 3961 /* PREFIX_VEX_0FC2 */
922d8de8 3962 {
7531c613
JB
3963 { "vcmpps", { XM, Vex, EXx, CMP }, 0 },
3964 { "vcmpss", { XMScalar, VexScalar, EXxmm_md, CMP }, 0 },
3965 { "vcmppd", { XM, Vex, EXx, CMP }, 0 },
3966 { "vcmpsd", { XMScalar, VexScalar, EXxmm_mq, CMP }, 0 },
922d8de8
DR
3967 },
3968
7531c613 3969 /* PREFIX_VEX_0FD0 */
922d8de8 3970 {
592d1631
L
3971 { Bad_Opcode },
3972 { Bad_Opcode },
7531c613
JB
3973 { "vaddsubpd", { XM, Vex, EXx }, 0 },
3974 { "vaddsubps", { XM, Vex, EXx }, 0 },
922d8de8
DR
3975 },
3976
7531c613 3977 /* PREFIX_VEX_0FE6 */
922d8de8 3978 {
592d1631 3979 { Bad_Opcode },
7531c613
JB
3980 { "vcvtdq2pd", { XM, EXxmmq }, 0 },
3981 { "vcvttpd2dq%XY", { XMM, EXx }, 0 },
3982 { "vcvtpd2dq%XY", { XMM, EXx }, 0 },
922d8de8
DR
3983 },
3984
7531c613 3985 /* PREFIX_VEX_0FF0 */
922d8de8 3986 {
592d1631
L
3987 { Bad_Opcode },
3988 { Bad_Opcode },
7531c613
JB
3989 { Bad_Opcode },
3990 { MOD_TABLE (MOD_VEX_0FF0_PREFIX_3) },
922d8de8
DR
3991 },
3992
7531c613 3993 /* PREFIX_VEX_0F3849_X86_64 */
922d8de8 3994 {
7531c613 3995 { VEX_W_TABLE (VEX_W_0F3849_X86_64_P_0) },
592d1631 3996 { Bad_Opcode },
7531c613
JB
3997 { VEX_W_TABLE (VEX_W_0F3849_X86_64_P_2) },
3998 { VEX_W_TABLE (VEX_W_0F3849_X86_64_P_3) },
922d8de8
DR
3999 },
4000
7531c613 4001 /* PREFIX_VEX_0F384B_X86_64 */
922d8de8 4002 {
592d1631 4003 { Bad_Opcode },
7531c613
JB
4004 { VEX_W_TABLE (VEX_W_0F384B_X86_64_P_1) },
4005 { VEX_W_TABLE (VEX_W_0F384B_X86_64_P_2) },
4006 { VEX_W_TABLE (VEX_W_0F384B_X86_64_P_3) },
922d8de8
DR
4007 },
4008
7531c613 4009 /* PREFIX_VEX_0F385C_X86_64 */
922d8de8 4010 {
592d1631 4011 { Bad_Opcode },
7531c613 4012 { VEX_W_TABLE (VEX_W_0F385C_X86_64_P_1) },
592d1631 4013 { Bad_Opcode },
922d8de8
DR
4014 },
4015
7531c613 4016 /* PREFIX_VEX_0F385E_X86_64 */
922d8de8 4017 {
7531c613
JB
4018 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_0) },
4019 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_1) },
4020 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_2) },
4021 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_3) },
922d8de8
DR
4022 },
4023
7531c613 4024 /* PREFIX_VEX_0F38F2 */
922d8de8 4025 {
7531c613 4026 { VEX_LEN_TABLE (VEX_LEN_0F38F2_P_0) },
922d8de8
DR
4027 },
4028
7531c613 4029 /* PREFIX_VEX_0F38F3_REG_1 */
922d8de8 4030 {
7531c613 4031 { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_1_P_0) },
922d8de8
DR
4032 },
4033
7531c613 4034 /* PREFIX_VEX_0F38F3_REG_2 */
922d8de8 4035 {
7531c613 4036 { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_2_P_0) },
922d8de8
DR
4037 },
4038
7531c613 4039 /* PREFIX_VEX_0F38F3_REG_3 */
922d8de8 4040 {
7531c613 4041 { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_3_P_0) },
922d8de8
DR
4042 },
4043
7531c613 4044 /* PREFIX_VEX_0F38F5 */
48521003 4045 {
7531c613
JB
4046 { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_0) },
4047 { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_1) },
48521003 4048 { Bad_Opcode },
7531c613 4049 { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_3) },
48521003
IT
4050 },
4051
7531c613 4052 /* PREFIX_VEX_0F38F6 */
48521003
IT
4053 {
4054 { Bad_Opcode },
4055 { Bad_Opcode },
7531c613
JB
4056 { Bad_Opcode },
4057 { VEX_LEN_TABLE (VEX_LEN_0F38F6_P_3) },
48521003
IT
4058 },
4059
7531c613 4060 /* PREFIX_VEX_0F38F7 */
a5ff0eb2 4061 {
7531c613
JB
4062 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_0) },
4063 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_1) },
4064 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_2) },
4065 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_3) },
a5ff0eb2 4066 },
6c30d220
L
4067
4068 /* PREFIX_VEX_0F3AF0 */
4069 {
4070 { Bad_Opcode },
4071 { Bad_Opcode },
4072 { Bad_Opcode },
4073 { VEX_LEN_TABLE (VEX_LEN_0F3AF0_P_3) },
4074 },
43234a1e 4075
ad692897 4076#include "i386-dis-evex-prefix.h"
c0f3af97
L
4077};
4078
4079static const struct dis386 x86_64_table[][2] = {
4080 /* X86_64_06 */
4081 {
bf890a93 4082 { "pushP", { es }, 0 },
c0f3af97
L
4083 },
4084
4085 /* X86_64_07 */
4086 {
bf890a93 4087 { "popP", { es }, 0 },
c0f3af97
L
4088 },
4089
1673df32 4090 /* X86_64_0E */
c0f3af97 4091 {
bf890a93 4092 { "pushP", { cs }, 0 },
c0f3af97
L
4093 },
4094
4095 /* X86_64_16 */
4096 {
bf890a93 4097 { "pushP", { ss }, 0 },
c0f3af97
L
4098 },
4099
4100 /* X86_64_17 */
4101 {
bf890a93 4102 { "popP", { ss }, 0 },
c0f3af97
L
4103 },
4104
4105 /* X86_64_1E */
4106 {
bf890a93 4107 { "pushP", { ds }, 0 },
c0f3af97
L
4108 },
4109
4110 /* X86_64_1F */
4111 {
bf890a93 4112 { "popP", { ds }, 0 },
c0f3af97
L
4113 },
4114
4115 /* X86_64_27 */
4116 {
bf890a93 4117 { "daa", { XX }, 0 },
c0f3af97
L
4118 },
4119
4120 /* X86_64_2F */
4121 {
bf890a93 4122 { "das", { XX }, 0 },
c0f3af97
L
4123 },
4124
4125 /* X86_64_37 */
4126 {
bf890a93 4127 { "aaa", { XX }, 0 },
c0f3af97
L
4128 },
4129
4130 /* X86_64_3F */
4131 {
bf890a93 4132 { "aas", { XX }, 0 },
c0f3af97
L
4133 },
4134
4135 /* X86_64_60 */
4136 {
bf890a93 4137 { "pushaP", { XX }, 0 },
c0f3af97
L
4138 },
4139
4140 /* X86_64_61 */
4141 {
bf890a93 4142 { "popaP", { XX }, 0 },
c0f3af97
L
4143 },
4144
4145 /* X86_64_62 */
4146 {
4147 { MOD_TABLE (MOD_62_32BIT) },
43234a1e 4148 { EVEX_TABLE (EVEX_0F) },
c0f3af97
L
4149 },
4150
4151 /* X86_64_63 */
4152 {
bf890a93 4153 { "arpl", { Ew, Gw }, 0 },
bc31405e 4154 { "movs", { { OP_G, movsxd_mode }, { MOVSXD_Fixup, movsxd_mode } }, 0 },
c0f3af97
L
4155 },
4156
4157 /* X86_64_6D */
4158 {
bf890a93
IT
4159 { "ins{R|}", { Yzr, indirDX }, 0 },
4160 { "ins{G|}", { Yzr, indirDX }, 0 },
c0f3af97
L
4161 },
4162
4163 /* X86_64_6F */
4164 {
bf890a93
IT
4165 { "outs{R|}", { indirDXr, Xz }, 0 },
4166 { "outs{G|}", { indirDXr, Xz }, 0 },
c0f3af97
L
4167 },
4168
d039fef3 4169 /* X86_64_82 */
8b89fe14 4170 {
de194d85 4171 /* Opcode 0x82 is an alias of opcode 0x80 in 32-bit mode. */
d039fef3 4172 { REG_TABLE (REG_80) },
8b89fe14
L
4173 },
4174
c0f3af97
L
4175 /* X86_64_9A */
4176 {
8f570d62 4177 { "{l|}call{T|}", { Ap }, 0 },
c0f3af97
L
4178 },
4179
aeab2b26
JB
4180 /* X86_64_C2 */
4181 {
4182 { "retP", { Iw, BND }, 0 },
4183 { "ret@", { Iw, BND }, 0 },
4184 },
4185
4186 /* X86_64_C3 */
4187 {
4188 { "retP", { BND }, 0 },
4189 { "ret@", { BND }, 0 },
4190 },
4191
c0f3af97
L
4192 /* X86_64_C4 */
4193 {
4194 { MOD_TABLE (MOD_C4_32BIT) },
4195 { VEX_C4_TABLE (VEX_0F) },
4196 },
4197
4198 /* X86_64_C5 */
4199 {
4200 { MOD_TABLE (MOD_C5_32BIT) },
4201 { VEX_C5_TABLE (VEX_0F) },
4202 },
4203
4204 /* X86_64_CE */
4205 {
bf890a93 4206 { "into", { XX }, 0 },
c0f3af97
L
4207 },
4208
4209 /* X86_64_D4 */
4210 {
bf890a93 4211 { "aam", { Ib }, 0 },
c0f3af97
L
4212 },
4213
4214 /* X86_64_D5 */
4215 {
bf890a93 4216 { "aad", { Ib }, 0 },
c0f3af97
L
4217 },
4218
a72d2af2
L
4219 /* X86_64_E8 */
4220 {
4221 { "callP", { Jv, BND }, 0 },
5db04b09 4222 { "call@", { Jv, BND }, 0 }
a72d2af2
L
4223 },
4224
4225 /* X86_64_E9 */
4226 {
4227 { "jmpP", { Jv, BND }, 0 },
5db04b09 4228 { "jmp@", { Jv, BND }, 0 }
a72d2af2
L
4229 },
4230
c0f3af97
L
4231 /* X86_64_EA */
4232 {
8f570d62 4233 { "{l|}jmp{T|}", { Ap }, 0 },
c0f3af97
L
4234 },
4235
4236 /* X86_64_0F01_REG_0 */
4237 {
d1c36125 4238 { "sgdt{Q|Q}", { M }, 0 },
bf890a93 4239 { "sgdt", { M }, 0 },
c0f3af97
L
4240 },
4241
4242 /* X86_64_0F01_REG_1 */
4243 {
d1c36125 4244 { "sidt{Q|Q}", { M }, 0 },
bf890a93 4245 { "sidt", { M }, 0 },
c0f3af97
L
4246 },
4247
4248 /* X86_64_0F01_REG_2 */
4249 {
bf890a93
IT
4250 { "lgdt{Q|Q}", { M }, 0 },
4251 { "lgdt", { M }, 0 },
c0f3af97
L
4252 },
4253
4254 /* X86_64_0F01_REG_3 */
4255 {
bf890a93
IT
4256 { "lidt{Q|Q}", { M }, 0 },
4257 { "lidt", { M }, 0 },
c0f3af97 4258 },
260cd341
LC
4259
4260 /* X86_64_VEX_0F3849 */
4261 {
4262 { Bad_Opcode },
4263 { PREFIX_TABLE (PREFIX_VEX_0F3849_X86_64) },
4264 },
4265
4266 /* X86_64_VEX_0F384B */
4267 {
4268 { Bad_Opcode },
4269 { PREFIX_TABLE (PREFIX_VEX_0F384B_X86_64) },
4270 },
4271
4272 /* X86_64_VEX_0F385C */
4273 {
4274 { Bad_Opcode },
4275 { PREFIX_TABLE (PREFIX_VEX_0F385C_X86_64) },
4276 },
4277
4278 /* X86_64_VEX_0F385E */
4279 {
4280 { Bad_Opcode },
4281 { PREFIX_TABLE (PREFIX_VEX_0F385E_X86_64) },
4282 },
c0f3af97
L
4283};
4284
4285static const struct dis386 three_byte_table[][256] = {
c1e679ec
DR
4286
4287 /* THREE_BYTE_0F38 */
c0f3af97
L
4288 {
4289 /* 00 */
507bd325
L
4290 { "pshufb", { MX, EM }, PREFIX_OPCODE },
4291 { "phaddw", { MX, EM }, PREFIX_OPCODE },
4292 { "phaddd", { MX, EM }, PREFIX_OPCODE },
4293 { "phaddsw", { MX, EM }, PREFIX_OPCODE },
4294 { "pmaddubsw", { MX, EM }, PREFIX_OPCODE },
4295 { "phsubw", { MX, EM }, PREFIX_OPCODE },
4296 { "phsubd", { MX, EM }, PREFIX_OPCODE },
4297 { "phsubsw", { MX, EM }, PREFIX_OPCODE },
c0f3af97 4298 /* 08 */
507bd325
L
4299 { "psignb", { MX, EM }, PREFIX_OPCODE },
4300 { "psignw", { MX, EM }, PREFIX_OPCODE },
4301 { "psignd", { MX, EM }, PREFIX_OPCODE },
4302 { "pmulhrsw", { MX, EM }, PREFIX_OPCODE },
592d1631
L
4303 { Bad_Opcode },
4304 { Bad_Opcode },
4305 { Bad_Opcode },
4306 { Bad_Opcode },
f88c9eb0 4307 /* 10 */
7531c613 4308 { "pblendvb", { XM, EXx, XMM0 }, PREFIX_DATA },
592d1631
L
4309 { Bad_Opcode },
4310 { Bad_Opcode },
4311 { Bad_Opcode },
7531c613
JB
4312 { "blendvps", { XM, EXx, XMM0 }, PREFIX_DATA },
4313 { "blendvpd", { XM, EXx, XMM0 }, PREFIX_DATA },
592d1631 4314 { Bad_Opcode },
7531c613 4315 { "ptest", { XM, EXx }, PREFIX_DATA },
f88c9eb0 4316 /* 18 */
592d1631
L
4317 { Bad_Opcode },
4318 { Bad_Opcode },
4319 { Bad_Opcode },
4320 { Bad_Opcode },
507bd325
L
4321 { "pabsb", { MX, EM }, PREFIX_OPCODE },
4322 { "pabsw", { MX, EM }, PREFIX_OPCODE },
4323 { "pabsd", { MX, EM }, PREFIX_OPCODE },
592d1631 4324 { Bad_Opcode },
f88c9eb0 4325 /* 20 */
7531c613
JB
4326 { "pmovsxbw", { XM, EXq }, PREFIX_DATA },
4327 { "pmovsxbd", { XM, EXd }, PREFIX_DATA },
4328 { "pmovsxbq", { XM, EXw }, PREFIX_DATA },
4329 { "pmovsxwd", { XM, EXq }, PREFIX_DATA },
4330 { "pmovsxwq", { XM, EXd }, PREFIX_DATA },
4331 { "pmovsxdq", { XM, EXq }, PREFIX_DATA },
592d1631
L
4332 { Bad_Opcode },
4333 { Bad_Opcode },
f88c9eb0 4334 /* 28 */
7531c613
JB
4335 { "pmuldq", { XM, EXx }, PREFIX_DATA },
4336 { "pcmpeqq", { XM, EXx }, PREFIX_DATA },
4337 { MOD_TABLE (MOD_0F382A) },
4338 { "packusdw", { XM, EXx }, PREFIX_DATA },
592d1631
L
4339 { Bad_Opcode },
4340 { Bad_Opcode },
4341 { Bad_Opcode },
4342 { Bad_Opcode },
f88c9eb0 4343 /* 30 */
7531c613
JB
4344 { "pmovzxbw", { XM, EXq }, PREFIX_DATA },
4345 { "pmovzxbd", { XM, EXd }, PREFIX_DATA },
4346 { "pmovzxbq", { XM, EXw }, PREFIX_DATA },
4347 { "pmovzxwd", { XM, EXq }, PREFIX_DATA },
4348 { "pmovzxwq", { XM, EXd }, PREFIX_DATA },
4349 { "pmovzxdq", { XM, EXq }, PREFIX_DATA },
4350 { Bad_Opcode },
4351 { "pcmpgtq", { XM, EXx }, PREFIX_DATA },
f88c9eb0 4352 /* 38 */
7531c613
JB
4353 { "pminsb", { XM, EXx }, PREFIX_DATA },
4354 { "pminsd", { XM, EXx }, PREFIX_DATA },
4355 { "pminuw", { XM, EXx }, PREFIX_DATA },
4356 { "pminud", { XM, EXx }, PREFIX_DATA },
4357 { "pmaxsb", { XM, EXx }, PREFIX_DATA },
4358 { "pmaxsd", { XM, EXx }, PREFIX_DATA },
4359 { "pmaxuw", { XM, EXx }, PREFIX_DATA },
4360 { "pmaxud", { XM, EXx }, PREFIX_DATA },
f88c9eb0 4361 /* 40 */
7531c613
JB
4362 { "pmulld", { XM, EXx }, PREFIX_DATA },
4363 { "phminposuw", { XM, EXx }, PREFIX_DATA },
592d1631
L
4364 { Bad_Opcode },
4365 { Bad_Opcode },
4366 { Bad_Opcode },
4367 { Bad_Opcode },
4368 { Bad_Opcode },
4369 { Bad_Opcode },
f88c9eb0 4370 /* 48 */
592d1631
L
4371 { Bad_Opcode },
4372 { Bad_Opcode },
4373 { Bad_Opcode },
4374 { Bad_Opcode },
4375 { Bad_Opcode },
4376 { Bad_Opcode },
4377 { Bad_Opcode },
4378 { Bad_Opcode },
f88c9eb0 4379 /* 50 */
592d1631
L
4380 { Bad_Opcode },
4381 { Bad_Opcode },
4382 { Bad_Opcode },
4383 { Bad_Opcode },
4384 { Bad_Opcode },
4385 { Bad_Opcode },
4386 { Bad_Opcode },
4387 { Bad_Opcode },
f88c9eb0 4388 /* 58 */
592d1631
L
4389 { Bad_Opcode },
4390 { Bad_Opcode },
4391 { Bad_Opcode },
4392 { Bad_Opcode },
4393 { Bad_Opcode },
4394 { Bad_Opcode },
4395 { Bad_Opcode },
4396 { Bad_Opcode },
f88c9eb0 4397 /* 60 */
592d1631
L
4398 { Bad_Opcode },
4399 { Bad_Opcode },
4400 { Bad_Opcode },
4401 { Bad_Opcode },
4402 { Bad_Opcode },
4403 { Bad_Opcode },
4404 { Bad_Opcode },
4405 { Bad_Opcode },
f88c9eb0 4406 /* 68 */
592d1631
L
4407 { Bad_Opcode },
4408 { Bad_Opcode },
4409 { Bad_Opcode },
4410 { Bad_Opcode },
4411 { Bad_Opcode },
4412 { Bad_Opcode },
4413 { Bad_Opcode },
4414 { Bad_Opcode },
f88c9eb0 4415 /* 70 */
592d1631
L
4416 { Bad_Opcode },
4417 { Bad_Opcode },
4418 { Bad_Opcode },
4419 { Bad_Opcode },
4420 { Bad_Opcode },
4421 { Bad_Opcode },
4422 { Bad_Opcode },
4423 { Bad_Opcode },
f88c9eb0 4424 /* 78 */
592d1631
L
4425 { Bad_Opcode },
4426 { Bad_Opcode },
4427 { Bad_Opcode },
4428 { Bad_Opcode },
4429 { Bad_Opcode },
4430 { Bad_Opcode },
4431 { Bad_Opcode },
4432 { Bad_Opcode },
f88c9eb0 4433 /* 80 */
7531c613
JB
4434 { "invept", { Gm, Mo }, PREFIX_DATA },
4435 { "invvpid", { Gm, Mo }, PREFIX_DATA },
4436 { "invpcid", { Gm, M }, PREFIX_DATA },
592d1631
L
4437 { Bad_Opcode },
4438 { Bad_Opcode },
4439 { Bad_Opcode },
4440 { Bad_Opcode },
4441 { Bad_Opcode },
f88c9eb0 4442 /* 88 */
592d1631
L
4443 { Bad_Opcode },
4444 { Bad_Opcode },
4445 { Bad_Opcode },
4446 { Bad_Opcode },
4447 { Bad_Opcode },
4448 { Bad_Opcode },
4449 { Bad_Opcode },
4450 { Bad_Opcode },
f88c9eb0 4451 /* 90 */
592d1631
L
4452 { Bad_Opcode },
4453 { Bad_Opcode },
4454 { Bad_Opcode },
4455 { Bad_Opcode },
4456 { Bad_Opcode },
4457 { Bad_Opcode },
4458 { Bad_Opcode },
4459 { Bad_Opcode },
f88c9eb0 4460 /* 98 */
592d1631
L
4461 { Bad_Opcode },
4462 { Bad_Opcode },
4463 { Bad_Opcode },
4464 { Bad_Opcode },
4465 { Bad_Opcode },
4466 { Bad_Opcode },
4467 { Bad_Opcode },
4468 { Bad_Opcode },
f88c9eb0 4469 /* a0 */
592d1631
L
4470 { Bad_Opcode },
4471 { Bad_Opcode },
4472 { Bad_Opcode },
4473 { Bad_Opcode },
4474 { Bad_Opcode },
4475 { Bad_Opcode },
4476 { Bad_Opcode },
4477 { Bad_Opcode },
f88c9eb0 4478 /* a8 */
592d1631
L
4479 { Bad_Opcode },
4480 { Bad_Opcode },
4481 { Bad_Opcode },
4482 { Bad_Opcode },
4483 { Bad_Opcode },
4484 { Bad_Opcode },
4485 { Bad_Opcode },
4486 { Bad_Opcode },
f88c9eb0 4487 /* b0 */
592d1631
L
4488 { Bad_Opcode },
4489 { Bad_Opcode },
4490 { Bad_Opcode },
4491 { Bad_Opcode },
4492 { Bad_Opcode },
4493 { Bad_Opcode },
4494 { Bad_Opcode },
4495 { Bad_Opcode },
f88c9eb0 4496 /* b8 */
592d1631
L
4497 { Bad_Opcode },
4498 { Bad_Opcode },
4499 { Bad_Opcode },
4500 { Bad_Opcode },
4501 { Bad_Opcode },
4502 { Bad_Opcode },
4503 { Bad_Opcode },
4504 { Bad_Opcode },
f88c9eb0 4505 /* c0 */
592d1631
L
4506 { Bad_Opcode },
4507 { Bad_Opcode },
4508 { Bad_Opcode },
4509 { Bad_Opcode },
4510 { Bad_Opcode },
4511 { Bad_Opcode },
4512 { Bad_Opcode },
4513 { Bad_Opcode },
f88c9eb0 4514 /* c8 */
a0046408
L
4515 { PREFIX_TABLE (PREFIX_0F38C8) },
4516 { PREFIX_TABLE (PREFIX_0F38C9) },
4517 { PREFIX_TABLE (PREFIX_0F38CA) },
4518 { PREFIX_TABLE (PREFIX_0F38CB) },
4519 { PREFIX_TABLE (PREFIX_0F38CC) },
4520 { PREFIX_TABLE (PREFIX_0F38CD) },
592d1631 4521 { Bad_Opcode },
7531c613 4522 { "gf2p8mulb", { XM, EXxmm }, PREFIX_DATA },
f88c9eb0 4523 /* d0 */
592d1631
L
4524 { Bad_Opcode },
4525 { Bad_Opcode },
4526 { Bad_Opcode },
4527 { Bad_Opcode },
4528 { Bad_Opcode },
4529 { Bad_Opcode },
4530 { Bad_Opcode },
4531 { Bad_Opcode },
f88c9eb0 4532 /* d8 */
592d1631
L
4533 { Bad_Opcode },
4534 { Bad_Opcode },
4535 { Bad_Opcode },
7531c613
JB
4536 { "aesimc", { XM, EXx }, PREFIX_DATA },
4537 { "aesenc", { XM, EXx }, PREFIX_DATA },
4538 { "aesenclast", { XM, EXx }, PREFIX_DATA },
4539 { "aesdec", { XM, EXx }, PREFIX_DATA },
4540 { "aesdeclast", { XM, EXx }, PREFIX_DATA },
f88c9eb0 4541 /* e0 */
592d1631
L
4542 { Bad_Opcode },
4543 { Bad_Opcode },
4544 { Bad_Opcode },
4545 { Bad_Opcode },
4546 { Bad_Opcode },
4547 { Bad_Opcode },
4548 { Bad_Opcode },
4549 { Bad_Opcode },
f88c9eb0 4550 /* e8 */
592d1631
L
4551 { Bad_Opcode },
4552 { Bad_Opcode },
4553 { Bad_Opcode },
4554 { Bad_Opcode },
4555 { Bad_Opcode },
4556 { Bad_Opcode },
4557 { Bad_Opcode },
4558 { Bad_Opcode },
f88c9eb0
SP
4559 /* f0 */
4560 { PREFIX_TABLE (PREFIX_0F38F0) },
4561 { PREFIX_TABLE (PREFIX_0F38F1) },
592d1631
L
4562 { Bad_Opcode },
4563 { Bad_Opcode },
4564 { Bad_Opcode },
7531c613 4565 { MOD_TABLE (MOD_0F38F5) },
e2e1fcde 4566 { PREFIX_TABLE (PREFIX_0F38F6) },
592d1631 4567 { Bad_Opcode },
f88c9eb0 4568 /* f8 */
c0a30a9f
L
4569 { PREFIX_TABLE (PREFIX_0F38F8) },
4570 { PREFIX_TABLE (PREFIX_0F38F9) },
592d1631
L
4571 { Bad_Opcode },
4572 { Bad_Opcode },
4573 { Bad_Opcode },
4574 { Bad_Opcode },
4575 { Bad_Opcode },
4576 { Bad_Opcode },
f88c9eb0
SP
4577 },
4578 /* THREE_BYTE_0F3A */
4579 {
4580 /* 00 */
592d1631
L
4581 { Bad_Opcode },
4582 { Bad_Opcode },
4583 { Bad_Opcode },
4584 { Bad_Opcode },
4585 { Bad_Opcode },
4586 { Bad_Opcode },
4587 { Bad_Opcode },
4588 { Bad_Opcode },
f88c9eb0 4589 /* 08 */
7531c613
JB
4590 { "roundps", { XM, EXx, Ib }, PREFIX_DATA },
4591 { "roundpd", { XM, EXx, Ib }, PREFIX_DATA },
4592 { "roundss", { XM, EXd, Ib }, PREFIX_DATA },
4593 { "roundsd", { XM, EXq, Ib }, PREFIX_DATA },
4594 { "blendps", { XM, EXx, Ib }, PREFIX_DATA },
4595 { "blendpd", { XM, EXx, Ib }, PREFIX_DATA },
4596 { "pblendw", { XM, EXx, Ib }, PREFIX_DATA },
507bd325 4597 { "palignr", { MX, EM, Ib }, PREFIX_OPCODE },
f88c9eb0 4598 /* 10 */
592d1631
L
4599 { Bad_Opcode },
4600 { Bad_Opcode },
4601 { Bad_Opcode },
4602 { Bad_Opcode },
7531c613
JB
4603 { "pextrb", { Edqb, XM, Ib }, PREFIX_DATA },
4604 { "pextrw", { Edqw, XM, Ib }, PREFIX_DATA },
4605 { "pextrK", { Edq, XM, Ib }, PREFIX_DATA },
4606 { "extractps", { Edqd, XM, Ib }, PREFIX_DATA },
f88c9eb0 4607 /* 18 */
592d1631
L
4608 { Bad_Opcode },
4609 { Bad_Opcode },
4610 { Bad_Opcode },
4611 { Bad_Opcode },
4612 { Bad_Opcode },
4613 { Bad_Opcode },
4614 { Bad_Opcode },
4615 { Bad_Opcode },
f88c9eb0 4616 /* 20 */
7531c613
JB
4617 { "pinsrb", { XM, Edqb, Ib }, PREFIX_DATA },
4618 { "insertps", { XM, EXd, Ib }, PREFIX_DATA },
4619 { "pinsrK", { XM, Edq, Ib }, PREFIX_DATA },
592d1631
L
4620 { Bad_Opcode },
4621 { Bad_Opcode },
4622 { Bad_Opcode },
4623 { Bad_Opcode },
4624 { Bad_Opcode },
f88c9eb0 4625 /* 28 */
592d1631
L
4626 { Bad_Opcode },
4627 { Bad_Opcode },
4628 { Bad_Opcode },
4629 { Bad_Opcode },
4630 { Bad_Opcode },
4631 { Bad_Opcode },
4632 { Bad_Opcode },
4633 { Bad_Opcode },
f88c9eb0 4634 /* 30 */
592d1631
L
4635 { Bad_Opcode },
4636 { Bad_Opcode },
4637 { Bad_Opcode },
4638 { Bad_Opcode },
4639 { Bad_Opcode },
4640 { Bad_Opcode },
4641 { Bad_Opcode },
4642 { Bad_Opcode },
f88c9eb0 4643 /* 38 */
592d1631
L
4644 { Bad_Opcode },
4645 { Bad_Opcode },
4646 { Bad_Opcode },
4647 { Bad_Opcode },
4648 { Bad_Opcode },
4649 { Bad_Opcode },
4650 { Bad_Opcode },
4651 { Bad_Opcode },
f88c9eb0 4652 /* 40 */
7531c613
JB
4653 { "dpps", { XM, EXx, Ib }, PREFIX_DATA },
4654 { "dppd", { XM, EXx, Ib }, PREFIX_DATA },
4655 { "mpsadbw", { XM, EXx, Ib }, PREFIX_DATA },
592d1631 4656 { Bad_Opcode },
7531c613 4657 { "pclmulqdq", { XM, EXx, PCLMUL }, PREFIX_DATA },
592d1631
L
4658 { Bad_Opcode },
4659 { Bad_Opcode },
4660 { Bad_Opcode },
f88c9eb0 4661 /* 48 */
592d1631
L
4662 { Bad_Opcode },
4663 { Bad_Opcode },
4664 { Bad_Opcode },
4665 { Bad_Opcode },
4666 { Bad_Opcode },
4667 { Bad_Opcode },
4668 { Bad_Opcode },
4669 { Bad_Opcode },
f88c9eb0 4670 /* 50 */
592d1631
L
4671 { Bad_Opcode },
4672 { Bad_Opcode },
4673 { Bad_Opcode },
4674 { Bad_Opcode },
4675 { Bad_Opcode },
4676 { Bad_Opcode },
4677 { Bad_Opcode },
4678 { Bad_Opcode },
f88c9eb0 4679 /* 58 */
592d1631
L
4680 { Bad_Opcode },
4681 { Bad_Opcode },
4682 { Bad_Opcode },
4683 { Bad_Opcode },
4684 { Bad_Opcode },
4685 { Bad_Opcode },
4686 { Bad_Opcode },
4687 { Bad_Opcode },
f88c9eb0 4688 /* 60 */
7531c613
JB
4689 { "pcmpestrm!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
4690 { "pcmpestri!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
4691 { "pcmpistrm", { XM, EXx, Ib }, PREFIX_DATA },
4692 { "pcmpistri", { XM, EXx, Ib }, PREFIX_DATA },
592d1631
L
4693 { Bad_Opcode },
4694 { Bad_Opcode },
4695 { Bad_Opcode },
4696 { Bad_Opcode },
f88c9eb0 4697 /* 68 */
592d1631
L
4698 { Bad_Opcode },
4699 { Bad_Opcode },
4700 { Bad_Opcode },
4701 { Bad_Opcode },
4702 { Bad_Opcode },
4703 { Bad_Opcode },
4704 { Bad_Opcode },
4705 { Bad_Opcode },
f88c9eb0 4706 /* 70 */
592d1631
L
4707 { Bad_Opcode },
4708 { Bad_Opcode },
4709 { Bad_Opcode },
4710 { Bad_Opcode },
4711 { Bad_Opcode },
4712 { Bad_Opcode },
4713 { Bad_Opcode },
4714 { Bad_Opcode },
f88c9eb0 4715 /* 78 */
592d1631
L
4716 { Bad_Opcode },
4717 { Bad_Opcode },
4718 { Bad_Opcode },
4719 { Bad_Opcode },
4720 { Bad_Opcode },
4721 { Bad_Opcode },
4722 { Bad_Opcode },
4723 { Bad_Opcode },
f88c9eb0 4724 /* 80 */
592d1631
L
4725 { Bad_Opcode },
4726 { Bad_Opcode },
4727 { Bad_Opcode },
4728 { Bad_Opcode },
4729 { Bad_Opcode },
4730 { Bad_Opcode },
4731 { Bad_Opcode },
4732 { Bad_Opcode },
f88c9eb0 4733 /* 88 */
592d1631
L
4734 { Bad_Opcode },
4735 { Bad_Opcode },
4736 { Bad_Opcode },
4737 { Bad_Opcode },
4738 { Bad_Opcode },
4739 { Bad_Opcode },
4740 { Bad_Opcode },
4741 { Bad_Opcode },
f88c9eb0 4742 /* 90 */
592d1631
L
4743 { Bad_Opcode },
4744 { Bad_Opcode },
4745 { Bad_Opcode },
4746 { Bad_Opcode },
4747 { Bad_Opcode },
4748 { Bad_Opcode },
4749 { Bad_Opcode },
4750 { Bad_Opcode },
f88c9eb0 4751 /* 98 */
592d1631
L
4752 { Bad_Opcode },
4753 { Bad_Opcode },
4754 { Bad_Opcode },
4755 { Bad_Opcode },
4756 { Bad_Opcode },
4757 { Bad_Opcode },
4758 { Bad_Opcode },
4759 { Bad_Opcode },
f88c9eb0 4760 /* a0 */
592d1631
L
4761 { Bad_Opcode },
4762 { Bad_Opcode },
4763 { Bad_Opcode },
4764 { Bad_Opcode },
4765 { Bad_Opcode },
4766 { Bad_Opcode },
4767 { Bad_Opcode },
4768 { Bad_Opcode },
f88c9eb0 4769 /* a8 */
592d1631
L
4770 { Bad_Opcode },
4771 { Bad_Opcode },
4772 { Bad_Opcode },
4773 { Bad_Opcode },
4774 { Bad_Opcode },
4775 { Bad_Opcode },
4776 { Bad_Opcode },
4777 { Bad_Opcode },
f88c9eb0 4778 /* b0 */
592d1631
L
4779 { Bad_Opcode },
4780 { Bad_Opcode },
4781 { Bad_Opcode },
4782 { Bad_Opcode },
4783 { Bad_Opcode },
4784 { Bad_Opcode },
4785 { Bad_Opcode },
4786 { Bad_Opcode },
f88c9eb0 4787 /* b8 */
592d1631
L
4788 { Bad_Opcode },
4789 { Bad_Opcode },
4790 { Bad_Opcode },
4791 { Bad_Opcode },
4792 { Bad_Opcode },
4793 { Bad_Opcode },
4794 { Bad_Opcode },
4795 { Bad_Opcode },
f88c9eb0 4796 /* c0 */
592d1631
L
4797 { Bad_Opcode },
4798 { Bad_Opcode },
4799 { Bad_Opcode },
4800 { Bad_Opcode },
4801 { Bad_Opcode },
4802 { Bad_Opcode },
4803 { Bad_Opcode },
4804 { Bad_Opcode },
f88c9eb0 4805 /* c8 */
592d1631
L
4806 { Bad_Opcode },
4807 { Bad_Opcode },
4808 { Bad_Opcode },
4809 { Bad_Opcode },
a0046408 4810 { PREFIX_TABLE (PREFIX_0F3ACC) },
592d1631 4811 { Bad_Opcode },
7531c613
JB
4812 { "gf2p8affineqb", { XM, EXxmm, Ib }, PREFIX_DATA },
4813 { "gf2p8affineinvqb", { XM, EXxmm, Ib }, PREFIX_DATA },
f88c9eb0 4814 /* d0 */
592d1631
L
4815 { Bad_Opcode },
4816 { Bad_Opcode },
4817 { Bad_Opcode },
4818 { Bad_Opcode },
4819 { Bad_Opcode },
4820 { Bad_Opcode },
4821 { Bad_Opcode },
4822 { Bad_Opcode },
f88c9eb0 4823 /* d8 */
592d1631
L
4824 { Bad_Opcode },
4825 { Bad_Opcode },
4826 { Bad_Opcode },
4827 { Bad_Opcode },
4828 { Bad_Opcode },
4829 { Bad_Opcode },
4830 { Bad_Opcode },
7531c613 4831 { "aeskeygenassist", { XM, EXx, Ib }, PREFIX_DATA },
f88c9eb0 4832 /* e0 */
592d1631
L
4833 { Bad_Opcode },
4834 { Bad_Opcode },
4835 { Bad_Opcode },
4836 { Bad_Opcode },
4837 { Bad_Opcode },
592d1631
L
4838 { Bad_Opcode },
4839 { Bad_Opcode },
4840 { Bad_Opcode },
85f10a01 4841 /* e8 */
592d1631
L
4842 { Bad_Opcode },
4843 { Bad_Opcode },
4844 { Bad_Opcode },
4845 { Bad_Opcode },
4846 { Bad_Opcode },
4847 { Bad_Opcode },
4848 { Bad_Opcode },
4849 { Bad_Opcode },
85f10a01 4850 /* f0 */
592d1631
L
4851 { Bad_Opcode },
4852 { Bad_Opcode },
4853 { Bad_Opcode },
4854 { Bad_Opcode },
4855 { Bad_Opcode },
4856 { Bad_Opcode },
4857 { Bad_Opcode },
4858 { Bad_Opcode },
85f10a01 4859 /* f8 */
592d1631
L
4860 { Bad_Opcode },
4861 { Bad_Opcode },
4862 { Bad_Opcode },
4863 { Bad_Opcode },
4864 { Bad_Opcode },
4865 { Bad_Opcode },
4866 { Bad_Opcode },
4867 { Bad_Opcode },
85f10a01 4868 },
f88c9eb0
SP
4869};
4870
4871static const struct dis386 xop_table[][256] = {
5dd85c99 4872 /* XOP_08 */
85f10a01
MM
4873 {
4874 /* 00 */
592d1631
L
4875 { Bad_Opcode },
4876 { Bad_Opcode },
4877 { Bad_Opcode },
4878 { Bad_Opcode },
4879 { Bad_Opcode },
4880 { Bad_Opcode },
4881 { Bad_Opcode },
4882 { Bad_Opcode },
85f10a01 4883 /* 08 */
592d1631
L
4884 { Bad_Opcode },
4885 { Bad_Opcode },
4886 { Bad_Opcode },
4887 { Bad_Opcode },
4888 { Bad_Opcode },
4889 { Bad_Opcode },
4890 { Bad_Opcode },
4891 { Bad_Opcode },
85f10a01 4892 /* 10 */
3929df09 4893 { Bad_Opcode },
592d1631
L
4894 { Bad_Opcode },
4895 { Bad_Opcode },
4896 { Bad_Opcode },
4897 { Bad_Opcode },
4898 { Bad_Opcode },
4899 { Bad_Opcode },
4900 { Bad_Opcode },
85f10a01 4901 /* 18 */
592d1631
L
4902 { Bad_Opcode },
4903 { Bad_Opcode },
4904 { Bad_Opcode },
4905 { Bad_Opcode },
4906 { Bad_Opcode },
4907 { Bad_Opcode },
4908 { Bad_Opcode },
4909 { Bad_Opcode },
85f10a01 4910 /* 20 */
592d1631
L
4911 { Bad_Opcode },
4912 { Bad_Opcode },
4913 { Bad_Opcode },
4914 { Bad_Opcode },
4915 { Bad_Opcode },
4916 { Bad_Opcode },
4917 { Bad_Opcode },
4918 { Bad_Opcode },
85f10a01 4919 /* 28 */
592d1631
L
4920 { Bad_Opcode },
4921 { Bad_Opcode },
4922 { Bad_Opcode },
4923 { Bad_Opcode },
4924 { Bad_Opcode },
4925 { Bad_Opcode },
4926 { Bad_Opcode },
4927 { Bad_Opcode },
c0f3af97 4928 /* 30 */
592d1631
L
4929 { Bad_Opcode },
4930 { Bad_Opcode },
4931 { Bad_Opcode },
4932 { Bad_Opcode },
4933 { Bad_Opcode },
4934 { Bad_Opcode },
4935 { Bad_Opcode },
4936 { Bad_Opcode },
c0f3af97 4937 /* 38 */
592d1631
L
4938 { Bad_Opcode },
4939 { Bad_Opcode },
4940 { Bad_Opcode },
4941 { Bad_Opcode },
4942 { Bad_Opcode },
4943 { Bad_Opcode },
4944 { Bad_Opcode },
4945 { Bad_Opcode },
c0f3af97 4946 /* 40 */
592d1631
L
4947 { Bad_Opcode },
4948 { Bad_Opcode },
4949 { Bad_Opcode },
4950 { Bad_Opcode },
4951 { Bad_Opcode },
4952 { Bad_Opcode },
4953 { Bad_Opcode },
4954 { Bad_Opcode },
85f10a01 4955 /* 48 */
592d1631
L
4956 { Bad_Opcode },
4957 { Bad_Opcode },
4958 { Bad_Opcode },
4959 { Bad_Opcode },
4960 { Bad_Opcode },
4961 { Bad_Opcode },
4962 { Bad_Opcode },
4963 { Bad_Opcode },
c0f3af97 4964 /* 50 */
592d1631
L
4965 { Bad_Opcode },
4966 { Bad_Opcode },
4967 { Bad_Opcode },
4968 { Bad_Opcode },
4969 { Bad_Opcode },
4970 { Bad_Opcode },
4971 { Bad_Opcode },
4972 { Bad_Opcode },
85f10a01 4973 /* 58 */
592d1631
L
4974 { Bad_Opcode },
4975 { Bad_Opcode },
4976 { Bad_Opcode },
4977 { Bad_Opcode },
4978 { Bad_Opcode },
4979 { Bad_Opcode },
4980 { Bad_Opcode },
4981 { Bad_Opcode },
c1e679ec 4982 /* 60 */
592d1631
L
4983 { Bad_Opcode },
4984 { Bad_Opcode },
4985 { Bad_Opcode },
4986 { Bad_Opcode },
4987 { Bad_Opcode },
4988 { Bad_Opcode },
4989 { Bad_Opcode },
4990 { Bad_Opcode },
c0f3af97 4991 /* 68 */
592d1631
L
4992 { Bad_Opcode },
4993 { Bad_Opcode },
4994 { Bad_Opcode },
4995 { Bad_Opcode },
4996 { Bad_Opcode },
4997 { Bad_Opcode },
4998 { Bad_Opcode },
4999 { Bad_Opcode },
85f10a01 5000 /* 70 */
592d1631
L
5001 { Bad_Opcode },
5002 { Bad_Opcode },
5003 { Bad_Opcode },
5004 { Bad_Opcode },
5005 { Bad_Opcode },
5006 { Bad_Opcode },
5007 { Bad_Opcode },
5008 { Bad_Opcode },
85f10a01 5009 /* 78 */
592d1631
L
5010 { Bad_Opcode },
5011 { Bad_Opcode },
5012 { Bad_Opcode },
5013 { Bad_Opcode },
5014 { Bad_Opcode },
5015 { Bad_Opcode },
5016 { Bad_Opcode },
5017 { Bad_Opcode },
85f10a01 5018 /* 80 */
592d1631
L
5019 { Bad_Opcode },
5020 { Bad_Opcode },
5021 { Bad_Opcode },
5022 { Bad_Opcode },
5023 { Bad_Opcode },
467bbef0
JB
5024 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_85) },
5025 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_86) },
5026 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_87) },
5dd85c99 5027 /* 88 */
592d1631
L
5028 { Bad_Opcode },
5029 { Bad_Opcode },
5030 { Bad_Opcode },
5031 { Bad_Opcode },
5032 { Bad_Opcode },
5033 { Bad_Opcode },
467bbef0
JB
5034 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_8E) },
5035 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_8F) },
5dd85c99 5036 /* 90 */
592d1631
L
5037 { Bad_Opcode },
5038 { Bad_Opcode },
5039 { Bad_Opcode },
5040 { Bad_Opcode },
5041 { Bad_Opcode },
467bbef0
JB
5042 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_95) },
5043 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_96) },
5044 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_97) },
5dd85c99 5045 /* 98 */
592d1631
L
5046 { Bad_Opcode },
5047 { Bad_Opcode },
5048 { Bad_Opcode },
5049 { Bad_Opcode },
5050 { Bad_Opcode },
5051 { Bad_Opcode },
467bbef0
JB
5052 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_9E) },
5053 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_9F) },
5dd85c99 5054 /* a0 */
592d1631
L
5055 { Bad_Opcode },
5056 { Bad_Opcode },
b13b1bc0 5057 { "vpcmov", { XM, Vex, EXx, XMVexI4 }, 0 },
467bbef0 5058 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_A3) },
592d1631
L
5059 { Bad_Opcode },
5060 { Bad_Opcode },
467bbef0 5061 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_A6) },
592d1631 5062 { Bad_Opcode },
5dd85c99 5063 /* a8 */
592d1631
L
5064 { Bad_Opcode },
5065 { Bad_Opcode },
5066 { Bad_Opcode },
5067 { Bad_Opcode },
5068 { Bad_Opcode },
5069 { Bad_Opcode },
5070 { Bad_Opcode },
5071 { Bad_Opcode },
5dd85c99 5072 /* b0 */
592d1631
L
5073 { Bad_Opcode },
5074 { Bad_Opcode },
5075 { Bad_Opcode },
5076 { Bad_Opcode },
5077 { Bad_Opcode },
5078 { Bad_Opcode },
467bbef0 5079 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_B6) },
592d1631 5080 { Bad_Opcode },
5dd85c99 5081 /* b8 */
592d1631
L
5082 { Bad_Opcode },
5083 { Bad_Opcode },
5084 { Bad_Opcode },
5085 { Bad_Opcode },
5086 { Bad_Opcode },
5087 { Bad_Opcode },
5088 { Bad_Opcode },
5089 { Bad_Opcode },
5dd85c99 5090 /* c0 */
467bbef0
JB
5091 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C0) },
5092 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C1) },
5093 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C2) },
5094 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C3) },
592d1631
L
5095 { Bad_Opcode },
5096 { Bad_Opcode },
5097 { Bad_Opcode },
5098 { Bad_Opcode },
5dd85c99 5099 /* c8 */
592d1631
L
5100 { Bad_Opcode },
5101 { Bad_Opcode },
5102 { Bad_Opcode },
5103 { Bad_Opcode },
ff688e1f
L
5104 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CC) },
5105 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CD) },
5106 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CE) },
5107 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CF) },
5dd85c99 5108 /* d0 */
592d1631
L
5109 { Bad_Opcode },
5110 { Bad_Opcode },
5111 { Bad_Opcode },
5112 { Bad_Opcode },
5113 { Bad_Opcode },
5114 { Bad_Opcode },
5115 { Bad_Opcode },
5116 { Bad_Opcode },
5dd85c99 5117 /* d8 */
592d1631
L
5118 { Bad_Opcode },
5119 { Bad_Opcode },
5120 { Bad_Opcode },
5121 { Bad_Opcode },
5122 { Bad_Opcode },
5123 { Bad_Opcode },
5124 { Bad_Opcode },
5125 { Bad_Opcode },
5dd85c99 5126 /* e0 */
592d1631
L
5127 { Bad_Opcode },
5128 { Bad_Opcode },
5129 { Bad_Opcode },
5130 { Bad_Opcode },
5131 { Bad_Opcode },
5132 { Bad_Opcode },
5133 { Bad_Opcode },
5134 { Bad_Opcode },
5dd85c99 5135 /* e8 */
592d1631
L
5136 { Bad_Opcode },
5137 { Bad_Opcode },
5138 { Bad_Opcode },
5139 { Bad_Opcode },
ff688e1f
L
5140 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EC) },
5141 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_ED) },
5142 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EE) },
5143 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EF) },
5dd85c99 5144 /* f0 */
592d1631
L
5145 { Bad_Opcode },
5146 { Bad_Opcode },
5147 { Bad_Opcode },
5148 { Bad_Opcode },
5149 { Bad_Opcode },
5150 { Bad_Opcode },
5151 { Bad_Opcode },
5152 { Bad_Opcode },
5dd85c99 5153 /* f8 */
592d1631
L
5154 { Bad_Opcode },
5155 { Bad_Opcode },
5156 { Bad_Opcode },
5157 { Bad_Opcode },
5158 { Bad_Opcode },
5159 { Bad_Opcode },
5160 { Bad_Opcode },
5161 { Bad_Opcode },
5dd85c99
SP
5162 },
5163 /* XOP_09 */
5164 {
5165 /* 00 */
592d1631 5166 { Bad_Opcode },
467bbef0
JB
5167 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_01) },
5168 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_02) },
592d1631
L
5169 { Bad_Opcode },
5170 { Bad_Opcode },
5171 { Bad_Opcode },
5172 { Bad_Opcode },
5173 { Bad_Opcode },
5dd85c99 5174 /* 08 */
592d1631
L
5175 { Bad_Opcode },
5176 { Bad_Opcode },
5177 { Bad_Opcode },
5178 { Bad_Opcode },
5179 { Bad_Opcode },
5180 { Bad_Opcode },
5181 { Bad_Opcode },
5182 { Bad_Opcode },
5dd85c99 5183 /* 10 */
592d1631
L
5184 { Bad_Opcode },
5185 { Bad_Opcode },
467bbef0 5186 { MOD_TABLE (MOD_VEX_0FXOP_09_12) },
592d1631
L
5187 { Bad_Opcode },
5188 { Bad_Opcode },
5189 { Bad_Opcode },
5190 { Bad_Opcode },
5191 { Bad_Opcode },
5dd85c99 5192 /* 18 */
592d1631
L
5193 { Bad_Opcode },
5194 { Bad_Opcode },
5195 { Bad_Opcode },
5196 { Bad_Opcode },
5197 { Bad_Opcode },
5198 { Bad_Opcode },
5199 { Bad_Opcode },
5200 { Bad_Opcode },
5dd85c99 5201 /* 20 */
592d1631
L
5202 { Bad_Opcode },
5203 { Bad_Opcode },
5204 { Bad_Opcode },
5205 { Bad_Opcode },
5206 { Bad_Opcode },
5207 { Bad_Opcode },
5208 { Bad_Opcode },
5209 { Bad_Opcode },
5dd85c99 5210 /* 28 */
592d1631
L
5211 { Bad_Opcode },
5212 { Bad_Opcode },
5213 { Bad_Opcode },
5214 { Bad_Opcode },
5215 { Bad_Opcode },
5216 { Bad_Opcode },
5217 { Bad_Opcode },
5218 { Bad_Opcode },
5dd85c99 5219 /* 30 */
592d1631
L
5220 { Bad_Opcode },
5221 { Bad_Opcode },
5222 { Bad_Opcode },
5223 { Bad_Opcode },
5224 { Bad_Opcode },
5225 { Bad_Opcode },
5226 { Bad_Opcode },
5227 { Bad_Opcode },
5dd85c99 5228 /* 38 */
592d1631
L
5229 { Bad_Opcode },
5230 { Bad_Opcode },
5231 { Bad_Opcode },
5232 { Bad_Opcode },
5233 { Bad_Opcode },
5234 { Bad_Opcode },
5235 { Bad_Opcode },
5236 { Bad_Opcode },
5dd85c99 5237 /* 40 */
592d1631
L
5238 { Bad_Opcode },
5239 { Bad_Opcode },
5240 { Bad_Opcode },
5241 { Bad_Opcode },
5242 { Bad_Opcode },
5243 { Bad_Opcode },
5244 { Bad_Opcode },
5245 { Bad_Opcode },
5dd85c99 5246 /* 48 */
592d1631
L
5247 { Bad_Opcode },
5248 { Bad_Opcode },
5249 { Bad_Opcode },
5250 { Bad_Opcode },
5251 { Bad_Opcode },
5252 { Bad_Opcode },
5253 { Bad_Opcode },
5254 { Bad_Opcode },
5dd85c99 5255 /* 50 */
592d1631
L
5256 { Bad_Opcode },
5257 { Bad_Opcode },
5258 { Bad_Opcode },
5259 { Bad_Opcode },
5260 { Bad_Opcode },
5261 { Bad_Opcode },
5262 { Bad_Opcode },
5263 { Bad_Opcode },
5dd85c99 5264 /* 58 */
592d1631
L
5265 { Bad_Opcode },
5266 { Bad_Opcode },
5267 { Bad_Opcode },
5268 { Bad_Opcode },
5269 { Bad_Opcode },
5270 { Bad_Opcode },
5271 { Bad_Opcode },
5272 { Bad_Opcode },
5dd85c99 5273 /* 60 */
592d1631
L
5274 { Bad_Opcode },
5275 { Bad_Opcode },
5276 { Bad_Opcode },
5277 { Bad_Opcode },
5278 { Bad_Opcode },
5279 { Bad_Opcode },
5280 { Bad_Opcode },
5281 { Bad_Opcode },
5dd85c99 5282 /* 68 */
592d1631
L
5283 { Bad_Opcode },
5284 { Bad_Opcode },
5285 { Bad_Opcode },
5286 { Bad_Opcode },
5287 { Bad_Opcode },
5288 { Bad_Opcode },
5289 { Bad_Opcode },
5290 { Bad_Opcode },
5dd85c99 5291 /* 70 */
592d1631
L
5292 { Bad_Opcode },
5293 { Bad_Opcode },
5294 { Bad_Opcode },
5295 { Bad_Opcode },
5296 { Bad_Opcode },
5297 { Bad_Opcode },
5298 { Bad_Opcode },
5299 { Bad_Opcode },
5dd85c99 5300 /* 78 */
592d1631
L
5301 { Bad_Opcode },
5302 { Bad_Opcode },
5303 { Bad_Opcode },
5304 { Bad_Opcode },
5305 { Bad_Opcode },
5306 { Bad_Opcode },
5307 { Bad_Opcode },
5308 { Bad_Opcode },
5dd85c99 5309 /* 80 */
b5b098c2
JB
5310 { VEX_W_TABLE (VEX_W_0FXOP_09_80) },
5311 { VEX_W_TABLE (VEX_W_0FXOP_09_81) },
5312 { VEX_W_TABLE (VEX_W_0FXOP_09_82) },
5313 { VEX_W_TABLE (VEX_W_0FXOP_09_83) },
592d1631
L
5314 { Bad_Opcode },
5315 { Bad_Opcode },
5316 { Bad_Opcode },
5317 { Bad_Opcode },
5dd85c99 5318 /* 88 */
592d1631
L
5319 { Bad_Opcode },
5320 { Bad_Opcode },
5321 { Bad_Opcode },
5322 { Bad_Opcode },
5323 { Bad_Opcode },
5324 { Bad_Opcode },
5325 { Bad_Opcode },
5326 { Bad_Opcode },
5dd85c99 5327 /* 90 */
467bbef0
JB
5328 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_90) },
5329 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_91) },
5330 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_92) },
5331 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_93) },
5332 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_94) },
5333 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_95) },
5334 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_96) },
5335 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_97) },
5dd85c99 5336 /* 98 */
467bbef0
JB
5337 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_98) },
5338 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_99) },
5339 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_9A) },
5340 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_9B) },
592d1631
L
5341 { Bad_Opcode },
5342 { Bad_Opcode },
5343 { Bad_Opcode },
5344 { Bad_Opcode },
5dd85c99 5345 /* a0 */
592d1631
L
5346 { Bad_Opcode },
5347 { Bad_Opcode },
5348 { Bad_Opcode },
5349 { Bad_Opcode },
5350 { Bad_Opcode },
5351 { Bad_Opcode },
5352 { Bad_Opcode },
5353 { Bad_Opcode },
5dd85c99 5354 /* a8 */
592d1631
L
5355 { Bad_Opcode },
5356 { Bad_Opcode },
5357 { Bad_Opcode },
5358 { Bad_Opcode },
5359 { Bad_Opcode },
5360 { Bad_Opcode },
5361 { Bad_Opcode },
5362 { Bad_Opcode },
5dd85c99 5363 /* b0 */
592d1631
L
5364 { Bad_Opcode },
5365 { Bad_Opcode },
5366 { Bad_Opcode },
5367 { Bad_Opcode },
5368 { Bad_Opcode },
5369 { Bad_Opcode },
5370 { Bad_Opcode },
5371 { Bad_Opcode },
5dd85c99 5372 /* b8 */
592d1631
L
5373 { Bad_Opcode },
5374 { Bad_Opcode },
5375 { Bad_Opcode },
5376 { Bad_Opcode },
5377 { Bad_Opcode },
5378 { Bad_Opcode },
5379 { Bad_Opcode },
5380 { Bad_Opcode },
5dd85c99 5381 /* c0 */
592d1631 5382 { Bad_Opcode },
467bbef0
JB
5383 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C1) },
5384 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C2) },
5385 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C3) },
592d1631
L
5386 { Bad_Opcode },
5387 { Bad_Opcode },
467bbef0
JB
5388 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C6) },
5389 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C7) },
5dd85c99 5390 /* c8 */
592d1631
L
5391 { Bad_Opcode },
5392 { Bad_Opcode },
5393 { Bad_Opcode },
467bbef0 5394 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_CB) },
592d1631
L
5395 { Bad_Opcode },
5396 { Bad_Opcode },
5397 { Bad_Opcode },
5398 { Bad_Opcode },
5dd85c99 5399 /* d0 */
592d1631 5400 { Bad_Opcode },
467bbef0
JB
5401 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D1) },
5402 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D2) },
5403 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D3) },
592d1631
L
5404 { Bad_Opcode },
5405 { Bad_Opcode },
467bbef0
JB
5406 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D6) },
5407 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D7) },
5dd85c99 5408 /* d8 */
592d1631
L
5409 { Bad_Opcode },
5410 { Bad_Opcode },
5411 { Bad_Opcode },
467bbef0 5412 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_DB) },
592d1631
L
5413 { Bad_Opcode },
5414 { Bad_Opcode },
5415 { Bad_Opcode },
5416 { Bad_Opcode },
5dd85c99 5417 /* e0 */
592d1631 5418 { Bad_Opcode },
467bbef0
JB
5419 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E1) },
5420 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E2) },
5421 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E3) },
592d1631
L
5422 { Bad_Opcode },
5423 { Bad_Opcode },
5424 { Bad_Opcode },
5425 { Bad_Opcode },
4e7d34a6 5426 /* e8 */
592d1631
L
5427 { Bad_Opcode },
5428 { Bad_Opcode },
5429 { Bad_Opcode },
5430 { Bad_Opcode },
5431 { Bad_Opcode },
5432 { Bad_Opcode },
5433 { Bad_Opcode },
5434 { Bad_Opcode },
4e7d34a6 5435 /* f0 */
592d1631
L
5436 { Bad_Opcode },
5437 { Bad_Opcode },
5438 { Bad_Opcode },
5439 { Bad_Opcode },
5440 { Bad_Opcode },
5441 { Bad_Opcode },
5442 { Bad_Opcode },
5443 { Bad_Opcode },
4e7d34a6 5444 /* f8 */
592d1631
L
5445 { Bad_Opcode },
5446 { Bad_Opcode },
5447 { Bad_Opcode },
5448 { Bad_Opcode },
5449 { Bad_Opcode },
5450 { Bad_Opcode },
5451 { Bad_Opcode },
5452 { Bad_Opcode },
4e7d34a6 5453 },
f88c9eb0 5454 /* XOP_0A */
4e7d34a6
L
5455 {
5456 /* 00 */
592d1631
L
5457 { Bad_Opcode },
5458 { Bad_Opcode },
5459 { Bad_Opcode },
5460 { Bad_Opcode },
5461 { Bad_Opcode },
5462 { Bad_Opcode },
5463 { Bad_Opcode },
5464 { Bad_Opcode },
4e7d34a6 5465 /* 08 */
592d1631
L
5466 { Bad_Opcode },
5467 { Bad_Opcode },
5468 { Bad_Opcode },
5469 { Bad_Opcode },
5470 { Bad_Opcode },
5471 { Bad_Opcode },
5472 { Bad_Opcode },
5473 { Bad_Opcode },
4e7d34a6 5474 /* 10 */
c1dc7af5 5475 { "bextrS", { Gdq, Edq, Id }, 0 },
592d1631 5476 { Bad_Opcode },
467bbef0 5477 { VEX_LEN_TABLE (VEX_LEN_0FXOP_0A_12) },
592d1631
L
5478 { Bad_Opcode },
5479 { Bad_Opcode },
5480 { Bad_Opcode },
5481 { Bad_Opcode },
5482 { Bad_Opcode },
4e7d34a6 5483 /* 18 */
592d1631
L
5484 { Bad_Opcode },
5485 { Bad_Opcode },
5486 { Bad_Opcode },
5487 { Bad_Opcode },
5488 { Bad_Opcode },
5489 { Bad_Opcode },
5490 { Bad_Opcode },
5491 { Bad_Opcode },
4e7d34a6 5492 /* 20 */
592d1631
L
5493 { Bad_Opcode },
5494 { Bad_Opcode },
5495 { Bad_Opcode },
5496 { Bad_Opcode },
5497 { Bad_Opcode },
5498 { Bad_Opcode },
5499 { Bad_Opcode },
5500 { Bad_Opcode },
4e7d34a6 5501 /* 28 */
592d1631
L
5502 { Bad_Opcode },
5503 { Bad_Opcode },
5504 { Bad_Opcode },
5505 { Bad_Opcode },
5506 { Bad_Opcode },
5507 { Bad_Opcode },
5508 { Bad_Opcode },
5509 { Bad_Opcode },
4e7d34a6 5510 /* 30 */
592d1631
L
5511 { Bad_Opcode },
5512 { Bad_Opcode },
5513 { Bad_Opcode },
5514 { Bad_Opcode },
5515 { Bad_Opcode },
5516 { Bad_Opcode },
5517 { Bad_Opcode },
5518 { Bad_Opcode },
c0f3af97 5519 /* 38 */
592d1631
L
5520 { Bad_Opcode },
5521 { Bad_Opcode },
5522 { Bad_Opcode },
5523 { Bad_Opcode },
5524 { Bad_Opcode },
5525 { Bad_Opcode },
5526 { Bad_Opcode },
5527 { Bad_Opcode },
c0f3af97 5528 /* 40 */
592d1631
L
5529 { Bad_Opcode },
5530 { Bad_Opcode },
5531 { Bad_Opcode },
5532 { Bad_Opcode },
5533 { Bad_Opcode },
5534 { Bad_Opcode },
5535 { Bad_Opcode },
5536 { Bad_Opcode },
c1e679ec 5537 /* 48 */
592d1631
L
5538 { Bad_Opcode },
5539 { Bad_Opcode },
5540 { Bad_Opcode },
5541 { Bad_Opcode },
5542 { Bad_Opcode },
5543 { Bad_Opcode },
5544 { Bad_Opcode },
5545 { Bad_Opcode },
c1e679ec 5546 /* 50 */
592d1631
L
5547 { Bad_Opcode },
5548 { Bad_Opcode },
5549 { Bad_Opcode },
5550 { Bad_Opcode },
5551 { Bad_Opcode },
5552 { Bad_Opcode },
5553 { Bad_Opcode },
5554 { Bad_Opcode },
4e7d34a6 5555 /* 58 */
592d1631
L
5556 { Bad_Opcode },
5557 { Bad_Opcode },
5558 { Bad_Opcode },
5559 { Bad_Opcode },
5560 { Bad_Opcode },
5561 { Bad_Opcode },
5562 { Bad_Opcode },
5563 { Bad_Opcode },
4e7d34a6 5564 /* 60 */
592d1631
L
5565 { Bad_Opcode },
5566 { Bad_Opcode },
5567 { Bad_Opcode },
5568 { Bad_Opcode },
5569 { Bad_Opcode },
5570 { Bad_Opcode },
5571 { Bad_Opcode },
5572 { Bad_Opcode },
4e7d34a6 5573 /* 68 */
592d1631
L
5574 { Bad_Opcode },
5575 { Bad_Opcode },
5576 { Bad_Opcode },
5577 { Bad_Opcode },
5578 { Bad_Opcode },
5579 { Bad_Opcode },
5580 { Bad_Opcode },
5581 { Bad_Opcode },
4e7d34a6 5582 /* 70 */
592d1631
L
5583 { Bad_Opcode },
5584 { Bad_Opcode },
5585 { Bad_Opcode },
5586 { Bad_Opcode },
5587 { Bad_Opcode },
5588 { Bad_Opcode },
5589 { Bad_Opcode },
5590 { Bad_Opcode },
4e7d34a6 5591 /* 78 */
592d1631
L
5592 { Bad_Opcode },
5593 { Bad_Opcode },
5594 { Bad_Opcode },
5595 { Bad_Opcode },
5596 { Bad_Opcode },
5597 { Bad_Opcode },
5598 { Bad_Opcode },
5599 { Bad_Opcode },
4e7d34a6 5600 /* 80 */
592d1631
L
5601 { Bad_Opcode },
5602 { Bad_Opcode },
5603 { Bad_Opcode },
5604 { Bad_Opcode },
5605 { Bad_Opcode },
5606 { Bad_Opcode },
5607 { Bad_Opcode },
5608 { Bad_Opcode },
4e7d34a6 5609 /* 88 */
592d1631
L
5610 { Bad_Opcode },
5611 { Bad_Opcode },
5612 { Bad_Opcode },
5613 { Bad_Opcode },
5614 { Bad_Opcode },
5615 { Bad_Opcode },
5616 { Bad_Opcode },
5617 { Bad_Opcode },
4e7d34a6 5618 /* 90 */
592d1631
L
5619 { Bad_Opcode },
5620 { Bad_Opcode },
5621 { Bad_Opcode },
5622 { Bad_Opcode },
5623 { Bad_Opcode },
5624 { Bad_Opcode },
5625 { Bad_Opcode },
5626 { Bad_Opcode },
4e7d34a6 5627 /* 98 */
592d1631
L
5628 { Bad_Opcode },
5629 { Bad_Opcode },
5630 { Bad_Opcode },
5631 { Bad_Opcode },
5632 { Bad_Opcode },
5633 { Bad_Opcode },
5634 { Bad_Opcode },
5635 { Bad_Opcode },
4e7d34a6 5636 /* a0 */
592d1631
L
5637 { Bad_Opcode },
5638 { Bad_Opcode },
5639 { Bad_Opcode },
5640 { Bad_Opcode },
5641 { Bad_Opcode },
5642 { Bad_Opcode },
5643 { Bad_Opcode },
5644 { Bad_Opcode },
4e7d34a6 5645 /* a8 */
592d1631
L
5646 { Bad_Opcode },
5647 { Bad_Opcode },
5648 { Bad_Opcode },
5649 { Bad_Opcode },
5650 { Bad_Opcode },
5651 { Bad_Opcode },
5652 { Bad_Opcode },
5653 { Bad_Opcode },
d5d7db8e 5654 /* b0 */
592d1631
L
5655 { Bad_Opcode },
5656 { Bad_Opcode },
5657 { Bad_Opcode },
5658 { Bad_Opcode },
5659 { Bad_Opcode },
5660 { Bad_Opcode },
5661 { Bad_Opcode },
5662 { Bad_Opcode },
85f10a01 5663 /* b8 */
592d1631
L
5664 { Bad_Opcode },
5665 { Bad_Opcode },
5666 { Bad_Opcode },
5667 { Bad_Opcode },
5668 { Bad_Opcode },
5669 { Bad_Opcode },
5670 { Bad_Opcode },
5671 { Bad_Opcode },
85f10a01 5672 /* c0 */
592d1631
L
5673 { Bad_Opcode },
5674 { Bad_Opcode },
5675 { Bad_Opcode },
5676 { Bad_Opcode },
5677 { Bad_Opcode },
5678 { Bad_Opcode },
5679 { Bad_Opcode },
5680 { Bad_Opcode },
85f10a01 5681 /* c8 */
592d1631
L
5682 { Bad_Opcode },
5683 { Bad_Opcode },
5684 { Bad_Opcode },
5685 { Bad_Opcode },
5686 { Bad_Opcode },
5687 { Bad_Opcode },
5688 { Bad_Opcode },
5689 { Bad_Opcode },
85f10a01 5690 /* d0 */
592d1631
L
5691 { Bad_Opcode },
5692 { Bad_Opcode },
5693 { Bad_Opcode },
5694 { Bad_Opcode },
5695 { Bad_Opcode },
5696 { Bad_Opcode },
5697 { Bad_Opcode },
5698 { Bad_Opcode },
85f10a01 5699 /* d8 */
592d1631
L
5700 { Bad_Opcode },
5701 { Bad_Opcode },
5702 { Bad_Opcode },
5703 { Bad_Opcode },
5704 { Bad_Opcode },
5705 { Bad_Opcode },
5706 { Bad_Opcode },
5707 { Bad_Opcode },
85f10a01 5708 /* e0 */
592d1631
L
5709 { Bad_Opcode },
5710 { Bad_Opcode },
5711 { Bad_Opcode },
5712 { Bad_Opcode },
5713 { Bad_Opcode },
5714 { Bad_Opcode },
5715 { Bad_Opcode },
5716 { Bad_Opcode },
85f10a01 5717 /* e8 */
592d1631
L
5718 { Bad_Opcode },
5719 { Bad_Opcode },
5720 { Bad_Opcode },
5721 { Bad_Opcode },
5722 { Bad_Opcode },
5723 { Bad_Opcode },
5724 { Bad_Opcode },
5725 { Bad_Opcode },
85f10a01 5726 /* f0 */
592d1631
L
5727 { Bad_Opcode },
5728 { Bad_Opcode },
5729 { Bad_Opcode },
5730 { Bad_Opcode },
5731 { Bad_Opcode },
5732 { Bad_Opcode },
5733 { Bad_Opcode },
5734 { Bad_Opcode },
85f10a01 5735 /* f8 */
592d1631
L
5736 { Bad_Opcode },
5737 { Bad_Opcode },
5738 { Bad_Opcode },
5739 { Bad_Opcode },
5740 { Bad_Opcode },
5741 { Bad_Opcode },
5742 { Bad_Opcode },
5743 { Bad_Opcode },
85f10a01 5744 },
c0f3af97
L
5745};
5746
5747static const struct dis386 vex_table[][256] = {
5748 /* VEX_0F */
85f10a01
MM
5749 {
5750 /* 00 */
592d1631
L
5751 { Bad_Opcode },
5752 { Bad_Opcode },
5753 { Bad_Opcode },
5754 { Bad_Opcode },
5755 { Bad_Opcode },
5756 { Bad_Opcode },
5757 { Bad_Opcode },
5758 { Bad_Opcode },
85f10a01 5759 /* 08 */
592d1631
L
5760 { Bad_Opcode },
5761 { Bad_Opcode },
5762 { Bad_Opcode },
5763 { Bad_Opcode },
5764 { Bad_Opcode },
5765 { Bad_Opcode },
5766 { Bad_Opcode },
5767 { Bad_Opcode },
c0f3af97 5768 /* 10 */
592a252b
L
5769 { PREFIX_TABLE (PREFIX_VEX_0F10) },
5770 { PREFIX_TABLE (PREFIX_VEX_0F11) },
5771 { PREFIX_TABLE (PREFIX_VEX_0F12) },
5772 { MOD_TABLE (MOD_VEX_0F13) },
bf926894
JB
5773 { "vunpcklpX", { XM, Vex, EXx }, PREFIX_OPCODE },
5774 { "vunpckhpX", { XM, Vex, EXx }, PREFIX_OPCODE },
592a252b
L
5775 { PREFIX_TABLE (PREFIX_VEX_0F16) },
5776 { MOD_TABLE (MOD_VEX_0F17) },
c0f3af97 5777 /* 18 */
592d1631
L
5778 { Bad_Opcode },
5779 { Bad_Opcode },
5780 { Bad_Opcode },
5781 { Bad_Opcode },
5782 { Bad_Opcode },
5783 { Bad_Opcode },
5784 { Bad_Opcode },
5785 { Bad_Opcode },
c0f3af97 5786 /* 20 */
592d1631
L
5787 { Bad_Opcode },
5788 { Bad_Opcode },
5789 { Bad_Opcode },
5790 { Bad_Opcode },
5791 { Bad_Opcode },
5792 { Bad_Opcode },
5793 { Bad_Opcode },
5794 { Bad_Opcode },
c0f3af97 5795 /* 28 */
bf926894
JB
5796 { "vmovapX", { XM, EXx }, PREFIX_OPCODE },
5797 { "vmovapX", { EXxS, XM }, PREFIX_OPCODE },
592a252b
L
5798 { PREFIX_TABLE (PREFIX_VEX_0F2A) },
5799 { MOD_TABLE (MOD_VEX_0F2B) },
5800 { PREFIX_TABLE (PREFIX_VEX_0F2C) },
5801 { PREFIX_TABLE (PREFIX_VEX_0F2D) },
5802 { PREFIX_TABLE (PREFIX_VEX_0F2E) },
5803 { PREFIX_TABLE (PREFIX_VEX_0F2F) },
85f10a01 5804 /* 30 */
592d1631
L
5805 { Bad_Opcode },
5806 { Bad_Opcode },
5807 { Bad_Opcode },
5808 { Bad_Opcode },
5809 { Bad_Opcode },
5810 { Bad_Opcode },
5811 { Bad_Opcode },
5812 { Bad_Opcode },
4e7d34a6 5813 /* 38 */
592d1631
L
5814 { Bad_Opcode },
5815 { Bad_Opcode },
5816 { Bad_Opcode },
5817 { Bad_Opcode },
5818 { Bad_Opcode },
5819 { Bad_Opcode },
5820 { Bad_Opcode },
5821 { Bad_Opcode },
d5d7db8e 5822 /* 40 */
592d1631 5823 { Bad_Opcode },
43234a1e
L
5824 { PREFIX_TABLE (PREFIX_VEX_0F41) },
5825 { PREFIX_TABLE (PREFIX_VEX_0F42) },
592d1631 5826 { Bad_Opcode },
43234a1e
L
5827 { PREFIX_TABLE (PREFIX_VEX_0F44) },
5828 { PREFIX_TABLE (PREFIX_VEX_0F45) },
5829 { PREFIX_TABLE (PREFIX_VEX_0F46) },
5830 { PREFIX_TABLE (PREFIX_VEX_0F47) },
85f10a01 5831 /* 48 */
592d1631
L
5832 { Bad_Opcode },
5833 { Bad_Opcode },
1ba585e8 5834 { PREFIX_TABLE (PREFIX_VEX_0F4A) },
43234a1e 5835 { PREFIX_TABLE (PREFIX_VEX_0F4B) },
592d1631
L
5836 { Bad_Opcode },
5837 { Bad_Opcode },
5838 { Bad_Opcode },
5839 { Bad_Opcode },
d5d7db8e 5840 /* 50 */
592a252b
L
5841 { MOD_TABLE (MOD_VEX_0F50) },
5842 { PREFIX_TABLE (PREFIX_VEX_0F51) },
5843 { PREFIX_TABLE (PREFIX_VEX_0F52) },
5844 { PREFIX_TABLE (PREFIX_VEX_0F53) },
bf926894
JB
5845 { "vandpX", { XM, Vex, EXx }, PREFIX_OPCODE },
5846 { "vandnpX", { XM, Vex, EXx }, PREFIX_OPCODE },
5847 { "vorpX", { XM, Vex, EXx }, PREFIX_OPCODE },
5848 { "vxorpX", { XM, Vex, EXx }, PREFIX_OPCODE },
c0f3af97 5849 /* 58 */
592a252b
L
5850 { PREFIX_TABLE (PREFIX_VEX_0F58) },
5851 { PREFIX_TABLE (PREFIX_VEX_0F59) },
5852 { PREFIX_TABLE (PREFIX_VEX_0F5A) },
5853 { PREFIX_TABLE (PREFIX_VEX_0F5B) },
5854 { PREFIX_TABLE (PREFIX_VEX_0F5C) },
5855 { PREFIX_TABLE (PREFIX_VEX_0F5D) },
5856 { PREFIX_TABLE (PREFIX_VEX_0F5E) },
5857 { PREFIX_TABLE (PREFIX_VEX_0F5F) },
c0f3af97 5858 /* 60 */
7531c613
JB
5859 { "vpunpcklbw", { XM, Vex, EXx }, PREFIX_DATA },
5860 { "vpunpcklwd", { XM, Vex, EXx }, PREFIX_DATA },
5861 { "vpunpckldq", { XM, Vex, EXx }, PREFIX_DATA },
5862 { "vpacksswb", { XM, Vex, EXx }, PREFIX_DATA },
5863 { "vpcmpgtb", { XM, Vex, EXx }, PREFIX_DATA },
5864 { "vpcmpgtw", { XM, Vex, EXx }, PREFIX_DATA },
5865 { "vpcmpgtd", { XM, Vex, EXx }, PREFIX_DATA },
5866 { "vpackuswb", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 5867 /* 68 */
7531c613
JB
5868 { "vpunpckhbw", { XM, Vex, EXx }, PREFIX_DATA },
5869 { "vpunpckhwd", { XM, Vex, EXx }, PREFIX_DATA },
5870 { "vpunpckhdq", { XM, Vex, EXx }, PREFIX_DATA },
5871 { "vpackssdw", { XM, Vex, EXx }, PREFIX_DATA },
5872 { "vpunpcklqdq", { XM, Vex, EXx }, PREFIX_DATA },
5873 { "vpunpckhqdq", { XM, Vex, EXx }, PREFIX_DATA },
5874 { VEX_LEN_TABLE (VEX_LEN_0F6E) },
592a252b 5875 { PREFIX_TABLE (PREFIX_VEX_0F6F) },
c0f3af97 5876 /* 70 */
592a252b
L
5877 { PREFIX_TABLE (PREFIX_VEX_0F70) },
5878 { REG_TABLE (REG_VEX_0F71) },
5879 { REG_TABLE (REG_VEX_0F72) },
5880 { REG_TABLE (REG_VEX_0F73) },
7531c613
JB
5881 { "vpcmpeqb", { XM, Vex, EXx }, PREFIX_DATA },
5882 { "vpcmpeqw", { XM, Vex, EXx }, PREFIX_DATA },
5883 { "vpcmpeqd", { XM, Vex, EXx }, PREFIX_DATA },
592a252b 5884 { PREFIX_TABLE (PREFIX_VEX_0F77) },
c0f3af97 5885 /* 78 */
592d1631
L
5886 { Bad_Opcode },
5887 { Bad_Opcode },
5888 { Bad_Opcode },
5889 { Bad_Opcode },
592a252b
L
5890 { PREFIX_TABLE (PREFIX_VEX_0F7C) },
5891 { PREFIX_TABLE (PREFIX_VEX_0F7D) },
5892 { PREFIX_TABLE (PREFIX_VEX_0F7E) },
5893 { PREFIX_TABLE (PREFIX_VEX_0F7F) },
c0f3af97 5894 /* 80 */
592d1631
L
5895 { Bad_Opcode },
5896 { Bad_Opcode },
5897 { Bad_Opcode },
5898 { Bad_Opcode },
5899 { Bad_Opcode },
5900 { Bad_Opcode },
5901 { Bad_Opcode },
5902 { Bad_Opcode },
c0f3af97 5903 /* 88 */
592d1631
L
5904 { Bad_Opcode },
5905 { Bad_Opcode },
5906 { Bad_Opcode },
5907 { Bad_Opcode },
5908 { Bad_Opcode },
5909 { Bad_Opcode },
5910 { Bad_Opcode },
5911 { Bad_Opcode },
c0f3af97 5912 /* 90 */
43234a1e
L
5913 { PREFIX_TABLE (PREFIX_VEX_0F90) },
5914 { PREFIX_TABLE (PREFIX_VEX_0F91) },
5915 { PREFIX_TABLE (PREFIX_VEX_0F92) },
5916 { PREFIX_TABLE (PREFIX_VEX_0F93) },
592d1631
L
5917 { Bad_Opcode },
5918 { Bad_Opcode },
5919 { Bad_Opcode },
5920 { Bad_Opcode },
c0f3af97 5921 /* 98 */
43234a1e 5922 { PREFIX_TABLE (PREFIX_VEX_0F98) },
1ba585e8 5923 { PREFIX_TABLE (PREFIX_VEX_0F99) },
592d1631
L
5924 { Bad_Opcode },
5925 { Bad_Opcode },
5926 { Bad_Opcode },
5927 { Bad_Opcode },
5928 { Bad_Opcode },
5929 { Bad_Opcode },
c0f3af97 5930 /* a0 */
592d1631
L
5931 { Bad_Opcode },
5932 { Bad_Opcode },
5933 { Bad_Opcode },
5934 { Bad_Opcode },
5935 { Bad_Opcode },
5936 { Bad_Opcode },
5937 { Bad_Opcode },
5938 { Bad_Opcode },
c0f3af97 5939 /* a8 */
592d1631
L
5940 { Bad_Opcode },
5941 { Bad_Opcode },
5942 { Bad_Opcode },
5943 { Bad_Opcode },
5944 { Bad_Opcode },
5945 { Bad_Opcode },
592a252b 5946 { REG_TABLE (REG_VEX_0FAE) },
592d1631 5947 { Bad_Opcode },
c0f3af97 5948 /* b0 */
592d1631
L
5949 { Bad_Opcode },
5950 { Bad_Opcode },
5951 { Bad_Opcode },
5952 { Bad_Opcode },
5953 { Bad_Opcode },
5954 { Bad_Opcode },
5955 { Bad_Opcode },
5956 { Bad_Opcode },
c0f3af97 5957 /* b8 */
592d1631
L
5958 { Bad_Opcode },
5959 { Bad_Opcode },
5960 { Bad_Opcode },
5961 { Bad_Opcode },
5962 { Bad_Opcode },
5963 { Bad_Opcode },
5964 { Bad_Opcode },
5965 { Bad_Opcode },
c0f3af97 5966 /* c0 */
592d1631
L
5967 { Bad_Opcode },
5968 { Bad_Opcode },
592a252b 5969 { PREFIX_TABLE (PREFIX_VEX_0FC2) },
592d1631 5970 { Bad_Opcode },
7531c613
JB
5971 { VEX_LEN_TABLE (VEX_LEN_0FC4) },
5972 { VEX_LEN_TABLE (VEX_LEN_0FC5) },
bf926894 5973 { "vshufpX", { XM, Vex, EXx, Ib }, PREFIX_OPCODE },
592d1631 5974 { Bad_Opcode },
c0f3af97 5975 /* c8 */
592d1631
L
5976 { Bad_Opcode },
5977 { Bad_Opcode },
5978 { Bad_Opcode },
5979 { Bad_Opcode },
5980 { Bad_Opcode },
5981 { Bad_Opcode },
5982 { Bad_Opcode },
5983 { Bad_Opcode },
c0f3af97 5984 /* d0 */
592a252b 5985 { PREFIX_TABLE (PREFIX_VEX_0FD0) },
7531c613
JB
5986 { "vpsrlw", { XM, Vex, EXxmm }, PREFIX_DATA },
5987 { "vpsrld", { XM, Vex, EXxmm }, PREFIX_DATA },
5988 { "vpsrlq", { XM, Vex, EXxmm }, PREFIX_DATA },
5989 { "vpaddq", { XM, Vex, EXx }, PREFIX_DATA },
5990 { "vpmullw", { XM, Vex, EXx }, PREFIX_DATA },
5991 { VEX_LEN_TABLE (VEX_LEN_0FD6) },
5992 { MOD_TABLE (MOD_VEX_0FD7) },
c0f3af97 5993 /* d8 */
7531c613
JB
5994 { "vpsubusb", { XM, Vex, EXx }, PREFIX_DATA },
5995 { "vpsubusw", { XM, Vex, EXx }, PREFIX_DATA },
5996 { "vpminub", { XM, Vex, EXx }, PREFIX_DATA },
5997 { "vpand", { XM, Vex, EXx }, PREFIX_DATA },
5998 { "vpaddusb", { XM, Vex, EXx }, PREFIX_DATA },
5999 { "vpaddusw", { XM, Vex, EXx }, PREFIX_DATA },
6000 { "vpmaxub", { XM, Vex, EXx }, PREFIX_DATA },
6001 { "vpandn", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6002 /* e0 */
7531c613
JB
6003 { "vpavgb", { XM, Vex, EXx }, PREFIX_DATA },
6004 { "vpsraw", { XM, Vex, EXxmm }, PREFIX_DATA },
6005 { "vpsrad", { XM, Vex, EXxmm }, PREFIX_DATA },
6006 { "vpavgw", { XM, Vex, EXx }, PREFIX_DATA },
6007 { "vpmulhuw", { XM, Vex, EXx }, PREFIX_DATA },
6008 { "vpmulhw", { XM, Vex, EXx }, PREFIX_DATA },
592a252b 6009 { PREFIX_TABLE (PREFIX_VEX_0FE6) },
7531c613 6010 { MOD_TABLE (MOD_VEX_0FE7) },
c0f3af97 6011 /* e8 */
7531c613
JB
6012 { "vpsubsb", { XM, Vex, EXx }, PREFIX_DATA },
6013 { "vpsubsw", { XM, Vex, EXx }, PREFIX_DATA },
6014 { "vpminsw", { XM, Vex, EXx }, PREFIX_DATA },
6015 { "vpor", { XM, Vex, EXx }, PREFIX_DATA },
6016 { "vpaddsb", { XM, Vex, EXx }, PREFIX_DATA },
6017 { "vpaddsw", { XM, Vex, EXx }, PREFIX_DATA },
6018 { "vpmaxsw", { XM, Vex, EXx }, PREFIX_DATA },
6019 { "vpxor", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6020 /* f0 */
592a252b 6021 { PREFIX_TABLE (PREFIX_VEX_0FF0) },
7531c613
JB
6022 { "vpsllw", { XM, Vex, EXxmm }, PREFIX_DATA },
6023 { "vpslld", { XM, Vex, EXxmm }, PREFIX_DATA },
6024 { "vpsllq", { XM, Vex, EXxmm }, PREFIX_DATA },
6025 { "vpmuludq", { XM, Vex, EXx }, PREFIX_DATA },
6026 { "vpmaddwd", { XM, Vex, EXx }, PREFIX_DATA },
6027 { "vpsadbw", { XM, Vex, EXx }, PREFIX_DATA },
6028 { VEX_LEN_TABLE (VEX_LEN_0FF7) },
c0f3af97 6029 /* f8 */
7531c613
JB
6030 { "vpsubb", { XM, Vex, EXx }, PREFIX_DATA },
6031 { "vpsubw", { XM, Vex, EXx }, PREFIX_DATA },
6032 { "vpsubd", { XM, Vex, EXx }, PREFIX_DATA },
6033 { "vpsubq", { XM, Vex, EXx }, PREFIX_DATA },
6034 { "vpaddb", { XM, Vex, EXx }, PREFIX_DATA },
6035 { "vpaddw", { XM, Vex, EXx }, PREFIX_DATA },
6036 { "vpaddd", { XM, Vex, EXx }, PREFIX_DATA },
592d1631 6037 { Bad_Opcode },
c0f3af97
L
6038 },
6039 /* VEX_0F38 */
6040 {
6041 /* 00 */
7531c613
JB
6042 { "vpshufb", { XM, Vex, EXx }, PREFIX_DATA },
6043 { "vphaddw", { XM, Vex, EXx }, PREFIX_DATA },
6044 { "vphaddd", { XM, Vex, EXx }, PREFIX_DATA },
6045 { "vphaddsw", { XM, Vex, EXx }, PREFIX_DATA },
6046 { "vpmaddubsw", { XM, Vex, EXx }, PREFIX_DATA },
6047 { "vphsubw", { XM, Vex, EXx }, PREFIX_DATA },
6048 { "vphsubd", { XM, Vex, EXx }, PREFIX_DATA },
6049 { "vphsubsw", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6050 /* 08 */
7531c613
JB
6051 { "vpsignb", { XM, Vex, EXx }, PREFIX_DATA },
6052 { "vpsignw", { XM, Vex, EXx }, PREFIX_DATA },
6053 { "vpsignd", { XM, Vex, EXx }, PREFIX_DATA },
6054 { "vpmulhrsw", { XM, Vex, EXx }, PREFIX_DATA },
6055 { VEX_W_TABLE (VEX_W_0F380C) },
6056 { VEX_W_TABLE (VEX_W_0F380D) },
6057 { VEX_W_TABLE (VEX_W_0F380E) },
6058 { VEX_W_TABLE (VEX_W_0F380F) },
c0f3af97 6059 /* 10 */
592d1631
L
6060 { Bad_Opcode },
6061 { Bad_Opcode },
6062 { Bad_Opcode },
7531c613 6063 { VEX_W_TABLE (VEX_W_0F3813) },
592d1631
L
6064 { Bad_Opcode },
6065 { Bad_Opcode },
7531c613
JB
6066 { VEX_LEN_TABLE (VEX_LEN_0F3816) },
6067 { "vptest", { XM, EXx }, PREFIX_DATA },
c0f3af97 6068 /* 18 */
7531c613
JB
6069 { VEX_W_TABLE (VEX_W_0F3818) },
6070 { VEX_LEN_TABLE (VEX_LEN_0F3819) },
6071 { MOD_TABLE (MOD_VEX_0F381A) },
592d1631 6072 { Bad_Opcode },
7531c613
JB
6073 { "vpabsb", { XM, EXx }, PREFIX_DATA },
6074 { "vpabsw", { XM, EXx }, PREFIX_DATA },
6075 { "vpabsd", { XM, EXx }, PREFIX_DATA },
592d1631 6076 { Bad_Opcode },
c0f3af97 6077 /* 20 */
7531c613
JB
6078 { "vpmovsxbw", { XM, EXxmmq }, PREFIX_DATA },
6079 { "vpmovsxbd", { XM, EXxmmqd }, PREFIX_DATA },
6080 { "vpmovsxbq", { XM, EXxmmdw }, PREFIX_DATA },
6081 { "vpmovsxwd", { XM, EXxmmq }, PREFIX_DATA },
6082 { "vpmovsxwq", { XM, EXxmmqd }, PREFIX_DATA },
6083 { "vpmovsxdq", { XM, EXxmmq }, PREFIX_DATA },
592d1631
L
6084 { Bad_Opcode },
6085 { Bad_Opcode },
c0f3af97 6086 /* 28 */
7531c613
JB
6087 { "vpmuldq", { XM, Vex, EXx }, PREFIX_DATA },
6088 { "vpcmpeqq", { XM, Vex, EXx }, PREFIX_DATA },
6089 { MOD_TABLE (MOD_VEX_0F382A) },
6090 { "vpackusdw", { XM, Vex, EXx }, PREFIX_DATA },
6091 { MOD_TABLE (MOD_VEX_0F382C) },
6092 { MOD_TABLE (MOD_VEX_0F382D) },
6093 { MOD_TABLE (MOD_VEX_0F382E) },
6094 { MOD_TABLE (MOD_VEX_0F382F) },
c0f3af97 6095 /* 30 */
7531c613
JB
6096 { "vpmovzxbw", { XM, EXxmmq }, PREFIX_DATA },
6097 { "vpmovzxbd", { XM, EXxmmqd }, PREFIX_DATA },
6098 { "vpmovzxbq", { XM, EXxmmdw }, PREFIX_DATA },
6099 { "vpmovzxwd", { XM, EXxmmq }, PREFIX_DATA },
6100 { "vpmovzxwq", { XM, EXxmmqd }, PREFIX_DATA },
6101 { "vpmovzxdq", { XM, EXxmmq }, PREFIX_DATA },
6102 { VEX_LEN_TABLE (VEX_LEN_0F3836) },
6103 { "vpcmpgtq", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6104 /* 38 */
7531c613
JB
6105 { "vpminsb", { XM, Vex, EXx }, PREFIX_DATA },
6106 { "vpminsd", { XM, Vex, EXx }, PREFIX_DATA },
6107 { "vpminuw", { XM, Vex, EXx }, PREFIX_DATA },
6108 { "vpminud", { XM, Vex, EXx }, PREFIX_DATA },
6109 { "vpmaxsb", { XM, Vex, EXx }, PREFIX_DATA },
6110 { "vpmaxsd", { XM, Vex, EXx }, PREFIX_DATA },
6111 { "vpmaxuw", { XM, Vex, EXx }, PREFIX_DATA },
6112 { "vpmaxud", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6113 /* 40 */
7531c613
JB
6114 { "vpmulld", { XM, Vex, EXx }, PREFIX_DATA },
6115 { VEX_LEN_TABLE (VEX_LEN_0F3841) },
592d1631
L
6116 { Bad_Opcode },
6117 { Bad_Opcode },
6118 { Bad_Opcode },
7531c613
JB
6119 { "vpsrlv%DQ", { XM, Vex, EXx }, PREFIX_DATA },
6120 { VEX_W_TABLE (VEX_W_0F3846) },
6121 { "vpsllv%DQ", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6122 /* 48 */
592d1631 6123 { Bad_Opcode },
260cd341 6124 { X86_64_TABLE (X86_64_VEX_0F3849) },
592d1631 6125 { Bad_Opcode },
260cd341 6126 { X86_64_TABLE (X86_64_VEX_0F384B) },
592d1631
L
6127 { Bad_Opcode },
6128 { Bad_Opcode },
6129 { Bad_Opcode },
6130 { Bad_Opcode },
c0f3af97 6131 /* 50 */
592d1631
L
6132 { Bad_Opcode },
6133 { Bad_Opcode },
6134 { Bad_Opcode },
6135 { Bad_Opcode },
6136 { Bad_Opcode },
6137 { Bad_Opcode },
6138 { Bad_Opcode },
6139 { Bad_Opcode },
c0f3af97 6140 /* 58 */
7531c613
JB
6141 { VEX_W_TABLE (VEX_W_0F3858) },
6142 { VEX_W_TABLE (VEX_W_0F3859) },
6143 { MOD_TABLE (MOD_VEX_0F385A) },
592d1631 6144 { Bad_Opcode },
260cd341 6145 { X86_64_TABLE (X86_64_VEX_0F385C) },
592d1631 6146 { Bad_Opcode },
260cd341 6147 { X86_64_TABLE (X86_64_VEX_0F385E) },
592d1631 6148 { Bad_Opcode },
c0f3af97 6149 /* 60 */
592d1631
L
6150 { Bad_Opcode },
6151 { Bad_Opcode },
6152 { Bad_Opcode },
6153 { Bad_Opcode },
6154 { Bad_Opcode },
6155 { Bad_Opcode },
6156 { Bad_Opcode },
6157 { Bad_Opcode },
c0f3af97 6158 /* 68 */
592d1631
L
6159 { Bad_Opcode },
6160 { Bad_Opcode },
6161 { Bad_Opcode },
6162 { Bad_Opcode },
6163 { Bad_Opcode },
6164 { Bad_Opcode },
6165 { Bad_Opcode },
6166 { Bad_Opcode },
c0f3af97 6167 /* 70 */
592d1631
L
6168 { Bad_Opcode },
6169 { Bad_Opcode },
6170 { Bad_Opcode },
6171 { Bad_Opcode },
6172 { Bad_Opcode },
6173 { Bad_Opcode },
6174 { Bad_Opcode },
6175 { Bad_Opcode },
c0f3af97 6176 /* 78 */
7531c613
JB
6177 { VEX_W_TABLE (VEX_W_0F3878) },
6178 { VEX_W_TABLE (VEX_W_0F3879) },
592d1631
L
6179 { Bad_Opcode },
6180 { Bad_Opcode },
6181 { Bad_Opcode },
6182 { Bad_Opcode },
6183 { Bad_Opcode },
6184 { Bad_Opcode },
c0f3af97 6185 /* 80 */
592d1631
L
6186 { Bad_Opcode },
6187 { Bad_Opcode },
6188 { Bad_Opcode },
6189 { Bad_Opcode },
6190 { Bad_Opcode },
6191 { Bad_Opcode },
6192 { Bad_Opcode },
6193 { Bad_Opcode },
c0f3af97 6194 /* 88 */
592d1631
L
6195 { Bad_Opcode },
6196 { Bad_Opcode },
6197 { Bad_Opcode },
6198 { Bad_Opcode },
7531c613 6199 { MOD_TABLE (MOD_VEX_0F388C) },
592d1631 6200 { Bad_Opcode },
7531c613 6201 { MOD_TABLE (MOD_VEX_0F388E) },
592d1631 6202 { Bad_Opcode },
c0f3af97 6203 /* 90 */
7531c613
JB
6204 { "vpgatherd%DQ", { XM, MVexVSIBDWpX, Vex }, PREFIX_DATA },
6205 { "vpgatherq%DQ", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, PREFIX_DATA },
6206 { "vgatherdp%XW", { XM, MVexVSIBDWpX, Vex }, PREFIX_DATA },
6207 { "vgatherqp%XW", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, PREFIX_DATA },
592d1631
L
6208 { Bad_Opcode },
6209 { Bad_Opcode },
7531c613
JB
6210 { "vfmaddsub132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6211 { "vfmsubadd132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6212 /* 98 */
7531c613
JB
6213 { "vfmadd132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6214 { "vfmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6215 { "vfmsub132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6216 { "vfmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6217 { "vfnmadd132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6218 { "vfnmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6219 { "vfnmsub132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6220 { "vfnmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
c0f3af97 6221 /* a0 */
592d1631
L
6222 { Bad_Opcode },
6223 { Bad_Opcode },
6224 { Bad_Opcode },
6225 { Bad_Opcode },
6226 { Bad_Opcode },
6227 { Bad_Opcode },
7531c613
JB
6228 { "vfmaddsub213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6229 { "vfmsubadd213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6230 /* a8 */
7531c613
JB
6231 { "vfmadd213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6232 { "vfmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6233 { "vfmsub213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6234 { "vfmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6235 { "vfnmadd213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6236 { "vfnmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6237 { "vfnmsub213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6238 { "vfnmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
c0f3af97 6239 /* b0 */
592d1631
L
6240 { Bad_Opcode },
6241 { Bad_Opcode },
6242 { Bad_Opcode },
6243 { Bad_Opcode },
6244 { Bad_Opcode },
6245 { Bad_Opcode },
7531c613
JB
6246 { "vfmaddsub231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6247 { "vfmsubadd231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6248 /* b8 */
7531c613
JB
6249 { "vfmadd231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6250 { "vfmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6251 { "vfmsub231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6252 { "vfmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6253 { "vfnmadd231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6254 { "vfnmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
6255 { "vfnmsub231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6256 { "vfnmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, PREFIX_DATA },
c0f3af97 6257 /* c0 */
592d1631
L
6258 { Bad_Opcode },
6259 { Bad_Opcode },
6260 { Bad_Opcode },
6261 { Bad_Opcode },
6262 { Bad_Opcode },
6263 { Bad_Opcode },
6264 { Bad_Opcode },
6265 { Bad_Opcode },
c0f3af97 6266 /* c8 */
592d1631
L
6267 { Bad_Opcode },
6268 { Bad_Opcode },
6269 { Bad_Opcode },
6270 { Bad_Opcode },
6271 { Bad_Opcode },
6272 { Bad_Opcode },
6273 { Bad_Opcode },
7531c613 6274 { VEX_W_TABLE (VEX_W_0F38CF) },
c0f3af97 6275 /* d0 */
592d1631
L
6276 { Bad_Opcode },
6277 { Bad_Opcode },
6278 { Bad_Opcode },
6279 { Bad_Opcode },
6280 { Bad_Opcode },
6281 { Bad_Opcode },
6282 { Bad_Opcode },
6283 { Bad_Opcode },
c0f3af97 6284 /* d8 */
592d1631
L
6285 { Bad_Opcode },
6286 { Bad_Opcode },
6287 { Bad_Opcode },
7531c613
JB
6288 { VEX_LEN_TABLE (VEX_LEN_0F38DB) },
6289 { "vaesenc", { XM, Vex, EXx }, PREFIX_DATA },
6290 { "vaesenclast", { XM, Vex, EXx }, PREFIX_DATA },
6291 { "vaesdec", { XM, Vex, EXx }, PREFIX_DATA },
6292 { "vaesdeclast", { XM, Vex, EXx }, PREFIX_DATA },
c0f3af97 6293 /* e0 */
592d1631
L
6294 { Bad_Opcode },
6295 { Bad_Opcode },
6296 { Bad_Opcode },
6297 { Bad_Opcode },
6298 { Bad_Opcode },
6299 { Bad_Opcode },
6300 { Bad_Opcode },
6301 { Bad_Opcode },
c0f3af97 6302 /* e8 */
592d1631
L
6303 { Bad_Opcode },
6304 { Bad_Opcode },
6305 { Bad_Opcode },
6306 { Bad_Opcode },
6307 { Bad_Opcode },
6308 { Bad_Opcode },
6309 { Bad_Opcode },
6310 { Bad_Opcode },
c0f3af97 6311 /* f0 */
592d1631
L
6312 { Bad_Opcode },
6313 { Bad_Opcode },
f12dc422
L
6314 { PREFIX_TABLE (PREFIX_VEX_0F38F2) },
6315 { REG_TABLE (REG_VEX_0F38F3) },
592d1631 6316 { Bad_Opcode },
6c30d220
L
6317 { PREFIX_TABLE (PREFIX_VEX_0F38F5) },
6318 { PREFIX_TABLE (PREFIX_VEX_0F38F6) },
f12dc422 6319 { PREFIX_TABLE (PREFIX_VEX_0F38F7) },
c0f3af97 6320 /* f8 */
592d1631
L
6321 { Bad_Opcode },
6322 { Bad_Opcode },
6323 { Bad_Opcode },
6324 { Bad_Opcode },
6325 { Bad_Opcode },
6326 { Bad_Opcode },
6327 { Bad_Opcode },
6328 { Bad_Opcode },
c0f3af97
L
6329 },
6330 /* VEX_0F3A */
6331 {
6332 /* 00 */
7531c613
JB
6333 { VEX_LEN_TABLE (VEX_LEN_0F3A00) },
6334 { VEX_LEN_TABLE (VEX_LEN_0F3A01) },
6335 { VEX_W_TABLE (VEX_W_0F3A02) },
592d1631 6336 { Bad_Opcode },
7531c613
JB
6337 { VEX_W_TABLE (VEX_W_0F3A04) },
6338 { VEX_W_TABLE (VEX_W_0F3A05) },
6339 { VEX_LEN_TABLE (VEX_LEN_0F3A06) },
592d1631 6340 { Bad_Opcode },
c0f3af97 6341 /* 08 */
7531c613
JB
6342 { "vroundps", { XM, EXx, Ib }, PREFIX_DATA },
6343 { "vroundpd", { XM, EXx, Ib }, PREFIX_DATA },
6344 { "vroundss", { XMScalar, VexScalar, EXxmm_md, Ib }, PREFIX_DATA },
6345 { "vroundsd", { XMScalar, VexScalar, EXxmm_mq, Ib }, PREFIX_DATA },
6346 { "vblendps", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6347 { "vblendpd", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6348 { "vpblendw", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6349 { "vpalignr", { XM, Vex, EXx, Ib }, PREFIX_DATA },
c0f3af97 6350 /* 10 */
592d1631
L
6351 { Bad_Opcode },
6352 { Bad_Opcode },
6353 { Bad_Opcode },
6354 { Bad_Opcode },
7531c613
JB
6355 { VEX_LEN_TABLE (VEX_LEN_0F3A14) },
6356 { VEX_LEN_TABLE (VEX_LEN_0F3A15) },
6357 { VEX_LEN_TABLE (VEX_LEN_0F3A16) },
6358 { VEX_LEN_TABLE (VEX_LEN_0F3A17) },
c0f3af97 6359 /* 18 */
7531c613
JB
6360 { VEX_LEN_TABLE (VEX_LEN_0F3A18) },
6361 { VEX_LEN_TABLE (VEX_LEN_0F3A19) },
592d1631
L
6362 { Bad_Opcode },
6363 { Bad_Opcode },
6364 { Bad_Opcode },
7531c613 6365 { VEX_W_TABLE (VEX_W_0F3A1D) },
592d1631
L
6366 { Bad_Opcode },
6367 { Bad_Opcode },
c0f3af97 6368 /* 20 */
7531c613
JB
6369 { VEX_LEN_TABLE (VEX_LEN_0F3A20) },
6370 { VEX_LEN_TABLE (VEX_LEN_0F3A21) },
6371 { VEX_LEN_TABLE (VEX_LEN_0F3A22) },
592d1631
L
6372 { Bad_Opcode },
6373 { Bad_Opcode },
6374 { Bad_Opcode },
6375 { Bad_Opcode },
6376 { Bad_Opcode },
c0f3af97 6377 /* 28 */
592d1631
L
6378 { Bad_Opcode },
6379 { Bad_Opcode },
6380 { Bad_Opcode },
6381 { Bad_Opcode },
6382 { Bad_Opcode },
6383 { Bad_Opcode },
6384 { Bad_Opcode },
6385 { Bad_Opcode },
c0f3af97 6386 /* 30 */
7531c613
JB
6387 { VEX_LEN_TABLE (VEX_LEN_0F3A30) },
6388 { VEX_LEN_TABLE (VEX_LEN_0F3A31) },
6389 { VEX_LEN_TABLE (VEX_LEN_0F3A32) },
6390 { VEX_LEN_TABLE (VEX_LEN_0F3A33) },
592d1631
L
6391 { Bad_Opcode },
6392 { Bad_Opcode },
6393 { Bad_Opcode },
6394 { Bad_Opcode },
c0f3af97 6395 /* 38 */
7531c613
JB
6396 { VEX_LEN_TABLE (VEX_LEN_0F3A38) },
6397 { VEX_LEN_TABLE (VEX_LEN_0F3A39) },
592d1631
L
6398 { Bad_Opcode },
6399 { Bad_Opcode },
6400 { Bad_Opcode },
6401 { Bad_Opcode },
6402 { Bad_Opcode },
6403 { Bad_Opcode },
c0f3af97 6404 /* 40 */
7531c613
JB
6405 { "vdpps", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6406 { VEX_LEN_TABLE (VEX_LEN_0F3A41) },
6407 { "vmpsadbw", { XM, Vex, EXx, Ib }, PREFIX_DATA },
592d1631 6408 { Bad_Opcode },
7531c613 6409 { "vpclmulqdq", { XM, Vex, EXx, PCLMUL }, PREFIX_DATA },
592d1631 6410 { Bad_Opcode },
7531c613 6411 { VEX_LEN_TABLE (VEX_LEN_0F3A46) },
592d1631 6412 { Bad_Opcode },
c0f3af97 6413 /* 48 */
7531c613
JB
6414 { "vpermil2ps", { XM, Vex, EXx, XMVexI4, VexI4 }, PREFIX_DATA },
6415 { "vpermil2pd", { XM, Vex, EXx, XMVexI4, VexI4 }, PREFIX_DATA },
6416 { VEX_W_TABLE (VEX_W_0F3A4A) },
6417 { VEX_W_TABLE (VEX_W_0F3A4B) },
6418 { VEX_W_TABLE (VEX_W_0F3A4C) },
592d1631
L
6419 { Bad_Opcode },
6420 { Bad_Opcode },
6421 { Bad_Opcode },
c0f3af97 6422 /* 50 */
592d1631
L
6423 { Bad_Opcode },
6424 { Bad_Opcode },
6425 { Bad_Opcode },
6426 { Bad_Opcode },
6427 { Bad_Opcode },
6428 { Bad_Opcode },
6429 { Bad_Opcode },
6430 { Bad_Opcode },
c0f3af97 6431 /* 58 */
592d1631
L
6432 { Bad_Opcode },
6433 { Bad_Opcode },
6434 { Bad_Opcode },
6435 { Bad_Opcode },
7531c613
JB
6436 { "vfmaddsubps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6437 { "vfmaddsubpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6438 { "vfmsubaddps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6439 { "vfmsubaddpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
c0f3af97 6440 /* 60 */
7531c613
JB
6441 { VEX_LEN_TABLE (VEX_LEN_0F3A60) },
6442 { VEX_LEN_TABLE (VEX_LEN_0F3A61) },
6443 { VEX_LEN_TABLE (VEX_LEN_0F3A62) },
6444 { VEX_LEN_TABLE (VEX_LEN_0F3A63) },
592d1631
L
6445 { Bad_Opcode },
6446 { Bad_Opcode },
6447 { Bad_Opcode },
6448 { Bad_Opcode },
c0f3af97 6449 /* 68 */
7531c613
JB
6450 { "vfmaddps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6451 { "vfmaddpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6452 { "vfmaddss", { XMScalar, VexScalar, EXxmm_md, XMVexScalarI4 }, PREFIX_DATA },
6453 { "vfmaddsd", { XMScalar, VexScalar, EXxmm_mq, XMVexScalarI4 }, PREFIX_DATA },
6454 { "vfmsubps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6455 { "vfmsubpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6456 { "vfmsubss", { XMScalar, VexScalar, EXxmm_md, XMVexScalarI4 }, PREFIX_DATA },
6457 { "vfmsubsd", { XMScalar, VexScalar, EXxmm_mq, XMVexScalarI4 }, PREFIX_DATA },
c0f3af97 6458 /* 70 */
592d1631
L
6459 { Bad_Opcode },
6460 { Bad_Opcode },
6461 { Bad_Opcode },
6462 { Bad_Opcode },
6463 { Bad_Opcode },
6464 { Bad_Opcode },
6465 { Bad_Opcode },
6466 { Bad_Opcode },
c0f3af97 6467 /* 78 */
7531c613
JB
6468 { "vfnmaddps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6469 { "vfnmaddpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6470 { "vfnmaddss", { XMScalar, VexScalar, EXxmm_md, XMVexScalarI4 }, PREFIX_DATA },
6471 { "vfnmaddsd", { XMScalar, VexScalar, EXxmm_mq, XMVexScalarI4 }, PREFIX_DATA },
6472 { "vfnmsubps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6473 { "vfnmsubpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6474 { "vfnmsubss", { XMScalar, VexScalar, EXxmm_md, XMVexScalarI4 }, PREFIX_DATA },
6475 { "vfnmsubsd", { XMScalar, VexScalar, EXxmm_mq, XMVexScalarI4 }, PREFIX_DATA },
c0f3af97 6476 /* 80 */
592d1631
L
6477 { Bad_Opcode },
6478 { Bad_Opcode },
6479 { Bad_Opcode },
6480 { Bad_Opcode },
6481 { Bad_Opcode },
6482 { Bad_Opcode },
6483 { Bad_Opcode },
6484 { Bad_Opcode },
c0f3af97 6485 /* 88 */
592d1631
L
6486 { Bad_Opcode },
6487 { Bad_Opcode },
6488 { Bad_Opcode },
6489 { Bad_Opcode },
6490 { Bad_Opcode },
6491 { Bad_Opcode },
6492 { Bad_Opcode },
6493 { Bad_Opcode },
c0f3af97 6494 /* 90 */
592d1631
L
6495 { Bad_Opcode },
6496 { Bad_Opcode },
6497 { Bad_Opcode },
6498 { Bad_Opcode },
6499 { Bad_Opcode },
6500 { Bad_Opcode },
6501 { Bad_Opcode },
6502 { Bad_Opcode },
c0f3af97 6503 /* 98 */
592d1631
L
6504 { Bad_Opcode },
6505 { Bad_Opcode },
6506 { Bad_Opcode },
6507 { Bad_Opcode },
6508 { Bad_Opcode },
6509 { Bad_Opcode },
6510 { Bad_Opcode },
6511 { Bad_Opcode },
c0f3af97 6512 /* a0 */
592d1631
L
6513 { Bad_Opcode },
6514 { Bad_Opcode },
6515 { Bad_Opcode },
6516 { Bad_Opcode },
6517 { Bad_Opcode },
6518 { Bad_Opcode },
6519 { Bad_Opcode },
6520 { Bad_Opcode },
c0f3af97 6521 /* a8 */
592d1631
L
6522 { Bad_Opcode },
6523 { Bad_Opcode },
6524 { Bad_Opcode },
6525 { Bad_Opcode },
6526 { Bad_Opcode },
6527 { Bad_Opcode },
6528 { Bad_Opcode },
6529 { Bad_Opcode },
c0f3af97 6530 /* b0 */
592d1631
L
6531 { Bad_Opcode },
6532 { Bad_Opcode },
6533 { Bad_Opcode },
6534 { Bad_Opcode },
6535 { Bad_Opcode },
6536 { Bad_Opcode },
6537 { Bad_Opcode },
6538 { Bad_Opcode },
c0f3af97 6539 /* b8 */
592d1631
L
6540 { Bad_Opcode },
6541 { Bad_Opcode },
6542 { Bad_Opcode },
6543 { Bad_Opcode },
6544 { Bad_Opcode },
6545 { Bad_Opcode },
6546 { Bad_Opcode },
6547 { Bad_Opcode },
c0f3af97 6548 /* c0 */
592d1631
L
6549 { Bad_Opcode },
6550 { Bad_Opcode },
6551 { Bad_Opcode },
6552 { Bad_Opcode },
6553 { Bad_Opcode },
6554 { Bad_Opcode },
6555 { Bad_Opcode },
6556 { Bad_Opcode },
c0f3af97 6557 /* c8 */
592d1631
L
6558 { Bad_Opcode },
6559 { Bad_Opcode },
6560 { Bad_Opcode },
6561 { Bad_Opcode },
6562 { Bad_Opcode },
6563 { Bad_Opcode },
7531c613
JB
6564 { VEX_W_TABLE (VEX_W_0F3ACE) },
6565 { VEX_W_TABLE (VEX_W_0F3ACF) },
c0f3af97 6566 /* d0 */
592d1631
L
6567 { Bad_Opcode },
6568 { Bad_Opcode },
6569 { Bad_Opcode },
6570 { Bad_Opcode },
6571 { Bad_Opcode },
6572 { Bad_Opcode },
6573 { Bad_Opcode },
6574 { Bad_Opcode },
c0f3af97 6575 /* d8 */
592d1631
L
6576 { Bad_Opcode },
6577 { Bad_Opcode },
6578 { Bad_Opcode },
6579 { Bad_Opcode },
6580 { Bad_Opcode },
6581 { Bad_Opcode },
6582 { Bad_Opcode },
7531c613 6583 { VEX_LEN_TABLE (VEX_LEN_0F3ADF) },
c0f3af97 6584 /* e0 */
592d1631
L
6585 { Bad_Opcode },
6586 { Bad_Opcode },
6587 { Bad_Opcode },
6588 { Bad_Opcode },
6589 { Bad_Opcode },
6590 { Bad_Opcode },
6591 { Bad_Opcode },
6592 { Bad_Opcode },
c0f3af97 6593 /* e8 */
592d1631
L
6594 { Bad_Opcode },
6595 { Bad_Opcode },
6596 { Bad_Opcode },
6597 { Bad_Opcode },
6598 { Bad_Opcode },
6599 { Bad_Opcode },
6600 { Bad_Opcode },
6601 { Bad_Opcode },
c0f3af97 6602 /* f0 */
6c30d220 6603 { PREFIX_TABLE (PREFIX_VEX_0F3AF0) },
592d1631
L
6604 { Bad_Opcode },
6605 { Bad_Opcode },
6606 { Bad_Opcode },
6607 { Bad_Opcode },
6608 { Bad_Opcode },
6609 { Bad_Opcode },
6610 { Bad_Opcode },
c0f3af97 6611 /* f8 */
592d1631
L
6612 { Bad_Opcode },
6613 { Bad_Opcode },
6614 { Bad_Opcode },
6615 { Bad_Opcode },
6616 { Bad_Opcode },
6617 { Bad_Opcode },
6618 { Bad_Opcode },
6619 { Bad_Opcode },
c0f3af97
L
6620 },
6621};
6622
43234a1e 6623#include "i386-dis-evex.h"
ad692897 6624
c0f3af97 6625static const struct dis386 vex_len_table[][2] = {
18897deb 6626 /* VEX_LEN_0F12_P_0_M_0 / VEX_LEN_0F12_P_2_M_0 */
c0f3af97 6627 {
89e65d17 6628 { "vmovlpX", { XM, Vex, EXq }, 0 },
c0f3af97
L
6629 },
6630
592a252b 6631 /* VEX_LEN_0F12_P_0_M_1 */
c0f3af97 6632 {
89e65d17 6633 { "vmovhlps", { XM, Vex, EXq }, 0 },
c0f3af97
L
6634 },
6635
592a252b 6636 /* VEX_LEN_0F13_M_0 */
c0f3af97 6637 {
bf926894 6638 { "vmovlpX", { EXq, XM }, PREFIX_OPCODE },
c0f3af97
L
6639 },
6640
18897deb 6641 /* VEX_LEN_0F16_P_0_M_0 / VEX_LEN_0F16_P_2_M_0 */
c0f3af97 6642 {
89e65d17 6643 { "vmovhpX", { XM, Vex, EXq }, 0 },
c0f3af97
L
6644 },
6645
592a252b 6646 /* VEX_LEN_0F16_P_0_M_1 */
c0f3af97 6647 {
89e65d17 6648 { "vmovlhps", { XM, Vex, EXq }, 0 },
c0f3af97
L
6649 },
6650
592a252b 6651 /* VEX_LEN_0F17_M_0 */
c0f3af97 6652 {
bf926894 6653 { "vmovhpX", { EXq, XM }, PREFIX_OPCODE },
c0f3af97
L
6654 },
6655
43234a1e
L
6656 /* VEX_LEN_0F41_P_0 */
6657 {
6658 { Bad_Opcode },
6659 { VEX_W_TABLE (VEX_W_0F41_P_0_LEN_1) },
6660 },
1ba585e8
IT
6661 /* VEX_LEN_0F41_P_2 */
6662 {
6663 { Bad_Opcode },
6664 { VEX_W_TABLE (VEX_W_0F41_P_2_LEN_1) },
6665 },
43234a1e
L
6666 /* VEX_LEN_0F42_P_0 */
6667 {
6668 { Bad_Opcode },
6669 { VEX_W_TABLE (VEX_W_0F42_P_0_LEN_1) },
6670 },
1ba585e8
IT
6671 /* VEX_LEN_0F42_P_2 */
6672 {
6673 { Bad_Opcode },
6674 { VEX_W_TABLE (VEX_W_0F42_P_2_LEN_1) },
6675 },
43234a1e
L
6676 /* VEX_LEN_0F44_P_0 */
6677 {
6678 { VEX_W_TABLE (VEX_W_0F44_P_0_LEN_0) },
6679 },
1ba585e8
IT
6680 /* VEX_LEN_0F44_P_2 */
6681 {
6682 { VEX_W_TABLE (VEX_W_0F44_P_2_LEN_0) },
6683 },
43234a1e
L
6684 /* VEX_LEN_0F45_P_0 */
6685 {
6686 { Bad_Opcode },
6687 { VEX_W_TABLE (VEX_W_0F45_P_0_LEN_1) },
6688 },
1ba585e8
IT
6689 /* VEX_LEN_0F45_P_2 */
6690 {
6691 { Bad_Opcode },
6692 { VEX_W_TABLE (VEX_W_0F45_P_2_LEN_1) },
6693 },
43234a1e
L
6694 /* VEX_LEN_0F46_P_0 */
6695 {
6696 { Bad_Opcode },
6697 { VEX_W_TABLE (VEX_W_0F46_P_0_LEN_1) },
6698 },
1ba585e8
IT
6699 /* VEX_LEN_0F46_P_2 */
6700 {
6701 { Bad_Opcode },
6702 { VEX_W_TABLE (VEX_W_0F46_P_2_LEN_1) },
6703 },
43234a1e
L
6704 /* VEX_LEN_0F47_P_0 */
6705 {
6706 { Bad_Opcode },
6707 { VEX_W_TABLE (VEX_W_0F47_P_0_LEN_1) },
6708 },
1ba585e8
IT
6709 /* VEX_LEN_0F47_P_2 */
6710 {
6711 { Bad_Opcode },
6712 { VEX_W_TABLE (VEX_W_0F47_P_2_LEN_1) },
6713 },
6714 /* VEX_LEN_0F4A_P_0 */
6715 {
6716 { Bad_Opcode },
6717 { VEX_W_TABLE (VEX_W_0F4A_P_0_LEN_1) },
6718 },
6719 /* VEX_LEN_0F4A_P_2 */
6720 {
6721 { Bad_Opcode },
6722 { VEX_W_TABLE (VEX_W_0F4A_P_2_LEN_1) },
6723 },
6724 /* VEX_LEN_0F4B_P_0 */
6725 {
6726 { Bad_Opcode },
6727 { VEX_W_TABLE (VEX_W_0F4B_P_0_LEN_1) },
6728 },
43234a1e
L
6729 /* VEX_LEN_0F4B_P_2 */
6730 {
6731 { Bad_Opcode },
6732 { VEX_W_TABLE (VEX_W_0F4B_P_2_LEN_1) },
6733 },
6734
7531c613 6735 /* VEX_LEN_0F6E */
c0f3af97 6736 {
7531c613 6737 { "vmovK", { XMScalar, Edq }, PREFIX_DATA },
c0f3af97
L
6738 },
6739
ec6f095a 6740 /* VEX_LEN_0F77_P_1 */
c0f3af97 6741 {
ec6f095a
L
6742 { "vzeroupper", { XX }, 0 },
6743 { "vzeroall", { XX }, 0 },
c0f3af97
L
6744 },
6745
ec6f095a 6746 /* VEX_LEN_0F7E_P_1 */
c0f3af97 6747 {
5b872f7d 6748 { "vmovq", { XMScalar, EXxmm_mq }, 0 },
c0f3af97
L
6749 },
6750
ec6f095a 6751 /* VEX_LEN_0F7E_P_2 */
c0f3af97 6752 {
ec6f095a 6753 { "vmovK", { Edq, XMScalar }, 0 },
c0f3af97
L
6754 },
6755
ec6f095a 6756 /* VEX_LEN_0F90_P_0 */
c0f3af97 6757 {
ec6f095a 6758 { VEX_W_TABLE (VEX_W_0F90_P_0_LEN_0) },
c0f3af97
L
6759 },
6760
ec6f095a 6761 /* VEX_LEN_0F90_P_2 */
c0f3af97 6762 {
ec6f095a 6763 { VEX_W_TABLE (VEX_W_0F90_P_2_LEN_0) },
c0f3af97
L
6764 },
6765
ec6f095a 6766 /* VEX_LEN_0F91_P_0 */
c0f3af97 6767 {
ec6f095a 6768 { VEX_W_TABLE (VEX_W_0F91_P_0_LEN_0) },
c0f3af97
L
6769 },
6770
ec6f095a 6771 /* VEX_LEN_0F91_P_2 */
c0f3af97 6772 {
ec6f095a 6773 { VEX_W_TABLE (VEX_W_0F91_P_2_LEN_0) },
c0f3af97
L
6774 },
6775
ec6f095a 6776 /* VEX_LEN_0F92_P_0 */
c0f3af97 6777 {
ec6f095a 6778 { VEX_W_TABLE (VEX_W_0F92_P_0_LEN_0) },
c0f3af97
L
6779 },
6780
ec6f095a 6781 /* VEX_LEN_0F92_P_2 */
c0f3af97 6782 {
ec6f095a 6783 { VEX_W_TABLE (VEX_W_0F92_P_2_LEN_0) },
c0f3af97
L
6784 },
6785
ec6f095a 6786 /* VEX_LEN_0F92_P_3 */
c0f3af97 6787 {
58a211d2 6788 { MOD_TABLE (MOD_VEX_0F92_P_3_LEN_0) },
c0f3af97
L
6789 },
6790
ec6f095a 6791 /* VEX_LEN_0F93_P_0 */
c0f3af97 6792 {
ec6f095a 6793 { VEX_W_TABLE (VEX_W_0F93_P_0_LEN_0) },
c0f3af97
L
6794 },
6795
ec6f095a 6796 /* VEX_LEN_0F93_P_2 */
c0f3af97 6797 {
ec6f095a 6798 { VEX_W_TABLE (VEX_W_0F93_P_2_LEN_0) },
c0f3af97
L
6799 },
6800
ec6f095a 6801 /* VEX_LEN_0F93_P_3 */
c0f3af97 6802 {
58a211d2 6803 { MOD_TABLE (MOD_VEX_0F93_P_3_LEN_0) },
c0f3af97
L
6804 },
6805
ec6f095a 6806 /* VEX_LEN_0F98_P_0 */
43234a1e
L
6807 {
6808 { VEX_W_TABLE (VEX_W_0F98_P_0_LEN_0) },
6809 },
6810
1ba585e8
IT
6811 /* VEX_LEN_0F98_P_2 */
6812 {
6813 { VEX_W_TABLE (VEX_W_0F98_P_2_LEN_0) },
6814 },
6815
6816 /* VEX_LEN_0F99_P_0 */
6817 {
6818 { VEX_W_TABLE (VEX_W_0F99_P_0_LEN_0) },
6819 },
6820
6821 /* VEX_LEN_0F99_P_2 */
6822 {
6823 { VEX_W_TABLE (VEX_W_0F99_P_2_LEN_0) },
6824 },
6825
6c30d220 6826 /* VEX_LEN_0FAE_R_2_M_0 */
c0f3af97 6827 {
ec6f095a 6828 { "vldmxcsr", { Md }, 0 },
c0f3af97
L
6829 },
6830
6c30d220 6831 /* VEX_LEN_0FAE_R_3_M_0 */
c0f3af97 6832 {
ec6f095a 6833 { "vstmxcsr", { Md }, 0 },
c0f3af97
L
6834 },
6835
7531c613 6836 /* VEX_LEN_0FC4 */
c0f3af97 6837 {
7531c613 6838 { "vpinsrw", { XM, Vex, Edqw, Ib }, PREFIX_DATA },
c0f3af97
L
6839 },
6840
7531c613 6841 /* VEX_LEN_0FC5 */
c0f3af97 6842 {
7531c613 6843 { "vpextrw", { Gdq, XS, Ib }, PREFIX_DATA },
c0f3af97
L
6844 },
6845
7531c613 6846 /* VEX_LEN_0FD6 */
c0f3af97 6847 {
7531c613 6848 { "vmovq", { EXqS, XMScalar }, PREFIX_DATA },
c0f3af97
L
6849 },
6850
7531c613 6851 /* VEX_LEN_0FF7 */
c0f3af97 6852 {
7531c613 6853 { "vmaskmovdqu", { XM, XS }, PREFIX_DATA },
c0f3af97
L
6854 },
6855
7531c613 6856 /* VEX_LEN_0F3816 */
c0f3af97 6857 {
6c30d220 6858 { Bad_Opcode },
7531c613 6859 { VEX_W_TABLE (VEX_W_0F3816_L_1) },
c0f3af97
L
6860 },
6861
7531c613 6862 /* VEX_LEN_0F3819 */
c0f3af97 6863 {
6c30d220 6864 { Bad_Opcode },
7531c613 6865 { VEX_W_TABLE (VEX_W_0F3819_L_1) },
c0f3af97
L
6866 },
6867
7531c613 6868 /* VEX_LEN_0F381A_M_0 */
c0f3af97 6869 {
6c30d220 6870 { Bad_Opcode },
7531c613 6871 { VEX_W_TABLE (VEX_W_0F381A_M_0_L_1) },
c0f3af97
L
6872 },
6873
7531c613 6874 /* VEX_LEN_0F3836 */
c0f3af97 6875 {
6c30d220 6876 { Bad_Opcode },
7531c613 6877 { VEX_W_TABLE (VEX_W_0F3836) },
c0f3af97
L
6878 },
6879
7531c613 6880 /* VEX_LEN_0F3841 */
c0f3af97 6881 {
7531c613 6882 { "vphminposuw", { XM, EXx }, PREFIX_DATA },
c0f3af97
L
6883 },
6884
260cd341
LC
6885 /* VEX_LEN_0F3849_X86_64_P_0_W_0_M_0 */
6886 {
6887 { "ldtilecfg", { M }, 0 },
6888 },
6889
6890 /* VEX_LEN_0F3849_X86_64_P_0_W_0_M_1_REG_0_RM_0 */
6891 {
6892 { "tilerelease", { Skip_MODRM }, 0 },
6893 },
6894
6895 /* VEX_LEN_0F3849_X86_64_P_2_W_0_M_0 */
6896 {
6897 { "sttilecfg", { M }, 0 },
6898 },
6899
6900 /* VEX_LEN_0F3849_X86_64_P_3_W_0_M_0 */
6901 {
6902 { "tilezero", { TMM, Skip_MODRM }, 0 },
6903 },
6904
6905 /* VEX_LEN_0F384B_X86_64_P_1_W_0_M_0 */
6906 {
6907 { "tilestored", { MVexSIBMEM, TMM }, 0 },
6908 },
6909 /* VEX_LEN_0F384B_X86_64_P_2_W_0_M_0 */
6910 {
6911 { "tileloaddt1", { TMM, MVexSIBMEM }, 0 },
6912 },
6913
6914 /* VEX_LEN_0F384B_X86_64_P_3_W_0_M_0 */
6915 {
6916 { "tileloadd", { TMM, MVexSIBMEM }, 0 },
6917 },
6918
7531c613 6919 /* VEX_LEN_0F385A_M_0 */
6c30d220
L
6920 {
6921 { Bad_Opcode },
7531c613 6922 { VEX_W_TABLE (VEX_W_0F385A_M_0_L_0) },
6c30d220
L
6923 },
6924
260cd341
LC
6925 /* VEX_LEN_0F385C_X86_64_P_1_W_0_M_0 */
6926 {
6927 { "tdpbf16ps", { TMM, EXtmm, VexTmm }, 0 },
6928 },
6929
6930 /* VEX_LEN_0F385E_X86_64_P_0_W_0_M_0 */
6931 {
6932 { "tdpbuud", {TMM, EXtmm, VexTmm }, 0 },
6933 },
6934
6935 /* VEX_LEN_0F385E_X86_64_P_1_W_0_M_0 */
6936 {
6937 { "tdpbsud", {TMM, EXtmm, VexTmm }, 0 },
6938 },
6939
6940 /* VEX_LEN_0F385E_X86_64_P_2_W_0_M_0 */
6941 {
6942 { "tdpbusd", {TMM, EXtmm, VexTmm }, 0 },
6943 },
6944
6945 /* VEX_LEN_0F385E_X86_64_P_3_W_0_M_0 */
6946 {
6947 { "tdpbssd", {TMM, EXtmm, VexTmm }, 0 },
6948 },
6949
7531c613 6950 /* VEX_LEN_0F38DB */
a5ff0eb2 6951 {
7531c613 6952 { "vaesimc", { XM, EXx }, PREFIX_DATA },
a5ff0eb2
L
6953 },
6954
f12dc422
L
6955 /* VEX_LEN_0F38F2_P_0 */
6956 {
bf890a93 6957 { "andnS", { Gdq, VexGdq, Edq }, 0 },
f12dc422
L
6958 },
6959
6960 /* VEX_LEN_0F38F3_R_1_P_0 */
6961 {
bf890a93 6962 { "blsrS", { VexGdq, Edq }, 0 },
f12dc422
L
6963 },
6964
6965 /* VEX_LEN_0F38F3_R_2_P_0 */
6966 {
bf890a93 6967 { "blsmskS", { VexGdq, Edq }, 0 },
f12dc422
L
6968 },
6969
6970 /* VEX_LEN_0F38F3_R_3_P_0 */
6971 {
bf890a93 6972 { "blsiS", { VexGdq, Edq }, 0 },
f12dc422
L
6973 },
6974
6c30d220
L
6975 /* VEX_LEN_0F38F5_P_0 */
6976 {
bf890a93 6977 { "bzhiS", { Gdq, Edq, VexGdq }, 0 },
6c30d220
L
6978 },
6979
6980 /* VEX_LEN_0F38F5_P_1 */
6981 {
bf890a93 6982 { "pextS", { Gdq, VexGdq, Edq }, 0 },
6c30d220
L
6983 },
6984
6985 /* VEX_LEN_0F38F5_P_3 */
6986 {
bf890a93 6987 { "pdepS", { Gdq, VexGdq, Edq }, 0 },
6c30d220
L
6988 },
6989
6990 /* VEX_LEN_0F38F6_P_3 */
6991 {
bf890a93 6992 { "mulxS", { Gdq, VexGdq, Edq }, 0 },
6c30d220
L
6993 },
6994
f12dc422
L
6995 /* VEX_LEN_0F38F7_P_0 */
6996 {
bf890a93 6997 { "bextrS", { Gdq, Edq, VexGdq }, 0 },
f12dc422
L
6998 },
6999
6c30d220
L
7000 /* VEX_LEN_0F38F7_P_1 */
7001 {
bf890a93 7002 { "sarxS", { Gdq, Edq, VexGdq }, 0 },
6c30d220
L
7003 },
7004
7005 /* VEX_LEN_0F38F7_P_2 */
7006 {
bf890a93 7007 { "shlxS", { Gdq, Edq, VexGdq }, 0 },
6c30d220
L
7008 },
7009
7010 /* VEX_LEN_0F38F7_P_3 */
7011 {
bf890a93 7012 { "shrxS", { Gdq, Edq, VexGdq }, 0 },
6c30d220
L
7013 },
7014
7531c613 7015 /* VEX_LEN_0F3A00 */
6c30d220
L
7016 {
7017 { Bad_Opcode },
7531c613 7018 { VEX_W_TABLE (VEX_W_0F3A00_L_1) },
6c30d220
L
7019 },
7020
7531c613 7021 /* VEX_LEN_0F3A01 */
6c30d220
L
7022 {
7023 { Bad_Opcode },
7531c613 7024 { VEX_W_TABLE (VEX_W_0F3A01_L_1) },
6c30d220
L
7025 },
7026
7531c613 7027 /* VEX_LEN_0F3A06 */
c0f3af97 7028 {
592d1631 7029 { Bad_Opcode },
7531c613 7030 { VEX_W_TABLE (VEX_W_0F3A06_L_1) },
c0f3af97
L
7031 },
7032
7531c613 7033 /* VEX_LEN_0F3A14 */
c0f3af97 7034 {
7531c613 7035 { "vpextrb", { Edqb, XM, Ib }, PREFIX_DATA },
c0f3af97
L
7036 },
7037
7531c613 7038 /* VEX_LEN_0F3A15 */
c0f3af97 7039 {
7531c613 7040 { "vpextrw", { Edqw, XM, Ib }, PREFIX_DATA },
c0f3af97
L
7041 },
7042
7531c613 7043 /* VEX_LEN_0F3A16 */
c0f3af97 7044 {
7531c613 7045 { "vpextrK", { Edq, XM, Ib }, PREFIX_DATA },
c0f3af97
L
7046 },
7047
7531c613 7048 /* VEX_LEN_0F3A17 */
c0f3af97 7049 {
7531c613 7050 { "vextractps", { Edqd, XM, Ib }, PREFIX_DATA },
c0f3af97
L
7051 },
7052
7531c613 7053 /* VEX_LEN_0F3A18 */
c0f3af97 7054 {
592d1631 7055 { Bad_Opcode },
7531c613 7056 { VEX_W_TABLE (VEX_W_0F3A18_L_1) },
c0f3af97
L
7057 },
7058
7531c613 7059 /* VEX_LEN_0F3A19 */
c0f3af97 7060 {
592d1631 7061 { Bad_Opcode },
7531c613 7062 { VEX_W_TABLE (VEX_W_0F3A19_L_1) },
c0f3af97
L
7063 },
7064
7531c613 7065 /* VEX_LEN_0F3A20 */
c0f3af97 7066 {
7531c613 7067 { "vpinsrb", { XM, Vex, Edqb, Ib }, PREFIX_DATA },
c0f3af97
L
7068 },
7069
7531c613 7070 /* VEX_LEN_0F3A21 */
c0f3af97 7071 {
7531c613 7072 { "vinsertps", { XM, Vex, EXd, Ib }, PREFIX_DATA },
c0f3af97
L
7073 },
7074
7531c613 7075 /* VEX_LEN_0F3A22 */
c0f3af97 7076 {
7531c613 7077 { "vpinsrK", { XM, Vex, Edq, Ib }, PREFIX_DATA },
c0f3af97
L
7078 },
7079
7531c613 7080 /* VEX_LEN_0F3A30 */
43234a1e 7081 {
7531c613 7082 { VEX_W_TABLE (VEX_W_0F3A30_L_0) },
43234a1e
L
7083 },
7084
7531c613 7085 /* VEX_LEN_0F3A31 */
1ba585e8 7086 {
7531c613 7087 { VEX_W_TABLE (VEX_W_0F3A31_L_0) },
1ba585e8
IT
7088 },
7089
7531c613 7090 /* VEX_LEN_0F3A32 */
43234a1e 7091 {
7531c613 7092 { VEX_W_TABLE (VEX_W_0F3A32_L_0) },
43234a1e
L
7093 },
7094
7531c613 7095 /* VEX_LEN_0F3A33 */
1ba585e8 7096 {
7531c613 7097 { VEX_W_TABLE (VEX_W_0F3A33_L_0) },
1ba585e8
IT
7098 },
7099
7531c613 7100 /* VEX_LEN_0F3A38 */
c0f3af97 7101 {
6c30d220 7102 { Bad_Opcode },
7531c613 7103 { VEX_W_TABLE (VEX_W_0F3A38_L_1) },
c0f3af97
L
7104 },
7105
7531c613 7106 /* VEX_LEN_0F3A39 */
c0f3af97 7107 {
6c30d220 7108 { Bad_Opcode },
7531c613 7109 { VEX_W_TABLE (VEX_W_0F3A39_L_1) },
6c30d220
L
7110 },
7111
7531c613 7112 /* VEX_LEN_0F3A41 */
6c30d220 7113 {
7531c613 7114 { "vdppd", { XM, Vex, EXx, Ib }, PREFIX_DATA },
c0f3af97
L
7115 },
7116
7531c613 7117 /* VEX_LEN_0F3A46 */
c0f3af97 7118 {
6c30d220 7119 { Bad_Opcode },
7531c613 7120 { VEX_W_TABLE (VEX_W_0F3A46_L_1) },
c0f3af97
L
7121 },
7122
7531c613 7123 /* VEX_LEN_0F3A60 */
c0f3af97 7124 {
7531c613 7125 { "vpcmpestrm!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
c0f3af97
L
7126 },
7127
7531c613 7128 /* VEX_LEN_0F3A61 */
c0f3af97 7129 {
7531c613 7130 { "vpcmpestri!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
c0f3af97
L
7131 },
7132
7531c613 7133 /* VEX_LEN_0F3A62 */
c0f3af97 7134 {
7531c613 7135 { "vpcmpistrm", { XM, EXx, Ib }, PREFIX_DATA },
c0f3af97
L
7136 },
7137
7531c613 7138 /* VEX_LEN_0F3A63 */
c0f3af97 7139 {
7531c613 7140 { "vpcmpistri", { XM, EXx, Ib }, PREFIX_DATA },
c0f3af97
L
7141 },
7142
7531c613 7143 /* VEX_LEN_0F3ADF */
a5ff0eb2 7144 {
7531c613 7145 { "vaeskeygenassist", { XM, EXx, Ib }, PREFIX_DATA },
a5ff0eb2 7146 },
4c807e72 7147
6c30d220
L
7148 /* VEX_LEN_0F3AF0_P_3 */
7149 {
bf890a93 7150 { "rorxS", { Gdq, Edq, Ib }, 0 },
6c30d220
L
7151 },
7152
467bbef0
JB
7153 /* VEX_LEN_0FXOP_08_85 */
7154 {
7155 { VEX_W_TABLE (VEX_W_0FXOP_08_85_L_0) },
7156 },
7157
7158 /* VEX_LEN_0FXOP_08_86 */
7159 {
7160 { VEX_W_TABLE (VEX_W_0FXOP_08_86_L_0) },
7161 },
7162
7163 /* VEX_LEN_0FXOP_08_87 */
7164 {
7165 { VEX_W_TABLE (VEX_W_0FXOP_08_87_L_0) },
7166 },
7167
7168 /* VEX_LEN_0FXOP_08_8E */
7169 {
7170 { VEX_W_TABLE (VEX_W_0FXOP_08_8E_L_0) },
7171 },
7172
7173 /* VEX_LEN_0FXOP_08_8F */
7174 {
7175 { VEX_W_TABLE (VEX_W_0FXOP_08_8F_L_0) },
7176 },
7177
7178 /* VEX_LEN_0FXOP_08_95 */
7179 {
7180 { VEX_W_TABLE (VEX_W_0FXOP_08_95_L_0) },
7181 },
7182
7183 /* VEX_LEN_0FXOP_08_96 */
7184 {
7185 { VEX_W_TABLE (VEX_W_0FXOP_08_96_L_0) },
7186 },
7187
7188 /* VEX_LEN_0FXOP_08_97 */
7189 {
7190 { VEX_W_TABLE (VEX_W_0FXOP_08_97_L_0) },
7191 },
7192
7193 /* VEX_LEN_0FXOP_08_9E */
7194 {
7195 { VEX_W_TABLE (VEX_W_0FXOP_08_9E_L_0) },
7196 },
7197
7198 /* VEX_LEN_0FXOP_08_9F */
7199 {
7200 { VEX_W_TABLE (VEX_W_0FXOP_08_9F_L_0) },
7201 },
7202
7203 /* VEX_LEN_0FXOP_08_A3 */
7204 {
7205 { "vpperm", { XM, Vex, EXx, XMVexI4 }, 0 },
7206 },
7207
7208 /* VEX_LEN_0FXOP_08_A6 */
7209 {
7210 { VEX_W_TABLE (VEX_W_0FXOP_08_A6_L_0) },
7211 },
7212
7213 /* VEX_LEN_0FXOP_08_B6 */
7214 {
7215 { VEX_W_TABLE (VEX_W_0FXOP_08_B6_L_0) },
7216 },
7217
7218 /* VEX_LEN_0FXOP_08_C0 */
7219 {
7220 { VEX_W_TABLE (VEX_W_0FXOP_08_C0_L_0) },
7221 },
7222
7223 /* VEX_LEN_0FXOP_08_C1 */
7224 {
7225 { VEX_W_TABLE (VEX_W_0FXOP_08_C1_L_0) },
7226 },
7227
7228 /* VEX_LEN_0FXOP_08_C2 */
7229 {
7230 { VEX_W_TABLE (VEX_W_0FXOP_08_C2_L_0) },
7231 },
7232
7233 /* VEX_LEN_0FXOP_08_C3 */
7234 {
7235 { VEX_W_TABLE (VEX_W_0FXOP_08_C3_L_0) },
7236 },
7237
ff688e1f
L
7238 /* VEX_LEN_0FXOP_08_CC */
7239 {
467bbef0 7240 { VEX_W_TABLE (VEX_W_0FXOP_08_CC_L_0) },
ff688e1f
L
7241 },
7242
7243 /* VEX_LEN_0FXOP_08_CD */
7244 {
467bbef0 7245 { VEX_W_TABLE (VEX_W_0FXOP_08_CD_L_0) },
ff688e1f
L
7246 },
7247
7248 /* VEX_LEN_0FXOP_08_CE */
7249 {
467bbef0 7250 { VEX_W_TABLE (VEX_W_0FXOP_08_CE_L_0) },
ff688e1f
L
7251 },
7252
7253 /* VEX_LEN_0FXOP_08_CF */
7254 {
467bbef0 7255 { VEX_W_TABLE (VEX_W_0FXOP_08_CF_L_0) },
ff688e1f
L
7256 },
7257
7258 /* VEX_LEN_0FXOP_08_EC */
7259 {
467bbef0 7260 { VEX_W_TABLE (VEX_W_0FXOP_08_EC_L_0) },
ff688e1f
L
7261 },
7262
7263 /* VEX_LEN_0FXOP_08_ED */
7264 {
467bbef0 7265 { VEX_W_TABLE (VEX_W_0FXOP_08_ED_L_0) },
ff688e1f
L
7266 },
7267
7268 /* VEX_LEN_0FXOP_08_EE */
7269 {
467bbef0 7270 { VEX_W_TABLE (VEX_W_0FXOP_08_EE_L_0) },
ff688e1f
L
7271 },
7272
7273 /* VEX_LEN_0FXOP_08_EF */
7274 {
467bbef0
JB
7275 { VEX_W_TABLE (VEX_W_0FXOP_08_EF_L_0) },
7276 },
7277
7278 /* VEX_LEN_0FXOP_09_01 */
7279 {
7280 { REG_TABLE (REG_0FXOP_09_01_L_0) },
7281 },
7282
7283 /* VEX_LEN_0FXOP_09_02 */
7284 {
7285 { REG_TABLE (REG_0FXOP_09_02_L_0) },
7286 },
7287
7288 /* VEX_LEN_0FXOP_09_12_M_1 */
7289 {
7290 { REG_TABLE (REG_0FXOP_09_12_M_1_L_0) },
ff688e1f
L
7291 },
7292
b5b098c2 7293 /* VEX_LEN_0FXOP_09_82_W_0 */
5dd85c99 7294 {
b5b098c2 7295 { "vfrczss", { XM, EXd }, 0 },
5dd85c99 7296 },
4c807e72 7297
b5b098c2 7298 /* VEX_LEN_0FXOP_09_83_W_0 */
5dd85c99 7299 {
b5b098c2 7300 { "vfrczsd", { XM, EXq }, 0 },
5dd85c99 7301 },
467bbef0
JB
7302
7303 /* VEX_LEN_0FXOP_09_90 */
7304 {
7305 { "vprotb", { XM, EXx, VexW }, 0 },
7306 },
7307
7308 /* VEX_LEN_0FXOP_09_91 */
7309 {
7310 { "vprotw", { XM, EXx, VexW }, 0 },
7311 },
7312
7313 /* VEX_LEN_0FXOP_09_92 */
7314 {
7315 { "vprotd", { XM, EXx, VexW }, 0 },
7316 },
7317
7318 /* VEX_LEN_0FXOP_09_93 */
7319 {
7320 { "vprotq", { XM, EXx, VexW }, 0 },
7321 },
7322
7323 /* VEX_LEN_0FXOP_09_94 */
7324 {
7325 { "vpshlb", { XM, EXx, VexW }, 0 },
7326 },
7327
7328 /* VEX_LEN_0FXOP_09_95 */
7329 {
7330 { "vpshlw", { XM, EXx, VexW }, 0 },
7331 },
7332
7333 /* VEX_LEN_0FXOP_09_96 */
7334 {
7335 { "vpshld", { XM, EXx, VexW }, 0 },
7336 },
7337
7338 /* VEX_LEN_0FXOP_09_97 */
7339 {
7340 { "vpshlq", { XM, EXx, VexW }, 0 },
7341 },
7342
7343 /* VEX_LEN_0FXOP_09_98 */
7344 {
7345 { "vpshab", { XM, EXx, VexW }, 0 },
7346 },
7347
7348 /* VEX_LEN_0FXOP_09_99 */
7349 {
7350 { "vpshaw", { XM, EXx, VexW }, 0 },
7351 },
7352
7353 /* VEX_LEN_0FXOP_09_9A */
7354 {
7355 { "vpshad", { XM, EXx, VexW }, 0 },
7356 },
7357
7358 /* VEX_LEN_0FXOP_09_9B */
7359 {
7360 { "vpshaq", { XM, EXx, VexW }, 0 },
7361 },
7362
7363 /* VEX_LEN_0FXOP_09_C1 */
7364 {
7365 { VEX_W_TABLE (VEX_W_0FXOP_09_C1_L_0) },
7366 },
7367
7368 /* VEX_LEN_0FXOP_09_C2 */
7369 {
7370 { VEX_W_TABLE (VEX_W_0FXOP_09_C2_L_0) },
7371 },
7372
7373 /* VEX_LEN_0FXOP_09_C3 */
7374 {
7375 { VEX_W_TABLE (VEX_W_0FXOP_09_C3_L_0) },
7376 },
7377
7378 /* VEX_LEN_0FXOP_09_C6 */
7379 {
7380 { VEX_W_TABLE (VEX_W_0FXOP_09_C6_L_0) },
7381 },
7382
7383 /* VEX_LEN_0FXOP_09_C7 */
7384 {
7385 { VEX_W_TABLE (VEX_W_0FXOP_09_C7_L_0) },
7386 },
7387
7388 /* VEX_LEN_0FXOP_09_CB */
7389 {
7390 { VEX_W_TABLE (VEX_W_0FXOP_09_CB_L_0) },
7391 },
7392
7393 /* VEX_LEN_0FXOP_09_D1 */
7394 {
7395 { VEX_W_TABLE (VEX_W_0FXOP_09_D1_L_0) },
7396 },
7397
7398 /* VEX_LEN_0FXOP_09_D2 */
7399 {
7400 { VEX_W_TABLE (VEX_W_0FXOP_09_D2_L_0) },
7401 },
7402
7403 /* VEX_LEN_0FXOP_09_D3 */
7404 {
7405 { VEX_W_TABLE (VEX_W_0FXOP_09_D3_L_0) },
7406 },
7407
7408 /* VEX_LEN_0FXOP_09_D6 */
7409 {
7410 { VEX_W_TABLE (VEX_W_0FXOP_09_D6_L_0) },
7411 },
7412
7413 /* VEX_LEN_0FXOP_09_D7 */
7414 {
7415 { VEX_W_TABLE (VEX_W_0FXOP_09_D7_L_0) },
7416 },
7417
7418 /* VEX_LEN_0FXOP_09_DB */
7419 {
7420 { VEX_W_TABLE (VEX_W_0FXOP_09_DB_L_0) },
7421 },
7422
7423 /* VEX_LEN_0FXOP_09_E1 */
7424 {
7425 { VEX_W_TABLE (VEX_W_0FXOP_09_E1_L_0) },
7426 },
7427
7428 /* VEX_LEN_0FXOP_09_E2 */
7429 {
7430 { VEX_W_TABLE (VEX_W_0FXOP_09_E2_L_0) },
7431 },
7432
7433 /* VEX_LEN_0FXOP_09_E3 */
7434 {
7435 { VEX_W_TABLE (VEX_W_0FXOP_09_E3_L_0) },
7436 },
7437
7438 /* VEX_LEN_0FXOP_0A_12 */
7439 {
7440 { REG_TABLE (REG_0FXOP_0A_12_L_0) },
7441 },
331d2d0d
L
7442};
7443
ad692897 7444#include "i386-dis-evex-len.h"
04e2a182 7445
9e30b8e0 7446static const struct dis386 vex_w_table[][2] = {
43234a1e
L
7447 {
7448 /* VEX_W_0F41_P_0_LEN_1 */
ab4e4ed5
AF
7449 { MOD_TABLE (MOD_VEX_W_0_0F41_P_0_LEN_1) },
7450 { MOD_TABLE (MOD_VEX_W_1_0F41_P_0_LEN_1) },
1ba585e8
IT
7451 },
7452 {
7453 /* VEX_W_0F41_P_2_LEN_1 */
ab4e4ed5
AF
7454 { MOD_TABLE (MOD_VEX_W_0_0F41_P_2_LEN_1) },
7455 { MOD_TABLE (MOD_VEX_W_1_0F41_P_2_LEN_1) }
43234a1e
L
7456 },
7457 {
7458 /* VEX_W_0F42_P_0_LEN_1 */
ab4e4ed5
AF
7459 { MOD_TABLE (MOD_VEX_W_0_0F42_P_0_LEN_1) },
7460 { MOD_TABLE (MOD_VEX_W_1_0F42_P_0_LEN_1) },
1ba585e8
IT
7461 },
7462 {
7463 /* VEX_W_0F42_P_2_LEN_1 */
ab4e4ed5
AF
7464 { MOD_TABLE (MOD_VEX_W_0_0F42_P_2_LEN_1) },
7465 { MOD_TABLE (MOD_VEX_W_1_0F42_P_2_LEN_1) },
43234a1e
L
7466 },
7467 {
7468 /* VEX_W_0F44_P_0_LEN_0 */
ab4e4ed5
AF
7469 { MOD_TABLE (MOD_VEX_W_0_0F44_P_0_LEN_1) },
7470 { MOD_TABLE (MOD_VEX_W_1_0F44_P_0_LEN_1) },
1ba585e8
IT
7471 },
7472 {
7473 /* VEX_W_0F44_P_2_LEN_0 */
ab4e4ed5
AF
7474 { MOD_TABLE (MOD_VEX_W_0_0F44_P_2_LEN_1) },
7475 { MOD_TABLE (MOD_VEX_W_1_0F44_P_2_LEN_1) },
43234a1e
L
7476 },
7477 {
ec6f095a
L
7478 /* VEX_W_0F45_P_0_LEN_1 */
7479 { MOD_TABLE (MOD_VEX_W_0_0F45_P_0_LEN_1) },
7480 { MOD_TABLE (MOD_VEX_W_1_0F45_P_0_LEN_1) },
9e30b8e0
L
7481 },
7482 {
ec6f095a
L
7483 /* VEX_W_0F45_P_2_LEN_1 */
7484 { MOD_TABLE (MOD_VEX_W_0_0F45_P_2_LEN_1) },
7485 { MOD_TABLE (MOD_VEX_W_1_0F45_P_2_LEN_1) },
9e30b8e0
L
7486 },
7487 {
ec6f095a
L
7488 /* VEX_W_0F46_P_0_LEN_1 */
7489 { MOD_TABLE (MOD_VEX_W_0_0F46_P_0_LEN_1) },
7490 { MOD_TABLE (MOD_VEX_W_1_0F46_P_0_LEN_1) },
9e30b8e0
L
7491 },
7492 {
ec6f095a
L
7493 /* VEX_W_0F46_P_2_LEN_1 */
7494 { MOD_TABLE (MOD_VEX_W_0_0F46_P_2_LEN_1) },
7495 { MOD_TABLE (MOD_VEX_W_1_0F46_P_2_LEN_1) },
9e30b8e0
L
7496 },
7497 {
ec6f095a
L
7498 /* VEX_W_0F47_P_0_LEN_1 */
7499 { MOD_TABLE (MOD_VEX_W_0_0F47_P_0_LEN_1) },
7500 { MOD_TABLE (MOD_VEX_W_1_0F47_P_0_LEN_1) },
9e30b8e0
L
7501 },
7502 {
ec6f095a
L
7503 /* VEX_W_0F47_P_2_LEN_1 */
7504 { MOD_TABLE (MOD_VEX_W_0_0F47_P_2_LEN_1) },
7505 { MOD_TABLE (MOD_VEX_W_1_0F47_P_2_LEN_1) },
9e30b8e0
L
7506 },
7507 {
ec6f095a
L
7508 /* VEX_W_0F4A_P_0_LEN_1 */
7509 { MOD_TABLE (MOD_VEX_W_0_0F4A_P_0_LEN_1) },
7510 { MOD_TABLE (MOD_VEX_W_1_0F4A_P_0_LEN_1) },
9e30b8e0
L
7511 },
7512 {
ec6f095a
L
7513 /* VEX_W_0F4A_P_2_LEN_1 */
7514 { MOD_TABLE (MOD_VEX_W_0_0F4A_P_2_LEN_1) },
7515 { MOD_TABLE (MOD_VEX_W_1_0F4A_P_2_LEN_1) },
9e30b8e0
L
7516 },
7517 {
ec6f095a
L
7518 /* VEX_W_0F4B_P_0_LEN_1 */
7519 { MOD_TABLE (MOD_VEX_W_0_0F4B_P_0_LEN_1) },
7520 { MOD_TABLE (MOD_VEX_W_1_0F4B_P_0_LEN_1) },
9e30b8e0
L
7521 },
7522 {
ec6f095a
L
7523 /* VEX_W_0F4B_P_2_LEN_1 */
7524 { MOD_TABLE (MOD_VEX_W_0_0F4B_P_2_LEN_1) },
9e30b8e0
L
7525 },
7526 {
ec6f095a
L
7527 /* VEX_W_0F90_P_0_LEN_0 */
7528 { "kmovw", { MaskG, MaskE }, 0 },
7529 { "kmovq", { MaskG, MaskE }, 0 },
9e30b8e0
L
7530 },
7531 {
ec6f095a
L
7532 /* VEX_W_0F90_P_2_LEN_0 */
7533 { "kmovb", { MaskG, MaskBDE }, 0 },
7534 { "kmovd", { MaskG, MaskBDE }, 0 },
9e30b8e0
L
7535 },
7536 {
ec6f095a
L
7537 /* VEX_W_0F91_P_0_LEN_0 */
7538 { MOD_TABLE (MOD_VEX_W_0_0F91_P_0_LEN_0) },
7539 { MOD_TABLE (MOD_VEX_W_1_0F91_P_0_LEN_0) },
9e30b8e0
L
7540 },
7541 {
ec6f095a
L
7542 /* VEX_W_0F91_P_2_LEN_0 */
7543 { MOD_TABLE (MOD_VEX_W_0_0F91_P_2_LEN_0) },
7544 { MOD_TABLE (MOD_VEX_W_1_0F91_P_2_LEN_0) },
9e30b8e0
L
7545 },
7546 {
ec6f095a
L
7547 /* VEX_W_0F92_P_0_LEN_0 */
7548 { MOD_TABLE (MOD_VEX_W_0_0F92_P_0_LEN_0) },
9e30b8e0
L
7549 },
7550 {
ec6f095a
L
7551 /* VEX_W_0F92_P_2_LEN_0 */
7552 { MOD_TABLE (MOD_VEX_W_0_0F92_P_2_LEN_0) },
9e30b8e0 7553 },
9e30b8e0 7554 {
ec6f095a
L
7555 /* VEX_W_0F93_P_0_LEN_0 */
7556 { MOD_TABLE (MOD_VEX_W_0_0F93_P_0_LEN_0) },
9e30b8e0
L
7557 },
7558 {
ec6f095a
L
7559 /* VEX_W_0F93_P_2_LEN_0 */
7560 { MOD_TABLE (MOD_VEX_W_0_0F93_P_2_LEN_0) },
9e30b8e0 7561 },
9e30b8e0 7562 {
ec6f095a
L
7563 /* VEX_W_0F98_P_0_LEN_0 */
7564 { MOD_TABLE (MOD_VEX_W_0_0F98_P_0_LEN_0) },
7565 { MOD_TABLE (MOD_VEX_W_1_0F98_P_0_LEN_0) },
9e30b8e0
L
7566 },
7567 {
ec6f095a
L
7568 /* VEX_W_0F98_P_2_LEN_0 */
7569 { MOD_TABLE (MOD_VEX_W_0_0F98_P_2_LEN_0) },
7570 { MOD_TABLE (MOD_VEX_W_1_0F98_P_2_LEN_0) },
9e30b8e0
L
7571 },
7572 {
ec6f095a
L
7573 /* VEX_W_0F99_P_0_LEN_0 */
7574 { MOD_TABLE (MOD_VEX_W_0_0F99_P_0_LEN_0) },
7575 { MOD_TABLE (MOD_VEX_W_1_0F99_P_0_LEN_0) },
9e30b8e0
L
7576 },
7577 {
ec6f095a
L
7578 /* VEX_W_0F99_P_2_LEN_0 */
7579 { MOD_TABLE (MOD_VEX_W_0_0F99_P_2_LEN_0) },
7580 { MOD_TABLE (MOD_VEX_W_1_0F99_P_2_LEN_0) },
9e30b8e0 7581 },
9e30b8e0 7582 {
7531c613
JB
7583 /* VEX_W_0F380C */
7584 { "vpermilps", { XM, Vex, EXx }, PREFIX_DATA },
9e30b8e0
L
7585 },
7586 {
7531c613
JB
7587 /* VEX_W_0F380D */
7588 { "vpermilpd", { XM, Vex, EXx }, PREFIX_DATA },
9e30b8e0
L
7589 },
7590 {
7531c613
JB
7591 /* VEX_W_0F380E */
7592 { "vtestps", { XM, EXx }, PREFIX_DATA },
9e30b8e0
L
7593 },
7594 {
7531c613
JB
7595 /* VEX_W_0F380F */
7596 { "vtestpd", { XM, EXx }, PREFIX_DATA },
9e30b8e0 7597 },
6431c801 7598 {
7531c613
JB
7599 /* VEX_W_0F3813 */
7600 { "vcvtph2ps", { XM, EXxmmq }, PREFIX_DATA },
6431c801 7601 },
6c30d220 7602 {
7531c613
JB
7603 /* VEX_W_0F3816_L_1 */
7604 { "vpermps", { XM, Vex, EXx }, PREFIX_DATA },
6c30d220 7605 },
bcf2684f 7606 {
7531c613
JB
7607 /* VEX_W_0F3818 */
7608 { "vbroadcastss", { XM, EXxmm_md }, PREFIX_DATA },
bcf2684f 7609 },
9e30b8e0 7610 {
7531c613
JB
7611 /* VEX_W_0F3819_L_1 */
7612 { "vbroadcastsd", { XM, EXxmm_mq }, PREFIX_DATA },
9e30b8e0
L
7613 },
7614 {
7531c613
JB
7615 /* VEX_W_0F381A_M_0_L_1 */
7616 { "vbroadcastf128", { XM, Mxmm }, PREFIX_DATA },
9e30b8e0 7617 },
53aa04a0 7618 {
7531c613
JB
7619 /* VEX_W_0F382C_M_0 */
7620 { "vmaskmovps", { XM, Vex, Mx }, PREFIX_DATA },
53aa04a0
L
7621 },
7622 {
7531c613
JB
7623 /* VEX_W_0F382D_M_0 */
7624 { "vmaskmovpd", { XM, Vex, Mx }, PREFIX_DATA },
53aa04a0
L
7625 },
7626 {
7531c613
JB
7627 /* VEX_W_0F382E_M_0 */
7628 { "vmaskmovps", { Mx, Vex, XM }, PREFIX_DATA },
53aa04a0
L
7629 },
7630 {
7531c613
JB
7631 /* VEX_W_0F382F_M_0 */
7632 { "vmaskmovpd", { Mx, Vex, XM }, PREFIX_DATA },
53aa04a0 7633 },
6c30d220 7634 {
7531c613
JB
7635 /* VEX_W_0F3836 */
7636 { "vpermd", { XM, Vex, EXx }, PREFIX_DATA },
9e30b8e0 7637 },
6c30d220 7638 {
7531c613
JB
7639 /* VEX_W_0F3846 */
7640 { "vpsravd", { XM, Vex, EXx }, PREFIX_DATA },
6c30d220 7641 },
260cd341
LC
7642 {
7643 /* VEX_W_0F3849_X86_64_P_0 */
7644 { MOD_TABLE (MOD_VEX_0F3849_X86_64_P_0_W_0) },
7645 },
7646 {
7647 /* VEX_W_0F3849_X86_64_P_2 */
7648 { MOD_TABLE (MOD_VEX_0F3849_X86_64_P_2_W_0) },
7649 },
7650 {
7651 /* VEX_W_0F3849_X86_64_P_3 */
7652 { MOD_TABLE (MOD_VEX_0F3849_X86_64_P_3_W_0) },
7653 },
7654 {
7655 /* VEX_W_0F384B_X86_64_P_1 */
7656 { MOD_TABLE (MOD_VEX_0F384B_X86_64_P_1_W_0) },
7657 },
7658 {
7659 /* VEX_W_0F384B_X86_64_P_2 */
7660 { MOD_TABLE (MOD_VEX_0F384B_X86_64_P_2_W_0) },
7661 },
7662 {
7663 /* VEX_W_0F384B_X86_64_P_3 */
7664 { MOD_TABLE (MOD_VEX_0F384B_X86_64_P_3_W_0) },
7665 },
6c30d220 7666 {
7531c613
JB
7667 /* VEX_W_0F3858 */
7668 { "vpbroadcastd", { XM, EXxmm_md }, PREFIX_DATA },
6c30d220
L
7669 },
7670 {
7531c613
JB
7671 /* VEX_W_0F3859 */
7672 { "vpbroadcastq", { XM, EXxmm_mq }, PREFIX_DATA },
6c30d220
L
7673 },
7674 {
7531c613
JB
7675 /* VEX_W_0F385A_M_0_L_0 */
7676 { "vbroadcasti128", { XM, Mxmm }, PREFIX_DATA },
6c30d220 7677 },
260cd341
LC
7678 {
7679 /* VEX_W_0F385C_X86_64_P_1 */
7680 { MOD_TABLE (MOD_VEX_0F385C_X86_64_P_1_W_0) },
7681 },
7682 {
7683 /* VEX_W_0F385E_X86_64_P_0 */
7684 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_0_W_0) },
7685 },
7686 {
7687 /* VEX_W_0F385E_X86_64_P_1 */
7688 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_1_W_0) },
7689 },
7690 {
7691 /* VEX_W_0F385E_X86_64_P_2 */
7692 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_2_W_0) },
7693 },
7694 {
7695 /* VEX_W_0F385E_X86_64_P_3 */
7696 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_3_W_0) },
7697 },
6c30d220 7698 {
7531c613
JB
7699 /* VEX_W_0F3878 */
7700 { "vpbroadcastb", { XM, EXxmm_mb }, PREFIX_DATA },
6c30d220
L
7701 },
7702 {
7531c613
JB
7703 /* VEX_W_0F3879 */
7704 { "vpbroadcastw", { XM, EXxmm_mw }, PREFIX_DATA },
6c30d220 7705 },
48521003 7706 {
7531c613
JB
7707 /* VEX_W_0F38CF */
7708 { "vgf2p8mulb", { XM, Vex, EXx }, PREFIX_DATA },
48521003 7709 },
6c30d220 7710 {
7531c613 7711 /* VEX_W_0F3A00_L_1 */
6c30d220 7712 { Bad_Opcode },
7531c613 7713 { "vpermq", { XM, EXx, Ib }, PREFIX_DATA },
6c30d220
L
7714 },
7715 {
7531c613 7716 /* VEX_W_0F3A01_L_1 */
6c30d220 7717 { Bad_Opcode },
7531c613 7718 { "vpermpd", { XM, EXx, Ib }, PREFIX_DATA },
6c30d220
L
7719 },
7720 {
7531c613
JB
7721 /* VEX_W_0F3A02 */
7722 { "vpblendd", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6c30d220 7723 },
9e30b8e0 7724 {
7531c613
JB
7725 /* VEX_W_0F3A04 */
7726 { "vpermilps", { XM, EXx, Ib }, PREFIX_DATA },
9e30b8e0
L
7727 },
7728 {
7531c613
JB
7729 /* VEX_W_0F3A05 */
7730 { "vpermilpd", { XM, EXx, Ib }, PREFIX_DATA },
9e30b8e0
L
7731 },
7732 {
7531c613
JB
7733 /* VEX_W_0F3A06_L_1 */
7734 { "vperm2f128", { XM, Vex, EXx, Ib }, PREFIX_DATA },
9e30b8e0 7735 },
9e30b8e0 7736 {
7531c613
JB
7737 /* VEX_W_0F3A18_L_1 */
7738 { "vinsertf128", { XM, Vex, EXxmm, Ib }, PREFIX_DATA },
9e30b8e0
L
7739 },
7740 {
7531c613
JB
7741 /* VEX_W_0F3A19_L_1 */
7742 { "vextractf128", { EXxmm, XM, Ib }, PREFIX_DATA },
9e30b8e0 7743 },
6431c801 7744 {
7531c613
JB
7745 /* VEX_W_0F3A1D */
7746 { "vcvtps2ph", { EXxmmq, XM, EXxEVexS, Ib }, PREFIX_DATA },
6431c801 7747 },
43234a1e 7748 {
7531c613
JB
7749 /* VEX_W_0F3A30_L_0 */
7750 { MOD_TABLE (MOD_VEX_0F3A30_L_0_W_0) },
7751 { MOD_TABLE (MOD_VEX_0F3A30_L_0_W_1) },
43234a1e
L
7752 },
7753 {
7531c613
JB
7754 /* VEX_W_0F3A31_L_0 */
7755 { MOD_TABLE (MOD_VEX_0F3A31_L_0_W_0) },
7756 { MOD_TABLE (MOD_VEX_0F3A31_L_0_W_1) },
1ba585e8
IT
7757 },
7758 {
7531c613
JB
7759 /* VEX_W_0F3A32_L_0 */
7760 { MOD_TABLE (MOD_VEX_0F3A32_L_0_W_0) },
7761 { MOD_TABLE (MOD_VEX_0F3A32_L_0_W_1) },
43234a1e 7762 },
1ba585e8 7763 {
7531c613
JB
7764 /* VEX_W_0F3A33_L_0 */
7765 { MOD_TABLE (MOD_VEX_0F3A33_L_0_W_0) },
7766 { MOD_TABLE (MOD_VEX_0F3A33_L_0_W_1) },
1ba585e8 7767 },
6c30d220 7768 {
7531c613
JB
7769 /* VEX_W_0F3A38_L_1 */
7770 { "vinserti128", { XM, Vex, EXxmm, Ib }, PREFIX_DATA },
6c30d220
L
7771 },
7772 {
7531c613
JB
7773 /* VEX_W_0F3A39_L_1 */
7774 { "vextracti128", { EXxmm, XM, Ib }, PREFIX_DATA },
6c30d220 7775 },
6c30d220 7776 {
7531c613
JB
7777 /* VEX_W_0F3A46_L_1 */
7778 { "vperm2i128", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6c30d220 7779 },
9e30b8e0 7780 {
7531c613
JB
7781 /* VEX_W_0F3A4A */
7782 { "vblendvps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
9e30b8e0
L
7783 },
7784 {
7531c613
JB
7785 /* VEX_W_0F3A4B */
7786 { "vblendvpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
9e30b8e0
L
7787 },
7788 {
7531c613
JB
7789 /* VEX_W_0F3A4C */
7790 { "vpblendvb", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
9e30b8e0 7791 },
48521003 7792 {
7531c613 7793 /* VEX_W_0F3ACE */
48521003 7794 { Bad_Opcode },
7531c613 7795 { "vgf2p8affineqb", { XM, Vex, EXx, Ib }, PREFIX_DATA },
48521003
IT
7796 },
7797 {
7531c613 7798 /* VEX_W_0F3ACF */
48521003 7799 { Bad_Opcode },
7531c613 7800 { "vgf2p8affineinvqb", { XM, Vex, EXx, Ib }, PREFIX_DATA },
48521003 7801 },
467bbef0
JB
7802 /* VEX_W_0FXOP_08_85_L_0 */
7803 {
7804 { "vpmacssww", { XM, Vex, EXx, XMVexI4 }, 0 },
7805 },
7806 /* VEX_W_0FXOP_08_86_L_0 */
7807 {
7808 { "vpmacsswd", { XM, Vex, EXx, XMVexI4 }, 0 },
7809 },
7810 /* VEX_W_0FXOP_08_87_L_0 */
7811 {
7812 { "vpmacssdql", { XM, Vex, EXx, XMVexI4 }, 0 },
7813 },
7814 /* VEX_W_0FXOP_08_8E_L_0 */
7815 {
7816 { "vpmacssdd", { XM, Vex, EXx, XMVexI4 }, 0 },
7817 },
7818 /* VEX_W_0FXOP_08_8F_L_0 */
7819 {
7820 { "vpmacssdqh", { XM, Vex, EXx, XMVexI4 }, 0 },
7821 },
7822 /* VEX_W_0FXOP_08_95_L_0 */
7823 {
7824 { "vpmacsww", { XM, Vex, EXx, XMVexI4 }, 0 },
7825 },
7826 /* VEX_W_0FXOP_08_96_L_0 */
7827 {
7828 { "vpmacswd", { XM, Vex, EXx, XMVexI4 }, 0 },
7829 },
7830 /* VEX_W_0FXOP_08_97_L_0 */
7831 {
7832 { "vpmacsdql", { XM, Vex, EXx, XMVexI4 }, 0 },
7833 },
7834 /* VEX_W_0FXOP_08_9E_L_0 */
7835 {
7836 { "vpmacsdd", { XM, Vex, EXx, XMVexI4 }, 0 },
7837 },
7838 /* VEX_W_0FXOP_08_9F_L_0 */
7839 {
7840 { "vpmacsdqh", { XM, Vex, EXx, XMVexI4 }, 0 },
7841 },
7842 /* VEX_W_0FXOP_08_A6_L_0 */
7843 {
7844 { "vpmadcsswd", { XM, Vex, EXx, XMVexI4 }, 0 },
7845 },
7846 /* VEX_W_0FXOP_08_B6_L_0 */
7847 {
7848 { "vpmadcswd", { XM, Vex, EXx, XMVexI4 }, 0 },
7849 },
7850 /* VEX_W_0FXOP_08_C0_L_0 */
7851 {
7852 { "vprotb", { XM, EXx, Ib }, 0 },
7853 },
7854 /* VEX_W_0FXOP_08_C1_L_0 */
7855 {
7856 { "vprotw", { XM, EXx, Ib }, 0 },
7857 },
7858 /* VEX_W_0FXOP_08_C2_L_0 */
7859 {
7860 { "vprotd", { XM, EXx, Ib }, 0 },
7861 },
7862 /* VEX_W_0FXOP_08_C3_L_0 */
7863 {
7864 { "vprotq", { XM, EXx, Ib }, 0 },
7865 },
7866 /* VEX_W_0FXOP_08_CC_L_0 */
7867 {
89e65d17 7868 { "vpcomb", { XM, Vex, EXx, VPCOM }, 0 },
467bbef0
JB
7869 },
7870 /* VEX_W_0FXOP_08_CD_L_0 */
7871 {
89e65d17 7872 { "vpcomw", { XM, Vex, EXx, VPCOM }, 0 },
467bbef0
JB
7873 },
7874 /* VEX_W_0FXOP_08_CE_L_0 */
7875 {
89e65d17 7876 { "vpcomd", { XM, Vex, EXx, VPCOM }, 0 },
467bbef0
JB
7877 },
7878 /* VEX_W_0FXOP_08_CF_L_0 */
7879 {
89e65d17 7880 { "vpcomq", { XM, Vex, EXx, VPCOM }, 0 },
467bbef0
JB
7881 },
7882 /* VEX_W_0FXOP_08_EC_L_0 */
7883 {
89e65d17 7884 { "vpcomub", { XM, Vex, EXx, VPCOM }, 0 },
467bbef0
JB
7885 },
7886 /* VEX_W_0FXOP_08_ED_L_0 */
7887 {
89e65d17 7888 { "vpcomuw", { XM, Vex, EXx, VPCOM }, 0 },
467bbef0
JB
7889 },
7890 /* VEX_W_0FXOP_08_EE_L_0 */
7891 {
89e65d17 7892 { "vpcomud", { XM, Vex, EXx, VPCOM }, 0 },
467bbef0
JB
7893 },
7894 /* VEX_W_0FXOP_08_EF_L_0 */
7895 {
89e65d17 7896 { "vpcomuq", { XM, Vex, EXx, VPCOM }, 0 },
467bbef0 7897 },
b5b098c2
JB
7898 /* VEX_W_0FXOP_09_80 */
7899 {
7900 { "vfrczps", { XM, EXx }, 0 },
7901 },
7902 /* VEX_W_0FXOP_09_81 */
7903 {
7904 { "vfrczpd", { XM, EXx }, 0 },
7905 },
7906 /* VEX_W_0FXOP_09_82 */
7907 {
7908 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_82_W_0) },
7909 },
7910 /* VEX_W_0FXOP_09_83 */
7911 {
7912 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_83_W_0) },
7913 },
467bbef0
JB
7914 /* VEX_W_0FXOP_09_C1_L_0 */
7915 {
7916 { "vphaddbw", { XM, EXxmm }, 0 },
7917 },
7918 /* VEX_W_0FXOP_09_C2_L_0 */
7919 {
7920 { "vphaddbd", { XM, EXxmm }, 0 },
7921 },
7922 /* VEX_W_0FXOP_09_C3_L_0 */
7923 {
7924 { "vphaddbq", { XM, EXxmm }, 0 },
7925 },
7926 /* VEX_W_0FXOP_09_C6_L_0 */
7927 {
7928 { "vphaddwd", { XM, EXxmm }, 0 },
7929 },
7930 /* VEX_W_0FXOP_09_C7_L_0 */
7931 {
7932 { "vphaddwq", { XM, EXxmm }, 0 },
7933 },
7934 /* VEX_W_0FXOP_09_CB_L_0 */
7935 {
7936 { "vphadddq", { XM, EXxmm }, 0 },
7937 },
7938 /* VEX_W_0FXOP_09_D1_L_0 */
7939 {
7940 { "vphaddubw", { XM, EXxmm }, 0 },
7941 },
7942 /* VEX_W_0FXOP_09_D2_L_0 */
7943 {
7944 { "vphaddubd", { XM, EXxmm }, 0 },
7945 },
7946 /* VEX_W_0FXOP_09_D3_L_0 */
7947 {
7948 { "vphaddubq", { XM, EXxmm }, 0 },
7949 },
7950 /* VEX_W_0FXOP_09_D6_L_0 */
7951 {
7952 { "vphadduwd", { XM, EXxmm }, 0 },
7953 },
7954 /* VEX_W_0FXOP_09_D7_L_0 */
7955 {
7956 { "vphadduwq", { XM, EXxmm }, 0 },
7957 },
7958 /* VEX_W_0FXOP_09_DB_L_0 */
7959 {
7960 { "vphaddudq", { XM, EXxmm }, 0 },
7961 },
7962 /* VEX_W_0FXOP_09_E1_L_0 */
7963 {
7964 { "vphsubbw", { XM, EXxmm }, 0 },
7965 },
7966 /* VEX_W_0FXOP_09_E2_L_0 */
7967 {
7968 { "vphsubwd", { XM, EXxmm }, 0 },
7969 },
7970 /* VEX_W_0FXOP_09_E3_L_0 */
7971 {
7972 { "vphsubdq", { XM, EXxmm }, 0 },
7973 },
ad692897
L
7974
7975#include "i386-dis-evex-w.h"
9e30b8e0
L
7976};
7977
7978static const struct dis386 mod_table[][2] = {
7979 {
7980 /* MOD_8D */
bf890a93 7981 { "leaS", { Gv, M }, 0 },
9e30b8e0 7982 },
42164a71
L
7983 {
7984 /* MOD_C6_REG_7 */
7985 { Bad_Opcode },
7986 { RM_TABLE (RM_C6_REG_7) },
7987 },
7988 {
7989 /* MOD_C7_REG_7 */
7990 { Bad_Opcode },
7991 { RM_TABLE (RM_C7_REG_7) },
7992 },
4a357820
MZ
7993 {
7994 /* MOD_FF_REG_3 */
8f570d62 7995 { "{l|}call^", { indirEp }, 0 },
4a357820
MZ
7996 },
7997 {
7998 /* MOD_FF_REG_5 */
8f570d62 7999 { "{l|}jmp^", { indirEp }, 0 },
4a357820 8000 },
9e30b8e0
L
8001 {
8002 /* MOD_0F01_REG_0 */
8003 { X86_64_TABLE (X86_64_0F01_REG_0) },
8004 { RM_TABLE (RM_0F01_REG_0) },
8005 },
8006 {
8007 /* MOD_0F01_REG_1 */
8008 { X86_64_TABLE (X86_64_0F01_REG_1) },
8009 { RM_TABLE (RM_0F01_REG_1) },
8010 },
8011 {
8012 /* MOD_0F01_REG_2 */
8013 { X86_64_TABLE (X86_64_0F01_REG_2) },
8014 { RM_TABLE (RM_0F01_REG_2) },
8015 },
8016 {
8017 /* MOD_0F01_REG_3 */
8018 { X86_64_TABLE (X86_64_0F01_REG_3) },
8019 { RM_TABLE (RM_0F01_REG_3) },
8020 },
8eab4136
L
8021 {
8022 /* MOD_0F01_REG_5 */
f8687e93
JB
8023 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_0) },
8024 { RM_TABLE (RM_0F01_REG_5_MOD_3) },
8eab4136 8025 },
9e30b8e0
L
8026 {
8027 /* MOD_0F01_REG_7 */
bf890a93 8028 { "invlpg", { Mb }, 0 },
f8687e93 8029 { RM_TABLE (RM_0F01_REG_7_MOD_3) },
9e30b8e0
L
8030 },
8031 {
8032 /* MOD_0F12_PREFIX_0 */
18897deb
JB
8033 { "movlpX", { XM, EXq }, 0 },
8034 { "movhlps", { XM, EXq }, 0 },
8035 },
8036 {
8037 /* MOD_0F12_PREFIX_2 */
8038 { "movlpX", { XM, EXq }, 0 },
9e30b8e0
L
8039 },
8040 {
8041 /* MOD_0F13 */
507bd325 8042 { "movlpX", { EXq, XM }, PREFIX_OPCODE },
9e30b8e0
L
8043 },
8044 {
8045 /* MOD_0F16_PREFIX_0 */
18897deb 8046 { "movhpX", { XM, EXq }, 0 },
bf890a93 8047 { "movlhps", { XM, EXq }, 0 },
9e30b8e0 8048 },
18897deb
JB
8049 {
8050 /* MOD_0F16_PREFIX_2 */
8051 { "movhpX", { XM, EXq }, 0 },
8052 },
9e30b8e0
L
8053 {
8054 /* MOD_0F17 */
507bd325 8055 { "movhpX", { EXq, XM }, PREFIX_OPCODE },
9e30b8e0
L
8056 },
8057 {
8058 /* MOD_0F18_REG_0 */
bf890a93 8059 { "prefetchnta", { Mb }, 0 },
9e30b8e0
L
8060 },
8061 {
8062 /* MOD_0F18_REG_1 */
bf890a93 8063 { "prefetcht0", { Mb }, 0 },
9e30b8e0
L
8064 },
8065 {
8066 /* MOD_0F18_REG_2 */
bf890a93 8067 { "prefetcht1", { Mb }, 0 },
9e30b8e0
L
8068 },
8069 {
8070 /* MOD_0F18_REG_3 */
bf890a93 8071 { "prefetcht2", { Mb }, 0 },
9e30b8e0 8072 },
d7189fa5
RM
8073 {
8074 /* MOD_0F18_REG_4 */
bf890a93 8075 { "nop/reserved", { Mb }, 0 },
d7189fa5
RM
8076 },
8077 {
8078 /* MOD_0F18_REG_5 */
bf890a93 8079 { "nop/reserved", { Mb }, 0 },
d7189fa5
RM
8080 },
8081 {
8082 /* MOD_0F18_REG_6 */
bf890a93 8083 { "nop/reserved", { Mb }, 0 },
d7189fa5
RM
8084 },
8085 {
8086 /* MOD_0F18_REG_7 */
bf890a93 8087 { "nop/reserved", { Mb }, 0 },
d7189fa5 8088 },
7e8b059b
L
8089 {
8090 /* MOD_0F1A_PREFIX_0 */
d276ec69 8091 { "bndldx", { Gbnd, Mv_bnd }, 0 },
bf890a93 8092 { "nopQ", { Ev }, 0 },
7e8b059b
L
8093 },
8094 {
8095 /* MOD_0F1B_PREFIX_0 */
d276ec69 8096 { "bndstx", { Mv_bnd, Gbnd }, 0 },
bf890a93 8097 { "nopQ", { Ev }, 0 },
7e8b059b
L
8098 },
8099 {
8100 /* MOD_0F1B_PREFIX_1 */
d276ec69 8101 { "bndmk", { Gbnd, Mv_bnd }, 0 },
bf890a93 8102 { "nopQ", { Ev }, 0 },
7e8b059b 8103 },
c48935d7
IT
8104 {
8105 /* MOD_0F1C_PREFIX_0 */
f8687e93 8106 { REG_TABLE (REG_0F1C_P_0_MOD_0) },
c48935d7
IT
8107 { "nopQ", { Ev }, 0 },
8108 },
603555e5
L
8109 {
8110 /* MOD_0F1E_PREFIX_1 */
8111 { "nopQ", { Ev }, 0 },
f8687e93 8112 { REG_TABLE (REG_0F1E_P_1_MOD_3) },
603555e5 8113 },
b844680a 8114 {
92fddf8e 8115 /* MOD_0F24 */
7bb15c6f 8116 { Bad_Opcode },
bf890a93 8117 { "movL", { Rd, Td }, 0 },
b844680a
L
8118 },
8119 {
92fddf8e 8120 /* MOD_0F26 */
592d1631 8121 { Bad_Opcode },
bf890a93 8122 { "movL", { Td, Rd }, 0 },
b844680a 8123 },
75c135a8
L
8124 {
8125 /* MOD_0F2B_PREFIX_0 */
507bd325 8126 {"movntps", { Mx, XM }, PREFIX_OPCODE },
75c135a8
L
8127 },
8128 {
8129 /* MOD_0F2B_PREFIX_1 */
507bd325 8130 {"movntss", { Md, XM }, PREFIX_OPCODE },
75c135a8
L
8131 },
8132 {
8133 /* MOD_0F2B_PREFIX_2 */
507bd325 8134 {"movntpd", { Mx, XM }, PREFIX_OPCODE },
75c135a8
L
8135 },
8136 {
8137 /* MOD_0F2B_PREFIX_3 */
507bd325 8138 {"movntsd", { Mq, XM }, PREFIX_OPCODE },
75c135a8
L
8139 },
8140 {
a5aaedb9 8141 /* MOD_0F50 */
592d1631 8142 { Bad_Opcode },
507bd325 8143 { "movmskpX", { Gdq, XS }, PREFIX_OPCODE },
75c135a8 8144 },
b844680a 8145 {
1ceb70f8 8146 /* MOD_0F71_REG_2 */
592d1631 8147 { Bad_Opcode },
7531c613 8148 { "psrlw", { MS, Ib }, PREFIX_OPCODE },
b844680a
L
8149 },
8150 {
1ceb70f8 8151 /* MOD_0F71_REG_4 */
592d1631 8152 { Bad_Opcode },
7531c613 8153 { "psraw", { MS, Ib }, PREFIX_OPCODE },
b844680a
L
8154 },
8155 {
1ceb70f8 8156 /* MOD_0F71_REG_6 */
592d1631 8157 { Bad_Opcode },
7531c613 8158 { "psllw", { MS, Ib }, PREFIX_OPCODE },
b844680a
L
8159 },
8160 {
1ceb70f8 8161 /* MOD_0F72_REG_2 */
592d1631 8162 { Bad_Opcode },
7531c613 8163 { "psrld", { MS, Ib }, PREFIX_OPCODE },
b844680a
L
8164 },
8165 {
1ceb70f8 8166 /* MOD_0F72_REG_4 */
592d1631 8167 { Bad_Opcode },
7531c613 8168 { "psrad", { MS, Ib }, PREFIX_OPCODE },
b844680a
L
8169 },
8170 {
1ceb70f8 8171 /* MOD_0F72_REG_6 */
592d1631 8172 { Bad_Opcode },
7531c613 8173 { "pslld", { MS, Ib }, PREFIX_OPCODE },
b844680a
L
8174 },
8175 {
1ceb70f8 8176 /* MOD_0F73_REG_2 */
592d1631 8177 { Bad_Opcode },
7531c613 8178 { "psrlq", { MS, Ib }, PREFIX_OPCODE },
b844680a
L
8179 },
8180 {
1ceb70f8 8181 /* MOD_0F73_REG_3 */
592d1631 8182 { Bad_Opcode },
7531c613 8183 { "psrldq", { XS, Ib }, PREFIX_DATA },
c0f3af97
L
8184 },
8185 {
8186 /* MOD_0F73_REG_6 */
592d1631 8187 { Bad_Opcode },
7531c613 8188 { "psllq", { MS, Ib }, PREFIX_OPCODE },
c0f3af97
L
8189 },
8190 {
8191 /* MOD_0F73_REG_7 */
592d1631 8192 { Bad_Opcode },
7531c613 8193 { "pslldq", { XS, Ib }, PREFIX_DATA },
c0f3af97
L
8194 },
8195 {
8196 /* MOD_0FAE_REG_0 */
bf890a93 8197 { "fxsave", { FXSAVE }, 0 },
f8687e93 8198 { PREFIX_TABLE (PREFIX_0FAE_REG_0_MOD_3) },
c0f3af97
L
8199 },
8200 {
8201 /* MOD_0FAE_REG_1 */
bf890a93 8202 { "fxrstor", { FXSAVE }, 0 },
f8687e93 8203 { PREFIX_TABLE (PREFIX_0FAE_REG_1_MOD_3) },
c0f3af97
L
8204 },
8205 {
8206 /* MOD_0FAE_REG_2 */
bf890a93 8207 { "ldmxcsr", { Md }, 0 },
f8687e93 8208 { PREFIX_TABLE (PREFIX_0FAE_REG_2_MOD_3) },
c0f3af97
L
8209 },
8210 {
8211 /* MOD_0FAE_REG_3 */
bf890a93 8212 { "stmxcsr", { Md }, 0 },
f8687e93 8213 { PREFIX_TABLE (PREFIX_0FAE_REG_3_MOD_3) },
c0f3af97
L
8214 },
8215 {
8216 /* MOD_0FAE_REG_4 */
f8687e93
JB
8217 { PREFIX_TABLE (PREFIX_0FAE_REG_4_MOD_0) },
8218 { PREFIX_TABLE (PREFIX_0FAE_REG_4_MOD_3) },
c0f3af97
L
8219 },
8220 {
8221 /* MOD_0FAE_REG_5 */
f8687e93
JB
8222 { PREFIX_TABLE (PREFIX_0FAE_REG_5_MOD_0) },
8223 { PREFIX_TABLE (PREFIX_0FAE_REG_5_MOD_3) },
c0f3af97
L
8224 },
8225 {
8226 /* MOD_0FAE_REG_6 */
f8687e93
JB
8227 { PREFIX_TABLE (PREFIX_0FAE_REG_6_MOD_0) },
8228 { PREFIX_TABLE (PREFIX_0FAE_REG_6_MOD_3) },
c0f3af97
L
8229 },
8230 {
8231 /* MOD_0FAE_REG_7 */
f8687e93
JB
8232 { PREFIX_TABLE (PREFIX_0FAE_REG_7_MOD_0) },
8233 { RM_TABLE (RM_0FAE_REG_7_MOD_3) },
c0f3af97
L
8234 },
8235 {
8236 /* MOD_0FB2 */
bf890a93 8237 { "lssS", { Gv, Mp }, 0 },
c0f3af97
L
8238 },
8239 {
8240 /* MOD_0FB4 */
bf890a93 8241 { "lfsS", { Gv, Mp }, 0 },
c0f3af97
L
8242 },
8243 {
8244 /* MOD_0FB5 */
bf890a93 8245 { "lgsS", { Gv, Mp }, 0 },
c0f3af97 8246 },
a8484f96
L
8247 {
8248 /* MOD_0FC3 */
f8687e93 8249 { PREFIX_TABLE (PREFIX_0FC3_MOD_0) },
a8484f96 8250 },
963f3586
IT
8251 {
8252 /* MOD_0FC7_REG_3 */
a8484f96 8253 { "xrstors", { FXSAVE }, 0 },
963f3586
IT
8254 },
8255 {
8256 /* MOD_0FC7_REG_4 */
bf890a93 8257 { "xsavec", { FXSAVE }, 0 },
963f3586
IT
8258 },
8259 {
8260 /* MOD_0FC7_REG_5 */
bf890a93 8261 { "xsaves", { FXSAVE }, 0 },
963f3586 8262 },
c0f3af97
L
8263 {
8264 /* MOD_0FC7_REG_6 */
f8687e93
JB
8265 { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_0) },
8266 { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_3) }
c0f3af97
L
8267 },
8268 {
8269 /* MOD_0FC7_REG_7 */
bf890a93 8270 { "vmptrst", { Mq }, 0 },
f8687e93 8271 { PREFIX_TABLE (PREFIX_0FC7_REG_7_MOD_3) }
c0f3af97
L
8272 },
8273 {
8274 /* MOD_0FD7 */
592d1631 8275 { Bad_Opcode },
bf890a93 8276 { "pmovmskb", { Gdq, MS }, 0 },
c0f3af97
L
8277 },
8278 {
8279 /* MOD_0FE7_PREFIX_2 */
bf890a93 8280 { "movntdq", { Mx, XM }, 0 },
c0f3af97
L
8281 },
8282 {
8283 /* MOD_0FF0_PREFIX_3 */
bf890a93 8284 { "lddqu", { XM, M }, 0 },
c0f3af97
L
8285 },
8286 {
7531c613
JB
8287 /* MOD_0F382A */
8288 { "movntdqa", { XM, Mx }, PREFIX_DATA },
c0f3af97 8289 },
260cd341
LC
8290 {
8291 /* MOD_VEX_0F3849_X86_64_P_0_W_0 */
8292 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_0_W_0_M_0) },
8293 { REG_TABLE (REG_VEX_0F3849_X86_64_P_0_W_0_M_1) },
8294 },
8295 {
8296 /* MOD_VEX_0F3849_X86_64_P_2_W_0 */
8297 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_2_W_0_M_0) },
8298 },
8299 {
8300 /* MOD_VEX_0F3849_X86_64_P_3_W_0 */
8301 { Bad_Opcode },
8302 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_3_W_0_M_0) },
8303 },
8304 {
8305 /* MOD_VEX_0F384B_X86_64_P_1_W_0 */
8306 { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64_P_1_W_0_M_0) },
8307 },
8308 {
8309 /* MOD_VEX_0F384B_X86_64_P_2_W_0 */
8310 { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64_P_2_W_0_M_0) },
8311 },
8312 {
8313 /* MOD_VEX_0F384B_X86_64_P_3_W_0 */
8314 { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64_P_3_W_0_M_0) },
8315 },
8316 {
8317 /* MOD_VEX_0F385C_X86_64_P_1_W_0 */
8318 { Bad_Opcode },
8319 { VEX_LEN_TABLE (VEX_LEN_0F385C_X86_64_P_1_W_0_M_0) },
8320 },
8321 {
8322 /* MOD_VEX_0F385E_X86_64_P_0_W_0 */
8323 { Bad_Opcode },
8324 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_0_W_0_M_0) },
8325 },
8326 {
8327 /* MOD_VEX_0F385E_X86_64_P_1_W_0 */
8328 { Bad_Opcode },
8329 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_1_W_0_M_0) },
8330 },
8331 {
8332 /* MOD_VEX_0F385E_X86_64_P_2_W_0 */
8333 { Bad_Opcode },
8334 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_2_W_0_M_0) },
8335 },
8336 {
8337 /* MOD_VEX_0F385E_X86_64_P_3_W_0 */
8338 { Bad_Opcode },
8339 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_3_W_0_M_0) },
8340 },
603555e5 8341 {
7531c613
JB
8342 /* MOD_0F38F5 */
8343 { "wrussK", { M, Gdq }, PREFIX_DATA },
603555e5
L
8344 },
8345 {
8346 /* MOD_0F38F6_PREFIX_0 */
8347 { "wrssK", { M, Gdq }, PREFIX_OPCODE },
8348 },
5d79adc4
L
8349 {
8350 /* MOD_0F38F8_PREFIX_1 */
8351 { "enqcmds", { Gva, M }, PREFIX_OPCODE },
8352 },
c0a30a9f
L
8353 {
8354 /* MOD_0F38F8_PREFIX_2 */
8355 { "movdir64b", { Gva, M }, PREFIX_OPCODE },
8356 },
5d79adc4
L
8357 {
8358 /* MOD_0F38F8_PREFIX_3 */
8359 { "enqcmd", { Gva, M }, PREFIX_OPCODE },
8360 },
c0a30a9f
L
8361 {
8362 /* MOD_0F38F9_PREFIX_0 */
77ad8092 8363 { "movdiri", { Ev, Gv }, PREFIX_OPCODE },
c0a30a9f 8364 },
c0f3af97
L
8365 {
8366 /* MOD_62_32BIT */
bf890a93 8367 { "bound{S|}", { Gv, Ma }, 0 },
43234a1e 8368 { EVEX_TABLE (EVEX_0F) },
c0f3af97
L
8369 },
8370 {
8371 /* MOD_C4_32BIT */
bf890a93 8372 { "lesS", { Gv, Mp }, 0 },
c0f3af97
L
8373 { VEX_C4_TABLE (VEX_0F) },
8374 },
8375 {
8376 /* MOD_C5_32BIT */
bf890a93 8377 { "ldsS", { Gv, Mp }, 0 },
c0f3af97
L
8378 { VEX_C5_TABLE (VEX_0F) },
8379 },
8380 {
592a252b
L
8381 /* MOD_VEX_0F12_PREFIX_0 */
8382 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_0) },
8383 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_1) },
c0f3af97 8384 },
18897deb
JB
8385 {
8386 /* MOD_VEX_0F12_PREFIX_2 */
8387 { VEX_LEN_TABLE (VEX_LEN_0F12_P_2_M_0) },
8388 },
c0f3af97 8389 {
592a252b
L
8390 /* MOD_VEX_0F13 */
8391 { VEX_LEN_TABLE (VEX_LEN_0F13_M_0) },
c0f3af97
L
8392 },
8393 {
592a252b
L
8394 /* MOD_VEX_0F16_PREFIX_0 */
8395 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_0) },
8396 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_1) },
c0f3af97 8397 },
18897deb
JB
8398 {
8399 /* MOD_VEX_0F16_PREFIX_2 */
8400 { VEX_LEN_TABLE (VEX_LEN_0F16_P_2_M_0) },
8401 },
c0f3af97 8402 {
592a252b
L
8403 /* MOD_VEX_0F17 */
8404 { VEX_LEN_TABLE (VEX_LEN_0F17_M_0) },
c0f3af97
L
8405 },
8406 {
592a252b 8407 /* MOD_VEX_0F2B */
bf926894 8408 { "vmovntpX", { Mx, XM }, PREFIX_OPCODE },
c0f3af97 8409 },
ab4e4ed5
AF
8410 {
8411 /* MOD_VEX_W_0_0F41_P_0_LEN_1 */
8412 { Bad_Opcode },
8413 { "kandw", { MaskG, MaskVex, MaskR }, 0 },
8414 },
8415 {
8416 /* MOD_VEX_W_1_0F41_P_0_LEN_1 */
8417 { Bad_Opcode },
8418 { "kandq", { MaskG, MaskVex, MaskR }, 0 },
8419 },
8420 {
8421 /* MOD_VEX_W_0_0F41_P_2_LEN_1 */
8422 { Bad_Opcode },
8423 { "kandb", { MaskG, MaskVex, MaskR }, 0 },
8424 },
8425 {
8426 /* MOD_VEX_W_1_0F41_P_2_LEN_1 */
8427 { Bad_Opcode },
8428 { "kandd", { MaskG, MaskVex, MaskR }, 0 },
8429 },
8430 {
8431 /* MOD_VEX_W_0_0F42_P_0_LEN_1 */
8432 { Bad_Opcode },
8433 { "kandnw", { MaskG, MaskVex, MaskR }, 0 },
8434 },
8435 {
8436 /* MOD_VEX_W_1_0F42_P_0_LEN_1 */
8437 { Bad_Opcode },
8438 { "kandnq", { MaskG, MaskVex, MaskR }, 0 },
8439 },
8440 {
8441 /* MOD_VEX_W_0_0F42_P_2_LEN_1 */
8442 { Bad_Opcode },
8443 { "kandnb", { MaskG, MaskVex, MaskR }, 0 },
8444 },
8445 {
8446 /* MOD_VEX_W_1_0F42_P_2_LEN_1 */
8447 { Bad_Opcode },
8448 { "kandnd", { MaskG, MaskVex, MaskR }, 0 },
8449 },
8450 {
8451 /* MOD_VEX_W_0_0F44_P_0_LEN_0 */
8452 { Bad_Opcode },
8453 { "knotw", { MaskG, MaskR }, 0 },
8454 },
8455 {
8456 /* MOD_VEX_W_1_0F44_P_0_LEN_0 */
8457 { Bad_Opcode },
8458 { "knotq", { MaskG, MaskR }, 0 },
8459 },
8460 {
8461 /* MOD_VEX_W_0_0F44_P_2_LEN_0 */
8462 { Bad_Opcode },
8463 { "knotb", { MaskG, MaskR }, 0 },
8464 },
8465 {
8466 /* MOD_VEX_W_1_0F44_P_2_LEN_0 */
8467 { Bad_Opcode },
8468 { "knotd", { MaskG, MaskR }, 0 },
8469 },
8470 {
8471 /* MOD_VEX_W_0_0F45_P_0_LEN_1 */
8472 { Bad_Opcode },
8473 { "korw", { MaskG, MaskVex, MaskR }, 0 },
8474 },
8475 {
8476 /* MOD_VEX_W_1_0F45_P_0_LEN_1 */
8477 { Bad_Opcode },
8478 { "korq", { MaskG, MaskVex, MaskR }, 0 },
8479 },
8480 {
8481 /* MOD_VEX_W_0_0F45_P_2_LEN_1 */
8482 { Bad_Opcode },
8483 { "korb", { MaskG, MaskVex, MaskR }, 0 },
8484 },
8485 {
8486 /* MOD_VEX_W_1_0F45_P_2_LEN_1 */
8487 { Bad_Opcode },
8488 { "kord", { MaskG, MaskVex, MaskR }, 0 },
8489 },
8490 {
8491 /* MOD_VEX_W_0_0F46_P_0_LEN_1 */
8492 { Bad_Opcode },
8493 { "kxnorw", { MaskG, MaskVex, MaskR }, 0 },
8494 },
8495 {
8496 /* MOD_VEX_W_1_0F46_P_0_LEN_1 */
8497 { Bad_Opcode },
8498 { "kxnorq", { MaskG, MaskVex, MaskR }, 0 },
8499 },
8500 {
8501 /* MOD_VEX_W_0_0F46_P_2_LEN_1 */
8502 { Bad_Opcode },
8503 { "kxnorb", { MaskG, MaskVex, MaskR }, 0 },
8504 },
8505 {
8506 /* MOD_VEX_W_1_0F46_P_2_LEN_1 */
8507 { Bad_Opcode },
8508 { "kxnord", { MaskG, MaskVex, MaskR }, 0 },
8509 },
8510 {
8511 /* MOD_VEX_W_0_0F47_P_0_LEN_1 */
8512 { Bad_Opcode },
8513 { "kxorw", { MaskG, MaskVex, MaskR }, 0 },
8514 },
8515 {
8516 /* MOD_VEX_W_1_0F47_P_0_LEN_1 */
8517 { Bad_Opcode },
8518 { "kxorq", { MaskG, MaskVex, MaskR }, 0 },
8519 },
8520 {
8521 /* MOD_VEX_W_0_0F47_P_2_LEN_1 */
8522 { Bad_Opcode },
8523 { "kxorb", { MaskG, MaskVex, MaskR }, 0 },
8524 },
8525 {
8526 /* MOD_VEX_W_1_0F47_P_2_LEN_1 */
8527 { Bad_Opcode },
8528 { "kxord", { MaskG, MaskVex, MaskR }, 0 },
8529 },
8530 {
8531 /* MOD_VEX_W_0_0F4A_P_0_LEN_1 */
8532 { Bad_Opcode },
8533 { "kaddw", { MaskG, MaskVex, MaskR }, 0 },
8534 },
8535 {
8536 /* MOD_VEX_W_1_0F4A_P_0_LEN_1 */
8537 { Bad_Opcode },
8538 { "kaddq", { MaskG, MaskVex, MaskR }, 0 },
8539 },
8540 {
8541 /* MOD_VEX_W_0_0F4A_P_2_LEN_1 */
8542 { Bad_Opcode },
8543 { "kaddb", { MaskG, MaskVex, MaskR }, 0 },
8544 },
8545 {
8546 /* MOD_VEX_W_1_0F4A_P_2_LEN_1 */
8547 { Bad_Opcode },
8548 { "kaddd", { MaskG, MaskVex, MaskR }, 0 },
8549 },
8550 {
8551 /* MOD_VEX_W_0_0F4B_P_0_LEN_1 */
8552 { Bad_Opcode },
8553 { "kunpckwd", { MaskG, MaskVex, MaskR }, 0 },
8554 },
8555 {
8556 /* MOD_VEX_W_1_0F4B_P_0_LEN_1 */
8557 { Bad_Opcode },
8558 { "kunpckdq", { MaskG, MaskVex, MaskR }, 0 },
8559 },
8560 {
8561 /* MOD_VEX_W_0_0F4B_P_2_LEN_1 */
8562 { Bad_Opcode },
8563 { "kunpckbw", { MaskG, MaskVex, MaskR }, 0 },
8564 },
c0f3af97 8565 {
592a252b 8566 /* MOD_VEX_0F50 */
592d1631 8567 { Bad_Opcode },
bf926894 8568 { "vmovmskpX", { Gdq, XS }, PREFIX_OPCODE },
c0f3af97
L
8569 },
8570 {
592a252b 8571 /* MOD_VEX_0F71_REG_2 */
592d1631 8572 { Bad_Opcode },
7531c613 8573 { "vpsrlw", { Vex, XS, Ib }, PREFIX_DATA },
b844680a
L
8574 },
8575 {
592a252b 8576 /* MOD_VEX_0F71_REG_4 */
592d1631 8577 { Bad_Opcode },
7531c613 8578 { "vpsraw", { Vex, XS, Ib }, PREFIX_DATA },
b844680a
L
8579 },
8580 {
592a252b 8581 /* MOD_VEX_0F71_REG_6 */
592d1631 8582 { Bad_Opcode },
7531c613 8583 { "vpsllw", { Vex, XS, Ib }, PREFIX_DATA },
b844680a
L
8584 },
8585 {
592a252b 8586 /* MOD_VEX_0F72_REG_2 */
592d1631 8587 { Bad_Opcode },
7531c613 8588 { "vpsrld", { Vex, XS, Ib }, PREFIX_DATA },
b844680a 8589 },
d8faab4e 8590 {
592a252b 8591 /* MOD_VEX_0F72_REG_4 */
592d1631 8592 { Bad_Opcode },
7531c613 8593 { "vpsrad", { Vex, XS, Ib }, PREFIX_DATA },
d8faab4e
L
8594 },
8595 {
592a252b 8596 /* MOD_VEX_0F72_REG_6 */
592d1631 8597 { Bad_Opcode },
7531c613 8598 { "vpslld", { Vex, XS, Ib }, PREFIX_DATA },
d8faab4e 8599 },
876d4bfa 8600 {
592a252b 8601 /* MOD_VEX_0F73_REG_2 */
592d1631 8602 { Bad_Opcode },
7531c613 8603 { "vpsrlq", { Vex, XS, Ib }, PREFIX_DATA },
876d4bfa
L
8604 },
8605 {
592a252b 8606 /* MOD_VEX_0F73_REG_3 */
592d1631 8607 { Bad_Opcode },
7531c613 8608 { "vpsrldq", { Vex, XS, Ib }, PREFIX_DATA },
475a2301
L
8609 },
8610 {
592a252b 8611 /* MOD_VEX_0F73_REG_6 */
592d1631 8612 { Bad_Opcode },
7531c613 8613 { "vpsllq", { Vex, XS, Ib }, PREFIX_DATA },
876d4bfa
L
8614 },
8615 {
592a252b 8616 /* MOD_VEX_0F73_REG_7 */
592d1631 8617 { Bad_Opcode },
7531c613 8618 { "vpslldq", { Vex, XS, Ib }, PREFIX_DATA },
876d4bfa 8619 },
ab4e4ed5
AF
8620 {
8621 /* MOD_VEX_W_0_0F91_P_0_LEN_0 */
8622 { "kmovw", { Ew, MaskG }, 0 },
8623 { Bad_Opcode },
8624 },
8625 {
8626 /* MOD_VEX_W_0_0F91_P_0_LEN_0 */
8627 { "kmovq", { Eq, MaskG }, 0 },
8628 { Bad_Opcode },
8629 },
8630 {
8631 /* MOD_VEX_W_0_0F91_P_2_LEN_0 */
8632 { "kmovb", { Eb, MaskG }, 0 },
8633 { Bad_Opcode },
8634 },
8635 {
8636 /* MOD_VEX_W_0_0F91_P_2_LEN_0 */
8637 { "kmovd", { Ed, MaskG }, 0 },
8638 { Bad_Opcode },
8639 },
8640 {
8641 /* MOD_VEX_W_0_0F92_P_0_LEN_0 */
8642 { Bad_Opcode },
8643 { "kmovw", { MaskG, Rdq }, 0 },
8644 },
8645 {
8646 /* MOD_VEX_W_0_0F92_P_2_LEN_0 */
8647 { Bad_Opcode },
8648 { "kmovb", { MaskG, Rdq }, 0 },
8649 },
8650 {
58a211d2 8651 /* MOD_VEX_0F92_P_3_LEN_0 */
ab4e4ed5 8652 { Bad_Opcode },
58a211d2 8653 { "kmovK", { MaskG, Rdq }, 0 },
ab4e4ed5
AF
8654 },
8655 {
8656 /* MOD_VEX_W_0_0F93_P_0_LEN_0 */
8657 { Bad_Opcode },
8658 { "kmovw", { Gdq, MaskR }, 0 },
8659 },
8660 {
8661 /* MOD_VEX_W_0_0F93_P_2_LEN_0 */
8662 { Bad_Opcode },
8663 { "kmovb", { Gdq, MaskR }, 0 },
8664 },
8665 {
58a211d2 8666 /* MOD_VEX_0F93_P_3_LEN_0 */
ab4e4ed5 8667 { Bad_Opcode },
58a211d2 8668 { "kmovK", { Gdq, MaskR }, 0 },
ab4e4ed5
AF
8669 },
8670 {
8671 /* MOD_VEX_W_0_0F98_P_0_LEN_0 */
8672 { Bad_Opcode },
8673 { "kortestw", { MaskG, MaskR }, 0 },
8674 },
8675 {
8676 /* MOD_VEX_W_1_0F98_P_0_LEN_0 */
8677 { Bad_Opcode },
8678 { "kortestq", { MaskG, MaskR }, 0 },
8679 },
8680 {
8681 /* MOD_VEX_W_0_0F98_P_2_LEN_0 */
8682 { Bad_Opcode },
8683 { "kortestb", { MaskG, MaskR }, 0 },
8684 },
8685 {
8686 /* MOD_VEX_W_1_0F98_P_2_LEN_0 */
8687 { Bad_Opcode },
8688 { "kortestd", { MaskG, MaskR }, 0 },
8689 },
8690 {
8691 /* MOD_VEX_W_0_0F99_P_0_LEN_0 */
8692 { Bad_Opcode },
8693 { "ktestw", { MaskG, MaskR }, 0 },
8694 },
8695 {
8696 /* MOD_VEX_W_1_0F99_P_0_LEN_0 */
8697 { Bad_Opcode },
8698 { "ktestq", { MaskG, MaskR }, 0 },
8699 },
8700 {
8701 /* MOD_VEX_W_0_0F99_P_2_LEN_0 */
8702 { Bad_Opcode },
8703 { "ktestb", { MaskG, MaskR }, 0 },
8704 },
8705 {
8706 /* MOD_VEX_W_1_0F99_P_2_LEN_0 */
8707 { Bad_Opcode },
8708 { "ktestd", { MaskG, MaskR }, 0 },
8709 },
876d4bfa 8710 {
592a252b
L
8711 /* MOD_VEX_0FAE_REG_2 */
8712 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_2_M_0) },
876d4bfa 8713 },
bbedc832 8714 {
592a252b
L
8715 /* MOD_VEX_0FAE_REG_3 */
8716 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_3_M_0) },
bbedc832 8717 },
144c41d9 8718 {
7531c613 8719 /* MOD_VEX_0FD7 */
592d1631 8720 { Bad_Opcode },
7531c613 8721 { "vpmovmskb", { Gdq, XS }, PREFIX_DATA },
144c41d9 8722 },
1afd85e3 8723 {
7531c613
JB
8724 /* MOD_VEX_0FE7 */
8725 { "vmovntdq", { Mx, XM }, PREFIX_DATA },
1afd85e3
L
8726 },
8727 {
592a252b 8728 /* MOD_VEX_0FF0_PREFIX_3 */
ec6f095a 8729 { "vlddqu", { XM, M }, 0 },
92fddf8e 8730 },
75c135a8 8731 {
7531c613
JB
8732 /* MOD_VEX_0F381A */
8733 { VEX_LEN_TABLE (VEX_LEN_0F381A_M_0) },
75c135a8 8734 },
1afd85e3 8735 {
7531c613
JB
8736 /* MOD_VEX_0F382A */
8737 { "vmovntdqa", { XM, Mx }, PREFIX_DATA },
1afd85e3 8738 },
75c135a8 8739 {
7531c613
JB
8740 /* MOD_VEX_0F382C */
8741 { VEX_W_TABLE (VEX_W_0F382C_M_0) },
75c135a8 8742 },
1afd85e3 8743 {
7531c613
JB
8744 /* MOD_VEX_0F382D */
8745 { VEX_W_TABLE (VEX_W_0F382D_M_0) },
1afd85e3
L
8746 },
8747 {
7531c613
JB
8748 /* MOD_VEX_0F382E */
8749 { VEX_W_TABLE (VEX_W_0F382E_M_0) },
1afd85e3
L
8750 },
8751 {
7531c613
JB
8752 /* MOD_VEX_0F382F */
8753 { VEX_W_TABLE (VEX_W_0F382F_M_0) },
1afd85e3 8754 },
6c30d220 8755 {
7531c613
JB
8756 /* MOD_VEX_0F385A */
8757 { VEX_LEN_TABLE (VEX_LEN_0F385A_M_0) },
6c30d220
L
8758 },
8759 {
7531c613
JB
8760 /* MOD_VEX_0F388C */
8761 { "vpmaskmov%DQ", { XM, Vex, Mx }, PREFIX_DATA },
6c30d220
L
8762 },
8763 {
7531c613
JB
8764 /* MOD_VEX_0F388E */
8765 { "vpmaskmov%DQ", { Mx, Vex, XM }, PREFIX_DATA },
6c30d220 8766 },
ab4e4ed5 8767 {
7531c613 8768 /* MOD_VEX_0F3A30_L_0_W_0 */
ab4e4ed5 8769 { Bad_Opcode },
7531c613 8770 { "kshiftrb", { MaskG, MaskR, Ib }, PREFIX_DATA },
ab4e4ed5
AF
8771 },
8772 {
7531c613 8773 /* MOD_VEX_0F3A30_L_0_W_1 */
ab4e4ed5 8774 { Bad_Opcode },
7531c613 8775 { "kshiftrw", { MaskG, MaskR, Ib }, PREFIX_DATA },
ab4e4ed5
AF
8776 },
8777 {
7531c613 8778 /* MOD_VEX_0F3A31_L_0_W_0 */
ab4e4ed5 8779 { Bad_Opcode },
7531c613 8780 { "kshiftrd", { MaskG, MaskR, Ib }, PREFIX_DATA },
ab4e4ed5
AF
8781 },
8782 {
7531c613 8783 /* MOD_VEX_0F3A31_L_0_W_1 */
ab4e4ed5 8784 { Bad_Opcode },
7531c613 8785 { "kshiftrq", { MaskG, MaskR, Ib }, PREFIX_DATA },
ab4e4ed5
AF
8786 },
8787 {
7531c613 8788 /* MOD_VEX_0F3A32_L_0_W_0 */
ab4e4ed5 8789 { Bad_Opcode },
7531c613 8790 { "kshiftlb", { MaskG, MaskR, Ib }, PREFIX_DATA },
ab4e4ed5
AF
8791 },
8792 {
7531c613 8793 /* MOD_VEX_0F3A32_L_0_W_1 */
ab4e4ed5 8794 { Bad_Opcode },
7531c613 8795 { "kshiftlw", { MaskG, MaskR, Ib }, PREFIX_DATA },
ab4e4ed5
AF
8796 },
8797 {
7531c613 8798 /* MOD_VEX_0F3A33_L_0_W_0 */
ab4e4ed5 8799 { Bad_Opcode },
7531c613 8800 { "kshiftld", { MaskG, MaskR, Ib }, PREFIX_DATA },
ab4e4ed5
AF
8801 },
8802 {
7531c613 8803 /* MOD_VEX_0F3A33_L_0_W_1 */
ab4e4ed5 8804 { Bad_Opcode },
7531c613 8805 { "kshiftlq", { MaskG, MaskR, Ib }, PREFIX_DATA },
ab4e4ed5 8806 },
467bbef0
JB
8807 {
8808 /* MOD_VEX_0FXOP_09_12 */
8809 { Bad_Opcode },
8810 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_12_M_1) },
8811 },
ad692897
L
8812
8813#include "i386-dis-evex-mod.h"
b844680a
L
8814};
8815
1ceb70f8 8816static const struct dis386 rm_table[][8] = {
42164a71
L
8817 {
8818 /* RM_C6_REG_7 */
bf890a93 8819 { "xabort", { Skip_MODRM, Ib }, 0 },
42164a71
L
8820 },
8821 {
8822 /* RM_C7_REG_7 */
376cd056 8823 { "xbeginT", { Skip_MODRM, Jdqw }, 0 },
42164a71 8824 },
b844680a 8825 {
1ceb70f8 8826 /* RM_0F01_REG_0 */
a4e78aa5 8827 { "enclv", { Skip_MODRM }, 0 },
bf890a93
IT
8828 { "vmcall", { Skip_MODRM }, 0 },
8829 { "vmlaunch", { Skip_MODRM }, 0 },
8830 { "vmresume", { Skip_MODRM }, 0 },
8831 { "vmxoff", { Skip_MODRM }, 0 },
be3a8dca 8832 { "pconfig", { Skip_MODRM }, 0 },
b844680a
L
8833 },
8834 {
1ceb70f8 8835 /* RM_0F01_REG_1 */
bf890a93
IT
8836 { "monitor", { { OP_Monitor, 0 } }, 0 },
8837 { "mwait", { { OP_Mwait, 0 } }, 0 },
8838 { "clac", { Skip_MODRM }, 0 },
8839 { "stac", { Skip_MODRM }, 0 },
2cf200a4
IT
8840 { Bad_Opcode },
8841 { Bad_Opcode },
8842 { Bad_Opcode },
bf890a93 8843 { "encls", { Skip_MODRM }, 0 },
b844680a 8844 },
475a2301
L
8845 {
8846 /* RM_0F01_REG_2 */
bf890a93
IT
8847 { "xgetbv", { Skip_MODRM }, 0 },
8848 { "xsetbv", { Skip_MODRM }, 0 },
8729a6f6
L
8849 { Bad_Opcode },
8850 { Bad_Opcode },
bf890a93
IT
8851 { "vmfunc", { Skip_MODRM }, 0 },
8852 { "xend", { Skip_MODRM }, 0 },
8853 { "xtest", { Skip_MODRM }, 0 },
8854 { "enclu", { Skip_MODRM }, 0 },
475a2301 8855 },
b844680a 8856 {
1ceb70f8 8857 /* RM_0F01_REG_3 */
bf890a93 8858 { "vmrun", { Skip_MODRM }, 0 },
a847e322 8859 { PREFIX_TABLE (PREFIX_0F01_REG_3_RM_1) },
bf890a93
IT
8860 { "vmload", { Skip_MODRM }, 0 },
8861 { "vmsave", { Skip_MODRM }, 0 },
8862 { "stgi", { Skip_MODRM }, 0 },
8863 { "clgi", { Skip_MODRM }, 0 },
8864 { "skinit", { Skip_MODRM }, 0 },
8865 { "invlpga", { Skip_MODRM }, 0 },
4e7d34a6 8866 },
8eab4136 8867 {
f8687e93
JB
8868 /* RM_0F01_REG_5_MOD_3 */
8869 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_0) },
bb651e8b 8870 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_1) },
f8687e93 8871 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_2) },
8eab4136
L
8872 { Bad_Opcode },
8873 { Bad_Opcode },
8874 { Bad_Opcode },
8875 { "rdpkru", { Skip_MODRM }, 0 },
8876 { "wrpkru", { Skip_MODRM }, 0 },
8877 },
4e7d34a6 8878 {
f8687e93 8879 /* RM_0F01_REG_7_MOD_3 */
bf890a93
IT
8880 { "swapgs", { Skip_MODRM }, 0 },
8881 { "rdtscp", { Skip_MODRM }, 0 },
267b8516
JB
8882 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_2) },
8883 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_3) },
bf890a93 8884 { "clzero", { Skip_MODRM }, 0 },
142861df 8885 { "rdpru", { Skip_MODRM }, 0 },
b844680a 8886 },
603555e5 8887 {
f8687e93 8888 /* RM_0F1E_P_1_MOD_3_REG_7 */
603555e5
L
8889 { "nopQ", { Ev }, 0 },
8890 { "nopQ", { Ev }, 0 },
8891 { "endbr64", { Skip_MODRM }, PREFIX_OPCODE },
8892 { "endbr32", { Skip_MODRM }, PREFIX_OPCODE },
8893 { "nopQ", { Ev }, 0 },
8894 { "nopQ", { Ev }, 0 },
8895 { "nopQ", { Ev }, 0 },
8896 { "nopQ", { Ev }, 0 },
8897 },
b844680a 8898 {
f8687e93 8899 /* RM_0FAE_REG_6_MOD_3 */
bf890a93 8900 { "mfence", { Skip_MODRM }, 0 },
b844680a 8901 },
bbedc832 8902 {
f8687e93 8903 /* RM_0FAE_REG_7_MOD_3 */
b5cefcca
L
8904 { "sfence", { Skip_MODRM }, 0 },
8905
144c41d9 8906 },
260cd341
LC
8907 {
8908 /* RM_VEX_0F3849_X86_64_P_0_W_0_M_1_R_0 */
8909 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_0_W_0_M_1_REG_0_RM_0) },
8910 },
b844680a
L
8911};
8912
c608c12e
AM
8913#define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
8914
f16cd0d5
L
8915/* We use the high bit to indicate different name for the same
8916 prefix. */
f16cd0d5 8917#define REP_PREFIX (0xf3 | 0x100)
42164a71
L
8918#define XACQUIRE_PREFIX (0xf2 | 0x200)
8919#define XRELEASE_PREFIX (0xf3 | 0x400)
7e8b059b 8920#define BND_PREFIX (0xf2 | 0x400)
04ef582a 8921#define NOTRACK_PREFIX (0x3e | 0x100)
f16cd0d5 8922
1d67fe3b
TT
8923/* Remember if the current op is a jump instruction. */
8924static bfd_boolean op_is_jump = FALSE;
8925
f16cd0d5 8926static int
26ca5450 8927ckprefix (void)
252b5132 8928{
f16cd0d5 8929 int newrex, i, length;
52b15da3 8930 rex = 0;
252b5132 8931 prefixes = 0;
7d421014 8932 used_prefixes = 0;
52b15da3 8933 rex_used = 0;
f16cd0d5
L
8934 last_lock_prefix = -1;
8935 last_repz_prefix = -1;
8936 last_repnz_prefix = -1;
8937 last_data_prefix = -1;
8938 last_addr_prefix = -1;
8939 last_rex_prefix = -1;
8940 last_seg_prefix = -1;
d9949a36 8941 fwait_prefix = -1;
285ca992 8942 active_seg_prefix = 0;
f310f33d
L
8943 for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
8944 all_prefixes[i] = 0;
8945 i = 0;
f16cd0d5
L
8946 length = 0;
8947 /* The maximum instruction length is 15bytes. */
8948 while (length < MAX_CODE_LENGTH - 1)
252b5132
RH
8949 {
8950 FETCH_DATA (the_info, codep + 1);
52b15da3 8951 newrex = 0;
252b5132
RH
8952 switch (*codep)
8953 {
52b15da3
JH
8954 /* REX prefixes family. */
8955 case 0x40:
8956 case 0x41:
8957 case 0x42:
8958 case 0x43:
8959 case 0x44:
8960 case 0x45:
8961 case 0x46:
8962 case 0x47:
8963 case 0x48:
8964 case 0x49:
8965 case 0x4a:
8966 case 0x4b:
8967 case 0x4c:
8968 case 0x4d:
8969 case 0x4e:
8970 case 0x4f:
f16cd0d5
L
8971 if (address_mode == mode_64bit)
8972 newrex = *codep;
8973 else
8974 return 1;
8975 last_rex_prefix = i;
52b15da3 8976 break;
252b5132
RH
8977 case 0xf3:
8978 prefixes |= PREFIX_REPZ;
f16cd0d5 8979 last_repz_prefix = i;
252b5132
RH
8980 break;
8981 case 0xf2:
8982 prefixes |= PREFIX_REPNZ;
f16cd0d5 8983 last_repnz_prefix = i;
252b5132
RH
8984 break;
8985 case 0xf0:
8986 prefixes |= PREFIX_LOCK;
f16cd0d5 8987 last_lock_prefix = i;
252b5132
RH
8988 break;
8989 case 0x2e:
8990 prefixes |= PREFIX_CS;
f16cd0d5 8991 last_seg_prefix = i;
285ca992 8992 active_seg_prefix = PREFIX_CS;
252b5132
RH
8993 break;
8994 case 0x36:
8995 prefixes |= PREFIX_SS;
f16cd0d5 8996 last_seg_prefix = i;
285ca992 8997 active_seg_prefix = PREFIX_SS;
252b5132
RH
8998 break;
8999 case 0x3e:
9000 prefixes |= PREFIX_DS;
f16cd0d5 9001 last_seg_prefix = i;
285ca992 9002 active_seg_prefix = PREFIX_DS;
252b5132
RH
9003 break;
9004 case 0x26:
9005 prefixes |= PREFIX_ES;
f16cd0d5 9006 last_seg_prefix = i;
285ca992 9007 active_seg_prefix = PREFIX_ES;
252b5132
RH
9008 break;
9009 case 0x64:
9010 prefixes |= PREFIX_FS;
f16cd0d5 9011 last_seg_prefix = i;
285ca992 9012 active_seg_prefix = PREFIX_FS;
252b5132
RH
9013 break;
9014 case 0x65:
9015 prefixes |= PREFIX_GS;
f16cd0d5 9016 last_seg_prefix = i;
285ca992 9017 active_seg_prefix = PREFIX_GS;
252b5132
RH
9018 break;
9019 case 0x66:
9020 prefixes |= PREFIX_DATA;
f16cd0d5 9021 last_data_prefix = i;
252b5132
RH
9022 break;
9023 case 0x67:
9024 prefixes |= PREFIX_ADDR;
f16cd0d5 9025 last_addr_prefix = i;
252b5132 9026 break;
5076851f 9027 case FWAIT_OPCODE:
252b5132
RH
9028 /* fwait is really an instruction. If there are prefixes
9029 before the fwait, they belong to the fwait, *not* to the
9030 following instruction. */
d9949a36 9031 fwait_prefix = i;
3e7d61b2 9032 if (prefixes || rex)
252b5132
RH
9033 {
9034 prefixes |= PREFIX_FWAIT;
9035 codep++;
6c067bbb
RM
9036 /* This ensures that the previous REX prefixes are noticed
9037 as unused prefixes, as in the return case below. */
9038 rex_used = rex;
f16cd0d5 9039 return 1;
252b5132
RH
9040 }
9041 prefixes = PREFIX_FWAIT;
9042 break;
9043 default:
f16cd0d5 9044 return 1;
252b5132 9045 }
52b15da3
JH
9046 /* Rex is ignored when followed by another prefix. */
9047 if (rex)
9048 {
3e7d61b2 9049 rex_used = rex;
f16cd0d5 9050 return 1;
52b15da3 9051 }
f16cd0d5 9052 if (*codep != FWAIT_OPCODE)
4e9ac44a 9053 all_prefixes[i++] = *codep;
52b15da3 9054 rex = newrex;
252b5132 9055 codep++;
f16cd0d5
L
9056 length++;
9057 }
9058 return 0;
9059}
9060
7d421014
ILT
9061/* Return the name of the prefix byte PREF, or NULL if PREF is not a
9062 prefix byte. */
9063
9064static const char *
26ca5450 9065prefix_name (int pref, int sizeflag)
7d421014 9066{
0003779b
L
9067 static const char *rexes [16] =
9068 {
9069 "rex", /* 0x40 */
9070 "rex.B", /* 0x41 */
9071 "rex.X", /* 0x42 */
9072 "rex.XB", /* 0x43 */
9073 "rex.R", /* 0x44 */
9074 "rex.RB", /* 0x45 */
9075 "rex.RX", /* 0x46 */
9076 "rex.RXB", /* 0x47 */
9077 "rex.W", /* 0x48 */
9078 "rex.WB", /* 0x49 */
9079 "rex.WX", /* 0x4a */
9080 "rex.WXB", /* 0x4b */
9081 "rex.WR", /* 0x4c */
9082 "rex.WRB", /* 0x4d */
9083 "rex.WRX", /* 0x4e */
9084 "rex.WRXB", /* 0x4f */
9085 };
9086
7d421014
ILT
9087 switch (pref)
9088 {
52b15da3
JH
9089 /* REX prefixes family. */
9090 case 0x40:
52b15da3 9091 case 0x41:
52b15da3 9092 case 0x42:
52b15da3 9093 case 0x43:
52b15da3 9094 case 0x44:
52b15da3 9095 case 0x45:
52b15da3 9096 case 0x46:
52b15da3 9097 case 0x47:
52b15da3 9098 case 0x48:
52b15da3 9099 case 0x49:
52b15da3 9100 case 0x4a:
52b15da3 9101 case 0x4b:
52b15da3 9102 case 0x4c:
52b15da3 9103 case 0x4d:
52b15da3 9104 case 0x4e:
52b15da3 9105 case 0x4f:
0003779b 9106 return rexes [pref - 0x40];
7d421014
ILT
9107 case 0xf3:
9108 return "repz";
9109 case 0xf2:
9110 return "repnz";
9111 case 0xf0:
9112 return "lock";
9113 case 0x2e:
9114 return "cs";
9115 case 0x36:
9116 return "ss";
9117 case 0x3e:
9118 return "ds";
9119 case 0x26:
9120 return "es";
9121 case 0x64:
9122 return "fs";
9123 case 0x65:
9124 return "gs";
9125 case 0x66:
9126 return (sizeflag & DFLAG) ? "data16" : "data32";
9127 case 0x67:
cb712a9e 9128 if (address_mode == mode_64bit)
db6eb5be 9129 return (sizeflag & AFLAG) ? "addr32" : "addr64";
c1a64871 9130 else
2888cb7a 9131 return (sizeflag & AFLAG) ? "addr16" : "addr32";
7d421014
ILT
9132 case FWAIT_OPCODE:
9133 return "fwait";
f16cd0d5
L
9134 case REP_PREFIX:
9135 return "rep";
42164a71
L
9136 case XACQUIRE_PREFIX:
9137 return "xacquire";
9138 case XRELEASE_PREFIX:
9139 return "xrelease";
7e8b059b
L
9140 case BND_PREFIX:
9141 return "bnd";
04ef582a
L
9142 case NOTRACK_PREFIX:
9143 return "notrack";
7d421014
ILT
9144 default:
9145 return NULL;
9146 }
9147}
9148
ce518a5f
L
9149static char op_out[MAX_OPERANDS][100];
9150static int op_ad, op_index[MAX_OPERANDS];
1d9f512f 9151static int two_source_ops;
ce518a5f
L
9152static bfd_vma op_address[MAX_OPERANDS];
9153static bfd_vma op_riprel[MAX_OPERANDS];
52b15da3 9154static bfd_vma start_pc;
ce518a5f 9155
252b5132
RH
9156/*
9157 * On the 386's of 1988, the maximum length of an instruction is 15 bytes.
9158 * (see topic "Redundant prefixes" in the "Differences from 8086"
9159 * section of the "Virtual 8086 Mode" chapter.)
9160 * 'pc' should be the address of this instruction, it will
9161 * be used to print the target address if this is a relative jump or call
9162 * The function returns the length of this instruction in bytes.
9163 */
9164
252b5132 9165static char intel_syntax;
9d141669 9166static char intel_mnemonic = !SYSV386_COMPAT;
252b5132
RH
9167static char open_char;
9168static char close_char;
9169static char separator_char;
9170static char scale_char;
9171
5db04b09
L
9172enum x86_64_isa
9173{
d835a58b 9174 amd64 = 1,
5db04b09
L
9175 intel64
9176};
9177
9178static enum x86_64_isa isa64;
9179
e396998b
AM
9180/* Here for backwards compatibility. When gdb stops using
9181 print_insn_i386_att and print_insn_i386_intel these functions can
9182 disappear, and print_insn_i386 be merged into print_insn. */
252b5132 9183int
26ca5450 9184print_insn_i386_att (bfd_vma pc, disassemble_info *info)
252b5132
RH
9185{
9186 intel_syntax = 0;
e396998b
AM
9187
9188 return print_insn (pc, info);
252b5132
RH
9189}
9190
9191int
26ca5450 9192print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
252b5132
RH
9193{
9194 intel_syntax = 1;
e396998b
AM
9195
9196 return print_insn (pc, info);
252b5132
RH
9197}
9198
e396998b 9199int
26ca5450 9200print_insn_i386 (bfd_vma pc, disassemble_info *info)
e396998b
AM
9201{
9202 intel_syntax = -1;
9203
9204 return print_insn (pc, info);
9205}
9206
f59a29b9
L
9207void
9208print_i386_disassembler_options (FILE *stream)
9209{
9210 fprintf (stream, _("\n\
9211The following i386/x86-64 specific disassembler options are supported for use\n\
9212with the -M switch (multiple options should be separated by commas):\n"));
9213
9214 fprintf (stream, _(" x86-64 Disassemble in 64bit mode\n"));
9215 fprintf (stream, _(" i386 Disassemble in 32bit mode\n"));
9216 fprintf (stream, _(" i8086 Disassemble in 16bit mode\n"));
9217 fprintf (stream, _(" att Display instruction in AT&T syntax\n"));
9218 fprintf (stream, _(" intel Display instruction in Intel syntax\n"));
9d141669
L
9219 fprintf (stream, _(" att-mnemonic\n"
9220 " Display instruction in AT&T mnemonic\n"));
9221 fprintf (stream, _(" intel-mnemonic\n"
9222 " Display instruction in Intel mnemonic\n"));
f59a29b9
L
9223 fprintf (stream, _(" addr64 Assume 64bit address size\n"));
9224 fprintf (stream, _(" addr32 Assume 32bit address size\n"));
9225 fprintf (stream, _(" addr16 Assume 16bit address size\n"));
9226 fprintf (stream, _(" data32 Assume 32bit data size\n"));
9227 fprintf (stream, _(" data16 Assume 16bit data size\n"));
9228 fprintf (stream, _(" suffix Always display instruction suffix in AT&T syntax\n"));
5db04b09
L
9229 fprintf (stream, _(" amd64 Display instruction in AMD64 ISA\n"));
9230 fprintf (stream, _(" intel64 Display instruction in Intel64 ISA\n"));
f59a29b9
L
9231}
9232
592d1631 9233/* Bad opcode. */
bf890a93 9234static const struct dis386 bad_opcode = { "(bad)", { XX }, 0 };
592d1631 9235
b844680a
L
9236/* Get a pointer to struct dis386 with a valid name. */
9237
9238static const struct dis386 *
8bb15339 9239get_valid_dis386 (const struct dis386 *dp, disassemble_info *info)
b844680a 9240{
91d6fa6a 9241 int vindex, vex_table_index;
b844680a
L
9242
9243 if (dp->name != NULL)
9244 return dp;
9245
9246 switch (dp->op[0].bytemode)
9247 {
1ceb70f8
L
9248 case USE_REG_TABLE:
9249 dp = &reg_table[dp->op[1].bytemode][modrm.reg];
9250 break;
9251
9252 case USE_MOD_TABLE:
91d6fa6a
NC
9253 vindex = modrm.mod == 0x3 ? 1 : 0;
9254 dp = &mod_table[dp->op[1].bytemode][vindex];
1ceb70f8
L
9255 break;
9256
9257 case USE_RM_TABLE:
9258 dp = &rm_table[dp->op[1].bytemode][modrm.rm];
b844680a
L
9259 break;
9260
4e7d34a6 9261 case USE_PREFIX_TABLE:
c0f3af97 9262 if (need_vex)
b844680a 9263 {
c0f3af97
L
9264 /* The prefix in VEX is implicit. */
9265 switch (vex.prefix)
9266 {
9267 case 0:
91d6fa6a 9268 vindex = 0;
c0f3af97
L
9269 break;
9270 case REPE_PREFIX_OPCODE:
91d6fa6a 9271 vindex = 1;
c0f3af97
L
9272 break;
9273 case DATA_PREFIX_OPCODE:
91d6fa6a 9274 vindex = 2;
c0f3af97
L
9275 break;
9276 case REPNE_PREFIX_OPCODE:
91d6fa6a 9277 vindex = 3;
c0f3af97
L
9278 break;
9279 default:
9280 abort ();
9281 break;
9282 }
b844680a 9283 }
7bb15c6f 9284 else
b844680a 9285 {
285ca992
L
9286 int last_prefix = -1;
9287 int prefix = 0;
91d6fa6a 9288 vindex = 0;
285ca992
L
9289 /* We check PREFIX_REPNZ and PREFIX_REPZ before PREFIX_DATA.
9290 When there are multiple PREFIX_REPNZ and PREFIX_REPZ, the
9291 last one wins. */
9292 if ((prefixes & (PREFIX_REPZ | PREFIX_REPNZ)) != 0)
b844680a 9293 {
285ca992 9294 if (last_repz_prefix > last_repnz_prefix)
c0f3af97 9295 {
285ca992
L
9296 vindex = 1;
9297 prefix = PREFIX_REPZ;
9298 last_prefix = last_repz_prefix;
c0f3af97
L
9299 }
9300 else
b844680a 9301 {
285ca992
L
9302 vindex = 3;
9303 prefix = PREFIX_REPNZ;
9304 last_prefix = last_repnz_prefix;
b844680a 9305 }
285ca992 9306
507bd325
L
9307 /* Check if prefix should be ignored. */
9308 if ((((prefix_table[dp->op[1].bytemode][vindex].prefix_requirement
9309 & PREFIX_IGNORED) >> PREFIX_IGNORED_SHIFT)
9310 & prefix) != 0)
285ca992
L
9311 vindex = 0;
9312 }
9313
9314 if (vindex == 0 && (prefixes & PREFIX_DATA) != 0)
9315 {
9316 vindex = 2;
9317 prefix = PREFIX_DATA;
9318 last_prefix = last_data_prefix;
9319 }
9320
9321 if (vindex != 0)
9322 {
9323 used_prefixes |= prefix;
9324 all_prefixes[last_prefix] = 0;
b844680a
L
9325 }
9326 }
91d6fa6a 9327 dp = &prefix_table[dp->op[1].bytemode][vindex];
b844680a
L
9328 break;
9329
4e7d34a6 9330 case USE_X86_64_TABLE:
91d6fa6a
NC
9331 vindex = address_mode == mode_64bit ? 1 : 0;
9332 dp = &x86_64_table[dp->op[1].bytemode][vindex];
b844680a
L
9333 break;
9334
4e7d34a6 9335 case USE_3BYTE_TABLE:
8bb15339 9336 FETCH_DATA (info, codep + 2);
91d6fa6a
NC
9337 vindex = *codep++;
9338 dp = &three_byte_table[dp->op[1].bytemode][vindex];
285ca992 9339 end_codep = codep;
8bb15339
L
9340 modrm.mod = (*codep >> 6) & 3;
9341 modrm.reg = (*codep >> 3) & 7;
9342 modrm.rm = *codep & 7;
9343 break;
9344
c0f3af97
L
9345 case USE_VEX_LEN_TABLE:
9346 if (!need_vex)
9347 abort ();
9348
9349 switch (vex.length)
9350 {
9351 case 128:
91d6fa6a 9352 vindex = 0;
c0f3af97
L
9353 break;
9354 case 256:
91d6fa6a 9355 vindex = 1;
c0f3af97
L
9356 break;
9357 default:
9358 abort ();
9359 break;
9360 }
9361
91d6fa6a 9362 dp = &vex_len_table[dp->op[1].bytemode][vindex];
c0f3af97
L
9363 break;
9364
04e2a182
L
9365 case USE_EVEX_LEN_TABLE:
9366 if (!vex.evex)
9367 abort ();
9368
9369 switch (vex.length)
9370 {
9371 case 128:
9372 vindex = 0;
9373 break;
9374 case 256:
9375 vindex = 1;
9376 break;
9377 case 512:
9378 vindex = 2;
9379 break;
9380 default:
9381 abort ();
9382 break;
9383 }
9384
9385 dp = &evex_len_table[dp->op[1].bytemode][vindex];
9386 break;
9387
f88c9eb0
SP
9388 case USE_XOP_8F_TABLE:
9389 FETCH_DATA (info, codep + 3);
f88c9eb0
SP
9390 rex = ~(*codep >> 5) & 0x7;
9391
9392 /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm". */
9393 switch ((*codep & 0x1f))
9394 {
9395 default:
f07af43e
L
9396 dp = &bad_opcode;
9397 return dp;
5dd85c99
SP
9398 case 0x8:
9399 vex_table_index = XOP_08;
9400 break;
f88c9eb0
SP
9401 case 0x9:
9402 vex_table_index = XOP_09;
9403 break;
9404 case 0xa:
9405 vex_table_index = XOP_0A;
9406 break;
9407 }
9408 codep++;
9409 vex.w = *codep & 0x80;
9410 if (vex.w && address_mode == mode_64bit)
9411 rex |= REX_W;
9412
9413 vex.register_specifier = (~(*codep >> 3)) & 0xf;
abfcb414 9414 if (address_mode != mode_64bit)
f07af43e 9415 {
abfcb414
AP
9416 /* In 16/32-bit mode REX_B is silently ignored. */
9417 rex &= ~REX_B;
f07af43e 9418 }
f88c9eb0
SP
9419
9420 vex.length = (*codep & 0x4) ? 256 : 128;
9421 switch ((*codep & 0x3))
9422 {
9423 case 0:
f88c9eb0
SP
9424 break;
9425 case 1:
9426 vex.prefix = DATA_PREFIX_OPCODE;
9427 break;
9428 case 2:
9429 vex.prefix = REPE_PREFIX_OPCODE;
9430 break;
9431 case 3:
9432 vex.prefix = REPNE_PREFIX_OPCODE;
9433 break;
9434 }
9435 need_vex = 1;
f88c9eb0 9436 codep++;
91d6fa6a
NC
9437 vindex = *codep++;
9438 dp = &xop_table[vex_table_index][vindex];
c48244a5 9439
285ca992 9440 end_codep = codep;
c48244a5
SP
9441 FETCH_DATA (info, codep + 1);
9442 modrm.mod = (*codep >> 6) & 3;
9443 modrm.reg = (*codep >> 3) & 7;
9444 modrm.rm = *codep & 7;
b5b098c2
JB
9445
9446 /* No XOP encoding so far allows for a non-zero embedded prefix. Avoid
9447 having to decode the bits for every otherwise valid encoding. */
9448 if (vex.prefix)
9449 return &bad_opcode;
f88c9eb0
SP
9450 break;
9451
c0f3af97 9452 case USE_VEX_C4_TABLE:
43234a1e 9453 /* VEX prefix. */
c0f3af97 9454 FETCH_DATA (info, codep + 3);
c0f3af97
L
9455 rex = ~(*codep >> 5) & 0x7;
9456 switch ((*codep & 0x1f))
9457 {
9458 default:
f07af43e
L
9459 dp = &bad_opcode;
9460 return dp;
c0f3af97 9461 case 0x1:
f88c9eb0 9462 vex_table_index = VEX_0F;
c0f3af97
L
9463 break;
9464 case 0x2:
f88c9eb0 9465 vex_table_index = VEX_0F38;
c0f3af97
L
9466 break;
9467 case 0x3:
f88c9eb0 9468 vex_table_index = VEX_0F3A;
c0f3af97
L
9469 break;
9470 }
9471 codep++;
9472 vex.w = *codep & 0x80;
9889cbb1 9473 if (address_mode == mode_64bit)
f07af43e 9474 {
9889cbb1
L
9475 if (vex.w)
9476 rex |= REX_W;
9889cbb1
L
9477 }
9478 else
9479 {
9480 /* For the 3-byte VEX prefix in 32-bit mode, the REX_B bit
9481 is ignored, other REX bits are 0 and the highest bit in
5f847646 9482 VEX.vvvv is also ignored (but we mustn't clear it here). */
9889cbb1 9483 rex = 0;
f07af43e 9484 }
5f847646 9485 vex.register_specifier = (~(*codep >> 3)) & 0xf;
c0f3af97
L
9486 vex.length = (*codep & 0x4) ? 256 : 128;
9487 switch ((*codep & 0x3))
9488 {
9489 case 0:
c0f3af97
L
9490 break;
9491 case 1:
9492 vex.prefix = DATA_PREFIX_OPCODE;
9493 break;
9494 case 2:
9495 vex.prefix = REPE_PREFIX_OPCODE;
9496 break;
9497 case 3:
9498 vex.prefix = REPNE_PREFIX_OPCODE;
9499 break;
9500 }
9501 need_vex = 1;
c0f3af97 9502 codep++;
91d6fa6a
NC
9503 vindex = *codep++;
9504 dp = &vex_table[vex_table_index][vindex];
285ca992 9505 end_codep = codep;
53c4d625
JB
9506 /* There is no MODRM byte for VEX0F 77. */
9507 if (vex_table_index != VEX_0F || vindex != 0x77)
c0f3af97
L
9508 {
9509 FETCH_DATA (info, codep + 1);
9510 modrm.mod = (*codep >> 6) & 3;
9511 modrm.reg = (*codep >> 3) & 7;
9512 modrm.rm = *codep & 7;
9513 }
9514 break;
9515
9516 case USE_VEX_C5_TABLE:
43234a1e 9517 /* VEX prefix. */
c0f3af97 9518 FETCH_DATA (info, codep + 2);
c0f3af97
L
9519 rex = (*codep & 0x80) ? 0 : REX_R;
9520
9889cbb1
L
9521 /* For the 2-byte VEX prefix in 32-bit mode, the highest bit in
9522 VEX.vvvv is 1. */
c0f3af97 9523 vex.register_specifier = (~(*codep >> 3)) & 0xf;
c0f3af97
L
9524 vex.length = (*codep & 0x4) ? 256 : 128;
9525 switch ((*codep & 0x3))
9526 {
9527 case 0:
c0f3af97
L
9528 break;
9529 case 1:
9530 vex.prefix = DATA_PREFIX_OPCODE;
9531 break;
9532 case 2:
9533 vex.prefix = REPE_PREFIX_OPCODE;
9534 break;
9535 case 3:
9536 vex.prefix = REPNE_PREFIX_OPCODE;
9537 break;
9538 }
9539 need_vex = 1;
c0f3af97 9540 codep++;
91d6fa6a
NC
9541 vindex = *codep++;
9542 dp = &vex_table[dp->op[1].bytemode][vindex];
285ca992 9543 end_codep = codep;
53c4d625
JB
9544 /* There is no MODRM byte for VEX 77. */
9545 if (vindex != 0x77)
c0f3af97
L
9546 {
9547 FETCH_DATA (info, codep + 1);
9548 modrm.mod = (*codep >> 6) & 3;
9549 modrm.reg = (*codep >> 3) & 7;
9550 modrm.rm = *codep & 7;
9551 }
9552 break;
9553
9e30b8e0
L
9554 case USE_VEX_W_TABLE:
9555 if (!need_vex)
9556 abort ();
9557
9558 dp = &vex_w_table[dp->op[1].bytemode][vex.w ? 1 : 0];
9559 break;
9560
43234a1e
L
9561 case USE_EVEX_TABLE:
9562 two_source_ops = 0;
9563 /* EVEX prefix. */
9564 vex.evex = 1;
9565 FETCH_DATA (info, codep + 4);
43234a1e
L
9566 /* The first byte after 0x62. */
9567 rex = ~(*codep >> 5) & 0x7;
9568 vex.r = *codep & 0x10;
9569 switch ((*codep & 0xf))
9570 {
9571 default:
9572 return &bad_opcode;
9573 case 0x1:
9574 vex_table_index = EVEX_0F;
9575 break;
9576 case 0x2:
9577 vex_table_index = EVEX_0F38;
9578 break;
9579 case 0x3:
9580 vex_table_index = EVEX_0F3A;
9581 break;
9582 }
9583
9584 /* The second byte after 0x62. */
9585 codep++;
9586 vex.w = *codep & 0x80;
9587 if (vex.w && address_mode == mode_64bit)
9588 rex |= REX_W;
9589
9590 vex.register_specifier = (~(*codep >> 3)) & 0xf;
43234a1e
L
9591
9592 /* The U bit. */
9593 if (!(*codep & 0x4))
9594 return &bad_opcode;
9595
9596 switch ((*codep & 0x3))
9597 {
9598 case 0:
43234a1e
L
9599 break;
9600 case 1:
9601 vex.prefix = DATA_PREFIX_OPCODE;
9602 break;
9603 case 2:
9604 vex.prefix = REPE_PREFIX_OPCODE;
9605 break;
9606 case 3:
9607 vex.prefix = REPNE_PREFIX_OPCODE;
9608 break;
9609 }
9610
9611 /* The third byte after 0x62. */
9612 codep++;
9613
9614 /* Remember the static rounding bits. */
9615 vex.ll = (*codep >> 5) & 3;
9616 vex.b = (*codep & 0x10) != 0;
9617
9618 vex.v = *codep & 0x8;
9619 vex.mask_register_specifier = *codep & 0x7;
9620 vex.zeroing = *codep & 0x80;
9621
5f847646
JB
9622 if (address_mode != mode_64bit)
9623 {
9624 /* In 16/32-bit mode silently ignore following bits. */
9625 rex &= ~REX_B;
9626 vex.r = 1;
9627 vex.v = 1;
9628 }
9629
43234a1e 9630 need_vex = 1;
43234a1e
L
9631 codep++;
9632 vindex = *codep++;
9633 dp = &evex_table[vex_table_index][vindex];
285ca992 9634 end_codep = codep;
43234a1e
L
9635 FETCH_DATA (info, codep + 1);
9636 modrm.mod = (*codep >> 6) & 3;
9637 modrm.reg = (*codep >> 3) & 7;
9638 modrm.rm = *codep & 7;
9639
9640 /* Set vector length. */
9641 if (modrm.mod == 3 && vex.b)
9642 vex.length = 512;
9643 else
9644 {
9645 switch (vex.ll)
9646 {
9647 case 0x0:
9648 vex.length = 128;
9649 break;
9650 case 0x1:
9651 vex.length = 256;
9652 break;
9653 case 0x2:
9654 vex.length = 512;
9655 break;
9656 default:
9657 return &bad_opcode;
9658 }
9659 }
9660 break;
9661
592d1631
L
9662 case 0:
9663 dp = &bad_opcode;
9664 break;
9665
b844680a 9666 default:
d34b5006 9667 abort ();
b844680a
L
9668 }
9669
9670 if (dp->name != NULL)
9671 return dp;
9672 else
8bb15339 9673 return get_valid_dis386 (dp, info);
b844680a
L
9674}
9675
dfc8cf43 9676static void
55cf16e1 9677get_sib (disassemble_info *info, int sizeflag)
dfc8cf43
L
9678{
9679 /* If modrm.mod == 3, operand must be register. */
9680 if (need_modrm
55cf16e1 9681 && ((sizeflag & AFLAG) || address_mode == mode_64bit)
dfc8cf43
L
9682 && modrm.mod != 3
9683 && modrm.rm == 4)
9684 {
9685 FETCH_DATA (info, codep + 2);
9686 sib.index = (codep [1] >> 3) & 7;
9687 sib.scale = (codep [1] >> 6) & 3;
9688 sib.base = codep [1] & 7;
9689 }
9690}
9691
e396998b 9692static int
26ca5450 9693print_insn (bfd_vma pc, disassemble_info *info)
252b5132 9694{
2da11e11 9695 const struct dis386 *dp;
252b5132 9696 int i;
ce518a5f 9697 char *op_txt[MAX_OPERANDS];
252b5132 9698 int needcomma;
df18fdba 9699 int sizeflag, orig_sizeflag;
e396998b 9700 const char *p;
252b5132 9701 struct dis_private priv;
f16cd0d5 9702 int prefix_length;
252b5132 9703
d7921315
L
9704 priv.orig_sizeflag = AFLAG | DFLAG;
9705 if ((info->mach & bfd_mach_i386_i386) != 0)
cb712a9e 9706 address_mode = mode_32bit;
2da11e11 9707 else if (info->mach == bfd_mach_i386_i8086)
d7921315
L
9708 {
9709 address_mode = mode_16bit;
9710 priv.orig_sizeflag = 0;
9711 }
2da11e11 9712 else
d7921315
L
9713 address_mode = mode_64bit;
9714
9715 if (intel_syntax == (char) -1)
9716 intel_syntax = (info->mach & bfd_mach_i386_intel_syntax) != 0;
e396998b
AM
9717
9718 for (p = info->disassembler_options; p != NULL; )
9719 {
5db04b09
L
9720 if (CONST_STRNEQ (p, "amd64"))
9721 isa64 = amd64;
9722 else if (CONST_STRNEQ (p, "intel64"))
9723 isa64 = intel64;
9724 else if (CONST_STRNEQ (p, "x86-64"))
e396998b 9725 {
cb712a9e 9726 address_mode = mode_64bit;
2a1bb84c 9727 priv.orig_sizeflag |= AFLAG | DFLAG;
e396998b 9728 }
0112cd26 9729 else if (CONST_STRNEQ (p, "i386"))
e396998b 9730 {
cb712a9e 9731 address_mode = mode_32bit;
2a1bb84c 9732 priv.orig_sizeflag |= AFLAG | DFLAG;
e396998b 9733 }
0112cd26 9734 else if (CONST_STRNEQ (p, "i8086"))
e396998b 9735 {
cb712a9e 9736 address_mode = mode_16bit;
2a1bb84c 9737 priv.orig_sizeflag &= ~(AFLAG | DFLAG);
e396998b 9738 }
0112cd26 9739 else if (CONST_STRNEQ (p, "intel"))
e396998b
AM
9740 {
9741 intel_syntax = 1;
9d141669
L
9742 if (CONST_STRNEQ (p + 5, "-mnemonic"))
9743 intel_mnemonic = 1;
e396998b 9744 }
0112cd26 9745 else if (CONST_STRNEQ (p, "att"))
e396998b
AM
9746 {
9747 intel_syntax = 0;
9d141669
L
9748 if (CONST_STRNEQ (p + 3, "-mnemonic"))
9749 intel_mnemonic = 0;
e396998b 9750 }
0112cd26 9751 else if (CONST_STRNEQ (p, "addr"))
e396998b 9752 {
f59a29b9
L
9753 if (address_mode == mode_64bit)
9754 {
9755 if (p[4] == '3' && p[5] == '2')
9756 priv.orig_sizeflag &= ~AFLAG;
9757 else if (p[4] == '6' && p[5] == '4')
9758 priv.orig_sizeflag |= AFLAG;
9759 }
9760 else
9761 {
9762 if (p[4] == '1' && p[5] == '6')
9763 priv.orig_sizeflag &= ~AFLAG;
9764 else if (p[4] == '3' && p[5] == '2')
9765 priv.orig_sizeflag |= AFLAG;
9766 }
e396998b 9767 }
0112cd26 9768 else if (CONST_STRNEQ (p, "data"))
e396998b
AM
9769 {
9770 if (p[4] == '1' && p[5] == '6')
9771 priv.orig_sizeflag &= ~DFLAG;
9772 else if (p[4] == '3' && p[5] == '2')
9773 priv.orig_sizeflag |= DFLAG;
9774 }
0112cd26 9775 else if (CONST_STRNEQ (p, "suffix"))
e396998b
AM
9776 priv.orig_sizeflag |= SUFFIX_ALWAYS;
9777
9778 p = strchr (p, ',');
9779 if (p != NULL)
9780 p++;
9781 }
9782
c0f92bf9
L
9783 if (address_mode == mode_64bit && sizeof (bfd_vma) < 8)
9784 {
9785 (*info->fprintf_func) (info->stream,
9786 _("64-bit address is disabled"));
9787 return -1;
9788 }
9789
e396998b
AM
9790 if (intel_syntax)
9791 {
9792 names64 = intel_names64;
9793 names32 = intel_names32;
9794 names16 = intel_names16;
9795 names8 = intel_names8;
9796 names8rex = intel_names8rex;
9797 names_seg = intel_names_seg;
b9733481 9798 names_mm = intel_names_mm;
7e8b059b 9799 names_bnd = intel_names_bnd;
b9733481
L
9800 names_xmm = intel_names_xmm;
9801 names_ymm = intel_names_ymm;
43234a1e 9802 names_zmm = intel_names_zmm;
260cd341 9803 names_tmm = intel_names_tmm;
db51cc60
L
9804 index64 = intel_index64;
9805 index32 = intel_index32;
43234a1e 9806 names_mask = intel_names_mask;
e396998b
AM
9807 index16 = intel_index16;
9808 open_char = '[';
9809 close_char = ']';
9810 separator_char = '+';
9811 scale_char = '*';
9812 }
9813 else
9814 {
9815 names64 = att_names64;
9816 names32 = att_names32;
9817 names16 = att_names16;
9818 names8 = att_names8;
9819 names8rex = att_names8rex;
9820 names_seg = att_names_seg;
b9733481 9821 names_mm = att_names_mm;
7e8b059b 9822 names_bnd = att_names_bnd;
b9733481
L
9823 names_xmm = att_names_xmm;
9824 names_ymm = att_names_ymm;
43234a1e 9825 names_zmm = att_names_zmm;
260cd341 9826 names_tmm = att_names_tmm;
db51cc60
L
9827 index64 = att_index64;
9828 index32 = att_index32;
43234a1e 9829 names_mask = att_names_mask;
e396998b
AM
9830 index16 = att_index16;
9831 open_char = '(';
9832 close_char = ')';
9833 separator_char = ',';
9834 scale_char = ',';
9835 }
2da11e11 9836
4fe53c98 9837 /* The output looks better if we put 7 bytes on a line, since that
8a9036a4
L
9838 puts most long word instructions on a single line. Use 8 bytes
9839 for Intel L1OM. */
d7921315 9840 if ((info->mach & bfd_mach_l1om) != 0)
8a9036a4
L
9841 info->bytes_per_line = 8;
9842 else
9843 info->bytes_per_line = 7;
252b5132 9844
26ca5450 9845 info->private_data = &priv;
252b5132
RH
9846 priv.max_fetched = priv.the_buffer;
9847 priv.insn_start = pc;
252b5132
RH
9848
9849 obuf[0] = 0;
ce518a5f
L
9850 for (i = 0; i < MAX_OPERANDS; ++i)
9851 {
9852 op_out[i][0] = 0;
9853 op_index[i] = -1;
9854 }
252b5132
RH
9855
9856 the_info = info;
9857 start_pc = pc;
e396998b
AM
9858 start_codep = priv.the_buffer;
9859 codep = priv.the_buffer;
252b5132 9860
8df14d78 9861 if (OPCODES_SIGSETJMP (priv.bailout) != 0)
5076851f 9862 {
7d421014
ILT
9863 const char *name;
9864
5076851f 9865 /* Getting here means we tried for data but didn't get it. That
e396998b
AM
9866 means we have an incomplete instruction of some sort. Just
9867 print the first byte as a prefix or a .byte pseudo-op. */
9868 if (codep > priv.the_buffer)
5076851f 9869 {
e396998b 9870 name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
7d421014
ILT
9871 if (name != NULL)
9872 (*info->fprintf_func) (info->stream, "%s", name);
9873 else
5076851f 9874 {
7d421014
ILT
9875 /* Just print the first byte as a .byte instruction. */
9876 (*info->fprintf_func) (info->stream, ".byte 0x%x",
e396998b 9877 (unsigned int) priv.the_buffer[0]);
5076851f 9878 }
5076851f 9879
7d421014 9880 return 1;
5076851f
ILT
9881 }
9882
9883 return -1;
9884 }
9885
52b15da3 9886 obufp = obuf;
f16cd0d5
L
9887 sizeflag = priv.orig_sizeflag;
9888
9889 if (!ckprefix () || rex_used)
9890 {
9891 /* Too many prefixes or unused REX prefixes. */
9892 for (i = 0;
f6dd4781 9893 i < (int) ARRAY_SIZE (all_prefixes) && all_prefixes[i];
f16cd0d5 9894 i++)
de882298 9895 (*info->fprintf_func) (info->stream, "%s%s",
6c067bbb 9896 i == 0 ? "" : " ",
f16cd0d5 9897 prefix_name (all_prefixes[i], sizeflag));
de882298 9898 return i;
f16cd0d5 9899 }
252b5132
RH
9900
9901 insn_codep = codep;
9902
9903 FETCH_DATA (info, codep + 1);
9904 two_source_ops = (*codep == 0x62) || (*codep == 0xc8);
9905
3e7d61b2 9906 if (((prefixes & PREFIX_FWAIT)
f16cd0d5 9907 && ((*codep < 0xd8) || (*codep > 0xdf))))
252b5132 9908 {
86a80a50 9909 /* Handle prefixes before fwait. */
d9949a36 9910 for (i = 0; i < fwait_prefix && all_prefixes[i];
86a80a50
L
9911 i++)
9912 (*info->fprintf_func) (info->stream, "%s ",
9913 prefix_name (all_prefixes[i], sizeflag));
f16cd0d5 9914 (*info->fprintf_func) (info->stream, "fwait");
86a80a50 9915 return i + 1;
252b5132
RH
9916 }
9917
252b5132
RH
9918 if (*codep == 0x0f)
9919 {
eec0f4ca 9920 unsigned char threebyte;
5f40e14d
JS
9921
9922 codep++;
9923 FETCH_DATA (info, codep + 1);
9924 threebyte = *codep;
eec0f4ca 9925 dp = &dis386_twobyte[threebyte];
252b5132 9926 need_modrm = twobyte_has_modrm[*codep];
eec0f4ca 9927 codep++;
252b5132
RH
9928 }
9929 else
9930 {
6439fc28 9931 dp = &dis386[*codep];
252b5132 9932 need_modrm = onebyte_has_modrm[*codep];
eec0f4ca 9933 codep++;
252b5132 9934 }
246c51aa 9935
df18fdba
L
9936 /* Save sizeflag for printing the extra prefixes later before updating
9937 it for mnemonic and operand processing. The prefix names depend
9938 only on the address mode. */
9939 orig_sizeflag = sizeflag;
c608c12e 9940 if (prefixes & PREFIX_ADDR)
df18fdba 9941 sizeflag ^= AFLAG;
b844680a 9942 if ((prefixes & PREFIX_DATA))
df18fdba 9943 sizeflag ^= DFLAG;
3ffd33cf 9944
285ca992 9945 end_codep = codep;
8bb15339 9946 if (need_modrm)
252b5132
RH
9947 {
9948 FETCH_DATA (info, codep + 1);
7967e09e
L
9949 modrm.mod = (*codep >> 6) & 3;
9950 modrm.reg = (*codep >> 3) & 7;
9951 modrm.rm = *codep & 7;
252b5132
RH
9952 }
9953
42d5f9c6 9954 need_vex = 0;
caf0678c 9955 memset (&vex, 0, sizeof (vex));
55b126d4 9956
ce518a5f 9957 if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
252b5132 9958 {
55cf16e1 9959 get_sib (info, sizeflag);
252b5132
RH
9960 dofloat (sizeflag);
9961 }
9962 else
9963 {
8bb15339 9964 dp = get_valid_dis386 (dp, info);
b844680a 9965 if (dp != NULL && putop (dp->name, sizeflag) == 0)
6c067bbb 9966 {
55cf16e1 9967 get_sib (info, sizeflag);
ce518a5f
L
9968 for (i = 0; i < MAX_OPERANDS; ++i)
9969 {
246c51aa 9970 obufp = op_out[i];
ce518a5f
L
9971 op_ad = MAX_OPERANDS - 1 - i;
9972 if (dp->op[i].rtn)
9973 (*dp->op[i].rtn) (dp->op[i].bytemode, sizeflag);
43234a1e
L
9974 /* For EVEX instruction after the last operand masking
9975 should be printed. */
9976 if (i == 0 && vex.evex)
9977 {
9978 /* Don't print {%k0}. */
9979 if (vex.mask_register_specifier)
9980 {
9981 oappend ("{");
9982 oappend (names_mask[vex.mask_register_specifier]);
9983 oappend ("}");
9984 }
9985 if (vex.zeroing)
9986 oappend ("{z}");
9987 }
ce518a5f 9988 }
6439fc28 9989 }
252b5132
RH
9990 }
9991
1d67fe3b
TT
9992 /* Clear instruction information. */
9993 if (the_info)
9994 {
9995 the_info->insn_info_valid = 0;
9996 the_info->branch_delay_insns = 0;
9997 the_info->data_size = 0;
9998 the_info->insn_type = dis_noninsn;
9999 the_info->target = 0;
10000 the_info->target2 = 0;
10001 }
10002
10003 /* Reset jump operation indicator. */
10004 op_is_jump = FALSE;
10005
10006 {
10007 int jump_detection = 0;
10008
10009 /* Extract flags. */
10010 for (i = 0; i < MAX_OPERANDS; ++i)
10011 {
10012 if ((dp->op[i].rtn == OP_J)
10013 || (dp->op[i].rtn == OP_indirE))
10014 jump_detection |= 1;
10015 else if ((dp->op[i].rtn == BND_Fixup)
10016 || (!dp->op[i].rtn && !dp->op[i].bytemode))
10017 jump_detection |= 2;
10018 else if ((dp->op[i].bytemode == cond_jump_mode)
10019 || (dp->op[i].bytemode == loop_jcxz_mode))
10020 jump_detection |= 4;
10021 }
10022
10023 /* Determine if this is a jump or branch. */
10024 if ((jump_detection & 0x3) == 0x3)
10025 {
10026 op_is_jump = TRUE;
10027 if (jump_detection & 0x4)
10028 the_info->insn_type = dis_condbranch;
10029 else
10030 the_info->insn_type =
10031 (dp->name && !strncmp(dp->name, "call", 4))
10032 ? dis_jsr : dis_branch;
10033 }
10034 }
10035
63c6fc6c
L
10036 /* If VEX.vvvv and EVEX.vvvv are unused, they must be all 1s, which
10037 are all 0s in inverted form. */
10038 if (need_vex && vex.register_specifier != 0)
10039 {
10040 (*info->fprintf_func) (info->stream, "(bad)");
10041 return end_codep - priv.the_buffer;
10042 }
10043
7531c613
JB
10044 switch (dp->prefix_requirement)
10045 {
10046 case PREFIX_DATA:
10047 /* If only the data prefix is marked as mandatory, its absence renders
10048 the encoding invalid. Most other PREFIX_OPCODE rules still apply. */
10049 if (need_vex ? !vex.prefix : !(prefixes & PREFIX_DATA))
10050 {
10051 (*info->fprintf_func) (info->stream, "(bad)");
10052 return end_codep - priv.the_buffer;
10053 }
10054 used_prefixes |= PREFIX_DATA;
10055 /* Fall through. */
10056 case PREFIX_OPCODE:
10057 /* If the mandatory PREFIX_REPZ/PREFIX_REPNZ/PREFIX_DATA prefix is
10058 unused, opcode is invalid. Since the PREFIX_DATA prefix may be
10059 used by putop and MMX/SSE operand and may be overridden by the
10060 PREFIX_REPZ/PREFIX_REPNZ fix, we check the PREFIX_DATA prefix
10061 separately. */
10062 if (((need_vex
10063 ? vex.prefix == REPE_PREFIX_OPCODE
10064 || vex.prefix == REPNE_PREFIX_OPCODE
10065 : (prefixes
10066 & (PREFIX_REPZ | PREFIX_REPNZ)) != 0)
10067 && (used_prefixes
10068 & (PREFIX_REPZ | PREFIX_REPNZ)) == 0)
10069 || (((need_vex
10070 ? vex.prefix == DATA_PREFIX_OPCODE
10071 : ((prefixes
10072 & (PREFIX_REPZ | PREFIX_REPNZ | PREFIX_DATA))
10073 == PREFIX_DATA))
10074 && (used_prefixes & PREFIX_DATA) == 0))
10075 || (vex.evex && dp->prefix_requirement != PREFIX_DATA
10076 && !vex.w != !(used_prefixes & PREFIX_DATA)))
10077 {
10078 (*info->fprintf_func) (info->stream, "(bad)");
10079 return end_codep - priv.the_buffer;
10080 }
10081 break;
10082 }
10083
d869730d 10084 /* Check if the REX prefix is used. */
73239888 10085 if ((rex ^ rex_used) == 0 && !need_vex && last_rex_prefix >= 0)
f16cd0d5
L
10086 all_prefixes[last_rex_prefix] = 0;
10087
5e6718e4 10088 /* Check if the SEG prefix is used. */
f16cd0d5
L
10089 if ((prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS | PREFIX_ES
10090 | PREFIX_FS | PREFIX_GS)) != 0
285ca992 10091 && (used_prefixes & active_seg_prefix) != 0)
f16cd0d5
L
10092 all_prefixes[last_seg_prefix] = 0;
10093
5e6718e4 10094 /* Check if the ADDR prefix is used. */
f16cd0d5
L
10095 if ((prefixes & PREFIX_ADDR) != 0
10096 && (used_prefixes & PREFIX_ADDR) != 0)
10097 all_prefixes[last_addr_prefix] = 0;
10098
df18fdba
L
10099 /* Check if the DATA prefix is used. */
10100 if ((prefixes & PREFIX_DATA) != 0
73239888
JB
10101 && (used_prefixes & PREFIX_DATA) != 0
10102 && !need_vex)
df18fdba 10103 all_prefixes[last_data_prefix] = 0;
f16cd0d5 10104
df18fdba 10105 /* Print the extra prefixes. */
f16cd0d5 10106 prefix_length = 0;
f310f33d 10107 for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
f16cd0d5
L
10108 if (all_prefixes[i])
10109 {
10110 const char *name;
df18fdba 10111 name = prefix_name (all_prefixes[i], orig_sizeflag);
f16cd0d5
L
10112 if (name == NULL)
10113 abort ();
10114 prefix_length += strlen (name) + 1;
10115 (*info->fprintf_func) (info->stream, "%s ", name);
10116 }
b844680a 10117
f16cd0d5
L
10118 /* Check maximum code length. */
10119 if ((codep - start_codep) > MAX_CODE_LENGTH)
10120 {
10121 (*info->fprintf_func) (info->stream, "(bad)");
10122 return MAX_CODE_LENGTH;
10123 }
b844680a 10124
ea397f5b 10125 obufp = mnemonicendp;
f16cd0d5 10126 for (i = strlen (obuf) + prefix_length; i < 6; i++)
252b5132
RH
10127 oappend (" ");
10128 oappend (" ");
10129 (*info->fprintf_func) (info->stream, "%s", obuf);
10130
10131 /* The enter and bound instructions are printed with operands in the same
10132 order as the intel book; everything else is printed in reverse order. */
2da11e11 10133 if (intel_syntax || two_source_ops)
252b5132 10134 {
185b1163
L
10135 bfd_vma riprel;
10136
ce518a5f 10137 for (i = 0; i < MAX_OPERANDS; ++i)
6c067bbb 10138 op_txt[i] = op_out[i];
246c51aa 10139
3a8547d2
JB
10140 if (intel_syntax && dp && dp->op[2].rtn == OP_Rounding
10141 && dp->op[3].rtn == OP_E && dp->op[4].rtn == NULL)
10142 {
10143 op_txt[2] = op_out[3];
10144 op_txt[3] = op_out[2];
10145 }
10146
ce518a5f
L
10147 for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
10148 {
6c067bbb
RM
10149 op_ad = op_index[i];
10150 op_index[i] = op_index[MAX_OPERANDS - 1 - i];
10151 op_index[MAX_OPERANDS - 1 - i] = op_ad;
185b1163
L
10152 riprel = op_riprel[i];
10153 op_riprel[i] = op_riprel [MAX_OPERANDS - 1 - i];
10154 op_riprel[MAX_OPERANDS - 1 - i] = riprel;
ce518a5f 10155 }
252b5132
RH
10156 }
10157 else
10158 {
ce518a5f 10159 for (i = 0; i < MAX_OPERANDS; ++i)
6c067bbb 10160 op_txt[MAX_OPERANDS - 1 - i] = op_out[i];
050dfa73
MM
10161 }
10162
ce518a5f
L
10163 needcomma = 0;
10164 for (i = 0; i < MAX_OPERANDS; ++i)
10165 if (*op_txt[i])
10166 {
10167 if (needcomma)
10168 (*info->fprintf_func) (info->stream, ",");
10169 if (op_index[i] != -1 && !op_riprel[i])
1d67fe3b
TT
10170 {
10171 bfd_vma target = (bfd_vma) op_address[op_index[i]];
10172
10173 if (the_info && op_is_jump)
10174 {
10175 the_info->insn_info_valid = 1;
10176 the_info->branch_delay_insns = 0;
10177 the_info->data_size = 0;
10178 the_info->target = target;
10179 the_info->target2 = 0;
10180 }
10181 (*info->print_address_func) (target, info);
10182 }
ce518a5f
L
10183 else
10184 (*info->fprintf_func) (info->stream, "%s", op_txt[i]);
10185 needcomma = 1;
10186 }
050dfa73 10187
ce518a5f 10188 for (i = 0; i < MAX_OPERANDS; i++)
52b15da3
JH
10189 if (op_index[i] != -1 && op_riprel[i])
10190 {
10191 (*info->fprintf_func) (info->stream, " # ");
4fd7268a 10192 (*info->print_address_func) ((bfd_vma) (start_pc + (codep - start_codep)
52b15da3 10193 + op_address[op_index[i]]), info);
185b1163 10194 break;
52b15da3 10195 }
e396998b 10196 return codep - priv.the_buffer;
252b5132
RH
10197}
10198
6439fc28 10199static const char *float_mem[] = {
252b5132 10200 /* d8 */
7c52e0e8
L
10201 "fadd{s|}",
10202 "fmul{s|}",
10203 "fcom{s|}",
10204 "fcomp{s|}",
10205 "fsub{s|}",
10206 "fsubr{s|}",
10207 "fdiv{s|}",
10208 "fdivr{s|}",
db6eb5be 10209 /* d9 */
7c52e0e8 10210 "fld{s|}",
252b5132 10211 "(bad)",
7c52e0e8
L
10212 "fst{s|}",
10213 "fstp{s|}",
d1c36125 10214 "fldenv{C|C}",
252b5132 10215 "fldcw",
d1c36125 10216 "fNstenv{C|C}",
252b5132
RH
10217 "fNstcw",
10218 /* da */
7c52e0e8
L
10219 "fiadd{l|}",
10220 "fimul{l|}",
10221 "ficom{l|}",
10222 "ficomp{l|}",
10223 "fisub{l|}",
10224 "fisubr{l|}",
10225 "fidiv{l|}",
10226 "fidivr{l|}",
252b5132 10227 /* db */
7c52e0e8
L
10228 "fild{l|}",
10229 "fisttp{l|}",
10230 "fist{l|}",
10231 "fistp{l|}",
252b5132 10232 "(bad)",
464dc4af 10233 "fld{t|}",
252b5132 10234 "(bad)",
464dc4af 10235 "fstp{t|}",
252b5132 10236 /* dc */
7c52e0e8
L
10237 "fadd{l|}",
10238 "fmul{l|}",
10239 "fcom{l|}",
10240 "fcomp{l|}",
10241 "fsub{l|}",
10242 "fsubr{l|}",
10243 "fdiv{l|}",
10244 "fdivr{l|}",
252b5132 10245 /* dd */
7c52e0e8
L
10246 "fld{l|}",
10247 "fisttp{ll|}",
10248 "fst{l||}",
10249 "fstp{l|}",
d1c36125 10250 "frstor{C|C}",
252b5132 10251 "(bad)",
d1c36125 10252 "fNsave{C|C}",
252b5132
RH
10253 "fNstsw",
10254 /* de */
ac465521
JB
10255 "fiadd{s|}",
10256 "fimul{s|}",
10257 "ficom{s|}",
10258 "ficomp{s|}",
10259 "fisub{s|}",
10260 "fisubr{s|}",
10261 "fidiv{s|}",
10262 "fidivr{s|}",
252b5132 10263 /* df */
ac465521
JB
10264 "fild{s|}",
10265 "fisttp{s|}",
10266 "fist{s|}",
10267 "fistp{s|}",
252b5132 10268 "fbld",
7c52e0e8 10269 "fild{ll|}",
252b5132 10270 "fbstp",
7c52e0e8 10271 "fistp{ll|}",
1d9f512f
AM
10272};
10273
10274static const unsigned char float_mem_mode[] = {
10275 /* d8 */
10276 d_mode,
10277 d_mode,
10278 d_mode,
10279 d_mode,
10280 d_mode,
10281 d_mode,
10282 d_mode,
10283 d_mode,
10284 /* d9 */
10285 d_mode,
10286 0,
10287 d_mode,
10288 d_mode,
10289 0,
10290 w_mode,
10291 0,
10292 w_mode,
10293 /* da */
10294 d_mode,
10295 d_mode,
10296 d_mode,
10297 d_mode,
10298 d_mode,
10299 d_mode,
10300 d_mode,
10301 d_mode,
10302 /* db */
10303 d_mode,
10304 d_mode,
10305 d_mode,
10306 d_mode,
10307 0,
9306ca4a 10308 t_mode,
1d9f512f 10309 0,
9306ca4a 10310 t_mode,
1d9f512f
AM
10311 /* dc */
10312 q_mode,
10313 q_mode,
10314 q_mode,
10315 q_mode,
10316 q_mode,
10317 q_mode,
10318 q_mode,
10319 q_mode,
10320 /* dd */
10321 q_mode,
10322 q_mode,
10323 q_mode,
10324 q_mode,
10325 0,
10326 0,
10327 0,
10328 w_mode,
10329 /* de */
10330 w_mode,
10331 w_mode,
10332 w_mode,
10333 w_mode,
10334 w_mode,
10335 w_mode,
10336 w_mode,
10337 w_mode,
10338 /* df */
10339 w_mode,
10340 w_mode,
10341 w_mode,
10342 w_mode,
9306ca4a 10343 t_mode,
1d9f512f 10344 q_mode,
9306ca4a 10345 t_mode,
1d9f512f 10346 q_mode
252b5132
RH
10347};
10348
ce518a5f
L
10349#define ST { OP_ST, 0 }
10350#define STi { OP_STi, 0 }
252b5132 10351
48c97fa1
L
10352#define FGRPd9_2 NULL, { { NULL, 1 } }, 0
10353#define FGRPd9_4 NULL, { { NULL, 2 } }, 0
10354#define FGRPd9_5 NULL, { { NULL, 3 } }, 0
10355#define FGRPd9_6 NULL, { { NULL, 4 } }, 0
10356#define FGRPd9_7 NULL, { { NULL, 5 } }, 0
10357#define FGRPda_5 NULL, { { NULL, 6 } }, 0
10358#define FGRPdb_4 NULL, { { NULL, 7 } }, 0
10359#define FGRPde_3 NULL, { { NULL, 8 } }, 0
10360#define FGRPdf_4 NULL, { { NULL, 9 } }, 0
252b5132 10361
2da11e11 10362static const struct dis386 float_reg[][8] = {
252b5132
RH
10363 /* d8 */
10364 {
bf890a93
IT
10365 { "fadd", { ST, STi }, 0 },
10366 { "fmul", { ST, STi }, 0 },
10367 { "fcom", { STi }, 0 },
10368 { "fcomp", { STi }, 0 },
10369 { "fsub", { ST, STi }, 0 },
10370 { "fsubr", { ST, STi }, 0 },
10371 { "fdiv", { ST, STi }, 0 },
10372 { "fdivr", { ST, STi }, 0 },
252b5132
RH
10373 },
10374 /* d9 */
10375 {
bf890a93
IT
10376 { "fld", { STi }, 0 },
10377 { "fxch", { STi }, 0 },
252b5132 10378 { FGRPd9_2 },
592d1631 10379 { Bad_Opcode },
252b5132
RH
10380 { FGRPd9_4 },
10381 { FGRPd9_5 },
10382 { FGRPd9_6 },
10383 { FGRPd9_7 },
10384 },
10385 /* da */
10386 {
bf890a93
IT
10387 { "fcmovb", { ST, STi }, 0 },
10388 { "fcmove", { ST, STi }, 0 },
10389 { "fcmovbe",{ ST, STi }, 0 },
10390 { "fcmovu", { ST, STi }, 0 },
592d1631 10391 { Bad_Opcode },
252b5132 10392 { FGRPda_5 },
592d1631
L
10393 { Bad_Opcode },
10394 { Bad_Opcode },
252b5132
RH
10395 },
10396 /* db */
10397 {
bf890a93
IT
10398 { "fcmovnb",{ ST, STi }, 0 },
10399 { "fcmovne",{ ST, STi }, 0 },
10400 { "fcmovnbe",{ ST, STi }, 0 },
10401 { "fcmovnu",{ ST, STi }, 0 },
252b5132 10402 { FGRPdb_4 },
bf890a93
IT
10403 { "fucomi", { ST, STi }, 0 },
10404 { "fcomi", { ST, STi }, 0 },
592d1631 10405 { Bad_Opcode },
252b5132
RH
10406 },
10407 /* dc */
10408 {
bf890a93
IT
10409 { "fadd", { STi, ST }, 0 },
10410 { "fmul", { STi, ST }, 0 },
592d1631
L
10411 { Bad_Opcode },
10412 { Bad_Opcode },
d53e6b98
JB
10413 { "fsub{!M|r}", { STi, ST }, 0 },
10414 { "fsub{M|}", { STi, ST }, 0 },
10415 { "fdiv{!M|r}", { STi, ST }, 0 },
10416 { "fdiv{M|}", { STi, ST }, 0 },
252b5132
RH
10417 },
10418 /* dd */
10419 {
bf890a93 10420 { "ffree", { STi }, 0 },
592d1631 10421 { Bad_Opcode },
bf890a93
IT
10422 { "fst", { STi }, 0 },
10423 { "fstp", { STi }, 0 },
10424 { "fucom", { STi }, 0 },
10425 { "fucomp", { STi }, 0 },
592d1631
L
10426 { Bad_Opcode },
10427 { Bad_Opcode },
252b5132
RH
10428 },
10429 /* de */
10430 {
bf890a93
IT
10431 { "faddp", { STi, ST }, 0 },
10432 { "fmulp", { STi, ST }, 0 },
592d1631 10433 { Bad_Opcode },
252b5132 10434 { FGRPde_3 },
d53e6b98
JB
10435 { "fsub{!M|r}p", { STi, ST }, 0 },
10436 { "fsub{M|}p", { STi, ST }, 0 },
10437 { "fdiv{!M|r}p", { STi, ST }, 0 },
10438 { "fdiv{M|}p", { STi, ST }, 0 },
252b5132
RH
10439 },
10440 /* df */
10441 {
bf890a93 10442 { "ffreep", { STi }, 0 },
592d1631
L
10443 { Bad_Opcode },
10444 { Bad_Opcode },
10445 { Bad_Opcode },
252b5132 10446 { FGRPdf_4 },
bf890a93
IT
10447 { "fucomip", { ST, STi }, 0 },
10448 { "fcomip", { ST, STi }, 0 },
592d1631 10449 { Bad_Opcode },
252b5132
RH
10450 },
10451};
10452
252b5132 10453static char *fgrps[][8] = {
48c97fa1
L
10454 /* Bad opcode 0 */
10455 {
10456 "(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10457 },
10458
10459 /* d9_2 1 */
252b5132
RH
10460 {
10461 "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10462 },
10463
48c97fa1 10464 /* d9_4 2 */
252b5132
RH
10465 {
10466 "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
10467 },
10468
48c97fa1 10469 /* d9_5 3 */
252b5132
RH
10470 {
10471 "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
10472 },
10473
48c97fa1 10474 /* d9_6 4 */
252b5132
RH
10475 {
10476 "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
10477 },
10478
48c97fa1 10479 /* d9_7 5 */
252b5132
RH
10480 {
10481 "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
10482 },
10483
48c97fa1 10484 /* da_5 6 */
252b5132
RH
10485 {
10486 "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10487 },
10488
48c97fa1 10489 /* db_4 7 */
252b5132 10490 {
309d3373
JB
10491 "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
10492 "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
252b5132
RH
10493 },
10494
48c97fa1 10495 /* de_3 8 */
252b5132
RH
10496 {
10497 "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10498 },
10499
48c97fa1 10500 /* df_4 9 */
252b5132
RH
10501 {
10502 "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10503 },
10504};
10505
b6169b20
L
10506static void
10507swap_operand (void)
10508{
10509 mnemonicendp[0] = '.';
10510 mnemonicendp[1] = 's';
10511 mnemonicendp += 2;
10512}
10513
b844680a
L
10514static void
10515OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED,
10516 int sizeflag ATTRIBUTE_UNUSED)
10517{
10518 /* Skip mod/rm byte. */
10519 MODRM_CHECK;
10520 codep++;
10521}
10522
252b5132 10523static void
26ca5450 10524dofloat (int sizeflag)
252b5132 10525{
2da11e11 10526 const struct dis386 *dp;
252b5132
RH
10527 unsigned char floatop;
10528
10529 floatop = codep[-1];
10530
7967e09e 10531 if (modrm.mod != 3)
252b5132 10532 {
7967e09e 10533 int fp_indx = (floatop - 0xd8) * 8 + modrm.reg;
1d9f512f
AM
10534
10535 putop (float_mem[fp_indx], sizeflag);
ce518a5f 10536 obufp = op_out[0];
6e50d963 10537 op_ad = 2;
1d9f512f 10538 OP_E (float_mem_mode[fp_indx], sizeflag);
252b5132
RH
10539 return;
10540 }
6608db57 10541 /* Skip mod/rm byte. */
4bba6815 10542 MODRM_CHECK;
252b5132
RH
10543 codep++;
10544
7967e09e 10545 dp = &float_reg[floatop - 0xd8][modrm.reg];
252b5132
RH
10546 if (dp->name == NULL)
10547 {
7967e09e 10548 putop (fgrps[dp->op[0].bytemode][modrm.rm], sizeflag);
252b5132 10549
6608db57 10550 /* Instruction fnstsw is only one with strange arg. */
252b5132 10551 if (floatop == 0xdf && codep[-1] == 0xe0)
ce518a5f 10552 strcpy (op_out[0], names16[0]);
252b5132
RH
10553 }
10554 else
10555 {
10556 putop (dp->name, sizeflag);
10557
ce518a5f 10558 obufp = op_out[0];
6e50d963 10559 op_ad = 2;
ce518a5f
L
10560 if (dp->op[0].rtn)
10561 (*dp->op[0].rtn) (dp->op[0].bytemode, sizeflag);
6e50d963 10562
ce518a5f 10563 obufp = op_out[1];
6e50d963 10564 op_ad = 1;
ce518a5f
L
10565 if (dp->op[1].rtn)
10566 (*dp->op[1].rtn) (dp->op[1].bytemode, sizeflag);
252b5132
RH
10567 }
10568}
10569
9ce09ba2
RM
10570/* Like oappend (below), but S is a string starting with '%'.
10571 In Intel syntax, the '%' is elided. */
10572static void
10573oappend_maybe_intel (const char *s)
10574{
10575 oappend (s + intel_syntax);
10576}
10577
252b5132 10578static void
26ca5450 10579OP_ST (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 10580{
9ce09ba2 10581 oappend_maybe_intel ("%st");
252b5132
RH
10582}
10583
252b5132 10584static void
26ca5450 10585OP_STi (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 10586{
7967e09e 10587 sprintf (scratchbuf, "%%st(%d)", modrm.rm);
9ce09ba2 10588 oappend_maybe_intel (scratchbuf);
252b5132
RH
10589}
10590
6608db57 10591/* Capital letters in template are macros. */
6439fc28 10592static int
d3ce72d0 10593putop (const char *in_template, int sizeflag)
252b5132 10594{
2da11e11 10595 const char *p;
9306ca4a 10596 int alt = 0;
9d141669 10597 int cond = 1;
21a3faeb 10598 unsigned int l = 0, len = 0;
98b528ac
L
10599 char last[4];
10600
d3ce72d0 10601 for (p = in_template; *p; p++)
252b5132 10602 {
21a3faeb
JB
10603 if (len > l)
10604 {
10605 if (l >= sizeof (last) || !ISUPPER (*p))
10606 abort ();
10607 last[l++] = *p;
10608 continue;
10609 }
252b5132
RH
10610 switch (*p)
10611 {
10612 default:
10613 *obufp++ = *p;
10614 break;
98b528ac
L
10615 case '%':
10616 len++;
10617 break;
9d141669
L
10618 case '!':
10619 cond = 0;
10620 break;
6439fc28 10621 case '{':
6439fc28 10622 if (intel_syntax)
6439fc28
AM
10623 {
10624 while (*++p != '|')
7c52e0e8
L
10625 if (*p == '}' || *p == '\0')
10626 abort ();
d1c36125 10627 alt = 1;
6439fc28 10628 }
d1c36125 10629 break;
6439fc28
AM
10630 case '|':
10631 while (*++p != '}')
10632 {
10633 if (*p == '\0')
10634 abort ();
10635 }
10636 break;
10637 case '}':
d1c36125 10638 alt = 0;
6439fc28 10639 break;
252b5132 10640 case 'A':
db6eb5be
AM
10641 if (intel_syntax)
10642 break;
7967e09e 10643 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
252b5132
RH
10644 *obufp++ = 'b';
10645 break;
10646 case 'B':
21a3faeb 10647 if (l == 0)
4b06377f 10648 {
dc1e8a47 10649 case_B:
4b06377f
L
10650 if (intel_syntax)
10651 break;
10652 if (sizeflag & SUFFIX_ALWAYS)
10653 *obufp++ = 'b';
10654 }
21a3faeb 10655 else if (l == 1 && last[0] == 'L')
4b06377f 10656 {
4b06377f
L
10657 if (address_mode == mode_64bit
10658 && !(prefixes & PREFIX_ADDR))
10659 {
10660 *obufp++ = 'a';
10661 *obufp++ = 'b';
10662 *obufp++ = 's';
10663 }
10664
10665 goto case_B;
10666 }
21a3faeb
JB
10667 else
10668 abort ();
252b5132 10669 break;
9306ca4a
JB
10670 case 'C':
10671 if (intel_syntax && !alt)
10672 break;
10673 if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
10674 {
10675 if (sizeflag & DFLAG)
10676 *obufp++ = intel_syntax ? 'd' : 'l';
10677 else
10678 *obufp++ = intel_syntax ? 'w' : 's';
10679 used_prefixes |= (prefixes & PREFIX_DATA);
10680 }
10681 break;
ed7841b3
JB
10682 case 'D':
10683 if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
10684 break;
161a04f6 10685 USED_REX (REX_W);
7967e09e 10686 if (modrm.mod == 3)
ed7841b3 10687 {
161a04f6 10688 if (rex & REX_W)
ed7841b3 10689 *obufp++ = 'q';
ed7841b3 10690 else
f16cd0d5
L
10691 {
10692 if (sizeflag & DFLAG)
10693 *obufp++ = intel_syntax ? 'd' : 'l';
10694 else
10695 *obufp++ = 'w';
10696 used_prefixes |= (prefixes & PREFIX_DATA);
10697 }
ed7841b3
JB
10698 }
10699 else
10700 *obufp++ = 'w';
10701 break;
252b5132 10702 case 'E': /* For jcxz/jecxz */
cb712a9e 10703 if (address_mode == mode_64bit)
c1a64871
JH
10704 {
10705 if (sizeflag & AFLAG)
10706 *obufp++ = 'r';
10707 else
10708 *obufp++ = 'e';
10709 }
10710 else
10711 if (sizeflag & AFLAG)
10712 *obufp++ = 'e';
3ffd33cf
AM
10713 used_prefixes |= (prefixes & PREFIX_ADDR);
10714 break;
10715 case 'F':
db6eb5be
AM
10716 if (intel_syntax)
10717 break;
e396998b 10718 if ((prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
3ffd33cf
AM
10719 {
10720 if (sizeflag & AFLAG)
cb712a9e 10721 *obufp++ = address_mode == mode_64bit ? 'q' : 'l';
3ffd33cf 10722 else
cb712a9e 10723 *obufp++ = address_mode == mode_64bit ? 'l' : 'w';
3ffd33cf
AM
10724 used_prefixes |= (prefixes & PREFIX_ADDR);
10725 }
252b5132 10726 break;
52fd6d94
JB
10727 case 'G':
10728 if (intel_syntax || (obufp[-1] != 's' && !(sizeflag & SUFFIX_ALWAYS)))
10729 break;
161a04f6 10730 if ((rex & REX_W) || (sizeflag & DFLAG))
52fd6d94
JB
10731 *obufp++ = 'l';
10732 else
10733 *obufp++ = 'w';
161a04f6 10734 if (!(rex & REX_W))
52fd6d94
JB
10735 used_prefixes |= (prefixes & PREFIX_DATA);
10736 break;
5dd0794d 10737 case 'H':
db6eb5be
AM
10738 if (intel_syntax)
10739 break;
5dd0794d
AM
10740 if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
10741 || (prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
10742 {
10743 used_prefixes |= prefixes & (PREFIX_CS | PREFIX_DS);
10744 *obufp++ = ',';
10745 *obufp++ = 'p';
10746 if (prefixes & PREFIX_DS)
10747 *obufp++ = 't';
10748 else
10749 *obufp++ = 'n';
10750 }
10751 break;
42903f7f
L
10752 case 'K':
10753 USED_REX (REX_W);
10754 if (rex & REX_W)
10755 *obufp++ = 'q';
10756 else
10757 *obufp++ = 'd';
10758 break;
6dd5059a 10759 case 'Z':
21a3faeb 10760 if (l != 0)
04d824a4 10761 {
21a3faeb
JB
10762 if (l != 1 || last[0] != 'X')
10763 abort ();
04d824a4
JB
10764 if (!need_vex || !vex.evex)
10765 abort ();
10766 if (intel_syntax
10767 || ((modrm.mod == 3 || vex.b) && !(sizeflag & SUFFIX_ALWAYS)))
10768 break;
10769 switch (vex.length)
10770 {
10771 case 128:
10772 *obufp++ = 'x';
10773 break;
10774 case 256:
10775 *obufp++ = 'y';
10776 break;
10777 case 512:
10778 *obufp++ = 'z';
10779 break;
10780 default:
10781 abort ();
10782 }
10783 break;
10784 }
6dd5059a
L
10785 if (intel_syntax)
10786 break;
10787 if (address_mode == mode_64bit && (sizeflag & SUFFIX_ALWAYS))
10788 {
10789 *obufp++ = 'q';
10790 break;
10791 }
10792 /* Fall through. */
98b528ac 10793 goto case_L;
252b5132 10794 case 'L':
21a3faeb
JB
10795 if (l != 0)
10796 abort ();
dc1e8a47 10797 case_L:
db6eb5be
AM
10798 if (intel_syntax)
10799 break;
252b5132
RH
10800 if (sizeflag & SUFFIX_ALWAYS)
10801 *obufp++ = 'l';
252b5132 10802 break;
9d141669
L
10803 case 'M':
10804 if (intel_mnemonic != cond)
10805 *obufp++ = 'r';
10806 break;
252b5132
RH
10807 case 'N':
10808 if ((prefixes & PREFIX_FWAIT) == 0)
10809 *obufp++ = 'n';
7d421014
ILT
10810 else
10811 used_prefixes |= PREFIX_FWAIT;
252b5132 10812 break;
52b15da3 10813 case 'O':
161a04f6
L
10814 USED_REX (REX_W);
10815 if (rex & REX_W)
6439fc28 10816 *obufp++ = 'o';
a35ca55a
JB
10817 else if (intel_syntax && (sizeflag & DFLAG))
10818 *obufp++ = 'q';
52b15da3
JH
10819 else
10820 *obufp++ = 'd';
161a04f6 10821 if (!(rex & REX_W))
a35ca55a 10822 used_prefixes |= (prefixes & PREFIX_DATA);
52b15da3 10823 break;
07f5af7d
L
10824 case '&':
10825 if (!intel_syntax
10826 && address_mode == mode_64bit
10827 && isa64 == intel64)
10828 {
10829 *obufp++ = 'q';
10830 break;
10831 }
10832 /* Fall through. */
6439fc28 10833 case 'T':
d9e3625e
L
10834 if (!intel_syntax
10835 && address_mode == mode_64bit
7bb15c6f 10836 && ((sizeflag & DFLAG) || (rex & REX_W)))
6439fc28
AM
10837 {
10838 *obufp++ = 'q';
10839 break;
10840 }
6608db57 10841 /* Fall through. */
4b4c407a 10842 goto case_P;
252b5132 10843 case 'P':
21a3faeb 10844 if (l == 0)
d9e3625e 10845 {
dc1e8a47 10846 case_P:
4b4c407a 10847 if (intel_syntax)
d9e3625e 10848 {
4b4c407a
L
10849 if ((rex & REX_W) == 0
10850 && (prefixes & PREFIX_DATA))
10851 {
10852 if ((sizeflag & DFLAG) == 0)
10853 *obufp++ = 'w';
10854 used_prefixes |= (prefixes & PREFIX_DATA);
10855 }
10856 break;
10857 }
10858 if ((prefixes & PREFIX_DATA)
10859 || (rex & REX_W)
10860 || (sizeflag & SUFFIX_ALWAYS))
10861 {
10862 USED_REX (REX_W);
10863 if (rex & REX_W)
10864 *obufp++ = 'q';
10865 else
10866 {
10867 if (sizeflag & DFLAG)
10868 *obufp++ = 'l';
10869 else
10870 *obufp++ = 'w';
10871 used_prefixes |= (prefixes & PREFIX_DATA);
10872 }
d9e3625e 10873 }
d9e3625e 10874 }
21a3faeb 10875 else if (l == 1 && last[0] == 'L')
252b5132 10876 {
4b4c407a
L
10877 if ((prefixes & PREFIX_DATA)
10878 || (rex & REX_W)
10879 || (sizeflag & SUFFIX_ALWAYS))
52b15da3 10880 {
4b4c407a
L
10881 USED_REX (REX_W);
10882 if (rex & REX_W)
10883 *obufp++ = 'q';
10884 else
10885 {
10886 if (sizeflag & DFLAG)
10887 *obufp++ = intel_syntax ? 'd' : 'l';
10888 else
10889 *obufp++ = 'w';
10890 used_prefixes |= (prefixes & PREFIX_DATA);
10891 }
52b15da3 10892 }
252b5132 10893 }
21a3faeb
JB
10894 else
10895 abort ();
252b5132 10896 break;
6439fc28 10897 case 'U':
db6eb5be
AM
10898 if (intel_syntax)
10899 break;
7bb15c6f 10900 if (address_mode == mode_64bit
6c067bbb 10901 && ((sizeflag & DFLAG) || (rex & REX_W)))
6439fc28 10902 {
7967e09e 10903 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
1a114b12 10904 *obufp++ = 'q';
6439fc28
AM
10905 break;
10906 }
6608db57 10907 /* Fall through. */
98b528ac 10908 goto case_Q;
252b5132 10909 case 'Q':
21a3faeb 10910 if (l == 0)
252b5132 10911 {
dc1e8a47 10912 case_Q:
98b528ac
L
10913 if (intel_syntax && !alt)
10914 break;
10915 USED_REX (REX_W);
10916 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
52b15da3 10917 {
98b528ac
L
10918 if (rex & REX_W)
10919 *obufp++ = 'q';
52b15da3 10920 else
98b528ac
L
10921 {
10922 if (sizeflag & DFLAG)
10923 *obufp++ = intel_syntax ? 'd' : 'l';
10924 else
10925 *obufp++ = 'w';
f16cd0d5 10926 used_prefixes |= (prefixes & PREFIX_DATA);
98b528ac 10927 }
52b15da3 10928 }
98b528ac 10929 }
492a76aa
JB
10930 else if (l == 1 && last[0] == 'D')
10931 *obufp++ = vex.w ? 'q' : 'd';
21a3faeb 10932 else if (l == 1 && last[0] == 'L')
98b528ac 10933 {
b24d668c
JB
10934 if (cond ? modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)
10935 : address_mode != mode_64bit)
98b528ac
L
10936 break;
10937 if ((rex & REX_W))
10938 {
10939 USED_REX (REX_W);
10940 *obufp++ = 'q';
10941 }
b24d668c 10942 else if((address_mode == mode_64bit && need_modrm && cond)
589958d6
JB
10943 || (sizeflag & SUFFIX_ALWAYS))
10944 *obufp++ = intel_syntax? 'd' : 'l';
252b5132 10945 }
21a3faeb
JB
10946 else
10947 abort ();
252b5132
RH
10948 break;
10949 case 'R':
161a04f6
L
10950 USED_REX (REX_W);
10951 if (rex & REX_W)
a35ca55a
JB
10952 *obufp++ = 'q';
10953 else if (sizeflag & DFLAG)
c608c12e 10954 {
a35ca55a 10955 if (intel_syntax)
c608c12e 10956 *obufp++ = 'd';
c608c12e 10957 else
a35ca55a 10958 *obufp++ = 'l';
c608c12e 10959 }
252b5132 10960 else
a35ca55a
JB
10961 *obufp++ = 'w';
10962 if (intel_syntax && !p[1]
161a04f6 10963 && ((rex & REX_W) || (sizeflag & DFLAG)))
a35ca55a 10964 *obufp++ = 'e';
161a04f6 10965 if (!(rex & REX_W))
52b15da3 10966 used_prefixes |= (prefixes & PREFIX_DATA);
252b5132 10967 break;
1a114b12 10968 case 'V':
21a3faeb 10969 if (l == 0)
1a114b12 10970 {
4b06377f
L
10971 if (intel_syntax)
10972 break;
7bb15c6f 10973 if (address_mode == mode_64bit
6c067bbb 10974 && ((sizeflag & DFLAG) || (rex & REX_W)))
4b06377f
L
10975 {
10976 if (sizeflag & SUFFIX_ALWAYS)
10977 *obufp++ = 'q';
10978 break;
10979 }
10980 }
21a3faeb 10981 else if (l == 1 && last[0] == 'L')
4b06377f 10982 {
4b06377f
L
10983 if (rex & REX_W)
10984 {
10985 *obufp++ = 'a';
10986 *obufp++ = 'b';
10987 *obufp++ = 's';
10988 }
1a114b12 10989 }
21a3faeb
JB
10990 else
10991 abort ();
1a114b12 10992 /* Fall through. */
4b06377f 10993 goto case_S;
252b5132 10994 case 'S':
21a3faeb 10995 if (l == 0)
252b5132 10996 {
dc1e8a47 10997 case_S:
4b06377f
L
10998 if (intel_syntax)
10999 break;
11000 if (sizeflag & SUFFIX_ALWAYS)
52b15da3 11001 {
4b06377f
L
11002 if (rex & REX_W)
11003 *obufp++ = 'q';
52b15da3 11004 else
4b06377f
L
11005 {
11006 if (sizeflag & DFLAG)
11007 *obufp++ = 'l';
11008 else
11009 *obufp++ = 'w';
11010 used_prefixes |= (prefixes & PREFIX_DATA);
11011 }
11012 }
11013 }
21a3faeb 11014 else if (l == 1 && last[0] == 'L')
4b06377f 11015 {
4b06377f
L
11016 if (address_mode == mode_64bit
11017 && !(prefixes & PREFIX_ADDR))
11018 {
11019 *obufp++ = 'a';
11020 *obufp++ = 'b';
11021 *obufp++ = 's';
11022 }
11023
11024 goto case_S;
252b5132 11025 }
21a3faeb
JB
11026 else
11027 abort ();
252b5132 11028 break;
041bd2e0 11029 case 'X':
21a3faeb
JB
11030 if (l != 0)
11031 abort ();
bf926894
JB
11032 if (need_vex
11033 ? vex.prefix == DATA_PREFIX_OPCODE
11034 : prefixes & PREFIX_DATA)
c0f3af97 11035 {
bf926894
JB
11036 *obufp++ = 'd';
11037 used_prefixes |= PREFIX_DATA;
c0f3af97 11038 }
041bd2e0 11039 else
bf926894 11040 *obufp++ = 's';
041bd2e0 11041 break;
76f227a5 11042 case 'Y':
21a3faeb 11043 if (l == 1 && last[0] == 'X')
c0f3af97 11044 {
c0f3af97
L
11045 if (!need_vex)
11046 abort ();
11047 if (intel_syntax
04d824a4 11048 || ((modrm.mod == 3 || vex.b) && !(sizeflag & SUFFIX_ALWAYS)))
c0f3af97
L
11049 break;
11050 switch (vex.length)
11051 {
11052 case 128:
11053 *obufp++ = 'x';
11054 break;
11055 case 256:
11056 *obufp++ = 'y';
11057 break;
04d824a4
JB
11058 case 512:
11059 if (!vex.evex)
c0f3af97 11060 default:
04d824a4 11061 abort ();
c0f3af97 11062 }
76f227a5 11063 }
21a3faeb
JB
11064 else
11065 abort ();
76f227a5 11066 break;
252b5132 11067 case 'W':
21a3faeb 11068 if (l == 0)
a35ca55a 11069 {
0bfee649
L
11070 /* operand size flag for cwtl, cbtw */
11071 USED_REX (REX_W);
11072 if (rex & REX_W)
11073 {
11074 if (intel_syntax)
11075 *obufp++ = 'd';
11076 else
11077 *obufp++ = 'l';
11078 }
11079 else if (sizeflag & DFLAG)
11080 *obufp++ = 'w';
a35ca55a 11081 else
0bfee649
L
11082 *obufp++ = 'b';
11083 if (!(rex & REX_W))
11084 used_prefixes |= (prefixes & PREFIX_DATA);
a35ca55a 11085 }
21a3faeb 11086 else if (l == 1)
0bfee649 11087 {
0bfee649
L
11088 if (!need_vex)
11089 abort ();
6c30d220
L
11090 if (last[0] == 'X')
11091 *obufp++ = vex.w ? 'd': 's';
931452b6
JB
11092 else if (last[0] == 'B')
11093 *obufp++ = vex.w ? 'w': 'b';
21a3faeb
JB
11094 else
11095 abort ();
0bfee649 11096 }
21a3faeb
JB
11097 else
11098 abort ();
252b5132 11099 break;
a72d2af2
L
11100 case '^':
11101 if (intel_syntax)
11102 break;
5990e377
JB
11103 if (isa64 == intel64 && (rex & REX_W))
11104 {
11105 USED_REX (REX_W);
11106 *obufp++ = 'q';
11107 break;
11108 }
a72d2af2
L
11109 if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
11110 {
11111 if (sizeflag & DFLAG)
11112 *obufp++ = 'l';
11113 else
11114 *obufp++ = 'w';
11115 used_prefixes |= (prefixes & PREFIX_DATA);
11116 }
11117 break;
5db04b09
L
11118 case '@':
11119 if (intel_syntax)
11120 break;
11121 if (address_mode == mode_64bit
11122 && (isa64 == intel64
11123 || ((sizeflag & DFLAG) || (rex & REX_W))))
11124 *obufp++ = 'q';
11125 else if ((prefixes & PREFIX_DATA))
11126 {
11127 if (!(sizeflag & DFLAG))
11128 *obufp++ = 'w';
11129 used_prefixes |= (prefixes & PREFIX_DATA);
11130 }
11131 break;
252b5132 11132 }
21a3faeb
JB
11133
11134 if (len == l)
11135 len = l = 0;
252b5132
RH
11136 }
11137 *obufp = 0;
ea397f5b 11138 mnemonicendp = obufp;
6439fc28 11139 return 0;
252b5132
RH
11140}
11141
11142static void
26ca5450 11143oappend (const char *s)
252b5132 11144{
ea397f5b 11145 obufp = stpcpy (obufp, s);
252b5132
RH
11146}
11147
11148static void
26ca5450 11149append_seg (void)
252b5132 11150{
285ca992
L
11151 /* Only print the active segment register. */
11152 if (!active_seg_prefix)
11153 return;
11154
11155 used_prefixes |= active_seg_prefix;
11156 switch (active_seg_prefix)
7d421014 11157 {
285ca992 11158 case PREFIX_CS:
9ce09ba2 11159 oappend_maybe_intel ("%cs:");
285ca992
L
11160 break;
11161 case PREFIX_DS:
9ce09ba2 11162 oappend_maybe_intel ("%ds:");
285ca992
L
11163 break;
11164 case PREFIX_SS:
9ce09ba2 11165 oappend_maybe_intel ("%ss:");
285ca992
L
11166 break;
11167 case PREFIX_ES:
9ce09ba2 11168 oappend_maybe_intel ("%es:");
285ca992
L
11169 break;
11170 case PREFIX_FS:
9ce09ba2 11171 oappend_maybe_intel ("%fs:");
285ca992
L
11172 break;
11173 case PREFIX_GS:
9ce09ba2 11174 oappend_maybe_intel ("%gs:");
285ca992
L
11175 break;
11176 default:
11177 break;
7d421014 11178 }
252b5132
RH
11179}
11180
11181static void
26ca5450 11182OP_indirE (int bytemode, int sizeflag)
252b5132
RH
11183{
11184 if (!intel_syntax)
11185 oappend ("*");
11186 OP_E (bytemode, sizeflag);
11187}
11188
52b15da3 11189static void
26ca5450 11190print_operand_value (char *buf, int hex, bfd_vma disp)
52b15da3 11191{
cb712a9e 11192 if (address_mode == mode_64bit)
52b15da3
JH
11193 {
11194 if (hex)
11195 {
11196 char tmp[30];
11197 int i;
11198 buf[0] = '0';
11199 buf[1] = 'x';
11200 sprintf_vma (tmp, disp);
6608db57 11201 for (i = 0; tmp[i] == '0' && tmp[i + 1]; i++);
52b15da3
JH
11202 strcpy (buf + 2, tmp + i);
11203 }
11204 else
11205 {
11206 bfd_signed_vma v = disp;
11207 char tmp[30];
11208 int i;
11209 if (v < 0)
11210 {
11211 *(buf++) = '-';
11212 v = -disp;
6608db57 11213 /* Check for possible overflow on 0x8000000000000000. */
52b15da3
JH
11214 if (v < 0)
11215 {
11216 strcpy (buf, "9223372036854775808");
11217 return;
11218 }
11219 }
11220 if (!v)
11221 {
11222 strcpy (buf, "0");
11223 return;
11224 }
11225
11226 i = 0;
11227 tmp[29] = 0;
11228 while (v)
11229 {
6608db57 11230 tmp[28 - i] = (v % 10) + '0';
52b15da3
JH
11231 v /= 10;
11232 i++;
11233 }
11234 strcpy (buf, tmp + 29 - i);
11235 }
11236 }
11237 else
11238 {
11239 if (hex)
11240 sprintf (buf, "0x%x", (unsigned int) disp);
11241 else
11242 sprintf (buf, "%d", (int) disp);
11243 }
11244}
11245
5d669648
L
11246/* Put DISP in BUF as signed hex number. */
11247
11248static void
11249print_displacement (char *buf, bfd_vma disp)
11250{
11251 bfd_signed_vma val = disp;
11252 char tmp[30];
11253 int i, j = 0;
11254
11255 if (val < 0)
11256 {
11257 buf[j++] = '-';
11258 val = -disp;
11259
11260 /* Check for possible overflow. */
11261 if (val < 0)
11262 {
11263 switch (address_mode)
11264 {
11265 case mode_64bit:
11266 strcpy (buf + j, "0x8000000000000000");
11267 break;
11268 case mode_32bit:
11269 strcpy (buf + j, "0x80000000");
11270 break;
11271 case mode_16bit:
11272 strcpy (buf + j, "0x8000");
11273 break;
11274 }
11275 return;
11276 }
11277 }
11278
11279 buf[j++] = '0';
11280 buf[j++] = 'x';
11281
0af1713e 11282 sprintf_vma (tmp, (bfd_vma) val);
5d669648
L
11283 for (i = 0; tmp[i] == '0'; i++)
11284 continue;
11285 if (tmp[i] == '\0')
11286 i--;
11287 strcpy (buf + j, tmp + i);
11288}
11289
3f31e633
JB
11290static void
11291intel_operand_size (int bytemode, int sizeflag)
11292{
43234a1e
L
11293 if (vex.evex
11294 && vex.b
11295 && (bytemode == x_mode
11296 || bytemode == evex_half_bcst_xmmq_mode))
11297 {
11298 if (vex.w)
11299 oappend ("QWORD PTR ");
11300 else
11301 oappend ("DWORD PTR ");
11302 return;
11303 }
3f31e633
JB
11304 switch (bytemode)
11305 {
11306 case b_mode:
b6169b20 11307 case b_swap_mode:
42903f7f 11308 case dqb_mode:
1ba585e8 11309 case db_mode:
3f31e633
JB
11310 oappend ("BYTE PTR ");
11311 break;
11312 case w_mode:
1ba585e8 11313 case dw_mode:
3f31e633
JB
11314 case dqw_mode:
11315 oappend ("WORD PTR ");
11316 break;
07f5af7d
L
11317 case indir_v_mode:
11318 if (address_mode == mode_64bit && isa64 == intel64)
11319 {
11320 oappend ("QWORD PTR ");
11321 break;
11322 }
1a0670f3 11323 /* Fall through. */
1a114b12 11324 case stack_v_mode:
7bb15c6f 11325 if (address_mode == mode_64bit && ((sizeflag & DFLAG) || (rex & REX_W)))
3f31e633
JB
11326 {
11327 oappend ("QWORD PTR ");
3f31e633
JB
11328 break;
11329 }
1a0670f3 11330 /* Fall through. */
3f31e633 11331 case v_mode:
b6169b20 11332 case v_swap_mode:
3f31e633 11333 case dq_mode:
161a04f6
L
11334 USED_REX (REX_W);
11335 if (rex & REX_W)
3f31e633 11336 oappend ("QWORD PTR ");
3f31e633 11337 else
f16cd0d5
L
11338 {
11339 if ((sizeflag & DFLAG) || bytemode == dq_mode)
11340 oappend ("DWORD PTR ");
11341 else
11342 oappend ("WORD PTR ");
11343 used_prefixes |= (prefixes & PREFIX_DATA);
11344 }
3f31e633 11345 break;
52fd6d94 11346 case z_mode:
161a04f6 11347 if ((rex & REX_W) || (sizeflag & DFLAG))
52fd6d94
JB
11348 *obufp++ = 'D';
11349 oappend ("WORD PTR ");
161a04f6 11350 if (!(rex & REX_W))
52fd6d94
JB
11351 used_prefixes |= (prefixes & PREFIX_DATA);
11352 break;
34b772a6
JB
11353 case a_mode:
11354 if (sizeflag & DFLAG)
11355 oappend ("QWORD PTR ");
11356 else
11357 oappend ("DWORD PTR ");
11358 used_prefixes |= (prefixes & PREFIX_DATA);
11359 break;
bc31405e
L
11360 case movsxd_mode:
11361 if (!(sizeflag & DFLAG) && isa64 == intel64)
11362 oappend ("WORD PTR ");
11363 else
11364 oappend ("DWORD PTR ");
11365 used_prefixes |= (prefixes & PREFIX_DATA);
11366 break;
3f31e633 11367 case d_mode:
fa99fab2 11368 case d_swap_mode:
42903f7f 11369 case dqd_mode:
3f31e633
JB
11370 oappend ("DWORD PTR ");
11371 break;
11372 case q_mode:
b6169b20 11373 case q_swap_mode:
3f31e633
JB
11374 oappend ("QWORD PTR ");
11375 break;
11376 case m_mode:
cb712a9e 11377 if (address_mode == mode_64bit)
3f31e633
JB
11378 oappend ("QWORD PTR ");
11379 else
11380 oappend ("DWORD PTR ");
11381 break;
11382 case f_mode:
11383 if (sizeflag & DFLAG)
11384 oappend ("FWORD PTR ");
11385 else
11386 oappend ("DWORD PTR ");
11387 used_prefixes |= (prefixes & PREFIX_DATA);
11388 break;
11389 case t_mode:
11390 oappend ("TBYTE PTR ");
11391 break;
11392 case x_mode:
b6169b20 11393 case x_swap_mode:
43234a1e
L
11394 case evex_x_gscat_mode:
11395 case evex_x_nobcst_mode:
4726e9a4 11396 case bw_unit_mode:
c0f3af97
L
11397 if (need_vex)
11398 {
11399 switch (vex.length)
11400 {
11401 case 128:
11402 oappend ("XMMWORD PTR ");
11403 break;
11404 case 256:
11405 oappend ("YMMWORD PTR ");
11406 break;
43234a1e
L
11407 case 512:
11408 oappend ("ZMMWORD PTR ");
11409 break;
c0f3af97
L
11410 default:
11411 abort ();
11412 }
11413 }
11414 else
11415 oappend ("XMMWORD PTR ");
11416 break;
11417 case xmm_mode:
3f31e633
JB
11418 oappend ("XMMWORD PTR ");
11419 break;
43234a1e
L
11420 case ymm_mode:
11421 oappend ("YMMWORD PTR ");
11422 break;
c0f3af97 11423 case xmmq_mode:
43234a1e 11424 case evex_half_bcst_xmmq_mode:
c0f3af97
L
11425 if (!need_vex)
11426 abort ();
11427
11428 switch (vex.length)
11429 {
11430 case 128:
11431 oappend ("QWORD PTR ");
11432 break;
11433 case 256:
11434 oappend ("XMMWORD PTR ");
11435 break;
43234a1e
L
11436 case 512:
11437 oappend ("YMMWORD PTR ");
11438 break;
c0f3af97
L
11439 default:
11440 abort ();
11441 }
11442 break;
6c30d220
L
11443 case xmm_mb_mode:
11444 if (!need_vex)
11445 abort ();
11446
11447 switch (vex.length)
11448 {
11449 case 128:
11450 case 256:
43234a1e 11451 case 512:
6c30d220
L
11452 oappend ("BYTE PTR ");
11453 break;
11454 default:
11455 abort ();
11456 }
11457 break;
11458 case xmm_mw_mode:
11459 if (!need_vex)
11460 abort ();
11461
11462 switch (vex.length)
11463 {
11464 case 128:
11465 case 256:
43234a1e 11466 case 512:
6c30d220
L
11467 oappend ("WORD PTR ");
11468 break;
11469 default:
11470 abort ();
11471 }
11472 break;
11473 case xmm_md_mode:
11474 if (!need_vex)
11475 abort ();
11476
11477 switch (vex.length)
11478 {
11479 case 128:
11480 case 256:
43234a1e 11481 case 512:
6c30d220
L
11482 oappend ("DWORD PTR ");
11483 break;
11484 default:
11485 abort ();
11486 }
11487 break;
11488 case xmm_mq_mode:
11489 if (!need_vex)
11490 abort ();
11491
11492 switch (vex.length)
11493 {
11494 case 128:
11495 case 256:
43234a1e 11496 case 512:
6c30d220
L
11497 oappend ("QWORD PTR ");
11498 break;
11499 default:
11500 abort ();
11501 }
11502 break;
11503 case xmmdw_mode:
11504 if (!need_vex)
11505 abort ();
11506
11507 switch (vex.length)
11508 {
11509 case 128:
11510 oappend ("WORD PTR ");
11511 break;
11512 case 256:
11513 oappend ("DWORD PTR ");
11514 break;
43234a1e
L
11515 case 512:
11516 oappend ("QWORD PTR ");
11517 break;
6c30d220
L
11518 default:
11519 abort ();
11520 }
11521 break;
11522 case xmmqd_mode:
11523 if (!need_vex)
11524 abort ();
11525
11526 switch (vex.length)
11527 {
11528 case 128:
11529 oappend ("DWORD PTR ");
11530 break;
11531 case 256:
11532 oappend ("QWORD PTR ");
11533 break;
43234a1e
L
11534 case 512:
11535 oappend ("XMMWORD PTR ");
11536 break;
6c30d220
L
11537 default:
11538 abort ();
11539 }
11540 break;
c0f3af97
L
11541 case ymmq_mode:
11542 if (!need_vex)
11543 abort ();
11544
11545 switch (vex.length)
11546 {
11547 case 128:
11548 oappend ("QWORD PTR ");
11549 break;
11550 case 256:
11551 oappend ("YMMWORD PTR ");
11552 break;
43234a1e
L
11553 case 512:
11554 oappend ("ZMMWORD PTR ");
11555 break;
c0f3af97
L
11556 default:
11557 abort ();
11558 }
11559 break;
6c30d220
L
11560 case ymmxmm_mode:
11561 if (!need_vex)
11562 abort ();
11563
11564 switch (vex.length)
11565 {
11566 case 128:
11567 case 256:
11568 oappend ("XMMWORD PTR ");
11569 break;
11570 default:
11571 abort ();
11572 }
11573 break;
fb9c77c7
L
11574 case o_mode:
11575 oappend ("OWORD PTR ");
11576 break;
1c480963 11577 case vex_scalar_w_dq_mode:
0bfee649
L
11578 if (!need_vex)
11579 abort ();
11580
11581 if (vex.w)
11582 oappend ("QWORD PTR ");
11583 else
11584 oappend ("DWORD PTR ");
11585 break;
43234a1e
L
11586 case vex_vsib_d_w_dq_mode:
11587 case vex_vsib_q_w_dq_mode:
11588 if (!need_vex)
11589 abort ();
11590
11591 if (!vex.evex)
11592 {
11593 if (vex.w)
11594 oappend ("QWORD PTR ");
11595 else
11596 oappend ("DWORD PTR ");
11597 }
11598 else
11599 {
b28d1bda
IT
11600 switch (vex.length)
11601 {
11602 case 128:
11603 oappend ("XMMWORD PTR ");
11604 break;
11605 case 256:
11606 oappend ("YMMWORD PTR ");
11607 break;
11608 case 512:
11609 oappend ("ZMMWORD PTR ");
11610 break;
11611 default:
11612 abort ();
11613 }
43234a1e
L
11614 }
11615 break;
5fc35d96
IT
11616 case vex_vsib_q_w_d_mode:
11617 case vex_vsib_d_w_d_mode:
b28d1bda 11618 if (!need_vex || !vex.evex)
5fc35d96
IT
11619 abort ();
11620
b28d1bda
IT
11621 switch (vex.length)
11622 {
11623 case 128:
11624 oappend ("QWORD PTR ");
11625 break;
11626 case 256:
11627 oappend ("XMMWORD PTR ");
11628 break;
11629 case 512:
11630 oappend ("YMMWORD PTR ");
11631 break;
11632 default:
11633 abort ();
11634 }
5fc35d96
IT
11635
11636 break;
1ba585e8
IT
11637 case mask_bd_mode:
11638 if (!need_vex || vex.length != 128)
11639 abort ();
11640 if (vex.w)
11641 oappend ("DWORD PTR ");
11642 else
11643 oappend ("BYTE PTR ");
11644 break;
43234a1e
L
11645 case mask_mode:
11646 if (!need_vex)
11647 abort ();
1ba585e8
IT
11648 if (vex.w)
11649 oappend ("QWORD PTR ");
11650 else
11651 oappend ("WORD PTR ");
43234a1e 11652 break;
6c75cc62 11653 case v_bnd_mode:
d276ec69 11654 case v_bndmk_mode:
3f31e633
JB
11655 default:
11656 break;
11657 }
11658}
11659
252b5132 11660static void
c0f3af97 11661OP_E_register (int bytemode, int sizeflag)
252b5132 11662{
c0f3af97
L
11663 int reg = modrm.rm;
11664 const char **names;
252b5132 11665
c0f3af97
L
11666 USED_REX (REX_B);
11667 if ((rex & REX_B))
11668 reg += 8;
252b5132 11669
b6169b20 11670 if ((sizeflag & SUFFIX_ALWAYS)
1ba585e8 11671 && (bytemode == b_swap_mode
9f79e886 11672 || bytemode == bnd_swap_mode
60227d64 11673 || bytemode == v_swap_mode))
b6169b20
L
11674 swap_operand ();
11675
c0f3af97 11676 switch (bytemode)
252b5132 11677 {
c0f3af97 11678 case b_mode:
b6169b20 11679 case b_swap_mode:
e184e611
JB
11680 if (reg & 4)
11681 USED_REX (0);
c0f3af97
L
11682 if (rex)
11683 names = names8rex;
11684 else
11685 names = names8;
11686 break;
11687 case w_mode:
11688 names = names16;
11689 break;
11690 case d_mode:
1ba585e8
IT
11691 case dw_mode:
11692 case db_mode:
c0f3af97
L
11693 names = names32;
11694 break;
11695 case q_mode:
11696 names = names64;
11697 break;
11698 case m_mode:
6c75cc62 11699 case v_bnd_mode:
c0f3af97
L
11700 names = address_mode == mode_64bit ? names64 : names32;
11701 break;
7e8b059b 11702 case bnd_mode:
9f79e886 11703 case bnd_swap_mode:
0d96e4df
L
11704 if (reg > 0x3)
11705 {
11706 oappend ("(bad)");
11707 return;
11708 }
7e8b059b
L
11709 names = names_bnd;
11710 break;
07f5af7d
L
11711 case indir_v_mode:
11712 if (address_mode == mode_64bit && isa64 == intel64)
11713 {
11714 names = names64;
11715 break;
11716 }
1a0670f3 11717 /* Fall through. */
c0f3af97 11718 case stack_v_mode:
7bb15c6f 11719 if (address_mode == mode_64bit && ((sizeflag & DFLAG) || (rex & REX_W)))
252b5132 11720 {
c0f3af97 11721 names = names64;
252b5132 11722 break;
252b5132 11723 }
c0f3af97 11724 bytemode = v_mode;
1a0670f3 11725 /* Fall through. */
c0f3af97 11726 case v_mode:
b6169b20 11727 case v_swap_mode:
c0f3af97
L
11728 case dq_mode:
11729 case dqb_mode:
11730 case dqd_mode:
11731 case dqw_mode:
11732 USED_REX (REX_W);
11733 if (rex & REX_W)
11734 names = names64;
c0f3af97 11735 else
f16cd0d5 11736 {
7bb15c6f 11737 if ((sizeflag & DFLAG)
f16cd0d5
L
11738 || (bytemode != v_mode
11739 && bytemode != v_swap_mode))
11740 names = names32;
11741 else
11742 names = names16;
11743 used_prefixes |= (prefixes & PREFIX_DATA);
11744 }
c0f3af97 11745 break;
bc31405e
L
11746 case movsxd_mode:
11747 if (!(sizeflag & DFLAG) && isa64 == intel64)
11748 names = names16;
11749 else
11750 names = names32;
11751 used_prefixes |= (prefixes & PREFIX_DATA);
11752 break;
de89d0a3
IT
11753 case va_mode:
11754 names = (address_mode == mode_64bit
11755 ? names64 : names32);
11756 if (!(prefixes & PREFIX_ADDR))
aa178437
IT
11757 names = (address_mode == mode_16bit
11758 ? names16 : names);
de89d0a3
IT
11759 else
11760 {
11761 /* Remove "addr16/addr32". */
11762 all_prefixes[last_addr_prefix] = 0;
11763 names = (address_mode != mode_32bit
11764 ? names32 : names16);
11765 used_prefixes |= PREFIX_ADDR;
11766 }
11767 break;
1ba585e8 11768 case mask_bd_mode:
43234a1e 11769 case mask_mode:
9889cbb1
L
11770 if (reg > 0x7)
11771 {
11772 oappend ("(bad)");
11773 return;
11774 }
43234a1e
L
11775 names = names_mask;
11776 break;
c0f3af97
L
11777 case 0:
11778 return;
11779 default:
11780 oappend (INTERNAL_DISASSEMBLER_ERROR);
252b5132
RH
11781 return;
11782 }
c0f3af97
L
11783 oappend (names[reg]);
11784}
11785
11786static void
c1e679ec 11787OP_E_memory (int bytemode, int sizeflag)
c0f3af97
L
11788{
11789 bfd_vma disp = 0;
11790 int add = (rex & REX_B) ? 8 : 0;
11791 int riprel = 0;
43234a1e
L
11792 int shift;
11793
11794 if (vex.evex)
11795 {
11796 /* In EVEX, if operand doesn't allow broadcast, vex.b should be 0. */
11797 if (vex.b
11798 && bytemode != x_mode
90a915bf 11799 && bytemode != xmmq_mode
43234a1e
L
11800 && bytemode != evex_half_bcst_xmmq_mode)
11801 {
11802 BadOp ();
11803 return;
11804 }
11805 switch (bytemode)
11806 {
1ba585e8
IT
11807 case dqw_mode:
11808 case dw_mode:
059edf8b 11809 case xmm_mw_mode:
1ba585e8
IT
11810 shift = 1;
11811 break;
11812 case dqb_mode:
11813 case db_mode:
059edf8b 11814 case xmm_mb_mode:
1ba585e8
IT
11815 shift = 0;
11816 break;
b50c9f31
JB
11817 case dq_mode:
11818 if (address_mode != mode_64bit)
11819 {
059edf8b
JB
11820 case dqd_mode:
11821 case xmm_md_mode:
11822 case d_mode:
11823 case d_swap_mode:
b50c9f31
JB
11824 shift = 2;
11825 break;
11826 }
11827 /* fall through */
4102be5c 11828 case vex_scalar_w_dq_mode:
43234a1e 11829 case vex_vsib_d_w_dq_mode:
5fc35d96 11830 case vex_vsib_d_w_d_mode:
eaa9d1ad 11831 case vex_vsib_q_w_dq_mode:
5fc35d96 11832 case vex_vsib_q_w_d_mode:
43234a1e 11833 case evex_x_gscat_mode:
43234a1e
L
11834 shift = vex.w ? 3 : 2;
11835 break;
43234a1e
L
11836 case x_mode:
11837 case evex_half_bcst_xmmq_mode:
90a915bf 11838 case xmmq_mode:
43234a1e
L
11839 if (vex.b)
11840 {
11841 shift = vex.w ? 3 : 2;
11842 break;
11843 }
1a0670f3 11844 /* Fall through. */
43234a1e
L
11845 case xmmqd_mode:
11846 case xmmdw_mode:
43234a1e
L
11847 case ymmq_mode:
11848 case evex_x_nobcst_mode:
11849 case x_swap_mode:
11850 switch (vex.length)
11851 {
11852 case 128:
11853 shift = 4;
11854 break;
11855 case 256:
11856 shift = 5;
11857 break;
11858 case 512:
11859 shift = 6;
11860 break;
11861 default:
11862 abort ();
11863 }
059edf8b
JB
11864 /* Make necessary corrections to shift for modes that need it. */
11865 if (bytemode == xmmq_mode
11866 || bytemode == evex_half_bcst_xmmq_mode
11867 || (bytemode == ymmq_mode && vex.length == 128))
11868 shift -= 1;
11869 else if (bytemode == xmmqd_mode)
11870 shift -= 2;
11871 else if (bytemode == xmmdw_mode)
11872 shift -= 3;
43234a1e
L
11873 break;
11874 case ymm_mode:
11875 shift = 5;
11876 break;
11877 case xmm_mode:
11878 shift = 4;
11879 break;
11880 case xmm_mq_mode:
11881 case q_mode:
43234a1e 11882 case q_swap_mode:
43234a1e
L
11883 shift = 3;
11884 break;
4726e9a4
JB
11885 case bw_unit_mode:
11886 shift = vex.w ? 1 : 0;
11887 break;
43234a1e
L
11888 default:
11889 abort ();
11890 }
43234a1e
L
11891 }
11892 else
11893 shift = 0;
252b5132 11894
c0f3af97 11895 USED_REX (REX_B);
3f31e633
JB
11896 if (intel_syntax)
11897 intel_operand_size (bytemode, sizeflag);
252b5132
RH
11898 append_seg ();
11899
5d669648 11900 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
252b5132 11901 {
5d669648
L
11902 /* 32/64 bit address mode */
11903 int havedisp;
252b5132
RH
11904 int havesib;
11905 int havebase;
0f7da397 11906 int haveindex;
20afcfb7 11907 int needindex;
1bc60e56 11908 int needaddr32;
82c18208 11909 int base, rbase;
91d6fa6a 11910 int vindex = 0;
252b5132 11911 int scale = 0;
7e8b059b
L
11912 int addr32flag = !((sizeflag & AFLAG)
11913 || bytemode == v_bnd_mode
d276ec69 11914 || bytemode == v_bndmk_mode
9f79e886
JB
11915 || bytemode == bnd_mode
11916 || bytemode == bnd_swap_mode);
6c30d220
L
11917 const char **indexes64 = names64;
11918 const char **indexes32 = names32;
252b5132
RH
11919
11920 havesib = 0;
11921 havebase = 1;
0f7da397 11922 haveindex = 0;
7967e09e 11923 base = modrm.rm;
252b5132
RH
11924
11925 if (base == 4)
11926 {
11927 havesib = 1;
dfc8cf43 11928 vindex = sib.index;
161a04f6
L
11929 USED_REX (REX_X);
11930 if (rex & REX_X)
91d6fa6a 11931 vindex += 8;
6c30d220
L
11932 switch (bytemode)
11933 {
11934 case vex_vsib_d_w_dq_mode:
5fc35d96 11935 case vex_vsib_d_w_d_mode:
6c30d220 11936 case vex_vsib_q_w_dq_mode:
5fc35d96 11937 case vex_vsib_q_w_d_mode:
6c30d220
L
11938 if (!need_vex)
11939 abort ();
43234a1e
L
11940 if (vex.evex)
11941 {
11942 if (!vex.v)
11943 vindex += 16;
11944 }
6c30d220
L
11945
11946 haveindex = 1;
11947 switch (vex.length)
11948 {
11949 case 128:
7bb15c6f 11950 indexes64 = indexes32 = names_xmm;
6c30d220
L
11951 break;
11952 case 256:
5fc35d96
IT
11953 if (!vex.w
11954 || bytemode == vex_vsib_q_w_dq_mode
11955 || bytemode == vex_vsib_q_w_d_mode)
7bb15c6f 11956 indexes64 = indexes32 = names_ymm;
6c30d220 11957 else
7bb15c6f 11958 indexes64 = indexes32 = names_xmm;
6c30d220 11959 break;
43234a1e 11960 case 512:
5fc35d96
IT
11961 if (!vex.w
11962 || bytemode == vex_vsib_q_w_dq_mode
11963 || bytemode == vex_vsib_q_w_d_mode)
43234a1e
L
11964 indexes64 = indexes32 = names_zmm;
11965 else
11966 indexes64 = indexes32 = names_ymm;
11967 break;
6c30d220
L
11968 default:
11969 abort ();
11970 }
11971 break;
11972 default:
11973 haveindex = vindex != 4;
11974 break;
11975 }
11976 scale = sib.scale;
11977 base = sib.base;
252b5132
RH
11978 codep++;
11979 }
260cd341
LC
11980 else
11981 {
11982 /* mandatory non-vector SIB must have sib */
11983 if (bytemode == vex_sibmem_mode)
11984 {
11985 oappend ("(bad)");
11986 return;
11987 }
11988 }
82c18208 11989 rbase = base + add;
252b5132 11990
7967e09e 11991 switch (modrm.mod)
252b5132
RH
11992 {
11993 case 0:
82c18208 11994 if (base == 5)
252b5132
RH
11995 {
11996 havebase = 0;
cb712a9e 11997 if (address_mode == mode_64bit && !havesib)
52b15da3
JH
11998 riprel = 1;
11999 disp = get32s ();
d276ec69
JB
12000 if (riprel && bytemode == v_bndmk_mode)
12001 {
12002 oappend ("(bad)");
12003 return;
12004 }
252b5132
RH
12005 }
12006 break;
12007 case 1:
12008 FETCH_DATA (the_info, codep + 1);
12009 disp = *codep++;
12010 if ((disp & 0x80) != 0)
12011 disp -= 0x100;
43234a1e
L
12012 if (vex.evex && shift > 0)
12013 disp <<= shift;
252b5132
RH
12014 break;
12015 case 2:
52b15da3 12016 disp = get32s ();
252b5132
RH
12017 break;
12018 }
12019
1bc60e56
L
12020 needindex = 0;
12021 needaddr32 = 0;
12022 if (havesib
12023 && !havebase
12024 && !haveindex
12025 && address_mode != mode_16bit)
12026 {
12027 if (address_mode == mode_64bit)
12028 {
12029 /* Display eiz instead of addr32. */
12030 needindex = addr32flag;
12031 needaddr32 = 1;
12032 }
12033 else
12034 {
12035 /* In 32-bit mode, we need index register to tell [offset]
12036 from [eiz*1 + offset]. */
12037 needindex = 1;
12038 }
12039 }
12040
20afcfb7
L
12041 havedisp = (havebase
12042 || needindex
12043 || (havesib && (haveindex || scale != 0)));
5d669648 12044
252b5132 12045 if (!intel_syntax)
82c18208 12046 if (modrm.mod != 0 || base == 5)
db6eb5be 12047 {
5d669648
L
12048 if (havedisp || riprel)
12049 print_displacement (scratchbuf, disp);
12050 else
12051 print_operand_value (scratchbuf, 1, disp);
db6eb5be 12052 oappend (scratchbuf);
52b15da3
JH
12053 if (riprel)
12054 {
12055 set_op (disp, 1);
28596323 12056 oappend (!addr32flag ? "(%rip)" : "(%eip)");
52b15da3 12057 }
db6eb5be 12058 }
2da11e11 12059
c1dc7af5 12060 if ((havebase || haveindex || needindex || needaddr32 || riprel)
a23b33b3
JB
12061 && (address_mode != mode_64bit
12062 || ((bytemode != v_bnd_mode)
12063 && (bytemode != v_bndmk_mode)
12064 && (bytemode != bnd_mode)
12065 && (bytemode != bnd_swap_mode))))
87767711
JB
12066 used_prefixes |= PREFIX_ADDR;
12067
5d669648 12068 if (havedisp || (intel_syntax && riprel))
252b5132 12069 {
252b5132 12070 *obufp++ = open_char;
52b15da3 12071 if (intel_syntax && riprel)
185b1163
L
12072 {
12073 set_op (disp, 1);
28596323 12074 oappend (!addr32flag ? "rip" : "eip");
185b1163 12075 }
db6eb5be 12076 *obufp = '\0';
252b5132 12077 if (havebase)
7e8b059b 12078 oappend (address_mode == mode_64bit && !addr32flag
82c18208 12079 ? names64[rbase] : names32[rbase]);
252b5132
RH
12080 if (havesib)
12081 {
db51cc60
L
12082 /* ESP/RSP won't allow index. If base isn't ESP/RSP,
12083 print index to tell base + index from base. */
12084 if (scale != 0
20afcfb7 12085 || needindex
db51cc60
L
12086 || haveindex
12087 || (havebase && base != ESP_REG_NUM))
252b5132 12088 {
9306ca4a 12089 if (!intel_syntax || havebase)
db6eb5be 12090 {
9306ca4a
JB
12091 *obufp++ = separator_char;
12092 *obufp = '\0';
db6eb5be 12093 }
db51cc60 12094 if (haveindex)
7e8b059b 12095 oappend (address_mode == mode_64bit && !addr32flag
6c30d220 12096 ? indexes64[vindex] : indexes32[vindex]);
db51cc60 12097 else
7e8b059b 12098 oappend (address_mode == mode_64bit && !addr32flag
db51cc60
L
12099 ? index64 : index32);
12100
db6eb5be
AM
12101 *obufp++ = scale_char;
12102 *obufp = '\0';
12103 sprintf (scratchbuf, "%d", 1 << scale);
12104 oappend (scratchbuf);
12105 }
252b5132 12106 }
185b1163 12107 if (intel_syntax
82c18208 12108 && (disp || modrm.mod != 0 || base == 5))
3d456fa1 12109 {
db51cc60 12110 if (!havedisp || (bfd_signed_vma) disp >= 0)
3d456fa1
JB
12111 {
12112 *obufp++ = '+';
12113 *obufp = '\0';
12114 }
05203043 12115 else if (modrm.mod != 1 && disp != -disp)
3d456fa1
JB
12116 {
12117 *obufp++ = '-';
12118 *obufp = '\0';
12119 disp = - (bfd_signed_vma) disp;
12120 }
12121
db51cc60
L
12122 if (havedisp)
12123 print_displacement (scratchbuf, disp);
12124 else
12125 print_operand_value (scratchbuf, 1, disp);
3d456fa1
JB
12126 oappend (scratchbuf);
12127 }
252b5132
RH
12128
12129 *obufp++ = close_char;
db6eb5be 12130 *obufp = '\0';
252b5132
RH
12131 }
12132 else if (intel_syntax)
db6eb5be 12133 {
82c18208 12134 if (modrm.mod != 0 || base == 5)
db6eb5be 12135 {
285ca992 12136 if (!active_seg_prefix)
252b5132 12137 {
d708bcba 12138 oappend (names_seg[ds_reg - es_reg]);
252b5132
RH
12139 oappend (":");
12140 }
52b15da3 12141 print_operand_value (scratchbuf, 1, disp);
db6eb5be
AM
12142 oappend (scratchbuf);
12143 }
12144 }
252b5132 12145 }
a23b33b3
JB
12146 else if (bytemode == v_bnd_mode
12147 || bytemode == v_bndmk_mode
12148 || bytemode == bnd_mode
12149 || bytemode == bnd_swap_mode)
12150 {
12151 oappend ("(bad)");
12152 return;
12153 }
252b5132 12154 else
f16cd0d5
L
12155 {
12156 /* 16 bit address mode */
12157 used_prefixes |= prefixes & PREFIX_ADDR;
7967e09e 12158 switch (modrm.mod)
252b5132
RH
12159 {
12160 case 0:
7967e09e 12161 if (modrm.rm == 6)
252b5132
RH
12162 {
12163 disp = get16 ();
12164 if ((disp & 0x8000) != 0)
12165 disp -= 0x10000;
12166 }
12167 break;
12168 case 1:
12169 FETCH_DATA (the_info, codep + 1);
12170 disp = *codep++;
12171 if ((disp & 0x80) != 0)
12172 disp -= 0x100;
65f3ed04
JB
12173 if (vex.evex && shift > 0)
12174 disp <<= shift;
252b5132
RH
12175 break;
12176 case 2:
12177 disp = get16 ();
12178 if ((disp & 0x8000) != 0)
12179 disp -= 0x10000;
12180 break;
12181 }
12182
12183 if (!intel_syntax)
7967e09e 12184 if (modrm.mod != 0 || modrm.rm == 6)
db6eb5be 12185 {
5d669648 12186 print_displacement (scratchbuf, disp);
db6eb5be
AM
12187 oappend (scratchbuf);
12188 }
252b5132 12189
7967e09e 12190 if (modrm.mod != 0 || modrm.rm != 6)
252b5132
RH
12191 {
12192 *obufp++ = open_char;
db6eb5be 12193 *obufp = '\0';
7967e09e 12194 oappend (index16[modrm.rm]);
5d669648
L
12195 if (intel_syntax
12196 && (disp || modrm.mod != 0 || modrm.rm == 6))
3d456fa1 12197 {
5d669648 12198 if ((bfd_signed_vma) disp >= 0)
3d456fa1
JB
12199 {
12200 *obufp++ = '+';
12201 *obufp = '\0';
12202 }
7967e09e 12203 else if (modrm.mod != 1)
3d456fa1
JB
12204 {
12205 *obufp++ = '-';
12206 *obufp = '\0';
12207 disp = - (bfd_signed_vma) disp;
12208 }
12209
5d669648 12210 print_displacement (scratchbuf, disp);
3d456fa1
JB
12211 oappend (scratchbuf);
12212 }
12213
db6eb5be
AM
12214 *obufp++ = close_char;
12215 *obufp = '\0';
252b5132 12216 }
3d456fa1
JB
12217 else if (intel_syntax)
12218 {
285ca992 12219 if (!active_seg_prefix)
3d456fa1
JB
12220 {
12221 oappend (names_seg[ds_reg - es_reg]);
12222 oappend (":");
12223 }
12224 print_operand_value (scratchbuf, 1, disp & 0xffff);
12225 oappend (scratchbuf);
12226 }
252b5132 12227 }
43234a1e
L
12228 if (vex.evex && vex.b
12229 && (bytemode == x_mode
90a915bf 12230 || bytemode == xmmq_mode
43234a1e
L
12231 || bytemode == evex_half_bcst_xmmq_mode))
12232 {
90a915bf
IT
12233 if (vex.w
12234 || bytemode == xmmq_mode
12235 || bytemode == evex_half_bcst_xmmq_mode)
b28d1bda
IT
12236 {
12237 switch (vex.length)
12238 {
12239 case 128:
12240 oappend ("{1to2}");
12241 break;
12242 case 256:
12243 oappend ("{1to4}");
12244 break;
12245 case 512:
12246 oappend ("{1to8}");
12247 break;
12248 default:
12249 abort ();
12250 }
12251 }
43234a1e 12252 else
b28d1bda
IT
12253 {
12254 switch (vex.length)
12255 {
12256 case 128:
12257 oappend ("{1to4}");
12258 break;
12259 case 256:
12260 oappend ("{1to8}");
12261 break;
12262 case 512:
12263 oappend ("{1to16}");
12264 break;
12265 default:
12266 abort ();
12267 }
12268 }
43234a1e 12269 }
252b5132
RH
12270}
12271
c0f3af97 12272static void
8b3f93e7 12273OP_E (int bytemode, int sizeflag)
c0f3af97
L
12274{
12275 /* Skip mod/rm byte. */
12276 MODRM_CHECK;
12277 codep++;
12278
12279 if (modrm.mod == 3)
12280 OP_E_register (bytemode, sizeflag);
12281 else
c1e679ec 12282 OP_E_memory (bytemode, sizeflag);
c0f3af97
L
12283}
12284
252b5132 12285static void
26ca5450 12286OP_G (int bytemode, int sizeflag)
252b5132 12287{
52b15da3 12288 int add = 0;
c0a30a9f 12289 const char **names;
161a04f6
L
12290 USED_REX (REX_R);
12291 if (rex & REX_R)
52b15da3 12292 add += 8;
252b5132
RH
12293 switch (bytemode)
12294 {
12295 case b_mode:
e184e611
JB
12296 if (modrm.reg & 4)
12297 USED_REX (0);
52b15da3 12298 if (rex)
7967e09e 12299 oappend (names8rex[modrm.reg + add]);
52b15da3 12300 else
7967e09e 12301 oappend (names8[modrm.reg + add]);
252b5132
RH
12302 break;
12303 case w_mode:
7967e09e 12304 oappend (names16[modrm.reg + add]);
252b5132
RH
12305 break;
12306 case d_mode:
1ba585e8
IT
12307 case db_mode:
12308 case dw_mode:
7967e09e 12309 oappend (names32[modrm.reg + add]);
52b15da3
JH
12310 break;
12311 case q_mode:
7967e09e 12312 oappend (names64[modrm.reg + add]);
252b5132 12313 break;
7e8b059b 12314 case bnd_mode:
0d96e4df
L
12315 if (modrm.reg > 0x3)
12316 {
12317 oappend ("(bad)");
12318 return;
12319 }
7e8b059b
L
12320 oappend (names_bnd[modrm.reg]);
12321 break;
252b5132 12322 case v_mode:
9306ca4a 12323 case dq_mode:
42903f7f
L
12324 case dqb_mode:
12325 case dqd_mode:
9306ca4a 12326 case dqw_mode:
bc31405e 12327 case movsxd_mode:
161a04f6
L
12328 USED_REX (REX_W);
12329 if (rex & REX_W)
7967e09e 12330 oappend (names64[modrm.reg + add]);
252b5132 12331 else
f16cd0d5 12332 {
bc31405e
L
12333 if ((sizeflag & DFLAG)
12334 || (bytemode != v_mode && bytemode != movsxd_mode))
f16cd0d5
L
12335 oappend (names32[modrm.reg + add]);
12336 else
12337 oappend (names16[modrm.reg + add]);
12338 used_prefixes |= (prefixes & PREFIX_DATA);
12339 }
252b5132 12340 break;
c0a30a9f
L
12341 case va_mode:
12342 names = (address_mode == mode_64bit
12343 ? names64 : names32);
12344 if (!(prefixes & PREFIX_ADDR))
12345 {
12346 if (address_mode == mode_16bit)
12347 names = names16;
12348 }
12349 else
12350 {
12351 /* Remove "addr16/addr32". */
12352 all_prefixes[last_addr_prefix] = 0;
12353 names = (address_mode != mode_32bit
12354 ? names32 : names16);
12355 used_prefixes |= PREFIX_ADDR;
12356 }
12357 oappend (names[modrm.reg + add]);
12358 break;
90700ea2 12359 case m_mode:
cb712a9e 12360 if (address_mode == mode_64bit)
7967e09e 12361 oappend (names64[modrm.reg + add]);
90700ea2 12362 else
7967e09e 12363 oappend (names32[modrm.reg + add]);
90700ea2 12364 break;
1ba585e8 12365 case mask_bd_mode:
43234a1e 12366 case mask_mode:
9889cbb1
L
12367 if ((modrm.reg + add) > 0x7)
12368 {
12369 oappend ("(bad)");
12370 return;
12371 }
43234a1e
L
12372 oappend (names_mask[modrm.reg + add]);
12373 break;
252b5132
RH
12374 default:
12375 oappend (INTERNAL_DISASSEMBLER_ERROR);
12376 break;
12377 }
12378}
12379
52b15da3 12380static bfd_vma
26ca5450 12381get64 (void)
52b15da3 12382{
5dd0794d 12383 bfd_vma x;
52b15da3 12384#ifdef BFD64
5dd0794d
AM
12385 unsigned int a;
12386 unsigned int b;
12387
52b15da3
JH
12388 FETCH_DATA (the_info, codep + 8);
12389 a = *codep++ & 0xff;
12390 a |= (*codep++ & 0xff) << 8;
12391 a |= (*codep++ & 0xff) << 16;
070fe95d 12392 a |= (*codep++ & 0xffu) << 24;
5dd0794d 12393 b = *codep++ & 0xff;
52b15da3
JH
12394 b |= (*codep++ & 0xff) << 8;
12395 b |= (*codep++ & 0xff) << 16;
070fe95d 12396 b |= (*codep++ & 0xffu) << 24;
52b15da3
JH
12397 x = a + ((bfd_vma) b << 32);
12398#else
6608db57 12399 abort ();
5dd0794d 12400 x = 0;
52b15da3
JH
12401#endif
12402 return x;
12403}
12404
12405static bfd_signed_vma
26ca5450 12406get32 (void)
252b5132 12407{
52b15da3 12408 bfd_signed_vma x = 0;
252b5132
RH
12409
12410 FETCH_DATA (the_info, codep + 4);
52b15da3
JH
12411 x = *codep++ & (bfd_signed_vma) 0xff;
12412 x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
12413 x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
12414 x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
12415 return x;
12416}
12417
12418static bfd_signed_vma
26ca5450 12419get32s (void)
52b15da3
JH
12420{
12421 bfd_signed_vma x = 0;
12422
12423 FETCH_DATA (the_info, codep + 4);
12424 x = *codep++ & (bfd_signed_vma) 0xff;
12425 x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
12426 x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
12427 x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
12428
12429 x = (x ^ ((bfd_signed_vma) 1 << 31)) - ((bfd_signed_vma) 1 << 31);
12430
252b5132
RH
12431 return x;
12432}
12433
12434static int
26ca5450 12435get16 (void)
252b5132
RH
12436{
12437 int x = 0;
12438
12439 FETCH_DATA (the_info, codep + 2);
12440 x = *codep++ & 0xff;
12441 x |= (*codep++ & 0xff) << 8;
12442 return x;
12443}
12444
12445static void
26ca5450 12446set_op (bfd_vma op, int riprel)
252b5132
RH
12447{
12448 op_index[op_ad] = op_ad;
cb712a9e 12449 if (address_mode == mode_64bit)
7081ff04
AJ
12450 {
12451 op_address[op_ad] = op;
12452 op_riprel[op_ad] = riprel;
12453 }
12454 else
12455 {
12456 /* Mask to get a 32-bit address. */
12457 op_address[op_ad] = op & 0xffffffff;
12458 op_riprel[op_ad] = riprel & 0xffffffff;
12459 }
252b5132
RH
12460}
12461
12462static void
26ca5450 12463OP_REG (int code, int sizeflag)
252b5132 12464{
2da11e11 12465 const char *s;
9b60702d 12466 int add;
de882298
RM
12467
12468 switch (code)
12469 {
12470 case es_reg: case ss_reg: case cs_reg:
12471 case ds_reg: case fs_reg: case gs_reg:
12472 oappend (names_seg[code - es_reg]);
12473 return;
12474 }
12475
161a04f6
L
12476 USED_REX (REX_B);
12477 if (rex & REX_B)
52b15da3 12478 add = 8;
9b60702d
L
12479 else
12480 add = 0;
52b15da3
JH
12481
12482 switch (code)
12483 {
52b15da3
JH
12484 case ax_reg: case cx_reg: case dx_reg: case bx_reg:
12485 case sp_reg: case bp_reg: case si_reg: case di_reg:
12486 s = names16[code - ax_reg + add];
12487 break;
e184e611 12488 case ah_reg: case ch_reg: case dh_reg: case bh_reg:
52b15da3 12489 USED_REX (0);
e184e611
JB
12490 /* Fall through. */
12491 case al_reg: case cl_reg: case dl_reg: case bl_reg:
52b15da3
JH
12492 if (rex)
12493 s = names8rex[code - al_reg + add];
12494 else
12495 s = names8[code - al_reg];
12496 break;
6439fc28
AM
12497 case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
12498 case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
7bb15c6f 12499 if (address_mode == mode_64bit
6c067bbb 12500 && ((sizeflag & DFLAG) || (rex & REX_W)))
6439fc28
AM
12501 {
12502 s = names64[code - rAX_reg + add];
12503 break;
12504 }
12505 code += eAX_reg - rAX_reg;
6608db57 12506 /* Fall through. */
52b15da3
JH
12507 case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
12508 case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
161a04f6
L
12509 USED_REX (REX_W);
12510 if (rex & REX_W)
52b15da3 12511 s = names64[code - eAX_reg + add];
52b15da3 12512 else
f16cd0d5
L
12513 {
12514 if (sizeflag & DFLAG)
12515 s = names32[code - eAX_reg + add];
12516 else
12517 s = names16[code - eAX_reg + add];
12518 used_prefixes |= (prefixes & PREFIX_DATA);
12519 }
52b15da3 12520 break;
52b15da3
JH
12521 default:
12522 s = INTERNAL_DISASSEMBLER_ERROR;
12523 break;
12524 }
12525 oappend (s);
12526}
12527
12528static void
26ca5450 12529OP_IMREG (int code, int sizeflag)
52b15da3
JH
12530{
12531 const char *s;
252b5132
RH
12532
12533 switch (code)
12534 {
12535 case indir_dx_reg:
d708bcba 12536 if (intel_syntax)
52fd6d94 12537 s = "dx";
d708bcba 12538 else
db6eb5be 12539 s = "(%dx)";
252b5132 12540 break;
e8b5d5f9
JB
12541 case al_reg: case cl_reg:
12542 s = names8[code - al_reg];
252b5132 12543 break;
e8b5d5f9 12544 case eAX_reg:
161a04f6
L
12545 USED_REX (REX_W);
12546 if (rex & REX_W)
f16cd0d5 12547 {
e8b5d5f9
JB
12548 s = *names64;
12549 break;
f16cd0d5 12550 }
e8b5d5f9 12551 /* Fall through. */
52fd6d94 12552 case z_mode_ax_reg:
161a04f6 12553 if ((rex & REX_W) || (sizeflag & DFLAG))
52fd6d94
JB
12554 s = *names32;
12555 else
12556 s = *names16;
161a04f6 12557 if (!(rex & REX_W))
52fd6d94
JB
12558 used_prefixes |= (prefixes & PREFIX_DATA);
12559 break;
252b5132
RH
12560 default:
12561 s = INTERNAL_DISASSEMBLER_ERROR;
12562 break;
12563 }
12564 oappend (s);
12565}
12566
12567static void
26ca5450 12568OP_I (int bytemode, int sizeflag)
252b5132 12569{
52b15da3
JH
12570 bfd_signed_vma op;
12571 bfd_signed_vma mask = -1;
252b5132
RH
12572
12573 switch (bytemode)
12574 {
12575 case b_mode:
12576 FETCH_DATA (the_info, codep + 1);
52b15da3
JH
12577 op = *codep++;
12578 mask = 0xff;
12579 break;
252b5132 12580 case v_mode:
161a04f6
L
12581 USED_REX (REX_W);
12582 if (rex & REX_W)
52b15da3 12583 op = get32s ();
252b5132 12584 else
52b15da3 12585 {
f16cd0d5
L
12586 if (sizeflag & DFLAG)
12587 {
12588 op = get32 ();
12589 mask = 0xffffffff;
12590 }
12591 else
12592 {
12593 op = get16 ();
12594 mask = 0xfffff;
12595 }
12596 used_prefixes |= (prefixes & PREFIX_DATA);
52b15da3 12597 }
252b5132 12598 break;
c1dc7af5
JB
12599 case d_mode:
12600 mask = 0xffffffff;
12601 op = get32 ();
12602 break;
252b5132 12603 case w_mode:
52b15da3 12604 mask = 0xfffff;
252b5132
RH
12605 op = get16 ();
12606 break;
9306ca4a
JB
12607 case const_1_mode:
12608 if (intel_syntax)
6c067bbb 12609 oappend ("1");
9306ca4a 12610 return;
252b5132
RH
12611 default:
12612 oappend (INTERNAL_DISASSEMBLER_ERROR);
12613 return;
12614 }
12615
52b15da3
JH
12616 op &= mask;
12617 scratchbuf[0] = '$';
d708bcba 12618 print_operand_value (scratchbuf + 1, 1, op);
9ce09ba2 12619 oappend_maybe_intel (scratchbuf);
52b15da3
JH
12620 scratchbuf[0] = '\0';
12621}
12622
12623static void
26ca5450 12624OP_I64 (int bytemode, int sizeflag)
52b15da3 12625{
a280ab8e 12626 if (bytemode != v_mode || address_mode != mode_64bit || !(rex & REX_W))
6439fc28
AM
12627 {
12628 OP_I (bytemode, sizeflag);
12629 return;
12630 }
12631
a280ab8e 12632 USED_REX (REX_W);
52b15da3 12633
52b15da3 12634 scratchbuf[0] = '$';
a280ab8e 12635 print_operand_value (scratchbuf + 1, 1, get64 ());
9ce09ba2 12636 oappend_maybe_intel (scratchbuf);
252b5132
RH
12637 scratchbuf[0] = '\0';
12638}
12639
12640static void
26ca5450 12641OP_sI (int bytemode, int sizeflag)
252b5132 12642{
52b15da3 12643 bfd_signed_vma op;
252b5132
RH
12644
12645 switch (bytemode)
12646 {
12647 case b_mode:
e3949f17 12648 case b_T_mode:
252b5132
RH
12649 FETCH_DATA (the_info, codep + 1);
12650 op = *codep++;
12651 if ((op & 0x80) != 0)
12652 op -= 0x100;
e3949f17
L
12653 if (bytemode == b_T_mode)
12654 {
12655 if (address_mode != mode_64bit
7bb15c6f 12656 || !((sizeflag & DFLAG) || (rex & REX_W)))
e3949f17 12657 {
6c067bbb
RM
12658 /* The operand-size prefix is overridden by a REX prefix. */
12659 if ((sizeflag & DFLAG) || (rex & REX_W))
e3949f17
L
12660 op &= 0xffffffff;
12661 else
12662 op &= 0xffff;
12663 }
12664 }
12665 else
12666 {
12667 if (!(rex & REX_W))
12668 {
12669 if (sizeflag & DFLAG)
12670 op &= 0xffffffff;
12671 else
12672 op &= 0xffff;
12673 }
12674 }
252b5132
RH
12675 break;
12676 case v_mode:
7bb15c6f
RM
12677 /* The operand-size prefix is overridden by a REX prefix. */
12678 if ((sizeflag & DFLAG) || (rex & REX_W))
52b15da3 12679 op = get32s ();
252b5132 12680 else
d9e3625e 12681 op = get16 ();
252b5132
RH
12682 break;
12683 default:
12684 oappend (INTERNAL_DISASSEMBLER_ERROR);
12685 return;
12686 }
52b15da3
JH
12687
12688 scratchbuf[0] = '$';
12689 print_operand_value (scratchbuf + 1, 1, op);
9ce09ba2 12690 oappend_maybe_intel (scratchbuf);
252b5132
RH
12691}
12692
12693static void
26ca5450 12694OP_J (int bytemode, int sizeflag)
252b5132 12695{
52b15da3 12696 bfd_vma disp;
7081ff04 12697 bfd_vma mask = -1;
65ca155d 12698 bfd_vma segment = 0;
252b5132
RH
12699
12700 switch (bytemode)
12701 {
12702 case b_mode:
12703 FETCH_DATA (the_info, codep + 1);
12704 disp = *codep++;
12705 if ((disp & 0x80) != 0)
12706 disp -= 0x100;
12707 break;
12708 case v_mode:
d835a58b 12709 if (isa64 != intel64)
376cd056 12710 case dqw_mode:
5db04b09
L
12711 USED_REX (REX_W);
12712 if ((sizeflag & DFLAG)
12713 || (address_mode == mode_64bit
d835a58b 12714 && ((isa64 == intel64 && bytemode != dqw_mode)
376cd056 12715 || (rex & REX_W))))
52b15da3 12716 disp = get32s ();
252b5132
RH
12717 else
12718 {
12719 disp = get16 ();
206717e8
L
12720 if ((disp & 0x8000) != 0)
12721 disp -= 0x10000;
65ca155d
L
12722 /* In 16bit mode, address is wrapped around at 64k within
12723 the same segment. Otherwise, a data16 prefix on a jump
12724 instruction means that the pc is masked to 16 bits after
12725 the displacement is added! */
12726 mask = 0xffff;
12727 if ((prefixes & PREFIX_DATA) == 0)
4fd7268a 12728 segment = ((start_pc + (codep - start_codep))
65ca155d 12729 & ~((bfd_vma) 0xffff));
252b5132 12730 }
5db04b09 12731 if (address_mode != mode_64bit
d835a58b 12732 || (isa64 != intel64 && !(rex & REX_W)))
f16cd0d5 12733 used_prefixes |= (prefixes & PREFIX_DATA);
252b5132
RH
12734 break;
12735 default:
12736 oappend (INTERNAL_DISASSEMBLER_ERROR);
12737 return;
12738 }
42d5f9c6 12739 disp = ((start_pc + (codep - start_codep) + disp) & mask) | segment;
52b15da3
JH
12740 set_op (disp, 0);
12741 print_operand_value (scratchbuf, 1, disp);
252b5132
RH
12742 oappend (scratchbuf);
12743}
12744
252b5132 12745static void
ed7841b3 12746OP_SEG (int bytemode, int sizeflag)
252b5132 12747{
ed7841b3 12748 if (bytemode == w_mode)
7967e09e 12749 oappend (names_seg[modrm.reg]);
ed7841b3 12750 else
7967e09e 12751 OP_E (modrm.mod == 3 ? bytemode : w_mode, sizeflag);
252b5132
RH
12752}
12753
12754static void
26ca5450 12755OP_DIR (int dummy ATTRIBUTE_UNUSED, int sizeflag)
252b5132
RH
12756{
12757 int seg, offset;
12758
c608c12e 12759 if (sizeflag & DFLAG)
252b5132 12760 {
c608c12e
AM
12761 offset = get32 ();
12762 seg = get16 ();
252b5132 12763 }
c608c12e
AM
12764 else
12765 {
12766 offset = get16 ();
12767 seg = get16 ();
12768 }
7d421014 12769 used_prefixes |= (prefixes & PREFIX_DATA);
d708bcba 12770 if (intel_syntax)
3f31e633 12771 sprintf (scratchbuf, "0x%x:0x%x", seg, offset);
d708bcba
AM
12772 else
12773 sprintf (scratchbuf, "$0x%x,$0x%x", seg, offset);
c608c12e 12774 oappend (scratchbuf);
252b5132
RH
12775}
12776
252b5132 12777static void
3f31e633 12778OP_OFF (int bytemode, int sizeflag)
252b5132 12779{
52b15da3 12780 bfd_vma off;
252b5132 12781
3f31e633
JB
12782 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
12783 intel_operand_size (bytemode, sizeflag);
252b5132
RH
12784 append_seg ();
12785
cb712a9e 12786 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
252b5132
RH
12787 off = get32 ();
12788 else
12789 off = get16 ();
12790
12791 if (intel_syntax)
12792 {
285ca992 12793 if (!active_seg_prefix)
252b5132 12794 {
d708bcba 12795 oappend (names_seg[ds_reg - es_reg]);
252b5132
RH
12796 oappend (":");
12797 }
12798 }
52b15da3
JH
12799 print_operand_value (scratchbuf, 1, off);
12800 oappend (scratchbuf);
12801}
6439fc28 12802
52b15da3 12803static void
3f31e633 12804OP_OFF64 (int bytemode, int sizeflag)
52b15da3
JH
12805{
12806 bfd_vma off;
12807
539e75ad
L
12808 if (address_mode != mode_64bit
12809 || (prefixes & PREFIX_ADDR))
6439fc28
AM
12810 {
12811 OP_OFF (bytemode, sizeflag);
12812 return;
12813 }
12814
3f31e633
JB
12815 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
12816 intel_operand_size (bytemode, sizeflag);
52b15da3
JH
12817 append_seg ();
12818
6608db57 12819 off = get64 ();
52b15da3
JH
12820
12821 if (intel_syntax)
12822 {
285ca992 12823 if (!active_seg_prefix)
52b15da3 12824 {
d708bcba 12825 oappend (names_seg[ds_reg - es_reg]);
52b15da3
JH
12826 oappend (":");
12827 }
12828 }
12829 print_operand_value (scratchbuf, 1, off);
252b5132
RH
12830 oappend (scratchbuf);
12831}
12832
12833static void
26ca5450 12834ptr_reg (int code, int sizeflag)
252b5132 12835{
2da11e11 12836 const char *s;
d708bcba 12837
1d9f512f 12838 *obufp++ = open_char;
20f0a1fc 12839 used_prefixes |= (prefixes & PREFIX_ADDR);
cb712a9e 12840 if (address_mode == mode_64bit)
c1a64871
JH
12841 {
12842 if (!(sizeflag & AFLAG))
db6eb5be 12843 s = names32[code - eAX_reg];
c1a64871 12844 else
db6eb5be 12845 s = names64[code - eAX_reg];
c1a64871 12846 }
52b15da3 12847 else if (sizeflag & AFLAG)
252b5132
RH
12848 s = names32[code - eAX_reg];
12849 else
12850 s = names16[code - eAX_reg];
12851 oappend (s);
1d9f512f
AM
12852 *obufp++ = close_char;
12853 *obufp = 0;
252b5132
RH
12854}
12855
12856static void
26ca5450 12857OP_ESreg (int code, int sizeflag)
252b5132 12858{
9306ca4a 12859 if (intel_syntax)
52fd6d94
JB
12860 {
12861 switch (codep[-1])
12862 {
12863 case 0x6d: /* insw/insl */
12864 intel_operand_size (z_mode, sizeflag);
12865 break;
12866 case 0xa5: /* movsw/movsl/movsq */
12867 case 0xa7: /* cmpsw/cmpsl/cmpsq */
12868 case 0xab: /* stosw/stosl */
12869 case 0xaf: /* scasw/scasl */
12870 intel_operand_size (v_mode, sizeflag);
12871 break;
12872 default:
12873 intel_operand_size (b_mode, sizeflag);
12874 }
12875 }
9ce09ba2 12876 oappend_maybe_intel ("%es:");
252b5132
RH
12877 ptr_reg (code, sizeflag);
12878}
12879
12880static void
26ca5450 12881OP_DSreg (int code, int sizeflag)
252b5132 12882{
9306ca4a 12883 if (intel_syntax)
52fd6d94
JB
12884 {
12885 switch (codep[-1])
12886 {
12887 case 0x6f: /* outsw/outsl */
12888 intel_operand_size (z_mode, sizeflag);
12889 break;
12890 case 0xa5: /* movsw/movsl/movsq */
12891 case 0xa7: /* cmpsw/cmpsl/cmpsq */
12892 case 0xad: /* lodsw/lodsl/lodsq */
12893 intel_operand_size (v_mode, sizeflag);
12894 break;
12895 default:
12896 intel_operand_size (b_mode, sizeflag);
12897 }
12898 }
285ca992
L
12899 /* Set active_seg_prefix to PREFIX_DS if it is unset so that the
12900 default segment register DS is printed. */
12901 if (!active_seg_prefix)
12902 active_seg_prefix = PREFIX_DS;
6608db57 12903 append_seg ();
252b5132
RH
12904 ptr_reg (code, sizeflag);
12905}
12906
252b5132 12907static void
26ca5450 12908OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 12909{
9b60702d 12910 int add;
161a04f6 12911 if (rex & REX_R)
c4a530c5 12912 {
161a04f6 12913 USED_REX (REX_R);
c4a530c5
JB
12914 add = 8;
12915 }
cb712a9e 12916 else if (address_mode != mode_64bit && (prefixes & PREFIX_LOCK))
c4a530c5 12917 {
f16cd0d5 12918 all_prefixes[last_lock_prefix] = 0;
c4a530c5
JB
12919 used_prefixes |= PREFIX_LOCK;
12920 add = 8;
12921 }
9b60702d
L
12922 else
12923 add = 0;
7967e09e 12924 sprintf (scratchbuf, "%%cr%d", modrm.reg + add);
9ce09ba2 12925 oappend_maybe_intel (scratchbuf);
252b5132
RH
12926}
12927
252b5132 12928static void
26ca5450 12929OP_D (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 12930{
9b60702d 12931 int add;
161a04f6
L
12932 USED_REX (REX_R);
12933 if (rex & REX_R)
52b15da3 12934 add = 8;
9b60702d
L
12935 else
12936 add = 0;
d708bcba 12937 if (intel_syntax)
7967e09e 12938 sprintf (scratchbuf, "db%d", modrm.reg + add);
d708bcba 12939 else
7967e09e 12940 sprintf (scratchbuf, "%%db%d", modrm.reg + add);
252b5132
RH
12941 oappend (scratchbuf);
12942}
12943
252b5132 12944static void
26ca5450 12945OP_T (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 12946{
7967e09e 12947 sprintf (scratchbuf, "%%tr%d", modrm.reg);
9ce09ba2 12948 oappend_maybe_intel (scratchbuf);
252b5132
RH
12949}
12950
12951static void
6f74c397 12952OP_R (int bytemode, int sizeflag)
252b5132 12953{
68f34464
L
12954 /* Skip mod/rm byte. */
12955 MODRM_CHECK;
12956 codep++;
12957 OP_E_register (bytemode, sizeflag);
252b5132
RH
12958}
12959
12960static void
26ca5450 12961OP_MMX (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 12962{
b9733481
L
12963 int reg = modrm.reg;
12964 const char **names;
12965
041bd2e0
JH
12966 used_prefixes |= (prefixes & PREFIX_DATA);
12967 if (prefixes & PREFIX_DATA)
20f0a1fc 12968 {
b9733481 12969 names = names_xmm;
161a04f6
L
12970 USED_REX (REX_R);
12971 if (rex & REX_R)
b9733481 12972 reg += 8;
20f0a1fc 12973 }
041bd2e0 12974 else
b9733481
L
12975 names = names_mm;
12976 oappend (names[reg]);
252b5132
RH
12977}
12978
c608c12e 12979static void
c0f3af97 12980OP_XMM (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
c608c12e 12981{
b9733481
L
12982 int reg = modrm.reg;
12983 const char **names;
12984
161a04f6
L
12985 USED_REX (REX_R);
12986 if (rex & REX_R)
b9733481 12987 reg += 8;
43234a1e
L
12988 if (vex.evex)
12989 {
12990 if (!vex.r)
12991 reg += 16;
12992 }
12993
539f890d
L
12994 if (need_vex
12995 && bytemode != xmm_mode
43234a1e
L
12996 && bytemode != xmmq_mode
12997 && bytemode != evex_half_bcst_xmmq_mode
12998 && bytemode != ymm_mode
260cd341 12999 && bytemode != tmm_mode
539f890d 13000 && bytemode != scalar_mode)
c0f3af97
L
13001 {
13002 switch (vex.length)
13003 {
13004 case 128:
b9733481 13005 names = names_xmm;
c0f3af97
L
13006 break;
13007 case 256:
5fc35d96
IT
13008 if (vex.w
13009 || (bytemode != vex_vsib_q_w_dq_mode
13010 && bytemode != vex_vsib_q_w_d_mode))
6c30d220
L
13011 names = names_ymm;
13012 else
13013 names = names_xmm;
c0f3af97 13014 break;
43234a1e
L
13015 case 512:
13016 names = names_zmm;
13017 break;
c0f3af97
L
13018 default:
13019 abort ();
13020 }
13021 }
43234a1e
L
13022 else if (bytemode == xmmq_mode
13023 || bytemode == evex_half_bcst_xmmq_mode)
13024 {
13025 switch (vex.length)
13026 {
13027 case 128:
13028 case 256:
13029 names = names_xmm;
13030 break;
13031 case 512:
13032 names = names_ymm;
13033 break;
13034 default:
13035 abort ();
13036 }
13037 }
260cd341
LC
13038 else if (bytemode == tmm_mode)
13039 {
13040 modrm.reg = reg;
13041 if (reg >= 8)
13042 {
13043 oappend ("(bad)");
13044 return;
13045 }
13046 names = names_tmm;
13047 }
43234a1e
L
13048 else if (bytemode == ymm_mode)
13049 names = names_ymm;
c0f3af97 13050 else
b9733481
L
13051 names = names_xmm;
13052 oappend (names[reg]);
c608c12e
AM
13053}
13054
252b5132 13055static void
26ca5450 13056OP_EM (int bytemode, int sizeflag)
252b5132 13057{
b9733481
L
13058 int reg;
13059 const char **names;
13060
7967e09e 13061 if (modrm.mod != 3)
252b5132 13062 {
b6169b20
L
13063 if (intel_syntax
13064 && (bytemode == v_mode || bytemode == v_swap_mode))
9306ca4a
JB
13065 {
13066 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
13067 used_prefixes |= (prefixes & PREFIX_DATA);
6c067bbb 13068 }
252b5132
RH
13069 OP_E (bytemode, sizeflag);
13070 return;
13071 }
13072
b6169b20
L
13073 if ((sizeflag & SUFFIX_ALWAYS) && bytemode == v_swap_mode)
13074 swap_operand ();
13075
6608db57 13076 /* Skip mod/rm byte. */
4bba6815 13077 MODRM_CHECK;
252b5132 13078 codep++;
041bd2e0 13079 used_prefixes |= (prefixes & PREFIX_DATA);
b9733481 13080 reg = modrm.rm;
041bd2e0 13081 if (prefixes & PREFIX_DATA)
20f0a1fc 13082 {
b9733481 13083 names = names_xmm;
161a04f6
L
13084 USED_REX (REX_B);
13085 if (rex & REX_B)
b9733481 13086 reg += 8;
20f0a1fc 13087 }
041bd2e0 13088 else
b9733481
L
13089 names = names_mm;
13090 oappend (names[reg]);
252b5132
RH
13091}
13092
246c51aa
L
13093/* cvt* are the only instructions in sse2 which have
13094 both SSE and MMX operands and also have 0x66 prefix
13095 in their opcode. 0x66 was originally used to differentiate
13096 between SSE and MMX instruction(operands). So we have to handle the
4d9567e0
MM
13097 cvt* separately using OP_EMC and OP_MXC */
13098static void
13099OP_EMC (int bytemode, int sizeflag)
13100{
7967e09e 13101 if (modrm.mod != 3)
4d9567e0
MM
13102 {
13103 if (intel_syntax && bytemode == v_mode)
13104 {
13105 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
13106 used_prefixes |= (prefixes & PREFIX_DATA);
6c067bbb 13107 }
4d9567e0
MM
13108 OP_E (bytemode, sizeflag);
13109 return;
13110 }
246c51aa 13111
4d9567e0
MM
13112 /* Skip mod/rm byte. */
13113 MODRM_CHECK;
13114 codep++;
13115 used_prefixes |= (prefixes & PREFIX_DATA);
b9733481 13116 oappend (names_mm[modrm.rm]);
4d9567e0
MM
13117}
13118
13119static void
13120OP_MXC (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13121{
13122 used_prefixes |= (prefixes & PREFIX_DATA);
b9733481 13123 oappend (names_mm[modrm.reg]);
4d9567e0
MM
13124}
13125
c608c12e 13126static void
26ca5450 13127OP_EX (int bytemode, int sizeflag)
c608c12e 13128{
b9733481
L
13129 int reg;
13130 const char **names;
d6f574e0
L
13131
13132 /* Skip mod/rm byte. */
13133 MODRM_CHECK;
13134 codep++;
13135
7967e09e 13136 if (modrm.mod != 3)
c608c12e 13137 {
c1e679ec 13138 OP_E_memory (bytemode, sizeflag);
c608c12e
AM
13139 return;
13140 }
d6f574e0 13141
b9733481 13142 reg = modrm.rm;
161a04f6
L
13143 USED_REX (REX_B);
13144 if (rex & REX_B)
b9733481 13145 reg += 8;
43234a1e
L
13146 if (vex.evex)
13147 {
13148 USED_REX (REX_X);
13149 if ((rex & REX_X))
13150 reg += 16;
13151 }
c608c12e 13152
b6169b20 13153 if ((sizeflag & SUFFIX_ALWAYS)
fa99fab2
L
13154 && (bytemode == x_swap_mode
13155 || bytemode == d_swap_mode
41f5efc6 13156 || bytemode == q_swap_mode))
b6169b20
L
13157 swap_operand ();
13158
c0f3af97
L
13159 if (need_vex
13160 && bytemode != xmm_mode
6c30d220
L
13161 && bytemode != xmmdw_mode
13162 && bytemode != xmmqd_mode
13163 && bytemode != xmm_mb_mode
13164 && bytemode != xmm_mw_mode
13165 && bytemode != xmm_md_mode
13166 && bytemode != xmm_mq_mode
539f890d 13167 && bytemode != xmmq_mode
43234a1e
L
13168 && bytemode != evex_half_bcst_xmmq_mode
13169 && bytemode != ymm_mode
260cd341 13170 && bytemode != tmm_mode
1c480963 13171 && bytemode != vex_scalar_w_dq_mode)
c0f3af97
L
13172 {
13173 switch (vex.length)
13174 {
13175 case 128:
b9733481 13176 names = names_xmm;
c0f3af97
L
13177 break;
13178 case 256:
b9733481 13179 names = names_ymm;
c0f3af97 13180 break;
43234a1e
L
13181 case 512:
13182 names = names_zmm;
13183 break;
c0f3af97
L
13184 default:
13185 abort ();
13186 }
13187 }
43234a1e
L
13188 else if (bytemode == xmmq_mode
13189 || bytemode == evex_half_bcst_xmmq_mode)
13190 {
13191 switch (vex.length)
13192 {
13193 case 128:
13194 case 256:
13195 names = names_xmm;
13196 break;
13197 case 512:
13198 names = names_ymm;
13199 break;
13200 default:
13201 abort ();
13202 }
13203 }
260cd341
LC
13204 else if (bytemode == tmm_mode)
13205 {
13206 modrm.rm = reg;
13207 if (reg >= 8)
13208 {
13209 oappend ("(bad)");
13210 return;
13211 }
13212 names = names_tmm;
13213 }
43234a1e
L
13214 else if (bytemode == ymm_mode)
13215 names = names_ymm;
c0f3af97 13216 else
b9733481
L
13217 names = names_xmm;
13218 oappend (names[reg]);
c608c12e
AM
13219}
13220
252b5132 13221static void
26ca5450 13222OP_MS (int bytemode, int sizeflag)
252b5132 13223{
7967e09e 13224 if (modrm.mod == 3)
2da11e11
AM
13225 OP_EM (bytemode, sizeflag);
13226 else
6608db57 13227 BadOp ();
252b5132
RH
13228}
13229
992aaec9 13230static void
26ca5450 13231OP_XS (int bytemode, int sizeflag)
992aaec9 13232{
7967e09e 13233 if (modrm.mod == 3)
992aaec9
AM
13234 OP_EX (bytemode, sizeflag);
13235 else
6608db57 13236 BadOp ();
992aaec9
AM
13237}
13238
cc0ec051
AM
13239static void
13240OP_M (int bytemode, int sizeflag)
13241{
7967e09e 13242 if (modrm.mod == 3)
75413a22
L
13243 /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
13244 BadOp ();
cc0ec051
AM
13245 else
13246 OP_E (bytemode, sizeflag);
13247}
13248
13249static void
13250OP_0f07 (int bytemode, int sizeflag)
13251{
7967e09e 13252 if (modrm.mod != 3 || modrm.rm != 0)
cc0ec051
AM
13253 BadOp ();
13254 else
13255 OP_E (bytemode, sizeflag);
13256}
13257
46e883c5 13258/* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
246c51aa 13259 32bit mode and "xchg %rax,%rax" in 64bit mode. */
46e883c5 13260
cc0ec051 13261static void
46e883c5 13262NOP_Fixup1 (int bytemode, int sizeflag)
cc0ec051 13263{
8b38ad71
L
13264 if ((prefixes & PREFIX_DATA) != 0
13265 || (rex != 0
13266 && rex != 0x48
13267 && address_mode == mode_64bit))
46e883c5
L
13268 OP_REG (bytemode, sizeflag);
13269 else
13270 strcpy (obuf, "nop");
13271}
13272
13273static void
13274NOP_Fixup2 (int bytemode, int sizeflag)
13275{
8b38ad71
L
13276 if ((prefixes & PREFIX_DATA) != 0
13277 || (rex != 0
13278 && rex != 0x48
13279 && address_mode == mode_64bit))
46e883c5 13280 OP_IMREG (bytemode, sizeflag);
cc0ec051
AM
13281}
13282
84037f8c 13283static const char *const Suffix3DNow[] = {
252b5132
RH
13284/* 00 */ NULL, NULL, NULL, NULL,
13285/* 04 */ NULL, NULL, NULL, NULL,
13286/* 08 */ NULL, NULL, NULL, NULL,
9e525108 13287/* 0C */ "pi2fw", "pi2fd", NULL, NULL,
252b5132
RH
13288/* 10 */ NULL, NULL, NULL, NULL,
13289/* 14 */ NULL, NULL, NULL, NULL,
13290/* 18 */ NULL, NULL, NULL, NULL,
9e525108 13291/* 1C */ "pf2iw", "pf2id", NULL, NULL,
252b5132
RH
13292/* 20 */ NULL, NULL, NULL, NULL,
13293/* 24 */ NULL, NULL, NULL, NULL,
13294/* 28 */ NULL, NULL, NULL, NULL,
13295/* 2C */ NULL, NULL, NULL, NULL,
13296/* 30 */ NULL, NULL, NULL, NULL,
13297/* 34 */ NULL, NULL, NULL, NULL,
13298/* 38 */ NULL, NULL, NULL, NULL,
13299/* 3C */ NULL, NULL, NULL, NULL,
13300/* 40 */ NULL, NULL, NULL, NULL,
13301/* 44 */ NULL, NULL, NULL, NULL,
13302/* 48 */ NULL, NULL, NULL, NULL,
13303/* 4C */ NULL, NULL, NULL, NULL,
13304/* 50 */ NULL, NULL, NULL, NULL,
13305/* 54 */ NULL, NULL, NULL, NULL,
13306/* 58 */ NULL, NULL, NULL, NULL,
13307/* 5C */ NULL, NULL, NULL, NULL,
13308/* 60 */ NULL, NULL, NULL, NULL,
13309/* 64 */ NULL, NULL, NULL, NULL,
13310/* 68 */ NULL, NULL, NULL, NULL,
13311/* 6C */ NULL, NULL, NULL, NULL,
13312/* 70 */ NULL, NULL, NULL, NULL,
13313/* 74 */ NULL, NULL, NULL, NULL,
13314/* 78 */ NULL, NULL, NULL, NULL,
13315/* 7C */ NULL, NULL, NULL, NULL,
13316/* 80 */ NULL, NULL, NULL, NULL,
13317/* 84 */ NULL, NULL, NULL, NULL,
9e525108
AM
13318/* 88 */ NULL, NULL, "pfnacc", NULL,
13319/* 8C */ NULL, NULL, "pfpnacc", NULL,
252b5132
RH
13320/* 90 */ "pfcmpge", NULL, NULL, NULL,
13321/* 94 */ "pfmin", NULL, "pfrcp", "pfrsqrt",
13322/* 98 */ NULL, NULL, "pfsub", NULL,
13323/* 9C */ NULL, NULL, "pfadd", NULL,
13324/* A0 */ "pfcmpgt", NULL, NULL, NULL,
13325/* A4 */ "pfmax", NULL, "pfrcpit1", "pfrsqit1",
13326/* A8 */ NULL, NULL, "pfsubr", NULL,
13327/* AC */ NULL, NULL, "pfacc", NULL,
13328/* B0 */ "pfcmpeq", NULL, NULL, NULL,
9beff690 13329/* B4 */ "pfmul", NULL, "pfrcpit2", "pmulhrw",
9e525108 13330/* B8 */ NULL, NULL, NULL, "pswapd",
252b5132
RH
13331/* BC */ NULL, NULL, NULL, "pavgusb",
13332/* C0 */ NULL, NULL, NULL, NULL,
13333/* C4 */ NULL, NULL, NULL, NULL,
13334/* C8 */ NULL, NULL, NULL, NULL,
13335/* CC */ NULL, NULL, NULL, NULL,
13336/* D0 */ NULL, NULL, NULL, NULL,
13337/* D4 */ NULL, NULL, NULL, NULL,
13338/* D8 */ NULL, NULL, NULL, NULL,
13339/* DC */ NULL, NULL, NULL, NULL,
13340/* E0 */ NULL, NULL, NULL, NULL,
13341/* E4 */ NULL, NULL, NULL, NULL,
13342/* E8 */ NULL, NULL, NULL, NULL,
13343/* EC */ NULL, NULL, NULL, NULL,
13344/* F0 */ NULL, NULL, NULL, NULL,
13345/* F4 */ NULL, NULL, NULL, NULL,
13346/* F8 */ NULL, NULL, NULL, NULL,
13347/* FC */ NULL, NULL, NULL, NULL,
13348};
13349
13350static void
26ca5450 13351OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132
RH
13352{
13353 const char *mnemonic;
13354
13355 FETCH_DATA (the_info, codep + 1);
13356 /* AMD 3DNow! instructions are specified by an opcode suffix in the
13357 place where an 8-bit immediate would normally go. ie. the last
13358 byte of the instruction. */
ea397f5b 13359 obufp = mnemonicendp;
c608c12e 13360 mnemonic = Suffix3DNow[*codep++ & 0xff];
252b5132 13361 if (mnemonic)
2da11e11 13362 oappend (mnemonic);
252b5132
RH
13363 else
13364 {
13365 /* Since a variable sized modrm/sib chunk is between the start
13366 of the opcode (0x0f0f) and the opcode suffix, we need to do
13367 all the modrm processing first, and don't know until now that
13368 we have a bad opcode. This necessitates some cleaning up. */
ce518a5f
L
13369 op_out[0][0] = '\0';
13370 op_out[1][0] = '\0';
6608db57 13371 BadOp ();
252b5132 13372 }
ea397f5b 13373 mnemonicendp = obufp;
252b5132 13374}
c608c12e 13375
c4de7606 13376static const struct op simd_cmp_op[] =
ea397f5b
L
13377{
13378 { STRING_COMMA_LEN ("eq") },
13379 { STRING_COMMA_LEN ("lt") },
13380 { STRING_COMMA_LEN ("le") },
13381 { STRING_COMMA_LEN ("unord") },
13382 { STRING_COMMA_LEN ("neq") },
13383 { STRING_COMMA_LEN ("nlt") },
13384 { STRING_COMMA_LEN ("nle") },
13385 { STRING_COMMA_LEN ("ord") }
c608c12e
AM
13386};
13387
c4de7606
JB
13388static const struct op vex_cmp_op[] =
13389{
13390 { STRING_COMMA_LEN ("eq_uq") },
13391 { STRING_COMMA_LEN ("nge") },
13392 { STRING_COMMA_LEN ("ngt") },
13393 { STRING_COMMA_LEN ("false") },
13394 { STRING_COMMA_LEN ("neq_oq") },
13395 { STRING_COMMA_LEN ("ge") },
13396 { STRING_COMMA_LEN ("gt") },
13397 { STRING_COMMA_LEN ("true") },
13398 { STRING_COMMA_LEN ("eq_os") },
13399 { STRING_COMMA_LEN ("lt_oq") },
13400 { STRING_COMMA_LEN ("le_oq") },
13401 { STRING_COMMA_LEN ("unord_s") },
13402 { STRING_COMMA_LEN ("neq_us") },
13403 { STRING_COMMA_LEN ("nlt_uq") },
13404 { STRING_COMMA_LEN ("nle_uq") },
13405 { STRING_COMMA_LEN ("ord_s") },
13406 { STRING_COMMA_LEN ("eq_us") },
13407 { STRING_COMMA_LEN ("nge_uq") },
13408 { STRING_COMMA_LEN ("ngt_uq") },
13409 { STRING_COMMA_LEN ("false_os") },
13410 { STRING_COMMA_LEN ("neq_os") },
13411 { STRING_COMMA_LEN ("ge_oq") },
13412 { STRING_COMMA_LEN ("gt_oq") },
13413 { STRING_COMMA_LEN ("true_us") },
13414};
13415
c608c12e 13416static void
ad19981d 13417CMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
c608c12e
AM
13418{
13419 unsigned int cmp_type;
13420
13421 FETCH_DATA (the_info, codep + 1);
13422 cmp_type = *codep++ & 0xff;
c0f3af97 13423 if (cmp_type < ARRAY_SIZE (simd_cmp_op))
c608c12e 13424 {
ad19981d 13425 char suffix [3];
ea397f5b 13426 char *p = mnemonicendp - 2;
ad19981d
L
13427 suffix[0] = p[0];
13428 suffix[1] = p[1];
13429 suffix[2] = '\0';
ea397f5b
L
13430 sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
13431 mnemonicendp += simd_cmp_op[cmp_type].len;
c608c12e 13432 }
c4de7606
JB
13433 else if (need_vex
13434 && cmp_type < ARRAY_SIZE (simd_cmp_op) + ARRAY_SIZE (vex_cmp_op))
13435 {
13436 char suffix [3];
13437 char *p = mnemonicendp - 2;
13438 suffix[0] = p[0];
13439 suffix[1] = p[1];
13440 suffix[2] = '\0';
13441 cmp_type -= ARRAY_SIZE (simd_cmp_op);
13442 sprintf (p, "%s%s", vex_cmp_op[cmp_type].name, suffix);
13443 mnemonicendp += vex_cmp_op[cmp_type].len;
13444 }
c608c12e
AM
13445 else
13446 {
ad19981d
L
13447 /* We have a reserved extension byte. Output it directly. */
13448 scratchbuf[0] = '$';
13449 print_operand_value (scratchbuf + 1, 1, cmp_type);
9ce09ba2 13450 oappend_maybe_intel (scratchbuf);
ad19981d 13451 scratchbuf[0] = '\0';
c608c12e
AM
13452 }
13453}
13454
9916071f 13455static void
7abb8d81 13456OP_Mwait (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
9916071f 13457{
7abb8d81 13458 /* mwait %eax,%ecx / mwaitx %eax,%ecx,%ebx */
b844680a
L
13459 if (!intel_syntax)
13460 {
081e283f
JB
13461 strcpy (op_out[0], names32[0]);
13462 strcpy (op_out[1], names32[1]);
7abb8d81 13463 if (bytemode == eBX_reg)
081e283f 13464 strcpy (op_out[2], names32[3]);
b844680a
L
13465 two_source_ops = 1;
13466 }
13467 /* Skip mod/rm byte. */
13468 MODRM_CHECK;
13469 codep++;
13470}
13471
13472static void
13473OP_Monitor (int bytemode ATTRIBUTE_UNUSED,
13474 int sizeflag ATTRIBUTE_UNUSED)
ca164297 13475{
081e283f 13476 /* monitor %{e,r,}ax,%ecx,%edx" */
b844680a 13477 if (!intel_syntax)
ca164297 13478 {
cb712a9e
L
13479 const char **names = (address_mode == mode_64bit
13480 ? names64 : names32);
1d9f512f 13481
081e283f 13482 if (prefixes & PREFIX_ADDR)
ca164297 13483 {
b844680a 13484 /* Remove "addr16/addr32". */
f16cd0d5 13485 all_prefixes[last_addr_prefix] = 0;
081e283f
JB
13486 names = (address_mode != mode_32bit
13487 ? names32 : names16);
b844680a 13488 used_prefixes |= PREFIX_ADDR;
ca164297 13489 }
081e283f
JB
13490 else if (address_mode == mode_16bit)
13491 names = names16;
13492 strcpy (op_out[0], names[0]);
13493 strcpy (op_out[1], names32[1]);
13494 strcpy (op_out[2], names32[2]);
b844680a 13495 two_source_ops = 1;
ca164297 13496 }
b844680a
L
13497 /* Skip mod/rm byte. */
13498 MODRM_CHECK;
13499 codep++;
30123838
JB
13500}
13501
6608db57
KH
13502static void
13503BadOp (void)
2da11e11 13504{
6608db57
KH
13505 /* Throw away prefixes and 1st. opcode byte. */
13506 codep = insn_codep + 1;
2da11e11
AM
13507 oappend ("(bad)");
13508}
4cc91dba 13509
35c52694
L
13510static void
13511REP_Fixup (int bytemode, int sizeflag)
13512{
13513 /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
13514 lods and stos. */
35c52694 13515 if (prefixes & PREFIX_REPZ)
f16cd0d5 13516 all_prefixes[last_repz_prefix] = REP_PREFIX;
35c52694
L
13517
13518 switch (bytemode)
13519 {
13520 case al_reg:
13521 case eAX_reg:
13522 case indir_dx_reg:
13523 OP_IMREG (bytemode, sizeflag);
13524 break;
13525 case eDI_reg:
13526 OP_ESreg (bytemode, sizeflag);
13527 break;
13528 case eSI_reg:
13529 OP_DSreg (bytemode, sizeflag);
13530 break;
13531 default:
13532 abort ();
13533 break;
13534 }
13535}
f5804c90 13536
d835a58b
JB
13537static void
13538SEP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13539{
13540 if ( isa64 != amd64 )
13541 return;
13542
13543 obufp = obuf;
13544 BadOp ();
13545 mnemonicendp = obufp;
13546 ++codep;
13547}
13548
7e8b059b
L
13549/* For BND-prefixed instructions 0xF2 prefix should be displayed as
13550 "bnd". */
13551
13552static void
13553BND_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13554{
13555 if (prefixes & PREFIX_REPNZ)
13556 all_prefixes[last_repnz_prefix] = BND_PREFIX;
13557}
13558
04ef582a
L
13559/* For NOTRACK-prefixed instructions, 0x3E prefix should be displayed as
13560 "notrack". */
13561
13562static void
13563NOTRACK_Fixup (int bytemode ATTRIBUTE_UNUSED,
13564 int sizeflag ATTRIBUTE_UNUSED)
13565{
9fef80d6 13566 if (active_seg_prefix == PREFIX_DS
04ef582a
L
13567 && (address_mode != mode_64bit || last_data_prefix < 0))
13568 {
4e9ac44a 13569 /* NOTRACK prefix is only valid on indirect branch instructions.
9fef80d6 13570 NB: DATA prefix is unsupported for Intel64. */
04ef582a
L
13571 active_seg_prefix = 0;
13572 all_prefixes[last_seg_prefix] = NOTRACK_PREFIX;
13573 }
13574}
13575
42164a71
L
13576/* Similar to OP_E. But the 0xf2/0xf3 prefixes should be displayed as
13577 "xacquire"/"xrelease" for memory operand if there is a LOCK prefix.
13578 */
13579
13580static void
13581HLE_Fixup1 (int bytemode, int sizeflag)
13582{
13583 if (modrm.mod != 3
13584 && (prefixes & PREFIX_LOCK) != 0)
13585 {
13586 if (prefixes & PREFIX_REPZ)
13587 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
13588 if (prefixes & PREFIX_REPNZ)
13589 all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
13590 }
13591
13592 OP_E (bytemode, sizeflag);
13593}
13594
13595/* Similar to OP_E. But the 0xf2/0xf3 prefixes should be displayed as
13596 "xacquire"/"xrelease" for memory operand. No check for LOCK prefix.
13597 */
13598
13599static void
13600HLE_Fixup2 (int bytemode, int sizeflag)
13601{
13602 if (modrm.mod != 3)
13603 {
13604 if (prefixes & PREFIX_REPZ)
13605 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
13606 if (prefixes & PREFIX_REPNZ)
13607 all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
13608 }
13609
13610 OP_E (bytemode, sizeflag);
13611}
13612
13613/* Similar to OP_E. But the 0xf3 prefixes should be displayed as
13614 "xrelease" for memory operand. No check for LOCK prefix. */
13615
13616static void
13617HLE_Fixup3 (int bytemode, int sizeflag)
13618{
13619 if (modrm.mod != 3
13620 && last_repz_prefix > last_repnz_prefix
13621 && (prefixes & PREFIX_REPZ) != 0)
13622 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
13623
13624 OP_E (bytemode, sizeflag);
13625}
13626
f5804c90
L
13627static void
13628CMPXCHG8B_Fixup (int bytemode, int sizeflag)
13629{
161a04f6
L
13630 USED_REX (REX_W);
13631 if (rex & REX_W)
f5804c90
L
13632 {
13633 /* Change cmpxchg8b to cmpxchg16b. */
ea397f5b
L
13634 char *p = mnemonicendp - 2;
13635 mnemonicendp = stpcpy (p, "16b");
fb9c77c7 13636 bytemode = o_mode;
f5804c90 13637 }
42164a71
L
13638 else if ((prefixes & PREFIX_LOCK) != 0)
13639 {
13640 if (prefixes & PREFIX_REPZ)
13641 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
13642 if (prefixes & PREFIX_REPNZ)
13643 all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
13644 }
13645
f5804c90
L
13646 OP_M (bytemode, sizeflag);
13647}
42903f7f
L
13648
13649static void
13650XMM_Fixup (int reg, int sizeflag ATTRIBUTE_UNUSED)
13651{
b9733481
L
13652 const char **names;
13653
c0f3af97
L
13654 if (need_vex)
13655 {
13656 switch (vex.length)
13657 {
13658 case 128:
b9733481 13659 names = names_xmm;
c0f3af97
L
13660 break;
13661 case 256:
b9733481 13662 names = names_ymm;
c0f3af97
L
13663 break;
13664 default:
13665 abort ();
13666 }
13667 }
13668 else
b9733481
L
13669 names = names_xmm;
13670 oappend (names[reg]);
42903f7f 13671}
381d071f
L
13672
13673static void
eacc9c89
L
13674FXSAVE_Fixup (int bytemode, int sizeflag)
13675{
13676 /* Add proper suffix to "fxsave" and "fxrstor". */
13677 USED_REX (REX_W);
13678 if (rex & REX_W)
13679 {
13680 char *p = mnemonicendp;
13681 *p++ = '6';
13682 *p++ = '4';
13683 *p = '\0';
13684 mnemonicendp = p;
13685 }
13686 OP_M (bytemode, sizeflag);
15c7c1d8
JB
13687}
13688
c0f3af97
L
13689/* Display the destination register operand for instructions with
13690 VEX. */
13691
13692static void
13693OP_VEX (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13694{
539f890d 13695 int reg;
b9733481
L
13696 const char **names;
13697
c0f3af97
L
13698 if (!need_vex)
13699 abort ();
13700
539f890d 13701 reg = vex.register_specifier;
63c6fc6c 13702 vex.register_specifier = 0;
5f847646
JB
13703 if (address_mode != mode_64bit)
13704 reg &= 7;
13705 else if (vex.evex && !vex.v)
13706 reg += 16;
43234a1e 13707
539f890d
L
13708 if (bytemode == vex_scalar_mode)
13709 {
13710 oappend (names_xmm[reg]);
13711 return;
13712 }
13713
260cd341
LC
13714 if (bytemode == tmm_mode)
13715 {
13716 /* All 3 TMM registers must be distinct. */
13717 if (reg >= 8)
13718 oappend ("(bad)");
13719 else
13720 {
13721 /* This must be the 3rd operand. */
13722 if (obufp != op_out[2])
13723 abort ();
13724 oappend (names_tmm[reg]);
13725 if (reg == modrm.reg || reg == modrm.rm)
13726 strcpy (obufp, "/(bad)");
13727 }
13728
13729 if (modrm.reg == modrm.rm || modrm.reg == reg || modrm.rm == reg)
13730 {
13731 if (modrm.reg <= 8
13732 && (modrm.reg == modrm.rm || modrm.reg == reg))
13733 strcat (op_out[0], "/(bad)");
13734 if (modrm.rm <= 8
13735 && (modrm.rm == modrm.reg || modrm.rm == reg))
13736 strcat (op_out[1], "/(bad)");
13737 }
13738
13739 return;
13740 }
13741
c0f3af97
L
13742 switch (vex.length)
13743 {
13744 case 128:
13745 switch (bytemode)
13746 {
13747 case vex_mode:
6c30d220 13748 case vex_vsib_q_w_dq_mode:
5fc35d96 13749 case vex_vsib_q_w_d_mode:
cb21baef
L
13750 names = names_xmm;
13751 break;
13752 case dq_mode:
390a6789 13753 if (rex & REX_W)
cb21baef
L
13754 names = names64;
13755 else
13756 names = names32;
c0f3af97 13757 break;
1ba585e8 13758 case mask_bd_mode:
43234a1e 13759 case mask_mode:
9889cbb1
L
13760 if (reg > 0x7)
13761 {
13762 oappend ("(bad)");
13763 return;
13764 }
43234a1e
L
13765 names = names_mask;
13766 break;
c0f3af97
L
13767 default:
13768 abort ();
13769 return;
13770 }
c0f3af97
L
13771 break;
13772 case 256:
13773 switch (bytemode)
13774 {
13775 case vex_mode:
6c30d220
L
13776 names = names_ymm;
13777 break;
13778 case vex_vsib_q_w_dq_mode:
5fc35d96 13779 case vex_vsib_q_w_d_mode:
6c30d220 13780 names = vex.w ? names_ymm : names_xmm;
c0f3af97 13781 break;
1ba585e8 13782 case mask_bd_mode:
43234a1e 13783 case mask_mode:
9889cbb1
L
13784 if (reg > 0x7)
13785 {
13786 oappend ("(bad)");
13787 return;
13788 }
43234a1e
L
13789 names = names_mask;
13790 break;
c0f3af97 13791 default:
a37a2806
NC
13792 /* See PR binutils/20893 for a reproducer. */
13793 oappend ("(bad)");
c0f3af97
L
13794 return;
13795 }
c0f3af97 13796 break;
43234a1e
L
13797 case 512:
13798 names = names_zmm;
13799 break;
c0f3af97
L
13800 default:
13801 abort ();
13802 break;
13803 }
539f890d 13804 oappend (names[reg]);
c0f3af97
L
13805}
13806
41f5efc6
JB
13807static void
13808OP_VexR (int bytemode, int sizeflag)
13809{
13810 if (modrm.mod == 3)
13811 OP_VEX (bytemode, sizeflag);
13812}
13813
5dd85c99 13814static void
e6123d0c 13815OP_VexW (int bytemode, int sizeflag)
5dd85c99 13816{
e6123d0c 13817 OP_VEX (bytemode, sizeflag);
5dd85c99 13818
5dd85c99 13819 if (vex.w)
5f847646 13820 {
e6123d0c
JB
13821 /* Swap 2nd and 3rd operands. */
13822 strcpy (scratchbuf, op_out[2]);
13823 strcpy (op_out[2], op_out[1]);
13824 strcpy (op_out[1], scratchbuf);
5f847646 13825 }
5dd85c99
SP
13826}
13827
c0f3af97
L
13828static void
13829OP_REG_VexI4 (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13830{
13831 int reg;
6384fd9e 13832 const char **names = names_xmm;
b9733481 13833
c0f3af97
L
13834 FETCH_DATA (the_info, codep + 1);
13835 reg = *codep++;
13836
6384fd9e 13837 if (bytemode != x_mode && bytemode != scalar_mode)
c0f3af97
L
13838 abort ();
13839
c0f3af97 13840 reg >>= 4;
5f847646
JB
13841 if (address_mode != mode_64bit)
13842 reg &= 7;
dae39acc 13843
6384fd9e
JB
13844 if (bytemode == x_mode && vex.length == 256)
13845 names = names_ymm;
13846
b9733481 13847 oappend (names[reg]);
b13b1bc0
JB
13848
13849 if (vex.w)
13850 {
13851 /* Swap 3rd and 4th operands. */
13852 strcpy (scratchbuf, op_out[3]);
13853 strcpy (op_out[3], op_out[2]);
13854 strcpy (op_out[2], scratchbuf);
13855 }
c0f3af97
L
13856}
13857
922d8de8 13858static void
93abb146
JB
13859OP_VexI4 (int bytemode ATTRIBUTE_UNUSED,
13860 int sizeflag ATTRIBUTE_UNUSED)
922d8de8 13861{
93abb146
JB
13862 scratchbuf[0] = '$';
13863 print_operand_value (scratchbuf + 1, 1, codep[-1] & 0xf);
13864 oappend_maybe_intel (scratchbuf);
922d8de8
DR
13865}
13866
43234a1e
L
13867static void
13868VPCMP_Fixup (int bytemode ATTRIBUTE_UNUSED,
13869 int sizeflag ATTRIBUTE_UNUSED)
13870{
13871 unsigned int cmp_type;
13872
13873 if (!vex.evex)
13874 abort ();
13875
13876 FETCH_DATA (the_info, codep + 1);
13877 cmp_type = *codep++ & 0xff;
13878 /* There are aliases for immediates 0, 1, 2, 4, 5, 6.
13879 If it's the case, print suffix, otherwise - print the immediate. */
13880 if (cmp_type < ARRAY_SIZE (simd_cmp_op)
13881 && cmp_type != 3
13882 && cmp_type != 7)
13883 {
13884 char suffix [3];
13885 char *p = mnemonicendp - 2;
13886
13887 /* vpcmp* can have both one- and two-lettered suffix. */
13888 if (p[0] == 'p')
13889 {
13890 p++;
13891 suffix[0] = p[0];
13892 suffix[1] = '\0';
13893 }
13894 else
13895 {
13896 suffix[0] = p[0];
13897 suffix[1] = p[1];
13898 suffix[2] = '\0';
13899 }
13900
13901 sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
13902 mnemonicendp += simd_cmp_op[cmp_type].len;
13903 }
be92cb14
JB
13904 else
13905 {
13906 /* We have a reserved extension byte. Output it directly. */
13907 scratchbuf[0] = '$';
13908 print_operand_value (scratchbuf + 1, 1, cmp_type);
13909 oappend_maybe_intel (scratchbuf);
13910 scratchbuf[0] = '\0';
13911 }
13912}
13913
13914static const struct op xop_cmp_op[] =
13915{
13916 { STRING_COMMA_LEN ("lt") },
13917 { STRING_COMMA_LEN ("le") },
13918 { STRING_COMMA_LEN ("gt") },
13919 { STRING_COMMA_LEN ("ge") },
13920 { STRING_COMMA_LEN ("eq") },
13921 { STRING_COMMA_LEN ("neq") },
13922 { STRING_COMMA_LEN ("false") },
13923 { STRING_COMMA_LEN ("true") }
13924};
13925
13926static void
13927VPCOM_Fixup (int bytemode ATTRIBUTE_UNUSED,
13928 int sizeflag ATTRIBUTE_UNUSED)
13929{
13930 unsigned int cmp_type;
13931
13932 FETCH_DATA (the_info, codep + 1);
13933 cmp_type = *codep++ & 0xff;
13934 if (cmp_type < ARRAY_SIZE (xop_cmp_op))
13935 {
13936 char suffix[3];
13937 char *p = mnemonicendp - 2;
13938
13939 /* vpcom* can have both one- and two-lettered suffix. */
13940 if (p[0] == 'm')
13941 {
13942 p++;
13943 suffix[0] = p[0];
13944 suffix[1] = '\0';
13945 }
13946 else
13947 {
13948 suffix[0] = p[0];
13949 suffix[1] = p[1];
13950 suffix[2] = '\0';
13951 }
13952
13953 sprintf (p, "%s%s", xop_cmp_op[cmp_type].name, suffix);
13954 mnemonicendp += xop_cmp_op[cmp_type].len;
13955 }
43234a1e
L
13956 else
13957 {
13958 /* We have a reserved extension byte. Output it directly. */
13959 scratchbuf[0] = '$';
13960 print_operand_value (scratchbuf + 1, 1, cmp_type);
9ce09ba2 13961 oappend_maybe_intel (scratchbuf);
43234a1e
L
13962 scratchbuf[0] = '\0';
13963 }
13964}
13965
ea397f5b
L
13966static const struct op pclmul_op[] =
13967{
13968 { STRING_COMMA_LEN ("lql") },
13969 { STRING_COMMA_LEN ("hql") },
13970 { STRING_COMMA_LEN ("lqh") },
13971 { STRING_COMMA_LEN ("hqh") }
c0f3af97
L
13972};
13973
13974static void
13975PCLMUL_Fixup (int bytemode ATTRIBUTE_UNUSED,
13976 int sizeflag ATTRIBUTE_UNUSED)
13977{
13978 unsigned int pclmul_type;
13979
13980 FETCH_DATA (the_info, codep + 1);
13981 pclmul_type = *codep++ & 0xff;
13982 switch (pclmul_type)
13983 {
13984 case 0x10:
13985 pclmul_type = 2;
13986 break;
13987 case 0x11:
13988 pclmul_type = 3;
13989 break;
13990 default:
13991 break;
7bb15c6f 13992 }
c0f3af97
L
13993 if (pclmul_type < ARRAY_SIZE (pclmul_op))
13994 {
13995 char suffix [4];
ea397f5b 13996 char *p = mnemonicendp - 3;
c0f3af97
L
13997 suffix[0] = p[0];
13998 suffix[1] = p[1];
13999 suffix[2] = p[2];
14000 suffix[3] = '\0';
ea397f5b
L
14001 sprintf (p, "%s%s", pclmul_op[pclmul_type].name, suffix);
14002 mnemonicendp += pclmul_op[pclmul_type].len;
c0f3af97
L
14003 }
14004 else
14005 {
14006 /* We have a reserved extension byte. Output it directly. */
14007 scratchbuf[0] = '$';
14008 print_operand_value (scratchbuf + 1, 1, pclmul_type);
9ce09ba2 14009 oappend_maybe_intel (scratchbuf);
c0f3af97
L
14010 scratchbuf[0] = '\0';
14011 }
14012}
14013
bc31405e
L
14014static void
14015MOVSXD_Fixup (int bytemode, int sizeflag)
14016{
14017 /* Add proper suffix to "movsxd". */
14018 char *p = mnemonicendp;
14019
14020 switch (bytemode)
14021 {
14022 case movsxd_mode:
14023 if (intel_syntax)
14024 {
14025 *p++ = 'x';
14026 *p++ = 'd';
14027 goto skip;
14028 }
14029
14030 USED_REX (REX_W);
14031 if (rex & REX_W)
14032 {
14033 *p++ = 'l';
14034 *p++ = 'q';
14035 }
14036 else
14037 {
14038 *p++ = 'x';
14039 *p++ = 'd';
14040 }
14041 break;
14042 default:
14043 oappend (INTERNAL_DISASSEMBLER_ERROR);
14044 break;
14045 }
14046
dc1e8a47 14047 skip:
bc31405e
L
14048 mnemonicendp = p;
14049 *p = '\0';
14050 OP_E (bytemode, sizeflag);
14051}
14052
43234a1e
L
14053static void
14054OP_Mask (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
14055{
14056 if (!vex.evex
1ba585e8 14057 || (bytemode != mask_mode && bytemode != mask_bd_mode))
43234a1e
L
14058 abort ();
14059
14060 USED_REX (REX_R);
14061 if ((rex & REX_R) != 0 || !vex.r)
14062 {
14063 BadOp ();
14064 return;
14065 }
14066
14067 oappend (names_mask [modrm.reg]);
14068}
14069
14070static void
14071OP_Rounding (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
14072{
43234a1e
L
14073 if (modrm.mod == 3 && vex.b)
14074 switch (bytemode)
14075 {
70df6fc9
L
14076 case evex_rounding_64_mode:
14077 if (address_mode != mode_64bit)
14078 {
14079 oappend ("(bad)");
14080 break;
14081 }
14082 /* Fall through. */
43234a1e
L
14083 case evex_rounding_mode:
14084 oappend (names_rounding[vex.ll]);
14085 break;
14086 case evex_sae_mode:
14087 oappend ("{sae}");
14088 break;
14089 default:
6df22cf6 14090 abort ();
43234a1e
L
14091 break;
14092 }
14093}
This page took 4.924055 seconds and 4 git commands to generate.