1ba7b4f2a3139894279651b27651313d5edc5c32
[deliverable/binutils-gdb.git] / opcodes / i386-dis.c
1 /* Print i386 instructions for GDB, the GNU debugger.
2 Copyright (C) 1988-2019 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_0F3852_P_1,
2193 EVEX_W_0F3854_P_2,
2194 EVEX_W_0F3855_P_2,
2195 EVEX_W_0F3858_P_2,
2196 EVEX_W_0F3859_P_2,
2197 EVEX_W_0F385A_P_2,
2198 EVEX_W_0F385B_P_2,
2199 EVEX_W_0F3862_P_2,
2200 EVEX_W_0F3863_P_2,
2201 EVEX_W_0F3866_P_2,
2202 EVEX_W_0F3870_P_2,
2203 EVEX_W_0F3871_P_2,
2204 EVEX_W_0F3872_P_1,
2205 EVEX_W_0F3872_P_2,
2206 EVEX_W_0F3872_P_3,
2207 EVEX_W_0F3873_P_2,
2208 EVEX_W_0F3875_P_2,
2209 EVEX_W_0F3878_P_2,
2210 EVEX_W_0F3879_P_2,
2211 EVEX_W_0F387A_P_2,
2212 EVEX_W_0F387B_P_2,
2213 EVEX_W_0F387D_P_2,
2214 EVEX_W_0F3883_P_2,
2215 EVEX_W_0F388D_P_2,
2216 EVEX_W_0F3891_P_2,
2217 EVEX_W_0F3893_P_2,
2218 EVEX_W_0F38A1_P_2,
2219 EVEX_W_0F38A3_P_2,
2220 EVEX_W_0F38C7_R_1_P_2,
2221 EVEX_W_0F38C7_R_2_P_2,
2222 EVEX_W_0F38C7_R_5_P_2,
2223 EVEX_W_0F38C7_R_6_P_2,
2224
2225 EVEX_W_0F3A00_P_2,
2226 EVEX_W_0F3A01_P_2,
2227 EVEX_W_0F3A04_P_2,
2228 EVEX_W_0F3A05_P_2,
2229 EVEX_W_0F3A08_P_2,
2230 EVEX_W_0F3A09_P_2,
2231 EVEX_W_0F3A0A_P_2,
2232 EVEX_W_0F3A0B_P_2,
2233 EVEX_W_0F3A18_P_2,
2234 EVEX_W_0F3A19_P_2,
2235 EVEX_W_0F3A1A_P_2,
2236 EVEX_W_0F3A1B_P_2,
2237 EVEX_W_0F3A1D_P_2,
2238 EVEX_W_0F3A21_P_2,
2239 EVEX_W_0F3A23_P_2,
2240 EVEX_W_0F3A38_P_2,
2241 EVEX_W_0F3A39_P_2,
2242 EVEX_W_0F3A3A_P_2,
2243 EVEX_W_0F3A3B_P_2,
2244 EVEX_W_0F3A3E_P_2,
2245 EVEX_W_0F3A3F_P_2,
2246 EVEX_W_0F3A42_P_2,
2247 EVEX_W_0F3A43_P_2,
2248 EVEX_W_0F3A50_P_2,
2249 EVEX_W_0F3A51_P_2,
2250 EVEX_W_0F3A56_P_2,
2251 EVEX_W_0F3A57_P_2,
2252 EVEX_W_0F3A66_P_2,
2253 EVEX_W_0F3A67_P_2,
2254 EVEX_W_0F3A70_P_2,
2255 EVEX_W_0F3A71_P_2,
2256 EVEX_W_0F3A72_P_2,
2257 EVEX_W_0F3A73_P_2,
2258 EVEX_W_0F3ACE_P_2,
2259 EVEX_W_0F3ACF_P_2
2260 };
2261
2262 typedef void (*op_rtn) (int bytemode, int sizeflag);
2263
2264 struct dis386 {
2265 const char *name;
2266 struct
2267 {
2268 op_rtn rtn;
2269 int bytemode;
2270 } op[MAX_OPERANDS];
2271 unsigned int prefix_requirement;
2272 };
2273
2274 /* Upper case letters in the instruction names here are macros.
2275 'A' => print 'b' if no register operands or suffix_always is true
2276 'B' => print 'b' if suffix_always is true
2277 'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
2278 size prefix
2279 'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
2280 suffix_always is true
2281 'E' => print 'e' if 32-bit form of jcxz
2282 'F' => print 'w' or 'l' depending on address size prefix (loop insns)
2283 'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
2284 'H' => print ",pt" or ",pn" branch hint
2285 'I' => honor following macro letter even in Intel mode (implemented only
2286 for some of the macro letters)
2287 'J' => print 'l'
2288 'K' => print 'd' or 'q' if rex prefix is present.
2289 'L' => print 'l' if suffix_always is true
2290 'M' => print 'r' if intel_mnemonic is false.
2291 'N' => print 'n' if instruction has no wait "prefix"
2292 'O' => print 'd' or 'o' (or 'q' in Intel mode)
2293 'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix,
2294 or suffix_always is true. print 'q' if rex prefix is present.
2295 'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
2296 is true
2297 'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
2298 'S' => print 'w', 'l' or 'q' if suffix_always is true
2299 'T' => print 'q' in 64bit mode if instruction has no operand size
2300 prefix and behave as 'P' otherwise
2301 'U' => print 'q' in 64bit mode if instruction has no operand size
2302 prefix and behave as 'Q' otherwise
2303 'V' => print 'q' in 64bit mode if instruction has no operand size
2304 prefix and behave as 'S' otherwise
2305 'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
2306 'X' => print 's', 'd' depending on data16 prefix (for XMM)
2307 'Y' unused.
2308 'Z' => print 'q' in 64bit mode and behave as 'L' otherwise
2309 '!' => change condition from true to false or from false to true.
2310 '%' => add 1 upper case letter to the macro.
2311 '^' => print 'w' or 'l' depending on operand size prefix or
2312 suffix_always is true (lcall/ljmp).
2313 '@' => print 'q' for Intel64 ISA, 'w' or 'q' for AMD64 ISA depending
2314 on operand size prefix.
2315 '&' => print 'q' in 64bit mode for Intel64 ISA or if instruction
2316 has no operand size prefix for AMD64 ISA, behave as 'P'
2317 otherwise
2318
2319 2 upper case letter macros:
2320 "XY" => print 'x' or 'y' if suffix_always is true or no register
2321 operands and no broadcast.
2322 "XZ" => print 'x', 'y', or 'z' if suffix_always is true or no
2323 register operands and no broadcast.
2324 "XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
2325 "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand
2326 or suffix_always is true
2327 "LB" => print "abs" in 64bit mode and behave as 'B' otherwise
2328 "LS" => print "abs" in 64bit mode and behave as 'S' otherwise
2329 "LV" => print "abs" for 64bit operand and behave as 'S' otherwise
2330 "LW" => print 'd', 'q' depending on the VEX.W bit
2331 "LP" => print 'w' or 'l' ('d' in Intel mode) if instruction has
2332 an operand size prefix, or suffix_always is true. print
2333 'q' if rex prefix is present.
2334
2335 Many of the above letters print nothing in Intel mode. See "putop"
2336 for the details.
2337
2338 Braces '{' and '}', and vertical bars '|', indicate alternative
2339 mnemonic strings for AT&T and Intel. */
2340
2341 static const struct dis386 dis386[] = {
2342 /* 00 */
2343 { "addB", { Ebh1, Gb }, 0 },
2344 { "addS", { Evh1, Gv }, 0 },
2345 { "addB", { Gb, EbS }, 0 },
2346 { "addS", { Gv, EvS }, 0 },
2347 { "addB", { AL, Ib }, 0 },
2348 { "addS", { eAX, Iv }, 0 },
2349 { X86_64_TABLE (X86_64_06) },
2350 { X86_64_TABLE (X86_64_07) },
2351 /* 08 */
2352 { "orB", { Ebh1, Gb }, 0 },
2353 { "orS", { Evh1, Gv }, 0 },
2354 { "orB", { Gb, EbS }, 0 },
2355 { "orS", { Gv, EvS }, 0 },
2356 { "orB", { AL, Ib }, 0 },
2357 { "orS", { eAX, Iv }, 0 },
2358 { X86_64_TABLE (X86_64_0D) },
2359 { Bad_Opcode }, /* 0x0f extended opcode escape */
2360 /* 10 */
2361 { "adcB", { Ebh1, Gb }, 0 },
2362 { "adcS", { Evh1, Gv }, 0 },
2363 { "adcB", { Gb, EbS }, 0 },
2364 { "adcS", { Gv, EvS }, 0 },
2365 { "adcB", { AL, Ib }, 0 },
2366 { "adcS", { eAX, Iv }, 0 },
2367 { X86_64_TABLE (X86_64_16) },
2368 { X86_64_TABLE (X86_64_17) },
2369 /* 18 */
2370 { "sbbB", { Ebh1, Gb }, 0 },
2371 { "sbbS", { Evh1, Gv }, 0 },
2372 { "sbbB", { Gb, EbS }, 0 },
2373 { "sbbS", { Gv, EvS }, 0 },
2374 { "sbbB", { AL, Ib }, 0 },
2375 { "sbbS", { eAX, Iv }, 0 },
2376 { X86_64_TABLE (X86_64_1E) },
2377 { X86_64_TABLE (X86_64_1F) },
2378 /* 20 */
2379 { "andB", { Ebh1, Gb }, 0 },
2380 { "andS", { Evh1, Gv }, 0 },
2381 { "andB", { Gb, EbS }, 0 },
2382 { "andS", { Gv, EvS }, 0 },
2383 { "andB", { AL, Ib }, 0 },
2384 { "andS", { eAX, Iv }, 0 },
2385 { Bad_Opcode }, /* SEG ES prefix */
2386 { X86_64_TABLE (X86_64_27) },
2387 /* 28 */
2388 { "subB", { Ebh1, Gb }, 0 },
2389 { "subS", { Evh1, Gv }, 0 },
2390 { "subB", { Gb, EbS }, 0 },
2391 { "subS", { Gv, EvS }, 0 },
2392 { "subB", { AL, Ib }, 0 },
2393 { "subS", { eAX, Iv }, 0 },
2394 { Bad_Opcode }, /* SEG CS prefix */
2395 { X86_64_TABLE (X86_64_2F) },
2396 /* 30 */
2397 { "xorB", { Ebh1, Gb }, 0 },
2398 { "xorS", { Evh1, Gv }, 0 },
2399 { "xorB", { Gb, EbS }, 0 },
2400 { "xorS", { Gv, EvS }, 0 },
2401 { "xorB", { AL, Ib }, 0 },
2402 { "xorS", { eAX, Iv }, 0 },
2403 { Bad_Opcode }, /* SEG SS prefix */
2404 { X86_64_TABLE (X86_64_37) },
2405 /* 38 */
2406 { "cmpB", { Eb, Gb }, 0 },
2407 { "cmpS", { Ev, Gv }, 0 },
2408 { "cmpB", { Gb, EbS }, 0 },
2409 { "cmpS", { Gv, EvS }, 0 },
2410 { "cmpB", { AL, Ib }, 0 },
2411 { "cmpS", { eAX, Iv }, 0 },
2412 { Bad_Opcode }, /* SEG DS prefix */
2413 { X86_64_TABLE (X86_64_3F) },
2414 /* 40 */
2415 { "inc{S|}", { RMeAX }, 0 },
2416 { "inc{S|}", { RMeCX }, 0 },
2417 { "inc{S|}", { RMeDX }, 0 },
2418 { "inc{S|}", { RMeBX }, 0 },
2419 { "inc{S|}", { RMeSP }, 0 },
2420 { "inc{S|}", { RMeBP }, 0 },
2421 { "inc{S|}", { RMeSI }, 0 },
2422 { "inc{S|}", { RMeDI }, 0 },
2423 /* 48 */
2424 { "dec{S|}", { RMeAX }, 0 },
2425 { "dec{S|}", { RMeCX }, 0 },
2426 { "dec{S|}", { RMeDX }, 0 },
2427 { "dec{S|}", { RMeBX }, 0 },
2428 { "dec{S|}", { RMeSP }, 0 },
2429 { "dec{S|}", { RMeBP }, 0 },
2430 { "dec{S|}", { RMeSI }, 0 },
2431 { "dec{S|}", { RMeDI }, 0 },
2432 /* 50 */
2433 { "pushV", { RMrAX }, 0 },
2434 { "pushV", { RMrCX }, 0 },
2435 { "pushV", { RMrDX }, 0 },
2436 { "pushV", { RMrBX }, 0 },
2437 { "pushV", { RMrSP }, 0 },
2438 { "pushV", { RMrBP }, 0 },
2439 { "pushV", { RMrSI }, 0 },
2440 { "pushV", { RMrDI }, 0 },
2441 /* 58 */
2442 { "popV", { RMrAX }, 0 },
2443 { "popV", { RMrCX }, 0 },
2444 { "popV", { RMrDX }, 0 },
2445 { "popV", { RMrBX }, 0 },
2446 { "popV", { RMrSP }, 0 },
2447 { "popV", { RMrBP }, 0 },
2448 { "popV", { RMrSI }, 0 },
2449 { "popV", { RMrDI }, 0 },
2450 /* 60 */
2451 { X86_64_TABLE (X86_64_60) },
2452 { X86_64_TABLE (X86_64_61) },
2453 { X86_64_TABLE (X86_64_62) },
2454 { X86_64_TABLE (X86_64_63) },
2455 { Bad_Opcode }, /* seg fs */
2456 { Bad_Opcode }, /* seg gs */
2457 { Bad_Opcode }, /* op size prefix */
2458 { Bad_Opcode }, /* adr size prefix */
2459 /* 68 */
2460 { "pushT", { sIv }, 0 },
2461 { "imulS", { Gv, Ev, Iv }, 0 },
2462 { "pushT", { sIbT }, 0 },
2463 { "imulS", { Gv, Ev, sIb }, 0 },
2464 { "ins{b|}", { Ybr, indirDX }, 0 },
2465 { X86_64_TABLE (X86_64_6D) },
2466 { "outs{b|}", { indirDXr, Xb }, 0 },
2467 { X86_64_TABLE (X86_64_6F) },
2468 /* 70 */
2469 { "joH", { Jb, BND, cond_jump_flag }, 0 },
2470 { "jnoH", { Jb, BND, cond_jump_flag }, 0 },
2471 { "jbH", { Jb, BND, cond_jump_flag }, 0 },
2472 { "jaeH", { Jb, BND, cond_jump_flag }, 0 },
2473 { "jeH", { Jb, BND, cond_jump_flag }, 0 },
2474 { "jneH", { Jb, BND, cond_jump_flag }, 0 },
2475 { "jbeH", { Jb, BND, cond_jump_flag }, 0 },
2476 { "jaH", { Jb, BND, cond_jump_flag }, 0 },
2477 /* 78 */
2478 { "jsH", { Jb, BND, cond_jump_flag }, 0 },
2479 { "jnsH", { Jb, BND, cond_jump_flag }, 0 },
2480 { "jpH", { Jb, BND, cond_jump_flag }, 0 },
2481 { "jnpH", { Jb, BND, cond_jump_flag }, 0 },
2482 { "jlH", { Jb, BND, cond_jump_flag }, 0 },
2483 { "jgeH", { Jb, BND, cond_jump_flag }, 0 },
2484 { "jleH", { Jb, BND, cond_jump_flag }, 0 },
2485 { "jgH", { Jb, BND, cond_jump_flag }, 0 },
2486 /* 80 */
2487 { REG_TABLE (REG_80) },
2488 { REG_TABLE (REG_81) },
2489 { X86_64_TABLE (X86_64_82) },
2490 { REG_TABLE (REG_83) },
2491 { "testB", { Eb, Gb }, 0 },
2492 { "testS", { Ev, Gv }, 0 },
2493 { "xchgB", { Ebh2, Gb }, 0 },
2494 { "xchgS", { Evh2, Gv }, 0 },
2495 /* 88 */
2496 { "movB", { Ebh3, Gb }, 0 },
2497 { "movS", { Evh3, Gv }, 0 },
2498 { "movB", { Gb, EbS }, 0 },
2499 { "movS", { Gv, EvS }, 0 },
2500 { "movD", { Sv, Sw }, 0 },
2501 { MOD_TABLE (MOD_8D) },
2502 { "movD", { Sw, Sv }, 0 },
2503 { REG_TABLE (REG_8F) },
2504 /* 90 */
2505 { PREFIX_TABLE (PREFIX_90) },
2506 { "xchgS", { RMeCX, eAX }, 0 },
2507 { "xchgS", { RMeDX, eAX }, 0 },
2508 { "xchgS", { RMeBX, eAX }, 0 },
2509 { "xchgS", { RMeSP, eAX }, 0 },
2510 { "xchgS", { RMeBP, eAX }, 0 },
2511 { "xchgS", { RMeSI, eAX }, 0 },
2512 { "xchgS", { RMeDI, eAX }, 0 },
2513 /* 98 */
2514 { "cW{t|}R", { XX }, 0 },
2515 { "cR{t|}O", { XX }, 0 },
2516 { X86_64_TABLE (X86_64_9A) },
2517 { Bad_Opcode }, /* fwait */
2518 { "pushfT", { XX }, 0 },
2519 { "popfT", { XX }, 0 },
2520 { "sahf", { XX }, 0 },
2521 { "lahf", { XX }, 0 },
2522 /* a0 */
2523 { "mov%LB", { AL, Ob }, 0 },
2524 { "mov%LS", { eAX, Ov }, 0 },
2525 { "mov%LB", { Ob, AL }, 0 },
2526 { "mov%LS", { Ov, eAX }, 0 },
2527 { "movs{b|}", { Ybr, Xb }, 0 },
2528 { "movs{R|}", { Yvr, Xv }, 0 },
2529 { "cmps{b|}", { Xb, Yb }, 0 },
2530 { "cmps{R|}", { Xv, Yv }, 0 },
2531 /* a8 */
2532 { "testB", { AL, Ib }, 0 },
2533 { "testS", { eAX, Iv }, 0 },
2534 { "stosB", { Ybr, AL }, 0 },
2535 { "stosS", { Yvr, eAX }, 0 },
2536 { "lodsB", { ALr, Xb }, 0 },
2537 { "lodsS", { eAXr, Xv }, 0 },
2538 { "scasB", { AL, Yb }, 0 },
2539 { "scasS", { eAX, Yv }, 0 },
2540 /* b0 */
2541 { "movB", { RMAL, Ib }, 0 },
2542 { "movB", { RMCL, Ib }, 0 },
2543 { "movB", { RMDL, Ib }, 0 },
2544 { "movB", { RMBL, Ib }, 0 },
2545 { "movB", { RMAH, Ib }, 0 },
2546 { "movB", { RMCH, Ib }, 0 },
2547 { "movB", { RMDH, Ib }, 0 },
2548 { "movB", { RMBH, Ib }, 0 },
2549 /* b8 */
2550 { "mov%LV", { RMeAX, Iv64 }, 0 },
2551 { "mov%LV", { RMeCX, Iv64 }, 0 },
2552 { "mov%LV", { RMeDX, Iv64 }, 0 },
2553 { "mov%LV", { RMeBX, Iv64 }, 0 },
2554 { "mov%LV", { RMeSP, Iv64 }, 0 },
2555 { "mov%LV", { RMeBP, Iv64 }, 0 },
2556 { "mov%LV", { RMeSI, Iv64 }, 0 },
2557 { "mov%LV", { RMeDI, Iv64 }, 0 },
2558 /* c0 */
2559 { REG_TABLE (REG_C0) },
2560 { REG_TABLE (REG_C1) },
2561 { "retT", { Iw, BND }, 0 },
2562 { "retT", { BND }, 0 },
2563 { X86_64_TABLE (X86_64_C4) },
2564 { X86_64_TABLE (X86_64_C5) },
2565 { REG_TABLE (REG_C6) },
2566 { REG_TABLE (REG_C7) },
2567 /* c8 */
2568 { "enterT", { Iw, Ib }, 0 },
2569 { "leaveT", { XX }, 0 },
2570 { "Jret{|f}P", { Iw }, 0 },
2571 { "Jret{|f}P", { XX }, 0 },
2572 { "int3", { XX }, 0 },
2573 { "int", { Ib }, 0 },
2574 { X86_64_TABLE (X86_64_CE) },
2575 { "iret%LP", { XX }, 0 },
2576 /* d0 */
2577 { REG_TABLE (REG_D0) },
2578 { REG_TABLE (REG_D1) },
2579 { REG_TABLE (REG_D2) },
2580 { REG_TABLE (REG_D3) },
2581 { X86_64_TABLE (X86_64_D4) },
2582 { X86_64_TABLE (X86_64_D5) },
2583 { Bad_Opcode },
2584 { "xlat", { DSBX }, 0 },
2585 /* d8 */
2586 { FLOAT },
2587 { FLOAT },
2588 { FLOAT },
2589 { FLOAT },
2590 { FLOAT },
2591 { FLOAT },
2592 { FLOAT },
2593 { FLOAT },
2594 /* e0 */
2595 { "loopneFH", { Jb, XX, loop_jcxz_flag }, 0 },
2596 { "loopeFH", { Jb, XX, loop_jcxz_flag }, 0 },
2597 { "loopFH", { Jb, XX, loop_jcxz_flag }, 0 },
2598 { "jEcxzH", { Jb, XX, loop_jcxz_flag }, 0 },
2599 { "inB", { AL, Ib }, 0 },
2600 { "inG", { zAX, Ib }, 0 },
2601 { "outB", { Ib, AL }, 0 },
2602 { "outG", { Ib, zAX }, 0 },
2603 /* e8 */
2604 { X86_64_TABLE (X86_64_E8) },
2605 { X86_64_TABLE (X86_64_E9) },
2606 { X86_64_TABLE (X86_64_EA) },
2607 { "jmp", { Jb, BND }, 0 },
2608 { "inB", { AL, indirDX }, 0 },
2609 { "inG", { zAX, indirDX }, 0 },
2610 { "outB", { indirDX, AL }, 0 },
2611 { "outG", { indirDX, zAX }, 0 },
2612 /* f0 */
2613 { Bad_Opcode }, /* lock prefix */
2614 { "icebp", { XX }, 0 },
2615 { Bad_Opcode }, /* repne */
2616 { Bad_Opcode }, /* repz */
2617 { "hlt", { XX }, 0 },
2618 { "cmc", { XX }, 0 },
2619 { REG_TABLE (REG_F6) },
2620 { REG_TABLE (REG_F7) },
2621 /* f8 */
2622 { "clc", { XX }, 0 },
2623 { "stc", { XX }, 0 },
2624 { "cli", { XX }, 0 },
2625 { "sti", { XX }, 0 },
2626 { "cld", { XX }, 0 },
2627 { "std", { XX }, 0 },
2628 { REG_TABLE (REG_FE) },
2629 { REG_TABLE (REG_FF) },
2630 };
2631
2632 static const struct dis386 dis386_twobyte[] = {
2633 /* 00 */
2634 { REG_TABLE (REG_0F00 ) },
2635 { REG_TABLE (REG_0F01 ) },
2636 { "larS", { Gv, Ew }, 0 },
2637 { "lslS", { Gv, Ew }, 0 },
2638 { Bad_Opcode },
2639 { "syscall", { XX }, 0 },
2640 { "clts", { XX }, 0 },
2641 { "sysret%LP", { XX }, 0 },
2642 /* 08 */
2643 { "invd", { XX }, 0 },
2644 { PREFIX_TABLE (PREFIX_0F09) },
2645 { Bad_Opcode },
2646 { "ud2", { XX }, 0 },
2647 { Bad_Opcode },
2648 { REG_TABLE (REG_0F0D) },
2649 { "femms", { XX }, 0 },
2650 { "", { MX, EM, OPSUF }, 0 }, /* See OP_3DNowSuffix. */
2651 /* 10 */
2652 { PREFIX_TABLE (PREFIX_0F10) },
2653 { PREFIX_TABLE (PREFIX_0F11) },
2654 { PREFIX_TABLE (PREFIX_0F12) },
2655 { MOD_TABLE (MOD_0F13) },
2656 { "unpcklpX", { XM, EXx }, PREFIX_OPCODE },
2657 { "unpckhpX", { XM, EXx }, PREFIX_OPCODE },
2658 { PREFIX_TABLE (PREFIX_0F16) },
2659 { MOD_TABLE (MOD_0F17) },
2660 /* 18 */
2661 { REG_TABLE (REG_0F18) },
2662 { "nopQ", { Ev }, 0 },
2663 { PREFIX_TABLE (PREFIX_0F1A) },
2664 { PREFIX_TABLE (PREFIX_0F1B) },
2665 { PREFIX_TABLE (PREFIX_0F1C) },
2666 { "nopQ", { Ev }, 0 },
2667 { PREFIX_TABLE (PREFIX_0F1E) },
2668 { "nopQ", { Ev }, 0 },
2669 /* 20 */
2670 { "movZ", { Rm, Cm }, 0 },
2671 { "movZ", { Rm, Dm }, 0 },
2672 { "movZ", { Cm, Rm }, 0 },
2673 { "movZ", { Dm, Rm }, 0 },
2674 { MOD_TABLE (MOD_0F24) },
2675 { Bad_Opcode },
2676 { MOD_TABLE (MOD_0F26) },
2677 { Bad_Opcode },
2678 /* 28 */
2679 { "movapX", { XM, EXx }, PREFIX_OPCODE },
2680 { "movapX", { EXxS, XM }, PREFIX_OPCODE },
2681 { PREFIX_TABLE (PREFIX_0F2A) },
2682 { PREFIX_TABLE (PREFIX_0F2B) },
2683 { PREFIX_TABLE (PREFIX_0F2C) },
2684 { PREFIX_TABLE (PREFIX_0F2D) },
2685 { PREFIX_TABLE (PREFIX_0F2E) },
2686 { PREFIX_TABLE (PREFIX_0F2F) },
2687 /* 30 */
2688 { "wrmsr", { XX }, 0 },
2689 { "rdtsc", { XX }, 0 },
2690 { "rdmsr", { XX }, 0 },
2691 { "rdpmc", { XX }, 0 },
2692 { "sysenter", { XX }, 0 },
2693 { "sysexit", { XX }, 0 },
2694 { Bad_Opcode },
2695 { "getsec", { XX }, 0 },
2696 /* 38 */
2697 { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F38, PREFIX_OPCODE) },
2698 { Bad_Opcode },
2699 { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F3A, PREFIX_OPCODE) },
2700 { Bad_Opcode },
2701 { Bad_Opcode },
2702 { Bad_Opcode },
2703 { Bad_Opcode },
2704 { Bad_Opcode },
2705 /* 40 */
2706 { "cmovoS", { Gv, Ev }, 0 },
2707 { "cmovnoS", { Gv, Ev }, 0 },
2708 { "cmovbS", { Gv, Ev }, 0 },
2709 { "cmovaeS", { Gv, Ev }, 0 },
2710 { "cmoveS", { Gv, Ev }, 0 },
2711 { "cmovneS", { Gv, Ev }, 0 },
2712 { "cmovbeS", { Gv, Ev }, 0 },
2713 { "cmovaS", { Gv, Ev }, 0 },
2714 /* 48 */
2715 { "cmovsS", { Gv, Ev }, 0 },
2716 { "cmovnsS", { Gv, Ev }, 0 },
2717 { "cmovpS", { Gv, Ev }, 0 },
2718 { "cmovnpS", { Gv, Ev }, 0 },
2719 { "cmovlS", { Gv, Ev }, 0 },
2720 { "cmovgeS", { Gv, Ev }, 0 },
2721 { "cmovleS", { Gv, Ev }, 0 },
2722 { "cmovgS", { Gv, Ev }, 0 },
2723 /* 50 */
2724 { MOD_TABLE (MOD_0F51) },
2725 { PREFIX_TABLE (PREFIX_0F51) },
2726 { PREFIX_TABLE (PREFIX_0F52) },
2727 { PREFIX_TABLE (PREFIX_0F53) },
2728 { "andpX", { XM, EXx }, PREFIX_OPCODE },
2729 { "andnpX", { XM, EXx }, PREFIX_OPCODE },
2730 { "orpX", { XM, EXx }, PREFIX_OPCODE },
2731 { "xorpX", { XM, EXx }, PREFIX_OPCODE },
2732 /* 58 */
2733 { PREFIX_TABLE (PREFIX_0F58) },
2734 { PREFIX_TABLE (PREFIX_0F59) },
2735 { PREFIX_TABLE (PREFIX_0F5A) },
2736 { PREFIX_TABLE (PREFIX_0F5B) },
2737 { PREFIX_TABLE (PREFIX_0F5C) },
2738 { PREFIX_TABLE (PREFIX_0F5D) },
2739 { PREFIX_TABLE (PREFIX_0F5E) },
2740 { PREFIX_TABLE (PREFIX_0F5F) },
2741 /* 60 */
2742 { PREFIX_TABLE (PREFIX_0F60) },
2743 { PREFIX_TABLE (PREFIX_0F61) },
2744 { PREFIX_TABLE (PREFIX_0F62) },
2745 { "packsswb", { MX, EM }, PREFIX_OPCODE },
2746 { "pcmpgtb", { MX, EM }, PREFIX_OPCODE },
2747 { "pcmpgtw", { MX, EM }, PREFIX_OPCODE },
2748 { "pcmpgtd", { MX, EM }, PREFIX_OPCODE },
2749 { "packuswb", { MX, EM }, PREFIX_OPCODE },
2750 /* 68 */
2751 { "punpckhbw", { MX, EM }, PREFIX_OPCODE },
2752 { "punpckhwd", { MX, EM }, PREFIX_OPCODE },
2753 { "punpckhdq", { MX, EM }, PREFIX_OPCODE },
2754 { "packssdw", { MX, EM }, PREFIX_OPCODE },
2755 { PREFIX_TABLE (PREFIX_0F6C) },
2756 { PREFIX_TABLE (PREFIX_0F6D) },
2757 { "movK", { MX, Edq }, PREFIX_OPCODE },
2758 { PREFIX_TABLE (PREFIX_0F6F) },
2759 /* 70 */
2760 { PREFIX_TABLE (PREFIX_0F70) },
2761 { REG_TABLE (REG_0F71) },
2762 { REG_TABLE (REG_0F72) },
2763 { REG_TABLE (REG_0F73) },
2764 { "pcmpeqb", { MX, EM }, PREFIX_OPCODE },
2765 { "pcmpeqw", { MX, EM }, PREFIX_OPCODE },
2766 { "pcmpeqd", { MX, EM }, PREFIX_OPCODE },
2767 { "emms", { XX }, PREFIX_OPCODE },
2768 /* 78 */
2769 { PREFIX_TABLE (PREFIX_0F78) },
2770 { PREFIX_TABLE (PREFIX_0F79) },
2771 { Bad_Opcode },
2772 { Bad_Opcode },
2773 { PREFIX_TABLE (PREFIX_0F7C) },
2774 { PREFIX_TABLE (PREFIX_0F7D) },
2775 { PREFIX_TABLE (PREFIX_0F7E) },
2776 { PREFIX_TABLE (PREFIX_0F7F) },
2777 /* 80 */
2778 { "joH", { Jv, BND, cond_jump_flag }, 0 },
2779 { "jnoH", { Jv, BND, cond_jump_flag }, 0 },
2780 { "jbH", { Jv, BND, cond_jump_flag }, 0 },
2781 { "jaeH", { Jv, BND, cond_jump_flag }, 0 },
2782 { "jeH", { Jv, BND, cond_jump_flag }, 0 },
2783 { "jneH", { Jv, BND, cond_jump_flag }, 0 },
2784 { "jbeH", { Jv, BND, cond_jump_flag }, 0 },
2785 { "jaH", { Jv, BND, cond_jump_flag }, 0 },
2786 /* 88 */
2787 { "jsH", { Jv, BND, cond_jump_flag }, 0 },
2788 { "jnsH", { Jv, BND, cond_jump_flag }, 0 },
2789 { "jpH", { Jv, BND, cond_jump_flag }, 0 },
2790 { "jnpH", { Jv, BND, cond_jump_flag }, 0 },
2791 { "jlH", { Jv, BND, cond_jump_flag }, 0 },
2792 { "jgeH", { Jv, BND, cond_jump_flag }, 0 },
2793 { "jleH", { Jv, BND, cond_jump_flag }, 0 },
2794 { "jgH", { Jv, BND, cond_jump_flag }, 0 },
2795 /* 90 */
2796 { "seto", { Eb }, 0 },
2797 { "setno", { Eb }, 0 },
2798 { "setb", { Eb }, 0 },
2799 { "setae", { Eb }, 0 },
2800 { "sete", { Eb }, 0 },
2801 { "setne", { Eb }, 0 },
2802 { "setbe", { Eb }, 0 },
2803 { "seta", { Eb }, 0 },
2804 /* 98 */
2805 { "sets", { Eb }, 0 },
2806 { "setns", { Eb }, 0 },
2807 { "setp", { Eb }, 0 },
2808 { "setnp", { Eb }, 0 },
2809 { "setl", { Eb }, 0 },
2810 { "setge", { Eb }, 0 },
2811 { "setle", { Eb }, 0 },
2812 { "setg", { Eb }, 0 },
2813 /* a0 */
2814 { "pushT", { fs }, 0 },
2815 { "popT", { fs }, 0 },
2816 { "cpuid", { XX }, 0 },
2817 { "btS", { Ev, Gv }, 0 },
2818 { "shldS", { Ev, Gv, Ib }, 0 },
2819 { "shldS", { Ev, Gv, CL }, 0 },
2820 { REG_TABLE (REG_0FA6) },
2821 { REG_TABLE (REG_0FA7) },
2822 /* a8 */
2823 { "pushT", { gs }, 0 },
2824 { "popT", { gs }, 0 },
2825 { "rsm", { XX }, 0 },
2826 { "btsS", { Evh1, Gv }, 0 },
2827 { "shrdS", { Ev, Gv, Ib }, 0 },
2828 { "shrdS", { Ev, Gv, CL }, 0 },
2829 { REG_TABLE (REG_0FAE) },
2830 { "imulS", { Gv, Ev }, 0 },
2831 /* b0 */
2832 { "cmpxchgB", { Ebh1, Gb }, 0 },
2833 { "cmpxchgS", { Evh1, Gv }, 0 },
2834 { MOD_TABLE (MOD_0FB2) },
2835 { "btrS", { Evh1, Gv }, 0 },
2836 { MOD_TABLE (MOD_0FB4) },
2837 { MOD_TABLE (MOD_0FB5) },
2838 { "movz{bR|x}", { Gv, Eb }, 0 },
2839 { "movz{wR|x}", { Gv, Ew }, 0 }, /* yes, there really is movzww ! */
2840 /* b8 */
2841 { PREFIX_TABLE (PREFIX_0FB8) },
2842 { "ud1S", { Gv, Ev }, 0 },
2843 { REG_TABLE (REG_0FBA) },
2844 { "btcS", { Evh1, Gv }, 0 },
2845 { PREFIX_TABLE (PREFIX_0FBC) },
2846 { PREFIX_TABLE (PREFIX_0FBD) },
2847 { "movs{bR|x}", { Gv, Eb }, 0 },
2848 { "movs{wR|x}", { Gv, Ew }, 0 }, /* yes, there really is movsww ! */
2849 /* c0 */
2850 { "xaddB", { Ebh1, Gb }, 0 },
2851 { "xaddS", { Evh1, Gv }, 0 },
2852 { PREFIX_TABLE (PREFIX_0FC2) },
2853 { MOD_TABLE (MOD_0FC3) },
2854 { "pinsrw", { MX, Edqw, Ib }, PREFIX_OPCODE },
2855 { "pextrw", { Gdq, MS, Ib }, PREFIX_OPCODE },
2856 { "shufpX", { XM, EXx, Ib }, PREFIX_OPCODE },
2857 { REG_TABLE (REG_0FC7) },
2858 /* c8 */
2859 { "bswap", { RMeAX }, 0 },
2860 { "bswap", { RMeCX }, 0 },
2861 { "bswap", { RMeDX }, 0 },
2862 { "bswap", { RMeBX }, 0 },
2863 { "bswap", { RMeSP }, 0 },
2864 { "bswap", { RMeBP }, 0 },
2865 { "bswap", { RMeSI }, 0 },
2866 { "bswap", { RMeDI }, 0 },
2867 /* d0 */
2868 { PREFIX_TABLE (PREFIX_0FD0) },
2869 { "psrlw", { MX, EM }, PREFIX_OPCODE },
2870 { "psrld", { MX, EM }, PREFIX_OPCODE },
2871 { "psrlq", { MX, EM }, PREFIX_OPCODE },
2872 { "paddq", { MX, EM }, PREFIX_OPCODE },
2873 { "pmullw", { MX, EM }, PREFIX_OPCODE },
2874 { PREFIX_TABLE (PREFIX_0FD6) },
2875 { MOD_TABLE (MOD_0FD7) },
2876 /* d8 */
2877 { "psubusb", { MX, EM }, PREFIX_OPCODE },
2878 { "psubusw", { MX, EM }, PREFIX_OPCODE },
2879 { "pminub", { MX, EM }, PREFIX_OPCODE },
2880 { "pand", { MX, EM }, PREFIX_OPCODE },
2881 { "paddusb", { MX, EM }, PREFIX_OPCODE },
2882 { "paddusw", { MX, EM }, PREFIX_OPCODE },
2883 { "pmaxub", { MX, EM }, PREFIX_OPCODE },
2884 { "pandn", { MX, EM }, PREFIX_OPCODE },
2885 /* e0 */
2886 { "pavgb", { MX, EM }, PREFIX_OPCODE },
2887 { "psraw", { MX, EM }, PREFIX_OPCODE },
2888 { "psrad", { MX, EM }, PREFIX_OPCODE },
2889 { "pavgw", { MX, EM }, PREFIX_OPCODE },
2890 { "pmulhuw", { MX, EM }, PREFIX_OPCODE },
2891 { "pmulhw", { MX, EM }, PREFIX_OPCODE },
2892 { PREFIX_TABLE (PREFIX_0FE6) },
2893 { PREFIX_TABLE (PREFIX_0FE7) },
2894 /* e8 */
2895 { "psubsb", { MX, EM }, PREFIX_OPCODE },
2896 { "psubsw", { MX, EM }, PREFIX_OPCODE },
2897 { "pminsw", { MX, EM }, PREFIX_OPCODE },
2898 { "por", { MX, EM }, PREFIX_OPCODE },
2899 { "paddsb", { MX, EM }, PREFIX_OPCODE },
2900 { "paddsw", { MX, EM }, PREFIX_OPCODE },
2901 { "pmaxsw", { MX, EM }, PREFIX_OPCODE },
2902 { "pxor", { MX, EM }, PREFIX_OPCODE },
2903 /* f0 */
2904 { PREFIX_TABLE (PREFIX_0FF0) },
2905 { "psllw", { MX, EM }, PREFIX_OPCODE },
2906 { "pslld", { MX, EM }, PREFIX_OPCODE },
2907 { "psllq", { MX, EM }, PREFIX_OPCODE },
2908 { "pmuludq", { MX, EM }, PREFIX_OPCODE },
2909 { "pmaddwd", { MX, EM }, PREFIX_OPCODE },
2910 { "psadbw", { MX, EM }, PREFIX_OPCODE },
2911 { PREFIX_TABLE (PREFIX_0FF7) },
2912 /* f8 */
2913 { "psubb", { MX, EM }, PREFIX_OPCODE },
2914 { "psubw", { MX, EM }, PREFIX_OPCODE },
2915 { "psubd", { MX, EM }, PREFIX_OPCODE },
2916 { "psubq", { MX, EM }, PREFIX_OPCODE },
2917 { "paddb", { MX, EM }, PREFIX_OPCODE },
2918 { "paddw", { MX, EM }, PREFIX_OPCODE },
2919 { "paddd", { MX, EM }, PREFIX_OPCODE },
2920 { "ud0S", { Gv, Ev }, 0 },
2921 };
2922
2923 static const unsigned char onebyte_has_modrm[256] = {
2924 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2925 /* ------------------------------- */
2926 /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
2927 /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
2928 /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
2929 /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
2930 /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
2931 /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
2932 /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
2933 /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
2934 /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
2935 /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
2936 /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
2937 /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
2938 /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
2939 /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
2940 /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
2941 /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1 /* f0 */
2942 /* ------------------------------- */
2943 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2944 };
2945
2946 static const unsigned char twobyte_has_modrm[256] = {
2947 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2948 /* ------------------------------- */
2949 /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
2950 /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
2951 /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
2952 /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
2953 /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
2954 /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
2955 /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
2956 /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
2957 /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
2958 /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
2959 /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
2960 /* b0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* bf */
2961 /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
2962 /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
2963 /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
2964 /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 /* ff */
2965 /* ------------------------------- */
2966 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2967 };
2968
2969 static char obuf[100];
2970 static char *obufp;
2971 static char *mnemonicendp;
2972 static char scratchbuf[100];
2973 static unsigned char *start_codep;
2974 static unsigned char *insn_codep;
2975 static unsigned char *codep;
2976 static unsigned char *end_codep;
2977 static int last_lock_prefix;
2978 static int last_repz_prefix;
2979 static int last_repnz_prefix;
2980 static int last_data_prefix;
2981 static int last_addr_prefix;
2982 static int last_rex_prefix;
2983 static int last_seg_prefix;
2984 static int fwait_prefix;
2985 /* The active segment register prefix. */
2986 static int active_seg_prefix;
2987 #define MAX_CODE_LENGTH 15
2988 /* We can up to 14 prefixes since the maximum instruction length is
2989 15bytes. */
2990 static int all_prefixes[MAX_CODE_LENGTH - 1];
2991 static disassemble_info *the_info;
2992 static struct
2993 {
2994 int mod;
2995 int reg;
2996 int rm;
2997 }
2998 modrm;
2999 static unsigned char need_modrm;
3000 static struct
3001 {
3002 int scale;
3003 int index;
3004 int base;
3005 }
3006 sib;
3007 static struct
3008 {
3009 int register_specifier;
3010 int length;
3011 int prefix;
3012 int w;
3013 int evex;
3014 int r;
3015 int v;
3016 int mask_register_specifier;
3017 int zeroing;
3018 int ll;
3019 int b;
3020 }
3021 vex;
3022 static unsigned char need_vex;
3023 static unsigned char need_vex_reg;
3024 static unsigned char vex_w_done;
3025
3026 struct op
3027 {
3028 const char *name;
3029 unsigned int len;
3030 };
3031
3032 /* If we are accessing mod/rm/reg without need_modrm set, then the
3033 values are stale. Hitting this abort likely indicates that you
3034 need to update onebyte_has_modrm or twobyte_has_modrm. */
3035 #define MODRM_CHECK if (!need_modrm) abort ()
3036
3037 static const char **names64;
3038 static const char **names32;
3039 static const char **names16;
3040 static const char **names8;
3041 static const char **names8rex;
3042 static const char **names_seg;
3043 static const char *index64;
3044 static const char *index32;
3045 static const char **index16;
3046 static const char **names_bnd;
3047
3048 static const char *intel_names64[] = {
3049 "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
3050 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
3051 };
3052 static const char *intel_names32[] = {
3053 "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
3054 "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
3055 };
3056 static const char *intel_names16[] = {
3057 "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
3058 "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
3059 };
3060 static const char *intel_names8[] = {
3061 "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
3062 };
3063 static const char *intel_names8rex[] = {
3064 "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
3065 "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
3066 };
3067 static const char *intel_names_seg[] = {
3068 "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
3069 };
3070 static const char *intel_index64 = "riz";
3071 static const char *intel_index32 = "eiz";
3072 static const char *intel_index16[] = {
3073 "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
3074 };
3075
3076 static const char *att_names64[] = {
3077 "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
3078 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
3079 };
3080 static const char *att_names32[] = {
3081 "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
3082 "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
3083 };
3084 static const char *att_names16[] = {
3085 "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
3086 "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
3087 };
3088 static const char *att_names8[] = {
3089 "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
3090 };
3091 static const char *att_names8rex[] = {
3092 "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
3093 "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
3094 };
3095 static const char *att_names_seg[] = {
3096 "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
3097 };
3098 static const char *att_index64 = "%riz";
3099 static const char *att_index32 = "%eiz";
3100 static const char *att_index16[] = {
3101 "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
3102 };
3103
3104 static const char **names_mm;
3105 static const char *intel_names_mm[] = {
3106 "mm0", "mm1", "mm2", "mm3",
3107 "mm4", "mm5", "mm6", "mm7"
3108 };
3109 static const char *att_names_mm[] = {
3110 "%mm0", "%mm1", "%mm2", "%mm3",
3111 "%mm4", "%mm5", "%mm6", "%mm7"
3112 };
3113
3114 static const char *intel_names_bnd[] = {
3115 "bnd0", "bnd1", "bnd2", "bnd3"
3116 };
3117
3118 static const char *att_names_bnd[] = {
3119 "%bnd0", "%bnd1", "%bnd2", "%bnd3"
3120 };
3121
3122 static const char **names_xmm;
3123 static const char *intel_names_xmm[] = {
3124 "xmm0", "xmm1", "xmm2", "xmm3",
3125 "xmm4", "xmm5", "xmm6", "xmm7",
3126 "xmm8", "xmm9", "xmm10", "xmm11",
3127 "xmm12", "xmm13", "xmm14", "xmm15",
3128 "xmm16", "xmm17", "xmm18", "xmm19",
3129 "xmm20", "xmm21", "xmm22", "xmm23",
3130 "xmm24", "xmm25", "xmm26", "xmm27",
3131 "xmm28", "xmm29", "xmm30", "xmm31"
3132 };
3133 static const char *att_names_xmm[] = {
3134 "%xmm0", "%xmm1", "%xmm2", "%xmm3",
3135 "%xmm4", "%xmm5", "%xmm6", "%xmm7",
3136 "%xmm8", "%xmm9", "%xmm10", "%xmm11",
3137 "%xmm12", "%xmm13", "%xmm14", "%xmm15",
3138 "%xmm16", "%xmm17", "%xmm18", "%xmm19",
3139 "%xmm20", "%xmm21", "%xmm22", "%xmm23",
3140 "%xmm24", "%xmm25", "%xmm26", "%xmm27",
3141 "%xmm28", "%xmm29", "%xmm30", "%xmm31"
3142 };
3143
3144 static const char **names_ymm;
3145 static const char *intel_names_ymm[] = {
3146 "ymm0", "ymm1", "ymm2", "ymm3",
3147 "ymm4", "ymm5", "ymm6", "ymm7",
3148 "ymm8", "ymm9", "ymm10", "ymm11",
3149 "ymm12", "ymm13", "ymm14", "ymm15",
3150 "ymm16", "ymm17", "ymm18", "ymm19",
3151 "ymm20", "ymm21", "ymm22", "ymm23",
3152 "ymm24", "ymm25", "ymm26", "ymm27",
3153 "ymm28", "ymm29", "ymm30", "ymm31"
3154 };
3155 static const char *att_names_ymm[] = {
3156 "%ymm0", "%ymm1", "%ymm2", "%ymm3",
3157 "%ymm4", "%ymm5", "%ymm6", "%ymm7",
3158 "%ymm8", "%ymm9", "%ymm10", "%ymm11",
3159 "%ymm12", "%ymm13", "%ymm14", "%ymm15",
3160 "%ymm16", "%ymm17", "%ymm18", "%ymm19",
3161 "%ymm20", "%ymm21", "%ymm22", "%ymm23",
3162 "%ymm24", "%ymm25", "%ymm26", "%ymm27",
3163 "%ymm28", "%ymm29", "%ymm30", "%ymm31"
3164 };
3165
3166 static const char **names_zmm;
3167 static const char *intel_names_zmm[] = {
3168 "zmm0", "zmm1", "zmm2", "zmm3",
3169 "zmm4", "zmm5", "zmm6", "zmm7",
3170 "zmm8", "zmm9", "zmm10", "zmm11",
3171 "zmm12", "zmm13", "zmm14", "zmm15",
3172 "zmm16", "zmm17", "zmm18", "zmm19",
3173 "zmm20", "zmm21", "zmm22", "zmm23",
3174 "zmm24", "zmm25", "zmm26", "zmm27",
3175 "zmm28", "zmm29", "zmm30", "zmm31"
3176 };
3177 static const char *att_names_zmm[] = {
3178 "%zmm0", "%zmm1", "%zmm2", "%zmm3",
3179 "%zmm4", "%zmm5", "%zmm6", "%zmm7",
3180 "%zmm8", "%zmm9", "%zmm10", "%zmm11",
3181 "%zmm12", "%zmm13", "%zmm14", "%zmm15",
3182 "%zmm16", "%zmm17", "%zmm18", "%zmm19",
3183 "%zmm20", "%zmm21", "%zmm22", "%zmm23",
3184 "%zmm24", "%zmm25", "%zmm26", "%zmm27",
3185 "%zmm28", "%zmm29", "%zmm30", "%zmm31"
3186 };
3187
3188 static const char **names_mask;
3189 static const char *intel_names_mask[] = {
3190 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7"
3191 };
3192 static const char *att_names_mask[] = {
3193 "%k0", "%k1", "%k2", "%k3", "%k4", "%k5", "%k6", "%k7"
3194 };
3195
3196 static const char *names_rounding[] =
3197 {
3198 "{rn-sae}",
3199 "{rd-sae}",
3200 "{ru-sae}",
3201 "{rz-sae}"
3202 };
3203
3204 static const struct dis386 reg_table[][8] = {
3205 /* REG_80 */
3206 {
3207 { "addA", { Ebh1, Ib }, 0 },
3208 { "orA", { Ebh1, Ib }, 0 },
3209 { "adcA", { Ebh1, Ib }, 0 },
3210 { "sbbA", { Ebh1, Ib }, 0 },
3211 { "andA", { Ebh1, Ib }, 0 },
3212 { "subA", { Ebh1, Ib }, 0 },
3213 { "xorA", { Ebh1, Ib }, 0 },
3214 { "cmpA", { Eb, Ib }, 0 },
3215 },
3216 /* REG_81 */
3217 {
3218 { "addQ", { Evh1, Iv }, 0 },
3219 { "orQ", { Evh1, Iv }, 0 },
3220 { "adcQ", { Evh1, Iv }, 0 },
3221 { "sbbQ", { Evh1, Iv }, 0 },
3222 { "andQ", { Evh1, Iv }, 0 },
3223 { "subQ", { Evh1, Iv }, 0 },
3224 { "xorQ", { Evh1, Iv }, 0 },
3225 { "cmpQ", { Ev, Iv }, 0 },
3226 },
3227 /* REG_83 */
3228 {
3229 { "addQ", { Evh1, sIb }, 0 },
3230 { "orQ", { Evh1, sIb }, 0 },
3231 { "adcQ", { Evh1, sIb }, 0 },
3232 { "sbbQ", { Evh1, sIb }, 0 },
3233 { "andQ", { Evh1, sIb }, 0 },
3234 { "subQ", { Evh1, sIb }, 0 },
3235 { "xorQ", { Evh1, sIb }, 0 },
3236 { "cmpQ", { Ev, sIb }, 0 },
3237 },
3238 /* REG_8F */
3239 {
3240 { "popU", { stackEv }, 0 },
3241 { XOP_8F_TABLE (XOP_09) },
3242 { Bad_Opcode },
3243 { Bad_Opcode },
3244 { Bad_Opcode },
3245 { XOP_8F_TABLE (XOP_09) },
3246 },
3247 /* REG_C0 */
3248 {
3249 { "rolA", { Eb, Ib }, 0 },
3250 { "rorA", { Eb, Ib }, 0 },
3251 { "rclA", { Eb, Ib }, 0 },
3252 { "rcrA", { Eb, Ib }, 0 },
3253 { "shlA", { Eb, Ib }, 0 },
3254 { "shrA", { Eb, Ib }, 0 },
3255 { "shlA", { Eb, Ib }, 0 },
3256 { "sarA", { Eb, Ib }, 0 },
3257 },
3258 /* REG_C1 */
3259 {
3260 { "rolQ", { Ev, Ib }, 0 },
3261 { "rorQ", { Ev, Ib }, 0 },
3262 { "rclQ", { Ev, Ib }, 0 },
3263 { "rcrQ", { Ev, Ib }, 0 },
3264 { "shlQ", { Ev, Ib }, 0 },
3265 { "shrQ", { Ev, Ib }, 0 },
3266 { "shlQ", { Ev, Ib }, 0 },
3267 { "sarQ", { Ev, Ib }, 0 },
3268 },
3269 /* REG_C6 */
3270 {
3271 { "movA", { Ebh3, Ib }, 0 },
3272 { Bad_Opcode },
3273 { Bad_Opcode },
3274 { Bad_Opcode },
3275 { Bad_Opcode },
3276 { Bad_Opcode },
3277 { Bad_Opcode },
3278 { MOD_TABLE (MOD_C6_REG_7) },
3279 },
3280 /* REG_C7 */
3281 {
3282 { "movQ", { Evh3, Iv }, 0 },
3283 { Bad_Opcode },
3284 { Bad_Opcode },
3285 { Bad_Opcode },
3286 { Bad_Opcode },
3287 { Bad_Opcode },
3288 { Bad_Opcode },
3289 { MOD_TABLE (MOD_C7_REG_7) },
3290 },
3291 /* REG_D0 */
3292 {
3293 { "rolA", { Eb, I1 }, 0 },
3294 { "rorA", { Eb, I1 }, 0 },
3295 { "rclA", { Eb, I1 }, 0 },
3296 { "rcrA", { Eb, I1 }, 0 },
3297 { "shlA", { Eb, I1 }, 0 },
3298 { "shrA", { Eb, I1 }, 0 },
3299 { "shlA", { Eb, I1 }, 0 },
3300 { "sarA", { Eb, I1 }, 0 },
3301 },
3302 /* REG_D1 */
3303 {
3304 { "rolQ", { Ev, I1 }, 0 },
3305 { "rorQ", { Ev, I1 }, 0 },
3306 { "rclQ", { Ev, I1 }, 0 },
3307 { "rcrQ", { Ev, I1 }, 0 },
3308 { "shlQ", { Ev, I1 }, 0 },
3309 { "shrQ", { Ev, I1 }, 0 },
3310 { "shlQ", { Ev, I1 }, 0 },
3311 { "sarQ", { Ev, I1 }, 0 },
3312 },
3313 /* REG_D2 */
3314 {
3315 { "rolA", { Eb, CL }, 0 },
3316 { "rorA", { Eb, CL }, 0 },
3317 { "rclA", { Eb, CL }, 0 },
3318 { "rcrA", { Eb, CL }, 0 },
3319 { "shlA", { Eb, CL }, 0 },
3320 { "shrA", { Eb, CL }, 0 },
3321 { "shlA", { Eb, CL }, 0 },
3322 { "sarA", { Eb, CL }, 0 },
3323 },
3324 /* REG_D3 */
3325 {
3326 { "rolQ", { Ev, CL }, 0 },
3327 { "rorQ", { Ev, CL }, 0 },
3328 { "rclQ", { Ev, CL }, 0 },
3329 { "rcrQ", { Ev, CL }, 0 },
3330 { "shlQ", { Ev, CL }, 0 },
3331 { "shrQ", { Ev, CL }, 0 },
3332 { "shlQ", { Ev, CL }, 0 },
3333 { "sarQ", { Ev, CL }, 0 },
3334 },
3335 /* REG_F6 */
3336 {
3337 { "testA", { Eb, Ib }, 0 },
3338 { "testA", { Eb, Ib }, 0 },
3339 { "notA", { Ebh1 }, 0 },
3340 { "negA", { Ebh1 }, 0 },
3341 { "mulA", { Eb }, 0 }, /* Don't print the implicit %al register, */
3342 { "imulA", { Eb }, 0 }, /* to distinguish these opcodes from other */
3343 { "divA", { Eb }, 0 }, /* mul/imul opcodes. Do the same for div */
3344 { "idivA", { Eb }, 0 }, /* and idiv for consistency. */
3345 },
3346 /* REG_F7 */
3347 {
3348 { "testQ", { Ev, Iv }, 0 },
3349 { "testQ", { Ev, Iv }, 0 },
3350 { "notQ", { Evh1 }, 0 },
3351 { "negQ", { Evh1 }, 0 },
3352 { "mulQ", { Ev }, 0 }, /* Don't print the implicit register. */
3353 { "imulQ", { Ev }, 0 },
3354 { "divQ", { Ev }, 0 },
3355 { "idivQ", { Ev }, 0 },
3356 },
3357 /* REG_FE */
3358 {
3359 { "incA", { Ebh1 }, 0 },
3360 { "decA", { Ebh1 }, 0 },
3361 },
3362 /* REG_FF */
3363 {
3364 { "incQ", { Evh1 }, 0 },
3365 { "decQ", { Evh1 }, 0 },
3366 { "call{&|}", { NOTRACK, indirEv, BND }, 0 },
3367 { MOD_TABLE (MOD_FF_REG_3) },
3368 { "jmp{&|}", { NOTRACK, indirEv, BND }, 0 },
3369 { MOD_TABLE (MOD_FF_REG_5) },
3370 { "pushU", { stackEv }, 0 },
3371 { Bad_Opcode },
3372 },
3373 /* REG_0F00 */
3374 {
3375 { "sldtD", { Sv }, 0 },
3376 { "strD", { Sv }, 0 },
3377 { "lldt", { Ew }, 0 },
3378 { "ltr", { Ew }, 0 },
3379 { "verr", { Ew }, 0 },
3380 { "verw", { Ew }, 0 },
3381 { Bad_Opcode },
3382 { Bad_Opcode },
3383 },
3384 /* REG_0F01 */
3385 {
3386 { MOD_TABLE (MOD_0F01_REG_0) },
3387 { MOD_TABLE (MOD_0F01_REG_1) },
3388 { MOD_TABLE (MOD_0F01_REG_2) },
3389 { MOD_TABLE (MOD_0F01_REG_3) },
3390 { "smswD", { Sv }, 0 },
3391 { MOD_TABLE (MOD_0F01_REG_5) },
3392 { "lmsw", { Ew }, 0 },
3393 { MOD_TABLE (MOD_0F01_REG_7) },
3394 },
3395 /* REG_0F0D */
3396 {
3397 { "prefetch", { Mb }, 0 },
3398 { "prefetchw", { Mb }, 0 },
3399 { "prefetchwt1", { Mb }, 0 },
3400 { "prefetch", { Mb }, 0 },
3401 { "prefetch", { Mb }, 0 },
3402 { "prefetch", { Mb }, 0 },
3403 { "prefetch", { Mb }, 0 },
3404 { "prefetch", { Mb }, 0 },
3405 },
3406 /* REG_0F18 */
3407 {
3408 { MOD_TABLE (MOD_0F18_REG_0) },
3409 { MOD_TABLE (MOD_0F18_REG_1) },
3410 { MOD_TABLE (MOD_0F18_REG_2) },
3411 { MOD_TABLE (MOD_0F18_REG_3) },
3412 { MOD_TABLE (MOD_0F18_REG_4) },
3413 { MOD_TABLE (MOD_0F18_REG_5) },
3414 { MOD_TABLE (MOD_0F18_REG_6) },
3415 { MOD_TABLE (MOD_0F18_REG_7) },
3416 },
3417 /* REG_0F1C_MOD_0 */
3418 {
3419 { "cldemote", { Mb }, 0 },
3420 { "nopQ", { Ev }, 0 },
3421 { "nopQ", { Ev }, 0 },
3422 { "nopQ", { Ev }, 0 },
3423 { "nopQ", { Ev }, 0 },
3424 { "nopQ", { Ev }, 0 },
3425 { "nopQ", { Ev }, 0 },
3426 { "nopQ", { Ev }, 0 },
3427 },
3428 /* REG_0F1E_MOD_3 */
3429 {
3430 { "nopQ", { Ev }, 0 },
3431 { "rdsspK", { Rdq }, PREFIX_OPCODE },
3432 { "nopQ", { Ev }, 0 },
3433 { "nopQ", { Ev }, 0 },
3434 { "nopQ", { Ev }, 0 },
3435 { "nopQ", { Ev }, 0 },
3436 { "nopQ", { Ev }, 0 },
3437 { RM_TABLE (RM_0F1E_MOD_3_REG_7) },
3438 },
3439 /* REG_0F71 */
3440 {
3441 { Bad_Opcode },
3442 { Bad_Opcode },
3443 { MOD_TABLE (MOD_0F71_REG_2) },
3444 { Bad_Opcode },
3445 { MOD_TABLE (MOD_0F71_REG_4) },
3446 { Bad_Opcode },
3447 { MOD_TABLE (MOD_0F71_REG_6) },
3448 },
3449 /* REG_0F72 */
3450 {
3451 { Bad_Opcode },
3452 { Bad_Opcode },
3453 { MOD_TABLE (MOD_0F72_REG_2) },
3454 { Bad_Opcode },
3455 { MOD_TABLE (MOD_0F72_REG_4) },
3456 { Bad_Opcode },
3457 { MOD_TABLE (MOD_0F72_REG_6) },
3458 },
3459 /* REG_0F73 */
3460 {
3461 { Bad_Opcode },
3462 { Bad_Opcode },
3463 { MOD_TABLE (MOD_0F73_REG_2) },
3464 { MOD_TABLE (MOD_0F73_REG_3) },
3465 { Bad_Opcode },
3466 { Bad_Opcode },
3467 { MOD_TABLE (MOD_0F73_REG_6) },
3468 { MOD_TABLE (MOD_0F73_REG_7) },
3469 },
3470 /* REG_0FA6 */
3471 {
3472 { "montmul", { { OP_0f07, 0 } }, 0 },
3473 { "xsha1", { { OP_0f07, 0 } }, 0 },
3474 { "xsha256", { { OP_0f07, 0 } }, 0 },
3475 },
3476 /* REG_0FA7 */
3477 {
3478 { "xstore-rng", { { OP_0f07, 0 } }, 0 },
3479 { "xcrypt-ecb", { { OP_0f07, 0 } }, 0 },
3480 { "xcrypt-cbc", { { OP_0f07, 0 } }, 0 },
3481 { "xcrypt-ctr", { { OP_0f07, 0 } }, 0 },
3482 { "xcrypt-cfb", { { OP_0f07, 0 } }, 0 },
3483 { "xcrypt-ofb", { { OP_0f07, 0 } }, 0 },
3484 },
3485 /* REG_0FAE */
3486 {
3487 { MOD_TABLE (MOD_0FAE_REG_0) },
3488 { MOD_TABLE (MOD_0FAE_REG_1) },
3489 { MOD_TABLE (MOD_0FAE_REG_2) },
3490 { MOD_TABLE (MOD_0FAE_REG_3) },
3491 { MOD_TABLE (MOD_0FAE_REG_4) },
3492 { MOD_TABLE (MOD_0FAE_REG_5) },
3493 { MOD_TABLE (MOD_0FAE_REG_6) },
3494 { MOD_TABLE (MOD_0FAE_REG_7) },
3495 },
3496 /* REG_0FBA */
3497 {
3498 { Bad_Opcode },
3499 { Bad_Opcode },
3500 { Bad_Opcode },
3501 { Bad_Opcode },
3502 { "btQ", { Ev, Ib }, 0 },
3503 { "btsQ", { Evh1, Ib }, 0 },
3504 { "btrQ", { Evh1, Ib }, 0 },
3505 { "btcQ", { Evh1, Ib }, 0 },
3506 },
3507 /* REG_0FC7 */
3508 {
3509 { Bad_Opcode },
3510 { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } }, 0 },
3511 { Bad_Opcode },
3512 { MOD_TABLE (MOD_0FC7_REG_3) },
3513 { MOD_TABLE (MOD_0FC7_REG_4) },
3514 { MOD_TABLE (MOD_0FC7_REG_5) },
3515 { MOD_TABLE (MOD_0FC7_REG_6) },
3516 { MOD_TABLE (MOD_0FC7_REG_7) },
3517 },
3518 /* REG_VEX_0F71 */
3519 {
3520 { Bad_Opcode },
3521 { Bad_Opcode },
3522 { MOD_TABLE (MOD_VEX_0F71_REG_2) },
3523 { Bad_Opcode },
3524 { MOD_TABLE (MOD_VEX_0F71_REG_4) },
3525 { Bad_Opcode },
3526 { MOD_TABLE (MOD_VEX_0F71_REG_6) },
3527 },
3528 /* REG_VEX_0F72 */
3529 {
3530 { Bad_Opcode },
3531 { Bad_Opcode },
3532 { MOD_TABLE (MOD_VEX_0F72_REG_2) },
3533 { Bad_Opcode },
3534 { MOD_TABLE (MOD_VEX_0F72_REG_4) },
3535 { Bad_Opcode },
3536 { MOD_TABLE (MOD_VEX_0F72_REG_6) },
3537 },
3538 /* REG_VEX_0F73 */
3539 {
3540 { Bad_Opcode },
3541 { Bad_Opcode },
3542 { MOD_TABLE (MOD_VEX_0F73_REG_2) },
3543 { MOD_TABLE (MOD_VEX_0F73_REG_3) },
3544 { Bad_Opcode },
3545 { Bad_Opcode },
3546 { MOD_TABLE (MOD_VEX_0F73_REG_6) },
3547 { MOD_TABLE (MOD_VEX_0F73_REG_7) },
3548 },
3549 /* REG_VEX_0FAE */
3550 {
3551 { Bad_Opcode },
3552 { Bad_Opcode },
3553 { MOD_TABLE (MOD_VEX_0FAE_REG_2) },
3554 { MOD_TABLE (MOD_VEX_0FAE_REG_3) },
3555 },
3556 /* REG_VEX_0F38F3 */
3557 {
3558 { Bad_Opcode },
3559 { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_1) },
3560 { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_2) },
3561 { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_3) },
3562 },
3563 /* REG_XOP_LWPCB */
3564 {
3565 { "llwpcb", { { OP_LWPCB_E, 0 } }, 0 },
3566 { "slwpcb", { { OP_LWPCB_E, 0 } }, 0 },
3567 },
3568 /* REG_XOP_LWP */
3569 {
3570 { "lwpins", { { OP_LWP_E, 0 }, Ed, Iq }, 0 },
3571 { "lwpval", { { OP_LWP_E, 0 }, Ed, Iq }, 0 },
3572 },
3573 /* REG_XOP_TBM_01 */
3574 {
3575 { Bad_Opcode },
3576 { "blcfill", { { OP_LWP_E, 0 }, Ev }, 0 },
3577 { "blsfill", { { OP_LWP_E, 0 }, Ev }, 0 },
3578 { "blcs", { { OP_LWP_E, 0 }, Ev }, 0 },
3579 { "tzmsk", { { OP_LWP_E, 0 }, Ev }, 0 },
3580 { "blcic", { { OP_LWP_E, 0 }, Ev }, 0 },
3581 { "blsic", { { OP_LWP_E, 0 }, Ev }, 0 },
3582 { "t1mskc", { { OP_LWP_E, 0 }, Ev }, 0 },
3583 },
3584 /* REG_XOP_TBM_02 */
3585 {
3586 { Bad_Opcode },
3587 { "blcmsk", { { OP_LWP_E, 0 }, Ev }, 0 },
3588 { Bad_Opcode },
3589 { Bad_Opcode },
3590 { Bad_Opcode },
3591 { Bad_Opcode },
3592 { "blci", { { OP_LWP_E, 0 }, Ev }, 0 },
3593 },
3594 #define NEED_REG_TABLE
3595 #include "i386-dis-evex.h"
3596 #undef NEED_REG_TABLE
3597 };
3598
3599 static const struct dis386 prefix_table[][4] = {
3600 /* PREFIX_90 */
3601 {
3602 { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } }, 0 },
3603 { "pause", { XX }, 0 },
3604 { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } }, 0 },
3605 { NULL, { { NULL, 0 } }, PREFIX_IGNORED }
3606 },
3607
3608 /* PREFIX_MOD_0_0F01_REG_5 */
3609 {
3610 { Bad_Opcode },
3611 { "rstorssp", { Mq }, PREFIX_OPCODE },
3612 },
3613
3614 /* PREFIX_MOD_3_0F01_REG_5_RM_0 */
3615 {
3616 { Bad_Opcode },
3617 { "setssbsy", { Skip_MODRM }, PREFIX_OPCODE },
3618 },
3619
3620 /* PREFIX_MOD_3_0F01_REG_5_RM_2 */
3621 {
3622 { Bad_Opcode },
3623 { "saveprevssp", { Skip_MODRM }, PREFIX_OPCODE },
3624 },
3625
3626 /* PREFIX_0F09 */
3627 {
3628 { "wbinvd", { XX }, 0 },
3629 { "wbnoinvd", { XX }, 0 },
3630 },
3631
3632 /* PREFIX_0F10 */
3633 {
3634 { "movups", { XM, EXx }, PREFIX_OPCODE },
3635 { "movss", { XM, EXd }, PREFIX_OPCODE },
3636 { "movupd", { XM, EXx }, PREFIX_OPCODE },
3637 { "movsd", { XM, EXq }, PREFIX_OPCODE },
3638 },
3639
3640 /* PREFIX_0F11 */
3641 {
3642 { "movups", { EXxS, XM }, PREFIX_OPCODE },
3643 { "movss", { EXdS, XM }, PREFIX_OPCODE },
3644 { "movupd", { EXxS, XM }, PREFIX_OPCODE },
3645 { "movsd", { EXqS, XM }, PREFIX_OPCODE },
3646 },
3647
3648 /* PREFIX_0F12 */
3649 {
3650 { MOD_TABLE (MOD_0F12_PREFIX_0) },
3651 { "movsldup", { XM, EXx }, PREFIX_OPCODE },
3652 { "movlpd", { XM, EXq }, PREFIX_OPCODE },
3653 { "movddup", { XM, EXq }, PREFIX_OPCODE },
3654 },
3655
3656 /* PREFIX_0F16 */
3657 {
3658 { MOD_TABLE (MOD_0F16_PREFIX_0) },
3659 { "movshdup", { XM, EXx }, PREFIX_OPCODE },
3660 { "movhpd", { XM, EXq }, PREFIX_OPCODE },
3661 },
3662
3663 /* PREFIX_0F1A */
3664 {
3665 { MOD_TABLE (MOD_0F1A_PREFIX_0) },
3666 { "bndcl", { Gbnd, Ev_bnd }, 0 },
3667 { "bndmov", { Gbnd, Ebnd }, 0 },
3668 { "bndcu", { Gbnd, Ev_bnd }, 0 },
3669 },
3670
3671 /* PREFIX_0F1B */
3672 {
3673 { MOD_TABLE (MOD_0F1B_PREFIX_0) },
3674 { MOD_TABLE (MOD_0F1B_PREFIX_1) },
3675 { "bndmov", { EbndS, Gbnd }, 0 },
3676 { "bndcn", { Gbnd, Ev_bnd }, 0 },
3677 },
3678
3679 /* PREFIX_0F1C */
3680 {
3681 { MOD_TABLE (MOD_0F1C_PREFIX_0) },
3682 { "nopQ", { Ev }, PREFIX_OPCODE },
3683 { "nopQ", { Ev }, PREFIX_OPCODE },
3684 { "nopQ", { Ev }, PREFIX_OPCODE },
3685 },
3686
3687 /* PREFIX_0F1E */
3688 {
3689 { "nopQ", { Ev }, PREFIX_OPCODE },
3690 { MOD_TABLE (MOD_0F1E_PREFIX_1) },
3691 { "nopQ", { Ev }, PREFIX_OPCODE },
3692 { "nopQ", { Ev }, PREFIX_OPCODE },
3693 },
3694
3695 /* PREFIX_0F2A */
3696 {
3697 { "cvtpi2ps", { XM, EMCq }, PREFIX_OPCODE },
3698 { "cvtsi2ss%LQ", { XM, Ev }, PREFIX_OPCODE },
3699 { "cvtpi2pd", { XM, EMCq }, PREFIX_OPCODE },
3700 { "cvtsi2sd%LQ", { XM, Ev }, 0 },
3701 },
3702
3703 /* PREFIX_0F2B */
3704 {
3705 { MOD_TABLE (MOD_0F2B_PREFIX_0) },
3706 { MOD_TABLE (MOD_0F2B_PREFIX_1) },
3707 { MOD_TABLE (MOD_0F2B_PREFIX_2) },
3708 { MOD_TABLE (MOD_0F2B_PREFIX_3) },
3709 },
3710
3711 /* PREFIX_0F2C */
3712 {
3713 { "cvttps2pi", { MXC, EXq }, PREFIX_OPCODE },
3714 { "cvttss2si", { Gv, EXd }, PREFIX_OPCODE },
3715 { "cvttpd2pi", { MXC, EXx }, PREFIX_OPCODE },
3716 { "cvttsd2si", { Gv, EXq }, PREFIX_OPCODE },
3717 },
3718
3719 /* PREFIX_0F2D */
3720 {
3721 { "cvtps2pi", { MXC, EXq }, PREFIX_OPCODE },
3722 { "cvtss2si", { Gv, EXd }, PREFIX_OPCODE },
3723 { "cvtpd2pi", { MXC, EXx }, PREFIX_OPCODE },
3724 { "cvtsd2si", { Gv, EXq }, PREFIX_OPCODE },
3725 },
3726
3727 /* PREFIX_0F2E */
3728 {
3729 { "ucomiss",{ XM, EXd }, 0 },
3730 { Bad_Opcode },
3731 { "ucomisd",{ XM, EXq }, 0 },
3732 },
3733
3734 /* PREFIX_0F2F */
3735 {
3736 { "comiss", { XM, EXd }, 0 },
3737 { Bad_Opcode },
3738 { "comisd", { XM, EXq }, 0 },
3739 },
3740
3741 /* PREFIX_0F51 */
3742 {
3743 { "sqrtps", { XM, EXx }, PREFIX_OPCODE },
3744 { "sqrtss", { XM, EXd }, PREFIX_OPCODE },
3745 { "sqrtpd", { XM, EXx }, PREFIX_OPCODE },
3746 { "sqrtsd", { XM, EXq }, PREFIX_OPCODE },
3747 },
3748
3749 /* PREFIX_0F52 */
3750 {
3751 { "rsqrtps",{ XM, EXx }, PREFIX_OPCODE },
3752 { "rsqrtss",{ XM, EXd }, PREFIX_OPCODE },
3753 },
3754
3755 /* PREFIX_0F53 */
3756 {
3757 { "rcpps", { XM, EXx }, PREFIX_OPCODE },
3758 { "rcpss", { XM, EXd }, PREFIX_OPCODE },
3759 },
3760
3761 /* PREFIX_0F58 */
3762 {
3763 { "addps", { XM, EXx }, PREFIX_OPCODE },
3764 { "addss", { XM, EXd }, PREFIX_OPCODE },
3765 { "addpd", { XM, EXx }, PREFIX_OPCODE },
3766 { "addsd", { XM, EXq }, PREFIX_OPCODE },
3767 },
3768
3769 /* PREFIX_0F59 */
3770 {
3771 { "mulps", { XM, EXx }, PREFIX_OPCODE },
3772 { "mulss", { XM, EXd }, PREFIX_OPCODE },
3773 { "mulpd", { XM, EXx }, PREFIX_OPCODE },
3774 { "mulsd", { XM, EXq }, PREFIX_OPCODE },
3775 },
3776
3777 /* PREFIX_0F5A */
3778 {
3779 { "cvtps2pd", { XM, EXq }, PREFIX_OPCODE },
3780 { "cvtss2sd", { XM, EXd }, PREFIX_OPCODE },
3781 { "cvtpd2ps", { XM, EXx }, PREFIX_OPCODE },
3782 { "cvtsd2ss", { XM, EXq }, PREFIX_OPCODE },
3783 },
3784
3785 /* PREFIX_0F5B */
3786 {
3787 { "cvtdq2ps", { XM, EXx }, PREFIX_OPCODE },
3788 { "cvttps2dq", { XM, EXx }, PREFIX_OPCODE },
3789 { "cvtps2dq", { XM, EXx }, PREFIX_OPCODE },
3790 },
3791
3792 /* PREFIX_0F5C */
3793 {
3794 { "subps", { XM, EXx }, PREFIX_OPCODE },
3795 { "subss", { XM, EXd }, PREFIX_OPCODE },
3796 { "subpd", { XM, EXx }, PREFIX_OPCODE },
3797 { "subsd", { XM, EXq }, PREFIX_OPCODE },
3798 },
3799
3800 /* PREFIX_0F5D */
3801 {
3802 { "minps", { XM, EXx }, PREFIX_OPCODE },
3803 { "minss", { XM, EXd }, PREFIX_OPCODE },
3804 { "minpd", { XM, EXx }, PREFIX_OPCODE },
3805 { "minsd", { XM, EXq }, PREFIX_OPCODE },
3806 },
3807
3808 /* PREFIX_0F5E */
3809 {
3810 { "divps", { XM, EXx }, PREFIX_OPCODE },
3811 { "divss", { XM, EXd }, PREFIX_OPCODE },
3812 { "divpd", { XM, EXx }, PREFIX_OPCODE },
3813 { "divsd", { XM, EXq }, PREFIX_OPCODE },
3814 },
3815
3816 /* PREFIX_0F5F */
3817 {
3818 { "maxps", { XM, EXx }, PREFIX_OPCODE },
3819 { "maxss", { XM, EXd }, PREFIX_OPCODE },
3820 { "maxpd", { XM, EXx }, PREFIX_OPCODE },
3821 { "maxsd", { XM, EXq }, PREFIX_OPCODE },
3822 },
3823
3824 /* PREFIX_0F60 */
3825 {
3826 { "punpcklbw",{ MX, EMd }, PREFIX_OPCODE },
3827 { Bad_Opcode },
3828 { "punpcklbw",{ MX, EMx }, PREFIX_OPCODE },
3829 },
3830
3831 /* PREFIX_0F61 */
3832 {
3833 { "punpcklwd",{ MX, EMd }, PREFIX_OPCODE },
3834 { Bad_Opcode },
3835 { "punpcklwd",{ MX, EMx }, PREFIX_OPCODE },
3836 },
3837
3838 /* PREFIX_0F62 */
3839 {
3840 { "punpckldq",{ MX, EMd }, PREFIX_OPCODE },
3841 { Bad_Opcode },
3842 { "punpckldq",{ MX, EMx }, PREFIX_OPCODE },
3843 },
3844
3845 /* PREFIX_0F6C */
3846 {
3847 { Bad_Opcode },
3848 { Bad_Opcode },
3849 { "punpcklqdq", { XM, EXx }, PREFIX_OPCODE },
3850 },
3851
3852 /* PREFIX_0F6D */
3853 {
3854 { Bad_Opcode },
3855 { Bad_Opcode },
3856 { "punpckhqdq", { XM, EXx }, PREFIX_OPCODE },
3857 },
3858
3859 /* PREFIX_0F6F */
3860 {
3861 { "movq", { MX, EM }, PREFIX_OPCODE },
3862 { "movdqu", { XM, EXx }, PREFIX_OPCODE },
3863 { "movdqa", { XM, EXx }, PREFIX_OPCODE },
3864 },
3865
3866 /* PREFIX_0F70 */
3867 {
3868 { "pshufw", { MX, EM, Ib }, PREFIX_OPCODE },
3869 { "pshufhw",{ XM, EXx, Ib }, PREFIX_OPCODE },
3870 { "pshufd", { XM, EXx, Ib }, PREFIX_OPCODE },
3871 { "pshuflw",{ XM, EXx, Ib }, PREFIX_OPCODE },
3872 },
3873
3874 /* PREFIX_0F73_REG_3 */
3875 {
3876 { Bad_Opcode },
3877 { Bad_Opcode },
3878 { "psrldq", { XS, Ib }, 0 },
3879 },
3880
3881 /* PREFIX_0F73_REG_7 */
3882 {
3883 { Bad_Opcode },
3884 { Bad_Opcode },
3885 { "pslldq", { XS, Ib }, 0 },
3886 },
3887
3888 /* PREFIX_0F78 */
3889 {
3890 {"vmread", { Em, Gm }, 0 },
3891 { Bad_Opcode },
3892 {"extrq", { XS, Ib, Ib }, 0 },
3893 {"insertq", { XM, XS, Ib, Ib }, 0 },
3894 },
3895
3896 /* PREFIX_0F79 */
3897 {
3898 {"vmwrite", { Gm, Em }, 0 },
3899 { Bad_Opcode },
3900 {"extrq", { XM, XS }, 0 },
3901 {"insertq", { XM, XS }, 0 },
3902 },
3903
3904 /* PREFIX_0F7C */
3905 {
3906 { Bad_Opcode },
3907 { Bad_Opcode },
3908 { "haddpd", { XM, EXx }, PREFIX_OPCODE },
3909 { "haddps", { XM, EXx }, PREFIX_OPCODE },
3910 },
3911
3912 /* PREFIX_0F7D */
3913 {
3914 { Bad_Opcode },
3915 { Bad_Opcode },
3916 { "hsubpd", { XM, EXx }, PREFIX_OPCODE },
3917 { "hsubps", { XM, EXx }, PREFIX_OPCODE },
3918 },
3919
3920 /* PREFIX_0F7E */
3921 {
3922 { "movK", { Edq, MX }, PREFIX_OPCODE },
3923 { "movq", { XM, EXq }, PREFIX_OPCODE },
3924 { "movK", { Edq, XM }, PREFIX_OPCODE },
3925 },
3926
3927 /* PREFIX_0F7F */
3928 {
3929 { "movq", { EMS, MX }, PREFIX_OPCODE },
3930 { "movdqu", { EXxS, XM }, PREFIX_OPCODE },
3931 { "movdqa", { EXxS, XM }, PREFIX_OPCODE },
3932 },
3933
3934 /* PREFIX_0FAE_REG_0 */
3935 {
3936 { Bad_Opcode },
3937 { "rdfsbase", { Ev }, 0 },
3938 },
3939
3940 /* PREFIX_0FAE_REG_1 */
3941 {
3942 { Bad_Opcode },
3943 { "rdgsbase", { Ev }, 0 },
3944 },
3945
3946 /* PREFIX_0FAE_REG_2 */
3947 {
3948 { Bad_Opcode },
3949 { "wrfsbase", { Ev }, 0 },
3950 },
3951
3952 /* PREFIX_0FAE_REG_3 */
3953 {
3954 { Bad_Opcode },
3955 { "wrgsbase", { Ev }, 0 },
3956 },
3957
3958 /* PREFIX_MOD_0_0FAE_REG_4 */
3959 {
3960 { "xsave", { FXSAVE }, 0 },
3961 { "ptwrite%LQ", { Edq }, 0 },
3962 },
3963
3964 /* PREFIX_MOD_3_0FAE_REG_4 */
3965 {
3966 { Bad_Opcode },
3967 { "ptwrite%LQ", { Edq }, 0 },
3968 },
3969
3970 /* PREFIX_MOD_0_0FAE_REG_5 */
3971 {
3972 { "xrstor", { FXSAVE }, PREFIX_OPCODE },
3973 },
3974
3975 /* PREFIX_MOD_3_0FAE_REG_5 */
3976 {
3977 { "lfence", { Skip_MODRM }, 0 },
3978 { "incsspK", { Rdq }, PREFIX_OPCODE },
3979 },
3980
3981 /* PREFIX_MOD_0_0FAE_REG_6 */
3982 {
3983 { "xsaveopt", { FXSAVE }, PREFIX_OPCODE },
3984 { "clrssbsy", { Mq }, PREFIX_OPCODE },
3985 { "clwb", { Mb }, PREFIX_OPCODE },
3986 },
3987
3988 /* PREFIX_MOD_1_0FAE_REG_6 */
3989 {
3990 { RM_TABLE (RM_0FAE_REG_6) },
3991 { "umonitor", { Eva }, PREFIX_OPCODE },
3992 { "tpause", { Edq }, PREFIX_OPCODE },
3993 { "umwait", { Edq }, PREFIX_OPCODE },
3994 },
3995
3996 /* PREFIX_0FAE_REG_7 */
3997 {
3998 { "clflush", { Mb }, 0 },
3999 { Bad_Opcode },
4000 { "clflushopt", { Mb }, 0 },
4001 },
4002
4003 /* PREFIX_0FB8 */
4004 {
4005 { Bad_Opcode },
4006 { "popcntS", { Gv, Ev }, 0 },
4007 },
4008
4009 /* PREFIX_0FBC */
4010 {
4011 { "bsfS", { Gv, Ev }, 0 },
4012 { "tzcntS", { Gv, Ev }, 0 },
4013 { "bsfS", { Gv, Ev }, 0 },
4014 },
4015
4016 /* PREFIX_0FBD */
4017 {
4018 { "bsrS", { Gv, Ev }, 0 },
4019 { "lzcntS", { Gv, Ev }, 0 },
4020 { "bsrS", { Gv, Ev }, 0 },
4021 },
4022
4023 /* PREFIX_0FC2 */
4024 {
4025 { "cmpps", { XM, EXx, CMP }, PREFIX_OPCODE },
4026 { "cmpss", { XM, EXd, CMP }, PREFIX_OPCODE },
4027 { "cmppd", { XM, EXx, CMP }, PREFIX_OPCODE },
4028 { "cmpsd", { XM, EXq, CMP }, PREFIX_OPCODE },
4029 },
4030
4031 /* PREFIX_MOD_0_0FC3 */
4032 {
4033 { "movntiS", { Ev, Gv }, PREFIX_OPCODE },
4034 },
4035
4036 /* PREFIX_MOD_0_0FC7_REG_6 */
4037 {
4038 { "vmptrld",{ Mq }, 0 },
4039 { "vmxon", { Mq }, 0 },
4040 { "vmclear",{ Mq }, 0 },
4041 },
4042
4043 /* PREFIX_MOD_3_0FC7_REG_6 */
4044 {
4045 { "rdrand", { Ev }, 0 },
4046 { Bad_Opcode },
4047 { "rdrand", { Ev }, 0 }
4048 },
4049
4050 /* PREFIX_MOD_3_0FC7_REG_7 */
4051 {
4052 { "rdseed", { Ev }, 0 },
4053 { "rdpid", { Em }, 0 },
4054 { "rdseed", { Ev }, 0 },
4055 },
4056
4057 /* PREFIX_0FD0 */
4058 {
4059 { Bad_Opcode },
4060 { Bad_Opcode },
4061 { "addsubpd", { XM, EXx }, 0 },
4062 { "addsubps", { XM, EXx }, 0 },
4063 },
4064
4065 /* PREFIX_0FD6 */
4066 {
4067 { Bad_Opcode },
4068 { "movq2dq",{ XM, MS }, 0 },
4069 { "movq", { EXqS, XM }, 0 },
4070 { "movdq2q",{ MX, XS }, 0 },
4071 },
4072
4073 /* PREFIX_0FE6 */
4074 {
4075 { Bad_Opcode },
4076 { "cvtdq2pd", { XM, EXq }, PREFIX_OPCODE },
4077 { "cvttpd2dq", { XM, EXx }, PREFIX_OPCODE },
4078 { "cvtpd2dq", { XM, EXx }, PREFIX_OPCODE },
4079 },
4080
4081 /* PREFIX_0FE7 */
4082 {
4083 { "movntq", { Mq, MX }, PREFIX_OPCODE },
4084 { Bad_Opcode },
4085 { MOD_TABLE (MOD_0FE7_PREFIX_2) },
4086 },
4087
4088 /* PREFIX_0FF0 */
4089 {
4090 { Bad_Opcode },
4091 { Bad_Opcode },
4092 { Bad_Opcode },
4093 { MOD_TABLE (MOD_0FF0_PREFIX_3) },
4094 },
4095
4096 /* PREFIX_0FF7 */
4097 {
4098 { "maskmovq", { MX, MS }, PREFIX_OPCODE },
4099 { Bad_Opcode },
4100 { "maskmovdqu", { XM, XS }, PREFIX_OPCODE },
4101 },
4102
4103 /* PREFIX_0F3810 */
4104 {
4105 { Bad_Opcode },
4106 { Bad_Opcode },
4107 { "pblendvb", { XM, EXx, XMM0 }, PREFIX_OPCODE },
4108 },
4109
4110 /* PREFIX_0F3814 */
4111 {
4112 { Bad_Opcode },
4113 { Bad_Opcode },
4114 { "blendvps", { XM, EXx, XMM0 }, PREFIX_OPCODE },
4115 },
4116
4117 /* PREFIX_0F3815 */
4118 {
4119 { Bad_Opcode },
4120 { Bad_Opcode },
4121 { "blendvpd", { XM, EXx, XMM0 }, PREFIX_OPCODE },
4122 },
4123
4124 /* PREFIX_0F3817 */
4125 {
4126 { Bad_Opcode },
4127 { Bad_Opcode },
4128 { "ptest", { XM, EXx }, PREFIX_OPCODE },
4129 },
4130
4131 /* PREFIX_0F3820 */
4132 {
4133 { Bad_Opcode },
4134 { Bad_Opcode },
4135 { "pmovsxbw", { XM, EXq }, PREFIX_OPCODE },
4136 },
4137
4138 /* PREFIX_0F3821 */
4139 {
4140 { Bad_Opcode },
4141 { Bad_Opcode },
4142 { "pmovsxbd", { XM, EXd }, PREFIX_OPCODE },
4143 },
4144
4145 /* PREFIX_0F3822 */
4146 {
4147 { Bad_Opcode },
4148 { Bad_Opcode },
4149 { "pmovsxbq", { XM, EXw }, PREFIX_OPCODE },
4150 },
4151
4152 /* PREFIX_0F3823 */
4153 {
4154 { Bad_Opcode },
4155 { Bad_Opcode },
4156 { "pmovsxwd", { XM, EXq }, PREFIX_OPCODE },
4157 },
4158
4159 /* PREFIX_0F3824 */
4160 {
4161 { Bad_Opcode },
4162 { Bad_Opcode },
4163 { "pmovsxwq", { XM, EXd }, PREFIX_OPCODE },
4164 },
4165
4166 /* PREFIX_0F3825 */
4167 {
4168 { Bad_Opcode },
4169 { Bad_Opcode },
4170 { "pmovsxdq", { XM, EXq }, PREFIX_OPCODE },
4171 },
4172
4173 /* PREFIX_0F3828 */
4174 {
4175 { Bad_Opcode },
4176 { Bad_Opcode },
4177 { "pmuldq", { XM, EXx }, PREFIX_OPCODE },
4178 },
4179
4180 /* PREFIX_0F3829 */
4181 {
4182 { Bad_Opcode },
4183 { Bad_Opcode },
4184 { "pcmpeqq", { XM, EXx }, PREFIX_OPCODE },
4185 },
4186
4187 /* PREFIX_0F382A */
4188 {
4189 { Bad_Opcode },
4190 { Bad_Opcode },
4191 { MOD_TABLE (MOD_0F382A_PREFIX_2) },
4192 },
4193
4194 /* PREFIX_0F382B */
4195 {
4196 { Bad_Opcode },
4197 { Bad_Opcode },
4198 { "packusdw", { XM, EXx }, PREFIX_OPCODE },
4199 },
4200
4201 /* PREFIX_0F3830 */
4202 {
4203 { Bad_Opcode },
4204 { Bad_Opcode },
4205 { "pmovzxbw", { XM, EXq }, PREFIX_OPCODE },
4206 },
4207
4208 /* PREFIX_0F3831 */
4209 {
4210 { Bad_Opcode },
4211 { Bad_Opcode },
4212 { "pmovzxbd", { XM, EXd }, PREFIX_OPCODE },
4213 },
4214
4215 /* PREFIX_0F3832 */
4216 {
4217 { Bad_Opcode },
4218 { Bad_Opcode },
4219 { "pmovzxbq", { XM, EXw }, PREFIX_OPCODE },
4220 },
4221
4222 /* PREFIX_0F3833 */
4223 {
4224 { Bad_Opcode },
4225 { Bad_Opcode },
4226 { "pmovzxwd", { XM, EXq }, PREFIX_OPCODE },
4227 },
4228
4229 /* PREFIX_0F3834 */
4230 {
4231 { Bad_Opcode },
4232 { Bad_Opcode },
4233 { "pmovzxwq", { XM, EXd }, PREFIX_OPCODE },
4234 },
4235
4236 /* PREFIX_0F3835 */
4237 {
4238 { Bad_Opcode },
4239 { Bad_Opcode },
4240 { "pmovzxdq", { XM, EXq }, PREFIX_OPCODE },
4241 },
4242
4243 /* PREFIX_0F3837 */
4244 {
4245 { Bad_Opcode },
4246 { Bad_Opcode },
4247 { "pcmpgtq", { XM, EXx }, PREFIX_OPCODE },
4248 },
4249
4250 /* PREFIX_0F3838 */
4251 {
4252 { Bad_Opcode },
4253 { Bad_Opcode },
4254 { "pminsb", { XM, EXx }, PREFIX_OPCODE },
4255 },
4256
4257 /* PREFIX_0F3839 */
4258 {
4259 { Bad_Opcode },
4260 { Bad_Opcode },
4261 { "pminsd", { XM, EXx }, PREFIX_OPCODE },
4262 },
4263
4264 /* PREFIX_0F383A */
4265 {
4266 { Bad_Opcode },
4267 { Bad_Opcode },
4268 { "pminuw", { XM, EXx }, PREFIX_OPCODE },
4269 },
4270
4271 /* PREFIX_0F383B */
4272 {
4273 { Bad_Opcode },
4274 { Bad_Opcode },
4275 { "pminud", { XM, EXx }, PREFIX_OPCODE },
4276 },
4277
4278 /* PREFIX_0F383C */
4279 {
4280 { Bad_Opcode },
4281 { Bad_Opcode },
4282 { "pmaxsb", { XM, EXx }, PREFIX_OPCODE },
4283 },
4284
4285 /* PREFIX_0F383D */
4286 {
4287 { Bad_Opcode },
4288 { Bad_Opcode },
4289 { "pmaxsd", { XM, EXx }, PREFIX_OPCODE },
4290 },
4291
4292 /* PREFIX_0F383E */
4293 {
4294 { Bad_Opcode },
4295 { Bad_Opcode },
4296 { "pmaxuw", { XM, EXx }, PREFIX_OPCODE },
4297 },
4298
4299 /* PREFIX_0F383F */
4300 {
4301 { Bad_Opcode },
4302 { Bad_Opcode },
4303 { "pmaxud", { XM, EXx }, PREFIX_OPCODE },
4304 },
4305
4306 /* PREFIX_0F3840 */
4307 {
4308 { Bad_Opcode },
4309 { Bad_Opcode },
4310 { "pmulld", { XM, EXx }, PREFIX_OPCODE },
4311 },
4312
4313 /* PREFIX_0F3841 */
4314 {
4315 { Bad_Opcode },
4316 { Bad_Opcode },
4317 { "phminposuw", { XM, EXx }, PREFIX_OPCODE },
4318 },
4319
4320 /* PREFIX_0F3880 */
4321 {
4322 { Bad_Opcode },
4323 { Bad_Opcode },
4324 { "invept", { Gm, Mo }, PREFIX_OPCODE },
4325 },
4326
4327 /* PREFIX_0F3881 */
4328 {
4329 { Bad_Opcode },
4330 { Bad_Opcode },
4331 { "invvpid", { Gm, Mo }, PREFIX_OPCODE },
4332 },
4333
4334 /* PREFIX_0F3882 */
4335 {
4336 { Bad_Opcode },
4337 { Bad_Opcode },
4338 { "invpcid", { Gm, M }, PREFIX_OPCODE },
4339 },
4340
4341 /* PREFIX_0F38C8 */
4342 {
4343 { "sha1nexte", { XM, EXxmm }, PREFIX_OPCODE },
4344 },
4345
4346 /* PREFIX_0F38C9 */
4347 {
4348 { "sha1msg1", { XM, EXxmm }, PREFIX_OPCODE },
4349 },
4350
4351 /* PREFIX_0F38CA */
4352 {
4353 { "sha1msg2", { XM, EXxmm }, PREFIX_OPCODE },
4354 },
4355
4356 /* PREFIX_0F38CB */
4357 {
4358 { "sha256rnds2", { XM, EXxmm, XMM0 }, PREFIX_OPCODE },
4359 },
4360
4361 /* PREFIX_0F38CC */
4362 {
4363 { "sha256msg1", { XM, EXxmm }, PREFIX_OPCODE },
4364 },
4365
4366 /* PREFIX_0F38CD */
4367 {
4368 { "sha256msg2", { XM, EXxmm }, PREFIX_OPCODE },
4369 },
4370
4371 /* PREFIX_0F38CF */
4372 {
4373 { Bad_Opcode },
4374 { Bad_Opcode },
4375 { "gf2p8mulb", { XM, EXxmm }, PREFIX_OPCODE },
4376 },
4377
4378 /* PREFIX_0F38DB */
4379 {
4380 { Bad_Opcode },
4381 { Bad_Opcode },
4382 { "aesimc", { XM, EXx }, PREFIX_OPCODE },
4383 },
4384
4385 /* PREFIX_0F38DC */
4386 {
4387 { Bad_Opcode },
4388 { Bad_Opcode },
4389 { "aesenc", { XM, EXx }, PREFIX_OPCODE },
4390 },
4391
4392 /* PREFIX_0F38DD */
4393 {
4394 { Bad_Opcode },
4395 { Bad_Opcode },
4396 { "aesenclast", { XM, EXx }, PREFIX_OPCODE },
4397 },
4398
4399 /* PREFIX_0F38DE */
4400 {
4401 { Bad_Opcode },
4402 { Bad_Opcode },
4403 { "aesdec", { XM, EXx }, PREFIX_OPCODE },
4404 },
4405
4406 /* PREFIX_0F38DF */
4407 {
4408 { Bad_Opcode },
4409 { Bad_Opcode },
4410 { "aesdeclast", { XM, EXx }, PREFIX_OPCODE },
4411 },
4412
4413 /* PREFIX_0F38F0 */
4414 {
4415 { "movbeS", { Gv, { MOVBE_Fixup, v_mode } }, PREFIX_OPCODE },
4416 { Bad_Opcode },
4417 { "movbeS", { Gv, { MOVBE_Fixup, v_mode } }, PREFIX_OPCODE },
4418 { "crc32", { Gdq, { CRC32_Fixup, b_mode } }, PREFIX_OPCODE },
4419 },
4420
4421 /* PREFIX_0F38F1 */
4422 {
4423 { "movbeS", { { MOVBE_Fixup, v_mode }, Gv }, PREFIX_OPCODE },
4424 { Bad_Opcode },
4425 { "movbeS", { { MOVBE_Fixup, v_mode }, Gv }, PREFIX_OPCODE },
4426 { "crc32", { Gdq, { CRC32_Fixup, v_mode } }, PREFIX_OPCODE },
4427 },
4428
4429 /* PREFIX_0F38F5 */
4430 {
4431 { Bad_Opcode },
4432 { Bad_Opcode },
4433 { MOD_TABLE (MOD_0F38F5_PREFIX_2) },
4434 },
4435
4436 /* PREFIX_0F38F6 */
4437 {
4438 { MOD_TABLE (MOD_0F38F6_PREFIX_0) },
4439 { "adoxS", { Gdq, Edq}, PREFIX_OPCODE },
4440 { "adcxS", { Gdq, Edq}, PREFIX_OPCODE },
4441 { Bad_Opcode },
4442 },
4443
4444 /* PREFIX_0F38F8 */
4445 {
4446 { Bad_Opcode },
4447 { Bad_Opcode },
4448 { MOD_TABLE (MOD_0F38F8_PREFIX_2) },
4449 },
4450
4451 /* PREFIX_0F38F9 */
4452 {
4453 { MOD_TABLE (MOD_0F38F9_PREFIX_0) },
4454 },
4455
4456 /* PREFIX_0F3A08 */
4457 {
4458 { Bad_Opcode },
4459 { Bad_Opcode },
4460 { "roundps", { XM, EXx, Ib }, PREFIX_OPCODE },
4461 },
4462
4463 /* PREFIX_0F3A09 */
4464 {
4465 { Bad_Opcode },
4466 { Bad_Opcode },
4467 { "roundpd", { XM, EXx, Ib }, PREFIX_OPCODE },
4468 },
4469
4470 /* PREFIX_0F3A0A */
4471 {
4472 { Bad_Opcode },
4473 { Bad_Opcode },
4474 { "roundss", { XM, EXd, Ib }, PREFIX_OPCODE },
4475 },
4476
4477 /* PREFIX_0F3A0B */
4478 {
4479 { Bad_Opcode },
4480 { Bad_Opcode },
4481 { "roundsd", { XM, EXq, Ib }, PREFIX_OPCODE },
4482 },
4483
4484 /* PREFIX_0F3A0C */
4485 {
4486 { Bad_Opcode },
4487 { Bad_Opcode },
4488 { "blendps", { XM, EXx, Ib }, PREFIX_OPCODE },
4489 },
4490
4491 /* PREFIX_0F3A0D */
4492 {
4493 { Bad_Opcode },
4494 { Bad_Opcode },
4495 { "blendpd", { XM, EXx, Ib }, PREFIX_OPCODE },
4496 },
4497
4498 /* PREFIX_0F3A0E */
4499 {
4500 { Bad_Opcode },
4501 { Bad_Opcode },
4502 { "pblendw", { XM, EXx, Ib }, PREFIX_OPCODE },
4503 },
4504
4505 /* PREFIX_0F3A14 */
4506 {
4507 { Bad_Opcode },
4508 { Bad_Opcode },
4509 { "pextrb", { Edqb, XM, Ib }, PREFIX_OPCODE },
4510 },
4511
4512 /* PREFIX_0F3A15 */
4513 {
4514 { Bad_Opcode },
4515 { Bad_Opcode },
4516 { "pextrw", { Edqw, XM, Ib }, PREFIX_OPCODE },
4517 },
4518
4519 /* PREFIX_0F3A16 */
4520 {
4521 { Bad_Opcode },
4522 { Bad_Opcode },
4523 { "pextrK", { Edq, XM, Ib }, PREFIX_OPCODE },
4524 },
4525
4526 /* PREFIX_0F3A17 */
4527 {
4528 { Bad_Opcode },
4529 { Bad_Opcode },
4530 { "extractps", { Edqd, XM, Ib }, PREFIX_OPCODE },
4531 },
4532
4533 /* PREFIX_0F3A20 */
4534 {
4535 { Bad_Opcode },
4536 { Bad_Opcode },
4537 { "pinsrb", { XM, Edqb, Ib }, PREFIX_OPCODE },
4538 },
4539
4540 /* PREFIX_0F3A21 */
4541 {
4542 { Bad_Opcode },
4543 { Bad_Opcode },
4544 { "insertps", { XM, EXd, Ib }, PREFIX_OPCODE },
4545 },
4546
4547 /* PREFIX_0F3A22 */
4548 {
4549 { Bad_Opcode },
4550 { Bad_Opcode },
4551 { "pinsrK", { XM, Edq, Ib }, PREFIX_OPCODE },
4552 },
4553
4554 /* PREFIX_0F3A40 */
4555 {
4556 { Bad_Opcode },
4557 { Bad_Opcode },
4558 { "dpps", { XM, EXx, Ib }, PREFIX_OPCODE },
4559 },
4560
4561 /* PREFIX_0F3A41 */
4562 {
4563 { Bad_Opcode },
4564 { Bad_Opcode },
4565 { "dppd", { XM, EXx, Ib }, PREFIX_OPCODE },
4566 },
4567
4568 /* PREFIX_0F3A42 */
4569 {
4570 { Bad_Opcode },
4571 { Bad_Opcode },
4572 { "mpsadbw", { XM, EXx, Ib }, PREFIX_OPCODE },
4573 },
4574
4575 /* PREFIX_0F3A44 */
4576 {
4577 { Bad_Opcode },
4578 { Bad_Opcode },
4579 { "pclmulqdq", { XM, EXx, PCLMUL }, PREFIX_OPCODE },
4580 },
4581
4582 /* PREFIX_0F3A60 */
4583 {
4584 { Bad_Opcode },
4585 { Bad_Opcode },
4586 { "pcmpestrm", { XM, { PCMPESTR_Fixup, x_mode }, Ib }, PREFIX_OPCODE },
4587 },
4588
4589 /* PREFIX_0F3A61 */
4590 {
4591 { Bad_Opcode },
4592 { Bad_Opcode },
4593 { "pcmpestri", { XM, { PCMPESTR_Fixup, x_mode }, Ib }, PREFIX_OPCODE },
4594 },
4595
4596 /* PREFIX_0F3A62 */
4597 {
4598 { Bad_Opcode },
4599 { Bad_Opcode },
4600 { "pcmpistrm", { XM, EXx, Ib }, PREFIX_OPCODE },
4601 },
4602
4603 /* PREFIX_0F3A63 */
4604 {
4605 { Bad_Opcode },
4606 { Bad_Opcode },
4607 { "pcmpistri", { XM, EXx, Ib }, PREFIX_OPCODE },
4608 },
4609
4610 /* PREFIX_0F3ACC */
4611 {
4612 { "sha1rnds4", { XM, EXxmm, Ib }, PREFIX_OPCODE },
4613 },
4614
4615 /* PREFIX_0F3ACE */
4616 {
4617 { Bad_Opcode },
4618 { Bad_Opcode },
4619 { "gf2p8affineqb", { XM, EXxmm, Ib }, PREFIX_OPCODE },
4620 },
4621
4622 /* PREFIX_0F3ACF */
4623 {
4624 { Bad_Opcode },
4625 { Bad_Opcode },
4626 { "gf2p8affineinvqb", { XM, EXxmm, Ib }, PREFIX_OPCODE },
4627 },
4628
4629 /* PREFIX_0F3ADF */
4630 {
4631 { Bad_Opcode },
4632 { Bad_Opcode },
4633 { "aeskeygenassist", { XM, EXx, Ib }, PREFIX_OPCODE },
4634 },
4635
4636 /* PREFIX_VEX_0F10 */
4637 {
4638 { "vmovups", { XM, EXx }, 0 },
4639 { "vmovss", { XMVexScalar, VexScalar, EXdScalar }, 0 },
4640 { "vmovupd", { XM, EXx }, 0 },
4641 { "vmovsd", { XMVexScalar, VexScalar, EXqScalar }, 0 },
4642 },
4643
4644 /* PREFIX_VEX_0F11 */
4645 {
4646 { "vmovups", { EXxS, XM }, 0 },
4647 { "vmovss", { EXdVexScalarS, VexScalar, XMScalar }, 0 },
4648 { "vmovupd", { EXxS, XM }, 0 },
4649 { "vmovsd", { EXqVexScalarS, VexScalar, XMScalar }, 0 },
4650 },
4651
4652 /* PREFIX_VEX_0F12 */
4653 {
4654 { MOD_TABLE (MOD_VEX_0F12_PREFIX_0) },
4655 { "vmovsldup", { XM, EXx }, 0 },
4656 { VEX_LEN_TABLE (VEX_LEN_0F12_P_2) },
4657 { "vmovddup", { XM, EXymmq }, 0 },
4658 },
4659
4660 /* PREFIX_VEX_0F16 */
4661 {
4662 { MOD_TABLE (MOD_VEX_0F16_PREFIX_0) },
4663 { "vmovshdup", { XM, EXx }, 0 },
4664 { VEX_LEN_TABLE (VEX_LEN_0F16_P_2) },
4665 },
4666
4667 /* PREFIX_VEX_0F2A */
4668 {
4669 { Bad_Opcode },
4670 { VEX_LEN_TABLE (VEX_LEN_0F2A_P_1) },
4671 { Bad_Opcode },
4672 { VEX_LEN_TABLE (VEX_LEN_0F2A_P_3) },
4673 },
4674
4675 /* PREFIX_VEX_0F2C */
4676 {
4677 { Bad_Opcode },
4678 { VEX_LEN_TABLE (VEX_LEN_0F2C_P_1) },
4679 { Bad_Opcode },
4680 { VEX_LEN_TABLE (VEX_LEN_0F2C_P_3) },
4681 },
4682
4683 /* PREFIX_VEX_0F2D */
4684 {
4685 { Bad_Opcode },
4686 { VEX_LEN_TABLE (VEX_LEN_0F2D_P_1) },
4687 { Bad_Opcode },
4688 { VEX_LEN_TABLE (VEX_LEN_0F2D_P_3) },
4689 },
4690
4691 /* PREFIX_VEX_0F2E */
4692 {
4693 { "vucomiss", { XMScalar, EXdScalar }, 0 },
4694 { Bad_Opcode },
4695 { "vucomisd", { XMScalar, EXqScalar }, 0 },
4696 },
4697
4698 /* PREFIX_VEX_0F2F */
4699 {
4700 { "vcomiss", { XMScalar, EXdScalar }, 0 },
4701 { Bad_Opcode },
4702 { "vcomisd", { XMScalar, EXqScalar }, 0 },
4703 },
4704
4705 /* PREFIX_VEX_0F41 */
4706 {
4707 { VEX_LEN_TABLE (VEX_LEN_0F41_P_0) },
4708 { Bad_Opcode },
4709 { VEX_LEN_TABLE (VEX_LEN_0F41_P_2) },
4710 },
4711
4712 /* PREFIX_VEX_0F42 */
4713 {
4714 { VEX_LEN_TABLE (VEX_LEN_0F42_P_0) },
4715 { Bad_Opcode },
4716 { VEX_LEN_TABLE (VEX_LEN_0F42_P_2) },
4717 },
4718
4719 /* PREFIX_VEX_0F44 */
4720 {
4721 { VEX_LEN_TABLE (VEX_LEN_0F44_P_0) },
4722 { Bad_Opcode },
4723 { VEX_LEN_TABLE (VEX_LEN_0F44_P_2) },
4724 },
4725
4726 /* PREFIX_VEX_0F45 */
4727 {
4728 { VEX_LEN_TABLE (VEX_LEN_0F45_P_0) },
4729 { Bad_Opcode },
4730 { VEX_LEN_TABLE (VEX_LEN_0F45_P_2) },
4731 },
4732
4733 /* PREFIX_VEX_0F46 */
4734 {
4735 { VEX_LEN_TABLE (VEX_LEN_0F46_P_0) },
4736 { Bad_Opcode },
4737 { VEX_LEN_TABLE (VEX_LEN_0F46_P_2) },
4738 },
4739
4740 /* PREFIX_VEX_0F47 */
4741 {
4742 { VEX_LEN_TABLE (VEX_LEN_0F47_P_0) },
4743 { Bad_Opcode },
4744 { VEX_LEN_TABLE (VEX_LEN_0F47_P_2) },
4745 },
4746
4747 /* PREFIX_VEX_0F4A */
4748 {
4749 { VEX_LEN_TABLE (VEX_LEN_0F4A_P_0) },
4750 { Bad_Opcode },
4751 { VEX_LEN_TABLE (VEX_LEN_0F4A_P_2) },
4752 },
4753
4754 /* PREFIX_VEX_0F4B */
4755 {
4756 { VEX_LEN_TABLE (VEX_LEN_0F4B_P_0) },
4757 { Bad_Opcode },
4758 { VEX_LEN_TABLE (VEX_LEN_0F4B_P_2) },
4759 },
4760
4761 /* PREFIX_VEX_0F51 */
4762 {
4763 { "vsqrtps", { XM, EXx }, 0 },
4764 { "vsqrtss", { XMScalar, VexScalar, EXdScalar }, 0 },
4765 { "vsqrtpd", { XM, EXx }, 0 },
4766 { "vsqrtsd", { XMScalar, VexScalar, EXqScalar }, 0 },
4767 },
4768
4769 /* PREFIX_VEX_0F52 */
4770 {
4771 { "vrsqrtps", { XM, EXx }, 0 },
4772 { "vrsqrtss", { XMScalar, VexScalar, EXdScalar }, 0 },
4773 },
4774
4775 /* PREFIX_VEX_0F53 */
4776 {
4777 { "vrcpps", { XM, EXx }, 0 },
4778 { "vrcpss", { XMScalar, VexScalar, EXdScalar }, 0 },
4779 },
4780
4781 /* PREFIX_VEX_0F58 */
4782 {
4783 { "vaddps", { XM, Vex, EXx }, 0 },
4784 { "vaddss", { XMScalar, VexScalar, EXdScalar }, 0 },
4785 { "vaddpd", { XM, Vex, EXx }, 0 },
4786 { "vaddsd", { XMScalar, VexScalar, EXqScalar }, 0 },
4787 },
4788
4789 /* PREFIX_VEX_0F59 */
4790 {
4791 { "vmulps", { XM, Vex, EXx }, 0 },
4792 { "vmulss", { XMScalar, VexScalar, EXdScalar }, 0 },
4793 { "vmulpd", { XM, Vex, EXx }, 0 },
4794 { "vmulsd", { XMScalar, VexScalar, EXqScalar }, 0 },
4795 },
4796
4797 /* PREFIX_VEX_0F5A */
4798 {
4799 { "vcvtps2pd", { XM, EXxmmq }, 0 },
4800 { "vcvtss2sd", { XMScalar, VexScalar, EXdScalar }, 0 },
4801 { "vcvtpd2ps%XY",{ XMM, EXx }, 0 },
4802 { "vcvtsd2ss", { XMScalar, VexScalar, EXqScalar }, 0 },
4803 },
4804
4805 /* PREFIX_VEX_0F5B */
4806 {
4807 { "vcvtdq2ps", { XM, EXx }, 0 },
4808 { "vcvttps2dq", { XM, EXx }, 0 },
4809 { "vcvtps2dq", { XM, EXx }, 0 },
4810 },
4811
4812 /* PREFIX_VEX_0F5C */
4813 {
4814 { "vsubps", { XM, Vex, EXx }, 0 },
4815 { "vsubss", { XMScalar, VexScalar, EXdScalar }, 0 },
4816 { "vsubpd", { XM, Vex, EXx }, 0 },
4817 { "vsubsd", { XMScalar, VexScalar, EXqScalar }, 0 },
4818 },
4819
4820 /* PREFIX_VEX_0F5D */
4821 {
4822 { "vminps", { XM, Vex, EXx }, 0 },
4823 { "vminss", { XMScalar, VexScalar, EXdScalar }, 0 },
4824 { "vminpd", { XM, Vex, EXx }, 0 },
4825 { "vminsd", { XMScalar, VexScalar, EXqScalar }, 0 },
4826 },
4827
4828 /* PREFIX_VEX_0F5E */
4829 {
4830 { "vdivps", { XM, Vex, EXx }, 0 },
4831 { "vdivss", { XMScalar, VexScalar, EXdScalar }, 0 },
4832 { "vdivpd", { XM, Vex, EXx }, 0 },
4833 { "vdivsd", { XMScalar, VexScalar, EXqScalar }, 0 },
4834 },
4835
4836 /* PREFIX_VEX_0F5F */
4837 {
4838 { "vmaxps", { XM, Vex, EXx }, 0 },
4839 { "vmaxss", { XMScalar, VexScalar, EXdScalar }, 0 },
4840 { "vmaxpd", { XM, Vex, EXx }, 0 },
4841 { "vmaxsd", { XMScalar, VexScalar, EXqScalar }, 0 },
4842 },
4843
4844 /* PREFIX_VEX_0F60 */
4845 {
4846 { Bad_Opcode },
4847 { Bad_Opcode },
4848 { "vpunpcklbw", { XM, Vex, EXx }, 0 },
4849 },
4850
4851 /* PREFIX_VEX_0F61 */
4852 {
4853 { Bad_Opcode },
4854 { Bad_Opcode },
4855 { "vpunpcklwd", { XM, Vex, EXx }, 0 },
4856 },
4857
4858 /* PREFIX_VEX_0F62 */
4859 {
4860 { Bad_Opcode },
4861 { Bad_Opcode },
4862 { "vpunpckldq", { XM, Vex, EXx }, 0 },
4863 },
4864
4865 /* PREFIX_VEX_0F63 */
4866 {
4867 { Bad_Opcode },
4868 { Bad_Opcode },
4869 { "vpacksswb", { XM, Vex, EXx }, 0 },
4870 },
4871
4872 /* PREFIX_VEX_0F64 */
4873 {
4874 { Bad_Opcode },
4875 { Bad_Opcode },
4876 { "vpcmpgtb", { XM, Vex, EXx }, 0 },
4877 },
4878
4879 /* PREFIX_VEX_0F65 */
4880 {
4881 { Bad_Opcode },
4882 { Bad_Opcode },
4883 { "vpcmpgtw", { XM, Vex, EXx }, 0 },
4884 },
4885
4886 /* PREFIX_VEX_0F66 */
4887 {
4888 { Bad_Opcode },
4889 { Bad_Opcode },
4890 { "vpcmpgtd", { XM, Vex, EXx }, 0 },
4891 },
4892
4893 /* PREFIX_VEX_0F67 */
4894 {
4895 { Bad_Opcode },
4896 { Bad_Opcode },
4897 { "vpackuswb", { XM, Vex, EXx }, 0 },
4898 },
4899
4900 /* PREFIX_VEX_0F68 */
4901 {
4902 { Bad_Opcode },
4903 { Bad_Opcode },
4904 { "vpunpckhbw", { XM, Vex, EXx }, 0 },
4905 },
4906
4907 /* PREFIX_VEX_0F69 */
4908 {
4909 { Bad_Opcode },
4910 { Bad_Opcode },
4911 { "vpunpckhwd", { XM, Vex, EXx }, 0 },
4912 },
4913
4914 /* PREFIX_VEX_0F6A */
4915 {
4916 { Bad_Opcode },
4917 { Bad_Opcode },
4918 { "vpunpckhdq", { XM, Vex, EXx }, 0 },
4919 },
4920
4921 /* PREFIX_VEX_0F6B */
4922 {
4923 { Bad_Opcode },
4924 { Bad_Opcode },
4925 { "vpackssdw", { XM, Vex, EXx }, 0 },
4926 },
4927
4928 /* PREFIX_VEX_0F6C */
4929 {
4930 { Bad_Opcode },
4931 { Bad_Opcode },
4932 { "vpunpcklqdq", { XM, Vex, EXx }, 0 },
4933 },
4934
4935 /* PREFIX_VEX_0F6D */
4936 {
4937 { Bad_Opcode },
4938 { Bad_Opcode },
4939 { "vpunpckhqdq", { XM, Vex, EXx }, 0 },
4940 },
4941
4942 /* PREFIX_VEX_0F6E */
4943 {
4944 { Bad_Opcode },
4945 { Bad_Opcode },
4946 { VEX_LEN_TABLE (VEX_LEN_0F6E_P_2) },
4947 },
4948
4949 /* PREFIX_VEX_0F6F */
4950 {
4951 { Bad_Opcode },
4952 { "vmovdqu", { XM, EXx }, 0 },
4953 { "vmovdqa", { XM, EXx }, 0 },
4954 },
4955
4956 /* PREFIX_VEX_0F70 */
4957 {
4958 { Bad_Opcode },
4959 { "vpshufhw", { XM, EXx, Ib }, 0 },
4960 { "vpshufd", { XM, EXx, Ib }, 0 },
4961 { "vpshuflw", { XM, EXx, Ib }, 0 },
4962 },
4963
4964 /* PREFIX_VEX_0F71_REG_2 */
4965 {
4966 { Bad_Opcode },
4967 { Bad_Opcode },
4968 { "vpsrlw", { Vex, XS, Ib }, 0 },
4969 },
4970
4971 /* PREFIX_VEX_0F71_REG_4 */
4972 {
4973 { Bad_Opcode },
4974 { Bad_Opcode },
4975 { "vpsraw", { Vex, XS, Ib }, 0 },
4976 },
4977
4978 /* PREFIX_VEX_0F71_REG_6 */
4979 {
4980 { Bad_Opcode },
4981 { Bad_Opcode },
4982 { "vpsllw", { Vex, XS, Ib }, 0 },
4983 },
4984
4985 /* PREFIX_VEX_0F72_REG_2 */
4986 {
4987 { Bad_Opcode },
4988 { Bad_Opcode },
4989 { "vpsrld", { Vex, XS, Ib }, 0 },
4990 },
4991
4992 /* PREFIX_VEX_0F72_REG_4 */
4993 {
4994 { Bad_Opcode },
4995 { Bad_Opcode },
4996 { "vpsrad", { Vex, XS, Ib }, 0 },
4997 },
4998
4999 /* PREFIX_VEX_0F72_REG_6 */
5000 {
5001 { Bad_Opcode },
5002 { Bad_Opcode },
5003 { "vpslld", { Vex, XS, Ib }, 0 },
5004 },
5005
5006 /* PREFIX_VEX_0F73_REG_2 */
5007 {
5008 { Bad_Opcode },
5009 { Bad_Opcode },
5010 { "vpsrlq", { Vex, XS, Ib }, 0 },
5011 },
5012
5013 /* PREFIX_VEX_0F73_REG_3 */
5014 {
5015 { Bad_Opcode },
5016 { Bad_Opcode },
5017 { "vpsrldq", { Vex, XS, Ib }, 0 },
5018 },
5019
5020 /* PREFIX_VEX_0F73_REG_6 */
5021 {
5022 { Bad_Opcode },
5023 { Bad_Opcode },
5024 { "vpsllq", { Vex, XS, Ib }, 0 },
5025 },
5026
5027 /* PREFIX_VEX_0F73_REG_7 */
5028 {
5029 { Bad_Opcode },
5030 { Bad_Opcode },
5031 { "vpslldq", { Vex, XS, Ib }, 0 },
5032 },
5033
5034 /* PREFIX_VEX_0F74 */
5035 {
5036 { Bad_Opcode },
5037 { Bad_Opcode },
5038 { "vpcmpeqb", { XM, Vex, EXx }, 0 },
5039 },
5040
5041 /* PREFIX_VEX_0F75 */
5042 {
5043 { Bad_Opcode },
5044 { Bad_Opcode },
5045 { "vpcmpeqw", { XM, Vex, EXx }, 0 },
5046 },
5047
5048 /* PREFIX_VEX_0F76 */
5049 {
5050 { Bad_Opcode },
5051 { Bad_Opcode },
5052 { "vpcmpeqd", { XM, Vex, EXx }, 0 },
5053 },
5054
5055 /* PREFIX_VEX_0F77 */
5056 {
5057 { VEX_LEN_TABLE (VEX_LEN_0F77_P_0) },
5058 },
5059
5060 /* PREFIX_VEX_0F7C */
5061 {
5062 { Bad_Opcode },
5063 { Bad_Opcode },
5064 { "vhaddpd", { XM, Vex, EXx }, 0 },
5065 { "vhaddps", { XM, Vex, EXx }, 0 },
5066 },
5067
5068 /* PREFIX_VEX_0F7D */
5069 {
5070 { Bad_Opcode },
5071 { Bad_Opcode },
5072 { "vhsubpd", { XM, Vex, EXx }, 0 },
5073 { "vhsubps", { XM, Vex, EXx }, 0 },
5074 },
5075
5076 /* PREFIX_VEX_0F7E */
5077 {
5078 { Bad_Opcode },
5079 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_1) },
5080 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_2) },
5081 },
5082
5083 /* PREFIX_VEX_0F7F */
5084 {
5085 { Bad_Opcode },
5086 { "vmovdqu", { EXxS, XM }, 0 },
5087 { "vmovdqa", { EXxS, XM }, 0 },
5088 },
5089
5090 /* PREFIX_VEX_0F90 */
5091 {
5092 { VEX_LEN_TABLE (VEX_LEN_0F90_P_0) },
5093 { Bad_Opcode },
5094 { VEX_LEN_TABLE (VEX_LEN_0F90_P_2) },
5095 },
5096
5097 /* PREFIX_VEX_0F91 */
5098 {
5099 { VEX_LEN_TABLE (VEX_LEN_0F91_P_0) },
5100 { Bad_Opcode },
5101 { VEX_LEN_TABLE (VEX_LEN_0F91_P_2) },
5102 },
5103
5104 /* PREFIX_VEX_0F92 */
5105 {
5106 { VEX_LEN_TABLE (VEX_LEN_0F92_P_0) },
5107 { Bad_Opcode },
5108 { VEX_LEN_TABLE (VEX_LEN_0F92_P_2) },
5109 { VEX_LEN_TABLE (VEX_LEN_0F92_P_3) },
5110 },
5111
5112 /* PREFIX_VEX_0F93 */
5113 {
5114 { VEX_LEN_TABLE (VEX_LEN_0F93_P_0) },
5115 { Bad_Opcode },
5116 { VEX_LEN_TABLE (VEX_LEN_0F93_P_2) },
5117 { VEX_LEN_TABLE (VEX_LEN_0F93_P_3) },
5118 },
5119
5120 /* PREFIX_VEX_0F98 */
5121 {
5122 { VEX_LEN_TABLE (VEX_LEN_0F98_P_0) },
5123 { Bad_Opcode },
5124 { VEX_LEN_TABLE (VEX_LEN_0F98_P_2) },
5125 },
5126
5127 /* PREFIX_VEX_0F99 */
5128 {
5129 { VEX_LEN_TABLE (VEX_LEN_0F99_P_0) },
5130 { Bad_Opcode },
5131 { VEX_LEN_TABLE (VEX_LEN_0F99_P_2) },
5132 },
5133
5134 /* PREFIX_VEX_0FC2 */
5135 {
5136 { "vcmpps", { XM, Vex, EXx, VCMP }, 0 },
5137 { "vcmpss", { XMScalar, VexScalar, EXdScalar, VCMP }, 0 },
5138 { "vcmppd", { XM, Vex, EXx, VCMP }, 0 },
5139 { "vcmpsd", { XMScalar, VexScalar, EXqScalar, VCMP }, 0 },
5140 },
5141
5142 /* PREFIX_VEX_0FC4 */
5143 {
5144 { Bad_Opcode },
5145 { Bad_Opcode },
5146 { VEX_LEN_TABLE (VEX_LEN_0FC4_P_2) },
5147 },
5148
5149 /* PREFIX_VEX_0FC5 */
5150 {
5151 { Bad_Opcode },
5152 { Bad_Opcode },
5153 { VEX_LEN_TABLE (VEX_LEN_0FC5_P_2) },
5154 },
5155
5156 /* PREFIX_VEX_0FD0 */
5157 {
5158 { Bad_Opcode },
5159 { Bad_Opcode },
5160 { "vaddsubpd", { XM, Vex, EXx }, 0 },
5161 { "vaddsubps", { XM, Vex, EXx }, 0 },
5162 },
5163
5164 /* PREFIX_VEX_0FD1 */
5165 {
5166 { Bad_Opcode },
5167 { Bad_Opcode },
5168 { "vpsrlw", { XM, Vex, EXxmm }, 0 },
5169 },
5170
5171 /* PREFIX_VEX_0FD2 */
5172 {
5173 { Bad_Opcode },
5174 { Bad_Opcode },
5175 { "vpsrld", { XM, Vex, EXxmm }, 0 },
5176 },
5177
5178 /* PREFIX_VEX_0FD3 */
5179 {
5180 { Bad_Opcode },
5181 { Bad_Opcode },
5182 { "vpsrlq", { XM, Vex, EXxmm }, 0 },
5183 },
5184
5185 /* PREFIX_VEX_0FD4 */
5186 {
5187 { Bad_Opcode },
5188 { Bad_Opcode },
5189 { "vpaddq", { XM, Vex, EXx }, 0 },
5190 },
5191
5192 /* PREFIX_VEX_0FD5 */
5193 {
5194 { Bad_Opcode },
5195 { Bad_Opcode },
5196 { "vpmullw", { XM, Vex, EXx }, 0 },
5197 },
5198
5199 /* PREFIX_VEX_0FD6 */
5200 {
5201 { Bad_Opcode },
5202 { Bad_Opcode },
5203 { VEX_LEN_TABLE (VEX_LEN_0FD6_P_2) },
5204 },
5205
5206 /* PREFIX_VEX_0FD7 */
5207 {
5208 { Bad_Opcode },
5209 { Bad_Opcode },
5210 { MOD_TABLE (MOD_VEX_0FD7_PREFIX_2) },
5211 },
5212
5213 /* PREFIX_VEX_0FD8 */
5214 {
5215 { Bad_Opcode },
5216 { Bad_Opcode },
5217 { "vpsubusb", { XM, Vex, EXx }, 0 },
5218 },
5219
5220 /* PREFIX_VEX_0FD9 */
5221 {
5222 { Bad_Opcode },
5223 { Bad_Opcode },
5224 { "vpsubusw", { XM, Vex, EXx }, 0 },
5225 },
5226
5227 /* PREFIX_VEX_0FDA */
5228 {
5229 { Bad_Opcode },
5230 { Bad_Opcode },
5231 { "vpminub", { XM, Vex, EXx }, 0 },
5232 },
5233
5234 /* PREFIX_VEX_0FDB */
5235 {
5236 { Bad_Opcode },
5237 { Bad_Opcode },
5238 { "vpand", { XM, Vex, EXx }, 0 },
5239 },
5240
5241 /* PREFIX_VEX_0FDC */
5242 {
5243 { Bad_Opcode },
5244 { Bad_Opcode },
5245 { "vpaddusb", { XM, Vex, EXx }, 0 },
5246 },
5247
5248 /* PREFIX_VEX_0FDD */
5249 {
5250 { Bad_Opcode },
5251 { Bad_Opcode },
5252 { "vpaddusw", { XM, Vex, EXx }, 0 },
5253 },
5254
5255 /* PREFIX_VEX_0FDE */
5256 {
5257 { Bad_Opcode },
5258 { Bad_Opcode },
5259 { "vpmaxub", { XM, Vex, EXx }, 0 },
5260 },
5261
5262 /* PREFIX_VEX_0FDF */
5263 {
5264 { Bad_Opcode },
5265 { Bad_Opcode },
5266 { "vpandn", { XM, Vex, EXx }, 0 },
5267 },
5268
5269 /* PREFIX_VEX_0FE0 */
5270 {
5271 { Bad_Opcode },
5272 { Bad_Opcode },
5273 { "vpavgb", { XM, Vex, EXx }, 0 },
5274 },
5275
5276 /* PREFIX_VEX_0FE1 */
5277 {
5278 { Bad_Opcode },
5279 { Bad_Opcode },
5280 { "vpsraw", { XM, Vex, EXxmm }, 0 },
5281 },
5282
5283 /* PREFIX_VEX_0FE2 */
5284 {
5285 { Bad_Opcode },
5286 { Bad_Opcode },
5287 { "vpsrad", { XM, Vex, EXxmm }, 0 },
5288 },
5289
5290 /* PREFIX_VEX_0FE3 */
5291 {
5292 { Bad_Opcode },
5293 { Bad_Opcode },
5294 { "vpavgw", { XM, Vex, EXx }, 0 },
5295 },
5296
5297 /* PREFIX_VEX_0FE4 */
5298 {
5299 { Bad_Opcode },
5300 { Bad_Opcode },
5301 { "vpmulhuw", { XM, Vex, EXx }, 0 },
5302 },
5303
5304 /* PREFIX_VEX_0FE5 */
5305 {
5306 { Bad_Opcode },
5307 { Bad_Opcode },
5308 { "vpmulhw", { XM, Vex, EXx }, 0 },
5309 },
5310
5311 /* PREFIX_VEX_0FE6 */
5312 {
5313 { Bad_Opcode },
5314 { "vcvtdq2pd", { XM, EXxmmq }, 0 },
5315 { "vcvttpd2dq%XY", { XMM, EXx }, 0 },
5316 { "vcvtpd2dq%XY", { XMM, EXx }, 0 },
5317 },
5318
5319 /* PREFIX_VEX_0FE7 */
5320 {
5321 { Bad_Opcode },
5322 { Bad_Opcode },
5323 { MOD_TABLE (MOD_VEX_0FE7_PREFIX_2) },
5324 },
5325
5326 /* PREFIX_VEX_0FE8 */
5327 {
5328 { Bad_Opcode },
5329 { Bad_Opcode },
5330 { "vpsubsb", { XM, Vex, EXx }, 0 },
5331 },
5332
5333 /* PREFIX_VEX_0FE9 */
5334 {
5335 { Bad_Opcode },
5336 { Bad_Opcode },
5337 { "vpsubsw", { XM, Vex, EXx }, 0 },
5338 },
5339
5340 /* PREFIX_VEX_0FEA */
5341 {
5342 { Bad_Opcode },
5343 { Bad_Opcode },
5344 { "vpminsw", { XM, Vex, EXx }, 0 },
5345 },
5346
5347 /* PREFIX_VEX_0FEB */
5348 {
5349 { Bad_Opcode },
5350 { Bad_Opcode },
5351 { "vpor", { XM, Vex, EXx }, 0 },
5352 },
5353
5354 /* PREFIX_VEX_0FEC */
5355 {
5356 { Bad_Opcode },
5357 { Bad_Opcode },
5358 { "vpaddsb", { XM, Vex, EXx }, 0 },
5359 },
5360
5361 /* PREFIX_VEX_0FED */
5362 {
5363 { Bad_Opcode },
5364 { Bad_Opcode },
5365 { "vpaddsw", { XM, Vex, EXx }, 0 },
5366 },
5367
5368 /* PREFIX_VEX_0FEE */
5369 {
5370 { Bad_Opcode },
5371 { Bad_Opcode },
5372 { "vpmaxsw", { XM, Vex, EXx }, 0 },
5373 },
5374
5375 /* PREFIX_VEX_0FEF */
5376 {
5377 { Bad_Opcode },
5378 { Bad_Opcode },
5379 { "vpxor", { XM, Vex, EXx }, 0 },
5380 },
5381
5382 /* PREFIX_VEX_0FF0 */
5383 {
5384 { Bad_Opcode },
5385 { Bad_Opcode },
5386 { Bad_Opcode },
5387 { MOD_TABLE (MOD_VEX_0FF0_PREFIX_3) },
5388 },
5389
5390 /* PREFIX_VEX_0FF1 */
5391 {
5392 { Bad_Opcode },
5393 { Bad_Opcode },
5394 { "vpsllw", { XM, Vex, EXxmm }, 0 },
5395 },
5396
5397 /* PREFIX_VEX_0FF2 */
5398 {
5399 { Bad_Opcode },
5400 { Bad_Opcode },
5401 { "vpslld", { XM, Vex, EXxmm }, 0 },
5402 },
5403
5404 /* PREFIX_VEX_0FF3 */
5405 {
5406 { Bad_Opcode },
5407 { Bad_Opcode },
5408 { "vpsllq", { XM, Vex, EXxmm }, 0 },
5409 },
5410
5411 /* PREFIX_VEX_0FF4 */
5412 {
5413 { Bad_Opcode },
5414 { Bad_Opcode },
5415 { "vpmuludq", { XM, Vex, EXx }, 0 },
5416 },
5417
5418 /* PREFIX_VEX_0FF5 */
5419 {
5420 { Bad_Opcode },
5421 { Bad_Opcode },
5422 { "vpmaddwd", { XM, Vex, EXx }, 0 },
5423 },
5424
5425 /* PREFIX_VEX_0FF6 */
5426 {
5427 { Bad_Opcode },
5428 { Bad_Opcode },
5429 { "vpsadbw", { XM, Vex, EXx }, 0 },
5430 },
5431
5432 /* PREFIX_VEX_0FF7 */
5433 {
5434 { Bad_Opcode },
5435 { Bad_Opcode },
5436 { VEX_LEN_TABLE (VEX_LEN_0FF7_P_2) },
5437 },
5438
5439 /* PREFIX_VEX_0FF8 */
5440 {
5441 { Bad_Opcode },
5442 { Bad_Opcode },
5443 { "vpsubb", { XM, Vex, EXx }, 0 },
5444 },
5445
5446 /* PREFIX_VEX_0FF9 */
5447 {
5448 { Bad_Opcode },
5449 { Bad_Opcode },
5450 { "vpsubw", { XM, Vex, EXx }, 0 },
5451 },
5452
5453 /* PREFIX_VEX_0FFA */
5454 {
5455 { Bad_Opcode },
5456 { Bad_Opcode },
5457 { "vpsubd", { XM, Vex, EXx }, 0 },
5458 },
5459
5460 /* PREFIX_VEX_0FFB */
5461 {
5462 { Bad_Opcode },
5463 { Bad_Opcode },
5464 { "vpsubq", { XM, Vex, EXx }, 0 },
5465 },
5466
5467 /* PREFIX_VEX_0FFC */
5468 {
5469 { Bad_Opcode },
5470 { Bad_Opcode },
5471 { "vpaddb", { XM, Vex, EXx }, 0 },
5472 },
5473
5474 /* PREFIX_VEX_0FFD */
5475 {
5476 { Bad_Opcode },
5477 { Bad_Opcode },
5478 { "vpaddw", { XM, Vex, EXx }, 0 },
5479 },
5480
5481 /* PREFIX_VEX_0FFE */
5482 {
5483 { Bad_Opcode },
5484 { Bad_Opcode },
5485 { "vpaddd", { XM, Vex, EXx }, 0 },
5486 },
5487
5488 /* PREFIX_VEX_0F3800 */
5489 {
5490 { Bad_Opcode },
5491 { Bad_Opcode },
5492 { "vpshufb", { XM, Vex, EXx }, 0 },
5493 },
5494
5495 /* PREFIX_VEX_0F3801 */
5496 {
5497 { Bad_Opcode },
5498 { Bad_Opcode },
5499 { "vphaddw", { XM, Vex, EXx }, 0 },
5500 },
5501
5502 /* PREFIX_VEX_0F3802 */
5503 {
5504 { Bad_Opcode },
5505 { Bad_Opcode },
5506 { "vphaddd", { XM, Vex, EXx }, 0 },
5507 },
5508
5509 /* PREFIX_VEX_0F3803 */
5510 {
5511 { Bad_Opcode },
5512 { Bad_Opcode },
5513 { "vphaddsw", { XM, Vex, EXx }, 0 },
5514 },
5515
5516 /* PREFIX_VEX_0F3804 */
5517 {
5518 { Bad_Opcode },
5519 { Bad_Opcode },
5520 { "vpmaddubsw", { XM, Vex, EXx }, 0 },
5521 },
5522
5523 /* PREFIX_VEX_0F3805 */
5524 {
5525 { Bad_Opcode },
5526 { Bad_Opcode },
5527 { "vphsubw", { XM, Vex, EXx }, 0 },
5528 },
5529
5530 /* PREFIX_VEX_0F3806 */
5531 {
5532 { Bad_Opcode },
5533 { Bad_Opcode },
5534 { "vphsubd", { XM, Vex, EXx }, 0 },
5535 },
5536
5537 /* PREFIX_VEX_0F3807 */
5538 {
5539 { Bad_Opcode },
5540 { Bad_Opcode },
5541 { "vphsubsw", { XM, Vex, EXx }, 0 },
5542 },
5543
5544 /* PREFIX_VEX_0F3808 */
5545 {
5546 { Bad_Opcode },
5547 { Bad_Opcode },
5548 { "vpsignb", { XM, Vex, EXx }, 0 },
5549 },
5550
5551 /* PREFIX_VEX_0F3809 */
5552 {
5553 { Bad_Opcode },
5554 { Bad_Opcode },
5555 { "vpsignw", { XM, Vex, EXx }, 0 },
5556 },
5557
5558 /* PREFIX_VEX_0F380A */
5559 {
5560 { Bad_Opcode },
5561 { Bad_Opcode },
5562 { "vpsignd", { XM, Vex, EXx }, 0 },
5563 },
5564
5565 /* PREFIX_VEX_0F380B */
5566 {
5567 { Bad_Opcode },
5568 { Bad_Opcode },
5569 { "vpmulhrsw", { XM, Vex, EXx }, 0 },
5570 },
5571
5572 /* PREFIX_VEX_0F380C */
5573 {
5574 { Bad_Opcode },
5575 { Bad_Opcode },
5576 { VEX_W_TABLE (VEX_W_0F380C_P_2) },
5577 },
5578
5579 /* PREFIX_VEX_0F380D */
5580 {
5581 { Bad_Opcode },
5582 { Bad_Opcode },
5583 { VEX_W_TABLE (VEX_W_0F380D_P_2) },
5584 },
5585
5586 /* PREFIX_VEX_0F380E */
5587 {
5588 { Bad_Opcode },
5589 { Bad_Opcode },
5590 { VEX_W_TABLE (VEX_W_0F380E_P_2) },
5591 },
5592
5593 /* PREFIX_VEX_0F380F */
5594 {
5595 { Bad_Opcode },
5596 { Bad_Opcode },
5597 { VEX_W_TABLE (VEX_W_0F380F_P_2) },
5598 },
5599
5600 /* PREFIX_VEX_0F3813 */
5601 {
5602 { Bad_Opcode },
5603 { Bad_Opcode },
5604 { "vcvtph2ps", { XM, EXxmmq }, 0 },
5605 },
5606
5607 /* PREFIX_VEX_0F3816 */
5608 {
5609 { Bad_Opcode },
5610 { Bad_Opcode },
5611 { VEX_LEN_TABLE (VEX_LEN_0F3816_P_2) },
5612 },
5613
5614 /* PREFIX_VEX_0F3817 */
5615 {
5616 { Bad_Opcode },
5617 { Bad_Opcode },
5618 { "vptest", { XM, EXx }, 0 },
5619 },
5620
5621 /* PREFIX_VEX_0F3818 */
5622 {
5623 { Bad_Opcode },
5624 { Bad_Opcode },
5625 { VEX_W_TABLE (VEX_W_0F3818_P_2) },
5626 },
5627
5628 /* PREFIX_VEX_0F3819 */
5629 {
5630 { Bad_Opcode },
5631 { Bad_Opcode },
5632 { VEX_LEN_TABLE (VEX_LEN_0F3819_P_2) },
5633 },
5634
5635 /* PREFIX_VEX_0F381A */
5636 {
5637 { Bad_Opcode },
5638 { Bad_Opcode },
5639 { MOD_TABLE (MOD_VEX_0F381A_PREFIX_2) },
5640 },
5641
5642 /* PREFIX_VEX_0F381C */
5643 {
5644 { Bad_Opcode },
5645 { Bad_Opcode },
5646 { "vpabsb", { XM, EXx }, 0 },
5647 },
5648
5649 /* PREFIX_VEX_0F381D */
5650 {
5651 { Bad_Opcode },
5652 { Bad_Opcode },
5653 { "vpabsw", { XM, EXx }, 0 },
5654 },
5655
5656 /* PREFIX_VEX_0F381E */
5657 {
5658 { Bad_Opcode },
5659 { Bad_Opcode },
5660 { "vpabsd", { XM, EXx }, 0 },
5661 },
5662
5663 /* PREFIX_VEX_0F3820 */
5664 {
5665 { Bad_Opcode },
5666 { Bad_Opcode },
5667 { "vpmovsxbw", { XM, EXxmmq }, 0 },
5668 },
5669
5670 /* PREFIX_VEX_0F3821 */
5671 {
5672 { Bad_Opcode },
5673 { Bad_Opcode },
5674 { "vpmovsxbd", { XM, EXxmmqd }, 0 },
5675 },
5676
5677 /* PREFIX_VEX_0F3822 */
5678 {
5679 { Bad_Opcode },
5680 { Bad_Opcode },
5681 { "vpmovsxbq", { XM, EXxmmdw }, 0 },
5682 },
5683
5684 /* PREFIX_VEX_0F3823 */
5685 {
5686 { Bad_Opcode },
5687 { Bad_Opcode },
5688 { "vpmovsxwd", { XM, EXxmmq }, 0 },
5689 },
5690
5691 /* PREFIX_VEX_0F3824 */
5692 {
5693 { Bad_Opcode },
5694 { Bad_Opcode },
5695 { "vpmovsxwq", { XM, EXxmmqd }, 0 },
5696 },
5697
5698 /* PREFIX_VEX_0F3825 */
5699 {
5700 { Bad_Opcode },
5701 { Bad_Opcode },
5702 { "vpmovsxdq", { XM, EXxmmq }, 0 },
5703 },
5704
5705 /* PREFIX_VEX_0F3828 */
5706 {
5707 { Bad_Opcode },
5708 { Bad_Opcode },
5709 { "vpmuldq", { XM, Vex, EXx }, 0 },
5710 },
5711
5712 /* PREFIX_VEX_0F3829 */
5713 {
5714 { Bad_Opcode },
5715 { Bad_Opcode },
5716 { "vpcmpeqq", { XM, Vex, EXx }, 0 },
5717 },
5718
5719 /* PREFIX_VEX_0F382A */
5720 {
5721 { Bad_Opcode },
5722 { Bad_Opcode },
5723 { MOD_TABLE (MOD_VEX_0F382A_PREFIX_2) },
5724 },
5725
5726 /* PREFIX_VEX_0F382B */
5727 {
5728 { Bad_Opcode },
5729 { Bad_Opcode },
5730 { "vpackusdw", { XM, Vex, EXx }, 0 },
5731 },
5732
5733 /* PREFIX_VEX_0F382C */
5734 {
5735 { Bad_Opcode },
5736 { Bad_Opcode },
5737 { MOD_TABLE (MOD_VEX_0F382C_PREFIX_2) },
5738 },
5739
5740 /* PREFIX_VEX_0F382D */
5741 {
5742 { Bad_Opcode },
5743 { Bad_Opcode },
5744 { MOD_TABLE (MOD_VEX_0F382D_PREFIX_2) },
5745 },
5746
5747 /* PREFIX_VEX_0F382E */
5748 {
5749 { Bad_Opcode },
5750 { Bad_Opcode },
5751 { MOD_TABLE (MOD_VEX_0F382E_PREFIX_2) },
5752 },
5753
5754 /* PREFIX_VEX_0F382F */
5755 {
5756 { Bad_Opcode },
5757 { Bad_Opcode },
5758 { MOD_TABLE (MOD_VEX_0F382F_PREFIX_2) },
5759 },
5760
5761 /* PREFIX_VEX_0F3830 */
5762 {
5763 { Bad_Opcode },
5764 { Bad_Opcode },
5765 { "vpmovzxbw", { XM, EXxmmq }, 0 },
5766 },
5767
5768 /* PREFIX_VEX_0F3831 */
5769 {
5770 { Bad_Opcode },
5771 { Bad_Opcode },
5772 { "vpmovzxbd", { XM, EXxmmqd }, 0 },
5773 },
5774
5775 /* PREFIX_VEX_0F3832 */
5776 {
5777 { Bad_Opcode },
5778 { Bad_Opcode },
5779 { "vpmovzxbq", { XM, EXxmmdw }, 0 },
5780 },
5781
5782 /* PREFIX_VEX_0F3833 */
5783 {
5784 { Bad_Opcode },
5785 { Bad_Opcode },
5786 { "vpmovzxwd", { XM, EXxmmq }, 0 },
5787 },
5788
5789 /* PREFIX_VEX_0F3834 */
5790 {
5791 { Bad_Opcode },
5792 { Bad_Opcode },
5793 { "vpmovzxwq", { XM, EXxmmqd }, 0 },
5794 },
5795
5796 /* PREFIX_VEX_0F3835 */
5797 {
5798 { Bad_Opcode },
5799 { Bad_Opcode },
5800 { "vpmovzxdq", { XM, EXxmmq }, 0 },
5801 },
5802
5803 /* PREFIX_VEX_0F3836 */
5804 {
5805 { Bad_Opcode },
5806 { Bad_Opcode },
5807 { VEX_LEN_TABLE (VEX_LEN_0F3836_P_2) },
5808 },
5809
5810 /* PREFIX_VEX_0F3837 */
5811 {
5812 { Bad_Opcode },
5813 { Bad_Opcode },
5814 { "vpcmpgtq", { XM, Vex, EXx }, 0 },
5815 },
5816
5817 /* PREFIX_VEX_0F3838 */
5818 {
5819 { Bad_Opcode },
5820 { Bad_Opcode },
5821 { "vpminsb", { XM, Vex, EXx }, 0 },
5822 },
5823
5824 /* PREFIX_VEX_0F3839 */
5825 {
5826 { Bad_Opcode },
5827 { Bad_Opcode },
5828 { "vpminsd", { XM, Vex, EXx }, 0 },
5829 },
5830
5831 /* PREFIX_VEX_0F383A */
5832 {
5833 { Bad_Opcode },
5834 { Bad_Opcode },
5835 { "vpminuw", { XM, Vex, EXx }, 0 },
5836 },
5837
5838 /* PREFIX_VEX_0F383B */
5839 {
5840 { Bad_Opcode },
5841 { Bad_Opcode },
5842 { "vpminud", { XM, Vex, EXx }, 0 },
5843 },
5844
5845 /* PREFIX_VEX_0F383C */
5846 {
5847 { Bad_Opcode },
5848 { Bad_Opcode },
5849 { "vpmaxsb", { XM, Vex, EXx }, 0 },
5850 },
5851
5852 /* PREFIX_VEX_0F383D */
5853 {
5854 { Bad_Opcode },
5855 { Bad_Opcode },
5856 { "vpmaxsd", { XM, Vex, EXx }, 0 },
5857 },
5858
5859 /* PREFIX_VEX_0F383E */
5860 {
5861 { Bad_Opcode },
5862 { Bad_Opcode },
5863 { "vpmaxuw", { XM, Vex, EXx }, 0 },
5864 },
5865
5866 /* PREFIX_VEX_0F383F */
5867 {
5868 { Bad_Opcode },
5869 { Bad_Opcode },
5870 { "vpmaxud", { XM, Vex, EXx }, 0 },
5871 },
5872
5873 /* PREFIX_VEX_0F3840 */
5874 {
5875 { Bad_Opcode },
5876 { Bad_Opcode },
5877 { "vpmulld", { XM, Vex, EXx }, 0 },
5878 },
5879
5880 /* PREFIX_VEX_0F3841 */
5881 {
5882 { Bad_Opcode },
5883 { Bad_Opcode },
5884 { VEX_LEN_TABLE (VEX_LEN_0F3841_P_2) },
5885 },
5886
5887 /* PREFIX_VEX_0F3845 */
5888 {
5889 { Bad_Opcode },
5890 { Bad_Opcode },
5891 { "vpsrlv%LW", { XM, Vex, EXx }, 0 },
5892 },
5893
5894 /* PREFIX_VEX_0F3846 */
5895 {
5896 { Bad_Opcode },
5897 { Bad_Opcode },
5898 { VEX_W_TABLE (VEX_W_0F3846_P_2) },
5899 },
5900
5901 /* PREFIX_VEX_0F3847 */
5902 {
5903 { Bad_Opcode },
5904 { Bad_Opcode },
5905 { "vpsllv%LW", { XM, Vex, EXx }, 0 },
5906 },
5907
5908 /* PREFIX_VEX_0F3858 */
5909 {
5910 { Bad_Opcode },
5911 { Bad_Opcode },
5912 { VEX_W_TABLE (VEX_W_0F3858_P_2) },
5913 },
5914
5915 /* PREFIX_VEX_0F3859 */
5916 {
5917 { Bad_Opcode },
5918 { Bad_Opcode },
5919 { VEX_W_TABLE (VEX_W_0F3859_P_2) },
5920 },
5921
5922 /* PREFIX_VEX_0F385A */
5923 {
5924 { Bad_Opcode },
5925 { Bad_Opcode },
5926 { MOD_TABLE (MOD_VEX_0F385A_PREFIX_2) },
5927 },
5928
5929 /* PREFIX_VEX_0F3878 */
5930 {
5931 { Bad_Opcode },
5932 { Bad_Opcode },
5933 { VEX_W_TABLE (VEX_W_0F3878_P_2) },
5934 },
5935
5936 /* PREFIX_VEX_0F3879 */
5937 {
5938 { Bad_Opcode },
5939 { Bad_Opcode },
5940 { VEX_W_TABLE (VEX_W_0F3879_P_2) },
5941 },
5942
5943 /* PREFIX_VEX_0F388C */
5944 {
5945 { Bad_Opcode },
5946 { Bad_Opcode },
5947 { MOD_TABLE (MOD_VEX_0F388C_PREFIX_2) },
5948 },
5949
5950 /* PREFIX_VEX_0F388E */
5951 {
5952 { Bad_Opcode },
5953 { Bad_Opcode },
5954 { MOD_TABLE (MOD_VEX_0F388E_PREFIX_2) },
5955 },
5956
5957 /* PREFIX_VEX_0F3890 */
5958 {
5959 { Bad_Opcode },
5960 { Bad_Opcode },
5961 { "vpgatherd%LW", { XM, MVexVSIBDWpX, Vex }, 0 },
5962 },
5963
5964 /* PREFIX_VEX_0F3891 */
5965 {
5966 { Bad_Opcode },
5967 { Bad_Opcode },
5968 { "vpgatherq%LW", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, 0 },
5969 },
5970
5971 /* PREFIX_VEX_0F3892 */
5972 {
5973 { Bad_Opcode },
5974 { Bad_Opcode },
5975 { "vgatherdp%XW", { XM, MVexVSIBDWpX, Vex }, 0 },
5976 },
5977
5978 /* PREFIX_VEX_0F3893 */
5979 {
5980 { Bad_Opcode },
5981 { Bad_Opcode },
5982 { "vgatherqp%XW", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, 0 },
5983 },
5984
5985 /* PREFIX_VEX_0F3896 */
5986 {
5987 { Bad_Opcode },
5988 { Bad_Opcode },
5989 { "vfmaddsub132p%XW", { XM, Vex, EXx }, 0 },
5990 },
5991
5992 /* PREFIX_VEX_0F3897 */
5993 {
5994 { Bad_Opcode },
5995 { Bad_Opcode },
5996 { "vfmsubadd132p%XW", { XM, Vex, EXx }, 0 },
5997 },
5998
5999 /* PREFIX_VEX_0F3898 */
6000 {
6001 { Bad_Opcode },
6002 { Bad_Opcode },
6003 { "vfmadd132p%XW", { XM, Vex, EXx }, 0 },
6004 },
6005
6006 /* PREFIX_VEX_0F3899 */
6007 {
6008 { Bad_Opcode },
6009 { Bad_Opcode },
6010 { "vfmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6011 },
6012
6013 /* PREFIX_VEX_0F389A */
6014 {
6015 { Bad_Opcode },
6016 { Bad_Opcode },
6017 { "vfmsub132p%XW", { XM, Vex, EXx }, 0 },
6018 },
6019
6020 /* PREFIX_VEX_0F389B */
6021 {
6022 { Bad_Opcode },
6023 { Bad_Opcode },
6024 { "vfmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6025 },
6026
6027 /* PREFIX_VEX_0F389C */
6028 {
6029 { Bad_Opcode },
6030 { Bad_Opcode },
6031 { "vfnmadd132p%XW", { XM, Vex, EXx }, 0 },
6032 },
6033
6034 /* PREFIX_VEX_0F389D */
6035 {
6036 { Bad_Opcode },
6037 { Bad_Opcode },
6038 { "vfnmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6039 },
6040
6041 /* PREFIX_VEX_0F389E */
6042 {
6043 { Bad_Opcode },
6044 { Bad_Opcode },
6045 { "vfnmsub132p%XW", { XM, Vex, EXx }, 0 },
6046 },
6047
6048 /* PREFIX_VEX_0F389F */
6049 {
6050 { Bad_Opcode },
6051 { Bad_Opcode },
6052 { "vfnmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6053 },
6054
6055 /* PREFIX_VEX_0F38A6 */
6056 {
6057 { Bad_Opcode },
6058 { Bad_Opcode },
6059 { "vfmaddsub213p%XW", { XM, Vex, EXx }, 0 },
6060 { Bad_Opcode },
6061 },
6062
6063 /* PREFIX_VEX_0F38A7 */
6064 {
6065 { Bad_Opcode },
6066 { Bad_Opcode },
6067 { "vfmsubadd213p%XW", { XM, Vex, EXx }, 0 },
6068 },
6069
6070 /* PREFIX_VEX_0F38A8 */
6071 {
6072 { Bad_Opcode },
6073 { Bad_Opcode },
6074 { "vfmadd213p%XW", { XM, Vex, EXx }, 0 },
6075 },
6076
6077 /* PREFIX_VEX_0F38A9 */
6078 {
6079 { Bad_Opcode },
6080 { Bad_Opcode },
6081 { "vfmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6082 },
6083
6084 /* PREFIX_VEX_0F38AA */
6085 {
6086 { Bad_Opcode },
6087 { Bad_Opcode },
6088 { "vfmsub213p%XW", { XM, Vex, EXx }, 0 },
6089 },
6090
6091 /* PREFIX_VEX_0F38AB */
6092 {
6093 { Bad_Opcode },
6094 { Bad_Opcode },
6095 { "vfmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6096 },
6097
6098 /* PREFIX_VEX_0F38AC */
6099 {
6100 { Bad_Opcode },
6101 { Bad_Opcode },
6102 { "vfnmadd213p%XW", { XM, Vex, EXx }, 0 },
6103 },
6104
6105 /* PREFIX_VEX_0F38AD */
6106 {
6107 { Bad_Opcode },
6108 { Bad_Opcode },
6109 { "vfnmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6110 },
6111
6112 /* PREFIX_VEX_0F38AE */
6113 {
6114 { Bad_Opcode },
6115 { Bad_Opcode },
6116 { "vfnmsub213p%XW", { XM, Vex, EXx }, 0 },
6117 },
6118
6119 /* PREFIX_VEX_0F38AF */
6120 {
6121 { Bad_Opcode },
6122 { Bad_Opcode },
6123 { "vfnmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6124 },
6125
6126 /* PREFIX_VEX_0F38B6 */
6127 {
6128 { Bad_Opcode },
6129 { Bad_Opcode },
6130 { "vfmaddsub231p%XW", { XM, Vex, EXx }, 0 },
6131 },
6132
6133 /* PREFIX_VEX_0F38B7 */
6134 {
6135 { Bad_Opcode },
6136 { Bad_Opcode },
6137 { "vfmsubadd231p%XW", { XM, Vex, EXx }, 0 },
6138 },
6139
6140 /* PREFIX_VEX_0F38B8 */
6141 {
6142 { Bad_Opcode },
6143 { Bad_Opcode },
6144 { "vfmadd231p%XW", { XM, Vex, EXx }, 0 },
6145 },
6146
6147 /* PREFIX_VEX_0F38B9 */
6148 {
6149 { Bad_Opcode },
6150 { Bad_Opcode },
6151 { "vfmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6152 },
6153
6154 /* PREFIX_VEX_0F38BA */
6155 {
6156 { Bad_Opcode },
6157 { Bad_Opcode },
6158 { "vfmsub231p%XW", { XM, Vex, EXx }, 0 },
6159 },
6160
6161 /* PREFIX_VEX_0F38BB */
6162 {
6163 { Bad_Opcode },
6164 { Bad_Opcode },
6165 { "vfmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6166 },
6167
6168 /* PREFIX_VEX_0F38BC */
6169 {
6170 { Bad_Opcode },
6171 { Bad_Opcode },
6172 { "vfnmadd231p%XW", { XM, Vex, EXx }, 0 },
6173 },
6174
6175 /* PREFIX_VEX_0F38BD */
6176 {
6177 { Bad_Opcode },
6178 { Bad_Opcode },
6179 { "vfnmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6180 },
6181
6182 /* PREFIX_VEX_0F38BE */
6183 {
6184 { Bad_Opcode },
6185 { Bad_Opcode },
6186 { "vfnmsub231p%XW", { XM, Vex, EXx }, 0 },
6187 },
6188
6189 /* PREFIX_VEX_0F38BF */
6190 {
6191 { Bad_Opcode },
6192 { Bad_Opcode },
6193 { "vfnmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6194 },
6195
6196 /* PREFIX_VEX_0F38CF */
6197 {
6198 { Bad_Opcode },
6199 { Bad_Opcode },
6200 { VEX_W_TABLE (VEX_W_0F38CF_P_2) },
6201 },
6202
6203 /* PREFIX_VEX_0F38DB */
6204 {
6205 { Bad_Opcode },
6206 { Bad_Opcode },
6207 { VEX_LEN_TABLE (VEX_LEN_0F38DB_P_2) },
6208 },
6209
6210 /* PREFIX_VEX_0F38DC */
6211 {
6212 { Bad_Opcode },
6213 { Bad_Opcode },
6214 { "vaesenc", { XM, Vex, EXx }, 0 },
6215 },
6216
6217 /* PREFIX_VEX_0F38DD */
6218 {
6219 { Bad_Opcode },
6220 { Bad_Opcode },
6221 { "vaesenclast", { XM, Vex, EXx }, 0 },
6222 },
6223
6224 /* PREFIX_VEX_0F38DE */
6225 {
6226 { Bad_Opcode },
6227 { Bad_Opcode },
6228 { "vaesdec", { XM, Vex, EXx }, 0 },
6229 },
6230
6231 /* PREFIX_VEX_0F38DF */
6232 {
6233 { Bad_Opcode },
6234 { Bad_Opcode },
6235 { "vaesdeclast", { XM, Vex, EXx }, 0 },
6236 },
6237
6238 /* PREFIX_VEX_0F38F2 */
6239 {
6240 { VEX_LEN_TABLE (VEX_LEN_0F38F2_P_0) },
6241 },
6242
6243 /* PREFIX_VEX_0F38F3_REG_1 */
6244 {
6245 { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_1_P_0) },
6246 },
6247
6248 /* PREFIX_VEX_0F38F3_REG_2 */
6249 {
6250 { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_2_P_0) },
6251 },
6252
6253 /* PREFIX_VEX_0F38F3_REG_3 */
6254 {
6255 { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_3_P_0) },
6256 },
6257
6258 /* PREFIX_VEX_0F38F5 */
6259 {
6260 { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_0) },
6261 { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_1) },
6262 { Bad_Opcode },
6263 { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_3) },
6264 },
6265
6266 /* PREFIX_VEX_0F38F6 */
6267 {
6268 { Bad_Opcode },
6269 { Bad_Opcode },
6270 { Bad_Opcode },
6271 { VEX_LEN_TABLE (VEX_LEN_0F38F6_P_3) },
6272 },
6273
6274 /* PREFIX_VEX_0F38F7 */
6275 {
6276 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_0) },
6277 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_1) },
6278 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_2) },
6279 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_3) },
6280 },
6281
6282 /* PREFIX_VEX_0F3A00 */
6283 {
6284 { Bad_Opcode },
6285 { Bad_Opcode },
6286 { VEX_LEN_TABLE (VEX_LEN_0F3A00_P_2) },
6287 },
6288
6289 /* PREFIX_VEX_0F3A01 */
6290 {
6291 { Bad_Opcode },
6292 { Bad_Opcode },
6293 { VEX_LEN_TABLE (VEX_LEN_0F3A01_P_2) },
6294 },
6295
6296 /* PREFIX_VEX_0F3A02 */
6297 {
6298 { Bad_Opcode },
6299 { Bad_Opcode },
6300 { VEX_W_TABLE (VEX_W_0F3A02_P_2) },
6301 },
6302
6303 /* PREFIX_VEX_0F3A04 */
6304 {
6305 { Bad_Opcode },
6306 { Bad_Opcode },
6307 { VEX_W_TABLE (VEX_W_0F3A04_P_2) },
6308 },
6309
6310 /* PREFIX_VEX_0F3A05 */
6311 {
6312 { Bad_Opcode },
6313 { Bad_Opcode },
6314 { VEX_W_TABLE (VEX_W_0F3A05_P_2) },
6315 },
6316
6317 /* PREFIX_VEX_0F3A06 */
6318 {
6319 { Bad_Opcode },
6320 { Bad_Opcode },
6321 { VEX_LEN_TABLE (VEX_LEN_0F3A06_P_2) },
6322 },
6323
6324 /* PREFIX_VEX_0F3A08 */
6325 {
6326 { Bad_Opcode },
6327 { Bad_Opcode },
6328 { "vroundps", { XM, EXx, Ib }, 0 },
6329 },
6330
6331 /* PREFIX_VEX_0F3A09 */
6332 {
6333 { Bad_Opcode },
6334 { Bad_Opcode },
6335 { "vroundpd", { XM, EXx, Ib }, 0 },
6336 },
6337
6338 /* PREFIX_VEX_0F3A0A */
6339 {
6340 { Bad_Opcode },
6341 { Bad_Opcode },
6342 { "vroundss", { XMScalar, VexScalar, EXdScalar, Ib }, 0 },
6343 },
6344
6345 /* PREFIX_VEX_0F3A0B */
6346 {
6347 { Bad_Opcode },
6348 { Bad_Opcode },
6349 { "vroundsd", { XMScalar, VexScalar, EXqScalar, Ib }, 0 },
6350 },
6351
6352 /* PREFIX_VEX_0F3A0C */
6353 {
6354 { Bad_Opcode },
6355 { Bad_Opcode },
6356 { "vblendps", { XM, Vex, EXx, Ib }, 0 },
6357 },
6358
6359 /* PREFIX_VEX_0F3A0D */
6360 {
6361 { Bad_Opcode },
6362 { Bad_Opcode },
6363 { "vblendpd", { XM, Vex, EXx, Ib }, 0 },
6364 },
6365
6366 /* PREFIX_VEX_0F3A0E */
6367 {
6368 { Bad_Opcode },
6369 { Bad_Opcode },
6370 { "vpblendw", { XM, Vex, EXx, Ib }, 0 },
6371 },
6372
6373 /* PREFIX_VEX_0F3A0F */
6374 {
6375 { Bad_Opcode },
6376 { Bad_Opcode },
6377 { "vpalignr", { XM, Vex, EXx, Ib }, 0 },
6378 },
6379
6380 /* PREFIX_VEX_0F3A14 */
6381 {
6382 { Bad_Opcode },
6383 { Bad_Opcode },
6384 { VEX_LEN_TABLE (VEX_LEN_0F3A14_P_2) },
6385 },
6386
6387 /* PREFIX_VEX_0F3A15 */
6388 {
6389 { Bad_Opcode },
6390 { Bad_Opcode },
6391 { VEX_LEN_TABLE (VEX_LEN_0F3A15_P_2) },
6392 },
6393
6394 /* PREFIX_VEX_0F3A16 */
6395 {
6396 { Bad_Opcode },
6397 { Bad_Opcode },
6398 { VEX_LEN_TABLE (VEX_LEN_0F3A16_P_2) },
6399 },
6400
6401 /* PREFIX_VEX_0F3A17 */
6402 {
6403 { Bad_Opcode },
6404 { Bad_Opcode },
6405 { VEX_LEN_TABLE (VEX_LEN_0F3A17_P_2) },
6406 },
6407
6408 /* PREFIX_VEX_0F3A18 */
6409 {
6410 { Bad_Opcode },
6411 { Bad_Opcode },
6412 { VEX_LEN_TABLE (VEX_LEN_0F3A18_P_2) },
6413 },
6414
6415 /* PREFIX_VEX_0F3A19 */
6416 {
6417 { Bad_Opcode },
6418 { Bad_Opcode },
6419 { VEX_LEN_TABLE (VEX_LEN_0F3A19_P_2) },
6420 },
6421
6422 /* PREFIX_VEX_0F3A1D */
6423 {
6424 { Bad_Opcode },
6425 { Bad_Opcode },
6426 { "vcvtps2ph", { EXxmmq, XM, Ib }, 0 },
6427 },
6428
6429 /* PREFIX_VEX_0F3A20 */
6430 {
6431 { Bad_Opcode },
6432 { Bad_Opcode },
6433 { VEX_LEN_TABLE (VEX_LEN_0F3A20_P_2) },
6434 },
6435
6436 /* PREFIX_VEX_0F3A21 */
6437 {
6438 { Bad_Opcode },
6439 { Bad_Opcode },
6440 { VEX_LEN_TABLE (VEX_LEN_0F3A21_P_2) },
6441 },
6442
6443 /* PREFIX_VEX_0F3A22 */
6444 {
6445 { Bad_Opcode },
6446 { Bad_Opcode },
6447 { VEX_LEN_TABLE (VEX_LEN_0F3A22_P_2) },
6448 },
6449
6450 /* PREFIX_VEX_0F3A30 */
6451 {
6452 { Bad_Opcode },
6453 { Bad_Opcode },
6454 { VEX_LEN_TABLE (VEX_LEN_0F3A30_P_2) },
6455 },
6456
6457 /* PREFIX_VEX_0F3A31 */
6458 {
6459 { Bad_Opcode },
6460 { Bad_Opcode },
6461 { VEX_LEN_TABLE (VEX_LEN_0F3A31_P_2) },
6462 },
6463
6464 /* PREFIX_VEX_0F3A32 */
6465 {
6466 { Bad_Opcode },
6467 { Bad_Opcode },
6468 { VEX_LEN_TABLE (VEX_LEN_0F3A32_P_2) },
6469 },
6470
6471 /* PREFIX_VEX_0F3A33 */
6472 {
6473 { Bad_Opcode },
6474 { Bad_Opcode },
6475 { VEX_LEN_TABLE (VEX_LEN_0F3A33_P_2) },
6476 },
6477
6478 /* PREFIX_VEX_0F3A38 */
6479 {
6480 { Bad_Opcode },
6481 { Bad_Opcode },
6482 { VEX_LEN_TABLE (VEX_LEN_0F3A38_P_2) },
6483 },
6484
6485 /* PREFIX_VEX_0F3A39 */
6486 {
6487 { Bad_Opcode },
6488 { Bad_Opcode },
6489 { VEX_LEN_TABLE (VEX_LEN_0F3A39_P_2) },
6490 },
6491
6492 /* PREFIX_VEX_0F3A40 */
6493 {
6494 { Bad_Opcode },
6495 { Bad_Opcode },
6496 { "vdpps", { XM, Vex, EXx, Ib }, 0 },
6497 },
6498
6499 /* PREFIX_VEX_0F3A41 */
6500 {
6501 { Bad_Opcode },
6502 { Bad_Opcode },
6503 { VEX_LEN_TABLE (VEX_LEN_0F3A41_P_2) },
6504 },
6505
6506 /* PREFIX_VEX_0F3A42 */
6507 {
6508 { Bad_Opcode },
6509 { Bad_Opcode },
6510 { "vmpsadbw", { XM, Vex, EXx, Ib }, 0 },
6511 },
6512
6513 /* PREFIX_VEX_0F3A44 */
6514 {
6515 { Bad_Opcode },
6516 { Bad_Opcode },
6517 { "vpclmulqdq", { XM, Vex, EXx, PCLMUL }, 0 },
6518 },
6519
6520 /* PREFIX_VEX_0F3A46 */
6521 {
6522 { Bad_Opcode },
6523 { Bad_Opcode },
6524 { VEX_LEN_TABLE (VEX_LEN_0F3A46_P_2) },
6525 },
6526
6527 /* PREFIX_VEX_0F3A48 */
6528 {
6529 { Bad_Opcode },
6530 { Bad_Opcode },
6531 { VEX_W_TABLE (VEX_W_0F3A48_P_2) },
6532 },
6533
6534 /* PREFIX_VEX_0F3A49 */
6535 {
6536 { Bad_Opcode },
6537 { Bad_Opcode },
6538 { VEX_W_TABLE (VEX_W_0F3A49_P_2) },
6539 },
6540
6541 /* PREFIX_VEX_0F3A4A */
6542 {
6543 { Bad_Opcode },
6544 { Bad_Opcode },
6545 { VEX_W_TABLE (VEX_W_0F3A4A_P_2) },
6546 },
6547
6548 /* PREFIX_VEX_0F3A4B */
6549 {
6550 { Bad_Opcode },
6551 { Bad_Opcode },
6552 { VEX_W_TABLE (VEX_W_0F3A4B_P_2) },
6553 },
6554
6555 /* PREFIX_VEX_0F3A4C */
6556 {
6557 { Bad_Opcode },
6558 { Bad_Opcode },
6559 { VEX_W_TABLE (VEX_W_0F3A4C_P_2) },
6560 },
6561
6562 /* PREFIX_VEX_0F3A5C */
6563 {
6564 { Bad_Opcode },
6565 { Bad_Opcode },
6566 { "vfmaddsubps", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6567 },
6568
6569 /* PREFIX_VEX_0F3A5D */
6570 {
6571 { Bad_Opcode },
6572 { Bad_Opcode },
6573 { "vfmaddsubpd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6574 },
6575
6576 /* PREFIX_VEX_0F3A5E */
6577 {
6578 { Bad_Opcode },
6579 { Bad_Opcode },
6580 { "vfmsubaddps", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6581 },
6582
6583 /* PREFIX_VEX_0F3A5F */
6584 {
6585 { Bad_Opcode },
6586 { Bad_Opcode },
6587 { "vfmsubaddpd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6588 },
6589
6590 /* PREFIX_VEX_0F3A60 */
6591 {
6592 { Bad_Opcode },
6593 { Bad_Opcode },
6594 { VEX_LEN_TABLE (VEX_LEN_0F3A60_P_2) },
6595 { Bad_Opcode },
6596 },
6597
6598 /* PREFIX_VEX_0F3A61 */
6599 {
6600 { Bad_Opcode },
6601 { Bad_Opcode },
6602 { VEX_LEN_TABLE (VEX_LEN_0F3A61_P_2) },
6603 },
6604
6605 /* PREFIX_VEX_0F3A62 */
6606 {
6607 { Bad_Opcode },
6608 { Bad_Opcode },
6609 { VEX_LEN_TABLE (VEX_LEN_0F3A62_P_2) },
6610 },
6611
6612 /* PREFIX_VEX_0F3A63 */
6613 {
6614 { Bad_Opcode },
6615 { Bad_Opcode },
6616 { VEX_LEN_TABLE (VEX_LEN_0F3A63_P_2) },
6617 },
6618
6619 /* PREFIX_VEX_0F3A68 */
6620 {
6621 { Bad_Opcode },
6622 { Bad_Opcode },
6623 { "vfmaddps", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6624 },
6625
6626 /* PREFIX_VEX_0F3A69 */
6627 {
6628 { Bad_Opcode },
6629 { Bad_Opcode },
6630 { "vfmaddpd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6631 },
6632
6633 /* PREFIX_VEX_0F3A6A */
6634 {
6635 { Bad_Opcode },
6636 { Bad_Opcode },
6637 { VEX_LEN_TABLE (VEX_LEN_0F3A6A_P_2) },
6638 },
6639
6640 /* PREFIX_VEX_0F3A6B */
6641 {
6642 { Bad_Opcode },
6643 { Bad_Opcode },
6644 { VEX_LEN_TABLE (VEX_LEN_0F3A6B_P_2) },
6645 },
6646
6647 /* PREFIX_VEX_0F3A6C */
6648 {
6649 { Bad_Opcode },
6650 { Bad_Opcode },
6651 { "vfmsubps", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6652 },
6653
6654 /* PREFIX_VEX_0F3A6D */
6655 {
6656 { Bad_Opcode },
6657 { Bad_Opcode },
6658 { "vfmsubpd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6659 },
6660
6661 /* PREFIX_VEX_0F3A6E */
6662 {
6663 { Bad_Opcode },
6664 { Bad_Opcode },
6665 { VEX_LEN_TABLE (VEX_LEN_0F3A6E_P_2) },
6666 },
6667
6668 /* PREFIX_VEX_0F3A6F */
6669 {
6670 { Bad_Opcode },
6671 { Bad_Opcode },
6672 { VEX_LEN_TABLE (VEX_LEN_0F3A6F_P_2) },
6673 },
6674
6675 /* PREFIX_VEX_0F3A78 */
6676 {
6677 { Bad_Opcode },
6678 { Bad_Opcode },
6679 { "vfnmaddps", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6680 },
6681
6682 /* PREFIX_VEX_0F3A79 */
6683 {
6684 { Bad_Opcode },
6685 { Bad_Opcode },
6686 { "vfnmaddpd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6687 },
6688
6689 /* PREFIX_VEX_0F3A7A */
6690 {
6691 { Bad_Opcode },
6692 { Bad_Opcode },
6693 { VEX_LEN_TABLE (VEX_LEN_0F3A7A_P_2) },
6694 },
6695
6696 /* PREFIX_VEX_0F3A7B */
6697 {
6698 { Bad_Opcode },
6699 { Bad_Opcode },
6700 { VEX_LEN_TABLE (VEX_LEN_0F3A7B_P_2) },
6701 },
6702
6703 /* PREFIX_VEX_0F3A7C */
6704 {
6705 { Bad_Opcode },
6706 { Bad_Opcode },
6707 { "vfnmsubps", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6708 { Bad_Opcode },
6709 },
6710
6711 /* PREFIX_VEX_0F3A7D */
6712 {
6713 { Bad_Opcode },
6714 { Bad_Opcode },
6715 { "vfnmsubpd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6716 },
6717
6718 /* PREFIX_VEX_0F3A7E */
6719 {
6720 { Bad_Opcode },
6721 { Bad_Opcode },
6722 { VEX_LEN_TABLE (VEX_LEN_0F3A7E_P_2) },
6723 },
6724
6725 /* PREFIX_VEX_0F3A7F */
6726 {
6727 { Bad_Opcode },
6728 { Bad_Opcode },
6729 { VEX_LEN_TABLE (VEX_LEN_0F3A7F_P_2) },
6730 },
6731
6732 /* PREFIX_VEX_0F3ACE */
6733 {
6734 { Bad_Opcode },
6735 { Bad_Opcode },
6736 { VEX_W_TABLE (VEX_W_0F3ACE_P_2) },
6737 },
6738
6739 /* PREFIX_VEX_0F3ACF */
6740 {
6741 { Bad_Opcode },
6742 { Bad_Opcode },
6743 { VEX_W_TABLE (VEX_W_0F3ACF_P_2) },
6744 },
6745
6746 /* PREFIX_VEX_0F3ADF */
6747 {
6748 { Bad_Opcode },
6749 { Bad_Opcode },
6750 { VEX_LEN_TABLE (VEX_LEN_0F3ADF_P_2) },
6751 },
6752
6753 /* PREFIX_VEX_0F3AF0 */
6754 {
6755 { Bad_Opcode },
6756 { Bad_Opcode },
6757 { Bad_Opcode },
6758 { VEX_LEN_TABLE (VEX_LEN_0F3AF0_P_3) },
6759 },
6760
6761 #define NEED_PREFIX_TABLE
6762 #include "i386-dis-evex.h"
6763 #undef NEED_PREFIX_TABLE
6764 };
6765
6766 static const struct dis386 x86_64_table[][2] = {
6767 /* X86_64_06 */
6768 {
6769 { "pushP", { es }, 0 },
6770 },
6771
6772 /* X86_64_07 */
6773 {
6774 { "popP", { es }, 0 },
6775 },
6776
6777 /* X86_64_0D */
6778 {
6779 { "pushP", { cs }, 0 },
6780 },
6781
6782 /* X86_64_16 */
6783 {
6784 { "pushP", { ss }, 0 },
6785 },
6786
6787 /* X86_64_17 */
6788 {
6789 { "popP", { ss }, 0 },
6790 },
6791
6792 /* X86_64_1E */
6793 {
6794 { "pushP", { ds }, 0 },
6795 },
6796
6797 /* X86_64_1F */
6798 {
6799 { "popP", { ds }, 0 },
6800 },
6801
6802 /* X86_64_27 */
6803 {
6804 { "daa", { XX }, 0 },
6805 },
6806
6807 /* X86_64_2F */
6808 {
6809 { "das", { XX }, 0 },
6810 },
6811
6812 /* X86_64_37 */
6813 {
6814 { "aaa", { XX }, 0 },
6815 },
6816
6817 /* X86_64_3F */
6818 {
6819 { "aas", { XX }, 0 },
6820 },
6821
6822 /* X86_64_60 */
6823 {
6824 { "pushaP", { XX }, 0 },
6825 },
6826
6827 /* X86_64_61 */
6828 {
6829 { "popaP", { XX }, 0 },
6830 },
6831
6832 /* X86_64_62 */
6833 {
6834 { MOD_TABLE (MOD_62_32BIT) },
6835 { EVEX_TABLE (EVEX_0F) },
6836 },
6837
6838 /* X86_64_63 */
6839 {
6840 { "arpl", { Ew, Gw }, 0 },
6841 { "movs{lq|xd}", { Gv, Ed }, 0 },
6842 },
6843
6844 /* X86_64_6D */
6845 {
6846 { "ins{R|}", { Yzr, indirDX }, 0 },
6847 { "ins{G|}", { Yzr, indirDX }, 0 },
6848 },
6849
6850 /* X86_64_6F */
6851 {
6852 { "outs{R|}", { indirDXr, Xz }, 0 },
6853 { "outs{G|}", { indirDXr, Xz }, 0 },
6854 },
6855
6856 /* X86_64_82 */
6857 {
6858 /* Opcode 0x82 is an alias of opcode 0x80 in 32-bit mode. */
6859 { REG_TABLE (REG_80) },
6860 },
6861
6862 /* X86_64_9A */
6863 {
6864 { "Jcall{T|}", { Ap }, 0 },
6865 },
6866
6867 /* X86_64_C4 */
6868 {
6869 { MOD_TABLE (MOD_C4_32BIT) },
6870 { VEX_C4_TABLE (VEX_0F) },
6871 },
6872
6873 /* X86_64_C5 */
6874 {
6875 { MOD_TABLE (MOD_C5_32BIT) },
6876 { VEX_C5_TABLE (VEX_0F) },
6877 },
6878
6879 /* X86_64_CE */
6880 {
6881 { "into", { XX }, 0 },
6882 },
6883
6884 /* X86_64_D4 */
6885 {
6886 { "aam", { Ib }, 0 },
6887 },
6888
6889 /* X86_64_D5 */
6890 {
6891 { "aad", { Ib }, 0 },
6892 },
6893
6894 /* X86_64_E8 */
6895 {
6896 { "callP", { Jv, BND }, 0 },
6897 { "call@", { Jv, BND }, 0 }
6898 },
6899
6900 /* X86_64_E9 */
6901 {
6902 { "jmpP", { Jv, BND }, 0 },
6903 { "jmp@", { Jv, BND }, 0 }
6904 },
6905
6906 /* X86_64_EA */
6907 {
6908 { "Jjmp{T|}", { Ap }, 0 },
6909 },
6910
6911 /* X86_64_0F01_REG_0 */
6912 {
6913 { "sgdt{Q|IQ}", { M }, 0 },
6914 { "sgdt", { M }, 0 },
6915 },
6916
6917 /* X86_64_0F01_REG_1 */
6918 {
6919 { "sidt{Q|IQ}", { M }, 0 },
6920 { "sidt", { M }, 0 },
6921 },
6922
6923 /* X86_64_0F01_REG_2 */
6924 {
6925 { "lgdt{Q|Q}", { M }, 0 },
6926 { "lgdt", { M }, 0 },
6927 },
6928
6929 /* X86_64_0F01_REG_3 */
6930 {
6931 { "lidt{Q|Q}", { M }, 0 },
6932 { "lidt", { M }, 0 },
6933 },
6934 };
6935
6936 static const struct dis386 three_byte_table[][256] = {
6937
6938 /* THREE_BYTE_0F38 */
6939 {
6940 /* 00 */
6941 { "pshufb", { MX, EM }, PREFIX_OPCODE },
6942 { "phaddw", { MX, EM }, PREFIX_OPCODE },
6943 { "phaddd", { MX, EM }, PREFIX_OPCODE },
6944 { "phaddsw", { MX, EM }, PREFIX_OPCODE },
6945 { "pmaddubsw", { MX, EM }, PREFIX_OPCODE },
6946 { "phsubw", { MX, EM }, PREFIX_OPCODE },
6947 { "phsubd", { MX, EM }, PREFIX_OPCODE },
6948 { "phsubsw", { MX, EM }, PREFIX_OPCODE },
6949 /* 08 */
6950 { "psignb", { MX, EM }, PREFIX_OPCODE },
6951 { "psignw", { MX, EM }, PREFIX_OPCODE },
6952 { "psignd", { MX, EM }, PREFIX_OPCODE },
6953 { "pmulhrsw", { MX, EM }, PREFIX_OPCODE },
6954 { Bad_Opcode },
6955 { Bad_Opcode },
6956 { Bad_Opcode },
6957 { Bad_Opcode },
6958 /* 10 */
6959 { PREFIX_TABLE (PREFIX_0F3810) },
6960 { Bad_Opcode },
6961 { Bad_Opcode },
6962 { Bad_Opcode },
6963 { PREFIX_TABLE (PREFIX_0F3814) },
6964 { PREFIX_TABLE (PREFIX_0F3815) },
6965 { Bad_Opcode },
6966 { PREFIX_TABLE (PREFIX_0F3817) },
6967 /* 18 */
6968 { Bad_Opcode },
6969 { Bad_Opcode },
6970 { Bad_Opcode },
6971 { Bad_Opcode },
6972 { "pabsb", { MX, EM }, PREFIX_OPCODE },
6973 { "pabsw", { MX, EM }, PREFIX_OPCODE },
6974 { "pabsd", { MX, EM }, PREFIX_OPCODE },
6975 { Bad_Opcode },
6976 /* 20 */
6977 { PREFIX_TABLE (PREFIX_0F3820) },
6978 { PREFIX_TABLE (PREFIX_0F3821) },
6979 { PREFIX_TABLE (PREFIX_0F3822) },
6980 { PREFIX_TABLE (PREFIX_0F3823) },
6981 { PREFIX_TABLE (PREFIX_0F3824) },
6982 { PREFIX_TABLE (PREFIX_0F3825) },
6983 { Bad_Opcode },
6984 { Bad_Opcode },
6985 /* 28 */
6986 { PREFIX_TABLE (PREFIX_0F3828) },
6987 { PREFIX_TABLE (PREFIX_0F3829) },
6988 { PREFIX_TABLE (PREFIX_0F382A) },
6989 { PREFIX_TABLE (PREFIX_0F382B) },
6990 { Bad_Opcode },
6991 { Bad_Opcode },
6992 { Bad_Opcode },
6993 { Bad_Opcode },
6994 /* 30 */
6995 { PREFIX_TABLE (PREFIX_0F3830) },
6996 { PREFIX_TABLE (PREFIX_0F3831) },
6997 { PREFIX_TABLE (PREFIX_0F3832) },
6998 { PREFIX_TABLE (PREFIX_0F3833) },
6999 { PREFIX_TABLE (PREFIX_0F3834) },
7000 { PREFIX_TABLE (PREFIX_0F3835) },
7001 { Bad_Opcode },
7002 { PREFIX_TABLE (PREFIX_0F3837) },
7003 /* 38 */
7004 { PREFIX_TABLE (PREFIX_0F3838) },
7005 { PREFIX_TABLE (PREFIX_0F3839) },
7006 { PREFIX_TABLE (PREFIX_0F383A) },
7007 { PREFIX_TABLE (PREFIX_0F383B) },
7008 { PREFIX_TABLE (PREFIX_0F383C) },
7009 { PREFIX_TABLE (PREFIX_0F383D) },
7010 { PREFIX_TABLE (PREFIX_0F383E) },
7011 { PREFIX_TABLE (PREFIX_0F383F) },
7012 /* 40 */
7013 { PREFIX_TABLE (PREFIX_0F3840) },
7014 { PREFIX_TABLE (PREFIX_0F3841) },
7015 { Bad_Opcode },
7016 { Bad_Opcode },
7017 { Bad_Opcode },
7018 { Bad_Opcode },
7019 { Bad_Opcode },
7020 { Bad_Opcode },
7021 /* 48 */
7022 { Bad_Opcode },
7023 { Bad_Opcode },
7024 { Bad_Opcode },
7025 { Bad_Opcode },
7026 { Bad_Opcode },
7027 { Bad_Opcode },
7028 { Bad_Opcode },
7029 { Bad_Opcode },
7030 /* 50 */
7031 { Bad_Opcode },
7032 { Bad_Opcode },
7033 { Bad_Opcode },
7034 { Bad_Opcode },
7035 { Bad_Opcode },
7036 { Bad_Opcode },
7037 { Bad_Opcode },
7038 { Bad_Opcode },
7039 /* 58 */
7040 { Bad_Opcode },
7041 { Bad_Opcode },
7042 { Bad_Opcode },
7043 { Bad_Opcode },
7044 { Bad_Opcode },
7045 { Bad_Opcode },
7046 { Bad_Opcode },
7047 { Bad_Opcode },
7048 /* 60 */
7049 { Bad_Opcode },
7050 { Bad_Opcode },
7051 { Bad_Opcode },
7052 { Bad_Opcode },
7053 { Bad_Opcode },
7054 { Bad_Opcode },
7055 { Bad_Opcode },
7056 { Bad_Opcode },
7057 /* 68 */
7058 { Bad_Opcode },
7059 { Bad_Opcode },
7060 { Bad_Opcode },
7061 { Bad_Opcode },
7062 { Bad_Opcode },
7063 { Bad_Opcode },
7064 { Bad_Opcode },
7065 { Bad_Opcode },
7066 /* 70 */
7067 { Bad_Opcode },
7068 { Bad_Opcode },
7069 { Bad_Opcode },
7070 { Bad_Opcode },
7071 { Bad_Opcode },
7072 { Bad_Opcode },
7073 { Bad_Opcode },
7074 { Bad_Opcode },
7075 /* 78 */
7076 { Bad_Opcode },
7077 { Bad_Opcode },
7078 { Bad_Opcode },
7079 { Bad_Opcode },
7080 { Bad_Opcode },
7081 { Bad_Opcode },
7082 { Bad_Opcode },
7083 { Bad_Opcode },
7084 /* 80 */
7085 { PREFIX_TABLE (PREFIX_0F3880) },
7086 { PREFIX_TABLE (PREFIX_0F3881) },
7087 { PREFIX_TABLE (PREFIX_0F3882) },
7088 { Bad_Opcode },
7089 { Bad_Opcode },
7090 { Bad_Opcode },
7091 { Bad_Opcode },
7092 { Bad_Opcode },
7093 /* 88 */
7094 { Bad_Opcode },
7095 { Bad_Opcode },
7096 { Bad_Opcode },
7097 { Bad_Opcode },
7098 { Bad_Opcode },
7099 { Bad_Opcode },
7100 { Bad_Opcode },
7101 { Bad_Opcode },
7102 /* 90 */
7103 { Bad_Opcode },
7104 { Bad_Opcode },
7105 { Bad_Opcode },
7106 { Bad_Opcode },
7107 { Bad_Opcode },
7108 { Bad_Opcode },
7109 { Bad_Opcode },
7110 { Bad_Opcode },
7111 /* 98 */
7112 { Bad_Opcode },
7113 { Bad_Opcode },
7114 { Bad_Opcode },
7115 { Bad_Opcode },
7116 { Bad_Opcode },
7117 { Bad_Opcode },
7118 { Bad_Opcode },
7119 { Bad_Opcode },
7120 /* a0 */
7121 { Bad_Opcode },
7122 { Bad_Opcode },
7123 { Bad_Opcode },
7124 { Bad_Opcode },
7125 { Bad_Opcode },
7126 { Bad_Opcode },
7127 { Bad_Opcode },
7128 { Bad_Opcode },
7129 /* a8 */
7130 { Bad_Opcode },
7131 { Bad_Opcode },
7132 { Bad_Opcode },
7133 { Bad_Opcode },
7134 { Bad_Opcode },
7135 { Bad_Opcode },
7136 { Bad_Opcode },
7137 { Bad_Opcode },
7138 /* b0 */
7139 { Bad_Opcode },
7140 { Bad_Opcode },
7141 { Bad_Opcode },
7142 { Bad_Opcode },
7143 { Bad_Opcode },
7144 { Bad_Opcode },
7145 { Bad_Opcode },
7146 { Bad_Opcode },
7147 /* b8 */
7148 { Bad_Opcode },
7149 { Bad_Opcode },
7150 { Bad_Opcode },
7151 { Bad_Opcode },
7152 { Bad_Opcode },
7153 { Bad_Opcode },
7154 { Bad_Opcode },
7155 { Bad_Opcode },
7156 /* c0 */
7157 { Bad_Opcode },
7158 { Bad_Opcode },
7159 { Bad_Opcode },
7160 { Bad_Opcode },
7161 { Bad_Opcode },
7162 { Bad_Opcode },
7163 { Bad_Opcode },
7164 { Bad_Opcode },
7165 /* c8 */
7166 { PREFIX_TABLE (PREFIX_0F38C8) },
7167 { PREFIX_TABLE (PREFIX_0F38C9) },
7168 { PREFIX_TABLE (PREFIX_0F38CA) },
7169 { PREFIX_TABLE (PREFIX_0F38CB) },
7170 { PREFIX_TABLE (PREFIX_0F38CC) },
7171 { PREFIX_TABLE (PREFIX_0F38CD) },
7172 { Bad_Opcode },
7173 { PREFIX_TABLE (PREFIX_0F38CF) },
7174 /* d0 */
7175 { Bad_Opcode },
7176 { Bad_Opcode },
7177 { Bad_Opcode },
7178 { Bad_Opcode },
7179 { Bad_Opcode },
7180 { Bad_Opcode },
7181 { Bad_Opcode },
7182 { Bad_Opcode },
7183 /* d8 */
7184 { Bad_Opcode },
7185 { Bad_Opcode },
7186 { Bad_Opcode },
7187 { PREFIX_TABLE (PREFIX_0F38DB) },
7188 { PREFIX_TABLE (PREFIX_0F38DC) },
7189 { PREFIX_TABLE (PREFIX_0F38DD) },
7190 { PREFIX_TABLE (PREFIX_0F38DE) },
7191 { PREFIX_TABLE (PREFIX_0F38DF) },
7192 /* e0 */
7193 { Bad_Opcode },
7194 { Bad_Opcode },
7195 { Bad_Opcode },
7196 { Bad_Opcode },
7197 { Bad_Opcode },
7198 { Bad_Opcode },
7199 { Bad_Opcode },
7200 { Bad_Opcode },
7201 /* e8 */
7202 { Bad_Opcode },
7203 { Bad_Opcode },
7204 { Bad_Opcode },
7205 { Bad_Opcode },
7206 { Bad_Opcode },
7207 { Bad_Opcode },
7208 { Bad_Opcode },
7209 { Bad_Opcode },
7210 /* f0 */
7211 { PREFIX_TABLE (PREFIX_0F38F0) },
7212 { PREFIX_TABLE (PREFIX_0F38F1) },
7213 { Bad_Opcode },
7214 { Bad_Opcode },
7215 { Bad_Opcode },
7216 { PREFIX_TABLE (PREFIX_0F38F5) },
7217 { PREFIX_TABLE (PREFIX_0F38F6) },
7218 { Bad_Opcode },
7219 /* f8 */
7220 { PREFIX_TABLE (PREFIX_0F38F8) },
7221 { PREFIX_TABLE (PREFIX_0F38F9) },
7222 { Bad_Opcode },
7223 { Bad_Opcode },
7224 { Bad_Opcode },
7225 { Bad_Opcode },
7226 { Bad_Opcode },
7227 { Bad_Opcode },
7228 },
7229 /* THREE_BYTE_0F3A */
7230 {
7231 /* 00 */
7232 { Bad_Opcode },
7233 { Bad_Opcode },
7234 { Bad_Opcode },
7235 { Bad_Opcode },
7236 { Bad_Opcode },
7237 { Bad_Opcode },
7238 { Bad_Opcode },
7239 { Bad_Opcode },
7240 /* 08 */
7241 { PREFIX_TABLE (PREFIX_0F3A08) },
7242 { PREFIX_TABLE (PREFIX_0F3A09) },
7243 { PREFIX_TABLE (PREFIX_0F3A0A) },
7244 { PREFIX_TABLE (PREFIX_0F3A0B) },
7245 { PREFIX_TABLE (PREFIX_0F3A0C) },
7246 { PREFIX_TABLE (PREFIX_0F3A0D) },
7247 { PREFIX_TABLE (PREFIX_0F3A0E) },
7248 { "palignr", { MX, EM, Ib }, PREFIX_OPCODE },
7249 /* 10 */
7250 { Bad_Opcode },
7251 { Bad_Opcode },
7252 { Bad_Opcode },
7253 { Bad_Opcode },
7254 { PREFIX_TABLE (PREFIX_0F3A14) },
7255 { PREFIX_TABLE (PREFIX_0F3A15) },
7256 { PREFIX_TABLE (PREFIX_0F3A16) },
7257 { PREFIX_TABLE (PREFIX_0F3A17) },
7258 /* 18 */
7259 { Bad_Opcode },
7260 { Bad_Opcode },
7261 { Bad_Opcode },
7262 { Bad_Opcode },
7263 { Bad_Opcode },
7264 { Bad_Opcode },
7265 { Bad_Opcode },
7266 { Bad_Opcode },
7267 /* 20 */
7268 { PREFIX_TABLE (PREFIX_0F3A20) },
7269 { PREFIX_TABLE (PREFIX_0F3A21) },
7270 { PREFIX_TABLE (PREFIX_0F3A22) },
7271 { Bad_Opcode },
7272 { Bad_Opcode },
7273 { Bad_Opcode },
7274 { Bad_Opcode },
7275 { Bad_Opcode },
7276 /* 28 */
7277 { Bad_Opcode },
7278 { Bad_Opcode },
7279 { Bad_Opcode },
7280 { Bad_Opcode },
7281 { Bad_Opcode },
7282 { Bad_Opcode },
7283 { Bad_Opcode },
7284 { Bad_Opcode },
7285 /* 30 */
7286 { Bad_Opcode },
7287 { Bad_Opcode },
7288 { Bad_Opcode },
7289 { Bad_Opcode },
7290 { Bad_Opcode },
7291 { Bad_Opcode },
7292 { Bad_Opcode },
7293 { Bad_Opcode },
7294 /* 38 */
7295 { Bad_Opcode },
7296 { Bad_Opcode },
7297 { Bad_Opcode },
7298 { Bad_Opcode },
7299 { Bad_Opcode },
7300 { Bad_Opcode },
7301 { Bad_Opcode },
7302 { Bad_Opcode },
7303 /* 40 */
7304 { PREFIX_TABLE (PREFIX_0F3A40) },
7305 { PREFIX_TABLE (PREFIX_0F3A41) },
7306 { PREFIX_TABLE (PREFIX_0F3A42) },
7307 { Bad_Opcode },
7308 { PREFIX_TABLE (PREFIX_0F3A44) },
7309 { Bad_Opcode },
7310 { Bad_Opcode },
7311 { Bad_Opcode },
7312 /* 48 */
7313 { Bad_Opcode },
7314 { Bad_Opcode },
7315 { Bad_Opcode },
7316 { Bad_Opcode },
7317 { Bad_Opcode },
7318 { Bad_Opcode },
7319 { Bad_Opcode },
7320 { Bad_Opcode },
7321 /* 50 */
7322 { Bad_Opcode },
7323 { Bad_Opcode },
7324 { Bad_Opcode },
7325 { Bad_Opcode },
7326 { Bad_Opcode },
7327 { Bad_Opcode },
7328 { Bad_Opcode },
7329 { Bad_Opcode },
7330 /* 58 */
7331 { Bad_Opcode },
7332 { Bad_Opcode },
7333 { Bad_Opcode },
7334 { Bad_Opcode },
7335 { Bad_Opcode },
7336 { Bad_Opcode },
7337 { Bad_Opcode },
7338 { Bad_Opcode },
7339 /* 60 */
7340 { PREFIX_TABLE (PREFIX_0F3A60) },
7341 { PREFIX_TABLE (PREFIX_0F3A61) },
7342 { PREFIX_TABLE (PREFIX_0F3A62) },
7343 { PREFIX_TABLE (PREFIX_0F3A63) },
7344 { Bad_Opcode },
7345 { Bad_Opcode },
7346 { Bad_Opcode },
7347 { Bad_Opcode },
7348 /* 68 */
7349 { Bad_Opcode },
7350 { Bad_Opcode },
7351 { Bad_Opcode },
7352 { Bad_Opcode },
7353 { Bad_Opcode },
7354 { Bad_Opcode },
7355 { Bad_Opcode },
7356 { Bad_Opcode },
7357 /* 70 */
7358 { Bad_Opcode },
7359 { Bad_Opcode },
7360 { Bad_Opcode },
7361 { Bad_Opcode },
7362 { Bad_Opcode },
7363 { Bad_Opcode },
7364 { Bad_Opcode },
7365 { Bad_Opcode },
7366 /* 78 */
7367 { Bad_Opcode },
7368 { Bad_Opcode },
7369 { Bad_Opcode },
7370 { Bad_Opcode },
7371 { Bad_Opcode },
7372 { Bad_Opcode },
7373 { Bad_Opcode },
7374 { Bad_Opcode },
7375 /* 80 */
7376 { Bad_Opcode },
7377 { Bad_Opcode },
7378 { Bad_Opcode },
7379 { Bad_Opcode },
7380 { Bad_Opcode },
7381 { Bad_Opcode },
7382 { Bad_Opcode },
7383 { Bad_Opcode },
7384 /* 88 */
7385 { Bad_Opcode },
7386 { Bad_Opcode },
7387 { Bad_Opcode },
7388 { Bad_Opcode },
7389 { Bad_Opcode },
7390 { Bad_Opcode },
7391 { Bad_Opcode },
7392 { Bad_Opcode },
7393 /* 90 */
7394 { Bad_Opcode },
7395 { Bad_Opcode },
7396 { Bad_Opcode },
7397 { Bad_Opcode },
7398 { Bad_Opcode },
7399 { Bad_Opcode },
7400 { Bad_Opcode },
7401 { Bad_Opcode },
7402 /* 98 */
7403 { Bad_Opcode },
7404 { Bad_Opcode },
7405 { Bad_Opcode },
7406 { Bad_Opcode },
7407 { Bad_Opcode },
7408 { Bad_Opcode },
7409 { Bad_Opcode },
7410 { Bad_Opcode },
7411 /* a0 */
7412 { Bad_Opcode },
7413 { Bad_Opcode },
7414 { Bad_Opcode },
7415 { Bad_Opcode },
7416 { Bad_Opcode },
7417 { Bad_Opcode },
7418 { Bad_Opcode },
7419 { Bad_Opcode },
7420 /* a8 */
7421 { Bad_Opcode },
7422 { Bad_Opcode },
7423 { Bad_Opcode },
7424 { Bad_Opcode },
7425 { Bad_Opcode },
7426 { Bad_Opcode },
7427 { Bad_Opcode },
7428 { Bad_Opcode },
7429 /* b0 */
7430 { Bad_Opcode },
7431 { Bad_Opcode },
7432 { Bad_Opcode },
7433 { Bad_Opcode },
7434 { Bad_Opcode },
7435 { Bad_Opcode },
7436 { Bad_Opcode },
7437 { Bad_Opcode },
7438 /* b8 */
7439 { Bad_Opcode },
7440 { Bad_Opcode },
7441 { Bad_Opcode },
7442 { Bad_Opcode },
7443 { Bad_Opcode },
7444 { Bad_Opcode },
7445 { Bad_Opcode },
7446 { Bad_Opcode },
7447 /* c0 */
7448 { Bad_Opcode },
7449 { Bad_Opcode },
7450 { Bad_Opcode },
7451 { Bad_Opcode },
7452 { Bad_Opcode },
7453 { Bad_Opcode },
7454 { Bad_Opcode },
7455 { Bad_Opcode },
7456 /* c8 */
7457 { Bad_Opcode },
7458 { Bad_Opcode },
7459 { Bad_Opcode },
7460 { Bad_Opcode },
7461 { PREFIX_TABLE (PREFIX_0F3ACC) },
7462 { Bad_Opcode },
7463 { PREFIX_TABLE (PREFIX_0F3ACE) },
7464 { PREFIX_TABLE (PREFIX_0F3ACF) },
7465 /* d0 */
7466 { Bad_Opcode },
7467 { Bad_Opcode },
7468 { Bad_Opcode },
7469 { Bad_Opcode },
7470 { Bad_Opcode },
7471 { Bad_Opcode },
7472 { Bad_Opcode },
7473 { Bad_Opcode },
7474 /* d8 */
7475 { Bad_Opcode },
7476 { Bad_Opcode },
7477 { Bad_Opcode },
7478 { Bad_Opcode },
7479 { Bad_Opcode },
7480 { Bad_Opcode },
7481 { Bad_Opcode },
7482 { PREFIX_TABLE (PREFIX_0F3ADF) },
7483 /* e0 */
7484 { Bad_Opcode },
7485 { Bad_Opcode },
7486 { Bad_Opcode },
7487 { Bad_Opcode },
7488 { Bad_Opcode },
7489 { Bad_Opcode },
7490 { Bad_Opcode },
7491 { Bad_Opcode },
7492 /* e8 */
7493 { Bad_Opcode },
7494 { Bad_Opcode },
7495 { Bad_Opcode },
7496 { Bad_Opcode },
7497 { Bad_Opcode },
7498 { Bad_Opcode },
7499 { Bad_Opcode },
7500 { Bad_Opcode },
7501 /* f0 */
7502 { Bad_Opcode },
7503 { Bad_Opcode },
7504 { Bad_Opcode },
7505 { Bad_Opcode },
7506 { Bad_Opcode },
7507 { Bad_Opcode },
7508 { Bad_Opcode },
7509 { Bad_Opcode },
7510 /* f8 */
7511 { Bad_Opcode },
7512 { Bad_Opcode },
7513 { Bad_Opcode },
7514 { Bad_Opcode },
7515 { Bad_Opcode },
7516 { Bad_Opcode },
7517 { Bad_Opcode },
7518 { Bad_Opcode },
7519 },
7520 };
7521
7522 static const struct dis386 xop_table[][256] = {
7523 /* XOP_08 */
7524 {
7525 /* 00 */
7526 { Bad_Opcode },
7527 { Bad_Opcode },
7528 { Bad_Opcode },
7529 { Bad_Opcode },
7530 { Bad_Opcode },
7531 { Bad_Opcode },
7532 { Bad_Opcode },
7533 { Bad_Opcode },
7534 /* 08 */
7535 { Bad_Opcode },
7536 { Bad_Opcode },
7537 { Bad_Opcode },
7538 { Bad_Opcode },
7539 { Bad_Opcode },
7540 { Bad_Opcode },
7541 { Bad_Opcode },
7542 { Bad_Opcode },
7543 /* 10 */
7544 { Bad_Opcode },
7545 { Bad_Opcode },
7546 { Bad_Opcode },
7547 { Bad_Opcode },
7548 { Bad_Opcode },
7549 { Bad_Opcode },
7550 { Bad_Opcode },
7551 { Bad_Opcode },
7552 /* 18 */
7553 { Bad_Opcode },
7554 { Bad_Opcode },
7555 { Bad_Opcode },
7556 { Bad_Opcode },
7557 { Bad_Opcode },
7558 { Bad_Opcode },
7559 { Bad_Opcode },
7560 { Bad_Opcode },
7561 /* 20 */
7562 { Bad_Opcode },
7563 { Bad_Opcode },
7564 { Bad_Opcode },
7565 { Bad_Opcode },
7566 { Bad_Opcode },
7567 { Bad_Opcode },
7568 { Bad_Opcode },
7569 { Bad_Opcode },
7570 /* 28 */
7571 { Bad_Opcode },
7572 { Bad_Opcode },
7573 { Bad_Opcode },
7574 { Bad_Opcode },
7575 { Bad_Opcode },
7576 { Bad_Opcode },
7577 { Bad_Opcode },
7578 { Bad_Opcode },
7579 /* 30 */
7580 { Bad_Opcode },
7581 { Bad_Opcode },
7582 { Bad_Opcode },
7583 { Bad_Opcode },
7584 { Bad_Opcode },
7585 { Bad_Opcode },
7586 { Bad_Opcode },
7587 { Bad_Opcode },
7588 /* 38 */
7589 { Bad_Opcode },
7590 { Bad_Opcode },
7591 { Bad_Opcode },
7592 { Bad_Opcode },
7593 { Bad_Opcode },
7594 { Bad_Opcode },
7595 { Bad_Opcode },
7596 { Bad_Opcode },
7597 /* 40 */
7598 { Bad_Opcode },
7599 { Bad_Opcode },
7600 { Bad_Opcode },
7601 { Bad_Opcode },
7602 { Bad_Opcode },
7603 { Bad_Opcode },
7604 { Bad_Opcode },
7605 { Bad_Opcode },
7606 /* 48 */
7607 { Bad_Opcode },
7608 { Bad_Opcode },
7609 { Bad_Opcode },
7610 { Bad_Opcode },
7611 { Bad_Opcode },
7612 { Bad_Opcode },
7613 { Bad_Opcode },
7614 { Bad_Opcode },
7615 /* 50 */
7616 { Bad_Opcode },
7617 { Bad_Opcode },
7618 { Bad_Opcode },
7619 { Bad_Opcode },
7620 { Bad_Opcode },
7621 { Bad_Opcode },
7622 { Bad_Opcode },
7623 { Bad_Opcode },
7624 /* 58 */
7625 { Bad_Opcode },
7626 { Bad_Opcode },
7627 { Bad_Opcode },
7628 { Bad_Opcode },
7629 { Bad_Opcode },
7630 { Bad_Opcode },
7631 { Bad_Opcode },
7632 { Bad_Opcode },
7633 /* 60 */
7634 { Bad_Opcode },
7635 { Bad_Opcode },
7636 { Bad_Opcode },
7637 { Bad_Opcode },
7638 { Bad_Opcode },
7639 { Bad_Opcode },
7640 { Bad_Opcode },
7641 { Bad_Opcode },
7642 /* 68 */
7643 { Bad_Opcode },
7644 { Bad_Opcode },
7645 { Bad_Opcode },
7646 { Bad_Opcode },
7647 { Bad_Opcode },
7648 { Bad_Opcode },
7649 { Bad_Opcode },
7650 { Bad_Opcode },
7651 /* 70 */
7652 { Bad_Opcode },
7653 { Bad_Opcode },
7654 { Bad_Opcode },
7655 { Bad_Opcode },
7656 { Bad_Opcode },
7657 { Bad_Opcode },
7658 { Bad_Opcode },
7659 { Bad_Opcode },
7660 /* 78 */
7661 { Bad_Opcode },
7662 { Bad_Opcode },
7663 { Bad_Opcode },
7664 { Bad_Opcode },
7665 { Bad_Opcode },
7666 { Bad_Opcode },
7667 { Bad_Opcode },
7668 { Bad_Opcode },
7669 /* 80 */
7670 { Bad_Opcode },
7671 { Bad_Opcode },
7672 { Bad_Opcode },
7673 { Bad_Opcode },
7674 { Bad_Opcode },
7675 { "vpmacssww", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7676 { "vpmacsswd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7677 { "vpmacssdql", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7678 /* 88 */
7679 { Bad_Opcode },
7680 { Bad_Opcode },
7681 { Bad_Opcode },
7682 { Bad_Opcode },
7683 { Bad_Opcode },
7684 { Bad_Opcode },
7685 { "vpmacssdd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7686 { "vpmacssdqh", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7687 /* 90 */
7688 { Bad_Opcode },
7689 { Bad_Opcode },
7690 { Bad_Opcode },
7691 { Bad_Opcode },
7692 { Bad_Opcode },
7693 { "vpmacsww", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7694 { "vpmacswd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7695 { "vpmacsdql", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7696 /* 98 */
7697 { Bad_Opcode },
7698 { Bad_Opcode },
7699 { Bad_Opcode },
7700 { Bad_Opcode },
7701 { Bad_Opcode },
7702 { Bad_Opcode },
7703 { "vpmacsdd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7704 { "vpmacsdqh", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7705 /* a0 */
7706 { Bad_Opcode },
7707 { Bad_Opcode },
7708 { "vpcmov", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7709 { "vpperm", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7710 { Bad_Opcode },
7711 { Bad_Opcode },
7712 { "vpmadcsswd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7713 { Bad_Opcode },
7714 /* a8 */
7715 { Bad_Opcode },
7716 { Bad_Opcode },
7717 { Bad_Opcode },
7718 { Bad_Opcode },
7719 { Bad_Opcode },
7720 { Bad_Opcode },
7721 { Bad_Opcode },
7722 { Bad_Opcode },
7723 /* b0 */
7724 { Bad_Opcode },
7725 { Bad_Opcode },
7726 { Bad_Opcode },
7727 { Bad_Opcode },
7728 { Bad_Opcode },
7729 { Bad_Opcode },
7730 { "vpmadcswd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7731 { Bad_Opcode },
7732 /* b8 */
7733 { Bad_Opcode },
7734 { Bad_Opcode },
7735 { Bad_Opcode },
7736 { Bad_Opcode },
7737 { Bad_Opcode },
7738 { Bad_Opcode },
7739 { Bad_Opcode },
7740 { Bad_Opcode },
7741 /* c0 */
7742 { "vprotb", { XM, Vex_2src_1, Ib }, 0 },
7743 { "vprotw", { XM, Vex_2src_1, Ib }, 0 },
7744 { "vprotd", { XM, Vex_2src_1, Ib }, 0 },
7745 { "vprotq", { XM, Vex_2src_1, Ib }, 0 },
7746 { Bad_Opcode },
7747 { Bad_Opcode },
7748 { Bad_Opcode },
7749 { Bad_Opcode },
7750 /* c8 */
7751 { Bad_Opcode },
7752 { Bad_Opcode },
7753 { Bad_Opcode },
7754 { Bad_Opcode },
7755 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CC) },
7756 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CD) },
7757 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CE) },
7758 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CF) },
7759 /* d0 */
7760 { Bad_Opcode },
7761 { Bad_Opcode },
7762 { Bad_Opcode },
7763 { Bad_Opcode },
7764 { Bad_Opcode },
7765 { Bad_Opcode },
7766 { Bad_Opcode },
7767 { Bad_Opcode },
7768 /* d8 */
7769 { Bad_Opcode },
7770 { Bad_Opcode },
7771 { Bad_Opcode },
7772 { Bad_Opcode },
7773 { Bad_Opcode },
7774 { Bad_Opcode },
7775 { Bad_Opcode },
7776 { Bad_Opcode },
7777 /* e0 */
7778 { Bad_Opcode },
7779 { Bad_Opcode },
7780 { Bad_Opcode },
7781 { Bad_Opcode },
7782 { Bad_Opcode },
7783 { Bad_Opcode },
7784 { Bad_Opcode },
7785 { Bad_Opcode },
7786 /* e8 */
7787 { Bad_Opcode },
7788 { Bad_Opcode },
7789 { Bad_Opcode },
7790 { Bad_Opcode },
7791 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EC) },
7792 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_ED) },
7793 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EE) },
7794 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EF) },
7795 /* f0 */
7796 { Bad_Opcode },
7797 { Bad_Opcode },
7798 { Bad_Opcode },
7799 { Bad_Opcode },
7800 { Bad_Opcode },
7801 { Bad_Opcode },
7802 { Bad_Opcode },
7803 { Bad_Opcode },
7804 /* f8 */
7805 { Bad_Opcode },
7806 { Bad_Opcode },
7807 { Bad_Opcode },
7808 { Bad_Opcode },
7809 { Bad_Opcode },
7810 { Bad_Opcode },
7811 { Bad_Opcode },
7812 { Bad_Opcode },
7813 },
7814 /* XOP_09 */
7815 {
7816 /* 00 */
7817 { Bad_Opcode },
7818 { REG_TABLE (REG_XOP_TBM_01) },
7819 { REG_TABLE (REG_XOP_TBM_02) },
7820 { Bad_Opcode },
7821 { Bad_Opcode },
7822 { Bad_Opcode },
7823 { Bad_Opcode },
7824 { Bad_Opcode },
7825 /* 08 */
7826 { Bad_Opcode },
7827 { Bad_Opcode },
7828 { Bad_Opcode },
7829 { Bad_Opcode },
7830 { Bad_Opcode },
7831 { Bad_Opcode },
7832 { Bad_Opcode },
7833 { Bad_Opcode },
7834 /* 10 */
7835 { Bad_Opcode },
7836 { Bad_Opcode },
7837 { REG_TABLE (REG_XOP_LWPCB) },
7838 { Bad_Opcode },
7839 { Bad_Opcode },
7840 { Bad_Opcode },
7841 { Bad_Opcode },
7842 { Bad_Opcode },
7843 /* 18 */
7844 { Bad_Opcode },
7845 { Bad_Opcode },
7846 { Bad_Opcode },
7847 { Bad_Opcode },
7848 { Bad_Opcode },
7849 { Bad_Opcode },
7850 { Bad_Opcode },
7851 { Bad_Opcode },
7852 /* 20 */
7853 { Bad_Opcode },
7854 { Bad_Opcode },
7855 { Bad_Opcode },
7856 { Bad_Opcode },
7857 { Bad_Opcode },
7858 { Bad_Opcode },
7859 { Bad_Opcode },
7860 { Bad_Opcode },
7861 /* 28 */
7862 { Bad_Opcode },
7863 { Bad_Opcode },
7864 { Bad_Opcode },
7865 { Bad_Opcode },
7866 { Bad_Opcode },
7867 { Bad_Opcode },
7868 { Bad_Opcode },
7869 { Bad_Opcode },
7870 /* 30 */
7871 { Bad_Opcode },
7872 { Bad_Opcode },
7873 { Bad_Opcode },
7874 { Bad_Opcode },
7875 { Bad_Opcode },
7876 { Bad_Opcode },
7877 { Bad_Opcode },
7878 { Bad_Opcode },
7879 /* 38 */
7880 { Bad_Opcode },
7881 { Bad_Opcode },
7882 { Bad_Opcode },
7883 { Bad_Opcode },
7884 { Bad_Opcode },
7885 { Bad_Opcode },
7886 { Bad_Opcode },
7887 { Bad_Opcode },
7888 /* 40 */
7889 { Bad_Opcode },
7890 { Bad_Opcode },
7891 { Bad_Opcode },
7892 { Bad_Opcode },
7893 { Bad_Opcode },
7894 { Bad_Opcode },
7895 { Bad_Opcode },
7896 { Bad_Opcode },
7897 /* 48 */
7898 { Bad_Opcode },
7899 { Bad_Opcode },
7900 { Bad_Opcode },
7901 { Bad_Opcode },
7902 { Bad_Opcode },
7903 { Bad_Opcode },
7904 { Bad_Opcode },
7905 { Bad_Opcode },
7906 /* 50 */
7907 { Bad_Opcode },
7908 { Bad_Opcode },
7909 { Bad_Opcode },
7910 { Bad_Opcode },
7911 { Bad_Opcode },
7912 { Bad_Opcode },
7913 { Bad_Opcode },
7914 { Bad_Opcode },
7915 /* 58 */
7916 { Bad_Opcode },
7917 { Bad_Opcode },
7918 { Bad_Opcode },
7919 { Bad_Opcode },
7920 { Bad_Opcode },
7921 { Bad_Opcode },
7922 { Bad_Opcode },
7923 { Bad_Opcode },
7924 /* 60 */
7925 { Bad_Opcode },
7926 { Bad_Opcode },
7927 { Bad_Opcode },
7928 { Bad_Opcode },
7929 { Bad_Opcode },
7930 { Bad_Opcode },
7931 { Bad_Opcode },
7932 { Bad_Opcode },
7933 /* 68 */
7934 { Bad_Opcode },
7935 { Bad_Opcode },
7936 { Bad_Opcode },
7937 { Bad_Opcode },
7938 { Bad_Opcode },
7939 { Bad_Opcode },
7940 { Bad_Opcode },
7941 { Bad_Opcode },
7942 /* 70 */
7943 { Bad_Opcode },
7944 { Bad_Opcode },
7945 { Bad_Opcode },
7946 { Bad_Opcode },
7947 { Bad_Opcode },
7948 { Bad_Opcode },
7949 { Bad_Opcode },
7950 { Bad_Opcode },
7951 /* 78 */
7952 { Bad_Opcode },
7953 { Bad_Opcode },
7954 { Bad_Opcode },
7955 { Bad_Opcode },
7956 { Bad_Opcode },
7957 { Bad_Opcode },
7958 { Bad_Opcode },
7959 { Bad_Opcode },
7960 /* 80 */
7961 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_80) },
7962 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_81) },
7963 { "vfrczss", { XM, EXd }, 0 },
7964 { "vfrczsd", { XM, EXq }, 0 },
7965 { Bad_Opcode },
7966 { Bad_Opcode },
7967 { Bad_Opcode },
7968 { Bad_Opcode },
7969 /* 88 */
7970 { Bad_Opcode },
7971 { Bad_Opcode },
7972 { Bad_Opcode },
7973 { Bad_Opcode },
7974 { Bad_Opcode },
7975 { Bad_Opcode },
7976 { Bad_Opcode },
7977 { Bad_Opcode },
7978 /* 90 */
7979 { "vprotb", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
7980 { "vprotw", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
7981 { "vprotd", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
7982 { "vprotq", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
7983 { "vpshlb", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
7984 { "vpshlw", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
7985 { "vpshld", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
7986 { "vpshlq", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
7987 /* 98 */
7988 { "vpshab", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
7989 { "vpshaw", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
7990 { "vpshad", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
7991 { "vpshaq", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
7992 { Bad_Opcode },
7993 { Bad_Opcode },
7994 { Bad_Opcode },
7995 { Bad_Opcode },
7996 /* a0 */
7997 { Bad_Opcode },
7998 { Bad_Opcode },
7999 { Bad_Opcode },
8000 { Bad_Opcode },
8001 { Bad_Opcode },
8002 { Bad_Opcode },
8003 { Bad_Opcode },
8004 { Bad_Opcode },
8005 /* a8 */
8006 { Bad_Opcode },
8007 { Bad_Opcode },
8008 { Bad_Opcode },
8009 { Bad_Opcode },
8010 { Bad_Opcode },
8011 { Bad_Opcode },
8012 { Bad_Opcode },
8013 { Bad_Opcode },
8014 /* b0 */
8015 { Bad_Opcode },
8016 { Bad_Opcode },
8017 { Bad_Opcode },
8018 { Bad_Opcode },
8019 { Bad_Opcode },
8020 { Bad_Opcode },
8021 { Bad_Opcode },
8022 { Bad_Opcode },
8023 /* b8 */
8024 { Bad_Opcode },
8025 { Bad_Opcode },
8026 { Bad_Opcode },
8027 { Bad_Opcode },
8028 { Bad_Opcode },
8029 { Bad_Opcode },
8030 { Bad_Opcode },
8031 { Bad_Opcode },
8032 /* c0 */
8033 { Bad_Opcode },
8034 { "vphaddbw", { XM, EXxmm }, 0 },
8035 { "vphaddbd", { XM, EXxmm }, 0 },
8036 { "vphaddbq", { XM, EXxmm }, 0 },
8037 { Bad_Opcode },
8038 { Bad_Opcode },
8039 { "vphaddwd", { XM, EXxmm }, 0 },
8040 { "vphaddwq", { XM, EXxmm }, 0 },
8041 /* c8 */
8042 { Bad_Opcode },
8043 { Bad_Opcode },
8044 { Bad_Opcode },
8045 { "vphadddq", { XM, EXxmm }, 0 },
8046 { Bad_Opcode },
8047 { Bad_Opcode },
8048 { Bad_Opcode },
8049 { Bad_Opcode },
8050 /* d0 */
8051 { Bad_Opcode },
8052 { "vphaddubw", { XM, EXxmm }, 0 },
8053 { "vphaddubd", { XM, EXxmm }, 0 },
8054 { "vphaddubq", { XM, EXxmm }, 0 },
8055 { Bad_Opcode },
8056 { Bad_Opcode },
8057 { "vphadduwd", { XM, EXxmm }, 0 },
8058 { "vphadduwq", { XM, EXxmm }, 0 },
8059 /* d8 */
8060 { Bad_Opcode },
8061 { Bad_Opcode },
8062 { Bad_Opcode },
8063 { "vphaddudq", { XM, EXxmm }, 0 },
8064 { Bad_Opcode },
8065 { Bad_Opcode },
8066 { Bad_Opcode },
8067 { Bad_Opcode },
8068 /* e0 */
8069 { Bad_Opcode },
8070 { "vphsubbw", { XM, EXxmm }, 0 },
8071 { "vphsubwd", { XM, EXxmm }, 0 },
8072 { "vphsubdq", { XM, EXxmm }, 0 },
8073 { Bad_Opcode },
8074 { Bad_Opcode },
8075 { Bad_Opcode },
8076 { Bad_Opcode },
8077 /* e8 */
8078 { Bad_Opcode },
8079 { Bad_Opcode },
8080 { Bad_Opcode },
8081 { Bad_Opcode },
8082 { Bad_Opcode },
8083 { Bad_Opcode },
8084 { Bad_Opcode },
8085 { Bad_Opcode },
8086 /* f0 */
8087 { Bad_Opcode },
8088 { Bad_Opcode },
8089 { Bad_Opcode },
8090 { Bad_Opcode },
8091 { Bad_Opcode },
8092 { Bad_Opcode },
8093 { Bad_Opcode },
8094 { Bad_Opcode },
8095 /* f8 */
8096 { Bad_Opcode },
8097 { Bad_Opcode },
8098 { Bad_Opcode },
8099 { Bad_Opcode },
8100 { Bad_Opcode },
8101 { Bad_Opcode },
8102 { Bad_Opcode },
8103 { Bad_Opcode },
8104 },
8105 /* XOP_0A */
8106 {
8107 /* 00 */
8108 { Bad_Opcode },
8109 { Bad_Opcode },
8110 { Bad_Opcode },
8111 { Bad_Opcode },
8112 { Bad_Opcode },
8113 { Bad_Opcode },
8114 { Bad_Opcode },
8115 { Bad_Opcode },
8116 /* 08 */
8117 { Bad_Opcode },
8118 { Bad_Opcode },
8119 { Bad_Opcode },
8120 { Bad_Opcode },
8121 { Bad_Opcode },
8122 { Bad_Opcode },
8123 { Bad_Opcode },
8124 { Bad_Opcode },
8125 /* 10 */
8126 { "bextr", { Gv, Ev, Iq }, 0 },
8127 { Bad_Opcode },
8128 { REG_TABLE (REG_XOP_LWP) },
8129 { Bad_Opcode },
8130 { Bad_Opcode },
8131 { Bad_Opcode },
8132 { Bad_Opcode },
8133 { Bad_Opcode },
8134 /* 18 */
8135 { Bad_Opcode },
8136 { Bad_Opcode },
8137 { Bad_Opcode },
8138 { Bad_Opcode },
8139 { Bad_Opcode },
8140 { Bad_Opcode },
8141 { Bad_Opcode },
8142 { Bad_Opcode },
8143 /* 20 */
8144 { Bad_Opcode },
8145 { Bad_Opcode },
8146 { Bad_Opcode },
8147 { Bad_Opcode },
8148 { Bad_Opcode },
8149 { Bad_Opcode },
8150 { Bad_Opcode },
8151 { Bad_Opcode },
8152 /* 28 */
8153 { Bad_Opcode },
8154 { Bad_Opcode },
8155 { Bad_Opcode },
8156 { Bad_Opcode },
8157 { Bad_Opcode },
8158 { Bad_Opcode },
8159 { Bad_Opcode },
8160 { Bad_Opcode },
8161 /* 30 */
8162 { Bad_Opcode },
8163 { Bad_Opcode },
8164 { Bad_Opcode },
8165 { Bad_Opcode },
8166 { Bad_Opcode },
8167 { Bad_Opcode },
8168 { Bad_Opcode },
8169 { Bad_Opcode },
8170 /* 38 */
8171 { Bad_Opcode },
8172 { Bad_Opcode },
8173 { Bad_Opcode },
8174 { Bad_Opcode },
8175 { Bad_Opcode },
8176 { Bad_Opcode },
8177 { Bad_Opcode },
8178 { Bad_Opcode },
8179 /* 40 */
8180 { Bad_Opcode },
8181 { Bad_Opcode },
8182 { Bad_Opcode },
8183 { Bad_Opcode },
8184 { Bad_Opcode },
8185 { Bad_Opcode },
8186 { Bad_Opcode },
8187 { Bad_Opcode },
8188 /* 48 */
8189 { Bad_Opcode },
8190 { Bad_Opcode },
8191 { Bad_Opcode },
8192 { Bad_Opcode },
8193 { Bad_Opcode },
8194 { Bad_Opcode },
8195 { Bad_Opcode },
8196 { Bad_Opcode },
8197 /* 50 */
8198 { Bad_Opcode },
8199 { Bad_Opcode },
8200 { Bad_Opcode },
8201 { Bad_Opcode },
8202 { Bad_Opcode },
8203 { Bad_Opcode },
8204 { Bad_Opcode },
8205 { Bad_Opcode },
8206 /* 58 */
8207 { Bad_Opcode },
8208 { Bad_Opcode },
8209 { Bad_Opcode },
8210 { Bad_Opcode },
8211 { Bad_Opcode },
8212 { Bad_Opcode },
8213 { Bad_Opcode },
8214 { Bad_Opcode },
8215 /* 60 */
8216 { Bad_Opcode },
8217 { Bad_Opcode },
8218 { Bad_Opcode },
8219 { Bad_Opcode },
8220 { Bad_Opcode },
8221 { Bad_Opcode },
8222 { Bad_Opcode },
8223 { Bad_Opcode },
8224 /* 68 */
8225 { Bad_Opcode },
8226 { Bad_Opcode },
8227 { Bad_Opcode },
8228 { Bad_Opcode },
8229 { Bad_Opcode },
8230 { Bad_Opcode },
8231 { Bad_Opcode },
8232 { Bad_Opcode },
8233 /* 70 */
8234 { Bad_Opcode },
8235 { Bad_Opcode },
8236 { Bad_Opcode },
8237 { Bad_Opcode },
8238 { Bad_Opcode },
8239 { Bad_Opcode },
8240 { Bad_Opcode },
8241 { Bad_Opcode },
8242 /* 78 */
8243 { Bad_Opcode },
8244 { Bad_Opcode },
8245 { Bad_Opcode },
8246 { Bad_Opcode },
8247 { Bad_Opcode },
8248 { Bad_Opcode },
8249 { Bad_Opcode },
8250 { Bad_Opcode },
8251 /* 80 */
8252 { Bad_Opcode },
8253 { Bad_Opcode },
8254 { Bad_Opcode },
8255 { Bad_Opcode },
8256 { Bad_Opcode },
8257 { Bad_Opcode },
8258 { Bad_Opcode },
8259 { Bad_Opcode },
8260 /* 88 */
8261 { Bad_Opcode },
8262 { Bad_Opcode },
8263 { Bad_Opcode },
8264 { Bad_Opcode },
8265 { Bad_Opcode },
8266 { Bad_Opcode },
8267 { Bad_Opcode },
8268 { Bad_Opcode },
8269 /* 90 */
8270 { Bad_Opcode },
8271 { Bad_Opcode },
8272 { Bad_Opcode },
8273 { Bad_Opcode },
8274 { Bad_Opcode },
8275 { Bad_Opcode },
8276 { Bad_Opcode },
8277 { Bad_Opcode },
8278 /* 98 */
8279 { Bad_Opcode },
8280 { Bad_Opcode },
8281 { Bad_Opcode },
8282 { Bad_Opcode },
8283 { Bad_Opcode },
8284 { Bad_Opcode },
8285 { Bad_Opcode },
8286 { Bad_Opcode },
8287 /* a0 */
8288 { Bad_Opcode },
8289 { Bad_Opcode },
8290 { Bad_Opcode },
8291 { Bad_Opcode },
8292 { Bad_Opcode },
8293 { Bad_Opcode },
8294 { Bad_Opcode },
8295 { Bad_Opcode },
8296 /* a8 */
8297 { Bad_Opcode },
8298 { Bad_Opcode },
8299 { Bad_Opcode },
8300 { Bad_Opcode },
8301 { Bad_Opcode },
8302 { Bad_Opcode },
8303 { Bad_Opcode },
8304 { Bad_Opcode },
8305 /* b0 */
8306 { Bad_Opcode },
8307 { Bad_Opcode },
8308 { Bad_Opcode },
8309 { Bad_Opcode },
8310 { Bad_Opcode },
8311 { Bad_Opcode },
8312 { Bad_Opcode },
8313 { Bad_Opcode },
8314 /* b8 */
8315 { Bad_Opcode },
8316 { Bad_Opcode },
8317 { Bad_Opcode },
8318 { Bad_Opcode },
8319 { Bad_Opcode },
8320 { Bad_Opcode },
8321 { Bad_Opcode },
8322 { Bad_Opcode },
8323 /* c0 */
8324 { Bad_Opcode },
8325 { Bad_Opcode },
8326 { Bad_Opcode },
8327 { Bad_Opcode },
8328 { Bad_Opcode },
8329 { Bad_Opcode },
8330 { Bad_Opcode },
8331 { Bad_Opcode },
8332 /* c8 */
8333 { Bad_Opcode },
8334 { Bad_Opcode },
8335 { Bad_Opcode },
8336 { Bad_Opcode },
8337 { Bad_Opcode },
8338 { Bad_Opcode },
8339 { Bad_Opcode },
8340 { Bad_Opcode },
8341 /* d0 */
8342 { Bad_Opcode },
8343 { Bad_Opcode },
8344 { Bad_Opcode },
8345 { Bad_Opcode },
8346 { Bad_Opcode },
8347 { Bad_Opcode },
8348 { Bad_Opcode },
8349 { Bad_Opcode },
8350 /* d8 */
8351 { Bad_Opcode },
8352 { Bad_Opcode },
8353 { Bad_Opcode },
8354 { Bad_Opcode },
8355 { Bad_Opcode },
8356 { Bad_Opcode },
8357 { Bad_Opcode },
8358 { Bad_Opcode },
8359 /* e0 */
8360 { Bad_Opcode },
8361 { Bad_Opcode },
8362 { Bad_Opcode },
8363 { Bad_Opcode },
8364 { Bad_Opcode },
8365 { Bad_Opcode },
8366 { Bad_Opcode },
8367 { Bad_Opcode },
8368 /* e8 */
8369 { Bad_Opcode },
8370 { Bad_Opcode },
8371 { Bad_Opcode },
8372 { Bad_Opcode },
8373 { Bad_Opcode },
8374 { Bad_Opcode },
8375 { Bad_Opcode },
8376 { Bad_Opcode },
8377 /* f0 */
8378 { Bad_Opcode },
8379 { Bad_Opcode },
8380 { Bad_Opcode },
8381 { Bad_Opcode },
8382 { Bad_Opcode },
8383 { Bad_Opcode },
8384 { Bad_Opcode },
8385 { Bad_Opcode },
8386 /* f8 */
8387 { Bad_Opcode },
8388 { Bad_Opcode },
8389 { Bad_Opcode },
8390 { Bad_Opcode },
8391 { Bad_Opcode },
8392 { Bad_Opcode },
8393 { Bad_Opcode },
8394 { Bad_Opcode },
8395 },
8396 };
8397
8398 static const struct dis386 vex_table[][256] = {
8399 /* VEX_0F */
8400 {
8401 /* 00 */
8402 { Bad_Opcode },
8403 { Bad_Opcode },
8404 { Bad_Opcode },
8405 { Bad_Opcode },
8406 { Bad_Opcode },
8407 { Bad_Opcode },
8408 { Bad_Opcode },
8409 { Bad_Opcode },
8410 /* 08 */
8411 { Bad_Opcode },
8412 { Bad_Opcode },
8413 { Bad_Opcode },
8414 { Bad_Opcode },
8415 { Bad_Opcode },
8416 { Bad_Opcode },
8417 { Bad_Opcode },
8418 { Bad_Opcode },
8419 /* 10 */
8420 { PREFIX_TABLE (PREFIX_VEX_0F10) },
8421 { PREFIX_TABLE (PREFIX_VEX_0F11) },
8422 { PREFIX_TABLE (PREFIX_VEX_0F12) },
8423 { MOD_TABLE (MOD_VEX_0F13) },
8424 { "vunpcklpX", { XM, Vex, EXx }, 0 },
8425 { "vunpckhpX", { XM, Vex, EXx }, 0 },
8426 { PREFIX_TABLE (PREFIX_VEX_0F16) },
8427 { MOD_TABLE (MOD_VEX_0F17) },
8428 /* 18 */
8429 { Bad_Opcode },
8430 { Bad_Opcode },
8431 { Bad_Opcode },
8432 { Bad_Opcode },
8433 { Bad_Opcode },
8434 { Bad_Opcode },
8435 { Bad_Opcode },
8436 { Bad_Opcode },
8437 /* 20 */
8438 { Bad_Opcode },
8439 { Bad_Opcode },
8440 { Bad_Opcode },
8441 { Bad_Opcode },
8442 { Bad_Opcode },
8443 { Bad_Opcode },
8444 { Bad_Opcode },
8445 { Bad_Opcode },
8446 /* 28 */
8447 { "vmovapX", { XM, EXx }, 0 },
8448 { "vmovapX", { EXxS, XM }, 0 },
8449 { PREFIX_TABLE (PREFIX_VEX_0F2A) },
8450 { MOD_TABLE (MOD_VEX_0F2B) },
8451 { PREFIX_TABLE (PREFIX_VEX_0F2C) },
8452 { PREFIX_TABLE (PREFIX_VEX_0F2D) },
8453 { PREFIX_TABLE (PREFIX_VEX_0F2E) },
8454 { PREFIX_TABLE (PREFIX_VEX_0F2F) },
8455 /* 30 */
8456 { Bad_Opcode },
8457 { Bad_Opcode },
8458 { Bad_Opcode },
8459 { Bad_Opcode },
8460 { Bad_Opcode },
8461 { Bad_Opcode },
8462 { Bad_Opcode },
8463 { Bad_Opcode },
8464 /* 38 */
8465 { Bad_Opcode },
8466 { Bad_Opcode },
8467 { Bad_Opcode },
8468 { Bad_Opcode },
8469 { Bad_Opcode },
8470 { Bad_Opcode },
8471 { Bad_Opcode },
8472 { Bad_Opcode },
8473 /* 40 */
8474 { Bad_Opcode },
8475 { PREFIX_TABLE (PREFIX_VEX_0F41) },
8476 { PREFIX_TABLE (PREFIX_VEX_0F42) },
8477 { Bad_Opcode },
8478 { PREFIX_TABLE (PREFIX_VEX_0F44) },
8479 { PREFIX_TABLE (PREFIX_VEX_0F45) },
8480 { PREFIX_TABLE (PREFIX_VEX_0F46) },
8481 { PREFIX_TABLE (PREFIX_VEX_0F47) },
8482 /* 48 */
8483 { Bad_Opcode },
8484 { Bad_Opcode },
8485 { PREFIX_TABLE (PREFIX_VEX_0F4A) },
8486 { PREFIX_TABLE (PREFIX_VEX_0F4B) },
8487 { Bad_Opcode },
8488 { Bad_Opcode },
8489 { Bad_Opcode },
8490 { Bad_Opcode },
8491 /* 50 */
8492 { MOD_TABLE (MOD_VEX_0F50) },
8493 { PREFIX_TABLE (PREFIX_VEX_0F51) },
8494 { PREFIX_TABLE (PREFIX_VEX_0F52) },
8495 { PREFIX_TABLE (PREFIX_VEX_0F53) },
8496 { "vandpX", { XM, Vex, EXx }, 0 },
8497 { "vandnpX", { XM, Vex, EXx }, 0 },
8498 { "vorpX", { XM, Vex, EXx }, 0 },
8499 { "vxorpX", { XM, Vex, EXx }, 0 },
8500 /* 58 */
8501 { PREFIX_TABLE (PREFIX_VEX_0F58) },
8502 { PREFIX_TABLE (PREFIX_VEX_0F59) },
8503 { PREFIX_TABLE (PREFIX_VEX_0F5A) },
8504 { PREFIX_TABLE (PREFIX_VEX_0F5B) },
8505 { PREFIX_TABLE (PREFIX_VEX_0F5C) },
8506 { PREFIX_TABLE (PREFIX_VEX_0F5D) },
8507 { PREFIX_TABLE (PREFIX_VEX_0F5E) },
8508 { PREFIX_TABLE (PREFIX_VEX_0F5F) },
8509 /* 60 */
8510 { PREFIX_TABLE (PREFIX_VEX_0F60) },
8511 { PREFIX_TABLE (PREFIX_VEX_0F61) },
8512 { PREFIX_TABLE (PREFIX_VEX_0F62) },
8513 { PREFIX_TABLE (PREFIX_VEX_0F63) },
8514 { PREFIX_TABLE (PREFIX_VEX_0F64) },
8515 { PREFIX_TABLE (PREFIX_VEX_0F65) },
8516 { PREFIX_TABLE (PREFIX_VEX_0F66) },
8517 { PREFIX_TABLE (PREFIX_VEX_0F67) },
8518 /* 68 */
8519 { PREFIX_TABLE (PREFIX_VEX_0F68) },
8520 { PREFIX_TABLE (PREFIX_VEX_0F69) },
8521 { PREFIX_TABLE (PREFIX_VEX_0F6A) },
8522 { PREFIX_TABLE (PREFIX_VEX_0F6B) },
8523 { PREFIX_TABLE (PREFIX_VEX_0F6C) },
8524 { PREFIX_TABLE (PREFIX_VEX_0F6D) },
8525 { PREFIX_TABLE (PREFIX_VEX_0F6E) },
8526 { PREFIX_TABLE (PREFIX_VEX_0F6F) },
8527 /* 70 */
8528 { PREFIX_TABLE (PREFIX_VEX_0F70) },
8529 { REG_TABLE (REG_VEX_0F71) },
8530 { REG_TABLE (REG_VEX_0F72) },
8531 { REG_TABLE (REG_VEX_0F73) },
8532 { PREFIX_TABLE (PREFIX_VEX_0F74) },
8533 { PREFIX_TABLE (PREFIX_VEX_0F75) },
8534 { PREFIX_TABLE (PREFIX_VEX_0F76) },
8535 { PREFIX_TABLE (PREFIX_VEX_0F77) },
8536 /* 78 */
8537 { Bad_Opcode },
8538 { Bad_Opcode },
8539 { Bad_Opcode },
8540 { Bad_Opcode },
8541 { PREFIX_TABLE (PREFIX_VEX_0F7C) },
8542 { PREFIX_TABLE (PREFIX_VEX_0F7D) },
8543 { PREFIX_TABLE (PREFIX_VEX_0F7E) },
8544 { PREFIX_TABLE (PREFIX_VEX_0F7F) },
8545 /* 80 */
8546 { Bad_Opcode },
8547 { Bad_Opcode },
8548 { Bad_Opcode },
8549 { Bad_Opcode },
8550 { Bad_Opcode },
8551 { Bad_Opcode },
8552 { Bad_Opcode },
8553 { Bad_Opcode },
8554 /* 88 */
8555 { Bad_Opcode },
8556 { Bad_Opcode },
8557 { Bad_Opcode },
8558 { Bad_Opcode },
8559 { Bad_Opcode },
8560 { Bad_Opcode },
8561 { Bad_Opcode },
8562 { Bad_Opcode },
8563 /* 90 */
8564 { PREFIX_TABLE (PREFIX_VEX_0F90) },
8565 { PREFIX_TABLE (PREFIX_VEX_0F91) },
8566 { PREFIX_TABLE (PREFIX_VEX_0F92) },
8567 { PREFIX_TABLE (PREFIX_VEX_0F93) },
8568 { Bad_Opcode },
8569 { Bad_Opcode },
8570 { Bad_Opcode },
8571 { Bad_Opcode },
8572 /* 98 */
8573 { PREFIX_TABLE (PREFIX_VEX_0F98) },
8574 { PREFIX_TABLE (PREFIX_VEX_0F99) },
8575 { Bad_Opcode },
8576 { Bad_Opcode },
8577 { Bad_Opcode },
8578 { Bad_Opcode },
8579 { Bad_Opcode },
8580 { Bad_Opcode },
8581 /* a0 */
8582 { Bad_Opcode },
8583 { Bad_Opcode },
8584 { Bad_Opcode },
8585 { Bad_Opcode },
8586 { Bad_Opcode },
8587 { Bad_Opcode },
8588 { Bad_Opcode },
8589 { Bad_Opcode },
8590 /* a8 */
8591 { Bad_Opcode },
8592 { Bad_Opcode },
8593 { Bad_Opcode },
8594 { Bad_Opcode },
8595 { Bad_Opcode },
8596 { Bad_Opcode },
8597 { REG_TABLE (REG_VEX_0FAE) },
8598 { Bad_Opcode },
8599 /* b0 */
8600 { Bad_Opcode },
8601 { Bad_Opcode },
8602 { Bad_Opcode },
8603 { Bad_Opcode },
8604 { Bad_Opcode },
8605 { Bad_Opcode },
8606 { Bad_Opcode },
8607 { Bad_Opcode },
8608 /* b8 */
8609 { Bad_Opcode },
8610 { Bad_Opcode },
8611 { Bad_Opcode },
8612 { Bad_Opcode },
8613 { Bad_Opcode },
8614 { Bad_Opcode },
8615 { Bad_Opcode },
8616 { Bad_Opcode },
8617 /* c0 */
8618 { Bad_Opcode },
8619 { Bad_Opcode },
8620 { PREFIX_TABLE (PREFIX_VEX_0FC2) },
8621 { Bad_Opcode },
8622 { PREFIX_TABLE (PREFIX_VEX_0FC4) },
8623 { PREFIX_TABLE (PREFIX_VEX_0FC5) },
8624 { "vshufpX", { XM, Vex, EXx, Ib }, 0 },
8625 { Bad_Opcode },
8626 /* c8 */
8627 { Bad_Opcode },
8628 { Bad_Opcode },
8629 { Bad_Opcode },
8630 { Bad_Opcode },
8631 { Bad_Opcode },
8632 { Bad_Opcode },
8633 { Bad_Opcode },
8634 { Bad_Opcode },
8635 /* d0 */
8636 { PREFIX_TABLE (PREFIX_VEX_0FD0) },
8637 { PREFIX_TABLE (PREFIX_VEX_0FD1) },
8638 { PREFIX_TABLE (PREFIX_VEX_0FD2) },
8639 { PREFIX_TABLE (PREFIX_VEX_0FD3) },
8640 { PREFIX_TABLE (PREFIX_VEX_0FD4) },
8641 { PREFIX_TABLE (PREFIX_VEX_0FD5) },
8642 { PREFIX_TABLE (PREFIX_VEX_0FD6) },
8643 { PREFIX_TABLE (PREFIX_VEX_0FD7) },
8644 /* d8 */
8645 { PREFIX_TABLE (PREFIX_VEX_0FD8) },
8646 { PREFIX_TABLE (PREFIX_VEX_0FD9) },
8647 { PREFIX_TABLE (PREFIX_VEX_0FDA) },
8648 { PREFIX_TABLE (PREFIX_VEX_0FDB) },
8649 { PREFIX_TABLE (PREFIX_VEX_0FDC) },
8650 { PREFIX_TABLE (PREFIX_VEX_0FDD) },
8651 { PREFIX_TABLE (PREFIX_VEX_0FDE) },
8652 { PREFIX_TABLE (PREFIX_VEX_0FDF) },
8653 /* e0 */
8654 { PREFIX_TABLE (PREFIX_VEX_0FE0) },
8655 { PREFIX_TABLE (PREFIX_VEX_0FE1) },
8656 { PREFIX_TABLE (PREFIX_VEX_0FE2) },
8657 { PREFIX_TABLE (PREFIX_VEX_0FE3) },
8658 { PREFIX_TABLE (PREFIX_VEX_0FE4) },
8659 { PREFIX_TABLE (PREFIX_VEX_0FE5) },
8660 { PREFIX_TABLE (PREFIX_VEX_0FE6) },
8661 { PREFIX_TABLE (PREFIX_VEX_0FE7) },
8662 /* e8 */
8663 { PREFIX_TABLE (PREFIX_VEX_0FE8) },
8664 { PREFIX_TABLE (PREFIX_VEX_0FE9) },
8665 { PREFIX_TABLE (PREFIX_VEX_0FEA) },
8666 { PREFIX_TABLE (PREFIX_VEX_0FEB) },
8667 { PREFIX_TABLE (PREFIX_VEX_0FEC) },
8668 { PREFIX_TABLE (PREFIX_VEX_0FED) },
8669 { PREFIX_TABLE (PREFIX_VEX_0FEE) },
8670 { PREFIX_TABLE (PREFIX_VEX_0FEF) },
8671 /* f0 */
8672 { PREFIX_TABLE (PREFIX_VEX_0FF0) },
8673 { PREFIX_TABLE (PREFIX_VEX_0FF1) },
8674 { PREFIX_TABLE (PREFIX_VEX_0FF2) },
8675 { PREFIX_TABLE (PREFIX_VEX_0FF3) },
8676 { PREFIX_TABLE (PREFIX_VEX_0FF4) },
8677 { PREFIX_TABLE (PREFIX_VEX_0FF5) },
8678 { PREFIX_TABLE (PREFIX_VEX_0FF6) },
8679 { PREFIX_TABLE (PREFIX_VEX_0FF7) },
8680 /* f8 */
8681 { PREFIX_TABLE (PREFIX_VEX_0FF8) },
8682 { PREFIX_TABLE (PREFIX_VEX_0FF9) },
8683 { PREFIX_TABLE (PREFIX_VEX_0FFA) },
8684 { PREFIX_TABLE (PREFIX_VEX_0FFB) },
8685 { PREFIX_TABLE (PREFIX_VEX_0FFC) },
8686 { PREFIX_TABLE (PREFIX_VEX_0FFD) },
8687 { PREFIX_TABLE (PREFIX_VEX_0FFE) },
8688 { Bad_Opcode },
8689 },
8690 /* VEX_0F38 */
8691 {
8692 /* 00 */
8693 { PREFIX_TABLE (PREFIX_VEX_0F3800) },
8694 { PREFIX_TABLE (PREFIX_VEX_0F3801) },
8695 { PREFIX_TABLE (PREFIX_VEX_0F3802) },
8696 { PREFIX_TABLE (PREFIX_VEX_0F3803) },
8697 { PREFIX_TABLE (PREFIX_VEX_0F3804) },
8698 { PREFIX_TABLE (PREFIX_VEX_0F3805) },
8699 { PREFIX_TABLE (PREFIX_VEX_0F3806) },
8700 { PREFIX_TABLE (PREFIX_VEX_0F3807) },
8701 /* 08 */
8702 { PREFIX_TABLE (PREFIX_VEX_0F3808) },
8703 { PREFIX_TABLE (PREFIX_VEX_0F3809) },
8704 { PREFIX_TABLE (PREFIX_VEX_0F380A) },
8705 { PREFIX_TABLE (PREFIX_VEX_0F380B) },
8706 { PREFIX_TABLE (PREFIX_VEX_0F380C) },
8707 { PREFIX_TABLE (PREFIX_VEX_0F380D) },
8708 { PREFIX_TABLE (PREFIX_VEX_0F380E) },
8709 { PREFIX_TABLE (PREFIX_VEX_0F380F) },
8710 /* 10 */
8711 { Bad_Opcode },
8712 { Bad_Opcode },
8713 { Bad_Opcode },
8714 { PREFIX_TABLE (PREFIX_VEX_0F3813) },
8715 { Bad_Opcode },
8716 { Bad_Opcode },
8717 { PREFIX_TABLE (PREFIX_VEX_0F3816) },
8718 { PREFIX_TABLE (PREFIX_VEX_0F3817) },
8719 /* 18 */
8720 { PREFIX_TABLE (PREFIX_VEX_0F3818) },
8721 { PREFIX_TABLE (PREFIX_VEX_0F3819) },
8722 { PREFIX_TABLE (PREFIX_VEX_0F381A) },
8723 { Bad_Opcode },
8724 { PREFIX_TABLE (PREFIX_VEX_0F381C) },
8725 { PREFIX_TABLE (PREFIX_VEX_0F381D) },
8726 { PREFIX_TABLE (PREFIX_VEX_0F381E) },
8727 { Bad_Opcode },
8728 /* 20 */
8729 { PREFIX_TABLE (PREFIX_VEX_0F3820) },
8730 { PREFIX_TABLE (PREFIX_VEX_0F3821) },
8731 { PREFIX_TABLE (PREFIX_VEX_0F3822) },
8732 { PREFIX_TABLE (PREFIX_VEX_0F3823) },
8733 { PREFIX_TABLE (PREFIX_VEX_0F3824) },
8734 { PREFIX_TABLE (PREFIX_VEX_0F3825) },
8735 { Bad_Opcode },
8736 { Bad_Opcode },
8737 /* 28 */
8738 { PREFIX_TABLE (PREFIX_VEX_0F3828) },
8739 { PREFIX_TABLE (PREFIX_VEX_0F3829) },
8740 { PREFIX_TABLE (PREFIX_VEX_0F382A) },
8741 { PREFIX_TABLE (PREFIX_VEX_0F382B) },
8742 { PREFIX_TABLE (PREFIX_VEX_0F382C) },
8743 { PREFIX_TABLE (PREFIX_VEX_0F382D) },
8744 { PREFIX_TABLE (PREFIX_VEX_0F382E) },
8745 { PREFIX_TABLE (PREFIX_VEX_0F382F) },
8746 /* 30 */
8747 { PREFIX_TABLE (PREFIX_VEX_0F3830) },
8748 { PREFIX_TABLE (PREFIX_VEX_0F3831) },
8749 { PREFIX_TABLE (PREFIX_VEX_0F3832) },
8750 { PREFIX_TABLE (PREFIX_VEX_0F3833) },
8751 { PREFIX_TABLE (PREFIX_VEX_0F3834) },
8752 { PREFIX_TABLE (PREFIX_VEX_0F3835) },
8753 { PREFIX_TABLE (PREFIX_VEX_0F3836) },
8754 { PREFIX_TABLE (PREFIX_VEX_0F3837) },
8755 /* 38 */
8756 { PREFIX_TABLE (PREFIX_VEX_0F3838) },
8757 { PREFIX_TABLE (PREFIX_VEX_0F3839) },
8758 { PREFIX_TABLE (PREFIX_VEX_0F383A) },
8759 { PREFIX_TABLE (PREFIX_VEX_0F383B) },
8760 { PREFIX_TABLE (PREFIX_VEX_0F383C) },
8761 { PREFIX_TABLE (PREFIX_VEX_0F383D) },
8762 { PREFIX_TABLE (PREFIX_VEX_0F383E) },
8763 { PREFIX_TABLE (PREFIX_VEX_0F383F) },
8764 /* 40 */
8765 { PREFIX_TABLE (PREFIX_VEX_0F3840) },
8766 { PREFIX_TABLE (PREFIX_VEX_0F3841) },
8767 { Bad_Opcode },
8768 { Bad_Opcode },
8769 { Bad_Opcode },
8770 { PREFIX_TABLE (PREFIX_VEX_0F3845) },
8771 { PREFIX_TABLE (PREFIX_VEX_0F3846) },
8772 { PREFIX_TABLE (PREFIX_VEX_0F3847) },
8773 /* 48 */
8774 { Bad_Opcode },
8775 { Bad_Opcode },
8776 { Bad_Opcode },
8777 { Bad_Opcode },
8778 { Bad_Opcode },
8779 { Bad_Opcode },
8780 { Bad_Opcode },
8781 { Bad_Opcode },
8782 /* 50 */
8783 { Bad_Opcode },
8784 { Bad_Opcode },
8785 { Bad_Opcode },
8786 { Bad_Opcode },
8787 { Bad_Opcode },
8788 { Bad_Opcode },
8789 { Bad_Opcode },
8790 { Bad_Opcode },
8791 /* 58 */
8792 { PREFIX_TABLE (PREFIX_VEX_0F3858) },
8793 { PREFIX_TABLE (PREFIX_VEX_0F3859) },
8794 { PREFIX_TABLE (PREFIX_VEX_0F385A) },
8795 { Bad_Opcode },
8796 { Bad_Opcode },
8797 { Bad_Opcode },
8798 { Bad_Opcode },
8799 { Bad_Opcode },
8800 /* 60 */
8801 { Bad_Opcode },
8802 { Bad_Opcode },
8803 { Bad_Opcode },
8804 { Bad_Opcode },
8805 { Bad_Opcode },
8806 { Bad_Opcode },
8807 { Bad_Opcode },
8808 { Bad_Opcode },
8809 /* 68 */
8810 { Bad_Opcode },
8811 { Bad_Opcode },
8812 { Bad_Opcode },
8813 { Bad_Opcode },
8814 { Bad_Opcode },
8815 { Bad_Opcode },
8816 { Bad_Opcode },
8817 { Bad_Opcode },
8818 /* 70 */
8819 { Bad_Opcode },
8820 { Bad_Opcode },
8821 { Bad_Opcode },
8822 { Bad_Opcode },
8823 { Bad_Opcode },
8824 { Bad_Opcode },
8825 { Bad_Opcode },
8826 { Bad_Opcode },
8827 /* 78 */
8828 { PREFIX_TABLE (PREFIX_VEX_0F3878) },
8829 { PREFIX_TABLE (PREFIX_VEX_0F3879) },
8830 { Bad_Opcode },
8831 { Bad_Opcode },
8832 { Bad_Opcode },
8833 { Bad_Opcode },
8834 { Bad_Opcode },
8835 { Bad_Opcode },
8836 /* 80 */
8837 { Bad_Opcode },
8838 { Bad_Opcode },
8839 { Bad_Opcode },
8840 { Bad_Opcode },
8841 { Bad_Opcode },
8842 { Bad_Opcode },
8843 { Bad_Opcode },
8844 { Bad_Opcode },
8845 /* 88 */
8846 { Bad_Opcode },
8847 { Bad_Opcode },
8848 { Bad_Opcode },
8849 { Bad_Opcode },
8850 { PREFIX_TABLE (PREFIX_VEX_0F388C) },
8851 { Bad_Opcode },
8852 { PREFIX_TABLE (PREFIX_VEX_0F388E) },
8853 { Bad_Opcode },
8854 /* 90 */
8855 { PREFIX_TABLE (PREFIX_VEX_0F3890) },
8856 { PREFIX_TABLE (PREFIX_VEX_0F3891) },
8857 { PREFIX_TABLE (PREFIX_VEX_0F3892) },
8858 { PREFIX_TABLE (PREFIX_VEX_0F3893) },
8859 { Bad_Opcode },
8860 { Bad_Opcode },
8861 { PREFIX_TABLE (PREFIX_VEX_0F3896) },
8862 { PREFIX_TABLE (PREFIX_VEX_0F3897) },
8863 /* 98 */
8864 { PREFIX_TABLE (PREFIX_VEX_0F3898) },
8865 { PREFIX_TABLE (PREFIX_VEX_0F3899) },
8866 { PREFIX_TABLE (PREFIX_VEX_0F389A) },
8867 { PREFIX_TABLE (PREFIX_VEX_0F389B) },
8868 { PREFIX_TABLE (PREFIX_VEX_0F389C) },
8869 { PREFIX_TABLE (PREFIX_VEX_0F389D) },
8870 { PREFIX_TABLE (PREFIX_VEX_0F389E) },
8871 { PREFIX_TABLE (PREFIX_VEX_0F389F) },
8872 /* a0 */
8873 { Bad_Opcode },
8874 { Bad_Opcode },
8875 { Bad_Opcode },
8876 { Bad_Opcode },
8877 { Bad_Opcode },
8878 { Bad_Opcode },
8879 { PREFIX_TABLE (PREFIX_VEX_0F38A6) },
8880 { PREFIX_TABLE (PREFIX_VEX_0F38A7) },
8881 /* a8 */
8882 { PREFIX_TABLE (PREFIX_VEX_0F38A8) },
8883 { PREFIX_TABLE (PREFIX_VEX_0F38A9) },
8884 { PREFIX_TABLE (PREFIX_VEX_0F38AA) },
8885 { PREFIX_TABLE (PREFIX_VEX_0F38AB) },
8886 { PREFIX_TABLE (PREFIX_VEX_0F38AC) },
8887 { PREFIX_TABLE (PREFIX_VEX_0F38AD) },
8888 { PREFIX_TABLE (PREFIX_VEX_0F38AE) },
8889 { PREFIX_TABLE (PREFIX_VEX_0F38AF) },
8890 /* b0 */
8891 { Bad_Opcode },
8892 { Bad_Opcode },
8893 { Bad_Opcode },
8894 { Bad_Opcode },
8895 { Bad_Opcode },
8896 { Bad_Opcode },
8897 { PREFIX_TABLE (PREFIX_VEX_0F38B6) },
8898 { PREFIX_TABLE (PREFIX_VEX_0F38B7) },
8899 /* b8 */
8900 { PREFIX_TABLE (PREFIX_VEX_0F38B8) },
8901 { PREFIX_TABLE (PREFIX_VEX_0F38B9) },
8902 { PREFIX_TABLE (PREFIX_VEX_0F38BA) },
8903 { PREFIX_TABLE (PREFIX_VEX_0F38BB) },
8904 { PREFIX_TABLE (PREFIX_VEX_0F38BC) },
8905 { PREFIX_TABLE (PREFIX_VEX_0F38BD) },
8906 { PREFIX_TABLE (PREFIX_VEX_0F38BE) },
8907 { PREFIX_TABLE (PREFIX_VEX_0F38BF) },
8908 /* c0 */
8909 { Bad_Opcode },
8910 { Bad_Opcode },
8911 { Bad_Opcode },
8912 { Bad_Opcode },
8913 { Bad_Opcode },
8914 { Bad_Opcode },
8915 { Bad_Opcode },
8916 { Bad_Opcode },
8917 /* c8 */
8918 { Bad_Opcode },
8919 { Bad_Opcode },
8920 { Bad_Opcode },
8921 { Bad_Opcode },
8922 { Bad_Opcode },
8923 { Bad_Opcode },
8924 { Bad_Opcode },
8925 { PREFIX_TABLE (PREFIX_VEX_0F38CF) },
8926 /* d0 */
8927 { Bad_Opcode },
8928 { Bad_Opcode },
8929 { Bad_Opcode },
8930 { Bad_Opcode },
8931 { Bad_Opcode },
8932 { Bad_Opcode },
8933 { Bad_Opcode },
8934 { Bad_Opcode },
8935 /* d8 */
8936 { Bad_Opcode },
8937 { Bad_Opcode },
8938 { Bad_Opcode },
8939 { PREFIX_TABLE (PREFIX_VEX_0F38DB) },
8940 { PREFIX_TABLE (PREFIX_VEX_0F38DC) },
8941 { PREFIX_TABLE (PREFIX_VEX_0F38DD) },
8942 { PREFIX_TABLE (PREFIX_VEX_0F38DE) },
8943 { PREFIX_TABLE (PREFIX_VEX_0F38DF) },
8944 /* e0 */
8945 { Bad_Opcode },
8946 { Bad_Opcode },
8947 { Bad_Opcode },
8948 { Bad_Opcode },
8949 { Bad_Opcode },
8950 { Bad_Opcode },
8951 { Bad_Opcode },
8952 { Bad_Opcode },
8953 /* e8 */
8954 { Bad_Opcode },
8955 { Bad_Opcode },
8956 { Bad_Opcode },
8957 { Bad_Opcode },
8958 { Bad_Opcode },
8959 { Bad_Opcode },
8960 { Bad_Opcode },
8961 { Bad_Opcode },
8962 /* f0 */
8963 { Bad_Opcode },
8964 { Bad_Opcode },
8965 { PREFIX_TABLE (PREFIX_VEX_0F38F2) },
8966 { REG_TABLE (REG_VEX_0F38F3) },
8967 { Bad_Opcode },
8968 { PREFIX_TABLE (PREFIX_VEX_0F38F5) },
8969 { PREFIX_TABLE (PREFIX_VEX_0F38F6) },
8970 { PREFIX_TABLE (PREFIX_VEX_0F38F7) },
8971 /* f8 */
8972 { Bad_Opcode },
8973 { Bad_Opcode },
8974 { Bad_Opcode },
8975 { Bad_Opcode },
8976 { Bad_Opcode },
8977 { Bad_Opcode },
8978 { Bad_Opcode },
8979 { Bad_Opcode },
8980 },
8981 /* VEX_0F3A */
8982 {
8983 /* 00 */
8984 { PREFIX_TABLE (PREFIX_VEX_0F3A00) },
8985 { PREFIX_TABLE (PREFIX_VEX_0F3A01) },
8986 { PREFIX_TABLE (PREFIX_VEX_0F3A02) },
8987 { Bad_Opcode },
8988 { PREFIX_TABLE (PREFIX_VEX_0F3A04) },
8989 { PREFIX_TABLE (PREFIX_VEX_0F3A05) },
8990 { PREFIX_TABLE (PREFIX_VEX_0F3A06) },
8991 { Bad_Opcode },
8992 /* 08 */
8993 { PREFIX_TABLE (PREFIX_VEX_0F3A08) },
8994 { PREFIX_TABLE (PREFIX_VEX_0F3A09) },
8995 { PREFIX_TABLE (PREFIX_VEX_0F3A0A) },
8996 { PREFIX_TABLE (PREFIX_VEX_0F3A0B) },
8997 { PREFIX_TABLE (PREFIX_VEX_0F3A0C) },
8998 { PREFIX_TABLE (PREFIX_VEX_0F3A0D) },
8999 { PREFIX_TABLE (PREFIX_VEX_0F3A0E) },
9000 { PREFIX_TABLE (PREFIX_VEX_0F3A0F) },
9001 /* 10 */
9002 { Bad_Opcode },
9003 { Bad_Opcode },
9004 { Bad_Opcode },
9005 { Bad_Opcode },
9006 { PREFIX_TABLE (PREFIX_VEX_0F3A14) },
9007 { PREFIX_TABLE (PREFIX_VEX_0F3A15) },
9008 { PREFIX_TABLE (PREFIX_VEX_0F3A16) },
9009 { PREFIX_TABLE (PREFIX_VEX_0F3A17) },
9010 /* 18 */
9011 { PREFIX_TABLE (PREFIX_VEX_0F3A18) },
9012 { PREFIX_TABLE (PREFIX_VEX_0F3A19) },
9013 { Bad_Opcode },
9014 { Bad_Opcode },
9015 { Bad_Opcode },
9016 { PREFIX_TABLE (PREFIX_VEX_0F3A1D) },
9017 { Bad_Opcode },
9018 { Bad_Opcode },
9019 /* 20 */
9020 { PREFIX_TABLE (PREFIX_VEX_0F3A20) },
9021 { PREFIX_TABLE (PREFIX_VEX_0F3A21) },
9022 { PREFIX_TABLE (PREFIX_VEX_0F3A22) },
9023 { Bad_Opcode },
9024 { Bad_Opcode },
9025 { Bad_Opcode },
9026 { Bad_Opcode },
9027 { Bad_Opcode },
9028 /* 28 */
9029 { Bad_Opcode },
9030 { Bad_Opcode },
9031 { Bad_Opcode },
9032 { Bad_Opcode },
9033 { Bad_Opcode },
9034 { Bad_Opcode },
9035 { Bad_Opcode },
9036 { Bad_Opcode },
9037 /* 30 */
9038 { PREFIX_TABLE (PREFIX_VEX_0F3A30) },
9039 { PREFIX_TABLE (PREFIX_VEX_0F3A31) },
9040 { PREFIX_TABLE (PREFIX_VEX_0F3A32) },
9041 { PREFIX_TABLE (PREFIX_VEX_0F3A33) },
9042 { Bad_Opcode },
9043 { Bad_Opcode },
9044 { Bad_Opcode },
9045 { Bad_Opcode },
9046 /* 38 */
9047 { PREFIX_TABLE (PREFIX_VEX_0F3A38) },
9048 { PREFIX_TABLE (PREFIX_VEX_0F3A39) },
9049 { Bad_Opcode },
9050 { Bad_Opcode },
9051 { Bad_Opcode },
9052 { Bad_Opcode },
9053 { Bad_Opcode },
9054 { Bad_Opcode },
9055 /* 40 */
9056 { PREFIX_TABLE (PREFIX_VEX_0F3A40) },
9057 { PREFIX_TABLE (PREFIX_VEX_0F3A41) },
9058 { PREFIX_TABLE (PREFIX_VEX_0F3A42) },
9059 { Bad_Opcode },
9060 { PREFIX_TABLE (PREFIX_VEX_0F3A44) },
9061 { Bad_Opcode },
9062 { PREFIX_TABLE (PREFIX_VEX_0F3A46) },
9063 { Bad_Opcode },
9064 /* 48 */
9065 { PREFIX_TABLE (PREFIX_VEX_0F3A48) },
9066 { PREFIX_TABLE (PREFIX_VEX_0F3A49) },
9067 { PREFIX_TABLE (PREFIX_VEX_0F3A4A) },
9068 { PREFIX_TABLE (PREFIX_VEX_0F3A4B) },
9069 { PREFIX_TABLE (PREFIX_VEX_0F3A4C) },
9070 { Bad_Opcode },
9071 { Bad_Opcode },
9072 { Bad_Opcode },
9073 /* 50 */
9074 { Bad_Opcode },
9075 { Bad_Opcode },
9076 { Bad_Opcode },
9077 { Bad_Opcode },
9078 { Bad_Opcode },
9079 { Bad_Opcode },
9080 { Bad_Opcode },
9081 { Bad_Opcode },
9082 /* 58 */
9083 { Bad_Opcode },
9084 { Bad_Opcode },
9085 { Bad_Opcode },
9086 { Bad_Opcode },
9087 { PREFIX_TABLE (PREFIX_VEX_0F3A5C) },
9088 { PREFIX_TABLE (PREFIX_VEX_0F3A5D) },
9089 { PREFIX_TABLE (PREFIX_VEX_0F3A5E) },
9090 { PREFIX_TABLE (PREFIX_VEX_0F3A5F) },
9091 /* 60 */
9092 { PREFIX_TABLE (PREFIX_VEX_0F3A60) },
9093 { PREFIX_TABLE (PREFIX_VEX_0F3A61) },
9094 { PREFIX_TABLE (PREFIX_VEX_0F3A62) },
9095 { PREFIX_TABLE (PREFIX_VEX_0F3A63) },
9096 { Bad_Opcode },
9097 { Bad_Opcode },
9098 { Bad_Opcode },
9099 { Bad_Opcode },
9100 /* 68 */
9101 { PREFIX_TABLE (PREFIX_VEX_0F3A68) },
9102 { PREFIX_TABLE (PREFIX_VEX_0F3A69) },
9103 { PREFIX_TABLE (PREFIX_VEX_0F3A6A) },
9104 { PREFIX_TABLE (PREFIX_VEX_0F3A6B) },
9105 { PREFIX_TABLE (PREFIX_VEX_0F3A6C) },
9106 { PREFIX_TABLE (PREFIX_VEX_0F3A6D) },
9107 { PREFIX_TABLE (PREFIX_VEX_0F3A6E) },
9108 { PREFIX_TABLE (PREFIX_VEX_0F3A6F) },
9109 /* 70 */
9110 { Bad_Opcode },
9111 { Bad_Opcode },
9112 { Bad_Opcode },
9113 { Bad_Opcode },
9114 { Bad_Opcode },
9115 { Bad_Opcode },
9116 { Bad_Opcode },
9117 { Bad_Opcode },
9118 /* 78 */
9119 { PREFIX_TABLE (PREFIX_VEX_0F3A78) },
9120 { PREFIX_TABLE (PREFIX_VEX_0F3A79) },
9121 { PREFIX_TABLE (PREFIX_VEX_0F3A7A) },
9122 { PREFIX_TABLE (PREFIX_VEX_0F3A7B) },
9123 { PREFIX_TABLE (PREFIX_VEX_0F3A7C) },
9124 { PREFIX_TABLE (PREFIX_VEX_0F3A7D) },
9125 { PREFIX_TABLE (PREFIX_VEX_0F3A7E) },
9126 { PREFIX_TABLE (PREFIX_VEX_0F3A7F) },
9127 /* 80 */
9128 { Bad_Opcode },
9129 { Bad_Opcode },
9130 { Bad_Opcode },
9131 { Bad_Opcode },
9132 { Bad_Opcode },
9133 { Bad_Opcode },
9134 { Bad_Opcode },
9135 { Bad_Opcode },
9136 /* 88 */
9137 { Bad_Opcode },
9138 { Bad_Opcode },
9139 { Bad_Opcode },
9140 { Bad_Opcode },
9141 { Bad_Opcode },
9142 { Bad_Opcode },
9143 { Bad_Opcode },
9144 { Bad_Opcode },
9145 /* 90 */
9146 { Bad_Opcode },
9147 { Bad_Opcode },
9148 { Bad_Opcode },
9149 { Bad_Opcode },
9150 { Bad_Opcode },
9151 { Bad_Opcode },
9152 { Bad_Opcode },
9153 { Bad_Opcode },
9154 /* 98 */
9155 { Bad_Opcode },
9156 { Bad_Opcode },
9157 { Bad_Opcode },
9158 { Bad_Opcode },
9159 { Bad_Opcode },
9160 { Bad_Opcode },
9161 { Bad_Opcode },
9162 { Bad_Opcode },
9163 /* a0 */
9164 { Bad_Opcode },
9165 { Bad_Opcode },
9166 { Bad_Opcode },
9167 { Bad_Opcode },
9168 { Bad_Opcode },
9169 { Bad_Opcode },
9170 { Bad_Opcode },
9171 { Bad_Opcode },
9172 /* a8 */
9173 { Bad_Opcode },
9174 { Bad_Opcode },
9175 { Bad_Opcode },
9176 { Bad_Opcode },
9177 { Bad_Opcode },
9178 { Bad_Opcode },
9179 { Bad_Opcode },
9180 { Bad_Opcode },
9181 /* b0 */
9182 { Bad_Opcode },
9183 { Bad_Opcode },
9184 { Bad_Opcode },
9185 { Bad_Opcode },
9186 { Bad_Opcode },
9187 { Bad_Opcode },
9188 { Bad_Opcode },
9189 { Bad_Opcode },
9190 /* b8 */
9191 { Bad_Opcode },
9192 { Bad_Opcode },
9193 { Bad_Opcode },
9194 { Bad_Opcode },
9195 { Bad_Opcode },
9196 { Bad_Opcode },
9197 { Bad_Opcode },
9198 { Bad_Opcode },
9199 /* c0 */
9200 { Bad_Opcode },
9201 { Bad_Opcode },
9202 { Bad_Opcode },
9203 { Bad_Opcode },
9204 { Bad_Opcode },
9205 { Bad_Opcode },
9206 { Bad_Opcode },
9207 { Bad_Opcode },
9208 /* c8 */
9209 { Bad_Opcode },
9210 { Bad_Opcode },
9211 { Bad_Opcode },
9212 { Bad_Opcode },
9213 { Bad_Opcode },
9214 { Bad_Opcode },
9215 { PREFIX_TABLE(PREFIX_VEX_0F3ACE) },
9216 { PREFIX_TABLE(PREFIX_VEX_0F3ACF) },
9217 /* d0 */
9218 { Bad_Opcode },
9219 { Bad_Opcode },
9220 { Bad_Opcode },
9221 { Bad_Opcode },
9222 { Bad_Opcode },
9223 { Bad_Opcode },
9224 { Bad_Opcode },
9225 { Bad_Opcode },
9226 /* d8 */
9227 { Bad_Opcode },
9228 { Bad_Opcode },
9229 { Bad_Opcode },
9230 { Bad_Opcode },
9231 { Bad_Opcode },
9232 { Bad_Opcode },
9233 { Bad_Opcode },
9234 { PREFIX_TABLE (PREFIX_VEX_0F3ADF) },
9235 /* e0 */
9236 { Bad_Opcode },
9237 { Bad_Opcode },
9238 { Bad_Opcode },
9239 { Bad_Opcode },
9240 { Bad_Opcode },
9241 { Bad_Opcode },
9242 { Bad_Opcode },
9243 { Bad_Opcode },
9244 /* e8 */
9245 { Bad_Opcode },
9246 { Bad_Opcode },
9247 { Bad_Opcode },
9248 { Bad_Opcode },
9249 { Bad_Opcode },
9250 { Bad_Opcode },
9251 { Bad_Opcode },
9252 { Bad_Opcode },
9253 /* f0 */
9254 { PREFIX_TABLE (PREFIX_VEX_0F3AF0) },
9255 { Bad_Opcode },
9256 { Bad_Opcode },
9257 { Bad_Opcode },
9258 { Bad_Opcode },
9259 { Bad_Opcode },
9260 { Bad_Opcode },
9261 { Bad_Opcode },
9262 /* f8 */
9263 { Bad_Opcode },
9264 { Bad_Opcode },
9265 { Bad_Opcode },
9266 { Bad_Opcode },
9267 { Bad_Opcode },
9268 { Bad_Opcode },
9269 { Bad_Opcode },
9270 { Bad_Opcode },
9271 },
9272 };
9273
9274 #define NEED_OPCODE_TABLE
9275 #include "i386-dis-evex.h"
9276 #undef NEED_OPCODE_TABLE
9277 static const struct dis386 vex_len_table[][2] = {
9278 /* VEX_LEN_0F12_P_0_M_0 */
9279 {
9280 { "vmovlps", { XM, Vex128, EXq }, 0 },
9281 },
9282
9283 /* VEX_LEN_0F12_P_0_M_1 */
9284 {
9285 { "vmovhlps", { XM, Vex128, EXq }, 0 },
9286 },
9287
9288 /* VEX_LEN_0F12_P_2 */
9289 {
9290 { "vmovlpd", { XM, Vex128, EXq }, 0 },
9291 },
9292
9293 /* VEX_LEN_0F13_M_0 */
9294 {
9295 { "vmovlpX", { EXq, XM }, 0 },
9296 },
9297
9298 /* VEX_LEN_0F16_P_0_M_0 */
9299 {
9300 { "vmovhps", { XM, Vex128, EXq }, 0 },
9301 },
9302
9303 /* VEX_LEN_0F16_P_0_M_1 */
9304 {
9305 { "vmovlhps", { XM, Vex128, EXq }, 0 },
9306 },
9307
9308 /* VEX_LEN_0F16_P_2 */
9309 {
9310 { "vmovhpd", { XM, Vex128, EXq }, 0 },
9311 },
9312
9313 /* VEX_LEN_0F17_M_0 */
9314 {
9315 { "vmovhpX", { EXq, XM }, 0 },
9316 },
9317
9318 /* VEX_LEN_0F2A_P_1 */
9319 {
9320 { "vcvtsi2ss%LQ", { XMScalar, VexScalar, Ev }, 0 },
9321 { "vcvtsi2ss%LQ", { XMScalar, VexScalar, Ev }, 0 },
9322 },
9323
9324 /* VEX_LEN_0F2A_P_3 */
9325 {
9326 { "vcvtsi2sd%LQ", { XMScalar, VexScalar, Ev }, 0 },
9327 { "vcvtsi2sd%LQ", { XMScalar, VexScalar, Ev }, 0 },
9328 },
9329
9330 /* VEX_LEN_0F2C_P_1 */
9331 {
9332 { "vcvttss2si", { Gv, EXdScalar }, 0 },
9333 { "vcvttss2si", { Gv, EXdScalar }, 0 },
9334 },
9335
9336 /* VEX_LEN_0F2C_P_3 */
9337 {
9338 { "vcvttsd2si", { Gv, EXqScalar }, 0 },
9339 { "vcvttsd2si", { Gv, EXqScalar }, 0 },
9340 },
9341
9342 /* VEX_LEN_0F2D_P_1 */
9343 {
9344 { "vcvtss2si", { Gv, EXdScalar }, 0 },
9345 { "vcvtss2si", { Gv, EXdScalar }, 0 },
9346 },
9347
9348 /* VEX_LEN_0F2D_P_3 */
9349 {
9350 { "vcvtsd2si", { Gv, EXqScalar }, 0 },
9351 { "vcvtsd2si", { Gv, EXqScalar }, 0 },
9352 },
9353
9354 /* VEX_LEN_0F41_P_0 */
9355 {
9356 { Bad_Opcode },
9357 { VEX_W_TABLE (VEX_W_0F41_P_0_LEN_1) },
9358 },
9359 /* VEX_LEN_0F41_P_2 */
9360 {
9361 { Bad_Opcode },
9362 { VEX_W_TABLE (VEX_W_0F41_P_2_LEN_1) },
9363 },
9364 /* VEX_LEN_0F42_P_0 */
9365 {
9366 { Bad_Opcode },
9367 { VEX_W_TABLE (VEX_W_0F42_P_0_LEN_1) },
9368 },
9369 /* VEX_LEN_0F42_P_2 */
9370 {
9371 { Bad_Opcode },
9372 { VEX_W_TABLE (VEX_W_0F42_P_2_LEN_1) },
9373 },
9374 /* VEX_LEN_0F44_P_0 */
9375 {
9376 { VEX_W_TABLE (VEX_W_0F44_P_0_LEN_0) },
9377 },
9378 /* VEX_LEN_0F44_P_2 */
9379 {
9380 { VEX_W_TABLE (VEX_W_0F44_P_2_LEN_0) },
9381 },
9382 /* VEX_LEN_0F45_P_0 */
9383 {
9384 { Bad_Opcode },
9385 { VEX_W_TABLE (VEX_W_0F45_P_0_LEN_1) },
9386 },
9387 /* VEX_LEN_0F45_P_2 */
9388 {
9389 { Bad_Opcode },
9390 { VEX_W_TABLE (VEX_W_0F45_P_2_LEN_1) },
9391 },
9392 /* VEX_LEN_0F46_P_0 */
9393 {
9394 { Bad_Opcode },
9395 { VEX_W_TABLE (VEX_W_0F46_P_0_LEN_1) },
9396 },
9397 /* VEX_LEN_0F46_P_2 */
9398 {
9399 { Bad_Opcode },
9400 { VEX_W_TABLE (VEX_W_0F46_P_2_LEN_1) },
9401 },
9402 /* VEX_LEN_0F47_P_0 */
9403 {
9404 { Bad_Opcode },
9405 { VEX_W_TABLE (VEX_W_0F47_P_0_LEN_1) },
9406 },
9407 /* VEX_LEN_0F47_P_2 */
9408 {
9409 { Bad_Opcode },
9410 { VEX_W_TABLE (VEX_W_0F47_P_2_LEN_1) },
9411 },
9412 /* VEX_LEN_0F4A_P_0 */
9413 {
9414 { Bad_Opcode },
9415 { VEX_W_TABLE (VEX_W_0F4A_P_0_LEN_1) },
9416 },
9417 /* VEX_LEN_0F4A_P_2 */
9418 {
9419 { Bad_Opcode },
9420 { VEX_W_TABLE (VEX_W_0F4A_P_2_LEN_1) },
9421 },
9422 /* VEX_LEN_0F4B_P_0 */
9423 {
9424 { Bad_Opcode },
9425 { VEX_W_TABLE (VEX_W_0F4B_P_0_LEN_1) },
9426 },
9427 /* VEX_LEN_0F4B_P_2 */
9428 {
9429 { Bad_Opcode },
9430 { VEX_W_TABLE (VEX_W_0F4B_P_2_LEN_1) },
9431 },
9432
9433 /* VEX_LEN_0F6E_P_2 */
9434 {
9435 { "vmovK", { XMScalar, Edq }, 0 },
9436 },
9437
9438 /* VEX_LEN_0F77_P_1 */
9439 {
9440 { "vzeroupper", { XX }, 0 },
9441 { "vzeroall", { XX }, 0 },
9442 },
9443
9444 /* VEX_LEN_0F7E_P_1 */
9445 {
9446 { "vmovq", { XMScalar, EXqScalar }, 0 },
9447 },
9448
9449 /* VEX_LEN_0F7E_P_2 */
9450 {
9451 { "vmovK", { Edq, XMScalar }, 0 },
9452 },
9453
9454 /* VEX_LEN_0F90_P_0 */
9455 {
9456 { VEX_W_TABLE (VEX_W_0F90_P_0_LEN_0) },
9457 },
9458
9459 /* VEX_LEN_0F90_P_2 */
9460 {
9461 { VEX_W_TABLE (VEX_W_0F90_P_2_LEN_0) },
9462 },
9463
9464 /* VEX_LEN_0F91_P_0 */
9465 {
9466 { VEX_W_TABLE (VEX_W_0F91_P_0_LEN_0) },
9467 },
9468
9469 /* VEX_LEN_0F91_P_2 */
9470 {
9471 { VEX_W_TABLE (VEX_W_0F91_P_2_LEN_0) },
9472 },
9473
9474 /* VEX_LEN_0F92_P_0 */
9475 {
9476 { VEX_W_TABLE (VEX_W_0F92_P_0_LEN_0) },
9477 },
9478
9479 /* VEX_LEN_0F92_P_2 */
9480 {
9481 { VEX_W_TABLE (VEX_W_0F92_P_2_LEN_0) },
9482 },
9483
9484 /* VEX_LEN_0F92_P_3 */
9485 {
9486 { MOD_TABLE (MOD_VEX_0F92_P_3_LEN_0) },
9487 },
9488
9489 /* VEX_LEN_0F93_P_0 */
9490 {
9491 { VEX_W_TABLE (VEX_W_0F93_P_0_LEN_0) },
9492 },
9493
9494 /* VEX_LEN_0F93_P_2 */
9495 {
9496 { VEX_W_TABLE (VEX_W_0F93_P_2_LEN_0) },
9497 },
9498
9499 /* VEX_LEN_0F93_P_3 */
9500 {
9501 { MOD_TABLE (MOD_VEX_0F93_P_3_LEN_0) },
9502 },
9503
9504 /* VEX_LEN_0F98_P_0 */
9505 {
9506 { VEX_W_TABLE (VEX_W_0F98_P_0_LEN_0) },
9507 },
9508
9509 /* VEX_LEN_0F98_P_2 */
9510 {
9511 { VEX_W_TABLE (VEX_W_0F98_P_2_LEN_0) },
9512 },
9513
9514 /* VEX_LEN_0F99_P_0 */
9515 {
9516 { VEX_W_TABLE (VEX_W_0F99_P_0_LEN_0) },
9517 },
9518
9519 /* VEX_LEN_0F99_P_2 */
9520 {
9521 { VEX_W_TABLE (VEX_W_0F99_P_2_LEN_0) },
9522 },
9523
9524 /* VEX_LEN_0FAE_R_2_M_0 */
9525 {
9526 { "vldmxcsr", { Md }, 0 },
9527 },
9528
9529 /* VEX_LEN_0FAE_R_3_M_0 */
9530 {
9531 { "vstmxcsr", { Md }, 0 },
9532 },
9533
9534 /* VEX_LEN_0FC4_P_2 */
9535 {
9536 { "vpinsrw", { XM, Vex128, Edqw, Ib }, 0 },
9537 },
9538
9539 /* VEX_LEN_0FC5_P_2 */
9540 {
9541 { "vpextrw", { Gdq, XS, Ib }, 0 },
9542 },
9543
9544 /* VEX_LEN_0FD6_P_2 */
9545 {
9546 { "vmovq", { EXqScalarS, XMScalar }, 0 },
9547 },
9548
9549 /* VEX_LEN_0FF7_P_2 */
9550 {
9551 { "vmaskmovdqu", { XM, XS }, 0 },
9552 },
9553
9554 /* VEX_LEN_0F3816_P_2 */
9555 {
9556 { Bad_Opcode },
9557 { VEX_W_TABLE (VEX_W_0F3816_P_2) },
9558 },
9559
9560 /* VEX_LEN_0F3819_P_2 */
9561 {
9562 { Bad_Opcode },
9563 { VEX_W_TABLE (VEX_W_0F3819_P_2) },
9564 },
9565
9566 /* VEX_LEN_0F381A_P_2_M_0 */
9567 {
9568 { Bad_Opcode },
9569 { VEX_W_TABLE (VEX_W_0F381A_P_2_M_0) },
9570 },
9571
9572 /* VEX_LEN_0F3836_P_2 */
9573 {
9574 { Bad_Opcode },
9575 { VEX_W_TABLE (VEX_W_0F3836_P_2) },
9576 },
9577
9578 /* VEX_LEN_0F3841_P_2 */
9579 {
9580 { "vphminposuw", { XM, EXx }, 0 },
9581 },
9582
9583 /* VEX_LEN_0F385A_P_2_M_0 */
9584 {
9585 { Bad_Opcode },
9586 { VEX_W_TABLE (VEX_W_0F385A_P_2_M_0) },
9587 },
9588
9589 /* VEX_LEN_0F38DB_P_2 */
9590 {
9591 { "vaesimc", { XM, EXx }, 0 },
9592 },
9593
9594 /* VEX_LEN_0F38F2_P_0 */
9595 {
9596 { "andnS", { Gdq, VexGdq, Edq }, 0 },
9597 },
9598
9599 /* VEX_LEN_0F38F3_R_1_P_0 */
9600 {
9601 { "blsrS", { VexGdq, Edq }, 0 },
9602 },
9603
9604 /* VEX_LEN_0F38F3_R_2_P_0 */
9605 {
9606 { "blsmskS", { VexGdq, Edq }, 0 },
9607 },
9608
9609 /* VEX_LEN_0F38F3_R_3_P_0 */
9610 {
9611 { "blsiS", { VexGdq, Edq }, 0 },
9612 },
9613
9614 /* VEX_LEN_0F38F5_P_0 */
9615 {
9616 { "bzhiS", { Gdq, Edq, VexGdq }, 0 },
9617 },
9618
9619 /* VEX_LEN_0F38F5_P_1 */
9620 {
9621 { "pextS", { Gdq, VexGdq, Edq }, 0 },
9622 },
9623
9624 /* VEX_LEN_0F38F5_P_3 */
9625 {
9626 { "pdepS", { Gdq, VexGdq, Edq }, 0 },
9627 },
9628
9629 /* VEX_LEN_0F38F6_P_3 */
9630 {
9631 { "mulxS", { Gdq, VexGdq, Edq }, 0 },
9632 },
9633
9634 /* VEX_LEN_0F38F7_P_0 */
9635 {
9636 { "bextrS", { Gdq, Edq, VexGdq }, 0 },
9637 },
9638
9639 /* VEX_LEN_0F38F7_P_1 */
9640 {
9641 { "sarxS", { Gdq, Edq, VexGdq }, 0 },
9642 },
9643
9644 /* VEX_LEN_0F38F7_P_2 */
9645 {
9646 { "shlxS", { Gdq, Edq, VexGdq }, 0 },
9647 },
9648
9649 /* VEX_LEN_0F38F7_P_3 */
9650 {
9651 { "shrxS", { Gdq, Edq, VexGdq }, 0 },
9652 },
9653
9654 /* VEX_LEN_0F3A00_P_2 */
9655 {
9656 { Bad_Opcode },
9657 { VEX_W_TABLE (VEX_W_0F3A00_P_2) },
9658 },
9659
9660 /* VEX_LEN_0F3A01_P_2 */
9661 {
9662 { Bad_Opcode },
9663 { VEX_W_TABLE (VEX_W_0F3A01_P_2) },
9664 },
9665
9666 /* VEX_LEN_0F3A06_P_2 */
9667 {
9668 { Bad_Opcode },
9669 { VEX_W_TABLE (VEX_W_0F3A06_P_2) },
9670 },
9671
9672 /* VEX_LEN_0F3A14_P_2 */
9673 {
9674 { "vpextrb", { Edqb, XM, Ib }, 0 },
9675 },
9676
9677 /* VEX_LEN_0F3A15_P_2 */
9678 {
9679 { "vpextrw", { Edqw, XM, Ib }, 0 },
9680 },
9681
9682 /* VEX_LEN_0F3A16_P_2 */
9683 {
9684 { "vpextrK", { Edq, XM, Ib }, 0 },
9685 },
9686
9687 /* VEX_LEN_0F3A17_P_2 */
9688 {
9689 { "vextractps", { Edqd, XM, Ib }, 0 },
9690 },
9691
9692 /* VEX_LEN_0F3A18_P_2 */
9693 {
9694 { Bad_Opcode },
9695 { VEX_W_TABLE (VEX_W_0F3A18_P_2) },
9696 },
9697
9698 /* VEX_LEN_0F3A19_P_2 */
9699 {
9700 { Bad_Opcode },
9701 { VEX_W_TABLE (VEX_W_0F3A19_P_2) },
9702 },
9703
9704 /* VEX_LEN_0F3A20_P_2 */
9705 {
9706 { "vpinsrb", { XM, Vex128, Edqb, Ib }, 0 },
9707 },
9708
9709 /* VEX_LEN_0F3A21_P_2 */
9710 {
9711 { "vinsertps", { XM, Vex128, EXd, Ib }, 0 },
9712 },
9713
9714 /* VEX_LEN_0F3A22_P_2 */
9715 {
9716 { "vpinsrK", { XM, Vex128, Edq, Ib }, 0 },
9717 },
9718
9719 /* VEX_LEN_0F3A30_P_2 */
9720 {
9721 { VEX_W_TABLE (VEX_W_0F3A30_P_2_LEN_0) },
9722 },
9723
9724 /* VEX_LEN_0F3A31_P_2 */
9725 {
9726 { VEX_W_TABLE (VEX_W_0F3A31_P_2_LEN_0) },
9727 },
9728
9729 /* VEX_LEN_0F3A32_P_2 */
9730 {
9731 { VEX_W_TABLE (VEX_W_0F3A32_P_2_LEN_0) },
9732 },
9733
9734 /* VEX_LEN_0F3A33_P_2 */
9735 {
9736 { VEX_W_TABLE (VEX_W_0F3A33_P_2_LEN_0) },
9737 },
9738
9739 /* VEX_LEN_0F3A38_P_2 */
9740 {
9741 { Bad_Opcode },
9742 { VEX_W_TABLE (VEX_W_0F3A38_P_2) },
9743 },
9744
9745 /* VEX_LEN_0F3A39_P_2 */
9746 {
9747 { Bad_Opcode },
9748 { VEX_W_TABLE (VEX_W_0F3A39_P_2) },
9749 },
9750
9751 /* VEX_LEN_0F3A41_P_2 */
9752 {
9753 { "vdppd", { XM, Vex128, EXx, Ib }, 0 },
9754 },
9755
9756 /* VEX_LEN_0F3A46_P_2 */
9757 {
9758 { Bad_Opcode },
9759 { VEX_W_TABLE (VEX_W_0F3A46_P_2) },
9760 },
9761
9762 /* VEX_LEN_0F3A60_P_2 */
9763 {
9764 { "vpcmpestrm", { XM, { PCMPESTR_Fixup, x_mode }, Ib }, 0 },
9765 },
9766
9767 /* VEX_LEN_0F3A61_P_2 */
9768 {
9769 { "vpcmpestri", { XM, { PCMPESTR_Fixup, x_mode }, Ib }, 0 },
9770 },
9771
9772 /* VEX_LEN_0F3A62_P_2 */
9773 {
9774 { "vpcmpistrm", { XM, EXx, Ib }, 0 },
9775 },
9776
9777 /* VEX_LEN_0F3A63_P_2 */
9778 {
9779 { "vpcmpistri", { XM, EXx, Ib }, 0 },
9780 },
9781
9782 /* VEX_LEN_0F3A6A_P_2 */
9783 {
9784 { "vfmaddss", { XMVexW, Vex128, EXdVexW, EXdVexW }, 0 },
9785 },
9786
9787 /* VEX_LEN_0F3A6B_P_2 */
9788 {
9789 { "vfmaddsd", { XMVexW, Vex128, EXqVexW, EXqVexW }, 0 },
9790 },
9791
9792 /* VEX_LEN_0F3A6E_P_2 */
9793 {
9794 { "vfmsubss", { XMVexW, Vex128, EXdVexW, EXdVexW }, 0 },
9795 },
9796
9797 /* VEX_LEN_0F3A6F_P_2 */
9798 {
9799 { "vfmsubsd", { XMVexW, Vex128, EXqVexW, EXqVexW }, 0 },
9800 },
9801
9802 /* VEX_LEN_0F3A7A_P_2 */
9803 {
9804 { "vfnmaddss", { XMVexW, Vex128, EXdVexW, EXdVexW }, 0 },
9805 },
9806
9807 /* VEX_LEN_0F3A7B_P_2 */
9808 {
9809 { "vfnmaddsd", { XMVexW, Vex128, EXqVexW, EXqVexW }, 0 },
9810 },
9811
9812 /* VEX_LEN_0F3A7E_P_2 */
9813 {
9814 { "vfnmsubss", { XMVexW, Vex128, EXdVexW, EXdVexW }, 0 },
9815 },
9816
9817 /* VEX_LEN_0F3A7F_P_2 */
9818 {
9819 { "vfnmsubsd", { XMVexW, Vex128, EXqVexW, EXqVexW }, 0 },
9820 },
9821
9822 /* VEX_LEN_0F3ADF_P_2 */
9823 {
9824 { "vaeskeygenassist", { XM, EXx, Ib }, 0 },
9825 },
9826
9827 /* VEX_LEN_0F3AF0_P_3 */
9828 {
9829 { "rorxS", { Gdq, Edq, Ib }, 0 },
9830 },
9831
9832 /* VEX_LEN_0FXOP_08_CC */
9833 {
9834 { "vpcomb", { XM, Vex128, EXx, VPCOM }, 0 },
9835 },
9836
9837 /* VEX_LEN_0FXOP_08_CD */
9838 {
9839 { "vpcomw", { XM, Vex128, EXx, VPCOM }, 0 },
9840 },
9841
9842 /* VEX_LEN_0FXOP_08_CE */
9843 {
9844 { "vpcomd", { XM, Vex128, EXx, VPCOM }, 0 },
9845 },
9846
9847 /* VEX_LEN_0FXOP_08_CF */
9848 {
9849 { "vpcomq", { XM, Vex128, EXx, VPCOM }, 0 },
9850 },
9851
9852 /* VEX_LEN_0FXOP_08_EC */
9853 {
9854 { "vpcomub", { XM, Vex128, EXx, VPCOM }, 0 },
9855 },
9856
9857 /* VEX_LEN_0FXOP_08_ED */
9858 {
9859 { "vpcomuw", { XM, Vex128, EXx, VPCOM }, 0 },
9860 },
9861
9862 /* VEX_LEN_0FXOP_08_EE */
9863 {
9864 { "vpcomud", { XM, Vex128, EXx, VPCOM }, 0 },
9865 },
9866
9867 /* VEX_LEN_0FXOP_08_EF */
9868 {
9869 { "vpcomuq", { XM, Vex128, EXx, VPCOM }, 0 },
9870 },
9871
9872 /* VEX_LEN_0FXOP_09_80 */
9873 {
9874 { "vfrczps", { XM, EXxmm }, 0 },
9875 { "vfrczps", { XM, EXymmq }, 0 },
9876 },
9877
9878 /* VEX_LEN_0FXOP_09_81 */
9879 {
9880 { "vfrczpd", { XM, EXxmm }, 0 },
9881 { "vfrczpd", { XM, EXymmq }, 0 },
9882 },
9883 };
9884
9885 static const struct dis386 evex_len_table[][3] = {
9886 #define NEED_EVEX_LEN_TABLE
9887 #include "i386-dis-evex.h"
9888 #undef NEED_EVEX_LEN_TABLE
9889 };
9890
9891 static const struct dis386 vex_w_table[][2] = {
9892 {
9893 /* VEX_W_0F41_P_0_LEN_1 */
9894 { MOD_TABLE (MOD_VEX_W_0_0F41_P_0_LEN_1) },
9895 { MOD_TABLE (MOD_VEX_W_1_0F41_P_0_LEN_1) },
9896 },
9897 {
9898 /* VEX_W_0F41_P_2_LEN_1 */
9899 { MOD_TABLE (MOD_VEX_W_0_0F41_P_2_LEN_1) },
9900 { MOD_TABLE (MOD_VEX_W_1_0F41_P_2_LEN_1) }
9901 },
9902 {
9903 /* VEX_W_0F42_P_0_LEN_1 */
9904 { MOD_TABLE (MOD_VEX_W_0_0F42_P_0_LEN_1) },
9905 { MOD_TABLE (MOD_VEX_W_1_0F42_P_0_LEN_1) },
9906 },
9907 {
9908 /* VEX_W_0F42_P_2_LEN_1 */
9909 { MOD_TABLE (MOD_VEX_W_0_0F42_P_2_LEN_1) },
9910 { MOD_TABLE (MOD_VEX_W_1_0F42_P_2_LEN_1) },
9911 },
9912 {
9913 /* VEX_W_0F44_P_0_LEN_0 */
9914 { MOD_TABLE (MOD_VEX_W_0_0F44_P_0_LEN_1) },
9915 { MOD_TABLE (MOD_VEX_W_1_0F44_P_0_LEN_1) },
9916 },
9917 {
9918 /* VEX_W_0F44_P_2_LEN_0 */
9919 { MOD_TABLE (MOD_VEX_W_0_0F44_P_2_LEN_1) },
9920 { MOD_TABLE (MOD_VEX_W_1_0F44_P_2_LEN_1) },
9921 },
9922 {
9923 /* VEX_W_0F45_P_0_LEN_1 */
9924 { MOD_TABLE (MOD_VEX_W_0_0F45_P_0_LEN_1) },
9925 { MOD_TABLE (MOD_VEX_W_1_0F45_P_0_LEN_1) },
9926 },
9927 {
9928 /* VEX_W_0F45_P_2_LEN_1 */
9929 { MOD_TABLE (MOD_VEX_W_0_0F45_P_2_LEN_1) },
9930 { MOD_TABLE (MOD_VEX_W_1_0F45_P_2_LEN_1) },
9931 },
9932 {
9933 /* VEX_W_0F46_P_0_LEN_1 */
9934 { MOD_TABLE (MOD_VEX_W_0_0F46_P_0_LEN_1) },
9935 { MOD_TABLE (MOD_VEX_W_1_0F46_P_0_LEN_1) },
9936 },
9937 {
9938 /* VEX_W_0F46_P_2_LEN_1 */
9939 { MOD_TABLE (MOD_VEX_W_0_0F46_P_2_LEN_1) },
9940 { MOD_TABLE (MOD_VEX_W_1_0F46_P_2_LEN_1) },
9941 },
9942 {
9943 /* VEX_W_0F47_P_0_LEN_1 */
9944 { MOD_TABLE (MOD_VEX_W_0_0F47_P_0_LEN_1) },
9945 { MOD_TABLE (MOD_VEX_W_1_0F47_P_0_LEN_1) },
9946 },
9947 {
9948 /* VEX_W_0F47_P_2_LEN_1 */
9949 { MOD_TABLE (MOD_VEX_W_0_0F47_P_2_LEN_1) },
9950 { MOD_TABLE (MOD_VEX_W_1_0F47_P_2_LEN_1) },
9951 },
9952 {
9953 /* VEX_W_0F4A_P_0_LEN_1 */
9954 { MOD_TABLE (MOD_VEX_W_0_0F4A_P_0_LEN_1) },
9955 { MOD_TABLE (MOD_VEX_W_1_0F4A_P_0_LEN_1) },
9956 },
9957 {
9958 /* VEX_W_0F4A_P_2_LEN_1 */
9959 { MOD_TABLE (MOD_VEX_W_0_0F4A_P_2_LEN_1) },
9960 { MOD_TABLE (MOD_VEX_W_1_0F4A_P_2_LEN_1) },
9961 },
9962 {
9963 /* VEX_W_0F4B_P_0_LEN_1 */
9964 { MOD_TABLE (MOD_VEX_W_0_0F4B_P_0_LEN_1) },
9965 { MOD_TABLE (MOD_VEX_W_1_0F4B_P_0_LEN_1) },
9966 },
9967 {
9968 /* VEX_W_0F4B_P_2_LEN_1 */
9969 { MOD_TABLE (MOD_VEX_W_0_0F4B_P_2_LEN_1) },
9970 },
9971 {
9972 /* VEX_W_0F90_P_0_LEN_0 */
9973 { "kmovw", { MaskG, MaskE }, 0 },
9974 { "kmovq", { MaskG, MaskE }, 0 },
9975 },
9976 {
9977 /* VEX_W_0F90_P_2_LEN_0 */
9978 { "kmovb", { MaskG, MaskBDE }, 0 },
9979 { "kmovd", { MaskG, MaskBDE }, 0 },
9980 },
9981 {
9982 /* VEX_W_0F91_P_0_LEN_0 */
9983 { MOD_TABLE (MOD_VEX_W_0_0F91_P_0_LEN_0) },
9984 { MOD_TABLE (MOD_VEX_W_1_0F91_P_0_LEN_0) },
9985 },
9986 {
9987 /* VEX_W_0F91_P_2_LEN_0 */
9988 { MOD_TABLE (MOD_VEX_W_0_0F91_P_2_LEN_0) },
9989 { MOD_TABLE (MOD_VEX_W_1_0F91_P_2_LEN_0) },
9990 },
9991 {
9992 /* VEX_W_0F92_P_0_LEN_0 */
9993 { MOD_TABLE (MOD_VEX_W_0_0F92_P_0_LEN_0) },
9994 },
9995 {
9996 /* VEX_W_0F92_P_2_LEN_0 */
9997 { MOD_TABLE (MOD_VEX_W_0_0F92_P_2_LEN_0) },
9998 },
9999 {
10000 /* VEX_W_0F93_P_0_LEN_0 */
10001 { MOD_TABLE (MOD_VEX_W_0_0F93_P_0_LEN_0) },
10002 },
10003 {
10004 /* VEX_W_0F93_P_2_LEN_0 */
10005 { MOD_TABLE (MOD_VEX_W_0_0F93_P_2_LEN_0) },
10006 },
10007 {
10008 /* VEX_W_0F98_P_0_LEN_0 */
10009 { MOD_TABLE (MOD_VEX_W_0_0F98_P_0_LEN_0) },
10010 { MOD_TABLE (MOD_VEX_W_1_0F98_P_0_LEN_0) },
10011 },
10012 {
10013 /* VEX_W_0F98_P_2_LEN_0 */
10014 { MOD_TABLE (MOD_VEX_W_0_0F98_P_2_LEN_0) },
10015 { MOD_TABLE (MOD_VEX_W_1_0F98_P_2_LEN_0) },
10016 },
10017 {
10018 /* VEX_W_0F99_P_0_LEN_0 */
10019 { MOD_TABLE (MOD_VEX_W_0_0F99_P_0_LEN_0) },
10020 { MOD_TABLE (MOD_VEX_W_1_0F99_P_0_LEN_0) },
10021 },
10022 {
10023 /* VEX_W_0F99_P_2_LEN_0 */
10024 { MOD_TABLE (MOD_VEX_W_0_0F99_P_2_LEN_0) },
10025 { MOD_TABLE (MOD_VEX_W_1_0F99_P_2_LEN_0) },
10026 },
10027 {
10028 /* VEX_W_0F380C_P_2 */
10029 { "vpermilps", { XM, Vex, EXx }, 0 },
10030 },
10031 {
10032 /* VEX_W_0F380D_P_2 */
10033 { "vpermilpd", { XM, Vex, EXx }, 0 },
10034 },
10035 {
10036 /* VEX_W_0F380E_P_2 */
10037 { "vtestps", { XM, EXx }, 0 },
10038 },
10039 {
10040 /* VEX_W_0F380F_P_2 */
10041 { "vtestpd", { XM, EXx }, 0 },
10042 },
10043 {
10044 /* VEX_W_0F3816_P_2 */
10045 { "vpermps", { XM, Vex, EXx }, 0 },
10046 },
10047 {
10048 /* VEX_W_0F3818_P_2 */
10049 { "vbroadcastss", { XM, EXxmm_md }, 0 },
10050 },
10051 {
10052 /* VEX_W_0F3819_P_2 */
10053 { "vbroadcastsd", { XM, EXxmm_mq }, 0 },
10054 },
10055 {
10056 /* VEX_W_0F381A_P_2_M_0 */
10057 { "vbroadcastf128", { XM, Mxmm }, 0 },
10058 },
10059 {
10060 /* VEX_W_0F382C_P_2_M_0 */
10061 { "vmaskmovps", { XM, Vex, Mx }, 0 },
10062 },
10063 {
10064 /* VEX_W_0F382D_P_2_M_0 */
10065 { "vmaskmovpd", { XM, Vex, Mx }, 0 },
10066 },
10067 {
10068 /* VEX_W_0F382E_P_2_M_0 */
10069 { "vmaskmovps", { Mx, Vex, XM }, 0 },
10070 },
10071 {
10072 /* VEX_W_0F382F_P_2_M_0 */
10073 { "vmaskmovpd", { Mx, Vex, XM }, 0 },
10074 },
10075 {
10076 /* VEX_W_0F3836_P_2 */
10077 { "vpermd", { XM, Vex, EXx }, 0 },
10078 },
10079 {
10080 /* VEX_W_0F3846_P_2 */
10081 { "vpsravd", { XM, Vex, EXx }, 0 },
10082 },
10083 {
10084 /* VEX_W_0F3858_P_2 */
10085 { "vpbroadcastd", { XM, EXxmm_md }, 0 },
10086 },
10087 {
10088 /* VEX_W_0F3859_P_2 */
10089 { "vpbroadcastq", { XM, EXxmm_mq }, 0 },
10090 },
10091 {
10092 /* VEX_W_0F385A_P_2_M_0 */
10093 { "vbroadcasti128", { XM, Mxmm }, 0 },
10094 },
10095 {
10096 /* VEX_W_0F3878_P_2 */
10097 { "vpbroadcastb", { XM, EXxmm_mb }, 0 },
10098 },
10099 {
10100 /* VEX_W_0F3879_P_2 */
10101 { "vpbroadcastw", { XM, EXxmm_mw }, 0 },
10102 },
10103 {
10104 /* VEX_W_0F38CF_P_2 */
10105 { "vgf2p8mulb", { XM, Vex, EXx }, 0 },
10106 },
10107 {
10108 /* VEX_W_0F3A00_P_2 */
10109 { Bad_Opcode },
10110 { "vpermq", { XM, EXx, Ib }, 0 },
10111 },
10112 {
10113 /* VEX_W_0F3A01_P_2 */
10114 { Bad_Opcode },
10115 { "vpermpd", { XM, EXx, Ib }, 0 },
10116 },
10117 {
10118 /* VEX_W_0F3A02_P_2 */
10119 { "vpblendd", { XM, Vex, EXx, Ib }, 0 },
10120 },
10121 {
10122 /* VEX_W_0F3A04_P_2 */
10123 { "vpermilps", { XM, EXx, Ib }, 0 },
10124 },
10125 {
10126 /* VEX_W_0F3A05_P_2 */
10127 { "vpermilpd", { XM, EXx, Ib }, 0 },
10128 },
10129 {
10130 /* VEX_W_0F3A06_P_2 */
10131 { "vperm2f128", { XM, Vex256, EXx, Ib }, 0 },
10132 },
10133 {
10134 /* VEX_W_0F3A18_P_2 */
10135 { "vinsertf128", { XM, Vex256, EXxmm, Ib }, 0 },
10136 },
10137 {
10138 /* VEX_W_0F3A19_P_2 */
10139 { "vextractf128", { EXxmm, XM, Ib }, 0 },
10140 },
10141 {
10142 /* VEX_W_0F3A30_P_2_LEN_0 */
10143 { MOD_TABLE (MOD_VEX_W_0_0F3A30_P_2_LEN_0) },
10144 { MOD_TABLE (MOD_VEX_W_1_0F3A30_P_2_LEN_0) },
10145 },
10146 {
10147 /* VEX_W_0F3A31_P_2_LEN_0 */
10148 { MOD_TABLE (MOD_VEX_W_0_0F3A31_P_2_LEN_0) },
10149 { MOD_TABLE (MOD_VEX_W_1_0F3A31_P_2_LEN_0) },
10150 },
10151 {
10152 /* VEX_W_0F3A32_P_2_LEN_0 */
10153 { MOD_TABLE (MOD_VEX_W_0_0F3A32_P_2_LEN_0) },
10154 { MOD_TABLE (MOD_VEX_W_1_0F3A32_P_2_LEN_0) },
10155 },
10156 {
10157 /* VEX_W_0F3A33_P_2_LEN_0 */
10158 { MOD_TABLE (MOD_VEX_W_0_0F3A33_P_2_LEN_0) },
10159 { MOD_TABLE (MOD_VEX_W_1_0F3A33_P_2_LEN_0) },
10160 },
10161 {
10162 /* VEX_W_0F3A38_P_2 */
10163 { "vinserti128", { XM, Vex256, EXxmm, Ib }, 0 },
10164 },
10165 {
10166 /* VEX_W_0F3A39_P_2 */
10167 { "vextracti128", { EXxmm, XM, Ib }, 0 },
10168 },
10169 {
10170 /* VEX_W_0F3A46_P_2 */
10171 { "vperm2i128", { XM, Vex256, EXx, Ib }, 0 },
10172 },
10173 {
10174 /* VEX_W_0F3A48_P_2 */
10175 { "vpermil2ps", { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW }, 0 },
10176 { "vpermil2ps", { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW }, 0 },
10177 },
10178 {
10179 /* VEX_W_0F3A49_P_2 */
10180 { "vpermil2pd", { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW }, 0 },
10181 { "vpermil2pd", { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW }, 0 },
10182 },
10183 {
10184 /* VEX_W_0F3A4A_P_2 */
10185 { "vblendvps", { XM, Vex, EXx, XMVexI4 }, 0 },
10186 },
10187 {
10188 /* VEX_W_0F3A4B_P_2 */
10189 { "vblendvpd", { XM, Vex, EXx, XMVexI4 }, 0 },
10190 },
10191 {
10192 /* VEX_W_0F3A4C_P_2 */
10193 { "vpblendvb", { XM, Vex, EXx, XMVexI4 }, 0 },
10194 },
10195 {
10196 /* VEX_W_0F3ACE_P_2 */
10197 { Bad_Opcode },
10198 { "vgf2p8affineqb", { XM, Vex, EXx, Ib }, 0 },
10199 },
10200 {
10201 /* VEX_W_0F3ACF_P_2 */
10202 { Bad_Opcode },
10203 { "vgf2p8affineinvqb", { XM, Vex, EXx, Ib }, 0 },
10204 },
10205 #define NEED_VEX_W_TABLE
10206 #include "i386-dis-evex.h"
10207 #undef NEED_VEX_W_TABLE
10208 };
10209
10210 static const struct dis386 mod_table[][2] = {
10211 {
10212 /* MOD_8D */
10213 { "leaS", { Gv, M }, 0 },
10214 },
10215 {
10216 /* MOD_C6_REG_7 */
10217 { Bad_Opcode },
10218 { RM_TABLE (RM_C6_REG_7) },
10219 },
10220 {
10221 /* MOD_C7_REG_7 */
10222 { Bad_Opcode },
10223 { RM_TABLE (RM_C7_REG_7) },
10224 },
10225 {
10226 /* MOD_FF_REG_3 */
10227 { "Jcall^", { indirEp }, 0 },
10228 },
10229 {
10230 /* MOD_FF_REG_5 */
10231 { "Jjmp^", { indirEp }, 0 },
10232 },
10233 {
10234 /* MOD_0F01_REG_0 */
10235 { X86_64_TABLE (X86_64_0F01_REG_0) },
10236 { RM_TABLE (RM_0F01_REG_0) },
10237 },
10238 {
10239 /* MOD_0F01_REG_1 */
10240 { X86_64_TABLE (X86_64_0F01_REG_1) },
10241 { RM_TABLE (RM_0F01_REG_1) },
10242 },
10243 {
10244 /* MOD_0F01_REG_2 */
10245 { X86_64_TABLE (X86_64_0F01_REG_2) },
10246 { RM_TABLE (RM_0F01_REG_2) },
10247 },
10248 {
10249 /* MOD_0F01_REG_3 */
10250 { X86_64_TABLE (X86_64_0F01_REG_3) },
10251 { RM_TABLE (RM_0F01_REG_3) },
10252 },
10253 {
10254 /* MOD_0F01_REG_5 */
10255 { PREFIX_TABLE (PREFIX_MOD_0_0F01_REG_5) },
10256 { RM_TABLE (RM_0F01_REG_5) },
10257 },
10258 {
10259 /* MOD_0F01_REG_7 */
10260 { "invlpg", { Mb }, 0 },
10261 { RM_TABLE (RM_0F01_REG_7) },
10262 },
10263 {
10264 /* MOD_0F12_PREFIX_0 */
10265 { "movlps", { XM, EXq }, PREFIX_OPCODE },
10266 { "movhlps", { XM, EXq }, PREFIX_OPCODE },
10267 },
10268 {
10269 /* MOD_0F13 */
10270 { "movlpX", { EXq, XM }, PREFIX_OPCODE },
10271 },
10272 {
10273 /* MOD_0F16_PREFIX_0 */
10274 { "movhps", { XM, EXq }, 0 },
10275 { "movlhps", { XM, EXq }, 0 },
10276 },
10277 {
10278 /* MOD_0F17 */
10279 { "movhpX", { EXq, XM }, PREFIX_OPCODE },
10280 },
10281 {
10282 /* MOD_0F18_REG_0 */
10283 { "prefetchnta", { Mb }, 0 },
10284 },
10285 {
10286 /* MOD_0F18_REG_1 */
10287 { "prefetcht0", { Mb }, 0 },
10288 },
10289 {
10290 /* MOD_0F18_REG_2 */
10291 { "prefetcht1", { Mb }, 0 },
10292 },
10293 {
10294 /* MOD_0F18_REG_3 */
10295 { "prefetcht2", { Mb }, 0 },
10296 },
10297 {
10298 /* MOD_0F18_REG_4 */
10299 { "nop/reserved", { Mb }, 0 },
10300 },
10301 {
10302 /* MOD_0F18_REG_5 */
10303 { "nop/reserved", { Mb }, 0 },
10304 },
10305 {
10306 /* MOD_0F18_REG_6 */
10307 { "nop/reserved", { Mb }, 0 },
10308 },
10309 {
10310 /* MOD_0F18_REG_7 */
10311 { "nop/reserved", { Mb }, 0 },
10312 },
10313 {
10314 /* MOD_0F1A_PREFIX_0 */
10315 { "bndldx", { Gbnd, Mv_bnd }, 0 },
10316 { "nopQ", { Ev }, 0 },
10317 },
10318 {
10319 /* MOD_0F1B_PREFIX_0 */
10320 { "bndstx", { Mv_bnd, Gbnd }, 0 },
10321 { "nopQ", { Ev }, 0 },
10322 },
10323 {
10324 /* MOD_0F1B_PREFIX_1 */
10325 { "bndmk", { Gbnd, Mv_bnd }, 0 },
10326 { "nopQ", { Ev }, 0 },
10327 },
10328 {
10329 /* MOD_0F1C_PREFIX_0 */
10330 { REG_TABLE (REG_0F1C_MOD_0) },
10331 { "nopQ", { Ev }, 0 },
10332 },
10333 {
10334 /* MOD_0F1E_PREFIX_1 */
10335 { "nopQ", { Ev }, 0 },
10336 { REG_TABLE (REG_0F1E_MOD_3) },
10337 },
10338 {
10339 /* MOD_0F24 */
10340 { Bad_Opcode },
10341 { "movL", { Rd, Td }, 0 },
10342 },
10343 {
10344 /* MOD_0F26 */
10345 { Bad_Opcode },
10346 { "movL", { Td, Rd }, 0 },
10347 },
10348 {
10349 /* MOD_0F2B_PREFIX_0 */
10350 {"movntps", { Mx, XM }, PREFIX_OPCODE },
10351 },
10352 {
10353 /* MOD_0F2B_PREFIX_1 */
10354 {"movntss", { Md, XM }, PREFIX_OPCODE },
10355 },
10356 {
10357 /* MOD_0F2B_PREFIX_2 */
10358 {"movntpd", { Mx, XM }, PREFIX_OPCODE },
10359 },
10360 {
10361 /* MOD_0F2B_PREFIX_3 */
10362 {"movntsd", { Mq, XM }, PREFIX_OPCODE },
10363 },
10364 {
10365 /* MOD_0F51 */
10366 { Bad_Opcode },
10367 { "movmskpX", { Gdq, XS }, PREFIX_OPCODE },
10368 },
10369 {
10370 /* MOD_0F71_REG_2 */
10371 { Bad_Opcode },
10372 { "psrlw", { MS, Ib }, 0 },
10373 },
10374 {
10375 /* MOD_0F71_REG_4 */
10376 { Bad_Opcode },
10377 { "psraw", { MS, Ib }, 0 },
10378 },
10379 {
10380 /* MOD_0F71_REG_6 */
10381 { Bad_Opcode },
10382 { "psllw", { MS, Ib }, 0 },
10383 },
10384 {
10385 /* MOD_0F72_REG_2 */
10386 { Bad_Opcode },
10387 { "psrld", { MS, Ib }, 0 },
10388 },
10389 {
10390 /* MOD_0F72_REG_4 */
10391 { Bad_Opcode },
10392 { "psrad", { MS, Ib }, 0 },
10393 },
10394 {
10395 /* MOD_0F72_REG_6 */
10396 { Bad_Opcode },
10397 { "pslld", { MS, Ib }, 0 },
10398 },
10399 {
10400 /* MOD_0F73_REG_2 */
10401 { Bad_Opcode },
10402 { "psrlq", { MS, Ib }, 0 },
10403 },
10404 {
10405 /* MOD_0F73_REG_3 */
10406 { Bad_Opcode },
10407 { PREFIX_TABLE (PREFIX_0F73_REG_3) },
10408 },
10409 {
10410 /* MOD_0F73_REG_6 */
10411 { Bad_Opcode },
10412 { "psllq", { MS, Ib }, 0 },
10413 },
10414 {
10415 /* MOD_0F73_REG_7 */
10416 { Bad_Opcode },
10417 { PREFIX_TABLE (PREFIX_0F73_REG_7) },
10418 },
10419 {
10420 /* MOD_0FAE_REG_0 */
10421 { "fxsave", { FXSAVE }, 0 },
10422 { PREFIX_TABLE (PREFIX_0FAE_REG_0) },
10423 },
10424 {
10425 /* MOD_0FAE_REG_1 */
10426 { "fxrstor", { FXSAVE }, 0 },
10427 { PREFIX_TABLE (PREFIX_0FAE_REG_1) },
10428 },
10429 {
10430 /* MOD_0FAE_REG_2 */
10431 { "ldmxcsr", { Md }, 0 },
10432 { PREFIX_TABLE (PREFIX_0FAE_REG_2) },
10433 },
10434 {
10435 /* MOD_0FAE_REG_3 */
10436 { "stmxcsr", { Md }, 0 },
10437 { PREFIX_TABLE (PREFIX_0FAE_REG_3) },
10438 },
10439 {
10440 /* MOD_0FAE_REG_4 */
10441 { PREFIX_TABLE (PREFIX_MOD_0_0FAE_REG_4) },
10442 { PREFIX_TABLE (PREFIX_MOD_3_0FAE_REG_4) },
10443 },
10444 {
10445 /* MOD_0FAE_REG_5 */
10446 { PREFIX_TABLE (PREFIX_MOD_0_0FAE_REG_5) },
10447 { PREFIX_TABLE (PREFIX_MOD_3_0FAE_REG_5) },
10448 },
10449 {
10450 /* MOD_0FAE_REG_6 */
10451 { PREFIX_TABLE (PREFIX_MOD_0_0FAE_REG_6) },
10452 { PREFIX_TABLE (PREFIX_MOD_1_0FAE_REG_6) },
10453 },
10454 {
10455 /* MOD_0FAE_REG_7 */
10456 { PREFIX_TABLE (PREFIX_0FAE_REG_7) },
10457 { RM_TABLE (RM_0FAE_REG_7) },
10458 },
10459 {
10460 /* MOD_0FB2 */
10461 { "lssS", { Gv, Mp }, 0 },
10462 },
10463 {
10464 /* MOD_0FB4 */
10465 { "lfsS", { Gv, Mp }, 0 },
10466 },
10467 {
10468 /* MOD_0FB5 */
10469 { "lgsS", { Gv, Mp }, 0 },
10470 },
10471 {
10472 /* MOD_0FC3 */
10473 { PREFIX_TABLE (PREFIX_MOD_0_0FC3) },
10474 },
10475 {
10476 /* MOD_0FC7_REG_3 */
10477 { "xrstors", { FXSAVE }, 0 },
10478 },
10479 {
10480 /* MOD_0FC7_REG_4 */
10481 { "xsavec", { FXSAVE }, 0 },
10482 },
10483 {
10484 /* MOD_0FC7_REG_5 */
10485 { "xsaves", { FXSAVE }, 0 },
10486 },
10487 {
10488 /* MOD_0FC7_REG_6 */
10489 { PREFIX_TABLE (PREFIX_MOD_0_0FC7_REG_6) },
10490 { PREFIX_TABLE (PREFIX_MOD_3_0FC7_REG_6) }
10491 },
10492 {
10493 /* MOD_0FC7_REG_7 */
10494 { "vmptrst", { Mq }, 0 },
10495 { PREFIX_TABLE (PREFIX_MOD_3_0FC7_REG_7) }
10496 },
10497 {
10498 /* MOD_0FD7 */
10499 { Bad_Opcode },
10500 { "pmovmskb", { Gdq, MS }, 0 },
10501 },
10502 {
10503 /* MOD_0FE7_PREFIX_2 */
10504 { "movntdq", { Mx, XM }, 0 },
10505 },
10506 {
10507 /* MOD_0FF0_PREFIX_3 */
10508 { "lddqu", { XM, M }, 0 },
10509 },
10510 {
10511 /* MOD_0F382A_PREFIX_2 */
10512 { "movntdqa", { XM, Mx }, 0 },
10513 },
10514 {
10515 /* MOD_0F38F5_PREFIX_2 */
10516 { "wrussK", { M, Gdq }, PREFIX_OPCODE },
10517 },
10518 {
10519 /* MOD_0F38F6_PREFIX_0 */
10520 { "wrssK", { M, Gdq }, PREFIX_OPCODE },
10521 },
10522 {
10523 /* MOD_0F38F8_PREFIX_2 */
10524 { "movdir64b", { Gva, M }, PREFIX_OPCODE },
10525 },
10526 {
10527 /* MOD_0F38F9_PREFIX_0 */
10528 { "movdiri", { Em, Gv }, PREFIX_OPCODE },
10529 },
10530 {
10531 /* MOD_62_32BIT */
10532 { "bound{S|}", { Gv, Ma }, 0 },
10533 { EVEX_TABLE (EVEX_0F) },
10534 },
10535 {
10536 /* MOD_C4_32BIT */
10537 { "lesS", { Gv, Mp }, 0 },
10538 { VEX_C4_TABLE (VEX_0F) },
10539 },
10540 {
10541 /* MOD_C5_32BIT */
10542 { "ldsS", { Gv, Mp }, 0 },
10543 { VEX_C5_TABLE (VEX_0F) },
10544 },
10545 {
10546 /* MOD_VEX_0F12_PREFIX_0 */
10547 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_0) },
10548 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_1) },
10549 },
10550 {
10551 /* MOD_VEX_0F13 */
10552 { VEX_LEN_TABLE (VEX_LEN_0F13_M_0) },
10553 },
10554 {
10555 /* MOD_VEX_0F16_PREFIX_0 */
10556 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_0) },
10557 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_1) },
10558 },
10559 {
10560 /* MOD_VEX_0F17 */
10561 { VEX_LEN_TABLE (VEX_LEN_0F17_M_0) },
10562 },
10563 {
10564 /* MOD_VEX_0F2B */
10565 { "vmovntpX", { Mx, XM }, 0 },
10566 },
10567 {
10568 /* MOD_VEX_W_0_0F41_P_0_LEN_1 */
10569 { Bad_Opcode },
10570 { "kandw", { MaskG, MaskVex, MaskR }, 0 },
10571 },
10572 {
10573 /* MOD_VEX_W_1_0F41_P_0_LEN_1 */
10574 { Bad_Opcode },
10575 { "kandq", { MaskG, MaskVex, MaskR }, 0 },
10576 },
10577 {
10578 /* MOD_VEX_W_0_0F41_P_2_LEN_1 */
10579 { Bad_Opcode },
10580 { "kandb", { MaskG, MaskVex, MaskR }, 0 },
10581 },
10582 {
10583 /* MOD_VEX_W_1_0F41_P_2_LEN_1 */
10584 { Bad_Opcode },
10585 { "kandd", { MaskG, MaskVex, MaskR }, 0 },
10586 },
10587 {
10588 /* MOD_VEX_W_0_0F42_P_0_LEN_1 */
10589 { Bad_Opcode },
10590 { "kandnw", { MaskG, MaskVex, MaskR }, 0 },
10591 },
10592 {
10593 /* MOD_VEX_W_1_0F42_P_0_LEN_1 */
10594 { Bad_Opcode },
10595 { "kandnq", { MaskG, MaskVex, MaskR }, 0 },
10596 },
10597 {
10598 /* MOD_VEX_W_0_0F42_P_2_LEN_1 */
10599 { Bad_Opcode },
10600 { "kandnb", { MaskG, MaskVex, MaskR }, 0 },
10601 },
10602 {
10603 /* MOD_VEX_W_1_0F42_P_2_LEN_1 */
10604 { Bad_Opcode },
10605 { "kandnd", { MaskG, MaskVex, MaskR }, 0 },
10606 },
10607 {
10608 /* MOD_VEX_W_0_0F44_P_0_LEN_0 */
10609 { Bad_Opcode },
10610 { "knotw", { MaskG, MaskR }, 0 },
10611 },
10612 {
10613 /* MOD_VEX_W_1_0F44_P_0_LEN_0 */
10614 { Bad_Opcode },
10615 { "knotq", { MaskG, MaskR }, 0 },
10616 },
10617 {
10618 /* MOD_VEX_W_0_0F44_P_2_LEN_0 */
10619 { Bad_Opcode },
10620 { "knotb", { MaskG, MaskR }, 0 },
10621 },
10622 {
10623 /* MOD_VEX_W_1_0F44_P_2_LEN_0 */
10624 { Bad_Opcode },
10625 { "knotd", { MaskG, MaskR }, 0 },
10626 },
10627 {
10628 /* MOD_VEX_W_0_0F45_P_0_LEN_1 */
10629 { Bad_Opcode },
10630 { "korw", { MaskG, MaskVex, MaskR }, 0 },
10631 },
10632 {
10633 /* MOD_VEX_W_1_0F45_P_0_LEN_1 */
10634 { Bad_Opcode },
10635 { "korq", { MaskG, MaskVex, MaskR }, 0 },
10636 },
10637 {
10638 /* MOD_VEX_W_0_0F45_P_2_LEN_1 */
10639 { Bad_Opcode },
10640 { "korb", { MaskG, MaskVex, MaskR }, 0 },
10641 },
10642 {
10643 /* MOD_VEX_W_1_0F45_P_2_LEN_1 */
10644 { Bad_Opcode },
10645 { "kord", { MaskG, MaskVex, MaskR }, 0 },
10646 },
10647 {
10648 /* MOD_VEX_W_0_0F46_P_0_LEN_1 */
10649 { Bad_Opcode },
10650 { "kxnorw", { MaskG, MaskVex, MaskR }, 0 },
10651 },
10652 {
10653 /* MOD_VEX_W_1_0F46_P_0_LEN_1 */
10654 { Bad_Opcode },
10655 { "kxnorq", { MaskG, MaskVex, MaskR }, 0 },
10656 },
10657 {
10658 /* MOD_VEX_W_0_0F46_P_2_LEN_1 */
10659 { Bad_Opcode },
10660 { "kxnorb", { MaskG, MaskVex, MaskR }, 0 },
10661 },
10662 {
10663 /* MOD_VEX_W_1_0F46_P_2_LEN_1 */
10664 { Bad_Opcode },
10665 { "kxnord", { MaskG, MaskVex, MaskR }, 0 },
10666 },
10667 {
10668 /* MOD_VEX_W_0_0F47_P_0_LEN_1 */
10669 { Bad_Opcode },
10670 { "kxorw", { MaskG, MaskVex, MaskR }, 0 },
10671 },
10672 {
10673 /* MOD_VEX_W_1_0F47_P_0_LEN_1 */
10674 { Bad_Opcode },
10675 { "kxorq", { MaskG, MaskVex, MaskR }, 0 },
10676 },
10677 {
10678 /* MOD_VEX_W_0_0F47_P_2_LEN_1 */
10679 { Bad_Opcode },
10680 { "kxorb", { MaskG, MaskVex, MaskR }, 0 },
10681 },
10682 {
10683 /* MOD_VEX_W_1_0F47_P_2_LEN_1 */
10684 { Bad_Opcode },
10685 { "kxord", { MaskG, MaskVex, MaskR }, 0 },
10686 },
10687 {
10688 /* MOD_VEX_W_0_0F4A_P_0_LEN_1 */
10689 { Bad_Opcode },
10690 { "kaddw", { MaskG, MaskVex, MaskR }, 0 },
10691 },
10692 {
10693 /* MOD_VEX_W_1_0F4A_P_0_LEN_1 */
10694 { Bad_Opcode },
10695 { "kaddq", { MaskG, MaskVex, MaskR }, 0 },
10696 },
10697 {
10698 /* MOD_VEX_W_0_0F4A_P_2_LEN_1 */
10699 { Bad_Opcode },
10700 { "kaddb", { MaskG, MaskVex, MaskR }, 0 },
10701 },
10702 {
10703 /* MOD_VEX_W_1_0F4A_P_2_LEN_1 */
10704 { Bad_Opcode },
10705 { "kaddd", { MaskG, MaskVex, MaskR }, 0 },
10706 },
10707 {
10708 /* MOD_VEX_W_0_0F4B_P_0_LEN_1 */
10709 { Bad_Opcode },
10710 { "kunpckwd", { MaskG, MaskVex, MaskR }, 0 },
10711 },
10712 {
10713 /* MOD_VEX_W_1_0F4B_P_0_LEN_1 */
10714 { Bad_Opcode },
10715 { "kunpckdq", { MaskG, MaskVex, MaskR }, 0 },
10716 },
10717 {
10718 /* MOD_VEX_W_0_0F4B_P_2_LEN_1 */
10719 { Bad_Opcode },
10720 { "kunpckbw", { MaskG, MaskVex, MaskR }, 0 },
10721 },
10722 {
10723 /* MOD_VEX_0F50 */
10724 { Bad_Opcode },
10725 { "vmovmskpX", { Gdq, XS }, 0 },
10726 },
10727 {
10728 /* MOD_VEX_0F71_REG_2 */
10729 { Bad_Opcode },
10730 { PREFIX_TABLE (PREFIX_VEX_0F71_REG_2) },
10731 },
10732 {
10733 /* MOD_VEX_0F71_REG_4 */
10734 { Bad_Opcode },
10735 { PREFIX_TABLE (PREFIX_VEX_0F71_REG_4) },
10736 },
10737 {
10738 /* MOD_VEX_0F71_REG_6 */
10739 { Bad_Opcode },
10740 { PREFIX_TABLE (PREFIX_VEX_0F71_REG_6) },
10741 },
10742 {
10743 /* MOD_VEX_0F72_REG_2 */
10744 { Bad_Opcode },
10745 { PREFIX_TABLE (PREFIX_VEX_0F72_REG_2) },
10746 },
10747 {
10748 /* MOD_VEX_0F72_REG_4 */
10749 { Bad_Opcode },
10750 { PREFIX_TABLE (PREFIX_VEX_0F72_REG_4) },
10751 },
10752 {
10753 /* MOD_VEX_0F72_REG_6 */
10754 { Bad_Opcode },
10755 { PREFIX_TABLE (PREFIX_VEX_0F72_REG_6) },
10756 },
10757 {
10758 /* MOD_VEX_0F73_REG_2 */
10759 { Bad_Opcode },
10760 { PREFIX_TABLE (PREFIX_VEX_0F73_REG_2) },
10761 },
10762 {
10763 /* MOD_VEX_0F73_REG_3 */
10764 { Bad_Opcode },
10765 { PREFIX_TABLE (PREFIX_VEX_0F73_REG_3) },
10766 },
10767 {
10768 /* MOD_VEX_0F73_REG_6 */
10769 { Bad_Opcode },
10770 { PREFIX_TABLE (PREFIX_VEX_0F73_REG_6) },
10771 },
10772 {
10773 /* MOD_VEX_0F73_REG_7 */
10774 { Bad_Opcode },
10775 { PREFIX_TABLE (PREFIX_VEX_0F73_REG_7) },
10776 },
10777 {
10778 /* MOD_VEX_W_0_0F91_P_0_LEN_0 */
10779 { "kmovw", { Ew, MaskG }, 0 },
10780 { Bad_Opcode },
10781 },
10782 {
10783 /* MOD_VEX_W_0_0F91_P_0_LEN_0 */
10784 { "kmovq", { Eq, MaskG }, 0 },
10785 { Bad_Opcode },
10786 },
10787 {
10788 /* MOD_VEX_W_0_0F91_P_2_LEN_0 */
10789 { "kmovb", { Eb, MaskG }, 0 },
10790 { Bad_Opcode },
10791 },
10792 {
10793 /* MOD_VEX_W_0_0F91_P_2_LEN_0 */
10794 { "kmovd", { Ed, MaskG }, 0 },
10795 { Bad_Opcode },
10796 },
10797 {
10798 /* MOD_VEX_W_0_0F92_P_0_LEN_0 */
10799 { Bad_Opcode },
10800 { "kmovw", { MaskG, Rdq }, 0 },
10801 },
10802 {
10803 /* MOD_VEX_W_0_0F92_P_2_LEN_0 */
10804 { Bad_Opcode },
10805 { "kmovb", { MaskG, Rdq }, 0 },
10806 },
10807 {
10808 /* MOD_VEX_0F92_P_3_LEN_0 */
10809 { Bad_Opcode },
10810 { "kmovK", { MaskG, Rdq }, 0 },
10811 },
10812 {
10813 /* MOD_VEX_W_0_0F93_P_0_LEN_0 */
10814 { Bad_Opcode },
10815 { "kmovw", { Gdq, MaskR }, 0 },
10816 },
10817 {
10818 /* MOD_VEX_W_0_0F93_P_2_LEN_0 */
10819 { Bad_Opcode },
10820 { "kmovb", { Gdq, MaskR }, 0 },
10821 },
10822 {
10823 /* MOD_VEX_0F93_P_3_LEN_0 */
10824 { Bad_Opcode },
10825 { "kmovK", { Gdq, MaskR }, 0 },
10826 },
10827 {
10828 /* MOD_VEX_W_0_0F98_P_0_LEN_0 */
10829 { Bad_Opcode },
10830 { "kortestw", { MaskG, MaskR }, 0 },
10831 },
10832 {
10833 /* MOD_VEX_W_1_0F98_P_0_LEN_0 */
10834 { Bad_Opcode },
10835 { "kortestq", { MaskG, MaskR }, 0 },
10836 },
10837 {
10838 /* MOD_VEX_W_0_0F98_P_2_LEN_0 */
10839 { Bad_Opcode },
10840 { "kortestb", { MaskG, MaskR }, 0 },
10841 },
10842 {
10843 /* MOD_VEX_W_1_0F98_P_2_LEN_0 */
10844 { Bad_Opcode },
10845 { "kortestd", { MaskG, MaskR }, 0 },
10846 },
10847 {
10848 /* MOD_VEX_W_0_0F99_P_0_LEN_0 */
10849 { Bad_Opcode },
10850 { "ktestw", { MaskG, MaskR }, 0 },
10851 },
10852 {
10853 /* MOD_VEX_W_1_0F99_P_0_LEN_0 */
10854 { Bad_Opcode },
10855 { "ktestq", { MaskG, MaskR }, 0 },
10856 },
10857 {
10858 /* MOD_VEX_W_0_0F99_P_2_LEN_0 */
10859 { Bad_Opcode },
10860 { "ktestb", { MaskG, MaskR }, 0 },
10861 },
10862 {
10863 /* MOD_VEX_W_1_0F99_P_2_LEN_0 */
10864 { Bad_Opcode },
10865 { "ktestd", { MaskG, MaskR }, 0 },
10866 },
10867 {
10868 /* MOD_VEX_0FAE_REG_2 */
10869 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_2_M_0) },
10870 },
10871 {
10872 /* MOD_VEX_0FAE_REG_3 */
10873 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_3_M_0) },
10874 },
10875 {
10876 /* MOD_VEX_0FD7_PREFIX_2 */
10877 { Bad_Opcode },
10878 { "vpmovmskb", { Gdq, XS }, 0 },
10879 },
10880 {
10881 /* MOD_VEX_0FE7_PREFIX_2 */
10882 { "vmovntdq", { Mx, XM }, 0 },
10883 },
10884 {
10885 /* MOD_VEX_0FF0_PREFIX_3 */
10886 { "vlddqu", { XM, M }, 0 },
10887 },
10888 {
10889 /* MOD_VEX_0F381A_PREFIX_2 */
10890 { VEX_LEN_TABLE (VEX_LEN_0F381A_P_2_M_0) },
10891 },
10892 {
10893 /* MOD_VEX_0F382A_PREFIX_2 */
10894 { "vmovntdqa", { XM, Mx }, 0 },
10895 },
10896 {
10897 /* MOD_VEX_0F382C_PREFIX_2 */
10898 { VEX_W_TABLE (VEX_W_0F382C_P_2_M_0) },
10899 },
10900 {
10901 /* MOD_VEX_0F382D_PREFIX_2 */
10902 { VEX_W_TABLE (VEX_W_0F382D_P_2_M_0) },
10903 },
10904 {
10905 /* MOD_VEX_0F382E_PREFIX_2 */
10906 { VEX_W_TABLE (VEX_W_0F382E_P_2_M_0) },
10907 },
10908 {
10909 /* MOD_VEX_0F382F_PREFIX_2 */
10910 { VEX_W_TABLE (VEX_W_0F382F_P_2_M_0) },
10911 },
10912 {
10913 /* MOD_VEX_0F385A_PREFIX_2 */
10914 { VEX_LEN_TABLE (VEX_LEN_0F385A_P_2_M_0) },
10915 },
10916 {
10917 /* MOD_VEX_0F388C_PREFIX_2 */
10918 { "vpmaskmov%LW", { XM, Vex, Mx }, 0 },
10919 },
10920 {
10921 /* MOD_VEX_0F388E_PREFIX_2 */
10922 { "vpmaskmov%LW", { Mx, Vex, XM }, 0 },
10923 },
10924 {
10925 /* MOD_VEX_W_0_0F3A30_P_2_LEN_0 */
10926 { Bad_Opcode },
10927 { "kshiftrb", { MaskG, MaskR, Ib }, 0 },
10928 },
10929 {
10930 /* MOD_VEX_W_1_0F3A30_P_2_LEN_0 */
10931 { Bad_Opcode },
10932 { "kshiftrw", { MaskG, MaskR, Ib }, 0 },
10933 },
10934 {
10935 /* MOD_VEX_W_0_0F3A31_P_2_LEN_0 */
10936 { Bad_Opcode },
10937 { "kshiftrd", { MaskG, MaskR, Ib }, 0 },
10938 },
10939 {
10940 /* MOD_VEX_W_1_0F3A31_P_2_LEN_0 */
10941 { Bad_Opcode },
10942 { "kshiftrq", { MaskG, MaskR, Ib }, 0 },
10943 },
10944 {
10945 /* MOD_VEX_W_0_0F3A32_P_2_LEN_0 */
10946 { Bad_Opcode },
10947 { "kshiftlb", { MaskG, MaskR, Ib }, 0 },
10948 },
10949 {
10950 /* MOD_VEX_W_1_0F3A32_P_2_LEN_0 */
10951 { Bad_Opcode },
10952 { "kshiftlw", { MaskG, MaskR, Ib }, 0 },
10953 },
10954 {
10955 /* MOD_VEX_W_0_0F3A33_P_2_LEN_0 */
10956 { Bad_Opcode },
10957 { "kshiftld", { MaskG, MaskR, Ib }, 0 },
10958 },
10959 {
10960 /* MOD_VEX_W_1_0F3A33_P_2_LEN_0 */
10961 { Bad_Opcode },
10962 { "kshiftlq", { MaskG, MaskR, Ib }, 0 },
10963 },
10964 #define NEED_MOD_TABLE
10965 #include "i386-dis-evex.h"
10966 #undef NEED_MOD_TABLE
10967 };
10968
10969 static const struct dis386 rm_table[][8] = {
10970 {
10971 /* RM_C6_REG_7 */
10972 { "xabort", { Skip_MODRM, Ib }, 0 },
10973 },
10974 {
10975 /* RM_C7_REG_7 */
10976 { "xbeginT", { Skip_MODRM, Jv }, 0 },
10977 },
10978 {
10979 /* RM_0F01_REG_0 */
10980 { "enclv", { Skip_MODRM }, 0 },
10981 { "vmcall", { Skip_MODRM }, 0 },
10982 { "vmlaunch", { Skip_MODRM }, 0 },
10983 { "vmresume", { Skip_MODRM }, 0 },
10984 { "vmxoff", { Skip_MODRM }, 0 },
10985 { "pconfig", { Skip_MODRM }, 0 },
10986 },
10987 {
10988 /* RM_0F01_REG_1 */
10989 { "monitor", { { OP_Monitor, 0 } }, 0 },
10990 { "mwait", { { OP_Mwait, 0 } }, 0 },
10991 { "clac", { Skip_MODRM }, 0 },
10992 { "stac", { Skip_MODRM }, 0 },
10993 { Bad_Opcode },
10994 { Bad_Opcode },
10995 { Bad_Opcode },
10996 { "encls", { Skip_MODRM }, 0 },
10997 },
10998 {
10999 /* RM_0F01_REG_2 */
11000 { "xgetbv", { Skip_MODRM }, 0 },
11001 { "xsetbv", { Skip_MODRM }, 0 },
11002 { Bad_Opcode },
11003 { Bad_Opcode },
11004 { "vmfunc", { Skip_MODRM }, 0 },
11005 { "xend", { Skip_MODRM }, 0 },
11006 { "xtest", { Skip_MODRM }, 0 },
11007 { "enclu", { Skip_MODRM }, 0 },
11008 },
11009 {
11010 /* RM_0F01_REG_3 */
11011 { "vmrun", { Skip_MODRM }, 0 },
11012 { "vmmcall", { Skip_MODRM }, 0 },
11013 { "vmload", { Skip_MODRM }, 0 },
11014 { "vmsave", { Skip_MODRM }, 0 },
11015 { "stgi", { Skip_MODRM }, 0 },
11016 { "clgi", { Skip_MODRM }, 0 },
11017 { "skinit", { Skip_MODRM }, 0 },
11018 { "invlpga", { Skip_MODRM }, 0 },
11019 },
11020 {
11021 /* RM_0F01_REG_5 */
11022 { PREFIX_TABLE (PREFIX_MOD_3_0F01_REG_5_RM_0) },
11023 { Bad_Opcode },
11024 { PREFIX_TABLE (PREFIX_MOD_3_0F01_REG_5_RM_2) },
11025 { Bad_Opcode },
11026 { Bad_Opcode },
11027 { Bad_Opcode },
11028 { "rdpkru", { Skip_MODRM }, 0 },
11029 { "wrpkru", { Skip_MODRM }, 0 },
11030 },
11031 {
11032 /* RM_0F01_REG_7 */
11033 { "swapgs", { Skip_MODRM }, 0 },
11034 { "rdtscp", { Skip_MODRM }, 0 },
11035 { "monitorx", { { OP_Monitor, 0 } }, 0 },
11036 { "mwaitx", { { OP_Mwaitx, 0 } }, 0 },
11037 { "clzero", { Skip_MODRM }, 0 },
11038 },
11039 {
11040 /* RM_0F1E_MOD_3_REG_7 */
11041 { "nopQ", { Ev }, 0 },
11042 { "nopQ", { Ev }, 0 },
11043 { "endbr64", { Skip_MODRM }, PREFIX_OPCODE },
11044 { "endbr32", { Skip_MODRM }, PREFIX_OPCODE },
11045 { "nopQ", { Ev }, 0 },
11046 { "nopQ", { Ev }, 0 },
11047 { "nopQ", { Ev }, 0 },
11048 { "nopQ", { Ev }, 0 },
11049 },
11050 {
11051 /* RM_0FAE_REG_6 */
11052 { "mfence", { Skip_MODRM }, 0 },
11053 },
11054 {
11055 /* RM_0FAE_REG_7 */
11056 { "sfence", { Skip_MODRM }, 0 },
11057
11058 },
11059 };
11060
11061 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
11062
11063 /* We use the high bit to indicate different name for the same
11064 prefix. */
11065 #define REP_PREFIX (0xf3 | 0x100)
11066 #define XACQUIRE_PREFIX (0xf2 | 0x200)
11067 #define XRELEASE_PREFIX (0xf3 | 0x400)
11068 #define BND_PREFIX (0xf2 | 0x400)
11069 #define NOTRACK_PREFIX (0x3e | 0x100)
11070
11071 static int
11072 ckprefix (void)
11073 {
11074 int newrex, i, length;
11075 rex = 0;
11076 rex_ignored = 0;
11077 prefixes = 0;
11078 used_prefixes = 0;
11079 rex_used = 0;
11080 last_lock_prefix = -1;
11081 last_repz_prefix = -1;
11082 last_repnz_prefix = -1;
11083 last_data_prefix = -1;
11084 last_addr_prefix = -1;
11085 last_rex_prefix = -1;
11086 last_seg_prefix = -1;
11087 fwait_prefix = -1;
11088 active_seg_prefix = 0;
11089 for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
11090 all_prefixes[i] = 0;
11091 i = 0;
11092 length = 0;
11093 /* The maximum instruction length is 15bytes. */
11094 while (length < MAX_CODE_LENGTH - 1)
11095 {
11096 FETCH_DATA (the_info, codep + 1);
11097 newrex = 0;
11098 switch (*codep)
11099 {
11100 /* REX prefixes family. */
11101 case 0x40:
11102 case 0x41:
11103 case 0x42:
11104 case 0x43:
11105 case 0x44:
11106 case 0x45:
11107 case 0x46:
11108 case 0x47:
11109 case 0x48:
11110 case 0x49:
11111 case 0x4a:
11112 case 0x4b:
11113 case 0x4c:
11114 case 0x4d:
11115 case 0x4e:
11116 case 0x4f:
11117 if (address_mode == mode_64bit)
11118 newrex = *codep;
11119 else
11120 return 1;
11121 last_rex_prefix = i;
11122 break;
11123 case 0xf3:
11124 prefixes |= PREFIX_REPZ;
11125 last_repz_prefix = i;
11126 break;
11127 case 0xf2:
11128 prefixes |= PREFIX_REPNZ;
11129 last_repnz_prefix = i;
11130 break;
11131 case 0xf0:
11132 prefixes |= PREFIX_LOCK;
11133 last_lock_prefix = i;
11134 break;
11135 case 0x2e:
11136 prefixes |= PREFIX_CS;
11137 last_seg_prefix = i;
11138 active_seg_prefix = PREFIX_CS;
11139 break;
11140 case 0x36:
11141 prefixes |= PREFIX_SS;
11142 last_seg_prefix = i;
11143 active_seg_prefix = PREFIX_SS;
11144 break;
11145 case 0x3e:
11146 prefixes |= PREFIX_DS;
11147 last_seg_prefix = i;
11148 active_seg_prefix = PREFIX_DS;
11149 break;
11150 case 0x26:
11151 prefixes |= PREFIX_ES;
11152 last_seg_prefix = i;
11153 active_seg_prefix = PREFIX_ES;
11154 break;
11155 case 0x64:
11156 prefixes |= PREFIX_FS;
11157 last_seg_prefix = i;
11158 active_seg_prefix = PREFIX_FS;
11159 break;
11160 case 0x65:
11161 prefixes |= PREFIX_GS;
11162 last_seg_prefix = i;
11163 active_seg_prefix = PREFIX_GS;
11164 break;
11165 case 0x66:
11166 prefixes |= PREFIX_DATA;
11167 last_data_prefix = i;
11168 break;
11169 case 0x67:
11170 prefixes |= PREFIX_ADDR;
11171 last_addr_prefix = i;
11172 break;
11173 case FWAIT_OPCODE:
11174 /* fwait is really an instruction. If there are prefixes
11175 before the fwait, they belong to the fwait, *not* to the
11176 following instruction. */
11177 fwait_prefix = i;
11178 if (prefixes || rex)
11179 {
11180 prefixes |= PREFIX_FWAIT;
11181 codep++;
11182 /* This ensures that the previous REX prefixes are noticed
11183 as unused prefixes, as in the return case below. */
11184 rex_used = rex;
11185 return 1;
11186 }
11187 prefixes = PREFIX_FWAIT;
11188 break;
11189 default:
11190 return 1;
11191 }
11192 /* Rex is ignored when followed by another prefix. */
11193 if (rex)
11194 {
11195 rex_used = rex;
11196 return 1;
11197 }
11198 if (*codep != FWAIT_OPCODE)
11199 all_prefixes[i++] = *codep;
11200 rex = newrex;
11201 codep++;
11202 length++;
11203 }
11204 return 0;
11205 }
11206
11207 /* Return the name of the prefix byte PREF, or NULL if PREF is not a
11208 prefix byte. */
11209
11210 static const char *
11211 prefix_name (int pref, int sizeflag)
11212 {
11213 static const char *rexes [16] =
11214 {
11215 "rex", /* 0x40 */
11216 "rex.B", /* 0x41 */
11217 "rex.X", /* 0x42 */
11218 "rex.XB", /* 0x43 */
11219 "rex.R", /* 0x44 */
11220 "rex.RB", /* 0x45 */
11221 "rex.RX", /* 0x46 */
11222 "rex.RXB", /* 0x47 */
11223 "rex.W", /* 0x48 */
11224 "rex.WB", /* 0x49 */
11225 "rex.WX", /* 0x4a */
11226 "rex.WXB", /* 0x4b */
11227 "rex.WR", /* 0x4c */
11228 "rex.WRB", /* 0x4d */
11229 "rex.WRX", /* 0x4e */
11230 "rex.WRXB", /* 0x4f */
11231 };
11232
11233 switch (pref)
11234 {
11235 /* REX prefixes family. */
11236 case 0x40:
11237 case 0x41:
11238 case 0x42:
11239 case 0x43:
11240 case 0x44:
11241 case 0x45:
11242 case 0x46:
11243 case 0x47:
11244 case 0x48:
11245 case 0x49:
11246 case 0x4a:
11247 case 0x4b:
11248 case 0x4c:
11249 case 0x4d:
11250 case 0x4e:
11251 case 0x4f:
11252 return rexes [pref - 0x40];
11253 case 0xf3:
11254 return "repz";
11255 case 0xf2:
11256 return "repnz";
11257 case 0xf0:
11258 return "lock";
11259 case 0x2e:
11260 return "cs";
11261 case 0x36:
11262 return "ss";
11263 case 0x3e:
11264 return "ds";
11265 case 0x26:
11266 return "es";
11267 case 0x64:
11268 return "fs";
11269 case 0x65:
11270 return "gs";
11271 case 0x66:
11272 return (sizeflag & DFLAG) ? "data16" : "data32";
11273 case 0x67:
11274 if (address_mode == mode_64bit)
11275 return (sizeflag & AFLAG) ? "addr32" : "addr64";
11276 else
11277 return (sizeflag & AFLAG) ? "addr16" : "addr32";
11278 case FWAIT_OPCODE:
11279 return "fwait";
11280 case REP_PREFIX:
11281 return "rep";
11282 case XACQUIRE_PREFIX:
11283 return "xacquire";
11284 case XRELEASE_PREFIX:
11285 return "xrelease";
11286 case BND_PREFIX:
11287 return "bnd";
11288 case NOTRACK_PREFIX:
11289 return "notrack";
11290 default:
11291 return NULL;
11292 }
11293 }
11294
11295 static char op_out[MAX_OPERANDS][100];
11296 static int op_ad, op_index[MAX_OPERANDS];
11297 static int two_source_ops;
11298 static bfd_vma op_address[MAX_OPERANDS];
11299 static bfd_vma op_riprel[MAX_OPERANDS];
11300 static bfd_vma start_pc;
11301
11302 /*
11303 * On the 386's of 1988, the maximum length of an instruction is 15 bytes.
11304 * (see topic "Redundant prefixes" in the "Differences from 8086"
11305 * section of the "Virtual 8086 Mode" chapter.)
11306 * 'pc' should be the address of this instruction, it will
11307 * be used to print the target address if this is a relative jump or call
11308 * The function returns the length of this instruction in bytes.
11309 */
11310
11311 static char intel_syntax;
11312 static char intel_mnemonic = !SYSV386_COMPAT;
11313 static char open_char;
11314 static char close_char;
11315 static char separator_char;
11316 static char scale_char;
11317
11318 enum x86_64_isa
11319 {
11320 amd64 = 0,
11321 intel64
11322 };
11323
11324 static enum x86_64_isa isa64;
11325
11326 /* Here for backwards compatibility. When gdb stops using
11327 print_insn_i386_att and print_insn_i386_intel these functions can
11328 disappear, and print_insn_i386 be merged into print_insn. */
11329 int
11330 print_insn_i386_att (bfd_vma pc, disassemble_info *info)
11331 {
11332 intel_syntax = 0;
11333
11334 return print_insn (pc, info);
11335 }
11336
11337 int
11338 print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
11339 {
11340 intel_syntax = 1;
11341
11342 return print_insn (pc, info);
11343 }
11344
11345 int
11346 print_insn_i386 (bfd_vma pc, disassemble_info *info)
11347 {
11348 intel_syntax = -1;
11349
11350 return print_insn (pc, info);
11351 }
11352
11353 void
11354 print_i386_disassembler_options (FILE *stream)
11355 {
11356 fprintf (stream, _("\n\
11357 The following i386/x86-64 specific disassembler options are supported for use\n\
11358 with the -M switch (multiple options should be separated by commas):\n"));
11359
11360 fprintf (stream, _(" x86-64 Disassemble in 64bit mode\n"));
11361 fprintf (stream, _(" i386 Disassemble in 32bit mode\n"));
11362 fprintf (stream, _(" i8086 Disassemble in 16bit mode\n"));
11363 fprintf (stream, _(" att Display instruction in AT&T syntax\n"));
11364 fprintf (stream, _(" intel Display instruction in Intel syntax\n"));
11365 fprintf (stream, _(" att-mnemonic\n"
11366 " Display instruction in AT&T mnemonic\n"));
11367 fprintf (stream, _(" intel-mnemonic\n"
11368 " Display instruction in Intel mnemonic\n"));
11369 fprintf (stream, _(" addr64 Assume 64bit address size\n"));
11370 fprintf (stream, _(" addr32 Assume 32bit address size\n"));
11371 fprintf (stream, _(" addr16 Assume 16bit address size\n"));
11372 fprintf (stream, _(" data32 Assume 32bit data size\n"));
11373 fprintf (stream, _(" data16 Assume 16bit data size\n"));
11374 fprintf (stream, _(" suffix Always display instruction suffix in AT&T syntax\n"));
11375 fprintf (stream, _(" amd64 Display instruction in AMD64 ISA\n"));
11376 fprintf (stream, _(" intel64 Display instruction in Intel64 ISA\n"));
11377 }
11378
11379 /* Bad opcode. */
11380 static const struct dis386 bad_opcode = { "(bad)", { XX }, 0 };
11381
11382 /* Get a pointer to struct dis386 with a valid name. */
11383
11384 static const struct dis386 *
11385 get_valid_dis386 (const struct dis386 *dp, disassemble_info *info)
11386 {
11387 int vindex, vex_table_index;
11388
11389 if (dp->name != NULL)
11390 return dp;
11391
11392 switch (dp->op[0].bytemode)
11393 {
11394 case USE_REG_TABLE:
11395 dp = &reg_table[dp->op[1].bytemode][modrm.reg];
11396 break;
11397
11398 case USE_MOD_TABLE:
11399 vindex = modrm.mod == 0x3 ? 1 : 0;
11400 dp = &mod_table[dp->op[1].bytemode][vindex];
11401 break;
11402
11403 case USE_RM_TABLE:
11404 dp = &rm_table[dp->op[1].bytemode][modrm.rm];
11405 break;
11406
11407 case USE_PREFIX_TABLE:
11408 if (need_vex)
11409 {
11410 /* The prefix in VEX is implicit. */
11411 switch (vex.prefix)
11412 {
11413 case 0:
11414 vindex = 0;
11415 break;
11416 case REPE_PREFIX_OPCODE:
11417 vindex = 1;
11418 break;
11419 case DATA_PREFIX_OPCODE:
11420 vindex = 2;
11421 break;
11422 case REPNE_PREFIX_OPCODE:
11423 vindex = 3;
11424 break;
11425 default:
11426 abort ();
11427 break;
11428 }
11429 }
11430 else
11431 {
11432 int last_prefix = -1;
11433 int prefix = 0;
11434 vindex = 0;
11435 /* We check PREFIX_REPNZ and PREFIX_REPZ before PREFIX_DATA.
11436 When there are multiple PREFIX_REPNZ and PREFIX_REPZ, the
11437 last one wins. */
11438 if ((prefixes & (PREFIX_REPZ | PREFIX_REPNZ)) != 0)
11439 {
11440 if (last_repz_prefix > last_repnz_prefix)
11441 {
11442 vindex = 1;
11443 prefix = PREFIX_REPZ;
11444 last_prefix = last_repz_prefix;
11445 }
11446 else
11447 {
11448 vindex = 3;
11449 prefix = PREFIX_REPNZ;
11450 last_prefix = last_repnz_prefix;
11451 }
11452
11453 /* Check if prefix should be ignored. */
11454 if ((((prefix_table[dp->op[1].bytemode][vindex].prefix_requirement
11455 & PREFIX_IGNORED) >> PREFIX_IGNORED_SHIFT)
11456 & prefix) != 0)
11457 vindex = 0;
11458 }
11459
11460 if (vindex == 0 && (prefixes & PREFIX_DATA) != 0)
11461 {
11462 vindex = 2;
11463 prefix = PREFIX_DATA;
11464 last_prefix = last_data_prefix;
11465 }
11466
11467 if (vindex != 0)
11468 {
11469 used_prefixes |= prefix;
11470 all_prefixes[last_prefix] = 0;
11471 }
11472 }
11473 dp = &prefix_table[dp->op[1].bytemode][vindex];
11474 break;
11475
11476 case USE_X86_64_TABLE:
11477 vindex = address_mode == mode_64bit ? 1 : 0;
11478 dp = &x86_64_table[dp->op[1].bytemode][vindex];
11479 break;
11480
11481 case USE_3BYTE_TABLE:
11482 FETCH_DATA (info, codep + 2);
11483 vindex = *codep++;
11484 dp = &three_byte_table[dp->op[1].bytemode][vindex];
11485 end_codep = codep;
11486 modrm.mod = (*codep >> 6) & 3;
11487 modrm.reg = (*codep >> 3) & 7;
11488 modrm.rm = *codep & 7;
11489 break;
11490
11491 case USE_VEX_LEN_TABLE:
11492 if (!need_vex)
11493 abort ();
11494
11495 switch (vex.length)
11496 {
11497 case 128:
11498 vindex = 0;
11499 break;
11500 case 256:
11501 vindex = 1;
11502 break;
11503 default:
11504 abort ();
11505 break;
11506 }
11507
11508 dp = &vex_len_table[dp->op[1].bytemode][vindex];
11509 break;
11510
11511 case USE_EVEX_LEN_TABLE:
11512 if (!vex.evex)
11513 abort ();
11514
11515 switch (vex.length)
11516 {
11517 case 128:
11518 vindex = 0;
11519 break;
11520 case 256:
11521 vindex = 1;
11522 break;
11523 case 512:
11524 vindex = 2;
11525 break;
11526 default:
11527 abort ();
11528 break;
11529 }
11530
11531 dp = &evex_len_table[dp->op[1].bytemode][vindex];
11532 break;
11533
11534 case USE_XOP_8F_TABLE:
11535 FETCH_DATA (info, codep + 3);
11536 /* All bits in the REX prefix are ignored. */
11537 rex_ignored = rex;
11538 rex = ~(*codep >> 5) & 0x7;
11539
11540 /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm". */
11541 switch ((*codep & 0x1f))
11542 {
11543 default:
11544 dp = &bad_opcode;
11545 return dp;
11546 case 0x8:
11547 vex_table_index = XOP_08;
11548 break;
11549 case 0x9:
11550 vex_table_index = XOP_09;
11551 break;
11552 case 0xa:
11553 vex_table_index = XOP_0A;
11554 break;
11555 }
11556 codep++;
11557 vex.w = *codep & 0x80;
11558 if (vex.w && address_mode == mode_64bit)
11559 rex |= REX_W;
11560
11561 vex.register_specifier = (~(*codep >> 3)) & 0xf;
11562 if (address_mode != mode_64bit)
11563 {
11564 /* In 16/32-bit mode REX_B is silently ignored. */
11565 rex &= ~REX_B;
11566 }
11567
11568 vex.length = (*codep & 0x4) ? 256 : 128;
11569 switch ((*codep & 0x3))
11570 {
11571 case 0:
11572 break;
11573 case 1:
11574 vex.prefix = DATA_PREFIX_OPCODE;
11575 break;
11576 case 2:
11577 vex.prefix = REPE_PREFIX_OPCODE;
11578 break;
11579 case 3:
11580 vex.prefix = REPNE_PREFIX_OPCODE;
11581 break;
11582 }
11583 need_vex = 1;
11584 need_vex_reg = 1;
11585 codep++;
11586 vindex = *codep++;
11587 dp = &xop_table[vex_table_index][vindex];
11588
11589 end_codep = codep;
11590 FETCH_DATA (info, codep + 1);
11591 modrm.mod = (*codep >> 6) & 3;
11592 modrm.reg = (*codep >> 3) & 7;
11593 modrm.rm = *codep & 7;
11594 break;
11595
11596 case USE_VEX_C4_TABLE:
11597 /* VEX prefix. */
11598 FETCH_DATA (info, codep + 3);
11599 /* All bits in the REX prefix are ignored. */
11600 rex_ignored = rex;
11601 rex = ~(*codep >> 5) & 0x7;
11602 switch ((*codep & 0x1f))
11603 {
11604 default:
11605 dp = &bad_opcode;
11606 return dp;
11607 case 0x1:
11608 vex_table_index = VEX_0F;
11609 break;
11610 case 0x2:
11611 vex_table_index = VEX_0F38;
11612 break;
11613 case 0x3:
11614 vex_table_index = VEX_0F3A;
11615 break;
11616 }
11617 codep++;
11618 vex.w = *codep & 0x80;
11619 if (address_mode == mode_64bit)
11620 {
11621 if (vex.w)
11622 rex |= REX_W;
11623 }
11624 else
11625 {
11626 /* For the 3-byte VEX prefix in 32-bit mode, the REX_B bit
11627 is ignored, other REX bits are 0 and the highest bit in
11628 VEX.vvvv is also ignored (but we mustn't clear it here). */
11629 rex = 0;
11630 }
11631 vex.register_specifier = (~(*codep >> 3)) & 0xf;
11632 vex.length = (*codep & 0x4) ? 256 : 128;
11633 switch ((*codep & 0x3))
11634 {
11635 case 0:
11636 break;
11637 case 1:
11638 vex.prefix = DATA_PREFIX_OPCODE;
11639 break;
11640 case 2:
11641 vex.prefix = REPE_PREFIX_OPCODE;
11642 break;
11643 case 3:
11644 vex.prefix = REPNE_PREFIX_OPCODE;
11645 break;
11646 }
11647 need_vex = 1;
11648 need_vex_reg = 1;
11649 codep++;
11650 vindex = *codep++;
11651 dp = &vex_table[vex_table_index][vindex];
11652 end_codep = codep;
11653 /* There is no MODRM byte for VEX0F 77. */
11654 if (vex_table_index != VEX_0F || vindex != 0x77)
11655 {
11656 FETCH_DATA (info, codep + 1);
11657 modrm.mod = (*codep >> 6) & 3;
11658 modrm.reg = (*codep >> 3) & 7;
11659 modrm.rm = *codep & 7;
11660 }
11661 break;
11662
11663 case USE_VEX_C5_TABLE:
11664 /* VEX prefix. */
11665 FETCH_DATA (info, codep + 2);
11666 /* All bits in the REX prefix are ignored. */
11667 rex_ignored = rex;
11668 rex = (*codep & 0x80) ? 0 : REX_R;
11669
11670 /* For the 2-byte VEX prefix in 32-bit mode, the highest bit in
11671 VEX.vvvv is 1. */
11672 vex.register_specifier = (~(*codep >> 3)) & 0xf;
11673 vex.length = (*codep & 0x4) ? 256 : 128;
11674 switch ((*codep & 0x3))
11675 {
11676 case 0:
11677 break;
11678 case 1:
11679 vex.prefix = DATA_PREFIX_OPCODE;
11680 break;
11681 case 2:
11682 vex.prefix = REPE_PREFIX_OPCODE;
11683 break;
11684 case 3:
11685 vex.prefix = REPNE_PREFIX_OPCODE;
11686 break;
11687 }
11688 need_vex = 1;
11689 need_vex_reg = 1;
11690 codep++;
11691 vindex = *codep++;
11692 dp = &vex_table[dp->op[1].bytemode][vindex];
11693 end_codep = codep;
11694 /* There is no MODRM byte for VEX 77. */
11695 if (vindex != 0x77)
11696 {
11697 FETCH_DATA (info, codep + 1);
11698 modrm.mod = (*codep >> 6) & 3;
11699 modrm.reg = (*codep >> 3) & 7;
11700 modrm.rm = *codep & 7;
11701 }
11702 break;
11703
11704 case USE_VEX_W_TABLE:
11705 if (!need_vex)
11706 abort ();
11707
11708 dp = &vex_w_table[dp->op[1].bytemode][vex.w ? 1 : 0];
11709 break;
11710
11711 case USE_EVEX_TABLE:
11712 two_source_ops = 0;
11713 /* EVEX prefix. */
11714 vex.evex = 1;
11715 FETCH_DATA (info, codep + 4);
11716 /* All bits in the REX prefix are ignored. */
11717 rex_ignored = rex;
11718 /* The first byte after 0x62. */
11719 rex = ~(*codep >> 5) & 0x7;
11720 vex.r = *codep & 0x10;
11721 switch ((*codep & 0xf))
11722 {
11723 default:
11724 return &bad_opcode;
11725 case 0x1:
11726 vex_table_index = EVEX_0F;
11727 break;
11728 case 0x2:
11729 vex_table_index = EVEX_0F38;
11730 break;
11731 case 0x3:
11732 vex_table_index = EVEX_0F3A;
11733 break;
11734 }
11735
11736 /* The second byte after 0x62. */
11737 codep++;
11738 vex.w = *codep & 0x80;
11739 if (vex.w && address_mode == mode_64bit)
11740 rex |= REX_W;
11741
11742 vex.register_specifier = (~(*codep >> 3)) & 0xf;
11743
11744 /* The U bit. */
11745 if (!(*codep & 0x4))
11746 return &bad_opcode;
11747
11748 switch ((*codep & 0x3))
11749 {
11750 case 0:
11751 break;
11752 case 1:
11753 vex.prefix = DATA_PREFIX_OPCODE;
11754 break;
11755 case 2:
11756 vex.prefix = REPE_PREFIX_OPCODE;
11757 break;
11758 case 3:
11759 vex.prefix = REPNE_PREFIX_OPCODE;
11760 break;
11761 }
11762
11763 /* The third byte after 0x62. */
11764 codep++;
11765
11766 /* Remember the static rounding bits. */
11767 vex.ll = (*codep >> 5) & 3;
11768 vex.b = (*codep & 0x10) != 0;
11769
11770 vex.v = *codep & 0x8;
11771 vex.mask_register_specifier = *codep & 0x7;
11772 vex.zeroing = *codep & 0x80;
11773
11774 if (address_mode != mode_64bit)
11775 {
11776 /* In 16/32-bit mode silently ignore following bits. */
11777 rex &= ~REX_B;
11778 vex.r = 1;
11779 vex.v = 1;
11780 }
11781
11782 need_vex = 1;
11783 need_vex_reg = 1;
11784 codep++;
11785 vindex = *codep++;
11786 dp = &evex_table[vex_table_index][vindex];
11787 end_codep = codep;
11788 FETCH_DATA (info, codep + 1);
11789 modrm.mod = (*codep >> 6) & 3;
11790 modrm.reg = (*codep >> 3) & 7;
11791 modrm.rm = *codep & 7;
11792
11793 /* Set vector length. */
11794 if (modrm.mod == 3 && vex.b)
11795 vex.length = 512;
11796 else
11797 {
11798 switch (vex.ll)
11799 {
11800 case 0x0:
11801 vex.length = 128;
11802 break;
11803 case 0x1:
11804 vex.length = 256;
11805 break;
11806 case 0x2:
11807 vex.length = 512;
11808 break;
11809 default:
11810 return &bad_opcode;
11811 }
11812 }
11813 break;
11814
11815 case 0:
11816 dp = &bad_opcode;
11817 break;
11818
11819 default:
11820 abort ();
11821 }
11822
11823 if (dp->name != NULL)
11824 return dp;
11825 else
11826 return get_valid_dis386 (dp, info);
11827 }
11828
11829 static void
11830 get_sib (disassemble_info *info, int sizeflag)
11831 {
11832 /* If modrm.mod == 3, operand must be register. */
11833 if (need_modrm
11834 && ((sizeflag & AFLAG) || address_mode == mode_64bit)
11835 && modrm.mod != 3
11836 && modrm.rm == 4)
11837 {
11838 FETCH_DATA (info, codep + 2);
11839 sib.index = (codep [1] >> 3) & 7;
11840 sib.scale = (codep [1] >> 6) & 3;
11841 sib.base = codep [1] & 7;
11842 }
11843 }
11844
11845 static int
11846 print_insn (bfd_vma pc, disassemble_info *info)
11847 {
11848 const struct dis386 *dp;
11849 int i;
11850 char *op_txt[MAX_OPERANDS];
11851 int needcomma;
11852 int sizeflag, orig_sizeflag;
11853 const char *p;
11854 struct dis_private priv;
11855 int prefix_length;
11856
11857 priv.orig_sizeflag = AFLAG | DFLAG;
11858 if ((info->mach & bfd_mach_i386_i386) != 0)
11859 address_mode = mode_32bit;
11860 else if (info->mach == bfd_mach_i386_i8086)
11861 {
11862 address_mode = mode_16bit;
11863 priv.orig_sizeflag = 0;
11864 }
11865 else
11866 address_mode = mode_64bit;
11867
11868 if (intel_syntax == (char) -1)
11869 intel_syntax = (info->mach & bfd_mach_i386_intel_syntax) != 0;
11870
11871 for (p = info->disassembler_options; p != NULL; )
11872 {
11873 if (CONST_STRNEQ (p, "amd64"))
11874 isa64 = amd64;
11875 else if (CONST_STRNEQ (p, "intel64"))
11876 isa64 = intel64;
11877 else if (CONST_STRNEQ (p, "x86-64"))
11878 {
11879 address_mode = mode_64bit;
11880 priv.orig_sizeflag = AFLAG | DFLAG;
11881 }
11882 else if (CONST_STRNEQ (p, "i386"))
11883 {
11884 address_mode = mode_32bit;
11885 priv.orig_sizeflag = AFLAG | DFLAG;
11886 }
11887 else if (CONST_STRNEQ (p, "i8086"))
11888 {
11889 address_mode = mode_16bit;
11890 priv.orig_sizeflag = 0;
11891 }
11892 else if (CONST_STRNEQ (p, "intel"))
11893 {
11894 intel_syntax = 1;
11895 if (CONST_STRNEQ (p + 5, "-mnemonic"))
11896 intel_mnemonic = 1;
11897 }
11898 else if (CONST_STRNEQ (p, "att"))
11899 {
11900 intel_syntax = 0;
11901 if (CONST_STRNEQ (p + 3, "-mnemonic"))
11902 intel_mnemonic = 0;
11903 }
11904 else if (CONST_STRNEQ (p, "addr"))
11905 {
11906 if (address_mode == mode_64bit)
11907 {
11908 if (p[4] == '3' && p[5] == '2')
11909 priv.orig_sizeflag &= ~AFLAG;
11910 else if (p[4] == '6' && p[5] == '4')
11911 priv.orig_sizeflag |= AFLAG;
11912 }
11913 else
11914 {
11915 if (p[4] == '1' && p[5] == '6')
11916 priv.orig_sizeflag &= ~AFLAG;
11917 else if (p[4] == '3' && p[5] == '2')
11918 priv.orig_sizeflag |= AFLAG;
11919 }
11920 }
11921 else if (CONST_STRNEQ (p, "data"))
11922 {
11923 if (p[4] == '1' && p[5] == '6')
11924 priv.orig_sizeflag &= ~DFLAG;
11925 else if (p[4] == '3' && p[5] == '2')
11926 priv.orig_sizeflag |= DFLAG;
11927 }
11928 else if (CONST_STRNEQ (p, "suffix"))
11929 priv.orig_sizeflag |= SUFFIX_ALWAYS;
11930
11931 p = strchr (p, ',');
11932 if (p != NULL)
11933 p++;
11934 }
11935
11936 if (address_mode == mode_64bit && sizeof (bfd_vma) < 8)
11937 {
11938 (*info->fprintf_func) (info->stream,
11939 _("64-bit address is disabled"));
11940 return -1;
11941 }
11942
11943 if (intel_syntax)
11944 {
11945 names64 = intel_names64;
11946 names32 = intel_names32;
11947 names16 = intel_names16;
11948 names8 = intel_names8;
11949 names8rex = intel_names8rex;
11950 names_seg = intel_names_seg;
11951 names_mm = intel_names_mm;
11952 names_bnd = intel_names_bnd;
11953 names_xmm = intel_names_xmm;
11954 names_ymm = intel_names_ymm;
11955 names_zmm = intel_names_zmm;
11956 index64 = intel_index64;
11957 index32 = intel_index32;
11958 names_mask = intel_names_mask;
11959 index16 = intel_index16;
11960 open_char = '[';
11961 close_char = ']';
11962 separator_char = '+';
11963 scale_char = '*';
11964 }
11965 else
11966 {
11967 names64 = att_names64;
11968 names32 = att_names32;
11969 names16 = att_names16;
11970 names8 = att_names8;
11971 names8rex = att_names8rex;
11972 names_seg = att_names_seg;
11973 names_mm = att_names_mm;
11974 names_bnd = att_names_bnd;
11975 names_xmm = att_names_xmm;
11976 names_ymm = att_names_ymm;
11977 names_zmm = att_names_zmm;
11978 index64 = att_index64;
11979 index32 = att_index32;
11980 names_mask = att_names_mask;
11981 index16 = att_index16;
11982 open_char = '(';
11983 close_char = ')';
11984 separator_char = ',';
11985 scale_char = ',';
11986 }
11987
11988 /* The output looks better if we put 7 bytes on a line, since that
11989 puts most long word instructions on a single line. Use 8 bytes
11990 for Intel L1OM. */
11991 if ((info->mach & bfd_mach_l1om) != 0)
11992 info->bytes_per_line = 8;
11993 else
11994 info->bytes_per_line = 7;
11995
11996 info->private_data = &priv;
11997 priv.max_fetched = priv.the_buffer;
11998 priv.insn_start = pc;
11999
12000 obuf[0] = 0;
12001 for (i = 0; i < MAX_OPERANDS; ++i)
12002 {
12003 op_out[i][0] = 0;
12004 op_index[i] = -1;
12005 }
12006
12007 the_info = info;
12008 start_pc = pc;
12009 start_codep = priv.the_buffer;
12010 codep = priv.the_buffer;
12011
12012 if (OPCODES_SIGSETJMP (priv.bailout) != 0)
12013 {
12014 const char *name;
12015
12016 /* Getting here means we tried for data but didn't get it. That
12017 means we have an incomplete instruction of some sort. Just
12018 print the first byte as a prefix or a .byte pseudo-op. */
12019 if (codep > priv.the_buffer)
12020 {
12021 name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
12022 if (name != NULL)
12023 (*info->fprintf_func) (info->stream, "%s", name);
12024 else
12025 {
12026 /* Just print the first byte as a .byte instruction. */
12027 (*info->fprintf_func) (info->stream, ".byte 0x%x",
12028 (unsigned int) priv.the_buffer[0]);
12029 }
12030
12031 return 1;
12032 }
12033
12034 return -1;
12035 }
12036
12037 obufp = obuf;
12038 sizeflag = priv.orig_sizeflag;
12039
12040 if (!ckprefix () || rex_used)
12041 {
12042 /* Too many prefixes or unused REX prefixes. */
12043 for (i = 0;
12044 i < (int) ARRAY_SIZE (all_prefixes) && all_prefixes[i];
12045 i++)
12046 (*info->fprintf_func) (info->stream, "%s%s",
12047 i == 0 ? "" : " ",
12048 prefix_name (all_prefixes[i], sizeflag));
12049 return i;
12050 }
12051
12052 insn_codep = codep;
12053
12054 FETCH_DATA (info, codep + 1);
12055 two_source_ops = (*codep == 0x62) || (*codep == 0xc8);
12056
12057 if (((prefixes & PREFIX_FWAIT)
12058 && ((*codep < 0xd8) || (*codep > 0xdf))))
12059 {
12060 /* Handle prefixes before fwait. */
12061 for (i = 0; i < fwait_prefix && all_prefixes[i];
12062 i++)
12063 (*info->fprintf_func) (info->stream, "%s ",
12064 prefix_name (all_prefixes[i], sizeflag));
12065 (*info->fprintf_func) (info->stream, "fwait");
12066 return i + 1;
12067 }
12068
12069 if (*codep == 0x0f)
12070 {
12071 unsigned char threebyte;
12072
12073 codep++;
12074 FETCH_DATA (info, codep + 1);
12075 threebyte = *codep;
12076 dp = &dis386_twobyte[threebyte];
12077 need_modrm = twobyte_has_modrm[*codep];
12078 codep++;
12079 }
12080 else
12081 {
12082 dp = &dis386[*codep];
12083 need_modrm = onebyte_has_modrm[*codep];
12084 codep++;
12085 }
12086
12087 /* Save sizeflag for printing the extra prefixes later before updating
12088 it for mnemonic and operand processing. The prefix names depend
12089 only on the address mode. */
12090 orig_sizeflag = sizeflag;
12091 if (prefixes & PREFIX_ADDR)
12092 sizeflag ^= AFLAG;
12093 if ((prefixes & PREFIX_DATA))
12094 sizeflag ^= DFLAG;
12095
12096 end_codep = codep;
12097 if (need_modrm)
12098 {
12099 FETCH_DATA (info, codep + 1);
12100 modrm.mod = (*codep >> 6) & 3;
12101 modrm.reg = (*codep >> 3) & 7;
12102 modrm.rm = *codep & 7;
12103 }
12104
12105 need_vex = 0;
12106 need_vex_reg = 0;
12107 vex_w_done = 0;
12108 memset (&vex, 0, sizeof (vex));
12109
12110 if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
12111 {
12112 get_sib (info, sizeflag);
12113 dofloat (sizeflag);
12114 }
12115 else
12116 {
12117 dp = get_valid_dis386 (dp, info);
12118 if (dp != NULL && putop (dp->name, sizeflag) == 0)
12119 {
12120 get_sib (info, sizeflag);
12121 for (i = 0; i < MAX_OPERANDS; ++i)
12122 {
12123 obufp = op_out[i];
12124 op_ad = MAX_OPERANDS - 1 - i;
12125 if (dp->op[i].rtn)
12126 (*dp->op[i].rtn) (dp->op[i].bytemode, sizeflag);
12127 /* For EVEX instruction after the last operand masking
12128 should be printed. */
12129 if (i == 0 && vex.evex)
12130 {
12131 /* Don't print {%k0}. */
12132 if (vex.mask_register_specifier)
12133 {
12134 oappend ("{");
12135 oappend (names_mask[vex.mask_register_specifier]);
12136 oappend ("}");
12137 }
12138 if (vex.zeroing)
12139 oappend ("{z}");
12140 }
12141 }
12142 }
12143 }
12144
12145 /* Check if the REX prefix is used. */
12146 if (rex_ignored == 0 && (rex ^ rex_used) == 0 && last_rex_prefix >= 0)
12147 all_prefixes[last_rex_prefix] = 0;
12148
12149 /* Check if the SEG prefix is used. */
12150 if ((prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS | PREFIX_ES
12151 | PREFIX_FS | PREFIX_GS)) != 0
12152 && (used_prefixes & active_seg_prefix) != 0)
12153 all_prefixes[last_seg_prefix] = 0;
12154
12155 /* Check if the ADDR prefix is used. */
12156 if ((prefixes & PREFIX_ADDR) != 0
12157 && (used_prefixes & PREFIX_ADDR) != 0)
12158 all_prefixes[last_addr_prefix] = 0;
12159
12160 /* Check if the DATA prefix is used. */
12161 if ((prefixes & PREFIX_DATA) != 0
12162 && (used_prefixes & PREFIX_DATA) != 0)
12163 all_prefixes[last_data_prefix] = 0;
12164
12165 /* Print the extra prefixes. */
12166 prefix_length = 0;
12167 for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
12168 if (all_prefixes[i])
12169 {
12170 const char *name;
12171 name = prefix_name (all_prefixes[i], orig_sizeflag);
12172 if (name == NULL)
12173 abort ();
12174 prefix_length += strlen (name) + 1;
12175 (*info->fprintf_func) (info->stream, "%s ", name);
12176 }
12177
12178 /* If the mandatory PREFIX_REPZ/PREFIX_REPNZ/PREFIX_DATA prefix is
12179 unused, opcode is invalid. Since the PREFIX_DATA prefix may be
12180 used by putop and MMX/SSE operand and may be overriden by the
12181 PREFIX_REPZ/PREFIX_REPNZ fix, we check the PREFIX_DATA prefix
12182 separately. */
12183 if (dp->prefix_requirement == PREFIX_OPCODE
12184 && dp != &bad_opcode
12185 && (((prefixes
12186 & (PREFIX_REPZ | PREFIX_REPNZ)) != 0
12187 && (used_prefixes
12188 & (PREFIX_REPZ | PREFIX_REPNZ)) == 0)
12189 || ((((prefixes
12190 & (PREFIX_REPZ | PREFIX_REPNZ | PREFIX_DATA))
12191 == PREFIX_DATA)
12192 && (used_prefixes & PREFIX_DATA) == 0))))
12193 {
12194 (*info->fprintf_func) (info->stream, "(bad)");
12195 return end_codep - priv.the_buffer;
12196 }
12197
12198 /* Check maximum code length. */
12199 if ((codep - start_codep) > MAX_CODE_LENGTH)
12200 {
12201 (*info->fprintf_func) (info->stream, "(bad)");
12202 return MAX_CODE_LENGTH;
12203 }
12204
12205 obufp = mnemonicendp;
12206 for (i = strlen (obuf) + prefix_length; i < 6; i++)
12207 oappend (" ");
12208 oappend (" ");
12209 (*info->fprintf_func) (info->stream, "%s", obuf);
12210
12211 /* The enter and bound instructions are printed with operands in the same
12212 order as the intel book; everything else is printed in reverse order. */
12213 if (intel_syntax || two_source_ops)
12214 {
12215 bfd_vma riprel;
12216
12217 for (i = 0; i < MAX_OPERANDS; ++i)
12218 op_txt[i] = op_out[i];
12219
12220 if (intel_syntax && dp && dp->op[2].rtn == OP_Rounding
12221 && dp->op[3].rtn == OP_E && dp->op[4].rtn == NULL)
12222 {
12223 op_txt[2] = op_out[3];
12224 op_txt[3] = op_out[2];
12225 }
12226
12227 for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
12228 {
12229 op_ad = op_index[i];
12230 op_index[i] = op_index[MAX_OPERANDS - 1 - i];
12231 op_index[MAX_OPERANDS - 1 - i] = op_ad;
12232 riprel = op_riprel[i];
12233 op_riprel[i] = op_riprel [MAX_OPERANDS - 1 - i];
12234 op_riprel[MAX_OPERANDS - 1 - i] = riprel;
12235 }
12236 }
12237 else
12238 {
12239 for (i = 0; i < MAX_OPERANDS; ++i)
12240 op_txt[MAX_OPERANDS - 1 - i] = op_out[i];
12241 }
12242
12243 needcomma = 0;
12244 for (i = 0; i < MAX_OPERANDS; ++i)
12245 if (*op_txt[i])
12246 {
12247 if (needcomma)
12248 (*info->fprintf_func) (info->stream, ",");
12249 if (op_index[i] != -1 && !op_riprel[i])
12250 (*info->print_address_func) ((bfd_vma) op_address[op_index[i]], info);
12251 else
12252 (*info->fprintf_func) (info->stream, "%s", op_txt[i]);
12253 needcomma = 1;
12254 }
12255
12256 for (i = 0; i < MAX_OPERANDS; i++)
12257 if (op_index[i] != -1 && op_riprel[i])
12258 {
12259 (*info->fprintf_func) (info->stream, " # ");
12260 (*info->print_address_func) ((bfd_vma) (start_pc + (codep - start_codep)
12261 + op_address[op_index[i]]), info);
12262 break;
12263 }
12264 return codep - priv.the_buffer;
12265 }
12266
12267 static const char *float_mem[] = {
12268 /* d8 */
12269 "fadd{s|}",
12270 "fmul{s|}",
12271 "fcom{s|}",
12272 "fcomp{s|}",
12273 "fsub{s|}",
12274 "fsubr{s|}",
12275 "fdiv{s|}",
12276 "fdivr{s|}",
12277 /* d9 */
12278 "fld{s|}",
12279 "(bad)",
12280 "fst{s|}",
12281 "fstp{s|}",
12282 "fldenvIC",
12283 "fldcw",
12284 "fNstenvIC",
12285 "fNstcw",
12286 /* da */
12287 "fiadd{l|}",
12288 "fimul{l|}",
12289 "ficom{l|}",
12290 "ficomp{l|}",
12291 "fisub{l|}",
12292 "fisubr{l|}",
12293 "fidiv{l|}",
12294 "fidivr{l|}",
12295 /* db */
12296 "fild{l|}",
12297 "fisttp{l|}",
12298 "fist{l|}",
12299 "fistp{l|}",
12300 "(bad)",
12301 "fld{t||t|}",
12302 "(bad)",
12303 "fstp{t||t|}",
12304 /* dc */
12305 "fadd{l|}",
12306 "fmul{l|}",
12307 "fcom{l|}",
12308 "fcomp{l|}",
12309 "fsub{l|}",
12310 "fsubr{l|}",
12311 "fdiv{l|}",
12312 "fdivr{l|}",
12313 /* dd */
12314 "fld{l|}",
12315 "fisttp{ll|}",
12316 "fst{l||}",
12317 "fstp{l|}",
12318 "frstorIC",
12319 "(bad)",
12320 "fNsaveIC",
12321 "fNstsw",
12322 /* de */
12323 "fiadd{s|}",
12324 "fimul{s|}",
12325 "ficom{s|}",
12326 "ficomp{s|}",
12327 "fisub{s|}",
12328 "fisubr{s|}",
12329 "fidiv{s|}",
12330 "fidivr{s|}",
12331 /* df */
12332 "fild{s|}",
12333 "fisttp{s|}",
12334 "fist{s|}",
12335 "fistp{s|}",
12336 "fbld",
12337 "fild{ll|}",
12338 "fbstp",
12339 "fistp{ll|}",
12340 };
12341
12342 static const unsigned char float_mem_mode[] = {
12343 /* d8 */
12344 d_mode,
12345 d_mode,
12346 d_mode,
12347 d_mode,
12348 d_mode,
12349 d_mode,
12350 d_mode,
12351 d_mode,
12352 /* d9 */
12353 d_mode,
12354 0,
12355 d_mode,
12356 d_mode,
12357 0,
12358 w_mode,
12359 0,
12360 w_mode,
12361 /* da */
12362 d_mode,
12363 d_mode,
12364 d_mode,
12365 d_mode,
12366 d_mode,
12367 d_mode,
12368 d_mode,
12369 d_mode,
12370 /* db */
12371 d_mode,
12372 d_mode,
12373 d_mode,
12374 d_mode,
12375 0,
12376 t_mode,
12377 0,
12378 t_mode,
12379 /* dc */
12380 q_mode,
12381 q_mode,
12382 q_mode,
12383 q_mode,
12384 q_mode,
12385 q_mode,
12386 q_mode,
12387 q_mode,
12388 /* dd */
12389 q_mode,
12390 q_mode,
12391 q_mode,
12392 q_mode,
12393 0,
12394 0,
12395 0,
12396 w_mode,
12397 /* de */
12398 w_mode,
12399 w_mode,
12400 w_mode,
12401 w_mode,
12402 w_mode,
12403 w_mode,
12404 w_mode,
12405 w_mode,
12406 /* df */
12407 w_mode,
12408 w_mode,
12409 w_mode,
12410 w_mode,
12411 t_mode,
12412 q_mode,
12413 t_mode,
12414 q_mode
12415 };
12416
12417 #define ST { OP_ST, 0 }
12418 #define STi { OP_STi, 0 }
12419
12420 #define FGRPd9_2 NULL, { { NULL, 1 } }, 0
12421 #define FGRPd9_4 NULL, { { NULL, 2 } }, 0
12422 #define FGRPd9_5 NULL, { { NULL, 3 } }, 0
12423 #define FGRPd9_6 NULL, { { NULL, 4 } }, 0
12424 #define FGRPd9_7 NULL, { { NULL, 5 } }, 0
12425 #define FGRPda_5 NULL, { { NULL, 6 } }, 0
12426 #define FGRPdb_4 NULL, { { NULL, 7 } }, 0
12427 #define FGRPde_3 NULL, { { NULL, 8 } }, 0
12428 #define FGRPdf_4 NULL, { { NULL, 9 } }, 0
12429
12430 static const struct dis386 float_reg[][8] = {
12431 /* d8 */
12432 {
12433 { "fadd", { ST, STi }, 0 },
12434 { "fmul", { ST, STi }, 0 },
12435 { "fcom", { STi }, 0 },
12436 { "fcomp", { STi }, 0 },
12437 { "fsub", { ST, STi }, 0 },
12438 { "fsubr", { ST, STi }, 0 },
12439 { "fdiv", { ST, STi }, 0 },
12440 { "fdivr", { ST, STi }, 0 },
12441 },
12442 /* d9 */
12443 {
12444 { "fld", { STi }, 0 },
12445 { "fxch", { STi }, 0 },
12446 { FGRPd9_2 },
12447 { Bad_Opcode },
12448 { FGRPd9_4 },
12449 { FGRPd9_5 },
12450 { FGRPd9_6 },
12451 { FGRPd9_7 },
12452 },
12453 /* da */
12454 {
12455 { "fcmovb", { ST, STi }, 0 },
12456 { "fcmove", { ST, STi }, 0 },
12457 { "fcmovbe",{ ST, STi }, 0 },
12458 { "fcmovu", { ST, STi }, 0 },
12459 { Bad_Opcode },
12460 { FGRPda_5 },
12461 { Bad_Opcode },
12462 { Bad_Opcode },
12463 },
12464 /* db */
12465 {
12466 { "fcmovnb",{ ST, STi }, 0 },
12467 { "fcmovne",{ ST, STi }, 0 },
12468 { "fcmovnbe",{ ST, STi }, 0 },
12469 { "fcmovnu",{ ST, STi }, 0 },
12470 { FGRPdb_4 },
12471 { "fucomi", { ST, STi }, 0 },
12472 { "fcomi", { ST, STi }, 0 },
12473 { Bad_Opcode },
12474 },
12475 /* dc */
12476 {
12477 { "fadd", { STi, ST }, 0 },
12478 { "fmul", { STi, ST }, 0 },
12479 { Bad_Opcode },
12480 { Bad_Opcode },
12481 { "fsub{!M|r}", { STi, ST }, 0 },
12482 { "fsub{M|}", { STi, ST }, 0 },
12483 { "fdiv{!M|r}", { STi, ST }, 0 },
12484 { "fdiv{M|}", { STi, ST }, 0 },
12485 },
12486 /* dd */
12487 {
12488 { "ffree", { STi }, 0 },
12489 { Bad_Opcode },
12490 { "fst", { STi }, 0 },
12491 { "fstp", { STi }, 0 },
12492 { "fucom", { STi }, 0 },
12493 { "fucomp", { STi }, 0 },
12494 { Bad_Opcode },
12495 { Bad_Opcode },
12496 },
12497 /* de */
12498 {
12499 { "faddp", { STi, ST }, 0 },
12500 { "fmulp", { STi, ST }, 0 },
12501 { Bad_Opcode },
12502 { FGRPde_3 },
12503 { "fsub{!M|r}p", { STi, ST }, 0 },
12504 { "fsub{M|}p", { STi, ST }, 0 },
12505 { "fdiv{!M|r}p", { STi, ST }, 0 },
12506 { "fdiv{M|}p", { STi, ST }, 0 },
12507 },
12508 /* df */
12509 {
12510 { "ffreep", { STi }, 0 },
12511 { Bad_Opcode },
12512 { Bad_Opcode },
12513 { Bad_Opcode },
12514 { FGRPdf_4 },
12515 { "fucomip", { ST, STi }, 0 },
12516 { "fcomip", { ST, STi }, 0 },
12517 { Bad_Opcode },
12518 },
12519 };
12520
12521 static char *fgrps[][8] = {
12522 /* Bad opcode 0 */
12523 {
12524 "(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
12525 },
12526
12527 /* d9_2 1 */
12528 {
12529 "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
12530 },
12531
12532 /* d9_4 2 */
12533 {
12534 "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
12535 },
12536
12537 /* d9_5 3 */
12538 {
12539 "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
12540 },
12541
12542 /* d9_6 4 */
12543 {
12544 "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
12545 },
12546
12547 /* d9_7 5 */
12548 {
12549 "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
12550 },
12551
12552 /* da_5 6 */
12553 {
12554 "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
12555 },
12556
12557 /* db_4 7 */
12558 {
12559 "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
12560 "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
12561 },
12562
12563 /* de_3 8 */
12564 {
12565 "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
12566 },
12567
12568 /* df_4 9 */
12569 {
12570 "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
12571 },
12572 };
12573
12574 static void
12575 swap_operand (void)
12576 {
12577 mnemonicendp[0] = '.';
12578 mnemonicendp[1] = 's';
12579 mnemonicendp += 2;
12580 }
12581
12582 static void
12583 OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED,
12584 int sizeflag ATTRIBUTE_UNUSED)
12585 {
12586 /* Skip mod/rm byte. */
12587 MODRM_CHECK;
12588 codep++;
12589 }
12590
12591 static void
12592 dofloat (int sizeflag)
12593 {
12594 const struct dis386 *dp;
12595 unsigned char floatop;
12596
12597 floatop = codep[-1];
12598
12599 if (modrm.mod != 3)
12600 {
12601 int fp_indx = (floatop - 0xd8) * 8 + modrm.reg;
12602
12603 putop (float_mem[fp_indx], sizeflag);
12604 obufp = op_out[0];
12605 op_ad = 2;
12606 OP_E (float_mem_mode[fp_indx], sizeflag);
12607 return;
12608 }
12609 /* Skip mod/rm byte. */
12610 MODRM_CHECK;
12611 codep++;
12612
12613 dp = &float_reg[floatop - 0xd8][modrm.reg];
12614 if (dp->name == NULL)
12615 {
12616 putop (fgrps[dp->op[0].bytemode][modrm.rm], sizeflag);
12617
12618 /* Instruction fnstsw is only one with strange arg. */
12619 if (floatop == 0xdf && codep[-1] == 0xe0)
12620 strcpy (op_out[0], names16[0]);
12621 }
12622 else
12623 {
12624 putop (dp->name, sizeflag);
12625
12626 obufp = op_out[0];
12627 op_ad = 2;
12628 if (dp->op[0].rtn)
12629 (*dp->op[0].rtn) (dp->op[0].bytemode, sizeflag);
12630
12631 obufp = op_out[1];
12632 op_ad = 1;
12633 if (dp->op[1].rtn)
12634 (*dp->op[1].rtn) (dp->op[1].bytemode, sizeflag);
12635 }
12636 }
12637
12638 /* Like oappend (below), but S is a string starting with '%'.
12639 In Intel syntax, the '%' is elided. */
12640 static void
12641 oappend_maybe_intel (const char *s)
12642 {
12643 oappend (s + intel_syntax);
12644 }
12645
12646 static void
12647 OP_ST (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12648 {
12649 oappend_maybe_intel ("%st");
12650 }
12651
12652 static void
12653 OP_STi (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12654 {
12655 sprintf (scratchbuf, "%%st(%d)", modrm.rm);
12656 oappend_maybe_intel (scratchbuf);
12657 }
12658
12659 /* Capital letters in template are macros. */
12660 static int
12661 putop (const char *in_template, int sizeflag)
12662 {
12663 const char *p;
12664 int alt = 0;
12665 int cond = 1;
12666 unsigned int l = 0, len = 1;
12667 char last[4];
12668
12669 #define SAVE_LAST(c) \
12670 if (l < len && l < sizeof (last)) \
12671 last[l++] = c; \
12672 else \
12673 abort ();
12674
12675 for (p = in_template; *p; p++)
12676 {
12677 switch (*p)
12678 {
12679 default:
12680 *obufp++ = *p;
12681 break;
12682 case '%':
12683 len++;
12684 break;
12685 case '!':
12686 cond = 0;
12687 break;
12688 case '{':
12689 if (intel_syntax)
12690 {
12691 while (*++p != '|')
12692 if (*p == '}' || *p == '\0')
12693 abort ();
12694 }
12695 /* Fall through. */
12696 case 'I':
12697 alt = 1;
12698 continue;
12699 case '|':
12700 while (*++p != '}')
12701 {
12702 if (*p == '\0')
12703 abort ();
12704 }
12705 break;
12706 case '}':
12707 break;
12708 case 'A':
12709 if (intel_syntax)
12710 break;
12711 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
12712 *obufp++ = 'b';
12713 break;
12714 case 'B':
12715 if (l == 0 && len == 1)
12716 {
12717 case_B:
12718 if (intel_syntax)
12719 break;
12720 if (sizeflag & SUFFIX_ALWAYS)
12721 *obufp++ = 'b';
12722 }
12723 else
12724 {
12725 if (l != 1
12726 || len != 2
12727 || last[0] != 'L')
12728 {
12729 SAVE_LAST (*p);
12730 break;
12731 }
12732
12733 if (address_mode == mode_64bit
12734 && !(prefixes & PREFIX_ADDR))
12735 {
12736 *obufp++ = 'a';
12737 *obufp++ = 'b';
12738 *obufp++ = 's';
12739 }
12740
12741 goto case_B;
12742 }
12743 break;
12744 case 'C':
12745 if (intel_syntax && !alt)
12746 break;
12747 if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
12748 {
12749 if (sizeflag & DFLAG)
12750 *obufp++ = intel_syntax ? 'd' : 'l';
12751 else
12752 *obufp++ = intel_syntax ? 'w' : 's';
12753 used_prefixes |= (prefixes & PREFIX_DATA);
12754 }
12755 break;
12756 case 'D':
12757 if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
12758 break;
12759 USED_REX (REX_W);
12760 if (modrm.mod == 3)
12761 {
12762 if (rex & REX_W)
12763 *obufp++ = 'q';
12764 else
12765 {
12766 if (sizeflag & DFLAG)
12767 *obufp++ = intel_syntax ? 'd' : 'l';
12768 else
12769 *obufp++ = 'w';
12770 used_prefixes |= (prefixes & PREFIX_DATA);
12771 }
12772 }
12773 else
12774 *obufp++ = 'w';
12775 break;
12776 case 'E': /* For jcxz/jecxz */
12777 if (address_mode == mode_64bit)
12778 {
12779 if (sizeflag & AFLAG)
12780 *obufp++ = 'r';
12781 else
12782 *obufp++ = 'e';
12783 }
12784 else
12785 if (sizeflag & AFLAG)
12786 *obufp++ = 'e';
12787 used_prefixes |= (prefixes & PREFIX_ADDR);
12788 break;
12789 case 'F':
12790 if (intel_syntax)
12791 break;
12792 if ((prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
12793 {
12794 if (sizeflag & AFLAG)
12795 *obufp++ = address_mode == mode_64bit ? 'q' : 'l';
12796 else
12797 *obufp++ = address_mode == mode_64bit ? 'l' : 'w';
12798 used_prefixes |= (prefixes & PREFIX_ADDR);
12799 }
12800 break;
12801 case 'G':
12802 if (intel_syntax || (obufp[-1] != 's' && !(sizeflag & SUFFIX_ALWAYS)))
12803 break;
12804 if ((rex & REX_W) || (sizeflag & DFLAG))
12805 *obufp++ = 'l';
12806 else
12807 *obufp++ = 'w';
12808 if (!(rex & REX_W))
12809 used_prefixes |= (prefixes & PREFIX_DATA);
12810 break;
12811 case 'H':
12812 if (intel_syntax)
12813 break;
12814 if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
12815 || (prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
12816 {
12817 used_prefixes |= prefixes & (PREFIX_CS | PREFIX_DS);
12818 *obufp++ = ',';
12819 *obufp++ = 'p';
12820 if (prefixes & PREFIX_DS)
12821 *obufp++ = 't';
12822 else
12823 *obufp++ = 'n';
12824 }
12825 break;
12826 case 'J':
12827 if (intel_syntax)
12828 break;
12829 *obufp++ = 'l';
12830 break;
12831 case 'K':
12832 USED_REX (REX_W);
12833 if (rex & REX_W)
12834 *obufp++ = 'q';
12835 else
12836 *obufp++ = 'd';
12837 break;
12838 case 'Z':
12839 if (l != 0 || len != 1)
12840 {
12841 if (l != 1 || len != 2 || last[0] != 'X')
12842 {
12843 SAVE_LAST (*p);
12844 break;
12845 }
12846 if (!need_vex || !vex.evex)
12847 abort ();
12848 if (intel_syntax
12849 || ((modrm.mod == 3 || vex.b) && !(sizeflag & SUFFIX_ALWAYS)))
12850 break;
12851 switch (vex.length)
12852 {
12853 case 128:
12854 *obufp++ = 'x';
12855 break;
12856 case 256:
12857 *obufp++ = 'y';
12858 break;
12859 case 512:
12860 *obufp++ = 'z';
12861 break;
12862 default:
12863 abort ();
12864 }
12865 break;
12866 }
12867 if (intel_syntax)
12868 break;
12869 if (address_mode == mode_64bit && (sizeflag & SUFFIX_ALWAYS))
12870 {
12871 *obufp++ = 'q';
12872 break;
12873 }
12874 /* Fall through. */
12875 goto case_L;
12876 case 'L':
12877 if (l != 0 || len != 1)
12878 {
12879 SAVE_LAST (*p);
12880 break;
12881 }
12882 case_L:
12883 if (intel_syntax)
12884 break;
12885 if (sizeflag & SUFFIX_ALWAYS)
12886 *obufp++ = 'l';
12887 break;
12888 case 'M':
12889 if (intel_mnemonic != cond)
12890 *obufp++ = 'r';
12891 break;
12892 case 'N':
12893 if ((prefixes & PREFIX_FWAIT) == 0)
12894 *obufp++ = 'n';
12895 else
12896 used_prefixes |= PREFIX_FWAIT;
12897 break;
12898 case 'O':
12899 USED_REX (REX_W);
12900 if (rex & REX_W)
12901 *obufp++ = 'o';
12902 else if (intel_syntax && (sizeflag & DFLAG))
12903 *obufp++ = 'q';
12904 else
12905 *obufp++ = 'd';
12906 if (!(rex & REX_W))
12907 used_prefixes |= (prefixes & PREFIX_DATA);
12908 break;
12909 case '&':
12910 if (!intel_syntax
12911 && address_mode == mode_64bit
12912 && isa64 == intel64)
12913 {
12914 *obufp++ = 'q';
12915 break;
12916 }
12917 /* Fall through. */
12918 case 'T':
12919 if (!intel_syntax
12920 && address_mode == mode_64bit
12921 && ((sizeflag & DFLAG) || (rex & REX_W)))
12922 {
12923 *obufp++ = 'q';
12924 break;
12925 }
12926 /* Fall through. */
12927 goto case_P;
12928 case 'P':
12929 if (l == 0 && len == 1)
12930 {
12931 case_P:
12932 if (intel_syntax)
12933 {
12934 if ((rex & REX_W) == 0
12935 && (prefixes & PREFIX_DATA))
12936 {
12937 if ((sizeflag & DFLAG) == 0)
12938 *obufp++ = 'w';
12939 used_prefixes |= (prefixes & PREFIX_DATA);
12940 }
12941 break;
12942 }
12943 if ((prefixes & PREFIX_DATA)
12944 || (rex & REX_W)
12945 || (sizeflag & SUFFIX_ALWAYS))
12946 {
12947 USED_REX (REX_W);
12948 if (rex & REX_W)
12949 *obufp++ = 'q';
12950 else
12951 {
12952 if (sizeflag & DFLAG)
12953 *obufp++ = 'l';
12954 else
12955 *obufp++ = 'w';
12956 used_prefixes |= (prefixes & PREFIX_DATA);
12957 }
12958 }
12959 }
12960 else
12961 {
12962 if (l != 1 || len != 2 || last[0] != 'L')
12963 {
12964 SAVE_LAST (*p);
12965 break;
12966 }
12967
12968 if ((prefixes & PREFIX_DATA)
12969 || (rex & REX_W)
12970 || (sizeflag & SUFFIX_ALWAYS))
12971 {
12972 USED_REX (REX_W);
12973 if (rex & REX_W)
12974 *obufp++ = 'q';
12975 else
12976 {
12977 if (sizeflag & DFLAG)
12978 *obufp++ = intel_syntax ? 'd' : 'l';
12979 else
12980 *obufp++ = 'w';
12981 used_prefixes |= (prefixes & PREFIX_DATA);
12982 }
12983 }
12984 }
12985 break;
12986 case 'U':
12987 if (intel_syntax)
12988 break;
12989 if (address_mode == mode_64bit
12990 && ((sizeflag & DFLAG) || (rex & REX_W)))
12991 {
12992 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
12993 *obufp++ = 'q';
12994 break;
12995 }
12996 /* Fall through. */
12997 goto case_Q;
12998 case 'Q':
12999 if (l == 0 && len == 1)
13000 {
13001 case_Q:
13002 if (intel_syntax && !alt)
13003 break;
13004 USED_REX (REX_W);
13005 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
13006 {
13007 if (rex & REX_W)
13008 *obufp++ = 'q';
13009 else
13010 {
13011 if (sizeflag & DFLAG)
13012 *obufp++ = intel_syntax ? 'd' : 'l';
13013 else
13014 *obufp++ = 'w';
13015 used_prefixes |= (prefixes & PREFIX_DATA);
13016 }
13017 }
13018 }
13019 else
13020 {
13021 if (l != 1 || len != 2 || last[0] != 'L')
13022 {
13023 SAVE_LAST (*p);
13024 break;
13025 }
13026 if (intel_syntax
13027 || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
13028 break;
13029 if ((rex & REX_W))
13030 {
13031 USED_REX (REX_W);
13032 *obufp++ = 'q';
13033 }
13034 else
13035 *obufp++ = 'l';
13036 }
13037 break;
13038 case 'R':
13039 USED_REX (REX_W);
13040 if (rex & REX_W)
13041 *obufp++ = 'q';
13042 else if (sizeflag & DFLAG)
13043 {
13044 if (intel_syntax)
13045 *obufp++ = 'd';
13046 else
13047 *obufp++ = 'l';
13048 }
13049 else
13050 *obufp++ = 'w';
13051 if (intel_syntax && !p[1]
13052 && ((rex & REX_W) || (sizeflag & DFLAG)))
13053 *obufp++ = 'e';
13054 if (!(rex & REX_W))
13055 used_prefixes |= (prefixes & PREFIX_DATA);
13056 break;
13057 case 'V':
13058 if (l == 0 && len == 1)
13059 {
13060 if (intel_syntax)
13061 break;
13062 if (address_mode == mode_64bit
13063 && ((sizeflag & DFLAG) || (rex & REX_W)))
13064 {
13065 if (sizeflag & SUFFIX_ALWAYS)
13066 *obufp++ = 'q';
13067 break;
13068 }
13069 }
13070 else
13071 {
13072 if (l != 1
13073 || len != 2
13074 || last[0] != 'L')
13075 {
13076 SAVE_LAST (*p);
13077 break;
13078 }
13079
13080 if (rex & REX_W)
13081 {
13082 *obufp++ = 'a';
13083 *obufp++ = 'b';
13084 *obufp++ = 's';
13085 }
13086 }
13087 /* Fall through. */
13088 goto case_S;
13089 case 'S':
13090 if (l == 0 && len == 1)
13091 {
13092 case_S:
13093 if (intel_syntax)
13094 break;
13095 if (sizeflag & SUFFIX_ALWAYS)
13096 {
13097 if (rex & REX_W)
13098 *obufp++ = 'q';
13099 else
13100 {
13101 if (sizeflag & DFLAG)
13102 *obufp++ = 'l';
13103 else
13104 *obufp++ = 'w';
13105 used_prefixes |= (prefixes & PREFIX_DATA);
13106 }
13107 }
13108 }
13109 else
13110 {
13111 if (l != 1
13112 || len != 2
13113 || last[0] != 'L')
13114 {
13115 SAVE_LAST (*p);
13116 break;
13117 }
13118
13119 if (address_mode == mode_64bit
13120 && !(prefixes & PREFIX_ADDR))
13121 {
13122 *obufp++ = 'a';
13123 *obufp++ = 'b';
13124 *obufp++ = 's';
13125 }
13126
13127 goto case_S;
13128 }
13129 break;
13130 case 'X':
13131 if (l != 0 || len != 1)
13132 {
13133 SAVE_LAST (*p);
13134 break;
13135 }
13136 if (need_vex && vex.prefix)
13137 {
13138 if (vex.prefix == DATA_PREFIX_OPCODE)
13139 *obufp++ = 'd';
13140 else
13141 *obufp++ = 's';
13142 }
13143 else
13144 {
13145 if (prefixes & PREFIX_DATA)
13146 *obufp++ = 'd';
13147 else
13148 *obufp++ = 's';
13149 used_prefixes |= (prefixes & PREFIX_DATA);
13150 }
13151 break;
13152 case 'Y':
13153 if (l == 0 && len == 1)
13154 abort ();
13155 else
13156 {
13157 if (l != 1 || len != 2 || last[0] != 'X')
13158 {
13159 SAVE_LAST (*p);
13160 break;
13161 }
13162 if (!need_vex)
13163 abort ();
13164 if (intel_syntax
13165 || ((modrm.mod == 3 || vex.b) && !(sizeflag & SUFFIX_ALWAYS)))
13166 break;
13167 switch (vex.length)
13168 {
13169 case 128:
13170 *obufp++ = 'x';
13171 break;
13172 case 256:
13173 *obufp++ = 'y';
13174 break;
13175 case 512:
13176 if (!vex.evex)
13177 default:
13178 abort ();
13179 }
13180 }
13181 break;
13182 case 'W':
13183 if (l == 0 && len == 1)
13184 {
13185 /* operand size flag for cwtl, cbtw */
13186 USED_REX (REX_W);
13187 if (rex & REX_W)
13188 {
13189 if (intel_syntax)
13190 *obufp++ = 'd';
13191 else
13192 *obufp++ = 'l';
13193 }
13194 else if (sizeflag & DFLAG)
13195 *obufp++ = 'w';
13196 else
13197 *obufp++ = 'b';
13198 if (!(rex & REX_W))
13199 used_prefixes |= (prefixes & PREFIX_DATA);
13200 }
13201 else
13202 {
13203 if (l != 1
13204 || len != 2
13205 || (last[0] != 'X'
13206 && last[0] != 'L'))
13207 {
13208 SAVE_LAST (*p);
13209 break;
13210 }
13211 if (!need_vex)
13212 abort ();
13213 if (last[0] == 'X')
13214 *obufp++ = vex.w ? 'd': 's';
13215 else
13216 *obufp++ = vex.w ? 'q': 'd';
13217 }
13218 break;
13219 case '^':
13220 if (intel_syntax)
13221 break;
13222 if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
13223 {
13224 if (sizeflag & DFLAG)
13225 *obufp++ = 'l';
13226 else
13227 *obufp++ = 'w';
13228 used_prefixes |= (prefixes & PREFIX_DATA);
13229 }
13230 break;
13231 case '@':
13232 if (intel_syntax)
13233 break;
13234 if (address_mode == mode_64bit
13235 && (isa64 == intel64
13236 || ((sizeflag & DFLAG) || (rex & REX_W))))
13237 *obufp++ = 'q';
13238 else if ((prefixes & PREFIX_DATA))
13239 {
13240 if (!(sizeflag & DFLAG))
13241 *obufp++ = 'w';
13242 used_prefixes |= (prefixes & PREFIX_DATA);
13243 }
13244 break;
13245 }
13246 alt = 0;
13247 }
13248 *obufp = 0;
13249 mnemonicendp = obufp;
13250 return 0;
13251 }
13252
13253 static void
13254 oappend (const char *s)
13255 {
13256 obufp = stpcpy (obufp, s);
13257 }
13258
13259 static void
13260 append_seg (void)
13261 {
13262 /* Only print the active segment register. */
13263 if (!active_seg_prefix)
13264 return;
13265
13266 used_prefixes |= active_seg_prefix;
13267 switch (active_seg_prefix)
13268 {
13269 case PREFIX_CS:
13270 oappend_maybe_intel ("%cs:");
13271 break;
13272 case PREFIX_DS:
13273 oappend_maybe_intel ("%ds:");
13274 break;
13275 case PREFIX_SS:
13276 oappend_maybe_intel ("%ss:");
13277 break;
13278 case PREFIX_ES:
13279 oappend_maybe_intel ("%es:");
13280 break;
13281 case PREFIX_FS:
13282 oappend_maybe_intel ("%fs:");
13283 break;
13284 case PREFIX_GS:
13285 oappend_maybe_intel ("%gs:");
13286 break;
13287 default:
13288 break;
13289 }
13290 }
13291
13292 static void
13293 OP_indirE (int bytemode, int sizeflag)
13294 {
13295 if (!intel_syntax)
13296 oappend ("*");
13297 OP_E (bytemode, sizeflag);
13298 }
13299
13300 static void
13301 print_operand_value (char *buf, int hex, bfd_vma disp)
13302 {
13303 if (address_mode == mode_64bit)
13304 {
13305 if (hex)
13306 {
13307 char tmp[30];
13308 int i;
13309 buf[0] = '0';
13310 buf[1] = 'x';
13311 sprintf_vma (tmp, disp);
13312 for (i = 0; tmp[i] == '0' && tmp[i + 1]; i++);
13313 strcpy (buf + 2, tmp + i);
13314 }
13315 else
13316 {
13317 bfd_signed_vma v = disp;
13318 char tmp[30];
13319 int i;
13320 if (v < 0)
13321 {
13322 *(buf++) = '-';
13323 v = -disp;
13324 /* Check for possible overflow on 0x8000000000000000. */
13325 if (v < 0)
13326 {
13327 strcpy (buf, "9223372036854775808");
13328 return;
13329 }
13330 }
13331 if (!v)
13332 {
13333 strcpy (buf, "0");
13334 return;
13335 }
13336
13337 i = 0;
13338 tmp[29] = 0;
13339 while (v)
13340 {
13341 tmp[28 - i] = (v % 10) + '0';
13342 v /= 10;
13343 i++;
13344 }
13345 strcpy (buf, tmp + 29 - i);
13346 }
13347 }
13348 else
13349 {
13350 if (hex)
13351 sprintf (buf, "0x%x", (unsigned int) disp);
13352 else
13353 sprintf (buf, "%d", (int) disp);
13354 }
13355 }
13356
13357 /* Put DISP in BUF as signed hex number. */
13358
13359 static void
13360 print_displacement (char *buf, bfd_vma disp)
13361 {
13362 bfd_signed_vma val = disp;
13363 char tmp[30];
13364 int i, j = 0;
13365
13366 if (val < 0)
13367 {
13368 buf[j++] = '-';
13369 val = -disp;
13370
13371 /* Check for possible overflow. */
13372 if (val < 0)
13373 {
13374 switch (address_mode)
13375 {
13376 case mode_64bit:
13377 strcpy (buf + j, "0x8000000000000000");
13378 break;
13379 case mode_32bit:
13380 strcpy (buf + j, "0x80000000");
13381 break;
13382 case mode_16bit:
13383 strcpy (buf + j, "0x8000");
13384 break;
13385 }
13386 return;
13387 }
13388 }
13389
13390 buf[j++] = '0';
13391 buf[j++] = 'x';
13392
13393 sprintf_vma (tmp, (bfd_vma) val);
13394 for (i = 0; tmp[i] == '0'; i++)
13395 continue;
13396 if (tmp[i] == '\0')
13397 i--;
13398 strcpy (buf + j, tmp + i);
13399 }
13400
13401 static void
13402 intel_operand_size (int bytemode, int sizeflag)
13403 {
13404 if (vex.evex
13405 && vex.b
13406 && (bytemode == x_mode
13407 || bytemode == evex_half_bcst_xmmq_mode))
13408 {
13409 if (vex.w)
13410 oappend ("QWORD PTR ");
13411 else
13412 oappend ("DWORD PTR ");
13413 return;
13414 }
13415 switch (bytemode)
13416 {
13417 case b_mode:
13418 case b_swap_mode:
13419 case dqb_mode:
13420 case db_mode:
13421 oappend ("BYTE PTR ");
13422 break;
13423 case w_mode:
13424 case dw_mode:
13425 case dqw_mode:
13426 oappend ("WORD PTR ");
13427 break;
13428 case indir_v_mode:
13429 if (address_mode == mode_64bit && isa64 == intel64)
13430 {
13431 oappend ("QWORD PTR ");
13432 break;
13433 }
13434 /* Fall through. */
13435 case stack_v_mode:
13436 if (address_mode == mode_64bit && ((sizeflag & DFLAG) || (rex & REX_W)))
13437 {
13438 oappend ("QWORD PTR ");
13439 break;
13440 }
13441 /* Fall through. */
13442 case v_mode:
13443 case v_swap_mode:
13444 case dq_mode:
13445 USED_REX (REX_W);
13446 if (rex & REX_W)
13447 oappend ("QWORD PTR ");
13448 else
13449 {
13450 if ((sizeflag & DFLAG) || bytemode == dq_mode)
13451 oappend ("DWORD PTR ");
13452 else
13453 oappend ("WORD PTR ");
13454 used_prefixes |= (prefixes & PREFIX_DATA);
13455 }
13456 break;
13457 case z_mode:
13458 if ((rex & REX_W) || (sizeflag & DFLAG))
13459 *obufp++ = 'D';
13460 oappend ("WORD PTR ");
13461 if (!(rex & REX_W))
13462 used_prefixes |= (prefixes & PREFIX_DATA);
13463 break;
13464 case a_mode:
13465 if (sizeflag & DFLAG)
13466 oappend ("QWORD PTR ");
13467 else
13468 oappend ("DWORD PTR ");
13469 used_prefixes |= (prefixes & PREFIX_DATA);
13470 break;
13471 case d_mode:
13472 case d_scalar_mode:
13473 case d_scalar_swap_mode:
13474 case d_swap_mode:
13475 case dqd_mode:
13476 oappend ("DWORD PTR ");
13477 break;
13478 case q_mode:
13479 case q_scalar_mode:
13480 case q_scalar_swap_mode:
13481 case q_swap_mode:
13482 oappend ("QWORD PTR ");
13483 break;
13484 case dqa_mode:
13485 case m_mode:
13486 if (address_mode == mode_64bit)
13487 oappend ("QWORD PTR ");
13488 else
13489 oappend ("DWORD PTR ");
13490 break;
13491 case f_mode:
13492 if (sizeflag & DFLAG)
13493 oappend ("FWORD PTR ");
13494 else
13495 oappend ("DWORD PTR ");
13496 used_prefixes |= (prefixes & PREFIX_DATA);
13497 break;
13498 case t_mode:
13499 oappend ("TBYTE PTR ");
13500 break;
13501 case x_mode:
13502 case x_swap_mode:
13503 case evex_x_gscat_mode:
13504 case evex_x_nobcst_mode:
13505 case b_scalar_mode:
13506 case w_scalar_mode:
13507 if (need_vex)
13508 {
13509 switch (vex.length)
13510 {
13511 case 128:
13512 oappend ("XMMWORD PTR ");
13513 break;
13514 case 256:
13515 oappend ("YMMWORD PTR ");
13516 break;
13517 case 512:
13518 oappend ("ZMMWORD PTR ");
13519 break;
13520 default:
13521 abort ();
13522 }
13523 }
13524 else
13525 oappend ("XMMWORD PTR ");
13526 break;
13527 case xmm_mode:
13528 oappend ("XMMWORD PTR ");
13529 break;
13530 case ymm_mode:
13531 oappend ("YMMWORD PTR ");
13532 break;
13533 case xmmq_mode:
13534 case evex_half_bcst_xmmq_mode:
13535 if (!need_vex)
13536 abort ();
13537
13538 switch (vex.length)
13539 {
13540 case 128:
13541 oappend ("QWORD PTR ");
13542 break;
13543 case 256:
13544 oappend ("XMMWORD PTR ");
13545 break;
13546 case 512:
13547 oappend ("YMMWORD PTR ");
13548 break;
13549 default:
13550 abort ();
13551 }
13552 break;
13553 case xmm_mb_mode:
13554 if (!need_vex)
13555 abort ();
13556
13557 switch (vex.length)
13558 {
13559 case 128:
13560 case 256:
13561 case 512:
13562 oappend ("BYTE PTR ");
13563 break;
13564 default:
13565 abort ();
13566 }
13567 break;
13568 case xmm_mw_mode:
13569 if (!need_vex)
13570 abort ();
13571
13572 switch (vex.length)
13573 {
13574 case 128:
13575 case 256:
13576 case 512:
13577 oappend ("WORD PTR ");
13578 break;
13579 default:
13580 abort ();
13581 }
13582 break;
13583 case xmm_md_mode:
13584 if (!need_vex)
13585 abort ();
13586
13587 switch (vex.length)
13588 {
13589 case 128:
13590 case 256:
13591 case 512:
13592 oappend ("DWORD PTR ");
13593 break;
13594 default:
13595 abort ();
13596 }
13597 break;
13598 case xmm_mq_mode:
13599 if (!need_vex)
13600 abort ();
13601
13602 switch (vex.length)
13603 {
13604 case 128:
13605 case 256:
13606 case 512:
13607 oappend ("QWORD PTR ");
13608 break;
13609 default:
13610 abort ();
13611 }
13612 break;
13613 case xmmdw_mode:
13614 if (!need_vex)
13615 abort ();
13616
13617 switch (vex.length)
13618 {
13619 case 128:
13620 oappend ("WORD PTR ");
13621 break;
13622 case 256:
13623 oappend ("DWORD PTR ");
13624 break;
13625 case 512:
13626 oappend ("QWORD PTR ");
13627 break;
13628 default:
13629 abort ();
13630 }
13631 break;
13632 case xmmqd_mode:
13633 if (!need_vex)
13634 abort ();
13635
13636 switch (vex.length)
13637 {
13638 case 128:
13639 oappend ("DWORD PTR ");
13640 break;
13641 case 256:
13642 oappend ("QWORD PTR ");
13643 break;
13644 case 512:
13645 oappend ("XMMWORD PTR ");
13646 break;
13647 default:
13648 abort ();
13649 }
13650 break;
13651 case ymmq_mode:
13652 if (!need_vex)
13653 abort ();
13654
13655 switch (vex.length)
13656 {
13657 case 128:
13658 oappend ("QWORD PTR ");
13659 break;
13660 case 256:
13661 oappend ("YMMWORD PTR ");
13662 break;
13663 case 512:
13664 oappend ("ZMMWORD PTR ");
13665 break;
13666 default:
13667 abort ();
13668 }
13669 break;
13670 case ymmxmm_mode:
13671 if (!need_vex)
13672 abort ();
13673
13674 switch (vex.length)
13675 {
13676 case 128:
13677 case 256:
13678 oappend ("XMMWORD PTR ");
13679 break;
13680 default:
13681 abort ();
13682 }
13683 break;
13684 case o_mode:
13685 oappend ("OWORD PTR ");
13686 break;
13687 case xmm_mdq_mode:
13688 case vex_w_dq_mode:
13689 case vex_scalar_w_dq_mode:
13690 if (!need_vex)
13691 abort ();
13692
13693 if (vex.w)
13694 oappend ("QWORD PTR ");
13695 else
13696 oappend ("DWORD PTR ");
13697 break;
13698 case vex_vsib_d_w_dq_mode:
13699 case vex_vsib_q_w_dq_mode:
13700 if (!need_vex)
13701 abort ();
13702
13703 if (!vex.evex)
13704 {
13705 if (vex.w)
13706 oappend ("QWORD PTR ");
13707 else
13708 oappend ("DWORD PTR ");
13709 }
13710 else
13711 {
13712 switch (vex.length)
13713 {
13714 case 128:
13715 oappend ("XMMWORD PTR ");
13716 break;
13717 case 256:
13718 oappend ("YMMWORD PTR ");
13719 break;
13720 case 512:
13721 oappend ("ZMMWORD PTR ");
13722 break;
13723 default:
13724 abort ();
13725 }
13726 }
13727 break;
13728 case vex_vsib_q_w_d_mode:
13729 case vex_vsib_d_w_d_mode:
13730 if (!need_vex || !vex.evex)
13731 abort ();
13732
13733 switch (vex.length)
13734 {
13735 case 128:
13736 oappend ("QWORD PTR ");
13737 break;
13738 case 256:
13739 oappend ("XMMWORD PTR ");
13740 break;
13741 case 512:
13742 oappend ("YMMWORD PTR ");
13743 break;
13744 default:
13745 abort ();
13746 }
13747
13748 break;
13749 case mask_bd_mode:
13750 if (!need_vex || vex.length != 128)
13751 abort ();
13752 if (vex.w)
13753 oappend ("DWORD PTR ");
13754 else
13755 oappend ("BYTE PTR ");
13756 break;
13757 case mask_mode:
13758 if (!need_vex)
13759 abort ();
13760 if (vex.w)
13761 oappend ("QWORD PTR ");
13762 else
13763 oappend ("WORD PTR ");
13764 break;
13765 case v_bnd_mode:
13766 case v_bndmk_mode:
13767 default:
13768 break;
13769 }
13770 }
13771
13772 static void
13773 OP_E_register (int bytemode, int sizeflag)
13774 {
13775 int reg = modrm.rm;
13776 const char **names;
13777
13778 USED_REX (REX_B);
13779 if ((rex & REX_B))
13780 reg += 8;
13781
13782 if ((sizeflag & SUFFIX_ALWAYS)
13783 && (bytemode == b_swap_mode
13784 || bytemode == bnd_swap_mode
13785 || bytemode == v_swap_mode))
13786 swap_operand ();
13787
13788 switch (bytemode)
13789 {
13790 case b_mode:
13791 case b_swap_mode:
13792 USED_REX (0);
13793 if (rex)
13794 names = names8rex;
13795 else
13796 names = names8;
13797 break;
13798 case w_mode:
13799 names = names16;
13800 break;
13801 case d_mode:
13802 case dw_mode:
13803 case db_mode:
13804 names = names32;
13805 break;
13806 case q_mode:
13807 names = names64;
13808 break;
13809 case m_mode:
13810 case v_bnd_mode:
13811 names = address_mode == mode_64bit ? names64 : names32;
13812 break;
13813 case bnd_mode:
13814 case bnd_swap_mode:
13815 if (reg > 0x3)
13816 {
13817 oappend ("(bad)");
13818 return;
13819 }
13820 names = names_bnd;
13821 break;
13822 case indir_v_mode:
13823 if (address_mode == mode_64bit && isa64 == intel64)
13824 {
13825 names = names64;
13826 break;
13827 }
13828 /* Fall through. */
13829 case stack_v_mode:
13830 if (address_mode == mode_64bit && ((sizeflag & DFLAG) || (rex & REX_W)))
13831 {
13832 names = names64;
13833 break;
13834 }
13835 bytemode = v_mode;
13836 /* Fall through. */
13837 case v_mode:
13838 case v_swap_mode:
13839 case dq_mode:
13840 case dqb_mode:
13841 case dqd_mode:
13842 case dqw_mode:
13843 case dqa_mode:
13844 USED_REX (REX_W);
13845 if (rex & REX_W)
13846 names = names64;
13847 else
13848 {
13849 if ((sizeflag & DFLAG)
13850 || (bytemode != v_mode
13851 && bytemode != v_swap_mode))
13852 names = names32;
13853 else
13854 names = names16;
13855 used_prefixes |= (prefixes & PREFIX_DATA);
13856 }
13857 break;
13858 case va_mode:
13859 names = (address_mode == mode_64bit
13860 ? names64 : names32);
13861 if (!(prefixes & PREFIX_ADDR))
13862 names = (address_mode == mode_16bit
13863 ? names16 : names);
13864 else
13865 {
13866 /* Remove "addr16/addr32". */
13867 all_prefixes[last_addr_prefix] = 0;
13868 names = (address_mode != mode_32bit
13869 ? names32 : names16);
13870 used_prefixes |= PREFIX_ADDR;
13871 }
13872 break;
13873 case mask_bd_mode:
13874 case mask_mode:
13875 if (reg > 0x7)
13876 {
13877 oappend ("(bad)");
13878 return;
13879 }
13880 names = names_mask;
13881 break;
13882 case 0:
13883 return;
13884 default:
13885 oappend (INTERNAL_DISASSEMBLER_ERROR);
13886 return;
13887 }
13888 oappend (names[reg]);
13889 }
13890
13891 static void
13892 OP_E_memory (int bytemode, int sizeflag)
13893 {
13894 bfd_vma disp = 0;
13895 int add = (rex & REX_B) ? 8 : 0;
13896 int riprel = 0;
13897 int shift;
13898
13899 if (vex.evex)
13900 {
13901 /* In EVEX, if operand doesn't allow broadcast, vex.b should be 0. */
13902 if (vex.b
13903 && bytemode != x_mode
13904 && bytemode != xmmq_mode
13905 && bytemode != evex_half_bcst_xmmq_mode)
13906 {
13907 BadOp ();
13908 return;
13909 }
13910 switch (bytemode)
13911 {
13912 case dqw_mode:
13913 case dw_mode:
13914 shift = 1;
13915 break;
13916 case dqb_mode:
13917 case db_mode:
13918 shift = 0;
13919 break;
13920 case dq_mode:
13921 if (address_mode != mode_64bit)
13922 {
13923 shift = 2;
13924 break;
13925 }
13926 /* fall through */
13927 case vex_vsib_d_w_dq_mode:
13928 case vex_vsib_d_w_d_mode:
13929 case vex_vsib_q_w_dq_mode:
13930 case vex_vsib_q_w_d_mode:
13931 case evex_x_gscat_mode:
13932 case xmm_mdq_mode:
13933 shift = vex.w ? 3 : 2;
13934 break;
13935 case x_mode:
13936 case evex_half_bcst_xmmq_mode:
13937 case xmmq_mode:
13938 if (vex.b)
13939 {
13940 shift = vex.w ? 3 : 2;
13941 break;
13942 }
13943 /* Fall through. */
13944 case xmmqd_mode:
13945 case xmmdw_mode:
13946 case ymmq_mode:
13947 case evex_x_nobcst_mode:
13948 case x_swap_mode:
13949 switch (vex.length)
13950 {
13951 case 128:
13952 shift = 4;
13953 break;
13954 case 256:
13955 shift = 5;
13956 break;
13957 case 512:
13958 shift = 6;
13959 break;
13960 default:
13961 abort ();
13962 }
13963 break;
13964 case ymm_mode:
13965 shift = 5;
13966 break;
13967 case xmm_mode:
13968 shift = 4;
13969 break;
13970 case xmm_mq_mode:
13971 case q_mode:
13972 case q_scalar_mode:
13973 case q_swap_mode:
13974 case q_scalar_swap_mode:
13975 shift = 3;
13976 break;
13977 case dqd_mode:
13978 case xmm_md_mode:
13979 case d_mode:
13980 case d_scalar_mode:
13981 case d_swap_mode:
13982 case d_scalar_swap_mode:
13983 shift = 2;
13984 break;
13985 case w_scalar_mode:
13986 case xmm_mw_mode:
13987 shift = 1;
13988 break;
13989 case b_scalar_mode:
13990 case xmm_mb_mode:
13991 shift = 0;
13992 break;
13993 case dqa_mode:
13994 shift = address_mode == mode_64bit ? 3 : 2;
13995 break;
13996 default:
13997 abort ();
13998 }
13999 /* Make necessary corrections to shift for modes that need it.
14000 For these modes we currently have shift 4, 5 or 6 depending on
14001 vex.length (it corresponds to xmmword, ymmword or zmmword
14002 operand). We might want to make it 3, 4 or 5 (e.g. for
14003 xmmq_mode). In case of broadcast enabled the corrections
14004 aren't needed, as element size is always 32 or 64 bits. */
14005 if (!vex.b
14006 && (bytemode == xmmq_mode
14007 || bytemode == evex_half_bcst_xmmq_mode))
14008 shift -= 1;
14009 else if (bytemode == xmmqd_mode)
14010 shift -= 2;
14011 else if (bytemode == xmmdw_mode)
14012 shift -= 3;
14013 else if (bytemode == ymmq_mode && vex.length == 128)
14014 shift -= 1;
14015 }
14016 else
14017 shift = 0;
14018
14019 USED_REX (REX_B);
14020 if (intel_syntax)
14021 intel_operand_size (bytemode, sizeflag);
14022 append_seg ();
14023
14024 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
14025 {
14026 /* 32/64 bit address mode */
14027 int havedisp;
14028 int havesib;
14029 int havebase;
14030 int haveindex;
14031 int needindex;
14032 int needaddr32;
14033 int base, rbase;
14034 int vindex = 0;
14035 int scale = 0;
14036 int addr32flag = !((sizeflag & AFLAG)
14037 || bytemode == v_bnd_mode
14038 || bytemode == v_bndmk_mode
14039 || bytemode == bnd_mode
14040 || bytemode == bnd_swap_mode);
14041 const char **indexes64 = names64;
14042 const char **indexes32 = names32;
14043
14044 havesib = 0;
14045 havebase = 1;
14046 haveindex = 0;
14047 base = modrm.rm;
14048
14049 if (base == 4)
14050 {
14051 havesib = 1;
14052 vindex = sib.index;
14053 USED_REX (REX_X);
14054 if (rex & REX_X)
14055 vindex += 8;
14056 switch (bytemode)
14057 {
14058 case vex_vsib_d_w_dq_mode:
14059 case vex_vsib_d_w_d_mode:
14060 case vex_vsib_q_w_dq_mode:
14061 case vex_vsib_q_w_d_mode:
14062 if (!need_vex)
14063 abort ();
14064 if (vex.evex)
14065 {
14066 if (!vex.v)
14067 vindex += 16;
14068 }
14069
14070 haveindex = 1;
14071 switch (vex.length)
14072 {
14073 case 128:
14074 indexes64 = indexes32 = names_xmm;
14075 break;
14076 case 256:
14077 if (!vex.w
14078 || bytemode == vex_vsib_q_w_dq_mode
14079 || bytemode == vex_vsib_q_w_d_mode)
14080 indexes64 = indexes32 = names_ymm;
14081 else
14082 indexes64 = indexes32 = names_xmm;
14083 break;
14084 case 512:
14085 if (!vex.w
14086 || bytemode == vex_vsib_q_w_dq_mode
14087 || bytemode == vex_vsib_q_w_d_mode)
14088 indexes64 = indexes32 = names_zmm;
14089 else
14090 indexes64 = indexes32 = names_ymm;
14091 break;
14092 default:
14093 abort ();
14094 }
14095 break;
14096 default:
14097 haveindex = vindex != 4;
14098 break;
14099 }
14100 scale = sib.scale;
14101 base = sib.base;
14102 codep++;
14103 }
14104 rbase = base + add;
14105
14106 switch (modrm.mod)
14107 {
14108 case 0:
14109 if (base == 5)
14110 {
14111 havebase = 0;
14112 if (address_mode == mode_64bit && !havesib)
14113 riprel = 1;
14114 disp = get32s ();
14115 if (riprel && bytemode == v_bndmk_mode)
14116 {
14117 oappend ("(bad)");
14118 return;
14119 }
14120 }
14121 break;
14122 case 1:
14123 FETCH_DATA (the_info, codep + 1);
14124 disp = *codep++;
14125 if ((disp & 0x80) != 0)
14126 disp -= 0x100;
14127 if (vex.evex && shift > 0)
14128 disp <<= shift;
14129 break;
14130 case 2:
14131 disp = get32s ();
14132 break;
14133 }
14134
14135 needindex = 0;
14136 needaddr32 = 0;
14137 if (havesib
14138 && !havebase
14139 && !haveindex
14140 && address_mode != mode_16bit)
14141 {
14142 if (address_mode == mode_64bit)
14143 {
14144 /* Display eiz instead of addr32. */
14145 needindex = addr32flag;
14146 needaddr32 = 1;
14147 }
14148 else
14149 {
14150 /* In 32-bit mode, we need index register to tell [offset]
14151 from [eiz*1 + offset]. */
14152 needindex = 1;
14153 }
14154 }
14155
14156 havedisp = (havebase
14157 || needindex
14158 || (havesib && (haveindex || scale != 0)));
14159
14160 if (!intel_syntax)
14161 if (modrm.mod != 0 || base == 5)
14162 {
14163 if (havedisp || riprel)
14164 print_displacement (scratchbuf, disp);
14165 else
14166 print_operand_value (scratchbuf, 1, disp);
14167 oappend (scratchbuf);
14168 if (riprel)
14169 {
14170 set_op (disp, 1);
14171 oappend (!addr32flag ? "(%rip)" : "(%eip)");
14172 }
14173 }
14174
14175 if ((havebase || haveindex || needaddr32 || riprel)
14176 && (bytemode != v_bnd_mode)
14177 && (bytemode != v_bndmk_mode)
14178 && (bytemode != bnd_mode)
14179 && (bytemode != bnd_swap_mode))
14180 used_prefixes |= PREFIX_ADDR;
14181
14182 if (havedisp || (intel_syntax && riprel))
14183 {
14184 *obufp++ = open_char;
14185 if (intel_syntax && riprel)
14186 {
14187 set_op (disp, 1);
14188 oappend (!addr32flag ? "rip" : "eip");
14189 }
14190 *obufp = '\0';
14191 if (havebase)
14192 oappend (address_mode == mode_64bit && !addr32flag
14193 ? names64[rbase] : names32[rbase]);
14194 if (havesib)
14195 {
14196 /* ESP/RSP won't allow index. If base isn't ESP/RSP,
14197 print index to tell base + index from base. */
14198 if (scale != 0
14199 || needindex
14200 || haveindex
14201 || (havebase && base != ESP_REG_NUM))
14202 {
14203 if (!intel_syntax || havebase)
14204 {
14205 *obufp++ = separator_char;
14206 *obufp = '\0';
14207 }
14208 if (haveindex)
14209 oappend (address_mode == mode_64bit && !addr32flag
14210 ? indexes64[vindex] : indexes32[vindex]);
14211 else
14212 oappend (address_mode == mode_64bit && !addr32flag
14213 ? index64 : index32);
14214
14215 *obufp++ = scale_char;
14216 *obufp = '\0';
14217 sprintf (scratchbuf, "%d", 1 << scale);
14218 oappend (scratchbuf);
14219 }
14220 }
14221 if (intel_syntax
14222 && (disp || modrm.mod != 0 || base == 5))
14223 {
14224 if (!havedisp || (bfd_signed_vma) disp >= 0)
14225 {
14226 *obufp++ = '+';
14227 *obufp = '\0';
14228 }
14229 else if (modrm.mod != 1 && disp != -disp)
14230 {
14231 *obufp++ = '-';
14232 *obufp = '\0';
14233 disp = - (bfd_signed_vma) disp;
14234 }
14235
14236 if (havedisp)
14237 print_displacement (scratchbuf, disp);
14238 else
14239 print_operand_value (scratchbuf, 1, disp);
14240 oappend (scratchbuf);
14241 }
14242
14243 *obufp++ = close_char;
14244 *obufp = '\0';
14245 }
14246 else if (intel_syntax)
14247 {
14248 if (modrm.mod != 0 || base == 5)
14249 {
14250 if (!active_seg_prefix)
14251 {
14252 oappend (names_seg[ds_reg - es_reg]);
14253 oappend (":");
14254 }
14255 print_operand_value (scratchbuf, 1, disp);
14256 oappend (scratchbuf);
14257 }
14258 }
14259 }
14260 else
14261 {
14262 /* 16 bit address mode */
14263 used_prefixes |= prefixes & PREFIX_ADDR;
14264 switch (modrm.mod)
14265 {
14266 case 0:
14267 if (modrm.rm == 6)
14268 {
14269 disp = get16 ();
14270 if ((disp & 0x8000) != 0)
14271 disp -= 0x10000;
14272 }
14273 break;
14274 case 1:
14275 FETCH_DATA (the_info, codep + 1);
14276 disp = *codep++;
14277 if ((disp & 0x80) != 0)
14278 disp -= 0x100;
14279 if (vex.evex && shift > 0)
14280 disp <<= shift;
14281 break;
14282 case 2:
14283 disp = get16 ();
14284 if ((disp & 0x8000) != 0)
14285 disp -= 0x10000;
14286 break;
14287 }
14288
14289 if (!intel_syntax)
14290 if (modrm.mod != 0 || modrm.rm == 6)
14291 {
14292 print_displacement (scratchbuf, disp);
14293 oappend (scratchbuf);
14294 }
14295
14296 if (modrm.mod != 0 || modrm.rm != 6)
14297 {
14298 *obufp++ = open_char;
14299 *obufp = '\0';
14300 oappend (index16[modrm.rm]);
14301 if (intel_syntax
14302 && (disp || modrm.mod != 0 || modrm.rm == 6))
14303 {
14304 if ((bfd_signed_vma) disp >= 0)
14305 {
14306 *obufp++ = '+';
14307 *obufp = '\0';
14308 }
14309 else if (modrm.mod != 1)
14310 {
14311 *obufp++ = '-';
14312 *obufp = '\0';
14313 disp = - (bfd_signed_vma) disp;
14314 }
14315
14316 print_displacement (scratchbuf, disp);
14317 oappend (scratchbuf);
14318 }
14319
14320 *obufp++ = close_char;
14321 *obufp = '\0';
14322 }
14323 else if (intel_syntax)
14324 {
14325 if (!active_seg_prefix)
14326 {
14327 oappend (names_seg[ds_reg - es_reg]);
14328 oappend (":");
14329 }
14330 print_operand_value (scratchbuf, 1, disp & 0xffff);
14331 oappend (scratchbuf);
14332 }
14333 }
14334 if (vex.evex && vex.b
14335 && (bytemode == x_mode
14336 || bytemode == xmmq_mode
14337 || bytemode == evex_half_bcst_xmmq_mode))
14338 {
14339 if (vex.w
14340 || bytemode == xmmq_mode
14341 || bytemode == evex_half_bcst_xmmq_mode)
14342 {
14343 switch (vex.length)
14344 {
14345 case 128:
14346 oappend ("{1to2}");
14347 break;
14348 case 256:
14349 oappend ("{1to4}");
14350 break;
14351 case 512:
14352 oappend ("{1to8}");
14353 break;
14354 default:
14355 abort ();
14356 }
14357 }
14358 else
14359 {
14360 switch (vex.length)
14361 {
14362 case 128:
14363 oappend ("{1to4}");
14364 break;
14365 case 256:
14366 oappend ("{1to8}");
14367 break;
14368 case 512:
14369 oappend ("{1to16}");
14370 break;
14371 default:
14372 abort ();
14373 }
14374 }
14375 }
14376 }
14377
14378 static void
14379 OP_E (int bytemode, int sizeflag)
14380 {
14381 /* Skip mod/rm byte. */
14382 MODRM_CHECK;
14383 codep++;
14384
14385 if (modrm.mod == 3)
14386 OP_E_register (bytemode, sizeflag);
14387 else
14388 OP_E_memory (bytemode, sizeflag);
14389 }
14390
14391 static void
14392 OP_G (int bytemode, int sizeflag)
14393 {
14394 int add = 0;
14395 const char **names;
14396 USED_REX (REX_R);
14397 if (rex & REX_R)
14398 add += 8;
14399 switch (bytemode)
14400 {
14401 case b_mode:
14402 USED_REX (0);
14403 if (rex)
14404 oappend (names8rex[modrm.reg + add]);
14405 else
14406 oappend (names8[modrm.reg + add]);
14407 break;
14408 case w_mode:
14409 oappend (names16[modrm.reg + add]);
14410 break;
14411 case d_mode:
14412 case db_mode:
14413 case dw_mode:
14414 oappend (names32[modrm.reg + add]);
14415 break;
14416 case q_mode:
14417 oappend (names64[modrm.reg + add]);
14418 break;
14419 case bnd_mode:
14420 if (modrm.reg > 0x3)
14421 {
14422 oappend ("(bad)");
14423 return;
14424 }
14425 oappend (names_bnd[modrm.reg]);
14426 break;
14427 case v_mode:
14428 case dq_mode:
14429 case dqb_mode:
14430 case dqd_mode:
14431 case dqw_mode:
14432 USED_REX (REX_W);
14433 if (rex & REX_W)
14434 oappend (names64[modrm.reg + add]);
14435 else
14436 {
14437 if ((sizeflag & DFLAG) || bytemode != v_mode)
14438 oappend (names32[modrm.reg + add]);
14439 else
14440 oappend (names16[modrm.reg + add]);
14441 used_prefixes |= (prefixes & PREFIX_DATA);
14442 }
14443 break;
14444 case va_mode:
14445 names = (address_mode == mode_64bit
14446 ? names64 : names32);
14447 if (!(prefixes & PREFIX_ADDR))
14448 {
14449 if (address_mode == mode_16bit)
14450 names = names16;
14451 }
14452 else
14453 {
14454 /* Remove "addr16/addr32". */
14455 all_prefixes[last_addr_prefix] = 0;
14456 names = (address_mode != mode_32bit
14457 ? names32 : names16);
14458 used_prefixes |= PREFIX_ADDR;
14459 }
14460 oappend (names[modrm.reg + add]);
14461 break;
14462 case m_mode:
14463 if (address_mode == mode_64bit)
14464 oappend (names64[modrm.reg + add]);
14465 else
14466 oappend (names32[modrm.reg + add]);
14467 break;
14468 case mask_bd_mode:
14469 case mask_mode:
14470 if ((modrm.reg + add) > 0x7)
14471 {
14472 oappend ("(bad)");
14473 return;
14474 }
14475 oappend (names_mask[modrm.reg + add]);
14476 break;
14477 default:
14478 oappend (INTERNAL_DISASSEMBLER_ERROR);
14479 break;
14480 }
14481 }
14482
14483 static bfd_vma
14484 get64 (void)
14485 {
14486 bfd_vma x;
14487 #ifdef BFD64
14488 unsigned int a;
14489 unsigned int b;
14490
14491 FETCH_DATA (the_info, codep + 8);
14492 a = *codep++ & 0xff;
14493 a |= (*codep++ & 0xff) << 8;
14494 a |= (*codep++ & 0xff) << 16;
14495 a |= (*codep++ & 0xffu) << 24;
14496 b = *codep++ & 0xff;
14497 b |= (*codep++ & 0xff) << 8;
14498 b |= (*codep++ & 0xff) << 16;
14499 b |= (*codep++ & 0xffu) << 24;
14500 x = a + ((bfd_vma) b << 32);
14501 #else
14502 abort ();
14503 x = 0;
14504 #endif
14505 return x;
14506 }
14507
14508 static bfd_signed_vma
14509 get32 (void)
14510 {
14511 bfd_signed_vma x = 0;
14512
14513 FETCH_DATA (the_info, codep + 4);
14514 x = *codep++ & (bfd_signed_vma) 0xff;
14515 x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
14516 x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
14517 x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
14518 return x;
14519 }
14520
14521 static bfd_signed_vma
14522 get32s (void)
14523 {
14524 bfd_signed_vma x = 0;
14525
14526 FETCH_DATA (the_info, codep + 4);
14527 x = *codep++ & (bfd_signed_vma) 0xff;
14528 x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
14529 x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
14530 x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
14531
14532 x = (x ^ ((bfd_signed_vma) 1 << 31)) - ((bfd_signed_vma) 1 << 31);
14533
14534 return x;
14535 }
14536
14537 static int
14538 get16 (void)
14539 {
14540 int x = 0;
14541
14542 FETCH_DATA (the_info, codep + 2);
14543 x = *codep++ & 0xff;
14544 x |= (*codep++ & 0xff) << 8;
14545 return x;
14546 }
14547
14548 static void
14549 set_op (bfd_vma op, int riprel)
14550 {
14551 op_index[op_ad] = op_ad;
14552 if (address_mode == mode_64bit)
14553 {
14554 op_address[op_ad] = op;
14555 op_riprel[op_ad] = riprel;
14556 }
14557 else
14558 {
14559 /* Mask to get a 32-bit address. */
14560 op_address[op_ad] = op & 0xffffffff;
14561 op_riprel[op_ad] = riprel & 0xffffffff;
14562 }
14563 }
14564
14565 static void
14566 OP_REG (int code, int sizeflag)
14567 {
14568 const char *s;
14569 int add;
14570
14571 switch (code)
14572 {
14573 case es_reg: case ss_reg: case cs_reg:
14574 case ds_reg: case fs_reg: case gs_reg:
14575 oappend (names_seg[code - es_reg]);
14576 return;
14577 }
14578
14579 USED_REX (REX_B);
14580 if (rex & REX_B)
14581 add = 8;
14582 else
14583 add = 0;
14584
14585 switch (code)
14586 {
14587 case ax_reg: case cx_reg: case dx_reg: case bx_reg:
14588 case sp_reg: case bp_reg: case si_reg: case di_reg:
14589 s = names16[code - ax_reg + add];
14590 break;
14591 case al_reg: case ah_reg: case cl_reg: case ch_reg:
14592 case dl_reg: case dh_reg: case bl_reg: case bh_reg:
14593 USED_REX (0);
14594 if (rex)
14595 s = names8rex[code - al_reg + add];
14596 else
14597 s = names8[code - al_reg];
14598 break;
14599 case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
14600 case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
14601 if (address_mode == mode_64bit
14602 && ((sizeflag & DFLAG) || (rex & REX_W)))
14603 {
14604 s = names64[code - rAX_reg + add];
14605 break;
14606 }
14607 code += eAX_reg - rAX_reg;
14608 /* Fall through. */
14609 case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
14610 case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
14611 USED_REX (REX_W);
14612 if (rex & REX_W)
14613 s = names64[code - eAX_reg + add];
14614 else
14615 {
14616 if (sizeflag & DFLAG)
14617 s = names32[code - eAX_reg + add];
14618 else
14619 s = names16[code - eAX_reg + add];
14620 used_prefixes |= (prefixes & PREFIX_DATA);
14621 }
14622 break;
14623 default:
14624 s = INTERNAL_DISASSEMBLER_ERROR;
14625 break;
14626 }
14627 oappend (s);
14628 }
14629
14630 static void
14631 OP_IMREG (int code, int sizeflag)
14632 {
14633 const char *s;
14634
14635 switch (code)
14636 {
14637 case indir_dx_reg:
14638 if (intel_syntax)
14639 s = "dx";
14640 else
14641 s = "(%dx)";
14642 break;
14643 case ax_reg: case cx_reg: case dx_reg: case bx_reg:
14644 case sp_reg: case bp_reg: case si_reg: case di_reg:
14645 s = names16[code - ax_reg];
14646 break;
14647 case es_reg: case ss_reg: case cs_reg:
14648 case ds_reg: case fs_reg: case gs_reg:
14649 s = names_seg[code - es_reg];
14650 break;
14651 case al_reg: case ah_reg: case cl_reg: case ch_reg:
14652 case dl_reg: case dh_reg: case bl_reg: case bh_reg:
14653 USED_REX (0);
14654 if (rex)
14655 s = names8rex[code - al_reg];
14656 else
14657 s = names8[code - al_reg];
14658 break;
14659 case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
14660 case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
14661 USED_REX (REX_W);
14662 if (rex & REX_W)
14663 s = names64[code - eAX_reg];
14664 else
14665 {
14666 if (sizeflag & DFLAG)
14667 s = names32[code - eAX_reg];
14668 else
14669 s = names16[code - eAX_reg];
14670 used_prefixes |= (prefixes & PREFIX_DATA);
14671 }
14672 break;
14673 case z_mode_ax_reg:
14674 if ((rex & REX_W) || (sizeflag & DFLAG))
14675 s = *names32;
14676 else
14677 s = *names16;
14678 if (!(rex & REX_W))
14679 used_prefixes |= (prefixes & PREFIX_DATA);
14680 break;
14681 default:
14682 s = INTERNAL_DISASSEMBLER_ERROR;
14683 break;
14684 }
14685 oappend (s);
14686 }
14687
14688 static void
14689 OP_I (int bytemode, int sizeflag)
14690 {
14691 bfd_signed_vma op;
14692 bfd_signed_vma mask = -1;
14693
14694 switch (bytemode)
14695 {
14696 case b_mode:
14697 FETCH_DATA (the_info, codep + 1);
14698 op = *codep++;
14699 mask = 0xff;
14700 break;
14701 case q_mode:
14702 if (address_mode == mode_64bit)
14703 {
14704 op = get32s ();
14705 break;
14706 }
14707 /* Fall through. */
14708 case v_mode:
14709 USED_REX (REX_W);
14710 if (rex & REX_W)
14711 op = get32s ();
14712 else
14713 {
14714 if (sizeflag & DFLAG)
14715 {
14716 op = get32 ();
14717 mask = 0xffffffff;
14718 }
14719 else
14720 {
14721 op = get16 ();
14722 mask = 0xfffff;
14723 }
14724 used_prefixes |= (prefixes & PREFIX_DATA);
14725 }
14726 break;
14727 case w_mode:
14728 mask = 0xfffff;
14729 op = get16 ();
14730 break;
14731 case const_1_mode:
14732 if (intel_syntax)
14733 oappend ("1");
14734 return;
14735 default:
14736 oappend (INTERNAL_DISASSEMBLER_ERROR);
14737 return;
14738 }
14739
14740 op &= mask;
14741 scratchbuf[0] = '$';
14742 print_operand_value (scratchbuf + 1, 1, op);
14743 oappend_maybe_intel (scratchbuf);
14744 scratchbuf[0] = '\0';
14745 }
14746
14747 static void
14748 OP_I64 (int bytemode, int sizeflag)
14749 {
14750 bfd_signed_vma op;
14751 bfd_signed_vma mask = -1;
14752
14753 if (address_mode != mode_64bit)
14754 {
14755 OP_I (bytemode, sizeflag);
14756 return;
14757 }
14758
14759 switch (bytemode)
14760 {
14761 case b_mode:
14762 FETCH_DATA (the_info, codep + 1);
14763 op = *codep++;
14764 mask = 0xff;
14765 break;
14766 case v_mode:
14767 USED_REX (REX_W);
14768 if (rex & REX_W)
14769 op = get64 ();
14770 else
14771 {
14772 if (sizeflag & DFLAG)
14773 {
14774 op = get32 ();
14775 mask = 0xffffffff;
14776 }
14777 else
14778 {
14779 op = get16 ();
14780 mask = 0xfffff;
14781 }
14782 used_prefixes |= (prefixes & PREFIX_DATA);
14783 }
14784 break;
14785 case w_mode:
14786 mask = 0xfffff;
14787 op = get16 ();
14788 break;
14789 default:
14790 oappend (INTERNAL_DISASSEMBLER_ERROR);
14791 return;
14792 }
14793
14794 op &= mask;
14795 scratchbuf[0] = '$';
14796 print_operand_value (scratchbuf + 1, 1, op);
14797 oappend_maybe_intel (scratchbuf);
14798 scratchbuf[0] = '\0';
14799 }
14800
14801 static void
14802 OP_sI (int bytemode, int sizeflag)
14803 {
14804 bfd_signed_vma op;
14805
14806 switch (bytemode)
14807 {
14808 case b_mode:
14809 case b_T_mode:
14810 FETCH_DATA (the_info, codep + 1);
14811 op = *codep++;
14812 if ((op & 0x80) != 0)
14813 op -= 0x100;
14814 if (bytemode == b_T_mode)
14815 {
14816 if (address_mode != mode_64bit
14817 || !((sizeflag & DFLAG) || (rex & REX_W)))
14818 {
14819 /* The operand-size prefix is overridden by a REX prefix. */
14820 if ((sizeflag & DFLAG) || (rex & REX_W))
14821 op &= 0xffffffff;
14822 else
14823 op &= 0xffff;
14824 }
14825 }
14826 else
14827 {
14828 if (!(rex & REX_W))
14829 {
14830 if (sizeflag & DFLAG)
14831 op &= 0xffffffff;
14832 else
14833 op &= 0xffff;
14834 }
14835 }
14836 break;
14837 case v_mode:
14838 /* The operand-size prefix is overridden by a REX prefix. */
14839 if ((sizeflag & DFLAG) || (rex & REX_W))
14840 op = get32s ();
14841 else
14842 op = get16 ();
14843 break;
14844 default:
14845 oappend (INTERNAL_DISASSEMBLER_ERROR);
14846 return;
14847 }
14848
14849 scratchbuf[0] = '$';
14850 print_operand_value (scratchbuf + 1, 1, op);
14851 oappend_maybe_intel (scratchbuf);
14852 }
14853
14854 static void
14855 OP_J (int bytemode, int sizeflag)
14856 {
14857 bfd_vma disp;
14858 bfd_vma mask = -1;
14859 bfd_vma segment = 0;
14860
14861 switch (bytemode)
14862 {
14863 case b_mode:
14864 FETCH_DATA (the_info, codep + 1);
14865 disp = *codep++;
14866 if ((disp & 0x80) != 0)
14867 disp -= 0x100;
14868 break;
14869 case v_mode:
14870 if (isa64 == amd64)
14871 USED_REX (REX_W);
14872 if ((sizeflag & DFLAG)
14873 || (address_mode == mode_64bit
14874 && (isa64 != amd64 || (rex & REX_W))))
14875 disp = get32s ();
14876 else
14877 {
14878 disp = get16 ();
14879 if ((disp & 0x8000) != 0)
14880 disp -= 0x10000;
14881 /* In 16bit mode, address is wrapped around at 64k within
14882 the same segment. Otherwise, a data16 prefix on a jump
14883 instruction means that the pc is masked to 16 bits after
14884 the displacement is added! */
14885 mask = 0xffff;
14886 if ((prefixes & PREFIX_DATA) == 0)
14887 segment = ((start_pc + (codep - start_codep))
14888 & ~((bfd_vma) 0xffff));
14889 }
14890 if (address_mode != mode_64bit
14891 || (isa64 == amd64 && !(rex & REX_W)))
14892 used_prefixes |= (prefixes & PREFIX_DATA);
14893 break;
14894 default:
14895 oappend (INTERNAL_DISASSEMBLER_ERROR);
14896 return;
14897 }
14898 disp = ((start_pc + (codep - start_codep) + disp) & mask) | segment;
14899 set_op (disp, 0);
14900 print_operand_value (scratchbuf, 1, disp);
14901 oappend (scratchbuf);
14902 }
14903
14904 static void
14905 OP_SEG (int bytemode, int sizeflag)
14906 {
14907 if (bytemode == w_mode)
14908 oappend (names_seg[modrm.reg]);
14909 else
14910 OP_E (modrm.mod == 3 ? bytemode : w_mode, sizeflag);
14911 }
14912
14913 static void
14914 OP_DIR (int dummy ATTRIBUTE_UNUSED, int sizeflag)
14915 {
14916 int seg, offset;
14917
14918 if (sizeflag & DFLAG)
14919 {
14920 offset = get32 ();
14921 seg = get16 ();
14922 }
14923 else
14924 {
14925 offset = get16 ();
14926 seg = get16 ();
14927 }
14928 used_prefixes |= (prefixes & PREFIX_DATA);
14929 if (intel_syntax)
14930 sprintf (scratchbuf, "0x%x:0x%x", seg, offset);
14931 else
14932 sprintf (scratchbuf, "$0x%x,$0x%x", seg, offset);
14933 oappend (scratchbuf);
14934 }
14935
14936 static void
14937 OP_OFF (int bytemode, int sizeflag)
14938 {
14939 bfd_vma off;
14940
14941 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
14942 intel_operand_size (bytemode, sizeflag);
14943 append_seg ();
14944
14945 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
14946 off = get32 ();
14947 else
14948 off = get16 ();
14949
14950 if (intel_syntax)
14951 {
14952 if (!active_seg_prefix)
14953 {
14954 oappend (names_seg[ds_reg - es_reg]);
14955 oappend (":");
14956 }
14957 }
14958 print_operand_value (scratchbuf, 1, off);
14959 oappend (scratchbuf);
14960 }
14961
14962 static void
14963 OP_OFF64 (int bytemode, int sizeflag)
14964 {
14965 bfd_vma off;
14966
14967 if (address_mode != mode_64bit
14968 || (prefixes & PREFIX_ADDR))
14969 {
14970 OP_OFF (bytemode, sizeflag);
14971 return;
14972 }
14973
14974 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
14975 intel_operand_size (bytemode, sizeflag);
14976 append_seg ();
14977
14978 off = get64 ();
14979
14980 if (intel_syntax)
14981 {
14982 if (!active_seg_prefix)
14983 {
14984 oappend (names_seg[ds_reg - es_reg]);
14985 oappend (":");
14986 }
14987 }
14988 print_operand_value (scratchbuf, 1, off);
14989 oappend (scratchbuf);
14990 }
14991
14992 static void
14993 ptr_reg (int code, int sizeflag)
14994 {
14995 const char *s;
14996
14997 *obufp++ = open_char;
14998 used_prefixes |= (prefixes & PREFIX_ADDR);
14999 if (address_mode == mode_64bit)
15000 {
15001 if (!(sizeflag & AFLAG))
15002 s = names32[code - eAX_reg];
15003 else
15004 s = names64[code - eAX_reg];
15005 }
15006 else if (sizeflag & AFLAG)
15007 s = names32[code - eAX_reg];
15008 else
15009 s = names16[code - eAX_reg];
15010 oappend (s);
15011 *obufp++ = close_char;
15012 *obufp = 0;
15013 }
15014
15015 static void
15016 OP_ESreg (int code, int sizeflag)
15017 {
15018 if (intel_syntax)
15019 {
15020 switch (codep[-1])
15021 {
15022 case 0x6d: /* insw/insl */
15023 intel_operand_size (z_mode, sizeflag);
15024 break;
15025 case 0xa5: /* movsw/movsl/movsq */
15026 case 0xa7: /* cmpsw/cmpsl/cmpsq */
15027 case 0xab: /* stosw/stosl */
15028 case 0xaf: /* scasw/scasl */
15029 intel_operand_size (v_mode, sizeflag);
15030 break;
15031 default:
15032 intel_operand_size (b_mode, sizeflag);
15033 }
15034 }
15035 oappend_maybe_intel ("%es:");
15036 ptr_reg (code, sizeflag);
15037 }
15038
15039 static void
15040 OP_DSreg (int code, int sizeflag)
15041 {
15042 if (intel_syntax)
15043 {
15044 switch (codep[-1])
15045 {
15046 case 0x6f: /* outsw/outsl */
15047 intel_operand_size (z_mode, sizeflag);
15048 break;
15049 case 0xa5: /* movsw/movsl/movsq */
15050 case 0xa7: /* cmpsw/cmpsl/cmpsq */
15051 case 0xad: /* lodsw/lodsl/lodsq */
15052 intel_operand_size (v_mode, sizeflag);
15053 break;
15054 default:
15055 intel_operand_size (b_mode, sizeflag);
15056 }
15057 }
15058 /* Set active_seg_prefix to PREFIX_DS if it is unset so that the
15059 default segment register DS is printed. */
15060 if (!active_seg_prefix)
15061 active_seg_prefix = PREFIX_DS;
15062 append_seg ();
15063 ptr_reg (code, sizeflag);
15064 }
15065
15066 static void
15067 OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15068 {
15069 int add;
15070 if (rex & REX_R)
15071 {
15072 USED_REX (REX_R);
15073 add = 8;
15074 }
15075 else if (address_mode != mode_64bit && (prefixes & PREFIX_LOCK))
15076 {
15077 all_prefixes[last_lock_prefix] = 0;
15078 used_prefixes |= PREFIX_LOCK;
15079 add = 8;
15080 }
15081 else
15082 add = 0;
15083 sprintf (scratchbuf, "%%cr%d", modrm.reg + add);
15084 oappend_maybe_intel (scratchbuf);
15085 }
15086
15087 static void
15088 OP_D (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15089 {
15090 int add;
15091 USED_REX (REX_R);
15092 if (rex & REX_R)
15093 add = 8;
15094 else
15095 add = 0;
15096 if (intel_syntax)
15097 sprintf (scratchbuf, "db%d", modrm.reg + add);
15098 else
15099 sprintf (scratchbuf, "%%db%d", modrm.reg + add);
15100 oappend (scratchbuf);
15101 }
15102
15103 static void
15104 OP_T (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15105 {
15106 sprintf (scratchbuf, "%%tr%d", modrm.reg);
15107 oappend_maybe_intel (scratchbuf);
15108 }
15109
15110 static void
15111 OP_R (int bytemode, int sizeflag)
15112 {
15113 /* Skip mod/rm byte. */
15114 MODRM_CHECK;
15115 codep++;
15116 OP_E_register (bytemode, sizeflag);
15117 }
15118
15119 static void
15120 OP_MMX (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15121 {
15122 int reg = modrm.reg;
15123 const char **names;
15124
15125 used_prefixes |= (prefixes & PREFIX_DATA);
15126 if (prefixes & PREFIX_DATA)
15127 {
15128 names = names_xmm;
15129 USED_REX (REX_R);
15130 if (rex & REX_R)
15131 reg += 8;
15132 }
15133 else
15134 names = names_mm;
15135 oappend (names[reg]);
15136 }
15137
15138 static void
15139 OP_XMM (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
15140 {
15141 int reg = modrm.reg;
15142 const char **names;
15143
15144 USED_REX (REX_R);
15145 if (rex & REX_R)
15146 reg += 8;
15147 if (vex.evex)
15148 {
15149 if (!vex.r)
15150 reg += 16;
15151 }
15152
15153 if (need_vex
15154 && bytemode != xmm_mode
15155 && bytemode != xmmq_mode
15156 && bytemode != evex_half_bcst_xmmq_mode
15157 && bytemode != ymm_mode
15158 && bytemode != scalar_mode)
15159 {
15160 switch (vex.length)
15161 {
15162 case 128:
15163 names = names_xmm;
15164 break;
15165 case 256:
15166 if (vex.w
15167 || (bytemode != vex_vsib_q_w_dq_mode
15168 && bytemode != vex_vsib_q_w_d_mode))
15169 names = names_ymm;
15170 else
15171 names = names_xmm;
15172 break;
15173 case 512:
15174 names = names_zmm;
15175 break;
15176 default:
15177 abort ();
15178 }
15179 }
15180 else if (bytemode == xmmq_mode
15181 || bytemode == evex_half_bcst_xmmq_mode)
15182 {
15183 switch (vex.length)
15184 {
15185 case 128:
15186 case 256:
15187 names = names_xmm;
15188 break;
15189 case 512:
15190 names = names_ymm;
15191 break;
15192 default:
15193 abort ();
15194 }
15195 }
15196 else if (bytemode == ymm_mode)
15197 names = names_ymm;
15198 else
15199 names = names_xmm;
15200 oappend (names[reg]);
15201 }
15202
15203 static void
15204 OP_EM (int bytemode, int sizeflag)
15205 {
15206 int reg;
15207 const char **names;
15208
15209 if (modrm.mod != 3)
15210 {
15211 if (intel_syntax
15212 && (bytemode == v_mode || bytemode == v_swap_mode))
15213 {
15214 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
15215 used_prefixes |= (prefixes & PREFIX_DATA);
15216 }
15217 OP_E (bytemode, sizeflag);
15218 return;
15219 }
15220
15221 if ((sizeflag & SUFFIX_ALWAYS) && bytemode == v_swap_mode)
15222 swap_operand ();
15223
15224 /* Skip mod/rm byte. */
15225 MODRM_CHECK;
15226 codep++;
15227 used_prefixes |= (prefixes & PREFIX_DATA);
15228 reg = modrm.rm;
15229 if (prefixes & PREFIX_DATA)
15230 {
15231 names = names_xmm;
15232 USED_REX (REX_B);
15233 if (rex & REX_B)
15234 reg += 8;
15235 }
15236 else
15237 names = names_mm;
15238 oappend (names[reg]);
15239 }
15240
15241 /* cvt* are the only instructions in sse2 which have
15242 both SSE and MMX operands and also have 0x66 prefix
15243 in their opcode. 0x66 was originally used to differentiate
15244 between SSE and MMX instruction(operands). So we have to handle the
15245 cvt* separately using OP_EMC and OP_MXC */
15246 static void
15247 OP_EMC (int bytemode, int sizeflag)
15248 {
15249 if (modrm.mod != 3)
15250 {
15251 if (intel_syntax && bytemode == v_mode)
15252 {
15253 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
15254 used_prefixes |= (prefixes & PREFIX_DATA);
15255 }
15256 OP_E (bytemode, sizeflag);
15257 return;
15258 }
15259
15260 /* Skip mod/rm byte. */
15261 MODRM_CHECK;
15262 codep++;
15263 used_prefixes |= (prefixes & PREFIX_DATA);
15264 oappend (names_mm[modrm.rm]);
15265 }
15266
15267 static void
15268 OP_MXC (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15269 {
15270 used_prefixes |= (prefixes & PREFIX_DATA);
15271 oappend (names_mm[modrm.reg]);
15272 }
15273
15274 static void
15275 OP_EX (int bytemode, int sizeflag)
15276 {
15277 int reg;
15278 const char **names;
15279
15280 /* Skip mod/rm byte. */
15281 MODRM_CHECK;
15282 codep++;
15283
15284 if (modrm.mod != 3)
15285 {
15286 OP_E_memory (bytemode, sizeflag);
15287 return;
15288 }
15289
15290 reg = modrm.rm;
15291 USED_REX (REX_B);
15292 if (rex & REX_B)
15293 reg += 8;
15294 if (vex.evex)
15295 {
15296 USED_REX (REX_X);
15297 if ((rex & REX_X))
15298 reg += 16;
15299 }
15300
15301 if ((sizeflag & SUFFIX_ALWAYS)
15302 && (bytemode == x_swap_mode
15303 || bytemode == d_swap_mode
15304 || bytemode == d_scalar_swap_mode
15305 || bytemode == q_swap_mode
15306 || bytemode == q_scalar_swap_mode))
15307 swap_operand ();
15308
15309 if (need_vex
15310 && bytemode != xmm_mode
15311 && bytemode != xmmdw_mode
15312 && bytemode != xmmqd_mode
15313 && bytemode != xmm_mb_mode
15314 && bytemode != xmm_mw_mode
15315 && bytemode != xmm_md_mode
15316 && bytemode != xmm_mq_mode
15317 && bytemode != xmm_mdq_mode
15318 && bytemode != xmmq_mode
15319 && bytemode != evex_half_bcst_xmmq_mode
15320 && bytemode != ymm_mode
15321 && bytemode != d_scalar_mode
15322 && bytemode != d_scalar_swap_mode
15323 && bytemode != q_scalar_mode
15324 && bytemode != q_scalar_swap_mode
15325 && bytemode != vex_scalar_w_dq_mode)
15326 {
15327 switch (vex.length)
15328 {
15329 case 128:
15330 names = names_xmm;
15331 break;
15332 case 256:
15333 names = names_ymm;
15334 break;
15335 case 512:
15336 names = names_zmm;
15337 break;
15338 default:
15339 abort ();
15340 }
15341 }
15342 else if (bytemode == xmmq_mode
15343 || bytemode == evex_half_bcst_xmmq_mode)
15344 {
15345 switch (vex.length)
15346 {
15347 case 128:
15348 case 256:
15349 names = names_xmm;
15350 break;
15351 case 512:
15352 names = names_ymm;
15353 break;
15354 default:
15355 abort ();
15356 }
15357 }
15358 else if (bytemode == ymm_mode)
15359 names = names_ymm;
15360 else
15361 names = names_xmm;
15362 oappend (names[reg]);
15363 }
15364
15365 static void
15366 OP_MS (int bytemode, int sizeflag)
15367 {
15368 if (modrm.mod == 3)
15369 OP_EM (bytemode, sizeflag);
15370 else
15371 BadOp ();
15372 }
15373
15374 static void
15375 OP_XS (int bytemode, int sizeflag)
15376 {
15377 if (modrm.mod == 3)
15378 OP_EX (bytemode, sizeflag);
15379 else
15380 BadOp ();
15381 }
15382
15383 static void
15384 OP_M (int bytemode, int sizeflag)
15385 {
15386 if (modrm.mod == 3)
15387 /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
15388 BadOp ();
15389 else
15390 OP_E (bytemode, sizeflag);
15391 }
15392
15393 static void
15394 OP_0f07 (int bytemode, int sizeflag)
15395 {
15396 if (modrm.mod != 3 || modrm.rm != 0)
15397 BadOp ();
15398 else
15399 OP_E (bytemode, sizeflag);
15400 }
15401
15402 /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
15403 32bit mode and "xchg %rax,%rax" in 64bit mode. */
15404
15405 static void
15406 NOP_Fixup1 (int bytemode, int sizeflag)
15407 {
15408 if ((prefixes & PREFIX_DATA) != 0
15409 || (rex != 0
15410 && rex != 0x48
15411 && address_mode == mode_64bit))
15412 OP_REG (bytemode, sizeflag);
15413 else
15414 strcpy (obuf, "nop");
15415 }
15416
15417 static void
15418 NOP_Fixup2 (int bytemode, int sizeflag)
15419 {
15420 if ((prefixes & PREFIX_DATA) != 0
15421 || (rex != 0
15422 && rex != 0x48
15423 && address_mode == mode_64bit))
15424 OP_IMREG (bytemode, sizeflag);
15425 }
15426
15427 static const char *const Suffix3DNow[] = {
15428 /* 00 */ NULL, NULL, NULL, NULL,
15429 /* 04 */ NULL, NULL, NULL, NULL,
15430 /* 08 */ NULL, NULL, NULL, NULL,
15431 /* 0C */ "pi2fw", "pi2fd", NULL, NULL,
15432 /* 10 */ NULL, NULL, NULL, NULL,
15433 /* 14 */ NULL, NULL, NULL, NULL,
15434 /* 18 */ NULL, NULL, NULL, NULL,
15435 /* 1C */ "pf2iw", "pf2id", NULL, NULL,
15436 /* 20 */ NULL, NULL, NULL, NULL,
15437 /* 24 */ NULL, NULL, NULL, NULL,
15438 /* 28 */ NULL, NULL, NULL, NULL,
15439 /* 2C */ NULL, NULL, NULL, NULL,
15440 /* 30 */ NULL, NULL, NULL, NULL,
15441 /* 34 */ NULL, NULL, NULL, NULL,
15442 /* 38 */ NULL, NULL, NULL, NULL,
15443 /* 3C */ NULL, NULL, NULL, NULL,
15444 /* 40 */ NULL, NULL, NULL, NULL,
15445 /* 44 */ NULL, NULL, NULL, NULL,
15446 /* 48 */ NULL, NULL, NULL, NULL,
15447 /* 4C */ NULL, NULL, NULL, NULL,
15448 /* 50 */ NULL, NULL, NULL, NULL,
15449 /* 54 */ NULL, NULL, NULL, NULL,
15450 /* 58 */ NULL, NULL, NULL, NULL,
15451 /* 5C */ NULL, NULL, NULL, NULL,
15452 /* 60 */ NULL, NULL, NULL, NULL,
15453 /* 64 */ NULL, NULL, NULL, NULL,
15454 /* 68 */ NULL, NULL, NULL, NULL,
15455 /* 6C */ NULL, NULL, NULL, NULL,
15456 /* 70 */ NULL, NULL, NULL, NULL,
15457 /* 74 */ NULL, NULL, NULL, NULL,
15458 /* 78 */ NULL, NULL, NULL, NULL,
15459 /* 7C */ NULL, NULL, NULL, NULL,
15460 /* 80 */ NULL, NULL, NULL, NULL,
15461 /* 84 */ NULL, NULL, NULL, NULL,
15462 /* 88 */ NULL, NULL, "pfnacc", NULL,
15463 /* 8C */ NULL, NULL, "pfpnacc", NULL,
15464 /* 90 */ "pfcmpge", NULL, NULL, NULL,
15465 /* 94 */ "pfmin", NULL, "pfrcp", "pfrsqrt",
15466 /* 98 */ NULL, NULL, "pfsub", NULL,
15467 /* 9C */ NULL, NULL, "pfadd", NULL,
15468 /* A0 */ "pfcmpgt", NULL, NULL, NULL,
15469 /* A4 */ "pfmax", NULL, "pfrcpit1", "pfrsqit1",
15470 /* A8 */ NULL, NULL, "pfsubr", NULL,
15471 /* AC */ NULL, NULL, "pfacc", NULL,
15472 /* B0 */ "pfcmpeq", NULL, NULL, NULL,
15473 /* B4 */ "pfmul", NULL, "pfrcpit2", "pmulhrw",
15474 /* B8 */ NULL, NULL, NULL, "pswapd",
15475 /* BC */ NULL, NULL, NULL, "pavgusb",
15476 /* C0 */ NULL, NULL, NULL, NULL,
15477 /* C4 */ NULL, NULL, NULL, NULL,
15478 /* C8 */ NULL, NULL, NULL, NULL,
15479 /* CC */ NULL, NULL, NULL, NULL,
15480 /* D0 */ NULL, NULL, NULL, NULL,
15481 /* D4 */ NULL, NULL, NULL, NULL,
15482 /* D8 */ NULL, NULL, NULL, NULL,
15483 /* DC */ NULL, NULL, NULL, NULL,
15484 /* E0 */ NULL, NULL, NULL, NULL,
15485 /* E4 */ NULL, NULL, NULL, NULL,
15486 /* E8 */ NULL, NULL, NULL, NULL,
15487 /* EC */ NULL, NULL, NULL, NULL,
15488 /* F0 */ NULL, NULL, NULL, NULL,
15489 /* F4 */ NULL, NULL, NULL, NULL,
15490 /* F8 */ NULL, NULL, NULL, NULL,
15491 /* FC */ NULL, NULL, NULL, NULL,
15492 };
15493
15494 static void
15495 OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15496 {
15497 const char *mnemonic;
15498
15499 FETCH_DATA (the_info, codep + 1);
15500 /* AMD 3DNow! instructions are specified by an opcode suffix in the
15501 place where an 8-bit immediate would normally go. ie. the last
15502 byte of the instruction. */
15503 obufp = mnemonicendp;
15504 mnemonic = Suffix3DNow[*codep++ & 0xff];
15505 if (mnemonic)
15506 oappend (mnemonic);
15507 else
15508 {
15509 /* Since a variable sized modrm/sib chunk is between the start
15510 of the opcode (0x0f0f) and the opcode suffix, we need to do
15511 all the modrm processing first, and don't know until now that
15512 we have a bad opcode. This necessitates some cleaning up. */
15513 op_out[0][0] = '\0';
15514 op_out[1][0] = '\0';
15515 BadOp ();
15516 }
15517 mnemonicendp = obufp;
15518 }
15519
15520 static struct op simd_cmp_op[] =
15521 {
15522 { STRING_COMMA_LEN ("eq") },
15523 { STRING_COMMA_LEN ("lt") },
15524 { STRING_COMMA_LEN ("le") },
15525 { STRING_COMMA_LEN ("unord") },
15526 { STRING_COMMA_LEN ("neq") },
15527 { STRING_COMMA_LEN ("nlt") },
15528 { STRING_COMMA_LEN ("nle") },
15529 { STRING_COMMA_LEN ("ord") }
15530 };
15531
15532 static void
15533 CMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15534 {
15535 unsigned int cmp_type;
15536
15537 FETCH_DATA (the_info, codep + 1);
15538 cmp_type = *codep++ & 0xff;
15539 if (cmp_type < ARRAY_SIZE (simd_cmp_op))
15540 {
15541 char suffix [3];
15542 char *p = mnemonicendp - 2;
15543 suffix[0] = p[0];
15544 suffix[1] = p[1];
15545 suffix[2] = '\0';
15546 sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
15547 mnemonicendp += simd_cmp_op[cmp_type].len;
15548 }
15549 else
15550 {
15551 /* We have a reserved extension byte. Output it directly. */
15552 scratchbuf[0] = '$';
15553 print_operand_value (scratchbuf + 1, 1, cmp_type);
15554 oappend_maybe_intel (scratchbuf);
15555 scratchbuf[0] = '\0';
15556 }
15557 }
15558
15559 static void
15560 OP_Mwaitx (int bytemode ATTRIBUTE_UNUSED,
15561 int sizeflag ATTRIBUTE_UNUSED)
15562 {
15563 /* mwaitx %eax,%ecx,%ebx */
15564 if (!intel_syntax)
15565 {
15566 const char **names = (address_mode == mode_64bit
15567 ? names64 : names32);
15568 strcpy (op_out[0], names[0]);
15569 strcpy (op_out[1], names[1]);
15570 strcpy (op_out[2], names[3]);
15571 two_source_ops = 1;
15572 }
15573 /* Skip mod/rm byte. */
15574 MODRM_CHECK;
15575 codep++;
15576 }
15577
15578 static void
15579 OP_Mwait (int bytemode ATTRIBUTE_UNUSED,
15580 int sizeflag ATTRIBUTE_UNUSED)
15581 {
15582 /* mwait %eax,%ecx */
15583 if (!intel_syntax)
15584 {
15585 const char **names = (address_mode == mode_64bit
15586 ? names64 : names32);
15587 strcpy (op_out[0], names[0]);
15588 strcpy (op_out[1], names[1]);
15589 two_source_ops = 1;
15590 }
15591 /* Skip mod/rm byte. */
15592 MODRM_CHECK;
15593 codep++;
15594 }
15595
15596 static void
15597 OP_Monitor (int bytemode ATTRIBUTE_UNUSED,
15598 int sizeflag ATTRIBUTE_UNUSED)
15599 {
15600 /* monitor %eax,%ecx,%edx" */
15601 if (!intel_syntax)
15602 {
15603 const char **op1_names;
15604 const char **names = (address_mode == mode_64bit
15605 ? names64 : names32);
15606
15607 if (!(prefixes & PREFIX_ADDR))
15608 op1_names = (address_mode == mode_16bit
15609 ? names16 : names);
15610 else
15611 {
15612 /* Remove "addr16/addr32". */
15613 all_prefixes[last_addr_prefix] = 0;
15614 op1_names = (address_mode != mode_32bit
15615 ? names32 : names16);
15616 used_prefixes |= PREFIX_ADDR;
15617 }
15618 strcpy (op_out[0], op1_names[0]);
15619 strcpy (op_out[1], names[1]);
15620 strcpy (op_out[2], names[2]);
15621 two_source_ops = 1;
15622 }
15623 /* Skip mod/rm byte. */
15624 MODRM_CHECK;
15625 codep++;
15626 }
15627
15628 static void
15629 BadOp (void)
15630 {
15631 /* Throw away prefixes and 1st. opcode byte. */
15632 codep = insn_codep + 1;
15633 oappend ("(bad)");
15634 }
15635
15636 static void
15637 REP_Fixup (int bytemode, int sizeflag)
15638 {
15639 /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
15640 lods and stos. */
15641 if (prefixes & PREFIX_REPZ)
15642 all_prefixes[last_repz_prefix] = REP_PREFIX;
15643
15644 switch (bytemode)
15645 {
15646 case al_reg:
15647 case eAX_reg:
15648 case indir_dx_reg:
15649 OP_IMREG (bytemode, sizeflag);
15650 break;
15651 case eDI_reg:
15652 OP_ESreg (bytemode, sizeflag);
15653 break;
15654 case eSI_reg:
15655 OP_DSreg (bytemode, sizeflag);
15656 break;
15657 default:
15658 abort ();
15659 break;
15660 }
15661 }
15662
15663 /* For BND-prefixed instructions 0xF2 prefix should be displayed as
15664 "bnd". */
15665
15666 static void
15667 BND_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15668 {
15669 if (prefixes & PREFIX_REPNZ)
15670 all_prefixes[last_repnz_prefix] = BND_PREFIX;
15671 }
15672
15673 /* For NOTRACK-prefixed instructions, 0x3E prefix should be displayed as
15674 "notrack". */
15675
15676 static void
15677 NOTRACK_Fixup (int bytemode ATTRIBUTE_UNUSED,
15678 int sizeflag ATTRIBUTE_UNUSED)
15679 {
15680 if (active_seg_prefix == PREFIX_DS
15681 && (address_mode != mode_64bit || last_data_prefix < 0))
15682 {
15683 /* NOTRACK prefix is only valid on indirect branch instructions.
15684 NB: DATA prefix is unsupported for Intel64. */
15685 active_seg_prefix = 0;
15686 all_prefixes[last_seg_prefix] = NOTRACK_PREFIX;
15687 }
15688 }
15689
15690 /* Similar to OP_E. But the 0xf2/0xf3 prefixes should be displayed as
15691 "xacquire"/"xrelease" for memory operand if there is a LOCK prefix.
15692 */
15693
15694 static void
15695 HLE_Fixup1 (int bytemode, int sizeflag)
15696 {
15697 if (modrm.mod != 3
15698 && (prefixes & PREFIX_LOCK) != 0)
15699 {
15700 if (prefixes & PREFIX_REPZ)
15701 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
15702 if (prefixes & PREFIX_REPNZ)
15703 all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
15704 }
15705
15706 OP_E (bytemode, sizeflag);
15707 }
15708
15709 /* Similar to OP_E. But the 0xf2/0xf3 prefixes should be displayed as
15710 "xacquire"/"xrelease" for memory operand. No check for LOCK prefix.
15711 */
15712
15713 static void
15714 HLE_Fixup2 (int bytemode, int sizeflag)
15715 {
15716 if (modrm.mod != 3)
15717 {
15718 if (prefixes & PREFIX_REPZ)
15719 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
15720 if (prefixes & PREFIX_REPNZ)
15721 all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
15722 }
15723
15724 OP_E (bytemode, sizeflag);
15725 }
15726
15727 /* Similar to OP_E. But the 0xf3 prefixes should be displayed as
15728 "xrelease" for memory operand. No check for LOCK prefix. */
15729
15730 static void
15731 HLE_Fixup3 (int bytemode, int sizeflag)
15732 {
15733 if (modrm.mod != 3
15734 && last_repz_prefix > last_repnz_prefix
15735 && (prefixes & PREFIX_REPZ) != 0)
15736 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
15737
15738 OP_E (bytemode, sizeflag);
15739 }
15740
15741 static void
15742 CMPXCHG8B_Fixup (int bytemode, int sizeflag)
15743 {
15744 USED_REX (REX_W);
15745 if (rex & REX_W)
15746 {
15747 /* Change cmpxchg8b to cmpxchg16b. */
15748 char *p = mnemonicendp - 2;
15749 mnemonicendp = stpcpy (p, "16b");
15750 bytemode = o_mode;
15751 }
15752 else if ((prefixes & PREFIX_LOCK) != 0)
15753 {
15754 if (prefixes & PREFIX_REPZ)
15755 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
15756 if (prefixes & PREFIX_REPNZ)
15757 all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
15758 }
15759
15760 OP_M (bytemode, sizeflag);
15761 }
15762
15763 static void
15764 XMM_Fixup (int reg, int sizeflag ATTRIBUTE_UNUSED)
15765 {
15766 const char **names;
15767
15768 if (need_vex)
15769 {
15770 switch (vex.length)
15771 {
15772 case 128:
15773 names = names_xmm;
15774 break;
15775 case 256:
15776 names = names_ymm;
15777 break;
15778 default:
15779 abort ();
15780 }
15781 }
15782 else
15783 names = names_xmm;
15784 oappend (names[reg]);
15785 }
15786
15787 static void
15788 CRC32_Fixup (int bytemode, int sizeflag)
15789 {
15790 /* Add proper suffix to "crc32". */
15791 char *p = mnemonicendp;
15792
15793 switch (bytemode)
15794 {
15795 case b_mode:
15796 if (intel_syntax)
15797 goto skip;
15798
15799 *p++ = 'b';
15800 break;
15801 case v_mode:
15802 if (intel_syntax)
15803 goto skip;
15804
15805 USED_REX (REX_W);
15806 if (rex & REX_W)
15807 *p++ = 'q';
15808 else
15809 {
15810 if (sizeflag & DFLAG)
15811 *p++ = 'l';
15812 else
15813 *p++ = 'w';
15814 used_prefixes |= (prefixes & PREFIX_DATA);
15815 }
15816 break;
15817 default:
15818 oappend (INTERNAL_DISASSEMBLER_ERROR);
15819 break;
15820 }
15821 mnemonicendp = p;
15822 *p = '\0';
15823
15824 skip:
15825 if (modrm.mod == 3)
15826 {
15827 int add;
15828
15829 /* Skip mod/rm byte. */
15830 MODRM_CHECK;
15831 codep++;
15832
15833 USED_REX (REX_B);
15834 add = (rex & REX_B) ? 8 : 0;
15835 if (bytemode == b_mode)
15836 {
15837 USED_REX (0);
15838 if (rex)
15839 oappend (names8rex[modrm.rm + add]);
15840 else
15841 oappend (names8[modrm.rm + add]);
15842 }
15843 else
15844 {
15845 USED_REX (REX_W);
15846 if (rex & REX_W)
15847 oappend (names64[modrm.rm + add]);
15848 else if ((prefixes & PREFIX_DATA))
15849 oappend (names16[modrm.rm + add]);
15850 else
15851 oappend (names32[modrm.rm + add]);
15852 }
15853 }
15854 else
15855 OP_E (bytemode, sizeflag);
15856 }
15857
15858 static void
15859 FXSAVE_Fixup (int bytemode, int sizeflag)
15860 {
15861 /* Add proper suffix to "fxsave" and "fxrstor". */
15862 USED_REX (REX_W);
15863 if (rex & REX_W)
15864 {
15865 char *p = mnemonicendp;
15866 *p++ = '6';
15867 *p++ = '4';
15868 *p = '\0';
15869 mnemonicendp = p;
15870 }
15871 OP_M (bytemode, sizeflag);
15872 }
15873
15874 static void
15875 PCMPESTR_Fixup (int bytemode, int sizeflag)
15876 {
15877 /* Add proper suffix to "{,v}pcmpestr{i,m}". */
15878 if (!intel_syntax)
15879 {
15880 char *p = mnemonicendp;
15881
15882 USED_REX (REX_W);
15883 if (rex & REX_W)
15884 *p++ = 'q';
15885 else if (sizeflag & SUFFIX_ALWAYS)
15886 *p++ = 'l';
15887
15888 *p = '\0';
15889 mnemonicendp = p;
15890 }
15891
15892 OP_EX (bytemode, sizeflag);
15893 }
15894
15895 /* Display the destination register operand for instructions with
15896 VEX. */
15897
15898 static void
15899 OP_VEX (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
15900 {
15901 int reg;
15902 const char **names;
15903
15904 if (!need_vex)
15905 abort ();
15906
15907 if (!need_vex_reg)
15908 return;
15909
15910 reg = vex.register_specifier;
15911 if (address_mode != mode_64bit)
15912 reg &= 7;
15913 else if (vex.evex && !vex.v)
15914 reg += 16;
15915
15916 if (bytemode == vex_scalar_mode)
15917 {
15918 oappend (names_xmm[reg]);
15919 return;
15920 }
15921
15922 switch (vex.length)
15923 {
15924 case 128:
15925 switch (bytemode)
15926 {
15927 case vex_mode:
15928 case vex128_mode:
15929 case vex_vsib_q_w_dq_mode:
15930 case vex_vsib_q_w_d_mode:
15931 names = names_xmm;
15932 break;
15933 case dq_mode:
15934 if (rex & REX_W)
15935 names = names64;
15936 else
15937 names = names32;
15938 break;
15939 case mask_bd_mode:
15940 case mask_mode:
15941 if (reg > 0x7)
15942 {
15943 oappend ("(bad)");
15944 return;
15945 }
15946 names = names_mask;
15947 break;
15948 default:
15949 abort ();
15950 return;
15951 }
15952 break;
15953 case 256:
15954 switch (bytemode)
15955 {
15956 case vex_mode:
15957 case vex256_mode:
15958 names = names_ymm;
15959 break;
15960 case vex_vsib_q_w_dq_mode:
15961 case vex_vsib_q_w_d_mode:
15962 names = vex.w ? names_ymm : names_xmm;
15963 break;
15964 case mask_bd_mode:
15965 case mask_mode:
15966 if (reg > 0x7)
15967 {
15968 oappend ("(bad)");
15969 return;
15970 }
15971 names = names_mask;
15972 break;
15973 default:
15974 /* See PR binutils/20893 for a reproducer. */
15975 oappend ("(bad)");
15976 return;
15977 }
15978 break;
15979 case 512:
15980 names = names_zmm;
15981 break;
15982 default:
15983 abort ();
15984 break;
15985 }
15986 oappend (names[reg]);
15987 }
15988
15989 /* Get the VEX immediate byte without moving codep. */
15990
15991 static unsigned char
15992 get_vex_imm8 (int sizeflag, int opnum)
15993 {
15994 int bytes_before_imm = 0;
15995
15996 if (modrm.mod != 3)
15997 {
15998 /* There are SIB/displacement bytes. */
15999 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
16000 {
16001 /* 32/64 bit address mode */
16002 int base = modrm.rm;
16003
16004 /* Check SIB byte. */
16005 if (base == 4)
16006 {
16007 FETCH_DATA (the_info, codep + 1);
16008 base = *codep & 7;
16009 /* When decoding the third source, don't increase
16010 bytes_before_imm as this has already been incremented
16011 by one in OP_E_memory while decoding the second
16012 source operand. */
16013 if (opnum == 0)
16014 bytes_before_imm++;
16015 }
16016
16017 /* Don't increase bytes_before_imm when decoding the third source,
16018 it has already been incremented by OP_E_memory while decoding
16019 the second source operand. */
16020 if (opnum == 0)
16021 {
16022 switch (modrm.mod)
16023 {
16024 case 0:
16025 /* When modrm.rm == 5 or modrm.rm == 4 and base in
16026 SIB == 5, there is a 4 byte displacement. */
16027 if (base != 5)
16028 /* No displacement. */
16029 break;
16030 /* Fall through. */
16031 case 2:
16032 /* 4 byte displacement. */
16033 bytes_before_imm += 4;
16034 break;
16035 case 1:
16036 /* 1 byte displacement. */
16037 bytes_before_imm++;
16038 break;
16039 }
16040 }
16041 }
16042 else
16043 {
16044 /* 16 bit address mode */
16045 /* Don't increase bytes_before_imm when decoding the third source,
16046 it has already been incremented by OP_E_memory while decoding
16047 the second source operand. */
16048 if (opnum == 0)
16049 {
16050 switch (modrm.mod)
16051 {
16052 case 0:
16053 /* When modrm.rm == 6, there is a 2 byte displacement. */
16054 if (modrm.rm != 6)
16055 /* No displacement. */
16056 break;
16057 /* Fall through. */
16058 case 2:
16059 /* 2 byte displacement. */
16060 bytes_before_imm += 2;
16061 break;
16062 case 1:
16063 /* 1 byte displacement: when decoding the third source,
16064 don't increase bytes_before_imm as this has already
16065 been incremented by one in OP_E_memory while decoding
16066 the second source operand. */
16067 if (opnum == 0)
16068 bytes_before_imm++;
16069
16070 break;
16071 }
16072 }
16073 }
16074 }
16075
16076 FETCH_DATA (the_info, codep + bytes_before_imm + 1);
16077 return codep [bytes_before_imm];
16078 }
16079
16080 static void
16081 OP_EX_VexReg (int bytemode, int sizeflag, int reg)
16082 {
16083 const char **names;
16084
16085 if (reg == -1 && modrm.mod != 3)
16086 {
16087 OP_E_memory (bytemode, sizeflag);
16088 return;
16089 }
16090 else
16091 {
16092 if (reg == -1)
16093 {
16094 reg = modrm.rm;
16095 USED_REX (REX_B);
16096 if (rex & REX_B)
16097 reg += 8;
16098 }
16099 if (address_mode != mode_64bit)
16100 reg &= 7;
16101 }
16102
16103 switch (vex.length)
16104 {
16105 case 128:
16106 names = names_xmm;
16107 break;
16108 case 256:
16109 names = names_ymm;
16110 break;
16111 default:
16112 abort ();
16113 }
16114 oappend (names[reg]);
16115 }
16116
16117 static void
16118 OP_EX_VexImmW (int bytemode, int sizeflag)
16119 {
16120 int reg = -1;
16121 static unsigned char vex_imm8;
16122
16123 if (vex_w_done == 0)
16124 {
16125 vex_w_done = 1;
16126
16127 /* Skip mod/rm byte. */
16128 MODRM_CHECK;
16129 codep++;
16130
16131 vex_imm8 = get_vex_imm8 (sizeflag, 0);
16132
16133 if (vex.w)
16134 reg = vex_imm8 >> 4;
16135
16136 OP_EX_VexReg (bytemode, sizeflag, reg);
16137 }
16138 else if (vex_w_done == 1)
16139 {
16140 vex_w_done = 2;
16141
16142 if (!vex.w)
16143 reg = vex_imm8 >> 4;
16144
16145 OP_EX_VexReg (bytemode, sizeflag, reg);
16146 }
16147 else
16148 {
16149 /* Output the imm8 directly. */
16150 scratchbuf[0] = '$';
16151 print_operand_value (scratchbuf + 1, 1, vex_imm8 & 0xf);
16152 oappend_maybe_intel (scratchbuf);
16153 scratchbuf[0] = '\0';
16154 codep++;
16155 }
16156 }
16157
16158 static void
16159 OP_Vex_2src (int bytemode, int sizeflag)
16160 {
16161 if (modrm.mod == 3)
16162 {
16163 int reg = modrm.rm;
16164 USED_REX (REX_B);
16165 if (rex & REX_B)
16166 reg += 8;
16167 oappend (names_xmm[reg]);
16168 }
16169 else
16170 {
16171 if (intel_syntax
16172 && (bytemode == v_mode || bytemode == v_swap_mode))
16173 {
16174 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
16175 used_prefixes |= (prefixes & PREFIX_DATA);
16176 }
16177 OP_E (bytemode, sizeflag);
16178 }
16179 }
16180
16181 static void
16182 OP_Vex_2src_1 (int bytemode, int sizeflag)
16183 {
16184 if (modrm.mod == 3)
16185 {
16186 /* Skip mod/rm byte. */
16187 MODRM_CHECK;
16188 codep++;
16189 }
16190
16191 if (vex.w)
16192 {
16193 unsigned int reg = vex.register_specifier;
16194
16195 if (address_mode != mode_64bit)
16196 reg &= 7;
16197 oappend (names_xmm[reg]);
16198 }
16199 else
16200 OP_Vex_2src (bytemode, sizeflag);
16201 }
16202
16203 static void
16204 OP_Vex_2src_2 (int bytemode, int sizeflag)
16205 {
16206 if (vex.w)
16207 OP_Vex_2src (bytemode, sizeflag);
16208 else
16209 {
16210 unsigned int reg = vex.register_specifier;
16211
16212 if (address_mode != mode_64bit)
16213 reg &= 7;
16214 oappend (names_xmm[reg]);
16215 }
16216 }
16217
16218 static void
16219 OP_EX_VexW (int bytemode, int sizeflag)
16220 {
16221 int reg = -1;
16222
16223 if (!vex_w_done)
16224 {
16225 /* Skip mod/rm byte. */
16226 MODRM_CHECK;
16227 codep++;
16228
16229 if (vex.w)
16230 reg = get_vex_imm8 (sizeflag, 0) >> 4;
16231 }
16232 else
16233 {
16234 if (!vex.w)
16235 reg = get_vex_imm8 (sizeflag, 1) >> 4;
16236 }
16237
16238 OP_EX_VexReg (bytemode, sizeflag, reg);
16239
16240 if (vex_w_done)
16241 codep++;
16242 vex_w_done = 1;
16243 }
16244
16245 static void
16246 OP_REG_VexI4 (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
16247 {
16248 int reg;
16249 const char **names;
16250
16251 FETCH_DATA (the_info, codep + 1);
16252 reg = *codep++;
16253
16254 if (bytemode != x_mode)
16255 abort ();
16256
16257 reg >>= 4;
16258 if (address_mode != mode_64bit)
16259 reg &= 7;
16260
16261 switch (vex.length)
16262 {
16263 case 128:
16264 names = names_xmm;
16265 break;
16266 case 256:
16267 names = names_ymm;
16268 break;
16269 default:
16270 abort ();
16271 }
16272 oappend (names[reg]);
16273 }
16274
16275 static void
16276 OP_XMM_VexW (int bytemode, int sizeflag)
16277 {
16278 /* Turn off the REX.W bit since it is used for swapping operands
16279 now. */
16280 rex &= ~REX_W;
16281 OP_XMM (bytemode, sizeflag);
16282 }
16283
16284 static void
16285 OP_EX_Vex (int bytemode, int sizeflag)
16286 {
16287 if (modrm.mod != 3)
16288 {
16289 if (vex.register_specifier != 0)
16290 BadOp ();
16291 need_vex_reg = 0;
16292 }
16293 OP_EX (bytemode, sizeflag);
16294 }
16295
16296 static void
16297 OP_XMM_Vex (int bytemode, int sizeflag)
16298 {
16299 if (modrm.mod != 3)
16300 {
16301 if (vex.register_specifier != 0)
16302 BadOp ();
16303 need_vex_reg = 0;
16304 }
16305 OP_XMM (bytemode, sizeflag);
16306 }
16307
16308 static struct op vex_cmp_op[] =
16309 {
16310 { STRING_COMMA_LEN ("eq") },
16311 { STRING_COMMA_LEN ("lt") },
16312 { STRING_COMMA_LEN ("le") },
16313 { STRING_COMMA_LEN ("unord") },
16314 { STRING_COMMA_LEN ("neq") },
16315 { STRING_COMMA_LEN ("nlt") },
16316 { STRING_COMMA_LEN ("nle") },
16317 { STRING_COMMA_LEN ("ord") },
16318 { STRING_COMMA_LEN ("eq_uq") },
16319 { STRING_COMMA_LEN ("nge") },
16320 { STRING_COMMA_LEN ("ngt") },
16321 { STRING_COMMA_LEN ("false") },
16322 { STRING_COMMA_LEN ("neq_oq") },
16323 { STRING_COMMA_LEN ("ge") },
16324 { STRING_COMMA_LEN ("gt") },
16325 { STRING_COMMA_LEN ("true") },
16326 { STRING_COMMA_LEN ("eq_os") },
16327 { STRING_COMMA_LEN ("lt_oq") },
16328 { STRING_COMMA_LEN ("le_oq") },
16329 { STRING_COMMA_LEN ("unord_s") },
16330 { STRING_COMMA_LEN ("neq_us") },
16331 { STRING_COMMA_LEN ("nlt_uq") },
16332 { STRING_COMMA_LEN ("nle_uq") },
16333 { STRING_COMMA_LEN ("ord_s") },
16334 { STRING_COMMA_LEN ("eq_us") },
16335 { STRING_COMMA_LEN ("nge_uq") },
16336 { STRING_COMMA_LEN ("ngt_uq") },
16337 { STRING_COMMA_LEN ("false_os") },
16338 { STRING_COMMA_LEN ("neq_os") },
16339 { STRING_COMMA_LEN ("ge_oq") },
16340 { STRING_COMMA_LEN ("gt_oq") },
16341 { STRING_COMMA_LEN ("true_us") },
16342 };
16343
16344 static void
16345 VCMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
16346 {
16347 unsigned int cmp_type;
16348
16349 FETCH_DATA (the_info, codep + 1);
16350 cmp_type = *codep++ & 0xff;
16351 if (cmp_type < ARRAY_SIZE (vex_cmp_op))
16352 {
16353 char suffix [3];
16354 char *p = mnemonicendp - 2;
16355 suffix[0] = p[0];
16356 suffix[1] = p[1];
16357 suffix[2] = '\0';
16358 sprintf (p, "%s%s", vex_cmp_op[cmp_type].name, suffix);
16359 mnemonicendp += vex_cmp_op[cmp_type].len;
16360 }
16361 else
16362 {
16363 /* We have a reserved extension byte. Output it directly. */
16364 scratchbuf[0] = '$';
16365 print_operand_value (scratchbuf + 1, 1, cmp_type);
16366 oappend_maybe_intel (scratchbuf);
16367 scratchbuf[0] = '\0';
16368 }
16369 }
16370
16371 static void
16372 VPCMP_Fixup (int bytemode ATTRIBUTE_UNUSED,
16373 int sizeflag ATTRIBUTE_UNUSED)
16374 {
16375 unsigned int cmp_type;
16376
16377 if (!vex.evex)
16378 abort ();
16379
16380 FETCH_DATA (the_info, codep + 1);
16381 cmp_type = *codep++ & 0xff;
16382 /* There are aliases for immediates 0, 1, 2, 4, 5, 6.
16383 If it's the case, print suffix, otherwise - print the immediate. */
16384 if (cmp_type < ARRAY_SIZE (simd_cmp_op)
16385 && cmp_type != 3
16386 && cmp_type != 7)
16387 {
16388 char suffix [3];
16389 char *p = mnemonicendp - 2;
16390
16391 /* vpcmp* can have both one- and two-lettered suffix. */
16392 if (p[0] == 'p')
16393 {
16394 p++;
16395 suffix[0] = p[0];
16396 suffix[1] = '\0';
16397 }
16398 else
16399 {
16400 suffix[0] = p[0];
16401 suffix[1] = p[1];
16402 suffix[2] = '\0';
16403 }
16404
16405 sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
16406 mnemonicendp += simd_cmp_op[cmp_type].len;
16407 }
16408 else
16409 {
16410 /* We have a reserved extension byte. Output it directly. */
16411 scratchbuf[0] = '$';
16412 print_operand_value (scratchbuf + 1, 1, cmp_type);
16413 oappend_maybe_intel (scratchbuf);
16414 scratchbuf[0] = '\0';
16415 }
16416 }
16417
16418 static const struct op xop_cmp_op[] =
16419 {
16420 { STRING_COMMA_LEN ("lt") },
16421 { STRING_COMMA_LEN ("le") },
16422 { STRING_COMMA_LEN ("gt") },
16423 { STRING_COMMA_LEN ("ge") },
16424 { STRING_COMMA_LEN ("eq") },
16425 { STRING_COMMA_LEN ("neq") },
16426 { STRING_COMMA_LEN ("false") },
16427 { STRING_COMMA_LEN ("true") }
16428 };
16429
16430 static void
16431 VPCOM_Fixup (int bytemode ATTRIBUTE_UNUSED,
16432 int sizeflag ATTRIBUTE_UNUSED)
16433 {
16434 unsigned int cmp_type;
16435
16436 FETCH_DATA (the_info, codep + 1);
16437 cmp_type = *codep++ & 0xff;
16438 if (cmp_type < ARRAY_SIZE (xop_cmp_op))
16439 {
16440 char suffix[3];
16441 char *p = mnemonicendp - 2;
16442
16443 /* vpcom* can have both one- and two-lettered suffix. */
16444 if (p[0] == 'm')
16445 {
16446 p++;
16447 suffix[0] = p[0];
16448 suffix[1] = '\0';
16449 }
16450 else
16451 {
16452 suffix[0] = p[0];
16453 suffix[1] = p[1];
16454 suffix[2] = '\0';
16455 }
16456
16457 sprintf (p, "%s%s", xop_cmp_op[cmp_type].name, suffix);
16458 mnemonicendp += xop_cmp_op[cmp_type].len;
16459 }
16460 else
16461 {
16462 /* We have a reserved extension byte. Output it directly. */
16463 scratchbuf[0] = '$';
16464 print_operand_value (scratchbuf + 1, 1, cmp_type);
16465 oappend_maybe_intel (scratchbuf);
16466 scratchbuf[0] = '\0';
16467 }
16468 }
16469
16470 static const struct op pclmul_op[] =
16471 {
16472 { STRING_COMMA_LEN ("lql") },
16473 { STRING_COMMA_LEN ("hql") },
16474 { STRING_COMMA_LEN ("lqh") },
16475 { STRING_COMMA_LEN ("hqh") }
16476 };
16477
16478 static void
16479 PCLMUL_Fixup (int bytemode ATTRIBUTE_UNUSED,
16480 int sizeflag ATTRIBUTE_UNUSED)
16481 {
16482 unsigned int pclmul_type;
16483
16484 FETCH_DATA (the_info, codep + 1);
16485 pclmul_type = *codep++ & 0xff;
16486 switch (pclmul_type)
16487 {
16488 case 0x10:
16489 pclmul_type = 2;
16490 break;
16491 case 0x11:
16492 pclmul_type = 3;
16493 break;
16494 default:
16495 break;
16496 }
16497 if (pclmul_type < ARRAY_SIZE (pclmul_op))
16498 {
16499 char suffix [4];
16500 char *p = mnemonicendp - 3;
16501 suffix[0] = p[0];
16502 suffix[1] = p[1];
16503 suffix[2] = p[2];
16504 suffix[3] = '\0';
16505 sprintf (p, "%s%s", pclmul_op[pclmul_type].name, suffix);
16506 mnemonicendp += pclmul_op[pclmul_type].len;
16507 }
16508 else
16509 {
16510 /* We have a reserved extension byte. Output it directly. */
16511 scratchbuf[0] = '$';
16512 print_operand_value (scratchbuf + 1, 1, pclmul_type);
16513 oappend_maybe_intel (scratchbuf);
16514 scratchbuf[0] = '\0';
16515 }
16516 }
16517
16518 static void
16519 MOVBE_Fixup (int bytemode, int sizeflag)
16520 {
16521 /* Add proper suffix to "movbe". */
16522 char *p = mnemonicendp;
16523
16524 switch (bytemode)
16525 {
16526 case v_mode:
16527 if (intel_syntax)
16528 goto skip;
16529
16530 USED_REX (REX_W);
16531 if (sizeflag & SUFFIX_ALWAYS)
16532 {
16533 if (rex & REX_W)
16534 *p++ = 'q';
16535 else
16536 {
16537 if (sizeflag & DFLAG)
16538 *p++ = 'l';
16539 else
16540 *p++ = 'w';
16541 used_prefixes |= (prefixes & PREFIX_DATA);
16542 }
16543 }
16544 break;
16545 default:
16546 oappend (INTERNAL_DISASSEMBLER_ERROR);
16547 break;
16548 }
16549 mnemonicendp = p;
16550 *p = '\0';
16551
16552 skip:
16553 OP_M (bytemode, sizeflag);
16554 }
16555
16556 static void
16557 OP_LWPCB_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
16558 {
16559 int reg;
16560 const char **names;
16561
16562 /* Skip mod/rm byte. */
16563 MODRM_CHECK;
16564 codep++;
16565
16566 if (rex & REX_W)
16567 names = names64;
16568 else
16569 names = names32;
16570
16571 reg = modrm.rm;
16572 USED_REX (REX_B);
16573 if (rex & REX_B)
16574 reg += 8;
16575
16576 oappend (names[reg]);
16577 }
16578
16579 static void
16580 OP_LWP_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
16581 {
16582 const char **names;
16583 unsigned int reg = vex.register_specifier;
16584
16585 if (rex & REX_W)
16586 names = names64;
16587 else
16588 names = names32;
16589
16590 if (address_mode != mode_64bit)
16591 reg &= 7;
16592 oappend (names[reg]);
16593 }
16594
16595 static void
16596 OP_Mask (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
16597 {
16598 if (!vex.evex
16599 || (bytemode != mask_mode && bytemode != mask_bd_mode))
16600 abort ();
16601
16602 USED_REX (REX_R);
16603 if ((rex & REX_R) != 0 || !vex.r)
16604 {
16605 BadOp ();
16606 return;
16607 }
16608
16609 oappend (names_mask [modrm.reg]);
16610 }
16611
16612 static void
16613 OP_Rounding (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
16614 {
16615 if (!vex.evex
16616 || (bytemode != evex_rounding_mode
16617 && bytemode != evex_rounding_64_mode
16618 && bytemode != evex_sae_mode))
16619 abort ();
16620 if (modrm.mod == 3 && vex.b)
16621 switch (bytemode)
16622 {
16623 case evex_rounding_64_mode:
16624 if (address_mode != mode_64bit)
16625 {
16626 oappend ("(bad)");
16627 break;
16628 }
16629 /* Fall through. */
16630 case evex_rounding_mode:
16631 oappend (names_rounding[vex.ll]);
16632 break;
16633 case evex_sae_mode:
16634 oappend ("{sae}");
16635 break;
16636 default:
16637 break;
16638 }
16639 }
This page took 0.428641 seconds and 4 git commands to generate.