2009-11-12 H.J. Lu <hongjiu.lu@intel.com>
[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 fetch_data (struct disassemble_info *, bfd_byte *);
46 static void ckprefix (void);
47 static const char *prefix_name (int, int);
48 static int print_insn (bfd_vma, disassemble_info *);
49 static void dofloat (int);
50 static void OP_ST (int, int);
51 static void OP_STi (int, int);
52 static int putop (const char *, int);
53 static void oappend (const char *);
54 static void append_seg (void);
55 static void OP_indirE (int, int);
56 static void print_operand_value (char *, int, bfd_vma);
57 static void OP_E_register (int, int);
58 static void OP_E_memory (int, int);
59 static void OP_E_extended (int, int);
60 static void print_displacement (char *, bfd_vma);
61 static void OP_E (int, int);
62 static void OP_G (int, int);
63 static bfd_vma get64 (void);
64 static bfd_signed_vma get32 (void);
65 static bfd_signed_vma get32s (void);
66 static int get16 (void);
67 static void set_op (bfd_vma, int);
68 static void OP_Skip_MODRM (int, int);
69 static void OP_REG (int, int);
70 static void OP_IMREG (int, int);
71 static void OP_I (int, int);
72 static void OP_I64 (int, int);
73 static void OP_sI (int, int);
74 static void OP_J (int, int);
75 static void OP_SEG (int, int);
76 static void OP_DIR (int, int);
77 static void OP_OFF (int, int);
78 static void OP_OFF64 (int, int);
79 static void ptr_reg (int, int);
80 static void OP_ESreg (int, int);
81 static void OP_DSreg (int, int);
82 static void OP_C (int, int);
83 static void OP_D (int, int);
84 static void OP_T (int, int);
85 static void OP_R (int, int);
86 static void OP_MMX (int, int);
87 static void OP_XMM (int, int);
88 static void OP_EM (int, int);
89 static void OP_EX (int, int);
90 static void OP_EMC (int,int);
91 static void OP_MXC (int,int);
92 static void OP_MS (int, int);
93 static void OP_XS (int, int);
94 static void OP_M (int, int);
95 static void OP_VEX (int, int);
96 static void OP_EX_Vex (int, int);
97 static void OP_EX_VexW (int, int);
98 static void OP_XMM_Vex (int, int);
99 static void OP_XMM_VexW (int, int);
100 static void OP_REG_VexI4 (int, int);
101 static void PCLMUL_Fixup (int, int);
102 static void VEXI4_Fixup (int, int);
103 static void VZERO_Fixup (int, int);
104 static void VCMP_Fixup (int, int);
105 static void OP_0f07 (int, int);
106 static void OP_Monitor (int, int);
107 static void OP_Mwait (int, int);
108 static void NOP_Fixup1 (int, int);
109 static void NOP_Fixup2 (int, int);
110 static void OP_3DNowSuffix (int, int);
111 static void CMP_Fixup (int, int);
112 static void BadOp (void);
113 static void REP_Fixup (int, int);
114 static void CMPXCHG8B_Fixup (int, int);
115 static void XMM_Fixup (int, int);
116 static void CRC32_Fixup (int, int);
117 static void OP_LWPCB_E (int, int);
118 static void OP_LWP_E (int, int);
119 static void OP_LWP_I (int, int);
120
121 static void MOVBE_Fixup (int, int);
122
123 struct dis_private {
124 /* Points to first byte not fetched. */
125 bfd_byte *max_fetched;
126 bfd_byte the_buffer[MAX_MNEM_SIZE];
127 bfd_vma insn_start;
128 int orig_sizeflag;
129 jmp_buf bailout;
130 };
131
132 enum address_mode
133 {
134 mode_16bit,
135 mode_32bit,
136 mode_64bit
137 };
138
139 enum address_mode address_mode;
140
141 /* Flags for the prefixes for the current instruction. See below. */
142 static int prefixes;
143
144 /* REX prefix the current instruction. See below. */
145 static int rex;
146 /* Bits of REX we've already used. */
147 static int rex_used;
148 /* Original REX prefix. */
149 static int rex_original;
150 /* REX bits in original REX prefix ignored. It may not be the same
151 as rex_original since some bits may not be ignored. */
152 static int rex_ignored;
153 /* Mark parts used in the REX prefix. When we are testing for
154 empty prefix (for 8bit register REX extension), just mask it
155 out. Otherwise test for REX bit is excuse for existence of REX
156 only in case value is nonzero. */
157 #define USED_REX(value) \
158 { \
159 if (value) \
160 { \
161 if ((rex & value)) \
162 rex_used |= (value) | REX_OPCODE; \
163 } \
164 else \
165 rex_used |= REX_OPCODE; \
166 }
167
168 /* Flags for prefixes which we somehow handled when printing the
169 current instruction. */
170 static int used_prefixes;
171
172 /* Flags stored in PREFIXES. */
173 #define PREFIX_REPZ 1
174 #define PREFIX_REPNZ 2
175 #define PREFIX_LOCK 4
176 #define PREFIX_CS 8
177 #define PREFIX_SS 0x10
178 #define PREFIX_DS 0x20
179 #define PREFIX_ES 0x40
180 #define PREFIX_FS 0x80
181 #define PREFIX_GS 0x100
182 #define PREFIX_DATA 0x200
183 #define PREFIX_ADDR 0x400
184 #define PREFIX_FWAIT 0x800
185
186 /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
187 to ADDR (exclusive) are valid. Returns 1 for success, longjmps
188 on error. */
189 #define FETCH_DATA(info, addr) \
190 ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \
191 ? 1 : fetch_data ((info), (addr)))
192
193 static int
194 fetch_data (struct disassemble_info *info, bfd_byte *addr)
195 {
196 int status;
197 struct dis_private *priv = (struct dis_private *) info->private_data;
198 bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer);
199
200 if (addr <= priv->the_buffer + MAX_MNEM_SIZE)
201 status = (*info->read_memory_func) (start,
202 priv->max_fetched,
203 addr - priv->max_fetched,
204 info);
205 else
206 status = -1;
207 if (status != 0)
208 {
209 /* If we did manage to read at least one byte, then
210 print_insn_i386 will do something sensible. Otherwise, print
211 an error. We do that here because this is where we know
212 STATUS. */
213 if (priv->max_fetched == priv->the_buffer)
214 (*info->memory_error_func) (status, start, info);
215 longjmp (priv->bailout, 1);
216 }
217 else
218 priv->max_fetched = addr;
219 return 1;
220 }
221
222 #define XX { NULL, 0 }
223
224 #define Eb { OP_E, b_mode }
225 #define EbS { OP_E, b_swap_mode }
226 #define Ev { OP_E, v_mode }
227 #define EvS { OP_E, v_swap_mode }
228 #define Ed { OP_E, d_mode }
229 #define Edq { OP_E, dq_mode }
230 #define Edqw { OP_E, dqw_mode }
231 #define Edqb { OP_E, dqb_mode }
232 #define Edqd { OP_E, dqd_mode }
233 #define Eq { OP_E, q_mode }
234 #define indirEv { OP_indirE, stack_v_mode }
235 #define indirEp { OP_indirE, f_mode }
236 #define stackEv { OP_E, stack_v_mode }
237 #define Em { OP_E, m_mode }
238 #define Ew { OP_E, w_mode }
239 #define M { OP_M, 0 } /* lea, lgdt, etc. */
240 #define Ma { OP_M, a_mode }
241 #define Mb { OP_M, b_mode }
242 #define Md { OP_M, d_mode }
243 #define Mo { OP_M, o_mode }
244 #define Mp { OP_M, f_mode } /* 32 or 48 bit memory operand for LDS, LES etc */
245 #define Mq { OP_M, q_mode }
246 #define Mx { OP_M, x_mode }
247 #define Mxmm { OP_M, xmm_mode }
248 #define Gb { OP_G, b_mode }
249 #define Gv { OP_G, v_mode }
250 #define Gd { OP_G, d_mode }
251 #define Gdq { OP_G, dq_mode }
252 #define Gm { OP_G, m_mode }
253 #define Gw { OP_G, w_mode }
254 #define Rd { OP_R, d_mode }
255 #define Rm { OP_R, m_mode }
256 #define Ib { OP_I, b_mode }
257 #define sIb { OP_sI, b_mode } /* sign extened byte */
258 #define Iv { OP_I, v_mode }
259 #define Iq { OP_I, q_mode }
260 #define Iv64 { OP_I64, v_mode }
261 #define Iw { OP_I, w_mode }
262 #define I1 { OP_I, const_1_mode }
263 #define Jb { OP_J, b_mode }
264 #define Jv { OP_J, v_mode }
265 #define Cm { OP_C, m_mode }
266 #define Dm { OP_D, m_mode }
267 #define Td { OP_T, d_mode }
268 #define Skip_MODRM { OP_Skip_MODRM, 0 }
269
270 #define RMeAX { OP_REG, eAX_reg }
271 #define RMeBX { OP_REG, eBX_reg }
272 #define RMeCX { OP_REG, eCX_reg }
273 #define RMeDX { OP_REG, eDX_reg }
274 #define RMeSP { OP_REG, eSP_reg }
275 #define RMeBP { OP_REG, eBP_reg }
276 #define RMeSI { OP_REG, eSI_reg }
277 #define RMeDI { OP_REG, eDI_reg }
278 #define RMrAX { OP_REG, rAX_reg }
279 #define RMrBX { OP_REG, rBX_reg }
280 #define RMrCX { OP_REG, rCX_reg }
281 #define RMrDX { OP_REG, rDX_reg }
282 #define RMrSP { OP_REG, rSP_reg }
283 #define RMrBP { OP_REG, rBP_reg }
284 #define RMrSI { OP_REG, rSI_reg }
285 #define RMrDI { OP_REG, rDI_reg }
286 #define RMAL { OP_REG, al_reg }
287 #define RMAL { OP_REG, al_reg }
288 #define RMCL { OP_REG, cl_reg }
289 #define RMDL { OP_REG, dl_reg }
290 #define RMBL { OP_REG, bl_reg }
291 #define RMAH { OP_REG, ah_reg }
292 #define RMCH { OP_REG, ch_reg }
293 #define RMDH { OP_REG, dh_reg }
294 #define RMBH { OP_REG, bh_reg }
295 #define RMAX { OP_REG, ax_reg }
296 #define RMDX { OP_REG, dx_reg }
297
298 #define eAX { OP_IMREG, eAX_reg }
299 #define eBX { OP_IMREG, eBX_reg }
300 #define eCX { OP_IMREG, eCX_reg }
301 #define eDX { OP_IMREG, eDX_reg }
302 #define eSP { OP_IMREG, eSP_reg }
303 #define eBP { OP_IMREG, eBP_reg }
304 #define eSI { OP_IMREG, eSI_reg }
305 #define eDI { OP_IMREG, eDI_reg }
306 #define AL { OP_IMREG, al_reg }
307 #define CL { OP_IMREG, cl_reg }
308 #define DL { OP_IMREG, dl_reg }
309 #define BL { OP_IMREG, bl_reg }
310 #define AH { OP_IMREG, ah_reg }
311 #define CH { OP_IMREG, ch_reg }
312 #define DH { OP_IMREG, dh_reg }
313 #define BH { OP_IMREG, bh_reg }
314 #define AX { OP_IMREG, ax_reg }
315 #define DX { OP_IMREG, dx_reg }
316 #define zAX { OP_IMREG, z_mode_ax_reg }
317 #define indirDX { OP_IMREG, indir_dx_reg }
318
319 #define Sw { OP_SEG, w_mode }
320 #define Sv { OP_SEG, v_mode }
321 #define Ap { OP_DIR, 0 }
322 #define Ob { OP_OFF64, b_mode }
323 #define Ov { OP_OFF64, v_mode }
324 #define Xb { OP_DSreg, eSI_reg }
325 #define Xv { OP_DSreg, eSI_reg }
326 #define Xz { OP_DSreg, eSI_reg }
327 #define Yb { OP_ESreg, eDI_reg }
328 #define Yv { OP_ESreg, eDI_reg }
329 #define DSBX { OP_DSreg, eBX_reg }
330
331 #define es { OP_REG, es_reg }
332 #define ss { OP_REG, ss_reg }
333 #define cs { OP_REG, cs_reg }
334 #define ds { OP_REG, ds_reg }
335 #define fs { OP_REG, fs_reg }
336 #define gs { OP_REG, gs_reg }
337
338 #define MX { OP_MMX, 0 }
339 #define XM { OP_XMM, 0 }
340 #define XMM { OP_XMM, xmm_mode }
341 #define EM { OP_EM, v_mode }
342 #define EMS { OP_EM, v_swap_mode }
343 #define EMd { OP_EM, d_mode }
344 #define EMx { OP_EM, x_mode }
345 #define EXw { OP_EX, w_mode }
346 #define EXd { OP_EX, d_mode }
347 #define EXdS { OP_EX, d_swap_mode }
348 #define EXq { OP_EX, q_mode }
349 #define EXqS { OP_EX, q_swap_mode }
350 #define EXx { OP_EX, x_mode }
351 #define EXxS { OP_EX, x_swap_mode }
352 #define EXxmm { OP_EX, xmm_mode }
353 #define EXxmmq { OP_EX, xmmq_mode }
354 #define EXymmq { OP_EX, ymmq_mode }
355 #define EXVexWdq { OP_EX, vex_w_dq_mode }
356 #define MS { OP_MS, v_mode }
357 #define XS { OP_XS, v_mode }
358 #define EMCq { OP_EMC, q_mode }
359 #define MXC { OP_MXC, 0 }
360 #define OPSUF { OP_3DNowSuffix, 0 }
361 #define CMP { CMP_Fixup, 0 }
362 #define XMM0 { XMM_Fixup, 0 }
363
364 #define Vex { OP_VEX, vex_mode }
365 #define Vex128 { OP_VEX, vex128_mode }
366 #define Vex256 { OP_VEX, vex256_mode }
367 #define VexI4 { VEXI4_Fixup, 0}
368 #define EXdVex { OP_EX_Vex, d_mode }
369 #define EXdVexS { OP_EX_Vex, d_swap_mode }
370 #define EXqVex { OP_EX_Vex, q_mode }
371 #define EXqVexS { OP_EX_Vex, q_swap_mode }
372 #define EXVexW { OP_EX_VexW, x_mode }
373 #define EXdVexW { OP_EX_VexW, d_mode }
374 #define EXqVexW { OP_EX_VexW, q_mode }
375 #define XMVex { OP_XMM_Vex, 0 }
376 #define XMVexW { OP_XMM_VexW, 0 }
377 #define XMVexI4 { OP_REG_VexI4, x_mode }
378 #define PCLMUL { PCLMUL_Fixup, 0 }
379 #define VZERO { VZERO_Fixup, 0 }
380 #define VCMP { VCMP_Fixup, 0 }
381
382 /* Used handle "rep" prefix for string instructions. */
383 #define Xbr { REP_Fixup, eSI_reg }
384 #define Xvr { REP_Fixup, eSI_reg }
385 #define Ybr { REP_Fixup, eDI_reg }
386 #define Yvr { REP_Fixup, eDI_reg }
387 #define Yzr { REP_Fixup, eDI_reg }
388 #define indirDXr { REP_Fixup, indir_dx_reg }
389 #define ALr { REP_Fixup, al_reg }
390 #define eAXr { REP_Fixup, eAX_reg }
391
392 #define cond_jump_flag { NULL, cond_jump_mode }
393 #define loop_jcxz_flag { NULL, loop_jcxz_mode }
394
395 /* bits in sizeflag */
396 #define SUFFIX_ALWAYS 4
397 #define AFLAG 2
398 #define DFLAG 1
399
400 enum
401 {
402 /* byte operand */
403 b_mode = 1,
404 /* byte operand with operand swapped */
405 b_swap_mode,
406 /* operand size depends on prefixes */
407 v_mode,
408 /* operand size depends on prefixes with operand swapped */
409 v_swap_mode,
410 /* word operand */
411 w_mode,
412 /* double word operand */
413 d_mode,
414 /* double word operand with operand swapped */
415 d_swap_mode,
416 /* quad word operand */
417 q_mode,
418 /* quad word operand with operand swapped */
419 q_swap_mode,
420 /* ten-byte operand */
421 t_mode,
422 /* 16-byte XMM or 32-byte YMM operand */
423 x_mode,
424 /* 16-byte XMM or 32-byte YMM operand with operand swapped */
425 x_swap_mode,
426 /* 16-byte XMM operand */
427 xmm_mode,
428 /* 16-byte XMM or quad word operand */
429 xmmq_mode,
430 /* 32-byte YMM or quad word operand */
431 ymmq_mode,
432 /* d_mode in 32bit, q_mode in 64bit mode. */
433 m_mode,
434 /* pair of v_mode operands */
435 a_mode,
436 cond_jump_mode,
437 loop_jcxz_mode,
438 /* operand size depends on REX prefixes. */
439 dq_mode,
440 /* registers like dq_mode, memory like w_mode. */
441 dqw_mode,
442 /* 4- or 6-byte pointer operand */
443 f_mode,
444 const_1_mode,
445 /* v_mode for stack-related opcodes. */
446 stack_v_mode,
447 /* non-quad operand size depends on prefixes */
448 z_mode,
449 /* 16-byte operand */
450 o_mode,
451 /* registers like dq_mode, memory like b_mode. */
452 dqb_mode,
453 /* registers like dq_mode, memory like d_mode. */
454 dqd_mode,
455 /* normal vex mode */
456 vex_mode,
457 /* 128bit vex mode */
458 vex128_mode,
459 /* 256bit vex mode */
460 vex256_mode,
461 /* operand size depends on the VEX.W bit. */
462 vex_w_dq_mode,
463
464 es_reg,
465 cs_reg,
466 ss_reg,
467 ds_reg,
468 fs_reg,
469 gs_reg,
470
471 eAX_reg,
472 eCX_reg,
473 eDX_reg,
474 eBX_reg,
475 eSP_reg,
476 eBP_reg,
477 eSI_reg,
478 eDI_reg,
479
480 al_reg,
481 cl_reg,
482 dl_reg,
483 bl_reg,
484 ah_reg,
485 ch_reg,
486 dh_reg,
487 bh_reg,
488
489 ax_reg,
490 cx_reg,
491 dx_reg,
492 bx_reg,
493 sp_reg,
494 bp_reg,
495 si_reg,
496 di_reg,
497
498 rAX_reg,
499 rCX_reg,
500 rDX_reg,
501 rBX_reg,
502 rSP_reg,
503 rBP_reg,
504 rSI_reg,
505 rDI_reg,
506
507 z_mode_ax_reg,
508 indir_dx_reg
509 };
510
511 enum
512 {
513 FLOATCODE = 1,
514 USE_REG_TABLE,
515 USE_MOD_TABLE,
516 USE_RM_TABLE,
517 USE_PREFIX_TABLE,
518 USE_X86_64_TABLE,
519 USE_3BYTE_TABLE,
520 USE_XOP_8F_TABLE,
521 USE_VEX_C4_TABLE,
522 USE_VEX_C5_TABLE,
523 USE_VEX_LEN_TABLE
524 };
525
526 #define FLOAT NULL, { { NULL, FLOATCODE } }
527
528 #define DIS386(T, I) NULL, { { NULL, (T)}, { NULL, (I) } }
529 #define REG_TABLE(I) DIS386 (USE_REG_TABLE, (I))
530 #define MOD_TABLE(I) DIS386 (USE_MOD_TABLE, (I))
531 #define RM_TABLE(I) DIS386 (USE_RM_TABLE, (I))
532 #define PREFIX_TABLE(I) DIS386 (USE_PREFIX_TABLE, (I))
533 #define X86_64_TABLE(I) DIS386 (USE_X86_64_TABLE, (I))
534 #define THREE_BYTE_TABLE(I) DIS386 (USE_3BYTE_TABLE, (I))
535 #define XOP_8F_TABLE(I) DIS386 (USE_XOP_8F_TABLE, (I))
536 #define VEX_C4_TABLE(I) DIS386 (USE_VEX_C4_TABLE, (I))
537 #define VEX_C5_TABLE(I) DIS386 (USE_VEX_C5_TABLE, (I))
538 #define VEX_LEN_TABLE(I) DIS386 (USE_VEX_LEN_TABLE, (I))
539
540 enum
541 {
542 REG_80 = 0,
543 REG_81,
544 REG_82,
545 REG_8F,
546 REG_C0,
547 REG_C1,
548 REG_C6,
549 REG_C7,
550 REG_D0,
551 REG_D1,
552 REG_D2,
553 REG_D3,
554 REG_F6,
555 REG_F7,
556 REG_FE,
557 REG_FF,
558 REG_0F00,
559 REG_0F01,
560 REG_0F0D,
561 REG_0F18,
562 REG_0F71,
563 REG_0F72,
564 REG_0F73,
565 REG_0FA6,
566 REG_0FA7,
567 REG_0FAE,
568 REG_0FBA,
569 REG_0FC7,
570 REG_VEX_71,
571 REG_VEX_72,
572 REG_VEX_73,
573 REG_VEX_AE,
574 REG_XOP_LWPCB,
575 REG_XOP_LWP
576 };
577
578 enum
579 {
580 MOD_8D = 0,
581 MOD_0F01_REG_0,
582 MOD_0F01_REG_1,
583 MOD_0F01_REG_2,
584 MOD_0F01_REG_3,
585 MOD_0F01_REG_7,
586 MOD_0F12_PREFIX_0,
587 MOD_0F13,
588 MOD_0F16_PREFIX_0,
589 MOD_0F17,
590 MOD_0F18_REG_0,
591 MOD_0F18_REG_1,
592 MOD_0F18_REG_2,
593 MOD_0F18_REG_3,
594 MOD_0F20,
595 MOD_0F21,
596 MOD_0F22,
597 MOD_0F23,
598 MOD_0F24,
599 MOD_0F26,
600 MOD_0F2B_PREFIX_0,
601 MOD_0F2B_PREFIX_1,
602 MOD_0F2B_PREFIX_2,
603 MOD_0F2B_PREFIX_3,
604 MOD_0F51,
605 MOD_0F71_REG_2,
606 MOD_0F71_REG_4,
607 MOD_0F71_REG_6,
608 MOD_0F72_REG_2,
609 MOD_0F72_REG_4,
610 MOD_0F72_REG_6,
611 MOD_0F73_REG_2,
612 MOD_0F73_REG_3,
613 MOD_0F73_REG_6,
614 MOD_0F73_REG_7,
615 MOD_0FAE_REG_0,
616 MOD_0FAE_REG_1,
617 MOD_0FAE_REG_2,
618 MOD_0FAE_REG_3,
619 MOD_0FAE_REG_4,
620 MOD_0FAE_REG_5,
621 MOD_0FAE_REG_6,
622 MOD_0FAE_REG_7,
623 MOD_0FB2,
624 MOD_0FB4,
625 MOD_0FB5,
626 MOD_0FC7_REG_6,
627 MOD_0FC7_REG_7,
628 MOD_0FD7,
629 MOD_0FE7_PREFIX_2,
630 MOD_0FF0_PREFIX_3,
631 MOD_0F382A_PREFIX_2,
632 MOD_62_32BIT,
633 MOD_C4_32BIT,
634 MOD_C5_32BIT,
635 MOD_VEX_12_PREFIX_0,
636 MOD_VEX_13,
637 MOD_VEX_16_PREFIX_0,
638 MOD_VEX_17,
639 MOD_VEX_2B,
640 MOD_VEX_51,
641 MOD_VEX_71_REG_2,
642 MOD_VEX_71_REG_4,
643 MOD_VEX_71_REG_6,
644 MOD_VEX_72_REG_2,
645 MOD_VEX_72_REG_4,
646 MOD_VEX_72_REG_6,
647 MOD_VEX_73_REG_2,
648 MOD_VEX_73_REG_3,
649 MOD_VEX_73_REG_6,
650 MOD_VEX_73_REG_7,
651 MOD_VEX_AE_REG_2,
652 MOD_VEX_AE_REG_3,
653 MOD_VEX_D7_PREFIX_2,
654 MOD_VEX_E7_PREFIX_2,
655 MOD_VEX_F0_PREFIX_3,
656 MOD_VEX_3818_PREFIX_2,
657 MOD_VEX_3819_PREFIX_2,
658 MOD_VEX_381A_PREFIX_2,
659 MOD_VEX_382A_PREFIX_2,
660 MOD_VEX_382C_PREFIX_2,
661 MOD_VEX_382D_PREFIX_2,
662 MOD_VEX_382E_PREFIX_2,
663 MOD_VEX_382F_PREFIX_2
664 };
665
666 enum
667 {
668 RM_0F01_REG_0 = 0,
669 RM_0F01_REG_1,
670 RM_0F01_REG_2,
671 RM_0F01_REG_3,
672 RM_0F01_REG_7,
673 RM_0FAE_REG_5,
674 RM_0FAE_REG_6,
675 RM_0FAE_REG_7
676 };
677
678 enum
679 {
680 PREFIX_90 = 0,
681 PREFIX_0F10,
682 PREFIX_0F11,
683 PREFIX_0F12,
684 PREFIX_0F16,
685 PREFIX_0F2A,
686 PREFIX_0F2B,
687 PREFIX_0F2C,
688 PREFIX_0F2D,
689 PREFIX_0F2E,
690 PREFIX_0F2F,
691 PREFIX_0F51,
692 PREFIX_0F52,
693 PREFIX_0F53,
694 PREFIX_0F58,
695 PREFIX_0F59,
696 PREFIX_0F5A,
697 PREFIX_0F5B,
698 PREFIX_0F5C,
699 PREFIX_0F5D,
700 PREFIX_0F5E,
701 PREFIX_0F5F,
702 PREFIX_0F60,
703 PREFIX_0F61,
704 PREFIX_0F62,
705 PREFIX_0F6C,
706 PREFIX_0F6D,
707 PREFIX_0F6F,
708 PREFIX_0F70,
709 PREFIX_0F73_REG_3,
710 PREFIX_0F73_REG_7,
711 PREFIX_0F78,
712 PREFIX_0F79,
713 PREFIX_0F7C,
714 PREFIX_0F7D,
715 PREFIX_0F7E,
716 PREFIX_0F7F,
717 PREFIX_0FB8,
718 PREFIX_0FBD,
719 PREFIX_0FC2,
720 PREFIX_0FC3,
721 PREFIX_0FC7_REG_6,
722 PREFIX_0FD0,
723 PREFIX_0FD6,
724 PREFIX_0FE6,
725 PREFIX_0FE7,
726 PREFIX_0FF0,
727 PREFIX_0FF7,
728 PREFIX_0F3810,
729 PREFIX_0F3814,
730 PREFIX_0F3815,
731 PREFIX_0F3817,
732 PREFIX_0F3820,
733 PREFIX_0F3821,
734 PREFIX_0F3822,
735 PREFIX_0F3823,
736 PREFIX_0F3824,
737 PREFIX_0F3825,
738 PREFIX_0F3828,
739 PREFIX_0F3829,
740 PREFIX_0F382A,
741 PREFIX_0F382B,
742 PREFIX_0F3830,
743 PREFIX_0F3831,
744 PREFIX_0F3832,
745 PREFIX_0F3833,
746 PREFIX_0F3834,
747 PREFIX_0F3835,
748 PREFIX_0F3837,
749 PREFIX_0F3838,
750 PREFIX_0F3839,
751 PREFIX_0F383A,
752 PREFIX_0F383B,
753 PREFIX_0F383C,
754 PREFIX_0F383D,
755 PREFIX_0F383E,
756 PREFIX_0F383F,
757 PREFIX_0F3840,
758 PREFIX_0F3841,
759 PREFIX_0F3880,
760 PREFIX_0F3881,
761 PREFIX_0F38DB,
762 PREFIX_0F38DC,
763 PREFIX_0F38DD,
764 PREFIX_0F38DE,
765 PREFIX_0F38DF,
766 PREFIX_0F38F0,
767 PREFIX_0F38F1,
768 PREFIX_0F3A08,
769 PREFIX_0F3A09,
770 PREFIX_0F3A0A,
771 PREFIX_0F3A0B,
772 PREFIX_0F3A0C,
773 PREFIX_0F3A0D,
774 PREFIX_0F3A0E,
775 PREFIX_0F3A14,
776 PREFIX_0F3A15,
777 PREFIX_0F3A16,
778 PREFIX_0F3A17,
779 PREFIX_0F3A20,
780 PREFIX_0F3A21,
781 PREFIX_0F3A22,
782 PREFIX_0F3A40,
783 PREFIX_0F3A41,
784 PREFIX_0F3A42,
785 PREFIX_0F3A44,
786 PREFIX_0F3A60,
787 PREFIX_0F3A61,
788 PREFIX_0F3A62,
789 PREFIX_0F3A63,
790 PREFIX_0F3ADF,
791 PREFIX_VEX_10,
792 PREFIX_VEX_11,
793 PREFIX_VEX_12,
794 PREFIX_VEX_16,
795 PREFIX_VEX_2A,
796 PREFIX_VEX_2C,
797 PREFIX_VEX_2D,
798 PREFIX_VEX_2E,
799 PREFIX_VEX_2F,
800 PREFIX_VEX_51,
801 PREFIX_VEX_52,
802 PREFIX_VEX_53,
803 PREFIX_VEX_58,
804 PREFIX_VEX_59,
805 PREFIX_VEX_5A,
806 PREFIX_VEX_5B,
807 PREFIX_VEX_5C,
808 PREFIX_VEX_5D,
809 PREFIX_VEX_5E,
810 PREFIX_VEX_5F,
811 PREFIX_VEX_60,
812 PREFIX_VEX_61,
813 PREFIX_VEX_62,
814 PREFIX_VEX_63,
815 PREFIX_VEX_64,
816 PREFIX_VEX_65,
817 PREFIX_VEX_66,
818 PREFIX_VEX_67,
819 PREFIX_VEX_68,
820 PREFIX_VEX_69,
821 PREFIX_VEX_6A,
822 PREFIX_VEX_6B,
823 PREFIX_VEX_6C,
824 PREFIX_VEX_6D,
825 PREFIX_VEX_6E,
826 PREFIX_VEX_6F,
827 PREFIX_VEX_70,
828 PREFIX_VEX_71_REG_2,
829 PREFIX_VEX_71_REG_4,
830 PREFIX_VEX_71_REG_6,
831 PREFIX_VEX_72_REG_2,
832 PREFIX_VEX_72_REG_4,
833 PREFIX_VEX_72_REG_6,
834 PREFIX_VEX_73_REG_2,
835 PREFIX_VEX_73_REG_3,
836 PREFIX_VEX_73_REG_6,
837 PREFIX_VEX_73_REG_7,
838 PREFIX_VEX_74,
839 PREFIX_VEX_75,
840 PREFIX_VEX_76,
841 PREFIX_VEX_77,
842 PREFIX_VEX_7C,
843 PREFIX_VEX_7D,
844 PREFIX_VEX_7E,
845 PREFIX_VEX_7F,
846 PREFIX_VEX_C2,
847 PREFIX_VEX_C4,
848 PREFIX_VEX_C5,
849 PREFIX_VEX_D0,
850 PREFIX_VEX_D1,
851 PREFIX_VEX_D2,
852 PREFIX_VEX_D3,
853 PREFIX_VEX_D4,
854 PREFIX_VEX_D5,
855 PREFIX_VEX_D6,
856 PREFIX_VEX_D7,
857 PREFIX_VEX_D8,
858 PREFIX_VEX_D9,
859 PREFIX_VEX_DA,
860 PREFIX_VEX_DB,
861 PREFIX_VEX_DC,
862 PREFIX_VEX_DD,
863 PREFIX_VEX_DE,
864 PREFIX_VEX_DF,
865 PREFIX_VEX_E0,
866 PREFIX_VEX_E1,
867 PREFIX_VEX_E2,
868 PREFIX_VEX_E3,
869 PREFIX_VEX_E4,
870 PREFIX_VEX_E5,
871 PREFIX_VEX_E6,
872 PREFIX_VEX_E7,
873 PREFIX_VEX_E8,
874 PREFIX_VEX_E9,
875 PREFIX_VEX_EA,
876 PREFIX_VEX_EB,
877 PREFIX_VEX_EC,
878 PREFIX_VEX_ED,
879 PREFIX_VEX_EE,
880 PREFIX_VEX_EF,
881 PREFIX_VEX_F0,
882 PREFIX_VEX_F1,
883 PREFIX_VEX_F2,
884 PREFIX_VEX_F3,
885 PREFIX_VEX_F4,
886 PREFIX_VEX_F5,
887 PREFIX_VEX_F6,
888 PREFIX_VEX_F7,
889 PREFIX_VEX_F8,
890 PREFIX_VEX_F9,
891 PREFIX_VEX_FA,
892 PREFIX_VEX_FB,
893 PREFIX_VEX_FC,
894 PREFIX_VEX_FD,
895 PREFIX_VEX_FE,
896 PREFIX_VEX_3800,
897 PREFIX_VEX_3801,
898 PREFIX_VEX_3802,
899 PREFIX_VEX_3803,
900 PREFIX_VEX_3804,
901 PREFIX_VEX_3805,
902 PREFIX_VEX_3806,
903 PREFIX_VEX_3807,
904 PREFIX_VEX_3808,
905 PREFIX_VEX_3809,
906 PREFIX_VEX_380A,
907 PREFIX_VEX_380B,
908 PREFIX_VEX_380C,
909 PREFIX_VEX_380D,
910 PREFIX_VEX_380E,
911 PREFIX_VEX_380F,
912 PREFIX_VEX_3817,
913 PREFIX_VEX_3818,
914 PREFIX_VEX_3819,
915 PREFIX_VEX_381A,
916 PREFIX_VEX_381C,
917 PREFIX_VEX_381D,
918 PREFIX_VEX_381E,
919 PREFIX_VEX_3820,
920 PREFIX_VEX_3821,
921 PREFIX_VEX_3822,
922 PREFIX_VEX_3823,
923 PREFIX_VEX_3824,
924 PREFIX_VEX_3825,
925 PREFIX_VEX_3828,
926 PREFIX_VEX_3829,
927 PREFIX_VEX_382A,
928 PREFIX_VEX_382B,
929 PREFIX_VEX_382C,
930 PREFIX_VEX_382D,
931 PREFIX_VEX_382E,
932 PREFIX_VEX_382F,
933 PREFIX_VEX_3830,
934 PREFIX_VEX_3831,
935 PREFIX_VEX_3832,
936 PREFIX_VEX_3833,
937 PREFIX_VEX_3834,
938 PREFIX_VEX_3835,
939 PREFIX_VEX_3837,
940 PREFIX_VEX_3838,
941 PREFIX_VEX_3839,
942 PREFIX_VEX_383A,
943 PREFIX_VEX_383B,
944 PREFIX_VEX_383C,
945 PREFIX_VEX_383D,
946 PREFIX_VEX_383E,
947 PREFIX_VEX_383F,
948 PREFIX_VEX_3840,
949 PREFIX_VEX_3841,
950 PREFIX_VEX_3896,
951 PREFIX_VEX_3897,
952 PREFIX_VEX_3898,
953 PREFIX_VEX_3899,
954 PREFIX_VEX_389A,
955 PREFIX_VEX_389B,
956 PREFIX_VEX_389C,
957 PREFIX_VEX_389D,
958 PREFIX_VEX_389E,
959 PREFIX_VEX_389F,
960 PREFIX_VEX_38A6,
961 PREFIX_VEX_38A7,
962 PREFIX_VEX_38A8,
963 PREFIX_VEX_38A9,
964 PREFIX_VEX_38AA,
965 PREFIX_VEX_38AB,
966 PREFIX_VEX_38AC,
967 PREFIX_VEX_38AD,
968 PREFIX_VEX_38AE,
969 PREFIX_VEX_38AF,
970 PREFIX_VEX_38B6,
971 PREFIX_VEX_38B7,
972 PREFIX_VEX_38B8,
973 PREFIX_VEX_38B9,
974 PREFIX_VEX_38BA,
975 PREFIX_VEX_38BB,
976 PREFIX_VEX_38BC,
977 PREFIX_VEX_38BD,
978 PREFIX_VEX_38BE,
979 PREFIX_VEX_38BF,
980 PREFIX_VEX_38DB,
981 PREFIX_VEX_38DC,
982 PREFIX_VEX_38DD,
983 PREFIX_VEX_38DE,
984 PREFIX_VEX_38DF,
985 PREFIX_VEX_3A04,
986 PREFIX_VEX_3A05,
987 PREFIX_VEX_3A06,
988 PREFIX_VEX_3A08,
989 PREFIX_VEX_3A09,
990 PREFIX_VEX_3A0A,
991 PREFIX_VEX_3A0B,
992 PREFIX_VEX_3A0C,
993 PREFIX_VEX_3A0D,
994 PREFIX_VEX_3A0E,
995 PREFIX_VEX_3A0F,
996 PREFIX_VEX_3A14,
997 PREFIX_VEX_3A15,
998 PREFIX_VEX_3A16,
999 PREFIX_VEX_3A17,
1000 PREFIX_VEX_3A18,
1001 PREFIX_VEX_3A19,
1002 PREFIX_VEX_3A20,
1003 PREFIX_VEX_3A21,
1004 PREFIX_VEX_3A22,
1005 PREFIX_VEX_3A40,
1006 PREFIX_VEX_3A41,
1007 PREFIX_VEX_3A42,
1008 PREFIX_VEX_3A44,
1009 PREFIX_VEX_3A4A,
1010 PREFIX_VEX_3A4B,
1011 PREFIX_VEX_3A4C,
1012 PREFIX_VEX_3A5C,
1013 PREFIX_VEX_3A5D,
1014 PREFIX_VEX_3A5E,
1015 PREFIX_VEX_3A5F,
1016 PREFIX_VEX_3A60,
1017 PREFIX_VEX_3A61,
1018 PREFIX_VEX_3A62,
1019 PREFIX_VEX_3A63,
1020 PREFIX_VEX_3A68,
1021 PREFIX_VEX_3A69,
1022 PREFIX_VEX_3A6A,
1023 PREFIX_VEX_3A6B,
1024 PREFIX_VEX_3A6C,
1025 PREFIX_VEX_3A6D,
1026 PREFIX_VEX_3A6E,
1027 PREFIX_VEX_3A6F,
1028 PREFIX_VEX_3A78,
1029 PREFIX_VEX_3A79,
1030 PREFIX_VEX_3A7A,
1031 PREFIX_VEX_3A7B,
1032 PREFIX_VEX_3A7C,
1033 PREFIX_VEX_3A7D,
1034 PREFIX_VEX_3A7E,
1035 PREFIX_VEX_3A7F,
1036 PREFIX_VEX_3ADF
1037 };
1038
1039 enum
1040 {
1041 X86_64_06 = 0,
1042 X86_64_07,
1043 X86_64_0D,
1044 X86_64_16,
1045 X86_64_17,
1046 X86_64_1E,
1047 X86_64_1F,
1048 X86_64_27,
1049 X86_64_2F,
1050 X86_64_37,
1051 X86_64_3F,
1052 X86_64_60,
1053 X86_64_61,
1054 X86_64_62,
1055 X86_64_63,
1056 X86_64_6D,
1057 X86_64_6F,
1058 X86_64_9A,
1059 X86_64_C4,
1060 X86_64_C5,
1061 X86_64_CE,
1062 X86_64_D4,
1063 X86_64_D5,
1064 X86_64_EA,
1065 X86_64_0F01_REG_0,
1066 X86_64_0F01_REG_1,
1067 X86_64_0F01_REG_2,
1068 X86_64_0F01_REG_3
1069 };
1070
1071 enum
1072 {
1073 THREE_BYTE_0F38 = 0,
1074 THREE_BYTE_0F3A,
1075 THREE_BYTE_0F7A
1076 };
1077
1078 enum
1079 {
1080 XOP_09 = 0,
1081 XOP_0A
1082 };
1083
1084 enum
1085 {
1086 VEX_0F = 0,
1087 VEX_0F38,
1088 VEX_0F3A
1089 };
1090
1091 enum
1092 {
1093 VEX_LEN_10_P_1 = 0,
1094 VEX_LEN_10_P_3,
1095 VEX_LEN_11_P_1,
1096 VEX_LEN_11_P_3,
1097 VEX_LEN_12_P_0_M_0,
1098 VEX_LEN_12_P_0_M_1,
1099 VEX_LEN_12_P_2,
1100 VEX_LEN_13_M_0,
1101 VEX_LEN_16_P_0_M_0,
1102 VEX_LEN_16_P_0_M_1,
1103 VEX_LEN_16_P_2,
1104 VEX_LEN_17_M_0,
1105 VEX_LEN_2A_P_1,
1106 VEX_LEN_2A_P_3,
1107 VEX_LEN_2C_P_1,
1108 VEX_LEN_2C_P_3,
1109 VEX_LEN_2D_P_1,
1110 VEX_LEN_2D_P_3,
1111 VEX_LEN_2E_P_0,
1112 VEX_LEN_2E_P_2,
1113 VEX_LEN_2F_P_0,
1114 VEX_LEN_2F_P_2,
1115 VEX_LEN_51_P_1,
1116 VEX_LEN_51_P_3,
1117 VEX_LEN_52_P_1,
1118 VEX_LEN_53_P_1,
1119 VEX_LEN_58_P_1,
1120 VEX_LEN_58_P_3,
1121 VEX_LEN_59_P_1,
1122 VEX_LEN_59_P_3,
1123 VEX_LEN_5A_P_1,
1124 VEX_LEN_5A_P_3,
1125 VEX_LEN_5C_P_1,
1126 VEX_LEN_5C_P_3,
1127 VEX_LEN_5D_P_1,
1128 VEX_LEN_5D_P_3,
1129 VEX_LEN_5E_P_1,
1130 VEX_LEN_5E_P_3,
1131 VEX_LEN_5F_P_1,
1132 VEX_LEN_5F_P_3,
1133 VEX_LEN_60_P_2,
1134 VEX_LEN_61_P_2,
1135 VEX_LEN_62_P_2,
1136 VEX_LEN_63_P_2,
1137 VEX_LEN_64_P_2,
1138 VEX_LEN_65_P_2,
1139 VEX_LEN_66_P_2,
1140 VEX_LEN_67_P_2,
1141 VEX_LEN_68_P_2,
1142 VEX_LEN_69_P_2,
1143 VEX_LEN_6A_P_2,
1144 VEX_LEN_6B_P_2,
1145 VEX_LEN_6C_P_2,
1146 VEX_LEN_6D_P_2,
1147 VEX_LEN_6E_P_2,
1148 VEX_LEN_70_P_1,
1149 VEX_LEN_70_P_2,
1150 VEX_LEN_70_P_3,
1151 VEX_LEN_71_R_2_P_2,
1152 VEX_LEN_71_R_4_P_2,
1153 VEX_LEN_71_R_6_P_2,
1154 VEX_LEN_72_R_2_P_2,
1155 VEX_LEN_72_R_4_P_2,
1156 VEX_LEN_72_R_6_P_2,
1157 VEX_LEN_73_R_2_P_2,
1158 VEX_LEN_73_R_3_P_2,
1159 VEX_LEN_73_R_6_P_2,
1160 VEX_LEN_73_R_7_P_2,
1161 VEX_LEN_74_P_2,
1162 VEX_LEN_75_P_2,
1163 VEX_LEN_76_P_2,
1164 VEX_LEN_7E_P_1,
1165 VEX_LEN_7E_P_2,
1166 VEX_LEN_AE_R_2_M_0,
1167 VEX_LEN_AE_R_3_M_0,
1168 VEX_LEN_C2_P_1,
1169 VEX_LEN_C2_P_3,
1170 VEX_LEN_C4_P_2,
1171 VEX_LEN_C5_P_2,
1172 VEX_LEN_D1_P_2,
1173 VEX_LEN_D2_P_2,
1174 VEX_LEN_D3_P_2,
1175 VEX_LEN_D4_P_2,
1176 VEX_LEN_D5_P_2,
1177 VEX_LEN_D6_P_2,
1178 VEX_LEN_D7_P_2_M_1,
1179 VEX_LEN_D8_P_2,
1180 VEX_LEN_D9_P_2,
1181 VEX_LEN_DA_P_2,
1182 VEX_LEN_DB_P_2,
1183 VEX_LEN_DC_P_2,
1184 VEX_LEN_DD_P_2,
1185 VEX_LEN_DE_P_2,
1186 VEX_LEN_DF_P_2,
1187 VEX_LEN_E0_P_2,
1188 VEX_LEN_E1_P_2,
1189 VEX_LEN_E2_P_2,
1190 VEX_LEN_E3_P_2,
1191 VEX_LEN_E4_P_2,
1192 VEX_LEN_E5_P_2,
1193 VEX_LEN_E8_P_2,
1194 VEX_LEN_E9_P_2,
1195 VEX_LEN_EA_P_2,
1196 VEX_LEN_EB_P_2,
1197 VEX_LEN_EC_P_2,
1198 VEX_LEN_ED_P_2,
1199 VEX_LEN_EE_P_2,
1200 VEX_LEN_EF_P_2,
1201 VEX_LEN_F1_P_2,
1202 VEX_LEN_F2_P_2,
1203 VEX_LEN_F3_P_2,
1204 VEX_LEN_F4_P_2,
1205 VEX_LEN_F5_P_2,
1206 VEX_LEN_F6_P_2,
1207 VEX_LEN_F7_P_2,
1208 VEX_LEN_F8_P_2,
1209 VEX_LEN_F9_P_2,
1210 VEX_LEN_FA_P_2,
1211 VEX_LEN_FB_P_2,
1212 VEX_LEN_FC_P_2,
1213 VEX_LEN_FD_P_2,
1214 VEX_LEN_FE_P_2,
1215 VEX_LEN_3800_P_2,
1216 VEX_LEN_3801_P_2,
1217 VEX_LEN_3802_P_2,
1218 VEX_LEN_3803_P_2,
1219 VEX_LEN_3804_P_2,
1220 VEX_LEN_3805_P_2,
1221 VEX_LEN_3806_P_2,
1222 VEX_LEN_3807_P_2,
1223 VEX_LEN_3808_P_2,
1224 VEX_LEN_3809_P_2,
1225 VEX_LEN_380A_P_2,
1226 VEX_LEN_380B_P_2,
1227 VEX_LEN_3819_P_2_M_0,
1228 VEX_LEN_381A_P_2_M_0,
1229 VEX_LEN_381C_P_2,
1230 VEX_LEN_381D_P_2,
1231 VEX_LEN_381E_P_2,
1232 VEX_LEN_3820_P_2,
1233 VEX_LEN_3821_P_2,
1234 VEX_LEN_3822_P_2,
1235 VEX_LEN_3823_P_2,
1236 VEX_LEN_3824_P_2,
1237 VEX_LEN_3825_P_2,
1238 VEX_LEN_3828_P_2,
1239 VEX_LEN_3829_P_2,
1240 VEX_LEN_382A_P_2_M_0,
1241 VEX_LEN_382B_P_2,
1242 VEX_LEN_3830_P_2,
1243 VEX_LEN_3831_P_2,
1244 VEX_LEN_3832_P_2,
1245 VEX_LEN_3833_P_2,
1246 VEX_LEN_3834_P_2,
1247 VEX_LEN_3835_P_2,
1248 VEX_LEN_3837_P_2,
1249 VEX_LEN_3838_P_2,
1250 VEX_LEN_3839_P_2,
1251 VEX_LEN_383A_P_2,
1252 VEX_LEN_383B_P_2,
1253 VEX_LEN_383C_P_2,
1254 VEX_LEN_383D_P_2,
1255 VEX_LEN_383E_P_2,
1256 VEX_LEN_383F_P_2,
1257 VEX_LEN_3840_P_2,
1258 VEX_LEN_3841_P_2,
1259 VEX_LEN_38DB_P_2,
1260 VEX_LEN_38DC_P_2,
1261 VEX_LEN_38DD_P_2,
1262 VEX_LEN_38DE_P_2,
1263 VEX_LEN_38DF_P_2,
1264 VEX_LEN_3A06_P_2,
1265 VEX_LEN_3A0A_P_2,
1266 VEX_LEN_3A0B_P_2,
1267 VEX_LEN_3A0E_P_2,
1268 VEX_LEN_3A0F_P_2,
1269 VEX_LEN_3A14_P_2,
1270 VEX_LEN_3A15_P_2,
1271 VEX_LEN_3A16_P_2,
1272 VEX_LEN_3A17_P_2,
1273 VEX_LEN_3A18_P_2,
1274 VEX_LEN_3A19_P_2,
1275 VEX_LEN_3A20_P_2,
1276 VEX_LEN_3A21_P_2,
1277 VEX_LEN_3A22_P_2,
1278 VEX_LEN_3A41_P_2,
1279 VEX_LEN_3A42_P_2,
1280 VEX_LEN_3A44_P_2,
1281 VEX_LEN_3A4C_P_2,
1282 VEX_LEN_3A60_P_2,
1283 VEX_LEN_3A61_P_2,
1284 VEX_LEN_3A62_P_2,
1285 VEX_LEN_3A63_P_2,
1286 VEX_LEN_3A6A_P_2,
1287 VEX_LEN_3A6B_P_2,
1288 VEX_LEN_3A6E_P_2,
1289 VEX_LEN_3A6F_P_2,
1290 VEX_LEN_3A7A_P_2,
1291 VEX_LEN_3A7B_P_2,
1292 VEX_LEN_3A7E_P_2,
1293 VEX_LEN_3A7F_P_2,
1294 VEX_LEN_3ADF_P_2
1295 };
1296
1297 typedef void (*op_rtn) (int bytemode, int sizeflag);
1298
1299 struct dis386 {
1300 const char *name;
1301 struct
1302 {
1303 op_rtn rtn;
1304 int bytemode;
1305 } op[MAX_OPERANDS];
1306 };
1307
1308 /* Upper case letters in the instruction names here are macros.
1309 'A' => print 'b' if no register operands or suffix_always is true
1310 'B' => print 'b' if suffix_always is true
1311 'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
1312 size prefix
1313 'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
1314 suffix_always is true
1315 'E' => print 'e' if 32-bit form of jcxz
1316 'F' => print 'w' or 'l' depending on address size prefix (loop insns)
1317 'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
1318 'H' => print ",pt" or ",pn" branch hint
1319 'I' => honor following macro letter even in Intel mode (implemented only
1320 for some of the macro letters)
1321 'J' => print 'l'
1322 'K' => print 'd' or 'q' if rex prefix is present.
1323 'L' => print 'l' if suffix_always is true
1324 'M' => print 'r' if intel_mnemonic is false.
1325 'N' => print 'n' if instruction has no wait "prefix"
1326 'O' => print 'd' or 'o' (or 'q' in Intel mode)
1327 'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix,
1328 or suffix_always is true. print 'q' if rex prefix is present.
1329 'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
1330 is true
1331 'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
1332 'S' => print 'w', 'l' or 'q' if suffix_always is true
1333 'T' => print 'q' in 64bit mode and behave as 'P' otherwise
1334 'U' => print 'q' in 64bit mode and behave as 'Q' otherwise
1335 'V' => print 'q' in 64bit mode and behave as 'S' otherwise
1336 'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
1337 'X' => print 's', 'd' depending on data16 prefix (for XMM)
1338 'Y' => 'q' if instruction has an REX 64bit overwrite prefix and
1339 suffix_always is true.
1340 'Z' => print 'q' in 64bit mode and behave as 'L' otherwise
1341 '!' => change condition from true to false or from false to true.
1342 '%' => add 1 upper case letter to the macro.
1343
1344 2 upper case letter macros:
1345 "XY" => print 'x' or 'y' if no register operands or suffix_always
1346 is true.
1347 "XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
1348 "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand
1349 or suffix_always is true
1350 "LB" => print "abs" in 64bit mode and behave as 'B' otherwise
1351 "LS" => print "abs" in 64bit mode and behave as 'S' otherwise
1352 "LV" => print "abs" for 64bit operand and behave as 'S' otherwise
1353
1354 Many of the above letters print nothing in Intel mode. See "putop"
1355 for the details.
1356
1357 Braces '{' and '}', and vertical bars '|', indicate alternative
1358 mnemonic strings for AT&T and Intel. */
1359
1360 static const struct dis386 dis386[] = {
1361 /* 00 */
1362 { "addB", { Eb, Gb } },
1363 { "addS", { Ev, Gv } },
1364 { "addB", { Gb, EbS } },
1365 { "addS", { Gv, EvS } },
1366 { "addB", { AL, Ib } },
1367 { "addS", { eAX, Iv } },
1368 { X86_64_TABLE (X86_64_06) },
1369 { X86_64_TABLE (X86_64_07) },
1370 /* 08 */
1371 { "orB", { Eb, Gb } },
1372 { "orS", { Ev, Gv } },
1373 { "orB", { Gb, EbS } },
1374 { "orS", { Gv, EvS } },
1375 { "orB", { AL, Ib } },
1376 { "orS", { eAX, Iv } },
1377 { X86_64_TABLE (X86_64_0D) },
1378 { "(bad)", { XX } }, /* 0x0f extended opcode escape */
1379 /* 10 */
1380 { "adcB", { Eb, Gb } },
1381 { "adcS", { Ev, Gv } },
1382 { "adcB", { Gb, EbS } },
1383 { "adcS", { Gv, EvS } },
1384 { "adcB", { AL, Ib } },
1385 { "adcS", { eAX, Iv } },
1386 { X86_64_TABLE (X86_64_16) },
1387 { X86_64_TABLE (X86_64_17) },
1388 /* 18 */
1389 { "sbbB", { Eb, Gb } },
1390 { "sbbS", { Ev, Gv } },
1391 { "sbbB", { Gb, EbS } },
1392 { "sbbS", { Gv, EvS } },
1393 { "sbbB", { AL, Ib } },
1394 { "sbbS", { eAX, Iv } },
1395 { X86_64_TABLE (X86_64_1E) },
1396 { X86_64_TABLE (X86_64_1F) },
1397 /* 20 */
1398 { "andB", { Eb, Gb } },
1399 { "andS", { Ev, Gv } },
1400 { "andB", { Gb, EbS } },
1401 { "andS", { Gv, EvS } },
1402 { "andB", { AL, Ib } },
1403 { "andS", { eAX, Iv } },
1404 { "(bad)", { XX } }, /* SEG ES prefix */
1405 { X86_64_TABLE (X86_64_27) },
1406 /* 28 */
1407 { "subB", { Eb, Gb } },
1408 { "subS", { Ev, Gv } },
1409 { "subB", { Gb, EbS } },
1410 { "subS", { Gv, EvS } },
1411 { "subB", { AL, Ib } },
1412 { "subS", { eAX, Iv } },
1413 { "(bad)", { XX } }, /* SEG CS prefix */
1414 { X86_64_TABLE (X86_64_2F) },
1415 /* 30 */
1416 { "xorB", { Eb, Gb } },
1417 { "xorS", { Ev, Gv } },
1418 { "xorB", { Gb, EbS } },
1419 { "xorS", { Gv, EvS } },
1420 { "xorB", { AL, Ib } },
1421 { "xorS", { eAX, Iv } },
1422 { "(bad)", { XX } }, /* SEG SS prefix */
1423 { X86_64_TABLE (X86_64_37) },
1424 /* 38 */
1425 { "cmpB", { Eb, Gb } },
1426 { "cmpS", { Ev, Gv } },
1427 { "cmpB", { Gb, EbS } },
1428 { "cmpS", { Gv, EvS } },
1429 { "cmpB", { AL, Ib } },
1430 { "cmpS", { eAX, Iv } },
1431 { "(bad)", { XX } }, /* SEG DS prefix */
1432 { X86_64_TABLE (X86_64_3F) },
1433 /* 40 */
1434 { "inc{S|}", { RMeAX } },
1435 { "inc{S|}", { RMeCX } },
1436 { "inc{S|}", { RMeDX } },
1437 { "inc{S|}", { RMeBX } },
1438 { "inc{S|}", { RMeSP } },
1439 { "inc{S|}", { RMeBP } },
1440 { "inc{S|}", { RMeSI } },
1441 { "inc{S|}", { RMeDI } },
1442 /* 48 */
1443 { "dec{S|}", { RMeAX } },
1444 { "dec{S|}", { RMeCX } },
1445 { "dec{S|}", { RMeDX } },
1446 { "dec{S|}", { RMeBX } },
1447 { "dec{S|}", { RMeSP } },
1448 { "dec{S|}", { RMeBP } },
1449 { "dec{S|}", { RMeSI } },
1450 { "dec{S|}", { RMeDI } },
1451 /* 50 */
1452 { "pushV", { RMrAX } },
1453 { "pushV", { RMrCX } },
1454 { "pushV", { RMrDX } },
1455 { "pushV", { RMrBX } },
1456 { "pushV", { RMrSP } },
1457 { "pushV", { RMrBP } },
1458 { "pushV", { RMrSI } },
1459 { "pushV", { RMrDI } },
1460 /* 58 */
1461 { "popV", { RMrAX } },
1462 { "popV", { RMrCX } },
1463 { "popV", { RMrDX } },
1464 { "popV", { RMrBX } },
1465 { "popV", { RMrSP } },
1466 { "popV", { RMrBP } },
1467 { "popV", { RMrSI } },
1468 { "popV", { RMrDI } },
1469 /* 60 */
1470 { X86_64_TABLE (X86_64_60) },
1471 { X86_64_TABLE (X86_64_61) },
1472 { X86_64_TABLE (X86_64_62) },
1473 { X86_64_TABLE (X86_64_63) },
1474 { "(bad)", { XX } }, /* seg fs */
1475 { "(bad)", { XX } }, /* seg gs */
1476 { "(bad)", { XX } }, /* op size prefix */
1477 { "(bad)", { XX } }, /* adr size prefix */
1478 /* 68 */
1479 { "pushT", { Iq } },
1480 { "imulS", { Gv, Ev, Iv } },
1481 { "pushT", { sIb } },
1482 { "imulS", { Gv, Ev, sIb } },
1483 { "ins{b|}", { Ybr, indirDX } },
1484 { X86_64_TABLE (X86_64_6D) },
1485 { "outs{b|}", { indirDXr, Xb } },
1486 { X86_64_TABLE (X86_64_6F) },
1487 /* 70 */
1488 { "joH", { Jb, XX, cond_jump_flag } },
1489 { "jnoH", { Jb, XX, cond_jump_flag } },
1490 { "jbH", { Jb, XX, cond_jump_flag } },
1491 { "jaeH", { Jb, XX, cond_jump_flag } },
1492 { "jeH", { Jb, XX, cond_jump_flag } },
1493 { "jneH", { Jb, XX, cond_jump_flag } },
1494 { "jbeH", { Jb, XX, cond_jump_flag } },
1495 { "jaH", { Jb, XX, cond_jump_flag } },
1496 /* 78 */
1497 { "jsH", { Jb, XX, cond_jump_flag } },
1498 { "jnsH", { Jb, XX, cond_jump_flag } },
1499 { "jpH", { Jb, XX, cond_jump_flag } },
1500 { "jnpH", { Jb, XX, cond_jump_flag } },
1501 { "jlH", { Jb, XX, cond_jump_flag } },
1502 { "jgeH", { Jb, XX, cond_jump_flag } },
1503 { "jleH", { Jb, XX, cond_jump_flag } },
1504 { "jgH", { Jb, XX, cond_jump_flag } },
1505 /* 80 */
1506 { REG_TABLE (REG_80) },
1507 { REG_TABLE (REG_81) },
1508 { "(bad)", { XX } },
1509 { REG_TABLE (REG_82) },
1510 { "testB", { Eb, Gb } },
1511 { "testS", { Ev, Gv } },
1512 { "xchgB", { Eb, Gb } },
1513 { "xchgS", { Ev, Gv } },
1514 /* 88 */
1515 { "movB", { Eb, Gb } },
1516 { "movS", { Ev, Gv } },
1517 { "movB", { Gb, EbS } },
1518 { "movS", { Gv, EvS } },
1519 { "movD", { Sv, Sw } },
1520 { MOD_TABLE (MOD_8D) },
1521 { "movD", { Sw, Sv } },
1522 { REG_TABLE (REG_8F) },
1523 /* 90 */
1524 { PREFIX_TABLE (PREFIX_90) },
1525 { "xchgS", { RMeCX, eAX } },
1526 { "xchgS", { RMeDX, eAX } },
1527 { "xchgS", { RMeBX, eAX } },
1528 { "xchgS", { RMeSP, eAX } },
1529 { "xchgS", { RMeBP, eAX } },
1530 { "xchgS", { RMeSI, eAX } },
1531 { "xchgS", { RMeDI, eAX } },
1532 /* 98 */
1533 { "cW{t|}R", { XX } },
1534 { "cR{t|}O", { XX } },
1535 { X86_64_TABLE (X86_64_9A) },
1536 { "(bad)", { XX } }, /* fwait */
1537 { "pushfT", { XX } },
1538 { "popfT", { XX } },
1539 { "sahf", { XX } },
1540 { "lahf", { XX } },
1541 /* a0 */
1542 { "mov%LB", { AL, Ob } },
1543 { "mov%LS", { eAX, Ov } },
1544 { "mov%LB", { Ob, AL } },
1545 { "mov%LS", { Ov, eAX } },
1546 { "movs{b|}", { Ybr, Xb } },
1547 { "movs{R|}", { Yvr, Xv } },
1548 { "cmps{b|}", { Xb, Yb } },
1549 { "cmps{R|}", { Xv, Yv } },
1550 /* a8 */
1551 { "testB", { AL, Ib } },
1552 { "testS", { eAX, Iv } },
1553 { "stosB", { Ybr, AL } },
1554 { "stosS", { Yvr, eAX } },
1555 { "lodsB", { ALr, Xb } },
1556 { "lodsS", { eAXr, Xv } },
1557 { "scasB", { AL, Yb } },
1558 { "scasS", { eAX, Yv } },
1559 /* b0 */
1560 { "movB", { RMAL, Ib } },
1561 { "movB", { RMCL, Ib } },
1562 { "movB", { RMDL, Ib } },
1563 { "movB", { RMBL, Ib } },
1564 { "movB", { RMAH, Ib } },
1565 { "movB", { RMCH, Ib } },
1566 { "movB", { RMDH, Ib } },
1567 { "movB", { RMBH, Ib } },
1568 /* b8 */
1569 { "mov%LV", { RMeAX, Iv64 } },
1570 { "mov%LV", { RMeCX, Iv64 } },
1571 { "mov%LV", { RMeDX, Iv64 } },
1572 { "mov%LV", { RMeBX, Iv64 } },
1573 { "mov%LV", { RMeSP, Iv64 } },
1574 { "mov%LV", { RMeBP, Iv64 } },
1575 { "mov%LV", { RMeSI, Iv64 } },
1576 { "mov%LV", { RMeDI, Iv64 } },
1577 /* c0 */
1578 { REG_TABLE (REG_C0) },
1579 { REG_TABLE (REG_C1) },
1580 { "retT", { Iw } },
1581 { "retT", { XX } },
1582 { X86_64_TABLE (X86_64_C4) },
1583 { X86_64_TABLE (X86_64_C5) },
1584 { REG_TABLE (REG_C6) },
1585 { REG_TABLE (REG_C7) },
1586 /* c8 */
1587 { "enterT", { Iw, Ib } },
1588 { "leaveT", { XX } },
1589 { "Jret{|f}P", { Iw } },
1590 { "Jret{|f}P", { XX } },
1591 { "int3", { XX } },
1592 { "int", { Ib } },
1593 { X86_64_TABLE (X86_64_CE) },
1594 { "iretP", { XX } },
1595 /* d0 */
1596 { REG_TABLE (REG_D0) },
1597 { REG_TABLE (REG_D1) },
1598 { REG_TABLE (REG_D2) },
1599 { REG_TABLE (REG_D3) },
1600 { X86_64_TABLE (X86_64_D4) },
1601 { X86_64_TABLE (X86_64_D5) },
1602 { "(bad)", { XX } },
1603 { "xlat", { DSBX } },
1604 /* d8 */
1605 { FLOAT },
1606 { FLOAT },
1607 { FLOAT },
1608 { FLOAT },
1609 { FLOAT },
1610 { FLOAT },
1611 { FLOAT },
1612 { FLOAT },
1613 /* e0 */
1614 { "loopneFH", { Jb, XX, loop_jcxz_flag } },
1615 { "loopeFH", { Jb, XX, loop_jcxz_flag } },
1616 { "loopFH", { Jb, XX, loop_jcxz_flag } },
1617 { "jEcxzH", { Jb, XX, loop_jcxz_flag } },
1618 { "inB", { AL, Ib } },
1619 { "inG", { zAX, Ib } },
1620 { "outB", { Ib, AL } },
1621 { "outG", { Ib, zAX } },
1622 /* e8 */
1623 { "callT", { Jv } },
1624 { "jmpT", { Jv } },
1625 { X86_64_TABLE (X86_64_EA) },
1626 { "jmp", { Jb } },
1627 { "inB", { AL, indirDX } },
1628 { "inG", { zAX, indirDX } },
1629 { "outB", { indirDX, AL } },
1630 { "outG", { indirDX, zAX } },
1631 /* f0 */
1632 { "(bad)", { XX } }, /* lock prefix */
1633 { "icebp", { XX } },
1634 { "(bad)", { XX } }, /* repne */
1635 { "(bad)", { XX } }, /* repz */
1636 { "hlt", { XX } },
1637 { "cmc", { XX } },
1638 { REG_TABLE (REG_F6) },
1639 { REG_TABLE (REG_F7) },
1640 /* f8 */
1641 { "clc", { XX } },
1642 { "stc", { XX } },
1643 { "cli", { XX } },
1644 { "sti", { XX } },
1645 { "cld", { XX } },
1646 { "std", { XX } },
1647 { REG_TABLE (REG_FE) },
1648 { REG_TABLE (REG_FF) },
1649 };
1650
1651 static const struct dis386 dis386_twobyte[] = {
1652 /* 00 */
1653 { REG_TABLE (REG_0F00 ) },
1654 { REG_TABLE (REG_0F01 ) },
1655 { "larS", { Gv, Ew } },
1656 { "lslS", { Gv, Ew } },
1657 { "(bad)", { XX } },
1658 { "syscall", { XX } },
1659 { "clts", { XX } },
1660 { "sysretP", { XX } },
1661 /* 08 */
1662 { "invd", { XX } },
1663 { "wbinvd", { XX } },
1664 { "(bad)", { XX } },
1665 { "ud2a", { XX } },
1666 { "(bad)", { XX } },
1667 { REG_TABLE (REG_0F0D) },
1668 { "femms", { XX } },
1669 { "", { MX, EM, OPSUF } }, /* See OP_3DNowSuffix. */
1670 /* 10 */
1671 { PREFIX_TABLE (PREFIX_0F10) },
1672 { PREFIX_TABLE (PREFIX_0F11) },
1673 { PREFIX_TABLE (PREFIX_0F12) },
1674 { MOD_TABLE (MOD_0F13) },
1675 { "unpcklpX", { XM, EXx } },
1676 { "unpckhpX", { XM, EXx } },
1677 { PREFIX_TABLE (PREFIX_0F16) },
1678 { MOD_TABLE (MOD_0F17) },
1679 /* 18 */
1680 { REG_TABLE (REG_0F18) },
1681 { "nopQ", { Ev } },
1682 { "nopQ", { Ev } },
1683 { "nopQ", { Ev } },
1684 { "nopQ", { Ev } },
1685 { "nopQ", { Ev } },
1686 { "nopQ", { Ev } },
1687 { "nopQ", { Ev } },
1688 /* 20 */
1689 { MOD_TABLE (MOD_0F20) },
1690 { MOD_TABLE (MOD_0F21) },
1691 { MOD_TABLE (MOD_0F22) },
1692 { MOD_TABLE (MOD_0F23) },
1693 { MOD_TABLE (MOD_0F24) },
1694 { "(bad)", { XX } },
1695 { MOD_TABLE (MOD_0F26) },
1696 { "(bad)", { XX } },
1697 /* 28 */
1698 { "movapX", { XM, EXx } },
1699 { "movapX", { EXxS, XM } },
1700 { PREFIX_TABLE (PREFIX_0F2A) },
1701 { PREFIX_TABLE (PREFIX_0F2B) },
1702 { PREFIX_TABLE (PREFIX_0F2C) },
1703 { PREFIX_TABLE (PREFIX_0F2D) },
1704 { PREFIX_TABLE (PREFIX_0F2E) },
1705 { PREFIX_TABLE (PREFIX_0F2F) },
1706 /* 30 */
1707 { "wrmsr", { XX } },
1708 { "rdtsc", { XX } },
1709 { "rdmsr", { XX } },
1710 { "rdpmc", { XX } },
1711 { "sysenter", { XX } },
1712 { "sysexit", { XX } },
1713 { "(bad)", { XX } },
1714 { "getsec", { XX } },
1715 /* 38 */
1716 { THREE_BYTE_TABLE (THREE_BYTE_0F38) },
1717 { "(bad)", { XX } },
1718 { THREE_BYTE_TABLE (THREE_BYTE_0F3A) },
1719 { "(bad)", { XX } },
1720 { "(bad)", { XX } },
1721 { "(bad)", { XX } },
1722 { "(bad)", { XX } },
1723 { "(bad)", { XX } },
1724 /* 40 */
1725 { "cmovoS", { Gv, Ev } },
1726 { "cmovnoS", { Gv, Ev } },
1727 { "cmovbS", { Gv, Ev } },
1728 { "cmovaeS", { Gv, Ev } },
1729 { "cmoveS", { Gv, Ev } },
1730 { "cmovneS", { Gv, Ev } },
1731 { "cmovbeS", { Gv, Ev } },
1732 { "cmovaS", { Gv, Ev } },
1733 /* 48 */
1734 { "cmovsS", { Gv, Ev } },
1735 { "cmovnsS", { Gv, Ev } },
1736 { "cmovpS", { Gv, Ev } },
1737 { "cmovnpS", { Gv, Ev } },
1738 { "cmovlS", { Gv, Ev } },
1739 { "cmovgeS", { Gv, Ev } },
1740 { "cmovleS", { Gv, Ev } },
1741 { "cmovgS", { Gv, Ev } },
1742 /* 50 */
1743 { MOD_TABLE (MOD_0F51) },
1744 { PREFIX_TABLE (PREFIX_0F51) },
1745 { PREFIX_TABLE (PREFIX_0F52) },
1746 { PREFIX_TABLE (PREFIX_0F53) },
1747 { "andpX", { XM, EXx } },
1748 { "andnpX", { XM, EXx } },
1749 { "orpX", { XM, EXx } },
1750 { "xorpX", { XM, EXx } },
1751 /* 58 */
1752 { PREFIX_TABLE (PREFIX_0F58) },
1753 { PREFIX_TABLE (PREFIX_0F59) },
1754 { PREFIX_TABLE (PREFIX_0F5A) },
1755 { PREFIX_TABLE (PREFIX_0F5B) },
1756 { PREFIX_TABLE (PREFIX_0F5C) },
1757 { PREFIX_TABLE (PREFIX_0F5D) },
1758 { PREFIX_TABLE (PREFIX_0F5E) },
1759 { PREFIX_TABLE (PREFIX_0F5F) },
1760 /* 60 */
1761 { PREFIX_TABLE (PREFIX_0F60) },
1762 { PREFIX_TABLE (PREFIX_0F61) },
1763 { PREFIX_TABLE (PREFIX_0F62) },
1764 { "packsswb", { MX, EM } },
1765 { "pcmpgtb", { MX, EM } },
1766 { "pcmpgtw", { MX, EM } },
1767 { "pcmpgtd", { MX, EM } },
1768 { "packuswb", { MX, EM } },
1769 /* 68 */
1770 { "punpckhbw", { MX, EM } },
1771 { "punpckhwd", { MX, EM } },
1772 { "punpckhdq", { MX, EM } },
1773 { "packssdw", { MX, EM } },
1774 { PREFIX_TABLE (PREFIX_0F6C) },
1775 { PREFIX_TABLE (PREFIX_0F6D) },
1776 { "movK", { MX, Edq } },
1777 { PREFIX_TABLE (PREFIX_0F6F) },
1778 /* 70 */
1779 { PREFIX_TABLE (PREFIX_0F70) },
1780 { REG_TABLE (REG_0F71) },
1781 { REG_TABLE (REG_0F72) },
1782 { REG_TABLE (REG_0F73) },
1783 { "pcmpeqb", { MX, EM } },
1784 { "pcmpeqw", { MX, EM } },
1785 { "pcmpeqd", { MX, EM } },
1786 { "emms", { XX } },
1787 /* 78 */
1788 { PREFIX_TABLE (PREFIX_0F78) },
1789 { PREFIX_TABLE (PREFIX_0F79) },
1790 { THREE_BYTE_TABLE (THREE_BYTE_0F7A) },
1791 { "(bad)", { XX } },
1792 { PREFIX_TABLE (PREFIX_0F7C) },
1793 { PREFIX_TABLE (PREFIX_0F7D) },
1794 { PREFIX_TABLE (PREFIX_0F7E) },
1795 { PREFIX_TABLE (PREFIX_0F7F) },
1796 /* 80 */
1797 { "joH", { Jv, XX, cond_jump_flag } },
1798 { "jnoH", { Jv, XX, cond_jump_flag } },
1799 { "jbH", { Jv, XX, cond_jump_flag } },
1800 { "jaeH", { Jv, XX, cond_jump_flag } },
1801 { "jeH", { Jv, XX, cond_jump_flag } },
1802 { "jneH", { Jv, XX, cond_jump_flag } },
1803 { "jbeH", { Jv, XX, cond_jump_flag } },
1804 { "jaH", { Jv, XX, cond_jump_flag } },
1805 /* 88 */
1806 { "jsH", { Jv, XX, cond_jump_flag } },
1807 { "jnsH", { Jv, XX, cond_jump_flag } },
1808 { "jpH", { Jv, XX, cond_jump_flag } },
1809 { "jnpH", { Jv, XX, cond_jump_flag } },
1810 { "jlH", { Jv, XX, cond_jump_flag } },
1811 { "jgeH", { Jv, XX, cond_jump_flag } },
1812 { "jleH", { Jv, XX, cond_jump_flag } },
1813 { "jgH", { Jv, XX, cond_jump_flag } },
1814 /* 90 */
1815 { "seto", { Eb } },
1816 { "setno", { Eb } },
1817 { "setb", { Eb } },
1818 { "setae", { Eb } },
1819 { "sete", { Eb } },
1820 { "setne", { Eb } },
1821 { "setbe", { Eb } },
1822 { "seta", { Eb } },
1823 /* 98 */
1824 { "sets", { Eb } },
1825 { "setns", { Eb } },
1826 { "setp", { Eb } },
1827 { "setnp", { Eb } },
1828 { "setl", { Eb } },
1829 { "setge", { Eb } },
1830 { "setle", { Eb } },
1831 { "setg", { Eb } },
1832 /* a0 */
1833 { "pushT", { fs } },
1834 { "popT", { fs } },
1835 { "cpuid", { XX } },
1836 { "btS", { Ev, Gv } },
1837 { "shldS", { Ev, Gv, Ib } },
1838 { "shldS", { Ev, Gv, CL } },
1839 { REG_TABLE (REG_0FA6) },
1840 { REG_TABLE (REG_0FA7) },
1841 /* a8 */
1842 { "pushT", { gs } },
1843 { "popT", { gs } },
1844 { "rsm", { XX } },
1845 { "btsS", { Ev, Gv } },
1846 { "shrdS", { Ev, Gv, Ib } },
1847 { "shrdS", { Ev, Gv, CL } },
1848 { REG_TABLE (REG_0FAE) },
1849 { "imulS", { Gv, Ev } },
1850 /* b0 */
1851 { "cmpxchgB", { Eb, Gb } },
1852 { "cmpxchgS", { Ev, Gv } },
1853 { MOD_TABLE (MOD_0FB2) },
1854 { "btrS", { Ev, Gv } },
1855 { MOD_TABLE (MOD_0FB4) },
1856 { MOD_TABLE (MOD_0FB5) },
1857 { "movz{bR|x}", { Gv, Eb } },
1858 { "movz{wR|x}", { Gv, Ew } }, /* yes, there really is movzww ! */
1859 /* b8 */
1860 { PREFIX_TABLE (PREFIX_0FB8) },
1861 { "ud2b", { XX } },
1862 { REG_TABLE (REG_0FBA) },
1863 { "btcS", { Ev, Gv } },
1864 { "bsfS", { Gv, Ev } },
1865 { PREFIX_TABLE (PREFIX_0FBD) },
1866 { "movs{bR|x}", { Gv, Eb } },
1867 { "movs{wR|x}", { Gv, Ew } }, /* yes, there really is movsww ! */
1868 /* c0 */
1869 { "xaddB", { Eb, Gb } },
1870 { "xaddS", { Ev, Gv } },
1871 { PREFIX_TABLE (PREFIX_0FC2) },
1872 { PREFIX_TABLE (PREFIX_0FC3) },
1873 { "pinsrw", { MX, Edqw, Ib } },
1874 { "pextrw", { Gdq, MS, Ib } },
1875 { "shufpX", { XM, EXx, Ib } },
1876 { REG_TABLE (REG_0FC7) },
1877 /* c8 */
1878 { "bswap", { RMeAX } },
1879 { "bswap", { RMeCX } },
1880 { "bswap", { RMeDX } },
1881 { "bswap", { RMeBX } },
1882 { "bswap", { RMeSP } },
1883 { "bswap", { RMeBP } },
1884 { "bswap", { RMeSI } },
1885 { "bswap", { RMeDI } },
1886 /* d0 */
1887 { PREFIX_TABLE (PREFIX_0FD0) },
1888 { "psrlw", { MX, EM } },
1889 { "psrld", { MX, EM } },
1890 { "psrlq", { MX, EM } },
1891 { "paddq", { MX, EM } },
1892 { "pmullw", { MX, EM } },
1893 { PREFIX_TABLE (PREFIX_0FD6) },
1894 { MOD_TABLE (MOD_0FD7) },
1895 /* d8 */
1896 { "psubusb", { MX, EM } },
1897 { "psubusw", { MX, EM } },
1898 { "pminub", { MX, EM } },
1899 { "pand", { MX, EM } },
1900 { "paddusb", { MX, EM } },
1901 { "paddusw", { MX, EM } },
1902 { "pmaxub", { MX, EM } },
1903 { "pandn", { MX, EM } },
1904 /* e0 */
1905 { "pavgb", { MX, EM } },
1906 { "psraw", { MX, EM } },
1907 { "psrad", { MX, EM } },
1908 { "pavgw", { MX, EM } },
1909 { "pmulhuw", { MX, EM } },
1910 { "pmulhw", { MX, EM } },
1911 { PREFIX_TABLE (PREFIX_0FE6) },
1912 { PREFIX_TABLE (PREFIX_0FE7) },
1913 /* e8 */
1914 { "psubsb", { MX, EM } },
1915 { "psubsw", { MX, EM } },
1916 { "pminsw", { MX, EM } },
1917 { "por", { MX, EM } },
1918 { "paddsb", { MX, EM } },
1919 { "paddsw", { MX, EM } },
1920 { "pmaxsw", { MX, EM } },
1921 { "pxor", { MX, EM } },
1922 /* f0 */
1923 { PREFIX_TABLE (PREFIX_0FF0) },
1924 { "psllw", { MX, EM } },
1925 { "pslld", { MX, EM } },
1926 { "psllq", { MX, EM } },
1927 { "pmuludq", { MX, EM } },
1928 { "pmaddwd", { MX, EM } },
1929 { "psadbw", { MX, EM } },
1930 { PREFIX_TABLE (PREFIX_0FF7) },
1931 /* f8 */
1932 { "psubb", { MX, EM } },
1933 { "psubw", { MX, EM } },
1934 { "psubd", { MX, EM } },
1935 { "psubq", { MX, EM } },
1936 { "paddb", { MX, EM } },
1937 { "paddw", { MX, EM } },
1938 { "paddd", { MX, EM } },
1939 { "(bad)", { XX } },
1940 };
1941
1942 static const unsigned char onebyte_has_modrm[256] = {
1943 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
1944 /* ------------------------------- */
1945 /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
1946 /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
1947 /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
1948 /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
1949 /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
1950 /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
1951 /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
1952 /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
1953 /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
1954 /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
1955 /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
1956 /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
1957 /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
1958 /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
1959 /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
1960 /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1 /* f0 */
1961 /* ------------------------------- */
1962 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
1963 };
1964
1965 static const unsigned char twobyte_has_modrm[256] = {
1966 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
1967 /* ------------------------------- */
1968 /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
1969 /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
1970 /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
1971 /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
1972 /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
1973 /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
1974 /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
1975 /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
1976 /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
1977 /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
1978 /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
1979 /* b0 */ 1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1, /* bf */
1980 /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
1981 /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
1982 /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
1983 /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0 /* ff */
1984 /* ------------------------------- */
1985 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
1986 };
1987
1988 static char obuf[100];
1989 static char *obufp;
1990 static char *mnemonicendp;
1991 static char scratchbuf[100];
1992 static unsigned char *start_codep;
1993 static unsigned char *insn_codep;
1994 static unsigned char *codep;
1995 static const char *lock_prefix;
1996 static const char *data_prefix;
1997 static const char *addr_prefix;
1998 static const char *repz_prefix;
1999 static const char *repnz_prefix;
2000 static const char **all_prefixes[5];
2001 static disassemble_info *the_info;
2002 static struct
2003 {
2004 int mod;
2005 int reg;
2006 int rm;
2007 }
2008 modrm;
2009 static unsigned char need_modrm;
2010 static struct
2011 {
2012 int register_specifier;
2013 int length;
2014 int prefix;
2015 int w;
2016 }
2017 vex;
2018 static unsigned char need_vex;
2019 static unsigned char need_vex_reg;
2020 static unsigned char vex_w_done;
2021
2022 struct op
2023 {
2024 const char *name;
2025 unsigned int len;
2026 };
2027
2028 /* If we are accessing mod/rm/reg without need_modrm set, then the
2029 values are stale. Hitting this abort likely indicates that you
2030 need to update onebyte_has_modrm or twobyte_has_modrm. */
2031 #define MODRM_CHECK if (!need_modrm) abort ()
2032
2033 static const char **names64;
2034 static const char **names32;
2035 static const char **names16;
2036 static const char **names8;
2037 static const char **names8rex;
2038 static const char **names_seg;
2039 static const char *index64;
2040 static const char *index32;
2041 static const char **index16;
2042
2043 static const char *intel_names64[] = {
2044 "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
2045 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2046 };
2047 static const char *intel_names32[] = {
2048 "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
2049 "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
2050 };
2051 static const char *intel_names16[] = {
2052 "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
2053 "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
2054 };
2055 static const char *intel_names8[] = {
2056 "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
2057 };
2058 static const char *intel_names8rex[] = {
2059 "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
2060 "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
2061 };
2062 static const char *intel_names_seg[] = {
2063 "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
2064 };
2065 static const char *intel_index64 = "riz";
2066 static const char *intel_index32 = "eiz";
2067 static const char *intel_index16[] = {
2068 "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
2069 };
2070
2071 static const char *att_names64[] = {
2072 "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
2073 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
2074 };
2075 static const char *att_names32[] = {
2076 "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
2077 "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
2078 };
2079 static const char *att_names16[] = {
2080 "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
2081 "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
2082 };
2083 static const char *att_names8[] = {
2084 "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
2085 };
2086 static const char *att_names8rex[] = {
2087 "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
2088 "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
2089 };
2090 static const char *att_names_seg[] = {
2091 "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
2092 };
2093 static const char *att_index64 = "%riz";
2094 static const char *att_index32 = "%eiz";
2095 static const char *att_index16[] = {
2096 "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
2097 };
2098
2099 static const struct dis386 reg_table[][8] = {
2100 /* REG_80 */
2101 {
2102 { "addA", { Eb, Ib } },
2103 { "orA", { Eb, Ib } },
2104 { "adcA", { Eb, Ib } },
2105 { "sbbA", { Eb, Ib } },
2106 { "andA", { Eb, Ib } },
2107 { "subA", { Eb, Ib } },
2108 { "xorA", { Eb, Ib } },
2109 { "cmpA", { Eb, Ib } },
2110 },
2111 /* REG_81 */
2112 {
2113 { "addQ", { Ev, Iv } },
2114 { "orQ", { Ev, Iv } },
2115 { "adcQ", { Ev, Iv } },
2116 { "sbbQ", { Ev, Iv } },
2117 { "andQ", { Ev, Iv } },
2118 { "subQ", { Ev, Iv } },
2119 { "xorQ", { Ev, Iv } },
2120 { "cmpQ", { Ev, Iv } },
2121 },
2122 /* REG_82 */
2123 {
2124 { "addQ", { Ev, sIb } },
2125 { "orQ", { Ev, sIb } },
2126 { "adcQ", { Ev, sIb } },
2127 { "sbbQ", { Ev, sIb } },
2128 { "andQ", { Ev, sIb } },
2129 { "subQ", { Ev, sIb } },
2130 { "xorQ", { Ev, sIb } },
2131 { "cmpQ", { Ev, sIb } },
2132 },
2133 /* REG_8F */
2134 {
2135 { "popU", { stackEv } },
2136 { XOP_8F_TABLE (XOP_09) },
2137 { "(bad)", { XX } },
2138 { "(bad)", { XX } },
2139 { "(bad)", { XX } },
2140 { XOP_8F_TABLE (XOP_09) },
2141 { "(bad)", { XX } },
2142 { "(bad)", { XX } },
2143 },
2144 /* REG_C0 */
2145 {
2146 { "rolA", { Eb, Ib } },
2147 { "rorA", { Eb, Ib } },
2148 { "rclA", { Eb, Ib } },
2149 { "rcrA", { Eb, Ib } },
2150 { "shlA", { Eb, Ib } },
2151 { "shrA", { Eb, Ib } },
2152 { "(bad)", { XX } },
2153 { "sarA", { Eb, Ib } },
2154 },
2155 /* REG_C1 */
2156 {
2157 { "rolQ", { Ev, Ib } },
2158 { "rorQ", { Ev, Ib } },
2159 { "rclQ", { Ev, Ib } },
2160 { "rcrQ", { Ev, Ib } },
2161 { "shlQ", { Ev, Ib } },
2162 { "shrQ", { Ev, Ib } },
2163 { "(bad)", { XX } },
2164 { "sarQ", { Ev, Ib } },
2165 },
2166 /* REG_C6 */
2167 {
2168 { "movA", { Eb, Ib } },
2169 { "(bad)", { XX } },
2170 { "(bad)", { XX } },
2171 { "(bad)", { XX } },
2172 { "(bad)", { XX } },
2173 { "(bad)", { XX } },
2174 { "(bad)", { XX } },
2175 { "(bad)", { XX } },
2176 },
2177 /* REG_C7 */
2178 {
2179 { "movQ", { Ev, Iv } },
2180 { "(bad)", { XX } },
2181 { "(bad)", { XX } },
2182 { "(bad)", { XX } },
2183 { "(bad)", { XX } },
2184 { "(bad)", { XX } },
2185 { "(bad)", { XX } },
2186 { "(bad)", { XX } },
2187 },
2188 /* REG_D0 */
2189 {
2190 { "rolA", { Eb, I1 } },
2191 { "rorA", { Eb, I1 } },
2192 { "rclA", { Eb, I1 } },
2193 { "rcrA", { Eb, I1 } },
2194 { "shlA", { Eb, I1 } },
2195 { "shrA", { Eb, I1 } },
2196 { "(bad)", { XX } },
2197 { "sarA", { Eb, I1 } },
2198 },
2199 /* REG_D1 */
2200 {
2201 { "rolQ", { Ev, I1 } },
2202 { "rorQ", { Ev, I1 } },
2203 { "rclQ", { Ev, I1 } },
2204 { "rcrQ", { Ev, I1 } },
2205 { "shlQ", { Ev, I1 } },
2206 { "shrQ", { Ev, I1 } },
2207 { "(bad)", { XX } },
2208 { "sarQ", { Ev, I1 } },
2209 },
2210 /* REG_D2 */
2211 {
2212 { "rolA", { Eb, CL } },
2213 { "rorA", { Eb, CL } },
2214 { "rclA", { Eb, CL } },
2215 { "rcrA", { Eb, CL } },
2216 { "shlA", { Eb, CL } },
2217 { "shrA", { Eb, CL } },
2218 { "(bad)", { XX } },
2219 { "sarA", { Eb, CL } },
2220 },
2221 /* REG_D3 */
2222 {
2223 { "rolQ", { Ev, CL } },
2224 { "rorQ", { Ev, CL } },
2225 { "rclQ", { Ev, CL } },
2226 { "rcrQ", { Ev, CL } },
2227 { "shlQ", { Ev, CL } },
2228 { "shrQ", { Ev, CL } },
2229 { "(bad)", { XX } },
2230 { "sarQ", { Ev, CL } },
2231 },
2232 /* REG_F6 */
2233 {
2234 { "testA", { Eb, Ib } },
2235 { "(bad)", { XX } },
2236 { "notA", { Eb } },
2237 { "negA", { Eb } },
2238 { "mulA", { Eb } }, /* Don't print the implicit %al register, */
2239 { "imulA", { Eb } }, /* to distinguish these opcodes from other */
2240 { "divA", { Eb } }, /* mul/imul opcodes. Do the same for div */
2241 { "idivA", { Eb } }, /* and idiv for consistency. */
2242 },
2243 /* REG_F7 */
2244 {
2245 { "testQ", { Ev, Iv } },
2246 { "(bad)", { XX } },
2247 { "notQ", { Ev } },
2248 { "negQ", { Ev } },
2249 { "mulQ", { Ev } }, /* Don't print the implicit register. */
2250 { "imulQ", { Ev } },
2251 { "divQ", { Ev } },
2252 { "idivQ", { Ev } },
2253 },
2254 /* REG_FE */
2255 {
2256 { "incA", { Eb } },
2257 { "decA", { Eb } },
2258 { "(bad)", { XX } },
2259 { "(bad)", { XX } },
2260 { "(bad)", { XX } },
2261 { "(bad)", { XX } },
2262 { "(bad)", { XX } },
2263 { "(bad)", { XX } },
2264 },
2265 /* REG_FF */
2266 {
2267 { "incQ", { Ev } },
2268 { "decQ", { Ev } },
2269 { "callT", { indirEv } },
2270 { "JcallT", { indirEp } },
2271 { "jmpT", { indirEv } },
2272 { "JjmpT", { indirEp } },
2273 { "pushU", { stackEv } },
2274 { "(bad)", { XX } },
2275 },
2276 /* REG_0F00 */
2277 {
2278 { "sldtD", { Sv } },
2279 { "strD", { Sv } },
2280 { "lldt", { Ew } },
2281 { "ltr", { Ew } },
2282 { "verr", { Ew } },
2283 { "verw", { Ew } },
2284 { "(bad)", { XX } },
2285 { "(bad)", { XX } },
2286 },
2287 /* REG_0F01 */
2288 {
2289 { MOD_TABLE (MOD_0F01_REG_0) },
2290 { MOD_TABLE (MOD_0F01_REG_1) },
2291 { MOD_TABLE (MOD_0F01_REG_2) },
2292 { MOD_TABLE (MOD_0F01_REG_3) },
2293 { "smswD", { Sv } },
2294 { "(bad)", { XX } },
2295 { "lmsw", { Ew } },
2296 { MOD_TABLE (MOD_0F01_REG_7) },
2297 },
2298 /* REG_0F0D */
2299 {
2300 { "prefetch", { Eb } },
2301 { "prefetchw", { Eb } },
2302 { "(bad)", { XX } },
2303 { "(bad)", { XX } },
2304 { "(bad)", { XX } },
2305 { "(bad)", { XX } },
2306 { "(bad)", { XX } },
2307 { "(bad)", { XX } },
2308 },
2309 /* REG_0F18 */
2310 {
2311 { MOD_TABLE (MOD_0F18_REG_0) },
2312 { MOD_TABLE (MOD_0F18_REG_1) },
2313 { MOD_TABLE (MOD_0F18_REG_2) },
2314 { MOD_TABLE (MOD_0F18_REG_3) },
2315 { "(bad)", { XX } },
2316 { "(bad)", { XX } },
2317 { "(bad)", { XX } },
2318 { "(bad)", { XX } },
2319 },
2320 /* REG_0F71 */
2321 {
2322 { "(bad)", { XX } },
2323 { "(bad)", { XX } },
2324 { MOD_TABLE (MOD_0F71_REG_2) },
2325 { "(bad)", { XX } },
2326 { MOD_TABLE (MOD_0F71_REG_4) },
2327 { "(bad)", { XX } },
2328 { MOD_TABLE (MOD_0F71_REG_6) },
2329 { "(bad)", { XX } },
2330 },
2331 /* REG_0F72 */
2332 {
2333 { "(bad)", { XX } },
2334 { "(bad)", { XX } },
2335 { MOD_TABLE (MOD_0F72_REG_2) },
2336 { "(bad)", { XX } },
2337 { MOD_TABLE (MOD_0F72_REG_4) },
2338 { "(bad)", { XX } },
2339 { MOD_TABLE (MOD_0F72_REG_6) },
2340 { "(bad)", { XX } },
2341 },
2342 /* REG_0F73 */
2343 {
2344 { "(bad)", { XX } },
2345 { "(bad)", { XX } },
2346 { MOD_TABLE (MOD_0F73_REG_2) },
2347 { MOD_TABLE (MOD_0F73_REG_3) },
2348 { "(bad)", { XX } },
2349 { "(bad)", { XX } },
2350 { MOD_TABLE (MOD_0F73_REG_6) },
2351 { MOD_TABLE (MOD_0F73_REG_7) },
2352 },
2353 /* REG_0FA6 */
2354 {
2355 { "montmul", { { OP_0f07, 0 } } },
2356 { "xsha1", { { OP_0f07, 0 } } },
2357 { "xsha256", { { OP_0f07, 0 } } },
2358 { "(bad)", { { OP_0f07, 0 } } },
2359 { "(bad)", { { OP_0f07, 0 } } },
2360 { "(bad)", { { OP_0f07, 0 } } },
2361 { "(bad)", { { OP_0f07, 0 } } },
2362 { "(bad)", { { OP_0f07, 0 } } },
2363 },
2364 /* REG_0FA7 */
2365 {
2366 { "xstore-rng", { { OP_0f07, 0 } } },
2367 { "xcrypt-ecb", { { OP_0f07, 0 } } },
2368 { "xcrypt-cbc", { { OP_0f07, 0 } } },
2369 { "xcrypt-ctr", { { OP_0f07, 0 } } },
2370 { "xcrypt-cfb", { { OP_0f07, 0 } } },
2371 { "xcrypt-ofb", { { OP_0f07, 0 } } },
2372 { "(bad)", { { OP_0f07, 0 } } },
2373 { "(bad)", { { OP_0f07, 0 } } },
2374 },
2375 /* REG_0FAE */
2376 {
2377 { MOD_TABLE (MOD_0FAE_REG_0) },
2378 { MOD_TABLE (MOD_0FAE_REG_1) },
2379 { MOD_TABLE (MOD_0FAE_REG_2) },
2380 { MOD_TABLE (MOD_0FAE_REG_3) },
2381 { MOD_TABLE (MOD_0FAE_REG_4) },
2382 { MOD_TABLE (MOD_0FAE_REG_5) },
2383 { MOD_TABLE (MOD_0FAE_REG_6) },
2384 { MOD_TABLE (MOD_0FAE_REG_7) },
2385 },
2386 /* REG_0FBA */
2387 {
2388 { "(bad)", { XX } },
2389 { "(bad)", { XX } },
2390 { "(bad)", { XX } },
2391 { "(bad)", { XX } },
2392 { "btQ", { Ev, Ib } },
2393 { "btsQ", { Ev, Ib } },
2394 { "btrQ", { Ev, Ib } },
2395 { "btcQ", { Ev, Ib } },
2396 },
2397 /* REG_0FC7 */
2398 {
2399 { "(bad)", { XX } },
2400 { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } } },
2401 { "(bad)", { XX } },
2402 { "(bad)", { XX } },
2403 { "(bad)", { XX } },
2404 { "(bad)", { XX } },
2405 { MOD_TABLE (MOD_0FC7_REG_6) },
2406 { MOD_TABLE (MOD_0FC7_REG_7) },
2407 },
2408 /* REG_VEX_71 */
2409 {
2410 { "(bad)", { XX } },
2411 { "(bad)", { XX } },
2412 { MOD_TABLE (MOD_VEX_71_REG_2) },
2413 { "(bad)", { XX } },
2414 { MOD_TABLE (MOD_VEX_71_REG_4) },
2415 { "(bad)", { XX } },
2416 { MOD_TABLE (MOD_VEX_71_REG_6) },
2417 { "(bad)", { XX } },
2418 },
2419 /* REG_VEX_72 */
2420 {
2421 { "(bad)", { XX } },
2422 { "(bad)", { XX } },
2423 { MOD_TABLE (MOD_VEX_72_REG_2) },
2424 { "(bad)", { XX } },
2425 { MOD_TABLE (MOD_VEX_72_REG_4) },
2426 { "(bad)", { XX } },
2427 { MOD_TABLE (MOD_VEX_72_REG_6) },
2428 { "(bad)", { XX } },
2429 },
2430 /* REG_VEX_73 */
2431 {
2432 { "(bad)", { XX } },
2433 { "(bad)", { XX } },
2434 { MOD_TABLE (MOD_VEX_73_REG_2) },
2435 { MOD_TABLE (MOD_VEX_73_REG_3) },
2436 { "(bad)", { XX } },
2437 { "(bad)", { XX } },
2438 { MOD_TABLE (MOD_VEX_73_REG_6) },
2439 { MOD_TABLE (MOD_VEX_73_REG_7) },
2440 },
2441 /* REG_VEX_AE */
2442 {
2443 { "(bad)", { XX } },
2444 { "(bad)", { XX } },
2445 { MOD_TABLE (MOD_VEX_AE_REG_2) },
2446 { MOD_TABLE (MOD_VEX_AE_REG_3) },
2447 { "(bad)", { XX } },
2448 { "(bad)", { XX } },
2449 { "(bad)", { XX } },
2450 { "(bad)", { XX } },
2451 },
2452 /* REG_XOP_LWPCB */
2453 {
2454 { "llwpcb", { { OP_LWPCB_E, 0 } } },
2455 { "slwpcb", { { OP_LWPCB_E, 0 } } },
2456 { "(bad)", { XX } },
2457 { "(bad)", { XX } },
2458 { "(bad)", { XX } },
2459 { "(bad)", { XX } },
2460 { "(bad)", { XX } },
2461 { "(bad)", { XX } },
2462 },
2463 /* REG_XOP_LWP */
2464 {
2465 { "lwpins", { { OP_LWP_E, 0 }, Ed, { OP_LWP_I, 0 } } },
2466 { "lwpval", { { OP_LWP_E, 0 }, Ed, { OP_LWP_I, 0 } } },
2467 { "(bad)", { XX } },
2468 { "(bad)", { XX } },
2469 { "(bad)", { XX } },
2470 { "(bad)", { XX } },
2471 { "(bad)", { XX } },
2472 { "(bad)", { XX } },
2473 },
2474 };
2475
2476 static const struct dis386 prefix_table[][4] = {
2477 /* PREFIX_90 */
2478 {
2479 { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } } },
2480 { "pause", { XX } },
2481 { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } } },
2482 { "(bad)", { XX } },
2483 },
2484
2485 /* PREFIX_0F10 */
2486 {
2487 { "movups", { XM, EXx } },
2488 { "movss", { XM, EXd } },
2489 { "movupd", { XM, EXx } },
2490 { "movsd", { XM, EXq } },
2491 },
2492
2493 /* PREFIX_0F11 */
2494 {
2495 { "movups", { EXxS, XM } },
2496 { "movss", { EXdS, XM } },
2497 { "movupd", { EXxS, XM } },
2498 { "movsd", { EXqS, XM } },
2499 },
2500
2501 /* PREFIX_0F12 */
2502 {
2503 { MOD_TABLE (MOD_0F12_PREFIX_0) },
2504 { "movsldup", { XM, EXx } },
2505 { "movlpd", { XM, EXq } },
2506 { "movddup", { XM, EXq } },
2507 },
2508
2509 /* PREFIX_0F16 */
2510 {
2511 { MOD_TABLE (MOD_0F16_PREFIX_0) },
2512 { "movshdup", { XM, EXx } },
2513 { "movhpd", { XM, EXq } },
2514 { "(bad)", { XX } },
2515 },
2516
2517 /* PREFIX_0F2A */
2518 {
2519 { "cvtpi2ps", { XM, EMCq } },
2520 { "cvtsi2ss%LQ", { XM, Ev } },
2521 { "cvtpi2pd", { XM, EMCq } },
2522 { "cvtsi2sd%LQ", { XM, Ev } },
2523 },
2524
2525 /* PREFIX_0F2B */
2526 {
2527 { MOD_TABLE (MOD_0F2B_PREFIX_0) },
2528 { MOD_TABLE (MOD_0F2B_PREFIX_1) },
2529 { MOD_TABLE (MOD_0F2B_PREFIX_2) },
2530 { MOD_TABLE (MOD_0F2B_PREFIX_3) },
2531 },
2532
2533 /* PREFIX_0F2C */
2534 {
2535 { "cvttps2pi", { MXC, EXq } },
2536 { "cvttss2siY", { Gv, EXd } },
2537 { "cvttpd2pi", { MXC, EXx } },
2538 { "cvttsd2siY", { Gv, EXq } },
2539 },
2540
2541 /* PREFIX_0F2D */
2542 {
2543 { "cvtps2pi", { MXC, EXq } },
2544 { "cvtss2siY", { Gv, EXd } },
2545 { "cvtpd2pi", { MXC, EXx } },
2546 { "cvtsd2siY", { Gv, EXq } },
2547 },
2548
2549 /* PREFIX_0F2E */
2550 {
2551 { "ucomiss",{ XM, EXd } },
2552 { "(bad)", { XX } },
2553 { "ucomisd",{ XM, EXq } },
2554 { "(bad)", { XX } },
2555 },
2556
2557 /* PREFIX_0F2F */
2558 {
2559 { "comiss", { XM, EXd } },
2560 { "(bad)", { XX } },
2561 { "comisd", { XM, EXq } },
2562 { "(bad)", { XX } },
2563 },
2564
2565 /* PREFIX_0F51 */
2566 {
2567 { "sqrtps", { XM, EXx } },
2568 { "sqrtss", { XM, EXd } },
2569 { "sqrtpd", { XM, EXx } },
2570 { "sqrtsd", { XM, EXq } },
2571 },
2572
2573 /* PREFIX_0F52 */
2574 {
2575 { "rsqrtps",{ XM, EXx } },
2576 { "rsqrtss",{ XM, EXd } },
2577 { "(bad)", { XX } },
2578 { "(bad)", { XX } },
2579 },
2580
2581 /* PREFIX_0F53 */
2582 {
2583 { "rcpps", { XM, EXx } },
2584 { "rcpss", { XM, EXd } },
2585 { "(bad)", { XX } },
2586 { "(bad)", { XX } },
2587 },
2588
2589 /* PREFIX_0F58 */
2590 {
2591 { "addps", { XM, EXx } },
2592 { "addss", { XM, EXd } },
2593 { "addpd", { XM, EXx } },
2594 { "addsd", { XM, EXq } },
2595 },
2596
2597 /* PREFIX_0F59 */
2598 {
2599 { "mulps", { XM, EXx } },
2600 { "mulss", { XM, EXd } },
2601 { "mulpd", { XM, EXx } },
2602 { "mulsd", { XM, EXq } },
2603 },
2604
2605 /* PREFIX_0F5A */
2606 {
2607 { "cvtps2pd", { XM, EXq } },
2608 { "cvtss2sd", { XM, EXd } },
2609 { "cvtpd2ps", { XM, EXx } },
2610 { "cvtsd2ss", { XM, EXq } },
2611 },
2612
2613 /* PREFIX_0F5B */
2614 {
2615 { "cvtdq2ps", { XM, EXx } },
2616 { "cvttps2dq", { XM, EXx } },
2617 { "cvtps2dq", { XM, EXx } },
2618 { "(bad)", { XX } },
2619 },
2620
2621 /* PREFIX_0F5C */
2622 {
2623 { "subps", { XM, EXx } },
2624 { "subss", { XM, EXd } },
2625 { "subpd", { XM, EXx } },
2626 { "subsd", { XM, EXq } },
2627 },
2628
2629 /* PREFIX_0F5D */
2630 {
2631 { "minps", { XM, EXx } },
2632 { "minss", { XM, EXd } },
2633 { "minpd", { XM, EXx } },
2634 { "minsd", { XM, EXq } },
2635 },
2636
2637 /* PREFIX_0F5E */
2638 {
2639 { "divps", { XM, EXx } },
2640 { "divss", { XM, EXd } },
2641 { "divpd", { XM, EXx } },
2642 { "divsd", { XM, EXq } },
2643 },
2644
2645 /* PREFIX_0F5F */
2646 {
2647 { "maxps", { XM, EXx } },
2648 { "maxss", { XM, EXd } },
2649 { "maxpd", { XM, EXx } },
2650 { "maxsd", { XM, EXq } },
2651 },
2652
2653 /* PREFIX_0F60 */
2654 {
2655 { "punpcklbw",{ MX, EMd } },
2656 { "(bad)", { XX } },
2657 { "punpcklbw",{ MX, EMx } },
2658 { "(bad)", { XX } },
2659 },
2660
2661 /* PREFIX_0F61 */
2662 {
2663 { "punpcklwd",{ MX, EMd } },
2664 { "(bad)", { XX } },
2665 { "punpcklwd",{ MX, EMx } },
2666 { "(bad)", { XX } },
2667 },
2668
2669 /* PREFIX_0F62 */
2670 {
2671 { "punpckldq",{ MX, EMd } },
2672 { "(bad)", { XX } },
2673 { "punpckldq",{ MX, EMx } },
2674 { "(bad)", { XX } },
2675 },
2676
2677 /* PREFIX_0F6C */
2678 {
2679 { "(bad)", { XX } },
2680 { "(bad)", { XX } },
2681 { "punpcklqdq", { XM, EXx } },
2682 { "(bad)", { XX } },
2683 },
2684
2685 /* PREFIX_0F6D */
2686 {
2687 { "(bad)", { XX } },
2688 { "(bad)", { XX } },
2689 { "punpckhqdq", { XM, EXx } },
2690 { "(bad)", { XX } },
2691 },
2692
2693 /* PREFIX_0F6F */
2694 {
2695 { "movq", { MX, EM } },
2696 { "movdqu", { XM, EXx } },
2697 { "movdqa", { XM, EXx } },
2698 { "(bad)", { XX } },
2699 },
2700
2701 /* PREFIX_0F70 */
2702 {
2703 { "pshufw", { MX, EM, Ib } },
2704 { "pshufhw",{ XM, EXx, Ib } },
2705 { "pshufd", { XM, EXx, Ib } },
2706 { "pshuflw",{ XM, EXx, Ib } },
2707 },
2708
2709 /* PREFIX_0F73_REG_3 */
2710 {
2711 { "(bad)", { XX } },
2712 { "(bad)", { XX } },
2713 { "psrldq", { XS, Ib } },
2714 { "(bad)", { XX } },
2715 },
2716
2717 /* PREFIX_0F73_REG_7 */
2718 {
2719 { "(bad)", { XX } },
2720 { "(bad)", { XX } },
2721 { "pslldq", { XS, Ib } },
2722 { "(bad)", { XX } },
2723 },
2724
2725 /* PREFIX_0F78 */
2726 {
2727 {"vmread", { Em, Gm } },
2728 {"(bad)", { XX } },
2729 {"extrq", { XS, Ib, Ib } },
2730 {"insertq", { XM, XS, Ib, Ib } },
2731 },
2732
2733 /* PREFIX_0F79 */
2734 {
2735 {"vmwrite", { Gm, Em } },
2736 {"(bad)", { XX } },
2737 {"extrq", { XM, XS } },
2738 {"insertq", { XM, XS } },
2739 },
2740
2741 /* PREFIX_0F7C */
2742 {
2743 { "(bad)", { XX } },
2744 { "(bad)", { XX } },
2745 { "haddpd", { XM, EXx } },
2746 { "haddps", { XM, EXx } },
2747 },
2748
2749 /* PREFIX_0F7D */
2750 {
2751 { "(bad)", { XX } },
2752 { "(bad)", { XX } },
2753 { "hsubpd", { XM, EXx } },
2754 { "hsubps", { XM, EXx } },
2755 },
2756
2757 /* PREFIX_0F7E */
2758 {
2759 { "movK", { Edq, MX } },
2760 { "movq", { XM, EXq } },
2761 { "movK", { Edq, XM } },
2762 { "(bad)", { XX } },
2763 },
2764
2765 /* PREFIX_0F7F */
2766 {
2767 { "movq", { EMS, MX } },
2768 { "movdqu", { EXxS, XM } },
2769 { "movdqa", { EXxS, XM } },
2770 { "(bad)", { XX } },
2771 },
2772
2773 /* PREFIX_0FB8 */
2774 {
2775 { "(bad)", { XX } },
2776 { "popcntS", { Gv, Ev } },
2777 { "(bad)", { XX } },
2778 { "(bad)", { XX } },
2779 },
2780
2781 /* PREFIX_0FBD */
2782 {
2783 { "bsrS", { Gv, Ev } },
2784 { "lzcntS", { Gv, Ev } },
2785 { "bsrS", { Gv, Ev } },
2786 { "(bad)", { XX } },
2787 },
2788
2789 /* PREFIX_0FC2 */
2790 {
2791 { "cmpps", { XM, EXx, CMP } },
2792 { "cmpss", { XM, EXd, CMP } },
2793 { "cmppd", { XM, EXx, CMP } },
2794 { "cmpsd", { XM, EXq, CMP } },
2795 },
2796
2797 /* PREFIX_0FC3 */
2798 {
2799 { "movntiS", { Ma, Gv } },
2800 { "(bad)", { XX } },
2801 { "(bad)", { XX } },
2802 { "(bad)", { XX } },
2803 },
2804
2805 /* PREFIX_0FC7_REG_6 */
2806 {
2807 { "vmptrld",{ Mq } },
2808 { "vmxon", { Mq } },
2809 { "vmclear",{ Mq } },
2810 { "(bad)", { XX } },
2811 },
2812
2813 /* PREFIX_0FD0 */
2814 {
2815 { "(bad)", { XX } },
2816 { "(bad)", { XX } },
2817 { "addsubpd", { XM, EXx } },
2818 { "addsubps", { XM, EXx } },
2819 },
2820
2821 /* PREFIX_0FD6 */
2822 {
2823 { "(bad)", { XX } },
2824 { "movq2dq",{ XM, MS } },
2825 { "movq", { EXqS, XM } },
2826 { "movdq2q",{ MX, XS } },
2827 },
2828
2829 /* PREFIX_0FE6 */
2830 {
2831 { "(bad)", { XX } },
2832 { "cvtdq2pd", { XM, EXq } },
2833 { "cvttpd2dq", { XM, EXx } },
2834 { "cvtpd2dq", { XM, EXx } },
2835 },
2836
2837 /* PREFIX_0FE7 */
2838 {
2839 { "movntq", { Mq, MX } },
2840 { "(bad)", { XX } },
2841 { MOD_TABLE (MOD_0FE7_PREFIX_2) },
2842 { "(bad)", { XX } },
2843 },
2844
2845 /* PREFIX_0FF0 */
2846 {
2847 { "(bad)", { XX } },
2848 { "(bad)", { XX } },
2849 { "(bad)", { XX } },
2850 { MOD_TABLE (MOD_0FF0_PREFIX_3) },
2851 },
2852
2853 /* PREFIX_0FF7 */
2854 {
2855 { "maskmovq", { MX, MS } },
2856 { "(bad)", { XX } },
2857 { "maskmovdqu", { XM, XS } },
2858 { "(bad)", { XX } },
2859 },
2860
2861 /* PREFIX_0F3810 */
2862 {
2863 { "(bad)", { XX } },
2864 { "(bad)", { XX } },
2865 { "pblendvb", { XM, EXx, XMM0 } },
2866 { "(bad)", { XX } },
2867 },
2868
2869 /* PREFIX_0F3814 */
2870 {
2871 { "(bad)", { XX } },
2872 { "(bad)", { XX } },
2873 { "blendvps", { XM, EXx, XMM0 } },
2874 { "(bad)", { XX } },
2875 },
2876
2877 /* PREFIX_0F3815 */
2878 {
2879 { "(bad)", { XX } },
2880 { "(bad)", { XX } },
2881 { "blendvpd", { XM, EXx, XMM0 } },
2882 { "(bad)", { XX } },
2883 },
2884
2885 /* PREFIX_0F3817 */
2886 {
2887 { "(bad)", { XX } },
2888 { "(bad)", { XX } },
2889 { "ptest", { XM, EXx } },
2890 { "(bad)", { XX } },
2891 },
2892
2893 /* PREFIX_0F3820 */
2894 {
2895 { "(bad)", { XX } },
2896 { "(bad)", { XX } },
2897 { "pmovsxbw", { XM, EXq } },
2898 { "(bad)", { XX } },
2899 },
2900
2901 /* PREFIX_0F3821 */
2902 {
2903 { "(bad)", { XX } },
2904 { "(bad)", { XX } },
2905 { "pmovsxbd", { XM, EXd } },
2906 { "(bad)", { XX } },
2907 },
2908
2909 /* PREFIX_0F3822 */
2910 {
2911 { "(bad)", { XX } },
2912 { "(bad)", { XX } },
2913 { "pmovsxbq", { XM, EXw } },
2914 { "(bad)", { XX } },
2915 },
2916
2917 /* PREFIX_0F3823 */
2918 {
2919 { "(bad)", { XX } },
2920 { "(bad)", { XX } },
2921 { "pmovsxwd", { XM, EXq } },
2922 { "(bad)", { XX } },
2923 },
2924
2925 /* PREFIX_0F3824 */
2926 {
2927 { "(bad)", { XX } },
2928 { "(bad)", { XX } },
2929 { "pmovsxwq", { XM, EXd } },
2930 { "(bad)", { XX } },
2931 },
2932
2933 /* PREFIX_0F3825 */
2934 {
2935 { "(bad)", { XX } },
2936 { "(bad)", { XX } },
2937 { "pmovsxdq", { XM, EXq } },
2938 { "(bad)", { XX } },
2939 },
2940
2941 /* PREFIX_0F3828 */
2942 {
2943 { "(bad)", { XX } },
2944 { "(bad)", { XX } },
2945 { "pmuldq", { XM, EXx } },
2946 { "(bad)", { XX } },
2947 },
2948
2949 /* PREFIX_0F3829 */
2950 {
2951 { "(bad)", { XX } },
2952 { "(bad)", { XX } },
2953 { "pcmpeqq", { XM, EXx } },
2954 { "(bad)", { XX } },
2955 },
2956
2957 /* PREFIX_0F382A */
2958 {
2959 { "(bad)", { XX } },
2960 { "(bad)", { XX } },
2961 { MOD_TABLE (MOD_0F382A_PREFIX_2) },
2962 { "(bad)", { XX } },
2963 },
2964
2965 /* PREFIX_0F382B */
2966 {
2967 { "(bad)", { XX } },
2968 { "(bad)", { XX } },
2969 { "packusdw", { XM, EXx } },
2970 { "(bad)", { XX } },
2971 },
2972
2973 /* PREFIX_0F3830 */
2974 {
2975 { "(bad)", { XX } },
2976 { "(bad)", { XX } },
2977 { "pmovzxbw", { XM, EXq } },
2978 { "(bad)", { XX } },
2979 },
2980
2981 /* PREFIX_0F3831 */
2982 {
2983 { "(bad)", { XX } },
2984 { "(bad)", { XX } },
2985 { "pmovzxbd", { XM, EXd } },
2986 { "(bad)", { XX } },
2987 },
2988
2989 /* PREFIX_0F3832 */
2990 {
2991 { "(bad)", { XX } },
2992 { "(bad)", { XX } },
2993 { "pmovzxbq", { XM, EXw } },
2994 { "(bad)", { XX } },
2995 },
2996
2997 /* PREFIX_0F3833 */
2998 {
2999 { "(bad)", { XX } },
3000 { "(bad)", { XX } },
3001 { "pmovzxwd", { XM, EXq } },
3002 { "(bad)", { XX } },
3003 },
3004
3005 /* PREFIX_0F3834 */
3006 {
3007 { "(bad)", { XX } },
3008 { "(bad)", { XX } },
3009 { "pmovzxwq", { XM, EXd } },
3010 { "(bad)", { XX } },
3011 },
3012
3013 /* PREFIX_0F3835 */
3014 {
3015 { "(bad)", { XX } },
3016 { "(bad)", { XX } },
3017 { "pmovzxdq", { XM, EXq } },
3018 { "(bad)", { XX } },
3019 },
3020
3021 /* PREFIX_0F3837 */
3022 {
3023 { "(bad)", { XX } },
3024 { "(bad)", { XX } },
3025 { "pcmpgtq", { XM, EXx } },
3026 { "(bad)", { XX } },
3027 },
3028
3029 /* PREFIX_0F3838 */
3030 {
3031 { "(bad)", { XX } },
3032 { "(bad)", { XX } },
3033 { "pminsb", { XM, EXx } },
3034 { "(bad)", { XX } },
3035 },
3036
3037 /* PREFIX_0F3839 */
3038 {
3039 { "(bad)", { XX } },
3040 { "(bad)", { XX } },
3041 { "pminsd", { XM, EXx } },
3042 { "(bad)", { XX } },
3043 },
3044
3045 /* PREFIX_0F383A */
3046 {
3047 { "(bad)", { XX } },
3048 { "(bad)", { XX } },
3049 { "pminuw", { XM, EXx } },
3050 { "(bad)", { XX } },
3051 },
3052
3053 /* PREFIX_0F383B */
3054 {
3055 { "(bad)", { XX } },
3056 { "(bad)", { XX } },
3057 { "pminud", { XM, EXx } },
3058 { "(bad)", { XX } },
3059 },
3060
3061 /* PREFIX_0F383C */
3062 {
3063 { "(bad)", { XX } },
3064 { "(bad)", { XX } },
3065 { "pmaxsb", { XM, EXx } },
3066 { "(bad)", { XX } },
3067 },
3068
3069 /* PREFIX_0F383D */
3070 {
3071 { "(bad)", { XX } },
3072 { "(bad)", { XX } },
3073 { "pmaxsd", { XM, EXx } },
3074 { "(bad)", { XX } },
3075 },
3076
3077 /* PREFIX_0F383E */
3078 {
3079 { "(bad)", { XX } },
3080 { "(bad)", { XX } },
3081 { "pmaxuw", { XM, EXx } },
3082 { "(bad)", { XX } },
3083 },
3084
3085 /* PREFIX_0F383F */
3086 {
3087 { "(bad)", { XX } },
3088 { "(bad)", { XX } },
3089 { "pmaxud", { XM, EXx } },
3090 { "(bad)", { XX } },
3091 },
3092
3093 /* PREFIX_0F3840 */
3094 {
3095 { "(bad)", { XX } },
3096 { "(bad)", { XX } },
3097 { "pmulld", { XM, EXx } },
3098 { "(bad)", { XX } },
3099 },
3100
3101 /* PREFIX_0F3841 */
3102 {
3103 { "(bad)", { XX } },
3104 { "(bad)", { XX } },
3105 { "phminposuw", { XM, EXx } },
3106 { "(bad)", { XX } },
3107 },
3108
3109 /* PREFIX_0F3880 */
3110 {
3111 { "(bad)", { XX } },
3112 { "(bad)", { XX } },
3113 { "invept", { Gm, Mo } },
3114 { "(bad)", { XX } },
3115 },
3116
3117 /* PREFIX_0F3881 */
3118 {
3119 { "(bad)", { XX } },
3120 { "(bad)", { XX } },
3121 { "invvpid", { Gm, Mo } },
3122 { "(bad)", { XX } },
3123 },
3124
3125 /* PREFIX_0F38DB */
3126 {
3127 { "(bad)", { XX } },
3128 { "(bad)", { XX } },
3129 { "aesimc", { XM, EXx } },
3130 { "(bad)", { XX } },
3131 },
3132
3133 /* PREFIX_0F38DC */
3134 {
3135 { "(bad)", { XX } },
3136 { "(bad)", { XX } },
3137 { "aesenc", { XM, EXx } },
3138 { "(bad)", { XX } },
3139 },
3140
3141 /* PREFIX_0F38DD */
3142 {
3143 { "(bad)", { XX } },
3144 { "(bad)", { XX } },
3145 { "aesenclast", { XM, EXx } },
3146 { "(bad)", { XX } },
3147 },
3148
3149 /* PREFIX_0F38DE */
3150 {
3151 { "(bad)", { XX } },
3152 { "(bad)", { XX } },
3153 { "aesdec", { XM, EXx } },
3154 { "(bad)", { XX } },
3155 },
3156
3157 /* PREFIX_0F38DF */
3158 {
3159 { "(bad)", { XX } },
3160 { "(bad)", { XX } },
3161 { "aesdeclast", { XM, EXx } },
3162 { "(bad)", { XX } },
3163 },
3164
3165 /* PREFIX_0F38F0 */
3166 {
3167 { "movbeS", { Gv, { MOVBE_Fixup, v_mode } } },
3168 { "(bad)", { XX } },
3169 { "movbeS", { Gv, { MOVBE_Fixup, v_mode } } },
3170 { "crc32", { Gdq, { CRC32_Fixup, b_mode } } },
3171 },
3172
3173 /* PREFIX_0F38F1 */
3174 {
3175 { "movbeS", { { MOVBE_Fixup, v_mode }, Gv } },
3176 { "(bad)", { XX } },
3177 { "movbeS", { { MOVBE_Fixup, v_mode }, Gv } },
3178 { "crc32", { Gdq, { CRC32_Fixup, v_mode } } },
3179 },
3180
3181 /* PREFIX_0F3A08 */
3182 {
3183 { "(bad)", { XX } },
3184 { "(bad)", { XX } },
3185 { "roundps", { XM, EXx, Ib } },
3186 { "(bad)", { XX } },
3187 },
3188
3189 /* PREFIX_0F3A09 */
3190 {
3191 { "(bad)", { XX } },
3192 { "(bad)", { XX } },
3193 { "roundpd", { XM, EXx, Ib } },
3194 { "(bad)", { XX } },
3195 },
3196
3197 /* PREFIX_0F3A0A */
3198 {
3199 { "(bad)", { XX } },
3200 { "(bad)", { XX } },
3201 { "roundss", { XM, EXd, Ib } },
3202 { "(bad)", { XX } },
3203 },
3204
3205 /* PREFIX_0F3A0B */
3206 {
3207 { "(bad)", { XX } },
3208 { "(bad)", { XX } },
3209 { "roundsd", { XM, EXq, Ib } },
3210 { "(bad)", { XX } },
3211 },
3212
3213 /* PREFIX_0F3A0C */
3214 {
3215 { "(bad)", { XX } },
3216 { "(bad)", { XX } },
3217 { "blendps", { XM, EXx, Ib } },
3218 { "(bad)", { XX } },
3219 },
3220
3221 /* PREFIX_0F3A0D */
3222 {
3223 { "(bad)", { XX } },
3224 { "(bad)", { XX } },
3225 { "blendpd", { XM, EXx, Ib } },
3226 { "(bad)", { XX } },
3227 },
3228
3229 /* PREFIX_0F3A0E */
3230 {
3231 { "(bad)", { XX } },
3232 { "(bad)", { XX } },
3233 { "pblendw", { XM, EXx, Ib } },
3234 { "(bad)", { XX } },
3235 },
3236
3237 /* PREFIX_0F3A14 */
3238 {
3239 { "(bad)", { XX } },
3240 { "(bad)", { XX } },
3241 { "pextrb", { Edqb, XM, Ib } },
3242 { "(bad)", { XX } },
3243 },
3244
3245 /* PREFIX_0F3A15 */
3246 {
3247 { "(bad)", { XX } },
3248 { "(bad)", { XX } },
3249 { "pextrw", { Edqw, XM, Ib } },
3250 { "(bad)", { XX } },
3251 },
3252
3253 /* PREFIX_0F3A16 */
3254 {
3255 { "(bad)", { XX } },
3256 { "(bad)", { XX } },
3257 { "pextrK", { Edq, XM, Ib } },
3258 { "(bad)", { XX } },
3259 },
3260
3261 /* PREFIX_0F3A17 */
3262 {
3263 { "(bad)", { XX } },
3264 { "(bad)", { XX } },
3265 { "extractps", { Edqd, XM, Ib } },
3266 { "(bad)", { XX } },
3267 },
3268
3269 /* PREFIX_0F3A20 */
3270 {
3271 { "(bad)", { XX } },
3272 { "(bad)", { XX } },
3273 { "pinsrb", { XM, Edqb, Ib } },
3274 { "(bad)", { XX } },
3275 },
3276
3277 /* PREFIX_0F3A21 */
3278 {
3279 { "(bad)", { XX } },
3280 { "(bad)", { XX } },
3281 { "insertps", { XM, EXd, Ib } },
3282 { "(bad)", { XX } },
3283 },
3284
3285 /* PREFIX_0F3A22 */
3286 {
3287 { "(bad)", { XX } },
3288 { "(bad)", { XX } },
3289 { "pinsrK", { XM, Edq, Ib } },
3290 { "(bad)", { XX } },
3291 },
3292
3293 /* PREFIX_0F3A40 */
3294 {
3295 { "(bad)", { XX } },
3296 { "(bad)", { XX } },
3297 { "dpps", { XM, EXx, Ib } },
3298 { "(bad)", { XX } },
3299 },
3300
3301 /* PREFIX_0F3A41 */
3302 {
3303 { "(bad)", { XX } },
3304 { "(bad)", { XX } },
3305 { "dppd", { XM, EXx, Ib } },
3306 { "(bad)", { XX } },
3307 },
3308
3309 /* PREFIX_0F3A42 */
3310 {
3311 { "(bad)", { XX } },
3312 { "(bad)", { XX } },
3313 { "mpsadbw", { XM, EXx, Ib } },
3314 { "(bad)", { XX } },
3315 },
3316
3317 /* PREFIX_0F3A44 */
3318 {
3319 { "(bad)", { XX } },
3320 { "(bad)", { XX } },
3321 { "pclmulqdq", { XM, EXx, PCLMUL } },
3322 { "(bad)", { XX } },
3323 },
3324
3325 /* PREFIX_0F3A60 */
3326 {
3327 { "(bad)", { XX } },
3328 { "(bad)", { XX } },
3329 { "pcmpestrm", { XM, EXx, Ib } },
3330 { "(bad)", { XX } },
3331 },
3332
3333 /* PREFIX_0F3A61 */
3334 {
3335 { "(bad)", { XX } },
3336 { "(bad)", { XX } },
3337 { "pcmpestri", { XM, EXx, Ib } },
3338 { "(bad)", { XX } },
3339 },
3340
3341 /* PREFIX_0F3A62 */
3342 {
3343 { "(bad)", { XX } },
3344 { "(bad)", { XX } },
3345 { "pcmpistrm", { XM, EXx, Ib } },
3346 { "(bad)", { XX } },
3347 },
3348
3349 /* PREFIX_0F3A63 */
3350 {
3351 { "(bad)", { XX } },
3352 { "(bad)", { XX } },
3353 { "pcmpistri", { XM, EXx, Ib } },
3354 { "(bad)", { XX } },
3355 },
3356
3357 /* PREFIX_0F3ADF */
3358 {
3359 { "(bad)", { XX } },
3360 { "(bad)", { XX } },
3361 { "aeskeygenassist", { XM, EXx, Ib } },
3362 { "(bad)", { XX } },
3363 },
3364
3365 /* PREFIX_VEX_10 */
3366 {
3367 { "vmovups", { XM, EXx } },
3368 { VEX_LEN_TABLE (VEX_LEN_10_P_1) },
3369 { "vmovupd", { XM, EXx } },
3370 { VEX_LEN_TABLE (VEX_LEN_10_P_3) },
3371 },
3372
3373 /* PREFIX_VEX_11 */
3374 {
3375 { "vmovups", { EXxS, XM } },
3376 { VEX_LEN_TABLE (VEX_LEN_11_P_1) },
3377 { "vmovupd", { EXxS, XM } },
3378 { VEX_LEN_TABLE (VEX_LEN_11_P_3) },
3379 },
3380
3381 /* PREFIX_VEX_12 */
3382 {
3383 { MOD_TABLE (MOD_VEX_12_PREFIX_0) },
3384 { "vmovsldup", { XM, EXx } },
3385 { VEX_LEN_TABLE (VEX_LEN_12_P_2) },
3386 { "vmovddup", { XM, EXymmq } },
3387 },
3388
3389 /* PREFIX_VEX_16 */
3390 {
3391 { MOD_TABLE (MOD_VEX_16_PREFIX_0) },
3392 { "vmovshdup", { XM, EXx } },
3393 { VEX_LEN_TABLE (VEX_LEN_16_P_2) },
3394 { "(bad)", { XX } },
3395 },
3396
3397 /* PREFIX_VEX_2A */
3398 {
3399 { "(bad)", { XX } },
3400 { VEX_LEN_TABLE (VEX_LEN_2A_P_1) },
3401 { "(bad)", { XX } },
3402 { VEX_LEN_TABLE (VEX_LEN_2A_P_3) },
3403 },
3404
3405 /* PREFIX_VEX_2C */
3406 {
3407 { "(bad)", { XX } },
3408 { VEX_LEN_TABLE (VEX_LEN_2C_P_1) },
3409 { "(bad)", { XX } },
3410 { VEX_LEN_TABLE (VEX_LEN_2C_P_3) },
3411 },
3412
3413 /* PREFIX_VEX_2D */
3414 {
3415 { "(bad)", { XX } },
3416 { VEX_LEN_TABLE (VEX_LEN_2D_P_1) },
3417 { "(bad)", { XX } },
3418 { VEX_LEN_TABLE (VEX_LEN_2D_P_3) },
3419 },
3420
3421 /* PREFIX_VEX_2E */
3422 {
3423 { VEX_LEN_TABLE (VEX_LEN_2E_P_0) },
3424 { "(bad)", { XX } },
3425 { VEX_LEN_TABLE (VEX_LEN_2E_P_2) },
3426 { "(bad)", { XX } },
3427 },
3428
3429 /* PREFIX_VEX_2F */
3430 {
3431 { VEX_LEN_TABLE (VEX_LEN_2F_P_0) },
3432 { "(bad)", { XX } },
3433 { VEX_LEN_TABLE (VEX_LEN_2F_P_2) },
3434 { "(bad)", { XX } },
3435 },
3436
3437 /* PREFIX_VEX_51 */
3438 {
3439 { "vsqrtps", { XM, EXx } },
3440 { VEX_LEN_TABLE (VEX_LEN_51_P_1) },
3441 { "vsqrtpd", { XM, EXx } },
3442 { VEX_LEN_TABLE (VEX_LEN_51_P_3) },
3443 },
3444
3445 /* PREFIX_VEX_52 */
3446 {
3447 { "vrsqrtps", { XM, EXx } },
3448 { VEX_LEN_TABLE (VEX_LEN_52_P_1) },
3449 { "(bad)", { XX } },
3450 { "(bad)", { XX } },
3451 },
3452
3453 /* PREFIX_VEX_53 */
3454 {
3455 { "vrcpps", { XM, EXx } },
3456 { VEX_LEN_TABLE (VEX_LEN_53_P_1) },
3457 { "(bad)", { XX } },
3458 { "(bad)", { XX } },
3459 },
3460
3461 /* PREFIX_VEX_58 */
3462 {
3463 { "vaddps", { XM, Vex, EXx } },
3464 { VEX_LEN_TABLE (VEX_LEN_58_P_1) },
3465 { "vaddpd", { XM, Vex, EXx } },
3466 { VEX_LEN_TABLE (VEX_LEN_58_P_3) },
3467 },
3468
3469 /* PREFIX_VEX_59 */
3470 {
3471 { "vmulps", { XM, Vex, EXx } },
3472 { VEX_LEN_TABLE (VEX_LEN_59_P_1) },
3473 { "vmulpd", { XM, Vex, EXx } },
3474 { VEX_LEN_TABLE (VEX_LEN_59_P_3) },
3475 },
3476
3477 /* PREFIX_VEX_5A */
3478 {
3479 { "vcvtps2pd", { XM, EXxmmq } },
3480 { VEX_LEN_TABLE (VEX_LEN_5A_P_1) },
3481 { "vcvtpd2ps%XY", { XMM, EXx } },
3482 { VEX_LEN_TABLE (VEX_LEN_5A_P_3) },
3483 },
3484
3485 /* PREFIX_VEX_5B */
3486 {
3487 { "vcvtdq2ps", { XM, EXx } },
3488 { "vcvttps2dq", { XM, EXx } },
3489 { "vcvtps2dq", { XM, EXx } },
3490 { "(bad)", { XX } },
3491 },
3492
3493 /* PREFIX_VEX_5C */
3494 {
3495 { "vsubps", { XM, Vex, EXx } },
3496 { VEX_LEN_TABLE (VEX_LEN_5C_P_1) },
3497 { "vsubpd", { XM, Vex, EXx } },
3498 { VEX_LEN_TABLE (VEX_LEN_5C_P_3) },
3499 },
3500
3501 /* PREFIX_VEX_5D */
3502 {
3503 { "vminps", { XM, Vex, EXx } },
3504 { VEX_LEN_TABLE (VEX_LEN_5D_P_1) },
3505 { "vminpd", { XM, Vex, EXx } },
3506 { VEX_LEN_TABLE (VEX_LEN_5D_P_3) },
3507 },
3508
3509 /* PREFIX_VEX_5E */
3510 {
3511 { "vdivps", { XM, Vex, EXx } },
3512 { VEX_LEN_TABLE (VEX_LEN_5E_P_1) },
3513 { "vdivpd", { XM, Vex, EXx } },
3514 { VEX_LEN_TABLE (VEX_LEN_5E_P_3) },
3515 },
3516
3517 /* PREFIX_VEX_5F */
3518 {
3519 { "vmaxps", { XM, Vex, EXx } },
3520 { VEX_LEN_TABLE (VEX_LEN_5F_P_1) },
3521 { "vmaxpd", { XM, Vex, EXx } },
3522 { VEX_LEN_TABLE (VEX_LEN_5F_P_3) },
3523 },
3524
3525 /* PREFIX_VEX_60 */
3526 {
3527 { "(bad)", { XX } },
3528 { "(bad)", { XX } },
3529 { VEX_LEN_TABLE (VEX_LEN_60_P_2) },
3530 { "(bad)", { XX } },
3531 },
3532
3533 /* PREFIX_VEX_61 */
3534 {
3535 { "(bad)", { XX } },
3536 { "(bad)", { XX } },
3537 { VEX_LEN_TABLE (VEX_LEN_61_P_2) },
3538 { "(bad)", { XX } },
3539 },
3540
3541 /* PREFIX_VEX_62 */
3542 {
3543 { "(bad)", { XX } },
3544 { "(bad)", { XX } },
3545 { VEX_LEN_TABLE (VEX_LEN_62_P_2) },
3546 { "(bad)", { XX } },
3547 },
3548
3549 /* PREFIX_VEX_63 */
3550 {
3551 { "(bad)", { XX } },
3552 { "(bad)", { XX } },
3553 { VEX_LEN_TABLE (VEX_LEN_63_P_2) },
3554 { "(bad)", { XX } },
3555 },
3556
3557 /* PREFIX_VEX_64 */
3558 {
3559 { "(bad)", { XX } },
3560 { "(bad)", { XX } },
3561 { VEX_LEN_TABLE (VEX_LEN_64_P_2) },
3562 { "(bad)", { XX } },
3563 },
3564
3565 /* PREFIX_VEX_65 */
3566 {
3567 { "(bad)", { XX } },
3568 { "(bad)", { XX } },
3569 { VEX_LEN_TABLE (VEX_LEN_65_P_2) },
3570 { "(bad)", { XX } },
3571 },
3572
3573 /* PREFIX_VEX_66 */
3574 {
3575 { "(bad)", { XX } },
3576 { "(bad)", { XX } },
3577 { VEX_LEN_TABLE (VEX_LEN_66_P_2) },
3578 { "(bad)", { XX } },
3579 },
3580
3581 /* PREFIX_VEX_67 */
3582 {
3583 { "(bad)", { XX } },
3584 { "(bad)", { XX } },
3585 { VEX_LEN_TABLE (VEX_LEN_67_P_2) },
3586 { "(bad)", { XX } },
3587 },
3588
3589 /* PREFIX_VEX_68 */
3590 {
3591 { "(bad)", { XX } },
3592 { "(bad)", { XX } },
3593 { VEX_LEN_TABLE (VEX_LEN_68_P_2) },
3594 { "(bad)", { XX } },
3595 },
3596
3597 /* PREFIX_VEX_69 */
3598 {
3599 { "(bad)", { XX } },
3600 { "(bad)", { XX } },
3601 { VEX_LEN_TABLE (VEX_LEN_69_P_2) },
3602 { "(bad)", { XX } },
3603 },
3604
3605 /* PREFIX_VEX_6A */
3606 {
3607 { "(bad)", { XX } },
3608 { "(bad)", { XX } },
3609 { VEX_LEN_TABLE (VEX_LEN_6A_P_2) },
3610 { "(bad)", { XX } },
3611 },
3612
3613 /* PREFIX_VEX_6B */
3614 {
3615 { "(bad)", { XX } },
3616 { "(bad)", { XX } },
3617 { VEX_LEN_TABLE (VEX_LEN_6B_P_2) },
3618 { "(bad)", { XX } },
3619 },
3620
3621 /* PREFIX_VEX_6C */
3622 {
3623 { "(bad)", { XX } },
3624 { "(bad)", { XX } },
3625 { VEX_LEN_TABLE (VEX_LEN_6C_P_2) },
3626 { "(bad)", { XX } },
3627 },
3628
3629 /* PREFIX_VEX_6D */
3630 {
3631 { "(bad)", { XX } },
3632 { "(bad)", { XX } },
3633 { VEX_LEN_TABLE (VEX_LEN_6D_P_2) },
3634 { "(bad)", { XX } },
3635 },
3636
3637 /* PREFIX_VEX_6E */
3638 {
3639 { "(bad)", { XX } },
3640 { "(bad)", { XX } },
3641 { VEX_LEN_TABLE (VEX_LEN_6E_P_2) },
3642 { "(bad)", { XX } },
3643 },
3644
3645 /* PREFIX_VEX_6F */
3646 {
3647 { "(bad)", { XX } },
3648 { "vmovdqu", { XM, EXx } },
3649 { "vmovdqa", { XM, EXx } },
3650 { "(bad)", { XX } },
3651 },
3652
3653 /* PREFIX_VEX_70 */
3654 {
3655 { "(bad)", { XX } },
3656 { VEX_LEN_TABLE (VEX_LEN_70_P_1) },
3657 { VEX_LEN_TABLE (VEX_LEN_70_P_2) },
3658 { VEX_LEN_TABLE (VEX_LEN_70_P_3) },
3659 },
3660
3661 /* PREFIX_VEX_71_REG_2 */
3662 {
3663 { "(bad)", { XX } },
3664 { "(bad)", { XX } },
3665 { VEX_LEN_TABLE (VEX_LEN_71_R_2_P_2) },
3666 { "(bad)", { XX } },
3667 },
3668
3669 /* PREFIX_VEX_71_REG_4 */
3670 {
3671 { "(bad)", { XX } },
3672 { "(bad)", { XX } },
3673 { VEX_LEN_TABLE (VEX_LEN_71_R_4_P_2) },
3674 { "(bad)", { XX } },
3675 },
3676
3677 /* PREFIX_VEX_71_REG_6 */
3678 {
3679 { "(bad)", { XX } },
3680 { "(bad)", { XX } },
3681 { VEX_LEN_TABLE (VEX_LEN_71_R_6_P_2) },
3682 { "(bad)", { XX } },
3683 },
3684
3685 /* PREFIX_VEX_72_REG_2 */
3686 {
3687 { "(bad)", { XX } },
3688 { "(bad)", { XX } },
3689 { VEX_LEN_TABLE (VEX_LEN_72_R_2_P_2) },
3690 { "(bad)", { XX } },
3691 },
3692
3693 /* PREFIX_VEX_72_REG_4 */
3694 {
3695 { "(bad)", { XX } },
3696 { "(bad)", { XX } },
3697 { VEX_LEN_TABLE (VEX_LEN_72_R_4_P_2) },
3698 { "(bad)", { XX } },
3699 },
3700
3701 /* PREFIX_VEX_72_REG_6 */
3702 {
3703 { "(bad)", { XX } },
3704 { "(bad)", { XX } },
3705 { VEX_LEN_TABLE (VEX_LEN_72_R_6_P_2) },
3706 { "(bad)", { XX } },
3707 },
3708
3709 /* PREFIX_VEX_73_REG_2 */
3710 {
3711 { "(bad)", { XX } },
3712 { "(bad)", { XX } },
3713 { VEX_LEN_TABLE (VEX_LEN_73_R_2_P_2) },
3714 { "(bad)", { XX } },
3715 },
3716
3717 /* PREFIX_VEX_73_REG_3 */
3718 {
3719 { "(bad)", { XX } },
3720 { "(bad)", { XX } },
3721 { VEX_LEN_TABLE (VEX_LEN_73_R_3_P_2) },
3722 { "(bad)", { XX } },
3723 },
3724
3725 /* PREFIX_VEX_73_REG_6 */
3726 {
3727 { "(bad)", { XX } },
3728 { "(bad)", { XX } },
3729 { VEX_LEN_TABLE (VEX_LEN_73_R_6_P_2) },
3730 { "(bad)", { XX } },
3731 },
3732
3733 /* PREFIX_VEX_73_REG_7 */
3734 {
3735 { "(bad)", { XX } },
3736 { "(bad)", { XX } },
3737 { VEX_LEN_TABLE (VEX_LEN_73_R_7_P_2) },
3738 { "(bad)", { XX } },
3739 },
3740
3741 /* PREFIX_VEX_74 */
3742 {
3743 { "(bad)", { XX } },
3744 { "(bad)", { XX } },
3745 { VEX_LEN_TABLE (VEX_LEN_74_P_2) },
3746 { "(bad)", { XX } },
3747 },
3748
3749 /* PREFIX_VEX_75 */
3750 {
3751 { "(bad)", { XX } },
3752 { "(bad)", { XX } },
3753 { VEX_LEN_TABLE (VEX_LEN_75_P_2) },
3754 { "(bad)", { XX } },
3755 },
3756
3757 /* PREFIX_VEX_76 */
3758 {
3759 { "(bad)", { XX } },
3760 { "(bad)", { XX } },
3761 { VEX_LEN_TABLE (VEX_LEN_76_P_2) },
3762 { "(bad)", { XX } },
3763 },
3764
3765 /* PREFIX_VEX_77 */
3766 {
3767 { "", { VZERO } },
3768 { "(bad)", { XX } },
3769 { "(bad)", { XX } },
3770 { "(bad)", { XX } },
3771 },
3772
3773 /* PREFIX_VEX_7C */
3774 {
3775 { "(bad)", { XX } },
3776 { "(bad)", { XX } },
3777 { "vhaddpd", { XM, Vex, EXx } },
3778 { "vhaddps", { XM, Vex, EXx } },
3779 },
3780
3781 /* PREFIX_VEX_7D */
3782 {
3783 { "(bad)", { XX } },
3784 { "(bad)", { XX } },
3785 { "vhsubpd", { XM, Vex, EXx } },
3786 { "vhsubps", { XM, Vex, EXx } },
3787 },
3788
3789 /* PREFIX_VEX_7E */
3790 {
3791 { "(bad)", { XX } },
3792 { VEX_LEN_TABLE (VEX_LEN_7E_P_1) },
3793 { VEX_LEN_TABLE (VEX_LEN_7E_P_2) },
3794 { "(bad)", { XX } },
3795 },
3796
3797 /* PREFIX_VEX_7F */
3798 {
3799 { "(bad)", { XX } },
3800 { "vmovdqu", { EXxS, XM } },
3801 { "vmovdqa", { EXxS, XM } },
3802 { "(bad)", { XX } },
3803 },
3804
3805 /* PREFIX_VEX_C2 */
3806 {
3807 { "vcmpps", { XM, Vex, EXx, VCMP } },
3808 { VEX_LEN_TABLE (VEX_LEN_C2_P_1) },
3809 { "vcmppd", { XM, Vex, EXx, VCMP } },
3810 { VEX_LEN_TABLE (VEX_LEN_C2_P_3) },
3811 },
3812
3813 /* PREFIX_VEX_C4 */
3814 {
3815 { "(bad)", { XX } },
3816 { "(bad)", { XX } },
3817 { VEX_LEN_TABLE (VEX_LEN_C4_P_2) },
3818 { "(bad)", { XX } },
3819 },
3820
3821 /* PREFIX_VEX_C5 */
3822 {
3823 { "(bad)", { XX } },
3824 { "(bad)", { XX } },
3825 { VEX_LEN_TABLE (VEX_LEN_C5_P_2) },
3826 { "(bad)", { XX } },
3827 },
3828
3829 /* PREFIX_VEX_D0 */
3830 {
3831 { "(bad)", { XX } },
3832 { "(bad)", { XX } },
3833 { "vaddsubpd", { XM, Vex, EXx } },
3834 { "vaddsubps", { XM, Vex, EXx } },
3835 },
3836
3837 /* PREFIX_VEX_D1 */
3838 {
3839 { "(bad)", { XX } },
3840 { "(bad)", { XX } },
3841 { VEX_LEN_TABLE (VEX_LEN_D1_P_2) },
3842 { "(bad)", { XX } },
3843 },
3844
3845 /* PREFIX_VEX_D2 */
3846 {
3847 { "(bad)", { XX } },
3848 { "(bad)", { XX } },
3849 { VEX_LEN_TABLE (VEX_LEN_D2_P_2) },
3850 { "(bad)", { XX } },
3851 },
3852
3853 /* PREFIX_VEX_D3 */
3854 {
3855 { "(bad)", { XX } },
3856 { "(bad)", { XX } },
3857 { VEX_LEN_TABLE (VEX_LEN_D3_P_2) },
3858 { "(bad)", { XX } },
3859 },
3860
3861 /* PREFIX_VEX_D4 */
3862 {
3863 { "(bad)", { XX } },
3864 { "(bad)", { XX } },
3865 { VEX_LEN_TABLE (VEX_LEN_D4_P_2) },
3866 { "(bad)", { XX } },
3867 },
3868
3869 /* PREFIX_VEX_D5 */
3870 {
3871 { "(bad)", { XX } },
3872 { "(bad)", { XX } },
3873 { VEX_LEN_TABLE (VEX_LEN_D5_P_2) },
3874 { "(bad)", { XX } },
3875 },
3876
3877 /* PREFIX_VEX_D6 */
3878 {
3879 { "(bad)", { XX } },
3880 { "(bad)", { XX } },
3881 { VEX_LEN_TABLE (VEX_LEN_D6_P_2) },
3882 { "(bad)", { XX } },
3883 },
3884
3885 /* PREFIX_VEX_D7 */
3886 {
3887 { "(bad)", { XX } },
3888 { "(bad)", { XX } },
3889 { MOD_TABLE (MOD_VEX_D7_PREFIX_2) },
3890 { "(bad)", { XX } },
3891 },
3892
3893 /* PREFIX_VEX_D8 */
3894 {
3895 { "(bad)", { XX } },
3896 { "(bad)", { XX } },
3897 { VEX_LEN_TABLE (VEX_LEN_D8_P_2) },
3898 { "(bad)", { XX } },
3899 },
3900
3901 /* PREFIX_VEX_D9 */
3902 {
3903 { "(bad)", { XX } },
3904 { "(bad)", { XX } },
3905 { VEX_LEN_TABLE (VEX_LEN_D9_P_2) },
3906 { "(bad)", { XX } },
3907 },
3908
3909 /* PREFIX_VEX_DA */
3910 {
3911 { "(bad)", { XX } },
3912 { "(bad)", { XX } },
3913 { VEX_LEN_TABLE (VEX_LEN_DA_P_2) },
3914 { "(bad)", { XX } },
3915 },
3916
3917 /* PREFIX_VEX_DB */
3918 {
3919 { "(bad)", { XX } },
3920 { "(bad)", { XX } },
3921 { VEX_LEN_TABLE (VEX_LEN_DB_P_2) },
3922 { "(bad)", { XX } },
3923 },
3924
3925 /* PREFIX_VEX_DC */
3926 {
3927 { "(bad)", { XX } },
3928 { "(bad)", { XX } },
3929 { VEX_LEN_TABLE (VEX_LEN_DC_P_2) },
3930 { "(bad)", { XX } },
3931 },
3932
3933 /* PREFIX_VEX_DD */
3934 {
3935 { "(bad)", { XX } },
3936 { "(bad)", { XX } },
3937 { VEX_LEN_TABLE (VEX_LEN_DD_P_2) },
3938 { "(bad)", { XX } },
3939 },
3940
3941 /* PREFIX_VEX_DE */
3942 {
3943 { "(bad)", { XX } },
3944 { "(bad)", { XX } },
3945 { VEX_LEN_TABLE (VEX_LEN_DE_P_2) },
3946 { "(bad)", { XX } },
3947 },
3948
3949 /* PREFIX_VEX_DF */
3950 {
3951 { "(bad)", { XX } },
3952 { "(bad)", { XX } },
3953 { VEX_LEN_TABLE (VEX_LEN_DF_P_2) },
3954 { "(bad)", { XX } },
3955 },
3956
3957 /* PREFIX_VEX_E0 */
3958 {
3959 { "(bad)", { XX } },
3960 { "(bad)", { XX } },
3961 { VEX_LEN_TABLE (VEX_LEN_E0_P_2) },
3962 { "(bad)", { XX } },
3963 },
3964
3965 /* PREFIX_VEX_E1 */
3966 {
3967 { "(bad)", { XX } },
3968 { "(bad)", { XX } },
3969 { VEX_LEN_TABLE (VEX_LEN_E1_P_2) },
3970 { "(bad)", { XX } },
3971 },
3972
3973 /* PREFIX_VEX_E2 */
3974 {
3975 { "(bad)", { XX } },
3976 { "(bad)", { XX } },
3977 { VEX_LEN_TABLE (VEX_LEN_E2_P_2) },
3978 { "(bad)", { XX } },
3979 },
3980
3981 /* PREFIX_VEX_E3 */
3982 {
3983 { "(bad)", { XX } },
3984 { "(bad)", { XX } },
3985 { VEX_LEN_TABLE (VEX_LEN_E3_P_2) },
3986 { "(bad)", { XX } },
3987 },
3988
3989 /* PREFIX_VEX_E4 */
3990 {
3991 { "(bad)", { XX } },
3992 { "(bad)", { XX } },
3993 { VEX_LEN_TABLE (VEX_LEN_E4_P_2) },
3994 { "(bad)", { XX } },
3995 },
3996
3997 /* PREFIX_VEX_E5 */
3998 {
3999 { "(bad)", { XX } },
4000 { "(bad)", { XX } },
4001 { VEX_LEN_TABLE (VEX_LEN_E5_P_2) },
4002 { "(bad)", { XX } },
4003 },
4004
4005 /* PREFIX_VEX_E6 */
4006 {
4007 { "(bad)", { XX } },
4008 { "vcvtdq2pd", { XM, EXxmmq } },
4009 { "vcvttpd2dq%XY", { XMM, EXx } },
4010 { "vcvtpd2dq%XY", { XMM, EXx } },
4011 },
4012
4013 /* PREFIX_VEX_E7 */
4014 {
4015 { "(bad)", { XX } },
4016 { "(bad)", { XX } },
4017 { MOD_TABLE (MOD_VEX_E7_PREFIX_2) },
4018 { "(bad)", { XX } },
4019 },
4020
4021 /* PREFIX_VEX_E8 */
4022 {
4023 { "(bad)", { XX } },
4024 { "(bad)", { XX } },
4025 { VEX_LEN_TABLE (VEX_LEN_E8_P_2) },
4026 { "(bad)", { XX } },
4027 },
4028
4029 /* PREFIX_VEX_E9 */
4030 {
4031 { "(bad)", { XX } },
4032 { "(bad)", { XX } },
4033 { VEX_LEN_TABLE (VEX_LEN_E9_P_2) },
4034 { "(bad)", { XX } },
4035 },
4036
4037 /* PREFIX_VEX_EA */
4038 {
4039 { "(bad)", { XX } },
4040 { "(bad)", { XX } },
4041 { VEX_LEN_TABLE (VEX_LEN_EA_P_2) },
4042 { "(bad)", { XX } },
4043 },
4044
4045 /* PREFIX_VEX_EB */
4046 {
4047 { "(bad)", { XX } },
4048 { "(bad)", { XX } },
4049 { VEX_LEN_TABLE (VEX_LEN_EB_P_2) },
4050 { "(bad)", { XX } },
4051 },
4052
4053 /* PREFIX_VEX_EC */
4054 {
4055 { "(bad)", { XX } },
4056 { "(bad)", { XX } },
4057 { VEX_LEN_TABLE (VEX_LEN_EC_P_2) },
4058 { "(bad)", { XX } },
4059 },
4060
4061 /* PREFIX_VEX_ED */
4062 {
4063 { "(bad)", { XX } },
4064 { "(bad)", { XX } },
4065 { VEX_LEN_TABLE (VEX_LEN_ED_P_2) },
4066 { "(bad)", { XX } },
4067 },
4068
4069 /* PREFIX_VEX_EE */
4070 {
4071 { "(bad)", { XX } },
4072 { "(bad)", { XX } },
4073 { VEX_LEN_TABLE (VEX_LEN_EE_P_2) },
4074 { "(bad)", { XX } },
4075 },
4076
4077 /* PREFIX_VEX_EF */
4078 {
4079 { "(bad)", { XX } },
4080 { "(bad)", { XX } },
4081 { VEX_LEN_TABLE (VEX_LEN_EF_P_2) },
4082 { "(bad)", { XX } },
4083 },
4084
4085 /* PREFIX_VEX_F0 */
4086 {
4087 { "(bad)", { XX } },
4088 { "(bad)", { XX } },
4089 { "(bad)", { XX } },
4090 { MOD_TABLE (MOD_VEX_F0_PREFIX_3) },
4091 },
4092
4093 /* PREFIX_VEX_F1 */
4094 {
4095 { "(bad)", { XX } },
4096 { "(bad)", { XX } },
4097 { VEX_LEN_TABLE (VEX_LEN_F1_P_2) },
4098 { "(bad)", { XX } },
4099 },
4100
4101 /* PREFIX_VEX_F2 */
4102 {
4103 { "(bad)", { XX } },
4104 { "(bad)", { XX } },
4105 { VEX_LEN_TABLE (VEX_LEN_F2_P_2) },
4106 { "(bad)", { XX } },
4107 },
4108
4109 /* PREFIX_VEX_F3 */
4110 {
4111 { "(bad)", { XX } },
4112 { "(bad)", { XX } },
4113 { VEX_LEN_TABLE (VEX_LEN_F3_P_2) },
4114 { "(bad)", { XX } },
4115 },
4116
4117 /* PREFIX_VEX_F4 */
4118 {
4119 { "(bad)", { XX } },
4120 { "(bad)", { XX } },
4121 { VEX_LEN_TABLE (VEX_LEN_F4_P_2) },
4122 { "(bad)", { XX } },
4123 },
4124
4125 /* PREFIX_VEX_F5 */
4126 {
4127 { "(bad)", { XX } },
4128 { "(bad)", { XX } },
4129 { VEX_LEN_TABLE (VEX_LEN_F5_P_2) },
4130 { "(bad)", { XX } },
4131 },
4132
4133 /* PREFIX_VEX_F6 */
4134 {
4135 { "(bad)", { XX } },
4136 { "(bad)", { XX } },
4137 { VEX_LEN_TABLE (VEX_LEN_F6_P_2) },
4138 { "(bad)", { XX } },
4139 },
4140
4141 /* PREFIX_VEX_F7 */
4142 {
4143 { "(bad)", { XX } },
4144 { "(bad)", { XX } },
4145 { VEX_LEN_TABLE (VEX_LEN_F7_P_2) },
4146 { "(bad)", { XX } },
4147 },
4148
4149 /* PREFIX_VEX_F8 */
4150 {
4151 { "(bad)", { XX } },
4152 { "(bad)", { XX } },
4153 { VEX_LEN_TABLE (VEX_LEN_F8_P_2) },
4154 { "(bad)", { XX } },
4155 },
4156
4157 /* PREFIX_VEX_F9 */
4158 {
4159 { "(bad)", { XX } },
4160 { "(bad)", { XX } },
4161 { VEX_LEN_TABLE (VEX_LEN_F9_P_2) },
4162 { "(bad)", { XX } },
4163 },
4164
4165 /* PREFIX_VEX_FA */
4166 {
4167 { "(bad)", { XX } },
4168 { "(bad)", { XX } },
4169 { VEX_LEN_TABLE (VEX_LEN_FA_P_2) },
4170 { "(bad)", { XX } },
4171 },
4172
4173 /* PREFIX_VEX_FB */
4174 {
4175 { "(bad)", { XX } },
4176 { "(bad)", { XX } },
4177 { VEX_LEN_TABLE (VEX_LEN_FB_P_2) },
4178 { "(bad)", { XX } },
4179 },
4180
4181 /* PREFIX_VEX_FC */
4182 {
4183 { "(bad)", { XX } },
4184 { "(bad)", { XX } },
4185 { VEX_LEN_TABLE (VEX_LEN_FC_P_2) },
4186 { "(bad)", { XX } },
4187 },
4188
4189 /* PREFIX_VEX_FD */
4190 {
4191 { "(bad)", { XX } },
4192 { "(bad)", { XX } },
4193 { VEX_LEN_TABLE (VEX_LEN_FD_P_2) },
4194 { "(bad)", { XX } },
4195 },
4196
4197 /* PREFIX_VEX_FE */
4198 {
4199 { "(bad)", { XX } },
4200 { "(bad)", { XX } },
4201 { VEX_LEN_TABLE (VEX_LEN_FE_P_2) },
4202 { "(bad)", { XX } },
4203 },
4204
4205 /* PREFIX_VEX_3800 */
4206 {
4207 { "(bad)", { XX } },
4208 { "(bad)", { XX } },
4209 { VEX_LEN_TABLE (VEX_LEN_3800_P_2) },
4210 { "(bad)", { XX } },
4211 },
4212
4213 /* PREFIX_VEX_3801 */
4214 {
4215 { "(bad)", { XX } },
4216 { "(bad)", { XX } },
4217 { VEX_LEN_TABLE (VEX_LEN_3801_P_2) },
4218 { "(bad)", { XX } },
4219 },
4220
4221 /* PREFIX_VEX_3802 */
4222 {
4223 { "(bad)", { XX } },
4224 { "(bad)", { XX } },
4225 { VEX_LEN_TABLE (VEX_LEN_3802_P_2) },
4226 { "(bad)", { XX } },
4227 },
4228
4229 /* PREFIX_VEX_3803 */
4230 {
4231 { "(bad)", { XX } },
4232 { "(bad)", { XX } },
4233 { VEX_LEN_TABLE (VEX_LEN_3803_P_2) },
4234 { "(bad)", { XX } },
4235 },
4236
4237 /* PREFIX_VEX_3804 */
4238 {
4239 { "(bad)", { XX } },
4240 { "(bad)", { XX } },
4241 { VEX_LEN_TABLE (VEX_LEN_3804_P_2) },
4242 { "(bad)", { XX } },
4243 },
4244
4245 /* PREFIX_VEX_3805 */
4246 {
4247 { "(bad)", { XX } },
4248 { "(bad)", { XX } },
4249 { VEX_LEN_TABLE (VEX_LEN_3805_P_2) },
4250 { "(bad)", { XX } },
4251 },
4252
4253 /* PREFIX_VEX_3806 */
4254 {
4255 { "(bad)", { XX } },
4256 { "(bad)", { XX } },
4257 { VEX_LEN_TABLE (VEX_LEN_3806_P_2) },
4258 { "(bad)", { XX } },
4259 },
4260
4261 /* PREFIX_VEX_3807 */
4262 {
4263 { "(bad)", { XX } },
4264 { "(bad)", { XX } },
4265 { VEX_LEN_TABLE (VEX_LEN_3807_P_2) },
4266 { "(bad)", { XX } },
4267 },
4268
4269 /* PREFIX_VEX_3808 */
4270 {
4271 { "(bad)", { XX } },
4272 { "(bad)", { XX } },
4273 { VEX_LEN_TABLE (VEX_LEN_3808_P_2) },
4274 { "(bad)", { XX } },
4275 },
4276
4277 /* PREFIX_VEX_3809 */
4278 {
4279 { "(bad)", { XX } },
4280 { "(bad)", { XX } },
4281 { VEX_LEN_TABLE (VEX_LEN_3809_P_2) },
4282 { "(bad)", { XX } },
4283 },
4284
4285 /* PREFIX_VEX_380A */
4286 {
4287 { "(bad)", { XX } },
4288 { "(bad)", { XX } },
4289 { VEX_LEN_TABLE (VEX_LEN_380A_P_2) },
4290 { "(bad)", { XX } },
4291 },
4292
4293 /* PREFIX_VEX_380B */
4294 {
4295 { "(bad)", { XX } },
4296 { "(bad)", { XX } },
4297 { VEX_LEN_TABLE (VEX_LEN_380B_P_2) },
4298 { "(bad)", { XX } },
4299 },
4300
4301 /* PREFIX_VEX_380C */
4302 {
4303 { "(bad)", { XX } },
4304 { "(bad)", { XX } },
4305 { "vpermilps", { XM, Vex, EXx } },
4306 { "(bad)", { XX } },
4307 },
4308
4309 /* PREFIX_VEX_380D */
4310 {
4311 { "(bad)", { XX } },
4312 { "(bad)", { XX } },
4313 { "vpermilpd", { XM, Vex, EXx } },
4314 { "(bad)", { XX } },
4315 },
4316
4317 /* PREFIX_VEX_380E */
4318 {
4319 { "(bad)", { XX } },
4320 { "(bad)", { XX } },
4321 { "vtestps", { XM, EXx } },
4322 { "(bad)", { XX } },
4323 },
4324
4325 /* PREFIX_VEX_380F */
4326 {
4327 { "(bad)", { XX } },
4328 { "(bad)", { XX } },
4329 { "vtestpd", { XM, EXx } },
4330 { "(bad)", { XX } },
4331 },
4332
4333 /* PREFIX_VEX_3817 */
4334 {
4335 { "(bad)", { XX } },
4336 { "(bad)", { XX } },
4337 { "vptest", { XM, EXx } },
4338 { "(bad)", { XX } },
4339 },
4340
4341 /* PREFIX_VEX_3818 */
4342 {
4343 { "(bad)", { XX } },
4344 { "(bad)", { XX } },
4345 { MOD_TABLE (MOD_VEX_3818_PREFIX_2) },
4346 { "(bad)", { XX } },
4347 },
4348
4349 /* PREFIX_VEX_3819 */
4350 {
4351 { "(bad)", { XX } },
4352 { "(bad)", { XX } },
4353 { MOD_TABLE (MOD_VEX_3819_PREFIX_2) },
4354 { "(bad)", { XX } },
4355 },
4356
4357 /* PREFIX_VEX_381A */
4358 {
4359 { "(bad)", { XX } },
4360 { "(bad)", { XX } },
4361 { MOD_TABLE (MOD_VEX_381A_PREFIX_2) },
4362 { "(bad)", { XX } },
4363 },
4364
4365 /* PREFIX_VEX_381C */
4366 {
4367 { "(bad)", { XX } },
4368 { "(bad)", { XX } },
4369 { VEX_LEN_TABLE (VEX_LEN_381C_P_2) },
4370 { "(bad)", { XX } },
4371 },
4372
4373 /* PREFIX_VEX_381D */
4374 {
4375 { "(bad)", { XX } },
4376 { "(bad)", { XX } },
4377 { VEX_LEN_TABLE (VEX_LEN_381D_P_2) },
4378 { "(bad)", { XX } },
4379 },
4380
4381 /* PREFIX_VEX_381E */
4382 {
4383 { "(bad)", { XX } },
4384 { "(bad)", { XX } },
4385 { VEX_LEN_TABLE (VEX_LEN_381E_P_2) },
4386 { "(bad)", { XX } },
4387 },
4388
4389 /* PREFIX_VEX_3820 */
4390 {
4391 { "(bad)", { XX } },
4392 { "(bad)", { XX } },
4393 { VEX_LEN_TABLE (VEX_LEN_3820_P_2) },
4394 { "(bad)", { XX } },
4395 },
4396
4397 /* PREFIX_VEX_3821 */
4398 {
4399 { "(bad)", { XX } },
4400 { "(bad)", { XX } },
4401 { VEX_LEN_TABLE (VEX_LEN_3821_P_2) },
4402 { "(bad)", { XX } },
4403 },
4404
4405 /* PREFIX_VEX_3822 */
4406 {
4407 { "(bad)", { XX } },
4408 { "(bad)", { XX } },
4409 { VEX_LEN_TABLE (VEX_LEN_3822_P_2) },
4410 { "(bad)", { XX } },
4411 },
4412
4413 /* PREFIX_VEX_3823 */
4414 {
4415 { "(bad)", { XX } },
4416 { "(bad)", { XX } },
4417 { VEX_LEN_TABLE (VEX_LEN_3823_P_2) },
4418 { "(bad)", { XX } },
4419 },
4420
4421 /* PREFIX_VEX_3824 */
4422 {
4423 { "(bad)", { XX } },
4424 { "(bad)", { XX } },
4425 { VEX_LEN_TABLE (VEX_LEN_3824_P_2) },
4426 { "(bad)", { XX } },
4427 },
4428
4429 /* PREFIX_VEX_3825 */
4430 {
4431 { "(bad)", { XX } },
4432 { "(bad)", { XX } },
4433 { VEX_LEN_TABLE (VEX_LEN_3825_P_2) },
4434 { "(bad)", { XX } },
4435 },
4436
4437 /* PREFIX_VEX_3828 */
4438 {
4439 { "(bad)", { XX } },
4440 { "(bad)", { XX } },
4441 { VEX_LEN_TABLE (VEX_LEN_3828_P_2) },
4442 { "(bad)", { XX } },
4443 },
4444
4445 /* PREFIX_VEX_3829 */
4446 {
4447 { "(bad)", { XX } },
4448 { "(bad)", { XX } },
4449 { VEX_LEN_TABLE (VEX_LEN_3829_P_2) },
4450 { "(bad)", { XX } },
4451 },
4452
4453 /* PREFIX_VEX_382A */
4454 {
4455 { "(bad)", { XX } },
4456 { "(bad)", { XX } },
4457 { MOD_TABLE (MOD_VEX_382A_PREFIX_2) },
4458 { "(bad)", { XX } },
4459 },
4460
4461 /* PREFIX_VEX_382B */
4462 {
4463 { "(bad)", { XX } },
4464 { "(bad)", { XX } },
4465 { VEX_LEN_TABLE (VEX_LEN_382B_P_2) },
4466 { "(bad)", { XX } },
4467 },
4468
4469 /* PREFIX_VEX_382C */
4470 {
4471 { "(bad)", { XX } },
4472 { "(bad)", { XX } },
4473 { MOD_TABLE (MOD_VEX_382C_PREFIX_2) },
4474 { "(bad)", { XX } },
4475 },
4476
4477 /* PREFIX_VEX_382D */
4478 {
4479 { "(bad)", { XX } },
4480 { "(bad)", { XX } },
4481 { MOD_TABLE (MOD_VEX_382D_PREFIX_2) },
4482 { "(bad)", { XX } },
4483 },
4484
4485 /* PREFIX_VEX_382E */
4486 {
4487 { "(bad)", { XX } },
4488 { "(bad)", { XX } },
4489 { MOD_TABLE (MOD_VEX_382E_PREFIX_2) },
4490 { "(bad)", { XX } },
4491 },
4492
4493 /* PREFIX_VEX_382F */
4494 {
4495 { "(bad)", { XX } },
4496 { "(bad)", { XX } },
4497 { MOD_TABLE (MOD_VEX_382F_PREFIX_2) },
4498 { "(bad)", { XX } },
4499 },
4500
4501 /* PREFIX_VEX_3830 */
4502 {
4503 { "(bad)", { XX } },
4504 { "(bad)", { XX } },
4505 { VEX_LEN_TABLE (VEX_LEN_3830_P_2) },
4506 { "(bad)", { XX } },
4507 },
4508
4509 /* PREFIX_VEX_3831 */
4510 {
4511 { "(bad)", { XX } },
4512 { "(bad)", { XX } },
4513 { VEX_LEN_TABLE (VEX_LEN_3831_P_2) },
4514 { "(bad)", { XX } },
4515 },
4516
4517 /* PREFIX_VEX_3832 */
4518 {
4519 { "(bad)", { XX } },
4520 { "(bad)", { XX } },
4521 { VEX_LEN_TABLE (VEX_LEN_3832_P_2) },
4522 { "(bad)", { XX } },
4523 },
4524
4525 /* PREFIX_VEX_3833 */
4526 {
4527 { "(bad)", { XX } },
4528 { "(bad)", { XX } },
4529 { VEX_LEN_TABLE (VEX_LEN_3833_P_2) },
4530 { "(bad)", { XX } },
4531 },
4532
4533 /* PREFIX_VEX_3834 */
4534 {
4535 { "(bad)", { XX } },
4536 { "(bad)", { XX } },
4537 { VEX_LEN_TABLE (VEX_LEN_3834_P_2) },
4538 { "(bad)", { XX } },
4539 },
4540
4541 /* PREFIX_VEX_3835 */
4542 {
4543 { "(bad)", { XX } },
4544 { "(bad)", { XX } },
4545 { VEX_LEN_TABLE (VEX_LEN_3835_P_2) },
4546 { "(bad)", { XX } },
4547 },
4548
4549 /* PREFIX_VEX_3837 */
4550 {
4551 { "(bad)", { XX } },
4552 { "(bad)", { XX } },
4553 { VEX_LEN_TABLE (VEX_LEN_3837_P_2) },
4554 { "(bad)", { XX } },
4555 },
4556
4557 /* PREFIX_VEX_3838 */
4558 {
4559 { "(bad)", { XX } },
4560 { "(bad)", { XX } },
4561 { VEX_LEN_TABLE (VEX_LEN_3838_P_2) },
4562 { "(bad)", { XX } },
4563 },
4564
4565 /* PREFIX_VEX_3839 */
4566 {
4567 { "(bad)", { XX } },
4568 { "(bad)", { XX } },
4569 { VEX_LEN_TABLE (VEX_LEN_3839_P_2) },
4570 { "(bad)", { XX } },
4571 },
4572
4573 /* PREFIX_VEX_383A */
4574 {
4575 { "(bad)", { XX } },
4576 { "(bad)", { XX } },
4577 { VEX_LEN_TABLE (VEX_LEN_383A_P_2) },
4578 { "(bad)", { XX } },
4579 },
4580
4581 /* PREFIX_VEX_383B */
4582 {
4583 { "(bad)", { XX } },
4584 { "(bad)", { XX } },
4585 { VEX_LEN_TABLE (VEX_LEN_383B_P_2) },
4586 { "(bad)", { XX } },
4587 },
4588
4589 /* PREFIX_VEX_383C */
4590 {
4591 { "(bad)", { XX } },
4592 { "(bad)", { XX } },
4593 { VEX_LEN_TABLE (VEX_LEN_383C_P_2) },
4594 { "(bad)", { XX } },
4595 },
4596
4597 /* PREFIX_VEX_383D */
4598 {
4599 { "(bad)", { XX } },
4600 { "(bad)", { XX } },
4601 { VEX_LEN_TABLE (VEX_LEN_383D_P_2) },
4602 { "(bad)", { XX } },
4603 },
4604
4605 /* PREFIX_VEX_383E */
4606 {
4607 { "(bad)", { XX } },
4608 { "(bad)", { XX } },
4609 { VEX_LEN_TABLE (VEX_LEN_383E_P_2) },
4610 { "(bad)", { XX } },
4611 },
4612
4613 /* PREFIX_VEX_383F */
4614 {
4615 { "(bad)", { XX } },
4616 { "(bad)", { XX } },
4617 { VEX_LEN_TABLE (VEX_LEN_383F_P_2) },
4618 { "(bad)", { XX } },
4619 },
4620
4621 /* PREFIX_VEX_3840 */
4622 {
4623 { "(bad)", { XX } },
4624 { "(bad)", { XX } },
4625 { VEX_LEN_TABLE (VEX_LEN_3840_P_2) },
4626 { "(bad)", { XX } },
4627 },
4628
4629 /* PREFIX_VEX_3841 */
4630 {
4631 { "(bad)", { XX } },
4632 { "(bad)", { XX } },
4633 { VEX_LEN_TABLE (VEX_LEN_3841_P_2) },
4634 { "(bad)", { XX } },
4635 },
4636
4637 /* PREFIX_VEX_3896 */
4638 {
4639 { "(bad)", { XX } },
4640 { "(bad)", { XX } },
4641 { "vfmaddsub132p%XW", { XM, Vex, EXx } },
4642 { "(bad)", { XX } },
4643 },
4644
4645 /* PREFIX_VEX_3897 */
4646 {
4647 { "(bad)", { XX } },
4648 { "(bad)", { XX } },
4649 { "vfmsubadd132p%XW", { XM, Vex, EXx } },
4650 { "(bad)", { XX } },
4651 },
4652
4653 /* PREFIX_VEX_3898 */
4654 {
4655 { "(bad)", { XX } },
4656 { "(bad)", { XX } },
4657 { "vfmadd132p%XW", { XM, Vex, EXx } },
4658 { "(bad)", { XX } },
4659 },
4660
4661 /* PREFIX_VEX_3899 */
4662 {
4663 { "(bad)", { XX } },
4664 { "(bad)", { XX } },
4665 { "vfmadd132s%XW", { XM, Vex, EXVexWdq } },
4666 { "(bad)", { XX } },
4667 },
4668
4669 /* PREFIX_VEX_389A */
4670 {
4671 { "(bad)", { XX } },
4672 { "(bad)", { XX } },
4673 { "vfmsub132p%XW", { XM, Vex, EXx } },
4674 { "(bad)", { XX } },
4675 },
4676
4677 /* PREFIX_VEX_389B */
4678 {
4679 { "(bad)", { XX } },
4680 { "(bad)", { XX } },
4681 { "vfmsub132s%XW", { XM, Vex, EXVexWdq } },
4682 { "(bad)", { XX } },
4683 },
4684
4685 /* PREFIX_VEX_389C */
4686 {
4687 { "(bad)", { XX } },
4688 { "(bad)", { XX } },
4689 { "vfnmadd132p%XW", { XM, Vex, EXx } },
4690 { "(bad)", { XX } },
4691 },
4692
4693 /* PREFIX_VEX_389D */
4694 {
4695 { "(bad)", { XX } },
4696 { "(bad)", { XX } },
4697 { "vfnmadd132s%XW", { XM, Vex, EXVexWdq } },
4698 { "(bad)", { XX } },
4699 },
4700
4701 /* PREFIX_VEX_389E */
4702 {
4703 { "(bad)", { XX } },
4704 { "(bad)", { XX } },
4705 { "vfnmsub132p%XW", { XM, Vex, EXx } },
4706 { "(bad)", { XX } },
4707 },
4708
4709 /* PREFIX_VEX_389F */
4710 {
4711 { "(bad)", { XX } },
4712 { "(bad)", { XX } },
4713 { "vfnmsub132s%XW", { XM, Vex, EXVexWdq } },
4714 { "(bad)", { XX } },
4715 },
4716
4717 /* PREFIX_VEX_38A6 */
4718 {
4719 { "(bad)", { XX } },
4720 { "(bad)", { XX } },
4721 { "vfmaddsub213p%XW", { XM, Vex, EXx } },
4722 { "(bad)", { XX } },
4723 },
4724
4725 /* PREFIX_VEX_38A7 */
4726 {
4727 { "(bad)", { XX } },
4728 { "(bad)", { XX } },
4729 { "vfmsubadd213p%XW", { XM, Vex, EXx } },
4730 { "(bad)", { XX } },
4731 },
4732
4733 /* PREFIX_VEX_38A8 */
4734 {
4735 { "(bad)", { XX } },
4736 { "(bad)", { XX } },
4737 { "vfmadd213p%XW", { XM, Vex, EXx } },
4738 { "(bad)", { XX } },
4739 },
4740
4741 /* PREFIX_VEX_38A9 */
4742 {
4743 { "(bad)", { XX } },
4744 { "(bad)", { XX } },
4745 { "vfmadd213s%XW", { XM, Vex, EXVexWdq } },
4746 { "(bad)", { XX } },
4747 },
4748
4749 /* PREFIX_VEX_38AA */
4750 {
4751 { "(bad)", { XX } },
4752 { "(bad)", { XX } },
4753 { "vfmsub213p%XW", { XM, Vex, EXx } },
4754 { "(bad)", { XX } },
4755 },
4756
4757 /* PREFIX_VEX_38AB */
4758 {
4759 { "(bad)", { XX } },
4760 { "(bad)", { XX } },
4761 { "vfmsub213s%XW", { XM, Vex, EXVexWdq } },
4762 { "(bad)", { XX } },
4763 },
4764
4765 /* PREFIX_VEX_38AC */
4766 {
4767 { "(bad)", { XX } },
4768 { "(bad)", { XX } },
4769 { "vfnmadd213p%XW", { XM, Vex, EXx } },
4770 { "(bad)", { XX } },
4771 },
4772
4773 /* PREFIX_VEX_38AD */
4774 {
4775 { "(bad)", { XX } },
4776 { "(bad)", { XX } },
4777 { "vfnmadd213s%XW", { XM, Vex, EXVexWdq } },
4778 { "(bad)", { XX } },
4779 },
4780
4781 /* PREFIX_VEX_38AE */
4782 {
4783 { "(bad)", { XX } },
4784 { "(bad)", { XX } },
4785 { "vfnmsub213p%XW", { XM, Vex, EXx } },
4786 { "(bad)", { XX } },
4787 },
4788
4789 /* PREFIX_VEX_38AF */
4790 {
4791 { "(bad)", { XX } },
4792 { "(bad)", { XX } },
4793 { "vfnmsub213s%XW", { XM, Vex, EXVexWdq } },
4794 { "(bad)", { XX } },
4795 },
4796
4797 /* PREFIX_VEX_38B6 */
4798 {
4799 { "(bad)", { XX } },
4800 { "(bad)", { XX } },
4801 { "vfmaddsub231p%XW", { XM, Vex, EXx } },
4802 { "(bad)", { XX } },
4803 },
4804
4805 /* PREFIX_VEX_38B7 */
4806 {
4807 { "(bad)", { XX } },
4808 { "(bad)", { XX } },
4809 { "vfmsubadd231p%XW", { XM, Vex, EXx } },
4810 { "(bad)", { XX } },
4811 },
4812
4813 /* PREFIX_VEX_38B8 */
4814 {
4815 { "(bad)", { XX } },
4816 { "(bad)", { XX } },
4817 { "vfmadd231p%XW", { XM, Vex, EXx } },
4818 { "(bad)", { XX } },
4819 },
4820
4821 /* PREFIX_VEX_38B9 */
4822 {
4823 { "(bad)", { XX } },
4824 { "(bad)", { XX } },
4825 { "vfmadd231s%XW", { XM, Vex, EXVexWdq } },
4826 { "(bad)", { XX } },
4827 },
4828
4829 /* PREFIX_VEX_38BA */
4830 {
4831 { "(bad)", { XX } },
4832 { "(bad)", { XX } },
4833 { "vfmsub231p%XW", { XM, Vex, EXx } },
4834 { "(bad)", { XX } },
4835 },
4836
4837 /* PREFIX_VEX_38BB */
4838 {
4839 { "(bad)", { XX } },
4840 { "(bad)", { XX } },
4841 { "vfmsub231s%XW", { XM, Vex, EXVexWdq } },
4842 { "(bad)", { XX } },
4843 },
4844
4845 /* PREFIX_VEX_38BC */
4846 {
4847 { "(bad)", { XX } },
4848 { "(bad)", { XX } },
4849 { "vfnmadd231p%XW", { XM, Vex, EXx } },
4850 { "(bad)", { XX } },
4851 },
4852
4853 /* PREFIX_VEX_38BD */
4854 {
4855 { "(bad)", { XX } },
4856 { "(bad)", { XX } },
4857 { "vfnmadd231s%XW", { XM, Vex, EXVexWdq } },
4858 { "(bad)", { XX } },
4859 },
4860
4861 /* PREFIX_VEX_38BE */
4862 {
4863 { "(bad)", { XX } },
4864 { "(bad)", { XX } },
4865 { "vfnmsub231p%XW", { XM, Vex, EXx } },
4866 { "(bad)", { XX } },
4867 },
4868
4869 /* PREFIX_VEX_38BF */
4870 {
4871 { "(bad)", { XX } },
4872 { "(bad)", { XX } },
4873 { "vfnmsub231s%XW", { XM, Vex, EXVexWdq } },
4874 { "(bad)", { XX } },
4875 },
4876
4877 /* PREFIX_VEX_38DB */
4878 {
4879 { "(bad)", { XX } },
4880 { "(bad)", { XX } },
4881 { VEX_LEN_TABLE (VEX_LEN_38DB_P_2) },
4882 { "(bad)", { XX } },
4883 },
4884
4885 /* PREFIX_VEX_38DC */
4886 {
4887 { "(bad)", { XX } },
4888 { "(bad)", { XX } },
4889 { VEX_LEN_TABLE (VEX_LEN_38DC_P_2) },
4890 { "(bad)", { XX } },
4891 },
4892
4893 /* PREFIX_VEX_38DD */
4894 {
4895 { "(bad)", { XX } },
4896 { "(bad)", { XX } },
4897 { VEX_LEN_TABLE (VEX_LEN_38DD_P_2) },
4898 { "(bad)", { XX } },
4899 },
4900
4901 /* PREFIX_VEX_38DE */
4902 {
4903 { "(bad)", { XX } },
4904 { "(bad)", { XX } },
4905 { VEX_LEN_TABLE (VEX_LEN_38DE_P_2) },
4906 { "(bad)", { XX } },
4907 },
4908
4909 /* PREFIX_VEX_38DF */
4910 {
4911 { "(bad)", { XX } },
4912 { "(bad)", { XX } },
4913 { VEX_LEN_TABLE (VEX_LEN_38DF_P_2) },
4914 { "(bad)", { XX } },
4915 },
4916
4917 /* PREFIX_VEX_3A04 */
4918 {
4919 { "(bad)", { XX } },
4920 { "(bad)", { XX } },
4921 { "vpermilps", { XM, EXx, Ib } },
4922 { "(bad)", { XX } },
4923 },
4924
4925 /* PREFIX_VEX_3A05 */
4926 {
4927 { "(bad)", { XX } },
4928 { "(bad)", { XX } },
4929 { "vpermilpd", { XM, EXx, Ib } },
4930 { "(bad)", { XX } },
4931 },
4932
4933 /* PREFIX_VEX_3A06 */
4934 {
4935 { "(bad)", { XX } },
4936 { "(bad)", { XX } },
4937 { VEX_LEN_TABLE (VEX_LEN_3A06_P_2) },
4938 { "(bad)", { XX } },
4939 },
4940
4941 /* PREFIX_VEX_3A08 */
4942 {
4943 { "(bad)", { XX } },
4944 { "(bad)", { XX } },
4945 { "vroundps", { XM, EXx, Ib } },
4946 { "(bad)", { XX } },
4947 },
4948
4949 /* PREFIX_VEX_3A09 */
4950 {
4951 { "(bad)", { XX } },
4952 { "(bad)", { XX } },
4953 { "vroundpd", { XM, EXx, Ib } },
4954 { "(bad)", { XX } },
4955 },
4956
4957 /* PREFIX_VEX_3A0A */
4958 {
4959 { "(bad)", { XX } },
4960 { "(bad)", { XX } },
4961 { VEX_LEN_TABLE (VEX_LEN_3A0A_P_2) },
4962 { "(bad)", { XX } },
4963 },
4964
4965 /* PREFIX_VEX_3A0B */
4966 {
4967 { "(bad)", { XX } },
4968 { "(bad)", { XX } },
4969 { VEX_LEN_TABLE (VEX_LEN_3A0B_P_2) },
4970 { "(bad)", { XX } },
4971 },
4972
4973 /* PREFIX_VEX_3A0C */
4974 {
4975 { "(bad)", { XX } },
4976 { "(bad)", { XX } },
4977 { "vblendps", { XM, Vex, EXx, Ib } },
4978 { "(bad)", { XX } },
4979 },
4980
4981 /* PREFIX_VEX_3A0D */
4982 {
4983 { "(bad)", { XX } },
4984 { "(bad)", { XX } },
4985 { "vblendpd", { XM, Vex, EXx, Ib } },
4986 { "(bad)", { XX } },
4987 },
4988
4989 /* PREFIX_VEX_3A0E */
4990 {
4991 { "(bad)", { XX } },
4992 { "(bad)", { XX } },
4993 { VEX_LEN_TABLE (VEX_LEN_3A0E_P_2) },
4994 { "(bad)", { XX } },
4995 },
4996
4997 /* PREFIX_VEX_3A0F */
4998 {
4999 { "(bad)", { XX } },
5000 { "(bad)", { XX } },
5001 { VEX_LEN_TABLE (VEX_LEN_3A0F_P_2) },
5002 { "(bad)", { XX } },
5003 },
5004
5005 /* PREFIX_VEX_3A14 */
5006 {
5007 { "(bad)", { XX } },
5008 { "(bad)", { XX } },
5009 { VEX_LEN_TABLE (VEX_LEN_3A14_P_2) },
5010 { "(bad)", { XX } },
5011 },
5012
5013 /* PREFIX_VEX_3A15 */
5014 {
5015 { "(bad)", { XX } },
5016 { "(bad)", { XX } },
5017 { VEX_LEN_TABLE (VEX_LEN_3A15_P_2) },
5018 { "(bad)", { XX } },
5019 },
5020
5021 /* PREFIX_VEX_3A16 */
5022 {
5023 { "(bad)", { XX } },
5024 { "(bad)", { XX } },
5025 { VEX_LEN_TABLE (VEX_LEN_3A16_P_2) },
5026 { "(bad)", { XX } },
5027 },
5028
5029 /* PREFIX_VEX_3A17 */
5030 {
5031 { "(bad)", { XX } },
5032 { "(bad)", { XX } },
5033 { VEX_LEN_TABLE (VEX_LEN_3A17_P_2) },
5034 { "(bad)", { XX } },
5035 },
5036
5037 /* PREFIX_VEX_3A18 */
5038 {
5039 { "(bad)", { XX } },
5040 { "(bad)", { XX } },
5041 { VEX_LEN_TABLE (VEX_LEN_3A18_P_2) },
5042 { "(bad)", { XX } },
5043 },
5044
5045 /* PREFIX_VEX_3A19 */
5046 {
5047 { "(bad)", { XX } },
5048 { "(bad)", { XX } },
5049 { VEX_LEN_TABLE (VEX_LEN_3A19_P_2) },
5050 { "(bad)", { XX } },
5051 },
5052
5053 /* PREFIX_VEX_3A20 */
5054 {
5055 { "(bad)", { XX } },
5056 { "(bad)", { XX } },
5057 { VEX_LEN_TABLE (VEX_LEN_3A20_P_2) },
5058 { "(bad)", { XX } },
5059 },
5060
5061 /* PREFIX_VEX_3A21 */
5062 {
5063 { "(bad)", { XX } },
5064 { "(bad)", { XX } },
5065 { VEX_LEN_TABLE (VEX_LEN_3A21_P_2) },
5066 { "(bad)", { XX } },
5067 },
5068
5069 /* PREFIX_VEX_3A22 */
5070 {
5071 { "(bad)", { XX } },
5072 { "(bad)", { XX } },
5073 { VEX_LEN_TABLE (VEX_LEN_3A22_P_2) },
5074 { "(bad)", { XX } },
5075 },
5076
5077 /* PREFIX_VEX_3A40 */
5078 {
5079 { "(bad)", { XX } },
5080 { "(bad)", { XX } },
5081 { "vdpps", { XM, Vex, EXx, Ib } },
5082 { "(bad)", { XX } },
5083 },
5084
5085 /* PREFIX_VEX_3A41 */
5086 {
5087 { "(bad)", { XX } },
5088 { "(bad)", { XX } },
5089 { VEX_LEN_TABLE (VEX_LEN_3A41_P_2) },
5090 { "(bad)", { XX } },
5091 },
5092
5093 /* PREFIX_VEX_3A42 */
5094 {
5095 { "(bad)", { XX } },
5096 { "(bad)", { XX } },
5097 { VEX_LEN_TABLE (VEX_LEN_3A42_P_2) },
5098 { "(bad)", { XX } },
5099 },
5100
5101 /* PREFIX_VEX_3A44 */
5102 {
5103 { "(bad)", { XX } },
5104 { "(bad)", { XX } },
5105 { VEX_LEN_TABLE (VEX_LEN_3A44_P_2) },
5106 { "(bad)", { XX } },
5107 },
5108
5109 /* PREFIX_VEX_3A4A */
5110 {
5111 { "(bad)", { XX } },
5112 { "(bad)", { XX } },
5113 { "vblendvps", { XM, Vex, EXx, XMVexI4 } },
5114 { "(bad)", { XX } },
5115 },
5116
5117 /* PREFIX_VEX_3A4B */
5118 {
5119 { "(bad)", { XX } },
5120 { "(bad)", { XX } },
5121 { "vblendvpd", { XM, Vex, EXx, XMVexI4 } },
5122 { "(bad)", { XX } },
5123 },
5124
5125 /* PREFIX_VEX_3A4C */
5126 {
5127 { "(bad)", { XX } },
5128 { "(bad)", { XX } },
5129 { VEX_LEN_TABLE (VEX_LEN_3A4C_P_2) },
5130 { "(bad)", { XX } },
5131 },
5132
5133 /* PREFIX_VEX_3A5C */
5134 {
5135 { "(bad)", { XX } },
5136 { "(bad)", { XX } },
5137 { "vfmaddsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5138 { "(bad)", { XX } },
5139 },
5140
5141 /* PREFIX_VEX_3A5D */
5142 {
5143 { "(bad)", { XX } },
5144 { "(bad)", { XX } },
5145 { "vfmaddsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5146 { "(bad)", { XX } },
5147 },
5148
5149 /* PREFIX_VEX_3A5E */
5150 {
5151 { "(bad)", { XX } },
5152 { "(bad)", { XX } },
5153 { "vfmsubaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5154 { "(bad)", { XX } },
5155 },
5156
5157 /* PREFIX_VEX_3A5F */
5158 {
5159 { "(bad)", { XX } },
5160 { "(bad)", { XX } },
5161 { "vfmsubaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5162 { "(bad)", { XX } },
5163 },
5164
5165 /* PREFIX_VEX_3A60 */
5166 {
5167 { "(bad)", { XX } },
5168 { "(bad)", { XX } },
5169 { VEX_LEN_TABLE (VEX_LEN_3A60_P_2) },
5170 { "(bad)", { XX } },
5171 },
5172
5173 /* PREFIX_VEX_3A61 */
5174 {
5175 { "(bad)", { XX } },
5176 { "(bad)", { XX } },
5177 { VEX_LEN_TABLE (VEX_LEN_3A61_P_2) },
5178 { "(bad)", { XX } },
5179 },
5180
5181 /* PREFIX_VEX_3A62 */
5182 {
5183 { "(bad)", { XX } },
5184 { "(bad)", { XX } },
5185 { VEX_LEN_TABLE (VEX_LEN_3A62_P_2) },
5186 { "(bad)", { XX } },
5187 },
5188
5189 /* PREFIX_VEX_3A63 */
5190 {
5191 { "(bad)", { XX } },
5192 { "(bad)", { XX } },
5193 { VEX_LEN_TABLE (VEX_LEN_3A63_P_2) },
5194 { "(bad)", { XX } },
5195 },
5196
5197 /* PREFIX_VEX_3A68 */
5198 {
5199 { "(bad)", { XX } },
5200 { "(bad)", { XX } },
5201 { "vfmaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5202 { "(bad)", { XX } },
5203 },
5204
5205 /* PREFIX_VEX_3A69 */
5206 {
5207 { "(bad)", { XX } },
5208 { "(bad)", { XX } },
5209 { "vfmaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5210 { "(bad)", { XX } },
5211 },
5212
5213 /* PREFIX_VEX_3A6A */
5214 {
5215 { "(bad)", { XX } },
5216 { "(bad)", { XX } },
5217 { VEX_LEN_TABLE (VEX_LEN_3A6A_P_2) },
5218 { "(bad)", { XX } },
5219 },
5220
5221 /* PREFIX_VEX_3A6B */
5222 {
5223 { "(bad)", { XX } },
5224 { "(bad)", { XX } },
5225 { VEX_LEN_TABLE (VEX_LEN_3A6B_P_2) },
5226 { "(bad)", { XX } },
5227 },
5228
5229 /* PREFIX_VEX_3A6C */
5230 {
5231 { "(bad)", { XX } },
5232 { "(bad)", { XX } },
5233 { "vfmsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5234 { "(bad)", { XX } },
5235 },
5236
5237 /* PREFIX_VEX_3A6D */
5238 {
5239 { "(bad)", { XX } },
5240 { "(bad)", { XX } },
5241 { "vfmsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5242 { "(bad)", { XX } },
5243 },
5244
5245 /* PREFIX_VEX_3A6E */
5246 {
5247 { "(bad)", { XX } },
5248 { "(bad)", { XX } },
5249 { VEX_LEN_TABLE (VEX_LEN_3A6E_P_2) },
5250 { "(bad)", { XX } },
5251 },
5252
5253 /* PREFIX_VEX_3A6F */
5254 {
5255 { "(bad)", { XX } },
5256 { "(bad)", { XX } },
5257 { VEX_LEN_TABLE (VEX_LEN_3A6F_P_2) },
5258 { "(bad)", { XX } },
5259 },
5260
5261 /* PREFIX_VEX_3A78 */
5262 {
5263 { "(bad)", { XX } },
5264 { "(bad)", { XX } },
5265 { "vfnmaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5266 { "(bad)", { XX } },
5267 },
5268
5269 /* PREFIX_VEX_3A79 */
5270 {
5271 { "(bad)", { XX } },
5272 { "(bad)", { XX } },
5273 { "vfnmaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5274 { "(bad)", { XX } },
5275 },
5276
5277 /* PREFIX_VEX_3A7A */
5278 {
5279 { "(bad)", { XX } },
5280 { "(bad)", { XX } },
5281 { VEX_LEN_TABLE (VEX_LEN_3A7A_P_2) },
5282 { "(bad)", { XX } },
5283 },
5284
5285 /* PREFIX_VEX_3A7B */
5286 {
5287 { "(bad)", { XX } },
5288 { "(bad)", { XX } },
5289 { VEX_LEN_TABLE (VEX_LEN_3A7B_P_2) },
5290 { "(bad)", { XX } },
5291 },
5292
5293 /* PREFIX_VEX_3A7C */
5294 {
5295 { "(bad)", { XX } },
5296 { "(bad)", { XX } },
5297 { "vfnmsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5298 { "(bad)", { XX } },
5299 },
5300
5301 /* PREFIX_VEX_3A7D */
5302 {
5303 { "(bad)", { XX } },
5304 { "(bad)", { XX } },
5305 { "vfnmsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5306 { "(bad)", { XX } },
5307 },
5308
5309 /* PREFIX_VEX_3A7E */
5310 {
5311 { "(bad)", { XX } },
5312 { "(bad)", { XX } },
5313 { VEX_LEN_TABLE (VEX_LEN_3A7E_P_2) },
5314 { "(bad)", { XX } },
5315 },
5316
5317 /* PREFIX_VEX_3A7F */
5318 {
5319 { "(bad)", { XX } },
5320 { "(bad)", { XX } },
5321 { VEX_LEN_TABLE (VEX_LEN_3A7F_P_2) },
5322 { "(bad)", { XX } },
5323 },
5324
5325 /* PREFIX_VEX_3ADF */
5326 {
5327 { "(bad)", { XX } },
5328 { "(bad)", { XX } },
5329 { VEX_LEN_TABLE (VEX_LEN_3ADF_P_2) },
5330 { "(bad)", { XX } },
5331 },
5332 };
5333
5334 static const struct dis386 x86_64_table[][2] = {
5335 /* X86_64_06 */
5336 {
5337 { "push{T|}", { es } },
5338 { "(bad)", { XX } },
5339 },
5340
5341 /* X86_64_07 */
5342 {
5343 { "pop{T|}", { es } },
5344 { "(bad)", { XX } },
5345 },
5346
5347 /* X86_64_0D */
5348 {
5349 { "push{T|}", { cs } },
5350 { "(bad)", { XX } },
5351 },
5352
5353 /* X86_64_16 */
5354 {
5355 { "push{T|}", { ss } },
5356 { "(bad)", { XX } },
5357 },
5358
5359 /* X86_64_17 */
5360 {
5361 { "pop{T|}", { ss } },
5362 { "(bad)", { XX } },
5363 },
5364
5365 /* X86_64_1E */
5366 {
5367 { "push{T|}", { ds } },
5368 { "(bad)", { XX } },
5369 },
5370
5371 /* X86_64_1F */
5372 {
5373 { "pop{T|}", { ds } },
5374 { "(bad)", { XX } },
5375 },
5376
5377 /* X86_64_27 */
5378 {
5379 { "daa", { XX } },
5380 { "(bad)", { XX } },
5381 },
5382
5383 /* X86_64_2F */
5384 {
5385 { "das", { XX } },
5386 { "(bad)", { XX } },
5387 },
5388
5389 /* X86_64_37 */
5390 {
5391 { "aaa", { XX } },
5392 { "(bad)", { XX } },
5393 },
5394
5395 /* X86_64_3F */
5396 {
5397 { "aas", { XX } },
5398 { "(bad)", { XX } },
5399 },
5400
5401 /* X86_64_60 */
5402 {
5403 { "pusha{P|}", { XX } },
5404 { "(bad)", { XX } },
5405 },
5406
5407 /* X86_64_61 */
5408 {
5409 { "popa{P|}", { XX } },
5410 { "(bad)", { XX } },
5411 },
5412
5413 /* X86_64_62 */
5414 {
5415 { MOD_TABLE (MOD_62_32BIT) },
5416 { "(bad)", { XX } },
5417 },
5418
5419 /* X86_64_63 */
5420 {
5421 { "arpl", { Ew, Gw } },
5422 { "movs{lq|xd}", { Gv, Ed } },
5423 },
5424
5425 /* X86_64_6D */
5426 {
5427 { "ins{R|}", { Yzr, indirDX } },
5428 { "ins{G|}", { Yzr, indirDX } },
5429 },
5430
5431 /* X86_64_6F */
5432 {
5433 { "outs{R|}", { indirDXr, Xz } },
5434 { "outs{G|}", { indirDXr, Xz } },
5435 },
5436
5437 /* X86_64_9A */
5438 {
5439 { "Jcall{T|}", { Ap } },
5440 { "(bad)", { XX } },
5441 },
5442
5443 /* X86_64_C4 */
5444 {
5445 { MOD_TABLE (MOD_C4_32BIT) },
5446 { VEX_C4_TABLE (VEX_0F) },
5447 },
5448
5449 /* X86_64_C5 */
5450 {
5451 { MOD_TABLE (MOD_C5_32BIT) },
5452 { VEX_C5_TABLE (VEX_0F) },
5453 },
5454
5455 /* X86_64_CE */
5456 {
5457 { "into", { XX } },
5458 { "(bad)", { XX } },
5459 },
5460
5461 /* X86_64_D4 */
5462 {
5463 { "aam", { sIb } },
5464 { "(bad)", { XX } },
5465 },
5466
5467 /* X86_64_D5 */
5468 {
5469 { "aad", { sIb } },
5470 { "(bad)", { XX } },
5471 },
5472
5473 /* X86_64_EA */
5474 {
5475 { "Jjmp{T|}", { Ap } },
5476 { "(bad)", { XX } },
5477 },
5478
5479 /* X86_64_0F01_REG_0 */
5480 {
5481 { "sgdt{Q|IQ}", { M } },
5482 { "sgdt", { M } },
5483 },
5484
5485 /* X86_64_0F01_REG_1 */
5486 {
5487 { "sidt{Q|IQ}", { M } },
5488 { "sidt", { M } },
5489 },
5490
5491 /* X86_64_0F01_REG_2 */
5492 {
5493 { "lgdt{Q|Q}", { M } },
5494 { "lgdt", { M } },
5495 },
5496
5497 /* X86_64_0F01_REG_3 */
5498 {
5499 { "lidt{Q|Q}", { M } },
5500 { "lidt", { M } },
5501 },
5502 };
5503
5504 static const struct dis386 three_byte_table[][256] = {
5505
5506 /* THREE_BYTE_0F38 */
5507 {
5508 /* 00 */
5509 { "pshufb", { MX, EM } },
5510 { "phaddw", { MX, EM } },
5511 { "phaddd", { MX, EM } },
5512 { "phaddsw", { MX, EM } },
5513 { "pmaddubsw", { MX, EM } },
5514 { "phsubw", { MX, EM } },
5515 { "phsubd", { MX, EM } },
5516 { "phsubsw", { MX, EM } },
5517 /* 08 */
5518 { "psignb", { MX, EM } },
5519 { "psignw", { MX, EM } },
5520 { "psignd", { MX, EM } },
5521 { "pmulhrsw", { MX, EM } },
5522 { "(bad)", { XX } },
5523 { "(bad)", { XX } },
5524 { "(bad)", { XX } },
5525 { "(bad)", { XX } },
5526 /* 10 */
5527 { PREFIX_TABLE (PREFIX_0F3810) },
5528 { "(bad)", { XX } },
5529 { "(bad)", { XX } },
5530 { "(bad)", { XX } },
5531 { PREFIX_TABLE (PREFIX_0F3814) },
5532 { PREFIX_TABLE (PREFIX_0F3815) },
5533 { "(bad)", { XX } },
5534 { PREFIX_TABLE (PREFIX_0F3817) },
5535 /* 18 */
5536 { "(bad)", { XX } },
5537 { "(bad)", { XX } },
5538 { "(bad)", { XX } },
5539 { "(bad)", { XX } },
5540 { "pabsb", { MX, EM } },
5541 { "pabsw", { MX, EM } },
5542 { "pabsd", { MX, EM } },
5543 { "(bad)", { XX } },
5544 /* 20 */
5545 { PREFIX_TABLE (PREFIX_0F3820) },
5546 { PREFIX_TABLE (PREFIX_0F3821) },
5547 { PREFIX_TABLE (PREFIX_0F3822) },
5548 { PREFIX_TABLE (PREFIX_0F3823) },
5549 { PREFIX_TABLE (PREFIX_0F3824) },
5550 { PREFIX_TABLE (PREFIX_0F3825) },
5551 { "(bad)", { XX } },
5552 { "(bad)", { XX } },
5553 /* 28 */
5554 { PREFIX_TABLE (PREFIX_0F3828) },
5555 { PREFIX_TABLE (PREFIX_0F3829) },
5556 { PREFIX_TABLE (PREFIX_0F382A) },
5557 { PREFIX_TABLE (PREFIX_0F382B) },
5558 { "(bad)", { XX } },
5559 { "(bad)", { XX } },
5560 { "(bad)", { XX } },
5561 { "(bad)", { XX } },
5562 /* 30 */
5563 { PREFIX_TABLE (PREFIX_0F3830) },
5564 { PREFIX_TABLE (PREFIX_0F3831) },
5565 { PREFIX_TABLE (PREFIX_0F3832) },
5566 { PREFIX_TABLE (PREFIX_0F3833) },
5567 { PREFIX_TABLE (PREFIX_0F3834) },
5568 { PREFIX_TABLE (PREFIX_0F3835) },
5569 { "(bad)", { XX } },
5570 { PREFIX_TABLE (PREFIX_0F3837) },
5571 /* 38 */
5572 { PREFIX_TABLE (PREFIX_0F3838) },
5573 { PREFIX_TABLE (PREFIX_0F3839) },
5574 { PREFIX_TABLE (PREFIX_0F383A) },
5575 { PREFIX_TABLE (PREFIX_0F383B) },
5576 { PREFIX_TABLE (PREFIX_0F383C) },
5577 { PREFIX_TABLE (PREFIX_0F383D) },
5578 { PREFIX_TABLE (PREFIX_0F383E) },
5579 { PREFIX_TABLE (PREFIX_0F383F) },
5580 /* 40 */
5581 { PREFIX_TABLE (PREFIX_0F3840) },
5582 { PREFIX_TABLE (PREFIX_0F3841) },
5583 { "(bad)", { XX } },
5584 { "(bad)", { XX } },
5585 { "(bad)", { XX } },
5586 { "(bad)", { XX } },
5587 { "(bad)", { XX } },
5588 { "(bad)", { XX } },
5589 /* 48 */
5590 { "(bad)", { XX } },
5591 { "(bad)", { XX } },
5592 { "(bad)", { XX } },
5593 { "(bad)", { XX } },
5594 { "(bad)", { XX } },
5595 { "(bad)", { XX } },
5596 { "(bad)", { XX } },
5597 { "(bad)", { XX } },
5598 /* 50 */
5599 { "(bad)", { XX } },
5600 { "(bad)", { XX } },
5601 { "(bad)", { XX } },
5602 { "(bad)", { XX } },
5603 { "(bad)", { XX } },
5604 { "(bad)", { XX } },
5605 { "(bad)", { XX } },
5606 { "(bad)", { XX } },
5607 /* 58 */
5608 { "(bad)", { XX } },
5609 { "(bad)", { XX } },
5610 { "(bad)", { XX } },
5611 { "(bad)", { XX } },
5612 { "(bad)", { XX } },
5613 { "(bad)", { XX } },
5614 { "(bad)", { XX } },
5615 { "(bad)", { XX } },
5616 /* 60 */
5617 { "(bad)", { XX } },
5618 { "(bad)", { XX } },
5619 { "(bad)", { XX } },
5620 { "(bad)", { XX } },
5621 { "(bad)", { XX } },
5622 { "(bad)", { XX } },
5623 { "(bad)", { XX } },
5624 { "(bad)", { XX } },
5625 /* 68 */
5626 { "(bad)", { XX } },
5627 { "(bad)", { XX } },
5628 { "(bad)", { XX } },
5629 { "(bad)", { XX } },
5630 { "(bad)", { XX } },
5631 { "(bad)", { XX } },
5632 { "(bad)", { XX } },
5633 { "(bad)", { XX } },
5634 /* 70 */
5635 { "(bad)", { XX } },
5636 { "(bad)", { XX } },
5637 { "(bad)", { XX } },
5638 { "(bad)", { XX } },
5639 { "(bad)", { XX } },
5640 { "(bad)", { XX } },
5641 { "(bad)", { XX } },
5642 { "(bad)", { XX } },
5643 /* 78 */
5644 { "(bad)", { XX } },
5645 { "(bad)", { XX } },
5646 { "(bad)", { XX } },
5647 { "(bad)", { XX } },
5648 { "(bad)", { XX } },
5649 { "(bad)", { XX } },
5650 { "(bad)", { XX } },
5651 { "(bad)", { XX } },
5652 /* 80 */
5653 { PREFIX_TABLE (PREFIX_0F3880) },
5654 { PREFIX_TABLE (PREFIX_0F3881) },
5655 { "(bad)", { XX } },
5656 { "(bad)", { XX } },
5657 { "(bad)", { XX } },
5658 { "(bad)", { XX } },
5659 { "(bad)", { XX } },
5660 { "(bad)", { XX } },
5661 /* 88 */
5662 { "(bad)", { XX } },
5663 { "(bad)", { XX } },
5664 { "(bad)", { XX } },
5665 { "(bad)", { XX } },
5666 { "(bad)", { XX } },
5667 { "(bad)", { XX } },
5668 { "(bad)", { XX } },
5669 { "(bad)", { XX } },
5670 /* 90 */
5671 { "(bad)", { XX } },
5672 { "(bad)", { XX } },
5673 { "(bad)", { XX } },
5674 { "(bad)", { XX } },
5675 { "(bad)", { XX } },
5676 { "(bad)", { XX } },
5677 { "(bad)", { XX } },
5678 { "(bad)", { XX } },
5679 /* 98 */
5680 { "(bad)", { XX } },
5681 { "(bad)", { XX } },
5682 { "(bad)", { XX } },
5683 { "(bad)", { XX } },
5684 { "(bad)", { XX } },
5685 { "(bad)", { XX } },
5686 { "(bad)", { XX } },
5687 { "(bad)", { XX } },
5688 /* a0 */
5689 { "(bad)", { XX } },
5690 { "(bad)", { XX } },
5691 { "(bad)", { XX } },
5692 { "(bad)", { XX } },
5693 { "(bad)", { XX } },
5694 { "(bad)", { XX } },
5695 { "(bad)", { XX } },
5696 { "(bad)", { XX } },
5697 /* a8 */
5698 { "(bad)", { XX } },
5699 { "(bad)", { XX } },
5700 { "(bad)", { XX } },
5701 { "(bad)", { XX } },
5702 { "(bad)", { XX } },
5703 { "(bad)", { XX } },
5704 { "(bad)", { XX } },
5705 { "(bad)", { XX } },
5706 /* b0 */
5707 { "(bad)", { XX } },
5708 { "(bad)", { XX } },
5709 { "(bad)", { XX } },
5710 { "(bad)", { XX } },
5711 { "(bad)", { XX } },
5712 { "(bad)", { XX } },
5713 { "(bad)", { XX } },
5714 { "(bad)", { XX } },
5715 /* b8 */
5716 { "(bad)", { XX } },
5717 { "(bad)", { XX } },
5718 { "(bad)", { XX } },
5719 { "(bad)", { XX } },
5720 { "(bad)", { XX } },
5721 { "(bad)", { XX } },
5722 { "(bad)", { XX } },
5723 { "(bad)", { XX } },
5724 /* c0 */
5725 { "(bad)", { XX } },
5726 { "(bad)", { XX } },
5727 { "(bad)", { XX } },
5728 { "(bad)", { XX } },
5729 { "(bad)", { XX } },
5730 { "(bad)", { XX } },
5731 { "(bad)", { XX } },
5732 { "(bad)", { XX } },
5733 /* c8 */
5734 { "(bad)", { XX } },
5735 { "(bad)", { XX } },
5736 { "(bad)", { XX } },
5737 { "(bad)", { XX } },
5738 { "(bad)", { XX } },
5739 { "(bad)", { XX } },
5740 { "(bad)", { XX } },
5741 { "(bad)", { XX } },
5742 /* d0 */
5743 { "(bad)", { XX } },
5744 { "(bad)", { XX } },
5745 { "(bad)", { XX } },
5746 { "(bad)", { XX } },
5747 { "(bad)", { XX } },
5748 { "(bad)", { XX } },
5749 { "(bad)", { XX } },
5750 { "(bad)", { XX } },
5751 /* d8 */
5752 { "(bad)", { XX } },
5753 { "(bad)", { XX } },
5754 { "(bad)", { XX } },
5755 { PREFIX_TABLE (PREFIX_0F38DB) },
5756 { PREFIX_TABLE (PREFIX_0F38DC) },
5757 { PREFIX_TABLE (PREFIX_0F38DD) },
5758 { PREFIX_TABLE (PREFIX_0F38DE) },
5759 { PREFIX_TABLE (PREFIX_0F38DF) },
5760 /* e0 */
5761 { "(bad)", { XX } },
5762 { "(bad)", { XX } },
5763 { "(bad)", { XX } },
5764 { "(bad)", { XX } },
5765 { "(bad)", { XX } },
5766 { "(bad)", { XX } },
5767 { "(bad)", { XX } },
5768 { "(bad)", { XX } },
5769 /* e8 */
5770 { "(bad)", { XX } },
5771 { "(bad)", { XX } },
5772 { "(bad)", { XX } },
5773 { "(bad)", { XX } },
5774 { "(bad)", { XX } },
5775 { "(bad)", { XX } },
5776 { "(bad)", { XX } },
5777 { "(bad)", { XX } },
5778 /* f0 */
5779 { PREFIX_TABLE (PREFIX_0F38F0) },
5780 { PREFIX_TABLE (PREFIX_0F38F1) },
5781 { "(bad)", { XX } },
5782 { "(bad)", { XX } },
5783 { "(bad)", { XX } },
5784 { "(bad)", { XX } },
5785 { "(bad)", { XX } },
5786 { "(bad)", { XX } },
5787 /* f8 */
5788 { "(bad)", { XX } },
5789 { "(bad)", { XX } },
5790 { "(bad)", { XX } },
5791 { "(bad)", { XX } },
5792 { "(bad)", { XX } },
5793 { "(bad)", { XX } },
5794 { "(bad)", { XX } },
5795 { "(bad)", { XX } },
5796 },
5797 /* THREE_BYTE_0F3A */
5798 {
5799 /* 00 */
5800 { "(bad)", { XX } },
5801 { "(bad)", { XX } },
5802 { "(bad)", { XX } },
5803 { "(bad)", { XX } },
5804 { "(bad)", { XX } },
5805 { "(bad)", { XX } },
5806 { "(bad)", { XX } },
5807 { "(bad)", { XX } },
5808 /* 08 */
5809 { PREFIX_TABLE (PREFIX_0F3A08) },
5810 { PREFIX_TABLE (PREFIX_0F3A09) },
5811 { PREFIX_TABLE (PREFIX_0F3A0A) },
5812 { PREFIX_TABLE (PREFIX_0F3A0B) },
5813 { PREFIX_TABLE (PREFIX_0F3A0C) },
5814 { PREFIX_TABLE (PREFIX_0F3A0D) },
5815 { PREFIX_TABLE (PREFIX_0F3A0E) },
5816 { "palignr", { MX, EM, Ib } },
5817 /* 10 */
5818 { "(bad)", { XX } },
5819 { "(bad)", { XX } },
5820 { "(bad)", { XX } },
5821 { "(bad)", { XX } },
5822 { PREFIX_TABLE (PREFIX_0F3A14) },
5823 { PREFIX_TABLE (PREFIX_0F3A15) },
5824 { PREFIX_TABLE (PREFIX_0F3A16) },
5825 { PREFIX_TABLE (PREFIX_0F3A17) },
5826 /* 18 */
5827 { "(bad)", { XX } },
5828 { "(bad)", { XX } },
5829 { "(bad)", { XX } },
5830 { "(bad)", { XX } },
5831 { "(bad)", { XX } },
5832 { "(bad)", { XX } },
5833 { "(bad)", { XX } },
5834 { "(bad)", { XX } },
5835 /* 20 */
5836 { PREFIX_TABLE (PREFIX_0F3A20) },
5837 { PREFIX_TABLE (PREFIX_0F3A21) },
5838 { PREFIX_TABLE (PREFIX_0F3A22) },
5839 { "(bad)", { XX } },
5840 { "(bad)", { XX } },
5841 { "(bad)", { XX } },
5842 { "(bad)", { XX } },
5843 { "(bad)", { XX } },
5844 /* 28 */
5845 { "(bad)", { XX } },
5846 { "(bad)", { XX } },
5847 { "(bad)", { XX } },
5848 { "(bad)", { XX } },
5849 { "(bad)", { XX } },
5850 { "(bad)", { XX } },
5851 { "(bad)", { XX } },
5852 { "(bad)", { XX } },
5853 /* 30 */
5854 { "(bad)", { XX } },
5855 { "(bad)", { XX } },
5856 { "(bad)", { XX } },
5857 { "(bad)", { XX } },
5858 { "(bad)", { XX } },
5859 { "(bad)", { XX } },
5860 { "(bad)", { XX } },
5861 { "(bad)", { XX } },
5862 /* 38 */
5863 { "(bad)", { XX } },
5864 { "(bad)", { XX } },
5865 { "(bad)", { XX } },
5866 { "(bad)", { XX } },
5867 { "(bad)", { XX } },
5868 { "(bad)", { XX } },
5869 { "(bad)", { XX } },
5870 { "(bad)", { XX } },
5871 /* 40 */
5872 { PREFIX_TABLE (PREFIX_0F3A40) },
5873 { PREFIX_TABLE (PREFIX_0F3A41) },
5874 { PREFIX_TABLE (PREFIX_0F3A42) },
5875 { "(bad)", { XX } },
5876 { PREFIX_TABLE (PREFIX_0F3A44) },
5877 { "(bad)", { XX } },
5878 { "(bad)", { XX } },
5879 { "(bad)", { XX } },
5880 /* 48 */
5881 { "(bad)", { XX } },
5882 { "(bad)", { XX } },
5883 { "(bad)", { XX } },
5884 { "(bad)", { XX } },
5885 { "(bad)", { XX } },
5886 { "(bad)", { XX } },
5887 { "(bad)", { XX } },
5888 { "(bad)", { XX } },
5889 /* 50 */
5890 { "(bad)", { XX } },
5891 { "(bad)", { XX } },
5892 { "(bad)", { XX } },
5893 { "(bad)", { XX } },
5894 { "(bad)", { XX } },
5895 { "(bad)", { XX } },
5896 { "(bad)", { XX } },
5897 { "(bad)", { XX } },
5898 /* 58 */
5899 { "(bad)", { XX } },
5900 { "(bad)", { XX } },
5901 { "(bad)", { XX } },
5902 { "(bad)", { XX } },
5903 { "(bad)", { XX } },
5904 { "(bad)", { XX } },
5905 { "(bad)", { XX } },
5906 { "(bad)", { XX } },
5907 /* 60 */
5908 { PREFIX_TABLE (PREFIX_0F3A60) },
5909 { PREFIX_TABLE (PREFIX_0F3A61) },
5910 { PREFIX_TABLE (PREFIX_0F3A62) },
5911 { PREFIX_TABLE (PREFIX_0F3A63) },
5912 { "(bad)", { XX } },
5913 { "(bad)", { XX } },
5914 { "(bad)", { XX } },
5915 { "(bad)", { XX } },
5916 /* 68 */
5917 { "(bad)", { XX } },
5918 { "(bad)", { XX } },
5919 { "(bad)", { XX } },
5920 { "(bad)", { XX } },
5921 { "(bad)", { XX } },
5922 { "(bad)", { XX } },
5923 { "(bad)", { XX } },
5924 { "(bad)", { XX } },
5925 /* 70 */
5926 { "(bad)", { XX } },
5927 { "(bad)", { XX } },
5928 { "(bad)", { XX } },
5929 { "(bad)", { XX } },
5930 { "(bad)", { XX } },
5931 { "(bad)", { XX } },
5932 { "(bad)", { XX } },
5933 { "(bad)", { XX } },
5934 /* 78 */
5935 { "(bad)", { XX } },
5936 { "(bad)", { XX } },
5937 { "(bad)", { XX } },
5938 { "(bad)", { XX } },
5939 { "(bad)", { XX } },
5940 { "(bad)", { XX } },
5941 { "(bad)", { XX } },
5942 { "(bad)", { XX } },
5943 /* 80 */
5944 { "(bad)", { XX } },
5945 { "(bad)", { XX } },
5946 { "(bad)", { XX } },
5947 { "(bad)", { XX } },
5948 { "(bad)", { XX } },
5949 { "(bad)", { XX } },
5950 { "(bad)", { XX } },
5951 { "(bad)", { XX } },
5952 /* 88 */
5953 { "(bad)", { XX } },
5954 { "(bad)", { XX } },
5955 { "(bad)", { XX } },
5956 { "(bad)", { XX } },
5957 { "(bad)", { XX } },
5958 { "(bad)", { XX } },
5959 { "(bad)", { XX } },
5960 { "(bad)", { XX } },
5961 /* 90 */
5962 { "(bad)", { XX } },
5963 { "(bad)", { XX } },
5964 { "(bad)", { XX } },
5965 { "(bad)", { XX } },
5966 { "(bad)", { XX } },
5967 { "(bad)", { XX } },
5968 { "(bad)", { XX } },
5969 { "(bad)", { XX } },
5970 /* 98 */
5971 { "(bad)", { XX } },
5972 { "(bad)", { XX } },
5973 { "(bad)", { XX } },
5974 { "(bad)", { XX } },
5975 { "(bad)", { XX } },
5976 { "(bad)", { XX } },
5977 { "(bad)", { XX } },
5978 { "(bad)", { XX } },
5979 /* a0 */
5980 { "(bad)", { XX } },
5981 { "(bad)", { XX } },
5982 { "(bad)", { XX } },
5983 { "(bad)", { XX } },
5984 { "(bad)", { XX } },
5985 { "(bad)", { XX } },
5986 { "(bad)", { XX } },
5987 { "(bad)", { XX } },
5988 /* a8 */
5989 { "(bad)", { XX } },
5990 { "(bad)", { XX } },
5991 { "(bad)", { XX } },
5992 { "(bad)", { XX } },
5993 { "(bad)", { XX } },
5994 { "(bad)", { XX } },
5995 { "(bad)", { XX } },
5996 { "(bad)", { XX } },
5997 /* b0 */
5998 { "(bad)", { XX } },
5999 { "(bad)", { XX } },
6000 { "(bad)", { XX } },
6001 { "(bad)", { XX } },
6002 { "(bad)", { XX } },
6003 { "(bad)", { XX } },
6004 { "(bad)", { XX } },
6005 { "(bad)", { XX } },
6006 /* b8 */
6007 { "(bad)", { XX } },
6008 { "(bad)", { XX } },
6009 { "(bad)", { XX } },
6010 { "(bad)", { XX } },
6011 { "(bad)", { XX } },
6012 { "(bad)", { XX } },
6013 { "(bad)", { XX } },
6014 { "(bad)", { XX } },
6015 /* c0 */
6016 { "(bad)", { XX } },
6017 { "(bad)", { XX } },
6018 { "(bad)", { XX } },
6019 { "(bad)", { XX } },
6020 { "(bad)", { XX } },
6021 { "(bad)", { XX } },
6022 { "(bad)", { XX } },
6023 { "(bad)", { XX } },
6024 /* c8 */
6025 { "(bad)", { XX } },
6026 { "(bad)", { XX } },
6027 { "(bad)", { XX } },
6028 { "(bad)", { XX } },
6029 { "(bad)", { XX } },
6030 { "(bad)", { XX } },
6031 { "(bad)", { XX } },
6032 { "(bad)", { XX } },
6033 /* d0 */
6034 { "(bad)", { XX } },
6035 { "(bad)", { XX } },
6036 { "(bad)", { XX } },
6037 { "(bad)", { XX } },
6038 { "(bad)", { XX } },
6039 { "(bad)", { XX } },
6040 { "(bad)", { XX } },
6041 { "(bad)", { XX } },
6042 /* d8 */
6043 { "(bad)", { XX } },
6044 { "(bad)", { XX } },
6045 { "(bad)", { XX } },
6046 { "(bad)", { XX } },
6047 { "(bad)", { XX } },
6048 { "(bad)", { XX } },
6049 { "(bad)", { XX } },
6050 { PREFIX_TABLE (PREFIX_0F3ADF) },
6051 /* e0 */
6052 { "(bad)", { XX } },
6053 { "(bad)", { XX } },
6054 { "(bad)", { XX } },
6055 { "(bad)", { XX } },
6056 { "(bad)", { XX } },
6057 { "(bad)", { XX } },
6058 { "(bad)", { XX } },
6059 { "(bad)", { XX } },
6060 /* e8 */
6061 { "(bad)", { XX } },
6062 { "(bad)", { XX } },
6063 { "(bad)", { XX } },
6064 { "(bad)", { XX } },
6065 { "(bad)", { XX } },
6066 { "(bad)", { XX } },
6067 { "(bad)", { XX } },
6068 { "(bad)", { XX } },
6069 /* f0 */
6070 { "(bad)", { XX } },
6071 { "(bad)", { XX } },
6072 { "(bad)", { XX } },
6073 { "(bad)", { XX } },
6074 { "(bad)", { XX } },
6075 { "(bad)", { XX } },
6076 { "(bad)", { XX } },
6077 { "(bad)", { XX } },
6078 /* f8 */
6079 { "(bad)", { XX } },
6080 { "(bad)", { XX } },
6081 { "(bad)", { XX } },
6082 { "(bad)", { XX } },
6083 { "(bad)", { XX } },
6084 { "(bad)", { XX } },
6085 { "(bad)", { XX } },
6086 { "(bad)", { XX } },
6087 },
6088
6089 /* THREE_BYTE_0F7A */
6090 {
6091 /* 00 */
6092 { "(bad)", { XX } },
6093 { "(bad)", { XX } },
6094 { "(bad)", { XX } },
6095 { "(bad)", { XX } },
6096 { "(bad)", { XX } },
6097 { "(bad)", { XX } },
6098 { "(bad)", { XX } },
6099 { "(bad)", { XX } },
6100 /* 08 */
6101 { "(bad)", { XX } },
6102 { "(bad)", { XX } },
6103 { "(bad)", { XX } },
6104 { "(bad)", { XX } },
6105 { "(bad)", { XX } },
6106 { "(bad)", { XX } },
6107 { "(bad)", { XX } },
6108 { "(bad)", { XX } },
6109 /* 10 */
6110 { "(bad)", { XX } },
6111 { "(bad)", { XX } },
6112 { "(bad)", { XX } },
6113 { "(bad)", { XX } },
6114 { "(bad)", { XX } },
6115 { "(bad)", { XX } },
6116 { "(bad)", { XX } },
6117 { "(bad)", { XX } },
6118 /* 18 */
6119 { "(bad)", { XX } },
6120 { "(bad)", { XX } },
6121 { "(bad)", { XX } },
6122 { "(bad)", { XX } },
6123 { "(bad)", { XX } },
6124 { "(bad)", { XX } },
6125 { "(bad)", { XX } },
6126 { "(bad)", { XX } },
6127 /* 20 */
6128 { "ptest", { XX } },
6129 { "(bad)", { XX } },
6130 { "(bad)", { XX } },
6131 { "(bad)", { XX } },
6132 { "(bad)", { XX } },
6133 { "(bad)", { XX } },
6134 { "(bad)", { XX } },
6135 { "(bad)", { XX } },
6136 /* 28 */
6137 { "(bad)", { XX } },
6138 { "(bad)", { XX } },
6139 { "(bad)", { XX } },
6140 { "(bad)", { XX } },
6141 { "(bad)", { XX } },
6142 { "(bad)", { XX } },
6143 { "(bad)", { XX } },
6144 { "(bad)", { XX } },
6145 /* 30 */
6146 { "(bad)", { XX } },
6147 { "(bad)", { XX } },
6148 { "(bad)", { XX } },
6149 { "(bad)", { XX } },
6150 { "(bad)", { XX } },
6151 { "(bad)", { XX } },
6152 { "(bad)", { XX } },
6153 { "(bad)", { XX } },
6154 /* 38 */
6155 { "(bad)", { XX } },
6156 { "(bad)", { XX } },
6157 { "(bad)", { XX } },
6158 { "(bad)", { XX } },
6159 { "(bad)", { XX } },
6160 { "(bad)", { XX } },
6161 { "(bad)", { XX } },
6162 { "(bad)", { XX } },
6163 /* 40 */
6164 { "(bad)", { XX } },
6165 { "phaddbw", { XM, EXq } },
6166 { "phaddbd", { XM, EXq } },
6167 { "phaddbq", { XM, EXq } },
6168 { "(bad)", { XX } },
6169 { "(bad)", { XX } },
6170 { "phaddwd", { XM, EXq } },
6171 { "phaddwq", { XM, EXq } },
6172 /* 48 */
6173 { "(bad)", { XX } },
6174 { "(bad)", { XX } },
6175 { "(bad)", { XX } },
6176 { "phadddq", { XM, EXq } },
6177 { "(bad)", { XX } },
6178 { "(bad)", { XX } },
6179 { "(bad)", { XX } },
6180 { "(bad)", { XX } },
6181 /* 50 */
6182 { "(bad)", { XX } },
6183 { "phaddubw", { XM, EXq } },
6184 { "phaddubd", { XM, EXq } },
6185 { "phaddubq", { XM, EXq } },
6186 { "(bad)", { XX } },
6187 { "(bad)", { XX } },
6188 { "phadduwd", { XM, EXq } },
6189 { "phadduwq", { XM, EXq } },
6190 /* 58 */
6191 { "(bad)", { XX } },
6192 { "(bad)", { XX } },
6193 { "(bad)", { XX } },
6194 { "phaddudq", { XM, EXq } },
6195 { "(bad)", { XX } },
6196 { "(bad)", { XX } },
6197 { "(bad)", { XX } },
6198 { "(bad)", { XX } },
6199 /* 60 */
6200 { "(bad)", { XX } },
6201 { "phsubbw", { XM, EXq } },
6202 { "phsubbd", { XM, EXq } },
6203 { "phsubbq", { XM, EXq } },
6204 { "(bad)", { XX } },
6205 { "(bad)", { XX } },
6206 { "(bad)", { XX } },
6207 { "(bad)", { XX } },
6208 /* 68 */
6209 { "(bad)", { XX } },
6210 { "(bad)", { XX } },
6211 { "(bad)", { XX } },
6212 { "(bad)", { XX } },
6213 { "(bad)", { XX } },
6214 { "(bad)", { XX } },
6215 { "(bad)", { XX } },
6216 { "(bad)", { XX } },
6217 /* 70 */
6218 { "(bad)", { XX } },
6219 { "(bad)", { XX } },
6220 { "(bad)", { XX } },
6221 { "(bad)", { XX } },
6222 { "(bad)", { XX } },
6223 { "(bad)", { XX } },
6224 { "(bad)", { XX } },
6225 { "(bad)", { XX } },
6226 /* 78 */
6227 { "(bad)", { XX } },
6228 { "(bad)", { XX } },
6229 { "(bad)", { XX } },
6230 { "(bad)", { XX } },
6231 { "(bad)", { XX } },
6232 { "(bad)", { XX } },
6233 { "(bad)", { XX } },
6234 { "(bad)", { XX } },
6235 /* 80 */
6236 { "(bad)", { XX } },
6237 { "(bad)", { XX } },
6238 { "(bad)", { XX } },
6239 { "(bad)", { XX } },
6240 { "(bad)", { XX } },
6241 { "(bad)", { XX } },
6242 { "(bad)", { XX } },
6243 { "(bad)", { XX } },
6244 /* 88 */
6245 { "(bad)", { XX } },
6246 { "(bad)", { XX } },
6247 { "(bad)", { XX } },
6248 { "(bad)", { XX } },
6249 { "(bad)", { XX } },
6250 { "(bad)", { XX } },
6251 { "(bad)", { XX } },
6252 { "(bad)", { XX } },
6253 /* 90 */
6254 { "(bad)", { XX } },
6255 { "(bad)", { XX } },
6256 { "(bad)", { XX } },
6257 { "(bad)", { XX } },
6258 { "(bad)", { XX } },
6259 { "(bad)", { XX } },
6260 { "(bad)", { XX } },
6261 { "(bad)", { XX } },
6262 /* 98 */
6263 { "(bad)", { XX } },
6264 { "(bad)", { XX } },
6265 { "(bad)", { XX } },
6266 { "(bad)", { XX } },
6267 { "(bad)", { XX } },
6268 { "(bad)", { XX } },
6269 { "(bad)", { XX } },
6270 { "(bad)", { XX } },
6271 /* a0 */
6272 { "(bad)", { XX } },
6273 { "(bad)", { XX } },
6274 { "(bad)", { XX } },
6275 { "(bad)", { XX } },
6276 { "(bad)", { XX } },
6277 { "(bad)", { XX } },
6278 { "(bad)", { XX } },
6279 { "(bad)", { XX } },
6280 /* a8 */
6281 { "(bad)", { XX } },
6282 { "(bad)", { XX } },
6283 { "(bad)", { XX } },
6284 { "(bad)", { XX } },
6285 { "(bad)", { XX } },
6286 { "(bad)", { XX } },
6287 { "(bad)", { XX } },
6288 { "(bad)", { XX } },
6289 /* b0 */
6290 { "(bad)", { XX } },
6291 { "(bad)", { XX } },
6292 { "(bad)", { XX } },
6293 { "(bad)", { XX } },
6294 { "(bad)", { XX } },
6295 { "(bad)", { XX } },
6296 { "(bad)", { XX } },
6297 { "(bad)", { XX } },
6298 /* b8 */
6299 { "(bad)", { XX } },
6300 { "(bad)", { XX } },
6301 { "(bad)", { XX } },
6302 { "(bad)", { XX } },
6303 { "(bad)", { XX } },
6304 { "(bad)", { XX } },
6305 { "(bad)", { XX } },
6306 { "(bad)", { XX } },
6307 /* c0 */
6308 { "(bad)", { XX } },
6309 { "(bad)", { XX } },
6310 { "(bad)", { XX } },
6311 { "(bad)", { XX } },
6312 { "(bad)", { XX } },
6313 { "(bad)", { XX } },
6314 { "(bad)", { XX } },
6315 { "(bad)", { XX } },
6316 /* c8 */
6317 { "(bad)", { XX } },
6318 { "(bad)", { XX } },
6319 { "(bad)", { XX } },
6320 { "(bad)", { XX } },
6321 { "(bad)", { XX } },
6322 { "(bad)", { XX } },
6323 { "(bad)", { XX } },
6324 { "(bad)", { XX } },
6325 /* d0 */
6326 { "(bad)", { XX } },
6327 { "(bad)", { XX } },
6328 { "(bad)", { XX } },
6329 { "(bad)", { XX } },
6330 { "(bad)", { XX } },
6331 { "(bad)", { XX } },
6332 { "(bad)", { XX } },
6333 { "(bad)", { XX } },
6334 /* d8 */
6335 { "(bad)", { XX } },
6336 { "(bad)", { XX } },
6337 { "(bad)", { XX } },
6338 { "(bad)", { XX } },
6339 { "(bad)", { XX } },
6340 { "(bad)", { XX } },
6341 { "(bad)", { XX } },
6342 { "(bad)", { XX } },
6343 /* e0 */
6344 { "(bad)", { XX } },
6345 { "(bad)", { XX } },
6346 { "(bad)", { XX } },
6347 { "(bad)", { XX } },
6348 { "(bad)", { XX } },
6349 { "(bad)", { XX } },
6350 { "(bad)", { XX } },
6351 { "(bad)", { XX } },
6352 /* e8 */
6353 { "(bad)", { XX } },
6354 { "(bad)", { XX } },
6355 { "(bad)", { XX } },
6356 { "(bad)", { XX } },
6357 { "(bad)", { XX } },
6358 { "(bad)", { XX } },
6359 { "(bad)", { XX } },
6360 { "(bad)", { XX } },
6361 /* f0 */
6362 { "(bad)", { XX } },
6363 { "(bad)", { XX } },
6364 { "(bad)", { XX } },
6365 { "(bad)", { XX } },
6366 { "(bad)", { XX } },
6367 { "(bad)", { XX } },
6368 { "(bad)", { XX } },
6369 { "(bad)", { XX } },
6370 /* f8 */
6371 { "(bad)", { XX } },
6372 { "(bad)", { XX } },
6373 { "(bad)", { XX } },
6374 { "(bad)", { XX } },
6375 { "(bad)", { XX } },
6376 { "(bad)", { XX } },
6377 { "(bad)", { XX } },
6378 { "(bad)", { XX } },
6379 },
6380 };
6381
6382 static const struct dis386 xop_table[][256] = {
6383 /* XOP_09 */
6384 {
6385 /* 00 */
6386 { "(bad)", { XX } },
6387 { "(bad)", { XX } },
6388 { "(bad)", { XX } },
6389 { "(bad)", { XX } },
6390 { "(bad)", { XX } },
6391 { "(bad)", { XX } },
6392 { "(bad)", { XX } },
6393 { "(bad)", { XX } },
6394 /* 08 */
6395 { "(bad)", { XX } },
6396 { "(bad)", { XX } },
6397 { "(bad)", { XX } },
6398 { "(bad)", { XX } },
6399 { "(bad)", { XX } },
6400 { "(bad)", { XX } },
6401 { "(bad)", { XX } },
6402 { "(bad)", { XX } },
6403 /* 10 */
6404 { "(bad)", { XX } },
6405 { "(bad)", { XX } },
6406 { REG_TABLE (REG_XOP_LWPCB) },
6407 { "(bad)", { XX } },
6408 { "(bad)", { XX } },
6409 { "(bad)", { XX } },
6410 { "(bad)", { XX } },
6411 { "(bad)", { XX } },
6412 /* 18 */
6413 { "(bad)", { XX } },
6414 { "(bad)", { XX } },
6415 { "(bad)", { XX } },
6416 { "(bad)", { XX } },
6417 { "(bad)", { XX } },
6418 { "(bad)", { XX } },
6419 { "(bad)", { XX } },
6420 { "(bad)", { XX } },
6421 /* 20 */
6422 { "(bad)", { XX } },
6423 { "(bad)", { XX } },
6424 { "(bad)", { XX } },
6425 { "(bad)", { XX } },
6426 { "(bad)", { XX } },
6427 { "(bad)", { XX } },
6428 { "(bad)", { XX } },
6429 { "(bad)", { XX } },
6430 /* 28 */
6431 { "(bad)", { XX } },
6432 { "(bad)", { XX } },
6433 { "(bad)", { XX } },
6434 { "(bad)", { XX } },
6435 { "(bad)", { XX } },
6436 { "(bad)", { XX } },
6437 { "(bad)", { XX } },
6438 { "(bad)", { XX } },
6439 /* 30 */
6440 { "(bad)", { XX } },
6441 { "(bad)", { XX } },
6442 { "(bad)", { XX } },
6443 { "(bad)", { XX } },
6444 { "(bad)", { XX } },
6445 { "(bad)", { XX } },
6446 { "(bad)", { XX } },
6447 { "(bad)", { XX } },
6448 /* 38 */
6449 { "(bad)", { XX } },
6450 { "(bad)", { XX } },
6451 { "(bad)", { XX } },
6452 { "(bad)", { XX } },
6453 { "(bad)", { XX } },
6454 { "(bad)", { XX } },
6455 { "(bad)", { XX } },
6456 { "(bad)", { XX } },
6457 /* 40 */
6458 { "(bad)", { XX } },
6459 { "(bad)", { XX } },
6460 { "(bad)", { XX } },
6461 { "(bad)", { XX } },
6462 { "(bad)", { XX } },
6463 { "(bad)", { XX } },
6464 { "(bad)", { XX } },
6465 { "(bad)", { XX } },
6466 /* 48 */
6467 { "(bad)", { XX } },
6468 { "(bad)", { XX } },
6469 { "(bad)", { XX } },
6470 { "(bad)", { XX } },
6471 { "(bad)", { XX } },
6472 { "(bad)", { XX } },
6473 { "(bad)", { XX } },
6474 { "(bad)", { XX } },
6475 /* 50 */
6476 { "(bad)", { XX } },
6477 { "(bad)", { XX } },
6478 { "(bad)", { XX } },
6479 { "(bad)", { XX } },
6480 { "(bad)", { XX } },
6481 { "(bad)", { XX } },
6482 { "(bad)", { XX } },
6483 { "(bad)", { XX } },
6484 /* 58 */
6485 { "(bad)", { XX } },
6486 { "(bad)", { XX } },
6487 { "(bad)", { XX } },
6488 { "(bad)", { XX } },
6489 { "(bad)", { XX } },
6490 { "(bad)", { XX } },
6491 { "(bad)", { XX } },
6492 { "(bad)", { XX } },
6493 /* 60 */
6494 { "(bad)", { XX } },
6495 { "(bad)", { XX } },
6496 { "(bad)", { XX } },
6497 { "(bad)", { XX } },
6498 { "(bad)", { XX } },
6499 { "(bad)", { XX } },
6500 { "(bad)", { XX } },
6501 { "(bad)", { XX } },
6502 /* 68 */
6503 { "(bad)", { XX } },
6504 { "(bad)", { XX } },
6505 { "(bad)", { XX } },
6506 { "(bad)", { XX } },
6507 { "(bad)", { XX } },
6508 { "(bad)", { XX } },
6509 { "(bad)", { XX } },
6510 { "(bad)", { XX } },
6511 /* 70 */
6512 { "(bad)", { XX } },
6513 { "(bad)", { XX } },
6514 { "(bad)", { XX } },
6515 { "(bad)", { XX } },
6516 { "(bad)", { XX } },
6517 { "(bad)", { XX } },
6518 { "(bad)", { XX } },
6519 { "(bad)", { XX } },
6520 /* 78 */
6521 { "(bad)", { XX } },
6522 { "(bad)", { XX } },
6523 { "(bad)", { XX } },
6524 { "(bad)", { XX } },
6525 { "(bad)", { XX } },
6526 { "(bad)", { XX } },
6527 { "(bad)", { XX } },
6528 { "(bad)", { XX } },
6529 /* 80 */
6530 { "(bad)", { XX } },
6531 { "(bad)", { XX } },
6532 { "(bad)", { XX } },
6533 { "(bad)", { XX } },
6534 { "(bad)", { XX } },
6535 { "(bad)", { XX } },
6536 { "(bad)", { XX } },
6537 { "(bad)", { XX } },
6538 /* 88 */
6539 { "(bad)", { XX } },
6540 { "(bad)", { XX } },
6541 { "(bad)", { XX } },
6542 { "(bad)", { XX } },
6543 { "(bad)", { XX } },
6544 { "(bad)", { XX } },
6545 { "(bad)", { XX } },
6546 { "(bad)", { XX } },
6547 /* 90 */
6548 { "(bad)", { XX } },
6549 { "(bad)", { XX } },
6550 { "(bad)", { XX } },
6551 { "(bad)", { XX } },
6552 { "(bad)", { XX } },
6553 { "(bad)", { XX } },
6554 { "(bad)", { XX } },
6555 { "(bad)", { XX } },
6556 /* 98 */
6557 { "(bad)", { XX } },
6558 { "(bad)", { XX } },
6559 { "(bad)", { XX } },
6560 { "(bad)", { XX } },
6561 { "(bad)", { XX } },
6562 { "(bad)", { XX } },
6563 { "(bad)", { XX } },
6564 { "(bad)", { XX } },
6565 /* a0 */
6566 { "(bad)", { XX } },
6567 { "(bad)", { XX } },
6568 { "(bad)", { XX } },
6569 { "(bad)", { XX } },
6570 { "(bad)", { XX } },
6571 { "(bad)", { XX } },
6572 { "(bad)", { XX } },
6573 { "(bad)", { XX } },
6574 /* a8 */
6575 { "(bad)", { XX } },
6576 { "(bad)", { XX } },
6577 { "(bad)", { XX } },
6578 { "(bad)", { XX } },
6579 { "(bad)", { XX } },
6580 { "(bad)", { XX } },
6581 { "(bad)", { XX } },
6582 { "(bad)", { XX } },
6583 /* b0 */
6584 { "(bad)", { XX } },
6585 { "(bad)", { XX } },
6586 { "(bad)", { XX } },
6587 { "(bad)", { XX } },
6588 { "(bad)", { XX } },
6589 { "(bad)", { XX } },
6590 { "(bad)", { XX } },
6591 { "(bad)", { XX } },
6592 /* b8 */
6593 { "(bad)", { XX } },
6594 { "(bad)", { XX } },
6595 { "(bad)", { XX } },
6596 { "(bad)", { XX } },
6597 { "(bad)", { XX } },
6598 { "(bad)", { XX } },
6599 { "(bad)", { XX } },
6600 { "(bad)", { XX } },
6601 /* c0 */
6602 { "(bad)", { XX } },
6603 { "(bad)", { XX } },
6604 { "(bad)", { XX } },
6605 { "(bad)", { XX } },
6606 { "(bad)", { XX } },
6607 { "(bad)", { XX } },
6608 { "(bad)", { XX } },
6609 { "(bad)", { XX } },
6610 /* c8 */
6611 { "(bad)", { XX } },
6612 { "(bad)", { XX } },
6613 { "(bad)", { XX } },
6614 { "(bad)", { XX } },
6615 { "(bad)", { XX } },
6616 { "(bad)", { XX } },
6617 { "(bad)", { XX } },
6618 { "(bad)", { XX } },
6619 /* d0 */
6620 { "(bad)", { XX } },
6621 { "(bad)", { XX } },
6622 { "(bad)", { XX } },
6623 { "(bad)", { XX } },
6624 { "(bad)", { XX } },
6625 { "(bad)", { XX } },
6626 { "(bad)", { XX } },
6627 { "(bad)", { XX } },
6628 /* d8 */
6629 { "(bad)", { XX } },
6630 { "(bad)", { XX } },
6631 { "(bad)", { XX } },
6632 { "(bad)", { XX } },
6633 { "(bad)", { XX } },
6634 { "(bad)", { XX } },
6635 { "(bad)", { XX } },
6636 { "(bad)", { XX } },
6637 /* e0 */
6638 { "(bad)", { XX } },
6639 { "(bad)", { XX } },
6640 { "(bad)", { XX } },
6641 { "(bad)", { XX } },
6642 { "(bad)", { XX } },
6643 { "(bad)", { XX } },
6644 { "(bad)", { XX } },
6645 { "(bad)", { XX } },
6646 /* e8 */
6647 { "(bad)", { XX } },
6648 { "(bad)", { XX } },
6649 { "(bad)", { XX } },
6650 { "(bad)", { XX } },
6651 { "(bad)", { XX } },
6652 { "(bad)", { XX } },
6653 { "(bad)", { XX } },
6654 { "(bad)", { XX } },
6655 /* f0 */
6656 { "(bad)", { XX } },
6657 { "(bad)", { XX } },
6658 { "(bad)", { XX } },
6659 { "(bad)", { XX } },
6660 { "(bad)", { XX } },
6661 { "(bad)", { XX } },
6662 { "(bad)", { XX } },
6663 { "(bad)", { XX } },
6664 /* f8 */
6665 { "(bad)", { XX } },
6666 { "(bad)", { XX } },
6667 { "(bad)", { XX } },
6668 { "(bad)", { XX } },
6669 { "(bad)", { XX } },
6670 { "(bad)", { XX } },
6671 { "(bad)", { XX } },
6672 { "(bad)", { XX } },
6673 },
6674 /* XOP_0A */
6675 {
6676 /* 00 */
6677 { "(bad)", { XX } },
6678 { "(bad)", { XX } },
6679 { "(bad)", { XX } },
6680 { "(bad)", { XX } },
6681 { "(bad)", { XX } },
6682 { "(bad)", { XX } },
6683 { "(bad)", { XX } },
6684 { "(bad)", { XX } },
6685 /* 08 */
6686 { "(bad)", { XX } },
6687 { "(bad)", { XX } },
6688 { "(bad)", { XX } },
6689 { "(bad)", { XX } },
6690 { "(bad)", { XX } },
6691 { "(bad)", { XX } },
6692 { "(bad)", { XX } },
6693 { "(bad)", { XX } },
6694 /* 10 */
6695 { "(bad)", { XX } },
6696 { "(bad)", { XX } },
6697 { REG_TABLE (REG_XOP_LWP) },
6698 { "(bad)", { XX } },
6699 { "(bad)", { XX } },
6700 { "(bad)", { XX } },
6701 { "(bad)", { XX } },
6702 { "(bad)", { XX } },
6703 /* 18 */
6704 { "(bad)", { XX } },
6705 { "(bad)", { XX } },
6706 { "(bad)", { XX } },
6707 { "(bad)", { XX } },
6708 { "(bad)", { XX } },
6709 { "(bad)", { XX } },
6710 { "(bad)", { XX } },
6711 { "(bad)", { XX } },
6712 /* 20 */
6713 { "(bad)", { XX } },
6714 { "(bad)", { XX } },
6715 { "(bad)", { XX } },
6716 { "(bad)", { XX } },
6717 { "(bad)", { XX } },
6718 { "(bad)", { XX } },
6719 { "(bad)", { XX } },
6720 { "(bad)", { XX } },
6721 /* 28 */
6722 { "(bad)", { XX } },
6723 { "(bad)", { XX } },
6724 { "(bad)", { XX } },
6725 { "(bad)", { XX } },
6726 { "(bad)", { XX } },
6727 { "(bad)", { XX } },
6728 { "(bad)", { XX } },
6729 { "(bad)", { XX } },
6730 /* 30 */
6731 { "(bad)", { XX } },
6732 { "(bad)", { XX } },
6733 { "(bad)", { XX } },
6734 { "(bad)", { XX } },
6735 { "(bad)", { XX } },
6736 { "(bad)", { XX } },
6737 { "(bad)", { XX } },
6738 { "(bad)", { XX } },
6739 /* 38 */
6740 { "(bad)", { XX } },
6741 { "(bad)", { XX } },
6742 { "(bad)", { XX } },
6743 { "(bad)", { XX } },
6744 { "(bad)", { XX } },
6745 { "(bad)", { XX } },
6746 { "(bad)", { XX } },
6747 { "(bad)", { XX } },
6748 /* 40 */
6749 { "(bad)", { XX } },
6750 { "(bad)", { XX } },
6751 { "(bad)", { XX } },
6752 { "(bad)", { XX } },
6753 { "(bad)", { XX } },
6754 { "(bad)", { XX } },
6755 { "(bad)", { XX } },
6756 { "(bad)", { XX } },
6757 /* 48 */
6758 { "(bad)", { XX } },
6759 { "(bad)", { XX } },
6760 { "(bad)", { XX } },
6761 { "(bad)", { XX } },
6762 { "(bad)", { XX } },
6763 { "(bad)", { XX } },
6764 { "(bad)", { XX } },
6765 { "(bad)", { XX } },
6766 /* 50 */
6767 { "(bad)", { XX } },
6768 { "(bad)", { XX } },
6769 { "(bad)", { XX } },
6770 { "(bad)", { XX } },
6771 { "(bad)", { XX } },
6772 { "(bad)", { XX } },
6773 { "(bad)", { XX } },
6774 { "(bad)", { XX } },
6775 /* 58 */
6776 { "(bad)", { XX } },
6777 { "(bad)", { XX } },
6778 { "(bad)", { XX } },
6779 { "(bad)", { XX } },
6780 { "(bad)", { XX } },
6781 { "(bad)", { XX } },
6782 { "(bad)", { XX } },
6783 { "(bad)", { XX } },
6784 /* 60 */
6785 { "(bad)", { XX } },
6786 { "(bad)", { XX } },
6787 { "(bad)", { XX } },
6788 { "(bad)", { XX } },
6789 { "(bad)", { XX } },
6790 { "(bad)", { XX } },
6791 { "(bad)", { XX } },
6792 { "(bad)", { XX } },
6793 /* 68 */
6794 { "(bad)", { XX } },
6795 { "(bad)", { XX } },
6796 { "(bad)", { XX } },
6797 { "(bad)", { XX } },
6798 { "(bad)", { XX } },
6799 { "(bad)", { XX } },
6800 { "(bad)", { XX } },
6801 { "(bad)", { XX } },
6802 /* 70 */
6803 { "(bad)", { XX } },
6804 { "(bad)", { XX } },
6805 { "(bad)", { XX } },
6806 { "(bad)", { XX } },
6807 { "(bad)", { XX } },
6808 { "(bad)", { XX } },
6809 { "(bad)", { XX } },
6810 { "(bad)", { XX } },
6811 /* 78 */
6812 { "(bad)", { XX } },
6813 { "(bad)", { XX } },
6814 { "(bad)", { XX } },
6815 { "(bad)", { XX } },
6816 { "(bad)", { XX } },
6817 { "(bad)", { XX } },
6818 { "(bad)", { XX } },
6819 { "(bad)", { XX } },
6820 /* 80 */
6821 { "(bad)", { XX } },
6822 { "(bad)", { XX } },
6823 { "(bad)", { XX } },
6824 { "(bad)", { XX } },
6825 { "(bad)", { XX } },
6826 { "(bad)", { XX } },
6827 { "(bad)", { XX } },
6828 { "(bad)", { XX } },
6829 /* 88 */
6830 { "(bad)", { XX } },
6831 { "(bad)", { XX } },
6832 { "(bad)", { XX } },
6833 { "(bad)", { XX } },
6834 { "(bad)", { XX } },
6835 { "(bad)", { XX } },
6836 { "(bad)", { XX } },
6837 { "(bad)", { XX } },
6838 /* 90 */
6839 { "(bad)", { XX } },
6840 { "(bad)", { XX } },
6841 { "(bad)", { XX } },
6842 { "(bad)", { XX } },
6843 { "(bad)", { XX } },
6844 { "(bad)", { XX } },
6845 { "(bad)", { XX } },
6846 { "(bad)", { XX } },
6847 /* 98 */
6848 { "(bad)", { XX } },
6849 { "(bad)", { XX } },
6850 { "(bad)", { XX } },
6851 { "(bad)", { XX } },
6852 { "(bad)", { XX } },
6853 { "(bad)", { XX } },
6854 { "(bad)", { XX } },
6855 { "(bad)", { XX } },
6856 /* a0 */
6857 { "(bad)", { XX } },
6858 { "(bad)", { XX } },
6859 { "(bad)", { XX } },
6860 { "(bad)", { XX } },
6861 { "(bad)", { XX } },
6862 { "(bad)", { XX } },
6863 { "(bad)", { XX } },
6864 { "(bad)", { XX } },
6865 /* a8 */
6866 { "(bad)", { XX } },
6867 { "(bad)", { XX } },
6868 { "(bad)", { XX } },
6869 { "(bad)", { XX } },
6870 { "(bad)", { XX } },
6871 { "(bad)", { XX } },
6872 { "(bad)", { XX } },
6873 { "(bad)", { XX } },
6874 /* b0 */
6875 { "(bad)", { XX } },
6876 { "(bad)", { XX } },
6877 { "(bad)", { XX } },
6878 { "(bad)", { XX } },
6879 { "(bad)", { XX } },
6880 { "(bad)", { XX } },
6881 { "(bad)", { XX } },
6882 { "(bad)", { XX } },
6883 /* b8 */
6884 { "(bad)", { XX } },
6885 { "(bad)", { XX } },
6886 { "(bad)", { XX } },
6887 { "(bad)", { XX } },
6888 { "(bad)", { XX } },
6889 { "(bad)", { XX } },
6890 { "(bad)", { XX } },
6891 { "(bad)", { XX } },
6892 /* c0 */
6893 { "(bad)", { XX } },
6894 { "(bad)", { XX } },
6895 { "(bad)", { XX } },
6896 { "(bad)", { XX } },
6897 { "(bad)", { XX } },
6898 { "(bad)", { XX } },
6899 { "(bad)", { XX } },
6900 { "(bad)", { XX } },
6901 /* c8 */
6902 { "(bad)", { XX } },
6903 { "(bad)", { XX } },
6904 { "(bad)", { XX } },
6905 { "(bad)", { XX } },
6906 { "(bad)", { XX } },
6907 { "(bad)", { XX } },
6908 { "(bad)", { XX } },
6909 { "(bad)", { XX } },
6910 /* d0 */
6911 { "(bad)", { XX } },
6912 { "(bad)", { XX } },
6913 { "(bad)", { XX } },
6914 { "(bad)", { XX } },
6915 { "(bad)", { XX } },
6916 { "(bad)", { XX } },
6917 { "(bad)", { XX } },
6918 { "(bad)", { XX } },
6919 /* d8 */
6920 { "(bad)", { XX } },
6921 { "(bad)", { XX } },
6922 { "(bad)", { XX } },
6923 { "(bad)", { XX } },
6924 { "(bad)", { XX } },
6925 { "(bad)", { XX } },
6926 { "(bad)", { XX } },
6927 { "(bad)", { XX } },
6928 /* e0 */
6929 { "(bad)", { XX } },
6930 { "(bad)", { XX } },
6931 { "(bad)", { XX } },
6932 { "(bad)", { XX } },
6933 { "(bad)", { XX } },
6934 { "(bad)", { XX } },
6935 { "(bad)", { XX } },
6936 { "(bad)", { XX } },
6937 /* e8 */
6938 { "(bad)", { XX } },
6939 { "(bad)", { XX } },
6940 { "(bad)", { XX } },
6941 { "(bad)", { XX } },
6942 { "(bad)", { XX } },
6943 { "(bad)", { XX } },
6944 { "(bad)", { XX } },
6945 { "(bad)", { XX } },
6946 /* f0 */
6947 { "(bad)", { XX } },
6948 { "(bad)", { XX } },
6949 { "(bad)", { XX } },
6950 { "(bad)", { XX } },
6951 { "(bad)", { XX } },
6952 { "(bad)", { XX } },
6953 { "(bad)", { XX } },
6954 { "(bad)", { XX } },
6955 /* f8 */
6956 { "(bad)", { XX } },
6957 { "(bad)", { XX } },
6958 { "(bad)", { XX } },
6959 { "(bad)", { XX } },
6960 { "(bad)", { XX } },
6961 { "(bad)", { XX } },
6962 { "(bad)", { XX } },
6963 { "(bad)", { XX } },
6964 },
6965 };
6966
6967 static const struct dis386 vex_table[][256] = {
6968 /* VEX_0F */
6969 {
6970 /* 00 */
6971 { "(bad)", { XX } },
6972 { "(bad)", { XX } },
6973 { "(bad)", { XX } },
6974 { "(bad)", { XX } },
6975 { "(bad)", { XX } },
6976 { "(bad)", { XX } },
6977 { "(bad)", { XX } },
6978 { "(bad)", { XX } },
6979 /* 08 */
6980 { "(bad)", { XX } },
6981 { "(bad)", { XX } },
6982 { "(bad)", { XX } },
6983 { "(bad)", { XX } },
6984 { "(bad)", { XX } },
6985 { "(bad)", { XX } },
6986 { "(bad)", { XX } },
6987 { "(bad)", { XX } },
6988 /* 10 */
6989 { PREFIX_TABLE (PREFIX_VEX_10) },
6990 { PREFIX_TABLE (PREFIX_VEX_11) },
6991 { PREFIX_TABLE (PREFIX_VEX_12) },
6992 { MOD_TABLE (MOD_VEX_13) },
6993 { "vunpcklpX", { XM, Vex, EXx } },
6994 { "vunpckhpX", { XM, Vex, EXx } },
6995 { PREFIX_TABLE (PREFIX_VEX_16) },
6996 { MOD_TABLE (MOD_VEX_17) },
6997 /* 18 */
6998 { "(bad)", { XX } },
6999 { "(bad)", { XX } },
7000 { "(bad)", { XX } },
7001 { "(bad)", { XX } },
7002 { "(bad)", { XX } },
7003 { "(bad)", { XX } },
7004 { "(bad)", { XX } },
7005 { "(bad)", { XX } },
7006 /* 20 */
7007 { "(bad)", { XX } },
7008 { "(bad)", { XX } },
7009 { "(bad)", { XX } },
7010 { "(bad)", { XX } },
7011 { "(bad)", { XX } },
7012 { "(bad)", { XX } },
7013 { "(bad)", { XX } },
7014 { "(bad)", { XX } },
7015 /* 28 */
7016 { "vmovapX", { XM, EXx } },
7017 { "vmovapX", { EXxS, XM } },
7018 { PREFIX_TABLE (PREFIX_VEX_2A) },
7019 { MOD_TABLE (MOD_VEX_2B) },
7020 { PREFIX_TABLE (PREFIX_VEX_2C) },
7021 { PREFIX_TABLE (PREFIX_VEX_2D) },
7022 { PREFIX_TABLE (PREFIX_VEX_2E) },
7023 { PREFIX_TABLE (PREFIX_VEX_2F) },
7024 /* 30 */
7025 { "(bad)", { XX } },
7026 { "(bad)", { XX } },
7027 { "(bad)", { XX } },
7028 { "(bad)", { XX } },
7029 { "(bad)", { XX } },
7030 { "(bad)", { XX } },
7031 { "(bad)", { XX } },
7032 { "(bad)", { XX } },
7033 /* 38 */
7034 { "(bad)", { XX } },
7035 { "(bad)", { XX } },
7036 { "(bad)", { XX } },
7037 { "(bad)", { XX } },
7038 { "(bad)", { XX } },
7039 { "(bad)", { XX } },
7040 { "(bad)", { XX } },
7041 { "(bad)", { XX } },
7042 /* 40 */
7043 { "(bad)", { XX } },
7044 { "(bad)", { XX } },
7045 { "(bad)", { XX } },
7046 { "(bad)", { XX } },
7047 { "(bad)", { XX } },
7048 { "(bad)", { XX } },
7049 { "(bad)", { XX } },
7050 { "(bad)", { XX } },
7051 /* 48 */
7052 { "(bad)", { XX } },
7053 { "(bad)", { XX } },
7054 { "(bad)", { XX } },
7055 { "(bad)", { XX } },
7056 { "(bad)", { XX } },
7057 { "(bad)", { XX } },
7058 { "(bad)", { XX } },
7059 { "(bad)", { XX } },
7060 /* 50 */
7061 { MOD_TABLE (MOD_VEX_51) },
7062 { PREFIX_TABLE (PREFIX_VEX_51) },
7063 { PREFIX_TABLE (PREFIX_VEX_52) },
7064 { PREFIX_TABLE (PREFIX_VEX_53) },
7065 { "vandpX", { XM, Vex, EXx } },
7066 { "vandnpX", { XM, Vex, EXx } },
7067 { "vorpX", { XM, Vex, EXx } },
7068 { "vxorpX", { XM, Vex, EXx } },
7069 /* 58 */
7070 { PREFIX_TABLE (PREFIX_VEX_58) },
7071 { PREFIX_TABLE (PREFIX_VEX_59) },
7072 { PREFIX_TABLE (PREFIX_VEX_5A) },
7073 { PREFIX_TABLE (PREFIX_VEX_5B) },
7074 { PREFIX_TABLE (PREFIX_VEX_5C) },
7075 { PREFIX_TABLE (PREFIX_VEX_5D) },
7076 { PREFIX_TABLE (PREFIX_VEX_5E) },
7077 { PREFIX_TABLE (PREFIX_VEX_5F) },
7078 /* 60 */
7079 { PREFIX_TABLE (PREFIX_VEX_60) },
7080 { PREFIX_TABLE (PREFIX_VEX_61) },
7081 { PREFIX_TABLE (PREFIX_VEX_62) },
7082 { PREFIX_TABLE (PREFIX_VEX_63) },
7083 { PREFIX_TABLE (PREFIX_VEX_64) },
7084 { PREFIX_TABLE (PREFIX_VEX_65) },
7085 { PREFIX_TABLE (PREFIX_VEX_66) },
7086 { PREFIX_TABLE (PREFIX_VEX_67) },
7087 /* 68 */
7088 { PREFIX_TABLE (PREFIX_VEX_68) },
7089 { PREFIX_TABLE (PREFIX_VEX_69) },
7090 { PREFIX_TABLE (PREFIX_VEX_6A) },
7091 { PREFIX_TABLE (PREFIX_VEX_6B) },
7092 { PREFIX_TABLE (PREFIX_VEX_6C) },
7093 { PREFIX_TABLE (PREFIX_VEX_6D) },
7094 { PREFIX_TABLE (PREFIX_VEX_6E) },
7095 { PREFIX_TABLE (PREFIX_VEX_6F) },
7096 /* 70 */
7097 { PREFIX_TABLE (PREFIX_VEX_70) },
7098 { REG_TABLE (REG_VEX_71) },
7099 { REG_TABLE (REG_VEX_72) },
7100 { REG_TABLE (REG_VEX_73) },
7101 { PREFIX_TABLE (PREFIX_VEX_74) },
7102 { PREFIX_TABLE (PREFIX_VEX_75) },
7103 { PREFIX_TABLE (PREFIX_VEX_76) },
7104 { PREFIX_TABLE (PREFIX_VEX_77) },
7105 /* 78 */
7106 { "(bad)", { XX } },
7107 { "(bad)", { XX } },
7108 { "(bad)", { XX } },
7109 { "(bad)", { XX } },
7110 { PREFIX_TABLE (PREFIX_VEX_7C) },
7111 { PREFIX_TABLE (PREFIX_VEX_7D) },
7112 { PREFIX_TABLE (PREFIX_VEX_7E) },
7113 { PREFIX_TABLE (PREFIX_VEX_7F) },
7114 /* 80 */
7115 { "(bad)", { XX } },
7116 { "(bad)", { XX } },
7117 { "(bad)", { XX } },
7118 { "(bad)", { XX } },
7119 { "(bad)", { XX } },
7120 { "(bad)", { XX } },
7121 { "(bad)", { XX } },
7122 { "(bad)", { XX } },
7123 /* 88 */
7124 { "(bad)", { XX } },
7125 { "(bad)", { XX } },
7126 { "(bad)", { XX } },
7127 { "(bad)", { XX } },
7128 { "(bad)", { XX } },
7129 { "(bad)", { XX } },
7130 { "(bad)", { XX } },
7131 { "(bad)", { XX } },
7132 /* 90 */
7133 { "(bad)", { XX } },
7134 { "(bad)", { XX } },
7135 { "(bad)", { XX } },
7136 { "(bad)", { XX } },
7137 { "(bad)", { XX } },
7138 { "(bad)", { XX } },
7139 { "(bad)", { XX } },
7140 { "(bad)", { XX } },
7141 /* 98 */
7142 { "(bad)", { XX } },
7143 { "(bad)", { XX } },
7144 { "(bad)", { XX } },
7145 { "(bad)", { XX } },
7146 { "(bad)", { XX } },
7147 { "(bad)", { XX } },
7148 { "(bad)", { XX } },
7149 { "(bad)", { XX } },
7150 /* a0 */
7151 { "(bad)", { XX } },
7152 { "(bad)", { XX } },
7153 { "(bad)", { XX } },
7154 { "(bad)", { XX } },
7155 { "(bad)", { XX } },
7156 { "(bad)", { XX } },
7157 { "(bad)", { XX } },
7158 { "(bad)", { XX } },
7159 /* a8 */
7160 { "(bad)", { XX } },
7161 { "(bad)", { XX } },
7162 { "(bad)", { XX } },
7163 { "(bad)", { XX } },
7164 { "(bad)", { XX } },
7165 { "(bad)", { XX } },
7166 { REG_TABLE (REG_VEX_AE) },
7167 { "(bad)", { XX } },
7168 /* b0 */
7169 { "(bad)", { XX } },
7170 { "(bad)", { XX } },
7171 { "(bad)", { XX } },
7172 { "(bad)", { XX } },
7173 { "(bad)", { XX } },
7174 { "(bad)", { XX } },
7175 { "(bad)", { XX } },
7176 { "(bad)", { XX } },
7177 /* b8 */
7178 { "(bad)", { XX } },
7179 { "(bad)", { XX } },
7180 { "(bad)", { XX } },
7181 { "(bad)", { XX } },
7182 { "(bad)", { XX } },
7183 { "(bad)", { XX } },
7184 { "(bad)", { XX } },
7185 { "(bad)", { XX } },
7186 /* c0 */
7187 { "(bad)", { XX } },
7188 { "(bad)", { XX } },
7189 { PREFIX_TABLE (PREFIX_VEX_C2) },
7190 { "(bad)", { XX } },
7191 { PREFIX_TABLE (PREFIX_VEX_C4) },
7192 { PREFIX_TABLE (PREFIX_VEX_C5) },
7193 { "vshufpX", { XM, Vex, EXx, Ib } },
7194 { "(bad)", { XX } },
7195 /* c8 */
7196 { "(bad)", { XX } },
7197 { "(bad)", { XX } },
7198 { "(bad)", { XX } },
7199 { "(bad)", { XX } },
7200 { "(bad)", { XX } },
7201 { "(bad)", { XX } },
7202 { "(bad)", { XX } },
7203 { "(bad)", { XX } },
7204 /* d0 */
7205 { PREFIX_TABLE (PREFIX_VEX_D0) },
7206 { PREFIX_TABLE (PREFIX_VEX_D1) },
7207 { PREFIX_TABLE (PREFIX_VEX_D2) },
7208 { PREFIX_TABLE (PREFIX_VEX_D3) },
7209 { PREFIX_TABLE (PREFIX_VEX_D4) },
7210 { PREFIX_TABLE (PREFIX_VEX_D5) },
7211 { PREFIX_TABLE (PREFIX_VEX_D6) },
7212 { PREFIX_TABLE (PREFIX_VEX_D7) },
7213 /* d8 */
7214 { PREFIX_TABLE (PREFIX_VEX_D8) },
7215 { PREFIX_TABLE (PREFIX_VEX_D9) },
7216 { PREFIX_TABLE (PREFIX_VEX_DA) },
7217 { PREFIX_TABLE (PREFIX_VEX_DB) },
7218 { PREFIX_TABLE (PREFIX_VEX_DC) },
7219 { PREFIX_TABLE (PREFIX_VEX_DD) },
7220 { PREFIX_TABLE (PREFIX_VEX_DE) },
7221 { PREFIX_TABLE (PREFIX_VEX_DF) },
7222 /* e0 */
7223 { PREFIX_TABLE (PREFIX_VEX_E0) },
7224 { PREFIX_TABLE (PREFIX_VEX_E1) },
7225 { PREFIX_TABLE (PREFIX_VEX_E2) },
7226 { PREFIX_TABLE (PREFIX_VEX_E3) },
7227 { PREFIX_TABLE (PREFIX_VEX_E4) },
7228 { PREFIX_TABLE (PREFIX_VEX_E5) },
7229 { PREFIX_TABLE (PREFIX_VEX_E6) },
7230 { PREFIX_TABLE (PREFIX_VEX_E7) },
7231 /* e8 */
7232 { PREFIX_TABLE (PREFIX_VEX_E8) },
7233 { PREFIX_TABLE (PREFIX_VEX_E9) },
7234 { PREFIX_TABLE (PREFIX_VEX_EA) },
7235 { PREFIX_TABLE (PREFIX_VEX_EB) },
7236 { PREFIX_TABLE (PREFIX_VEX_EC) },
7237 { PREFIX_TABLE (PREFIX_VEX_ED) },
7238 { PREFIX_TABLE (PREFIX_VEX_EE) },
7239 { PREFIX_TABLE (PREFIX_VEX_EF) },
7240 /* f0 */
7241 { PREFIX_TABLE (PREFIX_VEX_F0) },
7242 { PREFIX_TABLE (PREFIX_VEX_F1) },
7243 { PREFIX_TABLE (PREFIX_VEX_F2) },
7244 { PREFIX_TABLE (PREFIX_VEX_F3) },
7245 { PREFIX_TABLE (PREFIX_VEX_F4) },
7246 { PREFIX_TABLE (PREFIX_VEX_F5) },
7247 { PREFIX_TABLE (PREFIX_VEX_F6) },
7248 { PREFIX_TABLE (PREFIX_VEX_F7) },
7249 /* f8 */
7250 { PREFIX_TABLE (PREFIX_VEX_F8) },
7251 { PREFIX_TABLE (PREFIX_VEX_F9) },
7252 { PREFIX_TABLE (PREFIX_VEX_FA) },
7253 { PREFIX_TABLE (PREFIX_VEX_FB) },
7254 { PREFIX_TABLE (PREFIX_VEX_FC) },
7255 { PREFIX_TABLE (PREFIX_VEX_FD) },
7256 { PREFIX_TABLE (PREFIX_VEX_FE) },
7257 { "(bad)", { XX } },
7258 },
7259 /* VEX_0F38 */
7260 {
7261 /* 00 */
7262 { PREFIX_TABLE (PREFIX_VEX_3800) },
7263 { PREFIX_TABLE (PREFIX_VEX_3801) },
7264 { PREFIX_TABLE (PREFIX_VEX_3802) },
7265 { PREFIX_TABLE (PREFIX_VEX_3803) },
7266 { PREFIX_TABLE (PREFIX_VEX_3804) },
7267 { PREFIX_TABLE (PREFIX_VEX_3805) },
7268 { PREFIX_TABLE (PREFIX_VEX_3806) },
7269 { PREFIX_TABLE (PREFIX_VEX_3807) },
7270 /* 08 */
7271 { PREFIX_TABLE (PREFIX_VEX_3808) },
7272 { PREFIX_TABLE (PREFIX_VEX_3809) },
7273 { PREFIX_TABLE (PREFIX_VEX_380A) },
7274 { PREFIX_TABLE (PREFIX_VEX_380B) },
7275 { PREFIX_TABLE (PREFIX_VEX_380C) },
7276 { PREFIX_TABLE (PREFIX_VEX_380D) },
7277 { PREFIX_TABLE (PREFIX_VEX_380E) },
7278 { PREFIX_TABLE (PREFIX_VEX_380F) },
7279 /* 10 */
7280 { "(bad)", { XX } },
7281 { "(bad)", { XX } },
7282 { "(bad)", { XX } },
7283 { "(bad)", { XX } },
7284 { "(bad)", { XX } },
7285 { "(bad)", { XX } },
7286 { "(bad)", { XX } },
7287 { PREFIX_TABLE (PREFIX_VEX_3817) },
7288 /* 18 */
7289 { PREFIX_TABLE (PREFIX_VEX_3818) },
7290 { PREFIX_TABLE (PREFIX_VEX_3819) },
7291 { PREFIX_TABLE (PREFIX_VEX_381A) },
7292 { "(bad)", { XX } },
7293 { PREFIX_TABLE (PREFIX_VEX_381C) },
7294 { PREFIX_TABLE (PREFIX_VEX_381D) },
7295 { PREFIX_TABLE (PREFIX_VEX_381E) },
7296 { "(bad)", { XX } },
7297 /* 20 */
7298 { PREFIX_TABLE (PREFIX_VEX_3820) },
7299 { PREFIX_TABLE (PREFIX_VEX_3821) },
7300 { PREFIX_TABLE (PREFIX_VEX_3822) },
7301 { PREFIX_TABLE (PREFIX_VEX_3823) },
7302 { PREFIX_TABLE (PREFIX_VEX_3824) },
7303 { PREFIX_TABLE (PREFIX_VEX_3825) },
7304 { "(bad)", { XX } },
7305 { "(bad)", { XX } },
7306 /* 28 */
7307 { PREFIX_TABLE (PREFIX_VEX_3828) },
7308 { PREFIX_TABLE (PREFIX_VEX_3829) },
7309 { PREFIX_TABLE (PREFIX_VEX_382A) },
7310 { PREFIX_TABLE (PREFIX_VEX_382B) },
7311 { PREFIX_TABLE (PREFIX_VEX_382C) },
7312 { PREFIX_TABLE (PREFIX_VEX_382D) },
7313 { PREFIX_TABLE (PREFIX_VEX_382E) },
7314 { PREFIX_TABLE (PREFIX_VEX_382F) },
7315 /* 30 */
7316 { PREFIX_TABLE (PREFIX_VEX_3830) },
7317 { PREFIX_TABLE (PREFIX_VEX_3831) },
7318 { PREFIX_TABLE (PREFIX_VEX_3832) },
7319 { PREFIX_TABLE (PREFIX_VEX_3833) },
7320 { PREFIX_TABLE (PREFIX_VEX_3834) },
7321 { PREFIX_TABLE (PREFIX_VEX_3835) },
7322 { "(bad)", { XX } },
7323 { PREFIX_TABLE (PREFIX_VEX_3837) },
7324 /* 38 */
7325 { PREFIX_TABLE (PREFIX_VEX_3838) },
7326 { PREFIX_TABLE (PREFIX_VEX_3839) },
7327 { PREFIX_TABLE (PREFIX_VEX_383A) },
7328 { PREFIX_TABLE (PREFIX_VEX_383B) },
7329 { PREFIX_TABLE (PREFIX_VEX_383C) },
7330 { PREFIX_TABLE (PREFIX_VEX_383D) },
7331 { PREFIX_TABLE (PREFIX_VEX_383E) },
7332 { PREFIX_TABLE (PREFIX_VEX_383F) },
7333 /* 40 */
7334 { PREFIX_TABLE (PREFIX_VEX_3840) },
7335 { PREFIX_TABLE (PREFIX_VEX_3841) },
7336 { "(bad)", { XX } },
7337 { "(bad)", { XX } },
7338 { "(bad)", { XX } },
7339 { "(bad)", { XX } },
7340 { "(bad)", { XX } },
7341 { "(bad)", { XX } },
7342 /* 48 */
7343 { "(bad)", { XX } },
7344 { "(bad)", { XX } },
7345 { "(bad)", { XX } },
7346 { "(bad)", { XX } },
7347 { "(bad)", { XX } },
7348 { "(bad)", { XX } },
7349 { "(bad)", { XX } },
7350 { "(bad)", { XX } },
7351 /* 50 */
7352 { "(bad)", { XX } },
7353 { "(bad)", { XX } },
7354 { "(bad)", { XX } },
7355 { "(bad)", { XX } },
7356 { "(bad)", { XX } },
7357 { "(bad)", { XX } },
7358 { "(bad)", { XX } },
7359 { "(bad)", { XX } },
7360 /* 58 */
7361 { "(bad)", { XX } },
7362 { "(bad)", { XX } },
7363 { "(bad)", { XX } },
7364 { "(bad)", { XX } },
7365 { "(bad)", { XX } },
7366 { "(bad)", { XX } },
7367 { "(bad)", { XX } },
7368 { "(bad)", { XX } },
7369 /* 60 */
7370 { "(bad)", { XX } },
7371 { "(bad)", { XX } },
7372 { "(bad)", { XX } },
7373 { "(bad)", { XX } },
7374 { "(bad)", { XX } },
7375 { "(bad)", { XX } },
7376 { "(bad)", { XX } },
7377 { "(bad)", { XX } },
7378 /* 68 */
7379 { "(bad)", { XX } },
7380 { "(bad)", { XX } },
7381 { "(bad)", { XX } },
7382 { "(bad)", { XX } },
7383 { "(bad)", { XX } },
7384 { "(bad)", { XX } },
7385 { "(bad)", { XX } },
7386 { "(bad)", { XX } },
7387 /* 70 */
7388 { "(bad)", { XX } },
7389 { "(bad)", { XX } },
7390 { "(bad)", { XX } },
7391 { "(bad)", { XX } },
7392 { "(bad)", { XX } },
7393 { "(bad)", { XX } },
7394 { "(bad)", { XX } },
7395 { "(bad)", { XX } },
7396 /* 78 */
7397 { "(bad)", { XX } },
7398 { "(bad)", { XX } },
7399 { "(bad)", { XX } },
7400 { "(bad)", { XX } },
7401 { "(bad)", { XX } },
7402 { "(bad)", { XX } },
7403 { "(bad)", { XX } },
7404 { "(bad)", { XX } },
7405 /* 80 */
7406 { "(bad)", { XX } },
7407 { "(bad)", { XX } },
7408 { "(bad)", { XX } },
7409 { "(bad)", { XX } },
7410 { "(bad)", { XX } },
7411 { "(bad)", { XX } },
7412 { "(bad)", { XX } },
7413 { "(bad)", { XX } },
7414 /* 88 */
7415 { "(bad)", { XX } },
7416 { "(bad)", { XX } },
7417 { "(bad)", { XX } },
7418 { "(bad)", { XX } },
7419 { "(bad)", { XX } },
7420 { "(bad)", { XX } },
7421 { "(bad)", { XX } },
7422 { "(bad)", { XX } },
7423 /* 90 */
7424 { "(bad)", { XX } },
7425 { "(bad)", { XX } },
7426 { "(bad)", { XX } },
7427 { "(bad)", { XX } },
7428 { "(bad)", { XX } },
7429 { "(bad)", { XX } },
7430 { PREFIX_TABLE (PREFIX_VEX_3896) },
7431 { PREFIX_TABLE (PREFIX_VEX_3897) },
7432 /* 98 */
7433 { PREFIX_TABLE (PREFIX_VEX_3898) },
7434 { PREFIX_TABLE (PREFIX_VEX_3899) },
7435 { PREFIX_TABLE (PREFIX_VEX_389A) },
7436 { PREFIX_TABLE (PREFIX_VEX_389B) },
7437 { PREFIX_TABLE (PREFIX_VEX_389C) },
7438 { PREFIX_TABLE (PREFIX_VEX_389D) },
7439 { PREFIX_TABLE (PREFIX_VEX_389E) },
7440 { PREFIX_TABLE (PREFIX_VEX_389F) },
7441 /* a0 */
7442 { "(bad)", { XX } },
7443 { "(bad)", { XX } },
7444 { "(bad)", { XX } },
7445 { "(bad)", { XX } },
7446 { "(bad)", { XX } },
7447 { "(bad)", { XX } },
7448 { PREFIX_TABLE (PREFIX_VEX_38A6) },
7449 { PREFIX_TABLE (PREFIX_VEX_38A7) },
7450 /* a8 */
7451 { PREFIX_TABLE (PREFIX_VEX_38A8) },
7452 { PREFIX_TABLE (PREFIX_VEX_38A9) },
7453 { PREFIX_TABLE (PREFIX_VEX_38AA) },
7454 { PREFIX_TABLE (PREFIX_VEX_38AB) },
7455 { PREFIX_TABLE (PREFIX_VEX_38AC) },
7456 { PREFIX_TABLE (PREFIX_VEX_38AD) },
7457 { PREFIX_TABLE (PREFIX_VEX_38AE) },
7458 { PREFIX_TABLE (PREFIX_VEX_38AF) },
7459 /* b0 */
7460 { "(bad)", { XX } },
7461 { "(bad)", { XX } },
7462 { "(bad)", { XX } },
7463 { "(bad)", { XX } },
7464 { "(bad)", { XX } },
7465 { "(bad)", { XX } },
7466 { PREFIX_TABLE (PREFIX_VEX_38B6) },
7467 { PREFIX_TABLE (PREFIX_VEX_38B7) },
7468 /* b8 */
7469 { PREFIX_TABLE (PREFIX_VEX_38B8) },
7470 { PREFIX_TABLE (PREFIX_VEX_38B9) },
7471 { PREFIX_TABLE (PREFIX_VEX_38BA) },
7472 { PREFIX_TABLE (PREFIX_VEX_38BB) },
7473 { PREFIX_TABLE (PREFIX_VEX_38BC) },
7474 { PREFIX_TABLE (PREFIX_VEX_38BD) },
7475 { PREFIX_TABLE (PREFIX_VEX_38BE) },
7476 { PREFIX_TABLE (PREFIX_VEX_38BF) },
7477 /* c0 */
7478 { "(bad)", { XX } },
7479 { "(bad)", { XX } },
7480 { "(bad)", { XX } },
7481 { "(bad)", { XX } },
7482 { "(bad)", { XX } },
7483 { "(bad)", { XX } },
7484 { "(bad)", { XX } },
7485 { "(bad)", { XX } },
7486 /* c8 */
7487 { "(bad)", { XX } },
7488 { "(bad)", { XX } },
7489 { "(bad)", { XX } },
7490 { "(bad)", { XX } },
7491 { "(bad)", { XX } },
7492 { "(bad)", { XX } },
7493 { "(bad)", { XX } },
7494 { "(bad)", { XX } },
7495 /* d0 */
7496 { "(bad)", { XX } },
7497 { "(bad)", { XX } },
7498 { "(bad)", { XX } },
7499 { "(bad)", { XX } },
7500 { "(bad)", { XX } },
7501 { "(bad)", { XX } },
7502 { "(bad)", { XX } },
7503 { "(bad)", { XX } },
7504 /* d8 */
7505 { "(bad)", { XX } },
7506 { "(bad)", { XX } },
7507 { "(bad)", { XX } },
7508 { PREFIX_TABLE (PREFIX_VEX_38DB) },
7509 { PREFIX_TABLE (PREFIX_VEX_38DC) },
7510 { PREFIX_TABLE (PREFIX_VEX_38DD) },
7511 { PREFIX_TABLE (PREFIX_VEX_38DE) },
7512 { PREFIX_TABLE (PREFIX_VEX_38DF) },
7513 /* e0 */
7514 { "(bad)", { XX } },
7515 { "(bad)", { XX } },
7516 { "(bad)", { XX } },
7517 { "(bad)", { XX } },
7518 { "(bad)", { XX } },
7519 { "(bad)", { XX } },
7520 { "(bad)", { XX } },
7521 { "(bad)", { XX } },
7522 /* e8 */
7523 { "(bad)", { XX } },
7524 { "(bad)", { XX } },
7525 { "(bad)", { XX } },
7526 { "(bad)", { XX } },
7527 { "(bad)", { XX } },
7528 { "(bad)", { XX } },
7529 { "(bad)", { XX } },
7530 { "(bad)", { XX } },
7531 /* f0 */
7532 { "(bad)", { XX } },
7533 { "(bad)", { XX } },
7534 { "(bad)", { XX } },
7535 { "(bad)", { XX } },
7536 { "(bad)", { XX } },
7537 { "(bad)", { XX } },
7538 { "(bad)", { XX } },
7539 { "(bad)", { XX } },
7540 /* f8 */
7541 { "(bad)", { XX } },
7542 { "(bad)", { XX } },
7543 { "(bad)", { XX } },
7544 { "(bad)", { XX } },
7545 { "(bad)", { XX } },
7546 { "(bad)", { XX } },
7547 { "(bad)", { XX } },
7548 { "(bad)", { XX } },
7549 },
7550 /* VEX_0F3A */
7551 {
7552 /* 00 */
7553 { "(bad)", { XX } },
7554 { "(bad)", { XX } },
7555 { "(bad)", { XX } },
7556 { "(bad)", { XX } },
7557 { PREFIX_TABLE (PREFIX_VEX_3A04) },
7558 { PREFIX_TABLE (PREFIX_VEX_3A05) },
7559 { PREFIX_TABLE (PREFIX_VEX_3A06) },
7560 { "(bad)", { XX } },
7561 /* 08 */
7562 { PREFIX_TABLE (PREFIX_VEX_3A08) },
7563 { PREFIX_TABLE (PREFIX_VEX_3A09) },
7564 { PREFIX_TABLE (PREFIX_VEX_3A0A) },
7565 { PREFIX_TABLE (PREFIX_VEX_3A0B) },
7566 { PREFIX_TABLE (PREFIX_VEX_3A0C) },
7567 { PREFIX_TABLE (PREFIX_VEX_3A0D) },
7568 { PREFIX_TABLE (PREFIX_VEX_3A0E) },
7569 { PREFIX_TABLE (PREFIX_VEX_3A0F) },
7570 /* 10 */
7571 { "(bad)", { XX } },
7572 { "(bad)", { XX } },
7573 { "(bad)", { XX } },
7574 { "(bad)", { XX } },
7575 { PREFIX_TABLE (PREFIX_VEX_3A14) },
7576 { PREFIX_TABLE (PREFIX_VEX_3A15) },
7577 { PREFIX_TABLE (PREFIX_VEX_3A16) },
7578 { PREFIX_TABLE (PREFIX_VEX_3A17) },
7579 /* 18 */
7580 { PREFIX_TABLE (PREFIX_VEX_3A18) },
7581 { PREFIX_TABLE (PREFIX_VEX_3A19) },
7582 { "(bad)", { XX } },
7583 { "(bad)", { XX } },
7584 { "(bad)", { XX } },
7585 { "(bad)", { XX } },
7586 { "(bad)", { XX } },
7587 { "(bad)", { XX } },
7588 /* 20 */
7589 { PREFIX_TABLE (PREFIX_VEX_3A20) },
7590 { PREFIX_TABLE (PREFIX_VEX_3A21) },
7591 { PREFIX_TABLE (PREFIX_VEX_3A22) },
7592 { "(bad)", { XX } },
7593 { "(bad)", { XX } },
7594 { "(bad)", { XX } },
7595 { "(bad)", { XX } },
7596 { "(bad)", { XX } },
7597 /* 28 */
7598 { "(bad)", { XX } },
7599 { "(bad)", { XX } },
7600 { "(bad)", { XX } },
7601 { "(bad)", { XX } },
7602 { "(bad)", { XX } },
7603 { "(bad)", { XX } },
7604 { "(bad)", { XX } },
7605 { "(bad)", { XX } },
7606 /* 30 */
7607 { "(bad)", { XX } },
7608 { "(bad)", { XX } },
7609 { "(bad)", { XX } },
7610 { "(bad)", { XX } },
7611 { "(bad)", { XX } },
7612 { "(bad)", { XX } },
7613 { "(bad)", { XX } },
7614 { "(bad)", { XX } },
7615 /* 38 */
7616 { "(bad)", { XX } },
7617 { "(bad)", { XX } },
7618 { "(bad)", { XX } },
7619 { "(bad)", { XX } },
7620 { "(bad)", { XX } },
7621 { "(bad)", { XX } },
7622 { "(bad)", { XX } },
7623 { "(bad)", { XX } },
7624 /* 40 */
7625 { PREFIX_TABLE (PREFIX_VEX_3A40) },
7626 { PREFIX_TABLE (PREFIX_VEX_3A41) },
7627 { PREFIX_TABLE (PREFIX_VEX_3A42) },
7628 { "(bad)", { XX } },
7629 { PREFIX_TABLE (PREFIX_VEX_3A44) },
7630 { "(bad)", { XX } },
7631 { "(bad)", { XX } },
7632 { "(bad)", { XX } },
7633 /* 48 */
7634 { "(bad)", { XX } },
7635 { "(bad)", { XX } },
7636 { PREFIX_TABLE (PREFIX_VEX_3A4A) },
7637 { PREFIX_TABLE (PREFIX_VEX_3A4B) },
7638 { PREFIX_TABLE (PREFIX_VEX_3A4C) },
7639 { "(bad)", { XX } },
7640 { "(bad)", { XX } },
7641 { "(bad)", { XX } },
7642 /* 50 */
7643 { "(bad)", { XX } },
7644 { "(bad)", { XX } },
7645 { "(bad)", { XX } },
7646 { "(bad)", { XX } },
7647 { "(bad)", { XX } },
7648 { "(bad)", { XX } },
7649 { "(bad)", { XX } },
7650 { "(bad)", { XX } },
7651 /* 58 */
7652 { "(bad)", { XX } },
7653 { "(bad)", { XX } },
7654 { "(bad)", { XX } },
7655 { "(bad)", { XX } },
7656 { PREFIX_TABLE (PREFIX_VEX_3A5C) },
7657 { PREFIX_TABLE (PREFIX_VEX_3A5D) },
7658 { PREFIX_TABLE (PREFIX_VEX_3A5E) },
7659 { PREFIX_TABLE (PREFIX_VEX_3A5F) },
7660 /* 60 */
7661 { PREFIX_TABLE (PREFIX_VEX_3A60) },
7662 { PREFIX_TABLE (PREFIX_VEX_3A61) },
7663 { PREFIX_TABLE (PREFIX_VEX_3A62) },
7664 { PREFIX_TABLE (PREFIX_VEX_3A63) },
7665 { "(bad)", { XX } },
7666 { "(bad)", { XX } },
7667 { "(bad)", { XX } },
7668 { "(bad)", { XX } },
7669 /* 68 */
7670 { PREFIX_TABLE (PREFIX_VEX_3A68) },
7671 { PREFIX_TABLE (PREFIX_VEX_3A69) },
7672 { PREFIX_TABLE (PREFIX_VEX_3A6A) },
7673 { PREFIX_TABLE (PREFIX_VEX_3A6B) },
7674 { PREFIX_TABLE (PREFIX_VEX_3A6C) },
7675 { PREFIX_TABLE (PREFIX_VEX_3A6D) },
7676 { PREFIX_TABLE (PREFIX_VEX_3A6E) },
7677 { PREFIX_TABLE (PREFIX_VEX_3A6F) },
7678 /* 70 */
7679 { "(bad)", { XX } },
7680 { "(bad)", { XX } },
7681 { "(bad)", { XX } },
7682 { "(bad)", { XX } },
7683 { "(bad)", { XX } },
7684 { "(bad)", { XX } },
7685 { "(bad)", { XX } },
7686 { "(bad)", { XX } },
7687 /* 78 */
7688 { PREFIX_TABLE (PREFIX_VEX_3A78) },
7689 { PREFIX_TABLE (PREFIX_VEX_3A79) },
7690 { PREFIX_TABLE (PREFIX_VEX_3A7A) },
7691 { PREFIX_TABLE (PREFIX_VEX_3A7B) },
7692 { PREFIX_TABLE (PREFIX_VEX_3A7C) },
7693 { PREFIX_TABLE (PREFIX_VEX_3A7D) },
7694 { PREFIX_TABLE (PREFIX_VEX_3A7E) },
7695 { PREFIX_TABLE (PREFIX_VEX_3A7F) },
7696 /* 80 */
7697 { "(bad)", { XX } },
7698 { "(bad)", { XX } },
7699 { "(bad)", { XX } },
7700 { "(bad)", { XX } },
7701 { "(bad)", { XX } },
7702 { "(bad)", { XX } },
7703 { "(bad)", { XX } },
7704 { "(bad)", { XX } },
7705 /* 88 */
7706 { "(bad)", { XX } },
7707 { "(bad)", { XX } },
7708 { "(bad)", { XX } },
7709 { "(bad)", { XX } },
7710 { "(bad)", { XX } },
7711 { "(bad)", { XX } },
7712 { "(bad)", { XX } },
7713 { "(bad)", { XX } },
7714 /* 90 */
7715 { "(bad)", { XX } },
7716 { "(bad)", { XX } },
7717 { "(bad)", { XX } },
7718 { "(bad)", { XX } },
7719 { "(bad)", { XX } },
7720 { "(bad)", { XX } },
7721 { "(bad)", { XX } },
7722 { "(bad)", { XX } },
7723 /* 98 */
7724 { "(bad)", { XX } },
7725 { "(bad)", { XX } },
7726 { "(bad)", { XX } },
7727 { "(bad)", { XX } },
7728 { "(bad)", { XX } },
7729 { "(bad)", { XX } },
7730 { "(bad)", { XX } },
7731 { "(bad)", { XX } },
7732 /* a0 */
7733 { "(bad)", { XX } },
7734 { "(bad)", { XX } },
7735 { "(bad)", { XX } },
7736 { "(bad)", { XX } },
7737 { "(bad)", { XX } },
7738 { "(bad)", { XX } },
7739 { "(bad)", { XX } },
7740 { "(bad)", { XX } },
7741 /* a8 */
7742 { "(bad)", { XX } },
7743 { "(bad)", { XX } },
7744 { "(bad)", { XX } },
7745 { "(bad)", { XX } },
7746 { "(bad)", { XX } },
7747 { "(bad)", { XX } },
7748 { "(bad)", { XX } },
7749 { "(bad)", { XX } },
7750 /* b0 */
7751 { "(bad)", { XX } },
7752 { "(bad)", { XX } },
7753 { "(bad)", { XX } },
7754 { "(bad)", { XX } },
7755 { "(bad)", { XX } },
7756 { "(bad)", { XX } },
7757 { "(bad)", { XX } },
7758 { "(bad)", { XX } },
7759 /* b8 */
7760 { "(bad)", { XX } },
7761 { "(bad)", { XX } },
7762 { "(bad)", { XX } },
7763 { "(bad)", { XX } },
7764 { "(bad)", { XX } },
7765 { "(bad)", { XX } },
7766 { "(bad)", { XX } },
7767 { "(bad)", { XX } },
7768 /* c0 */
7769 { "(bad)", { XX } },
7770 { "(bad)", { XX } },
7771 { "(bad)", { XX } },
7772 { "(bad)", { XX } },
7773 { "(bad)", { XX } },
7774 { "(bad)", { XX } },
7775 { "(bad)", { XX } },
7776 { "(bad)", { XX } },
7777 /* c8 */
7778 { "(bad)", { XX } },
7779 { "(bad)", { XX } },
7780 { "(bad)", { XX } },
7781 { "(bad)", { XX } },
7782 { "(bad)", { XX } },
7783 { "(bad)", { XX } },
7784 { "(bad)", { XX } },
7785 { "(bad)", { XX } },
7786 /* d0 */
7787 { "(bad)", { XX } },
7788 { "(bad)", { XX } },
7789 { "(bad)", { XX } },
7790 { "(bad)", { XX } },
7791 { "(bad)", { XX } },
7792 { "(bad)", { XX } },
7793 { "(bad)", { XX } },
7794 { "(bad)", { XX } },
7795 /* d8 */
7796 { "(bad)", { XX } },
7797 { "(bad)", { XX } },
7798 { "(bad)", { XX } },
7799 { "(bad)", { XX } },
7800 { "(bad)", { XX } },
7801 { "(bad)", { XX } },
7802 { "(bad)", { XX } },
7803 { PREFIX_TABLE (PREFIX_VEX_3ADF) },
7804 /* e0 */
7805 { "(bad)", { XX } },
7806 { "(bad)", { XX } },
7807 { "(bad)", { XX } },
7808 { "(bad)", { XX } },
7809 { "(bad)", { XX } },
7810 { "(bad)", { XX } },
7811 { "(bad)", { XX } },
7812 { "(bad)", { XX } },
7813 /* e8 */
7814 { "(bad)", { XX } },
7815 { "(bad)", { XX } },
7816 { "(bad)", { XX } },
7817 { "(bad)", { XX } },
7818 { "(bad)", { XX } },
7819 { "(bad)", { XX } },
7820 { "(bad)", { XX } },
7821 { "(bad)", { XX } },
7822 /* f0 */
7823 { "(bad)", { XX } },
7824 { "(bad)", { XX } },
7825 { "(bad)", { XX } },
7826 { "(bad)", { XX } },
7827 { "(bad)", { XX } },
7828 { "(bad)", { XX } },
7829 { "(bad)", { XX } },
7830 { "(bad)", { XX } },
7831 /* f8 */
7832 { "(bad)", { XX } },
7833 { "(bad)", { XX } },
7834 { "(bad)", { XX } },
7835 { "(bad)", { XX } },
7836 { "(bad)", { XX } },
7837 { "(bad)", { XX } },
7838 { "(bad)", { XX } },
7839 { "(bad)", { XX } },
7840 },
7841 };
7842
7843 static const struct dis386 vex_len_table[][2] = {
7844 /* VEX_LEN_10_P_1 */
7845 {
7846 { "vmovss", { XMVex, Vex128, EXd } },
7847 { "(bad)", { XX } },
7848 },
7849
7850 /* VEX_LEN_10_P_3 */
7851 {
7852 { "vmovsd", { XMVex, Vex128, EXq } },
7853 { "(bad)", { XX } },
7854 },
7855
7856 /* VEX_LEN_11_P_1 */
7857 {
7858 { "vmovss", { EXdVexS, Vex128, XM } },
7859 { "(bad)", { XX } },
7860 },
7861
7862 /* VEX_LEN_11_P_3 */
7863 {
7864 { "vmovsd", { EXqVexS, Vex128, XM } },
7865 { "(bad)", { XX } },
7866 },
7867
7868 /* VEX_LEN_12_P_0_M_0 */
7869 {
7870 { "vmovlps", { XM, Vex128, EXq } },
7871 { "(bad)", { XX } },
7872 },
7873
7874 /* VEX_LEN_12_P_0_M_1 */
7875 {
7876 { "vmovhlps", { XM, Vex128, EXq } },
7877 { "(bad)", { XX } },
7878 },
7879
7880 /* VEX_LEN_12_P_2 */
7881 {
7882 { "vmovlpd", { XM, Vex128, EXq } },
7883 { "(bad)", { XX } },
7884 },
7885
7886 /* VEX_LEN_13_M_0 */
7887 {
7888 { "vmovlpX", { EXq, XM } },
7889 { "(bad)", { XX } },
7890 },
7891
7892 /* VEX_LEN_16_P_0_M_0 */
7893 {
7894 { "vmovhps", { XM, Vex128, EXq } },
7895 { "(bad)", { XX } },
7896 },
7897
7898 /* VEX_LEN_16_P_0_M_1 */
7899 {
7900 { "vmovlhps", { XM, Vex128, EXq } },
7901 { "(bad)", { XX } },
7902 },
7903
7904 /* VEX_LEN_16_P_2 */
7905 {
7906 { "vmovhpd", { XM, Vex128, EXq } },
7907 { "(bad)", { XX } },
7908 },
7909
7910 /* VEX_LEN_17_M_0 */
7911 {
7912 { "vmovhpX", { EXq, XM } },
7913 { "(bad)", { XX } },
7914 },
7915
7916 /* VEX_LEN_2A_P_1 */
7917 {
7918 { "vcvtsi2ss%LQ", { XM, Vex128, Ev } },
7919 { "(bad)", { XX } },
7920 },
7921
7922 /* VEX_LEN_2A_P_3 */
7923 {
7924 { "vcvtsi2sd%LQ", { XM, Vex128, Ev } },
7925 { "(bad)", { XX } },
7926 },
7927
7928 /* VEX_LEN_2C_P_1 */
7929 {
7930 { "vcvttss2siY", { Gv, EXd } },
7931 { "(bad)", { XX } },
7932 },
7933
7934 /* VEX_LEN_2C_P_3 */
7935 {
7936 { "vcvttsd2siY", { Gv, EXq } },
7937 { "(bad)", { XX } },
7938 },
7939
7940 /* VEX_LEN_2D_P_1 */
7941 {
7942 { "vcvtss2siY", { Gv, EXd } },
7943 { "(bad)", { XX } },
7944 },
7945
7946 /* VEX_LEN_2D_P_3 */
7947 {
7948 { "vcvtsd2siY", { Gv, EXq } },
7949 { "(bad)", { XX } },
7950 },
7951
7952 /* VEX_LEN_2E_P_0 */
7953 {
7954 { "vucomiss", { XM, EXd } },
7955 { "(bad)", { XX } },
7956 },
7957
7958 /* VEX_LEN_2E_P_2 */
7959 {
7960 { "vucomisd", { XM, EXq } },
7961 { "(bad)", { XX } },
7962 },
7963
7964 /* VEX_LEN_2F_P_0 */
7965 {
7966 { "vcomiss", { XM, EXd } },
7967 { "(bad)", { XX } },
7968 },
7969
7970 /* VEX_LEN_2F_P_2 */
7971 {
7972 { "vcomisd", { XM, EXq } },
7973 { "(bad)", { XX } },
7974 },
7975
7976 /* VEX_LEN_51_P_1 */
7977 {
7978 { "vsqrtss", { XM, Vex128, EXd } },
7979 { "(bad)", { XX } },
7980 },
7981
7982 /* VEX_LEN_51_P_3 */
7983 {
7984 { "vsqrtsd", { XM, Vex128, EXq } },
7985 { "(bad)", { XX } },
7986 },
7987
7988 /* VEX_LEN_52_P_1 */
7989 {
7990 { "vrsqrtss", { XM, Vex128, EXd } },
7991 { "(bad)", { XX } },
7992 },
7993
7994 /* VEX_LEN_53_P_1 */
7995 {
7996 { "vrcpss", { XM, Vex128, EXd } },
7997 { "(bad)", { XX } },
7998 },
7999
8000 /* VEX_LEN_58_P_1 */
8001 {
8002 { "vaddss", { XM, Vex128, EXd } },
8003 { "(bad)", { XX } },
8004 },
8005
8006 /* VEX_LEN_58_P_3 */
8007 {
8008 { "vaddsd", { XM, Vex128, EXq } },
8009 { "(bad)", { XX } },
8010 },
8011
8012 /* VEX_LEN_59_P_1 */
8013 {
8014 { "vmulss", { XM, Vex128, EXd } },
8015 { "(bad)", { XX } },
8016 },
8017
8018 /* VEX_LEN_59_P_3 */
8019 {
8020 { "vmulsd", { XM, Vex128, EXq } },
8021 { "(bad)", { XX } },
8022 },
8023
8024 /* VEX_LEN_5A_P_1 */
8025 {
8026 { "vcvtss2sd", { XM, Vex128, EXd } },
8027 { "(bad)", { XX } },
8028 },
8029
8030 /* VEX_LEN_5A_P_3 */
8031 {
8032 { "vcvtsd2ss", { XM, Vex128, EXq } },
8033 { "(bad)", { XX } },
8034 },
8035
8036 /* VEX_LEN_5C_P_1 */
8037 {
8038 { "vsubss", { XM, Vex128, EXd } },
8039 { "(bad)", { XX } },
8040 },
8041
8042 /* VEX_LEN_5C_P_3 */
8043 {
8044 { "vsubsd", { XM, Vex128, EXq } },
8045 { "(bad)", { XX } },
8046 },
8047
8048 /* VEX_LEN_5D_P_1 */
8049 {
8050 { "vminss", { XM, Vex128, EXd } },
8051 { "(bad)", { XX } },
8052 },
8053
8054 /* VEX_LEN_5D_P_3 */
8055 {
8056 { "vminsd", { XM, Vex128, EXq } },
8057 { "(bad)", { XX } },
8058 },
8059
8060 /* VEX_LEN_5E_P_1 */
8061 {
8062 { "vdivss", { XM, Vex128, EXd } },
8063 { "(bad)", { XX } },
8064 },
8065
8066 /* VEX_LEN_5E_P_3 */
8067 {
8068 { "vdivsd", { XM, Vex128, EXq } },
8069 { "(bad)", { XX } },
8070 },
8071
8072 /* VEX_LEN_5F_P_1 */
8073 {
8074 { "vmaxss", { XM, Vex128, EXd } },
8075 { "(bad)", { XX } },
8076 },
8077
8078 /* VEX_LEN_5F_P_3 */
8079 {
8080 { "vmaxsd", { XM, Vex128, EXq } },
8081 { "(bad)", { XX } },
8082 },
8083
8084 /* VEX_LEN_60_P_2 */
8085 {
8086 { "vpunpcklbw", { XM, Vex128, EXx } },
8087 { "(bad)", { XX } },
8088 },
8089
8090 /* VEX_LEN_61_P_2 */
8091 {
8092 { "vpunpcklwd", { XM, Vex128, EXx } },
8093 { "(bad)", { XX } },
8094 },
8095
8096 /* VEX_LEN_62_P_2 */
8097 {
8098 { "vpunpckldq", { XM, Vex128, EXx } },
8099 { "(bad)", { XX } },
8100 },
8101
8102 /* VEX_LEN_63_P_2 */
8103 {
8104 { "vpacksswb", { XM, Vex128, EXx } },
8105 { "(bad)", { XX } },
8106 },
8107
8108 /* VEX_LEN_64_P_2 */
8109 {
8110 { "vpcmpgtb", { XM, Vex128, EXx } },
8111 { "(bad)", { XX } },
8112 },
8113
8114 /* VEX_LEN_65_P_2 */
8115 {
8116 { "vpcmpgtw", { XM, Vex128, EXx } },
8117 { "(bad)", { XX } },
8118 },
8119
8120 /* VEX_LEN_66_P_2 */
8121 {
8122 { "vpcmpgtd", { XM, Vex128, EXx } },
8123 { "(bad)", { XX } },
8124 },
8125
8126 /* VEX_LEN_67_P_2 */
8127 {
8128 { "vpackuswb", { XM, Vex128, EXx } },
8129 { "(bad)", { XX } },
8130 },
8131
8132 /* VEX_LEN_68_P_2 */
8133 {
8134 { "vpunpckhbw", { XM, Vex128, EXx } },
8135 { "(bad)", { XX } },
8136 },
8137
8138 /* VEX_LEN_69_P_2 */
8139 {
8140 { "vpunpckhwd", { XM, Vex128, EXx } },
8141 { "(bad)", { XX } },
8142 },
8143
8144 /* VEX_LEN_6A_P_2 */
8145 {
8146 { "vpunpckhdq", { XM, Vex128, EXx } },
8147 { "(bad)", { XX } },
8148 },
8149
8150 /* VEX_LEN_6B_P_2 */
8151 {
8152 { "vpackssdw", { XM, Vex128, EXx } },
8153 { "(bad)", { XX } },
8154 },
8155
8156 /* VEX_LEN_6C_P_2 */
8157 {
8158 { "vpunpcklqdq", { XM, Vex128, EXx } },
8159 { "(bad)", { XX } },
8160 },
8161
8162 /* VEX_LEN_6D_P_2 */
8163 {
8164 { "vpunpckhqdq", { XM, Vex128, EXx } },
8165 { "(bad)", { XX } },
8166 },
8167
8168 /* VEX_LEN_6E_P_2 */
8169 {
8170 { "vmovK", { XM, Edq } },
8171 { "(bad)", { XX } },
8172 },
8173
8174 /* VEX_LEN_70_P_1 */
8175 {
8176 { "vpshufhw", { XM, EXx, Ib } },
8177 { "(bad)", { XX } },
8178 },
8179
8180 /* VEX_LEN_70_P_2 */
8181 {
8182 { "vpshufd", { XM, EXx, Ib } },
8183 { "(bad)", { XX } },
8184 },
8185
8186 /* VEX_LEN_70_P_3 */
8187 {
8188 { "vpshuflw", { XM, EXx, Ib } },
8189 { "(bad)", { XX } },
8190 },
8191
8192 /* VEX_LEN_71_R_2_P_2 */
8193 {
8194 { "vpsrlw", { Vex128, XS, Ib } },
8195 { "(bad)", { XX } },
8196 },
8197
8198 /* VEX_LEN_71_R_4_P_2 */
8199 {
8200 { "vpsraw", { Vex128, XS, Ib } },
8201 { "(bad)", { XX } },
8202 },
8203
8204 /* VEX_LEN_71_R_6_P_2 */
8205 {
8206 { "vpsllw", { Vex128, XS, Ib } },
8207 { "(bad)", { XX } },
8208 },
8209
8210 /* VEX_LEN_72_R_2_P_2 */
8211 {
8212 { "vpsrld", { Vex128, XS, Ib } },
8213 { "(bad)", { XX } },
8214 },
8215
8216 /* VEX_LEN_72_R_4_P_2 */
8217 {
8218 { "vpsrad", { Vex128, XS, Ib } },
8219 { "(bad)", { XX } },
8220 },
8221
8222 /* VEX_LEN_72_R_6_P_2 */
8223 {
8224 { "vpslld", { Vex128, XS, Ib } },
8225 { "(bad)", { XX } },
8226 },
8227
8228 /* VEX_LEN_73_R_2_P_2 */
8229 {
8230 { "vpsrlq", { Vex128, XS, Ib } },
8231 { "(bad)", { XX } },
8232 },
8233
8234 /* VEX_LEN_73_R_3_P_2 */
8235 {
8236 { "vpsrldq", { Vex128, XS, Ib } },
8237 { "(bad)", { XX } },
8238 },
8239
8240 /* VEX_LEN_73_R_6_P_2 */
8241 {
8242 { "vpsllq", { Vex128, XS, Ib } },
8243 { "(bad)", { XX } },
8244 },
8245
8246 /* VEX_LEN_73_R_7_P_2 */
8247 {
8248 { "vpslldq", { Vex128, XS, Ib } },
8249 { "(bad)", { XX } },
8250 },
8251
8252 /* VEX_LEN_74_P_2 */
8253 {
8254 { "vpcmpeqb", { XM, Vex128, EXx } },
8255 { "(bad)", { XX } },
8256 },
8257
8258 /* VEX_LEN_75_P_2 */
8259 {
8260 { "vpcmpeqw", { XM, Vex128, EXx } },
8261 { "(bad)", { XX } },
8262 },
8263
8264 /* VEX_LEN_76_P_2 */
8265 {
8266 { "vpcmpeqd", { XM, Vex128, EXx } },
8267 { "(bad)", { XX } },
8268 },
8269
8270 /* VEX_LEN_7E_P_1 */
8271 {
8272 { "vmovq", { XM, EXq } },
8273 { "(bad)", { XX } },
8274 },
8275
8276 /* VEX_LEN_7E_P_2 */
8277 {
8278 { "vmovK", { Edq, XM } },
8279 { "(bad)", { XX } },
8280 },
8281
8282 /* VEX_LEN_AE_R_2_M_0 */
8283 {
8284 { "vldmxcsr", { Md } },
8285 { "(bad)", { XX } },
8286 },
8287
8288 /* VEX_LEN_AE_R_3_M_0 */
8289 {
8290 { "vstmxcsr", { Md } },
8291 { "(bad)", { XX } },
8292 },
8293
8294 /* VEX_LEN_C2_P_1 */
8295 {
8296 { "vcmpss", { XM, Vex128, EXd, VCMP } },
8297 { "(bad)", { XX } },
8298 },
8299
8300 /* VEX_LEN_C2_P_3 */
8301 {
8302 { "vcmpsd", { XM, Vex128, EXq, VCMP } },
8303 { "(bad)", { XX } },
8304 },
8305
8306 /* VEX_LEN_C4_P_2 */
8307 {
8308 { "vpinsrw", { XM, Vex128, Edqw, Ib } },
8309 { "(bad)", { XX } },
8310 },
8311
8312 /* VEX_LEN_C5_P_2 */
8313 {
8314 { "vpextrw", { Gdq, XS, Ib } },
8315 { "(bad)", { XX } },
8316 },
8317
8318 /* VEX_LEN_D1_P_2 */
8319 {
8320 { "vpsrlw", { XM, Vex128, EXx } },
8321 { "(bad)", { XX } },
8322 },
8323
8324 /* VEX_LEN_D2_P_2 */
8325 {
8326 { "vpsrld", { XM, Vex128, EXx } },
8327 { "(bad)", { XX } },
8328 },
8329
8330 /* VEX_LEN_D3_P_2 */
8331 {
8332 { "vpsrlq", { XM, Vex128, EXx } },
8333 { "(bad)", { XX } },
8334 },
8335
8336 /* VEX_LEN_D4_P_2 */
8337 {
8338 { "vpaddq", { XM, Vex128, EXx } },
8339 { "(bad)", { XX } },
8340 },
8341
8342 /* VEX_LEN_D5_P_2 */
8343 {
8344 { "vpmullw", { XM, Vex128, EXx } },
8345 { "(bad)", { XX } },
8346 },
8347
8348 /* VEX_LEN_D6_P_2 */
8349 {
8350 { "vmovq", { EXqS, XM } },
8351 { "(bad)", { XX } },
8352 },
8353
8354 /* VEX_LEN_D7_P_2_M_1 */
8355 {
8356 { "vpmovmskb", { Gdq, XS } },
8357 { "(bad)", { XX } },
8358 },
8359
8360 /* VEX_LEN_D8_P_2 */
8361 {
8362 { "vpsubusb", { XM, Vex128, EXx } },
8363 { "(bad)", { XX } },
8364 },
8365
8366 /* VEX_LEN_D9_P_2 */
8367 {
8368 { "vpsubusw", { XM, Vex128, EXx } },
8369 { "(bad)", { XX } },
8370 },
8371
8372 /* VEX_LEN_DA_P_2 */
8373 {
8374 { "vpminub", { XM, Vex128, EXx } },
8375 { "(bad)", { XX } },
8376 },
8377
8378 /* VEX_LEN_DB_P_2 */
8379 {
8380 { "vpand", { XM, Vex128, EXx } },
8381 { "(bad)", { XX } },
8382 },
8383
8384 /* VEX_LEN_DC_P_2 */
8385 {
8386 { "vpaddusb", { XM, Vex128, EXx } },
8387 { "(bad)", { XX } },
8388 },
8389
8390 /* VEX_LEN_DD_P_2 */
8391 {
8392 { "vpaddusw", { XM, Vex128, EXx } },
8393 { "(bad)", { XX } },
8394 },
8395
8396 /* VEX_LEN_DE_P_2 */
8397 {
8398 { "vpmaxub", { XM, Vex128, EXx } },
8399 { "(bad)", { XX } },
8400 },
8401
8402 /* VEX_LEN_DF_P_2 */
8403 {
8404 { "vpandn", { XM, Vex128, EXx } },
8405 { "(bad)", { XX } },
8406 },
8407
8408 /* VEX_LEN_E0_P_2 */
8409 {
8410 { "vpavgb", { XM, Vex128, EXx } },
8411 { "(bad)", { XX } },
8412 },
8413
8414 /* VEX_LEN_E1_P_2 */
8415 {
8416 { "vpsraw", { XM, Vex128, EXx } },
8417 { "(bad)", { XX } },
8418 },
8419
8420 /* VEX_LEN_E2_P_2 */
8421 {
8422 { "vpsrad", { XM, Vex128, EXx } },
8423 { "(bad)", { XX } },
8424 },
8425
8426 /* VEX_LEN_E3_P_2 */
8427 {
8428 { "vpavgw", { XM, Vex128, EXx } },
8429 { "(bad)", { XX } },
8430 },
8431
8432 /* VEX_LEN_E4_P_2 */
8433 {
8434 { "vpmulhuw", { XM, Vex128, EXx } },
8435 { "(bad)", { XX } },
8436 },
8437
8438 /* VEX_LEN_E5_P_2 */
8439 {
8440 { "vpmulhw", { XM, Vex128, EXx } },
8441 { "(bad)", { XX } },
8442 },
8443
8444 /* VEX_LEN_E8_P_2 */
8445 {
8446 { "vpsubsb", { XM, Vex128, EXx } },
8447 { "(bad)", { XX } },
8448 },
8449
8450 /* VEX_LEN_E9_P_2 */
8451 {
8452 { "vpsubsw", { XM, Vex128, EXx } },
8453 { "(bad)", { XX } },
8454 },
8455
8456 /* VEX_LEN_EA_P_2 */
8457 {
8458 { "vpminsw", { XM, Vex128, EXx } },
8459 { "(bad)", { XX } },
8460 },
8461
8462 /* VEX_LEN_EB_P_2 */
8463 {
8464 { "vpor", { XM, Vex128, EXx } },
8465 { "(bad)", { XX } },
8466 },
8467
8468 /* VEX_LEN_EC_P_2 */
8469 {
8470 { "vpaddsb", { XM, Vex128, EXx } },
8471 { "(bad)", { XX } },
8472 },
8473
8474 /* VEX_LEN_ED_P_2 */
8475 {
8476 { "vpaddsw", { XM, Vex128, EXx } },
8477 { "(bad)", { XX } },
8478 },
8479
8480 /* VEX_LEN_EE_P_2 */
8481 {
8482 { "vpmaxsw", { XM, Vex128, EXx } },
8483 { "(bad)", { XX } },
8484 },
8485
8486 /* VEX_LEN_EF_P_2 */
8487 {
8488 { "vpxor", { XM, Vex128, EXx } },
8489 { "(bad)", { XX } },
8490 },
8491
8492 /* VEX_LEN_F1_P_2 */
8493 {
8494 { "vpsllw", { XM, Vex128, EXx } },
8495 { "(bad)", { XX } },
8496 },
8497
8498 /* VEX_LEN_F2_P_2 */
8499 {
8500 { "vpslld", { XM, Vex128, EXx } },
8501 { "(bad)", { XX } },
8502 },
8503
8504 /* VEX_LEN_F3_P_2 */
8505 {
8506 { "vpsllq", { XM, Vex128, EXx } },
8507 { "(bad)", { XX } },
8508 },
8509
8510 /* VEX_LEN_F4_P_2 */
8511 {
8512 { "vpmuludq", { XM, Vex128, EXx } },
8513 { "(bad)", { XX } },
8514 },
8515
8516 /* VEX_LEN_F5_P_2 */
8517 {
8518 { "vpmaddwd", { XM, Vex128, EXx } },
8519 { "(bad)", { XX } },
8520 },
8521
8522 /* VEX_LEN_F6_P_2 */
8523 {
8524 { "vpsadbw", { XM, Vex128, EXx } },
8525 { "(bad)", { XX } },
8526 },
8527
8528 /* VEX_LEN_F7_P_2 */
8529 {
8530 { "vmaskmovdqu", { XM, XS } },
8531 { "(bad)", { XX } },
8532 },
8533
8534 /* VEX_LEN_F8_P_2 */
8535 {
8536 { "vpsubb", { XM, Vex128, EXx } },
8537 { "(bad)", { XX } },
8538 },
8539
8540 /* VEX_LEN_F9_P_2 */
8541 {
8542 { "vpsubw", { XM, Vex128, EXx } },
8543 { "(bad)", { XX } },
8544 },
8545
8546 /* VEX_LEN_FA_P_2 */
8547 {
8548 { "vpsubd", { XM, Vex128, EXx } },
8549 { "(bad)", { XX } },
8550 },
8551
8552 /* VEX_LEN_FB_P_2 */
8553 {
8554 { "vpsubq", { XM, Vex128, EXx } },
8555 { "(bad)", { XX } },
8556 },
8557
8558 /* VEX_LEN_FC_P_2 */
8559 {
8560 { "vpaddb", { XM, Vex128, EXx } },
8561 { "(bad)", { XX } },
8562 },
8563
8564 /* VEX_LEN_FD_P_2 */
8565 {
8566 { "vpaddw", { XM, Vex128, EXx } },
8567 { "(bad)", { XX } },
8568 },
8569
8570 /* VEX_LEN_FE_P_2 */
8571 {
8572 { "vpaddd", { XM, Vex128, EXx } },
8573 { "(bad)", { XX } },
8574 },
8575
8576 /* VEX_LEN_3800_P_2 */
8577 {
8578 { "vpshufb", { XM, Vex128, EXx } },
8579 { "(bad)", { XX } },
8580 },
8581
8582 /* VEX_LEN_3801_P_2 */
8583 {
8584 { "vphaddw", { XM, Vex128, EXx } },
8585 { "(bad)", { XX } },
8586 },
8587
8588 /* VEX_LEN_3802_P_2 */
8589 {
8590 { "vphaddd", { XM, Vex128, EXx } },
8591 { "(bad)", { XX } },
8592 },
8593
8594 /* VEX_LEN_3803_P_2 */
8595 {
8596 { "vphaddsw", { XM, Vex128, EXx } },
8597 { "(bad)", { XX } },
8598 },
8599
8600 /* VEX_LEN_3804_P_2 */
8601 {
8602 { "vpmaddubsw", { XM, Vex128, EXx } },
8603 { "(bad)", { XX } },
8604 },
8605
8606 /* VEX_LEN_3805_P_2 */
8607 {
8608 { "vphsubw", { XM, Vex128, EXx } },
8609 { "(bad)", { XX } },
8610 },
8611
8612 /* VEX_LEN_3806_P_2 */
8613 {
8614 { "vphsubd", { XM, Vex128, EXx } },
8615 { "(bad)", { XX } },
8616 },
8617
8618 /* VEX_LEN_3807_P_2 */
8619 {
8620 { "vphsubsw", { XM, Vex128, EXx } },
8621 { "(bad)", { XX } },
8622 },
8623
8624 /* VEX_LEN_3808_P_2 */
8625 {
8626 { "vpsignb", { XM, Vex128, EXx } },
8627 { "(bad)", { XX } },
8628 },
8629
8630 /* VEX_LEN_3809_P_2 */
8631 {
8632 { "vpsignw", { XM, Vex128, EXx } },
8633 { "(bad)", { XX } },
8634 },
8635
8636 /* VEX_LEN_380A_P_2 */
8637 {
8638 { "vpsignd", { XM, Vex128, EXx } },
8639 { "(bad)", { XX } },
8640 },
8641
8642 /* VEX_LEN_380B_P_2 */
8643 {
8644 { "vpmulhrsw", { XM, Vex128, EXx } },
8645 { "(bad)", { XX } },
8646 },
8647
8648 /* VEX_LEN_3819_P_2_M_0 */
8649 {
8650 { "(bad)", { XX } },
8651 { "vbroadcastsd", { XM, Mq } },
8652 },
8653
8654 /* VEX_LEN_381A_P_2_M_0 */
8655 {
8656 { "(bad)", { XX } },
8657 { "vbroadcastf128", { XM, Mxmm } },
8658 },
8659
8660 /* VEX_LEN_381C_P_2 */
8661 {
8662 { "vpabsb", { XM, EXx } },
8663 { "(bad)", { XX } },
8664 },
8665
8666 /* VEX_LEN_381D_P_2 */
8667 {
8668 { "vpabsw", { XM, EXx } },
8669 { "(bad)", { XX } },
8670 },
8671
8672 /* VEX_LEN_381E_P_2 */
8673 {
8674 { "vpabsd", { XM, EXx } },
8675 { "(bad)", { XX } },
8676 },
8677
8678 /* VEX_LEN_3820_P_2 */
8679 {
8680 { "vpmovsxbw", { XM, EXq } },
8681 { "(bad)", { XX } },
8682 },
8683
8684 /* VEX_LEN_3821_P_2 */
8685 {
8686 { "vpmovsxbd", { XM, EXd } },
8687 { "(bad)", { XX } },
8688 },
8689
8690 /* VEX_LEN_3822_P_2 */
8691 {
8692 { "vpmovsxbq", { XM, EXw } },
8693 { "(bad)", { XX } },
8694 },
8695
8696 /* VEX_LEN_3823_P_2 */
8697 {
8698 { "vpmovsxwd", { XM, EXq } },
8699 { "(bad)", { XX } },
8700 },
8701
8702 /* VEX_LEN_3824_P_2 */
8703 {
8704 { "vpmovsxwq", { XM, EXd } },
8705 { "(bad)", { XX } },
8706 },
8707
8708 /* VEX_LEN_3825_P_2 */
8709 {
8710 { "vpmovsxdq", { XM, EXq } },
8711 { "(bad)", { XX } },
8712 },
8713
8714 /* VEX_LEN_3828_P_2 */
8715 {
8716 { "vpmuldq", { XM, Vex128, EXx } },
8717 { "(bad)", { XX } },
8718 },
8719
8720 /* VEX_LEN_3829_P_2 */
8721 {
8722 { "vpcmpeqq", { XM, Vex128, EXx } },
8723 { "(bad)", { XX } },
8724 },
8725
8726 /* VEX_LEN_382A_P_2_M_0 */
8727 {
8728 { "vmovntdqa", { XM, Mx } },
8729 { "(bad)", { XX } },
8730 },
8731
8732 /* VEX_LEN_382B_P_2 */
8733 {
8734 { "vpackusdw", { XM, Vex128, EXx } },
8735 { "(bad)", { XX } },
8736 },
8737
8738 /* VEX_LEN_3830_P_2 */
8739 {
8740 { "vpmovzxbw", { XM, EXq } },
8741 { "(bad)", { XX } },
8742 },
8743
8744 /* VEX_LEN_3831_P_2 */
8745 {
8746 { "vpmovzxbd", { XM, EXd } },
8747 { "(bad)", { XX } },
8748 },
8749
8750 /* VEX_LEN_3832_P_2 */
8751 {
8752 { "vpmovzxbq", { XM, EXw } },
8753 { "(bad)", { XX } },
8754 },
8755
8756 /* VEX_LEN_3833_P_2 */
8757 {
8758 { "vpmovzxwd", { XM, EXq } },
8759 { "(bad)", { XX } },
8760 },
8761
8762 /* VEX_LEN_3834_P_2 */
8763 {
8764 { "vpmovzxwq", { XM, EXd } },
8765 { "(bad)", { XX } },
8766 },
8767
8768 /* VEX_LEN_3835_P_2 */
8769 {
8770 { "vpmovzxdq", { XM, EXq } },
8771 { "(bad)", { XX } },
8772 },
8773
8774 /* VEX_LEN_3837_P_2 */
8775 {
8776 { "vpcmpgtq", { XM, Vex128, EXx } },
8777 { "(bad)", { XX } },
8778 },
8779
8780 /* VEX_LEN_3838_P_2 */
8781 {
8782 { "vpminsb", { XM, Vex128, EXx } },
8783 { "(bad)", { XX } },
8784 },
8785
8786 /* VEX_LEN_3839_P_2 */
8787 {
8788 { "vpminsd", { XM, Vex128, EXx } },
8789 { "(bad)", { XX } },
8790 },
8791
8792 /* VEX_LEN_383A_P_2 */
8793 {
8794 { "vpminuw", { XM, Vex128, EXx } },
8795 { "(bad)", { XX } },
8796 },
8797
8798 /* VEX_LEN_383B_P_2 */
8799 {
8800 { "vpminud", { XM, Vex128, EXx } },
8801 { "(bad)", { XX } },
8802 },
8803
8804 /* VEX_LEN_383C_P_2 */
8805 {
8806 { "vpmaxsb", { XM, Vex128, EXx } },
8807 { "(bad)", { XX } },
8808 },
8809
8810 /* VEX_LEN_383D_P_2 */
8811 {
8812 { "vpmaxsd", { XM, Vex128, EXx } },
8813 { "(bad)", { XX } },
8814 },
8815
8816 /* VEX_LEN_383E_P_2 */
8817 {
8818 { "vpmaxuw", { XM, Vex128, EXx } },
8819 { "(bad)", { XX } },
8820 },
8821
8822 /* VEX_LEN_383F_P_2 */
8823 {
8824 { "vpmaxud", { XM, Vex128, EXx } },
8825 { "(bad)", { XX } },
8826 },
8827
8828 /* VEX_LEN_3840_P_2 */
8829 {
8830 { "vpmulld", { XM, Vex128, EXx } },
8831 { "(bad)", { XX } },
8832 },
8833
8834 /* VEX_LEN_3841_P_2 */
8835 {
8836 { "vphminposuw", { XM, EXx } },
8837 { "(bad)", { XX } },
8838 },
8839
8840 /* VEX_LEN_38DB_P_2 */
8841 {
8842 { "vaesimc", { XM, EXx } },
8843 { "(bad)", { XX } },
8844 },
8845
8846 /* VEX_LEN_38DC_P_2 */
8847 {
8848 { "vaesenc", { XM, Vex128, EXx } },
8849 { "(bad)", { XX } },
8850 },
8851
8852 /* VEX_LEN_38DD_P_2 */
8853 {
8854 { "vaesenclast", { XM, Vex128, EXx } },
8855 { "(bad)", { XX } },
8856 },
8857
8858 /* VEX_LEN_38DE_P_2 */
8859 {
8860 { "vaesdec", { XM, Vex128, EXx } },
8861 { "(bad)", { XX } },
8862 },
8863
8864 /* VEX_LEN_38DF_P_2 */
8865 {
8866 { "vaesdeclast", { XM, Vex128, EXx } },
8867 { "(bad)", { XX } },
8868 },
8869
8870 /* VEX_LEN_3A06_P_2 */
8871 {
8872 { "(bad)", { XX } },
8873 { "vperm2f128", { XM, Vex256, EXx, Ib } },
8874 },
8875
8876 /* VEX_LEN_3A0A_P_2 */
8877 {
8878 { "vroundss", { XM, Vex128, EXd, Ib } },
8879 { "(bad)", { XX } },
8880 },
8881
8882 /* VEX_LEN_3A0B_P_2 */
8883 {
8884 { "vroundsd", { XM, Vex128, EXq, Ib } },
8885 { "(bad)", { XX } },
8886 },
8887
8888 /* VEX_LEN_3A0E_P_2 */
8889 {
8890 { "vpblendw", { XM, Vex128, EXx, Ib } },
8891 { "(bad)", { XX } },
8892 },
8893
8894 /* VEX_LEN_3A0F_P_2 */
8895 {
8896 { "vpalignr", { XM, Vex128, EXx, Ib } },
8897 { "(bad)", { XX } },
8898 },
8899
8900 /* VEX_LEN_3A14_P_2 */
8901 {
8902 { "vpextrb", { Edqb, XM, Ib } },
8903 { "(bad)", { XX } },
8904 },
8905
8906 /* VEX_LEN_3A15_P_2 */
8907 {
8908 { "vpextrw", { Edqw, XM, Ib } },
8909 { "(bad)", { XX } },
8910 },
8911
8912 /* VEX_LEN_3A16_P_2 */
8913 {
8914 { "vpextrK", { Edq, XM, Ib } },
8915 { "(bad)", { XX } },
8916 },
8917
8918 /* VEX_LEN_3A17_P_2 */
8919 {
8920 { "vextractps", { Edqd, XM, Ib } },
8921 { "(bad)", { XX } },
8922 },
8923
8924 /* VEX_LEN_3A18_P_2 */
8925 {
8926 { "(bad)", { XX } },
8927 { "vinsertf128", { XM, Vex256, EXxmm, Ib } },
8928 },
8929
8930 /* VEX_LEN_3A19_P_2 */
8931 {
8932 { "(bad)", { XX } },
8933 { "vextractf128", { EXxmm, XM, Ib } },
8934 },
8935
8936 /* VEX_LEN_3A20_P_2 */
8937 {
8938 { "vpinsrb", { XM, Vex128, Edqb, Ib } },
8939 { "(bad)", { XX } },
8940 },
8941
8942 /* VEX_LEN_3A21_P_2 */
8943 {
8944 { "vinsertps", { XM, Vex128, EXd, Ib } },
8945 { "(bad)", { XX } },
8946 },
8947
8948 /* VEX_LEN_3A22_P_2 */
8949 {
8950 { "vpinsrK", { XM, Vex128, Edq, Ib } },
8951 { "(bad)", { XX } },
8952 },
8953
8954 /* VEX_LEN_3A41_P_2 */
8955 {
8956 { "vdppd", { XM, Vex128, EXx, Ib } },
8957 { "(bad)", { XX } },
8958 },
8959
8960 /* VEX_LEN_3A42_P_2 */
8961 {
8962 { "vmpsadbw", { XM, Vex128, EXx, Ib } },
8963 { "(bad)", { XX } },
8964 },
8965
8966 /* VEX_LEN_3A44_P_2 */
8967 {
8968 { "vpclmulqdq", { XM, Vex128, EXx, PCLMUL } },
8969 { "(bad)", { XX } },
8970 },
8971
8972 /* VEX_LEN_3A4C_P_2 */
8973 {
8974 { "vpblendvb", { XM, Vex128, EXx, XMVexI4 } },
8975 { "(bad)", { XX } },
8976 },
8977
8978 /* VEX_LEN_3A60_P_2 */
8979 {
8980 { "vpcmpestrm", { XM, EXx, Ib } },
8981 { "(bad)", { XX } },
8982 },
8983
8984 /* VEX_LEN_3A61_P_2 */
8985 {
8986 { "vpcmpestri", { XM, EXx, Ib } },
8987 { "(bad)", { XX } },
8988 },
8989
8990 /* VEX_LEN_3A62_P_2 */
8991 {
8992 { "vpcmpistrm", { XM, EXx, Ib } },
8993 { "(bad)", { XX } },
8994 },
8995
8996 /* VEX_LEN_3A63_P_2 */
8997 {
8998 { "vpcmpistri", { XM, EXx, Ib } },
8999 { "(bad)", { XX } },
9000 },
9001
9002 /* VEX_LEN_3A6A_P_2 */
9003 {
9004 { "vfmaddss", { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
9005 { "(bad)", { XX } },
9006 },
9007
9008 /* VEX_LEN_3A6B_P_2 */
9009 {
9010 { "vfmaddsd", { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
9011 { "(bad)", { XX } },
9012 },
9013
9014 /* VEX_LEN_3A6E_P_2 */
9015 {
9016 { "vfmsubss", { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
9017 { "(bad)", { XX } },
9018 },
9019
9020 /* VEX_LEN_3A6F_P_2 */
9021 {
9022 { "vfmsubsd", { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
9023 { "(bad)", { XX } },
9024 },
9025
9026 /* VEX_LEN_3A7A_P_2 */
9027 {
9028 { "vfnmaddss", { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
9029 { "(bad)", { XX } },
9030 },
9031
9032 /* VEX_LEN_3A7B_P_2 */
9033 {
9034 { "vfnmaddsd", { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
9035 { "(bad)", { XX } },
9036 },
9037
9038 /* VEX_LEN_3A7E_P_2 */
9039 {
9040 { "vfnmsubss", { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
9041 { "(bad)", { XX } },
9042 },
9043
9044 /* VEX_LEN_3A7F_P_2 */
9045 {
9046 { "vfnmsubsd", { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
9047 { "(bad)", { XX } },
9048 },
9049
9050 /* VEX_LEN_3ADF_P_2 */
9051 {
9052 { "vaeskeygenassist", { XM, EXx, Ib } },
9053 { "(bad)", { XX } },
9054 },
9055 };
9056
9057 static const struct dis386 mod_table[][2] = {
9058 {
9059 /* MOD_8D */
9060 { "leaS", { Gv, M } },
9061 { "(bad)", { XX } },
9062 },
9063 {
9064 /* MOD_0F01_REG_0 */
9065 { X86_64_TABLE (X86_64_0F01_REG_0) },
9066 { RM_TABLE (RM_0F01_REG_0) },
9067 },
9068 {
9069 /* MOD_0F01_REG_1 */
9070 { X86_64_TABLE (X86_64_0F01_REG_1) },
9071 { RM_TABLE (RM_0F01_REG_1) },
9072 },
9073 {
9074 /* MOD_0F01_REG_2 */
9075 { X86_64_TABLE (X86_64_0F01_REG_2) },
9076 { RM_TABLE (RM_0F01_REG_2) },
9077 },
9078 {
9079 /* MOD_0F01_REG_3 */
9080 { X86_64_TABLE (X86_64_0F01_REG_3) },
9081 { RM_TABLE (RM_0F01_REG_3) },
9082 },
9083 {
9084 /* MOD_0F01_REG_7 */
9085 { "invlpg", { Mb } },
9086 { RM_TABLE (RM_0F01_REG_7) },
9087 },
9088 {
9089 /* MOD_0F12_PREFIX_0 */
9090 { "movlps", { XM, EXq } },
9091 { "movhlps", { XM, EXq } },
9092 },
9093 {
9094 /* MOD_0F13 */
9095 { "movlpX", { EXq, XM } },
9096 { "(bad)", { XX } },
9097 },
9098 {
9099 /* MOD_0F16_PREFIX_0 */
9100 { "movhps", { XM, EXq } },
9101 { "movlhps", { XM, EXq } },
9102 },
9103 {
9104 /* MOD_0F17 */
9105 { "movhpX", { EXq, XM } },
9106 { "(bad)", { XX } },
9107 },
9108 {
9109 /* MOD_0F18_REG_0 */
9110 { "prefetchnta", { Mb } },
9111 { "(bad)", { XX } },
9112 },
9113 {
9114 /* MOD_0F18_REG_1 */
9115 { "prefetcht0", { Mb } },
9116 { "(bad)", { XX } },
9117 },
9118 {
9119 /* MOD_0F18_REG_2 */
9120 { "prefetcht1", { Mb } },
9121 { "(bad)", { XX } },
9122 },
9123 {
9124 /* MOD_0F18_REG_3 */
9125 { "prefetcht2", { Mb } },
9126 { "(bad)", { XX } },
9127 },
9128 {
9129 /* MOD_0F20 */
9130 { "(bad)", { XX } },
9131 { "movZ", { Rm, Cm } },
9132 },
9133 {
9134 /* MOD_0F21 */
9135 { "(bad)", { XX } },
9136 { "movZ", { Rm, Dm } },
9137 },
9138 {
9139 /* MOD_0F22 */
9140 { "(bad)", { XX } },
9141 { "movZ", { Cm, Rm } },
9142 },
9143 {
9144 /* MOD_0F23 */
9145 { "(bad)", { XX } },
9146 { "movZ", { Dm, Rm } },
9147 },
9148 {
9149 /* MOD_0F24 */
9150 { "(bad)", { XX } },
9151 { "movL", { Rd, Td } },
9152 },
9153 {
9154 /* MOD_0F26 */
9155 { "(bad)", { XX } },
9156 { "movL", { Td, Rd } },
9157 },
9158 {
9159 /* MOD_0F2B_PREFIX_0 */
9160 {"movntps", { Mx, XM } },
9161 { "(bad)", { XX } },
9162 },
9163 {
9164 /* MOD_0F2B_PREFIX_1 */
9165 {"movntss", { Md, XM } },
9166 { "(bad)", { XX } },
9167 },
9168 {
9169 /* MOD_0F2B_PREFIX_2 */
9170 {"movntpd", { Mx, XM } },
9171 { "(bad)", { XX } },
9172 },
9173 {
9174 /* MOD_0F2B_PREFIX_3 */
9175 {"movntsd", { Mq, XM } },
9176 { "(bad)", { XX } },
9177 },
9178 {
9179 /* MOD_0F51 */
9180 { "(bad)", { XX } },
9181 { "movmskpX", { Gdq, XS } },
9182 },
9183 {
9184 /* MOD_0F71_REG_2 */
9185 { "(bad)", { XX } },
9186 { "psrlw", { MS, Ib } },
9187 },
9188 {
9189 /* MOD_0F71_REG_4 */
9190 { "(bad)", { XX } },
9191 { "psraw", { MS, Ib } },
9192 },
9193 {
9194 /* MOD_0F71_REG_6 */
9195 { "(bad)", { XX } },
9196 { "psllw", { MS, Ib } },
9197 },
9198 {
9199 /* MOD_0F72_REG_2 */
9200 { "(bad)", { XX } },
9201 { "psrld", { MS, Ib } },
9202 },
9203 {
9204 /* MOD_0F72_REG_4 */
9205 { "(bad)", { XX } },
9206 { "psrad", { MS, Ib } },
9207 },
9208 {
9209 /* MOD_0F72_REG_6 */
9210 { "(bad)", { XX } },
9211 { "pslld", { MS, Ib } },
9212 },
9213 {
9214 /* MOD_0F73_REG_2 */
9215 { "(bad)", { XX } },
9216 { "psrlq", { MS, Ib } },
9217 },
9218 {
9219 /* MOD_0F73_REG_3 */
9220 { "(bad)", { XX } },
9221 { PREFIX_TABLE (PREFIX_0F73_REG_3) },
9222 },
9223 {
9224 /* MOD_0F73_REG_6 */
9225 { "(bad)", { XX } },
9226 { "psllq", { MS, Ib } },
9227 },
9228 {
9229 /* MOD_0F73_REG_7 */
9230 { "(bad)", { XX } },
9231 { PREFIX_TABLE (PREFIX_0F73_REG_7) },
9232 },
9233 {
9234 /* MOD_0FAE_REG_0 */
9235 { "fxsave", { M } },
9236 { "(bad)", { XX } },
9237 },
9238 {
9239 /* MOD_0FAE_REG_1 */
9240 { "fxrstor", { M } },
9241 { "(bad)", { XX } },
9242 },
9243 {
9244 /* MOD_0FAE_REG_2 */
9245 { "ldmxcsr", { Md } },
9246 { "(bad)", { XX } },
9247 },
9248 {
9249 /* MOD_0FAE_REG_3 */
9250 { "stmxcsr", { Md } },
9251 { "(bad)", { XX } },
9252 },
9253 {
9254 /* MOD_0FAE_REG_4 */
9255 { "xsave", { M } },
9256 { "(bad)", { XX } },
9257 },
9258 {
9259 /* MOD_0FAE_REG_5 */
9260 { "xrstor", { M } },
9261 { RM_TABLE (RM_0FAE_REG_5) },
9262 },
9263 {
9264 /* MOD_0FAE_REG_6 */
9265 { "xsaveopt", { M } },
9266 { RM_TABLE (RM_0FAE_REG_6) },
9267 },
9268 {
9269 /* MOD_0FAE_REG_7 */
9270 { "clflush", { Mb } },
9271 { RM_TABLE (RM_0FAE_REG_7) },
9272 },
9273 {
9274 /* MOD_0FB2 */
9275 { "lssS", { Gv, Mp } },
9276 { "(bad)", { XX } },
9277 },
9278 {
9279 /* MOD_0FB4 */
9280 { "lfsS", { Gv, Mp } },
9281 { "(bad)", { XX } },
9282 },
9283 {
9284 /* MOD_0FB5 */
9285 { "lgsS", { Gv, Mp } },
9286 { "(bad)", { XX } },
9287 },
9288 {
9289 /* MOD_0FC7_REG_6 */
9290 { PREFIX_TABLE (PREFIX_0FC7_REG_6) },
9291 { "(bad)", { XX } },
9292 },
9293 {
9294 /* MOD_0FC7_REG_7 */
9295 { "vmptrst", { Mq } },
9296 { "(bad)", { XX } },
9297 },
9298 {
9299 /* MOD_0FD7 */
9300 { "(bad)", { XX } },
9301 { "pmovmskb", { Gdq, MS } },
9302 },
9303 {
9304 /* MOD_0FE7_PREFIX_2 */
9305 { "movntdq", { Mx, XM } },
9306 { "(bad)", { XX } },
9307 },
9308 {
9309 /* MOD_0FF0_PREFIX_3 */
9310 { "lddqu", { XM, M } },
9311 { "(bad)", { XX } },
9312 },
9313 {
9314 /* MOD_0F382A_PREFIX_2 */
9315 { "movntdqa", { XM, Mx } },
9316 { "(bad)", { XX } },
9317 },
9318 {
9319 /* MOD_62_32BIT */
9320 { "bound{S|}", { Gv, Ma } },
9321 { "(bad)", { XX } },
9322 },
9323 {
9324 /* MOD_C4_32BIT */
9325 { "lesS", { Gv, Mp } },
9326 { VEX_C4_TABLE (VEX_0F) },
9327 },
9328 {
9329 /* MOD_C5_32BIT */
9330 { "ldsS", { Gv, Mp } },
9331 { VEX_C5_TABLE (VEX_0F) },
9332 },
9333 {
9334 /* MOD_VEX_12_PREFIX_0 */
9335 { VEX_LEN_TABLE (VEX_LEN_12_P_0_M_0) },
9336 { VEX_LEN_TABLE (VEX_LEN_12_P_0_M_1) },
9337 },
9338 {
9339 /* MOD_VEX_13 */
9340 { VEX_LEN_TABLE (VEX_LEN_13_M_0) },
9341 { "(bad)", { XX } },
9342 },
9343 {
9344 /* MOD_VEX_16_PREFIX_0 */
9345 { VEX_LEN_TABLE (VEX_LEN_16_P_0_M_0) },
9346 { VEX_LEN_TABLE (VEX_LEN_16_P_0_M_1) },
9347 },
9348 {
9349 /* MOD_VEX_17 */
9350 { VEX_LEN_TABLE (VEX_LEN_17_M_0) },
9351 { "(bad)", { XX } },
9352 },
9353 {
9354 /* MOD_VEX_2B */
9355 { "vmovntpX", { Mx, XM } },
9356 { "(bad)", { XX } },
9357 },
9358 {
9359 /* MOD_VEX_51 */
9360 { "(bad)", { XX } },
9361 { "vmovmskpX", { Gdq, XS } },
9362 },
9363 {
9364 /* MOD_VEX_71_REG_2 */
9365 { "(bad)", { XX } },
9366 { PREFIX_TABLE (PREFIX_VEX_71_REG_2) },
9367 },
9368 {
9369 /* MOD_VEX_71_REG_4 */
9370 { "(bad)", { XX } },
9371 { PREFIX_TABLE (PREFIX_VEX_71_REG_4) },
9372 },
9373 {
9374 /* MOD_VEX_71_REG_6 */
9375 { "(bad)", { XX } },
9376 { PREFIX_TABLE (PREFIX_VEX_71_REG_6) },
9377 },
9378 {
9379 /* MOD_VEX_72_REG_2 */
9380 { "(bad)", { XX } },
9381 { PREFIX_TABLE (PREFIX_VEX_72_REG_2) },
9382 },
9383 {
9384 /* MOD_VEX_72_REG_4 */
9385 { "(bad)", { XX } },
9386 { PREFIX_TABLE (PREFIX_VEX_72_REG_4) },
9387 },
9388 {
9389 /* MOD_VEX_72_REG_6 */
9390 { "(bad)", { XX } },
9391 { PREFIX_TABLE (PREFIX_VEX_72_REG_6) },
9392 },
9393 {
9394 /* MOD_VEX_73_REG_2 */
9395 { "(bad)", { XX } },
9396 { PREFIX_TABLE (PREFIX_VEX_73_REG_2) },
9397 },
9398 {
9399 /* MOD_VEX_73_REG_3 */
9400 { "(bad)", { XX } },
9401 { PREFIX_TABLE (PREFIX_VEX_73_REG_3) },
9402 },
9403 {
9404 /* MOD_VEX_73_REG_6 */
9405 { "(bad)", { XX } },
9406 { PREFIX_TABLE (PREFIX_VEX_73_REG_6) },
9407 },
9408 {
9409 /* MOD_VEX_73_REG_7 */
9410 { "(bad)", { XX } },
9411 { PREFIX_TABLE (PREFIX_VEX_73_REG_7) },
9412 },
9413 {
9414 /* MOD_VEX_AE_REG_2 */
9415 { VEX_LEN_TABLE (VEX_LEN_AE_R_2_M_0) },
9416 { "(bad)", { XX } },
9417 },
9418 {
9419 /* MOD_VEX_AE_REG_3 */
9420 { VEX_LEN_TABLE (VEX_LEN_AE_R_3_M_0) },
9421 { "(bad)", { XX } },
9422 },
9423 {
9424 /* MOD_VEX_D7_PREFIX_2 */
9425 { "(bad)", { XX } },
9426 { VEX_LEN_TABLE (VEX_LEN_D7_P_2_M_1) },
9427 },
9428 {
9429 /* MOD_VEX_E7_PREFIX_2 */
9430 { "vmovntdq", { Mx, XM } },
9431 { "(bad)", { XX } },
9432 },
9433 {
9434 /* MOD_VEX_F0_PREFIX_3 */
9435 { "vlddqu", { XM, M } },
9436 { "(bad)", { XX } },
9437 },
9438 {
9439 /* MOD_VEX_3818_PREFIX_2 */
9440 { "vbroadcastss", { XM, Md } },
9441 { "(bad)", { XX } },
9442 },
9443 {
9444 /* MOD_VEX_3819_PREFIX_2 */
9445 { VEX_LEN_TABLE (VEX_LEN_3819_P_2_M_0) },
9446 { "(bad)", { XX } },
9447 },
9448 {
9449 /* MOD_VEX_381A_PREFIX_2 */
9450 { VEX_LEN_TABLE (VEX_LEN_381A_P_2_M_0) },
9451 { "(bad)", { XX } },
9452 },
9453 {
9454 /* MOD_VEX_382A_PREFIX_2 */
9455 { VEX_LEN_TABLE (VEX_LEN_382A_P_2_M_0) },
9456 { "(bad)", { XX } },
9457 },
9458 {
9459 /* MOD_VEX_382C_PREFIX_2 */
9460 { "vmaskmovps", { XM, Vex, Mx } },
9461 { "(bad)", { XX } },
9462 },
9463 {
9464 /* MOD_VEX_382D_PREFIX_2 */
9465 { "vmaskmovpd", { XM, Vex, Mx } },
9466 { "(bad)", { XX } },
9467 },
9468 {
9469 /* MOD_VEX_382E_PREFIX_2 */
9470 { "vmaskmovps", { Mx, Vex, XM } },
9471 { "(bad)", { XX } },
9472 },
9473 {
9474 /* MOD_VEX_382F_PREFIX_2 */
9475 { "vmaskmovpd", { Mx, Vex, XM } },
9476 { "(bad)", { XX } },
9477 },
9478 };
9479
9480 static const struct dis386 rm_table[][8] = {
9481 {
9482 /* RM_0F01_REG_0 */
9483 { "(bad)", { XX } },
9484 { "vmcall", { Skip_MODRM } },
9485 { "vmlaunch", { Skip_MODRM } },
9486 { "vmresume", { Skip_MODRM } },
9487 { "vmxoff", { Skip_MODRM } },
9488 { "(bad)", { XX } },
9489 { "(bad)", { XX } },
9490 { "(bad)", { XX } },
9491 },
9492 {
9493 /* RM_0F01_REG_1 */
9494 { "monitor", { { OP_Monitor, 0 } } },
9495 { "mwait", { { OP_Mwait, 0 } } },
9496 { "(bad)", { XX } },
9497 { "(bad)", { XX } },
9498 { "(bad)", { XX } },
9499 { "(bad)", { XX } },
9500 { "(bad)", { XX } },
9501 { "(bad)", { XX } },
9502 },
9503 {
9504 /* RM_0F01_REG_2 */
9505 { "xgetbv", { Skip_MODRM } },
9506 { "xsetbv", { Skip_MODRM } },
9507 { "(bad)", { XX } },
9508 { "(bad)", { XX } },
9509 { "(bad)", { XX } },
9510 { "(bad)", { XX } },
9511 { "(bad)", { XX } },
9512 { "(bad)", { XX } },
9513 },
9514 {
9515 /* RM_0F01_REG_3 */
9516 { "vmrun", { Skip_MODRM } },
9517 { "vmmcall", { Skip_MODRM } },
9518 { "vmload", { Skip_MODRM } },
9519 { "vmsave", { Skip_MODRM } },
9520 { "stgi", { Skip_MODRM } },
9521 { "clgi", { Skip_MODRM } },
9522 { "skinit", { Skip_MODRM } },
9523 { "invlpga", { Skip_MODRM } },
9524 },
9525 {
9526 /* RM_0F01_REG_7 */
9527 { "swapgs", { Skip_MODRM } },
9528 { "rdtscp", { Skip_MODRM } },
9529 { "(bad)", { XX } },
9530 { "(bad)", { XX } },
9531 { "(bad)", { XX } },
9532 { "(bad)", { XX } },
9533 { "(bad)", { XX } },
9534 { "(bad)", { XX } },
9535 },
9536 {
9537 /* RM_0FAE_REG_5 */
9538 { "lfence", { Skip_MODRM } },
9539 { "(bad)", { XX } },
9540 { "(bad)", { XX } },
9541 { "(bad)", { XX } },
9542 { "(bad)", { XX } },
9543 { "(bad)", { XX } },
9544 { "(bad)", { XX } },
9545 { "(bad)", { XX } },
9546 },
9547 {
9548 /* RM_0FAE_REG_6 */
9549 { "mfence", { Skip_MODRM } },
9550 { "(bad)", { XX } },
9551 { "(bad)", { XX } },
9552 { "(bad)", { XX } },
9553 { "(bad)", { XX } },
9554 { "(bad)", { XX } },
9555 { "(bad)", { XX } },
9556 { "(bad)", { XX } },
9557 },
9558 {
9559 /* RM_0FAE_REG_7 */
9560 { "sfence", { Skip_MODRM } },
9561 { "(bad)", { XX } },
9562 { "(bad)", { XX } },
9563 { "(bad)", { XX } },
9564 { "(bad)", { XX } },
9565 { "(bad)", { XX } },
9566 { "(bad)", { XX } },
9567 { "(bad)", { XX } },
9568 },
9569 };
9570
9571 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
9572
9573 static void
9574 ckprefix (void)
9575 {
9576 int newrex, i;
9577 rex = 0;
9578 rex_original = 0;
9579 rex_ignored = 0;
9580 prefixes = 0;
9581 used_prefixes = 0;
9582 rex_used = 0;
9583 for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
9584 all_prefixes[i] = 0;
9585 i = 0;
9586 while (1)
9587 {
9588 FETCH_DATA (the_info, codep + 1);
9589 newrex = 0;
9590 switch (*codep)
9591 {
9592 /* REX prefixes family. */
9593 case 0x40:
9594 case 0x41:
9595 case 0x42:
9596 case 0x43:
9597 case 0x44:
9598 case 0x45:
9599 case 0x46:
9600 case 0x47:
9601 case 0x48:
9602 case 0x49:
9603 case 0x4a:
9604 case 0x4b:
9605 case 0x4c:
9606 case 0x4d:
9607 case 0x4e:
9608 case 0x4f:
9609 if (address_mode == mode_64bit)
9610 newrex = *codep;
9611 else
9612 return;
9613 break;
9614 case 0xf3:
9615 if ((prefixes & PREFIX_REPZ) == 0)
9616 {
9617 all_prefixes[i] = &repz_prefix;
9618 i++;
9619 }
9620 prefixes |= PREFIX_REPZ;
9621 break;
9622 case 0xf2:
9623 if ((prefixes & PREFIX_REPNZ) == 0)
9624 {
9625 all_prefixes[i] = &repnz_prefix;
9626 i++;
9627 }
9628 prefixes |= PREFIX_REPNZ;
9629 break;
9630 case 0xf0:
9631 if ((prefixes & PREFIX_LOCK) == 0)
9632 {
9633 all_prefixes[i] = &lock_prefix;
9634 i++;
9635 }
9636 prefixes |= PREFIX_LOCK;
9637 break;
9638 case 0x2e:
9639 prefixes |= PREFIX_CS;
9640 break;
9641 case 0x36:
9642 prefixes |= PREFIX_SS;
9643 break;
9644 case 0x3e:
9645 prefixes |= PREFIX_DS;
9646 break;
9647 case 0x26:
9648 prefixes |= PREFIX_ES;
9649 break;
9650 case 0x64:
9651 prefixes |= PREFIX_FS;
9652 break;
9653 case 0x65:
9654 prefixes |= PREFIX_GS;
9655 break;
9656 case 0x66:
9657 if ((prefixes & PREFIX_DATA) == 0)
9658 {
9659 all_prefixes[i] = &data_prefix;
9660 i++;
9661 }
9662 prefixes |= PREFIX_DATA;
9663 break;
9664 case 0x67:
9665 if ((prefixes & PREFIX_ADDR) == 0)
9666 {
9667 all_prefixes[i] = &addr_prefix;
9668 i++;
9669 }
9670 prefixes |= PREFIX_ADDR;
9671 break;
9672 case FWAIT_OPCODE:
9673 /* fwait is really an instruction. If there are prefixes
9674 before the fwait, they belong to the fwait, *not* to the
9675 following instruction. */
9676 if (prefixes || rex)
9677 {
9678 prefixes |= PREFIX_FWAIT;
9679 codep++;
9680 return;
9681 }
9682 prefixes = PREFIX_FWAIT;
9683 break;
9684 default:
9685 return;
9686 }
9687 /* Rex is ignored when followed by another prefix. */
9688 if (rex)
9689 {
9690 rex_used = rex;
9691 return;
9692 }
9693 rex = newrex;
9694 rex_original = rex;
9695 codep++;
9696 }
9697 }
9698
9699 /* Return the name of the prefix byte PREF, or NULL if PREF is not a
9700 prefix byte. */
9701
9702 static const char *
9703 prefix_name (int pref, int sizeflag)
9704 {
9705 static const char *rexes [16] =
9706 {
9707 "rex", /* 0x40 */
9708 "rex.B", /* 0x41 */
9709 "rex.X", /* 0x42 */
9710 "rex.XB", /* 0x43 */
9711 "rex.R", /* 0x44 */
9712 "rex.RB", /* 0x45 */
9713 "rex.RX", /* 0x46 */
9714 "rex.RXB", /* 0x47 */
9715 "rex.W", /* 0x48 */
9716 "rex.WB", /* 0x49 */
9717 "rex.WX", /* 0x4a */
9718 "rex.WXB", /* 0x4b */
9719 "rex.WR", /* 0x4c */
9720 "rex.WRB", /* 0x4d */
9721 "rex.WRX", /* 0x4e */
9722 "rex.WRXB", /* 0x4f */
9723 };
9724
9725 switch (pref)
9726 {
9727 /* REX prefixes family. */
9728 case 0x40:
9729 case 0x41:
9730 case 0x42:
9731 case 0x43:
9732 case 0x44:
9733 case 0x45:
9734 case 0x46:
9735 case 0x47:
9736 case 0x48:
9737 case 0x49:
9738 case 0x4a:
9739 case 0x4b:
9740 case 0x4c:
9741 case 0x4d:
9742 case 0x4e:
9743 case 0x4f:
9744 return rexes [pref - 0x40];
9745 case 0xf3:
9746 return "repz";
9747 case 0xf2:
9748 return "repnz";
9749 case 0xf0:
9750 return "lock";
9751 case 0x2e:
9752 return "cs";
9753 case 0x36:
9754 return "ss";
9755 case 0x3e:
9756 return "ds";
9757 case 0x26:
9758 return "es";
9759 case 0x64:
9760 return "fs";
9761 case 0x65:
9762 return "gs";
9763 case 0x66:
9764 return (sizeflag & DFLAG) ? "data16" : "data32";
9765 case 0x67:
9766 if (address_mode == mode_64bit)
9767 return (sizeflag & AFLAG) ? "addr32" : "addr64";
9768 else
9769 return (sizeflag & AFLAG) ? "addr16" : "addr32";
9770 case FWAIT_OPCODE:
9771 return "fwait";
9772 default:
9773 return NULL;
9774 }
9775 }
9776
9777 static char op_out[MAX_OPERANDS][100];
9778 static int op_ad, op_index[MAX_OPERANDS];
9779 static int two_source_ops;
9780 static bfd_vma op_address[MAX_OPERANDS];
9781 static bfd_vma op_riprel[MAX_OPERANDS];
9782 static bfd_vma start_pc;
9783
9784 /*
9785 * On the 386's of 1988, the maximum length of an instruction is 15 bytes.
9786 * (see topic "Redundant prefixes" in the "Differences from 8086"
9787 * section of the "Virtual 8086 Mode" chapter.)
9788 * 'pc' should be the address of this instruction, it will
9789 * be used to print the target address if this is a relative jump or call
9790 * The function returns the length of this instruction in bytes.
9791 */
9792
9793 static char intel_syntax;
9794 static char intel_mnemonic = !SYSV386_COMPAT;
9795 static char open_char;
9796 static char close_char;
9797 static char separator_char;
9798 static char scale_char;
9799
9800 /* Here for backwards compatibility. When gdb stops using
9801 print_insn_i386_att and print_insn_i386_intel these functions can
9802 disappear, and print_insn_i386 be merged into print_insn. */
9803 int
9804 print_insn_i386_att (bfd_vma pc, disassemble_info *info)
9805 {
9806 intel_syntax = 0;
9807
9808 return print_insn (pc, info);
9809 }
9810
9811 int
9812 print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
9813 {
9814 intel_syntax = 1;
9815
9816 return print_insn (pc, info);
9817 }
9818
9819 int
9820 print_insn_i386 (bfd_vma pc, disassemble_info *info)
9821 {
9822 intel_syntax = -1;
9823
9824 return print_insn (pc, info);
9825 }
9826
9827 void
9828 print_i386_disassembler_options (FILE *stream)
9829 {
9830 fprintf (stream, _("\n\
9831 The following i386/x86-64 specific disassembler options are supported for use\n\
9832 with the -M switch (multiple options should be separated by commas):\n"));
9833
9834 fprintf (stream, _(" x86-64 Disassemble in 64bit mode\n"));
9835 fprintf (stream, _(" i386 Disassemble in 32bit mode\n"));
9836 fprintf (stream, _(" i8086 Disassemble in 16bit mode\n"));
9837 fprintf (stream, _(" att Display instruction in AT&T syntax\n"));
9838 fprintf (stream, _(" intel Display instruction in Intel syntax\n"));
9839 fprintf (stream, _(" att-mnemonic\n"
9840 " Display instruction in AT&T mnemonic\n"));
9841 fprintf (stream, _(" intel-mnemonic\n"
9842 " Display instruction in Intel mnemonic\n"));
9843 fprintf (stream, _(" addr64 Assume 64bit address size\n"));
9844 fprintf (stream, _(" addr32 Assume 32bit address size\n"));
9845 fprintf (stream, _(" addr16 Assume 16bit address size\n"));
9846 fprintf (stream, _(" data32 Assume 32bit data size\n"));
9847 fprintf (stream, _(" data16 Assume 16bit data size\n"));
9848 fprintf (stream, _(" suffix Always display instruction suffix in AT&T syntax\n"));
9849 }
9850
9851 /* Get a pointer to struct dis386 with a valid name. */
9852
9853 static const struct dis386 *
9854 get_valid_dis386 (const struct dis386 *dp, disassemble_info *info)
9855 {
9856 int index, vex_table_index;
9857
9858 if (dp->name != NULL)
9859 return dp;
9860
9861 switch (dp->op[0].bytemode)
9862 {
9863 case USE_REG_TABLE:
9864 dp = &reg_table[dp->op[1].bytemode][modrm.reg];
9865 break;
9866
9867 case USE_MOD_TABLE:
9868 index = modrm.mod == 0x3 ? 1 : 0;
9869 dp = &mod_table[dp->op[1].bytemode][index];
9870 break;
9871
9872 case USE_RM_TABLE:
9873 dp = &rm_table[dp->op[1].bytemode][modrm.rm];
9874 break;
9875
9876 case USE_PREFIX_TABLE:
9877 if (need_vex)
9878 {
9879 /* The prefix in VEX is implicit. */
9880 switch (vex.prefix)
9881 {
9882 case 0:
9883 index = 0;
9884 break;
9885 case REPE_PREFIX_OPCODE:
9886 index = 1;
9887 break;
9888 case DATA_PREFIX_OPCODE:
9889 index = 2;
9890 break;
9891 case REPNE_PREFIX_OPCODE:
9892 index = 3;
9893 break;
9894 default:
9895 abort ();
9896 break;
9897 }
9898 }
9899 else
9900 {
9901 index = 0;
9902 used_prefixes |= (prefixes & PREFIX_REPZ);
9903 if (prefixes & PREFIX_REPZ)
9904 {
9905 index = 1;
9906 repz_prefix = NULL;
9907 }
9908 else
9909 {
9910 /* We should check PREFIX_REPNZ and PREFIX_REPZ before
9911 PREFIX_DATA. */
9912 used_prefixes |= (prefixes & PREFIX_REPNZ);
9913 if (prefixes & PREFIX_REPNZ)
9914 {
9915 index = 3;
9916 repnz_prefix = NULL;
9917 }
9918 else
9919 {
9920 used_prefixes |= (prefixes & PREFIX_DATA);
9921 if (prefixes & PREFIX_DATA)
9922 {
9923 index = 2;
9924 data_prefix = NULL;
9925 }
9926 }
9927 }
9928 }
9929 dp = &prefix_table[dp->op[1].bytemode][index];
9930 break;
9931
9932 case USE_X86_64_TABLE:
9933 index = address_mode == mode_64bit ? 1 : 0;
9934 dp = &x86_64_table[dp->op[1].bytemode][index];
9935 break;
9936
9937 case USE_3BYTE_TABLE:
9938 FETCH_DATA (info, codep + 2);
9939 index = *codep++;
9940 dp = &three_byte_table[dp->op[1].bytemode][index];
9941 modrm.mod = (*codep >> 6) & 3;
9942 modrm.reg = (*codep >> 3) & 7;
9943 modrm.rm = *codep & 7;
9944 break;
9945
9946 case USE_VEX_LEN_TABLE:
9947 if (!need_vex)
9948 abort ();
9949
9950 switch (vex.length)
9951 {
9952 case 128:
9953 index = 0;
9954 break;
9955 case 256:
9956 index = 1;
9957 break;
9958 default:
9959 abort ();
9960 break;
9961 }
9962
9963 dp = &vex_len_table[dp->op[1].bytemode][index];
9964 break;
9965
9966 case USE_XOP_8F_TABLE:
9967 FETCH_DATA (info, codep + 3);
9968 /* All bits in the REX prefix are ignored. */
9969 rex_ignored = rex;
9970 rex = ~(*codep >> 5) & 0x7;
9971
9972 /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm". */
9973 switch ((*codep & 0x1f))
9974 {
9975 default:
9976 BadOp ();
9977 case 0x9:
9978 vex_table_index = XOP_09;
9979 break;
9980 case 0xa:
9981 vex_table_index = XOP_0A;
9982 break;
9983 }
9984 codep++;
9985 vex.w = *codep & 0x80;
9986 if (vex.w && address_mode == mode_64bit)
9987 rex |= REX_W;
9988
9989 vex.register_specifier = (~(*codep >> 3)) & 0xf;
9990 if (address_mode != mode_64bit
9991 && vex.register_specifier > 0x7)
9992 BadOp ();
9993
9994 vex.length = (*codep & 0x4) ? 256 : 128;
9995 switch ((*codep & 0x3))
9996 {
9997 case 0:
9998 vex.prefix = 0;
9999 break;
10000 case 1:
10001 vex.prefix = DATA_PREFIX_OPCODE;
10002 break;
10003 case 2:
10004 vex.prefix = REPE_PREFIX_OPCODE;
10005 break;
10006 case 3:
10007 vex.prefix = REPNE_PREFIX_OPCODE;
10008 break;
10009 }
10010 need_vex = 1;
10011 need_vex_reg = 1;
10012 codep++;
10013 index = *codep++;
10014 dp = &xop_table[vex_table_index][index];
10015
10016 FETCH_DATA (info, codep + 1);
10017 modrm.mod = (*codep >> 6) & 3;
10018 modrm.reg = (*codep >> 3) & 7;
10019 modrm.rm = *codep & 7;
10020 break;
10021
10022 case USE_VEX_C4_TABLE:
10023 FETCH_DATA (info, codep + 3);
10024 /* All bits in the REX prefix are ignored. */
10025 rex_ignored = rex;
10026 rex = ~(*codep >> 5) & 0x7;
10027 switch ((*codep & 0x1f))
10028 {
10029 default:
10030 BadOp ();
10031 case 0x1:
10032 vex_table_index = VEX_0F;
10033 break;
10034 case 0x2:
10035 vex_table_index = VEX_0F38;
10036 break;
10037 case 0x3:
10038 vex_table_index = VEX_0F3A;
10039 break;
10040 }
10041 codep++;
10042 vex.w = *codep & 0x80;
10043 if (vex.w && address_mode == mode_64bit)
10044 rex |= REX_W;
10045
10046 vex.register_specifier = (~(*codep >> 3)) & 0xf;
10047 if (address_mode != mode_64bit
10048 && vex.register_specifier > 0x7)
10049 BadOp ();
10050
10051 vex.length = (*codep & 0x4) ? 256 : 128;
10052 switch ((*codep & 0x3))
10053 {
10054 case 0:
10055 vex.prefix = 0;
10056 break;
10057 case 1:
10058 vex.prefix = DATA_PREFIX_OPCODE;
10059 break;
10060 case 2:
10061 vex.prefix = REPE_PREFIX_OPCODE;
10062 break;
10063 case 3:
10064 vex.prefix = REPNE_PREFIX_OPCODE;
10065 break;
10066 }
10067 need_vex = 1;
10068 need_vex_reg = 1;
10069 codep++;
10070 index = *codep++;
10071 dp = &vex_table[vex_table_index][index];
10072 /* There is no MODRM byte for VEX [82|77]. */
10073 if (index != 0x77 && index != 0x82)
10074 {
10075 FETCH_DATA (info, codep + 1);
10076 modrm.mod = (*codep >> 6) & 3;
10077 modrm.reg = (*codep >> 3) & 7;
10078 modrm.rm = *codep & 7;
10079 }
10080 break;
10081
10082 case USE_VEX_C5_TABLE:
10083 FETCH_DATA (info, codep + 2);
10084 /* All bits in the REX prefix are ignored. */
10085 rex_ignored = rex;
10086 rex = (*codep & 0x80) ? 0 : REX_R;
10087
10088 vex.register_specifier = (~(*codep >> 3)) & 0xf;
10089 if (address_mode != mode_64bit
10090 && vex.register_specifier > 0x7)
10091 BadOp ();
10092
10093 vex.length = (*codep & 0x4) ? 256 : 128;
10094 switch ((*codep & 0x3))
10095 {
10096 case 0:
10097 vex.prefix = 0;
10098 break;
10099 case 1:
10100 vex.prefix = DATA_PREFIX_OPCODE;
10101 break;
10102 case 2:
10103 vex.prefix = REPE_PREFIX_OPCODE;
10104 break;
10105 case 3:
10106 vex.prefix = REPNE_PREFIX_OPCODE;
10107 break;
10108 }
10109 need_vex = 1;
10110 need_vex_reg = 1;
10111 codep++;
10112 index = *codep++;
10113 dp = &vex_table[dp->op[1].bytemode][index];
10114 /* There is no MODRM byte for VEX [82|77]. */
10115 if (index != 0x77 && index != 0x82)
10116 {
10117 FETCH_DATA (info, codep + 1);
10118 modrm.mod = (*codep >> 6) & 3;
10119 modrm.reg = (*codep >> 3) & 7;
10120 modrm.rm = *codep & 7;
10121 }
10122 break;
10123
10124 default:
10125 abort ();
10126 }
10127
10128 if (dp->name != NULL)
10129 return dp;
10130 else
10131 return get_valid_dis386 (dp, info);
10132 }
10133
10134 static int
10135 print_insn (bfd_vma pc, disassemble_info *info)
10136 {
10137 const struct dis386 *dp;
10138 int i;
10139 char *op_txt[MAX_OPERANDS];
10140 int needcomma;
10141 int sizeflag;
10142 const char *p;
10143 struct dis_private priv;
10144 unsigned char op;
10145 char prefix_obuf[32];
10146 char *prefix_obufp;
10147
10148 if (info->mach == bfd_mach_x86_64_intel_syntax
10149 || info->mach == bfd_mach_x86_64
10150 || info->mach == bfd_mach_l1om
10151 || info->mach == bfd_mach_l1om_intel_syntax)
10152 address_mode = mode_64bit;
10153 else
10154 address_mode = mode_32bit;
10155
10156 if (intel_syntax == (char) -1)
10157 intel_syntax = (info->mach == bfd_mach_i386_i386_intel_syntax
10158 || info->mach == bfd_mach_x86_64_intel_syntax
10159 || info->mach == bfd_mach_l1om_intel_syntax);
10160
10161 if (info->mach == bfd_mach_i386_i386
10162 || info->mach == bfd_mach_x86_64
10163 || info->mach == bfd_mach_l1om
10164 || info->mach == bfd_mach_i386_i386_intel_syntax
10165 || info->mach == bfd_mach_x86_64_intel_syntax
10166 || info->mach == bfd_mach_l1om_intel_syntax)
10167 priv.orig_sizeflag = AFLAG | DFLAG;
10168 else if (info->mach == bfd_mach_i386_i8086)
10169 priv.orig_sizeflag = 0;
10170 else
10171 abort ();
10172
10173 for (p = info->disassembler_options; p != NULL; )
10174 {
10175 if (CONST_STRNEQ (p, "x86-64"))
10176 {
10177 address_mode = mode_64bit;
10178 priv.orig_sizeflag = AFLAG | DFLAG;
10179 }
10180 else if (CONST_STRNEQ (p, "i386"))
10181 {
10182 address_mode = mode_32bit;
10183 priv.orig_sizeflag = AFLAG | DFLAG;
10184 }
10185 else if (CONST_STRNEQ (p, "i8086"))
10186 {
10187 address_mode = mode_16bit;
10188 priv.orig_sizeflag = 0;
10189 }
10190 else if (CONST_STRNEQ (p, "intel"))
10191 {
10192 intel_syntax = 1;
10193 if (CONST_STRNEQ (p + 5, "-mnemonic"))
10194 intel_mnemonic = 1;
10195 }
10196 else if (CONST_STRNEQ (p, "att"))
10197 {
10198 intel_syntax = 0;
10199 if (CONST_STRNEQ (p + 3, "-mnemonic"))
10200 intel_mnemonic = 0;
10201 }
10202 else if (CONST_STRNEQ (p, "addr"))
10203 {
10204 if (address_mode == mode_64bit)
10205 {
10206 if (p[4] == '3' && p[5] == '2')
10207 priv.orig_sizeflag &= ~AFLAG;
10208 else if (p[4] == '6' && p[5] == '4')
10209 priv.orig_sizeflag |= AFLAG;
10210 }
10211 else
10212 {
10213 if (p[4] == '1' && p[5] == '6')
10214 priv.orig_sizeflag &= ~AFLAG;
10215 else if (p[4] == '3' && p[5] == '2')
10216 priv.orig_sizeflag |= AFLAG;
10217 }
10218 }
10219 else if (CONST_STRNEQ (p, "data"))
10220 {
10221 if (p[4] == '1' && p[5] == '6')
10222 priv.orig_sizeflag &= ~DFLAG;
10223 else if (p[4] == '3' && p[5] == '2')
10224 priv.orig_sizeflag |= DFLAG;
10225 }
10226 else if (CONST_STRNEQ (p, "suffix"))
10227 priv.orig_sizeflag |= SUFFIX_ALWAYS;
10228
10229 p = strchr (p, ',');
10230 if (p != NULL)
10231 p++;
10232 }
10233
10234 if (intel_syntax)
10235 {
10236 names64 = intel_names64;
10237 names32 = intel_names32;
10238 names16 = intel_names16;
10239 names8 = intel_names8;
10240 names8rex = intel_names8rex;
10241 names_seg = intel_names_seg;
10242 index64 = intel_index64;
10243 index32 = intel_index32;
10244 index16 = intel_index16;
10245 open_char = '[';
10246 close_char = ']';
10247 separator_char = '+';
10248 scale_char = '*';
10249 }
10250 else
10251 {
10252 names64 = att_names64;
10253 names32 = att_names32;
10254 names16 = att_names16;
10255 names8 = att_names8;
10256 names8rex = att_names8rex;
10257 names_seg = att_names_seg;
10258 index64 = att_index64;
10259 index32 = att_index32;
10260 index16 = att_index16;
10261 open_char = '(';
10262 close_char = ')';
10263 separator_char = ',';
10264 scale_char = ',';
10265 }
10266
10267 /* The output looks better if we put 7 bytes on a line, since that
10268 puts most long word instructions on a single line. Use 8 bytes
10269 for Intel L1OM. */
10270 if (info->mach == bfd_mach_l1om
10271 || info->mach == bfd_mach_l1om_intel_syntax)
10272 info->bytes_per_line = 8;
10273 else
10274 info->bytes_per_line = 7;
10275
10276 info->private_data = &priv;
10277 priv.max_fetched = priv.the_buffer;
10278 priv.insn_start = pc;
10279
10280 obuf[0] = 0;
10281 for (i = 0; i < MAX_OPERANDS; ++i)
10282 {
10283 op_out[i][0] = 0;
10284 op_index[i] = -1;
10285 }
10286
10287 the_info = info;
10288 start_pc = pc;
10289 start_codep = priv.the_buffer;
10290 codep = priv.the_buffer;
10291
10292 if (setjmp (priv.bailout) != 0)
10293 {
10294 const char *name;
10295
10296 /* Getting here means we tried for data but didn't get it. That
10297 means we have an incomplete instruction of some sort. Just
10298 print the first byte as a prefix or a .byte pseudo-op. */
10299 if (codep > priv.the_buffer)
10300 {
10301 name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
10302 if (name != NULL)
10303 (*info->fprintf_func) (info->stream, "%s", name);
10304 else
10305 {
10306 /* Just print the first byte as a .byte instruction. */
10307 (*info->fprintf_func) (info->stream, ".byte 0x%x",
10308 (unsigned int) priv.the_buffer[0]);
10309 }
10310
10311 return 1;
10312 }
10313
10314 return -1;
10315 }
10316
10317 obufp = obuf;
10318 ckprefix ();
10319
10320 insn_codep = codep;
10321 sizeflag = priv.orig_sizeflag;
10322
10323 FETCH_DATA (info, codep + 1);
10324 two_source_ops = (*codep == 0x62) || (*codep == 0xc8);
10325
10326 if (((prefixes & PREFIX_FWAIT)
10327 && ((*codep < 0xd8) || (*codep > 0xdf)))
10328 || (rex && rex_used))
10329 {
10330 const char *name;
10331
10332 /* fwait not followed by floating point instruction, or rex followed
10333 by other prefixes. Print the first prefix. */
10334 name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
10335 if (name == NULL)
10336 name = INTERNAL_DISASSEMBLER_ERROR;
10337 (*info->fprintf_func) (info->stream, "%s", name);
10338 return 1;
10339 }
10340
10341 op = 0;
10342
10343 if (*codep == 0x0f)
10344 {
10345 unsigned char threebyte;
10346 FETCH_DATA (info, codep + 2);
10347 threebyte = *++codep;
10348 dp = &dis386_twobyte[threebyte];
10349 need_modrm = twobyte_has_modrm[*codep];
10350 codep++;
10351 }
10352 else
10353 {
10354 dp = &dis386[*codep];
10355 need_modrm = onebyte_has_modrm[*codep];
10356 codep++;
10357 }
10358
10359 if ((prefixes & PREFIX_REPZ))
10360 {
10361 repz_prefix = "repz ";
10362 used_prefixes |= PREFIX_REPZ;
10363 }
10364 else
10365 repz_prefix = NULL;
10366
10367 if ((prefixes & PREFIX_REPNZ))
10368 {
10369 repnz_prefix = "repnz ";
10370 used_prefixes |= PREFIX_REPNZ;
10371 }
10372 else
10373 repnz_prefix = NULL;
10374
10375 if ((prefixes & PREFIX_LOCK))
10376 {
10377 lock_prefix = "lock ";
10378 used_prefixes |= PREFIX_LOCK;
10379 }
10380 else
10381 lock_prefix = NULL;
10382
10383 addr_prefix = NULL;
10384 if (prefixes & PREFIX_ADDR)
10385 {
10386 sizeflag ^= AFLAG;
10387 if (dp->op[2].bytemode != loop_jcxz_mode || intel_syntax)
10388 {
10389 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
10390 addr_prefix = "addr32 ";
10391 else
10392 addr_prefix = "addr16 ";
10393 used_prefixes |= PREFIX_ADDR;
10394 }
10395 }
10396
10397 data_prefix = NULL;
10398 if ((prefixes & PREFIX_DATA))
10399 {
10400 sizeflag ^= DFLAG;
10401 if (dp->op[2].bytemode == cond_jump_mode
10402 && dp->op[0].bytemode == v_mode
10403 && !intel_syntax)
10404 {
10405 if (sizeflag & DFLAG)
10406 data_prefix = "data32 ";
10407 else
10408 data_prefix = "data16 ";
10409 used_prefixes |= PREFIX_DATA;
10410 }
10411 }
10412
10413 if (need_modrm)
10414 {
10415 FETCH_DATA (info, codep + 1);
10416 modrm.mod = (*codep >> 6) & 3;
10417 modrm.reg = (*codep >> 3) & 7;
10418 modrm.rm = *codep & 7;
10419 }
10420
10421 need_vex = 0;
10422 need_vex_reg = 0;
10423 vex_w_done = 0;
10424
10425 if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
10426 {
10427 dofloat (sizeflag);
10428 }
10429 else
10430 {
10431 dp = get_valid_dis386 (dp, info);
10432 if (dp != NULL && putop (dp->name, sizeflag) == 0)
10433 {
10434 for (i = 0; i < MAX_OPERANDS; ++i)
10435 {
10436 obufp = op_out[i];
10437 op_ad = MAX_OPERANDS - 1 - i;
10438 if (dp->op[i].rtn)
10439 (*dp->op[i].rtn) (dp->op[i].bytemode, sizeflag);
10440 }
10441 }
10442 }
10443
10444 /* See if any prefixes were not used. If so, print the first one
10445 separately. If we don't do this, we'll wind up printing an
10446 instruction stream which does not precisely correspond to the
10447 bytes we are disassembling. */
10448 if ((prefixes & ~used_prefixes) != 0)
10449 {
10450 const char *name;
10451
10452 name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
10453 if (name == NULL)
10454 name = INTERNAL_DISASSEMBLER_ERROR;
10455 (*info->fprintf_func) (info->stream, "%s", name);
10456 return 1;
10457 }
10458 if ((rex_original & ~rex_used) || rex_ignored)
10459 {
10460 const char *name;
10461 name = prefix_name (rex_original, priv.orig_sizeflag);
10462 if (name == NULL)
10463 name = INTERNAL_DISASSEMBLER_ERROR;
10464 (*info->fprintf_func) (info->stream, "%s ", name);
10465 }
10466
10467 prefix_obuf[0] = 0;
10468 prefix_obufp = prefix_obuf;
10469 for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
10470 if (all_prefixes[i] && *all_prefixes[i])
10471 prefix_obufp = stpcpy (prefix_obufp, *all_prefixes[i]);
10472
10473 if (prefix_obuf[0] != 0)
10474 (*info->fprintf_func) (info->stream, "%s", prefix_obuf);
10475
10476 obufp = mnemonicendp;
10477 for (i = strlen (obuf) + strlen (prefix_obuf); i < 6; i++)
10478 oappend (" ");
10479 oappend (" ");
10480 (*info->fprintf_func) (info->stream, "%s", obuf);
10481
10482 /* The enter and bound instructions are printed with operands in the same
10483 order as the intel book; everything else is printed in reverse order. */
10484 if (intel_syntax || two_source_ops)
10485 {
10486 bfd_vma riprel;
10487
10488 for (i = 0; i < MAX_OPERANDS; ++i)
10489 op_txt[i] = op_out[i];
10490
10491 for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
10492 {
10493 op_ad = op_index[i];
10494 op_index[i] = op_index[MAX_OPERANDS - 1 - i];
10495 op_index[MAX_OPERANDS - 1 - i] = op_ad;
10496 riprel = op_riprel[i];
10497 op_riprel[i] = op_riprel [MAX_OPERANDS - 1 - i];
10498 op_riprel[MAX_OPERANDS - 1 - i] = riprel;
10499 }
10500 }
10501 else
10502 {
10503 for (i = 0; i < MAX_OPERANDS; ++i)
10504 op_txt[MAX_OPERANDS - 1 - i] = op_out[i];
10505 }
10506
10507 needcomma = 0;
10508 for (i = 0; i < MAX_OPERANDS; ++i)
10509 if (*op_txt[i])
10510 {
10511 if (needcomma)
10512 (*info->fprintf_func) (info->stream, ",");
10513 if (op_index[i] != -1 && !op_riprel[i])
10514 (*info->print_address_func) ((bfd_vma) op_address[op_index[i]], info);
10515 else
10516 (*info->fprintf_func) (info->stream, "%s", op_txt[i]);
10517 needcomma = 1;
10518 }
10519
10520 for (i = 0; i < MAX_OPERANDS; i++)
10521 if (op_index[i] != -1 && op_riprel[i])
10522 {
10523 (*info->fprintf_func) (info->stream, " # ");
10524 (*info->print_address_func) ((bfd_vma) (start_pc + codep - start_codep
10525 + op_address[op_index[i]]), info);
10526 break;
10527 }
10528 return codep - priv.the_buffer;
10529 }
10530
10531 static const char *float_mem[] = {
10532 /* d8 */
10533 "fadd{s|}",
10534 "fmul{s|}",
10535 "fcom{s|}",
10536 "fcomp{s|}",
10537 "fsub{s|}",
10538 "fsubr{s|}",
10539 "fdiv{s|}",
10540 "fdivr{s|}",
10541 /* d9 */
10542 "fld{s|}",
10543 "(bad)",
10544 "fst{s|}",
10545 "fstp{s|}",
10546 "fldenvIC",
10547 "fldcw",
10548 "fNstenvIC",
10549 "fNstcw",
10550 /* da */
10551 "fiadd{l|}",
10552 "fimul{l|}",
10553 "ficom{l|}",
10554 "ficomp{l|}",
10555 "fisub{l|}",
10556 "fisubr{l|}",
10557 "fidiv{l|}",
10558 "fidivr{l|}",
10559 /* db */
10560 "fild{l|}",
10561 "fisttp{l|}",
10562 "fist{l|}",
10563 "fistp{l|}",
10564 "(bad)",
10565 "fld{t||t|}",
10566 "(bad)",
10567 "fstp{t||t|}",
10568 /* dc */
10569 "fadd{l|}",
10570 "fmul{l|}",
10571 "fcom{l|}",
10572 "fcomp{l|}",
10573 "fsub{l|}",
10574 "fsubr{l|}",
10575 "fdiv{l|}",
10576 "fdivr{l|}",
10577 /* dd */
10578 "fld{l|}",
10579 "fisttp{ll|}",
10580 "fst{l||}",
10581 "fstp{l|}",
10582 "frstorIC",
10583 "(bad)",
10584 "fNsaveIC",
10585 "fNstsw",
10586 /* de */
10587 "fiadd",
10588 "fimul",
10589 "ficom",
10590 "ficomp",
10591 "fisub",
10592 "fisubr",
10593 "fidiv",
10594 "fidivr",
10595 /* df */
10596 "fild",
10597 "fisttp",
10598 "fist",
10599 "fistp",
10600 "fbld",
10601 "fild{ll|}",
10602 "fbstp",
10603 "fistp{ll|}",
10604 };
10605
10606 static const unsigned char float_mem_mode[] = {
10607 /* d8 */
10608 d_mode,
10609 d_mode,
10610 d_mode,
10611 d_mode,
10612 d_mode,
10613 d_mode,
10614 d_mode,
10615 d_mode,
10616 /* d9 */
10617 d_mode,
10618 0,
10619 d_mode,
10620 d_mode,
10621 0,
10622 w_mode,
10623 0,
10624 w_mode,
10625 /* da */
10626 d_mode,
10627 d_mode,
10628 d_mode,
10629 d_mode,
10630 d_mode,
10631 d_mode,
10632 d_mode,
10633 d_mode,
10634 /* db */
10635 d_mode,
10636 d_mode,
10637 d_mode,
10638 d_mode,
10639 0,
10640 t_mode,
10641 0,
10642 t_mode,
10643 /* dc */
10644 q_mode,
10645 q_mode,
10646 q_mode,
10647 q_mode,
10648 q_mode,
10649 q_mode,
10650 q_mode,
10651 q_mode,
10652 /* dd */
10653 q_mode,
10654 q_mode,
10655 q_mode,
10656 q_mode,
10657 0,
10658 0,
10659 0,
10660 w_mode,
10661 /* de */
10662 w_mode,
10663 w_mode,
10664 w_mode,
10665 w_mode,
10666 w_mode,
10667 w_mode,
10668 w_mode,
10669 w_mode,
10670 /* df */
10671 w_mode,
10672 w_mode,
10673 w_mode,
10674 w_mode,
10675 t_mode,
10676 q_mode,
10677 t_mode,
10678 q_mode
10679 };
10680
10681 #define ST { OP_ST, 0 }
10682 #define STi { OP_STi, 0 }
10683
10684 #define FGRPd9_2 NULL, { { NULL, 0 } }
10685 #define FGRPd9_4 NULL, { { NULL, 1 } }
10686 #define FGRPd9_5 NULL, { { NULL, 2 } }
10687 #define FGRPd9_6 NULL, { { NULL, 3 } }
10688 #define FGRPd9_7 NULL, { { NULL, 4 } }
10689 #define FGRPda_5 NULL, { { NULL, 5 } }
10690 #define FGRPdb_4 NULL, { { NULL, 6 } }
10691 #define FGRPde_3 NULL, { { NULL, 7 } }
10692 #define FGRPdf_4 NULL, { { NULL, 8 } }
10693
10694 static const struct dis386 float_reg[][8] = {
10695 /* d8 */
10696 {
10697 { "fadd", { ST, STi } },
10698 { "fmul", { ST, STi } },
10699 { "fcom", { STi } },
10700 { "fcomp", { STi } },
10701 { "fsub", { ST, STi } },
10702 { "fsubr", { ST, STi } },
10703 { "fdiv", { ST, STi } },
10704 { "fdivr", { ST, STi } },
10705 },
10706 /* d9 */
10707 {
10708 { "fld", { STi } },
10709 { "fxch", { STi } },
10710 { FGRPd9_2 },
10711 { "(bad)", { XX } },
10712 { FGRPd9_4 },
10713 { FGRPd9_5 },
10714 { FGRPd9_6 },
10715 { FGRPd9_7 },
10716 },
10717 /* da */
10718 {
10719 { "fcmovb", { ST, STi } },
10720 { "fcmove", { ST, STi } },
10721 { "fcmovbe",{ ST, STi } },
10722 { "fcmovu", { ST, STi } },
10723 { "(bad)", { XX } },
10724 { FGRPda_5 },
10725 { "(bad)", { XX } },
10726 { "(bad)", { XX } },
10727 },
10728 /* db */
10729 {
10730 { "fcmovnb",{ ST, STi } },
10731 { "fcmovne",{ ST, STi } },
10732 { "fcmovnbe",{ ST, STi } },
10733 { "fcmovnu",{ ST, STi } },
10734 { FGRPdb_4 },
10735 { "fucomi", { ST, STi } },
10736 { "fcomi", { ST, STi } },
10737 { "(bad)", { XX } },
10738 },
10739 /* dc */
10740 {
10741 { "fadd", { STi, ST } },
10742 { "fmul", { STi, ST } },
10743 { "(bad)", { XX } },
10744 { "(bad)", { XX } },
10745 { "fsub!M", { STi, ST } },
10746 { "fsubM", { STi, ST } },
10747 { "fdiv!M", { STi, ST } },
10748 { "fdivM", { STi, ST } },
10749 },
10750 /* dd */
10751 {
10752 { "ffree", { STi } },
10753 { "(bad)", { XX } },
10754 { "fst", { STi } },
10755 { "fstp", { STi } },
10756 { "fucom", { STi } },
10757 { "fucomp", { STi } },
10758 { "(bad)", { XX } },
10759 { "(bad)", { XX } },
10760 },
10761 /* de */
10762 {
10763 { "faddp", { STi, ST } },
10764 { "fmulp", { STi, ST } },
10765 { "(bad)", { XX } },
10766 { FGRPde_3 },
10767 { "fsub!Mp", { STi, ST } },
10768 { "fsubMp", { STi, ST } },
10769 { "fdiv!Mp", { STi, ST } },
10770 { "fdivMp", { STi, ST } },
10771 },
10772 /* df */
10773 {
10774 { "ffreep", { STi } },
10775 { "(bad)", { XX } },
10776 { "(bad)", { XX } },
10777 { "(bad)", { XX } },
10778 { FGRPdf_4 },
10779 { "fucomip", { ST, STi } },
10780 { "fcomip", { ST, STi } },
10781 { "(bad)", { XX } },
10782 },
10783 };
10784
10785 static char *fgrps[][8] = {
10786 /* d9_2 0 */
10787 {
10788 "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10789 },
10790
10791 /* d9_4 1 */
10792 {
10793 "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
10794 },
10795
10796 /* d9_5 2 */
10797 {
10798 "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
10799 },
10800
10801 /* d9_6 3 */
10802 {
10803 "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
10804 },
10805
10806 /* d9_7 4 */
10807 {
10808 "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
10809 },
10810
10811 /* da_5 5 */
10812 {
10813 "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10814 },
10815
10816 /* db_4 6 */
10817 {
10818 "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
10819 "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
10820 },
10821
10822 /* de_3 7 */
10823 {
10824 "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10825 },
10826
10827 /* df_4 8 */
10828 {
10829 "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10830 },
10831 };
10832
10833 static void
10834 swap_operand (void)
10835 {
10836 mnemonicendp[0] = '.';
10837 mnemonicendp[1] = 's';
10838 mnemonicendp += 2;
10839 }
10840
10841 static void
10842 OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED,
10843 int sizeflag ATTRIBUTE_UNUSED)
10844 {
10845 /* Skip mod/rm byte. */
10846 MODRM_CHECK;
10847 codep++;
10848 }
10849
10850 static void
10851 dofloat (int sizeflag)
10852 {
10853 const struct dis386 *dp;
10854 unsigned char floatop;
10855
10856 floatop = codep[-1];
10857
10858 if (modrm.mod != 3)
10859 {
10860 int fp_indx = (floatop - 0xd8) * 8 + modrm.reg;
10861
10862 putop (float_mem[fp_indx], sizeflag);
10863 obufp = op_out[0];
10864 op_ad = 2;
10865 OP_E (float_mem_mode[fp_indx], sizeflag);
10866 return;
10867 }
10868 /* Skip mod/rm byte. */
10869 MODRM_CHECK;
10870 codep++;
10871
10872 dp = &float_reg[floatop - 0xd8][modrm.reg];
10873 if (dp->name == NULL)
10874 {
10875 putop (fgrps[dp->op[0].bytemode][modrm.rm], sizeflag);
10876
10877 /* Instruction fnstsw is only one with strange arg. */
10878 if (floatop == 0xdf && codep[-1] == 0xe0)
10879 strcpy (op_out[0], names16[0]);
10880 }
10881 else
10882 {
10883 putop (dp->name, sizeflag);
10884
10885 obufp = op_out[0];
10886 op_ad = 2;
10887 if (dp->op[0].rtn)
10888 (*dp->op[0].rtn) (dp->op[0].bytemode, sizeflag);
10889
10890 obufp = op_out[1];
10891 op_ad = 1;
10892 if (dp->op[1].rtn)
10893 (*dp->op[1].rtn) (dp->op[1].bytemode, sizeflag);
10894 }
10895 }
10896
10897 static void
10898 OP_ST (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
10899 {
10900 oappend ("%st" + intel_syntax);
10901 }
10902
10903 static void
10904 OP_STi (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
10905 {
10906 sprintf (scratchbuf, "%%st(%d)", modrm.rm);
10907 oappend (scratchbuf + intel_syntax);
10908 }
10909
10910 /* Capital letters in template are macros. */
10911 static int
10912 putop (const char *in_template, int sizeflag)
10913 {
10914 const char *p;
10915 int alt = 0;
10916 int cond = 1;
10917 unsigned int l = 0, len = 1;
10918 char last[4];
10919
10920 #define SAVE_LAST(c) \
10921 if (l < len && l < sizeof (last)) \
10922 last[l++] = c; \
10923 else \
10924 abort ();
10925
10926 for (p = in_template; *p; p++)
10927 {
10928 switch (*p)
10929 {
10930 default:
10931 *obufp++ = *p;
10932 break;
10933 case '%':
10934 len++;
10935 break;
10936 case '!':
10937 cond = 0;
10938 break;
10939 case '{':
10940 alt = 0;
10941 if (intel_syntax)
10942 {
10943 while (*++p != '|')
10944 if (*p == '}' || *p == '\0')
10945 abort ();
10946 }
10947 /* Fall through. */
10948 case 'I':
10949 alt = 1;
10950 continue;
10951 case '|':
10952 while (*++p != '}')
10953 {
10954 if (*p == '\0')
10955 abort ();
10956 }
10957 break;
10958 case '}':
10959 break;
10960 case 'A':
10961 if (intel_syntax)
10962 break;
10963 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
10964 *obufp++ = 'b';
10965 break;
10966 case 'B':
10967 if (l == 0 && len == 1)
10968 {
10969 case_B:
10970 if (intel_syntax)
10971 break;
10972 if (sizeflag & SUFFIX_ALWAYS)
10973 *obufp++ = 'b';
10974 }
10975 else
10976 {
10977 if (l != 1
10978 || len != 2
10979 || last[0] != 'L')
10980 {
10981 SAVE_LAST (*p);
10982 break;
10983 }
10984
10985 if (address_mode == mode_64bit
10986 && !(prefixes & PREFIX_ADDR))
10987 {
10988 *obufp++ = 'a';
10989 *obufp++ = 'b';
10990 *obufp++ = 's';
10991 }
10992
10993 goto case_B;
10994 }
10995 break;
10996 case 'C':
10997 if (intel_syntax && !alt)
10998 break;
10999 if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
11000 {
11001 if (sizeflag & DFLAG)
11002 *obufp++ = intel_syntax ? 'd' : 'l';
11003 else
11004 *obufp++ = intel_syntax ? 'w' : 's';
11005 used_prefixes |= (prefixes & PREFIX_DATA);
11006 }
11007 break;
11008 case 'D':
11009 if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
11010 break;
11011 USED_REX (REX_W);
11012 if (modrm.mod == 3)
11013 {
11014 if (rex & REX_W)
11015 *obufp++ = 'q';
11016 else if (sizeflag & DFLAG)
11017 *obufp++ = intel_syntax ? 'd' : 'l';
11018 else
11019 *obufp++ = 'w';
11020 used_prefixes |= (prefixes & PREFIX_DATA);
11021 }
11022 else
11023 *obufp++ = 'w';
11024 break;
11025 case 'E': /* For jcxz/jecxz */
11026 if (address_mode == mode_64bit)
11027 {
11028 if (sizeflag & AFLAG)
11029 *obufp++ = 'r';
11030 else
11031 *obufp++ = 'e';
11032 }
11033 else
11034 if (sizeflag & AFLAG)
11035 *obufp++ = 'e';
11036 used_prefixes |= (prefixes & PREFIX_ADDR);
11037 break;
11038 case 'F':
11039 if (intel_syntax)
11040 break;
11041 if ((prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
11042 {
11043 if (sizeflag & AFLAG)
11044 *obufp++ = address_mode == mode_64bit ? 'q' : 'l';
11045 else
11046 *obufp++ = address_mode == mode_64bit ? 'l' : 'w';
11047 used_prefixes |= (prefixes & PREFIX_ADDR);
11048 }
11049 break;
11050 case 'G':
11051 if (intel_syntax || (obufp[-1] != 's' && !(sizeflag & SUFFIX_ALWAYS)))
11052 break;
11053 if ((rex & REX_W) || (sizeflag & DFLAG))
11054 *obufp++ = 'l';
11055 else
11056 *obufp++ = 'w';
11057 if (!(rex & REX_W))
11058 used_prefixes |= (prefixes & PREFIX_DATA);
11059 break;
11060 case 'H':
11061 if (intel_syntax)
11062 break;
11063 if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
11064 || (prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
11065 {
11066 used_prefixes |= prefixes & (PREFIX_CS | PREFIX_DS);
11067 *obufp++ = ',';
11068 *obufp++ = 'p';
11069 if (prefixes & PREFIX_DS)
11070 *obufp++ = 't';
11071 else
11072 *obufp++ = 'n';
11073 }
11074 break;
11075 case 'J':
11076 if (intel_syntax)
11077 break;
11078 *obufp++ = 'l';
11079 break;
11080 case 'K':
11081 USED_REX (REX_W);
11082 if (rex & REX_W)
11083 *obufp++ = 'q';
11084 else
11085 *obufp++ = 'd';
11086 break;
11087 case 'Z':
11088 if (intel_syntax)
11089 break;
11090 if (address_mode == mode_64bit && (sizeflag & SUFFIX_ALWAYS))
11091 {
11092 *obufp++ = 'q';
11093 break;
11094 }
11095 /* Fall through. */
11096 goto case_L;
11097 case 'L':
11098 if (l != 0 || len != 1)
11099 {
11100 SAVE_LAST (*p);
11101 break;
11102 }
11103 case_L:
11104 if (intel_syntax)
11105 break;
11106 if (sizeflag & SUFFIX_ALWAYS)
11107 *obufp++ = 'l';
11108 break;
11109 case 'M':
11110 if (intel_mnemonic != cond)
11111 *obufp++ = 'r';
11112 break;
11113 case 'N':
11114 if ((prefixes & PREFIX_FWAIT) == 0)
11115 *obufp++ = 'n';
11116 else
11117 used_prefixes |= PREFIX_FWAIT;
11118 break;
11119 case 'O':
11120 USED_REX (REX_W);
11121 if (rex & REX_W)
11122 *obufp++ = 'o';
11123 else if (intel_syntax && (sizeflag & DFLAG))
11124 *obufp++ = 'q';
11125 else
11126 *obufp++ = 'd';
11127 if (!(rex & REX_W))
11128 used_prefixes |= (prefixes & PREFIX_DATA);
11129 break;
11130 case 'T':
11131 if (intel_syntax)
11132 break;
11133 if (address_mode == mode_64bit && (sizeflag & DFLAG))
11134 {
11135 *obufp++ = 'q';
11136 break;
11137 }
11138 /* Fall through. */
11139 case 'P':
11140 if (intel_syntax)
11141 break;
11142 if ((prefixes & PREFIX_DATA)
11143 || (rex & REX_W)
11144 || (sizeflag & SUFFIX_ALWAYS))
11145 {
11146 USED_REX (REX_W);
11147 if (rex & REX_W)
11148 *obufp++ = 'q';
11149 else
11150 {
11151 if (sizeflag & DFLAG)
11152 *obufp++ = 'l';
11153 else
11154 *obufp++ = 'w';
11155 }
11156 used_prefixes |= (prefixes & PREFIX_DATA);
11157 }
11158 break;
11159 case 'U':
11160 if (intel_syntax)
11161 break;
11162 if (address_mode == mode_64bit && (sizeflag & DFLAG))
11163 {
11164 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
11165 *obufp++ = 'q';
11166 break;
11167 }
11168 /* Fall through. */
11169 goto case_Q;
11170 case 'Q':
11171 if (l == 0 && len == 1)
11172 {
11173 case_Q:
11174 if (intel_syntax && !alt)
11175 break;
11176 USED_REX (REX_W);
11177 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
11178 {
11179 if (rex & REX_W)
11180 *obufp++ = 'q';
11181 else
11182 {
11183 if (sizeflag & DFLAG)
11184 *obufp++ = intel_syntax ? 'd' : 'l';
11185 else
11186 *obufp++ = 'w';
11187 }
11188 used_prefixes |= (prefixes & PREFIX_DATA);
11189 }
11190 }
11191 else
11192 {
11193 if (l != 1 || len != 2 || last[0] != 'L')
11194 {
11195 SAVE_LAST (*p);
11196 break;
11197 }
11198 if (intel_syntax
11199 || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
11200 break;
11201 if ((rex & REX_W))
11202 {
11203 USED_REX (REX_W);
11204 *obufp++ = 'q';
11205 }
11206 else
11207 *obufp++ = 'l';
11208 }
11209 break;
11210 case 'R':
11211 USED_REX (REX_W);
11212 if (rex & REX_W)
11213 *obufp++ = 'q';
11214 else if (sizeflag & DFLAG)
11215 {
11216 if (intel_syntax)
11217 *obufp++ = 'd';
11218 else
11219 *obufp++ = 'l';
11220 }
11221 else
11222 *obufp++ = 'w';
11223 if (intel_syntax && !p[1]
11224 && ((rex & REX_W) || (sizeflag & DFLAG)))
11225 *obufp++ = 'e';
11226 if (!(rex & REX_W))
11227 used_prefixes |= (prefixes & PREFIX_DATA);
11228 break;
11229 case 'V':
11230 if (l == 0 && len == 1)
11231 {
11232 if (intel_syntax)
11233 break;
11234 if (address_mode == mode_64bit && (sizeflag & DFLAG))
11235 {
11236 if (sizeflag & SUFFIX_ALWAYS)
11237 *obufp++ = 'q';
11238 break;
11239 }
11240 }
11241 else
11242 {
11243 if (l != 1
11244 || len != 2
11245 || last[0] != 'L')
11246 {
11247 SAVE_LAST (*p);
11248 break;
11249 }
11250
11251 if (rex & REX_W)
11252 {
11253 *obufp++ = 'a';
11254 *obufp++ = 'b';
11255 *obufp++ = 's';
11256 }
11257 }
11258 /* Fall through. */
11259 goto case_S;
11260 case 'S':
11261 if (l == 0 && len == 1)
11262 {
11263 case_S:
11264 if (intel_syntax)
11265 break;
11266 if (sizeflag & SUFFIX_ALWAYS)
11267 {
11268 if (rex & REX_W)
11269 *obufp++ = 'q';
11270 else
11271 {
11272 if (sizeflag & DFLAG)
11273 *obufp++ = 'l';
11274 else
11275 *obufp++ = 'w';
11276 used_prefixes |= (prefixes & PREFIX_DATA);
11277 }
11278 }
11279 }
11280 else
11281 {
11282 if (l != 1
11283 || len != 2
11284 || last[0] != 'L')
11285 {
11286 SAVE_LAST (*p);
11287 break;
11288 }
11289
11290 if (address_mode == mode_64bit
11291 && !(prefixes & PREFIX_ADDR))
11292 {
11293 *obufp++ = 'a';
11294 *obufp++ = 'b';
11295 *obufp++ = 's';
11296 }
11297
11298 goto case_S;
11299 }
11300 break;
11301 case 'X':
11302 if (l != 0 || len != 1)
11303 {
11304 SAVE_LAST (*p);
11305 break;
11306 }
11307 if (need_vex && vex.prefix)
11308 {
11309 if (vex.prefix == DATA_PREFIX_OPCODE)
11310 *obufp++ = 'd';
11311 else
11312 *obufp++ = 's';
11313 }
11314 else if (prefixes & PREFIX_DATA)
11315 *obufp++ = 'd';
11316 else
11317 *obufp++ = 's';
11318 used_prefixes |= (prefixes & PREFIX_DATA);
11319 break;
11320 case 'Y':
11321 if (l == 0 && len == 1)
11322 {
11323 if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
11324 break;
11325 if (rex & REX_W)
11326 {
11327 USED_REX (REX_W);
11328 *obufp++ = 'q';
11329 }
11330 break;
11331 }
11332 else
11333 {
11334 if (l != 1 || len != 2 || last[0] != 'X')
11335 {
11336 SAVE_LAST (*p);
11337 break;
11338 }
11339 if (!need_vex)
11340 abort ();
11341 if (intel_syntax
11342 || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
11343 break;
11344 switch (vex.length)
11345 {
11346 case 128:
11347 *obufp++ = 'x';
11348 break;
11349 case 256:
11350 *obufp++ = 'y';
11351 break;
11352 default:
11353 abort ();
11354 }
11355 }
11356 break;
11357 case 'W':
11358 if (l == 0 && len == 1)
11359 {
11360 /* operand size flag for cwtl, cbtw */
11361 USED_REX (REX_W);
11362 if (rex & REX_W)
11363 {
11364 if (intel_syntax)
11365 *obufp++ = 'd';
11366 else
11367 *obufp++ = 'l';
11368 }
11369 else if (sizeflag & DFLAG)
11370 *obufp++ = 'w';
11371 else
11372 *obufp++ = 'b';
11373 if (!(rex & REX_W))
11374 used_prefixes |= (prefixes & PREFIX_DATA);
11375 }
11376 else
11377 {
11378 if (l != 1 || len != 2 || last[0] != 'X')
11379 {
11380 SAVE_LAST (*p);
11381 break;
11382 }
11383 if (!need_vex)
11384 abort ();
11385 *obufp++ = vex.w ? 'd': 's';
11386 }
11387 break;
11388 }
11389 alt = 0;
11390 }
11391 *obufp = 0;
11392 mnemonicendp = obufp;
11393 return 0;
11394 }
11395
11396 static void
11397 oappend (const char *s)
11398 {
11399 obufp = stpcpy (obufp, s);
11400 }
11401
11402 static void
11403 append_seg (void)
11404 {
11405 if (prefixes & PREFIX_CS)
11406 {
11407 used_prefixes |= PREFIX_CS;
11408 oappend ("%cs:" + intel_syntax);
11409 }
11410 if (prefixes & PREFIX_DS)
11411 {
11412 used_prefixes |= PREFIX_DS;
11413 oappend ("%ds:" + intel_syntax);
11414 }
11415 if (prefixes & PREFIX_SS)
11416 {
11417 used_prefixes |= PREFIX_SS;
11418 oappend ("%ss:" + intel_syntax);
11419 }
11420 if (prefixes & PREFIX_ES)
11421 {
11422 used_prefixes |= PREFIX_ES;
11423 oappend ("%es:" + intel_syntax);
11424 }
11425 if (prefixes & PREFIX_FS)
11426 {
11427 used_prefixes |= PREFIX_FS;
11428 oappend ("%fs:" + intel_syntax);
11429 }
11430 if (prefixes & PREFIX_GS)
11431 {
11432 used_prefixes |= PREFIX_GS;
11433 oappend ("%gs:" + intel_syntax);
11434 }
11435 }
11436
11437 static void
11438 OP_indirE (int bytemode, int sizeflag)
11439 {
11440 if (!intel_syntax)
11441 oappend ("*");
11442 OP_E (bytemode, sizeflag);
11443 }
11444
11445 static void
11446 print_operand_value (char *buf, int hex, bfd_vma disp)
11447 {
11448 if (address_mode == mode_64bit)
11449 {
11450 if (hex)
11451 {
11452 char tmp[30];
11453 int i;
11454 buf[0] = '0';
11455 buf[1] = 'x';
11456 sprintf_vma (tmp, disp);
11457 for (i = 0; tmp[i] == '0' && tmp[i + 1]; i++);
11458 strcpy (buf + 2, tmp + i);
11459 }
11460 else
11461 {
11462 bfd_signed_vma v = disp;
11463 char tmp[30];
11464 int i;
11465 if (v < 0)
11466 {
11467 *(buf++) = '-';
11468 v = -disp;
11469 /* Check for possible overflow on 0x8000000000000000. */
11470 if (v < 0)
11471 {
11472 strcpy (buf, "9223372036854775808");
11473 return;
11474 }
11475 }
11476 if (!v)
11477 {
11478 strcpy (buf, "0");
11479 return;
11480 }
11481
11482 i = 0;
11483 tmp[29] = 0;
11484 while (v)
11485 {
11486 tmp[28 - i] = (v % 10) + '0';
11487 v /= 10;
11488 i++;
11489 }
11490 strcpy (buf, tmp + 29 - i);
11491 }
11492 }
11493 else
11494 {
11495 if (hex)
11496 sprintf (buf, "0x%x", (unsigned int) disp);
11497 else
11498 sprintf (buf, "%d", (int) disp);
11499 }
11500 }
11501
11502 /* Put DISP in BUF as signed hex number. */
11503
11504 static void
11505 print_displacement (char *buf, bfd_vma disp)
11506 {
11507 bfd_signed_vma val = disp;
11508 char tmp[30];
11509 int i, j = 0;
11510
11511 if (val < 0)
11512 {
11513 buf[j++] = '-';
11514 val = -disp;
11515
11516 /* Check for possible overflow. */
11517 if (val < 0)
11518 {
11519 switch (address_mode)
11520 {
11521 case mode_64bit:
11522 strcpy (buf + j, "0x8000000000000000");
11523 break;
11524 case mode_32bit:
11525 strcpy (buf + j, "0x80000000");
11526 break;
11527 case mode_16bit:
11528 strcpy (buf + j, "0x8000");
11529 break;
11530 }
11531 return;
11532 }
11533 }
11534
11535 buf[j++] = '0';
11536 buf[j++] = 'x';
11537
11538 sprintf_vma (tmp, (bfd_vma) val);
11539 for (i = 0; tmp[i] == '0'; i++)
11540 continue;
11541 if (tmp[i] == '\0')
11542 i--;
11543 strcpy (buf + j, tmp + i);
11544 }
11545
11546 static void
11547 intel_operand_size (int bytemode, int sizeflag)
11548 {
11549 switch (bytemode)
11550 {
11551 case b_mode:
11552 case b_swap_mode:
11553 case dqb_mode:
11554 oappend ("BYTE PTR ");
11555 break;
11556 case w_mode:
11557 case dqw_mode:
11558 oappend ("WORD PTR ");
11559 break;
11560 case stack_v_mode:
11561 if (address_mode == mode_64bit && (sizeflag & DFLAG))
11562 {
11563 oappend ("QWORD PTR ");
11564 used_prefixes |= (prefixes & PREFIX_DATA);
11565 break;
11566 }
11567 /* FALLTHRU */
11568 case v_mode:
11569 case v_swap_mode:
11570 case dq_mode:
11571 USED_REX (REX_W);
11572 if (rex & REX_W)
11573 oappend ("QWORD PTR ");
11574 else if ((sizeflag & DFLAG) || bytemode == dq_mode)
11575 oappend ("DWORD PTR ");
11576 else
11577 oappend ("WORD PTR ");
11578 used_prefixes |= (prefixes & PREFIX_DATA);
11579 break;
11580 case z_mode:
11581 if ((rex & REX_W) || (sizeflag & DFLAG))
11582 *obufp++ = 'D';
11583 oappend ("WORD PTR ");
11584 if (!(rex & REX_W))
11585 used_prefixes |= (prefixes & PREFIX_DATA);
11586 break;
11587 case a_mode:
11588 if (sizeflag & DFLAG)
11589 oappend ("QWORD PTR ");
11590 else
11591 oappend ("DWORD PTR ");
11592 used_prefixes |= (prefixes & PREFIX_DATA);
11593 break;
11594 case d_mode:
11595 case d_swap_mode:
11596 case dqd_mode:
11597 oappend ("DWORD PTR ");
11598 break;
11599 case q_mode:
11600 case q_swap_mode:
11601 oappend ("QWORD PTR ");
11602 break;
11603 case m_mode:
11604 if (address_mode == mode_64bit)
11605 oappend ("QWORD PTR ");
11606 else
11607 oappend ("DWORD PTR ");
11608 break;
11609 case f_mode:
11610 if (sizeflag & DFLAG)
11611 oappend ("FWORD PTR ");
11612 else
11613 oappend ("DWORD PTR ");
11614 used_prefixes |= (prefixes & PREFIX_DATA);
11615 break;
11616 case t_mode:
11617 oappend ("TBYTE PTR ");
11618 break;
11619 case x_mode:
11620 case x_swap_mode:
11621 if (need_vex)
11622 {
11623 switch (vex.length)
11624 {
11625 case 128:
11626 oappend ("XMMWORD PTR ");
11627 break;
11628 case 256:
11629 oappend ("YMMWORD PTR ");
11630 break;
11631 default:
11632 abort ();
11633 }
11634 }
11635 else
11636 oappend ("XMMWORD PTR ");
11637 break;
11638 case xmm_mode:
11639 oappend ("XMMWORD PTR ");
11640 break;
11641 case xmmq_mode:
11642 if (!need_vex)
11643 abort ();
11644
11645 switch (vex.length)
11646 {
11647 case 128:
11648 oappend ("QWORD PTR ");
11649 break;
11650 case 256:
11651 oappend ("XMMWORD PTR ");
11652 break;
11653 default:
11654 abort ();
11655 }
11656 break;
11657 case ymmq_mode:
11658 if (!need_vex)
11659 abort ();
11660
11661 switch (vex.length)
11662 {
11663 case 128:
11664 oappend ("QWORD PTR ");
11665 break;
11666 case 256:
11667 oappend ("YMMWORD PTR ");
11668 break;
11669 default:
11670 abort ();
11671 }
11672 break;
11673 case o_mode:
11674 oappend ("OWORD PTR ");
11675 break;
11676 case vex_w_dq_mode:
11677 if (!need_vex)
11678 abort ();
11679
11680 if (vex.w)
11681 oappend ("QWORD PTR ");
11682 else
11683 oappend ("DWORD PTR ");
11684 break;
11685 default:
11686 break;
11687 }
11688 }
11689
11690 static void
11691 OP_E_register (int bytemode, int sizeflag)
11692 {
11693 int reg = modrm.rm;
11694 const char **names;
11695
11696 USED_REX (REX_B);
11697 if ((rex & REX_B))
11698 reg += 8;
11699
11700 if ((sizeflag & SUFFIX_ALWAYS)
11701 && (bytemode == b_swap_mode || bytemode == v_swap_mode))
11702 swap_operand ();
11703
11704 switch (bytemode)
11705 {
11706 case b_mode:
11707 case b_swap_mode:
11708 USED_REX (0);
11709 if (rex)
11710 names = names8rex;
11711 else
11712 names = names8;
11713 break;
11714 case w_mode:
11715 names = names16;
11716 break;
11717 case d_mode:
11718 names = names32;
11719 break;
11720 case q_mode:
11721 names = names64;
11722 break;
11723 case m_mode:
11724 names = address_mode == mode_64bit ? names64 : names32;
11725 break;
11726 case stack_v_mode:
11727 if (address_mode == mode_64bit && (sizeflag & DFLAG))
11728 {
11729 names = names64;
11730 used_prefixes |= (prefixes & PREFIX_DATA);
11731 break;
11732 }
11733 bytemode = v_mode;
11734 /* FALLTHRU */
11735 case v_mode:
11736 case v_swap_mode:
11737 case dq_mode:
11738 case dqb_mode:
11739 case dqd_mode:
11740 case dqw_mode:
11741 USED_REX (REX_W);
11742 if (rex & REX_W)
11743 names = names64;
11744 else if ((sizeflag & DFLAG)
11745 || (bytemode != v_mode
11746 && bytemode != v_swap_mode))
11747 names = names32;
11748 else
11749 names = names16;
11750 used_prefixes |= (prefixes & PREFIX_DATA);
11751 break;
11752 case 0:
11753 return;
11754 default:
11755 oappend (INTERNAL_DISASSEMBLER_ERROR);
11756 return;
11757 }
11758 oappend (names[reg]);
11759 }
11760
11761 static void
11762 OP_E_memory (int bytemode, int sizeflag)
11763 {
11764 bfd_vma disp = 0;
11765 int add = (rex & REX_B) ? 8 : 0;
11766 int riprel = 0;
11767
11768 USED_REX (REX_B);
11769 if (intel_syntax)
11770 intel_operand_size (bytemode, sizeflag);
11771 append_seg ();
11772
11773 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
11774 {
11775 /* 32/64 bit address mode */
11776 int havedisp;
11777 int havesib;
11778 int havebase;
11779 int haveindex;
11780 int needindex;
11781 int base, rbase;
11782 int index = 0;
11783 int scale = 0;
11784
11785 havesib = 0;
11786 havebase = 1;
11787 haveindex = 0;
11788 base = modrm.rm;
11789
11790 if (base == 4)
11791 {
11792 havesib = 1;
11793 FETCH_DATA (the_info, codep + 1);
11794 index = (*codep >> 3) & 7;
11795 scale = (*codep >> 6) & 3;
11796 base = *codep & 7;
11797 USED_REX (REX_X);
11798 if (rex & REX_X)
11799 index += 8;
11800 haveindex = index != 4;
11801 codep++;
11802 }
11803 rbase = base + add;
11804
11805 switch (modrm.mod)
11806 {
11807 case 0:
11808 if (base == 5)
11809 {
11810 havebase = 0;
11811 if (address_mode == mode_64bit && !havesib)
11812 riprel = 1;
11813 disp = get32s ();
11814 }
11815 break;
11816 case 1:
11817 FETCH_DATA (the_info, codep + 1);
11818 disp = *codep++;
11819 if ((disp & 0x80) != 0)
11820 disp -= 0x100;
11821 break;
11822 case 2:
11823 disp = get32s ();
11824 break;
11825 }
11826
11827 /* In 32bit mode, we need index register to tell [offset] from
11828 [eiz*1 + offset]. */
11829 needindex = (havesib
11830 && !havebase
11831 && !haveindex
11832 && address_mode == mode_32bit);
11833 havedisp = (havebase
11834 || needindex
11835 || (havesib && (haveindex || scale != 0)));
11836
11837 if (!intel_syntax)
11838 if (modrm.mod != 0 || base == 5)
11839 {
11840 if (havedisp || riprel)
11841 print_displacement (scratchbuf, disp);
11842 else
11843 print_operand_value (scratchbuf, 1, disp);
11844 oappend (scratchbuf);
11845 if (riprel)
11846 {
11847 set_op (disp, 1);
11848 oappend (sizeflag & AFLAG ? "(%rip)" : "(%eip)");
11849 }
11850 }
11851
11852 if (havebase || haveindex || riprel)
11853 used_prefixes |= PREFIX_ADDR;
11854
11855 if (havedisp || (intel_syntax && riprel))
11856 {
11857 *obufp++ = open_char;
11858 if (intel_syntax && riprel)
11859 {
11860 set_op (disp, 1);
11861 oappend (sizeflag & AFLAG ? "rip" : "eip");
11862 }
11863 *obufp = '\0';
11864 if (havebase)
11865 oappend (address_mode == mode_64bit && (sizeflag & AFLAG)
11866 ? names64[rbase] : names32[rbase]);
11867 if (havesib)
11868 {
11869 /* ESP/RSP won't allow index. If base isn't ESP/RSP,
11870 print index to tell base + index from base. */
11871 if (scale != 0
11872 || needindex
11873 || haveindex
11874 || (havebase && base != ESP_REG_NUM))
11875 {
11876 if (!intel_syntax || havebase)
11877 {
11878 *obufp++ = separator_char;
11879 *obufp = '\0';
11880 }
11881 if (haveindex)
11882 oappend (address_mode == mode_64bit
11883 && (sizeflag & AFLAG)
11884 ? names64[index] : names32[index]);
11885 else
11886 oappend (address_mode == mode_64bit
11887 && (sizeflag & AFLAG)
11888 ? index64 : index32);
11889
11890 *obufp++ = scale_char;
11891 *obufp = '\0';
11892 sprintf (scratchbuf, "%d", 1 << scale);
11893 oappend (scratchbuf);
11894 }
11895 }
11896 if (intel_syntax
11897 && (disp || modrm.mod != 0 || base == 5))
11898 {
11899 if (!havedisp || (bfd_signed_vma) disp >= 0)
11900 {
11901 *obufp++ = '+';
11902 *obufp = '\0';
11903 }
11904 else if (modrm.mod != 1 && disp != -disp)
11905 {
11906 *obufp++ = '-';
11907 *obufp = '\0';
11908 disp = - (bfd_signed_vma) disp;
11909 }
11910
11911 if (havedisp)
11912 print_displacement (scratchbuf, disp);
11913 else
11914 print_operand_value (scratchbuf, 1, disp);
11915 oappend (scratchbuf);
11916 }
11917
11918 *obufp++ = close_char;
11919 *obufp = '\0';
11920 }
11921 else if (intel_syntax)
11922 {
11923 if (modrm.mod != 0 || base == 5)
11924 {
11925 if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
11926 | PREFIX_ES | PREFIX_FS | PREFIX_GS))
11927 ;
11928 else
11929 {
11930 oappend (names_seg[ds_reg - es_reg]);
11931 oappend (":");
11932 }
11933 print_operand_value (scratchbuf, 1, disp);
11934 oappend (scratchbuf);
11935 }
11936 }
11937 }
11938 else
11939 { /* 16 bit address mode */
11940 switch (modrm.mod)
11941 {
11942 case 0:
11943 if (modrm.rm == 6)
11944 {
11945 disp = get16 ();
11946 if ((disp & 0x8000) != 0)
11947 disp -= 0x10000;
11948 }
11949 break;
11950 case 1:
11951 FETCH_DATA (the_info, codep + 1);
11952 disp = *codep++;
11953 if ((disp & 0x80) != 0)
11954 disp -= 0x100;
11955 break;
11956 case 2:
11957 disp = get16 ();
11958 if ((disp & 0x8000) != 0)
11959 disp -= 0x10000;
11960 break;
11961 }
11962
11963 if (!intel_syntax)
11964 if (modrm.mod != 0 || modrm.rm == 6)
11965 {
11966 print_displacement (scratchbuf, disp);
11967 oappend (scratchbuf);
11968 }
11969
11970 if (modrm.mod != 0 || modrm.rm != 6)
11971 {
11972 *obufp++ = open_char;
11973 *obufp = '\0';
11974 oappend (index16[modrm.rm]);
11975 if (intel_syntax
11976 && (disp || modrm.mod != 0 || modrm.rm == 6))
11977 {
11978 if ((bfd_signed_vma) disp >= 0)
11979 {
11980 *obufp++ = '+';
11981 *obufp = '\0';
11982 }
11983 else if (modrm.mod != 1)
11984 {
11985 *obufp++ = '-';
11986 *obufp = '\0';
11987 disp = - (bfd_signed_vma) disp;
11988 }
11989
11990 print_displacement (scratchbuf, disp);
11991 oappend (scratchbuf);
11992 }
11993
11994 *obufp++ = close_char;
11995 *obufp = '\0';
11996 }
11997 else if (intel_syntax)
11998 {
11999 if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
12000 | PREFIX_ES | PREFIX_FS | PREFIX_GS))
12001 ;
12002 else
12003 {
12004 oappend (names_seg[ds_reg - es_reg]);
12005 oappend (":");
12006 }
12007 print_operand_value (scratchbuf, 1, disp & 0xffff);
12008 oappend (scratchbuf);
12009 }
12010 }
12011 }
12012
12013 static void
12014 OP_E_extended (int bytemode, int sizeflag)
12015 {
12016 /* Skip mod/rm byte. */
12017 MODRM_CHECK;
12018 codep++;
12019
12020 if (modrm.mod == 3)
12021 OP_E_register (bytemode, sizeflag);
12022 else
12023 OP_E_memory (bytemode, sizeflag);
12024 }
12025
12026 static void
12027 OP_E (int bytemode, int sizeflag)
12028 {
12029 OP_E_extended (bytemode, sizeflag);
12030 }
12031
12032
12033 static void
12034 OP_G (int bytemode, int sizeflag)
12035 {
12036 int add = 0;
12037 USED_REX (REX_R);
12038 if (rex & REX_R)
12039 add += 8;
12040 switch (bytemode)
12041 {
12042 case b_mode:
12043 USED_REX (0);
12044 if (rex)
12045 oappend (names8rex[modrm.reg + add]);
12046 else
12047 oappend (names8[modrm.reg + add]);
12048 break;
12049 case w_mode:
12050 oappend (names16[modrm.reg + add]);
12051 break;
12052 case d_mode:
12053 oappend (names32[modrm.reg + add]);
12054 break;
12055 case q_mode:
12056 oappend (names64[modrm.reg + add]);
12057 break;
12058 case v_mode:
12059 case dq_mode:
12060 case dqb_mode:
12061 case dqd_mode:
12062 case dqw_mode:
12063 USED_REX (REX_W);
12064 if (rex & REX_W)
12065 oappend (names64[modrm.reg + add]);
12066 else if ((sizeflag & DFLAG) || bytemode != v_mode)
12067 oappend (names32[modrm.reg + add]);
12068 else
12069 oappend (names16[modrm.reg + add]);
12070 used_prefixes |= (prefixes & PREFIX_DATA);
12071 break;
12072 case m_mode:
12073 if (address_mode == mode_64bit)
12074 oappend (names64[modrm.reg + add]);
12075 else
12076 oappend (names32[modrm.reg + add]);
12077 break;
12078 default:
12079 oappend (INTERNAL_DISASSEMBLER_ERROR);
12080 break;
12081 }
12082 }
12083
12084 static bfd_vma
12085 get64 (void)
12086 {
12087 bfd_vma x;
12088 #ifdef BFD64
12089 unsigned int a;
12090 unsigned int b;
12091
12092 FETCH_DATA (the_info, codep + 8);
12093 a = *codep++ & 0xff;
12094 a |= (*codep++ & 0xff) << 8;
12095 a |= (*codep++ & 0xff) << 16;
12096 a |= (*codep++ & 0xff) << 24;
12097 b = *codep++ & 0xff;
12098 b |= (*codep++ & 0xff) << 8;
12099 b |= (*codep++ & 0xff) << 16;
12100 b |= (*codep++ & 0xff) << 24;
12101 x = a + ((bfd_vma) b << 32);
12102 #else
12103 abort ();
12104 x = 0;
12105 #endif
12106 return x;
12107 }
12108
12109 static bfd_signed_vma
12110 get32 (void)
12111 {
12112 bfd_signed_vma x = 0;
12113
12114 FETCH_DATA (the_info, codep + 4);
12115 x = *codep++ & (bfd_signed_vma) 0xff;
12116 x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
12117 x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
12118 x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
12119 return x;
12120 }
12121
12122 static bfd_signed_vma
12123 get32s (void)
12124 {
12125 bfd_signed_vma x = 0;
12126
12127 FETCH_DATA (the_info, codep + 4);
12128 x = *codep++ & (bfd_signed_vma) 0xff;
12129 x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
12130 x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
12131 x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
12132
12133 x = (x ^ ((bfd_signed_vma) 1 << 31)) - ((bfd_signed_vma) 1 << 31);
12134
12135 return x;
12136 }
12137
12138 static int
12139 get16 (void)
12140 {
12141 int x = 0;
12142
12143 FETCH_DATA (the_info, codep + 2);
12144 x = *codep++ & 0xff;
12145 x |= (*codep++ & 0xff) << 8;
12146 return x;
12147 }
12148
12149 static void
12150 set_op (bfd_vma op, int riprel)
12151 {
12152 op_index[op_ad] = op_ad;
12153 if (address_mode == mode_64bit)
12154 {
12155 op_address[op_ad] = op;
12156 op_riprel[op_ad] = riprel;
12157 }
12158 else
12159 {
12160 /* Mask to get a 32-bit address. */
12161 op_address[op_ad] = op & 0xffffffff;
12162 op_riprel[op_ad] = riprel & 0xffffffff;
12163 }
12164 }
12165
12166 static void
12167 OP_REG (int code, int sizeflag)
12168 {
12169 const char *s;
12170 int add;
12171 USED_REX (REX_B);
12172 if (rex & REX_B)
12173 add = 8;
12174 else
12175 add = 0;
12176
12177 switch (code)
12178 {
12179 case ax_reg: case cx_reg: case dx_reg: case bx_reg:
12180 case sp_reg: case bp_reg: case si_reg: case di_reg:
12181 s = names16[code - ax_reg + add];
12182 break;
12183 case es_reg: case ss_reg: case cs_reg:
12184 case ds_reg: case fs_reg: case gs_reg:
12185 s = names_seg[code - es_reg + add];
12186 break;
12187 case al_reg: case ah_reg: case cl_reg: case ch_reg:
12188 case dl_reg: case dh_reg: case bl_reg: case bh_reg:
12189 USED_REX (0);
12190 if (rex)
12191 s = names8rex[code - al_reg + add];
12192 else
12193 s = names8[code - al_reg];
12194 break;
12195 case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
12196 case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
12197 if (address_mode == mode_64bit && (sizeflag & DFLAG))
12198 {
12199 s = names64[code - rAX_reg + add];
12200 break;
12201 }
12202 code += eAX_reg - rAX_reg;
12203 /* Fall through. */
12204 case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
12205 case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
12206 USED_REX (REX_W);
12207 if (rex & REX_W)
12208 s = names64[code - eAX_reg + add];
12209 else if (sizeflag & DFLAG)
12210 s = names32[code - eAX_reg + add];
12211 else
12212 s = names16[code - eAX_reg + add];
12213 used_prefixes |= (prefixes & PREFIX_DATA);
12214 break;
12215 default:
12216 s = INTERNAL_DISASSEMBLER_ERROR;
12217 break;
12218 }
12219 oappend (s);
12220 }
12221
12222 static void
12223 OP_IMREG (int code, int sizeflag)
12224 {
12225 const char *s;
12226
12227 switch (code)
12228 {
12229 case indir_dx_reg:
12230 if (intel_syntax)
12231 s = "dx";
12232 else
12233 s = "(%dx)";
12234 break;
12235 case ax_reg: case cx_reg: case dx_reg: case bx_reg:
12236 case sp_reg: case bp_reg: case si_reg: case di_reg:
12237 s = names16[code - ax_reg];
12238 break;
12239 case es_reg: case ss_reg: case cs_reg:
12240 case ds_reg: case fs_reg: case gs_reg:
12241 s = names_seg[code - es_reg];
12242 break;
12243 case al_reg: case ah_reg: case cl_reg: case ch_reg:
12244 case dl_reg: case dh_reg: case bl_reg: case bh_reg:
12245 USED_REX (0);
12246 if (rex)
12247 s = names8rex[code - al_reg];
12248 else
12249 s = names8[code - al_reg];
12250 break;
12251 case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
12252 case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
12253 USED_REX (REX_W);
12254 if (rex & REX_W)
12255 s = names64[code - eAX_reg];
12256 else if (sizeflag & DFLAG)
12257 s = names32[code - eAX_reg];
12258 else
12259 s = names16[code - eAX_reg];
12260 used_prefixes |= (prefixes & PREFIX_DATA);
12261 break;
12262 case z_mode_ax_reg:
12263 if ((rex & REX_W) || (sizeflag & DFLAG))
12264 s = *names32;
12265 else
12266 s = *names16;
12267 if (!(rex & REX_W))
12268 used_prefixes |= (prefixes & PREFIX_DATA);
12269 break;
12270 default:
12271 s = INTERNAL_DISASSEMBLER_ERROR;
12272 break;
12273 }
12274 oappend (s);
12275 }
12276
12277 static void
12278 OP_I (int bytemode, int sizeflag)
12279 {
12280 bfd_signed_vma op;
12281 bfd_signed_vma mask = -1;
12282
12283 switch (bytemode)
12284 {
12285 case b_mode:
12286 FETCH_DATA (the_info, codep + 1);
12287 op = *codep++;
12288 mask = 0xff;
12289 break;
12290 case q_mode:
12291 if (address_mode == mode_64bit)
12292 {
12293 op = get32s ();
12294 break;
12295 }
12296 /* Fall through. */
12297 case v_mode:
12298 USED_REX (REX_W);
12299 if (rex & REX_W)
12300 op = get32s ();
12301 else if (sizeflag & DFLAG)
12302 {
12303 op = get32 ();
12304 mask = 0xffffffff;
12305 }
12306 else
12307 {
12308 op = get16 ();
12309 mask = 0xfffff;
12310 }
12311 used_prefixes |= (prefixes & PREFIX_DATA);
12312 break;
12313 case w_mode:
12314 mask = 0xfffff;
12315 op = get16 ();
12316 break;
12317 case const_1_mode:
12318 if (intel_syntax)
12319 oappend ("1");
12320 return;
12321 default:
12322 oappend (INTERNAL_DISASSEMBLER_ERROR);
12323 return;
12324 }
12325
12326 op &= mask;
12327 scratchbuf[0] = '$';
12328 print_operand_value (scratchbuf + 1, 1, op);
12329 oappend (scratchbuf + intel_syntax);
12330 scratchbuf[0] = '\0';
12331 }
12332
12333 static void
12334 OP_I64 (int bytemode, int sizeflag)
12335 {
12336 bfd_signed_vma op;
12337 bfd_signed_vma mask = -1;
12338
12339 if (address_mode != mode_64bit)
12340 {
12341 OP_I (bytemode, sizeflag);
12342 return;
12343 }
12344
12345 switch (bytemode)
12346 {
12347 case b_mode:
12348 FETCH_DATA (the_info, codep + 1);
12349 op = *codep++;
12350 mask = 0xff;
12351 break;
12352 case v_mode:
12353 USED_REX (REX_W);
12354 if (rex & REX_W)
12355 op = get64 ();
12356 else if (sizeflag & DFLAG)
12357 {
12358 op = get32 ();
12359 mask = 0xffffffff;
12360 }
12361 else
12362 {
12363 op = get16 ();
12364 mask = 0xfffff;
12365 }
12366 used_prefixes |= (prefixes & PREFIX_DATA);
12367 break;
12368 case w_mode:
12369 mask = 0xfffff;
12370 op = get16 ();
12371 break;
12372 default:
12373 oappend (INTERNAL_DISASSEMBLER_ERROR);
12374 return;
12375 }
12376
12377 op &= mask;
12378 scratchbuf[0] = '$';
12379 print_operand_value (scratchbuf + 1, 1, op);
12380 oappend (scratchbuf + intel_syntax);
12381 scratchbuf[0] = '\0';
12382 }
12383
12384 static void
12385 OP_sI (int bytemode, int sizeflag)
12386 {
12387 bfd_signed_vma op;
12388 bfd_signed_vma mask = -1;
12389
12390 switch (bytemode)
12391 {
12392 case b_mode:
12393 FETCH_DATA (the_info, codep + 1);
12394 op = *codep++;
12395 if ((op & 0x80) != 0)
12396 op -= 0x100;
12397 mask = 0xffffffff;
12398 break;
12399 case v_mode:
12400 USED_REX (REX_W);
12401 if (rex & REX_W)
12402 op = get32s ();
12403 else if (sizeflag & DFLAG)
12404 {
12405 op = get32s ();
12406 mask = 0xffffffff;
12407 }
12408 else
12409 {
12410 mask = 0xffffffff;
12411 op = get16 ();
12412 if ((op & 0x8000) != 0)
12413 op -= 0x10000;
12414 }
12415 used_prefixes |= (prefixes & PREFIX_DATA);
12416 break;
12417 case w_mode:
12418 op = get16 ();
12419 mask = 0xffffffff;
12420 if ((op & 0x8000) != 0)
12421 op -= 0x10000;
12422 break;
12423 default:
12424 oappend (INTERNAL_DISASSEMBLER_ERROR);
12425 return;
12426 }
12427
12428 scratchbuf[0] = '$';
12429 print_operand_value (scratchbuf + 1, 1, op);
12430 oappend (scratchbuf + intel_syntax);
12431 }
12432
12433 static void
12434 OP_J (int bytemode, int sizeflag)
12435 {
12436 bfd_vma disp;
12437 bfd_vma mask = -1;
12438 bfd_vma segment = 0;
12439
12440 switch (bytemode)
12441 {
12442 case b_mode:
12443 FETCH_DATA (the_info, codep + 1);
12444 disp = *codep++;
12445 if ((disp & 0x80) != 0)
12446 disp -= 0x100;
12447 break;
12448 case v_mode:
12449 if ((sizeflag & DFLAG) || (rex & REX_W))
12450 disp = get32s ();
12451 else
12452 {
12453 disp = get16 ();
12454 if ((disp & 0x8000) != 0)
12455 disp -= 0x10000;
12456 /* In 16bit mode, address is wrapped around at 64k within
12457 the same segment. Otherwise, a data16 prefix on a jump
12458 instruction means that the pc is masked to 16 bits after
12459 the displacement is added! */
12460 mask = 0xffff;
12461 if ((prefixes & PREFIX_DATA) == 0)
12462 segment = ((start_pc + codep - start_codep)
12463 & ~((bfd_vma) 0xffff));
12464 }
12465 used_prefixes |= (prefixes & PREFIX_DATA);
12466 break;
12467 default:
12468 oappend (INTERNAL_DISASSEMBLER_ERROR);
12469 return;
12470 }
12471 disp = ((start_pc + codep - start_codep + disp) & mask) | segment;
12472 set_op (disp, 0);
12473 print_operand_value (scratchbuf, 1, disp);
12474 oappend (scratchbuf);
12475 }
12476
12477 static void
12478 OP_SEG (int bytemode, int sizeflag)
12479 {
12480 if (bytemode == w_mode)
12481 oappend (names_seg[modrm.reg]);
12482 else
12483 OP_E (modrm.mod == 3 ? bytemode : w_mode, sizeflag);
12484 }
12485
12486 static void
12487 OP_DIR (int dummy ATTRIBUTE_UNUSED, int sizeflag)
12488 {
12489 int seg, offset;
12490
12491 if (sizeflag & DFLAG)
12492 {
12493 offset = get32 ();
12494 seg = get16 ();
12495 }
12496 else
12497 {
12498 offset = get16 ();
12499 seg = get16 ();
12500 }
12501 used_prefixes |= (prefixes & PREFIX_DATA);
12502 if (intel_syntax)
12503 sprintf (scratchbuf, "0x%x:0x%x", seg, offset);
12504 else
12505 sprintf (scratchbuf, "$0x%x,$0x%x", seg, offset);
12506 oappend (scratchbuf);
12507 }
12508
12509 static void
12510 OP_OFF (int bytemode, int sizeflag)
12511 {
12512 bfd_vma off;
12513
12514 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
12515 intel_operand_size (bytemode, sizeflag);
12516 append_seg ();
12517
12518 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
12519 off = get32 ();
12520 else
12521 off = get16 ();
12522
12523 if (intel_syntax)
12524 {
12525 if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
12526 | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
12527 {
12528 oappend (names_seg[ds_reg - es_reg]);
12529 oappend (":");
12530 }
12531 }
12532 print_operand_value (scratchbuf, 1, off);
12533 oappend (scratchbuf);
12534 }
12535
12536 static void
12537 OP_OFF64 (int bytemode, int sizeflag)
12538 {
12539 bfd_vma off;
12540
12541 if (address_mode != mode_64bit
12542 || (prefixes & PREFIX_ADDR))
12543 {
12544 OP_OFF (bytemode, sizeflag);
12545 return;
12546 }
12547
12548 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
12549 intel_operand_size (bytemode, sizeflag);
12550 append_seg ();
12551
12552 off = get64 ();
12553
12554 if (intel_syntax)
12555 {
12556 if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
12557 | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
12558 {
12559 oappend (names_seg[ds_reg - es_reg]);
12560 oappend (":");
12561 }
12562 }
12563 print_operand_value (scratchbuf, 1, off);
12564 oappend (scratchbuf);
12565 }
12566
12567 static void
12568 ptr_reg (int code, int sizeflag)
12569 {
12570 const char *s;
12571
12572 *obufp++ = open_char;
12573 used_prefixes |= (prefixes & PREFIX_ADDR);
12574 if (address_mode == mode_64bit)
12575 {
12576 if (!(sizeflag & AFLAG))
12577 s = names32[code - eAX_reg];
12578 else
12579 s = names64[code - eAX_reg];
12580 }
12581 else if (sizeflag & AFLAG)
12582 s = names32[code - eAX_reg];
12583 else
12584 s = names16[code - eAX_reg];
12585 oappend (s);
12586 *obufp++ = close_char;
12587 *obufp = 0;
12588 }
12589
12590 static void
12591 OP_ESreg (int code, int sizeflag)
12592 {
12593 if (intel_syntax)
12594 {
12595 switch (codep[-1])
12596 {
12597 case 0x6d: /* insw/insl */
12598 intel_operand_size (z_mode, sizeflag);
12599 break;
12600 case 0xa5: /* movsw/movsl/movsq */
12601 case 0xa7: /* cmpsw/cmpsl/cmpsq */
12602 case 0xab: /* stosw/stosl */
12603 case 0xaf: /* scasw/scasl */
12604 intel_operand_size (v_mode, sizeflag);
12605 break;
12606 default:
12607 intel_operand_size (b_mode, sizeflag);
12608 }
12609 }
12610 oappend ("%es:" + intel_syntax);
12611 ptr_reg (code, sizeflag);
12612 }
12613
12614 static void
12615 OP_DSreg (int code, int sizeflag)
12616 {
12617 if (intel_syntax)
12618 {
12619 switch (codep[-1])
12620 {
12621 case 0x6f: /* outsw/outsl */
12622 intel_operand_size (z_mode, sizeflag);
12623 break;
12624 case 0xa5: /* movsw/movsl/movsq */
12625 case 0xa7: /* cmpsw/cmpsl/cmpsq */
12626 case 0xad: /* lodsw/lodsl/lodsq */
12627 intel_operand_size (v_mode, sizeflag);
12628 break;
12629 default:
12630 intel_operand_size (b_mode, sizeflag);
12631 }
12632 }
12633 if ((prefixes
12634 & (PREFIX_CS
12635 | PREFIX_DS
12636 | PREFIX_SS
12637 | PREFIX_ES
12638 | PREFIX_FS
12639 | PREFIX_GS)) == 0)
12640 prefixes |= PREFIX_DS;
12641 append_seg ();
12642 ptr_reg (code, sizeflag);
12643 }
12644
12645 static void
12646 OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12647 {
12648 int add;
12649 if (rex & REX_R)
12650 {
12651 USED_REX (REX_R);
12652 add = 8;
12653 }
12654 else if (address_mode != mode_64bit && (prefixes & PREFIX_LOCK))
12655 {
12656 lock_prefix = NULL;
12657 used_prefixes |= PREFIX_LOCK;
12658 add = 8;
12659 }
12660 else
12661 add = 0;
12662 sprintf (scratchbuf, "%%cr%d", modrm.reg + add);
12663 oappend (scratchbuf + intel_syntax);
12664 }
12665
12666 static void
12667 OP_D (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12668 {
12669 int add;
12670 USED_REX (REX_R);
12671 if (rex & REX_R)
12672 add = 8;
12673 else
12674 add = 0;
12675 if (intel_syntax)
12676 sprintf (scratchbuf, "db%d", modrm.reg + add);
12677 else
12678 sprintf (scratchbuf, "%%db%d", modrm.reg + add);
12679 oappend (scratchbuf);
12680 }
12681
12682 static void
12683 OP_T (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12684 {
12685 sprintf (scratchbuf, "%%tr%d", modrm.reg);
12686 oappend (scratchbuf + intel_syntax);
12687 }
12688
12689 static void
12690 OP_R (int bytemode, int sizeflag)
12691 {
12692 if (modrm.mod == 3)
12693 OP_E (bytemode, sizeflag);
12694 else
12695 BadOp ();
12696 }
12697
12698 static void
12699 OP_MMX (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12700 {
12701 used_prefixes |= (prefixes & PREFIX_DATA);
12702 if (prefixes & PREFIX_DATA)
12703 {
12704 int add;
12705 USED_REX (REX_R);
12706 if (rex & REX_R)
12707 add = 8;
12708 else
12709 add = 0;
12710 sprintf (scratchbuf, "%%xmm%d", modrm.reg + add);
12711 }
12712 else
12713 sprintf (scratchbuf, "%%mm%d", modrm.reg);
12714 oappend (scratchbuf + intel_syntax);
12715 }
12716
12717 static void
12718 OP_XMM (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
12719 {
12720 int add;
12721 USED_REX (REX_R);
12722 if (rex & REX_R)
12723 add = 8;
12724 else
12725 add = 0;
12726 if (need_vex && bytemode != xmm_mode)
12727 {
12728 switch (vex.length)
12729 {
12730 case 128:
12731 sprintf (scratchbuf, "%%xmm%d", modrm.reg + add);
12732 break;
12733 case 256:
12734 sprintf (scratchbuf, "%%ymm%d", modrm.reg + add);
12735 break;
12736 default:
12737 abort ();
12738 }
12739 }
12740 else
12741 sprintf (scratchbuf, "%%xmm%d", modrm.reg + add);
12742 oappend (scratchbuf + intel_syntax);
12743 }
12744
12745 static void
12746 OP_EM (int bytemode, int sizeflag)
12747 {
12748 if (modrm.mod != 3)
12749 {
12750 if (intel_syntax
12751 && (bytemode == v_mode || bytemode == v_swap_mode))
12752 {
12753 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
12754 used_prefixes |= (prefixes & PREFIX_DATA);
12755 }
12756 OP_E (bytemode, sizeflag);
12757 return;
12758 }
12759
12760 if ((sizeflag & SUFFIX_ALWAYS) && bytemode == v_swap_mode)
12761 swap_operand ();
12762
12763 /* Skip mod/rm byte. */
12764 MODRM_CHECK;
12765 codep++;
12766 used_prefixes |= (prefixes & PREFIX_DATA);
12767 if (prefixes & PREFIX_DATA)
12768 {
12769 int add;
12770
12771 USED_REX (REX_B);
12772 if (rex & REX_B)
12773 add = 8;
12774 else
12775 add = 0;
12776 sprintf (scratchbuf, "%%xmm%d", modrm.rm + add);
12777 }
12778 else
12779 sprintf (scratchbuf, "%%mm%d", modrm.rm);
12780 oappend (scratchbuf + intel_syntax);
12781 }
12782
12783 /* cvt* are the only instructions in sse2 which have
12784 both SSE and MMX operands and also have 0x66 prefix
12785 in their opcode. 0x66 was originally used to differentiate
12786 between SSE and MMX instruction(operands). So we have to handle the
12787 cvt* separately using OP_EMC and OP_MXC */
12788 static void
12789 OP_EMC (int bytemode, int sizeflag)
12790 {
12791 if (modrm.mod != 3)
12792 {
12793 if (intel_syntax && bytemode == v_mode)
12794 {
12795 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
12796 used_prefixes |= (prefixes & PREFIX_DATA);
12797 }
12798 OP_E (bytemode, sizeflag);
12799 return;
12800 }
12801
12802 /* Skip mod/rm byte. */
12803 MODRM_CHECK;
12804 codep++;
12805 used_prefixes |= (prefixes & PREFIX_DATA);
12806 sprintf (scratchbuf, "%%mm%d", modrm.rm);
12807 oappend (scratchbuf + intel_syntax);
12808 }
12809
12810 static void
12811 OP_MXC (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12812 {
12813 used_prefixes |= (prefixes & PREFIX_DATA);
12814 sprintf (scratchbuf, "%%mm%d", modrm.reg);
12815 oappend (scratchbuf + intel_syntax);
12816 }
12817
12818 static void
12819 OP_EX (int bytemode, int sizeflag)
12820 {
12821 int add;
12822
12823 /* Skip mod/rm byte. */
12824 MODRM_CHECK;
12825 codep++;
12826
12827 if (modrm.mod != 3)
12828 {
12829 OP_E_memory (bytemode, sizeflag);
12830 return;
12831 }
12832
12833 USED_REX (REX_B);
12834 if (rex & REX_B)
12835 add = 8;
12836 else
12837 add = 0;
12838
12839 if ((sizeflag & SUFFIX_ALWAYS)
12840 && (bytemode == x_swap_mode
12841 || bytemode == d_swap_mode
12842 || bytemode == q_swap_mode))
12843 swap_operand ();
12844
12845 if (need_vex
12846 && bytemode != xmm_mode
12847 && bytemode != xmmq_mode)
12848 {
12849 switch (vex.length)
12850 {
12851 case 128:
12852 sprintf (scratchbuf, "%%xmm%d", modrm.rm + add);
12853 break;
12854 case 256:
12855 sprintf (scratchbuf, "%%ymm%d", modrm.rm + add);
12856 break;
12857 default:
12858 abort ();
12859 }
12860 }
12861 else
12862 sprintf (scratchbuf, "%%xmm%d", modrm.rm + add);
12863 oappend (scratchbuf + intel_syntax);
12864 }
12865
12866 static void
12867 OP_MS (int bytemode, int sizeflag)
12868 {
12869 if (modrm.mod == 3)
12870 OP_EM (bytemode, sizeflag);
12871 else
12872 BadOp ();
12873 }
12874
12875 static void
12876 OP_XS (int bytemode, int sizeflag)
12877 {
12878 if (modrm.mod == 3)
12879 OP_EX (bytemode, sizeflag);
12880 else
12881 BadOp ();
12882 }
12883
12884 static void
12885 OP_M (int bytemode, int sizeflag)
12886 {
12887 if (modrm.mod == 3)
12888 /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
12889 BadOp ();
12890 else
12891 OP_E (bytemode, sizeflag);
12892 }
12893
12894 static void
12895 OP_0f07 (int bytemode, int sizeflag)
12896 {
12897 if (modrm.mod != 3 || modrm.rm != 0)
12898 BadOp ();
12899 else
12900 OP_E (bytemode, sizeflag);
12901 }
12902
12903 /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
12904 32bit mode and "xchg %rax,%rax" in 64bit mode. */
12905
12906 static void
12907 NOP_Fixup1 (int bytemode, int sizeflag)
12908 {
12909 if ((prefixes & PREFIX_DATA) != 0
12910 || (rex != 0
12911 && rex != 0x48
12912 && address_mode == mode_64bit))
12913 OP_REG (bytemode, sizeflag);
12914 else
12915 strcpy (obuf, "nop");
12916 }
12917
12918 static void
12919 NOP_Fixup2 (int bytemode, int sizeflag)
12920 {
12921 if ((prefixes & PREFIX_DATA) != 0
12922 || (rex != 0
12923 && rex != 0x48
12924 && address_mode == mode_64bit))
12925 OP_IMREG (bytemode, sizeflag);
12926 }
12927
12928 static const char *const Suffix3DNow[] = {
12929 /* 00 */ NULL, NULL, NULL, NULL,
12930 /* 04 */ NULL, NULL, NULL, NULL,
12931 /* 08 */ NULL, NULL, NULL, NULL,
12932 /* 0C */ "pi2fw", "pi2fd", NULL, NULL,
12933 /* 10 */ NULL, NULL, NULL, NULL,
12934 /* 14 */ NULL, NULL, NULL, NULL,
12935 /* 18 */ NULL, NULL, NULL, NULL,
12936 /* 1C */ "pf2iw", "pf2id", NULL, NULL,
12937 /* 20 */ NULL, NULL, NULL, NULL,
12938 /* 24 */ NULL, NULL, NULL, NULL,
12939 /* 28 */ NULL, NULL, NULL, NULL,
12940 /* 2C */ NULL, NULL, NULL, NULL,
12941 /* 30 */ NULL, NULL, NULL, NULL,
12942 /* 34 */ NULL, NULL, NULL, NULL,
12943 /* 38 */ NULL, NULL, NULL, NULL,
12944 /* 3C */ NULL, NULL, NULL, NULL,
12945 /* 40 */ NULL, NULL, NULL, NULL,
12946 /* 44 */ NULL, NULL, NULL, NULL,
12947 /* 48 */ NULL, NULL, NULL, NULL,
12948 /* 4C */ NULL, NULL, NULL, NULL,
12949 /* 50 */ NULL, NULL, NULL, NULL,
12950 /* 54 */ NULL, NULL, NULL, NULL,
12951 /* 58 */ NULL, NULL, NULL, NULL,
12952 /* 5C */ NULL, NULL, NULL, NULL,
12953 /* 60 */ NULL, NULL, NULL, NULL,
12954 /* 64 */ NULL, NULL, NULL, NULL,
12955 /* 68 */ NULL, NULL, NULL, NULL,
12956 /* 6C */ NULL, NULL, NULL, NULL,
12957 /* 70 */ NULL, NULL, NULL, NULL,
12958 /* 74 */ NULL, NULL, NULL, NULL,
12959 /* 78 */ NULL, NULL, NULL, NULL,
12960 /* 7C */ NULL, NULL, NULL, NULL,
12961 /* 80 */ NULL, NULL, NULL, NULL,
12962 /* 84 */ NULL, NULL, NULL, NULL,
12963 /* 88 */ NULL, NULL, "pfnacc", NULL,
12964 /* 8C */ NULL, NULL, "pfpnacc", NULL,
12965 /* 90 */ "pfcmpge", NULL, NULL, NULL,
12966 /* 94 */ "pfmin", NULL, "pfrcp", "pfrsqrt",
12967 /* 98 */ NULL, NULL, "pfsub", NULL,
12968 /* 9C */ NULL, NULL, "pfadd", NULL,
12969 /* A0 */ "pfcmpgt", NULL, NULL, NULL,
12970 /* A4 */ "pfmax", NULL, "pfrcpit1", "pfrsqit1",
12971 /* A8 */ NULL, NULL, "pfsubr", NULL,
12972 /* AC */ NULL, NULL, "pfacc", NULL,
12973 /* B0 */ "pfcmpeq", NULL, NULL, NULL,
12974 /* B4 */ "pfmul", NULL, "pfrcpit2", "pmulhrw",
12975 /* B8 */ NULL, NULL, NULL, "pswapd",
12976 /* BC */ NULL, NULL, NULL, "pavgusb",
12977 /* C0 */ NULL, NULL, NULL, NULL,
12978 /* C4 */ NULL, NULL, NULL, NULL,
12979 /* C8 */ NULL, NULL, NULL, NULL,
12980 /* CC */ NULL, NULL, NULL, NULL,
12981 /* D0 */ NULL, NULL, NULL, NULL,
12982 /* D4 */ NULL, NULL, NULL, NULL,
12983 /* D8 */ NULL, NULL, NULL, NULL,
12984 /* DC */ NULL, NULL, NULL, NULL,
12985 /* E0 */ NULL, NULL, NULL, NULL,
12986 /* E4 */ NULL, NULL, NULL, NULL,
12987 /* E8 */ NULL, NULL, NULL, NULL,
12988 /* EC */ NULL, NULL, NULL, NULL,
12989 /* F0 */ NULL, NULL, NULL, NULL,
12990 /* F4 */ NULL, NULL, NULL, NULL,
12991 /* F8 */ NULL, NULL, NULL, NULL,
12992 /* FC */ NULL, NULL, NULL, NULL,
12993 };
12994
12995 static void
12996 OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12997 {
12998 const char *mnemonic;
12999
13000 FETCH_DATA (the_info, codep + 1);
13001 /* AMD 3DNow! instructions are specified by an opcode suffix in the
13002 place where an 8-bit immediate would normally go. ie. the last
13003 byte of the instruction. */
13004 obufp = mnemonicendp;
13005 mnemonic = Suffix3DNow[*codep++ & 0xff];
13006 if (mnemonic)
13007 oappend (mnemonic);
13008 else
13009 {
13010 /* Since a variable sized modrm/sib chunk is between the start
13011 of the opcode (0x0f0f) and the opcode suffix, we need to do
13012 all the modrm processing first, and don't know until now that
13013 we have a bad opcode. This necessitates some cleaning up. */
13014 op_out[0][0] = '\0';
13015 op_out[1][0] = '\0';
13016 BadOp ();
13017 }
13018 mnemonicendp = obufp;
13019 }
13020
13021 static struct op simd_cmp_op[] =
13022 {
13023 { STRING_COMMA_LEN ("eq") },
13024 { STRING_COMMA_LEN ("lt") },
13025 { STRING_COMMA_LEN ("le") },
13026 { STRING_COMMA_LEN ("unord") },
13027 { STRING_COMMA_LEN ("neq") },
13028 { STRING_COMMA_LEN ("nlt") },
13029 { STRING_COMMA_LEN ("nle") },
13030 { STRING_COMMA_LEN ("ord") }
13031 };
13032
13033 static void
13034 CMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13035 {
13036 unsigned int cmp_type;
13037
13038 FETCH_DATA (the_info, codep + 1);
13039 cmp_type = *codep++ & 0xff;
13040 if (cmp_type < ARRAY_SIZE (simd_cmp_op))
13041 {
13042 char suffix [3];
13043 char *p = mnemonicendp - 2;
13044 suffix[0] = p[0];
13045 suffix[1] = p[1];
13046 suffix[2] = '\0';
13047 sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
13048 mnemonicendp += simd_cmp_op[cmp_type].len;
13049 }
13050 else
13051 {
13052 /* We have a reserved extension byte. Output it directly. */
13053 scratchbuf[0] = '$';
13054 print_operand_value (scratchbuf + 1, 1, cmp_type);
13055 oappend (scratchbuf + intel_syntax);
13056 scratchbuf[0] = '\0';
13057 }
13058 }
13059
13060 static void
13061 OP_Mwait (int bytemode ATTRIBUTE_UNUSED,
13062 int sizeflag ATTRIBUTE_UNUSED)
13063 {
13064 /* mwait %eax,%ecx */
13065 if (!intel_syntax)
13066 {
13067 const char **names = (address_mode == mode_64bit
13068 ? names64 : names32);
13069 strcpy (op_out[0], names[0]);
13070 strcpy (op_out[1], names[1]);
13071 two_source_ops = 1;
13072 }
13073 /* Skip mod/rm byte. */
13074 MODRM_CHECK;
13075 codep++;
13076 }
13077
13078 static void
13079 OP_Monitor (int bytemode ATTRIBUTE_UNUSED,
13080 int sizeflag ATTRIBUTE_UNUSED)
13081 {
13082 /* monitor %eax,%ecx,%edx" */
13083 if (!intel_syntax)
13084 {
13085 const char **op1_names;
13086 const char **names = (address_mode == mode_64bit
13087 ? names64 : names32);
13088
13089 if (!(prefixes & PREFIX_ADDR))
13090 op1_names = (address_mode == mode_16bit
13091 ? names16 : names);
13092 else
13093 {
13094 /* Remove "addr16/addr32". */
13095 addr_prefix = NULL;
13096 op1_names = (address_mode != mode_32bit
13097 ? names32 : names16);
13098 used_prefixes |= PREFIX_ADDR;
13099 }
13100 strcpy (op_out[0], op1_names[0]);
13101 strcpy (op_out[1], names[1]);
13102 strcpy (op_out[2], names[2]);
13103 two_source_ops = 1;
13104 }
13105 /* Skip mod/rm byte. */
13106 MODRM_CHECK;
13107 codep++;
13108 }
13109
13110 static void
13111 BadOp (void)
13112 {
13113 /* Throw away prefixes and 1st. opcode byte. */
13114 codep = insn_codep + 1;
13115 oappend ("(bad)");
13116 }
13117
13118 static void
13119 REP_Fixup (int bytemode, int sizeflag)
13120 {
13121 /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
13122 lods and stos. */
13123 if (prefixes & PREFIX_REPZ)
13124 repz_prefix = "rep ";
13125
13126 switch (bytemode)
13127 {
13128 case al_reg:
13129 case eAX_reg:
13130 case indir_dx_reg:
13131 OP_IMREG (bytemode, sizeflag);
13132 break;
13133 case eDI_reg:
13134 OP_ESreg (bytemode, sizeflag);
13135 break;
13136 case eSI_reg:
13137 OP_DSreg (bytemode, sizeflag);
13138 break;
13139 default:
13140 abort ();
13141 break;
13142 }
13143 }
13144
13145 static void
13146 CMPXCHG8B_Fixup (int bytemode, int sizeflag)
13147 {
13148 USED_REX (REX_W);
13149 if (rex & REX_W)
13150 {
13151 /* Change cmpxchg8b to cmpxchg16b. */
13152 char *p = mnemonicendp - 2;
13153 mnemonicendp = stpcpy (p, "16b");
13154 bytemode = o_mode;
13155 }
13156 OP_M (bytemode, sizeflag);
13157 }
13158
13159 static void
13160 XMM_Fixup (int reg, int sizeflag ATTRIBUTE_UNUSED)
13161 {
13162 if (need_vex)
13163 {
13164 switch (vex.length)
13165 {
13166 case 128:
13167 sprintf (scratchbuf, "%%xmm%d", reg);
13168 break;
13169 case 256:
13170 sprintf (scratchbuf, "%%ymm%d", reg);
13171 break;
13172 default:
13173 abort ();
13174 }
13175 }
13176 else
13177 sprintf (scratchbuf, "%%xmm%d", reg);
13178 oappend (scratchbuf + intel_syntax);
13179 }
13180
13181 static void
13182 CRC32_Fixup (int bytemode, int sizeflag)
13183 {
13184 /* Add proper suffix to "crc32". */
13185 char *p = mnemonicendp;
13186
13187 switch (bytemode)
13188 {
13189 case b_mode:
13190 if (intel_syntax)
13191 goto skip;
13192
13193 *p++ = 'b';
13194 break;
13195 case v_mode:
13196 if (intel_syntax)
13197 goto skip;
13198
13199 USED_REX (REX_W);
13200 if (rex & REX_W)
13201 *p++ = 'q';
13202 else if (sizeflag & DFLAG)
13203 *p++ = 'l';
13204 else
13205 *p++ = 'w';
13206 used_prefixes |= (prefixes & PREFIX_DATA);
13207 break;
13208 default:
13209 oappend (INTERNAL_DISASSEMBLER_ERROR);
13210 break;
13211 }
13212 mnemonicendp = p;
13213 *p = '\0';
13214
13215 skip:
13216 if (modrm.mod == 3)
13217 {
13218 int add;
13219
13220 /* Skip mod/rm byte. */
13221 MODRM_CHECK;
13222 codep++;
13223
13224 USED_REX (REX_B);
13225 add = (rex & REX_B) ? 8 : 0;
13226 if (bytemode == b_mode)
13227 {
13228 USED_REX (0);
13229 if (rex)
13230 oappend (names8rex[modrm.rm + add]);
13231 else
13232 oappend (names8[modrm.rm + add]);
13233 }
13234 else
13235 {
13236 USED_REX (REX_W);
13237 if (rex & REX_W)
13238 oappend (names64[modrm.rm + add]);
13239 else if ((prefixes & PREFIX_DATA))
13240 oappend (names16[modrm.rm + add]);
13241 else
13242 oappend (names32[modrm.rm + add]);
13243 }
13244 }
13245 else
13246 OP_E (bytemode, sizeflag);
13247 }
13248
13249 /* Display the destination register operand for instructions with
13250 VEX. */
13251
13252 static void
13253 OP_VEX (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13254 {
13255 if (!need_vex)
13256 abort ();
13257
13258 if (!need_vex_reg)
13259 return;
13260
13261 switch (vex.length)
13262 {
13263 case 128:
13264 switch (bytemode)
13265 {
13266 case vex_mode:
13267 case vex128_mode:
13268 break;
13269 default:
13270 abort ();
13271 return;
13272 }
13273
13274 sprintf (scratchbuf, "%%xmm%d", vex.register_specifier);
13275 break;
13276 case 256:
13277 switch (bytemode)
13278 {
13279 case vex_mode:
13280 case vex256_mode:
13281 break;
13282 default:
13283 abort ();
13284 return;
13285 }
13286
13287 sprintf (scratchbuf, "%%ymm%d", vex.register_specifier);
13288 break;
13289 default:
13290 abort ();
13291 break;
13292 }
13293 oappend (scratchbuf + intel_syntax);
13294 }
13295
13296 /* Get the VEX immediate byte without moving codep. */
13297
13298 static unsigned char
13299 get_vex_imm8 (int sizeflag)
13300 {
13301 int bytes_before_imm = 0;
13302
13303 /* Skip mod/rm byte. */
13304 MODRM_CHECK;
13305 codep++;
13306
13307 if (modrm.mod != 3)
13308 {
13309 /* There are SIB/displacement bytes. */
13310 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
13311 {
13312 /* 32/64 bit address mode */
13313 int base = modrm.rm;
13314
13315 /* Check SIB byte. */
13316 if (base == 4)
13317 {
13318 FETCH_DATA (the_info, codep + 1);
13319 base = *codep & 7;
13320 bytes_before_imm++;
13321 }
13322
13323 switch (modrm.mod)
13324 {
13325 case 0:
13326 /* When modrm.rm == 5 or modrm.rm == 4 and base in
13327 SIB == 5, there is a 4 byte displacement. */
13328 if (base != 5)
13329 /* No displacement. */
13330 break;
13331 case 2:
13332 /* 4 byte displacement. */
13333 bytes_before_imm += 4;
13334 break;
13335 case 1:
13336 /* 1 byte displacement. */
13337 bytes_before_imm++;
13338 break;
13339 }
13340 }
13341 else
13342 { /* 16 bit address mode */
13343 switch (modrm.mod)
13344 {
13345 case 0:
13346 /* When modrm.rm == 6, there is a 2 byte displacement. */
13347 if (modrm.rm != 6)
13348 /* No displacement. */
13349 break;
13350 case 2:
13351 /* 2 byte displacement. */
13352 bytes_before_imm += 2;
13353 break;
13354 case 1:
13355 /* 1 byte displacement. */
13356 bytes_before_imm++;
13357 break;
13358 }
13359 }
13360 }
13361
13362 FETCH_DATA (the_info, codep + bytes_before_imm + 1);
13363 return codep [bytes_before_imm];
13364 }
13365
13366 static void
13367 OP_EX_VexReg (int bytemode, int sizeflag, int reg)
13368 {
13369 if (reg == -1 && modrm.mod != 3)
13370 {
13371 OP_E_memory (bytemode, sizeflag);
13372 return;
13373 }
13374 else
13375 {
13376 if (reg == -1)
13377 {
13378 reg = modrm.rm;
13379 USED_REX (REX_B);
13380 if (rex & REX_B)
13381 reg += 8;
13382 }
13383 else if (reg > 7 && address_mode != mode_64bit)
13384 BadOp ();
13385 }
13386
13387 switch (vex.length)
13388 {
13389 case 128:
13390 sprintf (scratchbuf, "%%xmm%d", reg);
13391 break;
13392 case 256:
13393 sprintf (scratchbuf, "%%ymm%d", reg);
13394 break;
13395 default:
13396 abort ();
13397 }
13398 oappend (scratchbuf + intel_syntax);
13399 }
13400
13401 static void
13402 OP_EX_VexW (int bytemode, int sizeflag)
13403 {
13404 int reg = -1;
13405
13406 if (!vex_w_done)
13407 {
13408 vex_w_done = 1;
13409 if (vex.w)
13410 reg = get_vex_imm8 (sizeflag) >> 4;
13411 }
13412 else
13413 {
13414 if (!vex.w)
13415 reg = get_vex_imm8 (sizeflag) >> 4;
13416 }
13417
13418 OP_EX_VexReg (bytemode, sizeflag, reg);
13419 }
13420
13421 static void
13422 VEXI4_Fixup (int bytemode ATTRIBUTE_UNUSED,
13423 int sizeflag ATTRIBUTE_UNUSED)
13424 {
13425 /* Skip the immediate byte and check for invalid bits. */
13426 FETCH_DATA (the_info, codep + 1);
13427 if (*codep++ & 0xf)
13428 BadOp ();
13429 }
13430
13431 static void
13432 OP_REG_VexI4 (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13433 {
13434 int reg;
13435 FETCH_DATA (the_info, codep + 1);
13436 reg = *codep++;
13437
13438 if (bytemode != x_mode)
13439 abort ();
13440
13441 if (reg & 0xf)
13442 BadOp ();
13443
13444 reg >>= 4;
13445 if (reg > 7 && address_mode != mode_64bit)
13446 BadOp ();
13447
13448 switch (vex.length)
13449 {
13450 case 128:
13451 sprintf (scratchbuf, "%%xmm%d", reg);
13452 break;
13453 case 256:
13454 sprintf (scratchbuf, "%%ymm%d", reg);
13455 break;
13456 default:
13457 abort ();
13458 }
13459 oappend (scratchbuf + intel_syntax);
13460 }
13461
13462 static void
13463 OP_XMM_VexW (int bytemode, int sizeflag)
13464 {
13465 /* Turn off the REX.W bit since it is used for swapping operands
13466 now. */
13467 rex &= ~REX_W;
13468 OP_XMM (bytemode, sizeflag);
13469 }
13470
13471 static void
13472 OP_EX_Vex (int bytemode, int sizeflag)
13473 {
13474 if (modrm.mod != 3)
13475 {
13476 if (vex.register_specifier != 0)
13477 BadOp ();
13478 need_vex_reg = 0;
13479 }
13480 OP_EX (bytemode, sizeflag);
13481 }
13482
13483 static void
13484 OP_XMM_Vex (int bytemode, int sizeflag)
13485 {
13486 if (modrm.mod != 3)
13487 {
13488 if (vex.register_specifier != 0)
13489 BadOp ();
13490 need_vex_reg = 0;
13491 }
13492 OP_XMM (bytemode, sizeflag);
13493 }
13494
13495 static void
13496 VZERO_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13497 {
13498 switch (vex.length)
13499 {
13500 case 128:
13501 mnemonicendp = stpcpy (obuf, "vzeroupper");
13502 break;
13503 case 256:
13504 mnemonicendp = stpcpy (obuf, "vzeroall");
13505 break;
13506 default:
13507 abort ();
13508 }
13509 }
13510
13511 static struct op vex_cmp_op[] =
13512 {
13513 { STRING_COMMA_LEN ("eq") },
13514 { STRING_COMMA_LEN ("lt") },
13515 { STRING_COMMA_LEN ("le") },
13516 { STRING_COMMA_LEN ("unord") },
13517 { STRING_COMMA_LEN ("neq") },
13518 { STRING_COMMA_LEN ("nlt") },
13519 { STRING_COMMA_LEN ("nle") },
13520 { STRING_COMMA_LEN ("ord") },
13521 { STRING_COMMA_LEN ("eq_uq") },
13522 { STRING_COMMA_LEN ("nge") },
13523 { STRING_COMMA_LEN ("ngt") },
13524 { STRING_COMMA_LEN ("false") },
13525 { STRING_COMMA_LEN ("neq_oq") },
13526 { STRING_COMMA_LEN ("ge") },
13527 { STRING_COMMA_LEN ("gt") },
13528 { STRING_COMMA_LEN ("true") },
13529 { STRING_COMMA_LEN ("eq_os") },
13530 { STRING_COMMA_LEN ("lt_oq") },
13531 { STRING_COMMA_LEN ("le_oq") },
13532 { STRING_COMMA_LEN ("unord_s") },
13533 { STRING_COMMA_LEN ("neq_us") },
13534 { STRING_COMMA_LEN ("nlt_uq") },
13535 { STRING_COMMA_LEN ("nle_uq") },
13536 { STRING_COMMA_LEN ("ord_s") },
13537 { STRING_COMMA_LEN ("eq_us") },
13538 { STRING_COMMA_LEN ("nge_uq") },
13539 { STRING_COMMA_LEN ("ngt_uq") },
13540 { STRING_COMMA_LEN ("false_os") },
13541 { STRING_COMMA_LEN ("neq_os") },
13542 { STRING_COMMA_LEN ("ge_oq") },
13543 { STRING_COMMA_LEN ("gt_oq") },
13544 { STRING_COMMA_LEN ("true_us") },
13545 };
13546
13547 static void
13548 VCMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13549 {
13550 unsigned int cmp_type;
13551
13552 FETCH_DATA (the_info, codep + 1);
13553 cmp_type = *codep++ & 0xff;
13554 if (cmp_type < ARRAY_SIZE (vex_cmp_op))
13555 {
13556 char suffix [3];
13557 char *p = mnemonicendp - 2;
13558 suffix[0] = p[0];
13559 suffix[1] = p[1];
13560 suffix[2] = '\0';
13561 sprintf (p, "%s%s", vex_cmp_op[cmp_type].name, suffix);
13562 mnemonicendp += vex_cmp_op[cmp_type].len;
13563 }
13564 else
13565 {
13566 /* We have a reserved extension byte. Output it directly. */
13567 scratchbuf[0] = '$';
13568 print_operand_value (scratchbuf + 1, 1, cmp_type);
13569 oappend (scratchbuf + intel_syntax);
13570 scratchbuf[0] = '\0';
13571 }
13572 }
13573
13574 static const struct op pclmul_op[] =
13575 {
13576 { STRING_COMMA_LEN ("lql") },
13577 { STRING_COMMA_LEN ("hql") },
13578 { STRING_COMMA_LEN ("lqh") },
13579 { STRING_COMMA_LEN ("hqh") }
13580 };
13581
13582 static void
13583 PCLMUL_Fixup (int bytemode ATTRIBUTE_UNUSED,
13584 int sizeflag ATTRIBUTE_UNUSED)
13585 {
13586 unsigned int pclmul_type;
13587
13588 FETCH_DATA (the_info, codep + 1);
13589 pclmul_type = *codep++ & 0xff;
13590 switch (pclmul_type)
13591 {
13592 case 0x10:
13593 pclmul_type = 2;
13594 break;
13595 case 0x11:
13596 pclmul_type = 3;
13597 break;
13598 default:
13599 break;
13600 }
13601 if (pclmul_type < ARRAY_SIZE (pclmul_op))
13602 {
13603 char suffix [4];
13604 char *p = mnemonicendp - 3;
13605 suffix[0] = p[0];
13606 suffix[1] = p[1];
13607 suffix[2] = p[2];
13608 suffix[3] = '\0';
13609 sprintf (p, "%s%s", pclmul_op[pclmul_type].name, suffix);
13610 mnemonicendp += pclmul_op[pclmul_type].len;
13611 }
13612 else
13613 {
13614 /* We have a reserved extension byte. Output it directly. */
13615 scratchbuf[0] = '$';
13616 print_operand_value (scratchbuf + 1, 1, pclmul_type);
13617 oappend (scratchbuf + intel_syntax);
13618 scratchbuf[0] = '\0';
13619 }
13620 }
13621
13622 static void
13623 MOVBE_Fixup (int bytemode, int sizeflag)
13624 {
13625 /* Add proper suffix to "movbe". */
13626 char *p = mnemonicendp;
13627
13628 switch (bytemode)
13629 {
13630 case v_mode:
13631 if (intel_syntax)
13632 goto skip;
13633
13634 USED_REX (REX_W);
13635 if (sizeflag & SUFFIX_ALWAYS)
13636 {
13637 if (rex & REX_W)
13638 *p++ = 'q';
13639 else if (sizeflag & DFLAG)
13640 *p++ = 'l';
13641 else
13642 *p++ = 'w';
13643 }
13644 used_prefixes |= (prefixes & PREFIX_DATA);
13645 break;
13646 default:
13647 oappend (INTERNAL_DISASSEMBLER_ERROR);
13648 break;
13649 }
13650 mnemonicendp = p;
13651 *p = '\0';
13652
13653 skip:
13654 OP_M (bytemode, sizeflag);
13655 }
13656
13657 static void
13658 OP_LWPCB_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13659 {
13660 int reg;
13661 const char **names;
13662
13663 /* Skip mod/rm byte. */
13664 MODRM_CHECK;
13665 codep++;
13666
13667 if (vex.w)
13668 names = names64;
13669 else if (vex.length == 256)
13670 names = names32;
13671 else
13672 names = names16;
13673
13674 reg = modrm.rm;
13675 USED_REX (REX_B);
13676 if (rex & REX_B)
13677 reg += 8;
13678
13679 oappend (names[reg]);
13680 }
13681
13682 static void
13683 OP_LWP_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13684 {
13685 const char **names;
13686
13687 if (vex.w)
13688 names = names64;
13689 else if (vex.length == 256)
13690 names = names32;
13691 else
13692 names = names16;
13693
13694 oappend (names[vex.register_specifier]);
13695 }
13696
13697 static void
13698 OP_LWP_I (int bytemode ATTRIBUTE_UNUSED, int sizeflag)
13699 {
13700 if (vex.w || vex.length == 256)
13701 OP_I (q_mode, sizeflag);
13702 else
13703 OP_I (w_mode, sizeflag);
13704 }
13705