x86: correctly handle VMOVD with EVEX.W set outside of 64-bit mode
[deliverable/binutils-gdb.git] / opcodes / i386-dis.c
1 /* Print i386 instructions for GDB, the GNU debugger.
2 Copyright (C) 1988-2018 Free Software Foundation, Inc.
3
4 This file is part of the GNU opcodes library.
5
6 This library is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
9 any later version.
10
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.
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
18 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19 MA 02110-1301, USA. */
20
21
22 /* 80386 instruction printer by Pace Willisson (pace@prep.ai.mit.edu)
23 July 1988
24 modified by John Hassey (hassey@dg-rtp.dg.com)
25 x86-64 support added by Jan Hubicka (jh@suse.cz)
26 VIA PadLock support by Michal Ludvig (mludvig@suse.cz). */
27
28 /* The main tables describing the instructions is essentially a copy
29 of the "Opcode Map" chapter (Appendix A) of the Intel 80386
30 Programmers Manual. Usually, there is a capital letter, followed
31 by a small letter. The capital letter tell the addressing mode,
32 and the small letter tells about the operand size. Refer to
33 the Intel manual for details. */
34
35 #include "sysdep.h"
36 #include "disassemble.h"
37 #include "opintl.h"
38 #include "opcode/i386.h"
39 #include "libiberty.h"
40
41 #include <setjmp.h>
42
43 static int print_insn (bfd_vma, disassemble_info *);
44 static void dofloat (int);
45 static void OP_ST (int, int);
46 static void OP_STi (int, int);
47 static int putop (const char *, int);
48 static void oappend (const char *);
49 static void append_seg (void);
50 static void OP_indirE (int, int);
51 static void print_operand_value (char *, int, bfd_vma);
52 static void OP_E_register (int, int);
53 static void OP_E_memory (int, int);
54 static void print_displacement (char *, bfd_vma);
55 static void OP_E (int, int);
56 static void OP_G (int, int);
57 static bfd_vma get64 (void);
58 static bfd_signed_vma get32 (void);
59 static bfd_signed_vma get32s (void);
60 static int get16 (void);
61 static void set_op (bfd_vma, int);
62 static void OP_Skip_MODRM (int, int);
63 static void OP_REG (int, int);
64 static void OP_IMREG (int, int);
65 static void OP_I (int, int);
66 static void OP_I64 (int, int);
67 static void OP_sI (int, int);
68 static void OP_J (int, int);
69 static void OP_SEG (int, int);
70 static void OP_DIR (int, int);
71 static void OP_OFF (int, int);
72 static void OP_OFF64 (int, int);
73 static void ptr_reg (int, int);
74 static void OP_ESreg (int, int);
75 static void OP_DSreg (int, int);
76 static void OP_C (int, int);
77 static void OP_D (int, int);
78 static void OP_T (int, int);
79 static void OP_R (int, int);
80 static void OP_MMX (int, int);
81 static void OP_XMM (int, int);
82 static void OP_EM (int, int);
83 static void OP_EX (int, int);
84 static void OP_EMC (int,int);
85 static void OP_MXC (int,int);
86 static void OP_MS (int, int);
87 static void OP_XS (int, int);
88 static void OP_M (int, int);
89 static void OP_VEX (int, int);
90 static void OP_EX_Vex (int, int);
91 static void OP_EX_VexW (int, int);
92 static void OP_EX_VexImmW (int, int);
93 static void OP_XMM_Vex (int, int);
94 static void OP_XMM_VexW (int, int);
95 static void OP_Rounding (int, int);
96 static void OP_REG_VexI4 (int, int);
97 static void PCLMUL_Fixup (int, int);
98 static void VCMP_Fixup (int, int);
99 static void VPCMP_Fixup (int, int);
100 static void VPCOM_Fixup (int, int);
101 static void OP_0f07 (int, int);
102 static void OP_Monitor (int, int);
103 static void OP_Mwait (int, int);
104 static void OP_Mwaitx (int, int);
105 static void NOP_Fixup1 (int, int);
106 static void NOP_Fixup2 (int, int);
107 static void OP_3DNowSuffix (int, int);
108 static void CMP_Fixup (int, int);
109 static void BadOp (void);
110 static void REP_Fixup (int, int);
111 static void BND_Fixup (int, int);
112 static void NOTRACK_Fixup (int, int);
113 static void HLE_Fixup1 (int, int);
114 static void HLE_Fixup2 (int, int);
115 static void HLE_Fixup3 (int, int);
116 static void CMPXCHG8B_Fixup (int, int);
117 static void XMM_Fixup (int, int);
118 static void CRC32_Fixup (int, int);
119 static void FXSAVE_Fixup (int, int);
120 static void PCMPESTR_Fixup (int, int);
121 static void OP_LWPCB_E (int, int);
122 static void OP_LWP_E (int, int);
123 static void OP_Vex_2src_1 (int, int);
124 static void OP_Vex_2src_2 (int, int);
125
126 static void MOVBE_Fixup (int, int);
127
128 static void OP_Mask (int, int);
129
130 struct dis_private {
131 /* Points to first byte not fetched. */
132 bfd_byte *max_fetched;
133 bfd_byte the_buffer[MAX_MNEM_SIZE];
134 bfd_vma insn_start;
135 int orig_sizeflag;
136 OPCODES_SIGJMP_BUF bailout;
137 };
138
139 enum address_mode
140 {
141 mode_16bit,
142 mode_32bit,
143 mode_64bit
144 };
145
146 enum address_mode address_mode;
147
148 /* Flags for the prefixes for the current instruction. See below. */
149 static int prefixes;
150
151 /* REX prefix the current instruction. See below. */
152 static int rex;
153 /* Bits of REX we've already used. */
154 static int rex_used;
155 /* REX bits in original REX prefix ignored. */
156 static int rex_ignored;
157 /* Mark parts used in the REX prefix. When we are testing for
158 empty prefix (for 8bit register REX extension), just mask it
159 out. Otherwise test for REX bit is excuse for existence of REX
160 only in case value is nonzero. */
161 #define USED_REX(value) \
162 { \
163 if (value) \
164 { \
165 if ((rex & value)) \
166 rex_used |= (value) | REX_OPCODE; \
167 } \
168 else \
169 rex_used |= REX_OPCODE; \
170 }
171
172 /* Flags for prefixes which we somehow handled when printing the
173 current instruction. */
174 static int used_prefixes;
175
176 /* Flags stored in PREFIXES. */
177 #define PREFIX_REPZ 1
178 #define PREFIX_REPNZ 2
179 #define PREFIX_LOCK 4
180 #define PREFIX_CS 8
181 #define PREFIX_SS 0x10
182 #define PREFIX_DS 0x20
183 #define PREFIX_ES 0x40
184 #define PREFIX_FS 0x80
185 #define PREFIX_GS 0x100
186 #define PREFIX_DATA 0x200
187 #define PREFIX_ADDR 0x400
188 #define PREFIX_FWAIT 0x800
189
190 /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
191 to ADDR (exclusive) are valid. Returns 1 for success, longjmps
192 on error. */
193 #define FETCH_DATA(info, addr) \
194 ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \
195 ? 1 : fetch_data ((info), (addr)))
196
197 static int
198 fetch_data (struct disassemble_info *info, bfd_byte *addr)
199 {
200 int status;
201 struct dis_private *priv = (struct dis_private *) info->private_data;
202 bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer);
203
204 if (addr <= priv->the_buffer + MAX_MNEM_SIZE)
205 status = (*info->read_memory_func) (start,
206 priv->max_fetched,
207 addr - priv->max_fetched,
208 info);
209 else
210 status = -1;
211 if (status != 0)
212 {
213 /* If we did manage to read at least one byte, then
214 print_insn_i386 will do something sensible. Otherwise, print
215 an error. We do that here because this is where we know
216 STATUS. */
217 if (priv->max_fetched == priv->the_buffer)
218 (*info->memory_error_func) (status, start, info);
219 OPCODES_SIGLONGJMP (priv->bailout, 1);
220 }
221 else
222 priv->max_fetched = addr;
223 return 1;
224 }
225
226 /* Possible values for prefix requirement. */
227 #define PREFIX_IGNORED_SHIFT 16
228 #define PREFIX_IGNORED_REPZ (PREFIX_REPZ << PREFIX_IGNORED_SHIFT)
229 #define PREFIX_IGNORED_REPNZ (PREFIX_REPNZ << PREFIX_IGNORED_SHIFT)
230 #define PREFIX_IGNORED_DATA (PREFIX_DATA << PREFIX_IGNORED_SHIFT)
231 #define PREFIX_IGNORED_ADDR (PREFIX_ADDR << PREFIX_IGNORED_SHIFT)
232 #define PREFIX_IGNORED_LOCK (PREFIX_LOCK << PREFIX_IGNORED_SHIFT)
233
234 /* Opcode prefixes. */
235 #define PREFIX_OPCODE (PREFIX_REPZ \
236 | PREFIX_REPNZ \
237 | PREFIX_DATA)
238
239 /* Prefixes ignored. */
240 #define PREFIX_IGNORED (PREFIX_IGNORED_REPZ \
241 | PREFIX_IGNORED_REPNZ \
242 | PREFIX_IGNORED_DATA)
243
244 #define XX { NULL, 0 }
245 #define Bad_Opcode NULL, { { NULL, 0 } }, 0
246
247 #define Eb { OP_E, b_mode }
248 #define Ebnd { OP_E, bnd_mode }
249 #define EbS { OP_E, b_swap_mode }
250 #define EbndS { OP_E, bnd_swap_mode }
251 #define Ev { OP_E, v_mode }
252 #define Eva { OP_E, va_mode }
253 #define Ev_bnd { OP_E, v_bnd_mode }
254 #define EvS { OP_E, v_swap_mode }
255 #define Ed { OP_E, d_mode }
256 #define Edq { OP_E, dq_mode }
257 #define Edqw { OP_E, dqw_mode }
258 #define Edqb { OP_E, dqb_mode }
259 #define Edb { OP_E, db_mode }
260 #define Edw { OP_E, dw_mode }
261 #define Edqd { OP_E, dqd_mode }
262 #define Edqa { OP_E, dqa_mode }
263 #define Eq { OP_E, q_mode }
264 #define indirEv { OP_indirE, indir_v_mode }
265 #define indirEp { OP_indirE, f_mode }
266 #define stackEv { OP_E, stack_v_mode }
267 #define Em { OP_E, m_mode }
268 #define Ew { OP_E, w_mode }
269 #define M { OP_M, 0 } /* lea, lgdt, etc. */
270 #define Ma { OP_M, a_mode }
271 #define Mb { OP_M, b_mode }
272 #define Md { OP_M, d_mode }
273 #define Mo { OP_M, o_mode }
274 #define Mp { OP_M, f_mode } /* 32 or 48 bit memory operand for LDS, LES etc */
275 #define Mq { OP_M, q_mode }
276 #define Mv_bnd { OP_M, v_bndmk_mode }
277 #define Mx { OP_M, x_mode }
278 #define Mxmm { OP_M, xmm_mode }
279 #define Gb { OP_G, b_mode }
280 #define Gbnd { OP_G, bnd_mode }
281 #define Gv { OP_G, v_mode }
282 #define Gd { OP_G, d_mode }
283 #define Gdq { OP_G, dq_mode }
284 #define Gm { OP_G, m_mode }
285 #define Gva { OP_G, va_mode }
286 #define Gw { OP_G, w_mode }
287 #define Rd { OP_R, d_mode }
288 #define Rdq { OP_R, dq_mode }
289 #define Rm { OP_R, m_mode }
290 #define Ib { OP_I, b_mode }
291 #define sIb { OP_sI, b_mode } /* sign extened byte */
292 #define sIbT { OP_sI, b_T_mode } /* sign extened byte like 'T' */
293 #define Iv { OP_I, v_mode }
294 #define sIv { OP_sI, v_mode }
295 #define Iq { OP_I, q_mode }
296 #define Iv64 { OP_I64, v_mode }
297 #define Iw { OP_I, w_mode }
298 #define I1 { OP_I, const_1_mode }
299 #define Jb { OP_J, b_mode }
300 #define Jv { OP_J, v_mode }
301 #define Cm { OP_C, m_mode }
302 #define Dm { OP_D, m_mode }
303 #define Td { OP_T, d_mode }
304 #define Skip_MODRM { OP_Skip_MODRM, 0 }
305
306 #define RMeAX { OP_REG, eAX_reg }
307 #define RMeBX { OP_REG, eBX_reg }
308 #define RMeCX { OP_REG, eCX_reg }
309 #define RMeDX { OP_REG, eDX_reg }
310 #define RMeSP { OP_REG, eSP_reg }
311 #define RMeBP { OP_REG, eBP_reg }
312 #define RMeSI { OP_REG, eSI_reg }
313 #define RMeDI { OP_REG, eDI_reg }
314 #define RMrAX { OP_REG, rAX_reg }
315 #define RMrBX { OP_REG, rBX_reg }
316 #define RMrCX { OP_REG, rCX_reg }
317 #define RMrDX { OP_REG, rDX_reg }
318 #define RMrSP { OP_REG, rSP_reg }
319 #define RMrBP { OP_REG, rBP_reg }
320 #define RMrSI { OP_REG, rSI_reg }
321 #define RMrDI { OP_REG, rDI_reg }
322 #define RMAL { OP_REG, al_reg }
323 #define RMCL { OP_REG, cl_reg }
324 #define RMDL { OP_REG, dl_reg }
325 #define RMBL { OP_REG, bl_reg }
326 #define RMAH { OP_REG, ah_reg }
327 #define RMCH { OP_REG, ch_reg }
328 #define RMDH { OP_REG, dh_reg }
329 #define RMBH { OP_REG, bh_reg }
330 #define RMAX { OP_REG, ax_reg }
331 #define RMDX { OP_REG, dx_reg }
332
333 #define eAX { OP_IMREG, eAX_reg }
334 #define eBX { OP_IMREG, eBX_reg }
335 #define eCX { OP_IMREG, eCX_reg }
336 #define eDX { OP_IMREG, eDX_reg }
337 #define eSP { OP_IMREG, eSP_reg }
338 #define eBP { OP_IMREG, eBP_reg }
339 #define eSI { OP_IMREG, eSI_reg }
340 #define eDI { OP_IMREG, eDI_reg }
341 #define AL { OP_IMREG, al_reg }
342 #define CL { OP_IMREG, cl_reg }
343 #define DL { OP_IMREG, dl_reg }
344 #define BL { OP_IMREG, bl_reg }
345 #define AH { OP_IMREG, ah_reg }
346 #define CH { OP_IMREG, ch_reg }
347 #define DH { OP_IMREG, dh_reg }
348 #define BH { OP_IMREG, bh_reg }
349 #define AX { OP_IMREG, ax_reg }
350 #define DX { OP_IMREG, dx_reg }
351 #define zAX { OP_IMREG, z_mode_ax_reg }
352 #define indirDX { OP_IMREG, indir_dx_reg }
353
354 #define Sw { OP_SEG, w_mode }
355 #define Sv { OP_SEG, v_mode }
356 #define Ap { OP_DIR, 0 }
357 #define Ob { OP_OFF64, b_mode }
358 #define Ov { OP_OFF64, v_mode }
359 #define Xb { OP_DSreg, eSI_reg }
360 #define Xv { OP_DSreg, eSI_reg }
361 #define Xz { OP_DSreg, eSI_reg }
362 #define Yb { OP_ESreg, eDI_reg }
363 #define Yv { OP_ESreg, eDI_reg }
364 #define DSBX { OP_DSreg, eBX_reg }
365
366 #define es { OP_REG, es_reg }
367 #define ss { OP_REG, ss_reg }
368 #define cs { OP_REG, cs_reg }
369 #define ds { OP_REG, ds_reg }
370 #define fs { OP_REG, fs_reg }
371 #define gs { OP_REG, gs_reg }
372
373 #define MX { OP_MMX, 0 }
374 #define XM { OP_XMM, 0 }
375 #define XMScalar { OP_XMM, scalar_mode }
376 #define XMGatherQ { OP_XMM, vex_vsib_q_w_dq_mode }
377 #define XMM { OP_XMM, xmm_mode }
378 #define XMxmmq { OP_XMM, xmmq_mode }
379 #define EM { OP_EM, v_mode }
380 #define EMS { OP_EM, v_swap_mode }
381 #define EMd { OP_EM, d_mode }
382 #define EMx { OP_EM, x_mode }
383 #define EXbScalar { OP_EX, b_scalar_mode }
384 #define EXw { OP_EX, w_mode }
385 #define EXwScalar { OP_EX, w_scalar_mode }
386 #define EXd { OP_EX, d_mode }
387 #define EXdScalar { OP_EX, d_scalar_mode }
388 #define EXdS { OP_EX, d_swap_mode }
389 #define EXdScalarS { OP_EX, d_scalar_swap_mode }
390 #define EXq { OP_EX, q_mode }
391 #define EXqScalar { OP_EX, q_scalar_mode }
392 #define EXqScalarS { OP_EX, q_scalar_swap_mode }
393 #define EXqS { OP_EX, q_swap_mode }
394 #define EXx { OP_EX, x_mode }
395 #define EXxS { OP_EX, x_swap_mode }
396 #define EXxmm { OP_EX, xmm_mode }
397 #define EXymm { OP_EX, ymm_mode }
398 #define EXxmmq { OP_EX, xmmq_mode }
399 #define EXEvexHalfBcstXmmq { OP_EX, evex_half_bcst_xmmq_mode }
400 #define EXxmm_mb { OP_EX, xmm_mb_mode }
401 #define EXxmm_mw { OP_EX, xmm_mw_mode }
402 #define EXxmm_md { OP_EX, xmm_md_mode }
403 #define EXxmm_mq { OP_EX, xmm_mq_mode }
404 #define EXxmm_mdq { OP_EX, xmm_mdq_mode }
405 #define EXxmmdw { OP_EX, xmmdw_mode }
406 #define EXxmmqd { OP_EX, xmmqd_mode }
407 #define EXymmq { OP_EX, ymmq_mode }
408 #define EXVexWdq { OP_EX, vex_w_dq_mode }
409 #define EXVexWdqScalar { OP_EX, vex_scalar_w_dq_mode }
410 #define EXEvexXGscat { OP_EX, evex_x_gscat_mode }
411 #define EXEvexXNoBcst { OP_EX, evex_x_nobcst_mode }
412 #define MS { OP_MS, v_mode }
413 #define XS { OP_XS, v_mode }
414 #define EMCq { OP_EMC, q_mode }
415 #define MXC { OP_MXC, 0 }
416 #define OPSUF { OP_3DNowSuffix, 0 }
417 #define CMP { CMP_Fixup, 0 }
418 #define XMM0 { XMM_Fixup, 0 }
419 #define FXSAVE { FXSAVE_Fixup, 0 }
420 #define Vex_2src_1 { OP_Vex_2src_1, 0 }
421 #define Vex_2src_2 { OP_Vex_2src_2, 0 }
422
423 #define Vex { OP_VEX, vex_mode }
424 #define VexScalar { OP_VEX, vex_scalar_mode }
425 #define VexGatherQ { OP_VEX, vex_vsib_q_w_dq_mode }
426 #define Vex128 { OP_VEX, vex128_mode }
427 #define Vex256 { OP_VEX, vex256_mode }
428 #define VexGdq { OP_VEX, dq_mode }
429 #define EXdVex { OP_EX_Vex, d_mode }
430 #define EXdVexS { OP_EX_Vex, d_swap_mode }
431 #define EXdVexScalarS { OP_EX_Vex, d_scalar_swap_mode }
432 #define EXqVex { OP_EX_Vex, q_mode }
433 #define EXqVexS { OP_EX_Vex, q_swap_mode }
434 #define EXqVexScalarS { OP_EX_Vex, q_scalar_swap_mode }
435 #define EXVexW { OP_EX_VexW, x_mode }
436 #define EXdVexW { OP_EX_VexW, d_mode }
437 #define EXqVexW { OP_EX_VexW, q_mode }
438 #define EXVexImmW { OP_EX_VexImmW, x_mode }
439 #define XMVex { OP_XMM_Vex, 0 }
440 #define XMVexScalar { OP_XMM_Vex, scalar_mode }
441 #define XMVexW { OP_XMM_VexW, 0 }
442 #define XMVexI4 { OP_REG_VexI4, x_mode }
443 #define PCLMUL { PCLMUL_Fixup, 0 }
444 #define VCMP { VCMP_Fixup, 0 }
445 #define VPCMP { VPCMP_Fixup, 0 }
446 #define VPCOM { VPCOM_Fixup, 0 }
447
448 #define EXxEVexR { OP_Rounding, evex_rounding_mode }
449 #define EXxEVexR64 { OP_Rounding, evex_rounding_64_mode }
450 #define EXxEVexS { OP_Rounding, evex_sae_mode }
451
452 #define XMask { OP_Mask, mask_mode }
453 #define MaskG { OP_G, mask_mode }
454 #define MaskE { OP_E, mask_mode }
455 #define MaskBDE { OP_E, mask_bd_mode }
456 #define MaskR { OP_R, mask_mode }
457 #define MaskVex { OP_VEX, mask_mode }
458
459 #define MVexVSIBDWpX { OP_M, vex_vsib_d_w_dq_mode }
460 #define MVexVSIBDQWpX { OP_M, vex_vsib_d_w_d_mode }
461 #define MVexVSIBQWpX { OP_M, vex_vsib_q_w_dq_mode }
462 #define MVexVSIBQDWpX { OP_M, vex_vsib_q_w_d_mode }
463
464 /* Used handle "rep" prefix for string instructions. */
465 #define Xbr { REP_Fixup, eSI_reg }
466 #define Xvr { REP_Fixup, eSI_reg }
467 #define Ybr { REP_Fixup, eDI_reg }
468 #define Yvr { REP_Fixup, eDI_reg }
469 #define Yzr { REP_Fixup, eDI_reg }
470 #define indirDXr { REP_Fixup, indir_dx_reg }
471 #define ALr { REP_Fixup, al_reg }
472 #define eAXr { REP_Fixup, eAX_reg }
473
474 /* Used handle HLE prefix for lockable instructions. */
475 #define Ebh1 { HLE_Fixup1, b_mode }
476 #define Evh1 { HLE_Fixup1, v_mode }
477 #define Ebh2 { HLE_Fixup2, b_mode }
478 #define Evh2 { HLE_Fixup2, v_mode }
479 #define Ebh3 { HLE_Fixup3, b_mode }
480 #define Evh3 { HLE_Fixup3, v_mode }
481
482 #define BND { BND_Fixup, 0 }
483 #define NOTRACK { NOTRACK_Fixup, 0 }
484
485 #define cond_jump_flag { NULL, cond_jump_mode }
486 #define loop_jcxz_flag { NULL, loop_jcxz_mode }
487
488 /* bits in sizeflag */
489 #define SUFFIX_ALWAYS 4
490 #define AFLAG 2
491 #define DFLAG 1
492
493 enum
494 {
495 /* byte operand */
496 b_mode = 1,
497 /* byte operand with operand swapped */
498 b_swap_mode,
499 /* byte operand, sign extend like 'T' suffix */
500 b_T_mode,
501 /* operand size depends on prefixes */
502 v_mode,
503 /* operand size depends on prefixes with operand swapped */
504 v_swap_mode,
505 /* operand size depends on address prefix */
506 va_mode,
507 /* word operand */
508 w_mode,
509 /* double word operand */
510 d_mode,
511 /* double word operand with operand swapped */
512 d_swap_mode,
513 /* quad word operand */
514 q_mode,
515 /* quad word operand with operand swapped */
516 q_swap_mode,
517 /* ten-byte operand */
518 t_mode,
519 /* 16-byte XMM, 32-byte YMM or 64-byte ZMM operand. In EVEX with
520 broadcast enabled. */
521 x_mode,
522 /* Similar to x_mode, but with different EVEX mem shifts. */
523 evex_x_gscat_mode,
524 /* Similar to x_mode, but with disabled broadcast. */
525 evex_x_nobcst_mode,
526 /* Similar to x_mode, but with operands swapped and disabled broadcast
527 in EVEX. */
528 x_swap_mode,
529 /* 16-byte XMM operand */
530 xmm_mode,
531 /* XMM, XMM or YMM register operand, or quad word, xmmword or ymmword
532 memory operand (depending on vector length). Broadcast isn't
533 allowed. */
534 xmmq_mode,
535 /* Same as xmmq_mode, but broadcast is allowed. */
536 evex_half_bcst_xmmq_mode,
537 /* XMM register or byte memory operand */
538 xmm_mb_mode,
539 /* XMM register or word memory operand */
540 xmm_mw_mode,
541 /* XMM register or double word memory operand */
542 xmm_md_mode,
543 /* XMM register or quad word memory operand */
544 xmm_mq_mode,
545 /* XMM register or double/quad word memory operand, depending on
546 VEX.W. */
547 xmm_mdq_mode,
548 /* 16-byte XMM, word, double word or quad word operand. */
549 xmmdw_mode,
550 /* 16-byte XMM, double word, quad word operand or xmm word operand. */
551 xmmqd_mode,
552 /* 32-byte YMM operand */
553 ymm_mode,
554 /* quad word, ymmword or zmmword memory operand. */
555 ymmq_mode,
556 /* 32-byte YMM or 16-byte word operand */
557 ymmxmm_mode,
558 /* d_mode in 32bit, q_mode in 64bit mode. */
559 m_mode,
560 /* pair of v_mode operands */
561 a_mode,
562 cond_jump_mode,
563 loop_jcxz_mode,
564 v_bnd_mode,
565 /* like v_bnd_mode in 32bit, no RIP-rel in 64bit mode. */
566 v_bndmk_mode,
567 /* operand size depends on REX prefixes. */
568 dq_mode,
569 /* registers like dq_mode, memory like w_mode. */
570 dqw_mode,
571 /* bounds operand */
572 bnd_mode,
573 /* bounds operand with operand swapped */
574 bnd_swap_mode,
575 /* 4- or 6-byte pointer operand */
576 f_mode,
577 const_1_mode,
578 /* v_mode for indirect branch opcodes. */
579 indir_v_mode,
580 /* v_mode for stack-related opcodes. */
581 stack_v_mode,
582 /* non-quad operand size depends on prefixes */
583 z_mode,
584 /* 16-byte operand */
585 o_mode,
586 /* registers like dq_mode, memory like b_mode. */
587 dqb_mode,
588 /* registers like d_mode, memory like b_mode. */
589 db_mode,
590 /* registers like d_mode, memory like w_mode. */
591 dw_mode,
592 /* registers like dq_mode, memory like d_mode. */
593 dqd_mode,
594 /* operand size depends on the W bit as well as address mode. */
595 dqa_mode,
596 /* normal vex mode */
597 vex_mode,
598 /* 128bit vex mode */
599 vex128_mode,
600 /* 256bit vex mode */
601 vex256_mode,
602 /* operand size depends on the VEX.W bit. */
603 vex_w_dq_mode,
604
605 /* Similar to vex_w_dq_mode, with VSIB dword indices. */
606 vex_vsib_d_w_dq_mode,
607 /* Similar to vex_vsib_d_w_dq_mode, with smaller memory. */
608 vex_vsib_d_w_d_mode,
609 /* Similar to vex_w_dq_mode, with VSIB qword indices. */
610 vex_vsib_q_w_dq_mode,
611 /* Similar to vex_vsib_q_w_dq_mode, with smaller memory. */
612 vex_vsib_q_w_d_mode,
613
614 /* scalar, ignore vector length. */
615 scalar_mode,
616 /* like b_mode, ignore vector length. */
617 b_scalar_mode,
618 /* like w_mode, ignore vector length. */
619 w_scalar_mode,
620 /* like d_mode, ignore vector length. */
621 d_scalar_mode,
622 /* like d_swap_mode, ignore vector length. */
623 d_scalar_swap_mode,
624 /* like q_mode, ignore vector length. */
625 q_scalar_mode,
626 /* like q_swap_mode, ignore vector length. */
627 q_scalar_swap_mode,
628 /* like vex_mode, ignore vector length. */
629 vex_scalar_mode,
630 /* like vex_w_dq_mode, ignore vector length. */
631 vex_scalar_w_dq_mode,
632
633 /* Static rounding. */
634 evex_rounding_mode,
635 /* Static rounding, 64-bit mode only. */
636 evex_rounding_64_mode,
637 /* Supress all exceptions. */
638 evex_sae_mode,
639
640 /* Mask register operand. */
641 mask_mode,
642 /* Mask register operand. */
643 mask_bd_mode,
644
645 es_reg,
646 cs_reg,
647 ss_reg,
648 ds_reg,
649 fs_reg,
650 gs_reg,
651
652 eAX_reg,
653 eCX_reg,
654 eDX_reg,
655 eBX_reg,
656 eSP_reg,
657 eBP_reg,
658 eSI_reg,
659 eDI_reg,
660
661 al_reg,
662 cl_reg,
663 dl_reg,
664 bl_reg,
665 ah_reg,
666 ch_reg,
667 dh_reg,
668 bh_reg,
669
670 ax_reg,
671 cx_reg,
672 dx_reg,
673 bx_reg,
674 sp_reg,
675 bp_reg,
676 si_reg,
677 di_reg,
678
679 rAX_reg,
680 rCX_reg,
681 rDX_reg,
682 rBX_reg,
683 rSP_reg,
684 rBP_reg,
685 rSI_reg,
686 rDI_reg,
687
688 z_mode_ax_reg,
689 indir_dx_reg
690 };
691
692 enum
693 {
694 FLOATCODE = 1,
695 USE_REG_TABLE,
696 USE_MOD_TABLE,
697 USE_RM_TABLE,
698 USE_PREFIX_TABLE,
699 USE_X86_64_TABLE,
700 USE_3BYTE_TABLE,
701 USE_XOP_8F_TABLE,
702 USE_VEX_C4_TABLE,
703 USE_VEX_C5_TABLE,
704 USE_VEX_LEN_TABLE,
705 USE_VEX_W_TABLE,
706 USE_EVEX_TABLE,
707 USE_EVEX_LEN_TABLE
708 };
709
710 #define FLOAT NULL, { { NULL, FLOATCODE } }, 0
711
712 #define DIS386(T, I) NULL, { { NULL, (T)}, { NULL, (I) } }, 0
713 #define DIS386_PREFIX(T, I, P) NULL, { { NULL, (T)}, { NULL, (I) } }, P
714 #define REG_TABLE(I) DIS386 (USE_REG_TABLE, (I))
715 #define MOD_TABLE(I) DIS386 (USE_MOD_TABLE, (I))
716 #define RM_TABLE(I) DIS386 (USE_RM_TABLE, (I))
717 #define PREFIX_TABLE(I) DIS386 (USE_PREFIX_TABLE, (I))
718 #define X86_64_TABLE(I) DIS386 (USE_X86_64_TABLE, (I))
719 #define THREE_BYTE_TABLE(I) DIS386 (USE_3BYTE_TABLE, (I))
720 #define THREE_BYTE_TABLE_PREFIX(I, P) DIS386_PREFIX (USE_3BYTE_TABLE, (I), P)
721 #define XOP_8F_TABLE(I) DIS386 (USE_XOP_8F_TABLE, (I))
722 #define VEX_C4_TABLE(I) DIS386 (USE_VEX_C4_TABLE, (I))
723 #define VEX_C5_TABLE(I) DIS386 (USE_VEX_C5_TABLE, (I))
724 #define VEX_LEN_TABLE(I) DIS386 (USE_VEX_LEN_TABLE, (I))
725 #define VEX_W_TABLE(I) DIS386 (USE_VEX_W_TABLE, (I))
726 #define EVEX_TABLE(I) DIS386 (USE_EVEX_TABLE, (I))
727 #define EVEX_LEN_TABLE(I) DIS386 (USE_EVEX_LEN_TABLE, (I))
728
729 enum
730 {
731 REG_80 = 0,
732 REG_81,
733 REG_83,
734 REG_8F,
735 REG_C0,
736 REG_C1,
737 REG_C6,
738 REG_C7,
739 REG_D0,
740 REG_D1,
741 REG_D2,
742 REG_D3,
743 REG_F6,
744 REG_F7,
745 REG_FE,
746 REG_FF,
747 REG_0F00,
748 REG_0F01,
749 REG_0F0D,
750 REG_0F18,
751 REG_0F1C_MOD_0,
752 REG_0F1E_MOD_3,
753 REG_0F71,
754 REG_0F72,
755 REG_0F73,
756 REG_0FA6,
757 REG_0FA7,
758 REG_0FAE,
759 REG_0FBA,
760 REG_0FC7,
761 REG_VEX_0F71,
762 REG_VEX_0F72,
763 REG_VEX_0F73,
764 REG_VEX_0FAE,
765 REG_VEX_0F38F3,
766 REG_XOP_LWPCB,
767 REG_XOP_LWP,
768 REG_XOP_TBM_01,
769 REG_XOP_TBM_02,
770
771 REG_EVEX_0F71,
772 REG_EVEX_0F72,
773 REG_EVEX_0F73,
774 REG_EVEX_0F38C6,
775 REG_EVEX_0F38C7
776 };
777
778 enum
779 {
780 MOD_8D = 0,
781 MOD_C6_REG_7,
782 MOD_C7_REG_7,
783 MOD_FF_REG_3,
784 MOD_FF_REG_5,
785 MOD_0F01_REG_0,
786 MOD_0F01_REG_1,
787 MOD_0F01_REG_2,
788 MOD_0F01_REG_3,
789 MOD_0F01_REG_5,
790 MOD_0F01_REG_7,
791 MOD_0F12_PREFIX_0,
792 MOD_0F13,
793 MOD_0F16_PREFIX_0,
794 MOD_0F17,
795 MOD_0F18_REG_0,
796 MOD_0F18_REG_1,
797 MOD_0F18_REG_2,
798 MOD_0F18_REG_3,
799 MOD_0F18_REG_4,
800 MOD_0F18_REG_5,
801 MOD_0F18_REG_6,
802 MOD_0F18_REG_7,
803 MOD_0F1A_PREFIX_0,
804 MOD_0F1B_PREFIX_0,
805 MOD_0F1B_PREFIX_1,
806 MOD_0F1C_PREFIX_0,
807 MOD_0F1E_PREFIX_1,
808 MOD_0F24,
809 MOD_0F26,
810 MOD_0F2B_PREFIX_0,
811 MOD_0F2B_PREFIX_1,
812 MOD_0F2B_PREFIX_2,
813 MOD_0F2B_PREFIX_3,
814 MOD_0F51,
815 MOD_0F71_REG_2,
816 MOD_0F71_REG_4,
817 MOD_0F71_REG_6,
818 MOD_0F72_REG_2,
819 MOD_0F72_REG_4,
820 MOD_0F72_REG_6,
821 MOD_0F73_REG_2,
822 MOD_0F73_REG_3,
823 MOD_0F73_REG_6,
824 MOD_0F73_REG_7,
825 MOD_0FAE_REG_0,
826 MOD_0FAE_REG_1,
827 MOD_0FAE_REG_2,
828 MOD_0FAE_REG_3,
829 MOD_0FAE_REG_4,
830 MOD_0FAE_REG_5,
831 MOD_0FAE_REG_6,
832 MOD_0FAE_REG_7,
833 MOD_0FB2,
834 MOD_0FB4,
835 MOD_0FB5,
836 MOD_0FC3,
837 MOD_0FC7_REG_3,
838 MOD_0FC7_REG_4,
839 MOD_0FC7_REG_5,
840 MOD_0FC7_REG_6,
841 MOD_0FC7_REG_7,
842 MOD_0FD7,
843 MOD_0FE7_PREFIX_2,
844 MOD_0FF0_PREFIX_3,
845 MOD_0F382A_PREFIX_2,
846 MOD_0F38F5_PREFIX_2,
847 MOD_0F38F6_PREFIX_0,
848 MOD_0F38F8_PREFIX_2,
849 MOD_0F38F9_PREFIX_0,
850 MOD_62_32BIT,
851 MOD_C4_32BIT,
852 MOD_C5_32BIT,
853 MOD_VEX_0F12_PREFIX_0,
854 MOD_VEX_0F13,
855 MOD_VEX_0F16_PREFIX_0,
856 MOD_VEX_0F17,
857 MOD_VEX_0F2B,
858 MOD_VEX_W_0_0F41_P_0_LEN_1,
859 MOD_VEX_W_1_0F41_P_0_LEN_1,
860 MOD_VEX_W_0_0F41_P_2_LEN_1,
861 MOD_VEX_W_1_0F41_P_2_LEN_1,
862 MOD_VEX_W_0_0F42_P_0_LEN_1,
863 MOD_VEX_W_1_0F42_P_0_LEN_1,
864 MOD_VEX_W_0_0F42_P_2_LEN_1,
865 MOD_VEX_W_1_0F42_P_2_LEN_1,
866 MOD_VEX_W_0_0F44_P_0_LEN_1,
867 MOD_VEX_W_1_0F44_P_0_LEN_1,
868 MOD_VEX_W_0_0F44_P_2_LEN_1,
869 MOD_VEX_W_1_0F44_P_2_LEN_1,
870 MOD_VEX_W_0_0F45_P_0_LEN_1,
871 MOD_VEX_W_1_0F45_P_0_LEN_1,
872 MOD_VEX_W_0_0F45_P_2_LEN_1,
873 MOD_VEX_W_1_0F45_P_2_LEN_1,
874 MOD_VEX_W_0_0F46_P_0_LEN_1,
875 MOD_VEX_W_1_0F46_P_0_LEN_1,
876 MOD_VEX_W_0_0F46_P_2_LEN_1,
877 MOD_VEX_W_1_0F46_P_2_LEN_1,
878 MOD_VEX_W_0_0F47_P_0_LEN_1,
879 MOD_VEX_W_1_0F47_P_0_LEN_1,
880 MOD_VEX_W_0_0F47_P_2_LEN_1,
881 MOD_VEX_W_1_0F47_P_2_LEN_1,
882 MOD_VEX_W_0_0F4A_P_0_LEN_1,
883 MOD_VEX_W_1_0F4A_P_0_LEN_1,
884 MOD_VEX_W_0_0F4A_P_2_LEN_1,
885 MOD_VEX_W_1_0F4A_P_2_LEN_1,
886 MOD_VEX_W_0_0F4B_P_0_LEN_1,
887 MOD_VEX_W_1_0F4B_P_0_LEN_1,
888 MOD_VEX_W_0_0F4B_P_2_LEN_1,
889 MOD_VEX_0F50,
890 MOD_VEX_0F71_REG_2,
891 MOD_VEX_0F71_REG_4,
892 MOD_VEX_0F71_REG_6,
893 MOD_VEX_0F72_REG_2,
894 MOD_VEX_0F72_REG_4,
895 MOD_VEX_0F72_REG_6,
896 MOD_VEX_0F73_REG_2,
897 MOD_VEX_0F73_REG_3,
898 MOD_VEX_0F73_REG_6,
899 MOD_VEX_0F73_REG_7,
900 MOD_VEX_W_0_0F91_P_0_LEN_0,
901 MOD_VEX_W_1_0F91_P_0_LEN_0,
902 MOD_VEX_W_0_0F91_P_2_LEN_0,
903 MOD_VEX_W_1_0F91_P_2_LEN_0,
904 MOD_VEX_W_0_0F92_P_0_LEN_0,
905 MOD_VEX_W_0_0F92_P_2_LEN_0,
906 MOD_VEX_0F92_P_3_LEN_0,
907 MOD_VEX_W_0_0F93_P_0_LEN_0,
908 MOD_VEX_W_0_0F93_P_2_LEN_0,
909 MOD_VEX_0F93_P_3_LEN_0,
910 MOD_VEX_W_0_0F98_P_0_LEN_0,
911 MOD_VEX_W_1_0F98_P_0_LEN_0,
912 MOD_VEX_W_0_0F98_P_2_LEN_0,
913 MOD_VEX_W_1_0F98_P_2_LEN_0,
914 MOD_VEX_W_0_0F99_P_0_LEN_0,
915 MOD_VEX_W_1_0F99_P_0_LEN_0,
916 MOD_VEX_W_0_0F99_P_2_LEN_0,
917 MOD_VEX_W_1_0F99_P_2_LEN_0,
918 MOD_VEX_0FAE_REG_2,
919 MOD_VEX_0FAE_REG_3,
920 MOD_VEX_0FD7_PREFIX_2,
921 MOD_VEX_0FE7_PREFIX_2,
922 MOD_VEX_0FF0_PREFIX_3,
923 MOD_VEX_0F381A_PREFIX_2,
924 MOD_VEX_0F382A_PREFIX_2,
925 MOD_VEX_0F382C_PREFIX_2,
926 MOD_VEX_0F382D_PREFIX_2,
927 MOD_VEX_0F382E_PREFIX_2,
928 MOD_VEX_0F382F_PREFIX_2,
929 MOD_VEX_0F385A_PREFIX_2,
930 MOD_VEX_0F388C_PREFIX_2,
931 MOD_VEX_0F388E_PREFIX_2,
932 MOD_VEX_W_0_0F3A30_P_2_LEN_0,
933 MOD_VEX_W_1_0F3A30_P_2_LEN_0,
934 MOD_VEX_W_0_0F3A31_P_2_LEN_0,
935 MOD_VEX_W_1_0F3A31_P_2_LEN_0,
936 MOD_VEX_W_0_0F3A32_P_2_LEN_0,
937 MOD_VEX_W_1_0F3A32_P_2_LEN_0,
938 MOD_VEX_W_0_0F3A33_P_2_LEN_0,
939 MOD_VEX_W_1_0F3A33_P_2_LEN_0,
940
941 MOD_EVEX_0F10_PREFIX_1,
942 MOD_EVEX_0F10_PREFIX_3,
943 MOD_EVEX_0F11_PREFIX_1,
944 MOD_EVEX_0F11_PREFIX_3,
945 MOD_EVEX_0F12_PREFIX_0,
946 MOD_EVEX_0F16_PREFIX_0,
947 MOD_EVEX_0F38C6_REG_1,
948 MOD_EVEX_0F38C6_REG_2,
949 MOD_EVEX_0F38C6_REG_5,
950 MOD_EVEX_0F38C6_REG_6,
951 MOD_EVEX_0F38C7_REG_1,
952 MOD_EVEX_0F38C7_REG_2,
953 MOD_EVEX_0F38C7_REG_5,
954 MOD_EVEX_0F38C7_REG_6
955 };
956
957 enum
958 {
959 RM_C6_REG_7 = 0,
960 RM_C7_REG_7,
961 RM_0F01_REG_0,
962 RM_0F01_REG_1,
963 RM_0F01_REG_2,
964 RM_0F01_REG_3,
965 RM_0F01_REG_5,
966 RM_0F01_REG_7,
967 RM_0F1E_MOD_3_REG_7,
968 RM_0FAE_REG_6,
969 RM_0FAE_REG_7
970 };
971
972 enum
973 {
974 PREFIX_90 = 0,
975 PREFIX_MOD_0_0F01_REG_5,
976 PREFIX_MOD_3_0F01_REG_5_RM_0,
977 PREFIX_MOD_3_0F01_REG_5_RM_2,
978 PREFIX_0F09,
979 PREFIX_0F10,
980 PREFIX_0F11,
981 PREFIX_0F12,
982 PREFIX_0F16,
983 PREFIX_0F1A,
984 PREFIX_0F1B,
985 PREFIX_0F1C,
986 PREFIX_0F1E,
987 PREFIX_0F2A,
988 PREFIX_0F2B,
989 PREFIX_0F2C,
990 PREFIX_0F2D,
991 PREFIX_0F2E,
992 PREFIX_0F2F,
993 PREFIX_0F51,
994 PREFIX_0F52,
995 PREFIX_0F53,
996 PREFIX_0F58,
997 PREFIX_0F59,
998 PREFIX_0F5A,
999 PREFIX_0F5B,
1000 PREFIX_0F5C,
1001 PREFIX_0F5D,
1002 PREFIX_0F5E,
1003 PREFIX_0F5F,
1004 PREFIX_0F60,
1005 PREFIX_0F61,
1006 PREFIX_0F62,
1007 PREFIX_0F6C,
1008 PREFIX_0F6D,
1009 PREFIX_0F6F,
1010 PREFIX_0F70,
1011 PREFIX_0F73_REG_3,
1012 PREFIX_0F73_REG_7,
1013 PREFIX_0F78,
1014 PREFIX_0F79,
1015 PREFIX_0F7C,
1016 PREFIX_0F7D,
1017 PREFIX_0F7E,
1018 PREFIX_0F7F,
1019 PREFIX_0FAE_REG_0,
1020 PREFIX_0FAE_REG_1,
1021 PREFIX_0FAE_REG_2,
1022 PREFIX_0FAE_REG_3,
1023 PREFIX_MOD_0_0FAE_REG_4,
1024 PREFIX_MOD_3_0FAE_REG_4,
1025 PREFIX_MOD_0_0FAE_REG_5,
1026 PREFIX_MOD_3_0FAE_REG_5,
1027 PREFIX_MOD_0_0FAE_REG_6,
1028 PREFIX_MOD_1_0FAE_REG_6,
1029 PREFIX_0FAE_REG_7,
1030 PREFIX_0FB8,
1031 PREFIX_0FBC,
1032 PREFIX_0FBD,
1033 PREFIX_0FC2,
1034 PREFIX_MOD_0_0FC3,
1035 PREFIX_MOD_0_0FC7_REG_6,
1036 PREFIX_MOD_3_0FC7_REG_6,
1037 PREFIX_MOD_3_0FC7_REG_7,
1038 PREFIX_0FD0,
1039 PREFIX_0FD6,
1040 PREFIX_0FE6,
1041 PREFIX_0FE7,
1042 PREFIX_0FF0,
1043 PREFIX_0FF7,
1044 PREFIX_0F3810,
1045 PREFIX_0F3814,
1046 PREFIX_0F3815,
1047 PREFIX_0F3817,
1048 PREFIX_0F3820,
1049 PREFIX_0F3821,
1050 PREFIX_0F3822,
1051 PREFIX_0F3823,
1052 PREFIX_0F3824,
1053 PREFIX_0F3825,
1054 PREFIX_0F3828,
1055 PREFIX_0F3829,
1056 PREFIX_0F382A,
1057 PREFIX_0F382B,
1058 PREFIX_0F3830,
1059 PREFIX_0F3831,
1060 PREFIX_0F3832,
1061 PREFIX_0F3833,
1062 PREFIX_0F3834,
1063 PREFIX_0F3835,
1064 PREFIX_0F3837,
1065 PREFIX_0F3838,
1066 PREFIX_0F3839,
1067 PREFIX_0F383A,
1068 PREFIX_0F383B,
1069 PREFIX_0F383C,
1070 PREFIX_0F383D,
1071 PREFIX_0F383E,
1072 PREFIX_0F383F,
1073 PREFIX_0F3840,
1074 PREFIX_0F3841,
1075 PREFIX_0F3880,
1076 PREFIX_0F3881,
1077 PREFIX_0F3882,
1078 PREFIX_0F38C8,
1079 PREFIX_0F38C9,
1080 PREFIX_0F38CA,
1081 PREFIX_0F38CB,
1082 PREFIX_0F38CC,
1083 PREFIX_0F38CD,
1084 PREFIX_0F38CF,
1085 PREFIX_0F38DB,
1086 PREFIX_0F38DC,
1087 PREFIX_0F38DD,
1088 PREFIX_0F38DE,
1089 PREFIX_0F38DF,
1090 PREFIX_0F38F0,
1091 PREFIX_0F38F1,
1092 PREFIX_0F38F5,
1093 PREFIX_0F38F6,
1094 PREFIX_0F38F8,
1095 PREFIX_0F38F9,
1096 PREFIX_0F3A08,
1097 PREFIX_0F3A09,
1098 PREFIX_0F3A0A,
1099 PREFIX_0F3A0B,
1100 PREFIX_0F3A0C,
1101 PREFIX_0F3A0D,
1102 PREFIX_0F3A0E,
1103 PREFIX_0F3A14,
1104 PREFIX_0F3A15,
1105 PREFIX_0F3A16,
1106 PREFIX_0F3A17,
1107 PREFIX_0F3A20,
1108 PREFIX_0F3A21,
1109 PREFIX_0F3A22,
1110 PREFIX_0F3A40,
1111 PREFIX_0F3A41,
1112 PREFIX_0F3A42,
1113 PREFIX_0F3A44,
1114 PREFIX_0F3A60,
1115 PREFIX_0F3A61,
1116 PREFIX_0F3A62,
1117 PREFIX_0F3A63,
1118 PREFIX_0F3ACC,
1119 PREFIX_0F3ACE,
1120 PREFIX_0F3ACF,
1121 PREFIX_0F3ADF,
1122 PREFIX_VEX_0F10,
1123 PREFIX_VEX_0F11,
1124 PREFIX_VEX_0F12,
1125 PREFIX_VEX_0F16,
1126 PREFIX_VEX_0F2A,
1127 PREFIX_VEX_0F2C,
1128 PREFIX_VEX_0F2D,
1129 PREFIX_VEX_0F2E,
1130 PREFIX_VEX_0F2F,
1131 PREFIX_VEX_0F41,
1132 PREFIX_VEX_0F42,
1133 PREFIX_VEX_0F44,
1134 PREFIX_VEX_0F45,
1135 PREFIX_VEX_0F46,
1136 PREFIX_VEX_0F47,
1137 PREFIX_VEX_0F4A,
1138 PREFIX_VEX_0F4B,
1139 PREFIX_VEX_0F51,
1140 PREFIX_VEX_0F52,
1141 PREFIX_VEX_0F53,
1142 PREFIX_VEX_0F58,
1143 PREFIX_VEX_0F59,
1144 PREFIX_VEX_0F5A,
1145 PREFIX_VEX_0F5B,
1146 PREFIX_VEX_0F5C,
1147 PREFIX_VEX_0F5D,
1148 PREFIX_VEX_0F5E,
1149 PREFIX_VEX_0F5F,
1150 PREFIX_VEX_0F60,
1151 PREFIX_VEX_0F61,
1152 PREFIX_VEX_0F62,
1153 PREFIX_VEX_0F63,
1154 PREFIX_VEX_0F64,
1155 PREFIX_VEX_0F65,
1156 PREFIX_VEX_0F66,
1157 PREFIX_VEX_0F67,
1158 PREFIX_VEX_0F68,
1159 PREFIX_VEX_0F69,
1160 PREFIX_VEX_0F6A,
1161 PREFIX_VEX_0F6B,
1162 PREFIX_VEX_0F6C,
1163 PREFIX_VEX_0F6D,
1164 PREFIX_VEX_0F6E,
1165 PREFIX_VEX_0F6F,
1166 PREFIX_VEX_0F70,
1167 PREFIX_VEX_0F71_REG_2,
1168 PREFIX_VEX_0F71_REG_4,
1169 PREFIX_VEX_0F71_REG_6,
1170 PREFIX_VEX_0F72_REG_2,
1171 PREFIX_VEX_0F72_REG_4,
1172 PREFIX_VEX_0F72_REG_6,
1173 PREFIX_VEX_0F73_REG_2,
1174 PREFIX_VEX_0F73_REG_3,
1175 PREFIX_VEX_0F73_REG_6,
1176 PREFIX_VEX_0F73_REG_7,
1177 PREFIX_VEX_0F74,
1178 PREFIX_VEX_0F75,
1179 PREFIX_VEX_0F76,
1180 PREFIX_VEX_0F77,
1181 PREFIX_VEX_0F7C,
1182 PREFIX_VEX_0F7D,
1183 PREFIX_VEX_0F7E,
1184 PREFIX_VEX_0F7F,
1185 PREFIX_VEX_0F90,
1186 PREFIX_VEX_0F91,
1187 PREFIX_VEX_0F92,
1188 PREFIX_VEX_0F93,
1189 PREFIX_VEX_0F98,
1190 PREFIX_VEX_0F99,
1191 PREFIX_VEX_0FC2,
1192 PREFIX_VEX_0FC4,
1193 PREFIX_VEX_0FC5,
1194 PREFIX_VEX_0FD0,
1195 PREFIX_VEX_0FD1,
1196 PREFIX_VEX_0FD2,
1197 PREFIX_VEX_0FD3,
1198 PREFIX_VEX_0FD4,
1199 PREFIX_VEX_0FD5,
1200 PREFIX_VEX_0FD6,
1201 PREFIX_VEX_0FD7,
1202 PREFIX_VEX_0FD8,
1203 PREFIX_VEX_0FD9,
1204 PREFIX_VEX_0FDA,
1205 PREFIX_VEX_0FDB,
1206 PREFIX_VEX_0FDC,
1207 PREFIX_VEX_0FDD,
1208 PREFIX_VEX_0FDE,
1209 PREFIX_VEX_0FDF,
1210 PREFIX_VEX_0FE0,
1211 PREFIX_VEX_0FE1,
1212 PREFIX_VEX_0FE2,
1213 PREFIX_VEX_0FE3,
1214 PREFIX_VEX_0FE4,
1215 PREFIX_VEX_0FE5,
1216 PREFIX_VEX_0FE6,
1217 PREFIX_VEX_0FE7,
1218 PREFIX_VEX_0FE8,
1219 PREFIX_VEX_0FE9,
1220 PREFIX_VEX_0FEA,
1221 PREFIX_VEX_0FEB,
1222 PREFIX_VEX_0FEC,
1223 PREFIX_VEX_0FED,
1224 PREFIX_VEX_0FEE,
1225 PREFIX_VEX_0FEF,
1226 PREFIX_VEX_0FF0,
1227 PREFIX_VEX_0FF1,
1228 PREFIX_VEX_0FF2,
1229 PREFIX_VEX_0FF3,
1230 PREFIX_VEX_0FF4,
1231 PREFIX_VEX_0FF5,
1232 PREFIX_VEX_0FF6,
1233 PREFIX_VEX_0FF7,
1234 PREFIX_VEX_0FF8,
1235 PREFIX_VEX_0FF9,
1236 PREFIX_VEX_0FFA,
1237 PREFIX_VEX_0FFB,
1238 PREFIX_VEX_0FFC,
1239 PREFIX_VEX_0FFD,
1240 PREFIX_VEX_0FFE,
1241 PREFIX_VEX_0F3800,
1242 PREFIX_VEX_0F3801,
1243 PREFIX_VEX_0F3802,
1244 PREFIX_VEX_0F3803,
1245 PREFIX_VEX_0F3804,
1246 PREFIX_VEX_0F3805,
1247 PREFIX_VEX_0F3806,
1248 PREFIX_VEX_0F3807,
1249 PREFIX_VEX_0F3808,
1250 PREFIX_VEX_0F3809,
1251 PREFIX_VEX_0F380A,
1252 PREFIX_VEX_0F380B,
1253 PREFIX_VEX_0F380C,
1254 PREFIX_VEX_0F380D,
1255 PREFIX_VEX_0F380E,
1256 PREFIX_VEX_0F380F,
1257 PREFIX_VEX_0F3813,
1258 PREFIX_VEX_0F3816,
1259 PREFIX_VEX_0F3817,
1260 PREFIX_VEX_0F3818,
1261 PREFIX_VEX_0F3819,
1262 PREFIX_VEX_0F381A,
1263 PREFIX_VEX_0F381C,
1264 PREFIX_VEX_0F381D,
1265 PREFIX_VEX_0F381E,
1266 PREFIX_VEX_0F3820,
1267 PREFIX_VEX_0F3821,
1268 PREFIX_VEX_0F3822,
1269 PREFIX_VEX_0F3823,
1270 PREFIX_VEX_0F3824,
1271 PREFIX_VEX_0F3825,
1272 PREFIX_VEX_0F3828,
1273 PREFIX_VEX_0F3829,
1274 PREFIX_VEX_0F382A,
1275 PREFIX_VEX_0F382B,
1276 PREFIX_VEX_0F382C,
1277 PREFIX_VEX_0F382D,
1278 PREFIX_VEX_0F382E,
1279 PREFIX_VEX_0F382F,
1280 PREFIX_VEX_0F3830,
1281 PREFIX_VEX_0F3831,
1282 PREFIX_VEX_0F3832,
1283 PREFIX_VEX_0F3833,
1284 PREFIX_VEX_0F3834,
1285 PREFIX_VEX_0F3835,
1286 PREFIX_VEX_0F3836,
1287 PREFIX_VEX_0F3837,
1288 PREFIX_VEX_0F3838,
1289 PREFIX_VEX_0F3839,
1290 PREFIX_VEX_0F383A,
1291 PREFIX_VEX_0F383B,
1292 PREFIX_VEX_0F383C,
1293 PREFIX_VEX_0F383D,
1294 PREFIX_VEX_0F383E,
1295 PREFIX_VEX_0F383F,
1296 PREFIX_VEX_0F3840,
1297 PREFIX_VEX_0F3841,
1298 PREFIX_VEX_0F3845,
1299 PREFIX_VEX_0F3846,
1300 PREFIX_VEX_0F3847,
1301 PREFIX_VEX_0F3858,
1302 PREFIX_VEX_0F3859,
1303 PREFIX_VEX_0F385A,
1304 PREFIX_VEX_0F3878,
1305 PREFIX_VEX_0F3879,
1306 PREFIX_VEX_0F388C,
1307 PREFIX_VEX_0F388E,
1308 PREFIX_VEX_0F3890,
1309 PREFIX_VEX_0F3891,
1310 PREFIX_VEX_0F3892,
1311 PREFIX_VEX_0F3893,
1312 PREFIX_VEX_0F3896,
1313 PREFIX_VEX_0F3897,
1314 PREFIX_VEX_0F3898,
1315 PREFIX_VEX_0F3899,
1316 PREFIX_VEX_0F389A,
1317 PREFIX_VEX_0F389B,
1318 PREFIX_VEX_0F389C,
1319 PREFIX_VEX_0F389D,
1320 PREFIX_VEX_0F389E,
1321 PREFIX_VEX_0F389F,
1322 PREFIX_VEX_0F38A6,
1323 PREFIX_VEX_0F38A7,
1324 PREFIX_VEX_0F38A8,
1325 PREFIX_VEX_0F38A9,
1326 PREFIX_VEX_0F38AA,
1327 PREFIX_VEX_0F38AB,
1328 PREFIX_VEX_0F38AC,
1329 PREFIX_VEX_0F38AD,
1330 PREFIX_VEX_0F38AE,
1331 PREFIX_VEX_0F38AF,
1332 PREFIX_VEX_0F38B6,
1333 PREFIX_VEX_0F38B7,
1334 PREFIX_VEX_0F38B8,
1335 PREFIX_VEX_0F38B9,
1336 PREFIX_VEX_0F38BA,
1337 PREFIX_VEX_0F38BB,
1338 PREFIX_VEX_0F38BC,
1339 PREFIX_VEX_0F38BD,
1340 PREFIX_VEX_0F38BE,
1341 PREFIX_VEX_0F38BF,
1342 PREFIX_VEX_0F38CF,
1343 PREFIX_VEX_0F38DB,
1344 PREFIX_VEX_0F38DC,
1345 PREFIX_VEX_0F38DD,
1346 PREFIX_VEX_0F38DE,
1347 PREFIX_VEX_0F38DF,
1348 PREFIX_VEX_0F38F2,
1349 PREFIX_VEX_0F38F3_REG_1,
1350 PREFIX_VEX_0F38F3_REG_2,
1351 PREFIX_VEX_0F38F3_REG_3,
1352 PREFIX_VEX_0F38F5,
1353 PREFIX_VEX_0F38F6,
1354 PREFIX_VEX_0F38F7,
1355 PREFIX_VEX_0F3A00,
1356 PREFIX_VEX_0F3A01,
1357 PREFIX_VEX_0F3A02,
1358 PREFIX_VEX_0F3A04,
1359 PREFIX_VEX_0F3A05,
1360 PREFIX_VEX_0F3A06,
1361 PREFIX_VEX_0F3A08,
1362 PREFIX_VEX_0F3A09,
1363 PREFIX_VEX_0F3A0A,
1364 PREFIX_VEX_0F3A0B,
1365 PREFIX_VEX_0F3A0C,
1366 PREFIX_VEX_0F3A0D,
1367 PREFIX_VEX_0F3A0E,
1368 PREFIX_VEX_0F3A0F,
1369 PREFIX_VEX_0F3A14,
1370 PREFIX_VEX_0F3A15,
1371 PREFIX_VEX_0F3A16,
1372 PREFIX_VEX_0F3A17,
1373 PREFIX_VEX_0F3A18,
1374 PREFIX_VEX_0F3A19,
1375 PREFIX_VEX_0F3A1D,
1376 PREFIX_VEX_0F3A20,
1377 PREFIX_VEX_0F3A21,
1378 PREFIX_VEX_0F3A22,
1379 PREFIX_VEX_0F3A30,
1380 PREFIX_VEX_0F3A31,
1381 PREFIX_VEX_0F3A32,
1382 PREFIX_VEX_0F3A33,
1383 PREFIX_VEX_0F3A38,
1384 PREFIX_VEX_0F3A39,
1385 PREFIX_VEX_0F3A40,
1386 PREFIX_VEX_0F3A41,
1387 PREFIX_VEX_0F3A42,
1388 PREFIX_VEX_0F3A44,
1389 PREFIX_VEX_0F3A46,
1390 PREFIX_VEX_0F3A48,
1391 PREFIX_VEX_0F3A49,
1392 PREFIX_VEX_0F3A4A,
1393 PREFIX_VEX_0F3A4B,
1394 PREFIX_VEX_0F3A4C,
1395 PREFIX_VEX_0F3A5C,
1396 PREFIX_VEX_0F3A5D,
1397 PREFIX_VEX_0F3A5E,
1398 PREFIX_VEX_0F3A5F,
1399 PREFIX_VEX_0F3A60,
1400 PREFIX_VEX_0F3A61,
1401 PREFIX_VEX_0F3A62,
1402 PREFIX_VEX_0F3A63,
1403 PREFIX_VEX_0F3A68,
1404 PREFIX_VEX_0F3A69,
1405 PREFIX_VEX_0F3A6A,
1406 PREFIX_VEX_0F3A6B,
1407 PREFIX_VEX_0F3A6C,
1408 PREFIX_VEX_0F3A6D,
1409 PREFIX_VEX_0F3A6E,
1410 PREFIX_VEX_0F3A6F,
1411 PREFIX_VEX_0F3A78,
1412 PREFIX_VEX_0F3A79,
1413 PREFIX_VEX_0F3A7A,
1414 PREFIX_VEX_0F3A7B,
1415 PREFIX_VEX_0F3A7C,
1416 PREFIX_VEX_0F3A7D,
1417 PREFIX_VEX_0F3A7E,
1418 PREFIX_VEX_0F3A7F,
1419 PREFIX_VEX_0F3ACE,
1420 PREFIX_VEX_0F3ACF,
1421 PREFIX_VEX_0F3ADF,
1422 PREFIX_VEX_0F3AF0,
1423
1424 PREFIX_EVEX_0F10,
1425 PREFIX_EVEX_0F11,
1426 PREFIX_EVEX_0F12,
1427 PREFIX_EVEX_0F13,
1428 PREFIX_EVEX_0F14,
1429 PREFIX_EVEX_0F15,
1430 PREFIX_EVEX_0F16,
1431 PREFIX_EVEX_0F17,
1432 PREFIX_EVEX_0F28,
1433 PREFIX_EVEX_0F29,
1434 PREFIX_EVEX_0F2A,
1435 PREFIX_EVEX_0F2B,
1436 PREFIX_EVEX_0F2C,
1437 PREFIX_EVEX_0F2D,
1438 PREFIX_EVEX_0F2E,
1439 PREFIX_EVEX_0F2F,
1440 PREFIX_EVEX_0F51,
1441 PREFIX_EVEX_0F54,
1442 PREFIX_EVEX_0F55,
1443 PREFIX_EVEX_0F56,
1444 PREFIX_EVEX_0F57,
1445 PREFIX_EVEX_0F58,
1446 PREFIX_EVEX_0F59,
1447 PREFIX_EVEX_0F5A,
1448 PREFIX_EVEX_0F5B,
1449 PREFIX_EVEX_0F5C,
1450 PREFIX_EVEX_0F5D,
1451 PREFIX_EVEX_0F5E,
1452 PREFIX_EVEX_0F5F,
1453 PREFIX_EVEX_0F60,
1454 PREFIX_EVEX_0F61,
1455 PREFIX_EVEX_0F62,
1456 PREFIX_EVEX_0F63,
1457 PREFIX_EVEX_0F64,
1458 PREFIX_EVEX_0F65,
1459 PREFIX_EVEX_0F66,
1460 PREFIX_EVEX_0F67,
1461 PREFIX_EVEX_0F68,
1462 PREFIX_EVEX_0F69,
1463 PREFIX_EVEX_0F6A,
1464 PREFIX_EVEX_0F6B,
1465 PREFIX_EVEX_0F6C,
1466 PREFIX_EVEX_0F6D,
1467 PREFIX_EVEX_0F6E,
1468 PREFIX_EVEX_0F6F,
1469 PREFIX_EVEX_0F70,
1470 PREFIX_EVEX_0F71_REG_2,
1471 PREFIX_EVEX_0F71_REG_4,
1472 PREFIX_EVEX_0F71_REG_6,
1473 PREFIX_EVEX_0F72_REG_0,
1474 PREFIX_EVEX_0F72_REG_1,
1475 PREFIX_EVEX_0F72_REG_2,
1476 PREFIX_EVEX_0F72_REG_4,
1477 PREFIX_EVEX_0F72_REG_6,
1478 PREFIX_EVEX_0F73_REG_2,
1479 PREFIX_EVEX_0F73_REG_3,
1480 PREFIX_EVEX_0F73_REG_6,
1481 PREFIX_EVEX_0F73_REG_7,
1482 PREFIX_EVEX_0F74,
1483 PREFIX_EVEX_0F75,
1484 PREFIX_EVEX_0F76,
1485 PREFIX_EVEX_0F78,
1486 PREFIX_EVEX_0F79,
1487 PREFIX_EVEX_0F7A,
1488 PREFIX_EVEX_0F7B,
1489 PREFIX_EVEX_0F7E,
1490 PREFIX_EVEX_0F7F,
1491 PREFIX_EVEX_0FC2,
1492 PREFIX_EVEX_0FC4,
1493 PREFIX_EVEX_0FC5,
1494 PREFIX_EVEX_0FC6,
1495 PREFIX_EVEX_0FD1,
1496 PREFIX_EVEX_0FD2,
1497 PREFIX_EVEX_0FD3,
1498 PREFIX_EVEX_0FD4,
1499 PREFIX_EVEX_0FD5,
1500 PREFIX_EVEX_0FD6,
1501 PREFIX_EVEX_0FD8,
1502 PREFIX_EVEX_0FD9,
1503 PREFIX_EVEX_0FDA,
1504 PREFIX_EVEX_0FDB,
1505 PREFIX_EVEX_0FDC,
1506 PREFIX_EVEX_0FDD,
1507 PREFIX_EVEX_0FDE,
1508 PREFIX_EVEX_0FDF,
1509 PREFIX_EVEX_0FE0,
1510 PREFIX_EVEX_0FE1,
1511 PREFIX_EVEX_0FE2,
1512 PREFIX_EVEX_0FE3,
1513 PREFIX_EVEX_0FE4,
1514 PREFIX_EVEX_0FE5,
1515 PREFIX_EVEX_0FE6,
1516 PREFIX_EVEX_0FE7,
1517 PREFIX_EVEX_0FE8,
1518 PREFIX_EVEX_0FE9,
1519 PREFIX_EVEX_0FEA,
1520 PREFIX_EVEX_0FEB,
1521 PREFIX_EVEX_0FEC,
1522 PREFIX_EVEX_0FED,
1523 PREFIX_EVEX_0FEE,
1524 PREFIX_EVEX_0FEF,
1525 PREFIX_EVEX_0FF1,
1526 PREFIX_EVEX_0FF2,
1527 PREFIX_EVEX_0FF3,
1528 PREFIX_EVEX_0FF4,
1529 PREFIX_EVEX_0FF5,
1530 PREFIX_EVEX_0FF6,
1531 PREFIX_EVEX_0FF8,
1532 PREFIX_EVEX_0FF9,
1533 PREFIX_EVEX_0FFA,
1534 PREFIX_EVEX_0FFB,
1535 PREFIX_EVEX_0FFC,
1536 PREFIX_EVEX_0FFD,
1537 PREFIX_EVEX_0FFE,
1538 PREFIX_EVEX_0F3800,
1539 PREFIX_EVEX_0F3804,
1540 PREFIX_EVEX_0F380B,
1541 PREFIX_EVEX_0F380C,
1542 PREFIX_EVEX_0F380D,
1543 PREFIX_EVEX_0F3810,
1544 PREFIX_EVEX_0F3811,
1545 PREFIX_EVEX_0F3812,
1546 PREFIX_EVEX_0F3813,
1547 PREFIX_EVEX_0F3814,
1548 PREFIX_EVEX_0F3815,
1549 PREFIX_EVEX_0F3816,
1550 PREFIX_EVEX_0F3818,
1551 PREFIX_EVEX_0F3819,
1552 PREFIX_EVEX_0F381A,
1553 PREFIX_EVEX_0F381B,
1554 PREFIX_EVEX_0F381C,
1555 PREFIX_EVEX_0F381D,
1556 PREFIX_EVEX_0F381E,
1557 PREFIX_EVEX_0F381F,
1558 PREFIX_EVEX_0F3820,
1559 PREFIX_EVEX_0F3821,
1560 PREFIX_EVEX_0F3822,
1561 PREFIX_EVEX_0F3823,
1562 PREFIX_EVEX_0F3824,
1563 PREFIX_EVEX_0F3825,
1564 PREFIX_EVEX_0F3826,
1565 PREFIX_EVEX_0F3827,
1566 PREFIX_EVEX_0F3828,
1567 PREFIX_EVEX_0F3829,
1568 PREFIX_EVEX_0F382A,
1569 PREFIX_EVEX_0F382B,
1570 PREFIX_EVEX_0F382C,
1571 PREFIX_EVEX_0F382D,
1572 PREFIX_EVEX_0F3830,
1573 PREFIX_EVEX_0F3831,
1574 PREFIX_EVEX_0F3832,
1575 PREFIX_EVEX_0F3833,
1576 PREFIX_EVEX_0F3834,
1577 PREFIX_EVEX_0F3835,
1578 PREFIX_EVEX_0F3836,
1579 PREFIX_EVEX_0F3837,
1580 PREFIX_EVEX_0F3838,
1581 PREFIX_EVEX_0F3839,
1582 PREFIX_EVEX_0F383A,
1583 PREFIX_EVEX_0F383B,
1584 PREFIX_EVEX_0F383C,
1585 PREFIX_EVEX_0F383D,
1586 PREFIX_EVEX_0F383E,
1587 PREFIX_EVEX_0F383F,
1588 PREFIX_EVEX_0F3840,
1589 PREFIX_EVEX_0F3842,
1590 PREFIX_EVEX_0F3843,
1591 PREFIX_EVEX_0F3844,
1592 PREFIX_EVEX_0F3845,
1593 PREFIX_EVEX_0F3846,
1594 PREFIX_EVEX_0F3847,
1595 PREFIX_EVEX_0F384C,
1596 PREFIX_EVEX_0F384D,
1597 PREFIX_EVEX_0F384E,
1598 PREFIX_EVEX_0F384F,
1599 PREFIX_EVEX_0F3850,
1600 PREFIX_EVEX_0F3851,
1601 PREFIX_EVEX_0F3852,
1602 PREFIX_EVEX_0F3853,
1603 PREFIX_EVEX_0F3854,
1604 PREFIX_EVEX_0F3855,
1605 PREFIX_EVEX_0F3858,
1606 PREFIX_EVEX_0F3859,
1607 PREFIX_EVEX_0F385A,
1608 PREFIX_EVEX_0F385B,
1609 PREFIX_EVEX_0F3862,
1610 PREFIX_EVEX_0F3863,
1611 PREFIX_EVEX_0F3864,
1612 PREFIX_EVEX_0F3865,
1613 PREFIX_EVEX_0F3866,
1614 PREFIX_EVEX_0F3870,
1615 PREFIX_EVEX_0F3871,
1616 PREFIX_EVEX_0F3872,
1617 PREFIX_EVEX_0F3873,
1618 PREFIX_EVEX_0F3875,
1619 PREFIX_EVEX_0F3876,
1620 PREFIX_EVEX_0F3877,
1621 PREFIX_EVEX_0F3878,
1622 PREFIX_EVEX_0F3879,
1623 PREFIX_EVEX_0F387A,
1624 PREFIX_EVEX_0F387B,
1625 PREFIX_EVEX_0F387C,
1626 PREFIX_EVEX_0F387D,
1627 PREFIX_EVEX_0F387E,
1628 PREFIX_EVEX_0F387F,
1629 PREFIX_EVEX_0F3883,
1630 PREFIX_EVEX_0F3888,
1631 PREFIX_EVEX_0F3889,
1632 PREFIX_EVEX_0F388A,
1633 PREFIX_EVEX_0F388B,
1634 PREFIX_EVEX_0F388D,
1635 PREFIX_EVEX_0F388F,
1636 PREFIX_EVEX_0F3890,
1637 PREFIX_EVEX_0F3891,
1638 PREFIX_EVEX_0F3892,
1639 PREFIX_EVEX_0F3893,
1640 PREFIX_EVEX_0F3896,
1641 PREFIX_EVEX_0F3897,
1642 PREFIX_EVEX_0F3898,
1643 PREFIX_EVEX_0F3899,
1644 PREFIX_EVEX_0F389A,
1645 PREFIX_EVEX_0F389B,
1646 PREFIX_EVEX_0F389C,
1647 PREFIX_EVEX_0F389D,
1648 PREFIX_EVEX_0F389E,
1649 PREFIX_EVEX_0F389F,
1650 PREFIX_EVEX_0F38A0,
1651 PREFIX_EVEX_0F38A1,
1652 PREFIX_EVEX_0F38A2,
1653 PREFIX_EVEX_0F38A3,
1654 PREFIX_EVEX_0F38A6,
1655 PREFIX_EVEX_0F38A7,
1656 PREFIX_EVEX_0F38A8,
1657 PREFIX_EVEX_0F38A9,
1658 PREFIX_EVEX_0F38AA,
1659 PREFIX_EVEX_0F38AB,
1660 PREFIX_EVEX_0F38AC,
1661 PREFIX_EVEX_0F38AD,
1662 PREFIX_EVEX_0F38AE,
1663 PREFIX_EVEX_0F38AF,
1664 PREFIX_EVEX_0F38B4,
1665 PREFIX_EVEX_0F38B5,
1666 PREFIX_EVEX_0F38B6,
1667 PREFIX_EVEX_0F38B7,
1668 PREFIX_EVEX_0F38B8,
1669 PREFIX_EVEX_0F38B9,
1670 PREFIX_EVEX_0F38BA,
1671 PREFIX_EVEX_0F38BB,
1672 PREFIX_EVEX_0F38BC,
1673 PREFIX_EVEX_0F38BD,
1674 PREFIX_EVEX_0F38BE,
1675 PREFIX_EVEX_0F38BF,
1676 PREFIX_EVEX_0F38C4,
1677 PREFIX_EVEX_0F38C6_REG_1,
1678 PREFIX_EVEX_0F38C6_REG_2,
1679 PREFIX_EVEX_0F38C6_REG_5,
1680 PREFIX_EVEX_0F38C6_REG_6,
1681 PREFIX_EVEX_0F38C7_REG_1,
1682 PREFIX_EVEX_0F38C7_REG_2,
1683 PREFIX_EVEX_0F38C7_REG_5,
1684 PREFIX_EVEX_0F38C7_REG_6,
1685 PREFIX_EVEX_0F38C8,
1686 PREFIX_EVEX_0F38CA,
1687 PREFIX_EVEX_0F38CB,
1688 PREFIX_EVEX_0F38CC,
1689 PREFIX_EVEX_0F38CD,
1690 PREFIX_EVEX_0F38CF,
1691 PREFIX_EVEX_0F38DC,
1692 PREFIX_EVEX_0F38DD,
1693 PREFIX_EVEX_0F38DE,
1694 PREFIX_EVEX_0F38DF,
1695
1696 PREFIX_EVEX_0F3A00,
1697 PREFIX_EVEX_0F3A01,
1698 PREFIX_EVEX_0F3A03,
1699 PREFIX_EVEX_0F3A04,
1700 PREFIX_EVEX_0F3A05,
1701 PREFIX_EVEX_0F3A08,
1702 PREFIX_EVEX_0F3A09,
1703 PREFIX_EVEX_0F3A0A,
1704 PREFIX_EVEX_0F3A0B,
1705 PREFIX_EVEX_0F3A0F,
1706 PREFIX_EVEX_0F3A14,
1707 PREFIX_EVEX_0F3A15,
1708 PREFIX_EVEX_0F3A16,
1709 PREFIX_EVEX_0F3A17,
1710 PREFIX_EVEX_0F3A18,
1711 PREFIX_EVEX_0F3A19,
1712 PREFIX_EVEX_0F3A1A,
1713 PREFIX_EVEX_0F3A1B,
1714 PREFIX_EVEX_0F3A1D,
1715 PREFIX_EVEX_0F3A1E,
1716 PREFIX_EVEX_0F3A1F,
1717 PREFIX_EVEX_0F3A20,
1718 PREFIX_EVEX_0F3A21,
1719 PREFIX_EVEX_0F3A22,
1720 PREFIX_EVEX_0F3A23,
1721 PREFIX_EVEX_0F3A25,
1722 PREFIX_EVEX_0F3A26,
1723 PREFIX_EVEX_0F3A27,
1724 PREFIX_EVEX_0F3A38,
1725 PREFIX_EVEX_0F3A39,
1726 PREFIX_EVEX_0F3A3A,
1727 PREFIX_EVEX_0F3A3B,
1728 PREFIX_EVEX_0F3A3E,
1729 PREFIX_EVEX_0F3A3F,
1730 PREFIX_EVEX_0F3A42,
1731 PREFIX_EVEX_0F3A43,
1732 PREFIX_EVEX_0F3A44,
1733 PREFIX_EVEX_0F3A50,
1734 PREFIX_EVEX_0F3A51,
1735 PREFIX_EVEX_0F3A54,
1736 PREFIX_EVEX_0F3A55,
1737 PREFIX_EVEX_0F3A56,
1738 PREFIX_EVEX_0F3A57,
1739 PREFIX_EVEX_0F3A66,
1740 PREFIX_EVEX_0F3A67,
1741 PREFIX_EVEX_0F3A70,
1742 PREFIX_EVEX_0F3A71,
1743 PREFIX_EVEX_0F3A72,
1744 PREFIX_EVEX_0F3A73,
1745 PREFIX_EVEX_0F3ACE,
1746 PREFIX_EVEX_0F3ACF
1747 };
1748
1749 enum
1750 {
1751 X86_64_06 = 0,
1752 X86_64_07,
1753 X86_64_0D,
1754 X86_64_16,
1755 X86_64_17,
1756 X86_64_1E,
1757 X86_64_1F,
1758 X86_64_27,
1759 X86_64_2F,
1760 X86_64_37,
1761 X86_64_3F,
1762 X86_64_60,
1763 X86_64_61,
1764 X86_64_62,
1765 X86_64_63,
1766 X86_64_6D,
1767 X86_64_6F,
1768 X86_64_82,
1769 X86_64_9A,
1770 X86_64_C4,
1771 X86_64_C5,
1772 X86_64_CE,
1773 X86_64_D4,
1774 X86_64_D5,
1775 X86_64_E8,
1776 X86_64_E9,
1777 X86_64_EA,
1778 X86_64_0F01_REG_0,
1779 X86_64_0F01_REG_1,
1780 X86_64_0F01_REG_2,
1781 X86_64_0F01_REG_3
1782 };
1783
1784 enum
1785 {
1786 THREE_BYTE_0F38 = 0,
1787 THREE_BYTE_0F3A
1788 };
1789
1790 enum
1791 {
1792 XOP_08 = 0,
1793 XOP_09,
1794 XOP_0A
1795 };
1796
1797 enum
1798 {
1799 VEX_0F = 0,
1800 VEX_0F38,
1801 VEX_0F3A
1802 };
1803
1804 enum
1805 {
1806 EVEX_0F = 0,
1807 EVEX_0F38,
1808 EVEX_0F3A
1809 };
1810
1811 enum
1812 {
1813 VEX_LEN_0F12_P_0_M_0 = 0,
1814 VEX_LEN_0F12_P_0_M_1,
1815 VEX_LEN_0F12_P_2,
1816 VEX_LEN_0F13_M_0,
1817 VEX_LEN_0F16_P_0_M_0,
1818 VEX_LEN_0F16_P_0_M_1,
1819 VEX_LEN_0F16_P_2,
1820 VEX_LEN_0F17_M_0,
1821 VEX_LEN_0F2A_P_1,
1822 VEX_LEN_0F2A_P_3,
1823 VEX_LEN_0F2C_P_1,
1824 VEX_LEN_0F2C_P_3,
1825 VEX_LEN_0F2D_P_1,
1826 VEX_LEN_0F2D_P_3,
1827 VEX_LEN_0F41_P_0,
1828 VEX_LEN_0F41_P_2,
1829 VEX_LEN_0F42_P_0,
1830 VEX_LEN_0F42_P_2,
1831 VEX_LEN_0F44_P_0,
1832 VEX_LEN_0F44_P_2,
1833 VEX_LEN_0F45_P_0,
1834 VEX_LEN_0F45_P_2,
1835 VEX_LEN_0F46_P_0,
1836 VEX_LEN_0F46_P_2,
1837 VEX_LEN_0F47_P_0,
1838 VEX_LEN_0F47_P_2,
1839 VEX_LEN_0F4A_P_0,
1840 VEX_LEN_0F4A_P_2,
1841 VEX_LEN_0F4B_P_0,
1842 VEX_LEN_0F4B_P_2,
1843 VEX_LEN_0F6E_P_2,
1844 VEX_LEN_0F77_P_0,
1845 VEX_LEN_0F7E_P_1,
1846 VEX_LEN_0F7E_P_2,
1847 VEX_LEN_0F90_P_0,
1848 VEX_LEN_0F90_P_2,
1849 VEX_LEN_0F91_P_0,
1850 VEX_LEN_0F91_P_2,
1851 VEX_LEN_0F92_P_0,
1852 VEX_LEN_0F92_P_2,
1853 VEX_LEN_0F92_P_3,
1854 VEX_LEN_0F93_P_0,
1855 VEX_LEN_0F93_P_2,
1856 VEX_LEN_0F93_P_3,
1857 VEX_LEN_0F98_P_0,
1858 VEX_LEN_0F98_P_2,
1859 VEX_LEN_0F99_P_0,
1860 VEX_LEN_0F99_P_2,
1861 VEX_LEN_0FAE_R_2_M_0,
1862 VEX_LEN_0FAE_R_3_M_0,
1863 VEX_LEN_0FC4_P_2,
1864 VEX_LEN_0FC5_P_2,
1865 VEX_LEN_0FD6_P_2,
1866 VEX_LEN_0FF7_P_2,
1867 VEX_LEN_0F3816_P_2,
1868 VEX_LEN_0F3819_P_2,
1869 VEX_LEN_0F381A_P_2_M_0,
1870 VEX_LEN_0F3836_P_2,
1871 VEX_LEN_0F3841_P_2,
1872 VEX_LEN_0F385A_P_2_M_0,
1873 VEX_LEN_0F38DB_P_2,
1874 VEX_LEN_0F38F2_P_0,
1875 VEX_LEN_0F38F3_R_1_P_0,
1876 VEX_LEN_0F38F3_R_2_P_0,
1877 VEX_LEN_0F38F3_R_3_P_0,
1878 VEX_LEN_0F38F5_P_0,
1879 VEX_LEN_0F38F5_P_1,
1880 VEX_LEN_0F38F5_P_3,
1881 VEX_LEN_0F38F6_P_3,
1882 VEX_LEN_0F38F7_P_0,
1883 VEX_LEN_0F38F7_P_1,
1884 VEX_LEN_0F38F7_P_2,
1885 VEX_LEN_0F38F7_P_3,
1886 VEX_LEN_0F3A00_P_2,
1887 VEX_LEN_0F3A01_P_2,
1888 VEX_LEN_0F3A06_P_2,
1889 VEX_LEN_0F3A14_P_2,
1890 VEX_LEN_0F3A15_P_2,
1891 VEX_LEN_0F3A16_P_2,
1892 VEX_LEN_0F3A17_P_2,
1893 VEX_LEN_0F3A18_P_2,
1894 VEX_LEN_0F3A19_P_2,
1895 VEX_LEN_0F3A20_P_2,
1896 VEX_LEN_0F3A21_P_2,
1897 VEX_LEN_0F3A22_P_2,
1898 VEX_LEN_0F3A30_P_2,
1899 VEX_LEN_0F3A31_P_2,
1900 VEX_LEN_0F3A32_P_2,
1901 VEX_LEN_0F3A33_P_2,
1902 VEX_LEN_0F3A38_P_2,
1903 VEX_LEN_0F3A39_P_2,
1904 VEX_LEN_0F3A41_P_2,
1905 VEX_LEN_0F3A46_P_2,
1906 VEX_LEN_0F3A60_P_2,
1907 VEX_LEN_0F3A61_P_2,
1908 VEX_LEN_0F3A62_P_2,
1909 VEX_LEN_0F3A63_P_2,
1910 VEX_LEN_0F3A6A_P_2,
1911 VEX_LEN_0F3A6B_P_2,
1912 VEX_LEN_0F3A6E_P_2,
1913 VEX_LEN_0F3A6F_P_2,
1914 VEX_LEN_0F3A7A_P_2,
1915 VEX_LEN_0F3A7B_P_2,
1916 VEX_LEN_0F3A7E_P_2,
1917 VEX_LEN_0F3A7F_P_2,
1918 VEX_LEN_0F3ADF_P_2,
1919 VEX_LEN_0F3AF0_P_3,
1920 VEX_LEN_0FXOP_08_CC,
1921 VEX_LEN_0FXOP_08_CD,
1922 VEX_LEN_0FXOP_08_CE,
1923 VEX_LEN_0FXOP_08_CF,
1924 VEX_LEN_0FXOP_08_EC,
1925 VEX_LEN_0FXOP_08_ED,
1926 VEX_LEN_0FXOP_08_EE,
1927 VEX_LEN_0FXOP_08_EF,
1928 VEX_LEN_0FXOP_09_80,
1929 VEX_LEN_0FXOP_09_81
1930 };
1931
1932 enum
1933 {
1934 EVEX_LEN_0F6E_P_2 = 0,
1935 EVEX_LEN_0F7E_P_1,
1936 EVEX_LEN_0F7E_P_2,
1937 EVEX_LEN_0FD6_P_2
1938 };
1939
1940 enum
1941 {
1942 VEX_W_0F41_P_0_LEN_1 = 0,
1943 VEX_W_0F41_P_2_LEN_1,
1944 VEX_W_0F42_P_0_LEN_1,
1945 VEX_W_0F42_P_2_LEN_1,
1946 VEX_W_0F44_P_0_LEN_0,
1947 VEX_W_0F44_P_2_LEN_0,
1948 VEX_W_0F45_P_0_LEN_1,
1949 VEX_W_0F45_P_2_LEN_1,
1950 VEX_W_0F46_P_0_LEN_1,
1951 VEX_W_0F46_P_2_LEN_1,
1952 VEX_W_0F47_P_0_LEN_1,
1953 VEX_W_0F47_P_2_LEN_1,
1954 VEX_W_0F4A_P_0_LEN_1,
1955 VEX_W_0F4A_P_2_LEN_1,
1956 VEX_W_0F4B_P_0_LEN_1,
1957 VEX_W_0F4B_P_2_LEN_1,
1958 VEX_W_0F90_P_0_LEN_0,
1959 VEX_W_0F90_P_2_LEN_0,
1960 VEX_W_0F91_P_0_LEN_0,
1961 VEX_W_0F91_P_2_LEN_0,
1962 VEX_W_0F92_P_0_LEN_0,
1963 VEX_W_0F92_P_2_LEN_0,
1964 VEX_W_0F93_P_0_LEN_0,
1965 VEX_W_0F93_P_2_LEN_0,
1966 VEX_W_0F98_P_0_LEN_0,
1967 VEX_W_0F98_P_2_LEN_0,
1968 VEX_W_0F99_P_0_LEN_0,
1969 VEX_W_0F99_P_2_LEN_0,
1970 VEX_W_0F380C_P_2,
1971 VEX_W_0F380D_P_2,
1972 VEX_W_0F380E_P_2,
1973 VEX_W_0F380F_P_2,
1974 VEX_W_0F3816_P_2,
1975 VEX_W_0F3818_P_2,
1976 VEX_W_0F3819_P_2,
1977 VEX_W_0F381A_P_2_M_0,
1978 VEX_W_0F382C_P_2_M_0,
1979 VEX_W_0F382D_P_2_M_0,
1980 VEX_W_0F382E_P_2_M_0,
1981 VEX_W_0F382F_P_2_M_0,
1982 VEX_W_0F3836_P_2,
1983 VEX_W_0F3846_P_2,
1984 VEX_W_0F3858_P_2,
1985 VEX_W_0F3859_P_2,
1986 VEX_W_0F385A_P_2_M_0,
1987 VEX_W_0F3878_P_2,
1988 VEX_W_0F3879_P_2,
1989 VEX_W_0F38CF_P_2,
1990 VEX_W_0F3A00_P_2,
1991 VEX_W_0F3A01_P_2,
1992 VEX_W_0F3A02_P_2,
1993 VEX_W_0F3A04_P_2,
1994 VEX_W_0F3A05_P_2,
1995 VEX_W_0F3A06_P_2,
1996 VEX_W_0F3A18_P_2,
1997 VEX_W_0F3A19_P_2,
1998 VEX_W_0F3A30_P_2_LEN_0,
1999 VEX_W_0F3A31_P_2_LEN_0,
2000 VEX_W_0F3A32_P_2_LEN_0,
2001 VEX_W_0F3A33_P_2_LEN_0,
2002 VEX_W_0F3A38_P_2,
2003 VEX_W_0F3A39_P_2,
2004 VEX_W_0F3A46_P_2,
2005 VEX_W_0F3A48_P_2,
2006 VEX_W_0F3A49_P_2,
2007 VEX_W_0F3A4A_P_2,
2008 VEX_W_0F3A4B_P_2,
2009 VEX_W_0F3A4C_P_2,
2010 VEX_W_0F3ACE_P_2,
2011 VEX_W_0F3ACF_P_2,
2012
2013 EVEX_W_0F10_P_0,
2014 EVEX_W_0F10_P_1_M_0,
2015 EVEX_W_0F10_P_1_M_1,
2016 EVEX_W_0F10_P_2,
2017 EVEX_W_0F10_P_3_M_0,
2018 EVEX_W_0F10_P_3_M_1,
2019 EVEX_W_0F11_P_0,
2020 EVEX_W_0F11_P_1_M_0,
2021 EVEX_W_0F11_P_1_M_1,
2022 EVEX_W_0F11_P_2,
2023 EVEX_W_0F11_P_3_M_0,
2024 EVEX_W_0F11_P_3_M_1,
2025 EVEX_W_0F12_P_0_M_0,
2026 EVEX_W_0F12_P_0_M_1,
2027 EVEX_W_0F12_P_1,
2028 EVEX_W_0F12_P_2,
2029 EVEX_W_0F12_P_3,
2030 EVEX_W_0F13_P_0,
2031 EVEX_W_0F13_P_2,
2032 EVEX_W_0F14_P_0,
2033 EVEX_W_0F14_P_2,
2034 EVEX_W_0F15_P_0,
2035 EVEX_W_0F15_P_2,
2036 EVEX_W_0F16_P_0_M_0,
2037 EVEX_W_0F16_P_0_M_1,
2038 EVEX_W_0F16_P_1,
2039 EVEX_W_0F16_P_2,
2040 EVEX_W_0F17_P_0,
2041 EVEX_W_0F17_P_2,
2042 EVEX_W_0F28_P_0,
2043 EVEX_W_0F28_P_2,
2044 EVEX_W_0F29_P_0,
2045 EVEX_W_0F29_P_2,
2046 EVEX_W_0F2A_P_1,
2047 EVEX_W_0F2A_P_3,
2048 EVEX_W_0F2B_P_0,
2049 EVEX_W_0F2B_P_2,
2050 EVEX_W_0F2E_P_0,
2051 EVEX_W_0F2E_P_2,
2052 EVEX_W_0F2F_P_0,
2053 EVEX_W_0F2F_P_2,
2054 EVEX_W_0F51_P_0,
2055 EVEX_W_0F51_P_1,
2056 EVEX_W_0F51_P_2,
2057 EVEX_W_0F51_P_3,
2058 EVEX_W_0F54_P_0,
2059 EVEX_W_0F54_P_2,
2060 EVEX_W_0F55_P_0,
2061 EVEX_W_0F55_P_2,
2062 EVEX_W_0F56_P_0,
2063 EVEX_W_0F56_P_2,
2064 EVEX_W_0F57_P_0,
2065 EVEX_W_0F57_P_2,
2066 EVEX_W_0F58_P_0,
2067 EVEX_W_0F58_P_1,
2068 EVEX_W_0F58_P_2,
2069 EVEX_W_0F58_P_3,
2070 EVEX_W_0F59_P_0,
2071 EVEX_W_0F59_P_1,
2072 EVEX_W_0F59_P_2,
2073 EVEX_W_0F59_P_3,
2074 EVEX_W_0F5A_P_0,
2075 EVEX_W_0F5A_P_1,
2076 EVEX_W_0F5A_P_2,
2077 EVEX_W_0F5A_P_3,
2078 EVEX_W_0F5B_P_0,
2079 EVEX_W_0F5B_P_1,
2080 EVEX_W_0F5B_P_2,
2081 EVEX_W_0F5C_P_0,
2082 EVEX_W_0F5C_P_1,
2083 EVEX_W_0F5C_P_2,
2084 EVEX_W_0F5C_P_3,
2085 EVEX_W_0F5D_P_0,
2086 EVEX_W_0F5D_P_1,
2087 EVEX_W_0F5D_P_2,
2088 EVEX_W_0F5D_P_3,
2089 EVEX_W_0F5E_P_0,
2090 EVEX_W_0F5E_P_1,
2091 EVEX_W_0F5E_P_2,
2092 EVEX_W_0F5E_P_3,
2093 EVEX_W_0F5F_P_0,
2094 EVEX_W_0F5F_P_1,
2095 EVEX_W_0F5F_P_2,
2096 EVEX_W_0F5F_P_3,
2097 EVEX_W_0F62_P_2,
2098 EVEX_W_0F66_P_2,
2099 EVEX_W_0F6A_P_2,
2100 EVEX_W_0F6B_P_2,
2101 EVEX_W_0F6C_P_2,
2102 EVEX_W_0F6D_P_2,
2103 EVEX_W_0F6F_P_1,
2104 EVEX_W_0F6F_P_2,
2105 EVEX_W_0F6F_P_3,
2106 EVEX_W_0F70_P_2,
2107 EVEX_W_0F72_R_2_P_2,
2108 EVEX_W_0F72_R_6_P_2,
2109 EVEX_W_0F73_R_2_P_2,
2110 EVEX_W_0F73_R_6_P_2,
2111 EVEX_W_0F76_P_2,
2112 EVEX_W_0F78_P_0,
2113 EVEX_W_0F78_P_2,
2114 EVEX_W_0F79_P_0,
2115 EVEX_W_0F79_P_2,
2116 EVEX_W_0F7A_P_1,
2117 EVEX_W_0F7A_P_2,
2118 EVEX_W_0F7A_P_3,
2119 EVEX_W_0F7B_P_1,
2120 EVEX_W_0F7B_P_2,
2121 EVEX_W_0F7B_P_3,
2122 EVEX_W_0F7E_P_1,
2123 EVEX_W_0F7F_P_1,
2124 EVEX_W_0F7F_P_2,
2125 EVEX_W_0F7F_P_3,
2126 EVEX_W_0FC2_P_0,
2127 EVEX_W_0FC2_P_1,
2128 EVEX_W_0FC2_P_2,
2129 EVEX_W_0FC2_P_3,
2130 EVEX_W_0FC6_P_0,
2131 EVEX_W_0FC6_P_2,
2132 EVEX_W_0FD2_P_2,
2133 EVEX_W_0FD3_P_2,
2134 EVEX_W_0FD4_P_2,
2135 EVEX_W_0FD6_P_2,
2136 EVEX_W_0FE6_P_1,
2137 EVEX_W_0FE6_P_2,
2138 EVEX_W_0FE6_P_3,
2139 EVEX_W_0FE7_P_2,
2140 EVEX_W_0FF2_P_2,
2141 EVEX_W_0FF3_P_2,
2142 EVEX_W_0FF4_P_2,
2143 EVEX_W_0FFA_P_2,
2144 EVEX_W_0FFB_P_2,
2145 EVEX_W_0FFE_P_2,
2146 EVEX_W_0F380C_P_2,
2147 EVEX_W_0F380D_P_2,
2148 EVEX_W_0F3810_P_1,
2149 EVEX_W_0F3810_P_2,
2150 EVEX_W_0F3811_P_1,
2151 EVEX_W_0F3811_P_2,
2152 EVEX_W_0F3812_P_1,
2153 EVEX_W_0F3812_P_2,
2154 EVEX_W_0F3813_P_1,
2155 EVEX_W_0F3813_P_2,
2156 EVEX_W_0F3814_P_1,
2157 EVEX_W_0F3815_P_1,
2158 EVEX_W_0F3818_P_2,
2159 EVEX_W_0F3819_P_2,
2160 EVEX_W_0F381A_P_2,
2161 EVEX_W_0F381B_P_2,
2162 EVEX_W_0F381E_P_2,
2163 EVEX_W_0F381F_P_2,
2164 EVEX_W_0F3820_P_1,
2165 EVEX_W_0F3821_P_1,
2166 EVEX_W_0F3822_P_1,
2167 EVEX_W_0F3823_P_1,
2168 EVEX_W_0F3824_P_1,
2169 EVEX_W_0F3825_P_1,
2170 EVEX_W_0F3825_P_2,
2171 EVEX_W_0F3826_P_1,
2172 EVEX_W_0F3826_P_2,
2173 EVEX_W_0F3828_P_1,
2174 EVEX_W_0F3828_P_2,
2175 EVEX_W_0F3829_P_1,
2176 EVEX_W_0F3829_P_2,
2177 EVEX_W_0F382A_P_1,
2178 EVEX_W_0F382A_P_2,
2179 EVEX_W_0F382B_P_2,
2180 EVEX_W_0F3830_P_1,
2181 EVEX_W_0F3831_P_1,
2182 EVEX_W_0F3832_P_1,
2183 EVEX_W_0F3833_P_1,
2184 EVEX_W_0F3834_P_1,
2185 EVEX_W_0F3835_P_1,
2186 EVEX_W_0F3835_P_2,
2187 EVEX_W_0F3837_P_2,
2188 EVEX_W_0F3838_P_1,
2189 EVEX_W_0F3839_P_1,
2190 EVEX_W_0F383A_P_1,
2191 EVEX_W_0F3840_P_2,
2192 EVEX_W_0F3854_P_2,
2193 EVEX_W_0F3855_P_2,
2194 EVEX_W_0F3858_P_2,
2195 EVEX_W_0F3859_P_2,
2196 EVEX_W_0F385A_P_2,
2197 EVEX_W_0F385B_P_2,
2198 EVEX_W_0F3862_P_2,
2199 EVEX_W_0F3863_P_2,
2200 EVEX_W_0F3866_P_2,
2201 EVEX_W_0F3870_P_2,
2202 EVEX_W_0F3871_P_2,
2203 EVEX_W_0F3872_P_2,
2204 EVEX_W_0F3873_P_2,
2205 EVEX_W_0F3875_P_2,
2206 EVEX_W_0F3878_P_2,
2207 EVEX_W_0F3879_P_2,
2208 EVEX_W_0F387A_P_2,
2209 EVEX_W_0F387B_P_2,
2210 EVEX_W_0F387D_P_2,
2211 EVEX_W_0F3883_P_2,
2212 EVEX_W_0F388D_P_2,
2213 EVEX_W_0F3891_P_2,
2214 EVEX_W_0F3893_P_2,
2215 EVEX_W_0F38A1_P_2,
2216 EVEX_W_0F38A3_P_2,
2217 EVEX_W_0F38C7_R_1_P_2,
2218 EVEX_W_0F38C7_R_2_P_2,
2219 EVEX_W_0F38C7_R_5_P_2,
2220 EVEX_W_0F38C7_R_6_P_2,
2221
2222 EVEX_W_0F3A00_P_2,
2223 EVEX_W_0F3A01_P_2,
2224 EVEX_W_0F3A04_P_2,
2225 EVEX_W_0F3A05_P_2,
2226 EVEX_W_0F3A08_P_2,
2227 EVEX_W_0F3A09_P_2,
2228 EVEX_W_0F3A0A_P_2,
2229 EVEX_W_0F3A0B_P_2,
2230 EVEX_W_0F3A18_P_2,
2231 EVEX_W_0F3A19_P_2,
2232 EVEX_W_0F3A1A_P_2,
2233 EVEX_W_0F3A1B_P_2,
2234 EVEX_W_0F3A1D_P_2,
2235 EVEX_W_0F3A21_P_2,
2236 EVEX_W_0F3A23_P_2,
2237 EVEX_W_0F3A38_P_2,
2238 EVEX_W_0F3A39_P_2,
2239 EVEX_W_0F3A3A_P_2,
2240 EVEX_W_0F3A3B_P_2,
2241 EVEX_W_0F3A3E_P_2,
2242 EVEX_W_0F3A3F_P_2,
2243 EVEX_W_0F3A42_P_2,
2244 EVEX_W_0F3A43_P_2,
2245 EVEX_W_0F3A50_P_2,
2246 EVEX_W_0F3A51_P_2,
2247 EVEX_W_0F3A56_P_2,
2248 EVEX_W_0F3A57_P_2,
2249 EVEX_W_0F3A66_P_2,
2250 EVEX_W_0F3A67_P_2,
2251 EVEX_W_0F3A70_P_2,
2252 EVEX_W_0F3A71_P_2,
2253 EVEX_W_0F3A72_P_2,
2254 EVEX_W_0F3A73_P_2,
2255 EVEX_W_0F3ACE_P_2,
2256 EVEX_W_0F3ACF_P_2
2257 };
2258
2259 typedef void (*op_rtn) (int bytemode, int sizeflag);
2260
2261 struct dis386 {
2262 const char *name;
2263 struct
2264 {
2265 op_rtn rtn;
2266 int bytemode;
2267 } op[MAX_OPERANDS];
2268 unsigned int prefix_requirement;
2269 };
2270
2271 /* Upper case letters in the instruction names here are macros.
2272 'A' => print 'b' if no register operands or suffix_always is true
2273 'B' => print 'b' if suffix_always is true
2274 'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
2275 size prefix
2276 'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
2277 suffix_always is true
2278 'E' => print 'e' if 32-bit form of jcxz
2279 'F' => print 'w' or 'l' depending on address size prefix (loop insns)
2280 'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
2281 'H' => print ",pt" or ",pn" branch hint
2282 'I' => honor following macro letter even in Intel mode (implemented only
2283 for some of the macro letters)
2284 'J' => print 'l'
2285 'K' => print 'd' or 'q' if rex prefix is present.
2286 'L' => print 'l' if suffix_always is true
2287 'M' => print 'r' if intel_mnemonic is false.
2288 'N' => print 'n' if instruction has no wait "prefix"
2289 'O' => print 'd' or 'o' (or 'q' in Intel mode)
2290 'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix,
2291 or suffix_always is true. print 'q' if rex prefix is present.
2292 'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
2293 is true
2294 'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
2295 'S' => print 'w', 'l' or 'q' if suffix_always is true
2296 'T' => print 'q' in 64bit mode if instruction has no operand size
2297 prefix and behave as 'P' otherwise
2298 'U' => print 'q' in 64bit mode if instruction has no operand size
2299 prefix and behave as 'Q' otherwise
2300 'V' => print 'q' in 64bit mode if instruction has no operand size
2301 prefix and behave as 'S' otherwise
2302 'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
2303 'X' => print 's', 'd' depending on data16 prefix (for XMM)
2304 'Y' unused.
2305 'Z' => print 'q' in 64bit mode and behave as 'L' otherwise
2306 '!' => change condition from true to false or from false to true.
2307 '%' => add 1 upper case letter to the macro.
2308 '^' => print 'w' or 'l' depending on operand size prefix or
2309 suffix_always is true (lcall/ljmp).
2310 '@' => print 'q' for Intel64 ISA, 'w' or 'q' for AMD64 ISA depending
2311 on operand size prefix.
2312 '&' => print 'q' in 64bit mode for Intel64 ISA or if instruction
2313 has no operand size prefix for AMD64 ISA, behave as 'P'
2314 otherwise
2315
2316 2 upper case letter macros:
2317 "XY" => print 'x' or 'y' if suffix_always is true or no register
2318 operands and no broadcast.
2319 "XZ" => print 'x', 'y', or 'z' if suffix_always is true or no
2320 register operands and no broadcast.
2321 "XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
2322 "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand
2323 or suffix_always is true
2324 "LB" => print "abs" in 64bit mode and behave as 'B' otherwise
2325 "LS" => print "abs" in 64bit mode and behave as 'S' otherwise
2326 "LV" => print "abs" for 64bit operand and behave as 'S' otherwise
2327 "LW" => print 'd', 'q' depending on the VEX.W bit
2328 "LP" => print 'w' or 'l' ('d' in Intel mode) if instruction has
2329 an operand size prefix, or suffix_always is true. print
2330 'q' if rex prefix is present.
2331
2332 Many of the above letters print nothing in Intel mode. See "putop"
2333 for the details.
2334
2335 Braces '{' and '}', and vertical bars '|', indicate alternative
2336 mnemonic strings for AT&T and Intel. */
2337
2338 static const struct dis386 dis386[] = {
2339 /* 00 */
2340 { "addB", { Ebh1, Gb }, 0 },
2341 { "addS", { Evh1, Gv }, 0 },
2342 { "addB", { Gb, EbS }, 0 },
2343 { "addS", { Gv, EvS }, 0 },
2344 { "addB", { AL, Ib }, 0 },
2345 { "addS", { eAX, Iv }, 0 },
2346 { X86_64_TABLE (X86_64_06) },
2347 { X86_64_TABLE (X86_64_07) },
2348 /* 08 */
2349 { "orB", { Ebh1, Gb }, 0 },
2350 { "orS", { Evh1, Gv }, 0 },
2351 { "orB", { Gb, EbS }, 0 },
2352 { "orS", { Gv, EvS }, 0 },
2353 { "orB", { AL, Ib }, 0 },
2354 { "orS", { eAX, Iv }, 0 },
2355 { X86_64_TABLE (X86_64_0D) },
2356 { Bad_Opcode }, /* 0x0f extended opcode escape */
2357 /* 10 */
2358 { "adcB", { Ebh1, Gb }, 0 },
2359 { "adcS", { Evh1, Gv }, 0 },
2360 { "adcB", { Gb, EbS }, 0 },
2361 { "adcS", { Gv, EvS }, 0 },
2362 { "adcB", { AL, Ib }, 0 },
2363 { "adcS", { eAX, Iv }, 0 },
2364 { X86_64_TABLE (X86_64_16) },
2365 { X86_64_TABLE (X86_64_17) },
2366 /* 18 */
2367 { "sbbB", { Ebh1, Gb }, 0 },
2368 { "sbbS", { Evh1, Gv }, 0 },
2369 { "sbbB", { Gb, EbS }, 0 },
2370 { "sbbS", { Gv, EvS }, 0 },
2371 { "sbbB", { AL, Ib }, 0 },
2372 { "sbbS", { eAX, Iv }, 0 },
2373 { X86_64_TABLE (X86_64_1E) },
2374 { X86_64_TABLE (X86_64_1F) },
2375 /* 20 */
2376 { "andB", { Ebh1, Gb }, 0 },
2377 { "andS", { Evh1, Gv }, 0 },
2378 { "andB", { Gb, EbS }, 0 },
2379 { "andS", { Gv, EvS }, 0 },
2380 { "andB", { AL, Ib }, 0 },
2381 { "andS", { eAX, Iv }, 0 },
2382 { Bad_Opcode }, /* SEG ES prefix */
2383 { X86_64_TABLE (X86_64_27) },
2384 /* 28 */
2385 { "subB", { Ebh1, Gb }, 0 },
2386 { "subS", { Evh1, Gv }, 0 },
2387 { "subB", { Gb, EbS }, 0 },
2388 { "subS", { Gv, EvS }, 0 },
2389 { "subB", { AL, Ib }, 0 },
2390 { "subS", { eAX, Iv }, 0 },
2391 { Bad_Opcode }, /* SEG CS prefix */
2392 { X86_64_TABLE (X86_64_2F) },
2393 /* 30 */
2394 { "xorB", { Ebh1, Gb }, 0 },
2395 { "xorS", { Evh1, Gv }, 0 },
2396 { "xorB", { Gb, EbS }, 0 },
2397 { "xorS", { Gv, EvS }, 0 },
2398 { "xorB", { AL, Ib }, 0 },
2399 { "xorS", { eAX, Iv }, 0 },
2400 { Bad_Opcode }, /* SEG SS prefix */
2401 { X86_64_TABLE (X86_64_37) },
2402 /* 38 */
2403 { "cmpB", { Eb, Gb }, 0 },
2404 { "cmpS", { Ev, Gv }, 0 },
2405 { "cmpB", { Gb, EbS }, 0 },
2406 { "cmpS", { Gv, EvS }, 0 },
2407 { "cmpB", { AL, Ib }, 0 },
2408 { "cmpS", { eAX, Iv }, 0 },
2409 { Bad_Opcode }, /* SEG DS prefix */
2410 { X86_64_TABLE (X86_64_3F) },
2411 /* 40 */
2412 { "inc{S|}", { RMeAX }, 0 },
2413 { "inc{S|}", { RMeCX }, 0 },
2414 { "inc{S|}", { RMeDX }, 0 },
2415 { "inc{S|}", { RMeBX }, 0 },
2416 { "inc{S|}", { RMeSP }, 0 },
2417 { "inc{S|}", { RMeBP }, 0 },
2418 { "inc{S|}", { RMeSI }, 0 },
2419 { "inc{S|}", { RMeDI }, 0 },
2420 /* 48 */
2421 { "dec{S|}", { RMeAX }, 0 },
2422 { "dec{S|}", { RMeCX }, 0 },
2423 { "dec{S|}", { RMeDX }, 0 },
2424 { "dec{S|}", { RMeBX }, 0 },
2425 { "dec{S|}", { RMeSP }, 0 },
2426 { "dec{S|}", { RMeBP }, 0 },
2427 { "dec{S|}", { RMeSI }, 0 },
2428 { "dec{S|}", { RMeDI }, 0 },
2429 /* 50 */
2430 { "pushV", { RMrAX }, 0 },
2431 { "pushV", { RMrCX }, 0 },
2432 { "pushV", { RMrDX }, 0 },
2433 { "pushV", { RMrBX }, 0 },
2434 { "pushV", { RMrSP }, 0 },
2435 { "pushV", { RMrBP }, 0 },
2436 { "pushV", { RMrSI }, 0 },
2437 { "pushV", { RMrDI }, 0 },
2438 /* 58 */
2439 { "popV", { RMrAX }, 0 },
2440 { "popV", { RMrCX }, 0 },
2441 { "popV", { RMrDX }, 0 },
2442 { "popV", { RMrBX }, 0 },
2443 { "popV", { RMrSP }, 0 },
2444 { "popV", { RMrBP }, 0 },
2445 { "popV", { RMrSI }, 0 },
2446 { "popV", { RMrDI }, 0 },
2447 /* 60 */
2448 { X86_64_TABLE (X86_64_60) },
2449 { X86_64_TABLE (X86_64_61) },
2450 { X86_64_TABLE (X86_64_62) },
2451 { X86_64_TABLE (X86_64_63) },
2452 { Bad_Opcode }, /* seg fs */
2453 { Bad_Opcode }, /* seg gs */
2454 { Bad_Opcode }, /* op size prefix */
2455 { Bad_Opcode }, /* adr size prefix */
2456 /* 68 */
2457 { "pushT", { sIv }, 0 },
2458 { "imulS", { Gv, Ev, Iv }, 0 },
2459 { "pushT", { sIbT }, 0 },
2460 { "imulS", { Gv, Ev, sIb }, 0 },
2461 { "ins{b|}", { Ybr, indirDX }, 0 },
2462 { X86_64_TABLE (X86_64_6D) },
2463 { "outs{b|}", { indirDXr, Xb }, 0 },
2464 { X86_64_TABLE (X86_64_6F) },
2465 /* 70 */
2466 { "joH", { Jb, BND, cond_jump_flag }, 0 },
2467 { "jnoH", { Jb, BND, cond_jump_flag }, 0 },
2468 { "jbH", { Jb, BND, cond_jump_flag }, 0 },
2469 { "jaeH", { Jb, BND, cond_jump_flag }, 0 },
2470 { "jeH", { Jb, BND, cond_jump_flag }, 0 },
2471 { "jneH", { Jb, BND, cond_jump_flag }, 0 },
2472 { "jbeH", { Jb, BND, cond_jump_flag }, 0 },
2473 { "jaH", { Jb, BND, cond_jump_flag }, 0 },
2474 /* 78 */
2475 { "jsH", { Jb, BND, cond_jump_flag }, 0 },
2476 { "jnsH", { Jb, BND, cond_jump_flag }, 0 },
2477 { "jpH", { Jb, BND, cond_jump_flag }, 0 },
2478 { "jnpH", { Jb, BND, cond_jump_flag }, 0 },
2479 { "jlH", { Jb, BND, cond_jump_flag }, 0 },
2480 { "jgeH", { Jb, BND, cond_jump_flag }, 0 },
2481 { "jleH", { Jb, BND, cond_jump_flag }, 0 },
2482 { "jgH", { Jb, BND, cond_jump_flag }, 0 },
2483 /* 80 */
2484 { REG_TABLE (REG_80) },
2485 { REG_TABLE (REG_81) },
2486 { X86_64_TABLE (X86_64_82) },
2487 { REG_TABLE (REG_83) },
2488 { "testB", { Eb, Gb }, 0 },
2489 { "testS", { Ev, Gv }, 0 },
2490 { "xchgB", { Ebh2, Gb }, 0 },
2491 { "xchgS", { Evh2, Gv }, 0 },
2492 /* 88 */
2493 { "movB", { Ebh3, Gb }, 0 },
2494 { "movS", { Evh3, Gv }, 0 },
2495 { "movB", { Gb, EbS }, 0 },
2496 { "movS", { Gv, EvS }, 0 },
2497 { "movD", { Sv, Sw }, 0 },
2498 { MOD_TABLE (MOD_8D) },
2499 { "movD", { Sw, Sv }, 0 },
2500 { REG_TABLE (REG_8F) },
2501 /* 90 */
2502 { PREFIX_TABLE (PREFIX_90) },
2503 { "xchgS", { RMeCX, eAX }, 0 },
2504 { "xchgS", { RMeDX, eAX }, 0 },
2505 { "xchgS", { RMeBX, eAX }, 0 },
2506 { "xchgS", { RMeSP, eAX }, 0 },
2507 { "xchgS", { RMeBP, eAX }, 0 },
2508 { "xchgS", { RMeSI, eAX }, 0 },
2509 { "xchgS", { RMeDI, eAX }, 0 },
2510 /* 98 */
2511 { "cW{t|}R", { XX }, 0 },
2512 { "cR{t|}O", { XX }, 0 },
2513 { X86_64_TABLE (X86_64_9A) },
2514 { Bad_Opcode }, /* fwait */
2515 { "pushfT", { XX }, 0 },
2516 { "popfT", { XX }, 0 },
2517 { "sahf", { XX }, 0 },
2518 { "lahf", { XX }, 0 },
2519 /* a0 */
2520 { "mov%LB", { AL, Ob }, 0 },
2521 { "mov%LS", { eAX, Ov }, 0 },
2522 { "mov%LB", { Ob, AL }, 0 },
2523 { "mov%LS", { Ov, eAX }, 0 },
2524 { "movs{b|}", { Ybr, Xb }, 0 },
2525 { "movs{R|}", { Yvr, Xv }, 0 },
2526 { "cmps{b|}", { Xb, Yb }, 0 },
2527 { "cmps{R|}", { Xv, Yv }, 0 },
2528 /* a8 */
2529 { "testB", { AL, Ib }, 0 },
2530 { "testS", { eAX, Iv }, 0 },
2531 { "stosB", { Ybr, AL }, 0 },
2532 { "stosS", { Yvr, eAX }, 0 },
2533 { "lodsB", { ALr, Xb }, 0 },
2534 { "lodsS", { eAXr, Xv }, 0 },
2535 { "scasB", { AL, Yb }, 0 },
2536 { "scasS", { eAX, Yv }, 0 },
2537 /* b0 */
2538 { "movB", { RMAL, Ib }, 0 },
2539 { "movB", { RMCL, Ib }, 0 },
2540 { "movB", { RMDL, Ib }, 0 },
2541 { "movB", { RMBL, Ib }, 0 },
2542 { "movB", { RMAH, Ib }, 0 },
2543 { "movB", { RMCH, Ib }, 0 },
2544 { "movB", { RMDH, Ib }, 0 },
2545 { "movB", { RMBH, Ib }, 0 },
2546 /* b8 */
2547 { "mov%LV", { RMeAX, Iv64 }, 0 },
2548 { "mov%LV", { RMeCX, Iv64 }, 0 },
2549 { "mov%LV", { RMeDX, Iv64 }, 0 },
2550 { "mov%LV", { RMeBX, Iv64 }, 0 },
2551 { "mov%LV", { RMeSP, Iv64 }, 0 },
2552 { "mov%LV", { RMeBP, Iv64 }, 0 },
2553 { "mov%LV", { RMeSI, Iv64 }, 0 },
2554 { "mov%LV", { RMeDI, Iv64 }, 0 },
2555 /* c0 */
2556 { REG_TABLE (REG_C0) },
2557 { REG_TABLE (REG_C1) },
2558 { "retT", { Iw, BND }, 0 },
2559 { "retT", { BND }, 0 },
2560 { X86_64_TABLE (X86_64_C4) },
2561 { X86_64_TABLE (X86_64_C5) },
2562 { REG_TABLE (REG_C6) },
2563 { REG_TABLE (REG_C7) },
2564 /* c8 */
2565 { "enterT", { Iw, Ib }, 0 },
2566 { "leaveT", { XX }, 0 },
2567 { "Jret{|f}P", { Iw }, 0 },
2568 { "Jret{|f}P", { XX }, 0 },
2569 { "int3", { XX }, 0 },
2570 { "int", { Ib }, 0 },
2571 { X86_64_TABLE (X86_64_CE) },
2572 { "iret%LP", { XX }, 0 },
2573 /* d0 */
2574 { REG_TABLE (REG_D0) },
2575 { REG_TABLE (REG_D1) },
2576 { REG_TABLE (REG_D2) },
2577 { REG_TABLE (REG_D3) },
2578 { X86_64_TABLE (X86_64_D4) },
2579 { X86_64_TABLE (X86_64_D5) },
2580 { Bad_Opcode },
2581 { "xlat", { DSBX }, 0 },
2582 /* d8 */
2583 { FLOAT },
2584 { FLOAT },
2585 { FLOAT },
2586 { FLOAT },
2587 { FLOAT },
2588 { FLOAT },
2589 { FLOAT },
2590 { FLOAT },
2591 /* e0 */
2592 { "loopneFH", { Jb, XX, loop_jcxz_flag }, 0 },
2593 { "loopeFH", { Jb, XX, loop_jcxz_flag }, 0 },
2594 { "loopFH", { Jb, XX, loop_jcxz_flag }, 0 },
2595 { "jEcxzH", { Jb, XX, loop_jcxz_flag }, 0 },
2596 { "inB", { AL, Ib }, 0 },
2597 { "inG", { zAX, Ib }, 0 },
2598 { "outB", { Ib, AL }, 0 },
2599 { "outG", { Ib, zAX }, 0 },
2600 /* e8 */
2601 { X86_64_TABLE (X86_64_E8) },
2602 { X86_64_TABLE (X86_64_E9) },
2603 { X86_64_TABLE (X86_64_EA) },
2604 { "jmp", { Jb, BND }, 0 },
2605 { "inB", { AL, indirDX }, 0 },
2606 { "inG", { zAX, indirDX }, 0 },
2607 { "outB", { indirDX, AL }, 0 },
2608 { "outG", { indirDX, zAX }, 0 },
2609 /* f0 */
2610 { Bad_Opcode }, /* lock prefix */
2611 { "icebp", { XX }, 0 },
2612 { Bad_Opcode }, /* repne */
2613 { Bad_Opcode }, /* repz */
2614 { "hlt", { XX }, 0 },
2615 { "cmc", { XX }, 0 },
2616 { REG_TABLE (REG_F6) },
2617 { REG_TABLE (REG_F7) },
2618 /* f8 */
2619 { "clc", { XX }, 0 },
2620 { "stc", { XX }, 0 },
2621 { "cli", { XX }, 0 },
2622 { "sti", { XX }, 0 },
2623 { "cld", { XX }, 0 },
2624 { "std", { XX }, 0 },
2625 { REG_TABLE (REG_FE) },
2626 { REG_TABLE (REG_FF) },
2627 };
2628
2629 static const struct dis386 dis386_twobyte[] = {
2630 /* 00 */
2631 { REG_TABLE (REG_0F00 ) },
2632 { REG_TABLE (REG_0F01 ) },
2633 { "larS", { Gv, Ew }, 0 },
2634 { "lslS", { Gv, Ew }, 0 },
2635 { Bad_Opcode },
2636 { "syscall", { XX }, 0 },
2637 { "clts", { XX }, 0 },
2638 { "sysret%LP", { XX }, 0 },
2639 /* 08 */
2640 { "invd", { XX }, 0 },
2641 { PREFIX_TABLE (PREFIX_0F09) },
2642 { Bad_Opcode },
2643 { "ud2", { XX }, 0 },
2644 { Bad_Opcode },
2645 { REG_TABLE (REG_0F0D) },
2646 { "femms", { XX }, 0 },
2647 { "", { MX, EM, OPSUF }, 0 }, /* See OP_3DNowSuffix. */
2648 /* 10 */
2649 { PREFIX_TABLE (PREFIX_0F10) },
2650 { PREFIX_TABLE (PREFIX_0F11) },
2651 { PREFIX_TABLE (PREFIX_0F12) },
2652 { MOD_TABLE (MOD_0F13) },
2653 { "unpcklpX", { XM, EXx }, PREFIX_OPCODE },
2654 { "unpckhpX", { XM, EXx }, PREFIX_OPCODE },
2655 { PREFIX_TABLE (PREFIX_0F16) },
2656 { MOD_TABLE (MOD_0F17) },
2657 /* 18 */
2658 { REG_TABLE (REG_0F18) },
2659 { "nopQ", { Ev }, 0 },
2660 { PREFIX_TABLE (PREFIX_0F1A) },
2661 { PREFIX_TABLE (PREFIX_0F1B) },
2662 { PREFIX_TABLE (PREFIX_0F1C) },
2663 { "nopQ", { Ev }, 0 },
2664 { PREFIX_TABLE (PREFIX_0F1E) },
2665 { "nopQ", { Ev }, 0 },
2666 /* 20 */
2667 { "movZ", { Rm, Cm }, 0 },
2668 { "movZ", { Rm, Dm }, 0 },
2669 { "movZ", { Cm, Rm }, 0 },
2670 { "movZ", { Dm, Rm }, 0 },
2671 { MOD_TABLE (MOD_0F24) },
2672 { Bad_Opcode },
2673 { MOD_TABLE (MOD_0F26) },
2674 { Bad_Opcode },
2675 /* 28 */
2676 { "movapX", { XM, EXx }, PREFIX_OPCODE },
2677 { "movapX", { EXxS, XM }, PREFIX_OPCODE },
2678 { PREFIX_TABLE (PREFIX_0F2A) },
2679 { PREFIX_TABLE (PREFIX_0F2B) },
2680 { PREFIX_TABLE (PREFIX_0F2C) },
2681 { PREFIX_TABLE (PREFIX_0F2D) },
2682 { PREFIX_TABLE (PREFIX_0F2E) },
2683 { PREFIX_TABLE (PREFIX_0F2F) },
2684 /* 30 */
2685 { "wrmsr", { XX }, 0 },
2686 { "rdtsc", { XX }, 0 },
2687 { "rdmsr", { XX }, 0 },
2688 { "rdpmc", { XX }, 0 },
2689 { "sysenter", { XX }, 0 },
2690 { "sysexit", { XX }, 0 },
2691 { Bad_Opcode },
2692 { "getsec", { XX }, 0 },
2693 /* 38 */
2694 { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F38, PREFIX_OPCODE) },
2695 { Bad_Opcode },
2696 { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F3A, PREFIX_OPCODE) },
2697 { Bad_Opcode },
2698 { Bad_Opcode },
2699 { Bad_Opcode },
2700 { Bad_Opcode },
2701 { Bad_Opcode },
2702 /* 40 */
2703 { "cmovoS", { Gv, Ev }, 0 },
2704 { "cmovnoS", { Gv, Ev }, 0 },
2705 { "cmovbS", { Gv, Ev }, 0 },
2706 { "cmovaeS", { Gv, Ev }, 0 },
2707 { "cmoveS", { Gv, Ev }, 0 },
2708 { "cmovneS", { Gv, Ev }, 0 },
2709 { "cmovbeS", { Gv, Ev }, 0 },
2710 { "cmovaS", { Gv, Ev }, 0 },
2711 /* 48 */
2712 { "cmovsS", { Gv, Ev }, 0 },
2713 { "cmovnsS", { Gv, Ev }, 0 },
2714 { "cmovpS", { Gv, Ev }, 0 },
2715 { "cmovnpS", { Gv, Ev }, 0 },
2716 { "cmovlS", { Gv, Ev }, 0 },
2717 { "cmovgeS", { Gv, Ev }, 0 },
2718 { "cmovleS", { Gv, Ev }, 0 },
2719 { "cmovgS", { Gv, Ev }, 0 },
2720 /* 50 */
2721 { MOD_TABLE (MOD_0F51) },
2722 { PREFIX_TABLE (PREFIX_0F51) },
2723 { PREFIX_TABLE (PREFIX_0F52) },
2724 { PREFIX_TABLE (PREFIX_0F53) },
2725 { "andpX", { XM, EXx }, PREFIX_OPCODE },
2726 { "andnpX", { XM, EXx }, PREFIX_OPCODE },
2727 { "orpX", { XM, EXx }, PREFIX_OPCODE },
2728 { "xorpX", { XM, EXx }, PREFIX_OPCODE },
2729 /* 58 */
2730 { PREFIX_TABLE (PREFIX_0F58) },
2731 { PREFIX_TABLE (PREFIX_0F59) },
2732 { PREFIX_TABLE (PREFIX_0F5A) },
2733 { PREFIX_TABLE (PREFIX_0F5B) },
2734 { PREFIX_TABLE (PREFIX_0F5C) },
2735 { PREFIX_TABLE (PREFIX_0F5D) },
2736 { PREFIX_TABLE (PREFIX_0F5E) },
2737 { PREFIX_TABLE (PREFIX_0F5F) },
2738 /* 60 */
2739 { PREFIX_TABLE (PREFIX_0F60) },
2740 { PREFIX_TABLE (PREFIX_0F61) },
2741 { PREFIX_TABLE (PREFIX_0F62) },
2742 { "packsswb", { MX, EM }, PREFIX_OPCODE },
2743 { "pcmpgtb", { MX, EM }, PREFIX_OPCODE },
2744 { "pcmpgtw", { MX, EM }, PREFIX_OPCODE },
2745 { "pcmpgtd", { MX, EM }, PREFIX_OPCODE },
2746 { "packuswb", { MX, EM }, PREFIX_OPCODE },
2747 /* 68 */
2748 { "punpckhbw", { MX, EM }, PREFIX_OPCODE },
2749 { "punpckhwd", { MX, EM }, PREFIX_OPCODE },
2750 { "punpckhdq", { MX, EM }, PREFIX_OPCODE },
2751 { "packssdw", { MX, EM }, PREFIX_OPCODE },
2752 { PREFIX_TABLE (PREFIX_0F6C) },
2753 { PREFIX_TABLE (PREFIX_0F6D) },
2754 { "movK", { MX, Edq }, PREFIX_OPCODE },
2755 { PREFIX_TABLE (PREFIX_0F6F) },
2756 /* 70 */
2757 { PREFIX_TABLE (PREFIX_0F70) },
2758 { REG_TABLE (REG_0F71) },
2759 { REG_TABLE (REG_0F72) },
2760 { REG_TABLE (REG_0F73) },
2761 { "pcmpeqb", { MX, EM }, PREFIX_OPCODE },
2762 { "pcmpeqw", { MX, EM }, PREFIX_OPCODE },
2763 { "pcmpeqd", { MX, EM }, PREFIX_OPCODE },
2764 { "emms", { XX }, PREFIX_OPCODE },
2765 /* 78 */
2766 { PREFIX_TABLE (PREFIX_0F78) },
2767 { PREFIX_TABLE (PREFIX_0F79) },
2768 { Bad_Opcode },
2769 { Bad_Opcode },
2770 { PREFIX_TABLE (PREFIX_0F7C) },
2771 { PREFIX_TABLE (PREFIX_0F7D) },
2772 { PREFIX_TABLE (PREFIX_0F7E) },
2773 { PREFIX_TABLE (PREFIX_0F7F) },
2774 /* 80 */
2775 { "joH", { Jv, BND, cond_jump_flag }, 0 },
2776 { "jnoH", { Jv, BND, cond_jump_flag }, 0 },
2777 { "jbH", { Jv, BND, cond_jump_flag }, 0 },
2778 { "jaeH", { Jv, BND, cond_jump_flag }, 0 },
2779 { "jeH", { Jv, BND, cond_jump_flag }, 0 },
2780 { "jneH", { Jv, BND, cond_jump_flag }, 0 },
2781 { "jbeH", { Jv, BND, cond_jump_flag }, 0 },
2782 { "jaH", { Jv, BND, cond_jump_flag }, 0 },
2783 /* 88 */
2784 { "jsH", { Jv, BND, cond_jump_flag }, 0 },
2785 { "jnsH", { Jv, BND, cond_jump_flag }, 0 },
2786 { "jpH", { Jv, BND, cond_jump_flag }, 0 },
2787 { "jnpH", { Jv, BND, cond_jump_flag }, 0 },
2788 { "jlH", { Jv, BND, cond_jump_flag }, 0 },
2789 { "jgeH", { Jv, BND, cond_jump_flag }, 0 },
2790 { "jleH", { Jv, BND, cond_jump_flag }, 0 },
2791 { "jgH", { Jv, BND, cond_jump_flag }, 0 },
2792 /* 90 */
2793 { "seto", { Eb }, 0 },
2794 { "setno", { Eb }, 0 },
2795 { "setb", { Eb }, 0 },
2796 { "setae", { Eb }, 0 },
2797 { "sete", { Eb }, 0 },
2798 { "setne", { Eb }, 0 },
2799 { "setbe", { Eb }, 0 },
2800 { "seta", { Eb }, 0 },
2801 /* 98 */
2802 { "sets", { Eb }, 0 },
2803 { "setns", { Eb }, 0 },
2804 { "setp", { Eb }, 0 },
2805 { "setnp", { Eb }, 0 },
2806 { "setl", { Eb }, 0 },
2807 { "setge", { Eb }, 0 },
2808 { "setle", { Eb }, 0 },
2809 { "setg", { Eb }, 0 },
2810 /* a0 */
2811 { "pushT", { fs }, 0 },
2812 { "popT", { fs }, 0 },
2813 { "cpuid", { XX }, 0 },
2814 { "btS", { Ev, Gv }, 0 },
2815 { "shldS", { Ev, Gv, Ib }, 0 },
2816 { "shldS", { Ev, Gv, CL }, 0 },
2817 { REG_TABLE (REG_0FA6) },
2818 { REG_TABLE (REG_0FA7) },
2819 /* a8 */
2820 { "pushT", { gs }, 0 },
2821 { "popT", { gs }, 0 },
2822 { "rsm", { XX }, 0 },
2823 { "btsS", { Evh1, Gv }, 0 },
2824 { "shrdS", { Ev, Gv, Ib }, 0 },
2825 { "shrdS", { Ev, Gv, CL }, 0 },
2826 { REG_TABLE (REG_0FAE) },
2827 { "imulS", { Gv, Ev }, 0 },
2828 /* b0 */
2829 { "cmpxchgB", { Ebh1, Gb }, 0 },
2830 { "cmpxchgS", { Evh1, Gv }, 0 },
2831 { MOD_TABLE (MOD_0FB2) },
2832 { "btrS", { Evh1, Gv }, 0 },
2833 { MOD_TABLE (MOD_0FB4) },
2834 { MOD_TABLE (MOD_0FB5) },
2835 { "movz{bR|x}", { Gv, Eb }, 0 },
2836 { "movz{wR|x}", { Gv, Ew }, 0 }, /* yes, there really is movzww ! */
2837 /* b8 */
2838 { PREFIX_TABLE (PREFIX_0FB8) },
2839 { "ud1S", { Gv, Ev }, 0 },
2840 { REG_TABLE (REG_0FBA) },
2841 { "btcS", { Evh1, Gv }, 0 },
2842 { PREFIX_TABLE (PREFIX_0FBC) },
2843 { PREFIX_TABLE (PREFIX_0FBD) },
2844 { "movs{bR|x}", { Gv, Eb }, 0 },
2845 { "movs{wR|x}", { Gv, Ew }, 0 }, /* yes, there really is movsww ! */
2846 /* c0 */
2847 { "xaddB", { Ebh1, Gb }, 0 },
2848 { "xaddS", { Evh1, Gv }, 0 },
2849 { PREFIX_TABLE (PREFIX_0FC2) },
2850 { MOD_TABLE (MOD_0FC3) },
2851 { "pinsrw", { MX, Edqw, Ib }, PREFIX_OPCODE },
2852 { "pextrw", { Gdq, MS, Ib }, PREFIX_OPCODE },
2853 { "shufpX", { XM, EXx, Ib }, PREFIX_OPCODE },
2854 { REG_TABLE (REG_0FC7) },
2855 /* c8 */
2856 { "bswap", { RMeAX }, 0 },
2857 { "bswap", { RMeCX }, 0 },
2858 { "bswap", { RMeDX }, 0 },
2859 { "bswap", { RMeBX }, 0 },
2860 { "bswap", { RMeSP }, 0 },
2861 { "bswap", { RMeBP }, 0 },
2862 { "bswap", { RMeSI }, 0 },
2863 { "bswap", { RMeDI }, 0 },
2864 /* d0 */
2865 { PREFIX_TABLE (PREFIX_0FD0) },
2866 { "psrlw", { MX, EM }, PREFIX_OPCODE },
2867 { "psrld", { MX, EM }, PREFIX_OPCODE },
2868 { "psrlq", { MX, EM }, PREFIX_OPCODE },
2869 { "paddq", { MX, EM }, PREFIX_OPCODE },
2870 { "pmullw", { MX, EM }, PREFIX_OPCODE },
2871 { PREFIX_TABLE (PREFIX_0FD6) },
2872 { MOD_TABLE (MOD_0FD7) },
2873 /* d8 */
2874 { "psubusb", { MX, EM }, PREFIX_OPCODE },
2875 { "psubusw", { MX, EM }, PREFIX_OPCODE },
2876 { "pminub", { MX, EM }, PREFIX_OPCODE },
2877 { "pand", { MX, EM }, PREFIX_OPCODE },
2878 { "paddusb", { MX, EM }, PREFIX_OPCODE },
2879 { "paddusw", { MX, EM }, PREFIX_OPCODE },
2880 { "pmaxub", { MX, EM }, PREFIX_OPCODE },
2881 { "pandn", { MX, EM }, PREFIX_OPCODE },
2882 /* e0 */
2883 { "pavgb", { MX, EM }, PREFIX_OPCODE },
2884 { "psraw", { MX, EM }, PREFIX_OPCODE },
2885 { "psrad", { MX, EM }, PREFIX_OPCODE },
2886 { "pavgw", { MX, EM }, PREFIX_OPCODE },
2887 { "pmulhuw", { MX, EM }, PREFIX_OPCODE },
2888 { "pmulhw", { MX, EM }, PREFIX_OPCODE },
2889 { PREFIX_TABLE (PREFIX_0FE6) },
2890 { PREFIX_TABLE (PREFIX_0FE7) },
2891 /* e8 */
2892 { "psubsb", { MX, EM }, PREFIX_OPCODE },
2893 { "psubsw", { MX, EM }, PREFIX_OPCODE },
2894 { "pminsw", { MX, EM }, PREFIX_OPCODE },
2895 { "por", { MX, EM }, PREFIX_OPCODE },
2896 { "paddsb", { MX, EM }, PREFIX_OPCODE },
2897 { "paddsw", { MX, EM }, PREFIX_OPCODE },
2898 { "pmaxsw", { MX, EM }, PREFIX_OPCODE },
2899 { "pxor", { MX, EM }, PREFIX_OPCODE },
2900 /* f0 */
2901 { PREFIX_TABLE (PREFIX_0FF0) },
2902 { "psllw", { MX, EM }, PREFIX_OPCODE },
2903 { "pslld", { MX, EM }, PREFIX_OPCODE },
2904 { "psllq", { MX, EM }, PREFIX_OPCODE },
2905 { "pmuludq", { MX, EM }, PREFIX_OPCODE },
2906 { "pmaddwd", { MX, EM }, PREFIX_OPCODE },
2907 { "psadbw", { MX, EM }, PREFIX_OPCODE },
2908 { PREFIX_TABLE (PREFIX_0FF7) },
2909 /* f8 */
2910 { "psubb", { MX, EM }, PREFIX_OPCODE },
2911 { "psubw", { MX, EM }, PREFIX_OPCODE },
2912 { "psubd", { MX, EM }, PREFIX_OPCODE },
2913 { "psubq", { MX, EM }, PREFIX_OPCODE },
2914 { "paddb", { MX, EM }, PREFIX_OPCODE },
2915 { "paddw", { MX, EM }, PREFIX_OPCODE },
2916 { "paddd", { MX, EM }, PREFIX_OPCODE },
2917 { "ud0S", { Gv, Ev }, 0 },
2918 };
2919
2920 static const unsigned char onebyte_has_modrm[256] = {
2921 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2922 /* ------------------------------- */
2923 /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
2924 /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
2925 /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
2926 /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
2927 /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
2928 /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
2929 /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
2930 /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
2931 /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
2932 /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
2933 /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
2934 /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
2935 /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
2936 /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
2937 /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
2938 /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1 /* f0 */
2939 /* ------------------------------- */
2940 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2941 };
2942
2943 static const unsigned char twobyte_has_modrm[256] = {
2944 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2945 /* ------------------------------- */
2946 /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
2947 /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
2948 /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
2949 /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
2950 /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
2951 /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
2952 /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
2953 /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
2954 /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
2955 /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
2956 /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
2957 /* b0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* bf */
2958 /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
2959 /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
2960 /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
2961 /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 /* ff */
2962 /* ------------------------------- */
2963 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2964 };
2965
2966 static char obuf[100];
2967 static char *obufp;
2968 static char *mnemonicendp;
2969 static char scratchbuf[100];
2970 static unsigned char *start_codep;
2971 static unsigned char *insn_codep;
2972 static unsigned char *codep;
2973 static unsigned char *end_codep;
2974 static int last_lock_prefix;
2975 static int last_repz_prefix;
2976 static int last_repnz_prefix;
2977 static int last_data_prefix;
2978 static int last_addr_prefix;
2979 static int last_rex_prefix;
2980 static int last_seg_prefix;
2981 static int fwait_prefix;
2982 /* The active segment register prefix. */
2983 static int active_seg_prefix;
2984 #define MAX_CODE_LENGTH 15
2985 /* We can up to 14 prefixes since the maximum instruction length is
2986 15bytes. */
2987 static int all_prefixes[MAX_CODE_LENGTH - 1];
2988 static disassemble_info *the_info;
2989 static struct
2990 {
2991 int mod;
2992 int reg;
2993 int rm;
2994 }
2995 modrm;
2996 static unsigned char need_modrm;
2997 static struct
2998 {
2999 int scale;
3000 int index;
3001 int base;
3002 }
3003 sib;
3004 static struct
3005 {
3006 int register_specifier;
3007 int length;
3008 int prefix;
3009 int w;
3010 int evex;
3011 int r;
3012 int v;
3013 int mask_register_specifier;
3014 int zeroing;
3015 int ll;
3016 int b;
3017 }
3018 vex;
3019 static unsigned char need_vex;
3020 static unsigned char need_vex_reg;
3021 static unsigned char vex_w_done;
3022
3023 struct op
3024 {
3025 const char *name;
3026 unsigned int len;
3027 };
3028
3029 /* If we are accessing mod/rm/reg without need_modrm set, then the
3030 values are stale. Hitting this abort likely indicates that you
3031 need to update onebyte_has_modrm or twobyte_has_modrm. */
3032 #define MODRM_CHECK if (!need_modrm) abort ()
3033
3034 static const char **names64;
3035 static const char **names32;
3036 static const char **names16;
3037 static const char **names8;
3038 static const char **names8rex;
3039 static const char **names_seg;
3040 static const char *index64;
3041 static const char *index32;
3042 static const char **index16;
3043 static const char **names_bnd;
3044
3045 static const char *intel_names64[] = {
3046 "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
3047 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
3048 };
3049 static const char *intel_names32[] = {
3050 "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
3051 "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
3052 };
3053 static const char *intel_names16[] = {
3054 "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
3055 "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
3056 };
3057 static const char *intel_names8[] = {
3058 "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
3059 };
3060 static const char *intel_names8rex[] = {
3061 "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
3062 "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
3063 };
3064 static const char *intel_names_seg[] = {
3065 "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
3066 };
3067 static const char *intel_index64 = "riz";
3068 static const char *intel_index32 = "eiz";
3069 static const char *intel_index16[] = {
3070 "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
3071 };
3072
3073 static const char *att_names64[] = {
3074 "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
3075 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
3076 };
3077 static const char *att_names32[] = {
3078 "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
3079 "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
3080 };
3081 static const char *att_names16[] = {
3082 "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
3083 "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
3084 };
3085 static const char *att_names8[] = {
3086 "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
3087 };
3088 static const char *att_names8rex[] = {
3089 "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
3090 "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
3091 };
3092 static const char *att_names_seg[] = {
3093 "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
3094 };
3095 static const char *att_index64 = "%riz";
3096 static const char *att_index32 = "%eiz";
3097 static const char *att_index16[] = {
3098 "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
3099 };
3100
3101 static const char **names_mm;
3102 static const char *intel_names_mm[] = {
3103 "mm0", "mm1", "mm2", "mm3",
3104 "mm4", "mm5", "mm6", "mm7"
3105 };
3106 static const char *att_names_mm[] = {
3107 "%mm0", "%mm1", "%mm2", "%mm3",
3108 "%mm4", "%mm5", "%mm6", "%mm7"
3109 };
3110
3111 static const char *intel_names_bnd[] = {
3112 "bnd0", "bnd1", "bnd2", "bnd3"
3113 };
3114
3115 static const char *att_names_bnd[] = {
3116 "%bnd0", "%bnd1", "%bnd2", "%bnd3"
3117 };
3118
3119 static const char **names_xmm;
3120 static const char *intel_names_xmm[] = {
3121 "xmm0", "xmm1", "xmm2", "xmm3",
3122 "xmm4", "xmm5", "xmm6", "xmm7",
3123 "xmm8", "xmm9", "xmm10", "xmm11",
3124 "xmm12", "xmm13", "xmm14", "xmm15",
3125 "xmm16", "xmm17", "xmm18", "xmm19",
3126 "xmm20", "xmm21", "xmm22", "xmm23",
3127 "xmm24", "xmm25", "xmm26", "xmm27",
3128 "xmm28", "xmm29", "xmm30", "xmm31"
3129 };
3130 static const char *att_names_xmm[] = {
3131 "%xmm0", "%xmm1", "%xmm2", "%xmm3",
3132 "%xmm4", "%xmm5", "%xmm6", "%xmm7",
3133 "%xmm8", "%xmm9", "%xmm10", "%xmm11",
3134 "%xmm12", "%xmm13", "%xmm14", "%xmm15",
3135 "%xmm16", "%xmm17", "%xmm18", "%xmm19",
3136 "%xmm20", "%xmm21", "%xmm22", "%xmm23",
3137 "%xmm24", "%xmm25", "%xmm26", "%xmm27",
3138 "%xmm28", "%xmm29", "%xmm30", "%xmm31"
3139 };
3140
3141 static const char **names_ymm;
3142 static const char *intel_names_ymm[] = {
3143 "ymm0", "ymm1", "ymm2", "ymm3",
3144 "ymm4", "ymm5", "ymm6", "ymm7",
3145 "ymm8", "ymm9", "ymm10", "ymm11",
3146 "ymm12", "ymm13", "ymm14", "ymm15",
3147 "ymm16", "ymm17", "ymm18", "ymm19",
3148 "ymm20", "ymm21", "ymm22", "ymm23",
3149 "ymm24", "ymm25", "ymm26", "ymm27",
3150 "ymm28", "ymm29", "ymm30", "ymm31"
3151 };
3152 static const char *att_names_ymm[] = {
3153 "%ymm0", "%ymm1", "%ymm2", "%ymm3",
3154 "%ymm4", "%ymm5", "%ymm6", "%ymm7",
3155 "%ymm8", "%ymm9", "%ymm10", "%ymm11",
3156 "%ymm12", "%ymm13", "%ymm14", "%ymm15",
3157 "%ymm16", "%ymm17", "%ymm18", "%ymm19",
3158 "%ymm20", "%ymm21", "%ymm22", "%ymm23",
3159 "%ymm24", "%ymm25", "%ymm26", "%ymm27",
3160 "%ymm28", "%ymm29", "%ymm30", "%ymm31"
3161 };
3162
3163 static const char **names_zmm;
3164 static const char *intel_names_zmm[] = {
3165 "zmm0", "zmm1", "zmm2", "zmm3",
3166 "zmm4", "zmm5", "zmm6", "zmm7",
3167 "zmm8", "zmm9", "zmm10", "zmm11",
3168 "zmm12", "zmm13", "zmm14", "zmm15",
3169 "zmm16", "zmm17", "zmm18", "zmm19",
3170 "zmm20", "zmm21", "zmm22", "zmm23",
3171 "zmm24", "zmm25", "zmm26", "zmm27",
3172 "zmm28", "zmm29", "zmm30", "zmm31"
3173 };
3174 static const char *att_names_zmm[] = {
3175 "%zmm0", "%zmm1", "%zmm2", "%zmm3",
3176 "%zmm4", "%zmm5", "%zmm6", "%zmm7",
3177 "%zmm8", "%zmm9", "%zmm10", "%zmm11",
3178 "%zmm12", "%zmm13", "%zmm14", "%zmm15",
3179 "%zmm16", "%zmm17", "%zmm18", "%zmm19",
3180 "%zmm20", "%zmm21", "%zmm22", "%zmm23",
3181 "%zmm24", "%zmm25", "%zmm26", "%zmm27",
3182 "%zmm28", "%zmm29", "%zmm30", "%zmm31"
3183 };
3184
3185 static const char **names_mask;
3186 static const char *intel_names_mask[] = {
3187 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7"
3188 };
3189 static const char *att_names_mask[] = {
3190 "%k0", "%k1", "%k2", "%k3", "%k4", "%k5", "%k6", "%k7"
3191 };
3192
3193 static const char *names_rounding[] =
3194 {
3195 "{rn-sae}",
3196 "{rd-sae}",
3197 "{ru-sae}",
3198 "{rz-sae}"
3199 };
3200
3201 static const struct dis386 reg_table[][8] = {
3202 /* REG_80 */
3203 {
3204 { "addA", { Ebh1, Ib }, 0 },
3205 { "orA", { Ebh1, Ib }, 0 },
3206 { "adcA", { Ebh1, Ib }, 0 },
3207 { "sbbA", { Ebh1, Ib }, 0 },
3208 { "andA", { Ebh1, Ib }, 0 },
3209 { "subA", { Ebh1, Ib }, 0 },
3210 { "xorA", { Ebh1, Ib }, 0 },
3211 { "cmpA", { Eb, Ib }, 0 },
3212 },
3213 /* REG_81 */
3214 {
3215 { "addQ", { Evh1, Iv }, 0 },
3216 { "orQ", { Evh1, Iv }, 0 },
3217 { "adcQ", { Evh1, Iv }, 0 },
3218 { "sbbQ", { Evh1, Iv }, 0 },
3219 { "andQ", { Evh1, Iv }, 0 },
3220 { "subQ", { Evh1, Iv }, 0 },
3221 { "xorQ", { Evh1, Iv }, 0 },
3222 { "cmpQ", { Ev, Iv }, 0 },
3223 },
3224 /* REG_83 */
3225 {
3226 { "addQ", { Evh1, sIb }, 0 },
3227 { "orQ", { Evh1, sIb }, 0 },
3228 { "adcQ", { Evh1, sIb }, 0 },
3229 { "sbbQ", { Evh1, sIb }, 0 },
3230 { "andQ", { Evh1, sIb }, 0 },
3231 { "subQ", { Evh1, sIb }, 0 },
3232 { "xorQ", { Evh1, sIb }, 0 },
3233 { "cmpQ", { Ev, sIb }, 0 },
3234 },
3235 /* REG_8F */
3236 {
3237 { "popU", { stackEv }, 0 },
3238 { XOP_8F_TABLE (XOP_09) },
3239 { Bad_Opcode },
3240 { Bad_Opcode },
3241 { Bad_Opcode },
3242 { XOP_8F_TABLE (XOP_09) },
3243 },
3244 /* REG_C0 */
3245 {
3246 { "rolA", { Eb, Ib }, 0 },
3247 { "rorA", { Eb, Ib }, 0 },
3248 { "rclA", { Eb, Ib }, 0 },
3249 { "rcrA", { Eb, Ib }, 0 },
3250 { "shlA", { Eb, Ib }, 0 },
3251 { "shrA", { Eb, Ib }, 0 },
3252 { "shlA", { Eb, Ib }, 0 },
3253 { "sarA", { Eb, Ib }, 0 },
3254 },
3255 /* REG_C1 */
3256 {
3257 { "rolQ", { Ev, Ib }, 0 },
3258 { "rorQ", { Ev, Ib }, 0 },
3259 { "rclQ", { Ev, Ib }, 0 },
3260 { "rcrQ", { Ev, Ib }, 0 },
3261 { "shlQ", { Ev, Ib }, 0 },
3262 { "shrQ", { Ev, Ib }, 0 },
3263 { "shlQ", { Ev, Ib }, 0 },
3264 { "sarQ", { Ev, Ib }, 0 },
3265 },
3266 /* REG_C6 */
3267 {
3268 { "movA", { Ebh3, Ib }, 0 },
3269 { Bad_Opcode },
3270 { Bad_Opcode },
3271 { Bad_Opcode },
3272 { Bad_Opcode },
3273 { Bad_Opcode },
3274 { Bad_Opcode },
3275 { MOD_TABLE (MOD_C6_REG_7) },
3276 },
3277 /* REG_C7 */
3278 {
3279 { "movQ", { Evh3, Iv }, 0 },
3280 { Bad_Opcode },
3281 { Bad_Opcode },
3282 { Bad_Opcode },
3283 { Bad_Opcode },
3284 { Bad_Opcode },
3285 { Bad_Opcode },
3286 { MOD_TABLE (MOD_C7_REG_7) },
3287 },
3288 /* REG_D0 */
3289 {
3290 { "rolA", { Eb, I1 }, 0 },
3291 { "rorA", { Eb, I1 }, 0 },
3292 { "rclA", { Eb, I1 }, 0 },
3293 { "rcrA", { Eb, I1 }, 0 },
3294 { "shlA", { Eb, I1 }, 0 },
3295 { "shrA", { Eb, I1 }, 0 },
3296 { "shlA", { Eb, I1 }, 0 },
3297 { "sarA", { Eb, I1 }, 0 },
3298 },
3299 /* REG_D1 */
3300 {
3301 { "rolQ", { Ev, I1 }, 0 },
3302 { "rorQ", { Ev, I1 }, 0 },
3303 { "rclQ", { Ev, I1 }, 0 },
3304 { "rcrQ", { Ev, I1 }, 0 },
3305 { "shlQ", { Ev, I1 }, 0 },
3306 { "shrQ", { Ev, I1 }, 0 },
3307 { "shlQ", { Ev, I1 }, 0 },
3308 { "sarQ", { Ev, I1 }, 0 },
3309 },
3310 /* REG_D2 */
3311 {
3312 { "rolA", { Eb, CL }, 0 },
3313 { "rorA", { Eb, CL }, 0 },
3314 { "rclA", { Eb, CL }, 0 },
3315 { "rcrA", { Eb, CL }, 0 },
3316 { "shlA", { Eb, CL }, 0 },
3317 { "shrA", { Eb, CL }, 0 },
3318 { "shlA", { Eb, CL }, 0 },
3319 { "sarA", { Eb, CL }, 0 },
3320 },
3321 /* REG_D3 */
3322 {
3323 { "rolQ", { Ev, CL }, 0 },
3324 { "rorQ", { Ev, CL }, 0 },
3325 { "rclQ", { Ev, CL }, 0 },
3326 { "rcrQ", { Ev, CL }, 0 },
3327 { "shlQ", { Ev, CL }, 0 },
3328 { "shrQ", { Ev, CL }, 0 },
3329 { "shlQ", { Ev, CL }, 0 },
3330 { "sarQ", { Ev, CL }, 0 },
3331 },
3332 /* REG_F6 */
3333 {
3334 { "testA", { Eb, Ib }, 0 },
3335 { "testA", { Eb, Ib }, 0 },
3336 { "notA", { Ebh1 }, 0 },
3337 { "negA", { Ebh1 }, 0 },
3338 { "mulA", { Eb }, 0 }, /* Don't print the implicit %al register, */
3339 { "imulA", { Eb }, 0 }, /* to distinguish these opcodes from other */
3340 { "divA", { Eb }, 0 }, /* mul/imul opcodes. Do the same for div */
3341 { "idivA", { Eb }, 0 }, /* and idiv for consistency. */
3342 },
3343 /* REG_F7 */
3344 {
3345 { "testQ", { Ev, Iv }, 0 },
3346 { "testQ", { Ev, Iv }, 0 },
3347 { "notQ", { Evh1 }, 0 },
3348 { "negQ", { Evh1 }, 0 },
3349 { "mulQ", { Ev }, 0 }, /* Don't print the implicit register. */
3350 { "imulQ", { Ev }, 0 },
3351 { "divQ", { Ev }, 0 },
3352 { "idivQ", { Ev }, 0 },
3353 },
3354 /* REG_FE */
3355 {
3356 { "incA", { Ebh1 }, 0 },
3357 { "decA", { Ebh1 }, 0 },
3358 },
3359 /* REG_FF */
3360 {
3361 { "incQ", { Evh1 }, 0 },
3362 { "decQ", { Evh1 }, 0 },
3363 { "call{&|}", { NOTRACK, indirEv, BND }, 0 },
3364 { MOD_TABLE (MOD_FF_REG_3) },
3365 { "jmp{&|}", { NOTRACK, indirEv, BND }, 0 },
3366 { MOD_TABLE (MOD_FF_REG_5) },
3367 { "pushU", { stackEv }, 0 },
3368 { Bad_Opcode },
3369 },
3370 /* REG_0F00 */
3371 {
3372 { "sldtD", { Sv }, 0 },
3373 { "strD", { Sv }, 0 },
3374 { "lldt", { Ew }, 0 },
3375 { "ltr", { Ew }, 0 },
3376 { "verr", { Ew }, 0 },
3377 { "verw", { Ew }, 0 },
3378 { Bad_Opcode },
3379 { Bad_Opcode },
3380 },
3381 /* REG_0F01 */
3382 {
3383 { MOD_TABLE (MOD_0F01_REG_0) },
3384 { MOD_TABLE (MOD_0F01_REG_1) },
3385 { MOD_TABLE (MOD_0F01_REG_2) },
3386 { MOD_TABLE (MOD_0F01_REG_3) },
3387 { "smswD", { Sv }, 0 },
3388 { MOD_TABLE (MOD_0F01_REG_5) },
3389 { "lmsw", { Ew }, 0 },
3390 { MOD_TABLE (MOD_0F01_REG_7) },
3391 },
3392 /* REG_0F0D */
3393 {
3394 { "prefetch", { Mb }, 0 },
3395 { "prefetchw", { Mb }, 0 },
3396 { "prefetchwt1", { Mb }, 0 },
3397 { "prefetch", { Mb }, 0 },
3398 { "prefetch", { Mb }, 0 },
3399 { "prefetch", { Mb }, 0 },
3400 { "prefetch", { Mb }, 0 },
3401 { "prefetch", { Mb }, 0 },
3402 },
3403 /* REG_0F18 */
3404 {
3405 { MOD_TABLE (MOD_0F18_REG_0) },
3406 { MOD_TABLE (MOD_0F18_REG_1) },
3407 { MOD_TABLE (MOD_0F18_REG_2) },
3408 { MOD_TABLE (MOD_0F18_REG_3) },
3409 { MOD_TABLE (MOD_0F18_REG_4) },
3410 { MOD_TABLE (MOD_0F18_REG_5) },
3411 { MOD_TABLE (MOD_0F18_REG_6) },
3412 { MOD_TABLE (MOD_0F18_REG_7) },
3413 },
3414 /* REG_0F1C_MOD_0 */
3415 {
3416 { "cldemote", { Mb }, 0 },
3417 { "nopQ", { Ev }, 0 },
3418 { "nopQ", { Ev }, 0 },
3419 { "nopQ", { Ev }, 0 },
3420 { "nopQ", { Ev }, 0 },
3421 { "nopQ", { Ev }, 0 },
3422 { "nopQ", { Ev }, 0 },
3423 { "nopQ", { Ev }, 0 },
3424 },
3425 /* REG_0F1E_MOD_3 */
3426 {
3427 { "nopQ", { Ev }, 0 },
3428 { "rdsspK", { Rdq }, PREFIX_OPCODE },
3429 { "nopQ", { Ev }, 0 },
3430 { "nopQ", { Ev }, 0 },
3431 { "nopQ", { Ev }, 0 },
3432 { "nopQ", { Ev }, 0 },
3433 { "nopQ", { Ev }, 0 },
3434 { RM_TABLE (RM_0F1E_MOD_3_REG_7) },
3435 },
3436 /* REG_0F71 */
3437 {
3438 { Bad_Opcode },
3439 { Bad_Opcode },
3440 { MOD_TABLE (MOD_0F71_REG_2) },
3441 { Bad_Opcode },
3442 { MOD_TABLE (MOD_0F71_REG_4) },
3443 { Bad_Opcode },
3444 { MOD_TABLE (MOD_0F71_REG_6) },
3445 },
3446 /* REG_0F72 */
3447 {
3448 { Bad_Opcode },
3449 { Bad_Opcode },
3450 { MOD_TABLE (MOD_0F72_REG_2) },
3451 { Bad_Opcode },
3452 { MOD_TABLE (MOD_0F72_REG_4) },
3453 { Bad_Opcode },
3454 { MOD_TABLE (MOD_0F72_REG_6) },
3455 },
3456 /* REG_0F73 */
3457 {
3458 { Bad_Opcode },
3459 { Bad_Opcode },
3460 { MOD_TABLE (MOD_0F73_REG_2) },
3461 { MOD_TABLE (MOD_0F73_REG_3) },
3462 { Bad_Opcode },
3463 { Bad_Opcode },
3464 { MOD_TABLE (MOD_0F73_REG_6) },
3465 { MOD_TABLE (MOD_0F73_REG_7) },
3466 },
3467 /* REG_0FA6 */
3468 {
3469 { "montmul", { { OP_0f07, 0 } }, 0 },
3470 { "xsha1", { { OP_0f07, 0 } }, 0 },
3471 { "xsha256", { { OP_0f07, 0 } }, 0 },
3472 },
3473 /* REG_0FA7 */
3474 {
3475 { "xstore-rng", { { OP_0f07, 0 } }, 0 },
3476 { "xcrypt-ecb", { { OP_0f07, 0 } }, 0 },
3477 { "xcrypt-cbc", { { OP_0f07, 0 } }, 0 },
3478 { "xcrypt-ctr", { { OP_0f07, 0 } }, 0 },
3479 { "xcrypt-cfb", { { OP_0f07, 0 } }, 0 },
3480 { "xcrypt-ofb", { { OP_0f07, 0 } }, 0 },
3481 },
3482 /* REG_0FAE */
3483 {
3484 { MOD_TABLE (MOD_0FAE_REG_0) },
3485 { MOD_TABLE (MOD_0FAE_REG_1) },
3486 { MOD_TABLE (MOD_0FAE_REG_2) },
3487 { MOD_TABLE (MOD_0FAE_REG_3) },
3488 { MOD_TABLE (MOD_0FAE_REG_4) },
3489 { MOD_TABLE (MOD_0FAE_REG_5) },
3490 { MOD_TABLE (MOD_0FAE_REG_6) },
3491 { MOD_TABLE (MOD_0FAE_REG_7) },
3492 },
3493 /* REG_0FBA */
3494 {
3495 { Bad_Opcode },
3496 { Bad_Opcode },
3497 { Bad_Opcode },
3498 { Bad_Opcode },
3499 { "btQ", { Ev, Ib }, 0 },
3500 { "btsQ", { Evh1, Ib }, 0 },
3501 { "btrQ", { Evh1, Ib }, 0 },
3502 { "btcQ", { Evh1, Ib }, 0 },
3503 },
3504 /* REG_0FC7 */
3505 {
3506 { Bad_Opcode },
3507 { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } }, 0 },
3508 { Bad_Opcode },
3509 { MOD_TABLE (MOD_0FC7_REG_3) },
3510 { MOD_TABLE (MOD_0FC7_REG_4) },
3511 { MOD_TABLE (MOD_0FC7_REG_5) },
3512 { MOD_TABLE (MOD_0FC7_REG_6) },
3513 { MOD_TABLE (MOD_0FC7_REG_7) },
3514 },
3515 /* REG_VEX_0F71 */
3516 {
3517 { Bad_Opcode },
3518 { Bad_Opcode },
3519 { MOD_TABLE (MOD_VEX_0F71_REG_2) },
3520 { Bad_Opcode },
3521 { MOD_TABLE (MOD_VEX_0F71_REG_4) },
3522 { Bad_Opcode },
3523 { MOD_TABLE (MOD_VEX_0F71_REG_6) },
3524 },
3525 /* REG_VEX_0F72 */
3526 {
3527 { Bad_Opcode },
3528 { Bad_Opcode },
3529 { MOD_TABLE (MOD_VEX_0F72_REG_2) },
3530 { Bad_Opcode },
3531 { MOD_TABLE (MOD_VEX_0F72_REG_4) },
3532 { Bad_Opcode },
3533 { MOD_TABLE (MOD_VEX_0F72_REG_6) },
3534 },
3535 /* REG_VEX_0F73 */
3536 {
3537 { Bad_Opcode },
3538 { Bad_Opcode },
3539 { MOD_TABLE (MOD_VEX_0F73_REG_2) },
3540 { MOD_TABLE (MOD_VEX_0F73_REG_3) },
3541 { Bad_Opcode },
3542 { Bad_Opcode },
3543 { MOD_TABLE (MOD_VEX_0F73_REG_6) },
3544 { MOD_TABLE (MOD_VEX_0F73_REG_7) },
3545 },
3546 /* REG_VEX_0FAE */
3547 {
3548 { Bad_Opcode },
3549 { Bad_Opcode },
3550 { MOD_TABLE (MOD_VEX_0FAE_REG_2) },
3551 { MOD_TABLE (MOD_VEX_0FAE_REG_3) },
3552 },
3553 /* REG_VEX_0F38F3 */
3554 {
3555 { Bad_Opcode },
3556 { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_1) },
3557 { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_2) },
3558 { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_3) },
3559 },
3560 /* REG_XOP_LWPCB */
3561 {
3562 { "llwpcb", { { OP_LWPCB_E, 0 } }, 0 },
3563 { "slwpcb", { { OP_LWPCB_E, 0 } }, 0 },
3564 },
3565 /* REG_XOP_LWP */
3566 {
3567 { "lwpins", { { OP_LWP_E, 0 }, Ed, Iq }, 0 },
3568 { "lwpval", { { OP_LWP_E, 0 }, Ed, Iq }, 0 },
3569 },
3570 /* REG_XOP_TBM_01 */
3571 {
3572 { Bad_Opcode },
3573 { "blcfill", { { OP_LWP_E, 0 }, Ev }, 0 },
3574 { "blsfill", { { OP_LWP_E, 0 }, Ev }, 0 },
3575 { "blcs", { { OP_LWP_E, 0 }, Ev }, 0 },
3576 { "tzmsk", { { OP_LWP_E, 0 }, Ev }, 0 },
3577 { "blcic", { { OP_LWP_E, 0 }, Ev }, 0 },
3578 { "blsic", { { OP_LWP_E, 0 }, Ev }, 0 },
3579 { "t1mskc", { { OP_LWP_E, 0 }, Ev }, 0 },
3580 },
3581 /* REG_XOP_TBM_02 */
3582 {
3583 { Bad_Opcode },
3584 { "blcmsk", { { OP_LWP_E, 0 }, Ev }, 0 },
3585 { Bad_Opcode },
3586 { Bad_Opcode },
3587 { Bad_Opcode },
3588 { Bad_Opcode },
3589 { "blci", { { OP_LWP_E, 0 }, Ev }, 0 },
3590 },
3591 #define NEED_REG_TABLE
3592 #include "i386-dis-evex.h"
3593 #undef NEED_REG_TABLE
3594 };
3595
3596 static const struct dis386 prefix_table[][4] = {
3597 /* PREFIX_90 */
3598 {
3599 { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } }, 0 },
3600 { "pause", { XX }, 0 },
3601 { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } }, 0 },
3602 { NULL, { { NULL, 0 } }, PREFIX_IGNORED }
3603 },
3604
3605 /* PREFIX_MOD_0_0F01_REG_5 */
3606 {
3607 { Bad_Opcode },
3608 { "rstorssp", { Mq }, PREFIX_OPCODE },
3609 },
3610
3611 /* PREFIX_MOD_3_0F01_REG_5_RM_0 */
3612 {
3613 { Bad_Opcode },
3614 { "setssbsy", { Skip_MODRM }, PREFIX_OPCODE },
3615 },
3616
3617 /* PREFIX_MOD_3_0F01_REG_5_RM_2 */
3618 {
3619 { Bad_Opcode },
3620 { "saveprevssp", { Skip_MODRM }, PREFIX_OPCODE },
3621 },
3622
3623 /* PREFIX_0F09 */
3624 {
3625 { "wbinvd", { XX }, 0 },
3626 { "wbnoinvd", { XX }, 0 },
3627 },
3628
3629 /* PREFIX_0F10 */
3630 {
3631 { "movups", { XM, EXx }, PREFIX_OPCODE },
3632 { "movss", { XM, EXd }, PREFIX_OPCODE },
3633 { "movupd", { XM, EXx }, PREFIX_OPCODE },
3634 { "movsd", { XM, EXq }, PREFIX_OPCODE },
3635 },
3636
3637 /* PREFIX_0F11 */
3638 {
3639 { "movups", { EXxS, XM }, PREFIX_OPCODE },
3640 { "movss", { EXdS, XM }, PREFIX_OPCODE },
3641 { "movupd", { EXxS, XM }, PREFIX_OPCODE },
3642 { "movsd", { EXqS, XM }, PREFIX_OPCODE },
3643 },
3644
3645 /* PREFIX_0F12 */
3646 {
3647 { MOD_TABLE (MOD_0F12_PREFIX_0) },
3648 { "movsldup", { XM, EXx }, PREFIX_OPCODE },
3649 { "movlpd", { XM, EXq }, PREFIX_OPCODE },
3650 { "movddup", { XM, EXq }, PREFIX_OPCODE },
3651 },
3652
3653 /* PREFIX_0F16 */
3654 {
3655 { MOD_TABLE (MOD_0F16_PREFIX_0) },
3656 { "movshdup", { XM, EXx }, PREFIX_OPCODE },
3657 { "movhpd", { XM, EXq }, PREFIX_OPCODE },
3658 },
3659
3660 /* PREFIX_0F1A */
3661 {
3662 { MOD_TABLE (MOD_0F1A_PREFIX_0) },
3663 { "bndcl", { Gbnd, Ev_bnd }, 0 },
3664 { "bndmov", { Gbnd, Ebnd }, 0 },
3665 { "bndcu", { Gbnd, Ev_bnd }, 0 },
3666 },
3667
3668 /* PREFIX_0F1B */
3669 {
3670 { MOD_TABLE (MOD_0F1B_PREFIX_0) },
3671 { MOD_TABLE (MOD_0F1B_PREFIX_1) },
3672 { "bndmov", { EbndS, Gbnd }, 0 },
3673 { "bndcn", { Gbnd, Ev_bnd }, 0 },
3674 },
3675
3676 /* PREFIX_0F1C */
3677 {
3678 { MOD_TABLE (MOD_0F1C_PREFIX_0) },
3679 { "nopQ", { Ev }, PREFIX_OPCODE },
3680 { "nopQ", { Ev }, PREFIX_OPCODE },
3681 { "nopQ", { Ev }, PREFIX_OPCODE },
3682 },
3683
3684 /* PREFIX_0F1E */
3685 {
3686 { "nopQ", { Ev }, PREFIX_OPCODE },
3687 { MOD_TABLE (MOD_0F1E_PREFIX_1) },
3688 { "nopQ", { Ev }, PREFIX_OPCODE },
3689 { "nopQ", { Ev }, PREFIX_OPCODE },
3690 },
3691
3692 /* PREFIX_0F2A */
3693 {
3694 { "cvtpi2ps", { XM, EMCq }, PREFIX_OPCODE },
3695 { "cvtsi2ss%LQ", { XM, Ev }, PREFIX_OPCODE },
3696 { "cvtpi2pd", { XM, EMCq }, PREFIX_OPCODE },
3697 { "cvtsi2sd%LQ", { XM, Ev }, 0 },
3698 },
3699
3700 /* PREFIX_0F2B */
3701 {
3702 { MOD_TABLE (MOD_0F2B_PREFIX_0) },
3703 { MOD_TABLE (MOD_0F2B_PREFIX_1) },
3704 { MOD_TABLE (MOD_0F2B_PREFIX_2) },
3705 { MOD_TABLE (MOD_0F2B_PREFIX_3) },
3706 },
3707
3708 /* PREFIX_0F2C */
3709 {
3710 { "cvttps2pi", { MXC, EXq }, PREFIX_OPCODE },
3711 { "cvttss2si", { Gv, EXd }, PREFIX_OPCODE },
3712 { "cvttpd2pi", { MXC, EXx }, PREFIX_OPCODE },
3713 { "cvttsd2si", { Gv, EXq }, PREFIX_OPCODE },
3714 },
3715
3716 /* PREFIX_0F2D */
3717 {
3718 { "cvtps2pi", { MXC, EXq }, PREFIX_OPCODE },
3719 { "cvtss2si", { Gv, EXd }, PREFIX_OPCODE },
3720 { "cvtpd2pi", { MXC, EXx }, PREFIX_OPCODE },
3721 { "cvtsd2si", { Gv, EXq }, PREFIX_OPCODE },
3722 },
3723
3724 /* PREFIX_0F2E */
3725 {
3726 { "ucomiss",{ XM, EXd }, 0 },
3727 { Bad_Opcode },
3728 { "ucomisd",{ XM, EXq }, 0 },
3729 },
3730
3731 /* PREFIX_0F2F */
3732 {
3733 { "comiss", { XM, EXd }, 0 },
3734 { Bad_Opcode },
3735 { "comisd", { XM, EXq }, 0 },
3736 },
3737
3738 /* PREFIX_0F51 */
3739 {
3740 { "sqrtps", { XM, EXx }, PREFIX_OPCODE },
3741 { "sqrtss", { XM, EXd }, PREFIX_OPCODE },
3742 { "sqrtpd", { XM, EXx }, PREFIX_OPCODE },
3743 { "sqrtsd", { XM, EXq }, PREFIX_OPCODE },
3744 },
3745
3746 /* PREFIX_0F52 */
3747 {
3748 { "rsqrtps",{ XM, EXx }, PREFIX_OPCODE },
3749 { "rsqrtss",{ XM, EXd }, PREFIX_OPCODE },
3750 },
3751
3752 /* PREFIX_0F53 */
3753 {
3754 { "rcpps", { XM, EXx }, PREFIX_OPCODE },
3755 { "rcpss", { XM, EXd }, PREFIX_OPCODE },
3756 },
3757
3758 /* PREFIX_0F58 */
3759 {
3760 { "addps", { XM, EXx }, PREFIX_OPCODE },
3761 { "addss", { XM, EXd }, PREFIX_OPCODE },
3762 { "addpd", { XM, EXx }, PREFIX_OPCODE },
3763 { "addsd", { XM, EXq }, PREFIX_OPCODE },
3764 },
3765
3766 /* PREFIX_0F59 */
3767 {
3768 { "mulps", { XM, EXx }, PREFIX_OPCODE },
3769 { "mulss", { XM, EXd }, PREFIX_OPCODE },
3770 { "mulpd", { XM, EXx }, PREFIX_OPCODE },
3771 { "mulsd", { XM, EXq }, PREFIX_OPCODE },
3772 },
3773
3774 /* PREFIX_0F5A */
3775 {
3776 { "cvtps2pd", { XM, EXq }, PREFIX_OPCODE },
3777 { "cvtss2sd", { XM, EXd }, PREFIX_OPCODE },
3778 { "cvtpd2ps", { XM, EXx }, PREFIX_OPCODE },
3779 { "cvtsd2ss", { XM, EXq }, PREFIX_OPCODE },
3780 },
3781
3782 /* PREFIX_0F5B */
3783 {
3784 { "cvtdq2ps", { XM, EXx }, PREFIX_OPCODE },
3785 { "cvttps2dq", { XM, EXx }, PREFIX_OPCODE },
3786 { "cvtps2dq", { XM, EXx }, PREFIX_OPCODE },
3787 },
3788
3789 /* PREFIX_0F5C */
3790 {
3791 { "subps", { XM, EXx }, PREFIX_OPCODE },
3792 { "subss", { XM, EXd }, PREFIX_OPCODE },
3793 { "subpd", { XM, EXx }, PREFIX_OPCODE },
3794 { "subsd", { XM, EXq }, PREFIX_OPCODE },
3795 },
3796
3797 /* PREFIX_0F5D */
3798 {
3799 { "minps", { XM, EXx }, PREFIX_OPCODE },
3800 { "minss", { XM, EXd }, PREFIX_OPCODE },
3801 { "minpd", { XM, EXx }, PREFIX_OPCODE },
3802 { "minsd", { XM, EXq }, PREFIX_OPCODE },
3803 },
3804
3805 /* PREFIX_0F5E */
3806 {
3807 { "divps", { XM, EXx }, PREFIX_OPCODE },
3808 { "divss", { XM, EXd }, PREFIX_OPCODE },
3809 { "divpd", { XM, EXx }, PREFIX_OPCODE },
3810 { "divsd", { XM, EXq }, PREFIX_OPCODE },
3811 },
3812
3813 /* PREFIX_0F5F */
3814 {
3815 { "maxps", { XM, EXx }, PREFIX_OPCODE },
3816 { "maxss", { XM, EXd }, PREFIX_OPCODE },
3817 { "maxpd", { XM, EXx }, PREFIX_OPCODE },
3818 { "maxsd", { XM, EXq }, PREFIX_OPCODE },
3819 },
3820
3821 /* PREFIX_0F60 */
3822 {
3823 { "punpcklbw",{ MX, EMd }, PREFIX_OPCODE },
3824 { Bad_Opcode },
3825 { "punpcklbw",{ MX, EMx }, PREFIX_OPCODE },
3826 },
3827
3828 /* PREFIX_0F61 */
3829 {
3830 { "punpcklwd",{ MX, EMd }, PREFIX_OPCODE },
3831 { Bad_Opcode },
3832 { "punpcklwd",{ MX, EMx }, PREFIX_OPCODE },
3833 },
3834
3835 /* PREFIX_0F62 */
3836 {
3837 { "punpckldq",{ MX, EMd }, PREFIX_OPCODE },
3838 { Bad_Opcode },
3839 { "punpckldq",{ MX, EMx }, PREFIX_OPCODE },
3840 },
3841
3842 /* PREFIX_0F6C */
3843 {
3844 { Bad_Opcode },
3845 { Bad_Opcode },
3846 { "punpcklqdq", { XM, EXx }, PREFIX_OPCODE },
3847 },
3848
3849 /* PREFIX_0F6D */
3850 {
3851 { Bad_Opcode },
3852 { Bad_Opcode },
3853 { "punpckhqdq", { XM, EXx }, PREFIX_OPCODE },
3854 },
3855
3856 /* PREFIX_0F6F */
3857 {
3858 { "movq", { MX, EM }, PREFIX_OPCODE },
3859 { "movdqu", { XM, EXx }, PREFIX_OPCODE },
3860 { "movdqa", { XM, EXx }, PREFIX_OPCODE },
3861 },
3862
3863 /* PREFIX_0F70 */
3864 {
3865 { "pshufw", { MX, EM, Ib }, PREFIX_OPCODE },
3866 { "pshufhw",{ XM, EXx, Ib }, PREFIX_OPCODE },
3867 { "pshufd", { XM, EXx, Ib }, PREFIX_OPCODE },
3868 { "pshuflw",{ XM, EXx, Ib }, PREFIX_OPCODE },
3869 },
3870
3871 /* PREFIX_0F73_REG_3 */
3872 {
3873 { Bad_Opcode },
3874 { Bad_Opcode },
3875 { "psrldq", { XS, Ib }, 0 },
3876 },
3877
3878 /* PREFIX_0F73_REG_7 */
3879 {
3880 { Bad_Opcode },
3881 { Bad_Opcode },
3882 { "pslldq", { XS, Ib }, 0 },
3883 },
3884
3885 /* PREFIX_0F78 */
3886 {
3887 {"vmread", { Em, Gm }, 0 },
3888 { Bad_Opcode },
3889 {"extrq", { XS, Ib, Ib }, 0 },
3890 {"insertq", { XM, XS, Ib, Ib }, 0 },
3891 },
3892
3893 /* PREFIX_0F79 */
3894 {
3895 {"vmwrite", { Gm, Em }, 0 },
3896 { Bad_Opcode },
3897 {"extrq", { XM, XS }, 0 },
3898 {"insertq", { XM, XS }, 0 },
3899 },
3900
3901 /* PREFIX_0F7C */
3902 {
3903 { Bad_Opcode },
3904 { Bad_Opcode },
3905 { "haddpd", { XM, EXx }, PREFIX_OPCODE },
3906 { "haddps", { XM, EXx }, PREFIX_OPCODE },
3907 },
3908
3909 /* PREFIX_0F7D */
3910 {
3911 { Bad_Opcode },
3912 { Bad_Opcode },
3913 { "hsubpd", { XM, EXx }, PREFIX_OPCODE },
3914 { "hsubps", { XM, EXx }, PREFIX_OPCODE },
3915 },
3916
3917 /* PREFIX_0F7E */
3918 {
3919 { "movK", { Edq, MX }, PREFIX_OPCODE },
3920 { "movq", { XM, EXq }, PREFIX_OPCODE },
3921 { "movK", { Edq, XM }, PREFIX_OPCODE },
3922 },
3923
3924 /* PREFIX_0F7F */
3925 {
3926 { "movq", { EMS, MX }, PREFIX_OPCODE },
3927 { "movdqu", { EXxS, XM }, PREFIX_OPCODE },
3928 { "movdqa", { EXxS, XM }, PREFIX_OPCODE },
3929 },
3930
3931 /* PREFIX_0FAE_REG_0 */
3932 {
3933 { Bad_Opcode },
3934 { "rdfsbase", { Ev }, 0 },
3935 },
3936
3937 /* PREFIX_0FAE_REG_1 */
3938 {
3939 { Bad_Opcode },
3940 { "rdgsbase", { Ev }, 0 },
3941 },
3942
3943 /* PREFIX_0FAE_REG_2 */
3944 {
3945 { Bad_Opcode },
3946 { "wrfsbase", { Ev }, 0 },
3947 },
3948
3949 /* PREFIX_0FAE_REG_3 */
3950 {
3951 { Bad_Opcode },
3952 { "wrgsbase", { Ev }, 0 },
3953 },
3954
3955 /* PREFIX_MOD_0_0FAE_REG_4 */
3956 {
3957 { "xsave", { FXSAVE }, 0 },
3958 { "ptwrite%LQ", { Edq }, 0 },
3959 },
3960
3961 /* PREFIX_MOD_3_0FAE_REG_4 */
3962 {
3963 { Bad_Opcode },
3964 { "ptwrite%LQ", { Edq }, 0 },
3965 },
3966
3967 /* PREFIX_MOD_0_0FAE_REG_5 */
3968 {
3969 { "xrstor", { FXSAVE }, PREFIX_OPCODE },
3970 },
3971
3972 /* PREFIX_MOD_3_0FAE_REG_5 */
3973 {
3974 { "lfence", { Skip_MODRM }, 0 },
3975 { "incsspK", { Rdq }, PREFIX_OPCODE },
3976 },
3977
3978 /* PREFIX_MOD_0_0FAE_REG_6 */
3979 {
3980 { "xsaveopt", { FXSAVE }, PREFIX_OPCODE },
3981 { "clrssbsy", { Mq }, PREFIX_OPCODE },
3982 { "clwb", { Mb }, PREFIX_OPCODE },
3983 },
3984
3985 /* PREFIX_MOD_1_0FAE_REG_6 */
3986 {
3987 { RM_TABLE (RM_0FAE_REG_6) },
3988 { "umonitor", { Eva }, PREFIX_OPCODE },
3989 { "tpause", { Edq }, PREFIX_OPCODE },
3990 { "umwait", { Edq }, PREFIX_OPCODE },
3991 },
3992
3993 /* PREFIX_0FAE_REG_7 */
3994 {
3995 { "clflush", { Mb }, 0 },
3996 { Bad_Opcode },
3997 { "clflushopt", { Mb }, 0 },
3998 },
3999
4000 /* PREFIX_0FB8 */
4001 {
4002 { Bad_Opcode },
4003 { "popcntS", { Gv, Ev }, 0 },
4004 },
4005
4006 /* PREFIX_0FBC */
4007 {
4008 { "bsfS", { Gv, Ev }, 0 },
4009 { "tzcntS", { Gv, Ev }, 0 },
4010 { "bsfS", { Gv, Ev }, 0 },
4011 },
4012
4013 /* PREFIX_0FBD */
4014 {
4015 { "bsrS", { Gv, Ev }, 0 },
4016 { "lzcntS", { Gv, Ev }, 0 },
4017 { "bsrS", { Gv, Ev }, 0 },
4018 },
4019
4020 /* PREFIX_0FC2 */
4021 {
4022 { "cmpps", { XM, EXx, CMP }, PREFIX_OPCODE },
4023 { "cmpss", { XM, EXd, CMP }, PREFIX_OPCODE },
4024 { "cmppd", { XM, EXx, CMP }, PREFIX_OPCODE },
4025 { "cmpsd", { XM, EXq, CMP }, PREFIX_OPCODE },
4026 },
4027
4028 /* PREFIX_MOD_0_0FC3 */
4029 {
4030 { "movntiS", { Ev, Gv }, PREFIX_OPCODE },
4031 },
4032
4033 /* PREFIX_MOD_0_0FC7_REG_6 */
4034 {
4035 { "vmptrld",{ Mq }, 0 },
4036 { "vmxon", { Mq }, 0 },
4037 { "vmclear",{ Mq }, 0 },
4038 },
4039
4040 /* PREFIX_MOD_3_0FC7_REG_6 */
4041 {
4042 { "rdrand", { Ev }, 0 },
4043 { Bad_Opcode },
4044 { "rdrand", { Ev }, 0 }
4045 },
4046
4047 /* PREFIX_MOD_3_0FC7_REG_7 */
4048 {
4049 { "rdseed", { Ev }, 0 },
4050 { "rdpid", { Em }, 0 },
4051 { "rdseed", { Ev }, 0 },
4052 },
4053
4054 /* PREFIX_0FD0 */
4055 {
4056 { Bad_Opcode },
4057 { Bad_Opcode },
4058 { "addsubpd", { XM, EXx }, 0 },
4059 { "addsubps", { XM, EXx }, 0 },
4060 },
4061
4062 /* PREFIX_0FD6 */
4063 {
4064 { Bad_Opcode },
4065 { "movq2dq",{ XM, MS }, 0 },
4066 { "movq", { EXqS, XM }, 0 },
4067 { "movdq2q",{ MX, XS }, 0 },
4068 },
4069
4070 /* PREFIX_0FE6 */
4071 {
4072 { Bad_Opcode },
4073 { "cvtdq2pd", { XM, EXq }, PREFIX_OPCODE },
4074 { "cvttpd2dq", { XM, EXx }, PREFIX_OPCODE },
4075 { "cvtpd2dq", { XM, EXx }, PREFIX_OPCODE },
4076 },
4077
4078 /* PREFIX_0FE7 */
4079 {
4080 { "movntq", { Mq, MX }, PREFIX_OPCODE },
4081 { Bad_Opcode },
4082 { MOD_TABLE (MOD_0FE7_PREFIX_2) },
4083 },
4084
4085 /* PREFIX_0FF0 */
4086 {
4087 { Bad_Opcode },
4088 { Bad_Opcode },
4089 { Bad_Opcode },
4090 { MOD_TABLE (MOD_0FF0_PREFIX_3) },
4091 },
4092
4093 /* PREFIX_0FF7 */
4094 {
4095 { "maskmovq", { MX, MS }, PREFIX_OPCODE },
4096 { Bad_Opcode },
4097 { "maskmovdqu", { XM, XS }, PREFIX_OPCODE },
4098 },
4099
4100 /* PREFIX_0F3810 */
4101 {
4102 { Bad_Opcode },
4103 { Bad_Opcode },
4104 { "pblendvb", { XM, EXx, XMM0 }, PREFIX_OPCODE },
4105 },
4106
4107 /* PREFIX_0F3814 */
4108 {
4109 { Bad_Opcode },
4110 { Bad_Opcode },
4111 { "blendvps", { XM, EXx, XMM0 }, PREFIX_OPCODE },
4112 },
4113
4114 /* PREFIX_0F3815 */
4115 {
4116 { Bad_Opcode },
4117 { Bad_Opcode },
4118 { "blendvpd", { XM, EXx, XMM0 }, PREFIX_OPCODE },
4119 },
4120
4121 /* PREFIX_0F3817 */
4122 {
4123 { Bad_Opcode },
4124 { Bad_Opcode },
4125 { "ptest", { XM, EXx }, PREFIX_OPCODE },
4126 },
4127
4128 /* PREFIX_0F3820 */
4129 {
4130 { Bad_Opcode },
4131 { Bad_Opcode },
4132 { "pmovsxbw", { XM, EXq }, PREFIX_OPCODE },
4133 },
4134
4135 /* PREFIX_0F3821 */
4136 {
4137 { Bad_Opcode },
4138 { Bad_Opcode },
4139 { "pmovsxbd", { XM, EXd }, PREFIX_OPCODE },
4140 },
4141
4142 /* PREFIX_0F3822 */
4143 {
4144 { Bad_Opcode },
4145 { Bad_Opcode },
4146 { "pmovsxbq", { XM, EXw }, PREFIX_OPCODE },
4147 },
4148
4149 /* PREFIX_0F3823 */
4150 {
4151 { Bad_Opcode },
4152 { Bad_Opcode },
4153 { "pmovsxwd", { XM, EXq }, PREFIX_OPCODE },
4154 },
4155
4156 /* PREFIX_0F3824 */
4157 {
4158 { Bad_Opcode },
4159 { Bad_Opcode },
4160 { "pmovsxwq", { XM, EXd }, PREFIX_OPCODE },
4161 },
4162
4163 /* PREFIX_0F3825 */
4164 {
4165 { Bad_Opcode },
4166 { Bad_Opcode },
4167 { "pmovsxdq", { XM, EXq }, PREFIX_OPCODE },
4168 },
4169
4170 /* PREFIX_0F3828 */
4171 {
4172 { Bad_Opcode },
4173 { Bad_Opcode },
4174 { "pmuldq", { XM, EXx }, PREFIX_OPCODE },
4175 },
4176
4177 /* PREFIX_0F3829 */
4178 {
4179 { Bad_Opcode },
4180 { Bad_Opcode },
4181 { "pcmpeqq", { XM, EXx }, PREFIX_OPCODE },
4182 },
4183
4184 /* PREFIX_0F382A */
4185 {
4186 { Bad_Opcode },
4187 { Bad_Opcode },
4188 { MOD_TABLE (MOD_0F382A_PREFIX_2) },
4189 },
4190
4191 /* PREFIX_0F382B */
4192 {
4193 { Bad_Opcode },
4194 { Bad_Opcode },
4195 { "packusdw", { XM, EXx }, PREFIX_OPCODE },
4196 },
4197
4198 /* PREFIX_0F3830 */
4199 {
4200 { Bad_Opcode },
4201 { Bad_Opcode },
4202 { "pmovzxbw", { XM, EXq }, PREFIX_OPCODE },
4203 },
4204
4205 /* PREFIX_0F3831 */
4206 {
4207 { Bad_Opcode },
4208 { Bad_Opcode },
4209 { "pmovzxbd", { XM, EXd }, PREFIX_OPCODE },
4210 },
4211
4212 /* PREFIX_0F3832 */
4213 {
4214 { Bad_Opcode },
4215 { Bad_Opcode },
4216 { "pmovzxbq", { XM, EXw }, PREFIX_OPCODE },
4217 },
4218
4219 /* PREFIX_0F3833 */
4220 {
4221 { Bad_Opcode },
4222 { Bad_Opcode },
4223 { "pmovzxwd", { XM, EXq }, PREFIX_OPCODE },
4224 },
4225
4226 /* PREFIX_0F3834 */
4227 {
4228 { Bad_Opcode },
4229 { Bad_Opcode },
4230 { "pmovzxwq", { XM, EXd }, PREFIX_OPCODE },
4231 },
4232
4233 /* PREFIX_0F3835 */
4234 {
4235 { Bad_Opcode },
4236 { Bad_Opcode },
4237 { "pmovzxdq", { XM, EXq }, PREFIX_OPCODE },
4238 },
4239
4240 /* PREFIX_0F3837 */
4241 {
4242 { Bad_Opcode },
4243 { Bad_Opcode },
4244 { "pcmpgtq", { XM, EXx }, PREFIX_OPCODE },
4245 },
4246
4247 /* PREFIX_0F3838 */
4248 {
4249 { Bad_Opcode },
4250 { Bad_Opcode },
4251 { "pminsb", { XM, EXx }, PREFIX_OPCODE },
4252 },
4253
4254 /* PREFIX_0F3839 */
4255 {
4256 { Bad_Opcode },
4257 { Bad_Opcode },
4258 { "pminsd", { XM, EXx }, PREFIX_OPCODE },
4259 },
4260
4261 /* PREFIX_0F383A */
4262 {
4263 { Bad_Opcode },
4264 { Bad_Opcode },
4265 { "pminuw", { XM, EXx }, PREFIX_OPCODE },
4266 },
4267
4268 /* PREFIX_0F383B */
4269 {
4270 { Bad_Opcode },
4271 { Bad_Opcode },
4272 { "pminud", { XM, EXx }, PREFIX_OPCODE },
4273 },
4274
4275 /* PREFIX_0F383C */
4276 {
4277 { Bad_Opcode },
4278 { Bad_Opcode },
4279 { "pmaxsb", { XM, EXx }, PREFIX_OPCODE },
4280 },
4281
4282 /* PREFIX_0F383D */
4283 {
4284 { Bad_Opcode },
4285 { Bad_Opcode },
4286 { "pmaxsd", { XM, EXx }, PREFIX_OPCODE },
4287 },
4288
4289 /* PREFIX_0F383E */
4290 {
4291 { Bad_Opcode },
4292 { Bad_Opcode },
4293 { "pmaxuw", { XM, EXx }, PREFIX_OPCODE },
4294 },
4295
4296 /* PREFIX_0F383F */
4297 {
4298 { Bad_Opcode },
4299 { Bad_Opcode },
4300 { "pmaxud", { XM, EXx }, PREFIX_OPCODE },
4301 },
4302
4303 /* PREFIX_0F3840 */
4304 {
4305 { Bad_Opcode },
4306 { Bad_Opcode },
4307 { "pmulld", { XM, EXx }, PREFIX_OPCODE },
4308 },
4309
4310 /* PREFIX_0F3841 */
4311 {
4312 { Bad_Opcode },
4313 { Bad_Opcode },
4314 { "phminposuw", { XM, EXx }, PREFIX_OPCODE },
4315 },
4316
4317 /* PREFIX_0F3880 */
4318 {
4319 { Bad_Opcode },
4320 { Bad_Opcode },
4321 { "invept", { Gm, Mo }, PREFIX_OPCODE },
4322 },
4323
4324 /* PREFIX_0F3881 */
4325 {
4326 { Bad_Opcode },
4327 { Bad_Opcode },
4328 { "invvpid", { Gm, Mo }, PREFIX_OPCODE },
4329 },
4330
4331 /* PREFIX_0F3882 */
4332 {
4333 { Bad_Opcode },
4334 { Bad_Opcode },
4335 { "invpcid", { Gm, M }, PREFIX_OPCODE },
4336 },
4337
4338 /* PREFIX_0F38C8 */
4339 {
4340 { "sha1nexte", { XM, EXxmm }, PREFIX_OPCODE },
4341 },
4342
4343 /* PREFIX_0F38C9 */
4344 {
4345 { "sha1msg1", { XM, EXxmm }, PREFIX_OPCODE },
4346 },
4347
4348 /* PREFIX_0F38CA */
4349 {
4350 { "sha1msg2", { XM, EXxmm }, PREFIX_OPCODE },
4351 },
4352
4353 /* PREFIX_0F38CB */
4354 {
4355 { "sha256rnds2", { XM, EXxmm, XMM0 }, PREFIX_OPCODE },
4356 },
4357
4358 /* PREFIX_0F38CC */
4359 {
4360 { "sha256msg1", { XM, EXxmm }, PREFIX_OPCODE },
4361 },
4362
4363 /* PREFIX_0F38CD */
4364 {
4365 { "sha256msg2", { XM, EXxmm }, PREFIX_OPCODE },
4366 },
4367
4368 /* PREFIX_0F38CF */
4369 {
4370 { Bad_Opcode },
4371 { Bad_Opcode },
4372 { "gf2p8mulb", { XM, EXxmm }, PREFIX_OPCODE },
4373 },
4374
4375 /* PREFIX_0F38DB */
4376 {
4377 { Bad_Opcode },
4378 { Bad_Opcode },
4379 { "aesimc", { XM, EXx }, PREFIX_OPCODE },
4380 },
4381
4382 /* PREFIX_0F38DC */
4383 {
4384 { Bad_Opcode },
4385 { Bad_Opcode },
4386 { "aesenc", { XM, EXx }, PREFIX_OPCODE },
4387 },
4388
4389 /* PREFIX_0F38DD */
4390 {
4391 { Bad_Opcode },
4392 { Bad_Opcode },
4393 { "aesenclast", { XM, EXx }, PREFIX_OPCODE },
4394 },
4395
4396 /* PREFIX_0F38DE */
4397 {
4398 { Bad_Opcode },
4399 { Bad_Opcode },
4400 { "aesdec", { XM, EXx }, PREFIX_OPCODE },
4401 },
4402
4403 /* PREFIX_0F38DF */
4404 {
4405 { Bad_Opcode },
4406 { Bad_Opcode },
4407 { "aesdeclast", { XM, EXx }, PREFIX_OPCODE },
4408 },
4409
4410 /* PREFIX_0F38F0 */
4411 {
4412 { "movbeS", { Gv, { MOVBE_Fixup, v_mode } }, PREFIX_OPCODE },
4413 { Bad_Opcode },
4414 { "movbeS", { Gv, { MOVBE_Fixup, v_mode } }, PREFIX_OPCODE },
4415 { "crc32", { Gdq, { CRC32_Fixup, b_mode } }, PREFIX_OPCODE },
4416 },
4417
4418 /* PREFIX_0F38F1 */
4419 {
4420 { "movbeS", { { MOVBE_Fixup, v_mode }, Gv }, PREFIX_OPCODE },
4421 { Bad_Opcode },
4422 { "movbeS", { { MOVBE_Fixup, v_mode }, Gv }, PREFIX_OPCODE },
4423 { "crc32", { Gdq, { CRC32_Fixup, v_mode } }, PREFIX_OPCODE },
4424 },
4425
4426 /* PREFIX_0F38F5 */
4427 {
4428 { Bad_Opcode },
4429 { Bad_Opcode },
4430 { MOD_TABLE (MOD_0F38F5_PREFIX_2) },
4431 },
4432
4433 /* PREFIX_0F38F6 */
4434 {
4435 { MOD_TABLE (MOD_0F38F6_PREFIX_0) },
4436 { "adoxS", { Gdq, Edq}, PREFIX_OPCODE },
4437 { "adcxS", { Gdq, Edq}, PREFIX_OPCODE },
4438 { Bad_Opcode },
4439 },
4440
4441 /* PREFIX_0F38F8 */
4442 {
4443 { Bad_Opcode },
4444 { Bad_Opcode },
4445 { MOD_TABLE (MOD_0F38F8_PREFIX_2) },
4446 },
4447
4448 /* PREFIX_0F38F9 */
4449 {
4450 { MOD_TABLE (MOD_0F38F9_PREFIX_0) },
4451 },
4452
4453 /* PREFIX_0F3A08 */
4454 {
4455 { Bad_Opcode },
4456 { Bad_Opcode },
4457 { "roundps", { XM, EXx, Ib }, PREFIX_OPCODE },
4458 },
4459
4460 /* PREFIX_0F3A09 */
4461 {
4462 { Bad_Opcode },
4463 { Bad_Opcode },
4464 { "roundpd", { XM, EXx, Ib }, PREFIX_OPCODE },
4465 },
4466
4467 /* PREFIX_0F3A0A */
4468 {
4469 { Bad_Opcode },
4470 { Bad_Opcode },
4471 { "roundss", { XM, EXd, Ib }, PREFIX_OPCODE },
4472 },
4473
4474 /* PREFIX_0F3A0B */
4475 {
4476 { Bad_Opcode },
4477 { Bad_Opcode },
4478 { "roundsd", { XM, EXq, Ib }, PREFIX_OPCODE },
4479 },
4480
4481 /* PREFIX_0F3A0C */
4482 {
4483 { Bad_Opcode },
4484 { Bad_Opcode },
4485 { "blendps", { XM, EXx, Ib }, PREFIX_OPCODE },
4486 },
4487
4488 /* PREFIX_0F3A0D */
4489 {
4490 { Bad_Opcode },
4491 { Bad_Opcode },
4492 { "blendpd", { XM, EXx, Ib }, PREFIX_OPCODE },
4493 },
4494
4495 /* PREFIX_0F3A0E */
4496 {
4497 { Bad_Opcode },
4498 { Bad_Opcode },
4499 { "pblendw", { XM, EXx, Ib }, PREFIX_OPCODE },
4500 },
4501
4502 /* PREFIX_0F3A14 */
4503 {
4504 { Bad_Opcode },
4505 { Bad_Opcode },
4506 { "pextrb", { Edqb, XM, Ib }, PREFIX_OPCODE },
4507 },
4508
4509 /* PREFIX_0F3A15 */
4510 {
4511 { Bad_Opcode },
4512 { Bad_Opcode },
4513 { "pextrw", { Edqw, XM, Ib }, PREFIX_OPCODE },
4514 },
4515
4516 /* PREFIX_0F3A16 */
4517 {
4518 { Bad_Opcode },
4519 { Bad_Opcode },
4520 { "pextrK", { Edq, XM, Ib }, PREFIX_OPCODE },
4521 },
4522
4523 /* PREFIX_0F3A17 */
4524 {
4525 { Bad_Opcode },
4526 { Bad_Opcode },
4527 { "extractps", { Edqd, XM, Ib }, PREFIX_OPCODE },
4528 },
4529
4530 /* PREFIX_0F3A20 */
4531 {
4532 { Bad_Opcode },
4533 { Bad_Opcode },
4534 { "pinsrb", { XM, Edqb, Ib }, PREFIX_OPCODE },
4535 },
4536
4537 /* PREFIX_0F3A21 */
4538 {
4539 { Bad_Opcode },
4540 { Bad_Opcode },
4541 { "insertps", { XM, EXd, Ib }, PREFIX_OPCODE },
4542 },
4543
4544 /* PREFIX_0F3A22 */
4545 {
4546 { Bad_Opcode },
4547 { Bad_Opcode },
4548 { "pinsrK", { XM, Edq, Ib }, PREFIX_OPCODE },
4549 },
4550
4551 /* PREFIX_0F3A40 */
4552 {
4553 { Bad_Opcode },
4554 { Bad_Opcode },
4555 { "dpps", { XM, EXx, Ib }, PREFIX_OPCODE },
4556 },
4557
4558 /* PREFIX_0F3A41 */
4559 {
4560 { Bad_Opcode },
4561 { Bad_Opcode },
4562 { "dppd", { XM, EXx, Ib }, PREFIX_OPCODE },
4563 },
4564
4565 /* PREFIX_0F3A42 */
4566 {
4567 { Bad_Opcode },
4568 { Bad_Opcode },
4569 { "mpsadbw", { XM, EXx, Ib }, PREFIX_OPCODE },
4570 },
4571
4572 /* PREFIX_0F3A44 */
4573 {
4574 { Bad_Opcode },
4575 { Bad_Opcode },
4576 { "pclmulqdq", { XM, EXx, PCLMUL }, PREFIX_OPCODE },
4577 },
4578
4579 /* PREFIX_0F3A60 */
4580 {
4581 { Bad_Opcode },
4582 { Bad_Opcode },
4583 { "pcmpestrm", { XM, { PCMPESTR_Fixup, x_mode }, Ib }, PREFIX_OPCODE },
4584 },
4585
4586 /* PREFIX_0F3A61 */
4587 {
4588 { Bad_Opcode },
4589 { Bad_Opcode },
4590 { "pcmpestri", { XM, { PCMPESTR_Fixup, x_mode }, Ib }, PREFIX_OPCODE },
4591 },
4592
4593 /* PREFIX_0F3A62 */
4594 {
4595 { Bad_Opcode },
4596 { Bad_Opcode },
4597 { "pcmpistrm", { XM, EXx, Ib }, PREFIX_OPCODE },
4598 },
4599
4600 /* PREFIX_0F3A63 */
4601 {
4602 { Bad_Opcode },
4603 { Bad_Opcode },
4604 { "pcmpistri", { XM, EXx, Ib }, PREFIX_OPCODE },
4605 },
4606
4607 /* PREFIX_0F3ACC */
4608 {
4609 { "sha1rnds4", { XM, EXxmm, Ib }, PREFIX_OPCODE },
4610 },
4611
4612 /* PREFIX_0F3ACE */
4613 {
4614 { Bad_Opcode },
4615 { Bad_Opcode },
4616 { "gf2p8affineqb", { XM, EXxmm, Ib }, PREFIX_OPCODE },
4617 },
4618
4619 /* PREFIX_0F3ACF */
4620 {
4621 { Bad_Opcode },
4622 { Bad_Opcode },
4623 { "gf2p8affineinvqb", { XM, EXxmm, Ib }, PREFIX_OPCODE },
4624 },
4625
4626 /* PREFIX_0F3ADF */
4627 {
4628 { Bad_Opcode },
4629 { Bad_Opcode },
4630 { "aeskeygenassist", { XM, EXx, Ib }, PREFIX_OPCODE },
4631 },
4632
4633 /* PREFIX_VEX_0F10 */
4634 {
4635 { "vmovups", { XM, EXx }, 0 },
4636 { "vmovss", { XMVexScalar, VexScalar, EXdScalar }, 0 },
4637 { "vmovupd", { XM, EXx }, 0 },
4638 { "vmovsd", { XMVexScalar, VexScalar, EXqScalar }, 0 },
4639 },
4640
4641 /* PREFIX_VEX_0F11 */
4642 {
4643 { "vmovups", { EXxS, XM }, 0 },
4644 { "vmovss", { EXdVexScalarS, VexScalar, XMScalar }, 0 },
4645 { "vmovupd", { EXxS, XM }, 0 },
4646 { "vmovsd", { EXqVexScalarS, VexScalar, XMScalar }, 0 },
4647 },
4648
4649 /* PREFIX_VEX_0F12 */
4650 {
4651 { MOD_TABLE (MOD_VEX_0F12_PREFIX_0) },
4652 { "vmovsldup", { XM, EXx }, 0 },
4653 { VEX_LEN_TABLE (VEX_LEN_0F12_P_2) },
4654 { "vmovddup", { XM, EXymmq }, 0 },
4655 },
4656
4657 /* PREFIX_VEX_0F16 */
4658 {
4659 { MOD_TABLE (MOD_VEX_0F16_PREFIX_0) },
4660 { "vmovshdup", { XM, EXx }, 0 },
4661 { VEX_LEN_TABLE (VEX_LEN_0F16_P_2) },
4662 },
4663
4664 /* PREFIX_VEX_0F2A */
4665 {
4666 { Bad_Opcode },
4667 { VEX_LEN_TABLE (VEX_LEN_0F2A_P_1) },
4668 { Bad_Opcode },
4669 { VEX_LEN_TABLE (VEX_LEN_0F2A_P_3) },
4670 },
4671
4672 /* PREFIX_VEX_0F2C */
4673 {
4674 { Bad_Opcode },
4675 { VEX_LEN_TABLE (VEX_LEN_0F2C_P_1) },
4676 { Bad_Opcode },
4677 { VEX_LEN_TABLE (VEX_LEN_0F2C_P_3) },
4678 },
4679
4680 /* PREFIX_VEX_0F2D */
4681 {
4682 { Bad_Opcode },
4683 { VEX_LEN_TABLE (VEX_LEN_0F2D_P_1) },
4684 { Bad_Opcode },
4685 { VEX_LEN_TABLE (VEX_LEN_0F2D_P_3) },
4686 },
4687
4688 /* PREFIX_VEX_0F2E */
4689 {
4690 { "vucomiss", { XMScalar, EXdScalar }, 0 },
4691 { Bad_Opcode },
4692 { "vucomisd", { XMScalar, EXqScalar }, 0 },
4693 },
4694
4695 /* PREFIX_VEX_0F2F */
4696 {
4697 { "vcomiss", { XMScalar, EXdScalar }, 0 },
4698 { Bad_Opcode },
4699 { "vcomisd", { XMScalar, EXqScalar }, 0 },
4700 },
4701
4702 /* PREFIX_VEX_0F41 */
4703 {
4704 { VEX_LEN_TABLE (VEX_LEN_0F41_P_0) },
4705 { Bad_Opcode },
4706 { VEX_LEN_TABLE (VEX_LEN_0F41_P_2) },
4707 },
4708
4709 /* PREFIX_VEX_0F42 */
4710 {
4711 { VEX_LEN_TABLE (VEX_LEN_0F42_P_0) },
4712 { Bad_Opcode },
4713 { VEX_LEN_TABLE (VEX_LEN_0F42_P_2) },
4714 },
4715
4716 /* PREFIX_VEX_0F44 */
4717 {
4718 { VEX_LEN_TABLE (VEX_LEN_0F44_P_0) },
4719 { Bad_Opcode },
4720 { VEX_LEN_TABLE (VEX_LEN_0F44_P_2) },
4721 },
4722
4723 /* PREFIX_VEX_0F45 */
4724 {
4725 { VEX_LEN_TABLE (VEX_LEN_0F45_P_0) },
4726 { Bad_Opcode },
4727 { VEX_LEN_TABLE (VEX_LEN_0F45_P_2) },
4728 },
4729
4730 /* PREFIX_VEX_0F46 */
4731 {
4732 { VEX_LEN_TABLE (VEX_LEN_0F46_P_0) },
4733 { Bad_Opcode },
4734 { VEX_LEN_TABLE (VEX_LEN_0F46_P_2) },
4735 },
4736
4737 /* PREFIX_VEX_0F47 */
4738 {
4739 { VEX_LEN_TABLE (VEX_LEN_0F47_P_0) },
4740 { Bad_Opcode },
4741 { VEX_LEN_TABLE (VEX_LEN_0F47_P_2) },
4742 },
4743
4744 /* PREFIX_VEX_0F4A */
4745 {
4746 { VEX_LEN_TABLE (VEX_LEN_0F4A_P_0) },
4747 { Bad_Opcode },
4748 { VEX_LEN_TABLE (VEX_LEN_0F4A_P_2) },
4749 },
4750
4751 /* PREFIX_VEX_0F4B */
4752 {
4753 { VEX_LEN_TABLE (VEX_LEN_0F4B_P_0) },
4754 { Bad_Opcode },
4755 { VEX_LEN_TABLE (VEX_LEN_0F4B_P_2) },
4756 },
4757
4758 /* PREFIX_VEX_0F51 */
4759 {
4760 { "vsqrtps", { XM, EXx }, 0 },
4761 { "vsqrtss", { XMScalar, VexScalar, EXdScalar }, 0 },
4762 { "vsqrtpd", { XM, EXx }, 0 },
4763 { "vsqrtsd", { XMScalar, VexScalar, EXqScalar }, 0 },
4764 },
4765
4766 /* PREFIX_VEX_0F52 */
4767 {
4768 { "vrsqrtps", { XM, EXx }, 0 },
4769 { "vrsqrtss", { XMScalar, VexScalar, EXdScalar }, 0 },
4770 },
4771
4772 /* PREFIX_VEX_0F53 */
4773 {
4774 { "vrcpps", { XM, EXx }, 0 },
4775 { "vrcpss", { XMScalar, VexScalar, EXdScalar }, 0 },
4776 },
4777
4778 /* PREFIX_VEX_0F58 */
4779 {
4780 { "vaddps", { XM, Vex, EXx }, 0 },
4781 { "vaddss", { XMScalar, VexScalar, EXdScalar }, 0 },
4782 { "vaddpd", { XM, Vex, EXx }, 0 },
4783 { "vaddsd", { XMScalar, VexScalar, EXqScalar }, 0 },
4784 },
4785
4786 /* PREFIX_VEX_0F59 */
4787 {
4788 { "vmulps", { XM, Vex, EXx }, 0 },
4789 { "vmulss", { XMScalar, VexScalar, EXdScalar }, 0 },
4790 { "vmulpd", { XM, Vex, EXx }, 0 },
4791 { "vmulsd", { XMScalar, VexScalar, EXqScalar }, 0 },
4792 },
4793
4794 /* PREFIX_VEX_0F5A */
4795 {
4796 { "vcvtps2pd", { XM, EXxmmq }, 0 },
4797 { "vcvtss2sd", { XMScalar, VexScalar, EXdScalar }, 0 },
4798 { "vcvtpd2ps%XY",{ XMM, EXx }, 0 },
4799 { "vcvtsd2ss", { XMScalar, VexScalar, EXqScalar }, 0 },
4800 },
4801
4802 /* PREFIX_VEX_0F5B */
4803 {
4804 { "vcvtdq2ps", { XM, EXx }, 0 },
4805 { "vcvttps2dq", { XM, EXx }, 0 },
4806 { "vcvtps2dq", { XM, EXx }, 0 },
4807 },
4808
4809 /* PREFIX_VEX_0F5C */
4810 {
4811 { "vsubps", { XM, Vex, EXx }, 0 },
4812 { "vsubss", { XMScalar, VexScalar, EXdScalar }, 0 },
4813 { "vsubpd", { XM, Vex, EXx }, 0 },
4814 { "vsubsd", { XMScalar, VexScalar, EXqScalar }, 0 },
4815 },
4816
4817 /* PREFIX_VEX_0F5D */
4818 {
4819 { "vminps", { XM, Vex, EXx }, 0 },
4820 { "vminss", { XMScalar, VexScalar, EXdScalar }, 0 },
4821 { "vminpd", { XM, Vex, EXx }, 0 },
4822 { "vminsd", { XMScalar, VexScalar, EXqScalar }, 0 },
4823 },
4824
4825 /* PREFIX_VEX_0F5E */
4826 {
4827 { "vdivps", { XM, Vex, EXx }, 0 },
4828 { "vdivss", { XMScalar, VexScalar, EXdScalar }, 0 },
4829 { "vdivpd", { XM, Vex, EXx }, 0 },
4830 { "vdivsd", { XMScalar, VexScalar, EXqScalar }, 0 },
4831 },
4832
4833 /* PREFIX_VEX_0F5F */
4834 {
4835 { "vmaxps", { XM, Vex, EXx }, 0 },
4836 { "vmaxss", { XMScalar, VexScalar, EXdScalar }, 0 },
4837 { "vmaxpd", { XM, Vex, EXx }, 0 },
4838 { "vmaxsd", { XMScalar, VexScalar, EXqScalar }, 0 },
4839 },
4840
4841 /* PREFIX_VEX_0F60 */
4842 {
4843 { Bad_Opcode },
4844 { Bad_Opcode },
4845 { "vpunpcklbw", { XM, Vex, EXx }, 0 },
4846 },
4847
4848 /* PREFIX_VEX_0F61 */
4849 {
4850 { Bad_Opcode },
4851 { Bad_Opcode },
4852 { "vpunpcklwd", { XM, Vex, EXx }, 0 },
4853 },
4854
4855 /* PREFIX_VEX_0F62 */
4856 {
4857 { Bad_Opcode },
4858 { Bad_Opcode },
4859 { "vpunpckldq", { XM, Vex, EXx }, 0 },
4860 },
4861
4862 /* PREFIX_VEX_0F63 */
4863 {
4864 { Bad_Opcode },
4865 { Bad_Opcode },
4866 { "vpacksswb", { XM, Vex, EXx }, 0 },
4867 },
4868
4869 /* PREFIX_VEX_0F64 */
4870 {
4871 { Bad_Opcode },
4872 { Bad_Opcode },
4873 { "vpcmpgtb", { XM, Vex, EXx }, 0 },
4874 },
4875
4876 /* PREFIX_VEX_0F65 */
4877 {
4878 { Bad_Opcode },
4879 { Bad_Opcode },
4880 { "vpcmpgtw", { XM, Vex, EXx }, 0 },
4881 },
4882
4883 /* PREFIX_VEX_0F66 */
4884 {
4885 { Bad_Opcode },
4886 { Bad_Opcode },
4887 { "vpcmpgtd", { XM, Vex, EXx }, 0 },
4888 },
4889
4890 /* PREFIX_VEX_0F67 */
4891 {
4892 { Bad_Opcode },
4893 { Bad_Opcode },
4894 { "vpackuswb", { XM, Vex, EXx }, 0 },
4895 },
4896
4897 /* PREFIX_VEX_0F68 */
4898 {
4899 { Bad_Opcode },
4900 { Bad_Opcode },
4901 { "vpunpckhbw", { XM, Vex, EXx }, 0 },
4902 },
4903
4904 /* PREFIX_VEX_0F69 */
4905 {
4906 { Bad_Opcode },
4907 { Bad_Opcode },
4908 { "vpunpckhwd", { XM, Vex, EXx }, 0 },
4909 },
4910
4911 /* PREFIX_VEX_0F6A */
4912 {
4913 { Bad_Opcode },
4914 { Bad_Opcode },
4915 { "vpunpckhdq", { XM, Vex, EXx }, 0 },
4916 },
4917
4918 /* PREFIX_VEX_0F6B */
4919 {
4920 { Bad_Opcode },
4921 { Bad_Opcode },
4922 { "vpackssdw", { XM, Vex, EXx }, 0 },
4923 },
4924
4925 /* PREFIX_VEX_0F6C */
4926 {
4927 { Bad_Opcode },
4928 { Bad_Opcode },
4929 { "vpunpcklqdq", { XM, Vex, EXx }, 0 },
4930 },
4931
4932 /* PREFIX_VEX_0F6D */
4933 {
4934 { Bad_Opcode },
4935 { Bad_Opcode },
4936 { "vpunpckhqdq", { XM, Vex, EXx }, 0 },
4937 },
4938
4939 /* PREFIX_VEX_0F6E */
4940 {
4941 { Bad_Opcode },
4942 { Bad_Opcode },
4943 { VEX_LEN_TABLE (VEX_LEN_0F6E_P_2) },
4944 },
4945
4946 /* PREFIX_VEX_0F6F */
4947 {
4948 { Bad_Opcode },
4949 { "vmovdqu", { XM, EXx }, 0 },
4950 { "vmovdqa", { XM, EXx }, 0 },
4951 },
4952
4953 /* PREFIX_VEX_0F70 */
4954 {
4955 { Bad_Opcode },
4956 { "vpshufhw", { XM, EXx, Ib }, 0 },
4957 { "vpshufd", { XM, EXx, Ib }, 0 },
4958 { "vpshuflw", { XM, EXx, Ib }, 0 },
4959 },
4960
4961 /* PREFIX_VEX_0F71_REG_2 */
4962 {
4963 { Bad_Opcode },
4964 { Bad_Opcode },
4965 { "vpsrlw", { Vex, XS, Ib }, 0 },
4966 },
4967
4968 /* PREFIX_VEX_0F71_REG_4 */
4969 {
4970 { Bad_Opcode },
4971 { Bad_Opcode },
4972 { "vpsraw", { Vex, XS, Ib }, 0 },
4973 },
4974
4975 /* PREFIX_VEX_0F71_REG_6 */
4976 {
4977 { Bad_Opcode },
4978 { Bad_Opcode },
4979 { "vpsllw", { Vex, XS, Ib }, 0 },
4980 },
4981
4982 /* PREFIX_VEX_0F72_REG_2 */
4983 {
4984 { Bad_Opcode },
4985 { Bad_Opcode },
4986 { "vpsrld", { Vex, XS, Ib }, 0 },
4987 },
4988
4989 /* PREFIX_VEX_0F72_REG_4 */
4990 {
4991 { Bad_Opcode },
4992 { Bad_Opcode },
4993 { "vpsrad", { Vex, XS, Ib }, 0 },
4994 },
4995
4996 /* PREFIX_VEX_0F72_REG_6 */
4997 {
4998 { Bad_Opcode },
4999 { Bad_Opcode },
5000 { "vpslld", { Vex, XS, Ib }, 0 },
5001 },
5002
5003 /* PREFIX_VEX_0F73_REG_2 */
5004 {
5005 { Bad_Opcode },
5006 { Bad_Opcode },
5007 { "vpsrlq", { Vex, XS, Ib }, 0 },
5008 },
5009
5010 /* PREFIX_VEX_0F73_REG_3 */
5011 {
5012 { Bad_Opcode },
5013 { Bad_Opcode },
5014 { "vpsrldq", { Vex, XS, Ib }, 0 },
5015 },
5016
5017 /* PREFIX_VEX_0F73_REG_6 */
5018 {
5019 { Bad_Opcode },
5020 { Bad_Opcode },
5021 { "vpsllq", { Vex, XS, Ib }, 0 },
5022 },
5023
5024 /* PREFIX_VEX_0F73_REG_7 */
5025 {
5026 { Bad_Opcode },
5027 { Bad_Opcode },
5028 { "vpslldq", { Vex, XS, Ib }, 0 },
5029 },
5030
5031 /* PREFIX_VEX_0F74 */
5032 {
5033 { Bad_Opcode },
5034 { Bad_Opcode },
5035 { "vpcmpeqb", { XM, Vex, EXx }, 0 },
5036 },
5037
5038 /* PREFIX_VEX_0F75 */
5039 {
5040 { Bad_Opcode },
5041 { Bad_Opcode },
5042 { "vpcmpeqw", { XM, Vex, EXx }, 0 },
5043 },
5044
5045 /* PREFIX_VEX_0F76 */
5046 {
5047 { Bad_Opcode },
5048 { Bad_Opcode },
5049 { "vpcmpeqd", { XM, Vex, EXx }, 0 },
5050 },
5051
5052 /* PREFIX_VEX_0F77 */
5053 {
5054 { VEX_LEN_TABLE (VEX_LEN_0F77_P_0) },
5055 },
5056
5057 /* PREFIX_VEX_0F7C */
5058 {
5059 { Bad_Opcode },
5060 { Bad_Opcode },
5061 { "vhaddpd", { XM, Vex, EXx }, 0 },
5062 { "vhaddps", { XM, Vex, EXx }, 0 },
5063 },
5064
5065 /* PREFIX_VEX_0F7D */
5066 {
5067 { Bad_Opcode },
5068 { Bad_Opcode },
5069 { "vhsubpd", { XM, Vex, EXx }, 0 },
5070 { "vhsubps", { XM, Vex, EXx }, 0 },
5071 },
5072
5073 /* PREFIX_VEX_0F7E */
5074 {
5075 { Bad_Opcode },
5076 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_1) },
5077 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_2) },
5078 },
5079
5080 /* PREFIX_VEX_0F7F */
5081 {
5082 { Bad_Opcode },
5083 { "vmovdqu", { EXxS, XM }, 0 },
5084 { "vmovdqa", { EXxS, XM }, 0 },
5085 },
5086
5087 /* PREFIX_VEX_0F90 */
5088 {
5089 { VEX_LEN_TABLE (VEX_LEN_0F90_P_0) },
5090 { Bad_Opcode },
5091 { VEX_LEN_TABLE (VEX_LEN_0F90_P_2) },
5092 },
5093
5094 /* PREFIX_VEX_0F91 */
5095 {
5096 { VEX_LEN_TABLE (VEX_LEN_0F91_P_0) },
5097 { Bad_Opcode },
5098 { VEX_LEN_TABLE (VEX_LEN_0F91_P_2) },
5099 },
5100
5101 /* PREFIX_VEX_0F92 */
5102 {
5103 { VEX_LEN_TABLE (VEX_LEN_0F92_P_0) },
5104 { Bad_Opcode },
5105 { VEX_LEN_TABLE (VEX_LEN_0F92_P_2) },
5106 { VEX_LEN_TABLE (VEX_LEN_0F92_P_3) },
5107 },
5108
5109 /* PREFIX_VEX_0F93 */
5110 {
5111 { VEX_LEN_TABLE (VEX_LEN_0F93_P_0) },
5112 { Bad_Opcode },
5113 { VEX_LEN_TABLE (VEX_LEN_0F93_P_2) },
5114 { VEX_LEN_TABLE (VEX_LEN_0F93_P_3) },
5115 },
5116
5117 /* PREFIX_VEX_0F98 */
5118 {
5119 { VEX_LEN_TABLE (VEX_LEN_0F98_P_0) },
5120 { Bad_Opcode },
5121 { VEX_LEN_TABLE (VEX_LEN_0F98_P_2) },
5122 },
5123
5124 /* PREFIX_VEX_0F99 */
5125 {
5126 { VEX_LEN_TABLE (VEX_LEN_0F99_P_0) },
5127 { Bad_Opcode },
5128 { VEX_LEN_TABLE (VEX_LEN_0F99_P_2) },
5129 },
5130
5131 /* PREFIX_VEX_0FC2 */
5132 {
5133 { "vcmpps", { XM, Vex, EXx, VCMP }, 0 },
5134 { "vcmpss", { XMScalar, VexScalar, EXdScalar, VCMP }, 0 },
5135 { "vcmppd", { XM, Vex, EXx, VCMP }, 0 },
5136 { "vcmpsd", { XMScalar, VexScalar, EXqScalar, VCMP }, 0 },
5137 },
5138
5139 /* PREFIX_VEX_0FC4 */
5140 {
5141 { Bad_Opcode },
5142 { Bad_Opcode },
5143 { VEX_LEN_TABLE (VEX_LEN_0FC4_P_2) },
5144 },
5145
5146 /* PREFIX_VEX_0FC5 */
5147 {
5148 { Bad_Opcode },
5149 { Bad_Opcode },
5150 { VEX_LEN_TABLE (VEX_LEN_0FC5_P_2) },
5151 },
5152
5153 /* PREFIX_VEX_0FD0 */
5154 {
5155 { Bad_Opcode },
5156 { Bad_Opcode },
5157 { "vaddsubpd", { XM, Vex, EXx }, 0 },
5158 { "vaddsubps", { XM, Vex, EXx }, 0 },
5159 },
5160
5161 /* PREFIX_VEX_0FD1 */
5162 {
5163 { Bad_Opcode },
5164 { Bad_Opcode },
5165 { "vpsrlw", { XM, Vex, EXxmm }, 0 },
5166 },
5167
5168 /* PREFIX_VEX_0FD2 */
5169 {
5170 { Bad_Opcode },
5171 { Bad_Opcode },
5172 { "vpsrld", { XM, Vex, EXxmm }, 0 },
5173 },
5174
5175 /* PREFIX_VEX_0FD3 */
5176 {
5177 { Bad_Opcode },
5178 { Bad_Opcode },
5179 { "vpsrlq", { XM, Vex, EXxmm }, 0 },
5180 },
5181
5182 /* PREFIX_VEX_0FD4 */
5183 {
5184 { Bad_Opcode },
5185 { Bad_Opcode },
5186 { "vpaddq", { XM, Vex, EXx }, 0 },
5187 },
5188
5189 /* PREFIX_VEX_0FD5 */
5190 {
5191 { Bad_Opcode },
5192 { Bad_Opcode },
5193 { "vpmullw", { XM, Vex, EXx }, 0 },
5194 },
5195
5196 /* PREFIX_VEX_0FD6 */
5197 {
5198 { Bad_Opcode },
5199 { Bad_Opcode },
5200 { VEX_LEN_TABLE (VEX_LEN_0FD6_P_2) },
5201 },
5202
5203 /* PREFIX_VEX_0FD7 */
5204 {
5205 { Bad_Opcode },
5206 { Bad_Opcode },
5207 { MOD_TABLE (MOD_VEX_0FD7_PREFIX_2) },
5208 },
5209
5210 /* PREFIX_VEX_0FD8 */
5211 {
5212 { Bad_Opcode },
5213 { Bad_Opcode },
5214 { "vpsubusb", { XM, Vex, EXx }, 0 },
5215 },
5216
5217 /* PREFIX_VEX_0FD9 */
5218 {
5219 { Bad_Opcode },
5220 { Bad_Opcode },
5221 { "vpsubusw", { XM, Vex, EXx }, 0 },
5222 },
5223
5224 /* PREFIX_VEX_0FDA */
5225 {
5226 { Bad_Opcode },
5227 { Bad_Opcode },
5228 { "vpminub", { XM, Vex, EXx }, 0 },
5229 },
5230
5231 /* PREFIX_VEX_0FDB */
5232 {
5233 { Bad_Opcode },
5234 { Bad_Opcode },
5235 { "vpand", { XM, Vex, EXx }, 0 },
5236 },
5237
5238 /* PREFIX_VEX_0FDC */
5239 {
5240 { Bad_Opcode },
5241 { Bad_Opcode },
5242 { "vpaddusb", { XM, Vex, EXx }, 0 },
5243 },
5244
5245 /* PREFIX_VEX_0FDD */
5246 {
5247 { Bad_Opcode },
5248 { Bad_Opcode },
5249 { "vpaddusw", { XM, Vex, EXx }, 0 },
5250 },
5251
5252 /* PREFIX_VEX_0FDE */
5253 {
5254 { Bad_Opcode },
5255 { Bad_Opcode },
5256 { "vpmaxub", { XM, Vex, EXx }, 0 },
5257 },
5258
5259 /* PREFIX_VEX_0FDF */
5260 {
5261 { Bad_Opcode },
5262 { Bad_Opcode },
5263 { "vpandn", { XM, Vex, EXx }, 0 },
5264 },
5265
5266 /* PREFIX_VEX_0FE0 */
5267 {
5268 { Bad_Opcode },
5269 { Bad_Opcode },
5270 { "vpavgb", { XM, Vex, EXx }, 0 },
5271 },
5272
5273 /* PREFIX_VEX_0FE1 */
5274 {
5275 { Bad_Opcode },
5276 { Bad_Opcode },
5277 { "vpsraw", { XM, Vex, EXxmm }, 0 },
5278 },
5279
5280 /* PREFIX_VEX_0FE2 */
5281 {
5282 { Bad_Opcode },
5283 { Bad_Opcode },
5284 { "vpsrad", { XM, Vex, EXxmm }, 0 },
5285 },
5286
5287 /* PREFIX_VEX_0FE3 */
5288 {
5289 { Bad_Opcode },
5290 { Bad_Opcode },
5291 { "vpavgw", { XM, Vex, EXx }, 0 },
5292 },
5293
5294 /* PREFIX_VEX_0FE4 */
5295 {
5296 { Bad_Opcode },
5297 { Bad_Opcode },
5298 { "vpmulhuw", { XM, Vex, EXx }, 0 },
5299 },
5300
5301 /* PREFIX_VEX_0FE5 */
5302 {
5303 { Bad_Opcode },
5304 { Bad_Opcode },
5305 { "vpmulhw", { XM, Vex, EXx }, 0 },
5306 },
5307
5308 /* PREFIX_VEX_0FE6 */
5309 {
5310 { Bad_Opcode },
5311 { "vcvtdq2pd", { XM, EXxmmq }, 0 },
5312 { "vcvttpd2dq%XY", { XMM, EXx }, 0 },
5313 { "vcvtpd2dq%XY", { XMM, EXx }, 0 },
5314 },
5315
5316 /* PREFIX_VEX_0FE7 */
5317 {
5318 { Bad_Opcode },
5319 { Bad_Opcode },
5320 { MOD_TABLE (MOD_VEX_0FE7_PREFIX_2) },
5321 },
5322
5323 /* PREFIX_VEX_0FE8 */
5324 {
5325 { Bad_Opcode },
5326 { Bad_Opcode },
5327 { "vpsubsb", { XM, Vex, EXx }, 0 },
5328 },
5329
5330 /* PREFIX_VEX_0FE9 */
5331 {
5332 { Bad_Opcode },
5333 { Bad_Opcode },
5334 { "vpsubsw", { XM, Vex, EXx }, 0 },
5335 },
5336
5337 /* PREFIX_VEX_0FEA */
5338 {
5339 { Bad_Opcode },
5340 { Bad_Opcode },
5341 { "vpminsw", { XM, Vex, EXx }, 0 },
5342 },
5343
5344 /* PREFIX_VEX_0FEB */
5345 {
5346 { Bad_Opcode },
5347 { Bad_Opcode },
5348 { "vpor", { XM, Vex, EXx }, 0 },
5349 },
5350
5351 /* PREFIX_VEX_0FEC */
5352 {
5353 { Bad_Opcode },
5354 { Bad_Opcode },
5355 { "vpaddsb", { XM, Vex, EXx }, 0 },
5356 },
5357
5358 /* PREFIX_VEX_0FED */
5359 {
5360 { Bad_Opcode },
5361 { Bad_Opcode },
5362 { "vpaddsw", { XM, Vex, EXx }, 0 },
5363 },
5364
5365 /* PREFIX_VEX_0FEE */
5366 {
5367 { Bad_Opcode },
5368 { Bad_Opcode },
5369 { "vpmaxsw", { XM, Vex, EXx }, 0 },
5370 },
5371
5372 /* PREFIX_VEX_0FEF */
5373 {
5374 { Bad_Opcode },
5375 { Bad_Opcode },
5376 { "vpxor", { XM, Vex, EXx }, 0 },
5377 },
5378
5379 /* PREFIX_VEX_0FF0 */
5380 {
5381 { Bad_Opcode },
5382 { Bad_Opcode },
5383 { Bad_Opcode },
5384 { MOD_TABLE (MOD_VEX_0FF0_PREFIX_3) },
5385 },
5386
5387 /* PREFIX_VEX_0FF1 */
5388 {
5389 { Bad_Opcode },
5390 { Bad_Opcode },
5391 { "vpsllw", { XM, Vex, EXxmm }, 0 },
5392 },
5393
5394 /* PREFIX_VEX_0FF2 */
5395 {
5396 { Bad_Opcode },
5397 { Bad_Opcode },
5398 { "vpslld", { XM, Vex, EXxmm }, 0 },
5399 },
5400
5401 /* PREFIX_VEX_0FF3 */
5402 {
5403 { Bad_Opcode },
5404 { Bad_Opcode },
5405 { "vpsllq", { XM, Vex, EXxmm }, 0 },
5406 },
5407
5408 /* PREFIX_VEX_0FF4 */
5409 {
5410 { Bad_Opcode },
5411 { Bad_Opcode },
5412 { "vpmuludq", { XM, Vex, EXx }, 0 },
5413 },
5414
5415 /* PREFIX_VEX_0FF5 */
5416 {
5417 { Bad_Opcode },
5418 { Bad_Opcode },
5419 { "vpmaddwd", { XM, Vex, EXx }, 0 },
5420 },
5421
5422 /* PREFIX_VEX_0FF6 */
5423 {
5424 { Bad_Opcode },
5425 { Bad_Opcode },
5426 { "vpsadbw", { XM, Vex, EXx }, 0 },
5427 },
5428
5429 /* PREFIX_VEX_0FF7 */
5430 {
5431 { Bad_Opcode },
5432 { Bad_Opcode },
5433 { VEX_LEN_TABLE (VEX_LEN_0FF7_P_2) },
5434 },
5435
5436 /* PREFIX_VEX_0FF8 */
5437 {
5438 { Bad_Opcode },
5439 { Bad_Opcode },
5440 { "vpsubb", { XM, Vex, EXx }, 0 },
5441 },
5442
5443 /* PREFIX_VEX_0FF9 */
5444 {
5445 { Bad_Opcode },
5446 { Bad_Opcode },
5447 { "vpsubw", { XM, Vex, EXx }, 0 },
5448 },
5449
5450 /* PREFIX_VEX_0FFA */
5451 {
5452 { Bad_Opcode },
5453 { Bad_Opcode },
5454 { "vpsubd", { XM, Vex, EXx }, 0 },
5455 },
5456
5457 /* PREFIX_VEX_0FFB */
5458 {
5459 { Bad_Opcode },
5460 { Bad_Opcode },
5461 { "vpsubq", { XM, Vex, EXx }, 0 },
5462 },
5463
5464 /* PREFIX_VEX_0FFC */
5465 {
5466 { Bad_Opcode },
5467 { Bad_Opcode },
5468 { "vpaddb", { XM, Vex, EXx }, 0 },
5469 },
5470
5471 /* PREFIX_VEX_0FFD */
5472 {
5473 { Bad_Opcode },
5474 { Bad_Opcode },
5475 { "vpaddw", { XM, Vex, EXx }, 0 },
5476 },
5477
5478 /* PREFIX_VEX_0FFE */
5479 {
5480 { Bad_Opcode },
5481 { Bad_Opcode },
5482 { "vpaddd", { XM, Vex, EXx }, 0 },
5483 },
5484
5485 /* PREFIX_VEX_0F3800 */
5486 {
5487 { Bad_Opcode },
5488 { Bad_Opcode },
5489 { "vpshufb", { XM, Vex, EXx }, 0 },
5490 },
5491
5492 /* PREFIX_VEX_0F3801 */
5493 {
5494 { Bad_Opcode },
5495 { Bad_Opcode },
5496 { "vphaddw", { XM, Vex, EXx }, 0 },
5497 },
5498
5499 /* PREFIX_VEX_0F3802 */
5500 {
5501 { Bad_Opcode },
5502 { Bad_Opcode },
5503 { "vphaddd", { XM, Vex, EXx }, 0 },
5504 },
5505
5506 /* PREFIX_VEX_0F3803 */
5507 {
5508 { Bad_Opcode },
5509 { Bad_Opcode },
5510 { "vphaddsw", { XM, Vex, EXx }, 0 },
5511 },
5512
5513 /* PREFIX_VEX_0F3804 */
5514 {
5515 { Bad_Opcode },
5516 { Bad_Opcode },
5517 { "vpmaddubsw", { XM, Vex, EXx }, 0 },
5518 },
5519
5520 /* PREFIX_VEX_0F3805 */
5521 {
5522 { Bad_Opcode },
5523 { Bad_Opcode },
5524 { "vphsubw", { XM, Vex, EXx }, 0 },
5525 },
5526
5527 /* PREFIX_VEX_0F3806 */
5528 {
5529 { Bad_Opcode },
5530 { Bad_Opcode },
5531 { "vphsubd", { XM, Vex, EXx }, 0 },
5532 },
5533
5534 /* PREFIX_VEX_0F3807 */
5535 {
5536 { Bad_Opcode },
5537 { Bad_Opcode },
5538 { "vphsubsw", { XM, Vex, EXx }, 0 },
5539 },
5540
5541 /* PREFIX_VEX_0F3808 */
5542 {
5543 { Bad_Opcode },
5544 { Bad_Opcode },
5545 { "vpsignb", { XM, Vex, EXx }, 0 },
5546 },
5547
5548 /* PREFIX_VEX_0F3809 */
5549 {
5550 { Bad_Opcode },
5551 { Bad_Opcode },
5552 { "vpsignw", { XM, Vex, EXx }, 0 },
5553 },
5554
5555 /* PREFIX_VEX_0F380A */
5556 {
5557 { Bad_Opcode },
5558 { Bad_Opcode },
5559 { "vpsignd", { XM, Vex, EXx }, 0 },
5560 },
5561
5562 /* PREFIX_VEX_0F380B */
5563 {
5564 { Bad_Opcode },
5565 { Bad_Opcode },
5566 { "vpmulhrsw", { XM, Vex, EXx }, 0 },
5567 },
5568
5569 /* PREFIX_VEX_0F380C */
5570 {
5571 { Bad_Opcode },
5572 { Bad_Opcode },
5573 { VEX_W_TABLE (VEX_W_0F380C_P_2) },
5574 },
5575
5576 /* PREFIX_VEX_0F380D */
5577 {
5578 { Bad_Opcode },
5579 { Bad_Opcode },
5580 { VEX_W_TABLE (VEX_W_0F380D_P_2) },
5581 },
5582
5583 /* PREFIX_VEX_0F380E */
5584 {
5585 { Bad_Opcode },
5586 { Bad_Opcode },
5587 { VEX_W_TABLE (VEX_W_0F380E_P_2) },
5588 },
5589
5590 /* PREFIX_VEX_0F380F */
5591 {
5592 { Bad_Opcode },
5593 { Bad_Opcode },
5594 { VEX_W_TABLE (VEX_W_0F380F_P_2) },
5595 },
5596
5597 /* PREFIX_VEX_0F3813 */
5598 {
5599 { Bad_Opcode },
5600 { Bad_Opcode },
5601 { "vcvtph2ps", { XM, EXxmmq }, 0 },
5602 },
5603
5604 /* PREFIX_VEX_0F3816 */
5605 {
5606 { Bad_Opcode },
5607 { Bad_Opcode },
5608 { VEX_LEN_TABLE (VEX_LEN_0F3816_P_2) },
5609 },
5610
5611 /* PREFIX_VEX_0F3817 */
5612 {
5613 { Bad_Opcode },
5614 { Bad_Opcode },
5615 { "vptest", { XM, EXx }, 0 },
5616 },
5617
5618 /* PREFIX_VEX_0F3818 */
5619 {
5620 { Bad_Opcode },
5621 { Bad_Opcode },
5622 { VEX_W_TABLE (VEX_W_0F3818_P_2) },
5623 },
5624
5625 /* PREFIX_VEX_0F3819 */
5626 {
5627 { Bad_Opcode },
5628 { Bad_Opcode },
5629 { VEX_LEN_TABLE (VEX_LEN_0F3819_P_2) },
5630 },
5631
5632 /* PREFIX_VEX_0F381A */
5633 {
5634 { Bad_Opcode },
5635 { Bad_Opcode },
5636 { MOD_TABLE (MOD_VEX_0F381A_PREFIX_2) },
5637 },
5638
5639 /* PREFIX_VEX_0F381C */
5640 {
5641 { Bad_Opcode },
5642 { Bad_Opcode },
5643 { "vpabsb", { XM, EXx }, 0 },
5644 },
5645
5646 /* PREFIX_VEX_0F381D */
5647 {
5648 { Bad_Opcode },
5649 { Bad_Opcode },
5650 { "vpabsw", { XM, EXx }, 0 },
5651 },
5652
5653 /* PREFIX_VEX_0F381E */
5654 {
5655 { Bad_Opcode },
5656 { Bad_Opcode },
5657 { "vpabsd", { XM, EXx }, 0 },
5658 },
5659
5660 /* PREFIX_VEX_0F3820 */
5661 {
5662 { Bad_Opcode },
5663 { Bad_Opcode },
5664 { "vpmovsxbw", { XM, EXxmmq }, 0 },
5665 },
5666
5667 /* PREFIX_VEX_0F3821 */
5668 {
5669 { Bad_Opcode },
5670 { Bad_Opcode },
5671 { "vpmovsxbd", { XM, EXxmmqd }, 0 },
5672 },
5673
5674 /* PREFIX_VEX_0F3822 */
5675 {
5676 { Bad_Opcode },
5677 { Bad_Opcode },
5678 { "vpmovsxbq", { XM, EXxmmdw }, 0 },
5679 },
5680
5681 /* PREFIX_VEX_0F3823 */
5682 {
5683 { Bad_Opcode },
5684 { Bad_Opcode },
5685 { "vpmovsxwd", { XM, EXxmmq }, 0 },
5686 },
5687
5688 /* PREFIX_VEX_0F3824 */
5689 {
5690 { Bad_Opcode },
5691 { Bad_Opcode },
5692 { "vpmovsxwq", { XM, EXxmmqd }, 0 },
5693 },
5694
5695 /* PREFIX_VEX_0F3825 */
5696 {
5697 { Bad_Opcode },
5698 { Bad_Opcode },
5699 { "vpmovsxdq", { XM, EXxmmq }, 0 },
5700 },
5701
5702 /* PREFIX_VEX_0F3828 */
5703 {
5704 { Bad_Opcode },
5705 { Bad_Opcode },
5706 { "vpmuldq", { XM, Vex, EXx }, 0 },
5707 },
5708
5709 /* PREFIX_VEX_0F3829 */
5710 {
5711 { Bad_Opcode },
5712 { Bad_Opcode },
5713 { "vpcmpeqq", { XM, Vex, EXx }, 0 },
5714 },
5715
5716 /* PREFIX_VEX_0F382A */
5717 {
5718 { Bad_Opcode },
5719 { Bad_Opcode },
5720 { MOD_TABLE (MOD_VEX_0F382A_PREFIX_2) },
5721 },
5722
5723 /* PREFIX_VEX_0F382B */
5724 {
5725 { Bad_Opcode },
5726 { Bad_Opcode },
5727 { "vpackusdw", { XM, Vex, EXx }, 0 },
5728 },
5729
5730 /* PREFIX_VEX_0F382C */
5731 {
5732 { Bad_Opcode },
5733 { Bad_Opcode },
5734 { MOD_TABLE (MOD_VEX_0F382C_PREFIX_2) },
5735 },
5736
5737 /* PREFIX_VEX_0F382D */
5738 {
5739 { Bad_Opcode },
5740 { Bad_Opcode },
5741 { MOD_TABLE (MOD_VEX_0F382D_PREFIX_2) },
5742 },
5743
5744 /* PREFIX_VEX_0F382E */
5745 {
5746 { Bad_Opcode },
5747 { Bad_Opcode },
5748 { MOD_TABLE (MOD_VEX_0F382E_PREFIX_2) },
5749 },
5750
5751 /* PREFIX_VEX_0F382F */
5752 {
5753 { Bad_Opcode },
5754 { Bad_Opcode },
5755 { MOD_TABLE (MOD_VEX_0F382F_PREFIX_2) },
5756 },
5757
5758 /* PREFIX_VEX_0F3830 */
5759 {
5760 { Bad_Opcode },
5761 { Bad_Opcode },
5762 { "vpmovzxbw", { XM, EXxmmq }, 0 },
5763 },
5764
5765 /* PREFIX_VEX_0F3831 */
5766 {
5767 { Bad_Opcode },
5768 { Bad_Opcode },
5769 { "vpmovzxbd", { XM, EXxmmqd }, 0 },
5770 },
5771
5772 /* PREFIX_VEX_0F3832 */
5773 {
5774 { Bad_Opcode },
5775 { Bad_Opcode },
5776 { "vpmovzxbq", { XM, EXxmmdw }, 0 },
5777 },
5778
5779 /* PREFIX_VEX_0F3833 */
5780 {
5781 { Bad_Opcode },
5782 { Bad_Opcode },
5783 { "vpmovzxwd", { XM, EXxmmq }, 0 },
5784 },
5785
5786 /* PREFIX_VEX_0F3834 */
5787 {
5788 { Bad_Opcode },
5789 { Bad_Opcode },
5790 { "vpmovzxwq", { XM, EXxmmqd }, 0 },
5791 },
5792
5793 /* PREFIX_VEX_0F3835 */
5794 {
5795 { Bad_Opcode },
5796 { Bad_Opcode },
5797 { "vpmovzxdq", { XM, EXxmmq }, 0 },
5798 },
5799
5800 /* PREFIX_VEX_0F3836 */
5801 {
5802 { Bad_Opcode },
5803 { Bad_Opcode },
5804 { VEX_LEN_TABLE (VEX_LEN_0F3836_P_2) },
5805 },
5806
5807 /* PREFIX_VEX_0F3837 */
5808 {
5809 { Bad_Opcode },
5810 { Bad_Opcode },
5811 { "vpcmpgtq", { XM, Vex, EXx }, 0 },
5812 },
5813
5814 /* PREFIX_VEX_0F3838 */
5815 {
5816 { Bad_Opcode },
5817 { Bad_Opcode },
5818 { "vpminsb", { XM, Vex, EXx }, 0 },
5819 },
5820
5821 /* PREFIX_VEX_0F3839 */
5822 {
5823 { Bad_Opcode },
5824 { Bad_Opcode },
5825 { "vpminsd", { XM, Vex, EXx }, 0 },
5826 },
5827
5828 /* PREFIX_VEX_0F383A */
5829 {
5830 { Bad_Opcode },
5831 { Bad_Opcode },
5832 { "vpminuw", { XM, Vex, EXx }, 0 },
5833 },
5834
5835 /* PREFIX_VEX_0F383B */
5836 {
5837 { Bad_Opcode },
5838 { Bad_Opcode },
5839 { "vpminud", { XM, Vex, EXx }, 0 },
5840 },
5841
5842 /* PREFIX_VEX_0F383C */
5843 {
5844 { Bad_Opcode },
5845 { Bad_Opcode },
5846 { "vpmaxsb", { XM, Vex, EXx }, 0 },
5847 },
5848
5849 /* PREFIX_VEX_0F383D */
5850 {
5851 { Bad_Opcode },
5852 { Bad_Opcode },
5853 { "vpmaxsd", { XM, Vex, EXx }, 0 },
5854 },
5855
5856 /* PREFIX_VEX_0F383E */
5857 {
5858 { Bad_Opcode },
5859 { Bad_Opcode },
5860 { "vpmaxuw", { XM, Vex, EXx }, 0 },
5861 },
5862
5863 /* PREFIX_VEX_0F383F */
5864 {
5865 { Bad_Opcode },
5866 { Bad_Opcode },
5867 { "vpmaxud", { XM, Vex, EXx }, 0 },
5868 },
5869
5870 /* PREFIX_VEX_0F3840 */
5871 {
5872 { Bad_Opcode },
5873 { Bad_Opcode },
5874 { "vpmulld", { XM, Vex, EXx }, 0 },
5875 },
5876
5877 /* PREFIX_VEX_0F3841 */
5878 {
5879 { Bad_Opcode },
5880 { Bad_Opcode },
5881 { VEX_LEN_TABLE (VEX_LEN_0F3841_P_2) },
5882 },
5883
5884 /* PREFIX_VEX_0F3845 */
5885 {
5886 { Bad_Opcode },
5887 { Bad_Opcode },
5888 { "vpsrlv%LW", { XM, Vex, EXx }, 0 },
5889 },
5890
5891 /* PREFIX_VEX_0F3846 */
5892 {
5893 { Bad_Opcode },
5894 { Bad_Opcode },
5895 { VEX_W_TABLE (VEX_W_0F3846_P_2) },
5896 },
5897
5898 /* PREFIX_VEX_0F3847 */
5899 {
5900 { Bad_Opcode },
5901 { Bad_Opcode },
5902 { "vpsllv%LW", { XM, Vex, EXx }, 0 },
5903 },
5904
5905 /* PREFIX_VEX_0F3858 */
5906 {
5907 { Bad_Opcode },
5908 { Bad_Opcode },
5909 { VEX_W_TABLE (VEX_W_0F3858_P_2) },
5910 },
5911
5912 /* PREFIX_VEX_0F3859 */
5913 {
5914 { Bad_Opcode },
5915 { Bad_Opcode },
5916 { VEX_W_TABLE (VEX_W_0F3859_P_2) },
5917 },
5918
5919 /* PREFIX_VEX_0F385A */
5920 {
5921 { Bad_Opcode },
5922 { Bad_Opcode },
5923 { MOD_TABLE (MOD_VEX_0F385A_PREFIX_2) },
5924 },
5925
5926 /* PREFIX_VEX_0F3878 */
5927 {
5928 { Bad_Opcode },
5929 { Bad_Opcode },
5930 { VEX_W_TABLE (VEX_W_0F3878_P_2) },
5931 },
5932
5933 /* PREFIX_VEX_0F3879 */
5934 {
5935 { Bad_Opcode },
5936 { Bad_Opcode },
5937 { VEX_W_TABLE (VEX_W_0F3879_P_2) },
5938 },
5939
5940 /* PREFIX_VEX_0F388C */
5941 {
5942 { Bad_Opcode },
5943 { Bad_Opcode },
5944 { MOD_TABLE (MOD_VEX_0F388C_PREFIX_2) },
5945 },
5946
5947 /* PREFIX_VEX_0F388E */
5948 {
5949 { Bad_Opcode },
5950 { Bad_Opcode },
5951 { MOD_TABLE (MOD_VEX_0F388E_PREFIX_2) },
5952 },
5953
5954 /* PREFIX_VEX_0F3890 */
5955 {
5956 { Bad_Opcode },
5957 { Bad_Opcode },
5958 { "vpgatherd%LW", { XM, MVexVSIBDWpX, Vex }, 0 },
5959 },
5960
5961 /* PREFIX_VEX_0F3891 */
5962 {
5963 { Bad_Opcode },
5964 { Bad_Opcode },
5965 { "vpgatherq%LW", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, 0 },
5966 },
5967
5968 /* PREFIX_VEX_0F3892 */
5969 {
5970 { Bad_Opcode },
5971 { Bad_Opcode },
5972 { "vgatherdp%XW", { XM, MVexVSIBDWpX, Vex }, 0 },
5973 },
5974
5975 /* PREFIX_VEX_0F3893 */
5976 {
5977 { Bad_Opcode },
5978 { Bad_Opcode },
5979 { "vgatherqp%XW", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, 0 },
5980 },
5981
5982 /* PREFIX_VEX_0F3896 */
5983 {
5984 { Bad_Opcode },
5985 { Bad_Opcode },
5986 { "vfmaddsub132p%XW", { XM, Vex, EXx }, 0 },
5987 },
5988
5989 /* PREFIX_VEX_0F3897 */
5990 {
5991 { Bad_Opcode },
5992 { Bad_Opcode },
5993 { "vfmsubadd132p%XW", { XM, Vex, EXx }, 0 },
5994 },
5995
5996 /* PREFIX_VEX_0F3898 */
5997 {
5998 { Bad_Opcode },
5999 { Bad_Opcode },
6000 { "vfmadd132p%XW", { XM, Vex, EXx }, 0 },
6001 },
6002
6003 /* PREFIX_VEX_0F3899 */
6004 {
6005 { Bad_Opcode },
6006 { Bad_Opcode },
6007 { "vfmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6008 },
6009
6010 /* PREFIX_VEX_0F389A */
6011 {
6012 { Bad_Opcode },
6013 { Bad_Opcode },
6014 { "vfmsub132p%XW", { XM, Vex, EXx }, 0 },
6015 },
6016
6017 /* PREFIX_VEX_0F389B */
6018 {
6019 { Bad_Opcode },
6020 { Bad_Opcode },
6021 { "vfmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6022 },
6023
6024 /* PREFIX_VEX_0F389C */
6025 {
6026 { Bad_Opcode },
6027 { Bad_Opcode },
6028 { "vfnmadd132p%XW", { XM, Vex, EXx }, 0 },
6029 },
6030
6031 /* PREFIX_VEX_0F389D */
6032 {
6033 { Bad_Opcode },
6034 { Bad_Opcode },
6035 { "vfnmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6036 },
6037
6038 /* PREFIX_VEX_0F389E */
6039 {
6040 { Bad_Opcode },
6041 { Bad_Opcode },
6042 { "vfnmsub132p%XW", { XM, Vex, EXx }, 0 },
6043 },
6044
6045 /* PREFIX_VEX_0F389F */
6046 {
6047 { Bad_Opcode },
6048 { Bad_Opcode },
6049 { "vfnmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6050 },
6051
6052 /* PREFIX_VEX_0F38A6 */
6053 {
6054 { Bad_Opcode },
6055 { Bad_Opcode },
6056 { "vfmaddsub213p%XW", { XM, Vex, EXx }, 0 },
6057 { Bad_Opcode },
6058 },
6059
6060 /* PREFIX_VEX_0F38A7 */
6061 {
6062 { Bad_Opcode },
6063 { Bad_Opcode },
6064 { "vfmsubadd213p%XW", { XM, Vex, EXx }, 0 },
6065 },
6066
6067 /* PREFIX_VEX_0F38A8 */
6068 {
6069 { Bad_Opcode },
6070 { Bad_Opcode },
6071 { "vfmadd213p%XW", { XM, Vex, EXx }, 0 },
6072 },
6073
6074 /* PREFIX_VEX_0F38A9 */
6075 {
6076 { Bad_Opcode },
6077 { Bad_Opcode },
6078 { "vfmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6079 },
6080
6081 /* PREFIX_VEX_0F38AA */
6082 {
6083 { Bad_Opcode },
6084 { Bad_Opcode },
6085 { "vfmsub213p%XW", { XM, Vex, EXx }, 0 },
6086 },
6087
6088 /* PREFIX_VEX_0F38AB */
6089 {
6090 { Bad_Opcode },
6091 { Bad_Opcode },
6092 { "vfmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6093 },
6094
6095 /* PREFIX_VEX_0F38AC */
6096 {
6097 { Bad_Opcode },
6098 { Bad_Opcode },
6099 { "vfnmadd213p%XW", { XM, Vex, EXx }, 0 },
6100 },
6101
6102 /* PREFIX_VEX_0F38AD */
6103 {
6104 { Bad_Opcode },
6105 { Bad_Opcode },
6106 { "vfnmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6107 },
6108
6109 /* PREFIX_VEX_0F38AE */
6110 {
6111 { Bad_Opcode },
6112 { Bad_Opcode },
6113 { "vfnmsub213p%XW", { XM, Vex, EXx }, 0 },
6114 },
6115
6116 /* PREFIX_VEX_0F38AF */
6117 {
6118 { Bad_Opcode },
6119 { Bad_Opcode },
6120 { "vfnmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6121 },
6122
6123 /* PREFIX_VEX_0F38B6 */
6124 {
6125 { Bad_Opcode },
6126 { Bad_Opcode },
6127 { "vfmaddsub231p%XW", { XM, Vex, EXx }, 0 },
6128 },
6129
6130 /* PREFIX_VEX_0F38B7 */
6131 {
6132 { Bad_Opcode },
6133 { Bad_Opcode },
6134 { "vfmsubadd231p%XW", { XM, Vex, EXx }, 0 },
6135 },
6136
6137 /* PREFIX_VEX_0F38B8 */
6138 {
6139 { Bad_Opcode },
6140 { Bad_Opcode },
6141 { "vfmadd231p%XW", { XM, Vex, EXx }, 0 },
6142 },
6143
6144 /* PREFIX_VEX_0F38B9 */
6145 {
6146 { Bad_Opcode },
6147 { Bad_Opcode },
6148 { "vfmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6149 },
6150
6151 /* PREFIX_VEX_0F38BA */
6152 {
6153 { Bad_Opcode },
6154 { Bad_Opcode },
6155 { "vfmsub231p%XW", { XM, Vex, EXx }, 0 },
6156 },
6157
6158 /* PREFIX_VEX_0F38BB */
6159 {
6160 { Bad_Opcode },
6161 { Bad_Opcode },
6162 { "vfmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6163 },
6164
6165 /* PREFIX_VEX_0F38BC */
6166 {
6167 { Bad_Opcode },
6168 { Bad_Opcode },
6169 { "vfnmadd231p%XW", { XM, Vex, EXx }, 0 },
6170 },
6171
6172 /* PREFIX_VEX_0F38BD */
6173 {
6174 { Bad_Opcode },
6175 { Bad_Opcode },
6176 { "vfnmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6177 },
6178
6179 /* PREFIX_VEX_0F38BE */
6180 {
6181 { Bad_Opcode },
6182 { Bad_Opcode },
6183 { "vfnmsub231p%XW", { XM, Vex, EXx }, 0 },
6184 },
6185
6186 /* PREFIX_VEX_0F38BF */
6187 {
6188 { Bad_Opcode },
6189 { Bad_Opcode },
6190 { "vfnmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6191 },
6192
6193 /* PREFIX_VEX_0F38CF */
6194 {
6195 { Bad_Opcode },
6196 { Bad_Opcode },
6197 { VEX_W_TABLE (VEX_W_0F38CF_P_2) },
6198 },
6199
6200 /* PREFIX_VEX_0F38DB */
6201 {
6202 { Bad_Opcode },
6203 { Bad_Opcode },
6204 { VEX_LEN_TABLE (VEX_LEN_0F38DB_P_2) },
6205 },
6206
6207 /* PREFIX_VEX_0F38DC */
6208 {
6209 { Bad_Opcode },
6210 { Bad_Opcode },
6211 { "vaesenc", { XM, Vex, EXx }, 0 },
6212 },
6213
6214 /* PREFIX_VEX_0F38DD */
6215 {
6216 { Bad_Opcode },
6217 { Bad_Opcode },
6218 { "vaesenclast", { XM, Vex, EXx }, 0 },
6219 },
6220
6221 /* PREFIX_VEX_0F38DE */
6222 {
6223 { Bad_Opcode },
6224 { Bad_Opcode },
6225 { "vaesdec", { XM, Vex, EXx }, 0 },
6226 },
6227
6228 /* PREFIX_VEX_0F38DF */
6229 {
6230 { Bad_Opcode },
6231 { Bad_Opcode },
6232 { "vaesdeclast", { XM, Vex, EXx }, 0 },
6233 },
6234
6235 /* PREFIX_VEX_0F38F2 */
6236 {
6237 { VEX_LEN_TABLE (VEX_LEN_0F38F2_P_0) },
6238 },
6239
6240 /* PREFIX_VEX_0F38F3_REG_1 */
6241 {
6242 { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_1_P_0) },
6243 },
6244
6245 /* PREFIX_VEX_0F38F3_REG_2 */
6246 {
6247 { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_2_P_0) },
6248 },
6249
6250 /* PREFIX_VEX_0F38F3_REG_3 */
6251 {
6252 { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_3_P_0) },
6253 },
6254
6255 /* PREFIX_VEX_0F38F5 */
6256 {
6257 { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_0) },
6258 { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_1) },
6259 { Bad_Opcode },
6260 { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_3) },
6261 },
6262
6263 /* PREFIX_VEX_0F38F6 */
6264 {
6265 { Bad_Opcode },
6266 { Bad_Opcode },
6267 { Bad_Opcode },
6268 { VEX_LEN_TABLE (VEX_LEN_0F38F6_P_3) },
6269 },
6270
6271 /* PREFIX_VEX_0F38F7 */
6272 {
6273 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_0) },
6274 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_1) },
6275 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_2) },
6276 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_3) },
6277 },
6278
6279 /* PREFIX_VEX_0F3A00 */
6280 {
6281 { Bad_Opcode },
6282 { Bad_Opcode },
6283 { VEX_LEN_TABLE (VEX_LEN_0F3A00_P_2) },
6284 },
6285
6286 /* PREFIX_VEX_0F3A01 */
6287 {
6288 { Bad_Opcode },
6289 { Bad_Opcode },
6290 { VEX_LEN_TABLE (VEX_LEN_0F3A01_P_2) },
6291 },
6292
6293 /* PREFIX_VEX_0F3A02 */
6294 {
6295 { Bad_Opcode },
6296 { Bad_Opcode },
6297 { VEX_W_TABLE (VEX_W_0F3A02_P_2) },
6298 },
6299
6300 /* PREFIX_VEX_0F3A04 */
6301 {
6302 { Bad_Opcode },
6303 { Bad_Opcode },
6304 { VEX_W_TABLE (VEX_W_0F3A04_P_2) },
6305 },
6306
6307 /* PREFIX_VEX_0F3A05 */
6308 {
6309 { Bad_Opcode },
6310 { Bad_Opcode },
6311 { VEX_W_TABLE (VEX_W_0F3A05_P_2) },
6312 },
6313
6314 /* PREFIX_VEX_0F3A06 */
6315 {
6316 { Bad_Opcode },
6317 { Bad_Opcode },
6318 { VEX_LEN_TABLE (VEX_LEN_0F3A06_P_2) },
6319 },
6320
6321 /* PREFIX_VEX_0F3A08 */
6322 {
6323 { Bad_Opcode },
6324 { Bad_Opcode },
6325 { "vroundps", { XM, EXx, Ib }, 0 },
6326 },
6327
6328 /* PREFIX_VEX_0F3A09 */
6329 {
6330 { Bad_Opcode },
6331 { Bad_Opcode },
6332 { "vroundpd", { XM, EXx, Ib }, 0 },
6333 },
6334
6335 /* PREFIX_VEX_0F3A0A */
6336 {
6337 { Bad_Opcode },
6338 { Bad_Opcode },
6339 { "vroundss", { XMScalar, VexScalar, EXdScalar, Ib }, 0 },
6340 },
6341
6342 /* PREFIX_VEX_0F3A0B */
6343 {
6344 { Bad_Opcode },
6345 { Bad_Opcode },
6346 { "vroundsd", { XMScalar, VexScalar, EXqScalar, Ib }, 0 },
6347 },
6348
6349 /* PREFIX_VEX_0F3A0C */
6350 {
6351 { Bad_Opcode },
6352 { Bad_Opcode },
6353 { "vblendps", { XM, Vex, EXx, Ib }, 0 },
6354 },
6355
6356 /* PREFIX_VEX_0F3A0D */
6357 {
6358 { Bad_Opcode },
6359 { Bad_Opcode },
6360 { "vblendpd", { XM, Vex, EXx, Ib }, 0 },
6361 },
6362
6363 /* PREFIX_VEX_0F3A0E */
6364 {
6365 { Bad_Opcode },
6366 { Bad_Opcode },
6367 { "vpblendw", { XM, Vex, EXx, Ib }, 0 },
6368 },
6369
6370 /* PREFIX_VEX_0F3A0F */
6371 {
6372 { Bad_Opcode },
6373 { Bad_Opcode },
6374 { "vpalignr", { XM, Vex, EXx, Ib }, 0 },
6375 },
6376
6377 /* PREFIX_VEX_0F3A14 */
6378 {
6379 { Bad_Opcode },
6380 { Bad_Opcode },
6381 { VEX_LEN_TABLE (VEX_LEN_0F3A14_P_2) },
6382 },
6383
6384 /* PREFIX_VEX_0F3A15 */
6385 {
6386 { Bad_Opcode },
6387 { Bad_Opcode },
6388 { VEX_LEN_TABLE (VEX_LEN_0F3A15_P_2) },
6389 },
6390
6391 /* PREFIX_VEX_0F3A16 */
6392 {
6393 { Bad_Opcode },
6394 { Bad_Opcode },
6395 { VEX_LEN_TABLE (VEX_LEN_0F3A16_P_2) },
6396 },
6397
6398 /* PREFIX_VEX_0F3A17 */
6399 {
6400 { Bad_Opcode },
6401 { Bad_Opcode },
6402 { VEX_LEN_TABLE (VEX_LEN_0F3A17_P_2) },
6403 },
6404
6405 /* PREFIX_VEX_0F3A18 */
6406 {
6407 { Bad_Opcode },
6408 { Bad_Opcode },
6409 { VEX_LEN_TABLE (VEX_LEN_0F3A18_P_2) },
6410 },
6411
6412 /* PREFIX_VEX_0F3A19 */
6413 {
6414 { Bad_Opcode },
6415 { Bad_Opcode },
6416 { VEX_LEN_TABLE (VEX_LEN_0F3A19_P_2) },
6417 },
6418
6419 /* PREFIX_VEX_0F3A1D */
6420 {
6421 { Bad_Opcode },
6422 { Bad_Opcode },
6423 { "vcvtps2ph", { EXxmmq, XM, Ib }, 0 },
6424 },
6425
6426 /* PREFIX_VEX_0F3A20 */
6427 {
6428 { Bad_Opcode },
6429 { Bad_Opcode },
6430 { VEX_LEN_TABLE (VEX_LEN_0F3A20_P_2) },
6431 },
6432
6433 /* PREFIX_VEX_0F3A21 */
6434 {
6435 { Bad_Opcode },
6436 { Bad_Opcode },
6437 { VEX_LEN_TABLE (VEX_LEN_0F3A21_P_2) },
6438 },
6439
6440 /* PREFIX_VEX_0F3A22 */
6441 {
6442 { Bad_Opcode },
6443 { Bad_Opcode },
6444 { VEX_LEN_TABLE (VEX_LEN_0F3A22_P_2) },
6445 },
6446
6447 /* PREFIX_VEX_0F3A30 */
6448 {
6449 { Bad_Opcode },
6450 { Bad_Opcode },
6451 { VEX_LEN_TABLE (VEX_LEN_0F3A30_P_2) },
6452 },
6453
6454 /* PREFIX_VEX_0F3A31 */
6455 {
6456 { Bad_Opcode },
6457 { Bad_Opcode },
6458 { VEX_LEN_TABLE (VEX_LEN_0F3A31_P_2) },
6459 },
6460
6461 /* PREFIX_VEX_0F3A32 */
6462 {
6463 { Bad_Opcode },
6464 { Bad_Opcode },
6465 { VEX_LEN_TABLE (VEX_LEN_0F3A32_P_2) },
6466 },
6467
6468 /* PREFIX_VEX_0F3A33 */
6469 {
6470 { Bad_Opcode },
6471 { Bad_Opcode },
6472 { VEX_LEN_TABLE (VEX_LEN_0F3A33_P_2) },
6473 },
6474
6475 /* PREFIX_VEX_0F3A38 */
6476 {
6477 { Bad_Opcode },
6478 { Bad_Opcode },
6479 { VEX_LEN_TABLE (VEX_LEN_0F3A38_P_2) },
6480 },
6481
6482 /* PREFIX_VEX_0F3A39 */
6483 {
6484 { Bad_Opcode },
6485 { Bad_Opcode },
6486 { VEX_LEN_TABLE (VEX_LEN_0F3A39_P_2) },
6487 },
6488
6489 /* PREFIX_VEX_0F3A40 */
6490 {
6491 { Bad_Opcode },
6492 { Bad_Opcode },
6493 { "vdpps", { XM, Vex, EXx, Ib }, 0 },
6494 },
6495
6496 /* PREFIX_VEX_0F3A41 */
6497 {
6498 { Bad_Opcode },
6499 { Bad_Opcode },
6500 { VEX_LEN_TABLE (VEX_LEN_0F3A41_P_2) },
6501 },
6502
6503 /* PREFIX_VEX_0F3A42 */
6504 {
6505 { Bad_Opcode },
6506 { Bad_Opcode },
6507 { "vmpsadbw", { XM, Vex, EXx, Ib }, 0 },
6508 },
6509
6510 /* PREFIX_VEX_0F3A44 */
6511 {
6512 { Bad_Opcode },
6513 { Bad_Opcode },
6514 { "vpclmulqdq", { XM, Vex, EXx, PCLMUL }, 0 },
6515 },
6516
6517 /* PREFIX_VEX_0F3A46 */
6518 {
6519 { Bad_Opcode },
6520 { Bad_Opcode },
6521 { VEX_LEN_TABLE (VEX_LEN_0F3A46_P_2) },
6522 },
6523
6524 /* PREFIX_VEX_0F3A48 */
6525 {
6526 { Bad_Opcode },
6527 { Bad_Opcode },
6528 { VEX_W_TABLE (VEX_W_0F3A48_P_2) },
6529 },
6530
6531 /* PREFIX_VEX_0F3A49 */
6532 {
6533 { Bad_Opcode },
6534 { Bad_Opcode },
6535 { VEX_W_TABLE (VEX_W_0F3A49_P_2) },
6536 },
6537
6538 /* PREFIX_VEX_0F3A4A */
6539 {
6540 { Bad_Opcode },
6541 { Bad_Opcode },
6542 { VEX_W_TABLE (VEX_W_0F3A4A_P_2) },
6543 },
6544
6545 /* PREFIX_VEX_0F3A4B */
6546 {
6547 { Bad_Opcode },
6548 { Bad_Opcode },
6549 { VEX_W_TABLE (VEX_W_0F3A4B_P_2) },
6550 },
6551
6552 /* PREFIX_VEX_0F3A4C */
6553 {
6554 { Bad_Opcode },
6555 { Bad_Opcode },
6556 { VEX_W_TABLE (VEX_W_0F3A4C_P_2) },
6557 },
6558
6559 /* PREFIX_VEX_0F3A5C */
6560 {
6561 { Bad_Opcode },
6562 { Bad_Opcode },
6563 { "vfmaddsubps", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6564 },
6565
6566 /* PREFIX_VEX_0F3A5D */
6567 {
6568 { Bad_Opcode },
6569 { Bad_Opcode },
6570 { "vfmaddsubpd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6571 },
6572
6573 /* PREFIX_VEX_0F3A5E */
6574 {
6575 { Bad_Opcode },
6576 { Bad_Opcode },
6577 { "vfmsubaddps", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6578 },
6579
6580 /* PREFIX_VEX_0F3A5F */
6581 {
6582 { Bad_Opcode },
6583 { Bad_Opcode },
6584 { "vfmsubaddpd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6585 },
6586
6587 /* PREFIX_VEX_0F3A60 */
6588 {
6589 { Bad_Opcode },
6590 { Bad_Opcode },
6591 { VEX_LEN_TABLE (VEX_LEN_0F3A60_P_2) },
6592 { Bad_Opcode },
6593 },
6594
6595 /* PREFIX_VEX_0F3A61 */
6596 {
6597 { Bad_Opcode },
6598 { Bad_Opcode },
6599 { VEX_LEN_TABLE (VEX_LEN_0F3A61_P_2) },
6600 },
6601
6602 /* PREFIX_VEX_0F3A62 */
6603 {
6604 { Bad_Opcode },
6605 { Bad_Opcode },
6606 { VEX_LEN_TABLE (VEX_LEN_0F3A62_P_2) },
6607 },
6608
6609 /* PREFIX_VEX_0F3A63 */
6610 {
6611 { Bad_Opcode },
6612 { Bad_Opcode },
6613 { VEX_LEN_TABLE (VEX_LEN_0F3A63_P_2) },
6614 },
6615
6616 /* PREFIX_VEX_0F3A68 */
6617 {
6618 { Bad_Opcode },
6619 { Bad_Opcode },
6620 { "vfmaddps", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6621 },
6622
6623 /* PREFIX_VEX_0F3A69 */
6624 {
6625 { Bad_Opcode },
6626 { Bad_Opcode },
6627 { "vfmaddpd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6628 },
6629
6630 /* PREFIX_VEX_0F3A6A */
6631 {
6632 { Bad_Opcode },
6633 { Bad_Opcode },
6634 { VEX_LEN_TABLE (VEX_LEN_0F3A6A_P_2) },
6635 },
6636
6637 /* PREFIX_VEX_0F3A6B */
6638 {
6639 { Bad_Opcode },
6640 { Bad_Opcode },
6641 { VEX_LEN_TABLE (VEX_LEN_0F3A6B_P_2) },
6642 },
6643
6644 /* PREFIX_VEX_0F3A6C */
6645 {
6646 { Bad_Opcode },
6647 { Bad_Opcode },
6648 { "vfmsubps", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6649 },
6650
6651 /* PREFIX_VEX_0F3A6D */
6652 {
6653 { Bad_Opcode },
6654 { Bad_Opcode },
6655 { "vfmsubpd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6656 },
6657
6658 /* PREFIX_VEX_0F3A6E */
6659 {
6660 { Bad_Opcode },
6661 { Bad_Opcode },
6662 { VEX_LEN_TABLE (VEX_LEN_0F3A6E_P_2) },
6663 },
6664
6665 /* PREFIX_VEX_0F3A6F */
6666 {
6667 { Bad_Opcode },
6668 { Bad_Opcode },
6669 { VEX_LEN_TABLE (VEX_LEN_0F3A6F_P_2) },
6670 },
6671
6672 /* PREFIX_VEX_0F3A78 */
6673 {
6674 { Bad_Opcode },
6675 { Bad_Opcode },
6676 { "vfnmaddps", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6677 },
6678
6679 /* PREFIX_VEX_0F3A79 */
6680 {
6681 { Bad_Opcode },
6682 { Bad_Opcode },
6683 { "vfnmaddpd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6684 },
6685
6686 /* PREFIX_VEX_0F3A7A */
6687 {
6688 { Bad_Opcode },
6689 { Bad_Opcode },
6690 { VEX_LEN_TABLE (VEX_LEN_0F3A7A_P_2) },
6691 },
6692
6693 /* PREFIX_VEX_0F3A7B */
6694 {
6695 { Bad_Opcode },
6696 { Bad_Opcode },
6697 { VEX_LEN_TABLE (VEX_LEN_0F3A7B_P_2) },
6698 },
6699
6700 /* PREFIX_VEX_0F3A7C */
6701 {
6702 { Bad_Opcode },
6703 { Bad_Opcode },
6704 { "vfnmsubps", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6705 { Bad_Opcode },
6706 },
6707
6708 /* PREFIX_VEX_0F3A7D */
6709 {
6710 { Bad_Opcode },
6711 { Bad_Opcode },
6712 { "vfnmsubpd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6713 },
6714
6715 /* PREFIX_VEX_0F3A7E */
6716 {
6717 { Bad_Opcode },
6718 { Bad_Opcode },
6719 { VEX_LEN_TABLE (VEX_LEN_0F3A7E_P_2) },
6720 },
6721
6722 /* PREFIX_VEX_0F3A7F */
6723 {
6724 { Bad_Opcode },
6725 { Bad_Opcode },
6726 { VEX_LEN_TABLE (VEX_LEN_0F3A7F_P_2) },
6727 },
6728
6729 /* PREFIX_VEX_0F3ACE */
6730 {
6731 { Bad_Opcode },
6732 { Bad_Opcode },
6733 { VEX_W_TABLE (VEX_W_0F3ACE_P_2) },
6734 },
6735
6736 /* PREFIX_VEX_0F3ACF */
6737 {
6738 { Bad_Opcode },
6739 { Bad_Opcode },
6740 { VEX_W_TABLE (VEX_W_0F3ACF_P_2) },
6741 },
6742
6743 /* PREFIX_VEX_0F3ADF */
6744 {
6745 { Bad_Opcode },
6746 { Bad_Opcode },
6747 { VEX_LEN_TABLE (VEX_LEN_0F3ADF_P_2) },
6748 },
6749
6750 /* PREFIX_VEX_0F3AF0 */
6751 {
6752 { Bad_Opcode },
6753 { Bad_Opcode },
6754 { Bad_Opcode },
6755 { VEX_LEN_TABLE (VEX_LEN_0F3AF0_P_3) },
6756 },
6757
6758 #define NEED_PREFIX_TABLE
6759 #include "i386-dis-evex.h"
6760 #undef NEED_PREFIX_TABLE
6761 };
6762
6763 static const struct dis386 x86_64_table[][2] = {
6764 /* X86_64_06 */
6765 {
6766 { "pushP", { es }, 0 },
6767 },
6768
6769 /* X86_64_07 */
6770 {
6771 { "popP", { es }, 0 },
6772 },
6773
6774 /* X86_64_0D */
6775 {
6776 { "pushP", { cs }, 0 },
6777 },
6778
6779 /* X86_64_16 */
6780 {
6781 { "pushP", { ss }, 0 },
6782 },
6783
6784 /* X86_64_17 */
6785 {
6786 { "popP", { ss }, 0 },
6787 },
6788
6789 /* X86_64_1E */
6790 {
6791 { "pushP", { ds }, 0 },
6792 },
6793
6794 /* X86_64_1F */
6795 {
6796 { "popP", { ds }, 0 },
6797 },
6798
6799 /* X86_64_27 */
6800 {
6801 { "daa", { XX }, 0 },
6802 },
6803
6804 /* X86_64_2F */
6805 {
6806 { "das", { XX }, 0 },
6807 },
6808
6809 /* X86_64_37 */
6810 {
6811 { "aaa", { XX }, 0 },
6812 },
6813
6814 /* X86_64_3F */
6815 {
6816 { "aas", { XX }, 0 },
6817 },
6818
6819 /* X86_64_60 */
6820 {
6821 { "pushaP", { XX }, 0 },
6822 },
6823
6824 /* X86_64_61 */
6825 {
6826 { "popaP", { XX }, 0 },
6827 },
6828
6829 /* X86_64_62 */
6830 {
6831 { MOD_TABLE (MOD_62_32BIT) },
6832 { EVEX_TABLE (EVEX_0F) },
6833 },
6834
6835 /* X86_64_63 */
6836 {
6837 { "arpl", { Ew, Gw }, 0 },
6838 { "movs{lq|xd}", { Gv, Ed }, 0 },
6839 },
6840
6841 /* X86_64_6D */
6842 {
6843 { "ins{R|}", { Yzr, indirDX }, 0 },
6844 { "ins{G|}", { Yzr, indirDX }, 0 },
6845 },
6846
6847 /* X86_64_6F */
6848 {
6849 { "outs{R|}", { indirDXr, Xz }, 0 },
6850 { "outs{G|}", { indirDXr, Xz }, 0 },
6851 },
6852
6853 /* X86_64_82 */
6854 {
6855 /* Opcode 0x82 is an alias of opcode 0x80 in 32-bit mode. */
6856 { REG_TABLE (REG_80) },
6857 },
6858
6859 /* X86_64_9A */
6860 {
6861 { "Jcall{T|}", { Ap }, 0 },
6862 },
6863
6864 /* X86_64_C4 */
6865 {
6866 { MOD_TABLE (MOD_C4_32BIT) },
6867 { VEX_C4_TABLE (VEX_0F) },
6868 },
6869
6870 /* X86_64_C5 */
6871 {
6872 { MOD_TABLE (MOD_C5_32BIT) },
6873 { VEX_C5_TABLE (VEX_0F) },
6874 },
6875
6876 /* X86_64_CE */
6877 {
6878 { "into", { XX }, 0 },
6879 },
6880
6881 /* X86_64_D4 */
6882 {
6883 { "aam", { Ib }, 0 },
6884 },
6885
6886 /* X86_64_D5 */
6887 {
6888 { "aad", { Ib }, 0 },
6889 },
6890
6891 /* X86_64_E8 */
6892 {
6893 { "callP", { Jv, BND }, 0 },
6894 { "call@", { Jv, BND }, 0 }
6895 },
6896
6897 /* X86_64_E9 */
6898 {
6899 { "jmpP", { Jv, BND }, 0 },
6900 { "jmp@", { Jv, BND }, 0 }
6901 },
6902
6903 /* X86_64_EA */
6904 {
6905 { "Jjmp{T|}", { Ap }, 0 },
6906 },
6907
6908 /* X86_64_0F01_REG_0 */
6909 {
6910 { "sgdt{Q|IQ}", { M }, 0 },
6911 { "sgdt", { M }, 0 },
6912 },
6913
6914 /* X86_64_0F01_REG_1 */
6915 {
6916 { "sidt{Q|IQ}", { M }, 0 },
6917 { "sidt", { M }, 0 },
6918 },
6919
6920 /* X86_64_0F01_REG_2 */
6921 {
6922 { "lgdt{Q|Q}", { M }, 0 },
6923 { "lgdt", { M }, 0 },
6924 },
6925
6926 /* X86_64_0F01_REG_3 */
6927 {
6928 { "lidt{Q|Q}", { M }, 0 },
6929 { "lidt", { M }, 0 },
6930 },
6931 };
6932
6933 static const struct dis386 three_byte_table[][256] = {
6934
6935 /* THREE_BYTE_0F38 */
6936 {
6937 /* 00 */
6938 { "pshufb", { MX, EM }, PREFIX_OPCODE },
6939 { "phaddw", { MX, EM }, PREFIX_OPCODE },
6940 { "phaddd", { MX, EM }, PREFIX_OPCODE },
6941 { "phaddsw", { MX, EM }, PREFIX_OPCODE },
6942 { "pmaddubsw", { MX, EM }, PREFIX_OPCODE },
6943 { "phsubw", { MX, EM }, PREFIX_OPCODE },
6944 { "phsubd", { MX, EM }, PREFIX_OPCODE },
6945 { "phsubsw", { MX, EM }, PREFIX_OPCODE },
6946 /* 08 */
6947 { "psignb", { MX, EM }, PREFIX_OPCODE },
6948 { "psignw", { MX, EM }, PREFIX_OPCODE },
6949 { "psignd", { MX, EM }, PREFIX_OPCODE },
6950 { "pmulhrsw", { MX, EM }, PREFIX_OPCODE },
6951 { Bad_Opcode },
6952 { Bad_Opcode },
6953 { Bad_Opcode },
6954 { Bad_Opcode },
6955 /* 10 */
6956 { PREFIX_TABLE (PREFIX_0F3810) },
6957 { Bad_Opcode },
6958 { Bad_Opcode },
6959 { Bad_Opcode },
6960 { PREFIX_TABLE (PREFIX_0F3814) },
6961 { PREFIX_TABLE (PREFIX_0F3815) },
6962 { Bad_Opcode },
6963 { PREFIX_TABLE (PREFIX_0F3817) },
6964 /* 18 */
6965 { Bad_Opcode },
6966 { Bad_Opcode },
6967 { Bad_Opcode },
6968 { Bad_Opcode },
6969 { "pabsb", { MX, EM }, PREFIX_OPCODE },
6970 { "pabsw", { MX, EM }, PREFIX_OPCODE },
6971 { "pabsd", { MX, EM }, PREFIX_OPCODE },
6972 { Bad_Opcode },
6973 /* 20 */
6974 { PREFIX_TABLE (PREFIX_0F3820) },
6975 { PREFIX_TABLE (PREFIX_0F3821) },
6976 { PREFIX_TABLE (PREFIX_0F3822) },
6977 { PREFIX_TABLE (PREFIX_0F3823) },
6978 { PREFIX_TABLE (PREFIX_0F3824) },
6979 { PREFIX_TABLE (PREFIX_0F3825) },
6980 { Bad_Opcode },
6981 { Bad_Opcode },
6982 /* 28 */
6983 { PREFIX_TABLE (PREFIX_0F3828) },
6984 { PREFIX_TABLE (PREFIX_0F3829) },
6985 { PREFIX_TABLE (PREFIX_0F382A) },
6986 { PREFIX_TABLE (PREFIX_0F382B) },
6987 { Bad_Opcode },
6988 { Bad_Opcode },
6989 { Bad_Opcode },
6990 { Bad_Opcode },
6991 /* 30 */
6992 { PREFIX_TABLE (PREFIX_0F3830) },
6993 { PREFIX_TABLE (PREFIX_0F3831) },
6994 { PREFIX_TABLE (PREFIX_0F3832) },
6995 { PREFIX_TABLE (PREFIX_0F3833) },
6996 { PREFIX_TABLE (PREFIX_0F3834) },
6997 { PREFIX_TABLE (PREFIX_0F3835) },
6998 { Bad_Opcode },
6999 { PREFIX_TABLE (PREFIX_0F3837) },
7000 /* 38 */
7001 { PREFIX_TABLE (PREFIX_0F3838) },
7002 { PREFIX_TABLE (PREFIX_0F3839) },
7003 { PREFIX_TABLE (PREFIX_0F383A) },
7004 { PREFIX_TABLE (PREFIX_0F383B) },
7005 { PREFIX_TABLE (PREFIX_0F383C) },
7006 { PREFIX_TABLE (PREFIX_0F383D) },
7007 { PREFIX_TABLE (PREFIX_0F383E) },
7008 { PREFIX_TABLE (PREFIX_0F383F) },
7009 /* 40 */
7010 { PREFIX_TABLE (PREFIX_0F3840) },
7011 { PREFIX_TABLE (PREFIX_0F3841) },
7012 { Bad_Opcode },
7013 { Bad_Opcode },
7014 { Bad_Opcode },
7015 { Bad_Opcode },
7016 { Bad_Opcode },
7017 { Bad_Opcode },
7018 /* 48 */
7019 { Bad_Opcode },
7020 { Bad_Opcode },
7021 { Bad_Opcode },
7022 { Bad_Opcode },
7023 { Bad_Opcode },
7024 { Bad_Opcode },
7025 { Bad_Opcode },
7026 { Bad_Opcode },
7027 /* 50 */
7028 { Bad_Opcode },
7029 { Bad_Opcode },
7030 { Bad_Opcode },
7031 { Bad_Opcode },
7032 { Bad_Opcode },
7033 { Bad_Opcode },
7034 { Bad_Opcode },
7035 { Bad_Opcode },
7036 /* 58 */
7037 { Bad_Opcode },
7038 { Bad_Opcode },
7039 { Bad_Opcode },
7040 { Bad_Opcode },
7041 { Bad_Opcode },
7042 { Bad_Opcode },
7043 { Bad_Opcode },
7044 { Bad_Opcode },
7045 /* 60 */
7046 { Bad_Opcode },
7047 { Bad_Opcode },
7048 { Bad_Opcode },
7049 { Bad_Opcode },
7050 { Bad_Opcode },
7051 { Bad_Opcode },
7052 { Bad_Opcode },
7053 { Bad_Opcode },
7054 /* 68 */
7055 { Bad_Opcode },
7056 { Bad_Opcode },
7057 { Bad_Opcode },
7058 { Bad_Opcode },
7059 { Bad_Opcode },
7060 { Bad_Opcode },
7061 { Bad_Opcode },
7062 { Bad_Opcode },
7063 /* 70 */
7064 { Bad_Opcode },
7065 { Bad_Opcode },
7066 { Bad_Opcode },
7067 { Bad_Opcode },
7068 { Bad_Opcode },
7069 { Bad_Opcode },
7070 { Bad_Opcode },
7071 { Bad_Opcode },
7072 /* 78 */
7073 { Bad_Opcode },
7074 { Bad_Opcode },
7075 { Bad_Opcode },
7076 { Bad_Opcode },
7077 { Bad_Opcode },
7078 { Bad_Opcode },
7079 { Bad_Opcode },
7080 { Bad_Opcode },
7081 /* 80 */
7082 { PREFIX_TABLE (PREFIX_0F3880) },
7083 { PREFIX_TABLE (PREFIX_0F3881) },
7084 { PREFIX_TABLE (PREFIX_0F3882) },
7085 { Bad_Opcode },
7086 { Bad_Opcode },
7087 { Bad_Opcode },
7088 { Bad_Opcode },
7089 { Bad_Opcode },
7090 /* 88 */
7091 { Bad_Opcode },
7092 { Bad_Opcode },
7093 { Bad_Opcode },
7094 { Bad_Opcode },
7095 { Bad_Opcode },
7096 { Bad_Opcode },
7097 { Bad_Opcode },
7098 { Bad_Opcode },
7099 /* 90 */
7100 { Bad_Opcode },
7101 { Bad_Opcode },
7102 { Bad_Opcode },
7103 { Bad_Opcode },
7104 { Bad_Opcode },
7105 { Bad_Opcode },
7106 { Bad_Opcode },
7107 { Bad_Opcode },
7108 /* 98 */
7109 { Bad_Opcode },
7110 { Bad_Opcode },
7111 { Bad_Opcode },
7112 { Bad_Opcode },
7113 { Bad_Opcode },
7114 { Bad_Opcode },
7115 { Bad_Opcode },
7116 { Bad_Opcode },
7117 /* a0 */
7118 { Bad_Opcode },
7119 { Bad_Opcode },
7120 { Bad_Opcode },
7121 { Bad_Opcode },
7122 { Bad_Opcode },
7123 { Bad_Opcode },
7124 { Bad_Opcode },
7125 { Bad_Opcode },
7126 /* a8 */
7127 { Bad_Opcode },
7128 { Bad_Opcode },
7129 { Bad_Opcode },
7130 { Bad_Opcode },
7131 { Bad_Opcode },
7132 { Bad_Opcode },
7133 { Bad_Opcode },
7134 { Bad_Opcode },
7135 /* b0 */
7136 { Bad_Opcode },
7137 { Bad_Opcode },
7138 { Bad_Opcode },
7139 { Bad_Opcode },
7140 { Bad_Opcode },
7141 { Bad_Opcode },
7142 { Bad_Opcode },
7143 { Bad_Opcode },
7144 /* b8 */
7145 { Bad_Opcode },
7146 { Bad_Opcode },
7147 { Bad_Opcode },
7148 { Bad_Opcode },
7149 { Bad_Opcode },
7150 { Bad_Opcode },
7151 { Bad_Opcode },
7152 { Bad_Opcode },
7153 /* c0 */
7154 { Bad_Opcode },
7155 { Bad_Opcode },
7156 { Bad_Opcode },
7157 { Bad_Opcode },
7158 { Bad_Opcode },
7159 { Bad_Opcode },
7160 { Bad_Opcode },
7161 { Bad_Opcode },
7162 /* c8 */
7163 { PREFIX_TABLE (PREFIX_0F38C8) },
7164 { PREFIX_TABLE (PREFIX_0F38C9) },
7165 { PREFIX_TABLE (PREFIX_0F38CA) },
7166 { PREFIX_TABLE (PREFIX_0F38CB) },
7167 { PREFIX_TABLE (PREFIX_0F38CC) },
7168 { PREFIX_TABLE (PREFIX_0F38CD) },
7169 { Bad_Opcode },
7170 { PREFIX_TABLE (PREFIX_0F38CF) },
7171 /* d0 */
7172 { Bad_Opcode },
7173 { Bad_Opcode },
7174 { Bad_Opcode },
7175 { Bad_Opcode },
7176 { Bad_Opcode },
7177 { Bad_Opcode },
7178 { Bad_Opcode },
7179 { Bad_Opcode },
7180 /* d8 */
7181 { Bad_Opcode },
7182 { Bad_Opcode },
7183 { Bad_Opcode },
7184 { PREFIX_TABLE (PREFIX_0F38DB) },
7185 { PREFIX_TABLE (PREFIX_0F38DC) },
7186 { PREFIX_TABLE (PREFIX_0F38DD) },
7187 { PREFIX_TABLE (PREFIX_0F38DE) },
7188 { PREFIX_TABLE (PREFIX_0F38DF) },
7189 /* e0 */
7190 { Bad_Opcode },
7191 { Bad_Opcode },
7192 { Bad_Opcode },
7193 { Bad_Opcode },
7194 { Bad_Opcode },
7195 { Bad_Opcode },
7196 { Bad_Opcode },
7197 { Bad_Opcode },
7198 /* e8 */
7199 { Bad_Opcode },
7200 { Bad_Opcode },
7201 { Bad_Opcode },
7202 { Bad_Opcode },
7203 { Bad_Opcode },
7204 { Bad_Opcode },
7205 { Bad_Opcode },
7206 { Bad_Opcode },
7207 /* f0 */
7208 { PREFIX_TABLE (PREFIX_0F38F0) },
7209 { PREFIX_TABLE (PREFIX_0F38F1) },
7210 { Bad_Opcode },
7211 { Bad_Opcode },
7212 { Bad_Opcode },
7213 { PREFIX_TABLE (PREFIX_0F38F5) },
7214 { PREFIX_TABLE (PREFIX_0F38F6) },
7215 { Bad_Opcode },
7216 /* f8 */
7217 { PREFIX_TABLE (PREFIX_0F38F8) },
7218 { PREFIX_TABLE (PREFIX_0F38F9) },
7219 { Bad_Opcode },
7220 { Bad_Opcode },
7221 { Bad_Opcode },
7222 { Bad_Opcode },
7223 { Bad_Opcode },
7224 { Bad_Opcode },
7225 },
7226 /* THREE_BYTE_0F3A */
7227 {
7228 /* 00 */
7229 { Bad_Opcode },
7230 { Bad_Opcode },
7231 { Bad_Opcode },
7232 { Bad_Opcode },
7233 { Bad_Opcode },
7234 { Bad_Opcode },
7235 { Bad_Opcode },
7236 { Bad_Opcode },
7237 /* 08 */
7238 { PREFIX_TABLE (PREFIX_0F3A08) },
7239 { PREFIX_TABLE (PREFIX_0F3A09) },
7240 { PREFIX_TABLE (PREFIX_0F3A0A) },
7241 { PREFIX_TABLE (PREFIX_0F3A0B) },
7242 { PREFIX_TABLE (PREFIX_0F3A0C) },
7243 { PREFIX_TABLE (PREFIX_0F3A0D) },
7244 { PREFIX_TABLE (PREFIX_0F3A0E) },
7245 { "palignr", { MX, EM, Ib }, PREFIX_OPCODE },
7246 /* 10 */
7247 { Bad_Opcode },
7248 { Bad_Opcode },
7249 { Bad_Opcode },
7250 { Bad_Opcode },
7251 { PREFIX_TABLE (PREFIX_0F3A14) },
7252 { PREFIX_TABLE (PREFIX_0F3A15) },
7253 { PREFIX_TABLE (PREFIX_0F3A16) },
7254 { PREFIX_TABLE (PREFIX_0F3A17) },
7255 /* 18 */
7256 { Bad_Opcode },
7257 { Bad_Opcode },
7258 { Bad_Opcode },
7259 { Bad_Opcode },
7260 { Bad_Opcode },
7261 { Bad_Opcode },
7262 { Bad_Opcode },
7263 { Bad_Opcode },
7264 /* 20 */
7265 { PREFIX_TABLE (PREFIX_0F3A20) },
7266 { PREFIX_TABLE (PREFIX_0F3A21) },
7267 { PREFIX_TABLE (PREFIX_0F3A22) },
7268 { Bad_Opcode },
7269 { Bad_Opcode },
7270 { Bad_Opcode },
7271 { Bad_Opcode },
7272 { Bad_Opcode },
7273 /* 28 */
7274 { Bad_Opcode },
7275 { Bad_Opcode },
7276 { Bad_Opcode },
7277 { Bad_Opcode },
7278 { Bad_Opcode },
7279 { Bad_Opcode },
7280 { Bad_Opcode },
7281 { Bad_Opcode },
7282 /* 30 */
7283 { Bad_Opcode },
7284 { Bad_Opcode },
7285 { Bad_Opcode },
7286 { Bad_Opcode },
7287 { Bad_Opcode },
7288 { Bad_Opcode },
7289 { Bad_Opcode },
7290 { Bad_Opcode },
7291 /* 38 */
7292 { Bad_Opcode },
7293 { Bad_Opcode },
7294 { Bad_Opcode },
7295 { Bad_Opcode },
7296 { Bad_Opcode },
7297 { Bad_Opcode },
7298 { Bad_Opcode },
7299 { Bad_Opcode },
7300 /* 40 */
7301 { PREFIX_TABLE (PREFIX_0F3A40) },
7302 { PREFIX_TABLE (PREFIX_0F3A41) },
7303 { PREFIX_TABLE (PREFIX_0F3A42) },
7304 { Bad_Opcode },
7305 { PREFIX_TABLE (PREFIX_0F3A44) },
7306 { Bad_Opcode },
7307 { Bad_Opcode },
7308 { Bad_Opcode },
7309 /* 48 */
7310 { Bad_Opcode },
7311 { Bad_Opcode },
7312 { Bad_Opcode },
7313 { Bad_Opcode },
7314 { Bad_Opcode },
7315 { Bad_Opcode },
7316 { Bad_Opcode },
7317 { Bad_Opcode },
7318 /* 50 */
7319 { Bad_Opcode },
7320 { Bad_Opcode },
7321 { Bad_Opcode },
7322 { Bad_Opcode },
7323 { Bad_Opcode },
7324 { Bad_Opcode },
7325 { Bad_Opcode },
7326 { Bad_Opcode },
7327 /* 58 */
7328 { Bad_Opcode },
7329 { Bad_Opcode },
7330 { Bad_Opcode },
7331 { Bad_Opcode },
7332 { Bad_Opcode },
7333 { Bad_Opcode },
7334 { Bad_Opcode },
7335 { Bad_Opcode },
7336 /* 60 */
7337 { PREFIX_TABLE (PREFIX_0F3A60) },
7338 { PREFIX_TABLE (PREFIX_0F3A61) },
7339 { PREFIX_TABLE (PREFIX_0F3A62) },
7340 { PREFIX_TABLE (PREFIX_0F3A63) },
7341 { Bad_Opcode },
7342 { Bad_Opcode },
7343 { Bad_Opcode },
7344 { Bad_Opcode },
7345 /* 68 */
7346 { Bad_Opcode },
7347 { Bad_Opcode },
7348 { Bad_Opcode },
7349 { Bad_Opcode },
7350 { Bad_Opcode },
7351 { Bad_Opcode },
7352 { Bad_Opcode },
7353 { Bad_Opcode },
7354 /* 70 */
7355 { Bad_Opcode },
7356 { Bad_Opcode },
7357 { Bad_Opcode },
7358 { Bad_Opcode },
7359 { Bad_Opcode },
7360 { Bad_Opcode },
7361 { Bad_Opcode },
7362 { Bad_Opcode },
7363 /* 78 */
7364 { Bad_Opcode },
7365 { Bad_Opcode },
7366 { Bad_Opcode },
7367 { Bad_Opcode },
7368 { Bad_Opcode },
7369 { Bad_Opcode },
7370 { Bad_Opcode },
7371 { Bad_Opcode },
7372 /* 80 */
7373 { Bad_Opcode },
7374 { Bad_Opcode },
7375 { Bad_Opcode },
7376 { Bad_Opcode },
7377 { Bad_Opcode },
7378 { Bad_Opcode },
7379 { Bad_Opcode },
7380 { Bad_Opcode },
7381 /* 88 */
7382 { Bad_Opcode },
7383 { Bad_Opcode },
7384 { Bad_Opcode },
7385 { Bad_Opcode },
7386 { Bad_Opcode },
7387 { Bad_Opcode },
7388 { Bad_Opcode },
7389 { Bad_Opcode },
7390 /* 90 */
7391 { Bad_Opcode },
7392 { Bad_Opcode },
7393 { Bad_Opcode },
7394 { Bad_Opcode },
7395 { Bad_Opcode },
7396 { Bad_Opcode },
7397 { Bad_Opcode },
7398 { Bad_Opcode },
7399 /* 98 */
7400 { Bad_Opcode },
7401 { Bad_Opcode },
7402 { Bad_Opcode },
7403 { Bad_Opcode },
7404 { Bad_Opcode },
7405 { Bad_Opcode },
7406 { Bad_Opcode },
7407 { Bad_Opcode },
7408 /* a0 */
7409 { Bad_Opcode },
7410 { Bad_Opcode },
7411 { Bad_Opcode },
7412 { Bad_Opcode },
7413 { Bad_Opcode },
7414 { Bad_Opcode },
7415 { Bad_Opcode },
7416 { Bad_Opcode },
7417 /* a8 */
7418 { Bad_Opcode },
7419 { Bad_Opcode },
7420 { Bad_Opcode },
7421 { Bad_Opcode },
7422 { Bad_Opcode },
7423 { Bad_Opcode },
7424 { Bad_Opcode },
7425 { Bad_Opcode },
7426 /* b0 */
7427 { Bad_Opcode },
7428 { Bad_Opcode },
7429 { Bad_Opcode },
7430 { Bad_Opcode },
7431 { Bad_Opcode },
7432 { Bad_Opcode },
7433 { Bad_Opcode },
7434 { Bad_Opcode },
7435 /* b8 */
7436 { Bad_Opcode },
7437 { Bad_Opcode },
7438 { Bad_Opcode },
7439 { Bad_Opcode },
7440 { Bad_Opcode },
7441 { Bad_Opcode },
7442 { Bad_Opcode },
7443 { Bad_Opcode },
7444 /* c0 */
7445 { Bad_Opcode },
7446 { Bad_Opcode },
7447 { Bad_Opcode },
7448 { Bad_Opcode },
7449 { Bad_Opcode },
7450 { Bad_Opcode },
7451 { Bad_Opcode },
7452 { Bad_Opcode },
7453 /* c8 */
7454 { Bad_Opcode },
7455 { Bad_Opcode },
7456 { Bad_Opcode },
7457 { Bad_Opcode },
7458 { PREFIX_TABLE (PREFIX_0F3ACC) },
7459 { Bad_Opcode },
7460 { PREFIX_TABLE (PREFIX_0F3ACE) },
7461 { PREFIX_TABLE (PREFIX_0F3ACF) },
7462 /* d0 */
7463 { Bad_Opcode },
7464 { Bad_Opcode },
7465 { Bad_Opcode },
7466 { Bad_Opcode },
7467 { Bad_Opcode },
7468 { Bad_Opcode },
7469 { Bad_Opcode },
7470 { Bad_Opcode },
7471 /* d8 */
7472 { Bad_Opcode },
7473 { Bad_Opcode },
7474 { Bad_Opcode },
7475 { Bad_Opcode },
7476 { Bad_Opcode },
7477 { Bad_Opcode },
7478 { Bad_Opcode },
7479 { PREFIX_TABLE (PREFIX_0F3ADF) },
7480 /* e0 */
7481 { Bad_Opcode },
7482 { Bad_Opcode },
7483 { Bad_Opcode },
7484 { Bad_Opcode },
7485 { Bad_Opcode },
7486 { Bad_Opcode },
7487 { Bad_Opcode },
7488 { Bad_Opcode },
7489 /* e8 */
7490 { Bad_Opcode },
7491 { Bad_Opcode },
7492 { Bad_Opcode },
7493 { Bad_Opcode },
7494 { Bad_Opcode },
7495 { Bad_Opcode },
7496 { Bad_Opcode },
7497 { Bad_Opcode },
7498 /* f0 */
7499 { Bad_Opcode },
7500 { Bad_Opcode },
7501 { Bad_Opcode },
7502 { Bad_Opcode },
7503 { Bad_Opcode },
7504 { Bad_Opcode },
7505 { Bad_Opcode },
7506 { Bad_Opcode },
7507 /* f8 */
7508 { Bad_Opcode },
7509 { Bad_Opcode },
7510 { Bad_Opcode },
7511 { Bad_Opcode },
7512 { Bad_Opcode },
7513 { Bad_Opcode },
7514 { Bad_Opcode },
7515 { Bad_Opcode },
7516 },
7517 };
7518
7519 static const struct dis386 xop_table[][256] = {
7520 /* XOP_08 */
7521 {
7522 /* 00 */
7523 { Bad_Opcode },
7524 { Bad_Opcode },
7525 { Bad_Opcode },
7526 { Bad_Opcode },
7527 { Bad_Opcode },
7528 { Bad_Opcode },
7529 { Bad_Opcode },
7530 { Bad_Opcode },
7531 /* 08 */
7532 { Bad_Opcode },
7533 { Bad_Opcode },
7534 { Bad_Opcode },
7535 { Bad_Opcode },
7536 { Bad_Opcode },
7537 { Bad_Opcode },
7538 { Bad_Opcode },
7539 { Bad_Opcode },
7540 /* 10 */
7541 { Bad_Opcode },
7542 { Bad_Opcode },
7543 { Bad_Opcode },
7544 { Bad_Opcode },
7545 { Bad_Opcode },
7546 { Bad_Opcode },
7547 { Bad_Opcode },
7548 { Bad_Opcode },
7549 /* 18 */
7550 { Bad_Opcode },
7551 { Bad_Opcode },
7552 { Bad_Opcode },
7553 { Bad_Opcode },
7554 { Bad_Opcode },
7555 { Bad_Opcode },
7556 { Bad_Opcode },
7557 { Bad_Opcode },
7558 /* 20 */
7559 { Bad_Opcode },
7560 { Bad_Opcode },
7561 { Bad_Opcode },
7562 { Bad_Opcode },
7563 { Bad_Opcode },
7564 { Bad_Opcode },
7565 { Bad_Opcode },
7566 { Bad_Opcode },
7567 /* 28 */
7568 { Bad_Opcode },
7569 { Bad_Opcode },
7570 { Bad_Opcode },
7571 { Bad_Opcode },
7572 { Bad_Opcode },
7573 { Bad_Opcode },
7574 { Bad_Opcode },
7575 { Bad_Opcode },
7576 /* 30 */
7577 { Bad_Opcode },
7578 { Bad_Opcode },
7579 { Bad_Opcode },
7580 { Bad_Opcode },
7581 { Bad_Opcode },
7582 { Bad_Opcode },
7583 { Bad_Opcode },
7584 { Bad_Opcode },
7585 /* 38 */
7586 { Bad_Opcode },
7587 { Bad_Opcode },
7588 { Bad_Opcode },
7589 { Bad_Opcode },
7590 { Bad_Opcode },
7591 { Bad_Opcode },
7592 { Bad_Opcode },
7593 { Bad_Opcode },
7594 /* 40 */
7595 { Bad_Opcode },
7596 { Bad_Opcode },
7597 { Bad_Opcode },
7598 { Bad_Opcode },
7599 { Bad_Opcode },
7600 { Bad_Opcode },
7601 { Bad_Opcode },
7602 { Bad_Opcode },
7603 /* 48 */
7604 { Bad_Opcode },
7605 { Bad_Opcode },
7606 { Bad_Opcode },
7607 { Bad_Opcode },
7608 { Bad_Opcode },
7609 { Bad_Opcode },
7610 { Bad_Opcode },
7611 { Bad_Opcode },
7612 /* 50 */
7613 { Bad_Opcode },
7614 { Bad_Opcode },
7615 { Bad_Opcode },
7616 { Bad_Opcode },
7617 { Bad_Opcode },
7618 { Bad_Opcode },
7619 { Bad_Opcode },
7620 { Bad_Opcode },
7621 /* 58 */
7622 { Bad_Opcode },
7623 { Bad_Opcode },
7624 { Bad_Opcode },
7625 { Bad_Opcode },
7626 { Bad_Opcode },
7627 { Bad_Opcode },
7628 { Bad_Opcode },
7629 { Bad_Opcode },
7630 /* 60 */
7631 { Bad_Opcode },
7632 { Bad_Opcode },
7633 { Bad_Opcode },
7634 { Bad_Opcode },
7635 { Bad_Opcode },
7636 { Bad_Opcode },
7637 { Bad_Opcode },
7638 { Bad_Opcode },
7639 /* 68 */
7640 { Bad_Opcode },
7641 { Bad_Opcode },
7642 { Bad_Opcode },
7643 { Bad_Opcode },
7644 { Bad_Opcode },
7645 { Bad_Opcode },
7646 { Bad_Opcode },
7647 { Bad_Opcode },
7648 /* 70 */
7649 { Bad_Opcode },
7650 { Bad_Opcode },
7651 { Bad_Opcode },
7652 { Bad_Opcode },
7653 { Bad_Opcode },
7654 { Bad_Opcode },
7655 { Bad_Opcode },
7656 { Bad_Opcode },
7657 /* 78 */
7658 { Bad_Opcode },
7659 { Bad_Opcode },
7660 { Bad_Opcode },
7661 { Bad_Opcode },
7662 { Bad_Opcode },
7663 { Bad_Opcode },
7664 { Bad_Opcode },
7665 { Bad_Opcode },
7666 /* 80 */
7667 { Bad_Opcode },
7668 { Bad_Opcode },
7669 { Bad_Opcode },
7670 { Bad_Opcode },
7671 { Bad_Opcode },
7672 { "vpmacssww", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7673 { "vpmacsswd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7674 { "vpmacssdql", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7675 /* 88 */
7676 { Bad_Opcode },
7677 { Bad_Opcode },
7678 { Bad_Opcode },
7679 { Bad_Opcode },
7680 { Bad_Opcode },
7681 { Bad_Opcode },
7682 { "vpmacssdd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7683 { "vpmacssdqh", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7684 /* 90 */
7685 { Bad_Opcode },
7686 { Bad_Opcode },
7687 { Bad_Opcode },
7688 { Bad_Opcode },
7689 { Bad_Opcode },
7690 { "vpmacsww", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7691 { "vpmacswd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7692 { "vpmacsdql", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7693 /* 98 */
7694 { Bad_Opcode },
7695 { Bad_Opcode },
7696 { Bad_Opcode },
7697 { Bad_Opcode },
7698 { Bad_Opcode },
7699 { Bad_Opcode },
7700 { "vpmacsdd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7701 { "vpmacsdqh", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7702 /* a0 */
7703 { Bad_Opcode },
7704 { Bad_Opcode },
7705 { "vpcmov", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7706 { "vpperm", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7707 { Bad_Opcode },
7708 { Bad_Opcode },
7709 { "vpmadcsswd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7710 { Bad_Opcode },
7711 /* a8 */
7712 { Bad_Opcode },
7713 { Bad_Opcode },
7714 { Bad_Opcode },
7715 { Bad_Opcode },
7716 { Bad_Opcode },
7717 { Bad_Opcode },
7718 { Bad_Opcode },
7719 { Bad_Opcode },
7720 /* b0 */
7721 { Bad_Opcode },
7722 { Bad_Opcode },
7723 { Bad_Opcode },
7724 { Bad_Opcode },
7725 { Bad_Opcode },
7726 { Bad_Opcode },
7727 { "vpmadcswd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7728 { Bad_Opcode },
7729 /* b8 */
7730 { Bad_Opcode },
7731 { Bad_Opcode },
7732 { Bad_Opcode },
7733 { Bad_Opcode },
7734 { Bad_Opcode },
7735 { Bad_Opcode },
7736 { Bad_Opcode },
7737 { Bad_Opcode },
7738 /* c0 */
7739 { "vprotb", { XM, Vex_2src_1, Ib }, 0 },
7740 { "vprotw", { XM, Vex_2src_1, Ib }, 0 },
7741 { "vprotd", { XM, Vex_2src_1, Ib }, 0 },
7742 { "vprotq", { XM, Vex_2src_1, Ib }, 0 },
7743 { Bad_Opcode },
7744 { Bad_Opcode },
7745 { Bad_Opcode },
7746 { Bad_Opcode },
7747 /* c8 */
7748 { Bad_Opcode },
7749 { Bad_Opcode },
7750 { Bad_Opcode },
7751 { Bad_Opcode },
7752 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CC) },
7753 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CD) },
7754 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CE) },
7755 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CF) },
7756 /* d0 */
7757 { Bad_Opcode },
7758 { Bad_Opcode },
7759 { Bad_Opcode },
7760 { Bad_Opcode },
7761 { Bad_Opcode },
7762 { Bad_Opcode },
7763 { Bad_Opcode },
7764 { Bad_Opcode },
7765 /* d8 */
7766 { Bad_Opcode },
7767 { Bad_Opcode },
7768 { Bad_Opcode },
7769 { Bad_Opcode },
7770 { Bad_Opcode },
7771 { Bad_Opcode },
7772 { Bad_Opcode },
7773 { Bad_Opcode },
7774 /* e0 */
7775 { Bad_Opcode },
7776 { Bad_Opcode },
7777 { Bad_Opcode },
7778 { Bad_Opcode },
7779 { Bad_Opcode },
7780 { Bad_Opcode },
7781 { Bad_Opcode },
7782 { Bad_Opcode },
7783 /* e8 */
7784 { Bad_Opcode },
7785 { Bad_Opcode },
7786 { Bad_Opcode },
7787 { Bad_Opcode },
7788 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EC) },
7789 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_ED) },
7790 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EE) },
7791 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EF) },
7792 /* f0 */
7793 { Bad_Opcode },
7794 { Bad_Opcode },
7795 { Bad_Opcode },
7796 { Bad_Opcode },
7797 { Bad_Opcode },
7798 { Bad_Opcode },
7799 { Bad_Opcode },
7800 { Bad_Opcode },
7801 /* f8 */
7802 { Bad_Opcode },
7803 { Bad_Opcode },
7804 { Bad_Opcode },
7805 { Bad_Opcode },
7806 { Bad_Opcode },
7807 { Bad_Opcode },
7808 { Bad_Opcode },
7809 { Bad_Opcode },
7810 },
7811 /* XOP_09 */
7812 {
7813 /* 00 */
7814 { Bad_Opcode },
7815 { REG_TABLE (REG_XOP_TBM_01) },
7816 { REG_TABLE (REG_XOP_TBM_02) },
7817 { Bad_Opcode },
7818 { Bad_Opcode },
7819 { Bad_Opcode },
7820 { Bad_Opcode },
7821 { Bad_Opcode },
7822 /* 08 */
7823 { Bad_Opcode },
7824 { Bad_Opcode },
7825 { Bad_Opcode },
7826 { Bad_Opcode },
7827 { Bad_Opcode },
7828 { Bad_Opcode },
7829 { Bad_Opcode },
7830 { Bad_Opcode },
7831 /* 10 */
7832 { Bad_Opcode },
7833 { Bad_Opcode },
7834 { REG_TABLE (REG_XOP_LWPCB) },
7835 { Bad_Opcode },
7836 { Bad_Opcode },
7837 { Bad_Opcode },
7838 { Bad_Opcode },
7839 { Bad_Opcode },
7840 /* 18 */
7841 { Bad_Opcode },
7842 { Bad_Opcode },
7843 { Bad_Opcode },
7844 { Bad_Opcode },
7845 { Bad_Opcode },
7846 { Bad_Opcode },
7847 { Bad_Opcode },
7848 { Bad_Opcode },
7849 /* 20 */
7850 { Bad_Opcode },
7851 { Bad_Opcode },
7852 { Bad_Opcode },
7853 { Bad_Opcode },
7854 { Bad_Opcode },
7855 { Bad_Opcode },
7856 { Bad_Opcode },
7857 { Bad_Opcode },
7858 /* 28 */
7859 { Bad_Opcode },
7860 { Bad_Opcode },
7861 { Bad_Opcode },
7862 { Bad_Opcode },
7863 { Bad_Opcode },
7864 { Bad_Opcode },
7865 { Bad_Opcode },
7866 { Bad_Opcode },
7867 /* 30 */
7868 { Bad_Opcode },
7869 { Bad_Opcode },
7870 { Bad_Opcode },
7871 { Bad_Opcode },
7872 { Bad_Opcode },
7873 { Bad_Opcode },
7874 { Bad_Opcode },
7875 { Bad_Opcode },
7876 /* 38 */
7877 { Bad_Opcode },
7878 { Bad_Opcode },
7879 { Bad_Opcode },
7880 { Bad_Opcode },
7881 { Bad_Opcode },
7882 { Bad_Opcode },
7883 { Bad_Opcode },
7884 { Bad_Opcode },
7885 /* 40 */
7886 { Bad_Opcode },
7887 { Bad_Opcode },
7888 { Bad_Opcode },
7889 { Bad_Opcode },
7890 { Bad_Opcode },
7891 { Bad_Opcode },
7892 { Bad_Opcode },
7893 { Bad_Opcode },
7894 /* 48 */
7895 { Bad_Opcode },
7896 { Bad_Opcode },
7897 { Bad_Opcode },
7898 { Bad_Opcode },
7899 { Bad_Opcode },
7900 { Bad_Opcode },
7901 { Bad_Opcode },
7902 { Bad_Opcode },
7903 /* 50 */
7904 { Bad_Opcode },
7905 { Bad_Opcode },
7906 { Bad_Opcode },
7907 { Bad_Opcode },
7908 { Bad_Opcode },
7909 { Bad_Opcode },
7910 { Bad_Opcode },
7911 { Bad_Opcode },
7912 /* 58 */
7913 { Bad_Opcode },
7914 { Bad_Opcode },
7915 { Bad_Opcode },
7916 { Bad_Opcode },
7917 { Bad_Opcode },
7918 { Bad_Opcode },
7919 { Bad_Opcode },
7920 { Bad_Opcode },
7921 /* 60 */
7922 { Bad_Opcode },
7923 { Bad_Opcode },
7924 { Bad_Opcode },
7925 { Bad_Opcode },
7926 { Bad_Opcode },
7927 { Bad_Opcode },
7928 { Bad_Opcode },
7929 { Bad_Opcode },
7930 /* 68 */
7931 { Bad_Opcode },
7932 { Bad_Opcode },
7933 { Bad_Opcode },
7934 { Bad_Opcode },
7935 { Bad_Opcode },
7936 { Bad_Opcode },
7937 { Bad_Opcode },
7938 { Bad_Opcode },
7939 /* 70 */
7940 { Bad_Opcode },
7941 { Bad_Opcode },
7942 { Bad_Opcode },
7943 { Bad_Opcode },
7944 { Bad_Opcode },
7945 { Bad_Opcode },
7946 { Bad_Opcode },
7947 { Bad_Opcode },
7948 /* 78 */
7949 { Bad_Opcode },
7950 { Bad_Opcode },
7951 { Bad_Opcode },
7952 { Bad_Opcode },
7953 { Bad_Opcode },
7954 { Bad_Opcode },
7955 { Bad_Opcode },
7956 { Bad_Opcode },
7957 /* 80 */
7958 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_80) },
7959 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_81) },
7960 { "vfrczss", { XM, EXd }, 0 },
7961 { "vfrczsd", { XM, EXq }, 0 },
7962 { Bad_Opcode },
7963 { Bad_Opcode },
7964 { Bad_Opcode },
7965 { Bad_Opcode },
7966 /* 88 */
7967 { Bad_Opcode },
7968 { Bad_Opcode },
7969 { Bad_Opcode },
7970 { Bad_Opcode },
7971 { Bad_Opcode },
7972 { Bad_Opcode },
7973 { Bad_Opcode },
7974 { Bad_Opcode },
7975 /* 90 */
7976 { "vprotb", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
7977 { "vprotw", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
7978 { "vprotd", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
7979 { "vprotq", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
7980 { "vpshlb", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
7981 { "vpshlw", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
7982 { "vpshld", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
7983 { "vpshlq", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
7984 /* 98 */
7985 { "vpshab", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
7986 { "vpshaw", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
7987 { "vpshad", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
7988 { "vpshaq", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
7989 { Bad_Opcode },
7990 { Bad_Opcode },
7991 { Bad_Opcode },
7992 { Bad_Opcode },
7993 /* a0 */
7994 { Bad_Opcode },
7995 { Bad_Opcode },
7996 { Bad_Opcode },
7997 { Bad_Opcode },
7998 { Bad_Opcode },
7999 { Bad_Opcode },
8000 { Bad_Opcode },
8001 { Bad_Opcode },
8002 /* a8 */
8003 { Bad_Opcode },
8004 { Bad_Opcode },
8005 { Bad_Opcode },
8006 { Bad_Opcode },
8007 { Bad_Opcode },
8008 { Bad_Opcode },
8009 { Bad_Opcode },
8010 { Bad_Opcode },
8011 /* b0 */
8012 { Bad_Opcode },
8013 { Bad_Opcode },
8014 { Bad_Opcode },
8015 { Bad_Opcode },
8016 { Bad_Opcode },
8017 { Bad_Opcode },
8018 { Bad_Opcode },
8019 { Bad_Opcode },
8020 /* b8 */
8021 { Bad_Opcode },
8022 { Bad_Opcode },
8023 { Bad_Opcode },
8024 { Bad_Opcode },
8025 { Bad_Opcode },
8026 { Bad_Opcode },
8027 { Bad_Opcode },
8028 { Bad_Opcode },
8029 /* c0 */
8030 { Bad_Opcode },
8031 { "vphaddbw", { XM, EXxmm }, 0 },
8032 { "vphaddbd", { XM, EXxmm }, 0 },
8033 { "vphaddbq", { XM, EXxmm }, 0 },
8034 { Bad_Opcode },
8035 { Bad_Opcode },
8036 { "vphaddwd", { XM, EXxmm }, 0 },
8037 { "vphaddwq", { XM, EXxmm }, 0 },
8038 /* c8 */
8039 { Bad_Opcode },
8040 { Bad_Opcode },
8041 { Bad_Opcode },
8042 { "vphadddq", { XM, EXxmm }, 0 },
8043 { Bad_Opcode },
8044 { Bad_Opcode },
8045 { Bad_Opcode },
8046 { Bad_Opcode },
8047 /* d0 */
8048 { Bad_Opcode },
8049 { "vphaddubw", { XM, EXxmm }, 0 },
8050 { "vphaddubd", { XM, EXxmm }, 0 },
8051 { "vphaddubq", { XM, EXxmm }, 0 },
8052 { Bad_Opcode },
8053 { Bad_Opcode },
8054 { "vphadduwd", { XM, EXxmm }, 0 },
8055 { "vphadduwq", { XM, EXxmm }, 0 },
8056 /* d8 */
8057 { Bad_Opcode },
8058 { Bad_Opcode },
8059 { Bad_Opcode },
8060 { "vphaddudq", { XM, EXxmm }, 0 },
8061 { Bad_Opcode },
8062 { Bad_Opcode },
8063 { Bad_Opcode },
8064 { Bad_Opcode },
8065 /* e0 */
8066 { Bad_Opcode },
8067 { "vphsubbw", { XM, EXxmm }, 0 },
8068 { "vphsubwd", { XM, EXxmm }, 0 },
8069 { "vphsubdq", { XM, EXxmm }, 0 },
8070 { Bad_Opcode },
8071 { Bad_Opcode },
8072 { Bad_Opcode },
8073 { Bad_Opcode },
8074 /* e8 */
8075 { Bad_Opcode },
8076 { Bad_Opcode },
8077 { Bad_Opcode },
8078 { Bad_Opcode },
8079 { Bad_Opcode },
8080 { Bad_Opcode },
8081 { Bad_Opcode },
8082 { Bad_Opcode },
8083 /* f0 */
8084 { Bad_Opcode },
8085 { Bad_Opcode },
8086 { Bad_Opcode },
8087 { Bad_Opcode },
8088 { Bad_Opcode },
8089 { Bad_Opcode },
8090 { Bad_Opcode },
8091 { Bad_Opcode },
8092 /* f8 */
8093 { Bad_Opcode },
8094 { Bad_Opcode },
8095 { Bad_Opcode },
8096 { Bad_Opcode },
8097 { Bad_Opcode },
8098 { Bad_Opcode },
8099 { Bad_Opcode },
8100 { Bad_Opcode },
8101 },
8102 /* XOP_0A */
8103 {
8104 /* 00 */
8105 { Bad_Opcode },
8106 { Bad_Opcode },
8107 { Bad_Opcode },
8108 { Bad_Opcode },
8109 { Bad_Opcode },
8110 { Bad_Opcode },
8111 { Bad_Opcode },
8112 { Bad_Opcode },
8113 /* 08 */
8114 { Bad_Opcode },
8115 { Bad_Opcode },
8116 { Bad_Opcode },
8117 { Bad_Opcode },
8118 { Bad_Opcode },
8119 { Bad_Opcode },
8120 { Bad_Opcode },
8121 { Bad_Opcode },
8122 /* 10 */
8123 { "bextr", { Gv, Ev, Iq }, 0 },
8124 { Bad_Opcode },
8125 { REG_TABLE (REG_XOP_LWP) },
8126 { Bad_Opcode },
8127 { Bad_Opcode },
8128 { Bad_Opcode },
8129 { Bad_Opcode },
8130 { Bad_Opcode },
8131 /* 18 */
8132 { Bad_Opcode },
8133 { Bad_Opcode },
8134 { Bad_Opcode },
8135 { Bad_Opcode },
8136 { Bad_Opcode },
8137 { Bad_Opcode },
8138 { Bad_Opcode },
8139 { Bad_Opcode },
8140 /* 20 */
8141 { Bad_Opcode },
8142 { Bad_Opcode },
8143 { Bad_Opcode },
8144 { Bad_Opcode },
8145 { Bad_Opcode },
8146 { Bad_Opcode },
8147 { Bad_Opcode },
8148 { Bad_Opcode },
8149 /* 28 */
8150 { Bad_Opcode },
8151 { Bad_Opcode },
8152 { Bad_Opcode },
8153 { Bad_Opcode },
8154 { Bad_Opcode },
8155 { Bad_Opcode },
8156 { Bad_Opcode },
8157 { Bad_Opcode },
8158 /* 30 */
8159 { Bad_Opcode },
8160 { Bad_Opcode },
8161 { Bad_Opcode },
8162 { Bad_Opcode },
8163 { Bad_Opcode },
8164 { Bad_Opcode },
8165 { Bad_Opcode },
8166 { Bad_Opcode },
8167 /* 38 */
8168 { Bad_Opcode },
8169 { Bad_Opcode },
8170 { Bad_Opcode },
8171 { Bad_Opcode },
8172 { Bad_Opcode },
8173 { Bad_Opcode },
8174 { Bad_Opcode },
8175 { Bad_Opcode },
8176 /* 40 */
8177 { Bad_Opcode },
8178 { Bad_Opcode },
8179 { Bad_Opcode },
8180 { Bad_Opcode },
8181 { Bad_Opcode },
8182 { Bad_Opcode },
8183 { Bad_Opcode },
8184 { Bad_Opcode },
8185 /* 48 */
8186 { Bad_Opcode },
8187 { Bad_Opcode },
8188 { Bad_Opcode },
8189 { Bad_Opcode },
8190 { Bad_Opcode },
8191 { Bad_Opcode },
8192 { Bad_Opcode },
8193 { Bad_Opcode },
8194 /* 50 */
8195 { Bad_Opcode },
8196 { Bad_Opcode },
8197 { Bad_Opcode },
8198 { Bad_Opcode },
8199 { Bad_Opcode },
8200 { Bad_Opcode },
8201 { Bad_Opcode },
8202 { Bad_Opcode },
8203 /* 58 */
8204 { Bad_Opcode },
8205 { Bad_Opcode },
8206 { Bad_Opcode },
8207 { Bad_Opcode },
8208 { Bad_Opcode },
8209 { Bad_Opcode },
8210 { Bad_Opcode },
8211 { Bad_Opcode },
8212 /* 60 */
8213 { Bad_Opcode },
8214 { Bad_Opcode },
8215 { Bad_Opcode },
8216 { Bad_Opcode },
8217 { Bad_Opcode },
8218 { Bad_Opcode },
8219 { Bad_Opcode },
8220 { Bad_Opcode },
8221 /* 68 */
8222 { Bad_Opcode },
8223 { Bad_Opcode },
8224 { Bad_Opcode },
8225 { Bad_Opcode },
8226 { Bad_Opcode },
8227 { Bad_Opcode },
8228 { Bad_Opcode },
8229 { Bad_Opcode },
8230 /* 70 */
8231 { Bad_Opcode },
8232 { Bad_Opcode },
8233 { Bad_Opcode },
8234 { Bad_Opcode },
8235 { Bad_Opcode },
8236 { Bad_Opcode },
8237 { Bad_Opcode },
8238 { Bad_Opcode },
8239 /* 78 */
8240 { Bad_Opcode },
8241 { Bad_Opcode },
8242 { Bad_Opcode },
8243 { Bad_Opcode },
8244 { Bad_Opcode },
8245 { Bad_Opcode },
8246 { Bad_Opcode },
8247 { Bad_Opcode },
8248 /* 80 */
8249 { Bad_Opcode },
8250 { Bad_Opcode },
8251 { Bad_Opcode },
8252 { Bad_Opcode },
8253 { Bad_Opcode },
8254 { Bad_Opcode },
8255 { Bad_Opcode },
8256 { Bad_Opcode },
8257 /* 88 */
8258 { Bad_Opcode },
8259 { Bad_Opcode },
8260 { Bad_Opcode },
8261 { Bad_Opcode },
8262 { Bad_Opcode },
8263 { Bad_Opcode },
8264 { Bad_Opcode },
8265 { Bad_Opcode },
8266 /* 90 */
8267 { Bad_Opcode },
8268 { Bad_Opcode },
8269 { Bad_Opcode },
8270 { Bad_Opcode },
8271 { Bad_Opcode },
8272 { Bad_Opcode },
8273 { Bad_Opcode },
8274 { Bad_Opcode },
8275 /* 98 */
8276 { Bad_Opcode },
8277 { Bad_Opcode },
8278 { Bad_Opcode },
8279 { Bad_Opcode },
8280 { Bad_Opcode },
8281 { Bad_Opcode },
8282 { Bad_Opcode },
8283 { Bad_Opcode },
8284 /* a0 */
8285 { Bad_Opcode },
8286 { Bad_Opcode },
8287 { Bad_Opcode },
8288 { Bad_Opcode },
8289 { Bad_Opcode },
8290 { Bad_Opcode },
8291 { Bad_Opcode },
8292 { Bad_Opcode },
8293 /* a8 */
8294 { Bad_Opcode },
8295 { Bad_Opcode },
8296 { Bad_Opcode },
8297 { Bad_Opcode },
8298 { Bad_Opcode },
8299 { Bad_Opcode },
8300 { Bad_Opcode },
8301 { Bad_Opcode },
8302 /* b0 */
8303 { Bad_Opcode },
8304 { Bad_Opcode },
8305 { Bad_Opcode },
8306 { Bad_Opcode },
8307 { Bad_Opcode },
8308 { Bad_Opcode },
8309 { Bad_Opcode },
8310 { Bad_Opcode },
8311 /* b8 */
8312 { Bad_Opcode },
8313 { Bad_Opcode },
8314 { Bad_Opcode },
8315 { Bad_Opcode },
8316 { Bad_Opcode },
8317 { Bad_Opcode },
8318 { Bad_Opcode },
8319 { Bad_Opcode },
8320 /* c0 */
8321 { Bad_Opcode },
8322 { Bad_Opcode },
8323 { Bad_Opcode },
8324 { Bad_Opcode },
8325 { Bad_Opcode },
8326 { Bad_Opcode },
8327 { Bad_Opcode },
8328 { Bad_Opcode },
8329 /* c8 */
8330 { Bad_Opcode },
8331 { Bad_Opcode },
8332 { Bad_Opcode },
8333 { Bad_Opcode },
8334 { Bad_Opcode },
8335 { Bad_Opcode },
8336 { Bad_Opcode },
8337 { Bad_Opcode },
8338 /* d0 */
8339 { Bad_Opcode },
8340 { Bad_Opcode },
8341 { Bad_Opcode },
8342 { Bad_Opcode },
8343 { Bad_Opcode },
8344 { Bad_Opcode },
8345 { Bad_Opcode },
8346 { Bad_Opcode },
8347 /* d8 */
8348 { Bad_Opcode },
8349 { Bad_Opcode },
8350 { Bad_Opcode },
8351 { Bad_Opcode },
8352 { Bad_Opcode },
8353 { Bad_Opcode },
8354 { Bad_Opcode },
8355 { Bad_Opcode },
8356 /* e0 */
8357 { Bad_Opcode },
8358 { Bad_Opcode },
8359 { Bad_Opcode },
8360 { Bad_Opcode },
8361 { Bad_Opcode },
8362 { Bad_Opcode },
8363 { Bad_Opcode },
8364 { Bad_Opcode },
8365 /* e8 */
8366 { Bad_Opcode },
8367 { Bad_Opcode },
8368 { Bad_Opcode },
8369 { Bad_Opcode },
8370 { Bad_Opcode },
8371 { Bad_Opcode },
8372 { Bad_Opcode },
8373 { Bad_Opcode },
8374 /* f0 */
8375 { Bad_Opcode },
8376 { Bad_Opcode },
8377 { Bad_Opcode },
8378 { Bad_Opcode },
8379 { Bad_Opcode },
8380 { Bad_Opcode },
8381 { Bad_Opcode },
8382 { Bad_Opcode },
8383 /* f8 */
8384 { Bad_Opcode },
8385 { Bad_Opcode },
8386 { Bad_Opcode },
8387 { Bad_Opcode },
8388 { Bad_Opcode },
8389 { Bad_Opcode },
8390 { Bad_Opcode },
8391 { Bad_Opcode },
8392 },
8393 };
8394
8395 static const struct dis386 vex_table[][256] = {
8396 /* VEX_0F */
8397 {
8398 /* 00 */
8399 { Bad_Opcode },
8400 { Bad_Opcode },
8401 { Bad_Opcode },
8402 { Bad_Opcode },
8403 { Bad_Opcode },
8404 { Bad_Opcode },
8405 { Bad_Opcode },
8406 { Bad_Opcode },
8407 /* 08 */
8408 { Bad_Opcode },
8409 { Bad_Opcode },
8410 { Bad_Opcode },
8411 { Bad_Opcode },
8412 { Bad_Opcode },
8413 { Bad_Opcode },
8414 { Bad_Opcode },
8415 { Bad_Opcode },
8416 /* 10 */
8417 { PREFIX_TABLE (PREFIX_VEX_0F10) },
8418 { PREFIX_TABLE (PREFIX_VEX_0F11) },
8419 { PREFIX_TABLE (PREFIX_VEX_0F12) },
8420 { MOD_TABLE (MOD_VEX_0F13) },
8421 { "vunpcklpX", { XM, Vex, EXx }, 0 },
8422 { "vunpckhpX", { XM, Vex, EXx }, 0 },
8423 { PREFIX_TABLE (PREFIX_VEX_0F16) },
8424 { MOD_TABLE (MOD_VEX_0F17) },
8425 /* 18 */
8426 { Bad_Opcode },
8427 { Bad_Opcode },
8428 { Bad_Opcode },
8429 { Bad_Opcode },
8430 { Bad_Opcode },
8431 { Bad_Opcode },
8432 { Bad_Opcode },
8433 { Bad_Opcode },
8434 /* 20 */
8435 { Bad_Opcode },
8436 { Bad_Opcode },
8437 { Bad_Opcode },
8438 { Bad_Opcode },
8439 { Bad_Opcode },
8440 { Bad_Opcode },
8441 { Bad_Opcode },
8442 { Bad_Opcode },
8443 /* 28 */
8444 { "vmovapX", { XM, EXx }, 0 },
8445 { "vmovapX", { EXxS, XM }, 0 },
8446 { PREFIX_TABLE (PREFIX_VEX_0F2A) },
8447 { MOD_TABLE (MOD_VEX_0F2B) },
8448 { PREFIX_TABLE (PREFIX_VEX_0F2C) },
8449 { PREFIX_TABLE (PREFIX_VEX_0F2D) },
8450 { PREFIX_TABLE (PREFIX_VEX_0F2E) },
8451 { PREFIX_TABLE (PREFIX_VEX_0F2F) },
8452 /* 30 */
8453 { Bad_Opcode },
8454 { Bad_Opcode },
8455 { Bad_Opcode },
8456 { Bad_Opcode },
8457 { Bad_Opcode },
8458 { Bad_Opcode },
8459 { Bad_Opcode },
8460 { Bad_Opcode },
8461 /* 38 */
8462 { Bad_Opcode },
8463 { Bad_Opcode },
8464 { Bad_Opcode },
8465 { Bad_Opcode },
8466 { Bad_Opcode },
8467 { Bad_Opcode },
8468 { Bad_Opcode },
8469 { Bad_Opcode },
8470 /* 40 */
8471 { Bad_Opcode },
8472 { PREFIX_TABLE (PREFIX_VEX_0F41) },
8473 { PREFIX_TABLE (PREFIX_VEX_0F42) },
8474 { Bad_Opcode },
8475 { PREFIX_TABLE (PREFIX_VEX_0F44) },
8476 { PREFIX_TABLE (PREFIX_VEX_0F45) },
8477 { PREFIX_TABLE (PREFIX_VEX_0F46) },
8478 { PREFIX_TABLE (PREFIX_VEX_0F47) },
8479 /* 48 */
8480 { Bad_Opcode },
8481 { Bad_Opcode },
8482 { PREFIX_TABLE (PREFIX_VEX_0F4A) },
8483 { PREFIX_TABLE (PREFIX_VEX_0F4B) },
8484 { Bad_Opcode },
8485 { Bad_Opcode },
8486 { Bad_Opcode },
8487 { Bad_Opcode },
8488 /* 50 */
8489 { MOD_TABLE (MOD_VEX_0F50) },
8490 { PREFIX_TABLE (PREFIX_VEX_0F51) },
8491 { PREFIX_TABLE (PREFIX_VEX_0F52) },
8492 { PREFIX_TABLE (PREFIX_VEX_0F53) },
8493 { "vandpX", { XM, Vex, EXx }, 0 },
8494 { "vandnpX", { XM, Vex, EXx }, 0 },
8495 { "vorpX", { XM, Vex, EXx }, 0 },
8496 { "vxorpX", { XM, Vex, EXx }, 0 },
8497 /* 58 */
8498 { PREFIX_TABLE (PREFIX_VEX_0F58) },
8499 { PREFIX_TABLE (PREFIX_VEX_0F59) },
8500 { PREFIX_TABLE (PREFIX_VEX_0F5A) },
8501 { PREFIX_TABLE (PREFIX_VEX_0F5B) },
8502 { PREFIX_TABLE (PREFIX_VEX_0F5C) },
8503 { PREFIX_TABLE (PREFIX_VEX_0F5D) },
8504 { PREFIX_TABLE (PREFIX_VEX_0F5E) },
8505 { PREFIX_TABLE (PREFIX_VEX_0F5F) },
8506 /* 60 */
8507 { PREFIX_TABLE (PREFIX_VEX_0F60) },
8508 { PREFIX_TABLE (PREFIX_VEX_0F61) },
8509 { PREFIX_TABLE (PREFIX_VEX_0F62) },
8510 { PREFIX_TABLE (PREFIX_VEX_0F63) },
8511 { PREFIX_TABLE (PREFIX_VEX_0F64) },
8512 { PREFIX_TABLE (PREFIX_VEX_0F65) },
8513 { PREFIX_TABLE (PREFIX_VEX_0F66) },
8514 { PREFIX_TABLE (PREFIX_VEX_0F67) },
8515 /* 68 */
8516 { PREFIX_TABLE (PREFIX_VEX_0F68) },
8517 { PREFIX_TABLE (PREFIX_VEX_0F69) },
8518 { PREFIX_TABLE (PREFIX_VEX_0F6A) },
8519 { PREFIX_TABLE (PREFIX_VEX_0F6B) },
8520 { PREFIX_TABLE (PREFIX_VEX_0F6C) },
8521 { PREFIX_TABLE (PREFIX_VEX_0F6D) },
8522 { PREFIX_TABLE (PREFIX_VEX_0F6E) },
8523 { PREFIX_TABLE (PREFIX_VEX_0F6F) },
8524 /* 70 */
8525 { PREFIX_TABLE (PREFIX_VEX_0F70) },
8526 { REG_TABLE (REG_VEX_0F71) },
8527 { REG_TABLE (REG_VEX_0F72) },
8528 { REG_TABLE (REG_VEX_0F73) },
8529 { PREFIX_TABLE (PREFIX_VEX_0F74) },
8530 { PREFIX_TABLE (PREFIX_VEX_0F75) },
8531 { PREFIX_TABLE (PREFIX_VEX_0F76) },
8532 { PREFIX_TABLE (PREFIX_VEX_0F77) },
8533 /* 78 */
8534 { Bad_Opcode },
8535 { Bad_Opcode },
8536 { Bad_Opcode },
8537 { Bad_Opcode },
8538 { PREFIX_TABLE (PREFIX_VEX_0F7C) },
8539 { PREFIX_TABLE (PREFIX_VEX_0F7D) },
8540 { PREFIX_TABLE (PREFIX_VEX_0F7E) },
8541 { PREFIX_TABLE (PREFIX_VEX_0F7F) },
8542 /* 80 */
8543 { Bad_Opcode },
8544 { Bad_Opcode },
8545 { Bad_Opcode },
8546 { Bad_Opcode },
8547 { Bad_Opcode },
8548 { Bad_Opcode },
8549 { Bad_Opcode },
8550 { Bad_Opcode },
8551 /* 88 */
8552 { Bad_Opcode },
8553 { Bad_Opcode },
8554 { Bad_Opcode },
8555 { Bad_Opcode },
8556 { Bad_Opcode },
8557 { Bad_Opcode },
8558 { Bad_Opcode },
8559 { Bad_Opcode },
8560 /* 90 */
8561 { PREFIX_TABLE (PREFIX_VEX_0F90) },
8562 { PREFIX_TABLE (PREFIX_VEX_0F91) },
8563 { PREFIX_TABLE (PREFIX_VEX_0F92) },
8564 { PREFIX_TABLE (PREFIX_VEX_0F93) },
8565 { Bad_Opcode },
8566 { Bad_Opcode },
8567 { Bad_Opcode },
8568 { Bad_Opcode },
8569 /* 98 */
8570 { PREFIX_TABLE (PREFIX_VEX_0F98) },
8571 { PREFIX_TABLE (PREFIX_VEX_0F99) },
8572 { Bad_Opcode },
8573 { Bad_Opcode },
8574 { Bad_Opcode },
8575 { Bad_Opcode },
8576 { Bad_Opcode },
8577 { Bad_Opcode },
8578 /* a0 */
8579 { Bad_Opcode },
8580 { Bad_Opcode },
8581 { Bad_Opcode },
8582 { Bad_Opcode },
8583 { Bad_Opcode },
8584 { Bad_Opcode },
8585 { Bad_Opcode },
8586 { Bad_Opcode },
8587 /* a8 */
8588 { Bad_Opcode },
8589 { Bad_Opcode },
8590 { Bad_Opcode },
8591 { Bad_Opcode },
8592 { Bad_Opcode },
8593 { Bad_Opcode },
8594 { REG_TABLE (REG_VEX_0FAE) },
8595 { Bad_Opcode },
8596 /* b0 */
8597 { Bad_Opcode },
8598 { Bad_Opcode },
8599 { Bad_Opcode },
8600 { Bad_Opcode },
8601 { Bad_Opcode },
8602 { Bad_Opcode },
8603 { Bad_Opcode },
8604 { Bad_Opcode },
8605 /* b8 */
8606 { Bad_Opcode },
8607 { Bad_Opcode },
8608 { Bad_Opcode },
8609 { Bad_Opcode },
8610 { Bad_Opcode },
8611 { Bad_Opcode },
8612 { Bad_Opcode },
8613 { Bad_Opcode },
8614 /* c0 */
8615 { Bad_Opcode },
8616 { Bad_Opcode },
8617 { PREFIX_TABLE (PREFIX_VEX_0FC2) },
8618 { Bad_Opcode },
8619 { PREFIX_TABLE (PREFIX_VEX_0FC4) },
8620 { PREFIX_TABLE (PREFIX_VEX_0FC5) },
8621 { "vshufpX", { XM, Vex, EXx, Ib }, 0 },
8622 { Bad_Opcode },
8623 /* c8 */
8624 { Bad_Opcode },
8625 { Bad_Opcode },
8626 { Bad_Opcode },
8627 { Bad_Opcode },
8628 { Bad_Opcode },
8629 { Bad_Opcode },
8630 { Bad_Opcode },
8631 { Bad_Opcode },
8632 /* d0 */
8633 { PREFIX_TABLE (PREFIX_VEX_0FD0) },
8634 { PREFIX_TABLE (PREFIX_VEX_0FD1) },
8635 { PREFIX_TABLE (PREFIX_VEX_0FD2) },
8636 { PREFIX_TABLE (PREFIX_VEX_0FD3) },
8637 { PREFIX_TABLE (PREFIX_VEX_0FD4) },
8638 { PREFIX_TABLE (PREFIX_VEX_0FD5) },
8639 { PREFIX_TABLE (PREFIX_VEX_0FD6) },
8640 { PREFIX_TABLE (PREFIX_VEX_0FD7) },
8641 /* d8 */
8642 { PREFIX_TABLE (PREFIX_VEX_0FD8) },
8643 { PREFIX_TABLE (PREFIX_VEX_0FD9) },
8644 { PREFIX_TABLE (PREFIX_VEX_0FDA) },
8645 { PREFIX_TABLE (PREFIX_VEX_0FDB) },
8646 { PREFIX_TABLE (PREFIX_VEX_0FDC) },
8647 { PREFIX_TABLE (PREFIX_VEX_0FDD) },
8648 { PREFIX_TABLE (PREFIX_VEX_0FDE) },
8649 { PREFIX_TABLE (PREFIX_VEX_0FDF) },
8650 /* e0 */
8651 { PREFIX_TABLE (PREFIX_VEX_0FE0) },
8652 { PREFIX_TABLE (PREFIX_VEX_0FE1) },
8653 { PREFIX_TABLE (PREFIX_VEX_0FE2) },
8654 { PREFIX_TABLE (PREFIX_VEX_0FE3) },
8655 { PREFIX_TABLE (PREFIX_VEX_0FE4) },
8656 { PREFIX_TABLE (PREFIX_VEX_0FE5) },
8657 { PREFIX_TABLE (PREFIX_VEX_0FE6) },
8658 { PREFIX_TABLE (PREFIX_VEX_0FE7) },
8659 /* e8 */
8660 { PREFIX_TABLE (PREFIX_VEX_0FE8) },
8661 { PREFIX_TABLE (PREFIX_VEX_0FE9) },
8662 { PREFIX_TABLE (PREFIX_VEX_0FEA) },
8663 { PREFIX_TABLE (PREFIX_VEX_0FEB) },
8664 { PREFIX_TABLE (PREFIX_VEX_0FEC) },
8665 { PREFIX_TABLE (PREFIX_VEX_0FED) },
8666 { PREFIX_TABLE (PREFIX_VEX_0FEE) },
8667 { PREFIX_TABLE (PREFIX_VEX_0FEF) },
8668 /* f0 */
8669 { PREFIX_TABLE (PREFIX_VEX_0FF0) },
8670 { PREFIX_TABLE (PREFIX_VEX_0FF1) },
8671 { PREFIX_TABLE (PREFIX_VEX_0FF2) },
8672 { PREFIX_TABLE (PREFIX_VEX_0FF3) },
8673 { PREFIX_TABLE (PREFIX_VEX_0FF4) },
8674 { PREFIX_TABLE (PREFIX_VEX_0FF5) },
8675 { PREFIX_TABLE (PREFIX_VEX_0FF6) },
8676 { PREFIX_TABLE (PREFIX_VEX_0FF7) },
8677 /* f8 */
8678 { PREFIX_TABLE (PREFIX_VEX_0FF8) },
8679 { PREFIX_TABLE (PREFIX_VEX_0FF9) },
8680 { PREFIX_TABLE (PREFIX_VEX_0FFA) },
8681 { PREFIX_TABLE (PREFIX_VEX_0FFB) },
8682 { PREFIX_TABLE (PREFIX_VEX_0FFC) },
8683 { PREFIX_TABLE (PREFIX_VEX_0FFD) },
8684 { PREFIX_TABLE (PREFIX_VEX_0FFE) },
8685 { Bad_Opcode },
8686 },
8687 /* VEX_0F38 */
8688 {
8689 /* 00 */
8690 { PREFIX_TABLE (PREFIX_VEX_0F3800) },
8691 { PREFIX_TABLE (PREFIX_VEX_0F3801) },
8692 { PREFIX_TABLE (PREFIX_VEX_0F3802) },
8693 { PREFIX_TABLE (PREFIX_VEX_0F3803) },
8694 { PREFIX_TABLE (PREFIX_VEX_0F3804) },
8695 { PREFIX_TABLE (PREFIX_VEX_0F3805) },
8696 { PREFIX_TABLE (PREFIX_VEX_0F3806) },
8697 { PREFIX_TABLE (PREFIX_VEX_0F3807) },
8698 /* 08 */
8699 { PREFIX_TABLE (PREFIX_VEX_0F3808) },
8700 { PREFIX_TABLE (PREFIX_VEX_0F3809) },
8701 { PREFIX_TABLE (PREFIX_VEX_0F380A) },
8702 { PREFIX_TABLE (PREFIX_VEX_0F380B) },
8703 { PREFIX_TABLE (PREFIX_VEX_0F380C) },
8704 { PREFIX_TABLE (PREFIX_VEX_0F380D) },
8705 { PREFIX_TABLE (PREFIX_VEX_0F380E) },
8706 { PREFIX_TABLE (PREFIX_VEX_0F380F) },
8707 /* 10 */
8708 { Bad_Opcode },
8709 { Bad_Opcode },
8710 { Bad_Opcode },
8711 { PREFIX_TABLE (PREFIX_VEX_0F3813) },
8712 { Bad_Opcode },
8713 { Bad_Opcode },
8714 { PREFIX_TABLE (PREFIX_VEX_0F3816) },
8715 { PREFIX_TABLE (PREFIX_VEX_0F3817) },
8716 /* 18 */
8717 { PREFIX_TABLE (PREFIX_VEX_0F3818) },
8718 { PREFIX_TABLE (PREFIX_VEX_0F3819) },
8719 { PREFIX_TABLE (PREFIX_VEX_0F381A) },
8720 { Bad_Opcode },
8721 { PREFIX_TABLE (PREFIX_VEX_0F381C) },
8722 { PREFIX_TABLE (PREFIX_VEX_0F381D) },
8723 { PREFIX_TABLE (PREFIX_VEX_0F381E) },
8724 { Bad_Opcode },
8725 /* 20 */
8726 { PREFIX_TABLE (PREFIX_VEX_0F3820) },
8727 { PREFIX_TABLE (PREFIX_VEX_0F3821) },
8728 { PREFIX_TABLE (PREFIX_VEX_0F3822) },
8729 { PREFIX_TABLE (PREFIX_VEX_0F3823) },
8730 { PREFIX_TABLE (PREFIX_VEX_0F3824) },
8731 { PREFIX_TABLE (PREFIX_VEX_0F3825) },
8732 { Bad_Opcode },
8733 { Bad_Opcode },
8734 /* 28 */
8735 { PREFIX_TABLE (PREFIX_VEX_0F3828) },
8736 { PREFIX_TABLE (PREFIX_VEX_0F3829) },
8737 { PREFIX_TABLE (PREFIX_VEX_0F382A) },
8738 { PREFIX_TABLE (PREFIX_VEX_0F382B) },
8739 { PREFIX_TABLE (PREFIX_VEX_0F382C) },
8740 { PREFIX_TABLE (PREFIX_VEX_0F382D) },
8741 { PREFIX_TABLE (PREFIX_VEX_0F382E) },
8742 { PREFIX_TABLE (PREFIX_VEX_0F382F) },
8743 /* 30 */
8744 { PREFIX_TABLE (PREFIX_VEX_0F3830) },
8745 { PREFIX_TABLE (PREFIX_VEX_0F3831) },
8746 { PREFIX_TABLE (PREFIX_VEX_0F3832) },
8747 { PREFIX_TABLE (PREFIX_VEX_0F3833) },
8748 { PREFIX_TABLE (PREFIX_VEX_0F3834) },
8749 { PREFIX_TABLE (PREFIX_VEX_0F3835) },
8750 { PREFIX_TABLE (PREFIX_VEX_0F3836) },
8751 { PREFIX_TABLE (PREFIX_VEX_0F3837) },
8752 /* 38 */
8753 { PREFIX_TABLE (PREFIX_VEX_0F3838) },
8754 { PREFIX_TABLE (PREFIX_VEX_0F3839) },
8755 { PREFIX_TABLE (PREFIX_VEX_0F383A) },
8756 { PREFIX_TABLE (PREFIX_VEX_0F383B) },
8757 { PREFIX_TABLE (PREFIX_VEX_0F383C) },
8758 { PREFIX_TABLE (PREFIX_VEX_0F383D) },
8759 { PREFIX_TABLE (PREFIX_VEX_0F383E) },
8760 { PREFIX_TABLE (PREFIX_VEX_0F383F) },
8761 /* 40 */
8762 { PREFIX_TABLE (PREFIX_VEX_0F3840) },
8763 { PREFIX_TABLE (PREFIX_VEX_0F3841) },
8764 { Bad_Opcode },
8765 { Bad_Opcode },
8766 { Bad_Opcode },
8767 { PREFIX_TABLE (PREFIX_VEX_0F3845) },
8768 { PREFIX_TABLE (PREFIX_VEX_0F3846) },
8769 { PREFIX_TABLE (PREFIX_VEX_0F3847) },
8770 /* 48 */
8771 { Bad_Opcode },
8772 { Bad_Opcode },
8773 { Bad_Opcode },
8774 { Bad_Opcode },
8775 { Bad_Opcode },
8776 { Bad_Opcode },
8777 { Bad_Opcode },
8778 { Bad_Opcode },
8779 /* 50 */
8780 { Bad_Opcode },
8781 { Bad_Opcode },
8782 { Bad_Opcode },
8783 { Bad_Opcode },
8784 { Bad_Opcode },
8785 { Bad_Opcode },
8786 { Bad_Opcode },
8787 { Bad_Opcode },
8788 /* 58 */
8789 { PREFIX_TABLE (PREFIX_VEX_0F3858) },
8790 { PREFIX_TABLE (PREFIX_VEX_0F3859) },
8791 { PREFIX_TABLE (PREFIX_VEX_0F385A) },
8792 { Bad_Opcode },
8793 { Bad_Opcode },
8794 { Bad_Opcode },
8795 { Bad_Opcode },
8796 { Bad_Opcode },
8797 /* 60 */
8798 { Bad_Opcode },
8799 { Bad_Opcode },
8800 { Bad_Opcode },
8801 { Bad_Opcode },
8802 { Bad_Opcode },
8803 { Bad_Opcode },
8804 { Bad_Opcode },
8805 { Bad_Opcode },
8806 /* 68 */
8807 { Bad_Opcode },
8808 { Bad_Opcode },
8809 { Bad_Opcode },
8810 { Bad_Opcode },
8811 { Bad_Opcode },
8812 { Bad_Opcode },
8813 { Bad_Opcode },
8814 { Bad_Opcode },
8815 /* 70 */
8816 { Bad_Opcode },
8817 { Bad_Opcode },
8818 { Bad_Opcode },
8819 { Bad_Opcode },
8820 { Bad_Opcode },
8821 { Bad_Opcode },
8822 { Bad_Opcode },
8823 { Bad_Opcode },
8824 /* 78 */
8825 { PREFIX_TABLE (PREFIX_VEX_0F3878) },
8826 { PREFIX_TABLE (PREFIX_VEX_0F3879) },
8827 { Bad_Opcode },
8828 { Bad_Opcode },
8829 { Bad_Opcode },
8830 { Bad_Opcode },
8831 { Bad_Opcode },
8832 { Bad_Opcode },
8833 /* 80 */
8834 { Bad_Opcode },
8835 { Bad_Opcode },
8836 { Bad_Opcode },
8837 { Bad_Opcode },
8838 { Bad_Opcode },
8839 { Bad_Opcode },
8840 { Bad_Opcode },
8841 { Bad_Opcode },
8842 /* 88 */
8843 { Bad_Opcode },
8844 { Bad_Opcode },
8845 { Bad_Opcode },
8846 { Bad_Opcode },
8847 { PREFIX_TABLE (PREFIX_VEX_0F388C) },
8848 { Bad_Opcode },
8849 { PREFIX_TABLE (PREFIX_VEX_0F388E) },
8850 { Bad_Opcode },
8851 /* 90 */
8852 { PREFIX_TABLE (PREFIX_VEX_0F3890) },
8853 { PREFIX_TABLE (PREFIX_VEX_0F3891) },
8854 { PREFIX_TABLE (PREFIX_VEX_0F3892) },
8855 { PREFIX_TABLE (PREFIX_VEX_0F3893) },
8856 { Bad_Opcode },
8857 { Bad_Opcode },
8858 { PREFIX_TABLE (PREFIX_VEX_0F3896) },
8859 { PREFIX_TABLE (PREFIX_VEX_0F3897) },
8860 /* 98 */
8861 { PREFIX_TABLE (PREFIX_VEX_0F3898) },
8862 { PREFIX_TABLE (PREFIX_VEX_0F3899) },
8863 { PREFIX_TABLE (PREFIX_VEX_0F389A) },
8864 { PREFIX_TABLE (PREFIX_VEX_0F389B) },
8865 { PREFIX_TABLE (PREFIX_VEX_0F389C) },
8866 { PREFIX_TABLE (PREFIX_VEX_0F389D) },
8867 { PREFIX_TABLE (PREFIX_VEX_0F389E) },
8868 { PREFIX_TABLE (PREFIX_VEX_0F389F) },
8869 /* a0 */
8870 { Bad_Opcode },
8871 { Bad_Opcode },
8872 { Bad_Opcode },
8873 { Bad_Opcode },
8874 { Bad_Opcode },
8875 { Bad_Opcode },
8876 { PREFIX_TABLE (PREFIX_VEX_0F38A6) },
8877 { PREFIX_TABLE (PREFIX_VEX_0F38A7) },
8878 /* a8 */
8879 { PREFIX_TABLE (PREFIX_VEX_0F38A8) },
8880 { PREFIX_TABLE (PREFIX_VEX_0F38A9) },
8881 { PREFIX_TABLE (PREFIX_VEX_0F38AA) },
8882 { PREFIX_TABLE (PREFIX_VEX_0F38AB) },
8883 { PREFIX_TABLE (PREFIX_VEX_0F38AC) },
8884 { PREFIX_TABLE (PREFIX_VEX_0F38AD) },
8885 { PREFIX_TABLE (PREFIX_VEX_0F38AE) },
8886 { PREFIX_TABLE (PREFIX_VEX_0F38AF) },
8887 /* b0 */
8888 { Bad_Opcode },
8889 { Bad_Opcode },
8890 { Bad_Opcode },
8891 { Bad_Opcode },
8892 { Bad_Opcode },
8893 { Bad_Opcode },
8894 { PREFIX_TABLE (PREFIX_VEX_0F38B6) },
8895 { PREFIX_TABLE (PREFIX_VEX_0F38B7) },
8896 /* b8 */
8897 { PREFIX_TABLE (PREFIX_VEX_0F38B8) },
8898 { PREFIX_TABLE (PREFIX_VEX_0F38B9) },
8899 { PREFIX_TABLE (PREFIX_VEX_0F38BA) },
8900 { PREFIX_TABLE (PREFIX_VEX_0F38BB) },
8901 { PREFIX_TABLE (PREFIX_VEX_0F38BC) },
8902 { PREFIX_TABLE (PREFIX_VEX_0F38BD) },
8903 { PREFIX_TABLE (PREFIX_VEX_0F38BE) },
8904 { PREFIX_TABLE (PREFIX_VEX_0F38BF) },
8905 /* c0 */
8906 { Bad_Opcode },
8907 { Bad_Opcode },
8908 { Bad_Opcode },
8909 { Bad_Opcode },
8910 { Bad_Opcode },
8911 { Bad_Opcode },
8912 { Bad_Opcode },
8913 { Bad_Opcode },
8914 /* c8 */
8915 { Bad_Opcode },
8916 { Bad_Opcode },
8917 { Bad_Opcode },
8918 { Bad_Opcode },
8919 { Bad_Opcode },
8920 { Bad_Opcode },
8921 { Bad_Opcode },
8922 { PREFIX_TABLE (PREFIX_VEX_0F38CF) },
8923 /* d0 */
8924 { Bad_Opcode },
8925 { Bad_Opcode },
8926 { Bad_Opcode },
8927 { Bad_Opcode },
8928 { Bad_Opcode },
8929 { Bad_Opcode },
8930 { Bad_Opcode },
8931 { Bad_Opcode },
8932 /* d8 */
8933 { Bad_Opcode },
8934 { Bad_Opcode },
8935 { Bad_Opcode },
8936 { PREFIX_TABLE (PREFIX_VEX_0F38DB) },
8937 { PREFIX_TABLE (PREFIX_VEX_0F38DC) },
8938 { PREFIX_TABLE (PREFIX_VEX_0F38DD) },
8939 { PREFIX_TABLE (PREFIX_VEX_0F38DE) },
8940 { PREFIX_TABLE (PREFIX_VEX_0F38DF) },
8941 /* e0 */
8942 { Bad_Opcode },
8943 { Bad_Opcode },
8944 { Bad_Opcode },
8945 { Bad_Opcode },
8946 { Bad_Opcode },
8947 { Bad_Opcode },
8948 { Bad_Opcode },
8949 { Bad_Opcode },
8950 /* e8 */
8951 { Bad_Opcode },
8952 { Bad_Opcode },
8953 { Bad_Opcode },
8954 { Bad_Opcode },
8955 { Bad_Opcode },
8956 { Bad_Opcode },
8957 { Bad_Opcode },
8958 { Bad_Opcode },
8959 /* f0 */
8960 { Bad_Opcode },
8961 { Bad_Opcode },
8962 { PREFIX_TABLE (PREFIX_VEX_0F38F2) },
8963 { REG_TABLE (REG_VEX_0F38F3) },
8964 { Bad_Opcode },
8965 { PREFIX_TABLE (PREFIX_VEX_0F38F5) },
8966 { PREFIX_TABLE (PREFIX_VEX_0F38F6) },
8967 { PREFIX_TABLE (PREFIX_VEX_0F38F7) },
8968 /* f8 */
8969 { Bad_Opcode },
8970 { Bad_Opcode },
8971 { Bad_Opcode },
8972 { Bad_Opcode },
8973 { Bad_Opcode },
8974 { Bad_Opcode },
8975 { Bad_Opcode },
8976 { Bad_Opcode },
8977 },
8978 /* VEX_0F3A */
8979 {
8980 /* 00 */
8981 { PREFIX_TABLE (PREFIX_VEX_0F3A00) },
8982 { PREFIX_TABLE (PREFIX_VEX_0F3A01) },
8983 { PREFIX_TABLE (PREFIX_VEX_0F3A02) },
8984 { Bad_Opcode },
8985 { PREFIX_TABLE (PREFIX_VEX_0F3A04) },
8986 { PREFIX_TABLE (PREFIX_VEX_0F3A05) },
8987 { PREFIX_TABLE (PREFIX_VEX_0F3A06) },
8988 { Bad_Opcode },
8989 /* 08 */
8990 { PREFIX_TABLE (PREFIX_VEX_0F3A08) },
8991 { PREFIX_TABLE (PREFIX_VEX_0F3A09) },
8992 { PREFIX_TABLE (PREFIX_VEX_0F3A0A) },
8993 { PREFIX_TABLE (PREFIX_VEX_0F3A0B) },
8994 { PREFIX_TABLE (PREFIX_VEX_0F3A0C) },
8995 { PREFIX_TABLE (PREFIX_VEX_0F3A0D) },
8996 { PREFIX_TABLE (PREFIX_VEX_0F3A0E) },
8997 { PREFIX_TABLE (PREFIX_VEX_0F3A0F) },
8998 /* 10 */
8999 { Bad_Opcode },
9000 { Bad_Opcode },
9001 { Bad_Opcode },
9002 { Bad_Opcode },
9003 { PREFIX_TABLE (PREFIX_VEX_0F3A14) },
9004 { PREFIX_TABLE (PREFIX_VEX_0F3A15) },
9005 { PREFIX_TABLE (PREFIX_VEX_0F3A16) },
9006 { PREFIX_TABLE (PREFIX_VEX_0F3A17) },
9007 /* 18 */
9008 { PREFIX_TABLE (PREFIX_VEX_0F3A18) },
9009 { PREFIX_TABLE (PREFIX_VEX_0F3A19) },
9010 { Bad_Opcode },
9011 { Bad_Opcode },
9012 { Bad_Opcode },
9013 { PREFIX_TABLE (PREFIX_VEX_0F3A1D) },
9014 { Bad_Opcode },
9015 { Bad_Opcode },
9016 /* 20 */
9017 { PREFIX_TABLE (PREFIX_VEX_0F3A20) },
9018 { PREFIX_TABLE (PREFIX_VEX_0F3A21) },
9019 { PREFIX_TABLE (PREFIX_VEX_0F3A22) },
9020 { Bad_Opcode },
9021 { Bad_Opcode },
9022 { Bad_Opcode },
9023 { Bad_Opcode },
9024 { Bad_Opcode },
9025 /* 28 */
9026 { Bad_Opcode },
9027 { Bad_Opcode },
9028 { Bad_Opcode },
9029 { Bad_Opcode },
9030 { Bad_Opcode },
9031 { Bad_Opcode },
9032 { Bad_Opcode },
9033 { Bad_Opcode },
9034 /* 30 */
9035 { PREFIX_TABLE (PREFIX_VEX_0F3A30) },
9036 { PREFIX_TABLE (PREFIX_VEX_0F3A31) },
9037 { PREFIX_TABLE (PREFIX_VEX_0F3A32) },
9038 { PREFIX_TABLE (PREFIX_VEX_0F3A33) },
9039 { Bad_Opcode },
9040 { Bad_Opcode },
9041 { Bad_Opcode },
9042 { Bad_Opcode },
9043 /* 38 */
9044 { PREFIX_TABLE (PREFIX_VEX_0F3A38) },
9045 { PREFIX_TABLE (PREFIX_VEX_0F3A39) },
9046 { Bad_Opcode },
9047 { Bad_Opcode },
9048 { Bad_Opcode },
9049 { Bad_Opcode },
9050 { Bad_Opcode },
9051 { Bad_Opcode },
9052 /* 40 */
9053 { PREFIX_TABLE (PREFIX_VEX_0F3A40) },
9054 { PREFIX_TABLE (PREFIX_VEX_0F3A41) },
9055 { PREFIX_TABLE (PREFIX_VEX_0F3A42) },
9056 { Bad_Opcode },
9057 { PREFIX_TABLE (PREFIX_VEX_0F3A44) },
9058 { Bad_Opcode },
9059 { PREFIX_TABLE (PREFIX_VEX_0F3A46) },
9060 { Bad_Opcode },
9061 /* 48 */
9062 { PREFIX_TABLE (PREFIX_VEX_0F3A48) },
9063 { PREFIX_TABLE (PREFIX_VEX_0F3A49) },
9064 { PREFIX_TABLE (PREFIX_VEX_0F3A4A) },
9065 { PREFIX_TABLE (PREFIX_VEX_0F3A4B) },
9066 { PREFIX_TABLE (PREFIX_VEX_0F3A4C) },
9067 { Bad_Opcode },
9068 { Bad_Opcode },
9069 { Bad_Opcode },
9070 /* 50 */
9071 { Bad_Opcode },
9072 { Bad_Opcode },
9073 { Bad_Opcode },
9074 { Bad_Opcode },
9075 { Bad_Opcode },
9076 { Bad_Opcode },
9077 { Bad_Opcode },
9078 { Bad_Opcode },
9079 /* 58 */
9080 { Bad_Opcode },
9081 { Bad_Opcode },
9082 { Bad_Opcode },
9083 { Bad_Opcode },
9084 { PREFIX_TABLE (PREFIX_VEX_0F3A5C) },
9085 { PREFIX_TABLE (PREFIX_VEX_0F3A5D) },
9086 { PREFIX_TABLE (PREFIX_VEX_0F3A5E) },
9087 { PREFIX_TABLE (PREFIX_VEX_0F3A5F) },
9088 /* 60 */
9089 { PREFIX_TABLE (PREFIX_VEX_0F3A60) },
9090 { PREFIX_TABLE (PREFIX_VEX_0F3A61) },
9091 { PREFIX_TABLE (PREFIX_VEX_0F3A62) },
9092 { PREFIX_TABLE (PREFIX_VEX_0F3A63) },
9093 { Bad_Opcode },
9094 { Bad_Opcode },
9095 { Bad_Opcode },
9096 { Bad_Opcode },
9097 /* 68 */
9098 { PREFIX_TABLE (PREFIX_VEX_0F3A68) },
9099 { PREFIX_TABLE (PREFIX_VEX_0F3A69) },
9100 { PREFIX_TABLE (PREFIX_VEX_0F3A6A) },
9101 { PREFIX_TABLE (PREFIX_VEX_0F3A6B) },
9102 { PREFIX_TABLE (PREFIX_VEX_0F3A6C) },
9103 { PREFIX_TABLE (PREFIX_VEX_0F3A6D) },
9104 { PREFIX_TABLE (PREFIX_VEX_0F3A6E) },
9105 { PREFIX_TABLE (PREFIX_VEX_0F3A6F) },
9106 /* 70 */
9107 { Bad_Opcode },
9108 { Bad_Opcode },
9109 { Bad_Opcode },
9110 { Bad_Opcode },
9111 { Bad_Opcode },
9112 { Bad_Opcode },
9113 { Bad_Opcode },
9114 { Bad_Opcode },
9115 /* 78 */
9116 { PREFIX_TABLE (PREFIX_VEX_0F3A78) },
9117 { PREFIX_TABLE (PREFIX_VEX_0F3A79) },
9118 { PREFIX_TABLE (PREFIX_VEX_0F3A7A) },
9119 { PREFIX_TABLE (PREFIX_VEX_0F3A7B) },
9120 { PREFIX_TABLE (PREFIX_VEX_0F3A7C) },
9121 { PREFIX_TABLE (PREFIX_VEX_0F3A7D) },
9122 { PREFIX_TABLE (PREFIX_VEX_0F3A7E) },
9123 { PREFIX_TABLE (PREFIX_VEX_0F3A7F) },
9124 /* 80 */
9125 { Bad_Opcode },
9126 { Bad_Opcode },
9127 { Bad_Opcode },
9128 { Bad_Opcode },
9129 { Bad_Opcode },
9130 { Bad_Opcode },
9131 { Bad_Opcode },
9132 { Bad_Opcode },
9133 /* 88 */
9134 { Bad_Opcode },
9135 { Bad_Opcode },
9136 { Bad_Opcode },
9137 { Bad_Opcode },
9138 { Bad_Opcode },
9139 { Bad_Opcode },
9140 { Bad_Opcode },
9141 { Bad_Opcode },
9142 /* 90 */
9143 { Bad_Opcode },
9144 { Bad_Opcode },
9145 { Bad_Opcode },
9146 { Bad_Opcode },
9147 { Bad_Opcode },
9148 { Bad_Opcode },
9149 { Bad_Opcode },
9150 { Bad_Opcode },
9151 /* 98 */
9152 { Bad_Opcode },
9153 { Bad_Opcode },
9154 { Bad_Opcode },
9155 { Bad_Opcode },
9156 { Bad_Opcode },
9157 { Bad_Opcode },
9158 { Bad_Opcode },
9159 { Bad_Opcode },
9160 /* a0 */
9161 { Bad_Opcode },
9162 { Bad_Opcode },
9163 { Bad_Opcode },
9164 { Bad_Opcode },
9165 { Bad_Opcode },
9166 { Bad_Opcode },
9167 { Bad_Opcode },
9168 { Bad_Opcode },
9169 /* a8 */
9170 { Bad_Opcode },
9171 { Bad_Opcode },
9172 { Bad_Opcode },
9173 { Bad_Opcode },
9174 { Bad_Opcode },
9175 { Bad_Opcode },
9176 { Bad_Opcode },
9177 { Bad_Opcode },
9178 /* b0 */
9179 { Bad_Opcode },
9180 { Bad_Opcode },
9181 { Bad_Opcode },
9182 { Bad_Opcode },
9183 { Bad_Opcode },
9184 { Bad_Opcode },
9185 { Bad_Opcode },
9186 { Bad_Opcode },
9187 /* b8 */
9188 { Bad_Opcode },
9189 { Bad_Opcode },
9190 { Bad_Opcode },
9191 { Bad_Opcode },
9192 { Bad_Opcode },
9193 { Bad_Opcode },
9194 { Bad_Opcode },
9195 { Bad_Opcode },
9196 /* c0 */
9197 { Bad_Opcode },
9198 { Bad_Opcode },
9199 { Bad_Opcode },
9200 { Bad_Opcode },
9201 { Bad_Opcode },
9202 { Bad_Opcode },
9203 { Bad_Opcode },
9204 { Bad_Opcode },
9205 /* c8 */
9206 { Bad_Opcode },
9207 { Bad_Opcode },
9208 { Bad_Opcode },
9209 { Bad_Opcode },
9210 { Bad_Opcode },
9211 { Bad_Opcode },
9212 { PREFIX_TABLE(PREFIX_VEX_0F3ACE) },
9213 { PREFIX_TABLE(PREFIX_VEX_0F3ACF) },
9214 /* d0 */
9215 { Bad_Opcode },
9216 { Bad_Opcode },
9217 { Bad_Opcode },
9218 { Bad_Opcode },
9219 { Bad_Opcode },
9220 { Bad_Opcode },
9221 { Bad_Opcode },
9222 { Bad_Opcode },
9223 /* d8 */
9224 { Bad_Opcode },
9225 { Bad_Opcode },
9226 { Bad_Opcode },
9227 { Bad_Opcode },
9228 { Bad_Opcode },
9229 { Bad_Opcode },
9230 { Bad_Opcode },
9231 { PREFIX_TABLE (PREFIX_VEX_0F3ADF) },
9232 /* e0 */
9233 { Bad_Opcode },
9234 { Bad_Opcode },
9235 { Bad_Opcode },
9236 { Bad_Opcode },
9237 { Bad_Opcode },
9238 { Bad_Opcode },
9239 { Bad_Opcode },
9240 { Bad_Opcode },
9241 /* e8 */
9242 { Bad_Opcode },
9243 { Bad_Opcode },
9244 { Bad_Opcode },
9245 { Bad_Opcode },
9246 { Bad_Opcode },
9247 { Bad_Opcode },
9248 { Bad_Opcode },
9249 { Bad_Opcode },
9250 /* f0 */
9251 { PREFIX_TABLE (PREFIX_VEX_0F3AF0) },
9252 { Bad_Opcode },
9253 { Bad_Opcode },
9254 { Bad_Opcode },
9255 { Bad_Opcode },
9256 { Bad_Opcode },
9257 { Bad_Opcode },
9258 { Bad_Opcode },
9259 /* f8 */
9260 { Bad_Opcode },
9261 { Bad_Opcode },
9262 { Bad_Opcode },
9263 { Bad_Opcode },
9264 { Bad_Opcode },
9265 { Bad_Opcode },
9266 { Bad_Opcode },
9267 { Bad_Opcode },
9268 },
9269 };
9270
9271 #define NEED_OPCODE_TABLE
9272 #include "i386-dis-evex.h"
9273 #undef NEED_OPCODE_TABLE
9274 static const struct dis386 vex_len_table[][2] = {
9275 /* VEX_LEN_0F12_P_0_M_0 */
9276 {
9277 { "vmovlps", { XM, Vex128, EXq }, 0 },
9278 },
9279
9280 /* VEX_LEN_0F12_P_0_M_1 */
9281 {
9282 { "vmovhlps", { XM, Vex128, EXq }, 0 },
9283 },
9284
9285 /* VEX_LEN_0F12_P_2 */
9286 {
9287 { "vmovlpd", { XM, Vex128, EXq }, 0 },
9288 },
9289
9290 /* VEX_LEN_0F13_M_0 */
9291 {
9292 { "vmovlpX", { EXq, XM }, 0 },
9293 },
9294
9295 /* VEX_LEN_0F16_P_0_M_0 */
9296 {
9297 { "vmovhps", { XM, Vex128, EXq }, 0 },
9298 },
9299
9300 /* VEX_LEN_0F16_P_0_M_1 */
9301 {
9302 { "vmovlhps", { XM, Vex128, EXq }, 0 },
9303 },
9304
9305 /* VEX_LEN_0F16_P_2 */
9306 {
9307 { "vmovhpd", { XM, Vex128, EXq }, 0 },
9308 },
9309
9310 /* VEX_LEN_0F17_M_0 */
9311 {
9312 { "vmovhpX", { EXq, XM }, 0 },
9313 },
9314
9315 /* VEX_LEN_0F2A_P_1 */
9316 {
9317 { "vcvtsi2ss%LQ", { XMScalar, VexScalar, Ev }, 0 },
9318 { "vcvtsi2ss%LQ", { XMScalar, VexScalar, Ev }, 0 },
9319 },
9320
9321 /* VEX_LEN_0F2A_P_3 */
9322 {
9323 { "vcvtsi2sd%LQ", { XMScalar, VexScalar, Ev }, 0 },
9324 { "vcvtsi2sd%LQ", { XMScalar, VexScalar, Ev }, 0 },
9325 },
9326
9327 /* VEX_LEN_0F2C_P_1 */
9328 {
9329 { "vcvttss2si", { Gv, EXdScalar }, 0 },
9330 { "vcvttss2si", { Gv, EXdScalar }, 0 },
9331 },
9332
9333 /* VEX_LEN_0F2C_P_3 */
9334 {
9335 { "vcvttsd2si", { Gv, EXqScalar }, 0 },
9336 { "vcvttsd2si", { Gv, EXqScalar }, 0 },
9337 },
9338
9339 /* VEX_LEN_0F2D_P_1 */
9340 {
9341 { "vcvtss2si", { Gv, EXdScalar }, 0 },
9342 { "vcvtss2si", { Gv, EXdScalar }, 0 },
9343 },
9344
9345 /* VEX_LEN_0F2D_P_3 */
9346 {
9347 { "vcvtsd2si", { Gv, EXqScalar }, 0 },
9348 { "vcvtsd2si", { Gv, EXqScalar }, 0 },
9349 },
9350
9351 /* VEX_LEN_0F41_P_0 */
9352 {
9353 { Bad_Opcode },
9354 { VEX_W_TABLE (VEX_W_0F41_P_0_LEN_1) },
9355 },
9356 /* VEX_LEN_0F41_P_2 */
9357 {
9358 { Bad_Opcode },
9359 { VEX_W_TABLE (VEX_W_0F41_P_2_LEN_1) },
9360 },
9361 /* VEX_LEN_0F42_P_0 */
9362 {
9363 { Bad_Opcode },
9364 { VEX_W_TABLE (VEX_W_0F42_P_0_LEN_1) },
9365 },
9366 /* VEX_LEN_0F42_P_2 */
9367 {
9368 { Bad_Opcode },
9369 { VEX_W_TABLE (VEX_W_0F42_P_2_LEN_1) },
9370 },
9371 /* VEX_LEN_0F44_P_0 */
9372 {
9373 { VEX_W_TABLE (VEX_W_0F44_P_0_LEN_0) },
9374 },
9375 /* VEX_LEN_0F44_P_2 */
9376 {
9377 { VEX_W_TABLE (VEX_W_0F44_P_2_LEN_0) },
9378 },
9379 /* VEX_LEN_0F45_P_0 */
9380 {
9381 { Bad_Opcode },
9382 { VEX_W_TABLE (VEX_W_0F45_P_0_LEN_1) },
9383 },
9384 /* VEX_LEN_0F45_P_2 */
9385 {
9386 { Bad_Opcode },
9387 { VEX_W_TABLE (VEX_W_0F45_P_2_LEN_1) },
9388 },
9389 /* VEX_LEN_0F46_P_0 */
9390 {
9391 { Bad_Opcode },
9392 { VEX_W_TABLE (VEX_W_0F46_P_0_LEN_1) },
9393 },
9394 /* VEX_LEN_0F46_P_2 */
9395 {
9396 { Bad_Opcode },
9397 { VEX_W_TABLE (VEX_W_0F46_P_2_LEN_1) },
9398 },
9399 /* VEX_LEN_0F47_P_0 */
9400 {
9401 { Bad_Opcode },
9402 { VEX_W_TABLE (VEX_W_0F47_P_0_LEN_1) },
9403 },
9404 /* VEX_LEN_0F47_P_2 */
9405 {
9406 { Bad_Opcode },
9407 { VEX_W_TABLE (VEX_W_0F47_P_2_LEN_1) },
9408 },
9409 /* VEX_LEN_0F4A_P_0 */
9410 {
9411 { Bad_Opcode },
9412 { VEX_W_TABLE (VEX_W_0F4A_P_0_LEN_1) },
9413 },
9414 /* VEX_LEN_0F4A_P_2 */
9415 {
9416 { Bad_Opcode },
9417 { VEX_W_TABLE (VEX_W_0F4A_P_2_LEN_1) },
9418 },
9419 /* VEX_LEN_0F4B_P_0 */
9420 {
9421 { Bad_Opcode },
9422 { VEX_W_TABLE (VEX_W_0F4B_P_0_LEN_1) },
9423 },
9424 /* VEX_LEN_0F4B_P_2 */
9425 {
9426 { Bad_Opcode },
9427 { VEX_W_TABLE (VEX_W_0F4B_P_2_LEN_1) },
9428 },
9429
9430 /* VEX_LEN_0F6E_P_2 */
9431 {
9432 { "vmovK", { XMScalar, Edq }, 0 },
9433 },
9434
9435 /* VEX_LEN_0F77_P_1 */
9436 {
9437 { "vzeroupper", { XX }, 0 },
9438 { "vzeroall", { XX }, 0 },
9439 },
9440
9441 /* VEX_LEN_0F7E_P_1 */
9442 {
9443 { "vmovq", { XMScalar, EXqScalar }, 0 },
9444 },
9445
9446 /* VEX_LEN_0F7E_P_2 */
9447 {
9448 { "vmovK", { Edq, XMScalar }, 0 },
9449 },
9450
9451 /* VEX_LEN_0F90_P_0 */
9452 {
9453 { VEX_W_TABLE (VEX_W_0F90_P_0_LEN_0) },
9454 },
9455
9456 /* VEX_LEN_0F90_P_2 */
9457 {
9458 { VEX_W_TABLE (VEX_W_0F90_P_2_LEN_0) },
9459 },
9460
9461 /* VEX_LEN_0F91_P_0 */
9462 {
9463 { VEX_W_TABLE (VEX_W_0F91_P_0_LEN_0) },
9464 },
9465
9466 /* VEX_LEN_0F91_P_2 */
9467 {
9468 { VEX_W_TABLE (VEX_W_0F91_P_2_LEN_0) },
9469 },
9470
9471 /* VEX_LEN_0F92_P_0 */
9472 {
9473 { VEX_W_TABLE (VEX_W_0F92_P_0_LEN_0) },
9474 },
9475
9476 /* VEX_LEN_0F92_P_2 */
9477 {
9478 { VEX_W_TABLE (VEX_W_0F92_P_2_LEN_0) },
9479 },
9480
9481 /* VEX_LEN_0F92_P_3 */
9482 {
9483 { MOD_TABLE (MOD_VEX_0F92_P_3_LEN_0) },
9484 },
9485
9486 /* VEX_LEN_0F93_P_0 */
9487 {
9488 { VEX_W_TABLE (VEX_W_0F93_P_0_LEN_0) },
9489 },
9490
9491 /* VEX_LEN_0F93_P_2 */
9492 {
9493 { VEX_W_TABLE (VEX_W_0F93_P_2_LEN_0) },
9494 },
9495
9496 /* VEX_LEN_0F93_P_3 */
9497 {
9498 { MOD_TABLE (MOD_VEX_0F93_P_3_LEN_0) },
9499 },
9500
9501 /* VEX_LEN_0F98_P_0 */
9502 {
9503 { VEX_W_TABLE (VEX_W_0F98_P_0_LEN_0) },
9504 },
9505
9506 /* VEX_LEN_0F98_P_2 */
9507 {
9508 { VEX_W_TABLE (VEX_W_0F98_P_2_LEN_0) },
9509 },
9510
9511 /* VEX_LEN_0F99_P_0 */
9512 {
9513 { VEX_W_TABLE (VEX_W_0F99_P_0_LEN_0) },
9514 },
9515
9516 /* VEX_LEN_0F99_P_2 */
9517 {
9518 { VEX_W_TABLE (VEX_W_0F99_P_2_LEN_0) },
9519 },
9520
9521 /* VEX_LEN_0FAE_R_2_M_0 */
9522 {
9523 { "vldmxcsr", { Md }, 0 },
9524 },
9525
9526 /* VEX_LEN_0FAE_R_3_M_0 */
9527 {
9528 { "vstmxcsr", { Md }, 0 },
9529 },
9530
9531 /* VEX_LEN_0FC4_P_2 */
9532 {
9533 { "vpinsrw", { XM, Vex128, Edqw, Ib }, 0 },
9534 },
9535
9536 /* VEX_LEN_0FC5_P_2 */
9537 {
9538 { "vpextrw", { Gdq, XS, Ib }, 0 },
9539 },
9540
9541 /* VEX_LEN_0FD6_P_2 */
9542 {
9543 { "vmovq", { EXqScalarS, XMScalar }, 0 },
9544 },
9545
9546 /* VEX_LEN_0FF7_P_2 */
9547 {
9548 { "vmaskmovdqu", { XM, XS }, 0 },
9549 },
9550
9551 /* VEX_LEN_0F3816_P_2 */
9552 {
9553 { Bad_Opcode },
9554 { VEX_W_TABLE (VEX_W_0F3816_P_2) },
9555 },
9556
9557 /* VEX_LEN_0F3819_P_2 */
9558 {
9559 { Bad_Opcode },
9560 { VEX_W_TABLE (VEX_W_0F3819_P_2) },
9561 },
9562
9563 /* VEX_LEN_0F381A_P_2_M_0 */
9564 {
9565 { Bad_Opcode },
9566 { VEX_W_TABLE (VEX_W_0F381A_P_2_M_0) },
9567 },
9568
9569 /* VEX_LEN_0F3836_P_2 */
9570 {
9571 { Bad_Opcode },
9572 { VEX_W_TABLE (VEX_W_0F3836_P_2) },
9573 },
9574
9575 /* VEX_LEN_0F3841_P_2 */
9576 {
9577 { "vphminposuw", { XM, EXx }, 0 },
9578 },
9579
9580 /* VEX_LEN_0F385A_P_2_M_0 */
9581 {
9582 { Bad_Opcode },
9583 { VEX_W_TABLE (VEX_W_0F385A_P_2_M_0) },
9584 },
9585
9586 /* VEX_LEN_0F38DB_P_2 */
9587 {
9588 { "vaesimc", { XM, EXx }, 0 },
9589 },
9590
9591 /* VEX_LEN_0F38F2_P_0 */
9592 {
9593 { "andnS", { Gdq, VexGdq, Edq }, 0 },
9594 },
9595
9596 /* VEX_LEN_0F38F3_R_1_P_0 */
9597 {
9598 { "blsrS", { VexGdq, Edq }, 0 },
9599 },
9600
9601 /* VEX_LEN_0F38F3_R_2_P_0 */
9602 {
9603 { "blsmskS", { VexGdq, Edq }, 0 },
9604 },
9605
9606 /* VEX_LEN_0F38F3_R_3_P_0 */
9607 {
9608 { "blsiS", { VexGdq, Edq }, 0 },
9609 },
9610
9611 /* VEX_LEN_0F38F5_P_0 */
9612 {
9613 { "bzhiS", { Gdq, Edq, VexGdq }, 0 },
9614 },
9615
9616 /* VEX_LEN_0F38F5_P_1 */
9617 {
9618 { "pextS", { Gdq, VexGdq, Edq }, 0 },
9619 },
9620
9621 /* VEX_LEN_0F38F5_P_3 */
9622 {
9623 { "pdepS", { Gdq, VexGdq, Edq }, 0 },
9624 },
9625
9626 /* VEX_LEN_0F38F6_P_3 */
9627 {
9628 { "mulxS", { Gdq, VexGdq, Edq }, 0 },
9629 },
9630
9631 /* VEX_LEN_0F38F7_P_0 */
9632 {
9633 { "bextrS", { Gdq, Edq, VexGdq }, 0 },
9634 },
9635
9636 /* VEX_LEN_0F38F7_P_1 */
9637 {
9638 { "sarxS", { Gdq, Edq, VexGdq }, 0 },
9639 },
9640
9641 /* VEX_LEN_0F38F7_P_2 */
9642 {
9643 { "shlxS", { Gdq, Edq, VexGdq }, 0 },
9644 },
9645
9646 /* VEX_LEN_0F38F7_P_3 */
9647 {
9648 { "shrxS", { Gdq, Edq, VexGdq }, 0 },
9649 },
9650
9651 /* VEX_LEN_0F3A00_P_2 */
9652 {
9653 { Bad_Opcode },
9654 { VEX_W_TABLE (VEX_W_0F3A00_P_2) },
9655 },
9656
9657 /* VEX_LEN_0F3A01_P_2 */
9658 {
9659 { Bad_Opcode },
9660 { VEX_W_TABLE (VEX_W_0F3A01_P_2) },
9661 },
9662
9663 /* VEX_LEN_0F3A06_P_2 */
9664 {
9665 { Bad_Opcode },
9666 { VEX_W_TABLE (VEX_W_0F3A06_P_2) },
9667 },
9668
9669 /* VEX_LEN_0F3A14_P_2 */
9670 {
9671 { "vpextrb", { Edqb, XM, Ib }, 0 },
9672 },
9673
9674 /* VEX_LEN_0F3A15_P_2 */
9675 {
9676 { "vpextrw", { Edqw, XM, Ib }, 0 },
9677 },
9678
9679 /* VEX_LEN_0F3A16_P_2 */
9680 {
9681 { "vpextrK", { Edq, XM, Ib }, 0 },
9682 },
9683
9684 /* VEX_LEN_0F3A17_P_2 */
9685 {
9686 { "vextractps", { Edqd, XM, Ib }, 0 },
9687 },
9688
9689 /* VEX_LEN_0F3A18_P_2 */
9690 {
9691 { Bad_Opcode },
9692 { VEX_W_TABLE (VEX_W_0F3A18_P_2) },
9693 },
9694
9695 /* VEX_LEN_0F3A19_P_2 */
9696 {
9697 { Bad_Opcode },
9698 { VEX_W_TABLE (VEX_W_0F3A19_P_2) },
9699 },
9700
9701 /* VEX_LEN_0F3A20_P_2 */
9702 {
9703 { "vpinsrb", { XM, Vex128, Edqb, Ib }, 0 },
9704 },
9705
9706 /* VEX_LEN_0F3A21_P_2 */
9707 {
9708 { "vinsertps", { XM, Vex128, EXd, Ib }, 0 },
9709 },
9710
9711 /* VEX_LEN_0F3A22_P_2 */
9712 {
9713 { "vpinsrK", { XM, Vex128, Edq, Ib }, 0 },
9714 },
9715
9716 /* VEX_LEN_0F3A30_P_2 */
9717 {
9718 { VEX_W_TABLE (VEX_W_0F3A30_P_2_LEN_0) },
9719 },
9720
9721 /* VEX_LEN_0F3A31_P_2 */
9722 {
9723 { VEX_W_TABLE (VEX_W_0F3A31_P_2_LEN_0) },
9724 },
9725
9726 /* VEX_LEN_0F3A32_P_2 */
9727 {
9728 { VEX_W_TABLE (VEX_W_0F3A32_P_2_LEN_0) },
9729 },
9730
9731 /* VEX_LEN_0F3A33_P_2 */
9732 {
9733 { VEX_W_TABLE (VEX_W_0F3A33_P_2_LEN_0) },
9734 },
9735
9736 /* VEX_LEN_0F3A38_P_2 */
9737 {
9738 { Bad_Opcode },
9739 { VEX_W_TABLE (VEX_W_0F3A38_P_2) },
9740 },
9741
9742 /* VEX_LEN_0F3A39_P_2 */
9743 {
9744 { Bad_Opcode },
9745 { VEX_W_TABLE (VEX_W_0F3A39_P_2) },
9746 },
9747
9748 /* VEX_LEN_0F3A41_P_2 */
9749 {
9750 { "vdppd", { XM, Vex128, EXx, Ib }, 0 },
9751 },
9752
9753 /* VEX_LEN_0F3A46_P_2 */
9754 {
9755 { Bad_Opcode },
9756 { VEX_W_TABLE (VEX_W_0F3A46_P_2) },
9757 },
9758
9759 /* VEX_LEN_0F3A60_P_2 */
9760 {
9761 { "vpcmpestrm", { XM, { PCMPESTR_Fixup, x_mode }, Ib }, 0 },
9762 },
9763
9764 /* VEX_LEN_0F3A61_P_2 */
9765 {
9766 { "vpcmpestri", { XM, { PCMPESTR_Fixup, x_mode }, Ib }, 0 },
9767 },
9768
9769 /* VEX_LEN_0F3A62_P_2 */
9770 {
9771 { "vpcmpistrm", { XM, EXx, Ib }, 0 },
9772 },
9773
9774 /* VEX_LEN_0F3A63_P_2 */
9775 {
9776 { "vpcmpistri", { XM, EXx, Ib }, 0 },
9777 },
9778
9779 /* VEX_LEN_0F3A6A_P_2 */
9780 {
9781 { "vfmaddss", { XMVexW, Vex128, EXdVexW, EXdVexW }, 0 },
9782 },
9783
9784 /* VEX_LEN_0F3A6B_P_2 */
9785 {
9786 { "vfmaddsd", { XMVexW, Vex128, EXqVexW, EXqVexW }, 0 },
9787 },
9788
9789 /* VEX_LEN_0F3A6E_P_2 */
9790 {
9791 { "vfmsubss", { XMVexW, Vex128, EXdVexW, EXdVexW }, 0 },
9792 },
9793
9794 /* VEX_LEN_0F3A6F_P_2 */
9795 {
9796 { "vfmsubsd", { XMVexW, Vex128, EXqVexW, EXqVexW }, 0 },
9797 },
9798
9799 /* VEX_LEN_0F3A7A_P_2 */
9800 {
9801 { "vfnmaddss", { XMVexW, Vex128, EXdVexW, EXdVexW }, 0 },
9802 },
9803
9804 /* VEX_LEN_0F3A7B_P_2 */
9805 {
9806 { "vfnmaddsd", { XMVexW, Vex128, EXqVexW, EXqVexW }, 0 },
9807 },
9808
9809 /* VEX_LEN_0F3A7E_P_2 */
9810 {
9811 { "vfnmsubss", { XMVexW, Vex128, EXdVexW, EXdVexW }, 0 },
9812 },
9813
9814 /* VEX_LEN_0F3A7F_P_2 */
9815 {
9816 { "vfnmsubsd", { XMVexW, Vex128, EXqVexW, EXqVexW }, 0 },
9817 },
9818
9819 /* VEX_LEN_0F3ADF_P_2 */
9820 {
9821 { "vaeskeygenassist", { XM, EXx, Ib }, 0 },
9822 },
9823
9824 /* VEX_LEN_0F3AF0_P_3 */
9825 {
9826 { "rorxS", { Gdq, Edq, Ib }, 0 },
9827 },
9828
9829 /* VEX_LEN_0FXOP_08_CC */
9830 {
9831 { "vpcomb", { XM, Vex128, EXx, VPCOM }, 0 },
9832 },
9833
9834 /* VEX_LEN_0FXOP_08_CD */
9835 {
9836 { "vpcomw", { XM, Vex128, EXx, VPCOM }, 0 },
9837 },
9838
9839 /* VEX_LEN_0FXOP_08_CE */
9840 {
9841 { "vpcomd", { XM, Vex128, EXx, VPCOM }, 0 },
9842 },
9843
9844 /* VEX_LEN_0FXOP_08_CF */
9845 {
9846 { "vpcomq", { XM, Vex128, EXx, VPCOM }, 0 },
9847 },
9848
9849 /* VEX_LEN_0FXOP_08_EC */
9850 {
9851 { "vpcomub", { XM, Vex128, EXx, VPCOM }, 0 },
9852 },
9853
9854 /* VEX_LEN_0FXOP_08_ED */
9855 {
9856 { "vpcomuw", { XM, Vex128, EXx, VPCOM }, 0 },
9857 },
9858
9859 /* VEX_LEN_0FXOP_08_EE */
9860 {
9861 { "vpcomud", { XM, Vex128, EXx, VPCOM }, 0 },
9862 },
9863
9864 /* VEX_LEN_0FXOP_08_EF */
9865 {
9866 { "vpcomuq", { XM, Vex128, EXx, VPCOM }, 0 },
9867 },
9868
9869 /* VEX_LEN_0FXOP_09_80 */
9870 {
9871 { "vfrczps", { XM, EXxmm }, 0 },
9872 { "vfrczps", { XM, EXymmq }, 0 },
9873 },
9874
9875 /* VEX_LEN_0FXOP_09_81 */
9876 {
9877 { "vfrczpd", { XM, EXxmm }, 0 },
9878 { "vfrczpd", { XM, EXymmq }, 0 },
9879 },
9880 };
9881
9882 static const struct dis386 evex_len_table[][3] = {
9883 #define NEED_EVEX_LEN_TABLE
9884 #include "i386-dis-evex.h"
9885 #undef NEED_EVEX_LEN_TABLE
9886 };
9887
9888 static const struct dis386 vex_w_table[][2] = {
9889 {
9890 /* VEX_W_0F41_P_0_LEN_1 */
9891 { MOD_TABLE (MOD_VEX_W_0_0F41_P_0_LEN_1) },
9892 { MOD_TABLE (MOD_VEX_W_1_0F41_P_0_LEN_1) },
9893 },
9894 {
9895 /* VEX_W_0F41_P_2_LEN_1 */
9896 { MOD_TABLE (MOD_VEX_W_0_0F41_P_2_LEN_1) },
9897 { MOD_TABLE (MOD_VEX_W_1_0F41_P_2_LEN_1) }
9898 },
9899 {
9900 /* VEX_W_0F42_P_0_LEN_1 */
9901 { MOD_TABLE (MOD_VEX_W_0_0F42_P_0_LEN_1) },
9902 { MOD_TABLE (MOD_VEX_W_1_0F42_P_0_LEN_1) },
9903 },
9904 {
9905 /* VEX_W_0F42_P_2_LEN_1 */
9906 { MOD_TABLE (MOD_VEX_W_0_0F42_P_2_LEN_1) },
9907 { MOD_TABLE (MOD_VEX_W_1_0F42_P_2_LEN_1) },
9908 },
9909 {
9910 /* VEX_W_0F44_P_0_LEN_0 */
9911 { MOD_TABLE (MOD_VEX_W_0_0F44_P_0_LEN_1) },
9912 { MOD_TABLE (MOD_VEX_W_1_0F44_P_0_LEN_1) },
9913 },
9914 {
9915 /* VEX_W_0F44_P_2_LEN_0 */
9916 { MOD_TABLE (MOD_VEX_W_0_0F44_P_2_LEN_1) },
9917 { MOD_TABLE (MOD_VEX_W_1_0F44_P_2_LEN_1) },
9918 },
9919 {
9920 /* VEX_W_0F45_P_0_LEN_1 */
9921 { MOD_TABLE (MOD_VEX_W_0_0F45_P_0_LEN_1) },
9922 { MOD_TABLE (MOD_VEX_W_1_0F45_P_0_LEN_1) },
9923 },
9924 {
9925 /* VEX_W_0F45_P_2_LEN_1 */
9926 { MOD_TABLE (MOD_VEX_W_0_0F45_P_2_LEN_1) },
9927 { MOD_TABLE (MOD_VEX_W_1_0F45_P_2_LEN_1) },
9928 },
9929 {
9930 /* VEX_W_0F46_P_0_LEN_1 */
9931 { MOD_TABLE (MOD_VEX_W_0_0F46_P_0_LEN_1) },
9932 { MOD_TABLE (MOD_VEX_W_1_0F46_P_0_LEN_1) },
9933 },
9934 {
9935 /* VEX_W_0F46_P_2_LEN_1 */
9936 { MOD_TABLE (MOD_VEX_W_0_0F46_P_2_LEN_1) },
9937 { MOD_TABLE (MOD_VEX_W_1_0F46_P_2_LEN_1) },
9938 },
9939 {
9940 /* VEX_W_0F47_P_0_LEN_1 */
9941 { MOD_TABLE (MOD_VEX_W_0_0F47_P_0_LEN_1) },
9942 { MOD_TABLE (MOD_VEX_W_1_0F47_P_0_LEN_1) },
9943 },
9944 {
9945 /* VEX_W_0F47_P_2_LEN_1 */
9946 { MOD_TABLE (MOD_VEX_W_0_0F47_P_2_LEN_1) },
9947 { MOD_TABLE (MOD_VEX_W_1_0F47_P_2_LEN_1) },
9948 },
9949 {
9950 /* VEX_W_0F4A_P_0_LEN_1 */
9951 { MOD_TABLE (MOD_VEX_W_0_0F4A_P_0_LEN_1) },
9952 { MOD_TABLE (MOD_VEX_W_1_0F4A_P_0_LEN_1) },
9953 },
9954 {
9955 /* VEX_W_0F4A_P_2_LEN_1 */
9956 { MOD_TABLE (MOD_VEX_W_0_0F4A_P_2_LEN_1) },
9957 { MOD_TABLE (MOD_VEX_W_1_0F4A_P_2_LEN_1) },
9958 },
9959 {
9960 /* VEX_W_0F4B_P_0_LEN_1 */
9961 { MOD_TABLE (MOD_VEX_W_0_0F4B_P_0_LEN_1) },
9962 { MOD_TABLE (MOD_VEX_W_1_0F4B_P_0_LEN_1) },
9963 },
9964 {
9965 /* VEX_W_0F4B_P_2_LEN_1 */
9966 { MOD_TABLE (MOD_VEX_W_0_0F4B_P_2_LEN_1) },
9967 },
9968 {
9969 /* VEX_W_0F90_P_0_LEN_0 */
9970 { "kmovw", { MaskG, MaskE }, 0 },
9971 { "kmovq", { MaskG, MaskE }, 0 },
9972 },
9973 {
9974 /* VEX_W_0F90_P_2_LEN_0 */
9975 { "kmovb", { MaskG, MaskBDE }, 0 },
9976 { "kmovd", { MaskG, MaskBDE }, 0 },
9977 },
9978 {
9979 /* VEX_W_0F91_P_0_LEN_0 */
9980 { MOD_TABLE (MOD_VEX_W_0_0F91_P_0_LEN_0) },
9981 { MOD_TABLE (MOD_VEX_W_1_0F91_P_0_LEN_0) },
9982 },
9983 {
9984 /* VEX_W_0F91_P_2_LEN_0 */
9985 { MOD_TABLE (MOD_VEX_W_0_0F91_P_2_LEN_0) },
9986 { MOD_TABLE (MOD_VEX_W_1_0F91_P_2_LEN_0) },
9987 },
9988 {
9989 /* VEX_W_0F92_P_0_LEN_0 */
9990 { MOD_TABLE (MOD_VEX_W_0_0F92_P_0_LEN_0) },
9991 },
9992 {
9993 /* VEX_W_0F92_P_2_LEN_0 */
9994 { MOD_TABLE (MOD_VEX_W_0_0F92_P_2_LEN_0) },
9995 },
9996 {
9997 /* VEX_W_0F93_P_0_LEN_0 */
9998 { MOD_TABLE (MOD_VEX_W_0_0F93_P_0_LEN_0) },
9999 },
10000 {
10001 /* VEX_W_0F93_P_2_LEN_0 */
10002 { MOD_TABLE (MOD_VEX_W_0_0F93_P_2_LEN_0) },
10003 },
10004 {
10005 /* VEX_W_0F98_P_0_LEN_0 */
10006 { MOD_TABLE (MOD_VEX_W_0_0F98_P_0_LEN_0) },
10007 { MOD_TABLE (MOD_VEX_W_1_0F98_P_0_LEN_0) },
10008 },
10009 {
10010 /* VEX_W_0F98_P_2_LEN_0 */
10011 { MOD_TABLE (MOD_VEX_W_0_0F98_P_2_LEN_0) },
10012 { MOD_TABLE (MOD_VEX_W_1_0F98_P_2_LEN_0) },
10013 },
10014 {
10015 /* VEX_W_0F99_P_0_LEN_0 */
10016 { MOD_TABLE (MOD_VEX_W_0_0F99_P_0_LEN_0) },
10017 { MOD_TABLE (MOD_VEX_W_1_0F99_P_0_LEN_0) },
10018 },
10019 {
10020 /* VEX_W_0F99_P_2_LEN_0 */
10021 { MOD_TABLE (MOD_VEX_W_0_0F99_P_2_LEN_0) },
10022 { MOD_TABLE (MOD_VEX_W_1_0F99_P_2_LEN_0) },
10023 },
10024 {
10025 /* VEX_W_0F380C_P_2 */
10026 { "vpermilps", { XM, Vex, EXx }, 0 },
10027 },
10028 {
10029 /* VEX_W_0F380D_P_2 */
10030 { "vpermilpd", { XM, Vex, EXx }, 0 },
10031 },
10032 {
10033 /* VEX_W_0F380E_P_2 */
10034 { "vtestps", { XM, EXx }, 0 },
10035 },
10036 {
10037 /* VEX_W_0F380F_P_2 */
10038 { "vtestpd", { XM, EXx }, 0 },
10039 },
10040 {
10041 /* VEX_W_0F3816_P_2 */
10042 { "vpermps", { XM, Vex, EXx }, 0 },
10043 },
10044 {
10045 /* VEX_W_0F3818_P_2 */
10046 { "vbroadcastss", { XM, EXxmm_md }, 0 },
10047 },
10048 {
10049 /* VEX_W_0F3819_P_2 */
10050 { "vbroadcastsd", { XM, EXxmm_mq }, 0 },
10051 },
10052 {
10053 /* VEX_W_0F381A_P_2_M_0 */
10054 { "vbroadcastf128", { XM, Mxmm }, 0 },
10055 },
10056 {
10057 /* VEX_W_0F382C_P_2_M_0 */
10058 { "vmaskmovps", { XM, Vex, Mx }, 0 },
10059 },
10060 {
10061 /* VEX_W_0F382D_P_2_M_0 */
10062 { "vmaskmovpd", { XM, Vex, Mx }, 0 },
10063 },
10064 {
10065 /* VEX_W_0F382E_P_2_M_0 */
10066 { "vmaskmovps", { Mx, Vex, XM }, 0 },
10067 },
10068 {
10069 /* VEX_W_0F382F_P_2_M_0 */
10070 { "vmaskmovpd", { Mx, Vex, XM }, 0 },
10071 },
10072 {
10073 /* VEX_W_0F3836_P_2 */
10074 { "vpermd", { XM, Vex, EXx }, 0 },
10075 },
10076 {
10077 /* VEX_W_0F3846_P_2 */
10078 { "vpsravd", { XM, Vex, EXx }, 0 },
10079 },
10080 {
10081 /* VEX_W_0F3858_P_2 */
10082 { "vpbroadcastd", { XM, EXxmm_md }, 0 },
10083 },
10084 {
10085 /* VEX_W_0F3859_P_2 */
10086 { "vpbroadcastq", { XM, EXxmm_mq }, 0 },
10087 },
10088 {
10089 /* VEX_W_0F385A_P_2_M_0 */
10090 { "vbroadcasti128", { XM, Mxmm }, 0 },
10091 },
10092 {
10093 /* VEX_W_0F3878_P_2 */
10094 { "vpbroadcastb", { XM, EXxmm_mb }, 0 },
10095 },
10096 {
10097 /* VEX_W_0F3879_P_2 */
10098 { "vpbroadcastw", { XM, EXxmm_mw }, 0 },
10099 },
10100 {
10101 /* VEX_W_0F38CF_P_2 */
10102 { "vgf2p8mulb", { XM, Vex, EXx }, 0 },
10103 },
10104 {
10105 /* VEX_W_0F3A00_P_2 */
10106 { Bad_Opcode },
10107 { "vpermq", { XM, EXx, Ib }, 0 },
10108 },
10109 {
10110 /* VEX_W_0F3A01_P_2 */
10111 { Bad_Opcode },
10112 { "vpermpd", { XM, EXx, Ib }, 0 },
10113 },
10114 {
10115 /* VEX_W_0F3A02_P_2 */
10116 { "vpblendd", { XM, Vex, EXx, Ib }, 0 },
10117 },
10118 {
10119 /* VEX_W_0F3A04_P_2 */
10120 { "vpermilps", { XM, EXx, Ib }, 0 },
10121 },
10122 {
10123 /* VEX_W_0F3A05_P_2 */
10124 { "vpermilpd", { XM, EXx, Ib }, 0 },
10125 },
10126 {
10127 /* VEX_W_0F3A06_P_2 */
10128 { "vperm2f128", { XM, Vex256, EXx, Ib }, 0 },
10129 },
10130 {
10131 /* VEX_W_0F3A18_P_2 */
10132 { "vinsertf128", { XM, Vex256, EXxmm, Ib }, 0 },
10133 },
10134 {
10135 /* VEX_W_0F3A19_P_2 */
10136 { "vextractf128", { EXxmm, XM, Ib }, 0 },
10137 },
10138 {
10139 /* VEX_W_0F3A30_P_2_LEN_0 */
10140 { MOD_TABLE (MOD_VEX_W_0_0F3A30_P_2_LEN_0) },
10141 { MOD_TABLE (MOD_VEX_W_1_0F3A30_P_2_LEN_0) },
10142 },
10143 {
10144 /* VEX_W_0F3A31_P_2_LEN_0 */
10145 { MOD_TABLE (MOD_VEX_W_0_0F3A31_P_2_LEN_0) },
10146 { MOD_TABLE (MOD_VEX_W_1_0F3A31_P_2_LEN_0) },
10147 },
10148 {
10149 /* VEX_W_0F3A32_P_2_LEN_0 */
10150 { MOD_TABLE (MOD_VEX_W_0_0F3A32_P_2_LEN_0) },
10151 { MOD_TABLE (MOD_VEX_W_1_0F3A32_P_2_LEN_0) },
10152 },
10153 {
10154 /* VEX_W_0F3A33_P_2_LEN_0 */
10155 { MOD_TABLE (MOD_VEX_W_0_0F3A33_P_2_LEN_0) },
10156 { MOD_TABLE (MOD_VEX_W_1_0F3A33_P_2_LEN_0) },
10157 },
10158 {
10159 /* VEX_W_0F3A38_P_2 */
10160 { "vinserti128", { XM, Vex256, EXxmm, Ib }, 0 },
10161 },
10162 {
10163 /* VEX_W_0F3A39_P_2 */
10164 { "vextracti128", { EXxmm, XM, Ib }, 0 },
10165 },
10166 {
10167 /* VEX_W_0F3A46_P_2 */
10168 { "vperm2i128", { XM, Vex256, EXx, Ib }, 0 },
10169 },
10170 {
10171 /* VEX_W_0F3A48_P_2 */
10172 { "vpermil2ps", { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW }, 0 },
10173 { "vpermil2ps", { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW }, 0 },
10174 },
10175 {
10176 /* VEX_W_0F3A49_P_2 */
10177 { "vpermil2pd", { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW }, 0 },
10178 { "vpermil2pd", { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW }, 0 },
10179 },
10180 {
10181 /* VEX_W_0F3A4A_P_2 */
10182 { "vblendvps", { XM, Vex, EXx, XMVexI4 }, 0 },
10183 },
10184 {
10185 /* VEX_W_0F3A4B_P_2 */
10186 { "vblendvpd", { XM, Vex, EXx, XMVexI4 }, 0 },
10187 },
10188 {
10189 /* VEX_W_0F3A4C_P_2 */
10190 { "vpblendvb", { XM, Vex, EXx, XMVexI4 }, 0 },
10191 },
10192 {
10193 /* VEX_W_0F3ACE_P_2 */
10194 { Bad_Opcode },
10195 { "vgf2p8affineqb", { XM, Vex, EXx, Ib }, 0 },
10196 },
10197 {
10198 /* VEX_W_0F3ACF_P_2 */
10199 { Bad_Opcode },
10200 { "vgf2p8affineinvqb", { XM, Vex, EXx, Ib }, 0 },
10201 },
10202 #define NEED_VEX_W_TABLE
10203 #include "i386-dis-evex.h"
10204 #undef NEED_VEX_W_TABLE
10205 };
10206
10207 static const struct dis386 mod_table[][2] = {
10208 {
10209 /* MOD_8D */
10210 { "leaS", { Gv, M }, 0 },
10211 },
10212 {
10213 /* MOD_C6_REG_7 */
10214 { Bad_Opcode },
10215 { RM_TABLE (RM_C6_REG_7) },
10216 },
10217 {
10218 /* MOD_C7_REG_7 */
10219 { Bad_Opcode },
10220 { RM_TABLE (RM_C7_REG_7) },
10221 },
10222 {
10223 /* MOD_FF_REG_3 */
10224 { "Jcall^", { indirEp }, 0 },
10225 },
10226 {
10227 /* MOD_FF_REG_5 */
10228 { "Jjmp^", { indirEp }, 0 },
10229 },
10230 {
10231 /* MOD_0F01_REG_0 */
10232 { X86_64_TABLE (X86_64_0F01_REG_0) },
10233 { RM_TABLE (RM_0F01_REG_0) },
10234 },
10235 {
10236 /* MOD_0F01_REG_1 */
10237 { X86_64_TABLE (X86_64_0F01_REG_1) },
10238 { RM_TABLE (RM_0F01_REG_1) },
10239 },
10240 {
10241 /* MOD_0F01_REG_2 */
10242 { X86_64_TABLE (X86_64_0F01_REG_2) },
10243 { RM_TABLE (RM_0F01_REG_2) },
10244 },
10245 {
10246 /* MOD_0F01_REG_3 */
10247 { X86_64_TABLE (X86_64_0F01_REG_3) },
10248 { RM_TABLE (RM_0F01_REG_3) },
10249 },
10250 {
10251 /* MOD_0F01_REG_5 */
10252 { PREFIX_TABLE (PREFIX_MOD_0_0F01_REG_5) },
10253 { RM_TABLE (RM_0F01_REG_5) },
10254 },
10255 {
10256 /* MOD_0F01_REG_7 */
10257 { "invlpg", { Mb }, 0 },
10258 { RM_TABLE (RM_0F01_REG_7) },
10259 },
10260 {
10261 /* MOD_0F12_PREFIX_0 */
10262 { "movlps", { XM, EXq }, PREFIX_OPCODE },
10263 { "movhlps", { XM, EXq }, PREFIX_OPCODE },
10264 },
10265 {
10266 /* MOD_0F13 */
10267 { "movlpX", { EXq, XM }, PREFIX_OPCODE },
10268 },
10269 {
10270 /* MOD_0F16_PREFIX_0 */
10271 { "movhps", { XM, EXq }, 0 },
10272 { "movlhps", { XM, EXq }, 0 },
10273 },
10274 {
10275 /* MOD_0F17 */
10276 { "movhpX", { EXq, XM }, PREFIX_OPCODE },
10277 },
10278 {
10279 /* MOD_0F18_REG_0 */
10280 { "prefetchnta", { Mb }, 0 },
10281 },
10282 {
10283 /* MOD_0F18_REG_1 */
10284 { "prefetcht0", { Mb }, 0 },
10285 },
10286 {
10287 /* MOD_0F18_REG_2 */
10288 { "prefetcht1", { Mb }, 0 },
10289 },
10290 {
10291 /* MOD_0F18_REG_3 */
10292 { "prefetcht2", { Mb }, 0 },
10293 },
10294 {
10295 /* MOD_0F18_REG_4 */
10296 { "nop/reserved", { Mb }, 0 },
10297 },
10298 {
10299 /* MOD_0F18_REG_5 */
10300 { "nop/reserved", { Mb }, 0 },
10301 },
10302 {
10303 /* MOD_0F18_REG_6 */
10304 { "nop/reserved", { Mb }, 0 },
10305 },
10306 {
10307 /* MOD_0F18_REG_7 */
10308 { "nop/reserved", { Mb }, 0 },
10309 },
10310 {
10311 /* MOD_0F1A_PREFIX_0 */
10312 { "bndldx", { Gbnd, Mv_bnd }, 0 },
10313 { "nopQ", { Ev }, 0 },
10314 },
10315 {
10316 /* MOD_0F1B_PREFIX_0 */
10317 { "bndstx", { Mv_bnd, Gbnd }, 0 },
10318 { "nopQ", { Ev }, 0 },
10319 },
10320 {
10321 /* MOD_0F1B_PREFIX_1 */
10322 { "bndmk", { Gbnd, Mv_bnd }, 0 },
10323 { "nopQ", { Ev }, 0 },
10324 },
10325 {
10326 /* MOD_0F1C_PREFIX_0 */
10327 { REG_TABLE (REG_0F1C_MOD_0) },
10328 { "nopQ", { Ev }, 0 },
10329 },
10330 {
10331 /* MOD_0F1E_PREFIX_1 */
10332 { "nopQ", { Ev }, 0 },
10333 { REG_TABLE (REG_0F1E_MOD_3) },
10334 },
10335 {
10336 /* MOD_0F24 */
10337 { Bad_Opcode },
10338 { "movL", { Rd, Td }, 0 },
10339 },
10340 {
10341 /* MOD_0F26 */
10342 { Bad_Opcode },
10343 { "movL", { Td, Rd }, 0 },
10344 },
10345 {
10346 /* MOD_0F2B_PREFIX_0 */
10347 {"movntps", { Mx, XM }, PREFIX_OPCODE },
10348 },
10349 {
10350 /* MOD_0F2B_PREFIX_1 */
10351 {"movntss", { Md, XM }, PREFIX_OPCODE },
10352 },
10353 {
10354 /* MOD_0F2B_PREFIX_2 */
10355 {"movntpd", { Mx, XM }, PREFIX_OPCODE },
10356 },
10357 {
10358 /* MOD_0F2B_PREFIX_3 */
10359 {"movntsd", { Mq, XM }, PREFIX_OPCODE },
10360 },
10361 {
10362 /* MOD_0F51 */
10363 { Bad_Opcode },
10364 { "movmskpX", { Gdq, XS }, PREFIX_OPCODE },
10365 },
10366 {
10367 /* MOD_0F71_REG_2 */
10368 { Bad_Opcode },
10369 { "psrlw", { MS, Ib }, 0 },
10370 },
10371 {
10372 /* MOD_0F71_REG_4 */
10373 { Bad_Opcode },
10374 { "psraw", { MS, Ib }, 0 },
10375 },
10376 {
10377 /* MOD_0F71_REG_6 */
10378 { Bad_Opcode },
10379 { "psllw", { MS, Ib }, 0 },
10380 },
10381 {
10382 /* MOD_0F72_REG_2 */
10383 { Bad_Opcode },
10384 { "psrld", { MS, Ib }, 0 },
10385 },
10386 {
10387 /* MOD_0F72_REG_4 */
10388 { Bad_Opcode },
10389 { "psrad", { MS, Ib }, 0 },
10390 },
10391 {
10392 /* MOD_0F72_REG_6 */
10393 { Bad_Opcode },
10394 { "pslld", { MS, Ib }, 0 },
10395 },
10396 {
10397 /* MOD_0F73_REG_2 */
10398 { Bad_Opcode },
10399 { "psrlq", { MS, Ib }, 0 },
10400 },
10401 {
10402 /* MOD_0F73_REG_3 */
10403 { Bad_Opcode },
10404 { PREFIX_TABLE (PREFIX_0F73_REG_3) },
10405 },
10406 {
10407 /* MOD_0F73_REG_6 */
10408 { Bad_Opcode },
10409 { "psllq", { MS, Ib }, 0 },
10410 },
10411 {
10412 /* MOD_0F73_REG_7 */
10413 { Bad_Opcode },
10414 { PREFIX_TABLE (PREFIX_0F73_REG_7) },
10415 },
10416 {
10417 /* MOD_0FAE_REG_0 */
10418 { "fxsave", { FXSAVE }, 0 },
10419 { PREFIX_TABLE (PREFIX_0FAE_REG_0) },
10420 },
10421 {
10422 /* MOD_0FAE_REG_1 */
10423 { "fxrstor", { FXSAVE }, 0 },
10424 { PREFIX_TABLE (PREFIX_0FAE_REG_1) },
10425 },
10426 {
10427 /* MOD_0FAE_REG_2 */
10428 { "ldmxcsr", { Md }, 0 },
10429 { PREFIX_TABLE (PREFIX_0FAE_REG_2) },
10430 },
10431 {
10432 /* MOD_0FAE_REG_3 */
10433 { "stmxcsr", { Md }, 0 },
10434 { PREFIX_TABLE (PREFIX_0FAE_REG_3) },
10435 },
10436 {
10437 /* MOD_0FAE_REG_4 */
10438 { PREFIX_TABLE (PREFIX_MOD_0_0FAE_REG_4) },
10439 { PREFIX_TABLE (PREFIX_MOD_3_0FAE_REG_4) },
10440 },
10441 {
10442 /* MOD_0FAE_REG_5 */
10443 { PREFIX_TABLE (PREFIX_MOD_0_0FAE_REG_5) },
10444 { PREFIX_TABLE (PREFIX_MOD_3_0FAE_REG_5) },
10445 },
10446 {
10447 /* MOD_0FAE_REG_6 */
10448 { PREFIX_TABLE (PREFIX_MOD_0_0FAE_REG_6) },
10449 { PREFIX_TABLE (PREFIX_MOD_1_0FAE_REG_6) },
10450 },
10451 {
10452 /* MOD_0FAE_REG_7 */
10453 { PREFIX_TABLE (PREFIX_0FAE_REG_7) },
10454 { RM_TABLE (RM_0FAE_REG_7) },
10455 },
10456 {
10457 /* MOD_0FB2 */
10458 { "lssS", { Gv, Mp }, 0 },
10459 },
10460 {
10461 /* MOD_0FB4 */
10462 { "lfsS", { Gv, Mp }, 0 },
10463 },
10464 {
10465 /* MOD_0FB5 */
10466 { "lgsS", { Gv, Mp }, 0 },
10467 },
10468 {
10469 /* MOD_0FC3 */
10470 { PREFIX_TABLE (PREFIX_MOD_0_0FC3) },
10471 },
10472 {
10473 /* MOD_0FC7_REG_3 */
10474 { "xrstors", { FXSAVE }, 0 },
10475 },
10476 {
10477 /* MOD_0FC7_REG_4 */
10478 { "xsavec", { FXSAVE }, 0 },
10479 },
10480 {
10481 /* MOD_0FC7_REG_5 */
10482 { "xsaves", { FXSAVE }, 0 },
10483 },
10484 {
10485 /* MOD_0FC7_REG_6 */
10486 { PREFIX_TABLE (PREFIX_MOD_0_0FC7_REG_6) },
10487 { PREFIX_TABLE (PREFIX_MOD_3_0FC7_REG_6) }
10488 },
10489 {
10490 /* MOD_0FC7_REG_7 */
10491 { "vmptrst", { Mq }, 0 },
10492 { PREFIX_TABLE (PREFIX_MOD_3_0FC7_REG_7) }
10493 },
10494 {
10495 /* MOD_0FD7 */
10496 { Bad_Opcode },
10497 { "pmovmskb", { Gdq, MS }, 0 },
10498 },
10499 {
10500 /* MOD_0FE7_PREFIX_2 */
10501 { "movntdq", { Mx, XM }, 0 },
10502 },
10503 {
10504 /* MOD_0FF0_PREFIX_3 */
10505 { "lddqu", { XM, M }, 0 },
10506 },
10507 {
10508 /* MOD_0F382A_PREFIX_2 */
10509 { "movntdqa", { XM, Mx }, 0 },
10510 },
10511 {
10512 /* MOD_0F38F5_PREFIX_2 */
10513 { "wrussK", { M, Gdq }, PREFIX_OPCODE },
10514 },
10515 {
10516 /* MOD_0F38F6_PREFIX_0 */
10517 { "wrssK", { M, Gdq }, PREFIX_OPCODE },
10518 },
10519 {
10520 /* MOD_0F38F8_PREFIX_2 */
10521 { "movdir64b", { Gva, M }, PREFIX_OPCODE },
10522 },
10523 {
10524 /* MOD_0F38F9_PREFIX_0 */
10525 { "movdiri", { Em, Gv }, PREFIX_OPCODE },
10526 },
10527 {
10528 /* MOD_62_32BIT */
10529 { "bound{S|}", { Gv, Ma }, 0 },
10530 { EVEX_TABLE (EVEX_0F) },
10531 },
10532 {
10533 /* MOD_C4_32BIT */
10534 { "lesS", { Gv, Mp }, 0 },
10535 { VEX_C4_TABLE (VEX_0F) },
10536 },
10537 {
10538 /* MOD_C5_32BIT */
10539 { "ldsS", { Gv, Mp }, 0 },
10540 { VEX_C5_TABLE (VEX_0F) },
10541 },
10542 {
10543 /* MOD_VEX_0F12_PREFIX_0 */
10544 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_0) },
10545 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_1) },
10546 },
10547 {
10548 /* MOD_VEX_0F13 */
10549 { VEX_LEN_TABLE (VEX_LEN_0F13_M_0) },
10550 },
10551 {
10552 /* MOD_VEX_0F16_PREFIX_0 */
10553 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_0) },
10554 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_1) },
10555 },
10556 {
10557 /* MOD_VEX_0F17 */
10558 { VEX_LEN_TABLE (VEX_LEN_0F17_M_0) },
10559 },
10560 {
10561 /* MOD_VEX_0F2B */
10562 { "vmovntpX", { Mx, XM }, 0 },
10563 },
10564 {
10565 /* MOD_VEX_W_0_0F41_P_0_LEN_1 */
10566 { Bad_Opcode },
10567 { "kandw", { MaskG, MaskVex, MaskR }, 0 },
10568 },
10569 {
10570 /* MOD_VEX_W_1_0F41_P_0_LEN_1 */
10571 { Bad_Opcode },
10572 { "kandq", { MaskG, MaskVex, MaskR }, 0 },
10573 },
10574 {
10575 /* MOD_VEX_W_0_0F41_P_2_LEN_1 */
10576 { Bad_Opcode },
10577 { "kandb", { MaskG, MaskVex, MaskR }, 0 },
10578 },
10579 {
10580 /* MOD_VEX_W_1_0F41_P_2_LEN_1 */
10581 { Bad_Opcode },
10582 { "kandd", { MaskG, MaskVex, MaskR }, 0 },
10583 },
10584 {
10585 /* MOD_VEX_W_0_0F42_P_0_LEN_1 */
10586 { Bad_Opcode },
10587 { "kandnw", { MaskG, MaskVex, MaskR }, 0 },
10588 },
10589 {
10590 /* MOD_VEX_W_1_0F42_P_0_LEN_1 */
10591 { Bad_Opcode },
10592 { "kandnq", { MaskG, MaskVex, MaskR }, 0 },
10593 },
10594 {
10595 /* MOD_VEX_W_0_0F42_P_2_LEN_1 */
10596 { Bad_Opcode },
10597 { "kandnb", { MaskG, MaskVex, MaskR }, 0 },
10598 },
10599 {
10600 /* MOD_VEX_W_1_0F42_P_2_LEN_1 */
10601 { Bad_Opcode },
10602 { "kandnd", { MaskG, MaskVex, MaskR }, 0 },
10603 },
10604 {
10605 /* MOD_VEX_W_0_0F44_P_0_LEN_0 */
10606 { Bad_Opcode },
10607 { "knotw", { MaskG, MaskR }, 0 },
10608 },
10609 {
10610 /* MOD_VEX_W_1_0F44_P_0_LEN_0 */
10611 { Bad_Opcode },
10612 { "knotq", { MaskG, MaskR }, 0 },
10613 },
10614 {
10615 /* MOD_VEX_W_0_0F44_P_2_LEN_0 */
10616 { Bad_Opcode },
10617 { "knotb", { MaskG, MaskR }, 0 },
10618 },
10619 {
10620 /* MOD_VEX_W_1_0F44_P_2_LEN_0 */
10621 { Bad_Opcode },
10622 { "knotd", { MaskG, MaskR }, 0 },
10623 },
10624 {
10625 /* MOD_VEX_W_0_0F45_P_0_LEN_1 */
10626 { Bad_Opcode },
10627 { "korw", { MaskG, MaskVex, MaskR }, 0 },
10628 },
10629 {
10630 /* MOD_VEX_W_1_0F45_P_0_LEN_1 */
10631 { Bad_Opcode },
10632 { "korq", { MaskG, MaskVex, MaskR }, 0 },
10633 },
10634 {
10635 /* MOD_VEX_W_0_0F45_P_2_LEN_1 */
10636 { Bad_Opcode },
10637 { "korb", { MaskG, MaskVex, MaskR }, 0 },
10638 },
10639 {
10640 /* MOD_VEX_W_1_0F45_P_2_LEN_1 */
10641 { Bad_Opcode },
10642 { "kord", { MaskG, MaskVex, MaskR }, 0 },
10643 },
10644 {
10645 /* MOD_VEX_W_0_0F46_P_0_LEN_1 */
10646 { Bad_Opcode },
10647 { "kxnorw", { MaskG, MaskVex, MaskR }, 0 },
10648 },
10649 {
10650 /* MOD_VEX_W_1_0F46_P_0_LEN_1 */
10651 { Bad_Opcode },
10652 { "kxnorq", { MaskG, MaskVex, MaskR }, 0 },
10653 },
10654 {
10655 /* MOD_VEX_W_0_0F46_P_2_LEN_1 */
10656 { Bad_Opcode },
10657 { "kxnorb", { MaskG, MaskVex, MaskR }, 0 },
10658 },
10659 {
10660 /* MOD_VEX_W_1_0F46_P_2_LEN_1 */
10661 { Bad_Opcode },
10662 { "kxnord", { MaskG, MaskVex, MaskR }, 0 },
10663 },
10664 {
10665 /* MOD_VEX_W_0_0F47_P_0_LEN_1 */
10666 { Bad_Opcode },
10667 { "kxorw", { MaskG, MaskVex, MaskR }, 0 },
10668 },
10669 {
10670 /* MOD_VEX_W_1_0F47_P_0_LEN_1 */
10671 { Bad_Opcode },
10672 { "kxorq", { MaskG, MaskVex, MaskR }, 0 },
10673 },
10674 {
10675 /* MOD_VEX_W_0_0F47_P_2_LEN_1 */
10676 { Bad_Opcode },
10677 { "kxorb", { MaskG, MaskVex, MaskR }, 0 },
10678 },
10679 {
10680 /* MOD_VEX_W_1_0F47_P_2_LEN_1 */
10681 { Bad_Opcode },
10682 { "kxord", { MaskG, MaskVex, MaskR }, 0 },
10683 },
10684 {
10685 /* MOD_VEX_W_0_0F4A_P_0_LEN_1 */
10686 { Bad_Opcode },
10687 { "kaddw", { MaskG, MaskVex, MaskR }, 0 },
10688 },
10689 {
10690 /* MOD_VEX_W_1_0F4A_P_0_LEN_1 */
10691 { Bad_Opcode },
10692 { "kaddq", { MaskG, MaskVex, MaskR }, 0 },
10693 },
10694 {
10695 /* MOD_VEX_W_0_0F4A_P_2_LEN_1 */
10696 { Bad_Opcode },
10697 { "kaddb", { MaskG, MaskVex, MaskR }, 0 },
10698 },
10699 {
10700 /* MOD_VEX_W_1_0F4A_P_2_LEN_1 */
10701 { Bad_Opcode },
10702 { "kaddd", { MaskG, MaskVex, MaskR }, 0 },
10703 },
10704 {
10705 /* MOD_VEX_W_0_0F4B_P_0_LEN_1 */
10706 { Bad_Opcode },
10707 { "kunpckwd", { MaskG, MaskVex, MaskR }, 0 },
10708 },
10709 {
10710 /* MOD_VEX_W_1_0F4B_P_0_LEN_1 */
10711 { Bad_Opcode },
10712 { "kunpckdq", { MaskG, MaskVex, MaskR }, 0 },
10713 },
10714 {
10715 /* MOD_VEX_W_0_0F4B_P_2_LEN_1 */
10716 { Bad_Opcode },
10717 { "kunpckbw", { MaskG, MaskVex, MaskR }, 0 },
10718 },
10719 {
10720 /* MOD_VEX_0F50 */
10721 { Bad_Opcode },
10722 { "vmovmskpX", { Gdq, XS }, 0 },
10723 },
10724 {
10725 /* MOD_VEX_0F71_REG_2 */
10726 { Bad_Opcode },
10727 { PREFIX_TABLE (PREFIX_VEX_0F71_REG_2) },
10728 },
10729 {
10730 /* MOD_VEX_0F71_REG_4 */
10731 { Bad_Opcode },
10732 { PREFIX_TABLE (PREFIX_VEX_0F71_REG_4) },
10733 },
10734 {
10735 /* MOD_VEX_0F71_REG_6 */
10736 { Bad_Opcode },
10737 { PREFIX_TABLE (PREFIX_VEX_0F71_REG_6) },
10738 },
10739 {
10740 /* MOD_VEX_0F72_REG_2 */
10741 { Bad_Opcode },
10742 { PREFIX_TABLE (PREFIX_VEX_0F72_REG_2) },
10743 },
10744 {
10745 /* MOD_VEX_0F72_REG_4 */
10746 { Bad_Opcode },
10747 { PREFIX_TABLE (PREFIX_VEX_0F72_REG_4) },
10748 },
10749 {
10750 /* MOD_VEX_0F72_REG_6 */
10751 { Bad_Opcode },
10752 { PREFIX_TABLE (PREFIX_VEX_0F72_REG_6) },
10753 },
10754 {
10755 /* MOD_VEX_0F73_REG_2 */
10756 { Bad_Opcode },
10757 { PREFIX_TABLE (PREFIX_VEX_0F73_REG_2) },
10758 },
10759 {
10760 /* MOD_VEX_0F73_REG_3 */
10761 { Bad_Opcode },
10762 { PREFIX_TABLE (PREFIX_VEX_0F73_REG_3) },
10763 },
10764 {
10765 /* MOD_VEX_0F73_REG_6 */
10766 { Bad_Opcode },
10767 { PREFIX_TABLE (PREFIX_VEX_0F73_REG_6) },
10768 },
10769 {
10770 /* MOD_VEX_0F73_REG_7 */
10771 { Bad_Opcode },
10772 { PREFIX_TABLE (PREFIX_VEX_0F73_REG_7) },
10773 },
10774 {
10775 /* MOD_VEX_W_0_0F91_P_0_LEN_0 */
10776 { "kmovw", { Ew, MaskG }, 0 },
10777 { Bad_Opcode },
10778 },
10779 {
10780 /* MOD_VEX_W_0_0F91_P_0_LEN_0 */
10781 { "kmovq", { Eq, MaskG }, 0 },
10782 { Bad_Opcode },
10783 },
10784 {
10785 /* MOD_VEX_W_0_0F91_P_2_LEN_0 */
10786 { "kmovb", { Eb, MaskG }, 0 },
10787 { Bad_Opcode },
10788 },
10789 {
10790 /* MOD_VEX_W_0_0F91_P_2_LEN_0 */
10791 { "kmovd", { Ed, MaskG }, 0 },
10792 { Bad_Opcode },
10793 },
10794 {
10795 /* MOD_VEX_W_0_0F92_P_0_LEN_0 */
10796 { Bad_Opcode },
10797 { "kmovw", { MaskG, Rdq }, 0 },
10798 },
10799 {
10800 /* MOD_VEX_W_0_0F92_P_2_LEN_0 */
10801 { Bad_Opcode },
10802 { "kmovb", { MaskG, Rdq }, 0 },
10803 },
10804 {
10805 /* MOD_VEX_0F92_P_3_LEN_0 */
10806 { Bad_Opcode },
10807 { "kmovK", { MaskG, Rdq }, 0 },
10808 },
10809 {
10810 /* MOD_VEX_W_0_0F93_P_0_LEN_0 */
10811 { Bad_Opcode },
10812 { "kmovw", { Gdq, MaskR }, 0 },
10813 },
10814 {
10815 /* MOD_VEX_W_0_0F93_P_2_LEN_0 */
10816 { Bad_Opcode },
10817 { "kmovb", { Gdq, MaskR }, 0 },
10818 },
10819 {
10820 /* MOD_VEX_0F93_P_3_LEN_0 */
10821 { Bad_Opcode },
10822 { "kmovK", { Gdq, MaskR }, 0 },
10823 },
10824 {
10825 /* MOD_VEX_W_0_0F98_P_0_LEN_0 */
10826 { Bad_Opcode },
10827 { "kortestw", { MaskG, MaskR }, 0 },
10828 },
10829 {
10830 /* MOD_VEX_W_1_0F98_P_0_LEN_0 */
10831 { Bad_Opcode },
10832 { "kortestq", { MaskG, MaskR }, 0 },
10833 },
10834 {
10835 /* MOD_VEX_W_0_0F98_P_2_LEN_0 */
10836 { Bad_Opcode },
10837 { "kortestb", { MaskG, MaskR }, 0 },
10838 },
10839 {
10840 /* MOD_VEX_W_1_0F98_P_2_LEN_0 */
10841 { Bad_Opcode },
10842 { "kortestd", { MaskG, MaskR }, 0 },
10843 },
10844 {
10845 /* MOD_VEX_W_0_0F99_P_0_LEN_0 */
10846 { Bad_Opcode },
10847 { "ktestw", { MaskG, MaskR }, 0 },
10848 },
10849 {
10850 /* MOD_VEX_W_1_0F99_P_0_LEN_0 */
10851 { Bad_Opcode },
10852 { "ktestq", { MaskG, MaskR }, 0 },
10853 },
10854 {
10855 /* MOD_VEX_W_0_0F99_P_2_LEN_0 */
10856 { Bad_Opcode },
10857 { "ktestb", { MaskG, MaskR }, 0 },
10858 },
10859 {
10860 /* MOD_VEX_W_1_0F99_P_2_LEN_0 */
10861 { Bad_Opcode },
10862 { "ktestd", { MaskG, MaskR }, 0 },
10863 },
10864 {
10865 /* MOD_VEX_0FAE_REG_2 */
10866 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_2_M_0) },
10867 },
10868 {
10869 /* MOD_VEX_0FAE_REG_3 */
10870 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_3_M_0) },
10871 },
10872 {
10873 /* MOD_VEX_0FD7_PREFIX_2 */
10874 { Bad_Opcode },
10875 { "vpmovmskb", { Gdq, XS }, 0 },
10876 },
10877 {
10878 /* MOD_VEX_0FE7_PREFIX_2 */
10879 { "vmovntdq", { Mx, XM }, 0 },
10880 },
10881 {
10882 /* MOD_VEX_0FF0_PREFIX_3 */
10883 { "vlddqu", { XM, M }, 0 },
10884 },
10885 {
10886 /* MOD_VEX_0F381A_PREFIX_2 */
10887 { VEX_LEN_TABLE (VEX_LEN_0F381A_P_2_M_0) },
10888 },
10889 {
10890 /* MOD_VEX_0F382A_PREFIX_2 */
10891 { "vmovntdqa", { XM, Mx }, 0 },
10892 },
10893 {
10894 /* MOD_VEX_0F382C_PREFIX_2 */
10895 { VEX_W_TABLE (VEX_W_0F382C_P_2_M_0) },
10896 },
10897 {
10898 /* MOD_VEX_0F382D_PREFIX_2 */
10899 { VEX_W_TABLE (VEX_W_0F382D_P_2_M_0) },
10900 },
10901 {
10902 /* MOD_VEX_0F382E_PREFIX_2 */
10903 { VEX_W_TABLE (VEX_W_0F382E_P_2_M_0) },
10904 },
10905 {
10906 /* MOD_VEX_0F382F_PREFIX_2 */
10907 { VEX_W_TABLE (VEX_W_0F382F_P_2_M_0) },
10908 },
10909 {
10910 /* MOD_VEX_0F385A_PREFIX_2 */
10911 { VEX_LEN_TABLE (VEX_LEN_0F385A_P_2_M_0) },
10912 },
10913 {
10914 /* MOD_VEX_0F388C_PREFIX_2 */
10915 { "vpmaskmov%LW", { XM, Vex, Mx }, 0 },
10916 },
10917 {
10918 /* MOD_VEX_0F388E_PREFIX_2 */
10919 { "vpmaskmov%LW", { Mx, Vex, XM }, 0 },
10920 },
10921 {
10922 /* MOD_VEX_W_0_0F3A30_P_2_LEN_0 */
10923 { Bad_Opcode },
10924 { "kshiftrb", { MaskG, MaskR, Ib }, 0 },
10925 },
10926 {
10927 /* MOD_VEX_W_1_0F3A30_P_2_LEN_0 */
10928 { Bad_Opcode },
10929 { "kshiftrw", { MaskG, MaskR, Ib }, 0 },
10930 },
10931 {
10932 /* MOD_VEX_W_0_0F3A31_P_2_LEN_0 */
10933 { Bad_Opcode },
10934 { "kshiftrd", { MaskG, MaskR, Ib }, 0 },
10935 },
10936 {
10937 /* MOD_VEX_W_1_0F3A31_P_2_LEN_0 */
10938 { Bad_Opcode },
10939 { "kshiftrq", { MaskG, MaskR, Ib }, 0 },
10940 },
10941 {
10942 /* MOD_VEX_W_0_0F3A32_P_2_LEN_0 */
10943 { Bad_Opcode },
10944 { "kshiftlb", { MaskG, MaskR, Ib }, 0 },
10945 },
10946 {
10947 /* MOD_VEX_W_1_0F3A32_P_2_LEN_0 */
10948 { Bad_Opcode },
10949 { "kshiftlw", { MaskG, MaskR, Ib }, 0 },
10950 },
10951 {
10952 /* MOD_VEX_W_0_0F3A33_P_2_LEN_0 */
10953 { Bad_Opcode },
10954 { "kshiftld", { MaskG, MaskR, Ib }, 0 },
10955 },
10956 {
10957 /* MOD_VEX_W_1_0F3A33_P_2_LEN_0 */
10958 { Bad_Opcode },
10959 { "kshiftlq", { MaskG, MaskR, Ib }, 0 },
10960 },
10961 #define NEED_MOD_TABLE
10962 #include "i386-dis-evex.h"
10963 #undef NEED_MOD_TABLE
10964 };
10965
10966 static const struct dis386 rm_table[][8] = {
10967 {
10968 /* RM_C6_REG_7 */
10969 { "xabort", { Skip_MODRM, Ib }, 0 },
10970 },
10971 {
10972 /* RM_C7_REG_7 */
10973 { "xbeginT", { Skip_MODRM, Jv }, 0 },
10974 },
10975 {
10976 /* RM_0F01_REG_0 */
10977 { "enclv", { Skip_MODRM }, 0 },
10978 { "vmcall", { Skip_MODRM }, 0 },
10979 { "vmlaunch", { Skip_MODRM }, 0 },
10980 { "vmresume", { Skip_MODRM }, 0 },
10981 { "vmxoff", { Skip_MODRM }, 0 },
10982 { "pconfig", { Skip_MODRM }, 0 },
10983 },
10984 {
10985 /* RM_0F01_REG_1 */
10986 { "monitor", { { OP_Monitor, 0 } }, 0 },
10987 { "mwait", { { OP_Mwait, 0 } }, 0 },
10988 { "clac", { Skip_MODRM }, 0 },
10989 { "stac", { Skip_MODRM }, 0 },
10990 { Bad_Opcode },
10991 { Bad_Opcode },
10992 { Bad_Opcode },
10993 { "encls", { Skip_MODRM }, 0 },
10994 },
10995 {
10996 /* RM_0F01_REG_2 */
10997 { "xgetbv", { Skip_MODRM }, 0 },
10998 { "xsetbv", { Skip_MODRM }, 0 },
10999 { Bad_Opcode },
11000 { Bad_Opcode },
11001 { "vmfunc", { Skip_MODRM }, 0 },
11002 { "xend", { Skip_MODRM }, 0 },
11003 { "xtest", { Skip_MODRM }, 0 },
11004 { "enclu", { Skip_MODRM }, 0 },
11005 },
11006 {
11007 /* RM_0F01_REG_3 */
11008 { "vmrun", { Skip_MODRM }, 0 },
11009 { "vmmcall", { Skip_MODRM }, 0 },
11010 { "vmload", { Skip_MODRM }, 0 },
11011 { "vmsave", { Skip_MODRM }, 0 },
11012 { "stgi", { Skip_MODRM }, 0 },
11013 { "clgi", { Skip_MODRM }, 0 },
11014 { "skinit", { Skip_MODRM }, 0 },
11015 { "invlpga", { Skip_MODRM }, 0 },
11016 },
11017 {
11018 /* RM_0F01_REG_5 */
11019 { PREFIX_TABLE (PREFIX_MOD_3_0F01_REG_5_RM_0) },
11020 { Bad_Opcode },
11021 { PREFIX_TABLE (PREFIX_MOD_3_0F01_REG_5_RM_2) },
11022 { Bad_Opcode },
11023 { Bad_Opcode },
11024 { Bad_Opcode },
11025 { "rdpkru", { Skip_MODRM }, 0 },
11026 { "wrpkru", { Skip_MODRM }, 0 },
11027 },
11028 {
11029 /* RM_0F01_REG_7 */
11030 { "swapgs", { Skip_MODRM }, 0 },
11031 { "rdtscp", { Skip_MODRM }, 0 },
11032 { "monitorx", { { OP_Monitor, 0 } }, 0 },
11033 { "mwaitx", { { OP_Mwaitx, 0 } }, 0 },
11034 { "clzero", { Skip_MODRM }, 0 },
11035 },
11036 {
11037 /* RM_0F1E_MOD_3_REG_7 */
11038 { "nopQ", { Ev }, 0 },
11039 { "nopQ", { Ev }, 0 },
11040 { "endbr64", { Skip_MODRM }, PREFIX_OPCODE },
11041 { "endbr32", { Skip_MODRM }, PREFIX_OPCODE },
11042 { "nopQ", { Ev }, 0 },
11043 { "nopQ", { Ev }, 0 },
11044 { "nopQ", { Ev }, 0 },
11045 { "nopQ", { Ev }, 0 },
11046 },
11047 {
11048 /* RM_0FAE_REG_6 */
11049 { "mfence", { Skip_MODRM }, 0 },
11050 },
11051 {
11052 /* RM_0FAE_REG_7 */
11053 { "sfence", { Skip_MODRM }, 0 },
11054
11055 },
11056 };
11057
11058 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
11059
11060 /* We use the high bit to indicate different name for the same
11061 prefix. */
11062 #define REP_PREFIX (0xf3 | 0x100)
11063 #define XACQUIRE_PREFIX (0xf2 | 0x200)
11064 #define XRELEASE_PREFIX (0xf3 | 0x400)
11065 #define BND_PREFIX (0xf2 | 0x400)
11066 #define NOTRACK_PREFIX (0x3e | 0x100)
11067
11068 static int
11069 ckprefix (void)
11070 {
11071 int newrex, i, length;
11072 rex = 0;
11073 rex_ignored = 0;
11074 prefixes = 0;
11075 used_prefixes = 0;
11076 rex_used = 0;
11077 last_lock_prefix = -1;
11078 last_repz_prefix = -1;
11079 last_repnz_prefix = -1;
11080 last_data_prefix = -1;
11081 last_addr_prefix = -1;
11082 last_rex_prefix = -1;
11083 last_seg_prefix = -1;
11084 fwait_prefix = -1;
11085 active_seg_prefix = 0;
11086 for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
11087 all_prefixes[i] = 0;
11088 i = 0;
11089 length = 0;
11090 /* The maximum instruction length is 15bytes. */
11091 while (length < MAX_CODE_LENGTH - 1)
11092 {
11093 FETCH_DATA (the_info, codep + 1);
11094 newrex = 0;
11095 switch (*codep)
11096 {
11097 /* REX prefixes family. */
11098 case 0x40:
11099 case 0x41:
11100 case 0x42:
11101 case 0x43:
11102 case 0x44:
11103 case 0x45:
11104 case 0x46:
11105 case 0x47:
11106 case 0x48:
11107 case 0x49:
11108 case 0x4a:
11109 case 0x4b:
11110 case 0x4c:
11111 case 0x4d:
11112 case 0x4e:
11113 case 0x4f:
11114 if (address_mode == mode_64bit)
11115 newrex = *codep;
11116 else
11117 return 1;
11118 last_rex_prefix = i;
11119 break;
11120 case 0xf3:
11121 prefixes |= PREFIX_REPZ;
11122 last_repz_prefix = i;
11123 break;
11124 case 0xf2:
11125 prefixes |= PREFIX_REPNZ;
11126 last_repnz_prefix = i;
11127 break;
11128 case 0xf0:
11129 prefixes |= PREFIX_LOCK;
11130 last_lock_prefix = i;
11131 break;
11132 case 0x2e:
11133 prefixes |= PREFIX_CS;
11134 last_seg_prefix = i;
11135 active_seg_prefix = PREFIX_CS;
11136 break;
11137 case 0x36:
11138 prefixes |= PREFIX_SS;
11139 last_seg_prefix = i;
11140 active_seg_prefix = PREFIX_SS;
11141 break;
11142 case 0x3e:
11143 prefixes |= PREFIX_DS;
11144 last_seg_prefix = i;
11145 active_seg_prefix = PREFIX_DS;
11146 break;
11147 case 0x26:
11148 prefixes |= PREFIX_ES;
11149 last_seg_prefix = i;
11150 active_seg_prefix = PREFIX_ES;
11151 break;
11152 case 0x64:
11153 prefixes |= PREFIX_FS;
11154 last_seg_prefix = i;
11155 active_seg_prefix = PREFIX_FS;
11156 break;
11157 case 0x65:
11158 prefixes |= PREFIX_GS;
11159 last_seg_prefix = i;
11160 active_seg_prefix = PREFIX_GS;
11161 break;
11162 case 0x66:
11163 prefixes |= PREFIX_DATA;
11164 last_data_prefix = i;
11165 break;
11166 case 0x67:
11167 prefixes |= PREFIX_ADDR;
11168 last_addr_prefix = i;
11169 break;
11170 case FWAIT_OPCODE:
11171 /* fwait is really an instruction. If there are prefixes
11172 before the fwait, they belong to the fwait, *not* to the
11173 following instruction. */
11174 fwait_prefix = i;
11175 if (prefixes || rex)
11176 {
11177 prefixes |= PREFIX_FWAIT;
11178 codep++;
11179 /* This ensures that the previous REX prefixes are noticed
11180 as unused prefixes, as in the return case below. */
11181 rex_used = rex;
11182 return 1;
11183 }
11184 prefixes = PREFIX_FWAIT;
11185 break;
11186 default:
11187 return 1;
11188 }
11189 /* Rex is ignored when followed by another prefix. */
11190 if (rex)
11191 {
11192 rex_used = rex;
11193 return 1;
11194 }
11195 if (*codep != FWAIT_OPCODE)
11196 all_prefixes[i++] = *codep;
11197 rex = newrex;
11198 codep++;
11199 length++;
11200 }
11201 return 0;
11202 }
11203
11204 /* Return the name of the prefix byte PREF, or NULL if PREF is not a
11205 prefix byte. */
11206
11207 static const char *
11208 prefix_name (int pref, int sizeflag)
11209 {
11210 static const char *rexes [16] =
11211 {
11212 "rex", /* 0x40 */
11213 "rex.B", /* 0x41 */
11214 "rex.X", /* 0x42 */
11215 "rex.XB", /* 0x43 */
11216 "rex.R", /* 0x44 */
11217 "rex.RB", /* 0x45 */
11218 "rex.RX", /* 0x46 */
11219 "rex.RXB", /* 0x47 */
11220 "rex.W", /* 0x48 */
11221 "rex.WB", /* 0x49 */
11222 "rex.WX", /* 0x4a */
11223 "rex.WXB", /* 0x4b */
11224 "rex.WR", /* 0x4c */
11225 "rex.WRB", /* 0x4d */
11226 "rex.WRX", /* 0x4e */
11227 "rex.WRXB", /* 0x4f */
11228 };
11229
11230 switch (pref)
11231 {
11232 /* REX prefixes family. */
11233 case 0x40:
11234 case 0x41:
11235 case 0x42:
11236 case 0x43:
11237 case 0x44:
11238 case 0x45:
11239 case 0x46:
11240 case 0x47:
11241 case 0x48:
11242 case 0x49:
11243 case 0x4a:
11244 case 0x4b:
11245 case 0x4c:
11246 case 0x4d:
11247 case 0x4e:
11248 case 0x4f:
11249 return rexes [pref - 0x40];
11250 case 0xf3:
11251 return "repz";
11252 case 0xf2:
11253 return "repnz";
11254 case 0xf0:
11255 return "lock";
11256 case 0x2e:
11257 return "cs";
11258 case 0x36:
11259 return "ss";
11260 case 0x3e:
11261 return "ds";
11262 case 0x26:
11263 return "es";
11264 case 0x64:
11265 return "fs";
11266 case 0x65:
11267 return "gs";
11268 case 0x66:
11269 return (sizeflag & DFLAG) ? "data16" : "data32";
11270 case 0x67:
11271 if (address_mode == mode_64bit)
11272 return (sizeflag & AFLAG) ? "addr32" : "addr64";
11273 else
11274 return (sizeflag & AFLAG) ? "addr16" : "addr32";
11275 case FWAIT_OPCODE:
11276 return "fwait";
11277 case REP_PREFIX:
11278 return "rep";
11279 case XACQUIRE_PREFIX:
11280 return "xacquire";
11281 case XRELEASE_PREFIX:
11282 return "xrelease";
11283 case BND_PREFIX:
11284 return "bnd";
11285 case NOTRACK_PREFIX:
11286 return "notrack";
11287 default:
11288 return NULL;
11289 }
11290 }
11291
11292 static char op_out[MAX_OPERANDS][100];
11293 static int op_ad, op_index[MAX_OPERANDS];
11294 static int two_source_ops;
11295 static bfd_vma op_address[MAX_OPERANDS];
11296 static bfd_vma op_riprel[MAX_OPERANDS];
11297 static bfd_vma start_pc;
11298
11299 /*
11300 * On the 386's of 1988, the maximum length of an instruction is 15 bytes.
11301 * (see topic "Redundant prefixes" in the "Differences from 8086"
11302 * section of the "Virtual 8086 Mode" chapter.)
11303 * 'pc' should be the address of this instruction, it will
11304 * be used to print the target address if this is a relative jump or call
11305 * The function returns the length of this instruction in bytes.
11306 */
11307
11308 static char intel_syntax;
11309 static char intel_mnemonic = !SYSV386_COMPAT;
11310 static char open_char;
11311 static char close_char;
11312 static char separator_char;
11313 static char scale_char;
11314
11315 enum x86_64_isa
11316 {
11317 amd64 = 0,
11318 intel64
11319 };
11320
11321 static enum x86_64_isa isa64;
11322
11323 /* Here for backwards compatibility. When gdb stops using
11324 print_insn_i386_att and print_insn_i386_intel these functions can
11325 disappear, and print_insn_i386 be merged into print_insn. */
11326 int
11327 print_insn_i386_att (bfd_vma pc, disassemble_info *info)
11328 {
11329 intel_syntax = 0;
11330
11331 return print_insn (pc, info);
11332 }
11333
11334 int
11335 print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
11336 {
11337 intel_syntax = 1;
11338
11339 return print_insn (pc, info);
11340 }
11341
11342 int
11343 print_insn_i386 (bfd_vma pc, disassemble_info *info)
11344 {
11345 intel_syntax = -1;
11346
11347 return print_insn (pc, info);
11348 }
11349
11350 void
11351 print_i386_disassembler_options (FILE *stream)
11352 {
11353 fprintf (stream, _("\n\
11354 The following i386/x86-64 specific disassembler options are supported for use\n\
11355 with the -M switch (multiple options should be separated by commas):\n"));
11356
11357 fprintf (stream, _(" x86-64 Disassemble in 64bit mode\n"));
11358 fprintf (stream, _(" i386 Disassemble in 32bit mode\n"));
11359 fprintf (stream, _(" i8086 Disassemble in 16bit mode\n"));
11360 fprintf (stream, _(" att Display instruction in AT&T syntax\n"));
11361 fprintf (stream, _(" intel Display instruction in Intel syntax\n"));
11362 fprintf (stream, _(" att-mnemonic\n"
11363 " Display instruction in AT&T mnemonic\n"));
11364 fprintf (stream, _(" intel-mnemonic\n"
11365 " Display instruction in Intel mnemonic\n"));
11366 fprintf (stream, _(" addr64 Assume 64bit address size\n"));
11367 fprintf (stream, _(" addr32 Assume 32bit address size\n"));
11368 fprintf (stream, _(" addr16 Assume 16bit address size\n"));
11369 fprintf (stream, _(" data32 Assume 32bit data size\n"));
11370 fprintf (stream, _(" data16 Assume 16bit data size\n"));
11371 fprintf (stream, _(" suffix Always display instruction suffix in AT&T syntax\n"));
11372 fprintf (stream, _(" amd64 Display instruction in AMD64 ISA\n"));
11373 fprintf (stream, _(" intel64 Display instruction in Intel64 ISA\n"));
11374 }
11375
11376 /* Bad opcode. */
11377 static const struct dis386 bad_opcode = { "(bad)", { XX }, 0 };
11378
11379 /* Get a pointer to struct dis386 with a valid name. */
11380
11381 static const struct dis386 *
11382 get_valid_dis386 (const struct dis386 *dp, disassemble_info *info)
11383 {
11384 int vindex, vex_table_index;
11385
11386 if (dp->name != NULL)
11387 return dp;
11388
11389 switch (dp->op[0].bytemode)
11390 {
11391 case USE_REG_TABLE:
11392 dp = &reg_table[dp->op[1].bytemode][modrm.reg];
11393 break;
11394
11395 case USE_MOD_TABLE:
11396 vindex = modrm.mod == 0x3 ? 1 : 0;
11397 dp = &mod_table[dp->op[1].bytemode][vindex];
11398 break;
11399
11400 case USE_RM_TABLE:
11401 dp = &rm_table[dp->op[1].bytemode][modrm.rm];
11402 break;
11403
11404 case USE_PREFIX_TABLE:
11405 if (need_vex)
11406 {
11407 /* The prefix in VEX is implicit. */
11408 switch (vex.prefix)
11409 {
11410 case 0:
11411 vindex = 0;
11412 break;
11413 case REPE_PREFIX_OPCODE:
11414 vindex = 1;
11415 break;
11416 case DATA_PREFIX_OPCODE:
11417 vindex = 2;
11418 break;
11419 case REPNE_PREFIX_OPCODE:
11420 vindex = 3;
11421 break;
11422 default:
11423 abort ();
11424 break;
11425 }
11426 }
11427 else
11428 {
11429 int last_prefix = -1;
11430 int prefix = 0;
11431 vindex = 0;
11432 /* We check PREFIX_REPNZ and PREFIX_REPZ before PREFIX_DATA.
11433 When there are multiple PREFIX_REPNZ and PREFIX_REPZ, the
11434 last one wins. */
11435 if ((prefixes & (PREFIX_REPZ | PREFIX_REPNZ)) != 0)
11436 {
11437 if (last_repz_prefix > last_repnz_prefix)
11438 {
11439 vindex = 1;
11440 prefix = PREFIX_REPZ;
11441 last_prefix = last_repz_prefix;
11442 }
11443 else
11444 {
11445 vindex = 3;
11446 prefix = PREFIX_REPNZ;
11447 last_prefix = last_repnz_prefix;
11448 }
11449
11450 /* Check if prefix should be ignored. */
11451 if ((((prefix_table[dp->op[1].bytemode][vindex].prefix_requirement
11452 & PREFIX_IGNORED) >> PREFIX_IGNORED_SHIFT)
11453 & prefix) != 0)
11454 vindex = 0;
11455 }
11456
11457 if (vindex == 0 && (prefixes & PREFIX_DATA) != 0)
11458 {
11459 vindex = 2;
11460 prefix = PREFIX_DATA;
11461 last_prefix = last_data_prefix;
11462 }
11463
11464 if (vindex != 0)
11465 {
11466 used_prefixes |= prefix;
11467 all_prefixes[last_prefix] = 0;
11468 }
11469 }
11470 dp = &prefix_table[dp->op[1].bytemode][vindex];
11471 break;
11472
11473 case USE_X86_64_TABLE:
11474 vindex = address_mode == mode_64bit ? 1 : 0;
11475 dp = &x86_64_table[dp->op[1].bytemode][vindex];
11476 break;
11477
11478 case USE_3BYTE_TABLE:
11479 FETCH_DATA (info, codep + 2);
11480 vindex = *codep++;
11481 dp = &three_byte_table[dp->op[1].bytemode][vindex];
11482 end_codep = codep;
11483 modrm.mod = (*codep >> 6) & 3;
11484 modrm.reg = (*codep >> 3) & 7;
11485 modrm.rm = *codep & 7;
11486 break;
11487
11488 case USE_VEX_LEN_TABLE:
11489 if (!need_vex)
11490 abort ();
11491
11492 switch (vex.length)
11493 {
11494 case 128:
11495 vindex = 0;
11496 break;
11497 case 256:
11498 vindex = 1;
11499 break;
11500 default:
11501 abort ();
11502 break;
11503 }
11504
11505 dp = &vex_len_table[dp->op[1].bytemode][vindex];
11506 break;
11507
11508 case USE_EVEX_LEN_TABLE:
11509 if (!vex.evex)
11510 abort ();
11511
11512 switch (vex.length)
11513 {
11514 case 128:
11515 vindex = 0;
11516 break;
11517 case 256:
11518 vindex = 1;
11519 break;
11520 case 512:
11521 vindex = 2;
11522 break;
11523 default:
11524 abort ();
11525 break;
11526 }
11527
11528 dp = &evex_len_table[dp->op[1].bytemode][vindex];
11529 break;
11530
11531 case USE_XOP_8F_TABLE:
11532 FETCH_DATA (info, codep + 3);
11533 /* All bits in the REX prefix are ignored. */
11534 rex_ignored = rex;
11535 rex = ~(*codep >> 5) & 0x7;
11536
11537 /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm". */
11538 switch ((*codep & 0x1f))
11539 {
11540 default:
11541 dp = &bad_opcode;
11542 return dp;
11543 case 0x8:
11544 vex_table_index = XOP_08;
11545 break;
11546 case 0x9:
11547 vex_table_index = XOP_09;
11548 break;
11549 case 0xa:
11550 vex_table_index = XOP_0A;
11551 break;
11552 }
11553 codep++;
11554 vex.w = *codep & 0x80;
11555 if (vex.w && address_mode == mode_64bit)
11556 rex |= REX_W;
11557
11558 vex.register_specifier = (~(*codep >> 3)) & 0xf;
11559 if (address_mode != mode_64bit)
11560 {
11561 /* In 16/32-bit mode REX_B is silently ignored. */
11562 rex &= ~REX_B;
11563 }
11564
11565 vex.length = (*codep & 0x4) ? 256 : 128;
11566 switch ((*codep & 0x3))
11567 {
11568 case 0:
11569 break;
11570 case 1:
11571 vex.prefix = DATA_PREFIX_OPCODE;
11572 break;
11573 case 2:
11574 vex.prefix = REPE_PREFIX_OPCODE;
11575 break;
11576 case 3:
11577 vex.prefix = REPNE_PREFIX_OPCODE;
11578 break;
11579 }
11580 need_vex = 1;
11581 need_vex_reg = 1;
11582 codep++;
11583 vindex = *codep++;
11584 dp = &xop_table[vex_table_index][vindex];
11585
11586 end_codep = codep;
11587 FETCH_DATA (info, codep + 1);
11588 modrm.mod = (*codep >> 6) & 3;
11589 modrm.reg = (*codep >> 3) & 7;
11590 modrm.rm = *codep & 7;
11591 break;
11592
11593 case USE_VEX_C4_TABLE:
11594 /* VEX prefix. */
11595 FETCH_DATA (info, codep + 3);
11596 /* All bits in the REX prefix are ignored. */
11597 rex_ignored = rex;
11598 rex = ~(*codep >> 5) & 0x7;
11599 switch ((*codep & 0x1f))
11600 {
11601 default:
11602 dp = &bad_opcode;
11603 return dp;
11604 case 0x1:
11605 vex_table_index = VEX_0F;
11606 break;
11607 case 0x2:
11608 vex_table_index = VEX_0F38;
11609 break;
11610 case 0x3:
11611 vex_table_index = VEX_0F3A;
11612 break;
11613 }
11614 codep++;
11615 vex.w = *codep & 0x80;
11616 if (address_mode == mode_64bit)
11617 {
11618 if (vex.w)
11619 rex |= REX_W;
11620 }
11621 else
11622 {
11623 /* For the 3-byte VEX prefix in 32-bit mode, the REX_B bit
11624 is ignored, other REX bits are 0 and the highest bit in
11625 VEX.vvvv is also ignored (but we mustn't clear it here). */
11626 rex = 0;
11627 }
11628 vex.register_specifier = (~(*codep >> 3)) & 0xf;
11629 vex.length = (*codep & 0x4) ? 256 : 128;
11630 switch ((*codep & 0x3))
11631 {
11632 case 0:
11633 break;
11634 case 1:
11635 vex.prefix = DATA_PREFIX_OPCODE;
11636 break;
11637 case 2:
11638 vex.prefix = REPE_PREFIX_OPCODE;
11639 break;
11640 case 3:
11641 vex.prefix = REPNE_PREFIX_OPCODE;
11642 break;
11643 }
11644 need_vex = 1;
11645 need_vex_reg = 1;
11646 codep++;
11647 vindex = *codep++;
11648 dp = &vex_table[vex_table_index][vindex];
11649 end_codep = codep;
11650 /* There is no MODRM byte for VEX0F 77. */
11651 if (vex_table_index != VEX_0F || vindex != 0x77)
11652 {
11653 FETCH_DATA (info, codep + 1);
11654 modrm.mod = (*codep >> 6) & 3;
11655 modrm.reg = (*codep >> 3) & 7;
11656 modrm.rm = *codep & 7;
11657 }
11658 break;
11659
11660 case USE_VEX_C5_TABLE:
11661 /* VEX prefix. */
11662 FETCH_DATA (info, codep + 2);
11663 /* All bits in the REX prefix are ignored. */
11664 rex_ignored = rex;
11665 rex = (*codep & 0x80) ? 0 : REX_R;
11666
11667 /* For the 2-byte VEX prefix in 32-bit mode, the highest bit in
11668 VEX.vvvv is 1. */
11669 vex.register_specifier = (~(*codep >> 3)) & 0xf;
11670 vex.length = (*codep & 0x4) ? 256 : 128;
11671 switch ((*codep & 0x3))
11672 {
11673 case 0:
11674 break;
11675 case 1:
11676 vex.prefix = DATA_PREFIX_OPCODE;
11677 break;
11678 case 2:
11679 vex.prefix = REPE_PREFIX_OPCODE;
11680 break;
11681 case 3:
11682 vex.prefix = REPNE_PREFIX_OPCODE;
11683 break;
11684 }
11685 need_vex = 1;
11686 need_vex_reg = 1;
11687 codep++;
11688 vindex = *codep++;
11689 dp = &vex_table[dp->op[1].bytemode][vindex];
11690 end_codep = codep;
11691 /* There is no MODRM byte for VEX 77. */
11692 if (vindex != 0x77)
11693 {
11694 FETCH_DATA (info, codep + 1);
11695 modrm.mod = (*codep >> 6) & 3;
11696 modrm.reg = (*codep >> 3) & 7;
11697 modrm.rm = *codep & 7;
11698 }
11699 break;
11700
11701 case USE_VEX_W_TABLE:
11702 if (!need_vex)
11703 abort ();
11704
11705 dp = &vex_w_table[dp->op[1].bytemode][vex.w ? 1 : 0];
11706 break;
11707
11708 case USE_EVEX_TABLE:
11709 two_source_ops = 0;
11710 /* EVEX prefix. */
11711 vex.evex = 1;
11712 FETCH_DATA (info, codep + 4);
11713 /* All bits in the REX prefix are ignored. */
11714 rex_ignored = rex;
11715 /* The first byte after 0x62. */
11716 rex = ~(*codep >> 5) & 0x7;
11717 vex.r = *codep & 0x10;
11718 switch ((*codep & 0xf))
11719 {
11720 default:
11721 return &bad_opcode;
11722 case 0x1:
11723 vex_table_index = EVEX_0F;
11724 break;
11725 case 0x2:
11726 vex_table_index = EVEX_0F38;
11727 break;
11728 case 0x3:
11729 vex_table_index = EVEX_0F3A;
11730 break;
11731 }
11732
11733 /* The second byte after 0x62. */
11734 codep++;
11735 vex.w = *codep & 0x80;
11736 if (vex.w && address_mode == mode_64bit)
11737 rex |= REX_W;
11738
11739 vex.register_specifier = (~(*codep >> 3)) & 0xf;
11740
11741 /* The U bit. */
11742 if (!(*codep & 0x4))
11743 return &bad_opcode;
11744
11745 switch ((*codep & 0x3))
11746 {
11747 case 0:
11748 break;
11749 case 1:
11750 vex.prefix = DATA_PREFIX_OPCODE;
11751 break;
11752 case 2:
11753 vex.prefix = REPE_PREFIX_OPCODE;
11754 break;
11755 case 3:
11756 vex.prefix = REPNE_PREFIX_OPCODE;
11757 break;
11758 }
11759
11760 /* The third byte after 0x62. */
11761 codep++;
11762
11763 /* Remember the static rounding bits. */
11764 vex.ll = (*codep >> 5) & 3;
11765 vex.b = (*codep & 0x10) != 0;
11766
11767 vex.v = *codep & 0x8;
11768 vex.mask_register_specifier = *codep & 0x7;
11769 vex.zeroing = *codep & 0x80;
11770
11771 if (address_mode != mode_64bit)
11772 {
11773 /* In 16/32-bit mode silently ignore following bits. */
11774 rex &= ~REX_B;
11775 vex.r = 1;
11776 vex.v = 1;
11777 }
11778
11779 need_vex = 1;
11780 need_vex_reg = 1;
11781 codep++;
11782 vindex = *codep++;
11783 dp = &evex_table[vex_table_index][vindex];
11784 end_codep = codep;
11785 FETCH_DATA (info, codep + 1);
11786 modrm.mod = (*codep >> 6) & 3;
11787 modrm.reg = (*codep >> 3) & 7;
11788 modrm.rm = *codep & 7;
11789
11790 /* Set vector length. */
11791 if (modrm.mod == 3 && vex.b)
11792 vex.length = 512;
11793 else
11794 {
11795 switch (vex.ll)
11796 {
11797 case 0x0:
11798 vex.length = 128;
11799 break;
11800 case 0x1:
11801 vex.length = 256;
11802 break;
11803 case 0x2:
11804 vex.length = 512;
11805 break;
11806 default:
11807 return &bad_opcode;
11808 }
11809 }
11810 break;
11811
11812 case 0:
11813 dp = &bad_opcode;
11814 break;
11815
11816 default:
11817 abort ();
11818 }
11819
11820 if (dp->name != NULL)
11821 return dp;
11822 else
11823 return get_valid_dis386 (dp, info);
11824 }
11825
11826 static void
11827 get_sib (disassemble_info *info, int sizeflag)
11828 {
11829 /* If modrm.mod == 3, operand must be register. */
11830 if (need_modrm
11831 && ((sizeflag & AFLAG) || address_mode == mode_64bit)
11832 && modrm.mod != 3
11833 && modrm.rm == 4)
11834 {
11835 FETCH_DATA (info, codep + 2);
11836 sib.index = (codep [1] >> 3) & 7;
11837 sib.scale = (codep [1] >> 6) & 3;
11838 sib.base = codep [1] & 7;
11839 }
11840 }
11841
11842 static int
11843 print_insn (bfd_vma pc, disassemble_info *info)
11844 {
11845 const struct dis386 *dp;
11846 int i;
11847 char *op_txt[MAX_OPERANDS];
11848 int needcomma;
11849 int sizeflag, orig_sizeflag;
11850 const char *p;
11851 struct dis_private priv;
11852 int prefix_length;
11853
11854 priv.orig_sizeflag = AFLAG | DFLAG;
11855 if ((info->mach & bfd_mach_i386_i386) != 0)
11856 address_mode = mode_32bit;
11857 else if (info->mach == bfd_mach_i386_i8086)
11858 {
11859 address_mode = mode_16bit;
11860 priv.orig_sizeflag = 0;
11861 }
11862 else
11863 address_mode = mode_64bit;
11864
11865 if (intel_syntax == (char) -1)
11866 intel_syntax = (info->mach & bfd_mach_i386_intel_syntax) != 0;
11867
11868 for (p = info->disassembler_options; p != NULL; )
11869 {
11870 if (CONST_STRNEQ (p, "amd64"))
11871 isa64 = amd64;
11872 else if (CONST_STRNEQ (p, "intel64"))
11873 isa64 = intel64;
11874 else if (CONST_STRNEQ (p, "x86-64"))
11875 {
11876 address_mode = mode_64bit;
11877 priv.orig_sizeflag = AFLAG | DFLAG;
11878 }
11879 else if (CONST_STRNEQ (p, "i386"))
11880 {
11881 address_mode = mode_32bit;
11882 priv.orig_sizeflag = AFLAG | DFLAG;
11883 }
11884 else if (CONST_STRNEQ (p, "i8086"))
11885 {
11886 address_mode = mode_16bit;
11887 priv.orig_sizeflag = 0;
11888 }
11889 else if (CONST_STRNEQ (p, "intel"))
11890 {
11891 intel_syntax = 1;
11892 if (CONST_STRNEQ (p + 5, "-mnemonic"))
11893 intel_mnemonic = 1;
11894 }
11895 else if (CONST_STRNEQ (p, "att"))
11896 {
11897 intel_syntax = 0;
11898 if (CONST_STRNEQ (p + 3, "-mnemonic"))
11899 intel_mnemonic = 0;
11900 }
11901 else if (CONST_STRNEQ (p, "addr"))
11902 {
11903 if (address_mode == mode_64bit)
11904 {
11905 if (p[4] == '3' && p[5] == '2')
11906 priv.orig_sizeflag &= ~AFLAG;
11907 else if (p[4] == '6' && p[5] == '4')
11908 priv.orig_sizeflag |= AFLAG;
11909 }
11910 else
11911 {
11912 if (p[4] == '1' && p[5] == '6')
11913 priv.orig_sizeflag &= ~AFLAG;
11914 else if (p[4] == '3' && p[5] == '2')
11915 priv.orig_sizeflag |= AFLAG;
11916 }
11917 }
11918 else if (CONST_STRNEQ (p, "data"))
11919 {
11920 if (p[4] == '1' && p[5] == '6')
11921 priv.orig_sizeflag &= ~DFLAG;
11922 else if (p[4] == '3' && p[5] == '2')
11923 priv.orig_sizeflag |= DFLAG;
11924 }
11925 else if (CONST_STRNEQ (p, "suffix"))
11926 priv.orig_sizeflag |= SUFFIX_ALWAYS;
11927
11928 p = strchr (p, ',');
11929 if (p != NULL)
11930 p++;
11931 }
11932
11933 if (address_mode == mode_64bit && sizeof (bfd_vma) < 8)
11934 {
11935 (*info->fprintf_func) (info->stream,
11936 _("64-bit address is disabled"));
11937 return -1;
11938 }
11939
11940 if (intel_syntax)
11941 {
11942 names64 = intel_names64;
11943 names32 = intel_names32;
11944 names16 = intel_names16;
11945 names8 = intel_names8;
11946 names8rex = intel_names8rex;
11947 names_seg = intel_names_seg;
11948 names_mm = intel_names_mm;
11949 names_bnd = intel_names_bnd;
11950 names_xmm = intel_names_xmm;
11951 names_ymm = intel_names_ymm;
11952 names_zmm = intel_names_zmm;
11953 index64 = intel_index64;
11954 index32 = intel_index32;
11955 names_mask = intel_names_mask;
11956 index16 = intel_index16;
11957 open_char = '[';
11958 close_char = ']';
11959 separator_char = '+';
11960 scale_char = '*';
11961 }
11962 else
11963 {
11964 names64 = att_names64;
11965 names32 = att_names32;
11966 names16 = att_names16;
11967 names8 = att_names8;
11968 names8rex = att_names8rex;
11969 names_seg = att_names_seg;
11970 names_mm = att_names_mm;
11971 names_bnd = att_names_bnd;
11972 names_xmm = att_names_xmm;
11973 names_ymm = att_names_ymm;
11974 names_zmm = att_names_zmm;
11975 index64 = att_index64;
11976 index32 = att_index32;
11977 names_mask = att_names_mask;
11978 index16 = att_index16;
11979 open_char = '(';
11980 close_char = ')';
11981 separator_char = ',';
11982 scale_char = ',';
11983 }
11984
11985 /* The output looks better if we put 7 bytes on a line, since that
11986 puts most long word instructions on a single line. Use 8 bytes
11987 for Intel L1OM. */
11988 if ((info->mach & bfd_mach_l1om) != 0)
11989 info->bytes_per_line = 8;
11990 else
11991 info->bytes_per_line = 7;
11992
11993 info->private_data = &priv;
11994 priv.max_fetched = priv.the_buffer;
11995 priv.insn_start = pc;
11996
11997 obuf[0] = 0;
11998 for (i = 0; i < MAX_OPERANDS; ++i)
11999 {
12000 op_out[i][0] = 0;
12001 op_index[i] = -1;
12002 }
12003
12004 the_info = info;
12005 start_pc = pc;
12006 start_codep = priv.the_buffer;
12007 codep = priv.the_buffer;
12008
12009 if (OPCODES_SIGSETJMP (priv.bailout) != 0)
12010 {
12011 const char *name;
12012
12013 /* Getting here means we tried for data but didn't get it. That
12014 means we have an incomplete instruction of some sort. Just
12015 print the first byte as a prefix or a .byte pseudo-op. */
12016 if (codep > priv.the_buffer)
12017 {
12018 name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
12019 if (name != NULL)
12020 (*info->fprintf_func) (info->stream, "%s", name);
12021 else
12022 {
12023 /* Just print the first byte as a .byte instruction. */
12024 (*info->fprintf_func) (info->stream, ".byte 0x%x",
12025 (unsigned int) priv.the_buffer[0]);
12026 }
12027
12028 return 1;
12029 }
12030
12031 return -1;
12032 }
12033
12034 obufp = obuf;
12035 sizeflag = priv.orig_sizeflag;
12036
12037 if (!ckprefix () || rex_used)
12038 {
12039 /* Too many prefixes or unused REX prefixes. */
12040 for (i = 0;
12041 i < (int) ARRAY_SIZE (all_prefixes) && all_prefixes[i];
12042 i++)
12043 (*info->fprintf_func) (info->stream, "%s%s",
12044 i == 0 ? "" : " ",
12045 prefix_name (all_prefixes[i], sizeflag));
12046 return i;
12047 }
12048
12049 insn_codep = codep;
12050
12051 FETCH_DATA (info, codep + 1);
12052 two_source_ops = (*codep == 0x62) || (*codep == 0xc8);
12053
12054 if (((prefixes & PREFIX_FWAIT)
12055 && ((*codep < 0xd8) || (*codep > 0xdf))))
12056 {
12057 /* Handle prefixes before fwait. */
12058 for (i = 0; i < fwait_prefix && all_prefixes[i];
12059 i++)
12060 (*info->fprintf_func) (info->stream, "%s ",
12061 prefix_name (all_prefixes[i], sizeflag));
12062 (*info->fprintf_func) (info->stream, "fwait");
12063 return i + 1;
12064 }
12065
12066 if (*codep == 0x0f)
12067 {
12068 unsigned char threebyte;
12069
12070 codep++;
12071 FETCH_DATA (info, codep + 1);
12072 threebyte = *codep;
12073 dp = &dis386_twobyte[threebyte];
12074 need_modrm = twobyte_has_modrm[*codep];
12075 codep++;
12076 }
12077 else
12078 {
12079 dp = &dis386[*codep];
12080 need_modrm = onebyte_has_modrm[*codep];
12081 codep++;
12082 }
12083
12084 /* Save sizeflag for printing the extra prefixes later before updating
12085 it for mnemonic and operand processing. The prefix names depend
12086 only on the address mode. */
12087 orig_sizeflag = sizeflag;
12088 if (prefixes & PREFIX_ADDR)
12089 sizeflag ^= AFLAG;
12090 if ((prefixes & PREFIX_DATA))
12091 sizeflag ^= DFLAG;
12092
12093 end_codep = codep;
12094 if (need_modrm)
12095 {
12096 FETCH_DATA (info, codep + 1);
12097 modrm.mod = (*codep >> 6) & 3;
12098 modrm.reg = (*codep >> 3) & 7;
12099 modrm.rm = *codep & 7;
12100 }
12101
12102 need_vex = 0;
12103 need_vex_reg = 0;
12104 vex_w_done = 0;
12105 memset (&vex, 0, sizeof (vex));
12106
12107 if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
12108 {
12109 get_sib (info, sizeflag);
12110 dofloat (sizeflag);
12111 }
12112 else
12113 {
12114 dp = get_valid_dis386 (dp, info);
12115 if (dp != NULL && putop (dp->name, sizeflag) == 0)
12116 {
12117 get_sib (info, sizeflag);
12118 for (i = 0; i < MAX_OPERANDS; ++i)
12119 {
12120 obufp = op_out[i];
12121 op_ad = MAX_OPERANDS - 1 - i;
12122 if (dp->op[i].rtn)
12123 (*dp->op[i].rtn) (dp->op[i].bytemode, sizeflag);
12124 /* For EVEX instruction after the last operand masking
12125 should be printed. */
12126 if (i == 0 && vex.evex)
12127 {
12128 /* Don't print {%k0}. */
12129 if (vex.mask_register_specifier)
12130 {
12131 oappend ("{");
12132 oappend (names_mask[vex.mask_register_specifier]);
12133 oappend ("}");
12134 }
12135 if (vex.zeroing)
12136 oappend ("{z}");
12137 }
12138 }
12139 }
12140 }
12141
12142 /* Check if the REX prefix is used. */
12143 if (rex_ignored == 0 && (rex ^ rex_used) == 0 && last_rex_prefix >= 0)
12144 all_prefixes[last_rex_prefix] = 0;
12145
12146 /* Check if the SEG prefix is used. */
12147 if ((prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS | PREFIX_ES
12148 | PREFIX_FS | PREFIX_GS)) != 0
12149 && (used_prefixes & active_seg_prefix) != 0)
12150 all_prefixes[last_seg_prefix] = 0;
12151
12152 /* Check if the ADDR prefix is used. */
12153 if ((prefixes & PREFIX_ADDR) != 0
12154 && (used_prefixes & PREFIX_ADDR) != 0)
12155 all_prefixes[last_addr_prefix] = 0;
12156
12157 /* Check if the DATA prefix is used. */
12158 if ((prefixes & PREFIX_DATA) != 0
12159 && (used_prefixes & PREFIX_DATA) != 0)
12160 all_prefixes[last_data_prefix] = 0;
12161
12162 /* Print the extra prefixes. */
12163 prefix_length = 0;
12164 for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
12165 if (all_prefixes[i])
12166 {
12167 const char *name;
12168 name = prefix_name (all_prefixes[i], orig_sizeflag);
12169 if (name == NULL)
12170 abort ();
12171 prefix_length += strlen (name) + 1;
12172 (*info->fprintf_func) (info->stream, "%s ", name);
12173 }
12174
12175 /* If the mandatory PREFIX_REPZ/PREFIX_REPNZ/PREFIX_DATA prefix is
12176 unused, opcode is invalid. Since the PREFIX_DATA prefix may be
12177 used by putop and MMX/SSE operand and may be overriden by the
12178 PREFIX_REPZ/PREFIX_REPNZ fix, we check the PREFIX_DATA prefix
12179 separately. */
12180 if (dp->prefix_requirement == PREFIX_OPCODE
12181 && dp != &bad_opcode
12182 && (((prefixes
12183 & (PREFIX_REPZ | PREFIX_REPNZ)) != 0
12184 && (used_prefixes
12185 & (PREFIX_REPZ | PREFIX_REPNZ)) == 0)
12186 || ((((prefixes
12187 & (PREFIX_REPZ | PREFIX_REPNZ | PREFIX_DATA))
12188 == PREFIX_DATA)
12189 && (used_prefixes & PREFIX_DATA) == 0))))
12190 {
12191 (*info->fprintf_func) (info->stream, "(bad)");
12192 return end_codep - priv.the_buffer;
12193 }
12194
12195 /* Check maximum code length. */
12196 if ((codep - start_codep) > MAX_CODE_LENGTH)
12197 {
12198 (*info->fprintf_func) (info->stream, "(bad)");
12199 return MAX_CODE_LENGTH;
12200 }
12201
12202 obufp = mnemonicendp;
12203 for (i = strlen (obuf) + prefix_length; i < 6; i++)
12204 oappend (" ");
12205 oappend (" ");
12206 (*info->fprintf_func) (info->stream, "%s", obuf);
12207
12208 /* The enter and bound instructions are printed with operands in the same
12209 order as the intel book; everything else is printed in reverse order. */
12210 if (intel_syntax || two_source_ops)
12211 {
12212 bfd_vma riprel;
12213
12214 for (i = 0; i < MAX_OPERANDS; ++i)
12215 op_txt[i] = op_out[i];
12216
12217 if (intel_syntax && dp && dp->op[2].rtn == OP_Rounding
12218 && dp->op[3].rtn == OP_E && dp->op[4].rtn == NULL)
12219 {
12220 op_txt[2] = op_out[3];
12221 op_txt[3] = op_out[2];
12222 }
12223
12224 for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
12225 {
12226 op_ad = op_index[i];
12227 op_index[i] = op_index[MAX_OPERANDS - 1 - i];
12228 op_index[MAX_OPERANDS - 1 - i] = op_ad;
12229 riprel = op_riprel[i];
12230 op_riprel[i] = op_riprel [MAX_OPERANDS - 1 - i];
12231 op_riprel[MAX_OPERANDS - 1 - i] = riprel;
12232 }
12233 }
12234 else
12235 {
12236 for (i = 0; i < MAX_OPERANDS; ++i)
12237 op_txt[MAX_OPERANDS - 1 - i] = op_out[i];
12238 }
12239
12240 needcomma = 0;
12241 for (i = 0; i < MAX_OPERANDS; ++i)
12242 if (*op_txt[i])
12243 {
12244 if (needcomma)
12245 (*info->fprintf_func) (info->stream, ",");
12246 if (op_index[i] != -1 && !op_riprel[i])
12247 (*info->print_address_func) ((bfd_vma) op_address[op_index[i]], info);
12248 else
12249 (*info->fprintf_func) (info->stream, "%s", op_txt[i]);
12250 needcomma = 1;
12251 }
12252
12253 for (i = 0; i < MAX_OPERANDS; i++)
12254 if (op_index[i] != -1 && op_riprel[i])
12255 {
12256 (*info->fprintf_func) (info->stream, " # ");
12257 (*info->print_address_func) ((bfd_vma) (start_pc + (codep - start_codep)
12258 + op_address[op_index[i]]), info);
12259 break;
12260 }
12261 return codep - priv.the_buffer;
12262 }
12263
12264 static const char *float_mem[] = {
12265 /* d8 */
12266 "fadd{s|}",
12267 "fmul{s|}",
12268 "fcom{s|}",
12269 "fcomp{s|}",
12270 "fsub{s|}",
12271 "fsubr{s|}",
12272 "fdiv{s|}",
12273 "fdivr{s|}",
12274 /* d9 */
12275 "fld{s|}",
12276 "(bad)",
12277 "fst{s|}",
12278 "fstp{s|}",
12279 "fldenvIC",
12280 "fldcw",
12281 "fNstenvIC",
12282 "fNstcw",
12283 /* da */
12284 "fiadd{l|}",
12285 "fimul{l|}",
12286 "ficom{l|}",
12287 "ficomp{l|}",
12288 "fisub{l|}",
12289 "fisubr{l|}",
12290 "fidiv{l|}",
12291 "fidivr{l|}",
12292 /* db */
12293 "fild{l|}",
12294 "fisttp{l|}",
12295 "fist{l|}",
12296 "fistp{l|}",
12297 "(bad)",
12298 "fld{t||t|}",
12299 "(bad)",
12300 "fstp{t||t|}",
12301 /* dc */
12302 "fadd{l|}",
12303 "fmul{l|}",
12304 "fcom{l|}",
12305 "fcomp{l|}",
12306 "fsub{l|}",
12307 "fsubr{l|}",
12308 "fdiv{l|}",
12309 "fdivr{l|}",
12310 /* dd */
12311 "fld{l|}",
12312 "fisttp{ll|}",
12313 "fst{l||}",
12314 "fstp{l|}",
12315 "frstorIC",
12316 "(bad)",
12317 "fNsaveIC",
12318 "fNstsw",
12319 /* de */
12320 "fiadd{s|}",
12321 "fimul{s|}",
12322 "ficom{s|}",
12323 "ficomp{s|}",
12324 "fisub{s|}",
12325 "fisubr{s|}",
12326 "fidiv{s|}",
12327 "fidivr{s|}",
12328 /* df */
12329 "fild{s|}",
12330 "fisttp{s|}",
12331 "fist{s|}",
12332 "fistp{s|}",
12333 "fbld",
12334 "fild{ll|}",
12335 "fbstp",
12336 "fistp{ll|}",
12337 };
12338
12339 static const unsigned char float_mem_mode[] = {
12340 /* d8 */
12341 d_mode,
12342 d_mode,
12343 d_mode,
12344 d_mode,
12345 d_mode,
12346 d_mode,
12347 d_mode,
12348 d_mode,
12349 /* d9 */
12350 d_mode,
12351 0,
12352 d_mode,
12353 d_mode,
12354 0,
12355 w_mode,
12356 0,
12357 w_mode,
12358 /* da */
12359 d_mode,
12360 d_mode,
12361 d_mode,
12362 d_mode,
12363 d_mode,
12364 d_mode,
12365 d_mode,
12366 d_mode,
12367 /* db */
12368 d_mode,
12369 d_mode,
12370 d_mode,
12371 d_mode,
12372 0,
12373 t_mode,
12374 0,
12375 t_mode,
12376 /* dc */
12377 q_mode,
12378 q_mode,
12379 q_mode,
12380 q_mode,
12381 q_mode,
12382 q_mode,
12383 q_mode,
12384 q_mode,
12385 /* dd */
12386 q_mode,
12387 q_mode,
12388 q_mode,
12389 q_mode,
12390 0,
12391 0,
12392 0,
12393 w_mode,
12394 /* de */
12395 w_mode,
12396 w_mode,
12397 w_mode,
12398 w_mode,
12399 w_mode,
12400 w_mode,
12401 w_mode,
12402 w_mode,
12403 /* df */
12404 w_mode,
12405 w_mode,
12406 w_mode,
12407 w_mode,
12408 t_mode,
12409 q_mode,
12410 t_mode,
12411 q_mode
12412 };
12413
12414 #define ST { OP_ST, 0 }
12415 #define STi { OP_STi, 0 }
12416
12417 #define FGRPd9_2 NULL, { { NULL, 1 } }, 0
12418 #define FGRPd9_4 NULL, { { NULL, 2 } }, 0
12419 #define FGRPd9_5 NULL, { { NULL, 3 } }, 0
12420 #define FGRPd9_6 NULL, { { NULL, 4 } }, 0
12421 #define FGRPd9_7 NULL, { { NULL, 5 } }, 0
12422 #define FGRPda_5 NULL, { { NULL, 6 } }, 0
12423 #define FGRPdb_4 NULL, { { NULL, 7 } }, 0
12424 #define FGRPde_3 NULL, { { NULL, 8 } }, 0
12425 #define FGRPdf_4 NULL, { { NULL, 9 } }, 0
12426
12427 static const struct dis386 float_reg[][8] = {
12428 /* d8 */
12429 {
12430 { "fadd", { ST, STi }, 0 },
12431 { "fmul", { ST, STi }, 0 },
12432 { "fcom", { STi }, 0 },
12433 { "fcomp", { STi }, 0 },
12434 { "fsub", { ST, STi }, 0 },
12435 { "fsubr", { ST, STi }, 0 },
12436 { "fdiv", { ST, STi }, 0 },
12437 { "fdivr", { ST, STi }, 0 },
12438 },
12439 /* d9 */
12440 {
12441 { "fld", { STi }, 0 },
12442 { "fxch", { STi }, 0 },
12443 { FGRPd9_2 },
12444 { Bad_Opcode },
12445 { FGRPd9_4 },
12446 { FGRPd9_5 },
12447 { FGRPd9_6 },
12448 { FGRPd9_7 },
12449 },
12450 /* da */
12451 {
12452 { "fcmovb", { ST, STi }, 0 },
12453 { "fcmove", { ST, STi }, 0 },
12454 { "fcmovbe",{ ST, STi }, 0 },
12455 { "fcmovu", { ST, STi }, 0 },
12456 { Bad_Opcode },
12457 { FGRPda_5 },
12458 { Bad_Opcode },
12459 { Bad_Opcode },
12460 },
12461 /* db */
12462 {
12463 { "fcmovnb",{ ST, STi }, 0 },
12464 { "fcmovne",{ ST, STi }, 0 },
12465 { "fcmovnbe",{ ST, STi }, 0 },
12466 { "fcmovnu",{ ST, STi }, 0 },
12467 { FGRPdb_4 },
12468 { "fucomi", { ST, STi }, 0 },
12469 { "fcomi", { ST, STi }, 0 },
12470 { Bad_Opcode },
12471 },
12472 /* dc */
12473 {
12474 { "fadd", { STi, ST }, 0 },
12475 { "fmul", { STi, ST }, 0 },
12476 { Bad_Opcode },
12477 { Bad_Opcode },
12478 { "fsub{!M|r}", { STi, ST }, 0 },
12479 { "fsub{M|}", { STi, ST }, 0 },
12480 { "fdiv{!M|r}", { STi, ST }, 0 },
12481 { "fdiv{M|}", { STi, ST }, 0 },
12482 },
12483 /* dd */
12484 {
12485 { "ffree", { STi }, 0 },
12486 { Bad_Opcode },
12487 { "fst", { STi }, 0 },
12488 { "fstp", { STi }, 0 },
12489 { "fucom", { STi }, 0 },
12490 { "fucomp", { STi }, 0 },
12491 { Bad_Opcode },
12492 { Bad_Opcode },
12493 },
12494 /* de */
12495 {
12496 { "faddp", { STi, ST }, 0 },
12497 { "fmulp", { STi, ST }, 0 },
12498 { Bad_Opcode },
12499 { FGRPde_3 },
12500 { "fsub{!M|r}p", { STi, ST }, 0 },
12501 { "fsub{M|}p", { STi, ST }, 0 },
12502 { "fdiv{!M|r}p", { STi, ST }, 0 },
12503 { "fdiv{M|}p", { STi, ST }, 0 },
12504 },
12505 /* df */
12506 {
12507 { "ffreep", { STi }, 0 },
12508 { Bad_Opcode },
12509 { Bad_Opcode },
12510 { Bad_Opcode },
12511 { FGRPdf_4 },
12512 { "fucomip", { ST, STi }, 0 },
12513 { "fcomip", { ST, STi }, 0 },
12514 { Bad_Opcode },
12515 },
12516 };
12517
12518 static char *fgrps[][8] = {
12519 /* Bad opcode 0 */
12520 {
12521 "(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
12522 },
12523
12524 /* d9_2 1 */
12525 {
12526 "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
12527 },
12528
12529 /* d9_4 2 */
12530 {
12531 "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
12532 },
12533
12534 /* d9_5 3 */
12535 {
12536 "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
12537 },
12538
12539 /* d9_6 4 */
12540 {
12541 "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
12542 },
12543
12544 /* d9_7 5 */
12545 {
12546 "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
12547 },
12548
12549 /* da_5 6 */
12550 {
12551 "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
12552 },
12553
12554 /* db_4 7 */
12555 {
12556 "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
12557 "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
12558 },
12559
12560 /* de_3 8 */
12561 {
12562 "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
12563 },
12564
12565 /* df_4 9 */
12566 {
12567 "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
12568 },
12569 };
12570
12571 static void
12572 swap_operand (void)
12573 {
12574 mnemonicendp[0] = '.';
12575 mnemonicendp[1] = 's';
12576 mnemonicendp += 2;
12577 }
12578
12579 static void
12580 OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED,
12581 int sizeflag ATTRIBUTE_UNUSED)
12582 {
12583 /* Skip mod/rm byte. */
12584 MODRM_CHECK;
12585 codep++;
12586 }
12587
12588 static void
12589 dofloat (int sizeflag)
12590 {
12591 const struct dis386 *dp;
12592 unsigned char floatop;
12593
12594 floatop = codep[-1];
12595
12596 if (modrm.mod != 3)
12597 {
12598 int fp_indx = (floatop - 0xd8) * 8 + modrm.reg;
12599
12600 putop (float_mem[fp_indx], sizeflag);
12601 obufp = op_out[0];
12602 op_ad = 2;
12603 OP_E (float_mem_mode[fp_indx], sizeflag);
12604 return;
12605 }
12606 /* Skip mod/rm byte. */
12607 MODRM_CHECK;
12608 codep++;
12609
12610 dp = &float_reg[floatop - 0xd8][modrm.reg];
12611 if (dp->name == NULL)
12612 {
12613 putop (fgrps[dp->op[0].bytemode][modrm.rm], sizeflag);
12614
12615 /* Instruction fnstsw is only one with strange arg. */
12616 if (floatop == 0xdf && codep[-1] == 0xe0)
12617 strcpy (op_out[0], names16[0]);
12618 }
12619 else
12620 {
12621 putop (dp->name, sizeflag);
12622
12623 obufp = op_out[0];
12624 op_ad = 2;
12625 if (dp->op[0].rtn)
12626 (*dp->op[0].rtn) (dp->op[0].bytemode, sizeflag);
12627
12628 obufp = op_out[1];
12629 op_ad = 1;
12630 if (dp->op[1].rtn)
12631 (*dp->op[1].rtn) (dp->op[1].bytemode, sizeflag);
12632 }
12633 }
12634
12635 /* Like oappend (below), but S is a string starting with '%'.
12636 In Intel syntax, the '%' is elided. */
12637 static void
12638 oappend_maybe_intel (const char *s)
12639 {
12640 oappend (s + intel_syntax);
12641 }
12642
12643 static void
12644 OP_ST (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12645 {
12646 oappend_maybe_intel ("%st");
12647 }
12648
12649 static void
12650 OP_STi (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12651 {
12652 sprintf (scratchbuf, "%%st(%d)", modrm.rm);
12653 oappend_maybe_intel (scratchbuf);
12654 }
12655
12656 /* Capital letters in template are macros. */
12657 static int
12658 putop (const char *in_template, int sizeflag)
12659 {
12660 const char *p;
12661 int alt = 0;
12662 int cond = 1;
12663 unsigned int l = 0, len = 1;
12664 char last[4];
12665
12666 #define SAVE_LAST(c) \
12667 if (l < len && l < sizeof (last)) \
12668 last[l++] = c; \
12669 else \
12670 abort ();
12671
12672 for (p = in_template; *p; p++)
12673 {
12674 switch (*p)
12675 {
12676 default:
12677 *obufp++ = *p;
12678 break;
12679 case '%':
12680 len++;
12681 break;
12682 case '!':
12683 cond = 0;
12684 break;
12685 case '{':
12686 if (intel_syntax)
12687 {
12688 while (*++p != '|')
12689 if (*p == '}' || *p == '\0')
12690 abort ();
12691 }
12692 /* Fall through. */
12693 case 'I':
12694 alt = 1;
12695 continue;
12696 case '|':
12697 while (*++p != '}')
12698 {
12699 if (*p == '\0')
12700 abort ();
12701 }
12702 break;
12703 case '}':
12704 break;
12705 case 'A':
12706 if (intel_syntax)
12707 break;
12708 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
12709 *obufp++ = 'b';
12710 break;
12711 case 'B':
12712 if (l == 0 && len == 1)
12713 {
12714 case_B:
12715 if (intel_syntax)
12716 break;
12717 if (sizeflag & SUFFIX_ALWAYS)
12718 *obufp++ = 'b';
12719 }
12720 else
12721 {
12722 if (l != 1
12723 || len != 2
12724 || last[0] != 'L')
12725 {
12726 SAVE_LAST (*p);
12727 break;
12728 }
12729
12730 if (address_mode == mode_64bit
12731 && !(prefixes & PREFIX_ADDR))
12732 {
12733 *obufp++ = 'a';
12734 *obufp++ = 'b';
12735 *obufp++ = 's';
12736 }
12737
12738 goto case_B;
12739 }
12740 break;
12741 case 'C':
12742 if (intel_syntax && !alt)
12743 break;
12744 if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
12745 {
12746 if (sizeflag & DFLAG)
12747 *obufp++ = intel_syntax ? 'd' : 'l';
12748 else
12749 *obufp++ = intel_syntax ? 'w' : 's';
12750 used_prefixes |= (prefixes & PREFIX_DATA);
12751 }
12752 break;
12753 case 'D':
12754 if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
12755 break;
12756 USED_REX (REX_W);
12757 if (modrm.mod == 3)
12758 {
12759 if (rex & REX_W)
12760 *obufp++ = 'q';
12761 else
12762 {
12763 if (sizeflag & DFLAG)
12764 *obufp++ = intel_syntax ? 'd' : 'l';
12765 else
12766 *obufp++ = 'w';
12767 used_prefixes |= (prefixes & PREFIX_DATA);
12768 }
12769 }
12770 else
12771 *obufp++ = 'w';
12772 break;
12773 case 'E': /* For jcxz/jecxz */
12774 if (address_mode == mode_64bit)
12775 {
12776 if (sizeflag & AFLAG)
12777 *obufp++ = 'r';
12778 else
12779 *obufp++ = 'e';
12780 }
12781 else
12782 if (sizeflag & AFLAG)
12783 *obufp++ = 'e';
12784 used_prefixes |= (prefixes & PREFIX_ADDR);
12785 break;
12786 case 'F':
12787 if (intel_syntax)
12788 break;
12789 if ((prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
12790 {
12791 if (sizeflag & AFLAG)
12792 *obufp++ = address_mode == mode_64bit ? 'q' : 'l';
12793 else
12794 *obufp++ = address_mode == mode_64bit ? 'l' : 'w';
12795 used_prefixes |= (prefixes & PREFIX_ADDR);
12796 }
12797 break;
12798 case 'G':
12799 if (intel_syntax || (obufp[-1] != 's' && !(sizeflag & SUFFIX_ALWAYS)))
12800 break;
12801 if ((rex & REX_W) || (sizeflag & DFLAG))
12802 *obufp++ = 'l';
12803 else
12804 *obufp++ = 'w';
12805 if (!(rex & REX_W))
12806 used_prefixes |= (prefixes & PREFIX_DATA);
12807 break;
12808 case 'H':
12809 if (intel_syntax)
12810 break;
12811 if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
12812 || (prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
12813 {
12814 used_prefixes |= prefixes & (PREFIX_CS | PREFIX_DS);
12815 *obufp++ = ',';
12816 *obufp++ = 'p';
12817 if (prefixes & PREFIX_DS)
12818 *obufp++ = 't';
12819 else
12820 *obufp++ = 'n';
12821 }
12822 break;
12823 case 'J':
12824 if (intel_syntax)
12825 break;
12826 *obufp++ = 'l';
12827 break;
12828 case 'K':
12829 USED_REX (REX_W);
12830 if (rex & REX_W)
12831 *obufp++ = 'q';
12832 else
12833 *obufp++ = 'd';
12834 break;
12835 case 'Z':
12836 if (l != 0 || len != 1)
12837 {
12838 if (l != 1 || len != 2 || last[0] != 'X')
12839 {
12840 SAVE_LAST (*p);
12841 break;
12842 }
12843 if (!need_vex || !vex.evex)
12844 abort ();
12845 if (intel_syntax
12846 || ((modrm.mod == 3 || vex.b) && !(sizeflag & SUFFIX_ALWAYS)))
12847 break;
12848 switch (vex.length)
12849 {
12850 case 128:
12851 *obufp++ = 'x';
12852 break;
12853 case 256:
12854 *obufp++ = 'y';
12855 break;
12856 case 512:
12857 *obufp++ = 'z';
12858 break;
12859 default:
12860 abort ();
12861 }
12862 break;
12863 }
12864 if (intel_syntax)
12865 break;
12866 if (address_mode == mode_64bit && (sizeflag & SUFFIX_ALWAYS))
12867 {
12868 *obufp++ = 'q';
12869 break;
12870 }
12871 /* Fall through. */
12872 goto case_L;
12873 case 'L':
12874 if (l != 0 || len != 1)
12875 {
12876 SAVE_LAST (*p);
12877 break;
12878 }
12879 case_L:
12880 if (intel_syntax)
12881 break;
12882 if (sizeflag & SUFFIX_ALWAYS)
12883 *obufp++ = 'l';
12884 break;
12885 case 'M':
12886 if (intel_mnemonic != cond)
12887 *obufp++ = 'r';
12888 break;
12889 case 'N':
12890 if ((prefixes & PREFIX_FWAIT) == 0)
12891 *obufp++ = 'n';
12892 else
12893 used_prefixes |= PREFIX_FWAIT;
12894 break;
12895 case 'O':
12896 USED_REX (REX_W);
12897 if (rex & REX_W)
12898 *obufp++ = 'o';
12899 else if (intel_syntax && (sizeflag & DFLAG))
12900 *obufp++ = 'q';
12901 else
12902 *obufp++ = 'd';
12903 if (!(rex & REX_W))
12904 used_prefixes |= (prefixes & PREFIX_DATA);
12905 break;
12906 case '&':
12907 if (!intel_syntax
12908 && address_mode == mode_64bit
12909 && isa64 == intel64)
12910 {
12911 *obufp++ = 'q';
12912 break;
12913 }
12914 /* Fall through. */
12915 case 'T':
12916 if (!intel_syntax
12917 && address_mode == mode_64bit
12918 && ((sizeflag & DFLAG) || (rex & REX_W)))
12919 {
12920 *obufp++ = 'q';
12921 break;
12922 }
12923 /* Fall through. */
12924 goto case_P;
12925 case 'P':
12926 if (l == 0 && len == 1)
12927 {
12928 case_P:
12929 if (intel_syntax)
12930 {
12931 if ((rex & REX_W) == 0
12932 && (prefixes & PREFIX_DATA))
12933 {
12934 if ((sizeflag & DFLAG) == 0)
12935 *obufp++ = 'w';
12936 used_prefixes |= (prefixes & PREFIX_DATA);
12937 }
12938 break;
12939 }
12940 if ((prefixes & PREFIX_DATA)
12941 || (rex & REX_W)
12942 || (sizeflag & SUFFIX_ALWAYS))
12943 {
12944 USED_REX (REX_W);
12945 if (rex & REX_W)
12946 *obufp++ = 'q';
12947 else
12948 {
12949 if (sizeflag & DFLAG)
12950 *obufp++ = 'l';
12951 else
12952 *obufp++ = 'w';
12953 used_prefixes |= (prefixes & PREFIX_DATA);
12954 }
12955 }
12956 }
12957 else
12958 {
12959 if (l != 1 || len != 2 || last[0] != 'L')
12960 {
12961 SAVE_LAST (*p);
12962 break;
12963 }
12964
12965 if ((prefixes & PREFIX_DATA)
12966 || (rex & REX_W)
12967 || (sizeflag & SUFFIX_ALWAYS))
12968 {
12969 USED_REX (REX_W);
12970 if (rex & REX_W)
12971 *obufp++ = 'q';
12972 else
12973 {
12974 if (sizeflag & DFLAG)
12975 *obufp++ = intel_syntax ? 'd' : 'l';
12976 else
12977 *obufp++ = 'w';
12978 used_prefixes |= (prefixes & PREFIX_DATA);
12979 }
12980 }
12981 }
12982 break;
12983 case 'U':
12984 if (intel_syntax)
12985 break;
12986 if (address_mode == mode_64bit
12987 && ((sizeflag & DFLAG) || (rex & REX_W)))
12988 {
12989 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
12990 *obufp++ = 'q';
12991 break;
12992 }
12993 /* Fall through. */
12994 goto case_Q;
12995 case 'Q':
12996 if (l == 0 && len == 1)
12997 {
12998 case_Q:
12999 if (intel_syntax && !alt)
13000 break;
13001 USED_REX (REX_W);
13002 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
13003 {
13004 if (rex & REX_W)
13005 *obufp++ = 'q';
13006 else
13007 {
13008 if (sizeflag & DFLAG)
13009 *obufp++ = intel_syntax ? 'd' : 'l';
13010 else
13011 *obufp++ = 'w';
13012 used_prefixes |= (prefixes & PREFIX_DATA);
13013 }
13014 }
13015 }
13016 else
13017 {
13018 if (l != 1 || len != 2 || last[0] != 'L')
13019 {
13020 SAVE_LAST (*p);
13021 break;
13022 }
13023 if (intel_syntax
13024 || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
13025 break;
13026 if ((rex & REX_W))
13027 {
13028 USED_REX (REX_W);
13029 *obufp++ = 'q';
13030 }
13031 else
13032 *obufp++ = 'l';
13033 }
13034 break;
13035 case 'R':
13036 USED_REX (REX_W);
13037 if (rex & REX_W)
13038 *obufp++ = 'q';
13039 else if (sizeflag & DFLAG)
13040 {
13041 if (intel_syntax)
13042 *obufp++ = 'd';
13043 else
13044 *obufp++ = 'l';
13045 }
13046 else
13047 *obufp++ = 'w';
13048 if (intel_syntax && !p[1]
13049 && ((rex & REX_W) || (sizeflag & DFLAG)))
13050 *obufp++ = 'e';
13051 if (!(rex & REX_W))
13052 used_prefixes |= (prefixes & PREFIX_DATA);
13053 break;
13054 case 'V':
13055 if (l == 0 && len == 1)
13056 {
13057 if (intel_syntax)
13058 break;
13059 if (address_mode == mode_64bit
13060 && ((sizeflag & DFLAG) || (rex & REX_W)))
13061 {
13062 if (sizeflag & SUFFIX_ALWAYS)
13063 *obufp++ = 'q';
13064 break;
13065 }
13066 }
13067 else
13068 {
13069 if (l != 1
13070 || len != 2
13071 || last[0] != 'L')
13072 {
13073 SAVE_LAST (*p);
13074 break;
13075 }
13076
13077 if (rex & REX_W)
13078 {
13079 *obufp++ = 'a';
13080 *obufp++ = 'b';
13081 *obufp++ = 's';
13082 }
13083 }
13084 /* Fall through. */
13085 goto case_S;
13086 case 'S':
13087 if (l == 0 && len == 1)
13088 {
13089 case_S:
13090 if (intel_syntax)
13091 break;
13092 if (sizeflag & SUFFIX_ALWAYS)
13093 {
13094 if (rex & REX_W)
13095 *obufp++ = 'q';
13096 else
13097 {
13098 if (sizeflag & DFLAG)
13099 *obufp++ = 'l';
13100 else
13101 *obufp++ = 'w';
13102 used_prefixes |= (prefixes & PREFIX_DATA);
13103 }
13104 }
13105 }
13106 else
13107 {
13108 if (l != 1
13109 || len != 2
13110 || last[0] != 'L')
13111 {
13112 SAVE_LAST (*p);
13113 break;
13114 }
13115
13116 if (address_mode == mode_64bit
13117 && !(prefixes & PREFIX_ADDR))
13118 {
13119 *obufp++ = 'a';
13120 *obufp++ = 'b';
13121 *obufp++ = 's';
13122 }
13123
13124 goto case_S;
13125 }
13126 break;
13127 case 'X':
13128 if (l != 0 || len != 1)
13129 {
13130 SAVE_LAST (*p);
13131 break;
13132 }
13133 if (need_vex && vex.prefix)
13134 {
13135 if (vex.prefix == DATA_PREFIX_OPCODE)
13136 *obufp++ = 'd';
13137 else
13138 *obufp++ = 's';
13139 }
13140 else
13141 {
13142 if (prefixes & PREFIX_DATA)
13143 *obufp++ = 'd';
13144 else
13145 *obufp++ = 's';
13146 used_prefixes |= (prefixes & PREFIX_DATA);
13147 }
13148 break;
13149 case 'Y':
13150 if (l == 0 && len == 1)
13151 abort ();
13152 else
13153 {
13154 if (l != 1 || len != 2 || last[0] != 'X')
13155 {
13156 SAVE_LAST (*p);
13157 break;
13158 }
13159 if (!need_vex)
13160 abort ();
13161 if (intel_syntax
13162 || ((modrm.mod == 3 || vex.b) && !(sizeflag & SUFFIX_ALWAYS)))
13163 break;
13164 switch (vex.length)
13165 {
13166 case 128:
13167 *obufp++ = 'x';
13168 break;
13169 case 256:
13170 *obufp++ = 'y';
13171 break;
13172 case 512:
13173 if (!vex.evex)
13174 default:
13175 abort ();
13176 }
13177 }
13178 break;
13179 case 'W':
13180 if (l == 0 && len == 1)
13181 {
13182 /* operand size flag for cwtl, cbtw */
13183 USED_REX (REX_W);
13184 if (rex & REX_W)
13185 {
13186 if (intel_syntax)
13187 *obufp++ = 'd';
13188 else
13189 *obufp++ = 'l';
13190 }
13191 else if (sizeflag & DFLAG)
13192 *obufp++ = 'w';
13193 else
13194 *obufp++ = 'b';
13195 if (!(rex & REX_W))
13196 used_prefixes |= (prefixes & PREFIX_DATA);
13197 }
13198 else
13199 {
13200 if (l != 1
13201 || len != 2
13202 || (last[0] != 'X'
13203 && last[0] != 'L'))
13204 {
13205 SAVE_LAST (*p);
13206 break;
13207 }
13208 if (!need_vex)
13209 abort ();
13210 if (last[0] == 'X')
13211 *obufp++ = vex.w ? 'd': 's';
13212 else
13213 *obufp++ = vex.w ? 'q': 'd';
13214 }
13215 break;
13216 case '^':
13217 if (intel_syntax)
13218 break;
13219 if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
13220 {
13221 if (sizeflag & DFLAG)
13222 *obufp++ = 'l';
13223 else
13224 *obufp++ = 'w';
13225 used_prefixes |= (prefixes & PREFIX_DATA);
13226 }
13227 break;
13228 case '@':
13229 if (intel_syntax)
13230 break;
13231 if (address_mode == mode_64bit
13232 && (isa64 == intel64
13233 || ((sizeflag & DFLAG) || (rex & REX_W))))
13234 *obufp++ = 'q';
13235 else if ((prefixes & PREFIX_DATA))
13236 {
13237 if (!(sizeflag & DFLAG))
13238 *obufp++ = 'w';
13239 used_prefixes |= (prefixes & PREFIX_DATA);
13240 }
13241 break;
13242 }
13243 alt = 0;
13244 }
13245 *obufp = 0;
13246 mnemonicendp = obufp;
13247 return 0;
13248 }
13249
13250 static void
13251 oappend (const char *s)
13252 {
13253 obufp = stpcpy (obufp, s);
13254 }
13255
13256 static void
13257 append_seg (void)
13258 {
13259 /* Only print the active segment register. */
13260 if (!active_seg_prefix)
13261 return;
13262
13263 used_prefixes |= active_seg_prefix;
13264 switch (active_seg_prefix)
13265 {
13266 case PREFIX_CS:
13267 oappend_maybe_intel ("%cs:");
13268 break;
13269 case PREFIX_DS:
13270 oappend_maybe_intel ("%ds:");
13271 break;
13272 case PREFIX_SS:
13273 oappend_maybe_intel ("%ss:");
13274 break;
13275 case PREFIX_ES:
13276 oappend_maybe_intel ("%es:");
13277 break;
13278 case PREFIX_FS:
13279 oappend_maybe_intel ("%fs:");
13280 break;
13281 case PREFIX_GS:
13282 oappend_maybe_intel ("%gs:");
13283 break;
13284 default:
13285 break;
13286 }
13287 }
13288
13289 static void
13290 OP_indirE (int bytemode, int sizeflag)
13291 {
13292 if (!intel_syntax)
13293 oappend ("*");
13294 OP_E (bytemode, sizeflag);
13295 }
13296
13297 static void
13298 print_operand_value (char *buf, int hex, bfd_vma disp)
13299 {
13300 if (address_mode == mode_64bit)
13301 {
13302 if (hex)
13303 {
13304 char tmp[30];
13305 int i;
13306 buf[0] = '0';
13307 buf[1] = 'x';
13308 sprintf_vma (tmp, disp);
13309 for (i = 0; tmp[i] == '0' && tmp[i + 1]; i++);
13310 strcpy (buf + 2, tmp + i);
13311 }
13312 else
13313 {
13314 bfd_signed_vma v = disp;
13315 char tmp[30];
13316 int i;
13317 if (v < 0)
13318 {
13319 *(buf++) = '-';
13320 v = -disp;
13321 /* Check for possible overflow on 0x8000000000000000. */
13322 if (v < 0)
13323 {
13324 strcpy (buf, "9223372036854775808");
13325 return;
13326 }
13327 }
13328 if (!v)
13329 {
13330 strcpy (buf, "0");
13331 return;
13332 }
13333
13334 i = 0;
13335 tmp[29] = 0;
13336 while (v)
13337 {
13338 tmp[28 - i] = (v % 10) + '0';
13339 v /= 10;
13340 i++;
13341 }
13342 strcpy (buf, tmp + 29 - i);
13343 }
13344 }
13345 else
13346 {
13347 if (hex)
13348 sprintf (buf, "0x%x", (unsigned int) disp);
13349 else
13350 sprintf (buf, "%d", (int) disp);
13351 }
13352 }
13353
13354 /* Put DISP in BUF as signed hex number. */
13355
13356 static void
13357 print_displacement (char *buf, bfd_vma disp)
13358 {
13359 bfd_signed_vma val = disp;
13360 char tmp[30];
13361 int i, j = 0;
13362
13363 if (val < 0)
13364 {
13365 buf[j++] = '-';
13366 val = -disp;
13367
13368 /* Check for possible overflow. */
13369 if (val < 0)
13370 {
13371 switch (address_mode)
13372 {
13373 case mode_64bit:
13374 strcpy (buf + j, "0x8000000000000000");
13375 break;
13376 case mode_32bit:
13377 strcpy (buf + j, "0x80000000");
13378 break;
13379 case mode_16bit:
13380 strcpy (buf + j, "0x8000");
13381 break;
13382 }
13383 return;
13384 }
13385 }
13386
13387 buf[j++] = '0';
13388 buf[j++] = 'x';
13389
13390 sprintf_vma (tmp, (bfd_vma) val);
13391 for (i = 0; tmp[i] == '0'; i++)
13392 continue;
13393 if (tmp[i] == '\0')
13394 i--;
13395 strcpy (buf + j, tmp + i);
13396 }
13397
13398 static void
13399 intel_operand_size (int bytemode, int sizeflag)
13400 {
13401 if (vex.evex
13402 && vex.b
13403 && (bytemode == x_mode
13404 || bytemode == evex_half_bcst_xmmq_mode))
13405 {
13406 if (vex.w)
13407 oappend ("QWORD PTR ");
13408 else
13409 oappend ("DWORD PTR ");
13410 return;
13411 }
13412 switch (bytemode)
13413 {
13414 case b_mode:
13415 case b_swap_mode:
13416 case dqb_mode:
13417 case db_mode:
13418 oappend ("BYTE PTR ");
13419 break;
13420 case w_mode:
13421 case dw_mode:
13422 case dqw_mode:
13423 oappend ("WORD PTR ");
13424 break;
13425 case indir_v_mode:
13426 if (address_mode == mode_64bit && isa64 == intel64)
13427 {
13428 oappend ("QWORD PTR ");
13429 break;
13430 }
13431 /* Fall through. */
13432 case stack_v_mode:
13433 if (address_mode == mode_64bit && ((sizeflag & DFLAG) || (rex & REX_W)))
13434 {
13435 oappend ("QWORD PTR ");
13436 break;
13437 }
13438 /* Fall through. */
13439 case v_mode:
13440 case v_swap_mode:
13441 case dq_mode:
13442 USED_REX (REX_W);
13443 if (rex & REX_W)
13444 oappend ("QWORD PTR ");
13445 else
13446 {
13447 if ((sizeflag & DFLAG) || bytemode == dq_mode)
13448 oappend ("DWORD PTR ");
13449 else
13450 oappend ("WORD PTR ");
13451 used_prefixes |= (prefixes & PREFIX_DATA);
13452 }
13453 break;
13454 case z_mode:
13455 if ((rex & REX_W) || (sizeflag & DFLAG))
13456 *obufp++ = 'D';
13457 oappend ("WORD PTR ");
13458 if (!(rex & REX_W))
13459 used_prefixes |= (prefixes & PREFIX_DATA);
13460 break;
13461 case a_mode:
13462 if (sizeflag & DFLAG)
13463 oappend ("QWORD PTR ");
13464 else
13465 oappend ("DWORD PTR ");
13466 used_prefixes |= (prefixes & PREFIX_DATA);
13467 break;
13468 case d_mode:
13469 case d_scalar_mode:
13470 case d_scalar_swap_mode:
13471 case d_swap_mode:
13472 case dqd_mode:
13473 oappend ("DWORD PTR ");
13474 break;
13475 case q_mode:
13476 case q_scalar_mode:
13477 case q_scalar_swap_mode:
13478 case q_swap_mode:
13479 oappend ("QWORD PTR ");
13480 break;
13481 case dqa_mode:
13482 case m_mode:
13483 if (address_mode == mode_64bit)
13484 oappend ("QWORD PTR ");
13485 else
13486 oappend ("DWORD PTR ");
13487 break;
13488 case f_mode:
13489 if (sizeflag & DFLAG)
13490 oappend ("FWORD PTR ");
13491 else
13492 oappend ("DWORD PTR ");
13493 used_prefixes |= (prefixes & PREFIX_DATA);
13494 break;
13495 case t_mode:
13496 oappend ("TBYTE PTR ");
13497 break;
13498 case x_mode:
13499 case x_swap_mode:
13500 case evex_x_gscat_mode:
13501 case evex_x_nobcst_mode:
13502 case b_scalar_mode:
13503 case w_scalar_mode:
13504 if (need_vex)
13505 {
13506 switch (vex.length)
13507 {
13508 case 128:
13509 oappend ("XMMWORD PTR ");
13510 break;
13511 case 256:
13512 oappend ("YMMWORD PTR ");
13513 break;
13514 case 512:
13515 oappend ("ZMMWORD PTR ");
13516 break;
13517 default:
13518 abort ();
13519 }
13520 }
13521 else
13522 oappend ("XMMWORD PTR ");
13523 break;
13524 case xmm_mode:
13525 oappend ("XMMWORD PTR ");
13526 break;
13527 case ymm_mode:
13528 oappend ("YMMWORD PTR ");
13529 break;
13530 case xmmq_mode:
13531 case evex_half_bcst_xmmq_mode:
13532 if (!need_vex)
13533 abort ();
13534
13535 switch (vex.length)
13536 {
13537 case 128:
13538 oappend ("QWORD PTR ");
13539 break;
13540 case 256:
13541 oappend ("XMMWORD PTR ");
13542 break;
13543 case 512:
13544 oappend ("YMMWORD PTR ");
13545 break;
13546 default:
13547 abort ();
13548 }
13549 break;
13550 case xmm_mb_mode:
13551 if (!need_vex)
13552 abort ();
13553
13554 switch (vex.length)
13555 {
13556 case 128:
13557 case 256:
13558 case 512:
13559 oappend ("BYTE PTR ");
13560 break;
13561 default:
13562 abort ();
13563 }
13564 break;
13565 case xmm_mw_mode:
13566 if (!need_vex)
13567 abort ();
13568
13569 switch (vex.length)
13570 {
13571 case 128:
13572 case 256:
13573 case 512:
13574 oappend ("WORD PTR ");
13575 break;
13576 default:
13577 abort ();
13578 }
13579 break;
13580 case xmm_md_mode:
13581 if (!need_vex)
13582 abort ();
13583
13584 switch (vex.length)
13585 {
13586 case 128:
13587 case 256:
13588 case 512:
13589 oappend ("DWORD PTR ");
13590 break;
13591 default:
13592 abort ();
13593 }
13594 break;
13595 case xmm_mq_mode:
13596 if (!need_vex)
13597 abort ();
13598
13599 switch (vex.length)
13600 {
13601 case 128:
13602 case 256:
13603 case 512:
13604 oappend ("QWORD PTR ");
13605 break;
13606 default:
13607 abort ();
13608 }
13609 break;
13610 case xmmdw_mode:
13611 if (!need_vex)
13612 abort ();
13613
13614 switch (vex.length)
13615 {
13616 case 128:
13617 oappend ("WORD PTR ");
13618 break;
13619 case 256:
13620 oappend ("DWORD PTR ");
13621 break;
13622 case 512:
13623 oappend ("QWORD PTR ");
13624 break;
13625 default:
13626 abort ();
13627 }
13628 break;
13629 case xmmqd_mode:
13630 if (!need_vex)
13631 abort ();
13632
13633 switch (vex.length)
13634 {
13635 case 128:
13636 oappend ("DWORD PTR ");
13637 break;
13638 case 256:
13639 oappend ("QWORD PTR ");
13640 break;
13641 case 512:
13642 oappend ("XMMWORD PTR ");
13643 break;
13644 default:
13645 abort ();
13646 }
13647 break;
13648 case ymmq_mode:
13649 if (!need_vex)
13650 abort ();
13651
13652 switch (vex.length)
13653 {
13654 case 128:
13655 oappend ("QWORD PTR ");
13656 break;
13657 case 256:
13658 oappend ("YMMWORD PTR ");
13659 break;
13660 case 512:
13661 oappend ("ZMMWORD PTR ");
13662 break;
13663 default:
13664 abort ();
13665 }
13666 break;
13667 case ymmxmm_mode:
13668 if (!need_vex)
13669 abort ();
13670
13671 switch (vex.length)
13672 {
13673 case 128:
13674 case 256:
13675 oappend ("XMMWORD PTR ");
13676 break;
13677 default:
13678 abort ();
13679 }
13680 break;
13681 case o_mode:
13682 oappend ("OWORD PTR ");
13683 break;
13684 case xmm_mdq_mode:
13685 case vex_w_dq_mode:
13686 case vex_scalar_w_dq_mode:
13687 if (!need_vex)
13688 abort ();
13689
13690 if (vex.w)
13691 oappend ("QWORD PTR ");
13692 else
13693 oappend ("DWORD PTR ");
13694 break;
13695 case vex_vsib_d_w_dq_mode:
13696 case vex_vsib_q_w_dq_mode:
13697 if (!need_vex)
13698 abort ();
13699
13700 if (!vex.evex)
13701 {
13702 if (vex.w)
13703 oappend ("QWORD PTR ");
13704 else
13705 oappend ("DWORD PTR ");
13706 }
13707 else
13708 {
13709 switch (vex.length)
13710 {
13711 case 128:
13712 oappend ("XMMWORD PTR ");
13713 break;
13714 case 256:
13715 oappend ("YMMWORD PTR ");
13716 break;
13717 case 512:
13718 oappend ("ZMMWORD PTR ");
13719 break;
13720 default:
13721 abort ();
13722 }
13723 }
13724 break;
13725 case vex_vsib_q_w_d_mode:
13726 case vex_vsib_d_w_d_mode:
13727 if (!need_vex || !vex.evex)
13728 abort ();
13729
13730 switch (vex.length)
13731 {
13732 case 128:
13733 oappend ("QWORD PTR ");
13734 break;
13735 case 256:
13736 oappend ("XMMWORD PTR ");
13737 break;
13738 case 512:
13739 oappend ("YMMWORD PTR ");
13740 break;
13741 default:
13742 abort ();
13743 }
13744
13745 break;
13746 case mask_bd_mode:
13747 if (!need_vex || vex.length != 128)
13748 abort ();
13749 if (vex.w)
13750 oappend ("DWORD PTR ");
13751 else
13752 oappend ("BYTE PTR ");
13753 break;
13754 case mask_mode:
13755 if (!need_vex)
13756 abort ();
13757 if (vex.w)
13758 oappend ("QWORD PTR ");
13759 else
13760 oappend ("WORD PTR ");
13761 break;
13762 case v_bnd_mode:
13763 case v_bndmk_mode:
13764 default:
13765 break;
13766 }
13767 }
13768
13769 static void
13770 OP_E_register (int bytemode, int sizeflag)
13771 {
13772 int reg = modrm.rm;
13773 const char **names;
13774
13775 USED_REX (REX_B);
13776 if ((rex & REX_B))
13777 reg += 8;
13778
13779 if ((sizeflag & SUFFIX_ALWAYS)
13780 && (bytemode == b_swap_mode
13781 || bytemode == bnd_swap_mode
13782 || bytemode == v_swap_mode))
13783 swap_operand ();
13784
13785 switch (bytemode)
13786 {
13787 case b_mode:
13788 case b_swap_mode:
13789 USED_REX (0);
13790 if (rex)
13791 names = names8rex;
13792 else
13793 names = names8;
13794 break;
13795 case w_mode:
13796 names = names16;
13797 break;
13798 case d_mode:
13799 case dw_mode:
13800 case db_mode:
13801 names = names32;
13802 break;
13803 case q_mode:
13804 names = names64;
13805 break;
13806 case m_mode:
13807 case v_bnd_mode:
13808 names = address_mode == mode_64bit ? names64 : names32;
13809 break;
13810 case bnd_mode:
13811 case bnd_swap_mode:
13812 if (reg > 0x3)
13813 {
13814 oappend ("(bad)");
13815 return;
13816 }
13817 names = names_bnd;
13818 break;
13819 case indir_v_mode:
13820 if (address_mode == mode_64bit && isa64 == intel64)
13821 {
13822 names = names64;
13823 break;
13824 }
13825 /* Fall through. */
13826 case stack_v_mode:
13827 if (address_mode == mode_64bit && ((sizeflag & DFLAG) || (rex & REX_W)))
13828 {
13829 names = names64;
13830 break;
13831 }
13832 bytemode = v_mode;
13833 /* Fall through. */
13834 case v_mode:
13835 case v_swap_mode:
13836 case dq_mode:
13837 case dqb_mode:
13838 case dqd_mode:
13839 case dqw_mode:
13840 case dqa_mode:
13841 USED_REX (REX_W);
13842 if (rex & REX_W)
13843 names = names64;
13844 else
13845 {
13846 if ((sizeflag & DFLAG)
13847 || (bytemode != v_mode
13848 && bytemode != v_swap_mode))
13849 names = names32;
13850 else
13851 names = names16;
13852 used_prefixes |= (prefixes & PREFIX_DATA);
13853 }
13854 break;
13855 case va_mode:
13856 names = (address_mode == mode_64bit
13857 ? names64 : names32);
13858 if (!(prefixes & PREFIX_ADDR))
13859 names = (address_mode == mode_16bit
13860 ? names16 : names);
13861 else
13862 {
13863 /* Remove "addr16/addr32". */
13864 all_prefixes[last_addr_prefix] = 0;
13865 names = (address_mode != mode_32bit
13866 ? names32 : names16);
13867 used_prefixes |= PREFIX_ADDR;
13868 }
13869 break;
13870 case mask_bd_mode:
13871 case mask_mode:
13872 if (reg > 0x7)
13873 {
13874 oappend ("(bad)");
13875 return;
13876 }
13877 names = names_mask;
13878 break;
13879 case 0:
13880 return;
13881 default:
13882 oappend (INTERNAL_DISASSEMBLER_ERROR);
13883 return;
13884 }
13885 oappend (names[reg]);
13886 }
13887
13888 static void
13889 OP_E_memory (int bytemode, int sizeflag)
13890 {
13891 bfd_vma disp = 0;
13892 int add = (rex & REX_B) ? 8 : 0;
13893 int riprel = 0;
13894 int shift;
13895
13896 if (vex.evex)
13897 {
13898 /* In EVEX, if operand doesn't allow broadcast, vex.b should be 0. */
13899 if (vex.b
13900 && bytemode != x_mode
13901 && bytemode != xmmq_mode
13902 && bytemode != evex_half_bcst_xmmq_mode)
13903 {
13904 BadOp ();
13905 return;
13906 }
13907 switch (bytemode)
13908 {
13909 case dqw_mode:
13910 case dw_mode:
13911 shift = 1;
13912 break;
13913 case dqb_mode:
13914 case db_mode:
13915 shift = 0;
13916 break;
13917 case dq_mode:
13918 if (address_mode != mode_64bit)
13919 {
13920 shift = 2;
13921 break;
13922 }
13923 /* fall through */
13924 case vex_vsib_d_w_dq_mode:
13925 case vex_vsib_d_w_d_mode:
13926 case vex_vsib_q_w_dq_mode:
13927 case vex_vsib_q_w_d_mode:
13928 case evex_x_gscat_mode:
13929 case xmm_mdq_mode:
13930 shift = vex.w ? 3 : 2;
13931 break;
13932 case x_mode:
13933 case evex_half_bcst_xmmq_mode:
13934 case xmmq_mode:
13935 if (vex.b)
13936 {
13937 shift = vex.w ? 3 : 2;
13938 break;
13939 }
13940 /* Fall through. */
13941 case xmmqd_mode:
13942 case xmmdw_mode:
13943 case ymmq_mode:
13944 case evex_x_nobcst_mode:
13945 case x_swap_mode:
13946 switch (vex.length)
13947 {
13948 case 128:
13949 shift = 4;
13950 break;
13951 case 256:
13952 shift = 5;
13953 break;
13954 case 512:
13955 shift = 6;
13956 break;
13957 default:
13958 abort ();
13959 }
13960 break;
13961 case ymm_mode:
13962 shift = 5;
13963 break;
13964 case xmm_mode:
13965 shift = 4;
13966 break;
13967 case xmm_mq_mode:
13968 case q_mode:
13969 case q_scalar_mode:
13970 case q_swap_mode:
13971 case q_scalar_swap_mode:
13972 shift = 3;
13973 break;
13974 case dqd_mode:
13975 case xmm_md_mode:
13976 case d_mode:
13977 case d_scalar_mode:
13978 case d_swap_mode:
13979 case d_scalar_swap_mode:
13980 shift = 2;
13981 break;
13982 case w_scalar_mode:
13983 case xmm_mw_mode:
13984 shift = 1;
13985 break;
13986 case b_scalar_mode:
13987 case xmm_mb_mode:
13988 shift = 0;
13989 break;
13990 case dqa_mode:
13991 shift = address_mode == mode_64bit ? 3 : 2;
13992 break;
13993 default:
13994 abort ();
13995 }
13996 /* Make necessary corrections to shift for modes that need it.
13997 For these modes we currently have shift 4, 5 or 6 depending on
13998 vex.length (it corresponds to xmmword, ymmword or zmmword
13999 operand). We might want to make it 3, 4 or 5 (e.g. for
14000 xmmq_mode). In case of broadcast enabled the corrections
14001 aren't needed, as element size is always 32 or 64 bits. */
14002 if (!vex.b
14003 && (bytemode == xmmq_mode
14004 || bytemode == evex_half_bcst_xmmq_mode))
14005 shift -= 1;
14006 else if (bytemode == xmmqd_mode)
14007 shift -= 2;
14008 else if (bytemode == xmmdw_mode)
14009 shift -= 3;
14010 else if (bytemode == ymmq_mode && vex.length == 128)
14011 shift -= 1;
14012 }
14013 else
14014 shift = 0;
14015
14016 USED_REX (REX_B);
14017 if (intel_syntax)
14018 intel_operand_size (bytemode, sizeflag);
14019 append_seg ();
14020
14021 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
14022 {
14023 /* 32/64 bit address mode */
14024 int havedisp;
14025 int havesib;
14026 int havebase;
14027 int haveindex;
14028 int needindex;
14029 int needaddr32;
14030 int base, rbase;
14031 int vindex = 0;
14032 int scale = 0;
14033 int addr32flag = !((sizeflag & AFLAG)
14034 || bytemode == v_bnd_mode
14035 || bytemode == v_bndmk_mode
14036 || bytemode == bnd_mode
14037 || bytemode == bnd_swap_mode);
14038 const char **indexes64 = names64;
14039 const char **indexes32 = names32;
14040
14041 havesib = 0;
14042 havebase = 1;
14043 haveindex = 0;
14044 base = modrm.rm;
14045
14046 if (base == 4)
14047 {
14048 havesib = 1;
14049 vindex = sib.index;
14050 USED_REX (REX_X);
14051 if (rex & REX_X)
14052 vindex += 8;
14053 switch (bytemode)
14054 {
14055 case vex_vsib_d_w_dq_mode:
14056 case vex_vsib_d_w_d_mode:
14057 case vex_vsib_q_w_dq_mode:
14058 case vex_vsib_q_w_d_mode:
14059 if (!need_vex)
14060 abort ();
14061 if (vex.evex)
14062 {
14063 if (!vex.v)
14064 vindex += 16;
14065 }
14066
14067 haveindex = 1;
14068 switch (vex.length)
14069 {
14070 case 128:
14071 indexes64 = indexes32 = names_xmm;
14072 break;
14073 case 256:
14074 if (!vex.w
14075 || bytemode == vex_vsib_q_w_dq_mode
14076 || bytemode == vex_vsib_q_w_d_mode)
14077 indexes64 = indexes32 = names_ymm;
14078 else
14079 indexes64 = indexes32 = names_xmm;
14080 break;
14081 case 512:
14082 if (!vex.w
14083 || bytemode == vex_vsib_q_w_dq_mode
14084 || bytemode == vex_vsib_q_w_d_mode)
14085 indexes64 = indexes32 = names_zmm;
14086 else
14087 indexes64 = indexes32 = names_ymm;
14088 break;
14089 default:
14090 abort ();
14091 }
14092 break;
14093 default:
14094 haveindex = vindex != 4;
14095 break;
14096 }
14097 scale = sib.scale;
14098 base = sib.base;
14099 codep++;
14100 }
14101 rbase = base + add;
14102
14103 switch (modrm.mod)
14104 {
14105 case 0:
14106 if (base == 5)
14107 {
14108 havebase = 0;
14109 if (address_mode == mode_64bit && !havesib)
14110 riprel = 1;
14111 disp = get32s ();
14112 if (riprel && bytemode == v_bndmk_mode)
14113 {
14114 oappend ("(bad)");
14115 return;
14116 }
14117 }
14118 break;
14119 case 1:
14120 FETCH_DATA (the_info, codep + 1);
14121 disp = *codep++;
14122 if ((disp & 0x80) != 0)
14123 disp -= 0x100;
14124 if (vex.evex && shift > 0)
14125 disp <<= shift;
14126 break;
14127 case 2:
14128 disp = get32s ();
14129 break;
14130 }
14131
14132 needindex = 0;
14133 needaddr32 = 0;
14134 if (havesib
14135 && !havebase
14136 && !haveindex
14137 && address_mode != mode_16bit)
14138 {
14139 if (address_mode == mode_64bit)
14140 {
14141 /* Display eiz instead of addr32. */
14142 needindex = addr32flag;
14143 needaddr32 = 1;
14144 }
14145 else
14146 {
14147 /* In 32-bit mode, we need index register to tell [offset]
14148 from [eiz*1 + offset]. */
14149 needindex = 1;
14150 }
14151 }
14152
14153 havedisp = (havebase
14154 || needindex
14155 || (havesib && (haveindex || scale != 0)));
14156
14157 if (!intel_syntax)
14158 if (modrm.mod != 0 || base == 5)
14159 {
14160 if (havedisp || riprel)
14161 print_displacement (scratchbuf, disp);
14162 else
14163 print_operand_value (scratchbuf, 1, disp);
14164 oappend (scratchbuf);
14165 if (riprel)
14166 {
14167 set_op (disp, 1);
14168 oappend (!addr32flag ? "(%rip)" : "(%eip)");
14169 }
14170 }
14171
14172 if ((havebase || haveindex || needaddr32 || riprel)
14173 && (bytemode != v_bnd_mode)
14174 && (bytemode != v_bndmk_mode)
14175 && (bytemode != bnd_mode)
14176 && (bytemode != bnd_swap_mode))
14177 used_prefixes |= PREFIX_ADDR;
14178
14179 if (havedisp || (intel_syntax && riprel))
14180 {
14181 *obufp++ = open_char;
14182 if (intel_syntax && riprel)
14183 {
14184 set_op (disp, 1);
14185 oappend (!addr32flag ? "rip" : "eip");
14186 }
14187 *obufp = '\0';
14188 if (havebase)
14189 oappend (address_mode == mode_64bit && !addr32flag
14190 ? names64[rbase] : names32[rbase]);
14191 if (havesib)
14192 {
14193 /* ESP/RSP won't allow index. If base isn't ESP/RSP,
14194 print index to tell base + index from base. */
14195 if (scale != 0
14196 || needindex
14197 || haveindex
14198 || (havebase && base != ESP_REG_NUM))
14199 {
14200 if (!intel_syntax || havebase)
14201 {
14202 *obufp++ = separator_char;
14203 *obufp = '\0';
14204 }
14205 if (haveindex)
14206 oappend (address_mode == mode_64bit && !addr32flag
14207 ? indexes64[vindex] : indexes32[vindex]);
14208 else
14209 oappend (address_mode == mode_64bit && !addr32flag
14210 ? index64 : index32);
14211
14212 *obufp++ = scale_char;
14213 *obufp = '\0';
14214 sprintf (scratchbuf, "%d", 1 << scale);
14215 oappend (scratchbuf);
14216 }
14217 }
14218 if (intel_syntax
14219 && (disp || modrm.mod != 0 || base == 5))
14220 {
14221 if (!havedisp || (bfd_signed_vma) disp >= 0)
14222 {
14223 *obufp++ = '+';
14224 *obufp = '\0';
14225 }
14226 else if (modrm.mod != 1 && disp != -disp)
14227 {
14228 *obufp++ = '-';
14229 *obufp = '\0';
14230 disp = - (bfd_signed_vma) disp;
14231 }
14232
14233 if (havedisp)
14234 print_displacement (scratchbuf, disp);
14235 else
14236 print_operand_value (scratchbuf, 1, disp);
14237 oappend (scratchbuf);
14238 }
14239
14240 *obufp++ = close_char;
14241 *obufp = '\0';
14242 }
14243 else if (intel_syntax)
14244 {
14245 if (modrm.mod != 0 || base == 5)
14246 {
14247 if (!active_seg_prefix)
14248 {
14249 oappend (names_seg[ds_reg - es_reg]);
14250 oappend (":");
14251 }
14252 print_operand_value (scratchbuf, 1, disp);
14253 oappend (scratchbuf);
14254 }
14255 }
14256 }
14257 else
14258 {
14259 /* 16 bit address mode */
14260 used_prefixes |= prefixes & PREFIX_ADDR;
14261 switch (modrm.mod)
14262 {
14263 case 0:
14264 if (modrm.rm == 6)
14265 {
14266 disp = get16 ();
14267 if ((disp & 0x8000) != 0)
14268 disp -= 0x10000;
14269 }
14270 break;
14271 case 1:
14272 FETCH_DATA (the_info, codep + 1);
14273 disp = *codep++;
14274 if ((disp & 0x80) != 0)
14275 disp -= 0x100;
14276 if (vex.evex && shift > 0)
14277 disp <<= shift;
14278 break;
14279 case 2:
14280 disp = get16 ();
14281 if ((disp & 0x8000) != 0)
14282 disp -= 0x10000;
14283 break;
14284 }
14285
14286 if (!intel_syntax)
14287 if (modrm.mod != 0 || modrm.rm == 6)
14288 {
14289 print_displacement (scratchbuf, disp);
14290 oappend (scratchbuf);
14291 }
14292
14293 if (modrm.mod != 0 || modrm.rm != 6)
14294 {
14295 *obufp++ = open_char;
14296 *obufp = '\0';
14297 oappend (index16[modrm.rm]);
14298 if (intel_syntax
14299 && (disp || modrm.mod != 0 || modrm.rm == 6))
14300 {
14301 if ((bfd_signed_vma) disp >= 0)
14302 {
14303 *obufp++ = '+';
14304 *obufp = '\0';
14305 }
14306 else if (modrm.mod != 1)
14307 {
14308 *obufp++ = '-';
14309 *obufp = '\0';
14310 disp = - (bfd_signed_vma) disp;
14311 }
14312
14313 print_displacement (scratchbuf, disp);
14314 oappend (scratchbuf);
14315 }
14316
14317 *obufp++ = close_char;
14318 *obufp = '\0';
14319 }
14320 else if (intel_syntax)
14321 {
14322 if (!active_seg_prefix)
14323 {
14324 oappend (names_seg[ds_reg - es_reg]);
14325 oappend (":");
14326 }
14327 print_operand_value (scratchbuf, 1, disp & 0xffff);
14328 oappend (scratchbuf);
14329 }
14330 }
14331 if (vex.evex && vex.b
14332 && (bytemode == x_mode
14333 || bytemode == xmmq_mode
14334 || bytemode == evex_half_bcst_xmmq_mode))
14335 {
14336 if (vex.w
14337 || bytemode == xmmq_mode
14338 || bytemode == evex_half_bcst_xmmq_mode)
14339 {
14340 switch (vex.length)
14341 {
14342 case 128:
14343 oappend ("{1to2}");
14344 break;
14345 case 256:
14346 oappend ("{1to4}");
14347 break;
14348 case 512:
14349 oappend ("{1to8}");
14350 break;
14351 default:
14352 abort ();
14353 }
14354 }
14355 else
14356 {
14357 switch (vex.length)
14358 {
14359 case 128:
14360 oappend ("{1to4}");
14361 break;
14362 case 256:
14363 oappend ("{1to8}");
14364 break;
14365 case 512:
14366 oappend ("{1to16}");
14367 break;
14368 default:
14369 abort ();
14370 }
14371 }
14372 }
14373 }
14374
14375 static void
14376 OP_E (int bytemode, int sizeflag)
14377 {
14378 /* Skip mod/rm byte. */
14379 MODRM_CHECK;
14380 codep++;
14381
14382 if (modrm.mod == 3)
14383 OP_E_register (bytemode, sizeflag);
14384 else
14385 OP_E_memory (bytemode, sizeflag);
14386 }
14387
14388 static void
14389 OP_G (int bytemode, int sizeflag)
14390 {
14391 int add = 0;
14392 const char **names;
14393 USED_REX (REX_R);
14394 if (rex & REX_R)
14395 add += 8;
14396 switch (bytemode)
14397 {
14398 case b_mode:
14399 USED_REX (0);
14400 if (rex)
14401 oappend (names8rex[modrm.reg + add]);
14402 else
14403 oappend (names8[modrm.reg + add]);
14404 break;
14405 case w_mode:
14406 oappend (names16[modrm.reg + add]);
14407 break;
14408 case d_mode:
14409 case db_mode:
14410 case dw_mode:
14411 oappend (names32[modrm.reg + add]);
14412 break;
14413 case q_mode:
14414 oappend (names64[modrm.reg + add]);
14415 break;
14416 case bnd_mode:
14417 if (modrm.reg > 0x3)
14418 {
14419 oappend ("(bad)");
14420 return;
14421 }
14422 oappend (names_bnd[modrm.reg]);
14423 break;
14424 case v_mode:
14425 case dq_mode:
14426 case dqb_mode:
14427 case dqd_mode:
14428 case dqw_mode:
14429 USED_REX (REX_W);
14430 if (rex & REX_W)
14431 oappend (names64[modrm.reg + add]);
14432 else
14433 {
14434 if ((sizeflag & DFLAG) || bytemode != v_mode)
14435 oappend (names32[modrm.reg + add]);
14436 else
14437 oappend (names16[modrm.reg + add]);
14438 used_prefixes |= (prefixes & PREFIX_DATA);
14439 }
14440 break;
14441 case va_mode:
14442 names = (address_mode == mode_64bit
14443 ? names64 : names32);
14444 if (!(prefixes & PREFIX_ADDR))
14445 {
14446 if (address_mode == mode_16bit)
14447 names = names16;
14448 }
14449 else
14450 {
14451 /* Remove "addr16/addr32". */
14452 all_prefixes[last_addr_prefix] = 0;
14453 names = (address_mode != mode_32bit
14454 ? names32 : names16);
14455 used_prefixes |= PREFIX_ADDR;
14456 }
14457 oappend (names[modrm.reg + add]);
14458 break;
14459 case m_mode:
14460 if (address_mode == mode_64bit)
14461 oappend (names64[modrm.reg + add]);
14462 else
14463 oappend (names32[modrm.reg + add]);
14464 break;
14465 case mask_bd_mode:
14466 case mask_mode:
14467 if ((modrm.reg + add) > 0x7)
14468 {
14469 oappend ("(bad)");
14470 return;
14471 }
14472 oappend (names_mask[modrm.reg + add]);
14473 break;
14474 default:
14475 oappend (INTERNAL_DISASSEMBLER_ERROR);
14476 break;
14477 }
14478 }
14479
14480 static bfd_vma
14481 get64 (void)
14482 {
14483 bfd_vma x;
14484 #ifdef BFD64
14485 unsigned int a;
14486 unsigned int b;
14487
14488 FETCH_DATA (the_info, codep + 8);
14489 a = *codep++ & 0xff;
14490 a |= (*codep++ & 0xff) << 8;
14491 a |= (*codep++ & 0xff) << 16;
14492 a |= (*codep++ & 0xffu) << 24;
14493 b = *codep++ & 0xff;
14494 b |= (*codep++ & 0xff) << 8;
14495 b |= (*codep++ & 0xff) << 16;
14496 b |= (*codep++ & 0xffu) << 24;
14497 x = a + ((bfd_vma) b << 32);
14498 #else
14499 abort ();
14500 x = 0;
14501 #endif
14502 return x;
14503 }
14504
14505 static bfd_signed_vma
14506 get32 (void)
14507 {
14508 bfd_signed_vma x = 0;
14509
14510 FETCH_DATA (the_info, codep + 4);
14511 x = *codep++ & (bfd_signed_vma) 0xff;
14512 x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
14513 x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
14514 x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
14515 return x;
14516 }
14517
14518 static bfd_signed_vma
14519 get32s (void)
14520 {
14521 bfd_signed_vma x = 0;
14522
14523 FETCH_DATA (the_info, codep + 4);
14524 x = *codep++ & (bfd_signed_vma) 0xff;
14525 x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
14526 x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
14527 x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
14528
14529 x = (x ^ ((bfd_signed_vma) 1 << 31)) - ((bfd_signed_vma) 1 << 31);
14530
14531 return x;
14532 }
14533
14534 static int
14535 get16 (void)
14536 {
14537 int x = 0;
14538
14539 FETCH_DATA (the_info, codep + 2);
14540 x = *codep++ & 0xff;
14541 x |= (*codep++ & 0xff) << 8;
14542 return x;
14543 }
14544
14545 static void
14546 set_op (bfd_vma op, int riprel)
14547 {
14548 op_index[op_ad] = op_ad;
14549 if (address_mode == mode_64bit)
14550 {
14551 op_address[op_ad] = op;
14552 op_riprel[op_ad] = riprel;
14553 }
14554 else
14555 {
14556 /* Mask to get a 32-bit address. */
14557 op_address[op_ad] = op & 0xffffffff;
14558 op_riprel[op_ad] = riprel & 0xffffffff;
14559 }
14560 }
14561
14562 static void
14563 OP_REG (int code, int sizeflag)
14564 {
14565 const char *s;
14566 int add;
14567
14568 switch (code)
14569 {
14570 case es_reg: case ss_reg: case cs_reg:
14571 case ds_reg: case fs_reg: case gs_reg:
14572 oappend (names_seg[code - es_reg]);
14573 return;
14574 }
14575
14576 USED_REX (REX_B);
14577 if (rex & REX_B)
14578 add = 8;
14579 else
14580 add = 0;
14581
14582 switch (code)
14583 {
14584 case ax_reg: case cx_reg: case dx_reg: case bx_reg:
14585 case sp_reg: case bp_reg: case si_reg: case di_reg:
14586 s = names16[code - ax_reg + add];
14587 break;
14588 case al_reg: case ah_reg: case cl_reg: case ch_reg:
14589 case dl_reg: case dh_reg: case bl_reg: case bh_reg:
14590 USED_REX (0);
14591 if (rex)
14592 s = names8rex[code - al_reg + add];
14593 else
14594 s = names8[code - al_reg];
14595 break;
14596 case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
14597 case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
14598 if (address_mode == mode_64bit
14599 && ((sizeflag & DFLAG) || (rex & REX_W)))
14600 {
14601 s = names64[code - rAX_reg + add];
14602 break;
14603 }
14604 code += eAX_reg - rAX_reg;
14605 /* Fall through. */
14606 case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
14607 case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
14608 USED_REX (REX_W);
14609 if (rex & REX_W)
14610 s = names64[code - eAX_reg + add];
14611 else
14612 {
14613 if (sizeflag & DFLAG)
14614 s = names32[code - eAX_reg + add];
14615 else
14616 s = names16[code - eAX_reg + add];
14617 used_prefixes |= (prefixes & PREFIX_DATA);
14618 }
14619 break;
14620 default:
14621 s = INTERNAL_DISASSEMBLER_ERROR;
14622 break;
14623 }
14624 oappend (s);
14625 }
14626
14627 static void
14628 OP_IMREG (int code, int sizeflag)
14629 {
14630 const char *s;
14631
14632 switch (code)
14633 {
14634 case indir_dx_reg:
14635 if (intel_syntax)
14636 s = "dx";
14637 else
14638 s = "(%dx)";
14639 break;
14640 case ax_reg: case cx_reg: case dx_reg: case bx_reg:
14641 case sp_reg: case bp_reg: case si_reg: case di_reg:
14642 s = names16[code - ax_reg];
14643 break;
14644 case es_reg: case ss_reg: case cs_reg:
14645 case ds_reg: case fs_reg: case gs_reg:
14646 s = names_seg[code - es_reg];
14647 break;
14648 case al_reg: case ah_reg: case cl_reg: case ch_reg:
14649 case dl_reg: case dh_reg: case bl_reg: case bh_reg:
14650 USED_REX (0);
14651 if (rex)
14652 s = names8rex[code - al_reg];
14653 else
14654 s = names8[code - al_reg];
14655 break;
14656 case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
14657 case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
14658 USED_REX (REX_W);
14659 if (rex & REX_W)
14660 s = names64[code - eAX_reg];
14661 else
14662 {
14663 if (sizeflag & DFLAG)
14664 s = names32[code - eAX_reg];
14665 else
14666 s = names16[code - eAX_reg];
14667 used_prefixes |= (prefixes & PREFIX_DATA);
14668 }
14669 break;
14670 case z_mode_ax_reg:
14671 if ((rex & REX_W) || (sizeflag & DFLAG))
14672 s = *names32;
14673 else
14674 s = *names16;
14675 if (!(rex & REX_W))
14676 used_prefixes |= (prefixes & PREFIX_DATA);
14677 break;
14678 default:
14679 s = INTERNAL_DISASSEMBLER_ERROR;
14680 break;
14681 }
14682 oappend (s);
14683 }
14684
14685 static void
14686 OP_I (int bytemode, int sizeflag)
14687 {
14688 bfd_signed_vma op;
14689 bfd_signed_vma mask = -1;
14690
14691 switch (bytemode)
14692 {
14693 case b_mode:
14694 FETCH_DATA (the_info, codep + 1);
14695 op = *codep++;
14696 mask = 0xff;
14697 break;
14698 case q_mode:
14699 if (address_mode == mode_64bit)
14700 {
14701 op = get32s ();
14702 break;
14703 }
14704 /* Fall through. */
14705 case v_mode:
14706 USED_REX (REX_W);
14707 if (rex & REX_W)
14708 op = get32s ();
14709 else
14710 {
14711 if (sizeflag & DFLAG)
14712 {
14713 op = get32 ();
14714 mask = 0xffffffff;
14715 }
14716 else
14717 {
14718 op = get16 ();
14719 mask = 0xfffff;
14720 }
14721 used_prefixes |= (prefixes & PREFIX_DATA);
14722 }
14723 break;
14724 case w_mode:
14725 mask = 0xfffff;
14726 op = get16 ();
14727 break;
14728 case const_1_mode:
14729 if (intel_syntax)
14730 oappend ("1");
14731 return;
14732 default:
14733 oappend (INTERNAL_DISASSEMBLER_ERROR);
14734 return;
14735 }
14736
14737 op &= mask;
14738 scratchbuf[0] = '$';
14739 print_operand_value (scratchbuf + 1, 1, op);
14740 oappend_maybe_intel (scratchbuf);
14741 scratchbuf[0] = '\0';
14742 }
14743
14744 static void
14745 OP_I64 (int bytemode, int sizeflag)
14746 {
14747 bfd_signed_vma op;
14748 bfd_signed_vma mask = -1;
14749
14750 if (address_mode != mode_64bit)
14751 {
14752 OP_I (bytemode, sizeflag);
14753 return;
14754 }
14755
14756 switch (bytemode)
14757 {
14758 case b_mode:
14759 FETCH_DATA (the_info, codep + 1);
14760 op = *codep++;
14761 mask = 0xff;
14762 break;
14763 case v_mode:
14764 USED_REX (REX_W);
14765 if (rex & REX_W)
14766 op = get64 ();
14767 else
14768 {
14769 if (sizeflag & DFLAG)
14770 {
14771 op = get32 ();
14772 mask = 0xffffffff;
14773 }
14774 else
14775 {
14776 op = get16 ();
14777 mask = 0xfffff;
14778 }
14779 used_prefixes |= (prefixes & PREFIX_DATA);
14780 }
14781 break;
14782 case w_mode:
14783 mask = 0xfffff;
14784 op = get16 ();
14785 break;
14786 default:
14787 oappend (INTERNAL_DISASSEMBLER_ERROR);
14788 return;
14789 }
14790
14791 op &= mask;
14792 scratchbuf[0] = '$';
14793 print_operand_value (scratchbuf + 1, 1, op);
14794 oappend_maybe_intel (scratchbuf);
14795 scratchbuf[0] = '\0';
14796 }
14797
14798 static void
14799 OP_sI (int bytemode, int sizeflag)
14800 {
14801 bfd_signed_vma op;
14802
14803 switch (bytemode)
14804 {
14805 case b_mode:
14806 case b_T_mode:
14807 FETCH_DATA (the_info, codep + 1);
14808 op = *codep++;
14809 if ((op & 0x80) != 0)
14810 op -= 0x100;
14811 if (bytemode == b_T_mode)
14812 {
14813 if (address_mode != mode_64bit
14814 || !((sizeflag & DFLAG) || (rex & REX_W)))
14815 {
14816 /* The operand-size prefix is overridden by a REX prefix. */
14817 if ((sizeflag & DFLAG) || (rex & REX_W))
14818 op &= 0xffffffff;
14819 else
14820 op &= 0xffff;
14821 }
14822 }
14823 else
14824 {
14825 if (!(rex & REX_W))
14826 {
14827 if (sizeflag & DFLAG)
14828 op &= 0xffffffff;
14829 else
14830 op &= 0xffff;
14831 }
14832 }
14833 break;
14834 case v_mode:
14835 /* The operand-size prefix is overridden by a REX prefix. */
14836 if ((sizeflag & DFLAG) || (rex & REX_W))
14837 op = get32s ();
14838 else
14839 op = get16 ();
14840 break;
14841 default:
14842 oappend (INTERNAL_DISASSEMBLER_ERROR);
14843 return;
14844 }
14845
14846 scratchbuf[0] = '$';
14847 print_operand_value (scratchbuf + 1, 1, op);
14848 oappend_maybe_intel (scratchbuf);
14849 }
14850
14851 static void
14852 OP_J (int bytemode, int sizeflag)
14853 {
14854 bfd_vma disp;
14855 bfd_vma mask = -1;
14856 bfd_vma segment = 0;
14857
14858 switch (bytemode)
14859 {
14860 case b_mode:
14861 FETCH_DATA (the_info, codep + 1);
14862 disp = *codep++;
14863 if ((disp & 0x80) != 0)
14864 disp -= 0x100;
14865 break;
14866 case v_mode:
14867 if (isa64 == amd64)
14868 USED_REX (REX_W);
14869 if ((sizeflag & DFLAG)
14870 || (address_mode == mode_64bit
14871 && (isa64 != amd64 || (rex & REX_W))))
14872 disp = get32s ();
14873 else
14874 {
14875 disp = get16 ();
14876 if ((disp & 0x8000) != 0)
14877 disp -= 0x10000;
14878 /* In 16bit mode, address is wrapped around at 64k within
14879 the same segment. Otherwise, a data16 prefix on a jump
14880 instruction means that the pc is masked to 16 bits after
14881 the displacement is added! */
14882 mask = 0xffff;
14883 if ((prefixes & PREFIX_DATA) == 0)
14884 segment = ((start_pc + (codep - start_codep))
14885 & ~((bfd_vma) 0xffff));
14886 }
14887 if (address_mode != mode_64bit
14888 || (isa64 == amd64 && !(rex & REX_W)))
14889 used_prefixes |= (prefixes & PREFIX_DATA);
14890 break;
14891 default:
14892 oappend (INTERNAL_DISASSEMBLER_ERROR);
14893 return;
14894 }
14895 disp = ((start_pc + (codep - start_codep) + disp) & mask) | segment;
14896 set_op (disp, 0);
14897 print_operand_value (scratchbuf, 1, disp);
14898 oappend (scratchbuf);
14899 }
14900
14901 static void
14902 OP_SEG (int bytemode, int sizeflag)
14903 {
14904 if (bytemode == w_mode)
14905 oappend (names_seg[modrm.reg]);
14906 else
14907 OP_E (modrm.mod == 3 ? bytemode : w_mode, sizeflag);
14908 }
14909
14910 static void
14911 OP_DIR (int dummy ATTRIBUTE_UNUSED, int sizeflag)
14912 {
14913 int seg, offset;
14914
14915 if (sizeflag & DFLAG)
14916 {
14917 offset = get32 ();
14918 seg = get16 ();
14919 }
14920 else
14921 {
14922 offset = get16 ();
14923 seg = get16 ();
14924 }
14925 used_prefixes |= (prefixes & PREFIX_DATA);
14926 if (intel_syntax)
14927 sprintf (scratchbuf, "0x%x:0x%x", seg, offset);
14928 else
14929 sprintf (scratchbuf, "$0x%x,$0x%x", seg, offset);
14930 oappend (scratchbuf);
14931 }
14932
14933 static void
14934 OP_OFF (int bytemode, int sizeflag)
14935 {
14936 bfd_vma off;
14937
14938 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
14939 intel_operand_size (bytemode, sizeflag);
14940 append_seg ();
14941
14942 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
14943 off = get32 ();
14944 else
14945 off = get16 ();
14946
14947 if (intel_syntax)
14948 {
14949 if (!active_seg_prefix)
14950 {
14951 oappend (names_seg[ds_reg - es_reg]);
14952 oappend (":");
14953 }
14954 }
14955 print_operand_value (scratchbuf, 1, off);
14956 oappend (scratchbuf);
14957 }
14958
14959 static void
14960 OP_OFF64 (int bytemode, int sizeflag)
14961 {
14962 bfd_vma off;
14963
14964 if (address_mode != mode_64bit
14965 || (prefixes & PREFIX_ADDR))
14966 {
14967 OP_OFF (bytemode, sizeflag);
14968 return;
14969 }
14970
14971 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
14972 intel_operand_size (bytemode, sizeflag);
14973 append_seg ();
14974
14975 off = get64 ();
14976
14977 if (intel_syntax)
14978 {
14979 if (!active_seg_prefix)
14980 {
14981 oappend (names_seg[ds_reg - es_reg]);
14982 oappend (":");
14983 }
14984 }
14985 print_operand_value (scratchbuf, 1, off);
14986 oappend (scratchbuf);
14987 }
14988
14989 static void
14990 ptr_reg (int code, int sizeflag)
14991 {
14992 const char *s;
14993
14994 *obufp++ = open_char;
14995 used_prefixes |= (prefixes & PREFIX_ADDR);
14996 if (address_mode == mode_64bit)
14997 {
14998 if (!(sizeflag & AFLAG))
14999 s = names32[code - eAX_reg];
15000 else
15001 s = names64[code - eAX_reg];
15002 }
15003 else if (sizeflag & AFLAG)
15004 s = names32[code - eAX_reg];
15005 else
15006 s = names16[code - eAX_reg];
15007 oappend (s);
15008 *obufp++ = close_char;
15009 *obufp = 0;
15010 }
15011
15012 static void
15013 OP_ESreg (int code, int sizeflag)
15014 {
15015 if (intel_syntax)
15016 {
15017 switch (codep[-1])
15018 {
15019 case 0x6d: /* insw/insl */
15020 intel_operand_size (z_mode, sizeflag);
15021 break;
15022 case 0xa5: /* movsw/movsl/movsq */
15023 case 0xa7: /* cmpsw/cmpsl/cmpsq */
15024 case 0xab: /* stosw/stosl */
15025 case 0xaf: /* scasw/scasl */
15026 intel_operand_size (v_mode, sizeflag);
15027 break;
15028 default:
15029 intel_operand_size (b_mode, sizeflag);
15030 }
15031 }
15032 oappend_maybe_intel ("%es:");
15033 ptr_reg (code, sizeflag);
15034 }
15035
15036 static void
15037 OP_DSreg (int code, int sizeflag)
15038 {
15039 if (intel_syntax)
15040 {
15041 switch (codep[-1])
15042 {
15043 case 0x6f: /* outsw/outsl */
15044 intel_operand_size (z_mode, sizeflag);
15045 break;
15046 case 0xa5: /* movsw/movsl/movsq */
15047 case 0xa7: /* cmpsw/cmpsl/cmpsq */
15048 case 0xad: /* lodsw/lodsl/lodsq */
15049 intel_operand_size (v_mode, sizeflag);
15050 break;
15051 default:
15052 intel_operand_size (b_mode, sizeflag);
15053 }
15054 }
15055 /* Set active_seg_prefix to PREFIX_DS if it is unset so that the
15056 default segment register DS is printed. */
15057 if (!active_seg_prefix)
15058 active_seg_prefix = PREFIX_DS;
15059 append_seg ();
15060 ptr_reg (code, sizeflag);
15061 }
15062
15063 static void
15064 OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15065 {
15066 int add;
15067 if (rex & REX_R)
15068 {
15069 USED_REX (REX_R);
15070 add = 8;
15071 }
15072 else if (address_mode != mode_64bit && (prefixes & PREFIX_LOCK))
15073 {
15074 all_prefixes[last_lock_prefix] = 0;
15075 used_prefixes |= PREFIX_LOCK;
15076 add = 8;
15077 }
15078 else
15079 add = 0;
15080 sprintf (scratchbuf, "%%cr%d", modrm.reg + add);
15081 oappend_maybe_intel (scratchbuf);
15082 }
15083
15084 static void
15085 OP_D (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15086 {
15087 int add;
15088 USED_REX (REX_R);
15089 if (rex & REX_R)
15090 add = 8;
15091 else
15092 add = 0;
15093 if (intel_syntax)
15094 sprintf (scratchbuf, "db%d", modrm.reg + add);
15095 else
15096 sprintf (scratchbuf, "%%db%d", modrm.reg + add);
15097 oappend (scratchbuf);
15098 }
15099
15100 static void
15101 OP_T (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15102 {
15103 sprintf (scratchbuf, "%%tr%d", modrm.reg);
15104 oappend_maybe_intel (scratchbuf);
15105 }
15106
15107 static void
15108 OP_R (int bytemode, int sizeflag)
15109 {
15110 /* Skip mod/rm byte. */
15111 MODRM_CHECK;
15112 codep++;
15113 OP_E_register (bytemode, sizeflag);
15114 }
15115
15116 static void
15117 OP_MMX (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15118 {
15119 int reg = modrm.reg;
15120 const char **names;
15121
15122 used_prefixes |= (prefixes & PREFIX_DATA);
15123 if (prefixes & PREFIX_DATA)
15124 {
15125 names = names_xmm;
15126 USED_REX (REX_R);
15127 if (rex & REX_R)
15128 reg += 8;
15129 }
15130 else
15131 names = names_mm;
15132 oappend (names[reg]);
15133 }
15134
15135 static void
15136 OP_XMM (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
15137 {
15138 int reg = modrm.reg;
15139 const char **names;
15140
15141 USED_REX (REX_R);
15142 if (rex & REX_R)
15143 reg += 8;
15144 if (vex.evex)
15145 {
15146 if (!vex.r)
15147 reg += 16;
15148 }
15149
15150 if (need_vex
15151 && bytemode != xmm_mode
15152 && bytemode != xmmq_mode
15153 && bytemode != evex_half_bcst_xmmq_mode
15154 && bytemode != ymm_mode
15155 && bytemode != scalar_mode)
15156 {
15157 switch (vex.length)
15158 {
15159 case 128:
15160 names = names_xmm;
15161 break;
15162 case 256:
15163 if (vex.w
15164 || (bytemode != vex_vsib_q_w_dq_mode
15165 && bytemode != vex_vsib_q_w_d_mode))
15166 names = names_ymm;
15167 else
15168 names = names_xmm;
15169 break;
15170 case 512:
15171 names = names_zmm;
15172 break;
15173 default:
15174 abort ();
15175 }
15176 }
15177 else if (bytemode == xmmq_mode
15178 || bytemode == evex_half_bcst_xmmq_mode)
15179 {
15180 switch (vex.length)
15181 {
15182 case 128:
15183 case 256:
15184 names = names_xmm;
15185 break;
15186 case 512:
15187 names = names_ymm;
15188 break;
15189 default:
15190 abort ();
15191 }
15192 }
15193 else if (bytemode == ymm_mode)
15194 names = names_ymm;
15195 else
15196 names = names_xmm;
15197 oappend (names[reg]);
15198 }
15199
15200 static void
15201 OP_EM (int bytemode, int sizeflag)
15202 {
15203 int reg;
15204 const char **names;
15205
15206 if (modrm.mod != 3)
15207 {
15208 if (intel_syntax
15209 && (bytemode == v_mode || bytemode == v_swap_mode))
15210 {
15211 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
15212 used_prefixes |= (prefixes & PREFIX_DATA);
15213 }
15214 OP_E (bytemode, sizeflag);
15215 return;
15216 }
15217
15218 if ((sizeflag & SUFFIX_ALWAYS) && bytemode == v_swap_mode)
15219 swap_operand ();
15220
15221 /* Skip mod/rm byte. */
15222 MODRM_CHECK;
15223 codep++;
15224 used_prefixes |= (prefixes & PREFIX_DATA);
15225 reg = modrm.rm;
15226 if (prefixes & PREFIX_DATA)
15227 {
15228 names = names_xmm;
15229 USED_REX (REX_B);
15230 if (rex & REX_B)
15231 reg += 8;
15232 }
15233 else
15234 names = names_mm;
15235 oappend (names[reg]);
15236 }
15237
15238 /* cvt* are the only instructions in sse2 which have
15239 both SSE and MMX operands and also have 0x66 prefix
15240 in their opcode. 0x66 was originally used to differentiate
15241 between SSE and MMX instruction(operands). So we have to handle the
15242 cvt* separately using OP_EMC and OP_MXC */
15243 static void
15244 OP_EMC (int bytemode, int sizeflag)
15245 {
15246 if (modrm.mod != 3)
15247 {
15248 if (intel_syntax && bytemode == v_mode)
15249 {
15250 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
15251 used_prefixes |= (prefixes & PREFIX_DATA);
15252 }
15253 OP_E (bytemode, sizeflag);
15254 return;
15255 }
15256
15257 /* Skip mod/rm byte. */
15258 MODRM_CHECK;
15259 codep++;
15260 used_prefixes |= (prefixes & PREFIX_DATA);
15261 oappend (names_mm[modrm.rm]);
15262 }
15263
15264 static void
15265 OP_MXC (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15266 {
15267 used_prefixes |= (prefixes & PREFIX_DATA);
15268 oappend (names_mm[modrm.reg]);
15269 }
15270
15271 static void
15272 OP_EX (int bytemode, int sizeflag)
15273 {
15274 int reg;
15275 const char **names;
15276
15277 /* Skip mod/rm byte. */
15278 MODRM_CHECK;
15279 codep++;
15280
15281 if (modrm.mod != 3)
15282 {
15283 OP_E_memory (bytemode, sizeflag);
15284 return;
15285 }
15286
15287 reg = modrm.rm;
15288 USED_REX (REX_B);
15289 if (rex & REX_B)
15290 reg += 8;
15291 if (vex.evex)
15292 {
15293 USED_REX (REX_X);
15294 if ((rex & REX_X))
15295 reg += 16;
15296 }
15297
15298 if ((sizeflag & SUFFIX_ALWAYS)
15299 && (bytemode == x_swap_mode
15300 || bytemode == d_swap_mode
15301 || bytemode == d_scalar_swap_mode
15302 || bytemode == q_swap_mode
15303 || bytemode == q_scalar_swap_mode))
15304 swap_operand ();
15305
15306 if (need_vex
15307 && bytemode != xmm_mode
15308 && bytemode != xmmdw_mode
15309 && bytemode != xmmqd_mode
15310 && bytemode != xmm_mb_mode
15311 && bytemode != xmm_mw_mode
15312 && bytemode != xmm_md_mode
15313 && bytemode != xmm_mq_mode
15314 && bytemode != xmm_mdq_mode
15315 && bytemode != xmmq_mode
15316 && bytemode != evex_half_bcst_xmmq_mode
15317 && bytemode != ymm_mode
15318 && bytemode != d_scalar_mode
15319 && bytemode != d_scalar_swap_mode
15320 && bytemode != q_scalar_mode
15321 && bytemode != q_scalar_swap_mode
15322 && bytemode != vex_scalar_w_dq_mode)
15323 {
15324 switch (vex.length)
15325 {
15326 case 128:
15327 names = names_xmm;
15328 break;
15329 case 256:
15330 names = names_ymm;
15331 break;
15332 case 512:
15333 names = names_zmm;
15334 break;
15335 default:
15336 abort ();
15337 }
15338 }
15339 else if (bytemode == xmmq_mode
15340 || bytemode == evex_half_bcst_xmmq_mode)
15341 {
15342 switch (vex.length)
15343 {
15344 case 128:
15345 case 256:
15346 names = names_xmm;
15347 break;
15348 case 512:
15349 names = names_ymm;
15350 break;
15351 default:
15352 abort ();
15353 }
15354 }
15355 else if (bytemode == ymm_mode)
15356 names = names_ymm;
15357 else
15358 names = names_xmm;
15359 oappend (names[reg]);
15360 }
15361
15362 static void
15363 OP_MS (int bytemode, int sizeflag)
15364 {
15365 if (modrm.mod == 3)
15366 OP_EM (bytemode, sizeflag);
15367 else
15368 BadOp ();
15369 }
15370
15371 static void
15372 OP_XS (int bytemode, int sizeflag)
15373 {
15374 if (modrm.mod == 3)
15375 OP_EX (bytemode, sizeflag);
15376 else
15377 BadOp ();
15378 }
15379
15380 static void
15381 OP_M (int bytemode, int sizeflag)
15382 {
15383 if (modrm.mod == 3)
15384 /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
15385 BadOp ();
15386 else
15387 OP_E (bytemode, sizeflag);
15388 }
15389
15390 static void
15391 OP_0f07 (int bytemode, int sizeflag)
15392 {
15393 if (modrm.mod != 3 || modrm.rm != 0)
15394 BadOp ();
15395 else
15396 OP_E (bytemode, sizeflag);
15397 }
15398
15399 /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
15400 32bit mode and "xchg %rax,%rax" in 64bit mode. */
15401
15402 static void
15403 NOP_Fixup1 (int bytemode, int sizeflag)
15404 {
15405 if ((prefixes & PREFIX_DATA) != 0
15406 || (rex != 0
15407 && rex != 0x48
15408 && address_mode == mode_64bit))
15409 OP_REG (bytemode, sizeflag);
15410 else
15411 strcpy (obuf, "nop");
15412 }
15413
15414 static void
15415 NOP_Fixup2 (int bytemode, int sizeflag)
15416 {
15417 if ((prefixes & PREFIX_DATA) != 0
15418 || (rex != 0
15419 && rex != 0x48
15420 && address_mode == mode_64bit))
15421 OP_IMREG (bytemode, sizeflag);
15422 }
15423
15424 static const char *const Suffix3DNow[] = {
15425 /* 00 */ NULL, NULL, NULL, NULL,
15426 /* 04 */ NULL, NULL, NULL, NULL,
15427 /* 08 */ NULL, NULL, NULL, NULL,
15428 /* 0C */ "pi2fw", "pi2fd", NULL, NULL,
15429 /* 10 */ NULL, NULL, NULL, NULL,
15430 /* 14 */ NULL, NULL, NULL, NULL,
15431 /* 18 */ NULL, NULL, NULL, NULL,
15432 /* 1C */ "pf2iw", "pf2id", NULL, NULL,
15433 /* 20 */ NULL, NULL, NULL, NULL,
15434 /* 24 */ NULL, NULL, NULL, NULL,
15435 /* 28 */ NULL, NULL, NULL, NULL,
15436 /* 2C */ NULL, NULL, NULL, NULL,
15437 /* 30 */ NULL, NULL, NULL, NULL,
15438 /* 34 */ NULL, NULL, NULL, NULL,
15439 /* 38 */ NULL, NULL, NULL, NULL,
15440 /* 3C */ NULL, NULL, NULL, NULL,
15441 /* 40 */ NULL, NULL, NULL, NULL,
15442 /* 44 */ NULL, NULL, NULL, NULL,
15443 /* 48 */ NULL, NULL, NULL, NULL,
15444 /* 4C */ NULL, NULL, NULL, NULL,
15445 /* 50 */ NULL, NULL, NULL, NULL,
15446 /* 54 */ NULL, NULL, NULL, NULL,
15447 /* 58 */ NULL, NULL, NULL, NULL,
15448 /* 5C */ NULL, NULL, NULL, NULL,
15449 /* 60 */ NULL, NULL, NULL, NULL,
15450 /* 64 */ NULL, NULL, NULL, NULL,
15451 /* 68 */ NULL, NULL, NULL, NULL,
15452 /* 6C */ NULL, NULL, NULL, NULL,
15453 /* 70 */ NULL, NULL, NULL, NULL,
15454 /* 74 */ NULL, NULL, NULL, NULL,
15455 /* 78 */ NULL, NULL, NULL, NULL,
15456 /* 7C */ NULL, NULL, NULL, NULL,
15457 /* 80 */ NULL, NULL, NULL, NULL,
15458 /* 84 */ NULL, NULL, NULL, NULL,
15459 /* 88 */ NULL, NULL, "pfnacc", NULL,
15460 /* 8C */ NULL, NULL, "pfpnacc", NULL,
15461 /* 90 */ "pfcmpge", NULL, NULL, NULL,
15462 /* 94 */ "pfmin", NULL, "pfrcp", "pfrsqrt",
15463 /* 98 */ NULL, NULL, "pfsub", NULL,
15464 /* 9C */ NULL, NULL, "pfadd", NULL,
15465 /* A0 */ "pfcmpgt", NULL, NULL, NULL,
15466 /* A4 */ "pfmax", NULL, "pfrcpit1", "pfrsqit1",
15467 /* A8 */ NULL, NULL, "pfsubr", NULL,
15468 /* AC */ NULL, NULL, "pfacc", NULL,
15469 /* B0 */ "pfcmpeq", NULL, NULL, NULL,
15470 /* B4 */ "pfmul", NULL, "pfrcpit2", "pmulhrw",
15471 /* B8 */ NULL, NULL, NULL, "pswapd",
15472 /* BC */ NULL, NULL, NULL, "pavgusb",
15473 /* C0 */ NULL, NULL, NULL, NULL,
15474 /* C4 */ NULL, NULL, NULL, NULL,
15475 /* C8 */ NULL, NULL, NULL, NULL,
15476 /* CC */ NULL, NULL, NULL, NULL,
15477 /* D0 */ NULL, NULL, NULL, NULL,
15478 /* D4 */ NULL, NULL, NULL, NULL,
15479 /* D8 */ NULL, NULL, NULL, NULL,
15480 /* DC */ NULL, NULL, NULL, NULL,
15481 /* E0 */ NULL, NULL, NULL, NULL,
15482 /* E4 */ NULL, NULL, NULL, NULL,
15483 /* E8 */ NULL, NULL, NULL, NULL,
15484 /* EC */ NULL, NULL, NULL, NULL,
15485 /* F0 */ NULL, NULL, NULL, NULL,
15486 /* F4 */ NULL, NULL, NULL, NULL,
15487 /* F8 */ NULL, NULL, NULL, NULL,
15488 /* FC */ NULL, NULL, NULL, NULL,
15489 };
15490
15491 static void
15492 OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15493 {
15494 const char *mnemonic;
15495
15496 FETCH_DATA (the_info, codep + 1);
15497 /* AMD 3DNow! instructions are specified by an opcode suffix in the
15498 place where an 8-bit immediate would normally go. ie. the last
15499 byte of the instruction. */
15500 obufp = mnemonicendp;
15501 mnemonic = Suffix3DNow[*codep++ & 0xff];
15502 if (mnemonic)
15503 oappend (mnemonic);
15504 else
15505 {
15506 /* Since a variable sized modrm/sib chunk is between the start
15507 of the opcode (0x0f0f) and the opcode suffix, we need to do
15508 all the modrm processing first, and don't know until now that
15509 we have a bad opcode. This necessitates some cleaning up. */
15510 op_out[0][0] = '\0';
15511 op_out[1][0] = '\0';
15512 BadOp ();
15513 }
15514 mnemonicendp = obufp;
15515 }
15516
15517 static struct op simd_cmp_op[] =
15518 {
15519 { STRING_COMMA_LEN ("eq") },
15520 { STRING_COMMA_LEN ("lt") },
15521 { STRING_COMMA_LEN ("le") },
15522 { STRING_COMMA_LEN ("unord") },
15523 { STRING_COMMA_LEN ("neq") },
15524 { STRING_COMMA_LEN ("nlt") },
15525 { STRING_COMMA_LEN ("nle") },
15526 { STRING_COMMA_LEN ("ord") }
15527 };
15528
15529 static void
15530 CMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15531 {
15532 unsigned int cmp_type;
15533
15534 FETCH_DATA (the_info, codep + 1);
15535 cmp_type = *codep++ & 0xff;
15536 if (cmp_type < ARRAY_SIZE (simd_cmp_op))
15537 {
15538 char suffix [3];
15539 char *p = mnemonicendp - 2;
15540 suffix[0] = p[0];
15541 suffix[1] = p[1];
15542 suffix[2] = '\0';
15543 sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
15544 mnemonicendp += simd_cmp_op[cmp_type].len;
15545 }
15546 else
15547 {
15548 /* We have a reserved extension byte. Output it directly. */
15549 scratchbuf[0] = '$';
15550 print_operand_value (scratchbuf + 1, 1, cmp_type);
15551 oappend_maybe_intel (scratchbuf);
15552 scratchbuf[0] = '\0';
15553 }
15554 }
15555
15556 static void
15557 OP_Mwaitx (int bytemode ATTRIBUTE_UNUSED,
15558 int sizeflag ATTRIBUTE_UNUSED)
15559 {
15560 /* mwaitx %eax,%ecx,%ebx */
15561 if (!intel_syntax)
15562 {
15563 const char **names = (address_mode == mode_64bit
15564 ? names64 : names32);
15565 strcpy (op_out[0], names[0]);
15566 strcpy (op_out[1], names[1]);
15567 strcpy (op_out[2], names[3]);
15568 two_source_ops = 1;
15569 }
15570 /* Skip mod/rm byte. */
15571 MODRM_CHECK;
15572 codep++;
15573 }
15574
15575 static void
15576 OP_Mwait (int bytemode ATTRIBUTE_UNUSED,
15577 int sizeflag ATTRIBUTE_UNUSED)
15578 {
15579 /* mwait %eax,%ecx */
15580 if (!intel_syntax)
15581 {
15582 const char **names = (address_mode == mode_64bit
15583 ? names64 : names32);
15584 strcpy (op_out[0], names[0]);
15585 strcpy (op_out[1], names[1]);
15586 two_source_ops = 1;
15587 }
15588 /* Skip mod/rm byte. */
15589 MODRM_CHECK;
15590 codep++;
15591 }
15592
15593 static void
15594 OP_Monitor (int bytemode ATTRIBUTE_UNUSED,
15595 int sizeflag ATTRIBUTE_UNUSED)
15596 {
15597 /* monitor %eax,%ecx,%edx" */
15598 if (!intel_syntax)
15599 {
15600 const char **op1_names;
15601 const char **names = (address_mode == mode_64bit
15602 ? names64 : names32);
15603
15604 if (!(prefixes & PREFIX_ADDR))
15605 op1_names = (address_mode == mode_16bit
15606 ? names16 : names);
15607 else
15608 {
15609 /* Remove "addr16/addr32". */
15610 all_prefixes[last_addr_prefix] = 0;
15611 op1_names = (address_mode != mode_32bit
15612 ? names32 : names16);
15613 used_prefixes |= PREFIX_ADDR;
15614 }
15615 strcpy (op_out[0], op1_names[0]);
15616 strcpy (op_out[1], names[1]);
15617 strcpy (op_out[2], names[2]);
15618 two_source_ops = 1;
15619 }
15620 /* Skip mod/rm byte. */
15621 MODRM_CHECK;
15622 codep++;
15623 }
15624
15625 static void
15626 BadOp (void)
15627 {
15628 /* Throw away prefixes and 1st. opcode byte. */
15629 codep = insn_codep + 1;
15630 oappend ("(bad)");
15631 }
15632
15633 static void
15634 REP_Fixup (int bytemode, int sizeflag)
15635 {
15636 /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
15637 lods and stos. */
15638 if (prefixes & PREFIX_REPZ)
15639 all_prefixes[last_repz_prefix] = REP_PREFIX;
15640
15641 switch (bytemode)
15642 {
15643 case al_reg:
15644 case eAX_reg:
15645 case indir_dx_reg:
15646 OP_IMREG (bytemode, sizeflag);
15647 break;
15648 case eDI_reg:
15649 OP_ESreg (bytemode, sizeflag);
15650 break;
15651 case eSI_reg:
15652 OP_DSreg (bytemode, sizeflag);
15653 break;
15654 default:
15655 abort ();
15656 break;
15657 }
15658 }
15659
15660 /* For BND-prefixed instructions 0xF2 prefix should be displayed as
15661 "bnd". */
15662
15663 static void
15664 BND_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15665 {
15666 if (prefixes & PREFIX_REPNZ)
15667 all_prefixes[last_repnz_prefix] = BND_PREFIX;
15668 }
15669
15670 /* For NOTRACK-prefixed instructions, 0x3E prefix should be displayed as
15671 "notrack". */
15672
15673 static void
15674 NOTRACK_Fixup (int bytemode ATTRIBUTE_UNUSED,
15675 int sizeflag ATTRIBUTE_UNUSED)
15676 {
15677 if (active_seg_prefix == PREFIX_DS
15678 && (address_mode != mode_64bit || last_data_prefix < 0))
15679 {
15680 /* NOTRACK prefix is only valid on indirect branch instructions.
15681 NB: DATA prefix is unsupported for Intel64. */
15682 active_seg_prefix = 0;
15683 all_prefixes[last_seg_prefix] = NOTRACK_PREFIX;
15684 }
15685 }
15686
15687 /* Similar to OP_E. But the 0xf2/0xf3 prefixes should be displayed as
15688 "xacquire"/"xrelease" for memory operand if there is a LOCK prefix.
15689 */
15690
15691 static void
15692 HLE_Fixup1 (int bytemode, int sizeflag)
15693 {
15694 if (modrm.mod != 3
15695 && (prefixes & PREFIX_LOCK) != 0)
15696 {
15697 if (prefixes & PREFIX_REPZ)
15698 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
15699 if (prefixes & PREFIX_REPNZ)
15700 all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
15701 }
15702
15703 OP_E (bytemode, sizeflag);
15704 }
15705
15706 /* Similar to OP_E. But the 0xf2/0xf3 prefixes should be displayed as
15707 "xacquire"/"xrelease" for memory operand. No check for LOCK prefix.
15708 */
15709
15710 static void
15711 HLE_Fixup2 (int bytemode, int sizeflag)
15712 {
15713 if (modrm.mod != 3)
15714 {
15715 if (prefixes & PREFIX_REPZ)
15716 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
15717 if (prefixes & PREFIX_REPNZ)
15718 all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
15719 }
15720
15721 OP_E (bytemode, sizeflag);
15722 }
15723
15724 /* Similar to OP_E. But the 0xf3 prefixes should be displayed as
15725 "xrelease" for memory operand. No check for LOCK prefix. */
15726
15727 static void
15728 HLE_Fixup3 (int bytemode, int sizeflag)
15729 {
15730 if (modrm.mod != 3
15731 && last_repz_prefix > last_repnz_prefix
15732 && (prefixes & PREFIX_REPZ) != 0)
15733 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
15734
15735 OP_E (bytemode, sizeflag);
15736 }
15737
15738 static void
15739 CMPXCHG8B_Fixup (int bytemode, int sizeflag)
15740 {
15741 USED_REX (REX_W);
15742 if (rex & REX_W)
15743 {
15744 /* Change cmpxchg8b to cmpxchg16b. */
15745 char *p = mnemonicendp - 2;
15746 mnemonicendp = stpcpy (p, "16b");
15747 bytemode = o_mode;
15748 }
15749 else if ((prefixes & PREFIX_LOCK) != 0)
15750 {
15751 if (prefixes & PREFIX_REPZ)
15752 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
15753 if (prefixes & PREFIX_REPNZ)
15754 all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
15755 }
15756
15757 OP_M (bytemode, sizeflag);
15758 }
15759
15760 static void
15761 XMM_Fixup (int reg, int sizeflag ATTRIBUTE_UNUSED)
15762 {
15763 const char **names;
15764
15765 if (need_vex)
15766 {
15767 switch (vex.length)
15768 {
15769 case 128:
15770 names = names_xmm;
15771 break;
15772 case 256:
15773 names = names_ymm;
15774 break;
15775 default:
15776 abort ();
15777 }
15778 }
15779 else
15780 names = names_xmm;
15781 oappend (names[reg]);
15782 }
15783
15784 static void
15785 CRC32_Fixup (int bytemode, int sizeflag)
15786 {
15787 /* Add proper suffix to "crc32". */
15788 char *p = mnemonicendp;
15789
15790 switch (bytemode)
15791 {
15792 case b_mode:
15793 if (intel_syntax)
15794 goto skip;
15795
15796 *p++ = 'b';
15797 break;
15798 case v_mode:
15799 if (intel_syntax)
15800 goto skip;
15801
15802 USED_REX (REX_W);
15803 if (rex & REX_W)
15804 *p++ = 'q';
15805 else
15806 {
15807 if (sizeflag & DFLAG)
15808 *p++ = 'l';
15809 else
15810 *p++ = 'w';
15811 used_prefixes |= (prefixes & PREFIX_DATA);
15812 }
15813 break;
15814 default:
15815 oappend (INTERNAL_DISASSEMBLER_ERROR);
15816 break;
15817 }
15818 mnemonicendp = p;
15819 *p = '\0';
15820
15821 skip:
15822 if (modrm.mod == 3)
15823 {
15824 int add;
15825
15826 /* Skip mod/rm byte. */
15827 MODRM_CHECK;
15828 codep++;
15829
15830 USED_REX (REX_B);
15831 add = (rex & REX_B) ? 8 : 0;
15832 if (bytemode == b_mode)
15833 {
15834 USED_REX (0);
15835 if (rex)
15836 oappend (names8rex[modrm.rm + add]);
15837 else
15838 oappend (names8[modrm.rm + add]);
15839 }
15840 else
15841 {
15842 USED_REX (REX_W);
15843 if (rex & REX_W)
15844 oappend (names64[modrm.rm + add]);
15845 else if ((prefixes & PREFIX_DATA))
15846 oappend (names16[modrm.rm + add]);
15847 else
15848 oappend (names32[modrm.rm + add]);
15849 }
15850 }
15851 else
15852 OP_E (bytemode, sizeflag);
15853 }
15854
15855 static void
15856 FXSAVE_Fixup (int bytemode, int sizeflag)
15857 {
15858 /* Add proper suffix to "fxsave" and "fxrstor". */
15859 USED_REX (REX_W);
15860 if (rex & REX_W)
15861 {
15862 char *p = mnemonicendp;
15863 *p++ = '6';
15864 *p++ = '4';
15865 *p = '\0';
15866 mnemonicendp = p;
15867 }
15868 OP_M (bytemode, sizeflag);
15869 }
15870
15871 static void
15872 PCMPESTR_Fixup (int bytemode, int sizeflag)
15873 {
15874 /* Add proper suffix to "{,v}pcmpestr{i,m}". */
15875 if (!intel_syntax)
15876 {
15877 char *p = mnemonicendp;
15878
15879 USED_REX (REX_W);
15880 if (rex & REX_W)
15881 *p++ = 'q';
15882 else if (sizeflag & SUFFIX_ALWAYS)
15883 *p++ = 'l';
15884
15885 *p = '\0';
15886 mnemonicendp = p;
15887 }
15888
15889 OP_EX (bytemode, sizeflag);
15890 }
15891
15892 /* Display the destination register operand for instructions with
15893 VEX. */
15894
15895 static void
15896 OP_VEX (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
15897 {
15898 int reg;
15899 const char **names;
15900
15901 if (!need_vex)
15902 abort ();
15903
15904 if (!need_vex_reg)
15905 return;
15906
15907 reg = vex.register_specifier;
15908 if (address_mode != mode_64bit)
15909 reg &= 7;
15910 else if (vex.evex && !vex.v)
15911 reg += 16;
15912
15913 if (bytemode == vex_scalar_mode)
15914 {
15915 oappend (names_xmm[reg]);
15916 return;
15917 }
15918
15919 switch (vex.length)
15920 {
15921 case 128:
15922 switch (bytemode)
15923 {
15924 case vex_mode:
15925 case vex128_mode:
15926 case vex_vsib_q_w_dq_mode:
15927 case vex_vsib_q_w_d_mode:
15928 names = names_xmm;
15929 break;
15930 case dq_mode:
15931 if (rex & REX_W)
15932 names = names64;
15933 else
15934 names = names32;
15935 break;
15936 case mask_bd_mode:
15937 case mask_mode:
15938 if (reg > 0x7)
15939 {
15940 oappend ("(bad)");
15941 return;
15942 }
15943 names = names_mask;
15944 break;
15945 default:
15946 abort ();
15947 return;
15948 }
15949 break;
15950 case 256:
15951 switch (bytemode)
15952 {
15953 case vex_mode:
15954 case vex256_mode:
15955 names = names_ymm;
15956 break;
15957 case vex_vsib_q_w_dq_mode:
15958 case vex_vsib_q_w_d_mode:
15959 names = vex.w ? names_ymm : names_xmm;
15960 break;
15961 case mask_bd_mode:
15962 case mask_mode:
15963 if (reg > 0x7)
15964 {
15965 oappend ("(bad)");
15966 return;
15967 }
15968 names = names_mask;
15969 break;
15970 default:
15971 /* See PR binutils/20893 for a reproducer. */
15972 oappend ("(bad)");
15973 return;
15974 }
15975 break;
15976 case 512:
15977 names = names_zmm;
15978 break;
15979 default:
15980 abort ();
15981 break;
15982 }
15983 oappend (names[reg]);
15984 }
15985
15986 /* Get the VEX immediate byte without moving codep. */
15987
15988 static unsigned char
15989 get_vex_imm8 (int sizeflag, int opnum)
15990 {
15991 int bytes_before_imm = 0;
15992
15993 if (modrm.mod != 3)
15994 {
15995 /* There are SIB/displacement bytes. */
15996 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
15997 {
15998 /* 32/64 bit address mode */
15999 int base = modrm.rm;
16000
16001 /* Check SIB byte. */
16002 if (base == 4)
16003 {
16004 FETCH_DATA (the_info, codep + 1);
16005 base = *codep & 7;
16006 /* When decoding the third source, don't increase
16007 bytes_before_imm as this has already been incremented
16008 by one in OP_E_memory while decoding the second
16009 source operand. */
16010 if (opnum == 0)
16011 bytes_before_imm++;
16012 }
16013
16014 /* Don't increase bytes_before_imm when decoding the third source,
16015 it has already been incremented by OP_E_memory while decoding
16016 the second source operand. */
16017 if (opnum == 0)
16018 {
16019 switch (modrm.mod)
16020 {
16021 case 0:
16022 /* When modrm.rm == 5 or modrm.rm == 4 and base in
16023 SIB == 5, there is a 4 byte displacement. */
16024 if (base != 5)
16025 /* No displacement. */
16026 break;
16027 /* Fall through. */
16028 case 2:
16029 /* 4 byte displacement. */
16030 bytes_before_imm += 4;
16031 break;
16032 case 1:
16033 /* 1 byte displacement. */
16034 bytes_before_imm++;
16035 break;
16036 }
16037 }
16038 }
16039 else
16040 {
16041 /* 16 bit address mode */
16042 /* Don't increase bytes_before_imm when decoding the third source,
16043 it has already been incremented by OP_E_memory while decoding
16044 the second source operand. */
16045 if (opnum == 0)
16046 {
16047 switch (modrm.mod)
16048 {
16049 case 0:
16050 /* When modrm.rm == 6, there is a 2 byte displacement. */
16051 if (modrm.rm != 6)
16052 /* No displacement. */
16053 break;
16054 /* Fall through. */
16055 case 2:
16056 /* 2 byte displacement. */
16057 bytes_before_imm += 2;
16058 break;
16059 case 1:
16060 /* 1 byte displacement: when decoding the third source,
16061 don't increase bytes_before_imm as this has already
16062 been incremented by one in OP_E_memory while decoding
16063 the second source operand. */
16064 if (opnum == 0)
16065 bytes_before_imm++;
16066
16067 break;
16068 }
16069 }
16070 }
16071 }
16072
16073 FETCH_DATA (the_info, codep + bytes_before_imm + 1);
16074 return codep [bytes_before_imm];
16075 }
16076
16077 static void
16078 OP_EX_VexReg (int bytemode, int sizeflag, int reg)
16079 {
16080 const char **names;
16081
16082 if (reg == -1 && modrm.mod != 3)
16083 {
16084 OP_E_memory (bytemode, sizeflag);
16085 return;
16086 }
16087 else
16088 {
16089 if (reg == -1)
16090 {
16091 reg = modrm.rm;
16092 USED_REX (REX_B);
16093 if (rex & REX_B)
16094 reg += 8;
16095 }
16096 if (address_mode != mode_64bit)
16097 reg &= 7;
16098 }
16099
16100 switch (vex.length)
16101 {
16102 case 128:
16103 names = names_xmm;
16104 break;
16105 case 256:
16106 names = names_ymm;
16107 break;
16108 default:
16109 abort ();
16110 }
16111 oappend (names[reg]);
16112 }
16113
16114 static void
16115 OP_EX_VexImmW (int bytemode, int sizeflag)
16116 {
16117 int reg = -1;
16118 static unsigned char vex_imm8;
16119
16120 if (vex_w_done == 0)
16121 {
16122 vex_w_done = 1;
16123
16124 /* Skip mod/rm byte. */
16125 MODRM_CHECK;
16126 codep++;
16127
16128 vex_imm8 = get_vex_imm8 (sizeflag, 0);
16129
16130 if (vex.w)
16131 reg = vex_imm8 >> 4;
16132
16133 OP_EX_VexReg (bytemode, sizeflag, reg);
16134 }
16135 else if (vex_w_done == 1)
16136 {
16137 vex_w_done = 2;
16138
16139 if (!vex.w)
16140 reg = vex_imm8 >> 4;
16141
16142 OP_EX_VexReg (bytemode, sizeflag, reg);
16143 }
16144 else
16145 {
16146 /* Output the imm8 directly. */
16147 scratchbuf[0] = '$';
16148 print_operand_value (scratchbuf + 1, 1, vex_imm8 & 0xf);
16149 oappend_maybe_intel (scratchbuf);
16150 scratchbuf[0] = '\0';
16151 codep++;
16152 }
16153 }
16154
16155 static void
16156 OP_Vex_2src (int bytemode, int sizeflag)
16157 {
16158 if (modrm.mod == 3)
16159 {
16160 int reg = modrm.rm;
16161 USED_REX (REX_B);
16162 if (rex & REX_B)
16163 reg += 8;
16164 oappend (names_xmm[reg]);
16165 }
16166 else
16167 {
16168 if (intel_syntax
16169 && (bytemode == v_mode || bytemode == v_swap_mode))
16170 {
16171 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
16172 used_prefixes |= (prefixes & PREFIX_DATA);
16173 }
16174 OP_E (bytemode, sizeflag);
16175 }
16176 }
16177
16178 static void
16179 OP_Vex_2src_1 (int bytemode, int sizeflag)
16180 {
16181 if (modrm.mod == 3)
16182 {
16183 /* Skip mod/rm byte. */
16184 MODRM_CHECK;
16185 codep++;
16186 }
16187
16188 if (vex.w)
16189 {
16190 unsigned int reg = vex.register_specifier;
16191
16192 if (address_mode != mode_64bit)
16193 reg &= 7;
16194 oappend (names_xmm[reg]);
16195 }
16196 else
16197 OP_Vex_2src (bytemode, sizeflag);
16198 }
16199
16200 static void
16201 OP_Vex_2src_2 (int bytemode, int sizeflag)
16202 {
16203 if (vex.w)
16204 OP_Vex_2src (bytemode, sizeflag);
16205 else
16206 {
16207 unsigned int reg = vex.register_specifier;
16208
16209 if (address_mode != mode_64bit)
16210 reg &= 7;
16211 oappend (names_xmm[reg]);
16212 }
16213 }
16214
16215 static void
16216 OP_EX_VexW (int bytemode, int sizeflag)
16217 {
16218 int reg = -1;
16219
16220 if (!vex_w_done)
16221 {
16222 /* Skip mod/rm byte. */
16223 MODRM_CHECK;
16224 codep++;
16225
16226 if (vex.w)
16227 reg = get_vex_imm8 (sizeflag, 0) >> 4;
16228 }
16229 else
16230 {
16231 if (!vex.w)
16232 reg = get_vex_imm8 (sizeflag, 1) >> 4;
16233 }
16234
16235 OP_EX_VexReg (bytemode, sizeflag, reg);
16236
16237 if (vex_w_done)
16238 codep++;
16239 vex_w_done = 1;
16240 }
16241
16242 static void
16243 OP_REG_VexI4 (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
16244 {
16245 int reg;
16246 const char **names;
16247
16248 FETCH_DATA (the_info, codep + 1);
16249 reg = *codep++;
16250
16251 if (bytemode != x_mode)
16252 abort ();
16253
16254 reg >>= 4;
16255 if (address_mode != mode_64bit)
16256 reg &= 7;
16257
16258 switch (vex.length)
16259 {
16260 case 128:
16261 names = names_xmm;
16262 break;
16263 case 256:
16264 names = names_ymm;
16265 break;
16266 default:
16267 abort ();
16268 }
16269 oappend (names[reg]);
16270 }
16271
16272 static void
16273 OP_XMM_VexW (int bytemode, int sizeflag)
16274 {
16275 /* Turn off the REX.W bit since it is used for swapping operands
16276 now. */
16277 rex &= ~REX_W;
16278 OP_XMM (bytemode, sizeflag);
16279 }
16280
16281 static void
16282 OP_EX_Vex (int bytemode, int sizeflag)
16283 {
16284 if (modrm.mod != 3)
16285 {
16286 if (vex.register_specifier != 0)
16287 BadOp ();
16288 need_vex_reg = 0;
16289 }
16290 OP_EX (bytemode, sizeflag);
16291 }
16292
16293 static void
16294 OP_XMM_Vex (int bytemode, int sizeflag)
16295 {
16296 if (modrm.mod != 3)
16297 {
16298 if (vex.register_specifier != 0)
16299 BadOp ();
16300 need_vex_reg = 0;
16301 }
16302 OP_XMM (bytemode, sizeflag);
16303 }
16304
16305 static struct op vex_cmp_op[] =
16306 {
16307 { STRING_COMMA_LEN ("eq") },
16308 { STRING_COMMA_LEN ("lt") },
16309 { STRING_COMMA_LEN ("le") },
16310 { STRING_COMMA_LEN ("unord") },
16311 { STRING_COMMA_LEN ("neq") },
16312 { STRING_COMMA_LEN ("nlt") },
16313 { STRING_COMMA_LEN ("nle") },
16314 { STRING_COMMA_LEN ("ord") },
16315 { STRING_COMMA_LEN ("eq_uq") },
16316 { STRING_COMMA_LEN ("nge") },
16317 { STRING_COMMA_LEN ("ngt") },
16318 { STRING_COMMA_LEN ("false") },
16319 { STRING_COMMA_LEN ("neq_oq") },
16320 { STRING_COMMA_LEN ("ge") },
16321 { STRING_COMMA_LEN ("gt") },
16322 { STRING_COMMA_LEN ("true") },
16323 { STRING_COMMA_LEN ("eq_os") },
16324 { STRING_COMMA_LEN ("lt_oq") },
16325 { STRING_COMMA_LEN ("le_oq") },
16326 { STRING_COMMA_LEN ("unord_s") },
16327 { STRING_COMMA_LEN ("neq_us") },
16328 { STRING_COMMA_LEN ("nlt_uq") },
16329 { STRING_COMMA_LEN ("nle_uq") },
16330 { STRING_COMMA_LEN ("ord_s") },
16331 { STRING_COMMA_LEN ("eq_us") },
16332 { STRING_COMMA_LEN ("nge_uq") },
16333 { STRING_COMMA_LEN ("ngt_uq") },
16334 { STRING_COMMA_LEN ("false_os") },
16335 { STRING_COMMA_LEN ("neq_os") },
16336 { STRING_COMMA_LEN ("ge_oq") },
16337 { STRING_COMMA_LEN ("gt_oq") },
16338 { STRING_COMMA_LEN ("true_us") },
16339 };
16340
16341 static void
16342 VCMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
16343 {
16344 unsigned int cmp_type;
16345
16346 FETCH_DATA (the_info, codep + 1);
16347 cmp_type = *codep++ & 0xff;
16348 if (cmp_type < ARRAY_SIZE (vex_cmp_op))
16349 {
16350 char suffix [3];
16351 char *p = mnemonicendp - 2;
16352 suffix[0] = p[0];
16353 suffix[1] = p[1];
16354 suffix[2] = '\0';
16355 sprintf (p, "%s%s", vex_cmp_op[cmp_type].name, suffix);
16356 mnemonicendp += vex_cmp_op[cmp_type].len;
16357 }
16358 else
16359 {
16360 /* We have a reserved extension byte. Output it directly. */
16361 scratchbuf[0] = '$';
16362 print_operand_value (scratchbuf + 1, 1, cmp_type);
16363 oappend_maybe_intel (scratchbuf);
16364 scratchbuf[0] = '\0';
16365 }
16366 }
16367
16368 static void
16369 VPCMP_Fixup (int bytemode ATTRIBUTE_UNUSED,
16370 int sizeflag ATTRIBUTE_UNUSED)
16371 {
16372 unsigned int cmp_type;
16373
16374 if (!vex.evex)
16375 abort ();
16376
16377 FETCH_DATA (the_info, codep + 1);
16378 cmp_type = *codep++ & 0xff;
16379 /* There are aliases for immediates 0, 1, 2, 4, 5, 6.
16380 If it's the case, print suffix, otherwise - print the immediate. */
16381 if (cmp_type < ARRAY_SIZE (simd_cmp_op)
16382 && cmp_type != 3
16383 && cmp_type != 7)
16384 {
16385 char suffix [3];
16386 char *p = mnemonicendp - 2;
16387
16388 /* vpcmp* can have both one- and two-lettered suffix. */
16389 if (p[0] == 'p')
16390 {
16391 p++;
16392 suffix[0] = p[0];
16393 suffix[1] = '\0';
16394 }
16395 else
16396 {
16397 suffix[0] = p[0];
16398 suffix[1] = p[1];
16399 suffix[2] = '\0';
16400 }
16401
16402 sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
16403 mnemonicendp += simd_cmp_op[cmp_type].len;
16404 }
16405 else
16406 {
16407 /* We have a reserved extension byte. Output it directly. */
16408 scratchbuf[0] = '$';
16409 print_operand_value (scratchbuf + 1, 1, cmp_type);
16410 oappend_maybe_intel (scratchbuf);
16411 scratchbuf[0] = '\0';
16412 }
16413 }
16414
16415 static const struct op xop_cmp_op[] =
16416 {
16417 { STRING_COMMA_LEN ("lt") },
16418 { STRING_COMMA_LEN ("le") },
16419 { STRING_COMMA_LEN ("gt") },
16420 { STRING_COMMA_LEN ("ge") },
16421 { STRING_COMMA_LEN ("eq") },
16422 { STRING_COMMA_LEN ("neq") },
16423 { STRING_COMMA_LEN ("false") },
16424 { STRING_COMMA_LEN ("true") }
16425 };
16426
16427 static void
16428 VPCOM_Fixup (int bytemode ATTRIBUTE_UNUSED,
16429 int sizeflag ATTRIBUTE_UNUSED)
16430 {
16431 unsigned int cmp_type;
16432
16433 FETCH_DATA (the_info, codep + 1);
16434 cmp_type = *codep++ & 0xff;
16435 if (cmp_type < ARRAY_SIZE (xop_cmp_op))
16436 {
16437 char suffix[3];
16438 char *p = mnemonicendp - 2;
16439
16440 /* vpcom* can have both one- and two-lettered suffix. */
16441 if (p[0] == 'm')
16442 {
16443 p++;
16444 suffix[0] = p[0];
16445 suffix[1] = '\0';
16446 }
16447 else
16448 {
16449 suffix[0] = p[0];
16450 suffix[1] = p[1];
16451 suffix[2] = '\0';
16452 }
16453
16454 sprintf (p, "%s%s", xop_cmp_op[cmp_type].name, suffix);
16455 mnemonicendp += xop_cmp_op[cmp_type].len;
16456 }
16457 else
16458 {
16459 /* We have a reserved extension byte. Output it directly. */
16460 scratchbuf[0] = '$';
16461 print_operand_value (scratchbuf + 1, 1, cmp_type);
16462 oappend_maybe_intel (scratchbuf);
16463 scratchbuf[0] = '\0';
16464 }
16465 }
16466
16467 static const struct op pclmul_op[] =
16468 {
16469 { STRING_COMMA_LEN ("lql") },
16470 { STRING_COMMA_LEN ("hql") },
16471 { STRING_COMMA_LEN ("lqh") },
16472 { STRING_COMMA_LEN ("hqh") }
16473 };
16474
16475 static void
16476 PCLMUL_Fixup (int bytemode ATTRIBUTE_UNUSED,
16477 int sizeflag ATTRIBUTE_UNUSED)
16478 {
16479 unsigned int pclmul_type;
16480
16481 FETCH_DATA (the_info, codep + 1);
16482 pclmul_type = *codep++ & 0xff;
16483 switch (pclmul_type)
16484 {
16485 case 0x10:
16486 pclmul_type = 2;
16487 break;
16488 case 0x11:
16489 pclmul_type = 3;
16490 break;
16491 default:
16492 break;
16493 }
16494 if (pclmul_type < ARRAY_SIZE (pclmul_op))
16495 {
16496 char suffix [4];
16497 char *p = mnemonicendp - 3;
16498 suffix[0] = p[0];
16499 suffix[1] = p[1];
16500 suffix[2] = p[2];
16501 suffix[3] = '\0';
16502 sprintf (p, "%s%s", pclmul_op[pclmul_type].name, suffix);
16503 mnemonicendp += pclmul_op[pclmul_type].len;
16504 }
16505 else
16506 {
16507 /* We have a reserved extension byte. Output it directly. */
16508 scratchbuf[0] = '$';
16509 print_operand_value (scratchbuf + 1, 1, pclmul_type);
16510 oappend_maybe_intel (scratchbuf);
16511 scratchbuf[0] = '\0';
16512 }
16513 }
16514
16515 static void
16516 MOVBE_Fixup (int bytemode, int sizeflag)
16517 {
16518 /* Add proper suffix to "movbe". */
16519 char *p = mnemonicendp;
16520
16521 switch (bytemode)
16522 {
16523 case v_mode:
16524 if (intel_syntax)
16525 goto skip;
16526
16527 USED_REX (REX_W);
16528 if (sizeflag & SUFFIX_ALWAYS)
16529 {
16530 if (rex & REX_W)
16531 *p++ = 'q';
16532 else
16533 {
16534 if (sizeflag & DFLAG)
16535 *p++ = 'l';
16536 else
16537 *p++ = 'w';
16538 used_prefixes |= (prefixes & PREFIX_DATA);
16539 }
16540 }
16541 break;
16542 default:
16543 oappend (INTERNAL_DISASSEMBLER_ERROR);
16544 break;
16545 }
16546 mnemonicendp = p;
16547 *p = '\0';
16548
16549 skip:
16550 OP_M (bytemode, sizeflag);
16551 }
16552
16553 static void
16554 OP_LWPCB_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
16555 {
16556 int reg;
16557 const char **names;
16558
16559 /* Skip mod/rm byte. */
16560 MODRM_CHECK;
16561 codep++;
16562
16563 if (rex & REX_W)
16564 names = names64;
16565 else
16566 names = names32;
16567
16568 reg = modrm.rm;
16569 USED_REX (REX_B);
16570 if (rex & REX_B)
16571 reg += 8;
16572
16573 oappend (names[reg]);
16574 }
16575
16576 static void
16577 OP_LWP_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
16578 {
16579 const char **names;
16580 unsigned int reg = vex.register_specifier;
16581
16582 if (rex & REX_W)
16583 names = names64;
16584 else
16585 names = names32;
16586
16587 if (address_mode != mode_64bit)
16588 reg &= 7;
16589 oappend (names[reg]);
16590 }
16591
16592 static void
16593 OP_Mask (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
16594 {
16595 if (!vex.evex
16596 || (bytemode != mask_mode && bytemode != mask_bd_mode))
16597 abort ();
16598
16599 USED_REX (REX_R);
16600 if ((rex & REX_R) != 0 || !vex.r)
16601 {
16602 BadOp ();
16603 return;
16604 }
16605
16606 oappend (names_mask [modrm.reg]);
16607 }
16608
16609 static void
16610 OP_Rounding (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
16611 {
16612 if (!vex.evex
16613 || (bytemode != evex_rounding_mode
16614 && bytemode != evex_rounding_64_mode
16615 && bytemode != evex_sae_mode))
16616 abort ();
16617 if (modrm.mod == 3 && vex.b)
16618 switch (bytemode)
16619 {
16620 case evex_rounding_64_mode:
16621 if (address_mode != mode_64bit)
16622 {
16623 oappend ("(bad)");
16624 break;
16625 }
16626 /* Fall through. */
16627 case evex_rounding_mode:
16628 oappend (names_rounding[vex.ll]);
16629 break;
16630 case evex_sae_mode:
16631 oappend ("{sae}");
16632 break;
16633 default:
16634 break;
16635 }
16636 }
This page took 0.358034 seconds and 5 git commands to generate.