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