i386: Check vector length for scatter/gather prefetch instructions
[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 Eq { OP_E, q_mode }
263 #define indirEv { OP_indirE, indir_v_mode }
264 #define indirEp { OP_indirE, f_mode }
265 #define stackEv { OP_E, stack_v_mode }
266 #define Em { OP_E, m_mode }
267 #define Ew { OP_E, w_mode }
268 #define M { OP_M, 0 } /* lea, lgdt, etc. */
269 #define Ma { OP_M, a_mode }
270 #define Mb { OP_M, b_mode }
271 #define Md { OP_M, d_mode }
272 #define Mo { OP_M, o_mode }
273 #define Mp { OP_M, f_mode } /* 32 or 48 bit memory operand for LDS, LES etc */
274 #define Mq { OP_M, q_mode }
275 #define Mv_bnd { OP_M, v_bndmk_mode }
276 #define Mx { OP_M, x_mode }
277 #define Mxmm { OP_M, xmm_mode }
278 #define Gb { OP_G, b_mode }
279 #define Gbnd { OP_G, bnd_mode }
280 #define Gv { OP_G, v_mode }
281 #define Gd { OP_G, d_mode }
282 #define Gdq { OP_G, dq_mode }
283 #define Gm { OP_G, m_mode }
284 #define Gva { OP_G, va_mode }
285 #define Gw { OP_G, w_mode }
286 #define Rd { OP_R, d_mode }
287 #define Rdq { OP_R, dq_mode }
288 #define Rm { OP_R, m_mode }
289 #define Ib { OP_I, b_mode }
290 #define sIb { OP_sI, b_mode } /* sign extened byte */
291 #define sIbT { OP_sI, b_T_mode } /* sign extened byte like 'T' */
292 #define Iv { OP_I, v_mode }
293 #define sIv { OP_sI, v_mode }
294 #define Iv64 { OP_I64, v_mode }
295 #define Id { OP_I, d_mode }
296 #define Iw { OP_I, w_mode }
297 #define I1 { OP_I, const_1_mode }
298 #define Jb { OP_J, b_mode }
299 #define Jv { OP_J, v_mode }
300 #define Cm { OP_C, m_mode }
301 #define Dm { OP_D, m_mode }
302 #define Td { OP_T, d_mode }
303 #define Skip_MODRM { OP_Skip_MODRM, 0 }
304
305 #define RMeAX { OP_REG, eAX_reg }
306 #define RMeBX { OP_REG, eBX_reg }
307 #define RMeCX { OP_REG, eCX_reg }
308 #define RMeDX { OP_REG, eDX_reg }
309 #define RMeSP { OP_REG, eSP_reg }
310 #define RMeBP { OP_REG, eBP_reg }
311 #define RMeSI { OP_REG, eSI_reg }
312 #define RMeDI { OP_REG, eDI_reg }
313 #define RMrAX { OP_REG, rAX_reg }
314 #define RMrBX { OP_REG, rBX_reg }
315 #define RMrCX { OP_REG, rCX_reg }
316 #define RMrDX { OP_REG, rDX_reg }
317 #define RMrSP { OP_REG, rSP_reg }
318 #define RMrBP { OP_REG, rBP_reg }
319 #define RMrSI { OP_REG, rSI_reg }
320 #define RMrDI { OP_REG, rDI_reg }
321 #define RMAL { OP_REG, al_reg }
322 #define RMCL { OP_REG, cl_reg }
323 #define RMDL { OP_REG, dl_reg }
324 #define RMBL { OP_REG, bl_reg }
325 #define RMAH { OP_REG, ah_reg }
326 #define RMCH { OP_REG, ch_reg }
327 #define RMDH { OP_REG, dh_reg }
328 #define RMBH { OP_REG, bh_reg }
329 #define RMAX { OP_REG, ax_reg }
330 #define RMDX { OP_REG, dx_reg }
331
332 #define eAX { OP_IMREG, eAX_reg }
333 #define eBX { OP_IMREG, eBX_reg }
334 #define eCX { OP_IMREG, eCX_reg }
335 #define eDX { OP_IMREG, eDX_reg }
336 #define eSP { OP_IMREG, eSP_reg }
337 #define eBP { OP_IMREG, eBP_reg }
338 #define eSI { OP_IMREG, eSI_reg }
339 #define eDI { OP_IMREG, eDI_reg }
340 #define AL { OP_IMREG, al_reg }
341 #define CL { OP_IMREG, cl_reg }
342 #define DL { OP_IMREG, dl_reg }
343 #define BL { OP_IMREG, bl_reg }
344 #define AH { OP_IMREG, ah_reg }
345 #define CH { OP_IMREG, ch_reg }
346 #define DH { OP_IMREG, dh_reg }
347 #define BH { OP_IMREG, bh_reg }
348 #define AX { OP_IMREG, ax_reg }
349 #define DX { OP_IMREG, dx_reg }
350 #define zAX { OP_IMREG, z_mode_ax_reg }
351 #define indirDX { OP_IMREG, indir_dx_reg }
352
353 #define Sw { OP_SEG, w_mode }
354 #define Sv { OP_SEG, v_mode }
355 #define Ap { OP_DIR, 0 }
356 #define Ob { OP_OFF64, b_mode }
357 #define Ov { OP_OFF64, v_mode }
358 #define Xb { OP_DSreg, eSI_reg }
359 #define Xv { OP_DSreg, eSI_reg }
360 #define Xz { OP_DSreg, eSI_reg }
361 #define Yb { OP_ESreg, eDI_reg }
362 #define Yv { OP_ESreg, eDI_reg }
363 #define DSBX { OP_DSreg, eBX_reg }
364
365 #define es { OP_REG, es_reg }
366 #define ss { OP_REG, ss_reg }
367 #define cs { OP_REG, cs_reg }
368 #define ds { OP_REG, ds_reg }
369 #define fs { OP_REG, fs_reg }
370 #define gs { OP_REG, gs_reg }
371
372 #define MX { OP_MMX, 0 }
373 #define XM { OP_XMM, 0 }
374 #define XMScalar { OP_XMM, scalar_mode }
375 #define XMGatherQ { OP_XMM, vex_vsib_q_w_dq_mode }
376 #define XMM { OP_XMM, xmm_mode }
377 #define XMxmmq { OP_XMM, xmmq_mode }
378 #define EM { OP_EM, v_mode }
379 #define EMS { OP_EM, v_swap_mode }
380 #define EMd { OP_EM, d_mode }
381 #define EMx { OP_EM, x_mode }
382 #define EXbScalar { OP_EX, b_scalar_mode }
383 #define EXw { OP_EX, w_mode }
384 #define EXwScalar { OP_EX, w_scalar_mode }
385 #define EXd { OP_EX, d_mode }
386 #define EXdScalar { OP_EX, d_scalar_mode }
387 #define EXdS { OP_EX, d_swap_mode }
388 #define EXdScalarS { OP_EX, d_scalar_swap_mode }
389 #define EXq { OP_EX, q_mode }
390 #define EXqScalar { OP_EX, q_scalar_mode }
391 #define EXqScalarS { OP_EX, q_scalar_swap_mode }
392 #define EXqS { OP_EX, q_swap_mode }
393 #define EXx { OP_EX, x_mode }
394 #define EXxS { OP_EX, x_swap_mode }
395 #define EXxmm { OP_EX, xmm_mode }
396 #define EXymm { OP_EX, ymm_mode }
397 #define EXxmmq { OP_EX, xmmq_mode }
398 #define EXEvexHalfBcstXmmq { OP_EX, evex_half_bcst_xmmq_mode }
399 #define EXxmm_mb { OP_EX, xmm_mb_mode }
400 #define EXxmm_mw { OP_EX, xmm_mw_mode }
401 #define EXxmm_md { OP_EX, xmm_md_mode }
402 #define EXxmm_mq { OP_EX, xmm_mq_mode }
403 #define EXxmm_mdq { OP_EX, xmm_mdq_mode }
404 #define EXxmmdw { OP_EX, xmmdw_mode }
405 #define EXxmmqd { OP_EX, xmmqd_mode }
406 #define EXymmq { OP_EX, ymmq_mode }
407 #define EXVexWdq { OP_EX, vex_w_dq_mode }
408 #define EXVexWdqScalar { OP_EX, vex_scalar_w_dq_mode }
409 #define EXEvexXGscat { OP_EX, evex_x_gscat_mode }
410 #define EXEvexXNoBcst { OP_EX, evex_x_nobcst_mode }
411 #define MS { OP_MS, v_mode }
412 #define XS { OP_XS, v_mode }
413 #define EMCq { OP_EMC, q_mode }
414 #define MXC { OP_MXC, 0 }
415 #define OPSUF { OP_3DNowSuffix, 0 }
416 #define CMP { CMP_Fixup, 0 }
417 #define XMM0 { XMM_Fixup, 0 }
418 #define FXSAVE { FXSAVE_Fixup, 0 }
419 #define Vex_2src_1 { OP_Vex_2src_1, 0 }
420 #define Vex_2src_2 { OP_Vex_2src_2, 0 }
421
422 #define Vex { OP_VEX, vex_mode }
423 #define VexScalar { OP_VEX, vex_scalar_mode }
424 #define VexGatherQ { OP_VEX, vex_vsib_q_w_dq_mode }
425 #define Vex128 { OP_VEX, vex128_mode }
426 #define Vex256 { OP_VEX, vex256_mode }
427 #define VexGdq { OP_VEX, dq_mode }
428 #define EXdVex { OP_EX_Vex, d_mode }
429 #define EXdVexS { OP_EX_Vex, d_swap_mode }
430 #define EXdVexScalarS { OP_EX_Vex, d_scalar_swap_mode }
431 #define EXqVex { OP_EX_Vex, q_mode }
432 #define EXqVexS { OP_EX_Vex, q_swap_mode }
433 #define EXqVexScalarS { OP_EX_Vex, q_scalar_swap_mode }
434 #define EXVexW { OP_EX_VexW, x_mode }
435 #define EXdVexW { OP_EX_VexW, d_mode }
436 #define EXqVexW { OP_EX_VexW, q_mode }
437 #define EXVexImmW { OP_EX_VexImmW, x_mode }
438 #define XMVex { OP_XMM_Vex, 0 }
439 #define XMVexScalar { OP_XMM_Vex, scalar_mode }
440 #define XMVexW { OP_XMM_VexW, 0 }
441 #define XMVexI4 { OP_REG_VexI4, x_mode }
442 #define PCLMUL { PCLMUL_Fixup, 0 }
443 #define VCMP { VCMP_Fixup, 0 }
444 #define VPCMP { VPCMP_Fixup, 0 }
445 #define VPCOM { VPCOM_Fixup, 0 }
446
447 #define EXxEVexR { OP_Rounding, evex_rounding_mode }
448 #define EXxEVexR64 { OP_Rounding, evex_rounding_64_mode }
449 #define EXxEVexS { OP_Rounding, evex_sae_mode }
450
451 #define XMask { OP_Mask, mask_mode }
452 #define MaskG { OP_G, mask_mode }
453 #define MaskE { OP_E, mask_mode }
454 #define MaskBDE { OP_E, mask_bd_mode }
455 #define MaskR { OP_R, mask_mode }
456 #define MaskVex { OP_VEX, mask_mode }
457
458 #define MVexVSIBDWpX { OP_M, vex_vsib_d_w_dq_mode }
459 #define MVexVSIBDQWpX { OP_M, vex_vsib_d_w_d_mode }
460 #define MVexVSIBQWpX { OP_M, vex_vsib_q_w_dq_mode }
461 #define MVexVSIBQDWpX { OP_M, vex_vsib_q_w_d_mode }
462
463 /* Used handle "rep" prefix for string instructions. */
464 #define Xbr { REP_Fixup, eSI_reg }
465 #define Xvr { REP_Fixup, eSI_reg }
466 #define Ybr { REP_Fixup, eDI_reg }
467 #define Yvr { REP_Fixup, eDI_reg }
468 #define Yzr { REP_Fixup, eDI_reg }
469 #define indirDXr { REP_Fixup, indir_dx_reg }
470 #define ALr { REP_Fixup, al_reg }
471 #define eAXr { REP_Fixup, eAX_reg }
472
473 /* Used handle HLE prefix for lockable instructions. */
474 #define Ebh1 { HLE_Fixup1, b_mode }
475 #define Evh1 { HLE_Fixup1, v_mode }
476 #define Ebh2 { HLE_Fixup2, b_mode }
477 #define Evh2 { HLE_Fixup2, v_mode }
478 #define Ebh3 { HLE_Fixup3, b_mode }
479 #define Evh3 { HLE_Fixup3, v_mode }
480
481 #define BND { BND_Fixup, 0 }
482 #define NOTRACK { NOTRACK_Fixup, 0 }
483
484 #define cond_jump_flag { NULL, cond_jump_mode }
485 #define loop_jcxz_flag { NULL, loop_jcxz_mode }
486
487 /* bits in sizeflag */
488 #define SUFFIX_ALWAYS 4
489 #define AFLAG 2
490 #define DFLAG 1
491
492 enum
493 {
494 /* byte operand */
495 b_mode = 1,
496 /* byte operand with operand swapped */
497 b_swap_mode,
498 /* byte operand, sign extend like 'T' suffix */
499 b_T_mode,
500 /* operand size depends on prefixes */
501 v_mode,
502 /* operand size depends on prefixes with operand swapped */
503 v_swap_mode,
504 /* operand size depends on address prefix */
505 va_mode,
506 /* word operand */
507 w_mode,
508 /* double word operand */
509 d_mode,
510 /* double word operand with operand swapped */
511 d_swap_mode,
512 /* quad word operand */
513 q_mode,
514 /* quad word operand with operand swapped */
515 q_swap_mode,
516 /* ten-byte operand */
517 t_mode,
518 /* 16-byte XMM, 32-byte YMM or 64-byte ZMM operand. In EVEX with
519 broadcast enabled. */
520 x_mode,
521 /* Similar to x_mode, but with different EVEX mem shifts. */
522 evex_x_gscat_mode,
523 /* Similar to x_mode, but with disabled broadcast. */
524 evex_x_nobcst_mode,
525 /* Similar to x_mode, but with operands swapped and disabled broadcast
526 in EVEX. */
527 x_swap_mode,
528 /* 16-byte XMM operand */
529 xmm_mode,
530 /* XMM, XMM or YMM register operand, or quad word, xmmword or ymmword
531 memory operand (depending on vector length). Broadcast isn't
532 allowed. */
533 xmmq_mode,
534 /* Same as xmmq_mode, but broadcast is allowed. */
535 evex_half_bcst_xmmq_mode,
536 /* XMM register or byte memory operand */
537 xmm_mb_mode,
538 /* XMM register or word memory operand */
539 xmm_mw_mode,
540 /* XMM register or double word memory operand */
541 xmm_md_mode,
542 /* XMM register or quad word memory operand */
543 xmm_mq_mode,
544 /* XMM register or double/quad word memory operand, depending on
545 VEX.W. */
546 xmm_mdq_mode,
547 /* 16-byte XMM, word, double word or quad word operand. */
548 xmmdw_mode,
549 /* 16-byte XMM, double word, quad word operand or xmm word operand. */
550 xmmqd_mode,
551 /* 32-byte YMM operand */
552 ymm_mode,
553 /* quad word, ymmword or zmmword memory operand. */
554 ymmq_mode,
555 /* 32-byte YMM or 16-byte word operand */
556 ymmxmm_mode,
557 /* d_mode in 32bit, q_mode in 64bit mode. */
558 m_mode,
559 /* pair of v_mode operands */
560 a_mode,
561 cond_jump_mode,
562 loop_jcxz_mode,
563 v_bnd_mode,
564 /* like v_bnd_mode in 32bit, no RIP-rel in 64bit mode. */
565 v_bndmk_mode,
566 /* operand size depends on REX prefixes. */
567 dq_mode,
568 /* registers like dq_mode, memory like w_mode. */
569 dqw_mode,
570 /* bounds operand */
571 bnd_mode,
572 /* bounds operand with operand swapped */
573 bnd_swap_mode,
574 /* 4- or 6-byte pointer operand */
575 f_mode,
576 const_1_mode,
577 /* v_mode for indirect branch opcodes. */
578 indir_v_mode,
579 /* v_mode for stack-related opcodes. */
580 stack_v_mode,
581 /* non-quad operand size depends on prefixes */
582 z_mode,
583 /* 16-byte operand */
584 o_mode,
585 /* registers like dq_mode, memory like b_mode. */
586 dqb_mode,
587 /* registers like d_mode, memory like b_mode. */
588 db_mode,
589 /* registers like d_mode, memory like w_mode. */
590 dw_mode,
591 /* registers like dq_mode, memory like d_mode. */
592 dqd_mode,
593 /* normal vex mode */
594 vex_mode,
595 /* 128bit vex mode */
596 vex128_mode,
597 /* 256bit vex mode */
598 vex256_mode,
599 /* operand size depends on the VEX.W bit. */
600 vex_w_dq_mode,
601
602 /* Similar to vex_w_dq_mode, with VSIB dword indices. */
603 vex_vsib_d_w_dq_mode,
604 /* Similar to vex_vsib_d_w_dq_mode, with smaller memory. */
605 vex_vsib_d_w_d_mode,
606 /* Similar to vex_w_dq_mode, with VSIB qword indices. */
607 vex_vsib_q_w_dq_mode,
608 /* Similar to vex_vsib_q_w_dq_mode, with smaller memory. */
609 vex_vsib_q_w_d_mode,
610
611 /* scalar, ignore vector length. */
612 scalar_mode,
613 /* like b_mode, ignore vector length. */
614 b_scalar_mode,
615 /* like w_mode, ignore vector length. */
616 w_scalar_mode,
617 /* like d_mode, ignore vector length. */
618 d_scalar_mode,
619 /* like d_swap_mode, ignore vector length. */
620 d_scalar_swap_mode,
621 /* like q_mode, ignore vector length. */
622 q_scalar_mode,
623 /* like q_swap_mode, ignore vector length. */
624 q_scalar_swap_mode,
625 /* like vex_mode, ignore vector length. */
626 vex_scalar_mode,
627 /* like vex_w_dq_mode, ignore vector length. */
628 vex_scalar_w_dq_mode,
629
630 /* Static rounding. */
631 evex_rounding_mode,
632 /* Static rounding, 64-bit mode only. */
633 evex_rounding_64_mode,
634 /* Supress all exceptions. */
635 evex_sae_mode,
636
637 /* Mask register operand. */
638 mask_mode,
639 /* Mask register operand. */
640 mask_bd_mode,
641
642 es_reg,
643 cs_reg,
644 ss_reg,
645 ds_reg,
646 fs_reg,
647 gs_reg,
648
649 eAX_reg,
650 eCX_reg,
651 eDX_reg,
652 eBX_reg,
653 eSP_reg,
654 eBP_reg,
655 eSI_reg,
656 eDI_reg,
657
658 al_reg,
659 cl_reg,
660 dl_reg,
661 bl_reg,
662 ah_reg,
663 ch_reg,
664 dh_reg,
665 bh_reg,
666
667 ax_reg,
668 cx_reg,
669 dx_reg,
670 bx_reg,
671 sp_reg,
672 bp_reg,
673 si_reg,
674 di_reg,
675
676 rAX_reg,
677 rCX_reg,
678 rDX_reg,
679 rBX_reg,
680 rSP_reg,
681 rBP_reg,
682 rSI_reg,
683 rDI_reg,
684
685 z_mode_ax_reg,
686 indir_dx_reg
687 };
688
689 enum
690 {
691 FLOATCODE = 1,
692 USE_REG_TABLE,
693 USE_MOD_TABLE,
694 USE_RM_TABLE,
695 USE_PREFIX_TABLE,
696 USE_X86_64_TABLE,
697 USE_3BYTE_TABLE,
698 USE_XOP_8F_TABLE,
699 USE_VEX_C4_TABLE,
700 USE_VEX_C5_TABLE,
701 USE_VEX_LEN_TABLE,
702 USE_VEX_W_TABLE,
703 USE_EVEX_TABLE,
704 USE_EVEX_LEN_TABLE
705 };
706
707 #define FLOAT NULL, { { NULL, FLOATCODE } }, 0
708
709 #define DIS386(T, I) NULL, { { NULL, (T)}, { NULL, (I) } }, 0
710 #define DIS386_PREFIX(T, I, P) NULL, { { NULL, (T)}, { NULL, (I) } }, P
711 #define REG_TABLE(I) DIS386 (USE_REG_TABLE, (I))
712 #define MOD_TABLE(I) DIS386 (USE_MOD_TABLE, (I))
713 #define RM_TABLE(I) DIS386 (USE_RM_TABLE, (I))
714 #define PREFIX_TABLE(I) DIS386 (USE_PREFIX_TABLE, (I))
715 #define X86_64_TABLE(I) DIS386 (USE_X86_64_TABLE, (I))
716 #define THREE_BYTE_TABLE(I) DIS386 (USE_3BYTE_TABLE, (I))
717 #define THREE_BYTE_TABLE_PREFIX(I, P) DIS386_PREFIX (USE_3BYTE_TABLE, (I), P)
718 #define XOP_8F_TABLE(I) DIS386 (USE_XOP_8F_TABLE, (I))
719 #define VEX_C4_TABLE(I) DIS386 (USE_VEX_C4_TABLE, (I))
720 #define VEX_C5_TABLE(I) DIS386 (USE_VEX_C5_TABLE, (I))
721 #define VEX_LEN_TABLE(I) DIS386 (USE_VEX_LEN_TABLE, (I))
722 #define VEX_W_TABLE(I) DIS386 (USE_VEX_W_TABLE, (I))
723 #define EVEX_TABLE(I) DIS386 (USE_EVEX_TABLE, (I))
724 #define EVEX_LEN_TABLE(I) DIS386 (USE_EVEX_LEN_TABLE, (I))
725
726 enum
727 {
728 REG_80 = 0,
729 REG_81,
730 REG_83,
731 REG_8F,
732 REG_C0,
733 REG_C1,
734 REG_C6,
735 REG_C7,
736 REG_D0,
737 REG_D1,
738 REG_D2,
739 REG_D3,
740 REG_F6,
741 REG_F7,
742 REG_FE,
743 REG_FF,
744 REG_0F00,
745 REG_0F01,
746 REG_0F0D,
747 REG_0F18,
748 REG_0F1C_MOD_0,
749 REG_0F1E_MOD_3,
750 REG_0F71,
751 REG_0F72,
752 REG_0F73,
753 REG_0FA6,
754 REG_0FA7,
755 REG_0FAE,
756 REG_0FBA,
757 REG_0FC7,
758 REG_VEX_0F71,
759 REG_VEX_0F72,
760 REG_VEX_0F73,
761 REG_VEX_0FAE,
762 REG_VEX_0F38F3,
763 REG_XOP_LWPCB,
764 REG_XOP_LWP,
765 REG_XOP_TBM_01,
766 REG_XOP_TBM_02,
767
768 REG_EVEX_0F71,
769 REG_EVEX_0F72,
770 REG_EVEX_0F73,
771 REG_EVEX_0F38C6,
772 REG_EVEX_0F38C7
773 };
774
775 enum
776 {
777 MOD_8D = 0,
778 MOD_C6_REG_7,
779 MOD_C7_REG_7,
780 MOD_FF_REG_3,
781 MOD_FF_REG_5,
782 MOD_0F01_REG_0,
783 MOD_0F01_REG_1,
784 MOD_0F01_REG_2,
785 MOD_0F01_REG_3,
786 MOD_0F01_REG_5,
787 MOD_0F01_REG_7,
788 MOD_0F12_PREFIX_0,
789 MOD_0F13,
790 MOD_0F16_PREFIX_0,
791 MOD_0F17,
792 MOD_0F18_REG_0,
793 MOD_0F18_REG_1,
794 MOD_0F18_REG_2,
795 MOD_0F18_REG_3,
796 MOD_0F18_REG_4,
797 MOD_0F18_REG_5,
798 MOD_0F18_REG_6,
799 MOD_0F18_REG_7,
800 MOD_0F1A_PREFIX_0,
801 MOD_0F1B_PREFIX_0,
802 MOD_0F1B_PREFIX_1,
803 MOD_0F1C_PREFIX_0,
804 MOD_0F1E_PREFIX_1,
805 MOD_0F24,
806 MOD_0F26,
807 MOD_0F2B_PREFIX_0,
808 MOD_0F2B_PREFIX_1,
809 MOD_0F2B_PREFIX_2,
810 MOD_0F2B_PREFIX_3,
811 MOD_0F51,
812 MOD_0F71_REG_2,
813 MOD_0F71_REG_4,
814 MOD_0F71_REG_6,
815 MOD_0F72_REG_2,
816 MOD_0F72_REG_4,
817 MOD_0F72_REG_6,
818 MOD_0F73_REG_2,
819 MOD_0F73_REG_3,
820 MOD_0F73_REG_6,
821 MOD_0F73_REG_7,
822 MOD_0FAE_REG_0,
823 MOD_0FAE_REG_1,
824 MOD_0FAE_REG_2,
825 MOD_0FAE_REG_3,
826 MOD_0FAE_REG_4,
827 MOD_0FAE_REG_5,
828 MOD_0FAE_REG_6,
829 MOD_0FAE_REG_7,
830 MOD_0FB2,
831 MOD_0FB4,
832 MOD_0FB5,
833 MOD_0FC3,
834 MOD_0FC7_REG_3,
835 MOD_0FC7_REG_4,
836 MOD_0FC7_REG_5,
837 MOD_0FC7_REG_6,
838 MOD_0FC7_REG_7,
839 MOD_0FD7,
840 MOD_0FE7_PREFIX_2,
841 MOD_0FF0_PREFIX_3,
842 MOD_0F382A_PREFIX_2,
843 MOD_0F38F5_PREFIX_2,
844 MOD_0F38F6_PREFIX_0,
845 MOD_0F38F8_PREFIX_1,
846 MOD_0F38F8_PREFIX_2,
847 MOD_0F38F8_PREFIX_3,
848 MOD_0F38F9_PREFIX_0,
849 MOD_62_32BIT,
850 MOD_C4_32BIT,
851 MOD_C5_32BIT,
852 MOD_VEX_0F12_PREFIX_0,
853 MOD_VEX_0F13,
854 MOD_VEX_0F16_PREFIX_0,
855 MOD_VEX_0F17,
856 MOD_VEX_0F2B,
857 MOD_VEX_W_0_0F41_P_0_LEN_1,
858 MOD_VEX_W_1_0F41_P_0_LEN_1,
859 MOD_VEX_W_0_0F41_P_2_LEN_1,
860 MOD_VEX_W_1_0F41_P_2_LEN_1,
861 MOD_VEX_W_0_0F42_P_0_LEN_1,
862 MOD_VEX_W_1_0F42_P_0_LEN_1,
863 MOD_VEX_W_0_0F42_P_2_LEN_1,
864 MOD_VEX_W_1_0F42_P_2_LEN_1,
865 MOD_VEX_W_0_0F44_P_0_LEN_1,
866 MOD_VEX_W_1_0F44_P_0_LEN_1,
867 MOD_VEX_W_0_0F44_P_2_LEN_1,
868 MOD_VEX_W_1_0F44_P_2_LEN_1,
869 MOD_VEX_W_0_0F45_P_0_LEN_1,
870 MOD_VEX_W_1_0F45_P_0_LEN_1,
871 MOD_VEX_W_0_0F45_P_2_LEN_1,
872 MOD_VEX_W_1_0F45_P_2_LEN_1,
873 MOD_VEX_W_0_0F46_P_0_LEN_1,
874 MOD_VEX_W_1_0F46_P_0_LEN_1,
875 MOD_VEX_W_0_0F46_P_2_LEN_1,
876 MOD_VEX_W_1_0F46_P_2_LEN_1,
877 MOD_VEX_W_0_0F47_P_0_LEN_1,
878 MOD_VEX_W_1_0F47_P_0_LEN_1,
879 MOD_VEX_W_0_0F47_P_2_LEN_1,
880 MOD_VEX_W_1_0F47_P_2_LEN_1,
881 MOD_VEX_W_0_0F4A_P_0_LEN_1,
882 MOD_VEX_W_1_0F4A_P_0_LEN_1,
883 MOD_VEX_W_0_0F4A_P_2_LEN_1,
884 MOD_VEX_W_1_0F4A_P_2_LEN_1,
885 MOD_VEX_W_0_0F4B_P_0_LEN_1,
886 MOD_VEX_W_1_0F4B_P_0_LEN_1,
887 MOD_VEX_W_0_0F4B_P_2_LEN_1,
888 MOD_VEX_0F50,
889 MOD_VEX_0F71_REG_2,
890 MOD_VEX_0F71_REG_4,
891 MOD_VEX_0F71_REG_6,
892 MOD_VEX_0F72_REG_2,
893 MOD_VEX_0F72_REG_4,
894 MOD_VEX_0F72_REG_6,
895 MOD_VEX_0F73_REG_2,
896 MOD_VEX_0F73_REG_3,
897 MOD_VEX_0F73_REG_6,
898 MOD_VEX_0F73_REG_7,
899 MOD_VEX_W_0_0F91_P_0_LEN_0,
900 MOD_VEX_W_1_0F91_P_0_LEN_0,
901 MOD_VEX_W_0_0F91_P_2_LEN_0,
902 MOD_VEX_W_1_0F91_P_2_LEN_0,
903 MOD_VEX_W_0_0F92_P_0_LEN_0,
904 MOD_VEX_W_0_0F92_P_2_LEN_0,
905 MOD_VEX_0F92_P_3_LEN_0,
906 MOD_VEX_W_0_0F93_P_0_LEN_0,
907 MOD_VEX_W_0_0F93_P_2_LEN_0,
908 MOD_VEX_0F93_P_3_LEN_0,
909 MOD_VEX_W_0_0F98_P_0_LEN_0,
910 MOD_VEX_W_1_0F98_P_0_LEN_0,
911 MOD_VEX_W_0_0F98_P_2_LEN_0,
912 MOD_VEX_W_1_0F98_P_2_LEN_0,
913 MOD_VEX_W_0_0F99_P_0_LEN_0,
914 MOD_VEX_W_1_0F99_P_0_LEN_0,
915 MOD_VEX_W_0_0F99_P_2_LEN_0,
916 MOD_VEX_W_1_0F99_P_2_LEN_0,
917 MOD_VEX_0FAE_REG_2,
918 MOD_VEX_0FAE_REG_3,
919 MOD_VEX_0FD7_PREFIX_2,
920 MOD_VEX_0FE7_PREFIX_2,
921 MOD_VEX_0FF0_PREFIX_3,
922 MOD_VEX_0F381A_PREFIX_2,
923 MOD_VEX_0F382A_PREFIX_2,
924 MOD_VEX_0F382C_PREFIX_2,
925 MOD_VEX_0F382D_PREFIX_2,
926 MOD_VEX_0F382E_PREFIX_2,
927 MOD_VEX_0F382F_PREFIX_2,
928 MOD_VEX_0F385A_PREFIX_2,
929 MOD_VEX_0F388C_PREFIX_2,
930 MOD_VEX_0F388E_PREFIX_2,
931 MOD_VEX_W_0_0F3A30_P_2_LEN_0,
932 MOD_VEX_W_1_0F3A30_P_2_LEN_0,
933 MOD_VEX_W_0_0F3A31_P_2_LEN_0,
934 MOD_VEX_W_1_0F3A31_P_2_LEN_0,
935 MOD_VEX_W_0_0F3A32_P_2_LEN_0,
936 MOD_VEX_W_1_0F3A32_P_2_LEN_0,
937 MOD_VEX_W_0_0F3A33_P_2_LEN_0,
938 MOD_VEX_W_1_0F3A33_P_2_LEN_0,
939
940 MOD_EVEX_0F10_PREFIX_1,
941 MOD_EVEX_0F10_PREFIX_3,
942 MOD_EVEX_0F11_PREFIX_1,
943 MOD_EVEX_0F11_PREFIX_3,
944 MOD_EVEX_0F12_PREFIX_0,
945 MOD_EVEX_0F16_PREFIX_0,
946 MOD_EVEX_0F38C6_REG_1,
947 MOD_EVEX_0F38C6_REG_2,
948 MOD_EVEX_0F38C6_REG_5,
949 MOD_EVEX_0F38C6_REG_6,
950 MOD_EVEX_0F38C7_REG_1,
951 MOD_EVEX_0F38C7_REG_2,
952 MOD_EVEX_0F38C7_REG_5,
953 MOD_EVEX_0F38C7_REG_6
954 };
955
956 enum
957 {
958 RM_C6_REG_7 = 0,
959 RM_C7_REG_7,
960 RM_0F01_REG_0,
961 RM_0F01_REG_1,
962 RM_0F01_REG_2,
963 RM_0F01_REG_3,
964 RM_0F01_REG_5,
965 RM_0F01_REG_7,
966 RM_0F1E_MOD_3_REG_7,
967 RM_0FAE_REG_6,
968 RM_0FAE_REG_7
969 };
970
971 enum
972 {
973 PREFIX_90 = 0,
974 PREFIX_MOD_0_0F01_REG_5,
975 PREFIX_MOD_3_0F01_REG_5_RM_0,
976 PREFIX_MOD_3_0F01_REG_5_RM_2,
977 PREFIX_0F09,
978 PREFIX_0F10,
979 PREFIX_0F11,
980 PREFIX_0F12,
981 PREFIX_0F16,
982 PREFIX_0F1A,
983 PREFIX_0F1B,
984 PREFIX_0F1C,
985 PREFIX_0F1E,
986 PREFIX_0F2A,
987 PREFIX_0F2B,
988 PREFIX_0F2C,
989 PREFIX_0F2D,
990 PREFIX_0F2E,
991 PREFIX_0F2F,
992 PREFIX_0F51,
993 PREFIX_0F52,
994 PREFIX_0F53,
995 PREFIX_0F58,
996 PREFIX_0F59,
997 PREFIX_0F5A,
998 PREFIX_0F5B,
999 PREFIX_0F5C,
1000 PREFIX_0F5D,
1001 PREFIX_0F5E,
1002 PREFIX_0F5F,
1003 PREFIX_0F60,
1004 PREFIX_0F61,
1005 PREFIX_0F62,
1006 PREFIX_0F6C,
1007 PREFIX_0F6D,
1008 PREFIX_0F6F,
1009 PREFIX_0F70,
1010 PREFIX_0F73_REG_3,
1011 PREFIX_0F73_REG_7,
1012 PREFIX_0F78,
1013 PREFIX_0F79,
1014 PREFIX_0F7C,
1015 PREFIX_0F7D,
1016 PREFIX_0F7E,
1017 PREFIX_0F7F,
1018 PREFIX_0FAE_REG_0,
1019 PREFIX_0FAE_REG_1,
1020 PREFIX_0FAE_REG_2,
1021 PREFIX_0FAE_REG_3,
1022 PREFIX_MOD_0_0FAE_REG_4,
1023 PREFIX_MOD_3_0FAE_REG_4,
1024 PREFIX_MOD_0_0FAE_REG_5,
1025 PREFIX_MOD_3_0FAE_REG_5,
1026 PREFIX_MOD_0_0FAE_REG_6,
1027 PREFIX_MOD_1_0FAE_REG_6,
1028 PREFIX_0FAE_REG_7,
1029 PREFIX_0FB8,
1030 PREFIX_0FBC,
1031 PREFIX_0FBD,
1032 PREFIX_0FC2,
1033 PREFIX_MOD_0_0FC3,
1034 PREFIX_MOD_0_0FC7_REG_6,
1035 PREFIX_MOD_3_0FC7_REG_6,
1036 PREFIX_MOD_3_0FC7_REG_7,
1037 PREFIX_0FD0,
1038 PREFIX_0FD6,
1039 PREFIX_0FE6,
1040 PREFIX_0FE7,
1041 PREFIX_0FF0,
1042 PREFIX_0FF7,
1043 PREFIX_0F3810,
1044 PREFIX_0F3814,
1045 PREFIX_0F3815,
1046 PREFIX_0F3817,
1047 PREFIX_0F3820,
1048 PREFIX_0F3821,
1049 PREFIX_0F3822,
1050 PREFIX_0F3823,
1051 PREFIX_0F3824,
1052 PREFIX_0F3825,
1053 PREFIX_0F3828,
1054 PREFIX_0F3829,
1055 PREFIX_0F382A,
1056 PREFIX_0F382B,
1057 PREFIX_0F3830,
1058 PREFIX_0F3831,
1059 PREFIX_0F3832,
1060 PREFIX_0F3833,
1061 PREFIX_0F3834,
1062 PREFIX_0F3835,
1063 PREFIX_0F3837,
1064 PREFIX_0F3838,
1065 PREFIX_0F3839,
1066 PREFIX_0F383A,
1067 PREFIX_0F383B,
1068 PREFIX_0F383C,
1069 PREFIX_0F383D,
1070 PREFIX_0F383E,
1071 PREFIX_0F383F,
1072 PREFIX_0F3840,
1073 PREFIX_0F3841,
1074 PREFIX_0F3880,
1075 PREFIX_0F3881,
1076 PREFIX_0F3882,
1077 PREFIX_0F38C8,
1078 PREFIX_0F38C9,
1079 PREFIX_0F38CA,
1080 PREFIX_0F38CB,
1081 PREFIX_0F38CC,
1082 PREFIX_0F38CD,
1083 PREFIX_0F38CF,
1084 PREFIX_0F38DB,
1085 PREFIX_0F38DC,
1086 PREFIX_0F38DD,
1087 PREFIX_0F38DE,
1088 PREFIX_0F38DF,
1089 PREFIX_0F38F0,
1090 PREFIX_0F38F1,
1091 PREFIX_0F38F5,
1092 PREFIX_0F38F6,
1093 PREFIX_0F38F8,
1094 PREFIX_0F38F9,
1095 PREFIX_0F3A08,
1096 PREFIX_0F3A09,
1097 PREFIX_0F3A0A,
1098 PREFIX_0F3A0B,
1099 PREFIX_0F3A0C,
1100 PREFIX_0F3A0D,
1101 PREFIX_0F3A0E,
1102 PREFIX_0F3A14,
1103 PREFIX_0F3A15,
1104 PREFIX_0F3A16,
1105 PREFIX_0F3A17,
1106 PREFIX_0F3A20,
1107 PREFIX_0F3A21,
1108 PREFIX_0F3A22,
1109 PREFIX_0F3A40,
1110 PREFIX_0F3A41,
1111 PREFIX_0F3A42,
1112 PREFIX_0F3A44,
1113 PREFIX_0F3A60,
1114 PREFIX_0F3A61,
1115 PREFIX_0F3A62,
1116 PREFIX_0F3A63,
1117 PREFIX_0F3ACC,
1118 PREFIX_0F3ACE,
1119 PREFIX_0F3ACF,
1120 PREFIX_0F3ADF,
1121 PREFIX_VEX_0F10,
1122 PREFIX_VEX_0F11,
1123 PREFIX_VEX_0F12,
1124 PREFIX_VEX_0F16,
1125 PREFIX_VEX_0F2A,
1126 PREFIX_VEX_0F2C,
1127 PREFIX_VEX_0F2D,
1128 PREFIX_VEX_0F2E,
1129 PREFIX_VEX_0F2F,
1130 PREFIX_VEX_0F41,
1131 PREFIX_VEX_0F42,
1132 PREFIX_VEX_0F44,
1133 PREFIX_VEX_0F45,
1134 PREFIX_VEX_0F46,
1135 PREFIX_VEX_0F47,
1136 PREFIX_VEX_0F4A,
1137 PREFIX_VEX_0F4B,
1138 PREFIX_VEX_0F51,
1139 PREFIX_VEX_0F52,
1140 PREFIX_VEX_0F53,
1141 PREFIX_VEX_0F58,
1142 PREFIX_VEX_0F59,
1143 PREFIX_VEX_0F5A,
1144 PREFIX_VEX_0F5B,
1145 PREFIX_VEX_0F5C,
1146 PREFIX_VEX_0F5D,
1147 PREFIX_VEX_0F5E,
1148 PREFIX_VEX_0F5F,
1149 PREFIX_VEX_0F60,
1150 PREFIX_VEX_0F61,
1151 PREFIX_VEX_0F62,
1152 PREFIX_VEX_0F63,
1153 PREFIX_VEX_0F64,
1154 PREFIX_VEX_0F65,
1155 PREFIX_VEX_0F66,
1156 PREFIX_VEX_0F67,
1157 PREFIX_VEX_0F68,
1158 PREFIX_VEX_0F69,
1159 PREFIX_VEX_0F6A,
1160 PREFIX_VEX_0F6B,
1161 PREFIX_VEX_0F6C,
1162 PREFIX_VEX_0F6D,
1163 PREFIX_VEX_0F6E,
1164 PREFIX_VEX_0F6F,
1165 PREFIX_VEX_0F70,
1166 PREFIX_VEX_0F71_REG_2,
1167 PREFIX_VEX_0F71_REG_4,
1168 PREFIX_VEX_0F71_REG_6,
1169 PREFIX_VEX_0F72_REG_2,
1170 PREFIX_VEX_0F72_REG_4,
1171 PREFIX_VEX_0F72_REG_6,
1172 PREFIX_VEX_0F73_REG_2,
1173 PREFIX_VEX_0F73_REG_3,
1174 PREFIX_VEX_0F73_REG_6,
1175 PREFIX_VEX_0F73_REG_7,
1176 PREFIX_VEX_0F74,
1177 PREFIX_VEX_0F75,
1178 PREFIX_VEX_0F76,
1179 PREFIX_VEX_0F77,
1180 PREFIX_VEX_0F7C,
1181 PREFIX_VEX_0F7D,
1182 PREFIX_VEX_0F7E,
1183 PREFIX_VEX_0F7F,
1184 PREFIX_VEX_0F90,
1185 PREFIX_VEX_0F91,
1186 PREFIX_VEX_0F92,
1187 PREFIX_VEX_0F93,
1188 PREFIX_VEX_0F98,
1189 PREFIX_VEX_0F99,
1190 PREFIX_VEX_0FC2,
1191 PREFIX_VEX_0FC4,
1192 PREFIX_VEX_0FC5,
1193 PREFIX_VEX_0FD0,
1194 PREFIX_VEX_0FD1,
1195 PREFIX_VEX_0FD2,
1196 PREFIX_VEX_0FD3,
1197 PREFIX_VEX_0FD4,
1198 PREFIX_VEX_0FD5,
1199 PREFIX_VEX_0FD6,
1200 PREFIX_VEX_0FD7,
1201 PREFIX_VEX_0FD8,
1202 PREFIX_VEX_0FD9,
1203 PREFIX_VEX_0FDA,
1204 PREFIX_VEX_0FDB,
1205 PREFIX_VEX_0FDC,
1206 PREFIX_VEX_0FDD,
1207 PREFIX_VEX_0FDE,
1208 PREFIX_VEX_0FDF,
1209 PREFIX_VEX_0FE0,
1210 PREFIX_VEX_0FE1,
1211 PREFIX_VEX_0FE2,
1212 PREFIX_VEX_0FE3,
1213 PREFIX_VEX_0FE4,
1214 PREFIX_VEX_0FE5,
1215 PREFIX_VEX_0FE6,
1216 PREFIX_VEX_0FE7,
1217 PREFIX_VEX_0FE8,
1218 PREFIX_VEX_0FE9,
1219 PREFIX_VEX_0FEA,
1220 PREFIX_VEX_0FEB,
1221 PREFIX_VEX_0FEC,
1222 PREFIX_VEX_0FED,
1223 PREFIX_VEX_0FEE,
1224 PREFIX_VEX_0FEF,
1225 PREFIX_VEX_0FF0,
1226 PREFIX_VEX_0FF1,
1227 PREFIX_VEX_0FF2,
1228 PREFIX_VEX_0FF3,
1229 PREFIX_VEX_0FF4,
1230 PREFIX_VEX_0FF5,
1231 PREFIX_VEX_0FF6,
1232 PREFIX_VEX_0FF7,
1233 PREFIX_VEX_0FF8,
1234 PREFIX_VEX_0FF9,
1235 PREFIX_VEX_0FFA,
1236 PREFIX_VEX_0FFB,
1237 PREFIX_VEX_0FFC,
1238 PREFIX_VEX_0FFD,
1239 PREFIX_VEX_0FFE,
1240 PREFIX_VEX_0F3800,
1241 PREFIX_VEX_0F3801,
1242 PREFIX_VEX_0F3802,
1243 PREFIX_VEX_0F3803,
1244 PREFIX_VEX_0F3804,
1245 PREFIX_VEX_0F3805,
1246 PREFIX_VEX_0F3806,
1247 PREFIX_VEX_0F3807,
1248 PREFIX_VEX_0F3808,
1249 PREFIX_VEX_0F3809,
1250 PREFIX_VEX_0F380A,
1251 PREFIX_VEX_0F380B,
1252 PREFIX_VEX_0F380C,
1253 PREFIX_VEX_0F380D,
1254 PREFIX_VEX_0F380E,
1255 PREFIX_VEX_0F380F,
1256 PREFIX_VEX_0F3813,
1257 PREFIX_VEX_0F3816,
1258 PREFIX_VEX_0F3817,
1259 PREFIX_VEX_0F3818,
1260 PREFIX_VEX_0F3819,
1261 PREFIX_VEX_0F381A,
1262 PREFIX_VEX_0F381C,
1263 PREFIX_VEX_0F381D,
1264 PREFIX_VEX_0F381E,
1265 PREFIX_VEX_0F3820,
1266 PREFIX_VEX_0F3821,
1267 PREFIX_VEX_0F3822,
1268 PREFIX_VEX_0F3823,
1269 PREFIX_VEX_0F3824,
1270 PREFIX_VEX_0F3825,
1271 PREFIX_VEX_0F3828,
1272 PREFIX_VEX_0F3829,
1273 PREFIX_VEX_0F382A,
1274 PREFIX_VEX_0F382B,
1275 PREFIX_VEX_0F382C,
1276 PREFIX_VEX_0F382D,
1277 PREFIX_VEX_0F382E,
1278 PREFIX_VEX_0F382F,
1279 PREFIX_VEX_0F3830,
1280 PREFIX_VEX_0F3831,
1281 PREFIX_VEX_0F3832,
1282 PREFIX_VEX_0F3833,
1283 PREFIX_VEX_0F3834,
1284 PREFIX_VEX_0F3835,
1285 PREFIX_VEX_0F3836,
1286 PREFIX_VEX_0F3837,
1287 PREFIX_VEX_0F3838,
1288 PREFIX_VEX_0F3839,
1289 PREFIX_VEX_0F383A,
1290 PREFIX_VEX_0F383B,
1291 PREFIX_VEX_0F383C,
1292 PREFIX_VEX_0F383D,
1293 PREFIX_VEX_0F383E,
1294 PREFIX_VEX_0F383F,
1295 PREFIX_VEX_0F3840,
1296 PREFIX_VEX_0F3841,
1297 PREFIX_VEX_0F3845,
1298 PREFIX_VEX_0F3846,
1299 PREFIX_VEX_0F3847,
1300 PREFIX_VEX_0F3858,
1301 PREFIX_VEX_0F3859,
1302 PREFIX_VEX_0F385A,
1303 PREFIX_VEX_0F3878,
1304 PREFIX_VEX_0F3879,
1305 PREFIX_VEX_0F388C,
1306 PREFIX_VEX_0F388E,
1307 PREFIX_VEX_0F3890,
1308 PREFIX_VEX_0F3891,
1309 PREFIX_VEX_0F3892,
1310 PREFIX_VEX_0F3893,
1311 PREFIX_VEX_0F3896,
1312 PREFIX_VEX_0F3897,
1313 PREFIX_VEX_0F3898,
1314 PREFIX_VEX_0F3899,
1315 PREFIX_VEX_0F389A,
1316 PREFIX_VEX_0F389B,
1317 PREFIX_VEX_0F389C,
1318 PREFIX_VEX_0F389D,
1319 PREFIX_VEX_0F389E,
1320 PREFIX_VEX_0F389F,
1321 PREFIX_VEX_0F38A6,
1322 PREFIX_VEX_0F38A7,
1323 PREFIX_VEX_0F38A8,
1324 PREFIX_VEX_0F38A9,
1325 PREFIX_VEX_0F38AA,
1326 PREFIX_VEX_0F38AB,
1327 PREFIX_VEX_0F38AC,
1328 PREFIX_VEX_0F38AD,
1329 PREFIX_VEX_0F38AE,
1330 PREFIX_VEX_0F38AF,
1331 PREFIX_VEX_0F38B6,
1332 PREFIX_VEX_0F38B7,
1333 PREFIX_VEX_0F38B8,
1334 PREFIX_VEX_0F38B9,
1335 PREFIX_VEX_0F38BA,
1336 PREFIX_VEX_0F38BB,
1337 PREFIX_VEX_0F38BC,
1338 PREFIX_VEX_0F38BD,
1339 PREFIX_VEX_0F38BE,
1340 PREFIX_VEX_0F38BF,
1341 PREFIX_VEX_0F38CF,
1342 PREFIX_VEX_0F38DB,
1343 PREFIX_VEX_0F38DC,
1344 PREFIX_VEX_0F38DD,
1345 PREFIX_VEX_0F38DE,
1346 PREFIX_VEX_0F38DF,
1347 PREFIX_VEX_0F38F2,
1348 PREFIX_VEX_0F38F3_REG_1,
1349 PREFIX_VEX_0F38F3_REG_2,
1350 PREFIX_VEX_0F38F3_REG_3,
1351 PREFIX_VEX_0F38F5,
1352 PREFIX_VEX_0F38F6,
1353 PREFIX_VEX_0F38F7,
1354 PREFIX_VEX_0F3A00,
1355 PREFIX_VEX_0F3A01,
1356 PREFIX_VEX_0F3A02,
1357 PREFIX_VEX_0F3A04,
1358 PREFIX_VEX_0F3A05,
1359 PREFIX_VEX_0F3A06,
1360 PREFIX_VEX_0F3A08,
1361 PREFIX_VEX_0F3A09,
1362 PREFIX_VEX_0F3A0A,
1363 PREFIX_VEX_0F3A0B,
1364 PREFIX_VEX_0F3A0C,
1365 PREFIX_VEX_0F3A0D,
1366 PREFIX_VEX_0F3A0E,
1367 PREFIX_VEX_0F3A0F,
1368 PREFIX_VEX_0F3A14,
1369 PREFIX_VEX_0F3A15,
1370 PREFIX_VEX_0F3A16,
1371 PREFIX_VEX_0F3A17,
1372 PREFIX_VEX_0F3A18,
1373 PREFIX_VEX_0F3A19,
1374 PREFIX_VEX_0F3A1D,
1375 PREFIX_VEX_0F3A20,
1376 PREFIX_VEX_0F3A21,
1377 PREFIX_VEX_0F3A22,
1378 PREFIX_VEX_0F3A30,
1379 PREFIX_VEX_0F3A31,
1380 PREFIX_VEX_0F3A32,
1381 PREFIX_VEX_0F3A33,
1382 PREFIX_VEX_0F3A38,
1383 PREFIX_VEX_0F3A39,
1384 PREFIX_VEX_0F3A40,
1385 PREFIX_VEX_0F3A41,
1386 PREFIX_VEX_0F3A42,
1387 PREFIX_VEX_0F3A44,
1388 PREFIX_VEX_0F3A46,
1389 PREFIX_VEX_0F3A48,
1390 PREFIX_VEX_0F3A49,
1391 PREFIX_VEX_0F3A4A,
1392 PREFIX_VEX_0F3A4B,
1393 PREFIX_VEX_0F3A4C,
1394 PREFIX_VEX_0F3A5C,
1395 PREFIX_VEX_0F3A5D,
1396 PREFIX_VEX_0F3A5E,
1397 PREFIX_VEX_0F3A5F,
1398 PREFIX_VEX_0F3A60,
1399 PREFIX_VEX_0F3A61,
1400 PREFIX_VEX_0F3A62,
1401 PREFIX_VEX_0F3A63,
1402 PREFIX_VEX_0F3A68,
1403 PREFIX_VEX_0F3A69,
1404 PREFIX_VEX_0F3A6A,
1405 PREFIX_VEX_0F3A6B,
1406 PREFIX_VEX_0F3A6C,
1407 PREFIX_VEX_0F3A6D,
1408 PREFIX_VEX_0F3A6E,
1409 PREFIX_VEX_0F3A6F,
1410 PREFIX_VEX_0F3A78,
1411 PREFIX_VEX_0F3A79,
1412 PREFIX_VEX_0F3A7A,
1413 PREFIX_VEX_0F3A7B,
1414 PREFIX_VEX_0F3A7C,
1415 PREFIX_VEX_0F3A7D,
1416 PREFIX_VEX_0F3A7E,
1417 PREFIX_VEX_0F3A7F,
1418 PREFIX_VEX_0F3ACE,
1419 PREFIX_VEX_0F3ACF,
1420 PREFIX_VEX_0F3ADF,
1421 PREFIX_VEX_0F3AF0,
1422
1423 PREFIX_EVEX_0F10,
1424 PREFIX_EVEX_0F11,
1425 PREFIX_EVEX_0F12,
1426 PREFIX_EVEX_0F13,
1427 PREFIX_EVEX_0F14,
1428 PREFIX_EVEX_0F15,
1429 PREFIX_EVEX_0F16,
1430 PREFIX_EVEX_0F17,
1431 PREFIX_EVEX_0F28,
1432 PREFIX_EVEX_0F29,
1433 PREFIX_EVEX_0F2A,
1434 PREFIX_EVEX_0F2B,
1435 PREFIX_EVEX_0F2C,
1436 PREFIX_EVEX_0F2D,
1437 PREFIX_EVEX_0F2E,
1438 PREFIX_EVEX_0F2F,
1439 PREFIX_EVEX_0F51,
1440 PREFIX_EVEX_0F54,
1441 PREFIX_EVEX_0F55,
1442 PREFIX_EVEX_0F56,
1443 PREFIX_EVEX_0F57,
1444 PREFIX_EVEX_0F58,
1445 PREFIX_EVEX_0F59,
1446 PREFIX_EVEX_0F5A,
1447 PREFIX_EVEX_0F5B,
1448 PREFIX_EVEX_0F5C,
1449 PREFIX_EVEX_0F5D,
1450 PREFIX_EVEX_0F5E,
1451 PREFIX_EVEX_0F5F,
1452 PREFIX_EVEX_0F60,
1453 PREFIX_EVEX_0F61,
1454 PREFIX_EVEX_0F62,
1455 PREFIX_EVEX_0F63,
1456 PREFIX_EVEX_0F64,
1457 PREFIX_EVEX_0F65,
1458 PREFIX_EVEX_0F66,
1459 PREFIX_EVEX_0F67,
1460 PREFIX_EVEX_0F68,
1461 PREFIX_EVEX_0F69,
1462 PREFIX_EVEX_0F6A,
1463 PREFIX_EVEX_0F6B,
1464 PREFIX_EVEX_0F6C,
1465 PREFIX_EVEX_0F6D,
1466 PREFIX_EVEX_0F6E,
1467 PREFIX_EVEX_0F6F,
1468 PREFIX_EVEX_0F70,
1469 PREFIX_EVEX_0F71_REG_2,
1470 PREFIX_EVEX_0F71_REG_4,
1471 PREFIX_EVEX_0F71_REG_6,
1472 PREFIX_EVEX_0F72_REG_0,
1473 PREFIX_EVEX_0F72_REG_1,
1474 PREFIX_EVEX_0F72_REG_2,
1475 PREFIX_EVEX_0F72_REG_4,
1476 PREFIX_EVEX_0F72_REG_6,
1477 PREFIX_EVEX_0F73_REG_2,
1478 PREFIX_EVEX_0F73_REG_3,
1479 PREFIX_EVEX_0F73_REG_6,
1480 PREFIX_EVEX_0F73_REG_7,
1481 PREFIX_EVEX_0F74,
1482 PREFIX_EVEX_0F75,
1483 PREFIX_EVEX_0F76,
1484 PREFIX_EVEX_0F78,
1485 PREFIX_EVEX_0F79,
1486 PREFIX_EVEX_0F7A,
1487 PREFIX_EVEX_0F7B,
1488 PREFIX_EVEX_0F7E,
1489 PREFIX_EVEX_0F7F,
1490 PREFIX_EVEX_0FC2,
1491 PREFIX_EVEX_0FC4,
1492 PREFIX_EVEX_0FC5,
1493 PREFIX_EVEX_0FC6,
1494 PREFIX_EVEX_0FD1,
1495 PREFIX_EVEX_0FD2,
1496 PREFIX_EVEX_0FD3,
1497 PREFIX_EVEX_0FD4,
1498 PREFIX_EVEX_0FD5,
1499 PREFIX_EVEX_0FD6,
1500 PREFIX_EVEX_0FD8,
1501 PREFIX_EVEX_0FD9,
1502 PREFIX_EVEX_0FDA,
1503 PREFIX_EVEX_0FDB,
1504 PREFIX_EVEX_0FDC,
1505 PREFIX_EVEX_0FDD,
1506 PREFIX_EVEX_0FDE,
1507 PREFIX_EVEX_0FDF,
1508 PREFIX_EVEX_0FE0,
1509 PREFIX_EVEX_0FE1,
1510 PREFIX_EVEX_0FE2,
1511 PREFIX_EVEX_0FE3,
1512 PREFIX_EVEX_0FE4,
1513 PREFIX_EVEX_0FE5,
1514 PREFIX_EVEX_0FE6,
1515 PREFIX_EVEX_0FE7,
1516 PREFIX_EVEX_0FE8,
1517 PREFIX_EVEX_0FE9,
1518 PREFIX_EVEX_0FEA,
1519 PREFIX_EVEX_0FEB,
1520 PREFIX_EVEX_0FEC,
1521 PREFIX_EVEX_0FED,
1522 PREFIX_EVEX_0FEE,
1523 PREFIX_EVEX_0FEF,
1524 PREFIX_EVEX_0FF1,
1525 PREFIX_EVEX_0FF2,
1526 PREFIX_EVEX_0FF3,
1527 PREFIX_EVEX_0FF4,
1528 PREFIX_EVEX_0FF5,
1529 PREFIX_EVEX_0FF6,
1530 PREFIX_EVEX_0FF8,
1531 PREFIX_EVEX_0FF9,
1532 PREFIX_EVEX_0FFA,
1533 PREFIX_EVEX_0FFB,
1534 PREFIX_EVEX_0FFC,
1535 PREFIX_EVEX_0FFD,
1536 PREFIX_EVEX_0FFE,
1537 PREFIX_EVEX_0F3800,
1538 PREFIX_EVEX_0F3804,
1539 PREFIX_EVEX_0F380B,
1540 PREFIX_EVEX_0F380C,
1541 PREFIX_EVEX_0F380D,
1542 PREFIX_EVEX_0F3810,
1543 PREFIX_EVEX_0F3811,
1544 PREFIX_EVEX_0F3812,
1545 PREFIX_EVEX_0F3813,
1546 PREFIX_EVEX_0F3814,
1547 PREFIX_EVEX_0F3815,
1548 PREFIX_EVEX_0F3816,
1549 PREFIX_EVEX_0F3818,
1550 PREFIX_EVEX_0F3819,
1551 PREFIX_EVEX_0F381A,
1552 PREFIX_EVEX_0F381B,
1553 PREFIX_EVEX_0F381C,
1554 PREFIX_EVEX_0F381D,
1555 PREFIX_EVEX_0F381E,
1556 PREFIX_EVEX_0F381F,
1557 PREFIX_EVEX_0F3820,
1558 PREFIX_EVEX_0F3821,
1559 PREFIX_EVEX_0F3822,
1560 PREFIX_EVEX_0F3823,
1561 PREFIX_EVEX_0F3824,
1562 PREFIX_EVEX_0F3825,
1563 PREFIX_EVEX_0F3826,
1564 PREFIX_EVEX_0F3827,
1565 PREFIX_EVEX_0F3828,
1566 PREFIX_EVEX_0F3829,
1567 PREFIX_EVEX_0F382A,
1568 PREFIX_EVEX_0F382B,
1569 PREFIX_EVEX_0F382C,
1570 PREFIX_EVEX_0F382D,
1571 PREFIX_EVEX_0F3830,
1572 PREFIX_EVEX_0F3831,
1573 PREFIX_EVEX_0F3832,
1574 PREFIX_EVEX_0F3833,
1575 PREFIX_EVEX_0F3834,
1576 PREFIX_EVEX_0F3835,
1577 PREFIX_EVEX_0F3836,
1578 PREFIX_EVEX_0F3837,
1579 PREFIX_EVEX_0F3838,
1580 PREFIX_EVEX_0F3839,
1581 PREFIX_EVEX_0F383A,
1582 PREFIX_EVEX_0F383B,
1583 PREFIX_EVEX_0F383C,
1584 PREFIX_EVEX_0F383D,
1585 PREFIX_EVEX_0F383E,
1586 PREFIX_EVEX_0F383F,
1587 PREFIX_EVEX_0F3840,
1588 PREFIX_EVEX_0F3842,
1589 PREFIX_EVEX_0F3843,
1590 PREFIX_EVEX_0F3844,
1591 PREFIX_EVEX_0F3845,
1592 PREFIX_EVEX_0F3846,
1593 PREFIX_EVEX_0F3847,
1594 PREFIX_EVEX_0F384C,
1595 PREFIX_EVEX_0F384D,
1596 PREFIX_EVEX_0F384E,
1597 PREFIX_EVEX_0F384F,
1598 PREFIX_EVEX_0F3850,
1599 PREFIX_EVEX_0F3851,
1600 PREFIX_EVEX_0F3852,
1601 PREFIX_EVEX_0F3853,
1602 PREFIX_EVEX_0F3854,
1603 PREFIX_EVEX_0F3855,
1604 PREFIX_EVEX_0F3858,
1605 PREFIX_EVEX_0F3859,
1606 PREFIX_EVEX_0F385A,
1607 PREFIX_EVEX_0F385B,
1608 PREFIX_EVEX_0F3862,
1609 PREFIX_EVEX_0F3863,
1610 PREFIX_EVEX_0F3864,
1611 PREFIX_EVEX_0F3865,
1612 PREFIX_EVEX_0F3866,
1613 PREFIX_EVEX_0F3868,
1614 PREFIX_EVEX_0F3870,
1615 PREFIX_EVEX_0F3871,
1616 PREFIX_EVEX_0F3872,
1617 PREFIX_EVEX_0F3873,
1618 PREFIX_EVEX_0F3875,
1619 PREFIX_EVEX_0F3876,
1620 PREFIX_EVEX_0F3877,
1621 PREFIX_EVEX_0F3878,
1622 PREFIX_EVEX_0F3879,
1623 PREFIX_EVEX_0F387A,
1624 PREFIX_EVEX_0F387B,
1625 PREFIX_EVEX_0F387C,
1626 PREFIX_EVEX_0F387D,
1627 PREFIX_EVEX_0F387E,
1628 PREFIX_EVEX_0F387F,
1629 PREFIX_EVEX_0F3883,
1630 PREFIX_EVEX_0F3888,
1631 PREFIX_EVEX_0F3889,
1632 PREFIX_EVEX_0F388A,
1633 PREFIX_EVEX_0F388B,
1634 PREFIX_EVEX_0F388D,
1635 PREFIX_EVEX_0F388F,
1636 PREFIX_EVEX_0F3890,
1637 PREFIX_EVEX_0F3891,
1638 PREFIX_EVEX_0F3892,
1639 PREFIX_EVEX_0F3893,
1640 PREFIX_EVEX_0F3896,
1641 PREFIX_EVEX_0F3897,
1642 PREFIX_EVEX_0F3898,
1643 PREFIX_EVEX_0F3899,
1644 PREFIX_EVEX_0F389A,
1645 PREFIX_EVEX_0F389B,
1646 PREFIX_EVEX_0F389C,
1647 PREFIX_EVEX_0F389D,
1648 PREFIX_EVEX_0F389E,
1649 PREFIX_EVEX_0F389F,
1650 PREFIX_EVEX_0F38A0,
1651 PREFIX_EVEX_0F38A1,
1652 PREFIX_EVEX_0F38A2,
1653 PREFIX_EVEX_0F38A3,
1654 PREFIX_EVEX_0F38A6,
1655 PREFIX_EVEX_0F38A7,
1656 PREFIX_EVEX_0F38A8,
1657 PREFIX_EVEX_0F38A9,
1658 PREFIX_EVEX_0F38AA,
1659 PREFIX_EVEX_0F38AB,
1660 PREFIX_EVEX_0F38AC,
1661 PREFIX_EVEX_0F38AD,
1662 PREFIX_EVEX_0F38AE,
1663 PREFIX_EVEX_0F38AF,
1664 PREFIX_EVEX_0F38B4,
1665 PREFIX_EVEX_0F38B5,
1666 PREFIX_EVEX_0F38B6,
1667 PREFIX_EVEX_0F38B7,
1668 PREFIX_EVEX_0F38B8,
1669 PREFIX_EVEX_0F38B9,
1670 PREFIX_EVEX_0F38BA,
1671 PREFIX_EVEX_0F38BB,
1672 PREFIX_EVEX_0F38BC,
1673 PREFIX_EVEX_0F38BD,
1674 PREFIX_EVEX_0F38BE,
1675 PREFIX_EVEX_0F38BF,
1676 PREFIX_EVEX_0F38C4,
1677 PREFIX_EVEX_0F38C6_REG_1,
1678 PREFIX_EVEX_0F38C6_REG_2,
1679 PREFIX_EVEX_0F38C6_REG_5,
1680 PREFIX_EVEX_0F38C6_REG_6,
1681 PREFIX_EVEX_0F38C7_REG_1,
1682 PREFIX_EVEX_0F38C7_REG_2,
1683 PREFIX_EVEX_0F38C7_REG_5,
1684 PREFIX_EVEX_0F38C7_REG_6,
1685 PREFIX_EVEX_0F38C8,
1686 PREFIX_EVEX_0F38CA,
1687 PREFIX_EVEX_0F38CB,
1688 PREFIX_EVEX_0F38CC,
1689 PREFIX_EVEX_0F38CD,
1690 PREFIX_EVEX_0F38CF,
1691 PREFIX_EVEX_0F38DC,
1692 PREFIX_EVEX_0F38DD,
1693 PREFIX_EVEX_0F38DE,
1694 PREFIX_EVEX_0F38DF,
1695
1696 PREFIX_EVEX_0F3A00,
1697 PREFIX_EVEX_0F3A01,
1698 PREFIX_EVEX_0F3A03,
1699 PREFIX_EVEX_0F3A04,
1700 PREFIX_EVEX_0F3A05,
1701 PREFIX_EVEX_0F3A08,
1702 PREFIX_EVEX_0F3A09,
1703 PREFIX_EVEX_0F3A0A,
1704 PREFIX_EVEX_0F3A0B,
1705 PREFIX_EVEX_0F3A0F,
1706 PREFIX_EVEX_0F3A14,
1707 PREFIX_EVEX_0F3A15,
1708 PREFIX_EVEX_0F3A16,
1709 PREFIX_EVEX_0F3A17,
1710 PREFIX_EVEX_0F3A18,
1711 PREFIX_EVEX_0F3A19,
1712 PREFIX_EVEX_0F3A1A,
1713 PREFIX_EVEX_0F3A1B,
1714 PREFIX_EVEX_0F3A1D,
1715 PREFIX_EVEX_0F3A1E,
1716 PREFIX_EVEX_0F3A1F,
1717 PREFIX_EVEX_0F3A20,
1718 PREFIX_EVEX_0F3A21,
1719 PREFIX_EVEX_0F3A22,
1720 PREFIX_EVEX_0F3A23,
1721 PREFIX_EVEX_0F3A25,
1722 PREFIX_EVEX_0F3A26,
1723 PREFIX_EVEX_0F3A27,
1724 PREFIX_EVEX_0F3A38,
1725 PREFIX_EVEX_0F3A39,
1726 PREFIX_EVEX_0F3A3A,
1727 PREFIX_EVEX_0F3A3B,
1728 PREFIX_EVEX_0F3A3E,
1729 PREFIX_EVEX_0F3A3F,
1730 PREFIX_EVEX_0F3A42,
1731 PREFIX_EVEX_0F3A43,
1732 PREFIX_EVEX_0F3A44,
1733 PREFIX_EVEX_0F3A50,
1734 PREFIX_EVEX_0F3A51,
1735 PREFIX_EVEX_0F3A54,
1736 PREFIX_EVEX_0F3A55,
1737 PREFIX_EVEX_0F3A56,
1738 PREFIX_EVEX_0F3A57,
1739 PREFIX_EVEX_0F3A66,
1740 PREFIX_EVEX_0F3A67,
1741 PREFIX_EVEX_0F3A70,
1742 PREFIX_EVEX_0F3A71,
1743 PREFIX_EVEX_0F3A72,
1744 PREFIX_EVEX_0F3A73,
1745 PREFIX_EVEX_0F3ACE,
1746 PREFIX_EVEX_0F3ACF
1747 };
1748
1749 enum
1750 {
1751 X86_64_06 = 0,
1752 X86_64_07,
1753 X86_64_0D,
1754 X86_64_16,
1755 X86_64_17,
1756 X86_64_1E,
1757 X86_64_1F,
1758 X86_64_27,
1759 X86_64_2F,
1760 X86_64_37,
1761 X86_64_3F,
1762 X86_64_60,
1763 X86_64_61,
1764 X86_64_62,
1765 X86_64_63,
1766 X86_64_6D,
1767 X86_64_6F,
1768 X86_64_82,
1769 X86_64_9A,
1770 X86_64_C4,
1771 X86_64_C5,
1772 X86_64_CE,
1773 X86_64_D4,
1774 X86_64_D5,
1775 X86_64_E8,
1776 X86_64_E9,
1777 X86_64_EA,
1778 X86_64_0F01_REG_0,
1779 X86_64_0F01_REG_1,
1780 X86_64_0F01_REG_2,
1781 X86_64_0F01_REG_3
1782 };
1783
1784 enum
1785 {
1786 THREE_BYTE_0F38 = 0,
1787 THREE_BYTE_0F3A
1788 };
1789
1790 enum
1791 {
1792 XOP_08 = 0,
1793 XOP_09,
1794 XOP_0A
1795 };
1796
1797 enum
1798 {
1799 VEX_0F = 0,
1800 VEX_0F38,
1801 VEX_0F3A
1802 };
1803
1804 enum
1805 {
1806 EVEX_0F = 0,
1807 EVEX_0F38,
1808 EVEX_0F3A
1809 };
1810
1811 enum
1812 {
1813 VEX_LEN_0F12_P_0_M_0 = 0,
1814 VEX_LEN_0F12_P_0_M_1,
1815 VEX_LEN_0F12_P_2,
1816 VEX_LEN_0F13_M_0,
1817 VEX_LEN_0F16_P_0_M_0,
1818 VEX_LEN_0F16_P_0_M_1,
1819 VEX_LEN_0F16_P_2,
1820 VEX_LEN_0F17_M_0,
1821 VEX_LEN_0F41_P_0,
1822 VEX_LEN_0F41_P_2,
1823 VEX_LEN_0F42_P_0,
1824 VEX_LEN_0F42_P_2,
1825 VEX_LEN_0F44_P_0,
1826 VEX_LEN_0F44_P_2,
1827 VEX_LEN_0F45_P_0,
1828 VEX_LEN_0F45_P_2,
1829 VEX_LEN_0F46_P_0,
1830 VEX_LEN_0F46_P_2,
1831 VEX_LEN_0F47_P_0,
1832 VEX_LEN_0F47_P_2,
1833 VEX_LEN_0F4A_P_0,
1834 VEX_LEN_0F4A_P_2,
1835 VEX_LEN_0F4B_P_0,
1836 VEX_LEN_0F4B_P_2,
1837 VEX_LEN_0F6E_P_2,
1838 VEX_LEN_0F77_P_0,
1839 VEX_LEN_0F7E_P_1,
1840 VEX_LEN_0F7E_P_2,
1841 VEX_LEN_0F90_P_0,
1842 VEX_LEN_0F90_P_2,
1843 VEX_LEN_0F91_P_0,
1844 VEX_LEN_0F91_P_2,
1845 VEX_LEN_0F92_P_0,
1846 VEX_LEN_0F92_P_2,
1847 VEX_LEN_0F92_P_3,
1848 VEX_LEN_0F93_P_0,
1849 VEX_LEN_0F93_P_2,
1850 VEX_LEN_0F93_P_3,
1851 VEX_LEN_0F98_P_0,
1852 VEX_LEN_0F98_P_2,
1853 VEX_LEN_0F99_P_0,
1854 VEX_LEN_0F99_P_2,
1855 VEX_LEN_0FAE_R_2_M_0,
1856 VEX_LEN_0FAE_R_3_M_0,
1857 VEX_LEN_0FC4_P_2,
1858 VEX_LEN_0FC5_P_2,
1859 VEX_LEN_0FD6_P_2,
1860 VEX_LEN_0FF7_P_2,
1861 VEX_LEN_0F3816_P_2,
1862 VEX_LEN_0F3819_P_2,
1863 VEX_LEN_0F381A_P_2_M_0,
1864 VEX_LEN_0F3836_P_2,
1865 VEX_LEN_0F3841_P_2,
1866 VEX_LEN_0F385A_P_2_M_0,
1867 VEX_LEN_0F38DB_P_2,
1868 VEX_LEN_0F38F2_P_0,
1869 VEX_LEN_0F38F3_R_1_P_0,
1870 VEX_LEN_0F38F3_R_2_P_0,
1871 VEX_LEN_0F38F3_R_3_P_0,
1872 VEX_LEN_0F38F5_P_0,
1873 VEX_LEN_0F38F5_P_1,
1874 VEX_LEN_0F38F5_P_3,
1875 VEX_LEN_0F38F6_P_3,
1876 VEX_LEN_0F38F7_P_0,
1877 VEX_LEN_0F38F7_P_1,
1878 VEX_LEN_0F38F7_P_2,
1879 VEX_LEN_0F38F7_P_3,
1880 VEX_LEN_0F3A00_P_2,
1881 VEX_LEN_0F3A01_P_2,
1882 VEX_LEN_0F3A06_P_2,
1883 VEX_LEN_0F3A14_P_2,
1884 VEX_LEN_0F3A15_P_2,
1885 VEX_LEN_0F3A16_P_2,
1886 VEX_LEN_0F3A17_P_2,
1887 VEX_LEN_0F3A18_P_2,
1888 VEX_LEN_0F3A19_P_2,
1889 VEX_LEN_0F3A20_P_2,
1890 VEX_LEN_0F3A21_P_2,
1891 VEX_LEN_0F3A22_P_2,
1892 VEX_LEN_0F3A30_P_2,
1893 VEX_LEN_0F3A31_P_2,
1894 VEX_LEN_0F3A32_P_2,
1895 VEX_LEN_0F3A33_P_2,
1896 VEX_LEN_0F3A38_P_2,
1897 VEX_LEN_0F3A39_P_2,
1898 VEX_LEN_0F3A41_P_2,
1899 VEX_LEN_0F3A46_P_2,
1900 VEX_LEN_0F3A60_P_2,
1901 VEX_LEN_0F3A61_P_2,
1902 VEX_LEN_0F3A62_P_2,
1903 VEX_LEN_0F3A63_P_2,
1904 VEX_LEN_0F3A6A_P_2,
1905 VEX_LEN_0F3A6B_P_2,
1906 VEX_LEN_0F3A6E_P_2,
1907 VEX_LEN_0F3A6F_P_2,
1908 VEX_LEN_0F3A7A_P_2,
1909 VEX_LEN_0F3A7B_P_2,
1910 VEX_LEN_0F3A7E_P_2,
1911 VEX_LEN_0F3A7F_P_2,
1912 VEX_LEN_0F3ADF_P_2,
1913 VEX_LEN_0F3AF0_P_3,
1914 VEX_LEN_0FXOP_08_CC,
1915 VEX_LEN_0FXOP_08_CD,
1916 VEX_LEN_0FXOP_08_CE,
1917 VEX_LEN_0FXOP_08_CF,
1918 VEX_LEN_0FXOP_08_EC,
1919 VEX_LEN_0FXOP_08_ED,
1920 VEX_LEN_0FXOP_08_EE,
1921 VEX_LEN_0FXOP_08_EF,
1922 VEX_LEN_0FXOP_09_80,
1923 VEX_LEN_0FXOP_09_81
1924 };
1925
1926 enum
1927 {
1928 EVEX_LEN_0F6E_P_2 = 0,
1929 EVEX_LEN_0F7E_P_1,
1930 EVEX_LEN_0F7E_P_2,
1931 EVEX_LEN_0FD6_P_2,
1932 EVEX_LEN_0F3819_P_2_W_0,
1933 EVEX_LEN_0F3819_P_2_W_1,
1934 EVEX_LEN_0F381A_P_2_W_0,
1935 EVEX_LEN_0F381A_P_2_W_1,
1936 EVEX_LEN_0F381B_P_2_W_0,
1937 EVEX_LEN_0F381B_P_2_W_1,
1938 EVEX_LEN_0F385A_P_2_W_0,
1939 EVEX_LEN_0F385A_P_2_W_1,
1940 EVEX_LEN_0F385B_P_2_W_0,
1941 EVEX_LEN_0F385B_P_2_W_1,
1942 EVEX_LEN_0F38C6_REG_1_PREFIX_2,
1943 EVEX_LEN_0F38C6_REG_2_PREFIX_2,
1944 EVEX_LEN_0F38C6_REG_5_PREFIX_2,
1945 EVEX_LEN_0F38C6_REG_6_PREFIX_2,
1946 EVEX_LEN_0F38C7_R_1_P_2_W_0,
1947 EVEX_LEN_0F38C7_R_1_P_2_W_1,
1948 EVEX_LEN_0F38C7_R_2_P_2_W_0,
1949 EVEX_LEN_0F38C7_R_2_P_2_W_1,
1950 EVEX_LEN_0F38C7_R_5_P_2_W_0,
1951 EVEX_LEN_0F38C7_R_5_P_2_W_1,
1952 EVEX_LEN_0F38C7_R_6_P_2_W_0,
1953 EVEX_LEN_0F38C7_R_6_P_2_W_1,
1954 EVEX_LEN_0F3A18_P_2_W_0,
1955 EVEX_LEN_0F3A18_P_2_W_1,
1956 EVEX_LEN_0F3A19_P_2_W_0,
1957 EVEX_LEN_0F3A19_P_2_W_1,
1958 EVEX_LEN_0F3A1A_P_2_W_0,
1959 EVEX_LEN_0F3A1A_P_2_W_1,
1960 EVEX_LEN_0F3A1B_P_2_W_0,
1961 EVEX_LEN_0F3A1B_P_2_W_1,
1962 EVEX_LEN_0F3A23_P_2_W_0,
1963 EVEX_LEN_0F3A23_P_2_W_1,
1964 EVEX_LEN_0F3A38_P_2_W_0,
1965 EVEX_LEN_0F3A38_P_2_W_1,
1966 EVEX_LEN_0F3A39_P_2_W_0,
1967 EVEX_LEN_0F3A39_P_2_W_1,
1968 EVEX_LEN_0F3A3A_P_2_W_0,
1969 EVEX_LEN_0F3A3A_P_2_W_1,
1970 EVEX_LEN_0F3A3B_P_2_W_0,
1971 EVEX_LEN_0F3A3B_P_2_W_1,
1972 EVEX_LEN_0F3A43_P_2_W_0,
1973 EVEX_LEN_0F3A43_P_2_W_1
1974 };
1975
1976 enum
1977 {
1978 VEX_W_0F41_P_0_LEN_1 = 0,
1979 VEX_W_0F41_P_2_LEN_1,
1980 VEX_W_0F42_P_0_LEN_1,
1981 VEX_W_0F42_P_2_LEN_1,
1982 VEX_W_0F44_P_0_LEN_0,
1983 VEX_W_0F44_P_2_LEN_0,
1984 VEX_W_0F45_P_0_LEN_1,
1985 VEX_W_0F45_P_2_LEN_1,
1986 VEX_W_0F46_P_0_LEN_1,
1987 VEX_W_0F46_P_2_LEN_1,
1988 VEX_W_0F47_P_0_LEN_1,
1989 VEX_W_0F47_P_2_LEN_1,
1990 VEX_W_0F4A_P_0_LEN_1,
1991 VEX_W_0F4A_P_2_LEN_1,
1992 VEX_W_0F4B_P_0_LEN_1,
1993 VEX_W_0F4B_P_2_LEN_1,
1994 VEX_W_0F90_P_0_LEN_0,
1995 VEX_W_0F90_P_2_LEN_0,
1996 VEX_W_0F91_P_0_LEN_0,
1997 VEX_W_0F91_P_2_LEN_0,
1998 VEX_W_0F92_P_0_LEN_0,
1999 VEX_W_0F92_P_2_LEN_0,
2000 VEX_W_0F93_P_0_LEN_0,
2001 VEX_W_0F93_P_2_LEN_0,
2002 VEX_W_0F98_P_0_LEN_0,
2003 VEX_W_0F98_P_2_LEN_0,
2004 VEX_W_0F99_P_0_LEN_0,
2005 VEX_W_0F99_P_2_LEN_0,
2006 VEX_W_0F380C_P_2,
2007 VEX_W_0F380D_P_2,
2008 VEX_W_0F380E_P_2,
2009 VEX_W_0F380F_P_2,
2010 VEX_W_0F3816_P_2,
2011 VEX_W_0F3818_P_2,
2012 VEX_W_0F3819_P_2,
2013 VEX_W_0F381A_P_2_M_0,
2014 VEX_W_0F382C_P_2_M_0,
2015 VEX_W_0F382D_P_2_M_0,
2016 VEX_W_0F382E_P_2_M_0,
2017 VEX_W_0F382F_P_2_M_0,
2018 VEX_W_0F3836_P_2,
2019 VEX_W_0F3846_P_2,
2020 VEX_W_0F3858_P_2,
2021 VEX_W_0F3859_P_2,
2022 VEX_W_0F385A_P_2_M_0,
2023 VEX_W_0F3878_P_2,
2024 VEX_W_0F3879_P_2,
2025 VEX_W_0F38CF_P_2,
2026 VEX_W_0F3A00_P_2,
2027 VEX_W_0F3A01_P_2,
2028 VEX_W_0F3A02_P_2,
2029 VEX_W_0F3A04_P_2,
2030 VEX_W_0F3A05_P_2,
2031 VEX_W_0F3A06_P_2,
2032 VEX_W_0F3A18_P_2,
2033 VEX_W_0F3A19_P_2,
2034 VEX_W_0F3A30_P_2_LEN_0,
2035 VEX_W_0F3A31_P_2_LEN_0,
2036 VEX_W_0F3A32_P_2_LEN_0,
2037 VEX_W_0F3A33_P_2_LEN_0,
2038 VEX_W_0F3A38_P_2,
2039 VEX_W_0F3A39_P_2,
2040 VEX_W_0F3A46_P_2,
2041 VEX_W_0F3A48_P_2,
2042 VEX_W_0F3A49_P_2,
2043 VEX_W_0F3A4A_P_2,
2044 VEX_W_0F3A4B_P_2,
2045 VEX_W_0F3A4C_P_2,
2046 VEX_W_0F3ACE_P_2,
2047 VEX_W_0F3ACF_P_2,
2048
2049 EVEX_W_0F10_P_0,
2050 EVEX_W_0F10_P_1_M_0,
2051 EVEX_W_0F10_P_1_M_1,
2052 EVEX_W_0F10_P_2,
2053 EVEX_W_0F10_P_3_M_0,
2054 EVEX_W_0F10_P_3_M_1,
2055 EVEX_W_0F11_P_0,
2056 EVEX_W_0F11_P_1_M_0,
2057 EVEX_W_0F11_P_1_M_1,
2058 EVEX_W_0F11_P_2,
2059 EVEX_W_0F11_P_3_M_0,
2060 EVEX_W_0F11_P_3_M_1,
2061 EVEX_W_0F12_P_0_M_0,
2062 EVEX_W_0F12_P_0_M_1,
2063 EVEX_W_0F12_P_1,
2064 EVEX_W_0F12_P_2,
2065 EVEX_W_0F12_P_3,
2066 EVEX_W_0F13_P_0,
2067 EVEX_W_0F13_P_2,
2068 EVEX_W_0F14_P_0,
2069 EVEX_W_0F14_P_2,
2070 EVEX_W_0F15_P_0,
2071 EVEX_W_0F15_P_2,
2072 EVEX_W_0F16_P_0_M_0,
2073 EVEX_W_0F16_P_0_M_1,
2074 EVEX_W_0F16_P_1,
2075 EVEX_W_0F16_P_2,
2076 EVEX_W_0F17_P_0,
2077 EVEX_W_0F17_P_2,
2078 EVEX_W_0F28_P_0,
2079 EVEX_W_0F28_P_2,
2080 EVEX_W_0F29_P_0,
2081 EVEX_W_0F29_P_2,
2082 EVEX_W_0F2A_P_3,
2083 EVEX_W_0F2B_P_0,
2084 EVEX_W_0F2B_P_2,
2085 EVEX_W_0F2E_P_0,
2086 EVEX_W_0F2E_P_2,
2087 EVEX_W_0F2F_P_0,
2088 EVEX_W_0F2F_P_2,
2089 EVEX_W_0F51_P_0,
2090 EVEX_W_0F51_P_1,
2091 EVEX_W_0F51_P_2,
2092 EVEX_W_0F51_P_3,
2093 EVEX_W_0F54_P_0,
2094 EVEX_W_0F54_P_2,
2095 EVEX_W_0F55_P_0,
2096 EVEX_W_0F55_P_2,
2097 EVEX_W_0F56_P_0,
2098 EVEX_W_0F56_P_2,
2099 EVEX_W_0F57_P_0,
2100 EVEX_W_0F57_P_2,
2101 EVEX_W_0F58_P_0,
2102 EVEX_W_0F58_P_1,
2103 EVEX_W_0F58_P_2,
2104 EVEX_W_0F58_P_3,
2105 EVEX_W_0F59_P_0,
2106 EVEX_W_0F59_P_1,
2107 EVEX_W_0F59_P_2,
2108 EVEX_W_0F59_P_3,
2109 EVEX_W_0F5A_P_0,
2110 EVEX_W_0F5A_P_1,
2111 EVEX_W_0F5A_P_2,
2112 EVEX_W_0F5A_P_3,
2113 EVEX_W_0F5B_P_0,
2114 EVEX_W_0F5B_P_1,
2115 EVEX_W_0F5B_P_2,
2116 EVEX_W_0F5C_P_0,
2117 EVEX_W_0F5C_P_1,
2118 EVEX_W_0F5C_P_2,
2119 EVEX_W_0F5C_P_3,
2120 EVEX_W_0F5D_P_0,
2121 EVEX_W_0F5D_P_1,
2122 EVEX_W_0F5D_P_2,
2123 EVEX_W_0F5D_P_3,
2124 EVEX_W_0F5E_P_0,
2125 EVEX_W_0F5E_P_1,
2126 EVEX_W_0F5E_P_2,
2127 EVEX_W_0F5E_P_3,
2128 EVEX_W_0F5F_P_0,
2129 EVEX_W_0F5F_P_1,
2130 EVEX_W_0F5F_P_2,
2131 EVEX_W_0F5F_P_3,
2132 EVEX_W_0F62_P_2,
2133 EVEX_W_0F66_P_2,
2134 EVEX_W_0F6A_P_2,
2135 EVEX_W_0F6B_P_2,
2136 EVEX_W_0F6C_P_2,
2137 EVEX_W_0F6D_P_2,
2138 EVEX_W_0F6F_P_1,
2139 EVEX_W_0F6F_P_2,
2140 EVEX_W_0F6F_P_3,
2141 EVEX_W_0F70_P_2,
2142 EVEX_W_0F72_R_2_P_2,
2143 EVEX_W_0F72_R_6_P_2,
2144 EVEX_W_0F73_R_2_P_2,
2145 EVEX_W_0F73_R_6_P_2,
2146 EVEX_W_0F76_P_2,
2147 EVEX_W_0F78_P_0,
2148 EVEX_W_0F78_P_2,
2149 EVEX_W_0F79_P_0,
2150 EVEX_W_0F79_P_2,
2151 EVEX_W_0F7A_P_1,
2152 EVEX_W_0F7A_P_2,
2153 EVEX_W_0F7A_P_3,
2154 EVEX_W_0F7B_P_2,
2155 EVEX_W_0F7B_P_3,
2156 EVEX_W_0F7E_P_1,
2157 EVEX_W_0F7F_P_1,
2158 EVEX_W_0F7F_P_2,
2159 EVEX_W_0F7F_P_3,
2160 EVEX_W_0FC2_P_0,
2161 EVEX_W_0FC2_P_1,
2162 EVEX_W_0FC2_P_2,
2163 EVEX_W_0FC2_P_3,
2164 EVEX_W_0FC6_P_0,
2165 EVEX_W_0FC6_P_2,
2166 EVEX_W_0FD2_P_2,
2167 EVEX_W_0FD3_P_2,
2168 EVEX_W_0FD4_P_2,
2169 EVEX_W_0FD6_P_2,
2170 EVEX_W_0FE6_P_1,
2171 EVEX_W_0FE6_P_2,
2172 EVEX_W_0FE6_P_3,
2173 EVEX_W_0FE7_P_2,
2174 EVEX_W_0FF2_P_2,
2175 EVEX_W_0FF3_P_2,
2176 EVEX_W_0FF4_P_2,
2177 EVEX_W_0FFA_P_2,
2178 EVEX_W_0FFB_P_2,
2179 EVEX_W_0FFE_P_2,
2180 EVEX_W_0F380C_P_2,
2181 EVEX_W_0F380D_P_2,
2182 EVEX_W_0F3810_P_1,
2183 EVEX_W_0F3810_P_2,
2184 EVEX_W_0F3811_P_1,
2185 EVEX_W_0F3811_P_2,
2186 EVEX_W_0F3812_P_1,
2187 EVEX_W_0F3812_P_2,
2188 EVEX_W_0F3813_P_1,
2189 EVEX_W_0F3813_P_2,
2190 EVEX_W_0F3814_P_1,
2191 EVEX_W_0F3815_P_1,
2192 EVEX_W_0F3818_P_2,
2193 EVEX_W_0F3819_P_2,
2194 EVEX_W_0F381A_P_2,
2195 EVEX_W_0F381B_P_2,
2196 EVEX_W_0F381E_P_2,
2197 EVEX_W_0F381F_P_2,
2198 EVEX_W_0F3820_P_1,
2199 EVEX_W_0F3821_P_1,
2200 EVEX_W_0F3822_P_1,
2201 EVEX_W_0F3823_P_1,
2202 EVEX_W_0F3824_P_1,
2203 EVEX_W_0F3825_P_1,
2204 EVEX_W_0F3825_P_2,
2205 EVEX_W_0F3826_P_1,
2206 EVEX_W_0F3826_P_2,
2207 EVEX_W_0F3828_P_1,
2208 EVEX_W_0F3828_P_2,
2209 EVEX_W_0F3829_P_1,
2210 EVEX_W_0F3829_P_2,
2211 EVEX_W_0F382A_P_1,
2212 EVEX_W_0F382A_P_2,
2213 EVEX_W_0F382B_P_2,
2214 EVEX_W_0F3830_P_1,
2215 EVEX_W_0F3831_P_1,
2216 EVEX_W_0F3832_P_1,
2217 EVEX_W_0F3833_P_1,
2218 EVEX_W_0F3834_P_1,
2219 EVEX_W_0F3835_P_1,
2220 EVEX_W_0F3835_P_2,
2221 EVEX_W_0F3837_P_2,
2222 EVEX_W_0F3838_P_1,
2223 EVEX_W_0F3839_P_1,
2224 EVEX_W_0F383A_P_1,
2225 EVEX_W_0F3840_P_2,
2226 EVEX_W_0F3852_P_1,
2227 EVEX_W_0F3854_P_2,
2228 EVEX_W_0F3855_P_2,
2229 EVEX_W_0F3858_P_2,
2230 EVEX_W_0F3859_P_2,
2231 EVEX_W_0F385A_P_2,
2232 EVEX_W_0F385B_P_2,
2233 EVEX_W_0F3862_P_2,
2234 EVEX_W_0F3863_P_2,
2235 EVEX_W_0F3866_P_2,
2236 EVEX_W_0F3868_P_3,
2237 EVEX_W_0F3870_P_2,
2238 EVEX_W_0F3871_P_2,
2239 EVEX_W_0F3872_P_1,
2240 EVEX_W_0F3872_P_2,
2241 EVEX_W_0F3872_P_3,
2242 EVEX_W_0F3873_P_2,
2243 EVEX_W_0F3875_P_2,
2244 EVEX_W_0F3878_P_2,
2245 EVEX_W_0F3879_P_2,
2246 EVEX_W_0F387A_P_2,
2247 EVEX_W_0F387B_P_2,
2248 EVEX_W_0F387D_P_2,
2249 EVEX_W_0F3883_P_2,
2250 EVEX_W_0F388D_P_2,
2251 EVEX_W_0F3891_P_2,
2252 EVEX_W_0F3893_P_2,
2253 EVEX_W_0F38A1_P_2,
2254 EVEX_W_0F38A3_P_2,
2255 EVEX_W_0F38C7_R_1_P_2,
2256 EVEX_W_0F38C7_R_2_P_2,
2257 EVEX_W_0F38C7_R_5_P_2,
2258 EVEX_W_0F38C7_R_6_P_2,
2259
2260 EVEX_W_0F3A00_P_2,
2261 EVEX_W_0F3A01_P_2,
2262 EVEX_W_0F3A04_P_2,
2263 EVEX_W_0F3A05_P_2,
2264 EVEX_W_0F3A08_P_2,
2265 EVEX_W_0F3A09_P_2,
2266 EVEX_W_0F3A0A_P_2,
2267 EVEX_W_0F3A0B_P_2,
2268 EVEX_W_0F3A18_P_2,
2269 EVEX_W_0F3A19_P_2,
2270 EVEX_W_0F3A1A_P_2,
2271 EVEX_W_0F3A1B_P_2,
2272 EVEX_W_0F3A1D_P_2,
2273 EVEX_W_0F3A21_P_2,
2274 EVEX_W_0F3A23_P_2,
2275 EVEX_W_0F3A38_P_2,
2276 EVEX_W_0F3A39_P_2,
2277 EVEX_W_0F3A3A_P_2,
2278 EVEX_W_0F3A3B_P_2,
2279 EVEX_W_0F3A3E_P_2,
2280 EVEX_W_0F3A3F_P_2,
2281 EVEX_W_0F3A42_P_2,
2282 EVEX_W_0F3A43_P_2,
2283 EVEX_W_0F3A50_P_2,
2284 EVEX_W_0F3A51_P_2,
2285 EVEX_W_0F3A56_P_2,
2286 EVEX_W_0F3A57_P_2,
2287 EVEX_W_0F3A66_P_2,
2288 EVEX_W_0F3A67_P_2,
2289 EVEX_W_0F3A70_P_2,
2290 EVEX_W_0F3A71_P_2,
2291 EVEX_W_0F3A72_P_2,
2292 EVEX_W_0F3A73_P_2,
2293 EVEX_W_0F3ACE_P_2,
2294 EVEX_W_0F3ACF_P_2
2295 };
2296
2297 typedef void (*op_rtn) (int bytemode, int sizeflag);
2298
2299 struct dis386 {
2300 const char *name;
2301 struct
2302 {
2303 op_rtn rtn;
2304 int bytemode;
2305 } op[MAX_OPERANDS];
2306 unsigned int prefix_requirement;
2307 };
2308
2309 /* Upper case letters in the instruction names here are macros.
2310 'A' => print 'b' if no register operands or suffix_always is true
2311 'B' => print 'b' if suffix_always is true
2312 'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
2313 size prefix
2314 'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
2315 suffix_always is true
2316 'E' => print 'e' if 32-bit form of jcxz
2317 'F' => print 'w' or 'l' depending on address size prefix (loop insns)
2318 'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
2319 'H' => print ",pt" or ",pn" branch hint
2320 'I' => honor following macro letter even in Intel mode (implemented only
2321 for some of the macro letters)
2322 'J' => print 'l'
2323 'K' => print 'd' or 'q' if rex prefix is present.
2324 'L' => print 'l' if suffix_always is true
2325 'M' => print 'r' if intel_mnemonic is false.
2326 'N' => print 'n' if instruction has no wait "prefix"
2327 'O' => print 'd' or 'o' (or 'q' in Intel mode)
2328 'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix,
2329 or suffix_always is true. print 'q' if rex prefix is present.
2330 'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
2331 is true
2332 'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
2333 'S' => print 'w', 'l' or 'q' if suffix_always is true
2334 'T' => print 'q' in 64bit mode if instruction has no operand size
2335 prefix and behave as 'P' otherwise
2336 'U' => print 'q' in 64bit mode if instruction has no operand size
2337 prefix and behave as 'Q' otherwise
2338 'V' => print 'q' in 64bit mode if instruction has no operand size
2339 prefix and behave as 'S' otherwise
2340 'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
2341 'X' => print 's', 'd' depending on data16 prefix (for XMM)
2342 'Y' unused.
2343 'Z' => print 'q' in 64bit mode and behave as 'L' otherwise
2344 '!' => change condition from true to false or from false to true.
2345 '%' => add 1 upper case letter to the macro.
2346 '^' => print 'w' or 'l' depending on operand size prefix or
2347 suffix_always is true (lcall/ljmp).
2348 '@' => print 'q' for Intel64 ISA, 'w' or 'q' for AMD64 ISA depending
2349 on operand size prefix.
2350 '&' => print 'q' in 64bit mode for Intel64 ISA or if instruction
2351 has no operand size prefix for AMD64 ISA, behave as 'P'
2352 otherwise
2353
2354 2 upper case letter macros:
2355 "XY" => print 'x' or 'y' if suffix_always is true or no register
2356 operands and no broadcast.
2357 "XZ" => print 'x', 'y', or 'z' if suffix_always is true or no
2358 register operands and no broadcast.
2359 "XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
2360 "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand
2361 or suffix_always is true
2362 "LB" => print "abs" in 64bit mode and behave as 'B' otherwise
2363 "LS" => print "abs" in 64bit mode and behave as 'S' otherwise
2364 "LV" => print "abs" for 64bit operand and behave as 'S' otherwise
2365 "LW" => print 'd', 'q' depending on the VEX.W bit
2366 "LP" => print 'w' or 'l' ('d' in Intel mode) if instruction has
2367 an operand size prefix, or suffix_always is true. print
2368 'q' if rex prefix is present.
2369
2370 Many of the above letters print nothing in Intel mode. See "putop"
2371 for the details.
2372
2373 Braces '{' and '}', and vertical bars '|', indicate alternative
2374 mnemonic strings for AT&T and Intel. */
2375
2376 static const struct dis386 dis386[] = {
2377 /* 00 */
2378 { "addB", { Ebh1, Gb }, 0 },
2379 { "addS", { Evh1, Gv }, 0 },
2380 { "addB", { Gb, EbS }, 0 },
2381 { "addS", { Gv, EvS }, 0 },
2382 { "addB", { AL, Ib }, 0 },
2383 { "addS", { eAX, Iv }, 0 },
2384 { X86_64_TABLE (X86_64_06) },
2385 { X86_64_TABLE (X86_64_07) },
2386 /* 08 */
2387 { "orB", { Ebh1, Gb }, 0 },
2388 { "orS", { Evh1, Gv }, 0 },
2389 { "orB", { Gb, EbS }, 0 },
2390 { "orS", { Gv, EvS }, 0 },
2391 { "orB", { AL, Ib }, 0 },
2392 { "orS", { eAX, Iv }, 0 },
2393 { X86_64_TABLE (X86_64_0D) },
2394 { Bad_Opcode }, /* 0x0f extended opcode escape */
2395 /* 10 */
2396 { "adcB", { Ebh1, Gb }, 0 },
2397 { "adcS", { Evh1, Gv }, 0 },
2398 { "adcB", { Gb, EbS }, 0 },
2399 { "adcS", { Gv, EvS }, 0 },
2400 { "adcB", { AL, Ib }, 0 },
2401 { "adcS", { eAX, Iv }, 0 },
2402 { X86_64_TABLE (X86_64_16) },
2403 { X86_64_TABLE (X86_64_17) },
2404 /* 18 */
2405 { "sbbB", { Ebh1, Gb }, 0 },
2406 { "sbbS", { Evh1, Gv }, 0 },
2407 { "sbbB", { Gb, EbS }, 0 },
2408 { "sbbS", { Gv, EvS }, 0 },
2409 { "sbbB", { AL, Ib }, 0 },
2410 { "sbbS", { eAX, Iv }, 0 },
2411 { X86_64_TABLE (X86_64_1E) },
2412 { X86_64_TABLE (X86_64_1F) },
2413 /* 20 */
2414 { "andB", { Ebh1, Gb }, 0 },
2415 { "andS", { Evh1, Gv }, 0 },
2416 { "andB", { Gb, EbS }, 0 },
2417 { "andS", { Gv, EvS }, 0 },
2418 { "andB", { AL, Ib }, 0 },
2419 { "andS", { eAX, Iv }, 0 },
2420 { Bad_Opcode }, /* SEG ES prefix */
2421 { X86_64_TABLE (X86_64_27) },
2422 /* 28 */
2423 { "subB", { Ebh1, Gb }, 0 },
2424 { "subS", { Evh1, Gv }, 0 },
2425 { "subB", { Gb, EbS }, 0 },
2426 { "subS", { Gv, EvS }, 0 },
2427 { "subB", { AL, Ib }, 0 },
2428 { "subS", { eAX, Iv }, 0 },
2429 { Bad_Opcode }, /* SEG CS prefix */
2430 { X86_64_TABLE (X86_64_2F) },
2431 /* 30 */
2432 { "xorB", { Ebh1, Gb }, 0 },
2433 { "xorS", { Evh1, Gv }, 0 },
2434 { "xorB", { Gb, EbS }, 0 },
2435 { "xorS", { Gv, EvS }, 0 },
2436 { "xorB", { AL, Ib }, 0 },
2437 { "xorS", { eAX, Iv }, 0 },
2438 { Bad_Opcode }, /* SEG SS prefix */
2439 { X86_64_TABLE (X86_64_37) },
2440 /* 38 */
2441 { "cmpB", { Eb, Gb }, 0 },
2442 { "cmpS", { Ev, Gv }, 0 },
2443 { "cmpB", { Gb, EbS }, 0 },
2444 { "cmpS", { Gv, EvS }, 0 },
2445 { "cmpB", { AL, Ib }, 0 },
2446 { "cmpS", { eAX, Iv }, 0 },
2447 { Bad_Opcode }, /* SEG DS prefix */
2448 { X86_64_TABLE (X86_64_3F) },
2449 /* 40 */
2450 { "inc{S|}", { RMeAX }, 0 },
2451 { "inc{S|}", { RMeCX }, 0 },
2452 { "inc{S|}", { RMeDX }, 0 },
2453 { "inc{S|}", { RMeBX }, 0 },
2454 { "inc{S|}", { RMeSP }, 0 },
2455 { "inc{S|}", { RMeBP }, 0 },
2456 { "inc{S|}", { RMeSI }, 0 },
2457 { "inc{S|}", { RMeDI }, 0 },
2458 /* 48 */
2459 { "dec{S|}", { RMeAX }, 0 },
2460 { "dec{S|}", { RMeCX }, 0 },
2461 { "dec{S|}", { RMeDX }, 0 },
2462 { "dec{S|}", { RMeBX }, 0 },
2463 { "dec{S|}", { RMeSP }, 0 },
2464 { "dec{S|}", { RMeBP }, 0 },
2465 { "dec{S|}", { RMeSI }, 0 },
2466 { "dec{S|}", { RMeDI }, 0 },
2467 /* 50 */
2468 { "pushV", { RMrAX }, 0 },
2469 { "pushV", { RMrCX }, 0 },
2470 { "pushV", { RMrDX }, 0 },
2471 { "pushV", { RMrBX }, 0 },
2472 { "pushV", { RMrSP }, 0 },
2473 { "pushV", { RMrBP }, 0 },
2474 { "pushV", { RMrSI }, 0 },
2475 { "pushV", { RMrDI }, 0 },
2476 /* 58 */
2477 { "popV", { RMrAX }, 0 },
2478 { "popV", { RMrCX }, 0 },
2479 { "popV", { RMrDX }, 0 },
2480 { "popV", { RMrBX }, 0 },
2481 { "popV", { RMrSP }, 0 },
2482 { "popV", { RMrBP }, 0 },
2483 { "popV", { RMrSI }, 0 },
2484 { "popV", { RMrDI }, 0 },
2485 /* 60 */
2486 { X86_64_TABLE (X86_64_60) },
2487 { X86_64_TABLE (X86_64_61) },
2488 { X86_64_TABLE (X86_64_62) },
2489 { X86_64_TABLE (X86_64_63) },
2490 { Bad_Opcode }, /* seg fs */
2491 { Bad_Opcode }, /* seg gs */
2492 { Bad_Opcode }, /* op size prefix */
2493 { Bad_Opcode }, /* adr size prefix */
2494 /* 68 */
2495 { "pushT", { sIv }, 0 },
2496 { "imulS", { Gv, Ev, Iv }, 0 },
2497 { "pushT", { sIbT }, 0 },
2498 { "imulS", { Gv, Ev, sIb }, 0 },
2499 { "ins{b|}", { Ybr, indirDX }, 0 },
2500 { X86_64_TABLE (X86_64_6D) },
2501 { "outs{b|}", { indirDXr, Xb }, 0 },
2502 { X86_64_TABLE (X86_64_6F) },
2503 /* 70 */
2504 { "joH", { Jb, BND, cond_jump_flag }, 0 },
2505 { "jnoH", { Jb, BND, cond_jump_flag }, 0 },
2506 { "jbH", { Jb, BND, cond_jump_flag }, 0 },
2507 { "jaeH", { Jb, BND, cond_jump_flag }, 0 },
2508 { "jeH", { Jb, BND, cond_jump_flag }, 0 },
2509 { "jneH", { Jb, BND, cond_jump_flag }, 0 },
2510 { "jbeH", { Jb, BND, cond_jump_flag }, 0 },
2511 { "jaH", { Jb, BND, cond_jump_flag }, 0 },
2512 /* 78 */
2513 { "jsH", { Jb, BND, cond_jump_flag }, 0 },
2514 { "jnsH", { Jb, BND, cond_jump_flag }, 0 },
2515 { "jpH", { Jb, BND, cond_jump_flag }, 0 },
2516 { "jnpH", { Jb, BND, cond_jump_flag }, 0 },
2517 { "jlH", { Jb, BND, cond_jump_flag }, 0 },
2518 { "jgeH", { Jb, BND, cond_jump_flag }, 0 },
2519 { "jleH", { Jb, BND, cond_jump_flag }, 0 },
2520 { "jgH", { Jb, BND, cond_jump_flag }, 0 },
2521 /* 80 */
2522 { REG_TABLE (REG_80) },
2523 { REG_TABLE (REG_81) },
2524 { X86_64_TABLE (X86_64_82) },
2525 { REG_TABLE (REG_83) },
2526 { "testB", { Eb, Gb }, 0 },
2527 { "testS", { Ev, Gv }, 0 },
2528 { "xchgB", { Ebh2, Gb }, 0 },
2529 { "xchgS", { Evh2, Gv }, 0 },
2530 /* 88 */
2531 { "movB", { Ebh3, Gb }, 0 },
2532 { "movS", { Evh3, Gv }, 0 },
2533 { "movB", { Gb, EbS }, 0 },
2534 { "movS", { Gv, EvS }, 0 },
2535 { "movD", { Sv, Sw }, 0 },
2536 { MOD_TABLE (MOD_8D) },
2537 { "movD", { Sw, Sv }, 0 },
2538 { REG_TABLE (REG_8F) },
2539 /* 90 */
2540 { PREFIX_TABLE (PREFIX_90) },
2541 { "xchgS", { RMeCX, eAX }, 0 },
2542 { "xchgS", { RMeDX, eAX }, 0 },
2543 { "xchgS", { RMeBX, eAX }, 0 },
2544 { "xchgS", { RMeSP, eAX }, 0 },
2545 { "xchgS", { RMeBP, eAX }, 0 },
2546 { "xchgS", { RMeSI, eAX }, 0 },
2547 { "xchgS", { RMeDI, eAX }, 0 },
2548 /* 98 */
2549 { "cW{t|}R", { XX }, 0 },
2550 { "cR{t|}O", { XX }, 0 },
2551 { X86_64_TABLE (X86_64_9A) },
2552 { Bad_Opcode }, /* fwait */
2553 { "pushfT", { XX }, 0 },
2554 { "popfT", { XX }, 0 },
2555 { "sahf", { XX }, 0 },
2556 { "lahf", { XX }, 0 },
2557 /* a0 */
2558 { "mov%LB", { AL, Ob }, 0 },
2559 { "mov%LS", { eAX, Ov }, 0 },
2560 { "mov%LB", { Ob, AL }, 0 },
2561 { "mov%LS", { Ov, eAX }, 0 },
2562 { "movs{b|}", { Ybr, Xb }, 0 },
2563 { "movs{R|}", { Yvr, Xv }, 0 },
2564 { "cmps{b|}", { Xb, Yb }, 0 },
2565 { "cmps{R|}", { Xv, Yv }, 0 },
2566 /* a8 */
2567 { "testB", { AL, Ib }, 0 },
2568 { "testS", { eAX, Iv }, 0 },
2569 { "stosB", { Ybr, AL }, 0 },
2570 { "stosS", { Yvr, eAX }, 0 },
2571 { "lodsB", { ALr, Xb }, 0 },
2572 { "lodsS", { eAXr, Xv }, 0 },
2573 { "scasB", { AL, Yb }, 0 },
2574 { "scasS", { eAX, Yv }, 0 },
2575 /* b0 */
2576 { "movB", { RMAL, Ib }, 0 },
2577 { "movB", { RMCL, Ib }, 0 },
2578 { "movB", { RMDL, Ib }, 0 },
2579 { "movB", { RMBL, Ib }, 0 },
2580 { "movB", { RMAH, Ib }, 0 },
2581 { "movB", { RMCH, Ib }, 0 },
2582 { "movB", { RMDH, Ib }, 0 },
2583 { "movB", { RMBH, Ib }, 0 },
2584 /* b8 */
2585 { "mov%LV", { RMeAX, Iv64 }, 0 },
2586 { "mov%LV", { RMeCX, Iv64 }, 0 },
2587 { "mov%LV", { RMeDX, Iv64 }, 0 },
2588 { "mov%LV", { RMeBX, Iv64 }, 0 },
2589 { "mov%LV", { RMeSP, Iv64 }, 0 },
2590 { "mov%LV", { RMeBP, Iv64 }, 0 },
2591 { "mov%LV", { RMeSI, Iv64 }, 0 },
2592 { "mov%LV", { RMeDI, Iv64 }, 0 },
2593 /* c0 */
2594 { REG_TABLE (REG_C0) },
2595 { REG_TABLE (REG_C1) },
2596 { "retT", { Iw, BND }, 0 },
2597 { "retT", { BND }, 0 },
2598 { X86_64_TABLE (X86_64_C4) },
2599 { X86_64_TABLE (X86_64_C5) },
2600 { REG_TABLE (REG_C6) },
2601 { REG_TABLE (REG_C7) },
2602 /* c8 */
2603 { "enterT", { Iw, Ib }, 0 },
2604 { "leaveT", { XX }, 0 },
2605 { "Jret{|f}P", { Iw }, 0 },
2606 { "Jret{|f}P", { XX }, 0 },
2607 { "int3", { XX }, 0 },
2608 { "int", { Ib }, 0 },
2609 { X86_64_TABLE (X86_64_CE) },
2610 { "iret%LP", { XX }, 0 },
2611 /* d0 */
2612 { REG_TABLE (REG_D0) },
2613 { REG_TABLE (REG_D1) },
2614 { REG_TABLE (REG_D2) },
2615 { REG_TABLE (REG_D3) },
2616 { X86_64_TABLE (X86_64_D4) },
2617 { X86_64_TABLE (X86_64_D5) },
2618 { Bad_Opcode },
2619 { "xlat", { DSBX }, 0 },
2620 /* d8 */
2621 { FLOAT },
2622 { FLOAT },
2623 { FLOAT },
2624 { FLOAT },
2625 { FLOAT },
2626 { FLOAT },
2627 { FLOAT },
2628 { FLOAT },
2629 /* e0 */
2630 { "loopneFH", { Jb, XX, loop_jcxz_flag }, 0 },
2631 { "loopeFH", { Jb, XX, loop_jcxz_flag }, 0 },
2632 { "loopFH", { Jb, XX, loop_jcxz_flag }, 0 },
2633 { "jEcxzH", { Jb, XX, loop_jcxz_flag }, 0 },
2634 { "inB", { AL, Ib }, 0 },
2635 { "inG", { zAX, Ib }, 0 },
2636 { "outB", { Ib, AL }, 0 },
2637 { "outG", { Ib, zAX }, 0 },
2638 /* e8 */
2639 { X86_64_TABLE (X86_64_E8) },
2640 { X86_64_TABLE (X86_64_E9) },
2641 { X86_64_TABLE (X86_64_EA) },
2642 { "jmp", { Jb, BND }, 0 },
2643 { "inB", { AL, indirDX }, 0 },
2644 { "inG", { zAX, indirDX }, 0 },
2645 { "outB", { indirDX, AL }, 0 },
2646 { "outG", { indirDX, zAX }, 0 },
2647 /* f0 */
2648 { Bad_Opcode }, /* lock prefix */
2649 { "icebp", { XX }, 0 },
2650 { Bad_Opcode }, /* repne */
2651 { Bad_Opcode }, /* repz */
2652 { "hlt", { XX }, 0 },
2653 { "cmc", { XX }, 0 },
2654 { REG_TABLE (REG_F6) },
2655 { REG_TABLE (REG_F7) },
2656 /* f8 */
2657 { "clc", { XX }, 0 },
2658 { "stc", { XX }, 0 },
2659 { "cli", { XX }, 0 },
2660 { "sti", { XX }, 0 },
2661 { "cld", { XX }, 0 },
2662 { "std", { XX }, 0 },
2663 { REG_TABLE (REG_FE) },
2664 { REG_TABLE (REG_FF) },
2665 };
2666
2667 static const struct dis386 dis386_twobyte[] = {
2668 /* 00 */
2669 { REG_TABLE (REG_0F00 ) },
2670 { REG_TABLE (REG_0F01 ) },
2671 { "larS", { Gv, Ew }, 0 },
2672 { "lslS", { Gv, Ew }, 0 },
2673 { Bad_Opcode },
2674 { "syscall", { XX }, 0 },
2675 { "clts", { XX }, 0 },
2676 { "sysret%LP", { XX }, 0 },
2677 /* 08 */
2678 { "invd", { XX }, 0 },
2679 { PREFIX_TABLE (PREFIX_0F09) },
2680 { Bad_Opcode },
2681 { "ud2", { XX }, 0 },
2682 { Bad_Opcode },
2683 { REG_TABLE (REG_0F0D) },
2684 { "femms", { XX }, 0 },
2685 { "", { MX, EM, OPSUF }, 0 }, /* See OP_3DNowSuffix. */
2686 /* 10 */
2687 { PREFIX_TABLE (PREFIX_0F10) },
2688 { PREFIX_TABLE (PREFIX_0F11) },
2689 { PREFIX_TABLE (PREFIX_0F12) },
2690 { MOD_TABLE (MOD_0F13) },
2691 { "unpcklpX", { XM, EXx }, PREFIX_OPCODE },
2692 { "unpckhpX", { XM, EXx }, PREFIX_OPCODE },
2693 { PREFIX_TABLE (PREFIX_0F16) },
2694 { MOD_TABLE (MOD_0F17) },
2695 /* 18 */
2696 { REG_TABLE (REG_0F18) },
2697 { "nopQ", { Ev }, 0 },
2698 { PREFIX_TABLE (PREFIX_0F1A) },
2699 { PREFIX_TABLE (PREFIX_0F1B) },
2700 { PREFIX_TABLE (PREFIX_0F1C) },
2701 { "nopQ", { Ev }, 0 },
2702 { PREFIX_TABLE (PREFIX_0F1E) },
2703 { "nopQ", { Ev }, 0 },
2704 /* 20 */
2705 { "movZ", { Rm, Cm }, 0 },
2706 { "movZ", { Rm, Dm }, 0 },
2707 { "movZ", { Cm, Rm }, 0 },
2708 { "movZ", { Dm, Rm }, 0 },
2709 { MOD_TABLE (MOD_0F24) },
2710 { Bad_Opcode },
2711 { MOD_TABLE (MOD_0F26) },
2712 { Bad_Opcode },
2713 /* 28 */
2714 { "movapX", { XM, EXx }, PREFIX_OPCODE },
2715 { "movapX", { EXxS, XM }, PREFIX_OPCODE },
2716 { PREFIX_TABLE (PREFIX_0F2A) },
2717 { PREFIX_TABLE (PREFIX_0F2B) },
2718 { PREFIX_TABLE (PREFIX_0F2C) },
2719 { PREFIX_TABLE (PREFIX_0F2D) },
2720 { PREFIX_TABLE (PREFIX_0F2E) },
2721 { PREFIX_TABLE (PREFIX_0F2F) },
2722 /* 30 */
2723 { "wrmsr", { XX }, 0 },
2724 { "rdtsc", { XX }, 0 },
2725 { "rdmsr", { XX }, 0 },
2726 { "rdpmc", { XX }, 0 },
2727 { "sysenter", { XX }, 0 },
2728 { "sysexit", { XX }, 0 },
2729 { Bad_Opcode },
2730 { "getsec", { XX }, 0 },
2731 /* 38 */
2732 { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F38, PREFIX_OPCODE) },
2733 { Bad_Opcode },
2734 { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F3A, PREFIX_OPCODE) },
2735 { Bad_Opcode },
2736 { Bad_Opcode },
2737 { Bad_Opcode },
2738 { Bad_Opcode },
2739 { Bad_Opcode },
2740 /* 40 */
2741 { "cmovoS", { Gv, Ev }, 0 },
2742 { "cmovnoS", { Gv, Ev }, 0 },
2743 { "cmovbS", { Gv, Ev }, 0 },
2744 { "cmovaeS", { Gv, Ev }, 0 },
2745 { "cmoveS", { Gv, Ev }, 0 },
2746 { "cmovneS", { Gv, Ev }, 0 },
2747 { "cmovbeS", { Gv, Ev }, 0 },
2748 { "cmovaS", { Gv, Ev }, 0 },
2749 /* 48 */
2750 { "cmovsS", { Gv, Ev }, 0 },
2751 { "cmovnsS", { Gv, Ev }, 0 },
2752 { "cmovpS", { Gv, Ev }, 0 },
2753 { "cmovnpS", { Gv, Ev }, 0 },
2754 { "cmovlS", { Gv, Ev }, 0 },
2755 { "cmovgeS", { Gv, Ev }, 0 },
2756 { "cmovleS", { Gv, Ev }, 0 },
2757 { "cmovgS", { Gv, Ev }, 0 },
2758 /* 50 */
2759 { MOD_TABLE (MOD_0F51) },
2760 { PREFIX_TABLE (PREFIX_0F51) },
2761 { PREFIX_TABLE (PREFIX_0F52) },
2762 { PREFIX_TABLE (PREFIX_0F53) },
2763 { "andpX", { XM, EXx }, PREFIX_OPCODE },
2764 { "andnpX", { XM, EXx }, PREFIX_OPCODE },
2765 { "orpX", { XM, EXx }, PREFIX_OPCODE },
2766 { "xorpX", { XM, EXx }, PREFIX_OPCODE },
2767 /* 58 */
2768 { PREFIX_TABLE (PREFIX_0F58) },
2769 { PREFIX_TABLE (PREFIX_0F59) },
2770 { PREFIX_TABLE (PREFIX_0F5A) },
2771 { PREFIX_TABLE (PREFIX_0F5B) },
2772 { PREFIX_TABLE (PREFIX_0F5C) },
2773 { PREFIX_TABLE (PREFIX_0F5D) },
2774 { PREFIX_TABLE (PREFIX_0F5E) },
2775 { PREFIX_TABLE (PREFIX_0F5F) },
2776 /* 60 */
2777 { PREFIX_TABLE (PREFIX_0F60) },
2778 { PREFIX_TABLE (PREFIX_0F61) },
2779 { PREFIX_TABLE (PREFIX_0F62) },
2780 { "packsswb", { MX, EM }, PREFIX_OPCODE },
2781 { "pcmpgtb", { MX, EM }, PREFIX_OPCODE },
2782 { "pcmpgtw", { MX, EM }, PREFIX_OPCODE },
2783 { "pcmpgtd", { MX, EM }, PREFIX_OPCODE },
2784 { "packuswb", { MX, EM }, PREFIX_OPCODE },
2785 /* 68 */
2786 { "punpckhbw", { MX, EM }, PREFIX_OPCODE },
2787 { "punpckhwd", { MX, EM }, PREFIX_OPCODE },
2788 { "punpckhdq", { MX, EM }, PREFIX_OPCODE },
2789 { "packssdw", { MX, EM }, PREFIX_OPCODE },
2790 { PREFIX_TABLE (PREFIX_0F6C) },
2791 { PREFIX_TABLE (PREFIX_0F6D) },
2792 { "movK", { MX, Edq }, PREFIX_OPCODE },
2793 { PREFIX_TABLE (PREFIX_0F6F) },
2794 /* 70 */
2795 { PREFIX_TABLE (PREFIX_0F70) },
2796 { REG_TABLE (REG_0F71) },
2797 { REG_TABLE (REG_0F72) },
2798 { REG_TABLE (REG_0F73) },
2799 { "pcmpeqb", { MX, EM }, PREFIX_OPCODE },
2800 { "pcmpeqw", { MX, EM }, PREFIX_OPCODE },
2801 { "pcmpeqd", { MX, EM }, PREFIX_OPCODE },
2802 { "emms", { XX }, PREFIX_OPCODE },
2803 /* 78 */
2804 { PREFIX_TABLE (PREFIX_0F78) },
2805 { PREFIX_TABLE (PREFIX_0F79) },
2806 { Bad_Opcode },
2807 { Bad_Opcode },
2808 { PREFIX_TABLE (PREFIX_0F7C) },
2809 { PREFIX_TABLE (PREFIX_0F7D) },
2810 { PREFIX_TABLE (PREFIX_0F7E) },
2811 { PREFIX_TABLE (PREFIX_0F7F) },
2812 /* 80 */
2813 { "joH", { Jv, BND, cond_jump_flag }, 0 },
2814 { "jnoH", { Jv, BND, cond_jump_flag }, 0 },
2815 { "jbH", { Jv, BND, cond_jump_flag }, 0 },
2816 { "jaeH", { Jv, BND, cond_jump_flag }, 0 },
2817 { "jeH", { Jv, BND, cond_jump_flag }, 0 },
2818 { "jneH", { Jv, BND, cond_jump_flag }, 0 },
2819 { "jbeH", { Jv, BND, cond_jump_flag }, 0 },
2820 { "jaH", { Jv, BND, cond_jump_flag }, 0 },
2821 /* 88 */
2822 { "jsH", { Jv, BND, cond_jump_flag }, 0 },
2823 { "jnsH", { Jv, BND, cond_jump_flag }, 0 },
2824 { "jpH", { Jv, BND, cond_jump_flag }, 0 },
2825 { "jnpH", { Jv, BND, cond_jump_flag }, 0 },
2826 { "jlH", { Jv, BND, cond_jump_flag }, 0 },
2827 { "jgeH", { Jv, BND, cond_jump_flag }, 0 },
2828 { "jleH", { Jv, BND, cond_jump_flag }, 0 },
2829 { "jgH", { Jv, BND, cond_jump_flag }, 0 },
2830 /* 90 */
2831 { "seto", { Eb }, 0 },
2832 { "setno", { Eb }, 0 },
2833 { "setb", { Eb }, 0 },
2834 { "setae", { Eb }, 0 },
2835 { "sete", { Eb }, 0 },
2836 { "setne", { Eb }, 0 },
2837 { "setbe", { Eb }, 0 },
2838 { "seta", { Eb }, 0 },
2839 /* 98 */
2840 { "sets", { Eb }, 0 },
2841 { "setns", { Eb }, 0 },
2842 { "setp", { Eb }, 0 },
2843 { "setnp", { Eb }, 0 },
2844 { "setl", { Eb }, 0 },
2845 { "setge", { Eb }, 0 },
2846 { "setle", { Eb }, 0 },
2847 { "setg", { Eb }, 0 },
2848 /* a0 */
2849 { "pushT", { fs }, 0 },
2850 { "popT", { fs }, 0 },
2851 { "cpuid", { XX }, 0 },
2852 { "btS", { Ev, Gv }, 0 },
2853 { "shldS", { Ev, Gv, Ib }, 0 },
2854 { "shldS", { Ev, Gv, CL }, 0 },
2855 { REG_TABLE (REG_0FA6) },
2856 { REG_TABLE (REG_0FA7) },
2857 /* a8 */
2858 { "pushT", { gs }, 0 },
2859 { "popT", { gs }, 0 },
2860 { "rsm", { XX }, 0 },
2861 { "btsS", { Evh1, Gv }, 0 },
2862 { "shrdS", { Ev, Gv, Ib }, 0 },
2863 { "shrdS", { Ev, Gv, CL }, 0 },
2864 { REG_TABLE (REG_0FAE) },
2865 { "imulS", { Gv, Ev }, 0 },
2866 /* b0 */
2867 { "cmpxchgB", { Ebh1, Gb }, 0 },
2868 { "cmpxchgS", { Evh1, Gv }, 0 },
2869 { MOD_TABLE (MOD_0FB2) },
2870 { "btrS", { Evh1, Gv }, 0 },
2871 { MOD_TABLE (MOD_0FB4) },
2872 { MOD_TABLE (MOD_0FB5) },
2873 { "movz{bR|x}", { Gv, Eb }, 0 },
2874 { "movz{wR|x}", { Gv, Ew }, 0 }, /* yes, there really is movzww ! */
2875 /* b8 */
2876 { PREFIX_TABLE (PREFIX_0FB8) },
2877 { "ud1S", { Gv, Ev }, 0 },
2878 { REG_TABLE (REG_0FBA) },
2879 { "btcS", { Evh1, Gv }, 0 },
2880 { PREFIX_TABLE (PREFIX_0FBC) },
2881 { PREFIX_TABLE (PREFIX_0FBD) },
2882 { "movs{bR|x}", { Gv, Eb }, 0 },
2883 { "movs{wR|x}", { Gv, Ew }, 0 }, /* yes, there really is movsww ! */
2884 /* c0 */
2885 { "xaddB", { Ebh1, Gb }, 0 },
2886 { "xaddS", { Evh1, Gv }, 0 },
2887 { PREFIX_TABLE (PREFIX_0FC2) },
2888 { MOD_TABLE (MOD_0FC3) },
2889 { "pinsrw", { MX, Edqw, Ib }, PREFIX_OPCODE },
2890 { "pextrw", { Gdq, MS, Ib }, PREFIX_OPCODE },
2891 { "shufpX", { XM, EXx, Ib }, PREFIX_OPCODE },
2892 { REG_TABLE (REG_0FC7) },
2893 /* c8 */
2894 { "bswap", { RMeAX }, 0 },
2895 { "bswap", { RMeCX }, 0 },
2896 { "bswap", { RMeDX }, 0 },
2897 { "bswap", { RMeBX }, 0 },
2898 { "bswap", { RMeSP }, 0 },
2899 { "bswap", { RMeBP }, 0 },
2900 { "bswap", { RMeSI }, 0 },
2901 { "bswap", { RMeDI }, 0 },
2902 /* d0 */
2903 { PREFIX_TABLE (PREFIX_0FD0) },
2904 { "psrlw", { MX, EM }, PREFIX_OPCODE },
2905 { "psrld", { MX, EM }, PREFIX_OPCODE },
2906 { "psrlq", { MX, EM }, PREFIX_OPCODE },
2907 { "paddq", { MX, EM }, PREFIX_OPCODE },
2908 { "pmullw", { MX, EM }, PREFIX_OPCODE },
2909 { PREFIX_TABLE (PREFIX_0FD6) },
2910 { MOD_TABLE (MOD_0FD7) },
2911 /* d8 */
2912 { "psubusb", { MX, EM }, PREFIX_OPCODE },
2913 { "psubusw", { MX, EM }, PREFIX_OPCODE },
2914 { "pminub", { MX, EM }, PREFIX_OPCODE },
2915 { "pand", { MX, EM }, PREFIX_OPCODE },
2916 { "paddusb", { MX, EM }, PREFIX_OPCODE },
2917 { "paddusw", { MX, EM }, PREFIX_OPCODE },
2918 { "pmaxub", { MX, EM }, PREFIX_OPCODE },
2919 { "pandn", { MX, EM }, PREFIX_OPCODE },
2920 /* e0 */
2921 { "pavgb", { MX, EM }, PREFIX_OPCODE },
2922 { "psraw", { MX, EM }, PREFIX_OPCODE },
2923 { "psrad", { MX, EM }, PREFIX_OPCODE },
2924 { "pavgw", { MX, EM }, PREFIX_OPCODE },
2925 { "pmulhuw", { MX, EM }, PREFIX_OPCODE },
2926 { "pmulhw", { MX, EM }, PREFIX_OPCODE },
2927 { PREFIX_TABLE (PREFIX_0FE6) },
2928 { PREFIX_TABLE (PREFIX_0FE7) },
2929 /* e8 */
2930 { "psubsb", { MX, EM }, PREFIX_OPCODE },
2931 { "psubsw", { MX, EM }, PREFIX_OPCODE },
2932 { "pminsw", { MX, EM }, PREFIX_OPCODE },
2933 { "por", { MX, EM }, PREFIX_OPCODE },
2934 { "paddsb", { MX, EM }, PREFIX_OPCODE },
2935 { "paddsw", { MX, EM }, PREFIX_OPCODE },
2936 { "pmaxsw", { MX, EM }, PREFIX_OPCODE },
2937 { "pxor", { MX, EM }, PREFIX_OPCODE },
2938 /* f0 */
2939 { PREFIX_TABLE (PREFIX_0FF0) },
2940 { "psllw", { MX, EM }, PREFIX_OPCODE },
2941 { "pslld", { MX, EM }, PREFIX_OPCODE },
2942 { "psllq", { MX, EM }, PREFIX_OPCODE },
2943 { "pmuludq", { MX, EM }, PREFIX_OPCODE },
2944 { "pmaddwd", { MX, EM }, PREFIX_OPCODE },
2945 { "psadbw", { MX, EM }, PREFIX_OPCODE },
2946 { PREFIX_TABLE (PREFIX_0FF7) },
2947 /* f8 */
2948 { "psubb", { MX, EM }, PREFIX_OPCODE },
2949 { "psubw", { MX, EM }, PREFIX_OPCODE },
2950 { "psubd", { MX, EM }, PREFIX_OPCODE },
2951 { "psubq", { MX, EM }, PREFIX_OPCODE },
2952 { "paddb", { MX, EM }, PREFIX_OPCODE },
2953 { "paddw", { MX, EM }, PREFIX_OPCODE },
2954 { "paddd", { MX, EM }, PREFIX_OPCODE },
2955 { "ud0S", { Gv, Ev }, 0 },
2956 };
2957
2958 static const unsigned char onebyte_has_modrm[256] = {
2959 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2960 /* ------------------------------- */
2961 /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
2962 /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
2963 /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
2964 /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
2965 /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
2966 /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
2967 /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
2968 /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
2969 /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
2970 /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
2971 /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
2972 /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
2973 /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
2974 /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
2975 /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
2976 /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1 /* f0 */
2977 /* ------------------------------- */
2978 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2979 };
2980
2981 static const unsigned char twobyte_has_modrm[256] = {
2982 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2983 /* ------------------------------- */
2984 /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
2985 /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
2986 /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
2987 /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
2988 /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
2989 /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
2990 /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
2991 /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
2992 /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
2993 /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
2994 /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
2995 /* b0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* bf */
2996 /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
2997 /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
2998 /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
2999 /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 /* ff */
3000 /* ------------------------------- */
3001 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
3002 };
3003
3004 static char obuf[100];
3005 static char *obufp;
3006 static char *mnemonicendp;
3007 static char scratchbuf[100];
3008 static unsigned char *start_codep;
3009 static unsigned char *insn_codep;
3010 static unsigned char *codep;
3011 static unsigned char *end_codep;
3012 static int last_lock_prefix;
3013 static int last_repz_prefix;
3014 static int last_repnz_prefix;
3015 static int last_data_prefix;
3016 static int last_addr_prefix;
3017 static int last_rex_prefix;
3018 static int last_seg_prefix;
3019 static int fwait_prefix;
3020 /* The active segment register prefix. */
3021 static int active_seg_prefix;
3022 #define MAX_CODE_LENGTH 15
3023 /* We can up to 14 prefixes since the maximum instruction length is
3024 15bytes. */
3025 static int all_prefixes[MAX_CODE_LENGTH - 1];
3026 static disassemble_info *the_info;
3027 static struct
3028 {
3029 int mod;
3030 int reg;
3031 int rm;
3032 }
3033 modrm;
3034 static unsigned char need_modrm;
3035 static struct
3036 {
3037 int scale;
3038 int index;
3039 int base;
3040 }
3041 sib;
3042 static struct
3043 {
3044 int register_specifier;
3045 int length;
3046 int prefix;
3047 int w;
3048 int evex;
3049 int r;
3050 int v;
3051 int mask_register_specifier;
3052 int zeroing;
3053 int ll;
3054 int b;
3055 }
3056 vex;
3057 static unsigned char need_vex;
3058 static unsigned char need_vex_reg;
3059 static unsigned char vex_w_done;
3060
3061 struct op
3062 {
3063 const char *name;
3064 unsigned int len;
3065 };
3066
3067 /* If we are accessing mod/rm/reg without need_modrm set, then the
3068 values are stale. Hitting this abort likely indicates that you
3069 need to update onebyte_has_modrm or twobyte_has_modrm. */
3070 #define MODRM_CHECK if (!need_modrm) abort ()
3071
3072 static const char **names64;
3073 static const char **names32;
3074 static const char **names16;
3075 static const char **names8;
3076 static const char **names8rex;
3077 static const char **names_seg;
3078 static const char *index64;
3079 static const char *index32;
3080 static const char **index16;
3081 static const char **names_bnd;
3082
3083 static const char *intel_names64[] = {
3084 "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
3085 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
3086 };
3087 static const char *intel_names32[] = {
3088 "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
3089 "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
3090 };
3091 static const char *intel_names16[] = {
3092 "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
3093 "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
3094 };
3095 static const char *intel_names8[] = {
3096 "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
3097 };
3098 static const char *intel_names8rex[] = {
3099 "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
3100 "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
3101 };
3102 static const char *intel_names_seg[] = {
3103 "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
3104 };
3105 static const char *intel_index64 = "riz";
3106 static const char *intel_index32 = "eiz";
3107 static const char *intel_index16[] = {
3108 "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
3109 };
3110
3111 static const char *att_names64[] = {
3112 "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
3113 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
3114 };
3115 static const char *att_names32[] = {
3116 "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
3117 "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
3118 };
3119 static const char *att_names16[] = {
3120 "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
3121 "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
3122 };
3123 static const char *att_names8[] = {
3124 "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
3125 };
3126 static const char *att_names8rex[] = {
3127 "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
3128 "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
3129 };
3130 static const char *att_names_seg[] = {
3131 "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
3132 };
3133 static const char *att_index64 = "%riz";
3134 static const char *att_index32 = "%eiz";
3135 static const char *att_index16[] = {
3136 "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
3137 };
3138
3139 static const char **names_mm;
3140 static const char *intel_names_mm[] = {
3141 "mm0", "mm1", "mm2", "mm3",
3142 "mm4", "mm5", "mm6", "mm7"
3143 };
3144 static const char *att_names_mm[] = {
3145 "%mm0", "%mm1", "%mm2", "%mm3",
3146 "%mm4", "%mm5", "%mm6", "%mm7"
3147 };
3148
3149 static const char *intel_names_bnd[] = {
3150 "bnd0", "bnd1", "bnd2", "bnd3"
3151 };
3152
3153 static const char *att_names_bnd[] = {
3154 "%bnd0", "%bnd1", "%bnd2", "%bnd3"
3155 };
3156
3157 static const char **names_xmm;
3158 static const char *intel_names_xmm[] = {
3159 "xmm0", "xmm1", "xmm2", "xmm3",
3160 "xmm4", "xmm5", "xmm6", "xmm7",
3161 "xmm8", "xmm9", "xmm10", "xmm11",
3162 "xmm12", "xmm13", "xmm14", "xmm15",
3163 "xmm16", "xmm17", "xmm18", "xmm19",
3164 "xmm20", "xmm21", "xmm22", "xmm23",
3165 "xmm24", "xmm25", "xmm26", "xmm27",
3166 "xmm28", "xmm29", "xmm30", "xmm31"
3167 };
3168 static const char *att_names_xmm[] = {
3169 "%xmm0", "%xmm1", "%xmm2", "%xmm3",
3170 "%xmm4", "%xmm5", "%xmm6", "%xmm7",
3171 "%xmm8", "%xmm9", "%xmm10", "%xmm11",
3172 "%xmm12", "%xmm13", "%xmm14", "%xmm15",
3173 "%xmm16", "%xmm17", "%xmm18", "%xmm19",
3174 "%xmm20", "%xmm21", "%xmm22", "%xmm23",
3175 "%xmm24", "%xmm25", "%xmm26", "%xmm27",
3176 "%xmm28", "%xmm29", "%xmm30", "%xmm31"
3177 };
3178
3179 static const char **names_ymm;
3180 static const char *intel_names_ymm[] = {
3181 "ymm0", "ymm1", "ymm2", "ymm3",
3182 "ymm4", "ymm5", "ymm6", "ymm7",
3183 "ymm8", "ymm9", "ymm10", "ymm11",
3184 "ymm12", "ymm13", "ymm14", "ymm15",
3185 "ymm16", "ymm17", "ymm18", "ymm19",
3186 "ymm20", "ymm21", "ymm22", "ymm23",
3187 "ymm24", "ymm25", "ymm26", "ymm27",
3188 "ymm28", "ymm29", "ymm30", "ymm31"
3189 };
3190 static const char *att_names_ymm[] = {
3191 "%ymm0", "%ymm1", "%ymm2", "%ymm3",
3192 "%ymm4", "%ymm5", "%ymm6", "%ymm7",
3193 "%ymm8", "%ymm9", "%ymm10", "%ymm11",
3194 "%ymm12", "%ymm13", "%ymm14", "%ymm15",
3195 "%ymm16", "%ymm17", "%ymm18", "%ymm19",
3196 "%ymm20", "%ymm21", "%ymm22", "%ymm23",
3197 "%ymm24", "%ymm25", "%ymm26", "%ymm27",
3198 "%ymm28", "%ymm29", "%ymm30", "%ymm31"
3199 };
3200
3201 static const char **names_zmm;
3202 static const char *intel_names_zmm[] = {
3203 "zmm0", "zmm1", "zmm2", "zmm3",
3204 "zmm4", "zmm5", "zmm6", "zmm7",
3205 "zmm8", "zmm9", "zmm10", "zmm11",
3206 "zmm12", "zmm13", "zmm14", "zmm15",
3207 "zmm16", "zmm17", "zmm18", "zmm19",
3208 "zmm20", "zmm21", "zmm22", "zmm23",
3209 "zmm24", "zmm25", "zmm26", "zmm27",
3210 "zmm28", "zmm29", "zmm30", "zmm31"
3211 };
3212 static const char *att_names_zmm[] = {
3213 "%zmm0", "%zmm1", "%zmm2", "%zmm3",
3214 "%zmm4", "%zmm5", "%zmm6", "%zmm7",
3215 "%zmm8", "%zmm9", "%zmm10", "%zmm11",
3216 "%zmm12", "%zmm13", "%zmm14", "%zmm15",
3217 "%zmm16", "%zmm17", "%zmm18", "%zmm19",
3218 "%zmm20", "%zmm21", "%zmm22", "%zmm23",
3219 "%zmm24", "%zmm25", "%zmm26", "%zmm27",
3220 "%zmm28", "%zmm29", "%zmm30", "%zmm31"
3221 };
3222
3223 static const char **names_mask;
3224 static const char *intel_names_mask[] = {
3225 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7"
3226 };
3227 static const char *att_names_mask[] = {
3228 "%k0", "%k1", "%k2", "%k3", "%k4", "%k5", "%k6", "%k7"
3229 };
3230
3231 static const char *names_rounding[] =
3232 {
3233 "{rn-sae}",
3234 "{rd-sae}",
3235 "{ru-sae}",
3236 "{rz-sae}"
3237 };
3238
3239 static const struct dis386 reg_table[][8] = {
3240 /* REG_80 */
3241 {
3242 { "addA", { Ebh1, Ib }, 0 },
3243 { "orA", { Ebh1, Ib }, 0 },
3244 { "adcA", { Ebh1, Ib }, 0 },
3245 { "sbbA", { Ebh1, Ib }, 0 },
3246 { "andA", { Ebh1, Ib }, 0 },
3247 { "subA", { Ebh1, Ib }, 0 },
3248 { "xorA", { Ebh1, Ib }, 0 },
3249 { "cmpA", { Eb, Ib }, 0 },
3250 },
3251 /* REG_81 */
3252 {
3253 { "addQ", { Evh1, Iv }, 0 },
3254 { "orQ", { Evh1, Iv }, 0 },
3255 { "adcQ", { Evh1, Iv }, 0 },
3256 { "sbbQ", { Evh1, Iv }, 0 },
3257 { "andQ", { Evh1, Iv }, 0 },
3258 { "subQ", { Evh1, Iv }, 0 },
3259 { "xorQ", { Evh1, Iv }, 0 },
3260 { "cmpQ", { Ev, Iv }, 0 },
3261 },
3262 /* REG_83 */
3263 {
3264 { "addQ", { Evh1, sIb }, 0 },
3265 { "orQ", { Evh1, sIb }, 0 },
3266 { "adcQ", { Evh1, sIb }, 0 },
3267 { "sbbQ", { Evh1, sIb }, 0 },
3268 { "andQ", { Evh1, sIb }, 0 },
3269 { "subQ", { Evh1, sIb }, 0 },
3270 { "xorQ", { Evh1, sIb }, 0 },
3271 { "cmpQ", { Ev, sIb }, 0 },
3272 },
3273 /* REG_8F */
3274 {
3275 { "popU", { stackEv }, 0 },
3276 { XOP_8F_TABLE (XOP_09) },
3277 { Bad_Opcode },
3278 { Bad_Opcode },
3279 { Bad_Opcode },
3280 { XOP_8F_TABLE (XOP_09) },
3281 },
3282 /* REG_C0 */
3283 {
3284 { "rolA", { Eb, Ib }, 0 },
3285 { "rorA", { Eb, Ib }, 0 },
3286 { "rclA", { Eb, Ib }, 0 },
3287 { "rcrA", { Eb, Ib }, 0 },
3288 { "shlA", { Eb, Ib }, 0 },
3289 { "shrA", { Eb, Ib }, 0 },
3290 { "shlA", { Eb, Ib }, 0 },
3291 { "sarA", { Eb, Ib }, 0 },
3292 },
3293 /* REG_C1 */
3294 {
3295 { "rolQ", { Ev, Ib }, 0 },
3296 { "rorQ", { Ev, Ib }, 0 },
3297 { "rclQ", { Ev, Ib }, 0 },
3298 { "rcrQ", { Ev, Ib }, 0 },
3299 { "shlQ", { Ev, Ib }, 0 },
3300 { "shrQ", { Ev, Ib }, 0 },
3301 { "shlQ", { Ev, Ib }, 0 },
3302 { "sarQ", { Ev, Ib }, 0 },
3303 },
3304 /* REG_C6 */
3305 {
3306 { "movA", { Ebh3, Ib }, 0 },
3307 { Bad_Opcode },
3308 { Bad_Opcode },
3309 { Bad_Opcode },
3310 { Bad_Opcode },
3311 { Bad_Opcode },
3312 { Bad_Opcode },
3313 { MOD_TABLE (MOD_C6_REG_7) },
3314 },
3315 /* REG_C7 */
3316 {
3317 { "movQ", { Evh3, Iv }, 0 },
3318 { Bad_Opcode },
3319 { Bad_Opcode },
3320 { Bad_Opcode },
3321 { Bad_Opcode },
3322 { Bad_Opcode },
3323 { Bad_Opcode },
3324 { MOD_TABLE (MOD_C7_REG_7) },
3325 },
3326 /* REG_D0 */
3327 {
3328 { "rolA", { Eb, I1 }, 0 },
3329 { "rorA", { Eb, I1 }, 0 },
3330 { "rclA", { Eb, I1 }, 0 },
3331 { "rcrA", { Eb, I1 }, 0 },
3332 { "shlA", { Eb, I1 }, 0 },
3333 { "shrA", { Eb, I1 }, 0 },
3334 { "shlA", { Eb, I1 }, 0 },
3335 { "sarA", { Eb, I1 }, 0 },
3336 },
3337 /* REG_D1 */
3338 {
3339 { "rolQ", { Ev, I1 }, 0 },
3340 { "rorQ", { Ev, I1 }, 0 },
3341 { "rclQ", { Ev, I1 }, 0 },
3342 { "rcrQ", { Ev, I1 }, 0 },
3343 { "shlQ", { Ev, I1 }, 0 },
3344 { "shrQ", { Ev, I1 }, 0 },
3345 { "shlQ", { Ev, I1 }, 0 },
3346 { "sarQ", { Ev, I1 }, 0 },
3347 },
3348 /* REG_D2 */
3349 {
3350 { "rolA", { Eb, CL }, 0 },
3351 { "rorA", { Eb, CL }, 0 },
3352 { "rclA", { Eb, CL }, 0 },
3353 { "rcrA", { Eb, CL }, 0 },
3354 { "shlA", { Eb, CL }, 0 },
3355 { "shrA", { Eb, CL }, 0 },
3356 { "shlA", { Eb, CL }, 0 },
3357 { "sarA", { Eb, CL }, 0 },
3358 },
3359 /* REG_D3 */
3360 {
3361 { "rolQ", { Ev, CL }, 0 },
3362 { "rorQ", { Ev, CL }, 0 },
3363 { "rclQ", { Ev, CL }, 0 },
3364 { "rcrQ", { Ev, CL }, 0 },
3365 { "shlQ", { Ev, CL }, 0 },
3366 { "shrQ", { Ev, CL }, 0 },
3367 { "shlQ", { Ev, CL }, 0 },
3368 { "sarQ", { Ev, CL }, 0 },
3369 },
3370 /* REG_F6 */
3371 {
3372 { "testA", { Eb, Ib }, 0 },
3373 { "testA", { Eb, Ib }, 0 },
3374 { "notA", { Ebh1 }, 0 },
3375 { "negA", { Ebh1 }, 0 },
3376 { "mulA", { Eb }, 0 }, /* Don't print the implicit %al register, */
3377 { "imulA", { Eb }, 0 }, /* to distinguish these opcodes from other */
3378 { "divA", { Eb }, 0 }, /* mul/imul opcodes. Do the same for div */
3379 { "idivA", { Eb }, 0 }, /* and idiv for consistency. */
3380 },
3381 /* REG_F7 */
3382 {
3383 { "testQ", { Ev, Iv }, 0 },
3384 { "testQ", { Ev, Iv }, 0 },
3385 { "notQ", { Evh1 }, 0 },
3386 { "negQ", { Evh1 }, 0 },
3387 { "mulQ", { Ev }, 0 }, /* Don't print the implicit register. */
3388 { "imulQ", { Ev }, 0 },
3389 { "divQ", { Ev }, 0 },
3390 { "idivQ", { Ev }, 0 },
3391 },
3392 /* REG_FE */
3393 {
3394 { "incA", { Ebh1 }, 0 },
3395 { "decA", { Ebh1 }, 0 },
3396 },
3397 /* REG_FF */
3398 {
3399 { "incQ", { Evh1 }, 0 },
3400 { "decQ", { Evh1 }, 0 },
3401 { "call{&|}", { NOTRACK, indirEv, BND }, 0 },
3402 { MOD_TABLE (MOD_FF_REG_3) },
3403 { "jmp{&|}", { NOTRACK, indirEv, BND }, 0 },
3404 { MOD_TABLE (MOD_FF_REG_5) },
3405 { "pushU", { stackEv }, 0 },
3406 { Bad_Opcode },
3407 },
3408 /* REG_0F00 */
3409 {
3410 { "sldtD", { Sv }, 0 },
3411 { "strD", { Sv }, 0 },
3412 { "lldt", { Ew }, 0 },
3413 { "ltr", { Ew }, 0 },
3414 { "verr", { Ew }, 0 },
3415 { "verw", { Ew }, 0 },
3416 { Bad_Opcode },
3417 { Bad_Opcode },
3418 },
3419 /* REG_0F01 */
3420 {
3421 { MOD_TABLE (MOD_0F01_REG_0) },
3422 { MOD_TABLE (MOD_0F01_REG_1) },
3423 { MOD_TABLE (MOD_0F01_REG_2) },
3424 { MOD_TABLE (MOD_0F01_REG_3) },
3425 { "smswD", { Sv }, 0 },
3426 { MOD_TABLE (MOD_0F01_REG_5) },
3427 { "lmsw", { Ew }, 0 },
3428 { MOD_TABLE (MOD_0F01_REG_7) },
3429 },
3430 /* REG_0F0D */
3431 {
3432 { "prefetch", { Mb }, 0 },
3433 { "prefetchw", { Mb }, 0 },
3434 { "prefetchwt1", { Mb }, 0 },
3435 { "prefetch", { Mb }, 0 },
3436 { "prefetch", { Mb }, 0 },
3437 { "prefetch", { Mb }, 0 },
3438 { "prefetch", { Mb }, 0 },
3439 { "prefetch", { Mb }, 0 },
3440 },
3441 /* REG_0F18 */
3442 {
3443 { MOD_TABLE (MOD_0F18_REG_0) },
3444 { MOD_TABLE (MOD_0F18_REG_1) },
3445 { MOD_TABLE (MOD_0F18_REG_2) },
3446 { MOD_TABLE (MOD_0F18_REG_3) },
3447 { MOD_TABLE (MOD_0F18_REG_4) },
3448 { MOD_TABLE (MOD_0F18_REG_5) },
3449 { MOD_TABLE (MOD_0F18_REG_6) },
3450 { MOD_TABLE (MOD_0F18_REG_7) },
3451 },
3452 /* REG_0F1C_MOD_0 */
3453 {
3454 { "cldemote", { Mb }, 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 { "nopQ", { Ev }, 0 },
3462 },
3463 /* REG_0F1E_MOD_3 */
3464 {
3465 { "nopQ", { Ev }, 0 },
3466 { "rdsspK", { Rdq }, PREFIX_OPCODE },
3467 { "nopQ", { Ev }, 0 },
3468 { "nopQ", { Ev }, 0 },
3469 { "nopQ", { Ev }, 0 },
3470 { "nopQ", { Ev }, 0 },
3471 { "nopQ", { Ev }, 0 },
3472 { RM_TABLE (RM_0F1E_MOD_3_REG_7) },
3473 },
3474 /* REG_0F71 */
3475 {
3476 { Bad_Opcode },
3477 { Bad_Opcode },
3478 { MOD_TABLE (MOD_0F71_REG_2) },
3479 { Bad_Opcode },
3480 { MOD_TABLE (MOD_0F71_REG_4) },
3481 { Bad_Opcode },
3482 { MOD_TABLE (MOD_0F71_REG_6) },
3483 },
3484 /* REG_0F72 */
3485 {
3486 { Bad_Opcode },
3487 { Bad_Opcode },
3488 { MOD_TABLE (MOD_0F72_REG_2) },
3489 { Bad_Opcode },
3490 { MOD_TABLE (MOD_0F72_REG_4) },
3491 { Bad_Opcode },
3492 { MOD_TABLE (MOD_0F72_REG_6) },
3493 },
3494 /* REG_0F73 */
3495 {
3496 { Bad_Opcode },
3497 { Bad_Opcode },
3498 { MOD_TABLE (MOD_0F73_REG_2) },
3499 { MOD_TABLE (MOD_0F73_REG_3) },
3500 { Bad_Opcode },
3501 { Bad_Opcode },
3502 { MOD_TABLE (MOD_0F73_REG_6) },
3503 { MOD_TABLE (MOD_0F73_REG_7) },
3504 },
3505 /* REG_0FA6 */
3506 {
3507 { "montmul", { { OP_0f07, 0 } }, 0 },
3508 { "xsha1", { { OP_0f07, 0 } }, 0 },
3509 { "xsha256", { { OP_0f07, 0 } }, 0 },
3510 },
3511 /* REG_0FA7 */
3512 {
3513 { "xstore-rng", { { OP_0f07, 0 } }, 0 },
3514 { "xcrypt-ecb", { { OP_0f07, 0 } }, 0 },
3515 { "xcrypt-cbc", { { OP_0f07, 0 } }, 0 },
3516 { "xcrypt-ctr", { { OP_0f07, 0 } }, 0 },
3517 { "xcrypt-cfb", { { OP_0f07, 0 } }, 0 },
3518 { "xcrypt-ofb", { { OP_0f07, 0 } }, 0 },
3519 },
3520 /* REG_0FAE */
3521 {
3522 { MOD_TABLE (MOD_0FAE_REG_0) },
3523 { MOD_TABLE (MOD_0FAE_REG_1) },
3524 { MOD_TABLE (MOD_0FAE_REG_2) },
3525 { MOD_TABLE (MOD_0FAE_REG_3) },
3526 { MOD_TABLE (MOD_0FAE_REG_4) },
3527 { MOD_TABLE (MOD_0FAE_REG_5) },
3528 { MOD_TABLE (MOD_0FAE_REG_6) },
3529 { MOD_TABLE (MOD_0FAE_REG_7) },
3530 },
3531 /* REG_0FBA */
3532 {
3533 { Bad_Opcode },
3534 { Bad_Opcode },
3535 { Bad_Opcode },
3536 { Bad_Opcode },
3537 { "btQ", { Ev, Ib }, 0 },
3538 { "btsQ", { Evh1, Ib }, 0 },
3539 { "btrQ", { Evh1, Ib }, 0 },
3540 { "btcQ", { Evh1, Ib }, 0 },
3541 },
3542 /* REG_0FC7 */
3543 {
3544 { Bad_Opcode },
3545 { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } }, 0 },
3546 { Bad_Opcode },
3547 { MOD_TABLE (MOD_0FC7_REG_3) },
3548 { MOD_TABLE (MOD_0FC7_REG_4) },
3549 { MOD_TABLE (MOD_0FC7_REG_5) },
3550 { MOD_TABLE (MOD_0FC7_REG_6) },
3551 { MOD_TABLE (MOD_0FC7_REG_7) },
3552 },
3553 /* REG_VEX_0F71 */
3554 {
3555 { Bad_Opcode },
3556 { Bad_Opcode },
3557 { MOD_TABLE (MOD_VEX_0F71_REG_2) },
3558 { Bad_Opcode },
3559 { MOD_TABLE (MOD_VEX_0F71_REG_4) },
3560 { Bad_Opcode },
3561 { MOD_TABLE (MOD_VEX_0F71_REG_6) },
3562 },
3563 /* REG_VEX_0F72 */
3564 {
3565 { Bad_Opcode },
3566 { Bad_Opcode },
3567 { MOD_TABLE (MOD_VEX_0F72_REG_2) },
3568 { Bad_Opcode },
3569 { MOD_TABLE (MOD_VEX_0F72_REG_4) },
3570 { Bad_Opcode },
3571 { MOD_TABLE (MOD_VEX_0F72_REG_6) },
3572 },
3573 /* REG_VEX_0F73 */
3574 {
3575 { Bad_Opcode },
3576 { Bad_Opcode },
3577 { MOD_TABLE (MOD_VEX_0F73_REG_2) },
3578 { MOD_TABLE (MOD_VEX_0F73_REG_3) },
3579 { Bad_Opcode },
3580 { Bad_Opcode },
3581 { MOD_TABLE (MOD_VEX_0F73_REG_6) },
3582 { MOD_TABLE (MOD_VEX_0F73_REG_7) },
3583 },
3584 /* REG_VEX_0FAE */
3585 {
3586 { Bad_Opcode },
3587 { Bad_Opcode },
3588 { MOD_TABLE (MOD_VEX_0FAE_REG_2) },
3589 { MOD_TABLE (MOD_VEX_0FAE_REG_3) },
3590 },
3591 /* REG_VEX_0F38F3 */
3592 {
3593 { Bad_Opcode },
3594 { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_1) },
3595 { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_2) },
3596 { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_3) },
3597 },
3598 /* REG_XOP_LWPCB */
3599 {
3600 { "llwpcb", { { OP_LWPCB_E, 0 } }, 0 },
3601 { "slwpcb", { { OP_LWPCB_E, 0 } }, 0 },
3602 },
3603 /* REG_XOP_LWP */
3604 {
3605 { "lwpins", { { OP_LWP_E, 0 }, Ed, Id }, 0 },
3606 { "lwpval", { { OP_LWP_E, 0 }, Ed, Id }, 0 },
3607 },
3608 /* REG_XOP_TBM_01 */
3609 {
3610 { Bad_Opcode },
3611 { "blcfill", { { OP_LWP_E, 0 }, Edq }, 0 },
3612 { "blsfill", { { OP_LWP_E, 0 }, Edq }, 0 },
3613 { "blcs", { { OP_LWP_E, 0 }, Edq }, 0 },
3614 { "tzmsk", { { OP_LWP_E, 0 }, Edq }, 0 },
3615 { "blcic", { { OP_LWP_E, 0 }, Edq }, 0 },
3616 { "blsic", { { OP_LWP_E, 0 }, Edq }, 0 },
3617 { "t1mskc", { { OP_LWP_E, 0 }, Edq }, 0 },
3618 },
3619 /* REG_XOP_TBM_02 */
3620 {
3621 { Bad_Opcode },
3622 { "blcmsk", { { OP_LWP_E, 0 }, Edq }, 0 },
3623 { Bad_Opcode },
3624 { Bad_Opcode },
3625 { Bad_Opcode },
3626 { Bad_Opcode },
3627 { "blci", { { OP_LWP_E, 0 }, Edq }, 0 },
3628 },
3629
3630 #include "i386-dis-evex-reg.h"
3631 };
3632
3633 static const struct dis386 prefix_table[][4] = {
3634 /* PREFIX_90 */
3635 {
3636 { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } }, 0 },
3637 { "pause", { XX }, 0 },
3638 { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } }, 0 },
3639 { NULL, { { NULL, 0 } }, PREFIX_IGNORED }
3640 },
3641
3642 /* PREFIX_MOD_0_0F01_REG_5 */
3643 {
3644 { Bad_Opcode },
3645 { "rstorssp", { Mq }, PREFIX_OPCODE },
3646 },
3647
3648 /* PREFIX_MOD_3_0F01_REG_5_RM_0 */
3649 {
3650 { Bad_Opcode },
3651 { "setssbsy", { Skip_MODRM }, PREFIX_OPCODE },
3652 },
3653
3654 /* PREFIX_MOD_3_0F01_REG_5_RM_2 */
3655 {
3656 { Bad_Opcode },
3657 { "saveprevssp", { Skip_MODRM }, PREFIX_OPCODE },
3658 },
3659
3660 /* PREFIX_0F09 */
3661 {
3662 { "wbinvd", { XX }, 0 },
3663 { "wbnoinvd", { XX }, 0 },
3664 },
3665
3666 /* PREFIX_0F10 */
3667 {
3668 { "movups", { XM, EXx }, PREFIX_OPCODE },
3669 { "movss", { XM, EXd }, PREFIX_OPCODE },
3670 { "movupd", { XM, EXx }, PREFIX_OPCODE },
3671 { "movsd", { XM, EXq }, PREFIX_OPCODE },
3672 },
3673
3674 /* PREFIX_0F11 */
3675 {
3676 { "movups", { EXxS, XM }, PREFIX_OPCODE },
3677 { "movss", { EXdS, XM }, PREFIX_OPCODE },
3678 { "movupd", { EXxS, XM }, PREFIX_OPCODE },
3679 { "movsd", { EXqS, XM }, PREFIX_OPCODE },
3680 },
3681
3682 /* PREFIX_0F12 */
3683 {
3684 { MOD_TABLE (MOD_0F12_PREFIX_0) },
3685 { "movsldup", { XM, EXx }, PREFIX_OPCODE },
3686 { "movlpd", { XM, EXq }, PREFIX_OPCODE },
3687 { "movddup", { XM, EXq }, PREFIX_OPCODE },
3688 },
3689
3690 /* PREFIX_0F16 */
3691 {
3692 { MOD_TABLE (MOD_0F16_PREFIX_0) },
3693 { "movshdup", { XM, EXx }, PREFIX_OPCODE },
3694 { "movhpd", { XM, EXq }, PREFIX_OPCODE },
3695 },
3696
3697 /* PREFIX_0F1A */
3698 {
3699 { MOD_TABLE (MOD_0F1A_PREFIX_0) },
3700 { "bndcl", { Gbnd, Ev_bnd }, 0 },
3701 { "bndmov", { Gbnd, Ebnd }, 0 },
3702 { "bndcu", { Gbnd, Ev_bnd }, 0 },
3703 },
3704
3705 /* PREFIX_0F1B */
3706 {
3707 { MOD_TABLE (MOD_0F1B_PREFIX_0) },
3708 { MOD_TABLE (MOD_0F1B_PREFIX_1) },
3709 { "bndmov", { EbndS, Gbnd }, 0 },
3710 { "bndcn", { Gbnd, Ev_bnd }, 0 },
3711 },
3712
3713 /* PREFIX_0F1C */
3714 {
3715 { MOD_TABLE (MOD_0F1C_PREFIX_0) },
3716 { "nopQ", { Ev }, PREFIX_OPCODE },
3717 { "nopQ", { Ev }, PREFIX_OPCODE },
3718 { "nopQ", { Ev }, PREFIX_OPCODE },
3719 },
3720
3721 /* PREFIX_0F1E */
3722 {
3723 { "nopQ", { Ev }, PREFIX_OPCODE },
3724 { MOD_TABLE (MOD_0F1E_PREFIX_1) },
3725 { "nopQ", { Ev }, PREFIX_OPCODE },
3726 { "nopQ", { Ev }, PREFIX_OPCODE },
3727 },
3728
3729 /* PREFIX_0F2A */
3730 {
3731 { "cvtpi2ps", { XM, EMCq }, PREFIX_OPCODE },
3732 { "cvtsi2ss%LQ", { XM, Edq }, PREFIX_OPCODE },
3733 { "cvtpi2pd", { XM, EMCq }, PREFIX_OPCODE },
3734 { "cvtsi2sd%LQ", { XM, Edq }, 0 },
3735 },
3736
3737 /* PREFIX_0F2B */
3738 {
3739 { MOD_TABLE (MOD_0F2B_PREFIX_0) },
3740 { MOD_TABLE (MOD_0F2B_PREFIX_1) },
3741 { MOD_TABLE (MOD_0F2B_PREFIX_2) },
3742 { MOD_TABLE (MOD_0F2B_PREFIX_3) },
3743 },
3744
3745 /* PREFIX_0F2C */
3746 {
3747 { "cvttps2pi", { MXC, EXq }, PREFIX_OPCODE },
3748 { "cvttss2si", { Gdq, EXd }, PREFIX_OPCODE },
3749 { "cvttpd2pi", { MXC, EXx }, PREFIX_OPCODE },
3750 { "cvttsd2si", { Gdq, EXq }, PREFIX_OPCODE },
3751 },
3752
3753 /* PREFIX_0F2D */
3754 {
3755 { "cvtps2pi", { MXC, EXq }, PREFIX_OPCODE },
3756 { "cvtss2si", { Gdq, EXd }, PREFIX_OPCODE },
3757 { "cvtpd2pi", { MXC, EXx }, PREFIX_OPCODE },
3758 { "cvtsd2si", { Gdq, EXq }, PREFIX_OPCODE },
3759 },
3760
3761 /* PREFIX_0F2E */
3762 {
3763 { "ucomiss",{ XM, EXd }, 0 },
3764 { Bad_Opcode },
3765 { "ucomisd",{ XM, EXq }, 0 },
3766 },
3767
3768 /* PREFIX_0F2F */
3769 {
3770 { "comiss", { XM, EXd }, 0 },
3771 { Bad_Opcode },
3772 { "comisd", { XM, EXq }, 0 },
3773 },
3774
3775 /* PREFIX_0F51 */
3776 {
3777 { "sqrtps", { XM, EXx }, PREFIX_OPCODE },
3778 { "sqrtss", { XM, EXd }, PREFIX_OPCODE },
3779 { "sqrtpd", { XM, EXx }, PREFIX_OPCODE },
3780 { "sqrtsd", { XM, EXq }, PREFIX_OPCODE },
3781 },
3782
3783 /* PREFIX_0F52 */
3784 {
3785 { "rsqrtps",{ XM, EXx }, PREFIX_OPCODE },
3786 { "rsqrtss",{ XM, EXd }, PREFIX_OPCODE },
3787 },
3788
3789 /* PREFIX_0F53 */
3790 {
3791 { "rcpps", { XM, EXx }, PREFIX_OPCODE },
3792 { "rcpss", { XM, EXd }, PREFIX_OPCODE },
3793 },
3794
3795 /* PREFIX_0F58 */
3796 {
3797 { "addps", { XM, EXx }, PREFIX_OPCODE },
3798 { "addss", { XM, EXd }, PREFIX_OPCODE },
3799 { "addpd", { XM, EXx }, PREFIX_OPCODE },
3800 { "addsd", { XM, EXq }, PREFIX_OPCODE },
3801 },
3802
3803 /* PREFIX_0F59 */
3804 {
3805 { "mulps", { XM, EXx }, PREFIX_OPCODE },
3806 { "mulss", { XM, EXd }, PREFIX_OPCODE },
3807 { "mulpd", { XM, EXx }, PREFIX_OPCODE },
3808 { "mulsd", { XM, EXq }, PREFIX_OPCODE },
3809 },
3810
3811 /* PREFIX_0F5A */
3812 {
3813 { "cvtps2pd", { XM, EXq }, PREFIX_OPCODE },
3814 { "cvtss2sd", { XM, EXd }, PREFIX_OPCODE },
3815 { "cvtpd2ps", { XM, EXx }, PREFIX_OPCODE },
3816 { "cvtsd2ss", { XM, EXq }, PREFIX_OPCODE },
3817 },
3818
3819 /* PREFIX_0F5B */
3820 {
3821 { "cvtdq2ps", { XM, EXx }, PREFIX_OPCODE },
3822 { "cvttps2dq", { XM, EXx }, PREFIX_OPCODE },
3823 { "cvtps2dq", { XM, EXx }, PREFIX_OPCODE },
3824 },
3825
3826 /* PREFIX_0F5C */
3827 {
3828 { "subps", { XM, EXx }, PREFIX_OPCODE },
3829 { "subss", { XM, EXd }, PREFIX_OPCODE },
3830 { "subpd", { XM, EXx }, PREFIX_OPCODE },
3831 { "subsd", { XM, EXq }, PREFIX_OPCODE },
3832 },
3833
3834 /* PREFIX_0F5D */
3835 {
3836 { "minps", { XM, EXx }, PREFIX_OPCODE },
3837 { "minss", { XM, EXd }, PREFIX_OPCODE },
3838 { "minpd", { XM, EXx }, PREFIX_OPCODE },
3839 { "minsd", { XM, EXq }, PREFIX_OPCODE },
3840 },
3841
3842 /* PREFIX_0F5E */
3843 {
3844 { "divps", { XM, EXx }, PREFIX_OPCODE },
3845 { "divss", { XM, EXd }, PREFIX_OPCODE },
3846 { "divpd", { XM, EXx }, PREFIX_OPCODE },
3847 { "divsd", { XM, EXq }, PREFIX_OPCODE },
3848 },
3849
3850 /* PREFIX_0F5F */
3851 {
3852 { "maxps", { XM, EXx }, PREFIX_OPCODE },
3853 { "maxss", { XM, EXd }, PREFIX_OPCODE },
3854 { "maxpd", { XM, EXx }, PREFIX_OPCODE },
3855 { "maxsd", { XM, EXq }, PREFIX_OPCODE },
3856 },
3857
3858 /* PREFIX_0F60 */
3859 {
3860 { "punpcklbw",{ MX, EMd }, PREFIX_OPCODE },
3861 { Bad_Opcode },
3862 { "punpcklbw",{ MX, EMx }, PREFIX_OPCODE },
3863 },
3864
3865 /* PREFIX_0F61 */
3866 {
3867 { "punpcklwd",{ MX, EMd }, PREFIX_OPCODE },
3868 { Bad_Opcode },
3869 { "punpcklwd",{ MX, EMx }, PREFIX_OPCODE },
3870 },
3871
3872 /* PREFIX_0F62 */
3873 {
3874 { "punpckldq",{ MX, EMd }, PREFIX_OPCODE },
3875 { Bad_Opcode },
3876 { "punpckldq",{ MX, EMx }, PREFIX_OPCODE },
3877 },
3878
3879 /* PREFIX_0F6C */
3880 {
3881 { Bad_Opcode },
3882 { Bad_Opcode },
3883 { "punpcklqdq", { XM, EXx }, PREFIX_OPCODE },
3884 },
3885
3886 /* PREFIX_0F6D */
3887 {
3888 { Bad_Opcode },
3889 { Bad_Opcode },
3890 { "punpckhqdq", { XM, EXx }, PREFIX_OPCODE },
3891 },
3892
3893 /* PREFIX_0F6F */
3894 {
3895 { "movq", { MX, EM }, PREFIX_OPCODE },
3896 { "movdqu", { XM, EXx }, PREFIX_OPCODE },
3897 { "movdqa", { XM, EXx }, PREFIX_OPCODE },
3898 },
3899
3900 /* PREFIX_0F70 */
3901 {
3902 { "pshufw", { MX, EM, Ib }, PREFIX_OPCODE },
3903 { "pshufhw",{ XM, EXx, Ib }, PREFIX_OPCODE },
3904 { "pshufd", { XM, EXx, Ib }, PREFIX_OPCODE },
3905 { "pshuflw",{ XM, EXx, Ib }, PREFIX_OPCODE },
3906 },
3907
3908 /* PREFIX_0F73_REG_3 */
3909 {
3910 { Bad_Opcode },
3911 { Bad_Opcode },
3912 { "psrldq", { XS, Ib }, 0 },
3913 },
3914
3915 /* PREFIX_0F73_REG_7 */
3916 {
3917 { Bad_Opcode },
3918 { Bad_Opcode },
3919 { "pslldq", { XS, Ib }, 0 },
3920 },
3921
3922 /* PREFIX_0F78 */
3923 {
3924 {"vmread", { Em, Gm }, 0 },
3925 { Bad_Opcode },
3926 {"extrq", { XS, Ib, Ib }, 0 },
3927 {"insertq", { XM, XS, Ib, Ib }, 0 },
3928 },
3929
3930 /* PREFIX_0F79 */
3931 {
3932 {"vmwrite", { Gm, Em }, 0 },
3933 { Bad_Opcode },
3934 {"extrq", { XM, XS }, 0 },
3935 {"insertq", { XM, XS }, 0 },
3936 },
3937
3938 /* PREFIX_0F7C */
3939 {
3940 { Bad_Opcode },
3941 { Bad_Opcode },
3942 { "haddpd", { XM, EXx }, PREFIX_OPCODE },
3943 { "haddps", { XM, EXx }, PREFIX_OPCODE },
3944 },
3945
3946 /* PREFIX_0F7D */
3947 {
3948 { Bad_Opcode },
3949 { Bad_Opcode },
3950 { "hsubpd", { XM, EXx }, PREFIX_OPCODE },
3951 { "hsubps", { XM, EXx }, PREFIX_OPCODE },
3952 },
3953
3954 /* PREFIX_0F7E */
3955 {
3956 { "movK", { Edq, MX }, PREFIX_OPCODE },
3957 { "movq", { XM, EXq }, PREFIX_OPCODE },
3958 { "movK", { Edq, XM }, PREFIX_OPCODE },
3959 },
3960
3961 /* PREFIX_0F7F */
3962 {
3963 { "movq", { EMS, MX }, PREFIX_OPCODE },
3964 { "movdqu", { EXxS, XM }, PREFIX_OPCODE },
3965 { "movdqa", { EXxS, XM }, PREFIX_OPCODE },
3966 },
3967
3968 /* PREFIX_0FAE_REG_0 */
3969 {
3970 { Bad_Opcode },
3971 { "rdfsbase", { Ev }, 0 },
3972 },
3973
3974 /* PREFIX_0FAE_REG_1 */
3975 {
3976 { Bad_Opcode },
3977 { "rdgsbase", { Ev }, 0 },
3978 },
3979
3980 /* PREFIX_0FAE_REG_2 */
3981 {
3982 { Bad_Opcode },
3983 { "wrfsbase", { Ev }, 0 },
3984 },
3985
3986 /* PREFIX_0FAE_REG_3 */
3987 {
3988 { Bad_Opcode },
3989 { "wrgsbase", { Ev }, 0 },
3990 },
3991
3992 /* PREFIX_MOD_0_0FAE_REG_4 */
3993 {
3994 { "xsave", { FXSAVE }, 0 },
3995 { "ptwrite%LQ", { Edq }, 0 },
3996 },
3997
3998 /* PREFIX_MOD_3_0FAE_REG_4 */
3999 {
4000 { Bad_Opcode },
4001 { "ptwrite%LQ", { Edq }, 0 },
4002 },
4003
4004 /* PREFIX_MOD_0_0FAE_REG_5 */
4005 {
4006 { "xrstor", { FXSAVE }, PREFIX_OPCODE },
4007 },
4008
4009 /* PREFIX_MOD_3_0FAE_REG_5 */
4010 {
4011 { "lfence", { Skip_MODRM }, 0 },
4012 { "incsspK", { Rdq }, PREFIX_OPCODE },
4013 },
4014
4015 /* PREFIX_MOD_0_0FAE_REG_6 */
4016 {
4017 { "xsaveopt", { FXSAVE }, PREFIX_OPCODE },
4018 { "clrssbsy", { Mq }, PREFIX_OPCODE },
4019 { "clwb", { Mb }, PREFIX_OPCODE },
4020 },
4021
4022 /* PREFIX_MOD_1_0FAE_REG_6 */
4023 {
4024 { RM_TABLE (RM_0FAE_REG_6) },
4025 { "umonitor", { Eva }, PREFIX_OPCODE },
4026 { "tpause", { Edq }, PREFIX_OPCODE },
4027 { "umwait", { Edq }, PREFIX_OPCODE },
4028 },
4029
4030 /* PREFIX_0FAE_REG_7 */
4031 {
4032 { "clflush", { Mb }, 0 },
4033 { Bad_Opcode },
4034 { "clflushopt", { Mb }, 0 },
4035 },
4036
4037 /* PREFIX_0FB8 */
4038 {
4039 { Bad_Opcode },
4040 { "popcntS", { Gv, Ev }, 0 },
4041 },
4042
4043 /* PREFIX_0FBC */
4044 {
4045 { "bsfS", { Gv, Ev }, 0 },
4046 { "tzcntS", { Gv, Ev }, 0 },
4047 { "bsfS", { Gv, Ev }, 0 },
4048 },
4049
4050 /* PREFIX_0FBD */
4051 {
4052 { "bsrS", { Gv, Ev }, 0 },
4053 { "lzcntS", { Gv, Ev }, 0 },
4054 { "bsrS", { Gv, Ev }, 0 },
4055 },
4056
4057 /* PREFIX_0FC2 */
4058 {
4059 { "cmpps", { XM, EXx, CMP }, PREFIX_OPCODE },
4060 { "cmpss", { XM, EXd, CMP }, PREFIX_OPCODE },
4061 { "cmppd", { XM, EXx, CMP }, PREFIX_OPCODE },
4062 { "cmpsd", { XM, EXq, CMP }, PREFIX_OPCODE },
4063 },
4064
4065 /* PREFIX_MOD_0_0FC3 */
4066 {
4067 { "movntiS", { Edq, Gdq }, PREFIX_OPCODE },
4068 },
4069
4070 /* PREFIX_MOD_0_0FC7_REG_6 */
4071 {
4072 { "vmptrld",{ Mq }, 0 },
4073 { "vmxon", { Mq }, 0 },
4074 { "vmclear",{ Mq }, 0 },
4075 },
4076
4077 /* PREFIX_MOD_3_0FC7_REG_6 */
4078 {
4079 { "rdrand", { Ev }, 0 },
4080 { Bad_Opcode },
4081 { "rdrand", { Ev }, 0 }
4082 },
4083
4084 /* PREFIX_MOD_3_0FC7_REG_7 */
4085 {
4086 { "rdseed", { Ev }, 0 },
4087 { "rdpid", { Em }, 0 },
4088 { "rdseed", { Ev }, 0 },
4089 },
4090
4091 /* PREFIX_0FD0 */
4092 {
4093 { Bad_Opcode },
4094 { Bad_Opcode },
4095 { "addsubpd", { XM, EXx }, 0 },
4096 { "addsubps", { XM, EXx }, 0 },
4097 },
4098
4099 /* PREFIX_0FD6 */
4100 {
4101 { Bad_Opcode },
4102 { "movq2dq",{ XM, MS }, 0 },
4103 { "movq", { EXqS, XM }, 0 },
4104 { "movdq2q",{ MX, XS }, 0 },
4105 },
4106
4107 /* PREFIX_0FE6 */
4108 {
4109 { Bad_Opcode },
4110 { "cvtdq2pd", { XM, EXq }, PREFIX_OPCODE },
4111 { "cvttpd2dq", { XM, EXx }, PREFIX_OPCODE },
4112 { "cvtpd2dq", { XM, EXx }, PREFIX_OPCODE },
4113 },
4114
4115 /* PREFIX_0FE7 */
4116 {
4117 { "movntq", { Mq, MX }, PREFIX_OPCODE },
4118 { Bad_Opcode },
4119 { MOD_TABLE (MOD_0FE7_PREFIX_2) },
4120 },
4121
4122 /* PREFIX_0FF0 */
4123 {
4124 { Bad_Opcode },
4125 { Bad_Opcode },
4126 { Bad_Opcode },
4127 { MOD_TABLE (MOD_0FF0_PREFIX_3) },
4128 },
4129
4130 /* PREFIX_0FF7 */
4131 {
4132 { "maskmovq", { MX, MS }, PREFIX_OPCODE },
4133 { Bad_Opcode },
4134 { "maskmovdqu", { XM, XS }, PREFIX_OPCODE },
4135 },
4136
4137 /* PREFIX_0F3810 */
4138 {
4139 { Bad_Opcode },
4140 { Bad_Opcode },
4141 { "pblendvb", { XM, EXx, XMM0 }, PREFIX_OPCODE },
4142 },
4143
4144 /* PREFIX_0F3814 */
4145 {
4146 { Bad_Opcode },
4147 { Bad_Opcode },
4148 { "blendvps", { XM, EXx, XMM0 }, PREFIX_OPCODE },
4149 },
4150
4151 /* PREFIX_0F3815 */
4152 {
4153 { Bad_Opcode },
4154 { Bad_Opcode },
4155 { "blendvpd", { XM, EXx, XMM0 }, PREFIX_OPCODE },
4156 },
4157
4158 /* PREFIX_0F3817 */
4159 {
4160 { Bad_Opcode },
4161 { Bad_Opcode },
4162 { "ptest", { XM, EXx }, PREFIX_OPCODE },
4163 },
4164
4165 /* PREFIX_0F3820 */
4166 {
4167 { Bad_Opcode },
4168 { Bad_Opcode },
4169 { "pmovsxbw", { XM, EXq }, PREFIX_OPCODE },
4170 },
4171
4172 /* PREFIX_0F3821 */
4173 {
4174 { Bad_Opcode },
4175 { Bad_Opcode },
4176 { "pmovsxbd", { XM, EXd }, PREFIX_OPCODE },
4177 },
4178
4179 /* PREFIX_0F3822 */
4180 {
4181 { Bad_Opcode },
4182 { Bad_Opcode },
4183 { "pmovsxbq", { XM, EXw }, PREFIX_OPCODE },
4184 },
4185
4186 /* PREFIX_0F3823 */
4187 {
4188 { Bad_Opcode },
4189 { Bad_Opcode },
4190 { "pmovsxwd", { XM, EXq }, PREFIX_OPCODE },
4191 },
4192
4193 /* PREFIX_0F3824 */
4194 {
4195 { Bad_Opcode },
4196 { Bad_Opcode },
4197 { "pmovsxwq", { XM, EXd }, PREFIX_OPCODE },
4198 },
4199
4200 /* PREFIX_0F3825 */
4201 {
4202 { Bad_Opcode },
4203 { Bad_Opcode },
4204 { "pmovsxdq", { XM, EXq }, PREFIX_OPCODE },
4205 },
4206
4207 /* PREFIX_0F3828 */
4208 {
4209 { Bad_Opcode },
4210 { Bad_Opcode },
4211 { "pmuldq", { XM, EXx }, PREFIX_OPCODE },
4212 },
4213
4214 /* PREFIX_0F3829 */
4215 {
4216 { Bad_Opcode },
4217 { Bad_Opcode },
4218 { "pcmpeqq", { XM, EXx }, PREFIX_OPCODE },
4219 },
4220
4221 /* PREFIX_0F382A */
4222 {
4223 { Bad_Opcode },
4224 { Bad_Opcode },
4225 { MOD_TABLE (MOD_0F382A_PREFIX_2) },
4226 },
4227
4228 /* PREFIX_0F382B */
4229 {
4230 { Bad_Opcode },
4231 { Bad_Opcode },
4232 { "packusdw", { XM, EXx }, PREFIX_OPCODE },
4233 },
4234
4235 /* PREFIX_0F3830 */
4236 {
4237 { Bad_Opcode },
4238 { Bad_Opcode },
4239 { "pmovzxbw", { XM, EXq }, PREFIX_OPCODE },
4240 },
4241
4242 /* PREFIX_0F3831 */
4243 {
4244 { Bad_Opcode },
4245 { Bad_Opcode },
4246 { "pmovzxbd", { XM, EXd }, PREFIX_OPCODE },
4247 },
4248
4249 /* PREFIX_0F3832 */
4250 {
4251 { Bad_Opcode },
4252 { Bad_Opcode },
4253 { "pmovzxbq", { XM, EXw }, PREFIX_OPCODE },
4254 },
4255
4256 /* PREFIX_0F3833 */
4257 {
4258 { Bad_Opcode },
4259 { Bad_Opcode },
4260 { "pmovzxwd", { XM, EXq }, PREFIX_OPCODE },
4261 },
4262
4263 /* PREFIX_0F3834 */
4264 {
4265 { Bad_Opcode },
4266 { Bad_Opcode },
4267 { "pmovzxwq", { XM, EXd }, PREFIX_OPCODE },
4268 },
4269
4270 /* PREFIX_0F3835 */
4271 {
4272 { Bad_Opcode },
4273 { Bad_Opcode },
4274 { "pmovzxdq", { XM, EXq }, PREFIX_OPCODE },
4275 },
4276
4277 /* PREFIX_0F3837 */
4278 {
4279 { Bad_Opcode },
4280 { Bad_Opcode },
4281 { "pcmpgtq", { XM, EXx }, PREFIX_OPCODE },
4282 },
4283
4284 /* PREFIX_0F3838 */
4285 {
4286 { Bad_Opcode },
4287 { Bad_Opcode },
4288 { "pminsb", { XM, EXx }, PREFIX_OPCODE },
4289 },
4290
4291 /* PREFIX_0F3839 */
4292 {
4293 { Bad_Opcode },
4294 { Bad_Opcode },
4295 { "pminsd", { XM, EXx }, PREFIX_OPCODE },
4296 },
4297
4298 /* PREFIX_0F383A */
4299 {
4300 { Bad_Opcode },
4301 { Bad_Opcode },
4302 { "pminuw", { XM, EXx }, PREFIX_OPCODE },
4303 },
4304
4305 /* PREFIX_0F383B */
4306 {
4307 { Bad_Opcode },
4308 { Bad_Opcode },
4309 { "pminud", { XM, EXx }, PREFIX_OPCODE },
4310 },
4311
4312 /* PREFIX_0F383C */
4313 {
4314 { Bad_Opcode },
4315 { Bad_Opcode },
4316 { "pmaxsb", { XM, EXx }, PREFIX_OPCODE },
4317 },
4318
4319 /* PREFIX_0F383D */
4320 {
4321 { Bad_Opcode },
4322 { Bad_Opcode },
4323 { "pmaxsd", { XM, EXx }, PREFIX_OPCODE },
4324 },
4325
4326 /* PREFIX_0F383E */
4327 {
4328 { Bad_Opcode },
4329 { Bad_Opcode },
4330 { "pmaxuw", { XM, EXx }, PREFIX_OPCODE },
4331 },
4332
4333 /* PREFIX_0F383F */
4334 {
4335 { Bad_Opcode },
4336 { Bad_Opcode },
4337 { "pmaxud", { XM, EXx }, PREFIX_OPCODE },
4338 },
4339
4340 /* PREFIX_0F3840 */
4341 {
4342 { Bad_Opcode },
4343 { Bad_Opcode },
4344 { "pmulld", { XM, EXx }, PREFIX_OPCODE },
4345 },
4346
4347 /* PREFIX_0F3841 */
4348 {
4349 { Bad_Opcode },
4350 { Bad_Opcode },
4351 { "phminposuw", { XM, EXx }, PREFIX_OPCODE },
4352 },
4353
4354 /* PREFIX_0F3880 */
4355 {
4356 { Bad_Opcode },
4357 { Bad_Opcode },
4358 { "invept", { Gm, Mo }, PREFIX_OPCODE },
4359 },
4360
4361 /* PREFIX_0F3881 */
4362 {
4363 { Bad_Opcode },
4364 { Bad_Opcode },
4365 { "invvpid", { Gm, Mo }, PREFIX_OPCODE },
4366 },
4367
4368 /* PREFIX_0F3882 */
4369 {
4370 { Bad_Opcode },
4371 { Bad_Opcode },
4372 { "invpcid", { Gm, M }, PREFIX_OPCODE },
4373 },
4374
4375 /* PREFIX_0F38C8 */
4376 {
4377 { "sha1nexte", { XM, EXxmm }, PREFIX_OPCODE },
4378 },
4379
4380 /* PREFIX_0F38C9 */
4381 {
4382 { "sha1msg1", { XM, EXxmm }, PREFIX_OPCODE },
4383 },
4384
4385 /* PREFIX_0F38CA */
4386 {
4387 { "sha1msg2", { XM, EXxmm }, PREFIX_OPCODE },
4388 },
4389
4390 /* PREFIX_0F38CB */
4391 {
4392 { "sha256rnds2", { XM, EXxmm, XMM0 }, PREFIX_OPCODE },
4393 },
4394
4395 /* PREFIX_0F38CC */
4396 {
4397 { "sha256msg1", { XM, EXxmm }, PREFIX_OPCODE },
4398 },
4399
4400 /* PREFIX_0F38CD */
4401 {
4402 { "sha256msg2", { XM, EXxmm }, PREFIX_OPCODE },
4403 },
4404
4405 /* PREFIX_0F38CF */
4406 {
4407 { Bad_Opcode },
4408 { Bad_Opcode },
4409 { "gf2p8mulb", { XM, EXxmm }, PREFIX_OPCODE },
4410 },
4411
4412 /* PREFIX_0F38DB */
4413 {
4414 { Bad_Opcode },
4415 { Bad_Opcode },
4416 { "aesimc", { XM, EXx }, PREFIX_OPCODE },
4417 },
4418
4419 /* PREFIX_0F38DC */
4420 {
4421 { Bad_Opcode },
4422 { Bad_Opcode },
4423 { "aesenc", { XM, EXx }, PREFIX_OPCODE },
4424 },
4425
4426 /* PREFIX_0F38DD */
4427 {
4428 { Bad_Opcode },
4429 { Bad_Opcode },
4430 { "aesenclast", { XM, EXx }, PREFIX_OPCODE },
4431 },
4432
4433 /* PREFIX_0F38DE */
4434 {
4435 { Bad_Opcode },
4436 { Bad_Opcode },
4437 { "aesdec", { XM, EXx }, PREFIX_OPCODE },
4438 },
4439
4440 /* PREFIX_0F38DF */
4441 {
4442 { Bad_Opcode },
4443 { Bad_Opcode },
4444 { "aesdeclast", { XM, EXx }, PREFIX_OPCODE },
4445 },
4446
4447 /* PREFIX_0F38F0 */
4448 {
4449 { "movbeS", { Gv, { MOVBE_Fixup, v_mode } }, PREFIX_OPCODE },
4450 { Bad_Opcode },
4451 { "movbeS", { Gv, { MOVBE_Fixup, v_mode } }, PREFIX_OPCODE },
4452 { "crc32", { Gdq, { CRC32_Fixup, b_mode } }, PREFIX_OPCODE },
4453 },
4454
4455 /* PREFIX_0F38F1 */
4456 {
4457 { "movbeS", { { MOVBE_Fixup, v_mode }, Gv }, PREFIX_OPCODE },
4458 { Bad_Opcode },
4459 { "movbeS", { { MOVBE_Fixup, v_mode }, Gv }, PREFIX_OPCODE },
4460 { "crc32", { Gdq, { CRC32_Fixup, v_mode } }, PREFIX_OPCODE },
4461 },
4462
4463 /* PREFIX_0F38F5 */
4464 {
4465 { Bad_Opcode },
4466 { Bad_Opcode },
4467 { MOD_TABLE (MOD_0F38F5_PREFIX_2) },
4468 },
4469
4470 /* PREFIX_0F38F6 */
4471 {
4472 { MOD_TABLE (MOD_0F38F6_PREFIX_0) },
4473 { "adoxS", { Gdq, Edq}, PREFIX_OPCODE },
4474 { "adcxS", { Gdq, Edq}, PREFIX_OPCODE },
4475 { Bad_Opcode },
4476 },
4477
4478 /* PREFIX_0F38F8 */
4479 {
4480 { Bad_Opcode },
4481 { MOD_TABLE (MOD_0F38F8_PREFIX_1) },
4482 { MOD_TABLE (MOD_0F38F8_PREFIX_2) },
4483 { MOD_TABLE (MOD_0F38F8_PREFIX_3) },
4484 },
4485
4486 /* PREFIX_0F38F9 */
4487 {
4488 { MOD_TABLE (MOD_0F38F9_PREFIX_0) },
4489 },
4490
4491 /* PREFIX_0F3A08 */
4492 {
4493 { Bad_Opcode },
4494 { Bad_Opcode },
4495 { "roundps", { XM, EXx, Ib }, PREFIX_OPCODE },
4496 },
4497
4498 /* PREFIX_0F3A09 */
4499 {
4500 { Bad_Opcode },
4501 { Bad_Opcode },
4502 { "roundpd", { XM, EXx, Ib }, PREFIX_OPCODE },
4503 },
4504
4505 /* PREFIX_0F3A0A */
4506 {
4507 { Bad_Opcode },
4508 { Bad_Opcode },
4509 { "roundss", { XM, EXd, Ib }, PREFIX_OPCODE },
4510 },
4511
4512 /* PREFIX_0F3A0B */
4513 {
4514 { Bad_Opcode },
4515 { Bad_Opcode },
4516 { "roundsd", { XM, EXq, Ib }, PREFIX_OPCODE },
4517 },
4518
4519 /* PREFIX_0F3A0C */
4520 {
4521 { Bad_Opcode },
4522 { Bad_Opcode },
4523 { "blendps", { XM, EXx, Ib }, PREFIX_OPCODE },
4524 },
4525
4526 /* PREFIX_0F3A0D */
4527 {
4528 { Bad_Opcode },
4529 { Bad_Opcode },
4530 { "blendpd", { XM, EXx, Ib }, PREFIX_OPCODE },
4531 },
4532
4533 /* PREFIX_0F3A0E */
4534 {
4535 { Bad_Opcode },
4536 { Bad_Opcode },
4537 { "pblendw", { XM, EXx, Ib }, PREFIX_OPCODE },
4538 },
4539
4540 /* PREFIX_0F3A14 */
4541 {
4542 { Bad_Opcode },
4543 { Bad_Opcode },
4544 { "pextrb", { Edqb, XM, Ib }, PREFIX_OPCODE },
4545 },
4546
4547 /* PREFIX_0F3A15 */
4548 {
4549 { Bad_Opcode },
4550 { Bad_Opcode },
4551 { "pextrw", { Edqw, XM, Ib }, PREFIX_OPCODE },
4552 },
4553
4554 /* PREFIX_0F3A16 */
4555 {
4556 { Bad_Opcode },
4557 { Bad_Opcode },
4558 { "pextrK", { Edq, XM, Ib }, PREFIX_OPCODE },
4559 },
4560
4561 /* PREFIX_0F3A17 */
4562 {
4563 { Bad_Opcode },
4564 { Bad_Opcode },
4565 { "extractps", { Edqd, XM, Ib }, PREFIX_OPCODE },
4566 },
4567
4568 /* PREFIX_0F3A20 */
4569 {
4570 { Bad_Opcode },
4571 { Bad_Opcode },
4572 { "pinsrb", { XM, Edqb, Ib }, PREFIX_OPCODE },
4573 },
4574
4575 /* PREFIX_0F3A21 */
4576 {
4577 { Bad_Opcode },
4578 { Bad_Opcode },
4579 { "insertps", { XM, EXd, Ib }, PREFIX_OPCODE },
4580 },
4581
4582 /* PREFIX_0F3A22 */
4583 {
4584 { Bad_Opcode },
4585 { Bad_Opcode },
4586 { "pinsrK", { XM, Edq, Ib }, PREFIX_OPCODE },
4587 },
4588
4589 /* PREFIX_0F3A40 */
4590 {
4591 { Bad_Opcode },
4592 { Bad_Opcode },
4593 { "dpps", { XM, EXx, Ib }, PREFIX_OPCODE },
4594 },
4595
4596 /* PREFIX_0F3A41 */
4597 {
4598 { Bad_Opcode },
4599 { Bad_Opcode },
4600 { "dppd", { XM, EXx, Ib }, PREFIX_OPCODE },
4601 },
4602
4603 /* PREFIX_0F3A42 */
4604 {
4605 { Bad_Opcode },
4606 { Bad_Opcode },
4607 { "mpsadbw", { XM, EXx, Ib }, PREFIX_OPCODE },
4608 },
4609
4610 /* PREFIX_0F3A44 */
4611 {
4612 { Bad_Opcode },
4613 { Bad_Opcode },
4614 { "pclmulqdq", { XM, EXx, PCLMUL }, PREFIX_OPCODE },
4615 },
4616
4617 /* PREFIX_0F3A60 */
4618 {
4619 { Bad_Opcode },
4620 { Bad_Opcode },
4621 { "pcmpestrm", { XM, { PCMPESTR_Fixup, x_mode }, Ib }, PREFIX_OPCODE },
4622 },
4623
4624 /* PREFIX_0F3A61 */
4625 {
4626 { Bad_Opcode },
4627 { Bad_Opcode },
4628 { "pcmpestri", { XM, { PCMPESTR_Fixup, x_mode }, Ib }, PREFIX_OPCODE },
4629 },
4630
4631 /* PREFIX_0F3A62 */
4632 {
4633 { Bad_Opcode },
4634 { Bad_Opcode },
4635 { "pcmpistrm", { XM, EXx, Ib }, PREFIX_OPCODE },
4636 },
4637
4638 /* PREFIX_0F3A63 */
4639 {
4640 { Bad_Opcode },
4641 { Bad_Opcode },
4642 { "pcmpistri", { XM, EXx, Ib }, PREFIX_OPCODE },
4643 },
4644
4645 /* PREFIX_0F3ACC */
4646 {
4647 { "sha1rnds4", { XM, EXxmm, Ib }, PREFIX_OPCODE },
4648 },
4649
4650 /* PREFIX_0F3ACE */
4651 {
4652 { Bad_Opcode },
4653 { Bad_Opcode },
4654 { "gf2p8affineqb", { XM, EXxmm, Ib }, PREFIX_OPCODE },
4655 },
4656
4657 /* PREFIX_0F3ACF */
4658 {
4659 { Bad_Opcode },
4660 { Bad_Opcode },
4661 { "gf2p8affineinvqb", { XM, EXxmm, Ib }, PREFIX_OPCODE },
4662 },
4663
4664 /* PREFIX_0F3ADF */
4665 {
4666 { Bad_Opcode },
4667 { Bad_Opcode },
4668 { "aeskeygenassist", { XM, EXx, Ib }, PREFIX_OPCODE },
4669 },
4670
4671 /* PREFIX_VEX_0F10 */
4672 {
4673 { "vmovups", { XM, EXx }, 0 },
4674 { "vmovss", { XMVexScalar, VexScalar, EXdScalar }, 0 },
4675 { "vmovupd", { XM, EXx }, 0 },
4676 { "vmovsd", { XMVexScalar, VexScalar, EXqScalar }, 0 },
4677 },
4678
4679 /* PREFIX_VEX_0F11 */
4680 {
4681 { "vmovups", { EXxS, XM }, 0 },
4682 { "vmovss", { EXdVexScalarS, VexScalar, XMScalar }, 0 },
4683 { "vmovupd", { EXxS, XM }, 0 },
4684 { "vmovsd", { EXqVexScalarS, VexScalar, XMScalar }, 0 },
4685 },
4686
4687 /* PREFIX_VEX_0F12 */
4688 {
4689 { MOD_TABLE (MOD_VEX_0F12_PREFIX_0) },
4690 { "vmovsldup", { XM, EXx }, 0 },
4691 { VEX_LEN_TABLE (VEX_LEN_0F12_P_2) },
4692 { "vmovddup", { XM, EXymmq }, 0 },
4693 },
4694
4695 /* PREFIX_VEX_0F16 */
4696 {
4697 { MOD_TABLE (MOD_VEX_0F16_PREFIX_0) },
4698 { "vmovshdup", { XM, EXx }, 0 },
4699 { VEX_LEN_TABLE (VEX_LEN_0F16_P_2) },
4700 },
4701
4702 /* PREFIX_VEX_0F2A */
4703 {
4704 { Bad_Opcode },
4705 { "vcvtsi2ss%LQ", { XMScalar, VexScalar, Edq }, 0 },
4706 { Bad_Opcode },
4707 { "vcvtsi2sd%LQ", { XMScalar, VexScalar, Edq }, 0 },
4708 },
4709
4710 /* PREFIX_VEX_0F2C */
4711 {
4712 { Bad_Opcode },
4713 { "vcvttss2si", { Gdq, EXdScalar }, 0 },
4714 { Bad_Opcode },
4715 { "vcvttsd2si", { Gdq, EXqScalar }, 0 },
4716 },
4717
4718 /* PREFIX_VEX_0F2D */
4719 {
4720 { Bad_Opcode },
4721 { "vcvtss2si", { Gdq, EXdScalar }, 0 },
4722 { Bad_Opcode },
4723 { "vcvtsd2si", { Gdq, EXqScalar }, 0 },
4724 },
4725
4726 /* PREFIX_VEX_0F2E */
4727 {
4728 { "vucomiss", { XMScalar, EXdScalar }, 0 },
4729 { Bad_Opcode },
4730 { "vucomisd", { XMScalar, EXqScalar }, 0 },
4731 },
4732
4733 /* PREFIX_VEX_0F2F */
4734 {
4735 { "vcomiss", { XMScalar, EXdScalar }, 0 },
4736 { Bad_Opcode },
4737 { "vcomisd", { XMScalar, EXqScalar }, 0 },
4738 },
4739
4740 /* PREFIX_VEX_0F41 */
4741 {
4742 { VEX_LEN_TABLE (VEX_LEN_0F41_P_0) },
4743 { Bad_Opcode },
4744 { VEX_LEN_TABLE (VEX_LEN_0F41_P_2) },
4745 },
4746
4747 /* PREFIX_VEX_0F42 */
4748 {
4749 { VEX_LEN_TABLE (VEX_LEN_0F42_P_0) },
4750 { Bad_Opcode },
4751 { VEX_LEN_TABLE (VEX_LEN_0F42_P_2) },
4752 },
4753
4754 /* PREFIX_VEX_0F44 */
4755 {
4756 { VEX_LEN_TABLE (VEX_LEN_0F44_P_0) },
4757 { Bad_Opcode },
4758 { VEX_LEN_TABLE (VEX_LEN_0F44_P_2) },
4759 },
4760
4761 /* PREFIX_VEX_0F45 */
4762 {
4763 { VEX_LEN_TABLE (VEX_LEN_0F45_P_0) },
4764 { Bad_Opcode },
4765 { VEX_LEN_TABLE (VEX_LEN_0F45_P_2) },
4766 },
4767
4768 /* PREFIX_VEX_0F46 */
4769 {
4770 { VEX_LEN_TABLE (VEX_LEN_0F46_P_0) },
4771 { Bad_Opcode },
4772 { VEX_LEN_TABLE (VEX_LEN_0F46_P_2) },
4773 },
4774
4775 /* PREFIX_VEX_0F47 */
4776 {
4777 { VEX_LEN_TABLE (VEX_LEN_0F47_P_0) },
4778 { Bad_Opcode },
4779 { VEX_LEN_TABLE (VEX_LEN_0F47_P_2) },
4780 },
4781
4782 /* PREFIX_VEX_0F4A */
4783 {
4784 { VEX_LEN_TABLE (VEX_LEN_0F4A_P_0) },
4785 { Bad_Opcode },
4786 { VEX_LEN_TABLE (VEX_LEN_0F4A_P_2) },
4787 },
4788
4789 /* PREFIX_VEX_0F4B */
4790 {
4791 { VEX_LEN_TABLE (VEX_LEN_0F4B_P_0) },
4792 { Bad_Opcode },
4793 { VEX_LEN_TABLE (VEX_LEN_0F4B_P_2) },
4794 },
4795
4796 /* PREFIX_VEX_0F51 */
4797 {
4798 { "vsqrtps", { XM, EXx }, 0 },
4799 { "vsqrtss", { XMScalar, VexScalar, EXdScalar }, 0 },
4800 { "vsqrtpd", { XM, EXx }, 0 },
4801 { "vsqrtsd", { XMScalar, VexScalar, EXqScalar }, 0 },
4802 },
4803
4804 /* PREFIX_VEX_0F52 */
4805 {
4806 { "vrsqrtps", { XM, EXx }, 0 },
4807 { "vrsqrtss", { XMScalar, VexScalar, EXdScalar }, 0 },
4808 },
4809
4810 /* PREFIX_VEX_0F53 */
4811 {
4812 { "vrcpps", { XM, EXx }, 0 },
4813 { "vrcpss", { XMScalar, VexScalar, EXdScalar }, 0 },
4814 },
4815
4816 /* PREFIX_VEX_0F58 */
4817 {
4818 { "vaddps", { XM, Vex, EXx }, 0 },
4819 { "vaddss", { XMScalar, VexScalar, EXdScalar }, 0 },
4820 { "vaddpd", { XM, Vex, EXx }, 0 },
4821 { "vaddsd", { XMScalar, VexScalar, EXqScalar }, 0 },
4822 },
4823
4824 /* PREFIX_VEX_0F59 */
4825 {
4826 { "vmulps", { XM, Vex, EXx }, 0 },
4827 { "vmulss", { XMScalar, VexScalar, EXdScalar }, 0 },
4828 { "vmulpd", { XM, Vex, EXx }, 0 },
4829 { "vmulsd", { XMScalar, VexScalar, EXqScalar }, 0 },
4830 },
4831
4832 /* PREFIX_VEX_0F5A */
4833 {
4834 { "vcvtps2pd", { XM, EXxmmq }, 0 },
4835 { "vcvtss2sd", { XMScalar, VexScalar, EXdScalar }, 0 },
4836 { "vcvtpd2ps%XY",{ XMM, EXx }, 0 },
4837 { "vcvtsd2ss", { XMScalar, VexScalar, EXqScalar }, 0 },
4838 },
4839
4840 /* PREFIX_VEX_0F5B */
4841 {
4842 { "vcvtdq2ps", { XM, EXx }, 0 },
4843 { "vcvttps2dq", { XM, EXx }, 0 },
4844 { "vcvtps2dq", { XM, EXx }, 0 },
4845 },
4846
4847 /* PREFIX_VEX_0F5C */
4848 {
4849 { "vsubps", { XM, Vex, EXx }, 0 },
4850 { "vsubss", { XMScalar, VexScalar, EXdScalar }, 0 },
4851 { "vsubpd", { XM, Vex, EXx }, 0 },
4852 { "vsubsd", { XMScalar, VexScalar, EXqScalar }, 0 },
4853 },
4854
4855 /* PREFIX_VEX_0F5D */
4856 {
4857 { "vminps", { XM, Vex, EXx }, 0 },
4858 { "vminss", { XMScalar, VexScalar, EXdScalar }, 0 },
4859 { "vminpd", { XM, Vex, EXx }, 0 },
4860 { "vminsd", { XMScalar, VexScalar, EXqScalar }, 0 },
4861 },
4862
4863 /* PREFIX_VEX_0F5E */
4864 {
4865 { "vdivps", { XM, Vex, EXx }, 0 },
4866 { "vdivss", { XMScalar, VexScalar, EXdScalar }, 0 },
4867 { "vdivpd", { XM, Vex, EXx }, 0 },
4868 { "vdivsd", { XMScalar, VexScalar, EXqScalar }, 0 },
4869 },
4870
4871 /* PREFIX_VEX_0F5F */
4872 {
4873 { "vmaxps", { XM, Vex, EXx }, 0 },
4874 { "vmaxss", { XMScalar, VexScalar, EXdScalar }, 0 },
4875 { "vmaxpd", { XM, Vex, EXx }, 0 },
4876 { "vmaxsd", { XMScalar, VexScalar, EXqScalar }, 0 },
4877 },
4878
4879 /* PREFIX_VEX_0F60 */
4880 {
4881 { Bad_Opcode },
4882 { Bad_Opcode },
4883 { "vpunpcklbw", { XM, Vex, EXx }, 0 },
4884 },
4885
4886 /* PREFIX_VEX_0F61 */
4887 {
4888 { Bad_Opcode },
4889 { Bad_Opcode },
4890 { "vpunpcklwd", { XM, Vex, EXx }, 0 },
4891 },
4892
4893 /* PREFIX_VEX_0F62 */
4894 {
4895 { Bad_Opcode },
4896 { Bad_Opcode },
4897 { "vpunpckldq", { XM, Vex, EXx }, 0 },
4898 },
4899
4900 /* PREFIX_VEX_0F63 */
4901 {
4902 { Bad_Opcode },
4903 { Bad_Opcode },
4904 { "vpacksswb", { XM, Vex, EXx }, 0 },
4905 },
4906
4907 /* PREFIX_VEX_0F64 */
4908 {
4909 { Bad_Opcode },
4910 { Bad_Opcode },
4911 { "vpcmpgtb", { XM, Vex, EXx }, 0 },
4912 },
4913
4914 /* PREFIX_VEX_0F65 */
4915 {
4916 { Bad_Opcode },
4917 { Bad_Opcode },
4918 { "vpcmpgtw", { XM, Vex, EXx }, 0 },
4919 },
4920
4921 /* PREFIX_VEX_0F66 */
4922 {
4923 { Bad_Opcode },
4924 { Bad_Opcode },
4925 { "vpcmpgtd", { XM, Vex, EXx }, 0 },
4926 },
4927
4928 /* PREFIX_VEX_0F67 */
4929 {
4930 { Bad_Opcode },
4931 { Bad_Opcode },
4932 { "vpackuswb", { XM, Vex, EXx }, 0 },
4933 },
4934
4935 /* PREFIX_VEX_0F68 */
4936 {
4937 { Bad_Opcode },
4938 { Bad_Opcode },
4939 { "vpunpckhbw", { XM, Vex, EXx }, 0 },
4940 },
4941
4942 /* PREFIX_VEX_0F69 */
4943 {
4944 { Bad_Opcode },
4945 { Bad_Opcode },
4946 { "vpunpckhwd", { XM, Vex, EXx }, 0 },
4947 },
4948
4949 /* PREFIX_VEX_0F6A */
4950 {
4951 { Bad_Opcode },
4952 { Bad_Opcode },
4953 { "vpunpckhdq", { XM, Vex, EXx }, 0 },
4954 },
4955
4956 /* PREFIX_VEX_0F6B */
4957 {
4958 { Bad_Opcode },
4959 { Bad_Opcode },
4960 { "vpackssdw", { XM, Vex, EXx }, 0 },
4961 },
4962
4963 /* PREFIX_VEX_0F6C */
4964 {
4965 { Bad_Opcode },
4966 { Bad_Opcode },
4967 { "vpunpcklqdq", { XM, Vex, EXx }, 0 },
4968 },
4969
4970 /* PREFIX_VEX_0F6D */
4971 {
4972 { Bad_Opcode },
4973 { Bad_Opcode },
4974 { "vpunpckhqdq", { XM, Vex, EXx }, 0 },
4975 },
4976
4977 /* PREFIX_VEX_0F6E */
4978 {
4979 { Bad_Opcode },
4980 { Bad_Opcode },
4981 { VEX_LEN_TABLE (VEX_LEN_0F6E_P_2) },
4982 },
4983
4984 /* PREFIX_VEX_0F6F */
4985 {
4986 { Bad_Opcode },
4987 { "vmovdqu", { XM, EXx }, 0 },
4988 { "vmovdqa", { XM, EXx }, 0 },
4989 },
4990
4991 /* PREFIX_VEX_0F70 */
4992 {
4993 { Bad_Opcode },
4994 { "vpshufhw", { XM, EXx, Ib }, 0 },
4995 { "vpshufd", { XM, EXx, Ib }, 0 },
4996 { "vpshuflw", { XM, EXx, Ib }, 0 },
4997 },
4998
4999 /* PREFIX_VEX_0F71_REG_2 */
5000 {
5001 { Bad_Opcode },
5002 { Bad_Opcode },
5003 { "vpsrlw", { Vex, XS, Ib }, 0 },
5004 },
5005
5006 /* PREFIX_VEX_0F71_REG_4 */
5007 {
5008 { Bad_Opcode },
5009 { Bad_Opcode },
5010 { "vpsraw", { Vex, XS, Ib }, 0 },
5011 },
5012
5013 /* PREFIX_VEX_0F71_REG_6 */
5014 {
5015 { Bad_Opcode },
5016 { Bad_Opcode },
5017 { "vpsllw", { Vex, XS, Ib }, 0 },
5018 },
5019
5020 /* PREFIX_VEX_0F72_REG_2 */
5021 {
5022 { Bad_Opcode },
5023 { Bad_Opcode },
5024 { "vpsrld", { Vex, XS, Ib }, 0 },
5025 },
5026
5027 /* PREFIX_VEX_0F72_REG_4 */
5028 {
5029 { Bad_Opcode },
5030 { Bad_Opcode },
5031 { "vpsrad", { Vex, XS, Ib }, 0 },
5032 },
5033
5034 /* PREFIX_VEX_0F72_REG_6 */
5035 {
5036 { Bad_Opcode },
5037 { Bad_Opcode },
5038 { "vpslld", { Vex, XS, Ib }, 0 },
5039 },
5040
5041 /* PREFIX_VEX_0F73_REG_2 */
5042 {
5043 { Bad_Opcode },
5044 { Bad_Opcode },
5045 { "vpsrlq", { Vex, XS, Ib }, 0 },
5046 },
5047
5048 /* PREFIX_VEX_0F73_REG_3 */
5049 {
5050 { Bad_Opcode },
5051 { Bad_Opcode },
5052 { "vpsrldq", { Vex, XS, Ib }, 0 },
5053 },
5054
5055 /* PREFIX_VEX_0F73_REG_6 */
5056 {
5057 { Bad_Opcode },
5058 { Bad_Opcode },
5059 { "vpsllq", { Vex, XS, Ib }, 0 },
5060 },
5061
5062 /* PREFIX_VEX_0F73_REG_7 */
5063 {
5064 { Bad_Opcode },
5065 { Bad_Opcode },
5066 { "vpslldq", { Vex, XS, Ib }, 0 },
5067 },
5068
5069 /* PREFIX_VEX_0F74 */
5070 {
5071 { Bad_Opcode },
5072 { Bad_Opcode },
5073 { "vpcmpeqb", { XM, Vex, EXx }, 0 },
5074 },
5075
5076 /* PREFIX_VEX_0F75 */
5077 {
5078 { Bad_Opcode },
5079 { Bad_Opcode },
5080 { "vpcmpeqw", { XM, Vex, EXx }, 0 },
5081 },
5082
5083 /* PREFIX_VEX_0F76 */
5084 {
5085 { Bad_Opcode },
5086 { Bad_Opcode },
5087 { "vpcmpeqd", { XM, Vex, EXx }, 0 },
5088 },
5089
5090 /* PREFIX_VEX_0F77 */
5091 {
5092 { VEX_LEN_TABLE (VEX_LEN_0F77_P_0) },
5093 },
5094
5095 /* PREFIX_VEX_0F7C */
5096 {
5097 { Bad_Opcode },
5098 { Bad_Opcode },
5099 { "vhaddpd", { XM, Vex, EXx }, 0 },
5100 { "vhaddps", { XM, Vex, EXx }, 0 },
5101 },
5102
5103 /* PREFIX_VEX_0F7D */
5104 {
5105 { Bad_Opcode },
5106 { Bad_Opcode },
5107 { "vhsubpd", { XM, Vex, EXx }, 0 },
5108 { "vhsubps", { XM, Vex, EXx }, 0 },
5109 },
5110
5111 /* PREFIX_VEX_0F7E */
5112 {
5113 { Bad_Opcode },
5114 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_1) },
5115 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_2) },
5116 },
5117
5118 /* PREFIX_VEX_0F7F */
5119 {
5120 { Bad_Opcode },
5121 { "vmovdqu", { EXxS, XM }, 0 },
5122 { "vmovdqa", { EXxS, XM }, 0 },
5123 },
5124
5125 /* PREFIX_VEX_0F90 */
5126 {
5127 { VEX_LEN_TABLE (VEX_LEN_0F90_P_0) },
5128 { Bad_Opcode },
5129 { VEX_LEN_TABLE (VEX_LEN_0F90_P_2) },
5130 },
5131
5132 /* PREFIX_VEX_0F91 */
5133 {
5134 { VEX_LEN_TABLE (VEX_LEN_0F91_P_0) },
5135 { Bad_Opcode },
5136 { VEX_LEN_TABLE (VEX_LEN_0F91_P_2) },
5137 },
5138
5139 /* PREFIX_VEX_0F92 */
5140 {
5141 { VEX_LEN_TABLE (VEX_LEN_0F92_P_0) },
5142 { Bad_Opcode },
5143 { VEX_LEN_TABLE (VEX_LEN_0F92_P_2) },
5144 { VEX_LEN_TABLE (VEX_LEN_0F92_P_3) },
5145 },
5146
5147 /* PREFIX_VEX_0F93 */
5148 {
5149 { VEX_LEN_TABLE (VEX_LEN_0F93_P_0) },
5150 { Bad_Opcode },
5151 { VEX_LEN_TABLE (VEX_LEN_0F93_P_2) },
5152 { VEX_LEN_TABLE (VEX_LEN_0F93_P_3) },
5153 },
5154
5155 /* PREFIX_VEX_0F98 */
5156 {
5157 { VEX_LEN_TABLE (VEX_LEN_0F98_P_0) },
5158 { Bad_Opcode },
5159 { VEX_LEN_TABLE (VEX_LEN_0F98_P_2) },
5160 },
5161
5162 /* PREFIX_VEX_0F99 */
5163 {
5164 { VEX_LEN_TABLE (VEX_LEN_0F99_P_0) },
5165 { Bad_Opcode },
5166 { VEX_LEN_TABLE (VEX_LEN_0F99_P_2) },
5167 },
5168
5169 /* PREFIX_VEX_0FC2 */
5170 {
5171 { "vcmpps", { XM, Vex, EXx, VCMP }, 0 },
5172 { "vcmpss", { XMScalar, VexScalar, EXdScalar, VCMP }, 0 },
5173 { "vcmppd", { XM, Vex, EXx, VCMP }, 0 },
5174 { "vcmpsd", { XMScalar, VexScalar, EXqScalar, VCMP }, 0 },
5175 },
5176
5177 /* PREFIX_VEX_0FC4 */
5178 {
5179 { Bad_Opcode },
5180 { Bad_Opcode },
5181 { VEX_LEN_TABLE (VEX_LEN_0FC4_P_2) },
5182 },
5183
5184 /* PREFIX_VEX_0FC5 */
5185 {
5186 { Bad_Opcode },
5187 { Bad_Opcode },
5188 { VEX_LEN_TABLE (VEX_LEN_0FC5_P_2) },
5189 },
5190
5191 /* PREFIX_VEX_0FD0 */
5192 {
5193 { Bad_Opcode },
5194 { Bad_Opcode },
5195 { "vaddsubpd", { XM, Vex, EXx }, 0 },
5196 { "vaddsubps", { XM, Vex, EXx }, 0 },
5197 },
5198
5199 /* PREFIX_VEX_0FD1 */
5200 {
5201 { Bad_Opcode },
5202 { Bad_Opcode },
5203 { "vpsrlw", { XM, Vex, EXxmm }, 0 },
5204 },
5205
5206 /* PREFIX_VEX_0FD2 */
5207 {
5208 { Bad_Opcode },
5209 { Bad_Opcode },
5210 { "vpsrld", { XM, Vex, EXxmm }, 0 },
5211 },
5212
5213 /* PREFIX_VEX_0FD3 */
5214 {
5215 { Bad_Opcode },
5216 { Bad_Opcode },
5217 { "vpsrlq", { XM, Vex, EXxmm }, 0 },
5218 },
5219
5220 /* PREFIX_VEX_0FD4 */
5221 {
5222 { Bad_Opcode },
5223 { Bad_Opcode },
5224 { "vpaddq", { XM, Vex, EXx }, 0 },
5225 },
5226
5227 /* PREFIX_VEX_0FD5 */
5228 {
5229 { Bad_Opcode },
5230 { Bad_Opcode },
5231 { "vpmullw", { XM, Vex, EXx }, 0 },
5232 },
5233
5234 /* PREFIX_VEX_0FD6 */
5235 {
5236 { Bad_Opcode },
5237 { Bad_Opcode },
5238 { VEX_LEN_TABLE (VEX_LEN_0FD6_P_2) },
5239 },
5240
5241 /* PREFIX_VEX_0FD7 */
5242 {
5243 { Bad_Opcode },
5244 { Bad_Opcode },
5245 { MOD_TABLE (MOD_VEX_0FD7_PREFIX_2) },
5246 },
5247
5248 /* PREFIX_VEX_0FD8 */
5249 {
5250 { Bad_Opcode },
5251 { Bad_Opcode },
5252 { "vpsubusb", { XM, Vex, EXx }, 0 },
5253 },
5254
5255 /* PREFIX_VEX_0FD9 */
5256 {
5257 { Bad_Opcode },
5258 { Bad_Opcode },
5259 { "vpsubusw", { XM, Vex, EXx }, 0 },
5260 },
5261
5262 /* PREFIX_VEX_0FDA */
5263 {
5264 { Bad_Opcode },
5265 { Bad_Opcode },
5266 { "vpminub", { XM, Vex, EXx }, 0 },
5267 },
5268
5269 /* PREFIX_VEX_0FDB */
5270 {
5271 { Bad_Opcode },
5272 { Bad_Opcode },
5273 { "vpand", { XM, Vex, EXx }, 0 },
5274 },
5275
5276 /* PREFIX_VEX_0FDC */
5277 {
5278 { Bad_Opcode },
5279 { Bad_Opcode },
5280 { "vpaddusb", { XM, Vex, EXx }, 0 },
5281 },
5282
5283 /* PREFIX_VEX_0FDD */
5284 {
5285 { Bad_Opcode },
5286 { Bad_Opcode },
5287 { "vpaddusw", { XM, Vex, EXx }, 0 },
5288 },
5289
5290 /* PREFIX_VEX_0FDE */
5291 {
5292 { Bad_Opcode },
5293 { Bad_Opcode },
5294 { "vpmaxub", { XM, Vex, EXx }, 0 },
5295 },
5296
5297 /* PREFIX_VEX_0FDF */
5298 {
5299 { Bad_Opcode },
5300 { Bad_Opcode },
5301 { "vpandn", { XM, Vex, EXx }, 0 },
5302 },
5303
5304 /* PREFIX_VEX_0FE0 */
5305 {
5306 { Bad_Opcode },
5307 { Bad_Opcode },
5308 { "vpavgb", { XM, Vex, EXx }, 0 },
5309 },
5310
5311 /* PREFIX_VEX_0FE1 */
5312 {
5313 { Bad_Opcode },
5314 { Bad_Opcode },
5315 { "vpsraw", { XM, Vex, EXxmm }, 0 },
5316 },
5317
5318 /* PREFIX_VEX_0FE2 */
5319 {
5320 { Bad_Opcode },
5321 { Bad_Opcode },
5322 { "vpsrad", { XM, Vex, EXxmm }, 0 },
5323 },
5324
5325 /* PREFIX_VEX_0FE3 */
5326 {
5327 { Bad_Opcode },
5328 { Bad_Opcode },
5329 { "vpavgw", { XM, Vex, EXx }, 0 },
5330 },
5331
5332 /* PREFIX_VEX_0FE4 */
5333 {
5334 { Bad_Opcode },
5335 { Bad_Opcode },
5336 { "vpmulhuw", { XM, Vex, EXx }, 0 },
5337 },
5338
5339 /* PREFIX_VEX_0FE5 */
5340 {
5341 { Bad_Opcode },
5342 { Bad_Opcode },
5343 { "vpmulhw", { XM, Vex, EXx }, 0 },
5344 },
5345
5346 /* PREFIX_VEX_0FE6 */
5347 {
5348 { Bad_Opcode },
5349 { "vcvtdq2pd", { XM, EXxmmq }, 0 },
5350 { "vcvttpd2dq%XY", { XMM, EXx }, 0 },
5351 { "vcvtpd2dq%XY", { XMM, EXx }, 0 },
5352 },
5353
5354 /* PREFIX_VEX_0FE7 */
5355 {
5356 { Bad_Opcode },
5357 { Bad_Opcode },
5358 { MOD_TABLE (MOD_VEX_0FE7_PREFIX_2) },
5359 },
5360
5361 /* PREFIX_VEX_0FE8 */
5362 {
5363 { Bad_Opcode },
5364 { Bad_Opcode },
5365 { "vpsubsb", { XM, Vex, EXx }, 0 },
5366 },
5367
5368 /* PREFIX_VEX_0FE9 */
5369 {
5370 { Bad_Opcode },
5371 { Bad_Opcode },
5372 { "vpsubsw", { XM, Vex, EXx }, 0 },
5373 },
5374
5375 /* PREFIX_VEX_0FEA */
5376 {
5377 { Bad_Opcode },
5378 { Bad_Opcode },
5379 { "vpminsw", { XM, Vex, EXx }, 0 },
5380 },
5381
5382 /* PREFIX_VEX_0FEB */
5383 {
5384 { Bad_Opcode },
5385 { Bad_Opcode },
5386 { "vpor", { XM, Vex, EXx }, 0 },
5387 },
5388
5389 /* PREFIX_VEX_0FEC */
5390 {
5391 { Bad_Opcode },
5392 { Bad_Opcode },
5393 { "vpaddsb", { XM, Vex, EXx }, 0 },
5394 },
5395
5396 /* PREFIX_VEX_0FED */
5397 {
5398 { Bad_Opcode },
5399 { Bad_Opcode },
5400 { "vpaddsw", { XM, Vex, EXx }, 0 },
5401 },
5402
5403 /* PREFIX_VEX_0FEE */
5404 {
5405 { Bad_Opcode },
5406 { Bad_Opcode },
5407 { "vpmaxsw", { XM, Vex, EXx }, 0 },
5408 },
5409
5410 /* PREFIX_VEX_0FEF */
5411 {
5412 { Bad_Opcode },
5413 { Bad_Opcode },
5414 { "vpxor", { XM, Vex, EXx }, 0 },
5415 },
5416
5417 /* PREFIX_VEX_0FF0 */
5418 {
5419 { Bad_Opcode },
5420 { Bad_Opcode },
5421 { Bad_Opcode },
5422 { MOD_TABLE (MOD_VEX_0FF0_PREFIX_3) },
5423 },
5424
5425 /* PREFIX_VEX_0FF1 */
5426 {
5427 { Bad_Opcode },
5428 { Bad_Opcode },
5429 { "vpsllw", { XM, Vex, EXxmm }, 0 },
5430 },
5431
5432 /* PREFIX_VEX_0FF2 */
5433 {
5434 { Bad_Opcode },
5435 { Bad_Opcode },
5436 { "vpslld", { XM, Vex, EXxmm }, 0 },
5437 },
5438
5439 /* PREFIX_VEX_0FF3 */
5440 {
5441 { Bad_Opcode },
5442 { Bad_Opcode },
5443 { "vpsllq", { XM, Vex, EXxmm }, 0 },
5444 },
5445
5446 /* PREFIX_VEX_0FF4 */
5447 {
5448 { Bad_Opcode },
5449 { Bad_Opcode },
5450 { "vpmuludq", { XM, Vex, EXx }, 0 },
5451 },
5452
5453 /* PREFIX_VEX_0FF5 */
5454 {
5455 { Bad_Opcode },
5456 { Bad_Opcode },
5457 { "vpmaddwd", { XM, Vex, EXx }, 0 },
5458 },
5459
5460 /* PREFIX_VEX_0FF6 */
5461 {
5462 { Bad_Opcode },
5463 { Bad_Opcode },
5464 { "vpsadbw", { XM, Vex, EXx }, 0 },
5465 },
5466
5467 /* PREFIX_VEX_0FF7 */
5468 {
5469 { Bad_Opcode },
5470 { Bad_Opcode },
5471 { VEX_LEN_TABLE (VEX_LEN_0FF7_P_2) },
5472 },
5473
5474 /* PREFIX_VEX_0FF8 */
5475 {
5476 { Bad_Opcode },
5477 { Bad_Opcode },
5478 { "vpsubb", { XM, Vex, EXx }, 0 },
5479 },
5480
5481 /* PREFIX_VEX_0FF9 */
5482 {
5483 { Bad_Opcode },
5484 { Bad_Opcode },
5485 { "vpsubw", { XM, Vex, EXx }, 0 },
5486 },
5487
5488 /* PREFIX_VEX_0FFA */
5489 {
5490 { Bad_Opcode },
5491 { Bad_Opcode },
5492 { "vpsubd", { XM, Vex, EXx }, 0 },
5493 },
5494
5495 /* PREFIX_VEX_0FFB */
5496 {
5497 { Bad_Opcode },
5498 { Bad_Opcode },
5499 { "vpsubq", { XM, Vex, EXx }, 0 },
5500 },
5501
5502 /* PREFIX_VEX_0FFC */
5503 {
5504 { Bad_Opcode },
5505 { Bad_Opcode },
5506 { "vpaddb", { XM, Vex, EXx }, 0 },
5507 },
5508
5509 /* PREFIX_VEX_0FFD */
5510 {
5511 { Bad_Opcode },
5512 { Bad_Opcode },
5513 { "vpaddw", { XM, Vex, EXx }, 0 },
5514 },
5515
5516 /* PREFIX_VEX_0FFE */
5517 {
5518 { Bad_Opcode },
5519 { Bad_Opcode },
5520 { "vpaddd", { XM, Vex, EXx }, 0 },
5521 },
5522
5523 /* PREFIX_VEX_0F3800 */
5524 {
5525 { Bad_Opcode },
5526 { Bad_Opcode },
5527 { "vpshufb", { XM, Vex, EXx }, 0 },
5528 },
5529
5530 /* PREFIX_VEX_0F3801 */
5531 {
5532 { Bad_Opcode },
5533 { Bad_Opcode },
5534 { "vphaddw", { XM, Vex, EXx }, 0 },
5535 },
5536
5537 /* PREFIX_VEX_0F3802 */
5538 {
5539 { Bad_Opcode },
5540 { Bad_Opcode },
5541 { "vphaddd", { XM, Vex, EXx }, 0 },
5542 },
5543
5544 /* PREFIX_VEX_0F3803 */
5545 {
5546 { Bad_Opcode },
5547 { Bad_Opcode },
5548 { "vphaddsw", { XM, Vex, EXx }, 0 },
5549 },
5550
5551 /* PREFIX_VEX_0F3804 */
5552 {
5553 { Bad_Opcode },
5554 { Bad_Opcode },
5555 { "vpmaddubsw", { XM, Vex, EXx }, 0 },
5556 },
5557
5558 /* PREFIX_VEX_0F3805 */
5559 {
5560 { Bad_Opcode },
5561 { Bad_Opcode },
5562 { "vphsubw", { XM, Vex, EXx }, 0 },
5563 },
5564
5565 /* PREFIX_VEX_0F3806 */
5566 {
5567 { Bad_Opcode },
5568 { Bad_Opcode },
5569 { "vphsubd", { XM, Vex, EXx }, 0 },
5570 },
5571
5572 /* PREFIX_VEX_0F3807 */
5573 {
5574 { Bad_Opcode },
5575 { Bad_Opcode },
5576 { "vphsubsw", { XM, Vex, EXx }, 0 },
5577 },
5578
5579 /* PREFIX_VEX_0F3808 */
5580 {
5581 { Bad_Opcode },
5582 { Bad_Opcode },
5583 { "vpsignb", { XM, Vex, EXx }, 0 },
5584 },
5585
5586 /* PREFIX_VEX_0F3809 */
5587 {
5588 { Bad_Opcode },
5589 { Bad_Opcode },
5590 { "vpsignw", { XM, Vex, EXx }, 0 },
5591 },
5592
5593 /* PREFIX_VEX_0F380A */
5594 {
5595 { Bad_Opcode },
5596 { Bad_Opcode },
5597 { "vpsignd", { XM, Vex, EXx }, 0 },
5598 },
5599
5600 /* PREFIX_VEX_0F380B */
5601 {
5602 { Bad_Opcode },
5603 { Bad_Opcode },
5604 { "vpmulhrsw", { XM, Vex, EXx }, 0 },
5605 },
5606
5607 /* PREFIX_VEX_0F380C */
5608 {
5609 { Bad_Opcode },
5610 { Bad_Opcode },
5611 { VEX_W_TABLE (VEX_W_0F380C_P_2) },
5612 },
5613
5614 /* PREFIX_VEX_0F380D */
5615 {
5616 { Bad_Opcode },
5617 { Bad_Opcode },
5618 { VEX_W_TABLE (VEX_W_0F380D_P_2) },
5619 },
5620
5621 /* PREFIX_VEX_0F380E */
5622 {
5623 { Bad_Opcode },
5624 { Bad_Opcode },
5625 { VEX_W_TABLE (VEX_W_0F380E_P_2) },
5626 },
5627
5628 /* PREFIX_VEX_0F380F */
5629 {
5630 { Bad_Opcode },
5631 { Bad_Opcode },
5632 { VEX_W_TABLE (VEX_W_0F380F_P_2) },
5633 },
5634
5635 /* PREFIX_VEX_0F3813 */
5636 {
5637 { Bad_Opcode },
5638 { Bad_Opcode },
5639 { "vcvtph2ps", { XM, EXxmmq }, 0 },
5640 },
5641
5642 /* PREFIX_VEX_0F3816 */
5643 {
5644 { Bad_Opcode },
5645 { Bad_Opcode },
5646 { VEX_LEN_TABLE (VEX_LEN_0F3816_P_2) },
5647 },
5648
5649 /* PREFIX_VEX_0F3817 */
5650 {
5651 { Bad_Opcode },
5652 { Bad_Opcode },
5653 { "vptest", { XM, EXx }, 0 },
5654 },
5655
5656 /* PREFIX_VEX_0F3818 */
5657 {
5658 { Bad_Opcode },
5659 { Bad_Opcode },
5660 { VEX_W_TABLE (VEX_W_0F3818_P_2) },
5661 },
5662
5663 /* PREFIX_VEX_0F3819 */
5664 {
5665 { Bad_Opcode },
5666 { Bad_Opcode },
5667 { VEX_LEN_TABLE (VEX_LEN_0F3819_P_2) },
5668 },
5669
5670 /* PREFIX_VEX_0F381A */
5671 {
5672 { Bad_Opcode },
5673 { Bad_Opcode },
5674 { MOD_TABLE (MOD_VEX_0F381A_PREFIX_2) },
5675 },
5676
5677 /* PREFIX_VEX_0F381C */
5678 {
5679 { Bad_Opcode },
5680 { Bad_Opcode },
5681 { "vpabsb", { XM, EXx }, 0 },
5682 },
5683
5684 /* PREFIX_VEX_0F381D */
5685 {
5686 { Bad_Opcode },
5687 { Bad_Opcode },
5688 { "vpabsw", { XM, EXx }, 0 },
5689 },
5690
5691 /* PREFIX_VEX_0F381E */
5692 {
5693 { Bad_Opcode },
5694 { Bad_Opcode },
5695 { "vpabsd", { XM, EXx }, 0 },
5696 },
5697
5698 /* PREFIX_VEX_0F3820 */
5699 {
5700 { Bad_Opcode },
5701 { Bad_Opcode },
5702 { "vpmovsxbw", { XM, EXxmmq }, 0 },
5703 },
5704
5705 /* PREFIX_VEX_0F3821 */
5706 {
5707 { Bad_Opcode },
5708 { Bad_Opcode },
5709 { "vpmovsxbd", { XM, EXxmmqd }, 0 },
5710 },
5711
5712 /* PREFIX_VEX_0F3822 */
5713 {
5714 { Bad_Opcode },
5715 { Bad_Opcode },
5716 { "vpmovsxbq", { XM, EXxmmdw }, 0 },
5717 },
5718
5719 /* PREFIX_VEX_0F3823 */
5720 {
5721 { Bad_Opcode },
5722 { Bad_Opcode },
5723 { "vpmovsxwd", { XM, EXxmmq }, 0 },
5724 },
5725
5726 /* PREFIX_VEX_0F3824 */
5727 {
5728 { Bad_Opcode },
5729 { Bad_Opcode },
5730 { "vpmovsxwq", { XM, EXxmmqd }, 0 },
5731 },
5732
5733 /* PREFIX_VEX_0F3825 */
5734 {
5735 { Bad_Opcode },
5736 { Bad_Opcode },
5737 { "vpmovsxdq", { XM, EXxmmq }, 0 },
5738 },
5739
5740 /* PREFIX_VEX_0F3828 */
5741 {
5742 { Bad_Opcode },
5743 { Bad_Opcode },
5744 { "vpmuldq", { XM, Vex, EXx }, 0 },
5745 },
5746
5747 /* PREFIX_VEX_0F3829 */
5748 {
5749 { Bad_Opcode },
5750 { Bad_Opcode },
5751 { "vpcmpeqq", { XM, Vex, EXx }, 0 },
5752 },
5753
5754 /* PREFIX_VEX_0F382A */
5755 {
5756 { Bad_Opcode },
5757 { Bad_Opcode },
5758 { MOD_TABLE (MOD_VEX_0F382A_PREFIX_2) },
5759 },
5760
5761 /* PREFIX_VEX_0F382B */
5762 {
5763 { Bad_Opcode },
5764 { Bad_Opcode },
5765 { "vpackusdw", { XM, Vex, EXx }, 0 },
5766 },
5767
5768 /* PREFIX_VEX_0F382C */
5769 {
5770 { Bad_Opcode },
5771 { Bad_Opcode },
5772 { MOD_TABLE (MOD_VEX_0F382C_PREFIX_2) },
5773 },
5774
5775 /* PREFIX_VEX_0F382D */
5776 {
5777 { Bad_Opcode },
5778 { Bad_Opcode },
5779 { MOD_TABLE (MOD_VEX_0F382D_PREFIX_2) },
5780 },
5781
5782 /* PREFIX_VEX_0F382E */
5783 {
5784 { Bad_Opcode },
5785 { Bad_Opcode },
5786 { MOD_TABLE (MOD_VEX_0F382E_PREFIX_2) },
5787 },
5788
5789 /* PREFIX_VEX_0F382F */
5790 {
5791 { Bad_Opcode },
5792 { Bad_Opcode },
5793 { MOD_TABLE (MOD_VEX_0F382F_PREFIX_2) },
5794 },
5795
5796 /* PREFIX_VEX_0F3830 */
5797 {
5798 { Bad_Opcode },
5799 { Bad_Opcode },
5800 { "vpmovzxbw", { XM, EXxmmq }, 0 },
5801 },
5802
5803 /* PREFIX_VEX_0F3831 */
5804 {
5805 { Bad_Opcode },
5806 { Bad_Opcode },
5807 { "vpmovzxbd", { XM, EXxmmqd }, 0 },
5808 },
5809
5810 /* PREFIX_VEX_0F3832 */
5811 {
5812 { Bad_Opcode },
5813 { Bad_Opcode },
5814 { "vpmovzxbq", { XM, EXxmmdw }, 0 },
5815 },
5816
5817 /* PREFIX_VEX_0F3833 */
5818 {
5819 { Bad_Opcode },
5820 { Bad_Opcode },
5821 { "vpmovzxwd", { XM, EXxmmq }, 0 },
5822 },
5823
5824 /* PREFIX_VEX_0F3834 */
5825 {
5826 { Bad_Opcode },
5827 { Bad_Opcode },
5828 { "vpmovzxwq", { XM, EXxmmqd }, 0 },
5829 },
5830
5831 /* PREFIX_VEX_0F3835 */
5832 {
5833 { Bad_Opcode },
5834 { Bad_Opcode },
5835 { "vpmovzxdq", { XM, EXxmmq }, 0 },
5836 },
5837
5838 /* PREFIX_VEX_0F3836 */
5839 {
5840 { Bad_Opcode },
5841 { Bad_Opcode },
5842 { VEX_LEN_TABLE (VEX_LEN_0F3836_P_2) },
5843 },
5844
5845 /* PREFIX_VEX_0F3837 */
5846 {
5847 { Bad_Opcode },
5848 { Bad_Opcode },
5849 { "vpcmpgtq", { XM, Vex, EXx }, 0 },
5850 },
5851
5852 /* PREFIX_VEX_0F3838 */
5853 {
5854 { Bad_Opcode },
5855 { Bad_Opcode },
5856 { "vpminsb", { XM, Vex, EXx }, 0 },
5857 },
5858
5859 /* PREFIX_VEX_0F3839 */
5860 {
5861 { Bad_Opcode },
5862 { Bad_Opcode },
5863 { "vpminsd", { XM, Vex, EXx }, 0 },
5864 },
5865
5866 /* PREFIX_VEX_0F383A */
5867 {
5868 { Bad_Opcode },
5869 { Bad_Opcode },
5870 { "vpminuw", { XM, Vex, EXx }, 0 },
5871 },
5872
5873 /* PREFIX_VEX_0F383B */
5874 {
5875 { Bad_Opcode },
5876 { Bad_Opcode },
5877 { "vpminud", { XM, Vex, EXx }, 0 },
5878 },
5879
5880 /* PREFIX_VEX_0F383C */
5881 {
5882 { Bad_Opcode },
5883 { Bad_Opcode },
5884 { "vpmaxsb", { XM, Vex, EXx }, 0 },
5885 },
5886
5887 /* PREFIX_VEX_0F383D */
5888 {
5889 { Bad_Opcode },
5890 { Bad_Opcode },
5891 { "vpmaxsd", { XM, Vex, EXx }, 0 },
5892 },
5893
5894 /* PREFIX_VEX_0F383E */
5895 {
5896 { Bad_Opcode },
5897 { Bad_Opcode },
5898 { "vpmaxuw", { XM, Vex, EXx }, 0 },
5899 },
5900
5901 /* PREFIX_VEX_0F383F */
5902 {
5903 { Bad_Opcode },
5904 { Bad_Opcode },
5905 { "vpmaxud", { XM, Vex, EXx }, 0 },
5906 },
5907
5908 /* PREFIX_VEX_0F3840 */
5909 {
5910 { Bad_Opcode },
5911 { Bad_Opcode },
5912 { "vpmulld", { XM, Vex, EXx }, 0 },
5913 },
5914
5915 /* PREFIX_VEX_0F3841 */
5916 {
5917 { Bad_Opcode },
5918 { Bad_Opcode },
5919 { VEX_LEN_TABLE (VEX_LEN_0F3841_P_2) },
5920 },
5921
5922 /* PREFIX_VEX_0F3845 */
5923 {
5924 { Bad_Opcode },
5925 { Bad_Opcode },
5926 { "vpsrlv%LW", { XM, Vex, EXx }, 0 },
5927 },
5928
5929 /* PREFIX_VEX_0F3846 */
5930 {
5931 { Bad_Opcode },
5932 { Bad_Opcode },
5933 { VEX_W_TABLE (VEX_W_0F3846_P_2) },
5934 },
5935
5936 /* PREFIX_VEX_0F3847 */
5937 {
5938 { Bad_Opcode },
5939 { Bad_Opcode },
5940 { "vpsllv%LW", { XM, Vex, EXx }, 0 },
5941 },
5942
5943 /* PREFIX_VEX_0F3858 */
5944 {
5945 { Bad_Opcode },
5946 { Bad_Opcode },
5947 { VEX_W_TABLE (VEX_W_0F3858_P_2) },
5948 },
5949
5950 /* PREFIX_VEX_0F3859 */
5951 {
5952 { Bad_Opcode },
5953 { Bad_Opcode },
5954 { VEX_W_TABLE (VEX_W_0F3859_P_2) },
5955 },
5956
5957 /* PREFIX_VEX_0F385A */
5958 {
5959 { Bad_Opcode },
5960 { Bad_Opcode },
5961 { MOD_TABLE (MOD_VEX_0F385A_PREFIX_2) },
5962 },
5963
5964 /* PREFIX_VEX_0F3878 */
5965 {
5966 { Bad_Opcode },
5967 { Bad_Opcode },
5968 { VEX_W_TABLE (VEX_W_0F3878_P_2) },
5969 },
5970
5971 /* PREFIX_VEX_0F3879 */
5972 {
5973 { Bad_Opcode },
5974 { Bad_Opcode },
5975 { VEX_W_TABLE (VEX_W_0F3879_P_2) },
5976 },
5977
5978 /* PREFIX_VEX_0F388C */
5979 {
5980 { Bad_Opcode },
5981 { Bad_Opcode },
5982 { MOD_TABLE (MOD_VEX_0F388C_PREFIX_2) },
5983 },
5984
5985 /* PREFIX_VEX_0F388E */
5986 {
5987 { Bad_Opcode },
5988 { Bad_Opcode },
5989 { MOD_TABLE (MOD_VEX_0F388E_PREFIX_2) },
5990 },
5991
5992 /* PREFIX_VEX_0F3890 */
5993 {
5994 { Bad_Opcode },
5995 { Bad_Opcode },
5996 { "vpgatherd%LW", { XM, MVexVSIBDWpX, Vex }, 0 },
5997 },
5998
5999 /* PREFIX_VEX_0F3891 */
6000 {
6001 { Bad_Opcode },
6002 { Bad_Opcode },
6003 { "vpgatherq%LW", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, 0 },
6004 },
6005
6006 /* PREFIX_VEX_0F3892 */
6007 {
6008 { Bad_Opcode },
6009 { Bad_Opcode },
6010 { "vgatherdp%XW", { XM, MVexVSIBDWpX, Vex }, 0 },
6011 },
6012
6013 /* PREFIX_VEX_0F3893 */
6014 {
6015 { Bad_Opcode },
6016 { Bad_Opcode },
6017 { "vgatherqp%XW", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, 0 },
6018 },
6019
6020 /* PREFIX_VEX_0F3896 */
6021 {
6022 { Bad_Opcode },
6023 { Bad_Opcode },
6024 { "vfmaddsub132p%XW", { XM, Vex, EXx }, 0 },
6025 },
6026
6027 /* PREFIX_VEX_0F3897 */
6028 {
6029 { Bad_Opcode },
6030 { Bad_Opcode },
6031 { "vfmsubadd132p%XW", { XM, Vex, EXx }, 0 },
6032 },
6033
6034 /* PREFIX_VEX_0F3898 */
6035 {
6036 { Bad_Opcode },
6037 { Bad_Opcode },
6038 { "vfmadd132p%XW", { XM, Vex, EXx }, 0 },
6039 },
6040
6041 /* PREFIX_VEX_0F3899 */
6042 {
6043 { Bad_Opcode },
6044 { Bad_Opcode },
6045 { "vfmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6046 },
6047
6048 /* PREFIX_VEX_0F389A */
6049 {
6050 { Bad_Opcode },
6051 { Bad_Opcode },
6052 { "vfmsub132p%XW", { XM, Vex, EXx }, 0 },
6053 },
6054
6055 /* PREFIX_VEX_0F389B */
6056 {
6057 { Bad_Opcode },
6058 { Bad_Opcode },
6059 { "vfmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6060 },
6061
6062 /* PREFIX_VEX_0F389C */
6063 {
6064 { Bad_Opcode },
6065 { Bad_Opcode },
6066 { "vfnmadd132p%XW", { XM, Vex, EXx }, 0 },
6067 },
6068
6069 /* PREFIX_VEX_0F389D */
6070 {
6071 { Bad_Opcode },
6072 { Bad_Opcode },
6073 { "vfnmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6074 },
6075
6076 /* PREFIX_VEX_0F389E */
6077 {
6078 { Bad_Opcode },
6079 { Bad_Opcode },
6080 { "vfnmsub132p%XW", { XM, Vex, EXx }, 0 },
6081 },
6082
6083 /* PREFIX_VEX_0F389F */
6084 {
6085 { Bad_Opcode },
6086 { Bad_Opcode },
6087 { "vfnmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6088 },
6089
6090 /* PREFIX_VEX_0F38A6 */
6091 {
6092 { Bad_Opcode },
6093 { Bad_Opcode },
6094 { "vfmaddsub213p%XW", { XM, Vex, EXx }, 0 },
6095 { Bad_Opcode },
6096 },
6097
6098 /* PREFIX_VEX_0F38A7 */
6099 {
6100 { Bad_Opcode },
6101 { Bad_Opcode },
6102 { "vfmsubadd213p%XW", { XM, Vex, EXx }, 0 },
6103 },
6104
6105 /* PREFIX_VEX_0F38A8 */
6106 {
6107 { Bad_Opcode },
6108 { Bad_Opcode },
6109 { "vfmadd213p%XW", { XM, Vex, EXx }, 0 },
6110 },
6111
6112 /* PREFIX_VEX_0F38A9 */
6113 {
6114 { Bad_Opcode },
6115 { Bad_Opcode },
6116 { "vfmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6117 },
6118
6119 /* PREFIX_VEX_0F38AA */
6120 {
6121 { Bad_Opcode },
6122 { Bad_Opcode },
6123 { "vfmsub213p%XW", { XM, Vex, EXx }, 0 },
6124 },
6125
6126 /* PREFIX_VEX_0F38AB */
6127 {
6128 { Bad_Opcode },
6129 { Bad_Opcode },
6130 { "vfmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6131 },
6132
6133 /* PREFIX_VEX_0F38AC */
6134 {
6135 { Bad_Opcode },
6136 { Bad_Opcode },
6137 { "vfnmadd213p%XW", { XM, Vex, EXx }, 0 },
6138 },
6139
6140 /* PREFIX_VEX_0F38AD */
6141 {
6142 { Bad_Opcode },
6143 { Bad_Opcode },
6144 { "vfnmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6145 },
6146
6147 /* PREFIX_VEX_0F38AE */
6148 {
6149 { Bad_Opcode },
6150 { Bad_Opcode },
6151 { "vfnmsub213p%XW", { XM, Vex, EXx }, 0 },
6152 },
6153
6154 /* PREFIX_VEX_0F38AF */
6155 {
6156 { Bad_Opcode },
6157 { Bad_Opcode },
6158 { "vfnmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6159 },
6160
6161 /* PREFIX_VEX_0F38B6 */
6162 {
6163 { Bad_Opcode },
6164 { Bad_Opcode },
6165 { "vfmaddsub231p%XW", { XM, Vex, EXx }, 0 },
6166 },
6167
6168 /* PREFIX_VEX_0F38B7 */
6169 {
6170 { Bad_Opcode },
6171 { Bad_Opcode },
6172 { "vfmsubadd231p%XW", { XM, Vex, EXx }, 0 },
6173 },
6174
6175 /* PREFIX_VEX_0F38B8 */
6176 {
6177 { Bad_Opcode },
6178 { Bad_Opcode },
6179 { "vfmadd231p%XW", { XM, Vex, EXx }, 0 },
6180 },
6181
6182 /* PREFIX_VEX_0F38B9 */
6183 {
6184 { Bad_Opcode },
6185 { Bad_Opcode },
6186 { "vfmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6187 },
6188
6189 /* PREFIX_VEX_0F38BA */
6190 {
6191 { Bad_Opcode },
6192 { Bad_Opcode },
6193 { "vfmsub231p%XW", { XM, Vex, EXx }, 0 },
6194 },
6195
6196 /* PREFIX_VEX_0F38BB */
6197 {
6198 { Bad_Opcode },
6199 { Bad_Opcode },
6200 { "vfmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6201 },
6202
6203 /* PREFIX_VEX_0F38BC */
6204 {
6205 { Bad_Opcode },
6206 { Bad_Opcode },
6207 { "vfnmadd231p%XW", { XM, Vex, EXx }, 0 },
6208 },
6209
6210 /* PREFIX_VEX_0F38BD */
6211 {
6212 { Bad_Opcode },
6213 { Bad_Opcode },
6214 { "vfnmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6215 },
6216
6217 /* PREFIX_VEX_0F38BE */
6218 {
6219 { Bad_Opcode },
6220 { Bad_Opcode },
6221 { "vfnmsub231p%XW", { XM, Vex, EXx }, 0 },
6222 },
6223
6224 /* PREFIX_VEX_0F38BF */
6225 {
6226 { Bad_Opcode },
6227 { Bad_Opcode },
6228 { "vfnmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6229 },
6230
6231 /* PREFIX_VEX_0F38CF */
6232 {
6233 { Bad_Opcode },
6234 { Bad_Opcode },
6235 { VEX_W_TABLE (VEX_W_0F38CF_P_2) },
6236 },
6237
6238 /* PREFIX_VEX_0F38DB */
6239 {
6240 { Bad_Opcode },
6241 { Bad_Opcode },
6242 { VEX_LEN_TABLE (VEX_LEN_0F38DB_P_2) },
6243 },
6244
6245 /* PREFIX_VEX_0F38DC */
6246 {
6247 { Bad_Opcode },
6248 { Bad_Opcode },
6249 { "vaesenc", { XM, Vex, EXx }, 0 },
6250 },
6251
6252 /* PREFIX_VEX_0F38DD */
6253 {
6254 { Bad_Opcode },
6255 { Bad_Opcode },
6256 { "vaesenclast", { XM, Vex, EXx }, 0 },
6257 },
6258
6259 /* PREFIX_VEX_0F38DE */
6260 {
6261 { Bad_Opcode },
6262 { Bad_Opcode },
6263 { "vaesdec", { XM, Vex, EXx }, 0 },
6264 },
6265
6266 /* PREFIX_VEX_0F38DF */
6267 {
6268 { Bad_Opcode },
6269 { Bad_Opcode },
6270 { "vaesdeclast", { XM, Vex, EXx }, 0 },
6271 },
6272
6273 /* PREFIX_VEX_0F38F2 */
6274 {
6275 { VEX_LEN_TABLE (VEX_LEN_0F38F2_P_0) },
6276 },
6277
6278 /* PREFIX_VEX_0F38F3_REG_1 */
6279 {
6280 { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_1_P_0) },
6281 },
6282
6283 /* PREFIX_VEX_0F38F3_REG_2 */
6284 {
6285 { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_2_P_0) },
6286 },
6287
6288 /* PREFIX_VEX_0F38F3_REG_3 */
6289 {
6290 { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_3_P_0) },
6291 },
6292
6293 /* PREFIX_VEX_0F38F5 */
6294 {
6295 { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_0) },
6296 { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_1) },
6297 { Bad_Opcode },
6298 { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_3) },
6299 },
6300
6301 /* PREFIX_VEX_0F38F6 */
6302 {
6303 { Bad_Opcode },
6304 { Bad_Opcode },
6305 { Bad_Opcode },
6306 { VEX_LEN_TABLE (VEX_LEN_0F38F6_P_3) },
6307 },
6308
6309 /* PREFIX_VEX_0F38F7 */
6310 {
6311 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_0) },
6312 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_1) },
6313 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_2) },
6314 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_3) },
6315 },
6316
6317 /* PREFIX_VEX_0F3A00 */
6318 {
6319 { Bad_Opcode },
6320 { Bad_Opcode },
6321 { VEX_LEN_TABLE (VEX_LEN_0F3A00_P_2) },
6322 },
6323
6324 /* PREFIX_VEX_0F3A01 */
6325 {
6326 { Bad_Opcode },
6327 { Bad_Opcode },
6328 { VEX_LEN_TABLE (VEX_LEN_0F3A01_P_2) },
6329 },
6330
6331 /* PREFIX_VEX_0F3A02 */
6332 {
6333 { Bad_Opcode },
6334 { Bad_Opcode },
6335 { VEX_W_TABLE (VEX_W_0F3A02_P_2) },
6336 },
6337
6338 /* PREFIX_VEX_0F3A04 */
6339 {
6340 { Bad_Opcode },
6341 { Bad_Opcode },
6342 { VEX_W_TABLE (VEX_W_0F3A04_P_2) },
6343 },
6344
6345 /* PREFIX_VEX_0F3A05 */
6346 {
6347 { Bad_Opcode },
6348 { Bad_Opcode },
6349 { VEX_W_TABLE (VEX_W_0F3A05_P_2) },
6350 },
6351
6352 /* PREFIX_VEX_0F3A06 */
6353 {
6354 { Bad_Opcode },
6355 { Bad_Opcode },
6356 { VEX_LEN_TABLE (VEX_LEN_0F3A06_P_2) },
6357 },
6358
6359 /* PREFIX_VEX_0F3A08 */
6360 {
6361 { Bad_Opcode },
6362 { Bad_Opcode },
6363 { "vroundps", { XM, EXx, Ib }, 0 },
6364 },
6365
6366 /* PREFIX_VEX_0F3A09 */
6367 {
6368 { Bad_Opcode },
6369 { Bad_Opcode },
6370 { "vroundpd", { XM, EXx, Ib }, 0 },
6371 },
6372
6373 /* PREFIX_VEX_0F3A0A */
6374 {
6375 { Bad_Opcode },
6376 { Bad_Opcode },
6377 { "vroundss", { XMScalar, VexScalar, EXdScalar, Ib }, 0 },
6378 },
6379
6380 /* PREFIX_VEX_0F3A0B */
6381 {
6382 { Bad_Opcode },
6383 { Bad_Opcode },
6384 { "vroundsd", { XMScalar, VexScalar, EXqScalar, Ib }, 0 },
6385 },
6386
6387 /* PREFIX_VEX_0F3A0C */
6388 {
6389 { Bad_Opcode },
6390 { Bad_Opcode },
6391 { "vblendps", { XM, Vex, EXx, Ib }, 0 },
6392 },
6393
6394 /* PREFIX_VEX_0F3A0D */
6395 {
6396 { Bad_Opcode },
6397 { Bad_Opcode },
6398 { "vblendpd", { XM, Vex, EXx, Ib }, 0 },
6399 },
6400
6401 /* PREFIX_VEX_0F3A0E */
6402 {
6403 { Bad_Opcode },
6404 { Bad_Opcode },
6405 { "vpblendw", { XM, Vex, EXx, Ib }, 0 },
6406 },
6407
6408 /* PREFIX_VEX_0F3A0F */
6409 {
6410 { Bad_Opcode },
6411 { Bad_Opcode },
6412 { "vpalignr", { XM, Vex, EXx, Ib }, 0 },
6413 },
6414
6415 /* PREFIX_VEX_0F3A14 */
6416 {
6417 { Bad_Opcode },
6418 { Bad_Opcode },
6419 { VEX_LEN_TABLE (VEX_LEN_0F3A14_P_2) },
6420 },
6421
6422 /* PREFIX_VEX_0F3A15 */
6423 {
6424 { Bad_Opcode },
6425 { Bad_Opcode },
6426 { VEX_LEN_TABLE (VEX_LEN_0F3A15_P_2) },
6427 },
6428
6429 /* PREFIX_VEX_0F3A16 */
6430 {
6431 { Bad_Opcode },
6432 { Bad_Opcode },
6433 { VEX_LEN_TABLE (VEX_LEN_0F3A16_P_2) },
6434 },
6435
6436 /* PREFIX_VEX_0F3A17 */
6437 {
6438 { Bad_Opcode },
6439 { Bad_Opcode },
6440 { VEX_LEN_TABLE (VEX_LEN_0F3A17_P_2) },
6441 },
6442
6443 /* PREFIX_VEX_0F3A18 */
6444 {
6445 { Bad_Opcode },
6446 { Bad_Opcode },
6447 { VEX_LEN_TABLE (VEX_LEN_0F3A18_P_2) },
6448 },
6449
6450 /* PREFIX_VEX_0F3A19 */
6451 {
6452 { Bad_Opcode },
6453 { Bad_Opcode },
6454 { VEX_LEN_TABLE (VEX_LEN_0F3A19_P_2) },
6455 },
6456
6457 /* PREFIX_VEX_0F3A1D */
6458 {
6459 { Bad_Opcode },
6460 { Bad_Opcode },
6461 { "vcvtps2ph", { EXxmmq, XM, Ib }, 0 },
6462 },
6463
6464 /* PREFIX_VEX_0F3A20 */
6465 {
6466 { Bad_Opcode },
6467 { Bad_Opcode },
6468 { VEX_LEN_TABLE (VEX_LEN_0F3A20_P_2) },
6469 },
6470
6471 /* PREFIX_VEX_0F3A21 */
6472 {
6473 { Bad_Opcode },
6474 { Bad_Opcode },
6475 { VEX_LEN_TABLE (VEX_LEN_0F3A21_P_2) },
6476 },
6477
6478 /* PREFIX_VEX_0F3A22 */
6479 {
6480 { Bad_Opcode },
6481 { Bad_Opcode },
6482 { VEX_LEN_TABLE (VEX_LEN_0F3A22_P_2) },
6483 },
6484
6485 /* PREFIX_VEX_0F3A30 */
6486 {
6487 { Bad_Opcode },
6488 { Bad_Opcode },
6489 { VEX_LEN_TABLE (VEX_LEN_0F3A30_P_2) },
6490 },
6491
6492 /* PREFIX_VEX_0F3A31 */
6493 {
6494 { Bad_Opcode },
6495 { Bad_Opcode },
6496 { VEX_LEN_TABLE (VEX_LEN_0F3A31_P_2) },
6497 },
6498
6499 /* PREFIX_VEX_0F3A32 */
6500 {
6501 { Bad_Opcode },
6502 { Bad_Opcode },
6503 { VEX_LEN_TABLE (VEX_LEN_0F3A32_P_2) },
6504 },
6505
6506 /* PREFIX_VEX_0F3A33 */
6507 {
6508 { Bad_Opcode },
6509 { Bad_Opcode },
6510 { VEX_LEN_TABLE (VEX_LEN_0F3A33_P_2) },
6511 },
6512
6513 /* PREFIX_VEX_0F3A38 */
6514 {
6515 { Bad_Opcode },
6516 { Bad_Opcode },
6517 { VEX_LEN_TABLE (VEX_LEN_0F3A38_P_2) },
6518 },
6519
6520 /* PREFIX_VEX_0F3A39 */
6521 {
6522 { Bad_Opcode },
6523 { Bad_Opcode },
6524 { VEX_LEN_TABLE (VEX_LEN_0F3A39_P_2) },
6525 },
6526
6527 /* PREFIX_VEX_0F3A40 */
6528 {
6529 { Bad_Opcode },
6530 { Bad_Opcode },
6531 { "vdpps", { XM, Vex, EXx, Ib }, 0 },
6532 },
6533
6534 /* PREFIX_VEX_0F3A41 */
6535 {
6536 { Bad_Opcode },
6537 { Bad_Opcode },
6538 { VEX_LEN_TABLE (VEX_LEN_0F3A41_P_2) },
6539 },
6540
6541 /* PREFIX_VEX_0F3A42 */
6542 {
6543 { Bad_Opcode },
6544 { Bad_Opcode },
6545 { "vmpsadbw", { XM, Vex, EXx, Ib }, 0 },
6546 },
6547
6548 /* PREFIX_VEX_0F3A44 */
6549 {
6550 { Bad_Opcode },
6551 { Bad_Opcode },
6552 { "vpclmulqdq", { XM, Vex, EXx, PCLMUL }, 0 },
6553 },
6554
6555 /* PREFIX_VEX_0F3A46 */
6556 {
6557 { Bad_Opcode },
6558 { Bad_Opcode },
6559 { VEX_LEN_TABLE (VEX_LEN_0F3A46_P_2) },
6560 },
6561
6562 /* PREFIX_VEX_0F3A48 */
6563 {
6564 { Bad_Opcode },
6565 { Bad_Opcode },
6566 { VEX_W_TABLE (VEX_W_0F3A48_P_2) },
6567 },
6568
6569 /* PREFIX_VEX_0F3A49 */
6570 {
6571 { Bad_Opcode },
6572 { Bad_Opcode },
6573 { VEX_W_TABLE (VEX_W_0F3A49_P_2) },
6574 },
6575
6576 /* PREFIX_VEX_0F3A4A */
6577 {
6578 { Bad_Opcode },
6579 { Bad_Opcode },
6580 { VEX_W_TABLE (VEX_W_0F3A4A_P_2) },
6581 },
6582
6583 /* PREFIX_VEX_0F3A4B */
6584 {
6585 { Bad_Opcode },
6586 { Bad_Opcode },
6587 { VEX_W_TABLE (VEX_W_0F3A4B_P_2) },
6588 },
6589
6590 /* PREFIX_VEX_0F3A4C */
6591 {
6592 { Bad_Opcode },
6593 { Bad_Opcode },
6594 { VEX_W_TABLE (VEX_W_0F3A4C_P_2) },
6595 },
6596
6597 /* PREFIX_VEX_0F3A5C */
6598 {
6599 { Bad_Opcode },
6600 { Bad_Opcode },
6601 { "vfmaddsubps", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6602 },
6603
6604 /* PREFIX_VEX_0F3A5D */
6605 {
6606 { Bad_Opcode },
6607 { Bad_Opcode },
6608 { "vfmaddsubpd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6609 },
6610
6611 /* PREFIX_VEX_0F3A5E */
6612 {
6613 { Bad_Opcode },
6614 { Bad_Opcode },
6615 { "vfmsubaddps", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6616 },
6617
6618 /* PREFIX_VEX_0F3A5F */
6619 {
6620 { Bad_Opcode },
6621 { Bad_Opcode },
6622 { "vfmsubaddpd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6623 },
6624
6625 /* PREFIX_VEX_0F3A60 */
6626 {
6627 { Bad_Opcode },
6628 { Bad_Opcode },
6629 { VEX_LEN_TABLE (VEX_LEN_0F3A60_P_2) },
6630 { Bad_Opcode },
6631 },
6632
6633 /* PREFIX_VEX_0F3A61 */
6634 {
6635 { Bad_Opcode },
6636 { Bad_Opcode },
6637 { VEX_LEN_TABLE (VEX_LEN_0F3A61_P_2) },
6638 },
6639
6640 /* PREFIX_VEX_0F3A62 */
6641 {
6642 { Bad_Opcode },
6643 { Bad_Opcode },
6644 { VEX_LEN_TABLE (VEX_LEN_0F3A62_P_2) },
6645 },
6646
6647 /* PREFIX_VEX_0F3A63 */
6648 {
6649 { Bad_Opcode },
6650 { Bad_Opcode },
6651 { VEX_LEN_TABLE (VEX_LEN_0F3A63_P_2) },
6652 },
6653
6654 /* PREFIX_VEX_0F3A68 */
6655 {
6656 { Bad_Opcode },
6657 { Bad_Opcode },
6658 { "vfmaddps", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6659 },
6660
6661 /* PREFIX_VEX_0F3A69 */
6662 {
6663 { Bad_Opcode },
6664 { Bad_Opcode },
6665 { "vfmaddpd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6666 },
6667
6668 /* PREFIX_VEX_0F3A6A */
6669 {
6670 { Bad_Opcode },
6671 { Bad_Opcode },
6672 { VEX_LEN_TABLE (VEX_LEN_0F3A6A_P_2) },
6673 },
6674
6675 /* PREFIX_VEX_0F3A6B */
6676 {
6677 { Bad_Opcode },
6678 { Bad_Opcode },
6679 { VEX_LEN_TABLE (VEX_LEN_0F3A6B_P_2) },
6680 },
6681
6682 /* PREFIX_VEX_0F3A6C */
6683 {
6684 { Bad_Opcode },
6685 { Bad_Opcode },
6686 { "vfmsubps", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6687 },
6688
6689 /* PREFIX_VEX_0F3A6D */
6690 {
6691 { Bad_Opcode },
6692 { Bad_Opcode },
6693 { "vfmsubpd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6694 },
6695
6696 /* PREFIX_VEX_0F3A6E */
6697 {
6698 { Bad_Opcode },
6699 { Bad_Opcode },
6700 { VEX_LEN_TABLE (VEX_LEN_0F3A6E_P_2) },
6701 },
6702
6703 /* PREFIX_VEX_0F3A6F */
6704 {
6705 { Bad_Opcode },
6706 { Bad_Opcode },
6707 { VEX_LEN_TABLE (VEX_LEN_0F3A6F_P_2) },
6708 },
6709
6710 /* PREFIX_VEX_0F3A78 */
6711 {
6712 { Bad_Opcode },
6713 { Bad_Opcode },
6714 { "vfnmaddps", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6715 },
6716
6717 /* PREFIX_VEX_0F3A79 */
6718 {
6719 { Bad_Opcode },
6720 { Bad_Opcode },
6721 { "vfnmaddpd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6722 },
6723
6724 /* PREFIX_VEX_0F3A7A */
6725 {
6726 { Bad_Opcode },
6727 { Bad_Opcode },
6728 { VEX_LEN_TABLE (VEX_LEN_0F3A7A_P_2) },
6729 },
6730
6731 /* PREFIX_VEX_0F3A7B */
6732 {
6733 { Bad_Opcode },
6734 { Bad_Opcode },
6735 { VEX_LEN_TABLE (VEX_LEN_0F3A7B_P_2) },
6736 },
6737
6738 /* PREFIX_VEX_0F3A7C */
6739 {
6740 { Bad_Opcode },
6741 { Bad_Opcode },
6742 { "vfnmsubps", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6743 { Bad_Opcode },
6744 },
6745
6746 /* PREFIX_VEX_0F3A7D */
6747 {
6748 { Bad_Opcode },
6749 { Bad_Opcode },
6750 { "vfnmsubpd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6751 },
6752
6753 /* PREFIX_VEX_0F3A7E */
6754 {
6755 { Bad_Opcode },
6756 { Bad_Opcode },
6757 { VEX_LEN_TABLE (VEX_LEN_0F3A7E_P_2) },
6758 },
6759
6760 /* PREFIX_VEX_0F3A7F */
6761 {
6762 { Bad_Opcode },
6763 { Bad_Opcode },
6764 { VEX_LEN_TABLE (VEX_LEN_0F3A7F_P_2) },
6765 },
6766
6767 /* PREFIX_VEX_0F3ACE */
6768 {
6769 { Bad_Opcode },
6770 { Bad_Opcode },
6771 { VEX_W_TABLE (VEX_W_0F3ACE_P_2) },
6772 },
6773
6774 /* PREFIX_VEX_0F3ACF */
6775 {
6776 { Bad_Opcode },
6777 { Bad_Opcode },
6778 { VEX_W_TABLE (VEX_W_0F3ACF_P_2) },
6779 },
6780
6781 /* PREFIX_VEX_0F3ADF */
6782 {
6783 { Bad_Opcode },
6784 { Bad_Opcode },
6785 { VEX_LEN_TABLE (VEX_LEN_0F3ADF_P_2) },
6786 },
6787
6788 /* PREFIX_VEX_0F3AF0 */
6789 {
6790 { Bad_Opcode },
6791 { Bad_Opcode },
6792 { Bad_Opcode },
6793 { VEX_LEN_TABLE (VEX_LEN_0F3AF0_P_3) },
6794 },
6795
6796 #include "i386-dis-evex-prefix.h"
6797 };
6798
6799 static const struct dis386 x86_64_table[][2] = {
6800 /* X86_64_06 */
6801 {
6802 { "pushP", { es }, 0 },
6803 },
6804
6805 /* X86_64_07 */
6806 {
6807 { "popP", { es }, 0 },
6808 },
6809
6810 /* X86_64_0D */
6811 {
6812 { "pushP", { cs }, 0 },
6813 },
6814
6815 /* X86_64_16 */
6816 {
6817 { "pushP", { ss }, 0 },
6818 },
6819
6820 /* X86_64_17 */
6821 {
6822 { "popP", { ss }, 0 },
6823 },
6824
6825 /* X86_64_1E */
6826 {
6827 { "pushP", { ds }, 0 },
6828 },
6829
6830 /* X86_64_1F */
6831 {
6832 { "popP", { ds }, 0 },
6833 },
6834
6835 /* X86_64_27 */
6836 {
6837 { "daa", { XX }, 0 },
6838 },
6839
6840 /* X86_64_2F */
6841 {
6842 { "das", { XX }, 0 },
6843 },
6844
6845 /* X86_64_37 */
6846 {
6847 { "aaa", { XX }, 0 },
6848 },
6849
6850 /* X86_64_3F */
6851 {
6852 { "aas", { XX }, 0 },
6853 },
6854
6855 /* X86_64_60 */
6856 {
6857 { "pushaP", { XX }, 0 },
6858 },
6859
6860 /* X86_64_61 */
6861 {
6862 { "popaP", { XX }, 0 },
6863 },
6864
6865 /* X86_64_62 */
6866 {
6867 { MOD_TABLE (MOD_62_32BIT) },
6868 { EVEX_TABLE (EVEX_0F) },
6869 },
6870
6871 /* X86_64_63 */
6872 {
6873 { "arpl", { Ew, Gw }, 0 },
6874 { "movs{lq|xd}", { Gv, Ed }, 0 },
6875 },
6876
6877 /* X86_64_6D */
6878 {
6879 { "ins{R|}", { Yzr, indirDX }, 0 },
6880 { "ins{G|}", { Yzr, indirDX }, 0 },
6881 },
6882
6883 /* X86_64_6F */
6884 {
6885 { "outs{R|}", { indirDXr, Xz }, 0 },
6886 { "outs{G|}", { indirDXr, Xz }, 0 },
6887 },
6888
6889 /* X86_64_82 */
6890 {
6891 /* Opcode 0x82 is an alias of opcode 0x80 in 32-bit mode. */
6892 { REG_TABLE (REG_80) },
6893 },
6894
6895 /* X86_64_9A */
6896 {
6897 { "Jcall{T|}", { Ap }, 0 },
6898 },
6899
6900 /* X86_64_C4 */
6901 {
6902 { MOD_TABLE (MOD_C4_32BIT) },
6903 { VEX_C4_TABLE (VEX_0F) },
6904 },
6905
6906 /* X86_64_C5 */
6907 {
6908 { MOD_TABLE (MOD_C5_32BIT) },
6909 { VEX_C5_TABLE (VEX_0F) },
6910 },
6911
6912 /* X86_64_CE */
6913 {
6914 { "into", { XX }, 0 },
6915 },
6916
6917 /* X86_64_D4 */
6918 {
6919 { "aam", { Ib }, 0 },
6920 },
6921
6922 /* X86_64_D5 */
6923 {
6924 { "aad", { Ib }, 0 },
6925 },
6926
6927 /* X86_64_E8 */
6928 {
6929 { "callP", { Jv, BND }, 0 },
6930 { "call@", { Jv, BND }, 0 }
6931 },
6932
6933 /* X86_64_E9 */
6934 {
6935 { "jmpP", { Jv, BND }, 0 },
6936 { "jmp@", { Jv, BND }, 0 }
6937 },
6938
6939 /* X86_64_EA */
6940 {
6941 { "Jjmp{T|}", { Ap }, 0 },
6942 },
6943
6944 /* X86_64_0F01_REG_0 */
6945 {
6946 { "sgdt{Q|IQ}", { M }, 0 },
6947 { "sgdt", { M }, 0 },
6948 },
6949
6950 /* X86_64_0F01_REG_1 */
6951 {
6952 { "sidt{Q|IQ}", { M }, 0 },
6953 { "sidt", { M }, 0 },
6954 },
6955
6956 /* X86_64_0F01_REG_2 */
6957 {
6958 { "lgdt{Q|Q}", { M }, 0 },
6959 { "lgdt", { M }, 0 },
6960 },
6961
6962 /* X86_64_0F01_REG_3 */
6963 {
6964 { "lidt{Q|Q}", { M }, 0 },
6965 { "lidt", { M }, 0 },
6966 },
6967 };
6968
6969 static const struct dis386 three_byte_table[][256] = {
6970
6971 /* THREE_BYTE_0F38 */
6972 {
6973 /* 00 */
6974 { "pshufb", { MX, EM }, PREFIX_OPCODE },
6975 { "phaddw", { MX, EM }, PREFIX_OPCODE },
6976 { "phaddd", { MX, EM }, PREFIX_OPCODE },
6977 { "phaddsw", { MX, EM }, PREFIX_OPCODE },
6978 { "pmaddubsw", { MX, EM }, PREFIX_OPCODE },
6979 { "phsubw", { MX, EM }, PREFIX_OPCODE },
6980 { "phsubd", { MX, EM }, PREFIX_OPCODE },
6981 { "phsubsw", { MX, EM }, PREFIX_OPCODE },
6982 /* 08 */
6983 { "psignb", { MX, EM }, PREFIX_OPCODE },
6984 { "psignw", { MX, EM }, PREFIX_OPCODE },
6985 { "psignd", { MX, EM }, PREFIX_OPCODE },
6986 { "pmulhrsw", { MX, EM }, PREFIX_OPCODE },
6987 { Bad_Opcode },
6988 { Bad_Opcode },
6989 { Bad_Opcode },
6990 { Bad_Opcode },
6991 /* 10 */
6992 { PREFIX_TABLE (PREFIX_0F3810) },
6993 { Bad_Opcode },
6994 { Bad_Opcode },
6995 { Bad_Opcode },
6996 { PREFIX_TABLE (PREFIX_0F3814) },
6997 { PREFIX_TABLE (PREFIX_0F3815) },
6998 { Bad_Opcode },
6999 { PREFIX_TABLE (PREFIX_0F3817) },
7000 /* 18 */
7001 { Bad_Opcode },
7002 { Bad_Opcode },
7003 { Bad_Opcode },
7004 { Bad_Opcode },
7005 { "pabsb", { MX, EM }, PREFIX_OPCODE },
7006 { "pabsw", { MX, EM }, PREFIX_OPCODE },
7007 { "pabsd", { MX, EM }, PREFIX_OPCODE },
7008 { Bad_Opcode },
7009 /* 20 */
7010 { PREFIX_TABLE (PREFIX_0F3820) },
7011 { PREFIX_TABLE (PREFIX_0F3821) },
7012 { PREFIX_TABLE (PREFIX_0F3822) },
7013 { PREFIX_TABLE (PREFIX_0F3823) },
7014 { PREFIX_TABLE (PREFIX_0F3824) },
7015 { PREFIX_TABLE (PREFIX_0F3825) },
7016 { Bad_Opcode },
7017 { Bad_Opcode },
7018 /* 28 */
7019 { PREFIX_TABLE (PREFIX_0F3828) },
7020 { PREFIX_TABLE (PREFIX_0F3829) },
7021 { PREFIX_TABLE (PREFIX_0F382A) },
7022 { PREFIX_TABLE (PREFIX_0F382B) },
7023 { Bad_Opcode },
7024 { Bad_Opcode },
7025 { Bad_Opcode },
7026 { Bad_Opcode },
7027 /* 30 */
7028 { PREFIX_TABLE (PREFIX_0F3830) },
7029 { PREFIX_TABLE (PREFIX_0F3831) },
7030 { PREFIX_TABLE (PREFIX_0F3832) },
7031 { PREFIX_TABLE (PREFIX_0F3833) },
7032 { PREFIX_TABLE (PREFIX_0F3834) },
7033 { PREFIX_TABLE (PREFIX_0F3835) },
7034 { Bad_Opcode },
7035 { PREFIX_TABLE (PREFIX_0F3837) },
7036 /* 38 */
7037 { PREFIX_TABLE (PREFIX_0F3838) },
7038 { PREFIX_TABLE (PREFIX_0F3839) },
7039 { PREFIX_TABLE (PREFIX_0F383A) },
7040 { PREFIX_TABLE (PREFIX_0F383B) },
7041 { PREFIX_TABLE (PREFIX_0F383C) },
7042 { PREFIX_TABLE (PREFIX_0F383D) },
7043 { PREFIX_TABLE (PREFIX_0F383E) },
7044 { PREFIX_TABLE (PREFIX_0F383F) },
7045 /* 40 */
7046 { PREFIX_TABLE (PREFIX_0F3840) },
7047 { PREFIX_TABLE (PREFIX_0F3841) },
7048 { Bad_Opcode },
7049 { Bad_Opcode },
7050 { Bad_Opcode },
7051 { Bad_Opcode },
7052 { Bad_Opcode },
7053 { Bad_Opcode },
7054 /* 48 */
7055 { Bad_Opcode },
7056 { Bad_Opcode },
7057 { Bad_Opcode },
7058 { Bad_Opcode },
7059 { Bad_Opcode },
7060 { Bad_Opcode },
7061 { Bad_Opcode },
7062 { Bad_Opcode },
7063 /* 50 */
7064 { Bad_Opcode },
7065 { Bad_Opcode },
7066 { Bad_Opcode },
7067 { Bad_Opcode },
7068 { Bad_Opcode },
7069 { Bad_Opcode },
7070 { Bad_Opcode },
7071 { Bad_Opcode },
7072 /* 58 */
7073 { Bad_Opcode },
7074 { Bad_Opcode },
7075 { Bad_Opcode },
7076 { Bad_Opcode },
7077 { Bad_Opcode },
7078 { Bad_Opcode },
7079 { Bad_Opcode },
7080 { Bad_Opcode },
7081 /* 60 */
7082 { Bad_Opcode },
7083 { Bad_Opcode },
7084 { Bad_Opcode },
7085 { Bad_Opcode },
7086 { Bad_Opcode },
7087 { Bad_Opcode },
7088 { Bad_Opcode },
7089 { Bad_Opcode },
7090 /* 68 */
7091 { Bad_Opcode },
7092 { Bad_Opcode },
7093 { Bad_Opcode },
7094 { Bad_Opcode },
7095 { Bad_Opcode },
7096 { Bad_Opcode },
7097 { Bad_Opcode },
7098 { Bad_Opcode },
7099 /* 70 */
7100 { Bad_Opcode },
7101 { Bad_Opcode },
7102 { Bad_Opcode },
7103 { Bad_Opcode },
7104 { Bad_Opcode },
7105 { Bad_Opcode },
7106 { Bad_Opcode },
7107 { Bad_Opcode },
7108 /* 78 */
7109 { Bad_Opcode },
7110 { Bad_Opcode },
7111 { Bad_Opcode },
7112 { Bad_Opcode },
7113 { Bad_Opcode },
7114 { Bad_Opcode },
7115 { Bad_Opcode },
7116 { Bad_Opcode },
7117 /* 80 */
7118 { PREFIX_TABLE (PREFIX_0F3880) },
7119 { PREFIX_TABLE (PREFIX_0F3881) },
7120 { PREFIX_TABLE (PREFIX_0F3882) },
7121 { Bad_Opcode },
7122 { Bad_Opcode },
7123 { Bad_Opcode },
7124 { Bad_Opcode },
7125 { Bad_Opcode },
7126 /* 88 */
7127 { Bad_Opcode },
7128 { Bad_Opcode },
7129 { Bad_Opcode },
7130 { Bad_Opcode },
7131 { Bad_Opcode },
7132 { Bad_Opcode },
7133 { Bad_Opcode },
7134 { Bad_Opcode },
7135 /* 90 */
7136 { Bad_Opcode },
7137 { Bad_Opcode },
7138 { Bad_Opcode },
7139 { Bad_Opcode },
7140 { Bad_Opcode },
7141 { Bad_Opcode },
7142 { Bad_Opcode },
7143 { Bad_Opcode },
7144 /* 98 */
7145 { Bad_Opcode },
7146 { Bad_Opcode },
7147 { Bad_Opcode },
7148 { Bad_Opcode },
7149 { Bad_Opcode },
7150 { Bad_Opcode },
7151 { Bad_Opcode },
7152 { Bad_Opcode },
7153 /* a0 */
7154 { Bad_Opcode },
7155 { Bad_Opcode },
7156 { Bad_Opcode },
7157 { Bad_Opcode },
7158 { Bad_Opcode },
7159 { Bad_Opcode },
7160 { Bad_Opcode },
7161 { Bad_Opcode },
7162 /* a8 */
7163 { Bad_Opcode },
7164 { Bad_Opcode },
7165 { Bad_Opcode },
7166 { Bad_Opcode },
7167 { Bad_Opcode },
7168 { Bad_Opcode },
7169 { Bad_Opcode },
7170 { Bad_Opcode },
7171 /* b0 */
7172 { Bad_Opcode },
7173 { Bad_Opcode },
7174 { Bad_Opcode },
7175 { Bad_Opcode },
7176 { Bad_Opcode },
7177 { Bad_Opcode },
7178 { Bad_Opcode },
7179 { Bad_Opcode },
7180 /* b8 */
7181 { Bad_Opcode },
7182 { Bad_Opcode },
7183 { Bad_Opcode },
7184 { Bad_Opcode },
7185 { Bad_Opcode },
7186 { Bad_Opcode },
7187 { Bad_Opcode },
7188 { Bad_Opcode },
7189 /* c0 */
7190 { Bad_Opcode },
7191 { Bad_Opcode },
7192 { Bad_Opcode },
7193 { Bad_Opcode },
7194 { Bad_Opcode },
7195 { Bad_Opcode },
7196 { Bad_Opcode },
7197 { Bad_Opcode },
7198 /* c8 */
7199 { PREFIX_TABLE (PREFIX_0F38C8) },
7200 { PREFIX_TABLE (PREFIX_0F38C9) },
7201 { PREFIX_TABLE (PREFIX_0F38CA) },
7202 { PREFIX_TABLE (PREFIX_0F38CB) },
7203 { PREFIX_TABLE (PREFIX_0F38CC) },
7204 { PREFIX_TABLE (PREFIX_0F38CD) },
7205 { Bad_Opcode },
7206 { PREFIX_TABLE (PREFIX_0F38CF) },
7207 /* d0 */
7208 { Bad_Opcode },
7209 { Bad_Opcode },
7210 { Bad_Opcode },
7211 { Bad_Opcode },
7212 { Bad_Opcode },
7213 { Bad_Opcode },
7214 { Bad_Opcode },
7215 { Bad_Opcode },
7216 /* d8 */
7217 { Bad_Opcode },
7218 { Bad_Opcode },
7219 { Bad_Opcode },
7220 { PREFIX_TABLE (PREFIX_0F38DB) },
7221 { PREFIX_TABLE (PREFIX_0F38DC) },
7222 { PREFIX_TABLE (PREFIX_0F38DD) },
7223 { PREFIX_TABLE (PREFIX_0F38DE) },
7224 { PREFIX_TABLE (PREFIX_0F38DF) },
7225 /* e0 */
7226 { Bad_Opcode },
7227 { Bad_Opcode },
7228 { Bad_Opcode },
7229 { Bad_Opcode },
7230 { Bad_Opcode },
7231 { Bad_Opcode },
7232 { Bad_Opcode },
7233 { Bad_Opcode },
7234 /* e8 */
7235 { Bad_Opcode },
7236 { Bad_Opcode },
7237 { Bad_Opcode },
7238 { Bad_Opcode },
7239 { Bad_Opcode },
7240 { Bad_Opcode },
7241 { Bad_Opcode },
7242 { Bad_Opcode },
7243 /* f0 */
7244 { PREFIX_TABLE (PREFIX_0F38F0) },
7245 { PREFIX_TABLE (PREFIX_0F38F1) },
7246 { Bad_Opcode },
7247 { Bad_Opcode },
7248 { Bad_Opcode },
7249 { PREFIX_TABLE (PREFIX_0F38F5) },
7250 { PREFIX_TABLE (PREFIX_0F38F6) },
7251 { Bad_Opcode },
7252 /* f8 */
7253 { PREFIX_TABLE (PREFIX_0F38F8) },
7254 { PREFIX_TABLE (PREFIX_0F38F9) },
7255 { Bad_Opcode },
7256 { Bad_Opcode },
7257 { Bad_Opcode },
7258 { Bad_Opcode },
7259 { Bad_Opcode },
7260 { Bad_Opcode },
7261 },
7262 /* THREE_BYTE_0F3A */
7263 {
7264 /* 00 */
7265 { Bad_Opcode },
7266 { Bad_Opcode },
7267 { Bad_Opcode },
7268 { Bad_Opcode },
7269 { Bad_Opcode },
7270 { Bad_Opcode },
7271 { Bad_Opcode },
7272 { Bad_Opcode },
7273 /* 08 */
7274 { PREFIX_TABLE (PREFIX_0F3A08) },
7275 { PREFIX_TABLE (PREFIX_0F3A09) },
7276 { PREFIX_TABLE (PREFIX_0F3A0A) },
7277 { PREFIX_TABLE (PREFIX_0F3A0B) },
7278 { PREFIX_TABLE (PREFIX_0F3A0C) },
7279 { PREFIX_TABLE (PREFIX_0F3A0D) },
7280 { PREFIX_TABLE (PREFIX_0F3A0E) },
7281 { "palignr", { MX, EM, Ib }, PREFIX_OPCODE },
7282 /* 10 */
7283 { Bad_Opcode },
7284 { Bad_Opcode },
7285 { Bad_Opcode },
7286 { Bad_Opcode },
7287 { PREFIX_TABLE (PREFIX_0F3A14) },
7288 { PREFIX_TABLE (PREFIX_0F3A15) },
7289 { PREFIX_TABLE (PREFIX_0F3A16) },
7290 { PREFIX_TABLE (PREFIX_0F3A17) },
7291 /* 18 */
7292 { Bad_Opcode },
7293 { Bad_Opcode },
7294 { Bad_Opcode },
7295 { Bad_Opcode },
7296 { Bad_Opcode },
7297 { Bad_Opcode },
7298 { Bad_Opcode },
7299 { Bad_Opcode },
7300 /* 20 */
7301 { PREFIX_TABLE (PREFIX_0F3A20) },
7302 { PREFIX_TABLE (PREFIX_0F3A21) },
7303 { PREFIX_TABLE (PREFIX_0F3A22) },
7304 { Bad_Opcode },
7305 { Bad_Opcode },
7306 { Bad_Opcode },
7307 { Bad_Opcode },
7308 { Bad_Opcode },
7309 /* 28 */
7310 { Bad_Opcode },
7311 { Bad_Opcode },
7312 { Bad_Opcode },
7313 { Bad_Opcode },
7314 { Bad_Opcode },
7315 { Bad_Opcode },
7316 { Bad_Opcode },
7317 { Bad_Opcode },
7318 /* 30 */
7319 { Bad_Opcode },
7320 { Bad_Opcode },
7321 { Bad_Opcode },
7322 { Bad_Opcode },
7323 { Bad_Opcode },
7324 { Bad_Opcode },
7325 { Bad_Opcode },
7326 { Bad_Opcode },
7327 /* 38 */
7328 { Bad_Opcode },
7329 { Bad_Opcode },
7330 { Bad_Opcode },
7331 { Bad_Opcode },
7332 { Bad_Opcode },
7333 { Bad_Opcode },
7334 { Bad_Opcode },
7335 { Bad_Opcode },
7336 /* 40 */
7337 { PREFIX_TABLE (PREFIX_0F3A40) },
7338 { PREFIX_TABLE (PREFIX_0F3A41) },
7339 { PREFIX_TABLE (PREFIX_0F3A42) },
7340 { Bad_Opcode },
7341 { PREFIX_TABLE (PREFIX_0F3A44) },
7342 { Bad_Opcode },
7343 { Bad_Opcode },
7344 { Bad_Opcode },
7345 /* 48 */
7346 { Bad_Opcode },
7347 { Bad_Opcode },
7348 { Bad_Opcode },
7349 { Bad_Opcode },
7350 { Bad_Opcode },
7351 { Bad_Opcode },
7352 { Bad_Opcode },
7353 { Bad_Opcode },
7354 /* 50 */
7355 { Bad_Opcode },
7356 { Bad_Opcode },
7357 { Bad_Opcode },
7358 { Bad_Opcode },
7359 { Bad_Opcode },
7360 { Bad_Opcode },
7361 { Bad_Opcode },
7362 { Bad_Opcode },
7363 /* 58 */
7364 { Bad_Opcode },
7365 { Bad_Opcode },
7366 { Bad_Opcode },
7367 { Bad_Opcode },
7368 { Bad_Opcode },
7369 { Bad_Opcode },
7370 { Bad_Opcode },
7371 { Bad_Opcode },
7372 /* 60 */
7373 { PREFIX_TABLE (PREFIX_0F3A60) },
7374 { PREFIX_TABLE (PREFIX_0F3A61) },
7375 { PREFIX_TABLE (PREFIX_0F3A62) },
7376 { PREFIX_TABLE (PREFIX_0F3A63) },
7377 { Bad_Opcode },
7378 { Bad_Opcode },
7379 { Bad_Opcode },
7380 { Bad_Opcode },
7381 /* 68 */
7382 { Bad_Opcode },
7383 { Bad_Opcode },
7384 { Bad_Opcode },
7385 { Bad_Opcode },
7386 { Bad_Opcode },
7387 { Bad_Opcode },
7388 { Bad_Opcode },
7389 { Bad_Opcode },
7390 /* 70 */
7391 { Bad_Opcode },
7392 { Bad_Opcode },
7393 { Bad_Opcode },
7394 { Bad_Opcode },
7395 { Bad_Opcode },
7396 { Bad_Opcode },
7397 { Bad_Opcode },
7398 { Bad_Opcode },
7399 /* 78 */
7400 { Bad_Opcode },
7401 { Bad_Opcode },
7402 { Bad_Opcode },
7403 { Bad_Opcode },
7404 { Bad_Opcode },
7405 { Bad_Opcode },
7406 { Bad_Opcode },
7407 { Bad_Opcode },
7408 /* 80 */
7409 { Bad_Opcode },
7410 { Bad_Opcode },
7411 { Bad_Opcode },
7412 { Bad_Opcode },
7413 { Bad_Opcode },
7414 { Bad_Opcode },
7415 { Bad_Opcode },
7416 { Bad_Opcode },
7417 /* 88 */
7418 { Bad_Opcode },
7419 { Bad_Opcode },
7420 { Bad_Opcode },
7421 { Bad_Opcode },
7422 { Bad_Opcode },
7423 { Bad_Opcode },
7424 { Bad_Opcode },
7425 { Bad_Opcode },
7426 /* 90 */
7427 { Bad_Opcode },
7428 { Bad_Opcode },
7429 { Bad_Opcode },
7430 { Bad_Opcode },
7431 { Bad_Opcode },
7432 { Bad_Opcode },
7433 { Bad_Opcode },
7434 { Bad_Opcode },
7435 /* 98 */
7436 { Bad_Opcode },
7437 { Bad_Opcode },
7438 { Bad_Opcode },
7439 { Bad_Opcode },
7440 { Bad_Opcode },
7441 { Bad_Opcode },
7442 { Bad_Opcode },
7443 { Bad_Opcode },
7444 /* a0 */
7445 { Bad_Opcode },
7446 { Bad_Opcode },
7447 { Bad_Opcode },
7448 { Bad_Opcode },
7449 { Bad_Opcode },
7450 { Bad_Opcode },
7451 { Bad_Opcode },
7452 { Bad_Opcode },
7453 /* a8 */
7454 { Bad_Opcode },
7455 { Bad_Opcode },
7456 { Bad_Opcode },
7457 { Bad_Opcode },
7458 { Bad_Opcode },
7459 { Bad_Opcode },
7460 { Bad_Opcode },
7461 { Bad_Opcode },
7462 /* b0 */
7463 { Bad_Opcode },
7464 { Bad_Opcode },
7465 { Bad_Opcode },
7466 { Bad_Opcode },
7467 { Bad_Opcode },
7468 { Bad_Opcode },
7469 { Bad_Opcode },
7470 { Bad_Opcode },
7471 /* b8 */
7472 { Bad_Opcode },
7473 { Bad_Opcode },
7474 { Bad_Opcode },
7475 { Bad_Opcode },
7476 { Bad_Opcode },
7477 { Bad_Opcode },
7478 { Bad_Opcode },
7479 { Bad_Opcode },
7480 /* c0 */
7481 { Bad_Opcode },
7482 { Bad_Opcode },
7483 { Bad_Opcode },
7484 { Bad_Opcode },
7485 { Bad_Opcode },
7486 { Bad_Opcode },
7487 { Bad_Opcode },
7488 { Bad_Opcode },
7489 /* c8 */
7490 { Bad_Opcode },
7491 { Bad_Opcode },
7492 { Bad_Opcode },
7493 { Bad_Opcode },
7494 { PREFIX_TABLE (PREFIX_0F3ACC) },
7495 { Bad_Opcode },
7496 { PREFIX_TABLE (PREFIX_0F3ACE) },
7497 { PREFIX_TABLE (PREFIX_0F3ACF) },
7498 /* d0 */
7499 { Bad_Opcode },
7500 { Bad_Opcode },
7501 { Bad_Opcode },
7502 { Bad_Opcode },
7503 { Bad_Opcode },
7504 { Bad_Opcode },
7505 { Bad_Opcode },
7506 { Bad_Opcode },
7507 /* d8 */
7508 { Bad_Opcode },
7509 { Bad_Opcode },
7510 { Bad_Opcode },
7511 { Bad_Opcode },
7512 { Bad_Opcode },
7513 { Bad_Opcode },
7514 { Bad_Opcode },
7515 { PREFIX_TABLE (PREFIX_0F3ADF) },
7516 /* e0 */
7517 { Bad_Opcode },
7518 { Bad_Opcode },
7519 { Bad_Opcode },
7520 { Bad_Opcode },
7521 { Bad_Opcode },
7522 { Bad_Opcode },
7523 { Bad_Opcode },
7524 { Bad_Opcode },
7525 /* e8 */
7526 { Bad_Opcode },
7527 { Bad_Opcode },
7528 { Bad_Opcode },
7529 { Bad_Opcode },
7530 { Bad_Opcode },
7531 { Bad_Opcode },
7532 { Bad_Opcode },
7533 { Bad_Opcode },
7534 /* f0 */
7535 { Bad_Opcode },
7536 { Bad_Opcode },
7537 { Bad_Opcode },
7538 { Bad_Opcode },
7539 { Bad_Opcode },
7540 { Bad_Opcode },
7541 { Bad_Opcode },
7542 { Bad_Opcode },
7543 /* f8 */
7544 { Bad_Opcode },
7545 { Bad_Opcode },
7546 { Bad_Opcode },
7547 { Bad_Opcode },
7548 { Bad_Opcode },
7549 { Bad_Opcode },
7550 { Bad_Opcode },
7551 { Bad_Opcode },
7552 },
7553 };
7554
7555 static const struct dis386 xop_table[][256] = {
7556 /* XOP_08 */
7557 {
7558 /* 00 */
7559 { Bad_Opcode },
7560 { Bad_Opcode },
7561 { Bad_Opcode },
7562 { Bad_Opcode },
7563 { Bad_Opcode },
7564 { Bad_Opcode },
7565 { Bad_Opcode },
7566 { Bad_Opcode },
7567 /* 08 */
7568 { Bad_Opcode },
7569 { Bad_Opcode },
7570 { Bad_Opcode },
7571 { Bad_Opcode },
7572 { Bad_Opcode },
7573 { Bad_Opcode },
7574 { Bad_Opcode },
7575 { Bad_Opcode },
7576 /* 10 */
7577 { Bad_Opcode },
7578 { Bad_Opcode },
7579 { Bad_Opcode },
7580 { Bad_Opcode },
7581 { Bad_Opcode },
7582 { Bad_Opcode },
7583 { Bad_Opcode },
7584 { Bad_Opcode },
7585 /* 18 */
7586 { Bad_Opcode },
7587 { Bad_Opcode },
7588 { Bad_Opcode },
7589 { Bad_Opcode },
7590 { Bad_Opcode },
7591 { Bad_Opcode },
7592 { Bad_Opcode },
7593 { Bad_Opcode },
7594 /* 20 */
7595 { Bad_Opcode },
7596 { Bad_Opcode },
7597 { Bad_Opcode },
7598 { Bad_Opcode },
7599 { Bad_Opcode },
7600 { Bad_Opcode },
7601 { Bad_Opcode },
7602 { Bad_Opcode },
7603 /* 28 */
7604 { Bad_Opcode },
7605 { Bad_Opcode },
7606 { Bad_Opcode },
7607 { Bad_Opcode },
7608 { Bad_Opcode },
7609 { Bad_Opcode },
7610 { Bad_Opcode },
7611 { Bad_Opcode },
7612 /* 30 */
7613 { Bad_Opcode },
7614 { Bad_Opcode },
7615 { Bad_Opcode },
7616 { Bad_Opcode },
7617 { Bad_Opcode },
7618 { Bad_Opcode },
7619 { Bad_Opcode },
7620 { Bad_Opcode },
7621 /* 38 */
7622 { Bad_Opcode },
7623 { Bad_Opcode },
7624 { Bad_Opcode },
7625 { Bad_Opcode },
7626 { Bad_Opcode },
7627 { Bad_Opcode },
7628 { Bad_Opcode },
7629 { Bad_Opcode },
7630 /* 40 */
7631 { Bad_Opcode },
7632 { Bad_Opcode },
7633 { Bad_Opcode },
7634 { Bad_Opcode },
7635 { Bad_Opcode },
7636 { Bad_Opcode },
7637 { Bad_Opcode },
7638 { Bad_Opcode },
7639 /* 48 */
7640 { Bad_Opcode },
7641 { Bad_Opcode },
7642 { Bad_Opcode },
7643 { Bad_Opcode },
7644 { Bad_Opcode },
7645 { Bad_Opcode },
7646 { Bad_Opcode },
7647 { Bad_Opcode },
7648 /* 50 */
7649 { Bad_Opcode },
7650 { Bad_Opcode },
7651 { Bad_Opcode },
7652 { Bad_Opcode },
7653 { Bad_Opcode },
7654 { Bad_Opcode },
7655 { Bad_Opcode },
7656 { Bad_Opcode },
7657 /* 58 */
7658 { Bad_Opcode },
7659 { Bad_Opcode },
7660 { Bad_Opcode },
7661 { Bad_Opcode },
7662 { Bad_Opcode },
7663 { Bad_Opcode },
7664 { Bad_Opcode },
7665 { Bad_Opcode },
7666 /* 60 */
7667 { Bad_Opcode },
7668 { Bad_Opcode },
7669 { Bad_Opcode },
7670 { Bad_Opcode },
7671 { Bad_Opcode },
7672 { Bad_Opcode },
7673 { Bad_Opcode },
7674 { Bad_Opcode },
7675 /* 68 */
7676 { Bad_Opcode },
7677 { Bad_Opcode },
7678 { Bad_Opcode },
7679 { Bad_Opcode },
7680 { Bad_Opcode },
7681 { Bad_Opcode },
7682 { Bad_Opcode },
7683 { Bad_Opcode },
7684 /* 70 */
7685 { Bad_Opcode },
7686 { Bad_Opcode },
7687 { Bad_Opcode },
7688 { Bad_Opcode },
7689 { Bad_Opcode },
7690 { Bad_Opcode },
7691 { Bad_Opcode },
7692 { Bad_Opcode },
7693 /* 78 */
7694 { Bad_Opcode },
7695 { Bad_Opcode },
7696 { Bad_Opcode },
7697 { Bad_Opcode },
7698 { Bad_Opcode },
7699 { Bad_Opcode },
7700 { Bad_Opcode },
7701 { Bad_Opcode },
7702 /* 80 */
7703 { Bad_Opcode },
7704 { Bad_Opcode },
7705 { Bad_Opcode },
7706 { Bad_Opcode },
7707 { Bad_Opcode },
7708 { "vpmacssww", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7709 { "vpmacsswd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7710 { "vpmacssdql", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7711 /* 88 */
7712 { Bad_Opcode },
7713 { Bad_Opcode },
7714 { Bad_Opcode },
7715 { Bad_Opcode },
7716 { Bad_Opcode },
7717 { Bad_Opcode },
7718 { "vpmacssdd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7719 { "vpmacssdqh", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7720 /* 90 */
7721 { Bad_Opcode },
7722 { Bad_Opcode },
7723 { Bad_Opcode },
7724 { Bad_Opcode },
7725 { Bad_Opcode },
7726 { "vpmacsww", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7727 { "vpmacswd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7728 { "vpmacsdql", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7729 /* 98 */
7730 { Bad_Opcode },
7731 { Bad_Opcode },
7732 { Bad_Opcode },
7733 { Bad_Opcode },
7734 { Bad_Opcode },
7735 { Bad_Opcode },
7736 { "vpmacsdd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7737 { "vpmacsdqh", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7738 /* a0 */
7739 { Bad_Opcode },
7740 { Bad_Opcode },
7741 { "vpcmov", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7742 { "vpperm", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7743 { Bad_Opcode },
7744 { Bad_Opcode },
7745 { "vpmadcsswd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7746 { Bad_Opcode },
7747 /* a8 */
7748 { Bad_Opcode },
7749 { Bad_Opcode },
7750 { Bad_Opcode },
7751 { Bad_Opcode },
7752 { Bad_Opcode },
7753 { Bad_Opcode },
7754 { Bad_Opcode },
7755 { Bad_Opcode },
7756 /* b0 */
7757 { Bad_Opcode },
7758 { Bad_Opcode },
7759 { Bad_Opcode },
7760 { Bad_Opcode },
7761 { Bad_Opcode },
7762 { Bad_Opcode },
7763 { "vpmadcswd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7764 { Bad_Opcode },
7765 /* b8 */
7766 { Bad_Opcode },
7767 { Bad_Opcode },
7768 { Bad_Opcode },
7769 { Bad_Opcode },
7770 { Bad_Opcode },
7771 { Bad_Opcode },
7772 { Bad_Opcode },
7773 { Bad_Opcode },
7774 /* c0 */
7775 { "vprotb", { XM, Vex_2src_1, Ib }, 0 },
7776 { "vprotw", { XM, Vex_2src_1, Ib }, 0 },
7777 { "vprotd", { XM, Vex_2src_1, Ib }, 0 },
7778 { "vprotq", { XM, Vex_2src_1, Ib }, 0 },
7779 { Bad_Opcode },
7780 { Bad_Opcode },
7781 { Bad_Opcode },
7782 { Bad_Opcode },
7783 /* c8 */
7784 { Bad_Opcode },
7785 { Bad_Opcode },
7786 { Bad_Opcode },
7787 { Bad_Opcode },
7788 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CC) },
7789 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CD) },
7790 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CE) },
7791 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CF) },
7792 /* d0 */
7793 { Bad_Opcode },
7794 { Bad_Opcode },
7795 { Bad_Opcode },
7796 { Bad_Opcode },
7797 { Bad_Opcode },
7798 { Bad_Opcode },
7799 { Bad_Opcode },
7800 { Bad_Opcode },
7801 /* d8 */
7802 { Bad_Opcode },
7803 { Bad_Opcode },
7804 { Bad_Opcode },
7805 { Bad_Opcode },
7806 { Bad_Opcode },
7807 { Bad_Opcode },
7808 { Bad_Opcode },
7809 { Bad_Opcode },
7810 /* e0 */
7811 { Bad_Opcode },
7812 { Bad_Opcode },
7813 { Bad_Opcode },
7814 { Bad_Opcode },
7815 { Bad_Opcode },
7816 { Bad_Opcode },
7817 { Bad_Opcode },
7818 { Bad_Opcode },
7819 /* e8 */
7820 { Bad_Opcode },
7821 { Bad_Opcode },
7822 { Bad_Opcode },
7823 { Bad_Opcode },
7824 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EC) },
7825 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_ED) },
7826 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EE) },
7827 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EF) },
7828 /* f0 */
7829 { Bad_Opcode },
7830 { Bad_Opcode },
7831 { Bad_Opcode },
7832 { Bad_Opcode },
7833 { Bad_Opcode },
7834 { Bad_Opcode },
7835 { Bad_Opcode },
7836 { Bad_Opcode },
7837 /* f8 */
7838 { Bad_Opcode },
7839 { Bad_Opcode },
7840 { Bad_Opcode },
7841 { Bad_Opcode },
7842 { Bad_Opcode },
7843 { Bad_Opcode },
7844 { Bad_Opcode },
7845 { Bad_Opcode },
7846 },
7847 /* XOP_09 */
7848 {
7849 /* 00 */
7850 { Bad_Opcode },
7851 { REG_TABLE (REG_XOP_TBM_01) },
7852 { REG_TABLE (REG_XOP_TBM_02) },
7853 { Bad_Opcode },
7854 { Bad_Opcode },
7855 { Bad_Opcode },
7856 { Bad_Opcode },
7857 { Bad_Opcode },
7858 /* 08 */
7859 { Bad_Opcode },
7860 { Bad_Opcode },
7861 { Bad_Opcode },
7862 { Bad_Opcode },
7863 { Bad_Opcode },
7864 { Bad_Opcode },
7865 { Bad_Opcode },
7866 { Bad_Opcode },
7867 /* 10 */
7868 { Bad_Opcode },
7869 { Bad_Opcode },
7870 { REG_TABLE (REG_XOP_LWPCB) },
7871 { Bad_Opcode },
7872 { Bad_Opcode },
7873 { Bad_Opcode },
7874 { Bad_Opcode },
7875 { Bad_Opcode },
7876 /* 18 */
7877 { Bad_Opcode },
7878 { Bad_Opcode },
7879 { Bad_Opcode },
7880 { Bad_Opcode },
7881 { Bad_Opcode },
7882 { Bad_Opcode },
7883 { Bad_Opcode },
7884 { Bad_Opcode },
7885 /* 20 */
7886 { Bad_Opcode },
7887 { Bad_Opcode },
7888 { Bad_Opcode },
7889 { Bad_Opcode },
7890 { Bad_Opcode },
7891 { Bad_Opcode },
7892 { Bad_Opcode },
7893 { Bad_Opcode },
7894 /* 28 */
7895 { Bad_Opcode },
7896 { Bad_Opcode },
7897 { Bad_Opcode },
7898 { Bad_Opcode },
7899 { Bad_Opcode },
7900 { Bad_Opcode },
7901 { Bad_Opcode },
7902 { Bad_Opcode },
7903 /* 30 */
7904 { Bad_Opcode },
7905 { Bad_Opcode },
7906 { Bad_Opcode },
7907 { Bad_Opcode },
7908 { Bad_Opcode },
7909 { Bad_Opcode },
7910 { Bad_Opcode },
7911 { Bad_Opcode },
7912 /* 38 */
7913 { Bad_Opcode },
7914 { Bad_Opcode },
7915 { Bad_Opcode },
7916 { Bad_Opcode },
7917 { Bad_Opcode },
7918 { Bad_Opcode },
7919 { Bad_Opcode },
7920 { Bad_Opcode },
7921 /* 40 */
7922 { Bad_Opcode },
7923 { Bad_Opcode },
7924 { Bad_Opcode },
7925 { Bad_Opcode },
7926 { Bad_Opcode },
7927 { Bad_Opcode },
7928 { Bad_Opcode },
7929 { Bad_Opcode },
7930 /* 48 */
7931 { Bad_Opcode },
7932 { Bad_Opcode },
7933 { Bad_Opcode },
7934 { Bad_Opcode },
7935 { Bad_Opcode },
7936 { Bad_Opcode },
7937 { Bad_Opcode },
7938 { Bad_Opcode },
7939 /* 50 */
7940 { Bad_Opcode },
7941 { Bad_Opcode },
7942 { Bad_Opcode },
7943 { Bad_Opcode },
7944 { Bad_Opcode },
7945 { Bad_Opcode },
7946 { Bad_Opcode },
7947 { Bad_Opcode },
7948 /* 58 */
7949 { Bad_Opcode },
7950 { Bad_Opcode },
7951 { Bad_Opcode },
7952 { Bad_Opcode },
7953 { Bad_Opcode },
7954 { Bad_Opcode },
7955 { Bad_Opcode },
7956 { Bad_Opcode },
7957 /* 60 */
7958 { Bad_Opcode },
7959 { Bad_Opcode },
7960 { Bad_Opcode },
7961 { Bad_Opcode },
7962 { Bad_Opcode },
7963 { Bad_Opcode },
7964 { Bad_Opcode },
7965 { Bad_Opcode },
7966 /* 68 */
7967 { Bad_Opcode },
7968 { Bad_Opcode },
7969 { Bad_Opcode },
7970 { Bad_Opcode },
7971 { Bad_Opcode },
7972 { Bad_Opcode },
7973 { Bad_Opcode },
7974 { Bad_Opcode },
7975 /* 70 */
7976 { Bad_Opcode },
7977 { Bad_Opcode },
7978 { Bad_Opcode },
7979 { Bad_Opcode },
7980 { Bad_Opcode },
7981 { Bad_Opcode },
7982 { Bad_Opcode },
7983 { Bad_Opcode },
7984 /* 78 */
7985 { Bad_Opcode },
7986 { Bad_Opcode },
7987 { Bad_Opcode },
7988 { Bad_Opcode },
7989 { Bad_Opcode },
7990 { Bad_Opcode },
7991 { Bad_Opcode },
7992 { Bad_Opcode },
7993 /* 80 */
7994 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_80) },
7995 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_81) },
7996 { "vfrczss", { XM, EXd }, 0 },
7997 { "vfrczsd", { XM, EXq }, 0 },
7998 { Bad_Opcode },
7999 { Bad_Opcode },
8000 { Bad_Opcode },
8001 { Bad_Opcode },
8002 /* 88 */
8003 { Bad_Opcode },
8004 { Bad_Opcode },
8005 { Bad_Opcode },
8006 { Bad_Opcode },
8007 { Bad_Opcode },
8008 { Bad_Opcode },
8009 { Bad_Opcode },
8010 { Bad_Opcode },
8011 /* 90 */
8012 { "vprotb", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8013 { "vprotw", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8014 { "vprotd", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8015 { "vprotq", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8016 { "vpshlb", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8017 { "vpshlw", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8018 { "vpshld", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8019 { "vpshlq", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8020 /* 98 */
8021 { "vpshab", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8022 { "vpshaw", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8023 { "vpshad", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8024 { "vpshaq", { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8025 { Bad_Opcode },
8026 { Bad_Opcode },
8027 { Bad_Opcode },
8028 { Bad_Opcode },
8029 /* a0 */
8030 { Bad_Opcode },
8031 { Bad_Opcode },
8032 { Bad_Opcode },
8033 { Bad_Opcode },
8034 { Bad_Opcode },
8035 { Bad_Opcode },
8036 { Bad_Opcode },
8037 { Bad_Opcode },
8038 /* a8 */
8039 { Bad_Opcode },
8040 { Bad_Opcode },
8041 { Bad_Opcode },
8042 { Bad_Opcode },
8043 { Bad_Opcode },
8044 { Bad_Opcode },
8045 { Bad_Opcode },
8046 { Bad_Opcode },
8047 /* b0 */
8048 { Bad_Opcode },
8049 { Bad_Opcode },
8050 { Bad_Opcode },
8051 { Bad_Opcode },
8052 { Bad_Opcode },
8053 { Bad_Opcode },
8054 { Bad_Opcode },
8055 { Bad_Opcode },
8056 /* b8 */
8057 { Bad_Opcode },
8058 { Bad_Opcode },
8059 { Bad_Opcode },
8060 { Bad_Opcode },
8061 { Bad_Opcode },
8062 { Bad_Opcode },
8063 { Bad_Opcode },
8064 { Bad_Opcode },
8065 /* c0 */
8066 { Bad_Opcode },
8067 { "vphaddbw", { XM, EXxmm }, 0 },
8068 { "vphaddbd", { XM, EXxmm }, 0 },
8069 { "vphaddbq", { XM, EXxmm }, 0 },
8070 { Bad_Opcode },
8071 { Bad_Opcode },
8072 { "vphaddwd", { XM, EXxmm }, 0 },
8073 { "vphaddwq", { XM, EXxmm }, 0 },
8074 /* c8 */
8075 { Bad_Opcode },
8076 { Bad_Opcode },
8077 { Bad_Opcode },
8078 { "vphadddq", { XM, EXxmm }, 0 },
8079 { Bad_Opcode },
8080 { Bad_Opcode },
8081 { Bad_Opcode },
8082 { Bad_Opcode },
8083 /* d0 */
8084 { Bad_Opcode },
8085 { "vphaddubw", { XM, EXxmm }, 0 },
8086 { "vphaddubd", { XM, EXxmm }, 0 },
8087 { "vphaddubq", { XM, EXxmm }, 0 },
8088 { Bad_Opcode },
8089 { Bad_Opcode },
8090 { "vphadduwd", { XM, EXxmm }, 0 },
8091 { "vphadduwq", { XM, EXxmm }, 0 },
8092 /* d8 */
8093 { Bad_Opcode },
8094 { Bad_Opcode },
8095 { Bad_Opcode },
8096 { "vphaddudq", { XM, EXxmm }, 0 },
8097 { Bad_Opcode },
8098 { Bad_Opcode },
8099 { Bad_Opcode },
8100 { Bad_Opcode },
8101 /* e0 */
8102 { Bad_Opcode },
8103 { "vphsubbw", { XM, EXxmm }, 0 },
8104 { "vphsubwd", { XM, EXxmm }, 0 },
8105 { "vphsubdq", { XM, EXxmm }, 0 },
8106 { Bad_Opcode },
8107 { Bad_Opcode },
8108 { Bad_Opcode },
8109 { Bad_Opcode },
8110 /* e8 */
8111 { Bad_Opcode },
8112 { Bad_Opcode },
8113 { Bad_Opcode },
8114 { Bad_Opcode },
8115 { Bad_Opcode },
8116 { Bad_Opcode },
8117 { Bad_Opcode },
8118 { Bad_Opcode },
8119 /* f0 */
8120 { Bad_Opcode },
8121 { Bad_Opcode },
8122 { Bad_Opcode },
8123 { Bad_Opcode },
8124 { Bad_Opcode },
8125 { Bad_Opcode },
8126 { Bad_Opcode },
8127 { Bad_Opcode },
8128 /* f8 */
8129 { Bad_Opcode },
8130 { Bad_Opcode },
8131 { Bad_Opcode },
8132 { Bad_Opcode },
8133 { Bad_Opcode },
8134 { Bad_Opcode },
8135 { Bad_Opcode },
8136 { Bad_Opcode },
8137 },
8138 /* XOP_0A */
8139 {
8140 /* 00 */
8141 { Bad_Opcode },
8142 { Bad_Opcode },
8143 { Bad_Opcode },
8144 { Bad_Opcode },
8145 { Bad_Opcode },
8146 { Bad_Opcode },
8147 { Bad_Opcode },
8148 { Bad_Opcode },
8149 /* 08 */
8150 { Bad_Opcode },
8151 { Bad_Opcode },
8152 { Bad_Opcode },
8153 { Bad_Opcode },
8154 { Bad_Opcode },
8155 { Bad_Opcode },
8156 { Bad_Opcode },
8157 { Bad_Opcode },
8158 /* 10 */
8159 { "bextrS", { Gdq, Edq, Id }, 0 },
8160 { Bad_Opcode },
8161 { REG_TABLE (REG_XOP_LWP) },
8162 { Bad_Opcode },
8163 { Bad_Opcode },
8164 { Bad_Opcode },
8165 { Bad_Opcode },
8166 { Bad_Opcode },
8167 /* 18 */
8168 { Bad_Opcode },
8169 { Bad_Opcode },
8170 { Bad_Opcode },
8171 { Bad_Opcode },
8172 { Bad_Opcode },
8173 { Bad_Opcode },
8174 { Bad_Opcode },
8175 { Bad_Opcode },
8176 /* 20 */
8177 { Bad_Opcode },
8178 { Bad_Opcode },
8179 { Bad_Opcode },
8180 { Bad_Opcode },
8181 { Bad_Opcode },
8182 { Bad_Opcode },
8183 { Bad_Opcode },
8184 { Bad_Opcode },
8185 /* 28 */
8186 { Bad_Opcode },
8187 { Bad_Opcode },
8188 { Bad_Opcode },
8189 { Bad_Opcode },
8190 { Bad_Opcode },
8191 { Bad_Opcode },
8192 { Bad_Opcode },
8193 { Bad_Opcode },
8194 /* 30 */
8195 { Bad_Opcode },
8196 { Bad_Opcode },
8197 { Bad_Opcode },
8198 { Bad_Opcode },
8199 { Bad_Opcode },
8200 { Bad_Opcode },
8201 { Bad_Opcode },
8202 { Bad_Opcode },
8203 /* 38 */
8204 { Bad_Opcode },
8205 { Bad_Opcode },
8206 { Bad_Opcode },
8207 { Bad_Opcode },
8208 { Bad_Opcode },
8209 { Bad_Opcode },
8210 { Bad_Opcode },
8211 { Bad_Opcode },
8212 /* 40 */
8213 { Bad_Opcode },
8214 { Bad_Opcode },
8215 { Bad_Opcode },
8216 { Bad_Opcode },
8217 { Bad_Opcode },
8218 { Bad_Opcode },
8219 { Bad_Opcode },
8220 { Bad_Opcode },
8221 /* 48 */
8222 { Bad_Opcode },
8223 { Bad_Opcode },
8224 { Bad_Opcode },
8225 { Bad_Opcode },
8226 { Bad_Opcode },
8227 { Bad_Opcode },
8228 { Bad_Opcode },
8229 { Bad_Opcode },
8230 /* 50 */
8231 { Bad_Opcode },
8232 { Bad_Opcode },
8233 { Bad_Opcode },
8234 { Bad_Opcode },
8235 { Bad_Opcode },
8236 { Bad_Opcode },
8237 { Bad_Opcode },
8238 { Bad_Opcode },
8239 /* 58 */
8240 { Bad_Opcode },
8241 { Bad_Opcode },
8242 { Bad_Opcode },
8243 { Bad_Opcode },
8244 { Bad_Opcode },
8245 { Bad_Opcode },
8246 { Bad_Opcode },
8247 { Bad_Opcode },
8248 /* 60 */
8249 { Bad_Opcode },
8250 { Bad_Opcode },
8251 { Bad_Opcode },
8252 { Bad_Opcode },
8253 { Bad_Opcode },
8254 { Bad_Opcode },
8255 { Bad_Opcode },
8256 { Bad_Opcode },
8257 /* 68 */
8258 { Bad_Opcode },
8259 { Bad_Opcode },
8260 { Bad_Opcode },
8261 { Bad_Opcode },
8262 { Bad_Opcode },
8263 { Bad_Opcode },
8264 { Bad_Opcode },
8265 { Bad_Opcode },
8266 /* 70 */
8267 { Bad_Opcode },
8268 { Bad_Opcode },
8269 { Bad_Opcode },
8270 { Bad_Opcode },
8271 { Bad_Opcode },
8272 { Bad_Opcode },
8273 { Bad_Opcode },
8274 { Bad_Opcode },
8275 /* 78 */
8276 { Bad_Opcode },
8277 { Bad_Opcode },
8278 { Bad_Opcode },
8279 { Bad_Opcode },
8280 { Bad_Opcode },
8281 { Bad_Opcode },
8282 { Bad_Opcode },
8283 { Bad_Opcode },
8284 /* 80 */
8285 { Bad_Opcode },
8286 { Bad_Opcode },
8287 { Bad_Opcode },
8288 { Bad_Opcode },
8289 { Bad_Opcode },
8290 { Bad_Opcode },
8291 { Bad_Opcode },
8292 { Bad_Opcode },
8293 /* 88 */
8294 { Bad_Opcode },
8295 { Bad_Opcode },
8296 { Bad_Opcode },
8297 { Bad_Opcode },
8298 { Bad_Opcode },
8299 { Bad_Opcode },
8300 { Bad_Opcode },
8301 { Bad_Opcode },
8302 /* 90 */
8303 { Bad_Opcode },
8304 { Bad_Opcode },
8305 { Bad_Opcode },
8306 { Bad_Opcode },
8307 { Bad_Opcode },
8308 { Bad_Opcode },
8309 { Bad_Opcode },
8310 { Bad_Opcode },
8311 /* 98 */
8312 { Bad_Opcode },
8313 { Bad_Opcode },
8314 { Bad_Opcode },
8315 { Bad_Opcode },
8316 { Bad_Opcode },
8317 { Bad_Opcode },
8318 { Bad_Opcode },
8319 { Bad_Opcode },
8320 /* a0 */
8321 { Bad_Opcode },
8322 { Bad_Opcode },
8323 { Bad_Opcode },
8324 { Bad_Opcode },
8325 { Bad_Opcode },
8326 { Bad_Opcode },
8327 { Bad_Opcode },
8328 { Bad_Opcode },
8329 /* a8 */
8330 { Bad_Opcode },
8331 { Bad_Opcode },
8332 { Bad_Opcode },
8333 { Bad_Opcode },
8334 { Bad_Opcode },
8335 { Bad_Opcode },
8336 { Bad_Opcode },
8337 { Bad_Opcode },
8338 /* b0 */
8339 { Bad_Opcode },
8340 { Bad_Opcode },
8341 { Bad_Opcode },
8342 { Bad_Opcode },
8343 { Bad_Opcode },
8344 { Bad_Opcode },
8345 { Bad_Opcode },
8346 { Bad_Opcode },
8347 /* b8 */
8348 { Bad_Opcode },
8349 { Bad_Opcode },
8350 { Bad_Opcode },
8351 { Bad_Opcode },
8352 { Bad_Opcode },
8353 { Bad_Opcode },
8354 { Bad_Opcode },
8355 { Bad_Opcode },
8356 /* c0 */
8357 { Bad_Opcode },
8358 { Bad_Opcode },
8359 { Bad_Opcode },
8360 { Bad_Opcode },
8361 { Bad_Opcode },
8362 { Bad_Opcode },
8363 { Bad_Opcode },
8364 { Bad_Opcode },
8365 /* c8 */
8366 { Bad_Opcode },
8367 { Bad_Opcode },
8368 { Bad_Opcode },
8369 { Bad_Opcode },
8370 { Bad_Opcode },
8371 { Bad_Opcode },
8372 { Bad_Opcode },
8373 { Bad_Opcode },
8374 /* d0 */
8375 { Bad_Opcode },
8376 { Bad_Opcode },
8377 { Bad_Opcode },
8378 { Bad_Opcode },
8379 { Bad_Opcode },
8380 { Bad_Opcode },
8381 { Bad_Opcode },
8382 { Bad_Opcode },
8383 /* d8 */
8384 { Bad_Opcode },
8385 { Bad_Opcode },
8386 { Bad_Opcode },
8387 { Bad_Opcode },
8388 { Bad_Opcode },
8389 { Bad_Opcode },
8390 { Bad_Opcode },
8391 { Bad_Opcode },
8392 /* e0 */
8393 { Bad_Opcode },
8394 { Bad_Opcode },
8395 { Bad_Opcode },
8396 { Bad_Opcode },
8397 { Bad_Opcode },
8398 { Bad_Opcode },
8399 { Bad_Opcode },
8400 { Bad_Opcode },
8401 /* e8 */
8402 { Bad_Opcode },
8403 { Bad_Opcode },
8404 { Bad_Opcode },
8405 { Bad_Opcode },
8406 { Bad_Opcode },
8407 { Bad_Opcode },
8408 { Bad_Opcode },
8409 { Bad_Opcode },
8410 /* f0 */
8411 { Bad_Opcode },
8412 { Bad_Opcode },
8413 { Bad_Opcode },
8414 { Bad_Opcode },
8415 { Bad_Opcode },
8416 { Bad_Opcode },
8417 { Bad_Opcode },
8418 { Bad_Opcode },
8419 /* f8 */
8420 { Bad_Opcode },
8421 { Bad_Opcode },
8422 { Bad_Opcode },
8423 { Bad_Opcode },
8424 { Bad_Opcode },
8425 { Bad_Opcode },
8426 { Bad_Opcode },
8427 { Bad_Opcode },
8428 },
8429 };
8430
8431 static const struct dis386 vex_table[][256] = {
8432 /* VEX_0F */
8433 {
8434 /* 00 */
8435 { Bad_Opcode },
8436 { Bad_Opcode },
8437 { Bad_Opcode },
8438 { Bad_Opcode },
8439 { Bad_Opcode },
8440 { Bad_Opcode },
8441 { Bad_Opcode },
8442 { Bad_Opcode },
8443 /* 08 */
8444 { Bad_Opcode },
8445 { Bad_Opcode },
8446 { Bad_Opcode },
8447 { Bad_Opcode },
8448 { Bad_Opcode },
8449 { Bad_Opcode },
8450 { Bad_Opcode },
8451 { Bad_Opcode },
8452 /* 10 */
8453 { PREFIX_TABLE (PREFIX_VEX_0F10) },
8454 { PREFIX_TABLE (PREFIX_VEX_0F11) },
8455 { PREFIX_TABLE (PREFIX_VEX_0F12) },
8456 { MOD_TABLE (MOD_VEX_0F13) },
8457 { "vunpcklpX", { XM, Vex, EXx }, 0 },
8458 { "vunpckhpX", { XM, Vex, EXx }, 0 },
8459 { PREFIX_TABLE (PREFIX_VEX_0F16) },
8460 { MOD_TABLE (MOD_VEX_0F17) },
8461 /* 18 */
8462 { Bad_Opcode },
8463 { Bad_Opcode },
8464 { Bad_Opcode },
8465 { Bad_Opcode },
8466 { Bad_Opcode },
8467 { Bad_Opcode },
8468 { Bad_Opcode },
8469 { Bad_Opcode },
8470 /* 20 */
8471 { Bad_Opcode },
8472 { Bad_Opcode },
8473 { Bad_Opcode },
8474 { Bad_Opcode },
8475 { Bad_Opcode },
8476 { Bad_Opcode },
8477 { Bad_Opcode },
8478 { Bad_Opcode },
8479 /* 28 */
8480 { "vmovapX", { XM, EXx }, 0 },
8481 { "vmovapX", { EXxS, XM }, 0 },
8482 { PREFIX_TABLE (PREFIX_VEX_0F2A) },
8483 { MOD_TABLE (MOD_VEX_0F2B) },
8484 { PREFIX_TABLE (PREFIX_VEX_0F2C) },
8485 { PREFIX_TABLE (PREFIX_VEX_0F2D) },
8486 { PREFIX_TABLE (PREFIX_VEX_0F2E) },
8487 { PREFIX_TABLE (PREFIX_VEX_0F2F) },
8488 /* 30 */
8489 { Bad_Opcode },
8490 { Bad_Opcode },
8491 { Bad_Opcode },
8492 { Bad_Opcode },
8493 { Bad_Opcode },
8494 { Bad_Opcode },
8495 { Bad_Opcode },
8496 { Bad_Opcode },
8497 /* 38 */
8498 { Bad_Opcode },
8499 { Bad_Opcode },
8500 { Bad_Opcode },
8501 { Bad_Opcode },
8502 { Bad_Opcode },
8503 { Bad_Opcode },
8504 { Bad_Opcode },
8505 { Bad_Opcode },
8506 /* 40 */
8507 { Bad_Opcode },
8508 { PREFIX_TABLE (PREFIX_VEX_0F41) },
8509 { PREFIX_TABLE (PREFIX_VEX_0F42) },
8510 { Bad_Opcode },
8511 { PREFIX_TABLE (PREFIX_VEX_0F44) },
8512 { PREFIX_TABLE (PREFIX_VEX_0F45) },
8513 { PREFIX_TABLE (PREFIX_VEX_0F46) },
8514 { PREFIX_TABLE (PREFIX_VEX_0F47) },
8515 /* 48 */
8516 { Bad_Opcode },
8517 { Bad_Opcode },
8518 { PREFIX_TABLE (PREFIX_VEX_0F4A) },
8519 { PREFIX_TABLE (PREFIX_VEX_0F4B) },
8520 { Bad_Opcode },
8521 { Bad_Opcode },
8522 { Bad_Opcode },
8523 { Bad_Opcode },
8524 /* 50 */
8525 { MOD_TABLE (MOD_VEX_0F50) },
8526 { PREFIX_TABLE (PREFIX_VEX_0F51) },
8527 { PREFIX_TABLE (PREFIX_VEX_0F52) },
8528 { PREFIX_TABLE (PREFIX_VEX_0F53) },
8529 { "vandpX", { XM, Vex, EXx }, 0 },
8530 { "vandnpX", { XM, Vex, EXx }, 0 },
8531 { "vorpX", { XM, Vex, EXx }, 0 },
8532 { "vxorpX", { XM, Vex, EXx }, 0 },
8533 /* 58 */
8534 { PREFIX_TABLE (PREFIX_VEX_0F58) },
8535 { PREFIX_TABLE (PREFIX_VEX_0F59) },
8536 { PREFIX_TABLE (PREFIX_VEX_0F5A) },
8537 { PREFIX_TABLE (PREFIX_VEX_0F5B) },
8538 { PREFIX_TABLE (PREFIX_VEX_0F5C) },
8539 { PREFIX_TABLE (PREFIX_VEX_0F5D) },
8540 { PREFIX_TABLE (PREFIX_VEX_0F5E) },
8541 { PREFIX_TABLE (PREFIX_VEX_0F5F) },
8542 /* 60 */
8543 { PREFIX_TABLE (PREFIX_VEX_0F60) },
8544 { PREFIX_TABLE (PREFIX_VEX_0F61) },
8545 { PREFIX_TABLE (PREFIX_VEX_0F62) },
8546 { PREFIX_TABLE (PREFIX_VEX_0F63) },
8547 { PREFIX_TABLE (PREFIX_VEX_0F64) },
8548 { PREFIX_TABLE (PREFIX_VEX_0F65) },
8549 { PREFIX_TABLE (PREFIX_VEX_0F66) },
8550 { PREFIX_TABLE (PREFIX_VEX_0F67) },
8551 /* 68 */
8552 { PREFIX_TABLE (PREFIX_VEX_0F68) },
8553 { PREFIX_TABLE (PREFIX_VEX_0F69) },
8554 { PREFIX_TABLE (PREFIX_VEX_0F6A) },
8555 { PREFIX_TABLE (PREFIX_VEX_0F6B) },
8556 { PREFIX_TABLE (PREFIX_VEX_0F6C) },
8557 { PREFIX_TABLE (PREFIX_VEX_0F6D) },
8558 { PREFIX_TABLE (PREFIX_VEX_0F6E) },
8559 { PREFIX_TABLE (PREFIX_VEX_0F6F) },
8560 /* 70 */
8561 { PREFIX_TABLE (PREFIX_VEX_0F70) },
8562 { REG_TABLE (REG_VEX_0F71) },
8563 { REG_TABLE (REG_VEX_0F72) },
8564 { REG_TABLE (REG_VEX_0F73) },
8565 { PREFIX_TABLE (PREFIX_VEX_0F74) },
8566 { PREFIX_TABLE (PREFIX_VEX_0F75) },
8567 { PREFIX_TABLE (PREFIX_VEX_0F76) },
8568 { PREFIX_TABLE (PREFIX_VEX_0F77) },
8569 /* 78 */
8570 { Bad_Opcode },
8571 { Bad_Opcode },
8572 { Bad_Opcode },
8573 { Bad_Opcode },
8574 { PREFIX_TABLE (PREFIX_VEX_0F7C) },
8575 { PREFIX_TABLE (PREFIX_VEX_0F7D) },
8576 { PREFIX_TABLE (PREFIX_VEX_0F7E) },
8577 { PREFIX_TABLE (PREFIX_VEX_0F7F) },
8578 /* 80 */
8579 { Bad_Opcode },
8580 { Bad_Opcode },
8581 { Bad_Opcode },
8582 { Bad_Opcode },
8583 { Bad_Opcode },
8584 { Bad_Opcode },
8585 { Bad_Opcode },
8586 { Bad_Opcode },
8587 /* 88 */
8588 { Bad_Opcode },
8589 { Bad_Opcode },
8590 { Bad_Opcode },
8591 { Bad_Opcode },
8592 { Bad_Opcode },
8593 { Bad_Opcode },
8594 { Bad_Opcode },
8595 { Bad_Opcode },
8596 /* 90 */
8597 { PREFIX_TABLE (PREFIX_VEX_0F90) },
8598 { PREFIX_TABLE (PREFIX_VEX_0F91) },
8599 { PREFIX_TABLE (PREFIX_VEX_0F92) },
8600 { PREFIX_TABLE (PREFIX_VEX_0F93) },
8601 { Bad_Opcode },
8602 { Bad_Opcode },
8603 { Bad_Opcode },
8604 { Bad_Opcode },
8605 /* 98 */
8606 { PREFIX_TABLE (PREFIX_VEX_0F98) },
8607 { PREFIX_TABLE (PREFIX_VEX_0F99) },
8608 { Bad_Opcode },
8609 { Bad_Opcode },
8610 { Bad_Opcode },
8611 { Bad_Opcode },
8612 { Bad_Opcode },
8613 { Bad_Opcode },
8614 /* a0 */
8615 { Bad_Opcode },
8616 { Bad_Opcode },
8617 { Bad_Opcode },
8618 { Bad_Opcode },
8619 { Bad_Opcode },
8620 { Bad_Opcode },
8621 { Bad_Opcode },
8622 { Bad_Opcode },
8623 /* a8 */
8624 { Bad_Opcode },
8625 { Bad_Opcode },
8626 { Bad_Opcode },
8627 { Bad_Opcode },
8628 { Bad_Opcode },
8629 { Bad_Opcode },
8630 { REG_TABLE (REG_VEX_0FAE) },
8631 { Bad_Opcode },
8632 /* b0 */
8633 { Bad_Opcode },
8634 { Bad_Opcode },
8635 { Bad_Opcode },
8636 { Bad_Opcode },
8637 { Bad_Opcode },
8638 { Bad_Opcode },
8639 { Bad_Opcode },
8640 { Bad_Opcode },
8641 /* b8 */
8642 { Bad_Opcode },
8643 { Bad_Opcode },
8644 { Bad_Opcode },
8645 { Bad_Opcode },
8646 { Bad_Opcode },
8647 { Bad_Opcode },
8648 { Bad_Opcode },
8649 { Bad_Opcode },
8650 /* c0 */
8651 { Bad_Opcode },
8652 { Bad_Opcode },
8653 { PREFIX_TABLE (PREFIX_VEX_0FC2) },
8654 { Bad_Opcode },
8655 { PREFIX_TABLE (PREFIX_VEX_0FC4) },
8656 { PREFIX_TABLE (PREFIX_VEX_0FC5) },
8657 { "vshufpX", { XM, Vex, EXx, Ib }, 0 },
8658 { Bad_Opcode },
8659 /* c8 */
8660 { Bad_Opcode },
8661 { Bad_Opcode },
8662 { Bad_Opcode },
8663 { Bad_Opcode },
8664 { Bad_Opcode },
8665 { Bad_Opcode },
8666 { Bad_Opcode },
8667 { Bad_Opcode },
8668 /* d0 */
8669 { PREFIX_TABLE (PREFIX_VEX_0FD0) },
8670 { PREFIX_TABLE (PREFIX_VEX_0FD1) },
8671 { PREFIX_TABLE (PREFIX_VEX_0FD2) },
8672 { PREFIX_TABLE (PREFIX_VEX_0FD3) },
8673 { PREFIX_TABLE (PREFIX_VEX_0FD4) },
8674 { PREFIX_TABLE (PREFIX_VEX_0FD5) },
8675 { PREFIX_TABLE (PREFIX_VEX_0FD6) },
8676 { PREFIX_TABLE (PREFIX_VEX_0FD7) },
8677 /* d8 */
8678 { PREFIX_TABLE (PREFIX_VEX_0FD8) },
8679 { PREFIX_TABLE (PREFIX_VEX_0FD9) },
8680 { PREFIX_TABLE (PREFIX_VEX_0FDA) },
8681 { PREFIX_TABLE (PREFIX_VEX_0FDB) },
8682 { PREFIX_TABLE (PREFIX_VEX_0FDC) },
8683 { PREFIX_TABLE (PREFIX_VEX_0FDD) },
8684 { PREFIX_TABLE (PREFIX_VEX_0FDE) },
8685 { PREFIX_TABLE (PREFIX_VEX_0FDF) },
8686 /* e0 */
8687 { PREFIX_TABLE (PREFIX_VEX_0FE0) },
8688 { PREFIX_TABLE (PREFIX_VEX_0FE1) },
8689 { PREFIX_TABLE (PREFIX_VEX_0FE2) },
8690 { PREFIX_TABLE (PREFIX_VEX_0FE3) },
8691 { PREFIX_TABLE (PREFIX_VEX_0FE4) },
8692 { PREFIX_TABLE (PREFIX_VEX_0FE5) },
8693 { PREFIX_TABLE (PREFIX_VEX_0FE6) },
8694 { PREFIX_TABLE (PREFIX_VEX_0FE7) },
8695 /* e8 */
8696 { PREFIX_TABLE (PREFIX_VEX_0FE8) },
8697 { PREFIX_TABLE (PREFIX_VEX_0FE9) },
8698 { PREFIX_TABLE (PREFIX_VEX_0FEA) },
8699 { PREFIX_TABLE (PREFIX_VEX_0FEB) },
8700 { PREFIX_TABLE (PREFIX_VEX_0FEC) },
8701 { PREFIX_TABLE (PREFIX_VEX_0FED) },
8702 { PREFIX_TABLE (PREFIX_VEX_0FEE) },
8703 { PREFIX_TABLE (PREFIX_VEX_0FEF) },
8704 /* f0 */
8705 { PREFIX_TABLE (PREFIX_VEX_0FF0) },
8706 { PREFIX_TABLE (PREFIX_VEX_0FF1) },
8707 { PREFIX_TABLE (PREFIX_VEX_0FF2) },
8708 { PREFIX_TABLE (PREFIX_VEX_0FF3) },
8709 { PREFIX_TABLE (PREFIX_VEX_0FF4) },
8710 { PREFIX_TABLE (PREFIX_VEX_0FF5) },
8711 { PREFIX_TABLE (PREFIX_VEX_0FF6) },
8712 { PREFIX_TABLE (PREFIX_VEX_0FF7) },
8713 /* f8 */
8714 { PREFIX_TABLE (PREFIX_VEX_0FF8) },
8715 { PREFIX_TABLE (PREFIX_VEX_0FF9) },
8716 { PREFIX_TABLE (PREFIX_VEX_0FFA) },
8717 { PREFIX_TABLE (PREFIX_VEX_0FFB) },
8718 { PREFIX_TABLE (PREFIX_VEX_0FFC) },
8719 { PREFIX_TABLE (PREFIX_VEX_0FFD) },
8720 { PREFIX_TABLE (PREFIX_VEX_0FFE) },
8721 { Bad_Opcode },
8722 },
8723 /* VEX_0F38 */
8724 {
8725 /* 00 */
8726 { PREFIX_TABLE (PREFIX_VEX_0F3800) },
8727 { PREFIX_TABLE (PREFIX_VEX_0F3801) },
8728 { PREFIX_TABLE (PREFIX_VEX_0F3802) },
8729 { PREFIX_TABLE (PREFIX_VEX_0F3803) },
8730 { PREFIX_TABLE (PREFIX_VEX_0F3804) },
8731 { PREFIX_TABLE (PREFIX_VEX_0F3805) },
8732 { PREFIX_TABLE (PREFIX_VEX_0F3806) },
8733 { PREFIX_TABLE (PREFIX_VEX_0F3807) },
8734 /* 08 */
8735 { PREFIX_TABLE (PREFIX_VEX_0F3808) },
8736 { PREFIX_TABLE (PREFIX_VEX_0F3809) },
8737 { PREFIX_TABLE (PREFIX_VEX_0F380A) },
8738 { PREFIX_TABLE (PREFIX_VEX_0F380B) },
8739 { PREFIX_TABLE (PREFIX_VEX_0F380C) },
8740 { PREFIX_TABLE (PREFIX_VEX_0F380D) },
8741 { PREFIX_TABLE (PREFIX_VEX_0F380E) },
8742 { PREFIX_TABLE (PREFIX_VEX_0F380F) },
8743 /* 10 */
8744 { Bad_Opcode },
8745 { Bad_Opcode },
8746 { Bad_Opcode },
8747 { PREFIX_TABLE (PREFIX_VEX_0F3813) },
8748 { Bad_Opcode },
8749 { Bad_Opcode },
8750 { PREFIX_TABLE (PREFIX_VEX_0F3816) },
8751 { PREFIX_TABLE (PREFIX_VEX_0F3817) },
8752 /* 18 */
8753 { PREFIX_TABLE (PREFIX_VEX_0F3818) },
8754 { PREFIX_TABLE (PREFIX_VEX_0F3819) },
8755 { PREFIX_TABLE (PREFIX_VEX_0F381A) },
8756 { Bad_Opcode },
8757 { PREFIX_TABLE (PREFIX_VEX_0F381C) },
8758 { PREFIX_TABLE (PREFIX_VEX_0F381D) },
8759 { PREFIX_TABLE (PREFIX_VEX_0F381E) },
8760 { Bad_Opcode },
8761 /* 20 */
8762 { PREFIX_TABLE (PREFIX_VEX_0F3820) },
8763 { PREFIX_TABLE (PREFIX_VEX_0F3821) },
8764 { PREFIX_TABLE (PREFIX_VEX_0F3822) },
8765 { PREFIX_TABLE (PREFIX_VEX_0F3823) },
8766 { PREFIX_TABLE (PREFIX_VEX_0F3824) },
8767 { PREFIX_TABLE (PREFIX_VEX_0F3825) },
8768 { Bad_Opcode },
8769 { Bad_Opcode },
8770 /* 28 */
8771 { PREFIX_TABLE (PREFIX_VEX_0F3828) },
8772 { PREFIX_TABLE (PREFIX_VEX_0F3829) },
8773 { PREFIX_TABLE (PREFIX_VEX_0F382A) },
8774 { PREFIX_TABLE (PREFIX_VEX_0F382B) },
8775 { PREFIX_TABLE (PREFIX_VEX_0F382C) },
8776 { PREFIX_TABLE (PREFIX_VEX_0F382D) },
8777 { PREFIX_TABLE (PREFIX_VEX_0F382E) },
8778 { PREFIX_TABLE (PREFIX_VEX_0F382F) },
8779 /* 30 */
8780 { PREFIX_TABLE (PREFIX_VEX_0F3830) },
8781 { PREFIX_TABLE (PREFIX_VEX_0F3831) },
8782 { PREFIX_TABLE (PREFIX_VEX_0F3832) },
8783 { PREFIX_TABLE (PREFIX_VEX_0F3833) },
8784 { PREFIX_TABLE (PREFIX_VEX_0F3834) },
8785 { PREFIX_TABLE (PREFIX_VEX_0F3835) },
8786 { PREFIX_TABLE (PREFIX_VEX_0F3836) },
8787 { PREFIX_TABLE (PREFIX_VEX_0F3837) },
8788 /* 38 */
8789 { PREFIX_TABLE (PREFIX_VEX_0F3838) },
8790 { PREFIX_TABLE (PREFIX_VEX_0F3839) },
8791 { PREFIX_TABLE (PREFIX_VEX_0F383A) },
8792 { PREFIX_TABLE (PREFIX_VEX_0F383B) },
8793 { PREFIX_TABLE (PREFIX_VEX_0F383C) },
8794 { PREFIX_TABLE (PREFIX_VEX_0F383D) },
8795 { PREFIX_TABLE (PREFIX_VEX_0F383E) },
8796 { PREFIX_TABLE (PREFIX_VEX_0F383F) },
8797 /* 40 */
8798 { PREFIX_TABLE (PREFIX_VEX_0F3840) },
8799 { PREFIX_TABLE (PREFIX_VEX_0F3841) },
8800 { Bad_Opcode },
8801 { Bad_Opcode },
8802 { Bad_Opcode },
8803 { PREFIX_TABLE (PREFIX_VEX_0F3845) },
8804 { PREFIX_TABLE (PREFIX_VEX_0F3846) },
8805 { PREFIX_TABLE (PREFIX_VEX_0F3847) },
8806 /* 48 */
8807 { Bad_Opcode },
8808 { Bad_Opcode },
8809 { Bad_Opcode },
8810 { Bad_Opcode },
8811 { Bad_Opcode },
8812 { Bad_Opcode },
8813 { Bad_Opcode },
8814 { Bad_Opcode },
8815 /* 50 */
8816 { Bad_Opcode },
8817 { Bad_Opcode },
8818 { Bad_Opcode },
8819 { Bad_Opcode },
8820 { Bad_Opcode },
8821 { Bad_Opcode },
8822 { Bad_Opcode },
8823 { Bad_Opcode },
8824 /* 58 */
8825 { PREFIX_TABLE (PREFIX_VEX_0F3858) },
8826 { PREFIX_TABLE (PREFIX_VEX_0F3859) },
8827 { PREFIX_TABLE (PREFIX_VEX_0F385A) },
8828 { Bad_Opcode },
8829 { Bad_Opcode },
8830 { Bad_Opcode },
8831 { Bad_Opcode },
8832 { Bad_Opcode },
8833 /* 60 */
8834 { Bad_Opcode },
8835 { Bad_Opcode },
8836 { Bad_Opcode },
8837 { Bad_Opcode },
8838 { Bad_Opcode },
8839 { Bad_Opcode },
8840 { Bad_Opcode },
8841 { Bad_Opcode },
8842 /* 68 */
8843 { Bad_Opcode },
8844 { Bad_Opcode },
8845 { Bad_Opcode },
8846 { Bad_Opcode },
8847 { Bad_Opcode },
8848 { Bad_Opcode },
8849 { Bad_Opcode },
8850 { Bad_Opcode },
8851 /* 70 */
8852 { Bad_Opcode },
8853 { Bad_Opcode },
8854 { Bad_Opcode },
8855 { Bad_Opcode },
8856 { Bad_Opcode },
8857 { Bad_Opcode },
8858 { Bad_Opcode },
8859 { Bad_Opcode },
8860 /* 78 */
8861 { PREFIX_TABLE (PREFIX_VEX_0F3878) },
8862 { PREFIX_TABLE (PREFIX_VEX_0F3879) },
8863 { Bad_Opcode },
8864 { Bad_Opcode },
8865 { Bad_Opcode },
8866 { Bad_Opcode },
8867 { Bad_Opcode },
8868 { Bad_Opcode },
8869 /* 80 */
8870 { Bad_Opcode },
8871 { Bad_Opcode },
8872 { Bad_Opcode },
8873 { Bad_Opcode },
8874 { Bad_Opcode },
8875 { Bad_Opcode },
8876 { Bad_Opcode },
8877 { Bad_Opcode },
8878 /* 88 */
8879 { Bad_Opcode },
8880 { Bad_Opcode },
8881 { Bad_Opcode },
8882 { Bad_Opcode },
8883 { PREFIX_TABLE (PREFIX_VEX_0F388C) },
8884 { Bad_Opcode },
8885 { PREFIX_TABLE (PREFIX_VEX_0F388E) },
8886 { Bad_Opcode },
8887 /* 90 */
8888 { PREFIX_TABLE (PREFIX_VEX_0F3890) },
8889 { PREFIX_TABLE (PREFIX_VEX_0F3891) },
8890 { PREFIX_TABLE (PREFIX_VEX_0F3892) },
8891 { PREFIX_TABLE (PREFIX_VEX_0F3893) },
8892 { Bad_Opcode },
8893 { Bad_Opcode },
8894 { PREFIX_TABLE (PREFIX_VEX_0F3896) },
8895 { PREFIX_TABLE (PREFIX_VEX_0F3897) },
8896 /* 98 */
8897 { PREFIX_TABLE (PREFIX_VEX_0F3898) },
8898 { PREFIX_TABLE (PREFIX_VEX_0F3899) },
8899 { PREFIX_TABLE (PREFIX_VEX_0F389A) },
8900 { PREFIX_TABLE (PREFIX_VEX_0F389B) },
8901 { PREFIX_TABLE (PREFIX_VEX_0F389C) },
8902 { PREFIX_TABLE (PREFIX_VEX_0F389D) },
8903 { PREFIX_TABLE (PREFIX_VEX_0F389E) },
8904 { PREFIX_TABLE (PREFIX_VEX_0F389F) },
8905 /* a0 */
8906 { Bad_Opcode },
8907 { Bad_Opcode },
8908 { Bad_Opcode },
8909 { Bad_Opcode },
8910 { Bad_Opcode },
8911 { Bad_Opcode },
8912 { PREFIX_TABLE (PREFIX_VEX_0F38A6) },
8913 { PREFIX_TABLE (PREFIX_VEX_0F38A7) },
8914 /* a8 */
8915 { PREFIX_TABLE (PREFIX_VEX_0F38A8) },
8916 { PREFIX_TABLE (PREFIX_VEX_0F38A9) },
8917 { PREFIX_TABLE (PREFIX_VEX_0F38AA) },
8918 { PREFIX_TABLE (PREFIX_VEX_0F38AB) },
8919 { PREFIX_TABLE (PREFIX_VEX_0F38AC) },
8920 { PREFIX_TABLE (PREFIX_VEX_0F38AD) },
8921 { PREFIX_TABLE (PREFIX_VEX_0F38AE) },
8922 { PREFIX_TABLE (PREFIX_VEX_0F38AF) },
8923 /* b0 */
8924 { Bad_Opcode },
8925 { Bad_Opcode },
8926 { Bad_Opcode },
8927 { Bad_Opcode },
8928 { Bad_Opcode },
8929 { Bad_Opcode },
8930 { PREFIX_TABLE (PREFIX_VEX_0F38B6) },
8931 { PREFIX_TABLE (PREFIX_VEX_0F38B7) },
8932 /* b8 */
8933 { PREFIX_TABLE (PREFIX_VEX_0F38B8) },
8934 { PREFIX_TABLE (PREFIX_VEX_0F38B9) },
8935 { PREFIX_TABLE (PREFIX_VEX_0F38BA) },
8936 { PREFIX_TABLE (PREFIX_VEX_0F38BB) },
8937 { PREFIX_TABLE (PREFIX_VEX_0F38BC) },
8938 { PREFIX_TABLE (PREFIX_VEX_0F38BD) },
8939 { PREFIX_TABLE (PREFIX_VEX_0F38BE) },
8940 { PREFIX_TABLE (PREFIX_VEX_0F38BF) },
8941 /* c0 */
8942 { Bad_Opcode },
8943 { Bad_Opcode },
8944 { Bad_Opcode },
8945 { Bad_Opcode },
8946 { Bad_Opcode },
8947 { Bad_Opcode },
8948 { Bad_Opcode },
8949 { Bad_Opcode },
8950 /* c8 */
8951 { Bad_Opcode },
8952 { Bad_Opcode },
8953 { Bad_Opcode },
8954 { Bad_Opcode },
8955 { Bad_Opcode },
8956 { Bad_Opcode },
8957 { Bad_Opcode },
8958 { PREFIX_TABLE (PREFIX_VEX_0F38CF) },
8959 /* d0 */
8960 { Bad_Opcode },
8961 { Bad_Opcode },
8962 { Bad_Opcode },
8963 { Bad_Opcode },
8964 { Bad_Opcode },
8965 { Bad_Opcode },
8966 { Bad_Opcode },
8967 { Bad_Opcode },
8968 /* d8 */
8969 { Bad_Opcode },
8970 { Bad_Opcode },
8971 { Bad_Opcode },
8972 { PREFIX_TABLE (PREFIX_VEX_0F38DB) },
8973 { PREFIX_TABLE (PREFIX_VEX_0F38DC) },
8974 { PREFIX_TABLE (PREFIX_VEX_0F38DD) },
8975 { PREFIX_TABLE (PREFIX_VEX_0F38DE) },
8976 { PREFIX_TABLE (PREFIX_VEX_0F38DF) },
8977 /* e0 */
8978 { Bad_Opcode },
8979 { Bad_Opcode },
8980 { Bad_Opcode },
8981 { Bad_Opcode },
8982 { Bad_Opcode },
8983 { Bad_Opcode },
8984 { Bad_Opcode },
8985 { Bad_Opcode },
8986 /* e8 */
8987 { Bad_Opcode },
8988 { Bad_Opcode },
8989 { Bad_Opcode },
8990 { Bad_Opcode },
8991 { Bad_Opcode },
8992 { Bad_Opcode },
8993 { Bad_Opcode },
8994 { Bad_Opcode },
8995 /* f0 */
8996 { Bad_Opcode },
8997 { Bad_Opcode },
8998 { PREFIX_TABLE (PREFIX_VEX_0F38F2) },
8999 { REG_TABLE (REG_VEX_0F38F3) },
9000 { Bad_Opcode },
9001 { PREFIX_TABLE (PREFIX_VEX_0F38F5) },
9002 { PREFIX_TABLE (PREFIX_VEX_0F38F6) },
9003 { PREFIX_TABLE (PREFIX_VEX_0F38F7) },
9004 /* f8 */
9005 { Bad_Opcode },
9006 { Bad_Opcode },
9007 { Bad_Opcode },
9008 { Bad_Opcode },
9009 { Bad_Opcode },
9010 { Bad_Opcode },
9011 { Bad_Opcode },
9012 { Bad_Opcode },
9013 },
9014 /* VEX_0F3A */
9015 {
9016 /* 00 */
9017 { PREFIX_TABLE (PREFIX_VEX_0F3A00) },
9018 { PREFIX_TABLE (PREFIX_VEX_0F3A01) },
9019 { PREFIX_TABLE (PREFIX_VEX_0F3A02) },
9020 { Bad_Opcode },
9021 { PREFIX_TABLE (PREFIX_VEX_0F3A04) },
9022 { PREFIX_TABLE (PREFIX_VEX_0F3A05) },
9023 { PREFIX_TABLE (PREFIX_VEX_0F3A06) },
9024 { Bad_Opcode },
9025 /* 08 */
9026 { PREFIX_TABLE (PREFIX_VEX_0F3A08) },
9027 { PREFIX_TABLE (PREFIX_VEX_0F3A09) },
9028 { PREFIX_TABLE (PREFIX_VEX_0F3A0A) },
9029 { PREFIX_TABLE (PREFIX_VEX_0F3A0B) },
9030 { PREFIX_TABLE (PREFIX_VEX_0F3A0C) },
9031 { PREFIX_TABLE (PREFIX_VEX_0F3A0D) },
9032 { PREFIX_TABLE (PREFIX_VEX_0F3A0E) },
9033 { PREFIX_TABLE (PREFIX_VEX_0F3A0F) },
9034 /* 10 */
9035 { Bad_Opcode },
9036 { Bad_Opcode },
9037 { Bad_Opcode },
9038 { Bad_Opcode },
9039 { PREFIX_TABLE (PREFIX_VEX_0F3A14) },
9040 { PREFIX_TABLE (PREFIX_VEX_0F3A15) },
9041 { PREFIX_TABLE (PREFIX_VEX_0F3A16) },
9042 { PREFIX_TABLE (PREFIX_VEX_0F3A17) },
9043 /* 18 */
9044 { PREFIX_TABLE (PREFIX_VEX_0F3A18) },
9045 { PREFIX_TABLE (PREFIX_VEX_0F3A19) },
9046 { Bad_Opcode },
9047 { Bad_Opcode },
9048 { Bad_Opcode },
9049 { PREFIX_TABLE (PREFIX_VEX_0F3A1D) },
9050 { Bad_Opcode },
9051 { Bad_Opcode },
9052 /* 20 */
9053 { PREFIX_TABLE (PREFIX_VEX_0F3A20) },
9054 { PREFIX_TABLE (PREFIX_VEX_0F3A21) },
9055 { PREFIX_TABLE (PREFIX_VEX_0F3A22) },
9056 { Bad_Opcode },
9057 { Bad_Opcode },
9058 { Bad_Opcode },
9059 { Bad_Opcode },
9060 { Bad_Opcode },
9061 /* 28 */
9062 { Bad_Opcode },
9063 { Bad_Opcode },
9064 { Bad_Opcode },
9065 { Bad_Opcode },
9066 { Bad_Opcode },
9067 { Bad_Opcode },
9068 { Bad_Opcode },
9069 { Bad_Opcode },
9070 /* 30 */
9071 { PREFIX_TABLE (PREFIX_VEX_0F3A30) },
9072 { PREFIX_TABLE (PREFIX_VEX_0F3A31) },
9073 { PREFIX_TABLE (PREFIX_VEX_0F3A32) },
9074 { PREFIX_TABLE (PREFIX_VEX_0F3A33) },
9075 { Bad_Opcode },
9076 { Bad_Opcode },
9077 { Bad_Opcode },
9078 { Bad_Opcode },
9079 /* 38 */
9080 { PREFIX_TABLE (PREFIX_VEX_0F3A38) },
9081 { PREFIX_TABLE (PREFIX_VEX_0F3A39) },
9082 { Bad_Opcode },
9083 { Bad_Opcode },
9084 { Bad_Opcode },
9085 { Bad_Opcode },
9086 { Bad_Opcode },
9087 { Bad_Opcode },
9088 /* 40 */
9089 { PREFIX_TABLE (PREFIX_VEX_0F3A40) },
9090 { PREFIX_TABLE (PREFIX_VEX_0F3A41) },
9091 { PREFIX_TABLE (PREFIX_VEX_0F3A42) },
9092 { Bad_Opcode },
9093 { PREFIX_TABLE (PREFIX_VEX_0F3A44) },
9094 { Bad_Opcode },
9095 { PREFIX_TABLE (PREFIX_VEX_0F3A46) },
9096 { Bad_Opcode },
9097 /* 48 */
9098 { PREFIX_TABLE (PREFIX_VEX_0F3A48) },
9099 { PREFIX_TABLE (PREFIX_VEX_0F3A49) },
9100 { PREFIX_TABLE (PREFIX_VEX_0F3A4A) },
9101 { PREFIX_TABLE (PREFIX_VEX_0F3A4B) },
9102 { PREFIX_TABLE (PREFIX_VEX_0F3A4C) },
9103 { Bad_Opcode },
9104 { Bad_Opcode },
9105 { Bad_Opcode },
9106 /* 50 */
9107 { Bad_Opcode },
9108 { Bad_Opcode },
9109 { Bad_Opcode },
9110 { Bad_Opcode },
9111 { Bad_Opcode },
9112 { Bad_Opcode },
9113 { Bad_Opcode },
9114 { Bad_Opcode },
9115 /* 58 */
9116 { Bad_Opcode },
9117 { Bad_Opcode },
9118 { Bad_Opcode },
9119 { Bad_Opcode },
9120 { PREFIX_TABLE (PREFIX_VEX_0F3A5C) },
9121 { PREFIX_TABLE (PREFIX_VEX_0F3A5D) },
9122 { PREFIX_TABLE (PREFIX_VEX_0F3A5E) },
9123 { PREFIX_TABLE (PREFIX_VEX_0F3A5F) },
9124 /* 60 */
9125 { PREFIX_TABLE (PREFIX_VEX_0F3A60) },
9126 { PREFIX_TABLE (PREFIX_VEX_0F3A61) },
9127 { PREFIX_TABLE (PREFIX_VEX_0F3A62) },
9128 { PREFIX_TABLE (PREFIX_VEX_0F3A63) },
9129 { Bad_Opcode },
9130 { Bad_Opcode },
9131 { Bad_Opcode },
9132 { Bad_Opcode },
9133 /* 68 */
9134 { PREFIX_TABLE (PREFIX_VEX_0F3A68) },
9135 { PREFIX_TABLE (PREFIX_VEX_0F3A69) },
9136 { PREFIX_TABLE (PREFIX_VEX_0F3A6A) },
9137 { PREFIX_TABLE (PREFIX_VEX_0F3A6B) },
9138 { PREFIX_TABLE (PREFIX_VEX_0F3A6C) },
9139 { PREFIX_TABLE (PREFIX_VEX_0F3A6D) },
9140 { PREFIX_TABLE (PREFIX_VEX_0F3A6E) },
9141 { PREFIX_TABLE (PREFIX_VEX_0F3A6F) },
9142 /* 70 */
9143 { Bad_Opcode },
9144 { Bad_Opcode },
9145 { Bad_Opcode },
9146 { Bad_Opcode },
9147 { Bad_Opcode },
9148 { Bad_Opcode },
9149 { Bad_Opcode },
9150 { Bad_Opcode },
9151 /* 78 */
9152 { PREFIX_TABLE (PREFIX_VEX_0F3A78) },
9153 { PREFIX_TABLE (PREFIX_VEX_0F3A79) },
9154 { PREFIX_TABLE (PREFIX_VEX_0F3A7A) },
9155 { PREFIX_TABLE (PREFIX_VEX_0F3A7B) },
9156 { PREFIX_TABLE (PREFIX_VEX_0F3A7C) },
9157 { PREFIX_TABLE (PREFIX_VEX_0F3A7D) },
9158 { PREFIX_TABLE (PREFIX_VEX_0F3A7E) },
9159 { PREFIX_TABLE (PREFIX_VEX_0F3A7F) },
9160 /* 80 */
9161 { Bad_Opcode },
9162 { Bad_Opcode },
9163 { Bad_Opcode },
9164 { Bad_Opcode },
9165 { Bad_Opcode },
9166 { Bad_Opcode },
9167 { Bad_Opcode },
9168 { Bad_Opcode },
9169 /* 88 */
9170 { Bad_Opcode },
9171 { Bad_Opcode },
9172 { Bad_Opcode },
9173 { Bad_Opcode },
9174 { Bad_Opcode },
9175 { Bad_Opcode },
9176 { Bad_Opcode },
9177 { Bad_Opcode },
9178 /* 90 */
9179 { Bad_Opcode },
9180 { Bad_Opcode },
9181 { Bad_Opcode },
9182 { Bad_Opcode },
9183 { Bad_Opcode },
9184 { Bad_Opcode },
9185 { Bad_Opcode },
9186 { Bad_Opcode },
9187 /* 98 */
9188 { Bad_Opcode },
9189 { Bad_Opcode },
9190 { Bad_Opcode },
9191 { Bad_Opcode },
9192 { Bad_Opcode },
9193 { Bad_Opcode },
9194 { Bad_Opcode },
9195 { Bad_Opcode },
9196 /* a0 */
9197 { Bad_Opcode },
9198 { Bad_Opcode },
9199 { Bad_Opcode },
9200 { Bad_Opcode },
9201 { Bad_Opcode },
9202 { Bad_Opcode },
9203 { Bad_Opcode },
9204 { Bad_Opcode },
9205 /* a8 */
9206 { Bad_Opcode },
9207 { Bad_Opcode },
9208 { Bad_Opcode },
9209 { Bad_Opcode },
9210 { Bad_Opcode },
9211 { Bad_Opcode },
9212 { Bad_Opcode },
9213 { Bad_Opcode },
9214 /* b0 */
9215 { Bad_Opcode },
9216 { Bad_Opcode },
9217 { Bad_Opcode },
9218 { Bad_Opcode },
9219 { Bad_Opcode },
9220 { Bad_Opcode },
9221 { Bad_Opcode },
9222 { Bad_Opcode },
9223 /* b8 */
9224 { Bad_Opcode },
9225 { Bad_Opcode },
9226 { Bad_Opcode },
9227 { Bad_Opcode },
9228 { Bad_Opcode },
9229 { Bad_Opcode },
9230 { Bad_Opcode },
9231 { Bad_Opcode },
9232 /* c0 */
9233 { Bad_Opcode },
9234 { Bad_Opcode },
9235 { Bad_Opcode },
9236 { Bad_Opcode },
9237 { Bad_Opcode },
9238 { Bad_Opcode },
9239 { Bad_Opcode },
9240 { Bad_Opcode },
9241 /* c8 */
9242 { Bad_Opcode },
9243 { Bad_Opcode },
9244 { Bad_Opcode },
9245 { Bad_Opcode },
9246 { Bad_Opcode },
9247 { Bad_Opcode },
9248 { PREFIX_TABLE(PREFIX_VEX_0F3ACE) },
9249 { PREFIX_TABLE(PREFIX_VEX_0F3ACF) },
9250 /* d0 */
9251 { Bad_Opcode },
9252 { Bad_Opcode },
9253 { Bad_Opcode },
9254 { Bad_Opcode },
9255 { Bad_Opcode },
9256 { Bad_Opcode },
9257 { Bad_Opcode },
9258 { Bad_Opcode },
9259 /* d8 */
9260 { Bad_Opcode },
9261 { Bad_Opcode },
9262 { Bad_Opcode },
9263 { Bad_Opcode },
9264 { Bad_Opcode },
9265 { Bad_Opcode },
9266 { Bad_Opcode },
9267 { PREFIX_TABLE (PREFIX_VEX_0F3ADF) },
9268 /* e0 */
9269 { Bad_Opcode },
9270 { Bad_Opcode },
9271 { Bad_Opcode },
9272 { Bad_Opcode },
9273 { Bad_Opcode },
9274 { Bad_Opcode },
9275 { Bad_Opcode },
9276 { Bad_Opcode },
9277 /* e8 */
9278 { Bad_Opcode },
9279 { Bad_Opcode },
9280 { Bad_Opcode },
9281 { Bad_Opcode },
9282 { Bad_Opcode },
9283 { Bad_Opcode },
9284 { Bad_Opcode },
9285 { Bad_Opcode },
9286 /* f0 */
9287 { PREFIX_TABLE (PREFIX_VEX_0F3AF0) },
9288 { Bad_Opcode },
9289 { Bad_Opcode },
9290 { Bad_Opcode },
9291 { Bad_Opcode },
9292 { Bad_Opcode },
9293 { Bad_Opcode },
9294 { Bad_Opcode },
9295 /* f8 */
9296 { Bad_Opcode },
9297 { Bad_Opcode },
9298 { Bad_Opcode },
9299 { Bad_Opcode },
9300 { Bad_Opcode },
9301 { Bad_Opcode },
9302 { Bad_Opcode },
9303 { Bad_Opcode },
9304 },
9305 };
9306
9307 #include "i386-dis-evex.h"
9308
9309 static const struct dis386 vex_len_table[][2] = {
9310 /* VEX_LEN_0F12_P_0_M_0 */
9311 {
9312 { "vmovlps", { XM, Vex128, EXq }, 0 },
9313 },
9314
9315 /* VEX_LEN_0F12_P_0_M_1 */
9316 {
9317 { "vmovhlps", { XM, Vex128, EXq }, 0 },
9318 },
9319
9320 /* VEX_LEN_0F12_P_2 */
9321 {
9322 { "vmovlpd", { XM, Vex128, EXq }, 0 },
9323 },
9324
9325 /* VEX_LEN_0F13_M_0 */
9326 {
9327 { "vmovlpX", { EXq, XM }, 0 },
9328 },
9329
9330 /* VEX_LEN_0F16_P_0_M_0 */
9331 {
9332 { "vmovhps", { XM, Vex128, EXq }, 0 },
9333 },
9334
9335 /* VEX_LEN_0F16_P_0_M_1 */
9336 {
9337 { "vmovlhps", { XM, Vex128, EXq }, 0 },
9338 },
9339
9340 /* VEX_LEN_0F16_P_2 */
9341 {
9342 { "vmovhpd", { XM, Vex128, EXq }, 0 },
9343 },
9344
9345 /* VEX_LEN_0F17_M_0 */
9346 {
9347 { "vmovhpX", { EXq, XM }, 0 },
9348 },
9349
9350 /* VEX_LEN_0F41_P_0 */
9351 {
9352 { Bad_Opcode },
9353 { VEX_W_TABLE (VEX_W_0F41_P_0_LEN_1) },
9354 },
9355 /* VEX_LEN_0F41_P_2 */
9356 {
9357 { Bad_Opcode },
9358 { VEX_W_TABLE (VEX_W_0F41_P_2_LEN_1) },
9359 },
9360 /* VEX_LEN_0F42_P_0 */
9361 {
9362 { Bad_Opcode },
9363 { VEX_W_TABLE (VEX_W_0F42_P_0_LEN_1) },
9364 },
9365 /* VEX_LEN_0F42_P_2 */
9366 {
9367 { Bad_Opcode },
9368 { VEX_W_TABLE (VEX_W_0F42_P_2_LEN_1) },
9369 },
9370 /* VEX_LEN_0F44_P_0 */
9371 {
9372 { VEX_W_TABLE (VEX_W_0F44_P_0_LEN_0) },
9373 },
9374 /* VEX_LEN_0F44_P_2 */
9375 {
9376 { VEX_W_TABLE (VEX_W_0F44_P_2_LEN_0) },
9377 },
9378 /* VEX_LEN_0F45_P_0 */
9379 {
9380 { Bad_Opcode },
9381 { VEX_W_TABLE (VEX_W_0F45_P_0_LEN_1) },
9382 },
9383 /* VEX_LEN_0F45_P_2 */
9384 {
9385 { Bad_Opcode },
9386 { VEX_W_TABLE (VEX_W_0F45_P_2_LEN_1) },
9387 },
9388 /* VEX_LEN_0F46_P_0 */
9389 {
9390 { Bad_Opcode },
9391 { VEX_W_TABLE (VEX_W_0F46_P_0_LEN_1) },
9392 },
9393 /* VEX_LEN_0F46_P_2 */
9394 {
9395 { Bad_Opcode },
9396 { VEX_W_TABLE (VEX_W_0F46_P_2_LEN_1) },
9397 },
9398 /* VEX_LEN_0F47_P_0 */
9399 {
9400 { Bad_Opcode },
9401 { VEX_W_TABLE (VEX_W_0F47_P_0_LEN_1) },
9402 },
9403 /* VEX_LEN_0F47_P_2 */
9404 {
9405 { Bad_Opcode },
9406 { VEX_W_TABLE (VEX_W_0F47_P_2_LEN_1) },
9407 },
9408 /* VEX_LEN_0F4A_P_0 */
9409 {
9410 { Bad_Opcode },
9411 { VEX_W_TABLE (VEX_W_0F4A_P_0_LEN_1) },
9412 },
9413 /* VEX_LEN_0F4A_P_2 */
9414 {
9415 { Bad_Opcode },
9416 { VEX_W_TABLE (VEX_W_0F4A_P_2_LEN_1) },
9417 },
9418 /* VEX_LEN_0F4B_P_0 */
9419 {
9420 { Bad_Opcode },
9421 { VEX_W_TABLE (VEX_W_0F4B_P_0_LEN_1) },
9422 },
9423 /* VEX_LEN_0F4B_P_2 */
9424 {
9425 { Bad_Opcode },
9426 { VEX_W_TABLE (VEX_W_0F4B_P_2_LEN_1) },
9427 },
9428
9429 /* VEX_LEN_0F6E_P_2 */
9430 {
9431 { "vmovK", { XMScalar, Edq }, 0 },
9432 },
9433
9434 /* VEX_LEN_0F77_P_1 */
9435 {
9436 { "vzeroupper", { XX }, 0 },
9437 { "vzeroall", { XX }, 0 },
9438 },
9439
9440 /* VEX_LEN_0F7E_P_1 */
9441 {
9442 { "vmovq", { XMScalar, EXqScalar }, 0 },
9443 },
9444
9445 /* VEX_LEN_0F7E_P_2 */
9446 {
9447 { "vmovK", { Edq, XMScalar }, 0 },
9448 },
9449
9450 /* VEX_LEN_0F90_P_0 */
9451 {
9452 { VEX_W_TABLE (VEX_W_0F90_P_0_LEN_0) },
9453 },
9454
9455 /* VEX_LEN_0F90_P_2 */
9456 {
9457 { VEX_W_TABLE (VEX_W_0F90_P_2_LEN_0) },
9458 },
9459
9460 /* VEX_LEN_0F91_P_0 */
9461 {
9462 { VEX_W_TABLE (VEX_W_0F91_P_0_LEN_0) },
9463 },
9464
9465 /* VEX_LEN_0F91_P_2 */
9466 {
9467 { VEX_W_TABLE (VEX_W_0F91_P_2_LEN_0) },
9468 },
9469
9470 /* VEX_LEN_0F92_P_0 */
9471 {
9472 { VEX_W_TABLE (VEX_W_0F92_P_0_LEN_0) },
9473 },
9474
9475 /* VEX_LEN_0F92_P_2 */
9476 {
9477 { VEX_W_TABLE (VEX_W_0F92_P_2_LEN_0) },
9478 },
9479
9480 /* VEX_LEN_0F92_P_3 */
9481 {
9482 { MOD_TABLE (MOD_VEX_0F92_P_3_LEN_0) },
9483 },
9484
9485 /* VEX_LEN_0F93_P_0 */
9486 {
9487 { VEX_W_TABLE (VEX_W_0F93_P_0_LEN_0) },
9488 },
9489
9490 /* VEX_LEN_0F93_P_2 */
9491 {
9492 { VEX_W_TABLE (VEX_W_0F93_P_2_LEN_0) },
9493 },
9494
9495 /* VEX_LEN_0F93_P_3 */
9496 {
9497 { MOD_TABLE (MOD_VEX_0F93_P_3_LEN_0) },
9498 },
9499
9500 /* VEX_LEN_0F98_P_0 */
9501 {
9502 { VEX_W_TABLE (VEX_W_0F98_P_0_LEN_0) },
9503 },
9504
9505 /* VEX_LEN_0F98_P_2 */
9506 {
9507 { VEX_W_TABLE (VEX_W_0F98_P_2_LEN_0) },
9508 },
9509
9510 /* VEX_LEN_0F99_P_0 */
9511 {
9512 { VEX_W_TABLE (VEX_W_0F99_P_0_LEN_0) },
9513 },
9514
9515 /* VEX_LEN_0F99_P_2 */
9516 {
9517 { VEX_W_TABLE (VEX_W_0F99_P_2_LEN_0) },
9518 },
9519
9520 /* VEX_LEN_0FAE_R_2_M_0 */
9521 {
9522 { "vldmxcsr", { Md }, 0 },
9523 },
9524
9525 /* VEX_LEN_0FAE_R_3_M_0 */
9526 {
9527 { "vstmxcsr", { Md }, 0 },
9528 },
9529
9530 /* VEX_LEN_0FC4_P_2 */
9531 {
9532 { "vpinsrw", { XM, Vex128, Edqw, Ib }, 0 },
9533 },
9534
9535 /* VEX_LEN_0FC5_P_2 */
9536 {
9537 { "vpextrw", { Gdq, XS, Ib }, 0 },
9538 },
9539
9540 /* VEX_LEN_0FD6_P_2 */
9541 {
9542 { "vmovq", { EXqScalarS, XMScalar }, 0 },
9543 },
9544
9545 /* VEX_LEN_0FF7_P_2 */
9546 {
9547 { "vmaskmovdqu", { XM, XS }, 0 },
9548 },
9549
9550 /* VEX_LEN_0F3816_P_2 */
9551 {
9552 { Bad_Opcode },
9553 { VEX_W_TABLE (VEX_W_0F3816_P_2) },
9554 },
9555
9556 /* VEX_LEN_0F3819_P_2 */
9557 {
9558 { Bad_Opcode },
9559 { VEX_W_TABLE (VEX_W_0F3819_P_2) },
9560 },
9561
9562 /* VEX_LEN_0F381A_P_2_M_0 */
9563 {
9564 { Bad_Opcode },
9565 { VEX_W_TABLE (VEX_W_0F381A_P_2_M_0) },
9566 },
9567
9568 /* VEX_LEN_0F3836_P_2 */
9569 {
9570 { Bad_Opcode },
9571 { VEX_W_TABLE (VEX_W_0F3836_P_2) },
9572 },
9573
9574 /* VEX_LEN_0F3841_P_2 */
9575 {
9576 { "vphminposuw", { XM, EXx }, 0 },
9577 },
9578
9579 /* VEX_LEN_0F385A_P_2_M_0 */
9580 {
9581 { Bad_Opcode },
9582 { VEX_W_TABLE (VEX_W_0F385A_P_2_M_0) },
9583 },
9584
9585 /* VEX_LEN_0F38DB_P_2 */
9586 {
9587 { "vaesimc", { XM, EXx }, 0 },
9588 },
9589
9590 /* VEX_LEN_0F38F2_P_0 */
9591 {
9592 { "andnS", { Gdq, VexGdq, Edq }, 0 },
9593 },
9594
9595 /* VEX_LEN_0F38F3_R_1_P_0 */
9596 {
9597 { "blsrS", { VexGdq, Edq }, 0 },
9598 },
9599
9600 /* VEX_LEN_0F38F3_R_2_P_0 */
9601 {
9602 { "blsmskS", { VexGdq, Edq }, 0 },
9603 },
9604
9605 /* VEX_LEN_0F38F3_R_3_P_0 */
9606 {
9607 { "blsiS", { VexGdq, Edq }, 0 },
9608 },
9609
9610 /* VEX_LEN_0F38F5_P_0 */
9611 {
9612 { "bzhiS", { Gdq, Edq, VexGdq }, 0 },
9613 },
9614
9615 /* VEX_LEN_0F38F5_P_1 */
9616 {
9617 { "pextS", { Gdq, VexGdq, Edq }, 0 },
9618 },
9619
9620 /* VEX_LEN_0F38F5_P_3 */
9621 {
9622 { "pdepS", { Gdq, VexGdq, Edq }, 0 },
9623 },
9624
9625 /* VEX_LEN_0F38F6_P_3 */
9626 {
9627 { "mulxS", { Gdq, VexGdq, Edq }, 0 },
9628 },
9629
9630 /* VEX_LEN_0F38F7_P_0 */
9631 {
9632 { "bextrS", { Gdq, Edq, VexGdq }, 0 },
9633 },
9634
9635 /* VEX_LEN_0F38F7_P_1 */
9636 {
9637 { "sarxS", { Gdq, Edq, VexGdq }, 0 },
9638 },
9639
9640 /* VEX_LEN_0F38F7_P_2 */
9641 {
9642 { "shlxS", { Gdq, Edq, VexGdq }, 0 },
9643 },
9644
9645 /* VEX_LEN_0F38F7_P_3 */
9646 {
9647 { "shrxS", { Gdq, Edq, VexGdq }, 0 },
9648 },
9649
9650 /* VEX_LEN_0F3A00_P_2 */
9651 {
9652 { Bad_Opcode },
9653 { VEX_W_TABLE (VEX_W_0F3A00_P_2) },
9654 },
9655
9656 /* VEX_LEN_0F3A01_P_2 */
9657 {
9658 { Bad_Opcode },
9659 { VEX_W_TABLE (VEX_W_0F3A01_P_2) },
9660 },
9661
9662 /* VEX_LEN_0F3A06_P_2 */
9663 {
9664 { Bad_Opcode },
9665 { VEX_W_TABLE (VEX_W_0F3A06_P_2) },
9666 },
9667
9668 /* VEX_LEN_0F3A14_P_2 */
9669 {
9670 { "vpextrb", { Edqb, XM, Ib }, 0 },
9671 },
9672
9673 /* VEX_LEN_0F3A15_P_2 */
9674 {
9675 { "vpextrw", { Edqw, XM, Ib }, 0 },
9676 },
9677
9678 /* VEX_LEN_0F3A16_P_2 */
9679 {
9680 { "vpextrK", { Edq, XM, Ib }, 0 },
9681 },
9682
9683 /* VEX_LEN_0F3A17_P_2 */
9684 {
9685 { "vextractps", { Edqd, XM, Ib }, 0 },
9686 },
9687
9688 /* VEX_LEN_0F3A18_P_2 */
9689 {
9690 { Bad_Opcode },
9691 { VEX_W_TABLE (VEX_W_0F3A18_P_2) },
9692 },
9693
9694 /* VEX_LEN_0F3A19_P_2 */
9695 {
9696 { Bad_Opcode },
9697 { VEX_W_TABLE (VEX_W_0F3A19_P_2) },
9698 },
9699
9700 /* VEX_LEN_0F3A20_P_2 */
9701 {
9702 { "vpinsrb", { XM, Vex128, Edqb, Ib }, 0 },
9703 },
9704
9705 /* VEX_LEN_0F3A21_P_2 */
9706 {
9707 { "vinsertps", { XM, Vex128, EXd, Ib }, 0 },
9708 },
9709
9710 /* VEX_LEN_0F3A22_P_2 */
9711 {
9712 { "vpinsrK", { XM, Vex128, Edq, Ib }, 0 },
9713 },
9714
9715 /* VEX_LEN_0F3A30_P_2 */
9716 {
9717 { VEX_W_TABLE (VEX_W_0F3A30_P_2_LEN_0) },
9718 },
9719
9720 /* VEX_LEN_0F3A31_P_2 */
9721 {
9722 { VEX_W_TABLE (VEX_W_0F3A31_P_2_LEN_0) },
9723 },
9724
9725 /* VEX_LEN_0F3A32_P_2 */
9726 {
9727 { VEX_W_TABLE (VEX_W_0F3A32_P_2_LEN_0) },
9728 },
9729
9730 /* VEX_LEN_0F3A33_P_2 */
9731 {
9732 { VEX_W_TABLE (VEX_W_0F3A33_P_2_LEN_0) },
9733 },
9734
9735 /* VEX_LEN_0F3A38_P_2 */
9736 {
9737 { Bad_Opcode },
9738 { VEX_W_TABLE (VEX_W_0F3A38_P_2) },
9739 },
9740
9741 /* VEX_LEN_0F3A39_P_2 */
9742 {
9743 { Bad_Opcode },
9744 { VEX_W_TABLE (VEX_W_0F3A39_P_2) },
9745 },
9746
9747 /* VEX_LEN_0F3A41_P_2 */
9748 {
9749 { "vdppd", { XM, Vex128, EXx, Ib }, 0 },
9750 },
9751
9752 /* VEX_LEN_0F3A46_P_2 */
9753 {
9754 { Bad_Opcode },
9755 { VEX_W_TABLE (VEX_W_0F3A46_P_2) },
9756 },
9757
9758 /* VEX_LEN_0F3A60_P_2 */
9759 {
9760 { "vpcmpestrm", { XM, { PCMPESTR_Fixup, x_mode }, Ib }, 0 },
9761 },
9762
9763 /* VEX_LEN_0F3A61_P_2 */
9764 {
9765 { "vpcmpestri", { XM, { PCMPESTR_Fixup, x_mode }, Ib }, 0 },
9766 },
9767
9768 /* VEX_LEN_0F3A62_P_2 */
9769 {
9770 { "vpcmpistrm", { XM, EXx, Ib }, 0 },
9771 },
9772
9773 /* VEX_LEN_0F3A63_P_2 */
9774 {
9775 { "vpcmpistri", { XM, EXx, Ib }, 0 },
9776 },
9777
9778 /* VEX_LEN_0F3A6A_P_2 */
9779 {
9780 { "vfmaddss", { XMVexW, Vex128, EXdVexW, EXdVexW }, 0 },
9781 },
9782
9783 /* VEX_LEN_0F3A6B_P_2 */
9784 {
9785 { "vfmaddsd", { XMVexW, Vex128, EXqVexW, EXqVexW }, 0 },
9786 },
9787
9788 /* VEX_LEN_0F3A6E_P_2 */
9789 {
9790 { "vfmsubss", { XMVexW, Vex128, EXdVexW, EXdVexW }, 0 },
9791 },
9792
9793 /* VEX_LEN_0F3A6F_P_2 */
9794 {
9795 { "vfmsubsd", { XMVexW, Vex128, EXqVexW, EXqVexW }, 0 },
9796 },
9797
9798 /* VEX_LEN_0F3A7A_P_2 */
9799 {
9800 { "vfnmaddss", { XMVexW, Vex128, EXdVexW, EXdVexW }, 0 },
9801 },
9802
9803 /* VEX_LEN_0F3A7B_P_2 */
9804 {
9805 { "vfnmaddsd", { XMVexW, Vex128, EXqVexW, EXqVexW }, 0 },
9806 },
9807
9808 /* VEX_LEN_0F3A7E_P_2 */
9809 {
9810 { "vfnmsubss", { XMVexW, Vex128, EXdVexW, EXdVexW }, 0 },
9811 },
9812
9813 /* VEX_LEN_0F3A7F_P_2 */
9814 {
9815 { "vfnmsubsd", { XMVexW, Vex128, EXqVexW, EXqVexW }, 0 },
9816 },
9817
9818 /* VEX_LEN_0F3ADF_P_2 */
9819 {
9820 { "vaeskeygenassist", { XM, EXx, Ib }, 0 },
9821 },
9822
9823 /* VEX_LEN_0F3AF0_P_3 */
9824 {
9825 { "rorxS", { Gdq, Edq, Ib }, 0 },
9826 },
9827
9828 /* VEX_LEN_0FXOP_08_CC */
9829 {
9830 { "vpcomb", { XM, Vex128, EXx, VPCOM }, 0 },
9831 },
9832
9833 /* VEX_LEN_0FXOP_08_CD */
9834 {
9835 { "vpcomw", { XM, Vex128, EXx, VPCOM }, 0 },
9836 },
9837
9838 /* VEX_LEN_0FXOP_08_CE */
9839 {
9840 { "vpcomd", { XM, Vex128, EXx, VPCOM }, 0 },
9841 },
9842
9843 /* VEX_LEN_0FXOP_08_CF */
9844 {
9845 { "vpcomq", { XM, Vex128, EXx, VPCOM }, 0 },
9846 },
9847
9848 /* VEX_LEN_0FXOP_08_EC */
9849 {
9850 { "vpcomub", { XM, Vex128, EXx, VPCOM }, 0 },
9851 },
9852
9853 /* VEX_LEN_0FXOP_08_ED */
9854 {
9855 { "vpcomuw", { XM, Vex128, EXx, VPCOM }, 0 },
9856 },
9857
9858 /* VEX_LEN_0FXOP_08_EE */
9859 {
9860 { "vpcomud", { XM, Vex128, EXx, VPCOM }, 0 },
9861 },
9862
9863 /* VEX_LEN_0FXOP_08_EF */
9864 {
9865 { "vpcomuq", { XM, Vex128, EXx, VPCOM }, 0 },
9866 },
9867
9868 /* VEX_LEN_0FXOP_09_80 */
9869 {
9870 { "vfrczps", { XM, EXxmm }, 0 },
9871 { "vfrczps", { XM, EXymmq }, 0 },
9872 },
9873
9874 /* VEX_LEN_0FXOP_09_81 */
9875 {
9876 { "vfrczpd", { XM, EXxmm }, 0 },
9877 { "vfrczpd", { XM, EXymmq }, 0 },
9878 },
9879 };
9880
9881 #include "i386-dis-evex-len.h"
9882
9883 static const struct dis386 vex_w_table[][2] = {
9884 {
9885 /* VEX_W_0F41_P_0_LEN_1 */
9886 { MOD_TABLE (MOD_VEX_W_0_0F41_P_0_LEN_1) },
9887 { MOD_TABLE (MOD_VEX_W_1_0F41_P_0_LEN_1) },
9888 },
9889 {
9890 /* VEX_W_0F41_P_2_LEN_1 */
9891 { MOD_TABLE (MOD_VEX_W_0_0F41_P_2_LEN_1) },
9892 { MOD_TABLE (MOD_VEX_W_1_0F41_P_2_LEN_1) }
9893 },
9894 {
9895 /* VEX_W_0F42_P_0_LEN_1 */
9896 { MOD_TABLE (MOD_VEX_W_0_0F42_P_0_LEN_1) },
9897 { MOD_TABLE (MOD_VEX_W_1_0F42_P_0_LEN_1) },
9898 },
9899 {
9900 /* VEX_W_0F42_P_2_LEN_1 */
9901 { MOD_TABLE (MOD_VEX_W_0_0F42_P_2_LEN_1) },
9902 { MOD_TABLE (MOD_VEX_W_1_0F42_P_2_LEN_1) },
9903 },
9904 {
9905 /* VEX_W_0F44_P_0_LEN_0 */
9906 { MOD_TABLE (MOD_VEX_W_0_0F44_P_0_LEN_1) },
9907 { MOD_TABLE (MOD_VEX_W_1_0F44_P_0_LEN_1) },
9908 },
9909 {
9910 /* VEX_W_0F44_P_2_LEN_0 */
9911 { MOD_TABLE (MOD_VEX_W_0_0F44_P_2_LEN_1) },
9912 { MOD_TABLE (MOD_VEX_W_1_0F44_P_2_LEN_1) },
9913 },
9914 {
9915 /* VEX_W_0F45_P_0_LEN_1 */
9916 { MOD_TABLE (MOD_VEX_W_0_0F45_P_0_LEN_1) },
9917 { MOD_TABLE (MOD_VEX_W_1_0F45_P_0_LEN_1) },
9918 },
9919 {
9920 /* VEX_W_0F45_P_2_LEN_1 */
9921 { MOD_TABLE (MOD_VEX_W_0_0F45_P_2_LEN_1) },
9922 { MOD_TABLE (MOD_VEX_W_1_0F45_P_2_LEN_1) },
9923 },
9924 {
9925 /* VEX_W_0F46_P_0_LEN_1 */
9926 { MOD_TABLE (MOD_VEX_W_0_0F46_P_0_LEN_1) },
9927 { MOD_TABLE (MOD_VEX_W_1_0F46_P_0_LEN_1) },
9928 },
9929 {
9930 /* VEX_W_0F46_P_2_LEN_1 */
9931 { MOD_TABLE (MOD_VEX_W_0_0F46_P_2_LEN_1) },
9932 { MOD_TABLE (MOD_VEX_W_1_0F46_P_2_LEN_1) },
9933 },
9934 {
9935 /* VEX_W_0F47_P_0_LEN_1 */
9936 { MOD_TABLE (MOD_VEX_W_0_0F47_P_0_LEN_1) },
9937 { MOD_TABLE (MOD_VEX_W_1_0F47_P_0_LEN_1) },
9938 },
9939 {
9940 /* VEX_W_0F47_P_2_LEN_1 */
9941 { MOD_TABLE (MOD_VEX_W_0_0F47_P_2_LEN_1) },
9942 { MOD_TABLE (MOD_VEX_W_1_0F47_P_2_LEN_1) },
9943 },
9944 {
9945 /* VEX_W_0F4A_P_0_LEN_1 */
9946 { MOD_TABLE (MOD_VEX_W_0_0F4A_P_0_LEN_1) },
9947 { MOD_TABLE (MOD_VEX_W_1_0F4A_P_0_LEN_1) },
9948 },
9949 {
9950 /* VEX_W_0F4A_P_2_LEN_1 */
9951 { MOD_TABLE (MOD_VEX_W_0_0F4A_P_2_LEN_1) },
9952 { MOD_TABLE (MOD_VEX_W_1_0F4A_P_2_LEN_1) },
9953 },
9954 {
9955 /* VEX_W_0F4B_P_0_LEN_1 */
9956 { MOD_TABLE (MOD_VEX_W_0_0F4B_P_0_LEN_1) },
9957 { MOD_TABLE (MOD_VEX_W_1_0F4B_P_0_LEN_1) },
9958 },
9959 {
9960 /* VEX_W_0F4B_P_2_LEN_1 */
9961 { MOD_TABLE (MOD_VEX_W_0_0F4B_P_2_LEN_1) },
9962 },
9963 {
9964 /* VEX_W_0F90_P_0_LEN_0 */
9965 { "kmovw", { MaskG, MaskE }, 0 },
9966 { "kmovq", { MaskG, MaskE }, 0 },
9967 },
9968 {
9969 /* VEX_W_0F90_P_2_LEN_0 */
9970 { "kmovb", { MaskG, MaskBDE }, 0 },
9971 { "kmovd", { MaskG, MaskBDE }, 0 },
9972 },
9973 {
9974 /* VEX_W_0F91_P_0_LEN_0 */
9975 { MOD_TABLE (MOD_VEX_W_0_0F91_P_0_LEN_0) },
9976 { MOD_TABLE (MOD_VEX_W_1_0F91_P_0_LEN_0) },
9977 },
9978 {
9979 /* VEX_W_0F91_P_2_LEN_0 */
9980 { MOD_TABLE (MOD_VEX_W_0_0F91_P_2_LEN_0) },
9981 { MOD_TABLE (MOD_VEX_W_1_0F91_P_2_LEN_0) },
9982 },
9983 {
9984 /* VEX_W_0F92_P_0_LEN_0 */
9985 { MOD_TABLE (MOD_VEX_W_0_0F92_P_0_LEN_0) },
9986 },
9987 {
9988 /* VEX_W_0F92_P_2_LEN_0 */
9989 { MOD_TABLE (MOD_VEX_W_0_0F92_P_2_LEN_0) },
9990 },
9991 {
9992 /* VEX_W_0F93_P_0_LEN_0 */
9993 { MOD_TABLE (MOD_VEX_W_0_0F93_P_0_LEN_0) },
9994 },
9995 {
9996 /* VEX_W_0F93_P_2_LEN_0 */
9997 { MOD_TABLE (MOD_VEX_W_0_0F93_P_2_LEN_0) },
9998 },
9999 {
10000 /* VEX_W_0F98_P_0_LEN_0 */
10001 { MOD_TABLE (MOD_VEX_W_0_0F98_P_0_LEN_0) },
10002 { MOD_TABLE (MOD_VEX_W_1_0F98_P_0_LEN_0) },
10003 },
10004 {
10005 /* VEX_W_0F98_P_2_LEN_0 */
10006 { MOD_TABLE (MOD_VEX_W_0_0F98_P_2_LEN_0) },
10007 { MOD_TABLE (MOD_VEX_W_1_0F98_P_2_LEN_0) },
10008 },
10009 {
10010 /* VEX_W_0F99_P_0_LEN_0 */
10011 { MOD_TABLE (MOD_VEX_W_0_0F99_P_0_LEN_0) },
10012 { MOD_TABLE (MOD_VEX_W_1_0F99_P_0_LEN_0) },
10013 },
10014 {
10015 /* VEX_W_0F99_P_2_LEN_0 */
10016 { MOD_TABLE (MOD_VEX_W_0_0F99_P_2_LEN_0) },
10017 { MOD_TABLE (MOD_VEX_W_1_0F99_P_2_LEN_0) },
10018 },
10019 {
10020 /* VEX_W_0F380C_P_2 */
10021 { "vpermilps", { XM, Vex, EXx }, 0 },
10022 },
10023 {
10024 /* VEX_W_0F380D_P_2 */
10025 { "vpermilpd", { XM, Vex, EXx }, 0 },
10026 },
10027 {
10028 /* VEX_W_0F380E_P_2 */
10029 { "vtestps", { XM, EXx }, 0 },
10030 },
10031 {
10032 /* VEX_W_0F380F_P_2 */
10033 { "vtestpd", { XM, EXx }, 0 },
10034 },
10035 {
10036 /* VEX_W_0F3816_P_2 */
10037 { "vpermps", { XM, Vex, EXx }, 0 },
10038 },
10039 {
10040 /* VEX_W_0F3818_P_2 */
10041 { "vbroadcastss", { XM, EXxmm_md }, 0 },
10042 },
10043 {
10044 /* VEX_W_0F3819_P_2 */
10045 { "vbroadcastsd", { XM, EXxmm_mq }, 0 },
10046 },
10047 {
10048 /* VEX_W_0F381A_P_2_M_0 */
10049 { "vbroadcastf128", { XM, Mxmm }, 0 },
10050 },
10051 {
10052 /* VEX_W_0F382C_P_2_M_0 */
10053 { "vmaskmovps", { XM, Vex, Mx }, 0 },
10054 },
10055 {
10056 /* VEX_W_0F382D_P_2_M_0 */
10057 { "vmaskmovpd", { XM, Vex, Mx }, 0 },
10058 },
10059 {
10060 /* VEX_W_0F382E_P_2_M_0 */
10061 { "vmaskmovps", { Mx, Vex, XM }, 0 },
10062 },
10063 {
10064 /* VEX_W_0F382F_P_2_M_0 */
10065 { "vmaskmovpd", { Mx, Vex, XM }, 0 },
10066 },
10067 {
10068 /* VEX_W_0F3836_P_2 */
10069 { "vpermd", { XM, Vex, EXx }, 0 },
10070 },
10071 {
10072 /* VEX_W_0F3846_P_2 */
10073 { "vpsravd", { XM, Vex, EXx }, 0 },
10074 },
10075 {
10076 /* VEX_W_0F3858_P_2 */
10077 { "vpbroadcastd", { XM, EXxmm_md }, 0 },
10078 },
10079 {
10080 /* VEX_W_0F3859_P_2 */
10081 { "vpbroadcastq", { XM, EXxmm_mq }, 0 },
10082 },
10083 {
10084 /* VEX_W_0F385A_P_2_M_0 */
10085 { "vbroadcasti128", { XM, Mxmm }, 0 },
10086 },
10087 {
10088 /* VEX_W_0F3878_P_2 */
10089 { "vpbroadcastb", { XM, EXxmm_mb }, 0 },
10090 },
10091 {
10092 /* VEX_W_0F3879_P_2 */
10093 { "vpbroadcastw", { XM, EXxmm_mw }, 0 },
10094 },
10095 {
10096 /* VEX_W_0F38CF_P_2 */
10097 { "vgf2p8mulb", { XM, Vex, EXx }, 0 },
10098 },
10099 {
10100 /* VEX_W_0F3A00_P_2 */
10101 { Bad_Opcode },
10102 { "vpermq", { XM, EXx, Ib }, 0 },
10103 },
10104 {
10105 /* VEX_W_0F3A01_P_2 */
10106 { Bad_Opcode },
10107 { "vpermpd", { XM, EXx, Ib }, 0 },
10108 },
10109 {
10110 /* VEX_W_0F3A02_P_2 */
10111 { "vpblendd", { XM, Vex, EXx, Ib }, 0 },
10112 },
10113 {
10114 /* VEX_W_0F3A04_P_2 */
10115 { "vpermilps", { XM, EXx, Ib }, 0 },
10116 },
10117 {
10118 /* VEX_W_0F3A05_P_2 */
10119 { "vpermilpd", { XM, EXx, Ib }, 0 },
10120 },
10121 {
10122 /* VEX_W_0F3A06_P_2 */
10123 { "vperm2f128", { XM, Vex256, EXx, Ib }, 0 },
10124 },
10125 {
10126 /* VEX_W_0F3A18_P_2 */
10127 { "vinsertf128", { XM, Vex256, EXxmm, Ib }, 0 },
10128 },
10129 {
10130 /* VEX_W_0F3A19_P_2 */
10131 { "vextractf128", { EXxmm, XM, Ib }, 0 },
10132 },
10133 {
10134 /* VEX_W_0F3A30_P_2_LEN_0 */
10135 { MOD_TABLE (MOD_VEX_W_0_0F3A30_P_2_LEN_0) },
10136 { MOD_TABLE (MOD_VEX_W_1_0F3A30_P_2_LEN_0) },
10137 },
10138 {
10139 /* VEX_W_0F3A31_P_2_LEN_0 */
10140 { MOD_TABLE (MOD_VEX_W_0_0F3A31_P_2_LEN_0) },
10141 { MOD_TABLE (MOD_VEX_W_1_0F3A31_P_2_LEN_0) },
10142 },
10143 {
10144 /* VEX_W_0F3A32_P_2_LEN_0 */
10145 { MOD_TABLE (MOD_VEX_W_0_0F3A32_P_2_LEN_0) },
10146 { MOD_TABLE (MOD_VEX_W_1_0F3A32_P_2_LEN_0) },
10147 },
10148 {
10149 /* VEX_W_0F3A33_P_2_LEN_0 */
10150 { MOD_TABLE (MOD_VEX_W_0_0F3A33_P_2_LEN_0) },
10151 { MOD_TABLE (MOD_VEX_W_1_0F3A33_P_2_LEN_0) },
10152 },
10153 {
10154 /* VEX_W_0F3A38_P_2 */
10155 { "vinserti128", { XM, Vex256, EXxmm, Ib }, 0 },
10156 },
10157 {
10158 /* VEX_W_0F3A39_P_2 */
10159 { "vextracti128", { EXxmm, XM, Ib }, 0 },
10160 },
10161 {
10162 /* VEX_W_0F3A46_P_2 */
10163 { "vperm2i128", { XM, Vex256, EXx, Ib }, 0 },
10164 },
10165 {
10166 /* VEX_W_0F3A48_P_2 */
10167 { "vpermil2ps", { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW }, 0 },
10168 { "vpermil2ps", { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW }, 0 },
10169 },
10170 {
10171 /* VEX_W_0F3A49_P_2 */
10172 { "vpermil2pd", { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW }, 0 },
10173 { "vpermil2pd", { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW }, 0 },
10174 },
10175 {
10176 /* VEX_W_0F3A4A_P_2 */
10177 { "vblendvps", { XM, Vex, EXx, XMVexI4 }, 0 },
10178 },
10179 {
10180 /* VEX_W_0F3A4B_P_2 */
10181 { "vblendvpd", { XM, Vex, EXx, XMVexI4 }, 0 },
10182 },
10183 {
10184 /* VEX_W_0F3A4C_P_2 */
10185 { "vpblendvb", { XM, Vex, EXx, XMVexI4 }, 0 },
10186 },
10187 {
10188 /* VEX_W_0F3ACE_P_2 */
10189 { Bad_Opcode },
10190 { "vgf2p8affineqb", { XM, Vex, EXx, Ib }, 0 },
10191 },
10192 {
10193 /* VEX_W_0F3ACF_P_2 */
10194 { Bad_Opcode },
10195 { "vgf2p8affineinvqb", { XM, Vex, EXx, Ib }, 0 },
10196 },
10197
10198 #include "i386-dis-evex-w.h"
10199 };
10200
10201 static const struct dis386 mod_table[][2] = {
10202 {
10203 /* MOD_8D */
10204 { "leaS", { Gv, M }, 0 },
10205 },
10206 {
10207 /* MOD_C6_REG_7 */
10208 { Bad_Opcode },
10209 { RM_TABLE (RM_C6_REG_7) },
10210 },
10211 {
10212 /* MOD_C7_REG_7 */
10213 { Bad_Opcode },
10214 { RM_TABLE (RM_C7_REG_7) },
10215 },
10216 {
10217 /* MOD_FF_REG_3 */
10218 { "Jcall^", { indirEp }, 0 },
10219 },
10220 {
10221 /* MOD_FF_REG_5 */
10222 { "Jjmp^", { indirEp }, 0 },
10223 },
10224 {
10225 /* MOD_0F01_REG_0 */
10226 { X86_64_TABLE (X86_64_0F01_REG_0) },
10227 { RM_TABLE (RM_0F01_REG_0) },
10228 },
10229 {
10230 /* MOD_0F01_REG_1 */
10231 { X86_64_TABLE (X86_64_0F01_REG_1) },
10232 { RM_TABLE (RM_0F01_REG_1) },
10233 },
10234 {
10235 /* MOD_0F01_REG_2 */
10236 { X86_64_TABLE (X86_64_0F01_REG_2) },
10237 { RM_TABLE (RM_0F01_REG_2) },
10238 },
10239 {
10240 /* MOD_0F01_REG_3 */
10241 { X86_64_TABLE (X86_64_0F01_REG_3) },
10242 { RM_TABLE (RM_0F01_REG_3) },
10243 },
10244 {
10245 /* MOD_0F01_REG_5 */
10246 { PREFIX_TABLE (PREFIX_MOD_0_0F01_REG_5) },
10247 { RM_TABLE (RM_0F01_REG_5) },
10248 },
10249 {
10250 /* MOD_0F01_REG_7 */
10251 { "invlpg", { Mb }, 0 },
10252 { RM_TABLE (RM_0F01_REG_7) },
10253 },
10254 {
10255 /* MOD_0F12_PREFIX_0 */
10256 { "movlps", { XM, EXq }, PREFIX_OPCODE },
10257 { "movhlps", { XM, EXq }, PREFIX_OPCODE },
10258 },
10259 {
10260 /* MOD_0F13 */
10261 { "movlpX", { EXq, XM }, PREFIX_OPCODE },
10262 },
10263 {
10264 /* MOD_0F16_PREFIX_0 */
10265 { "movhps", { XM, EXq }, 0 },
10266 { "movlhps", { XM, EXq }, 0 },
10267 },
10268 {
10269 /* MOD_0F17 */
10270 { "movhpX", { EXq, XM }, PREFIX_OPCODE },
10271 },
10272 {
10273 /* MOD_0F18_REG_0 */
10274 { "prefetchnta", { Mb }, 0 },
10275 },
10276 {
10277 /* MOD_0F18_REG_1 */
10278 { "prefetcht0", { Mb }, 0 },
10279 },
10280 {
10281 /* MOD_0F18_REG_2 */
10282 { "prefetcht1", { Mb }, 0 },
10283 },
10284 {
10285 /* MOD_0F18_REG_3 */
10286 { "prefetcht2", { Mb }, 0 },
10287 },
10288 {
10289 /* MOD_0F18_REG_4 */
10290 { "nop/reserved", { Mb }, 0 },
10291 },
10292 {
10293 /* MOD_0F18_REG_5 */
10294 { "nop/reserved", { Mb }, 0 },
10295 },
10296 {
10297 /* MOD_0F18_REG_6 */
10298 { "nop/reserved", { Mb }, 0 },
10299 },
10300 {
10301 /* MOD_0F18_REG_7 */
10302 { "nop/reserved", { Mb }, 0 },
10303 },
10304 {
10305 /* MOD_0F1A_PREFIX_0 */
10306 { "bndldx", { Gbnd, Mv_bnd }, 0 },
10307 { "nopQ", { Ev }, 0 },
10308 },
10309 {
10310 /* MOD_0F1B_PREFIX_0 */
10311 { "bndstx", { Mv_bnd, Gbnd }, 0 },
10312 { "nopQ", { Ev }, 0 },
10313 },
10314 {
10315 /* MOD_0F1B_PREFIX_1 */
10316 { "bndmk", { Gbnd, Mv_bnd }, 0 },
10317 { "nopQ", { Ev }, 0 },
10318 },
10319 {
10320 /* MOD_0F1C_PREFIX_0 */
10321 { REG_TABLE (REG_0F1C_MOD_0) },
10322 { "nopQ", { Ev }, 0 },
10323 },
10324 {
10325 /* MOD_0F1E_PREFIX_1 */
10326 { "nopQ", { Ev }, 0 },
10327 { REG_TABLE (REG_0F1E_MOD_3) },
10328 },
10329 {
10330 /* MOD_0F24 */
10331 { Bad_Opcode },
10332 { "movL", { Rd, Td }, 0 },
10333 },
10334 {
10335 /* MOD_0F26 */
10336 { Bad_Opcode },
10337 { "movL", { Td, Rd }, 0 },
10338 },
10339 {
10340 /* MOD_0F2B_PREFIX_0 */
10341 {"movntps", { Mx, XM }, PREFIX_OPCODE },
10342 },
10343 {
10344 /* MOD_0F2B_PREFIX_1 */
10345 {"movntss", { Md, XM }, PREFIX_OPCODE },
10346 },
10347 {
10348 /* MOD_0F2B_PREFIX_2 */
10349 {"movntpd", { Mx, XM }, PREFIX_OPCODE },
10350 },
10351 {
10352 /* MOD_0F2B_PREFIX_3 */
10353 {"movntsd", { Mq, XM }, PREFIX_OPCODE },
10354 },
10355 {
10356 /* MOD_0F51 */
10357 { Bad_Opcode },
10358 { "movmskpX", { Gdq, XS }, PREFIX_OPCODE },
10359 },
10360 {
10361 /* MOD_0F71_REG_2 */
10362 { Bad_Opcode },
10363 { "psrlw", { MS, Ib }, 0 },
10364 },
10365 {
10366 /* MOD_0F71_REG_4 */
10367 { Bad_Opcode },
10368 { "psraw", { MS, Ib }, 0 },
10369 },
10370 {
10371 /* MOD_0F71_REG_6 */
10372 { Bad_Opcode },
10373 { "psllw", { MS, Ib }, 0 },
10374 },
10375 {
10376 /* MOD_0F72_REG_2 */
10377 { Bad_Opcode },
10378 { "psrld", { MS, Ib }, 0 },
10379 },
10380 {
10381 /* MOD_0F72_REG_4 */
10382 { Bad_Opcode },
10383 { "psrad", { MS, Ib }, 0 },
10384 },
10385 {
10386 /* MOD_0F72_REG_6 */
10387 { Bad_Opcode },
10388 { "pslld", { MS, Ib }, 0 },
10389 },
10390 {
10391 /* MOD_0F73_REG_2 */
10392 { Bad_Opcode },
10393 { "psrlq", { MS, Ib }, 0 },
10394 },
10395 {
10396 /* MOD_0F73_REG_3 */
10397 { Bad_Opcode },
10398 { PREFIX_TABLE (PREFIX_0F73_REG_3) },
10399 },
10400 {
10401 /* MOD_0F73_REG_6 */
10402 { Bad_Opcode },
10403 { "psllq", { MS, Ib }, 0 },
10404 },
10405 {
10406 /* MOD_0F73_REG_7 */
10407 { Bad_Opcode },
10408 { PREFIX_TABLE (PREFIX_0F73_REG_7) },
10409 },
10410 {
10411 /* MOD_0FAE_REG_0 */
10412 { "fxsave", { FXSAVE }, 0 },
10413 { PREFIX_TABLE (PREFIX_0FAE_REG_0) },
10414 },
10415 {
10416 /* MOD_0FAE_REG_1 */
10417 { "fxrstor", { FXSAVE }, 0 },
10418 { PREFIX_TABLE (PREFIX_0FAE_REG_1) },
10419 },
10420 {
10421 /* MOD_0FAE_REG_2 */
10422 { "ldmxcsr", { Md }, 0 },
10423 { PREFIX_TABLE (PREFIX_0FAE_REG_2) },
10424 },
10425 {
10426 /* MOD_0FAE_REG_3 */
10427 { "stmxcsr", { Md }, 0 },
10428 { PREFIX_TABLE (PREFIX_0FAE_REG_3) },
10429 },
10430 {
10431 /* MOD_0FAE_REG_4 */
10432 { PREFIX_TABLE (PREFIX_MOD_0_0FAE_REG_4) },
10433 { PREFIX_TABLE (PREFIX_MOD_3_0FAE_REG_4) },
10434 },
10435 {
10436 /* MOD_0FAE_REG_5 */
10437 { PREFIX_TABLE (PREFIX_MOD_0_0FAE_REG_5) },
10438 { PREFIX_TABLE (PREFIX_MOD_3_0FAE_REG_5) },
10439 },
10440 {
10441 /* MOD_0FAE_REG_6 */
10442 { PREFIX_TABLE (PREFIX_MOD_0_0FAE_REG_6) },
10443 { PREFIX_TABLE (PREFIX_MOD_1_0FAE_REG_6) },
10444 },
10445 {
10446 /* MOD_0FAE_REG_7 */
10447 { PREFIX_TABLE (PREFIX_0FAE_REG_7) },
10448 { RM_TABLE (RM_0FAE_REG_7) },
10449 },
10450 {
10451 /* MOD_0FB2 */
10452 { "lssS", { Gv, Mp }, 0 },
10453 },
10454 {
10455 /* MOD_0FB4 */
10456 { "lfsS", { Gv, Mp }, 0 },
10457 },
10458 {
10459 /* MOD_0FB5 */
10460 { "lgsS", { Gv, Mp }, 0 },
10461 },
10462 {
10463 /* MOD_0FC3 */
10464 { PREFIX_TABLE (PREFIX_MOD_0_0FC3) },
10465 },
10466 {
10467 /* MOD_0FC7_REG_3 */
10468 { "xrstors", { FXSAVE }, 0 },
10469 },
10470 {
10471 /* MOD_0FC7_REG_4 */
10472 { "xsavec", { FXSAVE }, 0 },
10473 },
10474 {
10475 /* MOD_0FC7_REG_5 */
10476 { "xsaves", { FXSAVE }, 0 },
10477 },
10478 {
10479 /* MOD_0FC7_REG_6 */
10480 { PREFIX_TABLE (PREFIX_MOD_0_0FC7_REG_6) },
10481 { PREFIX_TABLE (PREFIX_MOD_3_0FC7_REG_6) }
10482 },
10483 {
10484 /* MOD_0FC7_REG_7 */
10485 { "vmptrst", { Mq }, 0 },
10486 { PREFIX_TABLE (PREFIX_MOD_3_0FC7_REG_7) }
10487 },
10488 {
10489 /* MOD_0FD7 */
10490 { Bad_Opcode },
10491 { "pmovmskb", { Gdq, MS }, 0 },
10492 },
10493 {
10494 /* MOD_0FE7_PREFIX_2 */
10495 { "movntdq", { Mx, XM }, 0 },
10496 },
10497 {
10498 /* MOD_0FF0_PREFIX_3 */
10499 { "lddqu", { XM, M }, 0 },
10500 },
10501 {
10502 /* MOD_0F382A_PREFIX_2 */
10503 { "movntdqa", { XM, Mx }, 0 },
10504 },
10505 {
10506 /* MOD_0F38F5_PREFIX_2 */
10507 { "wrussK", { M, Gdq }, PREFIX_OPCODE },
10508 },
10509 {
10510 /* MOD_0F38F6_PREFIX_0 */
10511 { "wrssK", { M, Gdq }, PREFIX_OPCODE },
10512 },
10513 {
10514 /* MOD_0F38F8_PREFIX_1 */
10515 { "enqcmds", { Gva, M }, PREFIX_OPCODE },
10516 },
10517 {
10518 /* MOD_0F38F8_PREFIX_2 */
10519 { "movdir64b", { Gva, M }, PREFIX_OPCODE },
10520 },
10521 {
10522 /* MOD_0F38F8_PREFIX_3 */
10523 { "enqcmd", { Gva, M }, PREFIX_OPCODE },
10524 },
10525 {
10526 /* MOD_0F38F9_PREFIX_0 */
10527 { "movdiri", { Em, Gv }, PREFIX_OPCODE },
10528 },
10529 {
10530 /* MOD_62_32BIT */
10531 { "bound{S|}", { Gv, Ma }, 0 },
10532 { EVEX_TABLE (EVEX_0F) },
10533 },
10534 {
10535 /* MOD_C4_32BIT */
10536 { "lesS", { Gv, Mp }, 0 },
10537 { VEX_C4_TABLE (VEX_0F) },
10538 },
10539 {
10540 /* MOD_C5_32BIT */
10541 { "ldsS", { Gv, Mp }, 0 },
10542 { VEX_C5_TABLE (VEX_0F) },
10543 },
10544 {
10545 /* MOD_VEX_0F12_PREFIX_0 */
10546 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_0) },
10547 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_1) },
10548 },
10549 {
10550 /* MOD_VEX_0F13 */
10551 { VEX_LEN_TABLE (VEX_LEN_0F13_M_0) },
10552 },
10553 {
10554 /* MOD_VEX_0F16_PREFIX_0 */
10555 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_0) },
10556 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_1) },
10557 },
10558 {
10559 /* MOD_VEX_0F17 */
10560 { VEX_LEN_TABLE (VEX_LEN_0F17_M_0) },
10561 },
10562 {
10563 /* MOD_VEX_0F2B */
10564 { "vmovntpX", { Mx, XM }, 0 },
10565 },
10566 {
10567 /* MOD_VEX_W_0_0F41_P_0_LEN_1 */
10568 { Bad_Opcode },
10569 { "kandw", { MaskG, MaskVex, MaskR }, 0 },
10570 },
10571 {
10572 /* MOD_VEX_W_1_0F41_P_0_LEN_1 */
10573 { Bad_Opcode },
10574 { "kandq", { MaskG, MaskVex, MaskR }, 0 },
10575 },
10576 {
10577 /* MOD_VEX_W_0_0F41_P_2_LEN_1 */
10578 { Bad_Opcode },
10579 { "kandb", { MaskG, MaskVex, MaskR }, 0 },
10580 },
10581 {
10582 /* MOD_VEX_W_1_0F41_P_2_LEN_1 */
10583 { Bad_Opcode },
10584 { "kandd", { MaskG, MaskVex, MaskR }, 0 },
10585 },
10586 {
10587 /* MOD_VEX_W_0_0F42_P_0_LEN_1 */
10588 { Bad_Opcode },
10589 { "kandnw", { MaskG, MaskVex, MaskR }, 0 },
10590 },
10591 {
10592 /* MOD_VEX_W_1_0F42_P_0_LEN_1 */
10593 { Bad_Opcode },
10594 { "kandnq", { MaskG, MaskVex, MaskR }, 0 },
10595 },
10596 {
10597 /* MOD_VEX_W_0_0F42_P_2_LEN_1 */
10598 { Bad_Opcode },
10599 { "kandnb", { MaskG, MaskVex, MaskR }, 0 },
10600 },
10601 {
10602 /* MOD_VEX_W_1_0F42_P_2_LEN_1 */
10603 { Bad_Opcode },
10604 { "kandnd", { MaskG, MaskVex, MaskR }, 0 },
10605 },
10606 {
10607 /* MOD_VEX_W_0_0F44_P_0_LEN_0 */
10608 { Bad_Opcode },
10609 { "knotw", { MaskG, MaskR }, 0 },
10610 },
10611 {
10612 /* MOD_VEX_W_1_0F44_P_0_LEN_0 */
10613 { Bad_Opcode },
10614 { "knotq", { MaskG, MaskR }, 0 },
10615 },
10616 {
10617 /* MOD_VEX_W_0_0F44_P_2_LEN_0 */
10618 { Bad_Opcode },
10619 { "knotb", { MaskG, MaskR }, 0 },
10620 },
10621 {
10622 /* MOD_VEX_W_1_0F44_P_2_LEN_0 */
10623 { Bad_Opcode },
10624 { "knotd", { MaskG, MaskR }, 0 },
10625 },
10626 {
10627 /* MOD_VEX_W_0_0F45_P_0_LEN_1 */
10628 { Bad_Opcode },
10629 { "korw", { MaskG, MaskVex, MaskR }, 0 },
10630 },
10631 {
10632 /* MOD_VEX_W_1_0F45_P_0_LEN_1 */
10633 { Bad_Opcode },
10634 { "korq", { MaskG, MaskVex, MaskR }, 0 },
10635 },
10636 {
10637 /* MOD_VEX_W_0_0F45_P_2_LEN_1 */
10638 { Bad_Opcode },
10639 { "korb", { MaskG, MaskVex, MaskR }, 0 },
10640 },
10641 {
10642 /* MOD_VEX_W_1_0F45_P_2_LEN_1 */
10643 { Bad_Opcode },
10644 { "kord", { MaskG, MaskVex, MaskR }, 0 },
10645 },
10646 {
10647 /* MOD_VEX_W_0_0F46_P_0_LEN_1 */
10648 { Bad_Opcode },
10649 { "kxnorw", { MaskG, MaskVex, MaskR }, 0 },
10650 },
10651 {
10652 /* MOD_VEX_W_1_0F46_P_0_LEN_1 */
10653 { Bad_Opcode },
10654 { "kxnorq", { MaskG, MaskVex, MaskR }, 0 },
10655 },
10656 {
10657 /* MOD_VEX_W_0_0F46_P_2_LEN_1 */
10658 { Bad_Opcode },
10659 { "kxnorb", { MaskG, MaskVex, MaskR }, 0 },
10660 },
10661 {
10662 /* MOD_VEX_W_1_0F46_P_2_LEN_1 */
10663 { Bad_Opcode },
10664 { "kxnord", { MaskG, MaskVex, MaskR }, 0 },
10665 },
10666 {
10667 /* MOD_VEX_W_0_0F47_P_0_LEN_1 */
10668 { Bad_Opcode },
10669 { "kxorw", { MaskG, MaskVex, MaskR }, 0 },
10670 },
10671 {
10672 /* MOD_VEX_W_1_0F47_P_0_LEN_1 */
10673 { Bad_Opcode },
10674 { "kxorq", { MaskG, MaskVex, MaskR }, 0 },
10675 },
10676 {
10677 /* MOD_VEX_W_0_0F47_P_2_LEN_1 */
10678 { Bad_Opcode },
10679 { "kxorb", { MaskG, MaskVex, MaskR }, 0 },
10680 },
10681 {
10682 /* MOD_VEX_W_1_0F47_P_2_LEN_1 */
10683 { Bad_Opcode },
10684 { "kxord", { MaskG, MaskVex, MaskR }, 0 },
10685 },
10686 {
10687 /* MOD_VEX_W_0_0F4A_P_0_LEN_1 */
10688 { Bad_Opcode },
10689 { "kaddw", { MaskG, MaskVex, MaskR }, 0 },
10690 },
10691 {
10692 /* MOD_VEX_W_1_0F4A_P_0_LEN_1 */
10693 { Bad_Opcode },
10694 { "kaddq", { MaskG, MaskVex, MaskR }, 0 },
10695 },
10696 {
10697 /* MOD_VEX_W_0_0F4A_P_2_LEN_1 */
10698 { Bad_Opcode },
10699 { "kaddb", { MaskG, MaskVex, MaskR }, 0 },
10700 },
10701 {
10702 /* MOD_VEX_W_1_0F4A_P_2_LEN_1 */
10703 { Bad_Opcode },
10704 { "kaddd", { MaskG, MaskVex, MaskR }, 0 },
10705 },
10706 {
10707 /* MOD_VEX_W_0_0F4B_P_0_LEN_1 */
10708 { Bad_Opcode },
10709 { "kunpckwd", { MaskG, MaskVex, MaskR }, 0 },
10710 },
10711 {
10712 /* MOD_VEX_W_1_0F4B_P_0_LEN_1 */
10713 { Bad_Opcode },
10714 { "kunpckdq", { MaskG, MaskVex, MaskR }, 0 },
10715 },
10716 {
10717 /* MOD_VEX_W_0_0F4B_P_2_LEN_1 */
10718 { Bad_Opcode },
10719 { "kunpckbw", { MaskG, MaskVex, MaskR }, 0 },
10720 },
10721 {
10722 /* MOD_VEX_0F50 */
10723 { Bad_Opcode },
10724 { "vmovmskpX", { Gdq, XS }, 0 },
10725 },
10726 {
10727 /* MOD_VEX_0F71_REG_2 */
10728 { Bad_Opcode },
10729 { PREFIX_TABLE (PREFIX_VEX_0F71_REG_2) },
10730 },
10731 {
10732 /* MOD_VEX_0F71_REG_4 */
10733 { Bad_Opcode },
10734 { PREFIX_TABLE (PREFIX_VEX_0F71_REG_4) },
10735 },
10736 {
10737 /* MOD_VEX_0F71_REG_6 */
10738 { Bad_Opcode },
10739 { PREFIX_TABLE (PREFIX_VEX_0F71_REG_6) },
10740 },
10741 {
10742 /* MOD_VEX_0F72_REG_2 */
10743 { Bad_Opcode },
10744 { PREFIX_TABLE (PREFIX_VEX_0F72_REG_2) },
10745 },
10746 {
10747 /* MOD_VEX_0F72_REG_4 */
10748 { Bad_Opcode },
10749 { PREFIX_TABLE (PREFIX_VEX_0F72_REG_4) },
10750 },
10751 {
10752 /* MOD_VEX_0F72_REG_6 */
10753 { Bad_Opcode },
10754 { PREFIX_TABLE (PREFIX_VEX_0F72_REG_6) },
10755 },
10756 {
10757 /* MOD_VEX_0F73_REG_2 */
10758 { Bad_Opcode },
10759 { PREFIX_TABLE (PREFIX_VEX_0F73_REG_2) },
10760 },
10761 {
10762 /* MOD_VEX_0F73_REG_3 */
10763 { Bad_Opcode },
10764 { PREFIX_TABLE (PREFIX_VEX_0F73_REG_3) },
10765 },
10766 {
10767 /* MOD_VEX_0F73_REG_6 */
10768 { Bad_Opcode },
10769 { PREFIX_TABLE (PREFIX_VEX_0F73_REG_6) },
10770 },
10771 {
10772 /* MOD_VEX_0F73_REG_7 */
10773 { Bad_Opcode },
10774 { PREFIX_TABLE (PREFIX_VEX_0F73_REG_7) },
10775 },
10776 {
10777 /* MOD_VEX_W_0_0F91_P_0_LEN_0 */
10778 { "kmovw", { Ew, MaskG }, 0 },
10779 { Bad_Opcode },
10780 },
10781 {
10782 /* MOD_VEX_W_0_0F91_P_0_LEN_0 */
10783 { "kmovq", { Eq, MaskG }, 0 },
10784 { Bad_Opcode },
10785 },
10786 {
10787 /* MOD_VEX_W_0_0F91_P_2_LEN_0 */
10788 { "kmovb", { Eb, MaskG }, 0 },
10789 { Bad_Opcode },
10790 },
10791 {
10792 /* MOD_VEX_W_0_0F91_P_2_LEN_0 */
10793 { "kmovd", { Ed, MaskG }, 0 },
10794 { Bad_Opcode },
10795 },
10796 {
10797 /* MOD_VEX_W_0_0F92_P_0_LEN_0 */
10798 { Bad_Opcode },
10799 { "kmovw", { MaskG, Rdq }, 0 },
10800 },
10801 {
10802 /* MOD_VEX_W_0_0F92_P_2_LEN_0 */
10803 { Bad_Opcode },
10804 { "kmovb", { MaskG, Rdq }, 0 },
10805 },
10806 {
10807 /* MOD_VEX_0F92_P_3_LEN_0 */
10808 { Bad_Opcode },
10809 { "kmovK", { MaskG, Rdq }, 0 },
10810 },
10811 {
10812 /* MOD_VEX_W_0_0F93_P_0_LEN_0 */
10813 { Bad_Opcode },
10814 { "kmovw", { Gdq, MaskR }, 0 },
10815 },
10816 {
10817 /* MOD_VEX_W_0_0F93_P_2_LEN_0 */
10818 { Bad_Opcode },
10819 { "kmovb", { Gdq, MaskR }, 0 },
10820 },
10821 {
10822 /* MOD_VEX_0F93_P_3_LEN_0 */
10823 { Bad_Opcode },
10824 { "kmovK", { Gdq, MaskR }, 0 },
10825 },
10826 {
10827 /* MOD_VEX_W_0_0F98_P_0_LEN_0 */
10828 { Bad_Opcode },
10829 { "kortestw", { MaskG, MaskR }, 0 },
10830 },
10831 {
10832 /* MOD_VEX_W_1_0F98_P_0_LEN_0 */
10833 { Bad_Opcode },
10834 { "kortestq", { MaskG, MaskR }, 0 },
10835 },
10836 {
10837 /* MOD_VEX_W_0_0F98_P_2_LEN_0 */
10838 { Bad_Opcode },
10839 { "kortestb", { MaskG, MaskR }, 0 },
10840 },
10841 {
10842 /* MOD_VEX_W_1_0F98_P_2_LEN_0 */
10843 { Bad_Opcode },
10844 { "kortestd", { MaskG, MaskR }, 0 },
10845 },
10846 {
10847 /* MOD_VEX_W_0_0F99_P_0_LEN_0 */
10848 { Bad_Opcode },
10849 { "ktestw", { MaskG, MaskR }, 0 },
10850 },
10851 {
10852 /* MOD_VEX_W_1_0F99_P_0_LEN_0 */
10853 { Bad_Opcode },
10854 { "ktestq", { MaskG, MaskR }, 0 },
10855 },
10856 {
10857 /* MOD_VEX_W_0_0F99_P_2_LEN_0 */
10858 { Bad_Opcode },
10859 { "ktestb", { MaskG, MaskR }, 0 },
10860 },
10861 {
10862 /* MOD_VEX_W_1_0F99_P_2_LEN_0 */
10863 { Bad_Opcode },
10864 { "ktestd", { MaskG, MaskR }, 0 },
10865 },
10866 {
10867 /* MOD_VEX_0FAE_REG_2 */
10868 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_2_M_0) },
10869 },
10870 {
10871 /* MOD_VEX_0FAE_REG_3 */
10872 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_3_M_0) },
10873 },
10874 {
10875 /* MOD_VEX_0FD7_PREFIX_2 */
10876 { Bad_Opcode },
10877 { "vpmovmskb", { Gdq, XS }, 0 },
10878 },
10879 {
10880 /* MOD_VEX_0FE7_PREFIX_2 */
10881 { "vmovntdq", { Mx, XM }, 0 },
10882 },
10883 {
10884 /* MOD_VEX_0FF0_PREFIX_3 */
10885 { "vlddqu", { XM, M }, 0 },
10886 },
10887 {
10888 /* MOD_VEX_0F381A_PREFIX_2 */
10889 { VEX_LEN_TABLE (VEX_LEN_0F381A_P_2_M_0) },
10890 },
10891 {
10892 /* MOD_VEX_0F382A_PREFIX_2 */
10893 { "vmovntdqa", { XM, Mx }, 0 },
10894 },
10895 {
10896 /* MOD_VEX_0F382C_PREFIX_2 */
10897 { VEX_W_TABLE (VEX_W_0F382C_P_2_M_0) },
10898 },
10899 {
10900 /* MOD_VEX_0F382D_PREFIX_2 */
10901 { VEX_W_TABLE (VEX_W_0F382D_P_2_M_0) },
10902 },
10903 {
10904 /* MOD_VEX_0F382E_PREFIX_2 */
10905 { VEX_W_TABLE (VEX_W_0F382E_P_2_M_0) },
10906 },
10907 {
10908 /* MOD_VEX_0F382F_PREFIX_2 */
10909 { VEX_W_TABLE (VEX_W_0F382F_P_2_M_0) },
10910 },
10911 {
10912 /* MOD_VEX_0F385A_PREFIX_2 */
10913 { VEX_LEN_TABLE (VEX_LEN_0F385A_P_2_M_0) },
10914 },
10915 {
10916 /* MOD_VEX_0F388C_PREFIX_2 */
10917 { "vpmaskmov%LW", { XM, Vex, Mx }, 0 },
10918 },
10919 {
10920 /* MOD_VEX_0F388E_PREFIX_2 */
10921 { "vpmaskmov%LW", { Mx, Vex, XM }, 0 },
10922 },
10923 {
10924 /* MOD_VEX_W_0_0F3A30_P_2_LEN_0 */
10925 { Bad_Opcode },
10926 { "kshiftrb", { MaskG, MaskR, Ib }, 0 },
10927 },
10928 {
10929 /* MOD_VEX_W_1_0F3A30_P_2_LEN_0 */
10930 { Bad_Opcode },
10931 { "kshiftrw", { MaskG, MaskR, Ib }, 0 },
10932 },
10933 {
10934 /* MOD_VEX_W_0_0F3A31_P_2_LEN_0 */
10935 { Bad_Opcode },
10936 { "kshiftrd", { MaskG, MaskR, Ib }, 0 },
10937 },
10938 {
10939 /* MOD_VEX_W_1_0F3A31_P_2_LEN_0 */
10940 { Bad_Opcode },
10941 { "kshiftrq", { MaskG, MaskR, Ib }, 0 },
10942 },
10943 {
10944 /* MOD_VEX_W_0_0F3A32_P_2_LEN_0 */
10945 { Bad_Opcode },
10946 { "kshiftlb", { MaskG, MaskR, Ib }, 0 },
10947 },
10948 {
10949 /* MOD_VEX_W_1_0F3A32_P_2_LEN_0 */
10950 { Bad_Opcode },
10951 { "kshiftlw", { MaskG, MaskR, Ib }, 0 },
10952 },
10953 {
10954 /* MOD_VEX_W_0_0F3A33_P_2_LEN_0 */
10955 { Bad_Opcode },
10956 { "kshiftld", { MaskG, MaskR, Ib }, 0 },
10957 },
10958 {
10959 /* MOD_VEX_W_1_0F3A33_P_2_LEN_0 */
10960 { Bad_Opcode },
10961 { "kshiftlq", { MaskG, MaskR, Ib }, 0 },
10962 },
10963
10964 #include "i386-dis-evex-mod.h"
10965 };
10966
10967 static const struct dis386 rm_table[][8] = {
10968 {
10969 /* RM_C6_REG_7 */
10970 { "xabort", { Skip_MODRM, Ib }, 0 },
10971 },
10972 {
10973 /* RM_C7_REG_7 */
10974 { "xbeginT", { Skip_MODRM, Jv }, 0 },
10975 },
10976 {
10977 /* RM_0F01_REG_0 */
10978 { "enclv", { Skip_MODRM }, 0 },
10979 { "vmcall", { Skip_MODRM }, 0 },
10980 { "vmlaunch", { Skip_MODRM }, 0 },
10981 { "vmresume", { Skip_MODRM }, 0 },
10982 { "vmxoff", { Skip_MODRM }, 0 },
10983 { "pconfig", { Skip_MODRM }, 0 },
10984 },
10985 {
10986 /* RM_0F01_REG_1 */
10987 { "monitor", { { OP_Monitor, 0 } }, 0 },
10988 { "mwait", { { OP_Mwait, 0 } }, 0 },
10989 { "clac", { Skip_MODRM }, 0 },
10990 { "stac", { Skip_MODRM }, 0 },
10991 { Bad_Opcode },
10992 { Bad_Opcode },
10993 { Bad_Opcode },
10994 { "encls", { Skip_MODRM }, 0 },
10995 },
10996 {
10997 /* RM_0F01_REG_2 */
10998 { "xgetbv", { Skip_MODRM }, 0 },
10999 { "xsetbv", { Skip_MODRM }, 0 },
11000 { Bad_Opcode },
11001 { Bad_Opcode },
11002 { "vmfunc", { Skip_MODRM }, 0 },
11003 { "xend", { Skip_MODRM }, 0 },
11004 { "xtest", { Skip_MODRM }, 0 },
11005 { "enclu", { Skip_MODRM }, 0 },
11006 },
11007 {
11008 /* RM_0F01_REG_3 */
11009 { "vmrun", { Skip_MODRM }, 0 },
11010 { "vmmcall", { Skip_MODRM }, 0 },
11011 { "vmload", { Skip_MODRM }, 0 },
11012 { "vmsave", { Skip_MODRM }, 0 },
11013 { "stgi", { Skip_MODRM }, 0 },
11014 { "clgi", { Skip_MODRM }, 0 },
11015 { "skinit", { Skip_MODRM }, 0 },
11016 { "invlpga", { Skip_MODRM }, 0 },
11017 },
11018 {
11019 /* RM_0F01_REG_5 */
11020 { PREFIX_TABLE (PREFIX_MOD_3_0F01_REG_5_RM_0) },
11021 { Bad_Opcode },
11022 { PREFIX_TABLE (PREFIX_MOD_3_0F01_REG_5_RM_2) },
11023 { Bad_Opcode },
11024 { Bad_Opcode },
11025 { Bad_Opcode },
11026 { "rdpkru", { Skip_MODRM }, 0 },
11027 { "wrpkru", { Skip_MODRM }, 0 },
11028 },
11029 {
11030 /* RM_0F01_REG_7 */
11031 { "swapgs", { Skip_MODRM }, 0 },
11032 { "rdtscp", { Skip_MODRM }, 0 },
11033 { "monitorx", { { OP_Monitor, 0 } }, 0 },
11034 { "mwaitx", { { OP_Mwaitx, 0 } }, 0 },
11035 { "clzero", { Skip_MODRM }, 0 },
11036 },
11037 {
11038 /* RM_0F1E_MOD_3_REG_7 */
11039 { "nopQ", { Ev }, 0 },
11040 { "nopQ", { Ev }, 0 },
11041 { "endbr64", { Skip_MODRM }, PREFIX_OPCODE },
11042 { "endbr32", { Skip_MODRM }, PREFIX_OPCODE },
11043 { "nopQ", { Ev }, 0 },
11044 { "nopQ", { Ev }, 0 },
11045 { "nopQ", { Ev }, 0 },
11046 { "nopQ", { Ev }, 0 },
11047 },
11048 {
11049 /* RM_0FAE_REG_6 */
11050 { "mfence", { Skip_MODRM }, 0 },
11051 },
11052 {
11053 /* RM_0FAE_REG_7 */
11054 { "sfence", { Skip_MODRM }, 0 },
11055
11056 },
11057 };
11058
11059 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
11060
11061 /* We use the high bit to indicate different name for the same
11062 prefix. */
11063 #define REP_PREFIX (0xf3 | 0x100)
11064 #define XACQUIRE_PREFIX (0xf2 | 0x200)
11065 #define XRELEASE_PREFIX (0xf3 | 0x400)
11066 #define BND_PREFIX (0xf2 | 0x400)
11067 #define NOTRACK_PREFIX (0x3e | 0x100)
11068
11069 static int
11070 ckprefix (void)
11071 {
11072 int newrex, i, length;
11073 rex = 0;
11074 rex_ignored = 0;
11075 prefixes = 0;
11076 used_prefixes = 0;
11077 rex_used = 0;
11078 last_lock_prefix = -1;
11079 last_repz_prefix = -1;
11080 last_repnz_prefix = -1;
11081 last_data_prefix = -1;
11082 last_addr_prefix = -1;
11083 last_rex_prefix = -1;
11084 last_seg_prefix = -1;
11085 fwait_prefix = -1;
11086 active_seg_prefix = 0;
11087 for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
11088 all_prefixes[i] = 0;
11089 i = 0;
11090 length = 0;
11091 /* The maximum instruction length is 15bytes. */
11092 while (length < MAX_CODE_LENGTH - 1)
11093 {
11094 FETCH_DATA (the_info, codep + 1);
11095 newrex = 0;
11096 switch (*codep)
11097 {
11098 /* REX prefixes family. */
11099 case 0x40:
11100 case 0x41:
11101 case 0x42:
11102 case 0x43:
11103 case 0x44:
11104 case 0x45:
11105 case 0x46:
11106 case 0x47:
11107 case 0x48:
11108 case 0x49:
11109 case 0x4a:
11110 case 0x4b:
11111 case 0x4c:
11112 case 0x4d:
11113 case 0x4e:
11114 case 0x4f:
11115 if (address_mode == mode_64bit)
11116 newrex = *codep;
11117 else
11118 return 1;
11119 last_rex_prefix = i;
11120 break;
11121 case 0xf3:
11122 prefixes |= PREFIX_REPZ;
11123 last_repz_prefix = i;
11124 break;
11125 case 0xf2:
11126 prefixes |= PREFIX_REPNZ;
11127 last_repnz_prefix = i;
11128 break;
11129 case 0xf0:
11130 prefixes |= PREFIX_LOCK;
11131 last_lock_prefix = i;
11132 break;
11133 case 0x2e:
11134 prefixes |= PREFIX_CS;
11135 last_seg_prefix = i;
11136 active_seg_prefix = PREFIX_CS;
11137 break;
11138 case 0x36:
11139 prefixes |= PREFIX_SS;
11140 last_seg_prefix = i;
11141 active_seg_prefix = PREFIX_SS;
11142 break;
11143 case 0x3e:
11144 prefixes |= PREFIX_DS;
11145 last_seg_prefix = i;
11146 active_seg_prefix = PREFIX_DS;
11147 break;
11148 case 0x26:
11149 prefixes |= PREFIX_ES;
11150 last_seg_prefix = i;
11151 active_seg_prefix = PREFIX_ES;
11152 break;
11153 case 0x64:
11154 prefixes |= PREFIX_FS;
11155 last_seg_prefix = i;
11156 active_seg_prefix = PREFIX_FS;
11157 break;
11158 case 0x65:
11159 prefixes |= PREFIX_GS;
11160 last_seg_prefix = i;
11161 active_seg_prefix = PREFIX_GS;
11162 break;
11163 case 0x66:
11164 prefixes |= PREFIX_DATA;
11165 last_data_prefix = i;
11166 break;
11167 case 0x67:
11168 prefixes |= PREFIX_ADDR;
11169 last_addr_prefix = i;
11170 break;
11171 case FWAIT_OPCODE:
11172 /* fwait is really an instruction. If there are prefixes
11173 before the fwait, they belong to the fwait, *not* to the
11174 following instruction. */
11175 fwait_prefix = i;
11176 if (prefixes || rex)
11177 {
11178 prefixes |= PREFIX_FWAIT;
11179 codep++;
11180 /* This ensures that the previous REX prefixes are noticed
11181 as unused prefixes, as in the return case below. */
11182 rex_used = rex;
11183 return 1;
11184 }
11185 prefixes = PREFIX_FWAIT;
11186 break;
11187 default:
11188 return 1;
11189 }
11190 /* Rex is ignored when followed by another prefix. */
11191 if (rex)
11192 {
11193 rex_used = rex;
11194 return 1;
11195 }
11196 if (*codep != FWAIT_OPCODE)
11197 all_prefixes[i++] = *codep;
11198 rex = newrex;
11199 codep++;
11200 length++;
11201 }
11202 return 0;
11203 }
11204
11205 /* Return the name of the prefix byte PREF, or NULL if PREF is not a
11206 prefix byte. */
11207
11208 static const char *
11209 prefix_name (int pref, int sizeflag)
11210 {
11211 static const char *rexes [16] =
11212 {
11213 "rex", /* 0x40 */
11214 "rex.B", /* 0x41 */
11215 "rex.X", /* 0x42 */
11216 "rex.XB", /* 0x43 */
11217 "rex.R", /* 0x44 */
11218 "rex.RB", /* 0x45 */
11219 "rex.RX", /* 0x46 */
11220 "rex.RXB", /* 0x47 */
11221 "rex.W", /* 0x48 */
11222 "rex.WB", /* 0x49 */
11223 "rex.WX", /* 0x4a */
11224 "rex.WXB", /* 0x4b */
11225 "rex.WR", /* 0x4c */
11226 "rex.WRB", /* 0x4d */
11227 "rex.WRX", /* 0x4e */
11228 "rex.WRXB", /* 0x4f */
11229 };
11230
11231 switch (pref)
11232 {
11233 /* REX prefixes family. */
11234 case 0x40:
11235 case 0x41:
11236 case 0x42:
11237 case 0x43:
11238 case 0x44:
11239 case 0x45:
11240 case 0x46:
11241 case 0x47:
11242 case 0x48:
11243 case 0x49:
11244 case 0x4a:
11245 case 0x4b:
11246 case 0x4c:
11247 case 0x4d:
11248 case 0x4e:
11249 case 0x4f:
11250 return rexes [pref - 0x40];
11251 case 0xf3:
11252 return "repz";
11253 case 0xf2:
11254 return "repnz";
11255 case 0xf0:
11256 return "lock";
11257 case 0x2e:
11258 return "cs";
11259 case 0x36:
11260 return "ss";
11261 case 0x3e:
11262 return "ds";
11263 case 0x26:
11264 return "es";
11265 case 0x64:
11266 return "fs";
11267 case 0x65:
11268 return "gs";
11269 case 0x66:
11270 return (sizeflag & DFLAG) ? "data16" : "data32";
11271 case 0x67:
11272 if (address_mode == mode_64bit)
11273 return (sizeflag & AFLAG) ? "addr32" : "addr64";
11274 else
11275 return (sizeflag & AFLAG) ? "addr16" : "addr32";
11276 case FWAIT_OPCODE:
11277 return "fwait";
11278 case REP_PREFIX:
11279 return "rep";
11280 case XACQUIRE_PREFIX:
11281 return "xacquire";
11282 case XRELEASE_PREFIX:
11283 return "xrelease";
11284 case BND_PREFIX:
11285 return "bnd";
11286 case NOTRACK_PREFIX:
11287 return "notrack";
11288 default:
11289 return NULL;
11290 }
11291 }
11292
11293 static char op_out[MAX_OPERANDS][100];
11294 static int op_ad, op_index[MAX_OPERANDS];
11295 static int two_source_ops;
11296 static bfd_vma op_address[MAX_OPERANDS];
11297 static bfd_vma op_riprel[MAX_OPERANDS];
11298 static bfd_vma start_pc;
11299
11300 /*
11301 * On the 386's of 1988, the maximum length of an instruction is 15 bytes.
11302 * (see topic "Redundant prefixes" in the "Differences from 8086"
11303 * section of the "Virtual 8086 Mode" chapter.)
11304 * 'pc' should be the address of this instruction, it will
11305 * be used to print the target address if this is a relative jump or call
11306 * The function returns the length of this instruction in bytes.
11307 */
11308
11309 static char intel_syntax;
11310 static char intel_mnemonic = !SYSV386_COMPAT;
11311 static char open_char;
11312 static char close_char;
11313 static char separator_char;
11314 static char scale_char;
11315
11316 enum x86_64_isa
11317 {
11318 amd64 = 0,
11319 intel64
11320 };
11321
11322 static enum x86_64_isa isa64;
11323
11324 /* Here for backwards compatibility. When gdb stops using
11325 print_insn_i386_att and print_insn_i386_intel these functions can
11326 disappear, and print_insn_i386 be merged into print_insn. */
11327 int
11328 print_insn_i386_att (bfd_vma pc, disassemble_info *info)
11329 {
11330 intel_syntax = 0;
11331
11332 return print_insn (pc, info);
11333 }
11334
11335 int
11336 print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
11337 {
11338 intel_syntax = 1;
11339
11340 return print_insn (pc, info);
11341 }
11342
11343 int
11344 print_insn_i386 (bfd_vma pc, disassemble_info *info)
11345 {
11346 intel_syntax = -1;
11347
11348 return print_insn (pc, info);
11349 }
11350
11351 void
11352 print_i386_disassembler_options (FILE *stream)
11353 {
11354 fprintf (stream, _("\n\
11355 The following i386/x86-64 specific disassembler options are supported for use\n\
11356 with the -M switch (multiple options should be separated by commas):\n"));
11357
11358 fprintf (stream, _(" x86-64 Disassemble in 64bit mode\n"));
11359 fprintf (stream, _(" i386 Disassemble in 32bit mode\n"));
11360 fprintf (stream, _(" i8086 Disassemble in 16bit mode\n"));
11361 fprintf (stream, _(" att Display instruction in AT&T syntax\n"));
11362 fprintf (stream, _(" intel Display instruction in Intel syntax\n"));
11363 fprintf (stream, _(" att-mnemonic\n"
11364 " Display instruction in AT&T mnemonic\n"));
11365 fprintf (stream, _(" intel-mnemonic\n"
11366 " Display instruction in Intel mnemonic\n"));
11367 fprintf (stream, _(" addr64 Assume 64bit address size\n"));
11368 fprintf (stream, _(" addr32 Assume 32bit address size\n"));
11369 fprintf (stream, _(" addr16 Assume 16bit address size\n"));
11370 fprintf (stream, _(" data32 Assume 32bit data size\n"));
11371 fprintf (stream, _(" data16 Assume 16bit data size\n"));
11372 fprintf (stream, _(" suffix Always display instruction suffix in AT&T syntax\n"));
11373 fprintf (stream, _(" amd64 Display instruction in AMD64 ISA\n"));
11374 fprintf (stream, _(" intel64 Display instruction in Intel64 ISA\n"));
11375 }
11376
11377 /* Bad opcode. */
11378 static const struct dis386 bad_opcode = { "(bad)", { XX }, 0 };
11379
11380 /* Get a pointer to struct dis386 with a valid name. */
11381
11382 static const struct dis386 *
11383 get_valid_dis386 (const struct dis386 *dp, disassemble_info *info)
11384 {
11385 int vindex, vex_table_index;
11386
11387 if (dp->name != NULL)
11388 return dp;
11389
11390 switch (dp->op[0].bytemode)
11391 {
11392 case USE_REG_TABLE:
11393 dp = &reg_table[dp->op[1].bytemode][modrm.reg];
11394 break;
11395
11396 case USE_MOD_TABLE:
11397 vindex = modrm.mod == 0x3 ? 1 : 0;
11398 dp = &mod_table[dp->op[1].bytemode][vindex];
11399 break;
11400
11401 case USE_RM_TABLE:
11402 dp = &rm_table[dp->op[1].bytemode][modrm.rm];
11403 break;
11404
11405 case USE_PREFIX_TABLE:
11406 if (need_vex)
11407 {
11408 /* The prefix in VEX is implicit. */
11409 switch (vex.prefix)
11410 {
11411 case 0:
11412 vindex = 0;
11413 break;
11414 case REPE_PREFIX_OPCODE:
11415 vindex = 1;
11416 break;
11417 case DATA_PREFIX_OPCODE:
11418 vindex = 2;
11419 break;
11420 case REPNE_PREFIX_OPCODE:
11421 vindex = 3;
11422 break;
11423 default:
11424 abort ();
11425 break;
11426 }
11427 }
11428 else
11429 {
11430 int last_prefix = -1;
11431 int prefix = 0;
11432 vindex = 0;
11433 /* We check PREFIX_REPNZ and PREFIX_REPZ before PREFIX_DATA.
11434 When there are multiple PREFIX_REPNZ and PREFIX_REPZ, the
11435 last one wins. */
11436 if ((prefixes & (PREFIX_REPZ | PREFIX_REPNZ)) != 0)
11437 {
11438 if (last_repz_prefix > last_repnz_prefix)
11439 {
11440 vindex = 1;
11441 prefix = PREFIX_REPZ;
11442 last_prefix = last_repz_prefix;
11443 }
11444 else
11445 {
11446 vindex = 3;
11447 prefix = PREFIX_REPNZ;
11448 last_prefix = last_repnz_prefix;
11449 }
11450
11451 /* Check if prefix should be ignored. */
11452 if ((((prefix_table[dp->op[1].bytemode][vindex].prefix_requirement
11453 & PREFIX_IGNORED) >> PREFIX_IGNORED_SHIFT)
11454 & prefix) != 0)
11455 vindex = 0;
11456 }
11457
11458 if (vindex == 0 && (prefixes & PREFIX_DATA) != 0)
11459 {
11460 vindex = 2;
11461 prefix = PREFIX_DATA;
11462 last_prefix = last_data_prefix;
11463 }
11464
11465 if (vindex != 0)
11466 {
11467 used_prefixes |= prefix;
11468 all_prefixes[last_prefix] = 0;
11469 }
11470 }
11471 dp = &prefix_table[dp->op[1].bytemode][vindex];
11472 break;
11473
11474 case USE_X86_64_TABLE:
11475 vindex = address_mode == mode_64bit ? 1 : 0;
11476 dp = &x86_64_table[dp->op[1].bytemode][vindex];
11477 break;
11478
11479 case USE_3BYTE_TABLE:
11480 FETCH_DATA (info, codep + 2);
11481 vindex = *codep++;
11482 dp = &three_byte_table[dp->op[1].bytemode][vindex];
11483 end_codep = codep;
11484 modrm.mod = (*codep >> 6) & 3;
11485 modrm.reg = (*codep >> 3) & 7;
11486 modrm.rm = *codep & 7;
11487 break;
11488
11489 case USE_VEX_LEN_TABLE:
11490 if (!need_vex)
11491 abort ();
11492
11493 switch (vex.length)
11494 {
11495 case 128:
11496 vindex = 0;
11497 break;
11498 case 256:
11499 vindex = 1;
11500 break;
11501 default:
11502 abort ();
11503 break;
11504 }
11505
11506 dp = &vex_len_table[dp->op[1].bytemode][vindex];
11507 break;
11508
11509 case USE_EVEX_LEN_TABLE:
11510 if (!vex.evex)
11511 abort ();
11512
11513 switch (vex.length)
11514 {
11515 case 128:
11516 vindex = 0;
11517 break;
11518 case 256:
11519 vindex = 1;
11520 break;
11521 case 512:
11522 vindex = 2;
11523 break;
11524 default:
11525 abort ();
11526 break;
11527 }
11528
11529 dp = &evex_len_table[dp->op[1].bytemode][vindex];
11530 break;
11531
11532 case USE_XOP_8F_TABLE:
11533 FETCH_DATA (info, codep + 3);
11534 /* All bits in the REX prefix are ignored. */
11535 rex_ignored = rex;
11536 rex = ~(*codep >> 5) & 0x7;
11537
11538 /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm". */
11539 switch ((*codep & 0x1f))
11540 {
11541 default:
11542 dp = &bad_opcode;
11543 return dp;
11544 case 0x8:
11545 vex_table_index = XOP_08;
11546 break;
11547 case 0x9:
11548 vex_table_index = XOP_09;
11549 break;
11550 case 0xa:
11551 vex_table_index = XOP_0A;
11552 break;
11553 }
11554 codep++;
11555 vex.w = *codep & 0x80;
11556 if (vex.w && address_mode == mode_64bit)
11557 rex |= REX_W;
11558
11559 vex.register_specifier = (~(*codep >> 3)) & 0xf;
11560 if (address_mode != mode_64bit)
11561 {
11562 /* In 16/32-bit mode REX_B is silently ignored. */
11563 rex &= ~REX_B;
11564 }
11565
11566 vex.length = (*codep & 0x4) ? 256 : 128;
11567 switch ((*codep & 0x3))
11568 {
11569 case 0:
11570 break;
11571 case 1:
11572 vex.prefix = DATA_PREFIX_OPCODE;
11573 break;
11574 case 2:
11575 vex.prefix = REPE_PREFIX_OPCODE;
11576 break;
11577 case 3:
11578 vex.prefix = REPNE_PREFIX_OPCODE;
11579 break;
11580 }
11581 need_vex = 1;
11582 need_vex_reg = 1;
11583 codep++;
11584 vindex = *codep++;
11585 dp = &xop_table[vex_table_index][vindex];
11586
11587 end_codep = codep;
11588 FETCH_DATA (info, codep + 1);
11589 modrm.mod = (*codep >> 6) & 3;
11590 modrm.reg = (*codep >> 3) & 7;
11591 modrm.rm = *codep & 7;
11592 break;
11593
11594 case USE_VEX_C4_TABLE:
11595 /* VEX prefix. */
11596 FETCH_DATA (info, codep + 3);
11597 /* All bits in the REX prefix are ignored. */
11598 rex_ignored = rex;
11599 rex = ~(*codep >> 5) & 0x7;
11600 switch ((*codep & 0x1f))
11601 {
11602 default:
11603 dp = &bad_opcode;
11604 return dp;
11605 case 0x1:
11606 vex_table_index = VEX_0F;
11607 break;
11608 case 0x2:
11609 vex_table_index = VEX_0F38;
11610 break;
11611 case 0x3:
11612 vex_table_index = VEX_0F3A;
11613 break;
11614 }
11615 codep++;
11616 vex.w = *codep & 0x80;
11617 if (address_mode == mode_64bit)
11618 {
11619 if (vex.w)
11620 rex |= REX_W;
11621 }
11622 else
11623 {
11624 /* For the 3-byte VEX prefix in 32-bit mode, the REX_B bit
11625 is ignored, other REX bits are 0 and the highest bit in
11626 VEX.vvvv is also ignored (but we mustn't clear it here). */
11627 rex = 0;
11628 }
11629 vex.register_specifier = (~(*codep >> 3)) & 0xf;
11630 vex.length = (*codep & 0x4) ? 256 : 128;
11631 switch ((*codep & 0x3))
11632 {
11633 case 0:
11634 break;
11635 case 1:
11636 vex.prefix = DATA_PREFIX_OPCODE;
11637 break;
11638 case 2:
11639 vex.prefix = REPE_PREFIX_OPCODE;
11640 break;
11641 case 3:
11642 vex.prefix = REPNE_PREFIX_OPCODE;
11643 break;
11644 }
11645 need_vex = 1;
11646 need_vex_reg = 1;
11647 codep++;
11648 vindex = *codep++;
11649 dp = &vex_table[vex_table_index][vindex];
11650 end_codep = codep;
11651 /* There is no MODRM byte for VEX0F 77. */
11652 if (vex_table_index != VEX_0F || vindex != 0x77)
11653 {
11654 FETCH_DATA (info, codep + 1);
11655 modrm.mod = (*codep >> 6) & 3;
11656 modrm.reg = (*codep >> 3) & 7;
11657 modrm.rm = *codep & 7;
11658 }
11659 break;
11660
11661 case USE_VEX_C5_TABLE:
11662 /* VEX prefix. */
11663 FETCH_DATA (info, codep + 2);
11664 /* All bits in the REX prefix are ignored. */
11665 rex_ignored = rex;
11666 rex = (*codep & 0x80) ? 0 : REX_R;
11667
11668 /* For the 2-byte VEX prefix in 32-bit mode, the highest bit in
11669 VEX.vvvv is 1. */
11670 vex.register_specifier = (~(*codep >> 3)) & 0xf;
11671 vex.length = (*codep & 0x4) ? 256 : 128;
11672 switch ((*codep & 0x3))
11673 {
11674 case 0:
11675 break;
11676 case 1:
11677 vex.prefix = DATA_PREFIX_OPCODE;
11678 break;
11679 case 2:
11680 vex.prefix = REPE_PREFIX_OPCODE;
11681 break;
11682 case 3:
11683 vex.prefix = REPNE_PREFIX_OPCODE;
11684 break;
11685 }
11686 need_vex = 1;
11687 need_vex_reg = 1;
11688 codep++;
11689 vindex = *codep++;
11690 dp = &vex_table[dp->op[1].bytemode][vindex];
11691 end_codep = codep;
11692 /* There is no MODRM byte for VEX 77. */
11693 if (vindex != 0x77)
11694 {
11695 FETCH_DATA (info, codep + 1);
11696 modrm.mod = (*codep >> 6) & 3;
11697 modrm.reg = (*codep >> 3) & 7;
11698 modrm.rm = *codep & 7;
11699 }
11700 break;
11701
11702 case USE_VEX_W_TABLE:
11703 if (!need_vex)
11704 abort ();
11705
11706 dp = &vex_w_table[dp->op[1].bytemode][vex.w ? 1 : 0];
11707 break;
11708
11709 case USE_EVEX_TABLE:
11710 two_source_ops = 0;
11711 /* EVEX prefix. */
11712 vex.evex = 1;
11713 FETCH_DATA (info, codep + 4);
11714 /* All bits in the REX prefix are ignored. */
11715 rex_ignored = rex;
11716 /* The first byte after 0x62. */
11717 rex = ~(*codep >> 5) & 0x7;
11718 vex.r = *codep & 0x10;
11719 switch ((*codep & 0xf))
11720 {
11721 default:
11722 return &bad_opcode;
11723 case 0x1:
11724 vex_table_index = EVEX_0F;
11725 break;
11726 case 0x2:
11727 vex_table_index = EVEX_0F38;
11728 break;
11729 case 0x3:
11730 vex_table_index = EVEX_0F3A;
11731 break;
11732 }
11733
11734 /* The second byte after 0x62. */
11735 codep++;
11736 vex.w = *codep & 0x80;
11737 if (vex.w && address_mode == mode_64bit)
11738 rex |= REX_W;
11739
11740 vex.register_specifier = (~(*codep >> 3)) & 0xf;
11741
11742 /* The U bit. */
11743 if (!(*codep & 0x4))
11744 return &bad_opcode;
11745
11746 switch ((*codep & 0x3))
11747 {
11748 case 0:
11749 break;
11750 case 1:
11751 vex.prefix = DATA_PREFIX_OPCODE;
11752 break;
11753 case 2:
11754 vex.prefix = REPE_PREFIX_OPCODE;
11755 break;
11756 case 3:
11757 vex.prefix = REPNE_PREFIX_OPCODE;
11758 break;
11759 }
11760
11761 /* The third byte after 0x62. */
11762 codep++;
11763
11764 /* Remember the static rounding bits. */
11765 vex.ll = (*codep >> 5) & 3;
11766 vex.b = (*codep & 0x10) != 0;
11767
11768 vex.v = *codep & 0x8;
11769 vex.mask_register_specifier = *codep & 0x7;
11770 vex.zeroing = *codep & 0x80;
11771
11772 if (address_mode != mode_64bit)
11773 {
11774 /* In 16/32-bit mode silently ignore following bits. */
11775 rex &= ~REX_B;
11776 vex.r = 1;
11777 vex.v = 1;
11778 }
11779
11780 need_vex = 1;
11781 need_vex_reg = 1;
11782 codep++;
11783 vindex = *codep++;
11784 dp = &evex_table[vex_table_index][vindex];
11785 end_codep = codep;
11786 FETCH_DATA (info, codep + 1);
11787 modrm.mod = (*codep >> 6) & 3;
11788 modrm.reg = (*codep >> 3) & 7;
11789 modrm.rm = *codep & 7;
11790
11791 /* Set vector length. */
11792 if (modrm.mod == 3 && vex.b)
11793 vex.length = 512;
11794 else
11795 {
11796 switch (vex.ll)
11797 {
11798 case 0x0:
11799 vex.length = 128;
11800 break;
11801 case 0x1:
11802 vex.length = 256;
11803 break;
11804 case 0x2:
11805 vex.length = 512;
11806 break;
11807 default:
11808 return &bad_opcode;
11809 }
11810 }
11811 break;
11812
11813 case 0:
11814 dp = &bad_opcode;
11815 break;
11816
11817 default:
11818 abort ();
11819 }
11820
11821 if (dp->name != NULL)
11822 return dp;
11823 else
11824 return get_valid_dis386 (dp, info);
11825 }
11826
11827 static void
11828 get_sib (disassemble_info *info, int sizeflag)
11829 {
11830 /* If modrm.mod == 3, operand must be register. */
11831 if (need_modrm
11832 && ((sizeflag & AFLAG) || address_mode == mode_64bit)
11833 && modrm.mod != 3
11834 && modrm.rm == 4)
11835 {
11836 FETCH_DATA (info, codep + 2);
11837 sib.index = (codep [1] >> 3) & 7;
11838 sib.scale = (codep [1] >> 6) & 3;
11839 sib.base = codep [1] & 7;
11840 }
11841 }
11842
11843 static int
11844 print_insn (bfd_vma pc, disassemble_info *info)
11845 {
11846 const struct dis386 *dp;
11847 int i;
11848 char *op_txt[MAX_OPERANDS];
11849 int needcomma;
11850 int sizeflag, orig_sizeflag;
11851 const char *p;
11852 struct dis_private priv;
11853 int prefix_length;
11854
11855 priv.orig_sizeflag = AFLAG | DFLAG;
11856 if ((info->mach & bfd_mach_i386_i386) != 0)
11857 address_mode = mode_32bit;
11858 else if (info->mach == bfd_mach_i386_i8086)
11859 {
11860 address_mode = mode_16bit;
11861 priv.orig_sizeflag = 0;
11862 }
11863 else
11864 address_mode = mode_64bit;
11865
11866 if (intel_syntax == (char) -1)
11867 intel_syntax = (info->mach & bfd_mach_i386_intel_syntax) != 0;
11868
11869 for (p = info->disassembler_options; p != NULL; )
11870 {
11871 if (CONST_STRNEQ (p, "amd64"))
11872 isa64 = amd64;
11873 else if (CONST_STRNEQ (p, "intel64"))
11874 isa64 = intel64;
11875 else if (CONST_STRNEQ (p, "x86-64"))
11876 {
11877 address_mode = mode_64bit;
11878 priv.orig_sizeflag = AFLAG | DFLAG;
11879 }
11880 else if (CONST_STRNEQ (p, "i386"))
11881 {
11882 address_mode = mode_32bit;
11883 priv.orig_sizeflag = AFLAG | DFLAG;
11884 }
11885 else if (CONST_STRNEQ (p, "i8086"))
11886 {
11887 address_mode = mode_16bit;
11888 priv.orig_sizeflag = 0;
11889 }
11890 else if (CONST_STRNEQ (p, "intel"))
11891 {
11892 intel_syntax = 1;
11893 if (CONST_STRNEQ (p + 5, "-mnemonic"))
11894 intel_mnemonic = 1;
11895 }
11896 else if (CONST_STRNEQ (p, "att"))
11897 {
11898 intel_syntax = 0;
11899 if (CONST_STRNEQ (p + 3, "-mnemonic"))
11900 intel_mnemonic = 0;
11901 }
11902 else if (CONST_STRNEQ (p, "addr"))
11903 {
11904 if (address_mode == mode_64bit)
11905 {
11906 if (p[4] == '3' && p[5] == '2')
11907 priv.orig_sizeflag &= ~AFLAG;
11908 else if (p[4] == '6' && p[5] == '4')
11909 priv.orig_sizeflag |= AFLAG;
11910 }
11911 else
11912 {
11913 if (p[4] == '1' && p[5] == '6')
11914 priv.orig_sizeflag &= ~AFLAG;
11915 else if (p[4] == '3' && p[5] == '2')
11916 priv.orig_sizeflag |= AFLAG;
11917 }
11918 }
11919 else if (CONST_STRNEQ (p, "data"))
11920 {
11921 if (p[4] == '1' && p[5] == '6')
11922 priv.orig_sizeflag &= ~DFLAG;
11923 else if (p[4] == '3' && p[5] == '2')
11924 priv.orig_sizeflag |= DFLAG;
11925 }
11926 else if (CONST_STRNEQ (p, "suffix"))
11927 priv.orig_sizeflag |= SUFFIX_ALWAYS;
11928
11929 p = strchr (p, ',');
11930 if (p != NULL)
11931 p++;
11932 }
11933
11934 if (address_mode == mode_64bit && sizeof (bfd_vma) < 8)
11935 {
11936 (*info->fprintf_func) (info->stream,
11937 _("64-bit address is disabled"));
11938 return -1;
11939 }
11940
11941 if (intel_syntax)
11942 {
11943 names64 = intel_names64;
11944 names32 = intel_names32;
11945 names16 = intel_names16;
11946 names8 = intel_names8;
11947 names8rex = intel_names8rex;
11948 names_seg = intel_names_seg;
11949 names_mm = intel_names_mm;
11950 names_bnd = intel_names_bnd;
11951 names_xmm = intel_names_xmm;
11952 names_ymm = intel_names_ymm;
11953 names_zmm = intel_names_zmm;
11954 index64 = intel_index64;
11955 index32 = intel_index32;
11956 names_mask = intel_names_mask;
11957 index16 = intel_index16;
11958 open_char = '[';
11959 close_char = ']';
11960 separator_char = '+';
11961 scale_char = '*';
11962 }
11963 else
11964 {
11965 names64 = att_names64;
11966 names32 = att_names32;
11967 names16 = att_names16;
11968 names8 = att_names8;
11969 names8rex = att_names8rex;
11970 names_seg = att_names_seg;
11971 names_mm = att_names_mm;
11972 names_bnd = att_names_bnd;
11973 names_xmm = att_names_xmm;
11974 names_ymm = att_names_ymm;
11975 names_zmm = att_names_zmm;
11976 index64 = att_index64;
11977 index32 = att_index32;
11978 names_mask = att_names_mask;
11979 index16 = att_index16;
11980 open_char = '(';
11981 close_char = ')';
11982 separator_char = ',';
11983 scale_char = ',';
11984 }
11985
11986 /* The output looks better if we put 7 bytes on a line, since that
11987 puts most long word instructions on a single line. Use 8 bytes
11988 for Intel L1OM. */
11989 if ((info->mach & bfd_mach_l1om) != 0)
11990 info->bytes_per_line = 8;
11991 else
11992 info->bytes_per_line = 7;
11993
11994 info->private_data = &priv;
11995 priv.max_fetched = priv.the_buffer;
11996 priv.insn_start = pc;
11997
11998 obuf[0] = 0;
11999 for (i = 0; i < MAX_OPERANDS; ++i)
12000 {
12001 op_out[i][0] = 0;
12002 op_index[i] = -1;
12003 }
12004
12005 the_info = info;
12006 start_pc = pc;
12007 start_codep = priv.the_buffer;
12008 codep = priv.the_buffer;
12009
12010 if (OPCODES_SIGSETJMP (priv.bailout) != 0)
12011 {
12012 const char *name;
12013
12014 /* Getting here means we tried for data but didn't get it. That
12015 means we have an incomplete instruction of some sort. Just
12016 print the first byte as a prefix or a .byte pseudo-op. */
12017 if (codep > priv.the_buffer)
12018 {
12019 name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
12020 if (name != NULL)
12021 (*info->fprintf_func) (info->stream, "%s", name);
12022 else
12023 {
12024 /* Just print the first byte as a .byte instruction. */
12025 (*info->fprintf_func) (info->stream, ".byte 0x%x",
12026 (unsigned int) priv.the_buffer[0]);
12027 }
12028
12029 return 1;
12030 }
12031
12032 return -1;
12033 }
12034
12035 obufp = obuf;
12036 sizeflag = priv.orig_sizeflag;
12037
12038 if (!ckprefix () || rex_used)
12039 {
12040 /* Too many prefixes or unused REX prefixes. */
12041 for (i = 0;
12042 i < (int) ARRAY_SIZE (all_prefixes) && all_prefixes[i];
12043 i++)
12044 (*info->fprintf_func) (info->stream, "%s%s",
12045 i == 0 ? "" : " ",
12046 prefix_name (all_prefixes[i], sizeflag));
12047 return i;
12048 }
12049
12050 insn_codep = codep;
12051
12052 FETCH_DATA (info, codep + 1);
12053 two_source_ops = (*codep == 0x62) || (*codep == 0xc8);
12054
12055 if (((prefixes & PREFIX_FWAIT)
12056 && ((*codep < 0xd8) || (*codep > 0xdf))))
12057 {
12058 /* Handle prefixes before fwait. */
12059 for (i = 0; i < fwait_prefix && all_prefixes[i];
12060 i++)
12061 (*info->fprintf_func) (info->stream, "%s ",
12062 prefix_name (all_prefixes[i], sizeflag));
12063 (*info->fprintf_func) (info->stream, "fwait");
12064 return i + 1;
12065 }
12066
12067 if (*codep == 0x0f)
12068 {
12069 unsigned char threebyte;
12070
12071 codep++;
12072 FETCH_DATA (info, codep + 1);
12073 threebyte = *codep;
12074 dp = &dis386_twobyte[threebyte];
12075 need_modrm = twobyte_has_modrm[*codep];
12076 codep++;
12077 }
12078 else
12079 {
12080 dp = &dis386[*codep];
12081 need_modrm = onebyte_has_modrm[*codep];
12082 codep++;
12083 }
12084
12085 /* Save sizeflag for printing the extra prefixes later before updating
12086 it for mnemonic and operand processing. The prefix names depend
12087 only on the address mode. */
12088 orig_sizeflag = sizeflag;
12089 if (prefixes & PREFIX_ADDR)
12090 sizeflag ^= AFLAG;
12091 if ((prefixes & PREFIX_DATA))
12092 sizeflag ^= DFLAG;
12093
12094 end_codep = codep;
12095 if (need_modrm)
12096 {
12097 FETCH_DATA (info, codep + 1);
12098 modrm.mod = (*codep >> 6) & 3;
12099 modrm.reg = (*codep >> 3) & 7;
12100 modrm.rm = *codep & 7;
12101 }
12102
12103 need_vex = 0;
12104 need_vex_reg = 0;
12105 vex_w_done = 0;
12106 memset (&vex, 0, sizeof (vex));
12107
12108 if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
12109 {
12110 get_sib (info, sizeflag);
12111 dofloat (sizeflag);
12112 }
12113 else
12114 {
12115 dp = get_valid_dis386 (dp, info);
12116 if (dp != NULL && putop (dp->name, sizeflag) == 0)
12117 {
12118 get_sib (info, sizeflag);
12119 for (i = 0; i < MAX_OPERANDS; ++i)
12120 {
12121 obufp = op_out[i];
12122 op_ad = MAX_OPERANDS - 1 - i;
12123 if (dp->op[i].rtn)
12124 (*dp->op[i].rtn) (dp->op[i].bytemode, sizeflag);
12125 /* For EVEX instruction after the last operand masking
12126 should be printed. */
12127 if (i == 0 && vex.evex)
12128 {
12129 /* Don't print {%k0}. */
12130 if (vex.mask_register_specifier)
12131 {
12132 oappend ("{");
12133 oappend (names_mask[vex.mask_register_specifier]);
12134 oappend ("}");
12135 }
12136 if (vex.zeroing)
12137 oappend ("{z}");
12138 }
12139 }
12140 }
12141 }
12142
12143 /* If VEX.vvvv and EVEX.vvvv are unused, they must be all 1s, which
12144 are all 0s in inverted form. */
12145 if (need_vex && vex.register_specifier != 0)
12146 {
12147 (*info->fprintf_func) (info->stream, "(bad)");
12148 return end_codep - priv.the_buffer;
12149 }
12150
12151 /* Check if the REX prefix is used. */
12152 if (rex_ignored == 0 && (rex ^ rex_used) == 0 && last_rex_prefix >= 0)
12153 all_prefixes[last_rex_prefix] = 0;
12154
12155 /* Check if the SEG prefix is used. */
12156 if ((prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS | PREFIX_ES
12157 | PREFIX_FS | PREFIX_GS)) != 0
12158 && (used_prefixes & active_seg_prefix) != 0)
12159 all_prefixes[last_seg_prefix] = 0;
12160
12161 /* Check if the ADDR prefix is used. */
12162 if ((prefixes & PREFIX_ADDR) != 0
12163 && (used_prefixes & PREFIX_ADDR) != 0)
12164 all_prefixes[last_addr_prefix] = 0;
12165
12166 /* Check if the DATA prefix is used. */
12167 if ((prefixes & PREFIX_DATA) != 0
12168 && (used_prefixes & PREFIX_DATA) != 0)
12169 all_prefixes[last_data_prefix] = 0;
12170
12171 /* Print the extra prefixes. */
12172 prefix_length = 0;
12173 for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
12174 if (all_prefixes[i])
12175 {
12176 const char *name;
12177 name = prefix_name (all_prefixes[i], orig_sizeflag);
12178 if (name == NULL)
12179 abort ();
12180 prefix_length += strlen (name) + 1;
12181 (*info->fprintf_func) (info->stream, "%s ", name);
12182 }
12183
12184 /* If the mandatory PREFIX_REPZ/PREFIX_REPNZ/PREFIX_DATA prefix is
12185 unused, opcode is invalid. Since the PREFIX_DATA prefix may be
12186 used by putop and MMX/SSE operand and may be overriden by the
12187 PREFIX_REPZ/PREFIX_REPNZ fix, we check the PREFIX_DATA prefix
12188 separately. */
12189 if (dp->prefix_requirement == PREFIX_OPCODE
12190 && dp != &bad_opcode
12191 && (((prefixes
12192 & (PREFIX_REPZ | PREFIX_REPNZ)) != 0
12193 && (used_prefixes
12194 & (PREFIX_REPZ | PREFIX_REPNZ)) == 0)
12195 || ((((prefixes
12196 & (PREFIX_REPZ | PREFIX_REPNZ | PREFIX_DATA))
12197 == PREFIX_DATA)
12198 && (used_prefixes & PREFIX_DATA) == 0))))
12199 {
12200 (*info->fprintf_func) (info->stream, "(bad)");
12201 return end_codep - priv.the_buffer;
12202 }
12203
12204 /* Check maximum code length. */
12205 if ((codep - start_codep) > MAX_CODE_LENGTH)
12206 {
12207 (*info->fprintf_func) (info->stream, "(bad)");
12208 return MAX_CODE_LENGTH;
12209 }
12210
12211 obufp = mnemonicendp;
12212 for (i = strlen (obuf) + prefix_length; i < 6; i++)
12213 oappend (" ");
12214 oappend (" ");
12215 (*info->fprintf_func) (info->stream, "%s", obuf);
12216
12217 /* The enter and bound instructions are printed with operands in the same
12218 order as the intel book; everything else is printed in reverse order. */
12219 if (intel_syntax || two_source_ops)
12220 {
12221 bfd_vma riprel;
12222
12223 for (i = 0; i < MAX_OPERANDS; ++i)
12224 op_txt[i] = op_out[i];
12225
12226 if (intel_syntax && dp && dp->op[2].rtn == OP_Rounding
12227 && dp->op[3].rtn == OP_E && dp->op[4].rtn == NULL)
12228 {
12229 op_txt[2] = op_out[3];
12230 op_txt[3] = op_out[2];
12231 }
12232
12233 for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
12234 {
12235 op_ad = op_index[i];
12236 op_index[i] = op_index[MAX_OPERANDS - 1 - i];
12237 op_index[MAX_OPERANDS - 1 - i] = op_ad;
12238 riprel = op_riprel[i];
12239 op_riprel[i] = op_riprel [MAX_OPERANDS - 1 - i];
12240 op_riprel[MAX_OPERANDS - 1 - i] = riprel;
12241 }
12242 }
12243 else
12244 {
12245 for (i = 0; i < MAX_OPERANDS; ++i)
12246 op_txt[MAX_OPERANDS - 1 - i] = op_out[i];
12247 }
12248
12249 needcomma = 0;
12250 for (i = 0; i < MAX_OPERANDS; ++i)
12251 if (*op_txt[i])
12252 {
12253 if (needcomma)
12254 (*info->fprintf_func) (info->stream, ",");
12255 if (op_index[i] != -1 && !op_riprel[i])
12256 (*info->print_address_func) ((bfd_vma) op_address[op_index[i]], info);
12257 else
12258 (*info->fprintf_func) (info->stream, "%s", op_txt[i]);
12259 needcomma = 1;
12260 }
12261
12262 for (i = 0; i < MAX_OPERANDS; i++)
12263 if (op_index[i] != -1 && op_riprel[i])
12264 {
12265 (*info->fprintf_func) (info->stream, " # ");
12266 (*info->print_address_func) ((bfd_vma) (start_pc + (codep - start_codep)
12267 + op_address[op_index[i]]), info);
12268 break;
12269 }
12270 return codep - priv.the_buffer;
12271 }
12272
12273 static const char *float_mem[] = {
12274 /* d8 */
12275 "fadd{s|}",
12276 "fmul{s|}",
12277 "fcom{s|}",
12278 "fcomp{s|}",
12279 "fsub{s|}",
12280 "fsubr{s|}",
12281 "fdiv{s|}",
12282 "fdivr{s|}",
12283 /* d9 */
12284 "fld{s|}",
12285 "(bad)",
12286 "fst{s|}",
12287 "fstp{s|}",
12288 "fldenvIC",
12289 "fldcw",
12290 "fNstenvIC",
12291 "fNstcw",
12292 /* da */
12293 "fiadd{l|}",
12294 "fimul{l|}",
12295 "ficom{l|}",
12296 "ficomp{l|}",
12297 "fisub{l|}",
12298 "fisubr{l|}",
12299 "fidiv{l|}",
12300 "fidivr{l|}",
12301 /* db */
12302 "fild{l|}",
12303 "fisttp{l|}",
12304 "fist{l|}",
12305 "fistp{l|}",
12306 "(bad)",
12307 "fld{t||t|}",
12308 "(bad)",
12309 "fstp{t||t|}",
12310 /* dc */
12311 "fadd{l|}",
12312 "fmul{l|}",
12313 "fcom{l|}",
12314 "fcomp{l|}",
12315 "fsub{l|}",
12316 "fsubr{l|}",
12317 "fdiv{l|}",
12318 "fdivr{l|}",
12319 /* dd */
12320 "fld{l|}",
12321 "fisttp{ll|}",
12322 "fst{l||}",
12323 "fstp{l|}",
12324 "frstorIC",
12325 "(bad)",
12326 "fNsaveIC",
12327 "fNstsw",
12328 /* de */
12329 "fiadd{s|}",
12330 "fimul{s|}",
12331 "ficom{s|}",
12332 "ficomp{s|}",
12333 "fisub{s|}",
12334 "fisubr{s|}",
12335 "fidiv{s|}",
12336 "fidivr{s|}",
12337 /* df */
12338 "fild{s|}",
12339 "fisttp{s|}",
12340 "fist{s|}",
12341 "fistp{s|}",
12342 "fbld",
12343 "fild{ll|}",
12344 "fbstp",
12345 "fistp{ll|}",
12346 };
12347
12348 static const unsigned char float_mem_mode[] = {
12349 /* d8 */
12350 d_mode,
12351 d_mode,
12352 d_mode,
12353 d_mode,
12354 d_mode,
12355 d_mode,
12356 d_mode,
12357 d_mode,
12358 /* d9 */
12359 d_mode,
12360 0,
12361 d_mode,
12362 d_mode,
12363 0,
12364 w_mode,
12365 0,
12366 w_mode,
12367 /* da */
12368 d_mode,
12369 d_mode,
12370 d_mode,
12371 d_mode,
12372 d_mode,
12373 d_mode,
12374 d_mode,
12375 d_mode,
12376 /* db */
12377 d_mode,
12378 d_mode,
12379 d_mode,
12380 d_mode,
12381 0,
12382 t_mode,
12383 0,
12384 t_mode,
12385 /* dc */
12386 q_mode,
12387 q_mode,
12388 q_mode,
12389 q_mode,
12390 q_mode,
12391 q_mode,
12392 q_mode,
12393 q_mode,
12394 /* dd */
12395 q_mode,
12396 q_mode,
12397 q_mode,
12398 q_mode,
12399 0,
12400 0,
12401 0,
12402 w_mode,
12403 /* de */
12404 w_mode,
12405 w_mode,
12406 w_mode,
12407 w_mode,
12408 w_mode,
12409 w_mode,
12410 w_mode,
12411 w_mode,
12412 /* df */
12413 w_mode,
12414 w_mode,
12415 w_mode,
12416 w_mode,
12417 t_mode,
12418 q_mode,
12419 t_mode,
12420 q_mode
12421 };
12422
12423 #define ST { OP_ST, 0 }
12424 #define STi { OP_STi, 0 }
12425
12426 #define FGRPd9_2 NULL, { { NULL, 1 } }, 0
12427 #define FGRPd9_4 NULL, { { NULL, 2 } }, 0
12428 #define FGRPd9_5 NULL, { { NULL, 3 } }, 0
12429 #define FGRPd9_6 NULL, { { NULL, 4 } }, 0
12430 #define FGRPd9_7 NULL, { { NULL, 5 } }, 0
12431 #define FGRPda_5 NULL, { { NULL, 6 } }, 0
12432 #define FGRPdb_4 NULL, { { NULL, 7 } }, 0
12433 #define FGRPde_3 NULL, { { NULL, 8 } }, 0
12434 #define FGRPdf_4 NULL, { { NULL, 9 } }, 0
12435
12436 static const struct dis386 float_reg[][8] = {
12437 /* d8 */
12438 {
12439 { "fadd", { ST, STi }, 0 },
12440 { "fmul", { ST, STi }, 0 },
12441 { "fcom", { STi }, 0 },
12442 { "fcomp", { STi }, 0 },
12443 { "fsub", { ST, STi }, 0 },
12444 { "fsubr", { ST, STi }, 0 },
12445 { "fdiv", { ST, STi }, 0 },
12446 { "fdivr", { ST, STi }, 0 },
12447 },
12448 /* d9 */
12449 {
12450 { "fld", { STi }, 0 },
12451 { "fxch", { STi }, 0 },
12452 { FGRPd9_2 },
12453 { Bad_Opcode },
12454 { FGRPd9_4 },
12455 { FGRPd9_5 },
12456 { FGRPd9_6 },
12457 { FGRPd9_7 },
12458 },
12459 /* da */
12460 {
12461 { "fcmovb", { ST, STi }, 0 },
12462 { "fcmove", { ST, STi }, 0 },
12463 { "fcmovbe",{ ST, STi }, 0 },
12464 { "fcmovu", { ST, STi }, 0 },
12465 { Bad_Opcode },
12466 { FGRPda_5 },
12467 { Bad_Opcode },
12468 { Bad_Opcode },
12469 },
12470 /* db */
12471 {
12472 { "fcmovnb",{ ST, STi }, 0 },
12473 { "fcmovne",{ ST, STi }, 0 },
12474 { "fcmovnbe",{ ST, STi }, 0 },
12475 { "fcmovnu",{ ST, STi }, 0 },
12476 { FGRPdb_4 },
12477 { "fucomi", { ST, STi }, 0 },
12478 { "fcomi", { ST, STi }, 0 },
12479 { Bad_Opcode },
12480 },
12481 /* dc */
12482 {
12483 { "fadd", { STi, ST }, 0 },
12484 { "fmul", { STi, ST }, 0 },
12485 { Bad_Opcode },
12486 { Bad_Opcode },
12487 { "fsub{!M|r}", { STi, ST }, 0 },
12488 { "fsub{M|}", { STi, ST }, 0 },
12489 { "fdiv{!M|r}", { STi, ST }, 0 },
12490 { "fdiv{M|}", { STi, ST }, 0 },
12491 },
12492 /* dd */
12493 {
12494 { "ffree", { STi }, 0 },
12495 { Bad_Opcode },
12496 { "fst", { STi }, 0 },
12497 { "fstp", { STi }, 0 },
12498 { "fucom", { STi }, 0 },
12499 { "fucomp", { STi }, 0 },
12500 { Bad_Opcode },
12501 { Bad_Opcode },
12502 },
12503 /* de */
12504 {
12505 { "faddp", { STi, ST }, 0 },
12506 { "fmulp", { STi, ST }, 0 },
12507 { Bad_Opcode },
12508 { FGRPde_3 },
12509 { "fsub{!M|r}p", { STi, ST }, 0 },
12510 { "fsub{M|}p", { STi, ST }, 0 },
12511 { "fdiv{!M|r}p", { STi, ST }, 0 },
12512 { "fdiv{M|}p", { STi, ST }, 0 },
12513 },
12514 /* df */
12515 {
12516 { "ffreep", { STi }, 0 },
12517 { Bad_Opcode },
12518 { Bad_Opcode },
12519 { Bad_Opcode },
12520 { FGRPdf_4 },
12521 { "fucomip", { ST, STi }, 0 },
12522 { "fcomip", { ST, STi }, 0 },
12523 { Bad_Opcode },
12524 },
12525 };
12526
12527 static char *fgrps[][8] = {
12528 /* Bad opcode 0 */
12529 {
12530 "(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
12531 },
12532
12533 /* d9_2 1 */
12534 {
12535 "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
12536 },
12537
12538 /* d9_4 2 */
12539 {
12540 "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
12541 },
12542
12543 /* d9_5 3 */
12544 {
12545 "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
12546 },
12547
12548 /* d9_6 4 */
12549 {
12550 "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
12551 },
12552
12553 /* d9_7 5 */
12554 {
12555 "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
12556 },
12557
12558 /* da_5 6 */
12559 {
12560 "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
12561 },
12562
12563 /* db_4 7 */
12564 {
12565 "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
12566 "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
12567 },
12568
12569 /* de_3 8 */
12570 {
12571 "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
12572 },
12573
12574 /* df_4 9 */
12575 {
12576 "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
12577 },
12578 };
12579
12580 static void
12581 swap_operand (void)
12582 {
12583 mnemonicendp[0] = '.';
12584 mnemonicendp[1] = 's';
12585 mnemonicendp += 2;
12586 }
12587
12588 static void
12589 OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED,
12590 int sizeflag ATTRIBUTE_UNUSED)
12591 {
12592 /* Skip mod/rm byte. */
12593 MODRM_CHECK;
12594 codep++;
12595 }
12596
12597 static void
12598 dofloat (int sizeflag)
12599 {
12600 const struct dis386 *dp;
12601 unsigned char floatop;
12602
12603 floatop = codep[-1];
12604
12605 if (modrm.mod != 3)
12606 {
12607 int fp_indx = (floatop - 0xd8) * 8 + modrm.reg;
12608
12609 putop (float_mem[fp_indx], sizeflag);
12610 obufp = op_out[0];
12611 op_ad = 2;
12612 OP_E (float_mem_mode[fp_indx], sizeflag);
12613 return;
12614 }
12615 /* Skip mod/rm byte. */
12616 MODRM_CHECK;
12617 codep++;
12618
12619 dp = &float_reg[floatop - 0xd8][modrm.reg];
12620 if (dp->name == NULL)
12621 {
12622 putop (fgrps[dp->op[0].bytemode][modrm.rm], sizeflag);
12623
12624 /* Instruction fnstsw is only one with strange arg. */
12625 if (floatop == 0xdf && codep[-1] == 0xe0)
12626 strcpy (op_out[0], names16[0]);
12627 }
12628 else
12629 {
12630 putop (dp->name, sizeflag);
12631
12632 obufp = op_out[0];
12633 op_ad = 2;
12634 if (dp->op[0].rtn)
12635 (*dp->op[0].rtn) (dp->op[0].bytemode, sizeflag);
12636
12637 obufp = op_out[1];
12638 op_ad = 1;
12639 if (dp->op[1].rtn)
12640 (*dp->op[1].rtn) (dp->op[1].bytemode, sizeflag);
12641 }
12642 }
12643
12644 /* Like oappend (below), but S is a string starting with '%'.
12645 In Intel syntax, the '%' is elided. */
12646 static void
12647 oappend_maybe_intel (const char *s)
12648 {
12649 oappend (s + intel_syntax);
12650 }
12651
12652 static void
12653 OP_ST (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12654 {
12655 oappend_maybe_intel ("%st");
12656 }
12657
12658 static void
12659 OP_STi (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12660 {
12661 sprintf (scratchbuf, "%%st(%d)", modrm.rm);
12662 oappend_maybe_intel (scratchbuf);
12663 }
12664
12665 /* Capital letters in template are macros. */
12666 static int
12667 putop (const char *in_template, int sizeflag)
12668 {
12669 const char *p;
12670 int alt = 0;
12671 int cond = 1;
12672 unsigned int l = 0, len = 1;
12673 char last[4];
12674
12675 #define SAVE_LAST(c) \
12676 if (l < len && l < sizeof (last)) \
12677 last[l++] = c; \
12678 else \
12679 abort ();
12680
12681 for (p = in_template; *p; p++)
12682 {
12683 switch (*p)
12684 {
12685 default:
12686 *obufp++ = *p;
12687 break;
12688 case '%':
12689 len++;
12690 break;
12691 case '!':
12692 cond = 0;
12693 break;
12694 case '{':
12695 if (intel_syntax)
12696 {
12697 while (*++p != '|')
12698 if (*p == '}' || *p == '\0')
12699 abort ();
12700 }
12701 /* Fall through. */
12702 case 'I':
12703 alt = 1;
12704 continue;
12705 case '|':
12706 while (*++p != '}')
12707 {
12708 if (*p == '\0')
12709 abort ();
12710 }
12711 break;
12712 case '}':
12713 break;
12714 case 'A':
12715 if (intel_syntax)
12716 break;
12717 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
12718 *obufp++ = 'b';
12719 break;
12720 case 'B':
12721 if (l == 0 && len == 1)
12722 {
12723 case_B:
12724 if (intel_syntax)
12725 break;
12726 if (sizeflag & SUFFIX_ALWAYS)
12727 *obufp++ = 'b';
12728 }
12729 else
12730 {
12731 if (l != 1
12732 || len != 2
12733 || last[0] != 'L')
12734 {
12735 SAVE_LAST (*p);
12736 break;
12737 }
12738
12739 if (address_mode == mode_64bit
12740 && !(prefixes & PREFIX_ADDR))
12741 {
12742 *obufp++ = 'a';
12743 *obufp++ = 'b';
12744 *obufp++ = 's';
12745 }
12746
12747 goto case_B;
12748 }
12749 break;
12750 case 'C':
12751 if (intel_syntax && !alt)
12752 break;
12753 if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
12754 {
12755 if (sizeflag & DFLAG)
12756 *obufp++ = intel_syntax ? 'd' : 'l';
12757 else
12758 *obufp++ = intel_syntax ? 'w' : 's';
12759 used_prefixes |= (prefixes & PREFIX_DATA);
12760 }
12761 break;
12762 case 'D':
12763 if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
12764 break;
12765 USED_REX (REX_W);
12766 if (modrm.mod == 3)
12767 {
12768 if (rex & REX_W)
12769 *obufp++ = 'q';
12770 else
12771 {
12772 if (sizeflag & DFLAG)
12773 *obufp++ = intel_syntax ? 'd' : 'l';
12774 else
12775 *obufp++ = 'w';
12776 used_prefixes |= (prefixes & PREFIX_DATA);
12777 }
12778 }
12779 else
12780 *obufp++ = 'w';
12781 break;
12782 case 'E': /* For jcxz/jecxz */
12783 if (address_mode == mode_64bit)
12784 {
12785 if (sizeflag & AFLAG)
12786 *obufp++ = 'r';
12787 else
12788 *obufp++ = 'e';
12789 }
12790 else
12791 if (sizeflag & AFLAG)
12792 *obufp++ = 'e';
12793 used_prefixes |= (prefixes & PREFIX_ADDR);
12794 break;
12795 case 'F':
12796 if (intel_syntax)
12797 break;
12798 if ((prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
12799 {
12800 if (sizeflag & AFLAG)
12801 *obufp++ = address_mode == mode_64bit ? 'q' : 'l';
12802 else
12803 *obufp++ = address_mode == mode_64bit ? 'l' : 'w';
12804 used_prefixes |= (prefixes & PREFIX_ADDR);
12805 }
12806 break;
12807 case 'G':
12808 if (intel_syntax || (obufp[-1] != 's' && !(sizeflag & SUFFIX_ALWAYS)))
12809 break;
12810 if ((rex & REX_W) || (sizeflag & DFLAG))
12811 *obufp++ = 'l';
12812 else
12813 *obufp++ = 'w';
12814 if (!(rex & REX_W))
12815 used_prefixes |= (prefixes & PREFIX_DATA);
12816 break;
12817 case 'H':
12818 if (intel_syntax)
12819 break;
12820 if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
12821 || (prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
12822 {
12823 used_prefixes |= prefixes & (PREFIX_CS | PREFIX_DS);
12824 *obufp++ = ',';
12825 *obufp++ = 'p';
12826 if (prefixes & PREFIX_DS)
12827 *obufp++ = 't';
12828 else
12829 *obufp++ = 'n';
12830 }
12831 break;
12832 case 'J':
12833 if (intel_syntax)
12834 break;
12835 *obufp++ = 'l';
12836 break;
12837 case 'K':
12838 USED_REX (REX_W);
12839 if (rex & REX_W)
12840 *obufp++ = 'q';
12841 else
12842 *obufp++ = 'd';
12843 break;
12844 case 'Z':
12845 if (l != 0 || len != 1)
12846 {
12847 if (l != 1 || len != 2 || last[0] != 'X')
12848 {
12849 SAVE_LAST (*p);
12850 break;
12851 }
12852 if (!need_vex || !vex.evex)
12853 abort ();
12854 if (intel_syntax
12855 || ((modrm.mod == 3 || vex.b) && !(sizeflag & SUFFIX_ALWAYS)))
12856 break;
12857 switch (vex.length)
12858 {
12859 case 128:
12860 *obufp++ = 'x';
12861 break;
12862 case 256:
12863 *obufp++ = 'y';
12864 break;
12865 case 512:
12866 *obufp++ = 'z';
12867 break;
12868 default:
12869 abort ();
12870 }
12871 break;
12872 }
12873 if (intel_syntax)
12874 break;
12875 if (address_mode == mode_64bit && (sizeflag & SUFFIX_ALWAYS))
12876 {
12877 *obufp++ = 'q';
12878 break;
12879 }
12880 /* Fall through. */
12881 goto case_L;
12882 case 'L':
12883 if (l != 0 || len != 1)
12884 {
12885 SAVE_LAST (*p);
12886 break;
12887 }
12888 case_L:
12889 if (intel_syntax)
12890 break;
12891 if (sizeflag & SUFFIX_ALWAYS)
12892 *obufp++ = 'l';
12893 break;
12894 case 'M':
12895 if (intel_mnemonic != cond)
12896 *obufp++ = 'r';
12897 break;
12898 case 'N':
12899 if ((prefixes & PREFIX_FWAIT) == 0)
12900 *obufp++ = 'n';
12901 else
12902 used_prefixes |= PREFIX_FWAIT;
12903 break;
12904 case 'O':
12905 USED_REX (REX_W);
12906 if (rex & REX_W)
12907 *obufp++ = 'o';
12908 else if (intel_syntax && (sizeflag & DFLAG))
12909 *obufp++ = 'q';
12910 else
12911 *obufp++ = 'd';
12912 if (!(rex & REX_W))
12913 used_prefixes |= (prefixes & PREFIX_DATA);
12914 break;
12915 case '&':
12916 if (!intel_syntax
12917 && address_mode == mode_64bit
12918 && isa64 == intel64)
12919 {
12920 *obufp++ = 'q';
12921 break;
12922 }
12923 /* Fall through. */
12924 case 'T':
12925 if (!intel_syntax
12926 && address_mode == mode_64bit
12927 && ((sizeflag & DFLAG) || (rex & REX_W)))
12928 {
12929 *obufp++ = 'q';
12930 break;
12931 }
12932 /* Fall through. */
12933 goto case_P;
12934 case 'P':
12935 if (l == 0 && len == 1)
12936 {
12937 case_P:
12938 if (intel_syntax)
12939 {
12940 if ((rex & REX_W) == 0
12941 && (prefixes & PREFIX_DATA))
12942 {
12943 if ((sizeflag & DFLAG) == 0)
12944 *obufp++ = 'w';
12945 used_prefixes |= (prefixes & PREFIX_DATA);
12946 }
12947 break;
12948 }
12949 if ((prefixes & PREFIX_DATA)
12950 || (rex & REX_W)
12951 || (sizeflag & SUFFIX_ALWAYS))
12952 {
12953 USED_REX (REX_W);
12954 if (rex & REX_W)
12955 *obufp++ = 'q';
12956 else
12957 {
12958 if (sizeflag & DFLAG)
12959 *obufp++ = 'l';
12960 else
12961 *obufp++ = 'w';
12962 used_prefixes |= (prefixes & PREFIX_DATA);
12963 }
12964 }
12965 }
12966 else
12967 {
12968 if (l != 1 || len != 2 || last[0] != 'L')
12969 {
12970 SAVE_LAST (*p);
12971 break;
12972 }
12973
12974 if ((prefixes & PREFIX_DATA)
12975 || (rex & REX_W)
12976 || (sizeflag & SUFFIX_ALWAYS))
12977 {
12978 USED_REX (REX_W);
12979 if (rex & REX_W)
12980 *obufp++ = 'q';
12981 else
12982 {
12983 if (sizeflag & DFLAG)
12984 *obufp++ = intel_syntax ? 'd' : 'l';
12985 else
12986 *obufp++ = 'w';
12987 used_prefixes |= (prefixes & PREFIX_DATA);
12988 }
12989 }
12990 }
12991 break;
12992 case 'U':
12993 if (intel_syntax)
12994 break;
12995 if (address_mode == mode_64bit
12996 && ((sizeflag & DFLAG) || (rex & REX_W)))
12997 {
12998 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
12999 *obufp++ = 'q';
13000 break;
13001 }
13002 /* Fall through. */
13003 goto case_Q;
13004 case 'Q':
13005 if (l == 0 && len == 1)
13006 {
13007 case_Q:
13008 if (intel_syntax && !alt)
13009 break;
13010 USED_REX (REX_W);
13011 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
13012 {
13013 if (rex & REX_W)
13014 *obufp++ = 'q';
13015 else
13016 {
13017 if (sizeflag & DFLAG)
13018 *obufp++ = intel_syntax ? 'd' : 'l';
13019 else
13020 *obufp++ = 'w';
13021 used_prefixes |= (prefixes & PREFIX_DATA);
13022 }
13023 }
13024 }
13025 else
13026 {
13027 if (l != 1 || len != 2 || last[0] != 'L')
13028 {
13029 SAVE_LAST (*p);
13030 break;
13031 }
13032 if (intel_syntax
13033 || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
13034 break;
13035 if ((rex & REX_W))
13036 {
13037 USED_REX (REX_W);
13038 *obufp++ = 'q';
13039 }
13040 else
13041 *obufp++ = 'l';
13042 }
13043 break;
13044 case 'R':
13045 USED_REX (REX_W);
13046 if (rex & REX_W)
13047 *obufp++ = 'q';
13048 else if (sizeflag & DFLAG)
13049 {
13050 if (intel_syntax)
13051 *obufp++ = 'd';
13052 else
13053 *obufp++ = 'l';
13054 }
13055 else
13056 *obufp++ = 'w';
13057 if (intel_syntax && !p[1]
13058 && ((rex & REX_W) || (sizeflag & DFLAG)))
13059 *obufp++ = 'e';
13060 if (!(rex & REX_W))
13061 used_prefixes |= (prefixes & PREFIX_DATA);
13062 break;
13063 case 'V':
13064 if (l == 0 && len == 1)
13065 {
13066 if (intel_syntax)
13067 break;
13068 if (address_mode == mode_64bit
13069 && ((sizeflag & DFLAG) || (rex & REX_W)))
13070 {
13071 if (sizeflag & SUFFIX_ALWAYS)
13072 *obufp++ = 'q';
13073 break;
13074 }
13075 }
13076 else
13077 {
13078 if (l != 1
13079 || len != 2
13080 || last[0] != 'L')
13081 {
13082 SAVE_LAST (*p);
13083 break;
13084 }
13085
13086 if (rex & REX_W)
13087 {
13088 *obufp++ = 'a';
13089 *obufp++ = 'b';
13090 *obufp++ = 's';
13091 }
13092 }
13093 /* Fall through. */
13094 goto case_S;
13095 case 'S':
13096 if (l == 0 && len == 1)
13097 {
13098 case_S:
13099 if (intel_syntax)
13100 break;
13101 if (sizeflag & SUFFIX_ALWAYS)
13102 {
13103 if (rex & REX_W)
13104 *obufp++ = 'q';
13105 else
13106 {
13107 if (sizeflag & DFLAG)
13108 *obufp++ = 'l';
13109 else
13110 *obufp++ = 'w';
13111 used_prefixes |= (prefixes & PREFIX_DATA);
13112 }
13113 }
13114 }
13115 else
13116 {
13117 if (l != 1
13118 || len != 2
13119 || last[0] != 'L')
13120 {
13121 SAVE_LAST (*p);
13122 break;
13123 }
13124
13125 if (address_mode == mode_64bit
13126 && !(prefixes & PREFIX_ADDR))
13127 {
13128 *obufp++ = 'a';
13129 *obufp++ = 'b';
13130 *obufp++ = 's';
13131 }
13132
13133 goto case_S;
13134 }
13135 break;
13136 case 'X':
13137 if (l != 0 || len != 1)
13138 {
13139 SAVE_LAST (*p);
13140 break;
13141 }
13142 if (need_vex && vex.prefix)
13143 {
13144 if (vex.prefix == DATA_PREFIX_OPCODE)
13145 *obufp++ = 'd';
13146 else
13147 *obufp++ = 's';
13148 }
13149 else
13150 {
13151 if (prefixes & PREFIX_DATA)
13152 *obufp++ = 'd';
13153 else
13154 *obufp++ = 's';
13155 used_prefixes |= (prefixes & PREFIX_DATA);
13156 }
13157 break;
13158 case 'Y':
13159 if (l == 0 && len == 1)
13160 abort ();
13161 else
13162 {
13163 if (l != 1 || len != 2 || last[0] != 'X')
13164 {
13165 SAVE_LAST (*p);
13166 break;
13167 }
13168 if (!need_vex)
13169 abort ();
13170 if (intel_syntax
13171 || ((modrm.mod == 3 || vex.b) && !(sizeflag & SUFFIX_ALWAYS)))
13172 break;
13173 switch (vex.length)
13174 {
13175 case 128:
13176 *obufp++ = 'x';
13177 break;
13178 case 256:
13179 *obufp++ = 'y';
13180 break;
13181 case 512:
13182 if (!vex.evex)
13183 default:
13184 abort ();
13185 }
13186 }
13187 break;
13188 case 'W':
13189 if (l == 0 && len == 1)
13190 {
13191 /* operand size flag for cwtl, cbtw */
13192 USED_REX (REX_W);
13193 if (rex & REX_W)
13194 {
13195 if (intel_syntax)
13196 *obufp++ = 'd';
13197 else
13198 *obufp++ = 'l';
13199 }
13200 else if (sizeflag & DFLAG)
13201 *obufp++ = 'w';
13202 else
13203 *obufp++ = 'b';
13204 if (!(rex & REX_W))
13205 used_prefixes |= (prefixes & PREFIX_DATA);
13206 }
13207 else
13208 {
13209 if (l != 1
13210 || len != 2
13211 || (last[0] != 'X'
13212 && last[0] != 'L'))
13213 {
13214 SAVE_LAST (*p);
13215 break;
13216 }
13217 if (!need_vex)
13218 abort ();
13219 if (last[0] == 'X')
13220 *obufp++ = vex.w ? 'd': 's';
13221 else
13222 *obufp++ = vex.w ? 'q': 'd';
13223 }
13224 break;
13225 case '^':
13226 if (intel_syntax)
13227 break;
13228 if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
13229 {
13230 if (sizeflag & DFLAG)
13231 *obufp++ = 'l';
13232 else
13233 *obufp++ = 'w';
13234 used_prefixes |= (prefixes & PREFIX_DATA);
13235 }
13236 break;
13237 case '@':
13238 if (intel_syntax)
13239 break;
13240 if (address_mode == mode_64bit
13241 && (isa64 == intel64
13242 || ((sizeflag & DFLAG) || (rex & REX_W))))
13243 *obufp++ = 'q';
13244 else if ((prefixes & PREFIX_DATA))
13245 {
13246 if (!(sizeflag & DFLAG))
13247 *obufp++ = 'w';
13248 used_prefixes |= (prefixes & PREFIX_DATA);
13249 }
13250 break;
13251 }
13252 alt = 0;
13253 }
13254 *obufp = 0;
13255 mnemonicendp = obufp;
13256 return 0;
13257 }
13258
13259 static void
13260 oappend (const char *s)
13261 {
13262 obufp = stpcpy (obufp, s);
13263 }
13264
13265 static void
13266 append_seg (void)
13267 {
13268 /* Only print the active segment register. */
13269 if (!active_seg_prefix)
13270 return;
13271
13272 used_prefixes |= active_seg_prefix;
13273 switch (active_seg_prefix)
13274 {
13275 case PREFIX_CS:
13276 oappend_maybe_intel ("%cs:");
13277 break;
13278 case PREFIX_DS:
13279 oappend_maybe_intel ("%ds:");
13280 break;
13281 case PREFIX_SS:
13282 oappend_maybe_intel ("%ss:");
13283 break;
13284 case PREFIX_ES:
13285 oappend_maybe_intel ("%es:");
13286 break;
13287 case PREFIX_FS:
13288 oappend_maybe_intel ("%fs:");
13289 break;
13290 case PREFIX_GS:
13291 oappend_maybe_intel ("%gs:");
13292 break;
13293 default:
13294 break;
13295 }
13296 }
13297
13298 static void
13299 OP_indirE (int bytemode, int sizeflag)
13300 {
13301 if (!intel_syntax)
13302 oappend ("*");
13303 OP_E (bytemode, sizeflag);
13304 }
13305
13306 static void
13307 print_operand_value (char *buf, int hex, bfd_vma disp)
13308 {
13309 if (address_mode == mode_64bit)
13310 {
13311 if (hex)
13312 {
13313 char tmp[30];
13314 int i;
13315 buf[0] = '0';
13316 buf[1] = 'x';
13317 sprintf_vma (tmp, disp);
13318 for (i = 0; tmp[i] == '0' && tmp[i + 1]; i++);
13319 strcpy (buf + 2, tmp + i);
13320 }
13321 else
13322 {
13323 bfd_signed_vma v = disp;
13324 char tmp[30];
13325 int i;
13326 if (v < 0)
13327 {
13328 *(buf++) = '-';
13329 v = -disp;
13330 /* Check for possible overflow on 0x8000000000000000. */
13331 if (v < 0)
13332 {
13333 strcpy (buf, "9223372036854775808");
13334 return;
13335 }
13336 }
13337 if (!v)
13338 {
13339 strcpy (buf, "0");
13340 return;
13341 }
13342
13343 i = 0;
13344 tmp[29] = 0;
13345 while (v)
13346 {
13347 tmp[28 - i] = (v % 10) + '0';
13348 v /= 10;
13349 i++;
13350 }
13351 strcpy (buf, tmp + 29 - i);
13352 }
13353 }
13354 else
13355 {
13356 if (hex)
13357 sprintf (buf, "0x%x", (unsigned int) disp);
13358 else
13359 sprintf (buf, "%d", (int) disp);
13360 }
13361 }
13362
13363 /* Put DISP in BUF as signed hex number. */
13364
13365 static void
13366 print_displacement (char *buf, bfd_vma disp)
13367 {
13368 bfd_signed_vma val = disp;
13369 char tmp[30];
13370 int i, j = 0;
13371
13372 if (val < 0)
13373 {
13374 buf[j++] = '-';
13375 val = -disp;
13376
13377 /* Check for possible overflow. */
13378 if (val < 0)
13379 {
13380 switch (address_mode)
13381 {
13382 case mode_64bit:
13383 strcpy (buf + j, "0x8000000000000000");
13384 break;
13385 case mode_32bit:
13386 strcpy (buf + j, "0x80000000");
13387 break;
13388 case mode_16bit:
13389 strcpy (buf + j, "0x8000");
13390 break;
13391 }
13392 return;
13393 }
13394 }
13395
13396 buf[j++] = '0';
13397 buf[j++] = 'x';
13398
13399 sprintf_vma (tmp, (bfd_vma) val);
13400 for (i = 0; tmp[i] == '0'; i++)
13401 continue;
13402 if (tmp[i] == '\0')
13403 i--;
13404 strcpy (buf + j, tmp + i);
13405 }
13406
13407 static void
13408 intel_operand_size (int bytemode, int sizeflag)
13409 {
13410 if (vex.evex
13411 && vex.b
13412 && (bytemode == x_mode
13413 || bytemode == evex_half_bcst_xmmq_mode))
13414 {
13415 if (vex.w)
13416 oappend ("QWORD PTR ");
13417 else
13418 oappend ("DWORD PTR ");
13419 return;
13420 }
13421 switch (bytemode)
13422 {
13423 case b_mode:
13424 case b_swap_mode:
13425 case dqb_mode:
13426 case db_mode:
13427 oappend ("BYTE PTR ");
13428 break;
13429 case w_mode:
13430 case dw_mode:
13431 case dqw_mode:
13432 oappend ("WORD PTR ");
13433 break;
13434 case indir_v_mode:
13435 if (address_mode == mode_64bit && isa64 == intel64)
13436 {
13437 oappend ("QWORD PTR ");
13438 break;
13439 }
13440 /* Fall through. */
13441 case stack_v_mode:
13442 if (address_mode == mode_64bit && ((sizeflag & DFLAG) || (rex & REX_W)))
13443 {
13444 oappend ("QWORD PTR ");
13445 break;
13446 }
13447 /* Fall through. */
13448 case v_mode:
13449 case v_swap_mode:
13450 case dq_mode:
13451 USED_REX (REX_W);
13452 if (rex & REX_W)
13453 oappend ("QWORD PTR ");
13454 else
13455 {
13456 if ((sizeflag & DFLAG) || bytemode == dq_mode)
13457 oappend ("DWORD PTR ");
13458 else
13459 oappend ("WORD PTR ");
13460 used_prefixes |= (prefixes & PREFIX_DATA);
13461 }
13462 break;
13463 case z_mode:
13464 if ((rex & REX_W) || (sizeflag & DFLAG))
13465 *obufp++ = 'D';
13466 oappend ("WORD PTR ");
13467 if (!(rex & REX_W))
13468 used_prefixes |= (prefixes & PREFIX_DATA);
13469 break;
13470 case a_mode:
13471 if (sizeflag & DFLAG)
13472 oappend ("QWORD PTR ");
13473 else
13474 oappend ("DWORD PTR ");
13475 used_prefixes |= (prefixes & PREFIX_DATA);
13476 break;
13477 case d_mode:
13478 case d_scalar_mode:
13479 case d_scalar_swap_mode:
13480 case d_swap_mode:
13481 case dqd_mode:
13482 oappend ("DWORD PTR ");
13483 break;
13484 case q_mode:
13485 case q_scalar_mode:
13486 case q_scalar_swap_mode:
13487 case q_swap_mode:
13488 oappend ("QWORD PTR ");
13489 break;
13490 case m_mode:
13491 if (address_mode == mode_64bit)
13492 oappend ("QWORD PTR ");
13493 else
13494 oappend ("DWORD PTR ");
13495 break;
13496 case f_mode:
13497 if (sizeflag & DFLAG)
13498 oappend ("FWORD PTR ");
13499 else
13500 oappend ("DWORD PTR ");
13501 used_prefixes |= (prefixes & PREFIX_DATA);
13502 break;
13503 case t_mode:
13504 oappend ("TBYTE PTR ");
13505 break;
13506 case x_mode:
13507 case x_swap_mode:
13508 case evex_x_gscat_mode:
13509 case evex_x_nobcst_mode:
13510 case b_scalar_mode:
13511 case w_scalar_mode:
13512 if (need_vex)
13513 {
13514 switch (vex.length)
13515 {
13516 case 128:
13517 oappend ("XMMWORD PTR ");
13518 break;
13519 case 256:
13520 oappend ("YMMWORD PTR ");
13521 break;
13522 case 512:
13523 oappend ("ZMMWORD PTR ");
13524 break;
13525 default:
13526 abort ();
13527 }
13528 }
13529 else
13530 oappend ("XMMWORD PTR ");
13531 break;
13532 case xmm_mode:
13533 oappend ("XMMWORD PTR ");
13534 break;
13535 case ymm_mode:
13536 oappend ("YMMWORD PTR ");
13537 break;
13538 case xmmq_mode:
13539 case evex_half_bcst_xmmq_mode:
13540 if (!need_vex)
13541 abort ();
13542
13543 switch (vex.length)
13544 {
13545 case 128:
13546 oappend ("QWORD PTR ");
13547 break;
13548 case 256:
13549 oappend ("XMMWORD PTR ");
13550 break;
13551 case 512:
13552 oappend ("YMMWORD PTR ");
13553 break;
13554 default:
13555 abort ();
13556 }
13557 break;
13558 case xmm_mb_mode:
13559 if (!need_vex)
13560 abort ();
13561
13562 switch (vex.length)
13563 {
13564 case 128:
13565 case 256:
13566 case 512:
13567 oappend ("BYTE PTR ");
13568 break;
13569 default:
13570 abort ();
13571 }
13572 break;
13573 case xmm_mw_mode:
13574 if (!need_vex)
13575 abort ();
13576
13577 switch (vex.length)
13578 {
13579 case 128:
13580 case 256:
13581 case 512:
13582 oappend ("WORD PTR ");
13583 break;
13584 default:
13585 abort ();
13586 }
13587 break;
13588 case xmm_md_mode:
13589 if (!need_vex)
13590 abort ();
13591
13592 switch (vex.length)
13593 {
13594 case 128:
13595 case 256:
13596 case 512:
13597 oappend ("DWORD PTR ");
13598 break;
13599 default:
13600 abort ();
13601 }
13602 break;
13603 case xmm_mq_mode:
13604 if (!need_vex)
13605 abort ();
13606
13607 switch (vex.length)
13608 {
13609 case 128:
13610 case 256:
13611 case 512:
13612 oappend ("QWORD PTR ");
13613 break;
13614 default:
13615 abort ();
13616 }
13617 break;
13618 case xmmdw_mode:
13619 if (!need_vex)
13620 abort ();
13621
13622 switch (vex.length)
13623 {
13624 case 128:
13625 oappend ("WORD PTR ");
13626 break;
13627 case 256:
13628 oappend ("DWORD PTR ");
13629 break;
13630 case 512:
13631 oappend ("QWORD PTR ");
13632 break;
13633 default:
13634 abort ();
13635 }
13636 break;
13637 case xmmqd_mode:
13638 if (!need_vex)
13639 abort ();
13640
13641 switch (vex.length)
13642 {
13643 case 128:
13644 oappend ("DWORD PTR ");
13645 break;
13646 case 256:
13647 oappend ("QWORD PTR ");
13648 break;
13649 case 512:
13650 oappend ("XMMWORD PTR ");
13651 break;
13652 default:
13653 abort ();
13654 }
13655 break;
13656 case ymmq_mode:
13657 if (!need_vex)
13658 abort ();
13659
13660 switch (vex.length)
13661 {
13662 case 128:
13663 oappend ("QWORD PTR ");
13664 break;
13665 case 256:
13666 oappend ("YMMWORD PTR ");
13667 break;
13668 case 512:
13669 oappend ("ZMMWORD PTR ");
13670 break;
13671 default:
13672 abort ();
13673 }
13674 break;
13675 case ymmxmm_mode:
13676 if (!need_vex)
13677 abort ();
13678
13679 switch (vex.length)
13680 {
13681 case 128:
13682 case 256:
13683 oappend ("XMMWORD PTR ");
13684 break;
13685 default:
13686 abort ();
13687 }
13688 break;
13689 case o_mode:
13690 oappend ("OWORD PTR ");
13691 break;
13692 case xmm_mdq_mode:
13693 case vex_w_dq_mode:
13694 case vex_scalar_w_dq_mode:
13695 if (!need_vex)
13696 abort ();
13697
13698 if (vex.w)
13699 oappend ("QWORD PTR ");
13700 else
13701 oappend ("DWORD PTR ");
13702 break;
13703 case vex_vsib_d_w_dq_mode:
13704 case vex_vsib_q_w_dq_mode:
13705 if (!need_vex)
13706 abort ();
13707
13708 if (!vex.evex)
13709 {
13710 if (vex.w)
13711 oappend ("QWORD PTR ");
13712 else
13713 oappend ("DWORD PTR ");
13714 }
13715 else
13716 {
13717 switch (vex.length)
13718 {
13719 case 128:
13720 oappend ("XMMWORD PTR ");
13721 break;
13722 case 256:
13723 oappend ("YMMWORD PTR ");
13724 break;
13725 case 512:
13726 oappend ("ZMMWORD PTR ");
13727 break;
13728 default:
13729 abort ();
13730 }
13731 }
13732 break;
13733 case vex_vsib_q_w_d_mode:
13734 case vex_vsib_d_w_d_mode:
13735 if (!need_vex || !vex.evex)
13736 abort ();
13737
13738 switch (vex.length)
13739 {
13740 case 128:
13741 oappend ("QWORD PTR ");
13742 break;
13743 case 256:
13744 oappend ("XMMWORD PTR ");
13745 break;
13746 case 512:
13747 oappend ("YMMWORD PTR ");
13748 break;
13749 default:
13750 abort ();
13751 }
13752
13753 break;
13754 case mask_bd_mode:
13755 if (!need_vex || vex.length != 128)
13756 abort ();
13757 if (vex.w)
13758 oappend ("DWORD PTR ");
13759 else
13760 oappend ("BYTE PTR ");
13761 break;
13762 case mask_mode:
13763 if (!need_vex)
13764 abort ();
13765 if (vex.w)
13766 oappend ("QWORD PTR ");
13767 else
13768 oappend ("WORD PTR ");
13769 break;
13770 case v_bnd_mode:
13771 case v_bndmk_mode:
13772 default:
13773 break;
13774 }
13775 }
13776
13777 static void
13778 OP_E_register (int bytemode, int sizeflag)
13779 {
13780 int reg = modrm.rm;
13781 const char **names;
13782
13783 USED_REX (REX_B);
13784 if ((rex & REX_B))
13785 reg += 8;
13786
13787 if ((sizeflag & SUFFIX_ALWAYS)
13788 && (bytemode == b_swap_mode
13789 || bytemode == bnd_swap_mode
13790 || bytemode == v_swap_mode))
13791 swap_operand ();
13792
13793 switch (bytemode)
13794 {
13795 case b_mode:
13796 case b_swap_mode:
13797 USED_REX (0);
13798 if (rex)
13799 names = names8rex;
13800 else
13801 names = names8;
13802 break;
13803 case w_mode:
13804 names = names16;
13805 break;
13806 case d_mode:
13807 case dw_mode:
13808 case db_mode:
13809 names = names32;
13810 break;
13811 case q_mode:
13812 names = names64;
13813 break;
13814 case m_mode:
13815 case v_bnd_mode:
13816 names = address_mode == mode_64bit ? names64 : names32;
13817 break;
13818 case bnd_mode:
13819 case bnd_swap_mode:
13820 if (reg > 0x3)
13821 {
13822 oappend ("(bad)");
13823 return;
13824 }
13825 names = names_bnd;
13826 break;
13827 case indir_v_mode:
13828 if (address_mode == mode_64bit && isa64 == intel64)
13829 {
13830 names = names64;
13831 break;
13832 }
13833 /* Fall through. */
13834 case stack_v_mode:
13835 if (address_mode == mode_64bit && ((sizeflag & DFLAG) || (rex & REX_W)))
13836 {
13837 names = names64;
13838 break;
13839 }
13840 bytemode = v_mode;
13841 /* Fall through. */
13842 case v_mode:
13843 case v_swap_mode:
13844 case dq_mode:
13845 case dqb_mode:
13846 case dqd_mode:
13847 case dqw_mode:
13848 USED_REX (REX_W);
13849 if (rex & REX_W)
13850 names = names64;
13851 else
13852 {
13853 if ((sizeflag & DFLAG)
13854 || (bytemode != v_mode
13855 && bytemode != v_swap_mode))
13856 names = names32;
13857 else
13858 names = names16;
13859 used_prefixes |= (prefixes & PREFIX_DATA);
13860 }
13861 break;
13862 case va_mode:
13863 names = (address_mode == mode_64bit
13864 ? names64 : names32);
13865 if (!(prefixes & PREFIX_ADDR))
13866 names = (address_mode == mode_16bit
13867 ? names16 : names);
13868 else
13869 {
13870 /* Remove "addr16/addr32". */
13871 all_prefixes[last_addr_prefix] = 0;
13872 names = (address_mode != mode_32bit
13873 ? names32 : names16);
13874 used_prefixes |= PREFIX_ADDR;
13875 }
13876 break;
13877 case mask_bd_mode:
13878 case mask_mode:
13879 if (reg > 0x7)
13880 {
13881 oappend ("(bad)");
13882 return;
13883 }
13884 names = names_mask;
13885 break;
13886 case 0:
13887 return;
13888 default:
13889 oappend (INTERNAL_DISASSEMBLER_ERROR);
13890 return;
13891 }
13892 oappend (names[reg]);
13893 }
13894
13895 static void
13896 OP_E_memory (int bytemode, int sizeflag)
13897 {
13898 bfd_vma disp = 0;
13899 int add = (rex & REX_B) ? 8 : 0;
13900 int riprel = 0;
13901 int shift;
13902
13903 if (vex.evex)
13904 {
13905 /* In EVEX, if operand doesn't allow broadcast, vex.b should be 0. */
13906 if (vex.b
13907 && bytemode != x_mode
13908 && bytemode != xmmq_mode
13909 && bytemode != evex_half_bcst_xmmq_mode)
13910 {
13911 BadOp ();
13912 return;
13913 }
13914 switch (bytemode)
13915 {
13916 case dqw_mode:
13917 case dw_mode:
13918 shift = 1;
13919 break;
13920 case dqb_mode:
13921 case db_mode:
13922 shift = 0;
13923 break;
13924 case dq_mode:
13925 if (address_mode != mode_64bit)
13926 {
13927 shift = 2;
13928 break;
13929 }
13930 /* fall through */
13931 case vex_vsib_d_w_dq_mode:
13932 case vex_vsib_d_w_d_mode:
13933 case vex_vsib_q_w_dq_mode:
13934 case vex_vsib_q_w_d_mode:
13935 case evex_x_gscat_mode:
13936 case xmm_mdq_mode:
13937 shift = vex.w ? 3 : 2;
13938 break;
13939 case x_mode:
13940 case evex_half_bcst_xmmq_mode:
13941 case xmmq_mode:
13942 if (vex.b)
13943 {
13944 shift = vex.w ? 3 : 2;
13945 break;
13946 }
13947 /* Fall through. */
13948 case xmmqd_mode:
13949 case xmmdw_mode:
13950 case ymmq_mode:
13951 case evex_x_nobcst_mode:
13952 case x_swap_mode:
13953 switch (vex.length)
13954 {
13955 case 128:
13956 shift = 4;
13957 break;
13958 case 256:
13959 shift = 5;
13960 break;
13961 case 512:
13962 shift = 6;
13963 break;
13964 default:
13965 abort ();
13966 }
13967 break;
13968 case ymm_mode:
13969 shift = 5;
13970 break;
13971 case xmm_mode:
13972 shift = 4;
13973 break;
13974 case xmm_mq_mode:
13975 case q_mode:
13976 case q_scalar_mode:
13977 case q_swap_mode:
13978 case q_scalar_swap_mode:
13979 shift = 3;
13980 break;
13981 case dqd_mode:
13982 case xmm_md_mode:
13983 case d_mode:
13984 case d_scalar_mode:
13985 case d_swap_mode:
13986 case d_scalar_swap_mode:
13987 shift = 2;
13988 break;
13989 case w_scalar_mode:
13990 case xmm_mw_mode:
13991 shift = 1;
13992 break;
13993 case b_scalar_mode:
13994 case xmm_mb_mode:
13995 shift = 0;
13996 break;
13997 default:
13998 abort ();
13999 }
14000 /* Make necessary corrections to shift for modes that need it.
14001 For these modes we currently have shift 4, 5 or 6 depending on
14002 vex.length (it corresponds to xmmword, ymmword or zmmword
14003 operand). We might want to make it 3, 4 or 5 (e.g. for
14004 xmmq_mode). In case of broadcast enabled the corrections
14005 aren't needed, as element size is always 32 or 64 bits. */
14006 if (!vex.b
14007 && (bytemode == xmmq_mode
14008 || bytemode == evex_half_bcst_xmmq_mode))
14009 shift -= 1;
14010 else if (bytemode == xmmqd_mode)
14011 shift -= 2;
14012 else if (bytemode == xmmdw_mode)
14013 shift -= 3;
14014 else if (bytemode == ymmq_mode && vex.length == 128)
14015 shift -= 1;
14016 }
14017 else
14018 shift = 0;
14019
14020 USED_REX (REX_B);
14021 if (intel_syntax)
14022 intel_operand_size (bytemode, sizeflag);
14023 append_seg ();
14024
14025 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
14026 {
14027 /* 32/64 bit address mode */
14028 int havedisp;
14029 int havesib;
14030 int havebase;
14031 int haveindex;
14032 int needindex;
14033 int needaddr32;
14034 int base, rbase;
14035 int vindex = 0;
14036 int scale = 0;
14037 int addr32flag = !((sizeflag & AFLAG)
14038 || bytemode == v_bnd_mode
14039 || bytemode == v_bndmk_mode
14040 || bytemode == bnd_mode
14041 || bytemode == bnd_swap_mode);
14042 const char **indexes64 = names64;
14043 const char **indexes32 = names32;
14044
14045 havesib = 0;
14046 havebase = 1;
14047 haveindex = 0;
14048 base = modrm.rm;
14049
14050 if (base == 4)
14051 {
14052 havesib = 1;
14053 vindex = sib.index;
14054 USED_REX (REX_X);
14055 if (rex & REX_X)
14056 vindex += 8;
14057 switch (bytemode)
14058 {
14059 case vex_vsib_d_w_dq_mode:
14060 case vex_vsib_d_w_d_mode:
14061 case vex_vsib_q_w_dq_mode:
14062 case vex_vsib_q_w_d_mode:
14063 if (!need_vex)
14064 abort ();
14065 if (vex.evex)
14066 {
14067 if (!vex.v)
14068 vindex += 16;
14069 }
14070
14071 haveindex = 1;
14072 switch (vex.length)
14073 {
14074 case 128:
14075 indexes64 = indexes32 = names_xmm;
14076 break;
14077 case 256:
14078 if (!vex.w
14079 || bytemode == vex_vsib_q_w_dq_mode
14080 || bytemode == vex_vsib_q_w_d_mode)
14081 indexes64 = indexes32 = names_ymm;
14082 else
14083 indexes64 = indexes32 = names_xmm;
14084 break;
14085 case 512:
14086 if (!vex.w
14087 || bytemode == vex_vsib_q_w_dq_mode
14088 || bytemode == vex_vsib_q_w_d_mode)
14089 indexes64 = indexes32 = names_zmm;
14090 else
14091 indexes64 = indexes32 = names_ymm;
14092 break;
14093 default:
14094 abort ();
14095 }
14096 break;
14097 default:
14098 haveindex = vindex != 4;
14099 break;
14100 }
14101 scale = sib.scale;
14102 base = sib.base;
14103 codep++;
14104 }
14105 rbase = base + add;
14106
14107 switch (modrm.mod)
14108 {
14109 case 0:
14110 if (base == 5)
14111 {
14112 havebase = 0;
14113 if (address_mode == mode_64bit && !havesib)
14114 riprel = 1;
14115 disp = get32s ();
14116 if (riprel && bytemode == v_bndmk_mode)
14117 {
14118 oappend ("(bad)");
14119 return;
14120 }
14121 }
14122 break;
14123 case 1:
14124 FETCH_DATA (the_info, codep + 1);
14125 disp = *codep++;
14126 if ((disp & 0x80) != 0)
14127 disp -= 0x100;
14128 if (vex.evex && shift > 0)
14129 disp <<= shift;
14130 break;
14131 case 2:
14132 disp = get32s ();
14133 break;
14134 }
14135
14136 needindex = 0;
14137 needaddr32 = 0;
14138 if (havesib
14139 && !havebase
14140 && !haveindex
14141 && address_mode != mode_16bit)
14142 {
14143 if (address_mode == mode_64bit)
14144 {
14145 /* Display eiz instead of addr32. */
14146 needindex = addr32flag;
14147 needaddr32 = 1;
14148 }
14149 else
14150 {
14151 /* In 32-bit mode, we need index register to tell [offset]
14152 from [eiz*1 + offset]. */
14153 needindex = 1;
14154 }
14155 }
14156
14157 havedisp = (havebase
14158 || needindex
14159 || (havesib && (haveindex || scale != 0)));
14160
14161 if (!intel_syntax)
14162 if (modrm.mod != 0 || base == 5)
14163 {
14164 if (havedisp || riprel)
14165 print_displacement (scratchbuf, disp);
14166 else
14167 print_operand_value (scratchbuf, 1, disp);
14168 oappend (scratchbuf);
14169 if (riprel)
14170 {
14171 set_op (disp, 1);
14172 oappend (!addr32flag ? "(%rip)" : "(%eip)");
14173 }
14174 }
14175
14176 if ((havebase || haveindex || needindex || needaddr32 || riprel)
14177 && (bytemode != v_bnd_mode)
14178 && (bytemode != v_bndmk_mode)
14179 && (bytemode != bnd_mode)
14180 && (bytemode != bnd_swap_mode))
14181 used_prefixes |= PREFIX_ADDR;
14182
14183 if (havedisp || (intel_syntax && riprel))
14184 {
14185 *obufp++ = open_char;
14186 if (intel_syntax && riprel)
14187 {
14188 set_op (disp, 1);
14189 oappend (!addr32flag ? "rip" : "eip");
14190 }
14191 *obufp = '\0';
14192 if (havebase)
14193 oappend (address_mode == mode_64bit && !addr32flag
14194 ? names64[rbase] : names32[rbase]);
14195 if (havesib)
14196 {
14197 /* ESP/RSP won't allow index. If base isn't ESP/RSP,
14198 print index to tell base + index from base. */
14199 if (scale != 0
14200 || needindex
14201 || haveindex
14202 || (havebase && base != ESP_REG_NUM))
14203 {
14204 if (!intel_syntax || havebase)
14205 {
14206 *obufp++ = separator_char;
14207 *obufp = '\0';
14208 }
14209 if (haveindex)
14210 oappend (address_mode == mode_64bit && !addr32flag
14211 ? indexes64[vindex] : indexes32[vindex]);
14212 else
14213 oappend (address_mode == mode_64bit && !addr32flag
14214 ? index64 : index32);
14215
14216 *obufp++ = scale_char;
14217 *obufp = '\0';
14218 sprintf (scratchbuf, "%d", 1 << scale);
14219 oappend (scratchbuf);
14220 }
14221 }
14222 if (intel_syntax
14223 && (disp || modrm.mod != 0 || base == 5))
14224 {
14225 if (!havedisp || (bfd_signed_vma) disp >= 0)
14226 {
14227 *obufp++ = '+';
14228 *obufp = '\0';
14229 }
14230 else if (modrm.mod != 1 && disp != -disp)
14231 {
14232 *obufp++ = '-';
14233 *obufp = '\0';
14234 disp = - (bfd_signed_vma) disp;
14235 }
14236
14237 if (havedisp)
14238 print_displacement (scratchbuf, disp);
14239 else
14240 print_operand_value (scratchbuf, 1, disp);
14241 oappend (scratchbuf);
14242 }
14243
14244 *obufp++ = close_char;
14245 *obufp = '\0';
14246 }
14247 else if (intel_syntax)
14248 {
14249 if (modrm.mod != 0 || base == 5)
14250 {
14251 if (!active_seg_prefix)
14252 {
14253 oappend (names_seg[ds_reg - es_reg]);
14254 oappend (":");
14255 }
14256 print_operand_value (scratchbuf, 1, disp);
14257 oappend (scratchbuf);
14258 }
14259 }
14260 }
14261 else
14262 {
14263 /* 16 bit address mode */
14264 used_prefixes |= prefixes & PREFIX_ADDR;
14265 switch (modrm.mod)
14266 {
14267 case 0:
14268 if (modrm.rm == 6)
14269 {
14270 disp = get16 ();
14271 if ((disp & 0x8000) != 0)
14272 disp -= 0x10000;
14273 }
14274 break;
14275 case 1:
14276 FETCH_DATA (the_info, codep + 1);
14277 disp = *codep++;
14278 if ((disp & 0x80) != 0)
14279 disp -= 0x100;
14280 if (vex.evex && shift > 0)
14281 disp <<= shift;
14282 break;
14283 case 2:
14284 disp = get16 ();
14285 if ((disp & 0x8000) != 0)
14286 disp -= 0x10000;
14287 break;
14288 }
14289
14290 if (!intel_syntax)
14291 if (modrm.mod != 0 || modrm.rm == 6)
14292 {
14293 print_displacement (scratchbuf, disp);
14294 oappend (scratchbuf);
14295 }
14296
14297 if (modrm.mod != 0 || modrm.rm != 6)
14298 {
14299 *obufp++ = open_char;
14300 *obufp = '\0';
14301 oappend (index16[modrm.rm]);
14302 if (intel_syntax
14303 && (disp || modrm.mod != 0 || modrm.rm == 6))
14304 {
14305 if ((bfd_signed_vma) disp >= 0)
14306 {
14307 *obufp++ = '+';
14308 *obufp = '\0';
14309 }
14310 else if (modrm.mod != 1)
14311 {
14312 *obufp++ = '-';
14313 *obufp = '\0';
14314 disp = - (bfd_signed_vma) disp;
14315 }
14316
14317 print_displacement (scratchbuf, disp);
14318 oappend (scratchbuf);
14319 }
14320
14321 *obufp++ = close_char;
14322 *obufp = '\0';
14323 }
14324 else if (intel_syntax)
14325 {
14326 if (!active_seg_prefix)
14327 {
14328 oappend (names_seg[ds_reg - es_reg]);
14329 oappend (":");
14330 }
14331 print_operand_value (scratchbuf, 1, disp & 0xffff);
14332 oappend (scratchbuf);
14333 }
14334 }
14335 if (vex.evex && vex.b
14336 && (bytemode == x_mode
14337 || bytemode == xmmq_mode
14338 || bytemode == evex_half_bcst_xmmq_mode))
14339 {
14340 if (vex.w
14341 || bytemode == xmmq_mode
14342 || bytemode == evex_half_bcst_xmmq_mode)
14343 {
14344 switch (vex.length)
14345 {
14346 case 128:
14347 oappend ("{1to2}");
14348 break;
14349 case 256:
14350 oappend ("{1to4}");
14351 break;
14352 case 512:
14353 oappend ("{1to8}");
14354 break;
14355 default:
14356 abort ();
14357 }
14358 }
14359 else
14360 {
14361 switch (vex.length)
14362 {
14363 case 128:
14364 oappend ("{1to4}");
14365 break;
14366 case 256:
14367 oappend ("{1to8}");
14368 break;
14369 case 512:
14370 oappend ("{1to16}");
14371 break;
14372 default:
14373 abort ();
14374 }
14375 }
14376 }
14377 }
14378
14379 static void
14380 OP_E (int bytemode, int sizeflag)
14381 {
14382 /* Skip mod/rm byte. */
14383 MODRM_CHECK;
14384 codep++;
14385
14386 if (modrm.mod == 3)
14387 OP_E_register (bytemode, sizeflag);
14388 else
14389 OP_E_memory (bytemode, sizeflag);
14390 }
14391
14392 static void
14393 OP_G (int bytemode, int sizeflag)
14394 {
14395 int add = 0;
14396 const char **names;
14397 USED_REX (REX_R);
14398 if (rex & REX_R)
14399 add += 8;
14400 switch (bytemode)
14401 {
14402 case b_mode:
14403 USED_REX (0);
14404 if (rex)
14405 oappend (names8rex[modrm.reg + add]);
14406 else
14407 oappend (names8[modrm.reg + add]);
14408 break;
14409 case w_mode:
14410 oappend (names16[modrm.reg + add]);
14411 break;
14412 case d_mode:
14413 case db_mode:
14414 case dw_mode:
14415 oappend (names32[modrm.reg + add]);
14416 break;
14417 case q_mode:
14418 oappend (names64[modrm.reg + add]);
14419 break;
14420 case bnd_mode:
14421 if (modrm.reg > 0x3)
14422 {
14423 oappend ("(bad)");
14424 return;
14425 }
14426 oappend (names_bnd[modrm.reg]);
14427 break;
14428 case v_mode:
14429 case dq_mode:
14430 case dqb_mode:
14431 case dqd_mode:
14432 case dqw_mode:
14433 USED_REX (REX_W);
14434 if (rex & REX_W)
14435 oappend (names64[modrm.reg + add]);
14436 else
14437 {
14438 if ((sizeflag & DFLAG) || bytemode != v_mode)
14439 oappend (names32[modrm.reg + add]);
14440 else
14441 oappend (names16[modrm.reg + add]);
14442 used_prefixes |= (prefixes & PREFIX_DATA);
14443 }
14444 break;
14445 case va_mode:
14446 names = (address_mode == mode_64bit
14447 ? names64 : names32);
14448 if (!(prefixes & PREFIX_ADDR))
14449 {
14450 if (address_mode == mode_16bit)
14451 names = names16;
14452 }
14453 else
14454 {
14455 /* Remove "addr16/addr32". */
14456 all_prefixes[last_addr_prefix] = 0;
14457 names = (address_mode != mode_32bit
14458 ? names32 : names16);
14459 used_prefixes |= PREFIX_ADDR;
14460 }
14461 oappend (names[modrm.reg + add]);
14462 break;
14463 case m_mode:
14464 if (address_mode == mode_64bit)
14465 oappend (names64[modrm.reg + add]);
14466 else
14467 oappend (names32[modrm.reg + add]);
14468 break;
14469 case mask_bd_mode:
14470 case mask_mode:
14471 if ((modrm.reg + add) > 0x7)
14472 {
14473 oappend ("(bad)");
14474 return;
14475 }
14476 oappend (names_mask[modrm.reg + add]);
14477 break;
14478 default:
14479 oappend (INTERNAL_DISASSEMBLER_ERROR);
14480 break;
14481 }
14482 }
14483
14484 static bfd_vma
14485 get64 (void)
14486 {
14487 bfd_vma x;
14488 #ifdef BFD64
14489 unsigned int a;
14490 unsigned int b;
14491
14492 FETCH_DATA (the_info, codep + 8);
14493 a = *codep++ & 0xff;
14494 a |= (*codep++ & 0xff) << 8;
14495 a |= (*codep++ & 0xff) << 16;
14496 a |= (*codep++ & 0xffu) << 24;
14497 b = *codep++ & 0xff;
14498 b |= (*codep++ & 0xff) << 8;
14499 b |= (*codep++ & 0xff) << 16;
14500 b |= (*codep++ & 0xffu) << 24;
14501 x = a + ((bfd_vma) b << 32);
14502 #else
14503 abort ();
14504 x = 0;
14505 #endif
14506 return x;
14507 }
14508
14509 static bfd_signed_vma
14510 get32 (void)
14511 {
14512 bfd_signed_vma x = 0;
14513
14514 FETCH_DATA (the_info, codep + 4);
14515 x = *codep++ & (bfd_signed_vma) 0xff;
14516 x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
14517 x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
14518 x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
14519 return x;
14520 }
14521
14522 static bfd_signed_vma
14523 get32s (void)
14524 {
14525 bfd_signed_vma x = 0;
14526
14527 FETCH_DATA (the_info, codep + 4);
14528 x = *codep++ & (bfd_signed_vma) 0xff;
14529 x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
14530 x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
14531 x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
14532
14533 x = (x ^ ((bfd_signed_vma) 1 << 31)) - ((bfd_signed_vma) 1 << 31);
14534
14535 return x;
14536 }
14537
14538 static int
14539 get16 (void)
14540 {
14541 int x = 0;
14542
14543 FETCH_DATA (the_info, codep + 2);
14544 x = *codep++ & 0xff;
14545 x |= (*codep++ & 0xff) << 8;
14546 return x;
14547 }
14548
14549 static void
14550 set_op (bfd_vma op, int riprel)
14551 {
14552 op_index[op_ad] = op_ad;
14553 if (address_mode == mode_64bit)
14554 {
14555 op_address[op_ad] = op;
14556 op_riprel[op_ad] = riprel;
14557 }
14558 else
14559 {
14560 /* Mask to get a 32-bit address. */
14561 op_address[op_ad] = op & 0xffffffff;
14562 op_riprel[op_ad] = riprel & 0xffffffff;
14563 }
14564 }
14565
14566 static void
14567 OP_REG (int code, int sizeflag)
14568 {
14569 const char *s;
14570 int add;
14571
14572 switch (code)
14573 {
14574 case es_reg: case ss_reg: case cs_reg:
14575 case ds_reg: case fs_reg: case gs_reg:
14576 oappend (names_seg[code - es_reg]);
14577 return;
14578 }
14579
14580 USED_REX (REX_B);
14581 if (rex & REX_B)
14582 add = 8;
14583 else
14584 add = 0;
14585
14586 switch (code)
14587 {
14588 case ax_reg: case cx_reg: case dx_reg: case bx_reg:
14589 case sp_reg: case bp_reg: case si_reg: case di_reg:
14590 s = names16[code - ax_reg + add];
14591 break;
14592 case al_reg: case ah_reg: case cl_reg: case ch_reg:
14593 case dl_reg: case dh_reg: case bl_reg: case bh_reg:
14594 USED_REX (0);
14595 if (rex)
14596 s = names8rex[code - al_reg + add];
14597 else
14598 s = names8[code - al_reg];
14599 break;
14600 case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
14601 case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
14602 if (address_mode == mode_64bit
14603 && ((sizeflag & DFLAG) || (rex & REX_W)))
14604 {
14605 s = names64[code - rAX_reg + add];
14606 break;
14607 }
14608 code += eAX_reg - rAX_reg;
14609 /* Fall through. */
14610 case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
14611 case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
14612 USED_REX (REX_W);
14613 if (rex & REX_W)
14614 s = names64[code - eAX_reg + add];
14615 else
14616 {
14617 if (sizeflag & DFLAG)
14618 s = names32[code - eAX_reg + add];
14619 else
14620 s = names16[code - eAX_reg + add];
14621 used_prefixes |= (prefixes & PREFIX_DATA);
14622 }
14623 break;
14624 default:
14625 s = INTERNAL_DISASSEMBLER_ERROR;
14626 break;
14627 }
14628 oappend (s);
14629 }
14630
14631 static void
14632 OP_IMREG (int code, int sizeflag)
14633 {
14634 const char *s;
14635
14636 switch (code)
14637 {
14638 case indir_dx_reg:
14639 if (intel_syntax)
14640 s = "dx";
14641 else
14642 s = "(%dx)";
14643 break;
14644 case ax_reg: case cx_reg: case dx_reg: case bx_reg:
14645 case sp_reg: case bp_reg: case si_reg: case di_reg:
14646 s = names16[code - ax_reg];
14647 break;
14648 case es_reg: case ss_reg: case cs_reg:
14649 case ds_reg: case fs_reg: case gs_reg:
14650 s = names_seg[code - es_reg];
14651 break;
14652 case al_reg: case ah_reg: case cl_reg: case ch_reg:
14653 case dl_reg: case dh_reg: case bl_reg: case bh_reg:
14654 USED_REX (0);
14655 if (rex)
14656 s = names8rex[code - al_reg];
14657 else
14658 s = names8[code - al_reg];
14659 break;
14660 case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
14661 case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
14662 USED_REX (REX_W);
14663 if (rex & REX_W)
14664 s = names64[code - eAX_reg];
14665 else
14666 {
14667 if (sizeflag & DFLAG)
14668 s = names32[code - eAX_reg];
14669 else
14670 s = names16[code - eAX_reg];
14671 used_prefixes |= (prefixes & PREFIX_DATA);
14672 }
14673 break;
14674 case z_mode_ax_reg:
14675 if ((rex & REX_W) || (sizeflag & DFLAG))
14676 s = *names32;
14677 else
14678 s = *names16;
14679 if (!(rex & REX_W))
14680 used_prefixes |= (prefixes & PREFIX_DATA);
14681 break;
14682 default:
14683 s = INTERNAL_DISASSEMBLER_ERROR;
14684 break;
14685 }
14686 oappend (s);
14687 }
14688
14689 static void
14690 OP_I (int bytemode, int sizeflag)
14691 {
14692 bfd_signed_vma op;
14693 bfd_signed_vma mask = -1;
14694
14695 switch (bytemode)
14696 {
14697 case b_mode:
14698 FETCH_DATA (the_info, codep + 1);
14699 op = *codep++;
14700 mask = 0xff;
14701 break;
14702 case v_mode:
14703 USED_REX (REX_W);
14704 if (rex & REX_W)
14705 op = get32s ();
14706 else
14707 {
14708 if (sizeflag & DFLAG)
14709 {
14710 op = get32 ();
14711 mask = 0xffffffff;
14712 }
14713 else
14714 {
14715 op = get16 ();
14716 mask = 0xfffff;
14717 }
14718 used_prefixes |= (prefixes & PREFIX_DATA);
14719 }
14720 break;
14721 case d_mode:
14722 mask = 0xffffffff;
14723 op = get32 ();
14724 break;
14725 case w_mode:
14726 mask = 0xfffff;
14727 op = get16 ();
14728 break;
14729 case const_1_mode:
14730 if (intel_syntax)
14731 oappend ("1");
14732 return;
14733 default:
14734 oappend (INTERNAL_DISASSEMBLER_ERROR);
14735 return;
14736 }
14737
14738 op &= mask;
14739 scratchbuf[0] = '$';
14740 print_operand_value (scratchbuf + 1, 1, op);
14741 oappend_maybe_intel (scratchbuf);
14742 scratchbuf[0] = '\0';
14743 }
14744
14745 static void
14746 OP_I64 (int bytemode, int sizeflag)
14747 {
14748 if (bytemode != v_mode || address_mode != mode_64bit || !(rex & REX_W))
14749 {
14750 OP_I (bytemode, sizeflag);
14751 return;
14752 }
14753
14754 USED_REX (REX_W);
14755
14756 scratchbuf[0] = '$';
14757 print_operand_value (scratchbuf + 1, 1, get64 ());
14758 oappend_maybe_intel (scratchbuf);
14759 scratchbuf[0] = '\0';
14760 }
14761
14762 static void
14763 OP_sI (int bytemode, int sizeflag)
14764 {
14765 bfd_signed_vma op;
14766
14767 switch (bytemode)
14768 {
14769 case b_mode:
14770 case b_T_mode:
14771 FETCH_DATA (the_info, codep + 1);
14772 op = *codep++;
14773 if ((op & 0x80) != 0)
14774 op -= 0x100;
14775 if (bytemode == b_T_mode)
14776 {
14777 if (address_mode != mode_64bit
14778 || !((sizeflag & DFLAG) || (rex & REX_W)))
14779 {
14780 /* The operand-size prefix is overridden by a REX prefix. */
14781 if ((sizeflag & DFLAG) || (rex & REX_W))
14782 op &= 0xffffffff;
14783 else
14784 op &= 0xffff;
14785 }
14786 }
14787 else
14788 {
14789 if (!(rex & REX_W))
14790 {
14791 if (sizeflag & DFLAG)
14792 op &= 0xffffffff;
14793 else
14794 op &= 0xffff;
14795 }
14796 }
14797 break;
14798 case v_mode:
14799 /* The operand-size prefix is overridden by a REX prefix. */
14800 if ((sizeflag & DFLAG) || (rex & REX_W))
14801 op = get32s ();
14802 else
14803 op = get16 ();
14804 break;
14805 default:
14806 oappend (INTERNAL_DISASSEMBLER_ERROR);
14807 return;
14808 }
14809
14810 scratchbuf[0] = '$';
14811 print_operand_value (scratchbuf + 1, 1, op);
14812 oappend_maybe_intel (scratchbuf);
14813 }
14814
14815 static void
14816 OP_J (int bytemode, int sizeflag)
14817 {
14818 bfd_vma disp;
14819 bfd_vma mask = -1;
14820 bfd_vma segment = 0;
14821
14822 switch (bytemode)
14823 {
14824 case b_mode:
14825 FETCH_DATA (the_info, codep + 1);
14826 disp = *codep++;
14827 if ((disp & 0x80) != 0)
14828 disp -= 0x100;
14829 break;
14830 case v_mode:
14831 if (isa64 == amd64)
14832 USED_REX (REX_W);
14833 if ((sizeflag & DFLAG)
14834 || (address_mode == mode_64bit
14835 && (isa64 != amd64 || (rex & REX_W))))
14836 disp = get32s ();
14837 else
14838 {
14839 disp = get16 ();
14840 if ((disp & 0x8000) != 0)
14841 disp -= 0x10000;
14842 /* In 16bit mode, address is wrapped around at 64k within
14843 the same segment. Otherwise, a data16 prefix on a jump
14844 instruction means that the pc is masked to 16 bits after
14845 the displacement is added! */
14846 mask = 0xffff;
14847 if ((prefixes & PREFIX_DATA) == 0)
14848 segment = ((start_pc + (codep - start_codep))
14849 & ~((bfd_vma) 0xffff));
14850 }
14851 if (address_mode != mode_64bit
14852 || (isa64 == amd64 && !(rex & REX_W)))
14853 used_prefixes |= (prefixes & PREFIX_DATA);
14854 break;
14855 default:
14856 oappend (INTERNAL_DISASSEMBLER_ERROR);
14857 return;
14858 }
14859 disp = ((start_pc + (codep - start_codep) + disp) & mask) | segment;
14860 set_op (disp, 0);
14861 print_operand_value (scratchbuf, 1, disp);
14862 oappend (scratchbuf);
14863 }
14864
14865 static void
14866 OP_SEG (int bytemode, int sizeflag)
14867 {
14868 if (bytemode == w_mode)
14869 oappend (names_seg[modrm.reg]);
14870 else
14871 OP_E (modrm.mod == 3 ? bytemode : w_mode, sizeflag);
14872 }
14873
14874 static void
14875 OP_DIR (int dummy ATTRIBUTE_UNUSED, int sizeflag)
14876 {
14877 int seg, offset;
14878
14879 if (sizeflag & DFLAG)
14880 {
14881 offset = get32 ();
14882 seg = get16 ();
14883 }
14884 else
14885 {
14886 offset = get16 ();
14887 seg = get16 ();
14888 }
14889 used_prefixes |= (prefixes & PREFIX_DATA);
14890 if (intel_syntax)
14891 sprintf (scratchbuf, "0x%x:0x%x", seg, offset);
14892 else
14893 sprintf (scratchbuf, "$0x%x,$0x%x", seg, offset);
14894 oappend (scratchbuf);
14895 }
14896
14897 static void
14898 OP_OFF (int bytemode, int sizeflag)
14899 {
14900 bfd_vma off;
14901
14902 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
14903 intel_operand_size (bytemode, sizeflag);
14904 append_seg ();
14905
14906 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
14907 off = get32 ();
14908 else
14909 off = get16 ();
14910
14911 if (intel_syntax)
14912 {
14913 if (!active_seg_prefix)
14914 {
14915 oappend (names_seg[ds_reg - es_reg]);
14916 oappend (":");
14917 }
14918 }
14919 print_operand_value (scratchbuf, 1, off);
14920 oappend (scratchbuf);
14921 }
14922
14923 static void
14924 OP_OFF64 (int bytemode, int sizeflag)
14925 {
14926 bfd_vma off;
14927
14928 if (address_mode != mode_64bit
14929 || (prefixes & PREFIX_ADDR))
14930 {
14931 OP_OFF (bytemode, sizeflag);
14932 return;
14933 }
14934
14935 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
14936 intel_operand_size (bytemode, sizeflag);
14937 append_seg ();
14938
14939 off = get64 ();
14940
14941 if (intel_syntax)
14942 {
14943 if (!active_seg_prefix)
14944 {
14945 oappend (names_seg[ds_reg - es_reg]);
14946 oappend (":");
14947 }
14948 }
14949 print_operand_value (scratchbuf, 1, off);
14950 oappend (scratchbuf);
14951 }
14952
14953 static void
14954 ptr_reg (int code, int sizeflag)
14955 {
14956 const char *s;
14957
14958 *obufp++ = open_char;
14959 used_prefixes |= (prefixes & PREFIX_ADDR);
14960 if (address_mode == mode_64bit)
14961 {
14962 if (!(sizeflag & AFLAG))
14963 s = names32[code - eAX_reg];
14964 else
14965 s = names64[code - eAX_reg];
14966 }
14967 else if (sizeflag & AFLAG)
14968 s = names32[code - eAX_reg];
14969 else
14970 s = names16[code - eAX_reg];
14971 oappend (s);
14972 *obufp++ = close_char;
14973 *obufp = 0;
14974 }
14975
14976 static void
14977 OP_ESreg (int code, int sizeflag)
14978 {
14979 if (intel_syntax)
14980 {
14981 switch (codep[-1])
14982 {
14983 case 0x6d: /* insw/insl */
14984 intel_operand_size (z_mode, sizeflag);
14985 break;
14986 case 0xa5: /* movsw/movsl/movsq */
14987 case 0xa7: /* cmpsw/cmpsl/cmpsq */
14988 case 0xab: /* stosw/stosl */
14989 case 0xaf: /* scasw/scasl */
14990 intel_operand_size (v_mode, sizeflag);
14991 break;
14992 default:
14993 intel_operand_size (b_mode, sizeflag);
14994 }
14995 }
14996 oappend_maybe_intel ("%es:");
14997 ptr_reg (code, sizeflag);
14998 }
14999
15000 static void
15001 OP_DSreg (int code, int sizeflag)
15002 {
15003 if (intel_syntax)
15004 {
15005 switch (codep[-1])
15006 {
15007 case 0x6f: /* outsw/outsl */
15008 intel_operand_size (z_mode, sizeflag);
15009 break;
15010 case 0xa5: /* movsw/movsl/movsq */
15011 case 0xa7: /* cmpsw/cmpsl/cmpsq */
15012 case 0xad: /* lodsw/lodsl/lodsq */
15013 intel_operand_size (v_mode, sizeflag);
15014 break;
15015 default:
15016 intel_operand_size (b_mode, sizeflag);
15017 }
15018 }
15019 /* Set active_seg_prefix to PREFIX_DS if it is unset so that the
15020 default segment register DS is printed. */
15021 if (!active_seg_prefix)
15022 active_seg_prefix = PREFIX_DS;
15023 append_seg ();
15024 ptr_reg (code, sizeflag);
15025 }
15026
15027 static void
15028 OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15029 {
15030 int add;
15031 if (rex & REX_R)
15032 {
15033 USED_REX (REX_R);
15034 add = 8;
15035 }
15036 else if (address_mode != mode_64bit && (prefixes & PREFIX_LOCK))
15037 {
15038 all_prefixes[last_lock_prefix] = 0;
15039 used_prefixes |= PREFIX_LOCK;
15040 add = 8;
15041 }
15042 else
15043 add = 0;
15044 sprintf (scratchbuf, "%%cr%d", modrm.reg + add);
15045 oappend_maybe_intel (scratchbuf);
15046 }
15047
15048 static void
15049 OP_D (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15050 {
15051 int add;
15052 USED_REX (REX_R);
15053 if (rex & REX_R)
15054 add = 8;
15055 else
15056 add = 0;
15057 if (intel_syntax)
15058 sprintf (scratchbuf, "db%d", modrm.reg + add);
15059 else
15060 sprintf (scratchbuf, "%%db%d", modrm.reg + add);
15061 oappend (scratchbuf);
15062 }
15063
15064 static void
15065 OP_T (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15066 {
15067 sprintf (scratchbuf, "%%tr%d", modrm.reg);
15068 oappend_maybe_intel (scratchbuf);
15069 }
15070
15071 static void
15072 OP_R (int bytemode, int sizeflag)
15073 {
15074 /* Skip mod/rm byte. */
15075 MODRM_CHECK;
15076 codep++;
15077 OP_E_register (bytemode, sizeflag);
15078 }
15079
15080 static void
15081 OP_MMX (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15082 {
15083 int reg = modrm.reg;
15084 const char **names;
15085
15086 used_prefixes |= (prefixes & PREFIX_DATA);
15087 if (prefixes & PREFIX_DATA)
15088 {
15089 names = names_xmm;
15090 USED_REX (REX_R);
15091 if (rex & REX_R)
15092 reg += 8;
15093 }
15094 else
15095 names = names_mm;
15096 oappend (names[reg]);
15097 }
15098
15099 static void
15100 OP_XMM (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
15101 {
15102 int reg = modrm.reg;
15103 const char **names;
15104
15105 USED_REX (REX_R);
15106 if (rex & REX_R)
15107 reg += 8;
15108 if (vex.evex)
15109 {
15110 if (!vex.r)
15111 reg += 16;
15112 }
15113
15114 if (need_vex
15115 && bytemode != xmm_mode
15116 && bytemode != xmmq_mode
15117 && bytemode != evex_half_bcst_xmmq_mode
15118 && bytemode != ymm_mode
15119 && bytemode != scalar_mode)
15120 {
15121 switch (vex.length)
15122 {
15123 case 128:
15124 names = names_xmm;
15125 break;
15126 case 256:
15127 if (vex.w
15128 || (bytemode != vex_vsib_q_w_dq_mode
15129 && bytemode != vex_vsib_q_w_d_mode))
15130 names = names_ymm;
15131 else
15132 names = names_xmm;
15133 break;
15134 case 512:
15135 names = names_zmm;
15136 break;
15137 default:
15138 abort ();
15139 }
15140 }
15141 else if (bytemode == xmmq_mode
15142 || bytemode == evex_half_bcst_xmmq_mode)
15143 {
15144 switch (vex.length)
15145 {
15146 case 128:
15147 case 256:
15148 names = names_xmm;
15149 break;
15150 case 512:
15151 names = names_ymm;
15152 break;
15153 default:
15154 abort ();
15155 }
15156 }
15157 else if (bytemode == ymm_mode)
15158 names = names_ymm;
15159 else
15160 names = names_xmm;
15161 oappend (names[reg]);
15162 }
15163
15164 static void
15165 OP_EM (int bytemode, int sizeflag)
15166 {
15167 int reg;
15168 const char **names;
15169
15170 if (modrm.mod != 3)
15171 {
15172 if (intel_syntax
15173 && (bytemode == v_mode || bytemode == v_swap_mode))
15174 {
15175 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
15176 used_prefixes |= (prefixes & PREFIX_DATA);
15177 }
15178 OP_E (bytemode, sizeflag);
15179 return;
15180 }
15181
15182 if ((sizeflag & SUFFIX_ALWAYS) && bytemode == v_swap_mode)
15183 swap_operand ();
15184
15185 /* Skip mod/rm byte. */
15186 MODRM_CHECK;
15187 codep++;
15188 used_prefixes |= (prefixes & PREFIX_DATA);
15189 reg = modrm.rm;
15190 if (prefixes & PREFIX_DATA)
15191 {
15192 names = names_xmm;
15193 USED_REX (REX_B);
15194 if (rex & REX_B)
15195 reg += 8;
15196 }
15197 else
15198 names = names_mm;
15199 oappend (names[reg]);
15200 }
15201
15202 /* cvt* are the only instructions in sse2 which have
15203 both SSE and MMX operands and also have 0x66 prefix
15204 in their opcode. 0x66 was originally used to differentiate
15205 between SSE and MMX instruction(operands). So we have to handle the
15206 cvt* separately using OP_EMC and OP_MXC */
15207 static void
15208 OP_EMC (int bytemode, int sizeflag)
15209 {
15210 if (modrm.mod != 3)
15211 {
15212 if (intel_syntax && bytemode == v_mode)
15213 {
15214 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
15215 used_prefixes |= (prefixes & PREFIX_DATA);
15216 }
15217 OP_E (bytemode, sizeflag);
15218 return;
15219 }
15220
15221 /* Skip mod/rm byte. */
15222 MODRM_CHECK;
15223 codep++;
15224 used_prefixes |= (prefixes & PREFIX_DATA);
15225 oappend (names_mm[modrm.rm]);
15226 }
15227
15228 static void
15229 OP_MXC (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15230 {
15231 used_prefixes |= (prefixes & PREFIX_DATA);
15232 oappend (names_mm[modrm.reg]);
15233 }
15234
15235 static void
15236 OP_EX (int bytemode, int sizeflag)
15237 {
15238 int reg;
15239 const char **names;
15240
15241 /* Skip mod/rm byte. */
15242 MODRM_CHECK;
15243 codep++;
15244
15245 if (modrm.mod != 3)
15246 {
15247 OP_E_memory (bytemode, sizeflag);
15248 return;
15249 }
15250
15251 reg = modrm.rm;
15252 USED_REX (REX_B);
15253 if (rex & REX_B)
15254 reg += 8;
15255 if (vex.evex)
15256 {
15257 USED_REX (REX_X);
15258 if ((rex & REX_X))
15259 reg += 16;
15260 }
15261
15262 if ((sizeflag & SUFFIX_ALWAYS)
15263 && (bytemode == x_swap_mode
15264 || bytemode == d_swap_mode
15265 || bytemode == d_scalar_swap_mode
15266 || bytemode == q_swap_mode
15267 || bytemode == q_scalar_swap_mode))
15268 swap_operand ();
15269
15270 if (need_vex
15271 && bytemode != xmm_mode
15272 && bytemode != xmmdw_mode
15273 && bytemode != xmmqd_mode
15274 && bytemode != xmm_mb_mode
15275 && bytemode != xmm_mw_mode
15276 && bytemode != xmm_md_mode
15277 && bytemode != xmm_mq_mode
15278 && bytemode != xmm_mdq_mode
15279 && bytemode != xmmq_mode
15280 && bytemode != evex_half_bcst_xmmq_mode
15281 && bytemode != ymm_mode
15282 && bytemode != d_scalar_mode
15283 && bytemode != d_scalar_swap_mode
15284 && bytemode != q_scalar_mode
15285 && bytemode != q_scalar_swap_mode
15286 && bytemode != vex_scalar_w_dq_mode)
15287 {
15288 switch (vex.length)
15289 {
15290 case 128:
15291 names = names_xmm;
15292 break;
15293 case 256:
15294 names = names_ymm;
15295 break;
15296 case 512:
15297 names = names_zmm;
15298 break;
15299 default:
15300 abort ();
15301 }
15302 }
15303 else if (bytemode == xmmq_mode
15304 || bytemode == evex_half_bcst_xmmq_mode)
15305 {
15306 switch (vex.length)
15307 {
15308 case 128:
15309 case 256:
15310 names = names_xmm;
15311 break;
15312 case 512:
15313 names = names_ymm;
15314 break;
15315 default:
15316 abort ();
15317 }
15318 }
15319 else if (bytemode == ymm_mode)
15320 names = names_ymm;
15321 else
15322 names = names_xmm;
15323 oappend (names[reg]);
15324 }
15325
15326 static void
15327 OP_MS (int bytemode, int sizeflag)
15328 {
15329 if (modrm.mod == 3)
15330 OP_EM (bytemode, sizeflag);
15331 else
15332 BadOp ();
15333 }
15334
15335 static void
15336 OP_XS (int bytemode, int sizeflag)
15337 {
15338 if (modrm.mod == 3)
15339 OP_EX (bytemode, sizeflag);
15340 else
15341 BadOp ();
15342 }
15343
15344 static void
15345 OP_M (int bytemode, int sizeflag)
15346 {
15347 if (modrm.mod == 3)
15348 /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
15349 BadOp ();
15350 else
15351 OP_E (bytemode, sizeflag);
15352 }
15353
15354 static void
15355 OP_0f07 (int bytemode, int sizeflag)
15356 {
15357 if (modrm.mod != 3 || modrm.rm != 0)
15358 BadOp ();
15359 else
15360 OP_E (bytemode, sizeflag);
15361 }
15362
15363 /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
15364 32bit mode and "xchg %rax,%rax" in 64bit mode. */
15365
15366 static void
15367 NOP_Fixup1 (int bytemode, int sizeflag)
15368 {
15369 if ((prefixes & PREFIX_DATA) != 0
15370 || (rex != 0
15371 && rex != 0x48
15372 && address_mode == mode_64bit))
15373 OP_REG (bytemode, sizeflag);
15374 else
15375 strcpy (obuf, "nop");
15376 }
15377
15378 static void
15379 NOP_Fixup2 (int bytemode, int sizeflag)
15380 {
15381 if ((prefixes & PREFIX_DATA) != 0
15382 || (rex != 0
15383 && rex != 0x48
15384 && address_mode == mode_64bit))
15385 OP_IMREG (bytemode, sizeflag);
15386 }
15387
15388 static const char *const Suffix3DNow[] = {
15389 /* 00 */ NULL, NULL, NULL, NULL,
15390 /* 04 */ NULL, NULL, NULL, NULL,
15391 /* 08 */ NULL, NULL, NULL, NULL,
15392 /* 0C */ "pi2fw", "pi2fd", NULL, NULL,
15393 /* 10 */ NULL, NULL, NULL, NULL,
15394 /* 14 */ NULL, NULL, NULL, NULL,
15395 /* 18 */ NULL, NULL, NULL, NULL,
15396 /* 1C */ "pf2iw", "pf2id", NULL, NULL,
15397 /* 20 */ NULL, NULL, NULL, NULL,
15398 /* 24 */ NULL, NULL, NULL, NULL,
15399 /* 28 */ NULL, NULL, NULL, NULL,
15400 /* 2C */ NULL, NULL, NULL, NULL,
15401 /* 30 */ NULL, NULL, NULL, NULL,
15402 /* 34 */ NULL, NULL, NULL, NULL,
15403 /* 38 */ NULL, NULL, NULL, NULL,
15404 /* 3C */ NULL, NULL, NULL, NULL,
15405 /* 40 */ NULL, NULL, NULL, NULL,
15406 /* 44 */ NULL, NULL, NULL, NULL,
15407 /* 48 */ NULL, NULL, NULL, NULL,
15408 /* 4C */ NULL, NULL, NULL, NULL,
15409 /* 50 */ NULL, NULL, NULL, NULL,
15410 /* 54 */ NULL, NULL, NULL, NULL,
15411 /* 58 */ NULL, NULL, NULL, NULL,
15412 /* 5C */ NULL, NULL, NULL, NULL,
15413 /* 60 */ NULL, NULL, NULL, NULL,
15414 /* 64 */ NULL, NULL, NULL, NULL,
15415 /* 68 */ NULL, NULL, NULL, NULL,
15416 /* 6C */ NULL, NULL, NULL, NULL,
15417 /* 70 */ NULL, NULL, NULL, NULL,
15418 /* 74 */ NULL, NULL, NULL, NULL,
15419 /* 78 */ NULL, NULL, NULL, NULL,
15420 /* 7C */ NULL, NULL, NULL, NULL,
15421 /* 80 */ NULL, NULL, NULL, NULL,
15422 /* 84 */ NULL, NULL, NULL, NULL,
15423 /* 88 */ NULL, NULL, "pfnacc", NULL,
15424 /* 8C */ NULL, NULL, "pfpnacc", NULL,
15425 /* 90 */ "pfcmpge", NULL, NULL, NULL,
15426 /* 94 */ "pfmin", NULL, "pfrcp", "pfrsqrt",
15427 /* 98 */ NULL, NULL, "pfsub", NULL,
15428 /* 9C */ NULL, NULL, "pfadd", NULL,
15429 /* A0 */ "pfcmpgt", NULL, NULL, NULL,
15430 /* A4 */ "pfmax", NULL, "pfrcpit1", "pfrsqit1",
15431 /* A8 */ NULL, NULL, "pfsubr", NULL,
15432 /* AC */ NULL, NULL, "pfacc", NULL,
15433 /* B0 */ "pfcmpeq", NULL, NULL, NULL,
15434 /* B4 */ "pfmul", NULL, "pfrcpit2", "pmulhrw",
15435 /* B8 */ NULL, NULL, NULL, "pswapd",
15436 /* BC */ NULL, NULL, NULL, "pavgusb",
15437 /* C0 */ NULL, NULL, NULL, NULL,
15438 /* C4 */ NULL, NULL, NULL, NULL,
15439 /* C8 */ NULL, NULL, NULL, NULL,
15440 /* CC */ NULL, NULL, NULL, NULL,
15441 /* D0 */ NULL, NULL, NULL, NULL,
15442 /* D4 */ NULL, NULL, NULL, NULL,
15443 /* D8 */ NULL, NULL, NULL, NULL,
15444 /* DC */ NULL, NULL, NULL, NULL,
15445 /* E0 */ NULL, NULL, NULL, NULL,
15446 /* E4 */ NULL, NULL, NULL, NULL,
15447 /* E8 */ NULL, NULL, NULL, NULL,
15448 /* EC */ NULL, NULL, NULL, NULL,
15449 /* F0 */ NULL, NULL, NULL, NULL,
15450 /* F4 */ NULL, NULL, NULL, NULL,
15451 /* F8 */ NULL, NULL, NULL, NULL,
15452 /* FC */ NULL, NULL, NULL, NULL,
15453 };
15454
15455 static void
15456 OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15457 {
15458 const char *mnemonic;
15459
15460 FETCH_DATA (the_info, codep + 1);
15461 /* AMD 3DNow! instructions are specified by an opcode suffix in the
15462 place where an 8-bit immediate would normally go. ie. the last
15463 byte of the instruction. */
15464 obufp = mnemonicendp;
15465 mnemonic = Suffix3DNow[*codep++ & 0xff];
15466 if (mnemonic)
15467 oappend (mnemonic);
15468 else
15469 {
15470 /* Since a variable sized modrm/sib chunk is between the start
15471 of the opcode (0x0f0f) and the opcode suffix, we need to do
15472 all the modrm processing first, and don't know until now that
15473 we have a bad opcode. This necessitates some cleaning up. */
15474 op_out[0][0] = '\0';
15475 op_out[1][0] = '\0';
15476 BadOp ();
15477 }
15478 mnemonicendp = obufp;
15479 }
15480
15481 static struct op simd_cmp_op[] =
15482 {
15483 { STRING_COMMA_LEN ("eq") },
15484 { STRING_COMMA_LEN ("lt") },
15485 { STRING_COMMA_LEN ("le") },
15486 { STRING_COMMA_LEN ("unord") },
15487 { STRING_COMMA_LEN ("neq") },
15488 { STRING_COMMA_LEN ("nlt") },
15489 { STRING_COMMA_LEN ("nle") },
15490 { STRING_COMMA_LEN ("ord") }
15491 };
15492
15493 static void
15494 CMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15495 {
15496 unsigned int cmp_type;
15497
15498 FETCH_DATA (the_info, codep + 1);
15499 cmp_type = *codep++ & 0xff;
15500 if (cmp_type < ARRAY_SIZE (simd_cmp_op))
15501 {
15502 char suffix [3];
15503 char *p = mnemonicendp - 2;
15504 suffix[0] = p[0];
15505 suffix[1] = p[1];
15506 suffix[2] = '\0';
15507 sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
15508 mnemonicendp += simd_cmp_op[cmp_type].len;
15509 }
15510 else
15511 {
15512 /* We have a reserved extension byte. Output it directly. */
15513 scratchbuf[0] = '$';
15514 print_operand_value (scratchbuf + 1, 1, cmp_type);
15515 oappend_maybe_intel (scratchbuf);
15516 scratchbuf[0] = '\0';
15517 }
15518 }
15519
15520 static void
15521 OP_Mwaitx (int bytemode ATTRIBUTE_UNUSED,
15522 int sizeflag ATTRIBUTE_UNUSED)
15523 {
15524 /* mwaitx %eax,%ecx,%ebx */
15525 if (!intel_syntax)
15526 {
15527 const char **names = (address_mode == mode_64bit
15528 ? names64 : names32);
15529 strcpy (op_out[0], names[0]);
15530 strcpy (op_out[1], names[1]);
15531 strcpy (op_out[2], names[3]);
15532 two_source_ops = 1;
15533 }
15534 /* Skip mod/rm byte. */
15535 MODRM_CHECK;
15536 codep++;
15537 }
15538
15539 static void
15540 OP_Mwait (int bytemode ATTRIBUTE_UNUSED,
15541 int sizeflag ATTRIBUTE_UNUSED)
15542 {
15543 /* mwait %eax,%ecx */
15544 if (!intel_syntax)
15545 {
15546 const char **names = (address_mode == mode_64bit
15547 ? names64 : names32);
15548 strcpy (op_out[0], names[0]);
15549 strcpy (op_out[1], names[1]);
15550 two_source_ops = 1;
15551 }
15552 /* Skip mod/rm byte. */
15553 MODRM_CHECK;
15554 codep++;
15555 }
15556
15557 static void
15558 OP_Monitor (int bytemode ATTRIBUTE_UNUSED,
15559 int sizeflag ATTRIBUTE_UNUSED)
15560 {
15561 /* monitor %eax,%ecx,%edx" */
15562 if (!intel_syntax)
15563 {
15564 const char **op1_names;
15565 const char **names = (address_mode == mode_64bit
15566 ? names64 : names32);
15567
15568 if (!(prefixes & PREFIX_ADDR))
15569 op1_names = (address_mode == mode_16bit
15570 ? names16 : names);
15571 else
15572 {
15573 /* Remove "addr16/addr32". */
15574 all_prefixes[last_addr_prefix] = 0;
15575 op1_names = (address_mode != mode_32bit
15576 ? names32 : names16);
15577 used_prefixes |= PREFIX_ADDR;
15578 }
15579 strcpy (op_out[0], op1_names[0]);
15580 strcpy (op_out[1], names[1]);
15581 strcpy (op_out[2], names[2]);
15582 two_source_ops = 1;
15583 }
15584 /* Skip mod/rm byte. */
15585 MODRM_CHECK;
15586 codep++;
15587 }
15588
15589 static void
15590 BadOp (void)
15591 {
15592 /* Throw away prefixes and 1st. opcode byte. */
15593 codep = insn_codep + 1;
15594 oappend ("(bad)");
15595 }
15596
15597 static void
15598 REP_Fixup (int bytemode, int sizeflag)
15599 {
15600 /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
15601 lods and stos. */
15602 if (prefixes & PREFIX_REPZ)
15603 all_prefixes[last_repz_prefix] = REP_PREFIX;
15604
15605 switch (bytemode)
15606 {
15607 case al_reg:
15608 case eAX_reg:
15609 case indir_dx_reg:
15610 OP_IMREG (bytemode, sizeflag);
15611 break;
15612 case eDI_reg:
15613 OP_ESreg (bytemode, sizeflag);
15614 break;
15615 case eSI_reg:
15616 OP_DSreg (bytemode, sizeflag);
15617 break;
15618 default:
15619 abort ();
15620 break;
15621 }
15622 }
15623
15624 /* For BND-prefixed instructions 0xF2 prefix should be displayed as
15625 "bnd". */
15626
15627 static void
15628 BND_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15629 {
15630 if (prefixes & PREFIX_REPNZ)
15631 all_prefixes[last_repnz_prefix] = BND_PREFIX;
15632 }
15633
15634 /* For NOTRACK-prefixed instructions, 0x3E prefix should be displayed as
15635 "notrack". */
15636
15637 static void
15638 NOTRACK_Fixup (int bytemode ATTRIBUTE_UNUSED,
15639 int sizeflag ATTRIBUTE_UNUSED)
15640 {
15641 if (active_seg_prefix == PREFIX_DS
15642 && (address_mode != mode_64bit || last_data_prefix < 0))
15643 {
15644 /* NOTRACK prefix is only valid on indirect branch instructions.
15645 NB: DATA prefix is unsupported for Intel64. */
15646 active_seg_prefix = 0;
15647 all_prefixes[last_seg_prefix] = NOTRACK_PREFIX;
15648 }
15649 }
15650
15651 /* Similar to OP_E. But the 0xf2/0xf3 prefixes should be displayed as
15652 "xacquire"/"xrelease" for memory operand if there is a LOCK prefix.
15653 */
15654
15655 static void
15656 HLE_Fixup1 (int bytemode, int sizeflag)
15657 {
15658 if (modrm.mod != 3
15659 && (prefixes & PREFIX_LOCK) != 0)
15660 {
15661 if (prefixes & PREFIX_REPZ)
15662 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
15663 if (prefixes & PREFIX_REPNZ)
15664 all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
15665 }
15666
15667 OP_E (bytemode, sizeflag);
15668 }
15669
15670 /* Similar to OP_E. But the 0xf2/0xf3 prefixes should be displayed as
15671 "xacquire"/"xrelease" for memory operand. No check for LOCK prefix.
15672 */
15673
15674 static void
15675 HLE_Fixup2 (int bytemode, int sizeflag)
15676 {
15677 if (modrm.mod != 3)
15678 {
15679 if (prefixes & PREFIX_REPZ)
15680 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
15681 if (prefixes & PREFIX_REPNZ)
15682 all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
15683 }
15684
15685 OP_E (bytemode, sizeflag);
15686 }
15687
15688 /* Similar to OP_E. But the 0xf3 prefixes should be displayed as
15689 "xrelease" for memory operand. No check for LOCK prefix. */
15690
15691 static void
15692 HLE_Fixup3 (int bytemode, int sizeflag)
15693 {
15694 if (modrm.mod != 3
15695 && last_repz_prefix > last_repnz_prefix
15696 && (prefixes & PREFIX_REPZ) != 0)
15697 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
15698
15699 OP_E (bytemode, sizeflag);
15700 }
15701
15702 static void
15703 CMPXCHG8B_Fixup (int bytemode, int sizeflag)
15704 {
15705 USED_REX (REX_W);
15706 if (rex & REX_W)
15707 {
15708 /* Change cmpxchg8b to cmpxchg16b. */
15709 char *p = mnemonicendp - 2;
15710 mnemonicendp = stpcpy (p, "16b");
15711 bytemode = o_mode;
15712 }
15713 else if ((prefixes & PREFIX_LOCK) != 0)
15714 {
15715 if (prefixes & PREFIX_REPZ)
15716 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
15717 if (prefixes & PREFIX_REPNZ)
15718 all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
15719 }
15720
15721 OP_M (bytemode, sizeflag);
15722 }
15723
15724 static void
15725 XMM_Fixup (int reg, int sizeflag ATTRIBUTE_UNUSED)
15726 {
15727 const char **names;
15728
15729 if (need_vex)
15730 {
15731 switch (vex.length)
15732 {
15733 case 128:
15734 names = names_xmm;
15735 break;
15736 case 256:
15737 names = names_ymm;
15738 break;
15739 default:
15740 abort ();
15741 }
15742 }
15743 else
15744 names = names_xmm;
15745 oappend (names[reg]);
15746 }
15747
15748 static void
15749 CRC32_Fixup (int bytemode, int sizeflag)
15750 {
15751 /* Add proper suffix to "crc32". */
15752 char *p = mnemonicendp;
15753
15754 switch (bytemode)
15755 {
15756 case b_mode:
15757 if (intel_syntax)
15758 goto skip;
15759
15760 *p++ = 'b';
15761 break;
15762 case v_mode:
15763 if (intel_syntax)
15764 goto skip;
15765
15766 USED_REX (REX_W);
15767 if (rex & REX_W)
15768 *p++ = 'q';
15769 else
15770 {
15771 if (sizeflag & DFLAG)
15772 *p++ = 'l';
15773 else
15774 *p++ = 'w';
15775 used_prefixes |= (prefixes & PREFIX_DATA);
15776 }
15777 break;
15778 default:
15779 oappend (INTERNAL_DISASSEMBLER_ERROR);
15780 break;
15781 }
15782 mnemonicendp = p;
15783 *p = '\0';
15784
15785 skip:
15786 if (modrm.mod == 3)
15787 {
15788 int add;
15789
15790 /* Skip mod/rm byte. */
15791 MODRM_CHECK;
15792 codep++;
15793
15794 USED_REX (REX_B);
15795 add = (rex & REX_B) ? 8 : 0;
15796 if (bytemode == b_mode)
15797 {
15798 USED_REX (0);
15799 if (rex)
15800 oappend (names8rex[modrm.rm + add]);
15801 else
15802 oappend (names8[modrm.rm + add]);
15803 }
15804 else
15805 {
15806 USED_REX (REX_W);
15807 if (rex & REX_W)
15808 oappend (names64[modrm.rm + add]);
15809 else if ((prefixes & PREFIX_DATA))
15810 oappend (names16[modrm.rm + add]);
15811 else
15812 oappend (names32[modrm.rm + add]);
15813 }
15814 }
15815 else
15816 OP_E (bytemode, sizeflag);
15817 }
15818
15819 static void
15820 FXSAVE_Fixup (int bytemode, int sizeflag)
15821 {
15822 /* Add proper suffix to "fxsave" and "fxrstor". */
15823 USED_REX (REX_W);
15824 if (rex & REX_W)
15825 {
15826 char *p = mnemonicendp;
15827 *p++ = '6';
15828 *p++ = '4';
15829 *p = '\0';
15830 mnemonicendp = p;
15831 }
15832 OP_M (bytemode, sizeflag);
15833 }
15834
15835 static void
15836 PCMPESTR_Fixup (int bytemode, int sizeflag)
15837 {
15838 /* Add proper suffix to "{,v}pcmpestr{i,m}". */
15839 if (!intel_syntax)
15840 {
15841 char *p = mnemonicendp;
15842
15843 USED_REX (REX_W);
15844 if (rex & REX_W)
15845 *p++ = 'q';
15846 else if (sizeflag & SUFFIX_ALWAYS)
15847 *p++ = 'l';
15848
15849 *p = '\0';
15850 mnemonicendp = p;
15851 }
15852
15853 OP_EX (bytemode, sizeflag);
15854 }
15855
15856 /* Display the destination register operand for instructions with
15857 VEX. */
15858
15859 static void
15860 OP_VEX (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
15861 {
15862 int reg;
15863 const char **names;
15864
15865 if (!need_vex)
15866 abort ();
15867
15868 if (!need_vex_reg)
15869 return;
15870
15871 reg = vex.register_specifier;
15872 vex.register_specifier = 0;
15873 if (address_mode != mode_64bit)
15874 reg &= 7;
15875 else if (vex.evex && !vex.v)
15876 reg += 16;
15877
15878 if (bytemode == vex_scalar_mode)
15879 {
15880 oappend (names_xmm[reg]);
15881 return;
15882 }
15883
15884 switch (vex.length)
15885 {
15886 case 128:
15887 switch (bytemode)
15888 {
15889 case vex_mode:
15890 case vex128_mode:
15891 case vex_vsib_q_w_dq_mode:
15892 case vex_vsib_q_w_d_mode:
15893 names = names_xmm;
15894 break;
15895 case dq_mode:
15896 if (rex & REX_W)
15897 names = names64;
15898 else
15899 names = names32;
15900 break;
15901 case mask_bd_mode:
15902 case mask_mode:
15903 if (reg > 0x7)
15904 {
15905 oappend ("(bad)");
15906 return;
15907 }
15908 names = names_mask;
15909 break;
15910 default:
15911 abort ();
15912 return;
15913 }
15914 break;
15915 case 256:
15916 switch (bytemode)
15917 {
15918 case vex_mode:
15919 case vex256_mode:
15920 names = names_ymm;
15921 break;
15922 case vex_vsib_q_w_dq_mode:
15923 case vex_vsib_q_w_d_mode:
15924 names = vex.w ? names_ymm : names_xmm;
15925 break;
15926 case mask_bd_mode:
15927 case mask_mode:
15928 if (reg > 0x7)
15929 {
15930 oappend ("(bad)");
15931 return;
15932 }
15933 names = names_mask;
15934 break;
15935 default:
15936 /* See PR binutils/20893 for a reproducer. */
15937 oappend ("(bad)");
15938 return;
15939 }
15940 break;
15941 case 512:
15942 names = names_zmm;
15943 break;
15944 default:
15945 abort ();
15946 break;
15947 }
15948 oappend (names[reg]);
15949 }
15950
15951 /* Get the VEX immediate byte without moving codep. */
15952
15953 static unsigned char
15954 get_vex_imm8 (int sizeflag, int opnum)
15955 {
15956 int bytes_before_imm = 0;
15957
15958 if (modrm.mod != 3)
15959 {
15960 /* There are SIB/displacement bytes. */
15961 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
15962 {
15963 /* 32/64 bit address mode */
15964 int base = modrm.rm;
15965
15966 /* Check SIB byte. */
15967 if (base == 4)
15968 {
15969 FETCH_DATA (the_info, codep + 1);
15970 base = *codep & 7;
15971 /* When decoding the third source, don't increase
15972 bytes_before_imm as this has already been incremented
15973 by one in OP_E_memory while decoding the second
15974 source operand. */
15975 if (opnum == 0)
15976 bytes_before_imm++;
15977 }
15978
15979 /* Don't increase bytes_before_imm when decoding the third source,
15980 it has already been incremented by OP_E_memory while decoding
15981 the second source operand. */
15982 if (opnum == 0)
15983 {
15984 switch (modrm.mod)
15985 {
15986 case 0:
15987 /* When modrm.rm == 5 or modrm.rm == 4 and base in
15988 SIB == 5, there is a 4 byte displacement. */
15989 if (base != 5)
15990 /* No displacement. */
15991 break;
15992 /* Fall through. */
15993 case 2:
15994 /* 4 byte displacement. */
15995 bytes_before_imm += 4;
15996 break;
15997 case 1:
15998 /* 1 byte displacement. */
15999 bytes_before_imm++;
16000 break;
16001 }
16002 }
16003 }
16004 else
16005 {
16006 /* 16 bit address mode */
16007 /* Don't increase bytes_before_imm when decoding the third source,
16008 it has already been incremented by OP_E_memory while decoding
16009 the second source operand. */
16010 if (opnum == 0)
16011 {
16012 switch (modrm.mod)
16013 {
16014 case 0:
16015 /* When modrm.rm == 6, there is a 2 byte displacement. */
16016 if (modrm.rm != 6)
16017 /* No displacement. */
16018 break;
16019 /* Fall through. */
16020 case 2:
16021 /* 2 byte displacement. */
16022 bytes_before_imm += 2;
16023 break;
16024 case 1:
16025 /* 1 byte displacement: when decoding the third source,
16026 don't increase bytes_before_imm as this has already
16027 been incremented by one in OP_E_memory while decoding
16028 the second source operand. */
16029 if (opnum == 0)
16030 bytes_before_imm++;
16031
16032 break;
16033 }
16034 }
16035 }
16036 }
16037
16038 FETCH_DATA (the_info, codep + bytes_before_imm + 1);
16039 return codep [bytes_before_imm];
16040 }
16041
16042 static void
16043 OP_EX_VexReg (int bytemode, int sizeflag, int reg)
16044 {
16045 const char **names;
16046
16047 if (reg == -1 && modrm.mod != 3)
16048 {
16049 OP_E_memory (bytemode, sizeflag);
16050 return;
16051 }
16052 else
16053 {
16054 if (reg == -1)
16055 {
16056 reg = modrm.rm;
16057 USED_REX (REX_B);
16058 if (rex & REX_B)
16059 reg += 8;
16060 }
16061 if (address_mode != mode_64bit)
16062 reg &= 7;
16063 }
16064
16065 switch (vex.length)
16066 {
16067 case 128:
16068 names = names_xmm;
16069 break;
16070 case 256:
16071 names = names_ymm;
16072 break;
16073 default:
16074 abort ();
16075 }
16076 oappend (names[reg]);
16077 }
16078
16079 static void
16080 OP_EX_VexImmW (int bytemode, int sizeflag)
16081 {
16082 int reg = -1;
16083 static unsigned char vex_imm8;
16084
16085 if (vex_w_done == 0)
16086 {
16087 vex_w_done = 1;
16088
16089 /* Skip mod/rm byte. */
16090 MODRM_CHECK;
16091 codep++;
16092
16093 vex_imm8 = get_vex_imm8 (sizeflag, 0);
16094
16095 if (vex.w)
16096 reg = vex_imm8 >> 4;
16097
16098 OP_EX_VexReg (bytemode, sizeflag, reg);
16099 }
16100 else if (vex_w_done == 1)
16101 {
16102 vex_w_done = 2;
16103
16104 if (!vex.w)
16105 reg = vex_imm8 >> 4;
16106
16107 OP_EX_VexReg (bytemode, sizeflag, reg);
16108 }
16109 else
16110 {
16111 /* Output the imm8 directly. */
16112 scratchbuf[0] = '$';
16113 print_operand_value (scratchbuf + 1, 1, vex_imm8 & 0xf);
16114 oappend_maybe_intel (scratchbuf);
16115 scratchbuf[0] = '\0';
16116 codep++;
16117 }
16118 }
16119
16120 static void
16121 OP_Vex_2src (int bytemode, int sizeflag)
16122 {
16123 if (modrm.mod == 3)
16124 {
16125 int reg = modrm.rm;
16126 USED_REX (REX_B);
16127 if (rex & REX_B)
16128 reg += 8;
16129 oappend (names_xmm[reg]);
16130 }
16131 else
16132 {
16133 if (intel_syntax
16134 && (bytemode == v_mode || bytemode == v_swap_mode))
16135 {
16136 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
16137 used_prefixes |= (prefixes & PREFIX_DATA);
16138 }
16139 OP_E (bytemode, sizeflag);
16140 }
16141 }
16142
16143 static void
16144 OP_Vex_2src_1 (int bytemode, int sizeflag)
16145 {
16146 if (modrm.mod == 3)
16147 {
16148 /* Skip mod/rm byte. */
16149 MODRM_CHECK;
16150 codep++;
16151 }
16152
16153 if (vex.w)
16154 {
16155 unsigned int reg = vex.register_specifier;
16156 vex.register_specifier = 0;
16157
16158 if (address_mode != mode_64bit)
16159 reg &= 7;
16160 oappend (names_xmm[reg]);
16161 }
16162 else
16163 OP_Vex_2src (bytemode, sizeflag);
16164 }
16165
16166 static void
16167 OP_Vex_2src_2 (int bytemode, int sizeflag)
16168 {
16169 if (vex.w)
16170 OP_Vex_2src (bytemode, sizeflag);
16171 else
16172 {
16173 unsigned int reg = vex.register_specifier;
16174 vex.register_specifier = 0;
16175
16176 if (address_mode != mode_64bit)
16177 reg &= 7;
16178 oappend (names_xmm[reg]);
16179 }
16180 }
16181
16182 static void
16183 OP_EX_VexW (int bytemode, int sizeflag)
16184 {
16185 int reg = -1;
16186
16187 if (!vex_w_done)
16188 {
16189 /* Skip mod/rm byte. */
16190 MODRM_CHECK;
16191 codep++;
16192
16193 if (vex.w)
16194 reg = get_vex_imm8 (sizeflag, 0) >> 4;
16195 }
16196 else
16197 {
16198 if (!vex.w)
16199 reg = get_vex_imm8 (sizeflag, 1) >> 4;
16200 }
16201
16202 OP_EX_VexReg (bytemode, sizeflag, reg);
16203
16204 if (vex_w_done)
16205 codep++;
16206 vex_w_done = 1;
16207 }
16208
16209 static void
16210 OP_REG_VexI4 (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
16211 {
16212 int reg;
16213 const char **names;
16214
16215 FETCH_DATA (the_info, codep + 1);
16216 reg = *codep++;
16217
16218 if (bytemode != x_mode)
16219 abort ();
16220
16221 reg >>= 4;
16222 if (address_mode != mode_64bit)
16223 reg &= 7;
16224
16225 switch (vex.length)
16226 {
16227 case 128:
16228 names = names_xmm;
16229 break;
16230 case 256:
16231 names = names_ymm;
16232 break;
16233 default:
16234 abort ();
16235 }
16236 oappend (names[reg]);
16237 }
16238
16239 static void
16240 OP_XMM_VexW (int bytemode, int sizeflag)
16241 {
16242 /* Turn off the REX.W bit since it is used for swapping operands
16243 now. */
16244 rex &= ~REX_W;
16245 OP_XMM (bytemode, sizeflag);
16246 }
16247
16248 static void
16249 OP_EX_Vex (int bytemode, int sizeflag)
16250 {
16251 if (modrm.mod != 3)
16252 need_vex_reg = 0;
16253 OP_EX (bytemode, sizeflag);
16254 }
16255
16256 static void
16257 OP_XMM_Vex (int bytemode, int sizeflag)
16258 {
16259 if (modrm.mod != 3)
16260 need_vex_reg = 0;
16261 OP_XMM (bytemode, sizeflag);
16262 }
16263
16264 static struct op vex_cmp_op[] =
16265 {
16266 { STRING_COMMA_LEN ("eq") },
16267 { STRING_COMMA_LEN ("lt") },
16268 { STRING_COMMA_LEN ("le") },
16269 { STRING_COMMA_LEN ("unord") },
16270 { STRING_COMMA_LEN ("neq") },
16271 { STRING_COMMA_LEN ("nlt") },
16272 { STRING_COMMA_LEN ("nle") },
16273 { STRING_COMMA_LEN ("ord") },
16274 { STRING_COMMA_LEN ("eq_uq") },
16275 { STRING_COMMA_LEN ("nge") },
16276 { STRING_COMMA_LEN ("ngt") },
16277 { STRING_COMMA_LEN ("false") },
16278 { STRING_COMMA_LEN ("neq_oq") },
16279 { STRING_COMMA_LEN ("ge") },
16280 { STRING_COMMA_LEN ("gt") },
16281 { STRING_COMMA_LEN ("true") },
16282 { STRING_COMMA_LEN ("eq_os") },
16283 { STRING_COMMA_LEN ("lt_oq") },
16284 { STRING_COMMA_LEN ("le_oq") },
16285 { STRING_COMMA_LEN ("unord_s") },
16286 { STRING_COMMA_LEN ("neq_us") },
16287 { STRING_COMMA_LEN ("nlt_uq") },
16288 { STRING_COMMA_LEN ("nle_uq") },
16289 { STRING_COMMA_LEN ("ord_s") },
16290 { STRING_COMMA_LEN ("eq_us") },
16291 { STRING_COMMA_LEN ("nge_uq") },
16292 { STRING_COMMA_LEN ("ngt_uq") },
16293 { STRING_COMMA_LEN ("false_os") },
16294 { STRING_COMMA_LEN ("neq_os") },
16295 { STRING_COMMA_LEN ("ge_oq") },
16296 { STRING_COMMA_LEN ("gt_oq") },
16297 { STRING_COMMA_LEN ("true_us") },
16298 };
16299
16300 static void
16301 VCMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
16302 {
16303 unsigned int cmp_type;
16304
16305 FETCH_DATA (the_info, codep + 1);
16306 cmp_type = *codep++ & 0xff;
16307 if (cmp_type < ARRAY_SIZE (vex_cmp_op))
16308 {
16309 char suffix [3];
16310 char *p = mnemonicendp - 2;
16311 suffix[0] = p[0];
16312 suffix[1] = p[1];
16313 suffix[2] = '\0';
16314 sprintf (p, "%s%s", vex_cmp_op[cmp_type].name, suffix);
16315 mnemonicendp += vex_cmp_op[cmp_type].len;
16316 }
16317 else
16318 {
16319 /* We have a reserved extension byte. Output it directly. */
16320 scratchbuf[0] = '$';
16321 print_operand_value (scratchbuf + 1, 1, cmp_type);
16322 oappend_maybe_intel (scratchbuf);
16323 scratchbuf[0] = '\0';
16324 }
16325 }
16326
16327 static void
16328 VPCMP_Fixup (int bytemode ATTRIBUTE_UNUSED,
16329 int sizeflag ATTRIBUTE_UNUSED)
16330 {
16331 unsigned int cmp_type;
16332
16333 if (!vex.evex)
16334 abort ();
16335
16336 FETCH_DATA (the_info, codep + 1);
16337 cmp_type = *codep++ & 0xff;
16338 /* There are aliases for immediates 0, 1, 2, 4, 5, 6.
16339 If it's the case, print suffix, otherwise - print the immediate. */
16340 if (cmp_type < ARRAY_SIZE (simd_cmp_op)
16341 && cmp_type != 3
16342 && cmp_type != 7)
16343 {
16344 char suffix [3];
16345 char *p = mnemonicendp - 2;
16346
16347 /* vpcmp* can have both one- and two-lettered suffix. */
16348 if (p[0] == 'p')
16349 {
16350 p++;
16351 suffix[0] = p[0];
16352 suffix[1] = '\0';
16353 }
16354 else
16355 {
16356 suffix[0] = p[0];
16357 suffix[1] = p[1];
16358 suffix[2] = '\0';
16359 }
16360
16361 sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
16362 mnemonicendp += simd_cmp_op[cmp_type].len;
16363 }
16364 else
16365 {
16366 /* We have a reserved extension byte. Output it directly. */
16367 scratchbuf[0] = '$';
16368 print_operand_value (scratchbuf + 1, 1, cmp_type);
16369 oappend_maybe_intel (scratchbuf);
16370 scratchbuf[0] = '\0';
16371 }
16372 }
16373
16374 static const struct op xop_cmp_op[] =
16375 {
16376 { STRING_COMMA_LEN ("lt") },
16377 { STRING_COMMA_LEN ("le") },
16378 { STRING_COMMA_LEN ("gt") },
16379 { STRING_COMMA_LEN ("ge") },
16380 { STRING_COMMA_LEN ("eq") },
16381 { STRING_COMMA_LEN ("neq") },
16382 { STRING_COMMA_LEN ("false") },
16383 { STRING_COMMA_LEN ("true") }
16384 };
16385
16386 static void
16387 VPCOM_Fixup (int bytemode ATTRIBUTE_UNUSED,
16388 int sizeflag ATTRIBUTE_UNUSED)
16389 {
16390 unsigned int cmp_type;
16391
16392 FETCH_DATA (the_info, codep + 1);
16393 cmp_type = *codep++ & 0xff;
16394 if (cmp_type < ARRAY_SIZE (xop_cmp_op))
16395 {
16396 char suffix[3];
16397 char *p = mnemonicendp - 2;
16398
16399 /* vpcom* can have both one- and two-lettered suffix. */
16400 if (p[0] == 'm')
16401 {
16402 p++;
16403 suffix[0] = p[0];
16404 suffix[1] = '\0';
16405 }
16406 else
16407 {
16408 suffix[0] = p[0];
16409 suffix[1] = p[1];
16410 suffix[2] = '\0';
16411 }
16412
16413 sprintf (p, "%s%s", xop_cmp_op[cmp_type].name, suffix);
16414 mnemonicendp += xop_cmp_op[cmp_type].len;
16415 }
16416 else
16417 {
16418 /* We have a reserved extension byte. Output it directly. */
16419 scratchbuf[0] = '$';
16420 print_operand_value (scratchbuf + 1, 1, cmp_type);
16421 oappend_maybe_intel (scratchbuf);
16422 scratchbuf[0] = '\0';
16423 }
16424 }
16425
16426 static const struct op pclmul_op[] =
16427 {
16428 { STRING_COMMA_LEN ("lql") },
16429 { STRING_COMMA_LEN ("hql") },
16430 { STRING_COMMA_LEN ("lqh") },
16431 { STRING_COMMA_LEN ("hqh") }
16432 };
16433
16434 static void
16435 PCLMUL_Fixup (int bytemode ATTRIBUTE_UNUSED,
16436 int sizeflag ATTRIBUTE_UNUSED)
16437 {
16438 unsigned int pclmul_type;
16439
16440 FETCH_DATA (the_info, codep + 1);
16441 pclmul_type = *codep++ & 0xff;
16442 switch (pclmul_type)
16443 {
16444 case 0x10:
16445 pclmul_type = 2;
16446 break;
16447 case 0x11:
16448 pclmul_type = 3;
16449 break;
16450 default:
16451 break;
16452 }
16453 if (pclmul_type < ARRAY_SIZE (pclmul_op))
16454 {
16455 char suffix [4];
16456 char *p = mnemonicendp - 3;
16457 suffix[0] = p[0];
16458 suffix[1] = p[1];
16459 suffix[2] = p[2];
16460 suffix[3] = '\0';
16461 sprintf (p, "%s%s", pclmul_op[pclmul_type].name, suffix);
16462 mnemonicendp += pclmul_op[pclmul_type].len;
16463 }
16464 else
16465 {
16466 /* We have a reserved extension byte. Output it directly. */
16467 scratchbuf[0] = '$';
16468 print_operand_value (scratchbuf + 1, 1, pclmul_type);
16469 oappend_maybe_intel (scratchbuf);
16470 scratchbuf[0] = '\0';
16471 }
16472 }
16473
16474 static void
16475 MOVBE_Fixup (int bytemode, int sizeflag)
16476 {
16477 /* Add proper suffix to "movbe". */
16478 char *p = mnemonicendp;
16479
16480 switch (bytemode)
16481 {
16482 case v_mode:
16483 if (intel_syntax)
16484 goto skip;
16485
16486 USED_REX (REX_W);
16487 if (sizeflag & SUFFIX_ALWAYS)
16488 {
16489 if (rex & REX_W)
16490 *p++ = 'q';
16491 else
16492 {
16493 if (sizeflag & DFLAG)
16494 *p++ = 'l';
16495 else
16496 *p++ = 'w';
16497 used_prefixes |= (prefixes & PREFIX_DATA);
16498 }
16499 }
16500 break;
16501 default:
16502 oappend (INTERNAL_DISASSEMBLER_ERROR);
16503 break;
16504 }
16505 mnemonicendp = p;
16506 *p = '\0';
16507
16508 skip:
16509 OP_M (bytemode, sizeflag);
16510 }
16511
16512 static void
16513 OP_LWPCB_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
16514 {
16515 int reg;
16516 const char **names;
16517
16518 /* Skip mod/rm byte. */
16519 MODRM_CHECK;
16520 codep++;
16521
16522 if (rex & REX_W)
16523 names = names64;
16524 else
16525 names = names32;
16526
16527 reg = modrm.rm;
16528 USED_REX (REX_B);
16529 if (rex & REX_B)
16530 reg += 8;
16531
16532 oappend (names[reg]);
16533 }
16534
16535 static void
16536 OP_LWP_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
16537 {
16538 const char **names;
16539 unsigned int reg = vex.register_specifier;
16540 vex.register_specifier = 0;
16541
16542 if (rex & REX_W)
16543 names = names64;
16544 else
16545 names = names32;
16546
16547 if (address_mode != mode_64bit)
16548 reg &= 7;
16549 oappend (names[reg]);
16550 }
16551
16552 static void
16553 OP_Mask (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
16554 {
16555 if (!vex.evex
16556 || (bytemode != mask_mode && bytemode != mask_bd_mode))
16557 abort ();
16558
16559 USED_REX (REX_R);
16560 if ((rex & REX_R) != 0 || !vex.r)
16561 {
16562 BadOp ();
16563 return;
16564 }
16565
16566 oappend (names_mask [modrm.reg]);
16567 }
16568
16569 static void
16570 OP_Rounding (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
16571 {
16572 if (!vex.evex
16573 || (bytemode != evex_rounding_mode
16574 && bytemode != evex_rounding_64_mode
16575 && bytemode != evex_sae_mode))
16576 abort ();
16577 if (modrm.mod == 3 && vex.b)
16578 switch (bytemode)
16579 {
16580 case evex_rounding_64_mode:
16581 if (address_mode != mode_64bit)
16582 {
16583 oappend ("(bad)");
16584 break;
16585 }
16586 /* Fall through. */
16587 case evex_rounding_mode:
16588 oappend (names_rounding[vex.ll]);
16589 break;
16590 case evex_sae_mode:
16591 oappend ("{sae}");
16592 break;
16593 default:
16594 break;
16595 }
16596 }
This page took 0.386972 seconds and 5 git commands to generate.