AArch64: Add SVE constraints verifier.
[deliverable/binutils-gdb.git] / opcodes / i386-dis.c
1 /* Print i386 instructions for GDB, the GNU debugger.
2 Copyright (C) 1988-2018 Free Software Foundation, Inc.
3
4 This file is part of the GNU opcodes library.
5
6 This library is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
9 any later version.
10
11 It is distributed in the hope that it will be useful, but WITHOUT
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
14 License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19 MA 02110-1301, USA. */
20
21
22 /* 80386 instruction printer by Pace Willisson (pace@prep.ai.mit.edu)
23 July 1988
24 modified by John Hassey (hassey@dg-rtp.dg.com)
25 x86-64 support added by Jan Hubicka (jh@suse.cz)
26 VIA PadLock support by Michal Ludvig (mludvig@suse.cz). */
27
28 /* The main tables describing the instructions is essentially a copy
29 of the "Opcode Map" chapter (Appendix A) of the Intel 80386
30 Programmers Manual. Usually, there is a capital letter, followed
31 by a small letter. The capital letter tell the addressing mode,
32 and the small letter tells about the operand size. Refer to
33 the Intel manual for details. */
34
35 #include "sysdep.h"
36 #include "disassemble.h"
37 #include "opintl.h"
38 #include "opcode/i386.h"
39 #include "libiberty.h"
40
41 #include <setjmp.h>
42
43 static int print_insn (bfd_vma, disassemble_info *);
44 static void dofloat (int);
45 static void OP_ST (int, int);
46 static void OP_STi (int, int);
47 static int putop (const char *, int);
48 static void oappend (const char *);
49 static void append_seg (void);
50 static void OP_indirE (int, int);
51 static void print_operand_value (char *, int, bfd_vma);
52 static void OP_E_register (int, int);
53 static void OP_E_memory (int, int);
54 static void print_displacement (char *, bfd_vma);
55 static void OP_E (int, int);
56 static void OP_G (int, int);
57 static bfd_vma get64 (void);
58 static bfd_signed_vma get32 (void);
59 static bfd_signed_vma get32s (void);
60 static int get16 (void);
61 static void set_op (bfd_vma, int);
62 static void OP_Skip_MODRM (int, int);
63 static void OP_REG (int, int);
64 static void OP_IMREG (int, int);
65 static void OP_I (int, int);
66 static void OP_I64 (int, int);
67 static void OP_sI (int, int);
68 static void OP_J (int, int);
69 static void OP_SEG (int, int);
70 static void OP_DIR (int, int);
71 static void OP_OFF (int, int);
72 static void OP_OFF64 (int, int);
73 static void ptr_reg (int, int);
74 static void OP_ESreg (int, int);
75 static void OP_DSreg (int, int);
76 static void OP_C (int, int);
77 static void OP_D (int, int);
78 static void OP_T (int, int);
79 static void OP_R (int, int);
80 static void OP_MMX (int, int);
81 static void OP_XMM (int, int);
82 static void OP_EM (int, int);
83 static void OP_EX (int, int);
84 static void OP_EMC (int,int);
85 static void OP_MXC (int,int);
86 static void OP_MS (int, int);
87 static void OP_XS (int, int);
88 static void OP_M (int, int);
89 static void OP_VEX (int, int);
90 static void OP_EX_Vex (int, int);
91 static void OP_EX_VexW (int, int);
92 static void OP_EX_VexImmW (int, int);
93 static void OP_XMM_Vex (int, int);
94 static void OP_XMM_VexW (int, int);
95 static void OP_Rounding (int, int);
96 static void OP_REG_VexI4 (int, int);
97 static void PCLMUL_Fixup (int, int);
98 static void VCMP_Fixup (int, int);
99 static void VPCMP_Fixup (int, int);
100 static void VPCOM_Fixup (int, int);
101 static void OP_0f07 (int, int);
102 static void OP_Monitor (int, int);
103 static void OP_Mwait (int, int);
104 static void OP_Mwaitx (int, int);
105 static void NOP_Fixup1 (int, int);
106 static void NOP_Fixup2 (int, int);
107 static void OP_3DNowSuffix (int, int);
108 static void CMP_Fixup (int, int);
109 static void BadOp (void);
110 static void REP_Fixup (int, int);
111 static void BND_Fixup (int, int);
112 static void NOTRACK_Fixup (int, int);
113 static void HLE_Fixup1 (int, int);
114 static void HLE_Fixup2 (int, int);
115 static void HLE_Fixup3 (int, int);
116 static void CMPXCHG8B_Fixup (int, int);
117 static void XMM_Fixup (int, int);
118 static void CRC32_Fixup (int, int);
119 static void FXSAVE_Fixup (int, int);
120 static void PCMPESTR_Fixup (int, int);
121 static void OP_LWPCB_E (int, int);
122 static void OP_LWP_E (int, int);
123 static void OP_Vex_2src_1 (int, int);
124 static void OP_Vex_2src_2 (int, int);
125
126 static void MOVBE_Fixup (int, int);
127
128 static void OP_Mask (int, int);
129
130 struct dis_private {
131 /* Points to first byte not fetched. */
132 bfd_byte *max_fetched;
133 bfd_byte the_buffer[MAX_MNEM_SIZE];
134 bfd_vma insn_start;
135 int orig_sizeflag;
136 OPCODES_SIGJMP_BUF bailout;
137 };
138
139 enum address_mode
140 {
141 mode_16bit,
142 mode_32bit,
143 mode_64bit
144 };
145
146 enum address_mode address_mode;
147
148 /* Flags for the prefixes for the current instruction. See below. */
149 static int prefixes;
150
151 /* REX prefix the current instruction. See below. */
152 static int rex;
153 /* Bits of REX we've already used. */
154 static int rex_used;
155 /* REX bits in original REX prefix ignored. */
156 static int rex_ignored;
157 /* Mark parts used in the REX prefix. When we are testing for
158 empty prefix (for 8bit register REX extension), just mask it
159 out. Otherwise test for REX bit is excuse for existence of REX
160 only in case value is nonzero. */
161 #define USED_REX(value) \
162 { \
163 if (value) \
164 { \
165 if ((rex & value)) \
166 rex_used |= (value) | REX_OPCODE; \
167 } \
168 else \
169 rex_used |= REX_OPCODE; \
170 }
171
172 /* Flags for prefixes which we somehow handled when printing the
173 current instruction. */
174 static int used_prefixes;
175
176 /* Flags stored in PREFIXES. */
177 #define PREFIX_REPZ 1
178 #define PREFIX_REPNZ 2
179 #define PREFIX_LOCK 4
180 #define PREFIX_CS 8
181 #define PREFIX_SS 0x10
182 #define PREFIX_DS 0x20
183 #define PREFIX_ES 0x40
184 #define PREFIX_FS 0x80
185 #define PREFIX_GS 0x100
186 #define PREFIX_DATA 0x200
187 #define PREFIX_ADDR 0x400
188 #define PREFIX_FWAIT 0x800
189
190 /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
191 to ADDR (exclusive) are valid. Returns 1 for success, longjmps
192 on error. */
193 #define FETCH_DATA(info, addr) \
194 ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \
195 ? 1 : fetch_data ((info), (addr)))
196
197 static int
198 fetch_data (struct disassemble_info *info, bfd_byte *addr)
199 {
200 int status;
201 struct dis_private *priv = (struct dis_private *) info->private_data;
202 bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer);
203
204 if (addr <= priv->the_buffer + MAX_MNEM_SIZE)
205 status = (*info->read_memory_func) (start,
206 priv->max_fetched,
207 addr - priv->max_fetched,
208 info);
209 else
210 status = -1;
211 if (status != 0)
212 {
213 /* If we did manage to read at least one byte, then
214 print_insn_i386 will do something sensible. Otherwise, print
215 an error. We do that here because this is where we know
216 STATUS. */
217 if (priv->max_fetched == priv->the_buffer)
218 (*info->memory_error_func) (status, start, info);
219 OPCODES_SIGLONGJMP (priv->bailout, 1);
220 }
221 else
222 priv->max_fetched = addr;
223 return 1;
224 }
225
226 /* Possible values for prefix requirement. */
227 #define PREFIX_IGNORED_SHIFT 16
228 #define PREFIX_IGNORED_REPZ (PREFIX_REPZ << PREFIX_IGNORED_SHIFT)
229 #define PREFIX_IGNORED_REPNZ (PREFIX_REPNZ << PREFIX_IGNORED_SHIFT)
230 #define PREFIX_IGNORED_DATA (PREFIX_DATA << PREFIX_IGNORED_SHIFT)
231 #define PREFIX_IGNORED_ADDR (PREFIX_ADDR << PREFIX_IGNORED_SHIFT)
232 #define PREFIX_IGNORED_LOCK (PREFIX_LOCK << PREFIX_IGNORED_SHIFT)
233
234 /* Opcode prefixes. */
235 #define PREFIX_OPCODE (PREFIX_REPZ \
236 | PREFIX_REPNZ \
237 | PREFIX_DATA)
238
239 /* Prefixes ignored. */
240 #define PREFIX_IGNORED (PREFIX_IGNORED_REPZ \
241 | PREFIX_IGNORED_REPNZ \
242 | PREFIX_IGNORED_DATA)
243
244 #define XX { NULL, 0 }
245 #define Bad_Opcode NULL, { { NULL, 0 } }, 0
246
247 #define Eb { OP_E, b_mode }
248 #define Ebnd { OP_E, bnd_mode }
249 #define EbS { OP_E, b_swap_mode }
250 #define EbndS { OP_E, bnd_swap_mode }
251 #define Ev { OP_E, v_mode }
252 #define Eva { OP_E, va_mode }
253 #define Ev_bnd { OP_E, v_bnd_mode }
254 #define EvS { OP_E, v_swap_mode }
255 #define Ed { OP_E, d_mode }
256 #define Edq { OP_E, dq_mode }
257 #define Edqw { OP_E, dqw_mode }
258 #define Edqb { OP_E, dqb_mode }
259 #define Edb { OP_E, db_mode }
260 #define Edw { OP_E, dw_mode }
261 #define Edqd { OP_E, dqd_mode }
262 #define Edqa { OP_E, dqa_mode }
263 #define Eq { OP_E, q_mode }
264 #define indirEv { OP_indirE, indir_v_mode }
265 #define indirEp { OP_indirE, f_mode }
266 #define stackEv { OP_E, stack_v_mode }
267 #define Em { OP_E, m_mode }
268 #define Ew { OP_E, w_mode }
269 #define M { OP_M, 0 } /* lea, lgdt, etc. */
270 #define Ma { OP_M, a_mode }
271 #define Mb { OP_M, b_mode }
272 #define Md { OP_M, d_mode }
273 #define Mo { OP_M, o_mode }
274 #define Mp { OP_M, f_mode } /* 32 or 48 bit memory operand for LDS, LES etc */
275 #define Mq { OP_M, q_mode }
276 #define Mv_bnd { OP_M, v_bndmk_mode }
277 #define Mx { OP_M, x_mode }
278 #define Mxmm { OP_M, xmm_mode }
279 #define Gb { OP_G, b_mode }
280 #define Gbnd { OP_G, bnd_mode }
281 #define Gv { OP_G, v_mode }
282 #define Gd { OP_G, d_mode }
283 #define Gdq { OP_G, dq_mode }
284 #define Gm { OP_G, m_mode }
285 #define Gva { OP_G, va_mode }
286 #define Gw { OP_G, w_mode }
287 #define Rd { OP_R, d_mode }
288 #define Rdq { OP_R, dq_mode }
289 #define Rm { OP_R, m_mode }
290 #define Ib { OP_I, b_mode }
291 #define sIb { OP_sI, b_mode } /* sign extened byte */
292 #define sIbT { OP_sI, b_T_mode } /* sign extened byte like 'T' */
293 #define Iv { OP_I, v_mode }
294 #define sIv { OP_sI, v_mode }
295 #define Iq { OP_I, q_mode }
296 #define Iv64 { OP_I64, v_mode }
297 #define Iw { OP_I, w_mode }
298 #define I1 { OP_I, const_1_mode }
299 #define Jb { OP_J, b_mode }
300 #define Jv { OP_J, v_mode }
301 #define Cm { OP_C, m_mode }
302 #define Dm { OP_D, m_mode }
303 #define Td { OP_T, d_mode }
304 #define Skip_MODRM { OP_Skip_MODRM, 0 }
305
306 #define RMeAX { OP_REG, eAX_reg }
307 #define RMeBX { OP_REG, eBX_reg }
308 #define RMeCX { OP_REG, eCX_reg }
309 #define RMeDX { OP_REG, eDX_reg }
310 #define RMeSP { OP_REG, eSP_reg }
311 #define RMeBP { OP_REG, eBP_reg }
312 #define RMeSI { OP_REG, eSI_reg }
313 #define RMeDI { OP_REG, eDI_reg }
314 #define RMrAX { OP_REG, rAX_reg }
315 #define RMrBX { OP_REG, rBX_reg }
316 #define RMrCX { OP_REG, rCX_reg }
317 #define RMrDX { OP_REG, rDX_reg }
318 #define RMrSP { OP_REG, rSP_reg }
319 #define RMrBP { OP_REG, rBP_reg }
320 #define RMrSI { OP_REG, rSI_reg }
321 #define RMrDI { OP_REG, rDI_reg }
322 #define RMAL { OP_REG, al_reg }
323 #define RMCL { OP_REG, cl_reg }
324 #define RMDL { OP_REG, dl_reg }
325 #define RMBL { OP_REG, bl_reg }
326 #define RMAH { OP_REG, ah_reg }
327 #define RMCH { OP_REG, ch_reg }
328 #define RMDH { OP_REG, dh_reg }
329 #define RMBH { OP_REG, bh_reg }
330 #define RMAX { OP_REG, ax_reg }
331 #define RMDX { OP_REG, dx_reg }
332
333 #define eAX { OP_IMREG, eAX_reg }
334 #define eBX { OP_IMREG, eBX_reg }
335 #define eCX { OP_IMREG, eCX_reg }
336 #define eDX { OP_IMREG, eDX_reg }
337 #define eSP { OP_IMREG, eSP_reg }
338 #define eBP { OP_IMREG, eBP_reg }
339 #define eSI { OP_IMREG, eSI_reg }
340 #define eDI { OP_IMREG, eDI_reg }
341 #define AL { OP_IMREG, al_reg }
342 #define CL { OP_IMREG, cl_reg }
343 #define DL { OP_IMREG, dl_reg }
344 #define BL { OP_IMREG, bl_reg }
345 #define AH { OP_IMREG, ah_reg }
346 #define CH { OP_IMREG, ch_reg }
347 #define DH { OP_IMREG, dh_reg }
348 #define BH { OP_IMREG, bh_reg }
349 #define AX { OP_IMREG, ax_reg }
350 #define DX { OP_IMREG, dx_reg }
351 #define zAX { OP_IMREG, z_mode_ax_reg }
352 #define indirDX { OP_IMREG, indir_dx_reg }
353
354 #define Sw { OP_SEG, w_mode }
355 #define Sv { OP_SEG, v_mode }
356 #define Ap { OP_DIR, 0 }
357 #define Ob { OP_OFF64, b_mode }
358 #define Ov { OP_OFF64, v_mode }
359 #define Xb { OP_DSreg, eSI_reg }
360 #define Xv { OP_DSreg, eSI_reg }
361 #define Xz { OP_DSreg, eSI_reg }
362 #define Yb { OP_ESreg, eDI_reg }
363 #define Yv { OP_ESreg, eDI_reg }
364 #define DSBX { OP_DSreg, eBX_reg }
365
366 #define es { OP_REG, es_reg }
367 #define ss { OP_REG, ss_reg }
368 #define cs { OP_REG, cs_reg }
369 #define ds { OP_REG, ds_reg }
370 #define fs { OP_REG, fs_reg }
371 #define gs { OP_REG, gs_reg }
372
373 #define MX { OP_MMX, 0 }
374 #define XM { OP_XMM, 0 }
375 #define XMScalar { OP_XMM, scalar_mode }
376 #define XMGatherQ { OP_XMM, vex_vsib_q_w_dq_mode }
377 #define XMM { OP_XMM, xmm_mode }
378 #define XMxmmq { OP_XMM, xmmq_mode }
379 #define EM { OP_EM, v_mode }
380 #define EMS { OP_EM, v_swap_mode }
381 #define EMd { OP_EM, d_mode }
382 #define EMx { OP_EM, x_mode }
383 #define EXbScalar { OP_EX, b_scalar_mode }
384 #define EXw { OP_EX, w_mode }
385 #define EXwScalar { OP_EX, w_scalar_mode }
386 #define EXd { OP_EX, d_mode }
387 #define EXdScalar { OP_EX, d_scalar_mode }
388 #define EXdS { OP_EX, d_swap_mode }
389 #define EXdScalarS { OP_EX, d_scalar_swap_mode }
390 #define EXq { OP_EX, q_mode }
391 #define EXqScalar { OP_EX, q_scalar_mode }
392 #define EXqScalarS { OP_EX, q_scalar_swap_mode }
393 #define EXqS { OP_EX, q_swap_mode }
394 #define EXx { OP_EX, x_mode }
395 #define EXxS { OP_EX, x_swap_mode }
396 #define EXxmm { OP_EX, xmm_mode }
397 #define EXymm { OP_EX, ymm_mode }
398 #define EXxmmq { OP_EX, xmmq_mode }
399 #define EXEvexHalfBcstXmmq { OP_EX, evex_half_bcst_xmmq_mode }
400 #define EXxmm_mb { OP_EX, xmm_mb_mode }
401 #define EXxmm_mw { OP_EX, xmm_mw_mode }
402 #define EXxmm_md { OP_EX, xmm_md_mode }
403 #define EXxmm_mq { OP_EX, xmm_mq_mode }
404 #define EXxmm_mdq { OP_EX, xmm_mdq_mode }
405 #define EXxmmdw { OP_EX, xmmdw_mode }
406 #define EXxmmqd { OP_EX, xmmqd_mode }
407 #define EXymmq { OP_EX, ymmq_mode }
408 #define EXVexWdq { OP_EX, vex_w_dq_mode }
409 #define EXVexWdqScalar { OP_EX, vex_scalar_w_dq_mode }
410 #define EXEvexXGscat { OP_EX, evex_x_gscat_mode }
411 #define EXEvexXNoBcst { OP_EX, evex_x_nobcst_mode }
412 #define MS { OP_MS, v_mode }
413 #define XS { OP_XS, v_mode }
414 #define EMCq { OP_EMC, q_mode }
415 #define MXC { OP_MXC, 0 }
416 #define OPSUF { OP_3DNowSuffix, 0 }
417 #define CMP { CMP_Fixup, 0 }
418 #define XMM0 { XMM_Fixup, 0 }
419 #define FXSAVE { FXSAVE_Fixup, 0 }
420 #define Vex_2src_1 { OP_Vex_2src_1, 0 }
421 #define Vex_2src_2 { OP_Vex_2src_2, 0 }
422
423 #define Vex { OP_VEX, vex_mode }
424 #define VexScalar { OP_VEX, vex_scalar_mode }
425 #define VexGatherQ { OP_VEX, vex_vsib_q_w_dq_mode }
426 #define Vex128 { OP_VEX, vex128_mode }
427 #define Vex256 { OP_VEX, vex256_mode }
428 #define VexGdq { OP_VEX, dq_mode }
429 #define EXdVex { OP_EX_Vex, d_mode }
430 #define EXdVexS { OP_EX_Vex, d_swap_mode }
431 #define EXdVexScalarS { OP_EX_Vex, d_scalar_swap_mode }
432 #define EXqVex { OP_EX_Vex, q_mode }
433 #define EXqVexS { OP_EX_Vex, q_swap_mode }
434 #define EXqVexScalarS { OP_EX_Vex, q_scalar_swap_mode }
435 #define EXVexW { OP_EX_VexW, x_mode }
436 #define EXdVexW { OP_EX_VexW, d_mode }
437 #define EXqVexW { OP_EX_VexW, q_mode }
438 #define EXVexImmW { OP_EX_VexImmW, x_mode }
439 #define XMVex { OP_XMM_Vex, 0 }
440 #define XMVexScalar { OP_XMM_Vex, scalar_mode }
441 #define XMVexW { OP_XMM_VexW, 0 }
442 #define XMVexI4 { OP_REG_VexI4, x_mode }
443 #define PCLMUL { PCLMUL_Fixup, 0 }
444 #define VCMP { VCMP_Fixup, 0 }
445 #define VPCMP { VPCMP_Fixup, 0 }
446 #define VPCOM { VPCOM_Fixup, 0 }
447
448 #define EXxEVexR { OP_Rounding, evex_rounding_mode }
449 #define EXxEVexR64 { OP_Rounding, evex_rounding_64_mode }
450 #define EXxEVexS { OP_Rounding, evex_sae_mode }
451
452 #define XMask { OP_Mask, mask_mode }
453 #define MaskG { OP_G, mask_mode }
454 #define MaskE { OP_E, mask_mode }
455 #define MaskBDE { OP_E, mask_bd_mode }
456 #define MaskR { OP_R, mask_mode }
457 #define MaskVex { OP_VEX, mask_mode }
458
459 #define MVexVSIBDWpX { OP_M, vex_vsib_d_w_dq_mode }
460 #define MVexVSIBDQWpX { OP_M, vex_vsib_d_w_d_mode }
461 #define MVexVSIBQWpX { OP_M, vex_vsib_q_w_dq_mode }
462 #define MVexVSIBQDWpX { OP_M, vex_vsib_q_w_d_mode }
463
464 /* Used handle "rep" prefix for string instructions. */
465 #define Xbr { REP_Fixup, eSI_reg }
466 #define Xvr { REP_Fixup, eSI_reg }
467 #define Ybr { REP_Fixup, eDI_reg }
468 #define Yvr { REP_Fixup, eDI_reg }
469 #define Yzr { REP_Fixup, eDI_reg }
470 #define indirDXr { REP_Fixup, indir_dx_reg }
471 #define ALr { REP_Fixup, al_reg }
472 #define eAXr { REP_Fixup, eAX_reg }
473
474 /* Used handle HLE prefix for lockable instructions. */
475 #define Ebh1 { HLE_Fixup1, b_mode }
476 #define Evh1 { HLE_Fixup1, v_mode }
477 #define Ebh2 { HLE_Fixup2, b_mode }
478 #define Evh2 { HLE_Fixup2, v_mode }
479 #define Ebh3 { HLE_Fixup3, b_mode }
480 #define Evh3 { HLE_Fixup3, v_mode }
481
482 #define BND { BND_Fixup, 0 }
483 #define NOTRACK { NOTRACK_Fixup, 0 }
484
485 #define cond_jump_flag { NULL, cond_jump_mode }
486 #define loop_jcxz_flag { NULL, loop_jcxz_mode }
487
488 /* bits in sizeflag */
489 #define SUFFIX_ALWAYS 4
490 #define AFLAG 2
491 #define DFLAG 1
492
493 enum
494 {
495 /* byte operand */
496 b_mode = 1,
497 /* byte operand with operand swapped */
498 b_swap_mode,
499 /* byte operand, sign extend like 'T' suffix */
500 b_T_mode,
501 /* operand size depends on prefixes */
502 v_mode,
503 /* operand size depends on prefixes with operand swapped */
504 v_swap_mode,
505 /* operand size depends on address prefix */
506 va_mode,
507 /* word operand */
508 w_mode,
509 /* double word operand */
510 d_mode,
511 /* double word operand with operand swapped */
512 d_swap_mode,
513 /* quad word operand */
514 q_mode,
515 /* quad word operand with operand swapped */
516 q_swap_mode,
517 /* ten-byte operand */
518 t_mode,
519 /* 16-byte XMM, 32-byte YMM or 64-byte ZMM operand. In EVEX with
520 broadcast enabled. */
521 x_mode,
522 /* Similar to x_mode, but with different EVEX mem shifts. */
523 evex_x_gscat_mode,
524 /* Similar to x_mode, but with disabled broadcast. */
525 evex_x_nobcst_mode,
526 /* Similar to x_mode, but with operands swapped and disabled broadcast
527 in EVEX. */
528 x_swap_mode,
529 /* 16-byte XMM operand */
530 xmm_mode,
531 /* XMM, XMM or YMM register operand, or quad word, xmmword or ymmword
532 memory operand (depending on vector length). Broadcast isn't
533 allowed. */
534 xmmq_mode,
535 /* Same as xmmq_mode, but broadcast is allowed. */
536 evex_half_bcst_xmmq_mode,
537 /* XMM register or byte memory operand */
538 xmm_mb_mode,
539 /* XMM register or word memory operand */
540 xmm_mw_mode,
541 /* XMM register or double word memory operand */
542 xmm_md_mode,
543 /* XMM register or quad word memory operand */
544 xmm_mq_mode,
545 /* XMM register or double/quad word memory operand, depending on
546 VEX.W. */
547 xmm_mdq_mode,
548 /* 16-byte XMM, word, double word or quad word operand. */
549 xmmdw_mode,
550 /* 16-byte XMM, double word, quad word operand or xmm word operand. */
551 xmmqd_mode,
552 /* 32-byte YMM operand */
553 ymm_mode,
554 /* quad word, ymmword or zmmword memory operand. */
555 ymmq_mode,
556 /* 32-byte YMM or 16-byte word operand */
557 ymmxmm_mode,
558 /* d_mode in 32bit, q_mode in 64bit mode. */
559 m_mode,
560 /* pair of v_mode operands */
561 a_mode,
562 cond_jump_mode,
563 loop_jcxz_mode,
564 v_bnd_mode,
565 /* like v_bnd_mode in 32bit, no RIP-rel in 64bit mode. */
566 v_bndmk_mode,
567 /* operand size depends on REX prefixes. */
568 dq_mode,
569 /* registers like dq_mode, memory like w_mode. */
570 dqw_mode,
571 /* bounds operand */
572 bnd_mode,
573 /* bounds operand with operand swapped */
574 bnd_swap_mode,
575 /* 4- or 6-byte pointer operand */
576 f_mode,
577 const_1_mode,
578 /* v_mode for indirect branch opcodes. */
579 indir_v_mode,
580 /* v_mode for stack-related opcodes. */
581 stack_v_mode,
582 /* non-quad operand size depends on prefixes */
583 z_mode,
584 /* 16-byte operand */
585 o_mode,
586 /* registers like dq_mode, memory like b_mode. */
587 dqb_mode,
588 /* registers like d_mode, memory like b_mode. */
589 db_mode,
590 /* registers like d_mode, memory like w_mode. */
591 dw_mode,
592 /* registers like dq_mode, memory like d_mode. */
593 dqd_mode,
594 /* operand size depends on the W bit as well as address mode. */
595 dqa_mode,
596 /* normal vex mode */
597 vex_mode,
598 /* 128bit vex mode */
599 vex128_mode,
600 /* 256bit vex mode */
601 vex256_mode,
602 /* operand size depends on the VEX.W bit. */
603 vex_w_dq_mode,
604
605 /* Similar to vex_w_dq_mode, with VSIB dword indices. */
606 vex_vsib_d_w_dq_mode,
607 /* Similar to vex_vsib_d_w_dq_mode, with smaller memory. */
608 vex_vsib_d_w_d_mode,
609 /* Similar to vex_w_dq_mode, with VSIB qword indices. */
610 vex_vsib_q_w_dq_mode,
611 /* Similar to vex_vsib_q_w_dq_mode, with smaller memory. */
612 vex_vsib_q_w_d_mode,
613
614 /* scalar, ignore vector length. */
615 scalar_mode,
616 /* like b_mode, ignore vector length. */
617 b_scalar_mode,
618 /* like w_mode, ignore vector length. */
619 w_scalar_mode,
620 /* like d_mode, ignore vector length. */
621 d_scalar_mode,
622 /* like d_swap_mode, ignore vector length. */
623 d_scalar_swap_mode,
624 /* like q_mode, ignore vector length. */
625 q_scalar_mode,
626 /* like q_swap_mode, ignore vector length. */
627 q_scalar_swap_mode,
628 /* like vex_mode, ignore vector length. */
629 vex_scalar_mode,
630 /* like vex_w_dq_mode, ignore vector length. */
631 vex_scalar_w_dq_mode,
632
633 /* Static rounding. */
634 evex_rounding_mode,
635 /* Static rounding, 64-bit mode only. */
636 evex_rounding_64_mode,
637 /* Supress all exceptions. */
638 evex_sae_mode,
639
640 /* Mask register operand. */
641 mask_mode,
642 /* Mask register operand. */
643 mask_bd_mode,
644
645 es_reg,
646 cs_reg,
647 ss_reg,
648 ds_reg,
649 fs_reg,
650 gs_reg,
651
652 eAX_reg,
653 eCX_reg,
654 eDX_reg,
655 eBX_reg,
656 eSP_reg,
657 eBP_reg,
658 eSI_reg,
659 eDI_reg,
660
661 al_reg,
662 cl_reg,
663 dl_reg,
664 bl_reg,
665 ah_reg,
666 ch_reg,
667 dh_reg,
668 bh_reg,
669
670 ax_reg,
671 cx_reg,
672 dx_reg,
673 bx_reg,
674 sp_reg,
675 bp_reg,
676 si_reg,
677 di_reg,
678
679 rAX_reg,
680 rCX_reg,
681 rDX_reg,
682 rBX_reg,
683 rSP_reg,
684 rBP_reg,
685 rSI_reg,
686 rDI_reg,
687
688 z_mode_ax_reg,
689 indir_dx_reg
690 };
691
692 enum
693 {
694 FLOATCODE = 1,
695 USE_REG_TABLE,
696 USE_MOD_TABLE,
697 USE_RM_TABLE,
698 USE_PREFIX_TABLE,
699 USE_X86_64_TABLE,
700 USE_3BYTE_TABLE,
701 USE_XOP_8F_TABLE,
702 USE_VEX_C4_TABLE,
703 USE_VEX_C5_TABLE,
704 USE_VEX_LEN_TABLE,
705 USE_VEX_W_TABLE,
706 USE_EVEX_TABLE,
707 USE_EVEX_LEN_TABLE
708 };
709
710 #define FLOAT NULL, { { NULL, FLOATCODE } }, 0
711
712 #define DIS386(T, I) NULL, { { NULL, (T)}, { NULL, (I) } }, 0
713 #define DIS386_PREFIX(T, I, P) NULL, { { NULL, (T)}, { NULL, (I) } }, P
714 #define REG_TABLE(I) DIS386 (USE_REG_TABLE, (I))
715 #define MOD_TABLE(I) DIS386 (USE_MOD_TABLE, (I))
716 #define RM_TABLE(I) DIS386 (USE_RM_TABLE, (I))
717 #define PREFIX_TABLE(I) DIS386 (USE_PREFIX_TABLE, (I))
718 #define X86_64_TABLE(I) DIS386 (USE_X86_64_TABLE, (I))
719 #define THREE_BYTE_TABLE(I) DIS386 (USE_3BYTE_TABLE, (I))
720 #define THREE_BYTE_TABLE_PREFIX(I, P) DIS386_PREFIX (USE_3BYTE_TABLE, (I), P)
721 #define XOP_8F_TABLE(I) DIS386 (USE_XOP_8F_TABLE, (I))
722 #define VEX_C4_TABLE(I) DIS386 (USE_VEX_C4_TABLE, (I))
723 #define VEX_C5_TABLE(I) DIS386 (USE_VEX_C5_TABLE, (I))
724 #define VEX_LEN_TABLE(I) DIS386 (USE_VEX_LEN_TABLE, (I))
725 #define VEX_W_TABLE(I) DIS386 (USE_VEX_W_TABLE, (I))
726 #define EVEX_TABLE(I) DIS386 (USE_EVEX_TABLE, (I))
727 #define EVEX_LEN_TABLE(I) DIS386 (USE_EVEX_LEN_TABLE, (I))
728
729 enum
730 {
731 REG_80 = 0,
732 REG_81,
733 REG_83,
734 REG_8F,
735 REG_C0,
736 REG_C1,
737 REG_C6,
738 REG_C7,
739 REG_D0,
740 REG_D1,
741 REG_D2,
742 REG_D3,
743 REG_F6,
744 REG_F7,
745 REG_FE,
746 REG_FF,
747 REG_0F00,
748 REG_0F01,
749 REG_0F0D,
750 REG_0F18,
751 REG_0F1C_MOD_0,
752 REG_0F1E_MOD_3,
753 REG_0F71,
754 REG_0F72,
755 REG_0F73,
756 REG_0FA6,
757 REG_0FA7,
758 REG_0FAE,
759 REG_0FBA,
760 REG_0FC7,
761 REG_VEX_0F71,
762 REG_VEX_0F72,
763 REG_VEX_0F73,
764 REG_VEX_0FAE,
765 REG_VEX_0F38F3,
766 REG_XOP_LWPCB,
767 REG_XOP_LWP,
768 REG_XOP_TBM_01,
769 REG_XOP_TBM_02,
770
771 REG_EVEX_0F71,
772 REG_EVEX_0F72,
773 REG_EVEX_0F73,
774 REG_EVEX_0F38C6,
775 REG_EVEX_0F38C7
776 };
777
778 enum
779 {
780 MOD_8D = 0,
781 MOD_C6_REG_7,
782 MOD_C7_REG_7,
783 MOD_FF_REG_3,
784 MOD_FF_REG_5,
785 MOD_0F01_REG_0,
786 MOD_0F01_REG_1,
787 MOD_0F01_REG_2,
788 MOD_0F01_REG_3,
789 MOD_0F01_REG_5,
790 MOD_0F01_REG_7,
791 MOD_0F12_PREFIX_0,
792 MOD_0F13,
793 MOD_0F16_PREFIX_0,
794 MOD_0F17,
795 MOD_0F18_REG_0,
796 MOD_0F18_REG_1,
797 MOD_0F18_REG_2,
798 MOD_0F18_REG_3,
799 MOD_0F18_REG_4,
800 MOD_0F18_REG_5,
801 MOD_0F18_REG_6,
802 MOD_0F18_REG_7,
803 MOD_0F1A_PREFIX_0,
804 MOD_0F1B_PREFIX_0,
805 MOD_0F1B_PREFIX_1,
806 MOD_0F1C_PREFIX_0,
807 MOD_0F1E_PREFIX_1,
808 MOD_0F24,
809 MOD_0F26,
810 MOD_0F2B_PREFIX_0,
811 MOD_0F2B_PREFIX_1,
812 MOD_0F2B_PREFIX_2,
813 MOD_0F2B_PREFIX_3,
814 MOD_0F51,
815 MOD_0F71_REG_2,
816 MOD_0F71_REG_4,
817 MOD_0F71_REG_6,
818 MOD_0F72_REG_2,
819 MOD_0F72_REG_4,
820 MOD_0F72_REG_6,
821 MOD_0F73_REG_2,
822 MOD_0F73_REG_3,
823 MOD_0F73_REG_6,
824 MOD_0F73_REG_7,
825 MOD_0FAE_REG_0,
826 MOD_0FAE_REG_1,
827 MOD_0FAE_REG_2,
828 MOD_0FAE_REG_3,
829 MOD_0FAE_REG_4,
830 MOD_0FAE_REG_5,
831 MOD_0FAE_REG_6,
832 MOD_0FAE_REG_7,
833 MOD_0FB2,
834 MOD_0FB4,
835 MOD_0FB5,
836 MOD_0FC3,
837 MOD_0FC7_REG_3,
838 MOD_0FC7_REG_4,
839 MOD_0FC7_REG_5,
840 MOD_0FC7_REG_6,
841 MOD_0FC7_REG_7,
842 MOD_0FD7,
843 MOD_0FE7_PREFIX_2,
844 MOD_0FF0_PREFIX_3,
845 MOD_0F382A_PREFIX_2,
846 MOD_0F38F5_PREFIX_2,
847 MOD_0F38F6_PREFIX_0,
848 MOD_0F38F8_PREFIX_2,
849 MOD_0F38F9_PREFIX_0,
850 MOD_62_32BIT,
851 MOD_C4_32BIT,
852 MOD_C5_32BIT,
853 MOD_VEX_0F12_PREFIX_0,
854 MOD_VEX_0F13,
855 MOD_VEX_0F16_PREFIX_0,
856 MOD_VEX_0F17,
857 MOD_VEX_0F2B,
858 MOD_VEX_W_0_0F41_P_0_LEN_1,
859 MOD_VEX_W_1_0F41_P_0_LEN_1,
860 MOD_VEX_W_0_0F41_P_2_LEN_1,
861 MOD_VEX_W_1_0F41_P_2_LEN_1,
862 MOD_VEX_W_0_0F42_P_0_LEN_1,
863 MOD_VEX_W_1_0F42_P_0_LEN_1,
864 MOD_VEX_W_0_0F42_P_2_LEN_1,
865 MOD_VEX_W_1_0F42_P_2_LEN_1,
866 MOD_VEX_W_0_0F44_P_0_LEN_1,
867 MOD_VEX_W_1_0F44_P_0_LEN_1,
868 MOD_VEX_W_0_0F44_P_2_LEN_1,
869 MOD_VEX_W_1_0F44_P_2_LEN_1,
870 MOD_VEX_W_0_0F45_P_0_LEN_1,
871 MOD_VEX_W_1_0F45_P_0_LEN_1,
872 MOD_VEX_W_0_0F45_P_2_LEN_1,
873 MOD_VEX_W_1_0F45_P_2_LEN_1,
874 MOD_VEX_W_0_0F46_P_0_LEN_1,
875 MOD_VEX_W_1_0F46_P_0_LEN_1,
876 MOD_VEX_W_0_0F46_P_2_LEN_1,
877 MOD_VEX_W_1_0F46_P_2_LEN_1,
878 MOD_VEX_W_0_0F47_P_0_LEN_1,
879 MOD_VEX_W_1_0F47_P_0_LEN_1,
880 MOD_VEX_W_0_0F47_P_2_LEN_1,
881 MOD_VEX_W_1_0F47_P_2_LEN_1,
882 MOD_VEX_W_0_0F4A_P_0_LEN_1,
883 MOD_VEX_W_1_0F4A_P_0_LEN_1,
884 MOD_VEX_W_0_0F4A_P_2_LEN_1,
885 MOD_VEX_W_1_0F4A_P_2_LEN_1,
886 MOD_VEX_W_0_0F4B_P_0_LEN_1,
887 MOD_VEX_W_1_0F4B_P_0_LEN_1,
888 MOD_VEX_W_0_0F4B_P_2_LEN_1,
889 MOD_VEX_0F50,
890 MOD_VEX_0F71_REG_2,
891 MOD_VEX_0F71_REG_4,
892 MOD_VEX_0F71_REG_6,
893 MOD_VEX_0F72_REG_2,
894 MOD_VEX_0F72_REG_4,
895 MOD_VEX_0F72_REG_6,
896 MOD_VEX_0F73_REG_2,
897 MOD_VEX_0F73_REG_3,
898 MOD_VEX_0F73_REG_6,
899 MOD_VEX_0F73_REG_7,
900 MOD_VEX_W_0_0F91_P_0_LEN_0,
901 MOD_VEX_W_1_0F91_P_0_LEN_0,
902 MOD_VEX_W_0_0F91_P_2_LEN_0,
903 MOD_VEX_W_1_0F91_P_2_LEN_0,
904 MOD_VEX_W_0_0F92_P_0_LEN_0,
905 MOD_VEX_W_0_0F92_P_2_LEN_0,
906 MOD_VEX_W_0_0F92_P_3_LEN_0,
907 MOD_VEX_W_1_0F92_P_3_LEN_0,
908 MOD_VEX_W_0_0F93_P_0_LEN_0,
909 MOD_VEX_W_0_0F93_P_2_LEN_0,
910 MOD_VEX_W_0_0F93_P_3_LEN_0,
911 MOD_VEX_W_1_0F93_P_3_LEN_0,
912 MOD_VEX_W_0_0F98_P_0_LEN_0,
913 MOD_VEX_W_1_0F98_P_0_LEN_0,
914 MOD_VEX_W_0_0F98_P_2_LEN_0,
915 MOD_VEX_W_1_0F98_P_2_LEN_0,
916 MOD_VEX_W_0_0F99_P_0_LEN_0,
917 MOD_VEX_W_1_0F99_P_0_LEN_0,
918 MOD_VEX_W_0_0F99_P_2_LEN_0,
919 MOD_VEX_W_1_0F99_P_2_LEN_0,
920 MOD_VEX_0FAE_REG_2,
921 MOD_VEX_0FAE_REG_3,
922 MOD_VEX_0FD7_PREFIX_2,
923 MOD_VEX_0FE7_PREFIX_2,
924 MOD_VEX_0FF0_PREFIX_3,
925 MOD_VEX_0F381A_PREFIX_2,
926 MOD_VEX_0F382A_PREFIX_2,
927 MOD_VEX_0F382C_PREFIX_2,
928 MOD_VEX_0F382D_PREFIX_2,
929 MOD_VEX_0F382E_PREFIX_2,
930 MOD_VEX_0F382F_PREFIX_2,
931 MOD_VEX_0F385A_PREFIX_2,
932 MOD_VEX_0F388C_PREFIX_2,
933 MOD_VEX_0F388E_PREFIX_2,
934 MOD_VEX_W_0_0F3A30_P_2_LEN_0,
935 MOD_VEX_W_1_0F3A30_P_2_LEN_0,
936 MOD_VEX_W_0_0F3A31_P_2_LEN_0,
937 MOD_VEX_W_1_0F3A31_P_2_LEN_0,
938 MOD_VEX_W_0_0F3A32_P_2_LEN_0,
939 MOD_VEX_W_1_0F3A32_P_2_LEN_0,
940 MOD_VEX_W_0_0F3A33_P_2_LEN_0,
941 MOD_VEX_W_1_0F3A33_P_2_LEN_0,
942
943 MOD_EVEX_0F10_PREFIX_1,
944 MOD_EVEX_0F10_PREFIX_3,
945 MOD_EVEX_0F11_PREFIX_1,
946 MOD_EVEX_0F11_PREFIX_3,
947 MOD_EVEX_0F12_PREFIX_0,
948 MOD_EVEX_0F16_PREFIX_0,
949 MOD_EVEX_0F38C6_REG_1,
950 MOD_EVEX_0F38C6_REG_2,
951 MOD_EVEX_0F38C6_REG_5,
952 MOD_EVEX_0F38C6_REG_6,
953 MOD_EVEX_0F38C7_REG_1,
954 MOD_EVEX_0F38C7_REG_2,
955 MOD_EVEX_0F38C7_REG_5,
956 MOD_EVEX_0F38C7_REG_6
957 };
958
959 enum
960 {
961 RM_C6_REG_7 = 0,
962 RM_C7_REG_7,
963 RM_0F01_REG_0,
964 RM_0F01_REG_1,
965 RM_0F01_REG_2,
966 RM_0F01_REG_3,
967 RM_0F01_REG_5,
968 RM_0F01_REG_7,
969 RM_0F1E_MOD_3_REG_7,
970 RM_0FAE_REG_6,
971 RM_0FAE_REG_7
972 };
973
974 enum
975 {
976 PREFIX_90 = 0,
977 PREFIX_MOD_0_0F01_REG_5,
978 PREFIX_MOD_3_0F01_REG_5_RM_0,
979 PREFIX_MOD_3_0F01_REG_5_RM_2,
980 PREFIX_0F09,
981 PREFIX_0F10,
982 PREFIX_0F11,
983 PREFIX_0F12,
984 PREFIX_0F16,
985 PREFIX_0F1A,
986 PREFIX_0F1B,
987 PREFIX_0F1C,
988 PREFIX_0F1E,
989 PREFIX_0F2A,
990 PREFIX_0F2B,
991 PREFIX_0F2C,
992 PREFIX_0F2D,
993 PREFIX_0F2E,
994 PREFIX_0F2F,
995 PREFIX_0F51,
996 PREFIX_0F52,
997 PREFIX_0F53,
998 PREFIX_0F58,
999 PREFIX_0F59,
1000 PREFIX_0F5A,
1001 PREFIX_0F5B,
1002 PREFIX_0F5C,
1003 PREFIX_0F5D,
1004 PREFIX_0F5E,
1005 PREFIX_0F5F,
1006 PREFIX_0F60,
1007 PREFIX_0F61,
1008 PREFIX_0F62,
1009 PREFIX_0F6C,
1010 PREFIX_0F6D,
1011 PREFIX_0F6F,
1012 PREFIX_0F70,
1013 PREFIX_0F73_REG_3,
1014 PREFIX_0F73_REG_7,
1015 PREFIX_0F78,
1016 PREFIX_0F79,
1017 PREFIX_0F7C,
1018 PREFIX_0F7D,
1019 PREFIX_0F7E,
1020 PREFIX_0F7F,
1021 PREFIX_0FAE_REG_0,
1022 PREFIX_0FAE_REG_1,
1023 PREFIX_0FAE_REG_2,
1024 PREFIX_0FAE_REG_3,
1025 PREFIX_MOD_0_0FAE_REG_4,
1026 PREFIX_MOD_3_0FAE_REG_4,
1027 PREFIX_MOD_0_0FAE_REG_5,
1028 PREFIX_MOD_3_0FAE_REG_5,
1029 PREFIX_MOD_0_0FAE_REG_6,
1030 PREFIX_MOD_1_0FAE_REG_6,
1031 PREFIX_0FAE_REG_7,
1032 PREFIX_0FB8,
1033 PREFIX_0FBC,
1034 PREFIX_0FBD,
1035 PREFIX_0FC2,
1036 PREFIX_MOD_0_0FC3,
1037 PREFIX_MOD_0_0FC7_REG_6,
1038 PREFIX_MOD_3_0FC7_REG_6,
1039 PREFIX_MOD_3_0FC7_REG_7,
1040 PREFIX_0FD0,
1041 PREFIX_0FD6,
1042 PREFIX_0FE6,
1043 PREFIX_0FE7,
1044 PREFIX_0FF0,
1045 PREFIX_0FF7,
1046 PREFIX_0F3810,
1047 PREFIX_0F3814,
1048 PREFIX_0F3815,
1049 PREFIX_0F3817,
1050 PREFIX_0F3820,
1051 PREFIX_0F3821,
1052 PREFIX_0F3822,
1053 PREFIX_0F3823,
1054 PREFIX_0F3824,
1055 PREFIX_0F3825,
1056 PREFIX_0F3828,
1057 PREFIX_0F3829,
1058 PREFIX_0F382A,
1059 PREFIX_0F382B,
1060 PREFIX_0F3830,
1061 PREFIX_0F3831,
1062 PREFIX_0F3832,
1063 PREFIX_0F3833,
1064 PREFIX_0F3834,
1065 PREFIX_0F3835,
1066 PREFIX_0F3837,
1067 PREFIX_0F3838,
1068 PREFIX_0F3839,
1069 PREFIX_0F383A,
1070 PREFIX_0F383B,
1071 PREFIX_0F383C,
1072 PREFIX_0F383D,
1073 PREFIX_0F383E,
1074 PREFIX_0F383F,
1075 PREFIX_0F3840,
1076 PREFIX_0F3841,
1077 PREFIX_0F3880,
1078 PREFIX_0F3881,
1079 PREFIX_0F3882,
1080 PREFIX_0F38C8,
1081 PREFIX_0F38C9,
1082 PREFIX_0F38CA,
1083 PREFIX_0F38CB,
1084 PREFIX_0F38CC,
1085 PREFIX_0F38CD,
1086 PREFIX_0F38CF,
1087 PREFIX_0F38DB,
1088 PREFIX_0F38DC,
1089 PREFIX_0F38DD,
1090 PREFIX_0F38DE,
1091 PREFIX_0F38DF,
1092 PREFIX_0F38F0,
1093 PREFIX_0F38F1,
1094 PREFIX_0F38F5,
1095 PREFIX_0F38F6,
1096 PREFIX_0F38F8,
1097 PREFIX_0F38F9,
1098 PREFIX_0F3A08,
1099 PREFIX_0F3A09,
1100 PREFIX_0F3A0A,
1101 PREFIX_0F3A0B,
1102 PREFIX_0F3A0C,
1103 PREFIX_0F3A0D,
1104 PREFIX_0F3A0E,
1105 PREFIX_0F3A14,
1106 PREFIX_0F3A15,
1107 PREFIX_0F3A16,
1108 PREFIX_0F3A17,
1109 PREFIX_0F3A20,
1110 PREFIX_0F3A21,
1111 PREFIX_0F3A22,
1112 PREFIX_0F3A40,
1113 PREFIX_0F3A41,
1114 PREFIX_0F3A42,
1115 PREFIX_0F3A44,
1116 PREFIX_0F3A60,
1117 PREFIX_0F3A61,
1118 PREFIX_0F3A62,
1119 PREFIX_0F3A63,
1120 PREFIX_0F3ACC,
1121 PREFIX_0F3ACE,
1122 PREFIX_0F3ACF,
1123 PREFIX_0F3ADF,
1124 PREFIX_VEX_0F10,
1125 PREFIX_VEX_0F11,
1126 PREFIX_VEX_0F12,
1127 PREFIX_VEX_0F16,
1128 PREFIX_VEX_0F2A,
1129 PREFIX_VEX_0F2C,
1130 PREFIX_VEX_0F2D,
1131 PREFIX_VEX_0F2E,
1132 PREFIX_VEX_0F2F,
1133 PREFIX_VEX_0F41,
1134 PREFIX_VEX_0F42,
1135 PREFIX_VEX_0F44,
1136 PREFIX_VEX_0F45,
1137 PREFIX_VEX_0F46,
1138 PREFIX_VEX_0F47,
1139 PREFIX_VEX_0F4A,
1140 PREFIX_VEX_0F4B,
1141 PREFIX_VEX_0F51,
1142 PREFIX_VEX_0F52,
1143 PREFIX_VEX_0F53,
1144 PREFIX_VEX_0F58,
1145 PREFIX_VEX_0F59,
1146 PREFIX_VEX_0F5A,
1147 PREFIX_VEX_0F5B,
1148 PREFIX_VEX_0F5C,
1149 PREFIX_VEX_0F5D,
1150 PREFIX_VEX_0F5E,
1151 PREFIX_VEX_0F5F,
1152 PREFIX_VEX_0F60,
1153 PREFIX_VEX_0F61,
1154 PREFIX_VEX_0F62,
1155 PREFIX_VEX_0F63,
1156 PREFIX_VEX_0F64,
1157 PREFIX_VEX_0F65,
1158 PREFIX_VEX_0F66,
1159 PREFIX_VEX_0F67,
1160 PREFIX_VEX_0F68,
1161 PREFIX_VEX_0F69,
1162 PREFIX_VEX_0F6A,
1163 PREFIX_VEX_0F6B,
1164 PREFIX_VEX_0F6C,
1165 PREFIX_VEX_0F6D,
1166 PREFIX_VEX_0F6E,
1167 PREFIX_VEX_0F6F,
1168 PREFIX_VEX_0F70,
1169 PREFIX_VEX_0F71_REG_2,
1170 PREFIX_VEX_0F71_REG_4,
1171 PREFIX_VEX_0F71_REG_6,
1172 PREFIX_VEX_0F72_REG_2,
1173 PREFIX_VEX_0F72_REG_4,
1174 PREFIX_VEX_0F72_REG_6,
1175 PREFIX_VEX_0F73_REG_2,
1176 PREFIX_VEX_0F73_REG_3,
1177 PREFIX_VEX_0F73_REG_6,
1178 PREFIX_VEX_0F73_REG_7,
1179 PREFIX_VEX_0F74,
1180 PREFIX_VEX_0F75,
1181 PREFIX_VEX_0F76,
1182 PREFIX_VEX_0F77,
1183 PREFIX_VEX_0F7C,
1184 PREFIX_VEX_0F7D,
1185 PREFIX_VEX_0F7E,
1186 PREFIX_VEX_0F7F,
1187 PREFIX_VEX_0F90,
1188 PREFIX_VEX_0F91,
1189 PREFIX_VEX_0F92,
1190 PREFIX_VEX_0F93,
1191 PREFIX_VEX_0F98,
1192 PREFIX_VEX_0F99,
1193 PREFIX_VEX_0FC2,
1194 PREFIX_VEX_0FC4,
1195 PREFIX_VEX_0FC5,
1196 PREFIX_VEX_0FD0,
1197 PREFIX_VEX_0FD1,
1198 PREFIX_VEX_0FD2,
1199 PREFIX_VEX_0FD3,
1200 PREFIX_VEX_0FD4,
1201 PREFIX_VEX_0FD5,
1202 PREFIX_VEX_0FD6,
1203 PREFIX_VEX_0FD7,
1204 PREFIX_VEX_0FD8,
1205 PREFIX_VEX_0FD9,
1206 PREFIX_VEX_0FDA,
1207 PREFIX_VEX_0FDB,
1208 PREFIX_VEX_0FDC,
1209 PREFIX_VEX_0FDD,
1210 PREFIX_VEX_0FDE,
1211 PREFIX_VEX_0FDF,
1212 PREFIX_VEX_0FE0,
1213 PREFIX_VEX_0FE1,
1214 PREFIX_VEX_0FE2,
1215 PREFIX_VEX_0FE3,
1216 PREFIX_VEX_0FE4,
1217 PREFIX_VEX_0FE5,
1218 PREFIX_VEX_0FE6,
1219 PREFIX_VEX_0FE7,
1220 PREFIX_VEX_0FE8,
1221 PREFIX_VEX_0FE9,
1222 PREFIX_VEX_0FEA,
1223 PREFIX_VEX_0FEB,
1224 PREFIX_VEX_0FEC,
1225 PREFIX_VEX_0FED,
1226 PREFIX_VEX_0FEE,
1227 PREFIX_VEX_0FEF,
1228 PREFIX_VEX_0FF0,
1229 PREFIX_VEX_0FF1,
1230 PREFIX_VEX_0FF2,
1231 PREFIX_VEX_0FF3,
1232 PREFIX_VEX_0FF4,
1233 PREFIX_VEX_0FF5,
1234 PREFIX_VEX_0FF6,
1235 PREFIX_VEX_0FF7,
1236 PREFIX_VEX_0FF8,
1237 PREFIX_VEX_0FF9,
1238 PREFIX_VEX_0FFA,
1239 PREFIX_VEX_0FFB,
1240 PREFIX_VEX_0FFC,
1241 PREFIX_VEX_0FFD,
1242 PREFIX_VEX_0FFE,
1243 PREFIX_VEX_0F3800,
1244 PREFIX_VEX_0F3801,
1245 PREFIX_VEX_0F3802,
1246 PREFIX_VEX_0F3803,
1247 PREFIX_VEX_0F3804,
1248 PREFIX_VEX_0F3805,
1249 PREFIX_VEX_0F3806,
1250 PREFIX_VEX_0F3807,
1251 PREFIX_VEX_0F3808,
1252 PREFIX_VEX_0F3809,
1253 PREFIX_VEX_0F380A,
1254 PREFIX_VEX_0F380B,
1255 PREFIX_VEX_0F380C,
1256 PREFIX_VEX_0F380D,
1257 PREFIX_VEX_0F380E,
1258 PREFIX_VEX_0F380F,
1259 PREFIX_VEX_0F3813,
1260 PREFIX_VEX_0F3816,
1261 PREFIX_VEX_0F3817,
1262 PREFIX_VEX_0F3818,
1263 PREFIX_VEX_0F3819,
1264 PREFIX_VEX_0F381A,
1265 PREFIX_VEX_0F381C,
1266 PREFIX_VEX_0F381D,
1267 PREFIX_VEX_0F381E,
1268 PREFIX_VEX_0F3820,
1269 PREFIX_VEX_0F3821,
1270 PREFIX_VEX_0F3822,
1271 PREFIX_VEX_0F3823,
1272 PREFIX_VEX_0F3824,
1273 PREFIX_VEX_0F3825,
1274 PREFIX_VEX_0F3828,
1275 PREFIX_VEX_0F3829,
1276 PREFIX_VEX_0F382A,
1277 PREFIX_VEX_0F382B,
1278 PREFIX_VEX_0F382C,
1279 PREFIX_VEX_0F382D,
1280 PREFIX_VEX_0F382E,
1281 PREFIX_VEX_0F382F,
1282 PREFIX_VEX_0F3830,
1283 PREFIX_VEX_0F3831,
1284 PREFIX_VEX_0F3832,
1285 PREFIX_VEX_0F3833,
1286 PREFIX_VEX_0F3834,
1287 PREFIX_VEX_0F3835,
1288 PREFIX_VEX_0F3836,
1289 PREFIX_VEX_0F3837,
1290 PREFIX_VEX_0F3838,
1291 PREFIX_VEX_0F3839,
1292 PREFIX_VEX_0F383A,
1293 PREFIX_VEX_0F383B,
1294 PREFIX_VEX_0F383C,
1295 PREFIX_VEX_0F383D,
1296 PREFIX_VEX_0F383E,
1297 PREFIX_VEX_0F383F,
1298 PREFIX_VEX_0F3840,
1299 PREFIX_VEX_0F3841,
1300 PREFIX_VEX_0F3845,
1301 PREFIX_VEX_0F3846,
1302 PREFIX_VEX_0F3847,
1303 PREFIX_VEX_0F3858,
1304 PREFIX_VEX_0F3859,
1305 PREFIX_VEX_0F385A,
1306 PREFIX_VEX_0F3878,
1307 PREFIX_VEX_0F3879,
1308 PREFIX_VEX_0F388C,
1309 PREFIX_VEX_0F388E,
1310 PREFIX_VEX_0F3890,
1311 PREFIX_VEX_0F3891,
1312 PREFIX_VEX_0F3892,
1313 PREFIX_VEX_0F3893,
1314 PREFIX_VEX_0F3896,
1315 PREFIX_VEX_0F3897,
1316 PREFIX_VEX_0F3898,
1317 PREFIX_VEX_0F3899,
1318 PREFIX_VEX_0F389A,
1319 PREFIX_VEX_0F389B,
1320 PREFIX_VEX_0F389C,
1321 PREFIX_VEX_0F389D,
1322 PREFIX_VEX_0F389E,
1323 PREFIX_VEX_0F389F,
1324 PREFIX_VEX_0F38A6,
1325 PREFIX_VEX_0F38A7,
1326 PREFIX_VEX_0F38A8,
1327 PREFIX_VEX_0F38A9,
1328 PREFIX_VEX_0F38AA,
1329 PREFIX_VEX_0F38AB,
1330 PREFIX_VEX_0F38AC,
1331 PREFIX_VEX_0F38AD,
1332 PREFIX_VEX_0F38AE,
1333 PREFIX_VEX_0F38AF,
1334 PREFIX_VEX_0F38B6,
1335 PREFIX_VEX_0F38B7,
1336 PREFIX_VEX_0F38B8,
1337 PREFIX_VEX_0F38B9,
1338 PREFIX_VEX_0F38BA,
1339 PREFIX_VEX_0F38BB,
1340 PREFIX_VEX_0F38BC,
1341 PREFIX_VEX_0F38BD,
1342 PREFIX_VEX_0F38BE,
1343 PREFIX_VEX_0F38BF,
1344 PREFIX_VEX_0F38CF,
1345 PREFIX_VEX_0F38DB,
1346 PREFIX_VEX_0F38DC,
1347 PREFIX_VEX_0F38DD,
1348 PREFIX_VEX_0F38DE,
1349 PREFIX_VEX_0F38DF,
1350 PREFIX_VEX_0F38F2,
1351 PREFIX_VEX_0F38F3_REG_1,
1352 PREFIX_VEX_0F38F3_REG_2,
1353 PREFIX_VEX_0F38F3_REG_3,
1354 PREFIX_VEX_0F38F5,
1355 PREFIX_VEX_0F38F6,
1356 PREFIX_VEX_0F38F7,
1357 PREFIX_VEX_0F3A00,
1358 PREFIX_VEX_0F3A01,
1359 PREFIX_VEX_0F3A02,
1360 PREFIX_VEX_0F3A04,
1361 PREFIX_VEX_0F3A05,
1362 PREFIX_VEX_0F3A06,
1363 PREFIX_VEX_0F3A08,
1364 PREFIX_VEX_0F3A09,
1365 PREFIX_VEX_0F3A0A,
1366 PREFIX_VEX_0F3A0B,
1367 PREFIX_VEX_0F3A0C,
1368 PREFIX_VEX_0F3A0D,
1369 PREFIX_VEX_0F3A0E,
1370 PREFIX_VEX_0F3A0F,
1371 PREFIX_VEX_0F3A14,
1372 PREFIX_VEX_0F3A15,
1373 PREFIX_VEX_0F3A16,
1374 PREFIX_VEX_0F3A17,
1375 PREFIX_VEX_0F3A18,
1376 PREFIX_VEX_0F3A19,
1377 PREFIX_VEX_0F3A1D,
1378 PREFIX_VEX_0F3A20,
1379 PREFIX_VEX_0F3A21,
1380 PREFIX_VEX_0F3A22,
1381 PREFIX_VEX_0F3A30,
1382 PREFIX_VEX_0F3A31,
1383 PREFIX_VEX_0F3A32,
1384 PREFIX_VEX_0F3A33,
1385 PREFIX_VEX_0F3A38,
1386 PREFIX_VEX_0F3A39,
1387 PREFIX_VEX_0F3A40,
1388 PREFIX_VEX_0F3A41,
1389 PREFIX_VEX_0F3A42,
1390 PREFIX_VEX_0F3A44,
1391 PREFIX_VEX_0F3A46,
1392 PREFIX_VEX_0F3A48,
1393 PREFIX_VEX_0F3A49,
1394 PREFIX_VEX_0F3A4A,
1395 PREFIX_VEX_0F3A4B,
1396 PREFIX_VEX_0F3A4C,
1397 PREFIX_VEX_0F3A5C,
1398 PREFIX_VEX_0F3A5D,
1399 PREFIX_VEX_0F3A5E,
1400 PREFIX_VEX_0F3A5F,
1401 PREFIX_VEX_0F3A60,
1402 PREFIX_VEX_0F3A61,
1403 PREFIX_VEX_0F3A62,
1404 PREFIX_VEX_0F3A63,
1405 PREFIX_VEX_0F3A68,
1406 PREFIX_VEX_0F3A69,
1407 PREFIX_VEX_0F3A6A,
1408 PREFIX_VEX_0F3A6B,
1409 PREFIX_VEX_0F3A6C,
1410 PREFIX_VEX_0F3A6D,
1411 PREFIX_VEX_0F3A6E,
1412 PREFIX_VEX_0F3A6F,
1413 PREFIX_VEX_0F3A78,
1414 PREFIX_VEX_0F3A79,
1415 PREFIX_VEX_0F3A7A,
1416 PREFIX_VEX_0F3A7B,
1417 PREFIX_VEX_0F3A7C,
1418 PREFIX_VEX_0F3A7D,
1419 PREFIX_VEX_0F3A7E,
1420 PREFIX_VEX_0F3A7F,
1421 PREFIX_VEX_0F3ACE,
1422 PREFIX_VEX_0F3ACF,
1423 PREFIX_VEX_0F3ADF,
1424 PREFIX_VEX_0F3AF0,
1425
1426 PREFIX_EVEX_0F10,
1427 PREFIX_EVEX_0F11,
1428 PREFIX_EVEX_0F12,
1429 PREFIX_EVEX_0F13,
1430 PREFIX_EVEX_0F14,
1431 PREFIX_EVEX_0F15,
1432 PREFIX_EVEX_0F16,
1433 PREFIX_EVEX_0F17,
1434 PREFIX_EVEX_0F28,
1435 PREFIX_EVEX_0F29,
1436 PREFIX_EVEX_0F2A,
1437 PREFIX_EVEX_0F2B,
1438 PREFIX_EVEX_0F2C,
1439 PREFIX_EVEX_0F2D,
1440 PREFIX_EVEX_0F2E,
1441 PREFIX_EVEX_0F2F,
1442 PREFIX_EVEX_0F51,
1443 PREFIX_EVEX_0F54,
1444 PREFIX_EVEX_0F55,
1445 PREFIX_EVEX_0F56,
1446 PREFIX_EVEX_0F57,
1447 PREFIX_EVEX_0F58,
1448 PREFIX_EVEX_0F59,
1449 PREFIX_EVEX_0F5A,
1450 PREFIX_EVEX_0F5B,
1451 PREFIX_EVEX_0F5C,
1452 PREFIX_EVEX_0F5D,
1453 PREFIX_EVEX_0F5E,
1454 PREFIX_EVEX_0F5F,
1455 PREFIX_EVEX_0F60,
1456 PREFIX_EVEX_0F61,
1457 PREFIX_EVEX_0F62,
1458 PREFIX_EVEX_0F63,
1459 PREFIX_EVEX_0F64,
1460 PREFIX_EVEX_0F65,
1461 PREFIX_EVEX_0F66,
1462 PREFIX_EVEX_0F67,
1463 PREFIX_EVEX_0F68,
1464 PREFIX_EVEX_0F69,
1465 PREFIX_EVEX_0F6A,
1466 PREFIX_EVEX_0F6B,
1467 PREFIX_EVEX_0F6C,
1468 PREFIX_EVEX_0F6D,
1469 PREFIX_EVEX_0F6E,
1470 PREFIX_EVEX_0F6F,
1471 PREFIX_EVEX_0F70,
1472 PREFIX_EVEX_0F71_REG_2,
1473 PREFIX_EVEX_0F71_REG_4,
1474 PREFIX_EVEX_0F71_REG_6,
1475 PREFIX_EVEX_0F72_REG_0,
1476 PREFIX_EVEX_0F72_REG_1,
1477 PREFIX_EVEX_0F72_REG_2,
1478 PREFIX_EVEX_0F72_REG_4,
1479 PREFIX_EVEX_0F72_REG_6,
1480 PREFIX_EVEX_0F73_REG_2,
1481 PREFIX_EVEX_0F73_REG_3,
1482 PREFIX_EVEX_0F73_REG_6,
1483 PREFIX_EVEX_0F73_REG_7,
1484 PREFIX_EVEX_0F74,
1485 PREFIX_EVEX_0F75,
1486 PREFIX_EVEX_0F76,
1487 PREFIX_EVEX_0F78,
1488 PREFIX_EVEX_0F79,
1489 PREFIX_EVEX_0F7A,
1490 PREFIX_EVEX_0F7B,
1491 PREFIX_EVEX_0F7E,
1492 PREFIX_EVEX_0F7F,
1493 PREFIX_EVEX_0FC2,
1494 PREFIX_EVEX_0FC4,
1495 PREFIX_EVEX_0FC5,
1496 PREFIX_EVEX_0FC6,
1497 PREFIX_EVEX_0FD1,
1498 PREFIX_EVEX_0FD2,
1499 PREFIX_EVEX_0FD3,
1500 PREFIX_EVEX_0FD4,
1501 PREFIX_EVEX_0FD5,
1502 PREFIX_EVEX_0FD6,
1503 PREFIX_EVEX_0FD8,
1504 PREFIX_EVEX_0FD9,
1505 PREFIX_EVEX_0FDA,
1506 PREFIX_EVEX_0FDB,
1507 PREFIX_EVEX_0FDC,
1508 PREFIX_EVEX_0FDD,
1509 PREFIX_EVEX_0FDE,
1510 PREFIX_EVEX_0FDF,
1511 PREFIX_EVEX_0FE0,
1512 PREFIX_EVEX_0FE1,
1513 PREFIX_EVEX_0FE2,
1514 PREFIX_EVEX_0FE3,
1515 PREFIX_EVEX_0FE4,
1516 PREFIX_EVEX_0FE5,
1517 PREFIX_EVEX_0FE6,
1518 PREFIX_EVEX_0FE7,
1519 PREFIX_EVEX_0FE8,
1520 PREFIX_EVEX_0FE9,
1521 PREFIX_EVEX_0FEA,
1522 PREFIX_EVEX_0FEB,
1523 PREFIX_EVEX_0FEC,
1524 PREFIX_EVEX_0FED,
1525 PREFIX_EVEX_0FEE,
1526 PREFIX_EVEX_0FEF,
1527 PREFIX_EVEX_0FF1,
1528 PREFIX_EVEX_0FF2,
1529 PREFIX_EVEX_0FF3,
1530 PREFIX_EVEX_0FF4,
1531 PREFIX_EVEX_0FF5,
1532 PREFIX_EVEX_0FF6,
1533 PREFIX_EVEX_0FF8,
1534 PREFIX_EVEX_0FF9,
1535 PREFIX_EVEX_0FFA,
1536 PREFIX_EVEX_0FFB,
1537 PREFIX_EVEX_0FFC,
1538 PREFIX_EVEX_0FFD,
1539 PREFIX_EVEX_0FFE,
1540 PREFIX_EVEX_0F3800,
1541 PREFIX_EVEX_0F3804,
1542 PREFIX_EVEX_0F380B,
1543 PREFIX_EVEX_0F380C,
1544 PREFIX_EVEX_0F380D,
1545 PREFIX_EVEX_0F3810,
1546 PREFIX_EVEX_0F3811,
1547 PREFIX_EVEX_0F3812,
1548 PREFIX_EVEX_0F3813,
1549 PREFIX_EVEX_0F3814,
1550 PREFIX_EVEX_0F3815,
1551 PREFIX_EVEX_0F3816,
1552 PREFIX_EVEX_0F3818,
1553 PREFIX_EVEX_0F3819,
1554 PREFIX_EVEX_0F381A,
1555 PREFIX_EVEX_0F381B,
1556 PREFIX_EVEX_0F381C,
1557 PREFIX_EVEX_0F381D,
1558 PREFIX_EVEX_0F381E,
1559 PREFIX_EVEX_0F381F,
1560 PREFIX_EVEX_0F3820,
1561 PREFIX_EVEX_0F3821,
1562 PREFIX_EVEX_0F3822,
1563 PREFIX_EVEX_0F3823,
1564 PREFIX_EVEX_0F3824,
1565 PREFIX_EVEX_0F3825,
1566 PREFIX_EVEX_0F3826,
1567 PREFIX_EVEX_0F3827,
1568 PREFIX_EVEX_0F3828,
1569 PREFIX_EVEX_0F3829,
1570 PREFIX_EVEX_0F382A,
1571 PREFIX_EVEX_0F382B,
1572 PREFIX_EVEX_0F382C,
1573 PREFIX_EVEX_0F382D,
1574 PREFIX_EVEX_0F3830,
1575 PREFIX_EVEX_0F3831,
1576 PREFIX_EVEX_0F3832,
1577 PREFIX_EVEX_0F3833,
1578 PREFIX_EVEX_0F3834,
1579 PREFIX_EVEX_0F3835,
1580 PREFIX_EVEX_0F3836,
1581 PREFIX_EVEX_0F3837,
1582 PREFIX_EVEX_0F3838,
1583 PREFIX_EVEX_0F3839,
1584 PREFIX_EVEX_0F383A,
1585 PREFIX_EVEX_0F383B,
1586 PREFIX_EVEX_0F383C,
1587 PREFIX_EVEX_0F383D,
1588 PREFIX_EVEX_0F383E,
1589 PREFIX_EVEX_0F383F,
1590 PREFIX_EVEX_0F3840,
1591 PREFIX_EVEX_0F3842,
1592 PREFIX_EVEX_0F3843,
1593 PREFIX_EVEX_0F3844,
1594 PREFIX_EVEX_0F3845,
1595 PREFIX_EVEX_0F3846,
1596 PREFIX_EVEX_0F3847,
1597 PREFIX_EVEX_0F384C,
1598 PREFIX_EVEX_0F384D,
1599 PREFIX_EVEX_0F384E,
1600 PREFIX_EVEX_0F384F,
1601 PREFIX_EVEX_0F3850,
1602 PREFIX_EVEX_0F3851,
1603 PREFIX_EVEX_0F3852,
1604 PREFIX_EVEX_0F3853,
1605 PREFIX_EVEX_0F3854,
1606 PREFIX_EVEX_0F3855,
1607 PREFIX_EVEX_0F3858,
1608 PREFIX_EVEX_0F3859,
1609 PREFIX_EVEX_0F385A,
1610 PREFIX_EVEX_0F385B,
1611 PREFIX_EVEX_0F3862,
1612 PREFIX_EVEX_0F3863,
1613 PREFIX_EVEX_0F3864,
1614 PREFIX_EVEX_0F3865,
1615 PREFIX_EVEX_0F3866,
1616 PREFIX_EVEX_0F3870,
1617 PREFIX_EVEX_0F3871,
1618 PREFIX_EVEX_0F3872,
1619 PREFIX_EVEX_0F3873,
1620 PREFIX_EVEX_0F3875,
1621 PREFIX_EVEX_0F3876,
1622 PREFIX_EVEX_0F3877,
1623 PREFIX_EVEX_0F3878,
1624 PREFIX_EVEX_0F3879,
1625 PREFIX_EVEX_0F387A,
1626 PREFIX_EVEX_0F387B,
1627 PREFIX_EVEX_0F387C,
1628 PREFIX_EVEX_0F387D,
1629 PREFIX_EVEX_0F387E,
1630 PREFIX_EVEX_0F387F,
1631 PREFIX_EVEX_0F3883,
1632 PREFIX_EVEX_0F3888,
1633 PREFIX_EVEX_0F3889,
1634 PREFIX_EVEX_0F388A,
1635 PREFIX_EVEX_0F388B,
1636 PREFIX_EVEX_0F388D,
1637 PREFIX_EVEX_0F388F,
1638 PREFIX_EVEX_0F3890,
1639 PREFIX_EVEX_0F3891,
1640 PREFIX_EVEX_0F3892,
1641 PREFIX_EVEX_0F3893,
1642 PREFIX_EVEX_0F3896,
1643 PREFIX_EVEX_0F3897,
1644 PREFIX_EVEX_0F3898,
1645 PREFIX_EVEX_0F3899,
1646 PREFIX_EVEX_0F389A,
1647 PREFIX_EVEX_0F389B,
1648 PREFIX_EVEX_0F389C,
1649 PREFIX_EVEX_0F389D,
1650 PREFIX_EVEX_0F389E,
1651 PREFIX_EVEX_0F389F,
1652 PREFIX_EVEX_0F38A0,
1653 PREFIX_EVEX_0F38A1,
1654 PREFIX_EVEX_0F38A2,
1655 PREFIX_EVEX_0F38A3,
1656 PREFIX_EVEX_0F38A6,
1657 PREFIX_EVEX_0F38A7,
1658 PREFIX_EVEX_0F38A8,
1659 PREFIX_EVEX_0F38A9,
1660 PREFIX_EVEX_0F38AA,
1661 PREFIX_EVEX_0F38AB,
1662 PREFIX_EVEX_0F38AC,
1663 PREFIX_EVEX_0F38AD,
1664 PREFIX_EVEX_0F38AE,
1665 PREFIX_EVEX_0F38AF,
1666 PREFIX_EVEX_0F38B4,
1667 PREFIX_EVEX_0F38B5,
1668 PREFIX_EVEX_0F38B6,
1669 PREFIX_EVEX_0F38B7,
1670 PREFIX_EVEX_0F38B8,
1671 PREFIX_EVEX_0F38B9,
1672 PREFIX_EVEX_0F38BA,
1673 PREFIX_EVEX_0F38BB,
1674 PREFIX_EVEX_0F38BC,
1675 PREFIX_EVEX_0F38BD,
1676 PREFIX_EVEX_0F38BE,
1677 PREFIX_EVEX_0F38BF,
1678 PREFIX_EVEX_0F38C4,
1679 PREFIX_EVEX_0F38C6_REG_1,
1680 PREFIX_EVEX_0F38C6_REG_2,
1681 PREFIX_EVEX_0F38C6_REG_5,
1682 PREFIX_EVEX_0F38C6_REG_6,
1683 PREFIX_EVEX_0F38C7_REG_1,
1684 PREFIX_EVEX_0F38C7_REG_2,
1685 PREFIX_EVEX_0F38C7_REG_5,
1686 PREFIX_EVEX_0F38C7_REG_6,
1687 PREFIX_EVEX_0F38C8,
1688 PREFIX_EVEX_0F38CA,
1689 PREFIX_EVEX_0F38CB,
1690 PREFIX_EVEX_0F38CC,
1691 PREFIX_EVEX_0F38CD,
1692 PREFIX_EVEX_0F38CF,
1693 PREFIX_EVEX_0F38DC,
1694 PREFIX_EVEX_0F38DD,
1695 PREFIX_EVEX_0F38DE,
1696 PREFIX_EVEX_0F38DF,
1697
1698 PREFIX_EVEX_0F3A00,
1699 PREFIX_EVEX_0F3A01,
1700 PREFIX_EVEX_0F3A03,
1701 PREFIX_EVEX_0F3A04,
1702 PREFIX_EVEX_0F3A05,
1703 PREFIX_EVEX_0F3A08,
1704 PREFIX_EVEX_0F3A09,
1705 PREFIX_EVEX_0F3A0A,
1706 PREFIX_EVEX_0F3A0B,
1707 PREFIX_EVEX_0F3A0F,
1708 PREFIX_EVEX_0F3A14,
1709 PREFIX_EVEX_0F3A15,
1710 PREFIX_EVEX_0F3A16,
1711 PREFIX_EVEX_0F3A17,
1712 PREFIX_EVEX_0F3A18,
1713 PREFIX_EVEX_0F3A19,
1714 PREFIX_EVEX_0F3A1A,
1715 PREFIX_EVEX_0F3A1B,
1716 PREFIX_EVEX_0F3A1D,
1717 PREFIX_EVEX_0F3A1E,
1718 PREFIX_EVEX_0F3A1F,
1719 PREFIX_EVEX_0F3A20,
1720 PREFIX_EVEX_0F3A21,
1721 PREFIX_EVEX_0F3A22,
1722 PREFIX_EVEX_0F3A23,
1723 PREFIX_EVEX_0F3A25,
1724 PREFIX_EVEX_0F3A26,
1725 PREFIX_EVEX_0F3A27,
1726 PREFIX_EVEX_0F3A38,
1727 PREFIX_EVEX_0F3A39,
1728 PREFIX_EVEX_0F3A3A,
1729 PREFIX_EVEX_0F3A3B,
1730 PREFIX_EVEX_0F3A3E,
1731 PREFIX_EVEX_0F3A3F,
1732 PREFIX_EVEX_0F3A42,
1733 PREFIX_EVEX_0F3A43,
1734 PREFIX_EVEX_0F3A44,
1735 PREFIX_EVEX_0F3A50,
1736 PREFIX_EVEX_0F3A51,
1737 PREFIX_EVEX_0F3A54,
1738 PREFIX_EVEX_0F3A55,
1739 PREFIX_EVEX_0F3A56,
1740 PREFIX_EVEX_0F3A57,
1741 PREFIX_EVEX_0F3A66,
1742 PREFIX_EVEX_0F3A67,
1743 PREFIX_EVEX_0F3A70,
1744 PREFIX_EVEX_0F3A71,
1745 PREFIX_EVEX_0F3A72,
1746 PREFIX_EVEX_0F3A73,
1747 PREFIX_EVEX_0F3ACE,
1748 PREFIX_EVEX_0F3ACF
1749 };
1750
1751 enum
1752 {
1753 X86_64_06 = 0,
1754 X86_64_07,
1755 X86_64_0D,
1756 X86_64_16,
1757 X86_64_17,
1758 X86_64_1E,
1759 X86_64_1F,
1760 X86_64_27,
1761 X86_64_2F,
1762 X86_64_37,
1763 X86_64_3F,
1764 X86_64_60,
1765 X86_64_61,
1766 X86_64_62,
1767 X86_64_63,
1768 X86_64_6D,
1769 X86_64_6F,
1770 X86_64_82,
1771 X86_64_9A,
1772 X86_64_C4,
1773 X86_64_C5,
1774 X86_64_CE,
1775 X86_64_D4,
1776 X86_64_D5,
1777 X86_64_E8,
1778 X86_64_E9,
1779 X86_64_EA,
1780 X86_64_0F01_REG_0,
1781 X86_64_0F01_REG_1,
1782 X86_64_0F01_REG_2,
1783 X86_64_0F01_REG_3
1784 };
1785
1786 enum
1787 {
1788 THREE_BYTE_0F38 = 0,
1789 THREE_BYTE_0F3A
1790 };
1791
1792 enum
1793 {
1794 XOP_08 = 0,
1795 XOP_09,
1796 XOP_0A
1797 };
1798
1799 enum
1800 {
1801 VEX_0F = 0,
1802 VEX_0F38,
1803 VEX_0F3A
1804 };
1805
1806 enum
1807 {
1808 EVEX_0F = 0,
1809 EVEX_0F38,
1810 EVEX_0F3A
1811 };
1812
1813 enum
1814 {
1815 VEX_LEN_0F12_P_0_M_0 = 0,
1816 VEX_LEN_0F12_P_0_M_1,
1817 VEX_LEN_0F12_P_2,
1818 VEX_LEN_0F13_M_0,
1819 VEX_LEN_0F16_P_0_M_0,
1820 VEX_LEN_0F16_P_0_M_1,
1821 VEX_LEN_0F16_P_2,
1822 VEX_LEN_0F17_M_0,
1823 VEX_LEN_0F2A_P_1,
1824 VEX_LEN_0F2A_P_3,
1825 VEX_LEN_0F2C_P_1,
1826 VEX_LEN_0F2C_P_3,
1827 VEX_LEN_0F2D_P_1,
1828 VEX_LEN_0F2D_P_3,
1829 VEX_LEN_0F41_P_0,
1830 VEX_LEN_0F41_P_2,
1831 VEX_LEN_0F42_P_0,
1832 VEX_LEN_0F42_P_2,
1833 VEX_LEN_0F44_P_0,
1834 VEX_LEN_0F44_P_2,
1835 VEX_LEN_0F45_P_0,
1836 VEX_LEN_0F45_P_2,
1837 VEX_LEN_0F46_P_0,
1838 VEX_LEN_0F46_P_2,
1839 VEX_LEN_0F47_P_0,
1840 VEX_LEN_0F47_P_2,
1841 VEX_LEN_0F4A_P_0,
1842 VEX_LEN_0F4A_P_2,
1843 VEX_LEN_0F4B_P_0,
1844 VEX_LEN_0F4B_P_2,
1845 VEX_LEN_0F6E_P_2,
1846 VEX_LEN_0F77_P_0,
1847 VEX_LEN_0F7E_P_1,
1848 VEX_LEN_0F7E_P_2,
1849 VEX_LEN_0F90_P_0,
1850 VEX_LEN_0F90_P_2,
1851 VEX_LEN_0F91_P_0,
1852 VEX_LEN_0F91_P_2,
1853 VEX_LEN_0F92_P_0,
1854 VEX_LEN_0F92_P_2,
1855 VEX_LEN_0F92_P_3,
1856 VEX_LEN_0F93_P_0,
1857 VEX_LEN_0F93_P_2,
1858 VEX_LEN_0F93_P_3,
1859 VEX_LEN_0F98_P_0,
1860 VEX_LEN_0F98_P_2,
1861 VEX_LEN_0F99_P_0,
1862 VEX_LEN_0F99_P_2,
1863 VEX_LEN_0FAE_R_2_M_0,
1864 VEX_LEN_0FAE_R_3_M_0,
1865 VEX_LEN_0FC4_P_2,
1866 VEX_LEN_0FC5_P_2,
1867 VEX_LEN_0FD6_P_2,
1868 VEX_LEN_0FF7_P_2,
1869 VEX_LEN_0F3816_P_2,
1870 VEX_LEN_0F3819_P_2,
1871 VEX_LEN_0F381A_P_2_M_0,
1872 VEX_LEN_0F3836_P_2,
1873 VEX_LEN_0F3841_P_2,
1874 VEX_LEN_0F385A_P_2_M_0,
1875 VEX_LEN_0F38DB_P_2,
1876 VEX_LEN_0F38F2_P_0,
1877 VEX_LEN_0F38F3_R_1_P_0,
1878 VEX_LEN_0F38F3_R_2_P_0,
1879 VEX_LEN_0F38F3_R_3_P_0,
1880 VEX_LEN_0F38F5_P_0,
1881 VEX_LEN_0F38F5_P_1,
1882 VEX_LEN_0F38F5_P_3,
1883 VEX_LEN_0F38F6_P_3,
1884 VEX_LEN_0F38F7_P_0,
1885 VEX_LEN_0F38F7_P_1,
1886 VEX_LEN_0F38F7_P_2,
1887 VEX_LEN_0F38F7_P_3,
1888 VEX_LEN_0F3A00_P_2,
1889 VEX_LEN_0F3A01_P_2,
1890 VEX_LEN_0F3A06_P_2,
1891 VEX_LEN_0F3A14_P_2,
1892 VEX_LEN_0F3A15_P_2,
1893 VEX_LEN_0F3A16_P_2,
1894 VEX_LEN_0F3A17_P_2,
1895 VEX_LEN_0F3A18_P_2,
1896 VEX_LEN_0F3A19_P_2,
1897 VEX_LEN_0F3A20_P_2,
1898 VEX_LEN_0F3A21_P_2,
1899 VEX_LEN_0F3A22_P_2,
1900 VEX_LEN_0F3A30_P_2,
1901 VEX_LEN_0F3A31_P_2,
1902 VEX_LEN_0F3A32_P_2,
1903 VEX_LEN_0F3A33_P_2,
1904 VEX_LEN_0F3A38_P_2,
1905 VEX_LEN_0F3A39_P_2,
1906 VEX_LEN_0F3A41_P_2,
1907 VEX_LEN_0F3A46_P_2,
1908 VEX_LEN_0F3A60_P_2,
1909 VEX_LEN_0F3A61_P_2,
1910 VEX_LEN_0F3A62_P_2,
1911 VEX_LEN_0F3A63_P_2,
1912 VEX_LEN_0F3A6A_P_2,
1913 VEX_LEN_0F3A6B_P_2,
1914 VEX_LEN_0F3A6E_P_2,
1915 VEX_LEN_0F3A6F_P_2,
1916 VEX_LEN_0F3A7A_P_2,
1917 VEX_LEN_0F3A7B_P_2,
1918 VEX_LEN_0F3A7E_P_2,
1919 VEX_LEN_0F3A7F_P_2,
1920 VEX_LEN_0F3ADF_P_2,
1921 VEX_LEN_0F3AF0_P_3,
1922 VEX_LEN_0FXOP_08_CC,
1923 VEX_LEN_0FXOP_08_CD,
1924 VEX_LEN_0FXOP_08_CE,
1925 VEX_LEN_0FXOP_08_CF,
1926 VEX_LEN_0FXOP_08_EC,
1927 VEX_LEN_0FXOP_08_ED,
1928 VEX_LEN_0FXOP_08_EE,
1929 VEX_LEN_0FXOP_08_EF,
1930 VEX_LEN_0FXOP_09_80,
1931 VEX_LEN_0FXOP_09_81
1932 };
1933
1934 enum
1935 {
1936 EVEX_LEN_0F6E_P_2 = 0,
1937 EVEX_LEN_0F7E_P_1,
1938 EVEX_LEN_0F7E_P_2,
1939 EVEX_LEN_0FD6_P_2
1940 };
1941
1942 enum
1943 {
1944 VEX_W_0F41_P_0_LEN_1 = 0,
1945 VEX_W_0F41_P_2_LEN_1,
1946 VEX_W_0F42_P_0_LEN_1,
1947 VEX_W_0F42_P_2_LEN_1,
1948 VEX_W_0F44_P_0_LEN_0,
1949 VEX_W_0F44_P_2_LEN_0,
1950 VEX_W_0F45_P_0_LEN_1,
1951 VEX_W_0F45_P_2_LEN_1,
1952 VEX_W_0F46_P_0_LEN_1,
1953 VEX_W_0F46_P_2_LEN_1,
1954 VEX_W_0F47_P_0_LEN_1,
1955 VEX_W_0F47_P_2_LEN_1,
1956 VEX_W_0F4A_P_0_LEN_1,
1957 VEX_W_0F4A_P_2_LEN_1,
1958 VEX_W_0F4B_P_0_LEN_1,
1959 VEX_W_0F4B_P_2_LEN_1,
1960 VEX_W_0F90_P_0_LEN_0,
1961 VEX_W_0F90_P_2_LEN_0,
1962 VEX_W_0F91_P_0_LEN_0,
1963 VEX_W_0F91_P_2_LEN_0,
1964 VEX_W_0F92_P_0_LEN_0,
1965 VEX_W_0F92_P_2_LEN_0,
1966 VEX_W_0F92_P_3_LEN_0,
1967 VEX_W_0F93_P_0_LEN_0,
1968 VEX_W_0F93_P_2_LEN_0,
1969 VEX_W_0F93_P_3_LEN_0,
1970 VEX_W_0F98_P_0_LEN_0,
1971 VEX_W_0F98_P_2_LEN_0,
1972 VEX_W_0F99_P_0_LEN_0,
1973 VEX_W_0F99_P_2_LEN_0,
1974 VEX_W_0FC4_P_2,
1975 VEX_W_0FC5_P_2,
1976 VEX_W_0F380C_P_2,
1977 VEX_W_0F380D_P_2,
1978 VEX_W_0F380E_P_2,
1979 VEX_W_0F380F_P_2,
1980 VEX_W_0F3816_P_2,
1981 VEX_W_0F3818_P_2,
1982 VEX_W_0F3819_P_2,
1983 VEX_W_0F381A_P_2_M_0,
1984 VEX_W_0F382C_P_2_M_0,
1985 VEX_W_0F382D_P_2_M_0,
1986 VEX_W_0F382E_P_2_M_0,
1987 VEX_W_0F382F_P_2_M_0,
1988 VEX_W_0F3836_P_2,
1989 VEX_W_0F3846_P_2,
1990 VEX_W_0F3858_P_2,
1991 VEX_W_0F3859_P_2,
1992 VEX_W_0F385A_P_2_M_0,
1993 VEX_W_0F3878_P_2,
1994 VEX_W_0F3879_P_2,
1995 VEX_W_0F38CF_P_2,
1996 VEX_W_0F3A00_P_2,
1997 VEX_W_0F3A01_P_2,
1998 VEX_W_0F3A02_P_2,
1999 VEX_W_0F3A04_P_2,
2000 VEX_W_0F3A05_P_2,
2001 VEX_W_0F3A06_P_2,
2002 VEX_W_0F3A14_P_2,
2003 VEX_W_0F3A15_P_2,
2004 VEX_W_0F3A18_P_2,
2005 VEX_W_0F3A19_P_2,
2006 VEX_W_0F3A20_P_2,
2007 VEX_W_0F3A30_P_2_LEN_0,
2008 VEX_W_0F3A31_P_2_LEN_0,
2009 VEX_W_0F3A32_P_2_LEN_0,
2010 VEX_W_0F3A33_P_2_LEN_0,
2011 VEX_W_0F3A38_P_2,
2012 VEX_W_0F3A39_P_2,
2013 VEX_W_0F3A46_P_2,
2014 VEX_W_0F3A48_P_2,
2015 VEX_W_0F3A49_P_2,
2016 VEX_W_0F3A4A_P_2,
2017 VEX_W_0F3A4B_P_2,
2018 VEX_W_0F3A4C_P_2,
2019 VEX_W_0F3ACE_P_2,
2020 VEX_W_0F3ACF_P_2,
2021
2022 EVEX_W_0F10_P_0,
2023 EVEX_W_0F10_P_1_M_0,
2024 EVEX_W_0F10_P_1_M_1,
2025 EVEX_W_0F10_P_2,
2026 EVEX_W_0F10_P_3_M_0,
2027 EVEX_W_0F10_P_3_M_1,
2028 EVEX_W_0F11_P_0,
2029 EVEX_W_0F11_P_1_M_0,
2030 EVEX_W_0F11_P_1_M_1,
2031 EVEX_W_0F11_P_2,
2032 EVEX_W_0F11_P_3_M_0,
2033 EVEX_W_0F11_P_3_M_1,
2034 EVEX_W_0F12_P_0_M_0,
2035 EVEX_W_0F12_P_0_M_1,
2036 EVEX_W_0F12_P_1,
2037 EVEX_W_0F12_P_2,
2038 EVEX_W_0F12_P_3,
2039 EVEX_W_0F13_P_0,
2040 EVEX_W_0F13_P_2,
2041 EVEX_W_0F14_P_0,
2042 EVEX_W_0F14_P_2,
2043 EVEX_W_0F15_P_0,
2044 EVEX_W_0F15_P_2,
2045 EVEX_W_0F16_P_0_M_0,
2046 EVEX_W_0F16_P_0_M_1,
2047 EVEX_W_0F16_P_1,
2048 EVEX_W_0F16_P_2,
2049 EVEX_W_0F17_P_0,
2050 EVEX_W_0F17_P_2,
2051 EVEX_W_0F28_P_0,
2052 EVEX_W_0F28_P_2,
2053 EVEX_W_0F29_P_0,
2054 EVEX_W_0F29_P_2,
2055 EVEX_W_0F2A_P_1,
2056 EVEX_W_0F2A_P_3,
2057 EVEX_W_0F2B_P_0,
2058 EVEX_W_0F2B_P_2,
2059 EVEX_W_0F2E_P_0,
2060 EVEX_W_0F2E_P_2,
2061 EVEX_W_0F2F_P_0,
2062 EVEX_W_0F2F_P_2,
2063 EVEX_W_0F51_P_0,
2064 EVEX_W_0F51_P_1,
2065 EVEX_W_0F51_P_2,
2066 EVEX_W_0F51_P_3,
2067 EVEX_W_0F54_P_0,
2068 EVEX_W_0F54_P_2,
2069 EVEX_W_0F55_P_0,
2070 EVEX_W_0F55_P_2,
2071 EVEX_W_0F56_P_0,
2072 EVEX_W_0F56_P_2,
2073 EVEX_W_0F57_P_0,
2074 EVEX_W_0F57_P_2,
2075 EVEX_W_0F58_P_0,
2076 EVEX_W_0F58_P_1,
2077 EVEX_W_0F58_P_2,
2078 EVEX_W_0F58_P_3,
2079 EVEX_W_0F59_P_0,
2080 EVEX_W_0F59_P_1,
2081 EVEX_W_0F59_P_2,
2082 EVEX_W_0F59_P_3,
2083 EVEX_W_0F5A_P_0,
2084 EVEX_W_0F5A_P_1,
2085 EVEX_W_0F5A_P_2,
2086 EVEX_W_0F5A_P_3,
2087 EVEX_W_0F5B_P_0,
2088 EVEX_W_0F5B_P_1,
2089 EVEX_W_0F5B_P_2,
2090 EVEX_W_0F5C_P_0,
2091 EVEX_W_0F5C_P_1,
2092 EVEX_W_0F5C_P_2,
2093 EVEX_W_0F5C_P_3,
2094 EVEX_W_0F5D_P_0,
2095 EVEX_W_0F5D_P_1,
2096 EVEX_W_0F5D_P_2,
2097 EVEX_W_0F5D_P_3,
2098 EVEX_W_0F5E_P_0,
2099 EVEX_W_0F5E_P_1,
2100 EVEX_W_0F5E_P_2,
2101 EVEX_W_0F5E_P_3,
2102 EVEX_W_0F5F_P_0,
2103 EVEX_W_0F5F_P_1,
2104 EVEX_W_0F5F_P_2,
2105 EVEX_W_0F5F_P_3,
2106 EVEX_W_0F62_P_2,
2107 EVEX_W_0F66_P_2,
2108 EVEX_W_0F6A_P_2,
2109 EVEX_W_0F6B_P_2,
2110 EVEX_W_0F6C_P_2,
2111 EVEX_W_0F6D_P_2,
2112 EVEX_W_0F6E_P_2,
2113 EVEX_W_0F6F_P_1,
2114 EVEX_W_0F6F_P_2,
2115 EVEX_W_0F6F_P_3,
2116 EVEX_W_0F70_P_2,
2117 EVEX_W_0F72_R_2_P_2,
2118 EVEX_W_0F72_R_6_P_2,
2119 EVEX_W_0F73_R_2_P_2,
2120 EVEX_W_0F73_R_6_P_2,
2121 EVEX_W_0F76_P_2,
2122 EVEX_W_0F78_P_0,
2123 EVEX_W_0F78_P_2,
2124 EVEX_W_0F79_P_0,
2125 EVEX_W_0F79_P_2,
2126 EVEX_W_0F7A_P_1,
2127 EVEX_W_0F7A_P_2,
2128 EVEX_W_0F7A_P_3,
2129 EVEX_W_0F7B_P_1,
2130 EVEX_W_0F7B_P_2,
2131 EVEX_W_0F7B_P_3,
2132 EVEX_W_0F7E_P_1,
2133 EVEX_W_0F7E_P_2,
2134 EVEX_W_0F7F_P_1,
2135 EVEX_W_0F7F_P_2,
2136 EVEX_W_0F7F_P_3,
2137 EVEX_W_0FC2_P_0,
2138 EVEX_W_0FC2_P_1,
2139 EVEX_W_0FC2_P_2,
2140 EVEX_W_0FC2_P_3,
2141 EVEX_W_0FC6_P_0,
2142 EVEX_W_0FC6_P_2,
2143 EVEX_W_0FD2_P_2,
2144 EVEX_W_0FD3_P_2,
2145 EVEX_W_0FD4_P_2,
2146 EVEX_W_0FD6_P_2,
2147 EVEX_W_0FE6_P_1,
2148 EVEX_W_0FE6_P_2,
2149 EVEX_W_0FE6_P_3,
2150 EVEX_W_0FE7_P_2,
2151 EVEX_W_0FF2_P_2,
2152 EVEX_W_0FF3_P_2,
2153 EVEX_W_0FF4_P_2,
2154 EVEX_W_0FFA_P_2,
2155 EVEX_W_0FFB_P_2,
2156 EVEX_W_0FFE_P_2,
2157 EVEX_W_0F380C_P_2,
2158 EVEX_W_0F380D_P_2,
2159 EVEX_W_0F3810_P_1,
2160 EVEX_W_0F3810_P_2,
2161 EVEX_W_0F3811_P_1,
2162 EVEX_W_0F3811_P_2,
2163 EVEX_W_0F3812_P_1,
2164 EVEX_W_0F3812_P_2,
2165 EVEX_W_0F3813_P_1,
2166 EVEX_W_0F3813_P_2,
2167 EVEX_W_0F3814_P_1,
2168 EVEX_W_0F3815_P_1,
2169 EVEX_W_0F3818_P_2,
2170 EVEX_W_0F3819_P_2,
2171 EVEX_W_0F381A_P_2,
2172 EVEX_W_0F381B_P_2,
2173 EVEX_W_0F381E_P_2,
2174 EVEX_W_0F381F_P_2,
2175 EVEX_W_0F3820_P_1,
2176 EVEX_W_0F3821_P_1,
2177 EVEX_W_0F3822_P_1,
2178 EVEX_W_0F3823_P_1,
2179 EVEX_W_0F3824_P_1,
2180 EVEX_W_0F3825_P_1,
2181 EVEX_W_0F3825_P_2,
2182 EVEX_W_0F3826_P_1,
2183 EVEX_W_0F3826_P_2,
2184 EVEX_W_0F3828_P_1,
2185 EVEX_W_0F3828_P_2,
2186 EVEX_W_0F3829_P_1,
2187 EVEX_W_0F3829_P_2,
2188 EVEX_W_0F382A_P_1,
2189 EVEX_W_0F382A_P_2,
2190 EVEX_W_0F382B_P_2,
2191 EVEX_W_0F3830_P_1,
2192 EVEX_W_0F3831_P_1,
2193 EVEX_W_0F3832_P_1,
2194 EVEX_W_0F3833_P_1,
2195 EVEX_W_0F3834_P_1,
2196 EVEX_W_0F3835_P_1,
2197 EVEX_W_0F3835_P_2,
2198 EVEX_W_0F3837_P_2,
2199 EVEX_W_0F3838_P_1,
2200 EVEX_W_0F3839_P_1,
2201 EVEX_W_0F383A_P_1,
2202 EVEX_W_0F3840_P_2,
2203 EVEX_W_0F3854_P_2,
2204 EVEX_W_0F3855_P_2,
2205 EVEX_W_0F3858_P_2,
2206 EVEX_W_0F3859_P_2,
2207 EVEX_W_0F385A_P_2,
2208 EVEX_W_0F385B_P_2,
2209 EVEX_W_0F3862_P_2,
2210 EVEX_W_0F3863_P_2,
2211 EVEX_W_0F3866_P_2,
2212 EVEX_W_0F3870_P_2,
2213 EVEX_W_0F3871_P_2,
2214 EVEX_W_0F3872_P_2,
2215 EVEX_W_0F3873_P_2,
2216 EVEX_W_0F3875_P_2,
2217 EVEX_W_0F3878_P_2,
2218 EVEX_W_0F3879_P_2,
2219 EVEX_W_0F387A_P_2,
2220 EVEX_W_0F387B_P_2,
2221 EVEX_W_0F387D_P_2,
2222 EVEX_W_0F3883_P_2,
2223 EVEX_W_0F388D_P_2,
2224 EVEX_W_0F3891_P_2,
2225 EVEX_W_0F3893_P_2,
2226 EVEX_W_0F38A1_P_2,
2227 EVEX_W_0F38A3_P_2,
2228 EVEX_W_0F38C7_R_1_P_2,
2229 EVEX_W_0F38C7_R_2_P_2,
2230 EVEX_W_0F38C7_R_5_P_2,
2231 EVEX_W_0F38C7_R_6_P_2,
2232
2233 EVEX_W_0F3A00_P_2,
2234 EVEX_W_0F3A01_P_2,
2235 EVEX_W_0F3A04_P_2,
2236 EVEX_W_0F3A05_P_2,
2237 EVEX_W_0F3A08_P_2,
2238 EVEX_W_0F3A09_P_2,
2239 EVEX_W_0F3A0A_P_2,
2240 EVEX_W_0F3A0B_P_2,
2241 EVEX_W_0F3A16_P_2,
2242 EVEX_W_0F3A18_P_2,
2243 EVEX_W_0F3A19_P_2,
2244 EVEX_W_0F3A1A_P_2,
2245 EVEX_W_0F3A1B_P_2,
2246 EVEX_W_0F3A1D_P_2,
2247 EVEX_W_0F3A21_P_2,
2248 EVEX_W_0F3A22_P_2,
2249 EVEX_W_0F3A23_P_2,
2250 EVEX_W_0F3A38_P_2,
2251 EVEX_W_0F3A39_P_2,
2252 EVEX_W_0F3A3A_P_2,
2253 EVEX_W_0F3A3B_P_2,
2254 EVEX_W_0F3A3E_P_2,
2255 EVEX_W_0F3A3F_P_2,
2256 EVEX_W_0F3A42_P_2,
2257 EVEX_W_0F3A43_P_2,
2258 EVEX_W_0F3A50_P_2,
2259 EVEX_W_0F3A51_P_2,
2260 EVEX_W_0F3A56_P_2,
2261 EVEX_W_0F3A57_P_2,
2262 EVEX_W_0F3A66_P_2,
2263 EVEX_W_0F3A67_P_2,
2264 EVEX_W_0F3A70_P_2,
2265 EVEX_W_0F3A71_P_2,
2266 EVEX_W_0F3A72_P_2,
2267 EVEX_W_0F3A73_P_2,
2268 EVEX_W_0F3ACE_P_2,
2269 EVEX_W_0F3ACF_P_2
2270 };
2271
2272 typedef void (*op_rtn) (int bytemode, int sizeflag);
2273
2274 struct dis386 {
2275 const char *name;
2276 struct
2277 {
2278 op_rtn rtn;
2279 int bytemode;
2280 } op[MAX_OPERANDS];
2281 unsigned int prefix_requirement;
2282 };
2283
2284 /* Upper case letters in the instruction names here are macros.
2285 'A' => print 'b' if no register operands or suffix_always is true
2286 'B' => print 'b' if suffix_always is true
2287 'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
2288 size prefix
2289 'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
2290 suffix_always is true
2291 'E' => print 'e' if 32-bit form of jcxz
2292 'F' => print 'w' or 'l' depending on address size prefix (loop insns)
2293 'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
2294 'H' => print ",pt" or ",pn" branch hint
2295 'I' => honor following macro letter even in Intel mode (implemented only
2296 for some of the macro letters)
2297 'J' => print 'l'
2298 'K' => print 'd' or 'q' if rex prefix is present.
2299 'L' => print 'l' if suffix_always is true
2300 'M' => print 'r' if intel_mnemonic is false.
2301 'N' => print 'n' if instruction has no wait "prefix"
2302 'O' => print 'd' or 'o' (or 'q' in Intel mode)
2303 'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix,
2304 or suffix_always is true. print 'q' if rex prefix is present.
2305 'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
2306 is true
2307 'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
2308 'S' => print 'w', 'l' or 'q' if suffix_always is true
2309 'T' => print 'q' in 64bit mode if instruction has no operand size
2310 prefix and behave as 'P' otherwise
2311 'U' => print 'q' in 64bit mode if instruction has no operand size
2312 prefix and behave as 'Q' otherwise
2313 'V' => print 'q' in 64bit mode if instruction has no operand size
2314 prefix and behave as 'S' otherwise
2315 'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
2316 'X' => print 's', 'd' depending on data16 prefix (for XMM)
2317 'Y' unused.
2318 'Z' => print 'q' in 64bit mode and behave as 'L' otherwise
2319 '!' => change condition from true to false or from false to true.
2320 '%' => add 1 upper case letter to the macro.
2321 '^' => print 'w' or 'l' depending on operand size prefix or
2322 suffix_always is true (lcall/ljmp).
2323 '@' => print 'q' for Intel64 ISA, 'w' or 'q' for AMD64 ISA depending
2324 on operand size prefix.
2325 '&' => print 'q' in 64bit mode for Intel64 ISA or if instruction
2326 has no operand size prefix for AMD64 ISA, behave as 'P'
2327 otherwise
2328
2329 2 upper case letter macros:
2330 "XY" => print 'x' or 'y' if suffix_always is true or no register
2331 operands and no broadcast.
2332 "XZ" => print 'x', 'y', or 'z' if suffix_always is true or no
2333 register operands and no broadcast.
2334 "XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
2335 "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand
2336 or suffix_always is true
2337 "LB" => print "abs" in 64bit mode and behave as 'B' otherwise
2338 "LS" => print "abs" in 64bit mode and behave as 'S' otherwise
2339 "LV" => print "abs" for 64bit operand and behave as 'S' otherwise
2340 "LW" => print 'd', 'q' depending on the VEX.W bit
2341 "LP" => print 'w' or 'l' ('d' in Intel mode) if instruction has
2342 an operand size prefix, or suffix_always is true. print
2343 'q' if rex prefix is present.
2344
2345 Many of the above letters print nothing in Intel mode. See "putop"
2346 for the details.
2347
2348 Braces '{' and '}', and vertical bars '|', indicate alternative
2349 mnemonic strings for AT&T and Intel. */
2350
2351 static const struct dis386 dis386[] = {
2352 /* 00 */
2353 { "addB", { Ebh1, Gb }, 0 },
2354 { "addS", { Evh1, Gv }, 0 },
2355 { "addB", { Gb, EbS }, 0 },
2356 { "addS", { Gv, EvS }, 0 },
2357 { "addB", { AL, Ib }, 0 },
2358 { "addS", { eAX, Iv }, 0 },
2359 { X86_64_TABLE (X86_64_06) },
2360 { X86_64_TABLE (X86_64_07) },
2361 /* 08 */
2362 { "orB", { Ebh1, Gb }, 0 },
2363 { "orS", { Evh1, Gv }, 0 },
2364 { "orB", { Gb, EbS }, 0 },
2365 { "orS", { Gv, EvS }, 0 },
2366 { "orB", { AL, Ib }, 0 },
2367 { "orS", { eAX, Iv }, 0 },
2368 { X86_64_TABLE (X86_64_0D) },
2369 { Bad_Opcode }, /* 0x0f extended opcode escape */
2370 /* 10 */
2371 { "adcB", { Ebh1, Gb }, 0 },
2372 { "adcS", { Evh1, Gv }, 0 },
2373 { "adcB", { Gb, EbS }, 0 },
2374 { "adcS", { Gv, EvS }, 0 },
2375 { "adcB", { AL, Ib }, 0 },
2376 { "adcS", { eAX, Iv }, 0 },
2377 { X86_64_TABLE (X86_64_16) },
2378 { X86_64_TABLE (X86_64_17) },
2379 /* 18 */
2380 { "sbbB", { Ebh1, Gb }, 0 },
2381 { "sbbS", { Evh1, Gv }, 0 },
2382 { "sbbB", { Gb, EbS }, 0 },
2383 { "sbbS", { Gv, EvS }, 0 },
2384 { "sbbB", { AL, Ib }, 0 },
2385 { "sbbS", { eAX, Iv }, 0 },
2386 { X86_64_TABLE (X86_64_1E) },
2387 { X86_64_TABLE (X86_64_1F) },
2388 /* 20 */
2389 { "andB", { Ebh1, Gb }, 0 },
2390 { "andS", { Evh1, Gv }, 0 },
2391 { "andB", { Gb, EbS }, 0 },
2392 { "andS", { Gv, EvS }, 0 },
2393 { "andB", { AL, Ib }, 0 },
2394 { "andS", { eAX, Iv }, 0 },
2395 { Bad_Opcode }, /* SEG ES prefix */
2396 { X86_64_TABLE (X86_64_27) },
2397 /* 28 */
2398 { "subB", { Ebh1, Gb }, 0 },
2399 { "subS", { Evh1, Gv }, 0 },
2400 { "subB", { Gb, EbS }, 0 },
2401 { "subS", { Gv, EvS }, 0 },
2402 { "subB", { AL, Ib }, 0 },
2403 { "subS", { eAX, Iv }, 0 },
2404 { Bad_Opcode }, /* SEG CS prefix */
2405 { X86_64_TABLE (X86_64_2F) },
2406 /* 30 */
2407 { "xorB", { Ebh1, Gb }, 0 },
2408 { "xorS", { Evh1, Gv }, 0 },
2409 { "xorB", { Gb, EbS }, 0 },
2410 { "xorS", { Gv, EvS }, 0 },
2411 { "xorB", { AL, Ib }, 0 },
2412 { "xorS", { eAX, Iv }, 0 },
2413 { Bad_Opcode }, /* SEG SS prefix */
2414 { X86_64_TABLE (X86_64_37) },
2415 /* 38 */
2416 { "cmpB", { Eb, Gb }, 0 },
2417 { "cmpS", { Ev, Gv }, 0 },
2418 { "cmpB", { Gb, EbS }, 0 },
2419 { "cmpS", { Gv, EvS }, 0 },
2420 { "cmpB", { AL, Ib }, 0 },
2421 { "cmpS", { eAX, Iv }, 0 },
2422 { Bad_Opcode }, /* SEG DS prefix */
2423 { X86_64_TABLE (X86_64_3F) },
2424 /* 40 */
2425 { "inc{S|}", { RMeAX }, 0 },
2426 { "inc{S|}", { RMeCX }, 0 },
2427 { "inc{S|}", { RMeDX }, 0 },
2428 { "inc{S|}", { RMeBX }, 0 },
2429 { "inc{S|}", { RMeSP }, 0 },
2430 { "inc{S|}", { RMeBP }, 0 },
2431 { "inc{S|}", { RMeSI }, 0 },
2432 { "inc{S|}", { RMeDI }, 0 },
2433 /* 48 */
2434 { "dec{S|}", { RMeAX }, 0 },
2435 { "dec{S|}", { RMeCX }, 0 },
2436 { "dec{S|}", { RMeDX }, 0 },
2437 { "dec{S|}", { RMeBX }, 0 },
2438 { "dec{S|}", { RMeSP }, 0 },
2439 { "dec{S|}", { RMeBP }, 0 },
2440 { "dec{S|}", { RMeSI }, 0 },
2441 { "dec{S|}", { RMeDI }, 0 },
2442 /* 50 */
2443 { "pushV", { RMrAX }, 0 },
2444 { "pushV", { RMrCX }, 0 },
2445 { "pushV", { RMrDX }, 0 },
2446 { "pushV", { RMrBX }, 0 },
2447 { "pushV", { RMrSP }, 0 },
2448 { "pushV", { RMrBP }, 0 },
2449 { "pushV", { RMrSI }, 0 },
2450 { "pushV", { RMrDI }, 0 },
2451 /* 58 */
2452 { "popV", { RMrAX }, 0 },
2453 { "popV", { RMrCX }, 0 },
2454 { "popV", { RMrDX }, 0 },
2455 { "popV", { RMrBX }, 0 },
2456 { "popV", { RMrSP }, 0 },
2457 { "popV", { RMrBP }, 0 },
2458 { "popV", { RMrSI }, 0 },
2459 { "popV", { RMrDI }, 0 },
2460 /* 60 */
2461 { X86_64_TABLE (X86_64_60) },
2462 { X86_64_TABLE (X86_64_61) },
2463 { X86_64_TABLE (X86_64_62) },
2464 { X86_64_TABLE (X86_64_63) },
2465 { Bad_Opcode }, /* seg fs */
2466 { Bad_Opcode }, /* seg gs */
2467 { Bad_Opcode }, /* op size prefix */
2468 { Bad_Opcode }, /* adr size prefix */
2469 /* 68 */
2470 { "pushT", { sIv }, 0 },
2471 { "imulS", { Gv, Ev, Iv }, 0 },
2472 { "pushT", { sIbT }, 0 },
2473 { "imulS", { Gv, Ev, sIb }, 0 },
2474 { "ins{b|}", { Ybr, indirDX }, 0 },
2475 { X86_64_TABLE (X86_64_6D) },
2476 { "outs{b|}", { indirDXr, Xb }, 0 },
2477 { X86_64_TABLE (X86_64_6F) },
2478 /* 70 */
2479 { "joH", { Jb, BND, cond_jump_flag }, 0 },
2480 { "jnoH", { Jb, BND, cond_jump_flag }, 0 },
2481 { "jbH", { Jb, BND, cond_jump_flag }, 0 },
2482 { "jaeH", { Jb, BND, cond_jump_flag }, 0 },
2483 { "jeH", { Jb, BND, cond_jump_flag }, 0 },
2484 { "jneH", { Jb, BND, cond_jump_flag }, 0 },
2485 { "jbeH", { Jb, BND, cond_jump_flag }, 0 },
2486 { "jaH", { Jb, BND, cond_jump_flag }, 0 },
2487 /* 78 */
2488 { "jsH", { Jb, BND, cond_jump_flag }, 0 },
2489 { "jnsH", { Jb, BND, cond_jump_flag }, 0 },
2490 { "jpH", { Jb, BND, cond_jump_flag }, 0 },
2491 { "jnpH", { Jb, BND, cond_jump_flag }, 0 },
2492 { "jlH", { Jb, BND, cond_jump_flag }, 0 },
2493 { "jgeH", { Jb, BND, cond_jump_flag }, 0 },
2494 { "jleH", { Jb, BND, cond_jump_flag }, 0 },
2495 { "jgH", { Jb, BND, cond_jump_flag }, 0 },
2496 /* 80 */
2497 { REG_TABLE (REG_80) },
2498 { REG_TABLE (REG_81) },
2499 { X86_64_TABLE (X86_64_82) },
2500 { REG_TABLE (REG_83) },
2501 { "testB", { Eb, Gb }, 0 },
2502 { "testS", { Ev, Gv }, 0 },
2503 { "xchgB", { Ebh2, Gb }, 0 },
2504 { "xchgS", { Evh2, Gv }, 0 },
2505 /* 88 */
2506 { "movB", { Ebh3, Gb }, 0 },
2507 { "movS", { Evh3, Gv }, 0 },
2508 { "movB", { Gb, EbS }, 0 },
2509 { "movS", { Gv, EvS }, 0 },
2510 { "movD", { Sv, Sw }, 0 },
2511 { MOD_TABLE (MOD_8D) },
2512 { "movD", { Sw, Sv }, 0 },
2513 { REG_TABLE (REG_8F) },
2514 /* 90 */
2515 { PREFIX_TABLE (PREFIX_90) },
2516 { "xchgS", { RMeCX, eAX }, 0 },
2517 { "xchgS", { RMeDX, eAX }, 0 },
2518 { "xchgS", { RMeBX, eAX }, 0 },
2519 { "xchgS", { RMeSP, eAX }, 0 },
2520 { "xchgS", { RMeBP, eAX }, 0 },
2521 { "xchgS", { RMeSI, eAX }, 0 },
2522 { "xchgS", { RMeDI, eAX }, 0 },
2523 /* 98 */
2524 { "cW{t|}R", { XX }, 0 },
2525 { "cR{t|}O", { XX }, 0 },
2526 { X86_64_TABLE (X86_64_9A) },
2527 { Bad_Opcode }, /* fwait */
2528 { "pushfT", { XX }, 0 },
2529 { "popfT", { XX }, 0 },
2530 { "sahf", { XX }, 0 },
2531 { "lahf", { XX }, 0 },
2532 /* a0 */
2533 { "mov%LB", { AL, Ob }, 0 },
2534 { "mov%LS", { eAX, Ov }, 0 },
2535 { "mov%LB", { Ob, AL }, 0 },
2536 { "mov%LS", { Ov, eAX }, 0 },
2537 { "movs{b|}", { Ybr, Xb }, 0 },
2538 { "movs{R|}", { Yvr, Xv }, 0 },
2539 { "cmps{b|}", { Xb, Yb }, 0 },
2540 { "cmps{R|}", { Xv, Yv }, 0 },
2541 /* a8 */
2542 { "testB", { AL, Ib }, 0 },
2543 { "testS", { eAX, Iv }, 0 },
2544 { "stosB", { Ybr, AL }, 0 },
2545 { "stosS", { Yvr, eAX }, 0 },
2546 { "lodsB", { ALr, Xb }, 0 },
2547 { "lodsS", { eAXr, Xv }, 0 },
2548 { "scasB", { AL, Yb }, 0 },
2549 { "scasS", { eAX, Yv }, 0 },
2550 /* b0 */
2551 { "movB", { RMAL, Ib }, 0 },
2552 { "movB", { RMCL, Ib }, 0 },
2553 { "movB", { RMDL, Ib }, 0 },
2554 { "movB", { RMBL, Ib }, 0 },
2555 { "movB", { RMAH, Ib }, 0 },
2556 { "movB", { RMCH, Ib }, 0 },
2557 { "movB", { RMDH, Ib }, 0 },
2558 { "movB", { RMBH, Ib }, 0 },
2559 /* b8 */
2560 { "mov%LV", { RMeAX, Iv64 }, 0 },
2561 { "mov%LV", { RMeCX, Iv64 }, 0 },
2562 { "mov%LV", { RMeDX, Iv64 }, 0 },
2563 { "mov%LV", { RMeBX, Iv64 }, 0 },
2564 { "mov%LV", { RMeSP, Iv64 }, 0 },
2565 { "mov%LV", { RMeBP, Iv64 }, 0 },
2566 { "mov%LV", { RMeSI, Iv64 }, 0 },
2567 { "mov%LV", { RMeDI, Iv64 }, 0 },
2568 /* c0 */
2569 { REG_TABLE (REG_C0) },
2570 { REG_TABLE (REG_C1) },
2571 { "retT", { Iw, BND }, 0 },
2572 { "retT", { BND }, 0 },
2573 { X86_64_TABLE (X86_64_C4) },
2574 { X86_64_TABLE (X86_64_C5) },
2575 { REG_TABLE (REG_C6) },
2576 { REG_TABLE (REG_C7) },
2577 /* c8 */
2578 { "enterT", { Iw, Ib }, 0 },
2579 { "leaveT", { XX }, 0 },
2580 { "Jret{|f}P", { Iw }, 0 },
2581 { "Jret{|f}P", { XX }, 0 },
2582 { "int3", { XX }, 0 },
2583 { "int", { Ib }, 0 },
2584 { X86_64_TABLE (X86_64_CE) },
2585 { "iret%LP", { XX }, 0 },
2586 /* d0 */
2587 { REG_TABLE (REG_D0) },
2588 { REG_TABLE (REG_D1) },
2589 { REG_TABLE (REG_D2) },
2590 { REG_TABLE (REG_D3) },
2591 { X86_64_TABLE (X86_64_D4) },
2592 { X86_64_TABLE (X86_64_D5) },
2593 { Bad_Opcode },
2594 { "xlat", { DSBX }, 0 },
2595 /* d8 */
2596 { FLOAT },
2597 { FLOAT },
2598 { FLOAT },
2599 { FLOAT },
2600 { FLOAT },
2601 { FLOAT },
2602 { FLOAT },
2603 { FLOAT },
2604 /* e0 */
2605 { "loopneFH", { Jb, XX, loop_jcxz_flag }, 0 },
2606 { "loopeFH", { Jb, XX, loop_jcxz_flag }, 0 },
2607 { "loopFH", { Jb, XX, loop_jcxz_flag }, 0 },
2608 { "jEcxzH", { Jb, XX, loop_jcxz_flag }, 0 },
2609 { "inB", { AL, Ib }, 0 },
2610 { "inG", { zAX, Ib }, 0 },
2611 { "outB", { Ib, AL }, 0 },
2612 { "outG", { Ib, zAX }, 0 },
2613 /* e8 */
2614 { X86_64_TABLE (X86_64_E8) },
2615 { X86_64_TABLE (X86_64_E9) },
2616 { X86_64_TABLE (X86_64_EA) },
2617 { "jmp", { Jb, BND }, 0 },
2618 { "inB", { AL, indirDX }, 0 },
2619 { "inG", { zAX, indirDX }, 0 },
2620 { "outB", { indirDX, AL }, 0 },
2621 { "outG", { indirDX, zAX }, 0 },
2622 /* f0 */
2623 { Bad_Opcode }, /* lock prefix */
2624 { "icebp", { XX }, 0 },
2625 { Bad_Opcode }, /* repne */
2626 { Bad_Opcode }, /* repz */
2627 { "hlt", { XX }, 0 },
2628 { "cmc", { XX }, 0 },
2629 { REG_TABLE (REG_F6) },
2630 { REG_TABLE (REG_F7) },
2631 /* f8 */
2632 { "clc", { XX }, 0 },
2633 { "stc", { XX }, 0 },
2634 { "cli", { XX }, 0 },
2635 { "sti", { XX }, 0 },
2636 { "cld", { XX }, 0 },
2637 { "std", { XX }, 0 },
2638 { REG_TABLE (REG_FE) },
2639 { REG_TABLE (REG_FF) },
2640 };
2641
2642 static const struct dis386 dis386_twobyte[] = {
2643 /* 00 */
2644 { REG_TABLE (REG_0F00 ) },
2645 { REG_TABLE (REG_0F01 ) },
2646 { "larS", { Gv, Ew }, 0 },
2647 { "lslS", { Gv, Ew }, 0 },
2648 { Bad_Opcode },
2649 { "syscall", { XX }, 0 },
2650 { "clts", { XX }, 0 },
2651 { "sysret%LP", { XX }, 0 },
2652 /* 08 */
2653 { "invd", { XX }, 0 },
2654 { PREFIX_TABLE (PREFIX_0F09) },
2655 { Bad_Opcode },
2656 { "ud2", { XX }, 0 },
2657 { Bad_Opcode },
2658 { REG_TABLE (REG_0F0D) },
2659 { "femms", { XX }, 0 },
2660 { "", { MX, EM, OPSUF }, 0 }, /* See OP_3DNowSuffix. */
2661 /* 10 */
2662 { PREFIX_TABLE (PREFIX_0F10) },
2663 { PREFIX_TABLE (PREFIX_0F11) },
2664 { PREFIX_TABLE (PREFIX_0F12) },
2665 { MOD_TABLE (MOD_0F13) },
2666 { "unpcklpX", { XM, EXx }, PREFIX_OPCODE },
2667 { "unpckhpX", { XM, EXx }, PREFIX_OPCODE },
2668 { PREFIX_TABLE (PREFIX_0F16) },
2669 { MOD_TABLE (MOD_0F17) },
2670 /* 18 */
2671 { REG_TABLE (REG_0F18) },
2672 { "nopQ", { Ev }, 0 },
2673 { PREFIX_TABLE (PREFIX_0F1A) },
2674 { PREFIX_TABLE (PREFIX_0F1B) },
2675 { PREFIX_TABLE (PREFIX_0F1C) },
2676 { "nopQ", { Ev }, 0 },
2677 { PREFIX_TABLE (PREFIX_0F1E) },
2678 { "nopQ", { Ev }, 0 },
2679 /* 20 */
2680 { "movZ", { Rm, Cm }, 0 },
2681 { "movZ", { Rm, Dm }, 0 },
2682 { "movZ", { Cm, Rm }, 0 },
2683 { "movZ", { Dm, Rm }, 0 },
2684 { MOD_TABLE (MOD_0F24) },
2685 { Bad_Opcode },
2686 { MOD_TABLE (MOD_0F26) },
2687 { Bad_Opcode },
2688 /* 28 */
2689 { "movapX", { XM, EXx }, PREFIX_OPCODE },
2690 { "movapX", { EXxS, XM }, PREFIX_OPCODE },
2691 { PREFIX_TABLE (PREFIX_0F2A) },
2692 { PREFIX_TABLE (PREFIX_0F2B) },
2693 { PREFIX_TABLE (PREFIX_0F2C) },
2694 { PREFIX_TABLE (PREFIX_0F2D) },
2695 { PREFIX_TABLE (PREFIX_0F2E) },
2696 { PREFIX_TABLE (PREFIX_0F2F) },
2697 /* 30 */
2698 { "wrmsr", { XX }, 0 },
2699 { "rdtsc", { XX }, 0 },
2700 { "rdmsr", { XX }, 0 },
2701 { "rdpmc", { XX }, 0 },
2702 { "sysenter", { XX }, 0 },
2703 { "sysexit", { XX }, 0 },
2704 { Bad_Opcode },
2705 { "getsec", { XX }, 0 },
2706 /* 38 */
2707 { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F38, PREFIX_OPCODE) },
2708 { Bad_Opcode },
2709 { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F3A, PREFIX_OPCODE) },
2710 { Bad_Opcode },
2711 { Bad_Opcode },
2712 { Bad_Opcode },
2713 { Bad_Opcode },
2714 { Bad_Opcode },
2715 /* 40 */
2716 { "cmovoS", { Gv, Ev }, 0 },
2717 { "cmovnoS", { Gv, Ev }, 0 },
2718 { "cmovbS", { Gv, Ev }, 0 },
2719 { "cmovaeS", { Gv, Ev }, 0 },
2720 { "cmoveS", { Gv, Ev }, 0 },
2721 { "cmovneS", { Gv, Ev }, 0 },
2722 { "cmovbeS", { Gv, Ev }, 0 },
2723 { "cmovaS", { Gv, Ev }, 0 },
2724 /* 48 */
2725 { "cmovsS", { Gv, Ev }, 0 },
2726 { "cmovnsS", { Gv, Ev }, 0 },
2727 { "cmovpS", { Gv, Ev }, 0 },
2728 { "cmovnpS", { Gv, Ev }, 0 },
2729 { "cmovlS", { Gv, Ev }, 0 },
2730 { "cmovgeS", { Gv, Ev }, 0 },
2731 { "cmovleS", { Gv, Ev }, 0 },
2732 { "cmovgS", { Gv, Ev }, 0 },
2733 /* 50 */
2734 { MOD_TABLE (MOD_0F51) },
2735 { PREFIX_TABLE (PREFIX_0F51) },
2736 { PREFIX_TABLE (PREFIX_0F52) },
2737 { PREFIX_TABLE (PREFIX_0F53) },
2738 { "andpX", { XM, EXx }, PREFIX_OPCODE },
2739 { "andnpX", { XM, EXx }, PREFIX_OPCODE },
2740 { "orpX", { XM, EXx }, PREFIX_OPCODE },
2741 { "xorpX", { XM, EXx }, PREFIX_OPCODE },
2742 /* 58 */
2743 { PREFIX_TABLE (PREFIX_0F58) },
2744 { PREFIX_TABLE (PREFIX_0F59) },
2745 { PREFIX_TABLE (PREFIX_0F5A) },
2746 { PREFIX_TABLE (PREFIX_0F5B) },
2747 { PREFIX_TABLE (PREFIX_0F5C) },
2748 { PREFIX_TABLE (PREFIX_0F5D) },
2749 { PREFIX_TABLE (PREFIX_0F5E) },
2750 { PREFIX_TABLE (PREFIX_0F5F) },
2751 /* 60 */
2752 { PREFIX_TABLE (PREFIX_0F60) },
2753 { PREFIX_TABLE (PREFIX_0F61) },
2754 { PREFIX_TABLE (PREFIX_0F62) },
2755 { "packsswb", { MX, EM }, PREFIX_OPCODE },
2756 { "pcmpgtb", { MX, EM }, PREFIX_OPCODE },
2757 { "pcmpgtw", { MX, EM }, PREFIX_OPCODE },
2758 { "pcmpgtd", { MX, EM }, PREFIX_OPCODE },
2759 { "packuswb", { MX, EM }, PREFIX_OPCODE },
2760 /* 68 */
2761 { "punpckhbw", { MX, EM }, PREFIX_OPCODE },
2762 { "punpckhwd", { MX, EM }, PREFIX_OPCODE },
2763 { "punpckhdq", { MX, EM }, PREFIX_OPCODE },
2764 { "packssdw", { MX, EM }, PREFIX_OPCODE },
2765 { PREFIX_TABLE (PREFIX_0F6C) },
2766 { PREFIX_TABLE (PREFIX_0F6D) },
2767 { "movK", { MX, Edq }, PREFIX_OPCODE },
2768 { PREFIX_TABLE (PREFIX_0F6F) },
2769 /* 70 */
2770 { PREFIX_TABLE (PREFIX_0F70) },
2771 { REG_TABLE (REG_0F71) },
2772 { REG_TABLE (REG_0F72) },
2773 { REG_TABLE (REG_0F73) },
2774 { "pcmpeqb", { MX, EM }, PREFIX_OPCODE },
2775 { "pcmpeqw", { MX, EM }, PREFIX_OPCODE },
2776 { "pcmpeqd", { MX, EM }, PREFIX_OPCODE },
2777 { "emms", { XX }, PREFIX_OPCODE },
2778 /* 78 */
2779 { PREFIX_TABLE (PREFIX_0F78) },
2780 { PREFIX_TABLE (PREFIX_0F79) },
2781 { Bad_Opcode },
2782 { Bad_Opcode },
2783 { PREFIX_TABLE (PREFIX_0F7C) },
2784 { PREFIX_TABLE (PREFIX_0F7D) },
2785 { PREFIX_TABLE (PREFIX_0F7E) },
2786 { PREFIX_TABLE (PREFIX_0F7F) },
2787 /* 80 */
2788 { "joH", { Jv, BND, cond_jump_flag }, 0 },
2789 { "jnoH", { Jv, BND, cond_jump_flag }, 0 },
2790 { "jbH", { Jv, BND, cond_jump_flag }, 0 },
2791 { "jaeH", { Jv, BND, cond_jump_flag }, 0 },
2792 { "jeH", { Jv, BND, cond_jump_flag }, 0 },
2793 { "jneH", { Jv, BND, cond_jump_flag }, 0 },
2794 { "jbeH", { Jv, BND, cond_jump_flag }, 0 },
2795 { "jaH", { Jv, BND, cond_jump_flag }, 0 },
2796 /* 88 */
2797 { "jsH", { Jv, BND, cond_jump_flag }, 0 },
2798 { "jnsH", { Jv, BND, cond_jump_flag }, 0 },
2799 { "jpH", { Jv, BND, cond_jump_flag }, 0 },
2800 { "jnpH", { Jv, BND, cond_jump_flag }, 0 },
2801 { "jlH", { Jv, BND, cond_jump_flag }, 0 },
2802 { "jgeH", { Jv, BND, cond_jump_flag }, 0 },
2803 { "jleH", { Jv, BND, cond_jump_flag }, 0 },
2804 { "jgH", { Jv, BND, cond_jump_flag }, 0 },
2805 /* 90 */
2806 { "seto", { Eb }, 0 },
2807 { "setno", { Eb }, 0 },
2808 { "setb", { Eb }, 0 },
2809 { "setae", { Eb }, 0 },
2810 { "sete", { Eb }, 0 },
2811 { "setne", { Eb }, 0 },
2812 { "setbe", { Eb }, 0 },
2813 { "seta", { Eb }, 0 },
2814 /* 98 */
2815 { "sets", { Eb }, 0 },
2816 { "setns", { Eb }, 0 },
2817 { "setp", { Eb }, 0 },
2818 { "setnp", { Eb }, 0 },
2819 { "setl", { Eb }, 0 },
2820 { "setge", { Eb }, 0 },
2821 { "setle", { Eb }, 0 },
2822 { "setg", { Eb }, 0 },
2823 /* a0 */
2824 { "pushT", { fs }, 0 },
2825 { "popT", { fs }, 0 },
2826 { "cpuid", { XX }, 0 },
2827 { "btS", { Ev, Gv }, 0 },
2828 { "shldS", { Ev, Gv, Ib }, 0 },
2829 { "shldS", { Ev, Gv, CL }, 0 },
2830 { REG_TABLE (REG_0FA6) },
2831 { REG_TABLE (REG_0FA7) },
2832 /* a8 */
2833 { "pushT", { gs }, 0 },
2834 { "popT", { gs }, 0 },
2835 { "rsm", { XX }, 0 },
2836 { "btsS", { Evh1, Gv }, 0 },
2837 { "shrdS", { Ev, Gv, Ib }, 0 },
2838 { "shrdS", { Ev, Gv, CL }, 0 },
2839 { REG_TABLE (REG_0FAE) },
2840 { "imulS", { Gv, Ev }, 0 },
2841 /* b0 */
2842 { "cmpxchgB", { Ebh1, Gb }, 0 },
2843 { "cmpxchgS", { Evh1, Gv }, 0 },
2844 { MOD_TABLE (MOD_0FB2) },
2845 { "btrS", { Evh1, Gv }, 0 },
2846 { MOD_TABLE (MOD_0FB4) },
2847 { MOD_TABLE (MOD_0FB5) },
2848 { "movz{bR|x}", { Gv, Eb }, 0 },
2849 { "movz{wR|x}", { Gv, Ew }, 0 }, /* yes, there really is movzww ! */
2850 /* b8 */
2851 { PREFIX_TABLE (PREFIX_0FB8) },
2852 { "ud1S", { Gv, Ev }, 0 },
2853 { REG_TABLE (REG_0FBA) },
2854 { "btcS", { Evh1, Gv }, 0 },
2855 { PREFIX_TABLE (PREFIX_0FBC) },
2856 { PREFIX_TABLE (PREFIX_0FBD) },
2857 { "movs{bR|x}", { Gv, Eb }, 0 },
2858 { "movs{wR|x}", { Gv, Ew }, 0 }, /* yes, there really is movsww ! */
2859 /* c0 */
2860 { "xaddB", { Ebh1, Gb }, 0 },
2861 { "xaddS", { Evh1, Gv }, 0 },
2862 { PREFIX_TABLE (PREFIX_0FC2) },
2863 { MOD_TABLE (MOD_0FC3) },
2864 { "pinsrw", { MX, Edqw, Ib }, PREFIX_OPCODE },
2865 { "pextrw", { Gdq, MS, Ib }, PREFIX_OPCODE },
2866 { "shufpX", { XM, EXx, Ib }, PREFIX_OPCODE },
2867 { REG_TABLE (REG_0FC7) },
2868 /* c8 */
2869 { "bswap", { RMeAX }, 0 },
2870 { "bswap", { RMeCX }, 0 },
2871 { "bswap", { RMeDX }, 0 },
2872 { "bswap", { RMeBX }, 0 },
2873 { "bswap", { RMeSP }, 0 },
2874 { "bswap", { RMeBP }, 0 },
2875 { "bswap", { RMeSI }, 0 },
2876 { "bswap", { RMeDI }, 0 },
2877 /* d0 */
2878 { PREFIX_TABLE (PREFIX_0FD0) },
2879 { "psrlw", { MX, EM }, PREFIX_OPCODE },
2880 { "psrld", { MX, EM }, PREFIX_OPCODE },
2881 { "psrlq", { MX, EM }, PREFIX_OPCODE },
2882 { "paddq", { MX, EM }, PREFIX_OPCODE },
2883 { "pmullw", { MX, EM }, PREFIX_OPCODE },
2884 { PREFIX_TABLE (PREFIX_0FD6) },
2885 { MOD_TABLE (MOD_0FD7) },
2886 /* d8 */
2887 { "psubusb", { MX, EM }, PREFIX_OPCODE },
2888 { "psubusw", { MX, EM }, PREFIX_OPCODE },
2889 { "pminub", { MX, EM }, PREFIX_OPCODE },
2890 { "pand", { MX, EM }, PREFIX_OPCODE },
2891 { "paddusb", { MX, EM }, PREFIX_OPCODE },
2892 { "paddusw", { MX, EM }, PREFIX_OPCODE },
2893 { "pmaxub", { MX, EM }, PREFIX_OPCODE },
2894 { "pandn", { MX, EM }, PREFIX_OPCODE },
2895 /* e0 */
2896 { "pavgb", { MX, EM }, PREFIX_OPCODE },
2897 { "psraw", { MX, EM }, PREFIX_OPCODE },
2898 { "psrad", { MX, EM }, PREFIX_OPCODE },
2899 { "pavgw", { MX, EM }, PREFIX_OPCODE },
2900 { "pmulhuw", { MX, EM }, PREFIX_OPCODE },
2901 { "pmulhw", { MX, EM }, PREFIX_OPCODE },
2902 { PREFIX_TABLE (PREFIX_0FE6) },
2903 { PREFIX_TABLE (PREFIX_0FE7) },
2904 /* e8 */
2905 { "psubsb", { MX, EM }, PREFIX_OPCODE },
2906 { "psubsw", { MX, EM }, PREFIX_OPCODE },
2907 { "pminsw", { MX, EM }, PREFIX_OPCODE },
2908 { "por", { MX, EM }, PREFIX_OPCODE },
2909 { "paddsb", { MX, EM }, PREFIX_OPCODE },
2910 { "paddsw", { MX, EM }, PREFIX_OPCODE },
2911 { "pmaxsw", { MX, EM }, PREFIX_OPCODE },
2912 { "pxor", { MX, EM }, PREFIX_OPCODE },
2913 /* f0 */
2914 { PREFIX_TABLE (PREFIX_0FF0) },
2915 { "psllw", { MX, EM }, PREFIX_OPCODE },
2916 { "pslld", { MX, EM }, PREFIX_OPCODE },
2917 { "psllq", { MX, EM }, PREFIX_OPCODE },
2918 { "pmuludq", { MX, EM }, PREFIX_OPCODE },
2919 { "pmaddwd", { MX, EM }, PREFIX_OPCODE },
2920 { "psadbw", { MX, EM }, PREFIX_OPCODE },
2921 { PREFIX_TABLE (PREFIX_0FF7) },
2922 /* f8 */
2923 { "psubb", { MX, EM }, PREFIX_OPCODE },
2924 { "psubw", { MX, EM }, PREFIX_OPCODE },
2925 { "psubd", { MX, EM }, PREFIX_OPCODE },
2926 { "psubq", { MX, EM }, PREFIX_OPCODE },
2927 { "paddb", { MX, EM }, PREFIX_OPCODE },
2928 { "paddw", { MX, EM }, PREFIX_OPCODE },
2929 { "paddd", { MX, EM }, PREFIX_OPCODE },
2930 { "ud0S", { Gv, Ev }, 0 },
2931 };
2932
2933 static const unsigned char onebyte_has_modrm[256] = {
2934 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2935 /* ------------------------------- */
2936 /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
2937 /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
2938 /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
2939 /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
2940 /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
2941 /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
2942 /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
2943 /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
2944 /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
2945 /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
2946 /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
2947 /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
2948 /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
2949 /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
2950 /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
2951 /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1 /* f0 */
2952 /* ------------------------------- */
2953 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2954 };
2955
2956 static const unsigned char twobyte_has_modrm[256] = {
2957 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2958 /* ------------------------------- */
2959 /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
2960 /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
2961 /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
2962 /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
2963 /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
2964 /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
2965 /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
2966 /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
2967 /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
2968 /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
2969 /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
2970 /* b0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* bf */
2971 /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
2972 /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
2973 /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
2974 /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 /* ff */
2975 /* ------------------------------- */
2976 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2977 };
2978
2979 static char obuf[100];
2980 static char *obufp;
2981 static char *mnemonicendp;
2982 static char scratchbuf[100];
2983 static unsigned char *start_codep;
2984 static unsigned char *insn_codep;
2985 static unsigned char *codep;
2986 static unsigned char *end_codep;
2987 static int last_lock_prefix;
2988 static int last_repz_prefix;
2989 static int last_repnz_prefix;
2990 static int last_data_prefix;
2991 static int last_addr_prefix;
2992 static int last_rex_prefix;
2993 static int last_seg_prefix;
2994 static int fwait_prefix;
2995 /* The active segment register prefix. */
2996 static int active_seg_prefix;
2997 #define MAX_CODE_LENGTH 15
2998 /* We can up to 14 prefixes since the maximum instruction length is
2999 15bytes. */
3000 static int all_prefixes[MAX_CODE_LENGTH - 1];
3001 static disassemble_info *the_info;
3002 static struct
3003 {
3004 int mod;
3005 int reg;
3006 int rm;
3007 }
3008 modrm;
3009 static unsigned char need_modrm;
3010 static struct
3011 {
3012 int scale;
3013 int index;
3014 int base;
3015 }
3016 sib;
3017 static struct
3018 {
3019 int register_specifier;
3020 int length;
3021 int prefix;
3022 int w;
3023 int evex;
3024 int r;
3025 int v;
3026 int mask_register_specifier;
3027 int zeroing;
3028 int ll;
3029 int b;
3030 }
3031 vex;
3032 static unsigned char need_vex;
3033 static unsigned char need_vex_reg;
3034 static unsigned char vex_w_done;
3035
3036 struct op
3037 {
3038 const char *name;
3039 unsigned int len;
3040 };
3041
3042 /* If we are accessing mod/rm/reg without need_modrm set, then the
3043 values are stale. Hitting this abort likely indicates that you
3044 need to update onebyte_has_modrm or twobyte_has_modrm. */
3045 #define MODRM_CHECK if (!need_modrm) abort ()
3046
3047 static const char **names64;
3048 static const char **names32;
3049 static const char **names16;
3050 static const char **names8;
3051 static const char **names8rex;
3052 static const char **names_seg;
3053 static const char *index64;
3054 static const char *index32;
3055 static const char **index16;
3056 static const char **names_bnd;
3057
3058 static const char *intel_names64[] = {
3059 "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
3060 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
3061 };
3062 static const char *intel_names32[] = {
3063 "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
3064 "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
3065 };
3066 static const char *intel_names16[] = {
3067 "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
3068 "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
3069 };
3070 static const char *intel_names8[] = {
3071 "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
3072 };
3073 static const char *intel_names8rex[] = {
3074 "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
3075 "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
3076 };
3077 static const char *intel_names_seg[] = {
3078 "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
3079 };
3080 static const char *intel_index64 = "riz";
3081 static const char *intel_index32 = "eiz";
3082 static const char *intel_index16[] = {
3083 "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
3084 };
3085
3086 static const char *att_names64[] = {
3087 "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
3088 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
3089 };
3090 static const char *att_names32[] = {
3091 "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
3092 "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
3093 };
3094 static const char *att_names16[] = {
3095 "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
3096 "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
3097 };
3098 static const char *att_names8[] = {
3099 "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
3100 };
3101 static const char *att_names8rex[] = {
3102 "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
3103 "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
3104 };
3105 static const char *att_names_seg[] = {
3106 "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
3107 };
3108 static const char *att_index64 = "%riz";
3109 static const char *att_index32 = "%eiz";
3110 static const char *att_index16[] = {
3111 "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
3112 };
3113
3114 static const char **names_mm;
3115 static const char *intel_names_mm[] = {
3116 "mm0", "mm1", "mm2", "mm3",
3117 "mm4", "mm5", "mm6", "mm7"
3118 };
3119 static const char *att_names_mm[] = {
3120 "%mm0", "%mm1", "%mm2", "%mm3",
3121 "%mm4", "%mm5", "%mm6", "%mm7"
3122 };
3123
3124 static const char *intel_names_bnd[] = {
3125 "bnd0", "bnd1", "bnd2", "bnd3"
3126 };
3127
3128 static const char *att_names_bnd[] = {
3129 "%bnd0", "%bnd1", "%bnd2", "%bnd3"
3130 };
3131
3132 static const char **names_xmm;
3133 static const char *intel_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 static const char *att_names_xmm[] = {
3144 "%xmm0", "%xmm1", "%xmm2", "%xmm3",
3145 "%xmm4", "%xmm5", "%xmm6", "%xmm7",
3146 "%xmm8", "%xmm9", "%xmm10", "%xmm11",
3147 "%xmm12", "%xmm13", "%xmm14", "%xmm15",
3148 "%xmm16", "%xmm17", "%xmm18", "%xmm19",
3149 "%xmm20", "%xmm21", "%xmm22", "%xmm23",
3150 "%xmm24", "%xmm25", "%xmm26", "%xmm27",
3151 "%xmm28", "%xmm29", "%xmm30", "%xmm31"
3152 };
3153
3154 static const char **names_ymm;
3155 static const char *intel_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 static const char *att_names_ymm[] = {
3166 "%ymm0", "%ymm1", "%ymm2", "%ymm3",
3167 "%ymm4", "%ymm5", "%ymm6", "%ymm7",
3168 "%ymm8", "%ymm9", "%ymm10", "%ymm11",
3169 "%ymm12", "%ymm13", "%ymm14", "%ymm15",
3170 "%ymm16", "%ymm17", "%ymm18", "%ymm19",
3171 "%ymm20", "%ymm21", "%ymm22", "%ymm23",
3172 "%ymm24", "%ymm25", "%ymm26", "%ymm27",
3173 "%ymm28", "%ymm29", "%ymm30", "%ymm31"
3174 };
3175
3176 static const char **names_zmm;
3177 static const char *intel_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 static const char *att_names_zmm[] = {
3188 "%zmm0", "%zmm1", "%zmm2", "%zmm3",
3189 "%zmm4", "%zmm5", "%zmm6", "%zmm7",
3190 "%zmm8", "%zmm9", "%zmm10", "%zmm11",
3191 "%zmm12", "%zmm13", "%zmm14", "%zmm15",
3192 "%zmm16", "%zmm17", "%zmm18", "%zmm19",
3193 "%zmm20", "%zmm21", "%zmm22", "%zmm23",
3194 "%zmm24", "%zmm25", "%zmm26", "%zmm27",
3195 "%zmm28", "%zmm29", "%zmm30", "%zmm31"
3196 };
3197
3198 static const char **names_mask;
3199 static const char *intel_names_mask[] = {
3200 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7"
3201 };
3202 static const char *att_names_mask[] = {
3203 "%k0", "%k1", "%k2", "%k3", "%k4", "%k5", "%k6", "%k7"
3204 };
3205
3206 static const char *names_rounding[] =
3207 {
3208 "{rn-sae}",
3209 "{rd-sae}",
3210 "{ru-sae}",
3211 "{rz-sae}"
3212 };
3213
3214 static const struct dis386 reg_table[][8] = {
3215 /* REG_80 */
3216 {
3217 { "addA", { Ebh1, Ib }, 0 },
3218 { "orA", { Ebh1, Ib }, 0 },
3219 { "adcA", { Ebh1, Ib }, 0 },
3220 { "sbbA", { Ebh1, Ib }, 0 },
3221 { "andA", { Ebh1, Ib }, 0 },
3222 { "subA", { Ebh1, Ib }, 0 },
3223 { "xorA", { Ebh1, Ib }, 0 },
3224 { "cmpA", { Eb, Ib }, 0 },
3225 },
3226 /* REG_81 */
3227 {
3228 { "addQ", { Evh1, Iv }, 0 },
3229 { "orQ", { Evh1, Iv }, 0 },
3230 { "adcQ", { Evh1, Iv }, 0 },
3231 { "sbbQ", { Evh1, Iv }, 0 },
3232 { "andQ", { Evh1, Iv }, 0 },
3233 { "subQ", { Evh1, Iv }, 0 },
3234 { "xorQ", { Evh1, Iv }, 0 },
3235 { "cmpQ", { Ev, Iv }, 0 },
3236 },
3237 /* REG_83 */
3238 {
3239 { "addQ", { Evh1, sIb }, 0 },
3240 { "orQ", { Evh1, sIb }, 0 },
3241 { "adcQ", { Evh1, sIb }, 0 },
3242 { "sbbQ", { Evh1, sIb }, 0 },
3243 { "andQ", { Evh1, sIb }, 0 },
3244 { "subQ", { Evh1, sIb }, 0 },
3245 { "xorQ", { Evh1, sIb }, 0 },
3246 { "cmpQ", { Ev, sIb }, 0 },
3247 },
3248 /* REG_8F */
3249 {
3250 { "popU", { stackEv }, 0 },
3251 { XOP_8F_TABLE (XOP_09) },
3252 { Bad_Opcode },
3253 { Bad_Opcode },
3254 { Bad_Opcode },
3255 { XOP_8F_TABLE (XOP_09) },
3256 },
3257 /* REG_C0 */
3258 {
3259 { "rolA", { Eb, Ib }, 0 },
3260 { "rorA", { Eb, Ib }, 0 },
3261 { "rclA", { Eb, Ib }, 0 },
3262 { "rcrA", { Eb, Ib }, 0 },
3263 { "shlA", { Eb, Ib }, 0 },
3264 { "shrA", { Eb, Ib }, 0 },
3265 { "shlA", { Eb, Ib }, 0 },
3266 { "sarA", { Eb, Ib }, 0 },
3267 },
3268 /* REG_C1 */
3269 {
3270 { "rolQ", { Ev, Ib }, 0 },
3271 { "rorQ", { Ev, Ib }, 0 },
3272 { "rclQ", { Ev, Ib }, 0 },
3273 { "rcrQ", { Ev, Ib }, 0 },
3274 { "shlQ", { Ev, Ib }, 0 },
3275 { "shrQ", { Ev, Ib }, 0 },
3276 { "shlQ", { Ev, Ib }, 0 },
3277 { "sarQ", { Ev, Ib }, 0 },
3278 },
3279 /* REG_C6 */
3280 {
3281 { "movA", { Ebh3, Ib }, 0 },
3282 { Bad_Opcode },
3283 { Bad_Opcode },
3284 { Bad_Opcode },
3285 { Bad_Opcode },
3286 { Bad_Opcode },
3287 { Bad_Opcode },
3288 { MOD_TABLE (MOD_C6_REG_7) },
3289 },
3290 /* REG_C7 */
3291 {
3292 { "movQ", { Evh3, Iv }, 0 },
3293 { Bad_Opcode },
3294 { Bad_Opcode },
3295 { Bad_Opcode },
3296 { Bad_Opcode },
3297 { Bad_Opcode },
3298 { Bad_Opcode },
3299 { MOD_TABLE (MOD_C7_REG_7) },
3300 },
3301 /* REG_D0 */
3302 {
3303 { "rolA", { Eb, I1 }, 0 },
3304 { "rorA", { Eb, I1 }, 0 },
3305 { "rclA", { Eb, I1 }, 0 },
3306 { "rcrA", { Eb, I1 }, 0 },
3307 { "shlA", { Eb, I1 }, 0 },
3308 { "shrA", { Eb, I1 }, 0 },
3309 { "shlA", { Eb, I1 }, 0 },
3310 { "sarA", { Eb, I1 }, 0 },
3311 },
3312 /* REG_D1 */
3313 {
3314 { "rolQ", { Ev, I1 }, 0 },
3315 { "rorQ", { Ev, I1 }, 0 },
3316 { "rclQ", { Ev, I1 }, 0 },
3317 { "rcrQ", { Ev, I1 }, 0 },
3318 { "shlQ", { Ev, I1 }, 0 },
3319 { "shrQ", { Ev, I1 }, 0 },
3320 { "shlQ", { Ev, I1 }, 0 },
3321 { "sarQ", { Ev, I1 }, 0 },
3322 },
3323 /* REG_D2 */
3324 {
3325 { "rolA", { Eb, CL }, 0 },
3326 { "rorA", { Eb, CL }, 0 },
3327 { "rclA", { Eb, CL }, 0 },
3328 { "rcrA", { Eb, CL }, 0 },
3329 { "shlA", { Eb, CL }, 0 },
3330 { "shrA", { Eb, CL }, 0 },
3331 { "shlA", { Eb, CL }, 0 },
3332 { "sarA", { Eb, CL }, 0 },
3333 },
3334 /* REG_D3 */
3335 {
3336 { "rolQ", { Ev, CL }, 0 },
3337 { "rorQ", { Ev, CL }, 0 },
3338 { "rclQ", { Ev, CL }, 0 },
3339 { "rcrQ", { Ev, CL }, 0 },
3340 { "shlQ", { Ev, CL }, 0 },
3341 { "shrQ", { Ev, CL }, 0 },
3342 { "shlQ", { Ev, CL }, 0 },
3343 { "sarQ", { Ev, CL }, 0 },
3344 },
3345 /* REG_F6 */
3346 {
3347 { "testA", { Eb, Ib }, 0 },
3348 { "testA", { Eb, Ib }, 0 },
3349 { "notA", { Ebh1 }, 0 },
3350 { "negA", { Ebh1 }, 0 },
3351 { "mulA", { Eb }, 0 }, /* Don't print the implicit %al register, */
3352 { "imulA", { Eb }, 0 }, /* to distinguish these opcodes from other */
3353 { "divA", { Eb }, 0 }, /* mul/imul opcodes. Do the same for div */
3354 { "idivA", { Eb }, 0 }, /* and idiv for consistency. */
3355 },
3356 /* REG_F7 */
3357 {
3358 { "testQ", { Ev, Iv }, 0 },
3359 { "testQ", { Ev, Iv }, 0 },
3360 { "notQ", { Evh1 }, 0 },
3361 { "negQ", { Evh1 }, 0 },
3362 { "mulQ", { Ev }, 0 }, /* Don't print the implicit register. */
3363 { "imulQ", { Ev }, 0 },
3364 { "divQ", { Ev }, 0 },
3365 { "idivQ", { Ev }, 0 },
3366 },
3367 /* REG_FE */
3368 {
3369 { "incA", { Ebh1 }, 0 },
3370 { "decA", { Ebh1 }, 0 },
3371 },
3372 /* REG_FF */
3373 {
3374 { "incQ", { Evh1 }, 0 },
3375 { "decQ", { Evh1 }, 0 },
3376 { "call{&|}", { NOTRACK, indirEv, BND }, 0 },
3377 { MOD_TABLE (MOD_FF_REG_3) },
3378 { "jmp{&|}", { NOTRACK, indirEv, BND }, 0 },
3379 { MOD_TABLE (MOD_FF_REG_5) },
3380 { "pushU", { stackEv }, 0 },
3381 { Bad_Opcode },
3382 },
3383 /* REG_0F00 */
3384 {
3385 { "sldtD", { Sv }, 0 },
3386 { "strD", { Sv }, 0 },
3387 { "lldt", { Ew }, 0 },
3388 { "ltr", { Ew }, 0 },
3389 { "verr", { Ew }, 0 },
3390 { "verw", { Ew }, 0 },
3391 { Bad_Opcode },
3392 { Bad_Opcode },
3393 },
3394 /* REG_0F01 */
3395 {
3396 { MOD_TABLE (MOD_0F01_REG_0) },
3397 { MOD_TABLE (MOD_0F01_REG_1) },
3398 { MOD_TABLE (MOD_0F01_REG_2) },
3399 { MOD_TABLE (MOD_0F01_REG_3) },
3400 { "smswD", { Sv }, 0 },
3401 { MOD_TABLE (MOD_0F01_REG_5) },
3402 { "lmsw", { Ew }, 0 },
3403 { MOD_TABLE (MOD_0F01_REG_7) },
3404 },
3405 /* REG_0F0D */
3406 {
3407 { "prefetch", { Mb }, 0 },
3408 { "prefetchw", { Mb }, 0 },
3409 { "prefetchwt1", { Mb }, 0 },
3410 { "prefetch", { Mb }, 0 },
3411 { "prefetch", { Mb }, 0 },
3412 { "prefetch", { Mb }, 0 },
3413 { "prefetch", { Mb }, 0 },
3414 { "prefetch", { Mb }, 0 },
3415 },
3416 /* REG_0F18 */
3417 {
3418 { MOD_TABLE (MOD_0F18_REG_0) },
3419 { MOD_TABLE (MOD_0F18_REG_1) },
3420 { MOD_TABLE (MOD_0F18_REG_2) },
3421 { MOD_TABLE (MOD_0F18_REG_3) },
3422 { MOD_TABLE (MOD_0F18_REG_4) },
3423 { MOD_TABLE (MOD_0F18_REG_5) },
3424 { MOD_TABLE (MOD_0F18_REG_6) },
3425 { MOD_TABLE (MOD_0F18_REG_7) },
3426 },
3427 /* REG_0F1C_MOD_0 */
3428 {
3429 { "cldemote", { Mb }, 0 },
3430 { "nopQ", { Ev }, 0 },
3431 { "nopQ", { Ev }, 0 },
3432 { "nopQ", { Ev }, 0 },
3433 { "nopQ", { Ev }, 0 },
3434 { "nopQ", { Ev }, 0 },
3435 { "nopQ", { Ev }, 0 },
3436 { "nopQ", { Ev }, 0 },
3437 },
3438 /* REG_0F1E_MOD_3 */
3439 {
3440 { "nopQ", { Ev }, 0 },
3441 { "rdsspK", { Rdq }, PREFIX_OPCODE },
3442 { "nopQ", { Ev }, 0 },
3443 { "nopQ", { Ev }, 0 },
3444 { "nopQ", { Ev }, 0 },
3445 { "nopQ", { Ev }, 0 },
3446 { "nopQ", { Ev }, 0 },
3447 { RM_TABLE (RM_0F1E_MOD_3_REG_7) },
3448 },
3449 /* REG_0F71 */
3450 {
3451 { Bad_Opcode },
3452 { Bad_Opcode },
3453 { MOD_TABLE (MOD_0F71_REG_2) },
3454 { Bad_Opcode },
3455 { MOD_TABLE (MOD_0F71_REG_4) },
3456 { Bad_Opcode },
3457 { MOD_TABLE (MOD_0F71_REG_6) },
3458 },
3459 /* REG_0F72 */
3460 {
3461 { Bad_Opcode },
3462 { Bad_Opcode },
3463 { MOD_TABLE (MOD_0F72_REG_2) },
3464 { Bad_Opcode },
3465 { MOD_TABLE (MOD_0F72_REG_4) },
3466 { Bad_Opcode },
3467 { MOD_TABLE (MOD_0F72_REG_6) },
3468 },
3469 /* REG_0F73 */
3470 {
3471 { Bad_Opcode },
3472 { Bad_Opcode },
3473 { MOD_TABLE (MOD_0F73_REG_2) },
3474 { MOD_TABLE (MOD_0F73_REG_3) },
3475 { Bad_Opcode },
3476 { Bad_Opcode },
3477 { MOD_TABLE (MOD_0F73_REG_6) },
3478 { MOD_TABLE (MOD_0F73_REG_7) },
3479 },
3480 /* REG_0FA6 */
3481 {
3482 { "montmul", { { OP_0f07, 0 } }, 0 },
3483 { "xsha1", { { OP_0f07, 0 } }, 0 },
3484 { "xsha256", { { OP_0f07, 0 } }, 0 },
3485 },
3486 /* REG_0FA7 */
3487 {
3488 { "xstore-rng", { { OP_0f07, 0 } }, 0 },
3489 { "xcrypt-ecb", { { OP_0f07, 0 } }, 0 },
3490 { "xcrypt-cbc", { { OP_0f07, 0 } }, 0 },
3491 { "xcrypt-ctr", { { OP_0f07, 0 } }, 0 },
3492 { "xcrypt-cfb", { { OP_0f07, 0 } }, 0 },
3493 { "xcrypt-ofb", { { OP_0f07, 0 } }, 0 },
3494 },
3495 /* REG_0FAE */
3496 {
3497 { MOD_TABLE (MOD_0FAE_REG_0) },
3498 { MOD_TABLE (MOD_0FAE_REG_1) },
3499 { MOD_TABLE (MOD_0FAE_REG_2) },
3500 { MOD_TABLE (MOD_0FAE_REG_3) },
3501 { MOD_TABLE (MOD_0FAE_REG_4) },
3502 { MOD_TABLE (MOD_0FAE_REG_5) },
3503 { MOD_TABLE (MOD_0FAE_REG_6) },
3504 { MOD_TABLE (MOD_0FAE_REG_7) },
3505 },
3506 /* REG_0FBA */
3507 {
3508 { Bad_Opcode },
3509 { Bad_Opcode },
3510 { Bad_Opcode },
3511 { Bad_Opcode },
3512 { "btQ", { Ev, Ib }, 0 },
3513 { "btsQ", { Evh1, Ib }, 0 },
3514 { "btrQ", { Evh1, Ib }, 0 },
3515 { "btcQ", { Evh1, Ib }, 0 },
3516 },
3517 /* REG_0FC7 */
3518 {
3519 { Bad_Opcode },
3520 { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } }, 0 },
3521 { Bad_Opcode },
3522 { MOD_TABLE (MOD_0FC7_REG_3) },
3523 { MOD_TABLE (MOD_0FC7_REG_4) },
3524 { MOD_TABLE (MOD_0FC7_REG_5) },
3525 { MOD_TABLE (MOD_0FC7_REG_6) },
3526 { MOD_TABLE (MOD_0FC7_REG_7) },
3527 },
3528 /* REG_VEX_0F71 */
3529 {
3530 { Bad_Opcode },
3531 { Bad_Opcode },
3532 { MOD_TABLE (MOD_VEX_0F71_REG_2) },
3533 { Bad_Opcode },
3534 { MOD_TABLE (MOD_VEX_0F71_REG_4) },
3535 { Bad_Opcode },
3536 { MOD_TABLE (MOD_VEX_0F71_REG_6) },
3537 },
3538 /* REG_VEX_0F72 */
3539 {
3540 { Bad_Opcode },
3541 { Bad_Opcode },
3542 { MOD_TABLE (MOD_VEX_0F72_REG_2) },
3543 { Bad_Opcode },
3544 { MOD_TABLE (MOD_VEX_0F72_REG_4) },
3545 { Bad_Opcode },
3546 { MOD_TABLE (MOD_VEX_0F72_REG_6) },
3547 },
3548 /* REG_VEX_0F73 */
3549 {
3550 { Bad_Opcode },
3551 { Bad_Opcode },
3552 { MOD_TABLE (MOD_VEX_0F73_REG_2) },
3553 { MOD_TABLE (MOD_VEX_0F73_REG_3) },
3554 { Bad_Opcode },
3555 { Bad_Opcode },
3556 { MOD_TABLE (MOD_VEX_0F73_REG_6) },
3557 { MOD_TABLE (MOD_VEX_0F73_REG_7) },
3558 },
3559 /* REG_VEX_0FAE */
3560 {
3561 { Bad_Opcode },
3562 { Bad_Opcode },
3563 { MOD_TABLE (MOD_VEX_0FAE_REG_2) },
3564 { MOD_TABLE (MOD_VEX_0FAE_REG_3) },
3565 },
3566 /* REG_VEX_0F38F3 */
3567 {
3568 { Bad_Opcode },
3569 { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_1) },
3570 { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_2) },
3571 { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_3) },
3572 },
3573 /* REG_XOP_LWPCB */
3574 {
3575 { "llwpcb", { { OP_LWPCB_E, 0 } }, 0 },
3576 { "slwpcb", { { OP_LWPCB_E, 0 } }, 0 },
3577 },
3578 /* REG_XOP_LWP */
3579 {
3580 { "lwpins", { { OP_LWP_E, 0 }, Ed, Iq }, 0 },
3581 { "lwpval", { { OP_LWP_E, 0 }, Ed, Iq }, 0 },
3582 },
3583 /* REG_XOP_TBM_01 */
3584 {
3585 { Bad_Opcode },
3586 { "blcfill", { { OP_LWP_E, 0 }, Ev }, 0 },
3587 { "blsfill", { { OP_LWP_E, 0 }, Ev }, 0 },
3588 { "blcs", { { OP_LWP_E, 0 }, Ev }, 0 },
3589 { "tzmsk", { { OP_LWP_E, 0 }, Ev }, 0 },
3590 { "blcic", { { OP_LWP_E, 0 }, Ev }, 0 },
3591 { "blsic", { { OP_LWP_E, 0 }, Ev }, 0 },
3592 { "t1mskc", { { OP_LWP_E, 0 }, Ev }, 0 },
3593 },
3594 /* REG_XOP_TBM_02 */
3595 {
3596 { Bad_Opcode },
3597 { "blcmsk", { { OP_LWP_E, 0 }, Ev }, 0 },
3598 { Bad_Opcode },
3599 { Bad_Opcode },
3600 { Bad_Opcode },
3601 { Bad_Opcode },
3602 { "blci", { { OP_LWP_E, 0 }, Ev }, 0 },
3603 },
3604 #define NEED_REG_TABLE
3605 #include "i386-dis-evex.h"
3606 #undef NEED_REG_TABLE
3607 };
3608
3609 static const struct dis386 prefix_table[][4] = {
3610 /* PREFIX_90 */
3611 {
3612 { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } }, 0 },
3613 { "pause", { XX }, 0 },
3614 { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } }, 0 },
3615 { NULL, { { NULL, 0 } }, PREFIX_IGNORED }
3616 },
3617
3618 /* PREFIX_MOD_0_0F01_REG_5 */
3619 {
3620 { Bad_Opcode },
3621 { "rstorssp", { Mq }, PREFIX_OPCODE },
3622 },
3623
3624 /* PREFIX_MOD_3_0F01_REG_5_RM_0 */
3625 {
3626 { Bad_Opcode },
3627 { "setssbsy", { Skip_MODRM }, PREFIX_OPCODE },
3628 },
3629
3630 /* PREFIX_MOD_3_0F01_REG_5_RM_2 */
3631 {
3632 { Bad_Opcode },
3633 { "saveprevssp", { Skip_MODRM }, PREFIX_OPCODE },
3634 },
3635
3636 /* PREFIX_0F09 */
3637 {
3638 { "wbinvd", { XX }, 0 },
3639 { "wbnoinvd", { XX }, 0 },
3640 },
3641
3642 /* PREFIX_0F10 */
3643 {
3644 { "movups", { XM, EXx }, PREFIX_OPCODE },
3645 { "movss", { XM, EXd }, PREFIX_OPCODE },
3646 { "movupd", { XM, EXx }, PREFIX_OPCODE },
3647 { "movsd", { XM, EXq }, PREFIX_OPCODE },
3648 },
3649
3650 /* PREFIX_0F11 */
3651 {
3652 { "movups", { EXxS, XM }, PREFIX_OPCODE },
3653 { "movss", { EXdS, XM }, PREFIX_OPCODE },
3654 { "movupd", { EXxS, XM }, PREFIX_OPCODE },
3655 { "movsd", { EXqS, XM }, PREFIX_OPCODE },
3656 },
3657
3658 /* PREFIX_0F12 */
3659 {
3660 { MOD_TABLE (MOD_0F12_PREFIX_0) },
3661 { "movsldup", { XM, EXx }, PREFIX_OPCODE },
3662 { "movlpd", { XM, EXq }, PREFIX_OPCODE },
3663 { "movddup", { XM, EXq }, PREFIX_OPCODE },
3664 },
3665
3666 /* PREFIX_0F16 */
3667 {
3668 { MOD_TABLE (MOD_0F16_PREFIX_0) },
3669 { "movshdup", { XM, EXx }, PREFIX_OPCODE },
3670 { "movhpd", { XM, EXq }, PREFIX_OPCODE },
3671 },
3672
3673 /* PREFIX_0F1A */
3674 {
3675 { MOD_TABLE (MOD_0F1A_PREFIX_0) },
3676 { "bndcl", { Gbnd, Ev_bnd }, 0 },
3677 { "bndmov", { Gbnd, Ebnd }, 0 },
3678 { "bndcu", { Gbnd, Ev_bnd }, 0 },
3679 },
3680
3681 /* PREFIX_0F1B */
3682 {
3683 { MOD_TABLE (MOD_0F1B_PREFIX_0) },
3684 { MOD_TABLE (MOD_0F1B_PREFIX_1) },
3685 { "bndmov", { EbndS, Gbnd }, 0 },
3686 { "bndcn", { Gbnd, Ev_bnd }, 0 },
3687 },
3688
3689 /* PREFIX_0F1C */
3690 {
3691 { MOD_TABLE (MOD_0F1C_PREFIX_0) },
3692 { "nopQ", { Ev }, PREFIX_OPCODE },
3693 { "nopQ", { Ev }, PREFIX_OPCODE },
3694 { "nopQ", { Ev }, PREFIX_OPCODE },
3695 },
3696
3697 /* PREFIX_0F1E */
3698 {
3699 { "nopQ", { Ev }, PREFIX_OPCODE },
3700 { MOD_TABLE (MOD_0F1E_PREFIX_1) },
3701 { "nopQ", { Ev }, PREFIX_OPCODE },
3702 { "nopQ", { Ev }, PREFIX_OPCODE },
3703 },
3704
3705 /* PREFIX_0F2A */
3706 {
3707 { "cvtpi2ps", { XM, EMCq }, PREFIX_OPCODE },
3708 { "cvtsi2ss%LQ", { XM, Ev }, PREFIX_OPCODE },
3709 { "cvtpi2pd", { XM, EMCq }, PREFIX_OPCODE },
3710 { "cvtsi2sd%LQ", { XM, Ev }, 0 },
3711 },
3712
3713 /* PREFIX_0F2B */
3714 {
3715 { MOD_TABLE (MOD_0F2B_PREFIX_0) },
3716 { MOD_TABLE (MOD_0F2B_PREFIX_1) },
3717 { MOD_TABLE (MOD_0F2B_PREFIX_2) },
3718 { MOD_TABLE (MOD_0F2B_PREFIX_3) },
3719 },
3720
3721 /* PREFIX_0F2C */
3722 {
3723 { "cvttps2pi", { MXC, EXq }, PREFIX_OPCODE },
3724 { "cvttss2si", { Gv, EXd }, PREFIX_OPCODE },
3725 { "cvttpd2pi", { MXC, EXx }, PREFIX_OPCODE },
3726 { "cvttsd2si", { Gv, EXq }, PREFIX_OPCODE },
3727 },
3728
3729 /* PREFIX_0F2D */
3730 {
3731 { "cvtps2pi", { MXC, EXq }, PREFIX_OPCODE },
3732 { "cvtss2si", { Gv, EXd }, PREFIX_OPCODE },
3733 { "cvtpd2pi", { MXC, EXx }, PREFIX_OPCODE },
3734 { "cvtsd2si", { Gv, EXq }, PREFIX_OPCODE },
3735 },
3736
3737 /* PREFIX_0F2E */
3738 {
3739 { "ucomiss",{ XM, EXd }, 0 },
3740 { Bad_Opcode },
3741 { "ucomisd",{ XM, EXq }, 0 },
3742 },
3743
3744 /* PREFIX_0F2F */
3745 {
3746 { "comiss", { XM, EXd }, 0 },
3747 { Bad_Opcode },
3748 { "comisd", { XM, EXq }, 0 },
3749 },
3750
3751 /* PREFIX_0F51 */
3752 {
3753 { "sqrtps", { XM, EXx }, PREFIX_OPCODE },
3754 { "sqrtss", { XM, EXd }, PREFIX_OPCODE },
3755 { "sqrtpd", { XM, EXx }, PREFIX_OPCODE },
3756 { "sqrtsd", { XM, EXq }, PREFIX_OPCODE },
3757 },
3758
3759 /* PREFIX_0F52 */
3760 {
3761 { "rsqrtps",{ XM, EXx }, PREFIX_OPCODE },
3762 { "rsqrtss",{ XM, EXd }, PREFIX_OPCODE },
3763 },
3764
3765 /* PREFIX_0F53 */
3766 {
3767 { "rcpps", { XM, EXx }, PREFIX_OPCODE },
3768 { "rcpss", { XM, EXd }, PREFIX_OPCODE },
3769 },
3770
3771 /* PREFIX_0F58 */
3772 {
3773 { "addps", { XM, EXx }, PREFIX_OPCODE },
3774 { "addss", { XM, EXd }, PREFIX_OPCODE },
3775 { "addpd", { XM, EXx }, PREFIX_OPCODE },
3776 { "addsd", { XM, EXq }, PREFIX_OPCODE },
3777 },
3778
3779 /* PREFIX_0F59 */
3780 {
3781 { "mulps", { XM, EXx }, PREFIX_OPCODE },
3782 { "mulss", { XM, EXd }, PREFIX_OPCODE },
3783 { "mulpd", { XM, EXx }, PREFIX_OPCODE },
3784 { "mulsd", { XM, EXq }, PREFIX_OPCODE },
3785 },
3786
3787 /* PREFIX_0F5A */
3788 {
3789 { "cvtps2pd", { XM, EXq }, PREFIX_OPCODE },
3790 { "cvtss2sd", { XM, EXd }, PREFIX_OPCODE },
3791 { "cvtpd2ps", { XM, EXx }, PREFIX_OPCODE },
3792 { "cvtsd2ss", { XM, EXq }, PREFIX_OPCODE },
3793 },
3794
3795 /* PREFIX_0F5B */
3796 {
3797 { "cvtdq2ps", { XM, EXx }, PREFIX_OPCODE },
3798 { "cvttps2dq", { XM, EXx }, PREFIX_OPCODE },
3799 { "cvtps2dq", { XM, EXx }, PREFIX_OPCODE },
3800 },
3801
3802 /* PREFIX_0F5C */
3803 {
3804 { "subps", { XM, EXx }, PREFIX_OPCODE },
3805 { "subss", { XM, EXd }, PREFIX_OPCODE },
3806 { "subpd", { XM, EXx }, PREFIX_OPCODE },
3807 { "subsd", { XM, EXq }, PREFIX_OPCODE },
3808 },
3809
3810 /* PREFIX_0F5D */
3811 {
3812 { "minps", { XM, EXx }, PREFIX_OPCODE },
3813 { "minss", { XM, EXd }, PREFIX_OPCODE },
3814 { "minpd", { XM, EXx }, PREFIX_OPCODE },
3815 { "minsd", { XM, EXq }, PREFIX_OPCODE },
3816 },
3817
3818 /* PREFIX_0F5E */
3819 {
3820 { "divps", { XM, EXx }, PREFIX_OPCODE },
3821 { "divss", { XM, EXd }, PREFIX_OPCODE },
3822 { "divpd", { XM, EXx }, PREFIX_OPCODE },
3823 { "divsd", { XM, EXq }, PREFIX_OPCODE },
3824 },
3825
3826 /* PREFIX_0F5F */
3827 {
3828 { "maxps", { XM, EXx }, PREFIX_OPCODE },
3829 { "maxss", { XM, EXd }, PREFIX_OPCODE },
3830 { "maxpd", { XM, EXx }, PREFIX_OPCODE },
3831 { "maxsd", { XM, EXq }, PREFIX_OPCODE },
3832 },
3833
3834 /* PREFIX_0F60 */
3835 {
3836 { "punpcklbw",{ MX, EMd }, PREFIX_OPCODE },
3837 { Bad_Opcode },
3838 { "punpcklbw",{ MX, EMx }, PREFIX_OPCODE },
3839 },
3840
3841 /* PREFIX_0F61 */
3842 {
3843 { "punpcklwd",{ MX, EMd }, PREFIX_OPCODE },
3844 { Bad_Opcode },
3845 { "punpcklwd",{ MX, EMx }, PREFIX_OPCODE },
3846 },
3847
3848 /* PREFIX_0F62 */
3849 {
3850 { "punpckldq",{ MX, EMd }, PREFIX_OPCODE },
3851 { Bad_Opcode },
3852 { "punpckldq",{ MX, EMx }, PREFIX_OPCODE },
3853 },
3854
3855 /* PREFIX_0F6C */
3856 {
3857 { Bad_Opcode },
3858 { Bad_Opcode },
3859 { "punpcklqdq", { XM, EXx }, PREFIX_OPCODE },
3860 },
3861
3862 /* PREFIX_0F6D */
3863 {
3864 { Bad_Opcode },
3865 { Bad_Opcode },
3866 { "punpckhqdq", { XM, EXx }, PREFIX_OPCODE },
3867 },
3868
3869 /* PREFIX_0F6F */
3870 {
3871 { "movq", { MX, EM }, PREFIX_OPCODE },
3872 { "movdqu", { XM, EXx }, PREFIX_OPCODE },
3873 { "movdqa", { XM, EXx }, PREFIX_OPCODE },
3874 },
3875
3876 /* PREFIX_0F70 */
3877 {
3878 { "pshufw", { MX, EM, Ib }, PREFIX_OPCODE },
3879 { "pshufhw",{ XM, EXx, Ib }, PREFIX_OPCODE },
3880 { "pshufd", { XM, EXx, Ib }, PREFIX_OPCODE },
3881 { "pshuflw",{ XM, EXx, Ib }, PREFIX_OPCODE },
3882 },
3883
3884 /* PREFIX_0F73_REG_3 */
3885 {
3886 { Bad_Opcode },
3887 { Bad_Opcode },
3888 { "psrldq", { XS, Ib }, 0 },
3889 },
3890
3891 /* PREFIX_0F73_REG_7 */
3892 {
3893 { Bad_Opcode },
3894 { Bad_Opcode },
3895 { "pslldq", { XS, Ib }, 0 },
3896 },
3897
3898 /* PREFIX_0F78 */
3899 {
3900 {"vmread", { Em, Gm }, 0 },
3901 { Bad_Opcode },
3902 {"extrq", { XS, Ib, Ib }, 0 },
3903 {"insertq", { XM, XS, Ib, Ib }, 0 },
3904 },
3905
3906 /* PREFIX_0F79 */
3907 {
3908 {"vmwrite", { Gm, Em }, 0 },
3909 { Bad_Opcode },
3910 {"extrq", { XM, XS }, 0 },
3911 {"insertq", { XM, XS }, 0 },
3912 },
3913
3914 /* PREFIX_0F7C */
3915 {
3916 { Bad_Opcode },
3917 { Bad_Opcode },
3918 { "haddpd", { XM, EXx }, PREFIX_OPCODE },
3919 { "haddps", { XM, EXx }, PREFIX_OPCODE },
3920 },
3921
3922 /* PREFIX_0F7D */
3923 {
3924 { Bad_Opcode },
3925 { Bad_Opcode },
3926 { "hsubpd", { XM, EXx }, PREFIX_OPCODE },
3927 { "hsubps", { XM, EXx }, PREFIX_OPCODE },
3928 },
3929
3930 /* PREFIX_0F7E */
3931 {
3932 { "movK", { Edq, MX }, PREFIX_OPCODE },
3933 { "movq", { XM, EXq }, PREFIX_OPCODE },
3934 { "movK", { Edq, XM }, PREFIX_OPCODE },
3935 },
3936
3937 /* PREFIX_0F7F */
3938 {
3939 { "movq", { EMS, MX }, PREFIX_OPCODE },
3940 { "movdqu", { EXxS, XM }, PREFIX_OPCODE },
3941 { "movdqa", { EXxS, XM }, PREFIX_OPCODE },
3942 },
3943
3944 /* PREFIX_0FAE_REG_0 */
3945 {
3946 { Bad_Opcode },
3947 { "rdfsbase", { Ev }, 0 },
3948 },
3949
3950 /* PREFIX_0FAE_REG_1 */
3951 {
3952 { Bad_Opcode },
3953 { "rdgsbase", { Ev }, 0 },
3954 },
3955
3956 /* PREFIX_0FAE_REG_2 */
3957 {
3958 { Bad_Opcode },
3959 { "wrfsbase", { Ev }, 0 },
3960 },
3961
3962 /* PREFIX_0FAE_REG_3 */
3963 {
3964 { Bad_Opcode },
3965 { "wrgsbase", { Ev }, 0 },
3966 },
3967
3968 /* PREFIX_MOD_0_0FAE_REG_4 */
3969 {
3970 { "xsave", { FXSAVE }, 0 },
3971 { "ptwrite%LQ", { Edq }, 0 },
3972 },
3973
3974 /* PREFIX_MOD_3_0FAE_REG_4 */
3975 {
3976 { Bad_Opcode },
3977 { "ptwrite%LQ", { Edq }, 0 },
3978 },
3979
3980 /* PREFIX_MOD_0_0FAE_REG_5 */
3981 {
3982 { "xrstor", { FXSAVE }, PREFIX_OPCODE },
3983 },
3984
3985 /* PREFIX_MOD_3_0FAE_REG_5 */
3986 {
3987 { "lfence", { Skip_MODRM }, 0 },
3988 { "incsspK", { Rdq }, PREFIX_OPCODE },
3989 },
3990
3991 /* PREFIX_MOD_0_0FAE_REG_6 */
3992 {
3993 { "xsaveopt", { FXSAVE }, PREFIX_OPCODE },
3994 { "clrssbsy", { Mq }, PREFIX_OPCODE },
3995 { "clwb", { Mb }, PREFIX_OPCODE },
3996 },
3997
3998 /* PREFIX_MOD_1_0FAE_REG_6 */
3999 {
4000 { RM_TABLE (RM_0FAE_REG_6) },
4001 { "umonitor", { Eva }, PREFIX_OPCODE },
4002 { "tpause", { Edq }, PREFIX_OPCODE },
4003 { "umwait", { Edq }, PREFIX_OPCODE },
4004 },
4005
4006 /* PREFIX_0FAE_REG_7 */
4007 {
4008 { "clflush", { Mb }, 0 },
4009 { Bad_Opcode },
4010 { "clflushopt", { Mb }, 0 },
4011 },
4012
4013 /* PREFIX_0FB8 */
4014 {
4015 { Bad_Opcode },
4016 { "popcntS", { Gv, Ev }, 0 },
4017 },
4018
4019 /* PREFIX_0FBC */
4020 {
4021 { "bsfS", { Gv, Ev }, 0 },
4022 { "tzcntS", { Gv, Ev }, 0 },
4023 { "bsfS", { Gv, Ev }, 0 },
4024 },
4025
4026 /* PREFIX_0FBD */
4027 {
4028 { "bsrS", { Gv, Ev }, 0 },
4029 { "lzcntS", { Gv, Ev }, 0 },
4030 { "bsrS", { Gv, Ev }, 0 },
4031 },
4032
4033 /* PREFIX_0FC2 */
4034 {
4035 { "cmpps", { XM, EXx, CMP }, PREFIX_OPCODE },
4036 { "cmpss", { XM, EXd, CMP }, PREFIX_OPCODE },
4037 { "cmppd", { XM, EXx, CMP }, PREFIX_OPCODE },
4038 { "cmpsd", { XM, EXq, CMP }, PREFIX_OPCODE },
4039 },
4040
4041 /* PREFIX_MOD_0_0FC3 */
4042 {
4043 { "movntiS", { Ev, Gv }, PREFIX_OPCODE },
4044 },
4045
4046 /* PREFIX_MOD_0_0FC7_REG_6 */
4047 {
4048 { "vmptrld",{ Mq }, 0 },
4049 { "vmxon", { Mq }, 0 },
4050 { "vmclear",{ Mq }, 0 },
4051 },
4052
4053 /* PREFIX_MOD_3_0FC7_REG_6 */
4054 {
4055 { "rdrand", { Ev }, 0 },
4056 { Bad_Opcode },
4057 { "rdrand", { Ev }, 0 }
4058 },
4059
4060 /* PREFIX_MOD_3_0FC7_REG_7 */
4061 {
4062 { "rdseed", { Ev }, 0 },
4063 { "rdpid", { Em }, 0 },
4064 { "rdseed", { Ev }, 0 },
4065 },
4066
4067 /* PREFIX_0FD0 */
4068 {
4069 { Bad_Opcode },
4070 { Bad_Opcode },
4071 { "addsubpd", { XM, EXx }, 0 },
4072 { "addsubps", { XM, EXx }, 0 },
4073 },
4074
4075 /* PREFIX_0FD6 */
4076 {
4077 { Bad_Opcode },
4078 { "movq2dq",{ XM, MS }, 0 },
4079 { "movq", { EXqS, XM }, 0 },
4080 { "movdq2q",{ MX, XS }, 0 },
4081 },
4082
4083 /* PREFIX_0FE6 */
4084 {
4085 { Bad_Opcode },
4086 { "cvtdq2pd", { XM, EXq }, PREFIX_OPCODE },
4087 { "cvttpd2dq", { XM, EXx }, PREFIX_OPCODE },
4088 { "cvtpd2dq", { XM, EXx }, PREFIX_OPCODE },
4089 },
4090
4091 /* PREFIX_0FE7 */
4092 {
4093 { "movntq", { Mq, MX }, PREFIX_OPCODE },
4094 { Bad_Opcode },
4095 { MOD_TABLE (MOD_0FE7_PREFIX_2) },
4096 },
4097
4098 /* PREFIX_0FF0 */
4099 {
4100 { Bad_Opcode },
4101 { Bad_Opcode },
4102 { Bad_Opcode },
4103 { MOD_TABLE (MOD_0FF0_PREFIX_3) },
4104 },
4105
4106 /* PREFIX_0FF7 */
4107 {
4108 { "maskmovq", { MX, MS }, PREFIX_OPCODE },
4109 { Bad_Opcode },
4110 { "maskmovdqu", { XM, XS }, PREFIX_OPCODE },
4111 },
4112
4113 /* PREFIX_0F3810 */
4114 {
4115 { Bad_Opcode },
4116 { Bad_Opcode },
4117 { "pblendvb", { XM, EXx, XMM0 }, PREFIX_OPCODE },
4118 },
4119
4120 /* PREFIX_0F3814 */
4121 {
4122 { Bad_Opcode },
4123 { Bad_Opcode },
4124 { "blendvps", { XM, EXx, XMM0 }, PREFIX_OPCODE },
4125 },
4126
4127 /* PREFIX_0F3815 */
4128 {
4129 { Bad_Opcode },
4130 { Bad_Opcode },
4131 { "blendvpd", { XM, EXx, XMM0 }, PREFIX_OPCODE },
4132 },
4133
4134 /* PREFIX_0F3817 */
4135 {
4136 { Bad_Opcode },
4137 { Bad_Opcode },
4138 { "ptest", { XM, EXx }, PREFIX_OPCODE },
4139 },
4140
4141 /* PREFIX_0F3820 */
4142 {
4143 { Bad_Opcode },
4144 { Bad_Opcode },
4145 { "pmovsxbw", { XM, EXq }, PREFIX_OPCODE },
4146 },
4147
4148 /* PREFIX_0F3821 */
4149 {
4150 { Bad_Opcode },
4151 { Bad_Opcode },
4152 { "pmovsxbd", { XM, EXd }, PREFIX_OPCODE },
4153 },
4154
4155 /* PREFIX_0F3822 */
4156 {
4157 { Bad_Opcode },
4158 { Bad_Opcode },
4159 { "pmovsxbq", { XM, EXw }, PREFIX_OPCODE },
4160 },
4161
4162 /* PREFIX_0F3823 */
4163 {
4164 { Bad_Opcode },
4165 { Bad_Opcode },
4166 { "pmovsxwd", { XM, EXq }, PREFIX_OPCODE },
4167 },
4168
4169 /* PREFIX_0F3824 */
4170 {
4171 { Bad_Opcode },
4172 { Bad_Opcode },
4173 { "pmovsxwq", { XM, EXd }, PREFIX_OPCODE },
4174 },
4175
4176 /* PREFIX_0F3825 */
4177 {
4178 { Bad_Opcode },
4179 { Bad_Opcode },
4180 { "pmovsxdq", { XM, EXq }, PREFIX_OPCODE },
4181 },
4182
4183 /* PREFIX_0F3828 */
4184 {
4185 { Bad_Opcode },
4186 { Bad_Opcode },
4187 { "pmuldq", { XM, EXx }, PREFIX_OPCODE },
4188 },
4189
4190 /* PREFIX_0F3829 */
4191 {
4192 { Bad_Opcode },
4193 { Bad_Opcode },
4194 { "pcmpeqq", { XM, EXx }, PREFIX_OPCODE },
4195 },
4196
4197 /* PREFIX_0F382A */
4198 {
4199 { Bad_Opcode },
4200 { Bad_Opcode },
4201 { MOD_TABLE (MOD_0F382A_PREFIX_2) },
4202 },
4203
4204 /* PREFIX_0F382B */
4205 {
4206 { Bad_Opcode },
4207 { Bad_Opcode },
4208 { "packusdw", { XM, EXx }, PREFIX_OPCODE },
4209 },
4210
4211 /* PREFIX_0F3830 */
4212 {
4213 { Bad_Opcode },
4214 { Bad_Opcode },
4215 { "pmovzxbw", { XM, EXq }, PREFIX_OPCODE },
4216 },
4217
4218 /* PREFIX_0F3831 */
4219 {
4220 { Bad_Opcode },
4221 { Bad_Opcode },
4222 { "pmovzxbd", { XM, EXd }, PREFIX_OPCODE },
4223 },
4224
4225 /* PREFIX_0F3832 */
4226 {
4227 { Bad_Opcode },
4228 { Bad_Opcode },
4229 { "pmovzxbq", { XM, EXw }, PREFIX_OPCODE },
4230 },
4231
4232 /* PREFIX_0F3833 */
4233 {
4234 { Bad_Opcode },
4235 { Bad_Opcode },
4236 { "pmovzxwd", { XM, EXq }, PREFIX_OPCODE },
4237 },
4238
4239 /* PREFIX_0F3834 */
4240 {
4241 { Bad_Opcode },
4242 { Bad_Opcode },
4243 { "pmovzxwq", { XM, EXd }, PREFIX_OPCODE },
4244 },
4245
4246 /* PREFIX_0F3835 */
4247 {
4248 { Bad_Opcode },
4249 { Bad_Opcode },
4250 { "pmovzxdq", { XM, EXq }, PREFIX_OPCODE },
4251 },
4252
4253 /* PREFIX_0F3837 */
4254 {
4255 { Bad_Opcode },
4256 { Bad_Opcode },
4257 { "pcmpgtq", { XM, EXx }, PREFIX_OPCODE },
4258 },
4259
4260 /* PREFIX_0F3838 */
4261 {
4262 { Bad_Opcode },
4263 { Bad_Opcode },
4264 { "pminsb", { XM, EXx }, PREFIX_OPCODE },
4265 },
4266
4267 /* PREFIX_0F3839 */
4268 {
4269 { Bad_Opcode },
4270 { Bad_Opcode },
4271 { "pminsd", { XM, EXx }, PREFIX_OPCODE },
4272 },
4273
4274 /* PREFIX_0F383A */
4275 {
4276 { Bad_Opcode },
4277 { Bad_Opcode },
4278 { "pminuw", { XM, EXx }, PREFIX_OPCODE },
4279 },
4280
4281 /* PREFIX_0F383B */
4282 {
4283 { Bad_Opcode },
4284 { Bad_Opcode },
4285 { "pminud", { XM, EXx }, PREFIX_OPCODE },
4286 },
4287
4288 /* PREFIX_0F383C */
4289 {
4290 { Bad_Opcode },
4291 { Bad_Opcode },
4292 { "pmaxsb", { XM, EXx }, PREFIX_OPCODE },
4293 },
4294
4295 /* PREFIX_0F383D */
4296 {
4297 { Bad_Opcode },
4298 { Bad_Opcode },
4299 { "pmaxsd", { XM, EXx }, PREFIX_OPCODE },
4300 },
4301
4302 /* PREFIX_0F383E */
4303 {
4304 { Bad_Opcode },
4305 { Bad_Opcode },
4306 { "pmaxuw", { XM, EXx }, PREFIX_OPCODE },
4307 },
4308
4309 /* PREFIX_0F383F */
4310 {
4311 { Bad_Opcode },
4312 { Bad_Opcode },
4313 { "pmaxud", { XM, EXx }, PREFIX_OPCODE },
4314 },
4315
4316 /* PREFIX_0F3840 */
4317 {
4318 { Bad_Opcode },
4319 { Bad_Opcode },
4320 { "pmulld", { XM, EXx }, PREFIX_OPCODE },
4321 },
4322
4323 /* PREFIX_0F3841 */
4324 {
4325 { Bad_Opcode },
4326 { Bad_Opcode },
4327 { "phminposuw", { XM, EXx }, PREFIX_OPCODE },
4328 },
4329
4330 /* PREFIX_0F3880 */
4331 {
4332 { Bad_Opcode },
4333 { Bad_Opcode },
4334 { "invept", { Gm, Mo }, PREFIX_OPCODE },
4335 },
4336
4337 /* PREFIX_0F3881 */
4338 {
4339 { Bad_Opcode },
4340 { Bad_Opcode },
4341 { "invvpid", { Gm, Mo }, PREFIX_OPCODE },
4342 },
4343
4344 /* PREFIX_0F3882 */
4345 {
4346 { Bad_Opcode },
4347 { Bad_Opcode },
4348 { "invpcid", { Gm, M }, PREFIX_OPCODE },
4349 },
4350
4351 /* PREFIX_0F38C8 */
4352 {
4353 { "sha1nexte", { XM, EXxmm }, PREFIX_OPCODE },
4354 },
4355
4356 /* PREFIX_0F38C9 */
4357 {
4358 { "sha1msg1", { XM, EXxmm }, PREFIX_OPCODE },
4359 },
4360
4361 /* PREFIX_0F38CA */
4362 {
4363 { "sha1msg2", { XM, EXxmm }, PREFIX_OPCODE },
4364 },
4365
4366 /* PREFIX_0F38CB */
4367 {
4368 { "sha256rnds2", { XM, EXxmm, XMM0 }, PREFIX_OPCODE },
4369 },
4370
4371 /* PREFIX_0F38CC */
4372 {
4373 { "sha256msg1", { XM, EXxmm }, PREFIX_OPCODE },
4374 },
4375
4376 /* PREFIX_0F38CD */
4377 {
4378 { "sha256msg2", { XM, EXxmm }, PREFIX_OPCODE },
4379 },
4380
4381 /* PREFIX_0F38CF */
4382 {
4383 { Bad_Opcode },
4384 { Bad_Opcode },
4385 { "gf2p8mulb", { XM, EXxmm }, PREFIX_OPCODE },
4386 },
4387
4388 /* PREFIX_0F38DB */
4389 {
4390 { Bad_Opcode },
4391 { Bad_Opcode },
4392 { "aesimc", { XM, EXx }, PREFIX_OPCODE },
4393 },
4394
4395 /* PREFIX_0F38DC */
4396 {
4397 { Bad_Opcode },
4398 { Bad_Opcode },
4399 { "aesenc", { XM, EXx }, PREFIX_OPCODE },
4400 },
4401
4402 /* PREFIX_0F38DD */
4403 {
4404 { Bad_Opcode },
4405 { Bad_Opcode },
4406 { "aesenclast", { XM, EXx }, PREFIX_OPCODE },
4407 },
4408
4409 /* PREFIX_0F38DE */
4410 {
4411 { Bad_Opcode },
4412 { Bad_Opcode },
4413 { "aesdec", { XM, EXx }, PREFIX_OPCODE },
4414 },
4415
4416 /* PREFIX_0F38DF */
4417 {
4418 { Bad_Opcode },
4419 { Bad_Opcode },
4420 { "aesdeclast", { XM, EXx }, PREFIX_OPCODE },
4421 },
4422
4423 /* PREFIX_0F38F0 */
4424 {
4425 { "movbeS", { Gv, { MOVBE_Fixup, v_mode } }, PREFIX_OPCODE },
4426 { Bad_Opcode },
4427 { "movbeS", { Gv, { MOVBE_Fixup, v_mode } }, PREFIX_OPCODE },
4428 { "crc32", { Gdq, { CRC32_Fixup, b_mode } }, PREFIX_OPCODE },
4429 },
4430
4431 /* PREFIX_0F38F1 */
4432 {
4433 { "movbeS", { { MOVBE_Fixup, v_mode }, Gv }, PREFIX_OPCODE },
4434 { Bad_Opcode },
4435 { "movbeS", { { MOVBE_Fixup, v_mode }, Gv }, PREFIX_OPCODE },
4436 { "crc32", { Gdq, { CRC32_Fixup, v_mode } }, PREFIX_OPCODE },
4437 },
4438
4439 /* PREFIX_0F38F5 */
4440 {
4441 { Bad_Opcode },
4442 { Bad_Opcode },
4443 { MOD_TABLE (MOD_0F38F5_PREFIX_2) },
4444 },
4445
4446 /* PREFIX_0F38F6 */
4447 {
4448 { MOD_TABLE (MOD_0F38F6_PREFIX_0) },
4449 { "adoxS", { Gdq, Edq}, PREFIX_OPCODE },
4450 { "adcxS", { Gdq, Edq}, PREFIX_OPCODE },
4451 { Bad_Opcode },
4452 },
4453
4454 /* PREFIX_0F38F8 */
4455 {
4456 { Bad_Opcode },
4457 { Bad_Opcode },
4458 { MOD_TABLE (MOD_0F38F8_PREFIX_2) },
4459 },
4460
4461 /* PREFIX_0F38F9 */
4462 {
4463 { MOD_TABLE (MOD_0F38F9_PREFIX_0) },
4464 },
4465
4466 /* PREFIX_0F3A08 */
4467 {
4468 { Bad_Opcode },
4469 { Bad_Opcode },
4470 { "roundps", { XM, EXx, Ib }, PREFIX_OPCODE },
4471 },
4472
4473 /* PREFIX_0F3A09 */
4474 {
4475 { Bad_Opcode },
4476 { Bad_Opcode },
4477 { "roundpd", { XM, EXx, Ib }, PREFIX_OPCODE },
4478 },
4479
4480 /* PREFIX_0F3A0A */
4481 {
4482 { Bad_Opcode },
4483 { Bad_Opcode },
4484 { "roundss", { XM, EXd, Ib }, PREFIX_OPCODE },
4485 },
4486
4487 /* PREFIX_0F3A0B */
4488 {
4489 { Bad_Opcode },
4490 { Bad_Opcode },
4491 { "roundsd", { XM, EXq, Ib }, PREFIX_OPCODE },
4492 },
4493
4494 /* PREFIX_0F3A0C */
4495 {
4496 { Bad_Opcode },
4497 { Bad_Opcode },
4498 { "blendps", { XM, EXx, Ib }, PREFIX_OPCODE },
4499 },
4500
4501 /* PREFIX_0F3A0D */
4502 {
4503 { Bad_Opcode },
4504 { Bad_Opcode },
4505 { "blendpd", { XM, EXx, Ib }, PREFIX_OPCODE },
4506 },
4507
4508 /* PREFIX_0F3A0E */
4509 {
4510 { Bad_Opcode },
4511 { Bad_Opcode },
4512 { "pblendw", { XM, EXx, Ib }, PREFIX_OPCODE },
4513 },
4514
4515 /* PREFIX_0F3A14 */
4516 {
4517 { Bad_Opcode },
4518 { Bad_Opcode },
4519 { "pextrb", { Edqb, XM, Ib }, PREFIX_OPCODE },
4520 },
4521
4522 /* PREFIX_0F3A15 */
4523 {
4524 { Bad_Opcode },
4525 { Bad_Opcode },
4526 { "pextrw", { Edqw, XM, Ib }, PREFIX_OPCODE },
4527 },
4528
4529 /* PREFIX_0F3A16 */
4530 {
4531 { Bad_Opcode },
4532 { Bad_Opcode },
4533 { "pextrK", { Edq, XM, Ib }, PREFIX_OPCODE },
4534 },
4535
4536 /* PREFIX_0F3A17 */
4537 {
4538 { Bad_Opcode },
4539 { Bad_Opcode },
4540 { "extractps", { Edqd, XM, Ib }, PREFIX_OPCODE },
4541 },
4542
4543 /* PREFIX_0F3A20 */
4544 {
4545 { Bad_Opcode },
4546 { Bad_Opcode },
4547 { "pinsrb", { XM, Edqb, Ib }, PREFIX_OPCODE },
4548 },
4549
4550 /* PREFIX_0F3A21 */
4551 {
4552 { Bad_Opcode },
4553 { Bad_Opcode },
4554 { "insertps", { XM, EXd, Ib }, PREFIX_OPCODE },
4555 },
4556
4557 /* PREFIX_0F3A22 */
4558 {
4559 { Bad_Opcode },
4560 { Bad_Opcode },
4561 { "pinsrK", { XM, Edq, Ib }, PREFIX_OPCODE },
4562 },
4563
4564 /* PREFIX_0F3A40 */
4565 {
4566 { Bad_Opcode },
4567 { Bad_Opcode },
4568 { "dpps", { XM, EXx, Ib }, PREFIX_OPCODE },
4569 },
4570
4571 /* PREFIX_0F3A41 */
4572 {
4573 { Bad_Opcode },
4574 { Bad_Opcode },
4575 { "dppd", { XM, EXx, Ib }, PREFIX_OPCODE },
4576 },
4577
4578 /* PREFIX_0F3A42 */
4579 {
4580 { Bad_Opcode },
4581 { Bad_Opcode },
4582 { "mpsadbw", { XM, EXx, Ib }, PREFIX_OPCODE },
4583 },
4584
4585 /* PREFIX_0F3A44 */
4586 {
4587 { Bad_Opcode },
4588 { Bad_Opcode },
4589 { "pclmulqdq", { XM, EXx, PCLMUL }, PREFIX_OPCODE },
4590 },
4591
4592 /* PREFIX_0F3A60 */
4593 {
4594 { Bad_Opcode },
4595 { Bad_Opcode },
4596 { "pcmpestrm", { XM, { PCMPESTR_Fixup, x_mode }, Ib }, PREFIX_OPCODE },
4597 },
4598
4599 /* PREFIX_0F3A61 */
4600 {
4601 { Bad_Opcode },
4602 { Bad_Opcode },
4603 { "pcmpestri", { XM, { PCMPESTR_Fixup, x_mode }, Ib }, PREFIX_OPCODE },
4604 },
4605
4606 /* PREFIX_0F3A62 */
4607 {
4608 { Bad_Opcode },
4609 { Bad_Opcode },
4610 { "pcmpistrm", { XM, EXx, Ib }, PREFIX_OPCODE },
4611 },
4612
4613 /* PREFIX_0F3A63 */
4614 {
4615 { Bad_Opcode },
4616 { Bad_Opcode },
4617 { "pcmpistri", { XM, EXx, Ib }, PREFIX_OPCODE },
4618 },
4619
4620 /* PREFIX_0F3ACC */
4621 {
4622 { "sha1rnds4", { XM, EXxmm, Ib }, PREFIX_OPCODE },
4623 },
4624
4625 /* PREFIX_0F3ACE */
4626 {
4627 { Bad_Opcode },
4628 { Bad_Opcode },
4629 { "gf2p8affineqb", { XM, EXxmm, Ib }, PREFIX_OPCODE },
4630 },
4631
4632 /* PREFIX_0F3ACF */
4633 {
4634 { Bad_Opcode },
4635 { Bad_Opcode },
4636 { "gf2p8affineinvqb", { XM, EXxmm, Ib }, PREFIX_OPCODE },
4637 },
4638
4639 /* PREFIX_0F3ADF */
4640 {
4641 { Bad_Opcode },
4642 { Bad_Opcode },
4643 { "aeskeygenassist", { XM, EXx, Ib }, PREFIX_OPCODE },
4644 },
4645
4646 /* PREFIX_VEX_0F10 */
4647 {
4648 { "vmovups", { XM, EXx }, 0 },
4649 { "vmovss", { XMVexScalar, VexScalar, EXdScalar }, 0 },
4650 { "vmovupd", { XM, EXx }, 0 },
4651 { "vmovsd", { XMVexScalar, VexScalar, EXqScalar }, 0 },
4652 },
4653
4654 /* PREFIX_VEX_0F11 */
4655 {
4656 { "vmovups", { EXxS, XM }, 0 },
4657 { "vmovss", { EXdVexScalarS, VexScalar, XMScalar }, 0 },
4658 { "vmovupd", { EXxS, XM }, 0 },
4659 { "vmovsd", { EXqVexScalarS, VexScalar, XMScalar }, 0 },
4660 },
4661
4662 /* PREFIX_VEX_0F12 */
4663 {
4664 { MOD_TABLE (MOD_VEX_0F12_PREFIX_0) },
4665 { "vmovsldup", { XM, EXx }, 0 },
4666 { VEX_LEN_TABLE (VEX_LEN_0F12_P_2) },
4667 { "vmovddup", { XM, EXymmq }, 0 },
4668 },
4669
4670 /* PREFIX_VEX_0F16 */
4671 {
4672 { MOD_TABLE (MOD_VEX_0F16_PREFIX_0) },
4673 { "vmovshdup", { XM, EXx }, 0 },
4674 { VEX_LEN_TABLE (VEX_LEN_0F16_P_2) },
4675 },
4676
4677 /* PREFIX_VEX_0F2A */
4678 {
4679 { Bad_Opcode },
4680 { VEX_LEN_TABLE (VEX_LEN_0F2A_P_1) },
4681 { Bad_Opcode },
4682 { VEX_LEN_TABLE (VEX_LEN_0F2A_P_3) },
4683 },
4684
4685 /* PREFIX_VEX_0F2C */
4686 {
4687 { Bad_Opcode },
4688 { VEX_LEN_TABLE (VEX_LEN_0F2C_P_1) },
4689 { Bad_Opcode },
4690 { VEX_LEN_TABLE (VEX_LEN_0F2C_P_3) },
4691 },
4692
4693 /* PREFIX_VEX_0F2D */
4694 {
4695 { Bad_Opcode },
4696 { VEX_LEN_TABLE (VEX_LEN_0F2D_P_1) },
4697 { Bad_Opcode },
4698 { VEX_LEN_TABLE (VEX_LEN_0F2D_P_3) },
4699 },
4700
4701 /* PREFIX_VEX_0F2E */
4702 {
4703 { "vucomiss", { XMScalar, EXdScalar }, 0 },
4704 { Bad_Opcode },
4705 { "vucomisd", { XMScalar, EXqScalar }, 0 },
4706 },
4707
4708 /* PREFIX_VEX_0F2F */
4709 {
4710 { "vcomiss", { XMScalar, EXdScalar }, 0 },
4711 { Bad_Opcode },
4712 { "vcomisd", { XMScalar, EXqScalar }, 0 },
4713 },
4714
4715 /* PREFIX_VEX_0F41 */
4716 {
4717 { VEX_LEN_TABLE (VEX_LEN_0F41_P_0) },
4718 { Bad_Opcode },
4719 { VEX_LEN_TABLE (VEX_LEN_0F41_P_2) },
4720 },
4721
4722 /* PREFIX_VEX_0F42 */
4723 {
4724 { VEX_LEN_TABLE (VEX_LEN_0F42_P_0) },
4725 { Bad_Opcode },
4726 { VEX_LEN_TABLE (VEX_LEN_0F42_P_2) },
4727 },
4728
4729 /* PREFIX_VEX_0F44 */
4730 {
4731 { VEX_LEN_TABLE (VEX_LEN_0F44_P_0) },
4732 { Bad_Opcode },
4733 { VEX_LEN_TABLE (VEX_LEN_0F44_P_2) },
4734 },
4735
4736 /* PREFIX_VEX_0F45 */
4737 {
4738 { VEX_LEN_TABLE (VEX_LEN_0F45_P_0) },
4739 { Bad_Opcode },
4740 { VEX_LEN_TABLE (VEX_LEN_0F45_P_2) },
4741 },
4742
4743 /* PREFIX_VEX_0F46 */
4744 {
4745 { VEX_LEN_TABLE (VEX_LEN_0F46_P_0) },
4746 { Bad_Opcode },
4747 { VEX_LEN_TABLE (VEX_LEN_0F46_P_2) },
4748 },
4749
4750 /* PREFIX_VEX_0F47 */
4751 {
4752 { VEX_LEN_TABLE (VEX_LEN_0F47_P_0) },
4753 { Bad_Opcode },
4754 { VEX_LEN_TABLE (VEX_LEN_0F47_P_2) },
4755 },
4756
4757 /* PREFIX_VEX_0F4A */
4758 {
4759 { VEX_LEN_TABLE (VEX_LEN_0F4A_P_0) },
4760 { Bad_Opcode },
4761 { VEX_LEN_TABLE (VEX_LEN_0F4A_P_2) },
4762 },
4763
4764 /* PREFIX_VEX_0F4B */
4765 {
4766 { VEX_LEN_TABLE (VEX_LEN_0F4B_P_0) },
4767 { Bad_Opcode },
4768 { VEX_LEN_TABLE (VEX_LEN_0F4B_P_2) },
4769 },
4770
4771 /* PREFIX_VEX_0F51 */
4772 {
4773 { "vsqrtps", { XM, EXx }, 0 },
4774 { "vsqrtss", { XMScalar, VexScalar, EXdScalar }, 0 },
4775 { "vsqrtpd", { XM, EXx }, 0 },
4776 { "vsqrtsd", { XMScalar, VexScalar, EXqScalar }, 0 },
4777 },
4778
4779 /* PREFIX_VEX_0F52 */
4780 {
4781 { "vrsqrtps", { XM, EXx }, 0 },
4782 { "vrsqrtss", { XMScalar, VexScalar, EXdScalar }, 0 },
4783 },
4784
4785 /* PREFIX_VEX_0F53 */
4786 {
4787 { "vrcpps", { XM, EXx }, 0 },
4788 { "vrcpss", { XMScalar, VexScalar, EXdScalar }, 0 },
4789 },
4790
4791 /* PREFIX_VEX_0F58 */
4792 {
4793 { "vaddps", { XM, Vex, EXx }, 0 },
4794 { "vaddss", { XMScalar, VexScalar, EXdScalar }, 0 },
4795 { "vaddpd", { XM, Vex, EXx }, 0 },
4796 { "vaddsd", { XMScalar, VexScalar, EXqScalar }, 0 },
4797 },
4798
4799 /* PREFIX_VEX_0F59 */
4800 {
4801 { "vmulps", { XM, Vex, EXx }, 0 },
4802 { "vmulss", { XMScalar, VexScalar, EXdScalar }, 0 },
4803 { "vmulpd", { XM, Vex, EXx }, 0 },
4804 { "vmulsd", { XMScalar, VexScalar, EXqScalar }, 0 },
4805 },
4806
4807 /* PREFIX_VEX_0F5A */
4808 {
4809 { "vcvtps2pd", { XM, EXxmmq }, 0 },
4810 { "vcvtss2sd", { XMScalar, VexScalar, EXdScalar }, 0 },
4811 { "vcvtpd2ps%XY",{ XMM, EXx }, 0 },
4812 { "vcvtsd2ss", { XMScalar, VexScalar, EXqScalar }, 0 },
4813 },
4814
4815 /* PREFIX_VEX_0F5B */
4816 {
4817 { "vcvtdq2ps", { XM, EXx }, 0 },
4818 { "vcvttps2dq", { XM, EXx }, 0 },
4819 { "vcvtps2dq", { XM, EXx }, 0 },
4820 },
4821
4822 /* PREFIX_VEX_0F5C */
4823 {
4824 { "vsubps", { XM, Vex, EXx }, 0 },
4825 { "vsubss", { XMScalar, VexScalar, EXdScalar }, 0 },
4826 { "vsubpd", { XM, Vex, EXx }, 0 },
4827 { "vsubsd", { XMScalar, VexScalar, EXqScalar }, 0 },
4828 },
4829
4830 /* PREFIX_VEX_0F5D */
4831 {
4832 { "vminps", { XM, Vex, EXx }, 0 },
4833 { "vminss", { XMScalar, VexScalar, EXdScalar }, 0 },
4834 { "vminpd", { XM, Vex, EXx }, 0 },
4835 { "vminsd", { XMScalar, VexScalar, EXqScalar }, 0 },
4836 },
4837
4838 /* PREFIX_VEX_0F5E */
4839 {
4840 { "vdivps", { XM, Vex, EXx }, 0 },
4841 { "vdivss", { XMScalar, VexScalar, EXdScalar }, 0 },
4842 { "vdivpd", { XM, Vex, EXx }, 0 },
4843 { "vdivsd", { XMScalar, VexScalar, EXqScalar }, 0 },
4844 },
4845
4846 /* PREFIX_VEX_0F5F */
4847 {
4848 { "vmaxps", { XM, Vex, EXx }, 0 },
4849 { "vmaxss", { XMScalar, VexScalar, EXdScalar }, 0 },
4850 { "vmaxpd", { XM, Vex, EXx }, 0 },
4851 { "vmaxsd", { XMScalar, VexScalar, EXqScalar }, 0 },
4852 },
4853
4854 /* PREFIX_VEX_0F60 */
4855 {
4856 { Bad_Opcode },
4857 { Bad_Opcode },
4858 { "vpunpcklbw", { XM, Vex, EXx }, 0 },
4859 },
4860
4861 /* PREFIX_VEX_0F61 */
4862 {
4863 { Bad_Opcode },
4864 { Bad_Opcode },
4865 { "vpunpcklwd", { XM, Vex, EXx }, 0 },
4866 },
4867
4868 /* PREFIX_VEX_0F62 */
4869 {
4870 { Bad_Opcode },
4871 { Bad_Opcode },
4872 { "vpunpckldq", { XM, Vex, EXx }, 0 },
4873 },
4874
4875 /* PREFIX_VEX_0F63 */
4876 {
4877 { Bad_Opcode },
4878 { Bad_Opcode },
4879 { "vpacksswb", { XM, Vex, EXx }, 0 },
4880 },
4881
4882 /* PREFIX_VEX_0F64 */
4883 {
4884 { Bad_Opcode },
4885 { Bad_Opcode },
4886 { "vpcmpgtb", { XM, Vex, EXx }, 0 },
4887 },
4888
4889 /* PREFIX_VEX_0F65 */
4890 {
4891 { Bad_Opcode },
4892 { Bad_Opcode },
4893 { "vpcmpgtw", { XM, Vex, EXx }, 0 },
4894 },
4895
4896 /* PREFIX_VEX_0F66 */
4897 {
4898 { Bad_Opcode },
4899 { Bad_Opcode },
4900 { "vpcmpgtd", { XM, Vex, EXx }, 0 },
4901 },
4902
4903 /* PREFIX_VEX_0F67 */
4904 {
4905 { Bad_Opcode },
4906 { Bad_Opcode },
4907 { "vpackuswb", { XM, Vex, EXx }, 0 },
4908 },
4909
4910 /* PREFIX_VEX_0F68 */
4911 {
4912 { Bad_Opcode },
4913 { Bad_Opcode },
4914 { "vpunpckhbw", { XM, Vex, EXx }, 0 },
4915 },
4916
4917 /* PREFIX_VEX_0F69 */
4918 {
4919 { Bad_Opcode },
4920 { Bad_Opcode },
4921 { "vpunpckhwd", { XM, Vex, EXx }, 0 },
4922 },
4923
4924 /* PREFIX_VEX_0F6A */
4925 {
4926 { Bad_Opcode },
4927 { Bad_Opcode },
4928 { "vpunpckhdq", { XM, Vex, EXx }, 0 },
4929 },
4930
4931 /* PREFIX_VEX_0F6B */
4932 {
4933 { Bad_Opcode },
4934 { Bad_Opcode },
4935 { "vpackssdw", { XM, Vex, EXx }, 0 },
4936 },
4937
4938 /* PREFIX_VEX_0F6C */
4939 {
4940 { Bad_Opcode },
4941 { Bad_Opcode },
4942 { "vpunpcklqdq", { XM, Vex, EXx }, 0 },
4943 },
4944
4945 /* PREFIX_VEX_0F6D */
4946 {
4947 { Bad_Opcode },
4948 { Bad_Opcode },
4949 { "vpunpckhqdq", { XM, Vex, EXx }, 0 },
4950 },
4951
4952 /* PREFIX_VEX_0F6E */
4953 {
4954 { Bad_Opcode },
4955 { Bad_Opcode },
4956 { VEX_LEN_TABLE (VEX_LEN_0F6E_P_2) },
4957 },
4958
4959 /* PREFIX_VEX_0F6F */
4960 {
4961 { Bad_Opcode },
4962 { "vmovdqu", { XM, EXx }, 0 },
4963 { "vmovdqa", { XM, EXx }, 0 },
4964 },
4965
4966 /* PREFIX_VEX_0F70 */
4967 {
4968 { Bad_Opcode },
4969 { "vpshufhw", { XM, EXx, Ib }, 0 },
4970 { "vpshufd", { XM, EXx, Ib }, 0 },
4971 { "vpshuflw", { XM, EXx, Ib }, 0 },
4972 },
4973
4974 /* PREFIX_VEX_0F71_REG_2 */
4975 {
4976 { Bad_Opcode },
4977 { Bad_Opcode },
4978 { "vpsrlw", { Vex, XS, Ib }, 0 },
4979 },
4980
4981 /* PREFIX_VEX_0F71_REG_4 */
4982 {
4983 { Bad_Opcode },
4984 { Bad_Opcode },
4985 { "vpsraw", { Vex, XS, Ib }, 0 },
4986 },
4987
4988 /* PREFIX_VEX_0F71_REG_6 */
4989 {
4990 { Bad_Opcode },
4991 { Bad_Opcode },
4992 { "vpsllw", { Vex, XS, Ib }, 0 },
4993 },
4994
4995 /* PREFIX_VEX_0F72_REG_2 */
4996 {
4997 { Bad_Opcode },
4998 { Bad_Opcode },
4999 { "vpsrld", { Vex, XS, Ib }, 0 },
5000 },
5001
5002 /* PREFIX_VEX_0F72_REG_4 */
5003 {
5004 { Bad_Opcode },
5005 { Bad_Opcode },
5006 { "vpsrad", { Vex, XS, Ib }, 0 },
5007 },
5008
5009 /* PREFIX_VEX_0F72_REG_6 */
5010 {
5011 { Bad_Opcode },
5012 { Bad_Opcode },
5013 { "vpslld", { Vex, XS, Ib }, 0 },
5014 },
5015
5016 /* PREFIX_VEX_0F73_REG_2 */
5017 {
5018 { Bad_Opcode },
5019 { Bad_Opcode },
5020 { "vpsrlq", { Vex, XS, Ib }, 0 },
5021 },
5022
5023 /* PREFIX_VEX_0F73_REG_3 */
5024 {
5025 { Bad_Opcode },
5026 { Bad_Opcode },
5027 { "vpsrldq", { Vex, XS, Ib }, 0 },
5028 },
5029
5030 /* PREFIX_VEX_0F73_REG_6 */
5031 {
5032 { Bad_Opcode },
5033 { Bad_Opcode },
5034 { "vpsllq", { Vex, XS, Ib }, 0 },
5035 },
5036
5037 /* PREFIX_VEX_0F73_REG_7 */
5038 {
5039 { Bad_Opcode },
5040 { Bad_Opcode },
5041 { "vpslldq", { Vex, XS, Ib }, 0 },
5042 },
5043
5044 /* PREFIX_VEX_0F74 */
5045 {
5046 { Bad_Opcode },
5047 { Bad_Opcode },
5048 { "vpcmpeqb", { XM, Vex, EXx }, 0 },
5049 },
5050
5051 /* PREFIX_VEX_0F75 */
5052 {
5053 { Bad_Opcode },
5054 { Bad_Opcode },
5055 { "vpcmpeqw", { XM, Vex, EXx }, 0 },
5056 },
5057
5058 /* PREFIX_VEX_0F76 */
5059 {
5060 { Bad_Opcode },
5061 { Bad_Opcode },
5062 { "vpcmpeqd", { XM, Vex, EXx }, 0 },
5063 },
5064
5065 /* PREFIX_VEX_0F77 */
5066 {
5067 { VEX_LEN_TABLE (VEX_LEN_0F77_P_0) },
5068 },
5069
5070 /* PREFIX_VEX_0F7C */
5071 {
5072 { Bad_Opcode },
5073 { Bad_Opcode },
5074 { "vhaddpd", { XM, Vex, EXx }, 0 },
5075 { "vhaddps", { XM, Vex, EXx }, 0 },
5076 },
5077
5078 /* PREFIX_VEX_0F7D */
5079 {
5080 { Bad_Opcode },
5081 { Bad_Opcode },
5082 { "vhsubpd", { XM, Vex, EXx }, 0 },
5083 { "vhsubps", { XM, Vex, EXx }, 0 },
5084 },
5085
5086 /* PREFIX_VEX_0F7E */
5087 {
5088 { Bad_Opcode },
5089 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_1) },
5090 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_2) },
5091 },
5092
5093 /* PREFIX_VEX_0F7F */
5094 {
5095 { Bad_Opcode },
5096 { "vmovdqu", { EXxS, XM }, 0 },
5097 { "vmovdqa", { EXxS, XM }, 0 },
5098 },
5099
5100 /* PREFIX_VEX_0F90 */
5101 {
5102 { VEX_LEN_TABLE (VEX_LEN_0F90_P_0) },
5103 { Bad_Opcode },
5104 { VEX_LEN_TABLE (VEX_LEN_0F90_P_2) },
5105 },
5106
5107 /* PREFIX_VEX_0F91 */
5108 {
5109 { VEX_LEN_TABLE (VEX_LEN_0F91_P_0) },
5110 { Bad_Opcode },
5111 { VEX_LEN_TABLE (VEX_LEN_0F91_P_2) },
5112 },
5113
5114 /* PREFIX_VEX_0F92 */
5115 {
5116 { VEX_LEN_TABLE (VEX_LEN_0F92_P_0) },
5117 { Bad_Opcode },
5118 { VEX_LEN_TABLE (VEX_LEN_0F92_P_2) },
5119 { VEX_LEN_TABLE (VEX_LEN_0F92_P_3) },
5120 },
5121
5122 /* PREFIX_VEX_0F93 */
5123 {
5124 { VEX_LEN_TABLE (VEX_LEN_0F93_P_0) },
5125 { Bad_Opcode },
5126 { VEX_LEN_TABLE (VEX_LEN_0F93_P_2) },
5127 { VEX_LEN_TABLE (VEX_LEN_0F93_P_3) },
5128 },
5129
5130 /* PREFIX_VEX_0F98 */
5131 {
5132 { VEX_LEN_TABLE (VEX_LEN_0F98_P_0) },
5133 { Bad_Opcode },
5134 { VEX_LEN_TABLE (VEX_LEN_0F98_P_2) },
5135 },
5136
5137 /* PREFIX_VEX_0F99 */
5138 {
5139 { VEX_LEN_TABLE (VEX_LEN_0F99_P_0) },
5140 { Bad_Opcode },
5141 { VEX_LEN_TABLE (VEX_LEN_0F99_P_2) },
5142 },
5143
5144 /* PREFIX_VEX_0FC2 */
5145 {
5146 { "vcmpps", { XM, Vex, EXx, VCMP }, 0 },
5147 { "vcmpss", { XMScalar, VexScalar, EXdScalar, VCMP }, 0 },
5148 { "vcmppd", { XM, Vex, EXx, VCMP }, 0 },
5149 { "vcmpsd", { XMScalar, VexScalar, EXqScalar, VCMP }, 0 },
5150 },
5151
5152 /* PREFIX_VEX_0FC4 */
5153 {
5154 { Bad_Opcode },
5155 { Bad_Opcode },
5156 { VEX_LEN_TABLE (VEX_LEN_0FC4_P_2) },
5157 },
5158
5159 /* PREFIX_VEX_0FC5 */
5160 {
5161 { Bad_Opcode },
5162 { Bad_Opcode },
5163 { VEX_LEN_TABLE (VEX_LEN_0FC5_P_2) },
5164 },
5165
5166 /* PREFIX_VEX_0FD0 */
5167 {
5168 { Bad_Opcode },
5169 { Bad_Opcode },
5170 { "vaddsubpd", { XM, Vex, EXx }, 0 },
5171 { "vaddsubps", { XM, Vex, EXx }, 0 },
5172 },
5173
5174 /* PREFIX_VEX_0FD1 */
5175 {
5176 { Bad_Opcode },
5177 { Bad_Opcode },
5178 { "vpsrlw", { XM, Vex, EXxmm }, 0 },
5179 },
5180
5181 /* PREFIX_VEX_0FD2 */
5182 {
5183 { Bad_Opcode },
5184 { Bad_Opcode },
5185 { "vpsrld", { XM, Vex, EXxmm }, 0 },
5186 },
5187
5188 /* PREFIX_VEX_0FD3 */
5189 {
5190 { Bad_Opcode },
5191 { Bad_Opcode },
5192 { "vpsrlq", { XM, Vex, EXxmm }, 0 },
5193 },
5194
5195 /* PREFIX_VEX_0FD4 */
5196 {
5197 { Bad_Opcode },
5198 { Bad_Opcode },
5199 { "vpaddq", { XM, Vex, EXx }, 0 },
5200 },
5201
5202 /* PREFIX_VEX_0FD5 */
5203 {
5204 { Bad_Opcode },
5205 { Bad_Opcode },
5206 { "vpmullw", { XM, Vex, EXx }, 0 },
5207 },
5208
5209 /* PREFIX_VEX_0FD6 */
5210 {
5211 { Bad_Opcode },
5212 { Bad_Opcode },
5213 { VEX_LEN_TABLE (VEX_LEN_0FD6_P_2) },
5214 },
5215
5216 /* PREFIX_VEX_0FD7 */
5217 {
5218 { Bad_Opcode },
5219 { Bad_Opcode },
5220 { MOD_TABLE (MOD_VEX_0FD7_PREFIX_2) },
5221 },
5222
5223 /* PREFIX_VEX_0FD8 */
5224 {
5225 { Bad_Opcode },
5226 { Bad_Opcode },
5227 { "vpsubusb", { XM, Vex, EXx }, 0 },
5228 },
5229
5230 /* PREFIX_VEX_0FD9 */
5231 {
5232 { Bad_Opcode },
5233 { Bad_Opcode },
5234 { "vpsubusw", { XM, Vex, EXx }, 0 },
5235 },
5236
5237 /* PREFIX_VEX_0FDA */
5238 {
5239 { Bad_Opcode },
5240 { Bad_Opcode },
5241 { "vpminub", { XM, Vex, EXx }, 0 },
5242 },
5243
5244 /* PREFIX_VEX_0FDB */
5245 {
5246 { Bad_Opcode },
5247 { Bad_Opcode },
5248 { "vpand", { XM, Vex, EXx }, 0 },
5249 },
5250
5251 /* PREFIX_VEX_0FDC */
5252 {
5253 { Bad_Opcode },
5254 { Bad_Opcode },
5255 { "vpaddusb", { XM, Vex, EXx }, 0 },
5256 },
5257
5258 /* PREFIX_VEX_0FDD */
5259 {
5260 { Bad_Opcode },
5261 { Bad_Opcode },
5262 { "vpaddusw", { XM, Vex, EXx }, 0 },
5263 },
5264
5265 /* PREFIX_VEX_0FDE */
5266 {
5267 { Bad_Opcode },
5268 { Bad_Opcode },
5269 { "vpmaxub", { XM, Vex, EXx }, 0 },
5270 },
5271
5272 /* PREFIX_VEX_0FDF */
5273 {
5274 { Bad_Opcode },
5275 { Bad_Opcode },
5276 { "vpandn", { XM, Vex, EXx }, 0 },
5277 },
5278
5279 /* PREFIX_VEX_0FE0 */
5280 {
5281 { Bad_Opcode },
5282 { Bad_Opcode },
5283 { "vpavgb", { XM, Vex, EXx }, 0 },
5284 },
5285
5286 /* PREFIX_VEX_0FE1 */
5287 {
5288 { Bad_Opcode },
5289 { Bad_Opcode },
5290 { "vpsraw", { XM, Vex, EXxmm }, 0 },
5291 },
5292
5293 /* PREFIX_VEX_0FE2 */
5294 {
5295 { Bad_Opcode },
5296 { Bad_Opcode },
5297 { "vpsrad", { XM, Vex, EXxmm }, 0 },
5298 },
5299
5300 /* PREFIX_VEX_0FE3 */
5301 {
5302 { Bad_Opcode },
5303 { Bad_Opcode },
5304 { "vpavgw", { XM, Vex, EXx }, 0 },
5305 },
5306
5307 /* PREFIX_VEX_0FE4 */
5308 {
5309 { Bad_Opcode },
5310 { Bad_Opcode },
5311 { "vpmulhuw", { XM, Vex, EXx }, 0 },
5312 },
5313
5314 /* PREFIX_VEX_0FE5 */
5315 {
5316 { Bad_Opcode },
5317 { Bad_Opcode },
5318 { "vpmulhw", { XM, Vex, EXx }, 0 },
5319 },
5320
5321 /* PREFIX_VEX_0FE6 */
5322 {
5323 { Bad_Opcode },
5324 { "vcvtdq2pd", { XM, EXxmmq }, 0 },
5325 { "vcvttpd2dq%XY", { XMM, EXx }, 0 },
5326 { "vcvtpd2dq%XY", { XMM, EXx }, 0 },
5327 },
5328
5329 /* PREFIX_VEX_0FE7 */
5330 {
5331 { Bad_Opcode },
5332 { Bad_Opcode },
5333 { MOD_TABLE (MOD_VEX_0FE7_PREFIX_2) },
5334 },
5335
5336 /* PREFIX_VEX_0FE8 */
5337 {
5338 { Bad_Opcode },
5339 { Bad_Opcode },
5340 { "vpsubsb", { XM, Vex, EXx }, 0 },
5341 },
5342
5343 /* PREFIX_VEX_0FE9 */
5344 {
5345 { Bad_Opcode },
5346 { Bad_Opcode },
5347 { "vpsubsw", { XM, Vex, EXx }, 0 },
5348 },
5349
5350 /* PREFIX_VEX_0FEA */
5351 {
5352 { Bad_Opcode },
5353 { Bad_Opcode },
5354 { "vpminsw", { XM, Vex, EXx }, 0 },
5355 },
5356
5357 /* PREFIX_VEX_0FEB */
5358 {
5359 { Bad_Opcode },
5360 { Bad_Opcode },
5361 { "vpor", { XM, Vex, EXx }, 0 },
5362 },
5363
5364 /* PREFIX_VEX_0FEC */
5365 {
5366 { Bad_Opcode },
5367 { Bad_Opcode },
5368 { "vpaddsb", { XM, Vex, EXx }, 0 },
5369 },
5370
5371 /* PREFIX_VEX_0FED */
5372 {
5373 { Bad_Opcode },
5374 { Bad_Opcode },
5375 { "vpaddsw", { XM, Vex, EXx }, 0 },
5376 },
5377
5378 /* PREFIX_VEX_0FEE */
5379 {
5380 { Bad_Opcode },
5381 { Bad_Opcode },
5382 { "vpmaxsw", { XM, Vex, EXx }, 0 },
5383 },
5384
5385 /* PREFIX_VEX_0FEF */
5386 {
5387 { Bad_Opcode },
5388 { Bad_Opcode },
5389 { "vpxor", { XM, Vex, EXx }, 0 },
5390 },
5391
5392 /* PREFIX_VEX_0FF0 */
5393 {
5394 { Bad_Opcode },
5395 { Bad_Opcode },
5396 { Bad_Opcode },
5397 { MOD_TABLE (MOD_VEX_0FF0_PREFIX_3) },
5398 },
5399
5400 /* PREFIX_VEX_0FF1 */
5401 {
5402 { Bad_Opcode },
5403 { Bad_Opcode },
5404 { "vpsllw", { XM, Vex, EXxmm }, 0 },
5405 },
5406
5407 /* PREFIX_VEX_0FF2 */
5408 {
5409 { Bad_Opcode },
5410 { Bad_Opcode },
5411 { "vpslld", { XM, Vex, EXxmm }, 0 },
5412 },
5413
5414 /* PREFIX_VEX_0FF3 */
5415 {
5416 { Bad_Opcode },
5417 { Bad_Opcode },
5418 { "vpsllq", { XM, Vex, EXxmm }, 0 },
5419 },
5420
5421 /* PREFIX_VEX_0FF4 */
5422 {
5423 { Bad_Opcode },
5424 { Bad_Opcode },
5425 { "vpmuludq", { XM, Vex, EXx }, 0 },
5426 },
5427
5428 /* PREFIX_VEX_0FF5 */
5429 {
5430 { Bad_Opcode },
5431 { Bad_Opcode },
5432 { "vpmaddwd", { XM, Vex, EXx }, 0 },
5433 },
5434
5435 /* PREFIX_VEX_0FF6 */
5436 {
5437 { Bad_Opcode },
5438 { Bad_Opcode },
5439 { "vpsadbw", { XM, Vex, EXx }, 0 },
5440 },
5441
5442 /* PREFIX_VEX_0FF7 */
5443 {
5444 { Bad_Opcode },
5445 { Bad_Opcode },
5446 { VEX_LEN_TABLE (VEX_LEN_0FF7_P_2) },
5447 },
5448
5449 /* PREFIX_VEX_0FF8 */
5450 {
5451 { Bad_Opcode },
5452 { Bad_Opcode },
5453 { "vpsubb", { XM, Vex, EXx }, 0 },
5454 },
5455
5456 /* PREFIX_VEX_0FF9 */
5457 {
5458 { Bad_Opcode },
5459 { Bad_Opcode },
5460 { "vpsubw", { XM, Vex, EXx }, 0 },
5461 },
5462
5463 /* PREFIX_VEX_0FFA */
5464 {
5465 { Bad_Opcode },
5466 { Bad_Opcode },
5467 { "vpsubd", { XM, Vex, EXx }, 0 },
5468 },
5469
5470 /* PREFIX_VEX_0FFB */
5471 {
5472 { Bad_Opcode },
5473 { Bad_Opcode },
5474 { "vpsubq", { XM, Vex, EXx }, 0 },
5475 },
5476
5477 /* PREFIX_VEX_0FFC */
5478 {
5479 { Bad_Opcode },
5480 { Bad_Opcode },
5481 { "vpaddb", { XM, Vex, EXx }, 0 },
5482 },
5483
5484 /* PREFIX_VEX_0FFD */
5485 {
5486 { Bad_Opcode },
5487 { Bad_Opcode },
5488 { "vpaddw", { XM, Vex, EXx }, 0 },
5489 },
5490
5491 /* PREFIX_VEX_0FFE */
5492 {
5493 { Bad_Opcode },
5494 { Bad_Opcode },
5495 { "vpaddd", { XM, Vex, EXx }, 0 },
5496 },
5497
5498 /* PREFIX_VEX_0F3800 */
5499 {
5500 { Bad_Opcode },
5501 { Bad_Opcode },
5502 { "vpshufb", { XM, Vex, EXx }, 0 },
5503 },
5504
5505 /* PREFIX_VEX_0F3801 */
5506 {
5507 { Bad_Opcode },
5508 { Bad_Opcode },
5509 { "vphaddw", { XM, Vex, EXx }, 0 },
5510 },
5511
5512 /* PREFIX_VEX_0F3802 */
5513 {
5514 { Bad_Opcode },
5515 { Bad_Opcode },
5516 { "vphaddd", { XM, Vex, EXx }, 0 },
5517 },
5518
5519 /* PREFIX_VEX_0F3803 */
5520 {
5521 { Bad_Opcode },
5522 { Bad_Opcode },
5523 { "vphaddsw", { XM, Vex, EXx }, 0 },
5524 },
5525
5526 /* PREFIX_VEX_0F3804 */
5527 {
5528 { Bad_Opcode },
5529 { Bad_Opcode },
5530 { "vpmaddubsw", { XM, Vex, EXx }, 0 },
5531 },
5532
5533 /* PREFIX_VEX_0F3805 */
5534 {
5535 { Bad_Opcode },
5536 { Bad_Opcode },
5537 { "vphsubw", { XM, Vex, EXx }, 0 },
5538 },
5539
5540 /* PREFIX_VEX_0F3806 */
5541 {
5542 { Bad_Opcode },
5543 { Bad_Opcode },
5544 { "vphsubd", { XM, Vex, EXx }, 0 },
5545 },
5546
5547 /* PREFIX_VEX_0F3807 */
5548 {
5549 { Bad_Opcode },
5550 { Bad_Opcode },
5551 { "vphsubsw", { XM, Vex, EXx }, 0 },
5552 },
5553
5554 /* PREFIX_VEX_0F3808 */
5555 {
5556 { Bad_Opcode },
5557 { Bad_Opcode },
5558 { "vpsignb", { XM, Vex, EXx }, 0 },
5559 },
5560
5561 /* PREFIX_VEX_0F3809 */
5562 {
5563 { Bad_Opcode },
5564 { Bad_Opcode },
5565 { "vpsignw", { XM, Vex, EXx }, 0 },
5566 },
5567
5568 /* PREFIX_VEX_0F380A */
5569 {
5570 { Bad_Opcode },
5571 { Bad_Opcode },
5572 { "vpsignd", { XM, Vex, EXx }, 0 },
5573 },
5574
5575 /* PREFIX_VEX_0F380B */
5576 {
5577 { Bad_Opcode },
5578 { Bad_Opcode },
5579 { "vpmulhrsw", { XM, Vex, EXx }, 0 },
5580 },
5581
5582 /* PREFIX_VEX_0F380C */
5583 {
5584 { Bad_Opcode },
5585 { Bad_Opcode },
5586 { VEX_W_TABLE (VEX_W_0F380C_P_2) },
5587 },
5588
5589 /* PREFIX_VEX_0F380D */
5590 {
5591 { Bad_Opcode },
5592 { Bad_Opcode },
5593 { VEX_W_TABLE (VEX_W_0F380D_P_2) },
5594 },
5595
5596 /* PREFIX_VEX_0F380E */
5597 {
5598 { Bad_Opcode },
5599 { Bad_Opcode },
5600 { VEX_W_TABLE (VEX_W_0F380E_P_2) },
5601 },
5602
5603 /* PREFIX_VEX_0F380F */
5604 {
5605 { Bad_Opcode },
5606 { Bad_Opcode },
5607 { VEX_W_TABLE (VEX_W_0F380F_P_2) },
5608 },
5609
5610 /* PREFIX_VEX_0F3813 */
5611 {
5612 { Bad_Opcode },
5613 { Bad_Opcode },
5614 { "vcvtph2ps", { XM, EXxmmq }, 0 },
5615 },
5616
5617 /* PREFIX_VEX_0F3816 */
5618 {
5619 { Bad_Opcode },
5620 { Bad_Opcode },
5621 { VEX_LEN_TABLE (VEX_LEN_0F3816_P_2) },
5622 },
5623
5624 /* PREFIX_VEX_0F3817 */
5625 {
5626 { Bad_Opcode },
5627 { Bad_Opcode },
5628 { "vptest", { XM, EXx }, 0 },
5629 },
5630
5631 /* PREFIX_VEX_0F3818 */
5632 {
5633 { Bad_Opcode },
5634 { Bad_Opcode },
5635 { VEX_W_TABLE (VEX_W_0F3818_P_2) },
5636 },
5637
5638 /* PREFIX_VEX_0F3819 */
5639 {
5640 { Bad_Opcode },
5641 { Bad_Opcode },
5642 { VEX_LEN_TABLE (VEX_LEN_0F3819_P_2) },
5643 },
5644
5645 /* PREFIX_VEX_0F381A */
5646 {
5647 { Bad_Opcode },
5648 { Bad_Opcode },
5649 { MOD_TABLE (MOD_VEX_0F381A_PREFIX_2) },
5650 },
5651
5652 /* PREFIX_VEX_0F381C */
5653 {
5654 { Bad_Opcode },
5655 { Bad_Opcode },
5656 { "vpabsb", { XM, EXx }, 0 },
5657 },
5658
5659 /* PREFIX_VEX_0F381D */
5660 {
5661 { Bad_Opcode },
5662 { Bad_Opcode },
5663 { "vpabsw", { XM, EXx }, 0 },
5664 },
5665
5666 /* PREFIX_VEX_0F381E */
5667 {
5668 { Bad_Opcode },
5669 { Bad_Opcode },
5670 { "vpabsd", { XM, EXx }, 0 },
5671 },
5672
5673 /* PREFIX_VEX_0F3820 */
5674 {
5675 { Bad_Opcode },
5676 { Bad_Opcode },
5677 { "vpmovsxbw", { XM, EXxmmq }, 0 },
5678 },
5679
5680 /* PREFIX_VEX_0F3821 */
5681 {
5682 { Bad_Opcode },
5683 { Bad_Opcode },
5684 { "vpmovsxbd", { XM, EXxmmqd }, 0 },
5685 },
5686
5687 /* PREFIX_VEX_0F3822 */
5688 {
5689 { Bad_Opcode },
5690 { Bad_Opcode },
5691 { "vpmovsxbq", { XM, EXxmmdw }, 0 },
5692 },
5693
5694 /* PREFIX_VEX_0F3823 */
5695 {
5696 { Bad_Opcode },
5697 { Bad_Opcode },
5698 { "vpmovsxwd", { XM, EXxmmq }, 0 },
5699 },
5700
5701 /* PREFIX_VEX_0F3824 */
5702 {
5703 { Bad_Opcode },
5704 { Bad_Opcode },
5705 { "vpmovsxwq", { XM, EXxmmqd }, 0 },
5706 },
5707
5708 /* PREFIX_VEX_0F3825 */
5709 {
5710 { Bad_Opcode },
5711 { Bad_Opcode },
5712 { "vpmovsxdq", { XM, EXxmmq }, 0 },
5713 },
5714
5715 /* PREFIX_VEX_0F3828 */
5716 {
5717 { Bad_Opcode },
5718 { Bad_Opcode },
5719 { "vpmuldq", { XM, Vex, EXx }, 0 },
5720 },
5721
5722 /* PREFIX_VEX_0F3829 */
5723 {
5724 { Bad_Opcode },
5725 { Bad_Opcode },
5726 { "vpcmpeqq", { XM, Vex, EXx }, 0 },
5727 },
5728
5729 /* PREFIX_VEX_0F382A */
5730 {
5731 { Bad_Opcode },
5732 { Bad_Opcode },
5733 { MOD_TABLE (MOD_VEX_0F382A_PREFIX_2) },
5734 },
5735
5736 /* PREFIX_VEX_0F382B */
5737 {
5738 { Bad_Opcode },
5739 { Bad_Opcode },
5740 { "vpackusdw", { XM, Vex, EXx }, 0 },
5741 },
5742
5743 /* PREFIX_VEX_0F382C */
5744 {
5745 { Bad_Opcode },
5746 { Bad_Opcode },
5747 { MOD_TABLE (MOD_VEX_0F382C_PREFIX_2) },
5748 },
5749
5750 /* PREFIX_VEX_0F382D */
5751 {
5752 { Bad_Opcode },
5753 { Bad_Opcode },
5754 { MOD_TABLE (MOD_VEX_0F382D_PREFIX_2) },
5755 },
5756
5757 /* PREFIX_VEX_0F382E */
5758 {
5759 { Bad_Opcode },
5760 { Bad_Opcode },
5761 { MOD_TABLE (MOD_VEX_0F382E_PREFIX_2) },
5762 },
5763
5764 /* PREFIX_VEX_0F382F */
5765 {
5766 { Bad_Opcode },
5767 { Bad_Opcode },
5768 { MOD_TABLE (MOD_VEX_0F382F_PREFIX_2) },
5769 },
5770
5771 /* PREFIX_VEX_0F3830 */
5772 {
5773 { Bad_Opcode },
5774 { Bad_Opcode },
5775 { "vpmovzxbw", { XM, EXxmmq }, 0 },
5776 },
5777
5778 /* PREFIX_VEX_0F3831 */
5779 {
5780 { Bad_Opcode },
5781 { Bad_Opcode },
5782 { "vpmovzxbd", { XM, EXxmmqd }, 0 },
5783 },
5784
5785 /* PREFIX_VEX_0F3832 */
5786 {
5787 { Bad_Opcode },
5788 { Bad_Opcode },
5789 { "vpmovzxbq", { XM, EXxmmdw }, 0 },
5790 },
5791
5792 /* PREFIX_VEX_0F3833 */
5793 {
5794 { Bad_Opcode },
5795 { Bad_Opcode },
5796 { "vpmovzxwd", { XM, EXxmmq }, 0 },
5797 },
5798
5799 /* PREFIX_VEX_0F3834 */
5800 {
5801 { Bad_Opcode },
5802 { Bad_Opcode },
5803 { "vpmovzxwq", { XM, EXxmmqd }, 0 },
5804 },
5805
5806 /* PREFIX_VEX_0F3835 */
5807 {
5808 { Bad_Opcode },
5809 { Bad_Opcode },
5810 { "vpmovzxdq", { XM, EXxmmq }, 0 },
5811 },
5812
5813 /* PREFIX_VEX_0F3836 */
5814 {
5815 { Bad_Opcode },
5816 { Bad_Opcode },
5817 { VEX_LEN_TABLE (VEX_LEN_0F3836_P_2) },
5818 },
5819
5820 /* PREFIX_VEX_0F3837 */
5821 {
5822 { Bad_Opcode },
5823 { Bad_Opcode },
5824 { "vpcmpgtq", { XM, Vex, EXx }, 0 },
5825 },
5826
5827 /* PREFIX_VEX_0F3838 */
5828 {
5829 { Bad_Opcode },
5830 { Bad_Opcode },
5831 { "vpminsb", { XM, Vex, EXx }, 0 },
5832 },
5833
5834 /* PREFIX_VEX_0F3839 */
5835 {
5836 { Bad_Opcode },
5837 { Bad_Opcode },
5838 { "vpminsd", { XM, Vex, EXx }, 0 },
5839 },
5840
5841 /* PREFIX_VEX_0F383A */
5842 {
5843 { Bad_Opcode },
5844 { Bad_Opcode },
5845 { "vpminuw", { XM, Vex, EXx }, 0 },
5846 },
5847
5848 /* PREFIX_VEX_0F383B */
5849 {
5850 { Bad_Opcode },
5851 { Bad_Opcode },
5852 { "vpminud", { XM, Vex, EXx }, 0 },
5853 },
5854
5855 /* PREFIX_VEX_0F383C */
5856 {
5857 { Bad_Opcode },
5858 { Bad_Opcode },
5859 { "vpmaxsb", { XM, Vex, EXx }, 0 },
5860 },
5861
5862 /* PREFIX_VEX_0F383D */
5863 {
5864 { Bad_Opcode },
5865 { Bad_Opcode },
5866 { "vpmaxsd", { XM, Vex, EXx }, 0 },
5867 },
5868
5869 /* PREFIX_VEX_0F383E */
5870 {
5871 { Bad_Opcode },
5872 { Bad_Opcode },
5873 { "vpmaxuw", { XM, Vex, EXx }, 0 },
5874 },
5875
5876 /* PREFIX_VEX_0F383F */
5877 {
5878 { Bad_Opcode },
5879 { Bad_Opcode },
5880 { "vpmaxud", { XM, Vex, EXx }, 0 },
5881 },
5882
5883 /* PREFIX_VEX_0F3840 */
5884 {
5885 { Bad_Opcode },
5886 { Bad_Opcode },
5887 { "vpmulld", { XM, Vex, EXx }, 0 },
5888 },
5889
5890 /* PREFIX_VEX_0F3841 */
5891 {
5892 { Bad_Opcode },
5893 { Bad_Opcode },
5894 { VEX_LEN_TABLE (VEX_LEN_0F3841_P_2) },
5895 },
5896
5897 /* PREFIX_VEX_0F3845 */
5898 {
5899 { Bad_Opcode },
5900 { Bad_Opcode },
5901 { "vpsrlv%LW", { XM, Vex, EXx }, 0 },
5902 },
5903
5904 /* PREFIX_VEX_0F3846 */
5905 {
5906 { Bad_Opcode },
5907 { Bad_Opcode },
5908 { VEX_W_TABLE (VEX_W_0F3846_P_2) },
5909 },
5910
5911 /* PREFIX_VEX_0F3847 */
5912 {
5913 { Bad_Opcode },
5914 { Bad_Opcode },
5915 { "vpsllv%LW", { XM, Vex, EXx }, 0 },
5916 },
5917
5918 /* PREFIX_VEX_0F3858 */
5919 {
5920 { Bad_Opcode },
5921 { Bad_Opcode },
5922 { VEX_W_TABLE (VEX_W_0F3858_P_2) },
5923 },
5924
5925 /* PREFIX_VEX_0F3859 */
5926 {
5927 { Bad_Opcode },
5928 { Bad_Opcode },
5929 { VEX_W_TABLE (VEX_W_0F3859_P_2) },
5930 },
5931
5932 /* PREFIX_VEX_0F385A */
5933 {
5934 { Bad_Opcode },
5935 { Bad_Opcode },
5936 { MOD_TABLE (MOD_VEX_0F385A_PREFIX_2) },
5937 },
5938
5939 /* PREFIX_VEX_0F3878 */
5940 {
5941 { Bad_Opcode },
5942 { Bad_Opcode },
5943 { VEX_W_TABLE (VEX_W_0F3878_P_2) },
5944 },
5945
5946 /* PREFIX_VEX_0F3879 */
5947 {
5948 { Bad_Opcode },
5949 { Bad_Opcode },
5950 { VEX_W_TABLE (VEX_W_0F3879_P_2) },
5951 },
5952
5953 /* PREFIX_VEX_0F388C */
5954 {
5955 { Bad_Opcode },
5956 { Bad_Opcode },
5957 { MOD_TABLE (MOD_VEX_0F388C_PREFIX_2) },
5958 },
5959
5960 /* PREFIX_VEX_0F388E */
5961 {
5962 { Bad_Opcode },
5963 { Bad_Opcode },
5964 { MOD_TABLE (MOD_VEX_0F388E_PREFIX_2) },
5965 },
5966
5967 /* PREFIX_VEX_0F3890 */
5968 {
5969 { Bad_Opcode },
5970 { Bad_Opcode },
5971 { "vpgatherd%LW", { XM, MVexVSIBDWpX, Vex }, 0 },
5972 },
5973
5974 /* PREFIX_VEX_0F3891 */
5975 {
5976 { Bad_Opcode },
5977 { Bad_Opcode },
5978 { "vpgatherq%LW", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, 0 },
5979 },
5980
5981 /* PREFIX_VEX_0F3892 */
5982 {
5983 { Bad_Opcode },
5984 { Bad_Opcode },
5985 { "vgatherdp%XW", { XM, MVexVSIBDWpX, Vex }, 0 },
5986 },
5987
5988 /* PREFIX_VEX_0F3893 */
5989 {
5990 { Bad_Opcode },
5991 { Bad_Opcode },
5992 { "vgatherqp%XW", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, 0 },
5993 },
5994
5995 /* PREFIX_VEX_0F3896 */
5996 {
5997 { Bad_Opcode },
5998 { Bad_Opcode },
5999 { "vfmaddsub132p%XW", { XM, Vex, EXx }, 0 },
6000 },
6001
6002 /* PREFIX_VEX_0F3897 */
6003 {
6004 { Bad_Opcode },
6005 { Bad_Opcode },
6006 { "vfmsubadd132p%XW", { XM, Vex, EXx }, 0 },
6007 },
6008
6009 /* PREFIX_VEX_0F3898 */
6010 {
6011 { Bad_Opcode },
6012 { Bad_Opcode },
6013 { "vfmadd132p%XW", { XM, Vex, EXx }, 0 },
6014 },
6015
6016 /* PREFIX_VEX_0F3899 */
6017 {
6018 { Bad_Opcode },
6019 { Bad_Opcode },
6020 { "vfmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6021 },
6022
6023 /* PREFIX_VEX_0F389A */
6024 {
6025 { Bad_Opcode },
6026 { Bad_Opcode },
6027 { "vfmsub132p%XW", { XM, Vex, EXx }, 0 },
6028 },
6029
6030 /* PREFIX_VEX_0F389B */
6031 {
6032 { Bad_Opcode },
6033 { Bad_Opcode },
6034 { "vfmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6035 },
6036
6037 /* PREFIX_VEX_0F389C */
6038 {
6039 { Bad_Opcode },
6040 { Bad_Opcode },
6041 { "vfnmadd132p%XW", { XM, Vex, EXx }, 0 },
6042 },
6043
6044 /* PREFIX_VEX_0F389D */
6045 {
6046 { Bad_Opcode },
6047 { Bad_Opcode },
6048 { "vfnmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6049 },
6050
6051 /* PREFIX_VEX_0F389E */
6052 {
6053 { Bad_Opcode },
6054 { Bad_Opcode },
6055 { "vfnmsub132p%XW", { XM, Vex, EXx }, 0 },
6056 },
6057
6058 /* PREFIX_VEX_0F389F */
6059 {
6060 { Bad_Opcode },
6061 { Bad_Opcode },
6062 { "vfnmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6063 },
6064
6065 /* PREFIX_VEX_0F38A6 */
6066 {
6067 { Bad_Opcode },
6068 { Bad_Opcode },
6069 { "vfmaddsub213p%XW", { XM, Vex, EXx }, 0 },
6070 { Bad_Opcode },
6071 },
6072
6073 /* PREFIX_VEX_0F38A7 */
6074 {
6075 { Bad_Opcode },
6076 { Bad_Opcode },
6077 { "vfmsubadd213p%XW", { XM, Vex, EXx }, 0 },
6078 },
6079
6080 /* PREFIX_VEX_0F38A8 */
6081 {
6082 { Bad_Opcode },
6083 { Bad_Opcode },
6084 { "vfmadd213p%XW", { XM, Vex, EXx }, 0 },
6085 },
6086
6087 /* PREFIX_VEX_0F38A9 */
6088 {
6089 { Bad_Opcode },
6090 { Bad_Opcode },
6091 { "vfmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6092 },
6093
6094 /* PREFIX_VEX_0F38AA */
6095 {
6096 { Bad_Opcode },
6097 { Bad_Opcode },
6098 { "vfmsub213p%XW", { XM, Vex, EXx }, 0 },
6099 },
6100
6101 /* PREFIX_VEX_0F38AB */
6102 {
6103 { Bad_Opcode },
6104 { Bad_Opcode },
6105 { "vfmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6106 },
6107
6108 /* PREFIX_VEX_0F38AC */
6109 {
6110 { Bad_Opcode },
6111 { Bad_Opcode },
6112 { "vfnmadd213p%XW", { XM, Vex, EXx }, 0 },
6113 },
6114
6115 /* PREFIX_VEX_0F38AD */
6116 {
6117 { Bad_Opcode },
6118 { Bad_Opcode },
6119 { "vfnmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6120 },
6121
6122 /* PREFIX_VEX_0F38AE */
6123 {
6124 { Bad_Opcode },
6125 { Bad_Opcode },
6126 { "vfnmsub213p%XW", { XM, Vex, EXx }, 0 },
6127 },
6128
6129 /* PREFIX_VEX_0F38AF */
6130 {
6131 { Bad_Opcode },
6132 { Bad_Opcode },
6133 { "vfnmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6134 },
6135
6136 /* PREFIX_VEX_0F38B6 */
6137 {
6138 { Bad_Opcode },
6139 { Bad_Opcode },
6140 { "vfmaddsub231p%XW", { XM, Vex, EXx }, 0 },
6141 },
6142
6143 /* PREFIX_VEX_0F38B7 */
6144 {
6145 { Bad_Opcode },
6146 { Bad_Opcode },
6147 { "vfmsubadd231p%XW", { XM, Vex, EXx }, 0 },
6148 },
6149
6150 /* PREFIX_VEX_0F38B8 */
6151 {
6152 { Bad_Opcode },
6153 { Bad_Opcode },
6154 { "vfmadd231p%XW", { XM, Vex, EXx }, 0 },
6155 },
6156
6157 /* PREFIX_VEX_0F38B9 */
6158 {
6159 { Bad_Opcode },
6160 { Bad_Opcode },
6161 { "vfmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6162 },
6163
6164 /* PREFIX_VEX_0F38BA */
6165 {
6166 { Bad_Opcode },
6167 { Bad_Opcode },
6168 { "vfmsub231p%XW", { XM, Vex, EXx }, 0 },
6169 },
6170
6171 /* PREFIX_VEX_0F38BB */
6172 {
6173 { Bad_Opcode },
6174 { Bad_Opcode },
6175 { "vfmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6176 },
6177
6178 /* PREFIX_VEX_0F38BC */
6179 {
6180 { Bad_Opcode },
6181 { Bad_Opcode },
6182 { "vfnmadd231p%XW", { XM, Vex, EXx }, 0 },
6183 },
6184
6185 /* PREFIX_VEX_0F38BD */
6186 {
6187 { Bad_Opcode },
6188 { Bad_Opcode },
6189 { "vfnmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6190 },
6191
6192 /* PREFIX_VEX_0F38BE */
6193 {
6194 { Bad_Opcode },
6195 { Bad_Opcode },
6196 { "vfnmsub231p%XW", { XM, Vex, EXx }, 0 },
6197 },
6198
6199 /* PREFIX_VEX_0F38BF */
6200 {
6201 { Bad_Opcode },
6202 { Bad_Opcode },
6203 { "vfnmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6204 },
6205
6206 /* PREFIX_VEX_0F38CF */
6207 {
6208 { Bad_Opcode },
6209 { Bad_Opcode },
6210 { VEX_W_TABLE (VEX_W_0F38CF_P_2) },
6211 },
6212
6213 /* PREFIX_VEX_0F38DB */
6214 {
6215 { Bad_Opcode },
6216 { Bad_Opcode },
6217 { VEX_LEN_TABLE (VEX_LEN_0F38DB_P_2) },
6218 },
6219
6220 /* PREFIX_VEX_0F38DC */
6221 {
6222 { Bad_Opcode },
6223 { Bad_Opcode },
6224 { "vaesenc", { XM, Vex, EXx }, 0 },
6225 },
6226
6227 /* PREFIX_VEX_0F38DD */
6228 {
6229 { Bad_Opcode },
6230 { Bad_Opcode },
6231 { "vaesenclast", { XM, Vex, EXx }, 0 },
6232 },
6233
6234 /* PREFIX_VEX_0F38DE */
6235 {
6236 { Bad_Opcode },
6237 { Bad_Opcode },
6238 { "vaesdec", { XM, Vex, EXx }, 0 },
6239 },
6240
6241 /* PREFIX_VEX_0F38DF */
6242 {
6243 { Bad_Opcode },
6244 { Bad_Opcode },
6245 { "vaesdeclast", { XM, Vex, EXx }, 0 },
6246 },
6247
6248 /* PREFIX_VEX_0F38F2 */
6249 {
6250 { VEX_LEN_TABLE (VEX_LEN_0F38F2_P_0) },
6251 },
6252
6253 /* PREFIX_VEX_0F38F3_REG_1 */
6254 {
6255 { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_1_P_0) },
6256 },
6257
6258 /* PREFIX_VEX_0F38F3_REG_2 */
6259 {
6260 { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_2_P_0) },
6261 },
6262
6263 /* PREFIX_VEX_0F38F3_REG_3 */
6264 {
6265 { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_3_P_0) },
6266 },
6267
6268 /* PREFIX_VEX_0F38F5 */
6269 {
6270 { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_0) },
6271 { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_1) },
6272 { Bad_Opcode },
6273 { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_3) },
6274 },
6275
6276 /* PREFIX_VEX_0F38F6 */
6277 {
6278 { Bad_Opcode },
6279 { Bad_Opcode },
6280 { Bad_Opcode },
6281 { VEX_LEN_TABLE (VEX_LEN_0F38F6_P_3) },
6282 },
6283
6284 /* PREFIX_VEX_0F38F7 */
6285 {
6286 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_0) },
6287 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_1) },
6288 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_2) },
6289 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_3) },
6290 },
6291
6292 /* PREFIX_VEX_0F3A00 */
6293 {
6294 { Bad_Opcode },
6295 { Bad_Opcode },
6296 { VEX_LEN_TABLE (VEX_LEN_0F3A00_P_2) },
6297 },
6298
6299 /* PREFIX_VEX_0F3A01 */
6300 {
6301 { Bad_Opcode },
6302 { Bad_Opcode },
6303 { VEX_LEN_TABLE (VEX_LEN_0F3A01_P_2) },
6304 },
6305
6306 /* PREFIX_VEX_0F3A02 */
6307 {
6308 { Bad_Opcode },
6309 { Bad_Opcode },
6310 { VEX_W_TABLE (VEX_W_0F3A02_P_2) },
6311 },
6312
6313 /* PREFIX_VEX_0F3A04 */
6314 {
6315 { Bad_Opcode },
6316 { Bad_Opcode },
6317 { VEX_W_TABLE (VEX_W_0F3A04_P_2) },
6318 },
6319
6320 /* PREFIX_VEX_0F3A05 */
6321 {
6322 { Bad_Opcode },
6323 { Bad_Opcode },
6324 { VEX_W_TABLE (VEX_W_0F3A05_P_2) },
6325 },
6326
6327 /* PREFIX_VEX_0F3A06 */
6328 {
6329 { Bad_Opcode },
6330 { Bad_Opcode },
6331 { VEX_LEN_TABLE (VEX_LEN_0F3A06_P_2) },
6332 },
6333
6334 /* PREFIX_VEX_0F3A08 */
6335 {
6336 { Bad_Opcode },
6337 { Bad_Opcode },
6338 { "vroundps", { XM, EXx, Ib }, 0 },
6339 },
6340
6341 /* PREFIX_VEX_0F3A09 */
6342 {
6343 { Bad_Opcode },
6344 { Bad_Opcode },
6345 { "vroundpd", { XM, EXx, Ib }, 0 },
6346 },
6347
6348 /* PREFIX_VEX_0F3A0A */
6349 {
6350 { Bad_Opcode },
6351 { Bad_Opcode },
6352 { "vroundss", { XMScalar, VexScalar, EXdScalar, Ib }, 0 },
6353 },
6354
6355 /* PREFIX_VEX_0F3A0B */
6356 {
6357 { Bad_Opcode },
6358 { Bad_Opcode },
6359 { "vroundsd", { XMScalar, VexScalar, EXqScalar, Ib }, 0 },
6360 },
6361
6362 /* PREFIX_VEX_0F3A0C */
6363 {
6364 { Bad_Opcode },
6365 { Bad_Opcode },
6366 { "vblendps", { XM, Vex, EXx, Ib }, 0 },
6367 },
6368
6369 /* PREFIX_VEX_0F3A0D */
6370 {
6371 { Bad_Opcode },
6372 { Bad_Opcode },
6373 { "vblendpd", { XM, Vex, EXx, Ib }, 0 },
6374 },
6375
6376 /* PREFIX_VEX_0F3A0E */
6377 {
6378 { Bad_Opcode },
6379 { Bad_Opcode },
6380 { "vpblendw", { XM, Vex, EXx, Ib }, 0 },
6381 },
6382
6383 /* PREFIX_VEX_0F3A0F */
6384 {
6385 { Bad_Opcode },
6386 { Bad_Opcode },
6387 { "vpalignr", { XM, Vex, EXx, Ib }, 0 },
6388 },
6389
6390 /* PREFIX_VEX_0F3A14 */
6391 {
6392 { Bad_Opcode },
6393 { Bad_Opcode },
6394 { VEX_LEN_TABLE (VEX_LEN_0F3A14_P_2) },
6395 },
6396
6397 /* PREFIX_VEX_0F3A15 */
6398 {
6399 { Bad_Opcode },
6400 { Bad_Opcode },
6401 { VEX_LEN_TABLE (VEX_LEN_0F3A15_P_2) },
6402 },
6403
6404 /* PREFIX_VEX_0F3A16 */
6405 {
6406 { Bad_Opcode },
6407 { Bad_Opcode },
6408 { VEX_LEN_TABLE (VEX_LEN_0F3A16_P_2) },
6409 },
6410
6411 /* PREFIX_VEX_0F3A17 */
6412 {
6413 { Bad_Opcode },
6414 { Bad_Opcode },
6415 { VEX_LEN_TABLE (VEX_LEN_0F3A17_P_2) },
6416 },
6417
6418 /* PREFIX_VEX_0F3A18 */
6419 {
6420 { Bad_Opcode },
6421 { Bad_Opcode },
6422 { VEX_LEN_TABLE (VEX_LEN_0F3A18_P_2) },
6423 },
6424
6425 /* PREFIX_VEX_0F3A19 */
6426 {
6427 { Bad_Opcode },
6428 { Bad_Opcode },
6429 { VEX_LEN_TABLE (VEX_LEN_0F3A19_P_2) },
6430 },
6431
6432 /* PREFIX_VEX_0F3A1D */
6433 {
6434 { Bad_Opcode },
6435 { Bad_Opcode },
6436 { "vcvtps2ph", { EXxmmq, XM, Ib }, 0 },
6437 },
6438
6439 /* PREFIX_VEX_0F3A20 */
6440 {
6441 { Bad_Opcode },
6442 { Bad_Opcode },
6443 { VEX_LEN_TABLE (VEX_LEN_0F3A20_P_2) },
6444 },
6445
6446 /* PREFIX_VEX_0F3A21 */
6447 {
6448 { Bad_Opcode },
6449 { Bad_Opcode },
6450 { VEX_LEN_TABLE (VEX_LEN_0F3A21_P_2) },
6451 },
6452
6453 /* PREFIX_VEX_0F3A22 */
6454 {
6455 { Bad_Opcode },
6456 { Bad_Opcode },
6457 { VEX_LEN_TABLE (VEX_LEN_0F3A22_P_2) },
6458 },
6459
6460 /* PREFIX_VEX_0F3A30 */
6461 {
6462 { Bad_Opcode },
6463 { Bad_Opcode },
6464 { VEX_LEN_TABLE (VEX_LEN_0F3A30_P_2) },
6465 },
6466
6467 /* PREFIX_VEX_0F3A31 */
6468 {
6469 { Bad_Opcode },
6470 { Bad_Opcode },
6471 { VEX_LEN_TABLE (VEX_LEN_0F3A31_P_2) },
6472 },
6473
6474 /* PREFIX_VEX_0F3A32 */
6475 {
6476 { Bad_Opcode },
6477 { Bad_Opcode },
6478 { VEX_LEN_TABLE (VEX_LEN_0F3A32_P_2) },
6479 },
6480
6481 /* PREFIX_VEX_0F3A33 */
6482 {
6483 { Bad_Opcode },
6484 { Bad_Opcode },
6485 { VEX_LEN_TABLE (VEX_LEN_0F3A33_P_2) },
6486 },
6487
6488 /* PREFIX_VEX_0F3A38 */
6489 {
6490 { Bad_Opcode },
6491 { Bad_Opcode },
6492 { VEX_LEN_TABLE (VEX_LEN_0F3A38_P_2) },
6493 },
6494
6495 /* PREFIX_VEX_0F3A39 */
6496 {
6497 { Bad_Opcode },
6498 { Bad_Opcode },
6499 { VEX_LEN_TABLE (VEX_LEN_0F3A39_P_2) },
6500 },
6501
6502 /* PREFIX_VEX_0F3A40 */
6503 {
6504 { Bad_Opcode },
6505 { Bad_Opcode },
6506 { "vdpps", { XM, Vex, EXx, Ib }, 0 },
6507 },
6508
6509 /* PREFIX_VEX_0F3A41 */
6510 {
6511 { Bad_Opcode },
6512 { Bad_Opcode },
6513 { VEX_LEN_TABLE (VEX_LEN_0F3A41_P_2) },
6514 },
6515
6516 /* PREFIX_VEX_0F3A42 */
6517 {
6518 { Bad_Opcode },
6519 { Bad_Opcode },
6520 { "vmpsadbw", { XM, Vex, EXx, Ib }, 0 },
6521 },
6522
6523 /* PREFIX_VEX_0F3A44 */
6524 {
6525 { Bad_Opcode },
6526 { Bad_Opcode },
6527 { "vpclmulqdq", { XM, Vex, EXx, PCLMUL }, 0 },
6528 },
6529
6530 /* PREFIX_VEX_0F3A46 */
6531 {
6532 { Bad_Opcode },
6533 { Bad_Opcode },
6534 { VEX_LEN_TABLE (VEX_LEN_0F3A46_P_2) },
6535 },
6536
6537 /* PREFIX_VEX_0F3A48 */
6538 {
6539 { Bad_Opcode },
6540 { Bad_Opcode },
6541 { VEX_W_TABLE (VEX_W_0F3A48_P_2) },
6542 },
6543
6544 /* PREFIX_VEX_0F3A49 */
6545 {
6546 { Bad_Opcode },
6547 { Bad_Opcode },
6548 { VEX_W_TABLE (VEX_W_0F3A49_P_2) },
6549 },
6550
6551 /* PREFIX_VEX_0F3A4A */
6552 {
6553 { Bad_Opcode },
6554 { Bad_Opcode },
6555 { VEX_W_TABLE (VEX_W_0F3A4A_P_2) },
6556 },
6557
6558 /* PREFIX_VEX_0F3A4B */
6559 {
6560 { Bad_Opcode },
6561 { Bad_Opcode },
6562 { VEX_W_TABLE (VEX_W_0F3A4B_P_2) },
6563 },
6564
6565 /* PREFIX_VEX_0F3A4C */
6566 {
6567 { Bad_Opcode },
6568 { Bad_Opcode },
6569 { VEX_W_TABLE (VEX_W_0F3A4C_P_2) },
6570 },
6571
6572 /* PREFIX_VEX_0F3A5C */
6573 {
6574 { Bad_Opcode },
6575 { Bad_Opcode },
6576 { "vfmaddsubps", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6577 },
6578
6579 /* PREFIX_VEX_0F3A5D */
6580 {
6581 { Bad_Opcode },
6582 { Bad_Opcode },
6583 { "vfmaddsubpd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6584 },
6585
6586 /* PREFIX_VEX_0F3A5E */
6587 {
6588 { Bad_Opcode },
6589 { Bad_Opcode },
6590 { "vfmsubaddps", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6591 },
6592
6593 /* PREFIX_VEX_0F3A5F */
6594 {
6595 { Bad_Opcode },
6596 { Bad_Opcode },
6597 { "vfmsubaddpd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6598 },
6599
6600 /* PREFIX_VEX_0F3A60 */
6601 {
6602 { Bad_Opcode },
6603 { Bad_Opcode },
6604 { VEX_LEN_TABLE (VEX_LEN_0F3A60_P_2) },
6605 { Bad_Opcode },
6606 },
6607
6608 /* PREFIX_VEX_0F3A61 */
6609 {
6610 { Bad_Opcode },
6611 { Bad_Opcode },
6612 { VEX_LEN_TABLE (VEX_LEN_0F3A61_P_2) },
6613 },
6614
6615 /* PREFIX_VEX_0F3A62 */
6616 {
6617 { Bad_Opcode },
6618 { Bad_Opcode },
6619 { VEX_LEN_TABLE (VEX_LEN_0F3A62_P_2) },
6620 },
6621
6622 /* PREFIX_VEX_0F3A63 */
6623 {
6624 { Bad_Opcode },
6625 { Bad_Opcode },
6626 { VEX_LEN_TABLE (VEX_LEN_0F3A63_P_2) },
6627 },
6628
6629 /* PREFIX_VEX_0F3A68 */
6630 {
6631 { Bad_Opcode },
6632 { Bad_Opcode },
6633 { "vfmaddps", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6634 },
6635
6636 /* PREFIX_VEX_0F3A69 */
6637 {
6638 { Bad_Opcode },
6639 { Bad_Opcode },
6640 { "vfmaddpd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6641 },
6642
6643 /* PREFIX_VEX_0F3A6A */
6644 {
6645 { Bad_Opcode },
6646 { Bad_Opcode },
6647 { VEX_LEN_TABLE (VEX_LEN_0F3A6A_P_2) },
6648 },
6649
6650 /* PREFIX_VEX_0F3A6B */
6651 {
6652 { Bad_Opcode },
6653 { Bad_Opcode },
6654 { VEX_LEN_TABLE (VEX_LEN_0F3A6B_P_2) },
6655 },
6656
6657 /* PREFIX_VEX_0F3A6C */
6658 {
6659 { Bad_Opcode },
6660 { Bad_Opcode },
6661 { "vfmsubps", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6662 },
6663
6664 /* PREFIX_VEX_0F3A6D */
6665 {
6666 { Bad_Opcode },
6667 { Bad_Opcode },
6668 { "vfmsubpd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6669 },
6670
6671 /* PREFIX_VEX_0F3A6E */
6672 {
6673 { Bad_Opcode },
6674 { Bad_Opcode },
6675 { VEX_LEN_TABLE (VEX_LEN_0F3A6E_P_2) },
6676 },
6677
6678 /* PREFIX_VEX_0F3A6F */
6679 {
6680 { Bad_Opcode },
6681 { Bad_Opcode },
6682 { VEX_LEN_TABLE (VEX_LEN_0F3A6F_P_2) },
6683 },
6684
6685 /* PREFIX_VEX_0F3A78 */
6686 {
6687 { Bad_Opcode },
6688 { Bad_Opcode },
6689 { "vfnmaddps", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6690 },
6691
6692 /* PREFIX_VEX_0F3A79 */
6693 {
6694 { Bad_Opcode },
6695 { Bad_Opcode },
6696 { "vfnmaddpd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6697 },
6698
6699 /* PREFIX_VEX_0F3A7A */
6700 {
6701 { Bad_Opcode },
6702 { Bad_Opcode },
6703 { VEX_LEN_TABLE (VEX_LEN_0F3A7A_P_2) },
6704 },
6705
6706 /* PREFIX_VEX_0F3A7B */
6707 {
6708 { Bad_Opcode },
6709 { Bad_Opcode },
6710 { VEX_LEN_TABLE (VEX_LEN_0F3A7B_P_2) },
6711 },
6712
6713 /* PREFIX_VEX_0F3A7C */
6714 {
6715 { Bad_Opcode },
6716 { Bad_Opcode },
6717 { "vfnmsubps", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6718 { Bad_Opcode },
6719 },
6720
6721 /* PREFIX_VEX_0F3A7D */
6722 {
6723 { Bad_Opcode },
6724 { Bad_Opcode },
6725 { "vfnmsubpd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6726 },
6727
6728 /* PREFIX_VEX_0F3A7E */
6729 {
6730 { Bad_Opcode },
6731 { Bad_Opcode },
6732 { VEX_LEN_TABLE (VEX_LEN_0F3A7E_P_2) },
6733 },
6734
6735 /* PREFIX_VEX_0F3A7F */
6736 {
6737 { Bad_Opcode },
6738 { Bad_Opcode },
6739 { VEX_LEN_TABLE (VEX_LEN_0F3A7F_P_2) },
6740 },
6741
6742 /* PREFIX_VEX_0F3ACE */
6743 {
6744 { Bad_Opcode },
6745 { Bad_Opcode },
6746 { VEX_W_TABLE (VEX_W_0F3ACE_P_2) },
6747 },
6748
6749 /* PREFIX_VEX_0F3ACF */
6750 {
6751 { Bad_Opcode },
6752 { Bad_Opcode },
6753 { VEX_W_TABLE (VEX_W_0F3ACF_P_2) },
6754 },
6755
6756 /* PREFIX_VEX_0F3ADF */
6757 {
6758 { Bad_Opcode },
6759 { Bad_Opcode },
6760 { VEX_LEN_TABLE (VEX_LEN_0F3ADF_P_2) },
6761 },
6762
6763 /* PREFIX_VEX_0F3AF0 */
6764 {
6765 { Bad_Opcode },
6766 { Bad_Opcode },
6767 { Bad_Opcode },
6768 { VEX_LEN_TABLE (VEX_LEN_0F3AF0_P_3) },
6769 },
6770
6771 #define NEED_PREFIX_TABLE
6772 #include "i386-dis-evex.h"
6773 #undef NEED_PREFIX_TABLE
6774 };
6775
6776 static const struct dis386 x86_64_table[][2] = {
6777 /* X86_64_06 */
6778 {
6779 { "pushP", { es }, 0 },
6780 },
6781
6782 /* X86_64_07 */
6783 {
6784 { "popP", { es }, 0 },
6785 },
6786
6787 /* X86_64_0D */
6788 {
6789 { "pushP", { cs }, 0 },
6790 },
6791
6792 /* X86_64_16 */
6793 {
6794 { "pushP", { ss }, 0 },
6795 },
6796
6797 /* X86_64_17 */
6798 {
6799 { "popP", { ss }, 0 },
6800 },
6801
6802 /* X86_64_1E */
6803 {
6804 { "pushP", { ds }, 0 },
6805 },
6806
6807 /* X86_64_1F */
6808 {
6809 { "popP", { ds }, 0 },
6810 },
6811
6812 /* X86_64_27 */
6813 {
6814 { "daa", { XX }, 0 },
6815 },
6816
6817 /* X86_64_2F */
6818 {
6819 { "das", { XX }, 0 },
6820 },
6821
6822 /* X86_64_37 */
6823 {
6824 { "aaa", { XX }, 0 },
6825 },
6826
6827 /* X86_64_3F */
6828 {
6829 { "aas", { XX }, 0 },
6830 },
6831
6832 /* X86_64_60 */
6833 {
6834 { "pushaP", { XX }, 0 },
6835 },
6836
6837 /* X86_64_61 */
6838 {
6839 { "popaP", { XX }, 0 },
6840 },
6841
6842 /* X86_64_62 */
6843 {
6844 { MOD_TABLE (MOD_62_32BIT) },
6845 { EVEX_TABLE (EVEX_0F) },
6846 },
6847
6848 /* X86_64_63 */
6849 {
6850 { "arpl", { Ew, Gw }, 0 },
6851 { "movs{lq|xd}", { Gv, Ed }, 0 },
6852 },
6853
6854 /* X86_64_6D */
6855 {
6856 { "ins{R|}", { Yzr, indirDX }, 0 },
6857 { "ins{G|}", { Yzr, indirDX }, 0 },
6858 },
6859
6860 /* X86_64_6F */
6861 {
6862 { "outs{R|}", { indirDXr, Xz }, 0 },
6863 { "outs{G|}", { indirDXr, Xz }, 0 },
6864 },
6865
6866 /* X86_64_82 */
6867 {
6868 /* Opcode 0x82 is an alias of opcode 0x80 in 32-bit mode. */
6869 { REG_TABLE (REG_80) },
6870 },
6871
6872 /* X86_64_9A */
6873 {
6874 { "Jcall{T|}", { Ap }, 0 },
6875 },
6876
6877 /* X86_64_C4 */
6878 {
6879 { MOD_TABLE (MOD_C4_32BIT) },
6880 { VEX_C4_TABLE (VEX_0F) },
6881 },
6882
6883 /* X86_64_C5 */
6884 {
6885 { MOD_TABLE (MOD_C5_32BIT) },
6886 { VEX_C5_TABLE (VEX_0F) },
6887 },
6888
6889 /* X86_64_CE */
6890 {
6891 { "into", { XX }, 0 },
6892 },
6893
6894 /* X86_64_D4 */
6895 {
6896 { "aam", { Ib }, 0 },
6897 },
6898
6899 /* X86_64_D5 */
6900 {
6901 { "aad", { Ib }, 0 },
6902 },
6903
6904 /* X86_64_E8 */
6905 {
6906 { "callP", { Jv, BND }, 0 },
6907 { "call@", { Jv, BND }, 0 }
6908 },
6909
6910 /* X86_64_E9 */
6911 {
6912 { "jmpP", { Jv, BND }, 0 },
6913 { "jmp@", { Jv, BND }, 0 }
6914 },
6915
6916 /* X86_64_EA */
6917 {
6918 { "Jjmp{T|}", { Ap }, 0 },
6919 },
6920
6921 /* X86_64_0F01_REG_0 */
6922 {
6923 { "sgdt{Q|IQ}", { M }, 0 },
6924 { "sgdt", { M }, 0 },
6925 },
6926
6927 /* X86_64_0F01_REG_1 */
6928 {
6929 { "sidt{Q|IQ}", { M }, 0 },
6930 { "sidt", { M }, 0 },
6931 },
6932
6933 /* X86_64_0F01_REG_2 */
6934 {
6935 { "lgdt{Q|Q}", { M }, 0 },
6936 { "lgdt", { M }, 0 },
6937 },
6938
6939 /* X86_64_0F01_REG_3 */
6940 {
6941 { "lidt{Q|Q}", { M }, 0 },
6942 { "lidt", { M }, 0 },
6943 },
6944 };
6945
6946 static const struct dis386 three_byte_table[][256] = {
6947
6948 /* THREE_BYTE_0F38 */
6949 {
6950 /* 00 */
6951 { "pshufb", { MX, EM }, PREFIX_OPCODE },
6952 { "phaddw", { MX, EM }, PREFIX_OPCODE },
6953 { "phaddd", { MX, EM }, PREFIX_OPCODE },
6954 { "phaddsw", { MX, EM }, PREFIX_OPCODE },
6955 { "pmaddubsw", { MX, EM }, PREFIX_OPCODE },
6956 { "phsubw", { MX, EM }, PREFIX_OPCODE },
6957 { "phsubd", { MX, EM }, PREFIX_OPCODE },
6958 { "phsubsw", { MX, EM }, PREFIX_OPCODE },
6959 /* 08 */
6960 { "psignb", { MX, EM }, PREFIX_OPCODE },
6961 { "psignw", { MX, EM }, PREFIX_OPCODE },
6962 { "psignd", { MX, EM }, PREFIX_OPCODE },
6963 { "pmulhrsw", { MX, EM }, PREFIX_OPCODE },
6964 { Bad_Opcode },
6965 { Bad_Opcode },
6966 { Bad_Opcode },
6967 { Bad_Opcode },
6968 /* 10 */
6969 { PREFIX_TABLE (PREFIX_0F3810) },
6970 { Bad_Opcode },
6971 { Bad_Opcode },
6972 { Bad_Opcode },
6973 { PREFIX_TABLE (PREFIX_0F3814) },
6974 { PREFIX_TABLE (PREFIX_0F3815) },
6975 { Bad_Opcode },
6976 { PREFIX_TABLE (PREFIX_0F3817) },
6977 /* 18 */
6978 { Bad_Opcode },
6979 { Bad_Opcode },
6980 { Bad_Opcode },
6981 { Bad_Opcode },
6982 { "pabsb", { MX, EM }, PREFIX_OPCODE },
6983 { "pabsw", { MX, EM }, PREFIX_OPCODE },
6984 { "pabsd", { MX, EM }, PREFIX_OPCODE },
6985 { Bad_Opcode },
6986 /* 20 */
6987 { PREFIX_TABLE (PREFIX_0F3820) },
6988 { PREFIX_TABLE (PREFIX_0F3821) },
6989 { PREFIX_TABLE (PREFIX_0F3822) },
6990 { PREFIX_TABLE (PREFIX_0F3823) },
6991 { PREFIX_TABLE (PREFIX_0F3824) },
6992 { PREFIX_TABLE (PREFIX_0F3825) },
6993 { Bad_Opcode },
6994 { Bad_Opcode },
6995 /* 28 */
6996 { PREFIX_TABLE (PREFIX_0F3828) },
6997 { PREFIX_TABLE (PREFIX_0F3829) },
6998 { PREFIX_TABLE (PREFIX_0F382A) },
6999 { PREFIX_TABLE (PREFIX_0F382B) },
7000 { Bad_Opcode },
7001 { Bad_Opcode },
7002 { Bad_Opcode },
7003 { Bad_Opcode },
7004 /* 30 */
7005 { PREFIX_TABLE (PREFIX_0F3830) },
7006 { PREFIX_TABLE (PREFIX_0F3831) },
7007 { PREFIX_TABLE (PREFIX_0F3832) },
7008 { PREFIX_TABLE (PREFIX_0F3833) },
7009 { PREFIX_TABLE (PREFIX_0F3834) },
7010 { PREFIX_TABLE (PREFIX_0F3835) },
7011 { Bad_Opcode },
7012 { PREFIX_TABLE (PREFIX_0F3837) },
7013 /* 38 */
7014 { PREFIX_TABLE (PREFIX_0F3838) },
7015 { PREFIX_TABLE (PREFIX_0F3839) },
7016 { PREFIX_TABLE (PREFIX_0F383A) },
7017 { PREFIX_TABLE (PREFIX_0F383B) },
7018 { PREFIX_TABLE (PREFIX_0F383C) },
7019 { PREFIX_TABLE (PREFIX_0F383D) },
7020 { PREFIX_TABLE (PREFIX_0F383E) },
7021 { PREFIX_TABLE (PREFIX_0F383F) },
7022 /* 40 */
7023 { PREFIX_TABLE (PREFIX_0F3840) },
7024 { PREFIX_TABLE (PREFIX_0F3841) },
7025 { Bad_Opcode },
7026 { Bad_Opcode },
7027 { Bad_Opcode },
7028 { Bad_Opcode },
7029 { Bad_Opcode },
7030 { Bad_Opcode },
7031 /* 48 */
7032 { Bad_Opcode },
7033 { Bad_Opcode },
7034 { Bad_Opcode },
7035 { Bad_Opcode },
7036 { Bad_Opcode },
7037 { Bad_Opcode },
7038 { Bad_Opcode },
7039 { Bad_Opcode },
7040 /* 50 */
7041 { Bad_Opcode },
7042 { Bad_Opcode },
7043 { Bad_Opcode },
7044 { Bad_Opcode },
7045 { Bad_Opcode },
7046 { Bad_Opcode },
7047 { Bad_Opcode },
7048 { Bad_Opcode },
7049 /* 58 */
7050 { Bad_Opcode },
7051 { Bad_Opcode },
7052 { Bad_Opcode },
7053 { Bad_Opcode },
7054 { Bad_Opcode },
7055 { Bad_Opcode },
7056 { Bad_Opcode },
7057 { Bad_Opcode },
7058 /* 60 */
7059 { Bad_Opcode },
7060 { Bad_Opcode },
7061 { Bad_Opcode },
7062 { Bad_Opcode },
7063 { Bad_Opcode },
7064 { Bad_Opcode },
7065 { Bad_Opcode },
7066 { Bad_Opcode },
7067 /* 68 */
7068 { Bad_Opcode },
7069 { Bad_Opcode },
7070 { Bad_Opcode },
7071 { Bad_Opcode },
7072 { Bad_Opcode },
7073 { Bad_Opcode },
7074 { Bad_Opcode },
7075 { Bad_Opcode },
7076 /* 70 */
7077 { Bad_Opcode },
7078 { Bad_Opcode },
7079 { Bad_Opcode },
7080 { Bad_Opcode },
7081 { Bad_Opcode },
7082 { Bad_Opcode },
7083 { Bad_Opcode },
7084 { Bad_Opcode },
7085 /* 78 */
7086 { Bad_Opcode },
7087 { Bad_Opcode },
7088 { Bad_Opcode },
7089 { Bad_Opcode },
7090 { Bad_Opcode },
7091 { Bad_Opcode },
7092 { Bad_Opcode },
7093 { Bad_Opcode },
7094 /* 80 */
7095 { PREFIX_TABLE (PREFIX_0F3880) },
7096 { PREFIX_TABLE (PREFIX_0F3881) },
7097 { PREFIX_TABLE (PREFIX_0F3882) },
7098 { Bad_Opcode },
7099 { Bad_Opcode },
7100 { Bad_Opcode },
7101 { Bad_Opcode },
7102 { Bad_Opcode },
7103 /* 88 */
7104 { Bad_Opcode },
7105 { Bad_Opcode },
7106 { Bad_Opcode },
7107 { Bad_Opcode },
7108 { Bad_Opcode },
7109 { Bad_Opcode },
7110 { Bad_Opcode },
7111 { Bad_Opcode },
7112 /* 90 */
7113 { Bad_Opcode },
7114 { Bad_Opcode },
7115 { Bad_Opcode },
7116 { Bad_Opcode },
7117 { Bad_Opcode },
7118 { Bad_Opcode },
7119 { Bad_Opcode },
7120 { Bad_Opcode },
7121 /* 98 */
7122 { Bad_Opcode },
7123 { Bad_Opcode },
7124 { Bad_Opcode },
7125 { Bad_Opcode },
7126 { Bad_Opcode },
7127 { Bad_Opcode },
7128 { Bad_Opcode },
7129 { Bad_Opcode },
7130 /* a0 */
7131 { Bad_Opcode },
7132 { Bad_Opcode },
7133 { Bad_Opcode },
7134 { Bad_Opcode },
7135 { Bad_Opcode },
7136 { Bad_Opcode },
7137 { Bad_Opcode },
7138 { Bad_Opcode },
7139 /* a8 */
7140 { Bad_Opcode },
7141 { Bad_Opcode },
7142 { Bad_Opcode },
7143 { Bad_Opcode },
7144 { Bad_Opcode },
7145 { Bad_Opcode },
7146 { Bad_Opcode },
7147 { Bad_Opcode },
7148 /* b0 */
7149 { Bad_Opcode },
7150 { Bad_Opcode },
7151 { Bad_Opcode },
7152 { Bad_Opcode },
7153 { Bad_Opcode },
7154 { Bad_Opcode },
7155 { Bad_Opcode },
7156 { Bad_Opcode },
7157 /* b8 */
7158 { Bad_Opcode },
7159 { Bad_Opcode },
7160 { Bad_Opcode },
7161 { Bad_Opcode },
7162 { Bad_Opcode },
7163 { Bad_Opcode },
7164 { Bad_Opcode },
7165 { Bad_Opcode },
7166 /* c0 */
7167 { Bad_Opcode },
7168 { Bad_Opcode },
7169 { Bad_Opcode },
7170 { Bad_Opcode },
7171 { Bad_Opcode },
7172 { Bad_Opcode },
7173 { Bad_Opcode },
7174 { Bad_Opcode },
7175 /* c8 */
7176 { PREFIX_TABLE (PREFIX_0F38C8) },
7177 { PREFIX_TABLE (PREFIX_0F38C9) },
7178 { PREFIX_TABLE (PREFIX_0F38CA) },
7179 { PREFIX_TABLE (PREFIX_0F38CB) },
7180 { PREFIX_TABLE (PREFIX_0F38CC) },
7181 { PREFIX_TABLE (PREFIX_0F38CD) },
7182 { Bad_Opcode },
7183 { PREFIX_TABLE (PREFIX_0F38CF) },
7184 /* d0 */
7185 { Bad_Opcode },
7186 { Bad_Opcode },
7187 { Bad_Opcode },
7188 { Bad_Opcode },
7189 { Bad_Opcode },
7190 { Bad_Opcode },
7191 { Bad_Opcode },
7192 { Bad_Opcode },
7193 /* d8 */
7194 { Bad_Opcode },
7195 { Bad_Opcode },
7196 { Bad_Opcode },
7197 { PREFIX_TABLE (PREFIX_0F38DB) },
7198 { PREFIX_TABLE (PREFIX_0F38DC) },
7199 { PREFIX_TABLE (PREFIX_0F38DD) },
7200 { PREFIX_TABLE (PREFIX_0F38DE) },
7201 { PREFIX_TABLE (PREFIX_0F38DF) },
7202 /* e0 */
7203 { Bad_Opcode },
7204 { Bad_Opcode },
7205 { Bad_Opcode },
7206 { Bad_Opcode },
7207 { Bad_Opcode },
7208 { Bad_Opcode },
7209 { Bad_Opcode },
7210 { Bad_Opcode },
7211 /* e8 */
7212 { Bad_Opcode },
7213 { Bad_Opcode },
7214 { Bad_Opcode },
7215 { Bad_Opcode },
7216 { Bad_Opcode },
7217 { Bad_Opcode },
7218 { Bad_Opcode },
7219 { Bad_Opcode },
7220 /* f0 */
7221 { PREFIX_TABLE (PREFIX_0F38F0) },
7222 { PREFIX_TABLE (PREFIX_0F38F1) },
7223 { Bad_Opcode },
7224 { Bad_Opcode },
7225 { Bad_Opcode },
7226 { PREFIX_TABLE (PREFIX_0F38F5) },
7227 { PREFIX_TABLE (PREFIX_0F38F6) },
7228 { Bad_Opcode },
7229 /* f8 */
7230 { PREFIX_TABLE (PREFIX_0F38F8) },
7231 { PREFIX_TABLE (PREFIX_0F38F9) },
7232 { Bad_Opcode },
7233 { Bad_Opcode },
7234 { Bad_Opcode },
7235 { Bad_Opcode },
7236 { Bad_Opcode },
7237 { Bad_Opcode },
7238 },
7239 /* THREE_BYTE_0F3A */
7240 {
7241 /* 00 */
7242 { Bad_Opcode },
7243 { Bad_Opcode },
7244 { Bad_Opcode },
7245 { Bad_Opcode },
7246 { Bad_Opcode },
7247 { Bad_Opcode },
7248 { Bad_Opcode },
7249 { Bad_Opcode },
7250 /* 08 */
7251 { PREFIX_TABLE (PREFIX_0F3A08) },
7252 { PREFIX_TABLE (PREFIX_0F3A09) },
7253 { PREFIX_TABLE (PREFIX_0F3A0A) },
7254 { PREFIX_TABLE (PREFIX_0F3A0B) },
7255 { PREFIX_TABLE (PREFIX_0F3A0C) },
7256 { PREFIX_TABLE (PREFIX_0F3A0D) },
7257 { PREFIX_TABLE (PREFIX_0F3A0E) },
7258 { "palignr", { MX, EM, Ib }, PREFIX_OPCODE },
7259 /* 10 */
7260 { Bad_Opcode },
7261 { Bad_Opcode },
7262 { Bad_Opcode },
7263 { Bad_Opcode },
7264 { PREFIX_TABLE (PREFIX_0F3A14) },
7265 { PREFIX_TABLE (PREFIX_0F3A15) },
7266 { PREFIX_TABLE (PREFIX_0F3A16) },
7267 { PREFIX_TABLE (PREFIX_0F3A17) },
7268 /* 18 */
7269 { Bad_Opcode },
7270 { Bad_Opcode },
7271 { Bad_Opcode },
7272 { Bad_Opcode },
7273 { Bad_Opcode },
7274 { Bad_Opcode },
7275 { Bad_Opcode },
7276 { Bad_Opcode },
7277 /* 20 */
7278 { PREFIX_TABLE (PREFIX_0F3A20) },
7279 { PREFIX_TABLE (PREFIX_0F3A21) },
7280 { PREFIX_TABLE (PREFIX_0F3A22) },
7281 { Bad_Opcode },
7282 { Bad_Opcode },
7283 { Bad_Opcode },
7284 { Bad_Opcode },
7285 { Bad_Opcode },
7286 /* 28 */
7287 { Bad_Opcode },
7288 { Bad_Opcode },
7289 { Bad_Opcode },
7290 { Bad_Opcode },
7291 { Bad_Opcode },
7292 { Bad_Opcode },
7293 { Bad_Opcode },
7294 { Bad_Opcode },
7295 /* 30 */
7296 { Bad_Opcode },
7297 { Bad_Opcode },
7298 { Bad_Opcode },
7299 { Bad_Opcode },
7300 { Bad_Opcode },
7301 { Bad_Opcode },
7302 { Bad_Opcode },
7303 { Bad_Opcode },
7304 /* 38 */
7305 { Bad_Opcode },
7306 { Bad_Opcode },
7307 { Bad_Opcode },
7308 { Bad_Opcode },
7309 { Bad_Opcode },
7310 { Bad_Opcode },
7311 { Bad_Opcode },
7312 { Bad_Opcode },
7313 /* 40 */
7314 { PREFIX_TABLE (PREFIX_0F3A40) },
7315 { PREFIX_TABLE (PREFIX_0F3A41) },
7316 { PREFIX_TABLE (PREFIX_0F3A42) },
7317 { Bad_Opcode },
7318 { PREFIX_TABLE (PREFIX_0F3A44) },
7319 { Bad_Opcode },
7320 { Bad_Opcode },
7321 { Bad_Opcode },
7322 /* 48 */
7323 { Bad_Opcode },
7324 { Bad_Opcode },
7325 { Bad_Opcode },
7326 { Bad_Opcode },
7327 { Bad_Opcode },
7328 { Bad_Opcode },
7329 { Bad_Opcode },
7330 { Bad_Opcode },
7331 /* 50 */
7332 { Bad_Opcode },
7333 { Bad_Opcode },
7334 { Bad_Opcode },
7335 { Bad_Opcode },
7336 { Bad_Opcode },
7337 { Bad_Opcode },
7338 { Bad_Opcode },
7339 { Bad_Opcode },
7340 /* 58 */
7341 { Bad_Opcode },
7342 { Bad_Opcode },
7343 { Bad_Opcode },
7344 { Bad_Opcode },
7345 { Bad_Opcode },
7346 { Bad_Opcode },
7347 { Bad_Opcode },
7348 { Bad_Opcode },
7349 /* 60 */
7350 { PREFIX_TABLE (PREFIX_0F3A60) },
7351 { PREFIX_TABLE (PREFIX_0F3A61) },
7352 { PREFIX_TABLE (PREFIX_0F3A62) },
7353 { PREFIX_TABLE (PREFIX_0F3A63) },
7354 { Bad_Opcode },
7355 { Bad_Opcode },
7356 { Bad_Opcode },
7357 { Bad_Opcode },
7358 /* 68 */
7359 { Bad_Opcode },
7360 { Bad_Opcode },
7361 { Bad_Opcode },
7362 { Bad_Opcode },
7363 { Bad_Opcode },
7364 { Bad_Opcode },
7365 { Bad_Opcode },
7366 { Bad_Opcode },
7367 /* 70 */
7368 { Bad_Opcode },
7369 { Bad_Opcode },
7370 { Bad_Opcode },
7371 { Bad_Opcode },
7372 { Bad_Opcode },
7373 { Bad_Opcode },
7374 { Bad_Opcode },
7375 { Bad_Opcode },
7376 /* 78 */
7377 { Bad_Opcode },
7378 { Bad_Opcode },
7379 { Bad_Opcode },
7380 { Bad_Opcode },
7381 { Bad_Opcode },
7382 { Bad_Opcode },
7383 { Bad_Opcode },
7384 { Bad_Opcode },
7385 /* 80 */
7386 { Bad_Opcode },
7387 { Bad_Opcode },
7388 { Bad_Opcode },
7389 { Bad_Opcode },
7390 { Bad_Opcode },
7391 { Bad_Opcode },
7392 { Bad_Opcode },
7393 { Bad_Opcode },
7394 /* 88 */
7395 { Bad_Opcode },
7396 { Bad_Opcode },
7397 { Bad_Opcode },
7398 { Bad_Opcode },
7399 { Bad_Opcode },
7400 { Bad_Opcode },
7401 { Bad_Opcode },
7402 { Bad_Opcode },
7403 /* 90 */
7404 { Bad_Opcode },
7405 { Bad_Opcode },
7406 { Bad_Opcode },
7407 { Bad_Opcode },
7408 { Bad_Opcode },
7409 { Bad_Opcode },
7410 { Bad_Opcode },
7411 { Bad_Opcode },
7412 /* 98 */
7413 { Bad_Opcode },
7414 { Bad_Opcode },
7415 { Bad_Opcode },
7416 { Bad_Opcode },
7417 { Bad_Opcode },
7418 { Bad_Opcode },
7419 { Bad_Opcode },
7420 { Bad_Opcode },
7421 /* a0 */
7422 { Bad_Opcode },
7423 { Bad_Opcode },
7424 { Bad_Opcode },
7425 { Bad_Opcode },
7426 { Bad_Opcode },
7427 { Bad_Opcode },
7428 { Bad_Opcode },
7429 { Bad_Opcode },
7430 /* a8 */
7431 { Bad_Opcode },
7432 { Bad_Opcode },
7433 { Bad_Opcode },
7434 { Bad_Opcode },
7435 { Bad_Opcode },
7436 { Bad_Opcode },
7437 { Bad_Opcode },
7438 { Bad_Opcode },
7439 /* b0 */
7440 { Bad_Opcode },
7441 { Bad_Opcode },
7442 { Bad_Opcode },
7443 { Bad_Opcode },
7444 { Bad_Opcode },
7445 { Bad_Opcode },
7446 { Bad_Opcode },
7447 { Bad_Opcode },
7448 /* b8 */
7449 { Bad_Opcode },
7450 { Bad_Opcode },
7451 { Bad_Opcode },
7452 { Bad_Opcode },
7453 { Bad_Opcode },
7454 { Bad_Opcode },
7455 { Bad_Opcode },
7456 { Bad_Opcode },
7457 /* c0 */
7458 { Bad_Opcode },
7459 { Bad_Opcode },
7460 { Bad_Opcode },
7461 { Bad_Opcode },
7462 { Bad_Opcode },
7463 { Bad_Opcode },
7464 { Bad_Opcode },
7465 { Bad_Opcode },
7466 /* c8 */
7467 { Bad_Opcode },
7468 { Bad_Opcode },
7469 { Bad_Opcode },
7470 { Bad_Opcode },
7471 { PREFIX_TABLE (PREFIX_0F3ACC) },
7472 { Bad_Opcode },
7473 { PREFIX_TABLE (PREFIX_0F3ACE) },
7474 { PREFIX_TABLE (PREFIX_0F3ACF) },
7475 /* d0 */
7476 { Bad_Opcode },
7477 { Bad_Opcode },
7478 { Bad_Opcode },
7479 { Bad_Opcode },
7480 { Bad_Opcode },
7481 { Bad_Opcode },
7482 { Bad_Opcode },
7483 { Bad_Opcode },
7484 /* d8 */
7485 { Bad_Opcode },
7486 { Bad_Opcode },
7487 { Bad_Opcode },
7488 { Bad_Opcode },
7489 { Bad_Opcode },
7490 { Bad_Opcode },
7491 { Bad_Opcode },
7492 { PREFIX_TABLE (PREFIX_0F3ADF) },
7493 /* e0 */
7494 { Bad_Opcode },
7495 { Bad_Opcode },
7496 { Bad_Opcode },
7497 { Bad_Opcode },
7498 { Bad_Opcode },
7499 { Bad_Opcode },
7500 { Bad_Opcode },
7501 { Bad_Opcode },
7502 /* e8 */
7503 { Bad_Opcode },
7504 { Bad_Opcode },
7505 { Bad_Opcode },
7506 { Bad_Opcode },
7507 { Bad_Opcode },
7508 { Bad_Opcode },
7509 { Bad_Opcode },
7510 { Bad_Opcode },
7511 /* f0 */
7512 { Bad_Opcode },
7513 { Bad_Opcode },
7514 { Bad_Opcode },
7515 { Bad_Opcode },
7516 { Bad_Opcode },
7517 { Bad_Opcode },
7518 { Bad_Opcode },
7519 { Bad_Opcode },
7520 /* f8 */
7521 { Bad_Opcode },
7522 { Bad_Opcode },
7523 { Bad_Opcode },
7524 { Bad_Opcode },
7525 { Bad_Opcode },
7526 { Bad_Opcode },
7527 { Bad_Opcode },
7528 { Bad_Opcode },
7529 },
7530 };
7531
7532 static const struct dis386 xop_table[][256] = {
7533 /* XOP_08 */
7534 {
7535 /* 00 */
7536 { Bad_Opcode },
7537 { Bad_Opcode },
7538 { Bad_Opcode },
7539 { Bad_Opcode },
7540 { Bad_Opcode },
7541 { Bad_Opcode },
7542 { Bad_Opcode },
7543 { Bad_Opcode },
7544 /* 08 */
7545 { Bad_Opcode },
7546 { Bad_Opcode },
7547 { Bad_Opcode },
7548 { Bad_Opcode },
7549 { Bad_Opcode },
7550 { Bad_Opcode },
7551 { Bad_Opcode },
7552 { Bad_Opcode },
7553 /* 10 */
7554 { Bad_Opcode },
7555 { Bad_Opcode },
7556 { Bad_Opcode },
7557 { Bad_Opcode },
7558 { Bad_Opcode },
7559 { Bad_Opcode },
7560 { Bad_Opcode },
7561 { Bad_Opcode },
7562 /* 18 */
7563 { Bad_Opcode },
7564 { Bad_Opcode },
7565 { Bad_Opcode },
7566 { Bad_Opcode },
7567 { Bad_Opcode },
7568 { Bad_Opcode },
7569 { Bad_Opcode },
7570 { Bad_Opcode },
7571 /* 20 */
7572 { Bad_Opcode },
7573 { Bad_Opcode },
7574 { Bad_Opcode },
7575 { Bad_Opcode },
7576 { Bad_Opcode },
7577 { Bad_Opcode },
7578 { Bad_Opcode },
7579 { Bad_Opcode },
7580 /* 28 */
7581 { Bad_Opcode },
7582 { Bad_Opcode },
7583 { Bad_Opcode },
7584 { Bad_Opcode },
7585 { Bad_Opcode },
7586 { Bad_Opcode },
7587 { Bad_Opcode },
7588 { Bad_Opcode },
7589 /* 30 */
7590 { Bad_Opcode },
7591 { Bad_Opcode },
7592 { Bad_Opcode },
7593 { Bad_Opcode },
7594 { Bad_Opcode },
7595 { Bad_Opcode },
7596 { Bad_Opcode },
7597 { Bad_Opcode },
7598 /* 38 */
7599 { Bad_Opcode },
7600 { Bad_Opcode },
7601 { Bad_Opcode },
7602 { Bad_Opcode },
7603 { Bad_Opcode },
7604 { Bad_Opcode },
7605 { Bad_Opcode },
7606 { Bad_Opcode },
7607 /* 40 */
7608 { Bad_Opcode },
7609 { Bad_Opcode },
7610 { Bad_Opcode },
7611 { Bad_Opcode },
7612 { Bad_Opcode },
7613 { Bad_Opcode },
7614 { Bad_Opcode },
7615 { Bad_Opcode },
7616 /* 48 */
7617 { Bad_Opcode },
7618 { Bad_Opcode },
7619 { Bad_Opcode },
7620 { Bad_Opcode },
7621 { Bad_Opcode },
7622 { Bad_Opcode },
7623 { Bad_Opcode },
7624 { Bad_Opcode },
7625 /* 50 */
7626 { Bad_Opcode },
7627 { Bad_Opcode },
7628 { Bad_Opcode },
7629 { Bad_Opcode },
7630 { Bad_Opcode },
7631 { Bad_Opcode },
7632 { Bad_Opcode },
7633 { Bad_Opcode },
7634 /* 58 */
7635 { Bad_Opcode },
7636 { Bad_Opcode },
7637 { Bad_Opcode },
7638 { Bad_Opcode },
7639 { Bad_Opcode },
7640 { Bad_Opcode },
7641 { Bad_Opcode },
7642 { Bad_Opcode },
7643 /* 60 */
7644 { Bad_Opcode },
7645 { Bad_Opcode },
7646 { Bad_Opcode },
7647 { Bad_Opcode },
7648 { Bad_Opcode },
7649 { Bad_Opcode },
7650 { Bad_Opcode },
7651 { Bad_Opcode },
7652 /* 68 */
7653 { Bad_Opcode },
7654 { Bad_Opcode },
7655 { Bad_Opcode },
7656 { Bad_Opcode },
7657 { Bad_Opcode },
7658 { Bad_Opcode },
7659 { Bad_Opcode },
7660 { Bad_Opcode },
7661 /* 70 */
7662 { Bad_Opcode },
7663 { Bad_Opcode },
7664 { Bad_Opcode },
7665 { Bad_Opcode },
7666 { Bad_Opcode },
7667 { Bad_Opcode },
7668 { Bad_Opcode },
7669 { Bad_Opcode },
7670 /* 78 */
7671 { Bad_Opcode },
7672 { Bad_Opcode },
7673 { Bad_Opcode },
7674 { Bad_Opcode },
7675 { Bad_Opcode },
7676 { Bad_Opcode },
7677 { Bad_Opcode },
7678 { Bad_Opcode },
7679 /* 80 */
7680 { Bad_Opcode },
7681 { Bad_Opcode },
7682 { Bad_Opcode },
7683 { Bad_Opcode },
7684 { Bad_Opcode },
7685 { "vpmacssww", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7686 { "vpmacsswd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7687 { "vpmacssdql", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7688 /* 88 */
7689 { Bad_Opcode },
7690 { Bad_Opcode },
7691 { Bad_Opcode },
7692 { Bad_Opcode },
7693 { Bad_Opcode },
7694 { Bad_Opcode },
7695 { "vpmacssdd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7696 { "vpmacssdqh", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7697 /* 90 */
7698 { Bad_Opcode },
7699 { Bad_Opcode },
7700 { Bad_Opcode },
7701 { Bad_Opcode },
7702 { Bad_Opcode },
7703 { "vpmacsww", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7704 { "vpmacswd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7705 { "vpmacsdql", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7706 /* 98 */
7707 { Bad_Opcode },
7708 { Bad_Opcode },
7709 { Bad_Opcode },
7710 { Bad_Opcode },
7711 { Bad_Opcode },
7712 { Bad_Opcode },
7713 { "vpmacsdd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7714 { "vpmacsdqh", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7715 /* a0 */
7716 { Bad_Opcode },
7717 { Bad_Opcode },
7718 { "vpcmov", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7719 { "vpperm", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7720 { Bad_Opcode },
7721 { Bad_Opcode },
7722 { "vpmadcsswd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7723 { Bad_Opcode },
7724 /* a8 */
7725 { Bad_Opcode },
7726 { Bad_Opcode },
7727 { Bad_Opcode },
7728 { Bad_Opcode },
7729 { Bad_Opcode },
7730 { Bad_Opcode },
7731 { Bad_Opcode },
7732 { Bad_Opcode },
7733 /* b0 */
7734 { Bad_Opcode },
7735 { Bad_Opcode },
7736 { Bad_Opcode },
7737 { Bad_Opcode },
7738 { Bad_Opcode },
7739 { Bad_Opcode },
7740 { "vpmadcswd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7741 { Bad_Opcode },
7742 /* b8 */
7743 { Bad_Opcode },
7744 { Bad_Opcode },
7745 { Bad_Opcode },
7746 { Bad_Opcode },
7747 { Bad_Opcode },
7748 { Bad_Opcode },
7749 { Bad_Opcode },
7750 { Bad_Opcode },
7751 /* c0 */
7752 { "vprotb", { XM, Vex_2src_1, Ib }, 0 },
7753 { "vprotw", { XM, Vex_2src_1, Ib }, 0 },
7754 { "vprotd", { XM, Vex_2src_1, Ib }, 0 },
7755 { "vprotq", { XM, Vex_2src_1, Ib }, 0 },
7756 { Bad_Opcode },
7757 { Bad_Opcode },
7758 { Bad_Opcode },
7759 { Bad_Opcode },
7760 /* c8 */
7761 { Bad_Opcode },
7762 { Bad_Opcode },
7763 { Bad_Opcode },
7764 { Bad_Opcode },
7765 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CC) },
7766 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CD) },
7767 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CE) },
7768 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CF) },
7769 /* d0 */
7770 { Bad_Opcode },
7771 { Bad_Opcode },
7772 { Bad_Opcode },
7773 { Bad_Opcode },
7774 { Bad_Opcode },
7775 { Bad_Opcode },
7776 { Bad_Opcode },
7777 { Bad_Opcode },
7778 /* d8 */
7779 { Bad_Opcode },
7780 { Bad_Opcode },
7781 { Bad_Opcode },
7782 { Bad_Opcode },
7783 { Bad_Opcode },
7784 { Bad_Opcode },
7785 { Bad_Opcode },
7786 { Bad_Opcode },
7787 /* e0 */
7788 { Bad_Opcode },
7789 { Bad_Opcode },
7790 { Bad_Opcode },
7791 { Bad_Opcode },
7792 { Bad_Opcode },
7793 { Bad_Opcode },
7794 { Bad_Opcode },
7795 { Bad_Opcode },
7796 /* e8 */
7797 { Bad_Opcode },
7798 { Bad_Opcode },
7799 { Bad_Opcode },
7800 { Bad_Opcode },
7801 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EC) },
7802 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_ED) },
7803 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EE) },
7804 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EF) },
7805 /* f0 */
7806 { Bad_Opcode },
7807 { Bad_Opcode },
7808 { Bad_Opcode },
7809 { Bad_Opcode },
7810 { Bad_Opcode },
7811 { Bad_Opcode },
7812 { Bad_Opcode },
7813 { Bad_Opcode },
7814 /* f8 */
7815 { Bad_Opcode },
7816 { Bad_Opcode },
7817 { Bad_Opcode },
7818 { Bad_Opcode },
7819 { Bad_Opcode },
7820 { Bad_Opcode },
7821 { Bad_Opcode },
7822 { Bad_Opcode },
7823 },
7824 /* XOP_09 */
7825 {
7826 /* 00 */
7827 { Bad_Opcode },
7828 { REG_TABLE (REG_XOP_TBM_01) },
7829 { REG_TABLE (REG_XOP_TBM_02) },
7830 { Bad_Opcode },
7831 { Bad_Opcode },
7832 { Bad_Opcode },
7833 { Bad_Opcode },
7834 { Bad_Opcode },
7835 /* 08 */
7836 { Bad_Opcode },
7837 { Bad_Opcode },
7838 { Bad_Opcode },
7839 { Bad_Opcode },
7840 { Bad_Opcode },
7841 { Bad_Opcode },
7842 { Bad_Opcode },
7843 { Bad_Opcode },
7844 /* 10 */
7845 { Bad_Opcode },
7846 { Bad_Opcode },
7847 { REG_TABLE (REG_XOP_LWPCB) },
7848 { Bad_Opcode },
7849 { Bad_Opcode },
7850 { Bad_Opcode },
7851 { Bad_Opcode },
7852 { Bad_Opcode },
7853 /* 18 */
7854 { Bad_Opcode },
7855 { Bad_Opcode },
7856 { Bad_Opcode },
7857 { Bad_Opcode },
7858 { Bad_Opcode },
7859 { Bad_Opcode },
7860 { Bad_Opcode },
7861 { Bad_Opcode },
7862 /* 20 */
7863 { Bad_Opcode },
7864 { Bad_Opcode },
7865 { Bad_Opcode },
7866 { Bad_Opcode },
7867 { Bad_Opcode },
7868 { Bad_Opcode },
7869 { Bad_Opcode },
7870 { Bad_Opcode },
7871 /* 28 */
7872 { Bad_Opcode },
7873 { Bad_Opcode },
7874 { Bad_Opcode },
7875 { Bad_Opcode },
7876 { Bad_Opcode },
7877 { Bad_Opcode },
7878 { Bad_Opcode },
7879 { Bad_Opcode },
7880 /* 30 */
7881 { Bad_Opcode },
7882 { Bad_Opcode },
7883 { Bad_Opcode },
7884 { Bad_Opcode },
7885 { Bad_Opcode },
7886 { Bad_Opcode },
7887 { Bad_Opcode },
7888 { Bad_Opcode },
7889 /* 38 */
7890 { Bad_Opcode },
7891 { Bad_Opcode },
7892 { Bad_Opcode },
7893 { Bad_Opcode },
7894 { Bad_Opcode },
7895 { Bad_Opcode },
7896 { Bad_Opcode },
7897 { Bad_Opcode },
7898 /* 40 */
7899 { Bad_Opcode },
7900 { Bad_Opcode },
7901 { Bad_Opcode },
7902 { Bad_Opcode },
7903 { Bad_Opcode },
7904 { Bad_Opcode },
7905 { Bad_Opcode },
7906 { Bad_Opcode },
7907 /* 48 */
7908 { Bad_Opcode },
7909 { Bad_Opcode },
7910 { Bad_Opcode },
7911 { Bad_Opcode },
7912 { Bad_Opcode },
7913 { Bad_Opcode },
7914 { Bad_Opcode },
7915 { Bad_Opcode },
7916 /* 50 */
7917 { Bad_Opcode },
7918 { Bad_Opcode },
7919 { Bad_Opcode },
7920 { Bad_Opcode },
7921 { Bad_Opcode },
7922 { Bad_Opcode },
7923 { Bad_Opcode },
7924 { Bad_Opcode },
7925 /* 58 */
7926 { Bad_Opcode },
7927 { Bad_Opcode },
7928 { Bad_Opcode },
7929 { Bad_Opcode },
7930 { Bad_Opcode },
7931 { Bad_Opcode },
7932 { Bad_Opcode },
7933 { Bad_Opcode },
7934 /* 60 */
7935 { Bad_Opcode },
7936 { Bad_Opcode },
7937 { Bad_Opcode },
7938 { Bad_Opcode },
7939 { Bad_Opcode },
7940 { Bad_Opcode },
7941 { Bad_Opcode },
7942 { Bad_Opcode },
7943 /* 68 */
7944 { Bad_Opcode },
7945 { Bad_Opcode },
7946 { Bad_Opcode },
7947 { Bad_Opcode },
7948 { Bad_Opcode },
7949 { Bad_Opcode },
7950 { Bad_Opcode },
7951 { Bad_Opcode },
7952 /* 70 */
7953 { Bad_Opcode },
7954 { Bad_Opcode },
7955 { Bad_Opcode },
7956 { Bad_Opcode },
7957 { Bad_Opcode },
7958 { Bad_Opcode },
7959 { Bad_Opcode },
7960 { Bad_Opcode },
7961 /* 78 */
7962 { Bad_Opcode },
7963 { Bad_Opcode },
7964 { Bad_Opcode },
7965 { Bad_Opcode },
7966 { Bad_Opcode },
7967 { Bad_Opcode },
7968 { Bad_Opcode },
7969 { Bad_Opcode },
7970 /* 80 */
7971 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_80) },
7972 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_81) },
7973 { "vfrczss", { XM, EXd }, 0 },
7974 { "vfrczsd", { XM, EXq }, 0 },
7975 { Bad_Opcode },
7976 { Bad_Opcode },
7977 { Bad_Opcode },
7978 { Bad_Opcode },
7979 /* 88 */
7980 { Bad_Opcode },
7981 { Bad_Opcode },
7982 { Bad_Opcode },
7983 { Bad_Opcode },
7984 { Bad_Opcode },
7985 { Bad_Opcode },
7986 { Bad_Opcode },
7987 { Bad_Opcode },
7988 /* 90 */
7989 { "vprotb", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
7990 { "vprotw", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
7991 { "vprotd", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
7992 { "vprotq", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
7993 { "vpshlb", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
7994 { "vpshlw", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
7995 { "vpshld", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
7996 { "vpshlq", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
7997 /* 98 */
7998 { "vpshab", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
7999 { "vpshaw", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8000 { "vpshad", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8001 { "vpshaq", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8002 { Bad_Opcode },
8003 { Bad_Opcode },
8004 { Bad_Opcode },
8005 { Bad_Opcode },
8006 /* a0 */
8007 { Bad_Opcode },
8008 { Bad_Opcode },
8009 { Bad_Opcode },
8010 { Bad_Opcode },
8011 { Bad_Opcode },
8012 { Bad_Opcode },
8013 { Bad_Opcode },
8014 { Bad_Opcode },
8015 /* a8 */
8016 { Bad_Opcode },
8017 { Bad_Opcode },
8018 { Bad_Opcode },
8019 { Bad_Opcode },
8020 { Bad_Opcode },
8021 { Bad_Opcode },
8022 { Bad_Opcode },
8023 { Bad_Opcode },
8024 /* b0 */
8025 { Bad_Opcode },
8026 { Bad_Opcode },
8027 { Bad_Opcode },
8028 { Bad_Opcode },
8029 { Bad_Opcode },
8030 { Bad_Opcode },
8031 { Bad_Opcode },
8032 { Bad_Opcode },
8033 /* b8 */
8034 { Bad_Opcode },
8035 { Bad_Opcode },
8036 { Bad_Opcode },
8037 { Bad_Opcode },
8038 { Bad_Opcode },
8039 { Bad_Opcode },
8040 { Bad_Opcode },
8041 { Bad_Opcode },
8042 /* c0 */
8043 { Bad_Opcode },
8044 { "vphaddbw", { XM, EXxmm }, 0 },
8045 { "vphaddbd", { XM, EXxmm }, 0 },
8046 { "vphaddbq", { XM, EXxmm }, 0 },
8047 { Bad_Opcode },
8048 { Bad_Opcode },
8049 { "vphaddwd", { XM, EXxmm }, 0 },
8050 { "vphaddwq", { XM, EXxmm }, 0 },
8051 /* c8 */
8052 { Bad_Opcode },
8053 { Bad_Opcode },
8054 { Bad_Opcode },
8055 { "vphadddq", { XM, EXxmm }, 0 },
8056 { Bad_Opcode },
8057 { Bad_Opcode },
8058 { Bad_Opcode },
8059 { Bad_Opcode },
8060 /* d0 */
8061 { Bad_Opcode },
8062 { "vphaddubw", { XM, EXxmm }, 0 },
8063 { "vphaddubd", { XM, EXxmm }, 0 },
8064 { "vphaddubq", { XM, EXxmm }, 0 },
8065 { Bad_Opcode },
8066 { Bad_Opcode },
8067 { "vphadduwd", { XM, EXxmm }, 0 },
8068 { "vphadduwq", { XM, EXxmm }, 0 },
8069 /* d8 */
8070 { Bad_Opcode },
8071 { Bad_Opcode },
8072 { Bad_Opcode },
8073 { "vphaddudq", { XM, EXxmm }, 0 },
8074 { Bad_Opcode },
8075 { Bad_Opcode },
8076 { Bad_Opcode },
8077 { Bad_Opcode },
8078 /* e0 */
8079 { Bad_Opcode },
8080 { "vphsubbw", { XM, EXxmm }, 0 },
8081 { "vphsubwd", { XM, EXxmm }, 0 },
8082 { "vphsubdq", { XM, EXxmm }, 0 },
8083 { Bad_Opcode },
8084 { Bad_Opcode },
8085 { Bad_Opcode },
8086 { Bad_Opcode },
8087 /* e8 */
8088 { Bad_Opcode },
8089 { Bad_Opcode },
8090 { Bad_Opcode },
8091 { Bad_Opcode },
8092 { Bad_Opcode },
8093 { Bad_Opcode },
8094 { Bad_Opcode },
8095 { Bad_Opcode },
8096 /* f0 */
8097 { Bad_Opcode },
8098 { Bad_Opcode },
8099 { Bad_Opcode },
8100 { Bad_Opcode },
8101 { Bad_Opcode },
8102 { Bad_Opcode },
8103 { Bad_Opcode },
8104 { Bad_Opcode },
8105 /* f8 */
8106 { Bad_Opcode },
8107 { Bad_Opcode },
8108 { Bad_Opcode },
8109 { Bad_Opcode },
8110 { Bad_Opcode },
8111 { Bad_Opcode },
8112 { Bad_Opcode },
8113 { Bad_Opcode },
8114 },
8115 /* XOP_0A */
8116 {
8117 /* 00 */
8118 { Bad_Opcode },
8119 { Bad_Opcode },
8120 { Bad_Opcode },
8121 { Bad_Opcode },
8122 { Bad_Opcode },
8123 { Bad_Opcode },
8124 { Bad_Opcode },
8125 { Bad_Opcode },
8126 /* 08 */
8127 { Bad_Opcode },
8128 { Bad_Opcode },
8129 { Bad_Opcode },
8130 { Bad_Opcode },
8131 { Bad_Opcode },
8132 { Bad_Opcode },
8133 { Bad_Opcode },
8134 { Bad_Opcode },
8135 /* 10 */
8136 { "bextr", { Gv, Ev, Iq }, 0 },
8137 { Bad_Opcode },
8138 { REG_TABLE (REG_XOP_LWP) },
8139 { Bad_Opcode },
8140 { Bad_Opcode },
8141 { Bad_Opcode },
8142 { Bad_Opcode },
8143 { Bad_Opcode },
8144 /* 18 */
8145 { Bad_Opcode },
8146 { Bad_Opcode },
8147 { Bad_Opcode },
8148 { Bad_Opcode },
8149 { Bad_Opcode },
8150 { Bad_Opcode },
8151 { Bad_Opcode },
8152 { Bad_Opcode },
8153 /* 20 */
8154 { Bad_Opcode },
8155 { Bad_Opcode },
8156 { Bad_Opcode },
8157 { Bad_Opcode },
8158 { Bad_Opcode },
8159 { Bad_Opcode },
8160 { Bad_Opcode },
8161 { Bad_Opcode },
8162 /* 28 */
8163 { Bad_Opcode },
8164 { Bad_Opcode },
8165 { Bad_Opcode },
8166 { Bad_Opcode },
8167 { Bad_Opcode },
8168 { Bad_Opcode },
8169 { Bad_Opcode },
8170 { Bad_Opcode },
8171 /* 30 */
8172 { Bad_Opcode },
8173 { Bad_Opcode },
8174 { Bad_Opcode },
8175 { Bad_Opcode },
8176 { Bad_Opcode },
8177 { Bad_Opcode },
8178 { Bad_Opcode },
8179 { Bad_Opcode },
8180 /* 38 */
8181 { Bad_Opcode },
8182 { Bad_Opcode },
8183 { Bad_Opcode },
8184 { Bad_Opcode },
8185 { Bad_Opcode },
8186 { Bad_Opcode },
8187 { Bad_Opcode },
8188 { Bad_Opcode },
8189 /* 40 */
8190 { Bad_Opcode },
8191 { Bad_Opcode },
8192 { Bad_Opcode },
8193 { Bad_Opcode },
8194 { Bad_Opcode },
8195 { Bad_Opcode },
8196 { Bad_Opcode },
8197 { Bad_Opcode },
8198 /* 48 */
8199 { Bad_Opcode },
8200 { Bad_Opcode },
8201 { Bad_Opcode },
8202 { Bad_Opcode },
8203 { Bad_Opcode },
8204 { Bad_Opcode },
8205 { Bad_Opcode },
8206 { Bad_Opcode },
8207 /* 50 */
8208 { Bad_Opcode },
8209 { Bad_Opcode },
8210 { Bad_Opcode },
8211 { Bad_Opcode },
8212 { Bad_Opcode },
8213 { Bad_Opcode },
8214 { Bad_Opcode },
8215 { Bad_Opcode },
8216 /* 58 */
8217 { Bad_Opcode },
8218 { Bad_Opcode },
8219 { Bad_Opcode },
8220 { Bad_Opcode },
8221 { Bad_Opcode },
8222 { Bad_Opcode },
8223 { Bad_Opcode },
8224 { Bad_Opcode },
8225 /* 60 */
8226 { Bad_Opcode },
8227 { Bad_Opcode },
8228 { Bad_Opcode },
8229 { Bad_Opcode },
8230 { Bad_Opcode },
8231 { Bad_Opcode },
8232 { Bad_Opcode },
8233 { Bad_Opcode },
8234 /* 68 */
8235 { Bad_Opcode },
8236 { Bad_Opcode },
8237 { Bad_Opcode },
8238 { Bad_Opcode },
8239 { Bad_Opcode },
8240 { Bad_Opcode },
8241 { Bad_Opcode },
8242 { Bad_Opcode },
8243 /* 70 */
8244 { Bad_Opcode },
8245 { Bad_Opcode },
8246 { Bad_Opcode },
8247 { Bad_Opcode },
8248 { Bad_Opcode },
8249 { Bad_Opcode },
8250 { Bad_Opcode },
8251 { Bad_Opcode },
8252 /* 78 */
8253 { Bad_Opcode },
8254 { Bad_Opcode },
8255 { Bad_Opcode },
8256 { Bad_Opcode },
8257 { Bad_Opcode },
8258 { Bad_Opcode },
8259 { Bad_Opcode },
8260 { Bad_Opcode },
8261 /* 80 */
8262 { Bad_Opcode },
8263 { Bad_Opcode },
8264 { Bad_Opcode },
8265 { Bad_Opcode },
8266 { Bad_Opcode },
8267 { Bad_Opcode },
8268 { Bad_Opcode },
8269 { Bad_Opcode },
8270 /* 88 */
8271 { Bad_Opcode },
8272 { Bad_Opcode },
8273 { Bad_Opcode },
8274 { Bad_Opcode },
8275 { Bad_Opcode },
8276 { Bad_Opcode },
8277 { Bad_Opcode },
8278 { Bad_Opcode },
8279 /* 90 */
8280 { Bad_Opcode },
8281 { Bad_Opcode },
8282 { Bad_Opcode },
8283 { Bad_Opcode },
8284 { Bad_Opcode },
8285 { Bad_Opcode },
8286 { Bad_Opcode },
8287 { Bad_Opcode },
8288 /* 98 */
8289 { Bad_Opcode },
8290 { Bad_Opcode },
8291 { Bad_Opcode },
8292 { Bad_Opcode },
8293 { Bad_Opcode },
8294 { Bad_Opcode },
8295 { Bad_Opcode },
8296 { Bad_Opcode },
8297 /* a0 */
8298 { Bad_Opcode },
8299 { Bad_Opcode },
8300 { Bad_Opcode },
8301 { Bad_Opcode },
8302 { Bad_Opcode },
8303 { Bad_Opcode },
8304 { Bad_Opcode },
8305 { Bad_Opcode },
8306 /* a8 */
8307 { Bad_Opcode },
8308 { Bad_Opcode },
8309 { Bad_Opcode },
8310 { Bad_Opcode },
8311 { Bad_Opcode },
8312 { Bad_Opcode },
8313 { Bad_Opcode },
8314 { Bad_Opcode },
8315 /* b0 */
8316 { Bad_Opcode },
8317 { Bad_Opcode },
8318 { Bad_Opcode },
8319 { Bad_Opcode },
8320 { Bad_Opcode },
8321 { Bad_Opcode },
8322 { Bad_Opcode },
8323 { Bad_Opcode },
8324 /* b8 */
8325 { Bad_Opcode },
8326 { Bad_Opcode },
8327 { Bad_Opcode },
8328 { Bad_Opcode },
8329 { Bad_Opcode },
8330 { Bad_Opcode },
8331 { Bad_Opcode },
8332 { Bad_Opcode },
8333 /* c0 */
8334 { Bad_Opcode },
8335 { Bad_Opcode },
8336 { Bad_Opcode },
8337 { Bad_Opcode },
8338 { Bad_Opcode },
8339 { Bad_Opcode },
8340 { Bad_Opcode },
8341 { Bad_Opcode },
8342 /* c8 */
8343 { Bad_Opcode },
8344 { Bad_Opcode },
8345 { Bad_Opcode },
8346 { Bad_Opcode },
8347 { Bad_Opcode },
8348 { Bad_Opcode },
8349 { Bad_Opcode },
8350 { Bad_Opcode },
8351 /* d0 */
8352 { Bad_Opcode },
8353 { Bad_Opcode },
8354 { Bad_Opcode },
8355 { Bad_Opcode },
8356 { Bad_Opcode },
8357 { Bad_Opcode },
8358 { Bad_Opcode },
8359 { Bad_Opcode },
8360 /* d8 */
8361 { Bad_Opcode },
8362 { Bad_Opcode },
8363 { Bad_Opcode },
8364 { Bad_Opcode },
8365 { Bad_Opcode },
8366 { Bad_Opcode },
8367 { Bad_Opcode },
8368 { Bad_Opcode },
8369 /* e0 */
8370 { Bad_Opcode },
8371 { Bad_Opcode },
8372 { Bad_Opcode },
8373 { Bad_Opcode },
8374 { Bad_Opcode },
8375 { Bad_Opcode },
8376 { Bad_Opcode },
8377 { Bad_Opcode },
8378 /* e8 */
8379 { Bad_Opcode },
8380 { Bad_Opcode },
8381 { Bad_Opcode },
8382 { Bad_Opcode },
8383 { Bad_Opcode },
8384 { Bad_Opcode },
8385 { Bad_Opcode },
8386 { Bad_Opcode },
8387 /* f0 */
8388 { Bad_Opcode },
8389 { Bad_Opcode },
8390 { Bad_Opcode },
8391 { Bad_Opcode },
8392 { Bad_Opcode },
8393 { Bad_Opcode },
8394 { Bad_Opcode },
8395 { Bad_Opcode },
8396 /* f8 */
8397 { Bad_Opcode },
8398 { Bad_Opcode },
8399 { Bad_Opcode },
8400 { Bad_Opcode },
8401 { Bad_Opcode },
8402 { Bad_Opcode },
8403 { Bad_Opcode },
8404 { Bad_Opcode },
8405 },
8406 };
8407
8408 static const struct dis386 vex_table[][256] = {
8409 /* VEX_0F */
8410 {
8411 /* 00 */
8412 { Bad_Opcode },
8413 { Bad_Opcode },
8414 { Bad_Opcode },
8415 { Bad_Opcode },
8416 { Bad_Opcode },
8417 { Bad_Opcode },
8418 { Bad_Opcode },
8419 { Bad_Opcode },
8420 /* 08 */
8421 { Bad_Opcode },
8422 { Bad_Opcode },
8423 { Bad_Opcode },
8424 { Bad_Opcode },
8425 { Bad_Opcode },
8426 { Bad_Opcode },
8427 { Bad_Opcode },
8428 { Bad_Opcode },
8429 /* 10 */
8430 { PREFIX_TABLE (PREFIX_VEX_0F10) },
8431 { PREFIX_TABLE (PREFIX_VEX_0F11) },
8432 { PREFIX_TABLE (PREFIX_VEX_0F12) },
8433 { MOD_TABLE (MOD_VEX_0F13) },
8434 { "vunpcklpX", { XM, Vex, EXx }, 0 },
8435 { "vunpckhpX", { XM, Vex, EXx }, 0 },
8436 { PREFIX_TABLE (PREFIX_VEX_0F16) },
8437 { MOD_TABLE (MOD_VEX_0F17) },
8438 /* 18 */
8439 { Bad_Opcode },
8440 { Bad_Opcode },
8441 { Bad_Opcode },
8442 { Bad_Opcode },
8443 { Bad_Opcode },
8444 { Bad_Opcode },
8445 { Bad_Opcode },
8446 { Bad_Opcode },
8447 /* 20 */
8448 { Bad_Opcode },
8449 { Bad_Opcode },
8450 { Bad_Opcode },
8451 { Bad_Opcode },
8452 { Bad_Opcode },
8453 { Bad_Opcode },
8454 { Bad_Opcode },
8455 { Bad_Opcode },
8456 /* 28 */
8457 { "vmovapX", { XM, EXx }, 0 },
8458 { "vmovapX", { EXxS, XM }, 0 },
8459 { PREFIX_TABLE (PREFIX_VEX_0F2A) },
8460 { MOD_TABLE (MOD_VEX_0F2B) },
8461 { PREFIX_TABLE (PREFIX_VEX_0F2C) },
8462 { PREFIX_TABLE (PREFIX_VEX_0F2D) },
8463 { PREFIX_TABLE (PREFIX_VEX_0F2E) },
8464 { PREFIX_TABLE (PREFIX_VEX_0F2F) },
8465 /* 30 */
8466 { Bad_Opcode },
8467 { Bad_Opcode },
8468 { Bad_Opcode },
8469 { Bad_Opcode },
8470 { Bad_Opcode },
8471 { Bad_Opcode },
8472 { Bad_Opcode },
8473 { Bad_Opcode },
8474 /* 38 */
8475 { Bad_Opcode },
8476 { Bad_Opcode },
8477 { Bad_Opcode },
8478 { Bad_Opcode },
8479 { Bad_Opcode },
8480 { Bad_Opcode },
8481 { Bad_Opcode },
8482 { Bad_Opcode },
8483 /* 40 */
8484 { Bad_Opcode },
8485 { PREFIX_TABLE (PREFIX_VEX_0F41) },
8486 { PREFIX_TABLE (PREFIX_VEX_0F42) },
8487 { Bad_Opcode },
8488 { PREFIX_TABLE (PREFIX_VEX_0F44) },
8489 { PREFIX_TABLE (PREFIX_VEX_0F45) },
8490 { PREFIX_TABLE (PREFIX_VEX_0F46) },
8491 { PREFIX_TABLE (PREFIX_VEX_0F47) },
8492 /* 48 */
8493 { Bad_Opcode },
8494 { Bad_Opcode },
8495 { PREFIX_TABLE (PREFIX_VEX_0F4A) },
8496 { PREFIX_TABLE (PREFIX_VEX_0F4B) },
8497 { Bad_Opcode },
8498 { Bad_Opcode },
8499 { Bad_Opcode },
8500 { Bad_Opcode },
8501 /* 50 */
8502 { MOD_TABLE (MOD_VEX_0F50) },
8503 { PREFIX_TABLE (PREFIX_VEX_0F51) },
8504 { PREFIX_TABLE (PREFIX_VEX_0F52) },
8505 { PREFIX_TABLE (PREFIX_VEX_0F53) },
8506 { "vandpX", { XM, Vex, EXx }, 0 },
8507 { "vandnpX", { XM, Vex, EXx }, 0 },
8508 { "vorpX", { XM, Vex, EXx }, 0 },
8509 { "vxorpX", { XM, Vex, EXx }, 0 },
8510 /* 58 */
8511 { PREFIX_TABLE (PREFIX_VEX_0F58) },
8512 { PREFIX_TABLE (PREFIX_VEX_0F59) },
8513 { PREFIX_TABLE (PREFIX_VEX_0F5A) },
8514 { PREFIX_TABLE (PREFIX_VEX_0F5B) },
8515 { PREFIX_TABLE (PREFIX_VEX_0F5C) },
8516 { PREFIX_TABLE (PREFIX_VEX_0F5D) },
8517 { PREFIX_TABLE (PREFIX_VEX_0F5E) },
8518 { PREFIX_TABLE (PREFIX_VEX_0F5F) },
8519 /* 60 */
8520 { PREFIX_TABLE (PREFIX_VEX_0F60) },
8521 { PREFIX_TABLE (PREFIX_VEX_0F61) },
8522 { PREFIX_TABLE (PREFIX_VEX_0F62) },
8523 { PREFIX_TABLE (PREFIX_VEX_0F63) },
8524 { PREFIX_TABLE (PREFIX_VEX_0F64) },
8525 { PREFIX_TABLE (PREFIX_VEX_0F65) },
8526 { PREFIX_TABLE (PREFIX_VEX_0F66) },
8527 { PREFIX_TABLE (PREFIX_VEX_0F67) },
8528 /* 68 */
8529 { PREFIX_TABLE (PREFIX_VEX_0F68) },
8530 { PREFIX_TABLE (PREFIX_VEX_0F69) },
8531 { PREFIX_TABLE (PREFIX_VEX_0F6A) },
8532 { PREFIX_TABLE (PREFIX_VEX_0F6B) },
8533 { PREFIX_TABLE (PREFIX_VEX_0F6C) },
8534 { PREFIX_TABLE (PREFIX_VEX_0F6D) },
8535 { PREFIX_TABLE (PREFIX_VEX_0F6E) },
8536 { PREFIX_TABLE (PREFIX_VEX_0F6F) },
8537 /* 70 */
8538 { PREFIX_TABLE (PREFIX_VEX_0F70) },
8539 { REG_TABLE (REG_VEX_0F71) },
8540 { REG_TABLE (REG_VEX_0F72) },
8541 { REG_TABLE (REG_VEX_0F73) },
8542 { PREFIX_TABLE (PREFIX_VEX_0F74) },
8543 { PREFIX_TABLE (PREFIX_VEX_0F75) },
8544 { PREFIX_TABLE (PREFIX_VEX_0F76) },
8545 { PREFIX_TABLE (PREFIX_VEX_0F77) },
8546 /* 78 */
8547 { Bad_Opcode },
8548 { Bad_Opcode },
8549 { Bad_Opcode },
8550 { Bad_Opcode },
8551 { PREFIX_TABLE (PREFIX_VEX_0F7C) },
8552 { PREFIX_TABLE (PREFIX_VEX_0F7D) },
8553 { PREFIX_TABLE (PREFIX_VEX_0F7E) },
8554 { PREFIX_TABLE (PREFIX_VEX_0F7F) },
8555 /* 80 */
8556 { Bad_Opcode },
8557 { Bad_Opcode },
8558 { Bad_Opcode },
8559 { Bad_Opcode },
8560 { Bad_Opcode },
8561 { Bad_Opcode },
8562 { Bad_Opcode },
8563 { Bad_Opcode },
8564 /* 88 */
8565 { Bad_Opcode },
8566 { Bad_Opcode },
8567 { Bad_Opcode },
8568 { Bad_Opcode },
8569 { Bad_Opcode },
8570 { Bad_Opcode },
8571 { Bad_Opcode },
8572 { Bad_Opcode },
8573 /* 90 */
8574 { PREFIX_TABLE (PREFIX_VEX_0F90) },
8575 { PREFIX_TABLE (PREFIX_VEX_0F91) },
8576 { PREFIX_TABLE (PREFIX_VEX_0F92) },
8577 { PREFIX_TABLE (PREFIX_VEX_0F93) },
8578 { Bad_Opcode },
8579 { Bad_Opcode },
8580 { Bad_Opcode },
8581 { Bad_Opcode },
8582 /* 98 */
8583 { PREFIX_TABLE (PREFIX_VEX_0F98) },
8584 { PREFIX_TABLE (PREFIX_VEX_0F99) },
8585 { Bad_Opcode },
8586 { Bad_Opcode },
8587 { Bad_Opcode },
8588 { Bad_Opcode },
8589 { Bad_Opcode },
8590 { Bad_Opcode },
8591 /* a0 */
8592 { Bad_Opcode },
8593 { Bad_Opcode },
8594 { Bad_Opcode },
8595 { Bad_Opcode },
8596 { Bad_Opcode },
8597 { Bad_Opcode },
8598 { Bad_Opcode },
8599 { Bad_Opcode },
8600 /* a8 */
8601 { Bad_Opcode },
8602 { Bad_Opcode },
8603 { Bad_Opcode },
8604 { Bad_Opcode },
8605 { Bad_Opcode },
8606 { Bad_Opcode },
8607 { REG_TABLE (REG_VEX_0FAE) },
8608 { Bad_Opcode },
8609 /* b0 */
8610 { Bad_Opcode },
8611 { Bad_Opcode },
8612 { Bad_Opcode },
8613 { Bad_Opcode },
8614 { Bad_Opcode },
8615 { Bad_Opcode },
8616 { Bad_Opcode },
8617 { Bad_Opcode },
8618 /* b8 */
8619 { Bad_Opcode },
8620 { Bad_Opcode },
8621 { Bad_Opcode },
8622 { Bad_Opcode },
8623 { Bad_Opcode },
8624 { Bad_Opcode },
8625 { Bad_Opcode },
8626 { Bad_Opcode },
8627 /* c0 */
8628 { Bad_Opcode },
8629 { Bad_Opcode },
8630 { PREFIX_TABLE (PREFIX_VEX_0FC2) },
8631 { Bad_Opcode },
8632 { PREFIX_TABLE (PREFIX_VEX_0FC4) },
8633 { PREFIX_TABLE (PREFIX_VEX_0FC5) },
8634 { "vshufpX", { XM, Vex, EXx, Ib }, 0 },
8635 { Bad_Opcode },
8636 /* c8 */
8637 { Bad_Opcode },
8638 { Bad_Opcode },
8639 { Bad_Opcode },
8640 { Bad_Opcode },
8641 { Bad_Opcode },
8642 { Bad_Opcode },
8643 { Bad_Opcode },
8644 { Bad_Opcode },
8645 /* d0 */
8646 { PREFIX_TABLE (PREFIX_VEX_0FD0) },
8647 { PREFIX_TABLE (PREFIX_VEX_0FD1) },
8648 { PREFIX_TABLE (PREFIX_VEX_0FD2) },
8649 { PREFIX_TABLE (PREFIX_VEX_0FD3) },
8650 { PREFIX_TABLE (PREFIX_VEX_0FD4) },
8651 { PREFIX_TABLE (PREFIX_VEX_0FD5) },
8652 { PREFIX_TABLE (PREFIX_VEX_0FD6) },
8653 { PREFIX_TABLE (PREFIX_VEX_0FD7) },
8654 /* d8 */
8655 { PREFIX_TABLE (PREFIX_VEX_0FD8) },
8656 { PREFIX_TABLE (PREFIX_VEX_0FD9) },
8657 { PREFIX_TABLE (PREFIX_VEX_0FDA) },
8658 { PREFIX_TABLE (PREFIX_VEX_0FDB) },
8659 { PREFIX_TABLE (PREFIX_VEX_0FDC) },
8660 { PREFIX_TABLE (PREFIX_VEX_0FDD) },
8661 { PREFIX_TABLE (PREFIX_VEX_0FDE) },
8662 { PREFIX_TABLE (PREFIX_VEX_0FDF) },
8663 /* e0 */
8664 { PREFIX_TABLE (PREFIX_VEX_0FE0) },
8665 { PREFIX_TABLE (PREFIX_VEX_0FE1) },
8666 { PREFIX_TABLE (PREFIX_VEX_0FE2) },
8667 { PREFIX_TABLE (PREFIX_VEX_0FE3) },
8668 { PREFIX_TABLE (PREFIX_VEX_0FE4) },
8669 { PREFIX_TABLE (PREFIX_VEX_0FE5) },
8670 { PREFIX_TABLE (PREFIX_VEX_0FE6) },
8671 { PREFIX_TABLE (PREFIX_VEX_0FE7) },
8672 /* e8 */
8673 { PREFIX_TABLE (PREFIX_VEX_0FE8) },
8674 { PREFIX_TABLE (PREFIX_VEX_0FE9) },
8675 { PREFIX_TABLE (PREFIX_VEX_0FEA) },
8676 { PREFIX_TABLE (PREFIX_VEX_0FEB) },
8677 { PREFIX_TABLE (PREFIX_VEX_0FEC) },
8678 { PREFIX_TABLE (PREFIX_VEX_0FED) },
8679 { PREFIX_TABLE (PREFIX_VEX_0FEE) },
8680 { PREFIX_TABLE (PREFIX_VEX_0FEF) },
8681 /* f0 */
8682 { PREFIX_TABLE (PREFIX_VEX_0FF0) },
8683 { PREFIX_TABLE (PREFIX_VEX_0FF1) },
8684 { PREFIX_TABLE (PREFIX_VEX_0FF2) },
8685 { PREFIX_TABLE (PREFIX_VEX_0FF3) },
8686 { PREFIX_TABLE (PREFIX_VEX_0FF4) },
8687 { PREFIX_TABLE (PREFIX_VEX_0FF5) },
8688 { PREFIX_TABLE (PREFIX_VEX_0FF6) },
8689 { PREFIX_TABLE (PREFIX_VEX_0FF7) },
8690 /* f8 */
8691 { PREFIX_TABLE (PREFIX_VEX_0FF8) },
8692 { PREFIX_TABLE (PREFIX_VEX_0FF9) },
8693 { PREFIX_TABLE (PREFIX_VEX_0FFA) },
8694 { PREFIX_TABLE (PREFIX_VEX_0FFB) },
8695 { PREFIX_TABLE (PREFIX_VEX_0FFC) },
8696 { PREFIX_TABLE (PREFIX_VEX_0FFD) },
8697 { PREFIX_TABLE (PREFIX_VEX_0FFE) },
8698 { Bad_Opcode },
8699 },
8700 /* VEX_0F38 */
8701 {
8702 /* 00 */
8703 { PREFIX_TABLE (PREFIX_VEX_0F3800) },
8704 { PREFIX_TABLE (PREFIX_VEX_0F3801) },
8705 { PREFIX_TABLE (PREFIX_VEX_0F3802) },
8706 { PREFIX_TABLE (PREFIX_VEX_0F3803) },
8707 { PREFIX_TABLE (PREFIX_VEX_0F3804) },
8708 { PREFIX_TABLE (PREFIX_VEX_0F3805) },
8709 { PREFIX_TABLE (PREFIX_VEX_0F3806) },
8710 { PREFIX_TABLE (PREFIX_VEX_0F3807) },
8711 /* 08 */
8712 { PREFIX_TABLE (PREFIX_VEX_0F3808) },
8713 { PREFIX_TABLE (PREFIX_VEX_0F3809) },
8714 { PREFIX_TABLE (PREFIX_VEX_0F380A) },
8715 { PREFIX_TABLE (PREFIX_VEX_0F380B) },
8716 { PREFIX_TABLE (PREFIX_VEX_0F380C) },
8717 { PREFIX_TABLE (PREFIX_VEX_0F380D) },
8718 { PREFIX_TABLE (PREFIX_VEX_0F380E) },
8719 { PREFIX_TABLE (PREFIX_VEX_0F380F) },
8720 /* 10 */
8721 { Bad_Opcode },
8722 { Bad_Opcode },
8723 { Bad_Opcode },
8724 { PREFIX_TABLE (PREFIX_VEX_0F3813) },
8725 { Bad_Opcode },
8726 { Bad_Opcode },
8727 { PREFIX_TABLE (PREFIX_VEX_0F3816) },
8728 { PREFIX_TABLE (PREFIX_VEX_0F3817) },
8729 /* 18 */
8730 { PREFIX_TABLE (PREFIX_VEX_0F3818) },
8731 { PREFIX_TABLE (PREFIX_VEX_0F3819) },
8732 { PREFIX_TABLE (PREFIX_VEX_0F381A) },
8733 { Bad_Opcode },
8734 { PREFIX_TABLE (PREFIX_VEX_0F381C) },
8735 { PREFIX_TABLE (PREFIX_VEX_0F381D) },
8736 { PREFIX_TABLE (PREFIX_VEX_0F381E) },
8737 { Bad_Opcode },
8738 /* 20 */
8739 { PREFIX_TABLE (PREFIX_VEX_0F3820) },
8740 { PREFIX_TABLE (PREFIX_VEX_0F3821) },
8741 { PREFIX_TABLE (PREFIX_VEX_0F3822) },
8742 { PREFIX_TABLE (PREFIX_VEX_0F3823) },
8743 { PREFIX_TABLE (PREFIX_VEX_0F3824) },
8744 { PREFIX_TABLE (PREFIX_VEX_0F3825) },
8745 { Bad_Opcode },
8746 { Bad_Opcode },
8747 /* 28 */
8748 { PREFIX_TABLE (PREFIX_VEX_0F3828) },
8749 { PREFIX_TABLE (PREFIX_VEX_0F3829) },
8750 { PREFIX_TABLE (PREFIX_VEX_0F382A) },
8751 { PREFIX_TABLE (PREFIX_VEX_0F382B) },
8752 { PREFIX_TABLE (PREFIX_VEX_0F382C) },
8753 { PREFIX_TABLE (PREFIX_VEX_0F382D) },
8754 { PREFIX_TABLE (PREFIX_VEX_0F382E) },
8755 { PREFIX_TABLE (PREFIX_VEX_0F382F) },
8756 /* 30 */
8757 { PREFIX_TABLE (PREFIX_VEX_0F3830) },
8758 { PREFIX_TABLE (PREFIX_VEX_0F3831) },
8759 { PREFIX_TABLE (PREFIX_VEX_0F3832) },
8760 { PREFIX_TABLE (PREFIX_VEX_0F3833) },
8761 { PREFIX_TABLE (PREFIX_VEX_0F3834) },
8762 { PREFIX_TABLE (PREFIX_VEX_0F3835) },
8763 { PREFIX_TABLE (PREFIX_VEX_0F3836) },
8764 { PREFIX_TABLE (PREFIX_VEX_0F3837) },
8765 /* 38 */
8766 { PREFIX_TABLE (PREFIX_VEX_0F3838) },
8767 { PREFIX_TABLE (PREFIX_VEX_0F3839) },
8768 { PREFIX_TABLE (PREFIX_VEX_0F383A) },
8769 { PREFIX_TABLE (PREFIX_VEX_0F383B) },
8770 { PREFIX_TABLE (PREFIX_VEX_0F383C) },
8771 { PREFIX_TABLE (PREFIX_VEX_0F383D) },
8772 { PREFIX_TABLE (PREFIX_VEX_0F383E) },
8773 { PREFIX_TABLE (PREFIX_VEX_0F383F) },
8774 /* 40 */
8775 { PREFIX_TABLE (PREFIX_VEX_0F3840) },
8776 { PREFIX_TABLE (PREFIX_VEX_0F3841) },
8777 { Bad_Opcode },
8778 { Bad_Opcode },
8779 { Bad_Opcode },
8780 { PREFIX_TABLE (PREFIX_VEX_0F3845) },
8781 { PREFIX_TABLE (PREFIX_VEX_0F3846) },
8782 { PREFIX_TABLE (PREFIX_VEX_0F3847) },
8783 /* 48 */
8784 { Bad_Opcode },
8785 { Bad_Opcode },
8786 { Bad_Opcode },
8787 { Bad_Opcode },
8788 { Bad_Opcode },
8789 { Bad_Opcode },
8790 { Bad_Opcode },
8791 { Bad_Opcode },
8792 /* 50 */
8793 { Bad_Opcode },
8794 { Bad_Opcode },
8795 { Bad_Opcode },
8796 { Bad_Opcode },
8797 { Bad_Opcode },
8798 { Bad_Opcode },
8799 { Bad_Opcode },
8800 { Bad_Opcode },
8801 /* 58 */
8802 { PREFIX_TABLE (PREFIX_VEX_0F3858) },
8803 { PREFIX_TABLE (PREFIX_VEX_0F3859) },
8804 { PREFIX_TABLE (PREFIX_VEX_0F385A) },
8805 { Bad_Opcode },
8806 { Bad_Opcode },
8807 { Bad_Opcode },
8808 { Bad_Opcode },
8809 { Bad_Opcode },
8810 /* 60 */
8811 { Bad_Opcode },
8812 { Bad_Opcode },
8813 { Bad_Opcode },
8814 { Bad_Opcode },
8815 { Bad_Opcode },
8816 { Bad_Opcode },
8817 { Bad_Opcode },
8818 { Bad_Opcode },
8819 /* 68 */
8820 { Bad_Opcode },
8821 { Bad_Opcode },
8822 { Bad_Opcode },
8823 { Bad_Opcode },
8824 { Bad_Opcode },
8825 { Bad_Opcode },
8826 { Bad_Opcode },
8827 { Bad_Opcode },
8828 /* 70 */
8829 { Bad_Opcode },
8830 { Bad_Opcode },
8831 { Bad_Opcode },
8832 { Bad_Opcode },
8833 { Bad_Opcode },
8834 { Bad_Opcode },
8835 { Bad_Opcode },
8836 { Bad_Opcode },
8837 /* 78 */
8838 { PREFIX_TABLE (PREFIX_VEX_0F3878) },
8839 { PREFIX_TABLE (PREFIX_VEX_0F3879) },
8840 { Bad_Opcode },
8841 { Bad_Opcode },
8842 { Bad_Opcode },
8843 { Bad_Opcode },
8844 { Bad_Opcode },
8845 { Bad_Opcode },
8846 /* 80 */
8847 { Bad_Opcode },
8848 { Bad_Opcode },
8849 { Bad_Opcode },
8850 { Bad_Opcode },
8851 { Bad_Opcode },
8852 { Bad_Opcode },
8853 { Bad_Opcode },
8854 { Bad_Opcode },
8855 /* 88 */
8856 { Bad_Opcode },
8857 { Bad_Opcode },
8858 { Bad_Opcode },
8859 { Bad_Opcode },
8860 { PREFIX_TABLE (PREFIX_VEX_0F388C) },
8861 { Bad_Opcode },
8862 { PREFIX_TABLE (PREFIX_VEX_0F388E) },
8863 { Bad_Opcode },
8864 /* 90 */
8865 { PREFIX_TABLE (PREFIX_VEX_0F3890) },
8866 { PREFIX_TABLE (PREFIX_VEX_0F3891) },
8867 { PREFIX_TABLE (PREFIX_VEX_0F3892) },
8868 { PREFIX_TABLE (PREFIX_VEX_0F3893) },
8869 { Bad_Opcode },
8870 { Bad_Opcode },
8871 { PREFIX_TABLE (PREFIX_VEX_0F3896) },
8872 { PREFIX_TABLE (PREFIX_VEX_0F3897) },
8873 /* 98 */
8874 { PREFIX_TABLE (PREFIX_VEX_0F3898) },
8875 { PREFIX_TABLE (PREFIX_VEX_0F3899) },
8876 { PREFIX_TABLE (PREFIX_VEX_0F389A) },
8877 { PREFIX_TABLE (PREFIX_VEX_0F389B) },
8878 { PREFIX_TABLE (PREFIX_VEX_0F389C) },
8879 { PREFIX_TABLE (PREFIX_VEX_0F389D) },
8880 { PREFIX_TABLE (PREFIX_VEX_0F389E) },
8881 { PREFIX_TABLE (PREFIX_VEX_0F389F) },
8882 /* a0 */
8883 { Bad_Opcode },
8884 { Bad_Opcode },
8885 { Bad_Opcode },
8886 { Bad_Opcode },
8887 { Bad_Opcode },
8888 { Bad_Opcode },
8889 { PREFIX_TABLE (PREFIX_VEX_0F38A6) },
8890 { PREFIX_TABLE (PREFIX_VEX_0F38A7) },
8891 /* a8 */
8892 { PREFIX_TABLE (PREFIX_VEX_0F38A8) },
8893 { PREFIX_TABLE (PREFIX_VEX_0F38A9) },
8894 { PREFIX_TABLE (PREFIX_VEX_0F38AA) },
8895 { PREFIX_TABLE (PREFIX_VEX_0F38AB) },
8896 { PREFIX_TABLE (PREFIX_VEX_0F38AC) },
8897 { PREFIX_TABLE (PREFIX_VEX_0F38AD) },
8898 { PREFIX_TABLE (PREFIX_VEX_0F38AE) },
8899 { PREFIX_TABLE (PREFIX_VEX_0F38AF) },
8900 /* b0 */
8901 { Bad_Opcode },
8902 { Bad_Opcode },
8903 { Bad_Opcode },
8904 { Bad_Opcode },
8905 { Bad_Opcode },
8906 { Bad_Opcode },
8907 { PREFIX_TABLE (PREFIX_VEX_0F38B6) },
8908 { PREFIX_TABLE (PREFIX_VEX_0F38B7) },
8909 /* b8 */
8910 { PREFIX_TABLE (PREFIX_VEX_0F38B8) },
8911 { PREFIX_TABLE (PREFIX_VEX_0F38B9) },
8912 { PREFIX_TABLE (PREFIX_VEX_0F38BA) },
8913 { PREFIX_TABLE (PREFIX_VEX_0F38BB) },
8914 { PREFIX_TABLE (PREFIX_VEX_0F38BC) },
8915 { PREFIX_TABLE (PREFIX_VEX_0F38BD) },
8916 { PREFIX_TABLE (PREFIX_VEX_0F38BE) },
8917 { PREFIX_TABLE (PREFIX_VEX_0F38BF) },
8918 /* c0 */
8919 { Bad_Opcode },
8920 { Bad_Opcode },
8921 { Bad_Opcode },
8922 { Bad_Opcode },
8923 { Bad_Opcode },
8924 { Bad_Opcode },
8925 { Bad_Opcode },
8926 { Bad_Opcode },
8927 /* c8 */
8928 { Bad_Opcode },
8929 { Bad_Opcode },
8930 { Bad_Opcode },
8931 { Bad_Opcode },
8932 { Bad_Opcode },
8933 { Bad_Opcode },
8934 { Bad_Opcode },
8935 { PREFIX_TABLE (PREFIX_VEX_0F38CF) },
8936 /* d0 */
8937 { Bad_Opcode },
8938 { Bad_Opcode },
8939 { Bad_Opcode },
8940 { Bad_Opcode },
8941 { Bad_Opcode },
8942 { Bad_Opcode },
8943 { Bad_Opcode },
8944 { Bad_Opcode },
8945 /* d8 */
8946 { Bad_Opcode },
8947 { Bad_Opcode },
8948 { Bad_Opcode },
8949 { PREFIX_TABLE (PREFIX_VEX_0F38DB) },
8950 { PREFIX_TABLE (PREFIX_VEX_0F38DC) },
8951 { PREFIX_TABLE (PREFIX_VEX_0F38DD) },
8952 { PREFIX_TABLE (PREFIX_VEX_0F38DE) },
8953 { PREFIX_TABLE (PREFIX_VEX_0F38DF) },
8954 /* e0 */
8955 { Bad_Opcode },
8956 { Bad_Opcode },
8957 { Bad_Opcode },
8958 { Bad_Opcode },
8959 { Bad_Opcode },
8960 { Bad_Opcode },
8961 { Bad_Opcode },
8962 { Bad_Opcode },
8963 /* e8 */
8964 { Bad_Opcode },
8965 { Bad_Opcode },
8966 { Bad_Opcode },
8967 { Bad_Opcode },
8968 { Bad_Opcode },
8969 { Bad_Opcode },
8970 { Bad_Opcode },
8971 { Bad_Opcode },
8972 /* f0 */
8973 { Bad_Opcode },
8974 { Bad_Opcode },
8975 { PREFIX_TABLE (PREFIX_VEX_0F38F2) },
8976 { REG_TABLE (REG_VEX_0F38F3) },
8977 { Bad_Opcode },
8978 { PREFIX_TABLE (PREFIX_VEX_0F38F5) },
8979 { PREFIX_TABLE (PREFIX_VEX_0F38F6) },
8980 { PREFIX_TABLE (PREFIX_VEX_0F38F7) },
8981 /* f8 */
8982 { Bad_Opcode },
8983 { Bad_Opcode },
8984 { Bad_Opcode },
8985 { Bad_Opcode },
8986 { Bad_Opcode },
8987 { Bad_Opcode },
8988 { Bad_Opcode },
8989 { Bad_Opcode },
8990 },
8991 /* VEX_0F3A */
8992 {
8993 /* 00 */
8994 { PREFIX_TABLE (PREFIX_VEX_0F3A00) },
8995 { PREFIX_TABLE (PREFIX_VEX_0F3A01) },
8996 { PREFIX_TABLE (PREFIX_VEX_0F3A02) },
8997 { Bad_Opcode },
8998 { PREFIX_TABLE (PREFIX_VEX_0F3A04) },
8999 { PREFIX_TABLE (PREFIX_VEX_0F3A05) },
9000 { PREFIX_TABLE (PREFIX_VEX_0F3A06) },
9001 { Bad_Opcode },
9002 /* 08 */
9003 { PREFIX_TABLE (PREFIX_VEX_0F3A08) },
9004 { PREFIX_TABLE (PREFIX_VEX_0F3A09) },
9005 { PREFIX_TABLE (PREFIX_VEX_0F3A0A) },
9006 { PREFIX_TABLE (PREFIX_VEX_0F3A0B) },
9007 { PREFIX_TABLE (PREFIX_VEX_0F3A0C) },
9008 { PREFIX_TABLE (PREFIX_VEX_0F3A0D) },
9009 { PREFIX_TABLE (PREFIX_VEX_0F3A0E) },
9010 { PREFIX_TABLE (PREFIX_VEX_0F3A0F) },
9011 /* 10 */
9012 { Bad_Opcode },
9013 { Bad_Opcode },
9014 { Bad_Opcode },
9015 { Bad_Opcode },
9016 { PREFIX_TABLE (PREFIX_VEX_0F3A14) },
9017 { PREFIX_TABLE (PREFIX_VEX_0F3A15) },
9018 { PREFIX_TABLE (PREFIX_VEX_0F3A16) },
9019 { PREFIX_TABLE (PREFIX_VEX_0F3A17) },
9020 /* 18 */
9021 { PREFIX_TABLE (PREFIX_VEX_0F3A18) },
9022 { PREFIX_TABLE (PREFIX_VEX_0F3A19) },
9023 { Bad_Opcode },
9024 { Bad_Opcode },
9025 { Bad_Opcode },
9026 { PREFIX_TABLE (PREFIX_VEX_0F3A1D) },
9027 { Bad_Opcode },
9028 { Bad_Opcode },
9029 /* 20 */
9030 { PREFIX_TABLE (PREFIX_VEX_0F3A20) },
9031 { PREFIX_TABLE (PREFIX_VEX_0F3A21) },
9032 { PREFIX_TABLE (PREFIX_VEX_0F3A22) },
9033 { Bad_Opcode },
9034 { Bad_Opcode },
9035 { Bad_Opcode },
9036 { Bad_Opcode },
9037 { Bad_Opcode },
9038 /* 28 */
9039 { Bad_Opcode },
9040 { Bad_Opcode },
9041 { Bad_Opcode },
9042 { Bad_Opcode },
9043 { Bad_Opcode },
9044 { Bad_Opcode },
9045 { Bad_Opcode },
9046 { Bad_Opcode },
9047 /* 30 */
9048 { PREFIX_TABLE (PREFIX_VEX_0F3A30) },
9049 { PREFIX_TABLE (PREFIX_VEX_0F3A31) },
9050 { PREFIX_TABLE (PREFIX_VEX_0F3A32) },
9051 { PREFIX_TABLE (PREFIX_VEX_0F3A33) },
9052 { Bad_Opcode },
9053 { Bad_Opcode },
9054 { Bad_Opcode },
9055 { Bad_Opcode },
9056 /* 38 */
9057 { PREFIX_TABLE (PREFIX_VEX_0F3A38) },
9058 { PREFIX_TABLE (PREFIX_VEX_0F3A39) },
9059 { Bad_Opcode },
9060 { Bad_Opcode },
9061 { Bad_Opcode },
9062 { Bad_Opcode },
9063 { Bad_Opcode },
9064 { Bad_Opcode },
9065 /* 40 */
9066 { PREFIX_TABLE (PREFIX_VEX_0F3A40) },
9067 { PREFIX_TABLE (PREFIX_VEX_0F3A41) },
9068 { PREFIX_TABLE (PREFIX_VEX_0F3A42) },
9069 { Bad_Opcode },
9070 { PREFIX_TABLE (PREFIX_VEX_0F3A44) },
9071 { Bad_Opcode },
9072 { PREFIX_TABLE (PREFIX_VEX_0F3A46) },
9073 { Bad_Opcode },
9074 /* 48 */
9075 { PREFIX_TABLE (PREFIX_VEX_0F3A48) },
9076 { PREFIX_TABLE (PREFIX_VEX_0F3A49) },
9077 { PREFIX_TABLE (PREFIX_VEX_0F3A4A) },
9078 { PREFIX_TABLE (PREFIX_VEX_0F3A4B) },
9079 { PREFIX_TABLE (PREFIX_VEX_0F3A4C) },
9080 { Bad_Opcode },
9081 { Bad_Opcode },
9082 { Bad_Opcode },
9083 /* 50 */
9084 { Bad_Opcode },
9085 { Bad_Opcode },
9086 { Bad_Opcode },
9087 { Bad_Opcode },
9088 { Bad_Opcode },
9089 { Bad_Opcode },
9090 { Bad_Opcode },
9091 { Bad_Opcode },
9092 /* 58 */
9093 { Bad_Opcode },
9094 { Bad_Opcode },
9095 { Bad_Opcode },
9096 { Bad_Opcode },
9097 { PREFIX_TABLE (PREFIX_VEX_0F3A5C) },
9098 { PREFIX_TABLE (PREFIX_VEX_0F3A5D) },
9099 { PREFIX_TABLE (PREFIX_VEX_0F3A5E) },
9100 { PREFIX_TABLE (PREFIX_VEX_0F3A5F) },
9101 /* 60 */
9102 { PREFIX_TABLE (PREFIX_VEX_0F3A60) },
9103 { PREFIX_TABLE (PREFIX_VEX_0F3A61) },
9104 { PREFIX_TABLE (PREFIX_VEX_0F3A62) },
9105 { PREFIX_TABLE (PREFIX_VEX_0F3A63) },
9106 { Bad_Opcode },
9107 { Bad_Opcode },
9108 { Bad_Opcode },
9109 { Bad_Opcode },
9110 /* 68 */
9111 { PREFIX_TABLE (PREFIX_VEX_0F3A68) },
9112 { PREFIX_TABLE (PREFIX_VEX_0F3A69) },
9113 { PREFIX_TABLE (PREFIX_VEX_0F3A6A) },
9114 { PREFIX_TABLE (PREFIX_VEX_0F3A6B) },
9115 { PREFIX_TABLE (PREFIX_VEX_0F3A6C) },
9116 { PREFIX_TABLE (PREFIX_VEX_0F3A6D) },
9117 { PREFIX_TABLE (PREFIX_VEX_0F3A6E) },
9118 { PREFIX_TABLE (PREFIX_VEX_0F3A6F) },
9119 /* 70 */
9120 { Bad_Opcode },
9121 { Bad_Opcode },
9122 { Bad_Opcode },
9123 { Bad_Opcode },
9124 { Bad_Opcode },
9125 { Bad_Opcode },
9126 { Bad_Opcode },
9127 { Bad_Opcode },
9128 /* 78 */
9129 { PREFIX_TABLE (PREFIX_VEX_0F3A78) },
9130 { PREFIX_TABLE (PREFIX_VEX_0F3A79) },
9131 { PREFIX_TABLE (PREFIX_VEX_0F3A7A) },
9132 { PREFIX_TABLE (PREFIX_VEX_0F3A7B) },
9133 { PREFIX_TABLE (PREFIX_VEX_0F3A7C) },
9134 { PREFIX_TABLE (PREFIX_VEX_0F3A7D) },
9135 { PREFIX_TABLE (PREFIX_VEX_0F3A7E) },
9136 { PREFIX_TABLE (PREFIX_VEX_0F3A7F) },
9137 /* 80 */
9138 { Bad_Opcode },
9139 { Bad_Opcode },
9140 { Bad_Opcode },
9141 { Bad_Opcode },
9142 { Bad_Opcode },
9143 { Bad_Opcode },
9144 { Bad_Opcode },
9145 { Bad_Opcode },
9146 /* 88 */
9147 { Bad_Opcode },
9148 { Bad_Opcode },
9149 { Bad_Opcode },
9150 { Bad_Opcode },
9151 { Bad_Opcode },
9152 { Bad_Opcode },
9153 { Bad_Opcode },
9154 { Bad_Opcode },
9155 /* 90 */
9156 { Bad_Opcode },
9157 { Bad_Opcode },
9158 { Bad_Opcode },
9159 { Bad_Opcode },
9160 { Bad_Opcode },
9161 { Bad_Opcode },
9162 { Bad_Opcode },
9163 { Bad_Opcode },
9164 /* 98 */
9165 { Bad_Opcode },
9166 { Bad_Opcode },
9167 { Bad_Opcode },
9168 { Bad_Opcode },
9169 { Bad_Opcode },
9170 { Bad_Opcode },
9171 { Bad_Opcode },
9172 { Bad_Opcode },
9173 /* a0 */
9174 { Bad_Opcode },
9175 { Bad_Opcode },
9176 { Bad_Opcode },
9177 { Bad_Opcode },
9178 { Bad_Opcode },
9179 { Bad_Opcode },
9180 { Bad_Opcode },
9181 { Bad_Opcode },
9182 /* a8 */
9183 { Bad_Opcode },
9184 { Bad_Opcode },
9185 { Bad_Opcode },
9186 { Bad_Opcode },
9187 { Bad_Opcode },
9188 { Bad_Opcode },
9189 { Bad_Opcode },
9190 { Bad_Opcode },
9191 /* b0 */
9192 { Bad_Opcode },
9193 { Bad_Opcode },
9194 { Bad_Opcode },
9195 { Bad_Opcode },
9196 { Bad_Opcode },
9197 { Bad_Opcode },
9198 { Bad_Opcode },
9199 { Bad_Opcode },
9200 /* b8 */
9201 { Bad_Opcode },
9202 { Bad_Opcode },
9203 { Bad_Opcode },
9204 { Bad_Opcode },
9205 { Bad_Opcode },
9206 { Bad_Opcode },
9207 { Bad_Opcode },
9208 { Bad_Opcode },
9209 /* c0 */
9210 { Bad_Opcode },
9211 { Bad_Opcode },
9212 { Bad_Opcode },
9213 { Bad_Opcode },
9214 { Bad_Opcode },
9215 { Bad_Opcode },
9216 { Bad_Opcode },
9217 { Bad_Opcode },
9218 /* c8 */
9219 { Bad_Opcode },
9220 { Bad_Opcode },
9221 { Bad_Opcode },
9222 { Bad_Opcode },
9223 { Bad_Opcode },
9224 { Bad_Opcode },
9225 { PREFIX_TABLE(PREFIX_VEX_0F3ACE) },
9226 { PREFIX_TABLE(PREFIX_VEX_0F3ACF) },
9227 /* d0 */
9228 { Bad_Opcode },
9229 { Bad_Opcode },
9230 { Bad_Opcode },
9231 { Bad_Opcode },
9232 { Bad_Opcode },
9233 { Bad_Opcode },
9234 { Bad_Opcode },
9235 { Bad_Opcode },
9236 /* d8 */
9237 { Bad_Opcode },
9238 { Bad_Opcode },
9239 { Bad_Opcode },
9240 { Bad_Opcode },
9241 { Bad_Opcode },
9242 { Bad_Opcode },
9243 { Bad_Opcode },
9244 { PREFIX_TABLE (PREFIX_VEX_0F3ADF) },
9245 /* e0 */
9246 { Bad_Opcode },
9247 { Bad_Opcode },
9248 { Bad_Opcode },
9249 { Bad_Opcode },
9250 { Bad_Opcode },
9251 { Bad_Opcode },
9252 { Bad_Opcode },
9253 { Bad_Opcode },
9254 /* e8 */
9255 { Bad_Opcode },
9256 { Bad_Opcode },
9257 { Bad_Opcode },
9258 { Bad_Opcode },
9259 { Bad_Opcode },
9260 { Bad_Opcode },
9261 { Bad_Opcode },
9262 { Bad_Opcode },
9263 /* f0 */
9264 { PREFIX_TABLE (PREFIX_VEX_0F3AF0) },
9265 { Bad_Opcode },
9266 { Bad_Opcode },
9267 { Bad_Opcode },
9268 { Bad_Opcode },
9269 { Bad_Opcode },
9270 { Bad_Opcode },
9271 { Bad_Opcode },
9272 /* f8 */
9273 { Bad_Opcode },
9274 { Bad_Opcode },
9275 { Bad_Opcode },
9276 { Bad_Opcode },
9277 { Bad_Opcode },
9278 { Bad_Opcode },
9279 { Bad_Opcode },
9280 { Bad_Opcode },
9281 },
9282 };
9283
9284 #define NEED_OPCODE_TABLE
9285 #include "i386-dis-evex.h"
9286 #undef NEED_OPCODE_TABLE
9287 static const struct dis386 vex_len_table[][2] = {
9288 /* VEX_LEN_0F12_P_0_M_0 */
9289 {
9290 { "vmovlps", { XM, Vex128, EXq }, 0 },
9291 },
9292
9293 /* VEX_LEN_0F12_P_0_M_1 */
9294 {
9295 { "vmovhlps", { XM, Vex128, EXq }, 0 },
9296 },
9297
9298 /* VEX_LEN_0F12_P_2 */
9299 {
9300 { "vmovlpd", { XM, Vex128, EXq }, 0 },
9301 },
9302
9303 /* VEX_LEN_0F13_M_0 */
9304 {
9305 { "vmovlpX", { EXq, XM }, 0 },
9306 },
9307
9308 /* VEX_LEN_0F16_P_0_M_0 */
9309 {
9310 { "vmovhps", { XM, Vex128, EXq }, 0 },
9311 },
9312
9313 /* VEX_LEN_0F16_P_0_M_1 */
9314 {
9315 { "vmovlhps", { XM, Vex128, EXq }, 0 },
9316 },
9317
9318 /* VEX_LEN_0F16_P_2 */
9319 {
9320 { "vmovhpd", { XM, Vex128, EXq }, 0 },
9321 },
9322
9323 /* VEX_LEN_0F17_M_0 */
9324 {
9325 { "vmovhpX", { EXq, XM }, 0 },
9326 },
9327
9328 /* VEX_LEN_0F2A_P_1 */
9329 {
9330 { "vcvtsi2ss%LQ", { XMScalar, VexScalar, Ev }, 0 },
9331 { "vcvtsi2ss%LQ", { XMScalar, VexScalar, Ev }, 0 },
9332 },
9333
9334 /* VEX_LEN_0F2A_P_3 */
9335 {
9336 { "vcvtsi2sd%LQ", { XMScalar, VexScalar, Ev }, 0 },
9337 { "vcvtsi2sd%LQ", { XMScalar, VexScalar, Ev }, 0 },
9338 },
9339
9340 /* VEX_LEN_0F2C_P_1 */
9341 {
9342 { "vcvttss2si", { Gv, EXdScalar }, 0 },
9343 { "vcvttss2si", { Gv, EXdScalar }, 0 },
9344 },
9345
9346 /* VEX_LEN_0F2C_P_3 */
9347 {
9348 { "vcvttsd2si", { Gv, EXqScalar }, 0 },
9349 { "vcvttsd2si", { Gv, EXqScalar }, 0 },
9350 },
9351
9352 /* VEX_LEN_0F2D_P_1 */
9353 {
9354 { "vcvtss2si", { Gv, EXdScalar }, 0 },
9355 { "vcvtss2si", { Gv, EXdScalar }, 0 },
9356 },
9357
9358 /* VEX_LEN_0F2D_P_3 */
9359 {
9360 { "vcvtsd2si", { Gv, EXqScalar }, 0 },
9361 { "vcvtsd2si", { Gv, EXqScalar }, 0 },
9362 },
9363
9364 /* VEX_LEN_0F41_P_0 */
9365 {
9366 { Bad_Opcode },
9367 { VEX_W_TABLE (VEX_W_0F41_P_0_LEN_1) },
9368 },
9369 /* VEX_LEN_0F41_P_2 */
9370 {
9371 { Bad_Opcode },
9372 { VEX_W_TABLE (VEX_W_0F41_P_2_LEN_1) },
9373 },
9374 /* VEX_LEN_0F42_P_0 */
9375 {
9376 { Bad_Opcode },
9377 { VEX_W_TABLE (VEX_W_0F42_P_0_LEN_1) },
9378 },
9379 /* VEX_LEN_0F42_P_2 */
9380 {
9381 { Bad_Opcode },
9382 { VEX_W_TABLE (VEX_W_0F42_P_2_LEN_1) },
9383 },
9384 /* VEX_LEN_0F44_P_0 */
9385 {
9386 { VEX_W_TABLE (VEX_W_0F44_P_0_LEN_0) },
9387 },
9388 /* VEX_LEN_0F44_P_2 */
9389 {
9390 { VEX_W_TABLE (VEX_W_0F44_P_2_LEN_0) },
9391 },
9392 /* VEX_LEN_0F45_P_0 */
9393 {
9394 { Bad_Opcode },
9395 { VEX_W_TABLE (VEX_W_0F45_P_0_LEN_1) },
9396 },
9397 /* VEX_LEN_0F45_P_2 */
9398 {
9399 { Bad_Opcode },
9400 { VEX_W_TABLE (VEX_W_0F45_P_2_LEN_1) },
9401 },
9402 /* VEX_LEN_0F46_P_0 */
9403 {
9404 { Bad_Opcode },
9405 { VEX_W_TABLE (VEX_W_0F46_P_0_LEN_1) },
9406 },
9407 /* VEX_LEN_0F46_P_2 */
9408 {
9409 { Bad_Opcode },
9410 { VEX_W_TABLE (VEX_W_0F46_P_2_LEN_1) },
9411 },
9412 /* VEX_LEN_0F47_P_0 */
9413 {
9414 { Bad_Opcode },
9415 { VEX_W_TABLE (VEX_W_0F47_P_0_LEN_1) },
9416 },
9417 /* VEX_LEN_0F47_P_2 */
9418 {
9419 { Bad_Opcode },
9420 { VEX_W_TABLE (VEX_W_0F47_P_2_LEN_1) },
9421 },
9422 /* VEX_LEN_0F4A_P_0 */
9423 {
9424 { Bad_Opcode },
9425 { VEX_W_TABLE (VEX_W_0F4A_P_0_LEN_1) },
9426 },
9427 /* VEX_LEN_0F4A_P_2 */
9428 {
9429 { Bad_Opcode },
9430 { VEX_W_TABLE (VEX_W_0F4A_P_2_LEN_1) },
9431 },
9432 /* VEX_LEN_0F4B_P_0 */
9433 {
9434 { Bad_Opcode },
9435 { VEX_W_TABLE (VEX_W_0F4B_P_0_LEN_1) },
9436 },
9437 /* VEX_LEN_0F4B_P_2 */
9438 {
9439 { Bad_Opcode },
9440 { VEX_W_TABLE (VEX_W_0F4B_P_2_LEN_1) },
9441 },
9442
9443 /* VEX_LEN_0F6E_P_2 */
9444 {
9445 { "vmovK", { XMScalar, Edq }, 0 },
9446 },
9447
9448 /* VEX_LEN_0F77_P_1 */
9449 {
9450 { "vzeroupper", { XX }, 0 },
9451 { "vzeroall", { XX }, 0 },
9452 },
9453
9454 /* VEX_LEN_0F7E_P_1 */
9455 {
9456 { "vmovq", { XMScalar, EXqScalar }, 0 },
9457 },
9458
9459 /* VEX_LEN_0F7E_P_2 */
9460 {
9461 { "vmovK", { Edq, XMScalar }, 0 },
9462 },
9463
9464 /* VEX_LEN_0F90_P_0 */
9465 {
9466 { VEX_W_TABLE (VEX_W_0F90_P_0_LEN_0) },
9467 },
9468
9469 /* VEX_LEN_0F90_P_2 */
9470 {
9471 { VEX_W_TABLE (VEX_W_0F90_P_2_LEN_0) },
9472 },
9473
9474 /* VEX_LEN_0F91_P_0 */
9475 {
9476 { VEX_W_TABLE (VEX_W_0F91_P_0_LEN_0) },
9477 },
9478
9479 /* VEX_LEN_0F91_P_2 */
9480 {
9481 { VEX_W_TABLE (VEX_W_0F91_P_2_LEN_0) },
9482 },
9483
9484 /* VEX_LEN_0F92_P_0 */
9485 {
9486 { VEX_W_TABLE (VEX_W_0F92_P_0_LEN_0) },
9487 },
9488
9489 /* VEX_LEN_0F92_P_2 */
9490 {
9491 { VEX_W_TABLE (VEX_W_0F92_P_2_LEN_0) },
9492 },
9493
9494 /* VEX_LEN_0F92_P_3 */
9495 {
9496 { VEX_W_TABLE (VEX_W_0F92_P_3_LEN_0) },
9497 },
9498
9499 /* VEX_LEN_0F93_P_0 */
9500 {
9501 { VEX_W_TABLE (VEX_W_0F93_P_0_LEN_0) },
9502 },
9503
9504 /* VEX_LEN_0F93_P_2 */
9505 {
9506 { VEX_W_TABLE (VEX_W_0F93_P_2_LEN_0) },
9507 },
9508
9509 /* VEX_LEN_0F93_P_3 */
9510 {
9511 { VEX_W_TABLE (VEX_W_0F93_P_3_LEN_0) },
9512 },
9513
9514 /* VEX_LEN_0F98_P_0 */
9515 {
9516 { VEX_W_TABLE (VEX_W_0F98_P_0_LEN_0) },
9517 },
9518
9519 /* VEX_LEN_0F98_P_2 */
9520 {
9521 { VEX_W_TABLE (VEX_W_0F98_P_2_LEN_0) },
9522 },
9523
9524 /* VEX_LEN_0F99_P_0 */
9525 {
9526 { VEX_W_TABLE (VEX_W_0F99_P_0_LEN_0) },
9527 },
9528
9529 /* VEX_LEN_0F99_P_2 */
9530 {
9531 { VEX_W_TABLE (VEX_W_0F99_P_2_LEN_0) },
9532 },
9533
9534 /* VEX_LEN_0FAE_R_2_M_0 */
9535 {
9536 { "vldmxcsr", { Md }, 0 },
9537 },
9538
9539 /* VEX_LEN_0FAE_R_3_M_0 */
9540 {
9541 { "vstmxcsr", { Md }, 0 },
9542 },
9543
9544 /* VEX_LEN_0FC4_P_2 */
9545 {
9546 { VEX_W_TABLE (VEX_W_0FC4_P_2) },
9547 },
9548
9549 /* VEX_LEN_0FC5_P_2 */
9550 {
9551 { VEX_W_TABLE (VEX_W_0FC5_P_2) },
9552 },
9553
9554 /* VEX_LEN_0FD6_P_2 */
9555 {
9556 { "vmovq", { EXqScalarS, XMScalar }, 0 },
9557 },
9558
9559 /* VEX_LEN_0FF7_P_2 */
9560 {
9561 { "vmaskmovdqu", { XM, XS }, 0 },
9562 },
9563
9564 /* VEX_LEN_0F3816_P_2 */
9565 {
9566 { Bad_Opcode },
9567 { VEX_W_TABLE (VEX_W_0F3816_P_2) },
9568 },
9569
9570 /* VEX_LEN_0F3819_P_2 */
9571 {
9572 { Bad_Opcode },
9573 { VEX_W_TABLE (VEX_W_0F3819_P_2) },
9574 },
9575
9576 /* VEX_LEN_0F381A_P_2_M_0 */
9577 {
9578 { Bad_Opcode },
9579 { VEX_W_TABLE (VEX_W_0F381A_P_2_M_0) },
9580 },
9581
9582 /* VEX_LEN_0F3836_P_2 */
9583 {
9584 { Bad_Opcode },
9585 { VEX_W_TABLE (VEX_W_0F3836_P_2) },
9586 },
9587
9588 /* VEX_LEN_0F3841_P_2 */
9589 {
9590 { "vphminposuw", { XM, EXx }, 0 },
9591 },
9592
9593 /* VEX_LEN_0F385A_P_2_M_0 */
9594 {
9595 { Bad_Opcode },
9596 { VEX_W_TABLE (VEX_W_0F385A_P_2_M_0) },
9597 },
9598
9599 /* VEX_LEN_0F38DB_P_2 */
9600 {
9601 { "vaesimc", { XM, EXx }, 0 },
9602 },
9603
9604 /* VEX_LEN_0F38F2_P_0 */
9605 {
9606 { "andnS", { Gdq, VexGdq, Edq }, 0 },
9607 },
9608
9609 /* VEX_LEN_0F38F3_R_1_P_0 */
9610 {
9611 { "blsrS", { VexGdq, Edq }, 0 },
9612 },
9613
9614 /* VEX_LEN_0F38F3_R_2_P_0 */
9615 {
9616 { "blsmskS", { VexGdq, Edq }, 0 },
9617 },
9618
9619 /* VEX_LEN_0F38F3_R_3_P_0 */
9620 {
9621 { "blsiS", { VexGdq, Edq }, 0 },
9622 },
9623
9624 /* VEX_LEN_0F38F5_P_0 */
9625 {
9626 { "bzhiS", { Gdq, Edq, VexGdq }, 0 },
9627 },
9628
9629 /* VEX_LEN_0F38F5_P_1 */
9630 {
9631 { "pextS", { Gdq, VexGdq, Edq }, 0 },
9632 },
9633
9634 /* VEX_LEN_0F38F5_P_3 */
9635 {
9636 { "pdepS", { Gdq, VexGdq, Edq }, 0 },
9637 },
9638
9639 /* VEX_LEN_0F38F6_P_3 */
9640 {
9641 { "mulxS", { Gdq, VexGdq, Edq }, 0 },
9642 },
9643
9644 /* VEX_LEN_0F38F7_P_0 */
9645 {
9646 { "bextrS", { Gdq, Edq, VexGdq }, 0 },
9647 },
9648
9649 /* VEX_LEN_0F38F7_P_1 */
9650 {
9651 { "sarxS", { Gdq, Edq, VexGdq }, 0 },
9652 },
9653
9654 /* VEX_LEN_0F38F7_P_2 */
9655 {
9656 { "shlxS", { Gdq, Edq, VexGdq }, 0 },
9657 },
9658
9659 /* VEX_LEN_0F38F7_P_3 */
9660 {
9661 { "shrxS", { Gdq, Edq, VexGdq }, 0 },
9662 },
9663
9664 /* VEX_LEN_0F3A00_P_2 */
9665 {
9666 { Bad_Opcode },
9667 { VEX_W_TABLE (VEX_W_0F3A00_P_2) },
9668 },
9669
9670 /* VEX_LEN_0F3A01_P_2 */
9671 {
9672 { Bad_Opcode },
9673 { VEX_W_TABLE (VEX_W_0F3A01_P_2) },
9674 },
9675
9676 /* VEX_LEN_0F3A06_P_2 */
9677 {
9678 { Bad_Opcode },
9679 { VEX_W_TABLE (VEX_W_0F3A06_P_2) },
9680 },
9681
9682 /* VEX_LEN_0F3A14_P_2 */
9683 {
9684 { VEX_W_TABLE (VEX_W_0F3A14_P_2) },
9685 },
9686
9687 /* VEX_LEN_0F3A15_P_2 */
9688 {
9689 { VEX_W_TABLE (VEX_W_0F3A15_P_2) },
9690 },
9691
9692 /* VEX_LEN_0F3A16_P_2 */
9693 {
9694 { "vpextrK", { Edq, XM, Ib }, 0 },
9695 },
9696
9697 /* VEX_LEN_0F3A17_P_2 */
9698 {
9699 { "vextractps", { Edqd, XM, Ib }, 0 },
9700 },
9701
9702 /* VEX_LEN_0F3A18_P_2 */
9703 {
9704 { Bad_Opcode },
9705 { VEX_W_TABLE (VEX_W_0F3A18_P_2) },
9706 },
9707
9708 /* VEX_LEN_0F3A19_P_2 */
9709 {
9710 { Bad_Opcode },
9711 { VEX_W_TABLE (VEX_W_0F3A19_P_2) },
9712 },
9713
9714 /* VEX_LEN_0F3A20_P_2 */
9715 {
9716 { VEX_W_TABLE (VEX_W_0F3A20_P_2) },
9717 },
9718
9719 /* VEX_LEN_0F3A21_P_2 */
9720 {
9721 { "vinsertps", { XM, Vex128, EXd, Ib }, 0 },
9722 },
9723
9724 /* VEX_LEN_0F3A22_P_2 */
9725 {
9726 { "vpinsrK", { XM, Vex128, Edq, Ib }, 0 },
9727 },
9728
9729 /* VEX_LEN_0F3A30_P_2 */
9730 {
9731 { VEX_W_TABLE (VEX_W_0F3A30_P_2_LEN_0) },
9732 },
9733
9734 /* VEX_LEN_0F3A31_P_2 */
9735 {
9736 { VEX_W_TABLE (VEX_W_0F3A31_P_2_LEN_0) },
9737 },
9738
9739 /* VEX_LEN_0F3A32_P_2 */
9740 {
9741 { VEX_W_TABLE (VEX_W_0F3A32_P_2_LEN_0) },
9742 },
9743
9744 /* VEX_LEN_0F3A33_P_2 */
9745 {
9746 { VEX_W_TABLE (VEX_W_0F3A33_P_2_LEN_0) },
9747 },
9748
9749 /* VEX_LEN_0F3A38_P_2 */
9750 {
9751 { Bad_Opcode },
9752 { VEX_W_TABLE (VEX_W_0F3A38_P_2) },
9753 },
9754
9755 /* VEX_LEN_0F3A39_P_2 */
9756 {
9757 { Bad_Opcode },
9758 { VEX_W_TABLE (VEX_W_0F3A39_P_2) },
9759 },
9760
9761 /* VEX_LEN_0F3A41_P_2 */
9762 {
9763 { "vdppd", { XM, Vex128, EXx, Ib }, 0 },
9764 },
9765
9766 /* VEX_LEN_0F3A46_P_2 */
9767 {
9768 { Bad_Opcode },
9769 { VEX_W_TABLE (VEX_W_0F3A46_P_2) },
9770 },
9771
9772 /* VEX_LEN_0F3A60_P_2 */
9773 {
9774 { "vpcmpestrm", { XM, { PCMPESTR_Fixup, x_mode }, Ib }, 0 },
9775 },
9776
9777 /* VEX_LEN_0F3A61_P_2 */
9778 {
9779 { "vpcmpestri", { XM, { PCMPESTR_Fixup, x_mode }, Ib }, 0 },
9780 },
9781
9782 /* VEX_LEN_0F3A62_P_2 */
9783 {
9784 { "vpcmpistrm", { XM, EXx, Ib }, 0 },
9785 },
9786
9787 /* VEX_LEN_0F3A63_P_2 */
9788 {
9789 { "vpcmpistri", { XM, EXx, Ib }, 0 },
9790 },
9791
9792 /* VEX_LEN_0F3A6A_P_2 */
9793 {
9794 { "vfmaddss", { XMVexW, Vex128, EXdVexW, EXdVexW }, 0 },
9795 },
9796
9797 /* VEX_LEN_0F3A6B_P_2 */
9798 {
9799 { "vfmaddsd", { XMVexW, Vex128, EXqVexW, EXqVexW }, 0 },
9800 },
9801
9802 /* VEX_LEN_0F3A6E_P_2 */
9803 {
9804 { "vfmsubss", { XMVexW, Vex128, EXdVexW, EXdVexW }, 0 },
9805 },
9806
9807 /* VEX_LEN_0F3A6F_P_2 */
9808 {
9809 { "vfmsubsd", { XMVexW, Vex128, EXqVexW, EXqVexW }, 0 },
9810 },
9811
9812 /* VEX_LEN_0F3A7A_P_2 */
9813 {
9814 { "vfnmaddss", { XMVexW, Vex128, EXdVexW, EXdVexW }, 0 },
9815 },
9816
9817 /* VEX_LEN_0F3A7B_P_2 */
9818 {
9819 { "vfnmaddsd", { XMVexW, Vex128, EXqVexW, EXqVexW }, 0 },
9820 },
9821
9822 /* VEX_LEN_0F3A7E_P_2 */
9823 {
9824 { "vfnmsubss", { XMVexW, Vex128, EXdVexW, EXdVexW }, 0 },
9825 },
9826
9827 /* VEX_LEN_0F3A7F_P_2 */
9828 {
9829 { "vfnmsubsd", { XMVexW, Vex128, EXqVexW, EXqVexW }, 0 },
9830 },
9831
9832 /* VEX_LEN_0F3ADF_P_2 */
9833 {
9834 { "vaeskeygenassist", { XM, EXx, Ib }, 0 },
9835 },
9836
9837 /* VEX_LEN_0F3AF0_P_3 */
9838 {
9839 { "rorxS", { Gdq, Edq, Ib }, 0 },
9840 },
9841
9842 /* VEX_LEN_0FXOP_08_CC */
9843 {
9844 { "vpcomb", { XM, Vex128, EXx, VPCOM }, 0 },
9845 },
9846
9847 /* VEX_LEN_0FXOP_08_CD */
9848 {
9849 { "vpcomw", { XM, Vex128, EXx, VPCOM }, 0 },
9850 },
9851
9852 /* VEX_LEN_0FXOP_08_CE */
9853 {
9854 { "vpcomd", { XM, Vex128, EXx, VPCOM }, 0 },
9855 },
9856
9857 /* VEX_LEN_0FXOP_08_CF */
9858 {
9859 { "vpcomq", { XM, Vex128, EXx, VPCOM }, 0 },
9860 },
9861
9862 /* VEX_LEN_0FXOP_08_EC */
9863 {
9864 { "vpcomub", { XM, Vex128, EXx, VPCOM }, 0 },
9865 },
9866
9867 /* VEX_LEN_0FXOP_08_ED */
9868 {
9869 { "vpcomuw", { XM, Vex128, EXx, VPCOM }, 0 },
9870 },
9871
9872 /* VEX_LEN_0FXOP_08_EE */
9873 {
9874 { "vpcomud", { XM, Vex128, EXx, VPCOM }, 0 },
9875 },
9876
9877 /* VEX_LEN_0FXOP_08_EF */
9878 {
9879 { "vpcomuq", { XM, Vex128, EXx, VPCOM }, 0 },
9880 },
9881
9882 /* VEX_LEN_0FXOP_09_80 */
9883 {
9884 { "vfrczps", { XM, EXxmm }, 0 },
9885 { "vfrczps", { XM, EXymmq }, 0 },
9886 },
9887
9888 /* VEX_LEN_0FXOP_09_81 */
9889 {
9890 { "vfrczpd", { XM, EXxmm }, 0 },
9891 { "vfrczpd", { XM, EXymmq }, 0 },
9892 },
9893 };
9894
9895 static const struct dis386 evex_len_table[][3] = {
9896 #define NEED_EVEX_LEN_TABLE
9897 #include "i386-dis-evex.h"
9898 #undef NEED_EVEX_LEN_TABLE
9899 };
9900
9901 static const struct dis386 vex_w_table[][2] = {
9902 {
9903 /* VEX_W_0F41_P_0_LEN_1 */
9904 { MOD_TABLE (MOD_VEX_W_0_0F41_P_0_LEN_1) },
9905 { MOD_TABLE (MOD_VEX_W_1_0F41_P_0_LEN_1) },
9906 },
9907 {
9908 /* VEX_W_0F41_P_2_LEN_1 */
9909 { MOD_TABLE (MOD_VEX_W_0_0F41_P_2_LEN_1) },
9910 { MOD_TABLE (MOD_VEX_W_1_0F41_P_2_LEN_1) }
9911 },
9912 {
9913 /* VEX_W_0F42_P_0_LEN_1 */
9914 { MOD_TABLE (MOD_VEX_W_0_0F42_P_0_LEN_1) },
9915 { MOD_TABLE (MOD_VEX_W_1_0F42_P_0_LEN_1) },
9916 },
9917 {
9918 /* VEX_W_0F42_P_2_LEN_1 */
9919 { MOD_TABLE (MOD_VEX_W_0_0F42_P_2_LEN_1) },
9920 { MOD_TABLE (MOD_VEX_W_1_0F42_P_2_LEN_1) },
9921 },
9922 {
9923 /* VEX_W_0F44_P_0_LEN_0 */
9924 { MOD_TABLE (MOD_VEX_W_0_0F44_P_0_LEN_1) },
9925 { MOD_TABLE (MOD_VEX_W_1_0F44_P_0_LEN_1) },
9926 },
9927 {
9928 /* VEX_W_0F44_P_2_LEN_0 */
9929 { MOD_TABLE (MOD_VEX_W_0_0F44_P_2_LEN_1) },
9930 { MOD_TABLE (MOD_VEX_W_1_0F44_P_2_LEN_1) },
9931 },
9932 {
9933 /* VEX_W_0F45_P_0_LEN_1 */
9934 { MOD_TABLE (MOD_VEX_W_0_0F45_P_0_LEN_1) },
9935 { MOD_TABLE (MOD_VEX_W_1_0F45_P_0_LEN_1) },
9936 },
9937 {
9938 /* VEX_W_0F45_P_2_LEN_1 */
9939 { MOD_TABLE (MOD_VEX_W_0_0F45_P_2_LEN_1) },
9940 { MOD_TABLE (MOD_VEX_W_1_0F45_P_2_LEN_1) },
9941 },
9942 {
9943 /* VEX_W_0F46_P_0_LEN_1 */
9944 { MOD_TABLE (MOD_VEX_W_0_0F46_P_0_LEN_1) },
9945 { MOD_TABLE (MOD_VEX_W_1_0F46_P_0_LEN_1) },
9946 },
9947 {
9948 /* VEX_W_0F46_P_2_LEN_1 */
9949 { MOD_TABLE (MOD_VEX_W_0_0F46_P_2_LEN_1) },
9950 { MOD_TABLE (MOD_VEX_W_1_0F46_P_2_LEN_1) },
9951 },
9952 {
9953 /* VEX_W_0F47_P_0_LEN_1 */
9954 { MOD_TABLE (MOD_VEX_W_0_0F47_P_0_LEN_1) },
9955 { MOD_TABLE (MOD_VEX_W_1_0F47_P_0_LEN_1) },
9956 },
9957 {
9958 /* VEX_W_0F47_P_2_LEN_1 */
9959 { MOD_TABLE (MOD_VEX_W_0_0F47_P_2_LEN_1) },
9960 { MOD_TABLE (MOD_VEX_W_1_0F47_P_2_LEN_1) },
9961 },
9962 {
9963 /* VEX_W_0F4A_P_0_LEN_1 */
9964 { MOD_TABLE (MOD_VEX_W_0_0F4A_P_0_LEN_1) },
9965 { MOD_TABLE (MOD_VEX_W_1_0F4A_P_0_LEN_1) },
9966 },
9967 {
9968 /* VEX_W_0F4A_P_2_LEN_1 */
9969 { MOD_TABLE (MOD_VEX_W_0_0F4A_P_2_LEN_1) },
9970 { MOD_TABLE (MOD_VEX_W_1_0F4A_P_2_LEN_1) },
9971 },
9972 {
9973 /* VEX_W_0F4B_P_0_LEN_1 */
9974 { MOD_TABLE (MOD_VEX_W_0_0F4B_P_0_LEN_1) },
9975 { MOD_TABLE (MOD_VEX_W_1_0F4B_P_0_LEN_1) },
9976 },
9977 {
9978 /* VEX_W_0F4B_P_2_LEN_1 */
9979 { MOD_TABLE (MOD_VEX_W_0_0F4B_P_2_LEN_1) },
9980 },
9981 {
9982 /* VEX_W_0F90_P_0_LEN_0 */
9983 { "kmovw", { MaskG, MaskE }, 0 },
9984 { "kmovq", { MaskG, MaskE }, 0 },
9985 },
9986 {
9987 /* VEX_W_0F90_P_2_LEN_0 */
9988 { "kmovb", { MaskG, MaskBDE }, 0 },
9989 { "kmovd", { MaskG, MaskBDE }, 0 },
9990 },
9991 {
9992 /* VEX_W_0F91_P_0_LEN_0 */
9993 { MOD_TABLE (MOD_VEX_W_0_0F91_P_0_LEN_0) },
9994 { MOD_TABLE (MOD_VEX_W_1_0F91_P_0_LEN_0) },
9995 },
9996 {
9997 /* VEX_W_0F91_P_2_LEN_0 */
9998 { MOD_TABLE (MOD_VEX_W_0_0F91_P_2_LEN_0) },
9999 { MOD_TABLE (MOD_VEX_W_1_0F91_P_2_LEN_0) },
10000 },
10001 {
10002 /* VEX_W_0F92_P_0_LEN_0 */
10003 { MOD_TABLE (MOD_VEX_W_0_0F92_P_0_LEN_0) },
10004 },
10005 {
10006 /* VEX_W_0F92_P_2_LEN_0 */
10007 { MOD_TABLE (MOD_VEX_W_0_0F92_P_2_LEN_0) },
10008 },
10009 {
10010 /* VEX_W_0F92_P_3_LEN_0 */
10011 { MOD_TABLE (MOD_VEX_W_0_0F92_P_3_LEN_0) },
10012 { MOD_TABLE (MOD_VEX_W_1_0F92_P_3_LEN_0) },
10013 },
10014 {
10015 /* VEX_W_0F93_P_0_LEN_0 */
10016 { MOD_TABLE (MOD_VEX_W_0_0F93_P_0_LEN_0) },
10017 },
10018 {
10019 /* VEX_W_0F93_P_2_LEN_0 */
10020 { MOD_TABLE (MOD_VEX_W_0_0F93_P_2_LEN_0) },
10021 },
10022 {
10023 /* VEX_W_0F93_P_3_LEN_0 */
10024 { MOD_TABLE (MOD_VEX_W_0_0F93_P_3_LEN_0) },
10025 { MOD_TABLE (MOD_VEX_W_1_0F93_P_3_LEN_0) },
10026 },
10027 {
10028 /* VEX_W_0F98_P_0_LEN_0 */
10029 { MOD_TABLE (MOD_VEX_W_0_0F98_P_0_LEN_0) },
10030 { MOD_TABLE (MOD_VEX_W_1_0F98_P_0_LEN_0) },
10031 },
10032 {
10033 /* VEX_W_0F98_P_2_LEN_0 */
10034 { MOD_TABLE (MOD_VEX_W_0_0F98_P_2_LEN_0) },
10035 { MOD_TABLE (MOD_VEX_W_1_0F98_P_2_LEN_0) },
10036 },
10037 {
10038 /* VEX_W_0F99_P_0_LEN_0 */
10039 { MOD_TABLE (MOD_VEX_W_0_0F99_P_0_LEN_0) },
10040 { MOD_TABLE (MOD_VEX_W_1_0F99_P_0_LEN_0) },
10041 },
10042 {
10043 /* VEX_W_0F99_P_2_LEN_0 */
10044 { MOD_TABLE (MOD_VEX_W_0_0F99_P_2_LEN_0) },
10045 { MOD_TABLE (MOD_VEX_W_1_0F99_P_2_LEN_0) },
10046 },
10047 {
10048 /* VEX_W_0FC4_P_2 */
10049 { "vpinsrw", { XM, Vex128, Edqw, Ib }, 0 },
10050 },
10051 {
10052 /* VEX_W_0FC5_P_2 */
10053 { "vpextrw", { Gdq, XS, Ib }, 0 },
10054 },
10055 {
10056 /* VEX_W_0F380C_P_2 */
10057 { "vpermilps", { XM, Vex, EXx }, 0 },
10058 },
10059 {
10060 /* VEX_W_0F380D_P_2 */
10061 { "vpermilpd", { XM, Vex, EXx }, 0 },
10062 },
10063 {
10064 /* VEX_W_0F380E_P_2 */
10065 { "vtestps", { XM, EXx }, 0 },
10066 },
10067 {
10068 /* VEX_W_0F380F_P_2 */
10069 { "vtestpd", { XM, EXx }, 0 },
10070 },
10071 {
10072 /* VEX_W_0F3816_P_2 */
10073 { "vpermps", { XM, Vex, EXx }, 0 },
10074 },
10075 {
10076 /* VEX_W_0F3818_P_2 */
10077 { "vbroadcastss", { XM, EXxmm_md }, 0 },
10078 },
10079 {
10080 /* VEX_W_0F3819_P_2 */
10081 { "vbroadcastsd", { XM, EXxmm_mq }, 0 },
10082 },
10083 {
10084 /* VEX_W_0F381A_P_2_M_0 */
10085 { "vbroadcastf128", { XM, Mxmm }, 0 },
10086 },
10087 {
10088 /* VEX_W_0F382C_P_2_M_0 */
10089 { "vmaskmovps", { XM, Vex, Mx }, 0 },
10090 },
10091 {
10092 /* VEX_W_0F382D_P_2_M_0 */
10093 { "vmaskmovpd", { XM, Vex, Mx }, 0 },
10094 },
10095 {
10096 /* VEX_W_0F382E_P_2_M_0 */
10097 { "vmaskmovps", { Mx, Vex, XM }, 0 },
10098 },
10099 {
10100 /* VEX_W_0F382F_P_2_M_0 */
10101 { "vmaskmovpd", { Mx, Vex, XM }, 0 },
10102 },
10103 {
10104 /* VEX_W_0F3836_P_2 */
10105 { "vpermd", { XM, Vex, EXx }, 0 },
10106 },
10107 {
10108 /* VEX_W_0F3846_P_2 */
10109 { "vpsravd", { XM, Vex, EXx }, 0 },
10110 },
10111 {
10112 /* VEX_W_0F3858_P_2 */
10113 { "vpbroadcastd", { XM, EXxmm_md }, 0 },
10114 },
10115 {
10116 /* VEX_W_0F3859_P_2 */
10117 { "vpbroadcastq", { XM, EXxmm_mq }, 0 },
10118 },
10119 {
10120 /* VEX_W_0F385A_P_2_M_0 */
10121 { "vbroadcasti128", { XM, Mxmm }, 0 },
10122 },
10123 {
10124 /* VEX_W_0F3878_P_2 */
10125 { "vpbroadcastb", { XM, EXxmm_mb }, 0 },
10126 },
10127 {
10128 /* VEX_W_0F3879_P_2 */
10129 { "vpbroadcastw", { XM, EXxmm_mw }, 0 },
10130 },
10131 {
10132 /* VEX_W_0F38CF_P_2 */
10133 { "vgf2p8mulb", { XM, Vex, EXx }, 0 },
10134 },
10135 {
10136 /* VEX_W_0F3A00_P_2 */
10137 { Bad_Opcode },
10138 { "vpermq", { XM, EXx, Ib }, 0 },
10139 },
10140 {
10141 /* VEX_W_0F3A01_P_2 */
10142 { Bad_Opcode },
10143 { "vpermpd", { XM, EXx, Ib }, 0 },
10144 },
10145 {
10146 /* VEX_W_0F3A02_P_2 */
10147 { "vpblendd", { XM, Vex, EXx, Ib }, 0 },
10148 },
10149 {
10150 /* VEX_W_0F3A04_P_2 */
10151 { "vpermilps", { XM, EXx, Ib }, 0 },
10152 },
10153 {
10154 /* VEX_W_0F3A05_P_2 */
10155 { "vpermilpd", { XM, EXx, Ib }, 0 },
10156 },
10157 {
10158 /* VEX_W_0F3A06_P_2 */
10159 { "vperm2f128", { XM, Vex256, EXx, Ib }, 0 },
10160 },
10161 {
10162 /* VEX_W_0F3A14_P_2 */
10163 { "vpextrb", { Edqb, XM, Ib }, 0 },
10164 },
10165 {
10166 /* VEX_W_0F3A15_P_2 */
10167 { "vpextrw", { Edqw, XM, Ib }, 0 },
10168 },
10169 {
10170 /* VEX_W_0F3A18_P_2 */
10171 { "vinsertf128", { XM, Vex256, EXxmm, Ib }, 0 },
10172 },
10173 {
10174 /* VEX_W_0F3A19_P_2 */
10175 { "vextractf128", { EXxmm, XM, Ib }, 0 },
10176 },
10177 {
10178 /* VEX_W_0F3A20_P_2 */
10179 { "vpinsrb", { XM, Vex128, Edqb, Ib }, 0 },
10180 },
10181 {
10182 /* VEX_W_0F3A30_P_2_LEN_0 */
10183 { MOD_TABLE (MOD_VEX_W_0_0F3A30_P_2_LEN_0) },
10184 { MOD_TABLE (MOD_VEX_W_1_0F3A30_P_2_LEN_0) },
10185 },
10186 {
10187 /* VEX_W_0F3A31_P_2_LEN_0 */
10188 { MOD_TABLE (MOD_VEX_W_0_0F3A31_P_2_LEN_0) },
10189 { MOD_TABLE (MOD_VEX_W_1_0F3A31_P_2_LEN_0) },
10190 },
10191 {
10192 /* VEX_W_0F3A32_P_2_LEN_0 */
10193 { MOD_TABLE (MOD_VEX_W_0_0F3A32_P_2_LEN_0) },
10194 { MOD_TABLE (MOD_VEX_W_1_0F3A32_P_2_LEN_0) },
10195 },
10196 {
10197 /* VEX_W_0F3A33_P_2_LEN_0 */
10198 { MOD_TABLE (MOD_VEX_W_0_0F3A33_P_2_LEN_0) },
10199 { MOD_TABLE (MOD_VEX_W_1_0F3A33_P_2_LEN_0) },
10200 },
10201 {
10202 /* VEX_W_0F3A38_P_2 */
10203 { "vinserti128", { XM, Vex256, EXxmm, Ib }, 0 },
10204 },
10205 {
10206 /* VEX_W_0F3A39_P_2 */
10207 { "vextracti128", { EXxmm, XM, Ib }, 0 },
10208 },
10209 {
10210 /* VEX_W_0F3A46_P_2 */
10211 { "vperm2i128", { XM, Vex256, EXx, Ib }, 0 },
10212 },
10213 {
10214 /* VEX_W_0F3A48_P_2 */
10215 { "vpermil2ps", { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW }, 0 },
10216 { "vpermil2ps", { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW }, 0 },
10217 },
10218 {
10219 /* VEX_W_0F3A49_P_2 */
10220 { "vpermil2pd", { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW }, 0 },
10221 { "vpermil2pd", { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW }, 0 },
10222 },
10223 {
10224 /* VEX_W_0F3A4A_P_2 */
10225 { "vblendvps", { XM, Vex, EXx, XMVexI4 }, 0 },
10226 },
10227 {
10228 /* VEX_W_0F3A4B_P_2 */
10229 { "vblendvpd", { XM, Vex, EXx, XMVexI4 }, 0 },
10230 },
10231 {
10232 /* VEX_W_0F3A4C_P_2 */
10233 { "vpblendvb", { XM, Vex, EXx, XMVexI4 }, 0 },
10234 },
10235 {
10236 /* VEX_W_0F3ACE_P_2 */
10237 { Bad_Opcode },
10238 { "vgf2p8affineqb", { XM, Vex, EXx, Ib }, 0 },
10239 },
10240 {
10241 /* VEX_W_0F3ACF_P_2 */
10242 { Bad_Opcode },
10243 { "vgf2p8affineinvqb", { XM, Vex, EXx, Ib }, 0 },
10244 },
10245 #define NEED_VEX_W_TABLE
10246 #include "i386-dis-evex.h"
10247 #undef NEED_VEX_W_TABLE
10248 };
10249
10250 static const struct dis386 mod_table[][2] = {
10251 {
10252 /* MOD_8D */
10253 { "leaS", { Gv, M }, 0 },
10254 },
10255 {
10256 /* MOD_C6_REG_7 */
10257 { Bad_Opcode },
10258 { RM_TABLE (RM_C6_REG_7) },
10259 },
10260 {
10261 /* MOD_C7_REG_7 */
10262 { Bad_Opcode },
10263 { RM_TABLE (RM_C7_REG_7) },
10264 },
10265 {
10266 /* MOD_FF_REG_3 */
10267 { "Jcall^", { indirEp }, 0 },
10268 },
10269 {
10270 /* MOD_FF_REG_5 */
10271 { "Jjmp^", { indirEp }, 0 },
10272 },
10273 {
10274 /* MOD_0F01_REG_0 */
10275 { X86_64_TABLE (X86_64_0F01_REG_0) },
10276 { RM_TABLE (RM_0F01_REG_0) },
10277 },
10278 {
10279 /* MOD_0F01_REG_1 */
10280 { X86_64_TABLE (X86_64_0F01_REG_1) },
10281 { RM_TABLE (RM_0F01_REG_1) },
10282 },
10283 {
10284 /* MOD_0F01_REG_2 */
10285 { X86_64_TABLE (X86_64_0F01_REG_2) },
10286 { RM_TABLE (RM_0F01_REG_2) },
10287 },
10288 {
10289 /* MOD_0F01_REG_3 */
10290 { X86_64_TABLE (X86_64_0F01_REG_3) },
10291 { RM_TABLE (RM_0F01_REG_3) },
10292 },
10293 {
10294 /* MOD_0F01_REG_5 */
10295 { PREFIX_TABLE (PREFIX_MOD_0_0F01_REG_5) },
10296 { RM_TABLE (RM_0F01_REG_5) },
10297 },
10298 {
10299 /* MOD_0F01_REG_7 */
10300 { "invlpg", { Mb }, 0 },
10301 { RM_TABLE (RM_0F01_REG_7) },
10302 },
10303 {
10304 /* MOD_0F12_PREFIX_0 */
10305 { "movlps", { XM, EXq }, PREFIX_OPCODE },
10306 { "movhlps", { XM, EXq }, PREFIX_OPCODE },
10307 },
10308 {
10309 /* MOD_0F13 */
10310 { "movlpX", { EXq, XM }, PREFIX_OPCODE },
10311 },
10312 {
10313 /* MOD_0F16_PREFIX_0 */
10314 { "movhps", { XM, EXq }, 0 },
10315 { "movlhps", { XM, EXq }, 0 },
10316 },
10317 {
10318 /* MOD_0F17 */
10319 { "movhpX", { EXq, XM }, PREFIX_OPCODE },
10320 },
10321 {
10322 /* MOD_0F18_REG_0 */
10323 { "prefetchnta", { Mb }, 0 },
10324 },
10325 {
10326 /* MOD_0F18_REG_1 */
10327 { "prefetcht0", { Mb }, 0 },
10328 },
10329 {
10330 /* MOD_0F18_REG_2 */
10331 { "prefetcht1", { Mb }, 0 },
10332 },
10333 {
10334 /* MOD_0F18_REG_3 */
10335 { "prefetcht2", { Mb }, 0 },
10336 },
10337 {
10338 /* MOD_0F18_REG_4 */
10339 { "nop/reserved", { Mb }, 0 },
10340 },
10341 {
10342 /* MOD_0F18_REG_5 */
10343 { "nop/reserved", { Mb }, 0 },
10344 },
10345 {
10346 /* MOD_0F18_REG_6 */
10347 { "nop/reserved", { Mb }, 0 },
10348 },
10349 {
10350 /* MOD_0F18_REG_7 */
10351 { "nop/reserved", { Mb }, 0 },
10352 },
10353 {
10354 /* MOD_0F1A_PREFIX_0 */
10355 { "bndldx", { Gbnd, Mv_bnd }, 0 },
10356 { "nopQ", { Ev }, 0 },
10357 },
10358 {
10359 /* MOD_0F1B_PREFIX_0 */
10360 { "bndstx", { Mv_bnd, Gbnd }, 0 },
10361 { "nopQ", { Ev }, 0 },
10362 },
10363 {
10364 /* MOD_0F1B_PREFIX_1 */
10365 { "bndmk", { Gbnd, Mv_bnd }, 0 },
10366 { "nopQ", { Ev }, 0 },
10367 },
10368 {
10369 /* MOD_0F1C_PREFIX_0 */
10370 { REG_TABLE (REG_0F1C_MOD_0) },
10371 { "nopQ", { Ev }, 0 },
10372 },
10373 {
10374 /* MOD_0F1E_PREFIX_1 */
10375 { "nopQ", { Ev }, 0 },
10376 { REG_TABLE (REG_0F1E_MOD_3) },
10377 },
10378 {
10379 /* MOD_0F24 */
10380 { Bad_Opcode },
10381 { "movL", { Rd, Td }, 0 },
10382 },
10383 {
10384 /* MOD_0F26 */
10385 { Bad_Opcode },
10386 { "movL", { Td, Rd }, 0 },
10387 },
10388 {
10389 /* MOD_0F2B_PREFIX_0 */
10390 {"movntps", { Mx, XM }, PREFIX_OPCODE },
10391 },
10392 {
10393 /* MOD_0F2B_PREFIX_1 */
10394 {"movntss", { Md, XM }, PREFIX_OPCODE },
10395 },
10396 {
10397 /* MOD_0F2B_PREFIX_2 */
10398 {"movntpd", { Mx, XM }, PREFIX_OPCODE },
10399 },
10400 {
10401 /* MOD_0F2B_PREFIX_3 */
10402 {"movntsd", { Mq, XM }, PREFIX_OPCODE },
10403 },
10404 {
10405 /* MOD_0F51 */
10406 { Bad_Opcode },
10407 { "movmskpX", { Gdq, XS }, PREFIX_OPCODE },
10408 },
10409 {
10410 /* MOD_0F71_REG_2 */
10411 { Bad_Opcode },
10412 { "psrlw", { MS, Ib }, 0 },
10413 },
10414 {
10415 /* MOD_0F71_REG_4 */
10416 { Bad_Opcode },
10417 { "psraw", { MS, Ib }, 0 },
10418 },
10419 {
10420 /* MOD_0F71_REG_6 */
10421 { Bad_Opcode },
10422 { "psllw", { MS, Ib }, 0 },
10423 },
10424 {
10425 /* MOD_0F72_REG_2 */
10426 { Bad_Opcode },
10427 { "psrld", { MS, Ib }, 0 },
10428 },
10429 {
10430 /* MOD_0F72_REG_4 */
10431 { Bad_Opcode },
10432 { "psrad", { MS, Ib }, 0 },
10433 },
10434 {
10435 /* MOD_0F72_REG_6 */
10436 { Bad_Opcode },
10437 { "pslld", { MS, Ib }, 0 },
10438 },
10439 {
10440 /* MOD_0F73_REG_2 */
10441 { Bad_Opcode },
10442 { "psrlq", { MS, Ib }, 0 },
10443 },
10444 {
10445 /* MOD_0F73_REG_3 */
10446 { Bad_Opcode },
10447 { PREFIX_TABLE (PREFIX_0F73_REG_3) },
10448 },
10449 {
10450 /* MOD_0F73_REG_6 */
10451 { Bad_Opcode },
10452 { "psllq", { MS, Ib }, 0 },
10453 },
10454 {
10455 /* MOD_0F73_REG_7 */
10456 { Bad_Opcode },
10457 { PREFIX_TABLE (PREFIX_0F73_REG_7) },
10458 },
10459 {
10460 /* MOD_0FAE_REG_0 */
10461 { "fxsave", { FXSAVE }, 0 },
10462 { PREFIX_TABLE (PREFIX_0FAE_REG_0) },
10463 },
10464 {
10465 /* MOD_0FAE_REG_1 */
10466 { "fxrstor", { FXSAVE }, 0 },
10467 { PREFIX_TABLE (PREFIX_0FAE_REG_1) },
10468 },
10469 {
10470 /* MOD_0FAE_REG_2 */
10471 { "ldmxcsr", { Md }, 0 },
10472 { PREFIX_TABLE (PREFIX_0FAE_REG_2) },
10473 },
10474 {
10475 /* MOD_0FAE_REG_3 */
10476 { "stmxcsr", { Md }, 0 },
10477 { PREFIX_TABLE (PREFIX_0FAE_REG_3) },
10478 },
10479 {
10480 /* MOD_0FAE_REG_4 */
10481 { PREFIX_TABLE (PREFIX_MOD_0_0FAE_REG_4) },
10482 { PREFIX_TABLE (PREFIX_MOD_3_0FAE_REG_4) },
10483 },
10484 {
10485 /* MOD_0FAE_REG_5 */
10486 { PREFIX_TABLE (PREFIX_MOD_0_0FAE_REG_5) },
10487 { PREFIX_TABLE (PREFIX_MOD_3_0FAE_REG_5) },
10488 },
10489 {
10490 /* MOD_0FAE_REG_6 */
10491 { PREFIX_TABLE (PREFIX_MOD_0_0FAE_REG_6) },
10492 { PREFIX_TABLE (PREFIX_MOD_1_0FAE_REG_6) },
10493 },
10494 {
10495 /* MOD_0FAE_REG_7 */
10496 { PREFIX_TABLE (PREFIX_0FAE_REG_7) },
10497 { RM_TABLE (RM_0FAE_REG_7) },
10498 },
10499 {
10500 /* MOD_0FB2 */
10501 { "lssS", { Gv, Mp }, 0 },
10502 },
10503 {
10504 /* MOD_0FB4 */
10505 { "lfsS", { Gv, Mp }, 0 },
10506 },
10507 {
10508 /* MOD_0FB5 */
10509 { "lgsS", { Gv, Mp }, 0 },
10510 },
10511 {
10512 /* MOD_0FC3 */
10513 { PREFIX_TABLE (PREFIX_MOD_0_0FC3) },
10514 },
10515 {
10516 /* MOD_0FC7_REG_3 */
10517 { "xrstors", { FXSAVE }, 0 },
10518 },
10519 {
10520 /* MOD_0FC7_REG_4 */
10521 { "xsavec", { FXSAVE }, 0 },
10522 },
10523 {
10524 /* MOD_0FC7_REG_5 */
10525 { "xsaves", { FXSAVE }, 0 },
10526 },
10527 {
10528 /* MOD_0FC7_REG_6 */
10529 { PREFIX_TABLE (PREFIX_MOD_0_0FC7_REG_6) },
10530 { PREFIX_TABLE (PREFIX_MOD_3_0FC7_REG_6) }
10531 },
10532 {
10533 /* MOD_0FC7_REG_7 */
10534 { "vmptrst", { Mq }, 0 },
10535 { PREFIX_TABLE (PREFIX_MOD_3_0FC7_REG_7) }
10536 },
10537 {
10538 /* MOD_0FD7 */
10539 { Bad_Opcode },
10540 { "pmovmskb", { Gdq, MS }, 0 },
10541 },
10542 {
10543 /* MOD_0FE7_PREFIX_2 */
10544 { "movntdq", { Mx, XM }, 0 },
10545 },
10546 {
10547 /* MOD_0FF0_PREFIX_3 */
10548 { "lddqu", { XM, M }, 0 },
10549 },
10550 {
10551 /* MOD_0F382A_PREFIX_2 */
10552 { "movntdqa", { XM, Mx }, 0 },
10553 },
10554 {
10555 /* MOD_0F38F5_PREFIX_2 */
10556 { "wrussK", { M, Gdq }, PREFIX_OPCODE },
10557 },
10558 {
10559 /* MOD_0F38F6_PREFIX_0 */
10560 { "wrssK", { M, Gdq }, PREFIX_OPCODE },
10561 },
10562 {
10563 /* MOD_0F38F8_PREFIX_2 */
10564 { "movdir64b", { Gva, M }, PREFIX_OPCODE },
10565 },
10566 {
10567 /* MOD_0F38F9_PREFIX_0 */
10568 { "movdiri", { Em, Gv }, PREFIX_OPCODE },
10569 },
10570 {
10571 /* MOD_62_32BIT */
10572 { "bound{S|}", { Gv, Ma }, 0 },
10573 { EVEX_TABLE (EVEX_0F) },
10574 },
10575 {
10576 /* MOD_C4_32BIT */
10577 { "lesS", { Gv, Mp }, 0 },
10578 { VEX_C4_TABLE (VEX_0F) },
10579 },
10580 {
10581 /* MOD_C5_32BIT */
10582 { "ldsS", { Gv, Mp }, 0 },
10583 { VEX_C5_TABLE (VEX_0F) },
10584 },
10585 {
10586 /* MOD_VEX_0F12_PREFIX_0 */
10587 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_0) },
10588 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_1) },
10589 },
10590 {
10591 /* MOD_VEX_0F13 */
10592 { VEX_LEN_TABLE (VEX_LEN_0F13_M_0) },
10593 },
10594 {
10595 /* MOD_VEX_0F16_PREFIX_0 */
10596 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_0) },
10597 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_1) },
10598 },
10599 {
10600 /* MOD_VEX_0F17 */
10601 { VEX_LEN_TABLE (VEX_LEN_0F17_M_0) },
10602 },
10603 {
10604 /* MOD_VEX_0F2B */
10605 { "vmovntpX", { Mx, XM }, 0 },
10606 },
10607 {
10608 /* MOD_VEX_W_0_0F41_P_0_LEN_1 */
10609 { Bad_Opcode },
10610 { "kandw", { MaskG, MaskVex, MaskR }, 0 },
10611 },
10612 {
10613 /* MOD_VEX_W_1_0F41_P_0_LEN_1 */
10614 { Bad_Opcode },
10615 { "kandq", { MaskG, MaskVex, MaskR }, 0 },
10616 },
10617 {
10618 /* MOD_VEX_W_0_0F41_P_2_LEN_1 */
10619 { Bad_Opcode },
10620 { "kandb", { MaskG, MaskVex, MaskR }, 0 },
10621 },
10622 {
10623 /* MOD_VEX_W_1_0F41_P_2_LEN_1 */
10624 { Bad_Opcode },
10625 { "kandd", { MaskG, MaskVex, MaskR }, 0 },
10626 },
10627 {
10628 /* MOD_VEX_W_0_0F42_P_0_LEN_1 */
10629 { Bad_Opcode },
10630 { "kandnw", { MaskG, MaskVex, MaskR }, 0 },
10631 },
10632 {
10633 /* MOD_VEX_W_1_0F42_P_0_LEN_1 */
10634 { Bad_Opcode },
10635 { "kandnq", { MaskG, MaskVex, MaskR }, 0 },
10636 },
10637 {
10638 /* MOD_VEX_W_0_0F42_P_2_LEN_1 */
10639 { Bad_Opcode },
10640 { "kandnb", { MaskG, MaskVex, MaskR }, 0 },
10641 },
10642 {
10643 /* MOD_VEX_W_1_0F42_P_2_LEN_1 */
10644 { Bad_Opcode },
10645 { "kandnd", { MaskG, MaskVex, MaskR }, 0 },
10646 },
10647 {
10648 /* MOD_VEX_W_0_0F44_P_0_LEN_0 */
10649 { Bad_Opcode },
10650 { "knotw", { MaskG, MaskR }, 0 },
10651 },
10652 {
10653 /* MOD_VEX_W_1_0F44_P_0_LEN_0 */
10654 { Bad_Opcode },
10655 { "knotq", { MaskG, MaskR }, 0 },
10656 },
10657 {
10658 /* MOD_VEX_W_0_0F44_P_2_LEN_0 */
10659 { Bad_Opcode },
10660 { "knotb", { MaskG, MaskR }, 0 },
10661 },
10662 {
10663 /* MOD_VEX_W_1_0F44_P_2_LEN_0 */
10664 { Bad_Opcode },
10665 { "knotd", { MaskG, MaskR }, 0 },
10666 },
10667 {
10668 /* MOD_VEX_W_0_0F45_P_0_LEN_1 */
10669 { Bad_Opcode },
10670 { "korw", { MaskG, MaskVex, MaskR }, 0 },
10671 },
10672 {
10673 /* MOD_VEX_W_1_0F45_P_0_LEN_1 */
10674 { Bad_Opcode },
10675 { "korq", { MaskG, MaskVex, MaskR }, 0 },
10676 },
10677 {
10678 /* MOD_VEX_W_0_0F45_P_2_LEN_1 */
10679 { Bad_Opcode },
10680 { "korb", { MaskG, MaskVex, MaskR }, 0 },
10681 },
10682 {
10683 /* MOD_VEX_W_1_0F45_P_2_LEN_1 */
10684 { Bad_Opcode },
10685 { "kord", { MaskG, MaskVex, MaskR }, 0 },
10686 },
10687 {
10688 /* MOD_VEX_W_0_0F46_P_0_LEN_1 */
10689 { Bad_Opcode },
10690 { "kxnorw", { MaskG, MaskVex, MaskR }, 0 },
10691 },
10692 {
10693 /* MOD_VEX_W_1_0F46_P_0_LEN_1 */
10694 { Bad_Opcode },
10695 { "kxnorq", { MaskG, MaskVex, MaskR }, 0 },
10696 },
10697 {
10698 /* MOD_VEX_W_0_0F46_P_2_LEN_1 */
10699 { Bad_Opcode },
10700 { "kxnorb", { MaskG, MaskVex, MaskR }, 0 },
10701 },
10702 {
10703 /* MOD_VEX_W_1_0F46_P_2_LEN_1 */
10704 { Bad_Opcode },
10705 { "kxnord", { MaskG, MaskVex, MaskR }, 0 },
10706 },
10707 {
10708 /* MOD_VEX_W_0_0F47_P_0_LEN_1 */
10709 { Bad_Opcode },
10710 { "kxorw", { MaskG, MaskVex, MaskR }, 0 },
10711 },
10712 {
10713 /* MOD_VEX_W_1_0F47_P_0_LEN_1 */
10714 { Bad_Opcode },
10715 { "kxorq", { MaskG, MaskVex, MaskR }, 0 },
10716 },
10717 {
10718 /* MOD_VEX_W_0_0F47_P_2_LEN_1 */
10719 { Bad_Opcode },
10720 { "kxorb", { MaskG, MaskVex, MaskR }, 0 },
10721 },
10722 {
10723 /* MOD_VEX_W_1_0F47_P_2_LEN_1 */
10724 { Bad_Opcode },
10725 { "kxord", { MaskG, MaskVex, MaskR }, 0 },
10726 },
10727 {
10728 /* MOD_VEX_W_0_0F4A_P_0_LEN_1 */
10729 { Bad_Opcode },
10730 { "kaddw", { MaskG, MaskVex, MaskR }, 0 },
10731 },
10732 {
10733 /* MOD_VEX_W_1_0F4A_P_0_LEN_1 */
10734 { Bad_Opcode },
10735 { "kaddq", { MaskG, MaskVex, MaskR }, 0 },
10736 },
10737 {
10738 /* MOD_VEX_W_0_0F4A_P_2_LEN_1 */
10739 { Bad_Opcode },
10740 { "kaddb", { MaskG, MaskVex, MaskR }, 0 },
10741 },
10742 {
10743 /* MOD_VEX_W_1_0F4A_P_2_LEN_1 */
10744 { Bad_Opcode },
10745 { "kaddd", { MaskG, MaskVex, MaskR }, 0 },
10746 },
10747 {
10748 /* MOD_VEX_W_0_0F4B_P_0_LEN_1 */
10749 { Bad_Opcode },
10750 { "kunpckwd", { MaskG, MaskVex, MaskR }, 0 },
10751 },
10752 {
10753 /* MOD_VEX_W_1_0F4B_P_0_LEN_1 */
10754 { Bad_Opcode },
10755 { "kunpckdq", { MaskG, MaskVex, MaskR }, 0 },
10756 },
10757 {
10758 /* MOD_VEX_W_0_0F4B_P_2_LEN_1 */
10759 { Bad_Opcode },
10760 { "kunpckbw", { MaskG, MaskVex, MaskR }, 0 },
10761 },
10762 {
10763 /* MOD_VEX_0F50 */
10764 { Bad_Opcode },
10765 { "vmovmskpX", { Gdq, XS }, 0 },
10766 },
10767 {
10768 /* MOD_VEX_0F71_REG_2 */
10769 { Bad_Opcode },
10770 { PREFIX_TABLE (PREFIX_VEX_0F71_REG_2) },
10771 },
10772 {
10773 /* MOD_VEX_0F71_REG_4 */
10774 { Bad_Opcode },
10775 { PREFIX_TABLE (PREFIX_VEX_0F71_REG_4) },
10776 },
10777 {
10778 /* MOD_VEX_0F71_REG_6 */
10779 { Bad_Opcode },
10780 { PREFIX_TABLE (PREFIX_VEX_0F71_REG_6) },
10781 },
10782 {
10783 /* MOD_VEX_0F72_REG_2 */
10784 { Bad_Opcode },
10785 { PREFIX_TABLE (PREFIX_VEX_0F72_REG_2) },
10786 },
10787 {
10788 /* MOD_VEX_0F72_REG_4 */
10789 { Bad_Opcode },
10790 { PREFIX_TABLE (PREFIX_VEX_0F72_REG_4) },
10791 },
10792 {
10793 /* MOD_VEX_0F72_REG_6 */
10794 { Bad_Opcode },
10795 { PREFIX_TABLE (PREFIX_VEX_0F72_REG_6) },
10796 },
10797 {
10798 /* MOD_VEX_0F73_REG_2 */
10799 { Bad_Opcode },
10800 { PREFIX_TABLE (PREFIX_VEX_0F73_REG_2) },
10801 },
10802 {
10803 /* MOD_VEX_0F73_REG_3 */
10804 { Bad_Opcode },
10805 { PREFIX_TABLE (PREFIX_VEX_0F73_REG_3) },
10806 },
10807 {
10808 /* MOD_VEX_0F73_REG_6 */
10809 { Bad_Opcode },
10810 { PREFIX_TABLE (PREFIX_VEX_0F73_REG_6) },
10811 },
10812 {
10813 /* MOD_VEX_0F73_REG_7 */
10814 { Bad_Opcode },
10815 { PREFIX_TABLE (PREFIX_VEX_0F73_REG_7) },
10816 },
10817 {
10818 /* MOD_VEX_W_0_0F91_P_0_LEN_0 */
10819 { "kmovw", { Ew, MaskG }, 0 },
10820 { Bad_Opcode },
10821 },
10822 {
10823 /* MOD_VEX_W_0_0F91_P_0_LEN_0 */
10824 { "kmovq", { Eq, MaskG }, 0 },
10825 { Bad_Opcode },
10826 },
10827 {
10828 /* MOD_VEX_W_0_0F91_P_2_LEN_0 */
10829 { "kmovb", { Eb, MaskG }, 0 },
10830 { Bad_Opcode },
10831 },
10832 {
10833 /* MOD_VEX_W_0_0F91_P_2_LEN_0 */
10834 { "kmovd", { Ed, MaskG }, 0 },
10835 { Bad_Opcode },
10836 },
10837 {
10838 /* MOD_VEX_W_0_0F92_P_0_LEN_0 */
10839 { Bad_Opcode },
10840 { "kmovw", { MaskG, Rdq }, 0 },
10841 },
10842 {
10843 /* MOD_VEX_W_0_0F92_P_2_LEN_0 */
10844 { Bad_Opcode },
10845 { "kmovb", { MaskG, Rdq }, 0 },
10846 },
10847 {
10848 /* MOD_VEX_W_0_0F92_P_3_LEN_0 */
10849 { Bad_Opcode },
10850 { "kmovd", { MaskG, Rdq }, 0 },
10851 },
10852 {
10853 /* MOD_VEX_W_1_0F92_P_3_LEN_0 */
10854 { Bad_Opcode },
10855 { "kmovq", { MaskG, Rdq }, 0 },
10856 },
10857 {
10858 /* MOD_VEX_W_0_0F93_P_0_LEN_0 */
10859 { Bad_Opcode },
10860 { "kmovw", { Gdq, MaskR }, 0 },
10861 },
10862 {
10863 /* MOD_VEX_W_0_0F93_P_2_LEN_0 */
10864 { Bad_Opcode },
10865 { "kmovb", { Gdq, MaskR }, 0 },
10866 },
10867 {
10868 /* MOD_VEX_W_0_0F93_P_3_LEN_0 */
10869 { Bad_Opcode },
10870 { "kmovd", { Gdq, MaskR }, 0 },
10871 },
10872 {
10873 /* MOD_VEX_W_1_0F93_P_3_LEN_0 */
10874 { Bad_Opcode },
10875 { "kmovq", { Gdq, MaskR }, 0 },
10876 },
10877 {
10878 /* MOD_VEX_W_0_0F98_P_0_LEN_0 */
10879 { Bad_Opcode },
10880 { "kortestw", { MaskG, MaskR }, 0 },
10881 },
10882 {
10883 /* MOD_VEX_W_1_0F98_P_0_LEN_0 */
10884 { Bad_Opcode },
10885 { "kortestq", { MaskG, MaskR }, 0 },
10886 },
10887 {
10888 /* MOD_VEX_W_0_0F98_P_2_LEN_0 */
10889 { Bad_Opcode },
10890 { "kortestb", { MaskG, MaskR }, 0 },
10891 },
10892 {
10893 /* MOD_VEX_W_1_0F98_P_2_LEN_0 */
10894 { Bad_Opcode },
10895 { "kortestd", { MaskG, MaskR }, 0 },
10896 },
10897 {
10898 /* MOD_VEX_W_0_0F99_P_0_LEN_0 */
10899 { Bad_Opcode },
10900 { "ktestw", { MaskG, MaskR }, 0 },
10901 },
10902 {
10903 /* MOD_VEX_W_1_0F99_P_0_LEN_0 */
10904 { Bad_Opcode },
10905 { "ktestq", { MaskG, MaskR }, 0 },
10906 },
10907 {
10908 /* MOD_VEX_W_0_0F99_P_2_LEN_0 */
10909 { Bad_Opcode },
10910 { "ktestb", { MaskG, MaskR }, 0 },
10911 },
10912 {
10913 /* MOD_VEX_W_1_0F99_P_2_LEN_0 */
10914 { Bad_Opcode },
10915 { "ktestd", { MaskG, MaskR }, 0 },
10916 },
10917 {
10918 /* MOD_VEX_0FAE_REG_2 */
10919 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_2_M_0) },
10920 },
10921 {
10922 /* MOD_VEX_0FAE_REG_3 */
10923 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_3_M_0) },
10924 },
10925 {
10926 /* MOD_VEX_0FD7_PREFIX_2 */
10927 { Bad_Opcode },
10928 { "vpmovmskb", { Gdq, XS }, 0 },
10929 },
10930 {
10931 /* MOD_VEX_0FE7_PREFIX_2 */
10932 { "vmovntdq", { Mx, XM }, 0 },
10933 },
10934 {
10935 /* MOD_VEX_0FF0_PREFIX_3 */
10936 { "vlddqu", { XM, M }, 0 },
10937 },
10938 {
10939 /* MOD_VEX_0F381A_PREFIX_2 */
10940 { VEX_LEN_TABLE (VEX_LEN_0F381A_P_2_M_0) },
10941 },
10942 {
10943 /* MOD_VEX_0F382A_PREFIX_2 */
10944 { "vmovntdqa", { XM, Mx }, 0 },
10945 },
10946 {
10947 /* MOD_VEX_0F382C_PREFIX_2 */
10948 { VEX_W_TABLE (VEX_W_0F382C_P_2_M_0) },
10949 },
10950 {
10951 /* MOD_VEX_0F382D_PREFIX_2 */
10952 { VEX_W_TABLE (VEX_W_0F382D_P_2_M_0) },
10953 },
10954 {
10955 /* MOD_VEX_0F382E_PREFIX_2 */
10956 { VEX_W_TABLE (VEX_W_0F382E_P_2_M_0) },
10957 },
10958 {
10959 /* MOD_VEX_0F382F_PREFIX_2 */
10960 { VEX_W_TABLE (VEX_W_0F382F_P_2_M_0) },
10961 },
10962 {
10963 /* MOD_VEX_0F385A_PREFIX_2 */
10964 { VEX_LEN_TABLE (VEX_LEN_0F385A_P_2_M_0) },
10965 },
10966 {
10967 /* MOD_VEX_0F388C_PREFIX_2 */
10968 { "vpmaskmov%LW", { XM, Vex, Mx }, 0 },
10969 },
10970 {
10971 /* MOD_VEX_0F388E_PREFIX_2 */
10972 { "vpmaskmov%LW", { Mx, Vex, XM }, 0 },
10973 },
10974 {
10975 /* MOD_VEX_W_0_0F3A30_P_2_LEN_0 */
10976 { Bad_Opcode },
10977 { "kshiftrb", { MaskG, MaskR, Ib }, 0 },
10978 },
10979 {
10980 /* MOD_VEX_W_1_0F3A30_P_2_LEN_0 */
10981 { Bad_Opcode },
10982 { "kshiftrw", { MaskG, MaskR, Ib }, 0 },
10983 },
10984 {
10985 /* MOD_VEX_W_0_0F3A31_P_2_LEN_0 */
10986 { Bad_Opcode },
10987 { "kshiftrd", { MaskG, MaskR, Ib }, 0 },
10988 },
10989 {
10990 /* MOD_VEX_W_1_0F3A31_P_2_LEN_0 */
10991 { Bad_Opcode },
10992 { "kshiftrq", { MaskG, MaskR, Ib }, 0 },
10993 },
10994 {
10995 /* MOD_VEX_W_0_0F3A32_P_2_LEN_0 */
10996 { Bad_Opcode },
10997 { "kshiftlb", { MaskG, MaskR, Ib }, 0 },
10998 },
10999 {
11000 /* MOD_VEX_W_1_0F3A32_P_2_LEN_0 */
11001 { Bad_Opcode },
11002 { "kshiftlw", { MaskG, MaskR, Ib }, 0 },
11003 },
11004 {
11005 /* MOD_VEX_W_0_0F3A33_P_2_LEN_0 */
11006 { Bad_Opcode },
11007 { "kshiftld", { MaskG, MaskR, Ib }, 0 },
11008 },
11009 {
11010 /* MOD_VEX_W_1_0F3A33_P_2_LEN_0 */
11011 { Bad_Opcode },
11012 { "kshiftlq", { MaskG, MaskR, Ib }, 0 },
11013 },
11014 #define NEED_MOD_TABLE
11015 #include "i386-dis-evex.h"
11016 #undef NEED_MOD_TABLE
11017 };
11018
11019 static const struct dis386 rm_table[][8] = {
11020 {
11021 /* RM_C6_REG_7 */
11022 { "xabort", { Skip_MODRM, Ib }, 0 },
11023 },
11024 {
11025 /* RM_C7_REG_7 */
11026 { "xbeginT", { Skip_MODRM, Jv }, 0 },
11027 },
11028 {
11029 /* RM_0F01_REG_0 */
11030 { Bad_Opcode },
11031 { "vmcall", { Skip_MODRM }, 0 },
11032 { "vmlaunch", { Skip_MODRM }, 0 },
11033 { "vmresume", { Skip_MODRM }, 0 },
11034 { "vmxoff", { Skip_MODRM }, 0 },
11035 { "pconfig", { Skip_MODRM }, 0 },
11036 },
11037 {
11038 /* RM_0F01_REG_1 */
11039 { "monitor", { { OP_Monitor, 0 } }, 0 },
11040 { "mwait", { { OP_Mwait, 0 } }, 0 },
11041 { "clac", { Skip_MODRM }, 0 },
11042 { "stac", { Skip_MODRM }, 0 },
11043 { Bad_Opcode },
11044 { Bad_Opcode },
11045 { Bad_Opcode },
11046 { "encls", { Skip_MODRM }, 0 },
11047 },
11048 {
11049 /* RM_0F01_REG_2 */
11050 { "xgetbv", { Skip_MODRM }, 0 },
11051 { "xsetbv", { Skip_MODRM }, 0 },
11052 { Bad_Opcode },
11053 { Bad_Opcode },
11054 { "vmfunc", { Skip_MODRM }, 0 },
11055 { "xend", { Skip_MODRM }, 0 },
11056 { "xtest", { Skip_MODRM }, 0 },
11057 { "enclu", { Skip_MODRM }, 0 },
11058 },
11059 {
11060 /* RM_0F01_REG_3 */
11061 { "vmrun", { Skip_MODRM }, 0 },
11062 { "vmmcall", { Skip_MODRM }, 0 },
11063 { "vmload", { Skip_MODRM }, 0 },
11064 { "vmsave", { Skip_MODRM }, 0 },
11065 { "stgi", { Skip_MODRM }, 0 },
11066 { "clgi", { Skip_MODRM }, 0 },
11067 { "skinit", { Skip_MODRM }, 0 },
11068 { "invlpga", { Skip_MODRM }, 0 },
11069 },
11070 {
11071 /* RM_0F01_REG_5 */
11072 { PREFIX_TABLE (PREFIX_MOD_3_0F01_REG_5_RM_0) },
11073 { Bad_Opcode },
11074 { PREFIX_TABLE (PREFIX_MOD_3_0F01_REG_5_RM_2) },
11075 { Bad_Opcode },
11076 { Bad_Opcode },
11077 { Bad_Opcode },
11078 { "rdpkru", { Skip_MODRM }, 0 },
11079 { "wrpkru", { Skip_MODRM }, 0 },
11080 },
11081 {
11082 /* RM_0F01_REG_7 */
11083 { "swapgs", { Skip_MODRM }, 0 },
11084 { "rdtscp", { Skip_MODRM }, 0 },
11085 { "monitorx", { { OP_Monitor, 0 } }, 0 },
11086 { "mwaitx", { { OP_Mwaitx, 0 } }, 0 },
11087 { "clzero", { Skip_MODRM }, 0 },
11088 },
11089 {
11090 /* RM_0F1E_MOD_3_REG_7 */
11091 { "nopQ", { Ev }, 0 },
11092 { "nopQ", { Ev }, 0 },
11093 { "endbr64", { Skip_MODRM }, PREFIX_OPCODE },
11094 { "endbr32", { Skip_MODRM }, PREFIX_OPCODE },
11095 { "nopQ", { Ev }, 0 },
11096 { "nopQ", { Ev }, 0 },
11097 { "nopQ", { Ev }, 0 },
11098 { "nopQ", { Ev }, 0 },
11099 },
11100 {
11101 /* RM_0FAE_REG_6 */
11102 { "mfence", { Skip_MODRM }, 0 },
11103 },
11104 {
11105 /* RM_0FAE_REG_7 */
11106 { "sfence", { Skip_MODRM }, 0 },
11107
11108 },
11109 };
11110
11111 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
11112
11113 /* We use the high bit to indicate different name for the same
11114 prefix. */
11115 #define REP_PREFIX (0xf3 | 0x100)
11116 #define XACQUIRE_PREFIX (0xf2 | 0x200)
11117 #define XRELEASE_PREFIX (0xf3 | 0x400)
11118 #define BND_PREFIX (0xf2 | 0x400)
11119 #define NOTRACK_PREFIX (0x3e | 0x100)
11120
11121 static int
11122 ckprefix (void)
11123 {
11124 int newrex, i, length;
11125 rex = 0;
11126 rex_ignored = 0;
11127 prefixes = 0;
11128 used_prefixes = 0;
11129 rex_used = 0;
11130 last_lock_prefix = -1;
11131 last_repz_prefix = -1;
11132 last_repnz_prefix = -1;
11133 last_data_prefix = -1;
11134 last_addr_prefix = -1;
11135 last_rex_prefix = -1;
11136 last_seg_prefix = -1;
11137 fwait_prefix = -1;
11138 active_seg_prefix = 0;
11139 for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
11140 all_prefixes[i] = 0;
11141 i = 0;
11142 length = 0;
11143 /* The maximum instruction length is 15bytes. */
11144 while (length < MAX_CODE_LENGTH - 1)
11145 {
11146 FETCH_DATA (the_info, codep + 1);
11147 newrex = 0;
11148 switch (*codep)
11149 {
11150 /* REX prefixes family. */
11151 case 0x40:
11152 case 0x41:
11153 case 0x42:
11154 case 0x43:
11155 case 0x44:
11156 case 0x45:
11157 case 0x46:
11158 case 0x47:
11159 case 0x48:
11160 case 0x49:
11161 case 0x4a:
11162 case 0x4b:
11163 case 0x4c:
11164 case 0x4d:
11165 case 0x4e:
11166 case 0x4f:
11167 if (address_mode == mode_64bit)
11168 newrex = *codep;
11169 else
11170 return 1;
11171 last_rex_prefix = i;
11172 break;
11173 case 0xf3:
11174 prefixes |= PREFIX_REPZ;
11175 last_repz_prefix = i;
11176 break;
11177 case 0xf2:
11178 prefixes |= PREFIX_REPNZ;
11179 last_repnz_prefix = i;
11180 break;
11181 case 0xf0:
11182 prefixes |= PREFIX_LOCK;
11183 last_lock_prefix = i;
11184 break;
11185 case 0x2e:
11186 prefixes |= PREFIX_CS;
11187 last_seg_prefix = i;
11188 active_seg_prefix = PREFIX_CS;
11189 break;
11190 case 0x36:
11191 prefixes |= PREFIX_SS;
11192 last_seg_prefix = i;
11193 active_seg_prefix = PREFIX_SS;
11194 break;
11195 case 0x3e:
11196 prefixes |= PREFIX_DS;
11197 last_seg_prefix = i;
11198 active_seg_prefix = PREFIX_DS;
11199 break;
11200 case 0x26:
11201 prefixes |= PREFIX_ES;
11202 last_seg_prefix = i;
11203 active_seg_prefix = PREFIX_ES;
11204 break;
11205 case 0x64:
11206 prefixes |= PREFIX_FS;
11207 last_seg_prefix = i;
11208 active_seg_prefix = PREFIX_FS;
11209 break;
11210 case 0x65:
11211 prefixes |= PREFIX_GS;
11212 last_seg_prefix = i;
11213 active_seg_prefix = PREFIX_GS;
11214 break;
11215 case 0x66:
11216 prefixes |= PREFIX_DATA;
11217 last_data_prefix = i;
11218 break;
11219 case 0x67:
11220 prefixes |= PREFIX_ADDR;
11221 last_addr_prefix = i;
11222 break;
11223 case FWAIT_OPCODE:
11224 /* fwait is really an instruction. If there are prefixes
11225 before the fwait, they belong to the fwait, *not* to the
11226 following instruction. */
11227 fwait_prefix = i;
11228 if (prefixes || rex)
11229 {
11230 prefixes |= PREFIX_FWAIT;
11231 codep++;
11232 /* This ensures that the previous REX prefixes are noticed
11233 as unused prefixes, as in the return case below. */
11234 rex_used = rex;
11235 return 1;
11236 }
11237 prefixes = PREFIX_FWAIT;
11238 break;
11239 default:
11240 return 1;
11241 }
11242 /* Rex is ignored when followed by another prefix. */
11243 if (rex)
11244 {
11245 rex_used = rex;
11246 return 1;
11247 }
11248 if (*codep != FWAIT_OPCODE)
11249 all_prefixes[i++] = *codep;
11250 rex = newrex;
11251 codep++;
11252 length++;
11253 }
11254 return 0;
11255 }
11256
11257 /* Return the name of the prefix byte PREF, or NULL if PREF is not a
11258 prefix byte. */
11259
11260 static const char *
11261 prefix_name (int pref, int sizeflag)
11262 {
11263 static const char *rexes [16] =
11264 {
11265 "rex", /* 0x40 */
11266 "rex.B", /* 0x41 */
11267 "rex.X", /* 0x42 */
11268 "rex.XB", /* 0x43 */
11269 "rex.R", /* 0x44 */
11270 "rex.RB", /* 0x45 */
11271 "rex.RX", /* 0x46 */
11272 "rex.RXB", /* 0x47 */
11273 "rex.W", /* 0x48 */
11274 "rex.WB", /* 0x49 */
11275 "rex.WX", /* 0x4a */
11276 "rex.WXB", /* 0x4b */
11277 "rex.WR", /* 0x4c */
11278 "rex.WRB", /* 0x4d */
11279 "rex.WRX", /* 0x4e */
11280 "rex.WRXB", /* 0x4f */
11281 };
11282
11283 switch (pref)
11284 {
11285 /* REX prefixes family. */
11286 case 0x40:
11287 case 0x41:
11288 case 0x42:
11289 case 0x43:
11290 case 0x44:
11291 case 0x45:
11292 case 0x46:
11293 case 0x47:
11294 case 0x48:
11295 case 0x49:
11296 case 0x4a:
11297 case 0x4b:
11298 case 0x4c:
11299 case 0x4d:
11300 case 0x4e:
11301 case 0x4f:
11302 return rexes [pref - 0x40];
11303 case 0xf3:
11304 return "repz";
11305 case 0xf2:
11306 return "repnz";
11307 case 0xf0:
11308 return "lock";
11309 case 0x2e:
11310 return "cs";
11311 case 0x36:
11312 return "ss";
11313 case 0x3e:
11314 return "ds";
11315 case 0x26:
11316 return "es";
11317 case 0x64:
11318 return "fs";
11319 case 0x65:
11320 return "gs";
11321 case 0x66:
11322 return (sizeflag & DFLAG) ? "data16" : "data32";
11323 case 0x67:
11324 if (address_mode == mode_64bit)
11325 return (sizeflag & AFLAG) ? "addr32" : "addr64";
11326 else
11327 return (sizeflag & AFLAG) ? "addr16" : "addr32";
11328 case FWAIT_OPCODE:
11329 return "fwait";
11330 case REP_PREFIX:
11331 return "rep";
11332 case XACQUIRE_PREFIX:
11333 return "xacquire";
11334 case XRELEASE_PREFIX:
11335 return "xrelease";
11336 case BND_PREFIX:
11337 return "bnd";
11338 case NOTRACK_PREFIX:
11339 return "notrack";
11340 default:
11341 return NULL;
11342 }
11343 }
11344
11345 static char op_out[MAX_OPERANDS][100];
11346 static int op_ad, op_index[MAX_OPERANDS];
11347 static int two_source_ops;
11348 static bfd_vma op_address[MAX_OPERANDS];
11349 static bfd_vma op_riprel[MAX_OPERANDS];
11350 static bfd_vma start_pc;
11351
11352 /*
11353 * On the 386's of 1988, the maximum length of an instruction is 15 bytes.
11354 * (see topic "Redundant prefixes" in the "Differences from 8086"
11355 * section of the "Virtual 8086 Mode" chapter.)
11356 * 'pc' should be the address of this instruction, it will
11357 * be used to print the target address if this is a relative jump or call
11358 * The function returns the length of this instruction in bytes.
11359 */
11360
11361 static char intel_syntax;
11362 static char intel_mnemonic = !SYSV386_COMPAT;
11363 static char open_char;
11364 static char close_char;
11365 static char separator_char;
11366 static char scale_char;
11367
11368 enum x86_64_isa
11369 {
11370 amd64 = 0,
11371 intel64
11372 };
11373
11374 static enum x86_64_isa isa64;
11375
11376 /* Here for backwards compatibility. When gdb stops using
11377 print_insn_i386_att and print_insn_i386_intel these functions can
11378 disappear, and print_insn_i386 be merged into print_insn. */
11379 int
11380 print_insn_i386_att (bfd_vma pc, disassemble_info *info)
11381 {
11382 intel_syntax = 0;
11383
11384 return print_insn (pc, info);
11385 }
11386
11387 int
11388 print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
11389 {
11390 intel_syntax = 1;
11391
11392 return print_insn (pc, info);
11393 }
11394
11395 int
11396 print_insn_i386 (bfd_vma pc, disassemble_info *info)
11397 {
11398 intel_syntax = -1;
11399
11400 return print_insn (pc, info);
11401 }
11402
11403 void
11404 print_i386_disassembler_options (FILE *stream)
11405 {
11406 fprintf (stream, _("\n\
11407 The following i386/x86-64 specific disassembler options are supported for use\n\
11408 with the -M switch (multiple options should be separated by commas):\n"));
11409
11410 fprintf (stream, _(" x86-64 Disassemble in 64bit mode\n"));
11411 fprintf (stream, _(" i386 Disassemble in 32bit mode\n"));
11412 fprintf (stream, _(" i8086 Disassemble in 16bit mode\n"));
11413 fprintf (stream, _(" att Display instruction in AT&T syntax\n"));
11414 fprintf (stream, _(" intel Display instruction in Intel syntax\n"));
11415 fprintf (stream, _(" att-mnemonic\n"
11416 " Display instruction in AT&T mnemonic\n"));
11417 fprintf (stream, _(" intel-mnemonic\n"
11418 " Display instruction in Intel mnemonic\n"));
11419 fprintf (stream, _(" addr64 Assume 64bit address size\n"));
11420 fprintf (stream, _(" addr32 Assume 32bit address size\n"));
11421 fprintf (stream, _(" addr16 Assume 16bit address size\n"));
11422 fprintf (stream, _(" data32 Assume 32bit data size\n"));
11423 fprintf (stream, _(" data16 Assume 16bit data size\n"));
11424 fprintf (stream, _(" suffix Always display instruction suffix in AT&T syntax\n"));
11425 fprintf (stream, _(" amd64 Display instruction in AMD64 ISA\n"));
11426 fprintf (stream, _(" intel64 Display instruction in Intel64 ISA\n"));
11427 }
11428
11429 /* Bad opcode. */
11430 static const struct dis386 bad_opcode = { "(bad)", { XX }, 0 };
11431
11432 /* Get a pointer to struct dis386 with a valid name. */
11433
11434 static const struct dis386 *
11435 get_valid_dis386 (const struct dis386 *dp, disassemble_info *info)
11436 {
11437 int vindex, vex_table_index;
11438
11439 if (dp->name != NULL)
11440 return dp;
11441
11442 switch (dp->op[0].bytemode)
11443 {
11444 case USE_REG_TABLE:
11445 dp = &reg_table[dp->op[1].bytemode][modrm.reg];
11446 break;
11447
11448 case USE_MOD_TABLE:
11449 vindex = modrm.mod == 0x3 ? 1 : 0;
11450 dp = &mod_table[dp->op[1].bytemode][vindex];
11451 break;
11452
11453 case USE_RM_TABLE:
11454 dp = &rm_table[dp->op[1].bytemode][modrm.rm];
11455 break;
11456
11457 case USE_PREFIX_TABLE:
11458 if (need_vex)
11459 {
11460 /* The prefix in VEX is implicit. */
11461 switch (vex.prefix)
11462 {
11463 case 0:
11464 vindex = 0;
11465 break;
11466 case REPE_PREFIX_OPCODE:
11467 vindex = 1;
11468 break;
11469 case DATA_PREFIX_OPCODE:
11470 vindex = 2;
11471 break;
11472 case REPNE_PREFIX_OPCODE:
11473 vindex = 3;
11474 break;
11475 default:
11476 abort ();
11477 break;
11478 }
11479 }
11480 else
11481 {
11482 int last_prefix = -1;
11483 int prefix = 0;
11484 vindex = 0;
11485 /* We check PREFIX_REPNZ and PREFIX_REPZ before PREFIX_DATA.
11486 When there are multiple PREFIX_REPNZ and PREFIX_REPZ, the
11487 last one wins. */
11488 if ((prefixes & (PREFIX_REPZ | PREFIX_REPNZ)) != 0)
11489 {
11490 if (last_repz_prefix > last_repnz_prefix)
11491 {
11492 vindex = 1;
11493 prefix = PREFIX_REPZ;
11494 last_prefix = last_repz_prefix;
11495 }
11496 else
11497 {
11498 vindex = 3;
11499 prefix = PREFIX_REPNZ;
11500 last_prefix = last_repnz_prefix;
11501 }
11502
11503 /* Check if prefix should be ignored. */
11504 if ((((prefix_table[dp->op[1].bytemode][vindex].prefix_requirement
11505 & PREFIX_IGNORED) >> PREFIX_IGNORED_SHIFT)
11506 & prefix) != 0)
11507 vindex = 0;
11508 }
11509
11510 if (vindex == 0 && (prefixes & PREFIX_DATA) != 0)
11511 {
11512 vindex = 2;
11513 prefix = PREFIX_DATA;
11514 last_prefix = last_data_prefix;
11515 }
11516
11517 if (vindex != 0)
11518 {
11519 used_prefixes |= prefix;
11520 all_prefixes[last_prefix] = 0;
11521 }
11522 }
11523 dp = &prefix_table[dp->op[1].bytemode][vindex];
11524 break;
11525
11526 case USE_X86_64_TABLE:
11527 vindex = address_mode == mode_64bit ? 1 : 0;
11528 dp = &x86_64_table[dp->op[1].bytemode][vindex];
11529 break;
11530
11531 case USE_3BYTE_TABLE:
11532 FETCH_DATA (info, codep + 2);
11533 vindex = *codep++;
11534 dp = &three_byte_table[dp->op[1].bytemode][vindex];
11535 end_codep = codep;
11536 modrm.mod = (*codep >> 6) & 3;
11537 modrm.reg = (*codep >> 3) & 7;
11538 modrm.rm = *codep & 7;
11539 break;
11540
11541 case USE_VEX_LEN_TABLE:
11542 if (!need_vex)
11543 abort ();
11544
11545 switch (vex.length)
11546 {
11547 case 128:
11548 vindex = 0;
11549 break;
11550 case 256:
11551 vindex = 1;
11552 break;
11553 default:
11554 abort ();
11555 break;
11556 }
11557
11558 dp = &vex_len_table[dp->op[1].bytemode][vindex];
11559 break;
11560
11561 case USE_EVEX_LEN_TABLE:
11562 if (!vex.evex)
11563 abort ();
11564
11565 switch (vex.length)
11566 {
11567 case 128:
11568 vindex = 0;
11569 break;
11570 case 256:
11571 vindex = 1;
11572 break;
11573 case 512:
11574 vindex = 2;
11575 break;
11576 default:
11577 abort ();
11578 break;
11579 }
11580
11581 dp = &evex_len_table[dp->op[1].bytemode][vindex];
11582 break;
11583
11584 case USE_XOP_8F_TABLE:
11585 FETCH_DATA (info, codep + 3);
11586 /* All bits in the REX prefix are ignored. */
11587 rex_ignored = rex;
11588 rex = ~(*codep >> 5) & 0x7;
11589
11590 /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm". */
11591 switch ((*codep & 0x1f))
11592 {
11593 default:
11594 dp = &bad_opcode;
11595 return dp;
11596 case 0x8:
11597 vex_table_index = XOP_08;
11598 break;
11599 case 0x9:
11600 vex_table_index = XOP_09;
11601 break;
11602 case 0xa:
11603 vex_table_index = XOP_0A;
11604 break;
11605 }
11606 codep++;
11607 vex.w = *codep & 0x80;
11608 if (vex.w && address_mode == mode_64bit)
11609 rex |= REX_W;
11610
11611 vex.register_specifier = (~(*codep >> 3)) & 0xf;
11612 if (address_mode != mode_64bit)
11613 {
11614 /* In 16/32-bit mode REX_B is silently ignored. */
11615 rex &= ~REX_B;
11616 }
11617
11618 vex.length = (*codep & 0x4) ? 256 : 128;
11619 switch ((*codep & 0x3))
11620 {
11621 case 0:
11622 break;
11623 case 1:
11624 vex.prefix = DATA_PREFIX_OPCODE;
11625 break;
11626 case 2:
11627 vex.prefix = REPE_PREFIX_OPCODE;
11628 break;
11629 case 3:
11630 vex.prefix = REPNE_PREFIX_OPCODE;
11631 break;
11632 }
11633 need_vex = 1;
11634 need_vex_reg = 1;
11635 codep++;
11636 vindex = *codep++;
11637 dp = &xop_table[vex_table_index][vindex];
11638
11639 end_codep = codep;
11640 FETCH_DATA (info, codep + 1);
11641 modrm.mod = (*codep >> 6) & 3;
11642 modrm.reg = (*codep >> 3) & 7;
11643 modrm.rm = *codep & 7;
11644 break;
11645
11646 case USE_VEX_C4_TABLE:
11647 /* VEX prefix. */
11648 FETCH_DATA (info, codep + 3);
11649 /* All bits in the REX prefix are ignored. */
11650 rex_ignored = rex;
11651 rex = ~(*codep >> 5) & 0x7;
11652 switch ((*codep & 0x1f))
11653 {
11654 default:
11655 dp = &bad_opcode;
11656 return dp;
11657 case 0x1:
11658 vex_table_index = VEX_0F;
11659 break;
11660 case 0x2:
11661 vex_table_index = VEX_0F38;
11662 break;
11663 case 0x3:
11664 vex_table_index = VEX_0F3A;
11665 break;
11666 }
11667 codep++;
11668 vex.w = *codep & 0x80;
11669 if (address_mode == mode_64bit)
11670 {
11671 if (vex.w)
11672 rex |= REX_W;
11673 }
11674 else
11675 {
11676 /* For the 3-byte VEX prefix in 32-bit mode, the REX_B bit
11677 is ignored, other REX bits are 0 and the highest bit in
11678 VEX.vvvv is also ignored (but we mustn't clear it here). */
11679 rex = 0;
11680 }
11681 vex.register_specifier = (~(*codep >> 3)) & 0xf;
11682 vex.length = (*codep & 0x4) ? 256 : 128;
11683 switch ((*codep & 0x3))
11684 {
11685 case 0:
11686 break;
11687 case 1:
11688 vex.prefix = DATA_PREFIX_OPCODE;
11689 break;
11690 case 2:
11691 vex.prefix = REPE_PREFIX_OPCODE;
11692 break;
11693 case 3:
11694 vex.prefix = REPNE_PREFIX_OPCODE;
11695 break;
11696 }
11697 need_vex = 1;
11698 need_vex_reg = 1;
11699 codep++;
11700 vindex = *codep++;
11701 dp = &vex_table[vex_table_index][vindex];
11702 end_codep = codep;
11703 /* There is no MODRM byte for VEX0F 77. */
11704 if (vex_table_index != VEX_0F || vindex != 0x77)
11705 {
11706 FETCH_DATA (info, codep + 1);
11707 modrm.mod = (*codep >> 6) & 3;
11708 modrm.reg = (*codep >> 3) & 7;
11709 modrm.rm = *codep & 7;
11710 }
11711 break;
11712
11713 case USE_VEX_C5_TABLE:
11714 /* VEX prefix. */
11715 FETCH_DATA (info, codep + 2);
11716 /* All bits in the REX prefix are ignored. */
11717 rex_ignored = rex;
11718 rex = (*codep & 0x80) ? 0 : REX_R;
11719
11720 /* For the 2-byte VEX prefix in 32-bit mode, the highest bit in
11721 VEX.vvvv is 1. */
11722 vex.register_specifier = (~(*codep >> 3)) & 0xf;
11723 vex.length = (*codep & 0x4) ? 256 : 128;
11724 switch ((*codep & 0x3))
11725 {
11726 case 0:
11727 break;
11728 case 1:
11729 vex.prefix = DATA_PREFIX_OPCODE;
11730 break;
11731 case 2:
11732 vex.prefix = REPE_PREFIX_OPCODE;
11733 break;
11734 case 3:
11735 vex.prefix = REPNE_PREFIX_OPCODE;
11736 break;
11737 }
11738 need_vex = 1;
11739 need_vex_reg = 1;
11740 codep++;
11741 vindex = *codep++;
11742 dp = &vex_table[dp->op[1].bytemode][vindex];
11743 end_codep = codep;
11744 /* There is no MODRM byte for VEX 77. */
11745 if (vindex != 0x77)
11746 {
11747 FETCH_DATA (info, codep + 1);
11748 modrm.mod = (*codep >> 6) & 3;
11749 modrm.reg = (*codep >> 3) & 7;
11750 modrm.rm = *codep & 7;
11751 }
11752 break;
11753
11754 case USE_VEX_W_TABLE:
11755 if (!need_vex)
11756 abort ();
11757
11758 dp = &vex_w_table[dp->op[1].bytemode][vex.w ? 1 : 0];
11759 break;
11760
11761 case USE_EVEX_TABLE:
11762 two_source_ops = 0;
11763 /* EVEX prefix. */
11764 vex.evex = 1;
11765 FETCH_DATA (info, codep + 4);
11766 /* All bits in the REX prefix are ignored. */
11767 rex_ignored = rex;
11768 /* The first byte after 0x62. */
11769 rex = ~(*codep >> 5) & 0x7;
11770 vex.r = *codep & 0x10;
11771 switch ((*codep & 0xf))
11772 {
11773 default:
11774 return &bad_opcode;
11775 case 0x1:
11776 vex_table_index = EVEX_0F;
11777 break;
11778 case 0x2:
11779 vex_table_index = EVEX_0F38;
11780 break;
11781 case 0x3:
11782 vex_table_index = EVEX_0F3A;
11783 break;
11784 }
11785
11786 /* The second byte after 0x62. */
11787 codep++;
11788 vex.w = *codep & 0x80;
11789 if (vex.w && address_mode == mode_64bit)
11790 rex |= REX_W;
11791
11792 vex.register_specifier = (~(*codep >> 3)) & 0xf;
11793
11794 /* The U bit. */
11795 if (!(*codep & 0x4))
11796 return &bad_opcode;
11797
11798 switch ((*codep & 0x3))
11799 {
11800 case 0:
11801 break;
11802 case 1:
11803 vex.prefix = DATA_PREFIX_OPCODE;
11804 break;
11805 case 2:
11806 vex.prefix = REPE_PREFIX_OPCODE;
11807 break;
11808 case 3:
11809 vex.prefix = REPNE_PREFIX_OPCODE;
11810 break;
11811 }
11812
11813 /* The third byte after 0x62. */
11814 codep++;
11815
11816 /* Remember the static rounding bits. */
11817 vex.ll = (*codep >> 5) & 3;
11818 vex.b = (*codep & 0x10) != 0;
11819
11820 vex.v = *codep & 0x8;
11821 vex.mask_register_specifier = *codep & 0x7;
11822 vex.zeroing = *codep & 0x80;
11823
11824 if (address_mode != mode_64bit)
11825 {
11826 /* In 16/32-bit mode silently ignore following bits. */
11827 rex &= ~REX_B;
11828 vex.r = 1;
11829 vex.v = 1;
11830 }
11831
11832 need_vex = 1;
11833 need_vex_reg = 1;
11834 codep++;
11835 vindex = *codep++;
11836 dp = &evex_table[vex_table_index][vindex];
11837 end_codep = codep;
11838 FETCH_DATA (info, codep + 1);
11839 modrm.mod = (*codep >> 6) & 3;
11840 modrm.reg = (*codep >> 3) & 7;
11841 modrm.rm = *codep & 7;
11842
11843 /* Set vector length. */
11844 if (modrm.mod == 3 && vex.b)
11845 vex.length = 512;
11846 else
11847 {
11848 switch (vex.ll)
11849 {
11850 case 0x0:
11851 vex.length = 128;
11852 break;
11853 case 0x1:
11854 vex.length = 256;
11855 break;
11856 case 0x2:
11857 vex.length = 512;
11858 break;
11859 default:
11860 return &bad_opcode;
11861 }
11862 }
11863 break;
11864
11865 case 0:
11866 dp = &bad_opcode;
11867 break;
11868
11869 default:
11870 abort ();
11871 }
11872
11873 if (dp->name != NULL)
11874 return dp;
11875 else
11876 return get_valid_dis386 (dp, info);
11877 }
11878
11879 static void
11880 get_sib (disassemble_info *info, int sizeflag)
11881 {
11882 /* If modrm.mod == 3, operand must be register. */
11883 if (need_modrm
11884 && ((sizeflag & AFLAG) || address_mode == mode_64bit)
11885 && modrm.mod != 3
11886 && modrm.rm == 4)
11887 {
11888 FETCH_DATA (info, codep + 2);
11889 sib.index = (codep [1] >> 3) & 7;
11890 sib.scale = (codep [1] >> 6) & 3;
11891 sib.base = codep [1] & 7;
11892 }
11893 }
11894
11895 static int
11896 print_insn (bfd_vma pc, disassemble_info *info)
11897 {
11898 const struct dis386 *dp;
11899 int i;
11900 char *op_txt[MAX_OPERANDS];
11901 int needcomma;
11902 int sizeflag, orig_sizeflag;
11903 const char *p;
11904 struct dis_private priv;
11905 int prefix_length;
11906
11907 priv.orig_sizeflag = AFLAG | DFLAG;
11908 if ((info->mach & bfd_mach_i386_i386) != 0)
11909 address_mode = mode_32bit;
11910 else if (info->mach == bfd_mach_i386_i8086)
11911 {
11912 address_mode = mode_16bit;
11913 priv.orig_sizeflag = 0;
11914 }
11915 else
11916 address_mode = mode_64bit;
11917
11918 if (intel_syntax == (char) -1)
11919 intel_syntax = (info->mach & bfd_mach_i386_intel_syntax) != 0;
11920
11921 for (p = info->disassembler_options; p != NULL; )
11922 {
11923 if (CONST_STRNEQ (p, "amd64"))
11924 isa64 = amd64;
11925 else if (CONST_STRNEQ (p, "intel64"))
11926 isa64 = intel64;
11927 else if (CONST_STRNEQ (p, "x86-64"))
11928 {
11929 address_mode = mode_64bit;
11930 priv.orig_sizeflag = AFLAG | DFLAG;
11931 }
11932 else if (CONST_STRNEQ (p, "i386"))
11933 {
11934 address_mode = mode_32bit;
11935 priv.orig_sizeflag = AFLAG | DFLAG;
11936 }
11937 else if (CONST_STRNEQ (p, "i8086"))
11938 {
11939 address_mode = mode_16bit;
11940 priv.orig_sizeflag = 0;
11941 }
11942 else if (CONST_STRNEQ (p, "intel"))
11943 {
11944 intel_syntax = 1;
11945 if (CONST_STRNEQ (p + 5, "-mnemonic"))
11946 intel_mnemonic = 1;
11947 }
11948 else if (CONST_STRNEQ (p, "att"))
11949 {
11950 intel_syntax = 0;
11951 if (CONST_STRNEQ (p + 3, "-mnemonic"))
11952 intel_mnemonic = 0;
11953 }
11954 else if (CONST_STRNEQ (p, "addr"))
11955 {
11956 if (address_mode == mode_64bit)
11957 {
11958 if (p[4] == '3' && p[5] == '2')
11959 priv.orig_sizeflag &= ~AFLAG;
11960 else if (p[4] == '6' && p[5] == '4')
11961 priv.orig_sizeflag |= AFLAG;
11962 }
11963 else
11964 {
11965 if (p[4] == '1' && p[5] == '6')
11966 priv.orig_sizeflag &= ~AFLAG;
11967 else if (p[4] == '3' && p[5] == '2')
11968 priv.orig_sizeflag |= AFLAG;
11969 }
11970 }
11971 else if (CONST_STRNEQ (p, "data"))
11972 {
11973 if (p[4] == '1' && p[5] == '6')
11974 priv.orig_sizeflag &= ~DFLAG;
11975 else if (p[4] == '3' && p[5] == '2')
11976 priv.orig_sizeflag |= DFLAG;
11977 }
11978 else if (CONST_STRNEQ (p, "suffix"))
11979 priv.orig_sizeflag |= SUFFIX_ALWAYS;
11980
11981 p = strchr (p, ',');
11982 if (p != NULL)
11983 p++;
11984 }
11985
11986 if (address_mode == mode_64bit && sizeof (bfd_vma) < 8)
11987 {
11988 (*info->fprintf_func) (info->stream,
11989 _("64-bit address is disabled"));
11990 return -1;
11991 }
11992
11993 if (intel_syntax)
11994 {
11995 names64 = intel_names64;
11996 names32 = intel_names32;
11997 names16 = intel_names16;
11998 names8 = intel_names8;
11999 names8rex = intel_names8rex;
12000 names_seg = intel_names_seg;
12001 names_mm = intel_names_mm;
12002 names_bnd = intel_names_bnd;
12003 names_xmm = intel_names_xmm;
12004 names_ymm = intel_names_ymm;
12005 names_zmm = intel_names_zmm;
12006 index64 = intel_index64;
12007 index32 = intel_index32;
12008 names_mask = intel_names_mask;
12009 index16 = intel_index16;
12010 open_char = '[';
12011 close_char = ']';
12012 separator_char = '+';
12013 scale_char = '*';
12014 }
12015 else
12016 {
12017 names64 = att_names64;
12018 names32 = att_names32;
12019 names16 = att_names16;
12020 names8 = att_names8;
12021 names8rex = att_names8rex;
12022 names_seg = att_names_seg;
12023 names_mm = att_names_mm;
12024 names_bnd = att_names_bnd;
12025 names_xmm = att_names_xmm;
12026 names_ymm = att_names_ymm;
12027 names_zmm = att_names_zmm;
12028 index64 = att_index64;
12029 index32 = att_index32;
12030 names_mask = att_names_mask;
12031 index16 = att_index16;
12032 open_char = '(';
12033 close_char = ')';
12034 separator_char = ',';
12035 scale_char = ',';
12036 }
12037
12038 /* The output looks better if we put 7 bytes on a line, since that
12039 puts most long word instructions on a single line. Use 8 bytes
12040 for Intel L1OM. */
12041 if ((info->mach & bfd_mach_l1om) != 0)
12042 info->bytes_per_line = 8;
12043 else
12044 info->bytes_per_line = 7;
12045
12046 info->private_data = &priv;
12047 priv.max_fetched = priv.the_buffer;
12048 priv.insn_start = pc;
12049
12050 obuf[0] = 0;
12051 for (i = 0; i < MAX_OPERANDS; ++i)
12052 {
12053 op_out[i][0] = 0;
12054 op_index[i] = -1;
12055 }
12056
12057 the_info = info;
12058 start_pc = pc;
12059 start_codep = priv.the_buffer;
12060 codep = priv.the_buffer;
12061
12062 if (OPCODES_SIGSETJMP (priv.bailout) != 0)
12063 {
12064 const char *name;
12065
12066 /* Getting here means we tried for data but didn't get it. That
12067 means we have an incomplete instruction of some sort. Just
12068 print the first byte as a prefix or a .byte pseudo-op. */
12069 if (codep > priv.the_buffer)
12070 {
12071 name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
12072 if (name != NULL)
12073 (*info->fprintf_func) (info->stream, "%s", name);
12074 else
12075 {
12076 /* Just print the first byte as a .byte instruction. */
12077 (*info->fprintf_func) (info->stream, ".byte 0x%x",
12078 (unsigned int) priv.the_buffer[0]);
12079 }
12080
12081 return 1;
12082 }
12083
12084 return -1;
12085 }
12086
12087 obufp = obuf;
12088 sizeflag = priv.orig_sizeflag;
12089
12090 if (!ckprefix () || rex_used)
12091 {
12092 /* Too many prefixes or unused REX prefixes. */
12093 for (i = 0;
12094 i < (int) ARRAY_SIZE (all_prefixes) && all_prefixes[i];
12095 i++)
12096 (*info->fprintf_func) (info->stream, "%s%s",
12097 i == 0 ? "" : " ",
12098 prefix_name (all_prefixes[i], sizeflag));
12099 return i;
12100 }
12101
12102 insn_codep = codep;
12103
12104 FETCH_DATA (info, codep + 1);
12105 two_source_ops = (*codep == 0x62) || (*codep == 0xc8);
12106
12107 if (((prefixes & PREFIX_FWAIT)
12108 && ((*codep < 0xd8) || (*codep > 0xdf))))
12109 {
12110 /* Handle prefixes before fwait. */
12111 for (i = 0; i < fwait_prefix && all_prefixes[i];
12112 i++)
12113 (*info->fprintf_func) (info->stream, "%s ",
12114 prefix_name (all_prefixes[i], sizeflag));
12115 (*info->fprintf_func) (info->stream, "fwait");
12116 return i + 1;
12117 }
12118
12119 if (*codep == 0x0f)
12120 {
12121 unsigned char threebyte;
12122
12123 codep++;
12124 FETCH_DATA (info, codep + 1);
12125 threebyte = *codep;
12126 dp = &dis386_twobyte[threebyte];
12127 need_modrm = twobyte_has_modrm[*codep];
12128 codep++;
12129 }
12130 else
12131 {
12132 dp = &dis386[*codep];
12133 need_modrm = onebyte_has_modrm[*codep];
12134 codep++;
12135 }
12136
12137 /* Save sizeflag for printing the extra prefixes later before updating
12138 it for mnemonic and operand processing. The prefix names depend
12139 only on the address mode. */
12140 orig_sizeflag = sizeflag;
12141 if (prefixes & PREFIX_ADDR)
12142 sizeflag ^= AFLAG;
12143 if ((prefixes & PREFIX_DATA))
12144 sizeflag ^= DFLAG;
12145
12146 end_codep = codep;
12147 if (need_modrm)
12148 {
12149 FETCH_DATA (info, codep + 1);
12150 modrm.mod = (*codep >> 6) & 3;
12151 modrm.reg = (*codep >> 3) & 7;
12152 modrm.rm = *codep & 7;
12153 }
12154
12155 need_vex = 0;
12156 need_vex_reg = 0;
12157 vex_w_done = 0;
12158 memset (&vex, 0, sizeof (vex));
12159
12160 if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
12161 {
12162 get_sib (info, sizeflag);
12163 dofloat (sizeflag);
12164 }
12165 else
12166 {
12167 dp = get_valid_dis386 (dp, info);
12168 if (dp != NULL && putop (dp->name, sizeflag) == 0)
12169 {
12170 get_sib (info, sizeflag);
12171 for (i = 0; i < MAX_OPERANDS; ++i)
12172 {
12173 obufp = op_out[i];
12174 op_ad = MAX_OPERANDS - 1 - i;
12175 if (dp->op[i].rtn)
12176 (*dp->op[i].rtn) (dp->op[i].bytemode, sizeflag);
12177 /* For EVEX instruction after the last operand masking
12178 should be printed. */
12179 if (i == 0 && vex.evex)
12180 {
12181 /* Don't print {%k0}. */
12182 if (vex.mask_register_specifier)
12183 {
12184 oappend ("{");
12185 oappend (names_mask[vex.mask_register_specifier]);
12186 oappend ("}");
12187 }
12188 if (vex.zeroing)
12189 oappend ("{z}");
12190 }
12191 }
12192 }
12193 }
12194
12195 /* Check if the REX prefix is used. */
12196 if (rex_ignored == 0 && (rex ^ rex_used) == 0 && last_rex_prefix >= 0)
12197 all_prefixes[last_rex_prefix] = 0;
12198
12199 /* Check if the SEG prefix is used. */
12200 if ((prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS | PREFIX_ES
12201 | PREFIX_FS | PREFIX_GS)) != 0
12202 && (used_prefixes & active_seg_prefix) != 0)
12203 all_prefixes[last_seg_prefix] = 0;
12204
12205 /* Check if the ADDR prefix is used. */
12206 if ((prefixes & PREFIX_ADDR) != 0
12207 && (used_prefixes & PREFIX_ADDR) != 0)
12208 all_prefixes[last_addr_prefix] = 0;
12209
12210 /* Check if the DATA prefix is used. */
12211 if ((prefixes & PREFIX_DATA) != 0
12212 && (used_prefixes & PREFIX_DATA) != 0)
12213 all_prefixes[last_data_prefix] = 0;
12214
12215 /* Print the extra prefixes. */
12216 prefix_length = 0;
12217 for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
12218 if (all_prefixes[i])
12219 {
12220 const char *name;
12221 name = prefix_name (all_prefixes[i], orig_sizeflag);
12222 if (name == NULL)
12223 abort ();
12224 prefix_length += strlen (name) + 1;
12225 (*info->fprintf_func) (info->stream, "%s ", name);
12226 }
12227
12228 /* If the mandatory PREFIX_REPZ/PREFIX_REPNZ/PREFIX_DATA prefix is
12229 unused, opcode is invalid. Since the PREFIX_DATA prefix may be
12230 used by putop and MMX/SSE operand and may be overriden by the
12231 PREFIX_REPZ/PREFIX_REPNZ fix, we check the PREFIX_DATA prefix
12232 separately. */
12233 if (dp->prefix_requirement == PREFIX_OPCODE
12234 && dp != &bad_opcode
12235 && (((prefixes
12236 & (PREFIX_REPZ | PREFIX_REPNZ)) != 0
12237 && (used_prefixes
12238 & (PREFIX_REPZ | PREFIX_REPNZ)) == 0)
12239 || ((((prefixes
12240 & (PREFIX_REPZ | PREFIX_REPNZ | PREFIX_DATA))
12241 == PREFIX_DATA)
12242 && (used_prefixes & PREFIX_DATA) == 0))))
12243 {
12244 (*info->fprintf_func) (info->stream, "(bad)");
12245 return end_codep - priv.the_buffer;
12246 }
12247
12248 /* Check maximum code length. */
12249 if ((codep - start_codep) > MAX_CODE_LENGTH)
12250 {
12251 (*info->fprintf_func) (info->stream, "(bad)");
12252 return MAX_CODE_LENGTH;
12253 }
12254
12255 obufp = mnemonicendp;
12256 for (i = strlen (obuf) + prefix_length; i < 6; i++)
12257 oappend (" ");
12258 oappend (" ");
12259 (*info->fprintf_func) (info->stream, "%s", obuf);
12260
12261 /* The enter and bound instructions are printed with operands in the same
12262 order as the intel book; everything else is printed in reverse order. */
12263 if (intel_syntax || two_source_ops)
12264 {
12265 bfd_vma riprel;
12266
12267 for (i = 0; i < MAX_OPERANDS; ++i)
12268 op_txt[i] = op_out[i];
12269
12270 if (intel_syntax && dp && dp->op[2].rtn == OP_Rounding
12271 && dp->op[3].rtn == OP_E && dp->op[4].rtn == NULL)
12272 {
12273 op_txt[2] = op_out[3];
12274 op_txt[3] = op_out[2];
12275 }
12276
12277 for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
12278 {
12279 op_ad = op_index[i];
12280 op_index[i] = op_index[MAX_OPERANDS - 1 - i];
12281 op_index[MAX_OPERANDS - 1 - i] = op_ad;
12282 riprel = op_riprel[i];
12283 op_riprel[i] = op_riprel [MAX_OPERANDS - 1 - i];
12284 op_riprel[MAX_OPERANDS - 1 - i] = riprel;
12285 }
12286 }
12287 else
12288 {
12289 for (i = 0; i < MAX_OPERANDS; ++i)
12290 op_txt[MAX_OPERANDS - 1 - i] = op_out[i];
12291 }
12292
12293 needcomma = 0;
12294 for (i = 0; i < MAX_OPERANDS; ++i)
12295 if (*op_txt[i])
12296 {
12297 if (needcomma)
12298 (*info->fprintf_func) (info->stream, ",");
12299 if (op_index[i] != -1 && !op_riprel[i])
12300 (*info->print_address_func) ((bfd_vma) op_address[op_index[i]], info);
12301 else
12302 (*info->fprintf_func) (info->stream, "%s", op_txt[i]);
12303 needcomma = 1;
12304 }
12305
12306 for (i = 0; i < MAX_OPERANDS; i++)
12307 if (op_index[i] != -1 && op_riprel[i])
12308 {
12309 (*info->fprintf_func) (info->stream, " # ");
12310 (*info->print_address_func) ((bfd_vma) (start_pc + (codep - start_codep)
12311 + op_address[op_index[i]]), info);
12312 break;
12313 }
12314 return codep - priv.the_buffer;
12315 }
12316
12317 static const char *float_mem[] = {
12318 /* d8 */
12319 "fadd{s|}",
12320 "fmul{s|}",
12321 "fcom{s|}",
12322 "fcomp{s|}",
12323 "fsub{s|}",
12324 "fsubr{s|}",
12325 "fdiv{s|}",
12326 "fdivr{s|}",
12327 /* d9 */
12328 "fld{s|}",
12329 "(bad)",
12330 "fst{s|}",
12331 "fstp{s|}",
12332 "fldenvIC",
12333 "fldcw",
12334 "fNstenvIC",
12335 "fNstcw",
12336 /* da */
12337 "fiadd{l|}",
12338 "fimul{l|}",
12339 "ficom{l|}",
12340 "ficomp{l|}",
12341 "fisub{l|}",
12342 "fisubr{l|}",
12343 "fidiv{l|}",
12344 "fidivr{l|}",
12345 /* db */
12346 "fild{l|}",
12347 "fisttp{l|}",
12348 "fist{l|}",
12349 "fistp{l|}",
12350 "(bad)",
12351 "fld{t||t|}",
12352 "(bad)",
12353 "fstp{t||t|}",
12354 /* dc */
12355 "fadd{l|}",
12356 "fmul{l|}",
12357 "fcom{l|}",
12358 "fcomp{l|}",
12359 "fsub{l|}",
12360 "fsubr{l|}",
12361 "fdiv{l|}",
12362 "fdivr{l|}",
12363 /* dd */
12364 "fld{l|}",
12365 "fisttp{ll|}",
12366 "fst{l||}",
12367 "fstp{l|}",
12368 "frstorIC",
12369 "(bad)",
12370 "fNsaveIC",
12371 "fNstsw",
12372 /* de */
12373 "fiadd{s|}",
12374 "fimul{s|}",
12375 "ficom{s|}",
12376 "ficomp{s|}",
12377 "fisub{s|}",
12378 "fisubr{s|}",
12379 "fidiv{s|}",
12380 "fidivr{s|}",
12381 /* df */
12382 "fild{s|}",
12383 "fisttp{s|}",
12384 "fist{s|}",
12385 "fistp{s|}",
12386 "fbld",
12387 "fild{ll|}",
12388 "fbstp",
12389 "fistp{ll|}",
12390 };
12391
12392 static const unsigned char float_mem_mode[] = {
12393 /* d8 */
12394 d_mode,
12395 d_mode,
12396 d_mode,
12397 d_mode,
12398 d_mode,
12399 d_mode,
12400 d_mode,
12401 d_mode,
12402 /* d9 */
12403 d_mode,
12404 0,
12405 d_mode,
12406 d_mode,
12407 0,
12408 w_mode,
12409 0,
12410 w_mode,
12411 /* da */
12412 d_mode,
12413 d_mode,
12414 d_mode,
12415 d_mode,
12416 d_mode,
12417 d_mode,
12418 d_mode,
12419 d_mode,
12420 /* db */
12421 d_mode,
12422 d_mode,
12423 d_mode,
12424 d_mode,
12425 0,
12426 t_mode,
12427 0,
12428 t_mode,
12429 /* dc */
12430 q_mode,
12431 q_mode,
12432 q_mode,
12433 q_mode,
12434 q_mode,
12435 q_mode,
12436 q_mode,
12437 q_mode,
12438 /* dd */
12439 q_mode,
12440 q_mode,
12441 q_mode,
12442 q_mode,
12443 0,
12444 0,
12445 0,
12446 w_mode,
12447 /* de */
12448 w_mode,
12449 w_mode,
12450 w_mode,
12451 w_mode,
12452 w_mode,
12453 w_mode,
12454 w_mode,
12455 w_mode,
12456 /* df */
12457 w_mode,
12458 w_mode,
12459 w_mode,
12460 w_mode,
12461 t_mode,
12462 q_mode,
12463 t_mode,
12464 q_mode
12465 };
12466
12467 #define ST { OP_ST, 0 }
12468 #define STi { OP_STi, 0 }
12469
12470 #define FGRPd9_2 NULL, { { NULL, 1 } }, 0
12471 #define FGRPd9_4 NULL, { { NULL, 2 } }, 0
12472 #define FGRPd9_5 NULL, { { NULL, 3 } }, 0
12473 #define FGRPd9_6 NULL, { { NULL, 4 } }, 0
12474 #define FGRPd9_7 NULL, { { NULL, 5 } }, 0
12475 #define FGRPda_5 NULL, { { NULL, 6 } }, 0
12476 #define FGRPdb_4 NULL, { { NULL, 7 } }, 0
12477 #define FGRPde_3 NULL, { { NULL, 8 } }, 0
12478 #define FGRPdf_4 NULL, { { NULL, 9 } }, 0
12479
12480 static const struct dis386 float_reg[][8] = {
12481 /* d8 */
12482 {
12483 { "fadd", { ST, STi }, 0 },
12484 { "fmul", { ST, STi }, 0 },
12485 { "fcom", { STi }, 0 },
12486 { "fcomp", { STi }, 0 },
12487 { "fsub", { ST, STi }, 0 },
12488 { "fsubr", { ST, STi }, 0 },
12489 { "fdiv", { ST, STi }, 0 },
12490 { "fdivr", { ST, STi }, 0 },
12491 },
12492 /* d9 */
12493 {
12494 { "fld", { STi }, 0 },
12495 { "fxch", { STi }, 0 },
12496 { FGRPd9_2 },
12497 { Bad_Opcode },
12498 { FGRPd9_4 },
12499 { FGRPd9_5 },
12500 { FGRPd9_6 },
12501 { FGRPd9_7 },
12502 },
12503 /* da */
12504 {
12505 { "fcmovb", { ST, STi }, 0 },
12506 { "fcmove", { ST, STi }, 0 },
12507 { "fcmovbe",{ ST, STi }, 0 },
12508 { "fcmovu", { ST, STi }, 0 },
12509 { Bad_Opcode },
12510 { FGRPda_5 },
12511 { Bad_Opcode },
12512 { Bad_Opcode },
12513 },
12514 /* db */
12515 {
12516 { "fcmovnb",{ ST, STi }, 0 },
12517 { "fcmovne",{ ST, STi }, 0 },
12518 { "fcmovnbe",{ ST, STi }, 0 },
12519 { "fcmovnu",{ ST, STi }, 0 },
12520 { FGRPdb_4 },
12521 { "fucomi", { ST, STi }, 0 },
12522 { "fcomi", { ST, STi }, 0 },
12523 { Bad_Opcode },
12524 },
12525 /* dc */
12526 {
12527 { "fadd", { STi, ST }, 0 },
12528 { "fmul", { STi, ST }, 0 },
12529 { Bad_Opcode },
12530 { Bad_Opcode },
12531 { "fsub{!M|r}", { STi, ST }, 0 },
12532 { "fsub{M|}", { STi, ST }, 0 },
12533 { "fdiv{!M|r}", { STi, ST }, 0 },
12534 { "fdiv{M|}", { STi, ST }, 0 },
12535 },
12536 /* dd */
12537 {
12538 { "ffree", { STi }, 0 },
12539 { Bad_Opcode },
12540 { "fst", { STi }, 0 },
12541 { "fstp", { STi }, 0 },
12542 { "fucom", { STi }, 0 },
12543 { "fucomp", { STi }, 0 },
12544 { Bad_Opcode },
12545 { Bad_Opcode },
12546 },
12547 /* de */
12548 {
12549 { "faddp", { STi, ST }, 0 },
12550 { "fmulp", { STi, ST }, 0 },
12551 { Bad_Opcode },
12552 { FGRPde_3 },
12553 { "fsub{!M|r}p", { STi, ST }, 0 },
12554 { "fsub{M|}p", { STi, ST }, 0 },
12555 { "fdiv{!M|r}p", { STi, ST }, 0 },
12556 { "fdiv{M|}p", { STi, ST }, 0 },
12557 },
12558 /* df */
12559 {
12560 { "ffreep", { STi }, 0 },
12561 { Bad_Opcode },
12562 { Bad_Opcode },
12563 { Bad_Opcode },
12564 { FGRPdf_4 },
12565 { "fucomip", { ST, STi }, 0 },
12566 { "fcomip", { ST, STi }, 0 },
12567 { Bad_Opcode },
12568 },
12569 };
12570
12571 static char *fgrps[][8] = {
12572 /* Bad opcode 0 */
12573 {
12574 "(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
12575 },
12576
12577 /* d9_2 1 */
12578 {
12579 "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
12580 },
12581
12582 /* d9_4 2 */
12583 {
12584 "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
12585 },
12586
12587 /* d9_5 3 */
12588 {
12589 "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
12590 },
12591
12592 /* d9_6 4 */
12593 {
12594 "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
12595 },
12596
12597 /* d9_7 5 */
12598 {
12599 "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
12600 },
12601
12602 /* da_5 6 */
12603 {
12604 "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
12605 },
12606
12607 /* db_4 7 */
12608 {
12609 "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
12610 "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
12611 },
12612
12613 /* de_3 8 */
12614 {
12615 "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
12616 },
12617
12618 /* df_4 9 */
12619 {
12620 "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
12621 },
12622 };
12623
12624 static void
12625 swap_operand (void)
12626 {
12627 mnemonicendp[0] = '.';
12628 mnemonicendp[1] = 's';
12629 mnemonicendp += 2;
12630 }
12631
12632 static void
12633 OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED,
12634 int sizeflag ATTRIBUTE_UNUSED)
12635 {
12636 /* Skip mod/rm byte. */
12637 MODRM_CHECK;
12638 codep++;
12639 }
12640
12641 static void
12642 dofloat (int sizeflag)
12643 {
12644 const struct dis386 *dp;
12645 unsigned char floatop;
12646
12647 floatop = codep[-1];
12648
12649 if (modrm.mod != 3)
12650 {
12651 int fp_indx = (floatop - 0xd8) * 8 + modrm.reg;
12652
12653 putop (float_mem[fp_indx], sizeflag);
12654 obufp = op_out[0];
12655 op_ad = 2;
12656 OP_E (float_mem_mode[fp_indx], sizeflag);
12657 return;
12658 }
12659 /* Skip mod/rm byte. */
12660 MODRM_CHECK;
12661 codep++;
12662
12663 dp = &float_reg[floatop - 0xd8][modrm.reg];
12664 if (dp->name == NULL)
12665 {
12666 putop (fgrps[dp->op[0].bytemode][modrm.rm], sizeflag);
12667
12668 /* Instruction fnstsw is only one with strange arg. */
12669 if (floatop == 0xdf && codep[-1] == 0xe0)
12670 strcpy (op_out[0], names16[0]);
12671 }
12672 else
12673 {
12674 putop (dp->name, sizeflag);
12675
12676 obufp = op_out[0];
12677 op_ad = 2;
12678 if (dp->op[0].rtn)
12679 (*dp->op[0].rtn) (dp->op[0].bytemode, sizeflag);
12680
12681 obufp = op_out[1];
12682 op_ad = 1;
12683 if (dp->op[1].rtn)
12684 (*dp->op[1].rtn) (dp->op[1].bytemode, sizeflag);
12685 }
12686 }
12687
12688 /* Like oappend (below), but S is a string starting with '%'.
12689 In Intel syntax, the '%' is elided. */
12690 static void
12691 oappend_maybe_intel (const char *s)
12692 {
12693 oappend (s + intel_syntax);
12694 }
12695
12696 static void
12697 OP_ST (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12698 {
12699 oappend_maybe_intel ("%st");
12700 }
12701
12702 static void
12703 OP_STi (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12704 {
12705 sprintf (scratchbuf, "%%st(%d)", modrm.rm);
12706 oappend_maybe_intel (scratchbuf);
12707 }
12708
12709 /* Capital letters in template are macros. */
12710 static int
12711 putop (const char *in_template, int sizeflag)
12712 {
12713 const char *p;
12714 int alt = 0;
12715 int cond = 1;
12716 unsigned int l = 0, len = 1;
12717 char last[4];
12718
12719 #define SAVE_LAST(c) \
12720 if (l < len && l < sizeof (last)) \
12721 last[l++] = c; \
12722 else \
12723 abort ();
12724
12725 for (p = in_template; *p; p++)
12726 {
12727 switch (*p)
12728 {
12729 default:
12730 *obufp++ = *p;
12731 break;
12732 case '%':
12733 len++;
12734 break;
12735 case '!':
12736 cond = 0;
12737 break;
12738 case '{':
12739 if (intel_syntax)
12740 {
12741 while (*++p != '|')
12742 if (*p == '}' || *p == '\0')
12743 abort ();
12744 }
12745 /* Fall through. */
12746 case 'I':
12747 alt = 1;
12748 continue;
12749 case '|':
12750 while (*++p != '}')
12751 {
12752 if (*p == '\0')
12753 abort ();
12754 }
12755 break;
12756 case '}':
12757 break;
12758 case 'A':
12759 if (intel_syntax)
12760 break;
12761 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
12762 *obufp++ = 'b';
12763 break;
12764 case 'B':
12765 if (l == 0 && len == 1)
12766 {
12767 case_B:
12768 if (intel_syntax)
12769 break;
12770 if (sizeflag & SUFFIX_ALWAYS)
12771 *obufp++ = 'b';
12772 }
12773 else
12774 {
12775 if (l != 1
12776 || len != 2
12777 || last[0] != 'L')
12778 {
12779 SAVE_LAST (*p);
12780 break;
12781 }
12782
12783 if (address_mode == mode_64bit
12784 && !(prefixes & PREFIX_ADDR))
12785 {
12786 *obufp++ = 'a';
12787 *obufp++ = 'b';
12788 *obufp++ = 's';
12789 }
12790
12791 goto case_B;
12792 }
12793 break;
12794 case 'C':
12795 if (intel_syntax && !alt)
12796 break;
12797 if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
12798 {
12799 if (sizeflag & DFLAG)
12800 *obufp++ = intel_syntax ? 'd' : 'l';
12801 else
12802 *obufp++ = intel_syntax ? 'w' : 's';
12803 used_prefixes |= (prefixes & PREFIX_DATA);
12804 }
12805 break;
12806 case 'D':
12807 if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
12808 break;
12809 USED_REX (REX_W);
12810 if (modrm.mod == 3)
12811 {
12812 if (rex & REX_W)
12813 *obufp++ = 'q';
12814 else
12815 {
12816 if (sizeflag & DFLAG)
12817 *obufp++ = intel_syntax ? 'd' : 'l';
12818 else
12819 *obufp++ = 'w';
12820 used_prefixes |= (prefixes & PREFIX_DATA);
12821 }
12822 }
12823 else
12824 *obufp++ = 'w';
12825 break;
12826 case 'E': /* For jcxz/jecxz */
12827 if (address_mode == mode_64bit)
12828 {
12829 if (sizeflag & AFLAG)
12830 *obufp++ = 'r';
12831 else
12832 *obufp++ = 'e';
12833 }
12834 else
12835 if (sizeflag & AFLAG)
12836 *obufp++ = 'e';
12837 used_prefixes |= (prefixes & PREFIX_ADDR);
12838 break;
12839 case 'F':
12840 if (intel_syntax)
12841 break;
12842 if ((prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
12843 {
12844 if (sizeflag & AFLAG)
12845 *obufp++ = address_mode == mode_64bit ? 'q' : 'l';
12846 else
12847 *obufp++ = address_mode == mode_64bit ? 'l' : 'w';
12848 used_prefixes |= (prefixes & PREFIX_ADDR);
12849 }
12850 break;
12851 case 'G':
12852 if (intel_syntax || (obufp[-1] != 's' && !(sizeflag & SUFFIX_ALWAYS)))
12853 break;
12854 if ((rex & REX_W) || (sizeflag & DFLAG))
12855 *obufp++ = 'l';
12856 else
12857 *obufp++ = 'w';
12858 if (!(rex & REX_W))
12859 used_prefixes |= (prefixes & PREFIX_DATA);
12860 break;
12861 case 'H':
12862 if (intel_syntax)
12863 break;
12864 if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
12865 || (prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
12866 {
12867 used_prefixes |= prefixes & (PREFIX_CS | PREFIX_DS);
12868 *obufp++ = ',';
12869 *obufp++ = 'p';
12870 if (prefixes & PREFIX_DS)
12871 *obufp++ = 't';
12872 else
12873 *obufp++ = 'n';
12874 }
12875 break;
12876 case 'J':
12877 if (intel_syntax)
12878 break;
12879 *obufp++ = 'l';
12880 break;
12881 case 'K':
12882 USED_REX (REX_W);
12883 if (rex & REX_W)
12884 *obufp++ = 'q';
12885 else
12886 *obufp++ = 'd';
12887 break;
12888 case 'Z':
12889 if (l != 0 || len != 1)
12890 {
12891 if (l != 1 || len != 2 || last[0] != 'X')
12892 {
12893 SAVE_LAST (*p);
12894 break;
12895 }
12896 if (!need_vex || !vex.evex)
12897 abort ();
12898 if (intel_syntax
12899 || ((modrm.mod == 3 || vex.b) && !(sizeflag & SUFFIX_ALWAYS)))
12900 break;
12901 switch (vex.length)
12902 {
12903 case 128:
12904 *obufp++ = 'x';
12905 break;
12906 case 256:
12907 *obufp++ = 'y';
12908 break;
12909 case 512:
12910 *obufp++ = 'z';
12911 break;
12912 default:
12913 abort ();
12914 }
12915 break;
12916 }
12917 if (intel_syntax)
12918 break;
12919 if (address_mode == mode_64bit && (sizeflag & SUFFIX_ALWAYS))
12920 {
12921 *obufp++ = 'q';
12922 break;
12923 }
12924 /* Fall through. */
12925 goto case_L;
12926 case 'L':
12927 if (l != 0 || len != 1)
12928 {
12929 SAVE_LAST (*p);
12930 break;
12931 }
12932 case_L:
12933 if (intel_syntax)
12934 break;
12935 if (sizeflag & SUFFIX_ALWAYS)
12936 *obufp++ = 'l';
12937 break;
12938 case 'M':
12939 if (intel_mnemonic != cond)
12940 *obufp++ = 'r';
12941 break;
12942 case 'N':
12943 if ((prefixes & PREFIX_FWAIT) == 0)
12944 *obufp++ = 'n';
12945 else
12946 used_prefixes |= PREFIX_FWAIT;
12947 break;
12948 case 'O':
12949 USED_REX (REX_W);
12950 if (rex & REX_W)
12951 *obufp++ = 'o';
12952 else if (intel_syntax && (sizeflag & DFLAG))
12953 *obufp++ = 'q';
12954 else
12955 *obufp++ = 'd';
12956 if (!(rex & REX_W))
12957 used_prefixes |= (prefixes & PREFIX_DATA);
12958 break;
12959 case '&':
12960 if (!intel_syntax
12961 && address_mode == mode_64bit
12962 && isa64 == intel64)
12963 {
12964 *obufp++ = 'q';
12965 break;
12966 }
12967 /* Fall through. */
12968 case 'T':
12969 if (!intel_syntax
12970 && address_mode == mode_64bit
12971 && ((sizeflag & DFLAG) || (rex & REX_W)))
12972 {
12973 *obufp++ = 'q';
12974 break;
12975 }
12976 /* Fall through. */
12977 goto case_P;
12978 case 'P':
12979 if (l == 0 && len == 1)
12980 {
12981 case_P:
12982 if (intel_syntax)
12983 {
12984 if ((rex & REX_W) == 0
12985 && (prefixes & PREFIX_DATA))
12986 {
12987 if ((sizeflag & DFLAG) == 0)
12988 *obufp++ = 'w';
12989 used_prefixes |= (prefixes & PREFIX_DATA);
12990 }
12991 break;
12992 }
12993 if ((prefixes & PREFIX_DATA)
12994 || (rex & REX_W)
12995 || (sizeflag & SUFFIX_ALWAYS))
12996 {
12997 USED_REX (REX_W);
12998 if (rex & REX_W)
12999 *obufp++ = 'q';
13000 else
13001 {
13002 if (sizeflag & DFLAG)
13003 *obufp++ = 'l';
13004 else
13005 *obufp++ = 'w';
13006 used_prefixes |= (prefixes & PREFIX_DATA);
13007 }
13008 }
13009 }
13010 else
13011 {
13012 if (l != 1 || len != 2 || last[0] != 'L')
13013 {
13014 SAVE_LAST (*p);
13015 break;
13016 }
13017
13018 if ((prefixes & PREFIX_DATA)
13019 || (rex & REX_W)
13020 || (sizeflag & SUFFIX_ALWAYS))
13021 {
13022 USED_REX (REX_W);
13023 if (rex & REX_W)
13024 *obufp++ = 'q';
13025 else
13026 {
13027 if (sizeflag & DFLAG)
13028 *obufp++ = intel_syntax ? 'd' : 'l';
13029 else
13030 *obufp++ = 'w';
13031 used_prefixes |= (prefixes & PREFIX_DATA);
13032 }
13033 }
13034 }
13035 break;
13036 case 'U':
13037 if (intel_syntax)
13038 break;
13039 if (address_mode == mode_64bit
13040 && ((sizeflag & DFLAG) || (rex & REX_W)))
13041 {
13042 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
13043 *obufp++ = 'q';
13044 break;
13045 }
13046 /* Fall through. */
13047 goto case_Q;
13048 case 'Q':
13049 if (l == 0 && len == 1)
13050 {
13051 case_Q:
13052 if (intel_syntax && !alt)
13053 break;
13054 USED_REX (REX_W);
13055 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
13056 {
13057 if (rex & REX_W)
13058 *obufp++ = 'q';
13059 else
13060 {
13061 if (sizeflag & DFLAG)
13062 *obufp++ = intel_syntax ? 'd' : 'l';
13063 else
13064 *obufp++ = 'w';
13065 used_prefixes |= (prefixes & PREFIX_DATA);
13066 }
13067 }
13068 }
13069 else
13070 {
13071 if (l != 1 || len != 2 || last[0] != 'L')
13072 {
13073 SAVE_LAST (*p);
13074 break;
13075 }
13076 if (intel_syntax
13077 || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
13078 break;
13079 if ((rex & REX_W))
13080 {
13081 USED_REX (REX_W);
13082 *obufp++ = 'q';
13083 }
13084 else
13085 *obufp++ = 'l';
13086 }
13087 break;
13088 case 'R':
13089 USED_REX (REX_W);
13090 if (rex & REX_W)
13091 *obufp++ = 'q';
13092 else if (sizeflag & DFLAG)
13093 {
13094 if (intel_syntax)
13095 *obufp++ = 'd';
13096 else
13097 *obufp++ = 'l';
13098 }
13099 else
13100 *obufp++ = 'w';
13101 if (intel_syntax && !p[1]
13102 && ((rex & REX_W) || (sizeflag & DFLAG)))
13103 *obufp++ = 'e';
13104 if (!(rex & REX_W))
13105 used_prefixes |= (prefixes & PREFIX_DATA);
13106 break;
13107 case 'V':
13108 if (l == 0 && len == 1)
13109 {
13110 if (intel_syntax)
13111 break;
13112 if (address_mode == mode_64bit
13113 && ((sizeflag & DFLAG) || (rex & REX_W)))
13114 {
13115 if (sizeflag & SUFFIX_ALWAYS)
13116 *obufp++ = 'q';
13117 break;
13118 }
13119 }
13120 else
13121 {
13122 if (l != 1
13123 || len != 2
13124 || last[0] != 'L')
13125 {
13126 SAVE_LAST (*p);
13127 break;
13128 }
13129
13130 if (rex & REX_W)
13131 {
13132 *obufp++ = 'a';
13133 *obufp++ = 'b';
13134 *obufp++ = 's';
13135 }
13136 }
13137 /* Fall through. */
13138 goto case_S;
13139 case 'S':
13140 if (l == 0 && len == 1)
13141 {
13142 case_S:
13143 if (intel_syntax)
13144 break;
13145 if (sizeflag & SUFFIX_ALWAYS)
13146 {
13147 if (rex & REX_W)
13148 *obufp++ = 'q';
13149 else
13150 {
13151 if (sizeflag & DFLAG)
13152 *obufp++ = 'l';
13153 else
13154 *obufp++ = 'w';
13155 used_prefixes |= (prefixes & PREFIX_DATA);
13156 }
13157 }
13158 }
13159 else
13160 {
13161 if (l != 1
13162 || len != 2
13163 || last[0] != 'L')
13164 {
13165 SAVE_LAST (*p);
13166 break;
13167 }
13168
13169 if (address_mode == mode_64bit
13170 && !(prefixes & PREFIX_ADDR))
13171 {
13172 *obufp++ = 'a';
13173 *obufp++ = 'b';
13174 *obufp++ = 's';
13175 }
13176
13177 goto case_S;
13178 }
13179 break;
13180 case 'X':
13181 if (l != 0 || len != 1)
13182 {
13183 SAVE_LAST (*p);
13184 break;
13185 }
13186 if (need_vex && vex.prefix)
13187 {
13188 if (vex.prefix == DATA_PREFIX_OPCODE)
13189 *obufp++ = 'd';
13190 else
13191 *obufp++ = 's';
13192 }
13193 else
13194 {
13195 if (prefixes & PREFIX_DATA)
13196 *obufp++ = 'd';
13197 else
13198 *obufp++ = 's';
13199 used_prefixes |= (prefixes & PREFIX_DATA);
13200 }
13201 break;
13202 case 'Y':
13203 if (l == 0 && len == 1)
13204 abort ();
13205 else
13206 {
13207 if (l != 1 || len != 2 || last[0] != 'X')
13208 {
13209 SAVE_LAST (*p);
13210 break;
13211 }
13212 if (!need_vex)
13213 abort ();
13214 if (intel_syntax
13215 || ((modrm.mod == 3 || vex.b) && !(sizeflag & SUFFIX_ALWAYS)))
13216 break;
13217 switch (vex.length)
13218 {
13219 case 128:
13220 *obufp++ = 'x';
13221 break;
13222 case 256:
13223 *obufp++ = 'y';
13224 break;
13225 case 512:
13226 if (!vex.evex)
13227 default:
13228 abort ();
13229 }
13230 }
13231 break;
13232 case 'W':
13233 if (l == 0 && len == 1)
13234 {
13235 /* operand size flag for cwtl, cbtw */
13236 USED_REX (REX_W);
13237 if (rex & REX_W)
13238 {
13239 if (intel_syntax)
13240 *obufp++ = 'd';
13241 else
13242 *obufp++ = 'l';
13243 }
13244 else if (sizeflag & DFLAG)
13245 *obufp++ = 'w';
13246 else
13247 *obufp++ = 'b';
13248 if (!(rex & REX_W))
13249 used_prefixes |= (prefixes & PREFIX_DATA);
13250 }
13251 else
13252 {
13253 if (l != 1
13254 || len != 2
13255 || (last[0] != 'X'
13256 && last[0] != 'L'))
13257 {
13258 SAVE_LAST (*p);
13259 break;
13260 }
13261 if (!need_vex)
13262 abort ();
13263 if (last[0] == 'X')
13264 *obufp++ = vex.w ? 'd': 's';
13265 else
13266 *obufp++ = vex.w ? 'q': 'd';
13267 }
13268 break;
13269 case '^':
13270 if (intel_syntax)
13271 break;
13272 if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
13273 {
13274 if (sizeflag & DFLAG)
13275 *obufp++ = 'l';
13276 else
13277 *obufp++ = 'w';
13278 used_prefixes |= (prefixes & PREFIX_DATA);
13279 }
13280 break;
13281 case '@':
13282 if (intel_syntax)
13283 break;
13284 if (address_mode == mode_64bit
13285 && (isa64 == intel64
13286 || ((sizeflag & DFLAG) || (rex & REX_W))))
13287 *obufp++ = 'q';
13288 else if ((prefixes & PREFIX_DATA))
13289 {
13290 if (!(sizeflag & DFLAG))
13291 *obufp++ = 'w';
13292 used_prefixes |= (prefixes & PREFIX_DATA);
13293 }
13294 break;
13295 }
13296 alt = 0;
13297 }
13298 *obufp = 0;
13299 mnemonicendp = obufp;
13300 return 0;
13301 }
13302
13303 static void
13304 oappend (const char *s)
13305 {
13306 obufp = stpcpy (obufp, s);
13307 }
13308
13309 static void
13310 append_seg (void)
13311 {
13312 /* Only print the active segment register. */
13313 if (!active_seg_prefix)
13314 return;
13315
13316 used_prefixes |= active_seg_prefix;
13317 switch (active_seg_prefix)
13318 {
13319 case PREFIX_CS:
13320 oappend_maybe_intel ("%cs:");
13321 break;
13322 case PREFIX_DS:
13323 oappend_maybe_intel ("%ds:");
13324 break;
13325 case PREFIX_SS:
13326 oappend_maybe_intel ("%ss:");
13327 break;
13328 case PREFIX_ES:
13329 oappend_maybe_intel ("%es:");
13330 break;
13331 case PREFIX_FS:
13332 oappend_maybe_intel ("%fs:");
13333 break;
13334 case PREFIX_GS:
13335 oappend_maybe_intel ("%gs:");
13336 break;
13337 default:
13338 break;
13339 }
13340 }
13341
13342 static void
13343 OP_indirE (int bytemode, int sizeflag)
13344 {
13345 if (!intel_syntax)
13346 oappend ("*");
13347 OP_E (bytemode, sizeflag);
13348 }
13349
13350 static void
13351 print_operand_value (char *buf, int hex, bfd_vma disp)
13352 {
13353 if (address_mode == mode_64bit)
13354 {
13355 if (hex)
13356 {
13357 char tmp[30];
13358 int i;
13359 buf[0] = '0';
13360 buf[1] = 'x';
13361 sprintf_vma (tmp, disp);
13362 for (i = 0; tmp[i] == '0' && tmp[i + 1]; i++);
13363 strcpy (buf + 2, tmp + i);
13364 }
13365 else
13366 {
13367 bfd_signed_vma v = disp;
13368 char tmp[30];
13369 int i;
13370 if (v < 0)
13371 {
13372 *(buf++) = '-';
13373 v = -disp;
13374 /* Check for possible overflow on 0x8000000000000000. */
13375 if (v < 0)
13376 {
13377 strcpy (buf, "9223372036854775808");
13378 return;
13379 }
13380 }
13381 if (!v)
13382 {
13383 strcpy (buf, "0");
13384 return;
13385 }
13386
13387 i = 0;
13388 tmp[29] = 0;
13389 while (v)
13390 {
13391 tmp[28 - i] = (v % 10) + '0';
13392 v /= 10;
13393 i++;
13394 }
13395 strcpy (buf, tmp + 29 - i);
13396 }
13397 }
13398 else
13399 {
13400 if (hex)
13401 sprintf (buf, "0x%x", (unsigned int) disp);
13402 else
13403 sprintf (buf, "%d", (int) disp);
13404 }
13405 }
13406
13407 /* Put DISP in BUF as signed hex number. */
13408
13409 static void
13410 print_displacement (char *buf, bfd_vma disp)
13411 {
13412 bfd_signed_vma val = disp;
13413 char tmp[30];
13414 int i, j = 0;
13415
13416 if (val < 0)
13417 {
13418 buf[j++] = '-';
13419 val = -disp;
13420
13421 /* Check for possible overflow. */
13422 if (val < 0)
13423 {
13424 switch (address_mode)
13425 {
13426 case mode_64bit:
13427 strcpy (buf + j, "0x8000000000000000");
13428 break;
13429 case mode_32bit:
13430 strcpy (buf + j, "0x80000000");
13431 break;
13432 case mode_16bit:
13433 strcpy (buf + j, "0x8000");
13434 break;
13435 }
13436 return;
13437 }
13438 }
13439
13440 buf[j++] = '0';
13441 buf[j++] = 'x';
13442
13443 sprintf_vma (tmp, (bfd_vma) val);
13444 for (i = 0; tmp[i] == '0'; i++)
13445 continue;
13446 if (tmp[i] == '\0')
13447 i--;
13448 strcpy (buf + j, tmp + i);
13449 }
13450
13451 static void
13452 intel_operand_size (int bytemode, int sizeflag)
13453 {
13454 if (vex.evex
13455 && vex.b
13456 && (bytemode == x_mode
13457 || bytemode == evex_half_bcst_xmmq_mode))
13458 {
13459 if (vex.w)
13460 oappend ("QWORD PTR ");
13461 else
13462 oappend ("DWORD PTR ");
13463 return;
13464 }
13465 switch (bytemode)
13466 {
13467 case b_mode:
13468 case b_swap_mode:
13469 case dqb_mode:
13470 case db_mode:
13471 oappend ("BYTE PTR ");
13472 break;
13473 case w_mode:
13474 case dw_mode:
13475 case dqw_mode:
13476 oappend ("WORD PTR ");
13477 break;
13478 case indir_v_mode:
13479 if (address_mode == mode_64bit && isa64 == intel64)
13480 {
13481 oappend ("QWORD PTR ");
13482 break;
13483 }
13484 /* Fall through. */
13485 case stack_v_mode:
13486 if (address_mode == mode_64bit && ((sizeflag & DFLAG) || (rex & REX_W)))
13487 {
13488 oappend ("QWORD PTR ");
13489 break;
13490 }
13491 /* Fall through. */
13492 case v_mode:
13493 case v_swap_mode:
13494 case dq_mode:
13495 USED_REX (REX_W);
13496 if (rex & REX_W)
13497 oappend ("QWORD PTR ");
13498 else
13499 {
13500 if ((sizeflag & DFLAG) || bytemode == dq_mode)
13501 oappend ("DWORD PTR ");
13502 else
13503 oappend ("WORD PTR ");
13504 used_prefixes |= (prefixes & PREFIX_DATA);
13505 }
13506 break;
13507 case z_mode:
13508 if ((rex & REX_W) || (sizeflag & DFLAG))
13509 *obufp++ = 'D';
13510 oappend ("WORD PTR ");
13511 if (!(rex & REX_W))
13512 used_prefixes |= (prefixes & PREFIX_DATA);
13513 break;
13514 case a_mode:
13515 if (sizeflag & DFLAG)
13516 oappend ("QWORD PTR ");
13517 else
13518 oappend ("DWORD PTR ");
13519 used_prefixes |= (prefixes & PREFIX_DATA);
13520 break;
13521 case d_mode:
13522 case d_scalar_mode:
13523 case d_scalar_swap_mode:
13524 case d_swap_mode:
13525 case dqd_mode:
13526 oappend ("DWORD PTR ");
13527 break;
13528 case q_mode:
13529 case q_scalar_mode:
13530 case q_scalar_swap_mode:
13531 case q_swap_mode:
13532 oappend ("QWORD PTR ");
13533 break;
13534 case dqa_mode:
13535 case m_mode:
13536 if (address_mode == mode_64bit)
13537 oappend ("QWORD PTR ");
13538 else
13539 oappend ("DWORD PTR ");
13540 break;
13541 case f_mode:
13542 if (sizeflag & DFLAG)
13543 oappend ("FWORD PTR ");
13544 else
13545 oappend ("DWORD PTR ");
13546 used_prefixes |= (prefixes & PREFIX_DATA);
13547 break;
13548 case t_mode:
13549 oappend ("TBYTE PTR ");
13550 break;
13551 case x_mode:
13552 case x_swap_mode:
13553 case evex_x_gscat_mode:
13554 case evex_x_nobcst_mode:
13555 case b_scalar_mode:
13556 case w_scalar_mode:
13557 if (need_vex)
13558 {
13559 switch (vex.length)
13560 {
13561 case 128:
13562 oappend ("XMMWORD PTR ");
13563 break;
13564 case 256:
13565 oappend ("YMMWORD PTR ");
13566 break;
13567 case 512:
13568 oappend ("ZMMWORD PTR ");
13569 break;
13570 default:
13571 abort ();
13572 }
13573 }
13574 else
13575 oappend ("XMMWORD PTR ");
13576 break;
13577 case xmm_mode:
13578 oappend ("XMMWORD PTR ");
13579 break;
13580 case ymm_mode:
13581 oappend ("YMMWORD PTR ");
13582 break;
13583 case xmmq_mode:
13584 case evex_half_bcst_xmmq_mode:
13585 if (!need_vex)
13586 abort ();
13587
13588 switch (vex.length)
13589 {
13590 case 128:
13591 oappend ("QWORD PTR ");
13592 break;
13593 case 256:
13594 oappend ("XMMWORD PTR ");
13595 break;
13596 case 512:
13597 oappend ("YMMWORD PTR ");
13598 break;
13599 default:
13600 abort ();
13601 }
13602 break;
13603 case xmm_mb_mode:
13604 if (!need_vex)
13605 abort ();
13606
13607 switch (vex.length)
13608 {
13609 case 128:
13610 case 256:
13611 case 512:
13612 oappend ("BYTE PTR ");
13613 break;
13614 default:
13615 abort ();
13616 }
13617 break;
13618 case xmm_mw_mode:
13619 if (!need_vex)
13620 abort ();
13621
13622 switch (vex.length)
13623 {
13624 case 128:
13625 case 256:
13626 case 512:
13627 oappend ("WORD PTR ");
13628 break;
13629 default:
13630 abort ();
13631 }
13632 break;
13633 case xmm_md_mode:
13634 if (!need_vex)
13635 abort ();
13636
13637 switch (vex.length)
13638 {
13639 case 128:
13640 case 256:
13641 case 512:
13642 oappend ("DWORD PTR ");
13643 break;
13644 default:
13645 abort ();
13646 }
13647 break;
13648 case xmm_mq_mode:
13649 if (!need_vex)
13650 abort ();
13651
13652 switch (vex.length)
13653 {
13654 case 128:
13655 case 256:
13656 case 512:
13657 oappend ("QWORD PTR ");
13658 break;
13659 default:
13660 abort ();
13661 }
13662 break;
13663 case xmmdw_mode:
13664 if (!need_vex)
13665 abort ();
13666
13667 switch (vex.length)
13668 {
13669 case 128:
13670 oappend ("WORD PTR ");
13671 break;
13672 case 256:
13673 oappend ("DWORD PTR ");
13674 break;
13675 case 512:
13676 oappend ("QWORD PTR ");
13677 break;
13678 default:
13679 abort ();
13680 }
13681 break;
13682 case xmmqd_mode:
13683 if (!need_vex)
13684 abort ();
13685
13686 switch (vex.length)
13687 {
13688 case 128:
13689 oappend ("DWORD PTR ");
13690 break;
13691 case 256:
13692 oappend ("QWORD PTR ");
13693 break;
13694 case 512:
13695 oappend ("XMMWORD PTR ");
13696 break;
13697 default:
13698 abort ();
13699 }
13700 break;
13701 case ymmq_mode:
13702 if (!need_vex)
13703 abort ();
13704
13705 switch (vex.length)
13706 {
13707 case 128:
13708 oappend ("QWORD PTR ");
13709 break;
13710 case 256:
13711 oappend ("YMMWORD PTR ");
13712 break;
13713 case 512:
13714 oappend ("ZMMWORD PTR ");
13715 break;
13716 default:
13717 abort ();
13718 }
13719 break;
13720 case ymmxmm_mode:
13721 if (!need_vex)
13722 abort ();
13723
13724 switch (vex.length)
13725 {
13726 case 128:
13727 case 256:
13728 oappend ("XMMWORD PTR ");
13729 break;
13730 default:
13731 abort ();
13732 }
13733 break;
13734 case o_mode:
13735 oappend ("OWORD PTR ");
13736 break;
13737 case xmm_mdq_mode:
13738 case vex_w_dq_mode:
13739 case vex_scalar_w_dq_mode:
13740 if (!need_vex)
13741 abort ();
13742
13743 if (vex.w)
13744 oappend ("QWORD PTR ");
13745 else
13746 oappend ("DWORD PTR ");
13747 break;
13748 case vex_vsib_d_w_dq_mode:
13749 case vex_vsib_q_w_dq_mode:
13750 if (!need_vex)
13751 abort ();
13752
13753 if (!vex.evex)
13754 {
13755 if (vex.w)
13756 oappend ("QWORD PTR ");
13757 else
13758 oappend ("DWORD PTR ");
13759 }
13760 else
13761 {
13762 switch (vex.length)
13763 {
13764 case 128:
13765 oappend ("XMMWORD PTR ");
13766 break;
13767 case 256:
13768 oappend ("YMMWORD PTR ");
13769 break;
13770 case 512:
13771 oappend ("ZMMWORD PTR ");
13772 break;
13773 default:
13774 abort ();
13775 }
13776 }
13777 break;
13778 case vex_vsib_q_w_d_mode:
13779 case vex_vsib_d_w_d_mode:
13780 if (!need_vex || !vex.evex)
13781 abort ();
13782
13783 switch (vex.length)
13784 {
13785 case 128:
13786 oappend ("QWORD PTR ");
13787 break;
13788 case 256:
13789 oappend ("XMMWORD PTR ");
13790 break;
13791 case 512:
13792 oappend ("YMMWORD PTR ");
13793 break;
13794 default:
13795 abort ();
13796 }
13797
13798 break;
13799 case mask_bd_mode:
13800 if (!need_vex || vex.length != 128)
13801 abort ();
13802 if (vex.w)
13803 oappend ("DWORD PTR ");
13804 else
13805 oappend ("BYTE PTR ");
13806 break;
13807 case mask_mode:
13808 if (!need_vex)
13809 abort ();
13810 if (vex.w)
13811 oappend ("QWORD PTR ");
13812 else
13813 oappend ("WORD PTR ");
13814 break;
13815 case v_bnd_mode:
13816 case v_bndmk_mode:
13817 default:
13818 break;
13819 }
13820 }
13821
13822 static void
13823 OP_E_register (int bytemode, int sizeflag)
13824 {
13825 int reg = modrm.rm;
13826 const char **names;
13827
13828 USED_REX (REX_B);
13829 if ((rex & REX_B))
13830 reg += 8;
13831
13832 if ((sizeflag & SUFFIX_ALWAYS)
13833 && (bytemode == b_swap_mode
13834 || bytemode == bnd_swap_mode
13835 || bytemode == v_swap_mode))
13836 swap_operand ();
13837
13838 switch (bytemode)
13839 {
13840 case b_mode:
13841 case b_swap_mode:
13842 USED_REX (0);
13843 if (rex)
13844 names = names8rex;
13845 else
13846 names = names8;
13847 break;
13848 case w_mode:
13849 names = names16;
13850 break;
13851 case d_mode:
13852 case dw_mode:
13853 case db_mode:
13854 names = names32;
13855 break;
13856 case q_mode:
13857 names = names64;
13858 break;
13859 case m_mode:
13860 case v_bnd_mode:
13861 names = address_mode == mode_64bit ? names64 : names32;
13862 break;
13863 case bnd_mode:
13864 case bnd_swap_mode:
13865 if (reg > 0x3)
13866 {
13867 oappend ("(bad)");
13868 return;
13869 }
13870 names = names_bnd;
13871 break;
13872 case indir_v_mode:
13873 if (address_mode == mode_64bit && isa64 == intel64)
13874 {
13875 names = names64;
13876 break;
13877 }
13878 /* Fall through. */
13879 case stack_v_mode:
13880 if (address_mode == mode_64bit && ((sizeflag & DFLAG) || (rex & REX_W)))
13881 {
13882 names = names64;
13883 break;
13884 }
13885 bytemode = v_mode;
13886 /* Fall through. */
13887 case v_mode:
13888 case v_swap_mode:
13889 case dq_mode:
13890 case dqb_mode:
13891 case dqd_mode:
13892 case dqw_mode:
13893 case dqa_mode:
13894 USED_REX (REX_W);
13895 if (rex & REX_W)
13896 names = names64;
13897 else
13898 {
13899 if ((sizeflag & DFLAG)
13900 || (bytemode != v_mode
13901 && bytemode != v_swap_mode))
13902 names = names32;
13903 else
13904 names = names16;
13905 used_prefixes |= (prefixes & PREFIX_DATA);
13906 }
13907 break;
13908 case va_mode:
13909 names = (address_mode == mode_64bit
13910 ? names64 : names32);
13911 if (!(prefixes & PREFIX_ADDR))
13912 names = (address_mode == mode_16bit
13913 ? names16 : names);
13914 else
13915 {
13916 /* Remove "addr16/addr32". */
13917 all_prefixes[last_addr_prefix] = 0;
13918 names = (address_mode != mode_32bit
13919 ? names32 : names16);
13920 used_prefixes |= PREFIX_ADDR;
13921 }
13922 break;
13923 case mask_bd_mode:
13924 case mask_mode:
13925 if (reg > 0x7)
13926 {
13927 oappend ("(bad)");
13928 return;
13929 }
13930 names = names_mask;
13931 break;
13932 case 0:
13933 return;
13934 default:
13935 oappend (INTERNAL_DISASSEMBLER_ERROR);
13936 return;
13937 }
13938 oappend (names[reg]);
13939 }
13940
13941 static void
13942 OP_E_memory (int bytemode, int sizeflag)
13943 {
13944 bfd_vma disp = 0;
13945 int add = (rex & REX_B) ? 8 : 0;
13946 int riprel = 0;
13947 int shift;
13948
13949 if (vex.evex)
13950 {
13951 /* In EVEX, if operand doesn't allow broadcast, vex.b should be 0. */
13952 if (vex.b
13953 && bytemode != x_mode
13954 && bytemode != xmmq_mode
13955 && bytemode != evex_half_bcst_xmmq_mode)
13956 {
13957 BadOp ();
13958 return;
13959 }
13960 switch (bytemode)
13961 {
13962 case dqw_mode:
13963 case dw_mode:
13964 shift = 1;
13965 break;
13966 case dqb_mode:
13967 case db_mode:
13968 shift = 0;
13969 break;
13970 case vex_vsib_d_w_dq_mode:
13971 case vex_vsib_d_w_d_mode:
13972 case vex_vsib_q_w_dq_mode:
13973 case vex_vsib_q_w_d_mode:
13974 case evex_x_gscat_mode:
13975 case xmm_mdq_mode:
13976 shift = vex.w ? 3 : 2;
13977 break;
13978 case x_mode:
13979 case evex_half_bcst_xmmq_mode:
13980 case xmmq_mode:
13981 if (vex.b)
13982 {
13983 shift = vex.w ? 3 : 2;
13984 break;
13985 }
13986 /* Fall through. */
13987 case xmmqd_mode:
13988 case xmmdw_mode:
13989 case ymmq_mode:
13990 case evex_x_nobcst_mode:
13991 case x_swap_mode:
13992 switch (vex.length)
13993 {
13994 case 128:
13995 shift = 4;
13996 break;
13997 case 256:
13998 shift = 5;
13999 break;
14000 case 512:
14001 shift = 6;
14002 break;
14003 default:
14004 abort ();
14005 }
14006 break;
14007 case ymm_mode:
14008 shift = 5;
14009 break;
14010 case xmm_mode:
14011 shift = 4;
14012 break;
14013 case xmm_mq_mode:
14014 case q_mode:
14015 case q_scalar_mode:
14016 case q_swap_mode:
14017 case q_scalar_swap_mode:
14018 shift = 3;
14019 break;
14020 case dqd_mode:
14021 case xmm_md_mode:
14022 case d_mode:
14023 case d_scalar_mode:
14024 case d_swap_mode:
14025 case d_scalar_swap_mode:
14026 shift = 2;
14027 break;
14028 case w_scalar_mode:
14029 case xmm_mw_mode:
14030 shift = 1;
14031 break;
14032 case b_scalar_mode:
14033 case xmm_mb_mode:
14034 shift = 0;
14035 break;
14036 case dqa_mode:
14037 shift = address_mode == mode_64bit ? 3 : 2;
14038 break;
14039 default:
14040 abort ();
14041 }
14042 /* Make necessary corrections to shift for modes that need it.
14043 For these modes we currently have shift 4, 5 or 6 depending on
14044 vex.length (it corresponds to xmmword, ymmword or zmmword
14045 operand). We might want to make it 3, 4 or 5 (e.g. for
14046 xmmq_mode). In case of broadcast enabled the corrections
14047 aren't needed, as element size is always 32 or 64 bits. */
14048 if (!vex.b
14049 && (bytemode == xmmq_mode
14050 || bytemode == evex_half_bcst_xmmq_mode))
14051 shift -= 1;
14052 else if (bytemode == xmmqd_mode)
14053 shift -= 2;
14054 else if (bytemode == xmmdw_mode)
14055 shift -= 3;
14056 else if (bytemode == ymmq_mode && vex.length == 128)
14057 shift -= 1;
14058 }
14059 else
14060 shift = 0;
14061
14062 USED_REX (REX_B);
14063 if (intel_syntax)
14064 intel_operand_size (bytemode, sizeflag);
14065 append_seg ();
14066
14067 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
14068 {
14069 /* 32/64 bit address mode */
14070 int havedisp;
14071 int havesib;
14072 int havebase;
14073 int haveindex;
14074 int needindex;
14075 int needaddr32;
14076 int base, rbase;
14077 int vindex = 0;
14078 int scale = 0;
14079 int addr32flag = !((sizeflag & AFLAG)
14080 || bytemode == v_bnd_mode
14081 || bytemode == v_bndmk_mode
14082 || bytemode == bnd_mode
14083 || bytemode == bnd_swap_mode);
14084 const char **indexes64 = names64;
14085 const char **indexes32 = names32;
14086
14087 havesib = 0;
14088 havebase = 1;
14089 haveindex = 0;
14090 base = modrm.rm;
14091
14092 if (base == 4)
14093 {
14094 havesib = 1;
14095 vindex = sib.index;
14096 USED_REX (REX_X);
14097 if (rex & REX_X)
14098 vindex += 8;
14099 switch (bytemode)
14100 {
14101 case vex_vsib_d_w_dq_mode:
14102 case vex_vsib_d_w_d_mode:
14103 case vex_vsib_q_w_dq_mode:
14104 case vex_vsib_q_w_d_mode:
14105 if (!need_vex)
14106 abort ();
14107 if (vex.evex)
14108 {
14109 if (!vex.v)
14110 vindex += 16;
14111 }
14112
14113 haveindex = 1;
14114 switch (vex.length)
14115 {
14116 case 128:
14117 indexes64 = indexes32 = names_xmm;
14118 break;
14119 case 256:
14120 if (!vex.w
14121 || bytemode == vex_vsib_q_w_dq_mode
14122 || bytemode == vex_vsib_q_w_d_mode)
14123 indexes64 = indexes32 = names_ymm;
14124 else
14125 indexes64 = indexes32 = names_xmm;
14126 break;
14127 case 512:
14128 if (!vex.w
14129 || bytemode == vex_vsib_q_w_dq_mode
14130 || bytemode == vex_vsib_q_w_d_mode)
14131 indexes64 = indexes32 = names_zmm;
14132 else
14133 indexes64 = indexes32 = names_ymm;
14134 break;
14135 default:
14136 abort ();
14137 }
14138 break;
14139 default:
14140 haveindex = vindex != 4;
14141 break;
14142 }
14143 scale = sib.scale;
14144 base = sib.base;
14145 codep++;
14146 }
14147 rbase = base + add;
14148
14149 switch (modrm.mod)
14150 {
14151 case 0:
14152 if (base == 5)
14153 {
14154 havebase = 0;
14155 if (address_mode == mode_64bit && !havesib)
14156 riprel = 1;
14157 disp = get32s ();
14158 if (riprel && bytemode == v_bndmk_mode)
14159 {
14160 oappend ("(bad)");
14161 return;
14162 }
14163 }
14164 break;
14165 case 1:
14166 FETCH_DATA (the_info, codep + 1);
14167 disp = *codep++;
14168 if ((disp & 0x80) != 0)
14169 disp -= 0x100;
14170 if (vex.evex && shift > 0)
14171 disp <<= shift;
14172 break;
14173 case 2:
14174 disp = get32s ();
14175 break;
14176 }
14177
14178 needindex = 0;
14179 needaddr32 = 0;
14180 if (havesib
14181 && !havebase
14182 && !haveindex
14183 && address_mode != mode_16bit)
14184 {
14185 if (address_mode == mode_64bit)
14186 {
14187 /* Display eiz instead of addr32. */
14188 needindex = addr32flag;
14189 needaddr32 = 1;
14190 }
14191 else
14192 {
14193 /* In 32-bit mode, we need index register to tell [offset]
14194 from [eiz*1 + offset]. */
14195 needindex = 1;
14196 }
14197 }
14198
14199 havedisp = (havebase
14200 || needindex
14201 || (havesib && (haveindex || scale != 0)));
14202
14203 if (!intel_syntax)
14204 if (modrm.mod != 0 || base == 5)
14205 {
14206 if (havedisp || riprel)
14207 print_displacement (scratchbuf, disp);
14208 else
14209 print_operand_value (scratchbuf, 1, disp);
14210 oappend (scratchbuf);
14211 if (riprel)
14212 {
14213 set_op (disp, 1);
14214 oappend (!addr32flag ? "(%rip)" : "(%eip)");
14215 }
14216 }
14217
14218 if ((havebase || haveindex || needaddr32 || riprel)
14219 && (bytemode != v_bnd_mode)
14220 && (bytemode != v_bndmk_mode)
14221 && (bytemode != bnd_mode)
14222 && (bytemode != bnd_swap_mode))
14223 used_prefixes |= PREFIX_ADDR;
14224
14225 if (havedisp || (intel_syntax && riprel))
14226 {
14227 *obufp++ = open_char;
14228 if (intel_syntax && riprel)
14229 {
14230 set_op (disp, 1);
14231 oappend (!addr32flag ? "rip" : "eip");
14232 }
14233 *obufp = '\0';
14234 if (havebase)
14235 oappend (address_mode == mode_64bit && !addr32flag
14236 ? names64[rbase] : names32[rbase]);
14237 if (havesib)
14238 {
14239 /* ESP/RSP won't allow index. If base isn't ESP/RSP,
14240 print index to tell base + index from base. */
14241 if (scale != 0
14242 || needindex
14243 || haveindex
14244 || (havebase && base != ESP_REG_NUM))
14245 {
14246 if (!intel_syntax || havebase)
14247 {
14248 *obufp++ = separator_char;
14249 *obufp = '\0';
14250 }
14251 if (haveindex)
14252 oappend (address_mode == mode_64bit && !addr32flag
14253 ? indexes64[vindex] : indexes32[vindex]);
14254 else
14255 oappend (address_mode == mode_64bit && !addr32flag
14256 ? index64 : index32);
14257
14258 *obufp++ = scale_char;
14259 *obufp = '\0';
14260 sprintf (scratchbuf, "%d", 1 << scale);
14261 oappend (scratchbuf);
14262 }
14263 }
14264 if (intel_syntax
14265 && (disp || modrm.mod != 0 || base == 5))
14266 {
14267 if (!havedisp || (bfd_signed_vma) disp >= 0)
14268 {
14269 *obufp++ = '+';
14270 *obufp = '\0';
14271 }
14272 else if (modrm.mod != 1 && disp != -disp)
14273 {
14274 *obufp++ = '-';
14275 *obufp = '\0';
14276 disp = - (bfd_signed_vma) disp;
14277 }
14278
14279 if (havedisp)
14280 print_displacement (scratchbuf, disp);
14281 else
14282 print_operand_value (scratchbuf, 1, disp);
14283 oappend (scratchbuf);
14284 }
14285
14286 *obufp++ = close_char;
14287 *obufp = '\0';
14288 }
14289 else if (intel_syntax)
14290 {
14291 if (modrm.mod != 0 || base == 5)
14292 {
14293 if (!active_seg_prefix)
14294 {
14295 oappend (names_seg[ds_reg - es_reg]);
14296 oappend (":");
14297 }
14298 print_operand_value (scratchbuf, 1, disp);
14299 oappend (scratchbuf);
14300 }
14301 }
14302 }
14303 else
14304 {
14305 /* 16 bit address mode */
14306 used_prefixes |= prefixes & PREFIX_ADDR;
14307 switch (modrm.mod)
14308 {
14309 case 0:
14310 if (modrm.rm == 6)
14311 {
14312 disp = get16 ();
14313 if ((disp & 0x8000) != 0)
14314 disp -= 0x10000;
14315 }
14316 break;
14317 case 1:
14318 FETCH_DATA (the_info, codep + 1);
14319 disp = *codep++;
14320 if ((disp & 0x80) != 0)
14321 disp -= 0x100;
14322 if (vex.evex && shift > 0)
14323 disp <<= shift;
14324 break;
14325 case 2:
14326 disp = get16 ();
14327 if ((disp & 0x8000) != 0)
14328 disp -= 0x10000;
14329 break;
14330 }
14331
14332 if (!intel_syntax)
14333 if (modrm.mod != 0 || modrm.rm == 6)
14334 {
14335 print_displacement (scratchbuf, disp);
14336 oappend (scratchbuf);
14337 }
14338
14339 if (modrm.mod != 0 || modrm.rm != 6)
14340 {
14341 *obufp++ = open_char;
14342 *obufp = '\0';
14343 oappend (index16[modrm.rm]);
14344 if (intel_syntax
14345 && (disp || modrm.mod != 0 || modrm.rm == 6))
14346 {
14347 if ((bfd_signed_vma) disp >= 0)
14348 {
14349 *obufp++ = '+';
14350 *obufp = '\0';
14351 }
14352 else if (modrm.mod != 1)
14353 {
14354 *obufp++ = '-';
14355 *obufp = '\0';
14356 disp = - (bfd_signed_vma) disp;
14357 }
14358
14359 print_displacement (scratchbuf, disp);
14360 oappend (scratchbuf);
14361 }
14362
14363 *obufp++ = close_char;
14364 *obufp = '\0';
14365 }
14366 else if (intel_syntax)
14367 {
14368 if (!active_seg_prefix)
14369 {
14370 oappend (names_seg[ds_reg - es_reg]);
14371 oappend (":");
14372 }
14373 print_operand_value (scratchbuf, 1, disp & 0xffff);
14374 oappend (scratchbuf);
14375 }
14376 }
14377 if (vex.evex && vex.b
14378 && (bytemode == x_mode
14379 || bytemode == xmmq_mode
14380 || bytemode == evex_half_bcst_xmmq_mode))
14381 {
14382 if (vex.w
14383 || bytemode == xmmq_mode
14384 || bytemode == evex_half_bcst_xmmq_mode)
14385 {
14386 switch (vex.length)
14387 {
14388 case 128:
14389 oappend ("{1to2}");
14390 break;
14391 case 256:
14392 oappend ("{1to4}");
14393 break;
14394 case 512:
14395 oappend ("{1to8}");
14396 break;
14397 default:
14398 abort ();
14399 }
14400 }
14401 else
14402 {
14403 switch (vex.length)
14404 {
14405 case 128:
14406 oappend ("{1to4}");
14407 break;
14408 case 256:
14409 oappend ("{1to8}");
14410 break;
14411 case 512:
14412 oappend ("{1to16}");
14413 break;
14414 default:
14415 abort ();
14416 }
14417 }
14418 }
14419 }
14420
14421 static void
14422 OP_E (int bytemode, int sizeflag)
14423 {
14424 /* Skip mod/rm byte. */
14425 MODRM_CHECK;
14426 codep++;
14427
14428 if (modrm.mod == 3)
14429 OP_E_register (bytemode, sizeflag);
14430 else
14431 OP_E_memory (bytemode, sizeflag);
14432 }
14433
14434 static void
14435 OP_G (int bytemode, int sizeflag)
14436 {
14437 int add = 0;
14438 const char **names;
14439 USED_REX (REX_R);
14440 if (rex & REX_R)
14441 add += 8;
14442 switch (bytemode)
14443 {
14444 case b_mode:
14445 USED_REX (0);
14446 if (rex)
14447 oappend (names8rex[modrm.reg + add]);
14448 else
14449 oappend (names8[modrm.reg + add]);
14450 break;
14451 case w_mode:
14452 oappend (names16[modrm.reg + add]);
14453 break;
14454 case d_mode:
14455 case db_mode:
14456 case dw_mode:
14457 oappend (names32[modrm.reg + add]);
14458 break;
14459 case q_mode:
14460 oappend (names64[modrm.reg + add]);
14461 break;
14462 case bnd_mode:
14463 if (modrm.reg > 0x3)
14464 {
14465 oappend ("(bad)");
14466 return;
14467 }
14468 oappend (names_bnd[modrm.reg]);
14469 break;
14470 case v_mode:
14471 case dq_mode:
14472 case dqb_mode:
14473 case dqd_mode:
14474 case dqw_mode:
14475 USED_REX (REX_W);
14476 if (rex & REX_W)
14477 oappend (names64[modrm.reg + add]);
14478 else
14479 {
14480 if ((sizeflag & DFLAG) || bytemode != v_mode)
14481 oappend (names32[modrm.reg + add]);
14482 else
14483 oappend (names16[modrm.reg + add]);
14484 used_prefixes |= (prefixes & PREFIX_DATA);
14485 }
14486 break;
14487 case va_mode:
14488 names = (address_mode == mode_64bit
14489 ? names64 : names32);
14490 if (!(prefixes & PREFIX_ADDR))
14491 {
14492 if (address_mode == mode_16bit)
14493 names = names16;
14494 }
14495 else
14496 {
14497 /* Remove "addr16/addr32". */
14498 all_prefixes[last_addr_prefix] = 0;
14499 names = (address_mode != mode_32bit
14500 ? names32 : names16);
14501 used_prefixes |= PREFIX_ADDR;
14502 }
14503 oappend (names[modrm.reg + add]);
14504 break;
14505 case m_mode:
14506 if (address_mode == mode_64bit)
14507 oappend (names64[modrm.reg + add]);
14508 else
14509 oappend (names32[modrm.reg + add]);
14510 break;
14511 case mask_bd_mode:
14512 case mask_mode:
14513 if ((modrm.reg + add) > 0x7)
14514 {
14515 oappend ("(bad)");
14516 return;
14517 }
14518 oappend (names_mask[modrm.reg + add]);
14519 break;
14520 default:
14521 oappend (INTERNAL_DISASSEMBLER_ERROR);
14522 break;
14523 }
14524 }
14525
14526 static bfd_vma
14527 get64 (void)
14528 {
14529 bfd_vma x;
14530 #ifdef BFD64
14531 unsigned int a;
14532 unsigned int b;
14533
14534 FETCH_DATA (the_info, codep + 8);
14535 a = *codep++ & 0xff;
14536 a |= (*codep++ & 0xff) << 8;
14537 a |= (*codep++ & 0xff) << 16;
14538 a |= (*codep++ & 0xffu) << 24;
14539 b = *codep++ & 0xff;
14540 b |= (*codep++ & 0xff) << 8;
14541 b |= (*codep++ & 0xff) << 16;
14542 b |= (*codep++ & 0xffu) << 24;
14543 x = a + ((bfd_vma) b << 32);
14544 #else
14545 abort ();
14546 x = 0;
14547 #endif
14548 return x;
14549 }
14550
14551 static bfd_signed_vma
14552 get32 (void)
14553 {
14554 bfd_signed_vma x = 0;
14555
14556 FETCH_DATA (the_info, codep + 4);
14557 x = *codep++ & (bfd_signed_vma) 0xff;
14558 x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
14559 x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
14560 x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
14561 return x;
14562 }
14563
14564 static bfd_signed_vma
14565 get32s (void)
14566 {
14567 bfd_signed_vma x = 0;
14568
14569 FETCH_DATA (the_info, codep + 4);
14570 x = *codep++ & (bfd_signed_vma) 0xff;
14571 x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
14572 x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
14573 x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
14574
14575 x = (x ^ ((bfd_signed_vma) 1 << 31)) - ((bfd_signed_vma) 1 << 31);
14576
14577 return x;
14578 }
14579
14580 static int
14581 get16 (void)
14582 {
14583 int x = 0;
14584
14585 FETCH_DATA (the_info, codep + 2);
14586 x = *codep++ & 0xff;
14587 x |= (*codep++ & 0xff) << 8;
14588 return x;
14589 }
14590
14591 static void
14592 set_op (bfd_vma op, int riprel)
14593 {
14594 op_index[op_ad] = op_ad;
14595 if (address_mode == mode_64bit)
14596 {
14597 op_address[op_ad] = op;
14598 op_riprel[op_ad] = riprel;
14599 }
14600 else
14601 {
14602 /* Mask to get a 32-bit address. */
14603 op_address[op_ad] = op & 0xffffffff;
14604 op_riprel[op_ad] = riprel & 0xffffffff;
14605 }
14606 }
14607
14608 static void
14609 OP_REG (int code, int sizeflag)
14610 {
14611 const char *s;
14612 int add;
14613
14614 switch (code)
14615 {
14616 case es_reg: case ss_reg: case cs_reg:
14617 case ds_reg: case fs_reg: case gs_reg:
14618 oappend (names_seg[code - es_reg]);
14619 return;
14620 }
14621
14622 USED_REX (REX_B);
14623 if (rex & REX_B)
14624 add = 8;
14625 else
14626 add = 0;
14627
14628 switch (code)
14629 {
14630 case ax_reg: case cx_reg: case dx_reg: case bx_reg:
14631 case sp_reg: case bp_reg: case si_reg: case di_reg:
14632 s = names16[code - ax_reg + add];
14633 break;
14634 case al_reg: case ah_reg: case cl_reg: case ch_reg:
14635 case dl_reg: case dh_reg: case bl_reg: case bh_reg:
14636 USED_REX (0);
14637 if (rex)
14638 s = names8rex[code - al_reg + add];
14639 else
14640 s = names8[code - al_reg];
14641 break;
14642 case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
14643 case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
14644 if (address_mode == mode_64bit
14645 && ((sizeflag & DFLAG) || (rex & REX_W)))
14646 {
14647 s = names64[code - rAX_reg + add];
14648 break;
14649 }
14650 code += eAX_reg - rAX_reg;
14651 /* Fall through. */
14652 case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
14653 case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
14654 USED_REX (REX_W);
14655 if (rex & REX_W)
14656 s = names64[code - eAX_reg + add];
14657 else
14658 {
14659 if (sizeflag & DFLAG)
14660 s = names32[code - eAX_reg + add];
14661 else
14662 s = names16[code - eAX_reg + add];
14663 used_prefixes |= (prefixes & PREFIX_DATA);
14664 }
14665 break;
14666 default:
14667 s = INTERNAL_DISASSEMBLER_ERROR;
14668 break;
14669 }
14670 oappend (s);
14671 }
14672
14673 static void
14674 OP_IMREG (int code, int sizeflag)
14675 {
14676 const char *s;
14677
14678 switch (code)
14679 {
14680 case indir_dx_reg:
14681 if (intel_syntax)
14682 s = "dx";
14683 else
14684 s = "(%dx)";
14685 break;
14686 case ax_reg: case cx_reg: case dx_reg: case bx_reg:
14687 case sp_reg: case bp_reg: case si_reg: case di_reg:
14688 s = names16[code - ax_reg];
14689 break;
14690 case es_reg: case ss_reg: case cs_reg:
14691 case ds_reg: case fs_reg: case gs_reg:
14692 s = names_seg[code - es_reg];
14693 break;
14694 case al_reg: case ah_reg: case cl_reg: case ch_reg:
14695 case dl_reg: case dh_reg: case bl_reg: case bh_reg:
14696 USED_REX (0);
14697 if (rex)
14698 s = names8rex[code - al_reg];
14699 else
14700 s = names8[code - al_reg];
14701 break;
14702 case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
14703 case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
14704 USED_REX (REX_W);
14705 if (rex & REX_W)
14706 s = names64[code - eAX_reg];
14707 else
14708 {
14709 if (sizeflag & DFLAG)
14710 s = names32[code - eAX_reg];
14711 else
14712 s = names16[code - eAX_reg];
14713 used_prefixes |= (prefixes & PREFIX_DATA);
14714 }
14715 break;
14716 case z_mode_ax_reg:
14717 if ((rex & REX_W) || (sizeflag & DFLAG))
14718 s = *names32;
14719 else
14720 s = *names16;
14721 if (!(rex & REX_W))
14722 used_prefixes |= (prefixes & PREFIX_DATA);
14723 break;
14724 default:
14725 s = INTERNAL_DISASSEMBLER_ERROR;
14726 break;
14727 }
14728 oappend (s);
14729 }
14730
14731 static void
14732 OP_I (int bytemode, int sizeflag)
14733 {
14734 bfd_signed_vma op;
14735 bfd_signed_vma mask = -1;
14736
14737 switch (bytemode)
14738 {
14739 case b_mode:
14740 FETCH_DATA (the_info, codep + 1);
14741 op = *codep++;
14742 mask = 0xff;
14743 break;
14744 case q_mode:
14745 if (address_mode == mode_64bit)
14746 {
14747 op = get32s ();
14748 break;
14749 }
14750 /* Fall through. */
14751 case v_mode:
14752 USED_REX (REX_W);
14753 if (rex & REX_W)
14754 op = get32s ();
14755 else
14756 {
14757 if (sizeflag & DFLAG)
14758 {
14759 op = get32 ();
14760 mask = 0xffffffff;
14761 }
14762 else
14763 {
14764 op = get16 ();
14765 mask = 0xfffff;
14766 }
14767 used_prefixes |= (prefixes & PREFIX_DATA);
14768 }
14769 break;
14770 case w_mode:
14771 mask = 0xfffff;
14772 op = get16 ();
14773 break;
14774 case const_1_mode:
14775 if (intel_syntax)
14776 oappend ("1");
14777 return;
14778 default:
14779 oappend (INTERNAL_DISASSEMBLER_ERROR);
14780 return;
14781 }
14782
14783 op &= mask;
14784 scratchbuf[0] = '$';
14785 print_operand_value (scratchbuf + 1, 1, op);
14786 oappend_maybe_intel (scratchbuf);
14787 scratchbuf[0] = '\0';
14788 }
14789
14790 static void
14791 OP_I64 (int bytemode, int sizeflag)
14792 {
14793 bfd_signed_vma op;
14794 bfd_signed_vma mask = -1;
14795
14796 if (address_mode != mode_64bit)
14797 {
14798 OP_I (bytemode, sizeflag);
14799 return;
14800 }
14801
14802 switch (bytemode)
14803 {
14804 case b_mode:
14805 FETCH_DATA (the_info, codep + 1);
14806 op = *codep++;
14807 mask = 0xff;
14808 break;
14809 case v_mode:
14810 USED_REX (REX_W);
14811 if (rex & REX_W)
14812 op = get64 ();
14813 else
14814 {
14815 if (sizeflag & DFLAG)
14816 {
14817 op = get32 ();
14818 mask = 0xffffffff;
14819 }
14820 else
14821 {
14822 op = get16 ();
14823 mask = 0xfffff;
14824 }
14825 used_prefixes |= (prefixes & PREFIX_DATA);
14826 }
14827 break;
14828 case w_mode:
14829 mask = 0xfffff;
14830 op = get16 ();
14831 break;
14832 default:
14833 oappend (INTERNAL_DISASSEMBLER_ERROR);
14834 return;
14835 }
14836
14837 op &= mask;
14838 scratchbuf[0] = '$';
14839 print_operand_value (scratchbuf + 1, 1, op);
14840 oappend_maybe_intel (scratchbuf);
14841 scratchbuf[0] = '\0';
14842 }
14843
14844 static void
14845 OP_sI (int bytemode, int sizeflag)
14846 {
14847 bfd_signed_vma op;
14848
14849 switch (bytemode)
14850 {
14851 case b_mode:
14852 case b_T_mode:
14853 FETCH_DATA (the_info, codep + 1);
14854 op = *codep++;
14855 if ((op & 0x80) != 0)
14856 op -= 0x100;
14857 if (bytemode == b_T_mode)
14858 {
14859 if (address_mode != mode_64bit
14860 || !((sizeflag & DFLAG) || (rex & REX_W)))
14861 {
14862 /* The operand-size prefix is overridden by a REX prefix. */
14863 if ((sizeflag & DFLAG) || (rex & REX_W))
14864 op &= 0xffffffff;
14865 else
14866 op &= 0xffff;
14867 }
14868 }
14869 else
14870 {
14871 if (!(rex & REX_W))
14872 {
14873 if (sizeflag & DFLAG)
14874 op &= 0xffffffff;
14875 else
14876 op &= 0xffff;
14877 }
14878 }
14879 break;
14880 case v_mode:
14881 /* The operand-size prefix is overridden by a REX prefix. */
14882 if ((sizeflag & DFLAG) || (rex & REX_W))
14883 op = get32s ();
14884 else
14885 op = get16 ();
14886 break;
14887 default:
14888 oappend (INTERNAL_DISASSEMBLER_ERROR);
14889 return;
14890 }
14891
14892 scratchbuf[0] = '$';
14893 print_operand_value (scratchbuf + 1, 1, op);
14894 oappend_maybe_intel (scratchbuf);
14895 }
14896
14897 static void
14898 OP_J (int bytemode, int sizeflag)
14899 {
14900 bfd_vma disp;
14901 bfd_vma mask = -1;
14902 bfd_vma segment = 0;
14903
14904 switch (bytemode)
14905 {
14906 case b_mode:
14907 FETCH_DATA (the_info, codep + 1);
14908 disp = *codep++;
14909 if ((disp & 0x80) != 0)
14910 disp -= 0x100;
14911 break;
14912 case v_mode:
14913 if (isa64 == amd64)
14914 USED_REX (REX_W);
14915 if ((sizeflag & DFLAG)
14916 || (address_mode == mode_64bit
14917 && (isa64 != amd64 || (rex & REX_W))))
14918 disp = get32s ();
14919 else
14920 {
14921 disp = get16 ();
14922 if ((disp & 0x8000) != 0)
14923 disp -= 0x10000;
14924 /* In 16bit mode, address is wrapped around at 64k within
14925 the same segment. Otherwise, a data16 prefix on a jump
14926 instruction means that the pc is masked to 16 bits after
14927 the displacement is added! */
14928 mask = 0xffff;
14929 if ((prefixes & PREFIX_DATA) == 0)
14930 segment = ((start_pc + (codep - start_codep))
14931 & ~((bfd_vma) 0xffff));
14932 }
14933 if (address_mode != mode_64bit
14934 || (isa64 == amd64 && !(rex & REX_W)))
14935 used_prefixes |= (prefixes & PREFIX_DATA);
14936 break;
14937 default:
14938 oappend (INTERNAL_DISASSEMBLER_ERROR);
14939 return;
14940 }
14941 disp = ((start_pc + (codep - start_codep) + disp) & mask) | segment;
14942 set_op (disp, 0);
14943 print_operand_value (scratchbuf, 1, disp);
14944 oappend (scratchbuf);
14945 }
14946
14947 static void
14948 OP_SEG (int bytemode, int sizeflag)
14949 {
14950 if (bytemode == w_mode)
14951 oappend (names_seg[modrm.reg]);
14952 else
14953 OP_E (modrm.mod == 3 ? bytemode : w_mode, sizeflag);
14954 }
14955
14956 static void
14957 OP_DIR (int dummy ATTRIBUTE_UNUSED, int sizeflag)
14958 {
14959 int seg, offset;
14960
14961 if (sizeflag & DFLAG)
14962 {
14963 offset = get32 ();
14964 seg = get16 ();
14965 }
14966 else
14967 {
14968 offset = get16 ();
14969 seg = get16 ();
14970 }
14971 used_prefixes |= (prefixes & PREFIX_DATA);
14972 if (intel_syntax)
14973 sprintf (scratchbuf, "0x%x:0x%x", seg, offset);
14974 else
14975 sprintf (scratchbuf, "$0x%x,$0x%x", seg, offset);
14976 oappend (scratchbuf);
14977 }
14978
14979 static void
14980 OP_OFF (int bytemode, int sizeflag)
14981 {
14982 bfd_vma off;
14983
14984 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
14985 intel_operand_size (bytemode, sizeflag);
14986 append_seg ();
14987
14988 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
14989 off = get32 ();
14990 else
14991 off = get16 ();
14992
14993 if (intel_syntax)
14994 {
14995 if (!active_seg_prefix)
14996 {
14997 oappend (names_seg[ds_reg - es_reg]);
14998 oappend (":");
14999 }
15000 }
15001 print_operand_value (scratchbuf, 1, off);
15002 oappend (scratchbuf);
15003 }
15004
15005 static void
15006 OP_OFF64 (int bytemode, int sizeflag)
15007 {
15008 bfd_vma off;
15009
15010 if (address_mode != mode_64bit
15011 || (prefixes & PREFIX_ADDR))
15012 {
15013 OP_OFF (bytemode, sizeflag);
15014 return;
15015 }
15016
15017 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
15018 intel_operand_size (bytemode, sizeflag);
15019 append_seg ();
15020
15021 off = get64 ();
15022
15023 if (intel_syntax)
15024 {
15025 if (!active_seg_prefix)
15026 {
15027 oappend (names_seg[ds_reg - es_reg]);
15028 oappend (":");
15029 }
15030 }
15031 print_operand_value (scratchbuf, 1, off);
15032 oappend (scratchbuf);
15033 }
15034
15035 static void
15036 ptr_reg (int code, int sizeflag)
15037 {
15038 const char *s;
15039
15040 *obufp++ = open_char;
15041 used_prefixes |= (prefixes & PREFIX_ADDR);
15042 if (address_mode == mode_64bit)
15043 {
15044 if (!(sizeflag & AFLAG))
15045 s = names32[code - eAX_reg];
15046 else
15047 s = names64[code - eAX_reg];
15048 }
15049 else if (sizeflag & AFLAG)
15050 s = names32[code - eAX_reg];
15051 else
15052 s = names16[code - eAX_reg];
15053 oappend (s);
15054 *obufp++ = close_char;
15055 *obufp = 0;
15056 }
15057
15058 static void
15059 OP_ESreg (int code, int sizeflag)
15060 {
15061 if (intel_syntax)
15062 {
15063 switch (codep[-1])
15064 {
15065 case 0x6d: /* insw/insl */
15066 intel_operand_size (z_mode, sizeflag);
15067 break;
15068 case 0xa5: /* movsw/movsl/movsq */
15069 case 0xa7: /* cmpsw/cmpsl/cmpsq */
15070 case 0xab: /* stosw/stosl */
15071 case 0xaf: /* scasw/scasl */
15072 intel_operand_size (v_mode, sizeflag);
15073 break;
15074 default:
15075 intel_operand_size (b_mode, sizeflag);
15076 }
15077 }
15078 oappend_maybe_intel ("%es:");
15079 ptr_reg (code, sizeflag);
15080 }
15081
15082 static void
15083 OP_DSreg (int code, int sizeflag)
15084 {
15085 if (intel_syntax)
15086 {
15087 switch (codep[-1])
15088 {
15089 case 0x6f: /* outsw/outsl */
15090 intel_operand_size (z_mode, sizeflag);
15091 break;
15092 case 0xa5: /* movsw/movsl/movsq */
15093 case 0xa7: /* cmpsw/cmpsl/cmpsq */
15094 case 0xad: /* lodsw/lodsl/lodsq */
15095 intel_operand_size (v_mode, sizeflag);
15096 break;
15097 default:
15098 intel_operand_size (b_mode, sizeflag);
15099 }
15100 }
15101 /* Set active_seg_prefix to PREFIX_DS if it is unset so that the
15102 default segment register DS is printed. */
15103 if (!active_seg_prefix)
15104 active_seg_prefix = PREFIX_DS;
15105 append_seg ();
15106 ptr_reg (code, sizeflag);
15107 }
15108
15109 static void
15110 OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15111 {
15112 int add;
15113 if (rex & REX_R)
15114 {
15115 USED_REX (REX_R);
15116 add = 8;
15117 }
15118 else if (address_mode != mode_64bit && (prefixes & PREFIX_LOCK))
15119 {
15120 all_prefixes[last_lock_prefix] = 0;
15121 used_prefixes |= PREFIX_LOCK;
15122 add = 8;
15123 }
15124 else
15125 add = 0;
15126 sprintf (scratchbuf, "%%cr%d", modrm.reg + add);
15127 oappend_maybe_intel (scratchbuf);
15128 }
15129
15130 static void
15131 OP_D (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15132 {
15133 int add;
15134 USED_REX (REX_R);
15135 if (rex & REX_R)
15136 add = 8;
15137 else
15138 add = 0;
15139 if (intel_syntax)
15140 sprintf (scratchbuf, "db%d", modrm.reg + add);
15141 else
15142 sprintf (scratchbuf, "%%db%d", modrm.reg + add);
15143 oappend (scratchbuf);
15144 }
15145
15146 static void
15147 OP_T (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15148 {
15149 sprintf (scratchbuf, "%%tr%d", modrm.reg);
15150 oappend_maybe_intel (scratchbuf);
15151 }
15152
15153 static void
15154 OP_R (int bytemode, int sizeflag)
15155 {
15156 /* Skip mod/rm byte. */
15157 MODRM_CHECK;
15158 codep++;
15159 OP_E_register (bytemode, sizeflag);
15160 }
15161
15162 static void
15163 OP_MMX (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15164 {
15165 int reg = modrm.reg;
15166 const char **names;
15167
15168 used_prefixes |= (prefixes & PREFIX_DATA);
15169 if (prefixes & PREFIX_DATA)
15170 {
15171 names = names_xmm;
15172 USED_REX (REX_R);
15173 if (rex & REX_R)
15174 reg += 8;
15175 }
15176 else
15177 names = names_mm;
15178 oappend (names[reg]);
15179 }
15180
15181 static void
15182 OP_XMM (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
15183 {
15184 int reg = modrm.reg;
15185 const char **names;
15186
15187 USED_REX (REX_R);
15188 if (rex & REX_R)
15189 reg += 8;
15190 if (vex.evex)
15191 {
15192 if (!vex.r)
15193 reg += 16;
15194 }
15195
15196 if (need_vex
15197 && bytemode != xmm_mode
15198 && bytemode != xmmq_mode
15199 && bytemode != evex_half_bcst_xmmq_mode
15200 && bytemode != ymm_mode
15201 && bytemode != scalar_mode)
15202 {
15203 switch (vex.length)
15204 {
15205 case 128:
15206 names = names_xmm;
15207 break;
15208 case 256:
15209 if (vex.w
15210 || (bytemode != vex_vsib_q_w_dq_mode
15211 && bytemode != vex_vsib_q_w_d_mode))
15212 names = names_ymm;
15213 else
15214 names = names_xmm;
15215 break;
15216 case 512:
15217 names = names_zmm;
15218 break;
15219 default:
15220 abort ();
15221 }
15222 }
15223 else if (bytemode == xmmq_mode
15224 || bytemode == evex_half_bcst_xmmq_mode)
15225 {
15226 switch (vex.length)
15227 {
15228 case 128:
15229 case 256:
15230 names = names_xmm;
15231 break;
15232 case 512:
15233 names = names_ymm;
15234 break;
15235 default:
15236 abort ();
15237 }
15238 }
15239 else if (bytemode == ymm_mode)
15240 names = names_ymm;
15241 else
15242 names = names_xmm;
15243 oappend (names[reg]);
15244 }
15245
15246 static void
15247 OP_EM (int bytemode, int sizeflag)
15248 {
15249 int reg;
15250 const char **names;
15251
15252 if (modrm.mod != 3)
15253 {
15254 if (intel_syntax
15255 && (bytemode == v_mode || bytemode == v_swap_mode))
15256 {
15257 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
15258 used_prefixes |= (prefixes & PREFIX_DATA);
15259 }
15260 OP_E (bytemode, sizeflag);
15261 return;
15262 }
15263
15264 if ((sizeflag & SUFFIX_ALWAYS) && bytemode == v_swap_mode)
15265 swap_operand ();
15266
15267 /* Skip mod/rm byte. */
15268 MODRM_CHECK;
15269 codep++;
15270 used_prefixes |= (prefixes & PREFIX_DATA);
15271 reg = modrm.rm;
15272 if (prefixes & PREFIX_DATA)
15273 {
15274 names = names_xmm;
15275 USED_REX (REX_B);
15276 if (rex & REX_B)
15277 reg += 8;
15278 }
15279 else
15280 names = names_mm;
15281 oappend (names[reg]);
15282 }
15283
15284 /* cvt* are the only instructions in sse2 which have
15285 both SSE and MMX operands and also have 0x66 prefix
15286 in their opcode. 0x66 was originally used to differentiate
15287 between SSE and MMX instruction(operands). So we have to handle the
15288 cvt* separately using OP_EMC and OP_MXC */
15289 static void
15290 OP_EMC (int bytemode, int sizeflag)
15291 {
15292 if (modrm.mod != 3)
15293 {
15294 if (intel_syntax && bytemode == v_mode)
15295 {
15296 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
15297 used_prefixes |= (prefixes & PREFIX_DATA);
15298 }
15299 OP_E (bytemode, sizeflag);
15300 return;
15301 }
15302
15303 /* Skip mod/rm byte. */
15304 MODRM_CHECK;
15305 codep++;
15306 used_prefixes |= (prefixes & PREFIX_DATA);
15307 oappend (names_mm[modrm.rm]);
15308 }
15309
15310 static void
15311 OP_MXC (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15312 {
15313 used_prefixes |= (prefixes & PREFIX_DATA);
15314 oappend (names_mm[modrm.reg]);
15315 }
15316
15317 static void
15318 OP_EX (int bytemode, int sizeflag)
15319 {
15320 int reg;
15321 const char **names;
15322
15323 /* Skip mod/rm byte. */
15324 MODRM_CHECK;
15325 codep++;
15326
15327 if (modrm.mod != 3)
15328 {
15329 OP_E_memory (bytemode, sizeflag);
15330 return;
15331 }
15332
15333 reg = modrm.rm;
15334 USED_REX (REX_B);
15335 if (rex & REX_B)
15336 reg += 8;
15337 if (vex.evex)
15338 {
15339 USED_REX (REX_X);
15340 if ((rex & REX_X))
15341 reg += 16;
15342 }
15343
15344 if ((sizeflag & SUFFIX_ALWAYS)
15345 && (bytemode == x_swap_mode
15346 || bytemode == d_swap_mode
15347 || bytemode == d_scalar_swap_mode
15348 || bytemode == q_swap_mode
15349 || bytemode == q_scalar_swap_mode))
15350 swap_operand ();
15351
15352 if (need_vex
15353 && bytemode != xmm_mode
15354 && bytemode != xmmdw_mode
15355 && bytemode != xmmqd_mode
15356 && bytemode != xmm_mb_mode
15357 && bytemode != xmm_mw_mode
15358 && bytemode != xmm_md_mode
15359 && bytemode != xmm_mq_mode
15360 && bytemode != xmm_mdq_mode
15361 && bytemode != xmmq_mode
15362 && bytemode != evex_half_bcst_xmmq_mode
15363 && bytemode != ymm_mode
15364 && bytemode != d_scalar_mode
15365 && bytemode != d_scalar_swap_mode
15366 && bytemode != q_scalar_mode
15367 && bytemode != q_scalar_swap_mode
15368 && bytemode != vex_scalar_w_dq_mode)
15369 {
15370 switch (vex.length)
15371 {
15372 case 128:
15373 names = names_xmm;
15374 break;
15375 case 256:
15376 names = names_ymm;
15377 break;
15378 case 512:
15379 names = names_zmm;
15380 break;
15381 default:
15382 abort ();
15383 }
15384 }
15385 else if (bytemode == xmmq_mode
15386 || bytemode == evex_half_bcst_xmmq_mode)
15387 {
15388 switch (vex.length)
15389 {
15390 case 128:
15391 case 256:
15392 names = names_xmm;
15393 break;
15394 case 512:
15395 names = names_ymm;
15396 break;
15397 default:
15398 abort ();
15399 }
15400 }
15401 else if (bytemode == ymm_mode)
15402 names = names_ymm;
15403 else
15404 names = names_xmm;
15405 oappend (names[reg]);
15406 }
15407
15408 static void
15409 OP_MS (int bytemode, int sizeflag)
15410 {
15411 if (modrm.mod == 3)
15412 OP_EM (bytemode, sizeflag);
15413 else
15414 BadOp ();
15415 }
15416
15417 static void
15418 OP_XS (int bytemode, int sizeflag)
15419 {
15420 if (modrm.mod == 3)
15421 OP_EX (bytemode, sizeflag);
15422 else
15423 BadOp ();
15424 }
15425
15426 static void
15427 OP_M (int bytemode, int sizeflag)
15428 {
15429 if (modrm.mod == 3)
15430 /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
15431 BadOp ();
15432 else
15433 OP_E (bytemode, sizeflag);
15434 }
15435
15436 static void
15437 OP_0f07 (int bytemode, int sizeflag)
15438 {
15439 if (modrm.mod != 3 || modrm.rm != 0)
15440 BadOp ();
15441 else
15442 OP_E (bytemode, sizeflag);
15443 }
15444
15445 /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
15446 32bit mode and "xchg %rax,%rax" in 64bit mode. */
15447
15448 static void
15449 NOP_Fixup1 (int bytemode, int sizeflag)
15450 {
15451 if ((prefixes & PREFIX_DATA) != 0
15452 || (rex != 0
15453 && rex != 0x48
15454 && address_mode == mode_64bit))
15455 OP_REG (bytemode, sizeflag);
15456 else
15457 strcpy (obuf, "nop");
15458 }
15459
15460 static void
15461 NOP_Fixup2 (int bytemode, int sizeflag)
15462 {
15463 if ((prefixes & PREFIX_DATA) != 0
15464 || (rex != 0
15465 && rex != 0x48
15466 && address_mode == mode_64bit))
15467 OP_IMREG (bytemode, sizeflag);
15468 }
15469
15470 static const char *const Suffix3DNow[] = {
15471 /* 00 */ NULL, NULL, NULL, NULL,
15472 /* 04 */ NULL, NULL, NULL, NULL,
15473 /* 08 */ NULL, NULL, NULL, NULL,
15474 /* 0C */ "pi2fw", "pi2fd", NULL, NULL,
15475 /* 10 */ NULL, NULL, NULL, NULL,
15476 /* 14 */ NULL, NULL, NULL, NULL,
15477 /* 18 */ NULL, NULL, NULL, NULL,
15478 /* 1C */ "pf2iw", "pf2id", NULL, NULL,
15479 /* 20 */ NULL, NULL, NULL, NULL,
15480 /* 24 */ NULL, NULL, NULL, NULL,
15481 /* 28 */ NULL, NULL, NULL, NULL,
15482 /* 2C */ NULL, NULL, NULL, NULL,
15483 /* 30 */ NULL, NULL, NULL, NULL,
15484 /* 34 */ NULL, NULL, NULL, NULL,
15485 /* 38 */ NULL, NULL, NULL, NULL,
15486 /* 3C */ NULL, NULL, NULL, NULL,
15487 /* 40 */ NULL, NULL, NULL, NULL,
15488 /* 44 */ NULL, NULL, NULL, NULL,
15489 /* 48 */ NULL, NULL, NULL, NULL,
15490 /* 4C */ NULL, NULL, NULL, NULL,
15491 /* 50 */ NULL, NULL, NULL, NULL,
15492 /* 54 */ NULL, NULL, NULL, NULL,
15493 /* 58 */ NULL, NULL, NULL, NULL,
15494 /* 5C */ NULL, NULL, NULL, NULL,
15495 /* 60 */ NULL, NULL, NULL, NULL,
15496 /* 64 */ NULL, NULL, NULL, NULL,
15497 /* 68 */ NULL, NULL, NULL, NULL,
15498 /* 6C */ NULL, NULL, NULL, NULL,
15499 /* 70 */ NULL, NULL, NULL, NULL,
15500 /* 74 */ NULL, NULL, NULL, NULL,
15501 /* 78 */ NULL, NULL, NULL, NULL,
15502 /* 7C */ NULL, NULL, NULL, NULL,
15503 /* 80 */ NULL, NULL, NULL, NULL,
15504 /* 84 */ NULL, NULL, NULL, NULL,
15505 /* 88 */ NULL, NULL, "pfnacc", NULL,
15506 /* 8C */ NULL, NULL, "pfpnacc", NULL,
15507 /* 90 */ "pfcmpge", NULL, NULL, NULL,
15508 /* 94 */ "pfmin", NULL, "pfrcp", "pfrsqrt",
15509 /* 98 */ NULL, NULL, "pfsub", NULL,
15510 /* 9C */ NULL, NULL, "pfadd", NULL,
15511 /* A0 */ "pfcmpgt", NULL, NULL, NULL,
15512 /* A4 */ "pfmax", NULL, "pfrcpit1", "pfrsqit1",
15513 /* A8 */ NULL, NULL, "pfsubr", NULL,
15514 /* AC */ NULL, NULL, "pfacc", NULL,
15515 /* B0 */ "pfcmpeq", NULL, NULL, NULL,
15516 /* B4 */ "pfmul", NULL, "pfrcpit2", "pmulhrw",
15517 /* B8 */ NULL, NULL, NULL, "pswapd",
15518 /* BC */ NULL, NULL, NULL, "pavgusb",
15519 /* C0 */ NULL, NULL, NULL, NULL,
15520 /* C4 */ NULL, NULL, NULL, NULL,
15521 /* C8 */ NULL, NULL, NULL, NULL,
15522 /* CC */ NULL, NULL, NULL, NULL,
15523 /* D0 */ NULL, NULL, NULL, NULL,
15524 /* D4 */ NULL, NULL, NULL, NULL,
15525 /* D8 */ NULL, NULL, NULL, NULL,
15526 /* DC */ NULL, NULL, NULL, NULL,
15527 /* E0 */ NULL, NULL, NULL, NULL,
15528 /* E4 */ NULL, NULL, NULL, NULL,
15529 /* E8 */ NULL, NULL, NULL, NULL,
15530 /* EC */ NULL, NULL, NULL, NULL,
15531 /* F0 */ NULL, NULL, NULL, NULL,
15532 /* F4 */ NULL, NULL, NULL, NULL,
15533 /* F8 */ NULL, NULL, NULL, NULL,
15534 /* FC */ NULL, NULL, NULL, NULL,
15535 };
15536
15537 static void
15538 OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15539 {
15540 const char *mnemonic;
15541
15542 FETCH_DATA (the_info, codep + 1);
15543 /* AMD 3DNow! instructions are specified by an opcode suffix in the
15544 place where an 8-bit immediate would normally go. ie. the last
15545 byte of the instruction. */
15546 obufp = mnemonicendp;
15547 mnemonic = Suffix3DNow[*codep++ & 0xff];
15548 if (mnemonic)
15549 oappend (mnemonic);
15550 else
15551 {
15552 /* Since a variable sized modrm/sib chunk is between the start
15553 of the opcode (0x0f0f) and the opcode suffix, we need to do
15554 all the modrm processing first, and don't know until now that
15555 we have a bad opcode. This necessitates some cleaning up. */
15556 op_out[0][0] = '\0';
15557 op_out[1][0] = '\0';
15558 BadOp ();
15559 }
15560 mnemonicendp = obufp;
15561 }
15562
15563 static struct op simd_cmp_op[] =
15564 {
15565 { STRING_COMMA_LEN ("eq") },
15566 { STRING_COMMA_LEN ("lt") },
15567 { STRING_COMMA_LEN ("le") },
15568 { STRING_COMMA_LEN ("unord") },
15569 { STRING_COMMA_LEN ("neq") },
15570 { STRING_COMMA_LEN ("nlt") },
15571 { STRING_COMMA_LEN ("nle") },
15572 { STRING_COMMA_LEN ("ord") }
15573 };
15574
15575 static void
15576 CMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15577 {
15578 unsigned int cmp_type;
15579
15580 FETCH_DATA (the_info, codep + 1);
15581 cmp_type = *codep++ & 0xff;
15582 if (cmp_type < ARRAY_SIZE (simd_cmp_op))
15583 {
15584 char suffix [3];
15585 char *p = mnemonicendp - 2;
15586 suffix[0] = p[0];
15587 suffix[1] = p[1];
15588 suffix[2] = '\0';
15589 sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
15590 mnemonicendp += simd_cmp_op[cmp_type].len;
15591 }
15592 else
15593 {
15594 /* We have a reserved extension byte. Output it directly. */
15595 scratchbuf[0] = '$';
15596 print_operand_value (scratchbuf + 1, 1, cmp_type);
15597 oappend_maybe_intel (scratchbuf);
15598 scratchbuf[0] = '\0';
15599 }
15600 }
15601
15602 static void
15603 OP_Mwaitx (int bytemode ATTRIBUTE_UNUSED,
15604 int sizeflag ATTRIBUTE_UNUSED)
15605 {
15606 /* mwaitx %eax,%ecx,%ebx */
15607 if (!intel_syntax)
15608 {
15609 const char **names = (address_mode == mode_64bit
15610 ? names64 : names32);
15611 strcpy (op_out[0], names[0]);
15612 strcpy (op_out[1], names[1]);
15613 strcpy (op_out[2], names[3]);
15614 two_source_ops = 1;
15615 }
15616 /* Skip mod/rm byte. */
15617 MODRM_CHECK;
15618 codep++;
15619 }
15620
15621 static void
15622 OP_Mwait (int bytemode ATTRIBUTE_UNUSED,
15623 int sizeflag ATTRIBUTE_UNUSED)
15624 {
15625 /* mwait %eax,%ecx */
15626 if (!intel_syntax)
15627 {
15628 const char **names = (address_mode == mode_64bit
15629 ? names64 : names32);
15630 strcpy (op_out[0], names[0]);
15631 strcpy (op_out[1], names[1]);
15632 two_source_ops = 1;
15633 }
15634 /* Skip mod/rm byte. */
15635 MODRM_CHECK;
15636 codep++;
15637 }
15638
15639 static void
15640 OP_Monitor (int bytemode ATTRIBUTE_UNUSED,
15641 int sizeflag ATTRIBUTE_UNUSED)
15642 {
15643 /* monitor %eax,%ecx,%edx" */
15644 if (!intel_syntax)
15645 {
15646 const char **op1_names;
15647 const char **names = (address_mode == mode_64bit
15648 ? names64 : names32);
15649
15650 if (!(prefixes & PREFIX_ADDR))
15651 op1_names = (address_mode == mode_16bit
15652 ? names16 : names);
15653 else
15654 {
15655 /* Remove "addr16/addr32". */
15656 all_prefixes[last_addr_prefix] = 0;
15657 op1_names = (address_mode != mode_32bit
15658 ? names32 : names16);
15659 used_prefixes |= PREFIX_ADDR;
15660 }
15661 strcpy (op_out[0], op1_names[0]);
15662 strcpy (op_out[1], names[1]);
15663 strcpy (op_out[2], names[2]);
15664 two_source_ops = 1;
15665 }
15666 /* Skip mod/rm byte. */
15667 MODRM_CHECK;
15668 codep++;
15669 }
15670
15671 static void
15672 BadOp (void)
15673 {
15674 /* Throw away prefixes and 1st. opcode byte. */
15675 codep = insn_codep + 1;
15676 oappend ("(bad)");
15677 }
15678
15679 static void
15680 REP_Fixup (int bytemode, int sizeflag)
15681 {
15682 /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
15683 lods and stos. */
15684 if (prefixes & PREFIX_REPZ)
15685 all_prefixes[last_repz_prefix] = REP_PREFIX;
15686
15687 switch (bytemode)
15688 {
15689 case al_reg:
15690 case eAX_reg:
15691 case indir_dx_reg:
15692 OP_IMREG (bytemode, sizeflag);
15693 break;
15694 case eDI_reg:
15695 OP_ESreg (bytemode, sizeflag);
15696 break;
15697 case eSI_reg:
15698 OP_DSreg (bytemode, sizeflag);
15699 break;
15700 default:
15701 abort ();
15702 break;
15703 }
15704 }
15705
15706 /* For BND-prefixed instructions 0xF2 prefix should be displayed as
15707 "bnd". */
15708
15709 static void
15710 BND_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15711 {
15712 if (prefixes & PREFIX_REPNZ)
15713 all_prefixes[last_repnz_prefix] = BND_PREFIX;
15714 }
15715
15716 /* For NOTRACK-prefixed instructions, 0x3E prefix should be displayed as
15717 "notrack". */
15718
15719 static void
15720 NOTRACK_Fixup (int bytemode ATTRIBUTE_UNUSED,
15721 int sizeflag ATTRIBUTE_UNUSED)
15722 {
15723 if (active_seg_prefix == PREFIX_DS
15724 && (address_mode != mode_64bit || last_data_prefix < 0))
15725 {
15726 /* NOTRACK prefix is only valid on indirect branch instructions.
15727 NB: DATA prefix is unsupported for Intel64. */
15728 active_seg_prefix = 0;
15729 all_prefixes[last_seg_prefix] = NOTRACK_PREFIX;
15730 }
15731 }
15732
15733 /* Similar to OP_E. But the 0xf2/0xf3 prefixes should be displayed as
15734 "xacquire"/"xrelease" for memory operand if there is a LOCK prefix.
15735 */
15736
15737 static void
15738 HLE_Fixup1 (int bytemode, int sizeflag)
15739 {
15740 if (modrm.mod != 3
15741 && (prefixes & PREFIX_LOCK) != 0)
15742 {
15743 if (prefixes & PREFIX_REPZ)
15744 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
15745 if (prefixes & PREFIX_REPNZ)
15746 all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
15747 }
15748
15749 OP_E (bytemode, sizeflag);
15750 }
15751
15752 /* Similar to OP_E. But the 0xf2/0xf3 prefixes should be displayed as
15753 "xacquire"/"xrelease" for memory operand. No check for LOCK prefix.
15754 */
15755
15756 static void
15757 HLE_Fixup2 (int bytemode, int sizeflag)
15758 {
15759 if (modrm.mod != 3)
15760 {
15761 if (prefixes & PREFIX_REPZ)
15762 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
15763 if (prefixes & PREFIX_REPNZ)
15764 all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
15765 }
15766
15767 OP_E (bytemode, sizeflag);
15768 }
15769
15770 /* Similar to OP_E. But the 0xf3 prefixes should be displayed as
15771 "xrelease" for memory operand. No check for LOCK prefix. */
15772
15773 static void
15774 HLE_Fixup3 (int bytemode, int sizeflag)
15775 {
15776 if (modrm.mod != 3
15777 && last_repz_prefix > last_repnz_prefix
15778 && (prefixes & PREFIX_REPZ) != 0)
15779 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
15780
15781 OP_E (bytemode, sizeflag);
15782 }
15783
15784 static void
15785 CMPXCHG8B_Fixup (int bytemode, int sizeflag)
15786 {
15787 USED_REX (REX_W);
15788 if (rex & REX_W)
15789 {
15790 /* Change cmpxchg8b to cmpxchg16b. */
15791 char *p = mnemonicendp - 2;
15792 mnemonicendp = stpcpy (p, "16b");
15793 bytemode = o_mode;
15794 }
15795 else if ((prefixes & PREFIX_LOCK) != 0)
15796 {
15797 if (prefixes & PREFIX_REPZ)
15798 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
15799 if (prefixes & PREFIX_REPNZ)
15800 all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
15801 }
15802
15803 OP_M (bytemode, sizeflag);
15804 }
15805
15806 static void
15807 XMM_Fixup (int reg, int sizeflag ATTRIBUTE_UNUSED)
15808 {
15809 const char **names;
15810
15811 if (need_vex)
15812 {
15813 switch (vex.length)
15814 {
15815 case 128:
15816 names = names_xmm;
15817 break;
15818 case 256:
15819 names = names_ymm;
15820 break;
15821 default:
15822 abort ();
15823 }
15824 }
15825 else
15826 names = names_xmm;
15827 oappend (names[reg]);
15828 }
15829
15830 static void
15831 CRC32_Fixup (int bytemode, int sizeflag)
15832 {
15833 /* Add proper suffix to "crc32". */
15834 char *p = mnemonicendp;
15835
15836 switch (bytemode)
15837 {
15838 case b_mode:
15839 if (intel_syntax)
15840 goto skip;
15841
15842 *p++ = 'b';
15843 break;
15844 case v_mode:
15845 if (intel_syntax)
15846 goto skip;
15847
15848 USED_REX (REX_W);
15849 if (rex & REX_W)
15850 *p++ = 'q';
15851 else
15852 {
15853 if (sizeflag & DFLAG)
15854 *p++ = 'l';
15855 else
15856 *p++ = 'w';
15857 used_prefixes |= (prefixes & PREFIX_DATA);
15858 }
15859 break;
15860 default:
15861 oappend (INTERNAL_DISASSEMBLER_ERROR);
15862 break;
15863 }
15864 mnemonicendp = p;
15865 *p = '\0';
15866
15867 skip:
15868 if (modrm.mod == 3)
15869 {
15870 int add;
15871
15872 /* Skip mod/rm byte. */
15873 MODRM_CHECK;
15874 codep++;
15875
15876 USED_REX (REX_B);
15877 add = (rex & REX_B) ? 8 : 0;
15878 if (bytemode == b_mode)
15879 {
15880 USED_REX (0);
15881 if (rex)
15882 oappend (names8rex[modrm.rm + add]);
15883 else
15884 oappend (names8[modrm.rm + add]);
15885 }
15886 else
15887 {
15888 USED_REX (REX_W);
15889 if (rex & REX_W)
15890 oappend (names64[modrm.rm + add]);
15891 else if ((prefixes & PREFIX_DATA))
15892 oappend (names16[modrm.rm + add]);
15893 else
15894 oappend (names32[modrm.rm + add]);
15895 }
15896 }
15897 else
15898 OP_E (bytemode, sizeflag);
15899 }
15900
15901 static void
15902 FXSAVE_Fixup (int bytemode, int sizeflag)
15903 {
15904 /* Add proper suffix to "fxsave" and "fxrstor". */
15905 USED_REX (REX_W);
15906 if (rex & REX_W)
15907 {
15908 char *p = mnemonicendp;
15909 *p++ = '6';
15910 *p++ = '4';
15911 *p = '\0';
15912 mnemonicendp = p;
15913 }
15914 OP_M (bytemode, sizeflag);
15915 }
15916
15917 static void
15918 PCMPESTR_Fixup (int bytemode, int sizeflag)
15919 {
15920 /* Add proper suffix to "{,v}pcmpestr{i,m}". */
15921 if (!intel_syntax)
15922 {
15923 char *p = mnemonicendp;
15924
15925 USED_REX (REX_W);
15926 if (rex & REX_W)
15927 *p++ = 'q';
15928 else if (sizeflag & SUFFIX_ALWAYS)
15929 *p++ = 'l';
15930
15931 *p = '\0';
15932 mnemonicendp = p;
15933 }
15934
15935 OP_EX (bytemode, sizeflag);
15936 }
15937
15938 /* Display the destination register operand for instructions with
15939 VEX. */
15940
15941 static void
15942 OP_VEX (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
15943 {
15944 int reg;
15945 const char **names;
15946
15947 if (!need_vex)
15948 abort ();
15949
15950 if (!need_vex_reg)
15951 return;
15952
15953 reg = vex.register_specifier;
15954 if (address_mode != mode_64bit)
15955 reg &= 7;
15956 else if (vex.evex && !vex.v)
15957 reg += 16;
15958
15959 if (bytemode == vex_scalar_mode)
15960 {
15961 oappend (names_xmm[reg]);
15962 return;
15963 }
15964
15965 switch (vex.length)
15966 {
15967 case 128:
15968 switch (bytemode)
15969 {
15970 case vex_mode:
15971 case vex128_mode:
15972 case vex_vsib_q_w_dq_mode:
15973 case vex_vsib_q_w_d_mode:
15974 names = names_xmm;
15975 break;
15976 case dq_mode:
15977 if (rex & REX_W)
15978 names = names64;
15979 else
15980 names = names32;
15981 break;
15982 case mask_bd_mode:
15983 case mask_mode:
15984 if (reg > 0x7)
15985 {
15986 oappend ("(bad)");
15987 return;
15988 }
15989 names = names_mask;
15990 break;
15991 default:
15992 abort ();
15993 return;
15994 }
15995 break;
15996 case 256:
15997 switch (bytemode)
15998 {
15999 case vex_mode:
16000 case vex256_mode:
16001 names = names_ymm;
16002 break;
16003 case vex_vsib_q_w_dq_mode:
16004 case vex_vsib_q_w_d_mode:
16005 names = vex.w ? names_ymm : names_xmm;
16006 break;
16007 case mask_bd_mode:
16008 case mask_mode:
16009 if (reg > 0x7)
16010 {
16011 oappend ("(bad)");
16012 return;
16013 }
16014 names = names_mask;
16015 break;
16016 default:
16017 /* See PR binutils/20893 for a reproducer. */
16018 oappend ("(bad)");
16019 return;
16020 }
16021 break;
16022 case 512:
16023 names = names_zmm;
16024 break;
16025 default:
16026 abort ();
16027 break;
16028 }
16029 oappend (names[reg]);
16030 }
16031
16032 /* Get the VEX immediate byte without moving codep. */
16033
16034 static unsigned char
16035 get_vex_imm8 (int sizeflag, int opnum)
16036 {
16037 int bytes_before_imm = 0;
16038
16039 if (modrm.mod != 3)
16040 {
16041 /* There are SIB/displacement bytes. */
16042 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
16043 {
16044 /* 32/64 bit address mode */
16045 int base = modrm.rm;
16046
16047 /* Check SIB byte. */
16048 if (base == 4)
16049 {
16050 FETCH_DATA (the_info, codep + 1);
16051 base = *codep & 7;
16052 /* When decoding the third source, don't increase
16053 bytes_before_imm as this has already been incremented
16054 by one in OP_E_memory while decoding the second
16055 source operand. */
16056 if (opnum == 0)
16057 bytes_before_imm++;
16058 }
16059
16060 /* Don't increase bytes_before_imm when decoding the third source,
16061 it has already been incremented by OP_E_memory while decoding
16062 the second source operand. */
16063 if (opnum == 0)
16064 {
16065 switch (modrm.mod)
16066 {
16067 case 0:
16068 /* When modrm.rm == 5 or modrm.rm == 4 and base in
16069 SIB == 5, there is a 4 byte displacement. */
16070 if (base != 5)
16071 /* No displacement. */
16072 break;
16073 /* Fall through. */
16074 case 2:
16075 /* 4 byte displacement. */
16076 bytes_before_imm += 4;
16077 break;
16078 case 1:
16079 /* 1 byte displacement. */
16080 bytes_before_imm++;
16081 break;
16082 }
16083 }
16084 }
16085 else
16086 {
16087 /* 16 bit address mode */
16088 /* Don't increase bytes_before_imm when decoding the third source,
16089 it has already been incremented by OP_E_memory while decoding
16090 the second source operand. */
16091 if (opnum == 0)
16092 {
16093 switch (modrm.mod)
16094 {
16095 case 0:
16096 /* When modrm.rm == 6, there is a 2 byte displacement. */
16097 if (modrm.rm != 6)
16098 /* No displacement. */
16099 break;
16100 /* Fall through. */
16101 case 2:
16102 /* 2 byte displacement. */
16103 bytes_before_imm += 2;
16104 break;
16105 case 1:
16106 /* 1 byte displacement: when decoding the third source,
16107 don't increase bytes_before_imm as this has already
16108 been incremented by one in OP_E_memory while decoding
16109 the second source operand. */
16110 if (opnum == 0)
16111 bytes_before_imm++;
16112
16113 break;
16114 }
16115 }
16116 }
16117 }
16118
16119 FETCH_DATA (the_info, codep + bytes_before_imm + 1);
16120 return codep [bytes_before_imm];
16121 }
16122
16123 static void
16124 OP_EX_VexReg (int bytemode, int sizeflag, int reg)
16125 {
16126 const char **names;
16127
16128 if (reg == -1 && modrm.mod != 3)
16129 {
16130 OP_E_memory (bytemode, sizeflag);
16131 return;
16132 }
16133 else
16134 {
16135 if (reg == -1)
16136 {
16137 reg = modrm.rm;
16138 USED_REX (REX_B);
16139 if (rex & REX_B)
16140 reg += 8;
16141 }
16142 if (address_mode != mode_64bit)
16143 reg &= 7;
16144 }
16145
16146 switch (vex.length)
16147 {
16148 case 128:
16149 names = names_xmm;
16150 break;
16151 case 256:
16152 names = names_ymm;
16153 break;
16154 default:
16155 abort ();
16156 }
16157 oappend (names[reg]);
16158 }
16159
16160 static void
16161 OP_EX_VexImmW (int bytemode, int sizeflag)
16162 {
16163 int reg = -1;
16164 static unsigned char vex_imm8;
16165
16166 if (vex_w_done == 0)
16167 {
16168 vex_w_done = 1;
16169
16170 /* Skip mod/rm byte. */
16171 MODRM_CHECK;
16172 codep++;
16173
16174 vex_imm8 = get_vex_imm8 (sizeflag, 0);
16175
16176 if (vex.w)
16177 reg = vex_imm8 >> 4;
16178
16179 OP_EX_VexReg (bytemode, sizeflag, reg);
16180 }
16181 else if (vex_w_done == 1)
16182 {
16183 vex_w_done = 2;
16184
16185 if (!vex.w)
16186 reg = vex_imm8 >> 4;
16187
16188 OP_EX_VexReg (bytemode, sizeflag, reg);
16189 }
16190 else
16191 {
16192 /* Output the imm8 directly. */
16193 scratchbuf[0] = '$';
16194 print_operand_value (scratchbuf + 1, 1, vex_imm8 & 0xf);
16195 oappend_maybe_intel (scratchbuf);
16196 scratchbuf[0] = '\0';
16197 codep++;
16198 }
16199 }
16200
16201 static void
16202 OP_Vex_2src (int bytemode, int sizeflag)
16203 {
16204 if (modrm.mod == 3)
16205 {
16206 int reg = modrm.rm;
16207 USED_REX (REX_B);
16208 if (rex & REX_B)
16209 reg += 8;
16210 oappend (names_xmm[reg]);
16211 }
16212 else
16213 {
16214 if (intel_syntax
16215 && (bytemode == v_mode || bytemode == v_swap_mode))
16216 {
16217 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
16218 used_prefixes |= (prefixes & PREFIX_DATA);
16219 }
16220 OP_E (bytemode, sizeflag);
16221 }
16222 }
16223
16224 static void
16225 OP_Vex_2src_1 (int bytemode, int sizeflag)
16226 {
16227 if (modrm.mod == 3)
16228 {
16229 /* Skip mod/rm byte. */
16230 MODRM_CHECK;
16231 codep++;
16232 }
16233
16234 if (vex.w)
16235 {
16236 unsigned int reg = vex.register_specifier;
16237
16238 if (address_mode != mode_64bit)
16239 reg &= 7;
16240 oappend (names_xmm[reg]);
16241 }
16242 else
16243 OP_Vex_2src (bytemode, sizeflag);
16244 }
16245
16246 static void
16247 OP_Vex_2src_2 (int bytemode, int sizeflag)
16248 {
16249 if (vex.w)
16250 OP_Vex_2src (bytemode, sizeflag);
16251 else
16252 {
16253 unsigned int reg = vex.register_specifier;
16254
16255 if (address_mode != mode_64bit)
16256 reg &= 7;
16257 oappend (names_xmm[reg]);
16258 }
16259 }
16260
16261 static void
16262 OP_EX_VexW (int bytemode, int sizeflag)
16263 {
16264 int reg = -1;
16265
16266 if (!vex_w_done)
16267 {
16268 /* Skip mod/rm byte. */
16269 MODRM_CHECK;
16270 codep++;
16271
16272 if (vex.w)
16273 reg = get_vex_imm8 (sizeflag, 0) >> 4;
16274 }
16275 else
16276 {
16277 if (!vex.w)
16278 reg = get_vex_imm8 (sizeflag, 1) >> 4;
16279 }
16280
16281 OP_EX_VexReg (bytemode, sizeflag, reg);
16282
16283 if (vex_w_done)
16284 codep++;
16285 vex_w_done = 1;
16286 }
16287
16288 static void
16289 OP_REG_VexI4 (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
16290 {
16291 int reg;
16292 const char **names;
16293
16294 FETCH_DATA (the_info, codep + 1);
16295 reg = *codep++;
16296
16297 if (bytemode != x_mode)
16298 abort ();
16299
16300 reg >>= 4;
16301 if (address_mode != mode_64bit)
16302 reg &= 7;
16303
16304 switch (vex.length)
16305 {
16306 case 128:
16307 names = names_xmm;
16308 break;
16309 case 256:
16310 names = names_ymm;
16311 break;
16312 default:
16313 abort ();
16314 }
16315 oappend (names[reg]);
16316 }
16317
16318 static void
16319 OP_XMM_VexW (int bytemode, int sizeflag)
16320 {
16321 /* Turn off the REX.W bit since it is used for swapping operands
16322 now. */
16323 rex &= ~REX_W;
16324 OP_XMM (bytemode, sizeflag);
16325 }
16326
16327 static void
16328 OP_EX_Vex (int bytemode, int sizeflag)
16329 {
16330 if (modrm.mod != 3)
16331 {
16332 if (vex.register_specifier != 0)
16333 BadOp ();
16334 need_vex_reg = 0;
16335 }
16336 OP_EX (bytemode, sizeflag);
16337 }
16338
16339 static void
16340 OP_XMM_Vex (int bytemode, int sizeflag)
16341 {
16342 if (modrm.mod != 3)
16343 {
16344 if (vex.register_specifier != 0)
16345 BadOp ();
16346 need_vex_reg = 0;
16347 }
16348 OP_XMM (bytemode, sizeflag);
16349 }
16350
16351 static struct op vex_cmp_op[] =
16352 {
16353 { STRING_COMMA_LEN ("eq") },
16354 { STRING_COMMA_LEN ("lt") },
16355 { STRING_COMMA_LEN ("le") },
16356 { STRING_COMMA_LEN ("unord") },
16357 { STRING_COMMA_LEN ("neq") },
16358 { STRING_COMMA_LEN ("nlt") },
16359 { STRING_COMMA_LEN ("nle") },
16360 { STRING_COMMA_LEN ("ord") },
16361 { STRING_COMMA_LEN ("eq_uq") },
16362 { STRING_COMMA_LEN ("nge") },
16363 { STRING_COMMA_LEN ("ngt") },
16364 { STRING_COMMA_LEN ("false") },
16365 { STRING_COMMA_LEN ("neq_oq") },
16366 { STRING_COMMA_LEN ("ge") },
16367 { STRING_COMMA_LEN ("gt") },
16368 { STRING_COMMA_LEN ("true") },
16369 { STRING_COMMA_LEN ("eq_os") },
16370 { STRING_COMMA_LEN ("lt_oq") },
16371 { STRING_COMMA_LEN ("le_oq") },
16372 { STRING_COMMA_LEN ("unord_s") },
16373 { STRING_COMMA_LEN ("neq_us") },
16374 { STRING_COMMA_LEN ("nlt_uq") },
16375 { STRING_COMMA_LEN ("nle_uq") },
16376 { STRING_COMMA_LEN ("ord_s") },
16377 { STRING_COMMA_LEN ("eq_us") },
16378 { STRING_COMMA_LEN ("nge_uq") },
16379 { STRING_COMMA_LEN ("ngt_uq") },
16380 { STRING_COMMA_LEN ("false_os") },
16381 { STRING_COMMA_LEN ("neq_os") },
16382 { STRING_COMMA_LEN ("ge_oq") },
16383 { STRING_COMMA_LEN ("gt_oq") },
16384 { STRING_COMMA_LEN ("true_us") },
16385 };
16386
16387 static void
16388 VCMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
16389 {
16390 unsigned int cmp_type;
16391
16392 FETCH_DATA (the_info, codep + 1);
16393 cmp_type = *codep++ & 0xff;
16394 if (cmp_type < ARRAY_SIZE (vex_cmp_op))
16395 {
16396 char suffix [3];
16397 char *p = mnemonicendp - 2;
16398 suffix[0] = p[0];
16399 suffix[1] = p[1];
16400 suffix[2] = '\0';
16401 sprintf (p, "%s%s", vex_cmp_op[cmp_type].name, suffix);
16402 mnemonicendp += vex_cmp_op[cmp_type].len;
16403 }
16404 else
16405 {
16406 /* We have a reserved extension byte. Output it directly. */
16407 scratchbuf[0] = '$';
16408 print_operand_value (scratchbuf + 1, 1, cmp_type);
16409 oappend_maybe_intel (scratchbuf);
16410 scratchbuf[0] = '\0';
16411 }
16412 }
16413
16414 static void
16415 VPCMP_Fixup (int bytemode ATTRIBUTE_UNUSED,
16416 int sizeflag ATTRIBUTE_UNUSED)
16417 {
16418 unsigned int cmp_type;
16419
16420 if (!vex.evex)
16421 abort ();
16422
16423 FETCH_DATA (the_info, codep + 1);
16424 cmp_type = *codep++ & 0xff;
16425 /* There are aliases for immediates 0, 1, 2, 4, 5, 6.
16426 If it's the case, print suffix, otherwise - print the immediate. */
16427 if (cmp_type < ARRAY_SIZE (simd_cmp_op)
16428 && cmp_type != 3
16429 && cmp_type != 7)
16430 {
16431 char suffix [3];
16432 char *p = mnemonicendp - 2;
16433
16434 /* vpcmp* can have both one- and two-lettered suffix. */
16435 if (p[0] == 'p')
16436 {
16437 p++;
16438 suffix[0] = p[0];
16439 suffix[1] = '\0';
16440 }
16441 else
16442 {
16443 suffix[0] = p[0];
16444 suffix[1] = p[1];
16445 suffix[2] = '\0';
16446 }
16447
16448 sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
16449 mnemonicendp += simd_cmp_op[cmp_type].len;
16450 }
16451 else
16452 {
16453 /* We have a reserved extension byte. Output it directly. */
16454 scratchbuf[0] = '$';
16455 print_operand_value (scratchbuf + 1, 1, cmp_type);
16456 oappend_maybe_intel (scratchbuf);
16457 scratchbuf[0] = '\0';
16458 }
16459 }
16460
16461 static const struct op xop_cmp_op[] =
16462 {
16463 { STRING_COMMA_LEN ("lt") },
16464 { STRING_COMMA_LEN ("le") },
16465 { STRING_COMMA_LEN ("gt") },
16466 { STRING_COMMA_LEN ("ge") },
16467 { STRING_COMMA_LEN ("eq") },
16468 { STRING_COMMA_LEN ("neq") },
16469 { STRING_COMMA_LEN ("false") },
16470 { STRING_COMMA_LEN ("true") }
16471 };
16472
16473 static void
16474 VPCOM_Fixup (int bytemode ATTRIBUTE_UNUSED,
16475 int sizeflag ATTRIBUTE_UNUSED)
16476 {
16477 unsigned int cmp_type;
16478
16479 FETCH_DATA (the_info, codep + 1);
16480 cmp_type = *codep++ & 0xff;
16481 if (cmp_type < ARRAY_SIZE (xop_cmp_op))
16482 {
16483 char suffix[3];
16484 char *p = mnemonicendp - 2;
16485
16486 /* vpcom* can have both one- and two-lettered suffix. */
16487 if (p[0] == 'm')
16488 {
16489 p++;
16490 suffix[0] = p[0];
16491 suffix[1] = '\0';
16492 }
16493 else
16494 {
16495 suffix[0] = p[0];
16496 suffix[1] = p[1];
16497 suffix[2] = '\0';
16498 }
16499
16500 sprintf (p, "%s%s", xop_cmp_op[cmp_type].name, suffix);
16501 mnemonicendp += xop_cmp_op[cmp_type].len;
16502 }
16503 else
16504 {
16505 /* We have a reserved extension byte. Output it directly. */
16506 scratchbuf[0] = '$';
16507 print_operand_value (scratchbuf + 1, 1, cmp_type);
16508 oappend_maybe_intel (scratchbuf);
16509 scratchbuf[0] = '\0';
16510 }
16511 }
16512
16513 static const struct op pclmul_op[] =
16514 {
16515 { STRING_COMMA_LEN ("lql") },
16516 { STRING_COMMA_LEN ("hql") },
16517 { STRING_COMMA_LEN ("lqh") },
16518 { STRING_COMMA_LEN ("hqh") }
16519 };
16520
16521 static void
16522 PCLMUL_Fixup (int bytemode ATTRIBUTE_UNUSED,
16523 int sizeflag ATTRIBUTE_UNUSED)
16524 {
16525 unsigned int pclmul_type;
16526
16527 FETCH_DATA (the_info, codep + 1);
16528 pclmul_type = *codep++ & 0xff;
16529 switch (pclmul_type)
16530 {
16531 case 0x10:
16532 pclmul_type = 2;
16533 break;
16534 case 0x11:
16535 pclmul_type = 3;
16536 break;
16537 default:
16538 break;
16539 }
16540 if (pclmul_type < ARRAY_SIZE (pclmul_op))
16541 {
16542 char suffix [4];
16543 char *p = mnemonicendp - 3;
16544 suffix[0] = p[0];
16545 suffix[1] = p[1];
16546 suffix[2] = p[2];
16547 suffix[3] = '\0';
16548 sprintf (p, "%s%s", pclmul_op[pclmul_type].name, suffix);
16549 mnemonicendp += pclmul_op[pclmul_type].len;
16550 }
16551 else
16552 {
16553 /* We have a reserved extension byte. Output it directly. */
16554 scratchbuf[0] = '$';
16555 print_operand_value (scratchbuf + 1, 1, pclmul_type);
16556 oappend_maybe_intel (scratchbuf);
16557 scratchbuf[0] = '\0';
16558 }
16559 }
16560
16561 static void
16562 MOVBE_Fixup (int bytemode, int sizeflag)
16563 {
16564 /* Add proper suffix to "movbe". */
16565 char *p = mnemonicendp;
16566
16567 switch (bytemode)
16568 {
16569 case v_mode:
16570 if (intel_syntax)
16571 goto skip;
16572
16573 USED_REX (REX_W);
16574 if (sizeflag & SUFFIX_ALWAYS)
16575 {
16576 if (rex & REX_W)
16577 *p++ = 'q';
16578 else
16579 {
16580 if (sizeflag & DFLAG)
16581 *p++ = 'l';
16582 else
16583 *p++ = 'w';
16584 used_prefixes |= (prefixes & PREFIX_DATA);
16585 }
16586 }
16587 break;
16588 default:
16589 oappend (INTERNAL_DISASSEMBLER_ERROR);
16590 break;
16591 }
16592 mnemonicendp = p;
16593 *p = '\0';
16594
16595 skip:
16596 OP_M (bytemode, sizeflag);
16597 }
16598
16599 static void
16600 OP_LWPCB_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
16601 {
16602 int reg;
16603 const char **names;
16604
16605 /* Skip mod/rm byte. */
16606 MODRM_CHECK;
16607 codep++;
16608
16609 if (rex & REX_W)
16610 names = names64;
16611 else
16612 names = names32;
16613
16614 reg = modrm.rm;
16615 USED_REX (REX_B);
16616 if (rex & REX_B)
16617 reg += 8;
16618
16619 oappend (names[reg]);
16620 }
16621
16622 static void
16623 OP_LWP_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
16624 {
16625 const char **names;
16626 unsigned int reg = vex.register_specifier;
16627
16628 if (rex & REX_W)
16629 names = names64;
16630 else
16631 names = names32;
16632
16633 if (address_mode != mode_64bit)
16634 reg &= 7;
16635 oappend (names[reg]);
16636 }
16637
16638 static void
16639 OP_Mask (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
16640 {
16641 if (!vex.evex
16642 || (bytemode != mask_mode && bytemode != mask_bd_mode))
16643 abort ();
16644
16645 USED_REX (REX_R);
16646 if ((rex & REX_R) != 0 || !vex.r)
16647 {
16648 BadOp ();
16649 return;
16650 }
16651
16652 oappend (names_mask [modrm.reg]);
16653 }
16654
16655 static void
16656 OP_Rounding (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
16657 {
16658 if (!vex.evex
16659 || (bytemode != evex_rounding_mode
16660 && bytemode != evex_rounding_64_mode
16661 && bytemode != evex_sae_mode))
16662 abort ();
16663 if (modrm.mod == 3 && vex.b)
16664 switch (bytemode)
16665 {
16666 case evex_rounding_64_mode:
16667 if (address_mode != mode_64bit)
16668 {
16669 oappend ("(bad)");
16670 break;
16671 }
16672 /* Fall through. */
16673 case evex_rounding_mode:
16674 oappend (names_rounding[vex.ll]);
16675 break;
16676 case evex_sae_mode:
16677 oappend ("{sae}");
16678 break;
16679 default:
16680 break;
16681 }
16682 }
This page took 0.479519 seconds and 4 git commands to generate.