Implement RDRSEED, ADX and PRFCHW instructions
[binutils-gdb.git] / opcodes / i386-dis.c
1 /* Print i386 instructions for GDB, the GNU debugger.
2 Copyright 1988, 1989, 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
4 Free Software Foundation, Inc.
5
6 This file is part of the GNU opcodes library.
7
8 This library is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3, or (at your option)
11 any later version.
12
13 It is distributed in the hope that it will be useful, but WITHOUT
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
16 License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21 MA 02110-1301, USA. */
22
23
24 /* 80386 instruction printer by Pace Willisson (pace@prep.ai.mit.edu)
25 July 1988
26 modified by John Hassey (hassey@dg-rtp.dg.com)
27 x86-64 support added by Jan Hubicka (jh@suse.cz)
28 VIA PadLock support by Michal Ludvig (mludvig@suse.cz). */
29
30 /* The main tables describing the instructions is essentially a copy
31 of the "Opcode Map" chapter (Appendix A) of the Intel 80386
32 Programmers Manual. Usually, there is a capital letter, followed
33 by a small letter. The capital letter tell the addressing mode,
34 and the small letter tells about the operand size. Refer to
35 the Intel manual for details. */
36
37 #include "sysdep.h"
38 #include "dis-asm.h"
39 #include "opintl.h"
40 #include "opcode/i386.h"
41 #include "libiberty.h"
42
43 #include <setjmp.h>
44
45 static int print_insn (bfd_vma, disassemble_info *);
46 static void dofloat (int);
47 static void OP_ST (int, int);
48 static void OP_STi (int, int);
49 static int putop (const char *, int);
50 static void oappend (const char *);
51 static void append_seg (void);
52 static void OP_indirE (int, int);
53 static void print_operand_value (char *, int, bfd_vma);
54 static void OP_E_register (int, int);
55 static void OP_E_memory (int, int);
56 static void print_displacement (char *, bfd_vma);
57 static void OP_E (int, int);
58 static void OP_G (int, int);
59 static bfd_vma get64 (void);
60 static bfd_signed_vma get32 (void);
61 static bfd_signed_vma get32s (void);
62 static int get16 (void);
63 static void set_op (bfd_vma, int);
64 static void OP_Skip_MODRM (int, int);
65 static void OP_REG (int, int);
66 static void OP_IMREG (int, int);
67 static void OP_I (int, int);
68 static void OP_I64 (int, int);
69 static void OP_sI (int, int);
70 static void OP_J (int, int);
71 static void OP_SEG (int, int);
72 static void OP_DIR (int, int);
73 static void OP_OFF (int, int);
74 static void OP_OFF64 (int, int);
75 static void ptr_reg (int, int);
76 static void OP_ESreg (int, int);
77 static void OP_DSreg (int, int);
78 static void OP_C (int, int);
79 static void OP_D (int, int);
80 static void OP_T (int, int);
81 static void OP_R (int, int);
82 static void OP_MMX (int, int);
83 static void OP_XMM (int, int);
84 static void OP_EM (int, int);
85 static void OP_EX (int, int);
86 static void OP_EMC (int,int);
87 static void OP_MXC (int,int);
88 static void OP_MS (int, int);
89 static void OP_XS (int, int);
90 static void OP_M (int, int);
91 static void OP_VEX (int, int);
92 static void OP_EX_Vex (int, int);
93 static void OP_EX_VexW (int, int);
94 static void OP_EX_VexImmW (int, int);
95 static void OP_XMM_Vex (int, int);
96 static void OP_XMM_VexW (int, int);
97 static void OP_REG_VexI4 (int, int);
98 static void PCLMUL_Fixup (int, int);
99 static void VEXI4_Fixup (int, int);
100 static void VZERO_Fixup (int, int);
101 static void VCMP_Fixup (int, int);
102 static void OP_0f07 (int, int);
103 static void OP_Monitor (int, int);
104 static void OP_Mwait (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 HLE_Fixup1 (int, int);
112 static void HLE_Fixup2 (int, int);
113 static void HLE_Fixup3 (int, int);
114 static void CMPXCHG8B_Fixup (int, int);
115 static void XMM_Fixup (int, int);
116 static void CRC32_Fixup (int, int);
117 static void FXSAVE_Fixup (int, int);
118 static void OP_LWPCB_E (int, int);
119 static void OP_LWP_E (int, int);
120 static void OP_Vex_2src_1 (int, int);
121 static void OP_Vex_2src_2 (int, int);
122
123 static void MOVBE_Fixup (int, int);
124
125 struct dis_private {
126 /* Points to first byte not fetched. */
127 bfd_byte *max_fetched;
128 bfd_byte the_buffer[MAX_MNEM_SIZE];
129 bfd_vma insn_start;
130 int orig_sizeflag;
131 jmp_buf bailout;
132 };
133
134 enum address_mode
135 {
136 mode_16bit,
137 mode_32bit,
138 mode_64bit
139 };
140
141 enum address_mode address_mode;
142
143 /* Flags for the prefixes for the current instruction. See below. */
144 static int prefixes;
145
146 /* REX prefix the current instruction. See below. */
147 static int rex;
148 /* Bits of REX we've already used. */
149 static int rex_used;
150 /* REX bits in original REX prefix ignored. */
151 static int rex_ignored;
152 /* Mark parts used in the REX prefix. When we are testing for
153 empty prefix (for 8bit register REX extension), just mask it
154 out. Otherwise test for REX bit is excuse for existence of REX
155 only in case value is nonzero. */
156 #define USED_REX(value) \
157 { \
158 if (value) \
159 { \
160 if ((rex & value)) \
161 rex_used |= (value) | REX_OPCODE; \
162 } \
163 else \
164 rex_used |= REX_OPCODE; \
165 }
166
167 /* Flags for prefixes which we somehow handled when printing the
168 current instruction. */
169 static int used_prefixes;
170
171 /* Flags stored in PREFIXES. */
172 #define PREFIX_REPZ 1
173 #define PREFIX_REPNZ 2
174 #define PREFIX_LOCK 4
175 #define PREFIX_CS 8
176 #define PREFIX_SS 0x10
177 #define PREFIX_DS 0x20
178 #define PREFIX_ES 0x40
179 #define PREFIX_FS 0x80
180 #define PREFIX_GS 0x100
181 #define PREFIX_DATA 0x200
182 #define PREFIX_ADDR 0x400
183 #define PREFIX_FWAIT 0x800
184
185 /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
186 to ADDR (exclusive) are valid. Returns 1 for success, longjmps
187 on error. */
188 #define FETCH_DATA(info, addr) \
189 ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \
190 ? 1 : fetch_data ((info), (addr)))
191
192 static int
193 fetch_data (struct disassemble_info *info, bfd_byte *addr)
194 {
195 int status;
196 struct dis_private *priv = (struct dis_private *) info->private_data;
197 bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer);
198
199 if (addr <= priv->the_buffer + MAX_MNEM_SIZE)
200 status = (*info->read_memory_func) (start,
201 priv->max_fetched,
202 addr - priv->max_fetched,
203 info);
204 else
205 status = -1;
206 if (status != 0)
207 {
208 /* If we did manage to read at least one byte, then
209 print_insn_i386 will do something sensible. Otherwise, print
210 an error. We do that here because this is where we know
211 STATUS. */
212 if (priv->max_fetched == priv->the_buffer)
213 (*info->memory_error_func) (status, start, info);
214 longjmp (priv->bailout, 1);
215 }
216 else
217 priv->max_fetched = addr;
218 return 1;
219 }
220
221 #define XX { NULL, 0 }
222 #define Bad_Opcode NULL, { { NULL, 0 } }
223
224 #define Eb { OP_E, b_mode }
225 #define EbS { OP_E, b_swap_mode }
226 #define Ev { OP_E, v_mode }
227 #define EvS { OP_E, v_swap_mode }
228 #define Ed { OP_E, d_mode }
229 #define Edq { OP_E, dq_mode }
230 #define Edqw { OP_E, dqw_mode }
231 #define Edqb { OP_E, dqb_mode }
232 #define Edqd { OP_E, dqd_mode }
233 #define Eq { OP_E, q_mode }
234 #define indirEv { OP_indirE, stack_v_mode }
235 #define indirEp { OP_indirE, f_mode }
236 #define stackEv { OP_E, stack_v_mode }
237 #define Em { OP_E, m_mode }
238 #define Ew { OP_E, w_mode }
239 #define M { OP_M, 0 } /* lea, lgdt, etc. */
240 #define Ma { OP_M, a_mode }
241 #define Mb { OP_M, b_mode }
242 #define Md { OP_M, d_mode }
243 #define Mo { OP_M, o_mode }
244 #define Mp { OP_M, f_mode } /* 32 or 48 bit memory operand for LDS, LES etc */
245 #define Mq { OP_M, q_mode }
246 #define Mx { OP_M, x_mode }
247 #define Mxmm { OP_M, xmm_mode }
248 #define Gb { OP_G, b_mode }
249 #define Gv { OP_G, v_mode }
250 #define Gd { OP_G, d_mode }
251 #define Gdq { OP_G, dq_mode }
252 #define Gm { OP_G, m_mode }
253 #define Gw { OP_G, w_mode }
254 #define Rd { OP_R, d_mode }
255 #define Rm { OP_R, m_mode }
256 #define Ib { OP_I, b_mode }
257 #define sIb { OP_sI, b_mode } /* sign extened byte */
258 #define sIbT { OP_sI, b_T_mode } /* sign extened byte like 'T' */
259 #define Iv { OP_I, v_mode }
260 #define sIv { OP_sI, v_mode }
261 #define Iq { OP_I, q_mode }
262 #define Iv64 { OP_I64, v_mode }
263 #define Iw { OP_I, w_mode }
264 #define I1 { OP_I, const_1_mode }
265 #define Jb { OP_J, b_mode }
266 #define Jv { OP_J, v_mode }
267 #define Cm { OP_C, m_mode }
268 #define Dm { OP_D, m_mode }
269 #define Td { OP_T, d_mode }
270 #define Skip_MODRM { OP_Skip_MODRM, 0 }
271
272 #define RMeAX { OP_REG, eAX_reg }
273 #define RMeBX { OP_REG, eBX_reg }
274 #define RMeCX { OP_REG, eCX_reg }
275 #define RMeDX { OP_REG, eDX_reg }
276 #define RMeSP { OP_REG, eSP_reg }
277 #define RMeBP { OP_REG, eBP_reg }
278 #define RMeSI { OP_REG, eSI_reg }
279 #define RMeDI { OP_REG, eDI_reg }
280 #define RMrAX { OP_REG, rAX_reg }
281 #define RMrBX { OP_REG, rBX_reg }
282 #define RMrCX { OP_REG, rCX_reg }
283 #define RMrDX { OP_REG, rDX_reg }
284 #define RMrSP { OP_REG, rSP_reg }
285 #define RMrBP { OP_REG, rBP_reg }
286 #define RMrSI { OP_REG, rSI_reg }
287 #define RMrDI { OP_REG, rDI_reg }
288 #define RMAL { OP_REG, al_reg }
289 #define RMCL { OP_REG, cl_reg }
290 #define RMDL { OP_REG, dl_reg }
291 #define RMBL { OP_REG, bl_reg }
292 #define RMAH { OP_REG, ah_reg }
293 #define RMCH { OP_REG, ch_reg }
294 #define RMDH { OP_REG, dh_reg }
295 #define RMBH { OP_REG, bh_reg }
296 #define RMAX { OP_REG, ax_reg }
297 #define RMDX { OP_REG, dx_reg }
298
299 #define eAX { OP_IMREG, eAX_reg }
300 #define eBX { OP_IMREG, eBX_reg }
301 #define eCX { OP_IMREG, eCX_reg }
302 #define eDX { OP_IMREG, eDX_reg }
303 #define eSP { OP_IMREG, eSP_reg }
304 #define eBP { OP_IMREG, eBP_reg }
305 #define eSI { OP_IMREG, eSI_reg }
306 #define eDI { OP_IMREG, eDI_reg }
307 #define AL { OP_IMREG, al_reg }
308 #define CL { OP_IMREG, cl_reg }
309 #define DL { OP_IMREG, dl_reg }
310 #define BL { OP_IMREG, bl_reg }
311 #define AH { OP_IMREG, ah_reg }
312 #define CH { OP_IMREG, ch_reg }
313 #define DH { OP_IMREG, dh_reg }
314 #define BH { OP_IMREG, bh_reg }
315 #define AX { OP_IMREG, ax_reg }
316 #define DX { OP_IMREG, dx_reg }
317 #define zAX { OP_IMREG, z_mode_ax_reg }
318 #define indirDX { OP_IMREG, indir_dx_reg }
319
320 #define Sw { OP_SEG, w_mode }
321 #define Sv { OP_SEG, v_mode }
322 #define Ap { OP_DIR, 0 }
323 #define Ob { OP_OFF64, b_mode }
324 #define Ov { OP_OFF64, v_mode }
325 #define Xb { OP_DSreg, eSI_reg }
326 #define Xv { OP_DSreg, eSI_reg }
327 #define Xz { OP_DSreg, eSI_reg }
328 #define Yb { OP_ESreg, eDI_reg }
329 #define Yv { OP_ESreg, eDI_reg }
330 #define DSBX { OP_DSreg, eBX_reg }
331
332 #define es { OP_REG, es_reg }
333 #define ss { OP_REG, ss_reg }
334 #define cs { OP_REG, cs_reg }
335 #define ds { OP_REG, ds_reg }
336 #define fs { OP_REG, fs_reg }
337 #define gs { OP_REG, gs_reg }
338
339 #define MX { OP_MMX, 0 }
340 #define XM { OP_XMM, 0 }
341 #define XMScalar { OP_XMM, scalar_mode }
342 #define XMGatherQ { OP_XMM, vex_vsib_q_w_dq_mode }
343 #define XMM { OP_XMM, xmm_mode }
344 #define EM { OP_EM, v_mode }
345 #define EMS { OP_EM, v_swap_mode }
346 #define EMd { OP_EM, d_mode }
347 #define EMx { OP_EM, x_mode }
348 #define EXw { OP_EX, w_mode }
349 #define EXd { OP_EX, d_mode }
350 #define EXdScalar { OP_EX, d_scalar_mode }
351 #define EXdS { OP_EX, d_swap_mode }
352 #define EXq { OP_EX, q_mode }
353 #define EXqScalar { OP_EX, q_scalar_mode }
354 #define EXqScalarS { OP_EX, q_scalar_swap_mode }
355 #define EXqS { OP_EX, q_swap_mode }
356 #define EXx { OP_EX, x_mode }
357 #define EXxS { OP_EX, x_swap_mode }
358 #define EXxmm { OP_EX, xmm_mode }
359 #define EXxmmq { OP_EX, xmmq_mode }
360 #define EXxmm_mb { OP_EX, xmm_mb_mode }
361 #define EXxmm_mw { OP_EX, xmm_mw_mode }
362 #define EXxmm_md { OP_EX, xmm_md_mode }
363 #define EXxmm_mq { OP_EX, xmm_mq_mode }
364 #define EXxmmdw { OP_EX, xmmdw_mode }
365 #define EXxmmqd { OP_EX, xmmqd_mode }
366 #define EXymmq { OP_EX, ymmq_mode }
367 #define EXVexWdq { OP_EX, vex_w_dq_mode }
368 #define EXVexWdqScalar { OP_EX, vex_scalar_w_dq_mode }
369 #define MS { OP_MS, v_mode }
370 #define XS { OP_XS, v_mode }
371 #define EMCq { OP_EMC, q_mode }
372 #define MXC { OP_MXC, 0 }
373 #define OPSUF { OP_3DNowSuffix, 0 }
374 #define CMP { CMP_Fixup, 0 }
375 #define XMM0 { XMM_Fixup, 0 }
376 #define FXSAVE { FXSAVE_Fixup, 0 }
377 #define Vex_2src_1 { OP_Vex_2src_1, 0 }
378 #define Vex_2src_2 { OP_Vex_2src_2, 0 }
379
380 #define Vex { OP_VEX, vex_mode }
381 #define VexScalar { OP_VEX, vex_scalar_mode }
382 #define VexGatherQ { OP_VEX, vex_vsib_q_w_dq_mode }
383 #define Vex128 { OP_VEX, vex128_mode }
384 #define Vex256 { OP_VEX, vex256_mode }
385 #define VexGdq { OP_VEX, dq_mode }
386 #define VexI4 { VEXI4_Fixup, 0}
387 #define EXdVex { OP_EX_Vex, d_mode }
388 #define EXdVexS { OP_EX_Vex, d_swap_mode }
389 #define EXdVexScalarS { OP_EX_Vex, d_scalar_swap_mode }
390 #define EXqVex { OP_EX_Vex, q_mode }
391 #define EXqVexS { OP_EX_Vex, q_swap_mode }
392 #define EXqVexScalarS { OP_EX_Vex, q_scalar_swap_mode }
393 #define EXVexW { OP_EX_VexW, x_mode }
394 #define EXdVexW { OP_EX_VexW, d_mode }
395 #define EXqVexW { OP_EX_VexW, q_mode }
396 #define EXVexImmW { OP_EX_VexImmW, x_mode }
397 #define XMVex { OP_XMM_Vex, 0 }
398 #define XMVexScalar { OP_XMM_Vex, scalar_mode }
399 #define XMVexW { OP_XMM_VexW, 0 }
400 #define XMVexI4 { OP_REG_VexI4, x_mode }
401 #define PCLMUL { PCLMUL_Fixup, 0 }
402 #define VZERO { VZERO_Fixup, 0 }
403 #define VCMP { VCMP_Fixup, 0 }
404
405 #define MVexVSIBDWpX { OP_M, vex_vsib_d_w_dq_mode }
406 #define MVexVSIBQWpX { OP_M, vex_vsib_q_w_dq_mode }
407
408 /* Used handle "rep" prefix for string instructions. */
409 #define Xbr { REP_Fixup, eSI_reg }
410 #define Xvr { REP_Fixup, eSI_reg }
411 #define Ybr { REP_Fixup, eDI_reg }
412 #define Yvr { REP_Fixup, eDI_reg }
413 #define Yzr { REP_Fixup, eDI_reg }
414 #define indirDXr { REP_Fixup, indir_dx_reg }
415 #define ALr { REP_Fixup, al_reg }
416 #define eAXr { REP_Fixup, eAX_reg }
417
418 /* Used handle HLE prefix for lockable instructions. */
419 #define Ebh1 { HLE_Fixup1, b_mode }
420 #define Evh1 { HLE_Fixup1, v_mode }
421 #define Ebh2 { HLE_Fixup2, b_mode }
422 #define Evh2 { HLE_Fixup2, v_mode }
423 #define Ebh3 { HLE_Fixup3, b_mode }
424 #define Evh3 { HLE_Fixup3, v_mode }
425
426 #define cond_jump_flag { NULL, cond_jump_mode }
427 #define loop_jcxz_flag { NULL, loop_jcxz_mode }
428
429 /* bits in sizeflag */
430 #define SUFFIX_ALWAYS 4
431 #define AFLAG 2
432 #define DFLAG 1
433
434 enum
435 {
436 /* byte operand */
437 b_mode = 1,
438 /* byte operand with operand swapped */
439 b_swap_mode,
440 /* byte operand, sign extend like 'T' suffix */
441 b_T_mode,
442 /* operand size depends on prefixes */
443 v_mode,
444 /* operand size depends on prefixes with operand swapped */
445 v_swap_mode,
446 /* word operand */
447 w_mode,
448 /* double word operand */
449 d_mode,
450 /* double word operand with operand swapped */
451 d_swap_mode,
452 /* quad word operand */
453 q_mode,
454 /* quad word operand with operand swapped */
455 q_swap_mode,
456 /* ten-byte operand */
457 t_mode,
458 /* 16-byte XMM or 32-byte YMM operand */
459 x_mode,
460 /* 16-byte XMM or 32-byte YMM operand with operand swapped */
461 x_swap_mode,
462 /* 16-byte XMM operand */
463 xmm_mode,
464 /* 16-byte XMM or quad word operand */
465 xmmq_mode,
466 /* XMM register or byte memory operand */
467 xmm_mb_mode,
468 /* XMM register or word memory operand */
469 xmm_mw_mode,
470 /* XMM register or double word memory operand */
471 xmm_md_mode,
472 /* XMM register or quad word memory operand */
473 xmm_mq_mode,
474 /* 16-byte XMM, word or double word operand */
475 xmmdw_mode,
476 /* 16-byte XMM, double word or quad word operand */
477 xmmqd_mode,
478 /* 32-byte YMM or quad word operand */
479 ymmq_mode,
480 /* 32-byte YMM or 16-byte word operand */
481 ymmxmm_mode,
482 /* d_mode in 32bit, q_mode in 64bit mode. */
483 m_mode,
484 /* pair of v_mode operands */
485 a_mode,
486 cond_jump_mode,
487 loop_jcxz_mode,
488 /* operand size depends on REX prefixes. */
489 dq_mode,
490 /* registers like dq_mode, memory like w_mode. */
491 dqw_mode,
492 /* 4- or 6-byte pointer operand */
493 f_mode,
494 const_1_mode,
495 /* v_mode for stack-related opcodes. */
496 stack_v_mode,
497 /* non-quad operand size depends on prefixes */
498 z_mode,
499 /* 16-byte operand */
500 o_mode,
501 /* registers like dq_mode, memory like b_mode. */
502 dqb_mode,
503 /* registers like dq_mode, memory like d_mode. */
504 dqd_mode,
505 /* normal vex mode */
506 vex_mode,
507 /* 128bit vex mode */
508 vex128_mode,
509 /* 256bit vex mode */
510 vex256_mode,
511 /* operand size depends on the VEX.W bit. */
512 vex_w_dq_mode,
513
514 /* Similar to vex_w_dq_mode, with VSIB dword indices. */
515 vex_vsib_d_w_dq_mode,
516 /* Similar to vex_w_dq_mode, with VSIB qword indices. */
517 vex_vsib_q_w_dq_mode,
518
519 /* scalar, ignore vector length. */
520 scalar_mode,
521 /* like d_mode, ignore vector length. */
522 d_scalar_mode,
523 /* like d_swap_mode, ignore vector length. */
524 d_scalar_swap_mode,
525 /* like q_mode, ignore vector length. */
526 q_scalar_mode,
527 /* like q_swap_mode, ignore vector length. */
528 q_scalar_swap_mode,
529 /* like vex_mode, ignore vector length. */
530 vex_scalar_mode,
531 /* like vex_w_dq_mode, ignore vector length. */
532 vex_scalar_w_dq_mode,
533
534 es_reg,
535 cs_reg,
536 ss_reg,
537 ds_reg,
538 fs_reg,
539 gs_reg,
540
541 eAX_reg,
542 eCX_reg,
543 eDX_reg,
544 eBX_reg,
545 eSP_reg,
546 eBP_reg,
547 eSI_reg,
548 eDI_reg,
549
550 al_reg,
551 cl_reg,
552 dl_reg,
553 bl_reg,
554 ah_reg,
555 ch_reg,
556 dh_reg,
557 bh_reg,
558
559 ax_reg,
560 cx_reg,
561 dx_reg,
562 bx_reg,
563 sp_reg,
564 bp_reg,
565 si_reg,
566 di_reg,
567
568 rAX_reg,
569 rCX_reg,
570 rDX_reg,
571 rBX_reg,
572 rSP_reg,
573 rBP_reg,
574 rSI_reg,
575 rDI_reg,
576
577 z_mode_ax_reg,
578 indir_dx_reg
579 };
580
581 enum
582 {
583 FLOATCODE = 1,
584 USE_REG_TABLE,
585 USE_MOD_TABLE,
586 USE_RM_TABLE,
587 USE_PREFIX_TABLE,
588 USE_X86_64_TABLE,
589 USE_3BYTE_TABLE,
590 USE_XOP_8F_TABLE,
591 USE_VEX_C4_TABLE,
592 USE_VEX_C5_TABLE,
593 USE_VEX_LEN_TABLE,
594 USE_VEX_W_TABLE
595 };
596
597 #define FLOAT NULL, { { NULL, FLOATCODE } }
598
599 #define DIS386(T, I) NULL, { { NULL, (T)}, { NULL, (I) } }
600 #define REG_TABLE(I) DIS386 (USE_REG_TABLE, (I))
601 #define MOD_TABLE(I) DIS386 (USE_MOD_TABLE, (I))
602 #define RM_TABLE(I) DIS386 (USE_RM_TABLE, (I))
603 #define PREFIX_TABLE(I) DIS386 (USE_PREFIX_TABLE, (I))
604 #define X86_64_TABLE(I) DIS386 (USE_X86_64_TABLE, (I))
605 #define THREE_BYTE_TABLE(I) DIS386 (USE_3BYTE_TABLE, (I))
606 #define XOP_8F_TABLE(I) DIS386 (USE_XOP_8F_TABLE, (I))
607 #define VEX_C4_TABLE(I) DIS386 (USE_VEX_C4_TABLE, (I))
608 #define VEX_C5_TABLE(I) DIS386 (USE_VEX_C5_TABLE, (I))
609 #define VEX_LEN_TABLE(I) DIS386 (USE_VEX_LEN_TABLE, (I))
610 #define VEX_W_TABLE(I) DIS386 (USE_VEX_W_TABLE, (I))
611
612 enum
613 {
614 REG_80 = 0,
615 REG_81,
616 REG_82,
617 REG_8F,
618 REG_C0,
619 REG_C1,
620 REG_C6,
621 REG_C7,
622 REG_D0,
623 REG_D1,
624 REG_D2,
625 REG_D3,
626 REG_F6,
627 REG_F7,
628 REG_FE,
629 REG_FF,
630 REG_0F00,
631 REG_0F01,
632 REG_0F0D,
633 REG_0F18,
634 REG_0F71,
635 REG_0F72,
636 REG_0F73,
637 REG_0FA6,
638 REG_0FA7,
639 REG_0FAE,
640 REG_0FBA,
641 REG_0FC7,
642 REG_VEX_0F71,
643 REG_VEX_0F72,
644 REG_VEX_0F73,
645 REG_VEX_0FAE,
646 REG_VEX_0F38F3,
647 REG_XOP_LWPCB,
648 REG_XOP_LWP,
649 REG_XOP_TBM_01,
650 REG_XOP_TBM_02
651 };
652
653 enum
654 {
655 MOD_8D = 0,
656 MOD_C6_REG_7,
657 MOD_C7_REG_7,
658 MOD_0F01_REG_0,
659 MOD_0F01_REG_1,
660 MOD_0F01_REG_2,
661 MOD_0F01_REG_3,
662 MOD_0F01_REG_7,
663 MOD_0F12_PREFIX_0,
664 MOD_0F13,
665 MOD_0F16_PREFIX_0,
666 MOD_0F17,
667 MOD_0F18_REG_0,
668 MOD_0F18_REG_1,
669 MOD_0F18_REG_2,
670 MOD_0F18_REG_3,
671 MOD_0F20,
672 MOD_0F21,
673 MOD_0F22,
674 MOD_0F23,
675 MOD_0F24,
676 MOD_0F26,
677 MOD_0F2B_PREFIX_0,
678 MOD_0F2B_PREFIX_1,
679 MOD_0F2B_PREFIX_2,
680 MOD_0F2B_PREFIX_3,
681 MOD_0F51,
682 MOD_0F71_REG_2,
683 MOD_0F71_REG_4,
684 MOD_0F71_REG_6,
685 MOD_0F72_REG_2,
686 MOD_0F72_REG_4,
687 MOD_0F72_REG_6,
688 MOD_0F73_REG_2,
689 MOD_0F73_REG_3,
690 MOD_0F73_REG_6,
691 MOD_0F73_REG_7,
692 MOD_0FAE_REG_0,
693 MOD_0FAE_REG_1,
694 MOD_0FAE_REG_2,
695 MOD_0FAE_REG_3,
696 MOD_0FAE_REG_4,
697 MOD_0FAE_REG_5,
698 MOD_0FAE_REG_6,
699 MOD_0FAE_REG_7,
700 MOD_0FB2,
701 MOD_0FB4,
702 MOD_0FB5,
703 MOD_0FC7_REG_6,
704 MOD_0FC7_REG_7,
705 MOD_0FD7,
706 MOD_0FE7_PREFIX_2,
707 MOD_0FF0_PREFIX_3,
708 MOD_0F382A_PREFIX_2,
709 MOD_62_32BIT,
710 MOD_C4_32BIT,
711 MOD_C5_32BIT,
712 MOD_VEX_0F12_PREFIX_0,
713 MOD_VEX_0F13,
714 MOD_VEX_0F16_PREFIX_0,
715 MOD_VEX_0F17,
716 MOD_VEX_0F2B,
717 MOD_VEX_0F50,
718 MOD_VEX_0F71_REG_2,
719 MOD_VEX_0F71_REG_4,
720 MOD_VEX_0F71_REG_6,
721 MOD_VEX_0F72_REG_2,
722 MOD_VEX_0F72_REG_4,
723 MOD_VEX_0F72_REG_6,
724 MOD_VEX_0F73_REG_2,
725 MOD_VEX_0F73_REG_3,
726 MOD_VEX_0F73_REG_6,
727 MOD_VEX_0F73_REG_7,
728 MOD_VEX_0FAE_REG_2,
729 MOD_VEX_0FAE_REG_3,
730 MOD_VEX_0FD7_PREFIX_2,
731 MOD_VEX_0FE7_PREFIX_2,
732 MOD_VEX_0FF0_PREFIX_3,
733 MOD_VEX_0F381A_PREFIX_2,
734 MOD_VEX_0F382A_PREFIX_2,
735 MOD_VEX_0F382C_PREFIX_2,
736 MOD_VEX_0F382D_PREFIX_2,
737 MOD_VEX_0F382E_PREFIX_2,
738 MOD_VEX_0F382F_PREFIX_2,
739 MOD_VEX_0F385A_PREFIX_2,
740 MOD_VEX_0F388C_PREFIX_2,
741 MOD_VEX_0F388E_PREFIX_2,
742 };
743
744 enum
745 {
746 RM_C6_REG_7 = 0,
747 RM_C7_REG_7,
748 RM_0F01_REG_0,
749 RM_0F01_REG_1,
750 RM_0F01_REG_2,
751 RM_0F01_REG_3,
752 RM_0F01_REG_7,
753 RM_0FAE_REG_5,
754 RM_0FAE_REG_6,
755 RM_0FAE_REG_7
756 };
757
758 enum
759 {
760 PREFIX_90 = 0,
761 PREFIX_0F10,
762 PREFIX_0F11,
763 PREFIX_0F12,
764 PREFIX_0F16,
765 PREFIX_0F2A,
766 PREFIX_0F2B,
767 PREFIX_0F2C,
768 PREFIX_0F2D,
769 PREFIX_0F2E,
770 PREFIX_0F2F,
771 PREFIX_0F51,
772 PREFIX_0F52,
773 PREFIX_0F53,
774 PREFIX_0F58,
775 PREFIX_0F59,
776 PREFIX_0F5A,
777 PREFIX_0F5B,
778 PREFIX_0F5C,
779 PREFIX_0F5D,
780 PREFIX_0F5E,
781 PREFIX_0F5F,
782 PREFIX_0F60,
783 PREFIX_0F61,
784 PREFIX_0F62,
785 PREFIX_0F6C,
786 PREFIX_0F6D,
787 PREFIX_0F6F,
788 PREFIX_0F70,
789 PREFIX_0F73_REG_3,
790 PREFIX_0F73_REG_7,
791 PREFIX_0F78,
792 PREFIX_0F79,
793 PREFIX_0F7C,
794 PREFIX_0F7D,
795 PREFIX_0F7E,
796 PREFIX_0F7F,
797 PREFIX_0FAE_REG_0,
798 PREFIX_0FAE_REG_1,
799 PREFIX_0FAE_REG_2,
800 PREFIX_0FAE_REG_3,
801 PREFIX_0FB8,
802 PREFIX_0FBC,
803 PREFIX_0FBD,
804 PREFIX_0FC2,
805 PREFIX_0FC3,
806 PREFIX_0FC7_REG_6,
807 PREFIX_0FD0,
808 PREFIX_0FD6,
809 PREFIX_0FE6,
810 PREFIX_0FE7,
811 PREFIX_0FF0,
812 PREFIX_0FF7,
813 PREFIX_0F3810,
814 PREFIX_0F3814,
815 PREFIX_0F3815,
816 PREFIX_0F3817,
817 PREFIX_0F3820,
818 PREFIX_0F3821,
819 PREFIX_0F3822,
820 PREFIX_0F3823,
821 PREFIX_0F3824,
822 PREFIX_0F3825,
823 PREFIX_0F3828,
824 PREFIX_0F3829,
825 PREFIX_0F382A,
826 PREFIX_0F382B,
827 PREFIX_0F3830,
828 PREFIX_0F3831,
829 PREFIX_0F3832,
830 PREFIX_0F3833,
831 PREFIX_0F3834,
832 PREFIX_0F3835,
833 PREFIX_0F3837,
834 PREFIX_0F3838,
835 PREFIX_0F3839,
836 PREFIX_0F383A,
837 PREFIX_0F383B,
838 PREFIX_0F383C,
839 PREFIX_0F383D,
840 PREFIX_0F383E,
841 PREFIX_0F383F,
842 PREFIX_0F3840,
843 PREFIX_0F3841,
844 PREFIX_0F3880,
845 PREFIX_0F3881,
846 PREFIX_0F3882,
847 PREFIX_0F38DB,
848 PREFIX_0F38DC,
849 PREFIX_0F38DD,
850 PREFIX_0F38DE,
851 PREFIX_0F38DF,
852 PREFIX_0F38F0,
853 PREFIX_0F38F1,
854 PREFIX_0F38F6,
855 PREFIX_0F3A08,
856 PREFIX_0F3A09,
857 PREFIX_0F3A0A,
858 PREFIX_0F3A0B,
859 PREFIX_0F3A0C,
860 PREFIX_0F3A0D,
861 PREFIX_0F3A0E,
862 PREFIX_0F3A14,
863 PREFIX_0F3A15,
864 PREFIX_0F3A16,
865 PREFIX_0F3A17,
866 PREFIX_0F3A20,
867 PREFIX_0F3A21,
868 PREFIX_0F3A22,
869 PREFIX_0F3A40,
870 PREFIX_0F3A41,
871 PREFIX_0F3A42,
872 PREFIX_0F3A44,
873 PREFIX_0F3A60,
874 PREFIX_0F3A61,
875 PREFIX_0F3A62,
876 PREFIX_0F3A63,
877 PREFIX_0F3ADF,
878 PREFIX_VEX_0F10,
879 PREFIX_VEX_0F11,
880 PREFIX_VEX_0F12,
881 PREFIX_VEX_0F16,
882 PREFIX_VEX_0F2A,
883 PREFIX_VEX_0F2C,
884 PREFIX_VEX_0F2D,
885 PREFIX_VEX_0F2E,
886 PREFIX_VEX_0F2F,
887 PREFIX_VEX_0F51,
888 PREFIX_VEX_0F52,
889 PREFIX_VEX_0F53,
890 PREFIX_VEX_0F58,
891 PREFIX_VEX_0F59,
892 PREFIX_VEX_0F5A,
893 PREFIX_VEX_0F5B,
894 PREFIX_VEX_0F5C,
895 PREFIX_VEX_0F5D,
896 PREFIX_VEX_0F5E,
897 PREFIX_VEX_0F5F,
898 PREFIX_VEX_0F60,
899 PREFIX_VEX_0F61,
900 PREFIX_VEX_0F62,
901 PREFIX_VEX_0F63,
902 PREFIX_VEX_0F64,
903 PREFIX_VEX_0F65,
904 PREFIX_VEX_0F66,
905 PREFIX_VEX_0F67,
906 PREFIX_VEX_0F68,
907 PREFIX_VEX_0F69,
908 PREFIX_VEX_0F6A,
909 PREFIX_VEX_0F6B,
910 PREFIX_VEX_0F6C,
911 PREFIX_VEX_0F6D,
912 PREFIX_VEX_0F6E,
913 PREFIX_VEX_0F6F,
914 PREFIX_VEX_0F70,
915 PREFIX_VEX_0F71_REG_2,
916 PREFIX_VEX_0F71_REG_4,
917 PREFIX_VEX_0F71_REG_6,
918 PREFIX_VEX_0F72_REG_2,
919 PREFIX_VEX_0F72_REG_4,
920 PREFIX_VEX_0F72_REG_6,
921 PREFIX_VEX_0F73_REG_2,
922 PREFIX_VEX_0F73_REG_3,
923 PREFIX_VEX_0F73_REG_6,
924 PREFIX_VEX_0F73_REG_7,
925 PREFIX_VEX_0F74,
926 PREFIX_VEX_0F75,
927 PREFIX_VEX_0F76,
928 PREFIX_VEX_0F77,
929 PREFIX_VEX_0F7C,
930 PREFIX_VEX_0F7D,
931 PREFIX_VEX_0F7E,
932 PREFIX_VEX_0F7F,
933 PREFIX_VEX_0FC2,
934 PREFIX_VEX_0FC4,
935 PREFIX_VEX_0FC5,
936 PREFIX_VEX_0FD0,
937 PREFIX_VEX_0FD1,
938 PREFIX_VEX_0FD2,
939 PREFIX_VEX_0FD3,
940 PREFIX_VEX_0FD4,
941 PREFIX_VEX_0FD5,
942 PREFIX_VEX_0FD6,
943 PREFIX_VEX_0FD7,
944 PREFIX_VEX_0FD8,
945 PREFIX_VEX_0FD9,
946 PREFIX_VEX_0FDA,
947 PREFIX_VEX_0FDB,
948 PREFIX_VEX_0FDC,
949 PREFIX_VEX_0FDD,
950 PREFIX_VEX_0FDE,
951 PREFIX_VEX_0FDF,
952 PREFIX_VEX_0FE0,
953 PREFIX_VEX_0FE1,
954 PREFIX_VEX_0FE2,
955 PREFIX_VEX_0FE3,
956 PREFIX_VEX_0FE4,
957 PREFIX_VEX_0FE5,
958 PREFIX_VEX_0FE6,
959 PREFIX_VEX_0FE7,
960 PREFIX_VEX_0FE8,
961 PREFIX_VEX_0FE9,
962 PREFIX_VEX_0FEA,
963 PREFIX_VEX_0FEB,
964 PREFIX_VEX_0FEC,
965 PREFIX_VEX_0FED,
966 PREFIX_VEX_0FEE,
967 PREFIX_VEX_0FEF,
968 PREFIX_VEX_0FF0,
969 PREFIX_VEX_0FF1,
970 PREFIX_VEX_0FF2,
971 PREFIX_VEX_0FF3,
972 PREFIX_VEX_0FF4,
973 PREFIX_VEX_0FF5,
974 PREFIX_VEX_0FF6,
975 PREFIX_VEX_0FF7,
976 PREFIX_VEX_0FF8,
977 PREFIX_VEX_0FF9,
978 PREFIX_VEX_0FFA,
979 PREFIX_VEX_0FFB,
980 PREFIX_VEX_0FFC,
981 PREFIX_VEX_0FFD,
982 PREFIX_VEX_0FFE,
983 PREFIX_VEX_0F3800,
984 PREFIX_VEX_0F3801,
985 PREFIX_VEX_0F3802,
986 PREFIX_VEX_0F3803,
987 PREFIX_VEX_0F3804,
988 PREFIX_VEX_0F3805,
989 PREFIX_VEX_0F3806,
990 PREFIX_VEX_0F3807,
991 PREFIX_VEX_0F3808,
992 PREFIX_VEX_0F3809,
993 PREFIX_VEX_0F380A,
994 PREFIX_VEX_0F380B,
995 PREFIX_VEX_0F380C,
996 PREFIX_VEX_0F380D,
997 PREFIX_VEX_0F380E,
998 PREFIX_VEX_0F380F,
999 PREFIX_VEX_0F3813,
1000 PREFIX_VEX_0F3816,
1001 PREFIX_VEX_0F3817,
1002 PREFIX_VEX_0F3818,
1003 PREFIX_VEX_0F3819,
1004 PREFIX_VEX_0F381A,
1005 PREFIX_VEX_0F381C,
1006 PREFIX_VEX_0F381D,
1007 PREFIX_VEX_0F381E,
1008 PREFIX_VEX_0F3820,
1009 PREFIX_VEX_0F3821,
1010 PREFIX_VEX_0F3822,
1011 PREFIX_VEX_0F3823,
1012 PREFIX_VEX_0F3824,
1013 PREFIX_VEX_0F3825,
1014 PREFIX_VEX_0F3828,
1015 PREFIX_VEX_0F3829,
1016 PREFIX_VEX_0F382A,
1017 PREFIX_VEX_0F382B,
1018 PREFIX_VEX_0F382C,
1019 PREFIX_VEX_0F382D,
1020 PREFIX_VEX_0F382E,
1021 PREFIX_VEX_0F382F,
1022 PREFIX_VEX_0F3830,
1023 PREFIX_VEX_0F3831,
1024 PREFIX_VEX_0F3832,
1025 PREFIX_VEX_0F3833,
1026 PREFIX_VEX_0F3834,
1027 PREFIX_VEX_0F3835,
1028 PREFIX_VEX_0F3836,
1029 PREFIX_VEX_0F3837,
1030 PREFIX_VEX_0F3838,
1031 PREFIX_VEX_0F3839,
1032 PREFIX_VEX_0F383A,
1033 PREFIX_VEX_0F383B,
1034 PREFIX_VEX_0F383C,
1035 PREFIX_VEX_0F383D,
1036 PREFIX_VEX_0F383E,
1037 PREFIX_VEX_0F383F,
1038 PREFIX_VEX_0F3840,
1039 PREFIX_VEX_0F3841,
1040 PREFIX_VEX_0F3845,
1041 PREFIX_VEX_0F3846,
1042 PREFIX_VEX_0F3847,
1043 PREFIX_VEX_0F3858,
1044 PREFIX_VEX_0F3859,
1045 PREFIX_VEX_0F385A,
1046 PREFIX_VEX_0F3878,
1047 PREFIX_VEX_0F3879,
1048 PREFIX_VEX_0F388C,
1049 PREFIX_VEX_0F388E,
1050 PREFIX_VEX_0F3890,
1051 PREFIX_VEX_0F3891,
1052 PREFIX_VEX_0F3892,
1053 PREFIX_VEX_0F3893,
1054 PREFIX_VEX_0F3896,
1055 PREFIX_VEX_0F3897,
1056 PREFIX_VEX_0F3898,
1057 PREFIX_VEX_0F3899,
1058 PREFIX_VEX_0F389A,
1059 PREFIX_VEX_0F389B,
1060 PREFIX_VEX_0F389C,
1061 PREFIX_VEX_0F389D,
1062 PREFIX_VEX_0F389E,
1063 PREFIX_VEX_0F389F,
1064 PREFIX_VEX_0F38A6,
1065 PREFIX_VEX_0F38A7,
1066 PREFIX_VEX_0F38A8,
1067 PREFIX_VEX_0F38A9,
1068 PREFIX_VEX_0F38AA,
1069 PREFIX_VEX_0F38AB,
1070 PREFIX_VEX_0F38AC,
1071 PREFIX_VEX_0F38AD,
1072 PREFIX_VEX_0F38AE,
1073 PREFIX_VEX_0F38AF,
1074 PREFIX_VEX_0F38B6,
1075 PREFIX_VEX_0F38B7,
1076 PREFIX_VEX_0F38B8,
1077 PREFIX_VEX_0F38B9,
1078 PREFIX_VEX_0F38BA,
1079 PREFIX_VEX_0F38BB,
1080 PREFIX_VEX_0F38BC,
1081 PREFIX_VEX_0F38BD,
1082 PREFIX_VEX_0F38BE,
1083 PREFIX_VEX_0F38BF,
1084 PREFIX_VEX_0F38DB,
1085 PREFIX_VEX_0F38DC,
1086 PREFIX_VEX_0F38DD,
1087 PREFIX_VEX_0F38DE,
1088 PREFIX_VEX_0F38DF,
1089 PREFIX_VEX_0F38F2,
1090 PREFIX_VEX_0F38F3_REG_1,
1091 PREFIX_VEX_0F38F3_REG_2,
1092 PREFIX_VEX_0F38F3_REG_3,
1093 PREFIX_VEX_0F38F5,
1094 PREFIX_VEX_0F38F6,
1095 PREFIX_VEX_0F38F7,
1096 PREFIX_VEX_0F3A00,
1097 PREFIX_VEX_0F3A01,
1098 PREFIX_VEX_0F3A02,
1099 PREFIX_VEX_0F3A04,
1100 PREFIX_VEX_0F3A05,
1101 PREFIX_VEX_0F3A06,
1102 PREFIX_VEX_0F3A08,
1103 PREFIX_VEX_0F3A09,
1104 PREFIX_VEX_0F3A0A,
1105 PREFIX_VEX_0F3A0B,
1106 PREFIX_VEX_0F3A0C,
1107 PREFIX_VEX_0F3A0D,
1108 PREFIX_VEX_0F3A0E,
1109 PREFIX_VEX_0F3A0F,
1110 PREFIX_VEX_0F3A14,
1111 PREFIX_VEX_0F3A15,
1112 PREFIX_VEX_0F3A16,
1113 PREFIX_VEX_0F3A17,
1114 PREFIX_VEX_0F3A18,
1115 PREFIX_VEX_0F3A19,
1116 PREFIX_VEX_0F3A1D,
1117 PREFIX_VEX_0F3A20,
1118 PREFIX_VEX_0F3A21,
1119 PREFIX_VEX_0F3A22,
1120 PREFIX_VEX_0F3A38,
1121 PREFIX_VEX_0F3A39,
1122 PREFIX_VEX_0F3A40,
1123 PREFIX_VEX_0F3A41,
1124 PREFIX_VEX_0F3A42,
1125 PREFIX_VEX_0F3A44,
1126 PREFIX_VEX_0F3A46,
1127 PREFIX_VEX_0F3A48,
1128 PREFIX_VEX_0F3A49,
1129 PREFIX_VEX_0F3A4A,
1130 PREFIX_VEX_0F3A4B,
1131 PREFIX_VEX_0F3A4C,
1132 PREFIX_VEX_0F3A5C,
1133 PREFIX_VEX_0F3A5D,
1134 PREFIX_VEX_0F3A5E,
1135 PREFIX_VEX_0F3A5F,
1136 PREFIX_VEX_0F3A60,
1137 PREFIX_VEX_0F3A61,
1138 PREFIX_VEX_0F3A62,
1139 PREFIX_VEX_0F3A63,
1140 PREFIX_VEX_0F3A68,
1141 PREFIX_VEX_0F3A69,
1142 PREFIX_VEX_0F3A6A,
1143 PREFIX_VEX_0F3A6B,
1144 PREFIX_VEX_0F3A6C,
1145 PREFIX_VEX_0F3A6D,
1146 PREFIX_VEX_0F3A6E,
1147 PREFIX_VEX_0F3A6F,
1148 PREFIX_VEX_0F3A78,
1149 PREFIX_VEX_0F3A79,
1150 PREFIX_VEX_0F3A7A,
1151 PREFIX_VEX_0F3A7B,
1152 PREFIX_VEX_0F3A7C,
1153 PREFIX_VEX_0F3A7D,
1154 PREFIX_VEX_0F3A7E,
1155 PREFIX_VEX_0F3A7F,
1156 PREFIX_VEX_0F3ADF,
1157 PREFIX_VEX_0F3AF0
1158 };
1159
1160 enum
1161 {
1162 X86_64_06 = 0,
1163 X86_64_07,
1164 X86_64_0D,
1165 X86_64_16,
1166 X86_64_17,
1167 X86_64_1E,
1168 X86_64_1F,
1169 X86_64_27,
1170 X86_64_2F,
1171 X86_64_37,
1172 X86_64_3F,
1173 X86_64_60,
1174 X86_64_61,
1175 X86_64_62,
1176 X86_64_63,
1177 X86_64_6D,
1178 X86_64_6F,
1179 X86_64_9A,
1180 X86_64_C4,
1181 X86_64_C5,
1182 X86_64_CE,
1183 X86_64_D4,
1184 X86_64_D5,
1185 X86_64_EA,
1186 X86_64_0F01_REG_0,
1187 X86_64_0F01_REG_1,
1188 X86_64_0F01_REG_2,
1189 X86_64_0F01_REG_3
1190 };
1191
1192 enum
1193 {
1194 THREE_BYTE_0F38 = 0,
1195 THREE_BYTE_0F3A,
1196 THREE_BYTE_0F7A
1197 };
1198
1199 enum
1200 {
1201 XOP_08 = 0,
1202 XOP_09,
1203 XOP_0A
1204 };
1205
1206 enum
1207 {
1208 VEX_0F = 0,
1209 VEX_0F38,
1210 VEX_0F3A
1211 };
1212
1213 enum
1214 {
1215 VEX_LEN_0F10_P_1 = 0,
1216 VEX_LEN_0F10_P_3,
1217 VEX_LEN_0F11_P_1,
1218 VEX_LEN_0F11_P_3,
1219 VEX_LEN_0F12_P_0_M_0,
1220 VEX_LEN_0F12_P_0_M_1,
1221 VEX_LEN_0F12_P_2,
1222 VEX_LEN_0F13_M_0,
1223 VEX_LEN_0F16_P_0_M_0,
1224 VEX_LEN_0F16_P_0_M_1,
1225 VEX_LEN_0F16_P_2,
1226 VEX_LEN_0F17_M_0,
1227 VEX_LEN_0F2A_P_1,
1228 VEX_LEN_0F2A_P_3,
1229 VEX_LEN_0F2C_P_1,
1230 VEX_LEN_0F2C_P_3,
1231 VEX_LEN_0F2D_P_1,
1232 VEX_LEN_0F2D_P_3,
1233 VEX_LEN_0F2E_P_0,
1234 VEX_LEN_0F2E_P_2,
1235 VEX_LEN_0F2F_P_0,
1236 VEX_LEN_0F2F_P_2,
1237 VEX_LEN_0F51_P_1,
1238 VEX_LEN_0F51_P_3,
1239 VEX_LEN_0F52_P_1,
1240 VEX_LEN_0F53_P_1,
1241 VEX_LEN_0F58_P_1,
1242 VEX_LEN_0F58_P_3,
1243 VEX_LEN_0F59_P_1,
1244 VEX_LEN_0F59_P_3,
1245 VEX_LEN_0F5A_P_1,
1246 VEX_LEN_0F5A_P_3,
1247 VEX_LEN_0F5C_P_1,
1248 VEX_LEN_0F5C_P_3,
1249 VEX_LEN_0F5D_P_1,
1250 VEX_LEN_0F5D_P_3,
1251 VEX_LEN_0F5E_P_1,
1252 VEX_LEN_0F5E_P_3,
1253 VEX_LEN_0F5F_P_1,
1254 VEX_LEN_0F5F_P_3,
1255 VEX_LEN_0F6E_P_2,
1256 VEX_LEN_0F7E_P_1,
1257 VEX_LEN_0F7E_P_2,
1258 VEX_LEN_0FAE_R_2_M_0,
1259 VEX_LEN_0FAE_R_3_M_0,
1260 VEX_LEN_0FC2_P_1,
1261 VEX_LEN_0FC2_P_3,
1262 VEX_LEN_0FC4_P_2,
1263 VEX_LEN_0FC5_P_2,
1264 VEX_LEN_0FD6_P_2,
1265 VEX_LEN_0FF7_P_2,
1266 VEX_LEN_0F3816_P_2,
1267 VEX_LEN_0F3819_P_2,
1268 VEX_LEN_0F381A_P_2_M_0,
1269 VEX_LEN_0F3836_P_2,
1270 VEX_LEN_0F3841_P_2,
1271 VEX_LEN_0F385A_P_2_M_0,
1272 VEX_LEN_0F38DB_P_2,
1273 VEX_LEN_0F38DC_P_2,
1274 VEX_LEN_0F38DD_P_2,
1275 VEX_LEN_0F38DE_P_2,
1276 VEX_LEN_0F38DF_P_2,
1277 VEX_LEN_0F38F2_P_0,
1278 VEX_LEN_0F38F3_R_1_P_0,
1279 VEX_LEN_0F38F3_R_2_P_0,
1280 VEX_LEN_0F38F3_R_3_P_0,
1281 VEX_LEN_0F38F5_P_0,
1282 VEX_LEN_0F38F5_P_1,
1283 VEX_LEN_0F38F5_P_3,
1284 VEX_LEN_0F38F6_P_3,
1285 VEX_LEN_0F38F7_P_0,
1286 VEX_LEN_0F38F7_P_1,
1287 VEX_LEN_0F38F7_P_2,
1288 VEX_LEN_0F38F7_P_3,
1289 VEX_LEN_0F3A00_P_2,
1290 VEX_LEN_0F3A01_P_2,
1291 VEX_LEN_0F3A06_P_2,
1292 VEX_LEN_0F3A0A_P_2,
1293 VEX_LEN_0F3A0B_P_2,
1294 VEX_LEN_0F3A14_P_2,
1295 VEX_LEN_0F3A15_P_2,
1296 VEX_LEN_0F3A16_P_2,
1297 VEX_LEN_0F3A17_P_2,
1298 VEX_LEN_0F3A18_P_2,
1299 VEX_LEN_0F3A19_P_2,
1300 VEX_LEN_0F3A20_P_2,
1301 VEX_LEN_0F3A21_P_2,
1302 VEX_LEN_0F3A22_P_2,
1303 VEX_LEN_0F3A38_P_2,
1304 VEX_LEN_0F3A39_P_2,
1305 VEX_LEN_0F3A41_P_2,
1306 VEX_LEN_0F3A44_P_2,
1307 VEX_LEN_0F3A46_P_2,
1308 VEX_LEN_0F3A60_P_2,
1309 VEX_LEN_0F3A61_P_2,
1310 VEX_LEN_0F3A62_P_2,
1311 VEX_LEN_0F3A63_P_2,
1312 VEX_LEN_0F3A6A_P_2,
1313 VEX_LEN_0F3A6B_P_2,
1314 VEX_LEN_0F3A6E_P_2,
1315 VEX_LEN_0F3A6F_P_2,
1316 VEX_LEN_0F3A7A_P_2,
1317 VEX_LEN_0F3A7B_P_2,
1318 VEX_LEN_0F3A7E_P_2,
1319 VEX_LEN_0F3A7F_P_2,
1320 VEX_LEN_0F3ADF_P_2,
1321 VEX_LEN_0F3AF0_P_3,
1322 VEX_LEN_0FXOP_09_80,
1323 VEX_LEN_0FXOP_09_81
1324 };
1325
1326 enum
1327 {
1328 VEX_W_0F10_P_0 = 0,
1329 VEX_W_0F10_P_1,
1330 VEX_W_0F10_P_2,
1331 VEX_W_0F10_P_3,
1332 VEX_W_0F11_P_0,
1333 VEX_W_0F11_P_1,
1334 VEX_W_0F11_P_2,
1335 VEX_W_0F11_P_3,
1336 VEX_W_0F12_P_0_M_0,
1337 VEX_W_0F12_P_0_M_1,
1338 VEX_W_0F12_P_1,
1339 VEX_W_0F12_P_2,
1340 VEX_W_0F12_P_3,
1341 VEX_W_0F13_M_0,
1342 VEX_W_0F14,
1343 VEX_W_0F15,
1344 VEX_W_0F16_P_0_M_0,
1345 VEX_W_0F16_P_0_M_1,
1346 VEX_W_0F16_P_1,
1347 VEX_W_0F16_P_2,
1348 VEX_W_0F17_M_0,
1349 VEX_W_0F28,
1350 VEX_W_0F29,
1351 VEX_W_0F2B_M_0,
1352 VEX_W_0F2E_P_0,
1353 VEX_W_0F2E_P_2,
1354 VEX_W_0F2F_P_0,
1355 VEX_W_0F2F_P_2,
1356 VEX_W_0F50_M_0,
1357 VEX_W_0F51_P_0,
1358 VEX_W_0F51_P_1,
1359 VEX_W_0F51_P_2,
1360 VEX_W_0F51_P_3,
1361 VEX_W_0F52_P_0,
1362 VEX_W_0F52_P_1,
1363 VEX_W_0F53_P_0,
1364 VEX_W_0F53_P_1,
1365 VEX_W_0F58_P_0,
1366 VEX_W_0F58_P_1,
1367 VEX_W_0F58_P_2,
1368 VEX_W_0F58_P_3,
1369 VEX_W_0F59_P_0,
1370 VEX_W_0F59_P_1,
1371 VEX_W_0F59_P_2,
1372 VEX_W_0F59_P_3,
1373 VEX_W_0F5A_P_0,
1374 VEX_W_0F5A_P_1,
1375 VEX_W_0F5A_P_3,
1376 VEX_W_0F5B_P_0,
1377 VEX_W_0F5B_P_1,
1378 VEX_W_0F5B_P_2,
1379 VEX_W_0F5C_P_0,
1380 VEX_W_0F5C_P_1,
1381 VEX_W_0F5C_P_2,
1382 VEX_W_0F5C_P_3,
1383 VEX_W_0F5D_P_0,
1384 VEX_W_0F5D_P_1,
1385 VEX_W_0F5D_P_2,
1386 VEX_W_0F5D_P_3,
1387 VEX_W_0F5E_P_0,
1388 VEX_W_0F5E_P_1,
1389 VEX_W_0F5E_P_2,
1390 VEX_W_0F5E_P_3,
1391 VEX_W_0F5F_P_0,
1392 VEX_W_0F5F_P_1,
1393 VEX_W_0F5F_P_2,
1394 VEX_W_0F5F_P_3,
1395 VEX_W_0F60_P_2,
1396 VEX_W_0F61_P_2,
1397 VEX_W_0F62_P_2,
1398 VEX_W_0F63_P_2,
1399 VEX_W_0F64_P_2,
1400 VEX_W_0F65_P_2,
1401 VEX_W_0F66_P_2,
1402 VEX_W_0F67_P_2,
1403 VEX_W_0F68_P_2,
1404 VEX_W_0F69_P_2,
1405 VEX_W_0F6A_P_2,
1406 VEX_W_0F6B_P_2,
1407 VEX_W_0F6C_P_2,
1408 VEX_W_0F6D_P_2,
1409 VEX_W_0F6F_P_1,
1410 VEX_W_0F6F_P_2,
1411 VEX_W_0F70_P_1,
1412 VEX_W_0F70_P_2,
1413 VEX_W_0F70_P_3,
1414 VEX_W_0F71_R_2_P_2,
1415 VEX_W_0F71_R_4_P_2,
1416 VEX_W_0F71_R_6_P_2,
1417 VEX_W_0F72_R_2_P_2,
1418 VEX_W_0F72_R_4_P_2,
1419 VEX_W_0F72_R_6_P_2,
1420 VEX_W_0F73_R_2_P_2,
1421 VEX_W_0F73_R_3_P_2,
1422 VEX_W_0F73_R_6_P_2,
1423 VEX_W_0F73_R_7_P_2,
1424 VEX_W_0F74_P_2,
1425 VEX_W_0F75_P_2,
1426 VEX_W_0F76_P_2,
1427 VEX_W_0F77_P_0,
1428 VEX_W_0F7C_P_2,
1429 VEX_W_0F7C_P_3,
1430 VEX_W_0F7D_P_2,
1431 VEX_W_0F7D_P_3,
1432 VEX_W_0F7E_P_1,
1433 VEX_W_0F7F_P_1,
1434 VEX_W_0F7F_P_2,
1435 VEX_W_0FAE_R_2_M_0,
1436 VEX_W_0FAE_R_3_M_0,
1437 VEX_W_0FC2_P_0,
1438 VEX_W_0FC2_P_1,
1439 VEX_W_0FC2_P_2,
1440 VEX_W_0FC2_P_3,
1441 VEX_W_0FC4_P_2,
1442 VEX_W_0FC5_P_2,
1443 VEX_W_0FD0_P_2,
1444 VEX_W_0FD0_P_3,
1445 VEX_W_0FD1_P_2,
1446 VEX_W_0FD2_P_2,
1447 VEX_W_0FD3_P_2,
1448 VEX_W_0FD4_P_2,
1449 VEX_W_0FD5_P_2,
1450 VEX_W_0FD6_P_2,
1451 VEX_W_0FD7_P_2_M_1,
1452 VEX_W_0FD8_P_2,
1453 VEX_W_0FD9_P_2,
1454 VEX_W_0FDA_P_2,
1455 VEX_W_0FDB_P_2,
1456 VEX_W_0FDC_P_2,
1457 VEX_W_0FDD_P_2,
1458 VEX_W_0FDE_P_2,
1459 VEX_W_0FDF_P_2,
1460 VEX_W_0FE0_P_2,
1461 VEX_W_0FE1_P_2,
1462 VEX_W_0FE2_P_2,
1463 VEX_W_0FE3_P_2,
1464 VEX_W_0FE4_P_2,
1465 VEX_W_0FE5_P_2,
1466 VEX_W_0FE6_P_1,
1467 VEX_W_0FE6_P_2,
1468 VEX_W_0FE6_P_3,
1469 VEX_W_0FE7_P_2_M_0,
1470 VEX_W_0FE8_P_2,
1471 VEX_W_0FE9_P_2,
1472 VEX_W_0FEA_P_2,
1473 VEX_W_0FEB_P_2,
1474 VEX_W_0FEC_P_2,
1475 VEX_W_0FED_P_2,
1476 VEX_W_0FEE_P_2,
1477 VEX_W_0FEF_P_2,
1478 VEX_W_0FF0_P_3_M_0,
1479 VEX_W_0FF1_P_2,
1480 VEX_W_0FF2_P_2,
1481 VEX_W_0FF3_P_2,
1482 VEX_W_0FF4_P_2,
1483 VEX_W_0FF5_P_2,
1484 VEX_W_0FF6_P_2,
1485 VEX_W_0FF7_P_2,
1486 VEX_W_0FF8_P_2,
1487 VEX_W_0FF9_P_2,
1488 VEX_W_0FFA_P_2,
1489 VEX_W_0FFB_P_2,
1490 VEX_W_0FFC_P_2,
1491 VEX_W_0FFD_P_2,
1492 VEX_W_0FFE_P_2,
1493 VEX_W_0F3800_P_2,
1494 VEX_W_0F3801_P_2,
1495 VEX_W_0F3802_P_2,
1496 VEX_W_0F3803_P_2,
1497 VEX_W_0F3804_P_2,
1498 VEX_W_0F3805_P_2,
1499 VEX_W_0F3806_P_2,
1500 VEX_W_0F3807_P_2,
1501 VEX_W_0F3808_P_2,
1502 VEX_W_0F3809_P_2,
1503 VEX_W_0F380A_P_2,
1504 VEX_W_0F380B_P_2,
1505 VEX_W_0F380C_P_2,
1506 VEX_W_0F380D_P_2,
1507 VEX_W_0F380E_P_2,
1508 VEX_W_0F380F_P_2,
1509 VEX_W_0F3816_P_2,
1510 VEX_W_0F3817_P_2,
1511 VEX_W_0F3818_P_2,
1512 VEX_W_0F3819_P_2,
1513 VEX_W_0F381A_P_2_M_0,
1514 VEX_W_0F381C_P_2,
1515 VEX_W_0F381D_P_2,
1516 VEX_W_0F381E_P_2,
1517 VEX_W_0F3820_P_2,
1518 VEX_W_0F3821_P_2,
1519 VEX_W_0F3822_P_2,
1520 VEX_W_0F3823_P_2,
1521 VEX_W_0F3824_P_2,
1522 VEX_W_0F3825_P_2,
1523 VEX_W_0F3828_P_2,
1524 VEX_W_0F3829_P_2,
1525 VEX_W_0F382A_P_2_M_0,
1526 VEX_W_0F382B_P_2,
1527 VEX_W_0F382C_P_2_M_0,
1528 VEX_W_0F382D_P_2_M_0,
1529 VEX_W_0F382E_P_2_M_0,
1530 VEX_W_0F382F_P_2_M_0,
1531 VEX_W_0F3830_P_2,
1532 VEX_W_0F3831_P_2,
1533 VEX_W_0F3832_P_2,
1534 VEX_W_0F3833_P_2,
1535 VEX_W_0F3834_P_2,
1536 VEX_W_0F3835_P_2,
1537 VEX_W_0F3836_P_2,
1538 VEX_W_0F3837_P_2,
1539 VEX_W_0F3838_P_2,
1540 VEX_W_0F3839_P_2,
1541 VEX_W_0F383A_P_2,
1542 VEX_W_0F383B_P_2,
1543 VEX_W_0F383C_P_2,
1544 VEX_W_0F383D_P_2,
1545 VEX_W_0F383E_P_2,
1546 VEX_W_0F383F_P_2,
1547 VEX_W_0F3840_P_2,
1548 VEX_W_0F3841_P_2,
1549 VEX_W_0F3846_P_2,
1550 VEX_W_0F3858_P_2,
1551 VEX_W_0F3859_P_2,
1552 VEX_W_0F385A_P_2_M_0,
1553 VEX_W_0F3878_P_2,
1554 VEX_W_0F3879_P_2,
1555 VEX_W_0F38DB_P_2,
1556 VEX_W_0F38DC_P_2,
1557 VEX_W_0F38DD_P_2,
1558 VEX_W_0F38DE_P_2,
1559 VEX_W_0F38DF_P_2,
1560 VEX_W_0F3A00_P_2,
1561 VEX_W_0F3A01_P_2,
1562 VEX_W_0F3A02_P_2,
1563 VEX_W_0F3A04_P_2,
1564 VEX_W_0F3A05_P_2,
1565 VEX_W_0F3A06_P_2,
1566 VEX_W_0F3A08_P_2,
1567 VEX_W_0F3A09_P_2,
1568 VEX_W_0F3A0A_P_2,
1569 VEX_W_0F3A0B_P_2,
1570 VEX_W_0F3A0C_P_2,
1571 VEX_W_0F3A0D_P_2,
1572 VEX_W_0F3A0E_P_2,
1573 VEX_W_0F3A0F_P_2,
1574 VEX_W_0F3A14_P_2,
1575 VEX_W_0F3A15_P_2,
1576 VEX_W_0F3A18_P_2,
1577 VEX_W_0F3A19_P_2,
1578 VEX_W_0F3A20_P_2,
1579 VEX_W_0F3A21_P_2,
1580 VEX_W_0F3A38_P_2,
1581 VEX_W_0F3A39_P_2,
1582 VEX_W_0F3A40_P_2,
1583 VEX_W_0F3A41_P_2,
1584 VEX_W_0F3A42_P_2,
1585 VEX_W_0F3A44_P_2,
1586 VEX_W_0F3A46_P_2,
1587 VEX_W_0F3A48_P_2,
1588 VEX_W_0F3A49_P_2,
1589 VEX_W_0F3A4A_P_2,
1590 VEX_W_0F3A4B_P_2,
1591 VEX_W_0F3A4C_P_2,
1592 VEX_W_0F3A60_P_2,
1593 VEX_W_0F3A61_P_2,
1594 VEX_W_0F3A62_P_2,
1595 VEX_W_0F3A63_P_2,
1596 VEX_W_0F3ADF_P_2
1597 };
1598
1599 typedef void (*op_rtn) (int bytemode, int sizeflag);
1600
1601 struct dis386 {
1602 const char *name;
1603 struct
1604 {
1605 op_rtn rtn;
1606 int bytemode;
1607 } op[MAX_OPERANDS];
1608 };
1609
1610 /* Upper case letters in the instruction names here are macros.
1611 'A' => print 'b' if no register operands or suffix_always is true
1612 'B' => print 'b' if suffix_always is true
1613 'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
1614 size prefix
1615 'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
1616 suffix_always is true
1617 'E' => print 'e' if 32-bit form of jcxz
1618 'F' => print 'w' or 'l' depending on address size prefix (loop insns)
1619 'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
1620 'H' => print ",pt" or ",pn" branch hint
1621 'I' => honor following macro letter even in Intel mode (implemented only
1622 for some of the macro letters)
1623 'J' => print 'l'
1624 'K' => print 'd' or 'q' if rex prefix is present.
1625 'L' => print 'l' if suffix_always is true
1626 'M' => print 'r' if intel_mnemonic is false.
1627 'N' => print 'n' if instruction has no wait "prefix"
1628 'O' => print 'd' or 'o' (or 'q' in Intel mode)
1629 'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix,
1630 or suffix_always is true. print 'q' if rex prefix is present.
1631 'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
1632 is true
1633 'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
1634 'S' => print 'w', 'l' or 'q' if suffix_always is true
1635 'T' => print 'q' in 64bit mode and behave as 'P' otherwise
1636 'U' => print 'q' in 64bit mode and behave as 'Q' otherwise
1637 'V' => print 'q' in 64bit mode and behave as 'S' otherwise
1638 'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
1639 'X' => print 's', 'd' depending on data16 prefix (for XMM)
1640 'Y' => 'q' if instruction has an REX 64bit overwrite prefix and
1641 suffix_always is true.
1642 'Z' => print 'q' in 64bit mode and behave as 'L' otherwise
1643 '!' => change condition from true to false or from false to true.
1644 '%' => add 1 upper case letter to the macro.
1645
1646 2 upper case letter macros:
1647 "XY" => print 'x' or 'y' if no register operands or suffix_always
1648 is true.
1649 "XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
1650 "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand
1651 or suffix_always is true
1652 "LB" => print "abs" in 64bit mode and behave as 'B' otherwise
1653 "LS" => print "abs" in 64bit mode and behave as 'S' otherwise
1654 "LV" => print "abs" for 64bit operand and behave as 'S' otherwise
1655 "LW" => print 'd', 'q' depending on the VEX.W bit
1656
1657 Many of the above letters print nothing in Intel mode. See "putop"
1658 for the details.
1659
1660 Braces '{' and '}', and vertical bars '|', indicate alternative
1661 mnemonic strings for AT&T and Intel. */
1662
1663 static const struct dis386 dis386[] = {
1664 /* 00 */
1665 { "addB", { Ebh1, Gb } },
1666 { "addS", { Evh1, Gv } },
1667 { "addB", { Gb, EbS } },
1668 { "addS", { Gv, EvS } },
1669 { "addB", { AL, Ib } },
1670 { "addS", { eAX, Iv } },
1671 { X86_64_TABLE (X86_64_06) },
1672 { X86_64_TABLE (X86_64_07) },
1673 /* 08 */
1674 { "orB", { Ebh1, Gb } },
1675 { "orS", { Evh1, Gv } },
1676 { "orB", { Gb, EbS } },
1677 { "orS", { Gv, EvS } },
1678 { "orB", { AL, Ib } },
1679 { "orS", { eAX, Iv } },
1680 { X86_64_TABLE (X86_64_0D) },
1681 { Bad_Opcode }, /* 0x0f extended opcode escape */
1682 /* 10 */
1683 { "adcB", { Ebh1, Gb } },
1684 { "adcS", { Evh1, Gv } },
1685 { "adcB", { Gb, EbS } },
1686 { "adcS", { Gv, EvS } },
1687 { "adcB", { AL, Ib } },
1688 { "adcS", { eAX, Iv } },
1689 { X86_64_TABLE (X86_64_16) },
1690 { X86_64_TABLE (X86_64_17) },
1691 /* 18 */
1692 { "sbbB", { Ebh1, Gb } },
1693 { "sbbS", { Evh1, Gv } },
1694 { "sbbB", { Gb, EbS } },
1695 { "sbbS", { Gv, EvS } },
1696 { "sbbB", { AL, Ib } },
1697 { "sbbS", { eAX, Iv } },
1698 { X86_64_TABLE (X86_64_1E) },
1699 { X86_64_TABLE (X86_64_1F) },
1700 /* 20 */
1701 { "andB", { Ebh1, Gb } },
1702 { "andS", { Evh1, Gv } },
1703 { "andB", { Gb, EbS } },
1704 { "andS", { Gv, EvS } },
1705 { "andB", { AL, Ib } },
1706 { "andS", { eAX, Iv } },
1707 { Bad_Opcode }, /* SEG ES prefix */
1708 { X86_64_TABLE (X86_64_27) },
1709 /* 28 */
1710 { "subB", { Ebh1, Gb } },
1711 { "subS", { Evh1, Gv } },
1712 { "subB", { Gb, EbS } },
1713 { "subS", { Gv, EvS } },
1714 { "subB", { AL, Ib } },
1715 { "subS", { eAX, Iv } },
1716 { Bad_Opcode }, /* SEG CS prefix */
1717 { X86_64_TABLE (X86_64_2F) },
1718 /* 30 */
1719 { "xorB", { Ebh1, Gb } },
1720 { "xorS", { Evh1, Gv } },
1721 { "xorB", { Gb, EbS } },
1722 { "xorS", { Gv, EvS } },
1723 { "xorB", { AL, Ib } },
1724 { "xorS", { eAX, Iv } },
1725 { Bad_Opcode }, /* SEG SS prefix */
1726 { X86_64_TABLE (X86_64_37) },
1727 /* 38 */
1728 { "cmpB", { Eb, Gb } },
1729 { "cmpS", { Ev, Gv } },
1730 { "cmpB", { Gb, EbS } },
1731 { "cmpS", { Gv, EvS } },
1732 { "cmpB", { AL, Ib } },
1733 { "cmpS", { eAX, Iv } },
1734 { Bad_Opcode }, /* SEG DS prefix */
1735 { X86_64_TABLE (X86_64_3F) },
1736 /* 40 */
1737 { "inc{S|}", { RMeAX } },
1738 { "inc{S|}", { RMeCX } },
1739 { "inc{S|}", { RMeDX } },
1740 { "inc{S|}", { RMeBX } },
1741 { "inc{S|}", { RMeSP } },
1742 { "inc{S|}", { RMeBP } },
1743 { "inc{S|}", { RMeSI } },
1744 { "inc{S|}", { RMeDI } },
1745 /* 48 */
1746 { "dec{S|}", { RMeAX } },
1747 { "dec{S|}", { RMeCX } },
1748 { "dec{S|}", { RMeDX } },
1749 { "dec{S|}", { RMeBX } },
1750 { "dec{S|}", { RMeSP } },
1751 { "dec{S|}", { RMeBP } },
1752 { "dec{S|}", { RMeSI } },
1753 { "dec{S|}", { RMeDI } },
1754 /* 50 */
1755 { "pushV", { RMrAX } },
1756 { "pushV", { RMrCX } },
1757 { "pushV", { RMrDX } },
1758 { "pushV", { RMrBX } },
1759 { "pushV", { RMrSP } },
1760 { "pushV", { RMrBP } },
1761 { "pushV", { RMrSI } },
1762 { "pushV", { RMrDI } },
1763 /* 58 */
1764 { "popV", { RMrAX } },
1765 { "popV", { RMrCX } },
1766 { "popV", { RMrDX } },
1767 { "popV", { RMrBX } },
1768 { "popV", { RMrSP } },
1769 { "popV", { RMrBP } },
1770 { "popV", { RMrSI } },
1771 { "popV", { RMrDI } },
1772 /* 60 */
1773 { X86_64_TABLE (X86_64_60) },
1774 { X86_64_TABLE (X86_64_61) },
1775 { X86_64_TABLE (X86_64_62) },
1776 { X86_64_TABLE (X86_64_63) },
1777 { Bad_Opcode }, /* seg fs */
1778 { Bad_Opcode }, /* seg gs */
1779 { Bad_Opcode }, /* op size prefix */
1780 { Bad_Opcode }, /* adr size prefix */
1781 /* 68 */
1782 { "pushT", { sIv } },
1783 { "imulS", { Gv, Ev, Iv } },
1784 { "pushT", { sIbT } },
1785 { "imulS", { Gv, Ev, sIb } },
1786 { "ins{b|}", { Ybr, indirDX } },
1787 { X86_64_TABLE (X86_64_6D) },
1788 { "outs{b|}", { indirDXr, Xb } },
1789 { X86_64_TABLE (X86_64_6F) },
1790 /* 70 */
1791 { "joH", { Jb, XX, cond_jump_flag } },
1792 { "jnoH", { Jb, XX, cond_jump_flag } },
1793 { "jbH", { Jb, XX, cond_jump_flag } },
1794 { "jaeH", { Jb, XX, cond_jump_flag } },
1795 { "jeH", { Jb, XX, cond_jump_flag } },
1796 { "jneH", { Jb, XX, cond_jump_flag } },
1797 { "jbeH", { Jb, XX, cond_jump_flag } },
1798 { "jaH", { Jb, XX, cond_jump_flag } },
1799 /* 78 */
1800 { "jsH", { Jb, XX, cond_jump_flag } },
1801 { "jnsH", { Jb, XX, cond_jump_flag } },
1802 { "jpH", { Jb, XX, cond_jump_flag } },
1803 { "jnpH", { Jb, XX, cond_jump_flag } },
1804 { "jlH", { Jb, XX, cond_jump_flag } },
1805 { "jgeH", { Jb, XX, cond_jump_flag } },
1806 { "jleH", { Jb, XX, cond_jump_flag } },
1807 { "jgH", { Jb, XX, cond_jump_flag } },
1808 /* 80 */
1809 { REG_TABLE (REG_80) },
1810 { REG_TABLE (REG_81) },
1811 { Bad_Opcode },
1812 { REG_TABLE (REG_82) },
1813 { "testB", { Eb, Gb } },
1814 { "testS", { Ev, Gv } },
1815 { "xchgB", { Ebh2, Gb } },
1816 { "xchgS", { Evh2, Gv } },
1817 /* 88 */
1818 { "movB", { Ebh3, Gb } },
1819 { "movS", { Evh3, Gv } },
1820 { "movB", { Gb, EbS } },
1821 { "movS", { Gv, EvS } },
1822 { "movD", { Sv, Sw } },
1823 { MOD_TABLE (MOD_8D) },
1824 { "movD", { Sw, Sv } },
1825 { REG_TABLE (REG_8F) },
1826 /* 90 */
1827 { PREFIX_TABLE (PREFIX_90) },
1828 { "xchgS", { RMeCX, eAX } },
1829 { "xchgS", { RMeDX, eAX } },
1830 { "xchgS", { RMeBX, eAX } },
1831 { "xchgS", { RMeSP, eAX } },
1832 { "xchgS", { RMeBP, eAX } },
1833 { "xchgS", { RMeSI, eAX } },
1834 { "xchgS", { RMeDI, eAX } },
1835 /* 98 */
1836 { "cW{t|}R", { XX } },
1837 { "cR{t|}O", { XX } },
1838 { X86_64_TABLE (X86_64_9A) },
1839 { Bad_Opcode }, /* fwait */
1840 { "pushfT", { XX } },
1841 { "popfT", { XX } },
1842 { "sahf", { XX } },
1843 { "lahf", { XX } },
1844 /* a0 */
1845 { "mov%LB", { AL, Ob } },
1846 { "mov%LS", { eAX, Ov } },
1847 { "mov%LB", { Ob, AL } },
1848 { "mov%LS", { Ov, eAX } },
1849 { "movs{b|}", { Ybr, Xb } },
1850 { "movs{R|}", { Yvr, Xv } },
1851 { "cmps{b|}", { Xb, Yb } },
1852 { "cmps{R|}", { Xv, Yv } },
1853 /* a8 */
1854 { "testB", { AL, Ib } },
1855 { "testS", { eAX, Iv } },
1856 { "stosB", { Ybr, AL } },
1857 { "stosS", { Yvr, eAX } },
1858 { "lodsB", { ALr, Xb } },
1859 { "lodsS", { eAXr, Xv } },
1860 { "scasB", { AL, Yb } },
1861 { "scasS", { eAX, Yv } },
1862 /* b0 */
1863 { "movB", { RMAL, Ib } },
1864 { "movB", { RMCL, Ib } },
1865 { "movB", { RMDL, Ib } },
1866 { "movB", { RMBL, Ib } },
1867 { "movB", { RMAH, Ib } },
1868 { "movB", { RMCH, Ib } },
1869 { "movB", { RMDH, Ib } },
1870 { "movB", { RMBH, Ib } },
1871 /* b8 */
1872 { "mov%LV", { RMeAX, Iv64 } },
1873 { "mov%LV", { RMeCX, Iv64 } },
1874 { "mov%LV", { RMeDX, Iv64 } },
1875 { "mov%LV", { RMeBX, Iv64 } },
1876 { "mov%LV", { RMeSP, Iv64 } },
1877 { "mov%LV", { RMeBP, Iv64 } },
1878 { "mov%LV", { RMeSI, Iv64 } },
1879 { "mov%LV", { RMeDI, Iv64 } },
1880 /* c0 */
1881 { REG_TABLE (REG_C0) },
1882 { REG_TABLE (REG_C1) },
1883 { "retT", { Iw } },
1884 { "retT", { XX } },
1885 { X86_64_TABLE (X86_64_C4) },
1886 { X86_64_TABLE (X86_64_C5) },
1887 { REG_TABLE (REG_C6) },
1888 { REG_TABLE (REG_C7) },
1889 /* c8 */
1890 { "enterT", { Iw, Ib } },
1891 { "leaveT", { XX } },
1892 { "Jret{|f}P", { Iw } },
1893 { "Jret{|f}P", { XX } },
1894 { "int3", { XX } },
1895 { "int", { Ib } },
1896 { X86_64_TABLE (X86_64_CE) },
1897 { "iretP", { XX } },
1898 /* d0 */
1899 { REG_TABLE (REG_D0) },
1900 { REG_TABLE (REG_D1) },
1901 { REG_TABLE (REG_D2) },
1902 { REG_TABLE (REG_D3) },
1903 { X86_64_TABLE (X86_64_D4) },
1904 { X86_64_TABLE (X86_64_D5) },
1905 { Bad_Opcode },
1906 { "xlat", { DSBX } },
1907 /* d8 */
1908 { FLOAT },
1909 { FLOAT },
1910 { FLOAT },
1911 { FLOAT },
1912 { FLOAT },
1913 { FLOAT },
1914 { FLOAT },
1915 { FLOAT },
1916 /* e0 */
1917 { "loopneFH", { Jb, XX, loop_jcxz_flag } },
1918 { "loopeFH", { Jb, XX, loop_jcxz_flag } },
1919 { "loopFH", { Jb, XX, loop_jcxz_flag } },
1920 { "jEcxzH", { Jb, XX, loop_jcxz_flag } },
1921 { "inB", { AL, Ib } },
1922 { "inG", { zAX, Ib } },
1923 { "outB", { Ib, AL } },
1924 { "outG", { Ib, zAX } },
1925 /* e8 */
1926 { "callT", { Jv } },
1927 { "jmpT", { Jv } },
1928 { X86_64_TABLE (X86_64_EA) },
1929 { "jmp", { Jb } },
1930 { "inB", { AL, indirDX } },
1931 { "inG", { zAX, indirDX } },
1932 { "outB", { indirDX, AL } },
1933 { "outG", { indirDX, zAX } },
1934 /* f0 */
1935 { Bad_Opcode }, /* lock prefix */
1936 { "icebp", { XX } },
1937 { Bad_Opcode }, /* repne */
1938 { Bad_Opcode }, /* repz */
1939 { "hlt", { XX } },
1940 { "cmc", { XX } },
1941 { REG_TABLE (REG_F6) },
1942 { REG_TABLE (REG_F7) },
1943 /* f8 */
1944 { "clc", { XX } },
1945 { "stc", { XX } },
1946 { "cli", { XX } },
1947 { "sti", { XX } },
1948 { "cld", { XX } },
1949 { "std", { XX } },
1950 { REG_TABLE (REG_FE) },
1951 { REG_TABLE (REG_FF) },
1952 };
1953
1954 static const struct dis386 dis386_twobyte[] = {
1955 /* 00 */
1956 { REG_TABLE (REG_0F00 ) },
1957 { REG_TABLE (REG_0F01 ) },
1958 { "larS", { Gv, Ew } },
1959 { "lslS", { Gv, Ew } },
1960 { Bad_Opcode },
1961 { "syscall", { XX } },
1962 { "clts", { XX } },
1963 { "sysretP", { XX } },
1964 /* 08 */
1965 { "invd", { XX } },
1966 { "wbinvd", { XX } },
1967 { Bad_Opcode },
1968 { "ud2", { XX } },
1969 { Bad_Opcode },
1970 { REG_TABLE (REG_0F0D) },
1971 { "femms", { XX } },
1972 { "", { MX, EM, OPSUF } }, /* See OP_3DNowSuffix. */
1973 /* 10 */
1974 { PREFIX_TABLE (PREFIX_0F10) },
1975 { PREFIX_TABLE (PREFIX_0F11) },
1976 { PREFIX_TABLE (PREFIX_0F12) },
1977 { MOD_TABLE (MOD_0F13) },
1978 { "unpcklpX", { XM, EXx } },
1979 { "unpckhpX", { XM, EXx } },
1980 { PREFIX_TABLE (PREFIX_0F16) },
1981 { MOD_TABLE (MOD_0F17) },
1982 /* 18 */
1983 { REG_TABLE (REG_0F18) },
1984 { "nopQ", { Ev } },
1985 { "nopQ", { Ev } },
1986 { "nopQ", { Ev } },
1987 { "nopQ", { Ev } },
1988 { "nopQ", { Ev } },
1989 { "nopQ", { Ev } },
1990 { "nopQ", { Ev } },
1991 /* 20 */
1992 { MOD_TABLE (MOD_0F20) },
1993 { MOD_TABLE (MOD_0F21) },
1994 { MOD_TABLE (MOD_0F22) },
1995 { MOD_TABLE (MOD_0F23) },
1996 { MOD_TABLE (MOD_0F24) },
1997 { Bad_Opcode },
1998 { MOD_TABLE (MOD_0F26) },
1999 { Bad_Opcode },
2000 /* 28 */
2001 { "movapX", { XM, EXx } },
2002 { "movapX", { EXxS, XM } },
2003 { PREFIX_TABLE (PREFIX_0F2A) },
2004 { PREFIX_TABLE (PREFIX_0F2B) },
2005 { PREFIX_TABLE (PREFIX_0F2C) },
2006 { PREFIX_TABLE (PREFIX_0F2D) },
2007 { PREFIX_TABLE (PREFIX_0F2E) },
2008 { PREFIX_TABLE (PREFIX_0F2F) },
2009 /* 30 */
2010 { "wrmsr", { XX } },
2011 { "rdtsc", { XX } },
2012 { "rdmsr", { XX } },
2013 { "rdpmc", { XX } },
2014 { "sysenter", { XX } },
2015 { "sysexit", { XX } },
2016 { Bad_Opcode },
2017 { "getsec", { XX } },
2018 /* 38 */
2019 { THREE_BYTE_TABLE (THREE_BYTE_0F38) },
2020 { Bad_Opcode },
2021 { THREE_BYTE_TABLE (THREE_BYTE_0F3A) },
2022 { Bad_Opcode },
2023 { Bad_Opcode },
2024 { Bad_Opcode },
2025 { Bad_Opcode },
2026 { Bad_Opcode },
2027 /* 40 */
2028 { "cmovoS", { Gv, Ev } },
2029 { "cmovnoS", { Gv, Ev } },
2030 { "cmovbS", { Gv, Ev } },
2031 { "cmovaeS", { Gv, Ev } },
2032 { "cmoveS", { Gv, Ev } },
2033 { "cmovneS", { Gv, Ev } },
2034 { "cmovbeS", { Gv, Ev } },
2035 { "cmovaS", { Gv, Ev } },
2036 /* 48 */
2037 { "cmovsS", { Gv, Ev } },
2038 { "cmovnsS", { Gv, Ev } },
2039 { "cmovpS", { Gv, Ev } },
2040 { "cmovnpS", { Gv, Ev } },
2041 { "cmovlS", { Gv, Ev } },
2042 { "cmovgeS", { Gv, Ev } },
2043 { "cmovleS", { Gv, Ev } },
2044 { "cmovgS", { Gv, Ev } },
2045 /* 50 */
2046 { MOD_TABLE (MOD_0F51) },
2047 { PREFIX_TABLE (PREFIX_0F51) },
2048 { PREFIX_TABLE (PREFIX_0F52) },
2049 { PREFIX_TABLE (PREFIX_0F53) },
2050 { "andpX", { XM, EXx } },
2051 { "andnpX", { XM, EXx } },
2052 { "orpX", { XM, EXx } },
2053 { "xorpX", { XM, EXx } },
2054 /* 58 */
2055 { PREFIX_TABLE (PREFIX_0F58) },
2056 { PREFIX_TABLE (PREFIX_0F59) },
2057 { PREFIX_TABLE (PREFIX_0F5A) },
2058 { PREFIX_TABLE (PREFIX_0F5B) },
2059 { PREFIX_TABLE (PREFIX_0F5C) },
2060 { PREFIX_TABLE (PREFIX_0F5D) },
2061 { PREFIX_TABLE (PREFIX_0F5E) },
2062 { PREFIX_TABLE (PREFIX_0F5F) },
2063 /* 60 */
2064 { PREFIX_TABLE (PREFIX_0F60) },
2065 { PREFIX_TABLE (PREFIX_0F61) },
2066 { PREFIX_TABLE (PREFIX_0F62) },
2067 { "packsswb", { MX, EM } },
2068 { "pcmpgtb", { MX, EM } },
2069 { "pcmpgtw", { MX, EM } },
2070 { "pcmpgtd", { MX, EM } },
2071 { "packuswb", { MX, EM } },
2072 /* 68 */
2073 { "punpckhbw", { MX, EM } },
2074 { "punpckhwd", { MX, EM } },
2075 { "punpckhdq", { MX, EM } },
2076 { "packssdw", { MX, EM } },
2077 { PREFIX_TABLE (PREFIX_0F6C) },
2078 { PREFIX_TABLE (PREFIX_0F6D) },
2079 { "movK", { MX, Edq } },
2080 { PREFIX_TABLE (PREFIX_0F6F) },
2081 /* 70 */
2082 { PREFIX_TABLE (PREFIX_0F70) },
2083 { REG_TABLE (REG_0F71) },
2084 { REG_TABLE (REG_0F72) },
2085 { REG_TABLE (REG_0F73) },
2086 { "pcmpeqb", { MX, EM } },
2087 { "pcmpeqw", { MX, EM } },
2088 { "pcmpeqd", { MX, EM } },
2089 { "emms", { XX } },
2090 /* 78 */
2091 { PREFIX_TABLE (PREFIX_0F78) },
2092 { PREFIX_TABLE (PREFIX_0F79) },
2093 { THREE_BYTE_TABLE (THREE_BYTE_0F7A) },
2094 { Bad_Opcode },
2095 { PREFIX_TABLE (PREFIX_0F7C) },
2096 { PREFIX_TABLE (PREFIX_0F7D) },
2097 { PREFIX_TABLE (PREFIX_0F7E) },
2098 { PREFIX_TABLE (PREFIX_0F7F) },
2099 /* 80 */
2100 { "joH", { Jv, XX, cond_jump_flag } },
2101 { "jnoH", { Jv, XX, cond_jump_flag } },
2102 { "jbH", { Jv, XX, cond_jump_flag } },
2103 { "jaeH", { Jv, XX, cond_jump_flag } },
2104 { "jeH", { Jv, XX, cond_jump_flag } },
2105 { "jneH", { Jv, XX, cond_jump_flag } },
2106 { "jbeH", { Jv, XX, cond_jump_flag } },
2107 { "jaH", { Jv, XX, cond_jump_flag } },
2108 /* 88 */
2109 { "jsH", { Jv, XX, cond_jump_flag } },
2110 { "jnsH", { Jv, XX, cond_jump_flag } },
2111 { "jpH", { Jv, XX, cond_jump_flag } },
2112 { "jnpH", { Jv, XX, cond_jump_flag } },
2113 { "jlH", { Jv, XX, cond_jump_flag } },
2114 { "jgeH", { Jv, XX, cond_jump_flag } },
2115 { "jleH", { Jv, XX, cond_jump_flag } },
2116 { "jgH", { Jv, XX, cond_jump_flag } },
2117 /* 90 */
2118 { "seto", { Eb } },
2119 { "setno", { Eb } },
2120 { "setb", { Eb } },
2121 { "setae", { Eb } },
2122 { "sete", { Eb } },
2123 { "setne", { Eb } },
2124 { "setbe", { Eb } },
2125 { "seta", { Eb } },
2126 /* 98 */
2127 { "sets", { Eb } },
2128 { "setns", { Eb } },
2129 { "setp", { Eb } },
2130 { "setnp", { Eb } },
2131 { "setl", { Eb } },
2132 { "setge", { Eb } },
2133 { "setle", { Eb } },
2134 { "setg", { Eb } },
2135 /* a0 */
2136 { "pushT", { fs } },
2137 { "popT", { fs } },
2138 { "cpuid", { XX } },
2139 { "btS", { Ev, Gv } },
2140 { "shldS", { Ev, Gv, Ib } },
2141 { "shldS", { Ev, Gv, CL } },
2142 { REG_TABLE (REG_0FA6) },
2143 { REG_TABLE (REG_0FA7) },
2144 /* a8 */
2145 { "pushT", { gs } },
2146 { "popT", { gs } },
2147 { "rsm", { XX } },
2148 { "btsS", { Evh1, Gv } },
2149 { "shrdS", { Ev, Gv, Ib } },
2150 { "shrdS", { Ev, Gv, CL } },
2151 { REG_TABLE (REG_0FAE) },
2152 { "imulS", { Gv, Ev } },
2153 /* b0 */
2154 { "cmpxchgB", { Ebh1, Gb } },
2155 { "cmpxchgS", { Evh1, Gv } },
2156 { MOD_TABLE (MOD_0FB2) },
2157 { "btrS", { Evh1, Gv } },
2158 { MOD_TABLE (MOD_0FB4) },
2159 { MOD_TABLE (MOD_0FB5) },
2160 { "movz{bR|x}", { Gv, Eb } },
2161 { "movz{wR|x}", { Gv, Ew } }, /* yes, there really is movzww ! */
2162 /* b8 */
2163 { PREFIX_TABLE (PREFIX_0FB8) },
2164 { "ud1", { XX } },
2165 { REG_TABLE (REG_0FBA) },
2166 { "btcS", { Evh1, Gv } },
2167 { PREFIX_TABLE (PREFIX_0FBC) },
2168 { PREFIX_TABLE (PREFIX_0FBD) },
2169 { "movs{bR|x}", { Gv, Eb } },
2170 { "movs{wR|x}", { Gv, Ew } }, /* yes, there really is movsww ! */
2171 /* c0 */
2172 { "xaddB", { Ebh1, Gb } },
2173 { "xaddS", { Evh1, Gv } },
2174 { PREFIX_TABLE (PREFIX_0FC2) },
2175 { PREFIX_TABLE (PREFIX_0FC3) },
2176 { "pinsrw", { MX, Edqw, Ib } },
2177 { "pextrw", { Gdq, MS, Ib } },
2178 { "shufpX", { XM, EXx, Ib } },
2179 { REG_TABLE (REG_0FC7) },
2180 /* c8 */
2181 { "bswap", { RMeAX } },
2182 { "bswap", { RMeCX } },
2183 { "bswap", { RMeDX } },
2184 { "bswap", { RMeBX } },
2185 { "bswap", { RMeSP } },
2186 { "bswap", { RMeBP } },
2187 { "bswap", { RMeSI } },
2188 { "bswap", { RMeDI } },
2189 /* d0 */
2190 { PREFIX_TABLE (PREFIX_0FD0) },
2191 { "psrlw", { MX, EM } },
2192 { "psrld", { MX, EM } },
2193 { "psrlq", { MX, EM } },
2194 { "paddq", { MX, EM } },
2195 { "pmullw", { MX, EM } },
2196 { PREFIX_TABLE (PREFIX_0FD6) },
2197 { MOD_TABLE (MOD_0FD7) },
2198 /* d8 */
2199 { "psubusb", { MX, EM } },
2200 { "psubusw", { MX, EM } },
2201 { "pminub", { MX, EM } },
2202 { "pand", { MX, EM } },
2203 { "paddusb", { MX, EM } },
2204 { "paddusw", { MX, EM } },
2205 { "pmaxub", { MX, EM } },
2206 { "pandn", { MX, EM } },
2207 /* e0 */
2208 { "pavgb", { MX, EM } },
2209 { "psraw", { MX, EM } },
2210 { "psrad", { MX, EM } },
2211 { "pavgw", { MX, EM } },
2212 { "pmulhuw", { MX, EM } },
2213 { "pmulhw", { MX, EM } },
2214 { PREFIX_TABLE (PREFIX_0FE6) },
2215 { PREFIX_TABLE (PREFIX_0FE7) },
2216 /* e8 */
2217 { "psubsb", { MX, EM } },
2218 { "psubsw", { MX, EM } },
2219 { "pminsw", { MX, EM } },
2220 { "por", { MX, EM } },
2221 { "paddsb", { MX, EM } },
2222 { "paddsw", { MX, EM } },
2223 { "pmaxsw", { MX, EM } },
2224 { "pxor", { MX, EM } },
2225 /* f0 */
2226 { PREFIX_TABLE (PREFIX_0FF0) },
2227 { "psllw", { MX, EM } },
2228 { "pslld", { MX, EM } },
2229 { "psllq", { MX, EM } },
2230 { "pmuludq", { MX, EM } },
2231 { "pmaddwd", { MX, EM } },
2232 { "psadbw", { MX, EM } },
2233 { PREFIX_TABLE (PREFIX_0FF7) },
2234 /* f8 */
2235 { "psubb", { MX, EM } },
2236 { "psubw", { MX, EM } },
2237 { "psubd", { MX, EM } },
2238 { "psubq", { MX, EM } },
2239 { "paddb", { MX, EM } },
2240 { "paddw", { MX, EM } },
2241 { "paddd", { MX, EM } },
2242 { Bad_Opcode },
2243 };
2244
2245 static const unsigned char onebyte_has_modrm[256] = {
2246 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2247 /* ------------------------------- */
2248 /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
2249 /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
2250 /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
2251 /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
2252 /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
2253 /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
2254 /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
2255 /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
2256 /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
2257 /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
2258 /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
2259 /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
2260 /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
2261 /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
2262 /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
2263 /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1 /* f0 */
2264 /* ------------------------------- */
2265 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2266 };
2267
2268 static const unsigned char twobyte_has_modrm[256] = {
2269 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2270 /* ------------------------------- */
2271 /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
2272 /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
2273 /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
2274 /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
2275 /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
2276 /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
2277 /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
2278 /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
2279 /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
2280 /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
2281 /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
2282 /* b0 */ 1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1, /* bf */
2283 /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
2284 /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
2285 /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
2286 /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0 /* ff */
2287 /* ------------------------------- */
2288 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2289 };
2290
2291 static char obuf[100];
2292 static char *obufp;
2293 static char *mnemonicendp;
2294 static char scratchbuf[100];
2295 static unsigned char *start_codep;
2296 static unsigned char *insn_codep;
2297 static unsigned char *codep;
2298 static int last_lock_prefix;
2299 static int last_repz_prefix;
2300 static int last_repnz_prefix;
2301 static int last_data_prefix;
2302 static int last_addr_prefix;
2303 static int last_rex_prefix;
2304 static int last_seg_prefix;
2305 #define MAX_CODE_LENGTH 15
2306 /* We can up to 14 prefixes since the maximum instruction length is
2307 15bytes. */
2308 static int all_prefixes[MAX_CODE_LENGTH - 1];
2309 static disassemble_info *the_info;
2310 static struct
2311 {
2312 int mod;
2313 int reg;
2314 int rm;
2315 }
2316 modrm;
2317 static unsigned char need_modrm;
2318 static struct
2319 {
2320 int scale;
2321 int index;
2322 int base;
2323 }
2324 sib;
2325 static struct
2326 {
2327 int register_specifier;
2328 int length;
2329 int prefix;
2330 int w;
2331 }
2332 vex;
2333 static unsigned char need_vex;
2334 static unsigned char need_vex_reg;
2335 static unsigned char vex_w_done;
2336
2337 struct op
2338 {
2339 const char *name;
2340 unsigned int len;
2341 };
2342
2343 /* If we are accessing mod/rm/reg without need_modrm set, then the
2344 values are stale. Hitting this abort likely indicates that you
2345 need to update onebyte_has_modrm or twobyte_has_modrm. */
2346 #define MODRM_CHECK if (!need_modrm) abort ()
2347
2348 static const char **names64;
2349 static const char **names32;
2350 static const char **names16;
2351 static const char **names8;
2352 static const char **names8rex;
2353 static const char **names_seg;
2354 static const char *index64;
2355 static const char *index32;
2356 static const char **index16;
2357
2358 static const char *intel_names64[] = {
2359 "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
2360 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2361 };
2362 static const char *intel_names32[] = {
2363 "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
2364 "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
2365 };
2366 static const char *intel_names16[] = {
2367 "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
2368 "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
2369 };
2370 static const char *intel_names8[] = {
2371 "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
2372 };
2373 static const char *intel_names8rex[] = {
2374 "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
2375 "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
2376 };
2377 static const char *intel_names_seg[] = {
2378 "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
2379 };
2380 static const char *intel_index64 = "riz";
2381 static const char *intel_index32 = "eiz";
2382 static const char *intel_index16[] = {
2383 "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
2384 };
2385
2386 static const char *att_names64[] = {
2387 "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
2388 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
2389 };
2390 static const char *att_names32[] = {
2391 "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
2392 "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
2393 };
2394 static const char *att_names16[] = {
2395 "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
2396 "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
2397 };
2398 static const char *att_names8[] = {
2399 "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
2400 };
2401 static const char *att_names8rex[] = {
2402 "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
2403 "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
2404 };
2405 static const char *att_names_seg[] = {
2406 "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
2407 };
2408 static const char *att_index64 = "%riz";
2409 static const char *att_index32 = "%eiz";
2410 static const char *att_index16[] = {
2411 "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
2412 };
2413
2414 static const char **names_mm;
2415 static const char *intel_names_mm[] = {
2416 "mm0", "mm1", "mm2", "mm3",
2417 "mm4", "mm5", "mm6", "mm7"
2418 };
2419 static const char *att_names_mm[] = {
2420 "%mm0", "%mm1", "%mm2", "%mm3",
2421 "%mm4", "%mm5", "%mm6", "%mm7"
2422 };
2423
2424 static const char **names_xmm;
2425 static const char *intel_names_xmm[] = {
2426 "xmm0", "xmm1", "xmm2", "xmm3",
2427 "xmm4", "xmm5", "xmm6", "xmm7",
2428 "xmm8", "xmm9", "xmm10", "xmm11",
2429 "xmm12", "xmm13", "xmm14", "xmm15"
2430 };
2431 static const char *att_names_xmm[] = {
2432 "%xmm0", "%xmm1", "%xmm2", "%xmm3",
2433 "%xmm4", "%xmm5", "%xmm6", "%xmm7",
2434 "%xmm8", "%xmm9", "%xmm10", "%xmm11",
2435 "%xmm12", "%xmm13", "%xmm14", "%xmm15"
2436 };
2437
2438 static const char **names_ymm;
2439 static const char *intel_names_ymm[] = {
2440 "ymm0", "ymm1", "ymm2", "ymm3",
2441 "ymm4", "ymm5", "ymm6", "ymm7",
2442 "ymm8", "ymm9", "ymm10", "ymm11",
2443 "ymm12", "ymm13", "ymm14", "ymm15"
2444 };
2445 static const char *att_names_ymm[] = {
2446 "%ymm0", "%ymm1", "%ymm2", "%ymm3",
2447 "%ymm4", "%ymm5", "%ymm6", "%ymm7",
2448 "%ymm8", "%ymm9", "%ymm10", "%ymm11",
2449 "%ymm12", "%ymm13", "%ymm14", "%ymm15"
2450 };
2451
2452 static const struct dis386 reg_table[][8] = {
2453 /* REG_80 */
2454 {
2455 { "addA", { Ebh1, Ib } },
2456 { "orA", { Ebh1, Ib } },
2457 { "adcA", { Ebh1, Ib } },
2458 { "sbbA", { Ebh1, Ib } },
2459 { "andA", { Ebh1, Ib } },
2460 { "subA", { Ebh1, Ib } },
2461 { "xorA", { Ebh1, Ib } },
2462 { "cmpA", { Eb, Ib } },
2463 },
2464 /* REG_81 */
2465 {
2466 { "addQ", { Evh1, Iv } },
2467 { "orQ", { Evh1, Iv } },
2468 { "adcQ", { Evh1, Iv } },
2469 { "sbbQ", { Evh1, Iv } },
2470 { "andQ", { Evh1, Iv } },
2471 { "subQ", { Evh1, Iv } },
2472 { "xorQ", { Evh1, Iv } },
2473 { "cmpQ", { Ev, Iv } },
2474 },
2475 /* REG_82 */
2476 {
2477 { "addQ", { Evh1, sIb } },
2478 { "orQ", { Evh1, sIb } },
2479 { "adcQ", { Evh1, sIb } },
2480 { "sbbQ", { Evh1, sIb } },
2481 { "andQ", { Evh1, sIb } },
2482 { "subQ", { Evh1, sIb } },
2483 { "xorQ", { Evh1, sIb } },
2484 { "cmpQ", { Ev, sIb } },
2485 },
2486 /* REG_8F */
2487 {
2488 { "popU", { stackEv } },
2489 { XOP_8F_TABLE (XOP_09) },
2490 { Bad_Opcode },
2491 { Bad_Opcode },
2492 { Bad_Opcode },
2493 { XOP_8F_TABLE (XOP_09) },
2494 },
2495 /* REG_C0 */
2496 {
2497 { "rolA", { Eb, Ib } },
2498 { "rorA", { Eb, Ib } },
2499 { "rclA", { Eb, Ib } },
2500 { "rcrA", { Eb, Ib } },
2501 { "shlA", { Eb, Ib } },
2502 { "shrA", { Eb, Ib } },
2503 { Bad_Opcode },
2504 { "sarA", { Eb, Ib } },
2505 },
2506 /* REG_C1 */
2507 {
2508 { "rolQ", { Ev, Ib } },
2509 { "rorQ", { Ev, Ib } },
2510 { "rclQ", { Ev, Ib } },
2511 { "rcrQ", { Ev, Ib } },
2512 { "shlQ", { Ev, Ib } },
2513 { "shrQ", { Ev, Ib } },
2514 { Bad_Opcode },
2515 { "sarQ", { Ev, Ib } },
2516 },
2517 /* REG_C6 */
2518 {
2519 { "movA", { Ebh3, Ib } },
2520 { Bad_Opcode },
2521 { Bad_Opcode },
2522 { Bad_Opcode },
2523 { Bad_Opcode },
2524 { Bad_Opcode },
2525 { Bad_Opcode },
2526 { MOD_TABLE (MOD_C6_REG_7) },
2527 },
2528 /* REG_C7 */
2529 {
2530 { "movQ", { Evh3, Iv } },
2531 { Bad_Opcode },
2532 { Bad_Opcode },
2533 { Bad_Opcode },
2534 { Bad_Opcode },
2535 { Bad_Opcode },
2536 { Bad_Opcode },
2537 { MOD_TABLE (MOD_C7_REG_7) },
2538 },
2539 /* REG_D0 */
2540 {
2541 { "rolA", { Eb, I1 } },
2542 { "rorA", { Eb, I1 } },
2543 { "rclA", { Eb, I1 } },
2544 { "rcrA", { Eb, I1 } },
2545 { "shlA", { Eb, I1 } },
2546 { "shrA", { Eb, I1 } },
2547 { Bad_Opcode },
2548 { "sarA", { Eb, I1 } },
2549 },
2550 /* REG_D1 */
2551 {
2552 { "rolQ", { Ev, I1 } },
2553 { "rorQ", { Ev, I1 } },
2554 { "rclQ", { Ev, I1 } },
2555 { "rcrQ", { Ev, I1 } },
2556 { "shlQ", { Ev, I1 } },
2557 { "shrQ", { Ev, I1 } },
2558 { Bad_Opcode },
2559 { "sarQ", { Ev, I1 } },
2560 },
2561 /* REG_D2 */
2562 {
2563 { "rolA", { Eb, CL } },
2564 { "rorA", { Eb, CL } },
2565 { "rclA", { Eb, CL } },
2566 { "rcrA", { Eb, CL } },
2567 { "shlA", { Eb, CL } },
2568 { "shrA", { Eb, CL } },
2569 { Bad_Opcode },
2570 { "sarA", { Eb, CL } },
2571 },
2572 /* REG_D3 */
2573 {
2574 { "rolQ", { Ev, CL } },
2575 { "rorQ", { Ev, CL } },
2576 { "rclQ", { Ev, CL } },
2577 { "rcrQ", { Ev, CL } },
2578 { "shlQ", { Ev, CL } },
2579 { "shrQ", { Ev, CL } },
2580 { Bad_Opcode },
2581 { "sarQ", { Ev, CL } },
2582 },
2583 /* REG_F6 */
2584 {
2585 { "testA", { Eb, Ib } },
2586 { Bad_Opcode },
2587 { "notA", { Ebh1 } },
2588 { "negA", { Ebh1 } },
2589 { "mulA", { Eb } }, /* Don't print the implicit %al register, */
2590 { "imulA", { Eb } }, /* to distinguish these opcodes from other */
2591 { "divA", { Eb } }, /* mul/imul opcodes. Do the same for div */
2592 { "idivA", { Eb } }, /* and idiv for consistency. */
2593 },
2594 /* REG_F7 */
2595 {
2596 { "testQ", { Ev, Iv } },
2597 { Bad_Opcode },
2598 { "notQ", { Evh1 } },
2599 { "negQ", { Evh1 } },
2600 { "mulQ", { Ev } }, /* Don't print the implicit register. */
2601 { "imulQ", { Ev } },
2602 { "divQ", { Ev } },
2603 { "idivQ", { Ev } },
2604 },
2605 /* REG_FE */
2606 {
2607 { "incA", { Ebh1 } },
2608 { "decA", { Ebh1 } },
2609 },
2610 /* REG_FF */
2611 {
2612 { "incQ", { Evh1 } },
2613 { "decQ", { Evh1 } },
2614 { "call{T|}", { indirEv } },
2615 { "Jcall{T|}", { indirEp } },
2616 { "jmp{T|}", { indirEv } },
2617 { "Jjmp{T|}", { indirEp } },
2618 { "pushU", { stackEv } },
2619 { Bad_Opcode },
2620 },
2621 /* REG_0F00 */
2622 {
2623 { "sldtD", { Sv } },
2624 { "strD", { Sv } },
2625 { "lldt", { Ew } },
2626 { "ltr", { Ew } },
2627 { "verr", { Ew } },
2628 { "verw", { Ew } },
2629 { Bad_Opcode },
2630 { Bad_Opcode },
2631 },
2632 /* REG_0F01 */
2633 {
2634 { MOD_TABLE (MOD_0F01_REG_0) },
2635 { MOD_TABLE (MOD_0F01_REG_1) },
2636 { MOD_TABLE (MOD_0F01_REG_2) },
2637 { MOD_TABLE (MOD_0F01_REG_3) },
2638 { "smswD", { Sv } },
2639 { Bad_Opcode },
2640 { "lmsw", { Ew } },
2641 { MOD_TABLE (MOD_0F01_REG_7) },
2642 },
2643 /* REG_0F0D */
2644 {
2645 { "prefetch", { Mb } },
2646 { "prefetchw", { Mb } },
2647 },
2648 /* REG_0F18 */
2649 {
2650 { MOD_TABLE (MOD_0F18_REG_0) },
2651 { MOD_TABLE (MOD_0F18_REG_1) },
2652 { MOD_TABLE (MOD_0F18_REG_2) },
2653 { MOD_TABLE (MOD_0F18_REG_3) },
2654 },
2655 /* REG_0F71 */
2656 {
2657 { Bad_Opcode },
2658 { Bad_Opcode },
2659 { MOD_TABLE (MOD_0F71_REG_2) },
2660 { Bad_Opcode },
2661 { MOD_TABLE (MOD_0F71_REG_4) },
2662 { Bad_Opcode },
2663 { MOD_TABLE (MOD_0F71_REG_6) },
2664 },
2665 /* REG_0F72 */
2666 {
2667 { Bad_Opcode },
2668 { Bad_Opcode },
2669 { MOD_TABLE (MOD_0F72_REG_2) },
2670 { Bad_Opcode },
2671 { MOD_TABLE (MOD_0F72_REG_4) },
2672 { Bad_Opcode },
2673 { MOD_TABLE (MOD_0F72_REG_6) },
2674 },
2675 /* REG_0F73 */
2676 {
2677 { Bad_Opcode },
2678 { Bad_Opcode },
2679 { MOD_TABLE (MOD_0F73_REG_2) },
2680 { MOD_TABLE (MOD_0F73_REG_3) },
2681 { Bad_Opcode },
2682 { Bad_Opcode },
2683 { MOD_TABLE (MOD_0F73_REG_6) },
2684 { MOD_TABLE (MOD_0F73_REG_7) },
2685 },
2686 /* REG_0FA6 */
2687 {
2688 { "montmul", { { OP_0f07, 0 } } },
2689 { "xsha1", { { OP_0f07, 0 } } },
2690 { "xsha256", { { OP_0f07, 0 } } },
2691 },
2692 /* REG_0FA7 */
2693 {
2694 { "xstore-rng", { { OP_0f07, 0 } } },
2695 { "xcrypt-ecb", { { OP_0f07, 0 } } },
2696 { "xcrypt-cbc", { { OP_0f07, 0 } } },
2697 { "xcrypt-ctr", { { OP_0f07, 0 } } },
2698 { "xcrypt-cfb", { { OP_0f07, 0 } } },
2699 { "xcrypt-ofb", { { OP_0f07, 0 } } },
2700 },
2701 /* REG_0FAE */
2702 {
2703 { MOD_TABLE (MOD_0FAE_REG_0) },
2704 { MOD_TABLE (MOD_0FAE_REG_1) },
2705 { MOD_TABLE (MOD_0FAE_REG_2) },
2706 { MOD_TABLE (MOD_0FAE_REG_3) },
2707 { MOD_TABLE (MOD_0FAE_REG_4) },
2708 { MOD_TABLE (MOD_0FAE_REG_5) },
2709 { MOD_TABLE (MOD_0FAE_REG_6) },
2710 { MOD_TABLE (MOD_0FAE_REG_7) },
2711 },
2712 /* REG_0FBA */
2713 {
2714 { Bad_Opcode },
2715 { Bad_Opcode },
2716 { Bad_Opcode },
2717 { Bad_Opcode },
2718 { "btQ", { Ev, Ib } },
2719 { "btsQ", { Evh1, Ib } },
2720 { "btrQ", { Evh1, Ib } },
2721 { "btcQ", { Evh1, Ib } },
2722 },
2723 /* REG_0FC7 */
2724 {
2725 { Bad_Opcode },
2726 { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } } },
2727 { Bad_Opcode },
2728 { Bad_Opcode },
2729 { Bad_Opcode },
2730 { Bad_Opcode },
2731 { MOD_TABLE (MOD_0FC7_REG_6) },
2732 { MOD_TABLE (MOD_0FC7_REG_7) },
2733 },
2734 /* REG_VEX_0F71 */
2735 {
2736 { Bad_Opcode },
2737 { Bad_Opcode },
2738 { MOD_TABLE (MOD_VEX_0F71_REG_2) },
2739 { Bad_Opcode },
2740 { MOD_TABLE (MOD_VEX_0F71_REG_4) },
2741 { Bad_Opcode },
2742 { MOD_TABLE (MOD_VEX_0F71_REG_6) },
2743 },
2744 /* REG_VEX_0F72 */
2745 {
2746 { Bad_Opcode },
2747 { Bad_Opcode },
2748 { MOD_TABLE (MOD_VEX_0F72_REG_2) },
2749 { Bad_Opcode },
2750 { MOD_TABLE (MOD_VEX_0F72_REG_4) },
2751 { Bad_Opcode },
2752 { MOD_TABLE (MOD_VEX_0F72_REG_6) },
2753 },
2754 /* REG_VEX_0F73 */
2755 {
2756 { Bad_Opcode },
2757 { Bad_Opcode },
2758 { MOD_TABLE (MOD_VEX_0F73_REG_2) },
2759 { MOD_TABLE (MOD_VEX_0F73_REG_3) },
2760 { Bad_Opcode },
2761 { Bad_Opcode },
2762 { MOD_TABLE (MOD_VEX_0F73_REG_6) },
2763 { MOD_TABLE (MOD_VEX_0F73_REG_7) },
2764 },
2765 /* REG_VEX_0FAE */
2766 {
2767 { Bad_Opcode },
2768 { Bad_Opcode },
2769 { MOD_TABLE (MOD_VEX_0FAE_REG_2) },
2770 { MOD_TABLE (MOD_VEX_0FAE_REG_3) },
2771 },
2772 /* REG_VEX_0F38F3 */
2773 {
2774 { Bad_Opcode },
2775 { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_1) },
2776 { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_2) },
2777 { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_3) },
2778 },
2779 /* REG_XOP_LWPCB */
2780 {
2781 { "llwpcb", { { OP_LWPCB_E, 0 } } },
2782 { "slwpcb", { { OP_LWPCB_E, 0 } } },
2783 },
2784 /* REG_XOP_LWP */
2785 {
2786 { "lwpins", { { OP_LWP_E, 0 }, Ed, Iq } },
2787 { "lwpval", { { OP_LWP_E, 0 }, Ed, Iq } },
2788 },
2789 /* REG_XOP_TBM_01 */
2790 {
2791 { Bad_Opcode },
2792 { "blcfill", { { OP_LWP_E, 0 }, Ev } },
2793 { "blsfill", { { OP_LWP_E, 0 }, Ev } },
2794 { "blcs", { { OP_LWP_E, 0 }, Ev } },
2795 { "tzmsk", { { OP_LWP_E, 0 }, Ev } },
2796 { "blcic", { { OP_LWP_E, 0 }, Ev } },
2797 { "blsic", { { OP_LWP_E, 0 }, Ev } },
2798 { "t1mskc", { { OP_LWP_E, 0 }, Ev } },
2799 },
2800 /* REG_XOP_TBM_02 */
2801 {
2802 { Bad_Opcode },
2803 { "blcmsk", { { OP_LWP_E, 0 }, Ev } },
2804 { Bad_Opcode },
2805 { Bad_Opcode },
2806 { Bad_Opcode },
2807 { Bad_Opcode },
2808 { "blci", { { OP_LWP_E, 0 }, Ev } },
2809 },
2810 };
2811
2812 static const struct dis386 prefix_table[][4] = {
2813 /* PREFIX_90 */
2814 {
2815 { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } } },
2816 { "pause", { XX } },
2817 { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } } },
2818 },
2819
2820 /* PREFIX_0F10 */
2821 {
2822 { "movups", { XM, EXx } },
2823 { "movss", { XM, EXd } },
2824 { "movupd", { XM, EXx } },
2825 { "movsd", { XM, EXq } },
2826 },
2827
2828 /* PREFIX_0F11 */
2829 {
2830 { "movups", { EXxS, XM } },
2831 { "movss", { EXdS, XM } },
2832 { "movupd", { EXxS, XM } },
2833 { "movsd", { EXqS, XM } },
2834 },
2835
2836 /* PREFIX_0F12 */
2837 {
2838 { MOD_TABLE (MOD_0F12_PREFIX_0) },
2839 { "movsldup", { XM, EXx } },
2840 { "movlpd", { XM, EXq } },
2841 { "movddup", { XM, EXq } },
2842 },
2843
2844 /* PREFIX_0F16 */
2845 {
2846 { MOD_TABLE (MOD_0F16_PREFIX_0) },
2847 { "movshdup", { XM, EXx } },
2848 { "movhpd", { XM, EXq } },
2849 },
2850
2851 /* PREFIX_0F2A */
2852 {
2853 { "cvtpi2ps", { XM, EMCq } },
2854 { "cvtsi2ss%LQ", { XM, Ev } },
2855 { "cvtpi2pd", { XM, EMCq } },
2856 { "cvtsi2sd%LQ", { XM, Ev } },
2857 },
2858
2859 /* PREFIX_0F2B */
2860 {
2861 { MOD_TABLE (MOD_0F2B_PREFIX_0) },
2862 { MOD_TABLE (MOD_0F2B_PREFIX_1) },
2863 { MOD_TABLE (MOD_0F2B_PREFIX_2) },
2864 { MOD_TABLE (MOD_0F2B_PREFIX_3) },
2865 },
2866
2867 /* PREFIX_0F2C */
2868 {
2869 { "cvttps2pi", { MXC, EXq } },
2870 { "cvttss2siY", { Gv, EXd } },
2871 { "cvttpd2pi", { MXC, EXx } },
2872 { "cvttsd2siY", { Gv, EXq } },
2873 },
2874
2875 /* PREFIX_0F2D */
2876 {
2877 { "cvtps2pi", { MXC, EXq } },
2878 { "cvtss2siY", { Gv, EXd } },
2879 { "cvtpd2pi", { MXC, EXx } },
2880 { "cvtsd2siY", { Gv, EXq } },
2881 },
2882
2883 /* PREFIX_0F2E */
2884 {
2885 { "ucomiss",{ XM, EXd } },
2886 { Bad_Opcode },
2887 { "ucomisd",{ XM, EXq } },
2888 },
2889
2890 /* PREFIX_0F2F */
2891 {
2892 { "comiss", { XM, EXd } },
2893 { Bad_Opcode },
2894 { "comisd", { XM, EXq } },
2895 },
2896
2897 /* PREFIX_0F51 */
2898 {
2899 { "sqrtps", { XM, EXx } },
2900 { "sqrtss", { XM, EXd } },
2901 { "sqrtpd", { XM, EXx } },
2902 { "sqrtsd", { XM, EXq } },
2903 },
2904
2905 /* PREFIX_0F52 */
2906 {
2907 { "rsqrtps",{ XM, EXx } },
2908 { "rsqrtss",{ XM, EXd } },
2909 },
2910
2911 /* PREFIX_0F53 */
2912 {
2913 { "rcpps", { XM, EXx } },
2914 { "rcpss", { XM, EXd } },
2915 },
2916
2917 /* PREFIX_0F58 */
2918 {
2919 { "addps", { XM, EXx } },
2920 { "addss", { XM, EXd } },
2921 { "addpd", { XM, EXx } },
2922 { "addsd", { XM, EXq } },
2923 },
2924
2925 /* PREFIX_0F59 */
2926 {
2927 { "mulps", { XM, EXx } },
2928 { "mulss", { XM, EXd } },
2929 { "mulpd", { XM, EXx } },
2930 { "mulsd", { XM, EXq } },
2931 },
2932
2933 /* PREFIX_0F5A */
2934 {
2935 { "cvtps2pd", { XM, EXq } },
2936 { "cvtss2sd", { XM, EXd } },
2937 { "cvtpd2ps", { XM, EXx } },
2938 { "cvtsd2ss", { XM, EXq } },
2939 },
2940
2941 /* PREFIX_0F5B */
2942 {
2943 { "cvtdq2ps", { XM, EXx } },
2944 { "cvttps2dq", { XM, EXx } },
2945 { "cvtps2dq", { XM, EXx } },
2946 },
2947
2948 /* PREFIX_0F5C */
2949 {
2950 { "subps", { XM, EXx } },
2951 { "subss", { XM, EXd } },
2952 { "subpd", { XM, EXx } },
2953 { "subsd", { XM, EXq } },
2954 },
2955
2956 /* PREFIX_0F5D */
2957 {
2958 { "minps", { XM, EXx } },
2959 { "minss", { XM, EXd } },
2960 { "minpd", { XM, EXx } },
2961 { "minsd", { XM, EXq } },
2962 },
2963
2964 /* PREFIX_0F5E */
2965 {
2966 { "divps", { XM, EXx } },
2967 { "divss", { XM, EXd } },
2968 { "divpd", { XM, EXx } },
2969 { "divsd", { XM, EXq } },
2970 },
2971
2972 /* PREFIX_0F5F */
2973 {
2974 { "maxps", { XM, EXx } },
2975 { "maxss", { XM, EXd } },
2976 { "maxpd", { XM, EXx } },
2977 { "maxsd", { XM, EXq } },
2978 },
2979
2980 /* PREFIX_0F60 */
2981 {
2982 { "punpcklbw",{ MX, EMd } },
2983 { Bad_Opcode },
2984 { "punpcklbw",{ MX, EMx } },
2985 },
2986
2987 /* PREFIX_0F61 */
2988 {
2989 { "punpcklwd",{ MX, EMd } },
2990 { Bad_Opcode },
2991 { "punpcklwd",{ MX, EMx } },
2992 },
2993
2994 /* PREFIX_0F62 */
2995 {
2996 { "punpckldq",{ MX, EMd } },
2997 { Bad_Opcode },
2998 { "punpckldq",{ MX, EMx } },
2999 },
3000
3001 /* PREFIX_0F6C */
3002 {
3003 { Bad_Opcode },
3004 { Bad_Opcode },
3005 { "punpcklqdq", { XM, EXx } },
3006 },
3007
3008 /* PREFIX_0F6D */
3009 {
3010 { Bad_Opcode },
3011 { Bad_Opcode },
3012 { "punpckhqdq", { XM, EXx } },
3013 },
3014
3015 /* PREFIX_0F6F */
3016 {
3017 { "movq", { MX, EM } },
3018 { "movdqu", { XM, EXx } },
3019 { "movdqa", { XM, EXx } },
3020 },
3021
3022 /* PREFIX_0F70 */
3023 {
3024 { "pshufw", { MX, EM, Ib } },
3025 { "pshufhw",{ XM, EXx, Ib } },
3026 { "pshufd", { XM, EXx, Ib } },
3027 { "pshuflw",{ XM, EXx, Ib } },
3028 },
3029
3030 /* PREFIX_0F73_REG_3 */
3031 {
3032 { Bad_Opcode },
3033 { Bad_Opcode },
3034 { "psrldq", { XS, Ib } },
3035 },
3036
3037 /* PREFIX_0F73_REG_7 */
3038 {
3039 { Bad_Opcode },
3040 { Bad_Opcode },
3041 { "pslldq", { XS, Ib } },
3042 },
3043
3044 /* PREFIX_0F78 */
3045 {
3046 {"vmread", { Em, Gm } },
3047 { Bad_Opcode },
3048 {"extrq", { XS, Ib, Ib } },
3049 {"insertq", { XM, XS, Ib, Ib } },
3050 },
3051
3052 /* PREFIX_0F79 */
3053 {
3054 {"vmwrite", { Gm, Em } },
3055 { Bad_Opcode },
3056 {"extrq", { XM, XS } },
3057 {"insertq", { XM, XS } },
3058 },
3059
3060 /* PREFIX_0F7C */
3061 {
3062 { Bad_Opcode },
3063 { Bad_Opcode },
3064 { "haddpd", { XM, EXx } },
3065 { "haddps", { XM, EXx } },
3066 },
3067
3068 /* PREFIX_0F7D */
3069 {
3070 { Bad_Opcode },
3071 { Bad_Opcode },
3072 { "hsubpd", { XM, EXx } },
3073 { "hsubps", { XM, EXx } },
3074 },
3075
3076 /* PREFIX_0F7E */
3077 {
3078 { "movK", { Edq, MX } },
3079 { "movq", { XM, EXq } },
3080 { "movK", { Edq, XM } },
3081 },
3082
3083 /* PREFIX_0F7F */
3084 {
3085 { "movq", { EMS, MX } },
3086 { "movdqu", { EXxS, XM } },
3087 { "movdqa", { EXxS, XM } },
3088 },
3089
3090 /* PREFIX_0FAE_REG_0 */
3091 {
3092 { Bad_Opcode },
3093 { "rdfsbase", { Ev } },
3094 },
3095
3096 /* PREFIX_0FAE_REG_1 */
3097 {
3098 { Bad_Opcode },
3099 { "rdgsbase", { Ev } },
3100 },
3101
3102 /* PREFIX_0FAE_REG_2 */
3103 {
3104 { Bad_Opcode },
3105 { "wrfsbase", { Ev } },
3106 },
3107
3108 /* PREFIX_0FAE_REG_3 */
3109 {
3110 { Bad_Opcode },
3111 { "wrgsbase", { Ev } },
3112 },
3113
3114 /* PREFIX_0FB8 */
3115 {
3116 { Bad_Opcode },
3117 { "popcntS", { Gv, Ev } },
3118 },
3119
3120 /* PREFIX_0FBC */
3121 {
3122 { "bsfS", { Gv, Ev } },
3123 { "tzcntS", { Gv, Ev } },
3124 { "bsfS", { Gv, Ev } },
3125 },
3126
3127 /* PREFIX_0FBD */
3128 {
3129 { "bsrS", { Gv, Ev } },
3130 { "lzcntS", { Gv, Ev } },
3131 { "bsrS", { Gv, Ev } },
3132 },
3133
3134 /* PREFIX_0FC2 */
3135 {
3136 { "cmpps", { XM, EXx, CMP } },
3137 { "cmpss", { XM, EXd, CMP } },
3138 { "cmppd", { XM, EXx, CMP } },
3139 { "cmpsd", { XM, EXq, CMP } },
3140 },
3141
3142 /* PREFIX_0FC3 */
3143 {
3144 { "movntiS", { Ma, Gv } },
3145 },
3146
3147 /* PREFIX_0FC7_REG_6 */
3148 {
3149 { "vmptrld",{ Mq } },
3150 { "vmxon", { Mq } },
3151 { "vmclear",{ Mq } },
3152 },
3153
3154 /* PREFIX_0FD0 */
3155 {
3156 { Bad_Opcode },
3157 { Bad_Opcode },
3158 { "addsubpd", { XM, EXx } },
3159 { "addsubps", { XM, EXx } },
3160 },
3161
3162 /* PREFIX_0FD6 */
3163 {
3164 { Bad_Opcode },
3165 { "movq2dq",{ XM, MS } },
3166 { "movq", { EXqS, XM } },
3167 { "movdq2q",{ MX, XS } },
3168 },
3169
3170 /* PREFIX_0FE6 */
3171 {
3172 { Bad_Opcode },
3173 { "cvtdq2pd", { XM, EXq } },
3174 { "cvttpd2dq", { XM, EXx } },
3175 { "cvtpd2dq", { XM, EXx } },
3176 },
3177
3178 /* PREFIX_0FE7 */
3179 {
3180 { "movntq", { Mq, MX } },
3181 { Bad_Opcode },
3182 { MOD_TABLE (MOD_0FE7_PREFIX_2) },
3183 },
3184
3185 /* PREFIX_0FF0 */
3186 {
3187 { Bad_Opcode },
3188 { Bad_Opcode },
3189 { Bad_Opcode },
3190 { MOD_TABLE (MOD_0FF0_PREFIX_3) },
3191 },
3192
3193 /* PREFIX_0FF7 */
3194 {
3195 { "maskmovq", { MX, MS } },
3196 { Bad_Opcode },
3197 { "maskmovdqu", { XM, XS } },
3198 },
3199
3200 /* PREFIX_0F3810 */
3201 {
3202 { Bad_Opcode },
3203 { Bad_Opcode },
3204 { "pblendvb", { XM, EXx, XMM0 } },
3205 },
3206
3207 /* PREFIX_0F3814 */
3208 {
3209 { Bad_Opcode },
3210 { Bad_Opcode },
3211 { "blendvps", { XM, EXx, XMM0 } },
3212 },
3213
3214 /* PREFIX_0F3815 */
3215 {
3216 { Bad_Opcode },
3217 { Bad_Opcode },
3218 { "blendvpd", { XM, EXx, XMM0 } },
3219 },
3220
3221 /* PREFIX_0F3817 */
3222 {
3223 { Bad_Opcode },
3224 { Bad_Opcode },
3225 { "ptest", { XM, EXx } },
3226 },
3227
3228 /* PREFIX_0F3820 */
3229 {
3230 { Bad_Opcode },
3231 { Bad_Opcode },
3232 { "pmovsxbw", { XM, EXq } },
3233 },
3234
3235 /* PREFIX_0F3821 */
3236 {
3237 { Bad_Opcode },
3238 { Bad_Opcode },
3239 { "pmovsxbd", { XM, EXd } },
3240 },
3241
3242 /* PREFIX_0F3822 */
3243 {
3244 { Bad_Opcode },
3245 { Bad_Opcode },
3246 { "pmovsxbq", { XM, EXw } },
3247 },
3248
3249 /* PREFIX_0F3823 */
3250 {
3251 { Bad_Opcode },
3252 { Bad_Opcode },
3253 { "pmovsxwd", { XM, EXq } },
3254 },
3255
3256 /* PREFIX_0F3824 */
3257 {
3258 { Bad_Opcode },
3259 { Bad_Opcode },
3260 { "pmovsxwq", { XM, EXd } },
3261 },
3262
3263 /* PREFIX_0F3825 */
3264 {
3265 { Bad_Opcode },
3266 { Bad_Opcode },
3267 { "pmovsxdq", { XM, EXq } },
3268 },
3269
3270 /* PREFIX_0F3828 */
3271 {
3272 { Bad_Opcode },
3273 { Bad_Opcode },
3274 { "pmuldq", { XM, EXx } },
3275 },
3276
3277 /* PREFIX_0F3829 */
3278 {
3279 { Bad_Opcode },
3280 { Bad_Opcode },
3281 { "pcmpeqq", { XM, EXx } },
3282 },
3283
3284 /* PREFIX_0F382A */
3285 {
3286 { Bad_Opcode },
3287 { Bad_Opcode },
3288 { MOD_TABLE (MOD_0F382A_PREFIX_2) },
3289 },
3290
3291 /* PREFIX_0F382B */
3292 {
3293 { Bad_Opcode },
3294 { Bad_Opcode },
3295 { "packusdw", { XM, EXx } },
3296 },
3297
3298 /* PREFIX_0F3830 */
3299 {
3300 { Bad_Opcode },
3301 { Bad_Opcode },
3302 { "pmovzxbw", { XM, EXq } },
3303 },
3304
3305 /* PREFIX_0F3831 */
3306 {
3307 { Bad_Opcode },
3308 { Bad_Opcode },
3309 { "pmovzxbd", { XM, EXd } },
3310 },
3311
3312 /* PREFIX_0F3832 */
3313 {
3314 { Bad_Opcode },
3315 { Bad_Opcode },
3316 { "pmovzxbq", { XM, EXw } },
3317 },
3318
3319 /* PREFIX_0F3833 */
3320 {
3321 { Bad_Opcode },
3322 { Bad_Opcode },
3323 { "pmovzxwd", { XM, EXq } },
3324 },
3325
3326 /* PREFIX_0F3834 */
3327 {
3328 { Bad_Opcode },
3329 { Bad_Opcode },
3330 { "pmovzxwq", { XM, EXd } },
3331 },
3332
3333 /* PREFIX_0F3835 */
3334 {
3335 { Bad_Opcode },
3336 { Bad_Opcode },
3337 { "pmovzxdq", { XM, EXq } },
3338 },
3339
3340 /* PREFIX_0F3837 */
3341 {
3342 { Bad_Opcode },
3343 { Bad_Opcode },
3344 { "pcmpgtq", { XM, EXx } },
3345 },
3346
3347 /* PREFIX_0F3838 */
3348 {
3349 { Bad_Opcode },
3350 { Bad_Opcode },
3351 { "pminsb", { XM, EXx } },
3352 },
3353
3354 /* PREFIX_0F3839 */
3355 {
3356 { Bad_Opcode },
3357 { Bad_Opcode },
3358 { "pminsd", { XM, EXx } },
3359 },
3360
3361 /* PREFIX_0F383A */
3362 {
3363 { Bad_Opcode },
3364 { Bad_Opcode },
3365 { "pminuw", { XM, EXx } },
3366 },
3367
3368 /* PREFIX_0F383B */
3369 {
3370 { Bad_Opcode },
3371 { Bad_Opcode },
3372 { "pminud", { XM, EXx } },
3373 },
3374
3375 /* PREFIX_0F383C */
3376 {
3377 { Bad_Opcode },
3378 { Bad_Opcode },
3379 { "pmaxsb", { XM, EXx } },
3380 },
3381
3382 /* PREFIX_0F383D */
3383 {
3384 { Bad_Opcode },
3385 { Bad_Opcode },
3386 { "pmaxsd", { XM, EXx } },
3387 },
3388
3389 /* PREFIX_0F383E */
3390 {
3391 { Bad_Opcode },
3392 { Bad_Opcode },
3393 { "pmaxuw", { XM, EXx } },
3394 },
3395
3396 /* PREFIX_0F383F */
3397 {
3398 { Bad_Opcode },
3399 { Bad_Opcode },
3400 { "pmaxud", { XM, EXx } },
3401 },
3402
3403 /* PREFIX_0F3840 */
3404 {
3405 { Bad_Opcode },
3406 { Bad_Opcode },
3407 { "pmulld", { XM, EXx } },
3408 },
3409
3410 /* PREFIX_0F3841 */
3411 {
3412 { Bad_Opcode },
3413 { Bad_Opcode },
3414 { "phminposuw", { XM, EXx } },
3415 },
3416
3417 /* PREFIX_0F3880 */
3418 {
3419 { Bad_Opcode },
3420 { Bad_Opcode },
3421 { "invept", { Gm, Mo } },
3422 },
3423
3424 /* PREFIX_0F3881 */
3425 {
3426 { Bad_Opcode },
3427 { Bad_Opcode },
3428 { "invvpid", { Gm, Mo } },
3429 },
3430
3431 /* PREFIX_0F3882 */
3432 {
3433 { Bad_Opcode },
3434 { Bad_Opcode },
3435 { "invpcid", { Gm, M } },
3436 },
3437
3438 /* PREFIX_0F38DB */
3439 {
3440 { Bad_Opcode },
3441 { Bad_Opcode },
3442 { "aesimc", { XM, EXx } },
3443 },
3444
3445 /* PREFIX_0F38DC */
3446 {
3447 { Bad_Opcode },
3448 { Bad_Opcode },
3449 { "aesenc", { XM, EXx } },
3450 },
3451
3452 /* PREFIX_0F38DD */
3453 {
3454 { Bad_Opcode },
3455 { Bad_Opcode },
3456 { "aesenclast", { XM, EXx } },
3457 },
3458
3459 /* PREFIX_0F38DE */
3460 {
3461 { Bad_Opcode },
3462 { Bad_Opcode },
3463 { "aesdec", { XM, EXx } },
3464 },
3465
3466 /* PREFIX_0F38DF */
3467 {
3468 { Bad_Opcode },
3469 { Bad_Opcode },
3470 { "aesdeclast", { XM, EXx } },
3471 },
3472
3473 /* PREFIX_0F38F0 */
3474 {
3475 { "movbeS", { Gv, { MOVBE_Fixup, v_mode } } },
3476 { Bad_Opcode },
3477 { "movbeS", { Gv, { MOVBE_Fixup, v_mode } } },
3478 { "crc32", { Gdq, { CRC32_Fixup, b_mode } } },
3479 },
3480
3481 /* PREFIX_0F38F1 */
3482 {
3483 { "movbeS", { { MOVBE_Fixup, v_mode }, Gv } },
3484 { Bad_Opcode },
3485 { "movbeS", { { MOVBE_Fixup, v_mode }, Gv } },
3486 { "crc32", { Gdq, { CRC32_Fixup, v_mode } } },
3487 },
3488
3489 /* PREFIX_0F38F6 */
3490 {
3491 { Bad_Opcode },
3492 { "adoxS", { Gdq, Edq} },
3493 { "adcxS", { Gdq, Edq} },
3494 { Bad_Opcode },
3495 },
3496
3497 /* PREFIX_0F3A08 */
3498 {
3499 { Bad_Opcode },
3500 { Bad_Opcode },
3501 { "roundps", { XM, EXx, Ib } },
3502 },
3503
3504 /* PREFIX_0F3A09 */
3505 {
3506 { Bad_Opcode },
3507 { Bad_Opcode },
3508 { "roundpd", { XM, EXx, Ib } },
3509 },
3510
3511 /* PREFIX_0F3A0A */
3512 {
3513 { Bad_Opcode },
3514 { Bad_Opcode },
3515 { "roundss", { XM, EXd, Ib } },
3516 },
3517
3518 /* PREFIX_0F3A0B */
3519 {
3520 { Bad_Opcode },
3521 { Bad_Opcode },
3522 { "roundsd", { XM, EXq, Ib } },
3523 },
3524
3525 /* PREFIX_0F3A0C */
3526 {
3527 { Bad_Opcode },
3528 { Bad_Opcode },
3529 { "blendps", { XM, EXx, Ib } },
3530 },
3531
3532 /* PREFIX_0F3A0D */
3533 {
3534 { Bad_Opcode },
3535 { Bad_Opcode },
3536 { "blendpd", { XM, EXx, Ib } },
3537 },
3538
3539 /* PREFIX_0F3A0E */
3540 {
3541 { Bad_Opcode },
3542 { Bad_Opcode },
3543 { "pblendw", { XM, EXx, Ib } },
3544 },
3545
3546 /* PREFIX_0F3A14 */
3547 {
3548 { Bad_Opcode },
3549 { Bad_Opcode },
3550 { "pextrb", { Edqb, XM, Ib } },
3551 },
3552
3553 /* PREFIX_0F3A15 */
3554 {
3555 { Bad_Opcode },
3556 { Bad_Opcode },
3557 { "pextrw", { Edqw, XM, Ib } },
3558 },
3559
3560 /* PREFIX_0F3A16 */
3561 {
3562 { Bad_Opcode },
3563 { Bad_Opcode },
3564 { "pextrK", { Edq, XM, Ib } },
3565 },
3566
3567 /* PREFIX_0F3A17 */
3568 {
3569 { Bad_Opcode },
3570 { Bad_Opcode },
3571 { "extractps", { Edqd, XM, Ib } },
3572 },
3573
3574 /* PREFIX_0F3A20 */
3575 {
3576 { Bad_Opcode },
3577 { Bad_Opcode },
3578 { "pinsrb", { XM, Edqb, Ib } },
3579 },
3580
3581 /* PREFIX_0F3A21 */
3582 {
3583 { Bad_Opcode },
3584 { Bad_Opcode },
3585 { "insertps", { XM, EXd, Ib } },
3586 },
3587
3588 /* PREFIX_0F3A22 */
3589 {
3590 { Bad_Opcode },
3591 { Bad_Opcode },
3592 { "pinsrK", { XM, Edq, Ib } },
3593 },
3594
3595 /* PREFIX_0F3A40 */
3596 {
3597 { Bad_Opcode },
3598 { Bad_Opcode },
3599 { "dpps", { XM, EXx, Ib } },
3600 },
3601
3602 /* PREFIX_0F3A41 */
3603 {
3604 { Bad_Opcode },
3605 { Bad_Opcode },
3606 { "dppd", { XM, EXx, Ib } },
3607 },
3608
3609 /* PREFIX_0F3A42 */
3610 {
3611 { Bad_Opcode },
3612 { Bad_Opcode },
3613 { "mpsadbw", { XM, EXx, Ib } },
3614 },
3615
3616 /* PREFIX_0F3A44 */
3617 {
3618 { Bad_Opcode },
3619 { Bad_Opcode },
3620 { "pclmulqdq", { XM, EXx, PCLMUL } },
3621 },
3622
3623 /* PREFIX_0F3A60 */
3624 {
3625 { Bad_Opcode },
3626 { Bad_Opcode },
3627 { "pcmpestrm", { XM, EXx, Ib } },
3628 },
3629
3630 /* PREFIX_0F3A61 */
3631 {
3632 { Bad_Opcode },
3633 { Bad_Opcode },
3634 { "pcmpestri", { XM, EXx, Ib } },
3635 },
3636
3637 /* PREFIX_0F3A62 */
3638 {
3639 { Bad_Opcode },
3640 { Bad_Opcode },
3641 { "pcmpistrm", { XM, EXx, Ib } },
3642 },
3643
3644 /* PREFIX_0F3A63 */
3645 {
3646 { Bad_Opcode },
3647 { Bad_Opcode },
3648 { "pcmpistri", { XM, EXx, Ib } },
3649 },
3650
3651 /* PREFIX_0F3ADF */
3652 {
3653 { Bad_Opcode },
3654 { Bad_Opcode },
3655 { "aeskeygenassist", { XM, EXx, Ib } },
3656 },
3657
3658 /* PREFIX_VEX_0F10 */
3659 {
3660 { VEX_W_TABLE (VEX_W_0F10_P_0) },
3661 { VEX_LEN_TABLE (VEX_LEN_0F10_P_1) },
3662 { VEX_W_TABLE (VEX_W_0F10_P_2) },
3663 { VEX_LEN_TABLE (VEX_LEN_0F10_P_3) },
3664 },
3665
3666 /* PREFIX_VEX_0F11 */
3667 {
3668 { VEX_W_TABLE (VEX_W_0F11_P_0) },
3669 { VEX_LEN_TABLE (VEX_LEN_0F11_P_1) },
3670 { VEX_W_TABLE (VEX_W_0F11_P_2) },
3671 { VEX_LEN_TABLE (VEX_LEN_0F11_P_3) },
3672 },
3673
3674 /* PREFIX_VEX_0F12 */
3675 {
3676 { MOD_TABLE (MOD_VEX_0F12_PREFIX_0) },
3677 { VEX_W_TABLE (VEX_W_0F12_P_1) },
3678 { VEX_LEN_TABLE (VEX_LEN_0F12_P_2) },
3679 { VEX_W_TABLE (VEX_W_0F12_P_3) },
3680 },
3681
3682 /* PREFIX_VEX_0F16 */
3683 {
3684 { MOD_TABLE (MOD_VEX_0F16_PREFIX_0) },
3685 { VEX_W_TABLE (VEX_W_0F16_P_1) },
3686 { VEX_LEN_TABLE (VEX_LEN_0F16_P_2) },
3687 },
3688
3689 /* PREFIX_VEX_0F2A */
3690 {
3691 { Bad_Opcode },
3692 { VEX_LEN_TABLE (VEX_LEN_0F2A_P_1) },
3693 { Bad_Opcode },
3694 { VEX_LEN_TABLE (VEX_LEN_0F2A_P_3) },
3695 },
3696
3697 /* PREFIX_VEX_0F2C */
3698 {
3699 { Bad_Opcode },
3700 { VEX_LEN_TABLE (VEX_LEN_0F2C_P_1) },
3701 { Bad_Opcode },
3702 { VEX_LEN_TABLE (VEX_LEN_0F2C_P_3) },
3703 },
3704
3705 /* PREFIX_VEX_0F2D */
3706 {
3707 { Bad_Opcode },
3708 { VEX_LEN_TABLE (VEX_LEN_0F2D_P_1) },
3709 { Bad_Opcode },
3710 { VEX_LEN_TABLE (VEX_LEN_0F2D_P_3) },
3711 },
3712
3713 /* PREFIX_VEX_0F2E */
3714 {
3715 { VEX_LEN_TABLE (VEX_LEN_0F2E_P_0) },
3716 { Bad_Opcode },
3717 { VEX_LEN_TABLE (VEX_LEN_0F2E_P_2) },
3718 },
3719
3720 /* PREFIX_VEX_0F2F */
3721 {
3722 { VEX_LEN_TABLE (VEX_LEN_0F2F_P_0) },
3723 { Bad_Opcode },
3724 { VEX_LEN_TABLE (VEX_LEN_0F2F_P_2) },
3725 },
3726
3727 /* PREFIX_VEX_0F51 */
3728 {
3729 { VEX_W_TABLE (VEX_W_0F51_P_0) },
3730 { VEX_LEN_TABLE (VEX_LEN_0F51_P_1) },
3731 { VEX_W_TABLE (VEX_W_0F51_P_2) },
3732 { VEX_LEN_TABLE (VEX_LEN_0F51_P_3) },
3733 },
3734
3735 /* PREFIX_VEX_0F52 */
3736 {
3737 { VEX_W_TABLE (VEX_W_0F52_P_0) },
3738 { VEX_LEN_TABLE (VEX_LEN_0F52_P_1) },
3739 },
3740
3741 /* PREFIX_VEX_0F53 */
3742 {
3743 { VEX_W_TABLE (VEX_W_0F53_P_0) },
3744 { VEX_LEN_TABLE (VEX_LEN_0F53_P_1) },
3745 },
3746
3747 /* PREFIX_VEX_0F58 */
3748 {
3749 { VEX_W_TABLE (VEX_W_0F58_P_0) },
3750 { VEX_LEN_TABLE (VEX_LEN_0F58_P_1) },
3751 { VEX_W_TABLE (VEX_W_0F58_P_2) },
3752 { VEX_LEN_TABLE (VEX_LEN_0F58_P_3) },
3753 },
3754
3755 /* PREFIX_VEX_0F59 */
3756 {
3757 { VEX_W_TABLE (VEX_W_0F59_P_0) },
3758 { VEX_LEN_TABLE (VEX_LEN_0F59_P_1) },
3759 { VEX_W_TABLE (VEX_W_0F59_P_2) },
3760 { VEX_LEN_TABLE (VEX_LEN_0F59_P_3) },
3761 },
3762
3763 /* PREFIX_VEX_0F5A */
3764 {
3765 { VEX_W_TABLE (VEX_W_0F5A_P_0) },
3766 { VEX_LEN_TABLE (VEX_LEN_0F5A_P_1) },
3767 { "vcvtpd2ps%XY", { XMM, EXx } },
3768 { VEX_LEN_TABLE (VEX_LEN_0F5A_P_3) },
3769 },
3770
3771 /* PREFIX_VEX_0F5B */
3772 {
3773 { VEX_W_TABLE (VEX_W_0F5B_P_0) },
3774 { VEX_W_TABLE (VEX_W_0F5B_P_1) },
3775 { VEX_W_TABLE (VEX_W_0F5B_P_2) },
3776 },
3777
3778 /* PREFIX_VEX_0F5C */
3779 {
3780 { VEX_W_TABLE (VEX_W_0F5C_P_0) },
3781 { VEX_LEN_TABLE (VEX_LEN_0F5C_P_1) },
3782 { VEX_W_TABLE (VEX_W_0F5C_P_2) },
3783 { VEX_LEN_TABLE (VEX_LEN_0F5C_P_3) },
3784 },
3785
3786 /* PREFIX_VEX_0F5D */
3787 {
3788 { VEX_W_TABLE (VEX_W_0F5D_P_0) },
3789 { VEX_LEN_TABLE (VEX_LEN_0F5D_P_1) },
3790 { VEX_W_TABLE (VEX_W_0F5D_P_2) },
3791 { VEX_LEN_TABLE (VEX_LEN_0F5D_P_3) },
3792 },
3793
3794 /* PREFIX_VEX_0F5E */
3795 {
3796 { VEX_W_TABLE (VEX_W_0F5E_P_0) },
3797 { VEX_LEN_TABLE (VEX_LEN_0F5E_P_1) },
3798 { VEX_W_TABLE (VEX_W_0F5E_P_2) },
3799 { VEX_LEN_TABLE (VEX_LEN_0F5E_P_3) },
3800 },
3801
3802 /* PREFIX_VEX_0F5F */
3803 {
3804 { VEX_W_TABLE (VEX_W_0F5F_P_0) },
3805 { VEX_LEN_TABLE (VEX_LEN_0F5F_P_1) },
3806 { VEX_W_TABLE (VEX_W_0F5F_P_2) },
3807 { VEX_LEN_TABLE (VEX_LEN_0F5F_P_3) },
3808 },
3809
3810 /* PREFIX_VEX_0F60 */
3811 {
3812 { Bad_Opcode },
3813 { Bad_Opcode },
3814 { VEX_W_TABLE (VEX_W_0F60_P_2) },
3815 },
3816
3817 /* PREFIX_VEX_0F61 */
3818 {
3819 { Bad_Opcode },
3820 { Bad_Opcode },
3821 { VEX_W_TABLE (VEX_W_0F61_P_2) },
3822 },
3823
3824 /* PREFIX_VEX_0F62 */
3825 {
3826 { Bad_Opcode },
3827 { Bad_Opcode },
3828 { VEX_W_TABLE (VEX_W_0F62_P_2) },
3829 },
3830
3831 /* PREFIX_VEX_0F63 */
3832 {
3833 { Bad_Opcode },
3834 { Bad_Opcode },
3835 { VEX_W_TABLE (VEX_W_0F63_P_2) },
3836 },
3837
3838 /* PREFIX_VEX_0F64 */
3839 {
3840 { Bad_Opcode },
3841 { Bad_Opcode },
3842 { VEX_W_TABLE (VEX_W_0F64_P_2) },
3843 },
3844
3845 /* PREFIX_VEX_0F65 */
3846 {
3847 { Bad_Opcode },
3848 { Bad_Opcode },
3849 { VEX_W_TABLE (VEX_W_0F65_P_2) },
3850 },
3851
3852 /* PREFIX_VEX_0F66 */
3853 {
3854 { Bad_Opcode },
3855 { Bad_Opcode },
3856 { VEX_W_TABLE (VEX_W_0F66_P_2) },
3857 },
3858
3859 /* PREFIX_VEX_0F67 */
3860 {
3861 { Bad_Opcode },
3862 { Bad_Opcode },
3863 { VEX_W_TABLE (VEX_W_0F67_P_2) },
3864 },
3865
3866 /* PREFIX_VEX_0F68 */
3867 {
3868 { Bad_Opcode },
3869 { Bad_Opcode },
3870 { VEX_W_TABLE (VEX_W_0F68_P_2) },
3871 },
3872
3873 /* PREFIX_VEX_0F69 */
3874 {
3875 { Bad_Opcode },
3876 { Bad_Opcode },
3877 { VEX_W_TABLE (VEX_W_0F69_P_2) },
3878 },
3879
3880 /* PREFIX_VEX_0F6A */
3881 {
3882 { Bad_Opcode },
3883 { Bad_Opcode },
3884 { VEX_W_TABLE (VEX_W_0F6A_P_2) },
3885 },
3886
3887 /* PREFIX_VEX_0F6B */
3888 {
3889 { Bad_Opcode },
3890 { Bad_Opcode },
3891 { VEX_W_TABLE (VEX_W_0F6B_P_2) },
3892 },
3893
3894 /* PREFIX_VEX_0F6C */
3895 {
3896 { Bad_Opcode },
3897 { Bad_Opcode },
3898 { VEX_W_TABLE (VEX_W_0F6C_P_2) },
3899 },
3900
3901 /* PREFIX_VEX_0F6D */
3902 {
3903 { Bad_Opcode },
3904 { Bad_Opcode },
3905 { VEX_W_TABLE (VEX_W_0F6D_P_2) },
3906 },
3907
3908 /* PREFIX_VEX_0F6E */
3909 {
3910 { Bad_Opcode },
3911 { Bad_Opcode },
3912 { VEX_LEN_TABLE (VEX_LEN_0F6E_P_2) },
3913 },
3914
3915 /* PREFIX_VEX_0F6F */
3916 {
3917 { Bad_Opcode },
3918 { VEX_W_TABLE (VEX_W_0F6F_P_1) },
3919 { VEX_W_TABLE (VEX_W_0F6F_P_2) },
3920 },
3921
3922 /* PREFIX_VEX_0F70 */
3923 {
3924 { Bad_Opcode },
3925 { VEX_W_TABLE (VEX_W_0F70_P_1) },
3926 { VEX_W_TABLE (VEX_W_0F70_P_2) },
3927 { VEX_W_TABLE (VEX_W_0F70_P_3) },
3928 },
3929
3930 /* PREFIX_VEX_0F71_REG_2 */
3931 {
3932 { Bad_Opcode },
3933 { Bad_Opcode },
3934 { VEX_W_TABLE (VEX_W_0F71_R_2_P_2) },
3935 },
3936
3937 /* PREFIX_VEX_0F71_REG_4 */
3938 {
3939 { Bad_Opcode },
3940 { Bad_Opcode },
3941 { VEX_W_TABLE (VEX_W_0F71_R_4_P_2) },
3942 },
3943
3944 /* PREFIX_VEX_0F71_REG_6 */
3945 {
3946 { Bad_Opcode },
3947 { Bad_Opcode },
3948 { VEX_W_TABLE (VEX_W_0F71_R_6_P_2) },
3949 },
3950
3951 /* PREFIX_VEX_0F72_REG_2 */
3952 {
3953 { Bad_Opcode },
3954 { Bad_Opcode },
3955 { VEX_W_TABLE (VEX_W_0F72_R_2_P_2) },
3956 },
3957
3958 /* PREFIX_VEX_0F72_REG_4 */
3959 {
3960 { Bad_Opcode },
3961 { Bad_Opcode },
3962 { VEX_W_TABLE (VEX_W_0F72_R_4_P_2) },
3963 },
3964
3965 /* PREFIX_VEX_0F72_REG_6 */
3966 {
3967 { Bad_Opcode },
3968 { Bad_Opcode },
3969 { VEX_W_TABLE (VEX_W_0F72_R_6_P_2) },
3970 },
3971
3972 /* PREFIX_VEX_0F73_REG_2 */
3973 {
3974 { Bad_Opcode },
3975 { Bad_Opcode },
3976 { VEX_W_TABLE (VEX_W_0F73_R_2_P_2) },
3977 },
3978
3979 /* PREFIX_VEX_0F73_REG_3 */
3980 {
3981 { Bad_Opcode },
3982 { Bad_Opcode },
3983 { VEX_W_TABLE (VEX_W_0F73_R_3_P_2) },
3984 },
3985
3986 /* PREFIX_VEX_0F73_REG_6 */
3987 {
3988 { Bad_Opcode },
3989 { Bad_Opcode },
3990 { VEX_W_TABLE (VEX_W_0F73_R_6_P_2) },
3991 },
3992
3993 /* PREFIX_VEX_0F73_REG_7 */
3994 {
3995 { Bad_Opcode },
3996 { Bad_Opcode },
3997 { VEX_W_TABLE (VEX_W_0F73_R_7_P_2) },
3998 },
3999
4000 /* PREFIX_VEX_0F74 */
4001 {
4002 { Bad_Opcode },
4003 { Bad_Opcode },
4004 { VEX_W_TABLE (VEX_W_0F74_P_2) },
4005 },
4006
4007 /* PREFIX_VEX_0F75 */
4008 {
4009 { Bad_Opcode },
4010 { Bad_Opcode },
4011 { VEX_W_TABLE (VEX_W_0F75_P_2) },
4012 },
4013
4014 /* PREFIX_VEX_0F76 */
4015 {
4016 { Bad_Opcode },
4017 { Bad_Opcode },
4018 { VEX_W_TABLE (VEX_W_0F76_P_2) },
4019 },
4020
4021 /* PREFIX_VEX_0F77 */
4022 {
4023 { VEX_W_TABLE (VEX_W_0F77_P_0) },
4024 },
4025
4026 /* PREFIX_VEX_0F7C */
4027 {
4028 { Bad_Opcode },
4029 { Bad_Opcode },
4030 { VEX_W_TABLE (VEX_W_0F7C_P_2) },
4031 { VEX_W_TABLE (VEX_W_0F7C_P_3) },
4032 },
4033
4034 /* PREFIX_VEX_0F7D */
4035 {
4036 { Bad_Opcode },
4037 { Bad_Opcode },
4038 { VEX_W_TABLE (VEX_W_0F7D_P_2) },
4039 { VEX_W_TABLE (VEX_W_0F7D_P_3) },
4040 },
4041
4042 /* PREFIX_VEX_0F7E */
4043 {
4044 { Bad_Opcode },
4045 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_1) },
4046 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_2) },
4047 },
4048
4049 /* PREFIX_VEX_0F7F */
4050 {
4051 { Bad_Opcode },
4052 { VEX_W_TABLE (VEX_W_0F7F_P_1) },
4053 { VEX_W_TABLE (VEX_W_0F7F_P_2) },
4054 },
4055
4056 /* PREFIX_VEX_0FC2 */
4057 {
4058 { VEX_W_TABLE (VEX_W_0FC2_P_0) },
4059 { VEX_LEN_TABLE (VEX_LEN_0FC2_P_1) },
4060 { VEX_W_TABLE (VEX_W_0FC2_P_2) },
4061 { VEX_LEN_TABLE (VEX_LEN_0FC2_P_3) },
4062 },
4063
4064 /* PREFIX_VEX_0FC4 */
4065 {
4066 { Bad_Opcode },
4067 { Bad_Opcode },
4068 { VEX_LEN_TABLE (VEX_LEN_0FC4_P_2) },
4069 },
4070
4071 /* PREFIX_VEX_0FC5 */
4072 {
4073 { Bad_Opcode },
4074 { Bad_Opcode },
4075 { VEX_LEN_TABLE (VEX_LEN_0FC5_P_2) },
4076 },
4077
4078 /* PREFIX_VEX_0FD0 */
4079 {
4080 { Bad_Opcode },
4081 { Bad_Opcode },
4082 { VEX_W_TABLE (VEX_W_0FD0_P_2) },
4083 { VEX_W_TABLE (VEX_W_0FD0_P_3) },
4084 },
4085
4086 /* PREFIX_VEX_0FD1 */
4087 {
4088 { Bad_Opcode },
4089 { Bad_Opcode },
4090 { VEX_W_TABLE (VEX_W_0FD1_P_2) },
4091 },
4092
4093 /* PREFIX_VEX_0FD2 */
4094 {
4095 { Bad_Opcode },
4096 { Bad_Opcode },
4097 { VEX_W_TABLE (VEX_W_0FD2_P_2) },
4098 },
4099
4100 /* PREFIX_VEX_0FD3 */
4101 {
4102 { Bad_Opcode },
4103 { Bad_Opcode },
4104 { VEX_W_TABLE (VEX_W_0FD3_P_2) },
4105 },
4106
4107 /* PREFIX_VEX_0FD4 */
4108 {
4109 { Bad_Opcode },
4110 { Bad_Opcode },
4111 { VEX_W_TABLE (VEX_W_0FD4_P_2) },
4112 },
4113
4114 /* PREFIX_VEX_0FD5 */
4115 {
4116 { Bad_Opcode },
4117 { Bad_Opcode },
4118 { VEX_W_TABLE (VEX_W_0FD5_P_2) },
4119 },
4120
4121 /* PREFIX_VEX_0FD6 */
4122 {
4123 { Bad_Opcode },
4124 { Bad_Opcode },
4125 { VEX_LEN_TABLE (VEX_LEN_0FD6_P_2) },
4126 },
4127
4128 /* PREFIX_VEX_0FD7 */
4129 {
4130 { Bad_Opcode },
4131 { Bad_Opcode },
4132 { MOD_TABLE (MOD_VEX_0FD7_PREFIX_2) },
4133 },
4134
4135 /* PREFIX_VEX_0FD8 */
4136 {
4137 { Bad_Opcode },
4138 { Bad_Opcode },
4139 { VEX_W_TABLE (VEX_W_0FD8_P_2) },
4140 },
4141
4142 /* PREFIX_VEX_0FD9 */
4143 {
4144 { Bad_Opcode },
4145 { Bad_Opcode },
4146 { VEX_W_TABLE (VEX_W_0FD9_P_2) },
4147 },
4148
4149 /* PREFIX_VEX_0FDA */
4150 {
4151 { Bad_Opcode },
4152 { Bad_Opcode },
4153 { VEX_W_TABLE (VEX_W_0FDA_P_2) },
4154 },
4155
4156 /* PREFIX_VEX_0FDB */
4157 {
4158 { Bad_Opcode },
4159 { Bad_Opcode },
4160 { VEX_W_TABLE (VEX_W_0FDB_P_2) },
4161 },
4162
4163 /* PREFIX_VEX_0FDC */
4164 {
4165 { Bad_Opcode },
4166 { Bad_Opcode },
4167 { VEX_W_TABLE (VEX_W_0FDC_P_2) },
4168 },
4169
4170 /* PREFIX_VEX_0FDD */
4171 {
4172 { Bad_Opcode },
4173 { Bad_Opcode },
4174 { VEX_W_TABLE (VEX_W_0FDD_P_2) },
4175 },
4176
4177 /* PREFIX_VEX_0FDE */
4178 {
4179 { Bad_Opcode },
4180 { Bad_Opcode },
4181 { VEX_W_TABLE (VEX_W_0FDE_P_2) },
4182 },
4183
4184 /* PREFIX_VEX_0FDF */
4185 {
4186 { Bad_Opcode },
4187 { Bad_Opcode },
4188 { VEX_W_TABLE (VEX_W_0FDF_P_2) },
4189 },
4190
4191 /* PREFIX_VEX_0FE0 */
4192 {
4193 { Bad_Opcode },
4194 { Bad_Opcode },
4195 { VEX_W_TABLE (VEX_W_0FE0_P_2) },
4196 },
4197
4198 /* PREFIX_VEX_0FE1 */
4199 {
4200 { Bad_Opcode },
4201 { Bad_Opcode },
4202 { VEX_W_TABLE (VEX_W_0FE1_P_2) },
4203 },
4204
4205 /* PREFIX_VEX_0FE2 */
4206 {
4207 { Bad_Opcode },
4208 { Bad_Opcode },
4209 { VEX_W_TABLE (VEX_W_0FE2_P_2) },
4210 },
4211
4212 /* PREFIX_VEX_0FE3 */
4213 {
4214 { Bad_Opcode },
4215 { Bad_Opcode },
4216 { VEX_W_TABLE (VEX_W_0FE3_P_2) },
4217 },
4218
4219 /* PREFIX_VEX_0FE4 */
4220 {
4221 { Bad_Opcode },
4222 { Bad_Opcode },
4223 { VEX_W_TABLE (VEX_W_0FE4_P_2) },
4224 },
4225
4226 /* PREFIX_VEX_0FE5 */
4227 {
4228 { Bad_Opcode },
4229 { Bad_Opcode },
4230 { VEX_W_TABLE (VEX_W_0FE5_P_2) },
4231 },
4232
4233 /* PREFIX_VEX_0FE6 */
4234 {
4235 { Bad_Opcode },
4236 { VEX_W_TABLE (VEX_W_0FE6_P_1) },
4237 { VEX_W_TABLE (VEX_W_0FE6_P_2) },
4238 { VEX_W_TABLE (VEX_W_0FE6_P_3) },
4239 },
4240
4241 /* PREFIX_VEX_0FE7 */
4242 {
4243 { Bad_Opcode },
4244 { Bad_Opcode },
4245 { MOD_TABLE (MOD_VEX_0FE7_PREFIX_2) },
4246 },
4247
4248 /* PREFIX_VEX_0FE8 */
4249 {
4250 { Bad_Opcode },
4251 { Bad_Opcode },
4252 { VEX_W_TABLE (VEX_W_0FE8_P_2) },
4253 },
4254
4255 /* PREFIX_VEX_0FE9 */
4256 {
4257 { Bad_Opcode },
4258 { Bad_Opcode },
4259 { VEX_W_TABLE (VEX_W_0FE9_P_2) },
4260 },
4261
4262 /* PREFIX_VEX_0FEA */
4263 {
4264 { Bad_Opcode },
4265 { Bad_Opcode },
4266 { VEX_W_TABLE (VEX_W_0FEA_P_2) },
4267 },
4268
4269 /* PREFIX_VEX_0FEB */
4270 {
4271 { Bad_Opcode },
4272 { Bad_Opcode },
4273 { VEX_W_TABLE (VEX_W_0FEB_P_2) },
4274 },
4275
4276 /* PREFIX_VEX_0FEC */
4277 {
4278 { Bad_Opcode },
4279 { Bad_Opcode },
4280 { VEX_W_TABLE (VEX_W_0FEC_P_2) },
4281 },
4282
4283 /* PREFIX_VEX_0FED */
4284 {
4285 { Bad_Opcode },
4286 { Bad_Opcode },
4287 { VEX_W_TABLE (VEX_W_0FED_P_2) },
4288 },
4289
4290 /* PREFIX_VEX_0FEE */
4291 {
4292 { Bad_Opcode },
4293 { Bad_Opcode },
4294 { VEX_W_TABLE (VEX_W_0FEE_P_2) },
4295 },
4296
4297 /* PREFIX_VEX_0FEF */
4298 {
4299 { Bad_Opcode },
4300 { Bad_Opcode },
4301 { VEX_W_TABLE (VEX_W_0FEF_P_2) },
4302 },
4303
4304 /* PREFIX_VEX_0FF0 */
4305 {
4306 { Bad_Opcode },
4307 { Bad_Opcode },
4308 { Bad_Opcode },
4309 { MOD_TABLE (MOD_VEX_0FF0_PREFIX_3) },
4310 },
4311
4312 /* PREFIX_VEX_0FF1 */
4313 {
4314 { Bad_Opcode },
4315 { Bad_Opcode },
4316 { VEX_W_TABLE (VEX_W_0FF1_P_2) },
4317 },
4318
4319 /* PREFIX_VEX_0FF2 */
4320 {
4321 { Bad_Opcode },
4322 { Bad_Opcode },
4323 { VEX_W_TABLE (VEX_W_0FF2_P_2) },
4324 },
4325
4326 /* PREFIX_VEX_0FF3 */
4327 {
4328 { Bad_Opcode },
4329 { Bad_Opcode },
4330 { VEX_W_TABLE (VEX_W_0FF3_P_2) },
4331 },
4332
4333 /* PREFIX_VEX_0FF4 */
4334 {
4335 { Bad_Opcode },
4336 { Bad_Opcode },
4337 { VEX_W_TABLE (VEX_W_0FF4_P_2) },
4338 },
4339
4340 /* PREFIX_VEX_0FF5 */
4341 {
4342 { Bad_Opcode },
4343 { Bad_Opcode },
4344 { VEX_W_TABLE (VEX_W_0FF5_P_2) },
4345 },
4346
4347 /* PREFIX_VEX_0FF6 */
4348 {
4349 { Bad_Opcode },
4350 { Bad_Opcode },
4351 { VEX_W_TABLE (VEX_W_0FF6_P_2) },
4352 },
4353
4354 /* PREFIX_VEX_0FF7 */
4355 {
4356 { Bad_Opcode },
4357 { Bad_Opcode },
4358 { VEX_LEN_TABLE (VEX_LEN_0FF7_P_2) },
4359 },
4360
4361 /* PREFIX_VEX_0FF8 */
4362 {
4363 { Bad_Opcode },
4364 { Bad_Opcode },
4365 { VEX_W_TABLE (VEX_W_0FF8_P_2) },
4366 },
4367
4368 /* PREFIX_VEX_0FF9 */
4369 {
4370 { Bad_Opcode },
4371 { Bad_Opcode },
4372 { VEX_W_TABLE (VEX_W_0FF9_P_2) },
4373 },
4374
4375 /* PREFIX_VEX_0FFA */
4376 {
4377 { Bad_Opcode },
4378 { Bad_Opcode },
4379 { VEX_W_TABLE (VEX_W_0FFA_P_2) },
4380 },
4381
4382 /* PREFIX_VEX_0FFB */
4383 {
4384 { Bad_Opcode },
4385 { Bad_Opcode },
4386 { VEX_W_TABLE (VEX_W_0FFB_P_2) },
4387 },
4388
4389 /* PREFIX_VEX_0FFC */
4390 {
4391 { Bad_Opcode },
4392 { Bad_Opcode },
4393 { VEX_W_TABLE (VEX_W_0FFC_P_2) },
4394 },
4395
4396 /* PREFIX_VEX_0FFD */
4397 {
4398 { Bad_Opcode },
4399 { Bad_Opcode },
4400 { VEX_W_TABLE (VEX_W_0FFD_P_2) },
4401 },
4402
4403 /* PREFIX_VEX_0FFE */
4404 {
4405 { Bad_Opcode },
4406 { Bad_Opcode },
4407 { VEX_W_TABLE (VEX_W_0FFE_P_2) },
4408 },
4409
4410 /* PREFIX_VEX_0F3800 */
4411 {
4412 { Bad_Opcode },
4413 { Bad_Opcode },
4414 { VEX_W_TABLE (VEX_W_0F3800_P_2) },
4415 },
4416
4417 /* PREFIX_VEX_0F3801 */
4418 {
4419 { Bad_Opcode },
4420 { Bad_Opcode },
4421 { VEX_W_TABLE (VEX_W_0F3801_P_2) },
4422 },
4423
4424 /* PREFIX_VEX_0F3802 */
4425 {
4426 { Bad_Opcode },
4427 { Bad_Opcode },
4428 { VEX_W_TABLE (VEX_W_0F3802_P_2) },
4429 },
4430
4431 /* PREFIX_VEX_0F3803 */
4432 {
4433 { Bad_Opcode },
4434 { Bad_Opcode },
4435 { VEX_W_TABLE (VEX_W_0F3803_P_2) },
4436 },
4437
4438 /* PREFIX_VEX_0F3804 */
4439 {
4440 { Bad_Opcode },
4441 { Bad_Opcode },
4442 { VEX_W_TABLE (VEX_W_0F3804_P_2) },
4443 },
4444
4445 /* PREFIX_VEX_0F3805 */
4446 {
4447 { Bad_Opcode },
4448 { Bad_Opcode },
4449 { VEX_W_TABLE (VEX_W_0F3805_P_2) },
4450 },
4451
4452 /* PREFIX_VEX_0F3806 */
4453 {
4454 { Bad_Opcode },
4455 { Bad_Opcode },
4456 { VEX_W_TABLE (VEX_W_0F3806_P_2) },
4457 },
4458
4459 /* PREFIX_VEX_0F3807 */
4460 {
4461 { Bad_Opcode },
4462 { Bad_Opcode },
4463 { VEX_W_TABLE (VEX_W_0F3807_P_2) },
4464 },
4465
4466 /* PREFIX_VEX_0F3808 */
4467 {
4468 { Bad_Opcode },
4469 { Bad_Opcode },
4470 { VEX_W_TABLE (VEX_W_0F3808_P_2) },
4471 },
4472
4473 /* PREFIX_VEX_0F3809 */
4474 {
4475 { Bad_Opcode },
4476 { Bad_Opcode },
4477 { VEX_W_TABLE (VEX_W_0F3809_P_2) },
4478 },
4479
4480 /* PREFIX_VEX_0F380A */
4481 {
4482 { Bad_Opcode },
4483 { Bad_Opcode },
4484 { VEX_W_TABLE (VEX_W_0F380A_P_2) },
4485 },
4486
4487 /* PREFIX_VEX_0F380B */
4488 {
4489 { Bad_Opcode },
4490 { Bad_Opcode },
4491 { VEX_W_TABLE (VEX_W_0F380B_P_2) },
4492 },
4493
4494 /* PREFIX_VEX_0F380C */
4495 {
4496 { Bad_Opcode },
4497 { Bad_Opcode },
4498 { VEX_W_TABLE (VEX_W_0F380C_P_2) },
4499 },
4500
4501 /* PREFIX_VEX_0F380D */
4502 {
4503 { Bad_Opcode },
4504 { Bad_Opcode },
4505 { VEX_W_TABLE (VEX_W_0F380D_P_2) },
4506 },
4507
4508 /* PREFIX_VEX_0F380E */
4509 {
4510 { Bad_Opcode },
4511 { Bad_Opcode },
4512 { VEX_W_TABLE (VEX_W_0F380E_P_2) },
4513 },
4514
4515 /* PREFIX_VEX_0F380F */
4516 {
4517 { Bad_Opcode },
4518 { Bad_Opcode },
4519 { VEX_W_TABLE (VEX_W_0F380F_P_2) },
4520 },
4521
4522 /* PREFIX_VEX_0F3813 */
4523 {
4524 { Bad_Opcode },
4525 { Bad_Opcode },
4526 { "vcvtph2ps", { XM, EXxmmq } },
4527 },
4528
4529 /* PREFIX_VEX_0F3816 */
4530 {
4531 { Bad_Opcode },
4532 { Bad_Opcode },
4533 { VEX_LEN_TABLE (VEX_LEN_0F3816_P_2) },
4534 },
4535
4536 /* PREFIX_VEX_0F3817 */
4537 {
4538 { Bad_Opcode },
4539 { Bad_Opcode },
4540 { VEX_W_TABLE (VEX_W_0F3817_P_2) },
4541 },
4542
4543 /* PREFIX_VEX_0F3818 */
4544 {
4545 { Bad_Opcode },
4546 { Bad_Opcode },
4547 { VEX_W_TABLE (VEX_W_0F3818_P_2) },
4548 },
4549
4550 /* PREFIX_VEX_0F3819 */
4551 {
4552 { Bad_Opcode },
4553 { Bad_Opcode },
4554 { VEX_LEN_TABLE (VEX_LEN_0F3819_P_2) },
4555 },
4556
4557 /* PREFIX_VEX_0F381A */
4558 {
4559 { Bad_Opcode },
4560 { Bad_Opcode },
4561 { MOD_TABLE (MOD_VEX_0F381A_PREFIX_2) },
4562 },
4563
4564 /* PREFIX_VEX_0F381C */
4565 {
4566 { Bad_Opcode },
4567 { Bad_Opcode },
4568 { VEX_W_TABLE (VEX_W_0F381C_P_2) },
4569 },
4570
4571 /* PREFIX_VEX_0F381D */
4572 {
4573 { Bad_Opcode },
4574 { Bad_Opcode },
4575 { VEX_W_TABLE (VEX_W_0F381D_P_2) },
4576 },
4577
4578 /* PREFIX_VEX_0F381E */
4579 {
4580 { Bad_Opcode },
4581 { Bad_Opcode },
4582 { VEX_W_TABLE (VEX_W_0F381E_P_2) },
4583 },
4584
4585 /* PREFIX_VEX_0F3820 */
4586 {
4587 { Bad_Opcode },
4588 { Bad_Opcode },
4589 { VEX_W_TABLE (VEX_W_0F3820_P_2) },
4590 },
4591
4592 /* PREFIX_VEX_0F3821 */
4593 {
4594 { Bad_Opcode },
4595 { Bad_Opcode },
4596 { VEX_W_TABLE (VEX_W_0F3821_P_2) },
4597 },
4598
4599 /* PREFIX_VEX_0F3822 */
4600 {
4601 { Bad_Opcode },
4602 { Bad_Opcode },
4603 { VEX_W_TABLE (VEX_W_0F3822_P_2) },
4604 },
4605
4606 /* PREFIX_VEX_0F3823 */
4607 {
4608 { Bad_Opcode },
4609 { Bad_Opcode },
4610 { VEX_W_TABLE (VEX_W_0F3823_P_2) },
4611 },
4612
4613 /* PREFIX_VEX_0F3824 */
4614 {
4615 { Bad_Opcode },
4616 { Bad_Opcode },
4617 { VEX_W_TABLE (VEX_W_0F3824_P_2) },
4618 },
4619
4620 /* PREFIX_VEX_0F3825 */
4621 {
4622 { Bad_Opcode },
4623 { Bad_Opcode },
4624 { VEX_W_TABLE (VEX_W_0F3825_P_2) },
4625 },
4626
4627 /* PREFIX_VEX_0F3828 */
4628 {
4629 { Bad_Opcode },
4630 { Bad_Opcode },
4631 { VEX_W_TABLE (VEX_W_0F3828_P_2) },
4632 },
4633
4634 /* PREFIX_VEX_0F3829 */
4635 {
4636 { Bad_Opcode },
4637 { Bad_Opcode },
4638 { VEX_W_TABLE (VEX_W_0F3829_P_2) },
4639 },
4640
4641 /* PREFIX_VEX_0F382A */
4642 {
4643 { Bad_Opcode },
4644 { Bad_Opcode },
4645 { MOD_TABLE (MOD_VEX_0F382A_PREFIX_2) },
4646 },
4647
4648 /* PREFIX_VEX_0F382B */
4649 {
4650 { Bad_Opcode },
4651 { Bad_Opcode },
4652 { VEX_W_TABLE (VEX_W_0F382B_P_2) },
4653 },
4654
4655 /* PREFIX_VEX_0F382C */
4656 {
4657 { Bad_Opcode },
4658 { Bad_Opcode },
4659 { MOD_TABLE (MOD_VEX_0F382C_PREFIX_2) },
4660 },
4661
4662 /* PREFIX_VEX_0F382D */
4663 {
4664 { Bad_Opcode },
4665 { Bad_Opcode },
4666 { MOD_TABLE (MOD_VEX_0F382D_PREFIX_2) },
4667 },
4668
4669 /* PREFIX_VEX_0F382E */
4670 {
4671 { Bad_Opcode },
4672 { Bad_Opcode },
4673 { MOD_TABLE (MOD_VEX_0F382E_PREFIX_2) },
4674 },
4675
4676 /* PREFIX_VEX_0F382F */
4677 {
4678 { Bad_Opcode },
4679 { Bad_Opcode },
4680 { MOD_TABLE (MOD_VEX_0F382F_PREFIX_2) },
4681 },
4682
4683 /* PREFIX_VEX_0F3830 */
4684 {
4685 { Bad_Opcode },
4686 { Bad_Opcode },
4687 { VEX_W_TABLE (VEX_W_0F3830_P_2) },
4688 },
4689
4690 /* PREFIX_VEX_0F3831 */
4691 {
4692 { Bad_Opcode },
4693 { Bad_Opcode },
4694 { VEX_W_TABLE (VEX_W_0F3831_P_2) },
4695 },
4696
4697 /* PREFIX_VEX_0F3832 */
4698 {
4699 { Bad_Opcode },
4700 { Bad_Opcode },
4701 { VEX_W_TABLE (VEX_W_0F3832_P_2) },
4702 },
4703
4704 /* PREFIX_VEX_0F3833 */
4705 {
4706 { Bad_Opcode },
4707 { Bad_Opcode },
4708 { VEX_W_TABLE (VEX_W_0F3833_P_2) },
4709 },
4710
4711 /* PREFIX_VEX_0F3834 */
4712 {
4713 { Bad_Opcode },
4714 { Bad_Opcode },
4715 { VEX_W_TABLE (VEX_W_0F3834_P_2) },
4716 },
4717
4718 /* PREFIX_VEX_0F3835 */
4719 {
4720 { Bad_Opcode },
4721 { Bad_Opcode },
4722 { VEX_W_TABLE (VEX_W_0F3835_P_2) },
4723 },
4724
4725 /* PREFIX_VEX_0F3836 */
4726 {
4727 { Bad_Opcode },
4728 { Bad_Opcode },
4729 { VEX_LEN_TABLE (VEX_LEN_0F3836_P_2) },
4730 },
4731
4732 /* PREFIX_VEX_0F3837 */
4733 {
4734 { Bad_Opcode },
4735 { Bad_Opcode },
4736 { VEX_W_TABLE (VEX_W_0F3837_P_2) },
4737 },
4738
4739 /* PREFIX_VEX_0F3838 */
4740 {
4741 { Bad_Opcode },
4742 { Bad_Opcode },
4743 { VEX_W_TABLE (VEX_W_0F3838_P_2) },
4744 },
4745
4746 /* PREFIX_VEX_0F3839 */
4747 {
4748 { Bad_Opcode },
4749 { Bad_Opcode },
4750 { VEX_W_TABLE (VEX_W_0F3839_P_2) },
4751 },
4752
4753 /* PREFIX_VEX_0F383A */
4754 {
4755 { Bad_Opcode },
4756 { Bad_Opcode },
4757 { VEX_W_TABLE (VEX_W_0F383A_P_2) },
4758 },
4759
4760 /* PREFIX_VEX_0F383B */
4761 {
4762 { Bad_Opcode },
4763 { Bad_Opcode },
4764 { VEX_W_TABLE (VEX_W_0F383B_P_2) },
4765 },
4766
4767 /* PREFIX_VEX_0F383C */
4768 {
4769 { Bad_Opcode },
4770 { Bad_Opcode },
4771 { VEX_W_TABLE (VEX_W_0F383C_P_2) },
4772 },
4773
4774 /* PREFIX_VEX_0F383D */
4775 {
4776 { Bad_Opcode },
4777 { Bad_Opcode },
4778 { VEX_W_TABLE (VEX_W_0F383D_P_2) },
4779 },
4780
4781 /* PREFIX_VEX_0F383E */
4782 {
4783 { Bad_Opcode },
4784 { Bad_Opcode },
4785 { VEX_W_TABLE (VEX_W_0F383E_P_2) },
4786 },
4787
4788 /* PREFIX_VEX_0F383F */
4789 {
4790 { Bad_Opcode },
4791 { Bad_Opcode },
4792 { VEX_W_TABLE (VEX_W_0F383F_P_2) },
4793 },
4794
4795 /* PREFIX_VEX_0F3840 */
4796 {
4797 { Bad_Opcode },
4798 { Bad_Opcode },
4799 { VEX_W_TABLE (VEX_W_0F3840_P_2) },
4800 },
4801
4802 /* PREFIX_VEX_0F3841 */
4803 {
4804 { Bad_Opcode },
4805 { Bad_Opcode },
4806 { VEX_LEN_TABLE (VEX_LEN_0F3841_P_2) },
4807 },
4808
4809 /* PREFIX_VEX_0F3845 */
4810 {
4811 { Bad_Opcode },
4812 { Bad_Opcode },
4813 { "vpsrlv%LW", { XM, Vex, EXx } },
4814 },
4815
4816 /* PREFIX_VEX_0F3846 */
4817 {
4818 { Bad_Opcode },
4819 { Bad_Opcode },
4820 { VEX_W_TABLE (VEX_W_0F3846_P_2) },
4821 },
4822
4823 /* PREFIX_VEX_0F3847 */
4824 {
4825 { Bad_Opcode },
4826 { Bad_Opcode },
4827 { "vpsllv%LW", { XM, Vex, EXx } },
4828 },
4829
4830 /* PREFIX_VEX_0F3858 */
4831 {
4832 { Bad_Opcode },
4833 { Bad_Opcode },
4834 { VEX_W_TABLE (VEX_W_0F3858_P_2) },
4835 },
4836
4837 /* PREFIX_VEX_0F3859 */
4838 {
4839 { Bad_Opcode },
4840 { Bad_Opcode },
4841 { VEX_W_TABLE (VEX_W_0F3859_P_2) },
4842 },
4843
4844 /* PREFIX_VEX_0F385A */
4845 {
4846 { Bad_Opcode },
4847 { Bad_Opcode },
4848 { MOD_TABLE (MOD_VEX_0F385A_PREFIX_2) },
4849 },
4850
4851 /* PREFIX_VEX_0F3878 */
4852 {
4853 { Bad_Opcode },
4854 { Bad_Opcode },
4855 { VEX_W_TABLE (VEX_W_0F3878_P_2) },
4856 },
4857
4858 /* PREFIX_VEX_0F3879 */
4859 {
4860 { Bad_Opcode },
4861 { Bad_Opcode },
4862 { VEX_W_TABLE (VEX_W_0F3879_P_2) },
4863 },
4864
4865 /* PREFIX_VEX_0F388C */
4866 {
4867 { Bad_Opcode },
4868 { Bad_Opcode },
4869 { MOD_TABLE (MOD_VEX_0F388C_PREFIX_2) },
4870 },
4871
4872 /* PREFIX_VEX_0F388E */
4873 {
4874 { Bad_Opcode },
4875 { Bad_Opcode },
4876 { MOD_TABLE (MOD_VEX_0F388E_PREFIX_2) },
4877 },
4878
4879 /* PREFIX_VEX_0F3890 */
4880 {
4881 { Bad_Opcode },
4882 { Bad_Opcode },
4883 { "vpgatherd%LW", { XM, MVexVSIBDWpX, Vex } },
4884 },
4885
4886 /* PREFIX_VEX_0F3891 */
4887 {
4888 { Bad_Opcode },
4889 { Bad_Opcode },
4890 { "vpgatherq%LW", { XMGatherQ, MVexVSIBQWpX, VexGatherQ } },
4891 },
4892
4893 /* PREFIX_VEX_0F3892 */
4894 {
4895 { Bad_Opcode },
4896 { Bad_Opcode },
4897 { "vgatherdp%XW", { XM, MVexVSIBDWpX, Vex } },
4898 },
4899
4900 /* PREFIX_VEX_0F3893 */
4901 {
4902 { Bad_Opcode },
4903 { Bad_Opcode },
4904 { "vgatherqp%XW", { XMGatherQ, MVexVSIBQWpX, VexGatherQ } },
4905 },
4906
4907 /* PREFIX_VEX_0F3896 */
4908 {
4909 { Bad_Opcode },
4910 { Bad_Opcode },
4911 { "vfmaddsub132p%XW", { XM, Vex, EXx } },
4912 },
4913
4914 /* PREFIX_VEX_0F3897 */
4915 {
4916 { Bad_Opcode },
4917 { Bad_Opcode },
4918 { "vfmsubadd132p%XW", { XM, Vex, EXx } },
4919 },
4920
4921 /* PREFIX_VEX_0F3898 */
4922 {
4923 { Bad_Opcode },
4924 { Bad_Opcode },
4925 { "vfmadd132p%XW", { XM, Vex, EXx } },
4926 },
4927
4928 /* PREFIX_VEX_0F3899 */
4929 {
4930 { Bad_Opcode },
4931 { Bad_Opcode },
4932 { "vfmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
4933 },
4934
4935 /* PREFIX_VEX_0F389A */
4936 {
4937 { Bad_Opcode },
4938 { Bad_Opcode },
4939 { "vfmsub132p%XW", { XM, Vex, EXx } },
4940 },
4941
4942 /* PREFIX_VEX_0F389B */
4943 {
4944 { Bad_Opcode },
4945 { Bad_Opcode },
4946 { "vfmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
4947 },
4948
4949 /* PREFIX_VEX_0F389C */
4950 {
4951 { Bad_Opcode },
4952 { Bad_Opcode },
4953 { "vfnmadd132p%XW", { XM, Vex, EXx } },
4954 },
4955
4956 /* PREFIX_VEX_0F389D */
4957 {
4958 { Bad_Opcode },
4959 { Bad_Opcode },
4960 { "vfnmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
4961 },
4962
4963 /* PREFIX_VEX_0F389E */
4964 {
4965 { Bad_Opcode },
4966 { Bad_Opcode },
4967 { "vfnmsub132p%XW", { XM, Vex, EXx } },
4968 },
4969
4970 /* PREFIX_VEX_0F389F */
4971 {
4972 { Bad_Opcode },
4973 { Bad_Opcode },
4974 { "vfnmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
4975 },
4976
4977 /* PREFIX_VEX_0F38A6 */
4978 {
4979 { Bad_Opcode },
4980 { Bad_Opcode },
4981 { "vfmaddsub213p%XW", { XM, Vex, EXx } },
4982 { Bad_Opcode },
4983 },
4984
4985 /* PREFIX_VEX_0F38A7 */
4986 {
4987 { Bad_Opcode },
4988 { Bad_Opcode },
4989 { "vfmsubadd213p%XW", { XM, Vex, EXx } },
4990 },
4991
4992 /* PREFIX_VEX_0F38A8 */
4993 {
4994 { Bad_Opcode },
4995 { Bad_Opcode },
4996 { "vfmadd213p%XW", { XM, Vex, EXx } },
4997 },
4998
4999 /* PREFIX_VEX_0F38A9 */
5000 {
5001 { Bad_Opcode },
5002 { Bad_Opcode },
5003 { "vfmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
5004 },
5005
5006 /* PREFIX_VEX_0F38AA */
5007 {
5008 { Bad_Opcode },
5009 { Bad_Opcode },
5010 { "vfmsub213p%XW", { XM, Vex, EXx } },
5011 },
5012
5013 /* PREFIX_VEX_0F38AB */
5014 {
5015 { Bad_Opcode },
5016 { Bad_Opcode },
5017 { "vfmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
5018 },
5019
5020 /* PREFIX_VEX_0F38AC */
5021 {
5022 { Bad_Opcode },
5023 { Bad_Opcode },
5024 { "vfnmadd213p%XW", { XM, Vex, EXx } },
5025 },
5026
5027 /* PREFIX_VEX_0F38AD */
5028 {
5029 { Bad_Opcode },
5030 { Bad_Opcode },
5031 { "vfnmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
5032 },
5033
5034 /* PREFIX_VEX_0F38AE */
5035 {
5036 { Bad_Opcode },
5037 { Bad_Opcode },
5038 { "vfnmsub213p%XW", { XM, Vex, EXx } },
5039 },
5040
5041 /* PREFIX_VEX_0F38AF */
5042 {
5043 { Bad_Opcode },
5044 { Bad_Opcode },
5045 { "vfnmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
5046 },
5047
5048 /* PREFIX_VEX_0F38B6 */
5049 {
5050 { Bad_Opcode },
5051 { Bad_Opcode },
5052 { "vfmaddsub231p%XW", { XM, Vex, EXx } },
5053 },
5054
5055 /* PREFIX_VEX_0F38B7 */
5056 {
5057 { Bad_Opcode },
5058 { Bad_Opcode },
5059 { "vfmsubadd231p%XW", { XM, Vex, EXx } },
5060 },
5061
5062 /* PREFIX_VEX_0F38B8 */
5063 {
5064 { Bad_Opcode },
5065 { Bad_Opcode },
5066 { "vfmadd231p%XW", { XM, Vex, EXx } },
5067 },
5068
5069 /* PREFIX_VEX_0F38B9 */
5070 {
5071 { Bad_Opcode },
5072 { Bad_Opcode },
5073 { "vfmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
5074 },
5075
5076 /* PREFIX_VEX_0F38BA */
5077 {
5078 { Bad_Opcode },
5079 { Bad_Opcode },
5080 { "vfmsub231p%XW", { XM, Vex, EXx } },
5081 },
5082
5083 /* PREFIX_VEX_0F38BB */
5084 {
5085 { Bad_Opcode },
5086 { Bad_Opcode },
5087 { "vfmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
5088 },
5089
5090 /* PREFIX_VEX_0F38BC */
5091 {
5092 { Bad_Opcode },
5093 { Bad_Opcode },
5094 { "vfnmadd231p%XW", { XM, Vex, EXx } },
5095 },
5096
5097 /* PREFIX_VEX_0F38BD */
5098 {
5099 { Bad_Opcode },
5100 { Bad_Opcode },
5101 { "vfnmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
5102 },
5103
5104 /* PREFIX_VEX_0F38BE */
5105 {
5106 { Bad_Opcode },
5107 { Bad_Opcode },
5108 { "vfnmsub231p%XW", { XM, Vex, EXx } },
5109 },
5110
5111 /* PREFIX_VEX_0F38BF */
5112 {
5113 { Bad_Opcode },
5114 { Bad_Opcode },
5115 { "vfnmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
5116 },
5117
5118 /* PREFIX_VEX_0F38DB */
5119 {
5120 { Bad_Opcode },
5121 { Bad_Opcode },
5122 { VEX_LEN_TABLE (VEX_LEN_0F38DB_P_2) },
5123 },
5124
5125 /* PREFIX_VEX_0F38DC */
5126 {
5127 { Bad_Opcode },
5128 { Bad_Opcode },
5129 { VEX_LEN_TABLE (VEX_LEN_0F38DC_P_2) },
5130 },
5131
5132 /* PREFIX_VEX_0F38DD */
5133 {
5134 { Bad_Opcode },
5135 { Bad_Opcode },
5136 { VEX_LEN_TABLE (VEX_LEN_0F38DD_P_2) },
5137 },
5138
5139 /* PREFIX_VEX_0F38DE */
5140 {
5141 { Bad_Opcode },
5142 { Bad_Opcode },
5143 { VEX_LEN_TABLE (VEX_LEN_0F38DE_P_2) },
5144 },
5145
5146 /* PREFIX_VEX_0F38DF */
5147 {
5148 { Bad_Opcode },
5149 { Bad_Opcode },
5150 { VEX_LEN_TABLE (VEX_LEN_0F38DF_P_2) },
5151 },
5152
5153 /* PREFIX_VEX_0F38F2 */
5154 {
5155 { VEX_LEN_TABLE (VEX_LEN_0F38F2_P_0) },
5156 },
5157
5158 /* PREFIX_VEX_0F38F3_REG_1 */
5159 {
5160 { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_1_P_0) },
5161 },
5162
5163 /* PREFIX_VEX_0F38F3_REG_2 */
5164 {
5165 { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_2_P_0) },
5166 },
5167
5168 /* PREFIX_VEX_0F38F3_REG_3 */
5169 {
5170 { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_3_P_0) },
5171 },
5172
5173 /* PREFIX_VEX_0F38F5 */
5174 {
5175 { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_0) },
5176 { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_1) },
5177 { Bad_Opcode },
5178 { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_3) },
5179 },
5180
5181 /* PREFIX_VEX_0F38F6 */
5182 {
5183 { Bad_Opcode },
5184 { Bad_Opcode },
5185 { Bad_Opcode },
5186 { VEX_LEN_TABLE (VEX_LEN_0F38F6_P_3) },
5187 },
5188
5189 /* PREFIX_VEX_0F38F7 */
5190 {
5191 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_0) },
5192 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_1) },
5193 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_2) },
5194 { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_3) },
5195 },
5196
5197 /* PREFIX_VEX_0F3A00 */
5198 {
5199 { Bad_Opcode },
5200 { Bad_Opcode },
5201 { VEX_LEN_TABLE (VEX_LEN_0F3A00_P_2) },
5202 },
5203
5204 /* PREFIX_VEX_0F3A01 */
5205 {
5206 { Bad_Opcode },
5207 { Bad_Opcode },
5208 { VEX_LEN_TABLE (VEX_LEN_0F3A01_P_2) },
5209 },
5210
5211 /* PREFIX_VEX_0F3A02 */
5212 {
5213 { Bad_Opcode },
5214 { Bad_Opcode },
5215 { VEX_W_TABLE (VEX_W_0F3A02_P_2) },
5216 },
5217
5218 /* PREFIX_VEX_0F3A04 */
5219 {
5220 { Bad_Opcode },
5221 { Bad_Opcode },
5222 { VEX_W_TABLE (VEX_W_0F3A04_P_2) },
5223 },
5224
5225 /* PREFIX_VEX_0F3A05 */
5226 {
5227 { Bad_Opcode },
5228 { Bad_Opcode },
5229 { VEX_W_TABLE (VEX_W_0F3A05_P_2) },
5230 },
5231
5232 /* PREFIX_VEX_0F3A06 */
5233 {
5234 { Bad_Opcode },
5235 { Bad_Opcode },
5236 { VEX_LEN_TABLE (VEX_LEN_0F3A06_P_2) },
5237 },
5238
5239 /* PREFIX_VEX_0F3A08 */
5240 {
5241 { Bad_Opcode },
5242 { Bad_Opcode },
5243 { VEX_W_TABLE (VEX_W_0F3A08_P_2) },
5244 },
5245
5246 /* PREFIX_VEX_0F3A09 */
5247 {
5248 { Bad_Opcode },
5249 { Bad_Opcode },
5250 { VEX_W_TABLE (VEX_W_0F3A09_P_2) },
5251 },
5252
5253 /* PREFIX_VEX_0F3A0A */
5254 {
5255 { Bad_Opcode },
5256 { Bad_Opcode },
5257 { VEX_LEN_TABLE (VEX_LEN_0F3A0A_P_2) },
5258 },
5259
5260 /* PREFIX_VEX_0F3A0B */
5261 {
5262 { Bad_Opcode },
5263 { Bad_Opcode },
5264 { VEX_LEN_TABLE (VEX_LEN_0F3A0B_P_2) },
5265 },
5266
5267 /* PREFIX_VEX_0F3A0C */
5268 {
5269 { Bad_Opcode },
5270 { Bad_Opcode },
5271 { VEX_W_TABLE (VEX_W_0F3A0C_P_2) },
5272 },
5273
5274 /* PREFIX_VEX_0F3A0D */
5275 {
5276 { Bad_Opcode },
5277 { Bad_Opcode },
5278 { VEX_W_TABLE (VEX_W_0F3A0D_P_2) },
5279 },
5280
5281 /* PREFIX_VEX_0F3A0E */
5282 {
5283 { Bad_Opcode },
5284 { Bad_Opcode },
5285 { VEX_W_TABLE (VEX_W_0F3A0E_P_2) },
5286 },
5287
5288 /* PREFIX_VEX_0F3A0F */
5289 {
5290 { Bad_Opcode },
5291 { Bad_Opcode },
5292 { VEX_W_TABLE (VEX_W_0F3A0F_P_2) },
5293 },
5294
5295 /* PREFIX_VEX_0F3A14 */
5296 {
5297 { Bad_Opcode },
5298 { Bad_Opcode },
5299 { VEX_LEN_TABLE (VEX_LEN_0F3A14_P_2) },
5300 },
5301
5302 /* PREFIX_VEX_0F3A15 */
5303 {
5304 { Bad_Opcode },
5305 { Bad_Opcode },
5306 { VEX_LEN_TABLE (VEX_LEN_0F3A15_P_2) },
5307 },
5308
5309 /* PREFIX_VEX_0F3A16 */
5310 {
5311 { Bad_Opcode },
5312 { Bad_Opcode },
5313 { VEX_LEN_TABLE (VEX_LEN_0F3A16_P_2) },
5314 },
5315
5316 /* PREFIX_VEX_0F3A17 */
5317 {
5318 { Bad_Opcode },
5319 { Bad_Opcode },
5320 { VEX_LEN_TABLE (VEX_LEN_0F3A17_P_2) },
5321 },
5322
5323 /* PREFIX_VEX_0F3A18 */
5324 {
5325 { Bad_Opcode },
5326 { Bad_Opcode },
5327 { VEX_LEN_TABLE (VEX_LEN_0F3A18_P_2) },
5328 },
5329
5330 /* PREFIX_VEX_0F3A19 */
5331 {
5332 { Bad_Opcode },
5333 { Bad_Opcode },
5334 { VEX_LEN_TABLE (VEX_LEN_0F3A19_P_2) },
5335 },
5336
5337 /* PREFIX_VEX_0F3A1D */
5338 {
5339 { Bad_Opcode },
5340 { Bad_Opcode },
5341 { "vcvtps2ph", { EXxmmq, XM, Ib } },
5342 },
5343
5344 /* PREFIX_VEX_0F3A20 */
5345 {
5346 { Bad_Opcode },
5347 { Bad_Opcode },
5348 { VEX_LEN_TABLE (VEX_LEN_0F3A20_P_2) },
5349 },
5350
5351 /* PREFIX_VEX_0F3A21 */
5352 {
5353 { Bad_Opcode },
5354 { Bad_Opcode },
5355 { VEX_LEN_TABLE (VEX_LEN_0F3A21_P_2) },
5356 },
5357
5358 /* PREFIX_VEX_0F3A22 */
5359 {
5360 { Bad_Opcode },
5361 { Bad_Opcode },
5362 { VEX_LEN_TABLE (VEX_LEN_0F3A22_P_2) },
5363 },
5364
5365 /* PREFIX_VEX_0F3A38 */
5366 {
5367 { Bad_Opcode },
5368 { Bad_Opcode },
5369 { VEX_LEN_TABLE (VEX_LEN_0F3A38_P_2) },
5370 },
5371
5372 /* PREFIX_VEX_0F3A39 */
5373 {
5374 { Bad_Opcode },
5375 { Bad_Opcode },
5376 { VEX_LEN_TABLE (VEX_LEN_0F3A39_P_2) },
5377 },
5378
5379 /* PREFIX_VEX_0F3A40 */
5380 {
5381 { Bad_Opcode },
5382 { Bad_Opcode },
5383 { VEX_W_TABLE (VEX_W_0F3A40_P_2) },
5384 },
5385
5386 /* PREFIX_VEX_0F3A41 */
5387 {
5388 { Bad_Opcode },
5389 { Bad_Opcode },
5390 { VEX_LEN_TABLE (VEX_LEN_0F3A41_P_2) },
5391 },
5392
5393 /* PREFIX_VEX_0F3A42 */
5394 {
5395 { Bad_Opcode },
5396 { Bad_Opcode },
5397 { VEX_W_TABLE (VEX_W_0F3A42_P_2) },
5398 },
5399
5400 /* PREFIX_VEX_0F3A44 */
5401 {
5402 { Bad_Opcode },
5403 { Bad_Opcode },
5404 { VEX_LEN_TABLE (VEX_LEN_0F3A44_P_2) },
5405 },
5406
5407 /* PREFIX_VEX_0F3A46 */
5408 {
5409 { Bad_Opcode },
5410 { Bad_Opcode },
5411 { VEX_LEN_TABLE (VEX_LEN_0F3A46_P_2) },
5412 },
5413
5414 /* PREFIX_VEX_0F3A48 */
5415 {
5416 { Bad_Opcode },
5417 { Bad_Opcode },
5418 { VEX_W_TABLE (VEX_W_0F3A48_P_2) },
5419 },
5420
5421 /* PREFIX_VEX_0F3A49 */
5422 {
5423 { Bad_Opcode },
5424 { Bad_Opcode },
5425 { VEX_W_TABLE (VEX_W_0F3A49_P_2) },
5426 },
5427
5428 /* PREFIX_VEX_0F3A4A */
5429 {
5430 { Bad_Opcode },
5431 { Bad_Opcode },
5432 { VEX_W_TABLE (VEX_W_0F3A4A_P_2) },
5433 },
5434
5435 /* PREFIX_VEX_0F3A4B */
5436 {
5437 { Bad_Opcode },
5438 { Bad_Opcode },
5439 { VEX_W_TABLE (VEX_W_0F3A4B_P_2) },
5440 },
5441
5442 /* PREFIX_VEX_0F3A4C */
5443 {
5444 { Bad_Opcode },
5445 { Bad_Opcode },
5446 { VEX_W_TABLE (VEX_W_0F3A4C_P_2) },
5447 },
5448
5449 /* PREFIX_VEX_0F3A5C */
5450 {
5451 { Bad_Opcode },
5452 { Bad_Opcode },
5453 { "vfmaddsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5454 },
5455
5456 /* PREFIX_VEX_0F3A5D */
5457 {
5458 { Bad_Opcode },
5459 { Bad_Opcode },
5460 { "vfmaddsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5461 },
5462
5463 /* PREFIX_VEX_0F3A5E */
5464 {
5465 { Bad_Opcode },
5466 { Bad_Opcode },
5467 { "vfmsubaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5468 },
5469
5470 /* PREFIX_VEX_0F3A5F */
5471 {
5472 { Bad_Opcode },
5473 { Bad_Opcode },
5474 { "vfmsubaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5475 },
5476
5477 /* PREFIX_VEX_0F3A60 */
5478 {
5479 { Bad_Opcode },
5480 { Bad_Opcode },
5481 { VEX_LEN_TABLE (VEX_LEN_0F3A60_P_2) },
5482 { Bad_Opcode },
5483 },
5484
5485 /* PREFIX_VEX_0F3A61 */
5486 {
5487 { Bad_Opcode },
5488 { Bad_Opcode },
5489 { VEX_LEN_TABLE (VEX_LEN_0F3A61_P_2) },
5490 },
5491
5492 /* PREFIX_VEX_0F3A62 */
5493 {
5494 { Bad_Opcode },
5495 { Bad_Opcode },
5496 { VEX_LEN_TABLE (VEX_LEN_0F3A62_P_2) },
5497 },
5498
5499 /* PREFIX_VEX_0F3A63 */
5500 {
5501 { Bad_Opcode },
5502 { Bad_Opcode },
5503 { VEX_LEN_TABLE (VEX_LEN_0F3A63_P_2) },
5504 },
5505
5506 /* PREFIX_VEX_0F3A68 */
5507 {
5508 { Bad_Opcode },
5509 { Bad_Opcode },
5510 { "vfmaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5511 },
5512
5513 /* PREFIX_VEX_0F3A69 */
5514 {
5515 { Bad_Opcode },
5516 { Bad_Opcode },
5517 { "vfmaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5518 },
5519
5520 /* PREFIX_VEX_0F3A6A */
5521 {
5522 { Bad_Opcode },
5523 { Bad_Opcode },
5524 { VEX_LEN_TABLE (VEX_LEN_0F3A6A_P_2) },
5525 },
5526
5527 /* PREFIX_VEX_0F3A6B */
5528 {
5529 { Bad_Opcode },
5530 { Bad_Opcode },
5531 { VEX_LEN_TABLE (VEX_LEN_0F3A6B_P_2) },
5532 },
5533
5534 /* PREFIX_VEX_0F3A6C */
5535 {
5536 { Bad_Opcode },
5537 { Bad_Opcode },
5538 { "vfmsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5539 },
5540
5541 /* PREFIX_VEX_0F3A6D */
5542 {
5543 { Bad_Opcode },
5544 { Bad_Opcode },
5545 { "vfmsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5546 },
5547
5548 /* PREFIX_VEX_0F3A6E */
5549 {
5550 { Bad_Opcode },
5551 { Bad_Opcode },
5552 { VEX_LEN_TABLE (VEX_LEN_0F3A6E_P_2) },
5553 },
5554
5555 /* PREFIX_VEX_0F3A6F */
5556 {
5557 { Bad_Opcode },
5558 { Bad_Opcode },
5559 { VEX_LEN_TABLE (VEX_LEN_0F3A6F_P_2) },
5560 },
5561
5562 /* PREFIX_VEX_0F3A78 */
5563 {
5564 { Bad_Opcode },
5565 { Bad_Opcode },
5566 { "vfnmaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5567 },
5568
5569 /* PREFIX_VEX_0F3A79 */
5570 {
5571 { Bad_Opcode },
5572 { Bad_Opcode },
5573 { "vfnmaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5574 },
5575
5576 /* PREFIX_VEX_0F3A7A */
5577 {
5578 { Bad_Opcode },
5579 { Bad_Opcode },
5580 { VEX_LEN_TABLE (VEX_LEN_0F3A7A_P_2) },
5581 },
5582
5583 /* PREFIX_VEX_0F3A7B */
5584 {
5585 { Bad_Opcode },
5586 { Bad_Opcode },
5587 { VEX_LEN_TABLE (VEX_LEN_0F3A7B_P_2) },
5588 },
5589
5590 /* PREFIX_VEX_0F3A7C */
5591 {
5592 { Bad_Opcode },
5593 { Bad_Opcode },
5594 { "vfnmsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5595 { Bad_Opcode },
5596 },
5597
5598 /* PREFIX_VEX_0F3A7D */
5599 {
5600 { Bad_Opcode },
5601 { Bad_Opcode },
5602 { "vfnmsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5603 },
5604
5605 /* PREFIX_VEX_0F3A7E */
5606 {
5607 { Bad_Opcode },
5608 { Bad_Opcode },
5609 { VEX_LEN_TABLE (VEX_LEN_0F3A7E_P_2) },
5610 },
5611
5612 /* PREFIX_VEX_0F3A7F */
5613 {
5614 { Bad_Opcode },
5615 { Bad_Opcode },
5616 { VEX_LEN_TABLE (VEX_LEN_0F3A7F_P_2) },
5617 },
5618
5619 /* PREFIX_VEX_0F3ADF */
5620 {
5621 { Bad_Opcode },
5622 { Bad_Opcode },
5623 { VEX_LEN_TABLE (VEX_LEN_0F3ADF_P_2) },
5624 },
5625
5626 /* PREFIX_VEX_0F3AF0 */
5627 {
5628 { Bad_Opcode },
5629 { Bad_Opcode },
5630 { Bad_Opcode },
5631 { VEX_LEN_TABLE (VEX_LEN_0F3AF0_P_3) },
5632 },
5633 };
5634
5635 static const struct dis386 x86_64_table[][2] = {
5636 /* X86_64_06 */
5637 {
5638 { "pushP", { es } },
5639 },
5640
5641 /* X86_64_07 */
5642 {
5643 { "popP", { es } },
5644 },
5645
5646 /* X86_64_0D */
5647 {
5648 { "pushP", { cs } },
5649 },
5650
5651 /* X86_64_16 */
5652 {
5653 { "pushP", { ss } },
5654 },
5655
5656 /* X86_64_17 */
5657 {
5658 { "popP", { ss } },
5659 },
5660
5661 /* X86_64_1E */
5662 {
5663 { "pushP", { ds } },
5664 },
5665
5666 /* X86_64_1F */
5667 {
5668 { "popP", { ds } },
5669 },
5670
5671 /* X86_64_27 */
5672 {
5673 { "daa", { XX } },
5674 },
5675
5676 /* X86_64_2F */
5677 {
5678 { "das", { XX } },
5679 },
5680
5681 /* X86_64_37 */
5682 {
5683 { "aaa", { XX } },
5684 },
5685
5686 /* X86_64_3F */
5687 {
5688 { "aas", { XX } },
5689 },
5690
5691 /* X86_64_60 */
5692 {
5693 { "pushaP", { XX } },
5694 },
5695
5696 /* X86_64_61 */
5697 {
5698 { "popaP", { XX } },
5699 },
5700
5701 /* X86_64_62 */
5702 {
5703 { MOD_TABLE (MOD_62_32BIT) },
5704 },
5705
5706 /* X86_64_63 */
5707 {
5708 { "arpl", { Ew, Gw } },
5709 { "movs{lq|xd}", { Gv, Ed } },
5710 },
5711
5712 /* X86_64_6D */
5713 {
5714 { "ins{R|}", { Yzr, indirDX } },
5715 { "ins{G|}", { Yzr, indirDX } },
5716 },
5717
5718 /* X86_64_6F */
5719 {
5720 { "outs{R|}", { indirDXr, Xz } },
5721 { "outs{G|}", { indirDXr, Xz } },
5722 },
5723
5724 /* X86_64_9A */
5725 {
5726 { "Jcall{T|}", { Ap } },
5727 },
5728
5729 /* X86_64_C4 */
5730 {
5731 { MOD_TABLE (MOD_C4_32BIT) },
5732 { VEX_C4_TABLE (VEX_0F) },
5733 },
5734
5735 /* X86_64_C5 */
5736 {
5737 { MOD_TABLE (MOD_C5_32BIT) },
5738 { VEX_C5_TABLE (VEX_0F) },
5739 },
5740
5741 /* X86_64_CE */
5742 {
5743 { "into", { XX } },
5744 },
5745
5746 /* X86_64_D4 */
5747 {
5748 { "aam", { Ib } },
5749 },
5750
5751 /* X86_64_D5 */
5752 {
5753 { "aad", { Ib } },
5754 },
5755
5756 /* X86_64_EA */
5757 {
5758 { "Jjmp{T|}", { Ap } },
5759 },
5760
5761 /* X86_64_0F01_REG_0 */
5762 {
5763 { "sgdt{Q|IQ}", { M } },
5764 { "sgdt", { M } },
5765 },
5766
5767 /* X86_64_0F01_REG_1 */
5768 {
5769 { "sidt{Q|IQ}", { M } },
5770 { "sidt", { M } },
5771 },
5772
5773 /* X86_64_0F01_REG_2 */
5774 {
5775 { "lgdt{Q|Q}", { M } },
5776 { "lgdt", { M } },
5777 },
5778
5779 /* X86_64_0F01_REG_3 */
5780 {
5781 { "lidt{Q|Q}", { M } },
5782 { "lidt", { M } },
5783 },
5784 };
5785
5786 static const struct dis386 three_byte_table[][256] = {
5787
5788 /* THREE_BYTE_0F38 */
5789 {
5790 /* 00 */
5791 { "pshufb", { MX, EM } },
5792 { "phaddw", { MX, EM } },
5793 { "phaddd", { MX, EM } },
5794 { "phaddsw", { MX, EM } },
5795 { "pmaddubsw", { MX, EM } },
5796 { "phsubw", { MX, EM } },
5797 { "phsubd", { MX, EM } },
5798 { "phsubsw", { MX, EM } },
5799 /* 08 */
5800 { "psignb", { MX, EM } },
5801 { "psignw", { MX, EM } },
5802 { "psignd", { MX, EM } },
5803 { "pmulhrsw", { MX, EM } },
5804 { Bad_Opcode },
5805 { Bad_Opcode },
5806 { Bad_Opcode },
5807 { Bad_Opcode },
5808 /* 10 */
5809 { PREFIX_TABLE (PREFIX_0F3810) },
5810 { Bad_Opcode },
5811 { Bad_Opcode },
5812 { Bad_Opcode },
5813 { PREFIX_TABLE (PREFIX_0F3814) },
5814 { PREFIX_TABLE (PREFIX_0F3815) },
5815 { Bad_Opcode },
5816 { PREFIX_TABLE (PREFIX_0F3817) },
5817 /* 18 */
5818 { Bad_Opcode },
5819 { Bad_Opcode },
5820 { Bad_Opcode },
5821 { Bad_Opcode },
5822 { "pabsb", { MX, EM } },
5823 { "pabsw", { MX, EM } },
5824 { "pabsd", { MX, EM } },
5825 { Bad_Opcode },
5826 /* 20 */
5827 { PREFIX_TABLE (PREFIX_0F3820) },
5828 { PREFIX_TABLE (PREFIX_0F3821) },
5829 { PREFIX_TABLE (PREFIX_0F3822) },
5830 { PREFIX_TABLE (PREFIX_0F3823) },
5831 { PREFIX_TABLE (PREFIX_0F3824) },
5832 { PREFIX_TABLE (PREFIX_0F3825) },
5833 { Bad_Opcode },
5834 { Bad_Opcode },
5835 /* 28 */
5836 { PREFIX_TABLE (PREFIX_0F3828) },
5837 { PREFIX_TABLE (PREFIX_0F3829) },
5838 { PREFIX_TABLE (PREFIX_0F382A) },
5839 { PREFIX_TABLE (PREFIX_0F382B) },
5840 { Bad_Opcode },
5841 { Bad_Opcode },
5842 { Bad_Opcode },
5843 { Bad_Opcode },
5844 /* 30 */
5845 { PREFIX_TABLE (PREFIX_0F3830) },
5846 { PREFIX_TABLE (PREFIX_0F3831) },
5847 { PREFIX_TABLE (PREFIX_0F3832) },
5848 { PREFIX_TABLE (PREFIX_0F3833) },
5849 { PREFIX_TABLE (PREFIX_0F3834) },
5850 { PREFIX_TABLE (PREFIX_0F3835) },
5851 { Bad_Opcode },
5852 { PREFIX_TABLE (PREFIX_0F3837) },
5853 /* 38 */
5854 { PREFIX_TABLE (PREFIX_0F3838) },
5855 { PREFIX_TABLE (PREFIX_0F3839) },
5856 { PREFIX_TABLE (PREFIX_0F383A) },
5857 { PREFIX_TABLE (PREFIX_0F383B) },
5858 { PREFIX_TABLE (PREFIX_0F383C) },
5859 { PREFIX_TABLE (PREFIX_0F383D) },
5860 { PREFIX_TABLE (PREFIX_0F383E) },
5861 { PREFIX_TABLE (PREFIX_0F383F) },
5862 /* 40 */
5863 { PREFIX_TABLE (PREFIX_0F3840) },
5864 { PREFIX_TABLE (PREFIX_0F3841) },
5865 { Bad_Opcode },
5866 { Bad_Opcode },
5867 { Bad_Opcode },
5868 { Bad_Opcode },
5869 { Bad_Opcode },
5870 { Bad_Opcode },
5871 /* 48 */
5872 { Bad_Opcode },
5873 { Bad_Opcode },
5874 { Bad_Opcode },
5875 { Bad_Opcode },
5876 { Bad_Opcode },
5877 { Bad_Opcode },
5878 { Bad_Opcode },
5879 { Bad_Opcode },
5880 /* 50 */
5881 { Bad_Opcode },
5882 { Bad_Opcode },
5883 { Bad_Opcode },
5884 { Bad_Opcode },
5885 { Bad_Opcode },
5886 { Bad_Opcode },
5887 { Bad_Opcode },
5888 { Bad_Opcode },
5889 /* 58 */
5890 { Bad_Opcode },
5891 { Bad_Opcode },
5892 { Bad_Opcode },
5893 { Bad_Opcode },
5894 { Bad_Opcode },
5895 { Bad_Opcode },
5896 { Bad_Opcode },
5897 { Bad_Opcode },
5898 /* 60 */
5899 { Bad_Opcode },
5900 { Bad_Opcode },
5901 { Bad_Opcode },
5902 { Bad_Opcode },
5903 { Bad_Opcode },
5904 { Bad_Opcode },
5905 { Bad_Opcode },
5906 { Bad_Opcode },
5907 /* 68 */
5908 { Bad_Opcode },
5909 { Bad_Opcode },
5910 { Bad_Opcode },
5911 { Bad_Opcode },
5912 { Bad_Opcode },
5913 { Bad_Opcode },
5914 { Bad_Opcode },
5915 { Bad_Opcode },
5916 /* 70 */
5917 { Bad_Opcode },
5918 { Bad_Opcode },
5919 { Bad_Opcode },
5920 { Bad_Opcode },
5921 { Bad_Opcode },
5922 { Bad_Opcode },
5923 { Bad_Opcode },
5924 { Bad_Opcode },
5925 /* 78 */
5926 { Bad_Opcode },
5927 { Bad_Opcode },
5928 { Bad_Opcode },
5929 { Bad_Opcode },
5930 { Bad_Opcode },
5931 { Bad_Opcode },
5932 { Bad_Opcode },
5933 { Bad_Opcode },
5934 /* 80 */
5935 { PREFIX_TABLE (PREFIX_0F3880) },
5936 { PREFIX_TABLE (PREFIX_0F3881) },
5937 { PREFIX_TABLE (PREFIX_0F3882) },
5938 { Bad_Opcode },
5939 { Bad_Opcode },
5940 { Bad_Opcode },
5941 { Bad_Opcode },
5942 { Bad_Opcode },
5943 /* 88 */
5944 { Bad_Opcode },
5945 { Bad_Opcode },
5946 { Bad_Opcode },
5947 { Bad_Opcode },
5948 { Bad_Opcode },
5949 { Bad_Opcode },
5950 { Bad_Opcode },
5951 { Bad_Opcode },
5952 /* 90 */
5953 { Bad_Opcode },
5954 { Bad_Opcode },
5955 { Bad_Opcode },
5956 { Bad_Opcode },
5957 { Bad_Opcode },
5958 { Bad_Opcode },
5959 { Bad_Opcode },
5960 { Bad_Opcode },
5961 /* 98 */
5962 { Bad_Opcode },
5963 { Bad_Opcode },
5964 { Bad_Opcode },
5965 { Bad_Opcode },
5966 { Bad_Opcode },
5967 { Bad_Opcode },
5968 { Bad_Opcode },
5969 { Bad_Opcode },
5970 /* a0 */
5971 { Bad_Opcode },
5972 { Bad_Opcode },
5973 { Bad_Opcode },
5974 { Bad_Opcode },
5975 { Bad_Opcode },
5976 { Bad_Opcode },
5977 { Bad_Opcode },
5978 { Bad_Opcode },
5979 /* a8 */
5980 { Bad_Opcode },
5981 { Bad_Opcode },
5982 { Bad_Opcode },
5983 { Bad_Opcode },
5984 { Bad_Opcode },
5985 { Bad_Opcode },
5986 { Bad_Opcode },
5987 { Bad_Opcode },
5988 /* b0 */
5989 { Bad_Opcode },
5990 { Bad_Opcode },
5991 { Bad_Opcode },
5992 { Bad_Opcode },
5993 { Bad_Opcode },
5994 { Bad_Opcode },
5995 { Bad_Opcode },
5996 { Bad_Opcode },
5997 /* b8 */
5998 { Bad_Opcode },
5999 { Bad_Opcode },
6000 { Bad_Opcode },
6001 { Bad_Opcode },
6002 { Bad_Opcode },
6003 { Bad_Opcode },
6004 { Bad_Opcode },
6005 { Bad_Opcode },
6006 /* c0 */
6007 { Bad_Opcode },
6008 { Bad_Opcode },
6009 { Bad_Opcode },
6010 { Bad_Opcode },
6011 { Bad_Opcode },
6012 { Bad_Opcode },
6013 { Bad_Opcode },
6014 { Bad_Opcode },
6015 /* c8 */
6016 { Bad_Opcode },
6017 { Bad_Opcode },
6018 { Bad_Opcode },
6019 { Bad_Opcode },
6020 { Bad_Opcode },
6021 { Bad_Opcode },
6022 { Bad_Opcode },
6023 { Bad_Opcode },
6024 /* d0 */
6025 { Bad_Opcode },
6026 { Bad_Opcode },
6027 { Bad_Opcode },
6028 { Bad_Opcode },
6029 { Bad_Opcode },
6030 { Bad_Opcode },
6031 { Bad_Opcode },
6032 { Bad_Opcode },
6033 /* d8 */
6034 { Bad_Opcode },
6035 { Bad_Opcode },
6036 { Bad_Opcode },
6037 { PREFIX_TABLE (PREFIX_0F38DB) },
6038 { PREFIX_TABLE (PREFIX_0F38DC) },
6039 { PREFIX_TABLE (PREFIX_0F38DD) },
6040 { PREFIX_TABLE (PREFIX_0F38DE) },
6041 { PREFIX_TABLE (PREFIX_0F38DF) },
6042 /* e0 */
6043 { Bad_Opcode },
6044 { Bad_Opcode },
6045 { Bad_Opcode },
6046 { Bad_Opcode },
6047 { Bad_Opcode },
6048 { Bad_Opcode },
6049 { Bad_Opcode },
6050 { Bad_Opcode },
6051 /* e8 */
6052 { Bad_Opcode },
6053 { Bad_Opcode },
6054 { Bad_Opcode },
6055 { Bad_Opcode },
6056 { Bad_Opcode },
6057 { Bad_Opcode },
6058 { Bad_Opcode },
6059 { Bad_Opcode },
6060 /* f0 */
6061 { PREFIX_TABLE (PREFIX_0F38F0) },
6062 { PREFIX_TABLE (PREFIX_0F38F1) },
6063 { Bad_Opcode },
6064 { Bad_Opcode },
6065 { Bad_Opcode },
6066 { Bad_Opcode },
6067 { PREFIX_TABLE (PREFIX_0F38F6) },
6068 { Bad_Opcode },
6069 /* f8 */
6070 { Bad_Opcode },
6071 { Bad_Opcode },
6072 { Bad_Opcode },
6073 { Bad_Opcode },
6074 { Bad_Opcode },
6075 { Bad_Opcode },
6076 { Bad_Opcode },
6077 { Bad_Opcode },
6078 },
6079 /* THREE_BYTE_0F3A */
6080 {
6081 /* 00 */
6082 { Bad_Opcode },
6083 { Bad_Opcode },
6084 { Bad_Opcode },
6085 { Bad_Opcode },
6086 { Bad_Opcode },
6087 { Bad_Opcode },
6088 { Bad_Opcode },
6089 { Bad_Opcode },
6090 /* 08 */
6091 { PREFIX_TABLE (PREFIX_0F3A08) },
6092 { PREFIX_TABLE (PREFIX_0F3A09) },
6093 { PREFIX_TABLE (PREFIX_0F3A0A) },
6094 { PREFIX_TABLE (PREFIX_0F3A0B) },
6095 { PREFIX_TABLE (PREFIX_0F3A0C) },
6096 { PREFIX_TABLE (PREFIX_0F3A0D) },
6097 { PREFIX_TABLE (PREFIX_0F3A0E) },
6098 { "palignr", { MX, EM, Ib } },
6099 /* 10 */
6100 { Bad_Opcode },
6101 { Bad_Opcode },
6102 { Bad_Opcode },
6103 { Bad_Opcode },
6104 { PREFIX_TABLE (PREFIX_0F3A14) },
6105 { PREFIX_TABLE (PREFIX_0F3A15) },
6106 { PREFIX_TABLE (PREFIX_0F3A16) },
6107 { PREFIX_TABLE (PREFIX_0F3A17) },
6108 /* 18 */
6109 { Bad_Opcode },
6110 { Bad_Opcode },
6111 { Bad_Opcode },
6112 { Bad_Opcode },
6113 { Bad_Opcode },
6114 { Bad_Opcode },
6115 { Bad_Opcode },
6116 { Bad_Opcode },
6117 /* 20 */
6118 { PREFIX_TABLE (PREFIX_0F3A20) },
6119 { PREFIX_TABLE (PREFIX_0F3A21) },
6120 { PREFIX_TABLE (PREFIX_0F3A22) },
6121 { Bad_Opcode },
6122 { Bad_Opcode },
6123 { Bad_Opcode },
6124 { Bad_Opcode },
6125 { Bad_Opcode },
6126 /* 28 */
6127 { Bad_Opcode },
6128 { Bad_Opcode },
6129 { Bad_Opcode },
6130 { Bad_Opcode },
6131 { Bad_Opcode },
6132 { Bad_Opcode },
6133 { Bad_Opcode },
6134 { Bad_Opcode },
6135 /* 30 */
6136 { Bad_Opcode },
6137 { Bad_Opcode },
6138 { Bad_Opcode },
6139 { Bad_Opcode },
6140 { Bad_Opcode },
6141 { Bad_Opcode },
6142 { Bad_Opcode },
6143 { Bad_Opcode },
6144 /* 38 */
6145 { Bad_Opcode },
6146 { Bad_Opcode },
6147 { Bad_Opcode },
6148 { Bad_Opcode },
6149 { Bad_Opcode },
6150 { Bad_Opcode },
6151 { Bad_Opcode },
6152 { Bad_Opcode },
6153 /* 40 */
6154 { PREFIX_TABLE (PREFIX_0F3A40) },
6155 { PREFIX_TABLE (PREFIX_0F3A41) },
6156 { PREFIX_TABLE (PREFIX_0F3A42) },
6157 { Bad_Opcode },
6158 { PREFIX_TABLE (PREFIX_0F3A44) },
6159 { Bad_Opcode },
6160 { Bad_Opcode },
6161 { Bad_Opcode },
6162 /* 48 */
6163 { Bad_Opcode },
6164 { Bad_Opcode },
6165 { Bad_Opcode },
6166 { Bad_Opcode },
6167 { Bad_Opcode },
6168 { Bad_Opcode },
6169 { Bad_Opcode },
6170 { Bad_Opcode },
6171 /* 50 */
6172 { Bad_Opcode },
6173 { Bad_Opcode },
6174 { Bad_Opcode },
6175 { Bad_Opcode },
6176 { Bad_Opcode },
6177 { Bad_Opcode },
6178 { Bad_Opcode },
6179 { Bad_Opcode },
6180 /* 58 */
6181 { Bad_Opcode },
6182 { Bad_Opcode },
6183 { Bad_Opcode },
6184 { Bad_Opcode },
6185 { Bad_Opcode },
6186 { Bad_Opcode },
6187 { Bad_Opcode },
6188 { Bad_Opcode },
6189 /* 60 */
6190 { PREFIX_TABLE (PREFIX_0F3A60) },
6191 { PREFIX_TABLE (PREFIX_0F3A61) },
6192 { PREFIX_TABLE (PREFIX_0F3A62) },
6193 { PREFIX_TABLE (PREFIX_0F3A63) },
6194 { Bad_Opcode },
6195 { Bad_Opcode },
6196 { Bad_Opcode },
6197 { Bad_Opcode },
6198 /* 68 */
6199 { Bad_Opcode },
6200 { Bad_Opcode },
6201 { Bad_Opcode },
6202 { Bad_Opcode },
6203 { Bad_Opcode },
6204 { Bad_Opcode },
6205 { Bad_Opcode },
6206 { Bad_Opcode },
6207 /* 70 */
6208 { Bad_Opcode },
6209 { Bad_Opcode },
6210 { Bad_Opcode },
6211 { Bad_Opcode },
6212 { Bad_Opcode },
6213 { Bad_Opcode },
6214 { Bad_Opcode },
6215 { Bad_Opcode },
6216 /* 78 */
6217 { Bad_Opcode },
6218 { Bad_Opcode },
6219 { Bad_Opcode },
6220 { Bad_Opcode },
6221 { Bad_Opcode },
6222 { Bad_Opcode },
6223 { Bad_Opcode },
6224 { Bad_Opcode },
6225 /* 80 */
6226 { Bad_Opcode },
6227 { Bad_Opcode },
6228 { Bad_Opcode },
6229 { Bad_Opcode },
6230 { Bad_Opcode },
6231 { Bad_Opcode },
6232 { Bad_Opcode },
6233 { Bad_Opcode },
6234 /* 88 */
6235 { Bad_Opcode },
6236 { Bad_Opcode },
6237 { Bad_Opcode },
6238 { Bad_Opcode },
6239 { Bad_Opcode },
6240 { Bad_Opcode },
6241 { Bad_Opcode },
6242 { Bad_Opcode },
6243 /* 90 */
6244 { Bad_Opcode },
6245 { Bad_Opcode },
6246 { Bad_Opcode },
6247 { Bad_Opcode },
6248 { Bad_Opcode },
6249 { Bad_Opcode },
6250 { Bad_Opcode },
6251 { Bad_Opcode },
6252 /* 98 */
6253 { Bad_Opcode },
6254 { Bad_Opcode },
6255 { Bad_Opcode },
6256 { Bad_Opcode },
6257 { Bad_Opcode },
6258 { Bad_Opcode },
6259 { Bad_Opcode },
6260 { Bad_Opcode },
6261 /* a0 */
6262 { Bad_Opcode },
6263 { Bad_Opcode },
6264 { Bad_Opcode },
6265 { Bad_Opcode },
6266 { Bad_Opcode },
6267 { Bad_Opcode },
6268 { Bad_Opcode },
6269 { Bad_Opcode },
6270 /* a8 */
6271 { Bad_Opcode },
6272 { Bad_Opcode },
6273 { Bad_Opcode },
6274 { Bad_Opcode },
6275 { Bad_Opcode },
6276 { Bad_Opcode },
6277 { Bad_Opcode },
6278 { Bad_Opcode },
6279 /* b0 */
6280 { Bad_Opcode },
6281 { Bad_Opcode },
6282 { Bad_Opcode },
6283 { Bad_Opcode },
6284 { Bad_Opcode },
6285 { Bad_Opcode },
6286 { Bad_Opcode },
6287 { Bad_Opcode },
6288 /* b8 */
6289 { Bad_Opcode },
6290 { Bad_Opcode },
6291 { Bad_Opcode },
6292 { Bad_Opcode },
6293 { Bad_Opcode },
6294 { Bad_Opcode },
6295 { Bad_Opcode },
6296 { Bad_Opcode },
6297 /* c0 */
6298 { Bad_Opcode },
6299 { Bad_Opcode },
6300 { Bad_Opcode },
6301 { Bad_Opcode },
6302 { Bad_Opcode },
6303 { Bad_Opcode },
6304 { Bad_Opcode },
6305 { Bad_Opcode },
6306 /* c8 */
6307 { Bad_Opcode },
6308 { Bad_Opcode },
6309 { Bad_Opcode },
6310 { Bad_Opcode },
6311 { Bad_Opcode },
6312 { Bad_Opcode },
6313 { Bad_Opcode },
6314 { Bad_Opcode },
6315 /* d0 */
6316 { Bad_Opcode },
6317 { Bad_Opcode },
6318 { Bad_Opcode },
6319 { Bad_Opcode },
6320 { Bad_Opcode },
6321 { Bad_Opcode },
6322 { Bad_Opcode },
6323 { Bad_Opcode },
6324 /* d8 */
6325 { Bad_Opcode },
6326 { Bad_Opcode },
6327 { Bad_Opcode },
6328 { Bad_Opcode },
6329 { Bad_Opcode },
6330 { Bad_Opcode },
6331 { Bad_Opcode },
6332 { PREFIX_TABLE (PREFIX_0F3ADF) },
6333 /* e0 */
6334 { Bad_Opcode },
6335 { Bad_Opcode },
6336 { Bad_Opcode },
6337 { Bad_Opcode },
6338 { Bad_Opcode },
6339 { Bad_Opcode },
6340 { Bad_Opcode },
6341 { Bad_Opcode },
6342 /* e8 */
6343 { Bad_Opcode },
6344 { Bad_Opcode },
6345 { Bad_Opcode },
6346 { Bad_Opcode },
6347 { Bad_Opcode },
6348 { Bad_Opcode },
6349 { Bad_Opcode },
6350 { Bad_Opcode },
6351 /* f0 */
6352 { Bad_Opcode },
6353 { Bad_Opcode },
6354 { Bad_Opcode },
6355 { Bad_Opcode },
6356 { Bad_Opcode },
6357 { Bad_Opcode },
6358 { Bad_Opcode },
6359 { Bad_Opcode },
6360 /* f8 */
6361 { Bad_Opcode },
6362 { Bad_Opcode },
6363 { Bad_Opcode },
6364 { Bad_Opcode },
6365 { Bad_Opcode },
6366 { Bad_Opcode },
6367 { Bad_Opcode },
6368 { Bad_Opcode },
6369 },
6370
6371 /* THREE_BYTE_0F7A */
6372 {
6373 /* 00 */
6374 { Bad_Opcode },
6375 { Bad_Opcode },
6376 { Bad_Opcode },
6377 { Bad_Opcode },
6378 { Bad_Opcode },
6379 { Bad_Opcode },
6380 { Bad_Opcode },
6381 { Bad_Opcode },
6382 /* 08 */
6383 { Bad_Opcode },
6384 { Bad_Opcode },
6385 { Bad_Opcode },
6386 { Bad_Opcode },
6387 { Bad_Opcode },
6388 { Bad_Opcode },
6389 { Bad_Opcode },
6390 { Bad_Opcode },
6391 /* 10 */
6392 { Bad_Opcode },
6393 { Bad_Opcode },
6394 { Bad_Opcode },
6395 { Bad_Opcode },
6396 { Bad_Opcode },
6397 { Bad_Opcode },
6398 { Bad_Opcode },
6399 { Bad_Opcode },
6400 /* 18 */
6401 { Bad_Opcode },
6402 { Bad_Opcode },
6403 { Bad_Opcode },
6404 { Bad_Opcode },
6405 { Bad_Opcode },
6406 { Bad_Opcode },
6407 { Bad_Opcode },
6408 { Bad_Opcode },
6409 /* 20 */
6410 { "ptest", { XX } },
6411 { Bad_Opcode },
6412 { Bad_Opcode },
6413 { Bad_Opcode },
6414 { Bad_Opcode },
6415 { Bad_Opcode },
6416 { Bad_Opcode },
6417 { Bad_Opcode },
6418 /* 28 */
6419 { Bad_Opcode },
6420 { Bad_Opcode },
6421 { Bad_Opcode },
6422 { Bad_Opcode },
6423 { Bad_Opcode },
6424 { Bad_Opcode },
6425 { Bad_Opcode },
6426 { Bad_Opcode },
6427 /* 30 */
6428 { Bad_Opcode },
6429 { Bad_Opcode },
6430 { Bad_Opcode },
6431 { Bad_Opcode },
6432 { Bad_Opcode },
6433 { Bad_Opcode },
6434 { Bad_Opcode },
6435 { Bad_Opcode },
6436 /* 38 */
6437 { Bad_Opcode },
6438 { Bad_Opcode },
6439 { Bad_Opcode },
6440 { Bad_Opcode },
6441 { Bad_Opcode },
6442 { Bad_Opcode },
6443 { Bad_Opcode },
6444 { Bad_Opcode },
6445 /* 40 */
6446 { Bad_Opcode },
6447 { "phaddbw", { XM, EXq } },
6448 { "phaddbd", { XM, EXq } },
6449 { "phaddbq", { XM, EXq } },
6450 { Bad_Opcode },
6451 { Bad_Opcode },
6452 { "phaddwd", { XM, EXq } },
6453 { "phaddwq", { XM, EXq } },
6454 /* 48 */
6455 { Bad_Opcode },
6456 { Bad_Opcode },
6457 { Bad_Opcode },
6458 { "phadddq", { XM, EXq } },
6459 { Bad_Opcode },
6460 { Bad_Opcode },
6461 { Bad_Opcode },
6462 { Bad_Opcode },
6463 /* 50 */
6464 { Bad_Opcode },
6465 { "phaddubw", { XM, EXq } },
6466 { "phaddubd", { XM, EXq } },
6467 { "phaddubq", { XM, EXq } },
6468 { Bad_Opcode },
6469 { Bad_Opcode },
6470 { "phadduwd", { XM, EXq } },
6471 { "phadduwq", { XM, EXq } },
6472 /* 58 */
6473 { Bad_Opcode },
6474 { Bad_Opcode },
6475 { Bad_Opcode },
6476 { "phaddudq", { XM, EXq } },
6477 { Bad_Opcode },
6478 { Bad_Opcode },
6479 { Bad_Opcode },
6480 { Bad_Opcode },
6481 /* 60 */
6482 { Bad_Opcode },
6483 { "phsubbw", { XM, EXq } },
6484 { "phsubbd", { XM, EXq } },
6485 { "phsubbq", { XM, EXq } },
6486 { Bad_Opcode },
6487 { Bad_Opcode },
6488 { Bad_Opcode },
6489 { Bad_Opcode },
6490 /* 68 */
6491 { Bad_Opcode },
6492 { Bad_Opcode },
6493 { Bad_Opcode },
6494 { Bad_Opcode },
6495 { Bad_Opcode },
6496 { Bad_Opcode },
6497 { Bad_Opcode },
6498 { Bad_Opcode },
6499 /* 70 */
6500 { Bad_Opcode },
6501 { Bad_Opcode },
6502 { Bad_Opcode },
6503 { Bad_Opcode },
6504 { Bad_Opcode },
6505 { Bad_Opcode },
6506 { Bad_Opcode },
6507 { Bad_Opcode },
6508 /* 78 */
6509 { Bad_Opcode },
6510 { Bad_Opcode },
6511 { Bad_Opcode },
6512 { Bad_Opcode },
6513 { Bad_Opcode },
6514 { Bad_Opcode },
6515 { Bad_Opcode },
6516 { Bad_Opcode },
6517 /* 80 */
6518 { Bad_Opcode },
6519 { Bad_Opcode },
6520 { Bad_Opcode },
6521 { Bad_Opcode },
6522 { Bad_Opcode },
6523 { Bad_Opcode },
6524 { Bad_Opcode },
6525 { Bad_Opcode },
6526 /* 88 */
6527 { Bad_Opcode },
6528 { Bad_Opcode },
6529 { Bad_Opcode },
6530 { Bad_Opcode },
6531 { Bad_Opcode },
6532 { Bad_Opcode },
6533 { Bad_Opcode },
6534 { Bad_Opcode },
6535 /* 90 */
6536 { Bad_Opcode },
6537 { Bad_Opcode },
6538 { Bad_Opcode },
6539 { Bad_Opcode },
6540 { Bad_Opcode },
6541 { Bad_Opcode },
6542 { Bad_Opcode },
6543 { Bad_Opcode },
6544 /* 98 */
6545 { Bad_Opcode },
6546 { Bad_Opcode },
6547 { Bad_Opcode },
6548 { Bad_Opcode },
6549 { Bad_Opcode },
6550 { Bad_Opcode },
6551 { Bad_Opcode },
6552 { Bad_Opcode },
6553 /* a0 */
6554 { Bad_Opcode },
6555 { Bad_Opcode },
6556 { Bad_Opcode },
6557 { Bad_Opcode },
6558 { Bad_Opcode },
6559 { Bad_Opcode },
6560 { Bad_Opcode },
6561 { Bad_Opcode },
6562 /* a8 */
6563 { Bad_Opcode },
6564 { Bad_Opcode },
6565 { Bad_Opcode },
6566 { Bad_Opcode },
6567 { Bad_Opcode },
6568 { Bad_Opcode },
6569 { Bad_Opcode },
6570 { Bad_Opcode },
6571 /* b0 */
6572 { Bad_Opcode },
6573 { Bad_Opcode },
6574 { Bad_Opcode },
6575 { Bad_Opcode },
6576 { Bad_Opcode },
6577 { Bad_Opcode },
6578 { Bad_Opcode },
6579 { Bad_Opcode },
6580 /* b8 */
6581 { Bad_Opcode },
6582 { Bad_Opcode },
6583 { Bad_Opcode },
6584 { Bad_Opcode },
6585 { Bad_Opcode },
6586 { Bad_Opcode },
6587 { Bad_Opcode },
6588 { Bad_Opcode },
6589 /* c0 */
6590 { Bad_Opcode },
6591 { Bad_Opcode },
6592 { Bad_Opcode },
6593 { Bad_Opcode },
6594 { Bad_Opcode },
6595 { Bad_Opcode },
6596 { Bad_Opcode },
6597 { Bad_Opcode },
6598 /* c8 */
6599 { Bad_Opcode },
6600 { Bad_Opcode },
6601 { Bad_Opcode },
6602 { Bad_Opcode },
6603 { Bad_Opcode },
6604 { Bad_Opcode },
6605 { Bad_Opcode },
6606 { Bad_Opcode },
6607 /* d0 */
6608 { Bad_Opcode },
6609 { Bad_Opcode },
6610 { Bad_Opcode },
6611 { Bad_Opcode },
6612 { Bad_Opcode },
6613 { Bad_Opcode },
6614 { Bad_Opcode },
6615 { Bad_Opcode },
6616 /* d8 */
6617 { Bad_Opcode },
6618 { Bad_Opcode },
6619 { Bad_Opcode },
6620 { Bad_Opcode },
6621 { Bad_Opcode },
6622 { Bad_Opcode },
6623 { Bad_Opcode },
6624 { Bad_Opcode },
6625 /* e0 */
6626 { Bad_Opcode },
6627 { Bad_Opcode },
6628 { Bad_Opcode },
6629 { Bad_Opcode },
6630 { Bad_Opcode },
6631 { Bad_Opcode },
6632 { Bad_Opcode },
6633 { Bad_Opcode },
6634 /* e8 */
6635 { Bad_Opcode },
6636 { Bad_Opcode },
6637 { Bad_Opcode },
6638 { Bad_Opcode },
6639 { Bad_Opcode },
6640 { Bad_Opcode },
6641 { Bad_Opcode },
6642 { Bad_Opcode },
6643 /* f0 */
6644 { Bad_Opcode },
6645 { Bad_Opcode },
6646 { Bad_Opcode },
6647 { Bad_Opcode },
6648 { Bad_Opcode },
6649 { Bad_Opcode },
6650 { Bad_Opcode },
6651 { Bad_Opcode },
6652 /* f8 */
6653 { Bad_Opcode },
6654 { Bad_Opcode },
6655 { Bad_Opcode },
6656 { Bad_Opcode },
6657 { Bad_Opcode },
6658 { Bad_Opcode },
6659 { Bad_Opcode },
6660 { Bad_Opcode },
6661 },
6662 };
6663
6664 static const struct dis386 xop_table[][256] = {
6665 /* XOP_08 */
6666 {
6667 /* 00 */
6668 { Bad_Opcode },
6669 { Bad_Opcode },
6670 { Bad_Opcode },
6671 { Bad_Opcode },
6672 { Bad_Opcode },
6673 { Bad_Opcode },
6674 { Bad_Opcode },
6675 { Bad_Opcode },
6676 /* 08 */
6677 { Bad_Opcode },
6678 { Bad_Opcode },
6679 { Bad_Opcode },
6680 { Bad_Opcode },
6681 { Bad_Opcode },
6682 { Bad_Opcode },
6683 { Bad_Opcode },
6684 { Bad_Opcode },
6685 /* 10 */
6686 { Bad_Opcode },
6687 { Bad_Opcode },
6688 { Bad_Opcode },
6689 { Bad_Opcode },
6690 { Bad_Opcode },
6691 { Bad_Opcode },
6692 { Bad_Opcode },
6693 { Bad_Opcode },
6694 /* 18 */
6695 { Bad_Opcode },
6696 { Bad_Opcode },
6697 { Bad_Opcode },
6698 { Bad_Opcode },
6699 { Bad_Opcode },
6700 { Bad_Opcode },
6701 { Bad_Opcode },
6702 { Bad_Opcode },
6703 /* 20 */
6704 { Bad_Opcode },
6705 { Bad_Opcode },
6706 { Bad_Opcode },
6707 { Bad_Opcode },
6708 { Bad_Opcode },
6709 { Bad_Opcode },
6710 { Bad_Opcode },
6711 { Bad_Opcode },
6712 /* 28 */
6713 { Bad_Opcode },
6714 { Bad_Opcode },
6715 { Bad_Opcode },
6716 { Bad_Opcode },
6717 { Bad_Opcode },
6718 { Bad_Opcode },
6719 { Bad_Opcode },
6720 { Bad_Opcode },
6721 /* 30 */
6722 { Bad_Opcode },
6723 { Bad_Opcode },
6724 { Bad_Opcode },
6725 { Bad_Opcode },
6726 { Bad_Opcode },
6727 { Bad_Opcode },
6728 { Bad_Opcode },
6729 { Bad_Opcode },
6730 /* 38 */
6731 { Bad_Opcode },
6732 { Bad_Opcode },
6733 { Bad_Opcode },
6734 { Bad_Opcode },
6735 { Bad_Opcode },
6736 { Bad_Opcode },
6737 { Bad_Opcode },
6738 { Bad_Opcode },
6739 /* 40 */
6740 { Bad_Opcode },
6741 { Bad_Opcode },
6742 { Bad_Opcode },
6743 { Bad_Opcode },
6744 { Bad_Opcode },
6745 { Bad_Opcode },
6746 { Bad_Opcode },
6747 { Bad_Opcode },
6748 /* 48 */
6749 { Bad_Opcode },
6750 { Bad_Opcode },
6751 { Bad_Opcode },
6752 { Bad_Opcode },
6753 { Bad_Opcode },
6754 { Bad_Opcode },
6755 { Bad_Opcode },
6756 { Bad_Opcode },
6757 /* 50 */
6758 { Bad_Opcode },
6759 { Bad_Opcode },
6760 { Bad_Opcode },
6761 { Bad_Opcode },
6762 { Bad_Opcode },
6763 { Bad_Opcode },
6764 { Bad_Opcode },
6765 { Bad_Opcode },
6766 /* 58 */
6767 { Bad_Opcode },
6768 { Bad_Opcode },
6769 { Bad_Opcode },
6770 { Bad_Opcode },
6771 { Bad_Opcode },
6772 { Bad_Opcode },
6773 { Bad_Opcode },
6774 { Bad_Opcode },
6775 /* 60 */
6776 { Bad_Opcode },
6777 { Bad_Opcode },
6778 { Bad_Opcode },
6779 { Bad_Opcode },
6780 { Bad_Opcode },
6781 { Bad_Opcode },
6782 { Bad_Opcode },
6783 { Bad_Opcode },
6784 /* 68 */
6785 { Bad_Opcode },
6786 { Bad_Opcode },
6787 { Bad_Opcode },
6788 { Bad_Opcode },
6789 { Bad_Opcode },
6790 { Bad_Opcode },
6791 { Bad_Opcode },
6792 { Bad_Opcode },
6793 /* 70 */
6794 { Bad_Opcode },
6795 { Bad_Opcode },
6796 { Bad_Opcode },
6797 { Bad_Opcode },
6798 { Bad_Opcode },
6799 { Bad_Opcode },
6800 { Bad_Opcode },
6801 { Bad_Opcode },
6802 /* 78 */
6803 { Bad_Opcode },
6804 { Bad_Opcode },
6805 { Bad_Opcode },
6806 { Bad_Opcode },
6807 { Bad_Opcode },
6808 { Bad_Opcode },
6809 { Bad_Opcode },
6810 { Bad_Opcode },
6811 /* 80 */
6812 { Bad_Opcode },
6813 { Bad_Opcode },
6814 { Bad_Opcode },
6815 { Bad_Opcode },
6816 { Bad_Opcode },
6817 { "vpmacssww", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6818 { "vpmacsswd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6819 { "vpmacssdql", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6820 /* 88 */
6821 { Bad_Opcode },
6822 { Bad_Opcode },
6823 { Bad_Opcode },
6824 { Bad_Opcode },
6825 { Bad_Opcode },
6826 { Bad_Opcode },
6827 { "vpmacssdd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6828 { "vpmacssdqh", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6829 /* 90 */
6830 { Bad_Opcode },
6831 { Bad_Opcode },
6832 { Bad_Opcode },
6833 { Bad_Opcode },
6834 { Bad_Opcode },
6835 { "vpmacsww", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6836 { "vpmacswd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6837 { "vpmacsdql", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6838 /* 98 */
6839 { Bad_Opcode },
6840 { Bad_Opcode },
6841 { Bad_Opcode },
6842 { Bad_Opcode },
6843 { Bad_Opcode },
6844 { Bad_Opcode },
6845 { "vpmacsdd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6846 { "vpmacsdqh", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6847 /* a0 */
6848 { Bad_Opcode },
6849 { Bad_Opcode },
6850 { "vpcmov", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6851 { "vpperm", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6852 { Bad_Opcode },
6853 { Bad_Opcode },
6854 { "vpmadcsswd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6855 { Bad_Opcode },
6856 /* a8 */
6857 { Bad_Opcode },
6858 { Bad_Opcode },
6859 { Bad_Opcode },
6860 { Bad_Opcode },
6861 { Bad_Opcode },
6862 { Bad_Opcode },
6863 { Bad_Opcode },
6864 { Bad_Opcode },
6865 /* b0 */
6866 { Bad_Opcode },
6867 { Bad_Opcode },
6868 { Bad_Opcode },
6869 { Bad_Opcode },
6870 { Bad_Opcode },
6871 { Bad_Opcode },
6872 { "vpmadcswd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6873 { Bad_Opcode },
6874 /* b8 */
6875 { Bad_Opcode },
6876 { Bad_Opcode },
6877 { Bad_Opcode },
6878 { Bad_Opcode },
6879 { Bad_Opcode },
6880 { Bad_Opcode },
6881 { Bad_Opcode },
6882 { Bad_Opcode },
6883 /* c0 */
6884 { "vprotb", { XM, Vex_2src_1, Ib } },
6885 { "vprotw", { XM, Vex_2src_1, Ib } },
6886 { "vprotd", { XM, Vex_2src_1, Ib } },
6887 { "vprotq", { XM, Vex_2src_1, Ib } },
6888 { Bad_Opcode },
6889 { Bad_Opcode },
6890 { Bad_Opcode },
6891 { Bad_Opcode },
6892 /* c8 */
6893 { Bad_Opcode },
6894 { Bad_Opcode },
6895 { Bad_Opcode },
6896 { Bad_Opcode },
6897 { "vpcomb", { XM, Vex128, EXx, Ib } },
6898 { "vpcomw", { XM, Vex128, EXx, Ib } },
6899 { "vpcomd", { XM, Vex128, EXx, Ib } },
6900 { "vpcomq", { XM, Vex128, EXx, Ib } },
6901 /* d0 */
6902 { Bad_Opcode },
6903 { Bad_Opcode },
6904 { Bad_Opcode },
6905 { Bad_Opcode },
6906 { Bad_Opcode },
6907 { Bad_Opcode },
6908 { Bad_Opcode },
6909 { Bad_Opcode },
6910 /* d8 */
6911 { Bad_Opcode },
6912 { Bad_Opcode },
6913 { Bad_Opcode },
6914 { Bad_Opcode },
6915 { Bad_Opcode },
6916 { Bad_Opcode },
6917 { Bad_Opcode },
6918 { Bad_Opcode },
6919 /* e0 */
6920 { Bad_Opcode },
6921 { Bad_Opcode },
6922 { Bad_Opcode },
6923 { Bad_Opcode },
6924 { Bad_Opcode },
6925 { Bad_Opcode },
6926 { Bad_Opcode },
6927 { Bad_Opcode },
6928 /* e8 */
6929 { Bad_Opcode },
6930 { Bad_Opcode },
6931 { Bad_Opcode },
6932 { Bad_Opcode },
6933 { "vpcomub", { XM, Vex128, EXx, Ib } },
6934 { "vpcomuw", { XM, Vex128, EXx, Ib } },
6935 { "vpcomud", { XM, Vex128, EXx, Ib } },
6936 { "vpcomuq", { XM, Vex128, EXx, Ib } },
6937 /* f0 */
6938 { Bad_Opcode },
6939 { Bad_Opcode },
6940 { Bad_Opcode },
6941 { Bad_Opcode },
6942 { Bad_Opcode },
6943 { Bad_Opcode },
6944 { Bad_Opcode },
6945 { Bad_Opcode },
6946 /* f8 */
6947 { Bad_Opcode },
6948 { Bad_Opcode },
6949 { Bad_Opcode },
6950 { Bad_Opcode },
6951 { Bad_Opcode },
6952 { Bad_Opcode },
6953 { Bad_Opcode },
6954 { Bad_Opcode },
6955 },
6956 /* XOP_09 */
6957 {
6958 /* 00 */
6959 { Bad_Opcode },
6960 { REG_TABLE (REG_XOP_TBM_01) },
6961 { REG_TABLE (REG_XOP_TBM_02) },
6962 { Bad_Opcode },
6963 { Bad_Opcode },
6964 { Bad_Opcode },
6965 { Bad_Opcode },
6966 { Bad_Opcode },
6967 /* 08 */
6968 { Bad_Opcode },
6969 { Bad_Opcode },
6970 { Bad_Opcode },
6971 { Bad_Opcode },
6972 { Bad_Opcode },
6973 { Bad_Opcode },
6974 { Bad_Opcode },
6975 { Bad_Opcode },
6976 /* 10 */
6977 { Bad_Opcode },
6978 { Bad_Opcode },
6979 { REG_TABLE (REG_XOP_LWPCB) },
6980 { Bad_Opcode },
6981 { Bad_Opcode },
6982 { Bad_Opcode },
6983 { Bad_Opcode },
6984 { Bad_Opcode },
6985 /* 18 */
6986 { Bad_Opcode },
6987 { Bad_Opcode },
6988 { Bad_Opcode },
6989 { Bad_Opcode },
6990 { Bad_Opcode },
6991 { Bad_Opcode },
6992 { Bad_Opcode },
6993 { Bad_Opcode },
6994 /* 20 */
6995 { Bad_Opcode },
6996 { Bad_Opcode },
6997 { Bad_Opcode },
6998 { Bad_Opcode },
6999 { Bad_Opcode },
7000 { Bad_Opcode },
7001 { Bad_Opcode },
7002 { Bad_Opcode },
7003 /* 28 */
7004 { Bad_Opcode },
7005 { Bad_Opcode },
7006 { Bad_Opcode },
7007 { Bad_Opcode },
7008 { Bad_Opcode },
7009 { Bad_Opcode },
7010 { Bad_Opcode },
7011 { Bad_Opcode },
7012 /* 30 */
7013 { Bad_Opcode },
7014 { Bad_Opcode },
7015 { Bad_Opcode },
7016 { Bad_Opcode },
7017 { Bad_Opcode },
7018 { Bad_Opcode },
7019 { Bad_Opcode },
7020 { Bad_Opcode },
7021 /* 38 */
7022 { Bad_Opcode },
7023 { Bad_Opcode },
7024 { Bad_Opcode },
7025 { Bad_Opcode },
7026 { Bad_Opcode },
7027 { Bad_Opcode },
7028 { Bad_Opcode },
7029 { Bad_Opcode },
7030 /* 40 */
7031 { Bad_Opcode },
7032 { Bad_Opcode },
7033 { Bad_Opcode },
7034 { Bad_Opcode },
7035 { Bad_Opcode },
7036 { Bad_Opcode },
7037 { Bad_Opcode },
7038 { Bad_Opcode },
7039 /* 48 */
7040 { Bad_Opcode },
7041 { Bad_Opcode },
7042 { Bad_Opcode },
7043 { Bad_Opcode },
7044 { Bad_Opcode },
7045 { Bad_Opcode },
7046 { Bad_Opcode },
7047 { Bad_Opcode },
7048 /* 50 */
7049 { Bad_Opcode },
7050 { Bad_Opcode },
7051 { Bad_Opcode },
7052 { Bad_Opcode },
7053 { Bad_Opcode },
7054 { Bad_Opcode },
7055 { Bad_Opcode },
7056 { Bad_Opcode },
7057 /* 58 */
7058 { Bad_Opcode },
7059 { Bad_Opcode },
7060 { Bad_Opcode },
7061 { Bad_Opcode },
7062 { Bad_Opcode },
7063 { Bad_Opcode },
7064 { Bad_Opcode },
7065 { Bad_Opcode },
7066 /* 60 */
7067 { Bad_Opcode },
7068 { Bad_Opcode },
7069 { Bad_Opcode },
7070 { Bad_Opcode },
7071 { Bad_Opcode },
7072 { Bad_Opcode },
7073 { Bad_Opcode },
7074 { Bad_Opcode },
7075 /* 68 */
7076 { Bad_Opcode },
7077 { Bad_Opcode },
7078 { Bad_Opcode },
7079 { Bad_Opcode },
7080 { Bad_Opcode },
7081 { Bad_Opcode },
7082 { Bad_Opcode },
7083 { Bad_Opcode },
7084 /* 70 */
7085 { Bad_Opcode },
7086 { Bad_Opcode },
7087 { Bad_Opcode },
7088 { Bad_Opcode },
7089 { Bad_Opcode },
7090 { Bad_Opcode },
7091 { Bad_Opcode },
7092 { Bad_Opcode },
7093 /* 78 */
7094 { Bad_Opcode },
7095 { Bad_Opcode },
7096 { Bad_Opcode },
7097 { Bad_Opcode },
7098 { Bad_Opcode },
7099 { Bad_Opcode },
7100 { Bad_Opcode },
7101 { Bad_Opcode },
7102 /* 80 */
7103 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_80) },
7104 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_81) },
7105 { "vfrczss", { XM, EXd } },
7106 { "vfrczsd", { XM, EXq } },
7107 { Bad_Opcode },
7108 { Bad_Opcode },
7109 { Bad_Opcode },
7110 { Bad_Opcode },
7111 /* 88 */
7112 { Bad_Opcode },
7113 { Bad_Opcode },
7114 { Bad_Opcode },
7115 { Bad_Opcode },
7116 { Bad_Opcode },
7117 { Bad_Opcode },
7118 { Bad_Opcode },
7119 { Bad_Opcode },
7120 /* 90 */
7121 { "vprotb", { XM, Vex_2src_1, Vex_2src_2 } },
7122 { "vprotw", { XM, Vex_2src_1, Vex_2src_2 } },
7123 { "vprotd", { XM, Vex_2src_1, Vex_2src_2 } },
7124 { "vprotq", { XM, Vex_2src_1, Vex_2src_2 } },
7125 { "vpshlb", { XM, Vex_2src_1, Vex_2src_2 } },
7126 { "vpshlw", { XM, Vex_2src_1, Vex_2src_2 } },
7127 { "vpshld", { XM, Vex_2src_1, Vex_2src_2 } },
7128 { "vpshlq", { XM, Vex_2src_1, Vex_2src_2 } },
7129 /* 98 */
7130 { "vpshab", { XM, Vex_2src_1, Vex_2src_2 } },
7131 { "vpshaw", { XM, Vex_2src_1, Vex_2src_2 } },
7132 { "vpshad", { XM, Vex_2src_1, Vex_2src_2 } },
7133 { "vpshaq", { XM, Vex_2src_1, Vex_2src_2 } },
7134 { Bad_Opcode },
7135 { Bad_Opcode },
7136 { Bad_Opcode },
7137 { Bad_Opcode },
7138 /* a0 */
7139 { Bad_Opcode },
7140 { Bad_Opcode },
7141 { Bad_Opcode },
7142 { Bad_Opcode },
7143 { Bad_Opcode },
7144 { Bad_Opcode },
7145 { Bad_Opcode },
7146 { Bad_Opcode },
7147 /* a8 */
7148 { Bad_Opcode },
7149 { Bad_Opcode },
7150 { Bad_Opcode },
7151 { Bad_Opcode },
7152 { Bad_Opcode },
7153 { Bad_Opcode },
7154 { Bad_Opcode },
7155 { Bad_Opcode },
7156 /* b0 */
7157 { Bad_Opcode },
7158 { Bad_Opcode },
7159 { Bad_Opcode },
7160 { Bad_Opcode },
7161 { Bad_Opcode },
7162 { Bad_Opcode },
7163 { Bad_Opcode },
7164 { Bad_Opcode },
7165 /* b8 */
7166 { Bad_Opcode },
7167 { Bad_Opcode },
7168 { Bad_Opcode },
7169 { Bad_Opcode },
7170 { Bad_Opcode },
7171 { Bad_Opcode },
7172 { Bad_Opcode },
7173 { Bad_Opcode },
7174 /* c0 */
7175 { Bad_Opcode },
7176 { "vphaddbw", { XM, EXxmm } },
7177 { "vphaddbd", { XM, EXxmm } },
7178 { "vphaddbq", { XM, EXxmm } },
7179 { Bad_Opcode },
7180 { Bad_Opcode },
7181 { "vphaddwd", { XM, EXxmm } },
7182 { "vphaddwq", { XM, EXxmm } },
7183 /* c8 */
7184 { Bad_Opcode },
7185 { Bad_Opcode },
7186 { Bad_Opcode },
7187 { "vphadddq", { XM, EXxmm } },
7188 { Bad_Opcode },
7189 { Bad_Opcode },
7190 { Bad_Opcode },
7191 { Bad_Opcode },
7192 /* d0 */
7193 { Bad_Opcode },
7194 { "vphaddubw", { XM, EXxmm } },
7195 { "vphaddubd", { XM, EXxmm } },
7196 { "vphaddubq", { XM, EXxmm } },
7197 { Bad_Opcode },
7198 { Bad_Opcode },
7199 { "vphadduwd", { XM, EXxmm } },
7200 { "vphadduwq", { XM, EXxmm } },
7201 /* d8 */
7202 { Bad_Opcode },
7203 { Bad_Opcode },
7204 { Bad_Opcode },
7205 { "vphaddudq", { XM, EXxmm } },
7206 { Bad_Opcode },
7207 { Bad_Opcode },
7208 { Bad_Opcode },
7209 { Bad_Opcode },
7210 /* e0 */
7211 { Bad_Opcode },
7212 { "vphsubbw", { XM, EXxmm } },
7213 { "vphsubwd", { XM, EXxmm } },
7214 { "vphsubdq", { XM, EXxmm } },
7215 { Bad_Opcode },
7216 { Bad_Opcode },
7217 { Bad_Opcode },
7218 { Bad_Opcode },
7219 /* e8 */
7220 { Bad_Opcode },
7221 { Bad_Opcode },
7222 { Bad_Opcode },
7223 { Bad_Opcode },
7224 { Bad_Opcode },
7225 { Bad_Opcode },
7226 { Bad_Opcode },
7227 { Bad_Opcode },
7228 /* f0 */
7229 { Bad_Opcode },
7230 { Bad_Opcode },
7231 { Bad_Opcode },
7232 { Bad_Opcode },
7233 { Bad_Opcode },
7234 { Bad_Opcode },
7235 { Bad_Opcode },
7236 { Bad_Opcode },
7237 /* f8 */
7238 { Bad_Opcode },
7239 { Bad_Opcode },
7240 { Bad_Opcode },
7241 { Bad_Opcode },
7242 { Bad_Opcode },
7243 { Bad_Opcode },
7244 { Bad_Opcode },
7245 { Bad_Opcode },
7246 },
7247 /* XOP_0A */
7248 {
7249 /* 00 */
7250 { Bad_Opcode },
7251 { Bad_Opcode },
7252 { Bad_Opcode },
7253 { Bad_Opcode },
7254 { Bad_Opcode },
7255 { Bad_Opcode },
7256 { Bad_Opcode },
7257 { Bad_Opcode },
7258 /* 08 */
7259 { Bad_Opcode },
7260 { Bad_Opcode },
7261 { Bad_Opcode },
7262 { Bad_Opcode },
7263 { Bad_Opcode },
7264 { Bad_Opcode },
7265 { Bad_Opcode },
7266 { Bad_Opcode },
7267 /* 10 */
7268 { "bextr", { Gv, Ev, Iq } },
7269 { Bad_Opcode },
7270 { REG_TABLE (REG_XOP_LWP) },
7271 { Bad_Opcode },
7272 { Bad_Opcode },
7273 { Bad_Opcode },
7274 { Bad_Opcode },
7275 { Bad_Opcode },
7276 /* 18 */
7277 { Bad_Opcode },
7278 { Bad_Opcode },
7279 { Bad_Opcode },
7280 { Bad_Opcode },
7281 { Bad_Opcode },
7282 { Bad_Opcode },
7283 { Bad_Opcode },
7284 { Bad_Opcode },
7285 /* 20 */
7286 { Bad_Opcode },
7287 { Bad_Opcode },
7288 { Bad_Opcode },
7289 { Bad_Opcode },
7290 { Bad_Opcode },
7291 { Bad_Opcode },
7292 { Bad_Opcode },
7293 { Bad_Opcode },
7294 /* 28 */
7295 { Bad_Opcode },
7296 { Bad_Opcode },
7297 { Bad_Opcode },
7298 { Bad_Opcode },
7299 { Bad_Opcode },
7300 { Bad_Opcode },
7301 { Bad_Opcode },
7302 { Bad_Opcode },
7303 /* 30 */
7304 { Bad_Opcode },
7305 { Bad_Opcode },
7306 { Bad_Opcode },
7307 { Bad_Opcode },
7308 { Bad_Opcode },
7309 { Bad_Opcode },
7310 { Bad_Opcode },
7311 { Bad_Opcode },
7312 /* 38 */
7313 { Bad_Opcode },
7314 { Bad_Opcode },
7315 { Bad_Opcode },
7316 { Bad_Opcode },
7317 { Bad_Opcode },
7318 { Bad_Opcode },
7319 { Bad_Opcode },
7320 { Bad_Opcode },
7321 /* 40 */
7322 { Bad_Opcode },
7323 { Bad_Opcode },
7324 { Bad_Opcode },
7325 { Bad_Opcode },
7326 { Bad_Opcode },
7327 { Bad_Opcode },
7328 { Bad_Opcode },
7329 { Bad_Opcode },
7330 /* 48 */
7331 { Bad_Opcode },
7332 { Bad_Opcode },
7333 { Bad_Opcode },
7334 { Bad_Opcode },
7335 { Bad_Opcode },
7336 { Bad_Opcode },
7337 { Bad_Opcode },
7338 { Bad_Opcode },
7339 /* 50 */
7340 { Bad_Opcode },
7341 { Bad_Opcode },
7342 { Bad_Opcode },
7343 { Bad_Opcode },
7344 { Bad_Opcode },
7345 { Bad_Opcode },
7346 { Bad_Opcode },
7347 { Bad_Opcode },
7348 /* 58 */
7349 { Bad_Opcode },
7350 { Bad_Opcode },
7351 { Bad_Opcode },
7352 { Bad_Opcode },
7353 { Bad_Opcode },
7354 { Bad_Opcode },
7355 { Bad_Opcode },
7356 { Bad_Opcode },
7357 /* 60 */
7358 { Bad_Opcode },
7359 { Bad_Opcode },
7360 { Bad_Opcode },
7361 { Bad_Opcode },
7362 { Bad_Opcode },
7363 { Bad_Opcode },
7364 { Bad_Opcode },
7365 { Bad_Opcode },
7366 /* 68 */
7367 { Bad_Opcode },
7368 { Bad_Opcode },
7369 { Bad_Opcode },
7370 { Bad_Opcode },
7371 { Bad_Opcode },
7372 { Bad_Opcode },
7373 { Bad_Opcode },
7374 { Bad_Opcode },
7375 /* 70 */
7376 { Bad_Opcode },
7377 { Bad_Opcode },
7378 { Bad_Opcode },
7379 { Bad_Opcode },
7380 { Bad_Opcode },
7381 { Bad_Opcode },
7382 { Bad_Opcode },
7383 { Bad_Opcode },
7384 /* 78 */
7385 { Bad_Opcode },
7386 { Bad_Opcode },
7387 { Bad_Opcode },
7388 { Bad_Opcode },
7389 { Bad_Opcode },
7390 { Bad_Opcode },
7391 { Bad_Opcode },
7392 { Bad_Opcode },
7393 /* 80 */
7394 { Bad_Opcode },
7395 { Bad_Opcode },
7396 { Bad_Opcode },
7397 { Bad_Opcode },
7398 { Bad_Opcode },
7399 { Bad_Opcode },
7400 { Bad_Opcode },
7401 { Bad_Opcode },
7402 /* 88 */
7403 { Bad_Opcode },
7404 { Bad_Opcode },
7405 { Bad_Opcode },
7406 { Bad_Opcode },
7407 { Bad_Opcode },
7408 { Bad_Opcode },
7409 { Bad_Opcode },
7410 { Bad_Opcode },
7411 /* 90 */
7412 { Bad_Opcode },
7413 { Bad_Opcode },
7414 { Bad_Opcode },
7415 { Bad_Opcode },
7416 { Bad_Opcode },
7417 { Bad_Opcode },
7418 { Bad_Opcode },
7419 { Bad_Opcode },
7420 /* 98 */
7421 { Bad_Opcode },
7422 { Bad_Opcode },
7423 { Bad_Opcode },
7424 { Bad_Opcode },
7425 { Bad_Opcode },
7426 { Bad_Opcode },
7427 { Bad_Opcode },
7428 { Bad_Opcode },
7429 /* a0 */
7430 { Bad_Opcode },
7431 { Bad_Opcode },
7432 { Bad_Opcode },
7433 { Bad_Opcode },
7434 { Bad_Opcode },
7435 { Bad_Opcode },
7436 { Bad_Opcode },
7437 { Bad_Opcode },
7438 /* a8 */
7439 { Bad_Opcode },
7440 { Bad_Opcode },
7441 { Bad_Opcode },
7442 { Bad_Opcode },
7443 { Bad_Opcode },
7444 { Bad_Opcode },
7445 { Bad_Opcode },
7446 { Bad_Opcode },
7447 /* b0 */
7448 { Bad_Opcode },
7449 { Bad_Opcode },
7450 { Bad_Opcode },
7451 { Bad_Opcode },
7452 { Bad_Opcode },
7453 { Bad_Opcode },
7454 { Bad_Opcode },
7455 { Bad_Opcode },
7456 /* b8 */
7457 { Bad_Opcode },
7458 { Bad_Opcode },
7459 { Bad_Opcode },
7460 { Bad_Opcode },
7461 { Bad_Opcode },
7462 { Bad_Opcode },
7463 { Bad_Opcode },
7464 { Bad_Opcode },
7465 /* c0 */
7466 { Bad_Opcode },
7467 { Bad_Opcode },
7468 { Bad_Opcode },
7469 { Bad_Opcode },
7470 { Bad_Opcode },
7471 { Bad_Opcode },
7472 { Bad_Opcode },
7473 { Bad_Opcode },
7474 /* c8 */
7475 { Bad_Opcode },
7476 { Bad_Opcode },
7477 { Bad_Opcode },
7478 { Bad_Opcode },
7479 { Bad_Opcode },
7480 { Bad_Opcode },
7481 { Bad_Opcode },
7482 { Bad_Opcode },
7483 /* d0 */
7484 { Bad_Opcode },
7485 { Bad_Opcode },
7486 { Bad_Opcode },
7487 { Bad_Opcode },
7488 { Bad_Opcode },
7489 { Bad_Opcode },
7490 { Bad_Opcode },
7491 { Bad_Opcode },
7492 /* d8 */
7493 { Bad_Opcode },
7494 { Bad_Opcode },
7495 { Bad_Opcode },
7496 { Bad_Opcode },
7497 { Bad_Opcode },
7498 { Bad_Opcode },
7499 { Bad_Opcode },
7500 { Bad_Opcode },
7501 /* e0 */
7502 { Bad_Opcode },
7503 { Bad_Opcode },
7504 { Bad_Opcode },
7505 { Bad_Opcode },
7506 { Bad_Opcode },
7507 { Bad_Opcode },
7508 { Bad_Opcode },
7509 { Bad_Opcode },
7510 /* e8 */
7511 { Bad_Opcode },
7512 { Bad_Opcode },
7513 { Bad_Opcode },
7514 { Bad_Opcode },
7515 { Bad_Opcode },
7516 { Bad_Opcode },
7517 { Bad_Opcode },
7518 { Bad_Opcode },
7519 /* f0 */
7520 { Bad_Opcode },
7521 { Bad_Opcode },
7522 { Bad_Opcode },
7523 { Bad_Opcode },
7524 { Bad_Opcode },
7525 { Bad_Opcode },
7526 { Bad_Opcode },
7527 { Bad_Opcode },
7528 /* f8 */
7529 { Bad_Opcode },
7530 { Bad_Opcode },
7531 { Bad_Opcode },
7532 { Bad_Opcode },
7533 { Bad_Opcode },
7534 { Bad_Opcode },
7535 { Bad_Opcode },
7536 { Bad_Opcode },
7537 },
7538 };
7539
7540 static const struct dis386 vex_table[][256] = {
7541 /* VEX_0F */
7542 {
7543 /* 00 */
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 /* 08 */
7553 { Bad_Opcode },
7554 { Bad_Opcode },
7555 { Bad_Opcode },
7556 { Bad_Opcode },
7557 { Bad_Opcode },
7558 { Bad_Opcode },
7559 { Bad_Opcode },
7560 { Bad_Opcode },
7561 /* 10 */
7562 { PREFIX_TABLE (PREFIX_VEX_0F10) },
7563 { PREFIX_TABLE (PREFIX_VEX_0F11) },
7564 { PREFIX_TABLE (PREFIX_VEX_0F12) },
7565 { MOD_TABLE (MOD_VEX_0F13) },
7566 { VEX_W_TABLE (VEX_W_0F14) },
7567 { VEX_W_TABLE (VEX_W_0F15) },
7568 { PREFIX_TABLE (PREFIX_VEX_0F16) },
7569 { MOD_TABLE (MOD_VEX_0F17) },
7570 /* 18 */
7571 { Bad_Opcode },
7572 { Bad_Opcode },
7573 { Bad_Opcode },
7574 { Bad_Opcode },
7575 { Bad_Opcode },
7576 { Bad_Opcode },
7577 { Bad_Opcode },
7578 { Bad_Opcode },
7579 /* 20 */
7580 { Bad_Opcode },
7581 { Bad_Opcode },
7582 { Bad_Opcode },
7583 { Bad_Opcode },
7584 { Bad_Opcode },
7585 { Bad_Opcode },
7586 { Bad_Opcode },
7587 { Bad_Opcode },
7588 /* 28 */
7589 { VEX_W_TABLE (VEX_W_0F28) },
7590 { VEX_W_TABLE (VEX_W_0F29) },
7591 { PREFIX_TABLE (PREFIX_VEX_0F2A) },
7592 { MOD_TABLE (MOD_VEX_0F2B) },
7593 { PREFIX_TABLE (PREFIX_VEX_0F2C) },
7594 { PREFIX_TABLE (PREFIX_VEX_0F2D) },
7595 { PREFIX_TABLE (PREFIX_VEX_0F2E) },
7596 { PREFIX_TABLE (PREFIX_VEX_0F2F) },
7597 /* 30 */
7598 { Bad_Opcode },
7599 { Bad_Opcode },
7600 { Bad_Opcode },
7601 { Bad_Opcode },
7602 { Bad_Opcode },
7603 { Bad_Opcode },
7604 { Bad_Opcode },
7605 { Bad_Opcode },
7606 /* 38 */
7607 { Bad_Opcode },
7608 { Bad_Opcode },
7609 { Bad_Opcode },
7610 { Bad_Opcode },
7611 { Bad_Opcode },
7612 { Bad_Opcode },
7613 { Bad_Opcode },
7614 { Bad_Opcode },
7615 /* 40 */
7616 { Bad_Opcode },
7617 { Bad_Opcode },
7618 { Bad_Opcode },
7619 { Bad_Opcode },
7620 { Bad_Opcode },
7621 { Bad_Opcode },
7622 { Bad_Opcode },
7623 { Bad_Opcode },
7624 /* 48 */
7625 { Bad_Opcode },
7626 { Bad_Opcode },
7627 { Bad_Opcode },
7628 { Bad_Opcode },
7629 { Bad_Opcode },
7630 { Bad_Opcode },
7631 { Bad_Opcode },
7632 { Bad_Opcode },
7633 /* 50 */
7634 { MOD_TABLE (MOD_VEX_0F50) },
7635 { PREFIX_TABLE (PREFIX_VEX_0F51) },
7636 { PREFIX_TABLE (PREFIX_VEX_0F52) },
7637 { PREFIX_TABLE (PREFIX_VEX_0F53) },
7638 { "vandpX", { XM, Vex, EXx } },
7639 { "vandnpX", { XM, Vex, EXx } },
7640 { "vorpX", { XM, Vex, EXx } },
7641 { "vxorpX", { XM, Vex, EXx } },
7642 /* 58 */
7643 { PREFIX_TABLE (PREFIX_VEX_0F58) },
7644 { PREFIX_TABLE (PREFIX_VEX_0F59) },
7645 { PREFIX_TABLE (PREFIX_VEX_0F5A) },
7646 { PREFIX_TABLE (PREFIX_VEX_0F5B) },
7647 { PREFIX_TABLE (PREFIX_VEX_0F5C) },
7648 { PREFIX_TABLE (PREFIX_VEX_0F5D) },
7649 { PREFIX_TABLE (PREFIX_VEX_0F5E) },
7650 { PREFIX_TABLE (PREFIX_VEX_0F5F) },
7651 /* 60 */
7652 { PREFIX_TABLE (PREFIX_VEX_0F60) },
7653 { PREFIX_TABLE (PREFIX_VEX_0F61) },
7654 { PREFIX_TABLE (PREFIX_VEX_0F62) },
7655 { PREFIX_TABLE (PREFIX_VEX_0F63) },
7656 { PREFIX_TABLE (PREFIX_VEX_0F64) },
7657 { PREFIX_TABLE (PREFIX_VEX_0F65) },
7658 { PREFIX_TABLE (PREFIX_VEX_0F66) },
7659 { PREFIX_TABLE (PREFIX_VEX_0F67) },
7660 /* 68 */
7661 { PREFIX_TABLE (PREFIX_VEX_0F68) },
7662 { PREFIX_TABLE (PREFIX_VEX_0F69) },
7663 { PREFIX_TABLE (PREFIX_VEX_0F6A) },
7664 { PREFIX_TABLE (PREFIX_VEX_0F6B) },
7665 { PREFIX_TABLE (PREFIX_VEX_0F6C) },
7666 { PREFIX_TABLE (PREFIX_VEX_0F6D) },
7667 { PREFIX_TABLE (PREFIX_VEX_0F6E) },
7668 { PREFIX_TABLE (PREFIX_VEX_0F6F) },
7669 /* 70 */
7670 { PREFIX_TABLE (PREFIX_VEX_0F70) },
7671 { REG_TABLE (REG_VEX_0F71) },
7672 { REG_TABLE (REG_VEX_0F72) },
7673 { REG_TABLE (REG_VEX_0F73) },
7674 { PREFIX_TABLE (PREFIX_VEX_0F74) },
7675 { PREFIX_TABLE (PREFIX_VEX_0F75) },
7676 { PREFIX_TABLE (PREFIX_VEX_0F76) },
7677 { PREFIX_TABLE (PREFIX_VEX_0F77) },
7678 /* 78 */
7679 { Bad_Opcode },
7680 { Bad_Opcode },
7681 { Bad_Opcode },
7682 { Bad_Opcode },
7683 { PREFIX_TABLE (PREFIX_VEX_0F7C) },
7684 { PREFIX_TABLE (PREFIX_VEX_0F7D) },
7685 { PREFIX_TABLE (PREFIX_VEX_0F7E) },
7686 { PREFIX_TABLE (PREFIX_VEX_0F7F) },
7687 /* 80 */
7688 { Bad_Opcode },
7689 { Bad_Opcode },
7690 { Bad_Opcode },
7691 { Bad_Opcode },
7692 { Bad_Opcode },
7693 { Bad_Opcode },
7694 { Bad_Opcode },
7695 { Bad_Opcode },
7696 /* 88 */
7697 { Bad_Opcode },
7698 { Bad_Opcode },
7699 { Bad_Opcode },
7700 { Bad_Opcode },
7701 { Bad_Opcode },
7702 { Bad_Opcode },
7703 { Bad_Opcode },
7704 { Bad_Opcode },
7705 /* 90 */
7706 { Bad_Opcode },
7707 { Bad_Opcode },
7708 { Bad_Opcode },
7709 { Bad_Opcode },
7710 { Bad_Opcode },
7711 { Bad_Opcode },
7712 { Bad_Opcode },
7713 { Bad_Opcode },
7714 /* 98 */
7715 { Bad_Opcode },
7716 { Bad_Opcode },
7717 { Bad_Opcode },
7718 { Bad_Opcode },
7719 { Bad_Opcode },
7720 { Bad_Opcode },
7721 { Bad_Opcode },
7722 { Bad_Opcode },
7723 /* a0 */
7724 { Bad_Opcode },
7725 { Bad_Opcode },
7726 { Bad_Opcode },
7727 { Bad_Opcode },
7728 { Bad_Opcode },
7729 { Bad_Opcode },
7730 { Bad_Opcode },
7731 { Bad_Opcode },
7732 /* a8 */
7733 { Bad_Opcode },
7734 { Bad_Opcode },
7735 { Bad_Opcode },
7736 { Bad_Opcode },
7737 { Bad_Opcode },
7738 { Bad_Opcode },
7739 { REG_TABLE (REG_VEX_0FAE) },
7740 { Bad_Opcode },
7741 /* b0 */
7742 { Bad_Opcode },
7743 { Bad_Opcode },
7744 { Bad_Opcode },
7745 { Bad_Opcode },
7746 { Bad_Opcode },
7747 { Bad_Opcode },
7748 { Bad_Opcode },
7749 { Bad_Opcode },
7750 /* b8 */
7751 { Bad_Opcode },
7752 { Bad_Opcode },
7753 { Bad_Opcode },
7754 { Bad_Opcode },
7755 { Bad_Opcode },
7756 { Bad_Opcode },
7757 { Bad_Opcode },
7758 { Bad_Opcode },
7759 /* c0 */
7760 { Bad_Opcode },
7761 { Bad_Opcode },
7762 { PREFIX_TABLE (PREFIX_VEX_0FC2) },
7763 { Bad_Opcode },
7764 { PREFIX_TABLE (PREFIX_VEX_0FC4) },
7765 { PREFIX_TABLE (PREFIX_VEX_0FC5) },
7766 { "vshufpX", { XM, Vex, EXx, Ib } },
7767 { Bad_Opcode },
7768 /* c8 */
7769 { Bad_Opcode },
7770 { Bad_Opcode },
7771 { Bad_Opcode },
7772 { Bad_Opcode },
7773 { Bad_Opcode },
7774 { Bad_Opcode },
7775 { Bad_Opcode },
7776 { Bad_Opcode },
7777 /* d0 */
7778 { PREFIX_TABLE (PREFIX_VEX_0FD0) },
7779 { PREFIX_TABLE (PREFIX_VEX_0FD1) },
7780 { PREFIX_TABLE (PREFIX_VEX_0FD2) },
7781 { PREFIX_TABLE (PREFIX_VEX_0FD3) },
7782 { PREFIX_TABLE (PREFIX_VEX_0FD4) },
7783 { PREFIX_TABLE (PREFIX_VEX_0FD5) },
7784 { PREFIX_TABLE (PREFIX_VEX_0FD6) },
7785 { PREFIX_TABLE (PREFIX_VEX_0FD7) },
7786 /* d8 */
7787 { PREFIX_TABLE (PREFIX_VEX_0FD8) },
7788 { PREFIX_TABLE (PREFIX_VEX_0FD9) },
7789 { PREFIX_TABLE (PREFIX_VEX_0FDA) },
7790 { PREFIX_TABLE (PREFIX_VEX_0FDB) },
7791 { PREFIX_TABLE (PREFIX_VEX_0FDC) },
7792 { PREFIX_TABLE (PREFIX_VEX_0FDD) },
7793 { PREFIX_TABLE (PREFIX_VEX_0FDE) },
7794 { PREFIX_TABLE (PREFIX_VEX_0FDF) },
7795 /* e0 */
7796 { PREFIX_TABLE (PREFIX_VEX_0FE0) },
7797 { PREFIX_TABLE (PREFIX_VEX_0FE1) },
7798 { PREFIX_TABLE (PREFIX_VEX_0FE2) },
7799 { PREFIX_TABLE (PREFIX_VEX_0FE3) },
7800 { PREFIX_TABLE (PREFIX_VEX_0FE4) },
7801 { PREFIX_TABLE (PREFIX_VEX_0FE5) },
7802 { PREFIX_TABLE (PREFIX_VEX_0FE6) },
7803 { PREFIX_TABLE (PREFIX_VEX_0FE7) },
7804 /* e8 */
7805 { PREFIX_TABLE (PREFIX_VEX_0FE8) },
7806 { PREFIX_TABLE (PREFIX_VEX_0FE9) },
7807 { PREFIX_TABLE (PREFIX_VEX_0FEA) },
7808 { PREFIX_TABLE (PREFIX_VEX_0FEB) },
7809 { PREFIX_TABLE (PREFIX_VEX_0FEC) },
7810 { PREFIX_TABLE (PREFIX_VEX_0FED) },
7811 { PREFIX_TABLE (PREFIX_VEX_0FEE) },
7812 { PREFIX_TABLE (PREFIX_VEX_0FEF) },
7813 /* f0 */
7814 { PREFIX_TABLE (PREFIX_VEX_0FF0) },
7815 { PREFIX_TABLE (PREFIX_VEX_0FF1) },
7816 { PREFIX_TABLE (PREFIX_VEX_0FF2) },
7817 { PREFIX_TABLE (PREFIX_VEX_0FF3) },
7818 { PREFIX_TABLE (PREFIX_VEX_0FF4) },
7819 { PREFIX_TABLE (PREFIX_VEX_0FF5) },
7820 { PREFIX_TABLE (PREFIX_VEX_0FF6) },
7821 { PREFIX_TABLE (PREFIX_VEX_0FF7) },
7822 /* f8 */
7823 { PREFIX_TABLE (PREFIX_VEX_0FF8) },
7824 { PREFIX_TABLE (PREFIX_VEX_0FF9) },
7825 { PREFIX_TABLE (PREFIX_VEX_0FFA) },
7826 { PREFIX_TABLE (PREFIX_VEX_0FFB) },
7827 { PREFIX_TABLE (PREFIX_VEX_0FFC) },
7828 { PREFIX_TABLE (PREFIX_VEX_0FFD) },
7829 { PREFIX_TABLE (PREFIX_VEX_0FFE) },
7830 { Bad_Opcode },
7831 },
7832 /* VEX_0F38 */
7833 {
7834 /* 00 */
7835 { PREFIX_TABLE (PREFIX_VEX_0F3800) },
7836 { PREFIX_TABLE (PREFIX_VEX_0F3801) },
7837 { PREFIX_TABLE (PREFIX_VEX_0F3802) },
7838 { PREFIX_TABLE (PREFIX_VEX_0F3803) },
7839 { PREFIX_TABLE (PREFIX_VEX_0F3804) },
7840 { PREFIX_TABLE (PREFIX_VEX_0F3805) },
7841 { PREFIX_TABLE (PREFIX_VEX_0F3806) },
7842 { PREFIX_TABLE (PREFIX_VEX_0F3807) },
7843 /* 08 */
7844 { PREFIX_TABLE (PREFIX_VEX_0F3808) },
7845 { PREFIX_TABLE (PREFIX_VEX_0F3809) },
7846 { PREFIX_TABLE (PREFIX_VEX_0F380A) },
7847 { PREFIX_TABLE (PREFIX_VEX_0F380B) },
7848 { PREFIX_TABLE (PREFIX_VEX_0F380C) },
7849 { PREFIX_TABLE (PREFIX_VEX_0F380D) },
7850 { PREFIX_TABLE (PREFIX_VEX_0F380E) },
7851 { PREFIX_TABLE (PREFIX_VEX_0F380F) },
7852 /* 10 */
7853 { Bad_Opcode },
7854 { Bad_Opcode },
7855 { Bad_Opcode },
7856 { PREFIX_TABLE (PREFIX_VEX_0F3813) },
7857 { Bad_Opcode },
7858 { Bad_Opcode },
7859 { PREFIX_TABLE (PREFIX_VEX_0F3816) },
7860 { PREFIX_TABLE (PREFIX_VEX_0F3817) },
7861 /* 18 */
7862 { PREFIX_TABLE (PREFIX_VEX_0F3818) },
7863 { PREFIX_TABLE (PREFIX_VEX_0F3819) },
7864 { PREFIX_TABLE (PREFIX_VEX_0F381A) },
7865 { Bad_Opcode },
7866 { PREFIX_TABLE (PREFIX_VEX_0F381C) },
7867 { PREFIX_TABLE (PREFIX_VEX_0F381D) },
7868 { PREFIX_TABLE (PREFIX_VEX_0F381E) },
7869 { Bad_Opcode },
7870 /* 20 */
7871 { PREFIX_TABLE (PREFIX_VEX_0F3820) },
7872 { PREFIX_TABLE (PREFIX_VEX_0F3821) },
7873 { PREFIX_TABLE (PREFIX_VEX_0F3822) },
7874 { PREFIX_TABLE (PREFIX_VEX_0F3823) },
7875 { PREFIX_TABLE (PREFIX_VEX_0F3824) },
7876 { PREFIX_TABLE (PREFIX_VEX_0F3825) },
7877 { Bad_Opcode },
7878 { Bad_Opcode },
7879 /* 28 */
7880 { PREFIX_TABLE (PREFIX_VEX_0F3828) },
7881 { PREFIX_TABLE (PREFIX_VEX_0F3829) },
7882 { PREFIX_TABLE (PREFIX_VEX_0F382A) },
7883 { PREFIX_TABLE (PREFIX_VEX_0F382B) },
7884 { PREFIX_TABLE (PREFIX_VEX_0F382C) },
7885 { PREFIX_TABLE (PREFIX_VEX_0F382D) },
7886 { PREFIX_TABLE (PREFIX_VEX_0F382E) },
7887 { PREFIX_TABLE (PREFIX_VEX_0F382F) },
7888 /* 30 */
7889 { PREFIX_TABLE (PREFIX_VEX_0F3830) },
7890 { PREFIX_TABLE (PREFIX_VEX_0F3831) },
7891 { PREFIX_TABLE (PREFIX_VEX_0F3832) },
7892 { PREFIX_TABLE (PREFIX_VEX_0F3833) },
7893 { PREFIX_TABLE (PREFIX_VEX_0F3834) },
7894 { PREFIX_TABLE (PREFIX_VEX_0F3835) },
7895 { PREFIX_TABLE (PREFIX_VEX_0F3836) },
7896 { PREFIX_TABLE (PREFIX_VEX_0F3837) },
7897 /* 38 */
7898 { PREFIX_TABLE (PREFIX_VEX_0F3838) },
7899 { PREFIX_TABLE (PREFIX_VEX_0F3839) },
7900 { PREFIX_TABLE (PREFIX_VEX_0F383A) },
7901 { PREFIX_TABLE (PREFIX_VEX_0F383B) },
7902 { PREFIX_TABLE (PREFIX_VEX_0F383C) },
7903 { PREFIX_TABLE (PREFIX_VEX_0F383D) },
7904 { PREFIX_TABLE (PREFIX_VEX_0F383E) },
7905 { PREFIX_TABLE (PREFIX_VEX_0F383F) },
7906 /* 40 */
7907 { PREFIX_TABLE (PREFIX_VEX_0F3840) },
7908 { PREFIX_TABLE (PREFIX_VEX_0F3841) },
7909 { Bad_Opcode },
7910 { Bad_Opcode },
7911 { Bad_Opcode },
7912 { PREFIX_TABLE (PREFIX_VEX_0F3845) },
7913 { PREFIX_TABLE (PREFIX_VEX_0F3846) },
7914 { PREFIX_TABLE (PREFIX_VEX_0F3847) },
7915 /* 48 */
7916 { Bad_Opcode },
7917 { Bad_Opcode },
7918 { Bad_Opcode },
7919 { Bad_Opcode },
7920 { Bad_Opcode },
7921 { Bad_Opcode },
7922 { Bad_Opcode },
7923 { Bad_Opcode },
7924 /* 50 */
7925 { Bad_Opcode },
7926 { Bad_Opcode },
7927 { Bad_Opcode },
7928 { Bad_Opcode },
7929 { Bad_Opcode },
7930 { Bad_Opcode },
7931 { Bad_Opcode },
7932 { Bad_Opcode },
7933 /* 58 */
7934 { PREFIX_TABLE (PREFIX_VEX_0F3858) },
7935 { PREFIX_TABLE (PREFIX_VEX_0F3859) },
7936 { PREFIX_TABLE (PREFIX_VEX_0F385A) },
7937 { Bad_Opcode },
7938 { Bad_Opcode },
7939 { Bad_Opcode },
7940 { Bad_Opcode },
7941 { Bad_Opcode },
7942 /* 60 */
7943 { Bad_Opcode },
7944 { Bad_Opcode },
7945 { Bad_Opcode },
7946 { Bad_Opcode },
7947 { Bad_Opcode },
7948 { Bad_Opcode },
7949 { Bad_Opcode },
7950 { Bad_Opcode },
7951 /* 68 */
7952 { Bad_Opcode },
7953 { Bad_Opcode },
7954 { Bad_Opcode },
7955 { Bad_Opcode },
7956 { Bad_Opcode },
7957 { Bad_Opcode },
7958 { Bad_Opcode },
7959 { Bad_Opcode },
7960 /* 70 */
7961 { Bad_Opcode },
7962 { Bad_Opcode },
7963 { Bad_Opcode },
7964 { Bad_Opcode },
7965 { Bad_Opcode },
7966 { Bad_Opcode },
7967 { Bad_Opcode },
7968 { Bad_Opcode },
7969 /* 78 */
7970 { PREFIX_TABLE (PREFIX_VEX_0F3878) },
7971 { PREFIX_TABLE (PREFIX_VEX_0F3879) },
7972 { Bad_Opcode },
7973 { Bad_Opcode },
7974 { Bad_Opcode },
7975 { Bad_Opcode },
7976 { Bad_Opcode },
7977 { Bad_Opcode },
7978 /* 80 */
7979 { Bad_Opcode },
7980 { Bad_Opcode },
7981 { Bad_Opcode },
7982 { Bad_Opcode },
7983 { Bad_Opcode },
7984 { Bad_Opcode },
7985 { Bad_Opcode },
7986 { Bad_Opcode },
7987 /* 88 */
7988 { Bad_Opcode },
7989 { Bad_Opcode },
7990 { Bad_Opcode },
7991 { Bad_Opcode },
7992 { PREFIX_TABLE (PREFIX_VEX_0F388C) },
7993 { Bad_Opcode },
7994 { PREFIX_TABLE (PREFIX_VEX_0F388E) },
7995 { Bad_Opcode },
7996 /* 90 */
7997 { PREFIX_TABLE (PREFIX_VEX_0F3890) },
7998 { PREFIX_TABLE (PREFIX_VEX_0F3891) },
7999 { PREFIX_TABLE (PREFIX_VEX_0F3892) },
8000 { PREFIX_TABLE (PREFIX_VEX_0F3893) },
8001 { Bad_Opcode },
8002 { Bad_Opcode },
8003 { PREFIX_TABLE (PREFIX_VEX_0F3896) },
8004 { PREFIX_TABLE (PREFIX_VEX_0F3897) },
8005 /* 98 */
8006 { PREFIX_TABLE (PREFIX_VEX_0F3898) },
8007 { PREFIX_TABLE (PREFIX_VEX_0F3899) },
8008 { PREFIX_TABLE (PREFIX_VEX_0F389A) },
8009 { PREFIX_TABLE (PREFIX_VEX_0F389B) },
8010 { PREFIX_TABLE (PREFIX_VEX_0F389C) },
8011 { PREFIX_TABLE (PREFIX_VEX_0F389D) },
8012 { PREFIX_TABLE (PREFIX_VEX_0F389E) },
8013 { PREFIX_TABLE (PREFIX_VEX_0F389F) },
8014 /* a0 */
8015 { Bad_Opcode },
8016 { Bad_Opcode },
8017 { Bad_Opcode },
8018 { Bad_Opcode },
8019 { Bad_Opcode },
8020 { Bad_Opcode },
8021 { PREFIX_TABLE (PREFIX_VEX_0F38A6) },
8022 { PREFIX_TABLE (PREFIX_VEX_0F38A7) },
8023 /* a8 */
8024 { PREFIX_TABLE (PREFIX_VEX_0F38A8) },
8025 { PREFIX_TABLE (PREFIX_VEX_0F38A9) },
8026 { PREFIX_TABLE (PREFIX_VEX_0F38AA) },
8027 { PREFIX_TABLE (PREFIX_VEX_0F38AB) },
8028 { PREFIX_TABLE (PREFIX_VEX_0F38AC) },
8029 { PREFIX_TABLE (PREFIX_VEX_0F38AD) },
8030 { PREFIX_TABLE (PREFIX_VEX_0F38AE) },
8031 { PREFIX_TABLE (PREFIX_VEX_0F38AF) },
8032 /* b0 */
8033 { Bad_Opcode },
8034 { Bad_Opcode },
8035 { Bad_Opcode },
8036 { Bad_Opcode },
8037 { Bad_Opcode },
8038 { Bad_Opcode },
8039 { PREFIX_TABLE (PREFIX_VEX_0F38B6) },
8040 { PREFIX_TABLE (PREFIX_VEX_0F38B7) },
8041 /* b8 */
8042 { PREFIX_TABLE (PREFIX_VEX_0F38B8) },
8043 { PREFIX_TABLE (PREFIX_VEX_0F38B9) },
8044 { PREFIX_TABLE (PREFIX_VEX_0F38BA) },
8045 { PREFIX_TABLE (PREFIX_VEX_0F38BB) },
8046 { PREFIX_TABLE (PREFIX_VEX_0F38BC) },
8047 { PREFIX_TABLE (PREFIX_VEX_0F38BD) },
8048 { PREFIX_TABLE (PREFIX_VEX_0F38BE) },
8049 { PREFIX_TABLE (PREFIX_VEX_0F38BF) },
8050 /* c0 */
8051 { Bad_Opcode },
8052 { Bad_Opcode },
8053 { Bad_Opcode },
8054 { Bad_Opcode },
8055 { Bad_Opcode },
8056 { Bad_Opcode },
8057 { Bad_Opcode },
8058 { Bad_Opcode },
8059 /* c8 */
8060 { Bad_Opcode },
8061 { Bad_Opcode },
8062 { Bad_Opcode },
8063 { Bad_Opcode },
8064 { Bad_Opcode },
8065 { Bad_Opcode },
8066 { Bad_Opcode },
8067 { Bad_Opcode },
8068 /* d0 */
8069 { Bad_Opcode },
8070 { Bad_Opcode },
8071 { Bad_Opcode },
8072 { Bad_Opcode },
8073 { Bad_Opcode },
8074 { Bad_Opcode },
8075 { Bad_Opcode },
8076 { Bad_Opcode },
8077 /* d8 */
8078 { Bad_Opcode },
8079 { Bad_Opcode },
8080 { Bad_Opcode },
8081 { PREFIX_TABLE (PREFIX_VEX_0F38DB) },
8082 { PREFIX_TABLE (PREFIX_VEX_0F38DC) },
8083 { PREFIX_TABLE (PREFIX_VEX_0F38DD) },
8084 { PREFIX_TABLE (PREFIX_VEX_0F38DE) },
8085 { PREFIX_TABLE (PREFIX_VEX_0F38DF) },
8086 /* e0 */
8087 { Bad_Opcode },
8088 { Bad_Opcode },
8089 { Bad_Opcode },
8090 { Bad_Opcode },
8091 { Bad_Opcode },
8092 { Bad_Opcode },
8093 { Bad_Opcode },
8094 { Bad_Opcode },
8095 /* e8 */
8096 { Bad_Opcode },
8097 { Bad_Opcode },
8098 { Bad_Opcode },
8099 { Bad_Opcode },
8100 { Bad_Opcode },
8101 { Bad_Opcode },
8102 { Bad_Opcode },
8103 { Bad_Opcode },
8104 /* f0 */
8105 { Bad_Opcode },
8106 { Bad_Opcode },
8107 { PREFIX_TABLE (PREFIX_VEX_0F38F2) },
8108 { REG_TABLE (REG_VEX_0F38F3) },
8109 { Bad_Opcode },
8110 { PREFIX_TABLE (PREFIX_VEX_0F38F5) },
8111 { PREFIX_TABLE (PREFIX_VEX_0F38F6) },
8112 { PREFIX_TABLE (PREFIX_VEX_0F38F7) },
8113 /* f8 */
8114 { Bad_Opcode },
8115 { Bad_Opcode },
8116 { Bad_Opcode },
8117 { Bad_Opcode },
8118 { Bad_Opcode },
8119 { Bad_Opcode },
8120 { Bad_Opcode },
8121 { Bad_Opcode },
8122 },
8123 /* VEX_0F3A */
8124 {
8125 /* 00 */
8126 { PREFIX_TABLE (PREFIX_VEX_0F3A00) },
8127 { PREFIX_TABLE (PREFIX_VEX_0F3A01) },
8128 { PREFIX_TABLE (PREFIX_VEX_0F3A02) },
8129 { Bad_Opcode },
8130 { PREFIX_TABLE (PREFIX_VEX_0F3A04) },
8131 { PREFIX_TABLE (PREFIX_VEX_0F3A05) },
8132 { PREFIX_TABLE (PREFIX_VEX_0F3A06) },
8133 { Bad_Opcode },
8134 /* 08 */
8135 { PREFIX_TABLE (PREFIX_VEX_0F3A08) },
8136 { PREFIX_TABLE (PREFIX_VEX_0F3A09) },
8137 { PREFIX_TABLE (PREFIX_VEX_0F3A0A) },
8138 { PREFIX_TABLE (PREFIX_VEX_0F3A0B) },
8139 { PREFIX_TABLE (PREFIX_VEX_0F3A0C) },
8140 { PREFIX_TABLE (PREFIX_VEX_0F3A0D) },
8141 { PREFIX_TABLE (PREFIX_VEX_0F3A0E) },
8142 { PREFIX_TABLE (PREFIX_VEX_0F3A0F) },
8143 /* 10 */
8144 { Bad_Opcode },
8145 { Bad_Opcode },
8146 { Bad_Opcode },
8147 { Bad_Opcode },
8148 { PREFIX_TABLE (PREFIX_VEX_0F3A14) },
8149 { PREFIX_TABLE (PREFIX_VEX_0F3A15) },
8150 { PREFIX_TABLE (PREFIX_VEX_0F3A16) },
8151 { PREFIX_TABLE (PREFIX_VEX_0F3A17) },
8152 /* 18 */
8153 { PREFIX_TABLE (PREFIX_VEX_0F3A18) },
8154 { PREFIX_TABLE (PREFIX_VEX_0F3A19) },
8155 { Bad_Opcode },
8156 { Bad_Opcode },
8157 { Bad_Opcode },
8158 { PREFIX_TABLE (PREFIX_VEX_0F3A1D) },
8159 { Bad_Opcode },
8160 { Bad_Opcode },
8161 /* 20 */
8162 { PREFIX_TABLE (PREFIX_VEX_0F3A20) },
8163 { PREFIX_TABLE (PREFIX_VEX_0F3A21) },
8164 { PREFIX_TABLE (PREFIX_VEX_0F3A22) },
8165 { Bad_Opcode },
8166 { Bad_Opcode },
8167 { Bad_Opcode },
8168 { Bad_Opcode },
8169 { Bad_Opcode },
8170 /* 28 */
8171 { Bad_Opcode },
8172 { Bad_Opcode },
8173 { Bad_Opcode },
8174 { Bad_Opcode },
8175 { Bad_Opcode },
8176 { Bad_Opcode },
8177 { Bad_Opcode },
8178 { Bad_Opcode },
8179 /* 30 */
8180 { Bad_Opcode },
8181 { Bad_Opcode },
8182 { Bad_Opcode },
8183 { Bad_Opcode },
8184 { Bad_Opcode },
8185 { Bad_Opcode },
8186 { Bad_Opcode },
8187 { Bad_Opcode },
8188 /* 38 */
8189 { PREFIX_TABLE (PREFIX_VEX_0F3A38) },
8190 { PREFIX_TABLE (PREFIX_VEX_0F3A39) },
8191 { Bad_Opcode },
8192 { Bad_Opcode },
8193 { Bad_Opcode },
8194 { Bad_Opcode },
8195 { Bad_Opcode },
8196 { Bad_Opcode },
8197 /* 40 */
8198 { PREFIX_TABLE (PREFIX_VEX_0F3A40) },
8199 { PREFIX_TABLE (PREFIX_VEX_0F3A41) },
8200 { PREFIX_TABLE (PREFIX_VEX_0F3A42) },
8201 { Bad_Opcode },
8202 { PREFIX_TABLE (PREFIX_VEX_0F3A44) },
8203 { Bad_Opcode },
8204 { PREFIX_TABLE (PREFIX_VEX_0F3A46) },
8205 { Bad_Opcode },
8206 /* 48 */
8207 { PREFIX_TABLE (PREFIX_VEX_0F3A48) },
8208 { PREFIX_TABLE (PREFIX_VEX_0F3A49) },
8209 { PREFIX_TABLE (PREFIX_VEX_0F3A4A) },
8210 { PREFIX_TABLE (PREFIX_VEX_0F3A4B) },
8211 { PREFIX_TABLE (PREFIX_VEX_0F3A4C) },
8212 { Bad_Opcode },
8213 { Bad_Opcode },
8214 { Bad_Opcode },
8215 /* 50 */
8216 { Bad_Opcode },
8217 { Bad_Opcode },
8218 { Bad_Opcode },
8219 { Bad_Opcode },
8220 { Bad_Opcode },
8221 { Bad_Opcode },
8222 { Bad_Opcode },
8223 { Bad_Opcode },
8224 /* 58 */
8225 { Bad_Opcode },
8226 { Bad_Opcode },
8227 { Bad_Opcode },
8228 { Bad_Opcode },
8229 { PREFIX_TABLE (PREFIX_VEX_0F3A5C) },
8230 { PREFIX_TABLE (PREFIX_VEX_0F3A5D) },
8231 { PREFIX_TABLE (PREFIX_VEX_0F3A5E) },
8232 { PREFIX_TABLE (PREFIX_VEX_0F3A5F) },
8233 /* 60 */
8234 { PREFIX_TABLE (PREFIX_VEX_0F3A60) },
8235 { PREFIX_TABLE (PREFIX_VEX_0F3A61) },
8236 { PREFIX_TABLE (PREFIX_VEX_0F3A62) },
8237 { PREFIX_TABLE (PREFIX_VEX_0F3A63) },
8238 { Bad_Opcode },
8239 { Bad_Opcode },
8240 { Bad_Opcode },
8241 { Bad_Opcode },
8242 /* 68 */
8243 { PREFIX_TABLE (PREFIX_VEX_0F3A68) },
8244 { PREFIX_TABLE (PREFIX_VEX_0F3A69) },
8245 { PREFIX_TABLE (PREFIX_VEX_0F3A6A) },
8246 { PREFIX_TABLE (PREFIX_VEX_0F3A6B) },
8247 { PREFIX_TABLE (PREFIX_VEX_0F3A6C) },
8248 { PREFIX_TABLE (PREFIX_VEX_0F3A6D) },
8249 { PREFIX_TABLE (PREFIX_VEX_0F3A6E) },
8250 { PREFIX_TABLE (PREFIX_VEX_0F3A6F) },
8251 /* 70 */
8252 { Bad_Opcode },
8253 { Bad_Opcode },
8254 { Bad_Opcode },
8255 { Bad_Opcode },
8256 { Bad_Opcode },
8257 { Bad_Opcode },
8258 { Bad_Opcode },
8259 { Bad_Opcode },
8260 /* 78 */
8261 { PREFIX_TABLE (PREFIX_VEX_0F3A78) },
8262 { PREFIX_TABLE (PREFIX_VEX_0F3A79) },
8263 { PREFIX_TABLE (PREFIX_VEX_0F3A7A) },
8264 { PREFIX_TABLE (PREFIX_VEX_0F3A7B) },
8265 { PREFIX_TABLE (PREFIX_VEX_0F3A7C) },
8266 { PREFIX_TABLE (PREFIX_VEX_0F3A7D) },
8267 { PREFIX_TABLE (PREFIX_VEX_0F3A7E) },
8268 { PREFIX_TABLE (PREFIX_VEX_0F3A7F) },
8269 /* 80 */
8270 { Bad_Opcode },
8271 { Bad_Opcode },
8272 { Bad_Opcode },
8273 { Bad_Opcode },
8274 { Bad_Opcode },
8275 { Bad_Opcode },
8276 { Bad_Opcode },
8277 { Bad_Opcode },
8278 /* 88 */
8279 { Bad_Opcode },
8280 { Bad_Opcode },
8281 { Bad_Opcode },
8282 { Bad_Opcode },
8283 { Bad_Opcode },
8284 { Bad_Opcode },
8285 { Bad_Opcode },
8286 { Bad_Opcode },
8287 /* 90 */
8288 { Bad_Opcode },
8289 { Bad_Opcode },
8290 { Bad_Opcode },
8291 { Bad_Opcode },
8292 { Bad_Opcode },
8293 { Bad_Opcode },
8294 { Bad_Opcode },
8295 { Bad_Opcode },
8296 /* 98 */
8297 { Bad_Opcode },
8298 { Bad_Opcode },
8299 { Bad_Opcode },
8300 { Bad_Opcode },
8301 { Bad_Opcode },
8302 { Bad_Opcode },
8303 { Bad_Opcode },
8304 { Bad_Opcode },
8305 /* a0 */
8306 { Bad_Opcode },
8307 { Bad_Opcode },
8308 { Bad_Opcode },
8309 { Bad_Opcode },
8310 { Bad_Opcode },
8311 { Bad_Opcode },
8312 { Bad_Opcode },
8313 { Bad_Opcode },
8314 /* a8 */
8315 { Bad_Opcode },
8316 { Bad_Opcode },
8317 { Bad_Opcode },
8318 { Bad_Opcode },
8319 { Bad_Opcode },
8320 { Bad_Opcode },
8321 { Bad_Opcode },
8322 { Bad_Opcode },
8323 /* b0 */
8324 { Bad_Opcode },
8325 { Bad_Opcode },
8326 { Bad_Opcode },
8327 { Bad_Opcode },
8328 { Bad_Opcode },
8329 { Bad_Opcode },
8330 { Bad_Opcode },
8331 { Bad_Opcode },
8332 /* b8 */
8333 { Bad_Opcode },
8334 { Bad_Opcode },
8335 { Bad_Opcode },
8336 { Bad_Opcode },
8337 { Bad_Opcode },
8338 { Bad_Opcode },
8339 { Bad_Opcode },
8340 { Bad_Opcode },
8341 /* c0 */
8342 { Bad_Opcode },
8343 { Bad_Opcode },
8344 { Bad_Opcode },
8345 { Bad_Opcode },
8346 { Bad_Opcode },
8347 { Bad_Opcode },
8348 { Bad_Opcode },
8349 { Bad_Opcode },
8350 /* c8 */
8351 { Bad_Opcode },
8352 { Bad_Opcode },
8353 { Bad_Opcode },
8354 { Bad_Opcode },
8355 { Bad_Opcode },
8356 { Bad_Opcode },
8357 { Bad_Opcode },
8358 { Bad_Opcode },
8359 /* d0 */
8360 { Bad_Opcode },
8361 { Bad_Opcode },
8362 { Bad_Opcode },
8363 { Bad_Opcode },
8364 { Bad_Opcode },
8365 { Bad_Opcode },
8366 { Bad_Opcode },
8367 { Bad_Opcode },
8368 /* d8 */
8369 { Bad_Opcode },
8370 { Bad_Opcode },
8371 { Bad_Opcode },
8372 { Bad_Opcode },
8373 { Bad_Opcode },
8374 { Bad_Opcode },
8375 { Bad_Opcode },
8376 { PREFIX_TABLE (PREFIX_VEX_0F3ADF) },
8377 /* e0 */
8378 { Bad_Opcode },
8379 { Bad_Opcode },
8380 { Bad_Opcode },
8381 { Bad_Opcode },
8382 { Bad_Opcode },
8383 { Bad_Opcode },
8384 { Bad_Opcode },
8385 { Bad_Opcode },
8386 /* e8 */
8387 { Bad_Opcode },
8388 { Bad_Opcode },
8389 { Bad_Opcode },
8390 { Bad_Opcode },
8391 { Bad_Opcode },
8392 { Bad_Opcode },
8393 { Bad_Opcode },
8394 { Bad_Opcode },
8395 /* f0 */
8396 { PREFIX_TABLE (PREFIX_VEX_0F3AF0) },
8397 { Bad_Opcode },
8398 { Bad_Opcode },
8399 { Bad_Opcode },
8400 { Bad_Opcode },
8401 { Bad_Opcode },
8402 { Bad_Opcode },
8403 { Bad_Opcode },
8404 /* f8 */
8405 { Bad_Opcode },
8406 { Bad_Opcode },
8407 { Bad_Opcode },
8408 { Bad_Opcode },
8409 { Bad_Opcode },
8410 { Bad_Opcode },
8411 { Bad_Opcode },
8412 { Bad_Opcode },
8413 },
8414 };
8415
8416 static const struct dis386 vex_len_table[][2] = {
8417 /* VEX_LEN_0F10_P_1 */
8418 {
8419 { VEX_W_TABLE (VEX_W_0F10_P_1) },
8420 { VEX_W_TABLE (VEX_W_0F10_P_1) },
8421 },
8422
8423 /* VEX_LEN_0F10_P_3 */
8424 {
8425 { VEX_W_TABLE (VEX_W_0F10_P_3) },
8426 { VEX_W_TABLE (VEX_W_0F10_P_3) },
8427 },
8428
8429 /* VEX_LEN_0F11_P_1 */
8430 {
8431 { VEX_W_TABLE (VEX_W_0F11_P_1) },
8432 { VEX_W_TABLE (VEX_W_0F11_P_1) },
8433 },
8434
8435 /* VEX_LEN_0F11_P_3 */
8436 {
8437 { VEX_W_TABLE (VEX_W_0F11_P_3) },
8438 { VEX_W_TABLE (VEX_W_0F11_P_3) },
8439 },
8440
8441 /* VEX_LEN_0F12_P_0_M_0 */
8442 {
8443 { VEX_W_TABLE (VEX_W_0F12_P_0_M_0) },
8444 },
8445
8446 /* VEX_LEN_0F12_P_0_M_1 */
8447 {
8448 { VEX_W_TABLE (VEX_W_0F12_P_0_M_1) },
8449 },
8450
8451 /* VEX_LEN_0F12_P_2 */
8452 {
8453 { VEX_W_TABLE (VEX_W_0F12_P_2) },
8454 },
8455
8456 /* VEX_LEN_0F13_M_0 */
8457 {
8458 { VEX_W_TABLE (VEX_W_0F13_M_0) },
8459 },
8460
8461 /* VEX_LEN_0F16_P_0_M_0 */
8462 {
8463 { VEX_W_TABLE (VEX_W_0F16_P_0_M_0) },
8464 },
8465
8466 /* VEX_LEN_0F16_P_0_M_1 */
8467 {
8468 { VEX_W_TABLE (VEX_W_0F16_P_0_M_1) },
8469 },
8470
8471 /* VEX_LEN_0F16_P_2 */
8472 {
8473 { VEX_W_TABLE (VEX_W_0F16_P_2) },
8474 },
8475
8476 /* VEX_LEN_0F17_M_0 */
8477 {
8478 { VEX_W_TABLE (VEX_W_0F17_M_0) },
8479 },
8480
8481 /* VEX_LEN_0F2A_P_1 */
8482 {
8483 { "vcvtsi2ss%LQ", { XMScalar, VexScalar, Ev } },
8484 { "vcvtsi2ss%LQ", { XMScalar, VexScalar, Ev } },
8485 },
8486
8487 /* VEX_LEN_0F2A_P_3 */
8488 {
8489 { "vcvtsi2sd%LQ", { XMScalar, VexScalar, Ev } },
8490 { "vcvtsi2sd%LQ", { XMScalar, VexScalar, Ev } },
8491 },
8492
8493 /* VEX_LEN_0F2C_P_1 */
8494 {
8495 { "vcvttss2siY", { Gv, EXdScalar } },
8496 { "vcvttss2siY", { Gv, EXdScalar } },
8497 },
8498
8499 /* VEX_LEN_0F2C_P_3 */
8500 {
8501 { "vcvttsd2siY", { Gv, EXqScalar } },
8502 { "vcvttsd2siY", { Gv, EXqScalar } },
8503 },
8504
8505 /* VEX_LEN_0F2D_P_1 */
8506 {
8507 { "vcvtss2siY", { Gv, EXdScalar } },
8508 { "vcvtss2siY", { Gv, EXdScalar } },
8509 },
8510
8511 /* VEX_LEN_0F2D_P_3 */
8512 {
8513 { "vcvtsd2siY", { Gv, EXqScalar } },
8514 { "vcvtsd2siY", { Gv, EXqScalar } },
8515 },
8516
8517 /* VEX_LEN_0F2E_P_0 */
8518 {
8519 { VEX_W_TABLE (VEX_W_0F2E_P_0) },
8520 { VEX_W_TABLE (VEX_W_0F2E_P_0) },
8521 },
8522
8523 /* VEX_LEN_0F2E_P_2 */
8524 {
8525 { VEX_W_TABLE (VEX_W_0F2E_P_2) },
8526 { VEX_W_TABLE (VEX_W_0F2E_P_2) },
8527 },
8528
8529 /* VEX_LEN_0F2F_P_0 */
8530 {
8531 { VEX_W_TABLE (VEX_W_0F2F_P_0) },
8532 { VEX_W_TABLE (VEX_W_0F2F_P_0) },
8533 },
8534
8535 /* VEX_LEN_0F2F_P_2 */
8536 {
8537 { VEX_W_TABLE (VEX_W_0F2F_P_2) },
8538 { VEX_W_TABLE (VEX_W_0F2F_P_2) },
8539 },
8540
8541 /* VEX_LEN_0F51_P_1 */
8542 {
8543 { VEX_W_TABLE (VEX_W_0F51_P_1) },
8544 { VEX_W_TABLE (VEX_W_0F51_P_1) },
8545 },
8546
8547 /* VEX_LEN_0F51_P_3 */
8548 {
8549 { VEX_W_TABLE (VEX_W_0F51_P_3) },
8550 { VEX_W_TABLE (VEX_W_0F51_P_3) },
8551 },
8552
8553 /* VEX_LEN_0F52_P_1 */
8554 {
8555 { VEX_W_TABLE (VEX_W_0F52_P_1) },
8556 { VEX_W_TABLE (VEX_W_0F52_P_1) },
8557 },
8558
8559 /* VEX_LEN_0F53_P_1 */
8560 {
8561 { VEX_W_TABLE (VEX_W_0F53_P_1) },
8562 { VEX_W_TABLE (VEX_W_0F53_P_1) },
8563 },
8564
8565 /* VEX_LEN_0F58_P_1 */
8566 {
8567 { VEX_W_TABLE (VEX_W_0F58_P_1) },
8568 { VEX_W_TABLE (VEX_W_0F58_P_1) },
8569 },
8570
8571 /* VEX_LEN_0F58_P_3 */
8572 {
8573 { VEX_W_TABLE (VEX_W_0F58_P_3) },
8574 { VEX_W_TABLE (VEX_W_0F58_P_3) },
8575 },
8576
8577 /* VEX_LEN_0F59_P_1 */
8578 {
8579 { VEX_W_TABLE (VEX_W_0F59_P_1) },
8580 { VEX_W_TABLE (VEX_W_0F59_P_1) },
8581 },
8582
8583 /* VEX_LEN_0F59_P_3 */
8584 {
8585 { VEX_W_TABLE (VEX_W_0F59_P_3) },
8586 { VEX_W_TABLE (VEX_W_0F59_P_3) },
8587 },
8588
8589 /* VEX_LEN_0F5A_P_1 */
8590 {
8591 { VEX_W_TABLE (VEX_W_0F5A_P_1) },
8592 { VEX_W_TABLE (VEX_W_0F5A_P_1) },
8593 },
8594
8595 /* VEX_LEN_0F5A_P_3 */
8596 {
8597 { VEX_W_TABLE (VEX_W_0F5A_P_3) },
8598 { VEX_W_TABLE (VEX_W_0F5A_P_3) },
8599 },
8600
8601 /* VEX_LEN_0F5C_P_1 */
8602 {
8603 { VEX_W_TABLE (VEX_W_0F5C_P_1) },
8604 { VEX_W_TABLE (VEX_W_0F5C_P_1) },
8605 },
8606
8607 /* VEX_LEN_0F5C_P_3 */
8608 {
8609 { VEX_W_TABLE (VEX_W_0F5C_P_3) },
8610 { VEX_W_TABLE (VEX_W_0F5C_P_3) },
8611 },
8612
8613 /* VEX_LEN_0F5D_P_1 */
8614 {
8615 { VEX_W_TABLE (VEX_W_0F5D_P_1) },
8616 { VEX_W_TABLE (VEX_W_0F5D_P_1) },
8617 },
8618
8619 /* VEX_LEN_0F5D_P_3 */
8620 {
8621 { VEX_W_TABLE (VEX_W_0F5D_P_3) },
8622 { VEX_W_TABLE (VEX_W_0F5D_P_3) },
8623 },
8624
8625 /* VEX_LEN_0F5E_P_1 */
8626 {
8627 { VEX_W_TABLE (VEX_W_0F5E_P_1) },
8628 { VEX_W_TABLE (VEX_W_0F5E_P_1) },
8629 },
8630
8631 /* VEX_LEN_0F5E_P_3 */
8632 {
8633 { VEX_W_TABLE (VEX_W_0F5E_P_3) },
8634 { VEX_W_TABLE (VEX_W_0F5E_P_3) },
8635 },
8636
8637 /* VEX_LEN_0F5F_P_1 */
8638 {
8639 { VEX_W_TABLE (VEX_W_0F5F_P_1) },
8640 { VEX_W_TABLE (VEX_W_0F5F_P_1) },
8641 },
8642
8643 /* VEX_LEN_0F5F_P_3 */
8644 {
8645 { VEX_W_TABLE (VEX_W_0F5F_P_3) },
8646 { VEX_W_TABLE (VEX_W_0F5F_P_3) },
8647 },
8648
8649 /* VEX_LEN_0F6E_P_2 */
8650 {
8651 { "vmovK", { XMScalar, Edq } },
8652 { "vmovK", { XMScalar, Edq } },
8653 },
8654
8655 /* VEX_LEN_0F7E_P_1 */
8656 {
8657 { VEX_W_TABLE (VEX_W_0F7E_P_1) },
8658 { VEX_W_TABLE (VEX_W_0F7E_P_1) },
8659 },
8660
8661 /* VEX_LEN_0F7E_P_2 */
8662 {
8663 { "vmovK", { Edq, XMScalar } },
8664 { "vmovK", { Edq, XMScalar } },
8665 },
8666
8667 /* VEX_LEN_0FAE_R_2_M_0 */
8668 {
8669 { VEX_W_TABLE (VEX_W_0FAE_R_2_M_0) },
8670 },
8671
8672 /* VEX_LEN_0FAE_R_3_M_0 */
8673 {
8674 { VEX_W_TABLE (VEX_W_0FAE_R_3_M_0) },
8675 },
8676
8677 /* VEX_LEN_0FC2_P_1 */
8678 {
8679 { VEX_W_TABLE (VEX_W_0FC2_P_1) },
8680 { VEX_W_TABLE (VEX_W_0FC2_P_1) },
8681 },
8682
8683 /* VEX_LEN_0FC2_P_3 */
8684 {
8685 { VEX_W_TABLE (VEX_W_0FC2_P_3) },
8686 { VEX_W_TABLE (VEX_W_0FC2_P_3) },
8687 },
8688
8689 /* VEX_LEN_0FC4_P_2 */
8690 {
8691 { VEX_W_TABLE (VEX_W_0FC4_P_2) },
8692 },
8693
8694 /* VEX_LEN_0FC5_P_2 */
8695 {
8696 { VEX_W_TABLE (VEX_W_0FC5_P_2) },
8697 },
8698
8699 /* VEX_LEN_0FD6_P_2 */
8700 {
8701 { VEX_W_TABLE (VEX_W_0FD6_P_2) },
8702 { VEX_W_TABLE (VEX_W_0FD6_P_2) },
8703 },
8704
8705 /* VEX_LEN_0FF7_P_2 */
8706 {
8707 { VEX_W_TABLE (VEX_W_0FF7_P_2) },
8708 },
8709
8710 /* VEX_LEN_0F3816_P_2 */
8711 {
8712 { Bad_Opcode },
8713 { VEX_W_TABLE (VEX_W_0F3816_P_2) },
8714 },
8715
8716 /* VEX_LEN_0F3819_P_2 */
8717 {
8718 { Bad_Opcode },
8719 { VEX_W_TABLE (VEX_W_0F3819_P_2) },
8720 },
8721
8722 /* VEX_LEN_0F381A_P_2_M_0 */
8723 {
8724 { Bad_Opcode },
8725 { VEX_W_TABLE (VEX_W_0F381A_P_2_M_0) },
8726 },
8727
8728 /* VEX_LEN_0F3836_P_2 */
8729 {
8730 { Bad_Opcode },
8731 { VEX_W_TABLE (VEX_W_0F3836_P_2) },
8732 },
8733
8734 /* VEX_LEN_0F3841_P_2 */
8735 {
8736 { VEX_W_TABLE (VEX_W_0F3841_P_2) },
8737 },
8738
8739 /* VEX_LEN_0F385A_P_2_M_0 */
8740 {
8741 { Bad_Opcode },
8742 { VEX_W_TABLE (VEX_W_0F385A_P_2_M_0) },
8743 },
8744
8745 /* VEX_LEN_0F38DB_P_2 */
8746 {
8747 { VEX_W_TABLE (VEX_W_0F38DB_P_2) },
8748 },
8749
8750 /* VEX_LEN_0F38DC_P_2 */
8751 {
8752 { VEX_W_TABLE (VEX_W_0F38DC_P_2) },
8753 },
8754
8755 /* VEX_LEN_0F38DD_P_2 */
8756 {
8757 { VEX_W_TABLE (VEX_W_0F38DD_P_2) },
8758 },
8759
8760 /* VEX_LEN_0F38DE_P_2 */
8761 {
8762 { VEX_W_TABLE (VEX_W_0F38DE_P_2) },
8763 },
8764
8765 /* VEX_LEN_0F38DF_P_2 */
8766 {
8767 { VEX_W_TABLE (VEX_W_0F38DF_P_2) },
8768 },
8769
8770 /* VEX_LEN_0F38F2_P_0 */
8771 {
8772 { "andnS", { Gdq, VexGdq, Edq } },
8773 },
8774
8775 /* VEX_LEN_0F38F3_R_1_P_0 */
8776 {
8777 { "blsrS", { VexGdq, Edq } },
8778 },
8779
8780 /* VEX_LEN_0F38F3_R_2_P_0 */
8781 {
8782 { "blsmskS", { VexGdq, Edq } },
8783 },
8784
8785 /* VEX_LEN_0F38F3_R_3_P_0 */
8786 {
8787 { "blsiS", { VexGdq, Edq } },
8788 },
8789
8790 /* VEX_LEN_0F38F5_P_0 */
8791 {
8792 { "bzhiS", { Gdq, Edq, VexGdq } },
8793 },
8794
8795 /* VEX_LEN_0F38F5_P_1 */
8796 {
8797 { "pextS", { Gdq, VexGdq, Edq } },
8798 },
8799
8800 /* VEX_LEN_0F38F5_P_3 */
8801 {
8802 { "pdepS", { Gdq, VexGdq, Edq } },
8803 },
8804
8805 /* VEX_LEN_0F38F6_P_3 */
8806 {
8807 { "mulxS", { Gdq, VexGdq, Edq } },
8808 },
8809
8810 /* VEX_LEN_0F38F7_P_0 */
8811 {
8812 { "bextrS", { Gdq, Edq, VexGdq } },
8813 },
8814
8815 /* VEX_LEN_0F38F7_P_1 */
8816 {
8817 { "sarxS", { Gdq, Edq, VexGdq } },
8818 },
8819
8820 /* VEX_LEN_0F38F7_P_2 */
8821 {
8822 { "shlxS", { Gdq, Edq, VexGdq } },
8823 },
8824
8825 /* VEX_LEN_0F38F7_P_3 */
8826 {
8827 { "shrxS", { Gdq, Edq, VexGdq } },
8828 },
8829
8830 /* VEX_LEN_0F3A00_P_2 */
8831 {
8832 { Bad_Opcode },
8833 { VEX_W_TABLE (VEX_W_0F3A00_P_2) },
8834 },
8835
8836 /* VEX_LEN_0F3A01_P_2 */
8837 {
8838 { Bad_Opcode },
8839 { VEX_W_TABLE (VEX_W_0F3A01_P_2) },
8840 },
8841
8842 /* VEX_LEN_0F3A06_P_2 */
8843 {
8844 { Bad_Opcode },
8845 { VEX_W_TABLE (VEX_W_0F3A06_P_2) },
8846 },
8847
8848 /* VEX_LEN_0F3A0A_P_2 */
8849 {
8850 { VEX_W_TABLE (VEX_W_0F3A0A_P_2) },
8851 { VEX_W_TABLE (VEX_W_0F3A0A_P_2) },
8852 },
8853
8854 /* VEX_LEN_0F3A0B_P_2 */
8855 {
8856 { VEX_W_TABLE (VEX_W_0F3A0B_P_2) },
8857 { VEX_W_TABLE (VEX_W_0F3A0B_P_2) },
8858 },
8859
8860 /* VEX_LEN_0F3A14_P_2 */
8861 {
8862 { VEX_W_TABLE (VEX_W_0F3A14_P_2) },
8863 },
8864
8865 /* VEX_LEN_0F3A15_P_2 */
8866 {
8867 { VEX_W_TABLE (VEX_W_0F3A15_P_2) },
8868 },
8869
8870 /* VEX_LEN_0F3A16_P_2 */
8871 {
8872 { "vpextrK", { Edq, XM, Ib } },
8873 },
8874
8875 /* VEX_LEN_0F3A17_P_2 */
8876 {
8877 { "vextractps", { Edqd, XM, Ib } },
8878 },
8879
8880 /* VEX_LEN_0F3A18_P_2 */
8881 {
8882 { Bad_Opcode },
8883 { VEX_W_TABLE (VEX_W_0F3A18_P_2) },
8884 },
8885
8886 /* VEX_LEN_0F3A19_P_2 */
8887 {
8888 { Bad_Opcode },
8889 { VEX_W_TABLE (VEX_W_0F3A19_P_2) },
8890 },
8891
8892 /* VEX_LEN_0F3A20_P_2 */
8893 {
8894 { VEX_W_TABLE (VEX_W_0F3A20_P_2) },
8895 },
8896
8897 /* VEX_LEN_0F3A21_P_2 */
8898 {
8899 { VEX_W_TABLE (VEX_W_0F3A21_P_2) },
8900 },
8901
8902 /* VEX_LEN_0F3A22_P_2 */
8903 {
8904 { "vpinsrK", { XM, Vex128, Edq, Ib } },
8905 },
8906
8907 /* VEX_LEN_0F3A38_P_2 */
8908 {
8909 { Bad_Opcode },
8910 { VEX_W_TABLE (VEX_W_0F3A38_P_2) },
8911 },
8912
8913 /* VEX_LEN_0F3A39_P_2 */
8914 {
8915 { Bad_Opcode },
8916 { VEX_W_TABLE (VEX_W_0F3A39_P_2) },
8917 },
8918
8919 /* VEX_LEN_0F3A41_P_2 */
8920 {
8921 { VEX_W_TABLE (VEX_W_0F3A41_P_2) },
8922 },
8923
8924 /* VEX_LEN_0F3A44_P_2 */
8925 {
8926 { VEX_W_TABLE (VEX_W_0F3A44_P_2) },
8927 },
8928
8929 /* VEX_LEN_0F3A46_P_2 */
8930 {
8931 { Bad_Opcode },
8932 { VEX_W_TABLE (VEX_W_0F3A46_P_2) },
8933 },
8934
8935 /* VEX_LEN_0F3A60_P_2 */
8936 {
8937 { VEX_W_TABLE (VEX_W_0F3A60_P_2) },
8938 },
8939
8940 /* VEX_LEN_0F3A61_P_2 */
8941 {
8942 { VEX_W_TABLE (VEX_W_0F3A61_P_2) },
8943 },
8944
8945 /* VEX_LEN_0F3A62_P_2 */
8946 {
8947 { VEX_W_TABLE (VEX_W_0F3A62_P_2) },
8948 },
8949
8950 /* VEX_LEN_0F3A63_P_2 */
8951 {
8952 { VEX_W_TABLE (VEX_W_0F3A63_P_2) },
8953 },
8954
8955 /* VEX_LEN_0F3A6A_P_2 */
8956 {
8957 { "vfmaddss", { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
8958 },
8959
8960 /* VEX_LEN_0F3A6B_P_2 */
8961 {
8962 { "vfmaddsd", { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
8963 },
8964
8965 /* VEX_LEN_0F3A6E_P_2 */
8966 {
8967 { "vfmsubss", { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
8968 },
8969
8970 /* VEX_LEN_0F3A6F_P_2 */
8971 {
8972 { "vfmsubsd", { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
8973 },
8974
8975 /* VEX_LEN_0F3A7A_P_2 */
8976 {
8977 { "vfnmaddss", { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
8978 },
8979
8980 /* VEX_LEN_0F3A7B_P_2 */
8981 {
8982 { "vfnmaddsd", { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
8983 },
8984
8985 /* VEX_LEN_0F3A7E_P_2 */
8986 {
8987 { "vfnmsubss", { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
8988 },
8989
8990 /* VEX_LEN_0F3A7F_P_2 */
8991 {
8992 { "vfnmsubsd", { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
8993 },
8994
8995 /* VEX_LEN_0F3ADF_P_2 */
8996 {
8997 { VEX_W_TABLE (VEX_W_0F3ADF_P_2) },
8998 },
8999
9000 /* VEX_LEN_0F3AF0_P_3 */
9001 {
9002 { "rorxS", { Gdq, Edq, Ib } },
9003 },
9004
9005 /* VEX_LEN_0FXOP_09_80 */
9006 {
9007 { "vfrczps", { XM, EXxmm } },
9008 { "vfrczps", { XM, EXymmq } },
9009 },
9010
9011 /* VEX_LEN_0FXOP_09_81 */
9012 {
9013 { "vfrczpd", { XM, EXxmm } },
9014 { "vfrczpd", { XM, EXymmq } },
9015 },
9016 };
9017
9018 static const struct dis386 vex_w_table[][2] = {
9019 {
9020 /* VEX_W_0F10_P_0 */
9021 { "vmovups", { XM, EXx } },
9022 },
9023 {
9024 /* VEX_W_0F10_P_1 */
9025 { "vmovss", { XMVexScalar, VexScalar, EXdScalar } },
9026 },
9027 {
9028 /* VEX_W_0F10_P_2 */
9029 { "vmovupd", { XM, EXx } },
9030 },
9031 {
9032 /* VEX_W_0F10_P_3 */
9033 { "vmovsd", { XMVexScalar, VexScalar, EXqScalar } },
9034 },
9035 {
9036 /* VEX_W_0F11_P_0 */
9037 { "vmovups", { EXxS, XM } },
9038 },
9039 {
9040 /* VEX_W_0F11_P_1 */
9041 { "vmovss", { EXdVexScalarS, VexScalar, XMScalar } },
9042 },
9043 {
9044 /* VEX_W_0F11_P_2 */
9045 { "vmovupd", { EXxS, XM } },
9046 },
9047 {
9048 /* VEX_W_0F11_P_3 */
9049 { "vmovsd", { EXqVexScalarS, VexScalar, XMScalar } },
9050 },
9051 {
9052 /* VEX_W_0F12_P_0_M_0 */
9053 { "vmovlps", { XM, Vex128, EXq } },
9054 },
9055 {
9056 /* VEX_W_0F12_P_0_M_1 */
9057 { "vmovhlps", { XM, Vex128, EXq } },
9058 },
9059 {
9060 /* VEX_W_0F12_P_1 */
9061 { "vmovsldup", { XM, EXx } },
9062 },
9063 {
9064 /* VEX_W_0F12_P_2 */
9065 { "vmovlpd", { XM, Vex128, EXq } },
9066 },
9067 {
9068 /* VEX_W_0F12_P_3 */
9069 { "vmovddup", { XM, EXymmq } },
9070 },
9071 {
9072 /* VEX_W_0F13_M_0 */
9073 { "vmovlpX", { EXq, XM } },
9074 },
9075 {
9076 /* VEX_W_0F14 */
9077 { "vunpcklpX", { XM, Vex, EXx } },
9078 },
9079 {
9080 /* VEX_W_0F15 */
9081 { "vunpckhpX", { XM, Vex, EXx } },
9082 },
9083 {
9084 /* VEX_W_0F16_P_0_M_0 */
9085 { "vmovhps", { XM, Vex128, EXq } },
9086 },
9087 {
9088 /* VEX_W_0F16_P_0_M_1 */
9089 { "vmovlhps", { XM, Vex128, EXq } },
9090 },
9091 {
9092 /* VEX_W_0F16_P_1 */
9093 { "vmovshdup", { XM, EXx } },
9094 },
9095 {
9096 /* VEX_W_0F16_P_2 */
9097 { "vmovhpd", { XM, Vex128, EXq } },
9098 },
9099 {
9100 /* VEX_W_0F17_M_0 */
9101 { "vmovhpX", { EXq, XM } },
9102 },
9103 {
9104 /* VEX_W_0F28 */
9105 { "vmovapX", { XM, EXx } },
9106 },
9107 {
9108 /* VEX_W_0F29 */
9109 { "vmovapX", { EXxS, XM } },
9110 },
9111 {
9112 /* VEX_W_0F2B_M_0 */
9113 { "vmovntpX", { Mx, XM } },
9114 },
9115 {
9116 /* VEX_W_0F2E_P_0 */
9117 { "vucomiss", { XMScalar, EXdScalar } },
9118 },
9119 {
9120 /* VEX_W_0F2E_P_2 */
9121 { "vucomisd", { XMScalar, EXqScalar } },
9122 },
9123 {
9124 /* VEX_W_0F2F_P_0 */
9125 { "vcomiss", { XMScalar, EXdScalar } },
9126 },
9127 {
9128 /* VEX_W_0F2F_P_2 */
9129 { "vcomisd", { XMScalar, EXqScalar } },
9130 },
9131 {
9132 /* VEX_W_0F50_M_0 */
9133 { "vmovmskpX", { Gdq, XS } },
9134 },
9135 {
9136 /* VEX_W_0F51_P_0 */
9137 { "vsqrtps", { XM, EXx } },
9138 },
9139 {
9140 /* VEX_W_0F51_P_1 */
9141 { "vsqrtss", { XMScalar, VexScalar, EXdScalar } },
9142 },
9143 {
9144 /* VEX_W_0F51_P_2 */
9145 { "vsqrtpd", { XM, EXx } },
9146 },
9147 {
9148 /* VEX_W_0F51_P_3 */
9149 { "vsqrtsd", { XMScalar, VexScalar, EXqScalar } },
9150 },
9151 {
9152 /* VEX_W_0F52_P_0 */
9153 { "vrsqrtps", { XM, EXx } },
9154 },
9155 {
9156 /* VEX_W_0F52_P_1 */
9157 { "vrsqrtss", { XMScalar, VexScalar, EXdScalar } },
9158 },
9159 {
9160 /* VEX_W_0F53_P_0 */
9161 { "vrcpps", { XM, EXx } },
9162 },
9163 {
9164 /* VEX_W_0F53_P_1 */
9165 { "vrcpss", { XMScalar, VexScalar, EXdScalar } },
9166 },
9167 {
9168 /* VEX_W_0F58_P_0 */
9169 { "vaddps", { XM, Vex, EXx } },
9170 },
9171 {
9172 /* VEX_W_0F58_P_1 */
9173 { "vaddss", { XMScalar, VexScalar, EXdScalar } },
9174 },
9175 {
9176 /* VEX_W_0F58_P_2 */
9177 { "vaddpd", { XM, Vex, EXx } },
9178 },
9179 {
9180 /* VEX_W_0F58_P_3 */
9181 { "vaddsd", { XMScalar, VexScalar, EXqScalar } },
9182 },
9183 {
9184 /* VEX_W_0F59_P_0 */
9185 { "vmulps", { XM, Vex, EXx } },
9186 },
9187 {
9188 /* VEX_W_0F59_P_1 */
9189 { "vmulss", { XMScalar, VexScalar, EXdScalar } },
9190 },
9191 {
9192 /* VEX_W_0F59_P_2 */
9193 { "vmulpd", { XM, Vex, EXx } },
9194 },
9195 {
9196 /* VEX_W_0F59_P_3 */
9197 { "vmulsd", { XMScalar, VexScalar, EXqScalar } },
9198 },
9199 {
9200 /* VEX_W_0F5A_P_0 */
9201 { "vcvtps2pd", { XM, EXxmmq } },
9202 },
9203 {
9204 /* VEX_W_0F5A_P_1 */
9205 { "vcvtss2sd", { XMScalar, VexScalar, EXdScalar } },
9206 },
9207 {
9208 /* VEX_W_0F5A_P_3 */
9209 { "vcvtsd2ss", { XMScalar, VexScalar, EXqScalar } },
9210 },
9211 {
9212 /* VEX_W_0F5B_P_0 */
9213 { "vcvtdq2ps", { XM, EXx } },
9214 },
9215 {
9216 /* VEX_W_0F5B_P_1 */
9217 { "vcvttps2dq", { XM, EXx } },
9218 },
9219 {
9220 /* VEX_W_0F5B_P_2 */
9221 { "vcvtps2dq", { XM, EXx } },
9222 },
9223 {
9224 /* VEX_W_0F5C_P_0 */
9225 { "vsubps", { XM, Vex, EXx } },
9226 },
9227 {
9228 /* VEX_W_0F5C_P_1 */
9229 { "vsubss", { XMScalar, VexScalar, EXdScalar } },
9230 },
9231 {
9232 /* VEX_W_0F5C_P_2 */
9233 { "vsubpd", { XM, Vex, EXx } },
9234 },
9235 {
9236 /* VEX_W_0F5C_P_3 */
9237 { "vsubsd", { XMScalar, VexScalar, EXqScalar } },
9238 },
9239 {
9240 /* VEX_W_0F5D_P_0 */
9241 { "vminps", { XM, Vex, EXx } },
9242 },
9243 {
9244 /* VEX_W_0F5D_P_1 */
9245 { "vminss", { XMScalar, VexScalar, EXdScalar } },
9246 },
9247 {
9248 /* VEX_W_0F5D_P_2 */
9249 { "vminpd", { XM, Vex, EXx } },
9250 },
9251 {
9252 /* VEX_W_0F5D_P_3 */
9253 { "vminsd", { XMScalar, VexScalar, EXqScalar } },
9254 },
9255 {
9256 /* VEX_W_0F5E_P_0 */
9257 { "vdivps", { XM, Vex, EXx } },
9258 },
9259 {
9260 /* VEX_W_0F5E_P_1 */
9261 { "vdivss", { XMScalar, VexScalar, EXdScalar } },
9262 },
9263 {
9264 /* VEX_W_0F5E_P_2 */
9265 { "vdivpd", { XM, Vex, EXx } },
9266 },
9267 {
9268 /* VEX_W_0F5E_P_3 */
9269 { "vdivsd", { XMScalar, VexScalar, EXqScalar } },
9270 },
9271 {
9272 /* VEX_W_0F5F_P_0 */
9273 { "vmaxps", { XM, Vex, EXx } },
9274 },
9275 {
9276 /* VEX_W_0F5F_P_1 */
9277 { "vmaxss", { XMScalar, VexScalar, EXdScalar } },
9278 },
9279 {
9280 /* VEX_W_0F5F_P_2 */
9281 { "vmaxpd", { XM, Vex, EXx } },
9282 },
9283 {
9284 /* VEX_W_0F5F_P_3 */
9285 { "vmaxsd", { XMScalar, VexScalar, EXqScalar } },
9286 },
9287 {
9288 /* VEX_W_0F60_P_2 */
9289 { "vpunpcklbw", { XM, Vex, EXx } },
9290 },
9291 {
9292 /* VEX_W_0F61_P_2 */
9293 { "vpunpcklwd", { XM, Vex, EXx } },
9294 },
9295 {
9296 /* VEX_W_0F62_P_2 */
9297 { "vpunpckldq", { XM, Vex, EXx } },
9298 },
9299 {
9300 /* VEX_W_0F63_P_2 */
9301 { "vpacksswb", { XM, Vex, EXx } },
9302 },
9303 {
9304 /* VEX_W_0F64_P_2 */
9305 { "vpcmpgtb", { XM, Vex, EXx } },
9306 },
9307 {
9308 /* VEX_W_0F65_P_2 */
9309 { "vpcmpgtw", { XM, Vex, EXx } },
9310 },
9311 {
9312 /* VEX_W_0F66_P_2 */
9313 { "vpcmpgtd", { XM, Vex, EXx } },
9314 },
9315 {
9316 /* VEX_W_0F67_P_2 */
9317 { "vpackuswb", { XM, Vex, EXx } },
9318 },
9319 {
9320 /* VEX_W_0F68_P_2 */
9321 { "vpunpckhbw", { XM, Vex, EXx } },
9322 },
9323 {
9324 /* VEX_W_0F69_P_2 */
9325 { "vpunpckhwd", { XM, Vex, EXx } },
9326 },
9327 {
9328 /* VEX_W_0F6A_P_2 */
9329 { "vpunpckhdq", { XM, Vex, EXx } },
9330 },
9331 {
9332 /* VEX_W_0F6B_P_2 */
9333 { "vpackssdw", { XM, Vex, EXx } },
9334 },
9335 {
9336 /* VEX_W_0F6C_P_2 */
9337 { "vpunpcklqdq", { XM, Vex, EXx } },
9338 },
9339 {
9340 /* VEX_W_0F6D_P_2 */
9341 { "vpunpckhqdq", { XM, Vex, EXx } },
9342 },
9343 {
9344 /* VEX_W_0F6F_P_1 */
9345 { "vmovdqu", { XM, EXx } },
9346 },
9347 {
9348 /* VEX_W_0F6F_P_2 */
9349 { "vmovdqa", { XM, EXx } },
9350 },
9351 {
9352 /* VEX_W_0F70_P_1 */
9353 { "vpshufhw", { XM, EXx, Ib } },
9354 },
9355 {
9356 /* VEX_W_0F70_P_2 */
9357 { "vpshufd", { XM, EXx, Ib } },
9358 },
9359 {
9360 /* VEX_W_0F70_P_3 */
9361 { "vpshuflw", { XM, EXx, Ib } },
9362 },
9363 {
9364 /* VEX_W_0F71_R_2_P_2 */
9365 { "vpsrlw", { Vex, XS, Ib } },
9366 },
9367 {
9368 /* VEX_W_0F71_R_4_P_2 */
9369 { "vpsraw", { Vex, XS, Ib } },
9370 },
9371 {
9372 /* VEX_W_0F71_R_6_P_2 */
9373 { "vpsllw", { Vex, XS, Ib } },
9374 },
9375 {
9376 /* VEX_W_0F72_R_2_P_2 */
9377 { "vpsrld", { Vex, XS, Ib } },
9378 },
9379 {
9380 /* VEX_W_0F72_R_4_P_2 */
9381 { "vpsrad", { Vex, XS, Ib } },
9382 },
9383 {
9384 /* VEX_W_0F72_R_6_P_2 */
9385 { "vpslld", { Vex, XS, Ib } },
9386 },
9387 {
9388 /* VEX_W_0F73_R_2_P_2 */
9389 { "vpsrlq", { Vex, XS, Ib } },
9390 },
9391 {
9392 /* VEX_W_0F73_R_3_P_2 */
9393 { "vpsrldq", { Vex, XS, Ib } },
9394 },
9395 {
9396 /* VEX_W_0F73_R_6_P_2 */
9397 { "vpsllq", { Vex, XS, Ib } },
9398 },
9399 {
9400 /* VEX_W_0F73_R_7_P_2 */
9401 { "vpslldq", { Vex, XS, Ib } },
9402 },
9403 {
9404 /* VEX_W_0F74_P_2 */
9405 { "vpcmpeqb", { XM, Vex, EXx } },
9406 },
9407 {
9408 /* VEX_W_0F75_P_2 */
9409 { "vpcmpeqw", { XM, Vex, EXx } },
9410 },
9411 {
9412 /* VEX_W_0F76_P_2 */
9413 { "vpcmpeqd", { XM, Vex, EXx } },
9414 },
9415 {
9416 /* VEX_W_0F77_P_0 */
9417 { "", { VZERO } },
9418 },
9419 {
9420 /* VEX_W_0F7C_P_2 */
9421 { "vhaddpd", { XM, Vex, EXx } },
9422 },
9423 {
9424 /* VEX_W_0F7C_P_3 */
9425 { "vhaddps", { XM, Vex, EXx } },
9426 },
9427 {
9428 /* VEX_W_0F7D_P_2 */
9429 { "vhsubpd", { XM, Vex, EXx } },
9430 },
9431 {
9432 /* VEX_W_0F7D_P_3 */
9433 { "vhsubps", { XM, Vex, EXx } },
9434 },
9435 {
9436 /* VEX_W_0F7E_P_1 */
9437 { "vmovq", { XMScalar, EXqScalar } },
9438 },
9439 {
9440 /* VEX_W_0F7F_P_1 */
9441 { "vmovdqu", { EXxS, XM } },
9442 },
9443 {
9444 /* VEX_W_0F7F_P_2 */
9445 { "vmovdqa", { EXxS, XM } },
9446 },
9447 {
9448 /* VEX_W_0FAE_R_2_M_0 */
9449 { "vldmxcsr", { Md } },
9450 },
9451 {
9452 /* VEX_W_0FAE_R_3_M_0 */
9453 { "vstmxcsr", { Md } },
9454 },
9455 {
9456 /* VEX_W_0FC2_P_0 */
9457 { "vcmpps", { XM, Vex, EXx, VCMP } },
9458 },
9459 {
9460 /* VEX_W_0FC2_P_1 */
9461 { "vcmpss", { XMScalar, VexScalar, EXdScalar, VCMP } },
9462 },
9463 {
9464 /* VEX_W_0FC2_P_2 */
9465 { "vcmppd", { XM, Vex, EXx, VCMP } },
9466 },
9467 {
9468 /* VEX_W_0FC2_P_3 */
9469 { "vcmpsd", { XMScalar, VexScalar, EXqScalar, VCMP } },
9470 },
9471 {
9472 /* VEX_W_0FC4_P_2 */
9473 { "vpinsrw", { XM, Vex128, Edqw, Ib } },
9474 },
9475 {
9476 /* VEX_W_0FC5_P_2 */
9477 { "vpextrw", { Gdq, XS, Ib } },
9478 },
9479 {
9480 /* VEX_W_0FD0_P_2 */
9481 { "vaddsubpd", { XM, Vex, EXx } },
9482 },
9483 {
9484 /* VEX_W_0FD0_P_3 */
9485 { "vaddsubps", { XM, Vex, EXx } },
9486 },
9487 {
9488 /* VEX_W_0FD1_P_2 */
9489 { "vpsrlw", { XM, Vex, EXxmm } },
9490 },
9491 {
9492 /* VEX_W_0FD2_P_2 */
9493 { "vpsrld", { XM, Vex, EXxmm } },
9494 },
9495 {
9496 /* VEX_W_0FD3_P_2 */
9497 { "vpsrlq", { XM, Vex, EXxmm } },
9498 },
9499 {
9500 /* VEX_W_0FD4_P_2 */
9501 { "vpaddq", { XM, Vex, EXx } },
9502 },
9503 {
9504 /* VEX_W_0FD5_P_2 */
9505 { "vpmullw", { XM, Vex, EXx } },
9506 },
9507 {
9508 /* VEX_W_0FD6_P_2 */
9509 { "vmovq", { EXqScalarS, XMScalar } },
9510 },
9511 {
9512 /* VEX_W_0FD7_P_2_M_1 */
9513 { "vpmovmskb", { Gdq, XS } },
9514 },
9515 {
9516 /* VEX_W_0FD8_P_2 */
9517 { "vpsubusb", { XM, Vex, EXx } },
9518 },
9519 {
9520 /* VEX_W_0FD9_P_2 */
9521 { "vpsubusw", { XM, Vex, EXx } },
9522 },
9523 {
9524 /* VEX_W_0FDA_P_2 */
9525 { "vpminub", { XM, Vex, EXx } },
9526 },
9527 {
9528 /* VEX_W_0FDB_P_2 */
9529 { "vpand", { XM, Vex, EXx } },
9530 },
9531 {
9532 /* VEX_W_0FDC_P_2 */
9533 { "vpaddusb", { XM, Vex, EXx } },
9534 },
9535 {
9536 /* VEX_W_0FDD_P_2 */
9537 { "vpaddusw", { XM, Vex, EXx } },
9538 },
9539 {
9540 /* VEX_W_0FDE_P_2 */
9541 { "vpmaxub", { XM, Vex, EXx } },
9542 },
9543 {
9544 /* VEX_W_0FDF_P_2 */
9545 { "vpandn", { XM, Vex, EXx } },
9546 },
9547 {
9548 /* VEX_W_0FE0_P_2 */
9549 { "vpavgb", { XM, Vex, EXx } },
9550 },
9551 {
9552 /* VEX_W_0FE1_P_2 */
9553 { "vpsraw", { XM, Vex, EXxmm } },
9554 },
9555 {
9556 /* VEX_W_0FE2_P_2 */
9557 { "vpsrad", { XM, Vex, EXxmm } },
9558 },
9559 {
9560 /* VEX_W_0FE3_P_2 */
9561 { "vpavgw", { XM, Vex, EXx } },
9562 },
9563 {
9564 /* VEX_W_0FE4_P_2 */
9565 { "vpmulhuw", { XM, Vex, EXx } },
9566 },
9567 {
9568 /* VEX_W_0FE5_P_2 */
9569 { "vpmulhw", { XM, Vex, EXx } },
9570 },
9571 {
9572 /* VEX_W_0FE6_P_1 */
9573 { "vcvtdq2pd", { XM, EXxmmq } },
9574 },
9575 {
9576 /* VEX_W_0FE6_P_2 */
9577 { "vcvttpd2dq%XY", { XMM, EXx } },
9578 },
9579 {
9580 /* VEX_W_0FE6_P_3 */
9581 { "vcvtpd2dq%XY", { XMM, EXx } },
9582 },
9583 {
9584 /* VEX_W_0FE7_P_2_M_0 */
9585 { "vmovntdq", { Mx, XM } },
9586 },
9587 {
9588 /* VEX_W_0FE8_P_2 */
9589 { "vpsubsb", { XM, Vex, EXx } },
9590 },
9591 {
9592 /* VEX_W_0FE9_P_2 */
9593 { "vpsubsw", { XM, Vex, EXx } },
9594 },
9595 {
9596 /* VEX_W_0FEA_P_2 */
9597 { "vpminsw", { XM, Vex, EXx } },
9598 },
9599 {
9600 /* VEX_W_0FEB_P_2 */
9601 { "vpor", { XM, Vex, EXx } },
9602 },
9603 {
9604 /* VEX_W_0FEC_P_2 */
9605 { "vpaddsb", { XM, Vex, EXx } },
9606 },
9607 {
9608 /* VEX_W_0FED_P_2 */
9609 { "vpaddsw", { XM, Vex, EXx } },
9610 },
9611 {
9612 /* VEX_W_0FEE_P_2 */
9613 { "vpmaxsw", { XM, Vex, EXx } },
9614 },
9615 {
9616 /* VEX_W_0FEF_P_2 */
9617 { "vpxor", { XM, Vex, EXx } },
9618 },
9619 {
9620 /* VEX_W_0FF0_P_3_M_0 */
9621 { "vlddqu", { XM, M } },
9622 },
9623 {
9624 /* VEX_W_0FF1_P_2 */
9625 { "vpsllw", { XM, Vex, EXxmm } },
9626 },
9627 {
9628 /* VEX_W_0FF2_P_2 */
9629 { "vpslld", { XM, Vex, EXxmm } },
9630 },
9631 {
9632 /* VEX_W_0FF3_P_2 */
9633 { "vpsllq", { XM, Vex, EXxmm } },
9634 },
9635 {
9636 /* VEX_W_0FF4_P_2 */
9637 { "vpmuludq", { XM, Vex, EXx } },
9638 },
9639 {
9640 /* VEX_W_0FF5_P_2 */
9641 { "vpmaddwd", { XM, Vex, EXx } },
9642 },
9643 {
9644 /* VEX_W_0FF6_P_2 */
9645 { "vpsadbw", { XM, Vex, EXx } },
9646 },
9647 {
9648 /* VEX_W_0FF7_P_2 */
9649 { "vmaskmovdqu", { XM, XS } },
9650 },
9651 {
9652 /* VEX_W_0FF8_P_2 */
9653 { "vpsubb", { XM, Vex, EXx } },
9654 },
9655 {
9656 /* VEX_W_0FF9_P_2 */
9657 { "vpsubw", { XM, Vex, EXx } },
9658 },
9659 {
9660 /* VEX_W_0FFA_P_2 */
9661 { "vpsubd", { XM, Vex, EXx } },
9662 },
9663 {
9664 /* VEX_W_0FFB_P_2 */
9665 { "vpsubq", { XM, Vex, EXx } },
9666 },
9667 {
9668 /* VEX_W_0FFC_P_2 */
9669 { "vpaddb", { XM, Vex, EXx } },
9670 },
9671 {
9672 /* VEX_W_0FFD_P_2 */
9673 { "vpaddw", { XM, Vex, EXx } },
9674 },
9675 {
9676 /* VEX_W_0FFE_P_2 */
9677 { "vpaddd", { XM, Vex, EXx } },
9678 },
9679 {
9680 /* VEX_W_0F3800_P_2 */
9681 { "vpshufb", { XM, Vex, EXx } },
9682 },
9683 {
9684 /* VEX_W_0F3801_P_2 */
9685 { "vphaddw", { XM, Vex, EXx } },
9686 },
9687 {
9688 /* VEX_W_0F3802_P_2 */
9689 { "vphaddd", { XM, Vex, EXx } },
9690 },
9691 {
9692 /* VEX_W_0F3803_P_2 */
9693 { "vphaddsw", { XM, Vex, EXx } },
9694 },
9695 {
9696 /* VEX_W_0F3804_P_2 */
9697 { "vpmaddubsw", { XM, Vex, EXx } },
9698 },
9699 {
9700 /* VEX_W_0F3805_P_2 */
9701 { "vphsubw", { XM, Vex, EXx } },
9702 },
9703 {
9704 /* VEX_W_0F3806_P_2 */
9705 { "vphsubd", { XM, Vex, EXx } },
9706 },
9707 {
9708 /* VEX_W_0F3807_P_2 */
9709 { "vphsubsw", { XM, Vex, EXx } },
9710 },
9711 {
9712 /* VEX_W_0F3808_P_2 */
9713 { "vpsignb", { XM, Vex, EXx } },
9714 },
9715 {
9716 /* VEX_W_0F3809_P_2 */
9717 { "vpsignw", { XM, Vex, EXx } },
9718 },
9719 {
9720 /* VEX_W_0F380A_P_2 */
9721 { "vpsignd", { XM, Vex, EXx } },
9722 },
9723 {
9724 /* VEX_W_0F380B_P_2 */
9725 { "vpmulhrsw", { XM, Vex, EXx } },
9726 },
9727 {
9728 /* VEX_W_0F380C_P_2 */
9729 { "vpermilps", { XM, Vex, EXx } },
9730 },
9731 {
9732 /* VEX_W_0F380D_P_2 */
9733 { "vpermilpd", { XM, Vex, EXx } },
9734 },
9735 {
9736 /* VEX_W_0F380E_P_2 */
9737 { "vtestps", { XM, EXx } },
9738 },
9739 {
9740 /* VEX_W_0F380F_P_2 */
9741 { "vtestpd", { XM, EXx } },
9742 },
9743 {
9744 /* VEX_W_0F3816_P_2 */
9745 { "vpermps", { XM, Vex, EXx } },
9746 },
9747 {
9748 /* VEX_W_0F3817_P_2 */
9749 { "vptest", { XM, EXx } },
9750 },
9751 {
9752 /* VEX_W_0F3818_P_2 */
9753 { "vbroadcastss", { XM, EXxmm_md } },
9754 },
9755 {
9756 /* VEX_W_0F3819_P_2 */
9757 { "vbroadcastsd", { XM, EXxmm_mq } },
9758 },
9759 {
9760 /* VEX_W_0F381A_P_2_M_0 */
9761 { "vbroadcastf128", { XM, Mxmm } },
9762 },
9763 {
9764 /* VEX_W_0F381C_P_2 */
9765 { "vpabsb", { XM, EXx } },
9766 },
9767 {
9768 /* VEX_W_0F381D_P_2 */
9769 { "vpabsw", { XM, EXx } },
9770 },
9771 {
9772 /* VEX_W_0F381E_P_2 */
9773 { "vpabsd", { XM, EXx } },
9774 },
9775 {
9776 /* VEX_W_0F3820_P_2 */
9777 { "vpmovsxbw", { XM, EXxmmq } },
9778 },
9779 {
9780 /* VEX_W_0F3821_P_2 */
9781 { "vpmovsxbd", { XM, EXxmmqd } },
9782 },
9783 {
9784 /* VEX_W_0F3822_P_2 */
9785 { "vpmovsxbq", { XM, EXxmmdw } },
9786 },
9787 {
9788 /* VEX_W_0F3823_P_2 */
9789 { "vpmovsxwd", { XM, EXxmmq } },
9790 },
9791 {
9792 /* VEX_W_0F3824_P_2 */
9793 { "vpmovsxwq", { XM, EXxmmqd } },
9794 },
9795 {
9796 /* VEX_W_0F3825_P_2 */
9797 { "vpmovsxdq", { XM, EXxmmq } },
9798 },
9799 {
9800 /* VEX_W_0F3828_P_2 */
9801 { "vpmuldq", { XM, Vex, EXx } },
9802 },
9803 {
9804 /* VEX_W_0F3829_P_2 */
9805 { "vpcmpeqq", { XM, Vex, EXx } },
9806 },
9807 {
9808 /* VEX_W_0F382A_P_2_M_0 */
9809 { "vmovntdqa", { XM, Mx } },
9810 },
9811 {
9812 /* VEX_W_0F382B_P_2 */
9813 { "vpackusdw", { XM, Vex, EXx } },
9814 },
9815 {
9816 /* VEX_W_0F382C_P_2_M_0 */
9817 { "vmaskmovps", { XM, Vex, Mx } },
9818 },
9819 {
9820 /* VEX_W_0F382D_P_2_M_0 */
9821 { "vmaskmovpd", { XM, Vex, Mx } },
9822 },
9823 {
9824 /* VEX_W_0F382E_P_2_M_0 */
9825 { "vmaskmovps", { Mx, Vex, XM } },
9826 },
9827 {
9828 /* VEX_W_0F382F_P_2_M_0 */
9829 { "vmaskmovpd", { Mx, Vex, XM } },
9830 },
9831 {
9832 /* VEX_W_0F3830_P_2 */
9833 { "vpmovzxbw", { XM, EXxmmq } },
9834 },
9835 {
9836 /* VEX_W_0F3831_P_2 */
9837 { "vpmovzxbd", { XM, EXxmmqd } },
9838 },
9839 {
9840 /* VEX_W_0F3832_P_2 */
9841 { "vpmovzxbq", { XM, EXxmmdw } },
9842 },
9843 {
9844 /* VEX_W_0F3833_P_2 */
9845 { "vpmovzxwd", { XM, EXxmmq } },
9846 },
9847 {
9848 /* VEX_W_0F3834_P_2 */
9849 { "vpmovzxwq", { XM, EXxmmqd } },
9850 },
9851 {
9852 /* VEX_W_0F3835_P_2 */
9853 { "vpmovzxdq", { XM, EXxmmq } },
9854 },
9855 {
9856 /* VEX_W_0F3836_P_2 */
9857 { "vpermd", { XM, Vex, EXx } },
9858 },
9859 {
9860 /* VEX_W_0F3837_P_2 */
9861 { "vpcmpgtq", { XM, Vex, EXx } },
9862 },
9863 {
9864 /* VEX_W_0F3838_P_2 */
9865 { "vpminsb", { XM, Vex, EXx } },
9866 },
9867 {
9868 /* VEX_W_0F3839_P_2 */
9869 { "vpminsd", { XM, Vex, EXx } },
9870 },
9871 {
9872 /* VEX_W_0F383A_P_2 */
9873 { "vpminuw", { XM, Vex, EXx } },
9874 },
9875 {
9876 /* VEX_W_0F383B_P_2 */
9877 { "vpminud", { XM, Vex, EXx } },
9878 },
9879 {
9880 /* VEX_W_0F383C_P_2 */
9881 { "vpmaxsb", { XM, Vex, EXx } },
9882 },
9883 {
9884 /* VEX_W_0F383D_P_2 */
9885 { "vpmaxsd", { XM, Vex, EXx } },
9886 },
9887 {
9888 /* VEX_W_0F383E_P_2 */
9889 { "vpmaxuw", { XM, Vex, EXx } },
9890 },
9891 {
9892 /* VEX_W_0F383F_P_2 */
9893 { "vpmaxud", { XM, Vex, EXx } },
9894 },
9895 {
9896 /* VEX_W_0F3840_P_2 */
9897 { "vpmulld", { XM, Vex, EXx } },
9898 },
9899 {
9900 /* VEX_W_0F3841_P_2 */
9901 { "vphminposuw", { XM, EXx } },
9902 },
9903 {
9904 /* VEX_W_0F3846_P_2 */
9905 { "vpsravd", { XM, Vex, EXx } },
9906 },
9907 {
9908 /* VEX_W_0F3858_P_2 */
9909 { "vpbroadcastd", { XM, EXxmm_md } },
9910 },
9911 {
9912 /* VEX_W_0F3859_P_2 */
9913 { "vpbroadcastq", { XM, EXxmm_mq } },
9914 },
9915 {
9916 /* VEX_W_0F385A_P_2_M_0 */
9917 { "vbroadcasti128", { XM, Mxmm } },
9918 },
9919 {
9920 /* VEX_W_0F3878_P_2 */
9921 { "vpbroadcastb", { XM, EXxmm_mb } },
9922 },
9923 {
9924 /* VEX_W_0F3879_P_2 */
9925 { "vpbroadcastw", { XM, EXxmm_mw } },
9926 },
9927 {
9928 /* VEX_W_0F38DB_P_2 */
9929 { "vaesimc", { XM, EXx } },
9930 },
9931 {
9932 /* VEX_W_0F38DC_P_2 */
9933 { "vaesenc", { XM, Vex128, EXx } },
9934 },
9935 {
9936 /* VEX_W_0F38DD_P_2 */
9937 { "vaesenclast", { XM, Vex128, EXx } },
9938 },
9939 {
9940 /* VEX_W_0F38DE_P_2 */
9941 { "vaesdec", { XM, Vex128, EXx } },
9942 },
9943 {
9944 /* VEX_W_0F38DF_P_2 */
9945 { "vaesdeclast", { XM, Vex128, EXx } },
9946 },
9947 {
9948 /* VEX_W_0F3A00_P_2 */
9949 { Bad_Opcode },
9950 { "vpermq", { XM, EXx, Ib } },
9951 },
9952 {
9953 /* VEX_W_0F3A01_P_2 */
9954 { Bad_Opcode },
9955 { "vpermpd", { XM, EXx, Ib } },
9956 },
9957 {
9958 /* VEX_W_0F3A02_P_2 */
9959 { "vpblendd", { XM, Vex, EXx, Ib } },
9960 },
9961 {
9962 /* VEX_W_0F3A04_P_2 */
9963 { "vpermilps", { XM, EXx, Ib } },
9964 },
9965 {
9966 /* VEX_W_0F3A05_P_2 */
9967 { "vpermilpd", { XM, EXx, Ib } },
9968 },
9969 {
9970 /* VEX_W_0F3A06_P_2 */
9971 { "vperm2f128", { XM, Vex256, EXx, Ib } },
9972 },
9973 {
9974 /* VEX_W_0F3A08_P_2 */
9975 { "vroundps", { XM, EXx, Ib } },
9976 },
9977 {
9978 /* VEX_W_0F3A09_P_2 */
9979 { "vroundpd", { XM, EXx, Ib } },
9980 },
9981 {
9982 /* VEX_W_0F3A0A_P_2 */
9983 { "vroundss", { XMScalar, VexScalar, EXdScalar, Ib } },
9984 },
9985 {
9986 /* VEX_W_0F3A0B_P_2 */
9987 { "vroundsd", { XMScalar, VexScalar, EXqScalar, Ib } },
9988 },
9989 {
9990 /* VEX_W_0F3A0C_P_2 */
9991 { "vblendps", { XM, Vex, EXx, Ib } },
9992 },
9993 {
9994 /* VEX_W_0F3A0D_P_2 */
9995 { "vblendpd", { XM, Vex, EXx, Ib } },
9996 },
9997 {
9998 /* VEX_W_0F3A0E_P_2 */
9999 { "vpblendw", { XM, Vex, EXx, Ib } },
10000 },
10001 {
10002 /* VEX_W_0F3A0F_P_2 */
10003 { "vpalignr", { XM, Vex, EXx, Ib } },
10004 },
10005 {
10006 /* VEX_W_0F3A14_P_2 */
10007 { "vpextrb", { Edqb, XM, Ib } },
10008 },
10009 {
10010 /* VEX_W_0F3A15_P_2 */
10011 { "vpextrw", { Edqw, XM, Ib } },
10012 },
10013 {
10014 /* VEX_W_0F3A18_P_2 */
10015 { "vinsertf128", { XM, Vex256, EXxmm, Ib } },
10016 },
10017 {
10018 /* VEX_W_0F3A19_P_2 */
10019 { "vextractf128", { EXxmm, XM, Ib } },
10020 },
10021 {
10022 /* VEX_W_0F3A20_P_2 */
10023 { "vpinsrb", { XM, Vex128, Edqb, Ib } },
10024 },
10025 {
10026 /* VEX_W_0F3A21_P_2 */
10027 { "vinsertps", { XM, Vex128, EXd, Ib } },
10028 },
10029 {
10030 /* VEX_W_0F3A38_P_2 */
10031 { "vinserti128", { XM, Vex256, EXxmm, Ib } },
10032 },
10033 {
10034 /* VEX_W_0F3A39_P_2 */
10035 { "vextracti128", { EXxmm, XM, Ib } },
10036 },
10037 {
10038 /* VEX_W_0F3A40_P_2 */
10039 { "vdpps", { XM, Vex, EXx, Ib } },
10040 },
10041 {
10042 /* VEX_W_0F3A41_P_2 */
10043 { "vdppd", { XM, Vex128, EXx, Ib } },
10044 },
10045 {
10046 /* VEX_W_0F3A42_P_2 */
10047 { "vmpsadbw", { XM, Vex, EXx, Ib } },
10048 },
10049 {
10050 /* VEX_W_0F3A44_P_2 */
10051 { "vpclmulqdq", { XM, Vex128, EXx, PCLMUL } },
10052 },
10053 {
10054 /* VEX_W_0F3A46_P_2 */
10055 { "vperm2i128", { XM, Vex256, EXx, Ib } },
10056 },
10057 {
10058 /* VEX_W_0F3A48_P_2 */
10059 { "vpermil2ps", { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW } },
10060 { "vpermil2ps", { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW } },
10061 },
10062 {
10063 /* VEX_W_0F3A49_P_2 */
10064 { "vpermil2pd", { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW } },
10065 { "vpermil2pd", { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW } },
10066 },
10067 {
10068 /* VEX_W_0F3A4A_P_2 */
10069 { "vblendvps", { XM, Vex, EXx, XMVexI4 } },
10070 },
10071 {
10072 /* VEX_W_0F3A4B_P_2 */
10073 { "vblendvpd", { XM, Vex, EXx, XMVexI4 } },
10074 },
10075 {
10076 /* VEX_W_0F3A4C_P_2 */
10077 { "vpblendvb", { XM, Vex, EXx, XMVexI4 } },
10078 },
10079 {
10080 /* VEX_W_0F3A60_P_2 */
10081 { "vpcmpestrm", { XM, EXx, Ib } },
10082 },
10083 {
10084 /* VEX_W_0F3A61_P_2 */
10085 { "vpcmpestri", { XM, EXx, Ib } },
10086 },
10087 {
10088 /* VEX_W_0F3A62_P_2 */
10089 { "vpcmpistrm", { XM, EXx, Ib } },
10090 },
10091 {
10092 /* VEX_W_0F3A63_P_2 */
10093 { "vpcmpistri", { XM, EXx, Ib } },
10094 },
10095 {
10096 /* VEX_W_0F3ADF_P_2 */
10097 { "vaeskeygenassist", { XM, EXx, Ib } },
10098 },
10099 };
10100
10101 static const struct dis386 mod_table[][2] = {
10102 {
10103 /* MOD_8D */
10104 { "leaS", { Gv, M } },
10105 },
10106 {
10107 /* MOD_C6_REG_7 */
10108 { Bad_Opcode },
10109 { RM_TABLE (RM_C6_REG_7) },
10110 },
10111 {
10112 /* MOD_C7_REG_7 */
10113 { Bad_Opcode },
10114 { RM_TABLE (RM_C7_REG_7) },
10115 },
10116 {
10117 /* MOD_0F01_REG_0 */
10118 { X86_64_TABLE (X86_64_0F01_REG_0) },
10119 { RM_TABLE (RM_0F01_REG_0) },
10120 },
10121 {
10122 /* MOD_0F01_REG_1 */
10123 { X86_64_TABLE (X86_64_0F01_REG_1) },
10124 { RM_TABLE (RM_0F01_REG_1) },
10125 },
10126 {
10127 /* MOD_0F01_REG_2 */
10128 { X86_64_TABLE (X86_64_0F01_REG_2) },
10129 { RM_TABLE (RM_0F01_REG_2) },
10130 },
10131 {
10132 /* MOD_0F01_REG_3 */
10133 { X86_64_TABLE (X86_64_0F01_REG_3) },
10134 { RM_TABLE (RM_0F01_REG_3) },
10135 },
10136 {
10137 /* MOD_0F01_REG_7 */
10138 { "invlpg", { Mb } },
10139 { RM_TABLE (RM_0F01_REG_7) },
10140 },
10141 {
10142 /* MOD_0F12_PREFIX_0 */
10143 { "movlps", { XM, EXq } },
10144 { "movhlps", { XM, EXq } },
10145 },
10146 {
10147 /* MOD_0F13 */
10148 { "movlpX", { EXq, XM } },
10149 },
10150 {
10151 /* MOD_0F16_PREFIX_0 */
10152 { "movhps", { XM, EXq } },
10153 { "movlhps", { XM, EXq } },
10154 },
10155 {
10156 /* MOD_0F17 */
10157 { "movhpX", { EXq, XM } },
10158 },
10159 {
10160 /* MOD_0F18_REG_0 */
10161 { "prefetchnta", { Mb } },
10162 },
10163 {
10164 /* MOD_0F18_REG_1 */
10165 { "prefetcht0", { Mb } },
10166 },
10167 {
10168 /* MOD_0F18_REG_2 */
10169 { "prefetcht1", { Mb } },
10170 },
10171 {
10172 /* MOD_0F18_REG_3 */
10173 { "prefetcht2", { Mb } },
10174 },
10175 {
10176 /* MOD_0F20 */
10177 { Bad_Opcode },
10178 { "movZ", { Rm, Cm } },
10179 },
10180 {
10181 /* MOD_0F21 */
10182 { Bad_Opcode },
10183 { "movZ", { Rm, Dm } },
10184 },
10185 {
10186 /* MOD_0F22 */
10187 { Bad_Opcode },
10188 { "movZ", { Cm, Rm } },
10189 },
10190 {
10191 /* MOD_0F23 */
10192 { Bad_Opcode },
10193 { "movZ", { Dm, Rm } },
10194 },
10195 {
10196 /* MOD_0F24 */
10197 { Bad_Opcode },
10198 { "movL", { Rd, Td } },
10199 },
10200 {
10201 /* MOD_0F26 */
10202 { Bad_Opcode },
10203 { "movL", { Td, Rd } },
10204 },
10205 {
10206 /* MOD_0F2B_PREFIX_0 */
10207 {"movntps", { Mx, XM } },
10208 },
10209 {
10210 /* MOD_0F2B_PREFIX_1 */
10211 {"movntss", { Md, XM } },
10212 },
10213 {
10214 /* MOD_0F2B_PREFIX_2 */
10215 {"movntpd", { Mx, XM } },
10216 },
10217 {
10218 /* MOD_0F2B_PREFIX_3 */
10219 {"movntsd", { Mq, XM } },
10220 },
10221 {
10222 /* MOD_0F51 */
10223 { Bad_Opcode },
10224 { "movmskpX", { Gdq, XS } },
10225 },
10226 {
10227 /* MOD_0F71_REG_2 */
10228 { Bad_Opcode },
10229 { "psrlw", { MS, Ib } },
10230 },
10231 {
10232 /* MOD_0F71_REG_4 */
10233 { Bad_Opcode },
10234 { "psraw", { MS, Ib } },
10235 },
10236 {
10237 /* MOD_0F71_REG_6 */
10238 { Bad_Opcode },
10239 { "psllw", { MS, Ib } },
10240 },
10241 {
10242 /* MOD_0F72_REG_2 */
10243 { Bad_Opcode },
10244 { "psrld", { MS, Ib } },
10245 },
10246 {
10247 /* MOD_0F72_REG_4 */
10248 { Bad_Opcode },
10249 { "psrad", { MS, Ib } },
10250 },
10251 {
10252 /* MOD_0F72_REG_6 */
10253 { Bad_Opcode },
10254 { "pslld", { MS, Ib } },
10255 },
10256 {
10257 /* MOD_0F73_REG_2 */
10258 { Bad_Opcode },
10259 { "psrlq", { MS, Ib } },
10260 },
10261 {
10262 /* MOD_0F73_REG_3 */
10263 { Bad_Opcode },
10264 { PREFIX_TABLE (PREFIX_0F73_REG_3) },
10265 },
10266 {
10267 /* MOD_0F73_REG_6 */
10268 { Bad_Opcode },
10269 { "psllq", { MS, Ib } },
10270 },
10271 {
10272 /* MOD_0F73_REG_7 */
10273 { Bad_Opcode },
10274 { PREFIX_TABLE (PREFIX_0F73_REG_7) },
10275 },
10276 {
10277 /* MOD_0FAE_REG_0 */
10278 { "fxsave", { FXSAVE } },
10279 { PREFIX_TABLE (PREFIX_0FAE_REG_0) },
10280 },
10281 {
10282 /* MOD_0FAE_REG_1 */
10283 { "fxrstor", { FXSAVE } },
10284 { PREFIX_TABLE (PREFIX_0FAE_REG_1) },
10285 },
10286 {
10287 /* MOD_0FAE_REG_2 */
10288 { "ldmxcsr", { Md } },
10289 { PREFIX_TABLE (PREFIX_0FAE_REG_2) },
10290 },
10291 {
10292 /* MOD_0FAE_REG_3 */
10293 { "stmxcsr", { Md } },
10294 { PREFIX_TABLE (PREFIX_0FAE_REG_3) },
10295 },
10296 {
10297 /* MOD_0FAE_REG_4 */
10298 { "xsave", { FXSAVE } },
10299 },
10300 {
10301 /* MOD_0FAE_REG_5 */
10302 { "xrstor", { FXSAVE } },
10303 { RM_TABLE (RM_0FAE_REG_5) },
10304 },
10305 {
10306 /* MOD_0FAE_REG_6 */
10307 { "xsaveopt", { FXSAVE } },
10308 { RM_TABLE (RM_0FAE_REG_6) },
10309 },
10310 {
10311 /* MOD_0FAE_REG_7 */
10312 { "clflush", { Mb } },
10313 { RM_TABLE (RM_0FAE_REG_7) },
10314 },
10315 {
10316 /* MOD_0FB2 */
10317 { "lssS", { Gv, Mp } },
10318 },
10319 {
10320 /* MOD_0FB4 */
10321 { "lfsS", { Gv, Mp } },
10322 },
10323 {
10324 /* MOD_0FB5 */
10325 { "lgsS", { Gv, Mp } },
10326 },
10327 {
10328 /* MOD_0FC7_REG_6 */
10329 { PREFIX_TABLE (PREFIX_0FC7_REG_6) },
10330 { "rdrand", { Ev } },
10331 },
10332 {
10333 /* MOD_0FC7_REG_7 */
10334 { "vmptrst", { Mq } },
10335 { "rdseed", { Ev } },
10336 },
10337 {
10338 /* MOD_0FD7 */
10339 { Bad_Opcode },
10340 { "pmovmskb", { Gdq, MS } },
10341 },
10342 {
10343 /* MOD_0FE7_PREFIX_2 */
10344 { "movntdq", { Mx, XM } },
10345 },
10346 {
10347 /* MOD_0FF0_PREFIX_3 */
10348 { "lddqu", { XM, M } },
10349 },
10350 {
10351 /* MOD_0F382A_PREFIX_2 */
10352 { "movntdqa", { XM, Mx } },
10353 },
10354 {
10355 /* MOD_62_32BIT */
10356 { "bound{S|}", { Gv, Ma } },
10357 },
10358 {
10359 /* MOD_C4_32BIT */
10360 { "lesS", { Gv, Mp } },
10361 { VEX_C4_TABLE (VEX_0F) },
10362 },
10363 {
10364 /* MOD_C5_32BIT */
10365 { "ldsS", { Gv, Mp } },
10366 { VEX_C5_TABLE (VEX_0F) },
10367 },
10368 {
10369 /* MOD_VEX_0F12_PREFIX_0 */
10370 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_0) },
10371 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_1) },
10372 },
10373 {
10374 /* MOD_VEX_0F13 */
10375 { VEX_LEN_TABLE (VEX_LEN_0F13_M_0) },
10376 },
10377 {
10378 /* MOD_VEX_0F16_PREFIX_0 */
10379 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_0) },
10380 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_1) },
10381 },
10382 {
10383 /* MOD_VEX_0F17 */
10384 { VEX_LEN_TABLE (VEX_LEN_0F17_M_0) },
10385 },
10386 {
10387 /* MOD_VEX_0F2B */
10388 { VEX_W_TABLE (VEX_W_0F2B_M_0) },
10389 },
10390 {
10391 /* MOD_VEX_0F50 */
10392 { Bad_Opcode },
10393 { VEX_W_TABLE (VEX_W_0F50_M_0) },
10394 },
10395 {
10396 /* MOD_VEX_0F71_REG_2 */
10397 { Bad_Opcode },
10398 { PREFIX_TABLE (PREFIX_VEX_0F71_REG_2) },
10399 },
10400 {
10401 /* MOD_VEX_0F71_REG_4 */
10402 { Bad_Opcode },
10403 { PREFIX_TABLE (PREFIX_VEX_0F71_REG_4) },
10404 },
10405 {
10406 /* MOD_VEX_0F71_REG_6 */
10407 { Bad_Opcode },
10408 { PREFIX_TABLE (PREFIX_VEX_0F71_REG_6) },
10409 },
10410 {
10411 /* MOD_VEX_0F72_REG_2 */
10412 { Bad_Opcode },
10413 { PREFIX_TABLE (PREFIX_VEX_0F72_REG_2) },
10414 },
10415 {
10416 /* MOD_VEX_0F72_REG_4 */
10417 { Bad_Opcode },
10418 { PREFIX_TABLE (PREFIX_VEX_0F72_REG_4) },
10419 },
10420 {
10421 /* MOD_VEX_0F72_REG_6 */
10422 { Bad_Opcode },
10423 { PREFIX_TABLE (PREFIX_VEX_0F72_REG_6) },
10424 },
10425 {
10426 /* MOD_VEX_0F73_REG_2 */
10427 { Bad_Opcode },
10428 { PREFIX_TABLE (PREFIX_VEX_0F73_REG_2) },
10429 },
10430 {
10431 /* MOD_VEX_0F73_REG_3 */
10432 { Bad_Opcode },
10433 { PREFIX_TABLE (PREFIX_VEX_0F73_REG_3) },
10434 },
10435 {
10436 /* MOD_VEX_0F73_REG_6 */
10437 { Bad_Opcode },
10438 { PREFIX_TABLE (PREFIX_VEX_0F73_REG_6) },
10439 },
10440 {
10441 /* MOD_VEX_0F73_REG_7 */
10442 { Bad_Opcode },
10443 { PREFIX_TABLE (PREFIX_VEX_0F73_REG_7) },
10444 },
10445 {
10446 /* MOD_VEX_0FAE_REG_2 */
10447 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_2_M_0) },
10448 },
10449 {
10450 /* MOD_VEX_0FAE_REG_3 */
10451 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_3_M_0) },
10452 },
10453 {
10454 /* MOD_VEX_0FD7_PREFIX_2 */
10455 { Bad_Opcode },
10456 { VEX_W_TABLE (VEX_W_0FD7_P_2_M_1) },
10457 },
10458 {
10459 /* MOD_VEX_0FE7_PREFIX_2 */
10460 { VEX_W_TABLE (VEX_W_0FE7_P_2_M_0) },
10461 },
10462 {
10463 /* MOD_VEX_0FF0_PREFIX_3 */
10464 { VEX_W_TABLE (VEX_W_0FF0_P_3_M_0) },
10465 },
10466 {
10467 /* MOD_VEX_0F381A_PREFIX_2 */
10468 { VEX_LEN_TABLE (VEX_LEN_0F381A_P_2_M_0) },
10469 },
10470 {
10471 /* MOD_VEX_0F382A_PREFIX_2 */
10472 { VEX_W_TABLE (VEX_W_0F382A_P_2_M_0) },
10473 },
10474 {
10475 /* MOD_VEX_0F382C_PREFIX_2 */
10476 { VEX_W_TABLE (VEX_W_0F382C_P_2_M_0) },
10477 },
10478 {
10479 /* MOD_VEX_0F382D_PREFIX_2 */
10480 { VEX_W_TABLE (VEX_W_0F382D_P_2_M_0) },
10481 },
10482 {
10483 /* MOD_VEX_0F382E_PREFIX_2 */
10484 { VEX_W_TABLE (VEX_W_0F382E_P_2_M_0) },
10485 },
10486 {
10487 /* MOD_VEX_0F382F_PREFIX_2 */
10488 { VEX_W_TABLE (VEX_W_0F382F_P_2_M_0) },
10489 },
10490 {
10491 /* MOD_VEX_0F385A_PREFIX_2 */
10492 { VEX_LEN_TABLE (VEX_LEN_0F385A_P_2_M_0) },
10493 },
10494 {
10495 /* MOD_VEX_0F388C_PREFIX_2 */
10496 { "vpmaskmov%LW", { XM, Vex, Mx } },
10497 },
10498 {
10499 /* MOD_VEX_0F388E_PREFIX_2 */
10500 { "vpmaskmov%LW", { Mx, Vex, XM } },
10501 },
10502 };
10503
10504 static const struct dis386 rm_table[][8] = {
10505 {
10506 /* RM_C6_REG_7 */
10507 { "xabort", { Skip_MODRM, Ib } },
10508 },
10509 {
10510 /* RM_C7_REG_7 */
10511 { "xbeginT", { Skip_MODRM, Jv } },
10512 },
10513 {
10514 /* RM_0F01_REG_0 */
10515 { Bad_Opcode },
10516 { "vmcall", { Skip_MODRM } },
10517 { "vmlaunch", { Skip_MODRM } },
10518 { "vmresume", { Skip_MODRM } },
10519 { "vmxoff", { Skip_MODRM } },
10520 },
10521 {
10522 /* RM_0F01_REG_1 */
10523 { "monitor", { { OP_Monitor, 0 } } },
10524 { "mwait", { { OP_Mwait, 0 } } },
10525 },
10526 {
10527 /* RM_0F01_REG_2 */
10528 { "xgetbv", { Skip_MODRM } },
10529 { "xsetbv", { Skip_MODRM } },
10530 { Bad_Opcode },
10531 { Bad_Opcode },
10532 { "vmfunc", { Skip_MODRM } },
10533 { "xend", { Skip_MODRM } },
10534 { "xtest", { Skip_MODRM } },
10535 { Bad_Opcode },
10536 },
10537 {
10538 /* RM_0F01_REG_3 */
10539 { "vmrun", { Skip_MODRM } },
10540 { "vmmcall", { Skip_MODRM } },
10541 { "vmload", { Skip_MODRM } },
10542 { "vmsave", { Skip_MODRM } },
10543 { "stgi", { Skip_MODRM } },
10544 { "clgi", { Skip_MODRM } },
10545 { "skinit", { Skip_MODRM } },
10546 { "invlpga", { Skip_MODRM } },
10547 },
10548 {
10549 /* RM_0F01_REG_7 */
10550 { "swapgs", { Skip_MODRM } },
10551 { "rdtscp", { Skip_MODRM } },
10552 },
10553 {
10554 /* RM_0FAE_REG_5 */
10555 { "lfence", { Skip_MODRM } },
10556 },
10557 {
10558 /* RM_0FAE_REG_6 */
10559 { "mfence", { Skip_MODRM } },
10560 },
10561 {
10562 /* RM_0FAE_REG_7 */
10563 { "sfence", { Skip_MODRM } },
10564 },
10565 };
10566
10567 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
10568
10569 /* We use the high bit to indicate different name for the same
10570 prefix. */
10571 #define ADDR16_PREFIX (0x67 | 0x100)
10572 #define ADDR32_PREFIX (0x67 | 0x200)
10573 #define DATA16_PREFIX (0x66 | 0x100)
10574 #define DATA32_PREFIX (0x66 | 0x200)
10575 #define REP_PREFIX (0xf3 | 0x100)
10576 #define XACQUIRE_PREFIX (0xf2 | 0x200)
10577 #define XRELEASE_PREFIX (0xf3 | 0x400)
10578
10579 static int
10580 ckprefix (void)
10581 {
10582 int newrex, i, length;
10583 rex = 0;
10584 rex_ignored = 0;
10585 prefixes = 0;
10586 used_prefixes = 0;
10587 rex_used = 0;
10588 last_lock_prefix = -1;
10589 last_repz_prefix = -1;
10590 last_repnz_prefix = -1;
10591 last_data_prefix = -1;
10592 last_addr_prefix = -1;
10593 last_rex_prefix = -1;
10594 last_seg_prefix = -1;
10595 for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
10596 all_prefixes[i] = 0;
10597 i = 0;
10598 length = 0;
10599 /* The maximum instruction length is 15bytes. */
10600 while (length < MAX_CODE_LENGTH - 1)
10601 {
10602 FETCH_DATA (the_info, codep + 1);
10603 newrex = 0;
10604 switch (*codep)
10605 {
10606 /* REX prefixes family. */
10607 case 0x40:
10608 case 0x41:
10609 case 0x42:
10610 case 0x43:
10611 case 0x44:
10612 case 0x45:
10613 case 0x46:
10614 case 0x47:
10615 case 0x48:
10616 case 0x49:
10617 case 0x4a:
10618 case 0x4b:
10619 case 0x4c:
10620 case 0x4d:
10621 case 0x4e:
10622 case 0x4f:
10623 if (address_mode == mode_64bit)
10624 newrex = *codep;
10625 else
10626 return 1;
10627 last_rex_prefix = i;
10628 break;
10629 case 0xf3:
10630 prefixes |= PREFIX_REPZ;
10631 last_repz_prefix = i;
10632 break;
10633 case 0xf2:
10634 prefixes |= PREFIX_REPNZ;
10635 last_repnz_prefix = i;
10636 break;
10637 case 0xf0:
10638 prefixes |= PREFIX_LOCK;
10639 last_lock_prefix = i;
10640 break;
10641 case 0x2e:
10642 prefixes |= PREFIX_CS;
10643 last_seg_prefix = i;
10644 break;
10645 case 0x36:
10646 prefixes |= PREFIX_SS;
10647 last_seg_prefix = i;
10648 break;
10649 case 0x3e:
10650 prefixes |= PREFIX_DS;
10651 last_seg_prefix = i;
10652 break;
10653 case 0x26:
10654 prefixes |= PREFIX_ES;
10655 last_seg_prefix = i;
10656 break;
10657 case 0x64:
10658 prefixes |= PREFIX_FS;
10659 last_seg_prefix = i;
10660 break;
10661 case 0x65:
10662 prefixes |= PREFIX_GS;
10663 last_seg_prefix = i;
10664 break;
10665 case 0x66:
10666 prefixes |= PREFIX_DATA;
10667 last_data_prefix = i;
10668 break;
10669 case 0x67:
10670 prefixes |= PREFIX_ADDR;
10671 last_addr_prefix = i;
10672 break;
10673 case FWAIT_OPCODE:
10674 /* fwait is really an instruction. If there are prefixes
10675 before the fwait, they belong to the fwait, *not* to the
10676 following instruction. */
10677 if (prefixes || rex)
10678 {
10679 prefixes |= PREFIX_FWAIT;
10680 codep++;
10681 return 1;
10682 }
10683 prefixes = PREFIX_FWAIT;
10684 break;
10685 default:
10686 return 1;
10687 }
10688 /* Rex is ignored when followed by another prefix. */
10689 if (rex)
10690 {
10691 rex_used = rex;
10692 return 1;
10693 }
10694 if (*codep != FWAIT_OPCODE)
10695 all_prefixes[i++] = *codep;
10696 rex = newrex;
10697 codep++;
10698 length++;
10699 }
10700 return 0;
10701 }
10702
10703 static int
10704 seg_prefix (int pref)
10705 {
10706 switch (pref)
10707 {
10708 case 0x2e:
10709 return PREFIX_CS;
10710 case 0x36:
10711 return PREFIX_SS;
10712 case 0x3e:
10713 return PREFIX_DS;
10714 case 0x26:
10715 return PREFIX_ES;
10716 case 0x64:
10717 return PREFIX_FS;
10718 case 0x65:
10719 return PREFIX_GS;
10720 default:
10721 return 0;
10722 }
10723 }
10724
10725 /* Return the name of the prefix byte PREF, or NULL if PREF is not a
10726 prefix byte. */
10727
10728 static const char *
10729 prefix_name (int pref, int sizeflag)
10730 {
10731 static const char *rexes [16] =
10732 {
10733 "rex", /* 0x40 */
10734 "rex.B", /* 0x41 */
10735 "rex.X", /* 0x42 */
10736 "rex.XB", /* 0x43 */
10737 "rex.R", /* 0x44 */
10738 "rex.RB", /* 0x45 */
10739 "rex.RX", /* 0x46 */
10740 "rex.RXB", /* 0x47 */
10741 "rex.W", /* 0x48 */
10742 "rex.WB", /* 0x49 */
10743 "rex.WX", /* 0x4a */
10744 "rex.WXB", /* 0x4b */
10745 "rex.WR", /* 0x4c */
10746 "rex.WRB", /* 0x4d */
10747 "rex.WRX", /* 0x4e */
10748 "rex.WRXB", /* 0x4f */
10749 };
10750
10751 switch (pref)
10752 {
10753 /* REX prefixes family. */
10754 case 0x40:
10755 case 0x41:
10756 case 0x42:
10757 case 0x43:
10758 case 0x44:
10759 case 0x45:
10760 case 0x46:
10761 case 0x47:
10762 case 0x48:
10763 case 0x49:
10764 case 0x4a:
10765 case 0x4b:
10766 case 0x4c:
10767 case 0x4d:
10768 case 0x4e:
10769 case 0x4f:
10770 return rexes [pref - 0x40];
10771 case 0xf3:
10772 return "repz";
10773 case 0xf2:
10774 return "repnz";
10775 case 0xf0:
10776 return "lock";
10777 case 0x2e:
10778 return "cs";
10779 case 0x36:
10780 return "ss";
10781 case 0x3e:
10782 return "ds";
10783 case 0x26:
10784 return "es";
10785 case 0x64:
10786 return "fs";
10787 case 0x65:
10788 return "gs";
10789 case 0x66:
10790 return (sizeflag & DFLAG) ? "data16" : "data32";
10791 case 0x67:
10792 if (address_mode == mode_64bit)
10793 return (sizeflag & AFLAG) ? "addr32" : "addr64";
10794 else
10795 return (sizeflag & AFLAG) ? "addr16" : "addr32";
10796 case FWAIT_OPCODE:
10797 return "fwait";
10798 case ADDR16_PREFIX:
10799 return "addr16";
10800 case ADDR32_PREFIX:
10801 return "addr32";
10802 case DATA16_PREFIX:
10803 return "data16";
10804 case DATA32_PREFIX:
10805 return "data32";
10806 case REP_PREFIX:
10807 return "rep";
10808 case XACQUIRE_PREFIX:
10809 return "xacquire";
10810 case XRELEASE_PREFIX:
10811 return "xrelease";
10812 default:
10813 return NULL;
10814 }
10815 }
10816
10817 static char op_out[MAX_OPERANDS][100];
10818 static int op_ad, op_index[MAX_OPERANDS];
10819 static int two_source_ops;
10820 static bfd_vma op_address[MAX_OPERANDS];
10821 static bfd_vma op_riprel[MAX_OPERANDS];
10822 static bfd_vma start_pc;
10823
10824 /*
10825 * On the 386's of 1988, the maximum length of an instruction is 15 bytes.
10826 * (see topic "Redundant prefixes" in the "Differences from 8086"
10827 * section of the "Virtual 8086 Mode" chapter.)
10828 * 'pc' should be the address of this instruction, it will
10829 * be used to print the target address if this is a relative jump or call
10830 * The function returns the length of this instruction in bytes.
10831 */
10832
10833 static char intel_syntax;
10834 static char intel_mnemonic = !SYSV386_COMPAT;
10835 static char open_char;
10836 static char close_char;
10837 static char separator_char;
10838 static char scale_char;
10839
10840 /* Here for backwards compatibility. When gdb stops using
10841 print_insn_i386_att and print_insn_i386_intel these functions can
10842 disappear, and print_insn_i386 be merged into print_insn. */
10843 int
10844 print_insn_i386_att (bfd_vma pc, disassemble_info *info)
10845 {
10846 intel_syntax = 0;
10847
10848 return print_insn (pc, info);
10849 }
10850
10851 int
10852 print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
10853 {
10854 intel_syntax = 1;
10855
10856 return print_insn (pc, info);
10857 }
10858
10859 int
10860 print_insn_i386 (bfd_vma pc, disassemble_info *info)
10861 {
10862 intel_syntax = -1;
10863
10864 return print_insn (pc, info);
10865 }
10866
10867 void
10868 print_i386_disassembler_options (FILE *stream)
10869 {
10870 fprintf (stream, _("\n\
10871 The following i386/x86-64 specific disassembler options are supported for use\n\
10872 with the -M switch (multiple options should be separated by commas):\n"));
10873
10874 fprintf (stream, _(" x86-64 Disassemble in 64bit mode\n"));
10875 fprintf (stream, _(" i386 Disassemble in 32bit mode\n"));
10876 fprintf (stream, _(" i8086 Disassemble in 16bit mode\n"));
10877 fprintf (stream, _(" att Display instruction in AT&T syntax\n"));
10878 fprintf (stream, _(" intel Display instruction in Intel syntax\n"));
10879 fprintf (stream, _(" att-mnemonic\n"
10880 " Display instruction in AT&T mnemonic\n"));
10881 fprintf (stream, _(" intel-mnemonic\n"
10882 " Display instruction in Intel mnemonic\n"));
10883 fprintf (stream, _(" addr64 Assume 64bit address size\n"));
10884 fprintf (stream, _(" addr32 Assume 32bit address size\n"));
10885 fprintf (stream, _(" addr16 Assume 16bit address size\n"));
10886 fprintf (stream, _(" data32 Assume 32bit data size\n"));
10887 fprintf (stream, _(" data16 Assume 16bit data size\n"));
10888 fprintf (stream, _(" suffix Always display instruction suffix in AT&T syntax\n"));
10889 }
10890
10891 /* Bad opcode. */
10892 static const struct dis386 bad_opcode = { "(bad)", { XX } };
10893
10894 /* Get a pointer to struct dis386 with a valid name. */
10895
10896 static const struct dis386 *
10897 get_valid_dis386 (const struct dis386 *dp, disassemble_info *info)
10898 {
10899 int vindex, vex_table_index;
10900
10901 if (dp->name != NULL)
10902 return dp;
10903
10904 switch (dp->op[0].bytemode)
10905 {
10906 case USE_REG_TABLE:
10907 dp = &reg_table[dp->op[1].bytemode][modrm.reg];
10908 break;
10909
10910 case USE_MOD_TABLE:
10911 vindex = modrm.mod == 0x3 ? 1 : 0;
10912 dp = &mod_table[dp->op[1].bytemode][vindex];
10913 break;
10914
10915 case USE_RM_TABLE:
10916 dp = &rm_table[dp->op[1].bytemode][modrm.rm];
10917 break;
10918
10919 case USE_PREFIX_TABLE:
10920 if (need_vex)
10921 {
10922 /* The prefix in VEX is implicit. */
10923 switch (vex.prefix)
10924 {
10925 case 0:
10926 vindex = 0;
10927 break;
10928 case REPE_PREFIX_OPCODE:
10929 vindex = 1;
10930 break;
10931 case DATA_PREFIX_OPCODE:
10932 vindex = 2;
10933 break;
10934 case REPNE_PREFIX_OPCODE:
10935 vindex = 3;
10936 break;
10937 default:
10938 abort ();
10939 break;
10940 }
10941 }
10942 else
10943 {
10944 vindex = 0;
10945 used_prefixes |= (prefixes & PREFIX_REPZ);
10946 if (prefixes & PREFIX_REPZ)
10947 {
10948 vindex = 1;
10949 all_prefixes[last_repz_prefix] = 0;
10950 }
10951 else
10952 {
10953 /* We should check PREFIX_REPNZ and PREFIX_REPZ before
10954 PREFIX_DATA. */
10955 used_prefixes |= (prefixes & PREFIX_REPNZ);
10956 if (prefixes & PREFIX_REPNZ)
10957 {
10958 vindex = 3;
10959 all_prefixes[last_repnz_prefix] = 0;
10960 }
10961 else
10962 {
10963 used_prefixes |= (prefixes & PREFIX_DATA);
10964 if (prefixes & PREFIX_DATA)
10965 {
10966 vindex = 2;
10967 all_prefixes[last_data_prefix] = 0;
10968 }
10969 }
10970 }
10971 }
10972 dp = &prefix_table[dp->op[1].bytemode][vindex];
10973 break;
10974
10975 case USE_X86_64_TABLE:
10976 vindex = address_mode == mode_64bit ? 1 : 0;
10977 dp = &x86_64_table[dp->op[1].bytemode][vindex];
10978 break;
10979
10980 case USE_3BYTE_TABLE:
10981 FETCH_DATA (info, codep + 2);
10982 vindex = *codep++;
10983 dp = &three_byte_table[dp->op[1].bytemode][vindex];
10984 modrm.mod = (*codep >> 6) & 3;
10985 modrm.reg = (*codep >> 3) & 7;
10986 modrm.rm = *codep & 7;
10987 break;
10988
10989 case USE_VEX_LEN_TABLE:
10990 if (!need_vex)
10991 abort ();
10992
10993 switch (vex.length)
10994 {
10995 case 128:
10996 vindex = 0;
10997 break;
10998 case 256:
10999 vindex = 1;
11000 break;
11001 default:
11002 abort ();
11003 break;
11004 }
11005
11006 dp = &vex_len_table[dp->op[1].bytemode][vindex];
11007 break;
11008
11009 case USE_XOP_8F_TABLE:
11010 FETCH_DATA (info, codep + 3);
11011 /* All bits in the REX prefix are ignored. */
11012 rex_ignored = rex;
11013 rex = ~(*codep >> 5) & 0x7;
11014
11015 /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm". */
11016 switch ((*codep & 0x1f))
11017 {
11018 default:
11019 dp = &bad_opcode;
11020 return dp;
11021 case 0x8:
11022 vex_table_index = XOP_08;
11023 break;
11024 case 0x9:
11025 vex_table_index = XOP_09;
11026 break;
11027 case 0xa:
11028 vex_table_index = XOP_0A;
11029 break;
11030 }
11031 codep++;
11032 vex.w = *codep & 0x80;
11033 if (vex.w && address_mode == mode_64bit)
11034 rex |= REX_W;
11035
11036 vex.register_specifier = (~(*codep >> 3)) & 0xf;
11037 if (address_mode != mode_64bit
11038 && vex.register_specifier > 0x7)
11039 {
11040 dp = &bad_opcode;
11041 return dp;
11042 }
11043
11044 vex.length = (*codep & 0x4) ? 256 : 128;
11045 switch ((*codep & 0x3))
11046 {
11047 case 0:
11048 vex.prefix = 0;
11049 break;
11050 case 1:
11051 vex.prefix = DATA_PREFIX_OPCODE;
11052 break;
11053 case 2:
11054 vex.prefix = REPE_PREFIX_OPCODE;
11055 break;
11056 case 3:
11057 vex.prefix = REPNE_PREFIX_OPCODE;
11058 break;
11059 }
11060 need_vex = 1;
11061 need_vex_reg = 1;
11062 codep++;
11063 vindex = *codep++;
11064 dp = &xop_table[vex_table_index][vindex];
11065
11066 FETCH_DATA (info, codep + 1);
11067 modrm.mod = (*codep >> 6) & 3;
11068 modrm.reg = (*codep >> 3) & 7;
11069 modrm.rm = *codep & 7;
11070 break;
11071
11072 case USE_VEX_C4_TABLE:
11073 FETCH_DATA (info, codep + 3);
11074 /* All bits in the REX prefix are ignored. */
11075 rex_ignored = rex;
11076 rex = ~(*codep >> 5) & 0x7;
11077 switch ((*codep & 0x1f))
11078 {
11079 default:
11080 dp = &bad_opcode;
11081 return dp;
11082 case 0x1:
11083 vex_table_index = VEX_0F;
11084 break;
11085 case 0x2:
11086 vex_table_index = VEX_0F38;
11087 break;
11088 case 0x3:
11089 vex_table_index = VEX_0F3A;
11090 break;
11091 }
11092 codep++;
11093 vex.w = *codep & 0x80;
11094 if (vex.w && address_mode == mode_64bit)
11095 rex |= REX_W;
11096
11097 vex.register_specifier = (~(*codep >> 3)) & 0xf;
11098 if (address_mode != mode_64bit
11099 && vex.register_specifier > 0x7)
11100 {
11101 dp = &bad_opcode;
11102 return dp;
11103 }
11104
11105 vex.length = (*codep & 0x4) ? 256 : 128;
11106 switch ((*codep & 0x3))
11107 {
11108 case 0:
11109 vex.prefix = 0;
11110 break;
11111 case 1:
11112 vex.prefix = DATA_PREFIX_OPCODE;
11113 break;
11114 case 2:
11115 vex.prefix = REPE_PREFIX_OPCODE;
11116 break;
11117 case 3:
11118 vex.prefix = REPNE_PREFIX_OPCODE;
11119 break;
11120 }
11121 need_vex = 1;
11122 need_vex_reg = 1;
11123 codep++;
11124 vindex = *codep++;
11125 dp = &vex_table[vex_table_index][vindex];
11126 /* There is no MODRM byte for VEX [82|77]. */
11127 if (vindex != 0x77 && vindex != 0x82)
11128 {
11129 FETCH_DATA (info, codep + 1);
11130 modrm.mod = (*codep >> 6) & 3;
11131 modrm.reg = (*codep >> 3) & 7;
11132 modrm.rm = *codep & 7;
11133 }
11134 break;
11135
11136 case USE_VEX_C5_TABLE:
11137 FETCH_DATA (info, codep + 2);
11138 /* All bits in the REX prefix are ignored. */
11139 rex_ignored = rex;
11140 rex = (*codep & 0x80) ? 0 : REX_R;
11141
11142 vex.register_specifier = (~(*codep >> 3)) & 0xf;
11143 if (address_mode != mode_64bit
11144 && vex.register_specifier > 0x7)
11145 {
11146 dp = &bad_opcode;
11147 return dp;
11148 }
11149
11150 vex.w = 0;
11151
11152 vex.length = (*codep & 0x4) ? 256 : 128;
11153 switch ((*codep & 0x3))
11154 {
11155 case 0:
11156 vex.prefix = 0;
11157 break;
11158 case 1:
11159 vex.prefix = DATA_PREFIX_OPCODE;
11160 break;
11161 case 2:
11162 vex.prefix = REPE_PREFIX_OPCODE;
11163 break;
11164 case 3:
11165 vex.prefix = REPNE_PREFIX_OPCODE;
11166 break;
11167 }
11168 need_vex = 1;
11169 need_vex_reg = 1;
11170 codep++;
11171 vindex = *codep++;
11172 dp = &vex_table[dp->op[1].bytemode][vindex];
11173 /* There is no MODRM byte for VEX [82|77]. */
11174 if (vindex != 0x77 && vindex != 0x82)
11175 {
11176 FETCH_DATA (info, codep + 1);
11177 modrm.mod = (*codep >> 6) & 3;
11178 modrm.reg = (*codep >> 3) & 7;
11179 modrm.rm = *codep & 7;
11180 }
11181 break;
11182
11183 case USE_VEX_W_TABLE:
11184 if (!need_vex)
11185 abort ();
11186
11187 dp = &vex_w_table[dp->op[1].bytemode][vex.w ? 1 : 0];
11188 break;
11189
11190 case 0:
11191 dp = &bad_opcode;
11192 break;
11193
11194 default:
11195 abort ();
11196 }
11197
11198 if (dp->name != NULL)
11199 return dp;
11200 else
11201 return get_valid_dis386 (dp, info);
11202 }
11203
11204 static void
11205 get_sib (disassemble_info *info)
11206 {
11207 /* If modrm.mod == 3, operand must be register. */
11208 if (need_modrm
11209 && address_mode != mode_16bit
11210 && modrm.mod != 3
11211 && modrm.rm == 4)
11212 {
11213 FETCH_DATA (info, codep + 2);
11214 sib.index = (codep [1] >> 3) & 7;
11215 sib.scale = (codep [1] >> 6) & 3;
11216 sib.base = codep [1] & 7;
11217 }
11218 }
11219
11220 static int
11221 print_insn (bfd_vma pc, disassemble_info *info)
11222 {
11223 const struct dis386 *dp;
11224 int i;
11225 char *op_txt[MAX_OPERANDS];
11226 int needcomma;
11227 int sizeflag;
11228 const char *p;
11229 struct dis_private priv;
11230 int prefix_length;
11231 int default_prefixes;
11232
11233 priv.orig_sizeflag = AFLAG | DFLAG;
11234 if ((info->mach & bfd_mach_i386_i386) != 0)
11235 address_mode = mode_32bit;
11236 else if (info->mach == bfd_mach_i386_i8086)
11237 {
11238 address_mode = mode_16bit;
11239 priv.orig_sizeflag = 0;
11240 }
11241 else
11242 address_mode = mode_64bit;
11243
11244 if (intel_syntax == (char) -1)
11245 intel_syntax = (info->mach & bfd_mach_i386_intel_syntax) != 0;
11246
11247 for (p = info->disassembler_options; p != NULL; )
11248 {
11249 if (CONST_STRNEQ (p, "x86-64"))
11250 {
11251 address_mode = mode_64bit;
11252 priv.orig_sizeflag = AFLAG | DFLAG;
11253 }
11254 else if (CONST_STRNEQ (p, "i386"))
11255 {
11256 address_mode = mode_32bit;
11257 priv.orig_sizeflag = AFLAG | DFLAG;
11258 }
11259 else if (CONST_STRNEQ (p, "i8086"))
11260 {
11261 address_mode = mode_16bit;
11262 priv.orig_sizeflag = 0;
11263 }
11264 else if (CONST_STRNEQ (p, "intel"))
11265 {
11266 intel_syntax = 1;
11267 if (CONST_STRNEQ (p + 5, "-mnemonic"))
11268 intel_mnemonic = 1;
11269 }
11270 else if (CONST_STRNEQ (p, "att"))
11271 {
11272 intel_syntax = 0;
11273 if (CONST_STRNEQ (p + 3, "-mnemonic"))
11274 intel_mnemonic = 0;
11275 }
11276 else if (CONST_STRNEQ (p, "addr"))
11277 {
11278 if (address_mode == mode_64bit)
11279 {
11280 if (p[4] == '3' && p[5] == '2')
11281 priv.orig_sizeflag &= ~AFLAG;
11282 else if (p[4] == '6' && p[5] == '4')
11283 priv.orig_sizeflag |= AFLAG;
11284 }
11285 else
11286 {
11287 if (p[4] == '1' && p[5] == '6')
11288 priv.orig_sizeflag &= ~AFLAG;
11289 else if (p[4] == '3' && p[5] == '2')
11290 priv.orig_sizeflag |= AFLAG;
11291 }
11292 }
11293 else if (CONST_STRNEQ (p, "data"))
11294 {
11295 if (p[4] == '1' && p[5] == '6')
11296 priv.orig_sizeflag &= ~DFLAG;
11297 else if (p[4] == '3' && p[5] == '2')
11298 priv.orig_sizeflag |= DFLAG;
11299 }
11300 else if (CONST_STRNEQ (p, "suffix"))
11301 priv.orig_sizeflag |= SUFFIX_ALWAYS;
11302
11303 p = strchr (p, ',');
11304 if (p != NULL)
11305 p++;
11306 }
11307
11308 if (intel_syntax)
11309 {
11310 names64 = intel_names64;
11311 names32 = intel_names32;
11312 names16 = intel_names16;
11313 names8 = intel_names8;
11314 names8rex = intel_names8rex;
11315 names_seg = intel_names_seg;
11316 names_mm = intel_names_mm;
11317 names_xmm = intel_names_xmm;
11318 names_ymm = intel_names_ymm;
11319 index64 = intel_index64;
11320 index32 = intel_index32;
11321 index16 = intel_index16;
11322 open_char = '[';
11323 close_char = ']';
11324 separator_char = '+';
11325 scale_char = '*';
11326 }
11327 else
11328 {
11329 names64 = att_names64;
11330 names32 = att_names32;
11331 names16 = att_names16;
11332 names8 = att_names8;
11333 names8rex = att_names8rex;
11334 names_seg = att_names_seg;
11335 names_mm = att_names_mm;
11336 names_xmm = att_names_xmm;
11337 names_ymm = att_names_ymm;
11338 index64 = att_index64;
11339 index32 = att_index32;
11340 index16 = att_index16;
11341 open_char = '(';
11342 close_char = ')';
11343 separator_char = ',';
11344 scale_char = ',';
11345 }
11346
11347 /* The output looks better if we put 7 bytes on a line, since that
11348 puts most long word instructions on a single line. Use 8 bytes
11349 for Intel L1OM. */
11350 if ((info->mach & bfd_mach_l1om) != 0)
11351 info->bytes_per_line = 8;
11352 else
11353 info->bytes_per_line = 7;
11354
11355 info->private_data = &priv;
11356 priv.max_fetched = priv.the_buffer;
11357 priv.insn_start = pc;
11358
11359 obuf[0] = 0;
11360 for (i = 0; i < MAX_OPERANDS; ++i)
11361 {
11362 op_out[i][0] = 0;
11363 op_index[i] = -1;
11364 }
11365
11366 the_info = info;
11367 start_pc = pc;
11368 start_codep = priv.the_buffer;
11369 codep = priv.the_buffer;
11370
11371 if (setjmp (priv.bailout) != 0)
11372 {
11373 const char *name;
11374
11375 /* Getting here means we tried for data but didn't get it. That
11376 means we have an incomplete instruction of some sort. Just
11377 print the first byte as a prefix or a .byte pseudo-op. */
11378 if (codep > priv.the_buffer)
11379 {
11380 name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
11381 if (name != NULL)
11382 (*info->fprintf_func) (info->stream, "%s", name);
11383 else
11384 {
11385 /* Just print the first byte as a .byte instruction. */
11386 (*info->fprintf_func) (info->stream, ".byte 0x%x",
11387 (unsigned int) priv.the_buffer[0]);
11388 }
11389
11390 return 1;
11391 }
11392
11393 return -1;
11394 }
11395
11396 obufp = obuf;
11397 sizeflag = priv.orig_sizeflag;
11398
11399 if (!ckprefix () || rex_used)
11400 {
11401 /* Too many prefixes or unused REX prefixes. */
11402 for (i = 0;
11403 i < (int) ARRAY_SIZE (all_prefixes) && all_prefixes[i];
11404 i++)
11405 (*info->fprintf_func) (info->stream, "%s",
11406 prefix_name (all_prefixes[i], sizeflag));
11407 return 1;
11408 }
11409
11410 insn_codep = codep;
11411
11412 FETCH_DATA (info, codep + 1);
11413 two_source_ops = (*codep == 0x62) || (*codep == 0xc8);
11414
11415 if (((prefixes & PREFIX_FWAIT)
11416 && ((*codep < 0xd8) || (*codep > 0xdf))))
11417 {
11418 (*info->fprintf_func) (info->stream, "fwait");
11419 return 1;
11420 }
11421
11422 if (*codep == 0x0f)
11423 {
11424 unsigned char threebyte;
11425 FETCH_DATA (info, codep + 2);
11426 threebyte = *++codep;
11427 dp = &dis386_twobyte[threebyte];
11428 need_modrm = twobyte_has_modrm[*codep];
11429 codep++;
11430 }
11431 else
11432 {
11433 dp = &dis386[*codep];
11434 need_modrm = onebyte_has_modrm[*codep];
11435 codep++;
11436 }
11437
11438 if ((prefixes & PREFIX_REPZ))
11439 used_prefixes |= PREFIX_REPZ;
11440 if ((prefixes & PREFIX_REPNZ))
11441 used_prefixes |= PREFIX_REPNZ;
11442 if ((prefixes & PREFIX_LOCK))
11443 used_prefixes |= PREFIX_LOCK;
11444
11445 default_prefixes = 0;
11446 if (prefixes & PREFIX_ADDR)
11447 {
11448 sizeflag ^= AFLAG;
11449 if (dp->op[2].bytemode != loop_jcxz_mode || intel_syntax)
11450 {
11451 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
11452 all_prefixes[last_addr_prefix] = ADDR32_PREFIX;
11453 else
11454 all_prefixes[last_addr_prefix] = ADDR16_PREFIX;
11455 default_prefixes |= PREFIX_ADDR;
11456 }
11457 }
11458
11459 if ((prefixes & PREFIX_DATA))
11460 {
11461 sizeflag ^= DFLAG;
11462 if (dp->op[2].bytemode == cond_jump_mode
11463 && dp->op[0].bytemode == v_mode
11464 && !intel_syntax)
11465 {
11466 if (sizeflag & DFLAG)
11467 all_prefixes[last_data_prefix] = DATA32_PREFIX;
11468 else
11469 all_prefixes[last_data_prefix] = DATA16_PREFIX;
11470 default_prefixes |= PREFIX_DATA;
11471 }
11472 else if (rex & REX_W)
11473 {
11474 /* REX_W will override PREFIX_DATA. */
11475 default_prefixes |= PREFIX_DATA;
11476 }
11477 }
11478
11479 if (need_modrm)
11480 {
11481 FETCH_DATA (info, codep + 1);
11482 modrm.mod = (*codep >> 6) & 3;
11483 modrm.reg = (*codep >> 3) & 7;
11484 modrm.rm = *codep & 7;
11485 }
11486
11487 need_vex = 0;
11488 need_vex_reg = 0;
11489 vex_w_done = 0;
11490
11491 if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
11492 {
11493 get_sib (info);
11494 dofloat (sizeflag);
11495 }
11496 else
11497 {
11498 dp = get_valid_dis386 (dp, info);
11499 if (dp != NULL && putop (dp->name, sizeflag) == 0)
11500 {
11501 get_sib (info);
11502 for (i = 0; i < MAX_OPERANDS; ++i)
11503 {
11504 obufp = op_out[i];
11505 op_ad = MAX_OPERANDS - 1 - i;
11506 if (dp->op[i].rtn)
11507 (*dp->op[i].rtn) (dp->op[i].bytemode, sizeflag);
11508 }
11509 }
11510 }
11511
11512 /* See if any prefixes were not used. If so, print the first one
11513 separately. If we don't do this, we'll wind up printing an
11514 instruction stream which does not precisely correspond to the
11515 bytes we are disassembling. */
11516 if ((prefixes & ~(used_prefixes | default_prefixes)) != 0)
11517 {
11518 for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
11519 if (all_prefixes[i])
11520 {
11521 const char *name;
11522 name = prefix_name (all_prefixes[i], priv.orig_sizeflag);
11523 if (name == NULL)
11524 name = INTERNAL_DISASSEMBLER_ERROR;
11525 (*info->fprintf_func) (info->stream, "%s", name);
11526 return 1;
11527 }
11528 }
11529
11530 /* Check if the REX prefix is used. */
11531 if (rex_ignored == 0 && (rex ^ rex_used) == 0)
11532 all_prefixes[last_rex_prefix] = 0;
11533
11534 /* Check if the SEG prefix is used. */
11535 if ((prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS | PREFIX_ES
11536 | PREFIX_FS | PREFIX_GS)) != 0
11537 && (used_prefixes
11538 & seg_prefix (all_prefixes[last_seg_prefix])) != 0)
11539 all_prefixes[last_seg_prefix] = 0;
11540
11541 /* Check if the ADDR prefix is used. */
11542 if ((prefixes & PREFIX_ADDR) != 0
11543 && (used_prefixes & PREFIX_ADDR) != 0)
11544 all_prefixes[last_addr_prefix] = 0;
11545
11546 /* Check if the DATA prefix is used. */
11547 if ((prefixes & PREFIX_DATA) != 0
11548 && (used_prefixes & PREFIX_DATA) != 0)
11549 all_prefixes[last_data_prefix] = 0;
11550
11551 prefix_length = 0;
11552 for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
11553 if (all_prefixes[i])
11554 {
11555 const char *name;
11556 name = prefix_name (all_prefixes[i], sizeflag);
11557 if (name == NULL)
11558 abort ();
11559 prefix_length += strlen (name) + 1;
11560 (*info->fprintf_func) (info->stream, "%s ", name);
11561 }
11562
11563 /* Check maximum code length. */
11564 if ((codep - start_codep) > MAX_CODE_LENGTH)
11565 {
11566 (*info->fprintf_func) (info->stream, "(bad)");
11567 return MAX_CODE_LENGTH;
11568 }
11569
11570 obufp = mnemonicendp;
11571 for (i = strlen (obuf) + prefix_length; i < 6; i++)
11572 oappend (" ");
11573 oappend (" ");
11574 (*info->fprintf_func) (info->stream, "%s", obuf);
11575
11576 /* The enter and bound instructions are printed with operands in the same
11577 order as the intel book; everything else is printed in reverse order. */
11578 if (intel_syntax || two_source_ops)
11579 {
11580 bfd_vma riprel;
11581
11582 for (i = 0; i < MAX_OPERANDS; ++i)
11583 op_txt[i] = op_out[i];
11584
11585 for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
11586 {
11587 op_ad = op_index[i];
11588 op_index[i] = op_index[MAX_OPERANDS - 1 - i];
11589 op_index[MAX_OPERANDS - 1 - i] = op_ad;
11590 riprel = op_riprel[i];
11591 op_riprel[i] = op_riprel [MAX_OPERANDS - 1 - i];
11592 op_riprel[MAX_OPERANDS - 1 - i] = riprel;
11593 }
11594 }
11595 else
11596 {
11597 for (i = 0; i < MAX_OPERANDS; ++i)
11598 op_txt[MAX_OPERANDS - 1 - i] = op_out[i];
11599 }
11600
11601 needcomma = 0;
11602 for (i = 0; i < MAX_OPERANDS; ++i)
11603 if (*op_txt[i])
11604 {
11605 if (needcomma)
11606 (*info->fprintf_func) (info->stream, ",");
11607 if (op_index[i] != -1 && !op_riprel[i])
11608 (*info->print_address_func) ((bfd_vma) op_address[op_index[i]], info);
11609 else
11610 (*info->fprintf_func) (info->stream, "%s", op_txt[i]);
11611 needcomma = 1;
11612 }
11613
11614 for (i = 0; i < MAX_OPERANDS; i++)
11615 if (op_index[i] != -1 && op_riprel[i])
11616 {
11617 (*info->fprintf_func) (info->stream, " # ");
11618 (*info->print_address_func) ((bfd_vma) (start_pc + codep - start_codep
11619 + op_address[op_index[i]]), info);
11620 break;
11621 }
11622 return codep - priv.the_buffer;
11623 }
11624
11625 static const char *float_mem[] = {
11626 /* d8 */
11627 "fadd{s|}",
11628 "fmul{s|}",
11629 "fcom{s|}",
11630 "fcomp{s|}",
11631 "fsub{s|}",
11632 "fsubr{s|}",
11633 "fdiv{s|}",
11634 "fdivr{s|}",
11635 /* d9 */
11636 "fld{s|}",
11637 "(bad)",
11638 "fst{s|}",
11639 "fstp{s|}",
11640 "fldenvIC",
11641 "fldcw",
11642 "fNstenvIC",
11643 "fNstcw",
11644 /* da */
11645 "fiadd{l|}",
11646 "fimul{l|}",
11647 "ficom{l|}",
11648 "ficomp{l|}",
11649 "fisub{l|}",
11650 "fisubr{l|}",
11651 "fidiv{l|}",
11652 "fidivr{l|}",
11653 /* db */
11654 "fild{l|}",
11655 "fisttp{l|}",
11656 "fist{l|}",
11657 "fistp{l|}",
11658 "(bad)",
11659 "fld{t||t|}",
11660 "(bad)",
11661 "fstp{t||t|}",
11662 /* dc */
11663 "fadd{l|}",
11664 "fmul{l|}",
11665 "fcom{l|}",
11666 "fcomp{l|}",
11667 "fsub{l|}",
11668 "fsubr{l|}",
11669 "fdiv{l|}",
11670 "fdivr{l|}",
11671 /* dd */
11672 "fld{l|}",
11673 "fisttp{ll|}",
11674 "fst{l||}",
11675 "fstp{l|}",
11676 "frstorIC",
11677 "(bad)",
11678 "fNsaveIC",
11679 "fNstsw",
11680 /* de */
11681 "fiadd",
11682 "fimul",
11683 "ficom",
11684 "ficomp",
11685 "fisub",
11686 "fisubr",
11687 "fidiv",
11688 "fidivr",
11689 /* df */
11690 "fild",
11691 "fisttp",
11692 "fist",
11693 "fistp",
11694 "fbld",
11695 "fild{ll|}",
11696 "fbstp",
11697 "fistp{ll|}",
11698 };
11699
11700 static const unsigned char float_mem_mode[] = {
11701 /* d8 */
11702 d_mode,
11703 d_mode,
11704 d_mode,
11705 d_mode,
11706 d_mode,
11707 d_mode,
11708 d_mode,
11709 d_mode,
11710 /* d9 */
11711 d_mode,
11712 0,
11713 d_mode,
11714 d_mode,
11715 0,
11716 w_mode,
11717 0,
11718 w_mode,
11719 /* da */
11720 d_mode,
11721 d_mode,
11722 d_mode,
11723 d_mode,
11724 d_mode,
11725 d_mode,
11726 d_mode,
11727 d_mode,
11728 /* db */
11729 d_mode,
11730 d_mode,
11731 d_mode,
11732 d_mode,
11733 0,
11734 t_mode,
11735 0,
11736 t_mode,
11737 /* dc */
11738 q_mode,
11739 q_mode,
11740 q_mode,
11741 q_mode,
11742 q_mode,
11743 q_mode,
11744 q_mode,
11745 q_mode,
11746 /* dd */
11747 q_mode,
11748 q_mode,
11749 q_mode,
11750 q_mode,
11751 0,
11752 0,
11753 0,
11754 w_mode,
11755 /* de */
11756 w_mode,
11757 w_mode,
11758 w_mode,
11759 w_mode,
11760 w_mode,
11761 w_mode,
11762 w_mode,
11763 w_mode,
11764 /* df */
11765 w_mode,
11766 w_mode,
11767 w_mode,
11768 w_mode,
11769 t_mode,
11770 q_mode,
11771 t_mode,
11772 q_mode
11773 };
11774
11775 #define ST { OP_ST, 0 }
11776 #define STi { OP_STi, 0 }
11777
11778 #define FGRPd9_2 NULL, { { NULL, 0 } }
11779 #define FGRPd9_4 NULL, { { NULL, 1 } }
11780 #define FGRPd9_5 NULL, { { NULL, 2 } }
11781 #define FGRPd9_6 NULL, { { NULL, 3 } }
11782 #define FGRPd9_7 NULL, { { NULL, 4 } }
11783 #define FGRPda_5 NULL, { { NULL, 5 } }
11784 #define FGRPdb_4 NULL, { { NULL, 6 } }
11785 #define FGRPde_3 NULL, { { NULL, 7 } }
11786 #define FGRPdf_4 NULL, { { NULL, 8 } }
11787
11788 static const struct dis386 float_reg[][8] = {
11789 /* d8 */
11790 {
11791 { "fadd", { ST, STi } },
11792 { "fmul", { ST, STi } },
11793 { "fcom", { STi } },
11794 { "fcomp", { STi } },
11795 { "fsub", { ST, STi } },
11796 { "fsubr", { ST, STi } },
11797 { "fdiv", { ST, STi } },
11798 { "fdivr", { ST, STi } },
11799 },
11800 /* d9 */
11801 {
11802 { "fld", { STi } },
11803 { "fxch", { STi } },
11804 { FGRPd9_2 },
11805 { Bad_Opcode },
11806 { FGRPd9_4 },
11807 { FGRPd9_5 },
11808 { FGRPd9_6 },
11809 { FGRPd9_7 },
11810 },
11811 /* da */
11812 {
11813 { "fcmovb", { ST, STi } },
11814 { "fcmove", { ST, STi } },
11815 { "fcmovbe",{ ST, STi } },
11816 { "fcmovu", { ST, STi } },
11817 { Bad_Opcode },
11818 { FGRPda_5 },
11819 { Bad_Opcode },
11820 { Bad_Opcode },
11821 },
11822 /* db */
11823 {
11824 { "fcmovnb",{ ST, STi } },
11825 { "fcmovne",{ ST, STi } },
11826 { "fcmovnbe",{ ST, STi } },
11827 { "fcmovnu",{ ST, STi } },
11828 { FGRPdb_4 },
11829 { "fucomi", { ST, STi } },
11830 { "fcomi", { ST, STi } },
11831 { Bad_Opcode },
11832 },
11833 /* dc */
11834 {
11835 { "fadd", { STi, ST } },
11836 { "fmul", { STi, ST } },
11837 { Bad_Opcode },
11838 { Bad_Opcode },
11839 { "fsub!M", { STi, ST } },
11840 { "fsubM", { STi, ST } },
11841 { "fdiv!M", { STi, ST } },
11842 { "fdivM", { STi, ST } },
11843 },
11844 /* dd */
11845 {
11846 { "ffree", { STi } },
11847 { Bad_Opcode },
11848 { "fst", { STi } },
11849 { "fstp", { STi } },
11850 { "fucom", { STi } },
11851 { "fucomp", { STi } },
11852 { Bad_Opcode },
11853 { Bad_Opcode },
11854 },
11855 /* de */
11856 {
11857 { "faddp", { STi, ST } },
11858 { "fmulp", { STi, ST } },
11859 { Bad_Opcode },
11860 { FGRPde_3 },
11861 { "fsub!Mp", { STi, ST } },
11862 { "fsubMp", { STi, ST } },
11863 { "fdiv!Mp", { STi, ST } },
11864 { "fdivMp", { STi, ST } },
11865 },
11866 /* df */
11867 {
11868 { "ffreep", { STi } },
11869 { Bad_Opcode },
11870 { Bad_Opcode },
11871 { Bad_Opcode },
11872 { FGRPdf_4 },
11873 { "fucomip", { ST, STi } },
11874 { "fcomip", { ST, STi } },
11875 { Bad_Opcode },
11876 },
11877 };
11878
11879 static char *fgrps[][8] = {
11880 /* d9_2 0 */
11881 {
11882 "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
11883 },
11884
11885 /* d9_4 1 */
11886 {
11887 "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
11888 },
11889
11890 /* d9_5 2 */
11891 {
11892 "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
11893 },
11894
11895 /* d9_6 3 */
11896 {
11897 "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
11898 },
11899
11900 /* d9_7 4 */
11901 {
11902 "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
11903 },
11904
11905 /* da_5 5 */
11906 {
11907 "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
11908 },
11909
11910 /* db_4 6 */
11911 {
11912 "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
11913 "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
11914 },
11915
11916 /* de_3 7 */
11917 {
11918 "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
11919 },
11920
11921 /* df_4 8 */
11922 {
11923 "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
11924 },
11925 };
11926
11927 static void
11928 swap_operand (void)
11929 {
11930 mnemonicendp[0] = '.';
11931 mnemonicendp[1] = 's';
11932 mnemonicendp += 2;
11933 }
11934
11935 static void
11936 OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED,
11937 int sizeflag ATTRIBUTE_UNUSED)
11938 {
11939 /* Skip mod/rm byte. */
11940 MODRM_CHECK;
11941 codep++;
11942 }
11943
11944 static void
11945 dofloat (int sizeflag)
11946 {
11947 const struct dis386 *dp;
11948 unsigned char floatop;
11949
11950 floatop = codep[-1];
11951
11952 if (modrm.mod != 3)
11953 {
11954 int fp_indx = (floatop - 0xd8) * 8 + modrm.reg;
11955
11956 putop (float_mem[fp_indx], sizeflag);
11957 obufp = op_out[0];
11958 op_ad = 2;
11959 OP_E (float_mem_mode[fp_indx], sizeflag);
11960 return;
11961 }
11962 /* Skip mod/rm byte. */
11963 MODRM_CHECK;
11964 codep++;
11965
11966 dp = &float_reg[floatop - 0xd8][modrm.reg];
11967 if (dp->name == NULL)
11968 {
11969 putop (fgrps[dp->op[0].bytemode][modrm.rm], sizeflag);
11970
11971 /* Instruction fnstsw is only one with strange arg. */
11972 if (floatop == 0xdf && codep[-1] == 0xe0)
11973 strcpy (op_out[0], names16[0]);
11974 }
11975 else
11976 {
11977 putop (dp->name, sizeflag);
11978
11979 obufp = op_out[0];
11980 op_ad = 2;
11981 if (dp->op[0].rtn)
11982 (*dp->op[0].rtn) (dp->op[0].bytemode, sizeflag);
11983
11984 obufp = op_out[1];
11985 op_ad = 1;
11986 if (dp->op[1].rtn)
11987 (*dp->op[1].rtn) (dp->op[1].bytemode, sizeflag);
11988 }
11989 }
11990
11991 static void
11992 OP_ST (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
11993 {
11994 oappend ("%st" + intel_syntax);
11995 }
11996
11997 static void
11998 OP_STi (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
11999 {
12000 sprintf (scratchbuf, "%%st(%d)", modrm.rm);
12001 oappend (scratchbuf + intel_syntax);
12002 }
12003
12004 /* Capital letters in template are macros. */
12005 static int
12006 putop (const char *in_template, int sizeflag)
12007 {
12008 const char *p;
12009 int alt = 0;
12010 int cond = 1;
12011 unsigned int l = 0, len = 1;
12012 char last[4];
12013
12014 #define SAVE_LAST(c) \
12015 if (l < len && l < sizeof (last)) \
12016 last[l++] = c; \
12017 else \
12018 abort ();
12019
12020 for (p = in_template; *p; p++)
12021 {
12022 switch (*p)
12023 {
12024 default:
12025 *obufp++ = *p;
12026 break;
12027 case '%':
12028 len++;
12029 break;
12030 case '!':
12031 cond = 0;
12032 break;
12033 case '{':
12034 alt = 0;
12035 if (intel_syntax)
12036 {
12037 while (*++p != '|')
12038 if (*p == '}' || *p == '\0')
12039 abort ();
12040 }
12041 /* Fall through. */
12042 case 'I':
12043 alt = 1;
12044 continue;
12045 case '|':
12046 while (*++p != '}')
12047 {
12048 if (*p == '\0')
12049 abort ();
12050 }
12051 break;
12052 case '}':
12053 break;
12054 case 'A':
12055 if (intel_syntax)
12056 break;
12057 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
12058 *obufp++ = 'b';
12059 break;
12060 case 'B':
12061 if (l == 0 && len == 1)
12062 {
12063 case_B:
12064 if (intel_syntax)
12065 break;
12066 if (sizeflag & SUFFIX_ALWAYS)
12067 *obufp++ = 'b';
12068 }
12069 else
12070 {
12071 if (l != 1
12072 || len != 2
12073 || last[0] != 'L')
12074 {
12075 SAVE_LAST (*p);
12076 break;
12077 }
12078
12079 if (address_mode == mode_64bit
12080 && !(prefixes & PREFIX_ADDR))
12081 {
12082 *obufp++ = 'a';
12083 *obufp++ = 'b';
12084 *obufp++ = 's';
12085 }
12086
12087 goto case_B;
12088 }
12089 break;
12090 case 'C':
12091 if (intel_syntax && !alt)
12092 break;
12093 if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
12094 {
12095 if (sizeflag & DFLAG)
12096 *obufp++ = intel_syntax ? 'd' : 'l';
12097 else
12098 *obufp++ = intel_syntax ? 'w' : 's';
12099 used_prefixes |= (prefixes & PREFIX_DATA);
12100 }
12101 break;
12102 case 'D':
12103 if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
12104 break;
12105 USED_REX (REX_W);
12106 if (modrm.mod == 3)
12107 {
12108 if (rex & REX_W)
12109 *obufp++ = 'q';
12110 else
12111 {
12112 if (sizeflag & DFLAG)
12113 *obufp++ = intel_syntax ? 'd' : 'l';
12114 else
12115 *obufp++ = 'w';
12116 used_prefixes |= (prefixes & PREFIX_DATA);
12117 }
12118 }
12119 else
12120 *obufp++ = 'w';
12121 break;
12122 case 'E': /* For jcxz/jecxz */
12123 if (address_mode == mode_64bit)
12124 {
12125 if (sizeflag & AFLAG)
12126 *obufp++ = 'r';
12127 else
12128 *obufp++ = 'e';
12129 }
12130 else
12131 if (sizeflag & AFLAG)
12132 *obufp++ = 'e';
12133 used_prefixes |= (prefixes & PREFIX_ADDR);
12134 break;
12135 case 'F':
12136 if (intel_syntax)
12137 break;
12138 if ((prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
12139 {
12140 if (sizeflag & AFLAG)
12141 *obufp++ = address_mode == mode_64bit ? 'q' : 'l';
12142 else
12143 *obufp++ = address_mode == mode_64bit ? 'l' : 'w';
12144 used_prefixes |= (prefixes & PREFIX_ADDR);
12145 }
12146 break;
12147 case 'G':
12148 if (intel_syntax || (obufp[-1] != 's' && !(sizeflag & SUFFIX_ALWAYS)))
12149 break;
12150 if ((rex & REX_W) || (sizeflag & DFLAG))
12151 *obufp++ = 'l';
12152 else
12153 *obufp++ = 'w';
12154 if (!(rex & REX_W))
12155 used_prefixes |= (prefixes & PREFIX_DATA);
12156 break;
12157 case 'H':
12158 if (intel_syntax)
12159 break;
12160 if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
12161 || (prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
12162 {
12163 used_prefixes |= prefixes & (PREFIX_CS | PREFIX_DS);
12164 *obufp++ = ',';
12165 *obufp++ = 'p';
12166 if (prefixes & PREFIX_DS)
12167 *obufp++ = 't';
12168 else
12169 *obufp++ = 'n';
12170 }
12171 break;
12172 case 'J':
12173 if (intel_syntax)
12174 break;
12175 *obufp++ = 'l';
12176 break;
12177 case 'K':
12178 USED_REX (REX_W);
12179 if (rex & REX_W)
12180 *obufp++ = 'q';
12181 else
12182 *obufp++ = 'd';
12183 break;
12184 case 'Z':
12185 if (intel_syntax)
12186 break;
12187 if (address_mode == mode_64bit && (sizeflag & SUFFIX_ALWAYS))
12188 {
12189 *obufp++ = 'q';
12190 break;
12191 }
12192 /* Fall through. */
12193 goto case_L;
12194 case 'L':
12195 if (l != 0 || len != 1)
12196 {
12197 SAVE_LAST (*p);
12198 break;
12199 }
12200 case_L:
12201 if (intel_syntax)
12202 break;
12203 if (sizeflag & SUFFIX_ALWAYS)
12204 *obufp++ = 'l';
12205 break;
12206 case 'M':
12207 if (intel_mnemonic != cond)
12208 *obufp++ = 'r';
12209 break;
12210 case 'N':
12211 if ((prefixes & PREFIX_FWAIT) == 0)
12212 *obufp++ = 'n';
12213 else
12214 used_prefixes |= PREFIX_FWAIT;
12215 break;
12216 case 'O':
12217 USED_REX (REX_W);
12218 if (rex & REX_W)
12219 *obufp++ = 'o';
12220 else if (intel_syntax && (sizeflag & DFLAG))
12221 *obufp++ = 'q';
12222 else
12223 *obufp++ = 'd';
12224 if (!(rex & REX_W))
12225 used_prefixes |= (prefixes & PREFIX_DATA);
12226 break;
12227 case 'T':
12228 if (!intel_syntax
12229 && address_mode == mode_64bit
12230 && (sizeflag & DFLAG))
12231 {
12232 *obufp++ = 'q';
12233 break;
12234 }
12235 /* Fall through. */
12236 case 'P':
12237 if (intel_syntax)
12238 {
12239 if ((rex & REX_W) == 0
12240 && (prefixes & PREFIX_DATA))
12241 {
12242 if ((sizeflag & DFLAG) == 0)
12243 *obufp++ = 'w';
12244 used_prefixes |= (prefixes & PREFIX_DATA);
12245 }
12246 break;
12247 }
12248 if ((prefixes & PREFIX_DATA)
12249 || (rex & REX_W)
12250 || (sizeflag & SUFFIX_ALWAYS))
12251 {
12252 USED_REX (REX_W);
12253 if (rex & REX_W)
12254 *obufp++ = 'q';
12255 else
12256 {
12257 if (sizeflag & DFLAG)
12258 *obufp++ = 'l';
12259 else
12260 *obufp++ = 'w';
12261 used_prefixes |= (prefixes & PREFIX_DATA);
12262 }
12263 }
12264 break;
12265 case 'U':
12266 if (intel_syntax)
12267 break;
12268 if (address_mode == mode_64bit && (sizeflag & DFLAG))
12269 {
12270 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
12271 *obufp++ = 'q';
12272 break;
12273 }
12274 /* Fall through. */
12275 goto case_Q;
12276 case 'Q':
12277 if (l == 0 && len == 1)
12278 {
12279 case_Q:
12280 if (intel_syntax && !alt)
12281 break;
12282 USED_REX (REX_W);
12283 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
12284 {
12285 if (rex & REX_W)
12286 *obufp++ = 'q';
12287 else
12288 {
12289 if (sizeflag & DFLAG)
12290 *obufp++ = intel_syntax ? 'd' : 'l';
12291 else
12292 *obufp++ = 'w';
12293 used_prefixes |= (prefixes & PREFIX_DATA);
12294 }
12295 }
12296 }
12297 else
12298 {
12299 if (l != 1 || len != 2 || last[0] != 'L')
12300 {
12301 SAVE_LAST (*p);
12302 break;
12303 }
12304 if (intel_syntax
12305 || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
12306 break;
12307 if ((rex & REX_W))
12308 {
12309 USED_REX (REX_W);
12310 *obufp++ = 'q';
12311 }
12312 else
12313 *obufp++ = 'l';
12314 }
12315 break;
12316 case 'R':
12317 USED_REX (REX_W);
12318 if (rex & REX_W)
12319 *obufp++ = 'q';
12320 else if (sizeflag & DFLAG)
12321 {
12322 if (intel_syntax)
12323 *obufp++ = 'd';
12324 else
12325 *obufp++ = 'l';
12326 }
12327 else
12328 *obufp++ = 'w';
12329 if (intel_syntax && !p[1]
12330 && ((rex & REX_W) || (sizeflag & DFLAG)))
12331 *obufp++ = 'e';
12332 if (!(rex & REX_W))
12333 used_prefixes |= (prefixes & PREFIX_DATA);
12334 break;
12335 case 'V':
12336 if (l == 0 && len == 1)
12337 {
12338 if (intel_syntax)
12339 break;
12340 if (address_mode == mode_64bit && (sizeflag & DFLAG))
12341 {
12342 if (sizeflag & SUFFIX_ALWAYS)
12343 *obufp++ = 'q';
12344 break;
12345 }
12346 }
12347 else
12348 {
12349 if (l != 1
12350 || len != 2
12351 || last[0] != 'L')
12352 {
12353 SAVE_LAST (*p);
12354 break;
12355 }
12356
12357 if (rex & REX_W)
12358 {
12359 *obufp++ = 'a';
12360 *obufp++ = 'b';
12361 *obufp++ = 's';
12362 }
12363 }
12364 /* Fall through. */
12365 goto case_S;
12366 case 'S':
12367 if (l == 0 && len == 1)
12368 {
12369 case_S:
12370 if (intel_syntax)
12371 break;
12372 if (sizeflag & SUFFIX_ALWAYS)
12373 {
12374 if (rex & REX_W)
12375 *obufp++ = 'q';
12376 else
12377 {
12378 if (sizeflag & DFLAG)
12379 *obufp++ = 'l';
12380 else
12381 *obufp++ = 'w';
12382 used_prefixes |= (prefixes & PREFIX_DATA);
12383 }
12384 }
12385 }
12386 else
12387 {
12388 if (l != 1
12389 || len != 2
12390 || last[0] != 'L')
12391 {
12392 SAVE_LAST (*p);
12393 break;
12394 }
12395
12396 if (address_mode == mode_64bit
12397 && !(prefixes & PREFIX_ADDR))
12398 {
12399 *obufp++ = 'a';
12400 *obufp++ = 'b';
12401 *obufp++ = 's';
12402 }
12403
12404 goto case_S;
12405 }
12406 break;
12407 case 'X':
12408 if (l != 0 || len != 1)
12409 {
12410 SAVE_LAST (*p);
12411 break;
12412 }
12413 if (need_vex && vex.prefix)
12414 {
12415 if (vex.prefix == DATA_PREFIX_OPCODE)
12416 *obufp++ = 'd';
12417 else
12418 *obufp++ = 's';
12419 }
12420 else
12421 {
12422 if (prefixes & PREFIX_DATA)
12423 *obufp++ = 'd';
12424 else
12425 *obufp++ = 's';
12426 used_prefixes |= (prefixes & PREFIX_DATA);
12427 }
12428 break;
12429 case 'Y':
12430 if (l == 0 && len == 1)
12431 {
12432 if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
12433 break;
12434 if (rex & REX_W)
12435 {
12436 USED_REX (REX_W);
12437 *obufp++ = 'q';
12438 }
12439 break;
12440 }
12441 else
12442 {
12443 if (l != 1 || len != 2 || last[0] != 'X')
12444 {
12445 SAVE_LAST (*p);
12446 break;
12447 }
12448 if (!need_vex)
12449 abort ();
12450 if (intel_syntax
12451 || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
12452 break;
12453 switch (vex.length)
12454 {
12455 case 128:
12456 *obufp++ = 'x';
12457 break;
12458 case 256:
12459 *obufp++ = 'y';
12460 break;
12461 default:
12462 abort ();
12463 }
12464 }
12465 break;
12466 case 'W':
12467 if (l == 0 && len == 1)
12468 {
12469 /* operand size flag for cwtl, cbtw */
12470 USED_REX (REX_W);
12471 if (rex & REX_W)
12472 {
12473 if (intel_syntax)
12474 *obufp++ = 'd';
12475 else
12476 *obufp++ = 'l';
12477 }
12478 else if (sizeflag & DFLAG)
12479 *obufp++ = 'w';
12480 else
12481 *obufp++ = 'b';
12482 if (!(rex & REX_W))
12483 used_prefixes |= (prefixes & PREFIX_DATA);
12484 }
12485 else
12486 {
12487 if (l != 1
12488 || len != 2
12489 || (last[0] != 'X'
12490 && last[0] != 'L'))
12491 {
12492 SAVE_LAST (*p);
12493 break;
12494 }
12495 if (!need_vex)
12496 abort ();
12497 if (last[0] == 'X')
12498 *obufp++ = vex.w ? 'd': 's';
12499 else
12500 *obufp++ = vex.w ? 'q': 'd';
12501 }
12502 break;
12503 }
12504 alt = 0;
12505 }
12506 *obufp = 0;
12507 mnemonicendp = obufp;
12508 return 0;
12509 }
12510
12511 static void
12512 oappend (const char *s)
12513 {
12514 obufp = stpcpy (obufp, s);
12515 }
12516
12517 static void
12518 append_seg (void)
12519 {
12520 if (prefixes & PREFIX_CS)
12521 {
12522 used_prefixes |= PREFIX_CS;
12523 oappend ("%cs:" + intel_syntax);
12524 }
12525 if (prefixes & PREFIX_DS)
12526 {
12527 used_prefixes |= PREFIX_DS;
12528 oappend ("%ds:" + intel_syntax);
12529 }
12530 if (prefixes & PREFIX_SS)
12531 {
12532 used_prefixes |= PREFIX_SS;
12533 oappend ("%ss:" + intel_syntax);
12534 }
12535 if (prefixes & PREFIX_ES)
12536 {
12537 used_prefixes |= PREFIX_ES;
12538 oappend ("%es:" + intel_syntax);
12539 }
12540 if (prefixes & PREFIX_FS)
12541 {
12542 used_prefixes |= PREFIX_FS;
12543 oappend ("%fs:" + intel_syntax);
12544 }
12545 if (prefixes & PREFIX_GS)
12546 {
12547 used_prefixes |= PREFIX_GS;
12548 oappend ("%gs:" + intel_syntax);
12549 }
12550 }
12551
12552 static void
12553 OP_indirE (int bytemode, int sizeflag)
12554 {
12555 if (!intel_syntax)
12556 oappend ("*");
12557 OP_E (bytemode, sizeflag);
12558 }
12559
12560 static void
12561 print_operand_value (char *buf, int hex, bfd_vma disp)
12562 {
12563 if (address_mode == mode_64bit)
12564 {
12565 if (hex)
12566 {
12567 char tmp[30];
12568 int i;
12569 buf[0] = '0';
12570 buf[1] = 'x';
12571 sprintf_vma (tmp, disp);
12572 for (i = 0; tmp[i] == '0' && tmp[i + 1]; i++);
12573 strcpy (buf + 2, tmp + i);
12574 }
12575 else
12576 {
12577 bfd_signed_vma v = disp;
12578 char tmp[30];
12579 int i;
12580 if (v < 0)
12581 {
12582 *(buf++) = '-';
12583 v = -disp;
12584 /* Check for possible overflow on 0x8000000000000000. */
12585 if (v < 0)
12586 {
12587 strcpy (buf, "9223372036854775808");
12588 return;
12589 }
12590 }
12591 if (!v)
12592 {
12593 strcpy (buf, "0");
12594 return;
12595 }
12596
12597 i = 0;
12598 tmp[29] = 0;
12599 while (v)
12600 {
12601 tmp[28 - i] = (v % 10) + '0';
12602 v /= 10;
12603 i++;
12604 }
12605 strcpy (buf, tmp + 29 - i);
12606 }
12607 }
12608 else
12609 {
12610 if (hex)
12611 sprintf (buf, "0x%x", (unsigned int) disp);
12612 else
12613 sprintf (buf, "%d", (int) disp);
12614 }
12615 }
12616
12617 /* Put DISP in BUF as signed hex number. */
12618
12619 static void
12620 print_displacement (char *buf, bfd_vma disp)
12621 {
12622 bfd_signed_vma val = disp;
12623 char tmp[30];
12624 int i, j = 0;
12625
12626 if (val < 0)
12627 {
12628 buf[j++] = '-';
12629 val = -disp;
12630
12631 /* Check for possible overflow. */
12632 if (val < 0)
12633 {
12634 switch (address_mode)
12635 {
12636 case mode_64bit:
12637 strcpy (buf + j, "0x8000000000000000");
12638 break;
12639 case mode_32bit:
12640 strcpy (buf + j, "0x80000000");
12641 break;
12642 case mode_16bit:
12643 strcpy (buf + j, "0x8000");
12644 break;
12645 }
12646 return;
12647 }
12648 }
12649
12650 buf[j++] = '0';
12651 buf[j++] = 'x';
12652
12653 sprintf_vma (tmp, (bfd_vma) val);
12654 for (i = 0; tmp[i] == '0'; i++)
12655 continue;
12656 if (tmp[i] == '\0')
12657 i--;
12658 strcpy (buf + j, tmp + i);
12659 }
12660
12661 static void
12662 intel_operand_size (int bytemode, int sizeflag)
12663 {
12664 switch (bytemode)
12665 {
12666 case b_mode:
12667 case b_swap_mode:
12668 case dqb_mode:
12669 oappend ("BYTE PTR ");
12670 break;
12671 case w_mode:
12672 case dqw_mode:
12673 oappend ("WORD PTR ");
12674 break;
12675 case stack_v_mode:
12676 if (address_mode == mode_64bit && (sizeflag & DFLAG))
12677 {
12678 oappend ("QWORD PTR ");
12679 break;
12680 }
12681 /* FALLTHRU */
12682 case v_mode:
12683 case v_swap_mode:
12684 case dq_mode:
12685 USED_REX (REX_W);
12686 if (rex & REX_W)
12687 oappend ("QWORD PTR ");
12688 else
12689 {
12690 if ((sizeflag & DFLAG) || bytemode == dq_mode)
12691 oappend ("DWORD PTR ");
12692 else
12693 oappend ("WORD PTR ");
12694 used_prefixes |= (prefixes & PREFIX_DATA);
12695 }
12696 break;
12697 case z_mode:
12698 if ((rex & REX_W) || (sizeflag & DFLAG))
12699 *obufp++ = 'D';
12700 oappend ("WORD PTR ");
12701 if (!(rex & REX_W))
12702 used_prefixes |= (prefixes & PREFIX_DATA);
12703 break;
12704 case a_mode:
12705 if (sizeflag & DFLAG)
12706 oappend ("QWORD PTR ");
12707 else
12708 oappend ("DWORD PTR ");
12709 used_prefixes |= (prefixes & PREFIX_DATA);
12710 break;
12711 case d_mode:
12712 case d_scalar_mode:
12713 case d_scalar_swap_mode:
12714 case d_swap_mode:
12715 case dqd_mode:
12716 oappend ("DWORD PTR ");
12717 break;
12718 case q_mode:
12719 case q_scalar_mode:
12720 case q_scalar_swap_mode:
12721 case q_swap_mode:
12722 oappend ("QWORD PTR ");
12723 break;
12724 case m_mode:
12725 if (address_mode == mode_64bit)
12726 oappend ("QWORD PTR ");
12727 else
12728 oappend ("DWORD PTR ");
12729 break;
12730 case f_mode:
12731 if (sizeflag & DFLAG)
12732 oappend ("FWORD PTR ");
12733 else
12734 oappend ("DWORD PTR ");
12735 used_prefixes |= (prefixes & PREFIX_DATA);
12736 break;
12737 case t_mode:
12738 oappend ("TBYTE PTR ");
12739 break;
12740 case x_mode:
12741 case x_swap_mode:
12742 if (need_vex)
12743 {
12744 switch (vex.length)
12745 {
12746 case 128:
12747 oappend ("XMMWORD PTR ");
12748 break;
12749 case 256:
12750 oappend ("YMMWORD PTR ");
12751 break;
12752 default:
12753 abort ();
12754 }
12755 }
12756 else
12757 oappend ("XMMWORD PTR ");
12758 break;
12759 case xmm_mode:
12760 oappend ("XMMWORD PTR ");
12761 break;
12762 case xmmq_mode:
12763 if (!need_vex)
12764 abort ();
12765
12766 switch (vex.length)
12767 {
12768 case 128:
12769 oappend ("QWORD PTR ");
12770 break;
12771 case 256:
12772 oappend ("XMMWORD PTR ");
12773 break;
12774 default:
12775 abort ();
12776 }
12777 break;
12778 case xmm_mb_mode:
12779 if (!need_vex)
12780 abort ();
12781
12782 switch (vex.length)
12783 {
12784 case 128:
12785 case 256:
12786 oappend ("BYTE PTR ");
12787 break;
12788 default:
12789 abort ();
12790 }
12791 break;
12792 case xmm_mw_mode:
12793 if (!need_vex)
12794 abort ();
12795
12796 switch (vex.length)
12797 {
12798 case 128:
12799 case 256:
12800 oappend ("WORD PTR ");
12801 break;
12802 default:
12803 abort ();
12804 }
12805 break;
12806 case xmm_md_mode:
12807 if (!need_vex)
12808 abort ();
12809
12810 switch (vex.length)
12811 {
12812 case 128:
12813 case 256:
12814 oappend ("DWORD PTR ");
12815 break;
12816 default:
12817 abort ();
12818 }
12819 break;
12820 case xmm_mq_mode:
12821 if (!need_vex)
12822 abort ();
12823
12824 switch (vex.length)
12825 {
12826 case 128:
12827 case 256:
12828 oappend ("QWORD PTR ");
12829 break;
12830 default:
12831 abort ();
12832 }
12833 break;
12834 case xmmdw_mode:
12835 if (!need_vex)
12836 abort ();
12837
12838 switch (vex.length)
12839 {
12840 case 128:
12841 oappend ("WORD PTR ");
12842 break;
12843 case 256:
12844 oappend ("DWORD PTR ");
12845 break;
12846 default:
12847 abort ();
12848 }
12849 break;
12850 case xmmqd_mode:
12851 if (!need_vex)
12852 abort ();
12853
12854 switch (vex.length)
12855 {
12856 case 128:
12857 oappend ("DWORD PTR ");
12858 break;
12859 case 256:
12860 oappend ("QWORD PTR ");
12861 break;
12862 default:
12863 abort ();
12864 }
12865 break;
12866 case ymmq_mode:
12867 if (!need_vex)
12868 abort ();
12869
12870 switch (vex.length)
12871 {
12872 case 128:
12873 oappend ("QWORD PTR ");
12874 break;
12875 case 256:
12876 oappend ("YMMWORD PTR ");
12877 break;
12878 default:
12879 abort ();
12880 }
12881 break;
12882 case ymmxmm_mode:
12883 if (!need_vex)
12884 abort ();
12885
12886 switch (vex.length)
12887 {
12888 case 128:
12889 case 256:
12890 oappend ("XMMWORD PTR ");
12891 break;
12892 default:
12893 abort ();
12894 }
12895 break;
12896 case o_mode:
12897 oappend ("OWORD PTR ");
12898 break;
12899 case vex_w_dq_mode:
12900 case vex_scalar_w_dq_mode:
12901 case vex_vsib_d_w_dq_mode:
12902 case vex_vsib_q_w_dq_mode:
12903 if (!need_vex)
12904 abort ();
12905
12906 if (vex.w)
12907 oappend ("QWORD PTR ");
12908 else
12909 oappend ("DWORD PTR ");
12910 break;
12911 default:
12912 break;
12913 }
12914 }
12915
12916 static void
12917 OP_E_register (int bytemode, int sizeflag)
12918 {
12919 int reg = modrm.rm;
12920 const char **names;
12921
12922 USED_REX (REX_B);
12923 if ((rex & REX_B))
12924 reg += 8;
12925
12926 if ((sizeflag & SUFFIX_ALWAYS)
12927 && (bytemode == b_swap_mode || bytemode == v_swap_mode))
12928 swap_operand ();
12929
12930 switch (bytemode)
12931 {
12932 case b_mode:
12933 case b_swap_mode:
12934 USED_REX (0);
12935 if (rex)
12936 names = names8rex;
12937 else
12938 names = names8;
12939 break;
12940 case w_mode:
12941 names = names16;
12942 break;
12943 case d_mode:
12944 names = names32;
12945 break;
12946 case q_mode:
12947 names = names64;
12948 break;
12949 case m_mode:
12950 names = address_mode == mode_64bit ? names64 : names32;
12951 break;
12952 case stack_v_mode:
12953 if (address_mode == mode_64bit && (sizeflag & DFLAG))
12954 {
12955 names = names64;
12956 break;
12957 }
12958 bytemode = v_mode;
12959 /* FALLTHRU */
12960 case v_mode:
12961 case v_swap_mode:
12962 case dq_mode:
12963 case dqb_mode:
12964 case dqd_mode:
12965 case dqw_mode:
12966 USED_REX (REX_W);
12967 if (rex & REX_W)
12968 names = names64;
12969 else
12970 {
12971 if ((sizeflag & DFLAG)
12972 || (bytemode != v_mode
12973 && bytemode != v_swap_mode))
12974 names = names32;
12975 else
12976 names = names16;
12977 used_prefixes |= (prefixes & PREFIX_DATA);
12978 }
12979 break;
12980 case 0:
12981 return;
12982 default:
12983 oappend (INTERNAL_DISASSEMBLER_ERROR);
12984 return;
12985 }
12986 oappend (names[reg]);
12987 }
12988
12989 static void
12990 OP_E_memory (int bytemode, int sizeflag)
12991 {
12992 bfd_vma disp = 0;
12993 int add = (rex & REX_B) ? 8 : 0;
12994 int riprel = 0;
12995
12996 USED_REX (REX_B);
12997 if (intel_syntax)
12998 intel_operand_size (bytemode, sizeflag);
12999 append_seg ();
13000
13001 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
13002 {
13003 /* 32/64 bit address mode */
13004 int havedisp;
13005 int havesib;
13006 int havebase;
13007 int haveindex;
13008 int needindex;
13009 int base, rbase;
13010 int vindex = 0;
13011 int scale = 0;
13012 const char **indexes64 = names64;
13013 const char **indexes32 = names32;
13014
13015 havesib = 0;
13016 havebase = 1;
13017 haveindex = 0;
13018 base = modrm.rm;
13019
13020 if (base == 4)
13021 {
13022 havesib = 1;
13023 vindex = sib.index;
13024 USED_REX (REX_X);
13025 if (rex & REX_X)
13026 vindex += 8;
13027 switch (bytemode)
13028 {
13029 case vex_vsib_d_w_dq_mode:
13030 case vex_vsib_q_w_dq_mode:
13031 if (!need_vex)
13032 abort ();
13033
13034 haveindex = 1;
13035 switch (vex.length)
13036 {
13037 case 128:
13038 indexes64 = indexes32 = names_xmm;
13039 break;
13040 case 256:
13041 if (!vex.w || bytemode == vex_vsib_q_w_dq_mode)
13042 indexes64 = indexes32 = names_ymm;
13043 else
13044 indexes64 = indexes32 = names_xmm;
13045 break;
13046 default:
13047 abort ();
13048 }
13049 break;
13050 default:
13051 haveindex = vindex != 4;
13052 break;
13053 }
13054 scale = sib.scale;
13055 base = sib.base;
13056 codep++;
13057 }
13058 rbase = base + add;
13059
13060 switch (modrm.mod)
13061 {
13062 case 0:
13063 if (base == 5)
13064 {
13065 havebase = 0;
13066 if (address_mode == mode_64bit && !havesib)
13067 riprel = 1;
13068 disp = get32s ();
13069 }
13070 break;
13071 case 1:
13072 FETCH_DATA (the_info, codep + 1);
13073 disp = *codep++;
13074 if ((disp & 0x80) != 0)
13075 disp -= 0x100;
13076 break;
13077 case 2:
13078 disp = get32s ();
13079 break;
13080 }
13081
13082 /* In 32bit mode, we need index register to tell [offset] from
13083 [eiz*1 + offset]. */
13084 needindex = (havesib
13085 && !havebase
13086 && !haveindex
13087 && address_mode == mode_32bit);
13088 havedisp = (havebase
13089 || needindex
13090 || (havesib && (haveindex || scale != 0)));
13091
13092 if (!intel_syntax)
13093 if (modrm.mod != 0 || base == 5)
13094 {
13095 if (havedisp || riprel)
13096 print_displacement (scratchbuf, disp);
13097 else
13098 print_operand_value (scratchbuf, 1, disp);
13099 oappend (scratchbuf);
13100 if (riprel)
13101 {
13102 set_op (disp, 1);
13103 oappend (sizeflag & AFLAG ? "(%rip)" : "(%eip)");
13104 }
13105 }
13106
13107 if (havebase || haveindex || riprel)
13108 used_prefixes |= PREFIX_ADDR;
13109
13110 if (havedisp || (intel_syntax && riprel))
13111 {
13112 *obufp++ = open_char;
13113 if (intel_syntax && riprel)
13114 {
13115 set_op (disp, 1);
13116 oappend (sizeflag & AFLAG ? "rip" : "eip");
13117 }
13118 *obufp = '\0';
13119 if (havebase)
13120 oappend (address_mode == mode_64bit && (sizeflag & AFLAG)
13121 ? names64[rbase] : names32[rbase]);
13122 if (havesib)
13123 {
13124 /* ESP/RSP won't allow index. If base isn't ESP/RSP,
13125 print index to tell base + index from base. */
13126 if (scale != 0
13127 || needindex
13128 || haveindex
13129 || (havebase && base != ESP_REG_NUM))
13130 {
13131 if (!intel_syntax || havebase)
13132 {
13133 *obufp++ = separator_char;
13134 *obufp = '\0';
13135 }
13136 if (haveindex)
13137 oappend (address_mode == mode_64bit
13138 && (sizeflag & AFLAG)
13139 ? indexes64[vindex] : indexes32[vindex]);
13140 else
13141 oappend (address_mode == mode_64bit
13142 && (sizeflag & AFLAG)
13143 ? index64 : index32);
13144
13145 *obufp++ = scale_char;
13146 *obufp = '\0';
13147 sprintf (scratchbuf, "%d", 1 << scale);
13148 oappend (scratchbuf);
13149 }
13150 }
13151 if (intel_syntax
13152 && (disp || modrm.mod != 0 || base == 5))
13153 {
13154 if (!havedisp || (bfd_signed_vma) disp >= 0)
13155 {
13156 *obufp++ = '+';
13157 *obufp = '\0';
13158 }
13159 else if (modrm.mod != 1 && disp != -disp)
13160 {
13161 *obufp++ = '-';
13162 *obufp = '\0';
13163 disp = - (bfd_signed_vma) disp;
13164 }
13165
13166 if (havedisp)
13167 print_displacement (scratchbuf, disp);
13168 else
13169 print_operand_value (scratchbuf, 1, disp);
13170 oappend (scratchbuf);
13171 }
13172
13173 *obufp++ = close_char;
13174 *obufp = '\0';
13175 }
13176 else if (intel_syntax)
13177 {
13178 if (modrm.mod != 0 || base == 5)
13179 {
13180 if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
13181 | PREFIX_ES | PREFIX_FS | PREFIX_GS))
13182 ;
13183 else
13184 {
13185 oappend (names_seg[ds_reg - es_reg]);
13186 oappend (":");
13187 }
13188 print_operand_value (scratchbuf, 1, disp);
13189 oappend (scratchbuf);
13190 }
13191 }
13192 }
13193 else
13194 {
13195 /* 16 bit address mode */
13196 used_prefixes |= prefixes & PREFIX_ADDR;
13197 switch (modrm.mod)
13198 {
13199 case 0:
13200 if (modrm.rm == 6)
13201 {
13202 disp = get16 ();
13203 if ((disp & 0x8000) != 0)
13204 disp -= 0x10000;
13205 }
13206 break;
13207 case 1:
13208 FETCH_DATA (the_info, codep + 1);
13209 disp = *codep++;
13210 if ((disp & 0x80) != 0)
13211 disp -= 0x100;
13212 break;
13213 case 2:
13214 disp = get16 ();
13215 if ((disp & 0x8000) != 0)
13216 disp -= 0x10000;
13217 break;
13218 }
13219
13220 if (!intel_syntax)
13221 if (modrm.mod != 0 || modrm.rm == 6)
13222 {
13223 print_displacement (scratchbuf, disp);
13224 oappend (scratchbuf);
13225 }
13226
13227 if (modrm.mod != 0 || modrm.rm != 6)
13228 {
13229 *obufp++ = open_char;
13230 *obufp = '\0';
13231 oappend (index16[modrm.rm]);
13232 if (intel_syntax
13233 && (disp || modrm.mod != 0 || modrm.rm == 6))
13234 {
13235 if ((bfd_signed_vma) disp >= 0)
13236 {
13237 *obufp++ = '+';
13238 *obufp = '\0';
13239 }
13240 else if (modrm.mod != 1)
13241 {
13242 *obufp++ = '-';
13243 *obufp = '\0';
13244 disp = - (bfd_signed_vma) disp;
13245 }
13246
13247 print_displacement (scratchbuf, disp);
13248 oappend (scratchbuf);
13249 }
13250
13251 *obufp++ = close_char;
13252 *obufp = '\0';
13253 }
13254 else if (intel_syntax)
13255 {
13256 if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
13257 | PREFIX_ES | PREFIX_FS | PREFIX_GS))
13258 ;
13259 else
13260 {
13261 oappend (names_seg[ds_reg - es_reg]);
13262 oappend (":");
13263 }
13264 print_operand_value (scratchbuf, 1, disp & 0xffff);
13265 oappend (scratchbuf);
13266 }
13267 }
13268 }
13269
13270 static void
13271 OP_E (int bytemode, int sizeflag)
13272 {
13273 /* Skip mod/rm byte. */
13274 MODRM_CHECK;
13275 codep++;
13276
13277 if (modrm.mod == 3)
13278 OP_E_register (bytemode, sizeflag);
13279 else
13280 OP_E_memory (bytemode, sizeflag);
13281 }
13282
13283 static void
13284 OP_G (int bytemode, int sizeflag)
13285 {
13286 int add = 0;
13287 USED_REX (REX_R);
13288 if (rex & REX_R)
13289 add += 8;
13290 switch (bytemode)
13291 {
13292 case b_mode:
13293 USED_REX (0);
13294 if (rex)
13295 oappend (names8rex[modrm.reg + add]);
13296 else
13297 oappend (names8[modrm.reg + add]);
13298 break;
13299 case w_mode:
13300 oappend (names16[modrm.reg + add]);
13301 break;
13302 case d_mode:
13303 oappend (names32[modrm.reg + add]);
13304 break;
13305 case q_mode:
13306 oappend (names64[modrm.reg + add]);
13307 break;
13308 case v_mode:
13309 case dq_mode:
13310 case dqb_mode:
13311 case dqd_mode:
13312 case dqw_mode:
13313 USED_REX (REX_W);
13314 if (rex & REX_W)
13315 oappend (names64[modrm.reg + add]);
13316 else
13317 {
13318 if ((sizeflag & DFLAG) || bytemode != v_mode)
13319 oappend (names32[modrm.reg + add]);
13320 else
13321 oappend (names16[modrm.reg + add]);
13322 used_prefixes |= (prefixes & PREFIX_DATA);
13323 }
13324 break;
13325 case m_mode:
13326 if (address_mode == mode_64bit)
13327 oappend (names64[modrm.reg + add]);
13328 else
13329 oappend (names32[modrm.reg + add]);
13330 break;
13331 default:
13332 oappend (INTERNAL_DISASSEMBLER_ERROR);
13333 break;
13334 }
13335 }
13336
13337 static bfd_vma
13338 get64 (void)
13339 {
13340 bfd_vma x;
13341 #ifdef BFD64
13342 unsigned int a;
13343 unsigned int b;
13344
13345 FETCH_DATA (the_info, codep + 8);
13346 a = *codep++ & 0xff;
13347 a |= (*codep++ & 0xff) << 8;
13348 a |= (*codep++ & 0xff) << 16;
13349 a |= (*codep++ & 0xff) << 24;
13350 b = *codep++ & 0xff;
13351 b |= (*codep++ & 0xff) << 8;
13352 b |= (*codep++ & 0xff) << 16;
13353 b |= (*codep++ & 0xff) << 24;
13354 x = a + ((bfd_vma) b << 32);
13355 #else
13356 abort ();
13357 x = 0;
13358 #endif
13359 return x;
13360 }
13361
13362 static bfd_signed_vma
13363 get32 (void)
13364 {
13365 bfd_signed_vma x = 0;
13366
13367 FETCH_DATA (the_info, codep + 4);
13368 x = *codep++ & (bfd_signed_vma) 0xff;
13369 x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
13370 x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
13371 x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
13372 return x;
13373 }
13374
13375 static bfd_signed_vma
13376 get32s (void)
13377 {
13378 bfd_signed_vma x = 0;
13379
13380 FETCH_DATA (the_info, codep + 4);
13381 x = *codep++ & (bfd_signed_vma) 0xff;
13382 x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
13383 x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
13384 x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
13385
13386 x = (x ^ ((bfd_signed_vma) 1 << 31)) - ((bfd_signed_vma) 1 << 31);
13387
13388 return x;
13389 }
13390
13391 static int
13392 get16 (void)
13393 {
13394 int x = 0;
13395
13396 FETCH_DATA (the_info, codep + 2);
13397 x = *codep++ & 0xff;
13398 x |= (*codep++ & 0xff) << 8;
13399 return x;
13400 }
13401
13402 static void
13403 set_op (bfd_vma op, int riprel)
13404 {
13405 op_index[op_ad] = op_ad;
13406 if (address_mode == mode_64bit)
13407 {
13408 op_address[op_ad] = op;
13409 op_riprel[op_ad] = riprel;
13410 }
13411 else
13412 {
13413 /* Mask to get a 32-bit address. */
13414 op_address[op_ad] = op & 0xffffffff;
13415 op_riprel[op_ad] = riprel & 0xffffffff;
13416 }
13417 }
13418
13419 static void
13420 OP_REG (int code, int sizeflag)
13421 {
13422 const char *s;
13423 int add;
13424 USED_REX (REX_B);
13425 if (rex & REX_B)
13426 add = 8;
13427 else
13428 add = 0;
13429
13430 switch (code)
13431 {
13432 case ax_reg: case cx_reg: case dx_reg: case bx_reg:
13433 case sp_reg: case bp_reg: case si_reg: case di_reg:
13434 s = names16[code - ax_reg + add];
13435 break;
13436 case es_reg: case ss_reg: case cs_reg:
13437 case ds_reg: case fs_reg: case gs_reg:
13438 s = names_seg[code - es_reg + add];
13439 break;
13440 case al_reg: case ah_reg: case cl_reg: case ch_reg:
13441 case dl_reg: case dh_reg: case bl_reg: case bh_reg:
13442 USED_REX (0);
13443 if (rex)
13444 s = names8rex[code - al_reg + add];
13445 else
13446 s = names8[code - al_reg];
13447 break;
13448 case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
13449 case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
13450 if (address_mode == mode_64bit && (sizeflag & DFLAG))
13451 {
13452 s = names64[code - rAX_reg + add];
13453 break;
13454 }
13455 code += eAX_reg - rAX_reg;
13456 /* Fall through. */
13457 case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
13458 case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
13459 USED_REX (REX_W);
13460 if (rex & REX_W)
13461 s = names64[code - eAX_reg + add];
13462 else
13463 {
13464 if (sizeflag & DFLAG)
13465 s = names32[code - eAX_reg + add];
13466 else
13467 s = names16[code - eAX_reg + add];
13468 used_prefixes |= (prefixes & PREFIX_DATA);
13469 }
13470 break;
13471 default:
13472 s = INTERNAL_DISASSEMBLER_ERROR;
13473 break;
13474 }
13475 oappend (s);
13476 }
13477
13478 static void
13479 OP_IMREG (int code, int sizeflag)
13480 {
13481 const char *s;
13482
13483 switch (code)
13484 {
13485 case indir_dx_reg:
13486 if (intel_syntax)
13487 s = "dx";
13488 else
13489 s = "(%dx)";
13490 break;
13491 case ax_reg: case cx_reg: case dx_reg: case bx_reg:
13492 case sp_reg: case bp_reg: case si_reg: case di_reg:
13493 s = names16[code - ax_reg];
13494 break;
13495 case es_reg: case ss_reg: case cs_reg:
13496 case ds_reg: case fs_reg: case gs_reg:
13497 s = names_seg[code - es_reg];
13498 break;
13499 case al_reg: case ah_reg: case cl_reg: case ch_reg:
13500 case dl_reg: case dh_reg: case bl_reg: case bh_reg:
13501 USED_REX (0);
13502 if (rex)
13503 s = names8rex[code - al_reg];
13504 else
13505 s = names8[code - al_reg];
13506 break;
13507 case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
13508 case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
13509 USED_REX (REX_W);
13510 if (rex & REX_W)
13511 s = names64[code - eAX_reg];
13512 else
13513 {
13514 if (sizeflag & DFLAG)
13515 s = names32[code - eAX_reg];
13516 else
13517 s = names16[code - eAX_reg];
13518 used_prefixes |= (prefixes & PREFIX_DATA);
13519 }
13520 break;
13521 case z_mode_ax_reg:
13522 if ((rex & REX_W) || (sizeflag & DFLAG))
13523 s = *names32;
13524 else
13525 s = *names16;
13526 if (!(rex & REX_W))
13527 used_prefixes |= (prefixes & PREFIX_DATA);
13528 break;
13529 default:
13530 s = INTERNAL_DISASSEMBLER_ERROR;
13531 break;
13532 }
13533 oappend (s);
13534 }
13535
13536 static void
13537 OP_I (int bytemode, int sizeflag)
13538 {
13539 bfd_signed_vma op;
13540 bfd_signed_vma mask = -1;
13541
13542 switch (bytemode)
13543 {
13544 case b_mode:
13545 FETCH_DATA (the_info, codep + 1);
13546 op = *codep++;
13547 mask = 0xff;
13548 break;
13549 case q_mode:
13550 if (address_mode == mode_64bit)
13551 {
13552 op = get32s ();
13553 break;
13554 }
13555 /* Fall through. */
13556 case v_mode:
13557 USED_REX (REX_W);
13558 if (rex & REX_W)
13559 op = get32s ();
13560 else
13561 {
13562 if (sizeflag & DFLAG)
13563 {
13564 op = get32 ();
13565 mask = 0xffffffff;
13566 }
13567 else
13568 {
13569 op = get16 ();
13570 mask = 0xfffff;
13571 }
13572 used_prefixes |= (prefixes & PREFIX_DATA);
13573 }
13574 break;
13575 case w_mode:
13576 mask = 0xfffff;
13577 op = get16 ();
13578 break;
13579 case const_1_mode:
13580 if (intel_syntax)
13581 oappend ("1");
13582 return;
13583 default:
13584 oappend (INTERNAL_DISASSEMBLER_ERROR);
13585 return;
13586 }
13587
13588 op &= mask;
13589 scratchbuf[0] = '$';
13590 print_operand_value (scratchbuf + 1, 1, op);
13591 oappend (scratchbuf + intel_syntax);
13592 scratchbuf[0] = '\0';
13593 }
13594
13595 static void
13596 OP_I64 (int bytemode, int sizeflag)
13597 {
13598 bfd_signed_vma op;
13599 bfd_signed_vma mask = -1;
13600
13601 if (address_mode != mode_64bit)
13602 {
13603 OP_I (bytemode, sizeflag);
13604 return;
13605 }
13606
13607 switch (bytemode)
13608 {
13609 case b_mode:
13610 FETCH_DATA (the_info, codep + 1);
13611 op = *codep++;
13612 mask = 0xff;
13613 break;
13614 case v_mode:
13615 USED_REX (REX_W);
13616 if (rex & REX_W)
13617 op = get64 ();
13618 else
13619 {
13620 if (sizeflag & DFLAG)
13621 {
13622 op = get32 ();
13623 mask = 0xffffffff;
13624 }
13625 else
13626 {
13627 op = get16 ();
13628 mask = 0xfffff;
13629 }
13630 used_prefixes |= (prefixes & PREFIX_DATA);
13631 }
13632 break;
13633 case w_mode:
13634 mask = 0xfffff;
13635 op = get16 ();
13636 break;
13637 default:
13638 oappend (INTERNAL_DISASSEMBLER_ERROR);
13639 return;
13640 }
13641
13642 op &= mask;
13643 scratchbuf[0] = '$';
13644 print_operand_value (scratchbuf + 1, 1, op);
13645 oappend (scratchbuf + intel_syntax);
13646 scratchbuf[0] = '\0';
13647 }
13648
13649 static void
13650 OP_sI (int bytemode, int sizeflag)
13651 {
13652 bfd_signed_vma op;
13653
13654 switch (bytemode)
13655 {
13656 case b_mode:
13657 case b_T_mode:
13658 FETCH_DATA (the_info, codep + 1);
13659 op = *codep++;
13660 if ((op & 0x80) != 0)
13661 op -= 0x100;
13662 if (bytemode == b_T_mode)
13663 {
13664 if (address_mode != mode_64bit
13665 || !(sizeflag & DFLAG))
13666 {
13667 if (sizeflag & DFLAG)
13668 op &= 0xffffffff;
13669 else
13670 op &= 0xffff;
13671 }
13672 }
13673 else
13674 {
13675 if (!(rex & REX_W))
13676 {
13677 if (sizeflag & DFLAG)
13678 op &= 0xffffffff;
13679 else
13680 op &= 0xffff;
13681 }
13682 }
13683 break;
13684 case v_mode:
13685 if (sizeflag & DFLAG)
13686 op = get32s ();
13687 else
13688 op = get16 ();
13689 break;
13690 default:
13691 oappend (INTERNAL_DISASSEMBLER_ERROR);
13692 return;
13693 }
13694
13695 scratchbuf[0] = '$';
13696 print_operand_value (scratchbuf + 1, 1, op);
13697 oappend (scratchbuf + intel_syntax);
13698 }
13699
13700 static void
13701 OP_J (int bytemode, int sizeflag)
13702 {
13703 bfd_vma disp;
13704 bfd_vma mask = -1;
13705 bfd_vma segment = 0;
13706
13707 switch (bytemode)
13708 {
13709 case b_mode:
13710 FETCH_DATA (the_info, codep + 1);
13711 disp = *codep++;
13712 if ((disp & 0x80) != 0)
13713 disp -= 0x100;
13714 break;
13715 case v_mode:
13716 USED_REX (REX_W);
13717 if ((sizeflag & DFLAG) || (rex & REX_W))
13718 disp = get32s ();
13719 else
13720 {
13721 disp = get16 ();
13722 if ((disp & 0x8000) != 0)
13723 disp -= 0x10000;
13724 /* In 16bit mode, address is wrapped around at 64k within
13725 the same segment. Otherwise, a data16 prefix on a jump
13726 instruction means that the pc is masked to 16 bits after
13727 the displacement is added! */
13728 mask = 0xffff;
13729 if ((prefixes & PREFIX_DATA) == 0)
13730 segment = ((start_pc + codep - start_codep)
13731 & ~((bfd_vma) 0xffff));
13732 }
13733 if (!(rex & REX_W))
13734 used_prefixes |= (prefixes & PREFIX_DATA);
13735 break;
13736 default:
13737 oappend (INTERNAL_DISASSEMBLER_ERROR);
13738 return;
13739 }
13740 disp = ((start_pc + (codep - start_codep) + disp) & mask) | segment;
13741 set_op (disp, 0);
13742 print_operand_value (scratchbuf, 1, disp);
13743 oappend (scratchbuf);
13744 }
13745
13746 static void
13747 OP_SEG (int bytemode, int sizeflag)
13748 {
13749 if (bytemode == w_mode)
13750 oappend (names_seg[modrm.reg]);
13751 else
13752 OP_E (modrm.mod == 3 ? bytemode : w_mode, sizeflag);
13753 }
13754
13755 static void
13756 OP_DIR (int dummy ATTRIBUTE_UNUSED, int sizeflag)
13757 {
13758 int seg, offset;
13759
13760 if (sizeflag & DFLAG)
13761 {
13762 offset = get32 ();
13763 seg = get16 ();
13764 }
13765 else
13766 {
13767 offset = get16 ();
13768 seg = get16 ();
13769 }
13770 used_prefixes |= (prefixes & PREFIX_DATA);
13771 if (intel_syntax)
13772 sprintf (scratchbuf, "0x%x:0x%x", seg, offset);
13773 else
13774 sprintf (scratchbuf, "$0x%x,$0x%x", seg, offset);
13775 oappend (scratchbuf);
13776 }
13777
13778 static void
13779 OP_OFF (int bytemode, int sizeflag)
13780 {
13781 bfd_vma off;
13782
13783 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
13784 intel_operand_size (bytemode, sizeflag);
13785 append_seg ();
13786
13787 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
13788 off = get32 ();
13789 else
13790 off = get16 ();
13791
13792 if (intel_syntax)
13793 {
13794 if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
13795 | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
13796 {
13797 oappend (names_seg[ds_reg - es_reg]);
13798 oappend (":");
13799 }
13800 }
13801 print_operand_value (scratchbuf, 1, off);
13802 oappend (scratchbuf);
13803 }
13804
13805 static void
13806 OP_OFF64 (int bytemode, int sizeflag)
13807 {
13808 bfd_vma off;
13809
13810 if (address_mode != mode_64bit
13811 || (prefixes & PREFIX_ADDR))
13812 {
13813 OP_OFF (bytemode, sizeflag);
13814 return;
13815 }
13816
13817 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
13818 intel_operand_size (bytemode, sizeflag);
13819 append_seg ();
13820
13821 off = get64 ();
13822
13823 if (intel_syntax)
13824 {
13825 if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
13826 | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
13827 {
13828 oappend (names_seg[ds_reg - es_reg]);
13829 oappend (":");
13830 }
13831 }
13832 print_operand_value (scratchbuf, 1, off);
13833 oappend (scratchbuf);
13834 }
13835
13836 static void
13837 ptr_reg (int code, int sizeflag)
13838 {
13839 const char *s;
13840
13841 *obufp++ = open_char;
13842 used_prefixes |= (prefixes & PREFIX_ADDR);
13843 if (address_mode == mode_64bit)
13844 {
13845 if (!(sizeflag & AFLAG))
13846 s = names32[code - eAX_reg];
13847 else
13848 s = names64[code - eAX_reg];
13849 }
13850 else if (sizeflag & AFLAG)
13851 s = names32[code - eAX_reg];
13852 else
13853 s = names16[code - eAX_reg];
13854 oappend (s);
13855 *obufp++ = close_char;
13856 *obufp = 0;
13857 }
13858
13859 static void
13860 OP_ESreg (int code, int sizeflag)
13861 {
13862 if (intel_syntax)
13863 {
13864 switch (codep[-1])
13865 {
13866 case 0x6d: /* insw/insl */
13867 intel_operand_size (z_mode, sizeflag);
13868 break;
13869 case 0xa5: /* movsw/movsl/movsq */
13870 case 0xa7: /* cmpsw/cmpsl/cmpsq */
13871 case 0xab: /* stosw/stosl */
13872 case 0xaf: /* scasw/scasl */
13873 intel_operand_size (v_mode, sizeflag);
13874 break;
13875 default:
13876 intel_operand_size (b_mode, sizeflag);
13877 }
13878 }
13879 oappend ("%es:" + intel_syntax);
13880 ptr_reg (code, sizeflag);
13881 }
13882
13883 static void
13884 OP_DSreg (int code, int sizeflag)
13885 {
13886 if (intel_syntax)
13887 {
13888 switch (codep[-1])
13889 {
13890 case 0x6f: /* outsw/outsl */
13891 intel_operand_size (z_mode, sizeflag);
13892 break;
13893 case 0xa5: /* movsw/movsl/movsq */
13894 case 0xa7: /* cmpsw/cmpsl/cmpsq */
13895 case 0xad: /* lodsw/lodsl/lodsq */
13896 intel_operand_size (v_mode, sizeflag);
13897 break;
13898 default:
13899 intel_operand_size (b_mode, sizeflag);
13900 }
13901 }
13902 if ((prefixes
13903 & (PREFIX_CS
13904 | PREFIX_DS
13905 | PREFIX_SS
13906 | PREFIX_ES
13907 | PREFIX_FS
13908 | PREFIX_GS)) == 0)
13909 prefixes |= PREFIX_DS;
13910 append_seg ();
13911 ptr_reg (code, sizeflag);
13912 }
13913
13914 static void
13915 OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13916 {
13917 int add;
13918 if (rex & REX_R)
13919 {
13920 USED_REX (REX_R);
13921 add = 8;
13922 }
13923 else if (address_mode != mode_64bit && (prefixes & PREFIX_LOCK))
13924 {
13925 all_prefixes[last_lock_prefix] = 0;
13926 used_prefixes |= PREFIX_LOCK;
13927 add = 8;
13928 }
13929 else
13930 add = 0;
13931 sprintf (scratchbuf, "%%cr%d", modrm.reg + add);
13932 oappend (scratchbuf + intel_syntax);
13933 }
13934
13935 static void
13936 OP_D (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13937 {
13938 int add;
13939 USED_REX (REX_R);
13940 if (rex & REX_R)
13941 add = 8;
13942 else
13943 add = 0;
13944 if (intel_syntax)
13945 sprintf (scratchbuf, "db%d", modrm.reg + add);
13946 else
13947 sprintf (scratchbuf, "%%db%d", modrm.reg + add);
13948 oappend (scratchbuf);
13949 }
13950
13951 static void
13952 OP_T (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13953 {
13954 sprintf (scratchbuf, "%%tr%d", modrm.reg);
13955 oappend (scratchbuf + intel_syntax);
13956 }
13957
13958 static void
13959 OP_R (int bytemode, int sizeflag)
13960 {
13961 if (modrm.mod == 3)
13962 OP_E (bytemode, sizeflag);
13963 else
13964 BadOp ();
13965 }
13966
13967 static void
13968 OP_MMX (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13969 {
13970 int reg = modrm.reg;
13971 const char **names;
13972
13973 used_prefixes |= (prefixes & PREFIX_DATA);
13974 if (prefixes & PREFIX_DATA)
13975 {
13976 names = names_xmm;
13977 USED_REX (REX_R);
13978 if (rex & REX_R)
13979 reg += 8;
13980 }
13981 else
13982 names = names_mm;
13983 oappend (names[reg]);
13984 }
13985
13986 static void
13987 OP_XMM (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13988 {
13989 int reg = modrm.reg;
13990 const char **names;
13991
13992 USED_REX (REX_R);
13993 if (rex & REX_R)
13994 reg += 8;
13995 if (need_vex
13996 && bytemode != xmm_mode
13997 && bytemode != scalar_mode)
13998 {
13999 switch (vex.length)
14000 {
14001 case 128:
14002 names = names_xmm;
14003 break;
14004 case 256:
14005 if (vex.w || bytemode != vex_vsib_q_w_dq_mode)
14006 names = names_ymm;
14007 else
14008 names = names_xmm;
14009 break;
14010 default:
14011 abort ();
14012 }
14013 }
14014 else
14015 names = names_xmm;
14016 oappend (names[reg]);
14017 }
14018
14019 static void
14020 OP_EM (int bytemode, int sizeflag)
14021 {
14022 int reg;
14023 const char **names;
14024
14025 if (modrm.mod != 3)
14026 {
14027 if (intel_syntax
14028 && (bytemode == v_mode || bytemode == v_swap_mode))
14029 {
14030 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
14031 used_prefixes |= (prefixes & PREFIX_DATA);
14032 }
14033 OP_E (bytemode, sizeflag);
14034 return;
14035 }
14036
14037 if ((sizeflag & SUFFIX_ALWAYS) && bytemode == v_swap_mode)
14038 swap_operand ();
14039
14040 /* Skip mod/rm byte. */
14041 MODRM_CHECK;
14042 codep++;
14043 used_prefixes |= (prefixes & PREFIX_DATA);
14044 reg = modrm.rm;
14045 if (prefixes & PREFIX_DATA)
14046 {
14047 names = names_xmm;
14048 USED_REX (REX_B);
14049 if (rex & REX_B)
14050 reg += 8;
14051 }
14052 else
14053 names = names_mm;
14054 oappend (names[reg]);
14055 }
14056
14057 /* cvt* are the only instructions in sse2 which have
14058 both SSE and MMX operands and also have 0x66 prefix
14059 in their opcode. 0x66 was originally used to differentiate
14060 between SSE and MMX instruction(operands). So we have to handle the
14061 cvt* separately using OP_EMC and OP_MXC */
14062 static void
14063 OP_EMC (int bytemode, int sizeflag)
14064 {
14065 if (modrm.mod != 3)
14066 {
14067 if (intel_syntax && bytemode == v_mode)
14068 {
14069 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
14070 used_prefixes |= (prefixes & PREFIX_DATA);
14071 }
14072 OP_E (bytemode, sizeflag);
14073 return;
14074 }
14075
14076 /* Skip mod/rm byte. */
14077 MODRM_CHECK;
14078 codep++;
14079 used_prefixes |= (prefixes & PREFIX_DATA);
14080 oappend (names_mm[modrm.rm]);
14081 }
14082
14083 static void
14084 OP_MXC (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
14085 {
14086 used_prefixes |= (prefixes & PREFIX_DATA);
14087 oappend (names_mm[modrm.reg]);
14088 }
14089
14090 static void
14091 OP_EX (int bytemode, int sizeflag)
14092 {
14093 int reg;
14094 const char **names;
14095
14096 /* Skip mod/rm byte. */
14097 MODRM_CHECK;
14098 codep++;
14099
14100 if (modrm.mod != 3)
14101 {
14102 OP_E_memory (bytemode, sizeflag);
14103 return;
14104 }
14105
14106 reg = modrm.rm;
14107 USED_REX (REX_B);
14108 if (rex & REX_B)
14109 reg += 8;
14110
14111 if ((sizeflag & SUFFIX_ALWAYS)
14112 && (bytemode == x_swap_mode
14113 || bytemode == d_swap_mode
14114 || bytemode == d_scalar_swap_mode
14115 || bytemode == q_swap_mode
14116 || bytemode == q_scalar_swap_mode))
14117 swap_operand ();
14118
14119 if (need_vex
14120 && bytemode != xmm_mode
14121 && bytemode != xmmdw_mode
14122 && bytemode != xmmqd_mode
14123 && bytemode != xmm_mb_mode
14124 && bytemode != xmm_mw_mode
14125 && bytemode != xmm_md_mode
14126 && bytemode != xmm_mq_mode
14127 && bytemode != xmmq_mode
14128 && bytemode != d_scalar_mode
14129 && bytemode != d_scalar_swap_mode
14130 && bytemode != q_scalar_mode
14131 && bytemode != q_scalar_swap_mode
14132 && bytemode != vex_scalar_w_dq_mode)
14133 {
14134 switch (vex.length)
14135 {
14136 case 128:
14137 names = names_xmm;
14138 break;
14139 case 256:
14140 names = names_ymm;
14141 break;
14142 default:
14143 abort ();
14144 }
14145 }
14146 else
14147 names = names_xmm;
14148 oappend (names[reg]);
14149 }
14150
14151 static void
14152 OP_MS (int bytemode, int sizeflag)
14153 {
14154 if (modrm.mod == 3)
14155 OP_EM (bytemode, sizeflag);
14156 else
14157 BadOp ();
14158 }
14159
14160 static void
14161 OP_XS (int bytemode, int sizeflag)
14162 {
14163 if (modrm.mod == 3)
14164 OP_EX (bytemode, sizeflag);
14165 else
14166 BadOp ();
14167 }
14168
14169 static void
14170 OP_M (int bytemode, int sizeflag)
14171 {
14172 if (modrm.mod == 3)
14173 /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
14174 BadOp ();
14175 else
14176 OP_E (bytemode, sizeflag);
14177 }
14178
14179 static void
14180 OP_0f07 (int bytemode, int sizeflag)
14181 {
14182 if (modrm.mod != 3 || modrm.rm != 0)
14183 BadOp ();
14184 else
14185 OP_E (bytemode, sizeflag);
14186 }
14187
14188 /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
14189 32bit mode and "xchg %rax,%rax" in 64bit mode. */
14190
14191 static void
14192 NOP_Fixup1 (int bytemode, int sizeflag)
14193 {
14194 if ((prefixes & PREFIX_DATA) != 0
14195 || (rex != 0
14196 && rex != 0x48
14197 && address_mode == mode_64bit))
14198 OP_REG (bytemode, sizeflag);
14199 else
14200 strcpy (obuf, "nop");
14201 }
14202
14203 static void
14204 NOP_Fixup2 (int bytemode, int sizeflag)
14205 {
14206 if ((prefixes & PREFIX_DATA) != 0
14207 || (rex != 0
14208 && rex != 0x48
14209 && address_mode == mode_64bit))
14210 OP_IMREG (bytemode, sizeflag);
14211 }
14212
14213 static const char *const Suffix3DNow[] = {
14214 /* 00 */ NULL, NULL, NULL, NULL,
14215 /* 04 */ NULL, NULL, NULL, NULL,
14216 /* 08 */ NULL, NULL, NULL, NULL,
14217 /* 0C */ "pi2fw", "pi2fd", NULL, NULL,
14218 /* 10 */ NULL, NULL, NULL, NULL,
14219 /* 14 */ NULL, NULL, NULL, NULL,
14220 /* 18 */ NULL, NULL, NULL, NULL,
14221 /* 1C */ "pf2iw", "pf2id", NULL, NULL,
14222 /* 20 */ NULL, NULL, NULL, NULL,
14223 /* 24 */ NULL, NULL, NULL, NULL,
14224 /* 28 */ NULL, NULL, NULL, NULL,
14225 /* 2C */ NULL, NULL, NULL, NULL,
14226 /* 30 */ NULL, NULL, NULL, NULL,
14227 /* 34 */ NULL, NULL, NULL, NULL,
14228 /* 38 */ NULL, NULL, NULL, NULL,
14229 /* 3C */ NULL, NULL, NULL, NULL,
14230 /* 40 */ NULL, NULL, NULL, NULL,
14231 /* 44 */ NULL, NULL, NULL, NULL,
14232 /* 48 */ NULL, NULL, NULL, NULL,
14233 /* 4C */ NULL, NULL, NULL, NULL,
14234 /* 50 */ NULL, NULL, NULL, NULL,
14235 /* 54 */ NULL, NULL, NULL, NULL,
14236 /* 58 */ NULL, NULL, NULL, NULL,
14237 /* 5C */ NULL, NULL, NULL, NULL,
14238 /* 60 */ NULL, NULL, NULL, NULL,
14239 /* 64 */ NULL, NULL, NULL, NULL,
14240 /* 68 */ NULL, NULL, NULL, NULL,
14241 /* 6C */ NULL, NULL, NULL, NULL,
14242 /* 70 */ NULL, NULL, NULL, NULL,
14243 /* 74 */ NULL, NULL, NULL, NULL,
14244 /* 78 */ NULL, NULL, NULL, NULL,
14245 /* 7C */ NULL, NULL, NULL, NULL,
14246 /* 80 */ NULL, NULL, NULL, NULL,
14247 /* 84 */ NULL, NULL, NULL, NULL,
14248 /* 88 */ NULL, NULL, "pfnacc", NULL,
14249 /* 8C */ NULL, NULL, "pfpnacc", NULL,
14250 /* 90 */ "pfcmpge", NULL, NULL, NULL,
14251 /* 94 */ "pfmin", NULL, "pfrcp", "pfrsqrt",
14252 /* 98 */ NULL, NULL, "pfsub", NULL,
14253 /* 9C */ NULL, NULL, "pfadd", NULL,
14254 /* A0 */ "pfcmpgt", NULL, NULL, NULL,
14255 /* A4 */ "pfmax", NULL, "pfrcpit1", "pfrsqit1",
14256 /* A8 */ NULL, NULL, "pfsubr", NULL,
14257 /* AC */ NULL, NULL, "pfacc", NULL,
14258 /* B0 */ "pfcmpeq", NULL, NULL, NULL,
14259 /* B4 */ "pfmul", NULL, "pfrcpit2", "pmulhrw",
14260 /* B8 */ NULL, NULL, NULL, "pswapd",
14261 /* BC */ NULL, NULL, NULL, "pavgusb",
14262 /* C0 */ NULL, NULL, NULL, NULL,
14263 /* C4 */ NULL, NULL, NULL, NULL,
14264 /* C8 */ NULL, NULL, NULL, NULL,
14265 /* CC */ NULL, NULL, NULL, NULL,
14266 /* D0 */ NULL, NULL, NULL, NULL,
14267 /* D4 */ NULL, NULL, NULL, NULL,
14268 /* D8 */ NULL, NULL, NULL, NULL,
14269 /* DC */ NULL, NULL, NULL, NULL,
14270 /* E0 */ NULL, NULL, NULL, NULL,
14271 /* E4 */ NULL, NULL, NULL, NULL,
14272 /* E8 */ NULL, NULL, NULL, NULL,
14273 /* EC */ NULL, NULL, NULL, NULL,
14274 /* F0 */ NULL, NULL, NULL, NULL,
14275 /* F4 */ NULL, NULL, NULL, NULL,
14276 /* F8 */ NULL, NULL, NULL, NULL,
14277 /* FC */ NULL, NULL, NULL, NULL,
14278 };
14279
14280 static void
14281 OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
14282 {
14283 const char *mnemonic;
14284
14285 FETCH_DATA (the_info, codep + 1);
14286 /* AMD 3DNow! instructions are specified by an opcode suffix in the
14287 place where an 8-bit immediate would normally go. ie. the last
14288 byte of the instruction. */
14289 obufp = mnemonicendp;
14290 mnemonic = Suffix3DNow[*codep++ & 0xff];
14291 if (mnemonic)
14292 oappend (mnemonic);
14293 else
14294 {
14295 /* Since a variable sized modrm/sib chunk is between the start
14296 of the opcode (0x0f0f) and the opcode suffix, we need to do
14297 all the modrm processing first, and don't know until now that
14298 we have a bad opcode. This necessitates some cleaning up. */
14299 op_out[0][0] = '\0';
14300 op_out[1][0] = '\0';
14301 BadOp ();
14302 }
14303 mnemonicendp = obufp;
14304 }
14305
14306 static struct op simd_cmp_op[] =
14307 {
14308 { STRING_COMMA_LEN ("eq") },
14309 { STRING_COMMA_LEN ("lt") },
14310 { STRING_COMMA_LEN ("le") },
14311 { STRING_COMMA_LEN ("unord") },
14312 { STRING_COMMA_LEN ("neq") },
14313 { STRING_COMMA_LEN ("nlt") },
14314 { STRING_COMMA_LEN ("nle") },
14315 { STRING_COMMA_LEN ("ord") }
14316 };
14317
14318 static void
14319 CMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
14320 {
14321 unsigned int cmp_type;
14322
14323 FETCH_DATA (the_info, codep + 1);
14324 cmp_type = *codep++ & 0xff;
14325 if (cmp_type < ARRAY_SIZE (simd_cmp_op))
14326 {
14327 char suffix [3];
14328 char *p = mnemonicendp - 2;
14329 suffix[0] = p[0];
14330 suffix[1] = p[1];
14331 suffix[2] = '\0';
14332 sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
14333 mnemonicendp += simd_cmp_op[cmp_type].len;
14334 }
14335 else
14336 {
14337 /* We have a reserved extension byte. Output it directly. */
14338 scratchbuf[0] = '$';
14339 print_operand_value (scratchbuf + 1, 1, cmp_type);
14340 oappend (scratchbuf + intel_syntax);
14341 scratchbuf[0] = '\0';
14342 }
14343 }
14344
14345 static void
14346 OP_Mwait (int bytemode ATTRIBUTE_UNUSED,
14347 int sizeflag ATTRIBUTE_UNUSED)
14348 {
14349 /* mwait %eax,%ecx */
14350 if (!intel_syntax)
14351 {
14352 const char **names = (address_mode == mode_64bit
14353 ? names64 : names32);
14354 strcpy (op_out[0], names[0]);
14355 strcpy (op_out[1], names[1]);
14356 two_source_ops = 1;
14357 }
14358 /* Skip mod/rm byte. */
14359 MODRM_CHECK;
14360 codep++;
14361 }
14362
14363 static void
14364 OP_Monitor (int bytemode ATTRIBUTE_UNUSED,
14365 int sizeflag ATTRIBUTE_UNUSED)
14366 {
14367 /* monitor %eax,%ecx,%edx" */
14368 if (!intel_syntax)
14369 {
14370 const char **op1_names;
14371 const char **names = (address_mode == mode_64bit
14372 ? names64 : names32);
14373
14374 if (!(prefixes & PREFIX_ADDR))
14375 op1_names = (address_mode == mode_16bit
14376 ? names16 : names);
14377 else
14378 {
14379 /* Remove "addr16/addr32". */
14380 all_prefixes[last_addr_prefix] = 0;
14381 op1_names = (address_mode != mode_32bit
14382 ? names32 : names16);
14383 used_prefixes |= PREFIX_ADDR;
14384 }
14385 strcpy (op_out[0], op1_names[0]);
14386 strcpy (op_out[1], names[1]);
14387 strcpy (op_out[2], names[2]);
14388 two_source_ops = 1;
14389 }
14390 /* Skip mod/rm byte. */
14391 MODRM_CHECK;
14392 codep++;
14393 }
14394
14395 static void
14396 BadOp (void)
14397 {
14398 /* Throw away prefixes and 1st. opcode byte. */
14399 codep = insn_codep + 1;
14400 oappend ("(bad)");
14401 }
14402
14403 static void
14404 REP_Fixup (int bytemode, int sizeflag)
14405 {
14406 /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
14407 lods and stos. */
14408 if (prefixes & PREFIX_REPZ)
14409 all_prefixes[last_repz_prefix] = REP_PREFIX;
14410
14411 switch (bytemode)
14412 {
14413 case al_reg:
14414 case eAX_reg:
14415 case indir_dx_reg:
14416 OP_IMREG (bytemode, sizeflag);
14417 break;
14418 case eDI_reg:
14419 OP_ESreg (bytemode, sizeflag);
14420 break;
14421 case eSI_reg:
14422 OP_DSreg (bytemode, sizeflag);
14423 break;
14424 default:
14425 abort ();
14426 break;
14427 }
14428 }
14429
14430 /* Similar to OP_E. But the 0xf2/0xf3 prefixes should be displayed as
14431 "xacquire"/"xrelease" for memory operand if there is a LOCK prefix.
14432 */
14433
14434 static void
14435 HLE_Fixup1 (int bytemode, int sizeflag)
14436 {
14437 if (modrm.mod != 3
14438 && (prefixes & PREFIX_LOCK) != 0)
14439 {
14440 if (prefixes & PREFIX_REPZ)
14441 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
14442 if (prefixes & PREFIX_REPNZ)
14443 all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
14444 }
14445
14446 OP_E (bytemode, sizeflag);
14447 }
14448
14449 /* Similar to OP_E. But the 0xf2/0xf3 prefixes should be displayed as
14450 "xacquire"/"xrelease" for memory operand. No check for LOCK prefix.
14451 */
14452
14453 static void
14454 HLE_Fixup2 (int bytemode, int sizeflag)
14455 {
14456 if (modrm.mod != 3)
14457 {
14458 if (prefixes & PREFIX_REPZ)
14459 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
14460 if (prefixes & PREFIX_REPNZ)
14461 all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
14462 }
14463
14464 OP_E (bytemode, sizeflag);
14465 }
14466
14467 /* Similar to OP_E. But the 0xf3 prefixes should be displayed as
14468 "xrelease" for memory operand. No check for LOCK prefix. */
14469
14470 static void
14471 HLE_Fixup3 (int bytemode, int sizeflag)
14472 {
14473 if (modrm.mod != 3
14474 && last_repz_prefix > last_repnz_prefix
14475 && (prefixes & PREFIX_REPZ) != 0)
14476 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
14477
14478 OP_E (bytemode, sizeflag);
14479 }
14480
14481 static void
14482 CMPXCHG8B_Fixup (int bytemode, int sizeflag)
14483 {
14484 USED_REX (REX_W);
14485 if (rex & REX_W)
14486 {
14487 /* Change cmpxchg8b to cmpxchg16b. */
14488 char *p = mnemonicendp - 2;
14489 mnemonicendp = stpcpy (p, "16b");
14490 bytemode = o_mode;
14491 }
14492 else if ((prefixes & PREFIX_LOCK) != 0)
14493 {
14494 if (prefixes & PREFIX_REPZ)
14495 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
14496 if (prefixes & PREFIX_REPNZ)
14497 all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
14498 }
14499
14500 OP_M (bytemode, sizeflag);
14501 }
14502
14503 static void
14504 XMM_Fixup (int reg, int sizeflag ATTRIBUTE_UNUSED)
14505 {
14506 const char **names;
14507
14508 if (need_vex)
14509 {
14510 switch (vex.length)
14511 {
14512 case 128:
14513 names = names_xmm;
14514 break;
14515 case 256:
14516 names = names_ymm;
14517 break;
14518 default:
14519 abort ();
14520 }
14521 }
14522 else
14523 names = names_xmm;
14524 oappend (names[reg]);
14525 }
14526
14527 static void
14528 CRC32_Fixup (int bytemode, int sizeflag)
14529 {
14530 /* Add proper suffix to "crc32". */
14531 char *p = mnemonicendp;
14532
14533 switch (bytemode)
14534 {
14535 case b_mode:
14536 if (intel_syntax)
14537 goto skip;
14538
14539 *p++ = 'b';
14540 break;
14541 case v_mode:
14542 if (intel_syntax)
14543 goto skip;
14544
14545 USED_REX (REX_W);
14546 if (rex & REX_W)
14547 *p++ = 'q';
14548 else
14549 {
14550 if (sizeflag & DFLAG)
14551 *p++ = 'l';
14552 else
14553 *p++ = 'w';
14554 used_prefixes |= (prefixes & PREFIX_DATA);
14555 }
14556 break;
14557 default:
14558 oappend (INTERNAL_DISASSEMBLER_ERROR);
14559 break;
14560 }
14561 mnemonicendp = p;
14562 *p = '\0';
14563
14564 skip:
14565 if (modrm.mod == 3)
14566 {
14567 int add;
14568
14569 /* Skip mod/rm byte. */
14570 MODRM_CHECK;
14571 codep++;
14572
14573 USED_REX (REX_B);
14574 add = (rex & REX_B) ? 8 : 0;
14575 if (bytemode == b_mode)
14576 {
14577 USED_REX (0);
14578 if (rex)
14579 oappend (names8rex[modrm.rm + add]);
14580 else
14581 oappend (names8[modrm.rm + add]);
14582 }
14583 else
14584 {
14585 USED_REX (REX_W);
14586 if (rex & REX_W)
14587 oappend (names64[modrm.rm + add]);
14588 else if ((prefixes & PREFIX_DATA))
14589 oappend (names16[modrm.rm + add]);
14590 else
14591 oappend (names32[modrm.rm + add]);
14592 }
14593 }
14594 else
14595 OP_E (bytemode, sizeflag);
14596 }
14597
14598 static void
14599 FXSAVE_Fixup (int bytemode, int sizeflag)
14600 {
14601 /* Add proper suffix to "fxsave" and "fxrstor". */
14602 USED_REX (REX_W);
14603 if (rex & REX_W)
14604 {
14605 char *p = mnemonicendp;
14606 *p++ = '6';
14607 *p++ = '4';
14608 *p = '\0';
14609 mnemonicendp = p;
14610 }
14611 OP_M (bytemode, sizeflag);
14612 }
14613
14614 /* Display the destination register operand for instructions with
14615 VEX. */
14616
14617 static void
14618 OP_VEX (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
14619 {
14620 int reg;
14621 const char **names;
14622
14623 if (!need_vex)
14624 abort ();
14625
14626 if (!need_vex_reg)
14627 return;
14628
14629 reg = vex.register_specifier;
14630 if (bytemode == vex_scalar_mode)
14631 {
14632 oappend (names_xmm[reg]);
14633 return;
14634 }
14635
14636 switch (vex.length)
14637 {
14638 case 128:
14639 switch (bytemode)
14640 {
14641 case vex_mode:
14642 case vex128_mode:
14643 case vex_vsib_q_w_dq_mode:
14644 names = names_xmm;
14645 break;
14646 case dq_mode:
14647 if (vex.w)
14648 names = names64;
14649 else
14650 names = names32;
14651 break;
14652 default:
14653 abort ();
14654 return;
14655 }
14656 break;
14657 case 256:
14658 switch (bytemode)
14659 {
14660 case vex_mode:
14661 case vex256_mode:
14662 names = names_ymm;
14663 break;
14664 case vex_vsib_q_w_dq_mode:
14665 names = vex.w ? names_ymm : names_xmm;
14666 break;
14667 default:
14668 abort ();
14669 return;
14670 }
14671 break;
14672 default:
14673 abort ();
14674 break;
14675 }
14676 oappend (names[reg]);
14677 }
14678
14679 /* Get the VEX immediate byte without moving codep. */
14680
14681 static unsigned char
14682 get_vex_imm8 (int sizeflag, int opnum)
14683 {
14684 int bytes_before_imm = 0;
14685
14686 if (modrm.mod != 3)
14687 {
14688 /* There are SIB/displacement bytes. */
14689 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
14690 {
14691 /* 32/64 bit address mode */
14692 int base = modrm.rm;
14693
14694 /* Check SIB byte. */
14695 if (base == 4)
14696 {
14697 FETCH_DATA (the_info, codep + 1);
14698 base = *codep & 7;
14699 /* When decoding the third source, don't increase
14700 bytes_before_imm as this has already been incremented
14701 by one in OP_E_memory while decoding the second
14702 source operand. */
14703 if (opnum == 0)
14704 bytes_before_imm++;
14705 }
14706
14707 /* Don't increase bytes_before_imm when decoding the third source,
14708 it has already been incremented by OP_E_memory while decoding
14709 the second source operand. */
14710 if (opnum == 0)
14711 {
14712 switch (modrm.mod)
14713 {
14714 case 0:
14715 /* When modrm.rm == 5 or modrm.rm == 4 and base in
14716 SIB == 5, there is a 4 byte displacement. */
14717 if (base != 5)
14718 /* No displacement. */
14719 break;
14720 case 2:
14721 /* 4 byte displacement. */
14722 bytes_before_imm += 4;
14723 break;
14724 case 1:
14725 /* 1 byte displacement. */
14726 bytes_before_imm++;
14727 break;
14728 }
14729 }
14730 }
14731 else
14732 {
14733 /* 16 bit address mode */
14734 /* Don't increase bytes_before_imm when decoding the third source,
14735 it has already been incremented by OP_E_memory while decoding
14736 the second source operand. */
14737 if (opnum == 0)
14738 {
14739 switch (modrm.mod)
14740 {
14741 case 0:
14742 /* When modrm.rm == 6, there is a 2 byte displacement. */
14743 if (modrm.rm != 6)
14744 /* No displacement. */
14745 break;
14746 case 2:
14747 /* 2 byte displacement. */
14748 bytes_before_imm += 2;
14749 break;
14750 case 1:
14751 /* 1 byte displacement: when decoding the third source,
14752 don't increase bytes_before_imm as this has already
14753 been incremented by one in OP_E_memory while decoding
14754 the second source operand. */
14755 if (opnum == 0)
14756 bytes_before_imm++;
14757
14758 break;
14759 }
14760 }
14761 }
14762 }
14763
14764 FETCH_DATA (the_info, codep + bytes_before_imm + 1);
14765 return codep [bytes_before_imm];
14766 }
14767
14768 static void
14769 OP_EX_VexReg (int bytemode, int sizeflag, int reg)
14770 {
14771 const char **names;
14772
14773 if (reg == -1 && modrm.mod != 3)
14774 {
14775 OP_E_memory (bytemode, sizeflag);
14776 return;
14777 }
14778 else
14779 {
14780 if (reg == -1)
14781 {
14782 reg = modrm.rm;
14783 USED_REX (REX_B);
14784 if (rex & REX_B)
14785 reg += 8;
14786 }
14787 else if (reg > 7 && address_mode != mode_64bit)
14788 BadOp ();
14789 }
14790
14791 switch (vex.length)
14792 {
14793 case 128:
14794 names = names_xmm;
14795 break;
14796 case 256:
14797 names = names_ymm;
14798 break;
14799 default:
14800 abort ();
14801 }
14802 oappend (names[reg]);
14803 }
14804
14805 static void
14806 OP_EX_VexImmW (int bytemode, int sizeflag)
14807 {
14808 int reg = -1;
14809 static unsigned char vex_imm8;
14810
14811 if (vex_w_done == 0)
14812 {
14813 vex_w_done = 1;
14814
14815 /* Skip mod/rm byte. */
14816 MODRM_CHECK;
14817 codep++;
14818
14819 vex_imm8 = get_vex_imm8 (sizeflag, 0);
14820
14821 if (vex.w)
14822 reg = vex_imm8 >> 4;
14823
14824 OP_EX_VexReg (bytemode, sizeflag, reg);
14825 }
14826 else if (vex_w_done == 1)
14827 {
14828 vex_w_done = 2;
14829
14830 if (!vex.w)
14831 reg = vex_imm8 >> 4;
14832
14833 OP_EX_VexReg (bytemode, sizeflag, reg);
14834 }
14835 else
14836 {
14837 /* Output the imm8 directly. */
14838 scratchbuf[0] = '$';
14839 print_operand_value (scratchbuf + 1, 1, vex_imm8 & 0xf);
14840 oappend (scratchbuf + intel_syntax);
14841 scratchbuf[0] = '\0';
14842 codep++;
14843 }
14844 }
14845
14846 static void
14847 OP_Vex_2src (int bytemode, int sizeflag)
14848 {
14849 if (modrm.mod == 3)
14850 {
14851 int reg = modrm.rm;
14852 USED_REX (REX_B);
14853 if (rex & REX_B)
14854 reg += 8;
14855 oappend (names_xmm[reg]);
14856 }
14857 else
14858 {
14859 if (intel_syntax
14860 && (bytemode == v_mode || bytemode == v_swap_mode))
14861 {
14862 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
14863 used_prefixes |= (prefixes & PREFIX_DATA);
14864 }
14865 OP_E (bytemode, sizeflag);
14866 }
14867 }
14868
14869 static void
14870 OP_Vex_2src_1 (int bytemode, int sizeflag)
14871 {
14872 if (modrm.mod == 3)
14873 {
14874 /* Skip mod/rm byte. */
14875 MODRM_CHECK;
14876 codep++;
14877 }
14878
14879 if (vex.w)
14880 oappend (names_xmm[vex.register_specifier]);
14881 else
14882 OP_Vex_2src (bytemode, sizeflag);
14883 }
14884
14885 static void
14886 OP_Vex_2src_2 (int bytemode, int sizeflag)
14887 {
14888 if (vex.w)
14889 OP_Vex_2src (bytemode, sizeflag);
14890 else
14891 oappend (names_xmm[vex.register_specifier]);
14892 }
14893
14894 static void
14895 OP_EX_VexW (int bytemode, int sizeflag)
14896 {
14897 int reg = -1;
14898
14899 if (!vex_w_done)
14900 {
14901 vex_w_done = 1;
14902
14903 /* Skip mod/rm byte. */
14904 MODRM_CHECK;
14905 codep++;
14906
14907 if (vex.w)
14908 reg = get_vex_imm8 (sizeflag, 0) >> 4;
14909 }
14910 else
14911 {
14912 if (!vex.w)
14913 reg = get_vex_imm8 (sizeflag, 1) >> 4;
14914 }
14915
14916 OP_EX_VexReg (bytemode, sizeflag, reg);
14917 }
14918
14919 static void
14920 VEXI4_Fixup (int bytemode ATTRIBUTE_UNUSED,
14921 int sizeflag ATTRIBUTE_UNUSED)
14922 {
14923 /* Skip the immediate byte and check for invalid bits. */
14924 FETCH_DATA (the_info, codep + 1);
14925 if (*codep++ & 0xf)
14926 BadOp ();
14927 }
14928
14929 static void
14930 OP_REG_VexI4 (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
14931 {
14932 int reg;
14933 const char **names;
14934
14935 FETCH_DATA (the_info, codep + 1);
14936 reg = *codep++;
14937
14938 if (bytemode != x_mode)
14939 abort ();
14940
14941 if (reg & 0xf)
14942 BadOp ();
14943
14944 reg >>= 4;
14945 if (reg > 7 && address_mode != mode_64bit)
14946 BadOp ();
14947
14948 switch (vex.length)
14949 {
14950 case 128:
14951 names = names_xmm;
14952 break;
14953 case 256:
14954 names = names_ymm;
14955 break;
14956 default:
14957 abort ();
14958 }
14959 oappend (names[reg]);
14960 }
14961
14962 static void
14963 OP_XMM_VexW (int bytemode, int sizeflag)
14964 {
14965 /* Turn off the REX.W bit since it is used for swapping operands
14966 now. */
14967 rex &= ~REX_W;
14968 OP_XMM (bytemode, sizeflag);
14969 }
14970
14971 static void
14972 OP_EX_Vex (int bytemode, int sizeflag)
14973 {
14974 if (modrm.mod != 3)
14975 {
14976 if (vex.register_specifier != 0)
14977 BadOp ();
14978 need_vex_reg = 0;
14979 }
14980 OP_EX (bytemode, sizeflag);
14981 }
14982
14983 static void
14984 OP_XMM_Vex (int bytemode, int sizeflag)
14985 {
14986 if (modrm.mod != 3)
14987 {
14988 if (vex.register_specifier != 0)
14989 BadOp ();
14990 need_vex_reg = 0;
14991 }
14992 OP_XMM (bytemode, sizeflag);
14993 }
14994
14995 static void
14996 VZERO_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
14997 {
14998 switch (vex.length)
14999 {
15000 case 128:
15001 mnemonicendp = stpcpy (obuf, "vzeroupper");
15002 break;
15003 case 256:
15004 mnemonicendp = stpcpy (obuf, "vzeroall");
15005 break;
15006 default:
15007 abort ();
15008 }
15009 }
15010
15011 static struct op vex_cmp_op[] =
15012 {
15013 { STRING_COMMA_LEN ("eq") },
15014 { STRING_COMMA_LEN ("lt") },
15015 { STRING_COMMA_LEN ("le") },
15016 { STRING_COMMA_LEN ("unord") },
15017 { STRING_COMMA_LEN ("neq") },
15018 { STRING_COMMA_LEN ("nlt") },
15019 { STRING_COMMA_LEN ("nle") },
15020 { STRING_COMMA_LEN ("ord") },
15021 { STRING_COMMA_LEN ("eq_uq") },
15022 { STRING_COMMA_LEN ("nge") },
15023 { STRING_COMMA_LEN ("ngt") },
15024 { STRING_COMMA_LEN ("false") },
15025 { STRING_COMMA_LEN ("neq_oq") },
15026 { STRING_COMMA_LEN ("ge") },
15027 { STRING_COMMA_LEN ("gt") },
15028 { STRING_COMMA_LEN ("true") },
15029 { STRING_COMMA_LEN ("eq_os") },
15030 { STRING_COMMA_LEN ("lt_oq") },
15031 { STRING_COMMA_LEN ("le_oq") },
15032 { STRING_COMMA_LEN ("unord_s") },
15033 { STRING_COMMA_LEN ("neq_us") },
15034 { STRING_COMMA_LEN ("nlt_uq") },
15035 { STRING_COMMA_LEN ("nle_uq") },
15036 { STRING_COMMA_LEN ("ord_s") },
15037 { STRING_COMMA_LEN ("eq_us") },
15038 { STRING_COMMA_LEN ("nge_uq") },
15039 { STRING_COMMA_LEN ("ngt_uq") },
15040 { STRING_COMMA_LEN ("false_os") },
15041 { STRING_COMMA_LEN ("neq_os") },
15042 { STRING_COMMA_LEN ("ge_oq") },
15043 { STRING_COMMA_LEN ("gt_oq") },
15044 { STRING_COMMA_LEN ("true_us") },
15045 };
15046
15047 static void
15048 VCMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15049 {
15050 unsigned int cmp_type;
15051
15052 FETCH_DATA (the_info, codep + 1);
15053 cmp_type = *codep++ & 0xff;
15054 if (cmp_type < ARRAY_SIZE (vex_cmp_op))
15055 {
15056 char suffix [3];
15057 char *p = mnemonicendp - 2;
15058 suffix[0] = p[0];
15059 suffix[1] = p[1];
15060 suffix[2] = '\0';
15061 sprintf (p, "%s%s", vex_cmp_op[cmp_type].name, suffix);
15062 mnemonicendp += vex_cmp_op[cmp_type].len;
15063 }
15064 else
15065 {
15066 /* We have a reserved extension byte. Output it directly. */
15067 scratchbuf[0] = '$';
15068 print_operand_value (scratchbuf + 1, 1, cmp_type);
15069 oappend (scratchbuf + intel_syntax);
15070 scratchbuf[0] = '\0';
15071 }
15072 }
15073
15074 static const struct op pclmul_op[] =
15075 {
15076 { STRING_COMMA_LEN ("lql") },
15077 { STRING_COMMA_LEN ("hql") },
15078 { STRING_COMMA_LEN ("lqh") },
15079 { STRING_COMMA_LEN ("hqh") }
15080 };
15081
15082 static void
15083 PCLMUL_Fixup (int bytemode ATTRIBUTE_UNUSED,
15084 int sizeflag ATTRIBUTE_UNUSED)
15085 {
15086 unsigned int pclmul_type;
15087
15088 FETCH_DATA (the_info, codep + 1);
15089 pclmul_type = *codep++ & 0xff;
15090 switch (pclmul_type)
15091 {
15092 case 0x10:
15093 pclmul_type = 2;
15094 break;
15095 case 0x11:
15096 pclmul_type = 3;
15097 break;
15098 default:
15099 break;
15100 }
15101 if (pclmul_type < ARRAY_SIZE (pclmul_op))
15102 {
15103 char suffix [4];
15104 char *p = mnemonicendp - 3;
15105 suffix[0] = p[0];
15106 suffix[1] = p[1];
15107 suffix[2] = p[2];
15108 suffix[3] = '\0';
15109 sprintf (p, "%s%s", pclmul_op[pclmul_type].name, suffix);
15110 mnemonicendp += pclmul_op[pclmul_type].len;
15111 }
15112 else
15113 {
15114 /* We have a reserved extension byte. Output it directly. */
15115 scratchbuf[0] = '$';
15116 print_operand_value (scratchbuf + 1, 1, pclmul_type);
15117 oappend (scratchbuf + intel_syntax);
15118 scratchbuf[0] = '\0';
15119 }
15120 }
15121
15122 static void
15123 MOVBE_Fixup (int bytemode, int sizeflag)
15124 {
15125 /* Add proper suffix to "movbe". */
15126 char *p = mnemonicendp;
15127
15128 switch (bytemode)
15129 {
15130 case v_mode:
15131 if (intel_syntax)
15132 goto skip;
15133
15134 USED_REX (REX_W);
15135 if (sizeflag & SUFFIX_ALWAYS)
15136 {
15137 if (rex & REX_W)
15138 *p++ = 'q';
15139 else
15140 {
15141 if (sizeflag & DFLAG)
15142 *p++ = 'l';
15143 else
15144 *p++ = 'w';
15145 used_prefixes |= (prefixes & PREFIX_DATA);
15146 }
15147 }
15148 break;
15149 default:
15150 oappend (INTERNAL_DISASSEMBLER_ERROR);
15151 break;
15152 }
15153 mnemonicendp = p;
15154 *p = '\0';
15155
15156 skip:
15157 OP_M (bytemode, sizeflag);
15158 }
15159
15160 static void
15161 OP_LWPCB_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15162 {
15163 int reg;
15164 const char **names;
15165
15166 /* Skip mod/rm byte. */
15167 MODRM_CHECK;
15168 codep++;
15169
15170 if (vex.w)
15171 names = names64;
15172 else
15173 names = names32;
15174
15175 reg = modrm.rm;
15176 USED_REX (REX_B);
15177 if (rex & REX_B)
15178 reg += 8;
15179
15180 oappend (names[reg]);
15181 }
15182
15183 static void
15184 OP_LWP_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15185 {
15186 const char **names;
15187
15188 if (vex.w)
15189 names = names64;
15190 else
15191 names = names32;
15192
15193 oappend (names[vex.register_specifier]);
15194 }
15195