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