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