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