i386: Break i386-dis-evex.h into small files
[deliverable/binutils-gdb.git] / opcodes / i386-dis.c
1 /* Print i386 instructions for GDB, the GNU debugger.
2 Copyright (C) 1988-2019 Free Software Foundation, Inc.
3
4 This file is part of the GNU opcodes library.
5
6 This library is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
9 any later version.
10
11 It is distributed in the hope that it will be useful, but WITHOUT
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
14 License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19 MA 02110-1301, USA. */
20
21
22 /* 80386 instruction printer by Pace Willisson (pace@prep.ai.mit.edu)
23 July 1988
24 modified by John Hassey (hassey@dg-rtp.dg.com)
25 x86-64 support added by Jan Hubicka (jh@suse.cz)
26 VIA PadLock support by Michal Ludvig (mludvig@suse.cz). */
27
28 /* The main tables describing the instructions is essentially a copy
29 of the "Opcode Map" chapter (Appendix A) of the Intel 80386
30 Programmers Manual. Usually, there is a capital letter, followed
31 by a small letter. The capital letter tell the addressing mode,
32 and the small letter tells about the operand size. Refer to
33 the Intel manual for details. */
34
35 #include "sysdep.h"
36 #include "disassemble.h"
37 #include "opintl.h"
38 #include "opcode/i386.h"
39 #include "libiberty.h"
40
41 #include <setjmp.h>
42
43 static int print_insn (bfd_vma, disassemble_info *);
44 static void dofloat (int);
45 static void OP_ST (int, int);
46 static void OP_STi (int, int);
47 static int putop (const char *, int);
48 static void oappend (const char *);
49 static void append_seg (void);
50 static void OP_indirE (int, int);
51 static void print_operand_value (char *, int, bfd_vma);
52 static void OP_E_register (int, int);
53 static void OP_E_memory (int, int);
54 static void print_displacement (char *, bfd_vma);
55 static void OP_E (int, int);
56 static void OP_G (int, int);
57 static bfd_vma get64 (void);
58 static bfd_signed_vma get32 (void);
59 static bfd_signed_vma get32s (void);
60 static int get16 (void);
61 static void set_op (bfd_vma, int);
62 static void OP_Skip_MODRM (int, int);
63 static void OP_REG (int, int);
64 static void OP_IMREG (int, int);
65 static void OP_I (int, int);
66 static void OP_I64 (int, int);
67 static void OP_sI (int, int);
68 static void OP_J (int, int);
69 static void OP_SEG (int, int);
70 static void OP_DIR (int, int);
71 static void OP_OFF (int, int);
72 static void OP_OFF64 (int, int);
73 static void ptr_reg (int, int);
74 static void OP_ESreg (int, int);
75 static void OP_DSreg (int, int);
76 static void OP_C (int, int);
77 static void OP_D (int, int);
78 static void OP_T (int, int);
79 static void OP_R (int, int);
80 static void OP_MMX (int, int);
81 static void OP_XMM (int, int);
82 static void OP_EM (int, int);
83 static void OP_EX (int, int);
84 static void OP_EMC (int,int);
85 static void OP_MXC (int,int);
86 static void OP_MS (int, int);
87 static void OP_XS (int, int);
88 static void OP_M (int, int);
89 static void OP_VEX (int, int);
90 static void OP_EX_Vex (int, int);
91 static void OP_EX_VexW (int, int);
92 static void OP_EX_VexImmW (int, int);
93 static void OP_XMM_Vex (int, int);
94 static void OP_XMM_VexW (int, int);
95 static void OP_Rounding (int, int);
96 static void OP_REG_VexI4 (int, int);
97 static void PCLMUL_Fixup (int, int);
98 static void VCMP_Fixup (int, int);
99 static void VPCMP_Fixup (int, int);
100 static void VPCOM_Fixup (int, int);
101 static void OP_0f07 (int, int);
102 static void OP_Monitor (int, int);
103 static void OP_Mwait (int, int);
104 static void OP_Mwaitx (int, int);
105 static void NOP_Fixup1 (int, int);
106 static void NOP_Fixup2 (int, int);
107 static void OP_3DNowSuffix (int, int);
108 static void CMP_Fixup (int, int);
109 static void BadOp (void);
110 static void REP_Fixup (int, int);
111 static void BND_Fixup (int, int);
112 static void NOTRACK_Fixup (int, int);
113 static void HLE_Fixup1 (int, int);
114 static void HLE_Fixup2 (int, int);
115 static void HLE_Fixup3 (int, int);
116 static void CMPXCHG8B_Fixup (int, int);
117 static void XMM_Fixup (int, int);
118 static void CRC32_Fixup (int, int);
119 static void FXSAVE_Fixup (int, int);
120 static void PCMPESTR_Fixup (int, int);
121 static void OP_LWPCB_E (int, int);
122 static void OP_LWP_E (int, int);
123 static void OP_Vex_2src_1 (int, int);
124 static void OP_Vex_2src_2 (int, int);
125
126 static void MOVBE_Fixup (int, int);
127
128 static void OP_Mask (int, int);
129
130 struct dis_private {
131 /* Points to first byte not fetched. */
132 bfd_byte *max_fetched;
133 bfd_byte the_buffer[MAX_MNEM_SIZE];
134 bfd_vma insn_start;
135 int orig_sizeflag;
136 OPCODES_SIGJMP_BUF bailout;
137 };
138
139 enum address_mode
140 {
141 mode_16bit,
142 mode_32bit,
143 mode_64bit
144 };
145
146 enum address_mode address_mode;
147
148 /* Flags for the prefixes for the current instruction. See below. */
149 static int prefixes;
150
151 /* REX prefix the current instruction. See below. */
152 static int rex;
153 /* Bits of REX we've already used. */
154 static int rex_used;
155 /* REX bits in original REX prefix ignored. */
156 static int rex_ignored;
157 /* Mark parts used in the REX prefix. When we are testing for
158 empty prefix (for 8bit register REX extension), just mask it
159 out. Otherwise test for REX bit is excuse for existence of REX
160 only in case value is nonzero. */
161 #define USED_REX(value) \
162 { \
163 if (value) \
164 { \
165 if ((rex & value)) \
166 rex_used |= (value) | REX_OPCODE; \
167 } \
168 else \
169 rex_used |= REX_OPCODE; \
170 }
171
172 /* Flags for prefixes which we somehow handled when printing the
173 current instruction. */
174 static int used_prefixes;
175
176 /* Flags stored in PREFIXES. */
177 #define PREFIX_REPZ 1
178 #define PREFIX_REPNZ 2
179 #define PREFIX_LOCK 4
180 #define PREFIX_CS 8
181 #define PREFIX_SS 0x10
182 #define PREFIX_DS 0x20
183 #define PREFIX_ES 0x40
184 #define PREFIX_FS 0x80
185 #define PREFIX_GS 0x100
186 #define PREFIX_DATA 0x200
187 #define PREFIX_ADDR 0x400
188 #define PREFIX_FWAIT 0x800
189
190 /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
191 to ADDR (exclusive) are valid. Returns 1 for success, longjmps
192 on error. */
193 #define FETCH_DATA(info, addr) \
194 ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \
195 ? 1 : fetch_data ((info), (addr)))
196
197 static int
198 fetch_data (struct disassemble_info *info, bfd_byte *addr)
199 {
200 int status;
201 struct dis_private *priv = (struct dis_private *) info->private_data;
202 bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer);
203
204 if (addr <= priv->the_buffer + MAX_MNEM_SIZE)
205 status = (*info->read_memory_func) (start,
206 priv->max_fetched,
207 addr - priv->max_fetched,
208 info);
209 else
210 status = -1;
211 if (status != 0)
212 {
213 /* If we did manage to read at least one byte, then
214 print_insn_i386 will do something sensible. Otherwise, print
215 an error. We do that here because this is where we know
216 STATUS. */
217 if (priv->max_fetched == priv->the_buffer)
218 (*info->memory_error_func) (status, start, info);
219 OPCODES_SIGLONGJMP (priv->bailout, 1);
220 }
221 else
222 priv->max_fetched = addr;
223 return 1;
224 }
225
226 /* Possible values for prefix requirement. */
227 #define PREFIX_IGNORED_SHIFT 16
228 #define PREFIX_IGNORED_REPZ (PREFIX_REPZ << PREFIX_IGNORED_SHIFT)
229 #define PREFIX_IGNORED_REPNZ (PREFIX_REPNZ << PREFIX_IGNORED_SHIFT)
230 #define PREFIX_IGNORED_DATA (PREFIX_DATA << PREFIX_IGNORED_SHIFT)
231 #define PREFIX_IGNORED_ADDR (PREFIX_ADDR << PREFIX_IGNORED_SHIFT)
232 #define PREFIX_IGNORED_LOCK (PREFIX_LOCK << PREFIX_IGNORED_SHIFT)
233
234 /* Opcode prefixes. */
235 #define PREFIX_OPCODE (PREFIX_REPZ \
236 | PREFIX_REPNZ \
237 | PREFIX_DATA)
238
239 /* Prefixes ignored. */
240 #define PREFIX_IGNORED (PREFIX_IGNORED_REPZ \
241 | PREFIX_IGNORED_REPNZ \
242 | PREFIX_IGNORED_DATA)
243
244 #define XX { NULL, 0 }
245 #define Bad_Opcode NULL, { { NULL, 0 } }, 0
246
247 #define Eb { OP_E, b_mode }
248 #define Ebnd { OP_E, bnd_mode }
249 #define EbS { OP_E, b_swap_mode }
250 #define EbndS { OP_E, bnd_swap_mode }
251 #define Ev { OP_E, v_mode }
252 #define Eva { OP_E, va_mode }
253 #define Ev_bnd { OP_E, v_bnd_mode }
254 #define EvS { OP_E, v_swap_mode }
255 #define Ed { OP_E, d_mode }
256 #define Edq { OP_E, dq_mode }
257 #define Edqw { OP_E, dqw_mode }
258 #define Edqb { OP_E, dqb_mode }
259 #define Edb { OP_E, db_mode }
260 #define Edw { OP_E, dw_mode }
261 #define Edqd { OP_E, dqd_mode }
262 #define Edqa { OP_E, dqa_mode }
263 #define Eq { OP_E, q_mode }
264 #define indirEv { OP_indirE, indir_v_mode }
265 #define indirEp { OP_indirE, f_mode }
266 #define stackEv { OP_E, stack_v_mode }
267 #define Em { OP_E, m_mode }
268 #define Ew { OP_E, w_mode }
269 #define M { OP_M, 0 } /* lea, lgdt, etc. */
270 #define Ma { OP_M, a_mode }
271 #define Mb { OP_M, b_mode }
272 #define Md { OP_M, d_mode }
273 #define Mo { OP_M, o_mode }
274 #define Mp { OP_M, f_mode } /* 32 or 48 bit memory operand for LDS, LES etc */
275 #define Mq { OP_M, q_mode }
276 #define Mv_bnd { OP_M, v_bndmk_mode }
277 #define Mx { OP_M, x_mode }
278 #define Mxmm { OP_M, xmm_mode }
279 #define Gb { OP_G, b_mode }
280 #define Gbnd { OP_G, bnd_mode }
281 #define Gv { OP_G, v_mode }
282 #define Gd { OP_G, d_mode }
283 #define Gdq { OP_G, dq_mode }
284 #define Gm { OP_G, m_mode }
285 #define Gva { OP_G, va_mode }
286 #define Gw { OP_G, w_mode }
287 #define Rd { OP_R, d_mode }
288 #define Rdq { OP_R, dq_mode }
289 #define Rm { OP_R, m_mode }
290 #define Ib { OP_I, b_mode }
291 #define sIb { OP_sI, b_mode } /* sign extened byte */
292 #define sIbT { OP_sI, b_T_mode } /* sign extened byte like 'T' */
293 #define Iv { OP_I, v_mode }
294 #define sIv { OP_sI, v_mode }
295 #define Iq { OP_I, q_mode }
296 #define Iv64 { OP_I64, v_mode }
297 #define Iw { OP_I, w_mode }
298 #define I1 { OP_I, const_1_mode }
299 #define Jb { OP_J, b_mode }
300 #define Jv { OP_J, v_mode }
301 #define Cm { OP_C, m_mode }
302 #define Dm { OP_D, m_mode }
303 #define Td { OP_T, d_mode }
304 #define Skip_MODRM { OP_Skip_MODRM, 0 }
305
306 #define RMeAX { OP_REG, eAX_reg }
307 #define RMeBX { OP_REG, eBX_reg }
308 #define RMeCX { OP_REG, eCX_reg }
309 #define RMeDX { OP_REG, eDX_reg }
310 #define RMeSP { OP_REG, eSP_reg }
311 #define RMeBP { OP_REG, eBP_reg }
312 #define RMeSI { OP_REG, eSI_reg }
313 #define RMeDI { OP_REG, eDI_reg }
314 #define RMrAX { OP_REG, rAX_reg }
315 #define RMrBX { OP_REG, rBX_reg }
316 #define RMrCX { OP_REG, rCX_reg }
317 #define RMrDX { OP_REG, rDX_reg }
318 #define RMrSP { OP_REG, rSP_reg }
319 #define RMrBP { OP_REG, rBP_reg }
320 #define RMrSI { OP_REG, rSI_reg }
321 #define RMrDI { OP_REG, rDI_reg }
322 #define RMAL { OP_REG, al_reg }
323 #define RMCL { OP_REG, cl_reg }
324 #define RMDL { OP_REG, dl_reg }
325 #define RMBL { OP_REG, bl_reg }
326 #define RMAH { OP_REG, ah_reg }
327 #define RMCH { OP_REG, ch_reg }
328 #define RMDH { OP_REG, dh_reg }
329 #define RMBH { OP_REG, bh_reg }
330 #define RMAX { OP_REG, ax_reg }
331 #define RMDX { OP_REG, dx_reg }
332
333 #define eAX { OP_IMREG, eAX_reg }
334 #define eBX { OP_IMREG, eBX_reg }
335 #define eCX { OP_IMREG, eCX_reg }
336 #define eDX { OP_IMREG, eDX_reg }
337 #define eSP { OP_IMREG, eSP_reg }
338 #define eBP { OP_IMREG, eBP_reg }
339 #define eSI { OP_IMREG, eSI_reg }
340 #define eDI { OP_IMREG, eDI_reg }
341 #define AL { OP_IMREG, al_reg }
342 #define CL { OP_IMREG, cl_reg }
343 #define DL { OP_IMREG, dl_reg }
344 #define BL { OP_IMREG, bl_reg }
345 #define AH { OP_IMREG, ah_reg }
346 #define CH { OP_IMREG, ch_reg }
347 #define DH { OP_IMREG, dh_reg }
348 #define BH { OP_IMREG, bh_reg }
349 #define AX { OP_IMREG, ax_reg }
350 #define DX { OP_IMREG, dx_reg }
351 #define zAX { OP_IMREG, z_mode_ax_reg }
352 #define indirDX { OP_IMREG, indir_dx_reg }
353
354 #define Sw { OP_SEG, w_mode }
355 #define Sv { OP_SEG, v_mode }
356 #define Ap { OP_DIR, 0 }
357 #define Ob { OP_OFF64, b_mode }
358 #define Ov { OP_OFF64, v_mode }
359 #define Xb { OP_DSreg, eSI_reg }
360 #define Xv { OP_DSreg, eSI_reg }
361 #define Xz { OP_DSreg, eSI_reg }
362 #define Yb { OP_ESreg, eDI_reg }
363 #define Yv { OP_ESreg, eDI_reg }
364 #define DSBX { OP_DSreg, eBX_reg }
365
366 #define es { OP_REG, es_reg }
367 #define ss { OP_REG, ss_reg }
368 #define cs { OP_REG, cs_reg }
369 #define ds { OP_REG, ds_reg }
370 #define fs { OP_REG, fs_reg }
371 #define gs { OP_REG, gs_reg }
372
373 #define MX { OP_MMX, 0 }
374 #define XM { OP_XMM, 0 }
375 #define XMScalar { OP_XMM, scalar_mode }
376 #define XMGatherQ { OP_XMM, vex_vsib_q_w_dq_mode }
377 #define XMM { OP_XMM, xmm_mode }
378 #define XMxmmq { OP_XMM, xmmq_mode }
379 #define EM { OP_EM, v_mode }
380 #define EMS { OP_EM, v_swap_mode }
381 #define EMd { OP_EM, d_mode }
382 #define EMx { OP_EM, x_mode }
383 #define EXbScalar { OP_EX, b_scalar_mode }
384 #define EXw { OP_EX, w_mode }
385 #define EXwScalar { OP_EX, w_scalar_mode }
386 #define EXd { OP_EX, d_mode }
387 #define EXdScalar { OP_EX, d_scalar_mode }
388 #define EXdS { OP_EX, d_swap_mode }
389 #define EXdScalarS { OP_EX, d_scalar_swap_mode }
390 #define EXq { OP_EX, q_mode }
391 #define EXqScalar { OP_EX, q_scalar_mode }
392 #define EXqScalarS { OP_EX, q_scalar_swap_mode }
393 #define EXqS { OP_EX, q_swap_mode }
394 #define EXx { OP_EX, x_mode }
395 #define EXxS { OP_EX, x_swap_mode }
396 #define EXxmm { OP_EX, xmm_mode }
397 #define EXymm { OP_EX, ymm_mode }
398 #define EXxmmq { OP_EX, xmmq_mode }
399 #define EXEvexHalfBcstXmmq { OP_EX, evex_half_bcst_xmmq_mode }
400 #define EXxmm_mb { OP_EX, xmm_mb_mode }
401 #define EXxmm_mw { OP_EX, xmm_mw_mode }
402 #define EXxmm_md { OP_EX, xmm_md_mode }
403 #define EXxmm_mq { OP_EX, xmm_mq_mode }
404 #define EXxmm_mdq { OP_EX, xmm_mdq_mode }
405 #define EXxmmdw { OP_EX, xmmdw_mode }
406 #define EXxmmqd { OP_EX, xmmqd_mode }
407 #define EXymmq { OP_EX, ymmq_mode }
408 #define EXVexWdq { OP_EX, vex_w_dq_mode }
409 #define EXVexWdqScalar { OP_EX, vex_scalar_w_dq_mode }
410 #define EXEvexXGscat { OP_EX, evex_x_gscat_mode }
411 #define EXEvexXNoBcst { OP_EX, evex_x_nobcst_mode }
412 #define MS { OP_MS, v_mode }
413 #define XS { OP_XS, v_mode }
414 #define EMCq { OP_EMC, q_mode }
415 #define MXC { OP_MXC, 0 }
416 #define OPSUF { OP_3DNowSuffix, 0 }
417 #define CMP { CMP_Fixup, 0 }
418 #define XMM0 { XMM_Fixup, 0 }
419 #define FXSAVE { FXSAVE_Fixup, 0 }
420 #define Vex_2src_1 { OP_Vex_2src_1, 0 }
421 #define Vex_2src_2 { OP_Vex_2src_2, 0 }
422
423 #define Vex { OP_VEX, vex_mode }
424 #define VexScalar { OP_VEX, vex_scalar_mode }
425 #define VexGatherQ { OP_VEX, vex_vsib_q_w_dq_mode }
426 #define Vex128 { OP_VEX, vex128_mode }
427 #define Vex256 { OP_VEX, vex256_mode }
428 #define VexGdq { OP_VEX, dq_mode }
429 #define EXdVex { OP_EX_Vex, d_mode }
430 #define EXdVexS { OP_EX_Vex, d_swap_mode }
431 #define EXdVexScalarS { OP_EX_Vex, d_scalar_swap_mode }
432 #define EXqVex { OP_EX_Vex, q_mode }
433 #define EXqVexS { OP_EX_Vex, q_swap_mode }
434 #define EXqVexScalarS { OP_EX_Vex, q_scalar_swap_mode }
435 #define EXVexW { OP_EX_VexW, x_mode }
436 #define EXdVexW { OP_EX_VexW, d_mode }
437 #define EXqVexW { OP_EX_VexW, q_mode }
438 #define EXVexImmW { OP_EX_VexImmW, x_mode }
439 #define XMVex { OP_XMM_Vex, 0 }
440 #define XMVexScalar { OP_XMM_Vex, scalar_mode }
441 #define XMVexW { OP_XMM_VexW, 0 }
442 #define XMVexI4 { OP_REG_VexI4, x_mode }
443 #define PCLMUL { PCLMUL_Fixup, 0 }
444 #define VCMP { VCMP_Fixup, 0 }
445 #define VPCMP { VPCMP_Fixup, 0 }
446 #define VPCOM { VPCOM_Fixup, 0 }
447
448 #define EXxEVexR { OP_Rounding, evex_rounding_mode }
449 #define EXxEVexR64 { OP_Rounding, evex_rounding_64_mode }
450 #define EXxEVexS { OP_Rounding, evex_sae_mode }
451
452 #define XMask { OP_Mask, mask_mode }
453 #define MaskG { OP_G, mask_mode }
454 #define MaskE { OP_E, mask_mode }
455 #define MaskBDE { OP_E, mask_bd_mode }
456 #define MaskR { OP_R, mask_mode }
457 #define MaskVex { OP_VEX, mask_mode }
458
459 #define MVexVSIBDWpX { OP_M, vex_vsib_d_w_dq_mode }
460 #define MVexVSIBDQWpX { OP_M, vex_vsib_d_w_d_mode }
461 #define MVexVSIBQWpX { OP_M, vex_vsib_q_w_dq_mode }
462 #define MVexVSIBQDWpX { OP_M, vex_vsib_q_w_d_mode }
463
464 /* Used handle "rep" prefix for string instructions. */
465 #define Xbr { REP_Fixup, eSI_reg }
466 #define Xvr { REP_Fixup, eSI_reg }
467 #define Ybr { REP_Fixup, eDI_reg }
468 #define Yvr { REP_Fixup, eDI_reg }
469 #define Yzr { REP_Fixup, eDI_reg }
470 #define indirDXr { REP_Fixup, indir_dx_reg }
471 #define ALr { REP_Fixup, al_reg }
472 #define eAXr { REP_Fixup, eAX_reg }
473
474 /* Used handle HLE prefix for lockable instructions. */
475 #define Ebh1 { HLE_Fixup1, b_mode }
476 #define Evh1 { HLE_Fixup1, v_mode }
477 #define Ebh2 { HLE_Fixup2, b_mode }
478 #define Evh2 { HLE_Fixup2, v_mode }
479 #define Ebh3 { HLE_Fixup3, b_mode }
480 #define Evh3 { HLE_Fixup3, v_mode }
481
482 #define BND { BND_Fixup, 0 }
483 #define NOTRACK { NOTRACK_Fixup, 0 }
484
485 #define cond_jump_flag { NULL, cond_jump_mode }
486 #define loop_jcxz_flag { NULL, loop_jcxz_mode }
487
488 /* bits in sizeflag */
489 #define SUFFIX_ALWAYS 4
490 #define AFLAG 2
491 #define DFLAG 1
492
493 enum
494 {
495 /* byte operand */
496 b_mode = 1,
497 /* byte operand with operand swapped */
498 b_swap_mode,
499 /* byte operand, sign extend like 'T' suffix */
500 b_T_mode,
501 /* operand size depends on prefixes */
502 v_mode,
503 /* operand size depends on prefixes with operand swapped */
504 v_swap_mode,
505 /* operand size depends on address prefix */
506 va_mode,
507 /* word operand */
508 w_mode,
509 /* double word operand */
510 d_mode,
511 /* double word operand with operand swapped */
512 d_swap_mode,
513 /* quad word operand */
514 q_mode,
515 /* quad word operand with operand swapped */
516 q_swap_mode,
517 /* ten-byte operand */
518 t_mode,
519 /* 16-byte XMM, 32-byte YMM or 64-byte ZMM operand. In EVEX with
520 broadcast enabled. */
521 x_mode,
522 /* Similar to x_mode, but with different EVEX mem shifts. */
523 evex_x_gscat_mode,
524 /* Similar to x_mode, but with disabled broadcast. */
525 evex_x_nobcst_mode,
526 /* Similar to x_mode, but with operands swapped and disabled broadcast
527 in EVEX. */
528 x_swap_mode,
529 /* 16-byte XMM operand */
530 xmm_mode,
531 /* XMM, XMM or YMM register operand, or quad word, xmmword or ymmword
532 memory operand (depending on vector length). Broadcast isn't
533 allowed. */
534 xmmq_mode,
535 /* Same as xmmq_mode, but broadcast is allowed. */
536 evex_half_bcst_xmmq_mode,
537 /* XMM register or byte memory operand */
538 xmm_mb_mode,
539 /* XMM register or word memory operand */
540 xmm_mw_mode,
541 /* XMM register or double word memory operand */
542 xmm_md_mode,
543 /* XMM register or quad word memory operand */
544 xmm_mq_mode,
545 /* XMM register or double/quad word memory operand, depending on
546 VEX.W. */
547 xmm_mdq_mode,
548 /* 16-byte XMM, word, double word or quad word operand. */
549 xmmdw_mode,
550 /* 16-byte XMM, double word, quad word operand or xmm word operand. */
551 xmmqd_mode,
552 /* 32-byte YMM operand */
553 ymm_mode,
554 /* quad word, ymmword or zmmword memory operand. */
555 ymmq_mode,
556 /* 32-byte YMM or 16-byte word operand */
557 ymmxmm_mode,
558 /* d_mode in 32bit, q_mode in 64bit mode. */
559 m_mode,
560 /* pair of v_mode operands */
561 a_mode,
562 cond_jump_mode,
563 loop_jcxz_mode,
564 v_bnd_mode,
565 /* like v_bnd_mode in 32bit, no RIP-rel in 64bit mode. */
566 v_bndmk_mode,
567 /* operand size depends on REX prefixes. */
568 dq_mode,
569 /* registers like dq_mode, memory like w_mode. */
570 dqw_mode,
571 /* bounds operand */
572 bnd_mode,
573 /* bounds operand with operand swapped */
574 bnd_swap_mode,
575 /* 4- or 6-byte pointer operand */
576 f_mode,
577 const_1_mode,
578 /* v_mode for indirect branch opcodes. */
579 indir_v_mode,
580 /* v_mode for stack-related opcodes. */
581 stack_v_mode,
582 /* non-quad operand size depends on prefixes */
583 z_mode,
584 /* 16-byte operand */
585 o_mode,
586 /* registers like dq_mode, memory like b_mode. */
587 dqb_mode,
588 /* registers like d_mode, memory like b_mode. */
589 db_mode,
590 /* registers like d_mode, memory like w_mode. */
591 dw_mode,
592 /* registers like dq_mode, memory like d_mode. */
593 dqd_mode,
594 /* operand size depends on the W bit as well as address mode. */
595 dqa_mode,
596 /* normal vex mode */
597 vex_mode,
598 /* 128bit vex mode */
599 vex128_mode,
600 /* 256bit vex mode */
601 vex256_mode,
602 /* operand size depends on the VEX.W bit. */
603 vex_w_dq_mode,
604
605 /* Similar to vex_w_dq_mode, with VSIB dword indices. */
606 vex_vsib_d_w_dq_mode,
607 /* Similar to vex_vsib_d_w_dq_mode, with smaller memory. */
608 vex_vsib_d_w_d_mode,
609 /* Similar to vex_w_dq_mode, with VSIB qword indices. */
610 vex_vsib_q_w_dq_mode,
611 /* Similar to vex_vsib_q_w_dq_mode, with smaller memory. */
612 vex_vsib_q_w_d_mode,
613
614 /* scalar, ignore vector length. */
615 scalar_mode,
616 /* like b_mode, ignore vector length. */
617 b_scalar_mode,
618 /* like w_mode, ignore vector length. */
619 w_scalar_mode,
620 /* like d_mode, ignore vector length. */
621 d_scalar_mode,
622 /* like d_swap_mode, ignore vector length. */
623 d_scalar_swap_mode,
624 /* like q_mode, ignore vector length. */
625 q_scalar_mode,
626 /* like q_swap_mode, ignore vector length. */
627 q_scalar_swap_mode,
628 /* like vex_mode, ignore vector length. */
629 vex_scalar_mode,
630 /* like vex_w_dq_mode, ignore vector length. */
631 vex_scalar_w_dq_mode,
632
633 /* Static rounding. */
634 evex_rounding_mode,
635 /* Static rounding, 64-bit mode only. */
636 evex_rounding_64_mode,
637 /* Supress all exceptions. */
638 evex_sae_mode,
639
640 /* Mask register operand. */
641 mask_mode,
642 /* Mask register operand. */
643 mask_bd_mode,
644
645 es_reg,
646 cs_reg,
647 ss_reg,
648 ds_reg,
649 fs_reg,
650 gs_reg,
651
652 eAX_reg,
653 eCX_reg,
654 eDX_reg,
655 eBX_reg,
656 eSP_reg,
657 eBP_reg,
658 eSI_reg,
659 eDI_reg,
660
661 al_reg,
662 cl_reg,
663 dl_reg,
664 bl_reg,
665 ah_reg,
666 ch_reg,
667 dh_reg,
668 bh_reg,
669
670 ax_reg,
671 cx_reg,
672 dx_reg,
673 bx_reg,
674 sp_reg,
675 bp_reg,
676 si_reg,
677 di_reg,
678
679 rAX_reg,
680 rCX_reg,
681 rDX_reg,
682 rBX_reg,
683 rSP_reg,
684 rBP_reg,
685 rSI_reg,
686 rDI_reg,
687
688 z_mode_ax_reg,
689 indir_dx_reg
690 };
691
692 enum
693 {
694 FLOATCODE = 1,
695 USE_REG_TABLE,
696 USE_MOD_TABLE,
697 USE_RM_TABLE,
698 USE_PREFIX_TABLE,
699 USE_X86_64_TABLE,
700 USE_3BYTE_TABLE,
701 USE_XOP_8F_TABLE,
702 USE_VEX_C4_TABLE,
703 USE_VEX_C5_TABLE,
704 USE_VEX_LEN_TABLE,
705 USE_VEX_W_TABLE,
706 USE_EVEX_TABLE,
707 USE_EVEX_LEN_TABLE
708 };
709
710 #define FLOAT NULL, { { NULL, FLOATCODE } }, 0
711
712 #define DIS386(T, I) NULL, { { NULL, (T)}, { NULL, (I) } }, 0
713 #define DIS386_PREFIX(T, I, P) NULL, { { NULL, (T)}, { NULL, (I) } }, P
714 #define REG_TABLE(I) DIS386 (USE_REG_TABLE, (I))
715 #define MOD_TABLE(I) DIS386 (USE_MOD_TABLE, (I))
716 #define RM_TABLE(I) DIS386 (USE_RM_TABLE, (I))
717 #define PREFIX_TABLE(I) DIS386 (USE_PREFIX_TABLE, (I))
718 #define X86_64_TABLE(I) DIS386 (USE_X86_64_TABLE, (I))
719 #define THREE_BYTE_TABLE(I) DIS386 (USE_3BYTE_TABLE, (I))
720 #define THREE_BYTE_TABLE_PREFIX(I, P) DIS386_PREFIX (USE_3BYTE_TABLE, (I), P)
721 #define XOP_8F_TABLE(I) DIS386 (USE_XOP_8F_TABLE, (I))
722 #define VEX_C4_TABLE(I) DIS386 (USE_VEX_C4_TABLE, (I))
723 #define VEX_C5_TABLE(I) DIS386 (USE_VEX_C5_TABLE, (I))
724 #define VEX_LEN_TABLE(I) DIS386 (USE_VEX_LEN_TABLE, (I))
725 #define VEX_W_TABLE(I) DIS386 (USE_VEX_W_TABLE, (I))
726 #define EVEX_TABLE(I) DIS386 (USE_EVEX_TABLE, (I))
727 #define EVEX_LEN_TABLE(I) DIS386 (USE_EVEX_LEN_TABLE, (I))
728
729 enum
730 {
731 REG_80 = 0,
732 REG_81,
733 REG_83,
734 REG_8F,
735 REG_C0,
736 REG_C1,
737 REG_C6,
738 REG_C7,
739 REG_D0,
740 REG_D1,
741 REG_D2,
742 REG_D3,
743 REG_F6,
744 REG_F7,
745 REG_FE,
746 REG_FF,
747 REG_0F00,
748 REG_0F01,
749 REG_0F0D,
750 REG_0F18,
751 REG_0F1C_MOD_0,
752 REG_0F1E_MOD_3,
753 REG_0F71,
754 REG_0F72,
755 REG_0F73,
756 REG_0FA6,
757 REG_0FA7,
758 REG_0FAE,
759 REG_0FBA,
760 REG_0FC7,
761 REG_VEX_0F71,
762 REG_VEX_0F72,
763 REG_VEX_0F73,
764 REG_VEX_0FAE,
765 REG_VEX_0F38F3,
766 REG_XOP_LWPCB,
767 REG_XOP_LWP,
768 REG_XOP_TBM_01,
769 REG_XOP_TBM_02,
770
771 REG_EVEX_0F71,
772 REG_EVEX_0F72,
773 REG_EVEX_0F73,
774 REG_EVEX_0F38C6,
775 REG_EVEX_0F38C7
776 };
777
778 enum
779 {
780 MOD_8D = 0,
781 MOD_C6_REG_7,
782 MOD_C7_REG_7,
783 MOD_FF_REG_3,
784 MOD_FF_REG_5,
785 MOD_0F01_REG_0,
786 MOD_0F01_REG_1,
787 MOD_0F01_REG_2,
788 MOD_0F01_REG_3,
789 MOD_0F01_REG_5,
790 MOD_0F01_REG_7,
791 MOD_0F12_PREFIX_0,
792 MOD_0F13,
793 MOD_0F16_PREFIX_0,
794 MOD_0F17,
795 MOD_0F18_REG_0,
796 MOD_0F18_REG_1,
797 MOD_0F18_REG_2,
798 MOD_0F18_REG_3,
799 MOD_0F18_REG_4,
800 MOD_0F18_REG_5,
801 MOD_0F18_REG_6,
802 MOD_0F18_REG_7,
803 MOD_0F1A_PREFIX_0,
804 MOD_0F1B_PREFIX_0,
805 MOD_0F1B_PREFIX_1,
806 MOD_0F1C_PREFIX_0,
807 MOD_0F1E_PREFIX_1,
808 MOD_0F24,
809 MOD_0F26,
810 MOD_0F2B_PREFIX_0,
811 MOD_0F2B_PREFIX_1,
812 MOD_0F2B_PREFIX_2,
813 MOD_0F2B_PREFIX_3,
814 MOD_0F51,
815 MOD_0F71_REG_2,
816 MOD_0F71_REG_4,
817 MOD_0F71_REG_6,
818 MOD_0F72_REG_2,
819 MOD_0F72_REG_4,
820 MOD_0F72_REG_6,
821 MOD_0F73_REG_2,
822 MOD_0F73_REG_3,
823 MOD_0F73_REG_6,
824 MOD_0F73_REG_7,
825 MOD_0FAE_REG_0,
826 MOD_0FAE_REG_1,
827 MOD_0FAE_REG_2,
828 MOD_0FAE_REG_3,
829 MOD_0FAE_REG_4,
830 MOD_0FAE_REG_5,
831 MOD_0FAE_REG_6,
832 MOD_0FAE_REG_7,
833 MOD_0FB2,
834 MOD_0FB4,
835 MOD_0FB5,
836 MOD_0FC3,
837 MOD_0FC7_REG_3,
838 MOD_0FC7_REG_4,
839 MOD_0FC7_REG_5,
840 MOD_0FC7_REG_6,
841 MOD_0FC7_REG_7,
842 MOD_0FD7,
843 MOD_0FE7_PREFIX_2,
844 MOD_0FF0_PREFIX_3,
845 MOD_0F382A_PREFIX_2,
846 MOD_0F38F5_PREFIX_2,
847 MOD_0F38F6_PREFIX_0,
848 MOD_0F38F8_PREFIX_1,
849 MOD_0F38F8_PREFIX_2,
850 MOD_0F38F8_PREFIX_3,
851 MOD_0F38F9_PREFIX_0,
852 MOD_62_32BIT,
853 MOD_C4_32BIT,
854 MOD_C5_32BIT,
855 MOD_VEX_0F12_PREFIX_0,
856 MOD_VEX_0F13,
857 MOD_VEX_0F16_PREFIX_0,
858 MOD_VEX_0F17,
859 MOD_VEX_0F2B,
860 MOD_VEX_W_0_0F41_P_0_LEN_1,
861 MOD_VEX_W_1_0F41_P_0_LEN_1,
862 MOD_VEX_W_0_0F41_P_2_LEN_1,
863 MOD_VEX_W_1_0F41_P_2_LEN_1,
864 MOD_VEX_W_0_0F42_P_0_LEN_1,
865 MOD_VEX_W_1_0F42_P_0_LEN_1,
866 MOD_VEX_W_0_0F42_P_2_LEN_1,
867 MOD_VEX_W_1_0F42_P_2_LEN_1,
868 MOD_VEX_W_0_0F44_P_0_LEN_1,
869 MOD_VEX_W_1_0F44_P_0_LEN_1,
870 MOD_VEX_W_0_0F44_P_2_LEN_1,
871 MOD_VEX_W_1_0F44_P_2_LEN_1,
872 MOD_VEX_W_0_0F45_P_0_LEN_1,
873 MOD_VEX_W_1_0F45_P_0_LEN_1,
874 MOD_VEX_W_0_0F45_P_2_LEN_1,
875 MOD_VEX_W_1_0F45_P_2_LEN_1,
876 MOD_VEX_W_0_0F46_P_0_LEN_1,
877 MOD_VEX_W_1_0F46_P_0_LEN_1,
878 MOD_VEX_W_0_0F46_P_2_LEN_1,
879 MOD_VEX_W_1_0F46_P_2_LEN_1,
880 MOD_VEX_W_0_0F47_P_0_LEN_1,
881 MOD_VEX_W_1_0F47_P_0_LEN_1,
882 MOD_VEX_W_0_0F47_P_2_LEN_1,
883 MOD_VEX_W_1_0F47_P_2_LEN_1,
884 MOD_VEX_W_0_0F4A_P_0_LEN_1,
885 MOD_VEX_W_1_0F4A_P_0_LEN_1,
886 MOD_VEX_W_0_0F4A_P_2_LEN_1,
887 MOD_VEX_W_1_0F4A_P_2_LEN_1,
888 MOD_VEX_W_0_0F4B_P_0_LEN_1,
889 MOD_VEX_W_1_0F4B_P_0_LEN_1,
890 MOD_VEX_W_0_0F4B_P_2_LEN_1,
891 MOD_VEX_0F50,
892 MOD_VEX_0F71_REG_2,
893 MOD_VEX_0F71_REG_4,
894 MOD_VEX_0F71_REG_6,
895 MOD_VEX_0F72_REG_2,
896 MOD_VEX_0F72_REG_4,
897 MOD_VEX_0F72_REG_6,
898 MOD_VEX_0F73_REG_2,
899 MOD_VEX_0F73_REG_3,
900 MOD_VEX_0F73_REG_6,
901 MOD_VEX_0F73_REG_7,
902 MOD_VEX_W_0_0F91_P_0_LEN_0,
903 MOD_VEX_W_1_0F91_P_0_LEN_0,
904 MOD_VEX_W_0_0F91_P_2_LEN_0,
905 MOD_VEX_W_1_0F91_P_2_LEN_0,
906 MOD_VEX_W_0_0F92_P_0_LEN_0,
907 MOD_VEX_W_0_0F92_P_2_LEN_0,
908 MOD_VEX_0F92_P_3_LEN_0,
909 MOD_VEX_W_0_0F93_P_0_LEN_0,
910 MOD_VEX_W_0_0F93_P_2_LEN_0,
911 MOD_VEX_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_0F3868,
1617 PREFIX_EVEX_0F3870,
1618 PREFIX_EVEX_0F3871,
1619 PREFIX_EVEX_0F3872,
1620 PREFIX_EVEX_0F3873,
1621 PREFIX_EVEX_0F3875,
1622 PREFIX_EVEX_0F3876,
1623 PREFIX_EVEX_0F3877,
1624 PREFIX_EVEX_0F3878,
1625 PREFIX_EVEX_0F3879,
1626 PREFIX_EVEX_0F387A,
1627 PREFIX_EVEX_0F387B,
1628 PREFIX_EVEX_0F387C,
1629 PREFIX_EVEX_0F387D,
1630 PREFIX_EVEX_0F387E,
1631 PREFIX_EVEX_0F387F,
1632 PREFIX_EVEX_0F3883,
1633 PREFIX_EVEX_0F3888,
1634 PREFIX_EVEX_0F3889,
1635 PREFIX_EVEX_0F388A,
1636 PREFIX_EVEX_0F388B,
1637 PREFIX_EVEX_0F388D,
1638 PREFIX_EVEX_0F388F,
1639 PREFIX_EVEX_0F3890,
1640 PREFIX_EVEX_0F3891,
1641 PREFIX_EVEX_0F3892,
1642 PREFIX_EVEX_0F3893,
1643 PREFIX_EVEX_0F3896,
1644 PREFIX_EVEX_0F3897,
1645 PREFIX_EVEX_0F3898,
1646 PREFIX_EVEX_0F3899,
1647 PREFIX_EVEX_0F389A,
1648 PREFIX_EVEX_0F389B,
1649 PREFIX_EVEX_0F389C,
1650 PREFIX_EVEX_0F389D,
1651 PREFIX_EVEX_0F389E,
1652 PREFIX_EVEX_0F389F,
1653 PREFIX_EVEX_0F38A0,
1654 PREFIX_EVEX_0F38A1,
1655 PREFIX_EVEX_0F38A2,
1656 PREFIX_EVEX_0F38A3,
1657 PREFIX_EVEX_0F38A6,
1658 PREFIX_EVEX_0F38A7,
1659 PREFIX_EVEX_0F38A8,
1660 PREFIX_EVEX_0F38A9,
1661 PREFIX_EVEX_0F38AA,
1662 PREFIX_EVEX_0F38AB,
1663 PREFIX_EVEX_0F38AC,
1664 PREFIX_EVEX_0F38AD,
1665 PREFIX_EVEX_0F38AE,
1666 PREFIX_EVEX_0F38AF,
1667 PREFIX_EVEX_0F38B4,
1668 PREFIX_EVEX_0F38B5,
1669 PREFIX_EVEX_0F38B6,
1670 PREFIX_EVEX_0F38B7,
1671 PREFIX_EVEX_0F38B8,
1672 PREFIX_EVEX_0F38B9,
1673 PREFIX_EVEX_0F38BA,
1674 PREFIX_EVEX_0F38BB,
1675 PREFIX_EVEX_0F38BC,
1676 PREFIX_EVEX_0F38BD,
1677 PREFIX_EVEX_0F38BE,
1678 PREFIX_EVEX_0F38BF,
1679 PREFIX_EVEX_0F38C4,
1680 PREFIX_EVEX_0F38C6_REG_1,
1681 PREFIX_EVEX_0F38C6_REG_2,
1682 PREFIX_EVEX_0F38C6_REG_5,
1683 PREFIX_EVEX_0F38C6_REG_6,
1684 PREFIX_EVEX_0F38C7_REG_1,
1685 PREFIX_EVEX_0F38C7_REG_2,
1686 PREFIX_EVEX_0F38C7_REG_5,
1687 PREFIX_EVEX_0F38C7_REG_6,
1688 PREFIX_EVEX_0F38C8,
1689 PREFIX_EVEX_0F38CA,
1690 PREFIX_EVEX_0F38CB,
1691 PREFIX_EVEX_0F38CC,
1692 PREFIX_EVEX_0F38CD,
1693 PREFIX_EVEX_0F38CF,
1694 PREFIX_EVEX_0F38DC,
1695 PREFIX_EVEX_0F38DD,
1696 PREFIX_EVEX_0F38DE,
1697 PREFIX_EVEX_0F38DF,
1698
1699 PREFIX_EVEX_0F3A00,
1700 PREFIX_EVEX_0F3A01,
1701 PREFIX_EVEX_0F3A03,
1702 PREFIX_EVEX_0F3A04,
1703 PREFIX_EVEX_0F3A05,
1704 PREFIX_EVEX_0F3A08,
1705 PREFIX_EVEX_0F3A09,
1706 PREFIX_EVEX_0F3A0A,
1707 PREFIX_EVEX_0F3A0B,
1708 PREFIX_EVEX_0F3A0F,
1709 PREFIX_EVEX_0F3A14,
1710 PREFIX_EVEX_0F3A15,
1711 PREFIX_EVEX_0F3A16,
1712 PREFIX_EVEX_0F3A17,
1713 PREFIX_EVEX_0F3A18,
1714 PREFIX_EVEX_0F3A19,
1715 PREFIX_EVEX_0F3A1A,
1716 PREFIX_EVEX_0F3A1B,
1717 PREFIX_EVEX_0F3A1D,
1718 PREFIX_EVEX_0F3A1E,
1719 PREFIX_EVEX_0F3A1F,
1720 PREFIX_EVEX_0F3A20,
1721 PREFIX_EVEX_0F3A21,
1722 PREFIX_EVEX_0F3A22,
1723 PREFIX_EVEX_0F3A23,
1724 PREFIX_EVEX_0F3A25,
1725 PREFIX_EVEX_0F3A26,
1726 PREFIX_EVEX_0F3A27,
1727 PREFIX_EVEX_0F3A38,
1728 PREFIX_EVEX_0F3A39,
1729 PREFIX_EVEX_0F3A3A,
1730 PREFIX_EVEX_0F3A3B,
1731 PREFIX_EVEX_0F3A3E,
1732 PREFIX_EVEX_0F3A3F,
1733 PREFIX_EVEX_0F3A42,
1734 PREFIX_EVEX_0F3A43,
1735 PREFIX_EVEX_0F3A44,
1736 PREFIX_EVEX_0F3A50,
1737 PREFIX_EVEX_0F3A51,
1738 PREFIX_EVEX_0F3A54,
1739 PREFIX_EVEX_0F3A55,
1740 PREFIX_EVEX_0F3A56,
1741 PREFIX_EVEX_0F3A57,
1742 PREFIX_EVEX_0F3A66,
1743 PREFIX_EVEX_0F3A67,
1744 PREFIX_EVEX_0F3A70,
1745 PREFIX_EVEX_0F3A71,
1746 PREFIX_EVEX_0F3A72,
1747 PREFIX_EVEX_0F3A73,
1748 PREFIX_EVEX_0F3ACE,
1749 PREFIX_EVEX_0F3ACF
1750 };
1751
1752 enum
1753 {
1754 X86_64_06 = 0,
1755 X86_64_07,
1756 X86_64_0D,
1757 X86_64_16,
1758 X86_64_17,
1759 X86_64_1E,
1760 X86_64_1F,
1761 X86_64_27,
1762 X86_64_2F,
1763 X86_64_37,
1764 X86_64_3F,
1765 X86_64_60,
1766 X86_64_61,
1767 X86_64_62,
1768 X86_64_63,
1769 X86_64_6D,
1770 X86_64_6F,
1771 X86_64_82,
1772 X86_64_9A,
1773 X86_64_C4,
1774 X86_64_C5,
1775 X86_64_CE,
1776 X86_64_D4,
1777 X86_64_D5,
1778 X86_64_E8,
1779 X86_64_E9,
1780 X86_64_EA,
1781 X86_64_0F01_REG_0,
1782 X86_64_0F01_REG_1,
1783 X86_64_0F01_REG_2,
1784 X86_64_0F01_REG_3
1785 };
1786
1787 enum
1788 {
1789 THREE_BYTE_0F38 = 0,
1790 THREE_BYTE_0F3A
1791 };
1792
1793 enum
1794 {
1795 XOP_08 = 0,
1796 XOP_09,
1797 XOP_0A
1798 };
1799
1800 enum
1801 {
1802 VEX_0F = 0,
1803 VEX_0F38,
1804 VEX_0F3A
1805 };
1806
1807 enum
1808 {
1809 EVEX_0F = 0,
1810 EVEX_0F38,
1811 EVEX_0F3A
1812 };
1813
1814 enum
1815 {
1816 VEX_LEN_0F12_P_0_M_0 = 0,
1817 VEX_LEN_0F12_P_0_M_1,
1818 VEX_LEN_0F12_P_2,
1819 VEX_LEN_0F13_M_0,
1820 VEX_LEN_0F16_P_0_M_0,
1821 VEX_LEN_0F16_P_0_M_1,
1822 VEX_LEN_0F16_P_2,
1823 VEX_LEN_0F17_M_0,
1824 VEX_LEN_0F2A_P_1,
1825 VEX_LEN_0F2A_P_3,
1826 VEX_LEN_0F2C_P_1,
1827 VEX_LEN_0F2C_P_3,
1828 VEX_LEN_0F2D_P_1,
1829 VEX_LEN_0F2D_P_3,
1830 VEX_LEN_0F41_P_0,
1831 VEX_LEN_0F41_P_2,
1832 VEX_LEN_0F42_P_0,
1833 VEX_LEN_0F42_P_2,
1834 VEX_LEN_0F44_P_0,
1835 VEX_LEN_0F44_P_2,
1836 VEX_LEN_0F45_P_0,
1837 VEX_LEN_0F45_P_2,
1838 VEX_LEN_0F46_P_0,
1839 VEX_LEN_0F46_P_2,
1840 VEX_LEN_0F47_P_0,
1841 VEX_LEN_0F47_P_2,
1842 VEX_LEN_0F4A_P_0,
1843 VEX_LEN_0F4A_P_2,
1844 VEX_LEN_0F4B_P_0,
1845 VEX_LEN_0F4B_P_2,
1846 VEX_LEN_0F6E_P_2,
1847 VEX_LEN_0F77_P_0,
1848 VEX_LEN_0F7E_P_1,
1849 VEX_LEN_0F7E_P_2,
1850 VEX_LEN_0F90_P_0,
1851 VEX_LEN_0F90_P_2,
1852 VEX_LEN_0F91_P_0,
1853 VEX_LEN_0F91_P_2,
1854 VEX_LEN_0F92_P_0,
1855 VEX_LEN_0F92_P_2,
1856 VEX_LEN_0F92_P_3,
1857 VEX_LEN_0F93_P_0,
1858 VEX_LEN_0F93_P_2,
1859 VEX_LEN_0F93_P_3,
1860 VEX_LEN_0F98_P_0,
1861 VEX_LEN_0F98_P_2,
1862 VEX_LEN_0F99_P_0,
1863 VEX_LEN_0F99_P_2,
1864 VEX_LEN_0FAE_R_2_M_0,
1865 VEX_LEN_0FAE_R_3_M_0,
1866 VEX_LEN_0FC4_P_2,
1867 VEX_LEN_0FC5_P_2,
1868 VEX_LEN_0FD6_P_2,
1869 VEX_LEN_0FF7_P_2,
1870 VEX_LEN_0F3816_P_2,
1871 VEX_LEN_0F3819_P_2,
1872 VEX_LEN_0F381A_P_2_M_0,
1873 VEX_LEN_0F3836_P_2,
1874 VEX_LEN_0F3841_P_2,
1875 VEX_LEN_0F385A_P_2_M_0,
1876 VEX_LEN_0F38DB_P_2,
1877 VEX_LEN_0F38F2_P_0,
1878 VEX_LEN_0F38F3_R_1_P_0,
1879 VEX_LEN_0F38F3_R_2_P_0,
1880 VEX_LEN_0F38F3_R_3_P_0,
1881 VEX_LEN_0F38F5_P_0,
1882 VEX_LEN_0F38F5_P_1,
1883 VEX_LEN_0F38F5_P_3,
1884 VEX_LEN_0F38F6_P_3,
1885 VEX_LEN_0F38F7_P_0,
1886 VEX_LEN_0F38F7_P_1,
1887 VEX_LEN_0F38F7_P_2,
1888 VEX_LEN_0F38F7_P_3,
1889 VEX_LEN_0F3A00_P_2,
1890 VEX_LEN_0F3A01_P_2,
1891 VEX_LEN_0F3A06_P_2,
1892 VEX_LEN_0F3A14_P_2,
1893 VEX_LEN_0F3A15_P_2,
1894 VEX_LEN_0F3A16_P_2,
1895 VEX_LEN_0F3A17_P_2,
1896 VEX_LEN_0F3A18_P_2,
1897 VEX_LEN_0F3A19_P_2,
1898 VEX_LEN_0F3A20_P_2,
1899 VEX_LEN_0F3A21_P_2,
1900 VEX_LEN_0F3A22_P_2,
1901 VEX_LEN_0F3A30_P_2,
1902 VEX_LEN_0F3A31_P_2,
1903 VEX_LEN_0F3A32_P_2,
1904 VEX_LEN_0F3A33_P_2,
1905 VEX_LEN_0F3A38_P_2,
1906 VEX_LEN_0F3A39_P_2,
1907 VEX_LEN_0F3A41_P_2,
1908 VEX_LEN_0F3A46_P_2,
1909 VEX_LEN_0F3A60_P_2,
1910 VEX_LEN_0F3A61_P_2,
1911 VEX_LEN_0F3A62_P_2,
1912 VEX_LEN_0F3A63_P_2,
1913 VEX_LEN_0F3A6A_P_2,
1914 VEX_LEN_0F3A6B_P_2,
1915 VEX_LEN_0F3A6E_P_2,
1916 VEX_LEN_0F3A6F_P_2,
1917 VEX_LEN_0F3A7A_P_2,
1918 VEX_LEN_0F3A7B_P_2,
1919 VEX_LEN_0F3A7E_P_2,
1920 VEX_LEN_0F3A7F_P_2,
1921 VEX_LEN_0F3ADF_P_2,
1922 VEX_LEN_0F3AF0_P_3,
1923 VEX_LEN_0FXOP_08_CC,
1924 VEX_LEN_0FXOP_08_CD,
1925 VEX_LEN_0FXOP_08_CE,
1926 VEX_LEN_0FXOP_08_CF,
1927 VEX_LEN_0FXOP_08_EC,
1928 VEX_LEN_0FXOP_08_ED,
1929 VEX_LEN_0FXOP_08_EE,
1930 VEX_LEN_0FXOP_08_EF,
1931 VEX_LEN_0FXOP_09_80,
1932 VEX_LEN_0FXOP_09_81
1933 };
1934
1935 enum
1936 {
1937 EVEX_LEN_0F6E_P_2 = 0,
1938 EVEX_LEN_0F7E_P_1,
1939 EVEX_LEN_0F7E_P_2,
1940 EVEX_LEN_0FD6_P_2,
1941 EVEX_LEN_0F3819_P_2_W_0,
1942 EVEX_LEN_0F3819_P_2_W_1,
1943 EVEX_LEN_0F381A_P_2_W_0,
1944 EVEX_LEN_0F381A_P_2_W_1,
1945 EVEX_LEN_0F381B_P_2_W_0,
1946 EVEX_LEN_0F381B_P_2_W_1,
1947 EVEX_LEN_0F385A_P_2_W_0,
1948 EVEX_LEN_0F385A_P_2_W_1,
1949 EVEX_LEN_0F385B_P_2_W_0,
1950 EVEX_LEN_0F385B_P_2_W_1,
1951 EVEX_LEN_0F3A18_P_2_W_0,
1952 EVEX_LEN_0F3A18_P_2_W_1,
1953 EVEX_LEN_0F3A19_P_2_W_0,
1954 EVEX_LEN_0F3A19_P_2_W_1,
1955 EVEX_LEN_0F3A1A_P_2_W_0,
1956 EVEX_LEN_0F3A1A_P_2_W_1,
1957 EVEX_LEN_0F3A1B_P_2_W_0,
1958 EVEX_LEN_0F3A1B_P_2_W_1,
1959 EVEX_LEN_0F3A23_P_2_W_0,
1960 EVEX_LEN_0F3A23_P_2_W_1,
1961 EVEX_LEN_0F3A38_P_2_W_0,
1962 EVEX_LEN_0F3A38_P_2_W_1,
1963 EVEX_LEN_0F3A39_P_2_W_0,
1964 EVEX_LEN_0F3A39_P_2_W_1,
1965 EVEX_LEN_0F3A3A_P_2_W_0,
1966 EVEX_LEN_0F3A3A_P_2_W_1,
1967 EVEX_LEN_0F3A3B_P_2_W_0,
1968 EVEX_LEN_0F3A3B_P_2_W_1,
1969 EVEX_LEN_0F3A43_P_2_W_0,
1970 EVEX_LEN_0F3A43_P_2_W_1
1971 };
1972
1973 enum
1974 {
1975 VEX_W_0F41_P_0_LEN_1 = 0,
1976 VEX_W_0F41_P_2_LEN_1,
1977 VEX_W_0F42_P_0_LEN_1,
1978 VEX_W_0F42_P_2_LEN_1,
1979 VEX_W_0F44_P_0_LEN_0,
1980 VEX_W_0F44_P_2_LEN_0,
1981 VEX_W_0F45_P_0_LEN_1,
1982 VEX_W_0F45_P_2_LEN_1,
1983 VEX_W_0F46_P_0_LEN_1,
1984 VEX_W_0F46_P_2_LEN_1,
1985 VEX_W_0F47_P_0_LEN_1,
1986 VEX_W_0F47_P_2_LEN_1,
1987 VEX_W_0F4A_P_0_LEN_1,
1988 VEX_W_0F4A_P_2_LEN_1,
1989 VEX_W_0F4B_P_0_LEN_1,
1990 VEX_W_0F4B_P_2_LEN_1,
1991 VEX_W_0F90_P_0_LEN_0,
1992 VEX_W_0F90_P_2_LEN_0,
1993 VEX_W_0F91_P_0_LEN_0,
1994 VEX_W_0F91_P_2_LEN_0,
1995 VEX_W_0F92_P_0_LEN_0,
1996 VEX_W_0F92_P_2_LEN_0,
1997 VEX_W_0F93_P_0_LEN_0,
1998 VEX_W_0F93_P_2_LEN_0,
1999 VEX_W_0F98_P_0_LEN_0,
2000 VEX_W_0F98_P_2_LEN_0,
2001 VEX_W_0F99_P_0_LEN_0,
2002 VEX_W_0F99_P_2_LEN_0,
2003 VEX_W_0F380C_P_2,
2004 VEX_W_0F380D_P_2,
2005 VEX_W_0F380E_P_2,
2006 VEX_W_0F380F_P_2,
2007 VEX_W_0F3816_P_2,
2008 VEX_W_0F3818_P_2,
2009 VEX_W_0F3819_P_2,
2010 VEX_W_0F381A_P_2_M_0,
2011 VEX_W_0F382C_P_2_M_0,
2012 VEX_W_0F382D_P_2_M_0,
2013 VEX_W_0F382E_P_2_M_0,
2014 VEX_W_0F382F_P_2_M_0,
2015 VEX_W_0F3836_P_2,
2016 VEX_W_0F3846_P_2,
2017 VEX_W_0F3858_P_2,
2018 VEX_W_0F3859_P_2,
2019 VEX_W_0F385A_P_2_M_0,
2020 VEX_W_0F3878_P_2,
2021 VEX_W_0F3879_P_2,
2022 VEX_W_0F38CF_P_2,
2023 VEX_W_0F3A00_P_2,
2024 VEX_W_0F3A01_P_2,
2025 VEX_W_0F3A02_P_2,
2026 VEX_W_0F3A04_P_2,
2027 VEX_W_0F3A05_P_2,
2028 VEX_W_0F3A06_P_2,
2029 VEX_W_0F3A18_P_2,
2030 VEX_W_0F3A19_P_2,
2031 VEX_W_0F3A30_P_2_LEN_0,
2032 VEX_W_0F3A31_P_2_LEN_0,
2033 VEX_W_0F3A32_P_2_LEN_0,
2034 VEX_W_0F3A33_P_2_LEN_0,
2035 VEX_W_0F3A38_P_2,
2036 VEX_W_0F3A39_P_2,
2037 VEX_W_0F3A46_P_2,
2038 VEX_W_0F3A48_P_2,
2039 VEX_W_0F3A49_P_2,
2040 VEX_W_0F3A4A_P_2,
2041 VEX_W_0F3A4B_P_2,
2042 VEX_W_0F3A4C_P_2,
2043 VEX_W_0F3ACE_P_2,
2044 VEX_W_0F3ACF_P_2,
2045
2046 EVEX_W_0F10_P_0,
2047 EVEX_W_0F10_P_1_M_0,
2048 EVEX_W_0F10_P_1_M_1,
2049 EVEX_W_0F10_P_2,
2050 EVEX_W_0F10_P_3_M_0,
2051 EVEX_W_0F10_P_3_M_1,
2052 EVEX_W_0F11_P_0,
2053 EVEX_W_0F11_P_1_M_0,
2054 EVEX_W_0F11_P_1_M_1,
2055 EVEX_W_0F11_P_2,
2056 EVEX_W_0F11_P_3_M_0,
2057 EVEX_W_0F11_P_3_M_1,
2058 EVEX_W_0F12_P_0_M_0,
2059 EVEX_W_0F12_P_0_M_1,
2060 EVEX_W_0F12_P_1,
2061 EVEX_W_0F12_P_2,
2062 EVEX_W_0F12_P_3,
2063 EVEX_W_0F13_P_0,
2064 EVEX_W_0F13_P_2,
2065 EVEX_W_0F14_P_0,
2066 EVEX_W_0F14_P_2,
2067 EVEX_W_0F15_P_0,
2068 EVEX_W_0F15_P_2,
2069 EVEX_W_0F16_P_0_M_0,
2070 EVEX_W_0F16_P_0_M_1,
2071 EVEX_W_0F16_P_1,
2072 EVEX_W_0F16_P_2,
2073 EVEX_W_0F17_P_0,
2074 EVEX_W_0F17_P_2,
2075 EVEX_W_0F28_P_0,
2076 EVEX_W_0F28_P_2,
2077 EVEX_W_0F29_P_0,
2078 EVEX_W_0F29_P_2,
2079 EVEX_W_0F2A_P_1,
2080 EVEX_W_0F2A_P_3,
2081 EVEX_W_0F2B_P_0,
2082 EVEX_W_0F2B_P_2,
2083 EVEX_W_0F2E_P_0,
2084 EVEX_W_0F2E_P_2,
2085 EVEX_W_0F2F_P_0,
2086 EVEX_W_0F2F_P_2,
2087 EVEX_W_0F51_P_0,
2088 EVEX_W_0F51_P_1,
2089 EVEX_W_0F51_P_2,
2090 EVEX_W_0F51_P_3,
2091 EVEX_W_0F54_P_0,
2092 EVEX_W_0F54_P_2,
2093 EVEX_W_0F55_P_0,
2094 EVEX_W_0F55_P_2,
2095 EVEX_W_0F56_P_0,
2096 EVEX_W_0F56_P_2,
2097 EVEX_W_0F57_P_0,
2098 EVEX_W_0F57_P_2,
2099 EVEX_W_0F58_P_0,
2100 EVEX_W_0F58_P_1,
2101 EVEX_W_0F58_P_2,
2102 EVEX_W_0F58_P_3,
2103 EVEX_W_0F59_P_0,
2104 EVEX_W_0F59_P_1,
2105 EVEX_W_0F59_P_2,
2106 EVEX_W_0F59_P_3,
2107 EVEX_W_0F5A_P_0,
2108 EVEX_W_0F5A_P_1,
2109 EVEX_W_0F5A_P_2,
2110 EVEX_W_0F5A_P_3,
2111 EVEX_W_0F5B_P_0,
2112 EVEX_W_0F5B_P_1,
2113 EVEX_W_0F5B_P_2,
2114 EVEX_W_0F5C_P_0,
2115 EVEX_W_0F5C_P_1,
2116 EVEX_W_0F5C_P_2,
2117 EVEX_W_0F5C_P_3,
2118 EVEX_W_0F5D_P_0,
2119 EVEX_W_0F5D_P_1,
2120 EVEX_W_0F5D_P_2,
2121 EVEX_W_0F5D_P_3,
2122 EVEX_W_0F5E_P_0,
2123 EVEX_W_0F5E_P_1,
2124 EVEX_W_0F5E_P_2,
2125 EVEX_W_0F5E_P_3,
2126 EVEX_W_0F5F_P_0,
2127 EVEX_W_0F5F_P_1,
2128 EVEX_W_0F5F_P_2,
2129 EVEX_W_0F5F_P_3,
2130 EVEX_W_0F62_P_2,
2131 EVEX_W_0F66_P_2,
2132 EVEX_W_0F6A_P_2,
2133 EVEX_W_0F6B_P_2,
2134 EVEX_W_0F6C_P_2,
2135 EVEX_W_0F6D_P_2,
2136 EVEX_W_0F6F_P_1,
2137 EVEX_W_0F6F_P_2,
2138 EVEX_W_0F6F_P_3,
2139 EVEX_W_0F70_P_2,
2140 EVEX_W_0F72_R_2_P_2,
2141 EVEX_W_0F72_R_6_P_2,
2142 EVEX_W_0F73_R_2_P_2,
2143 EVEX_W_0F73_R_6_P_2,
2144 EVEX_W_0F76_P_2,
2145 EVEX_W_0F78_P_0,
2146 EVEX_W_0F78_P_2,
2147 EVEX_W_0F79_P_0,
2148 EVEX_W_0F79_P_2,
2149 EVEX_W_0F7A_P_1,
2150 EVEX_W_0F7A_P_2,
2151 EVEX_W_0F7A_P_3,
2152 EVEX_W_0F7B_P_1,
2153 EVEX_W_0F7B_P_2,
2154 EVEX_W_0F7B_P_3,
2155 EVEX_W_0F7E_P_1,
2156 EVEX_W_0F7F_P_1,
2157 EVEX_W_0F7F_P_2,
2158 EVEX_W_0F7F_P_3,
2159 EVEX_W_0FC2_P_0,
2160 EVEX_W_0FC2_P_1,
2161 EVEX_W_0FC2_P_2,
2162 EVEX_W_0FC2_P_3,
2163 EVEX_W_0FC6_P_0,
2164 EVEX_W_0FC6_P_2,
2165 EVEX_W_0FD2_P_2,
2166 EVEX_W_0FD3_P_2,
2167 EVEX_W_0FD4_P_2,
2168 EVEX_W_0FD6_P_2,
2169 EVEX_W_0FE6_P_1,
2170 EVEX_W_0FE6_P_2,
2171 EVEX_W_0FE6_P_3,
2172 EVEX_W_0FE7_P_2,
2173 EVEX_W_0FF2_P_2,
2174 EVEX_W_0FF3_P_2,
2175 EVEX_W_0FF4_P_2,
2176 EVEX_W_0FFA_P_2,
2177 EVEX_W_0FFB_P_2,
2178 EVEX_W_0FFE_P_2,
2179 EVEX_W_0F380C_P_2,
2180 EVEX_W_0F380D_P_2,
2181 EVEX_W_0F3810_P_1,
2182 EVEX_W_0F3810_P_2,
2183 EVEX_W_0F3811_P_1,
2184 EVEX_W_0F3811_P_2,
2185 EVEX_W_0F3812_P_1,
2186 EVEX_W_0F3812_P_2,
2187 EVEX_W_0F3813_P_1,
2188 EVEX_W_0F3813_P_2,
2189 EVEX_W_0F3814_P_1,
2190 EVEX_W_0F3815_P_1,
2191 EVEX_W_0F3818_P_2,
2192 EVEX_W_0F3819_P_2,
2193 EVEX_W_0F381A_P_2,
2194 EVEX_W_0F381B_P_2,
2195 EVEX_W_0F381E_P_2,
2196 EVEX_W_0F381F_P_2,
2197 EVEX_W_0F3820_P_1,
2198 EVEX_W_0F3821_P_1,
2199 EVEX_W_0F3822_P_1,
2200 EVEX_W_0F3823_P_1,
2201 EVEX_W_0F3824_P_1,
2202 EVEX_W_0F3825_P_1,
2203 EVEX_W_0F3825_P_2,
2204 EVEX_W_0F3826_P_1,
2205 EVEX_W_0F3826_P_2,
2206 EVEX_W_0F3828_P_1,
2207 EVEX_W_0F3828_P_2,
2208 EVEX_W_0F3829_P_1,
2209 EVEX_W_0F3829_P_2,
2210 EVEX_W_0F382A_P_1,
2211 EVEX_W_0F382A_P_2,
2212 EVEX_W_0F382B_P_2,
2213 EVEX_W_0F3830_P_1,
2214 EVEX_W_0F3831_P_1,
2215 EVEX_W_0F3832_P_1,
2216 EVEX_W_0F3833_P_1,
2217 EVEX_W_0F3834_P_1,
2218 EVEX_W_0F3835_P_1,
2219 EVEX_W_0F3835_P_2,
2220 EVEX_W_0F3837_P_2,
2221 EVEX_W_0F3838_P_1,
2222 EVEX_W_0F3839_P_1,
2223 EVEX_W_0F383A_P_1,
2224 EVEX_W_0F3840_P_2,
2225 EVEX_W_0F3852_P_1,
2226 EVEX_W_0F3854_P_2,
2227 EVEX_W_0F3855_P_2,
2228 EVEX_W_0F3858_P_2,
2229 EVEX_W_0F3859_P_2,
2230 EVEX_W_0F385A_P_2,
2231 EVEX_W_0F385B_P_2,
2232 EVEX_W_0F3862_P_2,
2233 EVEX_W_0F3863_P_2,
2234 EVEX_W_0F3866_P_2,
2235 EVEX_W_0F3868_P_3,
2236 EVEX_W_0F3870_P_2,
2237 EVEX_W_0F3871_P_2,
2238 EVEX_W_0F3872_P_1,
2239 EVEX_W_0F3872_P_2,
2240 EVEX_W_0F3872_P_3,
2241 EVEX_W_0F3873_P_2,
2242 EVEX_W_0F3875_P_2,
2243 EVEX_W_0F3878_P_2,
2244 EVEX_W_0F3879_P_2,
2245 EVEX_W_0F387A_P_2,
2246 EVEX_W_0F387B_P_2,
2247 EVEX_W_0F387D_P_2,
2248 EVEX_W_0F3883_P_2,
2249 EVEX_W_0F388D_P_2,
2250 EVEX_W_0F3891_P_2,
2251 EVEX_W_0F3893_P_2,
2252 EVEX_W_0F38A1_P_2,
2253 EVEX_W_0F38A3_P_2,
2254 EVEX_W_0F38C7_R_1_P_2,
2255 EVEX_W_0F38C7_R_2_P_2,
2256 EVEX_W_0F38C7_R_5_P_2,
2257 EVEX_W_0F38C7_R_6_P_2,
2258
2259 EVEX_W_0F3A00_P_2,
2260 EVEX_W_0F3A01_P_2,
2261 EVEX_W_0F3A04_P_2,
2262 EVEX_W_0F3A05_P_2,
2263 EVEX_W_0F3A08_P_2,
2264 EVEX_W_0F3A09_P_2,
2265 EVEX_W_0F3A0A_P_2,
2266 EVEX_W_0F3A0B_P_2,
2267 EVEX_W_0F3A18_P_2,
2268 EVEX_W_0F3A19_P_2,
2269 EVEX_W_0F3A1A_P_2,
2270 EVEX_W_0F3A1B_P_2,
2271 EVEX_W_0F3A1D_P_2,
2272 EVEX_W_0F3A21_P_2,
2273 EVEX_W_0F3A23_P_2,
2274 EVEX_W_0F3A38_P_2,
2275 EVEX_W_0F3A39_P_2,
2276 EVEX_W_0F3A3A_P_2,
2277 EVEX_W_0F3A3B_P_2,
2278 EVEX_W_0F3A3E_P_2,
2279 EVEX_W_0F3A3F_P_2,
2280 EVEX_W_0F3A42_P_2,
2281 EVEX_W_0F3A43_P_2,
2282 EVEX_W_0F3A50_P_2,
2283 EVEX_W_0F3A51_P_2,
2284 EVEX_W_0F3A56_P_2,
2285 EVEX_W_0F3A57_P_2,
2286 EVEX_W_0F3A66_P_2,
2287 EVEX_W_0F3A67_P_2,
2288 EVEX_W_0F3A70_P_2,
2289 EVEX_W_0F3A71_P_2,
2290 EVEX_W_0F3A72_P_2,
2291 EVEX_W_0F3A73_P_2,
2292 EVEX_W_0F3ACE_P_2,
2293 EVEX_W_0F3ACF_P_2
2294 };
2295
2296 typedef void (*op_rtn) (int bytemode, int sizeflag);
2297
2298 struct dis386 {
2299 const char *name;
2300 struct
2301 {
2302 op_rtn rtn;
2303 int bytemode;
2304 } op[MAX_OPERANDS];
2305 unsigned int prefix_requirement;
2306 };
2307
2308 /* Upper case letters in the instruction names here are macros.
2309 'A' => print 'b' if no register operands or suffix_always is true
2310 'B' => print 'b' if suffix_always is true
2311 'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
2312 size prefix
2313 'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
2314 suffix_always is true
2315 'E' => print 'e' if 32-bit form of jcxz
2316 'F' => print 'w' or 'l' depending on address size prefix (loop insns)
2317 'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
2318 'H' => print ",pt" or ",pn" branch hint
2319 'I' => honor following macro letter even in Intel mode (implemented only
2320 for some of the macro letters)
2321 'J' => print 'l'
2322 'K' => print 'd' or 'q' if rex prefix is present.
2323 'L' => print 'l' if suffix_always is true
2324 'M' => print 'r' if intel_mnemonic is false.
2325 'N' => print 'n' if instruction has no wait "prefix"
2326 'O' => print 'd' or 'o' (or 'q' in Intel mode)
2327 'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix,
2328 or suffix_always is true. print 'q' if rex prefix is present.
2329 'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
2330 is true
2331 'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
2332 'S' => print 'w', 'l' or 'q' if suffix_always is true
2333 'T' => print 'q' in 64bit mode if instruction has no operand size
2334 prefix and behave as 'P' otherwise
2335 'U' => print 'q' in 64bit mode if instruction has no operand size
2336 prefix and behave as 'Q' otherwise
2337 'V' => print 'q' in 64bit mode if instruction has no operand size
2338 prefix and behave as 'S' otherwise
2339 'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
2340 'X' => print 's', 'd' depending on data16 prefix (for XMM)
2341 'Y' unused.
2342 'Z' => print 'q' in 64bit mode and behave as 'L' otherwise
2343 '!' => change condition from true to false or from false to true.
2344 '%' => add 1 upper case letter to the macro.
2345 '^' => print 'w' or 'l' depending on operand size prefix or
2346 suffix_always is true (lcall/ljmp).
2347 '@' => print 'q' for Intel64 ISA, 'w' or 'q' for AMD64 ISA depending
2348 on operand size prefix.
2349 '&' => print 'q' in 64bit mode for Intel64 ISA or if instruction
2350 has no operand size prefix for AMD64 ISA, behave as 'P'
2351 otherwise
2352
2353 2 upper case letter macros:
2354 "XY" => print 'x' or 'y' if suffix_always is true or no register
2355 operands and no broadcast.
2356 "XZ" => print 'x', 'y', or 'z' if suffix_always is true or no
2357 register operands and no broadcast.
2358 "XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
2359 "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand
2360 or suffix_always is true
2361 "LB" => print "abs" in 64bit mode and behave as 'B' otherwise
2362 "LS" => print "abs" in 64bit mode and behave as 'S' otherwise
2363 "LV" => print "abs" for 64bit operand and behave as 'S' otherwise
2364 "LW" => print 'd', 'q' depending on the VEX.W bit
2365 "LP" => print 'w' or 'l' ('d' in Intel mode) if instruction has
2366 an operand size prefix, or suffix_always is true. print
2367 'q' if rex prefix is present.
2368
2369 Many of the above letters print nothing in Intel mode. See "putop"
2370 for the details.
2371
2372 Braces '{' and '}', and vertical bars '|', indicate alternative
2373 mnemonic strings for AT&T and Intel. */
2374
2375 static const struct dis386 dis386[] = {
2376 /* 00 */
2377 { "addB", { Ebh1, Gb }, 0 },
2378 { "addS", { Evh1, Gv }, 0 },
2379 { "addB", { Gb, EbS }, 0 },
2380 { "addS", { Gv, EvS }, 0 },
2381 { "addB", { AL, Ib }, 0 },
2382 { "addS", { eAX, Iv }, 0 },
2383 { X86_64_TABLE (X86_64_06) },
2384 { X86_64_TABLE (X86_64_07) },
2385 /* 08 */
2386 { "orB", { Ebh1, Gb }, 0 },
2387 { "orS", { Evh1, Gv }, 0 },
2388 { "orB", { Gb, EbS }, 0 },
2389 { "orS", { Gv, EvS }, 0 },
2390 { "orB", { AL, Ib }, 0 },
2391 { "orS", { eAX, Iv }, 0 },
2392 { X86_64_TABLE (X86_64_0D) },
2393 { Bad_Opcode }, /* 0x0f extended opcode escape */
2394 /* 10 */
2395 { "adcB", { Ebh1, Gb }, 0 },
2396 { "adcS", { Evh1, Gv }, 0 },
2397 { "adcB", { Gb, EbS }, 0 },
2398 { "adcS", { Gv, EvS }, 0 },
2399 { "adcB", { AL, Ib }, 0 },
2400 { "adcS", { eAX, Iv }, 0 },
2401 { X86_64_TABLE (X86_64_16) },
2402 { X86_64_TABLE (X86_64_17) },
2403 /* 18 */
2404 { "sbbB", { Ebh1, Gb }, 0 },
2405 { "sbbS", { Evh1, Gv }, 0 },
2406 { "sbbB", { Gb, EbS }, 0 },
2407 { "sbbS", { Gv, EvS }, 0 },
2408 { "sbbB", { AL, Ib }, 0 },
2409 { "sbbS", { eAX, Iv }, 0 },
2410 { X86_64_TABLE (X86_64_1E) },
2411 { X86_64_TABLE (X86_64_1F) },
2412 /* 20 */
2413 { "andB", { Ebh1, Gb }, 0 },
2414 { "andS", { Evh1, Gv }, 0 },
2415 { "andB", { Gb, EbS }, 0 },
2416 { "andS", { Gv, EvS }, 0 },
2417 { "andB", { AL, Ib }, 0 },
2418 { "andS", { eAX, Iv }, 0 },
2419 { Bad_Opcode }, /* SEG ES prefix */
2420 { X86_64_TABLE (X86_64_27) },
2421 /* 28 */
2422 { "subB", { Ebh1, Gb }, 0 },
2423 { "subS", { Evh1, Gv }, 0 },
2424 { "subB", { Gb, EbS }, 0 },
2425 { "subS", { Gv, EvS }, 0 },
2426 { "subB", { AL, Ib }, 0 },
2427 { "subS", { eAX, Iv }, 0 },
2428 { Bad_Opcode }, /* SEG CS prefix */
2429 { X86_64_TABLE (X86_64_2F) },
2430 /* 30 */
2431 { "xorB", { Ebh1, Gb }, 0 },
2432 { "xorS", { Evh1, Gv }, 0 },
2433 { "xorB", { Gb, EbS }, 0 },
2434 { "xorS", { Gv, EvS }, 0 },
2435 { "xorB", { AL, Ib }, 0 },
2436 { "xorS", { eAX, Iv }, 0 },
2437 { Bad_Opcode }, /* SEG SS prefix */
2438 { X86_64_TABLE (X86_64_37) },
2439 /* 38 */
2440 { "cmpB", { Eb, Gb }, 0 },
2441 { "cmpS", { Ev, Gv }, 0 },
2442 { "cmpB", { Gb, EbS }, 0 },
2443 { "cmpS", { Gv, EvS }, 0 },
2444 { "cmpB", { AL, Ib }, 0 },
2445 { "cmpS", { eAX, Iv }, 0 },
2446 { Bad_Opcode }, /* SEG DS prefix */
2447 { X86_64_TABLE (X86_64_3F) },
2448 /* 40 */
2449 { "inc{S|}", { RMeAX }, 0 },
2450 { "inc{S|}", { RMeCX }, 0 },
2451 { "inc{S|}", { RMeDX }, 0 },
2452 { "inc{S|}", { RMeBX }, 0 },
2453 { "inc{S|}", { RMeSP }, 0 },
2454 { "inc{S|}", { RMeBP }, 0 },
2455 { "inc{S|}", { RMeSI }, 0 },
2456 { "inc{S|}", { RMeDI }, 0 },
2457 /* 48 */
2458 { "dec{S|}", { RMeAX }, 0 },
2459 { "dec{S|}", { RMeCX }, 0 },
2460 { "dec{S|}", { RMeDX }, 0 },
2461 { "dec{S|}", { RMeBX }, 0 },
2462 { "dec{S|}", { RMeSP }, 0 },
2463 { "dec{S|}", { RMeBP }, 0 },
2464 { "dec{S|}", { RMeSI }, 0 },
2465 { "dec{S|}", { RMeDI }, 0 },
2466 /* 50 */
2467 { "pushV", { RMrAX }, 0 },
2468 { "pushV", { RMrCX }, 0 },
2469 { "pushV", { RMrDX }, 0 },
2470 { "pushV", { RMrBX }, 0 },
2471 { "pushV", { RMrSP }, 0 },
2472 { "pushV", { RMrBP }, 0 },
2473 { "pushV", { RMrSI }, 0 },
2474 { "pushV", { RMrDI }, 0 },
2475 /* 58 */
2476 { "popV", { RMrAX }, 0 },
2477 { "popV", { RMrCX }, 0 },
2478 { "popV", { RMrDX }, 0 },
2479 { "popV", { RMrBX }, 0 },
2480 { "popV", { RMrSP }, 0 },
2481 { "popV", { RMrBP }, 0 },
2482 { "popV", { RMrSI }, 0 },
2483 { "popV", { RMrDI }, 0 },
2484 /* 60 */
2485 { X86_64_TABLE (X86_64_60) },
2486 { X86_64_TABLE (X86_64_61) },
2487 { X86_64_TABLE (X86_64_62) },
2488 { X86_64_TABLE (X86_64_63) },
2489 { Bad_Opcode }, /* seg fs */
2490 { Bad_Opcode }, /* seg gs */
2491 { Bad_Opcode }, /* op size prefix */
2492 { Bad_Opcode }, /* adr size prefix */
2493 /* 68 */
2494 { "pushT", { sIv }, 0 },
2495 { "imulS", { Gv, Ev, Iv }, 0 },
2496 { "pushT", { sIbT }, 0 },
2497 { "imulS", { Gv, Ev, sIb }, 0 },
2498 { "ins{b|}", { Ybr, indirDX }, 0 },
2499 { X86_64_TABLE (X86_64_6D) },
2500 { "outs{b|}", { indirDXr, Xb }, 0 },
2501 { X86_64_TABLE (X86_64_6F) },
2502 /* 70 */
2503 { "joH", { Jb, BND, cond_jump_flag }, 0 },
2504 { "jnoH", { Jb, BND, cond_jump_flag }, 0 },
2505 { "jbH", { Jb, BND, cond_jump_flag }, 0 },
2506 { "jaeH", { Jb, BND, cond_jump_flag }, 0 },
2507 { "jeH", { Jb, BND, cond_jump_flag }, 0 },
2508 { "jneH", { Jb, BND, cond_jump_flag }, 0 },
2509 { "jbeH", { Jb, BND, cond_jump_flag }, 0 },
2510 { "jaH", { Jb, BND, cond_jump_flag }, 0 },
2511 /* 78 */
2512 { "jsH", { Jb, BND, cond_jump_flag }, 0 },
2513 { "jnsH", { Jb, BND, cond_jump_flag }, 0 },
2514 { "jpH", { Jb, BND, cond_jump_flag }, 0 },
2515 { "jnpH", { Jb, BND, cond_jump_flag }, 0 },
2516 { "jlH", { Jb, BND, cond_jump_flag }, 0 },
2517 { "jgeH", { Jb, BND, cond_jump_flag }, 0 },
2518 { "jleH", { Jb, BND, cond_jump_flag }, 0 },
2519 { "jgH", { Jb, BND, cond_jump_flag }, 0 },
2520 /* 80 */
2521 { REG_TABLE (REG_80) },
2522 { REG_TABLE (REG_81) },
2523 { X86_64_TABLE (X86_64_82) },
2524 { REG_TABLE (REG_83) },
2525 { "testB", { Eb, Gb }, 0 },
2526 { "testS", { Ev, Gv }, 0 },
2527 { "xchgB", { Ebh2, Gb }, 0 },
2528 { "xchgS", { Evh2, Gv }, 0 },
2529 /* 88 */
2530 { "movB", { Ebh3, Gb }, 0 },
2531 { "movS", { Evh3, Gv }, 0 },
2532 { "movB", { Gb, EbS }, 0 },
2533 { "movS", { Gv, EvS }, 0 },
2534 { "movD", { Sv, Sw }, 0 },
2535 { MOD_TABLE (MOD_8D) },
2536 { "movD", { Sw, Sv }, 0 },
2537 { REG_TABLE (REG_8F) },
2538 /* 90 */
2539 { PREFIX_TABLE (PREFIX_90) },
2540 { "xchgS", { RMeCX, eAX }, 0 },
2541 { "xchgS", { RMeDX, eAX }, 0 },
2542 { "xchgS", { RMeBX, eAX }, 0 },
2543 { "xchgS", { RMeSP, eAX }, 0 },
2544 { "xchgS", { RMeBP, eAX }, 0 },
2545 { "xchgS", { RMeSI, eAX }, 0 },
2546 { "xchgS", { RMeDI, eAX }, 0 },
2547 /* 98 */
2548 { "cW{t|}R", { XX }, 0 },
2549 { "cR{t|}O", { XX }, 0 },
2550 { X86_64_TABLE (X86_64_9A) },
2551 { Bad_Opcode }, /* fwait */
2552 { "pushfT", { XX }, 0 },
2553 { "popfT", { XX }, 0 },
2554 { "sahf", { XX }, 0 },
2555 { "lahf", { XX }, 0 },
2556 /* a0 */
2557 { "mov%LB", { AL, Ob }, 0 },
2558 { "mov%LS", { eAX, Ov }, 0 },
2559 { "mov%LB", { Ob, AL }, 0 },
2560 { "mov%LS", { Ov, eAX }, 0 },
2561 { "movs{b|}", { Ybr, Xb }, 0 },
2562 { "movs{R|}", { Yvr, Xv }, 0 },
2563 { "cmps{b|}", { Xb, Yb }, 0 },
2564 { "cmps{R|}", { Xv, Yv }, 0 },
2565 /* a8 */
2566 { "testB", { AL, Ib }, 0 },
2567 { "testS", { eAX, Iv }, 0 },
2568 { "stosB", { Ybr, AL }, 0 },
2569 { "stosS", { Yvr, eAX }, 0 },
2570 { "lodsB", { ALr, Xb }, 0 },
2571 { "lodsS", { eAXr, Xv }, 0 },
2572 { "scasB", { AL, Yb }, 0 },
2573 { "scasS", { eAX, Yv }, 0 },
2574 /* b0 */
2575 { "movB", { RMAL, Ib }, 0 },
2576 { "movB", { RMCL, Ib }, 0 },
2577 { "movB", { RMDL, Ib }, 0 },
2578 { "movB", { RMBL, Ib }, 0 },
2579 { "movB", { RMAH, Ib }, 0 },
2580 { "movB", { RMCH, Ib }, 0 },
2581 { "movB", { RMDH, Ib }, 0 },
2582 { "movB", { RMBH, Ib }, 0 },
2583 /* b8 */
2584 { "mov%LV", { RMeAX, Iv64 }, 0 },
2585 { "mov%LV", { RMeCX, Iv64 }, 0 },
2586 { "mov%LV", { RMeDX, Iv64 }, 0 },
2587 { "mov%LV", { RMeBX, Iv64 }, 0 },
2588 { "mov%LV", { RMeSP, Iv64 }, 0 },
2589 { "mov%LV", { RMeBP, Iv64 }, 0 },
2590 { "mov%LV", { RMeSI, Iv64 }, 0 },
2591 { "mov%LV", { RMeDI, Iv64 }, 0 },
2592 /* c0 */
2593 { REG_TABLE (REG_C0) },
2594 { REG_TABLE (REG_C1) },
2595 { "retT", { Iw, BND }, 0 },
2596 { "retT", { BND }, 0 },
2597 { X86_64_TABLE (X86_64_C4) },
2598 { X86_64_TABLE (X86_64_C5) },
2599 { REG_TABLE (REG_C6) },
2600 { REG_TABLE (REG_C7) },
2601 /* c8 */
2602 { "enterT", { Iw, Ib }, 0 },
2603 { "leaveT", { XX }, 0 },
2604 { "Jret{|f}P", { Iw }, 0 },
2605 { "Jret{|f}P", { XX }, 0 },
2606 { "int3", { XX }, 0 },
2607 { "int", { Ib }, 0 },
2608 { X86_64_TABLE (X86_64_CE) },
2609 { "iret%LP", { XX }, 0 },
2610 /* d0 */
2611 { REG_TABLE (REG_D0) },
2612 { REG_TABLE (REG_D1) },
2613 { REG_TABLE (REG_D2) },
2614 { REG_TABLE (REG_D3) },
2615 { X86_64_TABLE (X86_64_D4) },
2616 { X86_64_TABLE (X86_64_D5) },
2617 { Bad_Opcode },
2618 { "xlat", { DSBX }, 0 },
2619 /* d8 */
2620 { FLOAT },
2621 { FLOAT },
2622 { FLOAT },
2623 { FLOAT },
2624 { FLOAT },
2625 { FLOAT },
2626 { FLOAT },
2627 { FLOAT },
2628 /* e0 */
2629 { "loopneFH", { Jb, XX, loop_jcxz_flag }, 0 },
2630 { "loopeFH", { Jb, XX, loop_jcxz_flag }, 0 },
2631 { "loopFH", { Jb, XX, loop_jcxz_flag }, 0 },
2632 { "jEcxzH", { Jb, XX, loop_jcxz_flag }, 0 },
2633 { "inB", { AL, Ib }, 0 },
2634 { "inG", { zAX, Ib }, 0 },
2635 { "outB", { Ib, AL }, 0 },
2636 { "outG", { Ib, zAX }, 0 },
2637 /* e8 */
2638 { X86_64_TABLE (X86_64_E8) },
2639 { X86_64_TABLE (X86_64_E9) },
2640 { X86_64_TABLE (X86_64_EA) },
2641 { "jmp", { Jb, BND }, 0 },
2642 { "inB", { AL, indirDX }, 0 },
2643 { "inG", { zAX, indirDX }, 0 },
2644 { "outB", { indirDX, AL }, 0 },
2645 { "outG", { indirDX, zAX }, 0 },
2646 /* f0 */
2647 { Bad_Opcode }, /* lock prefix */
2648 { "icebp", { XX }, 0 },
2649 { Bad_Opcode }, /* repne */
2650 { Bad_Opcode }, /* repz */
2651 { "hlt", { XX }, 0 },
2652 { "cmc", { XX }, 0 },
2653 { REG_TABLE (REG_F6) },
2654 { REG_TABLE (REG_F7) },
2655 /* f8 */
2656 { "clc", { XX }, 0 },
2657 { "stc", { XX }, 0 },
2658 { "cli", { XX }, 0 },
2659 { "sti", { XX }, 0 },
2660 { "cld", { XX }, 0 },
2661 { "std", { XX }, 0 },
2662 { REG_TABLE (REG_FE) },
2663 { REG_TABLE (REG_FF) },
2664 };
2665
2666 static const struct dis386 dis386_twobyte[] = {
2667 /* 00 */
2668 { REG_TABLE (REG_0F00 ) },
2669 { REG_TABLE (REG_0F01 ) },
2670 { "larS", { Gv, Ew }, 0 },
2671 { "lslS", { Gv, Ew }, 0 },
2672 { Bad_Opcode },
2673 { "syscall", { XX }, 0 },
2674 { "clts", { XX }, 0 },
2675 { "sysret%LP", { XX }, 0 },
2676 /* 08 */
2677 { "invd", { XX }, 0 },
2678 { PREFIX_TABLE (PREFIX_0F09) },
2679 { Bad_Opcode },
2680 { "ud2", { XX }, 0 },
2681 { Bad_Opcode },
2682 { REG_TABLE (REG_0F0D) },
2683 { "femms", { XX }, 0 },
2684 { "", { MX, EM, OPSUF }, 0 }, /* See OP_3DNowSuffix. */
2685 /* 10 */
2686 { PREFIX_TABLE (PREFIX_0F10) },
2687 { PREFIX_TABLE (PREFIX_0F11) },
2688 { PREFIX_TABLE (PREFIX_0F12) },
2689 { MOD_TABLE (MOD_0F13) },
2690 { "unpcklpX", { XM, EXx }, PREFIX_OPCODE },
2691 { "unpckhpX", { XM, EXx }, PREFIX_OPCODE },
2692 { PREFIX_TABLE (PREFIX_0F16) },
2693 { MOD_TABLE (MOD_0F17) },
2694 /* 18 */
2695 { REG_TABLE (REG_0F18) },
2696 { "nopQ", { Ev }, 0 },
2697 { PREFIX_TABLE (PREFIX_0F1A) },
2698 { PREFIX_TABLE (PREFIX_0F1B) },
2699 { PREFIX_TABLE (PREFIX_0F1C) },
2700 { "nopQ", { Ev }, 0 },
2701 { PREFIX_TABLE (PREFIX_0F1E) },
2702 { "nopQ", { Ev }, 0 },
2703 /* 20 */
2704 { "movZ", { Rm, Cm }, 0 },
2705 { "movZ", { Rm, Dm }, 0 },
2706 { "movZ", { Cm, Rm }, 0 },
2707 { "movZ", { Dm, Rm }, 0 },
2708 { MOD_TABLE (MOD_0F24) },
2709 { Bad_Opcode },
2710 { MOD_TABLE (MOD_0F26) },
2711 { Bad_Opcode },
2712 /* 28 */
2713 { "movapX", { XM, EXx }, PREFIX_OPCODE },
2714 { "movapX", { EXxS, XM }, PREFIX_OPCODE },
2715 { PREFIX_TABLE (PREFIX_0F2A) },
2716 { PREFIX_TABLE (PREFIX_0F2B) },
2717 { PREFIX_TABLE (PREFIX_0F2C) },
2718 { PREFIX_TABLE (PREFIX_0F2D) },
2719 { PREFIX_TABLE (PREFIX_0F2E) },
2720 { PREFIX_TABLE (PREFIX_0F2F) },
2721 /* 30 */
2722 { "wrmsr", { XX }, 0 },
2723 { "rdtsc", { XX }, 0 },
2724 { "rdmsr", { XX }, 0 },
2725 { "rdpmc", { XX }, 0 },
2726 { "sysenter", { XX }, 0 },
2727 { "sysexit", { XX }, 0 },
2728 { Bad_Opcode },
2729 { "getsec", { XX }, 0 },
2730 /* 38 */
2731 { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F38, PREFIX_OPCODE) },
2732 { Bad_Opcode },
2733 { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F3A, PREFIX_OPCODE) },
2734 { Bad_Opcode },
2735 { Bad_Opcode },
2736 { Bad_Opcode },
2737 { Bad_Opcode },
2738 { Bad_Opcode },
2739 /* 40 */
2740 { "cmovoS", { Gv, Ev }, 0 },
2741 { "cmovnoS", { Gv, Ev }, 0 },
2742 { "cmovbS", { Gv, Ev }, 0 },
2743 { "cmovaeS", { Gv, Ev }, 0 },
2744 { "cmoveS", { Gv, Ev }, 0 },
2745 { "cmovneS", { Gv, Ev }, 0 },
2746 { "cmovbeS", { Gv, Ev }, 0 },
2747 { "cmovaS", { Gv, Ev }, 0 },
2748 /* 48 */
2749 { "cmovsS", { Gv, Ev }, 0 },
2750 { "cmovnsS", { Gv, Ev }, 0 },
2751 { "cmovpS", { Gv, Ev }, 0 },
2752 { "cmovnpS", { Gv, Ev }, 0 },
2753 { "cmovlS", { Gv, Ev }, 0 },
2754 { "cmovgeS", { Gv, Ev }, 0 },
2755 { "cmovleS", { Gv, Ev }, 0 },
2756 { "cmovgS", { Gv, Ev }, 0 },
2757 /* 50 */
2758 { MOD_TABLE (MOD_0F51) },
2759 { PREFIX_TABLE (PREFIX_0F51) },
2760 { PREFIX_TABLE (PREFIX_0F52) },
2761 { PREFIX_TABLE (PREFIX_0F53) },
2762 { "andpX", { XM, EXx }, PREFIX_OPCODE },
2763 { "andnpX", { XM, EXx }, PREFIX_OPCODE },
2764 { "orpX", { XM, EXx }, PREFIX_OPCODE },
2765 { "xorpX", { XM, EXx }, PREFIX_OPCODE },
2766 /* 58 */
2767 { PREFIX_TABLE (PREFIX_0F58) },
2768 { PREFIX_TABLE (PREFIX_0F59) },
2769 { PREFIX_TABLE (PREFIX_0F5A) },
2770 { PREFIX_TABLE (PREFIX_0F5B) },
2771 { PREFIX_TABLE (PREFIX_0F5C) },
2772 { PREFIX_TABLE (PREFIX_0F5D) },
2773 { PREFIX_TABLE (PREFIX_0F5E) },
2774 { PREFIX_TABLE (PREFIX_0F5F) },
2775 /* 60 */
2776 { PREFIX_TABLE (PREFIX_0F60) },
2777 { PREFIX_TABLE (PREFIX_0F61) },
2778 { PREFIX_TABLE (PREFIX_0F62) },
2779 { "packsswb", { MX, EM }, PREFIX_OPCODE },
2780 { "pcmpgtb", { MX, EM }, PREFIX_OPCODE },
2781 { "pcmpgtw", { MX, EM }, PREFIX_OPCODE },
2782 { "pcmpgtd", { MX, EM }, PREFIX_OPCODE },
2783 { "packuswb", { MX, EM }, PREFIX_OPCODE },
2784 /* 68 */
2785 { "punpckhbw", { MX, EM }, PREFIX_OPCODE },
2786 { "punpckhwd", { MX, EM }, PREFIX_OPCODE },
2787 { "punpckhdq", { MX, EM }, PREFIX_OPCODE },
2788 { "packssdw", { MX, EM }, PREFIX_OPCODE },
2789 { PREFIX_TABLE (PREFIX_0F6C) },
2790 { PREFIX_TABLE (PREFIX_0F6D) },
2791 { "movK", { MX, Edq }, PREFIX_OPCODE },
2792 { PREFIX_TABLE (PREFIX_0F6F) },
2793 /* 70 */
2794 { PREFIX_TABLE (PREFIX_0F70) },
2795 { REG_TABLE (REG_0F71) },
2796 { REG_TABLE (REG_0F72) },
2797 { REG_TABLE (REG_0F73) },
2798 { "pcmpeqb", { MX, EM }, PREFIX_OPCODE },
2799 { "pcmpeqw", { MX, EM }, PREFIX_OPCODE },
2800 { "pcmpeqd", { MX, EM }, PREFIX_OPCODE },
2801 { "emms", { XX }, PREFIX_OPCODE },
2802 /* 78 */
2803 { PREFIX_TABLE (PREFIX_0F78) },
2804 { PREFIX_TABLE (PREFIX_0F79) },
2805 { Bad_Opcode },
2806 { Bad_Opcode },
2807 { PREFIX_TABLE (PREFIX_0F7C) },
2808 { PREFIX_TABLE (PREFIX_0F7D) },
2809 { PREFIX_TABLE (PREFIX_0F7E) },
2810 { PREFIX_TABLE (PREFIX_0F7F) },
2811 /* 80 */
2812 { "joH", { Jv, BND, cond_jump_flag }, 0 },
2813 { "jnoH", { Jv, BND, cond_jump_flag }, 0 },
2814 { "jbH", { Jv, BND, cond_jump_flag }, 0 },
2815 { "jaeH", { Jv, BND, cond_jump_flag }, 0 },
2816 { "jeH", { Jv, BND, cond_jump_flag }, 0 },
2817 { "jneH", { Jv, BND, cond_jump_flag }, 0 },
2818 { "jbeH", { Jv, BND, cond_jump_flag }, 0 },
2819 { "jaH", { Jv, BND, cond_jump_flag }, 0 },
2820 /* 88 */
2821 { "jsH", { Jv, BND, cond_jump_flag }, 0 },
2822 { "jnsH", { Jv, BND, cond_jump_flag }, 0 },
2823 { "jpH", { Jv, BND, cond_jump_flag }, 0 },
2824 { "jnpH", { Jv, BND, cond_jump_flag }, 0 },
2825 { "jlH", { Jv, BND, cond_jump_flag }, 0 },
2826 { "jgeH", { Jv, BND, cond_jump_flag }, 0 },
2827 { "jleH", { Jv, BND, cond_jump_flag }, 0 },
2828 { "jgH", { Jv, BND, cond_jump_flag }, 0 },
2829 /* 90 */
2830 { "seto", { Eb }, 0 },
2831 { "setno", { Eb }, 0 },
2832 { "setb", { Eb }, 0 },
2833 { "setae", { Eb }, 0 },
2834 { "sete", { Eb }, 0 },
2835 { "setne", { Eb }, 0 },
2836 { "setbe", { Eb }, 0 },
2837 { "seta", { Eb }, 0 },
2838 /* 98 */
2839 { "sets", { Eb }, 0 },
2840 { "setns", { Eb }, 0 },
2841 { "setp", { Eb }, 0 },
2842 { "setnp", { Eb }, 0 },
2843 { "setl", { Eb }, 0 },
2844 { "setge", { Eb }, 0 },
2845 { "setle", { Eb }, 0 },
2846 { "setg", { Eb }, 0 },
2847 /* a0 */
2848 { "pushT", { fs }, 0 },
2849 { "popT", { fs }, 0 },
2850 { "cpuid", { XX }, 0 },
2851 { "btS", { Ev, Gv }, 0 },
2852 { "shldS", { Ev, Gv, Ib }, 0 },
2853 { "shldS", { Ev, Gv, CL }, 0 },
2854 { REG_TABLE (REG_0FA6) },
2855 { REG_TABLE (REG_0FA7) },
2856 /* a8 */
2857 { "pushT", { gs }, 0 },
2858 { "popT", { gs }, 0 },
2859 { "rsm", { XX }, 0 },
2860 { "btsS", { Evh1, Gv }, 0 },
2861 { "shrdS", { Ev, Gv, Ib }, 0 },
2862 { "shrdS", { Ev, Gv, CL }, 0 },
2863 { REG_TABLE (REG_0FAE) },
2864 { "imulS", { Gv, Ev }, 0 },
2865 /* b0 */
2866 { "cmpxchgB", { Ebh1, Gb }, 0 },
2867 { "cmpxchgS", { Evh1, Gv }, 0 },
2868 { MOD_TABLE (MOD_0FB2) },
2869 { "btrS", { Evh1, Gv }, 0 },
2870 { MOD_TABLE (MOD_0FB4) },
2871 { MOD_TABLE (MOD_0FB5) },
2872 { "movz{bR|x}", { Gv, Eb }, 0 },
2873 { "movz{wR|x}", { Gv, Ew }, 0 }, /* yes, there really is movzww ! */
2874 /* b8 */
2875 { PREFIX_TABLE (PREFIX_0FB8) },
2876 { "ud1S", { Gv, Ev }, 0 },
2877 { REG_TABLE (REG_0FBA) },
2878 { "btcS", { Evh1, Gv }, 0 },
2879 { PREFIX_TABLE (PREFIX_0FBC) },
2880 { PREFIX_TABLE (PREFIX_0FBD) },
2881 { "movs{bR|x}", { Gv, Eb }, 0 },
2882 { "movs{wR|x}", { Gv, Ew }, 0 }, /* yes, there really is movsww ! */
2883 /* c0 */
2884 { "xaddB", { Ebh1, Gb }, 0 },
2885 { "xaddS", { Evh1, Gv }, 0 },
2886 { PREFIX_TABLE (PREFIX_0FC2) },
2887 { MOD_TABLE (MOD_0FC3) },
2888 { "pinsrw", { MX, Edqw, Ib }, PREFIX_OPCODE },
2889 { "pextrw", { Gdq, MS, Ib }, PREFIX_OPCODE },
2890 { "shufpX", { XM, EXx, Ib }, PREFIX_OPCODE },
2891 { REG_TABLE (REG_0FC7) },
2892 /* c8 */
2893 { "bswap", { RMeAX }, 0 },
2894 { "bswap", { RMeCX }, 0 },
2895 { "bswap", { RMeDX }, 0 },
2896 { "bswap", { RMeBX }, 0 },
2897 { "bswap", { RMeSP }, 0 },
2898 { "bswap", { RMeBP }, 0 },
2899 { "bswap", { RMeSI }, 0 },
2900 { "bswap", { RMeDI }, 0 },
2901 /* d0 */
2902 { PREFIX_TABLE (PREFIX_0FD0) },
2903 { "psrlw", { MX, EM }, PREFIX_OPCODE },
2904 { "psrld", { MX, EM }, PREFIX_OPCODE },
2905 { "psrlq", { MX, EM }, PREFIX_OPCODE },
2906 { "paddq", { MX, EM }, PREFIX_OPCODE },
2907 { "pmullw", { MX, EM }, PREFIX_OPCODE },
2908 { PREFIX_TABLE (PREFIX_0FD6) },
2909 { MOD_TABLE (MOD_0FD7) },
2910 /* d8 */
2911 { "psubusb", { MX, EM }, PREFIX_OPCODE },
2912 { "psubusw", { MX, EM }, PREFIX_OPCODE },
2913 { "pminub", { MX, EM }, PREFIX_OPCODE },
2914 { "pand", { MX, EM }, PREFIX_OPCODE },
2915 { "paddusb", { MX, EM }, PREFIX_OPCODE },
2916 { "paddusw", { MX, EM }, PREFIX_OPCODE },
2917 { "pmaxub", { MX, EM }, PREFIX_OPCODE },
2918 { "pandn", { MX, EM }, PREFIX_OPCODE },
2919 /* e0 */
2920 { "pavgb", { MX, EM }, PREFIX_OPCODE },
2921 { "psraw", { MX, EM }, PREFIX_OPCODE },
2922 { "psrad", { MX, EM }, PREFIX_OPCODE },
2923 { "pavgw", { MX, EM }, PREFIX_OPCODE },
2924 { "pmulhuw", { MX, EM }, PREFIX_OPCODE },
2925 { "pmulhw", { MX, EM }, PREFIX_OPCODE },
2926 { PREFIX_TABLE (PREFIX_0FE6) },
2927 { PREFIX_TABLE (PREFIX_0FE7) },
2928 /* e8 */
2929 { "psubsb", { MX, EM }, PREFIX_OPCODE },
2930 { "psubsw", { MX, EM }, PREFIX_OPCODE },
2931 { "pminsw", { MX, EM }, PREFIX_OPCODE },
2932 { "por", { MX, EM }, PREFIX_OPCODE },
2933 { "paddsb", { MX, EM }, PREFIX_OPCODE },
2934 { "paddsw", { MX, EM }, PREFIX_OPCODE },
2935 { "pmaxsw", { MX, EM }, PREFIX_OPCODE },
2936 { "pxor", { MX, EM }, PREFIX_OPCODE },
2937 /* f0 */
2938 { PREFIX_TABLE (PREFIX_0FF0) },
2939 { "psllw", { MX, EM }, PREFIX_OPCODE },
2940 { "pslld", { MX, EM }, PREFIX_OPCODE },
2941 { "psllq", { MX, EM }, PREFIX_OPCODE },
2942 { "pmuludq", { MX, EM }, PREFIX_OPCODE },
2943 { "pmaddwd", { MX, EM }, PREFIX_OPCODE },
2944 { "psadbw", { MX, EM }, PREFIX_OPCODE },
2945 { PREFIX_TABLE (PREFIX_0FF7) },
2946 /* f8 */
2947 { "psubb", { MX, EM }, PREFIX_OPCODE },
2948 { "psubw", { MX, EM }, PREFIX_OPCODE },
2949 { "psubd", { MX, EM }, PREFIX_OPCODE },
2950 { "psubq", { MX, EM }, PREFIX_OPCODE },
2951 { "paddb", { MX, EM }, PREFIX_OPCODE },
2952 { "paddw", { MX, EM }, PREFIX_OPCODE },
2953 { "paddd", { MX, EM }, PREFIX_OPCODE },
2954 { "ud0S", { Gv, Ev }, 0 },
2955 };
2956
2957 static const unsigned char onebyte_has_modrm[256] = {
2958 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2959 /* ------------------------------- */
2960 /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
2961 /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
2962 /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
2963 /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
2964 /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
2965 /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
2966 /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
2967 /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
2968 /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
2969 /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
2970 /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
2971 /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
2972 /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
2973 /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
2974 /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
2975 /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1 /* f0 */
2976 /* ------------------------------- */
2977 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2978 };
2979
2980 static const unsigned char twobyte_has_modrm[256] = {
2981 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2982 /* ------------------------------- */
2983 /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
2984 /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
2985 /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
2986 /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
2987 /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
2988 /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
2989 /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
2990 /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
2991 /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
2992 /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
2993 /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
2994 /* b0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* bf */
2995 /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
2996 /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
2997 /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
2998 /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 /* ff */
2999 /* ------------------------------- */
3000 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
3001 };
3002
3003 static char obuf[100];
3004 static char *obufp;
3005 static char *mnemonicendp;
3006 static char scratchbuf[100];
3007 static unsigned char *start_codep;
3008 static unsigned char *insn_codep;
3009 static unsigned char *codep;
3010 static unsigned char *end_codep;
3011 static int last_lock_prefix;
3012 static int last_repz_prefix;
3013 static int last_repnz_prefix;
3014 static int last_data_prefix;
3015 static int last_addr_prefix;
3016 static int last_rex_prefix;
3017 static int last_seg_prefix;
3018 static int fwait_prefix;
3019 /* The active segment register prefix. */
3020 static int active_seg_prefix;
3021 #define MAX_CODE_LENGTH 15
3022 /* We can up to 14 prefixes since the maximum instruction length is
3023 15bytes. */
3024 static int all_prefixes[MAX_CODE_LENGTH - 1];
3025 static disassemble_info *the_info;
3026 static struct
3027 {
3028 int mod;
3029 int reg;
3030 int rm;
3031 }
3032 modrm;
3033 static unsigned char need_modrm;
3034 static struct
3035 {
3036 int scale;
3037 int index;
3038 int base;
3039 }
3040 sib;
3041 static struct
3042 {
3043 int register_specifier;
3044 int length;
3045 int prefix;
3046 int w;
3047 int evex;
3048 int r;
3049 int v;
3050 int mask_register_specifier;
3051 int zeroing;
3052 int ll;
3053 int b;
3054 }
3055 vex;
3056 static unsigned char need_vex;
3057 static unsigned char need_vex_reg;
3058 static unsigned char vex_w_done;
3059
3060 struct op
3061 {
3062 const char *name;
3063 unsigned int len;
3064 };
3065
3066 /* If we are accessing mod/rm/reg without need_modrm set, then the
3067 values are stale. Hitting this abort likely indicates that you
3068 need to update onebyte_has_modrm or twobyte_has_modrm. */
3069 #define MODRM_CHECK if (!need_modrm) abort ()
3070
3071 static const char **names64;
3072 static const char **names32;
3073 static const char **names16;
3074 static const char **names8;
3075 static const char **names8rex;
3076 static const char **names_seg;
3077 static const char *index64;
3078 static const char *index32;
3079 static const char **index16;
3080 static const char **names_bnd;
3081
3082 static const char *intel_names64[] = {
3083 "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
3084 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
3085 };
3086 static const char *intel_names32[] = {
3087 "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
3088 "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
3089 };
3090 static const char *intel_names16[] = {
3091 "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
3092 "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
3093 };
3094 static const char *intel_names8[] = {
3095 "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
3096 };
3097 static const char *intel_names8rex[] = {
3098 "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
3099 "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
3100 };
3101 static const char *intel_names_seg[] = {
3102 "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
3103 };
3104 static const char *intel_index64 = "riz";
3105 static const char *intel_index32 = "eiz";
3106 static const char *intel_index16[] = {
3107 "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
3108 };
3109
3110 static const char *att_names64[] = {
3111 "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
3112 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
3113 };
3114 static const char *att_names32[] = {
3115 "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
3116 "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
3117 };
3118 static const char *att_names16[] = {
3119 "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
3120 "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
3121 };
3122 static const char *att_names8[] = {
3123 "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
3124 };
3125 static const char *att_names8rex[] = {
3126 "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
3127 "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
3128 };
3129 static const char *att_names_seg[] = {
3130 "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
3131 };
3132 static const char *att_index64 = "%riz";
3133 static const char *att_index32 = "%eiz";
3134 static const char *att_index16[] = {
3135 "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
3136 };
3137
3138 static const char **names_mm;
3139 static const char *intel_names_mm[] = {
3140 "mm0", "mm1", "mm2", "mm3",
3141 "mm4", "mm5", "mm6", "mm7"
3142 };
3143 static const char *att_names_mm[] = {
3144 "%mm0", "%mm1", "%mm2", "%mm3",
3145 "%mm4", "%mm5", "%mm6", "%mm7"
3146 };
3147
3148 static const char *intel_names_bnd[] = {
3149 "bnd0", "bnd1", "bnd2", "bnd3"
3150 };
3151
3152 static const char *att_names_bnd[] = {
3153 "%bnd0", "%bnd1", "%bnd2", "%bnd3"
3154 };
3155
3156 static const char **names_xmm;
3157 static const char *intel_names_xmm[] = {
3158 "xmm0", "xmm1", "xmm2", "xmm3",
3159 "xmm4", "xmm5", "xmm6", "xmm7",
3160 "xmm8", "xmm9", "xmm10", "xmm11",
3161 "xmm12", "xmm13", "xmm14", "xmm15",
3162 "xmm16", "xmm17", "xmm18", "xmm19",
3163 "xmm20", "xmm21", "xmm22", "xmm23",
3164 "xmm24", "xmm25", "xmm26", "xmm27",
3165 "xmm28", "xmm29", "xmm30", "xmm31"
3166 };
3167 static const char *att_names_xmm[] = {
3168 "%xmm0", "%xmm1", "%xmm2", "%xmm3",
3169 "%xmm4", "%xmm5", "%xmm6", "%xmm7",
3170 "%xmm8", "%xmm9", "%xmm10", "%xmm11",
3171 "%xmm12", "%xmm13", "%xmm14", "%xmm15",
3172 "%xmm16", "%xmm17", "%xmm18", "%xmm19",
3173 "%xmm20", "%xmm21", "%xmm22", "%xmm23",
3174 "%xmm24", "%xmm25", "%xmm26", "%xmm27",
3175 "%xmm28", "%xmm29", "%xmm30", "%xmm31"
3176 };
3177
3178 static const char **names_ymm;
3179 static const char *intel_names_ymm[] = {
3180 "ymm0", "ymm1", "ymm2", "ymm3",
3181 "ymm4", "ymm5", "ymm6", "ymm7",
3182 "ymm8", "ymm9", "ymm10", "ymm11",
3183 "ymm12", "ymm13", "ymm14", "ymm15",
3184 "ymm16", "ymm17", "ymm18", "ymm19",
3185 "ymm20", "ymm21", "ymm22", "ymm23",
3186 "ymm24", "ymm25", "ymm26", "ymm27",
3187 "ymm28", "ymm29", "ymm30", "ymm31"
3188 };
3189 static const char *att_names_ymm[] = {
3190 "%ymm0", "%ymm1", "%ymm2", "%ymm3",
3191 "%ymm4", "%ymm5", "%ymm6", "%ymm7",
3192 "%ymm8", "%ymm9", "%ymm10", "%ymm11",
3193 "%ymm12", "%ymm13", "%ymm14", "%ymm15",
3194 "%ymm16", "%ymm17", "%ymm18", "%ymm19",
3195 "%ymm20", "%ymm21", "%ymm22", "%ymm23",
3196 "%ymm24", "%ymm25", "%ymm26", "%ymm27",
3197 "%ymm28", "%ymm29", "%ymm30", "%ymm31"
3198 };
3199
3200 static const char **names_zmm;
3201 static const char *intel_names_zmm[] = {
3202 "zmm0", "zmm1", "zmm2", "zmm3",
3203 "zmm4", "zmm5", "zmm6", "zmm7",
3204 "zmm8", "zmm9", "zmm10", "zmm11",
3205 "zmm12", "zmm13", "zmm14", "zmm15",
3206 "zmm16", "zmm17", "zmm18", "zmm19",
3207 "zmm20", "zmm21", "zmm22", "zmm23",
3208 "zmm24", "zmm25", "zmm26", "zmm27",
3209 "zmm28", "zmm29", "zmm30", "zmm31"
3210 };
3211 static const char *att_names_zmm[] = {
3212 "%zmm0", "%zmm1", "%zmm2", "%zmm3",
3213 "%zmm4", "%zmm5", "%zmm6", "%zmm7",
3214 "%zmm8", "%zmm9", "%zmm10", "%zmm11",
3215 "%zmm12", "%zmm13", "%zmm14", "%zmm15",
3216 "%zmm16", "%zmm17", "%zmm18", "%zmm19",
3217 "%zmm20", "%zmm21", "%zmm22", "%zmm23",
3218 "%zmm24", "%zmm25", "%zmm26", "%zmm27",
3219 "%zmm28", "%zmm29", "%zmm30", "%zmm31"
3220 };
3221
3222 static const char **names_mask;
3223 static const char *intel_names_mask[] = {
3224 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7"
3225 };
3226 static const char *att_names_mask[] = {
3227 "%k0", "%k1", "%k2", "%k3", "%k4", "%k5", "%k6", "%k7"
3228 };
3229
3230 static const char *names_rounding[] =
3231 {
3232 "{rn-sae}",
3233 "{rd-sae}",
3234 "{ru-sae}",
3235 "{rz-sae}"
3236 };
3237
3238 static const struct dis386 reg_table[][8] = {
3239 /* REG_80 */
3240 {
3241 { "addA", { Ebh1, Ib }, 0 },
3242 { "orA", { Ebh1, Ib }, 0 },
3243 { "adcA", { Ebh1, Ib }, 0 },
3244 { "sbbA", { Ebh1, Ib }, 0 },
3245 { "andA", { Ebh1, Ib }, 0 },
3246 { "subA", { Ebh1, Ib }, 0 },
3247 { "xorA", { Ebh1, Ib }, 0 },
3248 { "cmpA", { Eb, Ib }, 0 },
3249 },
3250 /* REG_81 */
3251 {
3252 { "addQ", { Evh1, Iv }, 0 },
3253 { "orQ", { Evh1, Iv }, 0 },
3254 { "adcQ", { Evh1, Iv }, 0 },
3255 { "sbbQ", { Evh1, Iv }, 0 },
3256 { "andQ", { Evh1, Iv }, 0 },
3257 { "subQ", { Evh1, Iv }, 0 },
3258 { "xorQ", { Evh1, Iv }, 0 },
3259 { "cmpQ", { Ev, Iv }, 0 },
3260 },
3261 /* REG_83 */
3262 {
3263 { "addQ", { Evh1, sIb }, 0 },
3264 { "orQ", { Evh1, sIb }, 0 },
3265 { "adcQ", { Evh1, sIb }, 0 },
3266 { "sbbQ", { Evh1, sIb }, 0 },
3267 { "andQ", { Evh1, sIb }, 0 },
3268 { "subQ", { Evh1, sIb }, 0 },
3269 { "xorQ", { Evh1, sIb }, 0 },
3270 { "cmpQ", { Ev, sIb }, 0 },
3271 },
3272 /* REG_8F */
3273 {
3274 { "popU", { stackEv }, 0 },
3275 { XOP_8F_TABLE (XOP_09) },
3276 { Bad_Opcode },
3277 { Bad_Opcode },
3278 { Bad_Opcode },
3279 { XOP_8F_TABLE (XOP_09) },
3280 },
3281 /* REG_C0 */
3282 {
3283 { "rolA", { Eb, Ib }, 0 },
3284 { "rorA", { Eb, Ib }, 0 },
3285 { "rclA", { Eb, Ib }, 0 },
3286 { "rcrA", { Eb, Ib }, 0 },
3287 { "shlA", { Eb, Ib }, 0 },
3288 { "shrA", { Eb, Ib }, 0 },
3289 { "shlA", { Eb, Ib }, 0 },
3290 { "sarA", { Eb, Ib }, 0 },
3291 },
3292 /* REG_C1 */
3293 {
3294 { "rolQ", { Ev, Ib }, 0 },
3295 { "rorQ", { Ev, Ib }, 0 },
3296 { "rclQ", { Ev, Ib }, 0 },
3297 { "rcrQ", { Ev, Ib }, 0 },
3298 { "shlQ", { Ev, Ib }, 0 },
3299 { "shrQ", { Ev, Ib }, 0 },
3300 { "shlQ", { Ev, Ib }, 0 },
3301 { "sarQ", { Ev, Ib }, 0 },
3302 },
3303 /* REG_C6 */
3304 {
3305 { "movA", { Ebh3, Ib }, 0 },
3306 { Bad_Opcode },
3307 { Bad_Opcode },
3308 { Bad_Opcode },
3309 { Bad_Opcode },
3310 { Bad_Opcode },
3311 { Bad_Opcode },
3312 { MOD_TABLE (MOD_C6_REG_7) },
3313 },
3314 /* REG_C7 */
3315 {
3316 { "movQ", { Evh3, Iv }, 0 },
3317 { Bad_Opcode },
3318 { Bad_Opcode },
3319 { Bad_Opcode },
3320 { Bad_Opcode },
3321 { Bad_Opcode },
3322 { Bad_Opcode },
3323 { MOD_TABLE (MOD_C7_REG_7) },
3324 },
3325 /* REG_D0 */
3326 {
3327 { "rolA", { Eb, I1 }, 0 },
3328 { "rorA", { Eb, I1 }, 0 },
3329 { "rclA", { Eb, I1 }, 0 },
3330 { "rcrA", { Eb, I1 }, 0 },
3331 { "shlA", { Eb, I1 }, 0 },
3332 { "shrA", { Eb, I1 }, 0 },
3333 { "shlA", { Eb, I1 }, 0 },
3334 { "sarA", { Eb, I1 }, 0 },
3335 },
3336 /* REG_D1 */
3337 {
3338 { "rolQ", { Ev, I1 }, 0 },
3339 { "rorQ", { Ev, I1 }, 0 },
3340 { "rclQ", { Ev, I1 }, 0 },
3341 { "rcrQ", { Ev, I1 }, 0 },
3342 { "shlQ", { Ev, I1 }, 0 },
3343 { "shrQ", { Ev, I1 }, 0 },
3344 { "shlQ", { Ev, I1 }, 0 },
3345 { "sarQ", { Ev, I1 }, 0 },
3346 },
3347 /* REG_D2 */
3348 {
3349 { "rolA", { Eb, CL }, 0 },
3350 { "rorA", { Eb, CL }, 0 },
3351 { "rclA", { Eb, CL }, 0 },
3352 { "rcrA", { Eb, CL }, 0 },
3353 { "shlA", { Eb, CL }, 0 },
3354 { "shrA", { Eb, CL }, 0 },
3355 { "shlA", { Eb, CL }, 0 },
3356 { "sarA", { Eb, CL }, 0 },
3357 },
3358 /* REG_D3 */
3359 {
3360 { "rolQ", { Ev, CL }, 0 },
3361 { "rorQ", { Ev, CL }, 0 },
3362 { "rclQ", { Ev, CL }, 0 },
3363 { "rcrQ", { Ev, CL }, 0 },
3364 { "shlQ", { Ev, CL }, 0 },
3365 { "shrQ", { Ev, CL }, 0 },
3366 { "shlQ", { Ev, CL }, 0 },
3367 { "sarQ", { Ev, CL }, 0 },
3368 },
3369 /* REG_F6 */
3370 {
3371 { "testA", { Eb, Ib }, 0 },
3372 { "testA", { Eb, Ib }, 0 },
3373 { "notA", { Ebh1 }, 0 },
3374 { "negA", { Ebh1 }, 0 },
3375 { "mulA", { Eb }, 0 }, /* Don't print the implicit %al register, */
3376 { "imulA", { Eb }, 0 }, /* to distinguish these opcodes from other */
3377 { "divA", { Eb }, 0 }, /* mul/imul opcodes. Do the same for div */
3378 { "idivA", { Eb }, 0 }, /* and idiv for consistency. */
3379 },
3380 /* REG_F7 */
3381 {
3382 { "testQ", { Ev, Iv }, 0 },
3383 { "testQ", { Ev, Iv }, 0 },
3384 { "notQ", { Evh1 }, 0 },
3385 { "negQ", { Evh1 }, 0 },
3386 { "mulQ", { Ev }, 0 }, /* Don't print the implicit register. */
3387 { "imulQ", { Ev }, 0 },
3388 { "divQ", { Ev }, 0 },
3389 { "idivQ", { Ev }, 0 },
3390 },
3391 /* REG_FE */
3392 {
3393 { "incA", { Ebh1 }, 0 },
3394 { "decA", { Ebh1 }, 0 },
3395 },
3396 /* REG_FF */
3397 {
3398 { "incQ", { Evh1 }, 0 },
3399 { "decQ", { Evh1 }, 0 },
3400 { "call{&|}", { NOTRACK, indirEv, BND }, 0 },
3401 { MOD_TABLE (MOD_FF_REG_3) },
3402 { "jmp{&|}", { NOTRACK, indirEv, BND }, 0 },
3403 { MOD_TABLE (MOD_FF_REG_5) },
3404 { "pushU", { stackEv }, 0 },
3405 { Bad_Opcode },
3406 },
3407 /* REG_0F00 */
3408 {
3409 { "sldtD", { Sv }, 0 },
3410 { "strD", { Sv }, 0 },
3411 { "lldt", { Ew }, 0 },
3412 { "ltr", { Ew }, 0 },
3413 { "verr", { Ew }, 0 },
3414 { "verw", { Ew }, 0 },
3415 { Bad_Opcode },
3416 { Bad_Opcode },
3417 },
3418 /* REG_0F01 */
3419 {
3420 { MOD_TABLE (MOD_0F01_REG_0) },
3421 { MOD_TABLE (MOD_0F01_REG_1) },
3422 { MOD_TABLE (MOD_0F01_REG_2) },
3423 { MOD_TABLE (MOD_0F01_REG_3) },
3424 { "smswD", { Sv }, 0 },
3425 { MOD_TABLE (MOD_0F01_REG_5) },
3426 { "lmsw", { Ew }, 0 },
3427 { MOD_TABLE (MOD_0F01_REG_7) },
3428 },
3429 /* REG_0F0D */
3430 {
3431 { "prefetch", { Mb }, 0 },
3432 { "prefetchw", { Mb }, 0 },
3433 { "prefetchwt1", { Mb }, 0 },
3434 { "prefetch", { Mb }, 0 },
3435 { "prefetch", { Mb }, 0 },
3436 { "prefetch", { Mb }, 0 },
3437 { "prefetch", { Mb }, 0 },
3438 { "prefetch", { Mb }, 0 },
3439 },
3440 /* REG_0F18 */
3441 {
3442 { MOD_TABLE (MOD_0F18_REG_0) },
3443 { MOD_TABLE (MOD_0F18_REG_1) },
3444 { MOD_TABLE (MOD_0F18_REG_2) },
3445 { MOD_TABLE (MOD_0F18_REG_3) },
3446 { MOD_TABLE (MOD_0F18_REG_4) },
3447 { MOD_TABLE (MOD_0F18_REG_5) },
3448 { MOD_TABLE (MOD_0F18_REG_6) },
3449 { MOD_TABLE (MOD_0F18_REG_7) },
3450 },
3451 /* REG_0F1C_MOD_0 */
3452 {
3453 { "cldemote", { Mb }, 0 },
3454 { "nopQ", { Ev }, 0 },
3455 { "nopQ", { Ev }, 0 },
3456 { "nopQ", { Ev }, 0 },
3457 { "nopQ", { Ev }, 0 },
3458 { "nopQ", { Ev }, 0 },
3459 { "nopQ", { Ev }, 0 },
3460 { "nopQ", { Ev }, 0 },
3461 },
3462 /* REG_0F1E_MOD_3 */
3463 {
3464 { "nopQ", { Ev }, 0 },
3465 { "rdsspK", { Rdq }, PREFIX_OPCODE },
3466 { "nopQ", { Ev }, 0 },
3467 { "nopQ", { Ev }, 0 },
3468 { "nopQ", { Ev }, 0 },
3469 { "nopQ", { Ev }, 0 },
3470 { "nopQ", { Ev }, 0 },
3471 { RM_TABLE (RM_0F1E_MOD_3_REG_7) },
3472 },
3473 /* REG_0F71 */
3474 {
3475 { Bad_Opcode },
3476 { Bad_Opcode },
3477 { MOD_TABLE (MOD_0F71_REG_2) },
3478 { Bad_Opcode },
3479 { MOD_TABLE (MOD_0F71_REG_4) },
3480 { Bad_Opcode },
3481 { MOD_TABLE (MOD_0F71_REG_6) },
3482 },
3483 /* REG_0F72 */
3484 {
3485 { Bad_Opcode },
3486 { Bad_Opcode },
3487 { MOD_TABLE (MOD_0F72_REG_2) },
3488 { Bad_Opcode },
3489 { MOD_TABLE (MOD_0F72_REG_4) },
3490 { Bad_Opcode },
3491 { MOD_TABLE (MOD_0F72_REG_6) },
3492 },
3493 /* REG_0F73 */
3494 {
3495 { Bad_Opcode },
3496 { Bad_Opcode },
3497 { MOD_TABLE (MOD_0F73_REG_2) },
3498 { MOD_TABLE (MOD_0F73_REG_3) },
3499 { Bad_Opcode },
3500 { Bad_Opcode },
3501 { MOD_TABLE (MOD_0F73_REG_6) },
3502 { MOD_TABLE (MOD_0F73_REG_7) },
3503 },
3504 /* REG_0FA6 */
3505 {
3506 { "montmul", { { OP_0f07, 0 } }, 0 },
3507 { "xsha1", { { OP_0f07, 0 } }, 0 },
3508 { "xsha256", { { OP_0f07, 0 } }, 0 },
3509 },
3510 /* REG_0FA7 */
3511 {
3512 { "xstore-rng", { { OP_0f07, 0 } }, 0 },
3513 { "xcrypt-ecb", { { OP_0f07, 0 } }, 0 },
3514 { "xcrypt-cbc", { { OP_0f07, 0 } }, 0 },
3515 { "xcrypt-ctr", { { OP_0f07, 0 } }, 0 },
3516 { "xcrypt-cfb", { { OP_0f07, 0 } }, 0 },
3517 { "xcrypt-ofb", { { OP_0f07, 0 } }, 0 },
3518 },
3519 /* REG_0FAE */
3520 {
3521 { MOD_TABLE (MOD_0FAE_REG_0) },
3522 { MOD_TABLE (MOD_0FAE_REG_1) },
3523 { MOD_TABLE (MOD_0FAE_REG_2) },
3524 { MOD_TABLE (MOD_0FAE_REG_3) },
3525 { MOD_TABLE (MOD_0FAE_REG_4) },
3526 { MOD_TABLE (MOD_0FAE_REG_5) },
3527 { MOD_TABLE (MOD_0FAE_REG_6) },
3528 { MOD_TABLE (MOD_0FAE_REG_7) },
3529 },
3530 /* REG_0FBA */
3531 {
3532 { Bad_Opcode },
3533 { Bad_Opcode },
3534 { Bad_Opcode },
3535 { Bad_Opcode },
3536 { "btQ", { Ev, Ib }, 0 },
3537 { "btsQ", { Evh1, Ib }, 0 },
3538 { "btrQ", { Evh1, Ib }, 0 },
3539 { "btcQ", { Evh1, Ib }, 0 },
3540 },
3541 /* REG_0FC7 */
3542 {
3543 { Bad_Opcode },
3544 { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } }, 0 },
3545 { Bad_Opcode },
3546 { MOD_TABLE (MOD_0FC7_REG_3) },
3547 { MOD_TABLE (MOD_0FC7_REG_4) },
3548 { MOD_TABLE (MOD_0FC7_REG_5) },
3549 { MOD_TABLE (MOD_0FC7_REG_6) },
3550 { MOD_TABLE (MOD_0FC7_REG_7) },
3551 },
3552 /* REG_VEX_0F71 */
3553 {
3554 { Bad_Opcode },
3555 { Bad_Opcode },
3556 { MOD_TABLE (MOD_VEX_0F71_REG_2) },
3557 { Bad_Opcode },
3558 { MOD_TABLE (MOD_VEX_0F71_REG_4) },
3559 { Bad_Opcode },
3560 { MOD_TABLE (MOD_VEX_0F71_REG_6) },
3561 },
3562 /* REG_VEX_0F72 */
3563 {
3564 { Bad_Opcode },
3565 { Bad_Opcode },
3566 { MOD_TABLE (MOD_VEX_0F72_REG_2) },
3567 { Bad_Opcode },
3568 { MOD_TABLE (MOD_VEX_0F72_REG_4) },
3569 { Bad_Opcode },
3570 { MOD_TABLE (MOD_VEX_0F72_REG_6) },
3571 },
3572 /* REG_VEX_0F73 */
3573 {
3574 { Bad_Opcode },
3575 { Bad_Opcode },
3576 { MOD_TABLE (MOD_VEX_0F73_REG_2) },
3577 { MOD_TABLE (MOD_VEX_0F73_REG_3) },
3578 { Bad_Opcode },
3579 { Bad_Opcode },
3580 { MOD_TABLE (MOD_VEX_0F73_REG_6) },
3581 { MOD_TABLE (MOD_VEX_0F73_REG_7) },
3582 },
3583 /* REG_VEX_0FAE */
3584 {
3585 { Bad_Opcode },
3586 { Bad_Opcode },
3587 { MOD_TABLE (MOD_VEX_0FAE_REG_2) },
3588 { MOD_TABLE (MOD_VEX_0FAE_REG_3) },
3589 },
3590 /* REG_VEX_0F38F3 */
3591 {
3592 { Bad_Opcode },
3593 { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_1) },
3594 { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_2) },
3595 { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_3) },
3596 },
3597 /* REG_XOP_LWPCB */
3598 {
3599 { "llwpcb", { { OP_LWPCB_E, 0 } }, 0 },
3600 { "slwpcb", { { OP_LWPCB_E, 0 } }, 0 },
3601 },
3602 /* REG_XOP_LWP */
3603 {
3604 { "lwpins", { { OP_LWP_E, 0 }, Ed, Iq }, 0 },
3605 { "lwpval", { { OP_LWP_E, 0 }, Ed, Iq }, 0 },
3606 },
3607 /* REG_XOP_TBM_01 */
3608 {
3609 { Bad_Opcode },
3610 { "blcfill", { { OP_LWP_E, 0 }, Ev }, 0 },
3611 { "blsfill", { { OP_LWP_E, 0 }, Ev }, 0 },
3612 { "blcs", { { OP_LWP_E, 0 }, Ev }, 0 },
3613 { "tzmsk", { { OP_LWP_E, 0 }, Ev }, 0 },
3614 { "blcic", { { OP_LWP_E, 0 }, Ev }, 0 },
3615 { "blsic", { { OP_LWP_E, 0 }, Ev }, 0 },
3616 { "t1mskc", { { OP_LWP_E, 0 }, Ev }, 0 },
3617 },
3618 /* REG_XOP_TBM_02 */
3619 {
3620 { Bad_Opcode },
3621 { "blcmsk", { { OP_LWP_E, 0 }, Ev }, 0 },
3622 { Bad_Opcode },
3623 { Bad_Opcode },
3624 { Bad_Opcode },
3625 { Bad_Opcode },
3626 { "blci", { { OP_LWP_E, 0 }, Ev }, 0 },
3627 },
3628
3629 #include "i386-dis-evex-reg.h"
3630 };
3631
3632 static const struct dis386 prefix_table[][4] = {
3633 /* PREFIX_90 */
3634 {
3635 { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } }, 0 },
3636 { "pause", { XX }, 0 },
3637 { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } }, 0 },
3638 { NULL, { { NULL, 0 } }, PREFIX_IGNORED }
3639 },
3640
3641 /* PREFIX_MOD_0_0F01_REG_5 */
3642 {
3643 { Bad_Opcode },
3644 { "rstorssp", { Mq }, PREFIX_OPCODE },
3645 },
3646
3647 /* PREFIX_MOD_3_0F01_REG_5_RM_0 */
3648 {
3649 { Bad_Opcode },
3650 { "setssbsy", { Skip_MODRM }, PREFIX_OPCODE },
3651 },
3652
3653 /* PREFIX_MOD_3_0F01_REG_5_RM_2 */
3654 {
3655 { Bad_Opcode },
3656 { "saveprevssp", { Skip_MODRM }, PREFIX_OPCODE },
3657 },
3658
3659 /* PREFIX_0F09 */
3660 {
3661 { "wbinvd", { XX }, 0 },
3662 { "wbnoinvd", { XX }, 0 },
3663 },
3664
3665 /* PREFIX_0F10 */
3666 {
3667 { "movups", { XM, EXx }, PREFIX_OPCODE },
3668 { "movss", { XM, EXd }, PREFIX_OPCODE },
3669 { "movupd", { XM, EXx }, PREFIX_OPCODE },
3670 { "movsd", { XM, EXq }, PREFIX_OPCODE },
3671 },
3672
3673 /* PREFIX_0F11 */
3674 {
3675 { "movups", { EXxS, XM }, PREFIX_OPCODE },
3676 { "movss", { EXdS, XM }, PREFIX_OPCODE },
3677 { "movupd", { EXxS, XM }, PREFIX_OPCODE },
3678 { "movsd", { EXqS, XM }, PREFIX_OPCODE },
3679 },
3680
3681 /* PREFIX_0F12 */
3682 {
3683 { MOD_TABLE (MOD_0F12_PREFIX_0) },
3684 { "movsldup", { XM, EXx }, PREFIX_OPCODE },
3685 { "movlpd", { XM, EXq }, PREFIX_OPCODE },
3686 { "movddup", { XM, EXq }, PREFIX_OPCODE },
3687 },
3688
3689 /* PREFIX_0F16 */
3690 {
3691 { MOD_TABLE (MOD_0F16_PREFIX_0) },
3692 { "movshdup", { XM, EXx }, PREFIX_OPCODE },
3693 { "movhpd", { XM, EXq }, PREFIX_OPCODE },
3694 },
3695
3696 /* PREFIX_0F1A */
3697 {
3698 { MOD_TABLE (MOD_0F1A_PREFIX_0) },
3699 { "bndcl", { Gbnd, Ev_bnd }, 0 },
3700 { "bndmov", { Gbnd, Ebnd }, 0 },
3701 { "bndcu", { Gbnd, Ev_bnd }, 0 },
3702 },
3703
3704 /* PREFIX_0F1B */
3705 {
3706 { MOD_TABLE (MOD_0F1B_PREFIX_0) },
3707 { MOD_TABLE (MOD_0F1B_PREFIX_1) },
3708 { "bndmov", { EbndS, Gbnd }, 0 },
3709 { "bndcn", { Gbnd, Ev_bnd }, 0 },
3710 },
3711
3712 /* PREFIX_0F1C */
3713 {
3714 { MOD_TABLE (MOD_0F1C_PREFIX_0) },
3715 { "nopQ", { Ev }, PREFIX_OPCODE },
3716 { "nopQ", { Ev }, PREFIX_OPCODE },
3717 { "nopQ", { Ev }, PREFIX_OPCODE },
3718 },
3719
3720 /* PREFIX_0F1E */
3721 {
3722 { "nopQ", { Ev }, PREFIX_OPCODE },
3723 { MOD_TABLE (MOD_0F1E_PREFIX_1) },
3724 { "nopQ", { Ev }, PREFIX_OPCODE },
3725 { "nopQ", { Ev }, PREFIX_OPCODE },
3726 },
3727
3728 /* PREFIX_0F2A */
3729 {
3730 { "cvtpi2ps", { XM, EMCq }, PREFIX_OPCODE },
3731 { "cvtsi2ss%LQ", { XM, Ev }, PREFIX_OPCODE },
3732 { "cvtpi2pd", { XM, EMCq }, PREFIX_OPCODE },
3733 { "cvtsi2sd%LQ", { XM, Ev }, 0 },
3734 },
3735
3736 /* PREFIX_0F2B */
3737 {
3738 { MOD_TABLE (MOD_0F2B_PREFIX_0) },
3739 { MOD_TABLE (MOD_0F2B_PREFIX_1) },
3740 { MOD_TABLE (MOD_0F2B_PREFIX_2) },
3741 { MOD_TABLE (MOD_0F2B_PREFIX_3) },
3742 },
3743
3744 /* PREFIX_0F2C */
3745 {
3746 { "cvttps2pi", { MXC, EXq }, PREFIX_OPCODE },
3747 { "cvttss2si", { Gv, EXd }, PREFIX_OPCODE },
3748 { "cvttpd2pi", { MXC, EXx }, PREFIX_OPCODE },
3749 { "cvttsd2si", { Gv, EXq }, PREFIX_OPCODE },
3750 },
3751
3752 /* PREFIX_0F2D */
3753 {
3754 { "cvtps2pi", { MXC, EXq }, PREFIX_OPCODE },
3755 { "cvtss2si", { Gv, EXd }, PREFIX_OPCODE },
3756 { "cvtpd2pi", { MXC, EXx }, PREFIX_OPCODE },
3757 { "cvtsd2si", { Gv, EXq }, PREFIX_OPCODE },
3758 },
3759
3760 /* PREFIX_0F2E */
3761 {
3762 { "ucomiss",{ XM, EXd }, 0 },
3763 { Bad_Opcode },
3764 { "ucomisd",{ XM, EXq }, 0 },
3765 },
3766
3767 /* PREFIX_0F2F */
3768 {
3769 { "comiss", { XM, EXd }, 0 },
3770 { Bad_Opcode },
3771 { "comisd", { XM, EXq }, 0 },
3772 },
3773
3774 /* PREFIX_0F51 */
3775 {
3776 { "sqrtps", { XM, EXx }, PREFIX_OPCODE },
3777 { "sqrtss", { XM, EXd }, PREFIX_OPCODE },
3778 { "sqrtpd", { XM, EXx }, PREFIX_OPCODE },
3779 { "sqrtsd", { XM, EXq }, PREFIX_OPCODE },
3780 },
3781
3782 /* PREFIX_0F52 */
3783 {
3784 { "rsqrtps",{ XM, EXx }, PREFIX_OPCODE },
3785 { "rsqrtss",{ XM, EXd }, PREFIX_OPCODE },
3786 },
3787
3788 /* PREFIX_0F53 */
3789 {
3790 { "rcpps", { XM, EXx }, PREFIX_OPCODE },
3791 { "rcpss", { XM, EXd }, PREFIX_OPCODE },
3792 },
3793
3794 /* PREFIX_0F58 */
3795 {
3796 { "addps", { XM, EXx }, PREFIX_OPCODE },
3797 { "addss", { XM, EXd }, PREFIX_OPCODE },
3798 { "addpd", { XM, EXx }, PREFIX_OPCODE },
3799 { "addsd", { XM, EXq }, PREFIX_OPCODE },
3800 },
3801
3802 /* PREFIX_0F59 */
3803 {
3804 { "mulps", { XM, EXx }, PREFIX_OPCODE },
3805 { "mulss", { XM, EXd }, PREFIX_OPCODE },
3806 { "mulpd", { XM, EXx }, PREFIX_OPCODE },
3807 { "mulsd", { XM, EXq }, PREFIX_OPCODE },
3808 },
3809
3810 /* PREFIX_0F5A */
3811 {
3812 { "cvtps2pd", { XM, EXq }, PREFIX_OPCODE },
3813 { "cvtss2sd", { XM, EXd }, PREFIX_OPCODE },
3814 { "cvtpd2ps", { XM, EXx }, PREFIX_OPCODE },
3815 { "cvtsd2ss", { XM, EXq }, PREFIX_OPCODE },
3816 },
3817
3818 /* PREFIX_0F5B */
3819 {
3820 { "cvtdq2ps", { XM, EXx }, PREFIX_OPCODE },
3821 { "cvttps2dq", { XM, EXx }, PREFIX_OPCODE },
3822 { "cvtps2dq", { XM, EXx }, PREFIX_OPCODE },
3823 },
3824
3825 /* PREFIX_0F5C */
3826 {
3827 { "subps", { XM, EXx }, PREFIX_OPCODE },
3828 { "subss", { XM, EXd }, PREFIX_OPCODE },
3829 { "subpd", { XM, EXx }, PREFIX_OPCODE },
3830 { "subsd", { XM, EXq }, PREFIX_OPCODE },
3831 },
3832
3833 /* PREFIX_0F5D */
3834 {
3835 { "minps", { XM, EXx }, PREFIX_OPCODE },
3836 { "minss", { XM, EXd }, PREFIX_OPCODE },
3837 { "minpd", { XM, EXx }, PREFIX_OPCODE },
3838 { "minsd", { XM, EXq }, PREFIX_OPCODE },
3839 },
3840
3841 /* PREFIX_0F5E */
3842 {
3843 { "divps", { XM, EXx }, PREFIX_OPCODE },
3844 { "divss", { XM, EXd }, PREFIX_OPCODE },
3845 { "divpd", { XM, EXx }, PREFIX_OPCODE },
3846 { "divsd", { XM, EXq }, PREFIX_OPCODE },
3847 },
3848
3849 /* PREFIX_0F5F */
3850 {
3851 { "maxps", { XM, EXx }, PREFIX_OPCODE },
3852 { "maxss", { XM, EXd }, PREFIX_OPCODE },
3853 { "maxpd", { XM, EXx }, PREFIX_OPCODE },
3854 { "maxsd", { XM, EXq }, PREFIX_OPCODE },
3855 },
3856
3857 /* PREFIX_0F60 */
3858 {
3859 { "punpcklbw",{ MX, EMd }, PREFIX_OPCODE },
3860 { Bad_Opcode },
3861 { "punpcklbw",{ MX, EMx }, PREFIX_OPCODE },
3862 },
3863
3864 /* PREFIX_0F61 */
3865 {
3866 { "punpcklwd",{ MX, EMd }, PREFIX_OPCODE },
3867 { Bad_Opcode },
3868 { "punpcklwd",{ MX, EMx }, PREFIX_OPCODE },
3869 },
3870
3871 /* PREFIX_0F62 */
3872 {
3873 { "punpckldq",{ MX, EMd }, PREFIX_OPCODE },
3874 { Bad_Opcode },
3875 { "punpckldq",{ MX, EMx }, PREFIX_OPCODE },
3876 },
3877
3878 /* PREFIX_0F6C */
3879 {
3880 { Bad_Opcode },
3881 { Bad_Opcode },
3882 { "punpcklqdq", { XM, EXx }, PREFIX_OPCODE },
3883 },
3884
3885 /* PREFIX_0F6D */
3886 {
3887 { Bad_Opcode },
3888 { Bad_Opcode },
3889 { "punpckhqdq", { XM, EXx }, PREFIX_OPCODE },
3890 },
3891
3892 /* PREFIX_0F6F */
3893 {
3894 { "movq", { MX, EM }, PREFIX_OPCODE },
3895 { "movdqu", { XM, EXx }, PREFIX_OPCODE },
3896 { "movdqa", { XM, EXx }, PREFIX_OPCODE },
3897 },
3898
3899 /* PREFIX_0F70 */
3900 {
3901 { "pshufw", { MX, EM, Ib }, PREFIX_OPCODE },
3902 { "pshufhw",{ XM, EXx, Ib }, PREFIX_OPCODE },
3903 { "pshufd", { XM, EXx, Ib }, PREFIX_OPCODE },
3904 { "pshuflw",{ XM, EXx, Ib }, PREFIX_OPCODE },
3905 },
3906
3907 /* PREFIX_0F73_REG_3 */
3908 {
3909 { Bad_Opcode },
3910 { Bad_Opcode },
3911 { "psrldq", { XS, Ib }, 0 },
3912 },
3913
3914 /* PREFIX_0F73_REG_7 */
3915 {
3916 { Bad_Opcode },
3917 { Bad_Opcode },
3918 { "pslldq", { XS, Ib }, 0 },
3919 },
3920
3921 /* PREFIX_0F78 */
3922 {
3923 {"vmread", { Em, Gm }, 0 },
3924 { Bad_Opcode },
3925 {"extrq", { XS, Ib, Ib }, 0 },
3926 {"insertq", { XM, XS, Ib, Ib }, 0 },
3927 },
3928
3929 /* PREFIX_0F79 */
3930 {
3931 {"vmwrite", { Gm, Em }, 0 },
3932 { Bad_Opcode },
3933 {"extrq", { XM, XS }, 0 },
3934 {"insertq", { XM, XS }, 0 },
3935 },
3936
3937 /* PREFIX_0F7C */
3938 {
3939 { Bad_Opcode },
3940 { Bad_Opcode },
3941 { "haddpd", { XM, EXx }, PREFIX_OPCODE },
3942 { "haddps", { XM, EXx }, PREFIX_OPCODE },
3943 },
3944
3945 /* PREFIX_0F7D */
3946 {
3947 { Bad_Opcode },
3948 { Bad_Opcode },
3949 { "hsubpd", { XM, EXx }, PREFIX_OPCODE },
3950 { "hsubps", { XM, EXx }, PREFIX_OPCODE },
3951 },
3952
3953 /* PREFIX_0F7E */
3954 {
3955 { "movK", { Edq, MX }, PREFIX_OPCODE },
3956 { "movq", { XM, EXq }, PREFIX_OPCODE },
3957 { "movK", { Edq, XM }, PREFIX_OPCODE },
3958 },
3959
3960 /* PREFIX_0F7F */
3961 {
3962 { "movq", { EMS, MX }, PREFIX_OPCODE },
3963 { "movdqu", { EXxS, XM }, PREFIX_OPCODE },
3964 { "movdqa", { EXxS, XM }, PREFIX_OPCODE },
3965 },
3966
3967 /* PREFIX_0FAE_REG_0 */
3968 {
3969 { Bad_Opcode },
3970 { "rdfsbase", { Ev }, 0 },
3971 },
3972
3973 /* PREFIX_0FAE_REG_1 */
3974 {
3975 { Bad_Opcode },
3976 { "rdgsbase", { Ev }, 0 },
3977 },
3978
3979 /* PREFIX_0FAE_REG_2 */
3980 {
3981 { Bad_Opcode },
3982 { "wrfsbase", { Ev }, 0 },
3983 },
3984
3985 /* PREFIX_0FAE_REG_3 */
3986 {
3987 { Bad_Opcode },
3988 { "wrgsbase", { Ev }, 0 },
3989 },
3990
3991 /* PREFIX_MOD_0_0FAE_REG_4 */
3992 {
3993 { "xsave", { FXSAVE }, 0 },
3994 { "ptwrite%LQ", { Edq }, 0 },
3995 },
3996
3997 /* PREFIX_MOD_3_0FAE_REG_4 */
3998 {
3999 { Bad_Opcode },
4000 { "ptwrite%LQ", { Edq }, 0 },
4001 },
4002
4003 /* PREFIX_MOD_0_0FAE_REG_5 */
4004 {
4005 { "xrstor", { FXSAVE }, PREFIX_OPCODE },
4006 },
4007
4008 /* PREFIX_MOD_3_0FAE_REG_5 */
4009 {
4010 { "lfence", { Skip_MODRM }, 0 },
4011 { "incsspK", { Rdq }, PREFIX_OPCODE },
4012 },
4013
4014 /* PREFIX_MOD_0_0FAE_REG_6 */
4015 {
4016 { "xsaveopt", { FXSAVE }, PREFIX_OPCODE },
4017 { "clrssbsy", { Mq }, PREFIX_OPCODE },
4018 { "clwb", { Mb }, PREFIX_OPCODE },
4019 },
4020
4021 /* PREFIX_MOD_1_0FAE_REG_6 */
4022 {
4023 { RM_TABLE (RM_0FAE_REG_6) },
4024 { "umonitor", { Eva }, PREFIX_OPCODE },
4025 { "tpause", { Edq }, PREFIX_OPCODE },
4026 { "umwait", { Edq }, PREFIX_OPCODE },
4027 },
4028
4029 /* PREFIX_0FAE_REG_7 */
4030 {
4031 { "clflush", { Mb }, 0 },
4032 { Bad_Opcode },
4033 { "clflushopt", { Mb }, 0 },
4034 },
4035
4036 /* PREFIX_0FB8 */
4037 {
4038 { Bad_Opcode },
4039 { "popcntS", { Gv, Ev }, 0 },
4040 },
4041
4042 /* PREFIX_0FBC */
4043 {
4044 { "bsfS", { Gv, Ev }, 0 },
4045 { "tzcntS", { Gv, Ev }, 0 },
4046 { "bsfS", { Gv, Ev }, 0 },
4047 },
4048
4049 /* PREFIX_0FBD */
4050 {
4051 { "bsrS", { Gv, Ev }, 0 },
4052 { "lzcntS", { Gv, Ev }, 0 },
4053 { "bsrS", { Gv, Ev }, 0 },
4054 },
4055
4056 /* PREFIX_0FC2 */
4057 {
4058 { "cmpps", { XM, EXx, CMP }, PREFIX_OPCODE },
4059 { "cmpss", { XM, EXd, CMP }, PREFIX_OPCODE },
4060 { "cmppd", { XM, EXx, CMP }, PREFIX_OPCODE },
4061 { "cmpsd", { XM, EXq, CMP }, PREFIX_OPCODE },
4062 },
4063
4064 /* PREFIX_MOD_0_0FC3 */
4065 {
4066 { "movntiS", { Ev, Gv }, PREFIX_OPCODE },
4067 },
4068
4069 /* PREFIX_MOD_0_0FC7_REG_6 */
4070 {
4071 { "vmptrld",{ Mq }, 0 },
4072 { "vmxon", { Mq }, 0 },
4073 { "vmclear",{ Mq }, 0 },
4074 },
4075
4076 /* PREFIX_MOD_3_0FC7_REG_6 */
4077 {
4078 { "rdrand", { Ev }, 0 },
4079 { Bad_Opcode },
4080 { "rdrand", { Ev }, 0 }
4081 },
4082
4083 /* PREFIX_MOD_3_0FC7_REG_7 */
4084 {
4085 { "rdseed", { Ev }, 0 },
4086 { "rdpid", { Em }, 0 },
4087 { "rdseed", { Ev }, 0 },
4088 },
4089
4090 /* PREFIX_0FD0 */
4091 {
4092 { Bad_Opcode },
4093 { Bad_Opcode },
4094 { "addsubpd", { XM, EXx }, 0 },
4095 { "addsubps", { XM, EXx }, 0 },
4096 },
4097
4098 /* PREFIX_0FD6 */
4099 {
4100 { Bad_Opcode },
4101 { "movq2dq",{ XM, MS }, 0 },
4102 { "movq", { EXqS, XM }, 0 },
4103 { "movdq2q",{ MX, XS }, 0 },
4104 },
4105
4106 /* PREFIX_0FE6 */
4107 {
4108 { Bad_Opcode },
4109 { "cvtdq2pd", { XM, EXq }, PREFIX_OPCODE },
4110 { "cvttpd2dq", { XM, EXx }, PREFIX_OPCODE },
4111 { "cvtpd2dq", { XM, EXx }, PREFIX_OPCODE },
4112 },
4113
4114 /* PREFIX_0FE7 */
4115 {
4116 { "movntq", { Mq, MX }, PREFIX_OPCODE },
4117 { Bad_Opcode },
4118 { MOD_TABLE (MOD_0FE7_PREFIX_2) },
4119 },
4120
4121 /* PREFIX_0FF0 */
4122 {
4123 { Bad_Opcode },
4124 { Bad_Opcode },
4125 { Bad_Opcode },
4126 { MOD_TABLE (MOD_0FF0_PREFIX_3) },
4127 },
4128
4129 /* PREFIX_0FF7 */
4130 {
4131 { "maskmovq", { MX, MS }, PREFIX_OPCODE },
4132 { Bad_Opcode },
4133 { "maskmovdqu", { XM, XS }, PREFIX_OPCODE },
4134 },
4135
4136 /* PREFIX_0F3810 */
4137 {
4138 { Bad_Opcode },
4139 { Bad_Opcode },
4140 { "pblendvb", { XM, EXx, XMM0 }, PREFIX_OPCODE },
4141 },
4142
4143 /* PREFIX_0F3814 */
4144 {
4145 { Bad_Opcode },
4146 { Bad_Opcode },
4147 { "blendvps", { XM, EXx, XMM0 }, PREFIX_OPCODE },
4148 },
4149
4150 /* PREFIX_0F3815 */
4151 {
4152 { Bad_Opcode },
4153 { Bad_Opcode },
4154 { "blendvpd", { XM, EXx, XMM0 }, PREFIX_OPCODE },
4155 },
4156
4157 /* PREFIX_0F3817 */
4158 {
4159 { Bad_Opcode },
4160 { Bad_Opcode },
4161 { "ptest", { XM, EXx }, PREFIX_OPCODE },
4162 },
4163
4164 /* PREFIX_0F3820 */
4165 {
4166 { Bad_Opcode },
4167 { Bad_Opcode },
4168 { "pmovsxbw", { XM, EXq }, PREFIX_OPCODE },
4169 },
4170
4171 /* PREFIX_0F3821 */
4172 {
4173 { Bad_Opcode },
4174 { Bad_Opcode },
4175 { "pmovsxbd", { XM, EXd }, PREFIX_OPCODE },
4176 },
4177
4178 /* PREFIX_0F3822 */
4179 {
4180 { Bad_Opcode },
4181 { Bad_Opcode },
4182 { "pmovsxbq", { XM, EXw }, PREFIX_OPCODE },
4183 },
4184
4185 /* PREFIX_0F3823 */
4186 {
4187 { Bad_Opcode },
4188 { Bad_Opcode },
4189 { "pmovsxwd", { XM, EXq }, PREFIX_OPCODE },
4190 },
4191
4192 /* PREFIX_0F3824 */
4193 {
4194 { Bad_Opcode },
4195 { Bad_Opcode },
4196 { "pmovsxwq", { XM, EXd }, PREFIX_OPCODE },
4197 },
4198
4199 /* PREFIX_0F3825 */
4200 {
4201 { Bad_Opcode },
4202 { Bad_Opcode },
4203 { "pmovsxdq", { XM, EXq }, PREFIX_OPCODE },
4204 },
4205
4206 /* PREFIX_0F3828 */
4207 {
4208 { Bad_Opcode },
4209 { Bad_Opcode },
4210 { "pmuldq", { XM, EXx }, PREFIX_OPCODE },
4211 },
4212
4213 /* PREFIX_0F3829 */
4214 {
4215 { Bad_Opcode },
4216 { Bad_Opcode },
4217 { "pcmpeqq", { XM, EXx }, PREFIX_OPCODE },
4218 },
4219
4220 /* PREFIX_0F382A */
4221 {
4222 { Bad_Opcode },
4223 { Bad_Opcode },
4224 { MOD_TABLE (MOD_0F382A_PREFIX_2) },
4225 },
4226
4227 /* PREFIX_0F382B */
4228 {
4229 { Bad_Opcode },
4230 { Bad_Opcode },
4231 { "packusdw", { XM, EXx }, PREFIX_OPCODE },
4232 },
4233
4234 /* PREFIX_0F3830 */
4235 {
4236 { Bad_Opcode },
4237 { Bad_Opcode },
4238 { "pmovzxbw", { XM, EXq }, PREFIX_OPCODE },
4239 },
4240
4241 /* PREFIX_0F3831 */
4242 {
4243 { Bad_Opcode },
4244 { Bad_Opcode },
4245 { "pmovzxbd", { XM, EXd }, PREFIX_OPCODE },
4246 },
4247
4248 /* PREFIX_0F3832 */
4249 {
4250 { Bad_Opcode },
4251 { Bad_Opcode },
4252 { "pmovzxbq", { XM, EXw }, PREFIX_OPCODE },
4253 },
4254
4255 /* PREFIX_0F3833 */
4256 {
4257 { Bad_Opcode },
4258 { Bad_Opcode },
4259 { "pmovzxwd", { XM, EXq }, PREFIX_OPCODE },
4260 },
4261
4262 /* PREFIX_0F3834 */
4263 {
4264 { Bad_Opcode },
4265 { Bad_Opcode },
4266 { "pmovzxwq", { XM, EXd }, PREFIX_OPCODE },
4267 },
4268
4269 /* PREFIX_0F3835 */
4270 {
4271 { Bad_Opcode },
4272 { Bad_Opcode },
4273 { "pmovzxdq", { XM, EXq }, PREFIX_OPCODE },
4274 },
4275
4276 /* PREFIX_0F3837 */
4277 {
4278 { Bad_Opcode },
4279 { Bad_Opcode },
4280 { "pcmpgtq", { XM, EXx }, PREFIX_OPCODE },
4281 },
4282
4283 /* PREFIX_0F3838 */
4284 {
4285 { Bad_Opcode },
4286 { Bad_Opcode },
4287 { "pminsb", { XM, EXx }, PREFIX_OPCODE },
4288 },
4289
4290 /* PREFIX_0F3839 */
4291 {
4292 { Bad_Opcode },
4293 { Bad_Opcode },
4294 { "pminsd", { XM, EXx }, PREFIX_OPCODE },
4295 },
4296
4297 /* PREFIX_0F383A */
4298 {
4299 { Bad_Opcode },
4300 { Bad_Opcode },
4301 { "pminuw", { XM, EXx }, PREFIX_OPCODE },
4302 },
4303
4304 /* PREFIX_0F383B */
4305 {
4306 { Bad_Opcode },
4307 { Bad_Opcode },
4308 { "pminud", { XM, EXx }, PREFIX_OPCODE },
4309 },
4310
4311 /* PREFIX_0F383C */
4312 {
4313 { Bad_Opcode },
4314 { Bad_Opcode },
4315 { "pmaxsb", { XM, EXx }, PREFIX_OPCODE },
4316 },
4317
4318 /* PREFIX_0F383D */
4319 {
4320 { Bad_Opcode },
4321 { Bad_Opcode },
4322 { "pmaxsd", { XM, EXx }, PREFIX_OPCODE },
4323 },
4324
4325 /* PREFIX_0F383E */
4326 {
4327 { Bad_Opcode },
4328 { Bad_Opcode },
4329 { "pmaxuw", { XM, EXx }, PREFIX_OPCODE },
4330 },
4331
4332 /* PREFIX_0F383F */
4333 {
4334 { Bad_Opcode },
4335 { Bad_Opcode },
4336 { "pmaxud", { XM, EXx }, PREFIX_OPCODE },
4337 },
4338
4339 /* PREFIX_0F3840 */
4340 {
4341 { Bad_Opcode },
4342 { Bad_Opcode },
4343 { "pmulld", { XM, EXx }, PREFIX_OPCODE },
4344 },
4345
4346 /* PREFIX_0F3841 */
4347 {
4348 { Bad_Opcode },
4349 { Bad_Opcode },
4350 { "phminposuw", { XM, EXx }, PREFIX_OPCODE },
4351 },
4352
4353 /* PREFIX_0F3880 */
4354 {
4355 { Bad_Opcode },
4356 { Bad_Opcode },
4357 { "invept", { Gm, Mo }, PREFIX_OPCODE },
4358 },
4359
4360 /* PREFIX_0F3881 */
4361 {
4362 { Bad_Opcode },
4363 { Bad_Opcode },
4364 { "invvpid", { Gm, Mo }, PREFIX_OPCODE },
4365 },
4366
4367 /* PREFIX_0F3882 */
4368 {
4369 { Bad_Opcode },
4370 { Bad_Opcode },
4371 { "invpcid", { Gm, M }, PREFIX_OPCODE },
4372 },
4373
4374 /* PREFIX_0F38C8 */
4375 {
4376 { "sha1nexte", { XM, EXxmm }, PREFIX_OPCODE },
4377 },
4378
4379 /* PREFIX_0F38C9 */
4380 {
4381 { "sha1msg1", { XM, EXxmm }, PREFIX_OPCODE },
4382 },
4383
4384 /* PREFIX_0F38CA */
4385 {
4386 { "sha1msg2", { XM, EXxmm }, PREFIX_OPCODE },
4387 },
4388
4389 /* PREFIX_0F38CB */
4390 {
4391 { "sha256rnds2", { XM, EXxmm, XMM0 }, PREFIX_OPCODE },
4392 },
4393
4394 /* PREFIX_0F38CC */
4395 {
4396 { "sha256msg1", { XM, EXxmm }, PREFIX_OPCODE },
4397 },
4398
4399 /* PREFIX_0F38CD */
4400 {
4401 { "sha256msg2", { XM, EXxmm }, PREFIX_OPCODE },
4402 },
4403
4404 /* PREFIX_0F38CF */
4405 {
4406 { Bad_Opcode },
4407 { Bad_Opcode },
4408 { "gf2p8mulb", { XM, EXxmm }, PREFIX_OPCODE },
4409 },
4410
4411 /* PREFIX_0F38DB */
4412 {
4413 { Bad_Opcode },
4414 { Bad_Opcode },
4415 { "aesimc", { XM, EXx }, PREFIX_OPCODE },
4416 },
4417
4418 /* PREFIX_0F38DC */
4419 {
4420 { Bad_Opcode },
4421 { Bad_Opcode },
4422 { "aesenc", { XM, EXx }, PREFIX_OPCODE },
4423 },
4424
4425 /* PREFIX_0F38DD */
4426 {
4427 { Bad_Opcode },
4428 { Bad_Opcode },
4429 { "aesenclast", { XM, EXx }, PREFIX_OPCODE },
4430 },
4431
4432 /* PREFIX_0F38DE */
4433 {
4434 { Bad_Opcode },
4435 { Bad_Opcode },
4436 { "aesdec", { XM, EXx }, PREFIX_OPCODE },
4437 },
4438
4439 /* PREFIX_0F38DF */
4440 {
4441 { Bad_Opcode },
4442 { Bad_Opcode },
4443 { "aesdeclast", { XM, EXx }, PREFIX_OPCODE },
4444 },
4445
4446 /* PREFIX_0F38F0 */
4447 {
4448 { "movbeS", { Gv, { MOVBE_Fixup, v_mode } }, PREFIX_OPCODE },
4449 { Bad_Opcode },
4450 { "movbeS", { Gv, { MOVBE_Fixup, v_mode } }, PREFIX_OPCODE },
4451 { "crc32", { Gdq, { CRC32_Fixup, b_mode } }, PREFIX_OPCODE },
4452 },
4453
4454 /* PREFIX_0F38F1 */
4455 {
4456 { "movbeS", { { MOVBE_Fixup, v_mode }, Gv }, PREFIX_OPCODE },
4457 { Bad_Opcode },
4458 { "movbeS", { { MOVBE_Fixup, v_mode }, Gv }, PREFIX_OPCODE },
4459 { "crc32", { Gdq, { CRC32_Fixup, v_mode } }, PREFIX_OPCODE },
4460 },
4461
4462 /* PREFIX_0F38F5 */
4463 {
4464 { Bad_Opcode },
4465 { Bad_Opcode },
4466 { MOD_TABLE (MOD_0F38F5_PREFIX_2) },
4467 },
4468
4469 /* PREFIX_0F38F6 */
4470 {
4471 { MOD_TABLE (MOD_0F38F6_PREFIX_0) },
4472 { "adoxS", { Gdq, Edq}, PREFIX_OPCODE },
4473 { "adcxS", { Gdq, Edq}, PREFIX_OPCODE },
4474 { Bad_Opcode },
4475 },
4476
4477 /* PREFIX_0F38F8 */
4478 {
4479 { Bad_Opcode },
4480 { MOD_TABLE (MOD_0F38F8_PREFIX_1) },
4481 { MOD_TABLE (MOD_0F38F8_PREFIX_2) },
4482 { MOD_TABLE (MOD_0F38F8_PREFIX_3) },
4483 },
4484
4485 /* PREFIX_0F38F9 */
4486 {
4487 { MOD_TABLE (MOD_0F38F9_PREFIX_0) },
4488 },
4489
4490 /* PREFIX_0F3A08 */
4491 {
4492 { Bad_Opcode },
4493 { Bad_Opcode },
4494 { "roundps", { XM, EXx, Ib }, PREFIX_OPCODE },
4495 },
4496
4497 /* PREFIX_0F3A09 */
4498 {
4499 { Bad_Opcode },
4500 { Bad_Opcode },
4501 { "roundpd", { XM, EXx, Ib }, PREFIX_OPCODE },
4502 },
4503
4504 /* PREFIX_0F3A0A */
4505 {
4506 { Bad_Opcode },
4507 { Bad_Opcode },
4508 { "roundss", { XM, EXd, Ib }, PREFIX_OPCODE },
4509 },
4510
4511 /* PREFIX_0F3A0B */
4512 {
4513 { Bad_Opcode },
4514 { Bad_Opcode },
4515 { "roundsd", { XM, EXq, Ib }, PREFIX_OPCODE },
4516 },
4517
4518 /* PREFIX_0F3A0C */
4519 {
4520 { Bad_Opcode },
4521 { Bad_Opcode },
4522 { "blendps", { XM, EXx, Ib }, PREFIX_OPCODE },
4523 },
4524
4525 /* PREFIX_0F3A0D */
4526 {
4527 { Bad_Opcode },
4528 { Bad_Opcode },
4529 { "blendpd", { XM, EXx, Ib }, PREFIX_OPCODE },
4530 },
4531
4532 /* PREFIX_0F3A0E */
4533 {
4534 { Bad_Opcode },
4535 { Bad_Opcode },
4536 { "pblendw", { XM, EXx, Ib }, PREFIX_OPCODE },
4537 },
4538
4539 /* PREFIX_0F3A14 */
4540 {
4541 { Bad_Opcode },
4542 { Bad_Opcode },
4543 { "pextrb", { Edqb, XM, Ib }, PREFIX_OPCODE },
4544 },
4545
4546 /* PREFIX_0F3A15 */
4547 {
4548 { Bad_Opcode },
4549 { Bad_Opcode },
4550 { "pextrw", { Edqw, XM, Ib }, PREFIX_OPCODE },
4551 },
4552
4553 /* PREFIX_0F3A16 */
4554 {
4555 { Bad_Opcode },
4556 { Bad_Opcode },
4557 { "pextrK", { Edq, XM, Ib }, PREFIX_OPCODE },
4558 },
4559
4560 /* PREFIX_0F3A17 */
4561 {
4562 { Bad_Opcode },
4563 { Bad_Opcode },
4564 { "extractps", { Edqd, XM, Ib }, PREFIX_OPCODE },
4565 },
4566
4567 /* PREFIX_0F3A20 */
4568 {
4569 { Bad_Opcode },
4570 { Bad_Opcode },
4571 { "pinsrb", { XM, Edqb, Ib }, PREFIX_OPCODE },
4572 },
4573
4574 /* PREFIX_0F3A21 */
4575 {
4576 { Bad_Opcode },
4577 { Bad_Opcode },
4578 { "insertps", { XM, EXd, Ib }, PREFIX_OPCODE },
4579 },
4580
4581 /* PREFIX_0F3A22 */
4582 {
4583 { Bad_Opcode },
4584 { Bad_Opcode },
4585 { "pinsrK", { XM, Edq, Ib }, PREFIX_OPCODE },
4586 },
4587
4588 /* PREFIX_0F3A40 */
4589 {
4590 { Bad_Opcode },
4591 { Bad_Opcode },
4592 { "dpps", { XM, EXx, Ib }, PREFIX_OPCODE },
4593 },
4594
4595 /* PREFIX_0F3A41 */
4596 {
4597 { Bad_Opcode },
4598 { Bad_Opcode },
4599 { "dppd", { XM, EXx, Ib }, PREFIX_OPCODE },
4600 },
4601
4602 /* PREFIX_0F3A42 */
4603 {
4604 { Bad_Opcode },
4605 { Bad_Opcode },
4606 { "mpsadbw", { XM, EXx, Ib }, PREFIX_OPCODE },
4607 },
4608
4609 /* PREFIX_0F3A44 */
4610 {
4611 { Bad_Opcode },
4612 { Bad_Opcode },
4613 { "pclmulqdq", { XM, EXx, PCLMUL }, PREFIX_OPCODE },
4614 },
4615
4616 /* PREFIX_0F3A60 */
4617 {
4618 { Bad_Opcode },
4619 { Bad_Opcode },
4620 { "pcmpestrm", { XM, { PCMPESTR_Fixup, x_mode }, Ib }, PREFIX_OPCODE },
4621 },
4622
4623 /* PREFIX_0F3A61 */
4624 {
4625 { Bad_Opcode },
4626 { Bad_Opcode },
4627 { "pcmpestri", { XM, { PCMPESTR_Fixup, x_mode }, Ib }, PREFIX_OPCODE },
4628 },
4629
4630 /* PREFIX_0F3A62 */
4631 {
4632 { Bad_Opcode },
4633 { Bad_Opcode },
4634 { "pcmpistrm", { XM, EXx, Ib }, PREFIX_OPCODE },
4635 },
4636
4637 /* PREFIX_0F3A63 */
4638 {
4639 { Bad_Opcode },
4640 { Bad_Opcode },
4641 { "pcmpistri", { XM, EXx, Ib }, PREFIX_OPCODE },
4642 },
4643
4644 /* PREFIX_0F3ACC */
4645 {
4646 { "sha1rnds4", { XM, EXxmm, Ib }, PREFIX_OPCODE },
4647 },
4648
4649 /* PREFIX_0F3ACE */
4650 {
4651 { Bad_Opcode },
4652 { Bad_Opcode },
4653 { "gf2p8affineqb", { XM, EXxmm, Ib }, PREFIX_OPCODE },
4654 },
4655
4656 /* PREFIX_0F3ACF */
4657 {
4658 { Bad_Opcode },
4659 { Bad_Opcode },
4660 { "gf2p8affineinvqb", { XM, EXxmm, Ib }, PREFIX_OPCODE },
4661 },
4662
4663 /* PREFIX_0F3ADF */
4664 {
4665 { Bad_Opcode },
4666 { Bad_Opcode },
4667 { "aeskeygenassist", { XM, EXx, Ib }, PREFIX_OPCODE },
4668 },
4669
4670 /* PREFIX_VEX_0F10 */
4671 {
4672 { "vmovups", { XM, EXx }, 0 },
4673 { "vmovss", { XMVexScalar, VexScalar, EXdScalar }, 0 },
4674 { "vmovupd", { XM, EXx }, 0 },
4675 { "vmovsd", { XMVexScalar, VexScalar, EXqScalar }, 0 },
4676 },
4677
4678 /* PREFIX_VEX_0F11 */
4679 {
4680 { "vmovups", { EXxS, XM }, 0 },
4681 { "vmovss", { EXdVexScalarS, VexScalar, XMScalar }, 0 },
4682 { "vmovupd", { EXxS, XM }, 0 },
4683 { "vmovsd", { EXqVexScalarS, VexScalar, XMScalar }, 0 },
4684 },
4685
4686 /* PREFIX_VEX_0F12 */
4687 {
4688 { MOD_TABLE (MOD_VEX_0F12_PREFIX_0) },
4689 { "vmovsldup", { XM, EXx }, 0 },
4690 { VEX_LEN_TABLE (VEX_LEN_0F12_P_2) },
4691 { "vmovddup", { XM, EXymmq }, 0 },
4692 },
4693
4694 /* PREFIX_VEX_0F16 */
4695 {
4696 { MOD_TABLE (MOD_VEX_0F16_PREFIX_0) },
4697 { "vmovshdup", { XM, EXx }, 0 },
4698 { VEX_LEN_TABLE (VEX_LEN_0F16_P_2) },
4699 },
4700
4701 /* PREFIX_VEX_0F2A */
4702 {
4703 { Bad_Opcode },
4704 { VEX_LEN_TABLE (VEX_LEN_0F2A_P_1) },
4705 { Bad_Opcode },
4706 { VEX_LEN_TABLE (VEX_LEN_0F2A_P_3) },
4707 },
4708
4709 /* PREFIX_VEX_0F2C */
4710 {
4711 { Bad_Opcode },
4712 { VEX_LEN_TABLE (VEX_LEN_0F2C_P_1) },
4713 { Bad_Opcode },
4714 { VEX_LEN_TABLE (VEX_LEN_0F2C_P_3) },
4715 },
4716
4717 /* PREFIX_VEX_0F2D */
4718 {
4719 { Bad_Opcode },
4720 { VEX_LEN_TABLE (VEX_LEN_0F2D_P_1) },
4721 { Bad_Opcode },
4722 { VEX_LEN_TABLE (VEX_LEN_0F2D_P_3) },
4723 },
4724
4725 /* PREFIX_VEX_0F2E */
4726 {
4727 { "vucomiss", { XMScalar, EXdScalar }, 0 },
4728 { Bad_Opcode },
4729 { "vucomisd", { XMScalar, EXqScalar }, 0 },
4730 },
4731
4732 /* PREFIX_VEX_0F2F */
4733 {
4734 { "vcomiss", { XMScalar, EXdScalar }, 0 },
4735 { Bad_Opcode },
4736 { "vcomisd", { XMScalar, EXqScalar }, 0 },
4737 },
4738
4739 /* PREFIX_VEX_0F41 */
4740 {
4741 { VEX_LEN_TABLE (VEX_LEN_0F41_P_0) },
4742 { Bad_Opcode },
4743 { VEX_LEN_TABLE (VEX_LEN_0F41_P_2) },
4744 },
4745
4746 /* PREFIX_VEX_0F42 */
4747 {
4748 { VEX_LEN_TABLE (VEX_LEN_0F42_P_0) },
4749 { Bad_Opcode },
4750 { VEX_LEN_TABLE (VEX_LEN_0F42_P_2) },
4751 },
4752
4753 /* PREFIX_VEX_0F44 */
4754 {
4755 { VEX_LEN_TABLE (VEX_LEN_0F44_P_0) },
4756 { Bad_Opcode },
4757 { VEX_LEN_TABLE (VEX_LEN_0F44_P_2) },
4758 },
4759
4760 /* PREFIX_VEX_0F45 */
4761 {
4762 { VEX_LEN_TABLE (VEX_LEN_0F45_P_0) },
4763 { Bad_Opcode },
4764 { VEX_LEN_TABLE (VEX_LEN_0F45_P_2) },
4765 },
4766
4767 /* PREFIX_VEX_0F46 */
4768 {
4769 { VEX_LEN_TABLE (VEX_LEN_0F46_P_0) },
4770 { Bad_Opcode },
4771 { VEX_LEN_TABLE (VEX_LEN_0F46_P_2) },
4772 },
4773
4774 /* PREFIX_VEX_0F47 */
4775 {
4776 { VEX_LEN_TABLE (VEX_LEN_0F47_P_0) },
4777 { Bad_Opcode },
4778 { VEX_LEN_TABLE (VEX_LEN_0F47_P_2) },
4779 },
4780
4781 /* PREFIX_VEX_0F4A */
4782 {
4783 { VEX_LEN_TABLE (VEX_LEN_0F4A_P_0) },
4784 { Bad_Opcode },
4785 { VEX_LEN_TABLE (VEX_LEN_0F4A_P_2) },
4786 },
4787
4788 /* PREFIX_VEX_0F4B */
4789 {
4790 { VEX_LEN_TABLE (VEX_LEN_0F4B_P_0) },
4791 { Bad_Opcode },
4792 { VEX_LEN_TABLE (VEX_LEN_0F4B_P_2) },
4793 },
4794
4795 /* PREFIX_VEX_0F51 */
4796 {
4797 { "vsqrtps", { XM, EXx }, 0 },
4798 { "vsqrtss", { XMScalar, VexScalar, EXdScalar }, 0 },
4799 { "vsqrtpd", { XM, EXx }, 0 },
4800 { "vsqrtsd", { XMScalar, VexScalar, EXqScalar }, 0 },
4801 },
4802
4803 /* PREFIX_VEX_0F52 */
4804 {
4805 { "vrsqrtps", { XM, EXx }, 0 },
4806 { "vrsqrtss", { XMScalar, VexScalar, EXdScalar }, 0 },
4807 },
4808
4809 /* PREFIX_VEX_0F53 */
4810 {
4811 { "vrcpps", { XM, EXx }, 0 },
4812 { "vrcpss", { XMScalar, VexScalar, EXdScalar }, 0 },
4813 },
4814
4815 /* PREFIX_VEX_0F58 */
4816 {
4817 { "vaddps", { XM, Vex, EXx }, 0 },
4818 { "vaddss", { XMScalar, VexScalar, EXdScalar }, 0 },
4819 { "vaddpd", { XM, Vex, EXx }, 0 },
4820 { "vaddsd", { XMScalar, VexScalar, EXqScalar }, 0 },
4821 },
4822
4823 /* PREFIX_VEX_0F59 */
4824 {
4825 { "vmulps", { XM, Vex, EXx }, 0 },
4826 { "vmulss", { XMScalar, VexScalar, EXdScalar }, 0 },
4827 { "vmulpd", { XM, Vex, EXx }, 0 },
4828 { "vmulsd", { XMScalar, VexScalar, EXqScalar }, 0 },
4829 },
4830
4831 /* PREFIX_VEX_0F5A */
4832 {
4833 { "vcvtps2pd", { XM, EXxmmq }, 0 },
4834 { "vcvtss2sd", { XMScalar, VexScalar, EXdScalar }, 0 },
4835 { "vcvtpd2ps%XY",{ XMM, EXx }, 0 },
4836 { "vcvtsd2ss", { XMScalar, VexScalar, EXqScalar }, 0 },
4837 },
4838
4839 /* PREFIX_VEX_0F5B */
4840 {
4841 { "vcvtdq2ps", { XM, EXx }, 0 },
4842 { "vcvttps2dq", { XM, EXx }, 0 },
4843 { "vcvtps2dq", { XM, EXx }, 0 },
4844 },
4845
4846 /* PREFIX_VEX_0F5C */
4847 {
4848 { "vsubps", { XM, Vex, EXx }, 0 },
4849 { "vsubss", { XMScalar, VexScalar, EXdScalar }, 0 },
4850 { "vsubpd", { XM, Vex, EXx }, 0 },
4851 { "vsubsd", { XMScalar, VexScalar, EXqScalar }, 0 },
4852 },
4853
4854 /* PREFIX_VEX_0F5D */
4855 {
4856 { "vminps", { XM, Vex, EXx }, 0 },
4857 { "vminss", { XMScalar, VexScalar, EXdScalar }, 0 },
4858 { "vminpd", { XM, Vex, EXx }, 0 },
4859 { "vminsd", { XMScalar, VexScalar, EXqScalar }, 0 },
4860 },
4861
4862 /* PREFIX_VEX_0F5E */
4863 {
4864 { "vdivps", { XM, Vex, EXx }, 0 },
4865 { "vdivss", { XMScalar, VexScalar, EXdScalar }, 0 },
4866 { "vdivpd", { XM, Vex, EXx }, 0 },
4867 { "vdivsd", { XMScalar, VexScalar, EXqScalar }, 0 },
4868 },
4869
4870 /* PREFIX_VEX_0F5F */
4871 {
4872 { "vmaxps", { XM, Vex, EXx }, 0 },
4873 { "vmaxss", { XMScalar, VexScalar, EXdScalar }, 0 },
4874 { "vmaxpd", { XM, Vex, EXx }, 0 },
4875 { "vmaxsd", { XMScalar, VexScalar, EXqScalar }, 0 },
4876 },
4877
4878 /* PREFIX_VEX_0F60 */
4879 {
4880 { Bad_Opcode },
4881 { Bad_Opcode },
4882 { "vpunpcklbw", { XM, Vex, EXx }, 0 },
4883 },
4884
4885 /* PREFIX_VEX_0F61 */
4886 {
4887 { Bad_Opcode },
4888 { Bad_Opcode },
4889 { "vpunpcklwd", { XM, Vex, EXx }, 0 },
4890 },
4891
4892 /* PREFIX_VEX_0F62 */
4893 {
4894 { Bad_Opcode },
4895 { Bad_Opcode },
4896 { "vpunpckldq", { XM, Vex, EXx }, 0 },
4897 },
4898
4899 /* PREFIX_VEX_0F63 */
4900 {
4901 { Bad_Opcode },
4902 { Bad_Opcode },
4903 { "vpacksswb", { XM, Vex, EXx }, 0 },
4904 },
4905
4906 /* PREFIX_VEX_0F64 */
4907 {
4908 { Bad_Opcode },
4909 { Bad_Opcode },
4910 { "vpcmpgtb", { XM, Vex, EXx }, 0 },
4911 },
4912
4913 /* PREFIX_VEX_0F65 */
4914 {
4915 { Bad_Opcode },
4916 { Bad_Opcode },
4917 { "vpcmpgtw", { XM, Vex, EXx }, 0 },
4918 },
4919
4920 /* PREFIX_VEX_0F66 */
4921 {
4922 { Bad_Opcode },
4923 { Bad_Opcode },
4924 { "vpcmpgtd", { XM, Vex, EXx }, 0 },
4925 },
4926
4927 /* PREFIX_VEX_0F67 */
4928 {
4929 { Bad_Opcode },
4930 { Bad_Opcode },
4931 { "vpackuswb", { XM, Vex, EXx }, 0 },
4932 },
4933
4934 /* PREFIX_VEX_0F68 */
4935 {
4936 { Bad_Opcode },
4937 { Bad_Opcode },
4938 { "vpunpckhbw", { XM, Vex, EXx }, 0 },
4939 },
4940
4941 /* PREFIX_VEX_0F69 */
4942 {
4943 { Bad_Opcode },
4944 { Bad_Opcode },
4945 { "vpunpckhwd", { XM, Vex, EXx }, 0 },
4946 },
4947
4948 /* PREFIX_VEX_0F6A */
4949 {
4950 { Bad_Opcode },
4951 { Bad_Opcode },
4952 { "vpunpckhdq", { XM, Vex, EXx }, 0 },
4953 },
4954
4955 /* PREFIX_VEX_0F6B */
4956 {
4957 { Bad_Opcode },
4958 { Bad_Opcode },
4959 { "vpackssdw", { XM, Vex, EXx }, 0 },
4960 },
4961
4962 /* PREFIX_VEX_0F6C */
4963 {
4964 { Bad_Opcode },
4965 { Bad_Opcode },
4966 { "vpunpcklqdq", { XM, Vex, EXx }, 0 },
4967 },
4968
4969 /* PREFIX_VEX_0F6D */
4970 {
4971 { Bad_Opcode },
4972 { Bad_Opcode },
4973 { "vpunpckhqdq", { XM, Vex, EXx }, 0 },
4974 },
4975
4976 /* PREFIX_VEX_0F6E */
4977 {
4978 { Bad_Opcode },
4979 { Bad_Opcode },
4980 { VEX_LEN_TABLE (VEX_LEN_0F6E_P_2) },
4981 },
4982
4983 /* PREFIX_VEX_0F6F */
4984 {
4985 { Bad_Opcode },
4986 { "vmovdqu", { XM, EXx }, 0 },
4987 { "vmovdqa", { XM, EXx }, 0 },
4988 },
4989
4990 /* PREFIX_VEX_0F70 */
4991 {
4992 { Bad_Opcode },
4993 { "vpshufhw", { XM, EXx, Ib }, 0 },
4994 { "vpshufd", { XM, EXx, Ib }, 0 },
4995 { "vpshuflw", { XM, EXx, Ib }, 0 },
4996 },
4997
4998 /* PREFIX_VEX_0F71_REG_2 */
4999 {
5000 { Bad_Opcode },
5001 { Bad_Opcode },
5002 { "vpsrlw", { Vex, XS, Ib }, 0 },
5003 },
5004
5005 /* PREFIX_VEX_0F71_REG_4 */
5006 {
5007 { Bad_Opcode },
5008 { Bad_Opcode },
5009 { "vpsraw", { Vex, XS, Ib }, 0 },
5010 },
5011
5012 /* PREFIX_VEX_0F71_REG_6 */
5013 {
5014 { Bad_Opcode },
5015 { Bad_Opcode },
5016 { "vpsllw", { Vex, XS, Ib }, 0 },
5017 },
5018
5019 /* PREFIX_VEX_0F72_REG_2 */
5020 {
5021 { Bad_Opcode },
5022 { Bad_Opcode },
5023 { "vpsrld", { Vex, XS, Ib }, 0 },
5024 },
5025
5026 /* PREFIX_VEX_0F72_REG_4 */
5027 {
5028 { Bad_Opcode },
5029 { Bad_Opcode },
5030 { "vpsrad", { Vex, XS, Ib }, 0 },
5031 },
5032
5033 /* PREFIX_VEX_0F72_REG_6 */
5034 {
5035 { Bad_Opcode },
5036 { Bad_Opcode },
5037 { "vpslld", { Vex, XS, Ib }, 0 },
5038 },
5039
5040 /* PREFIX_VEX_0F73_REG_2 */
5041 {
5042 { Bad_Opcode },
5043 { Bad_Opcode },
5044 { "vpsrlq", { Vex, XS, Ib }, 0 },
5045 },
5046
5047 /* PREFIX_VEX_0F73_REG_3 */
5048 {
5049 { Bad_Opcode },
5050 { Bad_Opcode },
5051 { "vpsrldq", { Vex, XS, Ib }, 0 },
5052 },
5053
5054 /* PREFIX_VEX_0F73_REG_6 */
5055 {
5056 { Bad_Opcode },
5057 { Bad_Opcode },
5058 { "vpsllq", { Vex, XS, Ib }, 0 },
5059 },
5060
5061 /* PREFIX_VEX_0F73_REG_7 */
5062 {
5063 { Bad_Opcode },
5064 { Bad_Opcode },
5065 { "vpslldq", { Vex, XS, Ib }, 0 },
5066 },
5067
5068 /* PREFIX_VEX_0F74 */
5069 {
5070 { Bad_Opcode },
5071 { Bad_Opcode },
5072 { "vpcmpeqb", { XM, Vex, EXx }, 0 },
5073 },
5074
5075 /* PREFIX_VEX_0F75 */
5076 {
5077 { Bad_Opcode },
5078 { Bad_Opcode },
5079 { "vpcmpeqw", { XM, Vex, EXx }, 0 },
5080 },
5081
5082 /* PREFIX_VEX_0F76 */
5083 {
5084 { Bad_Opcode },
5085 { Bad_Opcode },
5086 { "vpcmpeqd", { XM, Vex, EXx }, 0 },
5087 },
5088
5089 /* PREFIX_VEX_0F77 */
5090 {
5091 { VEX_LEN_TABLE (VEX_LEN_0F77_P_0) },
5092 },
5093
5094 /* PREFIX_VEX_0F7C */
5095 {
5096 { Bad_Opcode },
5097 { Bad_Opcode },
5098 { "vhaddpd", { XM, Vex, EXx }, 0 },
5099 { "vhaddps", { XM, Vex, EXx }, 0 },
5100 },
5101
5102 /* PREFIX_VEX_0F7D */
5103 {
5104 { Bad_Opcode },
5105 { Bad_Opcode },
5106 { "vhsubpd", { XM, Vex, EXx }, 0 },
5107 { "vhsubps", { XM, Vex, EXx }, 0 },
5108 },
5109
5110 /* PREFIX_VEX_0F7E */
5111 {
5112 { Bad_Opcode },
5113 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_1) },
5114 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_2) },
5115 },
5116
5117 /* PREFIX_VEX_0F7F */
5118 {
5119 { Bad_Opcode },
5120 { "vmovdqu", { EXxS, XM }, 0 },
5121 { "vmovdqa", { EXxS, XM }, 0 },
5122 },
5123
5124 /* PREFIX_VEX_0F90 */
5125 {
5126 { VEX_LEN_TABLE (VEX_LEN_0F90_P_0) },
5127 { Bad_Opcode },
5128 { VEX_LEN_TABLE (VEX_LEN_0F90_P_2) },
5129 },
5130
5131 /* PREFIX_VEX_0F91 */
5132 {
5133 { VEX_LEN_TABLE (VEX_LEN_0F91_P_0) },
5134 { Bad_Opcode },
5135 { VEX_LEN_TABLE (VEX_LEN_0F91_P_2) },
5136 },
5137
5138 /* PREFIX_VEX_0F92 */
5139 {
5140 { VEX_LEN_TABLE (VEX_LEN_0F92_P_0) },
5141 { Bad_Opcode },
5142 { VEX_LEN_TABLE (VEX_LEN_0F92_P_2) },
5143 { VEX_LEN_TABLE (VEX_LEN_0F92_P_3) },
5144 },
5145
5146 /* PREFIX_VEX_0F93 */
5147 {
5148 { VEX_LEN_TABLE (VEX_LEN_0F93_P_0) },
5149 { Bad_Opcode },
5150 { VEX_LEN_TABLE (VEX_LEN_0F93_P_2) },
5151 { VEX_LEN_TABLE (VEX_LEN_0F93_P_3) },
5152 },
5153
5154 /* PREFIX_VEX_0F98 */
5155 {
5156 { VEX_LEN_TABLE (VEX_LEN_0F98_P_0) },
5157 { Bad_Opcode },
5158 { VEX_LEN_TABLE (VEX_LEN_0F98_P_2) },
5159 },
5160
5161 /* PREFIX_VEX_0F99 */
5162 {
5163 { VEX_LEN_TABLE (VEX_LEN_0F99_P_0) },
5164 { Bad_Opcode },
5165 { VEX_LEN_TABLE (VEX_LEN_0F99_P_2) },
5166 },
5167
5168 /* PREFIX_VEX_0FC2 */
5169 {
5170 { "vcmpps", { XM, Vex, EXx, VCMP }, 0 },
5171 { "vcmpss", { XMScalar, VexScalar, EXdScalar, VCMP }, 0 },
5172 { "vcmppd", { XM, Vex, EXx, VCMP }, 0 },
5173 { "vcmpsd", { XMScalar, VexScalar, EXqScalar, VCMP }, 0 },
5174 },
5175
5176 /* PREFIX_VEX_0FC4 */
5177 {
5178 { Bad_Opcode },
5179 { Bad_Opcode },
5180 { VEX_LEN_TABLE (VEX_LEN_0FC4_P_2) },
5181 },
5182
5183 /* PREFIX_VEX_0FC5 */
5184 {
5185 { Bad_Opcode },
5186 { Bad_Opcode },
5187 { VEX_LEN_TABLE (VEX_LEN_0FC5_P_2) },
5188 },
5189
5190 /* PREFIX_VEX_0FD0 */
5191 {
5192 { Bad_Opcode },
5193 { Bad_Opcode },
5194 { "vaddsubpd", { XM, Vex, EXx }, 0 },
5195 { "vaddsubps", { XM, Vex, EXx }, 0 },
5196 },
5197
5198 /* PREFIX_VEX_0FD1 */
5199 {
5200 { Bad_Opcode },
5201 { Bad_Opcode },
5202 { "vpsrlw", { XM, Vex, EXxmm }, 0 },
5203 },
5204
5205 /* PREFIX_VEX_0FD2 */
5206 {
5207 { Bad_Opcode },
5208 { Bad_Opcode },
5209 { "vpsrld", { XM, Vex, EXxmm }, 0 },
5210 },
5211
5212 /* PREFIX_VEX_0FD3 */
5213 {
5214 { Bad_Opcode },
5215 { Bad_Opcode },
5216 { "vpsrlq", { XM, Vex, EXxmm }, 0 },
5217 },
5218
5219 /* PREFIX_VEX_0FD4 */
5220 {
5221 { Bad_Opcode },
5222 { Bad_Opcode },
5223 { "vpaddq", { XM, Vex, EXx }, 0 },
5224 },
5225
5226 /* PREFIX_VEX_0FD5 */
5227 {
5228 { Bad_Opcode },
5229 { Bad_Opcode },
5230 { "vpmullw", { XM, Vex, EXx }, 0 },
5231 },
5232
5233 /* PREFIX_VEX_0FD6 */
5234 {
5235 { Bad_Opcode },
5236 { Bad_Opcode },
5237 { VEX_LEN_TABLE (VEX_LEN_0FD6_P_2) },
5238 },
5239
5240 /* PREFIX_VEX_0FD7 */
5241 {
5242 { Bad_Opcode },
5243 { Bad_Opcode },
5244 { MOD_TABLE (MOD_VEX_0FD7_PREFIX_2) },
5245 },
5246
5247 /* PREFIX_VEX_0FD8 */
5248 {
5249 { Bad_Opcode },
5250 { Bad_Opcode },
5251 { "vpsubusb", { XM, Vex, EXx }, 0 },
5252 },
5253
5254 /* PREFIX_VEX_0FD9 */
5255 {
5256 { Bad_Opcode },
5257 { Bad_Opcode },
5258 { "vpsubusw", { XM, Vex, EXx }, 0 },
5259 },
5260
5261 /* PREFIX_VEX_0FDA */
5262 {
5263 { Bad_Opcode },
5264 { Bad_Opcode },
5265 { "vpminub", { XM, Vex, EXx }, 0 },
5266 },
5267
5268 /* PREFIX_VEX_0FDB */
5269 {
5270 { Bad_Opcode },
5271 { Bad_Opcode },
5272 { "vpand", { XM, Vex, EXx }, 0 },
5273 },
5274
5275 /* PREFIX_VEX_0FDC */
5276 {
5277 { Bad_Opcode },
5278 { Bad_Opcode },
5279 { "vpaddusb", { XM, Vex, EXx }, 0 },
5280 },
5281
5282 /* PREFIX_VEX_0FDD */
5283 {
5284 { Bad_Opcode },
5285 { Bad_Opcode },
5286 { "vpaddusw", { XM, Vex, EXx }, 0 },
5287 },
5288
5289 /* PREFIX_VEX_0FDE */
5290 {
5291 { Bad_Opcode },
5292 { Bad_Opcode },
5293 { "vpmaxub", { XM, Vex, EXx }, 0 },
5294 },
5295
5296 /* PREFIX_VEX_0FDF */
5297 {
5298 { Bad_Opcode },
5299 { Bad_Opcode },
5300 { "vpandn", { XM, Vex, EXx }, 0 },
5301 },
5302
5303 /* PREFIX_VEX_0FE0 */
5304 {
5305 { Bad_Opcode },
5306 { Bad_Opcode },
5307 { "vpavgb", { XM, Vex, EXx }, 0 },
5308 },
5309
5310 /* PREFIX_VEX_0FE1 */
5311 {
5312 { Bad_Opcode },
5313 { Bad_Opcode },
5314 { "vpsraw", { XM, Vex, EXxmm }, 0 },
5315 },
5316
5317 /* PREFIX_VEX_0FE2 */
5318 {
5319 { Bad_Opcode },
5320 { Bad_Opcode },
5321 { "vpsrad", { XM, Vex, EXxmm }, 0 },
5322 },
5323
5324 /* PREFIX_VEX_0FE3 */
5325 {
5326 { Bad_Opcode },
5327 { Bad_Opcode },
5328 { "vpavgw", { XM, Vex, EXx }, 0 },
5329 },
5330
5331 /* PREFIX_VEX_0FE4 */
5332 {
5333 { Bad_Opcode },
5334 { Bad_Opcode },
5335 { "vpmulhuw", { XM, Vex, EXx }, 0 },
5336 },
5337
5338 /* PREFIX_VEX_0FE5 */
5339 {
5340 { Bad_Opcode },
5341 { Bad_Opcode },
5342 { "vpmulhw", { XM, Vex, EXx }, 0 },
5343 },
5344
5345 /* PREFIX_VEX_0FE6 */
5346 {
5347 { Bad_Opcode },
5348 { "vcvtdq2pd", { XM, EXxmmq }, 0 },
5349 { "vcvttpd2dq%XY", { XMM, EXx }, 0 },
5350 { "vcvtpd2dq%XY", { XMM, EXx }, 0 },
5351 },
5352
5353 /* PREFIX_VEX_0FE7 */
5354 {
5355 { Bad_Opcode },
5356 { Bad_Opcode },
5357 { MOD_TABLE (MOD_VEX_0FE7_PREFIX_2) },
5358 },
5359
5360 /* PREFIX_VEX_0FE8 */
5361 {
5362 { Bad_Opcode },
5363 { Bad_Opcode },
5364 { "vpsubsb", { XM, Vex, EXx }, 0 },
5365 },
5366
5367 /* PREFIX_VEX_0FE9 */
5368 {
5369 { Bad_Opcode },
5370 { Bad_Opcode },
5371 { "vpsubsw", { XM, Vex, EXx }, 0 },
5372 },
5373
5374 /* PREFIX_VEX_0FEA */
5375 {
5376 { Bad_Opcode },
5377 { Bad_Opcode },
5378 { "vpminsw", { XM, Vex, EXx }, 0 },
5379 },
5380
5381 /* PREFIX_VEX_0FEB */
5382 {
5383 { Bad_Opcode },
5384 { Bad_Opcode },
5385 { "vpor", { XM, Vex, EXx }, 0 },
5386 },
5387
5388 /* PREFIX_VEX_0FEC */
5389 {
5390 { Bad_Opcode },
5391 { Bad_Opcode },
5392 { "vpaddsb", { XM, Vex, EXx }, 0 },
5393 },
5394
5395 /* PREFIX_VEX_0FED */
5396 {
5397 { Bad_Opcode },
5398 { Bad_Opcode },
5399 { "vpaddsw", { XM, Vex, EXx }, 0 },
5400 },
5401
5402 /* PREFIX_VEX_0FEE */
5403 {
5404 { Bad_Opcode },
5405 { Bad_Opcode },
5406 { "vpmaxsw", { XM, Vex, EXx }, 0 },
5407 },
5408
5409 /* PREFIX_VEX_0FEF */
5410 {
5411 { Bad_Opcode },
5412 { Bad_Opcode },
5413 { "vpxor", { XM, Vex, EXx }, 0 },
5414 },
5415
5416 /* PREFIX_VEX_0FF0 */
5417 {
5418 { Bad_Opcode },
5419 { Bad_Opcode },
5420 { Bad_Opcode },
5421 { MOD_TABLE (MOD_VEX_0FF0_PREFIX_3) },
5422 },
5423
5424 /* PREFIX_VEX_0FF1 */
5425 {
5426 { Bad_Opcode },
5427 { Bad_Opcode },
5428 { "vpsllw", { XM, Vex, EXxmm }, 0 },
5429 },
5430
5431 /* PREFIX_VEX_0FF2 */
5432 {
5433 { Bad_Opcode },
5434 { Bad_Opcode },
5435 { "vpslld", { XM, Vex, EXxmm }, 0 },
5436 },
5437
5438 /* PREFIX_VEX_0FF3 */
5439 {
5440 { Bad_Opcode },
5441 { Bad_Opcode },
5442 { "vpsllq", { XM, Vex, EXxmm }, 0 },
5443 },
5444
5445 /* PREFIX_VEX_0FF4 */
5446 {
5447 { Bad_Opcode },
5448 { Bad_Opcode },
5449 { "vpmuludq", { XM, Vex, EXx }, 0 },
5450 },
5451
5452 /* PREFIX_VEX_0FF5 */
5453 {
5454 { Bad_Opcode },
5455 { Bad_Opcode },
5456 { "vpmaddwd", { XM, Vex, EXx }, 0 },
5457 },
5458
5459 /* PREFIX_VEX_0FF6 */
5460 {
5461 { Bad_Opcode },
5462 { Bad_Opcode },
5463 { "vpsadbw", { XM, Vex, EXx }, 0 },
5464 },
5465
5466 /* PREFIX_VEX_0FF7 */
5467 {
5468 { Bad_Opcode },
5469 { Bad_Opcode },
5470 { VEX_LEN_TABLE (VEX_LEN_0FF7_P_2) },
5471 },
5472
5473 /* PREFIX_VEX_0FF8 */
5474 {
5475 { Bad_Opcode },
5476 { Bad_Opcode },
5477 { "vpsubb", { XM, Vex, EXx }, 0 },
5478 },
5479
5480 /* PREFIX_VEX_0FF9 */
5481 {
5482 { Bad_Opcode },
5483 { Bad_Opcode },
5484 { "vpsubw", { XM, Vex, EXx }, 0 },
5485 },
5486
5487 /* PREFIX_VEX_0FFA */
5488 {
5489 { Bad_Opcode },
5490 { Bad_Opcode },
5491 { "vpsubd", { XM, Vex, EXx }, 0 },
5492 },
5493
5494 /* PREFIX_VEX_0FFB */
5495 {
5496 { Bad_Opcode },
5497 { Bad_Opcode },
5498 { "vpsubq", { XM, Vex, EXx }, 0 },
5499 },
5500
5501 /* PREFIX_VEX_0FFC */
5502 {
5503 { Bad_Opcode },
5504 { Bad_Opcode },
5505 { "vpaddb", { XM, Vex, EXx }, 0 },
5506 },
5507
5508 /* PREFIX_VEX_0FFD */
5509 {
5510 { Bad_Opcode },
5511 { Bad_Opcode },
5512 { "vpaddw", { XM, Vex, EXx }, 0 },
5513 },
5514
5515 /* PREFIX_VEX_0FFE */
5516 {
5517 { Bad_Opcode },
5518 { Bad_Opcode },
5519 { "vpaddd", { XM, Vex, EXx }, 0 },
5520 },
5521
5522 /* PREFIX_VEX_0F3800 */
5523 {
5524 { Bad_Opcode },
5525 { Bad_Opcode },
5526 { "vpshufb", { XM, Vex, EXx }, 0 },
5527 },
5528
5529 /* PREFIX_VEX_0F3801 */
5530 {
5531 { Bad_Opcode },
5532 { Bad_Opcode },
5533 { "vphaddw", { XM, Vex, EXx }, 0 },
5534 },
5535
5536 /* PREFIX_VEX_0F3802 */
5537 {
5538 { Bad_Opcode },
5539 { Bad_Opcode },
5540 { "vphaddd", { XM, Vex, EXx }, 0 },
5541 },
5542
5543 /* PREFIX_VEX_0F3803 */
5544 {
5545 { Bad_Opcode },
5546 { Bad_Opcode },
5547 { "vphaddsw", { XM, Vex, EXx }, 0 },
5548 },
5549
5550 /* PREFIX_VEX_0F3804 */
5551 {
5552 { Bad_Opcode },
5553 { Bad_Opcode },
5554 { "vpmaddubsw", { XM, Vex, EXx }, 0 },
5555 },
5556
5557 /* PREFIX_VEX_0F3805 */
5558 {
5559 { Bad_Opcode },
5560 { Bad_Opcode },
5561 { "vphsubw", { XM, Vex, EXx }, 0 },
5562 },
5563
5564 /* PREFIX_VEX_0F3806 */
5565 {
5566 { Bad_Opcode },
5567 { Bad_Opcode },
5568 { "vphsubd", { XM, Vex, EXx }, 0 },
5569 },
5570
5571 /* PREFIX_VEX_0F3807 */
5572 {
5573 { Bad_Opcode },
5574 { Bad_Opcode },
5575 { "vphsubsw", { XM, Vex, EXx }, 0 },
5576 },
5577
5578 /* PREFIX_VEX_0F3808 */
5579 {
5580 { Bad_Opcode },
5581 { Bad_Opcode },
5582 { "vpsignb", { XM, Vex, EXx }, 0 },
5583 },
5584
5585 /* PREFIX_VEX_0F3809 */
5586 {
5587 { Bad_Opcode },
5588 { Bad_Opcode },
5589 { "vpsignw", { XM, Vex, EXx }, 0 },
5590 },
5591
5592 /* PREFIX_VEX_0F380A */
5593 {
5594 { Bad_Opcode },
5595 { Bad_Opcode },
5596 { "vpsignd", { XM, Vex, EXx }, 0 },
5597 },
5598
5599 /* PREFIX_VEX_0F380B */
5600 {
5601 { Bad_Opcode },
5602 { Bad_Opcode },
5603 { "vpmulhrsw", { XM, Vex, EXx }, 0 },
5604 },
5605
5606 /* PREFIX_VEX_0F380C */
5607 {
5608 { Bad_Opcode },
5609 { Bad_Opcode },
5610 { VEX_W_TABLE (VEX_W_0F380C_P_2) },
5611 },
5612
5613 /* PREFIX_VEX_0F380D */
5614 {
5615 { Bad_Opcode },
5616 { Bad_Opcode },
5617 { VEX_W_TABLE (VEX_W_0F380D_P_2) },
5618 },
5619
5620 /* PREFIX_VEX_0F380E */
5621 {
5622 { Bad_Opcode },
5623 { Bad_Opcode },
5624 { VEX_W_TABLE (VEX_W_0F380E_P_2) },
5625 },
5626
5627 /* PREFIX_VEX_0F380F */
5628 {
5629 { Bad_Opcode },
5630 { Bad_Opcode },
5631 { VEX_W_TABLE (VEX_W_0F380F_P_2) },
5632 },
5633
5634 /* PREFIX_VEX_0F3813 */
5635 {
5636 { Bad_Opcode },
5637 { Bad_Opcode },
5638 { "vcvtph2ps", { XM, EXxmmq }, 0 },
5639 },
5640
5641 /* PREFIX_VEX_0F3816 */
5642 {
5643 { Bad_Opcode },
5644 { Bad_Opcode },
5645 { VEX_LEN_TABLE (VEX_LEN_0F3816_P_2) },
5646 },
5647
5648 /* PREFIX_VEX_0F3817 */
5649 {
5650 { Bad_Opcode },
5651 { Bad_Opcode },
5652 { "vptest", { XM, EXx }, 0 },
5653 },
5654
5655 /* PREFIX_VEX_0F3818 */
5656 {
5657 { Bad_Opcode },
5658 { Bad_Opcode },
5659 { VEX_W_TABLE (VEX_W_0F3818_P_2) },
5660 },
5661
5662 /* PREFIX_VEX_0F3819 */
5663 {
5664 { Bad_Opcode },
5665 { Bad_Opcode },
5666 { VEX_LEN_TABLE (VEX_LEN_0F3819_P_2) },
5667 },
5668
5669 /* PREFIX_VEX_0F381A */
5670 {
5671 { Bad_Opcode },
5672 { Bad_Opcode },
5673 { MOD_TABLE (MOD_VEX_0F381A_PREFIX_2) },
5674 },
5675
5676 /* PREFIX_VEX_0F381C */
5677 {
5678 { Bad_Opcode },
5679 { Bad_Opcode },
5680 { "vpabsb", { XM, EXx }, 0 },
5681 },
5682
5683 /* PREFIX_VEX_0F381D */
5684 {
5685 { Bad_Opcode },
5686 { Bad_Opcode },
5687 { "vpabsw", { XM, EXx }, 0 },
5688 },
5689
5690 /* PREFIX_VEX_0F381E */
5691 {
5692 { Bad_Opcode },
5693 { Bad_Opcode },
5694 { "vpabsd", { XM, EXx }, 0 },
5695 },
5696
5697 /* PREFIX_VEX_0F3820 */
5698 {
5699 { Bad_Opcode },
5700 { Bad_Opcode },
5701 { "vpmovsxbw", { XM, EXxmmq }, 0 },
5702 },
5703
5704 /* PREFIX_VEX_0F3821 */
5705 {
5706 { Bad_Opcode },
5707 { Bad_Opcode },
5708 { "vpmovsxbd", { XM, EXxmmqd }, 0 },
5709 },
5710
5711 /* PREFIX_VEX_0F3822 */
5712 {
5713 { Bad_Opcode },
5714 { Bad_Opcode },
5715 { "vpmovsxbq", { XM, EXxmmdw }, 0 },
5716 },
5717
5718 /* PREFIX_VEX_0F3823 */
5719 {
5720 { Bad_Opcode },
5721 { Bad_Opcode },
5722 { "vpmovsxwd", { XM, EXxmmq }, 0 },
5723 },
5724
5725 /* PREFIX_VEX_0F3824 */
5726 {
5727 { Bad_Opcode },
5728 { Bad_Opcode },
5729 { "vpmovsxwq", { XM, EXxmmqd }, 0 },
5730 },
5731
5732 /* PREFIX_VEX_0F3825 */
5733 {
5734 { Bad_Opcode },
5735 { Bad_Opcode },
5736 { "vpmovsxdq", { XM, EXxmmq }, 0 },
5737 },
5738
5739 /* PREFIX_VEX_0F3828 */
5740 {
5741 { Bad_Opcode },
5742 { Bad_Opcode },
5743 { "vpmuldq", { XM, Vex, EXx }, 0 },
5744 },
5745
5746 /* PREFIX_VEX_0F3829 */
5747 {
5748 { Bad_Opcode },
5749 { Bad_Opcode },
5750 { "vpcmpeqq", { XM, Vex, EXx }, 0 },
5751 },
5752
5753 /* PREFIX_VEX_0F382A */
5754 {
5755 { Bad_Opcode },
5756 { Bad_Opcode },
5757 { MOD_TABLE (MOD_VEX_0F382A_PREFIX_2) },
5758 },
5759
5760 /* PREFIX_VEX_0F382B */
5761 {
5762 { Bad_Opcode },
5763 { Bad_Opcode },
5764 { "vpackusdw", { XM, Vex, EXx }, 0 },
5765 },
5766
5767 /* PREFIX_VEX_0F382C */
5768 {
5769 { Bad_Opcode },
5770 { Bad_Opcode },
5771 { MOD_TABLE (MOD_VEX_0F382C_PREFIX_2) },
5772 },
5773
5774 /* PREFIX_VEX_0F382D */
5775 {
5776 { Bad_Opcode },
5777 { Bad_Opcode },
5778 { MOD_TABLE (MOD_VEX_0F382D_PREFIX_2) },
5779 },
5780
5781 /* PREFIX_VEX_0F382E */
5782 {
5783 { Bad_Opcode },
5784 { Bad_Opcode },
5785 { MOD_TABLE (MOD_VEX_0F382E_PREFIX_2) },
5786 },
5787
5788 /* PREFIX_VEX_0F382F */
5789 {
5790 { Bad_Opcode },
5791 { Bad_Opcode },
5792 { MOD_TABLE (MOD_VEX_0F382F_PREFIX_2) },
5793 },
5794
5795 /* PREFIX_VEX_0F3830 */
5796 {
5797 { Bad_Opcode },
5798 { Bad_Opcode },
5799 { "vpmovzxbw", { XM, EXxmmq }, 0 },
5800 },
5801
5802 /* PREFIX_VEX_0F3831 */
5803 {
5804 { Bad_Opcode },
5805 { Bad_Opcode },
5806 { "vpmovzxbd", { XM, EXxmmqd }, 0 },
5807 },
5808
5809 /* PREFIX_VEX_0F3832 */
5810 {
5811 { Bad_Opcode },
5812 { Bad_Opcode },
5813 { "vpmovzxbq", { XM, EXxmmdw }, 0 },
5814 },
5815
5816 /* PREFIX_VEX_0F3833 */
5817 {
5818 { Bad_Opcode },
5819 { Bad_Opcode },
5820 { "vpmovzxwd", { XM, EXxmmq }, 0 },
5821 },
5822
5823 /* PREFIX_VEX_0F3834 */
5824 {
5825 { Bad_Opcode },
5826 { Bad_Opcode },
5827 { "vpmovzxwq", { XM, EXxmmqd }, 0 },
5828 },
5829
5830 /* PREFIX_VEX_0F3835 */
5831 {
5832 { Bad_Opcode },
5833 { Bad_Opcode },
5834 { "vpmovzxdq", { XM, EXxmmq }, 0 },
5835 },
5836
5837 /* PREFIX_VEX_0F3836 */
5838 {
5839 { Bad_Opcode },
5840 { Bad_Opcode },
5841 { VEX_LEN_TABLE (VEX_LEN_0F3836_P_2) },
5842 },
5843
5844 /* PREFIX_VEX_0F3837 */
5845 {
5846 { Bad_Opcode },
5847 { Bad_Opcode },
5848 { "vpcmpgtq", { XM, Vex, EXx }, 0 },
5849 },
5850
5851 /* PREFIX_VEX_0F3838 */
5852 {
5853 { Bad_Opcode },
5854 { Bad_Opcode },
5855 { "vpminsb", { XM, Vex, EXx }, 0 },
5856 },
5857
5858 /* PREFIX_VEX_0F3839 */
5859 {
5860 { Bad_Opcode },
5861 { Bad_Opcode },
5862 { "vpminsd", { XM, Vex, EXx }, 0 },
5863 },
5864
5865 /* PREFIX_VEX_0F383A */
5866 {
5867 { Bad_Opcode },
5868 { Bad_Opcode },
5869 { "vpminuw", { XM, Vex, EXx }, 0 },
5870 },
5871
5872 /* PREFIX_VEX_0F383B */
5873 {
5874 { Bad_Opcode },
5875 { Bad_Opcode },
5876 { "vpminud", { XM, Vex, EXx }, 0 },
5877 },
5878
5879 /* PREFIX_VEX_0F383C */
5880 {
5881 { Bad_Opcode },
5882 { Bad_Opcode },
5883 { "vpmaxsb", { XM, Vex, EXx }, 0 },
5884 },
5885
5886 /* PREFIX_VEX_0F383D */
5887 {
5888 { Bad_Opcode },
5889 { Bad_Opcode },
5890 { "vpmaxsd", { XM, Vex, EXx }, 0 },
5891 },
5892
5893 /* PREFIX_VEX_0F383E */
5894 {
5895 { Bad_Opcode },
5896 { Bad_Opcode },
5897 { "vpmaxuw", { XM, Vex, EXx }, 0 },
5898 },
5899
5900 /* PREFIX_VEX_0F383F */
5901 {
5902 { Bad_Opcode },
5903 { Bad_Opcode },
5904 { "vpmaxud", { XM, Vex, EXx }, 0 },
5905 },
5906
5907 /* PREFIX_VEX_0F3840 */
5908 {
5909 { Bad_Opcode },
5910 { Bad_Opcode },
5911 { "vpmulld", { XM, Vex, EXx }, 0 },
5912 },
5913
5914 /* PREFIX_VEX_0F3841 */
5915 {
5916 { Bad_Opcode },
5917 { Bad_Opcode },
5918 { VEX_LEN_TABLE (VEX_LEN_0F3841_P_2) },
5919 },
5920
5921 /* PREFIX_VEX_0F3845 */
5922 {
5923 { Bad_Opcode },
5924 { Bad_Opcode },
5925 { "vpsrlv%LW", { XM, Vex, EXx }, 0 },
5926 },
5927
5928 /* PREFIX_VEX_0F3846 */
5929 {
5930 { Bad_Opcode },
5931 { Bad_Opcode },
5932 { VEX_W_TABLE (VEX_W_0F3846_P_2) },
5933 },
5934
5935 /* PREFIX_VEX_0F3847 */
5936 {
5937 { Bad_Opcode },
5938 { Bad_Opcode },
5939 { "vpsllv%LW", { XM, Vex, EXx }, 0 },
5940 },
5941
5942 /* PREFIX_VEX_0F3858 */
5943 {
5944 { Bad_Opcode },
5945 { Bad_Opcode },
5946 { VEX_W_TABLE (VEX_W_0F3858_P_2) },
5947 },
5948
5949 /* PREFIX_VEX_0F3859 */
5950 {
5951 { Bad_Opcode },
5952 { Bad_Opcode },
5953 { VEX_W_TABLE (VEX_W_0F3859_P_2) },
5954 },
5955
5956 /* PREFIX_VEX_0F385A */
5957 {
5958 { Bad_Opcode },
5959 { Bad_Opcode },
5960 { MOD_TABLE (MOD_VEX_0F385A_PREFIX_2) },
5961 },
5962
5963 /* PREFIX_VEX_0F3878 */
5964 {
5965 { Bad_Opcode },
5966 { Bad_Opcode },
5967 { VEX_W_TABLE (VEX_W_0F3878_P_2) },
5968 },
5969
5970 /* PREFIX_VEX_0F3879 */
5971 {
5972 { Bad_Opcode },
5973 { Bad_Opcode },
5974 { VEX_W_TABLE (VEX_W_0F3879_P_2) },
5975 },
5976
5977 /* PREFIX_VEX_0F388C */
5978 {
5979 { Bad_Opcode },
5980 { Bad_Opcode },
5981 { MOD_TABLE (MOD_VEX_0F388C_PREFIX_2) },
5982 },
5983
5984 /* PREFIX_VEX_0F388E */
5985 {
5986 { Bad_Opcode },
5987 { Bad_Opcode },
5988 { MOD_TABLE (MOD_VEX_0F388E_PREFIX_2) },
5989 },
5990
5991 /* PREFIX_VEX_0F3890 */
5992 {
5993 { Bad_Opcode },
5994 { Bad_Opcode },
5995 { "vpgatherd%LW", { XM, MVexVSIBDWpX, Vex }, 0 },
5996 },
5997
5998 /* PREFIX_VEX_0F3891 */
5999 {
6000 { Bad_Opcode },
6001 { Bad_Opcode },
6002 { "vpgatherq%LW", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, 0 },
6003 },
6004
6005 /* PREFIX_VEX_0F3892 */
6006 {
6007 { Bad_Opcode },
6008 { Bad_Opcode },
6009 { "vgatherdp%XW", { XM, MVexVSIBDWpX, Vex }, 0 },
6010 },
6011
6012 /* PREFIX_VEX_0F3893 */
6013 {
6014 { Bad_Opcode },
6015 { Bad_Opcode },
6016 { "vgatherqp%XW", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, 0 },
6017 },
6018
6019 /* PREFIX_VEX_0F3896 */
6020 {
6021 { Bad_Opcode },
6022 { Bad_Opcode },
6023 { "vfmaddsub132p%XW", { XM, Vex, EXx }, 0 },
6024 },
6025
6026 /* PREFIX_VEX_0F3897 */
6027 {
6028 { Bad_Opcode },
6029 { Bad_Opcode },
6030 { "vfmsubadd132p%XW", { XM, Vex, EXx }, 0 },
6031 },
6032
6033 /* PREFIX_VEX_0F3898 */
6034 {
6035 { Bad_Opcode },
6036 { Bad_Opcode },
6037 { "vfmadd132p%XW", { XM, Vex, EXx }, 0 },
6038 },
6039
6040 /* PREFIX_VEX_0F3899 */
6041 {
6042 { Bad_Opcode },
6043 { Bad_Opcode },
6044 { "vfmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6045 },
6046
6047 /* PREFIX_VEX_0F389A */
6048 {
6049 { Bad_Opcode },
6050 { Bad_Opcode },
6051 { "vfmsub132p%XW", { XM, Vex, EXx }, 0 },
6052 },
6053
6054 /* PREFIX_VEX_0F389B */
6055 {
6056 { Bad_Opcode },
6057 { Bad_Opcode },
6058 { "vfmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6059 },
6060
6061 /* PREFIX_VEX_0F389C */
6062 {
6063 { Bad_Opcode },
6064 { Bad_Opcode },
6065 { "vfnmadd132p%XW", { XM, Vex, EXx }, 0 },
6066 },
6067
6068 /* PREFIX_VEX_0F389D */
6069 {
6070 { Bad_Opcode },
6071 { Bad_Opcode },
6072 { "vfnmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6073 },
6074
6075 /* PREFIX_VEX_0F389E */
6076 {
6077 { Bad_Opcode },
6078 { Bad_Opcode },
6079 { "vfnmsub132p%XW", { XM, Vex, EXx }, 0 },
6080 },
6081
6082 /* PREFIX_VEX_0F389F */
6083 {
6084 { Bad_Opcode },
6085 { Bad_Opcode },
6086 { "vfnmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6087 },
6088
6089 /* PREFIX_VEX_0F38A6 */
6090 {
6091 { Bad_Opcode },
6092 { Bad_Opcode },
6093 { "vfmaddsub213p%XW", { XM, Vex, EXx }, 0 },
6094 { Bad_Opcode },
6095 },
6096
6097 /* PREFIX_VEX_0F38A7 */
6098 {
6099 { Bad_Opcode },
6100 { Bad_Opcode },
6101 { "vfmsubadd213p%XW", { XM, Vex, EXx }, 0 },
6102 },
6103
6104 /* PREFIX_VEX_0F38A8 */
6105 {
6106 { Bad_Opcode },
6107 { Bad_Opcode },
6108 { "vfmadd213p%XW", { XM, Vex, EXx }, 0 },
6109 },
6110
6111 /* PREFIX_VEX_0F38A9 */
6112 {
6113 { Bad_Opcode },
6114 { Bad_Opcode },
6115 { "vfmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6116 },
6117
6118 /* PREFIX_VEX_0F38AA */
6119 {
6120 { Bad_Opcode },
6121 { Bad_Opcode },
6122 { "vfmsub213p%XW", { XM, Vex, EXx }, 0 },
6123 },
6124
6125 /* PREFIX_VEX_0F38AB */
6126 {
6127 { Bad_Opcode },
6128 { Bad_Opcode },
6129 { "vfmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6130 },
6131
6132 /* PREFIX_VEX_0F38AC */
6133 {
6134 { Bad_Opcode },
6135 { Bad_Opcode },
6136 { "vfnmadd213p%XW", { XM, Vex, EXx }, 0 },
6137 },
6138
6139 /* PREFIX_VEX_0F38AD */
6140 {
6141 { Bad_Opcode },
6142 { Bad_Opcode },
6143 { "vfnmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6144 },
6145
6146 /* PREFIX_VEX_0F38AE */
6147 {
6148 { Bad_Opcode },
6149 { Bad_Opcode },
6150 { "vfnmsub213p%XW", { XM, Vex, EXx }, 0 },
6151 },
6152
6153 /* PREFIX_VEX_0F38AF */
6154 {
6155 { Bad_Opcode },
6156 { Bad_Opcode },
6157 { "vfnmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6158 },
6159
6160 /* PREFIX_VEX_0F38B6 */
6161 {
6162 { Bad_Opcode },
6163 { Bad_Opcode },
6164 { "vfmaddsub231p%XW", { XM, Vex, EXx }, 0 },
6165 },
6166
6167 /* PREFIX_VEX_0F38B7 */
6168 {
6169 { Bad_Opcode },
6170 { Bad_Opcode },
6171 { "vfmsubadd231p%XW", { XM, Vex, EXx }, 0 },
6172 },
6173
6174 /* PREFIX_VEX_0F38B8 */
6175 {
6176 { Bad_Opcode },
6177 { Bad_Opcode },
6178 { "vfmadd231p%XW", { XM, Vex, EXx }, 0 },
6179 },
6180
6181 /* PREFIX_VEX_0F38B9 */
6182 {
6183 { Bad_Opcode },
6184 { Bad_Opcode },
6185 { "vfmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6186 },
6187
6188 /* PREFIX_VEX_0F38BA */
6189 {
6190 { Bad_Opcode },
6191 { Bad_Opcode },
6192 { "vfmsub231p%XW", { XM, Vex, EXx }, 0 },
6193 },
6194
6195 /* PREFIX_VEX_0F38BB */
6196 {
6197 { Bad_Opcode },
6198 { Bad_Opcode },
6199 { "vfmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6200 },
6201
6202 /* PREFIX_VEX_0F38BC */
6203 {
6204 { Bad_Opcode },
6205 { Bad_Opcode },
6206 { "vfnmadd231p%XW", { XM, Vex, EXx }, 0 },
6207 },
6208
6209 /* PREFIX_VEX_0F38BD */
6210 {
6211 { Bad_Opcode },
6212 { Bad_Opcode },
6213 { "vfnmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6214 },
6215
6216 /* PREFIX_VEX_0F38BE */
6217 {
6218 { Bad_Opcode },
6219 { Bad_Opcode },
6220 { "vfnmsub231p%XW", { XM, Vex, EXx }, 0 },
6221 },
6222
6223 /* PREFIX_VEX_0F38BF */
6224 {
6225 { Bad_Opcode },
6226 { Bad_Opcode },
6227 { "vfnmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6228 },
6229
6230 /* PREFIX_VEX_0F38CF */
6231 {
6232 { Bad_Opcode },
6233 { Bad_Opcode },
6234 { VEX_W_TABLE (VEX_W_0F38CF_P_2) },
6235 },
6236
6237 /* PREFIX_VEX_0F38DB */
6238 {
6239 { Bad_Opcode },
6240 { Bad_Opcode },
6241 { VEX_LEN_TABLE (VEX_LEN_0F38DB_P_2) },
6242 },
6243
6244 /* PREFIX_VEX_0F38DC */
6245 {
6246 { Bad_Opcode },
6247 { Bad_Opcode },
6248 { "vaesenc", { XM, Vex, EXx }, 0 },
6249 },
6250
6251 /* PREFIX_VEX_0F38DD */
6252 {
6253 { Bad_Opcode },
6254 { Bad_Opcode },
6255 { "vaesenclast", { XM, Vex, EXx }, 0 },
6256 },
6257
6258 /* PREFIX_VEX_0F38DE */
6259 {
6260 { Bad_Opcode },
6261 { Bad_Opcode },
6262 { "vaesdec", { XM, Vex, EXx }, 0 },
6263 },
6264
6265 /* PREFIX_VEX_0F38DF */
6266 {
6267 { Bad_Opcode },
6268 { Bad_Opcode },
6269 { "vaesdeclast", { XM, Vex, EXx }, 0 },
6270 },
6271
6272 /* PREFIX_VEX_0F38F2 */
6273 {
6274 { VEX_LEN_TABLE (VEX_LEN_0F38F2_P_0) },
6275 },
6276
6277 /* PREFIX_VEX_0F38F3_REG_1 */
6278 {
6279 { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_1_P_0) },
6280 },
6281
6282 /* PREFIX_VEX_0F38F3_REG_2 */
6283 {
6284 { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_2_P_0) },
6285 },
6286
6287 /* PREFIX_VEX_0F38F3_REG_3 */
6288 {
6289 { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_3_P_0) },
6290 },
6291
6292 /* PREFIX_VEX_0F38F5 */
6293 {
6294 { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_0) },
6295 { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_1) },
6296 { Bad_Opcode },
6297 { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_3) },
6298 },
6299
6300 /* PREFIX_VEX_0F38F6 */
6301 {
6302 { Bad_Opcode },
6303 { Bad_Opcode },
6304 { Bad_Opcode },
6305 { VEX_LEN_TABLE (VEX_LEN_0F38F6_P_3) },
6306 },
6307
6308 /* PREFIX_VEX_0F38F7 */
6309 {
6310 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_0) },
6311 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_1) },
6312 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_2) },
6313 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_3) },
6314 },
6315
6316 /* PREFIX_VEX_0F3A00 */
6317 {
6318 { Bad_Opcode },
6319 { Bad_Opcode },
6320 { VEX_LEN_TABLE (VEX_LEN_0F3A00_P_2) },
6321 },
6322
6323 /* PREFIX_VEX_0F3A01 */
6324 {
6325 { Bad_Opcode },
6326 { Bad_Opcode },
6327 { VEX_LEN_TABLE (VEX_LEN_0F3A01_P_2) },
6328 },
6329
6330 /* PREFIX_VEX_0F3A02 */
6331 {
6332 { Bad_Opcode },
6333 { Bad_Opcode },
6334 { VEX_W_TABLE (VEX_W_0F3A02_P_2) },
6335 },
6336
6337 /* PREFIX_VEX_0F3A04 */
6338 {
6339 { Bad_Opcode },
6340 { Bad_Opcode },
6341 { VEX_W_TABLE (VEX_W_0F3A04_P_2) },
6342 },
6343
6344 /* PREFIX_VEX_0F3A05 */
6345 {
6346 { Bad_Opcode },
6347 { Bad_Opcode },
6348 { VEX_W_TABLE (VEX_W_0F3A05_P_2) },
6349 },
6350
6351 /* PREFIX_VEX_0F3A06 */
6352 {
6353 { Bad_Opcode },
6354 { Bad_Opcode },
6355 { VEX_LEN_TABLE (VEX_LEN_0F3A06_P_2) },
6356 },
6357
6358 /* PREFIX_VEX_0F3A08 */
6359 {
6360 { Bad_Opcode },
6361 { Bad_Opcode },
6362 { "vroundps", { XM, EXx, Ib }, 0 },
6363 },
6364
6365 /* PREFIX_VEX_0F3A09 */
6366 {
6367 { Bad_Opcode },
6368 { Bad_Opcode },
6369 { "vroundpd", { XM, EXx, Ib }, 0 },
6370 },
6371
6372 /* PREFIX_VEX_0F3A0A */
6373 {
6374 { Bad_Opcode },
6375 { Bad_Opcode },
6376 { "vroundss", { XMScalar, VexScalar, EXdScalar, Ib }, 0 },
6377 },
6378
6379 /* PREFIX_VEX_0F3A0B */
6380 {
6381 { Bad_Opcode },
6382 { Bad_Opcode },
6383 { "vroundsd", { XMScalar, VexScalar, EXqScalar, Ib }, 0 },
6384 },
6385
6386 /* PREFIX_VEX_0F3A0C */
6387 {
6388 { Bad_Opcode },
6389 { Bad_Opcode },
6390 { "vblendps", { XM, Vex, EXx, Ib }, 0 },
6391 },
6392
6393 /* PREFIX_VEX_0F3A0D */
6394 {
6395 { Bad_Opcode },
6396 { Bad_Opcode },
6397 { "vblendpd", { XM, Vex, EXx, Ib }, 0 },
6398 },
6399
6400 /* PREFIX_VEX_0F3A0E */
6401 {
6402 { Bad_Opcode },
6403 { Bad_Opcode },
6404 { "vpblendw", { XM, Vex, EXx, Ib }, 0 },
6405 },
6406
6407 /* PREFIX_VEX_0F3A0F */
6408 {
6409 { Bad_Opcode },
6410 { Bad_Opcode },
6411 { "vpalignr", { XM, Vex, EXx, Ib }, 0 },
6412 },
6413
6414 /* PREFIX_VEX_0F3A14 */
6415 {
6416 { Bad_Opcode },
6417 { Bad_Opcode },
6418 { VEX_LEN_TABLE (VEX_LEN_0F3A14_P_2) },
6419 },
6420
6421 /* PREFIX_VEX_0F3A15 */
6422 {
6423 { Bad_Opcode },
6424 { Bad_Opcode },
6425 { VEX_LEN_TABLE (VEX_LEN_0F3A15_P_2) },
6426 },
6427
6428 /* PREFIX_VEX_0F3A16 */
6429 {
6430 { Bad_Opcode },
6431 { Bad_Opcode },
6432 { VEX_LEN_TABLE (VEX_LEN_0F3A16_P_2) },
6433 },
6434
6435 /* PREFIX_VEX_0F3A17 */
6436 {
6437 { Bad_Opcode },
6438 { Bad_Opcode },
6439 { VEX_LEN_TABLE (VEX_LEN_0F3A17_P_2) },
6440 },
6441
6442 /* PREFIX_VEX_0F3A18 */
6443 {
6444 { Bad_Opcode },
6445 { Bad_Opcode },
6446 { VEX_LEN_TABLE (VEX_LEN_0F3A18_P_2) },
6447 },
6448
6449 /* PREFIX_VEX_0F3A19 */
6450 {
6451 { Bad_Opcode },
6452 { Bad_Opcode },
6453 { VEX_LEN_TABLE (VEX_LEN_0F3A19_P_2) },
6454 },
6455
6456 /* PREFIX_VEX_0F3A1D */
6457 {
6458 { Bad_Opcode },
6459 { Bad_Opcode },
6460 { "vcvtps2ph", { EXxmmq, XM, Ib }, 0 },
6461 },
6462
6463 /* PREFIX_VEX_0F3A20 */
6464 {
6465 { Bad_Opcode },
6466 { Bad_Opcode },
6467 { VEX_LEN_TABLE (VEX_LEN_0F3A20_P_2) },
6468 },
6469
6470 /* PREFIX_VEX_0F3A21 */
6471 {
6472 { Bad_Opcode },
6473 { Bad_Opcode },
6474 { VEX_LEN_TABLE (VEX_LEN_0F3A21_P_2) },
6475 },
6476
6477 /* PREFIX_VEX_0F3A22 */
6478 {
6479 { Bad_Opcode },
6480 { Bad_Opcode },
6481 { VEX_LEN_TABLE (VEX_LEN_0F3A22_P_2) },
6482 },
6483
6484 /* PREFIX_VEX_0F3A30 */
6485 {
6486 { Bad_Opcode },
6487 { Bad_Opcode },
6488 { VEX_LEN_TABLE (VEX_LEN_0F3A30_P_2) },
6489 },
6490
6491 /* PREFIX_VEX_0F3A31 */
6492 {
6493 { Bad_Opcode },
6494 { Bad_Opcode },
6495 { VEX_LEN_TABLE (VEX_LEN_0F3A31_P_2) },
6496 },
6497
6498 /* PREFIX_VEX_0F3A32 */
6499 {
6500 { Bad_Opcode },
6501 { Bad_Opcode },
6502 { VEX_LEN_TABLE (VEX_LEN_0F3A32_P_2) },
6503 },
6504
6505 /* PREFIX_VEX_0F3A33 */
6506 {
6507 { Bad_Opcode },
6508 { Bad_Opcode },
6509 { VEX_LEN_TABLE (VEX_LEN_0F3A33_P_2) },
6510 },
6511
6512 /* PREFIX_VEX_0F3A38 */
6513 {
6514 { Bad_Opcode },
6515 { Bad_Opcode },
6516 { VEX_LEN_TABLE (VEX_LEN_0F3A38_P_2) },
6517 },
6518
6519 /* PREFIX_VEX_0F3A39 */
6520 {
6521 { Bad_Opcode },
6522 { Bad_Opcode },
6523 { VEX_LEN_TABLE (VEX_LEN_0F3A39_P_2) },
6524 },
6525
6526 /* PREFIX_VEX_0F3A40 */
6527 {
6528 { Bad_Opcode },
6529 { Bad_Opcode },
6530 { "vdpps", { XM, Vex, EXx, Ib }, 0 },
6531 },
6532
6533 /* PREFIX_VEX_0F3A41 */
6534 {
6535 { Bad_Opcode },
6536 { Bad_Opcode },
6537 { VEX_LEN_TABLE (VEX_LEN_0F3A41_P_2) },
6538 },
6539
6540 /* PREFIX_VEX_0F3A42 */
6541 {
6542 { Bad_Opcode },
6543 { Bad_Opcode },
6544 { "vmpsadbw", { XM, Vex, EXx, Ib }, 0 },
6545 },
6546
6547 /* PREFIX_VEX_0F3A44 */
6548 {
6549 { Bad_Opcode },
6550 { Bad_Opcode },
6551 { "vpclmulqdq", { XM, Vex, EXx, PCLMUL }, 0 },
6552 },
6553
6554 /* PREFIX_VEX_0F3A46 */
6555 {
6556 { Bad_Opcode },
6557 { Bad_Opcode },
6558 { VEX_LEN_TABLE (VEX_LEN_0F3A46_P_2) },
6559 },
6560
6561 /* PREFIX_VEX_0F3A48 */
6562 {
6563 { Bad_Opcode },
6564 { Bad_Opcode },
6565 { VEX_W_TABLE (VEX_W_0F3A48_P_2) },
6566 },
6567
6568 /* PREFIX_VEX_0F3A49 */
6569 {
6570 { Bad_Opcode },
6571 { Bad_Opcode },
6572 { VEX_W_TABLE (VEX_W_0F3A49_P_2) },
6573 },
6574
6575 /* PREFIX_VEX_0F3A4A */
6576 {
6577 { Bad_Opcode },
6578 { Bad_Opcode },
6579 { VEX_W_TABLE (VEX_W_0F3A4A_P_2) },
6580 },
6581
6582 /* PREFIX_VEX_0F3A4B */
6583 {
6584 { Bad_Opcode },
6585 { Bad_Opcode },
6586 { VEX_W_TABLE (VEX_W_0F3A4B_P_2) },
6587 },
6588
6589 /* PREFIX_VEX_0F3A4C */
6590 {
6591 { Bad_Opcode },
6592 { Bad_Opcode },
6593 { VEX_W_TABLE (VEX_W_0F3A4C_P_2) },
6594 },
6595
6596 /* PREFIX_VEX_0F3A5C */
6597 {
6598 { Bad_Opcode },
6599 { Bad_Opcode },
6600 { "vfmaddsubps", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6601 },
6602
6603 /* PREFIX_VEX_0F3A5D */
6604 {
6605 { Bad_Opcode },
6606 { Bad_Opcode },
6607 { "vfmaddsubpd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6608 },
6609
6610 /* PREFIX_VEX_0F3A5E */
6611 {
6612 { Bad_Opcode },
6613 { Bad_Opcode },
6614 { "vfmsubaddps", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6615 },
6616
6617 /* PREFIX_VEX_0F3A5F */
6618 {
6619 { Bad_Opcode },
6620 { Bad_Opcode },
6621 { "vfmsubaddpd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6622 },
6623
6624 /* PREFIX_VEX_0F3A60 */
6625 {
6626 { Bad_Opcode },
6627 { Bad_Opcode },
6628 { VEX_LEN_TABLE (VEX_LEN_0F3A60_P_2) },
6629 { Bad_Opcode },
6630 },
6631
6632 /* PREFIX_VEX_0F3A61 */
6633 {
6634 { Bad_Opcode },
6635 { Bad_Opcode },
6636 { VEX_LEN_TABLE (VEX_LEN_0F3A61_P_2) },
6637 },
6638
6639 /* PREFIX_VEX_0F3A62 */
6640 {
6641 { Bad_Opcode },
6642 { Bad_Opcode },
6643 { VEX_LEN_TABLE (VEX_LEN_0F3A62_P_2) },
6644 },
6645
6646 /* PREFIX_VEX_0F3A63 */
6647 {
6648 { Bad_Opcode },
6649 { Bad_Opcode },
6650 { VEX_LEN_TABLE (VEX_LEN_0F3A63_P_2) },
6651 },
6652
6653 /* PREFIX_VEX_0F3A68 */
6654 {
6655 { Bad_Opcode },
6656 { Bad_Opcode },
6657 { "vfmaddps", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6658 },
6659
6660 /* PREFIX_VEX_0F3A69 */
6661 {
6662 { Bad_Opcode },
6663 { Bad_Opcode },
6664 { "vfmaddpd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6665 },
6666
6667 /* PREFIX_VEX_0F3A6A */
6668 {
6669 { Bad_Opcode },
6670 { Bad_Opcode },
6671 { VEX_LEN_TABLE (VEX_LEN_0F3A6A_P_2) },
6672 },
6673
6674 /* PREFIX_VEX_0F3A6B */
6675 {
6676 { Bad_Opcode },
6677 { Bad_Opcode },
6678 { VEX_LEN_TABLE (VEX_LEN_0F3A6B_P_2) },
6679 },
6680
6681 /* PREFIX_VEX_0F3A6C */
6682 {
6683 { Bad_Opcode },
6684 { Bad_Opcode },
6685 { "vfmsubps", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6686 },
6687
6688 /* PREFIX_VEX_0F3A6D */
6689 {
6690 { Bad_Opcode },
6691 { Bad_Opcode },
6692 { "vfmsubpd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6693 },
6694
6695 /* PREFIX_VEX_0F3A6E */
6696 {
6697 { Bad_Opcode },
6698 { Bad_Opcode },
6699 { VEX_LEN_TABLE (VEX_LEN_0F3A6E_P_2) },
6700 },
6701
6702 /* PREFIX_VEX_0F3A6F */
6703 {
6704 { Bad_Opcode },
6705 { Bad_Opcode },
6706 { VEX_LEN_TABLE (VEX_LEN_0F3A6F_P_2) },
6707 },
6708
6709 /* PREFIX_VEX_0F3A78 */
6710 {
6711 { Bad_Opcode },
6712 { Bad_Opcode },
6713 { "vfnmaddps", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6714 },
6715
6716 /* PREFIX_VEX_0F3A79 */
6717 {
6718 { Bad_Opcode },
6719 { Bad_Opcode },
6720 { "vfnmaddpd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6721 },
6722
6723 /* PREFIX_VEX_0F3A7A */
6724 {
6725 { Bad_Opcode },
6726 { Bad_Opcode },
6727 { VEX_LEN_TABLE (VEX_LEN_0F3A7A_P_2) },
6728 },
6729
6730 /* PREFIX_VEX_0F3A7B */
6731 {
6732 { Bad_Opcode },
6733 { Bad_Opcode },
6734 { VEX_LEN_TABLE (VEX_LEN_0F3A7B_P_2) },
6735 },
6736
6737 /* PREFIX_VEX_0F3A7C */
6738 {
6739 { Bad_Opcode },
6740 { Bad_Opcode },
6741 { "vfnmsubps", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6742 { Bad_Opcode },
6743 },
6744
6745 /* PREFIX_VEX_0F3A7D */
6746 {
6747 { Bad_Opcode },
6748 { Bad_Opcode },
6749 { "vfnmsubpd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6750 },
6751
6752 /* PREFIX_VEX_0F3A7E */
6753 {
6754 { Bad_Opcode },
6755 { Bad_Opcode },
6756 { VEX_LEN_TABLE (VEX_LEN_0F3A7E_P_2) },
6757 },
6758
6759 /* PREFIX_VEX_0F3A7F */
6760 {
6761 { Bad_Opcode },
6762 { Bad_Opcode },
6763 { VEX_LEN_TABLE (VEX_LEN_0F3A7F_P_2) },
6764 },
6765
6766 /* PREFIX_VEX_0F3ACE */
6767 {
6768 { Bad_Opcode },
6769 { Bad_Opcode },
6770 { VEX_W_TABLE (VEX_W_0F3ACE_P_2) },
6771 },
6772
6773 /* PREFIX_VEX_0F3ACF */
6774 {
6775 { Bad_Opcode },
6776 { Bad_Opcode },
6777 { VEX_W_TABLE (VEX_W_0F3ACF_P_2) },
6778 },
6779
6780 /* PREFIX_VEX_0F3ADF */
6781 {
6782 { Bad_Opcode },
6783 { Bad_Opcode },
6784 { VEX_LEN_TABLE (VEX_LEN_0F3ADF_P_2) },
6785 },
6786
6787 /* PREFIX_VEX_0F3AF0 */
6788 {
6789 { Bad_Opcode },
6790 { Bad_Opcode },
6791 { Bad_Opcode },
6792 { VEX_LEN_TABLE (VEX_LEN_0F3AF0_P_3) },
6793 },
6794
6795 #include "i386-dis-evex-prefix.h"
6796 };
6797
6798 static const struct dis386 x86_64_table[][2] = {
6799 /* X86_64_06 */
6800 {
6801 { "pushP", { es }, 0 },
6802 },
6803
6804 /* X86_64_07 */
6805 {
6806 { "popP", { es }, 0 },
6807 },
6808
6809 /* X86_64_0D */
6810 {
6811 { "pushP", { cs }, 0 },
6812 },
6813
6814 /* X86_64_16 */
6815 {
6816 { "pushP", { ss }, 0 },
6817 },
6818
6819 /* X86_64_17 */
6820 {
6821 { "popP", { ss }, 0 },
6822 },
6823
6824 /* X86_64_1E */
6825 {
6826 { "pushP", { ds }, 0 },
6827 },
6828
6829 /* X86_64_1F */
6830 {
6831 { "popP", { ds }, 0 },
6832 },
6833
6834 /* X86_64_27 */
6835 {
6836 { "daa", { XX }, 0 },
6837 },
6838
6839 /* X86_64_2F */
6840 {
6841 { "das", { XX }, 0 },
6842 },
6843
6844 /* X86_64_37 */
6845 {
6846 { "aaa", { XX }, 0 },
6847 },
6848
6849 /* X86_64_3F */
6850 {
6851 { "aas", { XX }, 0 },
6852 },
6853
6854 /* X86_64_60 */
6855 {
6856 { "pushaP", { XX }, 0 },
6857 },
6858
6859 /* X86_64_61 */
6860 {
6861 { "popaP", { XX }, 0 },
6862 },
6863
6864 /* X86_64_62 */
6865 {
6866 { MOD_TABLE (MOD_62_32BIT) },
6867 { EVEX_TABLE (EVEX_0F) },
6868 },
6869
6870 /* X86_64_63 */
6871 {
6872 { "arpl", { Ew, Gw }, 0 },
6873 { "movs{lq|xd}", { Gv, Ed }, 0 },
6874 },
6875
6876 /* X86_64_6D */
6877 {
6878 { "ins{R|}", { Yzr, indirDX }, 0 },
6879 { "ins{G|}", { Yzr, indirDX }, 0 },
6880 },
6881
6882 /* X86_64_6F */
6883 {
6884 { "outs{R|}", { indirDXr, Xz }, 0 },
6885 { "outs{G|}", { indirDXr, Xz }, 0 },
6886 },
6887
6888 /* X86_64_82 */
6889 {
6890 /* Opcode 0x82 is an alias of opcode 0x80 in 32-bit mode. */
6891 { REG_TABLE (REG_80) },
6892 },
6893
6894 /* X86_64_9A */
6895 {
6896 { "Jcall{T|}", { Ap }, 0 },
6897 },
6898
6899 /* X86_64_C4 */
6900 {
6901 { MOD_TABLE (MOD_C4_32BIT) },
6902 { VEX_C4_TABLE (VEX_0F) },
6903 },
6904
6905 /* X86_64_C5 */
6906 {
6907 { MOD_TABLE (MOD_C5_32BIT) },
6908 { VEX_C5_TABLE (VEX_0F) },
6909 },
6910
6911 /* X86_64_CE */
6912 {
6913 { "into", { XX }, 0 },
6914 },
6915
6916 /* X86_64_D4 */
6917 {
6918 { "aam", { Ib }, 0 },
6919 },
6920
6921 /* X86_64_D5 */
6922 {
6923 { "aad", { Ib }, 0 },
6924 },
6925
6926 /* X86_64_E8 */
6927 {
6928 { "callP", { Jv, BND }, 0 },
6929 { "call@", { Jv, BND }, 0 }
6930 },
6931
6932 /* X86_64_E9 */
6933 {
6934 { "jmpP", { Jv, BND }, 0 },
6935 { "jmp@", { Jv, BND }, 0 }
6936 },
6937
6938 /* X86_64_EA */
6939 {
6940 { "Jjmp{T|}", { Ap }, 0 },
6941 },
6942
6943 /* X86_64_0F01_REG_0 */
6944 {
6945 { "sgdt{Q|IQ}", { M }, 0 },
6946 { "sgdt", { M }, 0 },
6947 },
6948
6949 /* X86_64_0F01_REG_1 */
6950 {
6951 { "sidt{Q|IQ}", { M }, 0 },
6952 { "sidt", { M }, 0 },
6953 },
6954
6955 /* X86_64_0F01_REG_2 */
6956 {
6957 { "lgdt{Q|Q}", { M }, 0 },
6958 { "lgdt", { M }, 0 },
6959 },
6960
6961 /* X86_64_0F01_REG_3 */
6962 {
6963 { "lidt{Q|Q}", { M }, 0 },
6964 { "lidt", { M }, 0 },
6965 },
6966 };
6967
6968 static const struct dis386 three_byte_table[][256] = {
6969
6970 /* THREE_BYTE_0F38 */
6971 {
6972 /* 00 */
6973 { "pshufb", { MX, EM }, PREFIX_OPCODE },
6974 { "phaddw", { MX, EM }, PREFIX_OPCODE },
6975 { "phaddd", { MX, EM }, PREFIX_OPCODE },
6976 { "phaddsw", { MX, EM }, PREFIX_OPCODE },
6977 { "pmaddubsw", { MX, EM }, PREFIX_OPCODE },
6978 { "phsubw", { MX, EM }, PREFIX_OPCODE },
6979 { "phsubd", { MX, EM }, PREFIX_OPCODE },
6980 { "phsubsw", { MX, EM }, PREFIX_OPCODE },
6981 /* 08 */
6982 { "psignb", { MX, EM }, PREFIX_OPCODE },
6983 { "psignw", { MX, EM }, PREFIX_OPCODE },
6984 { "psignd", { MX, EM }, PREFIX_OPCODE },
6985 { "pmulhrsw", { MX, EM }, PREFIX_OPCODE },
6986 { Bad_Opcode },
6987 { Bad_Opcode },
6988 { Bad_Opcode },
6989 { Bad_Opcode },
6990 /* 10 */
6991 { PREFIX_TABLE (PREFIX_0F3810) },
6992 { Bad_Opcode },
6993 { Bad_Opcode },
6994 { Bad_Opcode },
6995 { PREFIX_TABLE (PREFIX_0F3814) },
6996 { PREFIX_TABLE (PREFIX_0F3815) },
6997 { Bad_Opcode },
6998 { PREFIX_TABLE (PREFIX_0F3817) },
6999 /* 18 */
7000 { Bad_Opcode },
7001 { Bad_Opcode },
7002 { Bad_Opcode },
7003 { Bad_Opcode },
7004 { "pabsb", { MX, EM }, PREFIX_OPCODE },
7005 { "pabsw", { MX, EM }, PREFIX_OPCODE },
7006 { "pabsd", { MX, EM }, PREFIX_OPCODE },
7007 { Bad_Opcode },
7008 /* 20 */
7009 { PREFIX_TABLE (PREFIX_0F3820) },
7010 { PREFIX_TABLE (PREFIX_0F3821) },
7011 { PREFIX_TABLE (PREFIX_0F3822) },
7012 { PREFIX_TABLE (PREFIX_0F3823) },
7013 { PREFIX_TABLE (PREFIX_0F3824) },
7014 { PREFIX_TABLE (PREFIX_0F3825) },
7015 { Bad_Opcode },
7016 { Bad_Opcode },
7017 /* 28 */
7018 { PREFIX_TABLE (PREFIX_0F3828) },
7019 { PREFIX_TABLE (PREFIX_0F3829) },
7020 { PREFIX_TABLE (PREFIX_0F382A) },
7021 { PREFIX_TABLE (PREFIX_0F382B) },
7022 { Bad_Opcode },
7023 { Bad_Opcode },
7024 { Bad_Opcode },
7025 { Bad_Opcode },
7026 /* 30 */
7027 { PREFIX_TABLE (PREFIX_0F3830) },
7028 { PREFIX_TABLE (PREFIX_0F3831) },
7029 { PREFIX_TABLE (PREFIX_0F3832) },
7030 { PREFIX_TABLE (PREFIX_0F3833) },
7031 { PREFIX_TABLE (PREFIX_0F3834) },
7032 { PREFIX_TABLE (PREFIX_0F3835) },
7033 { Bad_Opcode },
7034 { PREFIX_TABLE (PREFIX_0F3837) },
7035 /* 38 */
7036 { PREFIX_TABLE (PREFIX_0F3838) },
7037 { PREFIX_TABLE (PREFIX_0F3839) },
7038 { PREFIX_TABLE (PREFIX_0F383A) },
7039 { PREFIX_TABLE (PREFIX_0F383B) },
7040 { PREFIX_TABLE (PREFIX_0F383C) },
7041 { PREFIX_TABLE (PREFIX_0F383D) },
7042 { PREFIX_TABLE (PREFIX_0F383E) },
7043 { PREFIX_TABLE (PREFIX_0F383F) },
7044 /* 40 */
7045 { PREFIX_TABLE (PREFIX_0F3840) },
7046 { PREFIX_TABLE (PREFIX_0F3841) },
7047 { Bad_Opcode },
7048 { Bad_Opcode },
7049 { Bad_Opcode },
7050 { Bad_Opcode },
7051 { Bad_Opcode },
7052 { Bad_Opcode },
7053 /* 48 */
7054 { Bad_Opcode },
7055 { Bad_Opcode },
7056 { Bad_Opcode },
7057 { Bad_Opcode },
7058 { Bad_Opcode },
7059 { Bad_Opcode },
7060 { Bad_Opcode },
7061 { Bad_Opcode },
7062 /* 50 */
7063 { Bad_Opcode },
7064 { Bad_Opcode },
7065 { Bad_Opcode },
7066 { Bad_Opcode },
7067 { Bad_Opcode },
7068 { Bad_Opcode },
7069 { Bad_Opcode },
7070 { Bad_Opcode },
7071 /* 58 */
7072 { Bad_Opcode },
7073 { Bad_Opcode },
7074 { Bad_Opcode },
7075 { Bad_Opcode },
7076 { Bad_Opcode },
7077 { Bad_Opcode },
7078 { Bad_Opcode },
7079 { Bad_Opcode },
7080 /* 60 */
7081 { Bad_Opcode },
7082 { Bad_Opcode },
7083 { Bad_Opcode },
7084 { Bad_Opcode },
7085 { Bad_Opcode },
7086 { Bad_Opcode },
7087 { Bad_Opcode },
7088 { Bad_Opcode },
7089 /* 68 */
7090 { Bad_Opcode },
7091 { Bad_Opcode },
7092 { Bad_Opcode },
7093 { Bad_Opcode },
7094 { Bad_Opcode },
7095 { Bad_Opcode },
7096 { Bad_Opcode },
7097 { Bad_Opcode },
7098 /* 70 */
7099 { Bad_Opcode },
7100 { Bad_Opcode },
7101 { Bad_Opcode },
7102 { Bad_Opcode },
7103 { Bad_Opcode },
7104 { Bad_Opcode },
7105 { Bad_Opcode },
7106 { Bad_Opcode },
7107 /* 78 */
7108 { Bad_Opcode },
7109 { Bad_Opcode },
7110 { Bad_Opcode },
7111 { Bad_Opcode },
7112 { Bad_Opcode },
7113 { Bad_Opcode },
7114 { Bad_Opcode },
7115 { Bad_Opcode },
7116 /* 80 */
7117 { PREFIX_TABLE (PREFIX_0F3880) },
7118 { PREFIX_TABLE (PREFIX_0F3881) },
7119 { PREFIX_TABLE (PREFIX_0F3882) },
7120 { Bad_Opcode },
7121 { Bad_Opcode },
7122 { Bad_Opcode },
7123 { Bad_Opcode },
7124 { Bad_Opcode },
7125 /* 88 */
7126 { Bad_Opcode },
7127 { Bad_Opcode },
7128 { Bad_Opcode },
7129 { Bad_Opcode },
7130 { Bad_Opcode },
7131 { Bad_Opcode },
7132 { Bad_Opcode },
7133 { Bad_Opcode },
7134 /* 90 */
7135 { Bad_Opcode },
7136 { Bad_Opcode },
7137 { Bad_Opcode },
7138 { Bad_Opcode },
7139 { Bad_Opcode },
7140 { Bad_Opcode },
7141 { Bad_Opcode },
7142 { Bad_Opcode },
7143 /* 98 */
7144 { Bad_Opcode },
7145 { Bad_Opcode },
7146 { Bad_Opcode },
7147 { Bad_Opcode },
7148 { Bad_Opcode },
7149 { Bad_Opcode },
7150 { Bad_Opcode },
7151 { Bad_Opcode },
7152 /* a0 */
7153 { Bad_Opcode },
7154 { Bad_Opcode },
7155 { Bad_Opcode },
7156 { Bad_Opcode },
7157 { Bad_Opcode },
7158 { Bad_Opcode },
7159 { Bad_Opcode },
7160 { Bad_Opcode },
7161 /* a8 */
7162 { Bad_Opcode },
7163 { Bad_Opcode },
7164 { Bad_Opcode },
7165 { Bad_Opcode },
7166 { Bad_Opcode },
7167 { Bad_Opcode },
7168 { Bad_Opcode },
7169 { Bad_Opcode },
7170 /* b0 */
7171 { Bad_Opcode },
7172 { Bad_Opcode },
7173 { Bad_Opcode },
7174 { Bad_Opcode },
7175 { Bad_Opcode },
7176 { Bad_Opcode },
7177 { Bad_Opcode },
7178 { Bad_Opcode },
7179 /* b8 */
7180 { Bad_Opcode },
7181 { Bad_Opcode },
7182 { Bad_Opcode },
7183 { Bad_Opcode },
7184 { Bad_Opcode },
7185 { Bad_Opcode },
7186 { Bad_Opcode },
7187 { Bad_Opcode },
7188 /* c0 */
7189 { Bad_Opcode },
7190 { Bad_Opcode },
7191 { Bad_Opcode },
7192 { Bad_Opcode },
7193 { Bad_Opcode },
7194 { Bad_Opcode },
7195 { Bad_Opcode },
7196 { Bad_Opcode },
7197 /* c8 */
7198 { PREFIX_TABLE (PREFIX_0F38C8) },
7199 { PREFIX_TABLE (PREFIX_0F38C9) },
7200 { PREFIX_TABLE (PREFIX_0F38CA) },
7201 { PREFIX_TABLE (PREFIX_0F38CB) },
7202 { PREFIX_TABLE (PREFIX_0F38CC) },
7203 { PREFIX_TABLE (PREFIX_0F38CD) },
7204 { Bad_Opcode },
7205 { PREFIX_TABLE (PREFIX_0F38CF) },
7206 /* d0 */
7207 { Bad_Opcode },
7208 { Bad_Opcode },
7209 { Bad_Opcode },
7210 { Bad_Opcode },
7211 { Bad_Opcode },
7212 { Bad_Opcode },
7213 { Bad_Opcode },
7214 { Bad_Opcode },
7215 /* d8 */
7216 { Bad_Opcode },
7217 { Bad_Opcode },
7218 { Bad_Opcode },
7219 { PREFIX_TABLE (PREFIX_0F38DB) },
7220 { PREFIX_TABLE (PREFIX_0F38DC) },
7221 { PREFIX_TABLE (PREFIX_0F38DD) },
7222 { PREFIX_TABLE (PREFIX_0F38DE) },
7223 { PREFIX_TABLE (PREFIX_0F38DF) },
7224 /* e0 */
7225 { Bad_Opcode },
7226 { Bad_Opcode },
7227 { Bad_Opcode },
7228 { Bad_Opcode },
7229 { Bad_Opcode },
7230 { Bad_Opcode },
7231 { Bad_Opcode },
7232 { Bad_Opcode },
7233 /* e8 */
7234 { Bad_Opcode },
7235 { Bad_Opcode },
7236 { Bad_Opcode },
7237 { Bad_Opcode },
7238 { Bad_Opcode },
7239 { Bad_Opcode },
7240 { Bad_Opcode },
7241 { Bad_Opcode },
7242 /* f0 */
7243 { PREFIX_TABLE (PREFIX_0F38F0) },
7244 { PREFIX_TABLE (PREFIX_0F38F1) },
7245 { Bad_Opcode },
7246 { Bad_Opcode },
7247 { Bad_Opcode },
7248 { PREFIX_TABLE (PREFIX_0F38F5) },
7249 { PREFIX_TABLE (PREFIX_0F38F6) },
7250 { Bad_Opcode },
7251 /* f8 */
7252 { PREFIX_TABLE (PREFIX_0F38F8) },
7253 { PREFIX_TABLE (PREFIX_0F38F9) },
7254 { Bad_Opcode },
7255 { Bad_Opcode },
7256 { Bad_Opcode },
7257 { Bad_Opcode },
7258 { Bad_Opcode },
7259 { Bad_Opcode },
7260 },
7261 /* THREE_BYTE_0F3A */
7262 {
7263 /* 00 */
7264 { Bad_Opcode },
7265 { Bad_Opcode },
7266 { Bad_Opcode },
7267 { Bad_Opcode },
7268 { Bad_Opcode },
7269 { Bad_Opcode },
7270 { Bad_Opcode },
7271 { Bad_Opcode },
7272 /* 08 */
7273 { PREFIX_TABLE (PREFIX_0F3A08) },
7274 { PREFIX_TABLE (PREFIX_0F3A09) },
7275 { PREFIX_TABLE (PREFIX_0F3A0A) },
7276 { PREFIX_TABLE (PREFIX_0F3A0B) },
7277 { PREFIX_TABLE (PREFIX_0F3A0C) },
7278 { PREFIX_TABLE (PREFIX_0F3A0D) },
7279 { PREFIX_TABLE (PREFIX_0F3A0E) },
7280 { "palignr", { MX, EM, Ib }, PREFIX_OPCODE },
7281 /* 10 */
7282 { Bad_Opcode },
7283 { Bad_Opcode },
7284 { Bad_Opcode },
7285 { Bad_Opcode },
7286 { PREFIX_TABLE (PREFIX_0F3A14) },
7287 { PREFIX_TABLE (PREFIX_0F3A15) },
7288 { PREFIX_TABLE (PREFIX_0F3A16) },
7289 { PREFIX_TABLE (PREFIX_0F3A17) },
7290 /* 18 */
7291 { Bad_Opcode },
7292 { Bad_Opcode },
7293 { Bad_Opcode },
7294 { Bad_Opcode },
7295 { Bad_Opcode },
7296 { Bad_Opcode },
7297 { Bad_Opcode },
7298 { Bad_Opcode },
7299 /* 20 */
7300 { PREFIX_TABLE (PREFIX_0F3A20) },
7301 { PREFIX_TABLE (PREFIX_0F3A21) },
7302 { PREFIX_TABLE (PREFIX_0F3A22) },
7303 { Bad_Opcode },
7304 { Bad_Opcode },
7305 { Bad_Opcode },
7306 { Bad_Opcode },
7307 { Bad_Opcode },
7308 /* 28 */
7309 { Bad_Opcode },
7310 { Bad_Opcode },
7311 { Bad_Opcode },
7312 { Bad_Opcode },
7313 { Bad_Opcode },
7314 { Bad_Opcode },
7315 { Bad_Opcode },
7316 { Bad_Opcode },
7317 /* 30 */
7318 { Bad_Opcode },
7319 { Bad_Opcode },
7320 { Bad_Opcode },
7321 { Bad_Opcode },
7322 { Bad_Opcode },
7323 { Bad_Opcode },
7324 { Bad_Opcode },
7325 { Bad_Opcode },
7326 /* 38 */
7327 { Bad_Opcode },
7328 { Bad_Opcode },
7329 { Bad_Opcode },
7330 { Bad_Opcode },
7331 { Bad_Opcode },
7332 { Bad_Opcode },
7333 { Bad_Opcode },
7334 { Bad_Opcode },
7335 /* 40 */
7336 { PREFIX_TABLE (PREFIX_0F3A40) },
7337 { PREFIX_TABLE (PREFIX_0F3A41) },
7338 { PREFIX_TABLE (PREFIX_0F3A42) },
7339 { Bad_Opcode },
7340 { PREFIX_TABLE (PREFIX_0F3A44) },
7341 { Bad_Opcode },
7342 { Bad_Opcode },
7343 { Bad_Opcode },
7344 /* 48 */
7345 { Bad_Opcode },
7346 { Bad_Opcode },
7347 { Bad_Opcode },
7348 { Bad_Opcode },
7349 { Bad_Opcode },
7350 { Bad_Opcode },
7351 { Bad_Opcode },
7352 { Bad_Opcode },
7353 /* 50 */
7354 { Bad_Opcode },
7355 { Bad_Opcode },
7356 { Bad_Opcode },
7357 { Bad_Opcode },
7358 { Bad_Opcode },
7359 { Bad_Opcode },
7360 { Bad_Opcode },
7361 { Bad_Opcode },
7362 /* 58 */
7363 { Bad_Opcode },
7364 { Bad_Opcode },
7365 { Bad_Opcode },
7366 { Bad_Opcode },
7367 { Bad_Opcode },
7368 { Bad_Opcode },
7369 { Bad_Opcode },
7370 { Bad_Opcode },
7371 /* 60 */
7372 { PREFIX_TABLE (PREFIX_0F3A60) },
7373 { PREFIX_TABLE (PREFIX_0F3A61) },
7374 { PREFIX_TABLE (PREFIX_0F3A62) },
7375 { PREFIX_TABLE (PREFIX_0F3A63) },
7376 { Bad_Opcode },
7377 { Bad_Opcode },
7378 { Bad_Opcode },
7379 { Bad_Opcode },
7380 /* 68 */
7381 { Bad_Opcode },
7382 { Bad_Opcode },
7383 { Bad_Opcode },
7384 { Bad_Opcode },
7385 { Bad_Opcode },
7386 { Bad_Opcode },
7387 { Bad_Opcode },
7388 { Bad_Opcode },
7389 /* 70 */
7390 { Bad_Opcode },
7391 { Bad_Opcode },
7392 { Bad_Opcode },
7393 { Bad_Opcode },
7394 { Bad_Opcode },
7395 { Bad_Opcode },
7396 { Bad_Opcode },
7397 { Bad_Opcode },
7398 /* 78 */
7399 { Bad_Opcode },
7400 { Bad_Opcode },
7401 { Bad_Opcode },
7402 { Bad_Opcode },
7403 { Bad_Opcode },
7404 { Bad_Opcode },
7405 { Bad_Opcode },
7406 { Bad_Opcode },
7407 /* 80 */
7408 { Bad_Opcode },
7409 { Bad_Opcode },
7410 { Bad_Opcode },
7411 { Bad_Opcode },
7412 { Bad_Opcode },
7413 { Bad_Opcode },
7414 { Bad_Opcode },
7415 { Bad_Opcode },
7416 /* 88 */
7417 { Bad_Opcode },
7418 { Bad_Opcode },
7419 { Bad_Opcode },
7420 { Bad_Opcode },
7421 { Bad_Opcode },
7422 { Bad_Opcode },
7423 { Bad_Opcode },
7424 { Bad_Opcode },
7425 /* 90 */
7426 { Bad_Opcode },
7427 { Bad_Opcode },
7428 { Bad_Opcode },
7429 { Bad_Opcode },
7430 { Bad_Opcode },
7431 { Bad_Opcode },
7432 { Bad_Opcode },
7433 { Bad_Opcode },
7434 /* 98 */
7435 { Bad_Opcode },
7436 { Bad_Opcode },
7437 { Bad_Opcode },
7438 { Bad_Opcode },
7439 { Bad_Opcode },
7440 { Bad_Opcode },
7441 { Bad_Opcode },
7442 { Bad_Opcode },
7443 /* a0 */
7444 { Bad_Opcode },
7445 { Bad_Opcode },
7446 { Bad_Opcode },
7447 { Bad_Opcode },
7448 { Bad_Opcode },
7449 { Bad_Opcode },
7450 { Bad_Opcode },
7451 { Bad_Opcode },
7452 /* a8 */
7453 { Bad_Opcode },
7454 { Bad_Opcode },
7455 { Bad_Opcode },
7456 { Bad_Opcode },
7457 { Bad_Opcode },
7458 { Bad_Opcode },
7459 { Bad_Opcode },
7460 { Bad_Opcode },
7461 /* b0 */
7462 { Bad_Opcode },
7463 { Bad_Opcode },
7464 { Bad_Opcode },
7465 { Bad_Opcode },
7466 { Bad_Opcode },
7467 { Bad_Opcode },
7468 { Bad_Opcode },
7469 { Bad_Opcode },
7470 /* b8 */
7471 { Bad_Opcode },
7472 { Bad_Opcode },
7473 { Bad_Opcode },
7474 { Bad_Opcode },
7475 { Bad_Opcode },
7476 { Bad_Opcode },
7477 { Bad_Opcode },
7478 { Bad_Opcode },
7479 /* c0 */
7480 { Bad_Opcode },
7481 { Bad_Opcode },
7482 { Bad_Opcode },
7483 { Bad_Opcode },
7484 { Bad_Opcode },
7485 { Bad_Opcode },
7486 { Bad_Opcode },
7487 { Bad_Opcode },
7488 /* c8 */
7489 { Bad_Opcode },
7490 { Bad_Opcode },
7491 { Bad_Opcode },
7492 { Bad_Opcode },
7493 { PREFIX_TABLE (PREFIX_0F3ACC) },
7494 { Bad_Opcode },
7495 { PREFIX_TABLE (PREFIX_0F3ACE) },
7496 { PREFIX_TABLE (PREFIX_0F3ACF) },
7497 /* d0 */
7498 { Bad_Opcode },
7499 { Bad_Opcode },
7500 { Bad_Opcode },
7501 { Bad_Opcode },
7502 { Bad_Opcode },
7503 { Bad_Opcode },
7504 { Bad_Opcode },
7505 { Bad_Opcode },
7506 /* d8 */
7507 { Bad_Opcode },
7508 { Bad_Opcode },
7509 { Bad_Opcode },
7510 { Bad_Opcode },
7511 { Bad_Opcode },
7512 { Bad_Opcode },
7513 { Bad_Opcode },
7514 { PREFIX_TABLE (PREFIX_0F3ADF) },
7515 /* e0 */
7516 { Bad_Opcode },
7517 { Bad_Opcode },
7518 { Bad_Opcode },
7519 { Bad_Opcode },
7520 { Bad_Opcode },
7521 { Bad_Opcode },
7522 { Bad_Opcode },
7523 { Bad_Opcode },
7524 /* e8 */
7525 { Bad_Opcode },
7526 { Bad_Opcode },
7527 { Bad_Opcode },
7528 { Bad_Opcode },
7529 { Bad_Opcode },
7530 { Bad_Opcode },
7531 { Bad_Opcode },
7532 { Bad_Opcode },
7533 /* f0 */
7534 { Bad_Opcode },
7535 { Bad_Opcode },
7536 { Bad_Opcode },
7537 { Bad_Opcode },
7538 { Bad_Opcode },
7539 { Bad_Opcode },
7540 { Bad_Opcode },
7541 { Bad_Opcode },
7542 /* f8 */
7543 { Bad_Opcode },
7544 { Bad_Opcode },
7545 { Bad_Opcode },
7546 { Bad_Opcode },
7547 { Bad_Opcode },
7548 { Bad_Opcode },
7549 { Bad_Opcode },
7550 { Bad_Opcode },
7551 },
7552 };
7553
7554 static const struct dis386 xop_table[][256] = {
7555 /* XOP_08 */
7556 {
7557 /* 00 */
7558 { Bad_Opcode },
7559 { Bad_Opcode },
7560 { Bad_Opcode },
7561 { Bad_Opcode },
7562 { Bad_Opcode },
7563 { Bad_Opcode },
7564 { Bad_Opcode },
7565 { Bad_Opcode },
7566 /* 08 */
7567 { Bad_Opcode },
7568 { Bad_Opcode },
7569 { Bad_Opcode },
7570 { Bad_Opcode },
7571 { Bad_Opcode },
7572 { Bad_Opcode },
7573 { Bad_Opcode },
7574 { Bad_Opcode },
7575 /* 10 */
7576 { Bad_Opcode },
7577 { Bad_Opcode },
7578 { Bad_Opcode },
7579 { Bad_Opcode },
7580 { Bad_Opcode },
7581 { Bad_Opcode },
7582 { Bad_Opcode },
7583 { Bad_Opcode },
7584 /* 18 */
7585 { Bad_Opcode },
7586 { Bad_Opcode },
7587 { Bad_Opcode },
7588 { Bad_Opcode },
7589 { Bad_Opcode },
7590 { Bad_Opcode },
7591 { Bad_Opcode },
7592 { Bad_Opcode },
7593 /* 20 */
7594 { Bad_Opcode },
7595 { Bad_Opcode },
7596 { Bad_Opcode },
7597 { Bad_Opcode },
7598 { Bad_Opcode },
7599 { Bad_Opcode },
7600 { Bad_Opcode },
7601 { Bad_Opcode },
7602 /* 28 */
7603 { Bad_Opcode },
7604 { Bad_Opcode },
7605 { Bad_Opcode },
7606 { Bad_Opcode },
7607 { Bad_Opcode },
7608 { Bad_Opcode },
7609 { Bad_Opcode },
7610 { Bad_Opcode },
7611 /* 30 */
7612 { Bad_Opcode },
7613 { Bad_Opcode },
7614 { Bad_Opcode },
7615 { Bad_Opcode },
7616 { Bad_Opcode },
7617 { Bad_Opcode },
7618 { Bad_Opcode },
7619 { Bad_Opcode },
7620 /* 38 */
7621 { Bad_Opcode },
7622 { Bad_Opcode },
7623 { Bad_Opcode },
7624 { Bad_Opcode },
7625 { Bad_Opcode },
7626 { Bad_Opcode },
7627 { Bad_Opcode },
7628 { Bad_Opcode },
7629 /* 40 */
7630 { Bad_Opcode },
7631 { Bad_Opcode },
7632 { Bad_Opcode },
7633 { Bad_Opcode },
7634 { Bad_Opcode },
7635 { Bad_Opcode },
7636 { Bad_Opcode },
7637 { Bad_Opcode },
7638 /* 48 */
7639 { Bad_Opcode },
7640 { Bad_Opcode },
7641 { Bad_Opcode },
7642 { Bad_Opcode },
7643 { Bad_Opcode },
7644 { Bad_Opcode },
7645 { Bad_Opcode },
7646 { Bad_Opcode },
7647 /* 50 */
7648 { Bad_Opcode },
7649 { Bad_Opcode },
7650 { Bad_Opcode },
7651 { Bad_Opcode },
7652 { Bad_Opcode },
7653 { Bad_Opcode },
7654 { Bad_Opcode },
7655 { Bad_Opcode },
7656 /* 58 */
7657 { Bad_Opcode },
7658 { Bad_Opcode },
7659 { Bad_Opcode },
7660 { Bad_Opcode },
7661 { Bad_Opcode },
7662 { Bad_Opcode },
7663 { Bad_Opcode },
7664 { Bad_Opcode },
7665 /* 60 */
7666 { Bad_Opcode },
7667 { Bad_Opcode },
7668 { Bad_Opcode },
7669 { Bad_Opcode },
7670 { Bad_Opcode },
7671 { Bad_Opcode },
7672 { Bad_Opcode },
7673 { Bad_Opcode },
7674 /* 68 */
7675 { Bad_Opcode },
7676 { Bad_Opcode },
7677 { Bad_Opcode },
7678 { Bad_Opcode },
7679 { Bad_Opcode },
7680 { Bad_Opcode },
7681 { Bad_Opcode },
7682 { Bad_Opcode },
7683 /* 70 */
7684 { Bad_Opcode },
7685 { Bad_Opcode },
7686 { Bad_Opcode },
7687 { Bad_Opcode },
7688 { Bad_Opcode },
7689 { Bad_Opcode },
7690 { Bad_Opcode },
7691 { Bad_Opcode },
7692 /* 78 */
7693 { Bad_Opcode },
7694 { Bad_Opcode },
7695 { Bad_Opcode },
7696 { Bad_Opcode },
7697 { Bad_Opcode },
7698 { Bad_Opcode },
7699 { Bad_Opcode },
7700 { Bad_Opcode },
7701 /* 80 */
7702 { Bad_Opcode },
7703 { Bad_Opcode },
7704 { Bad_Opcode },
7705 { Bad_Opcode },
7706 { Bad_Opcode },
7707 { "vpmacssww", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7708 { "vpmacsswd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7709 { "vpmacssdql", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7710 /* 88 */
7711 { Bad_Opcode },
7712 { Bad_Opcode },
7713 { Bad_Opcode },
7714 { Bad_Opcode },
7715 { Bad_Opcode },
7716 { Bad_Opcode },
7717 { "vpmacssdd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7718 { "vpmacssdqh", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7719 /* 90 */
7720 { Bad_Opcode },
7721 { Bad_Opcode },
7722 { Bad_Opcode },
7723 { Bad_Opcode },
7724 { Bad_Opcode },
7725 { "vpmacsww", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7726 { "vpmacswd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7727 { "vpmacsdql", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7728 /* 98 */
7729 { Bad_Opcode },
7730 { Bad_Opcode },
7731 { Bad_Opcode },
7732 { Bad_Opcode },
7733 { Bad_Opcode },
7734 { Bad_Opcode },
7735 { "vpmacsdd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7736 { "vpmacsdqh", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7737 /* a0 */
7738 { Bad_Opcode },
7739 { Bad_Opcode },
7740 { "vpcmov", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7741 { "vpperm", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7742 { Bad_Opcode },
7743 { Bad_Opcode },
7744 { "vpmadcsswd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7745 { Bad_Opcode },
7746 /* a8 */
7747 { Bad_Opcode },
7748 { Bad_Opcode },
7749 { Bad_Opcode },
7750 { Bad_Opcode },
7751 { Bad_Opcode },
7752 { Bad_Opcode },
7753 { Bad_Opcode },
7754 { Bad_Opcode },
7755 /* b0 */
7756 { Bad_Opcode },
7757 { Bad_Opcode },
7758 { Bad_Opcode },
7759 { Bad_Opcode },
7760 { Bad_Opcode },
7761 { Bad_Opcode },
7762 { "vpmadcswd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7763 { Bad_Opcode },
7764 /* b8 */
7765 { Bad_Opcode },
7766 { Bad_Opcode },
7767 { Bad_Opcode },
7768 { Bad_Opcode },
7769 { Bad_Opcode },
7770 { Bad_Opcode },
7771 { Bad_Opcode },
7772 { Bad_Opcode },
7773 /* c0 */
7774 { "vprotb", { XM, Vex_2src_1, Ib }, 0 },
7775 { "vprotw", { XM, Vex_2src_1, Ib }, 0 },
7776 { "vprotd", { XM, Vex_2src_1, Ib }, 0 },
7777 { "vprotq", { XM, Vex_2src_1, Ib }, 0 },
7778 { Bad_Opcode },
7779 { Bad_Opcode },
7780 { Bad_Opcode },
7781 { Bad_Opcode },
7782 /* c8 */
7783 { Bad_Opcode },
7784 { Bad_Opcode },
7785 { Bad_Opcode },
7786 { Bad_Opcode },
7787 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CC) },
7788 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CD) },
7789 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CE) },
7790 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CF) },
7791 /* d0 */
7792 { Bad_Opcode },
7793 { Bad_Opcode },
7794 { Bad_Opcode },
7795 { Bad_Opcode },
7796 { Bad_Opcode },
7797 { Bad_Opcode },
7798 { Bad_Opcode },
7799 { Bad_Opcode },
7800 /* d8 */
7801 { Bad_Opcode },
7802 { Bad_Opcode },
7803 { Bad_Opcode },
7804 { Bad_Opcode },
7805 { Bad_Opcode },
7806 { Bad_Opcode },
7807 { Bad_Opcode },
7808 { Bad_Opcode },
7809 /* e0 */
7810 { Bad_Opcode },
7811 { Bad_Opcode },
7812 { Bad_Opcode },
7813 { Bad_Opcode },
7814 { Bad_Opcode },
7815 { Bad_Opcode },
7816 { Bad_Opcode },
7817 { Bad_Opcode },
7818 /* e8 */
7819 { Bad_Opcode },
7820 { Bad_Opcode },
7821 { Bad_Opcode },
7822 { Bad_Opcode },
7823 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EC) },
7824 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_ED) },
7825 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EE) },
7826 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EF) },
7827 /* f0 */
7828 { Bad_Opcode },
7829 { Bad_Opcode },
7830 { Bad_Opcode },
7831 { Bad_Opcode },
7832 { Bad_Opcode },
7833 { Bad_Opcode },
7834 { Bad_Opcode },
7835 { Bad_Opcode },
7836 /* f8 */
7837 { Bad_Opcode },
7838 { Bad_Opcode },
7839 { Bad_Opcode },
7840 { Bad_Opcode },
7841 { Bad_Opcode },
7842 { Bad_Opcode },
7843 { Bad_Opcode },
7844 { Bad_Opcode },
7845 },
7846 /* XOP_09 */
7847 {
7848 /* 00 */
7849 { Bad_Opcode },
7850 { REG_TABLE (REG_XOP_TBM_01) },
7851 { REG_TABLE (REG_XOP_TBM_02) },
7852 { Bad_Opcode },
7853 { Bad_Opcode },
7854 { Bad_Opcode },
7855 { Bad_Opcode },
7856 { Bad_Opcode },
7857 /* 08 */
7858 { Bad_Opcode },
7859 { Bad_Opcode },
7860 { Bad_Opcode },
7861 { Bad_Opcode },
7862 { Bad_Opcode },
7863 { Bad_Opcode },
7864 { Bad_Opcode },
7865 { Bad_Opcode },
7866 /* 10 */
7867 { Bad_Opcode },
7868 { Bad_Opcode },
7869 { REG_TABLE (REG_XOP_LWPCB) },
7870 { Bad_Opcode },
7871 { Bad_Opcode },
7872 { Bad_Opcode },
7873 { Bad_Opcode },
7874 { Bad_Opcode },
7875 /* 18 */
7876 { Bad_Opcode },
7877 { Bad_Opcode },
7878 { Bad_Opcode },
7879 { Bad_Opcode },
7880 { Bad_Opcode },
7881 { Bad_Opcode },
7882 { Bad_Opcode },
7883 { Bad_Opcode },
7884 /* 20 */
7885 { Bad_Opcode },
7886 { Bad_Opcode },
7887 { Bad_Opcode },
7888 { Bad_Opcode },
7889 { Bad_Opcode },
7890 { Bad_Opcode },
7891 { Bad_Opcode },
7892 { Bad_Opcode },
7893 /* 28 */
7894 { Bad_Opcode },
7895 { Bad_Opcode },
7896 { Bad_Opcode },
7897 { Bad_Opcode },
7898 { Bad_Opcode },
7899 { Bad_Opcode },
7900 { Bad_Opcode },
7901 { Bad_Opcode },
7902 /* 30 */
7903 { Bad_Opcode },
7904 { Bad_Opcode },
7905 { Bad_Opcode },
7906 { Bad_Opcode },
7907 { Bad_Opcode },
7908 { Bad_Opcode },
7909 { Bad_Opcode },
7910 { Bad_Opcode },
7911 /* 38 */
7912 { Bad_Opcode },
7913 { Bad_Opcode },
7914 { Bad_Opcode },
7915 { Bad_Opcode },
7916 { Bad_Opcode },
7917 { Bad_Opcode },
7918 { Bad_Opcode },
7919 { Bad_Opcode },
7920 /* 40 */
7921 { Bad_Opcode },
7922 { Bad_Opcode },
7923 { Bad_Opcode },
7924 { Bad_Opcode },
7925 { Bad_Opcode },
7926 { Bad_Opcode },
7927 { Bad_Opcode },
7928 { Bad_Opcode },
7929 /* 48 */
7930 { Bad_Opcode },
7931 { Bad_Opcode },
7932 { Bad_Opcode },
7933 { Bad_Opcode },
7934 { Bad_Opcode },
7935 { Bad_Opcode },
7936 { Bad_Opcode },
7937 { Bad_Opcode },
7938 /* 50 */
7939 { Bad_Opcode },
7940 { Bad_Opcode },
7941 { Bad_Opcode },
7942 { Bad_Opcode },
7943 { Bad_Opcode },
7944 { Bad_Opcode },
7945 { Bad_Opcode },
7946 { Bad_Opcode },
7947 /* 58 */
7948 { Bad_Opcode },
7949 { Bad_Opcode },
7950 { Bad_Opcode },
7951 { Bad_Opcode },
7952 { Bad_Opcode },
7953 { Bad_Opcode },
7954 { Bad_Opcode },
7955 { Bad_Opcode },
7956 /* 60 */
7957 { Bad_Opcode },
7958 { Bad_Opcode },
7959 { Bad_Opcode },
7960 { Bad_Opcode },
7961 { Bad_Opcode },
7962 { Bad_Opcode },
7963 { Bad_Opcode },
7964 { Bad_Opcode },
7965 /* 68 */
7966 { Bad_Opcode },
7967 { Bad_Opcode },
7968 { Bad_Opcode },
7969 { Bad_Opcode },
7970 { Bad_Opcode },
7971 { Bad_Opcode },
7972 { Bad_Opcode },
7973 { Bad_Opcode },
7974 /* 70 */
7975 { Bad_Opcode },
7976 { Bad_Opcode },
7977 { Bad_Opcode },
7978 { Bad_Opcode },
7979 { Bad_Opcode },
7980 { Bad_Opcode },
7981 { Bad_Opcode },
7982 { Bad_Opcode },
7983 /* 78 */
7984 { Bad_Opcode },
7985 { Bad_Opcode },
7986 { Bad_Opcode },
7987 { Bad_Opcode },
7988 { Bad_Opcode },
7989 { Bad_Opcode },
7990 { Bad_Opcode },
7991 { Bad_Opcode },
7992 /* 80 */
7993 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_80) },
7994 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_81) },
7995 { "vfrczss", { XM, EXd }, 0 },
7996 { "vfrczsd", { XM, EXq }, 0 },
7997 { Bad_Opcode },
7998 { Bad_Opcode },
7999 { Bad_Opcode },
8000 { Bad_Opcode },
8001 /* 88 */
8002 { Bad_Opcode },
8003 { Bad_Opcode },
8004 { Bad_Opcode },
8005 { Bad_Opcode },
8006 { Bad_Opcode },
8007 { Bad_Opcode },
8008 { Bad_Opcode },
8009 { Bad_Opcode },
8010 /* 90 */
8011 { "vprotb", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8012 { "vprotw", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8013 { "vprotd", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8014 { "vprotq", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8015 { "vpshlb", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8016 { "vpshlw", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8017 { "vpshld", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8018 { "vpshlq", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8019 /* 98 */
8020 { "vpshab", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8021 { "vpshaw", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8022 { "vpshad", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8023 { "vpshaq", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8024 { Bad_Opcode },
8025 { Bad_Opcode },
8026 { Bad_Opcode },
8027 { Bad_Opcode },
8028 /* a0 */
8029 { Bad_Opcode },
8030 { Bad_Opcode },
8031 { Bad_Opcode },
8032 { Bad_Opcode },
8033 { Bad_Opcode },
8034 { Bad_Opcode },
8035 { Bad_Opcode },
8036 { Bad_Opcode },
8037 /* a8 */
8038 { Bad_Opcode },
8039 { Bad_Opcode },
8040 { Bad_Opcode },
8041 { Bad_Opcode },
8042 { Bad_Opcode },
8043 { Bad_Opcode },
8044 { Bad_Opcode },
8045 { Bad_Opcode },
8046 /* b0 */
8047 { Bad_Opcode },
8048 { Bad_Opcode },
8049 { Bad_Opcode },
8050 { Bad_Opcode },
8051 { Bad_Opcode },
8052 { Bad_Opcode },
8053 { Bad_Opcode },
8054 { Bad_Opcode },
8055 /* b8 */
8056 { Bad_Opcode },
8057 { Bad_Opcode },
8058 { Bad_Opcode },
8059 { Bad_Opcode },
8060 { Bad_Opcode },
8061 { Bad_Opcode },
8062 { Bad_Opcode },
8063 { Bad_Opcode },
8064 /* c0 */
8065 { Bad_Opcode },
8066 { "vphaddbw", { XM, EXxmm }, 0 },
8067 { "vphaddbd", { XM, EXxmm }, 0 },
8068 { "vphaddbq", { XM, EXxmm }, 0 },
8069 { Bad_Opcode },
8070 { Bad_Opcode },
8071 { "vphaddwd", { XM, EXxmm }, 0 },
8072 { "vphaddwq", { XM, EXxmm }, 0 },
8073 /* c8 */
8074 { Bad_Opcode },
8075 { Bad_Opcode },
8076 { Bad_Opcode },
8077 { "vphadddq", { XM, EXxmm }, 0 },
8078 { Bad_Opcode },
8079 { Bad_Opcode },
8080 { Bad_Opcode },
8081 { Bad_Opcode },
8082 /* d0 */
8083 { Bad_Opcode },
8084 { "vphaddubw", { XM, EXxmm }, 0 },
8085 { "vphaddubd", { XM, EXxmm }, 0 },
8086 { "vphaddubq", { XM, EXxmm }, 0 },
8087 { Bad_Opcode },
8088 { Bad_Opcode },
8089 { "vphadduwd", { XM, EXxmm }, 0 },
8090 { "vphadduwq", { XM, EXxmm }, 0 },
8091 /* d8 */
8092 { Bad_Opcode },
8093 { Bad_Opcode },
8094 { Bad_Opcode },
8095 { "vphaddudq", { XM, EXxmm }, 0 },
8096 { Bad_Opcode },
8097 { Bad_Opcode },
8098 { Bad_Opcode },
8099 { Bad_Opcode },
8100 /* e0 */
8101 { Bad_Opcode },
8102 { "vphsubbw", { XM, EXxmm }, 0 },
8103 { "vphsubwd", { XM, EXxmm }, 0 },
8104 { "vphsubdq", { XM, EXxmm }, 0 },
8105 { Bad_Opcode },
8106 { Bad_Opcode },
8107 { Bad_Opcode },
8108 { Bad_Opcode },
8109 /* e8 */
8110 { Bad_Opcode },
8111 { Bad_Opcode },
8112 { Bad_Opcode },
8113 { Bad_Opcode },
8114 { Bad_Opcode },
8115 { Bad_Opcode },
8116 { Bad_Opcode },
8117 { Bad_Opcode },
8118 /* f0 */
8119 { Bad_Opcode },
8120 { Bad_Opcode },
8121 { Bad_Opcode },
8122 { Bad_Opcode },
8123 { Bad_Opcode },
8124 { Bad_Opcode },
8125 { Bad_Opcode },
8126 { Bad_Opcode },
8127 /* f8 */
8128 { Bad_Opcode },
8129 { Bad_Opcode },
8130 { Bad_Opcode },
8131 { Bad_Opcode },
8132 { Bad_Opcode },
8133 { Bad_Opcode },
8134 { Bad_Opcode },
8135 { Bad_Opcode },
8136 },
8137 /* XOP_0A */
8138 {
8139 /* 00 */
8140 { Bad_Opcode },
8141 { Bad_Opcode },
8142 { Bad_Opcode },
8143 { Bad_Opcode },
8144 { Bad_Opcode },
8145 { Bad_Opcode },
8146 { Bad_Opcode },
8147 { Bad_Opcode },
8148 /* 08 */
8149 { Bad_Opcode },
8150 { Bad_Opcode },
8151 { Bad_Opcode },
8152 { Bad_Opcode },
8153 { Bad_Opcode },
8154 { Bad_Opcode },
8155 { Bad_Opcode },
8156 { Bad_Opcode },
8157 /* 10 */
8158 { "bextr", { Gv, Ev, Iq }, 0 },
8159 { Bad_Opcode },
8160 { REG_TABLE (REG_XOP_LWP) },
8161 { Bad_Opcode },
8162 { Bad_Opcode },
8163 { Bad_Opcode },
8164 { Bad_Opcode },
8165 { Bad_Opcode },
8166 /* 18 */
8167 { Bad_Opcode },
8168 { Bad_Opcode },
8169 { Bad_Opcode },
8170 { Bad_Opcode },
8171 { Bad_Opcode },
8172 { Bad_Opcode },
8173 { Bad_Opcode },
8174 { Bad_Opcode },
8175 /* 20 */
8176 { Bad_Opcode },
8177 { Bad_Opcode },
8178 { Bad_Opcode },
8179 { Bad_Opcode },
8180 { Bad_Opcode },
8181 { Bad_Opcode },
8182 { Bad_Opcode },
8183 { Bad_Opcode },
8184 /* 28 */
8185 { Bad_Opcode },
8186 { Bad_Opcode },
8187 { Bad_Opcode },
8188 { Bad_Opcode },
8189 { Bad_Opcode },
8190 { Bad_Opcode },
8191 { Bad_Opcode },
8192 { Bad_Opcode },
8193 /* 30 */
8194 { Bad_Opcode },
8195 { Bad_Opcode },
8196 { Bad_Opcode },
8197 { Bad_Opcode },
8198 { Bad_Opcode },
8199 { Bad_Opcode },
8200 { Bad_Opcode },
8201 { Bad_Opcode },
8202 /* 38 */
8203 { Bad_Opcode },
8204 { Bad_Opcode },
8205 { Bad_Opcode },
8206 { Bad_Opcode },
8207 { Bad_Opcode },
8208 { Bad_Opcode },
8209 { Bad_Opcode },
8210 { Bad_Opcode },
8211 /* 40 */
8212 { Bad_Opcode },
8213 { Bad_Opcode },
8214 { Bad_Opcode },
8215 { Bad_Opcode },
8216 { Bad_Opcode },
8217 { Bad_Opcode },
8218 { Bad_Opcode },
8219 { Bad_Opcode },
8220 /* 48 */
8221 { Bad_Opcode },
8222 { Bad_Opcode },
8223 { Bad_Opcode },
8224 { Bad_Opcode },
8225 { Bad_Opcode },
8226 { Bad_Opcode },
8227 { Bad_Opcode },
8228 { Bad_Opcode },
8229 /* 50 */
8230 { Bad_Opcode },
8231 { Bad_Opcode },
8232 { Bad_Opcode },
8233 { Bad_Opcode },
8234 { Bad_Opcode },
8235 { Bad_Opcode },
8236 { Bad_Opcode },
8237 { Bad_Opcode },
8238 /* 58 */
8239 { Bad_Opcode },
8240 { Bad_Opcode },
8241 { Bad_Opcode },
8242 { Bad_Opcode },
8243 { Bad_Opcode },
8244 { Bad_Opcode },
8245 { Bad_Opcode },
8246 { Bad_Opcode },
8247 /* 60 */
8248 { Bad_Opcode },
8249 { Bad_Opcode },
8250 { Bad_Opcode },
8251 { Bad_Opcode },
8252 { Bad_Opcode },
8253 { Bad_Opcode },
8254 { Bad_Opcode },
8255 { Bad_Opcode },
8256 /* 68 */
8257 { Bad_Opcode },
8258 { Bad_Opcode },
8259 { Bad_Opcode },
8260 { Bad_Opcode },
8261 { Bad_Opcode },
8262 { Bad_Opcode },
8263 { Bad_Opcode },
8264 { Bad_Opcode },
8265 /* 70 */
8266 { Bad_Opcode },
8267 { Bad_Opcode },
8268 { Bad_Opcode },
8269 { Bad_Opcode },
8270 { Bad_Opcode },
8271 { Bad_Opcode },
8272 { Bad_Opcode },
8273 { Bad_Opcode },
8274 /* 78 */
8275 { Bad_Opcode },
8276 { Bad_Opcode },
8277 { Bad_Opcode },
8278 { Bad_Opcode },
8279 { Bad_Opcode },
8280 { Bad_Opcode },
8281 { Bad_Opcode },
8282 { Bad_Opcode },
8283 /* 80 */
8284 { Bad_Opcode },
8285 { Bad_Opcode },
8286 { Bad_Opcode },
8287 { Bad_Opcode },
8288 { Bad_Opcode },
8289 { Bad_Opcode },
8290 { Bad_Opcode },
8291 { Bad_Opcode },
8292 /* 88 */
8293 { Bad_Opcode },
8294 { Bad_Opcode },
8295 { Bad_Opcode },
8296 { Bad_Opcode },
8297 { Bad_Opcode },
8298 { Bad_Opcode },
8299 { Bad_Opcode },
8300 { Bad_Opcode },
8301 /* 90 */
8302 { Bad_Opcode },
8303 { Bad_Opcode },
8304 { Bad_Opcode },
8305 { Bad_Opcode },
8306 { Bad_Opcode },
8307 { Bad_Opcode },
8308 { Bad_Opcode },
8309 { Bad_Opcode },
8310 /* 98 */
8311 { Bad_Opcode },
8312 { Bad_Opcode },
8313 { Bad_Opcode },
8314 { Bad_Opcode },
8315 { Bad_Opcode },
8316 { Bad_Opcode },
8317 { Bad_Opcode },
8318 { Bad_Opcode },
8319 /* a0 */
8320 { Bad_Opcode },
8321 { Bad_Opcode },
8322 { Bad_Opcode },
8323 { Bad_Opcode },
8324 { Bad_Opcode },
8325 { Bad_Opcode },
8326 { Bad_Opcode },
8327 { Bad_Opcode },
8328 /* a8 */
8329 { Bad_Opcode },
8330 { Bad_Opcode },
8331 { Bad_Opcode },
8332 { Bad_Opcode },
8333 { Bad_Opcode },
8334 { Bad_Opcode },
8335 { Bad_Opcode },
8336 { Bad_Opcode },
8337 /* b0 */
8338 { Bad_Opcode },
8339 { Bad_Opcode },
8340 { Bad_Opcode },
8341 { Bad_Opcode },
8342 { Bad_Opcode },
8343 { Bad_Opcode },
8344 { Bad_Opcode },
8345 { Bad_Opcode },
8346 /* b8 */
8347 { Bad_Opcode },
8348 { Bad_Opcode },
8349 { Bad_Opcode },
8350 { Bad_Opcode },
8351 { Bad_Opcode },
8352 { Bad_Opcode },
8353 { Bad_Opcode },
8354 { Bad_Opcode },
8355 /* c0 */
8356 { Bad_Opcode },
8357 { Bad_Opcode },
8358 { Bad_Opcode },
8359 { Bad_Opcode },
8360 { Bad_Opcode },
8361 { Bad_Opcode },
8362 { Bad_Opcode },
8363 { Bad_Opcode },
8364 /* c8 */
8365 { Bad_Opcode },
8366 { Bad_Opcode },
8367 { Bad_Opcode },
8368 { Bad_Opcode },
8369 { Bad_Opcode },
8370 { Bad_Opcode },
8371 { Bad_Opcode },
8372 { Bad_Opcode },
8373 /* d0 */
8374 { Bad_Opcode },
8375 { Bad_Opcode },
8376 { Bad_Opcode },
8377 { Bad_Opcode },
8378 { Bad_Opcode },
8379 { Bad_Opcode },
8380 { Bad_Opcode },
8381 { Bad_Opcode },
8382 /* d8 */
8383 { Bad_Opcode },
8384 { Bad_Opcode },
8385 { Bad_Opcode },
8386 { Bad_Opcode },
8387 { Bad_Opcode },
8388 { Bad_Opcode },
8389 { Bad_Opcode },
8390 { Bad_Opcode },
8391 /* e0 */
8392 { Bad_Opcode },
8393 { Bad_Opcode },
8394 { Bad_Opcode },
8395 { Bad_Opcode },
8396 { Bad_Opcode },
8397 { Bad_Opcode },
8398 { Bad_Opcode },
8399 { Bad_Opcode },
8400 /* e8 */
8401 { Bad_Opcode },
8402 { Bad_Opcode },
8403 { Bad_Opcode },
8404 { Bad_Opcode },
8405 { Bad_Opcode },
8406 { Bad_Opcode },
8407 { Bad_Opcode },
8408 { Bad_Opcode },
8409 /* f0 */
8410 { Bad_Opcode },
8411 { Bad_Opcode },
8412 { Bad_Opcode },
8413 { Bad_Opcode },
8414 { Bad_Opcode },
8415 { Bad_Opcode },
8416 { Bad_Opcode },
8417 { Bad_Opcode },
8418 /* f8 */
8419 { Bad_Opcode },
8420 { Bad_Opcode },
8421 { Bad_Opcode },
8422 { Bad_Opcode },
8423 { Bad_Opcode },
8424 { Bad_Opcode },
8425 { Bad_Opcode },
8426 { Bad_Opcode },
8427 },
8428 };
8429
8430 static const struct dis386 vex_table[][256] = {
8431 /* VEX_0F */
8432 {
8433 /* 00 */
8434 { Bad_Opcode },
8435 { Bad_Opcode },
8436 { Bad_Opcode },
8437 { Bad_Opcode },
8438 { Bad_Opcode },
8439 { Bad_Opcode },
8440 { Bad_Opcode },
8441 { Bad_Opcode },
8442 /* 08 */
8443 { Bad_Opcode },
8444 { Bad_Opcode },
8445 { Bad_Opcode },
8446 { Bad_Opcode },
8447 { Bad_Opcode },
8448 { Bad_Opcode },
8449 { Bad_Opcode },
8450 { Bad_Opcode },
8451 /* 10 */
8452 { PREFIX_TABLE (PREFIX_VEX_0F10) },
8453 { PREFIX_TABLE (PREFIX_VEX_0F11) },
8454 { PREFIX_TABLE (PREFIX_VEX_0F12) },
8455 { MOD_TABLE (MOD_VEX_0F13) },
8456 { "vunpcklpX", { XM, Vex, EXx }, 0 },
8457 { "vunpckhpX", { XM, Vex, EXx }, 0 },
8458 { PREFIX_TABLE (PREFIX_VEX_0F16) },
8459 { MOD_TABLE (MOD_VEX_0F17) },
8460 /* 18 */
8461 { Bad_Opcode },
8462 { Bad_Opcode },
8463 { Bad_Opcode },
8464 { Bad_Opcode },
8465 { Bad_Opcode },
8466 { Bad_Opcode },
8467 { Bad_Opcode },
8468 { Bad_Opcode },
8469 /* 20 */
8470 { Bad_Opcode },
8471 { Bad_Opcode },
8472 { Bad_Opcode },
8473 { Bad_Opcode },
8474 { Bad_Opcode },
8475 { Bad_Opcode },
8476 { Bad_Opcode },
8477 { Bad_Opcode },
8478 /* 28 */
8479 { "vmovapX", { XM, EXx }, 0 },
8480 { "vmovapX", { EXxS, XM }, 0 },
8481 { PREFIX_TABLE (PREFIX_VEX_0F2A) },
8482 { MOD_TABLE (MOD_VEX_0F2B) },
8483 { PREFIX_TABLE (PREFIX_VEX_0F2C) },
8484 { PREFIX_TABLE (PREFIX_VEX_0F2D) },
8485 { PREFIX_TABLE (PREFIX_VEX_0F2E) },
8486 { PREFIX_TABLE (PREFIX_VEX_0F2F) },
8487 /* 30 */
8488 { Bad_Opcode },
8489 { Bad_Opcode },
8490 { Bad_Opcode },
8491 { Bad_Opcode },
8492 { Bad_Opcode },
8493 { Bad_Opcode },
8494 { Bad_Opcode },
8495 { Bad_Opcode },
8496 /* 38 */
8497 { Bad_Opcode },
8498 { Bad_Opcode },
8499 { Bad_Opcode },
8500 { Bad_Opcode },
8501 { Bad_Opcode },
8502 { Bad_Opcode },
8503 { Bad_Opcode },
8504 { Bad_Opcode },
8505 /* 40 */
8506 { Bad_Opcode },
8507 { PREFIX_TABLE (PREFIX_VEX_0F41) },
8508 { PREFIX_TABLE (PREFIX_VEX_0F42) },
8509 { Bad_Opcode },
8510 { PREFIX_TABLE (PREFIX_VEX_0F44) },
8511 { PREFIX_TABLE (PREFIX_VEX_0F45) },
8512 { PREFIX_TABLE (PREFIX_VEX_0F46) },
8513 { PREFIX_TABLE (PREFIX_VEX_0F47) },
8514 /* 48 */
8515 { Bad_Opcode },
8516 { Bad_Opcode },
8517 { PREFIX_TABLE (PREFIX_VEX_0F4A) },
8518 { PREFIX_TABLE (PREFIX_VEX_0F4B) },
8519 { Bad_Opcode },
8520 { Bad_Opcode },
8521 { Bad_Opcode },
8522 { Bad_Opcode },
8523 /* 50 */
8524 { MOD_TABLE (MOD_VEX_0F50) },
8525 { PREFIX_TABLE (PREFIX_VEX_0F51) },
8526 { PREFIX_TABLE (PREFIX_VEX_0F52) },
8527 { PREFIX_TABLE (PREFIX_VEX_0F53) },
8528 { "vandpX", { XM, Vex, EXx }, 0 },
8529 { "vandnpX", { XM, Vex, EXx }, 0 },
8530 { "vorpX", { XM, Vex, EXx }, 0 },
8531 { "vxorpX", { XM, Vex, EXx }, 0 },
8532 /* 58 */
8533 { PREFIX_TABLE (PREFIX_VEX_0F58) },
8534 { PREFIX_TABLE (PREFIX_VEX_0F59) },
8535 { PREFIX_TABLE (PREFIX_VEX_0F5A) },
8536 { PREFIX_TABLE (PREFIX_VEX_0F5B) },
8537 { PREFIX_TABLE (PREFIX_VEX_0F5C) },
8538 { PREFIX_TABLE (PREFIX_VEX_0F5D) },
8539 { PREFIX_TABLE (PREFIX_VEX_0F5E) },
8540 { PREFIX_TABLE (PREFIX_VEX_0F5F) },
8541 /* 60 */
8542 { PREFIX_TABLE (PREFIX_VEX_0F60) },
8543 { PREFIX_TABLE (PREFIX_VEX_0F61) },
8544 { PREFIX_TABLE (PREFIX_VEX_0F62) },
8545 { PREFIX_TABLE (PREFIX_VEX_0F63) },
8546 { PREFIX_TABLE (PREFIX_VEX_0F64) },
8547 { PREFIX_TABLE (PREFIX_VEX_0F65) },
8548 { PREFIX_TABLE (PREFIX_VEX_0F66) },
8549 { PREFIX_TABLE (PREFIX_VEX_0F67) },
8550 /* 68 */
8551 { PREFIX_TABLE (PREFIX_VEX_0F68) },
8552 { PREFIX_TABLE (PREFIX_VEX_0F69) },
8553 { PREFIX_TABLE (PREFIX_VEX_0F6A) },
8554 { PREFIX_TABLE (PREFIX_VEX_0F6B) },
8555 { PREFIX_TABLE (PREFIX_VEX_0F6C) },
8556 { PREFIX_TABLE (PREFIX_VEX_0F6D) },
8557 { PREFIX_TABLE (PREFIX_VEX_0F6E) },
8558 { PREFIX_TABLE (PREFIX_VEX_0F6F) },
8559 /* 70 */
8560 { PREFIX_TABLE (PREFIX_VEX_0F70) },
8561 { REG_TABLE (REG_VEX_0F71) },
8562 { REG_TABLE (REG_VEX_0F72) },
8563 { REG_TABLE (REG_VEX_0F73) },
8564 { PREFIX_TABLE (PREFIX_VEX_0F74) },
8565 { PREFIX_TABLE (PREFIX_VEX_0F75) },
8566 { PREFIX_TABLE (PREFIX_VEX_0F76) },
8567 { PREFIX_TABLE (PREFIX_VEX_0F77) },
8568 /* 78 */
8569 { Bad_Opcode },
8570 { Bad_Opcode },
8571 { Bad_Opcode },
8572 { Bad_Opcode },
8573 { PREFIX_TABLE (PREFIX_VEX_0F7C) },
8574 { PREFIX_TABLE (PREFIX_VEX_0F7D) },
8575 { PREFIX_TABLE (PREFIX_VEX_0F7E) },
8576 { PREFIX_TABLE (PREFIX_VEX_0F7F) },
8577 /* 80 */
8578 { Bad_Opcode },
8579 { Bad_Opcode },
8580 { Bad_Opcode },
8581 { Bad_Opcode },
8582 { Bad_Opcode },
8583 { Bad_Opcode },
8584 { Bad_Opcode },
8585 { Bad_Opcode },
8586 /* 88 */
8587 { Bad_Opcode },
8588 { Bad_Opcode },
8589 { Bad_Opcode },
8590 { Bad_Opcode },
8591 { Bad_Opcode },
8592 { Bad_Opcode },
8593 { Bad_Opcode },
8594 { Bad_Opcode },
8595 /* 90 */
8596 { PREFIX_TABLE (PREFIX_VEX_0F90) },
8597 { PREFIX_TABLE (PREFIX_VEX_0F91) },
8598 { PREFIX_TABLE (PREFIX_VEX_0F92) },
8599 { PREFIX_TABLE (PREFIX_VEX_0F93) },
8600 { Bad_Opcode },
8601 { Bad_Opcode },
8602 { Bad_Opcode },
8603 { Bad_Opcode },
8604 /* 98 */
8605 { PREFIX_TABLE (PREFIX_VEX_0F98) },
8606 { PREFIX_TABLE (PREFIX_VEX_0F99) },
8607 { Bad_Opcode },
8608 { Bad_Opcode },
8609 { Bad_Opcode },
8610 { Bad_Opcode },
8611 { Bad_Opcode },
8612 { Bad_Opcode },
8613 /* a0 */
8614 { Bad_Opcode },
8615 { Bad_Opcode },
8616 { Bad_Opcode },
8617 { Bad_Opcode },
8618 { Bad_Opcode },
8619 { Bad_Opcode },
8620 { Bad_Opcode },
8621 { Bad_Opcode },
8622 /* a8 */
8623 { Bad_Opcode },
8624 { Bad_Opcode },
8625 { Bad_Opcode },
8626 { Bad_Opcode },
8627 { Bad_Opcode },
8628 { Bad_Opcode },
8629 { REG_TABLE (REG_VEX_0FAE) },
8630 { Bad_Opcode },
8631 /* b0 */
8632 { Bad_Opcode },
8633 { Bad_Opcode },
8634 { Bad_Opcode },
8635 { Bad_Opcode },
8636 { Bad_Opcode },
8637 { Bad_Opcode },
8638 { Bad_Opcode },
8639 { Bad_Opcode },
8640 /* b8 */
8641 { Bad_Opcode },
8642 { Bad_Opcode },
8643 { Bad_Opcode },
8644 { Bad_Opcode },
8645 { Bad_Opcode },
8646 { Bad_Opcode },
8647 { Bad_Opcode },
8648 { Bad_Opcode },
8649 /* c0 */
8650 { Bad_Opcode },
8651 { Bad_Opcode },
8652 { PREFIX_TABLE (PREFIX_VEX_0FC2) },
8653 { Bad_Opcode },
8654 { PREFIX_TABLE (PREFIX_VEX_0FC4) },
8655 { PREFIX_TABLE (PREFIX_VEX_0FC5) },
8656 { "vshufpX", { XM, Vex, EXx, Ib }, 0 },
8657 { Bad_Opcode },
8658 /* c8 */
8659 { Bad_Opcode },
8660 { Bad_Opcode },
8661 { Bad_Opcode },
8662 { Bad_Opcode },
8663 { Bad_Opcode },
8664 { Bad_Opcode },
8665 { Bad_Opcode },
8666 { Bad_Opcode },
8667 /* d0 */
8668 { PREFIX_TABLE (PREFIX_VEX_0FD0) },
8669 { PREFIX_TABLE (PREFIX_VEX_0FD1) },
8670 { PREFIX_TABLE (PREFIX_VEX_0FD2) },
8671 { PREFIX_TABLE (PREFIX_VEX_0FD3) },
8672 { PREFIX_TABLE (PREFIX_VEX_0FD4) },
8673 { PREFIX_TABLE (PREFIX_VEX_0FD5) },
8674 { PREFIX_TABLE (PREFIX_VEX_0FD6) },
8675 { PREFIX_TABLE (PREFIX_VEX_0FD7) },
8676 /* d8 */
8677 { PREFIX_TABLE (PREFIX_VEX_0FD8) },
8678 { PREFIX_TABLE (PREFIX_VEX_0FD9) },
8679 { PREFIX_TABLE (PREFIX_VEX_0FDA) },
8680 { PREFIX_TABLE (PREFIX_VEX_0FDB) },
8681 { PREFIX_TABLE (PREFIX_VEX_0FDC) },
8682 { PREFIX_TABLE (PREFIX_VEX_0FDD) },
8683 { PREFIX_TABLE (PREFIX_VEX_0FDE) },
8684 { PREFIX_TABLE (PREFIX_VEX_0FDF) },
8685 /* e0 */
8686 { PREFIX_TABLE (PREFIX_VEX_0FE0) },
8687 { PREFIX_TABLE (PREFIX_VEX_0FE1) },
8688 { PREFIX_TABLE (PREFIX_VEX_0FE2) },
8689 { PREFIX_TABLE (PREFIX_VEX_0FE3) },
8690 { PREFIX_TABLE (PREFIX_VEX_0FE4) },
8691 { PREFIX_TABLE (PREFIX_VEX_0FE5) },
8692 { PREFIX_TABLE (PREFIX_VEX_0FE6) },
8693 { PREFIX_TABLE (PREFIX_VEX_0FE7) },
8694 /* e8 */
8695 { PREFIX_TABLE (PREFIX_VEX_0FE8) },
8696 { PREFIX_TABLE (PREFIX_VEX_0FE9) },
8697 { PREFIX_TABLE (PREFIX_VEX_0FEA) },
8698 { PREFIX_TABLE (PREFIX_VEX_0FEB) },
8699 { PREFIX_TABLE (PREFIX_VEX_0FEC) },
8700 { PREFIX_TABLE (PREFIX_VEX_0FED) },
8701 { PREFIX_TABLE (PREFIX_VEX_0FEE) },
8702 { PREFIX_TABLE (PREFIX_VEX_0FEF) },
8703 /* f0 */
8704 { PREFIX_TABLE (PREFIX_VEX_0FF0) },
8705 { PREFIX_TABLE (PREFIX_VEX_0FF1) },
8706 { PREFIX_TABLE (PREFIX_VEX_0FF2) },
8707 { PREFIX_TABLE (PREFIX_VEX_0FF3) },
8708 { PREFIX_TABLE (PREFIX_VEX_0FF4) },
8709 { PREFIX_TABLE (PREFIX_VEX_0FF5) },
8710 { PREFIX_TABLE (PREFIX_VEX_0FF6) },
8711 { PREFIX_TABLE (PREFIX_VEX_0FF7) },
8712 /* f8 */
8713 { PREFIX_TABLE (PREFIX_VEX_0FF8) },
8714 { PREFIX_TABLE (PREFIX_VEX_0FF9) },
8715 { PREFIX_TABLE (PREFIX_VEX_0FFA) },
8716 { PREFIX_TABLE (PREFIX_VEX_0FFB) },
8717 { PREFIX_TABLE (PREFIX_VEX_0FFC) },
8718 { PREFIX_TABLE (PREFIX_VEX_0FFD) },
8719 { PREFIX_TABLE (PREFIX_VEX_0FFE) },
8720 { Bad_Opcode },
8721 },
8722 /* VEX_0F38 */
8723 {
8724 /* 00 */
8725 { PREFIX_TABLE (PREFIX_VEX_0F3800) },
8726 { PREFIX_TABLE (PREFIX_VEX_0F3801) },
8727 { PREFIX_TABLE (PREFIX_VEX_0F3802) },
8728 { PREFIX_TABLE (PREFIX_VEX_0F3803) },
8729 { PREFIX_TABLE (PREFIX_VEX_0F3804) },
8730 { PREFIX_TABLE (PREFIX_VEX_0F3805) },
8731 { PREFIX_TABLE (PREFIX_VEX_0F3806) },
8732 { PREFIX_TABLE (PREFIX_VEX_0F3807) },
8733 /* 08 */
8734 { PREFIX_TABLE (PREFIX_VEX_0F3808) },
8735 { PREFIX_TABLE (PREFIX_VEX_0F3809) },
8736 { PREFIX_TABLE (PREFIX_VEX_0F380A) },
8737 { PREFIX_TABLE (PREFIX_VEX_0F380B) },
8738 { PREFIX_TABLE (PREFIX_VEX_0F380C) },
8739 { PREFIX_TABLE (PREFIX_VEX_0F380D) },
8740 { PREFIX_TABLE (PREFIX_VEX_0F380E) },
8741 { PREFIX_TABLE (PREFIX_VEX_0F380F) },
8742 /* 10 */
8743 { Bad_Opcode },
8744 { Bad_Opcode },
8745 { Bad_Opcode },
8746 { PREFIX_TABLE (PREFIX_VEX_0F3813) },
8747 { Bad_Opcode },
8748 { Bad_Opcode },
8749 { PREFIX_TABLE (PREFIX_VEX_0F3816) },
8750 { PREFIX_TABLE (PREFIX_VEX_0F3817) },
8751 /* 18 */
8752 { PREFIX_TABLE (PREFIX_VEX_0F3818) },
8753 { PREFIX_TABLE (PREFIX_VEX_0F3819) },
8754 { PREFIX_TABLE (PREFIX_VEX_0F381A) },
8755 { Bad_Opcode },
8756 { PREFIX_TABLE (PREFIX_VEX_0F381C) },
8757 { PREFIX_TABLE (PREFIX_VEX_0F381D) },
8758 { PREFIX_TABLE (PREFIX_VEX_0F381E) },
8759 { Bad_Opcode },
8760 /* 20 */
8761 { PREFIX_TABLE (PREFIX_VEX_0F3820) },
8762 { PREFIX_TABLE (PREFIX_VEX_0F3821) },
8763 { PREFIX_TABLE (PREFIX_VEX_0F3822) },
8764 { PREFIX_TABLE (PREFIX_VEX_0F3823) },
8765 { PREFIX_TABLE (PREFIX_VEX_0F3824) },
8766 { PREFIX_TABLE (PREFIX_VEX_0F3825) },
8767 { Bad_Opcode },
8768 { Bad_Opcode },
8769 /* 28 */
8770 { PREFIX_TABLE (PREFIX_VEX_0F3828) },
8771 { PREFIX_TABLE (PREFIX_VEX_0F3829) },
8772 { PREFIX_TABLE (PREFIX_VEX_0F382A) },
8773 { PREFIX_TABLE (PREFIX_VEX_0F382B) },
8774 { PREFIX_TABLE (PREFIX_VEX_0F382C) },
8775 { PREFIX_TABLE (PREFIX_VEX_0F382D) },
8776 { PREFIX_TABLE (PREFIX_VEX_0F382E) },
8777 { PREFIX_TABLE (PREFIX_VEX_0F382F) },
8778 /* 30 */
8779 { PREFIX_TABLE (PREFIX_VEX_0F3830) },
8780 { PREFIX_TABLE (PREFIX_VEX_0F3831) },
8781 { PREFIX_TABLE (PREFIX_VEX_0F3832) },
8782 { PREFIX_TABLE (PREFIX_VEX_0F3833) },
8783 { PREFIX_TABLE (PREFIX_VEX_0F3834) },
8784 { PREFIX_TABLE (PREFIX_VEX_0F3835) },
8785 { PREFIX_TABLE (PREFIX_VEX_0F3836) },
8786 { PREFIX_TABLE (PREFIX_VEX_0F3837) },
8787 /* 38 */
8788 { PREFIX_TABLE (PREFIX_VEX_0F3838) },
8789 { PREFIX_TABLE (PREFIX_VEX_0F3839) },
8790 { PREFIX_TABLE (PREFIX_VEX_0F383A) },
8791 { PREFIX_TABLE (PREFIX_VEX_0F383B) },
8792 { PREFIX_TABLE (PREFIX_VEX_0F383C) },
8793 { PREFIX_TABLE (PREFIX_VEX_0F383D) },
8794 { PREFIX_TABLE (PREFIX_VEX_0F383E) },
8795 { PREFIX_TABLE (PREFIX_VEX_0F383F) },
8796 /* 40 */
8797 { PREFIX_TABLE (PREFIX_VEX_0F3840) },
8798 { PREFIX_TABLE (PREFIX_VEX_0F3841) },
8799 { Bad_Opcode },
8800 { Bad_Opcode },
8801 { Bad_Opcode },
8802 { PREFIX_TABLE (PREFIX_VEX_0F3845) },
8803 { PREFIX_TABLE (PREFIX_VEX_0F3846) },
8804 { PREFIX_TABLE (PREFIX_VEX_0F3847) },
8805 /* 48 */
8806 { Bad_Opcode },
8807 { Bad_Opcode },
8808 { Bad_Opcode },
8809 { Bad_Opcode },
8810 { Bad_Opcode },
8811 { Bad_Opcode },
8812 { Bad_Opcode },
8813 { Bad_Opcode },
8814 /* 50 */
8815 { Bad_Opcode },
8816 { Bad_Opcode },
8817 { Bad_Opcode },
8818 { Bad_Opcode },
8819 { Bad_Opcode },
8820 { Bad_Opcode },
8821 { Bad_Opcode },
8822 { Bad_Opcode },
8823 /* 58 */
8824 { PREFIX_TABLE (PREFIX_VEX_0F3858) },
8825 { PREFIX_TABLE (PREFIX_VEX_0F3859) },
8826 { PREFIX_TABLE (PREFIX_VEX_0F385A) },
8827 { Bad_Opcode },
8828 { Bad_Opcode },
8829 { Bad_Opcode },
8830 { Bad_Opcode },
8831 { Bad_Opcode },
8832 /* 60 */
8833 { Bad_Opcode },
8834 { Bad_Opcode },
8835 { Bad_Opcode },
8836 { Bad_Opcode },
8837 { Bad_Opcode },
8838 { Bad_Opcode },
8839 { Bad_Opcode },
8840 { Bad_Opcode },
8841 /* 68 */
8842 { Bad_Opcode },
8843 { Bad_Opcode },
8844 { Bad_Opcode },
8845 { Bad_Opcode },
8846 { Bad_Opcode },
8847 { Bad_Opcode },
8848 { Bad_Opcode },
8849 { Bad_Opcode },
8850 /* 70 */
8851 { Bad_Opcode },
8852 { Bad_Opcode },
8853 { Bad_Opcode },
8854 { Bad_Opcode },
8855 { Bad_Opcode },
8856 { Bad_Opcode },
8857 { Bad_Opcode },
8858 { Bad_Opcode },
8859 /* 78 */
8860 { PREFIX_TABLE (PREFIX_VEX_0F3878) },
8861 { PREFIX_TABLE (PREFIX_VEX_0F3879) },
8862 { Bad_Opcode },
8863 { Bad_Opcode },
8864 { Bad_Opcode },
8865 { Bad_Opcode },
8866 { Bad_Opcode },
8867 { Bad_Opcode },
8868 /* 80 */
8869 { Bad_Opcode },
8870 { Bad_Opcode },
8871 { Bad_Opcode },
8872 { Bad_Opcode },
8873 { Bad_Opcode },
8874 { Bad_Opcode },
8875 { Bad_Opcode },
8876 { Bad_Opcode },
8877 /* 88 */
8878 { Bad_Opcode },
8879 { Bad_Opcode },
8880 { Bad_Opcode },
8881 { Bad_Opcode },
8882 { PREFIX_TABLE (PREFIX_VEX_0F388C) },
8883 { Bad_Opcode },
8884 { PREFIX_TABLE (PREFIX_VEX_0F388E) },
8885 { Bad_Opcode },
8886 /* 90 */
8887 { PREFIX_TABLE (PREFIX_VEX_0F3890) },
8888 { PREFIX_TABLE (PREFIX_VEX_0F3891) },
8889 { PREFIX_TABLE (PREFIX_VEX_0F3892) },
8890 { PREFIX_TABLE (PREFIX_VEX_0F3893) },
8891 { Bad_Opcode },
8892 { Bad_Opcode },
8893 { PREFIX_TABLE (PREFIX_VEX_0F3896) },
8894 { PREFIX_TABLE (PREFIX_VEX_0F3897) },
8895 /* 98 */
8896 { PREFIX_TABLE (PREFIX_VEX_0F3898) },
8897 { PREFIX_TABLE (PREFIX_VEX_0F3899) },
8898 { PREFIX_TABLE (PREFIX_VEX_0F389A) },
8899 { PREFIX_TABLE (PREFIX_VEX_0F389B) },
8900 { PREFIX_TABLE (PREFIX_VEX_0F389C) },
8901 { PREFIX_TABLE (PREFIX_VEX_0F389D) },
8902 { PREFIX_TABLE (PREFIX_VEX_0F389E) },
8903 { PREFIX_TABLE (PREFIX_VEX_0F389F) },
8904 /* a0 */
8905 { Bad_Opcode },
8906 { Bad_Opcode },
8907 { Bad_Opcode },
8908 { Bad_Opcode },
8909 { Bad_Opcode },
8910 { Bad_Opcode },
8911 { PREFIX_TABLE (PREFIX_VEX_0F38A6) },
8912 { PREFIX_TABLE (PREFIX_VEX_0F38A7) },
8913 /* a8 */
8914 { PREFIX_TABLE (PREFIX_VEX_0F38A8) },
8915 { PREFIX_TABLE (PREFIX_VEX_0F38A9) },
8916 { PREFIX_TABLE (PREFIX_VEX_0F38AA) },
8917 { PREFIX_TABLE (PREFIX_VEX_0F38AB) },
8918 { PREFIX_TABLE (PREFIX_VEX_0F38AC) },
8919 { PREFIX_TABLE (PREFIX_VEX_0F38AD) },
8920 { PREFIX_TABLE (PREFIX_VEX_0F38AE) },
8921 { PREFIX_TABLE (PREFIX_VEX_0F38AF) },
8922 /* b0 */
8923 { Bad_Opcode },
8924 { Bad_Opcode },
8925 { Bad_Opcode },
8926 { Bad_Opcode },
8927 { Bad_Opcode },
8928 { Bad_Opcode },
8929 { PREFIX_TABLE (PREFIX_VEX_0F38B6) },
8930 { PREFIX_TABLE (PREFIX_VEX_0F38B7) },
8931 /* b8 */
8932 { PREFIX_TABLE (PREFIX_VEX_0F38B8) },
8933 { PREFIX_TABLE (PREFIX_VEX_0F38B9) },
8934 { PREFIX_TABLE (PREFIX_VEX_0F38BA) },
8935 { PREFIX_TABLE (PREFIX_VEX_0F38BB) },
8936 { PREFIX_TABLE (PREFIX_VEX_0F38BC) },
8937 { PREFIX_TABLE (PREFIX_VEX_0F38BD) },
8938 { PREFIX_TABLE (PREFIX_VEX_0F38BE) },
8939 { PREFIX_TABLE (PREFIX_VEX_0F38BF) },
8940 /* c0 */
8941 { Bad_Opcode },
8942 { Bad_Opcode },
8943 { Bad_Opcode },
8944 { Bad_Opcode },
8945 { Bad_Opcode },
8946 { Bad_Opcode },
8947 { Bad_Opcode },
8948 { Bad_Opcode },
8949 /* c8 */
8950 { Bad_Opcode },
8951 { Bad_Opcode },
8952 { Bad_Opcode },
8953 { Bad_Opcode },
8954 { Bad_Opcode },
8955 { Bad_Opcode },
8956 { Bad_Opcode },
8957 { PREFIX_TABLE (PREFIX_VEX_0F38CF) },
8958 /* d0 */
8959 { Bad_Opcode },
8960 { Bad_Opcode },
8961 { Bad_Opcode },
8962 { Bad_Opcode },
8963 { Bad_Opcode },
8964 { Bad_Opcode },
8965 { Bad_Opcode },
8966 { Bad_Opcode },
8967 /* d8 */
8968 { Bad_Opcode },
8969 { Bad_Opcode },
8970 { Bad_Opcode },
8971 { PREFIX_TABLE (PREFIX_VEX_0F38DB) },
8972 { PREFIX_TABLE (PREFIX_VEX_0F38DC) },
8973 { PREFIX_TABLE (PREFIX_VEX_0F38DD) },
8974 { PREFIX_TABLE (PREFIX_VEX_0F38DE) },
8975 { PREFIX_TABLE (PREFIX_VEX_0F38DF) },
8976 /* e0 */
8977 { Bad_Opcode },
8978 { Bad_Opcode },
8979 { Bad_Opcode },
8980 { Bad_Opcode },
8981 { Bad_Opcode },
8982 { Bad_Opcode },
8983 { Bad_Opcode },
8984 { Bad_Opcode },
8985 /* e8 */
8986 { Bad_Opcode },
8987 { Bad_Opcode },
8988 { Bad_Opcode },
8989 { Bad_Opcode },
8990 { Bad_Opcode },
8991 { Bad_Opcode },
8992 { Bad_Opcode },
8993 { Bad_Opcode },
8994 /* f0 */
8995 { Bad_Opcode },
8996 { Bad_Opcode },
8997 { PREFIX_TABLE (PREFIX_VEX_0F38F2) },
8998 { REG_TABLE (REG_VEX_0F38F3) },
8999 { Bad_Opcode },
9000 { PREFIX_TABLE (PREFIX_VEX_0F38F5) },
9001 { PREFIX_TABLE (PREFIX_VEX_0F38F6) },
9002 { PREFIX_TABLE (PREFIX_VEX_0F38F7) },
9003 /* f8 */
9004 { Bad_Opcode },
9005 { Bad_Opcode },
9006 { Bad_Opcode },
9007 { Bad_Opcode },
9008 { Bad_Opcode },
9009 { Bad_Opcode },
9010 { Bad_Opcode },
9011 { Bad_Opcode },
9012 },
9013 /* VEX_0F3A */
9014 {
9015 /* 00 */
9016 { PREFIX_TABLE (PREFIX_VEX_0F3A00) },
9017 { PREFIX_TABLE (PREFIX_VEX_0F3A01) },
9018 { PREFIX_TABLE (PREFIX_VEX_0F3A02) },
9019 { Bad_Opcode },
9020 { PREFIX_TABLE (PREFIX_VEX_0F3A04) },
9021 { PREFIX_TABLE (PREFIX_VEX_0F3A05) },
9022 { PREFIX_TABLE (PREFIX_VEX_0F3A06) },
9023 { Bad_Opcode },
9024 /* 08 */
9025 { PREFIX_TABLE (PREFIX_VEX_0F3A08) },
9026 { PREFIX_TABLE (PREFIX_VEX_0F3A09) },
9027 { PREFIX_TABLE (PREFIX_VEX_0F3A0A) },
9028 { PREFIX_TABLE (PREFIX_VEX_0F3A0B) },
9029 { PREFIX_TABLE (PREFIX_VEX_0F3A0C) },
9030 { PREFIX_TABLE (PREFIX_VEX_0F3A0D) },
9031 { PREFIX_TABLE (PREFIX_VEX_0F3A0E) },
9032 { PREFIX_TABLE (PREFIX_VEX_0F3A0F) },
9033 /* 10 */
9034 { Bad_Opcode },
9035 { Bad_Opcode },
9036 { Bad_Opcode },
9037 { Bad_Opcode },
9038 { PREFIX_TABLE (PREFIX_VEX_0F3A14) },
9039 { PREFIX_TABLE (PREFIX_VEX_0F3A15) },
9040 { PREFIX_TABLE (PREFIX_VEX_0F3A16) },
9041 { PREFIX_TABLE (PREFIX_VEX_0F3A17) },
9042 /* 18 */
9043 { PREFIX_TABLE (PREFIX_VEX_0F3A18) },
9044 { PREFIX_TABLE (PREFIX_VEX_0F3A19) },
9045 { Bad_Opcode },
9046 { Bad_Opcode },
9047 { Bad_Opcode },
9048 { PREFIX_TABLE (PREFIX_VEX_0F3A1D) },
9049 { Bad_Opcode },
9050 { Bad_Opcode },
9051 /* 20 */
9052 { PREFIX_TABLE (PREFIX_VEX_0F3A20) },
9053 { PREFIX_TABLE (PREFIX_VEX_0F3A21) },
9054 { PREFIX_TABLE (PREFIX_VEX_0F3A22) },
9055 { Bad_Opcode },
9056 { Bad_Opcode },
9057 { Bad_Opcode },
9058 { Bad_Opcode },
9059 { Bad_Opcode },
9060 /* 28 */
9061 { Bad_Opcode },
9062 { Bad_Opcode },
9063 { Bad_Opcode },
9064 { Bad_Opcode },
9065 { Bad_Opcode },
9066 { Bad_Opcode },
9067 { Bad_Opcode },
9068 { Bad_Opcode },
9069 /* 30 */
9070 { PREFIX_TABLE (PREFIX_VEX_0F3A30) },
9071 { PREFIX_TABLE (PREFIX_VEX_0F3A31) },
9072 { PREFIX_TABLE (PREFIX_VEX_0F3A32) },
9073 { PREFIX_TABLE (PREFIX_VEX_0F3A33) },
9074 { Bad_Opcode },
9075 { Bad_Opcode },
9076 { Bad_Opcode },
9077 { Bad_Opcode },
9078 /* 38 */
9079 { PREFIX_TABLE (PREFIX_VEX_0F3A38) },
9080 { PREFIX_TABLE (PREFIX_VEX_0F3A39) },
9081 { Bad_Opcode },
9082 { Bad_Opcode },
9083 { Bad_Opcode },
9084 { Bad_Opcode },
9085 { Bad_Opcode },
9086 { Bad_Opcode },
9087 /* 40 */
9088 { PREFIX_TABLE (PREFIX_VEX_0F3A40) },
9089 { PREFIX_TABLE (PREFIX_VEX_0F3A41) },
9090 { PREFIX_TABLE (PREFIX_VEX_0F3A42) },
9091 { Bad_Opcode },
9092 { PREFIX_TABLE (PREFIX_VEX_0F3A44) },
9093 { Bad_Opcode },
9094 { PREFIX_TABLE (PREFIX_VEX_0F3A46) },
9095 { Bad_Opcode },
9096 /* 48 */
9097 { PREFIX_TABLE (PREFIX_VEX_0F3A48) },
9098 { PREFIX_TABLE (PREFIX_VEX_0F3A49) },
9099 { PREFIX_TABLE (PREFIX_VEX_0F3A4A) },
9100 { PREFIX_TABLE (PREFIX_VEX_0F3A4B) },
9101 { PREFIX_TABLE (PREFIX_VEX_0F3A4C) },
9102 { Bad_Opcode },
9103 { Bad_Opcode },
9104 { Bad_Opcode },
9105 /* 50 */
9106 { Bad_Opcode },
9107 { Bad_Opcode },
9108 { Bad_Opcode },
9109 { Bad_Opcode },
9110 { Bad_Opcode },
9111 { Bad_Opcode },
9112 { Bad_Opcode },
9113 { Bad_Opcode },
9114 /* 58 */
9115 { Bad_Opcode },
9116 { Bad_Opcode },
9117 { Bad_Opcode },
9118 { Bad_Opcode },
9119 { PREFIX_TABLE (PREFIX_VEX_0F3A5C) },
9120 { PREFIX_TABLE (PREFIX_VEX_0F3A5D) },
9121 { PREFIX_TABLE (PREFIX_VEX_0F3A5E) },
9122 { PREFIX_TABLE (PREFIX_VEX_0F3A5F) },
9123 /* 60 */
9124 { PREFIX_TABLE (PREFIX_VEX_0F3A60) },
9125 { PREFIX_TABLE (PREFIX_VEX_0F3A61) },
9126 { PREFIX_TABLE (PREFIX_VEX_0F3A62) },
9127 { PREFIX_TABLE (PREFIX_VEX_0F3A63) },
9128 { Bad_Opcode },
9129 { Bad_Opcode },
9130 { Bad_Opcode },
9131 { Bad_Opcode },
9132 /* 68 */
9133 { PREFIX_TABLE (PREFIX_VEX_0F3A68) },
9134 { PREFIX_TABLE (PREFIX_VEX_0F3A69) },
9135 { PREFIX_TABLE (PREFIX_VEX_0F3A6A) },
9136 { PREFIX_TABLE (PREFIX_VEX_0F3A6B) },
9137 { PREFIX_TABLE (PREFIX_VEX_0F3A6C) },
9138 { PREFIX_TABLE (PREFIX_VEX_0F3A6D) },
9139 { PREFIX_TABLE (PREFIX_VEX_0F3A6E) },
9140 { PREFIX_TABLE (PREFIX_VEX_0F3A6F) },
9141 /* 70 */
9142 { Bad_Opcode },
9143 { Bad_Opcode },
9144 { Bad_Opcode },
9145 { Bad_Opcode },
9146 { Bad_Opcode },
9147 { Bad_Opcode },
9148 { Bad_Opcode },
9149 { Bad_Opcode },
9150 /* 78 */
9151 { PREFIX_TABLE (PREFIX_VEX_0F3A78) },
9152 { PREFIX_TABLE (PREFIX_VEX_0F3A79) },
9153 { PREFIX_TABLE (PREFIX_VEX_0F3A7A) },
9154 { PREFIX_TABLE (PREFIX_VEX_0F3A7B) },
9155 { PREFIX_TABLE (PREFIX_VEX_0F3A7C) },
9156 { PREFIX_TABLE (PREFIX_VEX_0F3A7D) },
9157 { PREFIX_TABLE (PREFIX_VEX_0F3A7E) },
9158 { PREFIX_TABLE (PREFIX_VEX_0F3A7F) },
9159 /* 80 */
9160 { Bad_Opcode },
9161 { Bad_Opcode },
9162 { Bad_Opcode },
9163 { Bad_Opcode },
9164 { Bad_Opcode },
9165 { Bad_Opcode },
9166 { Bad_Opcode },
9167 { Bad_Opcode },
9168 /* 88 */
9169 { Bad_Opcode },
9170 { Bad_Opcode },
9171 { Bad_Opcode },
9172 { Bad_Opcode },
9173 { Bad_Opcode },
9174 { Bad_Opcode },
9175 { Bad_Opcode },
9176 { Bad_Opcode },
9177 /* 90 */
9178 { Bad_Opcode },
9179 { Bad_Opcode },
9180 { Bad_Opcode },
9181 { Bad_Opcode },
9182 { Bad_Opcode },
9183 { Bad_Opcode },
9184 { Bad_Opcode },
9185 { Bad_Opcode },
9186 /* 98 */
9187 { Bad_Opcode },
9188 { Bad_Opcode },
9189 { Bad_Opcode },
9190 { Bad_Opcode },
9191 { Bad_Opcode },
9192 { Bad_Opcode },
9193 { Bad_Opcode },
9194 { Bad_Opcode },
9195 /* a0 */
9196 { Bad_Opcode },
9197 { Bad_Opcode },
9198 { Bad_Opcode },
9199 { Bad_Opcode },
9200 { Bad_Opcode },
9201 { Bad_Opcode },
9202 { Bad_Opcode },
9203 { Bad_Opcode },
9204 /* a8 */
9205 { Bad_Opcode },
9206 { Bad_Opcode },
9207 { Bad_Opcode },
9208 { Bad_Opcode },
9209 { Bad_Opcode },
9210 { Bad_Opcode },
9211 { Bad_Opcode },
9212 { Bad_Opcode },
9213 /* b0 */
9214 { Bad_Opcode },
9215 { Bad_Opcode },
9216 { Bad_Opcode },
9217 { Bad_Opcode },
9218 { Bad_Opcode },
9219 { Bad_Opcode },
9220 { Bad_Opcode },
9221 { Bad_Opcode },
9222 /* b8 */
9223 { Bad_Opcode },
9224 { Bad_Opcode },
9225 { Bad_Opcode },
9226 { Bad_Opcode },
9227 { Bad_Opcode },
9228 { Bad_Opcode },
9229 { Bad_Opcode },
9230 { Bad_Opcode },
9231 /* c0 */
9232 { Bad_Opcode },
9233 { Bad_Opcode },
9234 { Bad_Opcode },
9235 { Bad_Opcode },
9236 { Bad_Opcode },
9237 { Bad_Opcode },
9238 { Bad_Opcode },
9239 { Bad_Opcode },
9240 /* c8 */
9241 { Bad_Opcode },
9242 { Bad_Opcode },
9243 { Bad_Opcode },
9244 { Bad_Opcode },
9245 { Bad_Opcode },
9246 { Bad_Opcode },
9247 { PREFIX_TABLE(PREFIX_VEX_0F3ACE) },
9248 { PREFIX_TABLE(PREFIX_VEX_0F3ACF) },
9249 /* d0 */
9250 { Bad_Opcode },
9251 { Bad_Opcode },
9252 { Bad_Opcode },
9253 { Bad_Opcode },
9254 { Bad_Opcode },
9255 { Bad_Opcode },
9256 { Bad_Opcode },
9257 { Bad_Opcode },
9258 /* d8 */
9259 { Bad_Opcode },
9260 { Bad_Opcode },
9261 { Bad_Opcode },
9262 { Bad_Opcode },
9263 { Bad_Opcode },
9264 { Bad_Opcode },
9265 { Bad_Opcode },
9266 { PREFIX_TABLE (PREFIX_VEX_0F3ADF) },
9267 /* e0 */
9268 { Bad_Opcode },
9269 { Bad_Opcode },
9270 { Bad_Opcode },
9271 { Bad_Opcode },
9272 { Bad_Opcode },
9273 { Bad_Opcode },
9274 { Bad_Opcode },
9275 { Bad_Opcode },
9276 /* e8 */
9277 { Bad_Opcode },
9278 { Bad_Opcode },
9279 { Bad_Opcode },
9280 { Bad_Opcode },
9281 { Bad_Opcode },
9282 { Bad_Opcode },
9283 { Bad_Opcode },
9284 { Bad_Opcode },
9285 /* f0 */
9286 { PREFIX_TABLE (PREFIX_VEX_0F3AF0) },
9287 { Bad_Opcode },
9288 { Bad_Opcode },
9289 { Bad_Opcode },
9290 { Bad_Opcode },
9291 { Bad_Opcode },
9292 { Bad_Opcode },
9293 { Bad_Opcode },
9294 /* f8 */
9295 { Bad_Opcode },
9296 { Bad_Opcode },
9297 { Bad_Opcode },
9298 { Bad_Opcode },
9299 { Bad_Opcode },
9300 { Bad_Opcode },
9301 { Bad_Opcode },
9302 { Bad_Opcode },
9303 },
9304 };
9305
9306 #include "i386-dis-evex.h"
9307
9308 static const struct dis386 vex_len_table[][2] = {
9309 /* VEX_LEN_0F12_P_0_M_0 */
9310 {
9311 { "vmovlps", { XM, Vex128, EXq }, 0 },
9312 },
9313
9314 /* VEX_LEN_0F12_P_0_M_1 */
9315 {
9316 { "vmovhlps", { XM, Vex128, EXq }, 0 },
9317 },
9318
9319 /* VEX_LEN_0F12_P_2 */
9320 {
9321 { "vmovlpd", { XM, Vex128, EXq }, 0 },
9322 },
9323
9324 /* VEX_LEN_0F13_M_0 */
9325 {
9326 { "vmovlpX", { EXq, XM }, 0 },
9327 },
9328
9329 /* VEX_LEN_0F16_P_0_M_0 */
9330 {
9331 { "vmovhps", { XM, Vex128, EXq }, 0 },
9332 },
9333
9334 /* VEX_LEN_0F16_P_0_M_1 */
9335 {
9336 { "vmovlhps", { XM, Vex128, EXq }, 0 },
9337 },
9338
9339 /* VEX_LEN_0F16_P_2 */
9340 {
9341 { "vmovhpd", { XM, Vex128, EXq }, 0 },
9342 },
9343
9344 /* VEX_LEN_0F17_M_0 */
9345 {
9346 { "vmovhpX", { EXq, XM }, 0 },
9347 },
9348
9349 /* VEX_LEN_0F2A_P_1 */
9350 {
9351 { "vcvtsi2ss%LQ", { XMScalar, VexScalar, Ev }, 0 },
9352 { "vcvtsi2ss%LQ", { XMScalar, VexScalar, Ev }, 0 },
9353 },
9354
9355 /* VEX_LEN_0F2A_P_3 */
9356 {
9357 { "vcvtsi2sd%LQ", { XMScalar, VexScalar, Ev }, 0 },
9358 { "vcvtsi2sd%LQ", { XMScalar, VexScalar, Ev }, 0 },
9359 },
9360
9361 /* VEX_LEN_0F2C_P_1 */
9362 {
9363 { "vcvttss2si", { Gv, EXdScalar }, 0 },
9364 { "vcvttss2si", { Gv, EXdScalar }, 0 },
9365 },
9366
9367 /* VEX_LEN_0F2C_P_3 */
9368 {
9369 { "vcvttsd2si", { Gv, EXqScalar }, 0 },
9370 { "vcvttsd2si", { Gv, EXqScalar }, 0 },
9371 },
9372
9373 /* VEX_LEN_0F2D_P_1 */
9374 {
9375 { "vcvtss2si", { Gv, EXdScalar }, 0 },
9376 { "vcvtss2si", { Gv, EXdScalar }, 0 },
9377 },
9378
9379 /* VEX_LEN_0F2D_P_3 */
9380 {
9381 { "vcvtsd2si", { Gv, EXqScalar }, 0 },
9382 { "vcvtsd2si", { Gv, EXqScalar }, 0 },
9383 },
9384
9385 /* VEX_LEN_0F41_P_0 */
9386 {
9387 { Bad_Opcode },
9388 { VEX_W_TABLE (VEX_W_0F41_P_0_LEN_1) },
9389 },
9390 /* VEX_LEN_0F41_P_2 */
9391 {
9392 { Bad_Opcode },
9393 { VEX_W_TABLE (VEX_W_0F41_P_2_LEN_1) },
9394 },
9395 /* VEX_LEN_0F42_P_0 */
9396 {
9397 { Bad_Opcode },
9398 { VEX_W_TABLE (VEX_W_0F42_P_0_LEN_1) },
9399 },
9400 /* VEX_LEN_0F42_P_2 */
9401 {
9402 { Bad_Opcode },
9403 { VEX_W_TABLE (VEX_W_0F42_P_2_LEN_1) },
9404 },
9405 /* VEX_LEN_0F44_P_0 */
9406 {
9407 { VEX_W_TABLE (VEX_W_0F44_P_0_LEN_0) },
9408 },
9409 /* VEX_LEN_0F44_P_2 */
9410 {
9411 { VEX_W_TABLE (VEX_W_0F44_P_2_LEN_0) },
9412 },
9413 /* VEX_LEN_0F45_P_0 */
9414 {
9415 { Bad_Opcode },
9416 { VEX_W_TABLE (VEX_W_0F45_P_0_LEN_1) },
9417 },
9418 /* VEX_LEN_0F45_P_2 */
9419 {
9420 { Bad_Opcode },
9421 { VEX_W_TABLE (VEX_W_0F45_P_2_LEN_1) },
9422 },
9423 /* VEX_LEN_0F46_P_0 */
9424 {
9425 { Bad_Opcode },
9426 { VEX_W_TABLE (VEX_W_0F46_P_0_LEN_1) },
9427 },
9428 /* VEX_LEN_0F46_P_2 */
9429 {
9430 { Bad_Opcode },
9431 { VEX_W_TABLE (VEX_W_0F46_P_2_LEN_1) },
9432 },
9433 /* VEX_LEN_0F47_P_0 */
9434 {
9435 { Bad_Opcode },
9436 { VEX_W_TABLE (VEX_W_0F47_P_0_LEN_1) },
9437 },
9438 /* VEX_LEN_0F47_P_2 */
9439 {
9440 { Bad_Opcode },
9441 { VEX_W_TABLE (VEX_W_0F47_P_2_LEN_1) },
9442 },
9443 /* VEX_LEN_0F4A_P_0 */
9444 {
9445 { Bad_Opcode },
9446 { VEX_W_TABLE (VEX_W_0F4A_P_0_LEN_1) },
9447 },
9448 /* VEX_LEN_0F4A_P_2 */
9449 {
9450 { Bad_Opcode },
9451 { VEX_W_TABLE (VEX_W_0F4A_P_2_LEN_1) },
9452 },
9453 /* VEX_LEN_0F4B_P_0 */
9454 {
9455 { Bad_Opcode },
9456 { VEX_W_TABLE (VEX_W_0F4B_P_0_LEN_1) },
9457 },
9458 /* VEX_LEN_0F4B_P_2 */
9459 {
9460 { Bad_Opcode },
9461 { VEX_W_TABLE (VEX_W_0F4B_P_2_LEN_1) },
9462 },
9463
9464 /* VEX_LEN_0F6E_P_2 */
9465 {
9466 { "vmovK", { XMScalar, Edq }, 0 },
9467 },
9468
9469 /* VEX_LEN_0F77_P_1 */
9470 {
9471 { "vzeroupper", { XX }, 0 },
9472 { "vzeroall", { XX }, 0 },
9473 },
9474
9475 /* VEX_LEN_0F7E_P_1 */
9476 {
9477 { "vmovq", { XMScalar, EXqScalar }, 0 },
9478 },
9479
9480 /* VEX_LEN_0F7E_P_2 */
9481 {
9482 { "vmovK", { Edq, XMScalar }, 0 },
9483 },
9484
9485 /* VEX_LEN_0F90_P_0 */
9486 {
9487 { VEX_W_TABLE (VEX_W_0F90_P_0_LEN_0) },
9488 },
9489
9490 /* VEX_LEN_0F90_P_2 */
9491 {
9492 { VEX_W_TABLE (VEX_W_0F90_P_2_LEN_0) },
9493 },
9494
9495 /* VEX_LEN_0F91_P_0 */
9496 {
9497 { VEX_W_TABLE (VEX_W_0F91_P_0_LEN_0) },
9498 },
9499
9500 /* VEX_LEN_0F91_P_2 */
9501 {
9502 { VEX_W_TABLE (VEX_W_0F91_P_2_LEN_0) },
9503 },
9504
9505 /* VEX_LEN_0F92_P_0 */
9506 {
9507 { VEX_W_TABLE (VEX_W_0F92_P_0_LEN_0) },
9508 },
9509
9510 /* VEX_LEN_0F92_P_2 */
9511 {
9512 { VEX_W_TABLE (VEX_W_0F92_P_2_LEN_0) },
9513 },
9514
9515 /* VEX_LEN_0F92_P_3 */
9516 {
9517 { MOD_TABLE (MOD_VEX_0F92_P_3_LEN_0) },
9518 },
9519
9520 /* VEX_LEN_0F93_P_0 */
9521 {
9522 { VEX_W_TABLE (VEX_W_0F93_P_0_LEN_0) },
9523 },
9524
9525 /* VEX_LEN_0F93_P_2 */
9526 {
9527 { VEX_W_TABLE (VEX_W_0F93_P_2_LEN_0) },
9528 },
9529
9530 /* VEX_LEN_0F93_P_3 */
9531 {
9532 { MOD_TABLE (MOD_VEX_0F93_P_3_LEN_0) },
9533 },
9534
9535 /* VEX_LEN_0F98_P_0 */
9536 {
9537 { VEX_W_TABLE (VEX_W_0F98_P_0_LEN_0) },
9538 },
9539
9540 /* VEX_LEN_0F98_P_2 */
9541 {
9542 { VEX_W_TABLE (VEX_W_0F98_P_2_LEN_0) },
9543 },
9544
9545 /* VEX_LEN_0F99_P_0 */
9546 {
9547 { VEX_W_TABLE (VEX_W_0F99_P_0_LEN_0) },
9548 },
9549
9550 /* VEX_LEN_0F99_P_2 */
9551 {
9552 { VEX_W_TABLE (VEX_W_0F99_P_2_LEN_0) },
9553 },
9554
9555 /* VEX_LEN_0FAE_R_2_M_0 */
9556 {
9557 { "vldmxcsr", { Md }, 0 },
9558 },
9559
9560 /* VEX_LEN_0FAE_R_3_M_0 */
9561 {
9562 { "vstmxcsr", { Md }, 0 },
9563 },
9564
9565 /* VEX_LEN_0FC4_P_2 */
9566 {
9567 { "vpinsrw", { XM, Vex128, Edqw, Ib }, 0 },
9568 },
9569
9570 /* VEX_LEN_0FC5_P_2 */
9571 {
9572 { "vpextrw", { Gdq, XS, Ib }, 0 },
9573 },
9574
9575 /* VEX_LEN_0FD6_P_2 */
9576 {
9577 { "vmovq", { EXqScalarS, XMScalar }, 0 },
9578 },
9579
9580 /* VEX_LEN_0FF7_P_2 */
9581 {
9582 { "vmaskmovdqu", { XM, XS }, 0 },
9583 },
9584
9585 /* VEX_LEN_0F3816_P_2 */
9586 {
9587 { Bad_Opcode },
9588 { VEX_W_TABLE (VEX_W_0F3816_P_2) },
9589 },
9590
9591 /* VEX_LEN_0F3819_P_2 */
9592 {
9593 { Bad_Opcode },
9594 { VEX_W_TABLE (VEX_W_0F3819_P_2) },
9595 },
9596
9597 /* VEX_LEN_0F381A_P_2_M_0 */
9598 {
9599 { Bad_Opcode },
9600 { VEX_W_TABLE (VEX_W_0F381A_P_2_M_0) },
9601 },
9602
9603 /* VEX_LEN_0F3836_P_2 */
9604 {
9605 { Bad_Opcode },
9606 { VEX_W_TABLE (VEX_W_0F3836_P_2) },
9607 },
9608
9609 /* VEX_LEN_0F3841_P_2 */
9610 {
9611 { "vphminposuw", { XM, EXx }, 0 },
9612 },
9613
9614 /* VEX_LEN_0F385A_P_2_M_0 */
9615 {
9616 { Bad_Opcode },
9617 { VEX_W_TABLE (VEX_W_0F385A_P_2_M_0) },
9618 },
9619
9620 /* VEX_LEN_0F38DB_P_2 */
9621 {
9622 { "vaesimc", { XM, EXx }, 0 },
9623 },
9624
9625 /* VEX_LEN_0F38F2_P_0 */
9626 {
9627 { "andnS", { Gdq, VexGdq, Edq }, 0 },
9628 },
9629
9630 /* VEX_LEN_0F38F3_R_1_P_0 */
9631 {
9632 { "blsrS", { VexGdq, Edq }, 0 },
9633 },
9634
9635 /* VEX_LEN_0F38F3_R_2_P_0 */
9636 {
9637 { "blsmskS", { VexGdq, Edq }, 0 },
9638 },
9639
9640 /* VEX_LEN_0F38F3_R_3_P_0 */
9641 {
9642 { "blsiS", { VexGdq, Edq }, 0 },
9643 },
9644
9645 /* VEX_LEN_0F38F5_P_0 */
9646 {
9647 { "bzhiS", { Gdq, Edq, VexGdq }, 0 },
9648 },
9649
9650 /* VEX_LEN_0F38F5_P_1 */
9651 {
9652 { "pextS", { Gdq, VexGdq, Edq }, 0 },
9653 },
9654
9655 /* VEX_LEN_0F38F5_P_3 */
9656 {
9657 { "pdepS", { Gdq, VexGdq, Edq }, 0 },
9658 },
9659
9660 /* VEX_LEN_0F38F6_P_3 */
9661 {
9662 { "mulxS", { Gdq, VexGdq, Edq }, 0 },
9663 },
9664
9665 /* VEX_LEN_0F38F7_P_0 */
9666 {
9667 { "bextrS", { Gdq, Edq, VexGdq }, 0 },
9668 },
9669
9670 /* VEX_LEN_0F38F7_P_1 */
9671 {
9672 { "sarxS", { Gdq, Edq, VexGdq }, 0 },
9673 },
9674
9675 /* VEX_LEN_0F38F7_P_2 */
9676 {
9677 { "shlxS", { Gdq, Edq, VexGdq }, 0 },
9678 },
9679
9680 /* VEX_LEN_0F38F7_P_3 */
9681 {
9682 { "shrxS", { Gdq, Edq, VexGdq }, 0 },
9683 },
9684
9685 /* VEX_LEN_0F3A00_P_2 */
9686 {
9687 { Bad_Opcode },
9688 { VEX_W_TABLE (VEX_W_0F3A00_P_2) },
9689 },
9690
9691 /* VEX_LEN_0F3A01_P_2 */
9692 {
9693 { Bad_Opcode },
9694 { VEX_W_TABLE (VEX_W_0F3A01_P_2) },
9695 },
9696
9697 /* VEX_LEN_0F3A06_P_2 */
9698 {
9699 { Bad_Opcode },
9700 { VEX_W_TABLE (VEX_W_0F3A06_P_2) },
9701 },
9702
9703 /* VEX_LEN_0F3A14_P_2 */
9704 {
9705 { "vpextrb", { Edqb, XM, Ib }, 0 },
9706 },
9707
9708 /* VEX_LEN_0F3A15_P_2 */
9709 {
9710 { "vpextrw", { Edqw, XM, Ib }, 0 },
9711 },
9712
9713 /* VEX_LEN_0F3A16_P_2 */
9714 {
9715 { "vpextrK", { Edq, XM, Ib }, 0 },
9716 },
9717
9718 /* VEX_LEN_0F3A17_P_2 */
9719 {
9720 { "vextractps", { Edqd, XM, Ib }, 0 },
9721 },
9722
9723 /* VEX_LEN_0F3A18_P_2 */
9724 {
9725 { Bad_Opcode },
9726 { VEX_W_TABLE (VEX_W_0F3A18_P_2) },
9727 },
9728
9729 /* VEX_LEN_0F3A19_P_2 */
9730 {
9731 { Bad_Opcode },
9732 { VEX_W_TABLE (VEX_W_0F3A19_P_2) },
9733 },
9734
9735 /* VEX_LEN_0F3A20_P_2 */
9736 {
9737 { "vpinsrb", { XM, Vex128, Edqb, Ib }, 0 },
9738 },
9739
9740 /* VEX_LEN_0F3A21_P_2 */
9741 {
9742 { "vinsertps", { XM, Vex128, EXd, Ib }, 0 },
9743 },
9744
9745 /* VEX_LEN_0F3A22_P_2 */
9746 {
9747 { "vpinsrK", { XM, Vex128, Edq, Ib }, 0 },
9748 },
9749
9750 /* VEX_LEN_0F3A30_P_2 */
9751 {
9752 { VEX_W_TABLE (VEX_W_0F3A30_P_2_LEN_0) },
9753 },
9754
9755 /* VEX_LEN_0F3A31_P_2 */
9756 {
9757 { VEX_W_TABLE (VEX_W_0F3A31_P_2_LEN_0) },
9758 },
9759
9760 /* VEX_LEN_0F3A32_P_2 */
9761 {
9762 { VEX_W_TABLE (VEX_W_0F3A32_P_2_LEN_0) },
9763 },
9764
9765 /* VEX_LEN_0F3A33_P_2 */
9766 {
9767 { VEX_W_TABLE (VEX_W_0F3A33_P_2_LEN_0) },
9768 },
9769
9770 /* VEX_LEN_0F3A38_P_2 */
9771 {
9772 { Bad_Opcode },
9773 { VEX_W_TABLE (VEX_W_0F3A38_P_2) },
9774 },
9775
9776 /* VEX_LEN_0F3A39_P_2 */
9777 {
9778 { Bad_Opcode },
9779 { VEX_W_TABLE (VEX_W_0F3A39_P_2) },
9780 },
9781
9782 /* VEX_LEN_0F3A41_P_2 */
9783 {
9784 { "vdppd", { XM, Vex128, EXx, Ib }, 0 },
9785 },
9786
9787 /* VEX_LEN_0F3A46_P_2 */
9788 {
9789 { Bad_Opcode },
9790 { VEX_W_TABLE (VEX_W_0F3A46_P_2) },
9791 },
9792
9793 /* VEX_LEN_0F3A60_P_2 */
9794 {
9795 { "vpcmpestrm", { XM, { PCMPESTR_Fixup, x_mode }, Ib }, 0 },
9796 },
9797
9798 /* VEX_LEN_0F3A61_P_2 */
9799 {
9800 { "vpcmpestri", { XM, { PCMPESTR_Fixup, x_mode }, Ib }, 0 },
9801 },
9802
9803 /* VEX_LEN_0F3A62_P_2 */
9804 {
9805 { "vpcmpistrm", { XM, EXx, Ib }, 0 },
9806 },
9807
9808 /* VEX_LEN_0F3A63_P_2 */
9809 {
9810 { "vpcmpistri", { XM, EXx, Ib }, 0 },
9811 },
9812
9813 /* VEX_LEN_0F3A6A_P_2 */
9814 {
9815 { "vfmaddss", { XMVexW, Vex128, EXdVexW, EXdVexW }, 0 },
9816 },
9817
9818 /* VEX_LEN_0F3A6B_P_2 */
9819 {
9820 { "vfmaddsd", { XMVexW, Vex128, EXqVexW, EXqVexW }, 0 },
9821 },
9822
9823 /* VEX_LEN_0F3A6E_P_2 */
9824 {
9825 { "vfmsubss", { XMVexW, Vex128, EXdVexW, EXdVexW }, 0 },
9826 },
9827
9828 /* VEX_LEN_0F3A6F_P_2 */
9829 {
9830 { "vfmsubsd", { XMVexW, Vex128, EXqVexW, EXqVexW }, 0 },
9831 },
9832
9833 /* VEX_LEN_0F3A7A_P_2 */
9834 {
9835 { "vfnmaddss", { XMVexW, Vex128, EXdVexW, EXdVexW }, 0 },
9836 },
9837
9838 /* VEX_LEN_0F3A7B_P_2 */
9839 {
9840 { "vfnmaddsd", { XMVexW, Vex128, EXqVexW, EXqVexW }, 0 },
9841 },
9842
9843 /* VEX_LEN_0F3A7E_P_2 */
9844 {
9845 { "vfnmsubss", { XMVexW, Vex128, EXdVexW, EXdVexW }, 0 },
9846 },
9847
9848 /* VEX_LEN_0F3A7F_P_2 */
9849 {
9850 { "vfnmsubsd", { XMVexW, Vex128, EXqVexW, EXqVexW }, 0 },
9851 },
9852
9853 /* VEX_LEN_0F3ADF_P_2 */
9854 {
9855 { "vaeskeygenassist", { XM, EXx, Ib }, 0 },
9856 },
9857
9858 /* VEX_LEN_0F3AF0_P_3 */
9859 {
9860 { "rorxS", { Gdq, Edq, Ib }, 0 },
9861 },
9862
9863 /* VEX_LEN_0FXOP_08_CC */
9864 {
9865 { "vpcomb", { XM, Vex128, EXx, VPCOM }, 0 },
9866 },
9867
9868 /* VEX_LEN_0FXOP_08_CD */
9869 {
9870 { "vpcomw", { XM, Vex128, EXx, VPCOM }, 0 },
9871 },
9872
9873 /* VEX_LEN_0FXOP_08_CE */
9874 {
9875 { "vpcomd", { XM, Vex128, EXx, VPCOM }, 0 },
9876 },
9877
9878 /* VEX_LEN_0FXOP_08_CF */
9879 {
9880 { "vpcomq", { XM, Vex128, EXx, VPCOM }, 0 },
9881 },
9882
9883 /* VEX_LEN_0FXOP_08_EC */
9884 {
9885 { "vpcomub", { XM, Vex128, EXx, VPCOM }, 0 },
9886 },
9887
9888 /* VEX_LEN_0FXOP_08_ED */
9889 {
9890 { "vpcomuw", { XM, Vex128, EXx, VPCOM }, 0 },
9891 },
9892
9893 /* VEX_LEN_0FXOP_08_EE */
9894 {
9895 { "vpcomud", { XM, Vex128, EXx, VPCOM }, 0 },
9896 },
9897
9898 /* VEX_LEN_0FXOP_08_EF */
9899 {
9900 { "vpcomuq", { XM, Vex128, EXx, VPCOM }, 0 },
9901 },
9902
9903 /* VEX_LEN_0FXOP_09_80 */
9904 {
9905 { "vfrczps", { XM, EXxmm }, 0 },
9906 { "vfrczps", { XM, EXymmq }, 0 },
9907 },
9908
9909 /* VEX_LEN_0FXOP_09_81 */
9910 {
9911 { "vfrczpd", { XM, EXxmm }, 0 },
9912 { "vfrczpd", { XM, EXymmq }, 0 },
9913 },
9914 };
9915
9916 #include "i386-dis-evex-len.h"
9917
9918 static const struct dis386 vex_w_table[][2] = {
9919 {
9920 /* VEX_W_0F41_P_0_LEN_1 */
9921 { MOD_TABLE (MOD_VEX_W_0_0F41_P_0_LEN_1) },
9922 { MOD_TABLE (MOD_VEX_W_1_0F41_P_0_LEN_1) },
9923 },
9924 {
9925 /* VEX_W_0F41_P_2_LEN_1 */
9926 { MOD_TABLE (MOD_VEX_W_0_0F41_P_2_LEN_1) },
9927 { MOD_TABLE (MOD_VEX_W_1_0F41_P_2_LEN_1) }
9928 },
9929 {
9930 /* VEX_W_0F42_P_0_LEN_1 */
9931 { MOD_TABLE (MOD_VEX_W_0_0F42_P_0_LEN_1) },
9932 { MOD_TABLE (MOD_VEX_W_1_0F42_P_0_LEN_1) },
9933 },
9934 {
9935 /* VEX_W_0F42_P_2_LEN_1 */
9936 { MOD_TABLE (MOD_VEX_W_0_0F42_P_2_LEN_1) },
9937 { MOD_TABLE (MOD_VEX_W_1_0F42_P_2_LEN_1) },
9938 },
9939 {
9940 /* VEX_W_0F44_P_0_LEN_0 */
9941 { MOD_TABLE (MOD_VEX_W_0_0F44_P_0_LEN_1) },
9942 { MOD_TABLE (MOD_VEX_W_1_0F44_P_0_LEN_1) },
9943 },
9944 {
9945 /* VEX_W_0F44_P_2_LEN_0 */
9946 { MOD_TABLE (MOD_VEX_W_0_0F44_P_2_LEN_1) },
9947 { MOD_TABLE (MOD_VEX_W_1_0F44_P_2_LEN_1) },
9948 },
9949 {
9950 /* VEX_W_0F45_P_0_LEN_1 */
9951 { MOD_TABLE (MOD_VEX_W_0_0F45_P_0_LEN_1) },
9952 { MOD_TABLE (MOD_VEX_W_1_0F45_P_0_LEN_1) },
9953 },
9954 {
9955 /* VEX_W_0F45_P_2_LEN_1 */
9956 { MOD_TABLE (MOD_VEX_W_0_0F45_P_2_LEN_1) },
9957 { MOD_TABLE (MOD_VEX_W_1_0F45_P_2_LEN_1) },
9958 },
9959 {
9960 /* VEX_W_0F46_P_0_LEN_1 */
9961 { MOD_TABLE (MOD_VEX_W_0_0F46_P_0_LEN_1) },
9962 { MOD_TABLE (MOD_VEX_W_1_0F46_P_0_LEN_1) },
9963 },
9964 {
9965 /* VEX_W_0F46_P_2_LEN_1 */
9966 { MOD_TABLE (MOD_VEX_W_0_0F46_P_2_LEN_1) },
9967 { MOD_TABLE (MOD_VEX_W_1_0F46_P_2_LEN_1) },
9968 },
9969 {
9970 /* VEX_W_0F47_P_0_LEN_1 */
9971 { MOD_TABLE (MOD_VEX_W_0_0F47_P_0_LEN_1) },
9972 { MOD_TABLE (MOD_VEX_W_1_0F47_P_0_LEN_1) },
9973 },
9974 {
9975 /* VEX_W_0F47_P_2_LEN_1 */
9976 { MOD_TABLE (MOD_VEX_W_0_0F47_P_2_LEN_1) },
9977 { MOD_TABLE (MOD_VEX_W_1_0F47_P_2_LEN_1) },
9978 },
9979 {
9980 /* VEX_W_0F4A_P_0_LEN_1 */
9981 { MOD_TABLE (MOD_VEX_W_0_0F4A_P_0_LEN_1) },
9982 { MOD_TABLE (MOD_VEX_W_1_0F4A_P_0_LEN_1) },
9983 },
9984 {
9985 /* VEX_W_0F4A_P_2_LEN_1 */
9986 { MOD_TABLE (MOD_VEX_W_0_0F4A_P_2_LEN_1) },
9987 { MOD_TABLE (MOD_VEX_W_1_0F4A_P_2_LEN_1) },
9988 },
9989 {
9990 /* VEX_W_0F4B_P_0_LEN_1 */
9991 { MOD_TABLE (MOD_VEX_W_0_0F4B_P_0_LEN_1) },
9992 { MOD_TABLE (MOD_VEX_W_1_0F4B_P_0_LEN_1) },
9993 },
9994 {
9995 /* VEX_W_0F4B_P_2_LEN_1 */
9996 { MOD_TABLE (MOD_VEX_W_0_0F4B_P_2_LEN_1) },
9997 },
9998 {
9999 /* VEX_W_0F90_P_0_LEN_0 */
10000 { "kmovw", { MaskG, MaskE }, 0 },
10001 { "kmovq", { MaskG, MaskE }, 0 },
10002 },
10003 {
10004 /* VEX_W_0F90_P_2_LEN_0 */
10005 { "kmovb", { MaskG, MaskBDE }, 0 },
10006 { "kmovd", { MaskG, MaskBDE }, 0 },
10007 },
10008 {
10009 /* VEX_W_0F91_P_0_LEN_0 */
10010 { MOD_TABLE (MOD_VEX_W_0_0F91_P_0_LEN_0) },
10011 { MOD_TABLE (MOD_VEX_W_1_0F91_P_0_LEN_0) },
10012 },
10013 {
10014 /* VEX_W_0F91_P_2_LEN_0 */
10015 { MOD_TABLE (MOD_VEX_W_0_0F91_P_2_LEN_0) },
10016 { MOD_TABLE (MOD_VEX_W_1_0F91_P_2_LEN_0) },
10017 },
10018 {
10019 /* VEX_W_0F92_P_0_LEN_0 */
10020 { MOD_TABLE (MOD_VEX_W_0_0F92_P_0_LEN_0) },
10021 },
10022 {
10023 /* VEX_W_0F92_P_2_LEN_0 */
10024 { MOD_TABLE (MOD_VEX_W_0_0F92_P_2_LEN_0) },
10025 },
10026 {
10027 /* VEX_W_0F93_P_0_LEN_0 */
10028 { MOD_TABLE (MOD_VEX_W_0_0F93_P_0_LEN_0) },
10029 },
10030 {
10031 /* VEX_W_0F93_P_2_LEN_0 */
10032 { MOD_TABLE (MOD_VEX_W_0_0F93_P_2_LEN_0) },
10033 },
10034 {
10035 /* VEX_W_0F98_P_0_LEN_0 */
10036 { MOD_TABLE (MOD_VEX_W_0_0F98_P_0_LEN_0) },
10037 { MOD_TABLE (MOD_VEX_W_1_0F98_P_0_LEN_0) },
10038 },
10039 {
10040 /* VEX_W_0F98_P_2_LEN_0 */
10041 { MOD_TABLE (MOD_VEX_W_0_0F98_P_2_LEN_0) },
10042 { MOD_TABLE (MOD_VEX_W_1_0F98_P_2_LEN_0) },
10043 },
10044 {
10045 /* VEX_W_0F99_P_0_LEN_0 */
10046 { MOD_TABLE (MOD_VEX_W_0_0F99_P_0_LEN_0) },
10047 { MOD_TABLE (MOD_VEX_W_1_0F99_P_0_LEN_0) },
10048 },
10049 {
10050 /* VEX_W_0F99_P_2_LEN_0 */
10051 { MOD_TABLE (MOD_VEX_W_0_0F99_P_2_LEN_0) },
10052 { MOD_TABLE (MOD_VEX_W_1_0F99_P_2_LEN_0) },
10053 },
10054 {
10055 /* VEX_W_0F380C_P_2 */
10056 { "vpermilps", { XM, Vex, EXx }, 0 },
10057 },
10058 {
10059 /* VEX_W_0F380D_P_2 */
10060 { "vpermilpd", { XM, Vex, EXx }, 0 },
10061 },
10062 {
10063 /* VEX_W_0F380E_P_2 */
10064 { "vtestps", { XM, EXx }, 0 },
10065 },
10066 {
10067 /* VEX_W_0F380F_P_2 */
10068 { "vtestpd", { XM, EXx }, 0 },
10069 },
10070 {
10071 /* VEX_W_0F3816_P_2 */
10072 { "vpermps", { XM, Vex, EXx }, 0 },
10073 },
10074 {
10075 /* VEX_W_0F3818_P_2 */
10076 { "vbroadcastss", { XM, EXxmm_md }, 0 },
10077 },
10078 {
10079 /* VEX_W_0F3819_P_2 */
10080 { "vbroadcastsd", { XM, EXxmm_mq }, 0 },
10081 },
10082 {
10083 /* VEX_W_0F381A_P_2_M_0 */
10084 { "vbroadcastf128", { XM, Mxmm }, 0 },
10085 },
10086 {
10087 /* VEX_W_0F382C_P_2_M_0 */
10088 { "vmaskmovps", { XM, Vex, Mx }, 0 },
10089 },
10090 {
10091 /* VEX_W_0F382D_P_2_M_0 */
10092 { "vmaskmovpd", { XM, Vex, Mx }, 0 },
10093 },
10094 {
10095 /* VEX_W_0F382E_P_2_M_0 */
10096 { "vmaskmovps", { Mx, Vex, XM }, 0 },
10097 },
10098 {
10099 /* VEX_W_0F382F_P_2_M_0 */
10100 { "vmaskmovpd", { Mx, Vex, XM }, 0 },
10101 },
10102 {
10103 /* VEX_W_0F3836_P_2 */
10104 { "vpermd", { XM, Vex, EXx }, 0 },
10105 },
10106 {
10107 /* VEX_W_0F3846_P_2 */
10108 { "vpsravd", { XM, Vex, EXx }, 0 },
10109 },
10110 {
10111 /* VEX_W_0F3858_P_2 */
10112 { "vpbroadcastd", { XM, EXxmm_md }, 0 },
10113 },
10114 {
10115 /* VEX_W_0F3859_P_2 */
10116 { "vpbroadcastq", { XM, EXxmm_mq }, 0 },
10117 },
10118 {
10119 /* VEX_W_0F385A_P_2_M_0 */
10120 { "vbroadcasti128", { XM, Mxmm }, 0 },
10121 },
10122 {
10123 /* VEX_W_0F3878_P_2 */
10124 { "vpbroadcastb", { XM, EXxmm_mb }, 0 },
10125 },
10126 {
10127 /* VEX_W_0F3879_P_2 */
10128 { "vpbroadcastw", { XM, EXxmm_mw }, 0 },
10129 },
10130 {
10131 /* VEX_W_0F38CF_P_2 */
10132 { "vgf2p8mulb", { XM, Vex, EXx }, 0 },
10133 },
10134 {
10135 /* VEX_W_0F3A00_P_2 */
10136 { Bad_Opcode },
10137 { "vpermq", { XM, EXx, Ib }, 0 },
10138 },
10139 {
10140 /* VEX_W_0F3A01_P_2 */
10141 { Bad_Opcode },
10142 { "vpermpd", { XM, EXx, Ib }, 0 },
10143 },
10144 {
10145 /* VEX_W_0F3A02_P_2 */
10146 { "vpblendd", { XM, Vex, EXx, Ib }, 0 },
10147 },
10148 {
10149 /* VEX_W_0F3A04_P_2 */
10150 { "vpermilps", { XM, EXx, Ib }, 0 },
10151 },
10152 {
10153 /* VEX_W_0F3A05_P_2 */
10154 { "vpermilpd", { XM, EXx, Ib }, 0 },
10155 },
10156 {
10157 /* VEX_W_0F3A06_P_2 */
10158 { "vperm2f128", { XM, Vex256, EXx, Ib }, 0 },
10159 },
10160 {
10161 /* VEX_W_0F3A18_P_2 */
10162 { "vinsertf128", { XM, Vex256, EXxmm, Ib }, 0 },
10163 },
10164 {
10165 /* VEX_W_0F3A19_P_2 */
10166 { "vextractf128", { EXxmm, XM, Ib }, 0 },
10167 },
10168 {
10169 /* VEX_W_0F3A30_P_2_LEN_0 */
10170 { MOD_TABLE (MOD_VEX_W_0_0F3A30_P_2_LEN_0) },
10171 { MOD_TABLE (MOD_VEX_W_1_0F3A30_P_2_LEN_0) },
10172 },
10173 {
10174 /* VEX_W_0F3A31_P_2_LEN_0 */
10175 { MOD_TABLE (MOD_VEX_W_0_0F3A31_P_2_LEN_0) },
10176 { MOD_TABLE (MOD_VEX_W_1_0F3A31_P_2_LEN_0) },
10177 },
10178 {
10179 /* VEX_W_0F3A32_P_2_LEN_0 */
10180 { MOD_TABLE (MOD_VEX_W_0_0F3A32_P_2_LEN_0) },
10181 { MOD_TABLE (MOD_VEX_W_1_0F3A32_P_2_LEN_0) },
10182 },
10183 {
10184 /* VEX_W_0F3A33_P_2_LEN_0 */
10185 { MOD_TABLE (MOD_VEX_W_0_0F3A33_P_2_LEN_0) },
10186 { MOD_TABLE (MOD_VEX_W_1_0F3A33_P_2_LEN_0) },
10187 },
10188 {
10189 /* VEX_W_0F3A38_P_2 */
10190 { "vinserti128", { XM, Vex256, EXxmm, Ib }, 0 },
10191 },
10192 {
10193 /* VEX_W_0F3A39_P_2 */
10194 { "vextracti128", { EXxmm, XM, Ib }, 0 },
10195 },
10196 {
10197 /* VEX_W_0F3A46_P_2 */
10198 { "vperm2i128", { XM, Vex256, EXx, Ib }, 0 },
10199 },
10200 {
10201 /* VEX_W_0F3A48_P_2 */
10202 { "vpermil2ps", { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW }, 0 },
10203 { "vpermil2ps", { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW }, 0 },
10204 },
10205 {
10206 /* VEX_W_0F3A49_P_2 */
10207 { "vpermil2pd", { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW }, 0 },
10208 { "vpermil2pd", { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW }, 0 },
10209 },
10210 {
10211 /* VEX_W_0F3A4A_P_2 */
10212 { "vblendvps", { XM, Vex, EXx, XMVexI4 }, 0 },
10213 },
10214 {
10215 /* VEX_W_0F3A4B_P_2 */
10216 { "vblendvpd", { XM, Vex, EXx, XMVexI4 }, 0 },
10217 },
10218 {
10219 /* VEX_W_0F3A4C_P_2 */
10220 { "vpblendvb", { XM, Vex, EXx, XMVexI4 }, 0 },
10221 },
10222 {
10223 /* VEX_W_0F3ACE_P_2 */
10224 { Bad_Opcode },
10225 { "vgf2p8affineqb", { XM, Vex, EXx, Ib }, 0 },
10226 },
10227 {
10228 /* VEX_W_0F3ACF_P_2 */
10229 { Bad_Opcode },
10230 { "vgf2p8affineinvqb", { XM, Vex, EXx, Ib }, 0 },
10231 },
10232
10233 #include "i386-dis-evex-w.h"
10234 };
10235
10236 static const struct dis386 mod_table[][2] = {
10237 {
10238 /* MOD_8D */
10239 { "leaS", { Gv, M }, 0 },
10240 },
10241 {
10242 /* MOD_C6_REG_7 */
10243 { Bad_Opcode },
10244 { RM_TABLE (RM_C6_REG_7) },
10245 },
10246 {
10247 /* MOD_C7_REG_7 */
10248 { Bad_Opcode },
10249 { RM_TABLE (RM_C7_REG_7) },
10250 },
10251 {
10252 /* MOD_FF_REG_3 */
10253 { "Jcall^", { indirEp }, 0 },
10254 },
10255 {
10256 /* MOD_FF_REG_5 */
10257 { "Jjmp^", { indirEp }, 0 },
10258 },
10259 {
10260 /* MOD_0F01_REG_0 */
10261 { X86_64_TABLE (X86_64_0F01_REG_0) },
10262 { RM_TABLE (RM_0F01_REG_0) },
10263 },
10264 {
10265 /* MOD_0F01_REG_1 */
10266 { X86_64_TABLE (X86_64_0F01_REG_1) },
10267 { RM_TABLE (RM_0F01_REG_1) },
10268 },
10269 {
10270 /* MOD_0F01_REG_2 */
10271 { X86_64_TABLE (X86_64_0F01_REG_2) },
10272 { RM_TABLE (RM_0F01_REG_2) },
10273 },
10274 {
10275 /* MOD_0F01_REG_3 */
10276 { X86_64_TABLE (X86_64_0F01_REG_3) },
10277 { RM_TABLE (RM_0F01_REG_3) },
10278 },
10279 {
10280 /* MOD_0F01_REG_5 */
10281 { PREFIX_TABLE (PREFIX_MOD_0_0F01_REG_5) },
10282 { RM_TABLE (RM_0F01_REG_5) },
10283 },
10284 {
10285 /* MOD_0F01_REG_7 */
10286 { "invlpg", { Mb }, 0 },
10287 { RM_TABLE (RM_0F01_REG_7) },
10288 },
10289 {
10290 /* MOD_0F12_PREFIX_0 */
10291 { "movlps", { XM, EXq }, PREFIX_OPCODE },
10292 { "movhlps", { XM, EXq }, PREFIX_OPCODE },
10293 },
10294 {
10295 /* MOD_0F13 */
10296 { "movlpX", { EXq, XM }, PREFIX_OPCODE },
10297 },
10298 {
10299 /* MOD_0F16_PREFIX_0 */
10300 { "movhps", { XM, EXq }, 0 },
10301 { "movlhps", { XM, EXq }, 0 },
10302 },
10303 {
10304 /* MOD_0F17 */
10305 { "movhpX", { EXq, XM }, PREFIX_OPCODE },
10306 },
10307 {
10308 /* MOD_0F18_REG_0 */
10309 { "prefetchnta", { Mb }, 0 },
10310 },
10311 {
10312 /* MOD_0F18_REG_1 */
10313 { "prefetcht0", { Mb }, 0 },
10314 },
10315 {
10316 /* MOD_0F18_REG_2 */
10317 { "prefetcht1", { Mb }, 0 },
10318 },
10319 {
10320 /* MOD_0F18_REG_3 */
10321 { "prefetcht2", { Mb }, 0 },
10322 },
10323 {
10324 /* MOD_0F18_REG_4 */
10325 { "nop/reserved", { Mb }, 0 },
10326 },
10327 {
10328 /* MOD_0F18_REG_5 */
10329 { "nop/reserved", { Mb }, 0 },
10330 },
10331 {
10332 /* MOD_0F18_REG_6 */
10333 { "nop/reserved", { Mb }, 0 },
10334 },
10335 {
10336 /* MOD_0F18_REG_7 */
10337 { "nop/reserved", { Mb }, 0 },
10338 },
10339 {
10340 /* MOD_0F1A_PREFIX_0 */
10341 { "bndldx", { Gbnd, Mv_bnd }, 0 },
10342 { "nopQ", { Ev }, 0 },
10343 },
10344 {
10345 /* MOD_0F1B_PREFIX_0 */
10346 { "bndstx", { Mv_bnd, Gbnd }, 0 },
10347 { "nopQ", { Ev }, 0 },
10348 },
10349 {
10350 /* MOD_0F1B_PREFIX_1 */
10351 { "bndmk", { Gbnd, Mv_bnd }, 0 },
10352 { "nopQ", { Ev }, 0 },
10353 },
10354 {
10355 /* MOD_0F1C_PREFIX_0 */
10356 { REG_TABLE (REG_0F1C_MOD_0) },
10357 { "nopQ", { Ev }, 0 },
10358 },
10359 {
10360 /* MOD_0F1E_PREFIX_1 */
10361 { "nopQ", { Ev }, 0 },
10362 { REG_TABLE (REG_0F1E_MOD_3) },
10363 },
10364 {
10365 /* MOD_0F24 */
10366 { Bad_Opcode },
10367 { "movL", { Rd, Td }, 0 },
10368 },
10369 {
10370 /* MOD_0F26 */
10371 { Bad_Opcode },
10372 { "movL", { Td, Rd }, 0 },
10373 },
10374 {
10375 /* MOD_0F2B_PREFIX_0 */
10376 {"movntps", { Mx, XM }, PREFIX_OPCODE },
10377 },
10378 {
10379 /* MOD_0F2B_PREFIX_1 */
10380 {"movntss", { Md, XM }, PREFIX_OPCODE },
10381 },
10382 {
10383 /* MOD_0F2B_PREFIX_2 */
10384 {"movntpd", { Mx, XM }, PREFIX_OPCODE },
10385 },
10386 {
10387 /* MOD_0F2B_PREFIX_3 */
10388 {"movntsd", { Mq, XM }, PREFIX_OPCODE },
10389 },
10390 {
10391 /* MOD_0F51 */
10392 { Bad_Opcode },
10393 { "movmskpX", { Gdq, XS }, PREFIX_OPCODE },
10394 },
10395 {
10396 /* MOD_0F71_REG_2 */
10397 { Bad_Opcode },
10398 { "psrlw", { MS, Ib }, 0 },
10399 },
10400 {
10401 /* MOD_0F71_REG_4 */
10402 { Bad_Opcode },
10403 { "psraw", { MS, Ib }, 0 },
10404 },
10405 {
10406 /* MOD_0F71_REG_6 */
10407 { Bad_Opcode },
10408 { "psllw", { MS, Ib }, 0 },
10409 },
10410 {
10411 /* MOD_0F72_REG_2 */
10412 { Bad_Opcode },
10413 { "psrld", { MS, Ib }, 0 },
10414 },
10415 {
10416 /* MOD_0F72_REG_4 */
10417 { Bad_Opcode },
10418 { "psrad", { MS, Ib }, 0 },
10419 },
10420 {
10421 /* MOD_0F72_REG_6 */
10422 { Bad_Opcode },
10423 { "pslld", { MS, Ib }, 0 },
10424 },
10425 {
10426 /* MOD_0F73_REG_2 */
10427 { Bad_Opcode },
10428 { "psrlq", { MS, Ib }, 0 },
10429 },
10430 {
10431 /* MOD_0F73_REG_3 */
10432 { Bad_Opcode },
10433 { PREFIX_TABLE (PREFIX_0F73_REG_3) },
10434 },
10435 {
10436 /* MOD_0F73_REG_6 */
10437 { Bad_Opcode },
10438 { "psllq", { MS, Ib }, 0 },
10439 },
10440 {
10441 /* MOD_0F73_REG_7 */
10442 { Bad_Opcode },
10443 { PREFIX_TABLE (PREFIX_0F73_REG_7) },
10444 },
10445 {
10446 /* MOD_0FAE_REG_0 */
10447 { "fxsave", { FXSAVE }, 0 },
10448 { PREFIX_TABLE (PREFIX_0FAE_REG_0) },
10449 },
10450 {
10451 /* MOD_0FAE_REG_1 */
10452 { "fxrstor", { FXSAVE }, 0 },
10453 { PREFIX_TABLE (PREFIX_0FAE_REG_1) },
10454 },
10455 {
10456 /* MOD_0FAE_REG_2 */
10457 { "ldmxcsr", { Md }, 0 },
10458 { PREFIX_TABLE (PREFIX_0FAE_REG_2) },
10459 },
10460 {
10461 /* MOD_0FAE_REG_3 */
10462 { "stmxcsr", { Md }, 0 },
10463 { PREFIX_TABLE (PREFIX_0FAE_REG_3) },
10464 },
10465 {
10466 /* MOD_0FAE_REG_4 */
10467 { PREFIX_TABLE (PREFIX_MOD_0_0FAE_REG_4) },
10468 { PREFIX_TABLE (PREFIX_MOD_3_0FAE_REG_4) },
10469 },
10470 {
10471 /* MOD_0FAE_REG_5 */
10472 { PREFIX_TABLE (PREFIX_MOD_0_0FAE_REG_5) },
10473 { PREFIX_TABLE (PREFIX_MOD_3_0FAE_REG_5) },
10474 },
10475 {
10476 /* MOD_0FAE_REG_6 */
10477 { PREFIX_TABLE (PREFIX_MOD_0_0FAE_REG_6) },
10478 { PREFIX_TABLE (PREFIX_MOD_1_0FAE_REG_6) },
10479 },
10480 {
10481 /* MOD_0FAE_REG_7 */
10482 { PREFIX_TABLE (PREFIX_0FAE_REG_7) },
10483 { RM_TABLE (RM_0FAE_REG_7) },
10484 },
10485 {
10486 /* MOD_0FB2 */
10487 { "lssS", { Gv, Mp }, 0 },
10488 },
10489 {
10490 /* MOD_0FB4 */
10491 { "lfsS", { Gv, Mp }, 0 },
10492 },
10493 {
10494 /* MOD_0FB5 */
10495 { "lgsS", { Gv, Mp }, 0 },
10496 },
10497 {
10498 /* MOD_0FC3 */
10499 { PREFIX_TABLE (PREFIX_MOD_0_0FC3) },
10500 },
10501 {
10502 /* MOD_0FC7_REG_3 */
10503 { "xrstors", { FXSAVE }, 0 },
10504 },
10505 {
10506 /* MOD_0FC7_REG_4 */
10507 { "xsavec", { FXSAVE }, 0 },
10508 },
10509 {
10510 /* MOD_0FC7_REG_5 */
10511 { "xsaves", { FXSAVE }, 0 },
10512 },
10513 {
10514 /* MOD_0FC7_REG_6 */
10515 { PREFIX_TABLE (PREFIX_MOD_0_0FC7_REG_6) },
10516 { PREFIX_TABLE (PREFIX_MOD_3_0FC7_REG_6) }
10517 },
10518 {
10519 /* MOD_0FC7_REG_7 */
10520 { "vmptrst", { Mq }, 0 },
10521 { PREFIX_TABLE (PREFIX_MOD_3_0FC7_REG_7) }
10522 },
10523 {
10524 /* MOD_0FD7 */
10525 { Bad_Opcode },
10526 { "pmovmskb", { Gdq, MS }, 0 },
10527 },
10528 {
10529 /* MOD_0FE7_PREFIX_2 */
10530 { "movntdq", { Mx, XM }, 0 },
10531 },
10532 {
10533 /* MOD_0FF0_PREFIX_3 */
10534 { "lddqu", { XM, M }, 0 },
10535 },
10536 {
10537 /* MOD_0F382A_PREFIX_2 */
10538 { "movntdqa", { XM, Mx }, 0 },
10539 },
10540 {
10541 /* MOD_0F38F5_PREFIX_2 */
10542 { "wrussK", { M, Gdq }, PREFIX_OPCODE },
10543 },
10544 {
10545 /* MOD_0F38F6_PREFIX_0 */
10546 { "wrssK", { M, Gdq }, PREFIX_OPCODE },
10547 },
10548 {
10549 /* MOD_0F38F8_PREFIX_1 */
10550 { "enqcmds", { Gva, M }, PREFIX_OPCODE },
10551 },
10552 {
10553 /* MOD_0F38F8_PREFIX_2 */
10554 { "movdir64b", { Gva, M }, PREFIX_OPCODE },
10555 },
10556 {
10557 /* MOD_0F38F8_PREFIX_3 */
10558 { "enqcmd", { Gva, M }, PREFIX_OPCODE },
10559 },
10560 {
10561 /* MOD_0F38F9_PREFIX_0 */
10562 { "movdiri", { Em, Gv }, PREFIX_OPCODE },
10563 },
10564 {
10565 /* MOD_62_32BIT */
10566 { "bound{S|}", { Gv, Ma }, 0 },
10567 { EVEX_TABLE (EVEX_0F) },
10568 },
10569 {
10570 /* MOD_C4_32BIT */
10571 { "lesS", { Gv, Mp }, 0 },
10572 { VEX_C4_TABLE (VEX_0F) },
10573 },
10574 {
10575 /* MOD_C5_32BIT */
10576 { "ldsS", { Gv, Mp }, 0 },
10577 { VEX_C5_TABLE (VEX_0F) },
10578 },
10579 {
10580 /* MOD_VEX_0F12_PREFIX_0 */
10581 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_0) },
10582 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_1) },
10583 },
10584 {
10585 /* MOD_VEX_0F13 */
10586 { VEX_LEN_TABLE (VEX_LEN_0F13_M_0) },
10587 },
10588 {
10589 /* MOD_VEX_0F16_PREFIX_0 */
10590 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_0) },
10591 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_1) },
10592 },
10593 {
10594 /* MOD_VEX_0F17 */
10595 { VEX_LEN_TABLE (VEX_LEN_0F17_M_0) },
10596 },
10597 {
10598 /* MOD_VEX_0F2B */
10599 { "vmovntpX", { Mx, XM }, 0 },
10600 },
10601 {
10602 /* MOD_VEX_W_0_0F41_P_0_LEN_1 */
10603 { Bad_Opcode },
10604 { "kandw", { MaskG, MaskVex, MaskR }, 0 },
10605 },
10606 {
10607 /* MOD_VEX_W_1_0F41_P_0_LEN_1 */
10608 { Bad_Opcode },
10609 { "kandq", { MaskG, MaskVex, MaskR }, 0 },
10610 },
10611 {
10612 /* MOD_VEX_W_0_0F41_P_2_LEN_1 */
10613 { Bad_Opcode },
10614 { "kandb", { MaskG, MaskVex, MaskR }, 0 },
10615 },
10616 {
10617 /* MOD_VEX_W_1_0F41_P_2_LEN_1 */
10618 { Bad_Opcode },
10619 { "kandd", { MaskG, MaskVex, MaskR }, 0 },
10620 },
10621 {
10622 /* MOD_VEX_W_0_0F42_P_0_LEN_1 */
10623 { Bad_Opcode },
10624 { "kandnw", { MaskG, MaskVex, MaskR }, 0 },
10625 },
10626 {
10627 /* MOD_VEX_W_1_0F42_P_0_LEN_1 */
10628 { Bad_Opcode },
10629 { "kandnq", { MaskG, MaskVex, MaskR }, 0 },
10630 },
10631 {
10632 /* MOD_VEX_W_0_0F42_P_2_LEN_1 */
10633 { Bad_Opcode },
10634 { "kandnb", { MaskG, MaskVex, MaskR }, 0 },
10635 },
10636 {
10637 /* MOD_VEX_W_1_0F42_P_2_LEN_1 */
10638 { Bad_Opcode },
10639 { "kandnd", { MaskG, MaskVex, MaskR }, 0 },
10640 },
10641 {
10642 /* MOD_VEX_W_0_0F44_P_0_LEN_0 */
10643 { Bad_Opcode },
10644 { "knotw", { MaskG, MaskR }, 0 },
10645 },
10646 {
10647 /* MOD_VEX_W_1_0F44_P_0_LEN_0 */
10648 { Bad_Opcode },
10649 { "knotq", { MaskG, MaskR }, 0 },
10650 },
10651 {
10652 /* MOD_VEX_W_0_0F44_P_2_LEN_0 */
10653 { Bad_Opcode },
10654 { "knotb", { MaskG, MaskR }, 0 },
10655 },
10656 {
10657 /* MOD_VEX_W_1_0F44_P_2_LEN_0 */
10658 { Bad_Opcode },
10659 { "knotd", { MaskG, MaskR }, 0 },
10660 },
10661 {
10662 /* MOD_VEX_W_0_0F45_P_0_LEN_1 */
10663 { Bad_Opcode },
10664 { "korw", { MaskG, MaskVex, MaskR }, 0 },
10665 },
10666 {
10667 /* MOD_VEX_W_1_0F45_P_0_LEN_1 */
10668 { Bad_Opcode },
10669 { "korq", { MaskG, MaskVex, MaskR }, 0 },
10670 },
10671 {
10672 /* MOD_VEX_W_0_0F45_P_2_LEN_1 */
10673 { Bad_Opcode },
10674 { "korb", { MaskG, MaskVex, MaskR }, 0 },
10675 },
10676 {
10677 /* MOD_VEX_W_1_0F45_P_2_LEN_1 */
10678 { Bad_Opcode },
10679 { "kord", { MaskG, MaskVex, MaskR }, 0 },
10680 },
10681 {
10682 /* MOD_VEX_W_0_0F46_P_0_LEN_1 */
10683 { Bad_Opcode },
10684 { "kxnorw", { MaskG, MaskVex, MaskR }, 0 },
10685 },
10686 {
10687 /* MOD_VEX_W_1_0F46_P_0_LEN_1 */
10688 { Bad_Opcode },
10689 { "kxnorq", { MaskG, MaskVex, MaskR }, 0 },
10690 },
10691 {
10692 /* MOD_VEX_W_0_0F46_P_2_LEN_1 */
10693 { Bad_Opcode },
10694 { "kxnorb", { MaskG, MaskVex, MaskR }, 0 },
10695 },
10696 {
10697 /* MOD_VEX_W_1_0F46_P_2_LEN_1 */
10698 { Bad_Opcode },
10699 { "kxnord", { MaskG, MaskVex, MaskR }, 0 },
10700 },
10701 {
10702 /* MOD_VEX_W_0_0F47_P_0_LEN_1 */
10703 { Bad_Opcode },
10704 { "kxorw", { MaskG, MaskVex, MaskR }, 0 },
10705 },
10706 {
10707 /* MOD_VEX_W_1_0F47_P_0_LEN_1 */
10708 { Bad_Opcode },
10709 { "kxorq", { MaskG, MaskVex, MaskR }, 0 },
10710 },
10711 {
10712 /* MOD_VEX_W_0_0F47_P_2_LEN_1 */
10713 { Bad_Opcode },
10714 { "kxorb", { MaskG, MaskVex, MaskR }, 0 },
10715 },
10716 {
10717 /* MOD_VEX_W_1_0F47_P_2_LEN_1 */
10718 { Bad_Opcode },
10719 { "kxord", { MaskG, MaskVex, MaskR }, 0 },
10720 },
10721 {
10722 /* MOD_VEX_W_0_0F4A_P_0_LEN_1 */
10723 { Bad_Opcode },
10724 { "kaddw", { MaskG, MaskVex, MaskR }, 0 },
10725 },
10726 {
10727 /* MOD_VEX_W_1_0F4A_P_0_LEN_1 */
10728 { Bad_Opcode },
10729 { "kaddq", { MaskG, MaskVex, MaskR }, 0 },
10730 },
10731 {
10732 /* MOD_VEX_W_0_0F4A_P_2_LEN_1 */
10733 { Bad_Opcode },
10734 { "kaddb", { MaskG, MaskVex, MaskR }, 0 },
10735 },
10736 {
10737 /* MOD_VEX_W_1_0F4A_P_2_LEN_1 */
10738 { Bad_Opcode },
10739 { "kaddd", { MaskG, MaskVex, MaskR }, 0 },
10740 },
10741 {
10742 /* MOD_VEX_W_0_0F4B_P_0_LEN_1 */
10743 { Bad_Opcode },
10744 { "kunpckwd", { MaskG, MaskVex, MaskR }, 0 },
10745 },
10746 {
10747 /* MOD_VEX_W_1_0F4B_P_0_LEN_1 */
10748 { Bad_Opcode },
10749 { "kunpckdq", { MaskG, MaskVex, MaskR }, 0 },
10750 },
10751 {
10752 /* MOD_VEX_W_0_0F4B_P_2_LEN_1 */
10753 { Bad_Opcode },
10754 { "kunpckbw", { MaskG, MaskVex, MaskR }, 0 },
10755 },
10756 {
10757 /* MOD_VEX_0F50 */
10758 { Bad_Opcode },
10759 { "vmovmskpX", { Gdq, XS }, 0 },
10760 },
10761 {
10762 /* MOD_VEX_0F71_REG_2 */
10763 { Bad_Opcode },
10764 { PREFIX_TABLE (PREFIX_VEX_0F71_REG_2) },
10765 },
10766 {
10767 /* MOD_VEX_0F71_REG_4 */
10768 { Bad_Opcode },
10769 { PREFIX_TABLE (PREFIX_VEX_0F71_REG_4) },
10770 },
10771 {
10772 /* MOD_VEX_0F71_REG_6 */
10773 { Bad_Opcode },
10774 { PREFIX_TABLE (PREFIX_VEX_0F71_REG_6) },
10775 },
10776 {
10777 /* MOD_VEX_0F72_REG_2 */
10778 { Bad_Opcode },
10779 { PREFIX_TABLE (PREFIX_VEX_0F72_REG_2) },
10780 },
10781 {
10782 /* MOD_VEX_0F72_REG_4 */
10783 { Bad_Opcode },
10784 { PREFIX_TABLE (PREFIX_VEX_0F72_REG_4) },
10785 },
10786 {
10787 /* MOD_VEX_0F72_REG_6 */
10788 { Bad_Opcode },
10789 { PREFIX_TABLE (PREFIX_VEX_0F72_REG_6) },
10790 },
10791 {
10792 /* MOD_VEX_0F73_REG_2 */
10793 { Bad_Opcode },
10794 { PREFIX_TABLE (PREFIX_VEX_0F73_REG_2) },
10795 },
10796 {
10797 /* MOD_VEX_0F73_REG_3 */
10798 { Bad_Opcode },
10799 { PREFIX_TABLE (PREFIX_VEX_0F73_REG_3) },
10800 },
10801 {
10802 /* MOD_VEX_0F73_REG_6 */
10803 { Bad_Opcode },
10804 { PREFIX_TABLE (PREFIX_VEX_0F73_REG_6) },
10805 },
10806 {
10807 /* MOD_VEX_0F73_REG_7 */
10808 { Bad_Opcode },
10809 { PREFIX_TABLE (PREFIX_VEX_0F73_REG_7) },
10810 },
10811 {
10812 /* MOD_VEX_W_0_0F91_P_0_LEN_0 */
10813 { "kmovw", { Ew, MaskG }, 0 },
10814 { Bad_Opcode },
10815 },
10816 {
10817 /* MOD_VEX_W_0_0F91_P_0_LEN_0 */
10818 { "kmovq", { Eq, MaskG }, 0 },
10819 { Bad_Opcode },
10820 },
10821 {
10822 /* MOD_VEX_W_0_0F91_P_2_LEN_0 */
10823 { "kmovb", { Eb, MaskG }, 0 },
10824 { Bad_Opcode },
10825 },
10826 {
10827 /* MOD_VEX_W_0_0F91_P_2_LEN_0 */
10828 { "kmovd", { Ed, MaskG }, 0 },
10829 { Bad_Opcode },
10830 },
10831 {
10832 /* MOD_VEX_W_0_0F92_P_0_LEN_0 */
10833 { Bad_Opcode },
10834 { "kmovw", { MaskG, Rdq }, 0 },
10835 },
10836 {
10837 /* MOD_VEX_W_0_0F92_P_2_LEN_0 */
10838 { Bad_Opcode },
10839 { "kmovb", { MaskG, Rdq }, 0 },
10840 },
10841 {
10842 /* MOD_VEX_0F92_P_3_LEN_0 */
10843 { Bad_Opcode },
10844 { "kmovK", { MaskG, Rdq }, 0 },
10845 },
10846 {
10847 /* MOD_VEX_W_0_0F93_P_0_LEN_0 */
10848 { Bad_Opcode },
10849 { "kmovw", { Gdq, MaskR }, 0 },
10850 },
10851 {
10852 /* MOD_VEX_W_0_0F93_P_2_LEN_0 */
10853 { Bad_Opcode },
10854 { "kmovb", { Gdq, MaskR }, 0 },
10855 },
10856 {
10857 /* MOD_VEX_0F93_P_3_LEN_0 */
10858 { Bad_Opcode },
10859 { "kmovK", { Gdq, MaskR }, 0 },
10860 },
10861 {
10862 /* MOD_VEX_W_0_0F98_P_0_LEN_0 */
10863 { Bad_Opcode },
10864 { "kortestw", { MaskG, MaskR }, 0 },
10865 },
10866 {
10867 /* MOD_VEX_W_1_0F98_P_0_LEN_0 */
10868 { Bad_Opcode },
10869 { "kortestq", { MaskG, MaskR }, 0 },
10870 },
10871 {
10872 /* MOD_VEX_W_0_0F98_P_2_LEN_0 */
10873 { Bad_Opcode },
10874 { "kortestb", { MaskG, MaskR }, 0 },
10875 },
10876 {
10877 /* MOD_VEX_W_1_0F98_P_2_LEN_0 */
10878 { Bad_Opcode },
10879 { "kortestd", { MaskG, MaskR }, 0 },
10880 },
10881 {
10882 /* MOD_VEX_W_0_0F99_P_0_LEN_0 */
10883 { Bad_Opcode },
10884 { "ktestw", { MaskG, MaskR }, 0 },
10885 },
10886 {
10887 /* MOD_VEX_W_1_0F99_P_0_LEN_0 */
10888 { Bad_Opcode },
10889 { "ktestq", { MaskG, MaskR }, 0 },
10890 },
10891 {
10892 /* MOD_VEX_W_0_0F99_P_2_LEN_0 */
10893 { Bad_Opcode },
10894 { "ktestb", { MaskG, MaskR }, 0 },
10895 },
10896 {
10897 /* MOD_VEX_W_1_0F99_P_2_LEN_0 */
10898 { Bad_Opcode },
10899 { "ktestd", { MaskG, MaskR }, 0 },
10900 },
10901 {
10902 /* MOD_VEX_0FAE_REG_2 */
10903 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_2_M_0) },
10904 },
10905 {
10906 /* MOD_VEX_0FAE_REG_3 */
10907 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_3_M_0) },
10908 },
10909 {
10910 /* MOD_VEX_0FD7_PREFIX_2 */
10911 { Bad_Opcode },
10912 { "vpmovmskb", { Gdq, XS }, 0 },
10913 },
10914 {
10915 /* MOD_VEX_0FE7_PREFIX_2 */
10916 { "vmovntdq", { Mx, XM }, 0 },
10917 },
10918 {
10919 /* MOD_VEX_0FF0_PREFIX_3 */
10920 { "vlddqu", { XM, M }, 0 },
10921 },
10922 {
10923 /* MOD_VEX_0F381A_PREFIX_2 */
10924 { VEX_LEN_TABLE (VEX_LEN_0F381A_P_2_M_0) },
10925 },
10926 {
10927 /* MOD_VEX_0F382A_PREFIX_2 */
10928 { "vmovntdqa", { XM, Mx }, 0 },
10929 },
10930 {
10931 /* MOD_VEX_0F382C_PREFIX_2 */
10932 { VEX_W_TABLE (VEX_W_0F382C_P_2_M_0) },
10933 },
10934 {
10935 /* MOD_VEX_0F382D_PREFIX_2 */
10936 { VEX_W_TABLE (VEX_W_0F382D_P_2_M_0) },
10937 },
10938 {
10939 /* MOD_VEX_0F382E_PREFIX_2 */
10940 { VEX_W_TABLE (VEX_W_0F382E_P_2_M_0) },
10941 },
10942 {
10943 /* MOD_VEX_0F382F_PREFIX_2 */
10944 { VEX_W_TABLE (VEX_W_0F382F_P_2_M_0) },
10945 },
10946 {
10947 /* MOD_VEX_0F385A_PREFIX_2 */
10948 { VEX_LEN_TABLE (VEX_LEN_0F385A_P_2_M_0) },
10949 },
10950 {
10951 /* MOD_VEX_0F388C_PREFIX_2 */
10952 { "vpmaskmov%LW", { XM, Vex, Mx }, 0 },
10953 },
10954 {
10955 /* MOD_VEX_0F388E_PREFIX_2 */
10956 { "vpmaskmov%LW", { Mx, Vex, XM }, 0 },
10957 },
10958 {
10959 /* MOD_VEX_W_0_0F3A30_P_2_LEN_0 */
10960 { Bad_Opcode },
10961 { "kshiftrb", { MaskG, MaskR, Ib }, 0 },
10962 },
10963 {
10964 /* MOD_VEX_W_1_0F3A30_P_2_LEN_0 */
10965 { Bad_Opcode },
10966 { "kshiftrw", { MaskG, MaskR, Ib }, 0 },
10967 },
10968 {
10969 /* MOD_VEX_W_0_0F3A31_P_2_LEN_0 */
10970 { Bad_Opcode },
10971 { "kshiftrd", { MaskG, MaskR, Ib }, 0 },
10972 },
10973 {
10974 /* MOD_VEX_W_1_0F3A31_P_2_LEN_0 */
10975 { Bad_Opcode },
10976 { "kshiftrq", { MaskG, MaskR, Ib }, 0 },
10977 },
10978 {
10979 /* MOD_VEX_W_0_0F3A32_P_2_LEN_0 */
10980 { Bad_Opcode },
10981 { "kshiftlb", { MaskG, MaskR, Ib }, 0 },
10982 },
10983 {
10984 /* MOD_VEX_W_1_0F3A32_P_2_LEN_0 */
10985 { Bad_Opcode },
10986 { "kshiftlw", { MaskG, MaskR, Ib }, 0 },
10987 },
10988 {
10989 /* MOD_VEX_W_0_0F3A33_P_2_LEN_0 */
10990 { Bad_Opcode },
10991 { "kshiftld", { MaskG, MaskR, Ib }, 0 },
10992 },
10993 {
10994 /* MOD_VEX_W_1_0F3A33_P_2_LEN_0 */
10995 { Bad_Opcode },
10996 { "kshiftlq", { MaskG, MaskR, Ib }, 0 },
10997 },
10998
10999 #include "i386-dis-evex-mod.h"
11000 };
11001
11002 static const struct dis386 rm_table[][8] = {
11003 {
11004 /* RM_C6_REG_7 */
11005 { "xabort", { Skip_MODRM, Ib }, 0 },
11006 },
11007 {
11008 /* RM_C7_REG_7 */
11009 { "xbeginT", { Skip_MODRM, Jv }, 0 },
11010 },
11011 {
11012 /* RM_0F01_REG_0 */
11013 { "enclv", { Skip_MODRM }, 0 },
11014 { "vmcall", { Skip_MODRM }, 0 },
11015 { "vmlaunch", { Skip_MODRM }, 0 },
11016 { "vmresume", { Skip_MODRM }, 0 },
11017 { "vmxoff", { Skip_MODRM }, 0 },
11018 { "pconfig", { Skip_MODRM }, 0 },
11019 },
11020 {
11021 /* RM_0F01_REG_1 */
11022 { "monitor", { { OP_Monitor, 0 } }, 0 },
11023 { "mwait", { { OP_Mwait, 0 } }, 0 },
11024 { "clac", { Skip_MODRM }, 0 },
11025 { "stac", { Skip_MODRM }, 0 },
11026 { Bad_Opcode },
11027 { Bad_Opcode },
11028 { Bad_Opcode },
11029 { "encls", { Skip_MODRM }, 0 },
11030 },
11031 {
11032 /* RM_0F01_REG_2 */
11033 { "xgetbv", { Skip_MODRM }, 0 },
11034 { "xsetbv", { Skip_MODRM }, 0 },
11035 { Bad_Opcode },
11036 { Bad_Opcode },
11037 { "vmfunc", { Skip_MODRM }, 0 },
11038 { "xend", { Skip_MODRM }, 0 },
11039 { "xtest", { Skip_MODRM }, 0 },
11040 { "enclu", { Skip_MODRM }, 0 },
11041 },
11042 {
11043 /* RM_0F01_REG_3 */
11044 { "vmrun", { Skip_MODRM }, 0 },
11045 { "vmmcall", { Skip_MODRM }, 0 },
11046 { "vmload", { Skip_MODRM }, 0 },
11047 { "vmsave", { Skip_MODRM }, 0 },
11048 { "stgi", { Skip_MODRM }, 0 },
11049 { "clgi", { Skip_MODRM }, 0 },
11050 { "skinit", { Skip_MODRM }, 0 },
11051 { "invlpga", { Skip_MODRM }, 0 },
11052 },
11053 {
11054 /* RM_0F01_REG_5 */
11055 { PREFIX_TABLE (PREFIX_MOD_3_0F01_REG_5_RM_0) },
11056 { Bad_Opcode },
11057 { PREFIX_TABLE (PREFIX_MOD_3_0F01_REG_5_RM_2) },
11058 { Bad_Opcode },
11059 { Bad_Opcode },
11060 { Bad_Opcode },
11061 { "rdpkru", { Skip_MODRM }, 0 },
11062 { "wrpkru", { Skip_MODRM }, 0 },
11063 },
11064 {
11065 /* RM_0F01_REG_7 */
11066 { "swapgs", { Skip_MODRM }, 0 },
11067 { "rdtscp", { Skip_MODRM }, 0 },
11068 { "monitorx", { { OP_Monitor, 0 } }, 0 },
11069 { "mwaitx", { { OP_Mwaitx, 0 } }, 0 },
11070 { "clzero", { Skip_MODRM }, 0 },
11071 },
11072 {
11073 /* RM_0F1E_MOD_3_REG_7 */
11074 { "nopQ", { Ev }, 0 },
11075 { "nopQ", { Ev }, 0 },
11076 { "endbr64", { Skip_MODRM }, PREFIX_OPCODE },
11077 { "endbr32", { Skip_MODRM }, PREFIX_OPCODE },
11078 { "nopQ", { Ev }, 0 },
11079 { "nopQ", { Ev }, 0 },
11080 { "nopQ", { Ev }, 0 },
11081 { "nopQ", { Ev }, 0 },
11082 },
11083 {
11084 /* RM_0FAE_REG_6 */
11085 { "mfence", { Skip_MODRM }, 0 },
11086 },
11087 {
11088 /* RM_0FAE_REG_7 */
11089 { "sfence", { Skip_MODRM }, 0 },
11090
11091 },
11092 };
11093
11094 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
11095
11096 /* We use the high bit to indicate different name for the same
11097 prefix. */
11098 #define REP_PREFIX (0xf3 | 0x100)
11099 #define XACQUIRE_PREFIX (0xf2 | 0x200)
11100 #define XRELEASE_PREFIX (0xf3 | 0x400)
11101 #define BND_PREFIX (0xf2 | 0x400)
11102 #define NOTRACK_PREFIX (0x3e | 0x100)
11103
11104 static int
11105 ckprefix (void)
11106 {
11107 int newrex, i, length;
11108 rex = 0;
11109 rex_ignored = 0;
11110 prefixes = 0;
11111 used_prefixes = 0;
11112 rex_used = 0;
11113 last_lock_prefix = -1;
11114 last_repz_prefix = -1;
11115 last_repnz_prefix = -1;
11116 last_data_prefix = -1;
11117 last_addr_prefix = -1;
11118 last_rex_prefix = -1;
11119 last_seg_prefix = -1;
11120 fwait_prefix = -1;
11121 active_seg_prefix = 0;
11122 for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
11123 all_prefixes[i] = 0;
11124 i = 0;
11125 length = 0;
11126 /* The maximum instruction length is 15bytes. */
11127 while (length < MAX_CODE_LENGTH - 1)
11128 {
11129 FETCH_DATA (the_info, codep + 1);
11130 newrex = 0;
11131 switch (*codep)
11132 {
11133 /* REX prefixes family. */
11134 case 0x40:
11135 case 0x41:
11136 case 0x42:
11137 case 0x43:
11138 case 0x44:
11139 case 0x45:
11140 case 0x46:
11141 case 0x47:
11142 case 0x48:
11143 case 0x49:
11144 case 0x4a:
11145 case 0x4b:
11146 case 0x4c:
11147 case 0x4d:
11148 case 0x4e:
11149 case 0x4f:
11150 if (address_mode == mode_64bit)
11151 newrex = *codep;
11152 else
11153 return 1;
11154 last_rex_prefix = i;
11155 break;
11156 case 0xf3:
11157 prefixes |= PREFIX_REPZ;
11158 last_repz_prefix = i;
11159 break;
11160 case 0xf2:
11161 prefixes |= PREFIX_REPNZ;
11162 last_repnz_prefix = i;
11163 break;
11164 case 0xf0:
11165 prefixes |= PREFIX_LOCK;
11166 last_lock_prefix = i;
11167 break;
11168 case 0x2e:
11169 prefixes |= PREFIX_CS;
11170 last_seg_prefix = i;
11171 active_seg_prefix = PREFIX_CS;
11172 break;
11173 case 0x36:
11174 prefixes |= PREFIX_SS;
11175 last_seg_prefix = i;
11176 active_seg_prefix = PREFIX_SS;
11177 break;
11178 case 0x3e:
11179 prefixes |= PREFIX_DS;
11180 last_seg_prefix = i;
11181 active_seg_prefix = PREFIX_DS;
11182 break;
11183 case 0x26:
11184 prefixes |= PREFIX_ES;
11185 last_seg_prefix = i;
11186 active_seg_prefix = PREFIX_ES;
11187 break;
11188 case 0x64:
11189 prefixes |= PREFIX_FS;
11190 last_seg_prefix = i;
11191 active_seg_prefix = PREFIX_FS;
11192 break;
11193 case 0x65:
11194 prefixes |= PREFIX_GS;
11195 last_seg_prefix = i;
11196 active_seg_prefix = PREFIX_GS;
11197 break;
11198 case 0x66:
11199 prefixes |= PREFIX_DATA;
11200 last_data_prefix = i;
11201 break;
11202 case 0x67:
11203 prefixes |= PREFIX_ADDR;
11204 last_addr_prefix = i;
11205 break;
11206 case FWAIT_OPCODE:
11207 /* fwait is really an instruction. If there are prefixes
11208 before the fwait, they belong to the fwait, *not* to the
11209 following instruction. */
11210 fwait_prefix = i;
11211 if (prefixes || rex)
11212 {
11213 prefixes |= PREFIX_FWAIT;
11214 codep++;
11215 /* This ensures that the previous REX prefixes are noticed
11216 as unused prefixes, as in the return case below. */
11217 rex_used = rex;
11218 return 1;
11219 }
11220 prefixes = PREFIX_FWAIT;
11221 break;
11222 default:
11223 return 1;
11224 }
11225 /* Rex is ignored when followed by another prefix. */
11226 if (rex)
11227 {
11228 rex_used = rex;
11229 return 1;
11230 }
11231 if (*codep != FWAIT_OPCODE)
11232 all_prefixes[i++] = *codep;
11233 rex = newrex;
11234 codep++;
11235 length++;
11236 }
11237 return 0;
11238 }
11239
11240 /* Return the name of the prefix byte PREF, or NULL if PREF is not a
11241 prefix byte. */
11242
11243 static const char *
11244 prefix_name (int pref, int sizeflag)
11245 {
11246 static const char *rexes [16] =
11247 {
11248 "rex", /* 0x40 */
11249 "rex.B", /* 0x41 */
11250 "rex.X", /* 0x42 */
11251 "rex.XB", /* 0x43 */
11252 "rex.R", /* 0x44 */
11253 "rex.RB", /* 0x45 */
11254 "rex.RX", /* 0x46 */
11255 "rex.RXB", /* 0x47 */
11256 "rex.W", /* 0x48 */
11257 "rex.WB", /* 0x49 */
11258 "rex.WX", /* 0x4a */
11259 "rex.WXB", /* 0x4b */
11260 "rex.WR", /* 0x4c */
11261 "rex.WRB", /* 0x4d */
11262 "rex.WRX", /* 0x4e */
11263 "rex.WRXB", /* 0x4f */
11264 };
11265
11266 switch (pref)
11267 {
11268 /* REX prefixes family. */
11269 case 0x40:
11270 case 0x41:
11271 case 0x42:
11272 case 0x43:
11273 case 0x44:
11274 case 0x45:
11275 case 0x46:
11276 case 0x47:
11277 case 0x48:
11278 case 0x49:
11279 case 0x4a:
11280 case 0x4b:
11281 case 0x4c:
11282 case 0x4d:
11283 case 0x4e:
11284 case 0x4f:
11285 return rexes [pref - 0x40];
11286 case 0xf3:
11287 return "repz";
11288 case 0xf2:
11289 return "repnz";
11290 case 0xf0:
11291 return "lock";
11292 case 0x2e:
11293 return "cs";
11294 case 0x36:
11295 return "ss";
11296 case 0x3e:
11297 return "ds";
11298 case 0x26:
11299 return "es";
11300 case 0x64:
11301 return "fs";
11302 case 0x65:
11303 return "gs";
11304 case 0x66:
11305 return (sizeflag & DFLAG) ? "data16" : "data32";
11306 case 0x67:
11307 if (address_mode == mode_64bit)
11308 return (sizeflag & AFLAG) ? "addr32" : "addr64";
11309 else
11310 return (sizeflag & AFLAG) ? "addr16" : "addr32";
11311 case FWAIT_OPCODE:
11312 return "fwait";
11313 case REP_PREFIX:
11314 return "rep";
11315 case XACQUIRE_PREFIX:
11316 return "xacquire";
11317 case XRELEASE_PREFIX:
11318 return "xrelease";
11319 case BND_PREFIX:
11320 return "bnd";
11321 case NOTRACK_PREFIX:
11322 return "notrack";
11323 default:
11324 return NULL;
11325 }
11326 }
11327
11328 static char op_out[MAX_OPERANDS][100];
11329 static int op_ad, op_index[MAX_OPERANDS];
11330 static int two_source_ops;
11331 static bfd_vma op_address[MAX_OPERANDS];
11332 static bfd_vma op_riprel[MAX_OPERANDS];
11333 static bfd_vma start_pc;
11334
11335 /*
11336 * On the 386's of 1988, the maximum length of an instruction is 15 bytes.
11337 * (see topic "Redundant prefixes" in the "Differences from 8086"
11338 * section of the "Virtual 8086 Mode" chapter.)
11339 * 'pc' should be the address of this instruction, it will
11340 * be used to print the target address if this is a relative jump or call
11341 * The function returns the length of this instruction in bytes.
11342 */
11343
11344 static char intel_syntax;
11345 static char intel_mnemonic = !SYSV386_COMPAT;
11346 static char open_char;
11347 static char close_char;
11348 static char separator_char;
11349 static char scale_char;
11350
11351 enum x86_64_isa
11352 {
11353 amd64 = 0,
11354 intel64
11355 };
11356
11357 static enum x86_64_isa isa64;
11358
11359 /* Here for backwards compatibility. When gdb stops using
11360 print_insn_i386_att and print_insn_i386_intel these functions can
11361 disappear, and print_insn_i386 be merged into print_insn. */
11362 int
11363 print_insn_i386_att (bfd_vma pc, disassemble_info *info)
11364 {
11365 intel_syntax = 0;
11366
11367 return print_insn (pc, info);
11368 }
11369
11370 int
11371 print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
11372 {
11373 intel_syntax = 1;
11374
11375 return print_insn (pc, info);
11376 }
11377
11378 int
11379 print_insn_i386 (bfd_vma pc, disassemble_info *info)
11380 {
11381 intel_syntax = -1;
11382
11383 return print_insn (pc, info);
11384 }
11385
11386 void
11387 print_i386_disassembler_options (FILE *stream)
11388 {
11389 fprintf (stream, _("\n\
11390 The following i386/x86-64 specific disassembler options are supported for use\n\
11391 with the -M switch (multiple options should be separated by commas):\n"));
11392
11393 fprintf (stream, _(" x86-64 Disassemble in 64bit mode\n"));
11394 fprintf (stream, _(" i386 Disassemble in 32bit mode\n"));
11395 fprintf (stream, _(" i8086 Disassemble in 16bit mode\n"));
11396 fprintf (stream, _(" att Display instruction in AT&T syntax\n"));
11397 fprintf (stream, _(" intel Display instruction in Intel syntax\n"));
11398 fprintf (stream, _(" att-mnemonic\n"
11399 " Display instruction in AT&T mnemonic\n"));
11400 fprintf (stream, _(" intel-mnemonic\n"
11401 " Display instruction in Intel mnemonic\n"));
11402 fprintf (stream, _(" addr64 Assume 64bit address size\n"));
11403 fprintf (stream, _(" addr32 Assume 32bit address size\n"));
11404 fprintf (stream, _(" addr16 Assume 16bit address size\n"));
11405 fprintf (stream, _(" data32 Assume 32bit data size\n"));
11406 fprintf (stream, _(" data16 Assume 16bit data size\n"));
11407 fprintf (stream, _(" suffix Always display instruction suffix in AT&T syntax\n"));
11408 fprintf (stream, _(" amd64 Display instruction in AMD64 ISA\n"));
11409 fprintf (stream, _(" intel64 Display instruction in Intel64 ISA\n"));
11410 }
11411
11412 /* Bad opcode. */
11413 static const struct dis386 bad_opcode = { "(bad)", { XX }, 0 };
11414
11415 /* Get a pointer to struct dis386 with a valid name. */
11416
11417 static const struct dis386 *
11418 get_valid_dis386 (const struct dis386 *dp, disassemble_info *info)
11419 {
11420 int vindex, vex_table_index;
11421
11422 if (dp->name != NULL)
11423 return dp;
11424
11425 switch (dp->op[0].bytemode)
11426 {
11427 case USE_REG_TABLE:
11428 dp = &reg_table[dp->op[1].bytemode][modrm.reg];
11429 break;
11430
11431 case USE_MOD_TABLE:
11432 vindex = modrm.mod == 0x3 ? 1 : 0;
11433 dp = &mod_table[dp->op[1].bytemode][vindex];
11434 break;
11435
11436 case USE_RM_TABLE:
11437 dp = &rm_table[dp->op[1].bytemode][modrm.rm];
11438 break;
11439
11440 case USE_PREFIX_TABLE:
11441 if (need_vex)
11442 {
11443 /* The prefix in VEX is implicit. */
11444 switch (vex.prefix)
11445 {
11446 case 0:
11447 vindex = 0;
11448 break;
11449 case REPE_PREFIX_OPCODE:
11450 vindex = 1;
11451 break;
11452 case DATA_PREFIX_OPCODE:
11453 vindex = 2;
11454 break;
11455 case REPNE_PREFIX_OPCODE:
11456 vindex = 3;
11457 break;
11458 default:
11459 abort ();
11460 break;
11461 }
11462 }
11463 else
11464 {
11465 int last_prefix = -1;
11466 int prefix = 0;
11467 vindex = 0;
11468 /* We check PREFIX_REPNZ and PREFIX_REPZ before PREFIX_DATA.
11469 When there are multiple PREFIX_REPNZ and PREFIX_REPZ, the
11470 last one wins. */
11471 if ((prefixes & (PREFIX_REPZ | PREFIX_REPNZ)) != 0)
11472 {
11473 if (last_repz_prefix > last_repnz_prefix)
11474 {
11475 vindex = 1;
11476 prefix = PREFIX_REPZ;
11477 last_prefix = last_repz_prefix;
11478 }
11479 else
11480 {
11481 vindex = 3;
11482 prefix = PREFIX_REPNZ;
11483 last_prefix = last_repnz_prefix;
11484 }
11485
11486 /* Check if prefix should be ignored. */
11487 if ((((prefix_table[dp->op[1].bytemode][vindex].prefix_requirement
11488 & PREFIX_IGNORED) >> PREFIX_IGNORED_SHIFT)
11489 & prefix) != 0)
11490 vindex = 0;
11491 }
11492
11493 if (vindex == 0 && (prefixes & PREFIX_DATA) != 0)
11494 {
11495 vindex = 2;
11496 prefix = PREFIX_DATA;
11497 last_prefix = last_data_prefix;
11498 }
11499
11500 if (vindex != 0)
11501 {
11502 used_prefixes |= prefix;
11503 all_prefixes[last_prefix] = 0;
11504 }
11505 }
11506 dp = &prefix_table[dp->op[1].bytemode][vindex];
11507 break;
11508
11509 case USE_X86_64_TABLE:
11510 vindex = address_mode == mode_64bit ? 1 : 0;
11511 dp = &x86_64_table[dp->op[1].bytemode][vindex];
11512 break;
11513
11514 case USE_3BYTE_TABLE:
11515 FETCH_DATA (info, codep + 2);
11516 vindex = *codep++;
11517 dp = &three_byte_table[dp->op[1].bytemode][vindex];
11518 end_codep = codep;
11519 modrm.mod = (*codep >> 6) & 3;
11520 modrm.reg = (*codep >> 3) & 7;
11521 modrm.rm = *codep & 7;
11522 break;
11523
11524 case USE_VEX_LEN_TABLE:
11525 if (!need_vex)
11526 abort ();
11527
11528 switch (vex.length)
11529 {
11530 case 128:
11531 vindex = 0;
11532 break;
11533 case 256:
11534 vindex = 1;
11535 break;
11536 default:
11537 abort ();
11538 break;
11539 }
11540
11541 dp = &vex_len_table[dp->op[1].bytemode][vindex];
11542 break;
11543
11544 case USE_EVEX_LEN_TABLE:
11545 if (!vex.evex)
11546 abort ();
11547
11548 switch (vex.length)
11549 {
11550 case 128:
11551 vindex = 0;
11552 break;
11553 case 256:
11554 vindex = 1;
11555 break;
11556 case 512:
11557 vindex = 2;
11558 break;
11559 default:
11560 abort ();
11561 break;
11562 }
11563
11564 dp = &evex_len_table[dp->op[1].bytemode][vindex];
11565 break;
11566
11567 case USE_XOP_8F_TABLE:
11568 FETCH_DATA (info, codep + 3);
11569 /* All bits in the REX prefix are ignored. */
11570 rex_ignored = rex;
11571 rex = ~(*codep >> 5) & 0x7;
11572
11573 /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm". */
11574 switch ((*codep & 0x1f))
11575 {
11576 default:
11577 dp = &bad_opcode;
11578 return dp;
11579 case 0x8:
11580 vex_table_index = XOP_08;
11581 break;
11582 case 0x9:
11583 vex_table_index = XOP_09;
11584 break;
11585 case 0xa:
11586 vex_table_index = XOP_0A;
11587 break;
11588 }
11589 codep++;
11590 vex.w = *codep & 0x80;
11591 if (vex.w && address_mode == mode_64bit)
11592 rex |= REX_W;
11593
11594 vex.register_specifier = (~(*codep >> 3)) & 0xf;
11595 if (address_mode != mode_64bit)
11596 {
11597 /* In 16/32-bit mode REX_B is silently ignored. */
11598 rex &= ~REX_B;
11599 }
11600
11601 vex.length = (*codep & 0x4) ? 256 : 128;
11602 switch ((*codep & 0x3))
11603 {
11604 case 0:
11605 break;
11606 case 1:
11607 vex.prefix = DATA_PREFIX_OPCODE;
11608 break;
11609 case 2:
11610 vex.prefix = REPE_PREFIX_OPCODE;
11611 break;
11612 case 3:
11613 vex.prefix = REPNE_PREFIX_OPCODE;
11614 break;
11615 }
11616 need_vex = 1;
11617 need_vex_reg = 1;
11618 codep++;
11619 vindex = *codep++;
11620 dp = &xop_table[vex_table_index][vindex];
11621
11622 end_codep = codep;
11623 FETCH_DATA (info, codep + 1);
11624 modrm.mod = (*codep >> 6) & 3;
11625 modrm.reg = (*codep >> 3) & 7;
11626 modrm.rm = *codep & 7;
11627 break;
11628
11629 case USE_VEX_C4_TABLE:
11630 /* VEX prefix. */
11631 FETCH_DATA (info, codep + 3);
11632 /* All bits in the REX prefix are ignored. */
11633 rex_ignored = rex;
11634 rex = ~(*codep >> 5) & 0x7;
11635 switch ((*codep & 0x1f))
11636 {
11637 default:
11638 dp = &bad_opcode;
11639 return dp;
11640 case 0x1:
11641 vex_table_index = VEX_0F;
11642 break;
11643 case 0x2:
11644 vex_table_index = VEX_0F38;
11645 break;
11646 case 0x3:
11647 vex_table_index = VEX_0F3A;
11648 break;
11649 }
11650 codep++;
11651 vex.w = *codep & 0x80;
11652 if (address_mode == mode_64bit)
11653 {
11654 if (vex.w)
11655 rex |= REX_W;
11656 }
11657 else
11658 {
11659 /* For the 3-byte VEX prefix in 32-bit mode, the REX_B bit
11660 is ignored, other REX bits are 0 and the highest bit in
11661 VEX.vvvv is also ignored (but we mustn't clear it here). */
11662 rex = 0;
11663 }
11664 vex.register_specifier = (~(*codep >> 3)) & 0xf;
11665 vex.length = (*codep & 0x4) ? 256 : 128;
11666 switch ((*codep & 0x3))
11667 {
11668 case 0:
11669 break;
11670 case 1:
11671 vex.prefix = DATA_PREFIX_OPCODE;
11672 break;
11673 case 2:
11674 vex.prefix = REPE_PREFIX_OPCODE;
11675 break;
11676 case 3:
11677 vex.prefix = REPNE_PREFIX_OPCODE;
11678 break;
11679 }
11680 need_vex = 1;
11681 need_vex_reg = 1;
11682 codep++;
11683 vindex = *codep++;
11684 dp = &vex_table[vex_table_index][vindex];
11685 end_codep = codep;
11686 /* There is no MODRM byte for VEX0F 77. */
11687 if (vex_table_index != VEX_0F || vindex != 0x77)
11688 {
11689 FETCH_DATA (info, codep + 1);
11690 modrm.mod = (*codep >> 6) & 3;
11691 modrm.reg = (*codep >> 3) & 7;
11692 modrm.rm = *codep & 7;
11693 }
11694 break;
11695
11696 case USE_VEX_C5_TABLE:
11697 /* VEX prefix. */
11698 FETCH_DATA (info, codep + 2);
11699 /* All bits in the REX prefix are ignored. */
11700 rex_ignored = rex;
11701 rex = (*codep & 0x80) ? 0 : REX_R;
11702
11703 /* For the 2-byte VEX prefix in 32-bit mode, the highest bit in
11704 VEX.vvvv is 1. */
11705 vex.register_specifier = (~(*codep >> 3)) & 0xf;
11706 vex.length = (*codep & 0x4) ? 256 : 128;
11707 switch ((*codep & 0x3))
11708 {
11709 case 0:
11710 break;
11711 case 1:
11712 vex.prefix = DATA_PREFIX_OPCODE;
11713 break;
11714 case 2:
11715 vex.prefix = REPE_PREFIX_OPCODE;
11716 break;
11717 case 3:
11718 vex.prefix = REPNE_PREFIX_OPCODE;
11719 break;
11720 }
11721 need_vex = 1;
11722 need_vex_reg = 1;
11723 codep++;
11724 vindex = *codep++;
11725 dp = &vex_table[dp->op[1].bytemode][vindex];
11726 end_codep = codep;
11727 /* There is no MODRM byte for VEX 77. */
11728 if (vindex != 0x77)
11729 {
11730 FETCH_DATA (info, codep + 1);
11731 modrm.mod = (*codep >> 6) & 3;
11732 modrm.reg = (*codep >> 3) & 7;
11733 modrm.rm = *codep & 7;
11734 }
11735 break;
11736
11737 case USE_VEX_W_TABLE:
11738 if (!need_vex)
11739 abort ();
11740
11741 dp = &vex_w_table[dp->op[1].bytemode][vex.w ? 1 : 0];
11742 break;
11743
11744 case USE_EVEX_TABLE:
11745 two_source_ops = 0;
11746 /* EVEX prefix. */
11747 vex.evex = 1;
11748 FETCH_DATA (info, codep + 4);
11749 /* All bits in the REX prefix are ignored. */
11750 rex_ignored = rex;
11751 /* The first byte after 0x62. */
11752 rex = ~(*codep >> 5) & 0x7;
11753 vex.r = *codep & 0x10;
11754 switch ((*codep & 0xf))
11755 {
11756 default:
11757 return &bad_opcode;
11758 case 0x1:
11759 vex_table_index = EVEX_0F;
11760 break;
11761 case 0x2:
11762 vex_table_index = EVEX_0F38;
11763 break;
11764 case 0x3:
11765 vex_table_index = EVEX_0F3A;
11766 break;
11767 }
11768
11769 /* The second byte after 0x62. */
11770 codep++;
11771 vex.w = *codep & 0x80;
11772 if (vex.w && address_mode == mode_64bit)
11773 rex |= REX_W;
11774
11775 vex.register_specifier = (~(*codep >> 3)) & 0xf;
11776
11777 /* The U bit. */
11778 if (!(*codep & 0x4))
11779 return &bad_opcode;
11780
11781 switch ((*codep & 0x3))
11782 {
11783 case 0:
11784 break;
11785 case 1:
11786 vex.prefix = DATA_PREFIX_OPCODE;
11787 break;
11788 case 2:
11789 vex.prefix = REPE_PREFIX_OPCODE;
11790 break;
11791 case 3:
11792 vex.prefix = REPNE_PREFIX_OPCODE;
11793 break;
11794 }
11795
11796 /* The third byte after 0x62. */
11797 codep++;
11798
11799 /* Remember the static rounding bits. */
11800 vex.ll = (*codep >> 5) & 3;
11801 vex.b = (*codep & 0x10) != 0;
11802
11803 vex.v = *codep & 0x8;
11804 vex.mask_register_specifier = *codep & 0x7;
11805 vex.zeroing = *codep & 0x80;
11806
11807 if (address_mode != mode_64bit)
11808 {
11809 /* In 16/32-bit mode silently ignore following bits. */
11810 rex &= ~REX_B;
11811 vex.r = 1;
11812 vex.v = 1;
11813 }
11814
11815 need_vex = 1;
11816 need_vex_reg = 1;
11817 codep++;
11818 vindex = *codep++;
11819 dp = &evex_table[vex_table_index][vindex];
11820 end_codep = codep;
11821 FETCH_DATA (info, codep + 1);
11822 modrm.mod = (*codep >> 6) & 3;
11823 modrm.reg = (*codep >> 3) & 7;
11824 modrm.rm = *codep & 7;
11825
11826 /* Set vector length. */
11827 if (modrm.mod == 3 && vex.b)
11828 vex.length = 512;
11829 else
11830 {
11831 switch (vex.ll)
11832 {
11833 case 0x0:
11834 vex.length = 128;
11835 break;
11836 case 0x1:
11837 vex.length = 256;
11838 break;
11839 case 0x2:
11840 vex.length = 512;
11841 break;
11842 default:
11843 return &bad_opcode;
11844 }
11845 }
11846 break;
11847
11848 case 0:
11849 dp = &bad_opcode;
11850 break;
11851
11852 default:
11853 abort ();
11854 }
11855
11856 if (dp->name != NULL)
11857 return dp;
11858 else
11859 return get_valid_dis386 (dp, info);
11860 }
11861
11862 static void
11863 get_sib (disassemble_info *info, int sizeflag)
11864 {
11865 /* If modrm.mod == 3, operand must be register. */
11866 if (need_modrm
11867 && ((sizeflag & AFLAG) || address_mode == mode_64bit)
11868 && modrm.mod != 3
11869 && modrm.rm == 4)
11870 {
11871 FETCH_DATA (info, codep + 2);
11872 sib.index = (codep [1] >> 3) & 7;
11873 sib.scale = (codep [1] >> 6) & 3;
11874 sib.base = codep [1] & 7;
11875 }
11876 }
11877
11878 static int
11879 print_insn (bfd_vma pc, disassemble_info *info)
11880 {
11881 const struct dis386 *dp;
11882 int i;
11883 char *op_txt[MAX_OPERANDS];
11884 int needcomma;
11885 int sizeflag, orig_sizeflag;
11886 const char *p;
11887 struct dis_private priv;
11888 int prefix_length;
11889
11890 priv.orig_sizeflag = AFLAG | DFLAG;
11891 if ((info->mach & bfd_mach_i386_i386) != 0)
11892 address_mode = mode_32bit;
11893 else if (info->mach == bfd_mach_i386_i8086)
11894 {
11895 address_mode = mode_16bit;
11896 priv.orig_sizeflag = 0;
11897 }
11898 else
11899 address_mode = mode_64bit;
11900
11901 if (intel_syntax == (char) -1)
11902 intel_syntax = (info->mach & bfd_mach_i386_intel_syntax) != 0;
11903
11904 for (p = info->disassembler_options; p != NULL; )
11905 {
11906 if (CONST_STRNEQ (p, "amd64"))
11907 isa64 = amd64;
11908 else if (CONST_STRNEQ (p, "intel64"))
11909 isa64 = intel64;
11910 else if (CONST_STRNEQ (p, "x86-64"))
11911 {
11912 address_mode = mode_64bit;
11913 priv.orig_sizeflag = AFLAG | DFLAG;
11914 }
11915 else if (CONST_STRNEQ (p, "i386"))
11916 {
11917 address_mode = mode_32bit;
11918 priv.orig_sizeflag = AFLAG | DFLAG;
11919 }
11920 else if (CONST_STRNEQ (p, "i8086"))
11921 {
11922 address_mode = mode_16bit;
11923 priv.orig_sizeflag = 0;
11924 }
11925 else if (CONST_STRNEQ (p, "intel"))
11926 {
11927 intel_syntax = 1;
11928 if (CONST_STRNEQ (p + 5, "-mnemonic"))
11929 intel_mnemonic = 1;
11930 }
11931 else if (CONST_STRNEQ (p, "att"))
11932 {
11933 intel_syntax = 0;
11934 if (CONST_STRNEQ (p + 3, "-mnemonic"))
11935 intel_mnemonic = 0;
11936 }
11937 else if (CONST_STRNEQ (p, "addr"))
11938 {
11939 if (address_mode == mode_64bit)
11940 {
11941 if (p[4] == '3' && p[5] == '2')
11942 priv.orig_sizeflag &= ~AFLAG;
11943 else if (p[4] == '6' && p[5] == '4')
11944 priv.orig_sizeflag |= AFLAG;
11945 }
11946 else
11947 {
11948 if (p[4] == '1' && p[5] == '6')
11949 priv.orig_sizeflag &= ~AFLAG;
11950 else if (p[4] == '3' && p[5] == '2')
11951 priv.orig_sizeflag |= AFLAG;
11952 }
11953 }
11954 else if (CONST_STRNEQ (p, "data"))
11955 {
11956 if (p[4] == '1' && p[5] == '6')
11957 priv.orig_sizeflag &= ~DFLAG;
11958 else if (p[4] == '3' && p[5] == '2')
11959 priv.orig_sizeflag |= DFLAG;
11960 }
11961 else if (CONST_STRNEQ (p, "suffix"))
11962 priv.orig_sizeflag |= SUFFIX_ALWAYS;
11963
11964 p = strchr (p, ',');
11965 if (p != NULL)
11966 p++;
11967 }
11968
11969 if (address_mode == mode_64bit && sizeof (bfd_vma) < 8)
11970 {
11971 (*info->fprintf_func) (info->stream,
11972 _("64-bit address is disabled"));
11973 return -1;
11974 }
11975
11976 if (intel_syntax)
11977 {
11978 names64 = intel_names64;
11979 names32 = intel_names32;
11980 names16 = intel_names16;
11981 names8 = intel_names8;
11982 names8rex = intel_names8rex;
11983 names_seg = intel_names_seg;
11984 names_mm = intel_names_mm;
11985 names_bnd = intel_names_bnd;
11986 names_xmm = intel_names_xmm;
11987 names_ymm = intel_names_ymm;
11988 names_zmm = intel_names_zmm;
11989 index64 = intel_index64;
11990 index32 = intel_index32;
11991 names_mask = intel_names_mask;
11992 index16 = intel_index16;
11993 open_char = '[';
11994 close_char = ']';
11995 separator_char = '+';
11996 scale_char = '*';
11997 }
11998 else
11999 {
12000 names64 = att_names64;
12001 names32 = att_names32;
12002 names16 = att_names16;
12003 names8 = att_names8;
12004 names8rex = att_names8rex;
12005 names_seg = att_names_seg;
12006 names_mm = att_names_mm;
12007 names_bnd = att_names_bnd;
12008 names_xmm = att_names_xmm;
12009 names_ymm = att_names_ymm;
12010 names_zmm = att_names_zmm;
12011 index64 = att_index64;
12012 index32 = att_index32;
12013 names_mask = att_names_mask;
12014 index16 = att_index16;
12015 open_char = '(';
12016 close_char = ')';
12017 separator_char = ',';
12018 scale_char = ',';
12019 }
12020
12021 /* The output looks better if we put 7 bytes on a line, since that
12022 puts most long word instructions on a single line. Use 8 bytes
12023 for Intel L1OM. */
12024 if ((info->mach & bfd_mach_l1om) != 0)
12025 info->bytes_per_line = 8;
12026 else
12027 info->bytes_per_line = 7;
12028
12029 info->private_data = &priv;
12030 priv.max_fetched = priv.the_buffer;
12031 priv.insn_start = pc;
12032
12033 obuf[0] = 0;
12034 for (i = 0; i < MAX_OPERANDS; ++i)
12035 {
12036 op_out[i][0] = 0;
12037 op_index[i] = -1;
12038 }
12039
12040 the_info = info;
12041 start_pc = pc;
12042 start_codep = priv.the_buffer;
12043 codep = priv.the_buffer;
12044
12045 if (OPCODES_SIGSETJMP (priv.bailout) != 0)
12046 {
12047 const char *name;
12048
12049 /* Getting here means we tried for data but didn't get it. That
12050 means we have an incomplete instruction of some sort. Just
12051 print the first byte as a prefix or a .byte pseudo-op. */
12052 if (codep > priv.the_buffer)
12053 {
12054 name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
12055 if (name != NULL)
12056 (*info->fprintf_func) (info->stream, "%s", name);
12057 else
12058 {
12059 /* Just print the first byte as a .byte instruction. */
12060 (*info->fprintf_func) (info->stream, ".byte 0x%x",
12061 (unsigned int) priv.the_buffer[0]);
12062 }
12063
12064 return 1;
12065 }
12066
12067 return -1;
12068 }
12069
12070 obufp = obuf;
12071 sizeflag = priv.orig_sizeflag;
12072
12073 if (!ckprefix () || rex_used)
12074 {
12075 /* Too many prefixes or unused REX prefixes. */
12076 for (i = 0;
12077 i < (int) ARRAY_SIZE (all_prefixes) && all_prefixes[i];
12078 i++)
12079 (*info->fprintf_func) (info->stream, "%s%s",
12080 i == 0 ? "" : " ",
12081 prefix_name (all_prefixes[i], sizeflag));
12082 return i;
12083 }
12084
12085 insn_codep = codep;
12086
12087 FETCH_DATA (info, codep + 1);
12088 two_source_ops = (*codep == 0x62) || (*codep == 0xc8);
12089
12090 if (((prefixes & PREFIX_FWAIT)
12091 && ((*codep < 0xd8) || (*codep > 0xdf))))
12092 {
12093 /* Handle prefixes before fwait. */
12094 for (i = 0; i < fwait_prefix && all_prefixes[i];
12095 i++)
12096 (*info->fprintf_func) (info->stream, "%s ",
12097 prefix_name (all_prefixes[i], sizeflag));
12098 (*info->fprintf_func) (info->stream, "fwait");
12099 return i + 1;
12100 }
12101
12102 if (*codep == 0x0f)
12103 {
12104 unsigned char threebyte;
12105
12106 codep++;
12107 FETCH_DATA (info, codep + 1);
12108 threebyte = *codep;
12109 dp = &dis386_twobyte[threebyte];
12110 need_modrm = twobyte_has_modrm[*codep];
12111 codep++;
12112 }
12113 else
12114 {
12115 dp = &dis386[*codep];
12116 need_modrm = onebyte_has_modrm[*codep];
12117 codep++;
12118 }
12119
12120 /* Save sizeflag for printing the extra prefixes later before updating
12121 it for mnemonic and operand processing. The prefix names depend
12122 only on the address mode. */
12123 orig_sizeflag = sizeflag;
12124 if (prefixes & PREFIX_ADDR)
12125 sizeflag ^= AFLAG;
12126 if ((prefixes & PREFIX_DATA))
12127 sizeflag ^= DFLAG;
12128
12129 end_codep = codep;
12130 if (need_modrm)
12131 {
12132 FETCH_DATA (info, codep + 1);
12133 modrm.mod = (*codep >> 6) & 3;
12134 modrm.reg = (*codep >> 3) & 7;
12135 modrm.rm = *codep & 7;
12136 }
12137
12138 need_vex = 0;
12139 need_vex_reg = 0;
12140 vex_w_done = 0;
12141 memset (&vex, 0, sizeof (vex));
12142
12143 if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
12144 {
12145 get_sib (info, sizeflag);
12146 dofloat (sizeflag);
12147 }
12148 else
12149 {
12150 dp = get_valid_dis386 (dp, info);
12151 if (dp != NULL && putop (dp->name, sizeflag) == 0)
12152 {
12153 get_sib (info, sizeflag);
12154 for (i = 0; i < MAX_OPERANDS; ++i)
12155 {
12156 obufp = op_out[i];
12157 op_ad = MAX_OPERANDS - 1 - i;
12158 if (dp->op[i].rtn)
12159 (*dp->op[i].rtn) (dp->op[i].bytemode, sizeflag);
12160 /* For EVEX instruction after the last operand masking
12161 should be printed. */
12162 if (i == 0 && vex.evex)
12163 {
12164 /* Don't print {%k0}. */
12165 if (vex.mask_register_specifier)
12166 {
12167 oappend ("{");
12168 oappend (names_mask[vex.mask_register_specifier]);
12169 oappend ("}");
12170 }
12171 if (vex.zeroing)
12172 oappend ("{z}");
12173 }
12174 }
12175 }
12176 }
12177
12178 /* If VEX.vvvv and EVEX.vvvv are unused, they must be all 1s, which
12179 are all 0s in inverted form. */
12180 if (need_vex && vex.register_specifier != 0)
12181 {
12182 (*info->fprintf_func) (info->stream, "(bad)");
12183 return end_codep - priv.the_buffer;
12184 }
12185
12186 /* Check if the REX prefix is used. */
12187 if (rex_ignored == 0 && (rex ^ rex_used) == 0 && last_rex_prefix >= 0)
12188 all_prefixes[last_rex_prefix] = 0;
12189
12190 /* Check if the SEG prefix is used. */
12191 if ((prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS | PREFIX_ES
12192 | PREFIX_FS | PREFIX_GS)) != 0
12193 && (used_prefixes & active_seg_prefix) != 0)
12194 all_prefixes[last_seg_prefix] = 0;
12195
12196 /* Check if the ADDR prefix is used. */
12197 if ((prefixes & PREFIX_ADDR) != 0
12198 && (used_prefixes & PREFIX_ADDR) != 0)
12199 all_prefixes[last_addr_prefix] = 0;
12200
12201 /* Check if the DATA prefix is used. */
12202 if ((prefixes & PREFIX_DATA) != 0
12203 && (used_prefixes & PREFIX_DATA) != 0)
12204 all_prefixes[last_data_prefix] = 0;
12205
12206 /* Print the extra prefixes. */
12207 prefix_length = 0;
12208 for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
12209 if (all_prefixes[i])
12210 {
12211 const char *name;
12212 name = prefix_name (all_prefixes[i], orig_sizeflag);
12213 if (name == NULL)
12214 abort ();
12215 prefix_length += strlen (name) + 1;
12216 (*info->fprintf_func) (info->stream, "%s ", name);
12217 }
12218
12219 /* If the mandatory PREFIX_REPZ/PREFIX_REPNZ/PREFIX_DATA prefix is
12220 unused, opcode is invalid. Since the PREFIX_DATA prefix may be
12221 used by putop and MMX/SSE operand and may be overriden by the
12222 PREFIX_REPZ/PREFIX_REPNZ fix, we check the PREFIX_DATA prefix
12223 separately. */
12224 if (dp->prefix_requirement == PREFIX_OPCODE
12225 && dp != &bad_opcode
12226 && (((prefixes
12227 & (PREFIX_REPZ | PREFIX_REPNZ)) != 0
12228 && (used_prefixes
12229 & (PREFIX_REPZ | PREFIX_REPNZ)) == 0)
12230 || ((((prefixes
12231 & (PREFIX_REPZ | PREFIX_REPNZ | PREFIX_DATA))
12232 == PREFIX_DATA)
12233 && (used_prefixes & PREFIX_DATA) == 0))))
12234 {
12235 (*info->fprintf_func) (info->stream, "(bad)");
12236 return end_codep - priv.the_buffer;
12237 }
12238
12239 /* Check maximum code length. */
12240 if ((codep - start_codep) > MAX_CODE_LENGTH)
12241 {
12242 (*info->fprintf_func) (info->stream, "(bad)");
12243 return MAX_CODE_LENGTH;
12244 }
12245
12246 obufp = mnemonicendp;
12247 for (i = strlen (obuf) + prefix_length; i < 6; i++)
12248 oappend (" ");
12249 oappend (" ");
12250 (*info->fprintf_func) (info->stream, "%s", obuf);
12251
12252 /* The enter and bound instructions are printed with operands in the same
12253 order as the intel book; everything else is printed in reverse order. */
12254 if (intel_syntax || two_source_ops)
12255 {
12256 bfd_vma riprel;
12257
12258 for (i = 0; i < MAX_OPERANDS; ++i)
12259 op_txt[i] = op_out[i];
12260
12261 if (intel_syntax && dp && dp->op[2].rtn == OP_Rounding
12262 && dp->op[3].rtn == OP_E && dp->op[4].rtn == NULL)
12263 {
12264 op_txt[2] = op_out[3];
12265 op_txt[3] = op_out[2];
12266 }
12267
12268 for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
12269 {
12270 op_ad = op_index[i];
12271 op_index[i] = op_index[MAX_OPERANDS - 1 - i];
12272 op_index[MAX_OPERANDS - 1 - i] = op_ad;
12273 riprel = op_riprel[i];
12274 op_riprel[i] = op_riprel [MAX_OPERANDS - 1 - i];
12275 op_riprel[MAX_OPERANDS - 1 - i] = riprel;
12276 }
12277 }
12278 else
12279 {
12280 for (i = 0; i < MAX_OPERANDS; ++i)
12281 op_txt[MAX_OPERANDS - 1 - i] = op_out[i];
12282 }
12283
12284 needcomma = 0;
12285 for (i = 0; i < MAX_OPERANDS; ++i)
12286 if (*op_txt[i])
12287 {
12288 if (needcomma)
12289 (*info->fprintf_func) (info->stream, ",");
12290 if (op_index[i] != -1 && !op_riprel[i])
12291 (*info->print_address_func) ((bfd_vma) op_address[op_index[i]], info);
12292 else
12293 (*info->fprintf_func) (info->stream, "%s", op_txt[i]);
12294 needcomma = 1;
12295 }
12296
12297 for (i = 0; i < MAX_OPERANDS; i++)
12298 if (op_index[i] != -1 && op_riprel[i])
12299 {
12300 (*info->fprintf_func) (info->stream, " # ");
12301 (*info->print_address_func) ((bfd_vma) (start_pc + (codep - start_codep)
12302 + op_address[op_index[i]]), info);
12303 break;
12304 }
12305 return codep - priv.the_buffer;
12306 }
12307
12308 static const char *float_mem[] = {
12309 /* d8 */
12310 "fadd{s|}",
12311 "fmul{s|}",
12312 "fcom{s|}",
12313 "fcomp{s|}",
12314 "fsub{s|}",
12315 "fsubr{s|}",
12316 "fdiv{s|}",
12317 "fdivr{s|}",
12318 /* d9 */
12319 "fld{s|}",
12320 "(bad)",
12321 "fst{s|}",
12322 "fstp{s|}",
12323 "fldenvIC",
12324 "fldcw",
12325 "fNstenvIC",
12326 "fNstcw",
12327 /* da */
12328 "fiadd{l|}",
12329 "fimul{l|}",
12330 "ficom{l|}",
12331 "ficomp{l|}",
12332 "fisub{l|}",
12333 "fisubr{l|}",
12334 "fidiv{l|}",
12335 "fidivr{l|}",
12336 /* db */
12337 "fild{l|}",
12338 "fisttp{l|}",
12339 "fist{l|}",
12340 "fistp{l|}",
12341 "(bad)",
12342 "fld{t||t|}",
12343 "(bad)",
12344 "fstp{t||t|}",
12345 /* dc */
12346 "fadd{l|}",
12347 "fmul{l|}",
12348 "fcom{l|}",
12349 "fcomp{l|}",
12350 "fsub{l|}",
12351 "fsubr{l|}",
12352 "fdiv{l|}",
12353 "fdivr{l|}",
12354 /* dd */
12355 "fld{l|}",
12356 "fisttp{ll|}",
12357 "fst{l||}",
12358 "fstp{l|}",
12359 "frstorIC",
12360 "(bad)",
12361 "fNsaveIC",
12362 "fNstsw",
12363 /* de */
12364 "fiadd{s|}",
12365 "fimul{s|}",
12366 "ficom{s|}",
12367 "ficomp{s|}",
12368 "fisub{s|}",
12369 "fisubr{s|}",
12370 "fidiv{s|}",
12371 "fidivr{s|}",
12372 /* df */
12373 "fild{s|}",
12374 "fisttp{s|}",
12375 "fist{s|}",
12376 "fistp{s|}",
12377 "fbld",
12378 "fild{ll|}",
12379 "fbstp",
12380 "fistp{ll|}",
12381 };
12382
12383 static const unsigned char float_mem_mode[] = {
12384 /* d8 */
12385 d_mode,
12386 d_mode,
12387 d_mode,
12388 d_mode,
12389 d_mode,
12390 d_mode,
12391 d_mode,
12392 d_mode,
12393 /* d9 */
12394 d_mode,
12395 0,
12396 d_mode,
12397 d_mode,
12398 0,
12399 w_mode,
12400 0,
12401 w_mode,
12402 /* da */
12403 d_mode,
12404 d_mode,
12405 d_mode,
12406 d_mode,
12407 d_mode,
12408 d_mode,
12409 d_mode,
12410 d_mode,
12411 /* db */
12412 d_mode,
12413 d_mode,
12414 d_mode,
12415 d_mode,
12416 0,
12417 t_mode,
12418 0,
12419 t_mode,
12420 /* dc */
12421 q_mode,
12422 q_mode,
12423 q_mode,
12424 q_mode,
12425 q_mode,
12426 q_mode,
12427 q_mode,
12428 q_mode,
12429 /* dd */
12430 q_mode,
12431 q_mode,
12432 q_mode,
12433 q_mode,
12434 0,
12435 0,
12436 0,
12437 w_mode,
12438 /* de */
12439 w_mode,
12440 w_mode,
12441 w_mode,
12442 w_mode,
12443 w_mode,
12444 w_mode,
12445 w_mode,
12446 w_mode,
12447 /* df */
12448 w_mode,
12449 w_mode,
12450 w_mode,
12451 w_mode,
12452 t_mode,
12453 q_mode,
12454 t_mode,
12455 q_mode
12456 };
12457
12458 #define ST { OP_ST, 0 }
12459 #define STi { OP_STi, 0 }
12460
12461 #define FGRPd9_2 NULL, { { NULL, 1 } }, 0
12462 #define FGRPd9_4 NULL, { { NULL, 2 } }, 0
12463 #define FGRPd9_5 NULL, { { NULL, 3 } }, 0
12464 #define FGRPd9_6 NULL, { { NULL, 4 } }, 0
12465 #define FGRPd9_7 NULL, { { NULL, 5 } }, 0
12466 #define FGRPda_5 NULL, { { NULL, 6 } }, 0
12467 #define FGRPdb_4 NULL, { { NULL, 7 } }, 0
12468 #define FGRPde_3 NULL, { { NULL, 8 } }, 0
12469 #define FGRPdf_4 NULL, { { NULL, 9 } }, 0
12470
12471 static const struct dis386 float_reg[][8] = {
12472 /* d8 */
12473 {
12474 { "fadd", { ST, STi }, 0 },
12475 { "fmul", { ST, STi }, 0 },
12476 { "fcom", { STi }, 0 },
12477 { "fcomp", { STi }, 0 },
12478 { "fsub", { ST, STi }, 0 },
12479 { "fsubr", { ST, STi }, 0 },
12480 { "fdiv", { ST, STi }, 0 },
12481 { "fdivr", { ST, STi }, 0 },
12482 },
12483 /* d9 */
12484 {
12485 { "fld", { STi }, 0 },
12486 { "fxch", { STi }, 0 },
12487 { FGRPd9_2 },
12488 { Bad_Opcode },
12489 { FGRPd9_4 },
12490 { FGRPd9_5 },
12491 { FGRPd9_6 },
12492 { FGRPd9_7 },
12493 },
12494 /* da */
12495 {
12496 { "fcmovb", { ST, STi }, 0 },
12497 { "fcmove", { ST, STi }, 0 },
12498 { "fcmovbe",{ ST, STi }, 0 },
12499 { "fcmovu", { ST, STi }, 0 },
12500 { Bad_Opcode },
12501 { FGRPda_5 },
12502 { Bad_Opcode },
12503 { Bad_Opcode },
12504 },
12505 /* db */
12506 {
12507 { "fcmovnb",{ ST, STi }, 0 },
12508 { "fcmovne",{ ST, STi }, 0 },
12509 { "fcmovnbe",{ ST, STi }, 0 },
12510 { "fcmovnu",{ ST, STi }, 0 },
12511 { FGRPdb_4 },
12512 { "fucomi", { ST, STi }, 0 },
12513 { "fcomi", { ST, STi }, 0 },
12514 { Bad_Opcode },
12515 },
12516 /* dc */
12517 {
12518 { "fadd", { STi, ST }, 0 },
12519 { "fmul", { STi, ST }, 0 },
12520 { Bad_Opcode },
12521 { Bad_Opcode },
12522 { "fsub{!M|r}", { STi, ST }, 0 },
12523 { "fsub{M|}", { STi, ST }, 0 },
12524 { "fdiv{!M|r}", { STi, ST }, 0 },
12525 { "fdiv{M|}", { STi, ST }, 0 },
12526 },
12527 /* dd */
12528 {
12529 { "ffree", { STi }, 0 },
12530 { Bad_Opcode },
12531 { "fst", { STi }, 0 },
12532 { "fstp", { STi }, 0 },
12533 { "fucom", { STi }, 0 },
12534 { "fucomp", { STi }, 0 },
12535 { Bad_Opcode },
12536 { Bad_Opcode },
12537 },
12538 /* de */
12539 {
12540 { "faddp", { STi, ST }, 0 },
12541 { "fmulp", { STi, ST }, 0 },
12542 { Bad_Opcode },
12543 { FGRPde_3 },
12544 { "fsub{!M|r}p", { STi, ST }, 0 },
12545 { "fsub{M|}p", { STi, ST }, 0 },
12546 { "fdiv{!M|r}p", { STi, ST }, 0 },
12547 { "fdiv{M|}p", { STi, ST }, 0 },
12548 },
12549 /* df */
12550 {
12551 { "ffreep", { STi }, 0 },
12552 { Bad_Opcode },
12553 { Bad_Opcode },
12554 { Bad_Opcode },
12555 { FGRPdf_4 },
12556 { "fucomip", { ST, STi }, 0 },
12557 { "fcomip", { ST, STi }, 0 },
12558 { Bad_Opcode },
12559 },
12560 };
12561
12562 static char *fgrps[][8] = {
12563 /* Bad opcode 0 */
12564 {
12565 "(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
12566 },
12567
12568 /* d9_2 1 */
12569 {
12570 "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
12571 },
12572
12573 /* d9_4 2 */
12574 {
12575 "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
12576 },
12577
12578 /* d9_5 3 */
12579 {
12580 "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
12581 },
12582
12583 /* d9_6 4 */
12584 {
12585 "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
12586 },
12587
12588 /* d9_7 5 */
12589 {
12590 "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
12591 },
12592
12593 /* da_5 6 */
12594 {
12595 "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
12596 },
12597
12598 /* db_4 7 */
12599 {
12600 "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
12601 "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
12602 },
12603
12604 /* de_3 8 */
12605 {
12606 "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
12607 },
12608
12609 /* df_4 9 */
12610 {
12611 "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
12612 },
12613 };
12614
12615 static void
12616 swap_operand (void)
12617 {
12618 mnemonicendp[0] = '.';
12619 mnemonicendp[1] = 's';
12620 mnemonicendp += 2;
12621 }
12622
12623 static void
12624 OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED,
12625 int sizeflag ATTRIBUTE_UNUSED)
12626 {
12627 /* Skip mod/rm byte. */
12628 MODRM_CHECK;
12629 codep++;
12630 }
12631
12632 static void
12633 dofloat (int sizeflag)
12634 {
12635 const struct dis386 *dp;
12636 unsigned char floatop;
12637
12638 floatop = codep[-1];
12639
12640 if (modrm.mod != 3)
12641 {
12642 int fp_indx = (floatop - 0xd8) * 8 + modrm.reg;
12643
12644 putop (float_mem[fp_indx], sizeflag);
12645 obufp = op_out[0];
12646 op_ad = 2;
12647 OP_E (float_mem_mode[fp_indx], sizeflag);
12648 return;
12649 }
12650 /* Skip mod/rm byte. */
12651 MODRM_CHECK;
12652 codep++;
12653
12654 dp = &float_reg[floatop - 0xd8][modrm.reg];
12655 if (dp->name == NULL)
12656 {
12657 putop (fgrps[dp->op[0].bytemode][modrm.rm], sizeflag);
12658
12659 /* Instruction fnstsw is only one with strange arg. */
12660 if (floatop == 0xdf && codep[-1] == 0xe0)
12661 strcpy (op_out[0], names16[0]);
12662 }
12663 else
12664 {
12665 putop (dp->name, sizeflag);
12666
12667 obufp = op_out[0];
12668 op_ad = 2;
12669 if (dp->op[0].rtn)
12670 (*dp->op[0].rtn) (dp->op[0].bytemode, sizeflag);
12671
12672 obufp = op_out[1];
12673 op_ad = 1;
12674 if (dp->op[1].rtn)
12675 (*dp->op[1].rtn) (dp->op[1].bytemode, sizeflag);
12676 }
12677 }
12678
12679 /* Like oappend (below), but S is a string starting with '%'.
12680 In Intel syntax, the '%' is elided. */
12681 static void
12682 oappend_maybe_intel (const char *s)
12683 {
12684 oappend (s + intel_syntax);
12685 }
12686
12687 static void
12688 OP_ST (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12689 {
12690 oappend_maybe_intel ("%st");
12691 }
12692
12693 static void
12694 OP_STi (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12695 {
12696 sprintf (scratchbuf, "%%st(%d)", modrm.rm);
12697 oappend_maybe_intel (scratchbuf);
12698 }
12699
12700 /* Capital letters in template are macros. */
12701 static int
12702 putop (const char *in_template, int sizeflag)
12703 {
12704 const char *p;
12705 int alt = 0;
12706 int cond = 1;
12707 unsigned int l = 0, len = 1;
12708 char last[4];
12709
12710 #define SAVE_LAST(c) \
12711 if (l < len && l < sizeof (last)) \
12712 last[l++] = c; \
12713 else \
12714 abort ();
12715
12716 for (p = in_template; *p; p++)
12717 {
12718 switch (*p)
12719 {
12720 default:
12721 *obufp++ = *p;
12722 break;
12723 case '%':
12724 len++;
12725 break;
12726 case '!':
12727 cond = 0;
12728 break;
12729 case '{':
12730 if (intel_syntax)
12731 {
12732 while (*++p != '|')
12733 if (*p == '}' || *p == '\0')
12734 abort ();
12735 }
12736 /* Fall through. */
12737 case 'I':
12738 alt = 1;
12739 continue;
12740 case '|':
12741 while (*++p != '}')
12742 {
12743 if (*p == '\0')
12744 abort ();
12745 }
12746 break;
12747 case '}':
12748 break;
12749 case 'A':
12750 if (intel_syntax)
12751 break;
12752 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
12753 *obufp++ = 'b';
12754 break;
12755 case 'B':
12756 if (l == 0 && len == 1)
12757 {
12758 case_B:
12759 if (intel_syntax)
12760 break;
12761 if (sizeflag & SUFFIX_ALWAYS)
12762 *obufp++ = 'b';
12763 }
12764 else
12765 {
12766 if (l != 1
12767 || len != 2
12768 || last[0] != 'L')
12769 {
12770 SAVE_LAST (*p);
12771 break;
12772 }
12773
12774 if (address_mode == mode_64bit
12775 && !(prefixes & PREFIX_ADDR))
12776 {
12777 *obufp++ = 'a';
12778 *obufp++ = 'b';
12779 *obufp++ = 's';
12780 }
12781
12782 goto case_B;
12783 }
12784 break;
12785 case 'C':
12786 if (intel_syntax && !alt)
12787 break;
12788 if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
12789 {
12790 if (sizeflag & DFLAG)
12791 *obufp++ = intel_syntax ? 'd' : 'l';
12792 else
12793 *obufp++ = intel_syntax ? 'w' : 's';
12794 used_prefixes |= (prefixes & PREFIX_DATA);
12795 }
12796 break;
12797 case 'D':
12798 if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
12799 break;
12800 USED_REX (REX_W);
12801 if (modrm.mod == 3)
12802 {
12803 if (rex & REX_W)
12804 *obufp++ = 'q';
12805 else
12806 {
12807 if (sizeflag & DFLAG)
12808 *obufp++ = intel_syntax ? 'd' : 'l';
12809 else
12810 *obufp++ = 'w';
12811 used_prefixes |= (prefixes & PREFIX_DATA);
12812 }
12813 }
12814 else
12815 *obufp++ = 'w';
12816 break;
12817 case 'E': /* For jcxz/jecxz */
12818 if (address_mode == mode_64bit)
12819 {
12820 if (sizeflag & AFLAG)
12821 *obufp++ = 'r';
12822 else
12823 *obufp++ = 'e';
12824 }
12825 else
12826 if (sizeflag & AFLAG)
12827 *obufp++ = 'e';
12828 used_prefixes |= (prefixes & PREFIX_ADDR);
12829 break;
12830 case 'F':
12831 if (intel_syntax)
12832 break;
12833 if ((prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
12834 {
12835 if (sizeflag & AFLAG)
12836 *obufp++ = address_mode == mode_64bit ? 'q' : 'l';
12837 else
12838 *obufp++ = address_mode == mode_64bit ? 'l' : 'w';
12839 used_prefixes |= (prefixes & PREFIX_ADDR);
12840 }
12841 break;
12842 case 'G':
12843 if (intel_syntax || (obufp[-1] != 's' && !(sizeflag & SUFFIX_ALWAYS)))
12844 break;
12845 if ((rex & REX_W) || (sizeflag & DFLAG))
12846 *obufp++ = 'l';
12847 else
12848 *obufp++ = 'w';
12849 if (!(rex & REX_W))
12850 used_prefixes |= (prefixes & PREFIX_DATA);
12851 break;
12852 case 'H':
12853 if (intel_syntax)
12854 break;
12855 if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
12856 || (prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
12857 {
12858 used_prefixes |= prefixes & (PREFIX_CS | PREFIX_DS);
12859 *obufp++ = ',';
12860 *obufp++ = 'p';
12861 if (prefixes & PREFIX_DS)
12862 *obufp++ = 't';
12863 else
12864 *obufp++ = 'n';
12865 }
12866 break;
12867 case 'J':
12868 if (intel_syntax)
12869 break;
12870 *obufp++ = 'l';
12871 break;
12872 case 'K':
12873 USED_REX (REX_W);
12874 if (rex & REX_W)
12875 *obufp++ = 'q';
12876 else
12877 *obufp++ = 'd';
12878 break;
12879 case 'Z':
12880 if (l != 0 || len != 1)
12881 {
12882 if (l != 1 || len != 2 || last[0] != 'X')
12883 {
12884 SAVE_LAST (*p);
12885 break;
12886 }
12887 if (!need_vex || !vex.evex)
12888 abort ();
12889 if (intel_syntax
12890 || ((modrm.mod == 3 || vex.b) && !(sizeflag & SUFFIX_ALWAYS)))
12891 break;
12892 switch (vex.length)
12893 {
12894 case 128:
12895 *obufp++ = 'x';
12896 break;
12897 case 256:
12898 *obufp++ = 'y';
12899 break;
12900 case 512:
12901 *obufp++ = 'z';
12902 break;
12903 default:
12904 abort ();
12905 }
12906 break;
12907 }
12908 if (intel_syntax)
12909 break;
12910 if (address_mode == mode_64bit && (sizeflag & SUFFIX_ALWAYS))
12911 {
12912 *obufp++ = 'q';
12913 break;
12914 }
12915 /* Fall through. */
12916 goto case_L;
12917 case 'L':
12918 if (l != 0 || len != 1)
12919 {
12920 SAVE_LAST (*p);
12921 break;
12922 }
12923 case_L:
12924 if (intel_syntax)
12925 break;
12926 if (sizeflag & SUFFIX_ALWAYS)
12927 *obufp++ = 'l';
12928 break;
12929 case 'M':
12930 if (intel_mnemonic != cond)
12931 *obufp++ = 'r';
12932 break;
12933 case 'N':
12934 if ((prefixes & PREFIX_FWAIT) == 0)
12935 *obufp++ = 'n';
12936 else
12937 used_prefixes |= PREFIX_FWAIT;
12938 break;
12939 case 'O':
12940 USED_REX (REX_W);
12941 if (rex & REX_W)
12942 *obufp++ = 'o';
12943 else if (intel_syntax && (sizeflag & DFLAG))
12944 *obufp++ = 'q';
12945 else
12946 *obufp++ = 'd';
12947 if (!(rex & REX_W))
12948 used_prefixes |= (prefixes & PREFIX_DATA);
12949 break;
12950 case '&':
12951 if (!intel_syntax
12952 && address_mode == mode_64bit
12953 && isa64 == intel64)
12954 {
12955 *obufp++ = 'q';
12956 break;
12957 }
12958 /* Fall through. */
12959 case 'T':
12960 if (!intel_syntax
12961 && address_mode == mode_64bit
12962 && ((sizeflag & DFLAG) || (rex & REX_W)))
12963 {
12964 *obufp++ = 'q';
12965 break;
12966 }
12967 /* Fall through. */
12968 goto case_P;
12969 case 'P':
12970 if (l == 0 && len == 1)
12971 {
12972 case_P:
12973 if (intel_syntax)
12974 {
12975 if ((rex & REX_W) == 0
12976 && (prefixes & PREFIX_DATA))
12977 {
12978 if ((sizeflag & DFLAG) == 0)
12979 *obufp++ = 'w';
12980 used_prefixes |= (prefixes & PREFIX_DATA);
12981 }
12982 break;
12983 }
12984 if ((prefixes & PREFIX_DATA)
12985 || (rex & REX_W)
12986 || (sizeflag & SUFFIX_ALWAYS))
12987 {
12988 USED_REX (REX_W);
12989 if (rex & REX_W)
12990 *obufp++ = 'q';
12991 else
12992 {
12993 if (sizeflag & DFLAG)
12994 *obufp++ = 'l';
12995 else
12996 *obufp++ = 'w';
12997 used_prefixes |= (prefixes & PREFIX_DATA);
12998 }
12999 }
13000 }
13001 else
13002 {
13003 if (l != 1 || len != 2 || last[0] != 'L')
13004 {
13005 SAVE_LAST (*p);
13006 break;
13007 }
13008
13009 if ((prefixes & PREFIX_DATA)
13010 || (rex & REX_W)
13011 || (sizeflag & SUFFIX_ALWAYS))
13012 {
13013 USED_REX (REX_W);
13014 if (rex & REX_W)
13015 *obufp++ = 'q';
13016 else
13017 {
13018 if (sizeflag & DFLAG)
13019 *obufp++ = intel_syntax ? 'd' : 'l';
13020 else
13021 *obufp++ = 'w';
13022 used_prefixes |= (prefixes & PREFIX_DATA);
13023 }
13024 }
13025 }
13026 break;
13027 case 'U':
13028 if (intel_syntax)
13029 break;
13030 if (address_mode == mode_64bit
13031 && ((sizeflag & DFLAG) || (rex & REX_W)))
13032 {
13033 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
13034 *obufp++ = 'q';
13035 break;
13036 }
13037 /* Fall through. */
13038 goto case_Q;
13039 case 'Q':
13040 if (l == 0 && len == 1)
13041 {
13042 case_Q:
13043 if (intel_syntax && !alt)
13044 break;
13045 USED_REX (REX_W);
13046 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
13047 {
13048 if (rex & REX_W)
13049 *obufp++ = 'q';
13050 else
13051 {
13052 if (sizeflag & DFLAG)
13053 *obufp++ = intel_syntax ? 'd' : 'l';
13054 else
13055 *obufp++ = 'w';
13056 used_prefixes |= (prefixes & PREFIX_DATA);
13057 }
13058 }
13059 }
13060 else
13061 {
13062 if (l != 1 || len != 2 || last[0] != 'L')
13063 {
13064 SAVE_LAST (*p);
13065 break;
13066 }
13067 if (intel_syntax
13068 || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
13069 break;
13070 if ((rex & REX_W))
13071 {
13072 USED_REX (REX_W);
13073 *obufp++ = 'q';
13074 }
13075 else
13076 *obufp++ = 'l';
13077 }
13078 break;
13079 case 'R':
13080 USED_REX (REX_W);
13081 if (rex & REX_W)
13082 *obufp++ = 'q';
13083 else if (sizeflag & DFLAG)
13084 {
13085 if (intel_syntax)
13086 *obufp++ = 'd';
13087 else
13088 *obufp++ = 'l';
13089 }
13090 else
13091 *obufp++ = 'w';
13092 if (intel_syntax && !p[1]
13093 && ((rex & REX_W) || (sizeflag & DFLAG)))
13094 *obufp++ = 'e';
13095 if (!(rex & REX_W))
13096 used_prefixes |= (prefixes & PREFIX_DATA);
13097 break;
13098 case 'V':
13099 if (l == 0 && len == 1)
13100 {
13101 if (intel_syntax)
13102 break;
13103 if (address_mode == mode_64bit
13104 && ((sizeflag & DFLAG) || (rex & REX_W)))
13105 {
13106 if (sizeflag & SUFFIX_ALWAYS)
13107 *obufp++ = 'q';
13108 break;
13109 }
13110 }
13111 else
13112 {
13113 if (l != 1
13114 || len != 2
13115 || last[0] != 'L')
13116 {
13117 SAVE_LAST (*p);
13118 break;
13119 }
13120
13121 if (rex & REX_W)
13122 {
13123 *obufp++ = 'a';
13124 *obufp++ = 'b';
13125 *obufp++ = 's';
13126 }
13127 }
13128 /* Fall through. */
13129 goto case_S;
13130 case 'S':
13131 if (l == 0 && len == 1)
13132 {
13133 case_S:
13134 if (intel_syntax)
13135 break;
13136 if (sizeflag & SUFFIX_ALWAYS)
13137 {
13138 if (rex & REX_W)
13139 *obufp++ = 'q';
13140 else
13141 {
13142 if (sizeflag & DFLAG)
13143 *obufp++ = 'l';
13144 else
13145 *obufp++ = 'w';
13146 used_prefixes |= (prefixes & PREFIX_DATA);
13147 }
13148 }
13149 }
13150 else
13151 {
13152 if (l != 1
13153 || len != 2
13154 || last[0] != 'L')
13155 {
13156 SAVE_LAST (*p);
13157 break;
13158 }
13159
13160 if (address_mode == mode_64bit
13161 && !(prefixes & PREFIX_ADDR))
13162 {
13163 *obufp++ = 'a';
13164 *obufp++ = 'b';
13165 *obufp++ = 's';
13166 }
13167
13168 goto case_S;
13169 }
13170 break;
13171 case 'X':
13172 if (l != 0 || len != 1)
13173 {
13174 SAVE_LAST (*p);
13175 break;
13176 }
13177 if (need_vex && vex.prefix)
13178 {
13179 if (vex.prefix == DATA_PREFIX_OPCODE)
13180 *obufp++ = 'd';
13181 else
13182 *obufp++ = 's';
13183 }
13184 else
13185 {
13186 if (prefixes & PREFIX_DATA)
13187 *obufp++ = 'd';
13188 else
13189 *obufp++ = 's';
13190 used_prefixes |= (prefixes & PREFIX_DATA);
13191 }
13192 break;
13193 case 'Y':
13194 if (l == 0 && len == 1)
13195 abort ();
13196 else
13197 {
13198 if (l != 1 || len != 2 || last[0] != 'X')
13199 {
13200 SAVE_LAST (*p);
13201 break;
13202 }
13203 if (!need_vex)
13204 abort ();
13205 if (intel_syntax
13206 || ((modrm.mod == 3 || vex.b) && !(sizeflag & SUFFIX_ALWAYS)))
13207 break;
13208 switch (vex.length)
13209 {
13210 case 128:
13211 *obufp++ = 'x';
13212 break;
13213 case 256:
13214 *obufp++ = 'y';
13215 break;
13216 case 512:
13217 if (!vex.evex)
13218 default:
13219 abort ();
13220 }
13221 }
13222 break;
13223 case 'W':
13224 if (l == 0 && len == 1)
13225 {
13226 /* operand size flag for cwtl, cbtw */
13227 USED_REX (REX_W);
13228 if (rex & REX_W)
13229 {
13230 if (intel_syntax)
13231 *obufp++ = 'd';
13232 else
13233 *obufp++ = 'l';
13234 }
13235 else if (sizeflag & DFLAG)
13236 *obufp++ = 'w';
13237 else
13238 *obufp++ = 'b';
13239 if (!(rex & REX_W))
13240 used_prefixes |= (prefixes & PREFIX_DATA);
13241 }
13242 else
13243 {
13244 if (l != 1
13245 || len != 2
13246 || (last[0] != 'X'
13247 && last[0] != 'L'))
13248 {
13249 SAVE_LAST (*p);
13250 break;
13251 }
13252 if (!need_vex)
13253 abort ();
13254 if (last[0] == 'X')
13255 *obufp++ = vex.w ? 'd': 's';
13256 else
13257 *obufp++ = vex.w ? 'q': 'd';
13258 }
13259 break;
13260 case '^':
13261 if (intel_syntax)
13262 break;
13263 if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
13264 {
13265 if (sizeflag & DFLAG)
13266 *obufp++ = 'l';
13267 else
13268 *obufp++ = 'w';
13269 used_prefixes |= (prefixes & PREFIX_DATA);
13270 }
13271 break;
13272 case '@':
13273 if (intel_syntax)
13274 break;
13275 if (address_mode == mode_64bit
13276 && (isa64 == intel64
13277 || ((sizeflag & DFLAG) || (rex & REX_W))))
13278 *obufp++ = 'q';
13279 else if ((prefixes & PREFIX_DATA))
13280 {
13281 if (!(sizeflag & DFLAG))
13282 *obufp++ = 'w';
13283 used_prefixes |= (prefixes & PREFIX_DATA);
13284 }
13285 break;
13286 }
13287 alt = 0;
13288 }
13289 *obufp = 0;
13290 mnemonicendp = obufp;
13291 return 0;
13292 }
13293
13294 static void
13295 oappend (const char *s)
13296 {
13297 obufp = stpcpy (obufp, s);
13298 }
13299
13300 static void
13301 append_seg (void)
13302 {
13303 /* Only print the active segment register. */
13304 if (!active_seg_prefix)
13305 return;
13306
13307 used_prefixes |= active_seg_prefix;
13308 switch (active_seg_prefix)
13309 {
13310 case PREFIX_CS:
13311 oappend_maybe_intel ("%cs:");
13312 break;
13313 case PREFIX_DS:
13314 oappend_maybe_intel ("%ds:");
13315 break;
13316 case PREFIX_SS:
13317 oappend_maybe_intel ("%ss:");
13318 break;
13319 case PREFIX_ES:
13320 oappend_maybe_intel ("%es:");
13321 break;
13322 case PREFIX_FS:
13323 oappend_maybe_intel ("%fs:");
13324 break;
13325 case PREFIX_GS:
13326 oappend_maybe_intel ("%gs:");
13327 break;
13328 default:
13329 break;
13330 }
13331 }
13332
13333 static void
13334 OP_indirE (int bytemode, int sizeflag)
13335 {
13336 if (!intel_syntax)
13337 oappend ("*");
13338 OP_E (bytemode, sizeflag);
13339 }
13340
13341 static void
13342 print_operand_value (char *buf, int hex, bfd_vma disp)
13343 {
13344 if (address_mode == mode_64bit)
13345 {
13346 if (hex)
13347 {
13348 char tmp[30];
13349 int i;
13350 buf[0] = '0';
13351 buf[1] = 'x';
13352 sprintf_vma (tmp, disp);
13353 for (i = 0; tmp[i] == '0' && tmp[i + 1]; i++);
13354 strcpy (buf + 2, tmp + i);
13355 }
13356 else
13357 {
13358 bfd_signed_vma v = disp;
13359 char tmp[30];
13360 int i;
13361 if (v < 0)
13362 {
13363 *(buf++) = '-';
13364 v = -disp;
13365 /* Check for possible overflow on 0x8000000000000000. */
13366 if (v < 0)
13367 {
13368 strcpy (buf, "9223372036854775808");
13369 return;
13370 }
13371 }
13372 if (!v)
13373 {
13374 strcpy (buf, "0");
13375 return;
13376 }
13377
13378 i = 0;
13379 tmp[29] = 0;
13380 while (v)
13381 {
13382 tmp[28 - i] = (v % 10) + '0';
13383 v /= 10;
13384 i++;
13385 }
13386 strcpy (buf, tmp + 29 - i);
13387 }
13388 }
13389 else
13390 {
13391 if (hex)
13392 sprintf (buf, "0x%x", (unsigned int) disp);
13393 else
13394 sprintf (buf, "%d", (int) disp);
13395 }
13396 }
13397
13398 /* Put DISP in BUF as signed hex number. */
13399
13400 static void
13401 print_displacement (char *buf, bfd_vma disp)
13402 {
13403 bfd_signed_vma val = disp;
13404 char tmp[30];
13405 int i, j = 0;
13406
13407 if (val < 0)
13408 {
13409 buf[j++] = '-';
13410 val = -disp;
13411
13412 /* Check for possible overflow. */
13413 if (val < 0)
13414 {
13415 switch (address_mode)
13416 {
13417 case mode_64bit:
13418 strcpy (buf + j, "0x8000000000000000");
13419 break;
13420 case mode_32bit:
13421 strcpy (buf + j, "0x80000000");
13422 break;
13423 case mode_16bit:
13424 strcpy (buf + j, "0x8000");
13425 break;
13426 }
13427 return;
13428 }
13429 }
13430
13431 buf[j++] = '0';
13432 buf[j++] = 'x';
13433
13434 sprintf_vma (tmp, (bfd_vma) val);
13435 for (i = 0; tmp[i] == '0'; i++)
13436 continue;
13437 if (tmp[i] == '\0')
13438 i--;
13439 strcpy (buf + j, tmp + i);
13440 }
13441
13442 static void
13443 intel_operand_size (int bytemode, int sizeflag)
13444 {
13445 if (vex.evex
13446 && vex.b
13447 && (bytemode == x_mode
13448 || bytemode == evex_half_bcst_xmmq_mode))
13449 {
13450 if (vex.w)
13451 oappend ("QWORD PTR ");
13452 else
13453 oappend ("DWORD PTR ");
13454 return;
13455 }
13456 switch (bytemode)
13457 {
13458 case b_mode:
13459 case b_swap_mode:
13460 case dqb_mode:
13461 case db_mode:
13462 oappend ("BYTE PTR ");
13463 break;
13464 case w_mode:
13465 case dw_mode:
13466 case dqw_mode:
13467 oappend ("WORD PTR ");
13468 break;
13469 case indir_v_mode:
13470 if (address_mode == mode_64bit && isa64 == intel64)
13471 {
13472 oappend ("QWORD PTR ");
13473 break;
13474 }
13475 /* Fall through. */
13476 case stack_v_mode:
13477 if (address_mode == mode_64bit && ((sizeflag & DFLAG) || (rex & REX_W)))
13478 {
13479 oappend ("QWORD PTR ");
13480 break;
13481 }
13482 /* Fall through. */
13483 case v_mode:
13484 case v_swap_mode:
13485 case dq_mode:
13486 USED_REX (REX_W);
13487 if (rex & REX_W)
13488 oappend ("QWORD PTR ");
13489 else
13490 {
13491 if ((sizeflag & DFLAG) || bytemode == dq_mode)
13492 oappend ("DWORD PTR ");
13493 else
13494 oappend ("WORD PTR ");
13495 used_prefixes |= (prefixes & PREFIX_DATA);
13496 }
13497 break;
13498 case z_mode:
13499 if ((rex & REX_W) || (sizeflag & DFLAG))
13500 *obufp++ = 'D';
13501 oappend ("WORD PTR ");
13502 if (!(rex & REX_W))
13503 used_prefixes |= (prefixes & PREFIX_DATA);
13504 break;
13505 case a_mode:
13506 if (sizeflag & DFLAG)
13507 oappend ("QWORD PTR ");
13508 else
13509 oappend ("DWORD PTR ");
13510 used_prefixes |= (prefixes & PREFIX_DATA);
13511 break;
13512 case d_mode:
13513 case d_scalar_mode:
13514 case d_scalar_swap_mode:
13515 case d_swap_mode:
13516 case dqd_mode:
13517 oappend ("DWORD PTR ");
13518 break;
13519 case q_mode:
13520 case q_scalar_mode:
13521 case q_scalar_swap_mode:
13522 case q_swap_mode:
13523 oappend ("QWORD PTR ");
13524 break;
13525 case dqa_mode:
13526 case m_mode:
13527 if (address_mode == mode_64bit)
13528 oappend ("QWORD PTR ");
13529 else
13530 oappend ("DWORD PTR ");
13531 break;
13532 case f_mode:
13533 if (sizeflag & DFLAG)
13534 oappend ("FWORD PTR ");
13535 else
13536 oappend ("DWORD PTR ");
13537 used_prefixes |= (prefixes & PREFIX_DATA);
13538 break;
13539 case t_mode:
13540 oappend ("TBYTE PTR ");
13541 break;
13542 case x_mode:
13543 case x_swap_mode:
13544 case evex_x_gscat_mode:
13545 case evex_x_nobcst_mode:
13546 case b_scalar_mode:
13547 case w_scalar_mode:
13548 if (need_vex)
13549 {
13550 switch (vex.length)
13551 {
13552 case 128:
13553 oappend ("XMMWORD PTR ");
13554 break;
13555 case 256:
13556 oappend ("YMMWORD PTR ");
13557 break;
13558 case 512:
13559 oappend ("ZMMWORD PTR ");
13560 break;
13561 default:
13562 abort ();
13563 }
13564 }
13565 else
13566 oappend ("XMMWORD PTR ");
13567 break;
13568 case xmm_mode:
13569 oappend ("XMMWORD PTR ");
13570 break;
13571 case ymm_mode:
13572 oappend ("YMMWORD PTR ");
13573 break;
13574 case xmmq_mode:
13575 case evex_half_bcst_xmmq_mode:
13576 if (!need_vex)
13577 abort ();
13578
13579 switch (vex.length)
13580 {
13581 case 128:
13582 oappend ("QWORD PTR ");
13583 break;
13584 case 256:
13585 oappend ("XMMWORD PTR ");
13586 break;
13587 case 512:
13588 oappend ("YMMWORD PTR ");
13589 break;
13590 default:
13591 abort ();
13592 }
13593 break;
13594 case xmm_mb_mode:
13595 if (!need_vex)
13596 abort ();
13597
13598 switch (vex.length)
13599 {
13600 case 128:
13601 case 256:
13602 case 512:
13603 oappend ("BYTE PTR ");
13604 break;
13605 default:
13606 abort ();
13607 }
13608 break;
13609 case xmm_mw_mode:
13610 if (!need_vex)
13611 abort ();
13612
13613 switch (vex.length)
13614 {
13615 case 128:
13616 case 256:
13617 case 512:
13618 oappend ("WORD PTR ");
13619 break;
13620 default:
13621 abort ();
13622 }
13623 break;
13624 case xmm_md_mode:
13625 if (!need_vex)
13626 abort ();
13627
13628 switch (vex.length)
13629 {
13630 case 128:
13631 case 256:
13632 case 512:
13633 oappend ("DWORD PTR ");
13634 break;
13635 default:
13636 abort ();
13637 }
13638 break;
13639 case xmm_mq_mode:
13640 if (!need_vex)
13641 abort ();
13642
13643 switch (vex.length)
13644 {
13645 case 128:
13646 case 256:
13647 case 512:
13648 oappend ("QWORD PTR ");
13649 break;
13650 default:
13651 abort ();
13652 }
13653 break;
13654 case xmmdw_mode:
13655 if (!need_vex)
13656 abort ();
13657
13658 switch (vex.length)
13659 {
13660 case 128:
13661 oappend ("WORD PTR ");
13662 break;
13663 case 256:
13664 oappend ("DWORD PTR ");
13665 break;
13666 case 512:
13667 oappend ("QWORD PTR ");
13668 break;
13669 default:
13670 abort ();
13671 }
13672 break;
13673 case xmmqd_mode:
13674 if (!need_vex)
13675 abort ();
13676
13677 switch (vex.length)
13678 {
13679 case 128:
13680 oappend ("DWORD PTR ");
13681 break;
13682 case 256:
13683 oappend ("QWORD PTR ");
13684 break;
13685 case 512:
13686 oappend ("XMMWORD PTR ");
13687 break;
13688 default:
13689 abort ();
13690 }
13691 break;
13692 case ymmq_mode:
13693 if (!need_vex)
13694 abort ();
13695
13696 switch (vex.length)
13697 {
13698 case 128:
13699 oappend ("QWORD PTR ");
13700 break;
13701 case 256:
13702 oappend ("YMMWORD PTR ");
13703 break;
13704 case 512:
13705 oappend ("ZMMWORD PTR ");
13706 break;
13707 default:
13708 abort ();
13709 }
13710 break;
13711 case ymmxmm_mode:
13712 if (!need_vex)
13713 abort ();
13714
13715 switch (vex.length)
13716 {
13717 case 128:
13718 case 256:
13719 oappend ("XMMWORD PTR ");
13720 break;
13721 default:
13722 abort ();
13723 }
13724 break;
13725 case o_mode:
13726 oappend ("OWORD PTR ");
13727 break;
13728 case xmm_mdq_mode:
13729 case vex_w_dq_mode:
13730 case vex_scalar_w_dq_mode:
13731 if (!need_vex)
13732 abort ();
13733
13734 if (vex.w)
13735 oappend ("QWORD PTR ");
13736 else
13737 oappend ("DWORD PTR ");
13738 break;
13739 case vex_vsib_d_w_dq_mode:
13740 case vex_vsib_q_w_dq_mode:
13741 if (!need_vex)
13742 abort ();
13743
13744 if (!vex.evex)
13745 {
13746 if (vex.w)
13747 oappend ("QWORD PTR ");
13748 else
13749 oappend ("DWORD PTR ");
13750 }
13751 else
13752 {
13753 switch (vex.length)
13754 {
13755 case 128:
13756 oappend ("XMMWORD PTR ");
13757 break;
13758 case 256:
13759 oappend ("YMMWORD PTR ");
13760 break;
13761 case 512:
13762 oappend ("ZMMWORD PTR ");
13763 break;
13764 default:
13765 abort ();
13766 }
13767 }
13768 break;
13769 case vex_vsib_q_w_d_mode:
13770 case vex_vsib_d_w_d_mode:
13771 if (!need_vex || !vex.evex)
13772 abort ();
13773
13774 switch (vex.length)
13775 {
13776 case 128:
13777 oappend ("QWORD PTR ");
13778 break;
13779 case 256:
13780 oappend ("XMMWORD PTR ");
13781 break;
13782 case 512:
13783 oappend ("YMMWORD PTR ");
13784 break;
13785 default:
13786 abort ();
13787 }
13788
13789 break;
13790 case mask_bd_mode:
13791 if (!need_vex || vex.length != 128)
13792 abort ();
13793 if (vex.w)
13794 oappend ("DWORD PTR ");
13795 else
13796 oappend ("BYTE PTR ");
13797 break;
13798 case mask_mode:
13799 if (!need_vex)
13800 abort ();
13801 if (vex.w)
13802 oappend ("QWORD PTR ");
13803 else
13804 oappend ("WORD PTR ");
13805 break;
13806 case v_bnd_mode:
13807 case v_bndmk_mode:
13808 default:
13809 break;
13810 }
13811 }
13812
13813 static void
13814 OP_E_register (int bytemode, int sizeflag)
13815 {
13816 int reg = modrm.rm;
13817 const char **names;
13818
13819 USED_REX (REX_B);
13820 if ((rex & REX_B))
13821 reg += 8;
13822
13823 if ((sizeflag & SUFFIX_ALWAYS)
13824 && (bytemode == b_swap_mode
13825 || bytemode == bnd_swap_mode
13826 || bytemode == v_swap_mode))
13827 swap_operand ();
13828
13829 switch (bytemode)
13830 {
13831 case b_mode:
13832 case b_swap_mode:
13833 USED_REX (0);
13834 if (rex)
13835 names = names8rex;
13836 else
13837 names = names8;
13838 break;
13839 case w_mode:
13840 names = names16;
13841 break;
13842 case d_mode:
13843 case dw_mode:
13844 case db_mode:
13845 names = names32;
13846 break;
13847 case q_mode:
13848 names = names64;
13849 break;
13850 case m_mode:
13851 case v_bnd_mode:
13852 names = address_mode == mode_64bit ? names64 : names32;
13853 break;
13854 case bnd_mode:
13855 case bnd_swap_mode:
13856 if (reg > 0x3)
13857 {
13858 oappend ("(bad)");
13859 return;
13860 }
13861 names = names_bnd;
13862 break;
13863 case indir_v_mode:
13864 if (address_mode == mode_64bit && isa64 == intel64)
13865 {
13866 names = names64;
13867 break;
13868 }
13869 /* Fall through. */
13870 case stack_v_mode:
13871 if (address_mode == mode_64bit && ((sizeflag & DFLAG) || (rex & REX_W)))
13872 {
13873 names = names64;
13874 break;
13875 }
13876 bytemode = v_mode;
13877 /* Fall through. */
13878 case v_mode:
13879 case v_swap_mode:
13880 case dq_mode:
13881 case dqb_mode:
13882 case dqd_mode:
13883 case dqw_mode:
13884 case dqa_mode:
13885 USED_REX (REX_W);
13886 if (rex & REX_W)
13887 names = names64;
13888 else
13889 {
13890 if ((sizeflag & DFLAG)
13891 || (bytemode != v_mode
13892 && bytemode != v_swap_mode))
13893 names = names32;
13894 else
13895 names = names16;
13896 used_prefixes |= (prefixes & PREFIX_DATA);
13897 }
13898 break;
13899 case va_mode:
13900 names = (address_mode == mode_64bit
13901 ? names64 : names32);
13902 if (!(prefixes & PREFIX_ADDR))
13903 names = (address_mode == mode_16bit
13904 ? names16 : names);
13905 else
13906 {
13907 /* Remove "addr16/addr32". */
13908 all_prefixes[last_addr_prefix] = 0;
13909 names = (address_mode != mode_32bit
13910 ? names32 : names16);
13911 used_prefixes |= PREFIX_ADDR;
13912 }
13913 break;
13914 case mask_bd_mode:
13915 case mask_mode:
13916 if (reg > 0x7)
13917 {
13918 oappend ("(bad)");
13919 return;
13920 }
13921 names = names_mask;
13922 break;
13923 case 0:
13924 return;
13925 default:
13926 oappend (INTERNAL_DISASSEMBLER_ERROR);
13927 return;
13928 }
13929 oappend (names[reg]);
13930 }
13931
13932 static void
13933 OP_E_memory (int bytemode, int sizeflag)
13934 {
13935 bfd_vma disp = 0;
13936 int add = (rex & REX_B) ? 8 : 0;
13937 int riprel = 0;
13938 int shift;
13939
13940 if (vex.evex)
13941 {
13942 /* In EVEX, if operand doesn't allow broadcast, vex.b should be 0. */
13943 if (vex.b
13944 && bytemode != x_mode
13945 && bytemode != xmmq_mode
13946 && bytemode != evex_half_bcst_xmmq_mode)
13947 {
13948 BadOp ();
13949 return;
13950 }
13951 switch (bytemode)
13952 {
13953 case dqw_mode:
13954 case dw_mode:
13955 shift = 1;
13956 break;
13957 case dqb_mode:
13958 case db_mode:
13959 shift = 0;
13960 break;
13961 case dq_mode:
13962 if (address_mode != mode_64bit)
13963 {
13964 shift = 2;
13965 break;
13966 }
13967 /* fall through */
13968 case vex_vsib_d_w_dq_mode:
13969 case vex_vsib_d_w_d_mode:
13970 case vex_vsib_q_w_dq_mode:
13971 case vex_vsib_q_w_d_mode:
13972 case evex_x_gscat_mode:
13973 case xmm_mdq_mode:
13974 shift = vex.w ? 3 : 2;
13975 break;
13976 case x_mode:
13977 case evex_half_bcst_xmmq_mode:
13978 case xmmq_mode:
13979 if (vex.b)
13980 {
13981 shift = vex.w ? 3 : 2;
13982 break;
13983 }
13984 /* Fall through. */
13985 case xmmqd_mode:
13986 case xmmdw_mode:
13987 case ymmq_mode:
13988 case evex_x_nobcst_mode:
13989 case x_swap_mode:
13990 switch (vex.length)
13991 {
13992 case 128:
13993 shift = 4;
13994 break;
13995 case 256:
13996 shift = 5;
13997 break;
13998 case 512:
13999 shift = 6;
14000 break;
14001 default:
14002 abort ();
14003 }
14004 break;
14005 case ymm_mode:
14006 shift = 5;
14007 break;
14008 case xmm_mode:
14009 shift = 4;
14010 break;
14011 case xmm_mq_mode:
14012 case q_mode:
14013 case q_scalar_mode:
14014 case q_swap_mode:
14015 case q_scalar_swap_mode:
14016 shift = 3;
14017 break;
14018 case dqd_mode:
14019 case xmm_md_mode:
14020 case d_mode:
14021 case d_scalar_mode:
14022 case d_swap_mode:
14023 case d_scalar_swap_mode:
14024 shift = 2;
14025 break;
14026 case w_scalar_mode:
14027 case xmm_mw_mode:
14028 shift = 1;
14029 break;
14030 case b_scalar_mode:
14031 case xmm_mb_mode:
14032 shift = 0;
14033 break;
14034 case dqa_mode:
14035 shift = address_mode == mode_64bit ? 3 : 2;
14036 break;
14037 default:
14038 abort ();
14039 }
14040 /* Make necessary corrections to shift for modes that need it.
14041 For these modes we currently have shift 4, 5 or 6 depending on
14042 vex.length (it corresponds to xmmword, ymmword or zmmword
14043 operand). We might want to make it 3, 4 or 5 (e.g. for
14044 xmmq_mode). In case of broadcast enabled the corrections
14045 aren't needed, as element size is always 32 or 64 bits. */
14046 if (!vex.b
14047 && (bytemode == xmmq_mode
14048 || bytemode == evex_half_bcst_xmmq_mode))
14049 shift -= 1;
14050 else if (bytemode == xmmqd_mode)
14051 shift -= 2;
14052 else if (bytemode == xmmdw_mode)
14053 shift -= 3;
14054 else if (bytemode == ymmq_mode && vex.length == 128)
14055 shift -= 1;
14056 }
14057 else
14058 shift = 0;
14059
14060 USED_REX (REX_B);
14061 if (intel_syntax)
14062 intel_operand_size (bytemode, sizeflag);
14063 append_seg ();
14064
14065 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
14066 {
14067 /* 32/64 bit address mode */
14068 int havedisp;
14069 int havesib;
14070 int havebase;
14071 int haveindex;
14072 int needindex;
14073 int needaddr32;
14074 int base, rbase;
14075 int vindex = 0;
14076 int scale = 0;
14077 int addr32flag = !((sizeflag & AFLAG)
14078 || bytemode == v_bnd_mode
14079 || bytemode == v_bndmk_mode
14080 || bytemode == bnd_mode
14081 || bytemode == bnd_swap_mode);
14082 const char **indexes64 = names64;
14083 const char **indexes32 = names32;
14084
14085 havesib = 0;
14086 havebase = 1;
14087 haveindex = 0;
14088 base = modrm.rm;
14089
14090 if (base == 4)
14091 {
14092 havesib = 1;
14093 vindex = sib.index;
14094 USED_REX (REX_X);
14095 if (rex & REX_X)
14096 vindex += 8;
14097 switch (bytemode)
14098 {
14099 case vex_vsib_d_w_dq_mode:
14100 case vex_vsib_d_w_d_mode:
14101 case vex_vsib_q_w_dq_mode:
14102 case vex_vsib_q_w_d_mode:
14103 if (!need_vex)
14104 abort ();
14105 if (vex.evex)
14106 {
14107 if (!vex.v)
14108 vindex += 16;
14109 }
14110
14111 haveindex = 1;
14112 switch (vex.length)
14113 {
14114 case 128:
14115 indexes64 = indexes32 = names_xmm;
14116 break;
14117 case 256:
14118 if (!vex.w
14119 || bytemode == vex_vsib_q_w_dq_mode
14120 || bytemode == vex_vsib_q_w_d_mode)
14121 indexes64 = indexes32 = names_ymm;
14122 else
14123 indexes64 = indexes32 = names_xmm;
14124 break;
14125 case 512:
14126 if (!vex.w
14127 || bytemode == vex_vsib_q_w_dq_mode
14128 || bytemode == vex_vsib_q_w_d_mode)
14129 indexes64 = indexes32 = names_zmm;
14130 else
14131 indexes64 = indexes32 = names_ymm;
14132 break;
14133 default:
14134 abort ();
14135 }
14136 break;
14137 default:
14138 haveindex = vindex != 4;
14139 break;
14140 }
14141 scale = sib.scale;
14142 base = sib.base;
14143 codep++;
14144 }
14145 rbase = base + add;
14146
14147 switch (modrm.mod)
14148 {
14149 case 0:
14150 if (base == 5)
14151 {
14152 havebase = 0;
14153 if (address_mode == mode_64bit && !havesib)
14154 riprel = 1;
14155 disp = get32s ();
14156 if (riprel && bytemode == v_bndmk_mode)
14157 {
14158 oappend ("(bad)");
14159 return;
14160 }
14161 }
14162 break;
14163 case 1:
14164 FETCH_DATA (the_info, codep + 1);
14165 disp = *codep++;
14166 if ((disp & 0x80) != 0)
14167 disp -= 0x100;
14168 if (vex.evex && shift > 0)
14169 disp <<= shift;
14170 break;
14171 case 2:
14172 disp = get32s ();
14173 break;
14174 }
14175
14176 needindex = 0;
14177 needaddr32 = 0;
14178 if (havesib
14179 && !havebase
14180 && !haveindex
14181 && address_mode != mode_16bit)
14182 {
14183 if (address_mode == mode_64bit)
14184 {
14185 /* Display eiz instead of addr32. */
14186 needindex = addr32flag;
14187 needaddr32 = 1;
14188 }
14189 else
14190 {
14191 /* In 32-bit mode, we need index register to tell [offset]
14192 from [eiz*1 + offset]. */
14193 needindex = 1;
14194 }
14195 }
14196
14197 havedisp = (havebase
14198 || needindex
14199 || (havesib && (haveindex || scale != 0)));
14200
14201 if (!intel_syntax)
14202 if (modrm.mod != 0 || base == 5)
14203 {
14204 if (havedisp || riprel)
14205 print_displacement (scratchbuf, disp);
14206 else
14207 print_operand_value (scratchbuf, 1, disp);
14208 oappend (scratchbuf);
14209 if (riprel)
14210 {
14211 set_op (disp, 1);
14212 oappend (!addr32flag ? "(%rip)" : "(%eip)");
14213 }
14214 }
14215
14216 if ((havebase || haveindex || needaddr32 || riprel)
14217 && (bytemode != v_bnd_mode)
14218 && (bytemode != v_bndmk_mode)
14219 && (bytemode != bnd_mode)
14220 && (bytemode != bnd_swap_mode))
14221 used_prefixes |= PREFIX_ADDR;
14222
14223 if (havedisp || (intel_syntax && riprel))
14224 {
14225 *obufp++ = open_char;
14226 if (intel_syntax && riprel)
14227 {
14228 set_op (disp, 1);
14229 oappend (!addr32flag ? "rip" : "eip");
14230 }
14231 *obufp = '\0';
14232 if (havebase)
14233 oappend (address_mode == mode_64bit && !addr32flag
14234 ? names64[rbase] : names32[rbase]);
14235 if (havesib)
14236 {
14237 /* ESP/RSP won't allow index. If base isn't ESP/RSP,
14238 print index to tell base + index from base. */
14239 if (scale != 0
14240 || needindex
14241 || haveindex
14242 || (havebase && base != ESP_REG_NUM))
14243 {
14244 if (!intel_syntax || havebase)
14245 {
14246 *obufp++ = separator_char;
14247 *obufp = '\0';
14248 }
14249 if (haveindex)
14250 oappend (address_mode == mode_64bit && !addr32flag
14251 ? indexes64[vindex] : indexes32[vindex]);
14252 else
14253 oappend (address_mode == mode_64bit && !addr32flag
14254 ? index64 : index32);
14255
14256 *obufp++ = scale_char;
14257 *obufp = '\0';
14258 sprintf (scratchbuf, "%d", 1 << scale);
14259 oappend (scratchbuf);
14260 }
14261 }
14262 if (intel_syntax
14263 && (disp || modrm.mod != 0 || base == 5))
14264 {
14265 if (!havedisp || (bfd_signed_vma) disp >= 0)
14266 {
14267 *obufp++ = '+';
14268 *obufp = '\0';
14269 }
14270 else if (modrm.mod != 1 && disp != -disp)
14271 {
14272 *obufp++ = '-';
14273 *obufp = '\0';
14274 disp = - (bfd_signed_vma) disp;
14275 }
14276
14277 if (havedisp)
14278 print_displacement (scratchbuf, disp);
14279 else
14280 print_operand_value (scratchbuf, 1, disp);
14281 oappend (scratchbuf);
14282 }
14283
14284 *obufp++ = close_char;
14285 *obufp = '\0';
14286 }
14287 else if (intel_syntax)
14288 {
14289 if (modrm.mod != 0 || base == 5)
14290 {
14291 if (!active_seg_prefix)
14292 {
14293 oappend (names_seg[ds_reg - es_reg]);
14294 oappend (":");
14295 }
14296 print_operand_value (scratchbuf, 1, disp);
14297 oappend (scratchbuf);
14298 }
14299 }
14300 }
14301 else
14302 {
14303 /* 16 bit address mode */
14304 used_prefixes |= prefixes & PREFIX_ADDR;
14305 switch (modrm.mod)
14306 {
14307 case 0:
14308 if (modrm.rm == 6)
14309 {
14310 disp = get16 ();
14311 if ((disp & 0x8000) != 0)
14312 disp -= 0x10000;
14313 }
14314 break;
14315 case 1:
14316 FETCH_DATA (the_info, codep + 1);
14317 disp = *codep++;
14318 if ((disp & 0x80) != 0)
14319 disp -= 0x100;
14320 if (vex.evex && shift > 0)
14321 disp <<= shift;
14322 break;
14323 case 2:
14324 disp = get16 ();
14325 if ((disp & 0x8000) != 0)
14326 disp -= 0x10000;
14327 break;
14328 }
14329
14330 if (!intel_syntax)
14331 if (modrm.mod != 0 || modrm.rm == 6)
14332 {
14333 print_displacement (scratchbuf, disp);
14334 oappend (scratchbuf);
14335 }
14336
14337 if (modrm.mod != 0 || modrm.rm != 6)
14338 {
14339 *obufp++ = open_char;
14340 *obufp = '\0';
14341 oappend (index16[modrm.rm]);
14342 if (intel_syntax
14343 && (disp || modrm.mod != 0 || modrm.rm == 6))
14344 {
14345 if ((bfd_signed_vma) disp >= 0)
14346 {
14347 *obufp++ = '+';
14348 *obufp = '\0';
14349 }
14350 else if (modrm.mod != 1)
14351 {
14352 *obufp++ = '-';
14353 *obufp = '\0';
14354 disp = - (bfd_signed_vma) disp;
14355 }
14356
14357 print_displacement (scratchbuf, disp);
14358 oappend (scratchbuf);
14359 }
14360
14361 *obufp++ = close_char;
14362 *obufp = '\0';
14363 }
14364 else if (intel_syntax)
14365 {
14366 if (!active_seg_prefix)
14367 {
14368 oappend (names_seg[ds_reg - es_reg]);
14369 oappend (":");
14370 }
14371 print_operand_value (scratchbuf, 1, disp & 0xffff);
14372 oappend (scratchbuf);
14373 }
14374 }
14375 if (vex.evex && vex.b
14376 && (bytemode == x_mode
14377 || bytemode == xmmq_mode
14378 || bytemode == evex_half_bcst_xmmq_mode))
14379 {
14380 if (vex.w
14381 || bytemode == xmmq_mode
14382 || bytemode == evex_half_bcst_xmmq_mode)
14383 {
14384 switch (vex.length)
14385 {
14386 case 128:
14387 oappend ("{1to2}");
14388 break;
14389 case 256:
14390 oappend ("{1to4}");
14391 break;
14392 case 512:
14393 oappend ("{1to8}");
14394 break;
14395 default:
14396 abort ();
14397 }
14398 }
14399 else
14400 {
14401 switch (vex.length)
14402 {
14403 case 128:
14404 oappend ("{1to4}");
14405 break;
14406 case 256:
14407 oappend ("{1to8}");
14408 break;
14409 case 512:
14410 oappend ("{1to16}");
14411 break;
14412 default:
14413 abort ();
14414 }
14415 }
14416 }
14417 }
14418
14419 static void
14420 OP_E (int bytemode, int sizeflag)
14421 {
14422 /* Skip mod/rm byte. */
14423 MODRM_CHECK;
14424 codep++;
14425
14426 if (modrm.mod == 3)
14427 OP_E_register (bytemode, sizeflag);
14428 else
14429 OP_E_memory (bytemode, sizeflag);
14430 }
14431
14432 static void
14433 OP_G (int bytemode, int sizeflag)
14434 {
14435 int add = 0;
14436 const char **names;
14437 USED_REX (REX_R);
14438 if (rex & REX_R)
14439 add += 8;
14440 switch (bytemode)
14441 {
14442 case b_mode:
14443 USED_REX (0);
14444 if (rex)
14445 oappend (names8rex[modrm.reg + add]);
14446 else
14447 oappend (names8[modrm.reg + add]);
14448 break;
14449 case w_mode:
14450 oappend (names16[modrm.reg + add]);
14451 break;
14452 case d_mode:
14453 case db_mode:
14454 case dw_mode:
14455 oappend (names32[modrm.reg + add]);
14456 break;
14457 case q_mode:
14458 oappend (names64[modrm.reg + add]);
14459 break;
14460 case bnd_mode:
14461 if (modrm.reg > 0x3)
14462 {
14463 oappend ("(bad)");
14464 return;
14465 }
14466 oappend (names_bnd[modrm.reg]);
14467 break;
14468 case v_mode:
14469 case dq_mode:
14470 case dqb_mode:
14471 case dqd_mode:
14472 case dqw_mode:
14473 USED_REX (REX_W);
14474 if (rex & REX_W)
14475 oappend (names64[modrm.reg + add]);
14476 else
14477 {
14478 if ((sizeflag & DFLAG) || bytemode != v_mode)
14479 oappend (names32[modrm.reg + add]);
14480 else
14481 oappend (names16[modrm.reg + add]);
14482 used_prefixes |= (prefixes & PREFIX_DATA);
14483 }
14484 break;
14485 case va_mode:
14486 names = (address_mode == mode_64bit
14487 ? names64 : names32);
14488 if (!(prefixes & PREFIX_ADDR))
14489 {
14490 if (address_mode == mode_16bit)
14491 names = names16;
14492 }
14493 else
14494 {
14495 /* Remove "addr16/addr32". */
14496 all_prefixes[last_addr_prefix] = 0;
14497 names = (address_mode != mode_32bit
14498 ? names32 : names16);
14499 used_prefixes |= PREFIX_ADDR;
14500 }
14501 oappend (names[modrm.reg + add]);
14502 break;
14503 case m_mode:
14504 if (address_mode == mode_64bit)
14505 oappend (names64[modrm.reg + add]);
14506 else
14507 oappend (names32[modrm.reg + add]);
14508 break;
14509 case mask_bd_mode:
14510 case mask_mode:
14511 if ((modrm.reg + add) > 0x7)
14512 {
14513 oappend ("(bad)");
14514 return;
14515 }
14516 oappend (names_mask[modrm.reg + add]);
14517 break;
14518 default:
14519 oappend (INTERNAL_DISASSEMBLER_ERROR);
14520 break;
14521 }
14522 }
14523
14524 static bfd_vma
14525 get64 (void)
14526 {
14527 bfd_vma x;
14528 #ifdef BFD64
14529 unsigned int a;
14530 unsigned int b;
14531
14532 FETCH_DATA (the_info, codep + 8);
14533 a = *codep++ & 0xff;
14534 a |= (*codep++ & 0xff) << 8;
14535 a |= (*codep++ & 0xff) << 16;
14536 a |= (*codep++ & 0xffu) << 24;
14537 b = *codep++ & 0xff;
14538 b |= (*codep++ & 0xff) << 8;
14539 b |= (*codep++ & 0xff) << 16;
14540 b |= (*codep++ & 0xffu) << 24;
14541 x = a + ((bfd_vma) b << 32);
14542 #else
14543 abort ();
14544 x = 0;
14545 #endif
14546 return x;
14547 }
14548
14549 static bfd_signed_vma
14550 get32 (void)
14551 {
14552 bfd_signed_vma x = 0;
14553
14554 FETCH_DATA (the_info, codep + 4);
14555 x = *codep++ & (bfd_signed_vma) 0xff;
14556 x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
14557 x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
14558 x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
14559 return x;
14560 }
14561
14562 static bfd_signed_vma
14563 get32s (void)
14564 {
14565 bfd_signed_vma x = 0;
14566
14567 FETCH_DATA (the_info, codep + 4);
14568 x = *codep++ & (bfd_signed_vma) 0xff;
14569 x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
14570 x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
14571 x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
14572
14573 x = (x ^ ((bfd_signed_vma) 1 << 31)) - ((bfd_signed_vma) 1 << 31);
14574
14575 return x;
14576 }
14577
14578 static int
14579 get16 (void)
14580 {
14581 int x = 0;
14582
14583 FETCH_DATA (the_info, codep + 2);
14584 x = *codep++ & 0xff;
14585 x |= (*codep++ & 0xff) << 8;
14586 return x;
14587 }
14588
14589 static void
14590 set_op (bfd_vma op, int riprel)
14591 {
14592 op_index[op_ad] = op_ad;
14593 if (address_mode == mode_64bit)
14594 {
14595 op_address[op_ad] = op;
14596 op_riprel[op_ad] = riprel;
14597 }
14598 else
14599 {
14600 /* Mask to get a 32-bit address. */
14601 op_address[op_ad] = op & 0xffffffff;
14602 op_riprel[op_ad] = riprel & 0xffffffff;
14603 }
14604 }
14605
14606 static void
14607 OP_REG (int code, int sizeflag)
14608 {
14609 const char *s;
14610 int add;
14611
14612 switch (code)
14613 {
14614 case es_reg: case ss_reg: case cs_reg:
14615 case ds_reg: case fs_reg: case gs_reg:
14616 oappend (names_seg[code - es_reg]);
14617 return;
14618 }
14619
14620 USED_REX (REX_B);
14621 if (rex & REX_B)
14622 add = 8;
14623 else
14624 add = 0;
14625
14626 switch (code)
14627 {
14628 case ax_reg: case cx_reg: case dx_reg: case bx_reg:
14629 case sp_reg: case bp_reg: case si_reg: case di_reg:
14630 s = names16[code - ax_reg + add];
14631 break;
14632 case al_reg: case ah_reg: case cl_reg: case ch_reg:
14633 case dl_reg: case dh_reg: case bl_reg: case bh_reg:
14634 USED_REX (0);
14635 if (rex)
14636 s = names8rex[code - al_reg + add];
14637 else
14638 s = names8[code - al_reg];
14639 break;
14640 case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
14641 case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
14642 if (address_mode == mode_64bit
14643 && ((sizeflag & DFLAG) || (rex & REX_W)))
14644 {
14645 s = names64[code - rAX_reg + add];
14646 break;
14647 }
14648 code += eAX_reg - rAX_reg;
14649 /* Fall through. */
14650 case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
14651 case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
14652 USED_REX (REX_W);
14653 if (rex & REX_W)
14654 s = names64[code - eAX_reg + add];
14655 else
14656 {
14657 if (sizeflag & DFLAG)
14658 s = names32[code - eAX_reg + add];
14659 else
14660 s = names16[code - eAX_reg + add];
14661 used_prefixes |= (prefixes & PREFIX_DATA);
14662 }
14663 break;
14664 default:
14665 s = INTERNAL_DISASSEMBLER_ERROR;
14666 break;
14667 }
14668 oappend (s);
14669 }
14670
14671 static void
14672 OP_IMREG (int code, int sizeflag)
14673 {
14674 const char *s;
14675
14676 switch (code)
14677 {
14678 case indir_dx_reg:
14679 if (intel_syntax)
14680 s = "dx";
14681 else
14682 s = "(%dx)";
14683 break;
14684 case ax_reg: case cx_reg: case dx_reg: case bx_reg:
14685 case sp_reg: case bp_reg: case si_reg: case di_reg:
14686 s = names16[code - ax_reg];
14687 break;
14688 case es_reg: case ss_reg: case cs_reg:
14689 case ds_reg: case fs_reg: case gs_reg:
14690 s = names_seg[code - es_reg];
14691 break;
14692 case al_reg: case ah_reg: case cl_reg: case ch_reg:
14693 case dl_reg: case dh_reg: case bl_reg: case bh_reg:
14694 USED_REX (0);
14695 if (rex)
14696 s = names8rex[code - al_reg];
14697 else
14698 s = names8[code - al_reg];
14699 break;
14700 case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
14701 case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
14702 USED_REX (REX_W);
14703 if (rex & REX_W)
14704 s = names64[code - eAX_reg];
14705 else
14706 {
14707 if (sizeflag & DFLAG)
14708 s = names32[code - eAX_reg];
14709 else
14710 s = names16[code - eAX_reg];
14711 used_prefixes |= (prefixes & PREFIX_DATA);
14712 }
14713 break;
14714 case z_mode_ax_reg:
14715 if ((rex & REX_W) || (sizeflag & DFLAG))
14716 s = *names32;
14717 else
14718 s = *names16;
14719 if (!(rex & REX_W))
14720 used_prefixes |= (prefixes & PREFIX_DATA);
14721 break;
14722 default:
14723 s = INTERNAL_DISASSEMBLER_ERROR;
14724 break;
14725 }
14726 oappend (s);
14727 }
14728
14729 static void
14730 OP_I (int bytemode, int sizeflag)
14731 {
14732 bfd_signed_vma op;
14733 bfd_signed_vma mask = -1;
14734
14735 switch (bytemode)
14736 {
14737 case b_mode:
14738 FETCH_DATA (the_info, codep + 1);
14739 op = *codep++;
14740 mask = 0xff;
14741 break;
14742 case q_mode:
14743 if (address_mode == mode_64bit)
14744 {
14745 op = get32s ();
14746 break;
14747 }
14748 /* Fall through. */
14749 case v_mode:
14750 USED_REX (REX_W);
14751 if (rex & REX_W)
14752 op = get32s ();
14753 else
14754 {
14755 if (sizeflag & DFLAG)
14756 {
14757 op = get32 ();
14758 mask = 0xffffffff;
14759 }
14760 else
14761 {
14762 op = get16 ();
14763 mask = 0xfffff;
14764 }
14765 used_prefixes |= (prefixes & PREFIX_DATA);
14766 }
14767 break;
14768 case w_mode:
14769 mask = 0xfffff;
14770 op = get16 ();
14771 break;
14772 case const_1_mode:
14773 if (intel_syntax)
14774 oappend ("1");
14775 return;
14776 default:
14777 oappend (INTERNAL_DISASSEMBLER_ERROR);
14778 return;
14779 }
14780
14781 op &= mask;
14782 scratchbuf[0] = '$';
14783 print_operand_value (scratchbuf + 1, 1, op);
14784 oappend_maybe_intel (scratchbuf);
14785 scratchbuf[0] = '\0';
14786 }
14787
14788 static void
14789 OP_I64 (int bytemode, int sizeflag)
14790 {
14791 bfd_signed_vma op;
14792 bfd_signed_vma mask = -1;
14793
14794 if (address_mode != mode_64bit)
14795 {
14796 OP_I (bytemode, sizeflag);
14797 return;
14798 }
14799
14800 switch (bytemode)
14801 {
14802 case b_mode:
14803 FETCH_DATA (the_info, codep + 1);
14804 op = *codep++;
14805 mask = 0xff;
14806 break;
14807 case v_mode:
14808 USED_REX (REX_W);
14809 if (rex & REX_W)
14810 op = get64 ();
14811 else
14812 {
14813 if (sizeflag & DFLAG)
14814 {
14815 op = get32 ();
14816 mask = 0xffffffff;
14817 }
14818 else
14819 {
14820 op = get16 ();
14821 mask = 0xfffff;
14822 }
14823 used_prefixes |= (prefixes & PREFIX_DATA);
14824 }
14825 break;
14826 case w_mode:
14827 mask = 0xfffff;
14828 op = get16 ();
14829 break;
14830 default:
14831 oappend (INTERNAL_DISASSEMBLER_ERROR);
14832 return;
14833 }
14834
14835 op &= mask;
14836 scratchbuf[0] = '$';
14837 print_operand_value (scratchbuf + 1, 1, op);
14838 oappend_maybe_intel (scratchbuf);
14839 scratchbuf[0] = '\0';
14840 }
14841
14842 static void
14843 OP_sI (int bytemode, int sizeflag)
14844 {
14845 bfd_signed_vma op;
14846
14847 switch (bytemode)
14848 {
14849 case b_mode:
14850 case b_T_mode:
14851 FETCH_DATA (the_info, codep + 1);
14852 op = *codep++;
14853 if ((op & 0x80) != 0)
14854 op -= 0x100;
14855 if (bytemode == b_T_mode)
14856 {
14857 if (address_mode != mode_64bit
14858 || !((sizeflag & DFLAG) || (rex & REX_W)))
14859 {
14860 /* The operand-size prefix is overridden by a REX prefix. */
14861 if ((sizeflag & DFLAG) || (rex & REX_W))
14862 op &= 0xffffffff;
14863 else
14864 op &= 0xffff;
14865 }
14866 }
14867 else
14868 {
14869 if (!(rex & REX_W))
14870 {
14871 if (sizeflag & DFLAG)
14872 op &= 0xffffffff;
14873 else
14874 op &= 0xffff;
14875 }
14876 }
14877 break;
14878 case v_mode:
14879 /* The operand-size prefix is overridden by a REX prefix. */
14880 if ((sizeflag & DFLAG) || (rex & REX_W))
14881 op = get32s ();
14882 else
14883 op = get16 ();
14884 break;
14885 default:
14886 oappend (INTERNAL_DISASSEMBLER_ERROR);
14887 return;
14888 }
14889
14890 scratchbuf[0] = '$';
14891 print_operand_value (scratchbuf + 1, 1, op);
14892 oappend_maybe_intel (scratchbuf);
14893 }
14894
14895 static void
14896 OP_J (int bytemode, int sizeflag)
14897 {
14898 bfd_vma disp;
14899 bfd_vma mask = -1;
14900 bfd_vma segment = 0;
14901
14902 switch (bytemode)
14903 {
14904 case b_mode:
14905 FETCH_DATA (the_info, codep + 1);
14906 disp = *codep++;
14907 if ((disp & 0x80) != 0)
14908 disp -= 0x100;
14909 break;
14910 case v_mode:
14911 if (isa64 == amd64)
14912 USED_REX (REX_W);
14913 if ((sizeflag & DFLAG)
14914 || (address_mode == mode_64bit
14915 && (isa64 != amd64 || (rex & REX_W))))
14916 disp = get32s ();
14917 else
14918 {
14919 disp = get16 ();
14920 if ((disp & 0x8000) != 0)
14921 disp -= 0x10000;
14922 /* In 16bit mode, address is wrapped around at 64k within
14923 the same segment. Otherwise, a data16 prefix on a jump
14924 instruction means that the pc is masked to 16 bits after
14925 the displacement is added! */
14926 mask = 0xffff;
14927 if ((prefixes & PREFIX_DATA) == 0)
14928 segment = ((start_pc + (codep - start_codep))
14929 & ~((bfd_vma) 0xffff));
14930 }
14931 if (address_mode != mode_64bit
14932 || (isa64 == amd64 && !(rex & REX_W)))
14933 used_prefixes |= (prefixes & PREFIX_DATA);
14934 break;
14935 default:
14936 oappend (INTERNAL_DISASSEMBLER_ERROR);
14937 return;
14938 }
14939 disp = ((start_pc + (codep - start_codep) + disp) & mask) | segment;
14940 set_op (disp, 0);
14941 print_operand_value (scratchbuf, 1, disp);
14942 oappend (scratchbuf);
14943 }
14944
14945 static void
14946 OP_SEG (int bytemode, int sizeflag)
14947 {
14948 if (bytemode == w_mode)
14949 oappend (names_seg[modrm.reg]);
14950 else
14951 OP_E (modrm.mod == 3 ? bytemode : w_mode, sizeflag);
14952 }
14953
14954 static void
14955 OP_DIR (int dummy ATTRIBUTE_UNUSED, int sizeflag)
14956 {
14957 int seg, offset;
14958
14959 if (sizeflag & DFLAG)
14960 {
14961 offset = get32 ();
14962 seg = get16 ();
14963 }
14964 else
14965 {
14966 offset = get16 ();
14967 seg = get16 ();
14968 }
14969 used_prefixes |= (prefixes & PREFIX_DATA);
14970 if (intel_syntax)
14971 sprintf (scratchbuf, "0x%x:0x%x", seg, offset);
14972 else
14973 sprintf (scratchbuf, "$0x%x,$0x%x", seg, offset);
14974 oappend (scratchbuf);
14975 }
14976
14977 static void
14978 OP_OFF (int bytemode, int sizeflag)
14979 {
14980 bfd_vma off;
14981
14982 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
14983 intel_operand_size (bytemode, sizeflag);
14984 append_seg ();
14985
14986 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
14987 off = get32 ();
14988 else
14989 off = get16 ();
14990
14991 if (intel_syntax)
14992 {
14993 if (!active_seg_prefix)
14994 {
14995 oappend (names_seg[ds_reg - es_reg]);
14996 oappend (":");
14997 }
14998 }
14999 print_operand_value (scratchbuf, 1, off);
15000 oappend (scratchbuf);
15001 }
15002
15003 static void
15004 OP_OFF64 (int bytemode, int sizeflag)
15005 {
15006 bfd_vma off;
15007
15008 if (address_mode != mode_64bit
15009 || (prefixes & PREFIX_ADDR))
15010 {
15011 OP_OFF (bytemode, sizeflag);
15012 return;
15013 }
15014
15015 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
15016 intel_operand_size (bytemode, sizeflag);
15017 append_seg ();
15018
15019 off = get64 ();
15020
15021 if (intel_syntax)
15022 {
15023 if (!active_seg_prefix)
15024 {
15025 oappend (names_seg[ds_reg - es_reg]);
15026 oappend (":");
15027 }
15028 }
15029 print_operand_value (scratchbuf, 1, off);
15030 oappend (scratchbuf);
15031 }
15032
15033 static void
15034 ptr_reg (int code, int sizeflag)
15035 {
15036 const char *s;
15037
15038 *obufp++ = open_char;
15039 used_prefixes |= (prefixes & PREFIX_ADDR);
15040 if (address_mode == mode_64bit)
15041 {
15042 if (!(sizeflag & AFLAG))
15043 s = names32[code - eAX_reg];
15044 else
15045 s = names64[code - eAX_reg];
15046 }
15047 else if (sizeflag & AFLAG)
15048 s = names32[code - eAX_reg];
15049 else
15050 s = names16[code - eAX_reg];
15051 oappend (s);
15052 *obufp++ = close_char;
15053 *obufp = 0;
15054 }
15055
15056 static void
15057 OP_ESreg (int code, int sizeflag)
15058 {
15059 if (intel_syntax)
15060 {
15061 switch (codep[-1])
15062 {
15063 case 0x6d: /* insw/insl */
15064 intel_operand_size (z_mode, sizeflag);
15065 break;
15066 case 0xa5: /* movsw/movsl/movsq */
15067 case 0xa7: /* cmpsw/cmpsl/cmpsq */
15068 case 0xab: /* stosw/stosl */
15069 case 0xaf: /* scasw/scasl */
15070 intel_operand_size (v_mode, sizeflag);
15071 break;
15072 default:
15073 intel_operand_size (b_mode, sizeflag);
15074 }
15075 }
15076 oappend_maybe_intel ("%es:");
15077 ptr_reg (code, sizeflag);
15078 }
15079
15080 static void
15081 OP_DSreg (int code, int sizeflag)
15082 {
15083 if (intel_syntax)
15084 {
15085 switch (codep[-1])
15086 {
15087 case 0x6f: /* outsw/outsl */
15088 intel_operand_size (z_mode, sizeflag);
15089 break;
15090 case 0xa5: /* movsw/movsl/movsq */
15091 case 0xa7: /* cmpsw/cmpsl/cmpsq */
15092 case 0xad: /* lodsw/lodsl/lodsq */
15093 intel_operand_size (v_mode, sizeflag);
15094 break;
15095 default:
15096 intel_operand_size (b_mode, sizeflag);
15097 }
15098 }
15099 /* Set active_seg_prefix to PREFIX_DS if it is unset so that the
15100 default segment register DS is printed. */
15101 if (!active_seg_prefix)
15102 active_seg_prefix = PREFIX_DS;
15103 append_seg ();
15104 ptr_reg (code, sizeflag);
15105 }
15106
15107 static void
15108 OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15109 {
15110 int add;
15111 if (rex & REX_R)
15112 {
15113 USED_REX (REX_R);
15114 add = 8;
15115 }
15116 else if (address_mode != mode_64bit && (prefixes & PREFIX_LOCK))
15117 {
15118 all_prefixes[last_lock_prefix] = 0;
15119 used_prefixes |= PREFIX_LOCK;
15120 add = 8;
15121 }
15122 else
15123 add = 0;
15124 sprintf (scratchbuf, "%%cr%d", modrm.reg + add);
15125 oappend_maybe_intel (scratchbuf);
15126 }
15127
15128 static void
15129 OP_D (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15130 {
15131 int add;
15132 USED_REX (REX_R);
15133 if (rex & REX_R)
15134 add = 8;
15135 else
15136 add = 0;
15137 if (intel_syntax)
15138 sprintf (scratchbuf, "db%d", modrm.reg + add);
15139 else
15140 sprintf (scratchbuf, "%%db%d", modrm.reg + add);
15141 oappend (scratchbuf);
15142 }
15143
15144 static void
15145 OP_T (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15146 {
15147 sprintf (scratchbuf, "%%tr%d", modrm.reg);
15148 oappend_maybe_intel (scratchbuf);
15149 }
15150
15151 static void
15152 OP_R (int bytemode, int sizeflag)
15153 {
15154 /* Skip mod/rm byte. */
15155 MODRM_CHECK;
15156 codep++;
15157 OP_E_register (bytemode, sizeflag);
15158 }
15159
15160 static void
15161 OP_MMX (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15162 {
15163 int reg = modrm.reg;
15164 const char **names;
15165
15166 used_prefixes |= (prefixes & PREFIX_DATA);
15167 if (prefixes & PREFIX_DATA)
15168 {
15169 names = names_xmm;
15170 USED_REX (REX_R);
15171 if (rex & REX_R)
15172 reg += 8;
15173 }
15174 else
15175 names = names_mm;
15176 oappend (names[reg]);
15177 }
15178
15179 static void
15180 OP_XMM (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
15181 {
15182 int reg = modrm.reg;
15183 const char **names;
15184
15185 USED_REX (REX_R);
15186 if (rex & REX_R)
15187 reg += 8;
15188 if (vex.evex)
15189 {
15190 if (!vex.r)
15191 reg += 16;
15192 }
15193
15194 if (need_vex
15195 && bytemode != xmm_mode
15196 && bytemode != xmmq_mode
15197 && bytemode != evex_half_bcst_xmmq_mode
15198 && bytemode != ymm_mode
15199 && bytemode != scalar_mode)
15200 {
15201 switch (vex.length)
15202 {
15203 case 128:
15204 names = names_xmm;
15205 break;
15206 case 256:
15207 if (vex.w
15208 || (bytemode != vex_vsib_q_w_dq_mode
15209 && bytemode != vex_vsib_q_w_d_mode))
15210 names = names_ymm;
15211 else
15212 names = names_xmm;
15213 break;
15214 case 512:
15215 names = names_zmm;
15216 break;
15217 default:
15218 abort ();
15219 }
15220 }
15221 else if (bytemode == xmmq_mode
15222 || bytemode == evex_half_bcst_xmmq_mode)
15223 {
15224 switch (vex.length)
15225 {
15226 case 128:
15227 case 256:
15228 names = names_xmm;
15229 break;
15230 case 512:
15231 names = names_ymm;
15232 break;
15233 default:
15234 abort ();
15235 }
15236 }
15237 else if (bytemode == ymm_mode)
15238 names = names_ymm;
15239 else
15240 names = names_xmm;
15241 oappend (names[reg]);
15242 }
15243
15244 static void
15245 OP_EM (int bytemode, int sizeflag)
15246 {
15247 int reg;
15248 const char **names;
15249
15250 if (modrm.mod != 3)
15251 {
15252 if (intel_syntax
15253 && (bytemode == v_mode || bytemode == v_swap_mode))
15254 {
15255 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
15256 used_prefixes |= (prefixes & PREFIX_DATA);
15257 }
15258 OP_E (bytemode, sizeflag);
15259 return;
15260 }
15261
15262 if ((sizeflag & SUFFIX_ALWAYS) && bytemode == v_swap_mode)
15263 swap_operand ();
15264
15265 /* Skip mod/rm byte. */
15266 MODRM_CHECK;
15267 codep++;
15268 used_prefixes |= (prefixes & PREFIX_DATA);
15269 reg = modrm.rm;
15270 if (prefixes & PREFIX_DATA)
15271 {
15272 names = names_xmm;
15273 USED_REX (REX_B);
15274 if (rex & REX_B)
15275 reg += 8;
15276 }
15277 else
15278 names = names_mm;
15279 oappend (names[reg]);
15280 }
15281
15282 /* cvt* are the only instructions in sse2 which have
15283 both SSE and MMX operands and also have 0x66 prefix
15284 in their opcode. 0x66 was originally used to differentiate
15285 between SSE and MMX instruction(operands). So we have to handle the
15286 cvt* separately using OP_EMC and OP_MXC */
15287 static void
15288 OP_EMC (int bytemode, int sizeflag)
15289 {
15290 if (modrm.mod != 3)
15291 {
15292 if (intel_syntax && bytemode == v_mode)
15293 {
15294 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
15295 used_prefixes |= (prefixes & PREFIX_DATA);
15296 }
15297 OP_E (bytemode, sizeflag);
15298 return;
15299 }
15300
15301 /* Skip mod/rm byte. */
15302 MODRM_CHECK;
15303 codep++;
15304 used_prefixes |= (prefixes & PREFIX_DATA);
15305 oappend (names_mm[modrm.rm]);
15306 }
15307
15308 static void
15309 OP_MXC (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15310 {
15311 used_prefixes |= (prefixes & PREFIX_DATA);
15312 oappend (names_mm[modrm.reg]);
15313 }
15314
15315 static void
15316 OP_EX (int bytemode, int sizeflag)
15317 {
15318 int reg;
15319 const char **names;
15320
15321 /* Skip mod/rm byte. */
15322 MODRM_CHECK;
15323 codep++;
15324
15325 if (modrm.mod != 3)
15326 {
15327 OP_E_memory (bytemode, sizeflag);
15328 return;
15329 }
15330
15331 reg = modrm.rm;
15332 USED_REX (REX_B);
15333 if (rex & REX_B)
15334 reg += 8;
15335 if (vex.evex)
15336 {
15337 USED_REX (REX_X);
15338 if ((rex & REX_X))
15339 reg += 16;
15340 }
15341
15342 if ((sizeflag & SUFFIX_ALWAYS)
15343 && (bytemode == x_swap_mode
15344 || bytemode == d_swap_mode
15345 || bytemode == d_scalar_swap_mode
15346 || bytemode == q_swap_mode
15347 || bytemode == q_scalar_swap_mode))
15348 swap_operand ();
15349
15350 if (need_vex
15351 && bytemode != xmm_mode
15352 && bytemode != xmmdw_mode
15353 && bytemode != xmmqd_mode
15354 && bytemode != xmm_mb_mode
15355 && bytemode != xmm_mw_mode
15356 && bytemode != xmm_md_mode
15357 && bytemode != xmm_mq_mode
15358 && bytemode != xmm_mdq_mode
15359 && bytemode != xmmq_mode
15360 && bytemode != evex_half_bcst_xmmq_mode
15361 && bytemode != ymm_mode
15362 && bytemode != d_scalar_mode
15363 && bytemode != d_scalar_swap_mode
15364 && bytemode != q_scalar_mode
15365 && bytemode != q_scalar_swap_mode
15366 && bytemode != vex_scalar_w_dq_mode)
15367 {
15368 switch (vex.length)
15369 {
15370 case 128:
15371 names = names_xmm;
15372 break;
15373 case 256:
15374 names = names_ymm;
15375 break;
15376 case 512:
15377 names = names_zmm;
15378 break;
15379 default:
15380 abort ();
15381 }
15382 }
15383 else if (bytemode == xmmq_mode
15384 || bytemode == evex_half_bcst_xmmq_mode)
15385 {
15386 switch (vex.length)
15387 {
15388 case 128:
15389 case 256:
15390 names = names_xmm;
15391 break;
15392 case 512:
15393 names = names_ymm;
15394 break;
15395 default:
15396 abort ();
15397 }
15398 }
15399 else if (bytemode == ymm_mode)
15400 names = names_ymm;
15401 else
15402 names = names_xmm;
15403 oappend (names[reg]);
15404 }
15405
15406 static void
15407 OP_MS (int bytemode, int sizeflag)
15408 {
15409 if (modrm.mod == 3)
15410 OP_EM (bytemode, sizeflag);
15411 else
15412 BadOp ();
15413 }
15414
15415 static void
15416 OP_XS (int bytemode, int sizeflag)
15417 {
15418 if (modrm.mod == 3)
15419 OP_EX (bytemode, sizeflag);
15420 else
15421 BadOp ();
15422 }
15423
15424 static void
15425 OP_M (int bytemode, int sizeflag)
15426 {
15427 if (modrm.mod == 3)
15428 /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
15429 BadOp ();
15430 else
15431 OP_E (bytemode, sizeflag);
15432 }
15433
15434 static void
15435 OP_0f07 (int bytemode, int sizeflag)
15436 {
15437 if (modrm.mod != 3 || modrm.rm != 0)
15438 BadOp ();
15439 else
15440 OP_E (bytemode, sizeflag);
15441 }
15442
15443 /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
15444 32bit mode and "xchg %rax,%rax" in 64bit mode. */
15445
15446 static void
15447 NOP_Fixup1 (int bytemode, int sizeflag)
15448 {
15449 if ((prefixes & PREFIX_DATA) != 0
15450 || (rex != 0
15451 && rex != 0x48
15452 && address_mode == mode_64bit))
15453 OP_REG (bytemode, sizeflag);
15454 else
15455 strcpy (obuf, "nop");
15456 }
15457
15458 static void
15459 NOP_Fixup2 (int bytemode, int sizeflag)
15460 {
15461 if ((prefixes & PREFIX_DATA) != 0
15462 || (rex != 0
15463 && rex != 0x48
15464 && address_mode == mode_64bit))
15465 OP_IMREG (bytemode, sizeflag);
15466 }
15467
15468 static const char *const Suffix3DNow[] = {
15469 /* 00 */ NULL, NULL, NULL, NULL,
15470 /* 04 */ NULL, NULL, NULL, NULL,
15471 /* 08 */ NULL, NULL, NULL, NULL,
15472 /* 0C */ "pi2fw", "pi2fd", NULL, NULL,
15473 /* 10 */ NULL, NULL, NULL, NULL,
15474 /* 14 */ NULL, NULL, NULL, NULL,
15475 /* 18 */ NULL, NULL, NULL, NULL,
15476 /* 1C */ "pf2iw", "pf2id", NULL, NULL,
15477 /* 20 */ NULL, NULL, NULL, NULL,
15478 /* 24 */ NULL, NULL, NULL, NULL,
15479 /* 28 */ NULL, NULL, NULL, NULL,
15480 /* 2C */ NULL, NULL, NULL, NULL,
15481 /* 30 */ NULL, NULL, NULL, NULL,
15482 /* 34 */ NULL, NULL, NULL, NULL,
15483 /* 38 */ NULL, NULL, NULL, NULL,
15484 /* 3C */ NULL, NULL, NULL, NULL,
15485 /* 40 */ NULL, NULL, NULL, NULL,
15486 /* 44 */ NULL, NULL, NULL, NULL,
15487 /* 48 */ NULL, NULL, NULL, NULL,
15488 /* 4C */ NULL, NULL, NULL, NULL,
15489 /* 50 */ NULL, NULL, NULL, NULL,
15490 /* 54 */ NULL, NULL, NULL, NULL,
15491 /* 58 */ NULL, NULL, NULL, NULL,
15492 /* 5C */ NULL, NULL, NULL, NULL,
15493 /* 60 */ NULL, NULL, NULL, NULL,
15494 /* 64 */ NULL, NULL, NULL, NULL,
15495 /* 68 */ NULL, NULL, NULL, NULL,
15496 /* 6C */ NULL, NULL, NULL, NULL,
15497 /* 70 */ NULL, NULL, NULL, NULL,
15498 /* 74 */ NULL, NULL, NULL, NULL,
15499 /* 78 */ NULL, NULL, NULL, NULL,
15500 /* 7C */ NULL, NULL, NULL, NULL,
15501 /* 80 */ NULL, NULL, NULL, NULL,
15502 /* 84 */ NULL, NULL, NULL, NULL,
15503 /* 88 */ NULL, NULL, "pfnacc", NULL,
15504 /* 8C */ NULL, NULL, "pfpnacc", NULL,
15505 /* 90 */ "pfcmpge", NULL, NULL, NULL,
15506 /* 94 */ "pfmin", NULL, "pfrcp", "pfrsqrt",
15507 /* 98 */ NULL, NULL, "pfsub", NULL,
15508 /* 9C */ NULL, NULL, "pfadd", NULL,
15509 /* A0 */ "pfcmpgt", NULL, NULL, NULL,
15510 /* A4 */ "pfmax", NULL, "pfrcpit1", "pfrsqit1",
15511 /* A8 */ NULL, NULL, "pfsubr", NULL,
15512 /* AC */ NULL, NULL, "pfacc", NULL,
15513 /* B0 */ "pfcmpeq", NULL, NULL, NULL,
15514 /* B4 */ "pfmul", NULL, "pfrcpit2", "pmulhrw",
15515 /* B8 */ NULL, NULL, NULL, "pswapd",
15516 /* BC */ NULL, NULL, NULL, "pavgusb",
15517 /* C0 */ NULL, NULL, NULL, NULL,
15518 /* C4 */ NULL, NULL, NULL, NULL,
15519 /* C8 */ NULL, NULL, NULL, NULL,
15520 /* CC */ NULL, NULL, NULL, NULL,
15521 /* D0 */ NULL, NULL, NULL, NULL,
15522 /* D4 */ NULL, NULL, NULL, NULL,
15523 /* D8 */ NULL, NULL, NULL, NULL,
15524 /* DC */ NULL, NULL, NULL, NULL,
15525 /* E0 */ NULL, NULL, NULL, NULL,
15526 /* E4 */ NULL, NULL, NULL, NULL,
15527 /* E8 */ NULL, NULL, NULL, NULL,
15528 /* EC */ NULL, NULL, NULL, NULL,
15529 /* F0 */ NULL, NULL, NULL, NULL,
15530 /* F4 */ NULL, NULL, NULL, NULL,
15531 /* F8 */ NULL, NULL, NULL, NULL,
15532 /* FC */ NULL, NULL, NULL, NULL,
15533 };
15534
15535 static void
15536 OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15537 {
15538 const char *mnemonic;
15539
15540 FETCH_DATA (the_info, codep + 1);
15541 /* AMD 3DNow! instructions are specified by an opcode suffix in the
15542 place where an 8-bit immediate would normally go. ie. the last
15543 byte of the instruction. */
15544 obufp = mnemonicendp;
15545 mnemonic = Suffix3DNow[*codep++ & 0xff];
15546 if (mnemonic)
15547 oappend (mnemonic);
15548 else
15549 {
15550 /* Since a variable sized modrm/sib chunk is between the start
15551 of the opcode (0x0f0f) and the opcode suffix, we need to do
15552 all the modrm processing first, and don't know until now that
15553 we have a bad opcode. This necessitates some cleaning up. */
15554 op_out[0][0] = '\0';
15555 op_out[1][0] = '\0';
15556 BadOp ();
15557 }
15558 mnemonicendp = obufp;
15559 }
15560
15561 static struct op simd_cmp_op[] =
15562 {
15563 { STRING_COMMA_LEN ("eq") },
15564 { STRING_COMMA_LEN ("lt") },
15565 { STRING_COMMA_LEN ("le") },
15566 { STRING_COMMA_LEN ("unord") },
15567 { STRING_COMMA_LEN ("neq") },
15568 { STRING_COMMA_LEN ("nlt") },
15569 { STRING_COMMA_LEN ("nle") },
15570 { STRING_COMMA_LEN ("ord") }
15571 };
15572
15573 static void
15574 CMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15575 {
15576 unsigned int cmp_type;
15577
15578 FETCH_DATA (the_info, codep + 1);
15579 cmp_type = *codep++ & 0xff;
15580 if (cmp_type < ARRAY_SIZE (simd_cmp_op))
15581 {
15582 char suffix [3];
15583 char *p = mnemonicendp - 2;
15584 suffix[0] = p[0];
15585 suffix[1] = p[1];
15586 suffix[2] = '\0';
15587 sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
15588 mnemonicendp += simd_cmp_op[cmp_type].len;
15589 }
15590 else
15591 {
15592 /* We have a reserved extension byte. Output it directly. */
15593 scratchbuf[0] = '$';
15594 print_operand_value (scratchbuf + 1, 1, cmp_type);
15595 oappend_maybe_intel (scratchbuf);
15596 scratchbuf[0] = '\0';
15597 }
15598 }
15599
15600 static void
15601 OP_Mwaitx (int bytemode ATTRIBUTE_UNUSED,
15602 int sizeflag ATTRIBUTE_UNUSED)
15603 {
15604 /* mwaitx %eax,%ecx,%ebx */
15605 if (!intel_syntax)
15606 {
15607 const char **names = (address_mode == mode_64bit
15608 ? names64 : names32);
15609 strcpy (op_out[0], names[0]);
15610 strcpy (op_out[1], names[1]);
15611 strcpy (op_out[2], names[3]);
15612 two_source_ops = 1;
15613 }
15614 /* Skip mod/rm byte. */
15615 MODRM_CHECK;
15616 codep++;
15617 }
15618
15619 static void
15620 OP_Mwait (int bytemode ATTRIBUTE_UNUSED,
15621 int sizeflag ATTRIBUTE_UNUSED)
15622 {
15623 /* mwait %eax,%ecx */
15624 if (!intel_syntax)
15625 {
15626 const char **names = (address_mode == mode_64bit
15627 ? names64 : names32);
15628 strcpy (op_out[0], names[0]);
15629 strcpy (op_out[1], names[1]);
15630 two_source_ops = 1;
15631 }
15632 /* Skip mod/rm byte. */
15633 MODRM_CHECK;
15634 codep++;
15635 }
15636
15637 static void
15638 OP_Monitor (int bytemode ATTRIBUTE_UNUSED,
15639 int sizeflag ATTRIBUTE_UNUSED)
15640 {
15641 /* monitor %eax,%ecx,%edx" */
15642 if (!intel_syntax)
15643 {
15644 const char **op1_names;
15645 const char **names = (address_mode == mode_64bit
15646 ? names64 : names32);
15647
15648 if (!(prefixes & PREFIX_ADDR))
15649 op1_names = (address_mode == mode_16bit
15650 ? names16 : names);
15651 else
15652 {
15653 /* Remove "addr16/addr32". */
15654 all_prefixes[last_addr_prefix] = 0;
15655 op1_names = (address_mode != mode_32bit
15656 ? names32 : names16);
15657 used_prefixes |= PREFIX_ADDR;
15658 }
15659 strcpy (op_out[0], op1_names[0]);
15660 strcpy (op_out[1], names[1]);
15661 strcpy (op_out[2], names[2]);
15662 two_source_ops = 1;
15663 }
15664 /* Skip mod/rm byte. */
15665 MODRM_CHECK;
15666 codep++;
15667 }
15668
15669 static void
15670 BadOp (void)
15671 {
15672 /* Throw away prefixes and 1st. opcode byte. */
15673 codep = insn_codep + 1;
15674 oappend ("(bad)");
15675 }
15676
15677 static void
15678 REP_Fixup (int bytemode, int sizeflag)
15679 {
15680 /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
15681 lods and stos. */
15682 if (prefixes & PREFIX_REPZ)
15683 all_prefixes[last_repz_prefix] = REP_PREFIX;
15684
15685 switch (bytemode)
15686 {
15687 case al_reg:
15688 case eAX_reg:
15689 case indir_dx_reg:
15690 OP_IMREG (bytemode, sizeflag);
15691 break;
15692 case eDI_reg:
15693 OP_ESreg (bytemode, sizeflag);
15694 break;
15695 case eSI_reg:
15696 OP_DSreg (bytemode, sizeflag);
15697 break;
15698 default:
15699 abort ();
15700 break;
15701 }
15702 }
15703
15704 /* For BND-prefixed instructions 0xF2 prefix should be displayed as
15705 "bnd". */
15706
15707 static void
15708 BND_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15709 {
15710 if (prefixes & PREFIX_REPNZ)
15711 all_prefixes[last_repnz_prefix] = BND_PREFIX;
15712 }
15713
15714 /* For NOTRACK-prefixed instructions, 0x3E prefix should be displayed as
15715 "notrack". */
15716
15717 static void
15718 NOTRACK_Fixup (int bytemode ATTRIBUTE_UNUSED,
15719 int sizeflag ATTRIBUTE_UNUSED)
15720 {
15721 if (active_seg_prefix == PREFIX_DS
15722 && (address_mode != mode_64bit || last_data_prefix < 0))
15723 {
15724 /* NOTRACK prefix is only valid on indirect branch instructions.
15725 NB: DATA prefix is unsupported for Intel64. */
15726 active_seg_prefix = 0;
15727 all_prefixes[last_seg_prefix] = NOTRACK_PREFIX;
15728 }
15729 }
15730
15731 /* Similar to OP_E. But the 0xf2/0xf3 prefixes should be displayed as
15732 "xacquire"/"xrelease" for memory operand if there is a LOCK prefix.
15733 */
15734
15735 static void
15736 HLE_Fixup1 (int bytemode, int sizeflag)
15737 {
15738 if (modrm.mod != 3
15739 && (prefixes & PREFIX_LOCK) != 0)
15740 {
15741 if (prefixes & PREFIX_REPZ)
15742 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
15743 if (prefixes & PREFIX_REPNZ)
15744 all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
15745 }
15746
15747 OP_E (bytemode, sizeflag);
15748 }
15749
15750 /* Similar to OP_E. But the 0xf2/0xf3 prefixes should be displayed as
15751 "xacquire"/"xrelease" for memory operand. No check for LOCK prefix.
15752 */
15753
15754 static void
15755 HLE_Fixup2 (int bytemode, int sizeflag)
15756 {
15757 if (modrm.mod != 3)
15758 {
15759 if (prefixes & PREFIX_REPZ)
15760 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
15761 if (prefixes & PREFIX_REPNZ)
15762 all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
15763 }
15764
15765 OP_E (bytemode, sizeflag);
15766 }
15767
15768 /* Similar to OP_E. But the 0xf3 prefixes should be displayed as
15769 "xrelease" for memory operand. No check for LOCK prefix. */
15770
15771 static void
15772 HLE_Fixup3 (int bytemode, int sizeflag)
15773 {
15774 if (modrm.mod != 3
15775 && last_repz_prefix > last_repnz_prefix
15776 && (prefixes & PREFIX_REPZ) != 0)
15777 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
15778
15779 OP_E (bytemode, sizeflag);
15780 }
15781
15782 static void
15783 CMPXCHG8B_Fixup (int bytemode, int sizeflag)
15784 {
15785 USED_REX (REX_W);
15786 if (rex & REX_W)
15787 {
15788 /* Change cmpxchg8b to cmpxchg16b. */
15789 char *p = mnemonicendp - 2;
15790 mnemonicendp = stpcpy (p, "16b");
15791 bytemode = o_mode;
15792 }
15793 else if ((prefixes & PREFIX_LOCK) != 0)
15794 {
15795 if (prefixes & PREFIX_REPZ)
15796 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
15797 if (prefixes & PREFIX_REPNZ)
15798 all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
15799 }
15800
15801 OP_M (bytemode, sizeflag);
15802 }
15803
15804 static void
15805 XMM_Fixup (int reg, int sizeflag ATTRIBUTE_UNUSED)
15806 {
15807 const char **names;
15808
15809 if (need_vex)
15810 {
15811 switch (vex.length)
15812 {
15813 case 128:
15814 names = names_xmm;
15815 break;
15816 case 256:
15817 names = names_ymm;
15818 break;
15819 default:
15820 abort ();
15821 }
15822 }
15823 else
15824 names = names_xmm;
15825 oappend (names[reg]);
15826 }
15827
15828 static void
15829 CRC32_Fixup (int bytemode, int sizeflag)
15830 {
15831 /* Add proper suffix to "crc32". */
15832 char *p = mnemonicendp;
15833
15834 switch (bytemode)
15835 {
15836 case b_mode:
15837 if (intel_syntax)
15838 goto skip;
15839
15840 *p++ = 'b';
15841 break;
15842 case v_mode:
15843 if (intel_syntax)
15844 goto skip;
15845
15846 USED_REX (REX_W);
15847 if (rex & REX_W)
15848 *p++ = 'q';
15849 else
15850 {
15851 if (sizeflag & DFLAG)
15852 *p++ = 'l';
15853 else
15854 *p++ = 'w';
15855 used_prefixes |= (prefixes & PREFIX_DATA);
15856 }
15857 break;
15858 default:
15859 oappend (INTERNAL_DISASSEMBLER_ERROR);
15860 break;
15861 }
15862 mnemonicendp = p;
15863 *p = '\0';
15864
15865 skip:
15866 if (modrm.mod == 3)
15867 {
15868 int add;
15869
15870 /* Skip mod/rm byte. */
15871 MODRM_CHECK;
15872 codep++;
15873
15874 USED_REX (REX_B);
15875 add = (rex & REX_B) ? 8 : 0;
15876 if (bytemode == b_mode)
15877 {
15878 USED_REX (0);
15879 if (rex)
15880 oappend (names8rex[modrm.rm + add]);
15881 else
15882 oappend (names8[modrm.rm + add]);
15883 }
15884 else
15885 {
15886 USED_REX (REX_W);
15887 if (rex & REX_W)
15888 oappend (names64[modrm.rm + add]);
15889 else if ((prefixes & PREFIX_DATA))
15890 oappend (names16[modrm.rm + add]);
15891 else
15892 oappend (names32[modrm.rm + add]);
15893 }
15894 }
15895 else
15896 OP_E (bytemode, sizeflag);
15897 }
15898
15899 static void
15900 FXSAVE_Fixup (int bytemode, int sizeflag)
15901 {
15902 /* Add proper suffix to "fxsave" and "fxrstor". */
15903 USED_REX (REX_W);
15904 if (rex & REX_W)
15905 {
15906 char *p = mnemonicendp;
15907 *p++ = '6';
15908 *p++ = '4';
15909 *p = '\0';
15910 mnemonicendp = p;
15911 }
15912 OP_M (bytemode, sizeflag);
15913 }
15914
15915 static void
15916 PCMPESTR_Fixup (int bytemode, int sizeflag)
15917 {
15918 /* Add proper suffix to "{,v}pcmpestr{i,m}". */
15919 if (!intel_syntax)
15920 {
15921 char *p = mnemonicendp;
15922
15923 USED_REX (REX_W);
15924 if (rex & REX_W)
15925 *p++ = 'q';
15926 else if (sizeflag & SUFFIX_ALWAYS)
15927 *p++ = 'l';
15928
15929 *p = '\0';
15930 mnemonicendp = p;
15931 }
15932
15933 OP_EX (bytemode, sizeflag);
15934 }
15935
15936 /* Display the destination register operand for instructions with
15937 VEX. */
15938
15939 static void
15940 OP_VEX (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
15941 {
15942 int reg;
15943 const char **names;
15944
15945 if (!need_vex)
15946 abort ();
15947
15948 if (!need_vex_reg)
15949 return;
15950
15951 reg = vex.register_specifier;
15952 vex.register_specifier = 0;
15953 if (address_mode != mode_64bit)
15954 reg &= 7;
15955 else if (vex.evex && !vex.v)
15956 reg += 16;
15957
15958 if (bytemode == vex_scalar_mode)
15959 {
15960 oappend (names_xmm[reg]);
15961 return;
15962 }
15963
15964 switch (vex.length)
15965 {
15966 case 128:
15967 switch (bytemode)
15968 {
15969 case vex_mode:
15970 case vex128_mode:
15971 case vex_vsib_q_w_dq_mode:
15972 case vex_vsib_q_w_d_mode:
15973 names = names_xmm;
15974 break;
15975 case dq_mode:
15976 if (rex & REX_W)
15977 names = names64;
15978 else
15979 names = names32;
15980 break;
15981 case mask_bd_mode:
15982 case mask_mode:
15983 if (reg > 0x7)
15984 {
15985 oappend ("(bad)");
15986 return;
15987 }
15988 names = names_mask;
15989 break;
15990 default:
15991 abort ();
15992 return;
15993 }
15994 break;
15995 case 256:
15996 switch (bytemode)
15997 {
15998 case vex_mode:
15999 case vex256_mode:
16000 names = names_ymm;
16001 break;
16002 case vex_vsib_q_w_dq_mode:
16003 case vex_vsib_q_w_d_mode:
16004 names = vex.w ? names_ymm : names_xmm;
16005 break;
16006 case mask_bd_mode:
16007 case mask_mode:
16008 if (reg > 0x7)
16009 {
16010 oappend ("(bad)");
16011 return;
16012 }
16013 names = names_mask;
16014 break;
16015 default:
16016 /* See PR binutils/20893 for a reproducer. */
16017 oappend ("(bad)");
16018 return;
16019 }
16020 break;
16021 case 512:
16022 names = names_zmm;
16023 break;
16024 default:
16025 abort ();
16026 break;
16027 }
16028 oappend (names[reg]);
16029 }
16030
16031 /* Get the VEX immediate byte without moving codep. */
16032
16033 static unsigned char
16034 get_vex_imm8 (int sizeflag, int opnum)
16035 {
16036 int bytes_before_imm = 0;
16037
16038 if (modrm.mod != 3)
16039 {
16040 /* There are SIB/displacement bytes. */
16041 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
16042 {
16043 /* 32/64 bit address mode */
16044 int base = modrm.rm;
16045
16046 /* Check SIB byte. */
16047 if (base == 4)
16048 {
16049 FETCH_DATA (the_info, codep + 1);
16050 base = *codep & 7;
16051 /* When decoding the third source, don't increase
16052 bytes_before_imm as this has already been incremented
16053 by one in OP_E_memory while decoding the second
16054 source operand. */
16055 if (opnum == 0)
16056 bytes_before_imm++;
16057 }
16058
16059 /* Don't increase bytes_before_imm when decoding the third source,
16060 it has already been incremented by OP_E_memory while decoding
16061 the second source operand. */
16062 if (opnum == 0)
16063 {
16064 switch (modrm.mod)
16065 {
16066 case 0:
16067 /* When modrm.rm == 5 or modrm.rm == 4 and base in
16068 SIB == 5, there is a 4 byte displacement. */
16069 if (base != 5)
16070 /* No displacement. */
16071 break;
16072 /* Fall through. */
16073 case 2:
16074 /* 4 byte displacement. */
16075 bytes_before_imm += 4;
16076 break;
16077 case 1:
16078 /* 1 byte displacement. */
16079 bytes_before_imm++;
16080 break;
16081 }
16082 }
16083 }
16084 else
16085 {
16086 /* 16 bit address mode */
16087 /* Don't increase bytes_before_imm when decoding the third source,
16088 it has already been incremented by OP_E_memory while decoding
16089 the second source operand. */
16090 if (opnum == 0)
16091 {
16092 switch (modrm.mod)
16093 {
16094 case 0:
16095 /* When modrm.rm == 6, there is a 2 byte displacement. */
16096 if (modrm.rm != 6)
16097 /* No displacement. */
16098 break;
16099 /* Fall through. */
16100 case 2:
16101 /* 2 byte displacement. */
16102 bytes_before_imm += 2;
16103 break;
16104 case 1:
16105 /* 1 byte displacement: when decoding the third source,
16106 don't increase bytes_before_imm as this has already
16107 been incremented by one in OP_E_memory while decoding
16108 the second source operand. */
16109 if (opnum == 0)
16110 bytes_before_imm++;
16111
16112 break;
16113 }
16114 }
16115 }
16116 }
16117
16118 FETCH_DATA (the_info, codep + bytes_before_imm + 1);
16119 return codep [bytes_before_imm];
16120 }
16121
16122 static void
16123 OP_EX_VexReg (int bytemode, int sizeflag, int reg)
16124 {
16125 const char **names;
16126
16127 if (reg == -1 && modrm.mod != 3)
16128 {
16129 OP_E_memory (bytemode, sizeflag);
16130 return;
16131 }
16132 else
16133 {
16134 if (reg == -1)
16135 {
16136 reg = modrm.rm;
16137 USED_REX (REX_B);
16138 if (rex & REX_B)
16139 reg += 8;
16140 }
16141 if (address_mode != mode_64bit)
16142 reg &= 7;
16143 }
16144
16145 switch (vex.length)
16146 {
16147 case 128:
16148 names = names_xmm;
16149 break;
16150 case 256:
16151 names = names_ymm;
16152 break;
16153 default:
16154 abort ();
16155 }
16156 oappend (names[reg]);
16157 }
16158
16159 static void
16160 OP_EX_VexImmW (int bytemode, int sizeflag)
16161 {
16162 int reg = -1;
16163 static unsigned char vex_imm8;
16164
16165 if (vex_w_done == 0)
16166 {
16167 vex_w_done = 1;
16168
16169 /* Skip mod/rm byte. */
16170 MODRM_CHECK;
16171 codep++;
16172
16173 vex_imm8 = get_vex_imm8 (sizeflag, 0);
16174
16175 if (vex.w)
16176 reg = vex_imm8 >> 4;
16177
16178 OP_EX_VexReg (bytemode, sizeflag, reg);
16179 }
16180 else if (vex_w_done == 1)
16181 {
16182 vex_w_done = 2;
16183
16184 if (!vex.w)
16185 reg = vex_imm8 >> 4;
16186
16187 OP_EX_VexReg (bytemode, sizeflag, reg);
16188 }
16189 else
16190 {
16191 /* Output the imm8 directly. */
16192 scratchbuf[0] = '$';
16193 print_operand_value (scratchbuf + 1, 1, vex_imm8 & 0xf);
16194 oappend_maybe_intel (scratchbuf);
16195 scratchbuf[0] = '\0';
16196 codep++;
16197 }
16198 }
16199
16200 static void
16201 OP_Vex_2src (int bytemode, int sizeflag)
16202 {
16203 if (modrm.mod == 3)
16204 {
16205 int reg = modrm.rm;
16206 USED_REX (REX_B);
16207 if (rex & REX_B)
16208 reg += 8;
16209 oappend (names_xmm[reg]);
16210 }
16211 else
16212 {
16213 if (intel_syntax
16214 && (bytemode == v_mode || bytemode == v_swap_mode))
16215 {
16216 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
16217 used_prefixes |= (prefixes & PREFIX_DATA);
16218 }
16219 OP_E (bytemode, sizeflag);
16220 }
16221 }
16222
16223 static void
16224 OP_Vex_2src_1 (int bytemode, int sizeflag)
16225 {
16226 if (modrm.mod == 3)
16227 {
16228 /* Skip mod/rm byte. */
16229 MODRM_CHECK;
16230 codep++;
16231 }
16232
16233 if (vex.w)
16234 {
16235 unsigned int reg = vex.register_specifier;
16236 vex.register_specifier = 0;
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 vex.register_specifier = 0;
16255
16256 if (address_mode != mode_64bit)
16257 reg &= 7;
16258 oappend (names_xmm[reg]);
16259 }
16260 }
16261
16262 static void
16263 OP_EX_VexW (int bytemode, int sizeflag)
16264 {
16265 int reg = -1;
16266
16267 if (!vex_w_done)
16268 {
16269 /* Skip mod/rm byte. */
16270 MODRM_CHECK;
16271 codep++;
16272
16273 if (vex.w)
16274 reg = get_vex_imm8 (sizeflag, 0) >> 4;
16275 }
16276 else
16277 {
16278 if (!vex.w)
16279 reg = get_vex_imm8 (sizeflag, 1) >> 4;
16280 }
16281
16282 OP_EX_VexReg (bytemode, sizeflag, reg);
16283
16284 if (vex_w_done)
16285 codep++;
16286 vex_w_done = 1;
16287 }
16288
16289 static void
16290 OP_REG_VexI4 (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
16291 {
16292 int reg;
16293 const char **names;
16294
16295 FETCH_DATA (the_info, codep + 1);
16296 reg = *codep++;
16297
16298 if (bytemode != x_mode)
16299 abort ();
16300
16301 reg >>= 4;
16302 if (address_mode != mode_64bit)
16303 reg &= 7;
16304
16305 switch (vex.length)
16306 {
16307 case 128:
16308 names = names_xmm;
16309 break;
16310 case 256:
16311 names = names_ymm;
16312 break;
16313 default:
16314 abort ();
16315 }
16316 oappend (names[reg]);
16317 }
16318
16319 static void
16320 OP_XMM_VexW (int bytemode, int sizeflag)
16321 {
16322 /* Turn off the REX.W bit since it is used for swapping operands
16323 now. */
16324 rex &= ~REX_W;
16325 OP_XMM (bytemode, sizeflag);
16326 }
16327
16328 static void
16329 OP_EX_Vex (int bytemode, int sizeflag)
16330 {
16331 if (modrm.mod != 3)
16332 need_vex_reg = 0;
16333 OP_EX (bytemode, sizeflag);
16334 }
16335
16336 static void
16337 OP_XMM_Vex (int bytemode, int sizeflag)
16338 {
16339 if (modrm.mod != 3)
16340 need_vex_reg = 0;
16341 OP_XMM (bytemode, sizeflag);
16342 }
16343
16344 static struct op vex_cmp_op[] =
16345 {
16346 { STRING_COMMA_LEN ("eq") },
16347 { STRING_COMMA_LEN ("lt") },
16348 { STRING_COMMA_LEN ("le") },
16349 { STRING_COMMA_LEN ("unord") },
16350 { STRING_COMMA_LEN ("neq") },
16351 { STRING_COMMA_LEN ("nlt") },
16352 { STRING_COMMA_LEN ("nle") },
16353 { STRING_COMMA_LEN ("ord") },
16354 { STRING_COMMA_LEN ("eq_uq") },
16355 { STRING_COMMA_LEN ("nge") },
16356 { STRING_COMMA_LEN ("ngt") },
16357 { STRING_COMMA_LEN ("false") },
16358 { STRING_COMMA_LEN ("neq_oq") },
16359 { STRING_COMMA_LEN ("ge") },
16360 { STRING_COMMA_LEN ("gt") },
16361 { STRING_COMMA_LEN ("true") },
16362 { STRING_COMMA_LEN ("eq_os") },
16363 { STRING_COMMA_LEN ("lt_oq") },
16364 { STRING_COMMA_LEN ("le_oq") },
16365 { STRING_COMMA_LEN ("unord_s") },
16366 { STRING_COMMA_LEN ("neq_us") },
16367 { STRING_COMMA_LEN ("nlt_uq") },
16368 { STRING_COMMA_LEN ("nle_uq") },
16369 { STRING_COMMA_LEN ("ord_s") },
16370 { STRING_COMMA_LEN ("eq_us") },
16371 { STRING_COMMA_LEN ("nge_uq") },
16372 { STRING_COMMA_LEN ("ngt_uq") },
16373 { STRING_COMMA_LEN ("false_os") },
16374 { STRING_COMMA_LEN ("neq_os") },
16375 { STRING_COMMA_LEN ("ge_oq") },
16376 { STRING_COMMA_LEN ("gt_oq") },
16377 { STRING_COMMA_LEN ("true_us") },
16378 };
16379
16380 static void
16381 VCMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
16382 {
16383 unsigned int cmp_type;
16384
16385 FETCH_DATA (the_info, codep + 1);
16386 cmp_type = *codep++ & 0xff;
16387 if (cmp_type < ARRAY_SIZE (vex_cmp_op))
16388 {
16389 char suffix [3];
16390 char *p = mnemonicendp - 2;
16391 suffix[0] = p[0];
16392 suffix[1] = p[1];
16393 suffix[2] = '\0';
16394 sprintf (p, "%s%s", vex_cmp_op[cmp_type].name, suffix);
16395 mnemonicendp += vex_cmp_op[cmp_type].len;
16396 }
16397 else
16398 {
16399 /* We have a reserved extension byte. Output it directly. */
16400 scratchbuf[0] = '$';
16401 print_operand_value (scratchbuf + 1, 1, cmp_type);
16402 oappend_maybe_intel (scratchbuf);
16403 scratchbuf[0] = '\0';
16404 }
16405 }
16406
16407 static void
16408 VPCMP_Fixup (int bytemode ATTRIBUTE_UNUSED,
16409 int sizeflag ATTRIBUTE_UNUSED)
16410 {
16411 unsigned int cmp_type;
16412
16413 if (!vex.evex)
16414 abort ();
16415
16416 FETCH_DATA (the_info, codep + 1);
16417 cmp_type = *codep++ & 0xff;
16418 /* There are aliases for immediates 0, 1, 2, 4, 5, 6.
16419 If it's the case, print suffix, otherwise - print the immediate. */
16420 if (cmp_type < ARRAY_SIZE (simd_cmp_op)
16421 && cmp_type != 3
16422 && cmp_type != 7)
16423 {
16424 char suffix [3];
16425 char *p = mnemonicendp - 2;
16426
16427 /* vpcmp* can have both one- and two-lettered suffix. */
16428 if (p[0] == 'p')
16429 {
16430 p++;
16431 suffix[0] = p[0];
16432 suffix[1] = '\0';
16433 }
16434 else
16435 {
16436 suffix[0] = p[0];
16437 suffix[1] = p[1];
16438 suffix[2] = '\0';
16439 }
16440
16441 sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
16442 mnemonicendp += simd_cmp_op[cmp_type].len;
16443 }
16444 else
16445 {
16446 /* We have a reserved extension byte. Output it directly. */
16447 scratchbuf[0] = '$';
16448 print_operand_value (scratchbuf + 1, 1, cmp_type);
16449 oappend_maybe_intel (scratchbuf);
16450 scratchbuf[0] = '\0';
16451 }
16452 }
16453
16454 static const struct op xop_cmp_op[] =
16455 {
16456 { STRING_COMMA_LEN ("lt") },
16457 { STRING_COMMA_LEN ("le") },
16458 { STRING_COMMA_LEN ("gt") },
16459 { STRING_COMMA_LEN ("ge") },
16460 { STRING_COMMA_LEN ("eq") },
16461 { STRING_COMMA_LEN ("neq") },
16462 { STRING_COMMA_LEN ("false") },
16463 { STRING_COMMA_LEN ("true") }
16464 };
16465
16466 static void
16467 VPCOM_Fixup (int bytemode ATTRIBUTE_UNUSED,
16468 int sizeflag ATTRIBUTE_UNUSED)
16469 {
16470 unsigned int cmp_type;
16471
16472 FETCH_DATA (the_info, codep + 1);
16473 cmp_type = *codep++ & 0xff;
16474 if (cmp_type < ARRAY_SIZE (xop_cmp_op))
16475 {
16476 char suffix[3];
16477 char *p = mnemonicendp - 2;
16478
16479 /* vpcom* can have both one- and two-lettered suffix. */
16480 if (p[0] == 'm')
16481 {
16482 p++;
16483 suffix[0] = p[0];
16484 suffix[1] = '\0';
16485 }
16486 else
16487 {
16488 suffix[0] = p[0];
16489 suffix[1] = p[1];
16490 suffix[2] = '\0';
16491 }
16492
16493 sprintf (p, "%s%s", xop_cmp_op[cmp_type].name, suffix);
16494 mnemonicendp += xop_cmp_op[cmp_type].len;
16495 }
16496 else
16497 {
16498 /* We have a reserved extension byte. Output it directly. */
16499 scratchbuf[0] = '$';
16500 print_operand_value (scratchbuf + 1, 1, cmp_type);
16501 oappend_maybe_intel (scratchbuf);
16502 scratchbuf[0] = '\0';
16503 }
16504 }
16505
16506 static const struct op pclmul_op[] =
16507 {
16508 { STRING_COMMA_LEN ("lql") },
16509 { STRING_COMMA_LEN ("hql") },
16510 { STRING_COMMA_LEN ("lqh") },
16511 { STRING_COMMA_LEN ("hqh") }
16512 };
16513
16514 static void
16515 PCLMUL_Fixup (int bytemode ATTRIBUTE_UNUSED,
16516 int sizeflag ATTRIBUTE_UNUSED)
16517 {
16518 unsigned int pclmul_type;
16519
16520 FETCH_DATA (the_info, codep + 1);
16521 pclmul_type = *codep++ & 0xff;
16522 switch (pclmul_type)
16523 {
16524 case 0x10:
16525 pclmul_type = 2;
16526 break;
16527 case 0x11:
16528 pclmul_type = 3;
16529 break;
16530 default:
16531 break;
16532 }
16533 if (pclmul_type < ARRAY_SIZE (pclmul_op))
16534 {
16535 char suffix [4];
16536 char *p = mnemonicendp - 3;
16537 suffix[0] = p[0];
16538 suffix[1] = p[1];
16539 suffix[2] = p[2];
16540 suffix[3] = '\0';
16541 sprintf (p, "%s%s", pclmul_op[pclmul_type].name, suffix);
16542 mnemonicendp += pclmul_op[pclmul_type].len;
16543 }
16544 else
16545 {
16546 /* We have a reserved extension byte. Output it directly. */
16547 scratchbuf[0] = '$';
16548 print_operand_value (scratchbuf + 1, 1, pclmul_type);
16549 oappend_maybe_intel (scratchbuf);
16550 scratchbuf[0] = '\0';
16551 }
16552 }
16553
16554 static void
16555 MOVBE_Fixup (int bytemode, int sizeflag)
16556 {
16557 /* Add proper suffix to "movbe". */
16558 char *p = mnemonicendp;
16559
16560 switch (bytemode)
16561 {
16562 case v_mode:
16563 if (intel_syntax)
16564 goto skip;
16565
16566 USED_REX (REX_W);
16567 if (sizeflag & SUFFIX_ALWAYS)
16568 {
16569 if (rex & REX_W)
16570 *p++ = 'q';
16571 else
16572 {
16573 if (sizeflag & DFLAG)
16574 *p++ = 'l';
16575 else
16576 *p++ = 'w';
16577 used_prefixes |= (prefixes & PREFIX_DATA);
16578 }
16579 }
16580 break;
16581 default:
16582 oappend (INTERNAL_DISASSEMBLER_ERROR);
16583 break;
16584 }
16585 mnemonicendp = p;
16586 *p = '\0';
16587
16588 skip:
16589 OP_M (bytemode, sizeflag);
16590 }
16591
16592 static void
16593 OP_LWPCB_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
16594 {
16595 int reg;
16596 const char **names;
16597
16598 /* Skip mod/rm byte. */
16599 MODRM_CHECK;
16600 codep++;
16601
16602 if (rex & REX_W)
16603 names = names64;
16604 else
16605 names = names32;
16606
16607 reg = modrm.rm;
16608 USED_REX (REX_B);
16609 if (rex & REX_B)
16610 reg += 8;
16611
16612 oappend (names[reg]);
16613 }
16614
16615 static void
16616 OP_LWP_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
16617 {
16618 const char **names;
16619 unsigned int reg = vex.register_specifier;
16620 vex.register_specifier = 0;
16621
16622 if (rex & REX_W)
16623 names = names64;
16624 else
16625 names = names32;
16626
16627 if (address_mode != mode_64bit)
16628 reg &= 7;
16629 oappend (names[reg]);
16630 }
16631
16632 static void
16633 OP_Mask (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
16634 {
16635 if (!vex.evex
16636 || (bytemode != mask_mode && bytemode != mask_bd_mode))
16637 abort ();
16638
16639 USED_REX (REX_R);
16640 if ((rex & REX_R) != 0 || !vex.r)
16641 {
16642 BadOp ();
16643 return;
16644 }
16645
16646 oappend (names_mask [modrm.reg]);
16647 }
16648
16649 static void
16650 OP_Rounding (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
16651 {
16652 if (!vex.evex
16653 || (bytemode != evex_rounding_mode
16654 && bytemode != evex_rounding_64_mode
16655 && bytemode != evex_sae_mode))
16656 abort ();
16657 if (modrm.mod == 3 && vex.b)
16658 switch (bytemode)
16659 {
16660 case evex_rounding_64_mode:
16661 if (address_mode != mode_64bit)
16662 {
16663 oappend ("(bad)");
16664 break;
16665 }
16666 /* Fall through. */
16667 case evex_rounding_mode:
16668 oappend (names_rounding[vex.ll]);
16669 break;
16670 case evex_sae_mode:
16671 oappend ("{sae}");
16672 break;
16673 default:
16674 break;
16675 }
16676 }
This page took 0.336385 seconds and 5 git commands to generate.