opcodes/
[binutils-gdb.git] / opcodes / i386-dis.c
1 /* Print i386 instructions for GDB, the GNU debugger.
2 Copyright 1988, 1989, 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
4 Free Software Foundation, Inc.
5
6 This file is part of the GNU opcodes library.
7
8 This library is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3, or (at your option)
11 any later version.
12
13 It is distributed in the hope that it will be useful, but WITHOUT
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
16 License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21 MA 02110-1301, USA. */
22
23
24 /* 80386 instruction printer by Pace Willisson (pace@prep.ai.mit.edu)
25 July 1988
26 modified by John Hassey (hassey@dg-rtp.dg.com)
27 x86-64 support added by Jan Hubicka (jh@suse.cz)
28 VIA PadLock support by Michal Ludvig (mludvig@suse.cz). */
29
30 /* The main tables describing the instructions is essentially a copy
31 of the "Opcode Map" chapter (Appendix A) of the Intel 80386
32 Programmers Manual. Usually, there is a capital letter, followed
33 by a small letter. The capital letter tell the addressing mode,
34 and the small letter tells about the operand size. Refer to
35 the Intel manual for details. */
36
37 #include "sysdep.h"
38 #include "dis-asm.h"
39 #include "opintl.h"
40 #include "opcode/i386.h"
41 #include "libiberty.h"
42
43 #include <setjmp.h>
44
45 static int print_insn (bfd_vma, disassemble_info *);
46 static void dofloat (int);
47 static void OP_ST (int, int);
48 static void OP_STi (int, int);
49 static int putop (const char *, int);
50 static void oappend (const char *);
51 static void append_seg (void);
52 static void OP_indirE (int, int);
53 static void print_operand_value (char *, int, bfd_vma);
54 static void OP_E_register (int, int);
55 static void OP_E_memory (int, int);
56 static void print_displacement (char *, bfd_vma);
57 static void OP_E (int, int);
58 static void OP_G (int, int);
59 static bfd_vma get64 (void);
60 static bfd_signed_vma get32 (void);
61 static bfd_signed_vma get32s (void);
62 static int get16 (void);
63 static void set_op (bfd_vma, int);
64 static void OP_Skip_MODRM (int, int);
65 static void OP_REG (int, int);
66 static void OP_IMREG (int, int);
67 static void OP_I (int, int);
68 static void OP_I64 (int, int);
69 static void OP_sI (int, int);
70 static void OP_J (int, int);
71 static void OP_SEG (int, int);
72 static void OP_DIR (int, int);
73 static void OP_OFF (int, int);
74 static void OP_OFF64 (int, int);
75 static void ptr_reg (int, int);
76 static void OP_ESreg (int, int);
77 static void OP_DSreg (int, int);
78 static void OP_C (int, int);
79 static void OP_D (int, int);
80 static void OP_T (int, int);
81 static void OP_R (int, int);
82 static void OP_MMX (int, int);
83 static void OP_XMM (int, int);
84 static void OP_EM (int, int);
85 static void OP_EX (int, int);
86 static void OP_EMC (int,int);
87 static void OP_MXC (int,int);
88 static void OP_MS (int, int);
89 static void OP_XS (int, int);
90 static void OP_M (int, int);
91 static void OP_VEX (int, int);
92 static void OP_EX_Vex (int, int);
93 static void OP_EX_VexW (int, int);
94 static void OP_XMM_Vex (int, int);
95 static void OP_XMM_VexW (int, int);
96 static void OP_REG_VexI4 (int, int);
97 static void PCLMUL_Fixup (int, int);
98 static void VEXI4_Fixup (int, int);
99 static void VZERO_Fixup (int, int);
100 static void VCMP_Fixup (int, int);
101 static void OP_0f07 (int, int);
102 static void OP_Monitor (int, int);
103 static void OP_Mwait (int, int);
104 static void NOP_Fixup1 (int, int);
105 static void NOP_Fixup2 (int, int);
106 static void OP_3DNowSuffix (int, int);
107 static void CMP_Fixup (int, int);
108 static void BadOp (void);
109 static void REP_Fixup (int, int);
110 static void CMPXCHG8B_Fixup (int, int);
111 static void XMM_Fixup (int, int);
112 static void CRC32_Fixup (int, int);
113 static void OP_LWPCB_E (int, int);
114 static void OP_LWP_E (int, int);
115 static void OP_LWP_I (int, int);
116
117 static void MOVBE_Fixup (int, int);
118
119 struct dis_private {
120 /* Points to first byte not fetched. */
121 bfd_byte *max_fetched;
122 bfd_byte the_buffer[MAX_MNEM_SIZE];
123 bfd_vma insn_start;
124 int orig_sizeflag;
125 jmp_buf bailout;
126 };
127
128 enum address_mode
129 {
130 mode_16bit,
131 mode_32bit,
132 mode_64bit
133 };
134
135 enum address_mode address_mode;
136
137 /* Flags for the prefixes for the current instruction. See below. */
138 static int prefixes;
139
140 /* REX prefix the current instruction. See below. */
141 static int rex;
142 /* Bits of REX we've already used. */
143 static int rex_used;
144 /* Original REX prefix. */
145 static int rex_original;
146 /* REX bits in original REX prefix ignored. It may not be the same
147 as rex_original since some bits may not be ignored. */
148 static int rex_ignored;
149 /* Mark parts used in the REX prefix. When we are testing for
150 empty prefix (for 8bit register REX extension), just mask it
151 out. Otherwise test for REX bit is excuse for existence of REX
152 only in case value is nonzero. */
153 #define USED_REX(value) \
154 { \
155 if (value) \
156 { \
157 if ((rex & value)) \
158 rex_used |= (value) | REX_OPCODE; \
159 } \
160 else \
161 rex_used |= REX_OPCODE; \
162 }
163
164 /* Flags for prefixes which we somehow handled when printing the
165 current instruction. */
166 static int used_prefixes;
167
168 /* Flags stored in PREFIXES. */
169 #define PREFIX_REPZ 1
170 #define PREFIX_REPNZ 2
171 #define PREFIX_LOCK 4
172 #define PREFIX_CS 8
173 #define PREFIX_SS 0x10
174 #define PREFIX_DS 0x20
175 #define PREFIX_ES 0x40
176 #define PREFIX_FS 0x80
177 #define PREFIX_GS 0x100
178 #define PREFIX_DATA 0x200
179 #define PREFIX_ADDR 0x400
180 #define PREFIX_FWAIT 0x800
181
182 /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
183 to ADDR (exclusive) are valid. Returns 1 for success, longjmps
184 on error. */
185 #define FETCH_DATA(info, addr) \
186 ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \
187 ? 1 : fetch_data ((info), (addr)))
188
189 static int
190 fetch_data (struct disassemble_info *info, bfd_byte *addr)
191 {
192 int status;
193 struct dis_private *priv = (struct dis_private *) info->private_data;
194 bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer);
195
196 if (addr <= priv->the_buffer + MAX_MNEM_SIZE)
197 status = (*info->read_memory_func) (start,
198 priv->max_fetched,
199 addr - priv->max_fetched,
200 info);
201 else
202 status = -1;
203 if (status != 0)
204 {
205 /* If we did manage to read at least one byte, then
206 print_insn_i386 will do something sensible. Otherwise, print
207 an error. We do that here because this is where we know
208 STATUS. */
209 if (priv->max_fetched == priv->the_buffer)
210 (*info->memory_error_func) (status, start, info);
211 longjmp (priv->bailout, 1);
212 }
213 else
214 priv->max_fetched = addr;
215 return 1;
216 }
217
218 #define XX { NULL, 0 }
219
220 #define Eb { OP_E, b_mode }
221 #define EbS { OP_E, b_swap_mode }
222 #define Ev { OP_E, v_mode }
223 #define EvS { OP_E, v_swap_mode }
224 #define Ed { OP_E, d_mode }
225 #define Edq { OP_E, dq_mode }
226 #define Edqw { OP_E, dqw_mode }
227 #define Edqb { OP_E, dqb_mode }
228 #define Edqd { OP_E, dqd_mode }
229 #define Eq { OP_E, q_mode }
230 #define indirEv { OP_indirE, stack_v_mode }
231 #define indirEp { OP_indirE, f_mode }
232 #define stackEv { OP_E, stack_v_mode }
233 #define Em { OP_E, m_mode }
234 #define Ew { OP_E, w_mode }
235 #define M { OP_M, 0 } /* lea, lgdt, etc. */
236 #define Ma { OP_M, a_mode }
237 #define Mb { OP_M, b_mode }
238 #define Md { OP_M, d_mode }
239 #define Mo { OP_M, o_mode }
240 #define Mp { OP_M, f_mode } /* 32 or 48 bit memory operand for LDS, LES etc */
241 #define Mq { OP_M, q_mode }
242 #define Mx { OP_M, x_mode }
243 #define Mxmm { OP_M, xmm_mode }
244 #define Gb { OP_G, b_mode }
245 #define Gv { OP_G, v_mode }
246 #define Gd { OP_G, d_mode }
247 #define Gdq { OP_G, dq_mode }
248 #define Gm { OP_G, m_mode }
249 #define Gw { OP_G, w_mode }
250 #define Rd { OP_R, d_mode }
251 #define Rm { OP_R, m_mode }
252 #define Ib { OP_I, b_mode }
253 #define sIb { OP_sI, b_mode } /* sign extened byte */
254 #define Iv { OP_I, v_mode }
255 #define Iq { OP_I, q_mode }
256 #define Iv64 { OP_I64, v_mode }
257 #define Iw { OP_I, w_mode }
258 #define I1 { OP_I, const_1_mode }
259 #define Jb { OP_J, b_mode }
260 #define Jv { OP_J, v_mode }
261 #define Cm { OP_C, m_mode }
262 #define Dm { OP_D, m_mode }
263 #define Td { OP_T, d_mode }
264 #define Skip_MODRM { OP_Skip_MODRM, 0 }
265
266 #define RMeAX { OP_REG, eAX_reg }
267 #define RMeBX { OP_REG, eBX_reg }
268 #define RMeCX { OP_REG, eCX_reg }
269 #define RMeDX { OP_REG, eDX_reg }
270 #define RMeSP { OP_REG, eSP_reg }
271 #define RMeBP { OP_REG, eBP_reg }
272 #define RMeSI { OP_REG, eSI_reg }
273 #define RMeDI { OP_REG, eDI_reg }
274 #define RMrAX { OP_REG, rAX_reg }
275 #define RMrBX { OP_REG, rBX_reg }
276 #define RMrCX { OP_REG, rCX_reg }
277 #define RMrDX { OP_REG, rDX_reg }
278 #define RMrSP { OP_REG, rSP_reg }
279 #define RMrBP { OP_REG, rBP_reg }
280 #define RMrSI { OP_REG, rSI_reg }
281 #define RMrDI { OP_REG, rDI_reg }
282 #define RMAL { OP_REG, al_reg }
283 #define RMAL { OP_REG, al_reg }
284 #define RMCL { OP_REG, cl_reg }
285 #define RMDL { OP_REG, dl_reg }
286 #define RMBL { OP_REG, bl_reg }
287 #define RMAH { OP_REG, ah_reg }
288 #define RMCH { OP_REG, ch_reg }
289 #define RMDH { OP_REG, dh_reg }
290 #define RMBH { OP_REG, bh_reg }
291 #define RMAX { OP_REG, ax_reg }
292 #define RMDX { OP_REG, dx_reg }
293
294 #define eAX { OP_IMREG, eAX_reg }
295 #define eBX { OP_IMREG, eBX_reg }
296 #define eCX { OP_IMREG, eCX_reg }
297 #define eDX { OP_IMREG, eDX_reg }
298 #define eSP { OP_IMREG, eSP_reg }
299 #define eBP { OP_IMREG, eBP_reg }
300 #define eSI { OP_IMREG, eSI_reg }
301 #define eDI { OP_IMREG, eDI_reg }
302 #define AL { OP_IMREG, al_reg }
303 #define CL { OP_IMREG, cl_reg }
304 #define DL { OP_IMREG, dl_reg }
305 #define BL { OP_IMREG, bl_reg }
306 #define AH { OP_IMREG, ah_reg }
307 #define CH { OP_IMREG, ch_reg }
308 #define DH { OP_IMREG, dh_reg }
309 #define BH { OP_IMREG, bh_reg }
310 #define AX { OP_IMREG, ax_reg }
311 #define DX { OP_IMREG, dx_reg }
312 #define zAX { OP_IMREG, z_mode_ax_reg }
313 #define indirDX { OP_IMREG, indir_dx_reg }
314
315 #define Sw { OP_SEG, w_mode }
316 #define Sv { OP_SEG, v_mode }
317 #define Ap { OP_DIR, 0 }
318 #define Ob { OP_OFF64, b_mode }
319 #define Ov { OP_OFF64, v_mode }
320 #define Xb { OP_DSreg, eSI_reg }
321 #define Xv { OP_DSreg, eSI_reg }
322 #define Xz { OP_DSreg, eSI_reg }
323 #define Yb { OP_ESreg, eDI_reg }
324 #define Yv { OP_ESreg, eDI_reg }
325 #define DSBX { OP_DSreg, eBX_reg }
326
327 #define es { OP_REG, es_reg }
328 #define ss { OP_REG, ss_reg }
329 #define cs { OP_REG, cs_reg }
330 #define ds { OP_REG, ds_reg }
331 #define fs { OP_REG, fs_reg }
332 #define gs { OP_REG, gs_reg }
333
334 #define MX { OP_MMX, 0 }
335 #define XM { OP_XMM, 0 }
336 #define XMM { OP_XMM, xmm_mode }
337 #define EM { OP_EM, v_mode }
338 #define EMS { OP_EM, v_swap_mode }
339 #define EMd { OP_EM, d_mode }
340 #define EMx { OP_EM, x_mode }
341 #define EXw { OP_EX, w_mode }
342 #define EXd { OP_EX, d_mode }
343 #define EXdS { OP_EX, d_swap_mode }
344 #define EXq { OP_EX, q_mode }
345 #define EXqS { OP_EX, q_swap_mode }
346 #define EXx { OP_EX, x_mode }
347 #define EXxS { OP_EX, x_swap_mode }
348 #define EXxmm { OP_EX, xmm_mode }
349 #define EXxmmq { OP_EX, xmmq_mode }
350 #define EXymmq { OP_EX, ymmq_mode }
351 #define EXVexWdq { OP_EX, vex_w_dq_mode }
352 #define MS { OP_MS, v_mode }
353 #define XS { OP_XS, v_mode }
354 #define EMCq { OP_EMC, q_mode }
355 #define MXC { OP_MXC, 0 }
356 #define OPSUF { OP_3DNowSuffix, 0 }
357 #define CMP { CMP_Fixup, 0 }
358 #define XMM0 { XMM_Fixup, 0 }
359
360 #define Vex { OP_VEX, vex_mode }
361 #define Vex128 { OP_VEX, vex128_mode }
362 #define Vex256 { OP_VEX, vex256_mode }
363 #define VexI4 { VEXI4_Fixup, 0}
364 #define EXdVex { OP_EX_Vex, d_mode }
365 #define EXdVexS { OP_EX_Vex, d_swap_mode }
366 #define EXqVex { OP_EX_Vex, q_mode }
367 #define EXqVexS { OP_EX_Vex, q_swap_mode }
368 #define EXVexW { OP_EX_VexW, x_mode }
369 #define EXdVexW { OP_EX_VexW, d_mode }
370 #define EXqVexW { OP_EX_VexW, q_mode }
371 #define XMVex { OP_XMM_Vex, 0 }
372 #define XMVexW { OP_XMM_VexW, 0 }
373 #define XMVexI4 { OP_REG_VexI4, x_mode }
374 #define PCLMUL { PCLMUL_Fixup, 0 }
375 #define VZERO { VZERO_Fixup, 0 }
376 #define VCMP { VCMP_Fixup, 0 }
377
378 /* Used handle "rep" prefix for string instructions. */
379 #define Xbr { REP_Fixup, eSI_reg }
380 #define Xvr { REP_Fixup, eSI_reg }
381 #define Ybr { REP_Fixup, eDI_reg }
382 #define Yvr { REP_Fixup, eDI_reg }
383 #define Yzr { REP_Fixup, eDI_reg }
384 #define indirDXr { REP_Fixup, indir_dx_reg }
385 #define ALr { REP_Fixup, al_reg }
386 #define eAXr { REP_Fixup, eAX_reg }
387
388 #define cond_jump_flag { NULL, cond_jump_mode }
389 #define loop_jcxz_flag { NULL, loop_jcxz_mode }
390
391 /* bits in sizeflag */
392 #define SUFFIX_ALWAYS 4
393 #define AFLAG 2
394 #define DFLAG 1
395
396 enum
397 {
398 /* byte operand */
399 b_mode = 1,
400 /* byte operand with operand swapped */
401 b_swap_mode,
402 /* operand size depends on prefixes */
403 v_mode,
404 /* operand size depends on prefixes with operand swapped */
405 v_swap_mode,
406 /* word operand */
407 w_mode,
408 /* double word operand */
409 d_mode,
410 /* double word operand with operand swapped */
411 d_swap_mode,
412 /* quad word operand */
413 q_mode,
414 /* quad word operand with operand swapped */
415 q_swap_mode,
416 /* ten-byte operand */
417 t_mode,
418 /* 16-byte XMM or 32-byte YMM operand */
419 x_mode,
420 /* 16-byte XMM or 32-byte YMM operand with operand swapped */
421 x_swap_mode,
422 /* 16-byte XMM operand */
423 xmm_mode,
424 /* 16-byte XMM or quad word operand */
425 xmmq_mode,
426 /* 32-byte YMM or quad word operand */
427 ymmq_mode,
428 /* d_mode in 32bit, q_mode in 64bit mode. */
429 m_mode,
430 /* pair of v_mode operands */
431 a_mode,
432 cond_jump_mode,
433 loop_jcxz_mode,
434 /* operand size depends on REX prefixes. */
435 dq_mode,
436 /* registers like dq_mode, memory like w_mode. */
437 dqw_mode,
438 /* 4- or 6-byte pointer operand */
439 f_mode,
440 const_1_mode,
441 /* v_mode for stack-related opcodes. */
442 stack_v_mode,
443 /* non-quad operand size depends on prefixes */
444 z_mode,
445 /* 16-byte operand */
446 o_mode,
447 /* registers like dq_mode, memory like b_mode. */
448 dqb_mode,
449 /* registers like dq_mode, memory like d_mode. */
450 dqd_mode,
451 /* normal vex mode */
452 vex_mode,
453 /* 128bit vex mode */
454 vex128_mode,
455 /* 256bit vex mode */
456 vex256_mode,
457 /* operand size depends on the VEX.W bit. */
458 vex_w_dq_mode,
459
460 es_reg,
461 cs_reg,
462 ss_reg,
463 ds_reg,
464 fs_reg,
465 gs_reg,
466
467 eAX_reg,
468 eCX_reg,
469 eDX_reg,
470 eBX_reg,
471 eSP_reg,
472 eBP_reg,
473 eSI_reg,
474 eDI_reg,
475
476 al_reg,
477 cl_reg,
478 dl_reg,
479 bl_reg,
480 ah_reg,
481 ch_reg,
482 dh_reg,
483 bh_reg,
484
485 ax_reg,
486 cx_reg,
487 dx_reg,
488 bx_reg,
489 sp_reg,
490 bp_reg,
491 si_reg,
492 di_reg,
493
494 rAX_reg,
495 rCX_reg,
496 rDX_reg,
497 rBX_reg,
498 rSP_reg,
499 rBP_reg,
500 rSI_reg,
501 rDI_reg,
502
503 z_mode_ax_reg,
504 indir_dx_reg
505 };
506
507 enum
508 {
509 FLOATCODE = 1,
510 USE_REG_TABLE,
511 USE_MOD_TABLE,
512 USE_RM_TABLE,
513 USE_PREFIX_TABLE,
514 USE_X86_64_TABLE,
515 USE_3BYTE_TABLE,
516 USE_XOP_8F_TABLE,
517 USE_VEX_C4_TABLE,
518 USE_VEX_C5_TABLE,
519 USE_VEX_LEN_TABLE
520 };
521
522 #define FLOAT NULL, { { NULL, FLOATCODE } }
523
524 #define DIS386(T, I) NULL, { { NULL, (T)}, { NULL, (I) } }
525 #define REG_TABLE(I) DIS386 (USE_REG_TABLE, (I))
526 #define MOD_TABLE(I) DIS386 (USE_MOD_TABLE, (I))
527 #define RM_TABLE(I) DIS386 (USE_RM_TABLE, (I))
528 #define PREFIX_TABLE(I) DIS386 (USE_PREFIX_TABLE, (I))
529 #define X86_64_TABLE(I) DIS386 (USE_X86_64_TABLE, (I))
530 #define THREE_BYTE_TABLE(I) DIS386 (USE_3BYTE_TABLE, (I))
531 #define XOP_8F_TABLE(I) DIS386 (USE_XOP_8F_TABLE, (I))
532 #define VEX_C4_TABLE(I) DIS386 (USE_VEX_C4_TABLE, (I))
533 #define VEX_C5_TABLE(I) DIS386 (USE_VEX_C5_TABLE, (I))
534 #define VEX_LEN_TABLE(I) DIS386 (USE_VEX_LEN_TABLE, (I))
535
536 enum
537 {
538 REG_80 = 0,
539 REG_81,
540 REG_82,
541 REG_8F,
542 REG_C0,
543 REG_C1,
544 REG_C6,
545 REG_C7,
546 REG_D0,
547 REG_D1,
548 REG_D2,
549 REG_D3,
550 REG_F6,
551 REG_F7,
552 REG_FE,
553 REG_FF,
554 REG_0F00,
555 REG_0F01,
556 REG_0F0D,
557 REG_0F18,
558 REG_0F71,
559 REG_0F72,
560 REG_0F73,
561 REG_0FA6,
562 REG_0FA7,
563 REG_0FAE,
564 REG_0FBA,
565 REG_0FC7,
566 REG_VEX_71,
567 REG_VEX_72,
568 REG_VEX_73,
569 REG_VEX_AE,
570 REG_XOP_LWPCB,
571 REG_XOP_LWP
572 };
573
574 enum
575 {
576 MOD_8D = 0,
577 MOD_0F01_REG_0,
578 MOD_0F01_REG_1,
579 MOD_0F01_REG_2,
580 MOD_0F01_REG_3,
581 MOD_0F01_REG_7,
582 MOD_0F12_PREFIX_0,
583 MOD_0F13,
584 MOD_0F16_PREFIX_0,
585 MOD_0F17,
586 MOD_0F18_REG_0,
587 MOD_0F18_REG_1,
588 MOD_0F18_REG_2,
589 MOD_0F18_REG_3,
590 MOD_0F20,
591 MOD_0F21,
592 MOD_0F22,
593 MOD_0F23,
594 MOD_0F24,
595 MOD_0F26,
596 MOD_0F2B_PREFIX_0,
597 MOD_0F2B_PREFIX_1,
598 MOD_0F2B_PREFIX_2,
599 MOD_0F2B_PREFIX_3,
600 MOD_0F51,
601 MOD_0F71_REG_2,
602 MOD_0F71_REG_4,
603 MOD_0F71_REG_6,
604 MOD_0F72_REG_2,
605 MOD_0F72_REG_4,
606 MOD_0F72_REG_6,
607 MOD_0F73_REG_2,
608 MOD_0F73_REG_3,
609 MOD_0F73_REG_6,
610 MOD_0F73_REG_7,
611 MOD_0FAE_REG_0,
612 MOD_0FAE_REG_1,
613 MOD_0FAE_REG_2,
614 MOD_0FAE_REG_3,
615 MOD_0FAE_REG_4,
616 MOD_0FAE_REG_5,
617 MOD_0FAE_REG_6,
618 MOD_0FAE_REG_7,
619 MOD_0FB2,
620 MOD_0FB4,
621 MOD_0FB5,
622 MOD_0FC7_REG_6,
623 MOD_0FC7_REG_7,
624 MOD_0FD7,
625 MOD_0FE7_PREFIX_2,
626 MOD_0FF0_PREFIX_3,
627 MOD_0F382A_PREFIX_2,
628 MOD_62_32BIT,
629 MOD_C4_32BIT,
630 MOD_C5_32BIT,
631 MOD_VEX_12_PREFIX_0,
632 MOD_VEX_13,
633 MOD_VEX_16_PREFIX_0,
634 MOD_VEX_17,
635 MOD_VEX_2B,
636 MOD_VEX_51,
637 MOD_VEX_71_REG_2,
638 MOD_VEX_71_REG_4,
639 MOD_VEX_71_REG_6,
640 MOD_VEX_72_REG_2,
641 MOD_VEX_72_REG_4,
642 MOD_VEX_72_REG_6,
643 MOD_VEX_73_REG_2,
644 MOD_VEX_73_REG_3,
645 MOD_VEX_73_REG_6,
646 MOD_VEX_73_REG_7,
647 MOD_VEX_AE_REG_2,
648 MOD_VEX_AE_REG_3,
649 MOD_VEX_D7_PREFIX_2,
650 MOD_VEX_E7_PREFIX_2,
651 MOD_VEX_F0_PREFIX_3,
652 MOD_VEX_3818_PREFIX_2,
653 MOD_VEX_3819_PREFIX_2,
654 MOD_VEX_381A_PREFIX_2,
655 MOD_VEX_382A_PREFIX_2,
656 MOD_VEX_382C_PREFIX_2,
657 MOD_VEX_382D_PREFIX_2,
658 MOD_VEX_382E_PREFIX_2,
659 MOD_VEX_382F_PREFIX_2
660 };
661
662 enum
663 {
664 RM_0F01_REG_0 = 0,
665 RM_0F01_REG_1,
666 RM_0F01_REG_2,
667 RM_0F01_REG_3,
668 RM_0F01_REG_7,
669 RM_0FAE_REG_5,
670 RM_0FAE_REG_6,
671 RM_0FAE_REG_7
672 };
673
674 enum
675 {
676 PREFIX_90 = 0,
677 PREFIX_0F10,
678 PREFIX_0F11,
679 PREFIX_0F12,
680 PREFIX_0F16,
681 PREFIX_0F2A,
682 PREFIX_0F2B,
683 PREFIX_0F2C,
684 PREFIX_0F2D,
685 PREFIX_0F2E,
686 PREFIX_0F2F,
687 PREFIX_0F51,
688 PREFIX_0F52,
689 PREFIX_0F53,
690 PREFIX_0F58,
691 PREFIX_0F59,
692 PREFIX_0F5A,
693 PREFIX_0F5B,
694 PREFIX_0F5C,
695 PREFIX_0F5D,
696 PREFIX_0F5E,
697 PREFIX_0F5F,
698 PREFIX_0F60,
699 PREFIX_0F61,
700 PREFIX_0F62,
701 PREFIX_0F6C,
702 PREFIX_0F6D,
703 PREFIX_0F6F,
704 PREFIX_0F70,
705 PREFIX_0F73_REG_3,
706 PREFIX_0F73_REG_7,
707 PREFIX_0F78,
708 PREFIX_0F79,
709 PREFIX_0F7C,
710 PREFIX_0F7D,
711 PREFIX_0F7E,
712 PREFIX_0F7F,
713 PREFIX_0FB8,
714 PREFIX_0FBD,
715 PREFIX_0FC2,
716 PREFIX_0FC3,
717 PREFIX_0FC7_REG_6,
718 PREFIX_0FD0,
719 PREFIX_0FD6,
720 PREFIX_0FE6,
721 PREFIX_0FE7,
722 PREFIX_0FF0,
723 PREFIX_0FF7,
724 PREFIX_0F3810,
725 PREFIX_0F3814,
726 PREFIX_0F3815,
727 PREFIX_0F3817,
728 PREFIX_0F3820,
729 PREFIX_0F3821,
730 PREFIX_0F3822,
731 PREFIX_0F3823,
732 PREFIX_0F3824,
733 PREFIX_0F3825,
734 PREFIX_0F3828,
735 PREFIX_0F3829,
736 PREFIX_0F382A,
737 PREFIX_0F382B,
738 PREFIX_0F3830,
739 PREFIX_0F3831,
740 PREFIX_0F3832,
741 PREFIX_0F3833,
742 PREFIX_0F3834,
743 PREFIX_0F3835,
744 PREFIX_0F3837,
745 PREFIX_0F3838,
746 PREFIX_0F3839,
747 PREFIX_0F383A,
748 PREFIX_0F383B,
749 PREFIX_0F383C,
750 PREFIX_0F383D,
751 PREFIX_0F383E,
752 PREFIX_0F383F,
753 PREFIX_0F3840,
754 PREFIX_0F3841,
755 PREFIX_0F3880,
756 PREFIX_0F3881,
757 PREFIX_0F38DB,
758 PREFIX_0F38DC,
759 PREFIX_0F38DD,
760 PREFIX_0F38DE,
761 PREFIX_0F38DF,
762 PREFIX_0F38F0,
763 PREFIX_0F38F1,
764 PREFIX_0F3A08,
765 PREFIX_0F3A09,
766 PREFIX_0F3A0A,
767 PREFIX_0F3A0B,
768 PREFIX_0F3A0C,
769 PREFIX_0F3A0D,
770 PREFIX_0F3A0E,
771 PREFIX_0F3A14,
772 PREFIX_0F3A15,
773 PREFIX_0F3A16,
774 PREFIX_0F3A17,
775 PREFIX_0F3A20,
776 PREFIX_0F3A21,
777 PREFIX_0F3A22,
778 PREFIX_0F3A40,
779 PREFIX_0F3A41,
780 PREFIX_0F3A42,
781 PREFIX_0F3A44,
782 PREFIX_0F3A60,
783 PREFIX_0F3A61,
784 PREFIX_0F3A62,
785 PREFIX_0F3A63,
786 PREFIX_0F3ADF,
787 PREFIX_VEX_10,
788 PREFIX_VEX_11,
789 PREFIX_VEX_12,
790 PREFIX_VEX_16,
791 PREFIX_VEX_2A,
792 PREFIX_VEX_2C,
793 PREFIX_VEX_2D,
794 PREFIX_VEX_2E,
795 PREFIX_VEX_2F,
796 PREFIX_VEX_51,
797 PREFIX_VEX_52,
798 PREFIX_VEX_53,
799 PREFIX_VEX_58,
800 PREFIX_VEX_59,
801 PREFIX_VEX_5A,
802 PREFIX_VEX_5B,
803 PREFIX_VEX_5C,
804 PREFIX_VEX_5D,
805 PREFIX_VEX_5E,
806 PREFIX_VEX_5F,
807 PREFIX_VEX_60,
808 PREFIX_VEX_61,
809 PREFIX_VEX_62,
810 PREFIX_VEX_63,
811 PREFIX_VEX_64,
812 PREFIX_VEX_65,
813 PREFIX_VEX_66,
814 PREFIX_VEX_67,
815 PREFIX_VEX_68,
816 PREFIX_VEX_69,
817 PREFIX_VEX_6A,
818 PREFIX_VEX_6B,
819 PREFIX_VEX_6C,
820 PREFIX_VEX_6D,
821 PREFIX_VEX_6E,
822 PREFIX_VEX_6F,
823 PREFIX_VEX_70,
824 PREFIX_VEX_71_REG_2,
825 PREFIX_VEX_71_REG_4,
826 PREFIX_VEX_71_REG_6,
827 PREFIX_VEX_72_REG_2,
828 PREFIX_VEX_72_REG_4,
829 PREFIX_VEX_72_REG_6,
830 PREFIX_VEX_73_REG_2,
831 PREFIX_VEX_73_REG_3,
832 PREFIX_VEX_73_REG_6,
833 PREFIX_VEX_73_REG_7,
834 PREFIX_VEX_74,
835 PREFIX_VEX_75,
836 PREFIX_VEX_76,
837 PREFIX_VEX_77,
838 PREFIX_VEX_7C,
839 PREFIX_VEX_7D,
840 PREFIX_VEX_7E,
841 PREFIX_VEX_7F,
842 PREFIX_VEX_C2,
843 PREFIX_VEX_C4,
844 PREFIX_VEX_C5,
845 PREFIX_VEX_D0,
846 PREFIX_VEX_D1,
847 PREFIX_VEX_D2,
848 PREFIX_VEX_D3,
849 PREFIX_VEX_D4,
850 PREFIX_VEX_D5,
851 PREFIX_VEX_D6,
852 PREFIX_VEX_D7,
853 PREFIX_VEX_D8,
854 PREFIX_VEX_D9,
855 PREFIX_VEX_DA,
856 PREFIX_VEX_DB,
857 PREFIX_VEX_DC,
858 PREFIX_VEX_DD,
859 PREFIX_VEX_DE,
860 PREFIX_VEX_DF,
861 PREFIX_VEX_E0,
862 PREFIX_VEX_E1,
863 PREFIX_VEX_E2,
864 PREFIX_VEX_E3,
865 PREFIX_VEX_E4,
866 PREFIX_VEX_E5,
867 PREFIX_VEX_E6,
868 PREFIX_VEX_E7,
869 PREFIX_VEX_E8,
870 PREFIX_VEX_E9,
871 PREFIX_VEX_EA,
872 PREFIX_VEX_EB,
873 PREFIX_VEX_EC,
874 PREFIX_VEX_ED,
875 PREFIX_VEX_EE,
876 PREFIX_VEX_EF,
877 PREFIX_VEX_F0,
878 PREFIX_VEX_F1,
879 PREFIX_VEX_F2,
880 PREFIX_VEX_F3,
881 PREFIX_VEX_F4,
882 PREFIX_VEX_F5,
883 PREFIX_VEX_F6,
884 PREFIX_VEX_F7,
885 PREFIX_VEX_F8,
886 PREFIX_VEX_F9,
887 PREFIX_VEX_FA,
888 PREFIX_VEX_FB,
889 PREFIX_VEX_FC,
890 PREFIX_VEX_FD,
891 PREFIX_VEX_FE,
892 PREFIX_VEX_3800,
893 PREFIX_VEX_3801,
894 PREFIX_VEX_3802,
895 PREFIX_VEX_3803,
896 PREFIX_VEX_3804,
897 PREFIX_VEX_3805,
898 PREFIX_VEX_3806,
899 PREFIX_VEX_3807,
900 PREFIX_VEX_3808,
901 PREFIX_VEX_3809,
902 PREFIX_VEX_380A,
903 PREFIX_VEX_380B,
904 PREFIX_VEX_380C,
905 PREFIX_VEX_380D,
906 PREFIX_VEX_380E,
907 PREFIX_VEX_380F,
908 PREFIX_VEX_3817,
909 PREFIX_VEX_3818,
910 PREFIX_VEX_3819,
911 PREFIX_VEX_381A,
912 PREFIX_VEX_381C,
913 PREFIX_VEX_381D,
914 PREFIX_VEX_381E,
915 PREFIX_VEX_3820,
916 PREFIX_VEX_3821,
917 PREFIX_VEX_3822,
918 PREFIX_VEX_3823,
919 PREFIX_VEX_3824,
920 PREFIX_VEX_3825,
921 PREFIX_VEX_3828,
922 PREFIX_VEX_3829,
923 PREFIX_VEX_382A,
924 PREFIX_VEX_382B,
925 PREFIX_VEX_382C,
926 PREFIX_VEX_382D,
927 PREFIX_VEX_382E,
928 PREFIX_VEX_382F,
929 PREFIX_VEX_3830,
930 PREFIX_VEX_3831,
931 PREFIX_VEX_3832,
932 PREFIX_VEX_3833,
933 PREFIX_VEX_3834,
934 PREFIX_VEX_3835,
935 PREFIX_VEX_3837,
936 PREFIX_VEX_3838,
937 PREFIX_VEX_3839,
938 PREFIX_VEX_383A,
939 PREFIX_VEX_383B,
940 PREFIX_VEX_383C,
941 PREFIX_VEX_383D,
942 PREFIX_VEX_383E,
943 PREFIX_VEX_383F,
944 PREFIX_VEX_3840,
945 PREFIX_VEX_3841,
946 PREFIX_VEX_3896,
947 PREFIX_VEX_3897,
948 PREFIX_VEX_3898,
949 PREFIX_VEX_3899,
950 PREFIX_VEX_389A,
951 PREFIX_VEX_389B,
952 PREFIX_VEX_389C,
953 PREFIX_VEX_389D,
954 PREFIX_VEX_389E,
955 PREFIX_VEX_389F,
956 PREFIX_VEX_38A6,
957 PREFIX_VEX_38A7,
958 PREFIX_VEX_38A8,
959 PREFIX_VEX_38A9,
960 PREFIX_VEX_38AA,
961 PREFIX_VEX_38AB,
962 PREFIX_VEX_38AC,
963 PREFIX_VEX_38AD,
964 PREFIX_VEX_38AE,
965 PREFIX_VEX_38AF,
966 PREFIX_VEX_38B6,
967 PREFIX_VEX_38B7,
968 PREFIX_VEX_38B8,
969 PREFIX_VEX_38B9,
970 PREFIX_VEX_38BA,
971 PREFIX_VEX_38BB,
972 PREFIX_VEX_38BC,
973 PREFIX_VEX_38BD,
974 PREFIX_VEX_38BE,
975 PREFIX_VEX_38BF,
976 PREFIX_VEX_38DB,
977 PREFIX_VEX_38DC,
978 PREFIX_VEX_38DD,
979 PREFIX_VEX_38DE,
980 PREFIX_VEX_38DF,
981 PREFIX_VEX_3A04,
982 PREFIX_VEX_3A05,
983 PREFIX_VEX_3A06,
984 PREFIX_VEX_3A08,
985 PREFIX_VEX_3A09,
986 PREFIX_VEX_3A0A,
987 PREFIX_VEX_3A0B,
988 PREFIX_VEX_3A0C,
989 PREFIX_VEX_3A0D,
990 PREFIX_VEX_3A0E,
991 PREFIX_VEX_3A0F,
992 PREFIX_VEX_3A14,
993 PREFIX_VEX_3A15,
994 PREFIX_VEX_3A16,
995 PREFIX_VEX_3A17,
996 PREFIX_VEX_3A18,
997 PREFIX_VEX_3A19,
998 PREFIX_VEX_3A20,
999 PREFIX_VEX_3A21,
1000 PREFIX_VEX_3A22,
1001 PREFIX_VEX_3A40,
1002 PREFIX_VEX_3A41,
1003 PREFIX_VEX_3A42,
1004 PREFIX_VEX_3A44,
1005 PREFIX_VEX_3A4A,
1006 PREFIX_VEX_3A4B,
1007 PREFIX_VEX_3A4C,
1008 PREFIX_VEX_3A5C,
1009 PREFIX_VEX_3A5D,
1010 PREFIX_VEX_3A5E,
1011 PREFIX_VEX_3A5F,
1012 PREFIX_VEX_3A60,
1013 PREFIX_VEX_3A61,
1014 PREFIX_VEX_3A62,
1015 PREFIX_VEX_3A63,
1016 PREFIX_VEX_3A68,
1017 PREFIX_VEX_3A69,
1018 PREFIX_VEX_3A6A,
1019 PREFIX_VEX_3A6B,
1020 PREFIX_VEX_3A6C,
1021 PREFIX_VEX_3A6D,
1022 PREFIX_VEX_3A6E,
1023 PREFIX_VEX_3A6F,
1024 PREFIX_VEX_3A78,
1025 PREFIX_VEX_3A79,
1026 PREFIX_VEX_3A7A,
1027 PREFIX_VEX_3A7B,
1028 PREFIX_VEX_3A7C,
1029 PREFIX_VEX_3A7D,
1030 PREFIX_VEX_3A7E,
1031 PREFIX_VEX_3A7F,
1032 PREFIX_VEX_3ADF
1033 };
1034
1035 enum
1036 {
1037 X86_64_06 = 0,
1038 X86_64_07,
1039 X86_64_0D,
1040 X86_64_16,
1041 X86_64_17,
1042 X86_64_1E,
1043 X86_64_1F,
1044 X86_64_27,
1045 X86_64_2F,
1046 X86_64_37,
1047 X86_64_3F,
1048 X86_64_60,
1049 X86_64_61,
1050 X86_64_62,
1051 X86_64_63,
1052 X86_64_6D,
1053 X86_64_6F,
1054 X86_64_9A,
1055 X86_64_C4,
1056 X86_64_C5,
1057 X86_64_CE,
1058 X86_64_D4,
1059 X86_64_D5,
1060 X86_64_EA,
1061 X86_64_0F01_REG_0,
1062 X86_64_0F01_REG_1,
1063 X86_64_0F01_REG_2,
1064 X86_64_0F01_REG_3
1065 };
1066
1067 enum
1068 {
1069 THREE_BYTE_0F38 = 0,
1070 THREE_BYTE_0F3A,
1071 THREE_BYTE_0F7A
1072 };
1073
1074 enum
1075 {
1076 XOP_09 = 0,
1077 XOP_0A
1078 };
1079
1080 enum
1081 {
1082 VEX_0F = 0,
1083 VEX_0F38,
1084 VEX_0F3A
1085 };
1086
1087 enum
1088 {
1089 VEX_LEN_10_P_1 = 0,
1090 VEX_LEN_10_P_3,
1091 VEX_LEN_11_P_1,
1092 VEX_LEN_11_P_3,
1093 VEX_LEN_12_P_0_M_0,
1094 VEX_LEN_12_P_0_M_1,
1095 VEX_LEN_12_P_2,
1096 VEX_LEN_13_M_0,
1097 VEX_LEN_16_P_0_M_0,
1098 VEX_LEN_16_P_0_M_1,
1099 VEX_LEN_16_P_2,
1100 VEX_LEN_17_M_0,
1101 VEX_LEN_2A_P_1,
1102 VEX_LEN_2A_P_3,
1103 VEX_LEN_2C_P_1,
1104 VEX_LEN_2C_P_3,
1105 VEX_LEN_2D_P_1,
1106 VEX_LEN_2D_P_3,
1107 VEX_LEN_2E_P_0,
1108 VEX_LEN_2E_P_2,
1109 VEX_LEN_2F_P_0,
1110 VEX_LEN_2F_P_2,
1111 VEX_LEN_51_P_1,
1112 VEX_LEN_51_P_3,
1113 VEX_LEN_52_P_1,
1114 VEX_LEN_53_P_1,
1115 VEX_LEN_58_P_1,
1116 VEX_LEN_58_P_3,
1117 VEX_LEN_59_P_1,
1118 VEX_LEN_59_P_3,
1119 VEX_LEN_5A_P_1,
1120 VEX_LEN_5A_P_3,
1121 VEX_LEN_5C_P_1,
1122 VEX_LEN_5C_P_3,
1123 VEX_LEN_5D_P_1,
1124 VEX_LEN_5D_P_3,
1125 VEX_LEN_5E_P_1,
1126 VEX_LEN_5E_P_3,
1127 VEX_LEN_5F_P_1,
1128 VEX_LEN_5F_P_3,
1129 VEX_LEN_60_P_2,
1130 VEX_LEN_61_P_2,
1131 VEX_LEN_62_P_2,
1132 VEX_LEN_63_P_2,
1133 VEX_LEN_64_P_2,
1134 VEX_LEN_65_P_2,
1135 VEX_LEN_66_P_2,
1136 VEX_LEN_67_P_2,
1137 VEX_LEN_68_P_2,
1138 VEX_LEN_69_P_2,
1139 VEX_LEN_6A_P_2,
1140 VEX_LEN_6B_P_2,
1141 VEX_LEN_6C_P_2,
1142 VEX_LEN_6D_P_2,
1143 VEX_LEN_6E_P_2,
1144 VEX_LEN_70_P_1,
1145 VEX_LEN_70_P_2,
1146 VEX_LEN_70_P_3,
1147 VEX_LEN_71_R_2_P_2,
1148 VEX_LEN_71_R_4_P_2,
1149 VEX_LEN_71_R_6_P_2,
1150 VEX_LEN_72_R_2_P_2,
1151 VEX_LEN_72_R_4_P_2,
1152 VEX_LEN_72_R_6_P_2,
1153 VEX_LEN_73_R_2_P_2,
1154 VEX_LEN_73_R_3_P_2,
1155 VEX_LEN_73_R_6_P_2,
1156 VEX_LEN_73_R_7_P_2,
1157 VEX_LEN_74_P_2,
1158 VEX_LEN_75_P_2,
1159 VEX_LEN_76_P_2,
1160 VEX_LEN_7E_P_1,
1161 VEX_LEN_7E_P_2,
1162 VEX_LEN_AE_R_2_M_0,
1163 VEX_LEN_AE_R_3_M_0,
1164 VEX_LEN_C2_P_1,
1165 VEX_LEN_C2_P_3,
1166 VEX_LEN_C4_P_2,
1167 VEX_LEN_C5_P_2,
1168 VEX_LEN_D1_P_2,
1169 VEX_LEN_D2_P_2,
1170 VEX_LEN_D3_P_2,
1171 VEX_LEN_D4_P_2,
1172 VEX_LEN_D5_P_2,
1173 VEX_LEN_D6_P_2,
1174 VEX_LEN_D7_P_2_M_1,
1175 VEX_LEN_D8_P_2,
1176 VEX_LEN_D9_P_2,
1177 VEX_LEN_DA_P_2,
1178 VEX_LEN_DB_P_2,
1179 VEX_LEN_DC_P_2,
1180 VEX_LEN_DD_P_2,
1181 VEX_LEN_DE_P_2,
1182 VEX_LEN_DF_P_2,
1183 VEX_LEN_E0_P_2,
1184 VEX_LEN_E1_P_2,
1185 VEX_LEN_E2_P_2,
1186 VEX_LEN_E3_P_2,
1187 VEX_LEN_E4_P_2,
1188 VEX_LEN_E5_P_2,
1189 VEX_LEN_E8_P_2,
1190 VEX_LEN_E9_P_2,
1191 VEX_LEN_EA_P_2,
1192 VEX_LEN_EB_P_2,
1193 VEX_LEN_EC_P_2,
1194 VEX_LEN_ED_P_2,
1195 VEX_LEN_EE_P_2,
1196 VEX_LEN_EF_P_2,
1197 VEX_LEN_F1_P_2,
1198 VEX_LEN_F2_P_2,
1199 VEX_LEN_F3_P_2,
1200 VEX_LEN_F4_P_2,
1201 VEX_LEN_F5_P_2,
1202 VEX_LEN_F6_P_2,
1203 VEX_LEN_F7_P_2,
1204 VEX_LEN_F8_P_2,
1205 VEX_LEN_F9_P_2,
1206 VEX_LEN_FA_P_2,
1207 VEX_LEN_FB_P_2,
1208 VEX_LEN_FC_P_2,
1209 VEX_LEN_FD_P_2,
1210 VEX_LEN_FE_P_2,
1211 VEX_LEN_3800_P_2,
1212 VEX_LEN_3801_P_2,
1213 VEX_LEN_3802_P_2,
1214 VEX_LEN_3803_P_2,
1215 VEX_LEN_3804_P_2,
1216 VEX_LEN_3805_P_2,
1217 VEX_LEN_3806_P_2,
1218 VEX_LEN_3807_P_2,
1219 VEX_LEN_3808_P_2,
1220 VEX_LEN_3809_P_2,
1221 VEX_LEN_380A_P_2,
1222 VEX_LEN_380B_P_2,
1223 VEX_LEN_3819_P_2_M_0,
1224 VEX_LEN_381A_P_2_M_0,
1225 VEX_LEN_381C_P_2,
1226 VEX_LEN_381D_P_2,
1227 VEX_LEN_381E_P_2,
1228 VEX_LEN_3820_P_2,
1229 VEX_LEN_3821_P_2,
1230 VEX_LEN_3822_P_2,
1231 VEX_LEN_3823_P_2,
1232 VEX_LEN_3824_P_2,
1233 VEX_LEN_3825_P_2,
1234 VEX_LEN_3828_P_2,
1235 VEX_LEN_3829_P_2,
1236 VEX_LEN_382A_P_2_M_0,
1237 VEX_LEN_382B_P_2,
1238 VEX_LEN_3830_P_2,
1239 VEX_LEN_3831_P_2,
1240 VEX_LEN_3832_P_2,
1241 VEX_LEN_3833_P_2,
1242 VEX_LEN_3834_P_2,
1243 VEX_LEN_3835_P_2,
1244 VEX_LEN_3837_P_2,
1245 VEX_LEN_3838_P_2,
1246 VEX_LEN_3839_P_2,
1247 VEX_LEN_383A_P_2,
1248 VEX_LEN_383B_P_2,
1249 VEX_LEN_383C_P_2,
1250 VEX_LEN_383D_P_2,
1251 VEX_LEN_383E_P_2,
1252 VEX_LEN_383F_P_2,
1253 VEX_LEN_3840_P_2,
1254 VEX_LEN_3841_P_2,
1255 VEX_LEN_38DB_P_2,
1256 VEX_LEN_38DC_P_2,
1257 VEX_LEN_38DD_P_2,
1258 VEX_LEN_38DE_P_2,
1259 VEX_LEN_38DF_P_2,
1260 VEX_LEN_3A06_P_2,
1261 VEX_LEN_3A0A_P_2,
1262 VEX_LEN_3A0B_P_2,
1263 VEX_LEN_3A0E_P_2,
1264 VEX_LEN_3A0F_P_2,
1265 VEX_LEN_3A14_P_2,
1266 VEX_LEN_3A15_P_2,
1267 VEX_LEN_3A16_P_2,
1268 VEX_LEN_3A17_P_2,
1269 VEX_LEN_3A18_P_2,
1270 VEX_LEN_3A19_P_2,
1271 VEX_LEN_3A20_P_2,
1272 VEX_LEN_3A21_P_2,
1273 VEX_LEN_3A22_P_2,
1274 VEX_LEN_3A41_P_2,
1275 VEX_LEN_3A42_P_2,
1276 VEX_LEN_3A44_P_2,
1277 VEX_LEN_3A4C_P_2,
1278 VEX_LEN_3A60_P_2,
1279 VEX_LEN_3A61_P_2,
1280 VEX_LEN_3A62_P_2,
1281 VEX_LEN_3A63_P_2,
1282 VEX_LEN_3A6A_P_2,
1283 VEX_LEN_3A6B_P_2,
1284 VEX_LEN_3A6E_P_2,
1285 VEX_LEN_3A6F_P_2,
1286 VEX_LEN_3A7A_P_2,
1287 VEX_LEN_3A7B_P_2,
1288 VEX_LEN_3A7E_P_2,
1289 VEX_LEN_3A7F_P_2,
1290 VEX_LEN_3ADF_P_2
1291 };
1292
1293 typedef void (*op_rtn) (int bytemode, int sizeflag);
1294
1295 struct dis386 {
1296 const char *name;
1297 struct
1298 {
1299 op_rtn rtn;
1300 int bytemode;
1301 } op[MAX_OPERANDS];
1302 };
1303
1304 /* Upper case letters in the instruction names here are macros.
1305 'A' => print 'b' if no register operands or suffix_always is true
1306 'B' => print 'b' if suffix_always is true
1307 'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
1308 size prefix
1309 'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
1310 suffix_always is true
1311 'E' => print 'e' if 32-bit form of jcxz
1312 'F' => print 'w' or 'l' depending on address size prefix (loop insns)
1313 'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
1314 'H' => print ",pt" or ",pn" branch hint
1315 'I' => honor following macro letter even in Intel mode (implemented only
1316 for some of the macro letters)
1317 'J' => print 'l'
1318 'K' => print 'd' or 'q' if rex prefix is present.
1319 'L' => print 'l' if suffix_always is true
1320 'M' => print 'r' if intel_mnemonic is false.
1321 'N' => print 'n' if instruction has no wait "prefix"
1322 'O' => print 'd' or 'o' (or 'q' in Intel mode)
1323 'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix,
1324 or suffix_always is true. print 'q' if rex prefix is present.
1325 'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
1326 is true
1327 'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
1328 'S' => print 'w', 'l' or 'q' if suffix_always is true
1329 'T' => print 'q' in 64bit mode and behave as 'P' otherwise
1330 'U' => print 'q' in 64bit mode and behave as 'Q' otherwise
1331 'V' => print 'q' in 64bit mode and behave as 'S' otherwise
1332 'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
1333 'X' => print 's', 'd' depending on data16 prefix (for XMM)
1334 'Y' => 'q' if instruction has an REX 64bit overwrite prefix and
1335 suffix_always is true.
1336 'Z' => print 'q' in 64bit mode and behave as 'L' otherwise
1337 '!' => change condition from true to false or from false to true.
1338 '%' => add 1 upper case letter to the macro.
1339
1340 2 upper case letter macros:
1341 "XY" => print 'x' or 'y' if no register operands or suffix_always
1342 is true.
1343 "XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
1344 "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand
1345 or suffix_always is true
1346 "LB" => print "abs" in 64bit mode and behave as 'B' otherwise
1347 "LS" => print "abs" in 64bit mode and behave as 'S' otherwise
1348 "LV" => print "abs" for 64bit operand and behave as 'S' otherwise
1349
1350 Many of the above letters print nothing in Intel mode. See "putop"
1351 for the details.
1352
1353 Braces '{' and '}', and vertical bars '|', indicate alternative
1354 mnemonic strings for AT&T and Intel. */
1355
1356 static const struct dis386 dis386[] = {
1357 /* 00 */
1358 { "addB", { Eb, Gb } },
1359 { "addS", { Ev, Gv } },
1360 { "addB", { Gb, EbS } },
1361 { "addS", { Gv, EvS } },
1362 { "addB", { AL, Ib } },
1363 { "addS", { eAX, Iv } },
1364 { X86_64_TABLE (X86_64_06) },
1365 { X86_64_TABLE (X86_64_07) },
1366 /* 08 */
1367 { "orB", { Eb, Gb } },
1368 { "orS", { Ev, Gv } },
1369 { "orB", { Gb, EbS } },
1370 { "orS", { Gv, EvS } },
1371 { "orB", { AL, Ib } },
1372 { "orS", { eAX, Iv } },
1373 { X86_64_TABLE (X86_64_0D) },
1374 { "(bad)", { XX } }, /* 0x0f extended opcode escape */
1375 /* 10 */
1376 { "adcB", { Eb, Gb } },
1377 { "adcS", { Ev, Gv } },
1378 { "adcB", { Gb, EbS } },
1379 { "adcS", { Gv, EvS } },
1380 { "adcB", { AL, Ib } },
1381 { "adcS", { eAX, Iv } },
1382 { X86_64_TABLE (X86_64_16) },
1383 { X86_64_TABLE (X86_64_17) },
1384 /* 18 */
1385 { "sbbB", { Eb, Gb } },
1386 { "sbbS", { Ev, Gv } },
1387 { "sbbB", { Gb, EbS } },
1388 { "sbbS", { Gv, EvS } },
1389 { "sbbB", { AL, Ib } },
1390 { "sbbS", { eAX, Iv } },
1391 { X86_64_TABLE (X86_64_1E) },
1392 { X86_64_TABLE (X86_64_1F) },
1393 /* 20 */
1394 { "andB", { Eb, Gb } },
1395 { "andS", { Ev, Gv } },
1396 { "andB", { Gb, EbS } },
1397 { "andS", { Gv, EvS } },
1398 { "andB", { AL, Ib } },
1399 { "andS", { eAX, Iv } },
1400 { "(bad)", { XX } }, /* SEG ES prefix */
1401 { X86_64_TABLE (X86_64_27) },
1402 /* 28 */
1403 { "subB", { Eb, Gb } },
1404 { "subS", { Ev, Gv } },
1405 { "subB", { Gb, EbS } },
1406 { "subS", { Gv, EvS } },
1407 { "subB", { AL, Ib } },
1408 { "subS", { eAX, Iv } },
1409 { "(bad)", { XX } }, /* SEG CS prefix */
1410 { X86_64_TABLE (X86_64_2F) },
1411 /* 30 */
1412 { "xorB", { Eb, Gb } },
1413 { "xorS", { Ev, Gv } },
1414 { "xorB", { Gb, EbS } },
1415 { "xorS", { Gv, EvS } },
1416 { "xorB", { AL, Ib } },
1417 { "xorS", { eAX, Iv } },
1418 { "(bad)", { XX } }, /* SEG SS prefix */
1419 { X86_64_TABLE (X86_64_37) },
1420 /* 38 */
1421 { "cmpB", { Eb, Gb } },
1422 { "cmpS", { Ev, Gv } },
1423 { "cmpB", { Gb, EbS } },
1424 { "cmpS", { Gv, EvS } },
1425 { "cmpB", { AL, Ib } },
1426 { "cmpS", { eAX, Iv } },
1427 { "(bad)", { XX } }, /* SEG DS prefix */
1428 { X86_64_TABLE (X86_64_3F) },
1429 /* 40 */
1430 { "inc{S|}", { RMeAX } },
1431 { "inc{S|}", { RMeCX } },
1432 { "inc{S|}", { RMeDX } },
1433 { "inc{S|}", { RMeBX } },
1434 { "inc{S|}", { RMeSP } },
1435 { "inc{S|}", { RMeBP } },
1436 { "inc{S|}", { RMeSI } },
1437 { "inc{S|}", { RMeDI } },
1438 /* 48 */
1439 { "dec{S|}", { RMeAX } },
1440 { "dec{S|}", { RMeCX } },
1441 { "dec{S|}", { RMeDX } },
1442 { "dec{S|}", { RMeBX } },
1443 { "dec{S|}", { RMeSP } },
1444 { "dec{S|}", { RMeBP } },
1445 { "dec{S|}", { RMeSI } },
1446 { "dec{S|}", { RMeDI } },
1447 /* 50 */
1448 { "pushV", { RMrAX } },
1449 { "pushV", { RMrCX } },
1450 { "pushV", { RMrDX } },
1451 { "pushV", { RMrBX } },
1452 { "pushV", { RMrSP } },
1453 { "pushV", { RMrBP } },
1454 { "pushV", { RMrSI } },
1455 { "pushV", { RMrDI } },
1456 /* 58 */
1457 { "popV", { RMrAX } },
1458 { "popV", { RMrCX } },
1459 { "popV", { RMrDX } },
1460 { "popV", { RMrBX } },
1461 { "popV", { RMrSP } },
1462 { "popV", { RMrBP } },
1463 { "popV", { RMrSI } },
1464 { "popV", { RMrDI } },
1465 /* 60 */
1466 { X86_64_TABLE (X86_64_60) },
1467 { X86_64_TABLE (X86_64_61) },
1468 { X86_64_TABLE (X86_64_62) },
1469 { X86_64_TABLE (X86_64_63) },
1470 { "(bad)", { XX } }, /* seg fs */
1471 { "(bad)", { XX } }, /* seg gs */
1472 { "(bad)", { XX } }, /* op size prefix */
1473 { "(bad)", { XX } }, /* adr size prefix */
1474 /* 68 */
1475 { "pushT", { Iq } },
1476 { "imulS", { Gv, Ev, Iv } },
1477 { "pushT", { sIb } },
1478 { "imulS", { Gv, Ev, sIb } },
1479 { "ins{b|}", { Ybr, indirDX } },
1480 { X86_64_TABLE (X86_64_6D) },
1481 { "outs{b|}", { indirDXr, Xb } },
1482 { X86_64_TABLE (X86_64_6F) },
1483 /* 70 */
1484 { "joH", { Jb, XX, cond_jump_flag } },
1485 { "jnoH", { Jb, XX, cond_jump_flag } },
1486 { "jbH", { Jb, XX, cond_jump_flag } },
1487 { "jaeH", { Jb, XX, cond_jump_flag } },
1488 { "jeH", { Jb, XX, cond_jump_flag } },
1489 { "jneH", { Jb, XX, cond_jump_flag } },
1490 { "jbeH", { Jb, XX, cond_jump_flag } },
1491 { "jaH", { Jb, XX, cond_jump_flag } },
1492 /* 78 */
1493 { "jsH", { Jb, XX, cond_jump_flag } },
1494 { "jnsH", { Jb, XX, cond_jump_flag } },
1495 { "jpH", { Jb, XX, cond_jump_flag } },
1496 { "jnpH", { Jb, XX, cond_jump_flag } },
1497 { "jlH", { Jb, XX, cond_jump_flag } },
1498 { "jgeH", { Jb, XX, cond_jump_flag } },
1499 { "jleH", { Jb, XX, cond_jump_flag } },
1500 { "jgH", { Jb, XX, cond_jump_flag } },
1501 /* 80 */
1502 { REG_TABLE (REG_80) },
1503 { REG_TABLE (REG_81) },
1504 { "(bad)", { XX } },
1505 { REG_TABLE (REG_82) },
1506 { "testB", { Eb, Gb } },
1507 { "testS", { Ev, Gv } },
1508 { "xchgB", { Eb, Gb } },
1509 { "xchgS", { Ev, Gv } },
1510 /* 88 */
1511 { "movB", { Eb, Gb } },
1512 { "movS", { Ev, Gv } },
1513 { "movB", { Gb, EbS } },
1514 { "movS", { Gv, EvS } },
1515 { "movD", { Sv, Sw } },
1516 { MOD_TABLE (MOD_8D) },
1517 { "movD", { Sw, Sv } },
1518 { REG_TABLE (REG_8F) },
1519 /* 90 */
1520 { PREFIX_TABLE (PREFIX_90) },
1521 { "xchgS", { RMeCX, eAX } },
1522 { "xchgS", { RMeDX, eAX } },
1523 { "xchgS", { RMeBX, eAX } },
1524 { "xchgS", { RMeSP, eAX } },
1525 { "xchgS", { RMeBP, eAX } },
1526 { "xchgS", { RMeSI, eAX } },
1527 { "xchgS", { RMeDI, eAX } },
1528 /* 98 */
1529 { "cW{t|}R", { XX } },
1530 { "cR{t|}O", { XX } },
1531 { X86_64_TABLE (X86_64_9A) },
1532 { "(bad)", { XX } }, /* fwait */
1533 { "pushfT", { XX } },
1534 { "popfT", { XX } },
1535 { "sahf", { XX } },
1536 { "lahf", { XX } },
1537 /* a0 */
1538 { "mov%LB", { AL, Ob } },
1539 { "mov%LS", { eAX, Ov } },
1540 { "mov%LB", { Ob, AL } },
1541 { "mov%LS", { Ov, eAX } },
1542 { "movs{b|}", { Ybr, Xb } },
1543 { "movs{R|}", { Yvr, Xv } },
1544 { "cmps{b|}", { Xb, Yb } },
1545 { "cmps{R|}", { Xv, Yv } },
1546 /* a8 */
1547 { "testB", { AL, Ib } },
1548 { "testS", { eAX, Iv } },
1549 { "stosB", { Ybr, AL } },
1550 { "stosS", { Yvr, eAX } },
1551 { "lodsB", { ALr, Xb } },
1552 { "lodsS", { eAXr, Xv } },
1553 { "scasB", { AL, Yb } },
1554 { "scasS", { eAX, Yv } },
1555 /* b0 */
1556 { "movB", { RMAL, Ib } },
1557 { "movB", { RMCL, Ib } },
1558 { "movB", { RMDL, Ib } },
1559 { "movB", { RMBL, Ib } },
1560 { "movB", { RMAH, Ib } },
1561 { "movB", { RMCH, Ib } },
1562 { "movB", { RMDH, Ib } },
1563 { "movB", { RMBH, Ib } },
1564 /* b8 */
1565 { "mov%LV", { RMeAX, Iv64 } },
1566 { "mov%LV", { RMeCX, Iv64 } },
1567 { "mov%LV", { RMeDX, Iv64 } },
1568 { "mov%LV", { RMeBX, Iv64 } },
1569 { "mov%LV", { RMeSP, Iv64 } },
1570 { "mov%LV", { RMeBP, Iv64 } },
1571 { "mov%LV", { RMeSI, Iv64 } },
1572 { "mov%LV", { RMeDI, Iv64 } },
1573 /* c0 */
1574 { REG_TABLE (REG_C0) },
1575 { REG_TABLE (REG_C1) },
1576 { "retT", { Iw } },
1577 { "retT", { XX } },
1578 { X86_64_TABLE (X86_64_C4) },
1579 { X86_64_TABLE (X86_64_C5) },
1580 { REG_TABLE (REG_C6) },
1581 { REG_TABLE (REG_C7) },
1582 /* c8 */
1583 { "enterT", { Iw, Ib } },
1584 { "leaveT", { XX } },
1585 { "Jret{|f}P", { Iw } },
1586 { "Jret{|f}P", { XX } },
1587 { "int3", { XX } },
1588 { "int", { Ib } },
1589 { X86_64_TABLE (X86_64_CE) },
1590 { "iretP", { XX } },
1591 /* d0 */
1592 { REG_TABLE (REG_D0) },
1593 { REG_TABLE (REG_D1) },
1594 { REG_TABLE (REG_D2) },
1595 { REG_TABLE (REG_D3) },
1596 { X86_64_TABLE (X86_64_D4) },
1597 { X86_64_TABLE (X86_64_D5) },
1598 { "(bad)", { XX } },
1599 { "xlat", { DSBX } },
1600 /* d8 */
1601 { FLOAT },
1602 { FLOAT },
1603 { FLOAT },
1604 { FLOAT },
1605 { FLOAT },
1606 { FLOAT },
1607 { FLOAT },
1608 { FLOAT },
1609 /* e0 */
1610 { "loopneFH", { Jb, XX, loop_jcxz_flag } },
1611 { "loopeFH", { Jb, XX, loop_jcxz_flag } },
1612 { "loopFH", { Jb, XX, loop_jcxz_flag } },
1613 { "jEcxzH", { Jb, XX, loop_jcxz_flag } },
1614 { "inB", { AL, Ib } },
1615 { "inG", { zAX, Ib } },
1616 { "outB", { Ib, AL } },
1617 { "outG", { Ib, zAX } },
1618 /* e8 */
1619 { "callT", { Jv } },
1620 { "jmpT", { Jv } },
1621 { X86_64_TABLE (X86_64_EA) },
1622 { "jmp", { Jb } },
1623 { "inB", { AL, indirDX } },
1624 { "inG", { zAX, indirDX } },
1625 { "outB", { indirDX, AL } },
1626 { "outG", { indirDX, zAX } },
1627 /* f0 */
1628 { "(bad)", { XX } }, /* lock prefix */
1629 { "icebp", { XX } },
1630 { "(bad)", { XX } }, /* repne */
1631 { "(bad)", { XX } }, /* repz */
1632 { "hlt", { XX } },
1633 { "cmc", { XX } },
1634 { REG_TABLE (REG_F6) },
1635 { REG_TABLE (REG_F7) },
1636 /* f8 */
1637 { "clc", { XX } },
1638 { "stc", { XX } },
1639 { "cli", { XX } },
1640 { "sti", { XX } },
1641 { "cld", { XX } },
1642 { "std", { XX } },
1643 { REG_TABLE (REG_FE) },
1644 { REG_TABLE (REG_FF) },
1645 };
1646
1647 static const struct dis386 dis386_twobyte[] = {
1648 /* 00 */
1649 { REG_TABLE (REG_0F00 ) },
1650 { REG_TABLE (REG_0F01 ) },
1651 { "larS", { Gv, Ew } },
1652 { "lslS", { Gv, Ew } },
1653 { "(bad)", { XX } },
1654 { "syscall", { XX } },
1655 { "clts", { XX } },
1656 { "sysretP", { XX } },
1657 /* 08 */
1658 { "invd", { XX } },
1659 { "wbinvd", { XX } },
1660 { "(bad)", { XX } },
1661 { "ud2a", { XX } },
1662 { "(bad)", { XX } },
1663 { REG_TABLE (REG_0F0D) },
1664 { "femms", { XX } },
1665 { "", { MX, EM, OPSUF } }, /* See OP_3DNowSuffix. */
1666 /* 10 */
1667 { PREFIX_TABLE (PREFIX_0F10) },
1668 { PREFIX_TABLE (PREFIX_0F11) },
1669 { PREFIX_TABLE (PREFIX_0F12) },
1670 { MOD_TABLE (MOD_0F13) },
1671 { "unpcklpX", { XM, EXx } },
1672 { "unpckhpX", { XM, EXx } },
1673 { PREFIX_TABLE (PREFIX_0F16) },
1674 { MOD_TABLE (MOD_0F17) },
1675 /* 18 */
1676 { REG_TABLE (REG_0F18) },
1677 { "nopQ", { Ev } },
1678 { "nopQ", { Ev } },
1679 { "nopQ", { Ev } },
1680 { "nopQ", { Ev } },
1681 { "nopQ", { Ev } },
1682 { "nopQ", { Ev } },
1683 { "nopQ", { Ev } },
1684 /* 20 */
1685 { MOD_TABLE (MOD_0F20) },
1686 { MOD_TABLE (MOD_0F21) },
1687 { MOD_TABLE (MOD_0F22) },
1688 { MOD_TABLE (MOD_0F23) },
1689 { MOD_TABLE (MOD_0F24) },
1690 { "(bad)", { XX } },
1691 { MOD_TABLE (MOD_0F26) },
1692 { "(bad)", { XX } },
1693 /* 28 */
1694 { "movapX", { XM, EXx } },
1695 { "movapX", { EXxS, XM } },
1696 { PREFIX_TABLE (PREFIX_0F2A) },
1697 { PREFIX_TABLE (PREFIX_0F2B) },
1698 { PREFIX_TABLE (PREFIX_0F2C) },
1699 { PREFIX_TABLE (PREFIX_0F2D) },
1700 { PREFIX_TABLE (PREFIX_0F2E) },
1701 { PREFIX_TABLE (PREFIX_0F2F) },
1702 /* 30 */
1703 { "wrmsr", { XX } },
1704 { "rdtsc", { XX } },
1705 { "rdmsr", { XX } },
1706 { "rdpmc", { XX } },
1707 { "sysenter", { XX } },
1708 { "sysexit", { XX } },
1709 { "(bad)", { XX } },
1710 { "getsec", { XX } },
1711 /* 38 */
1712 { THREE_BYTE_TABLE (THREE_BYTE_0F38) },
1713 { "(bad)", { XX } },
1714 { THREE_BYTE_TABLE (THREE_BYTE_0F3A) },
1715 { "(bad)", { XX } },
1716 { "(bad)", { XX } },
1717 { "(bad)", { XX } },
1718 { "(bad)", { XX } },
1719 { "(bad)", { XX } },
1720 /* 40 */
1721 { "cmovoS", { Gv, Ev } },
1722 { "cmovnoS", { Gv, Ev } },
1723 { "cmovbS", { Gv, Ev } },
1724 { "cmovaeS", { Gv, Ev } },
1725 { "cmoveS", { Gv, Ev } },
1726 { "cmovneS", { Gv, Ev } },
1727 { "cmovbeS", { Gv, Ev } },
1728 { "cmovaS", { Gv, Ev } },
1729 /* 48 */
1730 { "cmovsS", { Gv, Ev } },
1731 { "cmovnsS", { Gv, Ev } },
1732 { "cmovpS", { Gv, Ev } },
1733 { "cmovnpS", { Gv, Ev } },
1734 { "cmovlS", { Gv, Ev } },
1735 { "cmovgeS", { Gv, Ev } },
1736 { "cmovleS", { Gv, Ev } },
1737 { "cmovgS", { Gv, Ev } },
1738 /* 50 */
1739 { MOD_TABLE (MOD_0F51) },
1740 { PREFIX_TABLE (PREFIX_0F51) },
1741 { PREFIX_TABLE (PREFIX_0F52) },
1742 { PREFIX_TABLE (PREFIX_0F53) },
1743 { "andpX", { XM, EXx } },
1744 { "andnpX", { XM, EXx } },
1745 { "orpX", { XM, EXx } },
1746 { "xorpX", { XM, EXx } },
1747 /* 58 */
1748 { PREFIX_TABLE (PREFIX_0F58) },
1749 { PREFIX_TABLE (PREFIX_0F59) },
1750 { PREFIX_TABLE (PREFIX_0F5A) },
1751 { PREFIX_TABLE (PREFIX_0F5B) },
1752 { PREFIX_TABLE (PREFIX_0F5C) },
1753 { PREFIX_TABLE (PREFIX_0F5D) },
1754 { PREFIX_TABLE (PREFIX_0F5E) },
1755 { PREFIX_TABLE (PREFIX_0F5F) },
1756 /* 60 */
1757 { PREFIX_TABLE (PREFIX_0F60) },
1758 { PREFIX_TABLE (PREFIX_0F61) },
1759 { PREFIX_TABLE (PREFIX_0F62) },
1760 { "packsswb", { MX, EM } },
1761 { "pcmpgtb", { MX, EM } },
1762 { "pcmpgtw", { MX, EM } },
1763 { "pcmpgtd", { MX, EM } },
1764 { "packuswb", { MX, EM } },
1765 /* 68 */
1766 { "punpckhbw", { MX, EM } },
1767 { "punpckhwd", { MX, EM } },
1768 { "punpckhdq", { MX, EM } },
1769 { "packssdw", { MX, EM } },
1770 { PREFIX_TABLE (PREFIX_0F6C) },
1771 { PREFIX_TABLE (PREFIX_0F6D) },
1772 { "movK", { MX, Edq } },
1773 { PREFIX_TABLE (PREFIX_0F6F) },
1774 /* 70 */
1775 { PREFIX_TABLE (PREFIX_0F70) },
1776 { REG_TABLE (REG_0F71) },
1777 { REG_TABLE (REG_0F72) },
1778 { REG_TABLE (REG_0F73) },
1779 { "pcmpeqb", { MX, EM } },
1780 { "pcmpeqw", { MX, EM } },
1781 { "pcmpeqd", { MX, EM } },
1782 { "emms", { XX } },
1783 /* 78 */
1784 { PREFIX_TABLE (PREFIX_0F78) },
1785 { PREFIX_TABLE (PREFIX_0F79) },
1786 { THREE_BYTE_TABLE (THREE_BYTE_0F7A) },
1787 { "(bad)", { XX } },
1788 { PREFIX_TABLE (PREFIX_0F7C) },
1789 { PREFIX_TABLE (PREFIX_0F7D) },
1790 { PREFIX_TABLE (PREFIX_0F7E) },
1791 { PREFIX_TABLE (PREFIX_0F7F) },
1792 /* 80 */
1793 { "joH", { Jv, XX, cond_jump_flag } },
1794 { "jnoH", { Jv, XX, cond_jump_flag } },
1795 { "jbH", { Jv, XX, cond_jump_flag } },
1796 { "jaeH", { Jv, XX, cond_jump_flag } },
1797 { "jeH", { Jv, XX, cond_jump_flag } },
1798 { "jneH", { Jv, XX, cond_jump_flag } },
1799 { "jbeH", { Jv, XX, cond_jump_flag } },
1800 { "jaH", { Jv, XX, cond_jump_flag } },
1801 /* 88 */
1802 { "jsH", { Jv, XX, cond_jump_flag } },
1803 { "jnsH", { Jv, XX, cond_jump_flag } },
1804 { "jpH", { Jv, XX, cond_jump_flag } },
1805 { "jnpH", { Jv, XX, cond_jump_flag } },
1806 { "jlH", { Jv, XX, cond_jump_flag } },
1807 { "jgeH", { Jv, XX, cond_jump_flag } },
1808 { "jleH", { Jv, XX, cond_jump_flag } },
1809 { "jgH", { Jv, XX, cond_jump_flag } },
1810 /* 90 */
1811 { "seto", { Eb } },
1812 { "setno", { Eb } },
1813 { "setb", { Eb } },
1814 { "setae", { Eb } },
1815 { "sete", { Eb } },
1816 { "setne", { Eb } },
1817 { "setbe", { Eb } },
1818 { "seta", { Eb } },
1819 /* 98 */
1820 { "sets", { Eb } },
1821 { "setns", { Eb } },
1822 { "setp", { Eb } },
1823 { "setnp", { Eb } },
1824 { "setl", { Eb } },
1825 { "setge", { Eb } },
1826 { "setle", { Eb } },
1827 { "setg", { Eb } },
1828 /* a0 */
1829 { "pushT", { fs } },
1830 { "popT", { fs } },
1831 { "cpuid", { XX } },
1832 { "btS", { Ev, Gv } },
1833 { "shldS", { Ev, Gv, Ib } },
1834 { "shldS", { Ev, Gv, CL } },
1835 { REG_TABLE (REG_0FA6) },
1836 { REG_TABLE (REG_0FA7) },
1837 /* a8 */
1838 { "pushT", { gs } },
1839 { "popT", { gs } },
1840 { "rsm", { XX } },
1841 { "btsS", { Ev, Gv } },
1842 { "shrdS", { Ev, Gv, Ib } },
1843 { "shrdS", { Ev, Gv, CL } },
1844 { REG_TABLE (REG_0FAE) },
1845 { "imulS", { Gv, Ev } },
1846 /* b0 */
1847 { "cmpxchgB", { Eb, Gb } },
1848 { "cmpxchgS", { Ev, Gv } },
1849 { MOD_TABLE (MOD_0FB2) },
1850 { "btrS", { Ev, Gv } },
1851 { MOD_TABLE (MOD_0FB4) },
1852 { MOD_TABLE (MOD_0FB5) },
1853 { "movz{bR|x}", { Gv, Eb } },
1854 { "movz{wR|x}", { Gv, Ew } }, /* yes, there really is movzww ! */
1855 /* b8 */
1856 { PREFIX_TABLE (PREFIX_0FB8) },
1857 { "ud2b", { XX } },
1858 { REG_TABLE (REG_0FBA) },
1859 { "btcS", { Ev, Gv } },
1860 { "bsfS", { Gv, Ev } },
1861 { PREFIX_TABLE (PREFIX_0FBD) },
1862 { "movs{bR|x}", { Gv, Eb } },
1863 { "movs{wR|x}", { Gv, Ew } }, /* yes, there really is movsww ! */
1864 /* c0 */
1865 { "xaddB", { Eb, Gb } },
1866 { "xaddS", { Ev, Gv } },
1867 { PREFIX_TABLE (PREFIX_0FC2) },
1868 { PREFIX_TABLE (PREFIX_0FC3) },
1869 { "pinsrw", { MX, Edqw, Ib } },
1870 { "pextrw", { Gdq, MS, Ib } },
1871 { "shufpX", { XM, EXx, Ib } },
1872 { REG_TABLE (REG_0FC7) },
1873 /* c8 */
1874 { "bswap", { RMeAX } },
1875 { "bswap", { RMeCX } },
1876 { "bswap", { RMeDX } },
1877 { "bswap", { RMeBX } },
1878 { "bswap", { RMeSP } },
1879 { "bswap", { RMeBP } },
1880 { "bswap", { RMeSI } },
1881 { "bswap", { RMeDI } },
1882 /* d0 */
1883 { PREFIX_TABLE (PREFIX_0FD0) },
1884 { "psrlw", { MX, EM } },
1885 { "psrld", { MX, EM } },
1886 { "psrlq", { MX, EM } },
1887 { "paddq", { MX, EM } },
1888 { "pmullw", { MX, EM } },
1889 { PREFIX_TABLE (PREFIX_0FD6) },
1890 { MOD_TABLE (MOD_0FD7) },
1891 /* d8 */
1892 { "psubusb", { MX, EM } },
1893 { "psubusw", { MX, EM } },
1894 { "pminub", { MX, EM } },
1895 { "pand", { MX, EM } },
1896 { "paddusb", { MX, EM } },
1897 { "paddusw", { MX, EM } },
1898 { "pmaxub", { MX, EM } },
1899 { "pandn", { MX, EM } },
1900 /* e0 */
1901 { "pavgb", { MX, EM } },
1902 { "psraw", { MX, EM } },
1903 { "psrad", { MX, EM } },
1904 { "pavgw", { MX, EM } },
1905 { "pmulhuw", { MX, EM } },
1906 { "pmulhw", { MX, EM } },
1907 { PREFIX_TABLE (PREFIX_0FE6) },
1908 { PREFIX_TABLE (PREFIX_0FE7) },
1909 /* e8 */
1910 { "psubsb", { MX, EM } },
1911 { "psubsw", { MX, EM } },
1912 { "pminsw", { MX, EM } },
1913 { "por", { MX, EM } },
1914 { "paddsb", { MX, EM } },
1915 { "paddsw", { MX, EM } },
1916 { "pmaxsw", { MX, EM } },
1917 { "pxor", { MX, EM } },
1918 /* f0 */
1919 { PREFIX_TABLE (PREFIX_0FF0) },
1920 { "psllw", { MX, EM } },
1921 { "pslld", { MX, EM } },
1922 { "psllq", { MX, EM } },
1923 { "pmuludq", { MX, EM } },
1924 { "pmaddwd", { MX, EM } },
1925 { "psadbw", { MX, EM } },
1926 { PREFIX_TABLE (PREFIX_0FF7) },
1927 /* f8 */
1928 { "psubb", { MX, EM } },
1929 { "psubw", { MX, EM } },
1930 { "psubd", { MX, EM } },
1931 { "psubq", { MX, EM } },
1932 { "paddb", { MX, EM } },
1933 { "paddw", { MX, EM } },
1934 { "paddd", { MX, EM } },
1935 { "(bad)", { XX } },
1936 };
1937
1938 static const unsigned char onebyte_has_modrm[256] = {
1939 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
1940 /* ------------------------------- */
1941 /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
1942 /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
1943 /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
1944 /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
1945 /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
1946 /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
1947 /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
1948 /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
1949 /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
1950 /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
1951 /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
1952 /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
1953 /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
1954 /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
1955 /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
1956 /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1 /* f0 */
1957 /* ------------------------------- */
1958 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
1959 };
1960
1961 static const unsigned char twobyte_has_modrm[256] = {
1962 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
1963 /* ------------------------------- */
1964 /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
1965 /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
1966 /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
1967 /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
1968 /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
1969 /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
1970 /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
1971 /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
1972 /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
1973 /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
1974 /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
1975 /* b0 */ 1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1, /* bf */
1976 /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
1977 /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
1978 /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
1979 /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0 /* ff */
1980 /* ------------------------------- */
1981 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
1982 };
1983
1984 static char obuf[100];
1985 static char *obufp;
1986 static char *mnemonicendp;
1987 static char scratchbuf[100];
1988 static unsigned char *start_codep;
1989 static unsigned char *insn_codep;
1990 static unsigned char *codep;
1991 static int last_lock_prefix;
1992 static int last_repz_prefix;
1993 static int last_repnz_prefix;
1994 static int last_data_prefix;
1995 static int last_addr_prefix;
1996 static int last_rex_prefix;
1997 static int last_seg_prefix;
1998 #define MAX_CODE_LENGTH 15
1999 /* We can up to 14 prefixes since the maximum instruction length is
2000 15bytes. */
2001 static int all_prefixes[MAX_CODE_LENGTH - 1];
2002 static disassemble_info *the_info;
2003 static struct
2004 {
2005 int mod;
2006 int reg;
2007 int rm;
2008 }
2009 modrm;
2010 static unsigned char need_modrm;
2011 static struct
2012 {
2013 int register_specifier;
2014 int length;
2015 int prefix;
2016 int w;
2017 }
2018 vex;
2019 static unsigned char need_vex;
2020 static unsigned char need_vex_reg;
2021 static unsigned char vex_w_done;
2022
2023 struct op
2024 {
2025 const char *name;
2026 unsigned int len;
2027 };
2028
2029 /* If we are accessing mod/rm/reg without need_modrm set, then the
2030 values are stale. Hitting this abort likely indicates that you
2031 need to update onebyte_has_modrm or twobyte_has_modrm. */
2032 #define MODRM_CHECK if (!need_modrm) abort ()
2033
2034 static const char **names64;
2035 static const char **names32;
2036 static const char **names16;
2037 static const char **names8;
2038 static const char **names8rex;
2039 static const char **names_seg;
2040 static const char *index64;
2041 static const char *index32;
2042 static const char **index16;
2043
2044 static const char *intel_names64[] = {
2045 "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
2046 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2047 };
2048 static const char *intel_names32[] = {
2049 "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
2050 "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
2051 };
2052 static const char *intel_names16[] = {
2053 "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
2054 "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
2055 };
2056 static const char *intel_names8[] = {
2057 "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
2058 };
2059 static const char *intel_names8rex[] = {
2060 "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
2061 "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
2062 };
2063 static const char *intel_names_seg[] = {
2064 "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
2065 };
2066 static const char *intel_index64 = "riz";
2067 static const char *intel_index32 = "eiz";
2068 static const char *intel_index16[] = {
2069 "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
2070 };
2071
2072 static const char *att_names64[] = {
2073 "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
2074 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
2075 };
2076 static const char *att_names32[] = {
2077 "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
2078 "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
2079 };
2080 static const char *att_names16[] = {
2081 "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
2082 "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
2083 };
2084 static const char *att_names8[] = {
2085 "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
2086 };
2087 static const char *att_names8rex[] = {
2088 "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
2089 "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
2090 };
2091 static const char *att_names_seg[] = {
2092 "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
2093 };
2094 static const char *att_index64 = "%riz";
2095 static const char *att_index32 = "%eiz";
2096 static const char *att_index16[] = {
2097 "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
2098 };
2099
2100 static const struct dis386 reg_table[][8] = {
2101 /* REG_80 */
2102 {
2103 { "addA", { Eb, Ib } },
2104 { "orA", { Eb, Ib } },
2105 { "adcA", { Eb, Ib } },
2106 { "sbbA", { Eb, Ib } },
2107 { "andA", { Eb, Ib } },
2108 { "subA", { Eb, Ib } },
2109 { "xorA", { Eb, Ib } },
2110 { "cmpA", { Eb, Ib } },
2111 },
2112 /* REG_81 */
2113 {
2114 { "addQ", { Ev, Iv } },
2115 { "orQ", { Ev, Iv } },
2116 { "adcQ", { Ev, Iv } },
2117 { "sbbQ", { Ev, Iv } },
2118 { "andQ", { Ev, Iv } },
2119 { "subQ", { Ev, Iv } },
2120 { "xorQ", { Ev, Iv } },
2121 { "cmpQ", { Ev, Iv } },
2122 },
2123 /* REG_82 */
2124 {
2125 { "addQ", { Ev, sIb } },
2126 { "orQ", { Ev, sIb } },
2127 { "adcQ", { Ev, sIb } },
2128 { "sbbQ", { Ev, sIb } },
2129 { "andQ", { Ev, sIb } },
2130 { "subQ", { Ev, sIb } },
2131 { "xorQ", { Ev, sIb } },
2132 { "cmpQ", { Ev, sIb } },
2133 },
2134 /* REG_8F */
2135 {
2136 { "popU", { stackEv } },
2137 { XOP_8F_TABLE (XOP_09) },
2138 { "(bad)", { XX } },
2139 { "(bad)", { XX } },
2140 { "(bad)", { XX } },
2141 { XOP_8F_TABLE (XOP_09) },
2142 { "(bad)", { XX } },
2143 { "(bad)", { XX } },
2144 },
2145 /* REG_C0 */
2146 {
2147 { "rolA", { Eb, Ib } },
2148 { "rorA", { Eb, Ib } },
2149 { "rclA", { Eb, Ib } },
2150 { "rcrA", { Eb, Ib } },
2151 { "shlA", { Eb, Ib } },
2152 { "shrA", { Eb, Ib } },
2153 { "(bad)", { XX } },
2154 { "sarA", { Eb, Ib } },
2155 },
2156 /* REG_C1 */
2157 {
2158 { "rolQ", { Ev, Ib } },
2159 { "rorQ", { Ev, Ib } },
2160 { "rclQ", { Ev, Ib } },
2161 { "rcrQ", { Ev, Ib } },
2162 { "shlQ", { Ev, Ib } },
2163 { "shrQ", { Ev, Ib } },
2164 { "(bad)", { XX } },
2165 { "sarQ", { Ev, Ib } },
2166 },
2167 /* REG_C6 */
2168 {
2169 { "movA", { Eb, Ib } },
2170 { "(bad)", { XX } },
2171 { "(bad)", { XX } },
2172 { "(bad)", { XX } },
2173 { "(bad)", { XX } },
2174 { "(bad)", { XX } },
2175 { "(bad)", { XX } },
2176 { "(bad)", { XX } },
2177 },
2178 /* REG_C7 */
2179 {
2180 { "movQ", { Ev, Iv } },
2181 { "(bad)", { XX } },
2182 { "(bad)", { XX } },
2183 { "(bad)", { XX } },
2184 { "(bad)", { XX } },
2185 { "(bad)", { XX } },
2186 { "(bad)", { XX } },
2187 { "(bad)", { XX } },
2188 },
2189 /* REG_D0 */
2190 {
2191 { "rolA", { Eb, I1 } },
2192 { "rorA", { Eb, I1 } },
2193 { "rclA", { Eb, I1 } },
2194 { "rcrA", { Eb, I1 } },
2195 { "shlA", { Eb, I1 } },
2196 { "shrA", { Eb, I1 } },
2197 { "(bad)", { XX } },
2198 { "sarA", { Eb, I1 } },
2199 },
2200 /* REG_D1 */
2201 {
2202 { "rolQ", { Ev, I1 } },
2203 { "rorQ", { Ev, I1 } },
2204 { "rclQ", { Ev, I1 } },
2205 { "rcrQ", { Ev, I1 } },
2206 { "shlQ", { Ev, I1 } },
2207 { "shrQ", { Ev, I1 } },
2208 { "(bad)", { XX } },
2209 { "sarQ", { Ev, I1 } },
2210 },
2211 /* REG_D2 */
2212 {
2213 { "rolA", { Eb, CL } },
2214 { "rorA", { Eb, CL } },
2215 { "rclA", { Eb, CL } },
2216 { "rcrA", { Eb, CL } },
2217 { "shlA", { Eb, CL } },
2218 { "shrA", { Eb, CL } },
2219 { "(bad)", { XX } },
2220 { "sarA", { Eb, CL } },
2221 },
2222 /* REG_D3 */
2223 {
2224 { "rolQ", { Ev, CL } },
2225 { "rorQ", { Ev, CL } },
2226 { "rclQ", { Ev, CL } },
2227 { "rcrQ", { Ev, CL } },
2228 { "shlQ", { Ev, CL } },
2229 { "shrQ", { Ev, CL } },
2230 { "(bad)", { XX } },
2231 { "sarQ", { Ev, CL } },
2232 },
2233 /* REG_F6 */
2234 {
2235 { "testA", { Eb, Ib } },
2236 { "(bad)", { XX } },
2237 { "notA", { Eb } },
2238 { "negA", { Eb } },
2239 { "mulA", { Eb } }, /* Don't print the implicit %al register, */
2240 { "imulA", { Eb } }, /* to distinguish these opcodes from other */
2241 { "divA", { Eb } }, /* mul/imul opcodes. Do the same for div */
2242 { "idivA", { Eb } }, /* and idiv for consistency. */
2243 },
2244 /* REG_F7 */
2245 {
2246 { "testQ", { Ev, Iv } },
2247 { "(bad)", { XX } },
2248 { "notQ", { Ev } },
2249 { "negQ", { Ev } },
2250 { "mulQ", { Ev } }, /* Don't print the implicit register. */
2251 { "imulQ", { Ev } },
2252 { "divQ", { Ev } },
2253 { "idivQ", { Ev } },
2254 },
2255 /* REG_FE */
2256 {
2257 { "incA", { Eb } },
2258 { "decA", { Eb } },
2259 { "(bad)", { XX } },
2260 { "(bad)", { XX } },
2261 { "(bad)", { XX } },
2262 { "(bad)", { XX } },
2263 { "(bad)", { XX } },
2264 { "(bad)", { XX } },
2265 },
2266 /* REG_FF */
2267 {
2268 { "incQ", { Ev } },
2269 { "decQ", { Ev } },
2270 { "callT", { indirEv } },
2271 { "JcallT", { indirEp } },
2272 { "jmpT", { indirEv } },
2273 { "JjmpT", { indirEp } },
2274 { "pushU", { stackEv } },
2275 { "(bad)", { XX } },
2276 },
2277 /* REG_0F00 */
2278 {
2279 { "sldtD", { Sv } },
2280 { "strD", { Sv } },
2281 { "lldt", { Ew } },
2282 { "ltr", { Ew } },
2283 { "verr", { Ew } },
2284 { "verw", { Ew } },
2285 { "(bad)", { XX } },
2286 { "(bad)", { XX } },
2287 },
2288 /* REG_0F01 */
2289 {
2290 { MOD_TABLE (MOD_0F01_REG_0) },
2291 { MOD_TABLE (MOD_0F01_REG_1) },
2292 { MOD_TABLE (MOD_0F01_REG_2) },
2293 { MOD_TABLE (MOD_0F01_REG_3) },
2294 { "smswD", { Sv } },
2295 { "(bad)", { XX } },
2296 { "lmsw", { Ew } },
2297 { MOD_TABLE (MOD_0F01_REG_7) },
2298 },
2299 /* REG_0F0D */
2300 {
2301 { "prefetch", { Eb } },
2302 { "prefetchw", { Eb } },
2303 { "(bad)", { XX } },
2304 { "(bad)", { XX } },
2305 { "(bad)", { XX } },
2306 { "(bad)", { XX } },
2307 { "(bad)", { XX } },
2308 { "(bad)", { XX } },
2309 },
2310 /* REG_0F18 */
2311 {
2312 { MOD_TABLE (MOD_0F18_REG_0) },
2313 { MOD_TABLE (MOD_0F18_REG_1) },
2314 { MOD_TABLE (MOD_0F18_REG_2) },
2315 { MOD_TABLE (MOD_0F18_REG_3) },
2316 { "(bad)", { XX } },
2317 { "(bad)", { XX } },
2318 { "(bad)", { XX } },
2319 { "(bad)", { XX } },
2320 },
2321 /* REG_0F71 */
2322 {
2323 { "(bad)", { XX } },
2324 { "(bad)", { XX } },
2325 { MOD_TABLE (MOD_0F71_REG_2) },
2326 { "(bad)", { XX } },
2327 { MOD_TABLE (MOD_0F71_REG_4) },
2328 { "(bad)", { XX } },
2329 { MOD_TABLE (MOD_0F71_REG_6) },
2330 { "(bad)", { XX } },
2331 },
2332 /* REG_0F72 */
2333 {
2334 { "(bad)", { XX } },
2335 { "(bad)", { XX } },
2336 { MOD_TABLE (MOD_0F72_REG_2) },
2337 { "(bad)", { XX } },
2338 { MOD_TABLE (MOD_0F72_REG_4) },
2339 { "(bad)", { XX } },
2340 { MOD_TABLE (MOD_0F72_REG_6) },
2341 { "(bad)", { XX } },
2342 },
2343 /* REG_0F73 */
2344 {
2345 { "(bad)", { XX } },
2346 { "(bad)", { XX } },
2347 { MOD_TABLE (MOD_0F73_REG_2) },
2348 { MOD_TABLE (MOD_0F73_REG_3) },
2349 { "(bad)", { XX } },
2350 { "(bad)", { XX } },
2351 { MOD_TABLE (MOD_0F73_REG_6) },
2352 { MOD_TABLE (MOD_0F73_REG_7) },
2353 },
2354 /* REG_0FA6 */
2355 {
2356 { "montmul", { { OP_0f07, 0 } } },
2357 { "xsha1", { { OP_0f07, 0 } } },
2358 { "xsha256", { { OP_0f07, 0 } } },
2359 { "(bad)", { { OP_0f07, 0 } } },
2360 { "(bad)", { { OP_0f07, 0 } } },
2361 { "(bad)", { { OP_0f07, 0 } } },
2362 { "(bad)", { { OP_0f07, 0 } } },
2363 { "(bad)", { { OP_0f07, 0 } } },
2364 },
2365 /* REG_0FA7 */
2366 {
2367 { "xstore-rng", { { OP_0f07, 0 } } },
2368 { "xcrypt-ecb", { { OP_0f07, 0 } } },
2369 { "xcrypt-cbc", { { OP_0f07, 0 } } },
2370 { "xcrypt-ctr", { { OP_0f07, 0 } } },
2371 { "xcrypt-cfb", { { OP_0f07, 0 } } },
2372 { "xcrypt-ofb", { { OP_0f07, 0 } } },
2373 { "(bad)", { { OP_0f07, 0 } } },
2374 { "(bad)", { { OP_0f07, 0 } } },
2375 },
2376 /* REG_0FAE */
2377 {
2378 { MOD_TABLE (MOD_0FAE_REG_0) },
2379 { MOD_TABLE (MOD_0FAE_REG_1) },
2380 { MOD_TABLE (MOD_0FAE_REG_2) },
2381 { MOD_TABLE (MOD_0FAE_REG_3) },
2382 { MOD_TABLE (MOD_0FAE_REG_4) },
2383 { MOD_TABLE (MOD_0FAE_REG_5) },
2384 { MOD_TABLE (MOD_0FAE_REG_6) },
2385 { MOD_TABLE (MOD_0FAE_REG_7) },
2386 },
2387 /* REG_0FBA */
2388 {
2389 { "(bad)", { XX } },
2390 { "(bad)", { XX } },
2391 { "(bad)", { XX } },
2392 { "(bad)", { XX } },
2393 { "btQ", { Ev, Ib } },
2394 { "btsQ", { Ev, Ib } },
2395 { "btrQ", { Ev, Ib } },
2396 { "btcQ", { Ev, Ib } },
2397 },
2398 /* REG_0FC7 */
2399 {
2400 { "(bad)", { XX } },
2401 { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } } },
2402 { "(bad)", { XX } },
2403 { "(bad)", { XX } },
2404 { "(bad)", { XX } },
2405 { "(bad)", { XX } },
2406 { MOD_TABLE (MOD_0FC7_REG_6) },
2407 { MOD_TABLE (MOD_0FC7_REG_7) },
2408 },
2409 /* REG_VEX_71 */
2410 {
2411 { "(bad)", { XX } },
2412 { "(bad)", { XX } },
2413 { MOD_TABLE (MOD_VEX_71_REG_2) },
2414 { "(bad)", { XX } },
2415 { MOD_TABLE (MOD_VEX_71_REG_4) },
2416 { "(bad)", { XX } },
2417 { MOD_TABLE (MOD_VEX_71_REG_6) },
2418 { "(bad)", { XX } },
2419 },
2420 /* REG_VEX_72 */
2421 {
2422 { "(bad)", { XX } },
2423 { "(bad)", { XX } },
2424 { MOD_TABLE (MOD_VEX_72_REG_2) },
2425 { "(bad)", { XX } },
2426 { MOD_TABLE (MOD_VEX_72_REG_4) },
2427 { "(bad)", { XX } },
2428 { MOD_TABLE (MOD_VEX_72_REG_6) },
2429 { "(bad)", { XX } },
2430 },
2431 /* REG_VEX_73 */
2432 {
2433 { "(bad)", { XX } },
2434 { "(bad)", { XX } },
2435 { MOD_TABLE (MOD_VEX_73_REG_2) },
2436 { MOD_TABLE (MOD_VEX_73_REG_3) },
2437 { "(bad)", { XX } },
2438 { "(bad)", { XX } },
2439 { MOD_TABLE (MOD_VEX_73_REG_6) },
2440 { MOD_TABLE (MOD_VEX_73_REG_7) },
2441 },
2442 /* REG_VEX_AE */
2443 {
2444 { "(bad)", { XX } },
2445 { "(bad)", { XX } },
2446 { MOD_TABLE (MOD_VEX_AE_REG_2) },
2447 { MOD_TABLE (MOD_VEX_AE_REG_3) },
2448 { "(bad)", { XX } },
2449 { "(bad)", { XX } },
2450 { "(bad)", { XX } },
2451 { "(bad)", { XX } },
2452 },
2453 /* REG_XOP_LWPCB */
2454 {
2455 { "llwpcb", { { OP_LWPCB_E, 0 } } },
2456 { "slwpcb", { { OP_LWPCB_E, 0 } } },
2457 { "(bad)", { XX } },
2458 { "(bad)", { XX } },
2459 { "(bad)", { XX } },
2460 { "(bad)", { XX } },
2461 { "(bad)", { XX } },
2462 { "(bad)", { XX } },
2463 },
2464 /* REG_XOP_LWP */
2465 {
2466 { "lwpins", { { OP_LWP_E, 0 }, Ed, { OP_LWP_I, 0 } } },
2467 { "lwpval", { { OP_LWP_E, 0 }, Ed, { OP_LWP_I, 0 } } },
2468 { "(bad)", { XX } },
2469 { "(bad)", { XX } },
2470 { "(bad)", { XX } },
2471 { "(bad)", { XX } },
2472 { "(bad)", { XX } },
2473 { "(bad)", { XX } },
2474 },
2475 };
2476
2477 static const struct dis386 prefix_table[][4] = {
2478 /* PREFIX_90 */
2479 {
2480 { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } } },
2481 { "pause", { XX } },
2482 { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } } },
2483 { "(bad)", { XX } },
2484 },
2485
2486 /* PREFIX_0F10 */
2487 {
2488 { "movups", { XM, EXx } },
2489 { "movss", { XM, EXd } },
2490 { "movupd", { XM, EXx } },
2491 { "movsd", { XM, EXq } },
2492 },
2493
2494 /* PREFIX_0F11 */
2495 {
2496 { "movups", { EXxS, XM } },
2497 { "movss", { EXdS, XM } },
2498 { "movupd", { EXxS, XM } },
2499 { "movsd", { EXqS, XM } },
2500 },
2501
2502 /* PREFIX_0F12 */
2503 {
2504 { MOD_TABLE (MOD_0F12_PREFIX_0) },
2505 { "movsldup", { XM, EXx } },
2506 { "movlpd", { XM, EXq } },
2507 { "movddup", { XM, EXq } },
2508 },
2509
2510 /* PREFIX_0F16 */
2511 {
2512 { MOD_TABLE (MOD_0F16_PREFIX_0) },
2513 { "movshdup", { XM, EXx } },
2514 { "movhpd", { XM, EXq } },
2515 { "(bad)", { XX } },
2516 },
2517
2518 /* PREFIX_0F2A */
2519 {
2520 { "cvtpi2ps", { XM, EMCq } },
2521 { "cvtsi2ss%LQ", { XM, Ev } },
2522 { "cvtpi2pd", { XM, EMCq } },
2523 { "cvtsi2sd%LQ", { XM, Ev } },
2524 },
2525
2526 /* PREFIX_0F2B */
2527 {
2528 { MOD_TABLE (MOD_0F2B_PREFIX_0) },
2529 { MOD_TABLE (MOD_0F2B_PREFIX_1) },
2530 { MOD_TABLE (MOD_0F2B_PREFIX_2) },
2531 { MOD_TABLE (MOD_0F2B_PREFIX_3) },
2532 },
2533
2534 /* PREFIX_0F2C */
2535 {
2536 { "cvttps2pi", { MXC, EXq } },
2537 { "cvttss2siY", { Gv, EXd } },
2538 { "cvttpd2pi", { MXC, EXx } },
2539 { "cvttsd2siY", { Gv, EXq } },
2540 },
2541
2542 /* PREFIX_0F2D */
2543 {
2544 { "cvtps2pi", { MXC, EXq } },
2545 { "cvtss2siY", { Gv, EXd } },
2546 { "cvtpd2pi", { MXC, EXx } },
2547 { "cvtsd2siY", { Gv, EXq } },
2548 },
2549
2550 /* PREFIX_0F2E */
2551 {
2552 { "ucomiss",{ XM, EXd } },
2553 { "(bad)", { XX } },
2554 { "ucomisd",{ XM, EXq } },
2555 { "(bad)", { XX } },
2556 },
2557
2558 /* PREFIX_0F2F */
2559 {
2560 { "comiss", { XM, EXd } },
2561 { "(bad)", { XX } },
2562 { "comisd", { XM, EXq } },
2563 { "(bad)", { XX } },
2564 },
2565
2566 /* PREFIX_0F51 */
2567 {
2568 { "sqrtps", { XM, EXx } },
2569 { "sqrtss", { XM, EXd } },
2570 { "sqrtpd", { XM, EXx } },
2571 { "sqrtsd", { XM, EXq } },
2572 },
2573
2574 /* PREFIX_0F52 */
2575 {
2576 { "rsqrtps",{ XM, EXx } },
2577 { "rsqrtss",{ XM, EXd } },
2578 { "(bad)", { XX } },
2579 { "(bad)", { XX } },
2580 },
2581
2582 /* PREFIX_0F53 */
2583 {
2584 { "rcpps", { XM, EXx } },
2585 { "rcpss", { XM, EXd } },
2586 { "(bad)", { XX } },
2587 { "(bad)", { XX } },
2588 },
2589
2590 /* PREFIX_0F58 */
2591 {
2592 { "addps", { XM, EXx } },
2593 { "addss", { XM, EXd } },
2594 { "addpd", { XM, EXx } },
2595 { "addsd", { XM, EXq } },
2596 },
2597
2598 /* PREFIX_0F59 */
2599 {
2600 { "mulps", { XM, EXx } },
2601 { "mulss", { XM, EXd } },
2602 { "mulpd", { XM, EXx } },
2603 { "mulsd", { XM, EXq } },
2604 },
2605
2606 /* PREFIX_0F5A */
2607 {
2608 { "cvtps2pd", { XM, EXq } },
2609 { "cvtss2sd", { XM, EXd } },
2610 { "cvtpd2ps", { XM, EXx } },
2611 { "cvtsd2ss", { XM, EXq } },
2612 },
2613
2614 /* PREFIX_0F5B */
2615 {
2616 { "cvtdq2ps", { XM, EXx } },
2617 { "cvttps2dq", { XM, EXx } },
2618 { "cvtps2dq", { XM, EXx } },
2619 { "(bad)", { XX } },
2620 },
2621
2622 /* PREFIX_0F5C */
2623 {
2624 { "subps", { XM, EXx } },
2625 { "subss", { XM, EXd } },
2626 { "subpd", { XM, EXx } },
2627 { "subsd", { XM, EXq } },
2628 },
2629
2630 /* PREFIX_0F5D */
2631 {
2632 { "minps", { XM, EXx } },
2633 { "minss", { XM, EXd } },
2634 { "minpd", { XM, EXx } },
2635 { "minsd", { XM, EXq } },
2636 },
2637
2638 /* PREFIX_0F5E */
2639 {
2640 { "divps", { XM, EXx } },
2641 { "divss", { XM, EXd } },
2642 { "divpd", { XM, EXx } },
2643 { "divsd", { XM, EXq } },
2644 },
2645
2646 /* PREFIX_0F5F */
2647 {
2648 { "maxps", { XM, EXx } },
2649 { "maxss", { XM, EXd } },
2650 { "maxpd", { XM, EXx } },
2651 { "maxsd", { XM, EXq } },
2652 },
2653
2654 /* PREFIX_0F60 */
2655 {
2656 { "punpcklbw",{ MX, EMd } },
2657 { "(bad)", { XX } },
2658 { "punpcklbw",{ MX, EMx } },
2659 { "(bad)", { XX } },
2660 },
2661
2662 /* PREFIX_0F61 */
2663 {
2664 { "punpcklwd",{ MX, EMd } },
2665 { "(bad)", { XX } },
2666 { "punpcklwd",{ MX, EMx } },
2667 { "(bad)", { XX } },
2668 },
2669
2670 /* PREFIX_0F62 */
2671 {
2672 { "punpckldq",{ MX, EMd } },
2673 { "(bad)", { XX } },
2674 { "punpckldq",{ MX, EMx } },
2675 { "(bad)", { XX } },
2676 },
2677
2678 /* PREFIX_0F6C */
2679 {
2680 { "(bad)", { XX } },
2681 { "(bad)", { XX } },
2682 { "punpcklqdq", { XM, EXx } },
2683 { "(bad)", { XX } },
2684 },
2685
2686 /* PREFIX_0F6D */
2687 {
2688 { "(bad)", { XX } },
2689 { "(bad)", { XX } },
2690 { "punpckhqdq", { XM, EXx } },
2691 { "(bad)", { XX } },
2692 },
2693
2694 /* PREFIX_0F6F */
2695 {
2696 { "movq", { MX, EM } },
2697 { "movdqu", { XM, EXx } },
2698 { "movdqa", { XM, EXx } },
2699 { "(bad)", { XX } },
2700 },
2701
2702 /* PREFIX_0F70 */
2703 {
2704 { "pshufw", { MX, EM, Ib } },
2705 { "pshufhw",{ XM, EXx, Ib } },
2706 { "pshufd", { XM, EXx, Ib } },
2707 { "pshuflw",{ XM, EXx, Ib } },
2708 },
2709
2710 /* PREFIX_0F73_REG_3 */
2711 {
2712 { "(bad)", { XX } },
2713 { "(bad)", { XX } },
2714 { "psrldq", { XS, Ib } },
2715 { "(bad)", { XX } },
2716 },
2717
2718 /* PREFIX_0F73_REG_7 */
2719 {
2720 { "(bad)", { XX } },
2721 { "(bad)", { XX } },
2722 { "pslldq", { XS, Ib } },
2723 { "(bad)", { XX } },
2724 },
2725
2726 /* PREFIX_0F78 */
2727 {
2728 {"vmread", { Em, Gm } },
2729 {"(bad)", { XX } },
2730 {"extrq", { XS, Ib, Ib } },
2731 {"insertq", { XM, XS, Ib, Ib } },
2732 },
2733
2734 /* PREFIX_0F79 */
2735 {
2736 {"vmwrite", { Gm, Em } },
2737 {"(bad)", { XX } },
2738 {"extrq", { XM, XS } },
2739 {"insertq", { XM, XS } },
2740 },
2741
2742 /* PREFIX_0F7C */
2743 {
2744 { "(bad)", { XX } },
2745 { "(bad)", { XX } },
2746 { "haddpd", { XM, EXx } },
2747 { "haddps", { XM, EXx } },
2748 },
2749
2750 /* PREFIX_0F7D */
2751 {
2752 { "(bad)", { XX } },
2753 { "(bad)", { XX } },
2754 { "hsubpd", { XM, EXx } },
2755 { "hsubps", { XM, EXx } },
2756 },
2757
2758 /* PREFIX_0F7E */
2759 {
2760 { "movK", { Edq, MX } },
2761 { "movq", { XM, EXq } },
2762 { "movK", { Edq, XM } },
2763 { "(bad)", { XX } },
2764 },
2765
2766 /* PREFIX_0F7F */
2767 {
2768 { "movq", { EMS, MX } },
2769 { "movdqu", { EXxS, XM } },
2770 { "movdqa", { EXxS, XM } },
2771 { "(bad)", { XX } },
2772 },
2773
2774 /* PREFIX_0FB8 */
2775 {
2776 { "(bad)", { XX } },
2777 { "popcntS", { Gv, Ev } },
2778 { "(bad)", { XX } },
2779 { "(bad)", { XX } },
2780 },
2781
2782 /* PREFIX_0FBD */
2783 {
2784 { "bsrS", { Gv, Ev } },
2785 { "lzcntS", { Gv, Ev } },
2786 { "bsrS", { Gv, Ev } },
2787 { "(bad)", { XX } },
2788 },
2789
2790 /* PREFIX_0FC2 */
2791 {
2792 { "cmpps", { XM, EXx, CMP } },
2793 { "cmpss", { XM, EXd, CMP } },
2794 { "cmppd", { XM, EXx, CMP } },
2795 { "cmpsd", { XM, EXq, CMP } },
2796 },
2797
2798 /* PREFIX_0FC3 */
2799 {
2800 { "movntiS", { Ma, Gv } },
2801 { "(bad)", { XX } },
2802 { "(bad)", { XX } },
2803 { "(bad)", { XX } },
2804 },
2805
2806 /* PREFIX_0FC7_REG_6 */
2807 {
2808 { "vmptrld",{ Mq } },
2809 { "vmxon", { Mq } },
2810 { "vmclear",{ Mq } },
2811 { "(bad)", { XX } },
2812 },
2813
2814 /* PREFIX_0FD0 */
2815 {
2816 { "(bad)", { XX } },
2817 { "(bad)", { XX } },
2818 { "addsubpd", { XM, EXx } },
2819 { "addsubps", { XM, EXx } },
2820 },
2821
2822 /* PREFIX_0FD6 */
2823 {
2824 { "(bad)", { XX } },
2825 { "movq2dq",{ XM, MS } },
2826 { "movq", { EXqS, XM } },
2827 { "movdq2q",{ MX, XS } },
2828 },
2829
2830 /* PREFIX_0FE6 */
2831 {
2832 { "(bad)", { XX } },
2833 { "cvtdq2pd", { XM, EXq } },
2834 { "cvttpd2dq", { XM, EXx } },
2835 { "cvtpd2dq", { XM, EXx } },
2836 },
2837
2838 /* PREFIX_0FE7 */
2839 {
2840 { "movntq", { Mq, MX } },
2841 { "(bad)", { XX } },
2842 { MOD_TABLE (MOD_0FE7_PREFIX_2) },
2843 { "(bad)", { XX } },
2844 },
2845
2846 /* PREFIX_0FF0 */
2847 {
2848 { "(bad)", { XX } },
2849 { "(bad)", { XX } },
2850 { "(bad)", { XX } },
2851 { MOD_TABLE (MOD_0FF0_PREFIX_3) },
2852 },
2853
2854 /* PREFIX_0FF7 */
2855 {
2856 { "maskmovq", { MX, MS } },
2857 { "(bad)", { XX } },
2858 { "maskmovdqu", { XM, XS } },
2859 { "(bad)", { XX } },
2860 },
2861
2862 /* PREFIX_0F3810 */
2863 {
2864 { "(bad)", { XX } },
2865 { "(bad)", { XX } },
2866 { "pblendvb", { XM, EXx, XMM0 } },
2867 { "(bad)", { XX } },
2868 },
2869
2870 /* PREFIX_0F3814 */
2871 {
2872 { "(bad)", { XX } },
2873 { "(bad)", { XX } },
2874 { "blendvps", { XM, EXx, XMM0 } },
2875 { "(bad)", { XX } },
2876 },
2877
2878 /* PREFIX_0F3815 */
2879 {
2880 { "(bad)", { XX } },
2881 { "(bad)", { XX } },
2882 { "blendvpd", { XM, EXx, XMM0 } },
2883 { "(bad)", { XX } },
2884 },
2885
2886 /* PREFIX_0F3817 */
2887 {
2888 { "(bad)", { XX } },
2889 { "(bad)", { XX } },
2890 { "ptest", { XM, EXx } },
2891 { "(bad)", { XX } },
2892 },
2893
2894 /* PREFIX_0F3820 */
2895 {
2896 { "(bad)", { XX } },
2897 { "(bad)", { XX } },
2898 { "pmovsxbw", { XM, EXq } },
2899 { "(bad)", { XX } },
2900 },
2901
2902 /* PREFIX_0F3821 */
2903 {
2904 { "(bad)", { XX } },
2905 { "(bad)", { XX } },
2906 { "pmovsxbd", { XM, EXd } },
2907 { "(bad)", { XX } },
2908 },
2909
2910 /* PREFIX_0F3822 */
2911 {
2912 { "(bad)", { XX } },
2913 { "(bad)", { XX } },
2914 { "pmovsxbq", { XM, EXw } },
2915 { "(bad)", { XX } },
2916 },
2917
2918 /* PREFIX_0F3823 */
2919 {
2920 { "(bad)", { XX } },
2921 { "(bad)", { XX } },
2922 { "pmovsxwd", { XM, EXq } },
2923 { "(bad)", { XX } },
2924 },
2925
2926 /* PREFIX_0F3824 */
2927 {
2928 { "(bad)", { XX } },
2929 { "(bad)", { XX } },
2930 { "pmovsxwq", { XM, EXd } },
2931 { "(bad)", { XX } },
2932 },
2933
2934 /* PREFIX_0F3825 */
2935 {
2936 { "(bad)", { XX } },
2937 { "(bad)", { XX } },
2938 { "pmovsxdq", { XM, EXq } },
2939 { "(bad)", { XX } },
2940 },
2941
2942 /* PREFIX_0F3828 */
2943 {
2944 { "(bad)", { XX } },
2945 { "(bad)", { XX } },
2946 { "pmuldq", { XM, EXx } },
2947 { "(bad)", { XX } },
2948 },
2949
2950 /* PREFIX_0F3829 */
2951 {
2952 { "(bad)", { XX } },
2953 { "(bad)", { XX } },
2954 { "pcmpeqq", { XM, EXx } },
2955 { "(bad)", { XX } },
2956 },
2957
2958 /* PREFIX_0F382A */
2959 {
2960 { "(bad)", { XX } },
2961 { "(bad)", { XX } },
2962 { MOD_TABLE (MOD_0F382A_PREFIX_2) },
2963 { "(bad)", { XX } },
2964 },
2965
2966 /* PREFIX_0F382B */
2967 {
2968 { "(bad)", { XX } },
2969 { "(bad)", { XX } },
2970 { "packusdw", { XM, EXx } },
2971 { "(bad)", { XX } },
2972 },
2973
2974 /* PREFIX_0F3830 */
2975 {
2976 { "(bad)", { XX } },
2977 { "(bad)", { XX } },
2978 { "pmovzxbw", { XM, EXq } },
2979 { "(bad)", { XX } },
2980 },
2981
2982 /* PREFIX_0F3831 */
2983 {
2984 { "(bad)", { XX } },
2985 { "(bad)", { XX } },
2986 { "pmovzxbd", { XM, EXd } },
2987 { "(bad)", { XX } },
2988 },
2989
2990 /* PREFIX_0F3832 */
2991 {
2992 { "(bad)", { XX } },
2993 { "(bad)", { XX } },
2994 { "pmovzxbq", { XM, EXw } },
2995 { "(bad)", { XX } },
2996 },
2997
2998 /* PREFIX_0F3833 */
2999 {
3000 { "(bad)", { XX } },
3001 { "(bad)", { XX } },
3002 { "pmovzxwd", { XM, EXq } },
3003 { "(bad)", { XX } },
3004 },
3005
3006 /* PREFIX_0F3834 */
3007 {
3008 { "(bad)", { XX } },
3009 { "(bad)", { XX } },
3010 { "pmovzxwq", { XM, EXd } },
3011 { "(bad)", { XX } },
3012 },
3013
3014 /* PREFIX_0F3835 */
3015 {
3016 { "(bad)", { XX } },
3017 { "(bad)", { XX } },
3018 { "pmovzxdq", { XM, EXq } },
3019 { "(bad)", { XX } },
3020 },
3021
3022 /* PREFIX_0F3837 */
3023 {
3024 { "(bad)", { XX } },
3025 { "(bad)", { XX } },
3026 { "pcmpgtq", { XM, EXx } },
3027 { "(bad)", { XX } },
3028 },
3029
3030 /* PREFIX_0F3838 */
3031 {
3032 { "(bad)", { XX } },
3033 { "(bad)", { XX } },
3034 { "pminsb", { XM, EXx } },
3035 { "(bad)", { XX } },
3036 },
3037
3038 /* PREFIX_0F3839 */
3039 {
3040 { "(bad)", { XX } },
3041 { "(bad)", { XX } },
3042 { "pminsd", { XM, EXx } },
3043 { "(bad)", { XX } },
3044 },
3045
3046 /* PREFIX_0F383A */
3047 {
3048 { "(bad)", { XX } },
3049 { "(bad)", { XX } },
3050 { "pminuw", { XM, EXx } },
3051 { "(bad)", { XX } },
3052 },
3053
3054 /* PREFIX_0F383B */
3055 {
3056 { "(bad)", { XX } },
3057 { "(bad)", { XX } },
3058 { "pminud", { XM, EXx } },
3059 { "(bad)", { XX } },
3060 },
3061
3062 /* PREFIX_0F383C */
3063 {
3064 { "(bad)", { XX } },
3065 { "(bad)", { XX } },
3066 { "pmaxsb", { XM, EXx } },
3067 { "(bad)", { XX } },
3068 },
3069
3070 /* PREFIX_0F383D */
3071 {
3072 { "(bad)", { XX } },
3073 { "(bad)", { XX } },
3074 { "pmaxsd", { XM, EXx } },
3075 { "(bad)", { XX } },
3076 },
3077
3078 /* PREFIX_0F383E */
3079 {
3080 { "(bad)", { XX } },
3081 { "(bad)", { XX } },
3082 { "pmaxuw", { XM, EXx } },
3083 { "(bad)", { XX } },
3084 },
3085
3086 /* PREFIX_0F383F */
3087 {
3088 { "(bad)", { XX } },
3089 { "(bad)", { XX } },
3090 { "pmaxud", { XM, EXx } },
3091 { "(bad)", { XX } },
3092 },
3093
3094 /* PREFIX_0F3840 */
3095 {
3096 { "(bad)", { XX } },
3097 { "(bad)", { XX } },
3098 { "pmulld", { XM, EXx } },
3099 { "(bad)", { XX } },
3100 },
3101
3102 /* PREFIX_0F3841 */
3103 {
3104 { "(bad)", { XX } },
3105 { "(bad)", { XX } },
3106 { "phminposuw", { XM, EXx } },
3107 { "(bad)", { XX } },
3108 },
3109
3110 /* PREFIX_0F3880 */
3111 {
3112 { "(bad)", { XX } },
3113 { "(bad)", { XX } },
3114 { "invept", { Gm, Mo } },
3115 { "(bad)", { XX } },
3116 },
3117
3118 /* PREFIX_0F3881 */
3119 {
3120 { "(bad)", { XX } },
3121 { "(bad)", { XX } },
3122 { "invvpid", { Gm, Mo } },
3123 { "(bad)", { XX } },
3124 },
3125
3126 /* PREFIX_0F38DB */
3127 {
3128 { "(bad)", { XX } },
3129 { "(bad)", { XX } },
3130 { "aesimc", { XM, EXx } },
3131 { "(bad)", { XX } },
3132 },
3133
3134 /* PREFIX_0F38DC */
3135 {
3136 { "(bad)", { XX } },
3137 { "(bad)", { XX } },
3138 { "aesenc", { XM, EXx } },
3139 { "(bad)", { XX } },
3140 },
3141
3142 /* PREFIX_0F38DD */
3143 {
3144 { "(bad)", { XX } },
3145 { "(bad)", { XX } },
3146 { "aesenclast", { XM, EXx } },
3147 { "(bad)", { XX } },
3148 },
3149
3150 /* PREFIX_0F38DE */
3151 {
3152 { "(bad)", { XX } },
3153 { "(bad)", { XX } },
3154 { "aesdec", { XM, EXx } },
3155 { "(bad)", { XX } },
3156 },
3157
3158 /* PREFIX_0F38DF */
3159 {
3160 { "(bad)", { XX } },
3161 { "(bad)", { XX } },
3162 { "aesdeclast", { XM, EXx } },
3163 { "(bad)", { XX } },
3164 },
3165
3166 /* PREFIX_0F38F0 */
3167 {
3168 { "movbeS", { Gv, { MOVBE_Fixup, v_mode } } },
3169 { "(bad)", { XX } },
3170 { "movbeS", { Gv, { MOVBE_Fixup, v_mode } } },
3171 { "crc32", { Gdq, { CRC32_Fixup, b_mode } } },
3172 },
3173
3174 /* PREFIX_0F38F1 */
3175 {
3176 { "movbeS", { { MOVBE_Fixup, v_mode }, Gv } },
3177 { "(bad)", { XX } },
3178 { "movbeS", { { MOVBE_Fixup, v_mode }, Gv } },
3179 { "crc32", { Gdq, { CRC32_Fixup, v_mode } } },
3180 },
3181
3182 /* PREFIX_0F3A08 */
3183 {
3184 { "(bad)", { XX } },
3185 { "(bad)", { XX } },
3186 { "roundps", { XM, EXx, Ib } },
3187 { "(bad)", { XX } },
3188 },
3189
3190 /* PREFIX_0F3A09 */
3191 {
3192 { "(bad)", { XX } },
3193 { "(bad)", { XX } },
3194 { "roundpd", { XM, EXx, Ib } },
3195 { "(bad)", { XX } },
3196 },
3197
3198 /* PREFIX_0F3A0A */
3199 {
3200 { "(bad)", { XX } },
3201 { "(bad)", { XX } },
3202 { "roundss", { XM, EXd, Ib } },
3203 { "(bad)", { XX } },
3204 },
3205
3206 /* PREFIX_0F3A0B */
3207 {
3208 { "(bad)", { XX } },
3209 { "(bad)", { XX } },
3210 { "roundsd", { XM, EXq, Ib } },
3211 { "(bad)", { XX } },
3212 },
3213
3214 /* PREFIX_0F3A0C */
3215 {
3216 { "(bad)", { XX } },
3217 { "(bad)", { XX } },
3218 { "blendps", { XM, EXx, Ib } },
3219 { "(bad)", { XX } },
3220 },
3221
3222 /* PREFIX_0F3A0D */
3223 {
3224 { "(bad)", { XX } },
3225 { "(bad)", { XX } },
3226 { "blendpd", { XM, EXx, Ib } },
3227 { "(bad)", { XX } },
3228 },
3229
3230 /* PREFIX_0F3A0E */
3231 {
3232 { "(bad)", { XX } },
3233 { "(bad)", { XX } },
3234 { "pblendw", { XM, EXx, Ib } },
3235 { "(bad)", { XX } },
3236 },
3237
3238 /* PREFIX_0F3A14 */
3239 {
3240 { "(bad)", { XX } },
3241 { "(bad)", { XX } },
3242 { "pextrb", { Edqb, XM, Ib } },
3243 { "(bad)", { XX } },
3244 },
3245
3246 /* PREFIX_0F3A15 */
3247 {
3248 { "(bad)", { XX } },
3249 { "(bad)", { XX } },
3250 { "pextrw", { Edqw, XM, Ib } },
3251 { "(bad)", { XX } },
3252 },
3253
3254 /* PREFIX_0F3A16 */
3255 {
3256 { "(bad)", { XX } },
3257 { "(bad)", { XX } },
3258 { "pextrK", { Edq, XM, Ib } },
3259 { "(bad)", { XX } },
3260 },
3261
3262 /* PREFIX_0F3A17 */
3263 {
3264 { "(bad)", { XX } },
3265 { "(bad)", { XX } },
3266 { "extractps", { Edqd, XM, Ib } },
3267 { "(bad)", { XX } },
3268 },
3269
3270 /* PREFIX_0F3A20 */
3271 {
3272 { "(bad)", { XX } },
3273 { "(bad)", { XX } },
3274 { "pinsrb", { XM, Edqb, Ib } },
3275 { "(bad)", { XX } },
3276 },
3277
3278 /* PREFIX_0F3A21 */
3279 {
3280 { "(bad)", { XX } },
3281 { "(bad)", { XX } },
3282 { "insertps", { XM, EXd, Ib } },
3283 { "(bad)", { XX } },
3284 },
3285
3286 /* PREFIX_0F3A22 */
3287 {
3288 { "(bad)", { XX } },
3289 { "(bad)", { XX } },
3290 { "pinsrK", { XM, Edq, Ib } },
3291 { "(bad)", { XX } },
3292 },
3293
3294 /* PREFIX_0F3A40 */
3295 {
3296 { "(bad)", { XX } },
3297 { "(bad)", { XX } },
3298 { "dpps", { XM, EXx, Ib } },
3299 { "(bad)", { XX } },
3300 },
3301
3302 /* PREFIX_0F3A41 */
3303 {
3304 { "(bad)", { XX } },
3305 { "(bad)", { XX } },
3306 { "dppd", { XM, EXx, Ib } },
3307 { "(bad)", { XX } },
3308 },
3309
3310 /* PREFIX_0F3A42 */
3311 {
3312 { "(bad)", { XX } },
3313 { "(bad)", { XX } },
3314 { "mpsadbw", { XM, EXx, Ib } },
3315 { "(bad)", { XX } },
3316 },
3317
3318 /* PREFIX_0F3A44 */
3319 {
3320 { "(bad)", { XX } },
3321 { "(bad)", { XX } },
3322 { "pclmulqdq", { XM, EXx, PCLMUL } },
3323 { "(bad)", { XX } },
3324 },
3325
3326 /* PREFIX_0F3A60 */
3327 {
3328 { "(bad)", { XX } },
3329 { "(bad)", { XX } },
3330 { "pcmpestrm", { XM, EXx, Ib } },
3331 { "(bad)", { XX } },
3332 },
3333
3334 /* PREFIX_0F3A61 */
3335 {
3336 { "(bad)", { XX } },
3337 { "(bad)", { XX } },
3338 { "pcmpestri", { XM, EXx, Ib } },
3339 { "(bad)", { XX } },
3340 },
3341
3342 /* PREFIX_0F3A62 */
3343 {
3344 { "(bad)", { XX } },
3345 { "(bad)", { XX } },
3346 { "pcmpistrm", { XM, EXx, Ib } },
3347 { "(bad)", { XX } },
3348 },
3349
3350 /* PREFIX_0F3A63 */
3351 {
3352 { "(bad)", { XX } },
3353 { "(bad)", { XX } },
3354 { "pcmpistri", { XM, EXx, Ib } },
3355 { "(bad)", { XX } },
3356 },
3357
3358 /* PREFIX_0F3ADF */
3359 {
3360 { "(bad)", { XX } },
3361 { "(bad)", { XX } },
3362 { "aeskeygenassist", { XM, EXx, Ib } },
3363 { "(bad)", { XX } },
3364 },
3365
3366 /* PREFIX_VEX_10 */
3367 {
3368 { "vmovups", { XM, EXx } },
3369 { VEX_LEN_TABLE (VEX_LEN_10_P_1) },
3370 { "vmovupd", { XM, EXx } },
3371 { VEX_LEN_TABLE (VEX_LEN_10_P_3) },
3372 },
3373
3374 /* PREFIX_VEX_11 */
3375 {
3376 { "vmovups", { EXxS, XM } },
3377 { VEX_LEN_TABLE (VEX_LEN_11_P_1) },
3378 { "vmovupd", { EXxS, XM } },
3379 { VEX_LEN_TABLE (VEX_LEN_11_P_3) },
3380 },
3381
3382 /* PREFIX_VEX_12 */
3383 {
3384 { MOD_TABLE (MOD_VEX_12_PREFIX_0) },
3385 { "vmovsldup", { XM, EXx } },
3386 { VEX_LEN_TABLE (VEX_LEN_12_P_2) },
3387 { "vmovddup", { XM, EXymmq } },
3388 },
3389
3390 /* PREFIX_VEX_16 */
3391 {
3392 { MOD_TABLE (MOD_VEX_16_PREFIX_0) },
3393 { "vmovshdup", { XM, EXx } },
3394 { VEX_LEN_TABLE (VEX_LEN_16_P_2) },
3395 { "(bad)", { XX } },
3396 },
3397
3398 /* PREFIX_VEX_2A */
3399 {
3400 { "(bad)", { XX } },
3401 { VEX_LEN_TABLE (VEX_LEN_2A_P_1) },
3402 { "(bad)", { XX } },
3403 { VEX_LEN_TABLE (VEX_LEN_2A_P_3) },
3404 },
3405
3406 /* PREFIX_VEX_2C */
3407 {
3408 { "(bad)", { XX } },
3409 { VEX_LEN_TABLE (VEX_LEN_2C_P_1) },
3410 { "(bad)", { XX } },
3411 { VEX_LEN_TABLE (VEX_LEN_2C_P_3) },
3412 },
3413
3414 /* PREFIX_VEX_2D */
3415 {
3416 { "(bad)", { XX } },
3417 { VEX_LEN_TABLE (VEX_LEN_2D_P_1) },
3418 { "(bad)", { XX } },
3419 { VEX_LEN_TABLE (VEX_LEN_2D_P_3) },
3420 },
3421
3422 /* PREFIX_VEX_2E */
3423 {
3424 { VEX_LEN_TABLE (VEX_LEN_2E_P_0) },
3425 { "(bad)", { XX } },
3426 { VEX_LEN_TABLE (VEX_LEN_2E_P_2) },
3427 { "(bad)", { XX } },
3428 },
3429
3430 /* PREFIX_VEX_2F */
3431 {
3432 { VEX_LEN_TABLE (VEX_LEN_2F_P_0) },
3433 { "(bad)", { XX } },
3434 { VEX_LEN_TABLE (VEX_LEN_2F_P_2) },
3435 { "(bad)", { XX } },
3436 },
3437
3438 /* PREFIX_VEX_51 */
3439 {
3440 { "vsqrtps", { XM, EXx } },
3441 { VEX_LEN_TABLE (VEX_LEN_51_P_1) },
3442 { "vsqrtpd", { XM, EXx } },
3443 { VEX_LEN_TABLE (VEX_LEN_51_P_3) },
3444 },
3445
3446 /* PREFIX_VEX_52 */
3447 {
3448 { "vrsqrtps", { XM, EXx } },
3449 { VEX_LEN_TABLE (VEX_LEN_52_P_1) },
3450 { "(bad)", { XX } },
3451 { "(bad)", { XX } },
3452 },
3453
3454 /* PREFIX_VEX_53 */
3455 {
3456 { "vrcpps", { XM, EXx } },
3457 { VEX_LEN_TABLE (VEX_LEN_53_P_1) },
3458 { "(bad)", { XX } },
3459 { "(bad)", { XX } },
3460 },
3461
3462 /* PREFIX_VEX_58 */
3463 {
3464 { "vaddps", { XM, Vex, EXx } },
3465 { VEX_LEN_TABLE (VEX_LEN_58_P_1) },
3466 { "vaddpd", { XM, Vex, EXx } },
3467 { VEX_LEN_TABLE (VEX_LEN_58_P_3) },
3468 },
3469
3470 /* PREFIX_VEX_59 */
3471 {
3472 { "vmulps", { XM, Vex, EXx } },
3473 { VEX_LEN_TABLE (VEX_LEN_59_P_1) },
3474 { "vmulpd", { XM, Vex, EXx } },
3475 { VEX_LEN_TABLE (VEX_LEN_59_P_3) },
3476 },
3477
3478 /* PREFIX_VEX_5A */
3479 {
3480 { "vcvtps2pd", { XM, EXxmmq } },
3481 { VEX_LEN_TABLE (VEX_LEN_5A_P_1) },
3482 { "vcvtpd2ps%XY", { XMM, EXx } },
3483 { VEX_LEN_TABLE (VEX_LEN_5A_P_3) },
3484 },
3485
3486 /* PREFIX_VEX_5B */
3487 {
3488 { "vcvtdq2ps", { XM, EXx } },
3489 { "vcvttps2dq", { XM, EXx } },
3490 { "vcvtps2dq", { XM, EXx } },
3491 { "(bad)", { XX } },
3492 },
3493
3494 /* PREFIX_VEX_5C */
3495 {
3496 { "vsubps", { XM, Vex, EXx } },
3497 { VEX_LEN_TABLE (VEX_LEN_5C_P_1) },
3498 { "vsubpd", { XM, Vex, EXx } },
3499 { VEX_LEN_TABLE (VEX_LEN_5C_P_3) },
3500 },
3501
3502 /* PREFIX_VEX_5D */
3503 {
3504 { "vminps", { XM, Vex, EXx } },
3505 { VEX_LEN_TABLE (VEX_LEN_5D_P_1) },
3506 { "vminpd", { XM, Vex, EXx } },
3507 { VEX_LEN_TABLE (VEX_LEN_5D_P_3) },
3508 },
3509
3510 /* PREFIX_VEX_5E */
3511 {
3512 { "vdivps", { XM, Vex, EXx } },
3513 { VEX_LEN_TABLE (VEX_LEN_5E_P_1) },
3514 { "vdivpd", { XM, Vex, EXx } },
3515 { VEX_LEN_TABLE (VEX_LEN_5E_P_3) },
3516 },
3517
3518 /* PREFIX_VEX_5F */
3519 {
3520 { "vmaxps", { XM, Vex, EXx } },
3521 { VEX_LEN_TABLE (VEX_LEN_5F_P_1) },
3522 { "vmaxpd", { XM, Vex, EXx } },
3523 { VEX_LEN_TABLE (VEX_LEN_5F_P_3) },
3524 },
3525
3526 /* PREFIX_VEX_60 */
3527 {
3528 { "(bad)", { XX } },
3529 { "(bad)", { XX } },
3530 { VEX_LEN_TABLE (VEX_LEN_60_P_2) },
3531 { "(bad)", { XX } },
3532 },
3533
3534 /* PREFIX_VEX_61 */
3535 {
3536 { "(bad)", { XX } },
3537 { "(bad)", { XX } },
3538 { VEX_LEN_TABLE (VEX_LEN_61_P_2) },
3539 { "(bad)", { XX } },
3540 },
3541
3542 /* PREFIX_VEX_62 */
3543 {
3544 { "(bad)", { XX } },
3545 { "(bad)", { XX } },
3546 { VEX_LEN_TABLE (VEX_LEN_62_P_2) },
3547 { "(bad)", { XX } },
3548 },
3549
3550 /* PREFIX_VEX_63 */
3551 {
3552 { "(bad)", { XX } },
3553 { "(bad)", { XX } },
3554 { VEX_LEN_TABLE (VEX_LEN_63_P_2) },
3555 { "(bad)", { XX } },
3556 },
3557
3558 /* PREFIX_VEX_64 */
3559 {
3560 { "(bad)", { XX } },
3561 { "(bad)", { XX } },
3562 { VEX_LEN_TABLE (VEX_LEN_64_P_2) },
3563 { "(bad)", { XX } },
3564 },
3565
3566 /* PREFIX_VEX_65 */
3567 {
3568 { "(bad)", { XX } },
3569 { "(bad)", { XX } },
3570 { VEX_LEN_TABLE (VEX_LEN_65_P_2) },
3571 { "(bad)", { XX } },
3572 },
3573
3574 /* PREFIX_VEX_66 */
3575 {
3576 { "(bad)", { XX } },
3577 { "(bad)", { XX } },
3578 { VEX_LEN_TABLE (VEX_LEN_66_P_2) },
3579 { "(bad)", { XX } },
3580 },
3581
3582 /* PREFIX_VEX_67 */
3583 {
3584 { "(bad)", { XX } },
3585 { "(bad)", { XX } },
3586 { VEX_LEN_TABLE (VEX_LEN_67_P_2) },
3587 { "(bad)", { XX } },
3588 },
3589
3590 /* PREFIX_VEX_68 */
3591 {
3592 { "(bad)", { XX } },
3593 { "(bad)", { XX } },
3594 { VEX_LEN_TABLE (VEX_LEN_68_P_2) },
3595 { "(bad)", { XX } },
3596 },
3597
3598 /* PREFIX_VEX_69 */
3599 {
3600 { "(bad)", { XX } },
3601 { "(bad)", { XX } },
3602 { VEX_LEN_TABLE (VEX_LEN_69_P_2) },
3603 { "(bad)", { XX } },
3604 },
3605
3606 /* PREFIX_VEX_6A */
3607 {
3608 { "(bad)", { XX } },
3609 { "(bad)", { XX } },
3610 { VEX_LEN_TABLE (VEX_LEN_6A_P_2) },
3611 { "(bad)", { XX } },
3612 },
3613
3614 /* PREFIX_VEX_6B */
3615 {
3616 { "(bad)", { XX } },
3617 { "(bad)", { XX } },
3618 { VEX_LEN_TABLE (VEX_LEN_6B_P_2) },
3619 { "(bad)", { XX } },
3620 },
3621
3622 /* PREFIX_VEX_6C */
3623 {
3624 { "(bad)", { XX } },
3625 { "(bad)", { XX } },
3626 { VEX_LEN_TABLE (VEX_LEN_6C_P_2) },
3627 { "(bad)", { XX } },
3628 },
3629
3630 /* PREFIX_VEX_6D */
3631 {
3632 { "(bad)", { XX } },
3633 { "(bad)", { XX } },
3634 { VEX_LEN_TABLE (VEX_LEN_6D_P_2) },
3635 { "(bad)", { XX } },
3636 },
3637
3638 /* PREFIX_VEX_6E */
3639 {
3640 { "(bad)", { XX } },
3641 { "(bad)", { XX } },
3642 { VEX_LEN_TABLE (VEX_LEN_6E_P_2) },
3643 { "(bad)", { XX } },
3644 },
3645
3646 /* PREFIX_VEX_6F */
3647 {
3648 { "(bad)", { XX } },
3649 { "vmovdqu", { XM, EXx } },
3650 { "vmovdqa", { XM, EXx } },
3651 { "(bad)", { XX } },
3652 },
3653
3654 /* PREFIX_VEX_70 */
3655 {
3656 { "(bad)", { XX } },
3657 { VEX_LEN_TABLE (VEX_LEN_70_P_1) },
3658 { VEX_LEN_TABLE (VEX_LEN_70_P_2) },
3659 { VEX_LEN_TABLE (VEX_LEN_70_P_3) },
3660 },
3661
3662 /* PREFIX_VEX_71_REG_2 */
3663 {
3664 { "(bad)", { XX } },
3665 { "(bad)", { XX } },
3666 { VEX_LEN_TABLE (VEX_LEN_71_R_2_P_2) },
3667 { "(bad)", { XX } },
3668 },
3669
3670 /* PREFIX_VEX_71_REG_4 */
3671 {
3672 { "(bad)", { XX } },
3673 { "(bad)", { XX } },
3674 { VEX_LEN_TABLE (VEX_LEN_71_R_4_P_2) },
3675 { "(bad)", { XX } },
3676 },
3677
3678 /* PREFIX_VEX_71_REG_6 */
3679 {
3680 { "(bad)", { XX } },
3681 { "(bad)", { XX } },
3682 { VEX_LEN_TABLE (VEX_LEN_71_R_6_P_2) },
3683 { "(bad)", { XX } },
3684 },
3685
3686 /* PREFIX_VEX_72_REG_2 */
3687 {
3688 { "(bad)", { XX } },
3689 { "(bad)", { XX } },
3690 { VEX_LEN_TABLE (VEX_LEN_72_R_2_P_2) },
3691 { "(bad)", { XX } },
3692 },
3693
3694 /* PREFIX_VEX_72_REG_4 */
3695 {
3696 { "(bad)", { XX } },
3697 { "(bad)", { XX } },
3698 { VEX_LEN_TABLE (VEX_LEN_72_R_4_P_2) },
3699 { "(bad)", { XX } },
3700 },
3701
3702 /* PREFIX_VEX_72_REG_6 */
3703 {
3704 { "(bad)", { XX } },
3705 { "(bad)", { XX } },
3706 { VEX_LEN_TABLE (VEX_LEN_72_R_6_P_2) },
3707 { "(bad)", { XX } },
3708 },
3709
3710 /* PREFIX_VEX_73_REG_2 */
3711 {
3712 { "(bad)", { XX } },
3713 { "(bad)", { XX } },
3714 { VEX_LEN_TABLE (VEX_LEN_73_R_2_P_2) },
3715 { "(bad)", { XX } },
3716 },
3717
3718 /* PREFIX_VEX_73_REG_3 */
3719 {
3720 { "(bad)", { XX } },
3721 { "(bad)", { XX } },
3722 { VEX_LEN_TABLE (VEX_LEN_73_R_3_P_2) },
3723 { "(bad)", { XX } },
3724 },
3725
3726 /* PREFIX_VEX_73_REG_6 */
3727 {
3728 { "(bad)", { XX } },
3729 { "(bad)", { XX } },
3730 { VEX_LEN_TABLE (VEX_LEN_73_R_6_P_2) },
3731 { "(bad)", { XX } },
3732 },
3733
3734 /* PREFIX_VEX_73_REG_7 */
3735 {
3736 { "(bad)", { XX } },
3737 { "(bad)", { XX } },
3738 { VEX_LEN_TABLE (VEX_LEN_73_R_7_P_2) },
3739 { "(bad)", { XX } },
3740 },
3741
3742 /* PREFIX_VEX_74 */
3743 {
3744 { "(bad)", { XX } },
3745 { "(bad)", { XX } },
3746 { VEX_LEN_TABLE (VEX_LEN_74_P_2) },
3747 { "(bad)", { XX } },
3748 },
3749
3750 /* PREFIX_VEX_75 */
3751 {
3752 { "(bad)", { XX } },
3753 { "(bad)", { XX } },
3754 { VEX_LEN_TABLE (VEX_LEN_75_P_2) },
3755 { "(bad)", { XX } },
3756 },
3757
3758 /* PREFIX_VEX_76 */
3759 {
3760 { "(bad)", { XX } },
3761 { "(bad)", { XX } },
3762 { VEX_LEN_TABLE (VEX_LEN_76_P_2) },
3763 { "(bad)", { XX } },
3764 },
3765
3766 /* PREFIX_VEX_77 */
3767 {
3768 { "", { VZERO } },
3769 { "(bad)", { XX } },
3770 { "(bad)", { XX } },
3771 { "(bad)", { XX } },
3772 },
3773
3774 /* PREFIX_VEX_7C */
3775 {
3776 { "(bad)", { XX } },
3777 { "(bad)", { XX } },
3778 { "vhaddpd", { XM, Vex, EXx } },
3779 { "vhaddps", { XM, Vex, EXx } },
3780 },
3781
3782 /* PREFIX_VEX_7D */
3783 {
3784 { "(bad)", { XX } },
3785 { "(bad)", { XX } },
3786 { "vhsubpd", { XM, Vex, EXx } },
3787 { "vhsubps", { XM, Vex, EXx } },
3788 },
3789
3790 /* PREFIX_VEX_7E */
3791 {
3792 { "(bad)", { XX } },
3793 { VEX_LEN_TABLE (VEX_LEN_7E_P_1) },
3794 { VEX_LEN_TABLE (VEX_LEN_7E_P_2) },
3795 { "(bad)", { XX } },
3796 },
3797
3798 /* PREFIX_VEX_7F */
3799 {
3800 { "(bad)", { XX } },
3801 { "vmovdqu", { EXxS, XM } },
3802 { "vmovdqa", { EXxS, XM } },
3803 { "(bad)", { XX } },
3804 },
3805
3806 /* PREFIX_VEX_C2 */
3807 {
3808 { "vcmpps", { XM, Vex, EXx, VCMP } },
3809 { VEX_LEN_TABLE (VEX_LEN_C2_P_1) },
3810 { "vcmppd", { XM, Vex, EXx, VCMP } },
3811 { VEX_LEN_TABLE (VEX_LEN_C2_P_3) },
3812 },
3813
3814 /* PREFIX_VEX_C4 */
3815 {
3816 { "(bad)", { XX } },
3817 { "(bad)", { XX } },
3818 { VEX_LEN_TABLE (VEX_LEN_C4_P_2) },
3819 { "(bad)", { XX } },
3820 },
3821
3822 /* PREFIX_VEX_C5 */
3823 {
3824 { "(bad)", { XX } },
3825 { "(bad)", { XX } },
3826 { VEX_LEN_TABLE (VEX_LEN_C5_P_2) },
3827 { "(bad)", { XX } },
3828 },
3829
3830 /* PREFIX_VEX_D0 */
3831 {
3832 { "(bad)", { XX } },
3833 { "(bad)", { XX } },
3834 { "vaddsubpd", { XM, Vex, EXx } },
3835 { "vaddsubps", { XM, Vex, EXx } },
3836 },
3837
3838 /* PREFIX_VEX_D1 */
3839 {
3840 { "(bad)", { XX } },
3841 { "(bad)", { XX } },
3842 { VEX_LEN_TABLE (VEX_LEN_D1_P_2) },
3843 { "(bad)", { XX } },
3844 },
3845
3846 /* PREFIX_VEX_D2 */
3847 {
3848 { "(bad)", { XX } },
3849 { "(bad)", { XX } },
3850 { VEX_LEN_TABLE (VEX_LEN_D2_P_2) },
3851 { "(bad)", { XX } },
3852 },
3853
3854 /* PREFIX_VEX_D3 */
3855 {
3856 { "(bad)", { XX } },
3857 { "(bad)", { XX } },
3858 { VEX_LEN_TABLE (VEX_LEN_D3_P_2) },
3859 { "(bad)", { XX } },
3860 },
3861
3862 /* PREFIX_VEX_D4 */
3863 {
3864 { "(bad)", { XX } },
3865 { "(bad)", { XX } },
3866 { VEX_LEN_TABLE (VEX_LEN_D4_P_2) },
3867 { "(bad)", { XX } },
3868 },
3869
3870 /* PREFIX_VEX_D5 */
3871 {
3872 { "(bad)", { XX } },
3873 { "(bad)", { XX } },
3874 { VEX_LEN_TABLE (VEX_LEN_D5_P_2) },
3875 { "(bad)", { XX } },
3876 },
3877
3878 /* PREFIX_VEX_D6 */
3879 {
3880 { "(bad)", { XX } },
3881 { "(bad)", { XX } },
3882 { VEX_LEN_TABLE (VEX_LEN_D6_P_2) },
3883 { "(bad)", { XX } },
3884 },
3885
3886 /* PREFIX_VEX_D7 */
3887 {
3888 { "(bad)", { XX } },
3889 { "(bad)", { XX } },
3890 { MOD_TABLE (MOD_VEX_D7_PREFIX_2) },
3891 { "(bad)", { XX } },
3892 },
3893
3894 /* PREFIX_VEX_D8 */
3895 {
3896 { "(bad)", { XX } },
3897 { "(bad)", { XX } },
3898 { VEX_LEN_TABLE (VEX_LEN_D8_P_2) },
3899 { "(bad)", { XX } },
3900 },
3901
3902 /* PREFIX_VEX_D9 */
3903 {
3904 { "(bad)", { XX } },
3905 { "(bad)", { XX } },
3906 { VEX_LEN_TABLE (VEX_LEN_D9_P_2) },
3907 { "(bad)", { XX } },
3908 },
3909
3910 /* PREFIX_VEX_DA */
3911 {
3912 { "(bad)", { XX } },
3913 { "(bad)", { XX } },
3914 { VEX_LEN_TABLE (VEX_LEN_DA_P_2) },
3915 { "(bad)", { XX } },
3916 },
3917
3918 /* PREFIX_VEX_DB */
3919 {
3920 { "(bad)", { XX } },
3921 { "(bad)", { XX } },
3922 { VEX_LEN_TABLE (VEX_LEN_DB_P_2) },
3923 { "(bad)", { XX } },
3924 },
3925
3926 /* PREFIX_VEX_DC */
3927 {
3928 { "(bad)", { XX } },
3929 { "(bad)", { XX } },
3930 { VEX_LEN_TABLE (VEX_LEN_DC_P_2) },
3931 { "(bad)", { XX } },
3932 },
3933
3934 /* PREFIX_VEX_DD */
3935 {
3936 { "(bad)", { XX } },
3937 { "(bad)", { XX } },
3938 { VEX_LEN_TABLE (VEX_LEN_DD_P_2) },
3939 { "(bad)", { XX } },
3940 },
3941
3942 /* PREFIX_VEX_DE */
3943 {
3944 { "(bad)", { XX } },
3945 { "(bad)", { XX } },
3946 { VEX_LEN_TABLE (VEX_LEN_DE_P_2) },
3947 { "(bad)", { XX } },
3948 },
3949
3950 /* PREFIX_VEX_DF */
3951 {
3952 { "(bad)", { XX } },
3953 { "(bad)", { XX } },
3954 { VEX_LEN_TABLE (VEX_LEN_DF_P_2) },
3955 { "(bad)", { XX } },
3956 },
3957
3958 /* PREFIX_VEX_E0 */
3959 {
3960 { "(bad)", { XX } },
3961 { "(bad)", { XX } },
3962 { VEX_LEN_TABLE (VEX_LEN_E0_P_2) },
3963 { "(bad)", { XX } },
3964 },
3965
3966 /* PREFIX_VEX_E1 */
3967 {
3968 { "(bad)", { XX } },
3969 { "(bad)", { XX } },
3970 { VEX_LEN_TABLE (VEX_LEN_E1_P_2) },
3971 { "(bad)", { XX } },
3972 },
3973
3974 /* PREFIX_VEX_E2 */
3975 {
3976 { "(bad)", { XX } },
3977 { "(bad)", { XX } },
3978 { VEX_LEN_TABLE (VEX_LEN_E2_P_2) },
3979 { "(bad)", { XX } },
3980 },
3981
3982 /* PREFIX_VEX_E3 */
3983 {
3984 { "(bad)", { XX } },
3985 { "(bad)", { XX } },
3986 { VEX_LEN_TABLE (VEX_LEN_E3_P_2) },
3987 { "(bad)", { XX } },
3988 },
3989
3990 /* PREFIX_VEX_E4 */
3991 {
3992 { "(bad)", { XX } },
3993 { "(bad)", { XX } },
3994 { VEX_LEN_TABLE (VEX_LEN_E4_P_2) },
3995 { "(bad)", { XX } },
3996 },
3997
3998 /* PREFIX_VEX_E5 */
3999 {
4000 { "(bad)", { XX } },
4001 { "(bad)", { XX } },
4002 { VEX_LEN_TABLE (VEX_LEN_E5_P_2) },
4003 { "(bad)", { XX } },
4004 },
4005
4006 /* PREFIX_VEX_E6 */
4007 {
4008 { "(bad)", { XX } },
4009 { "vcvtdq2pd", { XM, EXxmmq } },
4010 { "vcvttpd2dq%XY", { XMM, EXx } },
4011 { "vcvtpd2dq%XY", { XMM, EXx } },
4012 },
4013
4014 /* PREFIX_VEX_E7 */
4015 {
4016 { "(bad)", { XX } },
4017 { "(bad)", { XX } },
4018 { MOD_TABLE (MOD_VEX_E7_PREFIX_2) },
4019 { "(bad)", { XX } },
4020 },
4021
4022 /* PREFIX_VEX_E8 */
4023 {
4024 { "(bad)", { XX } },
4025 { "(bad)", { XX } },
4026 { VEX_LEN_TABLE (VEX_LEN_E8_P_2) },
4027 { "(bad)", { XX } },
4028 },
4029
4030 /* PREFIX_VEX_E9 */
4031 {
4032 { "(bad)", { XX } },
4033 { "(bad)", { XX } },
4034 { VEX_LEN_TABLE (VEX_LEN_E9_P_2) },
4035 { "(bad)", { XX } },
4036 },
4037
4038 /* PREFIX_VEX_EA */
4039 {
4040 { "(bad)", { XX } },
4041 { "(bad)", { XX } },
4042 { VEX_LEN_TABLE (VEX_LEN_EA_P_2) },
4043 { "(bad)", { XX } },
4044 },
4045
4046 /* PREFIX_VEX_EB */
4047 {
4048 { "(bad)", { XX } },
4049 { "(bad)", { XX } },
4050 { VEX_LEN_TABLE (VEX_LEN_EB_P_2) },
4051 { "(bad)", { XX } },
4052 },
4053
4054 /* PREFIX_VEX_EC */
4055 {
4056 { "(bad)", { XX } },
4057 { "(bad)", { XX } },
4058 { VEX_LEN_TABLE (VEX_LEN_EC_P_2) },
4059 { "(bad)", { XX } },
4060 },
4061
4062 /* PREFIX_VEX_ED */
4063 {
4064 { "(bad)", { XX } },
4065 { "(bad)", { XX } },
4066 { VEX_LEN_TABLE (VEX_LEN_ED_P_2) },
4067 { "(bad)", { XX } },
4068 },
4069
4070 /* PREFIX_VEX_EE */
4071 {
4072 { "(bad)", { XX } },
4073 { "(bad)", { XX } },
4074 { VEX_LEN_TABLE (VEX_LEN_EE_P_2) },
4075 { "(bad)", { XX } },
4076 },
4077
4078 /* PREFIX_VEX_EF */
4079 {
4080 { "(bad)", { XX } },
4081 { "(bad)", { XX } },
4082 { VEX_LEN_TABLE (VEX_LEN_EF_P_2) },
4083 { "(bad)", { XX } },
4084 },
4085
4086 /* PREFIX_VEX_F0 */
4087 {
4088 { "(bad)", { XX } },
4089 { "(bad)", { XX } },
4090 { "(bad)", { XX } },
4091 { MOD_TABLE (MOD_VEX_F0_PREFIX_3) },
4092 },
4093
4094 /* PREFIX_VEX_F1 */
4095 {
4096 { "(bad)", { XX } },
4097 { "(bad)", { XX } },
4098 { VEX_LEN_TABLE (VEX_LEN_F1_P_2) },
4099 { "(bad)", { XX } },
4100 },
4101
4102 /* PREFIX_VEX_F2 */
4103 {
4104 { "(bad)", { XX } },
4105 { "(bad)", { XX } },
4106 { VEX_LEN_TABLE (VEX_LEN_F2_P_2) },
4107 { "(bad)", { XX } },
4108 },
4109
4110 /* PREFIX_VEX_F3 */
4111 {
4112 { "(bad)", { XX } },
4113 { "(bad)", { XX } },
4114 { VEX_LEN_TABLE (VEX_LEN_F3_P_2) },
4115 { "(bad)", { XX } },
4116 },
4117
4118 /* PREFIX_VEX_F4 */
4119 {
4120 { "(bad)", { XX } },
4121 { "(bad)", { XX } },
4122 { VEX_LEN_TABLE (VEX_LEN_F4_P_2) },
4123 { "(bad)", { XX } },
4124 },
4125
4126 /* PREFIX_VEX_F5 */
4127 {
4128 { "(bad)", { XX } },
4129 { "(bad)", { XX } },
4130 { VEX_LEN_TABLE (VEX_LEN_F5_P_2) },
4131 { "(bad)", { XX } },
4132 },
4133
4134 /* PREFIX_VEX_F6 */
4135 {
4136 { "(bad)", { XX } },
4137 { "(bad)", { XX } },
4138 { VEX_LEN_TABLE (VEX_LEN_F6_P_2) },
4139 { "(bad)", { XX } },
4140 },
4141
4142 /* PREFIX_VEX_F7 */
4143 {
4144 { "(bad)", { XX } },
4145 { "(bad)", { XX } },
4146 { VEX_LEN_TABLE (VEX_LEN_F7_P_2) },
4147 { "(bad)", { XX } },
4148 },
4149
4150 /* PREFIX_VEX_F8 */
4151 {
4152 { "(bad)", { XX } },
4153 { "(bad)", { XX } },
4154 { VEX_LEN_TABLE (VEX_LEN_F8_P_2) },
4155 { "(bad)", { XX } },
4156 },
4157
4158 /* PREFIX_VEX_F9 */
4159 {
4160 { "(bad)", { XX } },
4161 { "(bad)", { XX } },
4162 { VEX_LEN_TABLE (VEX_LEN_F9_P_2) },
4163 { "(bad)", { XX } },
4164 },
4165
4166 /* PREFIX_VEX_FA */
4167 {
4168 { "(bad)", { XX } },
4169 { "(bad)", { XX } },
4170 { VEX_LEN_TABLE (VEX_LEN_FA_P_2) },
4171 { "(bad)", { XX } },
4172 },
4173
4174 /* PREFIX_VEX_FB */
4175 {
4176 { "(bad)", { XX } },
4177 { "(bad)", { XX } },
4178 { VEX_LEN_TABLE (VEX_LEN_FB_P_2) },
4179 { "(bad)", { XX } },
4180 },
4181
4182 /* PREFIX_VEX_FC */
4183 {
4184 { "(bad)", { XX } },
4185 { "(bad)", { XX } },
4186 { VEX_LEN_TABLE (VEX_LEN_FC_P_2) },
4187 { "(bad)", { XX } },
4188 },
4189
4190 /* PREFIX_VEX_FD */
4191 {
4192 { "(bad)", { XX } },
4193 { "(bad)", { XX } },
4194 { VEX_LEN_TABLE (VEX_LEN_FD_P_2) },
4195 { "(bad)", { XX } },
4196 },
4197
4198 /* PREFIX_VEX_FE */
4199 {
4200 { "(bad)", { XX } },
4201 { "(bad)", { XX } },
4202 { VEX_LEN_TABLE (VEX_LEN_FE_P_2) },
4203 { "(bad)", { XX } },
4204 },
4205
4206 /* PREFIX_VEX_3800 */
4207 {
4208 { "(bad)", { XX } },
4209 { "(bad)", { XX } },
4210 { VEX_LEN_TABLE (VEX_LEN_3800_P_2) },
4211 { "(bad)", { XX } },
4212 },
4213
4214 /* PREFIX_VEX_3801 */
4215 {
4216 { "(bad)", { XX } },
4217 { "(bad)", { XX } },
4218 { VEX_LEN_TABLE (VEX_LEN_3801_P_2) },
4219 { "(bad)", { XX } },
4220 },
4221
4222 /* PREFIX_VEX_3802 */
4223 {
4224 { "(bad)", { XX } },
4225 { "(bad)", { XX } },
4226 { VEX_LEN_TABLE (VEX_LEN_3802_P_2) },
4227 { "(bad)", { XX } },
4228 },
4229
4230 /* PREFIX_VEX_3803 */
4231 {
4232 { "(bad)", { XX } },
4233 { "(bad)", { XX } },
4234 { VEX_LEN_TABLE (VEX_LEN_3803_P_2) },
4235 { "(bad)", { XX } },
4236 },
4237
4238 /* PREFIX_VEX_3804 */
4239 {
4240 { "(bad)", { XX } },
4241 { "(bad)", { XX } },
4242 { VEX_LEN_TABLE (VEX_LEN_3804_P_2) },
4243 { "(bad)", { XX } },
4244 },
4245
4246 /* PREFIX_VEX_3805 */
4247 {
4248 { "(bad)", { XX } },
4249 { "(bad)", { XX } },
4250 { VEX_LEN_TABLE (VEX_LEN_3805_P_2) },
4251 { "(bad)", { XX } },
4252 },
4253
4254 /* PREFIX_VEX_3806 */
4255 {
4256 { "(bad)", { XX } },
4257 { "(bad)", { XX } },
4258 { VEX_LEN_TABLE (VEX_LEN_3806_P_2) },
4259 { "(bad)", { XX } },
4260 },
4261
4262 /* PREFIX_VEX_3807 */
4263 {
4264 { "(bad)", { XX } },
4265 { "(bad)", { XX } },
4266 { VEX_LEN_TABLE (VEX_LEN_3807_P_2) },
4267 { "(bad)", { XX } },
4268 },
4269
4270 /* PREFIX_VEX_3808 */
4271 {
4272 { "(bad)", { XX } },
4273 { "(bad)", { XX } },
4274 { VEX_LEN_TABLE (VEX_LEN_3808_P_2) },
4275 { "(bad)", { XX } },
4276 },
4277
4278 /* PREFIX_VEX_3809 */
4279 {
4280 { "(bad)", { XX } },
4281 { "(bad)", { XX } },
4282 { VEX_LEN_TABLE (VEX_LEN_3809_P_2) },
4283 { "(bad)", { XX } },
4284 },
4285
4286 /* PREFIX_VEX_380A */
4287 {
4288 { "(bad)", { XX } },
4289 { "(bad)", { XX } },
4290 { VEX_LEN_TABLE (VEX_LEN_380A_P_2) },
4291 { "(bad)", { XX } },
4292 },
4293
4294 /* PREFIX_VEX_380B */
4295 {
4296 { "(bad)", { XX } },
4297 { "(bad)", { XX } },
4298 { VEX_LEN_TABLE (VEX_LEN_380B_P_2) },
4299 { "(bad)", { XX } },
4300 },
4301
4302 /* PREFIX_VEX_380C */
4303 {
4304 { "(bad)", { XX } },
4305 { "(bad)", { XX } },
4306 { "vpermilps", { XM, Vex, EXx } },
4307 { "(bad)", { XX } },
4308 },
4309
4310 /* PREFIX_VEX_380D */
4311 {
4312 { "(bad)", { XX } },
4313 { "(bad)", { XX } },
4314 { "vpermilpd", { XM, Vex, EXx } },
4315 { "(bad)", { XX } },
4316 },
4317
4318 /* PREFIX_VEX_380E */
4319 {
4320 { "(bad)", { XX } },
4321 { "(bad)", { XX } },
4322 { "vtestps", { XM, EXx } },
4323 { "(bad)", { XX } },
4324 },
4325
4326 /* PREFIX_VEX_380F */
4327 {
4328 { "(bad)", { XX } },
4329 { "(bad)", { XX } },
4330 { "vtestpd", { XM, EXx } },
4331 { "(bad)", { XX } },
4332 },
4333
4334 /* PREFIX_VEX_3817 */
4335 {
4336 { "(bad)", { XX } },
4337 { "(bad)", { XX } },
4338 { "vptest", { XM, EXx } },
4339 { "(bad)", { XX } },
4340 },
4341
4342 /* PREFIX_VEX_3818 */
4343 {
4344 { "(bad)", { XX } },
4345 { "(bad)", { XX } },
4346 { MOD_TABLE (MOD_VEX_3818_PREFIX_2) },
4347 { "(bad)", { XX } },
4348 },
4349
4350 /* PREFIX_VEX_3819 */
4351 {
4352 { "(bad)", { XX } },
4353 { "(bad)", { XX } },
4354 { MOD_TABLE (MOD_VEX_3819_PREFIX_2) },
4355 { "(bad)", { XX } },
4356 },
4357
4358 /* PREFIX_VEX_381A */
4359 {
4360 { "(bad)", { XX } },
4361 { "(bad)", { XX } },
4362 { MOD_TABLE (MOD_VEX_381A_PREFIX_2) },
4363 { "(bad)", { XX } },
4364 },
4365
4366 /* PREFIX_VEX_381C */
4367 {
4368 { "(bad)", { XX } },
4369 { "(bad)", { XX } },
4370 { VEX_LEN_TABLE (VEX_LEN_381C_P_2) },
4371 { "(bad)", { XX } },
4372 },
4373
4374 /* PREFIX_VEX_381D */
4375 {
4376 { "(bad)", { XX } },
4377 { "(bad)", { XX } },
4378 { VEX_LEN_TABLE (VEX_LEN_381D_P_2) },
4379 { "(bad)", { XX } },
4380 },
4381
4382 /* PREFIX_VEX_381E */
4383 {
4384 { "(bad)", { XX } },
4385 { "(bad)", { XX } },
4386 { VEX_LEN_TABLE (VEX_LEN_381E_P_2) },
4387 { "(bad)", { XX } },
4388 },
4389
4390 /* PREFIX_VEX_3820 */
4391 {
4392 { "(bad)", { XX } },
4393 { "(bad)", { XX } },
4394 { VEX_LEN_TABLE (VEX_LEN_3820_P_2) },
4395 { "(bad)", { XX } },
4396 },
4397
4398 /* PREFIX_VEX_3821 */
4399 {
4400 { "(bad)", { XX } },
4401 { "(bad)", { XX } },
4402 { VEX_LEN_TABLE (VEX_LEN_3821_P_2) },
4403 { "(bad)", { XX } },
4404 },
4405
4406 /* PREFIX_VEX_3822 */
4407 {
4408 { "(bad)", { XX } },
4409 { "(bad)", { XX } },
4410 { VEX_LEN_TABLE (VEX_LEN_3822_P_2) },
4411 { "(bad)", { XX } },
4412 },
4413
4414 /* PREFIX_VEX_3823 */
4415 {
4416 { "(bad)", { XX } },
4417 { "(bad)", { XX } },
4418 { VEX_LEN_TABLE (VEX_LEN_3823_P_2) },
4419 { "(bad)", { XX } },
4420 },
4421
4422 /* PREFIX_VEX_3824 */
4423 {
4424 { "(bad)", { XX } },
4425 { "(bad)", { XX } },
4426 { VEX_LEN_TABLE (VEX_LEN_3824_P_2) },
4427 { "(bad)", { XX } },
4428 },
4429
4430 /* PREFIX_VEX_3825 */
4431 {
4432 { "(bad)", { XX } },
4433 { "(bad)", { XX } },
4434 { VEX_LEN_TABLE (VEX_LEN_3825_P_2) },
4435 { "(bad)", { XX } },
4436 },
4437
4438 /* PREFIX_VEX_3828 */
4439 {
4440 { "(bad)", { XX } },
4441 { "(bad)", { XX } },
4442 { VEX_LEN_TABLE (VEX_LEN_3828_P_2) },
4443 { "(bad)", { XX } },
4444 },
4445
4446 /* PREFIX_VEX_3829 */
4447 {
4448 { "(bad)", { XX } },
4449 { "(bad)", { XX } },
4450 { VEX_LEN_TABLE (VEX_LEN_3829_P_2) },
4451 { "(bad)", { XX } },
4452 },
4453
4454 /* PREFIX_VEX_382A */
4455 {
4456 { "(bad)", { XX } },
4457 { "(bad)", { XX } },
4458 { MOD_TABLE (MOD_VEX_382A_PREFIX_2) },
4459 { "(bad)", { XX } },
4460 },
4461
4462 /* PREFIX_VEX_382B */
4463 {
4464 { "(bad)", { XX } },
4465 { "(bad)", { XX } },
4466 { VEX_LEN_TABLE (VEX_LEN_382B_P_2) },
4467 { "(bad)", { XX } },
4468 },
4469
4470 /* PREFIX_VEX_382C */
4471 {
4472 { "(bad)", { XX } },
4473 { "(bad)", { XX } },
4474 { MOD_TABLE (MOD_VEX_382C_PREFIX_2) },
4475 { "(bad)", { XX } },
4476 },
4477
4478 /* PREFIX_VEX_382D */
4479 {
4480 { "(bad)", { XX } },
4481 { "(bad)", { XX } },
4482 { MOD_TABLE (MOD_VEX_382D_PREFIX_2) },
4483 { "(bad)", { XX } },
4484 },
4485
4486 /* PREFIX_VEX_382E */
4487 {
4488 { "(bad)", { XX } },
4489 { "(bad)", { XX } },
4490 { MOD_TABLE (MOD_VEX_382E_PREFIX_2) },
4491 { "(bad)", { XX } },
4492 },
4493
4494 /* PREFIX_VEX_382F */
4495 {
4496 { "(bad)", { XX } },
4497 { "(bad)", { XX } },
4498 { MOD_TABLE (MOD_VEX_382F_PREFIX_2) },
4499 { "(bad)", { XX } },
4500 },
4501
4502 /* PREFIX_VEX_3830 */
4503 {
4504 { "(bad)", { XX } },
4505 { "(bad)", { XX } },
4506 { VEX_LEN_TABLE (VEX_LEN_3830_P_2) },
4507 { "(bad)", { XX } },
4508 },
4509
4510 /* PREFIX_VEX_3831 */
4511 {
4512 { "(bad)", { XX } },
4513 { "(bad)", { XX } },
4514 { VEX_LEN_TABLE (VEX_LEN_3831_P_2) },
4515 { "(bad)", { XX } },
4516 },
4517
4518 /* PREFIX_VEX_3832 */
4519 {
4520 { "(bad)", { XX } },
4521 { "(bad)", { XX } },
4522 { VEX_LEN_TABLE (VEX_LEN_3832_P_2) },
4523 { "(bad)", { XX } },
4524 },
4525
4526 /* PREFIX_VEX_3833 */
4527 {
4528 { "(bad)", { XX } },
4529 { "(bad)", { XX } },
4530 { VEX_LEN_TABLE (VEX_LEN_3833_P_2) },
4531 { "(bad)", { XX } },
4532 },
4533
4534 /* PREFIX_VEX_3834 */
4535 {
4536 { "(bad)", { XX } },
4537 { "(bad)", { XX } },
4538 { VEX_LEN_TABLE (VEX_LEN_3834_P_2) },
4539 { "(bad)", { XX } },
4540 },
4541
4542 /* PREFIX_VEX_3835 */
4543 {
4544 { "(bad)", { XX } },
4545 { "(bad)", { XX } },
4546 { VEX_LEN_TABLE (VEX_LEN_3835_P_2) },
4547 { "(bad)", { XX } },
4548 },
4549
4550 /* PREFIX_VEX_3837 */
4551 {
4552 { "(bad)", { XX } },
4553 { "(bad)", { XX } },
4554 { VEX_LEN_TABLE (VEX_LEN_3837_P_2) },
4555 { "(bad)", { XX } },
4556 },
4557
4558 /* PREFIX_VEX_3838 */
4559 {
4560 { "(bad)", { XX } },
4561 { "(bad)", { XX } },
4562 { VEX_LEN_TABLE (VEX_LEN_3838_P_2) },
4563 { "(bad)", { XX } },
4564 },
4565
4566 /* PREFIX_VEX_3839 */
4567 {
4568 { "(bad)", { XX } },
4569 { "(bad)", { XX } },
4570 { VEX_LEN_TABLE (VEX_LEN_3839_P_2) },
4571 { "(bad)", { XX } },
4572 },
4573
4574 /* PREFIX_VEX_383A */
4575 {
4576 { "(bad)", { XX } },
4577 { "(bad)", { XX } },
4578 { VEX_LEN_TABLE (VEX_LEN_383A_P_2) },
4579 { "(bad)", { XX } },
4580 },
4581
4582 /* PREFIX_VEX_383B */
4583 {
4584 { "(bad)", { XX } },
4585 { "(bad)", { XX } },
4586 { VEX_LEN_TABLE (VEX_LEN_383B_P_2) },
4587 { "(bad)", { XX } },
4588 },
4589
4590 /* PREFIX_VEX_383C */
4591 {
4592 { "(bad)", { XX } },
4593 { "(bad)", { XX } },
4594 { VEX_LEN_TABLE (VEX_LEN_383C_P_2) },
4595 { "(bad)", { XX } },
4596 },
4597
4598 /* PREFIX_VEX_383D */
4599 {
4600 { "(bad)", { XX } },
4601 { "(bad)", { XX } },
4602 { VEX_LEN_TABLE (VEX_LEN_383D_P_2) },
4603 { "(bad)", { XX } },
4604 },
4605
4606 /* PREFIX_VEX_383E */
4607 {
4608 { "(bad)", { XX } },
4609 { "(bad)", { XX } },
4610 { VEX_LEN_TABLE (VEX_LEN_383E_P_2) },
4611 { "(bad)", { XX } },
4612 },
4613
4614 /* PREFIX_VEX_383F */
4615 {
4616 { "(bad)", { XX } },
4617 { "(bad)", { XX } },
4618 { VEX_LEN_TABLE (VEX_LEN_383F_P_2) },
4619 { "(bad)", { XX } },
4620 },
4621
4622 /* PREFIX_VEX_3840 */
4623 {
4624 { "(bad)", { XX } },
4625 { "(bad)", { XX } },
4626 { VEX_LEN_TABLE (VEX_LEN_3840_P_2) },
4627 { "(bad)", { XX } },
4628 },
4629
4630 /* PREFIX_VEX_3841 */
4631 {
4632 { "(bad)", { XX } },
4633 { "(bad)", { XX } },
4634 { VEX_LEN_TABLE (VEX_LEN_3841_P_2) },
4635 { "(bad)", { XX } },
4636 },
4637
4638 /* PREFIX_VEX_3896 */
4639 {
4640 { "(bad)", { XX } },
4641 { "(bad)", { XX } },
4642 { "vfmaddsub132p%XW", { XM, Vex, EXx } },
4643 { "(bad)", { XX } },
4644 },
4645
4646 /* PREFIX_VEX_3897 */
4647 {
4648 { "(bad)", { XX } },
4649 { "(bad)", { XX } },
4650 { "vfmsubadd132p%XW", { XM, Vex, EXx } },
4651 { "(bad)", { XX } },
4652 },
4653
4654 /* PREFIX_VEX_3898 */
4655 {
4656 { "(bad)", { XX } },
4657 { "(bad)", { XX } },
4658 { "vfmadd132p%XW", { XM, Vex, EXx } },
4659 { "(bad)", { XX } },
4660 },
4661
4662 /* PREFIX_VEX_3899 */
4663 {
4664 { "(bad)", { XX } },
4665 { "(bad)", { XX } },
4666 { "vfmadd132s%XW", { XM, Vex, EXVexWdq } },
4667 { "(bad)", { XX } },
4668 },
4669
4670 /* PREFIX_VEX_389A */
4671 {
4672 { "(bad)", { XX } },
4673 { "(bad)", { XX } },
4674 { "vfmsub132p%XW", { XM, Vex, EXx } },
4675 { "(bad)", { XX } },
4676 },
4677
4678 /* PREFIX_VEX_389B */
4679 {
4680 { "(bad)", { XX } },
4681 { "(bad)", { XX } },
4682 { "vfmsub132s%XW", { XM, Vex, EXVexWdq } },
4683 { "(bad)", { XX } },
4684 },
4685
4686 /* PREFIX_VEX_389C */
4687 {
4688 { "(bad)", { XX } },
4689 { "(bad)", { XX } },
4690 { "vfnmadd132p%XW", { XM, Vex, EXx } },
4691 { "(bad)", { XX } },
4692 },
4693
4694 /* PREFIX_VEX_389D */
4695 {
4696 { "(bad)", { XX } },
4697 { "(bad)", { XX } },
4698 { "vfnmadd132s%XW", { XM, Vex, EXVexWdq } },
4699 { "(bad)", { XX } },
4700 },
4701
4702 /* PREFIX_VEX_389E */
4703 {
4704 { "(bad)", { XX } },
4705 { "(bad)", { XX } },
4706 { "vfnmsub132p%XW", { XM, Vex, EXx } },
4707 { "(bad)", { XX } },
4708 },
4709
4710 /* PREFIX_VEX_389F */
4711 {
4712 { "(bad)", { XX } },
4713 { "(bad)", { XX } },
4714 { "vfnmsub132s%XW", { XM, Vex, EXVexWdq } },
4715 { "(bad)", { XX } },
4716 },
4717
4718 /* PREFIX_VEX_38A6 */
4719 {
4720 { "(bad)", { XX } },
4721 { "(bad)", { XX } },
4722 { "vfmaddsub213p%XW", { XM, Vex, EXx } },
4723 { "(bad)", { XX } },
4724 },
4725
4726 /* PREFIX_VEX_38A7 */
4727 {
4728 { "(bad)", { XX } },
4729 { "(bad)", { XX } },
4730 { "vfmsubadd213p%XW", { XM, Vex, EXx } },
4731 { "(bad)", { XX } },
4732 },
4733
4734 /* PREFIX_VEX_38A8 */
4735 {
4736 { "(bad)", { XX } },
4737 { "(bad)", { XX } },
4738 { "vfmadd213p%XW", { XM, Vex, EXx } },
4739 { "(bad)", { XX } },
4740 },
4741
4742 /* PREFIX_VEX_38A9 */
4743 {
4744 { "(bad)", { XX } },
4745 { "(bad)", { XX } },
4746 { "vfmadd213s%XW", { XM, Vex, EXVexWdq } },
4747 { "(bad)", { XX } },
4748 },
4749
4750 /* PREFIX_VEX_38AA */
4751 {
4752 { "(bad)", { XX } },
4753 { "(bad)", { XX } },
4754 { "vfmsub213p%XW", { XM, Vex, EXx } },
4755 { "(bad)", { XX } },
4756 },
4757
4758 /* PREFIX_VEX_38AB */
4759 {
4760 { "(bad)", { XX } },
4761 { "(bad)", { XX } },
4762 { "vfmsub213s%XW", { XM, Vex, EXVexWdq } },
4763 { "(bad)", { XX } },
4764 },
4765
4766 /* PREFIX_VEX_38AC */
4767 {
4768 { "(bad)", { XX } },
4769 { "(bad)", { XX } },
4770 { "vfnmadd213p%XW", { XM, Vex, EXx } },
4771 { "(bad)", { XX } },
4772 },
4773
4774 /* PREFIX_VEX_38AD */
4775 {
4776 { "(bad)", { XX } },
4777 { "(bad)", { XX } },
4778 { "vfnmadd213s%XW", { XM, Vex, EXVexWdq } },
4779 { "(bad)", { XX } },
4780 },
4781
4782 /* PREFIX_VEX_38AE */
4783 {
4784 { "(bad)", { XX } },
4785 { "(bad)", { XX } },
4786 { "vfnmsub213p%XW", { XM, Vex, EXx } },
4787 { "(bad)", { XX } },
4788 },
4789
4790 /* PREFIX_VEX_38AF */
4791 {
4792 { "(bad)", { XX } },
4793 { "(bad)", { XX } },
4794 { "vfnmsub213s%XW", { XM, Vex, EXVexWdq } },
4795 { "(bad)", { XX } },
4796 },
4797
4798 /* PREFIX_VEX_38B6 */
4799 {
4800 { "(bad)", { XX } },
4801 { "(bad)", { XX } },
4802 { "vfmaddsub231p%XW", { XM, Vex, EXx } },
4803 { "(bad)", { XX } },
4804 },
4805
4806 /* PREFIX_VEX_38B7 */
4807 {
4808 { "(bad)", { XX } },
4809 { "(bad)", { XX } },
4810 { "vfmsubadd231p%XW", { XM, Vex, EXx } },
4811 { "(bad)", { XX } },
4812 },
4813
4814 /* PREFIX_VEX_38B8 */
4815 {
4816 { "(bad)", { XX } },
4817 { "(bad)", { XX } },
4818 { "vfmadd231p%XW", { XM, Vex, EXx } },
4819 { "(bad)", { XX } },
4820 },
4821
4822 /* PREFIX_VEX_38B9 */
4823 {
4824 { "(bad)", { XX } },
4825 { "(bad)", { XX } },
4826 { "vfmadd231s%XW", { XM, Vex, EXVexWdq } },
4827 { "(bad)", { XX } },
4828 },
4829
4830 /* PREFIX_VEX_38BA */
4831 {
4832 { "(bad)", { XX } },
4833 { "(bad)", { XX } },
4834 { "vfmsub231p%XW", { XM, Vex, EXx } },
4835 { "(bad)", { XX } },
4836 },
4837
4838 /* PREFIX_VEX_38BB */
4839 {
4840 { "(bad)", { XX } },
4841 { "(bad)", { XX } },
4842 { "vfmsub231s%XW", { XM, Vex, EXVexWdq } },
4843 { "(bad)", { XX } },
4844 },
4845
4846 /* PREFIX_VEX_38BC */
4847 {
4848 { "(bad)", { XX } },
4849 { "(bad)", { XX } },
4850 { "vfnmadd231p%XW", { XM, Vex, EXx } },
4851 { "(bad)", { XX } },
4852 },
4853
4854 /* PREFIX_VEX_38BD */
4855 {
4856 { "(bad)", { XX } },
4857 { "(bad)", { XX } },
4858 { "vfnmadd231s%XW", { XM, Vex, EXVexWdq } },
4859 { "(bad)", { XX } },
4860 },
4861
4862 /* PREFIX_VEX_38BE */
4863 {
4864 { "(bad)", { XX } },
4865 { "(bad)", { XX } },
4866 { "vfnmsub231p%XW", { XM, Vex, EXx } },
4867 { "(bad)", { XX } },
4868 },
4869
4870 /* PREFIX_VEX_38BF */
4871 {
4872 { "(bad)", { XX } },
4873 { "(bad)", { XX } },
4874 { "vfnmsub231s%XW", { XM, Vex, EXVexWdq } },
4875 { "(bad)", { XX } },
4876 },
4877
4878 /* PREFIX_VEX_38DB */
4879 {
4880 { "(bad)", { XX } },
4881 { "(bad)", { XX } },
4882 { VEX_LEN_TABLE (VEX_LEN_38DB_P_2) },
4883 { "(bad)", { XX } },
4884 },
4885
4886 /* PREFIX_VEX_38DC */
4887 {
4888 { "(bad)", { XX } },
4889 { "(bad)", { XX } },
4890 { VEX_LEN_TABLE (VEX_LEN_38DC_P_2) },
4891 { "(bad)", { XX } },
4892 },
4893
4894 /* PREFIX_VEX_38DD */
4895 {
4896 { "(bad)", { XX } },
4897 { "(bad)", { XX } },
4898 { VEX_LEN_TABLE (VEX_LEN_38DD_P_2) },
4899 { "(bad)", { XX } },
4900 },
4901
4902 /* PREFIX_VEX_38DE */
4903 {
4904 { "(bad)", { XX } },
4905 { "(bad)", { XX } },
4906 { VEX_LEN_TABLE (VEX_LEN_38DE_P_2) },
4907 { "(bad)", { XX } },
4908 },
4909
4910 /* PREFIX_VEX_38DF */
4911 {
4912 { "(bad)", { XX } },
4913 { "(bad)", { XX } },
4914 { VEX_LEN_TABLE (VEX_LEN_38DF_P_2) },
4915 { "(bad)", { XX } },
4916 },
4917
4918 /* PREFIX_VEX_3A04 */
4919 {
4920 { "(bad)", { XX } },
4921 { "(bad)", { XX } },
4922 { "vpermilps", { XM, EXx, Ib } },
4923 { "(bad)", { XX } },
4924 },
4925
4926 /* PREFIX_VEX_3A05 */
4927 {
4928 { "(bad)", { XX } },
4929 { "(bad)", { XX } },
4930 { "vpermilpd", { XM, EXx, Ib } },
4931 { "(bad)", { XX } },
4932 },
4933
4934 /* PREFIX_VEX_3A06 */
4935 {
4936 { "(bad)", { XX } },
4937 { "(bad)", { XX } },
4938 { VEX_LEN_TABLE (VEX_LEN_3A06_P_2) },
4939 { "(bad)", { XX } },
4940 },
4941
4942 /* PREFIX_VEX_3A08 */
4943 {
4944 { "(bad)", { XX } },
4945 { "(bad)", { XX } },
4946 { "vroundps", { XM, EXx, Ib } },
4947 { "(bad)", { XX } },
4948 },
4949
4950 /* PREFIX_VEX_3A09 */
4951 {
4952 { "(bad)", { XX } },
4953 { "(bad)", { XX } },
4954 { "vroundpd", { XM, EXx, Ib } },
4955 { "(bad)", { XX } },
4956 },
4957
4958 /* PREFIX_VEX_3A0A */
4959 {
4960 { "(bad)", { XX } },
4961 { "(bad)", { XX } },
4962 { VEX_LEN_TABLE (VEX_LEN_3A0A_P_2) },
4963 { "(bad)", { XX } },
4964 },
4965
4966 /* PREFIX_VEX_3A0B */
4967 {
4968 { "(bad)", { XX } },
4969 { "(bad)", { XX } },
4970 { VEX_LEN_TABLE (VEX_LEN_3A0B_P_2) },
4971 { "(bad)", { XX } },
4972 },
4973
4974 /* PREFIX_VEX_3A0C */
4975 {
4976 { "(bad)", { XX } },
4977 { "(bad)", { XX } },
4978 { "vblendps", { XM, Vex, EXx, Ib } },
4979 { "(bad)", { XX } },
4980 },
4981
4982 /* PREFIX_VEX_3A0D */
4983 {
4984 { "(bad)", { XX } },
4985 { "(bad)", { XX } },
4986 { "vblendpd", { XM, Vex, EXx, Ib } },
4987 { "(bad)", { XX } },
4988 },
4989
4990 /* PREFIX_VEX_3A0E */
4991 {
4992 { "(bad)", { XX } },
4993 { "(bad)", { XX } },
4994 { VEX_LEN_TABLE (VEX_LEN_3A0E_P_2) },
4995 { "(bad)", { XX } },
4996 },
4997
4998 /* PREFIX_VEX_3A0F */
4999 {
5000 { "(bad)", { XX } },
5001 { "(bad)", { XX } },
5002 { VEX_LEN_TABLE (VEX_LEN_3A0F_P_2) },
5003 { "(bad)", { XX } },
5004 },
5005
5006 /* PREFIX_VEX_3A14 */
5007 {
5008 { "(bad)", { XX } },
5009 { "(bad)", { XX } },
5010 { VEX_LEN_TABLE (VEX_LEN_3A14_P_2) },
5011 { "(bad)", { XX } },
5012 },
5013
5014 /* PREFIX_VEX_3A15 */
5015 {
5016 { "(bad)", { XX } },
5017 { "(bad)", { XX } },
5018 { VEX_LEN_TABLE (VEX_LEN_3A15_P_2) },
5019 { "(bad)", { XX } },
5020 },
5021
5022 /* PREFIX_VEX_3A16 */
5023 {
5024 { "(bad)", { XX } },
5025 { "(bad)", { XX } },
5026 { VEX_LEN_TABLE (VEX_LEN_3A16_P_2) },
5027 { "(bad)", { XX } },
5028 },
5029
5030 /* PREFIX_VEX_3A17 */
5031 {
5032 { "(bad)", { XX } },
5033 { "(bad)", { XX } },
5034 { VEX_LEN_TABLE (VEX_LEN_3A17_P_2) },
5035 { "(bad)", { XX } },
5036 },
5037
5038 /* PREFIX_VEX_3A18 */
5039 {
5040 { "(bad)", { XX } },
5041 { "(bad)", { XX } },
5042 { VEX_LEN_TABLE (VEX_LEN_3A18_P_2) },
5043 { "(bad)", { XX } },
5044 },
5045
5046 /* PREFIX_VEX_3A19 */
5047 {
5048 { "(bad)", { XX } },
5049 { "(bad)", { XX } },
5050 { VEX_LEN_TABLE (VEX_LEN_3A19_P_2) },
5051 { "(bad)", { XX } },
5052 },
5053
5054 /* PREFIX_VEX_3A20 */
5055 {
5056 { "(bad)", { XX } },
5057 { "(bad)", { XX } },
5058 { VEX_LEN_TABLE (VEX_LEN_3A20_P_2) },
5059 { "(bad)", { XX } },
5060 },
5061
5062 /* PREFIX_VEX_3A21 */
5063 {
5064 { "(bad)", { XX } },
5065 { "(bad)", { XX } },
5066 { VEX_LEN_TABLE (VEX_LEN_3A21_P_2) },
5067 { "(bad)", { XX } },
5068 },
5069
5070 /* PREFIX_VEX_3A22 */
5071 {
5072 { "(bad)", { XX } },
5073 { "(bad)", { XX } },
5074 { VEX_LEN_TABLE (VEX_LEN_3A22_P_2) },
5075 { "(bad)", { XX } },
5076 },
5077
5078 /* PREFIX_VEX_3A40 */
5079 {
5080 { "(bad)", { XX } },
5081 { "(bad)", { XX } },
5082 { "vdpps", { XM, Vex, EXx, Ib } },
5083 { "(bad)", { XX } },
5084 },
5085
5086 /* PREFIX_VEX_3A41 */
5087 {
5088 { "(bad)", { XX } },
5089 { "(bad)", { XX } },
5090 { VEX_LEN_TABLE (VEX_LEN_3A41_P_2) },
5091 { "(bad)", { XX } },
5092 },
5093
5094 /* PREFIX_VEX_3A42 */
5095 {
5096 { "(bad)", { XX } },
5097 { "(bad)", { XX } },
5098 { VEX_LEN_TABLE (VEX_LEN_3A42_P_2) },
5099 { "(bad)", { XX } },
5100 },
5101
5102 /* PREFIX_VEX_3A44 */
5103 {
5104 { "(bad)", { XX } },
5105 { "(bad)", { XX } },
5106 { VEX_LEN_TABLE (VEX_LEN_3A44_P_2) },
5107 { "(bad)", { XX } },
5108 },
5109
5110 /* PREFIX_VEX_3A4A */
5111 {
5112 { "(bad)", { XX } },
5113 { "(bad)", { XX } },
5114 { "vblendvps", { XM, Vex, EXx, XMVexI4 } },
5115 { "(bad)", { XX } },
5116 },
5117
5118 /* PREFIX_VEX_3A4B */
5119 {
5120 { "(bad)", { XX } },
5121 { "(bad)", { XX } },
5122 { "vblendvpd", { XM, Vex, EXx, XMVexI4 } },
5123 { "(bad)", { XX } },
5124 },
5125
5126 /* PREFIX_VEX_3A4C */
5127 {
5128 { "(bad)", { XX } },
5129 { "(bad)", { XX } },
5130 { VEX_LEN_TABLE (VEX_LEN_3A4C_P_2) },
5131 { "(bad)", { XX } },
5132 },
5133
5134 /* PREFIX_VEX_3A5C */
5135 {
5136 { "(bad)", { XX } },
5137 { "(bad)", { XX } },
5138 { "vfmaddsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5139 { "(bad)", { XX } },
5140 },
5141
5142 /* PREFIX_VEX_3A5D */
5143 {
5144 { "(bad)", { XX } },
5145 { "(bad)", { XX } },
5146 { "vfmaddsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5147 { "(bad)", { XX } },
5148 },
5149
5150 /* PREFIX_VEX_3A5E */
5151 {
5152 { "(bad)", { XX } },
5153 { "(bad)", { XX } },
5154 { "vfmsubaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5155 { "(bad)", { XX } },
5156 },
5157
5158 /* PREFIX_VEX_3A5F */
5159 {
5160 { "(bad)", { XX } },
5161 { "(bad)", { XX } },
5162 { "vfmsubaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5163 { "(bad)", { XX } },
5164 },
5165
5166 /* PREFIX_VEX_3A60 */
5167 {
5168 { "(bad)", { XX } },
5169 { "(bad)", { XX } },
5170 { VEX_LEN_TABLE (VEX_LEN_3A60_P_2) },
5171 { "(bad)", { XX } },
5172 },
5173
5174 /* PREFIX_VEX_3A61 */
5175 {
5176 { "(bad)", { XX } },
5177 { "(bad)", { XX } },
5178 { VEX_LEN_TABLE (VEX_LEN_3A61_P_2) },
5179 { "(bad)", { XX } },
5180 },
5181
5182 /* PREFIX_VEX_3A62 */
5183 {
5184 { "(bad)", { XX } },
5185 { "(bad)", { XX } },
5186 { VEX_LEN_TABLE (VEX_LEN_3A62_P_2) },
5187 { "(bad)", { XX } },
5188 },
5189
5190 /* PREFIX_VEX_3A63 */
5191 {
5192 { "(bad)", { XX } },
5193 { "(bad)", { XX } },
5194 { VEX_LEN_TABLE (VEX_LEN_3A63_P_2) },
5195 { "(bad)", { XX } },
5196 },
5197
5198 /* PREFIX_VEX_3A68 */
5199 {
5200 { "(bad)", { XX } },
5201 { "(bad)", { XX } },
5202 { "vfmaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5203 { "(bad)", { XX } },
5204 },
5205
5206 /* PREFIX_VEX_3A69 */
5207 {
5208 { "(bad)", { XX } },
5209 { "(bad)", { XX } },
5210 { "vfmaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5211 { "(bad)", { XX } },
5212 },
5213
5214 /* PREFIX_VEX_3A6A */
5215 {
5216 { "(bad)", { XX } },
5217 { "(bad)", { XX } },
5218 { VEX_LEN_TABLE (VEX_LEN_3A6A_P_2) },
5219 { "(bad)", { XX } },
5220 },
5221
5222 /* PREFIX_VEX_3A6B */
5223 {
5224 { "(bad)", { XX } },
5225 { "(bad)", { XX } },
5226 { VEX_LEN_TABLE (VEX_LEN_3A6B_P_2) },
5227 { "(bad)", { XX } },
5228 },
5229
5230 /* PREFIX_VEX_3A6C */
5231 {
5232 { "(bad)", { XX } },
5233 { "(bad)", { XX } },
5234 { "vfmsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5235 { "(bad)", { XX } },
5236 },
5237
5238 /* PREFIX_VEX_3A6D */
5239 {
5240 { "(bad)", { XX } },
5241 { "(bad)", { XX } },
5242 { "vfmsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5243 { "(bad)", { XX } },
5244 },
5245
5246 /* PREFIX_VEX_3A6E */
5247 {
5248 { "(bad)", { XX } },
5249 { "(bad)", { XX } },
5250 { VEX_LEN_TABLE (VEX_LEN_3A6E_P_2) },
5251 { "(bad)", { XX } },
5252 },
5253
5254 /* PREFIX_VEX_3A6F */
5255 {
5256 { "(bad)", { XX } },
5257 { "(bad)", { XX } },
5258 { VEX_LEN_TABLE (VEX_LEN_3A6F_P_2) },
5259 { "(bad)", { XX } },
5260 },
5261
5262 /* PREFIX_VEX_3A78 */
5263 {
5264 { "(bad)", { XX } },
5265 { "(bad)", { XX } },
5266 { "vfnmaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5267 { "(bad)", { XX } },
5268 },
5269
5270 /* PREFIX_VEX_3A79 */
5271 {
5272 { "(bad)", { XX } },
5273 { "(bad)", { XX } },
5274 { "vfnmaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5275 { "(bad)", { XX } },
5276 },
5277
5278 /* PREFIX_VEX_3A7A */
5279 {
5280 { "(bad)", { XX } },
5281 { "(bad)", { XX } },
5282 { VEX_LEN_TABLE (VEX_LEN_3A7A_P_2) },
5283 { "(bad)", { XX } },
5284 },
5285
5286 /* PREFIX_VEX_3A7B */
5287 {
5288 { "(bad)", { XX } },
5289 { "(bad)", { XX } },
5290 { VEX_LEN_TABLE (VEX_LEN_3A7B_P_2) },
5291 { "(bad)", { XX } },
5292 },
5293
5294 /* PREFIX_VEX_3A7C */
5295 {
5296 { "(bad)", { XX } },
5297 { "(bad)", { XX } },
5298 { "vfnmsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5299 { "(bad)", { XX } },
5300 },
5301
5302 /* PREFIX_VEX_3A7D */
5303 {
5304 { "(bad)", { XX } },
5305 { "(bad)", { XX } },
5306 { "vfnmsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5307 { "(bad)", { XX } },
5308 },
5309
5310 /* PREFIX_VEX_3A7E */
5311 {
5312 { "(bad)", { XX } },
5313 { "(bad)", { XX } },
5314 { VEX_LEN_TABLE (VEX_LEN_3A7E_P_2) },
5315 { "(bad)", { XX } },
5316 },
5317
5318 /* PREFIX_VEX_3A7F */
5319 {
5320 { "(bad)", { XX } },
5321 { "(bad)", { XX } },
5322 { VEX_LEN_TABLE (VEX_LEN_3A7F_P_2) },
5323 { "(bad)", { XX } },
5324 },
5325
5326 /* PREFIX_VEX_3ADF */
5327 {
5328 { "(bad)", { XX } },
5329 { "(bad)", { XX } },
5330 { VEX_LEN_TABLE (VEX_LEN_3ADF_P_2) },
5331 { "(bad)", { XX } },
5332 },
5333 };
5334
5335 static const struct dis386 x86_64_table[][2] = {
5336 /* X86_64_06 */
5337 {
5338 { "push{T|}", { es } },
5339 { "(bad)", { XX } },
5340 },
5341
5342 /* X86_64_07 */
5343 {
5344 { "pop{T|}", { es } },
5345 { "(bad)", { XX } },
5346 },
5347
5348 /* X86_64_0D */
5349 {
5350 { "push{T|}", { cs } },
5351 { "(bad)", { XX } },
5352 },
5353
5354 /* X86_64_16 */
5355 {
5356 { "push{T|}", { ss } },
5357 { "(bad)", { XX } },
5358 },
5359
5360 /* X86_64_17 */
5361 {
5362 { "pop{T|}", { ss } },
5363 { "(bad)", { XX } },
5364 },
5365
5366 /* X86_64_1E */
5367 {
5368 { "push{T|}", { ds } },
5369 { "(bad)", { XX } },
5370 },
5371
5372 /* X86_64_1F */
5373 {
5374 { "pop{T|}", { ds } },
5375 { "(bad)", { XX } },
5376 },
5377
5378 /* X86_64_27 */
5379 {
5380 { "daa", { XX } },
5381 { "(bad)", { XX } },
5382 },
5383
5384 /* X86_64_2F */
5385 {
5386 { "das", { XX } },
5387 { "(bad)", { XX } },
5388 },
5389
5390 /* X86_64_37 */
5391 {
5392 { "aaa", { XX } },
5393 { "(bad)", { XX } },
5394 },
5395
5396 /* X86_64_3F */
5397 {
5398 { "aas", { XX } },
5399 { "(bad)", { XX } },
5400 },
5401
5402 /* X86_64_60 */
5403 {
5404 { "pusha{P|}", { XX } },
5405 { "(bad)", { XX } },
5406 },
5407
5408 /* X86_64_61 */
5409 {
5410 { "popa{P|}", { XX } },
5411 { "(bad)", { XX } },
5412 },
5413
5414 /* X86_64_62 */
5415 {
5416 { MOD_TABLE (MOD_62_32BIT) },
5417 { "(bad)", { XX } },
5418 },
5419
5420 /* X86_64_63 */
5421 {
5422 { "arpl", { Ew, Gw } },
5423 { "movs{lq|xd}", { Gv, Ed } },
5424 },
5425
5426 /* X86_64_6D */
5427 {
5428 { "ins{R|}", { Yzr, indirDX } },
5429 { "ins{G|}", { Yzr, indirDX } },
5430 },
5431
5432 /* X86_64_6F */
5433 {
5434 { "outs{R|}", { indirDXr, Xz } },
5435 { "outs{G|}", { indirDXr, Xz } },
5436 },
5437
5438 /* X86_64_9A */
5439 {
5440 { "Jcall{T|}", { Ap } },
5441 { "(bad)", { XX } },
5442 },
5443
5444 /* X86_64_C4 */
5445 {
5446 { MOD_TABLE (MOD_C4_32BIT) },
5447 { VEX_C4_TABLE (VEX_0F) },
5448 },
5449
5450 /* X86_64_C5 */
5451 {
5452 { MOD_TABLE (MOD_C5_32BIT) },
5453 { VEX_C5_TABLE (VEX_0F) },
5454 },
5455
5456 /* X86_64_CE */
5457 {
5458 { "into", { XX } },
5459 { "(bad)", { XX } },
5460 },
5461
5462 /* X86_64_D4 */
5463 {
5464 { "aam", { sIb } },
5465 { "(bad)", { XX } },
5466 },
5467
5468 /* X86_64_D5 */
5469 {
5470 { "aad", { sIb } },
5471 { "(bad)", { XX } },
5472 },
5473
5474 /* X86_64_EA */
5475 {
5476 { "Jjmp{T|}", { Ap } },
5477 { "(bad)", { XX } },
5478 },
5479
5480 /* X86_64_0F01_REG_0 */
5481 {
5482 { "sgdt{Q|IQ}", { M } },
5483 { "sgdt", { M } },
5484 },
5485
5486 /* X86_64_0F01_REG_1 */
5487 {
5488 { "sidt{Q|IQ}", { M } },
5489 { "sidt", { M } },
5490 },
5491
5492 /* X86_64_0F01_REG_2 */
5493 {
5494 { "lgdt{Q|Q}", { M } },
5495 { "lgdt", { M } },
5496 },
5497
5498 /* X86_64_0F01_REG_3 */
5499 {
5500 { "lidt{Q|Q}", { M } },
5501 { "lidt", { M } },
5502 },
5503 };
5504
5505 static const struct dis386 three_byte_table[][256] = {
5506
5507 /* THREE_BYTE_0F38 */
5508 {
5509 /* 00 */
5510 { "pshufb", { MX, EM } },
5511 { "phaddw", { MX, EM } },
5512 { "phaddd", { MX, EM } },
5513 { "phaddsw", { MX, EM } },
5514 { "pmaddubsw", { MX, EM } },
5515 { "phsubw", { MX, EM } },
5516 { "phsubd", { MX, EM } },
5517 { "phsubsw", { MX, EM } },
5518 /* 08 */
5519 { "psignb", { MX, EM } },
5520 { "psignw", { MX, EM } },
5521 { "psignd", { MX, EM } },
5522 { "pmulhrsw", { MX, EM } },
5523 { "(bad)", { XX } },
5524 { "(bad)", { XX } },
5525 { "(bad)", { XX } },
5526 { "(bad)", { XX } },
5527 /* 10 */
5528 { PREFIX_TABLE (PREFIX_0F3810) },
5529 { "(bad)", { XX } },
5530 { "(bad)", { XX } },
5531 { "(bad)", { XX } },
5532 { PREFIX_TABLE (PREFIX_0F3814) },
5533 { PREFIX_TABLE (PREFIX_0F3815) },
5534 { "(bad)", { XX } },
5535 { PREFIX_TABLE (PREFIX_0F3817) },
5536 /* 18 */
5537 { "(bad)", { XX } },
5538 { "(bad)", { XX } },
5539 { "(bad)", { XX } },
5540 { "(bad)", { XX } },
5541 { "pabsb", { MX, EM } },
5542 { "pabsw", { MX, EM } },
5543 { "pabsd", { MX, EM } },
5544 { "(bad)", { XX } },
5545 /* 20 */
5546 { PREFIX_TABLE (PREFIX_0F3820) },
5547 { PREFIX_TABLE (PREFIX_0F3821) },
5548 { PREFIX_TABLE (PREFIX_0F3822) },
5549 { PREFIX_TABLE (PREFIX_0F3823) },
5550 { PREFIX_TABLE (PREFIX_0F3824) },
5551 { PREFIX_TABLE (PREFIX_0F3825) },
5552 { "(bad)", { XX } },
5553 { "(bad)", { XX } },
5554 /* 28 */
5555 { PREFIX_TABLE (PREFIX_0F3828) },
5556 { PREFIX_TABLE (PREFIX_0F3829) },
5557 { PREFIX_TABLE (PREFIX_0F382A) },
5558 { PREFIX_TABLE (PREFIX_0F382B) },
5559 { "(bad)", { XX } },
5560 { "(bad)", { XX } },
5561 { "(bad)", { XX } },
5562 { "(bad)", { XX } },
5563 /* 30 */
5564 { PREFIX_TABLE (PREFIX_0F3830) },
5565 { PREFIX_TABLE (PREFIX_0F3831) },
5566 { PREFIX_TABLE (PREFIX_0F3832) },
5567 { PREFIX_TABLE (PREFIX_0F3833) },
5568 { PREFIX_TABLE (PREFIX_0F3834) },
5569 { PREFIX_TABLE (PREFIX_0F3835) },
5570 { "(bad)", { XX } },
5571 { PREFIX_TABLE (PREFIX_0F3837) },
5572 /* 38 */
5573 { PREFIX_TABLE (PREFIX_0F3838) },
5574 { PREFIX_TABLE (PREFIX_0F3839) },
5575 { PREFIX_TABLE (PREFIX_0F383A) },
5576 { PREFIX_TABLE (PREFIX_0F383B) },
5577 { PREFIX_TABLE (PREFIX_0F383C) },
5578 { PREFIX_TABLE (PREFIX_0F383D) },
5579 { PREFIX_TABLE (PREFIX_0F383E) },
5580 { PREFIX_TABLE (PREFIX_0F383F) },
5581 /* 40 */
5582 { PREFIX_TABLE (PREFIX_0F3840) },
5583 { PREFIX_TABLE (PREFIX_0F3841) },
5584 { "(bad)", { XX } },
5585 { "(bad)", { XX } },
5586 { "(bad)", { XX } },
5587 { "(bad)", { XX } },
5588 { "(bad)", { XX } },
5589 { "(bad)", { XX } },
5590 /* 48 */
5591 { "(bad)", { XX } },
5592 { "(bad)", { XX } },
5593 { "(bad)", { XX } },
5594 { "(bad)", { XX } },
5595 { "(bad)", { XX } },
5596 { "(bad)", { XX } },
5597 { "(bad)", { XX } },
5598 { "(bad)", { XX } },
5599 /* 50 */
5600 { "(bad)", { XX } },
5601 { "(bad)", { XX } },
5602 { "(bad)", { XX } },
5603 { "(bad)", { XX } },
5604 { "(bad)", { XX } },
5605 { "(bad)", { XX } },
5606 { "(bad)", { XX } },
5607 { "(bad)", { XX } },
5608 /* 58 */
5609 { "(bad)", { XX } },
5610 { "(bad)", { XX } },
5611 { "(bad)", { XX } },
5612 { "(bad)", { XX } },
5613 { "(bad)", { XX } },
5614 { "(bad)", { XX } },
5615 { "(bad)", { XX } },
5616 { "(bad)", { XX } },
5617 /* 60 */
5618 { "(bad)", { XX } },
5619 { "(bad)", { XX } },
5620 { "(bad)", { XX } },
5621 { "(bad)", { XX } },
5622 { "(bad)", { XX } },
5623 { "(bad)", { XX } },
5624 { "(bad)", { XX } },
5625 { "(bad)", { XX } },
5626 /* 68 */
5627 { "(bad)", { XX } },
5628 { "(bad)", { XX } },
5629 { "(bad)", { XX } },
5630 { "(bad)", { XX } },
5631 { "(bad)", { XX } },
5632 { "(bad)", { XX } },
5633 { "(bad)", { XX } },
5634 { "(bad)", { XX } },
5635 /* 70 */
5636 { "(bad)", { XX } },
5637 { "(bad)", { XX } },
5638 { "(bad)", { XX } },
5639 { "(bad)", { XX } },
5640 { "(bad)", { XX } },
5641 { "(bad)", { XX } },
5642 { "(bad)", { XX } },
5643 { "(bad)", { XX } },
5644 /* 78 */
5645 { "(bad)", { XX } },
5646 { "(bad)", { XX } },
5647 { "(bad)", { XX } },
5648 { "(bad)", { XX } },
5649 { "(bad)", { XX } },
5650 { "(bad)", { XX } },
5651 { "(bad)", { XX } },
5652 { "(bad)", { XX } },
5653 /* 80 */
5654 { PREFIX_TABLE (PREFIX_0F3880) },
5655 { PREFIX_TABLE (PREFIX_0F3881) },
5656 { "(bad)", { XX } },
5657 { "(bad)", { XX } },
5658 { "(bad)", { XX } },
5659 { "(bad)", { XX } },
5660 { "(bad)", { XX } },
5661 { "(bad)", { XX } },
5662 /* 88 */
5663 { "(bad)", { XX } },
5664 { "(bad)", { XX } },
5665 { "(bad)", { XX } },
5666 { "(bad)", { XX } },
5667 { "(bad)", { XX } },
5668 { "(bad)", { XX } },
5669 { "(bad)", { XX } },
5670 { "(bad)", { XX } },
5671 /* 90 */
5672 { "(bad)", { XX } },
5673 { "(bad)", { XX } },
5674 { "(bad)", { XX } },
5675 { "(bad)", { XX } },
5676 { "(bad)", { XX } },
5677 { "(bad)", { XX } },
5678 { "(bad)", { XX } },
5679 { "(bad)", { XX } },
5680 /* 98 */
5681 { "(bad)", { XX } },
5682 { "(bad)", { XX } },
5683 { "(bad)", { XX } },
5684 { "(bad)", { XX } },
5685 { "(bad)", { XX } },
5686 { "(bad)", { XX } },
5687 { "(bad)", { XX } },
5688 { "(bad)", { XX } },
5689 /* a0 */
5690 { "(bad)", { XX } },
5691 { "(bad)", { XX } },
5692 { "(bad)", { XX } },
5693 { "(bad)", { XX } },
5694 { "(bad)", { XX } },
5695 { "(bad)", { XX } },
5696 { "(bad)", { XX } },
5697 { "(bad)", { XX } },
5698 /* a8 */
5699 { "(bad)", { XX } },
5700 { "(bad)", { XX } },
5701 { "(bad)", { XX } },
5702 { "(bad)", { XX } },
5703 { "(bad)", { XX } },
5704 { "(bad)", { XX } },
5705 { "(bad)", { XX } },
5706 { "(bad)", { XX } },
5707 /* b0 */
5708 { "(bad)", { XX } },
5709 { "(bad)", { XX } },
5710 { "(bad)", { XX } },
5711 { "(bad)", { XX } },
5712 { "(bad)", { XX } },
5713 { "(bad)", { XX } },
5714 { "(bad)", { XX } },
5715 { "(bad)", { XX } },
5716 /* b8 */
5717 { "(bad)", { XX } },
5718 { "(bad)", { XX } },
5719 { "(bad)", { XX } },
5720 { "(bad)", { XX } },
5721 { "(bad)", { XX } },
5722 { "(bad)", { XX } },
5723 { "(bad)", { XX } },
5724 { "(bad)", { XX } },
5725 /* c0 */
5726 { "(bad)", { XX } },
5727 { "(bad)", { XX } },
5728 { "(bad)", { XX } },
5729 { "(bad)", { XX } },
5730 { "(bad)", { XX } },
5731 { "(bad)", { XX } },
5732 { "(bad)", { XX } },
5733 { "(bad)", { XX } },
5734 /* c8 */
5735 { "(bad)", { XX } },
5736 { "(bad)", { XX } },
5737 { "(bad)", { XX } },
5738 { "(bad)", { XX } },
5739 { "(bad)", { XX } },
5740 { "(bad)", { XX } },
5741 { "(bad)", { XX } },
5742 { "(bad)", { XX } },
5743 /* d0 */
5744 { "(bad)", { XX } },
5745 { "(bad)", { XX } },
5746 { "(bad)", { XX } },
5747 { "(bad)", { XX } },
5748 { "(bad)", { XX } },
5749 { "(bad)", { XX } },
5750 { "(bad)", { XX } },
5751 { "(bad)", { XX } },
5752 /* d8 */
5753 { "(bad)", { XX } },
5754 { "(bad)", { XX } },
5755 { "(bad)", { XX } },
5756 { PREFIX_TABLE (PREFIX_0F38DB) },
5757 { PREFIX_TABLE (PREFIX_0F38DC) },
5758 { PREFIX_TABLE (PREFIX_0F38DD) },
5759 { PREFIX_TABLE (PREFIX_0F38DE) },
5760 { PREFIX_TABLE (PREFIX_0F38DF) },
5761 /* e0 */
5762 { "(bad)", { XX } },
5763 { "(bad)", { XX } },
5764 { "(bad)", { XX } },
5765 { "(bad)", { XX } },
5766 { "(bad)", { XX } },
5767 { "(bad)", { XX } },
5768 { "(bad)", { XX } },
5769 { "(bad)", { XX } },
5770 /* e8 */
5771 { "(bad)", { XX } },
5772 { "(bad)", { XX } },
5773 { "(bad)", { XX } },
5774 { "(bad)", { XX } },
5775 { "(bad)", { XX } },
5776 { "(bad)", { XX } },
5777 { "(bad)", { XX } },
5778 { "(bad)", { XX } },
5779 /* f0 */
5780 { PREFIX_TABLE (PREFIX_0F38F0) },
5781 { PREFIX_TABLE (PREFIX_0F38F1) },
5782 { "(bad)", { XX } },
5783 { "(bad)", { XX } },
5784 { "(bad)", { XX } },
5785 { "(bad)", { XX } },
5786 { "(bad)", { XX } },
5787 { "(bad)", { XX } },
5788 /* f8 */
5789 { "(bad)", { XX } },
5790 { "(bad)", { XX } },
5791 { "(bad)", { XX } },
5792 { "(bad)", { XX } },
5793 { "(bad)", { XX } },
5794 { "(bad)", { XX } },
5795 { "(bad)", { XX } },
5796 { "(bad)", { XX } },
5797 },
5798 /* THREE_BYTE_0F3A */
5799 {
5800 /* 00 */
5801 { "(bad)", { XX } },
5802 { "(bad)", { XX } },
5803 { "(bad)", { XX } },
5804 { "(bad)", { XX } },
5805 { "(bad)", { XX } },
5806 { "(bad)", { XX } },
5807 { "(bad)", { XX } },
5808 { "(bad)", { XX } },
5809 /* 08 */
5810 { PREFIX_TABLE (PREFIX_0F3A08) },
5811 { PREFIX_TABLE (PREFIX_0F3A09) },
5812 { PREFIX_TABLE (PREFIX_0F3A0A) },
5813 { PREFIX_TABLE (PREFIX_0F3A0B) },
5814 { PREFIX_TABLE (PREFIX_0F3A0C) },
5815 { PREFIX_TABLE (PREFIX_0F3A0D) },
5816 { PREFIX_TABLE (PREFIX_0F3A0E) },
5817 { "palignr", { MX, EM, Ib } },
5818 /* 10 */
5819 { "(bad)", { XX } },
5820 { "(bad)", { XX } },
5821 { "(bad)", { XX } },
5822 { "(bad)", { XX } },
5823 { PREFIX_TABLE (PREFIX_0F3A14) },
5824 { PREFIX_TABLE (PREFIX_0F3A15) },
5825 { PREFIX_TABLE (PREFIX_0F3A16) },
5826 { PREFIX_TABLE (PREFIX_0F3A17) },
5827 /* 18 */
5828 { "(bad)", { XX } },
5829 { "(bad)", { XX } },
5830 { "(bad)", { XX } },
5831 { "(bad)", { XX } },
5832 { "(bad)", { XX } },
5833 { "(bad)", { XX } },
5834 { "(bad)", { XX } },
5835 { "(bad)", { XX } },
5836 /* 20 */
5837 { PREFIX_TABLE (PREFIX_0F3A20) },
5838 { PREFIX_TABLE (PREFIX_0F3A21) },
5839 { PREFIX_TABLE (PREFIX_0F3A22) },
5840 { "(bad)", { XX } },
5841 { "(bad)", { XX } },
5842 { "(bad)", { XX } },
5843 { "(bad)", { XX } },
5844 { "(bad)", { XX } },
5845 /* 28 */
5846 { "(bad)", { XX } },
5847 { "(bad)", { XX } },
5848 { "(bad)", { XX } },
5849 { "(bad)", { XX } },
5850 { "(bad)", { XX } },
5851 { "(bad)", { XX } },
5852 { "(bad)", { XX } },
5853 { "(bad)", { XX } },
5854 /* 30 */
5855 { "(bad)", { XX } },
5856 { "(bad)", { XX } },
5857 { "(bad)", { XX } },
5858 { "(bad)", { XX } },
5859 { "(bad)", { XX } },
5860 { "(bad)", { XX } },
5861 { "(bad)", { XX } },
5862 { "(bad)", { XX } },
5863 /* 38 */
5864 { "(bad)", { XX } },
5865 { "(bad)", { XX } },
5866 { "(bad)", { XX } },
5867 { "(bad)", { XX } },
5868 { "(bad)", { XX } },
5869 { "(bad)", { XX } },
5870 { "(bad)", { XX } },
5871 { "(bad)", { XX } },
5872 /* 40 */
5873 { PREFIX_TABLE (PREFIX_0F3A40) },
5874 { PREFIX_TABLE (PREFIX_0F3A41) },
5875 { PREFIX_TABLE (PREFIX_0F3A42) },
5876 { "(bad)", { XX } },
5877 { PREFIX_TABLE (PREFIX_0F3A44) },
5878 { "(bad)", { XX } },
5879 { "(bad)", { XX } },
5880 { "(bad)", { XX } },
5881 /* 48 */
5882 { "(bad)", { XX } },
5883 { "(bad)", { XX } },
5884 { "(bad)", { XX } },
5885 { "(bad)", { XX } },
5886 { "(bad)", { XX } },
5887 { "(bad)", { XX } },
5888 { "(bad)", { XX } },
5889 { "(bad)", { XX } },
5890 /* 50 */
5891 { "(bad)", { XX } },
5892 { "(bad)", { XX } },
5893 { "(bad)", { XX } },
5894 { "(bad)", { XX } },
5895 { "(bad)", { XX } },
5896 { "(bad)", { XX } },
5897 { "(bad)", { XX } },
5898 { "(bad)", { XX } },
5899 /* 58 */
5900 { "(bad)", { XX } },
5901 { "(bad)", { XX } },
5902 { "(bad)", { XX } },
5903 { "(bad)", { XX } },
5904 { "(bad)", { XX } },
5905 { "(bad)", { XX } },
5906 { "(bad)", { XX } },
5907 { "(bad)", { XX } },
5908 /* 60 */
5909 { PREFIX_TABLE (PREFIX_0F3A60) },
5910 { PREFIX_TABLE (PREFIX_0F3A61) },
5911 { PREFIX_TABLE (PREFIX_0F3A62) },
5912 { PREFIX_TABLE (PREFIX_0F3A63) },
5913 { "(bad)", { XX } },
5914 { "(bad)", { XX } },
5915 { "(bad)", { XX } },
5916 { "(bad)", { XX } },
5917 /* 68 */
5918 { "(bad)", { XX } },
5919 { "(bad)", { XX } },
5920 { "(bad)", { XX } },
5921 { "(bad)", { XX } },
5922 { "(bad)", { XX } },
5923 { "(bad)", { XX } },
5924 { "(bad)", { XX } },
5925 { "(bad)", { XX } },
5926 /* 70 */
5927 { "(bad)", { XX } },
5928 { "(bad)", { XX } },
5929 { "(bad)", { XX } },
5930 { "(bad)", { XX } },
5931 { "(bad)", { XX } },
5932 { "(bad)", { XX } },
5933 { "(bad)", { XX } },
5934 { "(bad)", { XX } },
5935 /* 78 */
5936 { "(bad)", { XX } },
5937 { "(bad)", { XX } },
5938 { "(bad)", { XX } },
5939 { "(bad)", { XX } },
5940 { "(bad)", { XX } },
5941 { "(bad)", { XX } },
5942 { "(bad)", { XX } },
5943 { "(bad)", { XX } },
5944 /* 80 */
5945 { "(bad)", { XX } },
5946 { "(bad)", { XX } },
5947 { "(bad)", { XX } },
5948 { "(bad)", { XX } },
5949 { "(bad)", { XX } },
5950 { "(bad)", { XX } },
5951 { "(bad)", { XX } },
5952 { "(bad)", { XX } },
5953 /* 88 */
5954 { "(bad)", { XX } },
5955 { "(bad)", { XX } },
5956 { "(bad)", { XX } },
5957 { "(bad)", { XX } },
5958 { "(bad)", { XX } },
5959 { "(bad)", { XX } },
5960 { "(bad)", { XX } },
5961 { "(bad)", { XX } },
5962 /* 90 */
5963 { "(bad)", { XX } },
5964 { "(bad)", { XX } },
5965 { "(bad)", { XX } },
5966 { "(bad)", { XX } },
5967 { "(bad)", { XX } },
5968 { "(bad)", { XX } },
5969 { "(bad)", { XX } },
5970 { "(bad)", { XX } },
5971 /* 98 */
5972 { "(bad)", { XX } },
5973 { "(bad)", { XX } },
5974 { "(bad)", { XX } },
5975 { "(bad)", { XX } },
5976 { "(bad)", { XX } },
5977 { "(bad)", { XX } },
5978 { "(bad)", { XX } },
5979 { "(bad)", { XX } },
5980 /* a0 */
5981 { "(bad)", { XX } },
5982 { "(bad)", { XX } },
5983 { "(bad)", { XX } },
5984 { "(bad)", { XX } },
5985 { "(bad)", { XX } },
5986 { "(bad)", { XX } },
5987 { "(bad)", { XX } },
5988 { "(bad)", { XX } },
5989 /* a8 */
5990 { "(bad)", { XX } },
5991 { "(bad)", { XX } },
5992 { "(bad)", { XX } },
5993 { "(bad)", { XX } },
5994 { "(bad)", { XX } },
5995 { "(bad)", { XX } },
5996 { "(bad)", { XX } },
5997 { "(bad)", { XX } },
5998 /* b0 */
5999 { "(bad)", { XX } },
6000 { "(bad)", { XX } },
6001 { "(bad)", { XX } },
6002 { "(bad)", { XX } },
6003 { "(bad)", { XX } },
6004 { "(bad)", { XX } },
6005 { "(bad)", { XX } },
6006 { "(bad)", { XX } },
6007 /* b8 */
6008 { "(bad)", { XX } },
6009 { "(bad)", { XX } },
6010 { "(bad)", { XX } },
6011 { "(bad)", { XX } },
6012 { "(bad)", { XX } },
6013 { "(bad)", { XX } },
6014 { "(bad)", { XX } },
6015 { "(bad)", { XX } },
6016 /* c0 */
6017 { "(bad)", { XX } },
6018 { "(bad)", { XX } },
6019 { "(bad)", { XX } },
6020 { "(bad)", { XX } },
6021 { "(bad)", { XX } },
6022 { "(bad)", { XX } },
6023 { "(bad)", { XX } },
6024 { "(bad)", { XX } },
6025 /* c8 */
6026 { "(bad)", { XX } },
6027 { "(bad)", { XX } },
6028 { "(bad)", { XX } },
6029 { "(bad)", { XX } },
6030 { "(bad)", { XX } },
6031 { "(bad)", { XX } },
6032 { "(bad)", { XX } },
6033 { "(bad)", { XX } },
6034 /* d0 */
6035 { "(bad)", { XX } },
6036 { "(bad)", { XX } },
6037 { "(bad)", { XX } },
6038 { "(bad)", { XX } },
6039 { "(bad)", { XX } },
6040 { "(bad)", { XX } },
6041 { "(bad)", { XX } },
6042 { "(bad)", { XX } },
6043 /* d8 */
6044 { "(bad)", { XX } },
6045 { "(bad)", { XX } },
6046 { "(bad)", { XX } },
6047 { "(bad)", { XX } },
6048 { "(bad)", { XX } },
6049 { "(bad)", { XX } },
6050 { "(bad)", { XX } },
6051 { PREFIX_TABLE (PREFIX_0F3ADF) },
6052 /* e0 */
6053 { "(bad)", { XX } },
6054 { "(bad)", { XX } },
6055 { "(bad)", { XX } },
6056 { "(bad)", { XX } },
6057 { "(bad)", { XX } },
6058 { "(bad)", { XX } },
6059 { "(bad)", { XX } },
6060 { "(bad)", { XX } },
6061 /* e8 */
6062 { "(bad)", { XX } },
6063 { "(bad)", { XX } },
6064 { "(bad)", { XX } },
6065 { "(bad)", { XX } },
6066 { "(bad)", { XX } },
6067 { "(bad)", { XX } },
6068 { "(bad)", { XX } },
6069 { "(bad)", { XX } },
6070 /* f0 */
6071 { "(bad)", { XX } },
6072 { "(bad)", { XX } },
6073 { "(bad)", { XX } },
6074 { "(bad)", { XX } },
6075 { "(bad)", { XX } },
6076 { "(bad)", { XX } },
6077 { "(bad)", { XX } },
6078 { "(bad)", { XX } },
6079 /* f8 */
6080 { "(bad)", { XX } },
6081 { "(bad)", { XX } },
6082 { "(bad)", { XX } },
6083 { "(bad)", { XX } },
6084 { "(bad)", { XX } },
6085 { "(bad)", { XX } },
6086 { "(bad)", { XX } },
6087 { "(bad)", { XX } },
6088 },
6089
6090 /* THREE_BYTE_0F7A */
6091 {
6092 /* 00 */
6093 { "(bad)", { XX } },
6094 { "(bad)", { XX } },
6095 { "(bad)", { XX } },
6096 { "(bad)", { XX } },
6097 { "(bad)", { XX } },
6098 { "(bad)", { XX } },
6099 { "(bad)", { XX } },
6100 { "(bad)", { XX } },
6101 /* 08 */
6102 { "(bad)", { XX } },
6103 { "(bad)", { XX } },
6104 { "(bad)", { XX } },
6105 { "(bad)", { XX } },
6106 { "(bad)", { XX } },
6107 { "(bad)", { XX } },
6108 { "(bad)", { XX } },
6109 { "(bad)", { XX } },
6110 /* 10 */
6111 { "(bad)", { XX } },
6112 { "(bad)", { XX } },
6113 { "(bad)", { XX } },
6114 { "(bad)", { XX } },
6115 { "(bad)", { XX } },
6116 { "(bad)", { XX } },
6117 { "(bad)", { XX } },
6118 { "(bad)", { XX } },
6119 /* 18 */
6120 { "(bad)", { XX } },
6121 { "(bad)", { XX } },
6122 { "(bad)", { XX } },
6123 { "(bad)", { XX } },
6124 { "(bad)", { XX } },
6125 { "(bad)", { XX } },
6126 { "(bad)", { XX } },
6127 { "(bad)", { XX } },
6128 /* 20 */
6129 { "ptest", { XX } },
6130 { "(bad)", { XX } },
6131 { "(bad)", { XX } },
6132 { "(bad)", { XX } },
6133 { "(bad)", { XX } },
6134 { "(bad)", { XX } },
6135 { "(bad)", { XX } },
6136 { "(bad)", { XX } },
6137 /* 28 */
6138 { "(bad)", { XX } },
6139 { "(bad)", { XX } },
6140 { "(bad)", { XX } },
6141 { "(bad)", { XX } },
6142 { "(bad)", { XX } },
6143 { "(bad)", { XX } },
6144 { "(bad)", { XX } },
6145 { "(bad)", { XX } },
6146 /* 30 */
6147 { "(bad)", { XX } },
6148 { "(bad)", { XX } },
6149 { "(bad)", { XX } },
6150 { "(bad)", { XX } },
6151 { "(bad)", { XX } },
6152 { "(bad)", { XX } },
6153 { "(bad)", { XX } },
6154 { "(bad)", { XX } },
6155 /* 38 */
6156 { "(bad)", { XX } },
6157 { "(bad)", { XX } },
6158 { "(bad)", { XX } },
6159 { "(bad)", { XX } },
6160 { "(bad)", { XX } },
6161 { "(bad)", { XX } },
6162 { "(bad)", { XX } },
6163 { "(bad)", { XX } },
6164 /* 40 */
6165 { "(bad)", { XX } },
6166 { "phaddbw", { XM, EXq } },
6167 { "phaddbd", { XM, EXq } },
6168 { "phaddbq", { XM, EXq } },
6169 { "(bad)", { XX } },
6170 { "(bad)", { XX } },
6171 { "phaddwd", { XM, EXq } },
6172 { "phaddwq", { XM, EXq } },
6173 /* 48 */
6174 { "(bad)", { XX } },
6175 { "(bad)", { XX } },
6176 { "(bad)", { XX } },
6177 { "phadddq", { XM, EXq } },
6178 { "(bad)", { XX } },
6179 { "(bad)", { XX } },
6180 { "(bad)", { XX } },
6181 { "(bad)", { XX } },
6182 /* 50 */
6183 { "(bad)", { XX } },
6184 { "phaddubw", { XM, EXq } },
6185 { "phaddubd", { XM, EXq } },
6186 { "phaddubq", { XM, EXq } },
6187 { "(bad)", { XX } },
6188 { "(bad)", { XX } },
6189 { "phadduwd", { XM, EXq } },
6190 { "phadduwq", { XM, EXq } },
6191 /* 58 */
6192 { "(bad)", { XX } },
6193 { "(bad)", { XX } },
6194 { "(bad)", { XX } },
6195 { "phaddudq", { XM, EXq } },
6196 { "(bad)", { XX } },
6197 { "(bad)", { XX } },
6198 { "(bad)", { XX } },
6199 { "(bad)", { XX } },
6200 /* 60 */
6201 { "(bad)", { XX } },
6202 { "phsubbw", { XM, EXq } },
6203 { "phsubbd", { XM, EXq } },
6204 { "phsubbq", { XM, EXq } },
6205 { "(bad)", { XX } },
6206 { "(bad)", { XX } },
6207 { "(bad)", { XX } },
6208 { "(bad)", { XX } },
6209 /* 68 */
6210 { "(bad)", { XX } },
6211 { "(bad)", { XX } },
6212 { "(bad)", { XX } },
6213 { "(bad)", { XX } },
6214 { "(bad)", { XX } },
6215 { "(bad)", { XX } },
6216 { "(bad)", { XX } },
6217 { "(bad)", { XX } },
6218 /* 70 */
6219 { "(bad)", { XX } },
6220 { "(bad)", { XX } },
6221 { "(bad)", { XX } },
6222 { "(bad)", { XX } },
6223 { "(bad)", { XX } },
6224 { "(bad)", { XX } },
6225 { "(bad)", { XX } },
6226 { "(bad)", { XX } },
6227 /* 78 */
6228 { "(bad)", { XX } },
6229 { "(bad)", { XX } },
6230 { "(bad)", { XX } },
6231 { "(bad)", { XX } },
6232 { "(bad)", { XX } },
6233 { "(bad)", { XX } },
6234 { "(bad)", { XX } },
6235 { "(bad)", { XX } },
6236 /* 80 */
6237 { "(bad)", { XX } },
6238 { "(bad)", { XX } },
6239 { "(bad)", { XX } },
6240 { "(bad)", { XX } },
6241 { "(bad)", { XX } },
6242 { "(bad)", { XX } },
6243 { "(bad)", { XX } },
6244 { "(bad)", { XX } },
6245 /* 88 */
6246 { "(bad)", { XX } },
6247 { "(bad)", { XX } },
6248 { "(bad)", { XX } },
6249 { "(bad)", { XX } },
6250 { "(bad)", { XX } },
6251 { "(bad)", { XX } },
6252 { "(bad)", { XX } },
6253 { "(bad)", { XX } },
6254 /* 90 */
6255 { "(bad)", { XX } },
6256 { "(bad)", { XX } },
6257 { "(bad)", { XX } },
6258 { "(bad)", { XX } },
6259 { "(bad)", { XX } },
6260 { "(bad)", { XX } },
6261 { "(bad)", { XX } },
6262 { "(bad)", { XX } },
6263 /* 98 */
6264 { "(bad)", { XX } },
6265 { "(bad)", { XX } },
6266 { "(bad)", { XX } },
6267 { "(bad)", { XX } },
6268 { "(bad)", { XX } },
6269 { "(bad)", { XX } },
6270 { "(bad)", { XX } },
6271 { "(bad)", { XX } },
6272 /* a0 */
6273 { "(bad)", { XX } },
6274 { "(bad)", { XX } },
6275 { "(bad)", { XX } },
6276 { "(bad)", { XX } },
6277 { "(bad)", { XX } },
6278 { "(bad)", { XX } },
6279 { "(bad)", { XX } },
6280 { "(bad)", { XX } },
6281 /* a8 */
6282 { "(bad)", { XX } },
6283 { "(bad)", { XX } },
6284 { "(bad)", { XX } },
6285 { "(bad)", { XX } },
6286 { "(bad)", { XX } },
6287 { "(bad)", { XX } },
6288 { "(bad)", { XX } },
6289 { "(bad)", { XX } },
6290 /* b0 */
6291 { "(bad)", { XX } },
6292 { "(bad)", { XX } },
6293 { "(bad)", { XX } },
6294 { "(bad)", { XX } },
6295 { "(bad)", { XX } },
6296 { "(bad)", { XX } },
6297 { "(bad)", { XX } },
6298 { "(bad)", { XX } },
6299 /* b8 */
6300 { "(bad)", { XX } },
6301 { "(bad)", { XX } },
6302 { "(bad)", { XX } },
6303 { "(bad)", { XX } },
6304 { "(bad)", { XX } },
6305 { "(bad)", { XX } },
6306 { "(bad)", { XX } },
6307 { "(bad)", { XX } },
6308 /* c0 */
6309 { "(bad)", { XX } },
6310 { "(bad)", { XX } },
6311 { "(bad)", { XX } },
6312 { "(bad)", { XX } },
6313 { "(bad)", { XX } },
6314 { "(bad)", { XX } },
6315 { "(bad)", { XX } },
6316 { "(bad)", { XX } },
6317 /* c8 */
6318 { "(bad)", { XX } },
6319 { "(bad)", { XX } },
6320 { "(bad)", { XX } },
6321 { "(bad)", { XX } },
6322 { "(bad)", { XX } },
6323 { "(bad)", { XX } },
6324 { "(bad)", { XX } },
6325 { "(bad)", { XX } },
6326 /* d0 */
6327 { "(bad)", { XX } },
6328 { "(bad)", { XX } },
6329 { "(bad)", { XX } },
6330 { "(bad)", { XX } },
6331 { "(bad)", { XX } },
6332 { "(bad)", { XX } },
6333 { "(bad)", { XX } },
6334 { "(bad)", { XX } },
6335 /* d8 */
6336 { "(bad)", { XX } },
6337 { "(bad)", { XX } },
6338 { "(bad)", { XX } },
6339 { "(bad)", { XX } },
6340 { "(bad)", { XX } },
6341 { "(bad)", { XX } },
6342 { "(bad)", { XX } },
6343 { "(bad)", { XX } },
6344 /* e0 */
6345 { "(bad)", { XX } },
6346 { "(bad)", { XX } },
6347 { "(bad)", { XX } },
6348 { "(bad)", { XX } },
6349 { "(bad)", { XX } },
6350 { "(bad)", { XX } },
6351 { "(bad)", { XX } },
6352 { "(bad)", { XX } },
6353 /* e8 */
6354 { "(bad)", { XX } },
6355 { "(bad)", { XX } },
6356 { "(bad)", { XX } },
6357 { "(bad)", { XX } },
6358 { "(bad)", { XX } },
6359 { "(bad)", { XX } },
6360 { "(bad)", { XX } },
6361 { "(bad)", { XX } },
6362 /* f0 */
6363 { "(bad)", { XX } },
6364 { "(bad)", { XX } },
6365 { "(bad)", { XX } },
6366 { "(bad)", { XX } },
6367 { "(bad)", { XX } },
6368 { "(bad)", { XX } },
6369 { "(bad)", { XX } },
6370 { "(bad)", { XX } },
6371 /* f8 */
6372 { "(bad)", { XX } },
6373 { "(bad)", { XX } },
6374 { "(bad)", { XX } },
6375 { "(bad)", { XX } },
6376 { "(bad)", { XX } },
6377 { "(bad)", { XX } },
6378 { "(bad)", { XX } },
6379 { "(bad)", { XX } },
6380 },
6381 };
6382
6383 static const struct dis386 xop_table[][256] = {
6384 /* XOP_09 */
6385 {
6386 /* 00 */
6387 { "(bad)", { XX } },
6388 { "(bad)", { XX } },
6389 { "(bad)", { XX } },
6390 { "(bad)", { XX } },
6391 { "(bad)", { XX } },
6392 { "(bad)", { XX } },
6393 { "(bad)", { XX } },
6394 { "(bad)", { XX } },
6395 /* 08 */
6396 { "(bad)", { XX } },
6397 { "(bad)", { XX } },
6398 { "(bad)", { XX } },
6399 { "(bad)", { XX } },
6400 { "(bad)", { XX } },
6401 { "(bad)", { XX } },
6402 { "(bad)", { XX } },
6403 { "(bad)", { XX } },
6404 /* 10 */
6405 { "(bad)", { XX } },
6406 { "(bad)", { XX } },
6407 { REG_TABLE (REG_XOP_LWPCB) },
6408 { "(bad)", { XX } },
6409 { "(bad)", { XX } },
6410 { "(bad)", { XX } },
6411 { "(bad)", { XX } },
6412 { "(bad)", { XX } },
6413 /* 18 */
6414 { "(bad)", { XX } },
6415 { "(bad)", { XX } },
6416 { "(bad)", { XX } },
6417 { "(bad)", { XX } },
6418 { "(bad)", { XX } },
6419 { "(bad)", { XX } },
6420 { "(bad)", { XX } },
6421 { "(bad)", { XX } },
6422 /* 20 */
6423 { "(bad)", { XX } },
6424 { "(bad)", { XX } },
6425 { "(bad)", { XX } },
6426 { "(bad)", { XX } },
6427 { "(bad)", { XX } },
6428 { "(bad)", { XX } },
6429 { "(bad)", { XX } },
6430 { "(bad)", { XX } },
6431 /* 28 */
6432 { "(bad)", { XX } },
6433 { "(bad)", { XX } },
6434 { "(bad)", { XX } },
6435 { "(bad)", { XX } },
6436 { "(bad)", { XX } },
6437 { "(bad)", { XX } },
6438 { "(bad)", { XX } },
6439 { "(bad)", { XX } },
6440 /* 30 */
6441 { "(bad)", { XX } },
6442 { "(bad)", { XX } },
6443 { "(bad)", { XX } },
6444 { "(bad)", { XX } },
6445 { "(bad)", { XX } },
6446 { "(bad)", { XX } },
6447 { "(bad)", { XX } },
6448 { "(bad)", { XX } },
6449 /* 38 */
6450 { "(bad)", { XX } },
6451 { "(bad)", { XX } },
6452 { "(bad)", { XX } },
6453 { "(bad)", { XX } },
6454 { "(bad)", { XX } },
6455 { "(bad)", { XX } },
6456 { "(bad)", { XX } },
6457 { "(bad)", { XX } },
6458 /* 40 */
6459 { "(bad)", { XX } },
6460 { "(bad)", { XX } },
6461 { "(bad)", { XX } },
6462 { "(bad)", { XX } },
6463 { "(bad)", { XX } },
6464 { "(bad)", { XX } },
6465 { "(bad)", { XX } },
6466 { "(bad)", { XX } },
6467 /* 48 */
6468 { "(bad)", { XX } },
6469 { "(bad)", { XX } },
6470 { "(bad)", { XX } },
6471 { "(bad)", { XX } },
6472 { "(bad)", { XX } },
6473 { "(bad)", { XX } },
6474 { "(bad)", { XX } },
6475 { "(bad)", { XX } },
6476 /* 50 */
6477 { "(bad)", { XX } },
6478 { "(bad)", { XX } },
6479 { "(bad)", { XX } },
6480 { "(bad)", { XX } },
6481 { "(bad)", { XX } },
6482 { "(bad)", { XX } },
6483 { "(bad)", { XX } },
6484 { "(bad)", { XX } },
6485 /* 58 */
6486 { "(bad)", { XX } },
6487 { "(bad)", { XX } },
6488 { "(bad)", { XX } },
6489 { "(bad)", { XX } },
6490 { "(bad)", { XX } },
6491 { "(bad)", { XX } },
6492 { "(bad)", { XX } },
6493 { "(bad)", { XX } },
6494 /* 60 */
6495 { "(bad)", { XX } },
6496 { "(bad)", { XX } },
6497 { "(bad)", { XX } },
6498 { "(bad)", { XX } },
6499 { "(bad)", { XX } },
6500 { "(bad)", { XX } },
6501 { "(bad)", { XX } },
6502 { "(bad)", { XX } },
6503 /* 68 */
6504 { "(bad)", { XX } },
6505 { "(bad)", { XX } },
6506 { "(bad)", { XX } },
6507 { "(bad)", { XX } },
6508 { "(bad)", { XX } },
6509 { "(bad)", { XX } },
6510 { "(bad)", { XX } },
6511 { "(bad)", { XX } },
6512 /* 70 */
6513 { "(bad)", { XX } },
6514 { "(bad)", { XX } },
6515 { "(bad)", { XX } },
6516 { "(bad)", { XX } },
6517 { "(bad)", { XX } },
6518 { "(bad)", { XX } },
6519 { "(bad)", { XX } },
6520 { "(bad)", { XX } },
6521 /* 78 */
6522 { "(bad)", { XX } },
6523 { "(bad)", { XX } },
6524 { "(bad)", { XX } },
6525 { "(bad)", { XX } },
6526 { "(bad)", { XX } },
6527 { "(bad)", { XX } },
6528 { "(bad)", { XX } },
6529 { "(bad)", { XX } },
6530 /* 80 */
6531 { "(bad)", { XX } },
6532 { "(bad)", { XX } },
6533 { "(bad)", { XX } },
6534 { "(bad)", { XX } },
6535 { "(bad)", { XX } },
6536 { "(bad)", { XX } },
6537 { "(bad)", { XX } },
6538 { "(bad)", { XX } },
6539 /* 88 */
6540 { "(bad)", { XX } },
6541 { "(bad)", { XX } },
6542 { "(bad)", { XX } },
6543 { "(bad)", { XX } },
6544 { "(bad)", { XX } },
6545 { "(bad)", { XX } },
6546 { "(bad)", { XX } },
6547 { "(bad)", { XX } },
6548 /* 90 */
6549 { "(bad)", { XX } },
6550 { "(bad)", { XX } },
6551 { "(bad)", { XX } },
6552 { "(bad)", { XX } },
6553 { "(bad)", { XX } },
6554 { "(bad)", { XX } },
6555 { "(bad)", { XX } },
6556 { "(bad)", { XX } },
6557 /* 98 */
6558 { "(bad)", { XX } },
6559 { "(bad)", { XX } },
6560 { "(bad)", { XX } },
6561 { "(bad)", { XX } },
6562 { "(bad)", { XX } },
6563 { "(bad)", { XX } },
6564 { "(bad)", { XX } },
6565 { "(bad)", { XX } },
6566 /* a0 */
6567 { "(bad)", { XX } },
6568 { "(bad)", { XX } },
6569 { "(bad)", { XX } },
6570 { "(bad)", { XX } },
6571 { "(bad)", { XX } },
6572 { "(bad)", { XX } },
6573 { "(bad)", { XX } },
6574 { "(bad)", { XX } },
6575 /* a8 */
6576 { "(bad)", { XX } },
6577 { "(bad)", { XX } },
6578 { "(bad)", { XX } },
6579 { "(bad)", { XX } },
6580 { "(bad)", { XX } },
6581 { "(bad)", { XX } },
6582 { "(bad)", { XX } },
6583 { "(bad)", { XX } },
6584 /* b0 */
6585 { "(bad)", { XX } },
6586 { "(bad)", { XX } },
6587 { "(bad)", { XX } },
6588 { "(bad)", { XX } },
6589 { "(bad)", { XX } },
6590 { "(bad)", { XX } },
6591 { "(bad)", { XX } },
6592 { "(bad)", { XX } },
6593 /* b8 */
6594 { "(bad)", { XX } },
6595 { "(bad)", { XX } },
6596 { "(bad)", { XX } },
6597 { "(bad)", { XX } },
6598 { "(bad)", { XX } },
6599 { "(bad)", { XX } },
6600 { "(bad)", { XX } },
6601 { "(bad)", { XX } },
6602 /* c0 */
6603 { "(bad)", { XX } },
6604 { "(bad)", { XX } },
6605 { "(bad)", { XX } },
6606 { "(bad)", { XX } },
6607 { "(bad)", { XX } },
6608 { "(bad)", { XX } },
6609 { "(bad)", { XX } },
6610 { "(bad)", { XX } },
6611 /* c8 */
6612 { "(bad)", { XX } },
6613 { "(bad)", { XX } },
6614 { "(bad)", { XX } },
6615 { "(bad)", { XX } },
6616 { "(bad)", { XX } },
6617 { "(bad)", { XX } },
6618 { "(bad)", { XX } },
6619 { "(bad)", { XX } },
6620 /* d0 */
6621 { "(bad)", { XX } },
6622 { "(bad)", { XX } },
6623 { "(bad)", { XX } },
6624 { "(bad)", { XX } },
6625 { "(bad)", { XX } },
6626 { "(bad)", { XX } },
6627 { "(bad)", { XX } },
6628 { "(bad)", { XX } },
6629 /* d8 */
6630 { "(bad)", { XX } },
6631 { "(bad)", { XX } },
6632 { "(bad)", { XX } },
6633 { "(bad)", { XX } },
6634 { "(bad)", { XX } },
6635 { "(bad)", { XX } },
6636 { "(bad)", { XX } },
6637 { "(bad)", { XX } },
6638 /* e0 */
6639 { "(bad)", { XX } },
6640 { "(bad)", { XX } },
6641 { "(bad)", { XX } },
6642 { "(bad)", { XX } },
6643 { "(bad)", { XX } },
6644 { "(bad)", { XX } },
6645 { "(bad)", { XX } },
6646 { "(bad)", { XX } },
6647 /* e8 */
6648 { "(bad)", { XX } },
6649 { "(bad)", { XX } },
6650 { "(bad)", { XX } },
6651 { "(bad)", { XX } },
6652 { "(bad)", { XX } },
6653 { "(bad)", { XX } },
6654 { "(bad)", { XX } },
6655 { "(bad)", { XX } },
6656 /* f0 */
6657 { "(bad)", { XX } },
6658 { "(bad)", { XX } },
6659 { "(bad)", { XX } },
6660 { "(bad)", { XX } },
6661 { "(bad)", { XX } },
6662 { "(bad)", { XX } },
6663 { "(bad)", { XX } },
6664 { "(bad)", { XX } },
6665 /* f8 */
6666 { "(bad)", { XX } },
6667 { "(bad)", { XX } },
6668 { "(bad)", { XX } },
6669 { "(bad)", { XX } },
6670 { "(bad)", { XX } },
6671 { "(bad)", { XX } },
6672 { "(bad)", { XX } },
6673 { "(bad)", { XX } },
6674 },
6675 /* XOP_0A */
6676 {
6677 /* 00 */
6678 { "(bad)", { XX } },
6679 { "(bad)", { XX } },
6680 { "(bad)", { XX } },
6681 { "(bad)", { XX } },
6682 { "(bad)", { XX } },
6683 { "(bad)", { XX } },
6684 { "(bad)", { XX } },
6685 { "(bad)", { XX } },
6686 /* 08 */
6687 { "(bad)", { XX } },
6688 { "(bad)", { XX } },
6689 { "(bad)", { XX } },
6690 { "(bad)", { XX } },
6691 { "(bad)", { XX } },
6692 { "(bad)", { XX } },
6693 { "(bad)", { XX } },
6694 { "(bad)", { XX } },
6695 /* 10 */
6696 { "(bad)", { XX } },
6697 { "(bad)", { XX } },
6698 { REG_TABLE (REG_XOP_LWP) },
6699 { "(bad)", { XX } },
6700 { "(bad)", { XX } },
6701 { "(bad)", { XX } },
6702 { "(bad)", { XX } },
6703 { "(bad)", { XX } },
6704 /* 18 */
6705 { "(bad)", { XX } },
6706 { "(bad)", { XX } },
6707 { "(bad)", { XX } },
6708 { "(bad)", { XX } },
6709 { "(bad)", { XX } },
6710 { "(bad)", { XX } },
6711 { "(bad)", { XX } },
6712 { "(bad)", { XX } },
6713 /* 20 */
6714 { "(bad)", { XX } },
6715 { "(bad)", { XX } },
6716 { "(bad)", { XX } },
6717 { "(bad)", { XX } },
6718 { "(bad)", { XX } },
6719 { "(bad)", { XX } },
6720 { "(bad)", { XX } },
6721 { "(bad)", { XX } },
6722 /* 28 */
6723 { "(bad)", { XX } },
6724 { "(bad)", { XX } },
6725 { "(bad)", { XX } },
6726 { "(bad)", { XX } },
6727 { "(bad)", { XX } },
6728 { "(bad)", { XX } },
6729 { "(bad)", { XX } },
6730 { "(bad)", { XX } },
6731 /* 30 */
6732 { "(bad)", { XX } },
6733 { "(bad)", { XX } },
6734 { "(bad)", { XX } },
6735 { "(bad)", { XX } },
6736 { "(bad)", { XX } },
6737 { "(bad)", { XX } },
6738 { "(bad)", { XX } },
6739 { "(bad)", { XX } },
6740 /* 38 */
6741 { "(bad)", { XX } },
6742 { "(bad)", { XX } },
6743 { "(bad)", { XX } },
6744 { "(bad)", { XX } },
6745 { "(bad)", { XX } },
6746 { "(bad)", { XX } },
6747 { "(bad)", { XX } },
6748 { "(bad)", { XX } },
6749 /* 40 */
6750 { "(bad)", { XX } },
6751 { "(bad)", { XX } },
6752 { "(bad)", { XX } },
6753 { "(bad)", { XX } },
6754 { "(bad)", { XX } },
6755 { "(bad)", { XX } },
6756 { "(bad)", { XX } },
6757 { "(bad)", { XX } },
6758 /* 48 */
6759 { "(bad)", { XX } },
6760 { "(bad)", { XX } },
6761 { "(bad)", { XX } },
6762 { "(bad)", { XX } },
6763 { "(bad)", { XX } },
6764 { "(bad)", { XX } },
6765 { "(bad)", { XX } },
6766 { "(bad)", { XX } },
6767 /* 50 */
6768 { "(bad)", { XX } },
6769 { "(bad)", { XX } },
6770 { "(bad)", { XX } },
6771 { "(bad)", { XX } },
6772 { "(bad)", { XX } },
6773 { "(bad)", { XX } },
6774 { "(bad)", { XX } },
6775 { "(bad)", { XX } },
6776 /* 58 */
6777 { "(bad)", { XX } },
6778 { "(bad)", { XX } },
6779 { "(bad)", { XX } },
6780 { "(bad)", { XX } },
6781 { "(bad)", { XX } },
6782 { "(bad)", { XX } },
6783 { "(bad)", { XX } },
6784 { "(bad)", { XX } },
6785 /* 60 */
6786 { "(bad)", { XX } },
6787 { "(bad)", { XX } },
6788 { "(bad)", { XX } },
6789 { "(bad)", { XX } },
6790 { "(bad)", { XX } },
6791 { "(bad)", { XX } },
6792 { "(bad)", { XX } },
6793 { "(bad)", { XX } },
6794 /* 68 */
6795 { "(bad)", { XX } },
6796 { "(bad)", { XX } },
6797 { "(bad)", { XX } },
6798 { "(bad)", { XX } },
6799 { "(bad)", { XX } },
6800 { "(bad)", { XX } },
6801 { "(bad)", { XX } },
6802 { "(bad)", { XX } },
6803 /* 70 */
6804 { "(bad)", { XX } },
6805 { "(bad)", { XX } },
6806 { "(bad)", { XX } },
6807 { "(bad)", { XX } },
6808 { "(bad)", { XX } },
6809 { "(bad)", { XX } },
6810 { "(bad)", { XX } },
6811 { "(bad)", { XX } },
6812 /* 78 */
6813 { "(bad)", { XX } },
6814 { "(bad)", { XX } },
6815 { "(bad)", { XX } },
6816 { "(bad)", { XX } },
6817 { "(bad)", { XX } },
6818 { "(bad)", { XX } },
6819 { "(bad)", { XX } },
6820 { "(bad)", { XX } },
6821 /* 80 */
6822 { "(bad)", { XX } },
6823 { "(bad)", { XX } },
6824 { "(bad)", { XX } },
6825 { "(bad)", { XX } },
6826 { "(bad)", { XX } },
6827 { "(bad)", { XX } },
6828 { "(bad)", { XX } },
6829 { "(bad)", { XX } },
6830 /* 88 */
6831 { "(bad)", { XX } },
6832 { "(bad)", { XX } },
6833 { "(bad)", { XX } },
6834 { "(bad)", { XX } },
6835 { "(bad)", { XX } },
6836 { "(bad)", { XX } },
6837 { "(bad)", { XX } },
6838 { "(bad)", { XX } },
6839 /* 90 */
6840 { "(bad)", { XX } },
6841 { "(bad)", { XX } },
6842 { "(bad)", { XX } },
6843 { "(bad)", { XX } },
6844 { "(bad)", { XX } },
6845 { "(bad)", { XX } },
6846 { "(bad)", { XX } },
6847 { "(bad)", { XX } },
6848 /* 98 */
6849 { "(bad)", { XX } },
6850 { "(bad)", { XX } },
6851 { "(bad)", { XX } },
6852 { "(bad)", { XX } },
6853 { "(bad)", { XX } },
6854 { "(bad)", { XX } },
6855 { "(bad)", { XX } },
6856 { "(bad)", { XX } },
6857 /* a0 */
6858 { "(bad)", { XX } },
6859 { "(bad)", { XX } },
6860 { "(bad)", { XX } },
6861 { "(bad)", { XX } },
6862 { "(bad)", { XX } },
6863 { "(bad)", { XX } },
6864 { "(bad)", { XX } },
6865 { "(bad)", { XX } },
6866 /* a8 */
6867 { "(bad)", { XX } },
6868 { "(bad)", { XX } },
6869 { "(bad)", { XX } },
6870 { "(bad)", { XX } },
6871 { "(bad)", { XX } },
6872 { "(bad)", { XX } },
6873 { "(bad)", { XX } },
6874 { "(bad)", { XX } },
6875 /* b0 */
6876 { "(bad)", { XX } },
6877 { "(bad)", { XX } },
6878 { "(bad)", { XX } },
6879 { "(bad)", { XX } },
6880 { "(bad)", { XX } },
6881 { "(bad)", { XX } },
6882 { "(bad)", { XX } },
6883 { "(bad)", { XX } },
6884 /* b8 */
6885 { "(bad)", { XX } },
6886 { "(bad)", { XX } },
6887 { "(bad)", { XX } },
6888 { "(bad)", { XX } },
6889 { "(bad)", { XX } },
6890 { "(bad)", { XX } },
6891 { "(bad)", { XX } },
6892 { "(bad)", { XX } },
6893 /* c0 */
6894 { "(bad)", { XX } },
6895 { "(bad)", { XX } },
6896 { "(bad)", { XX } },
6897 { "(bad)", { XX } },
6898 { "(bad)", { XX } },
6899 { "(bad)", { XX } },
6900 { "(bad)", { XX } },
6901 { "(bad)", { XX } },
6902 /* c8 */
6903 { "(bad)", { XX } },
6904 { "(bad)", { XX } },
6905 { "(bad)", { XX } },
6906 { "(bad)", { XX } },
6907 { "(bad)", { XX } },
6908 { "(bad)", { XX } },
6909 { "(bad)", { XX } },
6910 { "(bad)", { XX } },
6911 /* d0 */
6912 { "(bad)", { XX } },
6913 { "(bad)", { XX } },
6914 { "(bad)", { XX } },
6915 { "(bad)", { XX } },
6916 { "(bad)", { XX } },
6917 { "(bad)", { XX } },
6918 { "(bad)", { XX } },
6919 { "(bad)", { XX } },
6920 /* d8 */
6921 { "(bad)", { XX } },
6922 { "(bad)", { XX } },
6923 { "(bad)", { XX } },
6924 { "(bad)", { XX } },
6925 { "(bad)", { XX } },
6926 { "(bad)", { XX } },
6927 { "(bad)", { XX } },
6928 { "(bad)", { XX } },
6929 /* e0 */
6930 { "(bad)", { XX } },
6931 { "(bad)", { XX } },
6932 { "(bad)", { XX } },
6933 { "(bad)", { XX } },
6934 { "(bad)", { XX } },
6935 { "(bad)", { XX } },
6936 { "(bad)", { XX } },
6937 { "(bad)", { XX } },
6938 /* e8 */
6939 { "(bad)", { XX } },
6940 { "(bad)", { XX } },
6941 { "(bad)", { XX } },
6942 { "(bad)", { XX } },
6943 { "(bad)", { XX } },
6944 { "(bad)", { XX } },
6945 { "(bad)", { XX } },
6946 { "(bad)", { XX } },
6947 /* f0 */
6948 { "(bad)", { XX } },
6949 { "(bad)", { XX } },
6950 { "(bad)", { XX } },
6951 { "(bad)", { XX } },
6952 { "(bad)", { XX } },
6953 { "(bad)", { XX } },
6954 { "(bad)", { XX } },
6955 { "(bad)", { XX } },
6956 /* f8 */
6957 { "(bad)", { XX } },
6958 { "(bad)", { XX } },
6959 { "(bad)", { XX } },
6960 { "(bad)", { XX } },
6961 { "(bad)", { XX } },
6962 { "(bad)", { XX } },
6963 { "(bad)", { XX } },
6964 { "(bad)", { XX } },
6965 },
6966 };
6967
6968 static const struct dis386 vex_table[][256] = {
6969 /* VEX_0F */
6970 {
6971 /* 00 */
6972 { "(bad)", { XX } },
6973 { "(bad)", { XX } },
6974 { "(bad)", { XX } },
6975 { "(bad)", { XX } },
6976 { "(bad)", { XX } },
6977 { "(bad)", { XX } },
6978 { "(bad)", { XX } },
6979 { "(bad)", { XX } },
6980 /* 08 */
6981 { "(bad)", { XX } },
6982 { "(bad)", { XX } },
6983 { "(bad)", { XX } },
6984 { "(bad)", { XX } },
6985 { "(bad)", { XX } },
6986 { "(bad)", { XX } },
6987 { "(bad)", { XX } },
6988 { "(bad)", { XX } },
6989 /* 10 */
6990 { PREFIX_TABLE (PREFIX_VEX_10) },
6991 { PREFIX_TABLE (PREFIX_VEX_11) },
6992 { PREFIX_TABLE (PREFIX_VEX_12) },
6993 { MOD_TABLE (MOD_VEX_13) },
6994 { "vunpcklpX", { XM, Vex, EXx } },
6995 { "vunpckhpX", { XM, Vex, EXx } },
6996 { PREFIX_TABLE (PREFIX_VEX_16) },
6997 { MOD_TABLE (MOD_VEX_17) },
6998 /* 18 */
6999 { "(bad)", { XX } },
7000 { "(bad)", { XX } },
7001 { "(bad)", { XX } },
7002 { "(bad)", { XX } },
7003 { "(bad)", { XX } },
7004 { "(bad)", { XX } },
7005 { "(bad)", { XX } },
7006 { "(bad)", { XX } },
7007 /* 20 */
7008 { "(bad)", { XX } },
7009 { "(bad)", { XX } },
7010 { "(bad)", { XX } },
7011 { "(bad)", { XX } },
7012 { "(bad)", { XX } },
7013 { "(bad)", { XX } },
7014 { "(bad)", { XX } },
7015 { "(bad)", { XX } },
7016 /* 28 */
7017 { "vmovapX", { XM, EXx } },
7018 { "vmovapX", { EXxS, XM } },
7019 { PREFIX_TABLE (PREFIX_VEX_2A) },
7020 { MOD_TABLE (MOD_VEX_2B) },
7021 { PREFIX_TABLE (PREFIX_VEX_2C) },
7022 { PREFIX_TABLE (PREFIX_VEX_2D) },
7023 { PREFIX_TABLE (PREFIX_VEX_2E) },
7024 { PREFIX_TABLE (PREFIX_VEX_2F) },
7025 /* 30 */
7026 { "(bad)", { XX } },
7027 { "(bad)", { XX } },
7028 { "(bad)", { XX } },
7029 { "(bad)", { XX } },
7030 { "(bad)", { XX } },
7031 { "(bad)", { XX } },
7032 { "(bad)", { XX } },
7033 { "(bad)", { XX } },
7034 /* 38 */
7035 { "(bad)", { XX } },
7036 { "(bad)", { XX } },
7037 { "(bad)", { XX } },
7038 { "(bad)", { XX } },
7039 { "(bad)", { XX } },
7040 { "(bad)", { XX } },
7041 { "(bad)", { XX } },
7042 { "(bad)", { XX } },
7043 /* 40 */
7044 { "(bad)", { XX } },
7045 { "(bad)", { XX } },
7046 { "(bad)", { XX } },
7047 { "(bad)", { XX } },
7048 { "(bad)", { XX } },
7049 { "(bad)", { XX } },
7050 { "(bad)", { XX } },
7051 { "(bad)", { XX } },
7052 /* 48 */
7053 { "(bad)", { XX } },
7054 { "(bad)", { XX } },
7055 { "(bad)", { XX } },
7056 { "(bad)", { XX } },
7057 { "(bad)", { XX } },
7058 { "(bad)", { XX } },
7059 { "(bad)", { XX } },
7060 { "(bad)", { XX } },
7061 /* 50 */
7062 { MOD_TABLE (MOD_VEX_51) },
7063 { PREFIX_TABLE (PREFIX_VEX_51) },
7064 { PREFIX_TABLE (PREFIX_VEX_52) },
7065 { PREFIX_TABLE (PREFIX_VEX_53) },
7066 { "vandpX", { XM, Vex, EXx } },
7067 { "vandnpX", { XM, Vex, EXx } },
7068 { "vorpX", { XM, Vex, EXx } },
7069 { "vxorpX", { XM, Vex, EXx } },
7070 /* 58 */
7071 { PREFIX_TABLE (PREFIX_VEX_58) },
7072 { PREFIX_TABLE (PREFIX_VEX_59) },
7073 { PREFIX_TABLE (PREFIX_VEX_5A) },
7074 { PREFIX_TABLE (PREFIX_VEX_5B) },
7075 { PREFIX_TABLE (PREFIX_VEX_5C) },
7076 { PREFIX_TABLE (PREFIX_VEX_5D) },
7077 { PREFIX_TABLE (PREFIX_VEX_5E) },
7078 { PREFIX_TABLE (PREFIX_VEX_5F) },
7079 /* 60 */
7080 { PREFIX_TABLE (PREFIX_VEX_60) },
7081 { PREFIX_TABLE (PREFIX_VEX_61) },
7082 { PREFIX_TABLE (PREFIX_VEX_62) },
7083 { PREFIX_TABLE (PREFIX_VEX_63) },
7084 { PREFIX_TABLE (PREFIX_VEX_64) },
7085 { PREFIX_TABLE (PREFIX_VEX_65) },
7086 { PREFIX_TABLE (PREFIX_VEX_66) },
7087 { PREFIX_TABLE (PREFIX_VEX_67) },
7088 /* 68 */
7089 { PREFIX_TABLE (PREFIX_VEX_68) },
7090 { PREFIX_TABLE (PREFIX_VEX_69) },
7091 { PREFIX_TABLE (PREFIX_VEX_6A) },
7092 { PREFIX_TABLE (PREFIX_VEX_6B) },
7093 { PREFIX_TABLE (PREFIX_VEX_6C) },
7094 { PREFIX_TABLE (PREFIX_VEX_6D) },
7095 { PREFIX_TABLE (PREFIX_VEX_6E) },
7096 { PREFIX_TABLE (PREFIX_VEX_6F) },
7097 /* 70 */
7098 { PREFIX_TABLE (PREFIX_VEX_70) },
7099 { REG_TABLE (REG_VEX_71) },
7100 { REG_TABLE (REG_VEX_72) },
7101 { REG_TABLE (REG_VEX_73) },
7102 { PREFIX_TABLE (PREFIX_VEX_74) },
7103 { PREFIX_TABLE (PREFIX_VEX_75) },
7104 { PREFIX_TABLE (PREFIX_VEX_76) },
7105 { PREFIX_TABLE (PREFIX_VEX_77) },
7106 /* 78 */
7107 { "(bad)", { XX } },
7108 { "(bad)", { XX } },
7109 { "(bad)", { XX } },
7110 { "(bad)", { XX } },
7111 { PREFIX_TABLE (PREFIX_VEX_7C) },
7112 { PREFIX_TABLE (PREFIX_VEX_7D) },
7113 { PREFIX_TABLE (PREFIX_VEX_7E) },
7114 { PREFIX_TABLE (PREFIX_VEX_7F) },
7115 /* 80 */
7116 { "(bad)", { XX } },
7117 { "(bad)", { XX } },
7118 { "(bad)", { XX } },
7119 { "(bad)", { XX } },
7120 { "(bad)", { XX } },
7121 { "(bad)", { XX } },
7122 { "(bad)", { XX } },
7123 { "(bad)", { XX } },
7124 /* 88 */
7125 { "(bad)", { XX } },
7126 { "(bad)", { XX } },
7127 { "(bad)", { XX } },
7128 { "(bad)", { XX } },
7129 { "(bad)", { XX } },
7130 { "(bad)", { XX } },
7131 { "(bad)", { XX } },
7132 { "(bad)", { XX } },
7133 /* 90 */
7134 { "(bad)", { XX } },
7135 { "(bad)", { XX } },
7136 { "(bad)", { XX } },
7137 { "(bad)", { XX } },
7138 { "(bad)", { XX } },
7139 { "(bad)", { XX } },
7140 { "(bad)", { XX } },
7141 { "(bad)", { XX } },
7142 /* 98 */
7143 { "(bad)", { XX } },
7144 { "(bad)", { XX } },
7145 { "(bad)", { XX } },
7146 { "(bad)", { XX } },
7147 { "(bad)", { XX } },
7148 { "(bad)", { XX } },
7149 { "(bad)", { XX } },
7150 { "(bad)", { XX } },
7151 /* a0 */
7152 { "(bad)", { XX } },
7153 { "(bad)", { XX } },
7154 { "(bad)", { XX } },
7155 { "(bad)", { XX } },
7156 { "(bad)", { XX } },
7157 { "(bad)", { XX } },
7158 { "(bad)", { XX } },
7159 { "(bad)", { XX } },
7160 /* a8 */
7161 { "(bad)", { XX } },
7162 { "(bad)", { XX } },
7163 { "(bad)", { XX } },
7164 { "(bad)", { XX } },
7165 { "(bad)", { XX } },
7166 { "(bad)", { XX } },
7167 { REG_TABLE (REG_VEX_AE) },
7168 { "(bad)", { XX } },
7169 /* b0 */
7170 { "(bad)", { XX } },
7171 { "(bad)", { XX } },
7172 { "(bad)", { XX } },
7173 { "(bad)", { XX } },
7174 { "(bad)", { XX } },
7175 { "(bad)", { XX } },
7176 { "(bad)", { XX } },
7177 { "(bad)", { XX } },
7178 /* b8 */
7179 { "(bad)", { XX } },
7180 { "(bad)", { XX } },
7181 { "(bad)", { XX } },
7182 { "(bad)", { XX } },
7183 { "(bad)", { XX } },
7184 { "(bad)", { XX } },
7185 { "(bad)", { XX } },
7186 { "(bad)", { XX } },
7187 /* c0 */
7188 { "(bad)", { XX } },
7189 { "(bad)", { XX } },
7190 { PREFIX_TABLE (PREFIX_VEX_C2) },
7191 { "(bad)", { XX } },
7192 { PREFIX_TABLE (PREFIX_VEX_C4) },
7193 { PREFIX_TABLE (PREFIX_VEX_C5) },
7194 { "vshufpX", { XM, Vex, EXx, Ib } },
7195 { "(bad)", { XX } },
7196 /* c8 */
7197 { "(bad)", { XX } },
7198 { "(bad)", { XX } },
7199 { "(bad)", { XX } },
7200 { "(bad)", { XX } },
7201 { "(bad)", { XX } },
7202 { "(bad)", { XX } },
7203 { "(bad)", { XX } },
7204 { "(bad)", { XX } },
7205 /* d0 */
7206 { PREFIX_TABLE (PREFIX_VEX_D0) },
7207 { PREFIX_TABLE (PREFIX_VEX_D1) },
7208 { PREFIX_TABLE (PREFIX_VEX_D2) },
7209 { PREFIX_TABLE (PREFIX_VEX_D3) },
7210 { PREFIX_TABLE (PREFIX_VEX_D4) },
7211 { PREFIX_TABLE (PREFIX_VEX_D5) },
7212 { PREFIX_TABLE (PREFIX_VEX_D6) },
7213 { PREFIX_TABLE (PREFIX_VEX_D7) },
7214 /* d8 */
7215 { PREFIX_TABLE (PREFIX_VEX_D8) },
7216 { PREFIX_TABLE (PREFIX_VEX_D9) },
7217 { PREFIX_TABLE (PREFIX_VEX_DA) },
7218 { PREFIX_TABLE (PREFIX_VEX_DB) },
7219 { PREFIX_TABLE (PREFIX_VEX_DC) },
7220 { PREFIX_TABLE (PREFIX_VEX_DD) },
7221 { PREFIX_TABLE (PREFIX_VEX_DE) },
7222 { PREFIX_TABLE (PREFIX_VEX_DF) },
7223 /* e0 */
7224 { PREFIX_TABLE (PREFIX_VEX_E0) },
7225 { PREFIX_TABLE (PREFIX_VEX_E1) },
7226 { PREFIX_TABLE (PREFIX_VEX_E2) },
7227 { PREFIX_TABLE (PREFIX_VEX_E3) },
7228 { PREFIX_TABLE (PREFIX_VEX_E4) },
7229 { PREFIX_TABLE (PREFIX_VEX_E5) },
7230 { PREFIX_TABLE (PREFIX_VEX_E6) },
7231 { PREFIX_TABLE (PREFIX_VEX_E7) },
7232 /* e8 */
7233 { PREFIX_TABLE (PREFIX_VEX_E8) },
7234 { PREFIX_TABLE (PREFIX_VEX_E9) },
7235 { PREFIX_TABLE (PREFIX_VEX_EA) },
7236 { PREFIX_TABLE (PREFIX_VEX_EB) },
7237 { PREFIX_TABLE (PREFIX_VEX_EC) },
7238 { PREFIX_TABLE (PREFIX_VEX_ED) },
7239 { PREFIX_TABLE (PREFIX_VEX_EE) },
7240 { PREFIX_TABLE (PREFIX_VEX_EF) },
7241 /* f0 */
7242 { PREFIX_TABLE (PREFIX_VEX_F0) },
7243 { PREFIX_TABLE (PREFIX_VEX_F1) },
7244 { PREFIX_TABLE (PREFIX_VEX_F2) },
7245 { PREFIX_TABLE (PREFIX_VEX_F3) },
7246 { PREFIX_TABLE (PREFIX_VEX_F4) },
7247 { PREFIX_TABLE (PREFIX_VEX_F5) },
7248 { PREFIX_TABLE (PREFIX_VEX_F6) },
7249 { PREFIX_TABLE (PREFIX_VEX_F7) },
7250 /* f8 */
7251 { PREFIX_TABLE (PREFIX_VEX_F8) },
7252 { PREFIX_TABLE (PREFIX_VEX_F9) },
7253 { PREFIX_TABLE (PREFIX_VEX_FA) },
7254 { PREFIX_TABLE (PREFIX_VEX_FB) },
7255 { PREFIX_TABLE (PREFIX_VEX_FC) },
7256 { PREFIX_TABLE (PREFIX_VEX_FD) },
7257 { PREFIX_TABLE (PREFIX_VEX_FE) },
7258 { "(bad)", { XX } },
7259 },
7260 /* VEX_0F38 */
7261 {
7262 /* 00 */
7263 { PREFIX_TABLE (PREFIX_VEX_3800) },
7264 { PREFIX_TABLE (PREFIX_VEX_3801) },
7265 { PREFIX_TABLE (PREFIX_VEX_3802) },
7266 { PREFIX_TABLE (PREFIX_VEX_3803) },
7267 { PREFIX_TABLE (PREFIX_VEX_3804) },
7268 { PREFIX_TABLE (PREFIX_VEX_3805) },
7269 { PREFIX_TABLE (PREFIX_VEX_3806) },
7270 { PREFIX_TABLE (PREFIX_VEX_3807) },
7271 /* 08 */
7272 { PREFIX_TABLE (PREFIX_VEX_3808) },
7273 { PREFIX_TABLE (PREFIX_VEX_3809) },
7274 { PREFIX_TABLE (PREFIX_VEX_380A) },
7275 { PREFIX_TABLE (PREFIX_VEX_380B) },
7276 { PREFIX_TABLE (PREFIX_VEX_380C) },
7277 { PREFIX_TABLE (PREFIX_VEX_380D) },
7278 { PREFIX_TABLE (PREFIX_VEX_380E) },
7279 { PREFIX_TABLE (PREFIX_VEX_380F) },
7280 /* 10 */
7281 { "(bad)", { XX } },
7282 { "(bad)", { XX } },
7283 { "(bad)", { XX } },
7284 { "(bad)", { XX } },
7285 { "(bad)", { XX } },
7286 { "(bad)", { XX } },
7287 { "(bad)", { XX } },
7288 { PREFIX_TABLE (PREFIX_VEX_3817) },
7289 /* 18 */
7290 { PREFIX_TABLE (PREFIX_VEX_3818) },
7291 { PREFIX_TABLE (PREFIX_VEX_3819) },
7292 { PREFIX_TABLE (PREFIX_VEX_381A) },
7293 { "(bad)", { XX } },
7294 { PREFIX_TABLE (PREFIX_VEX_381C) },
7295 { PREFIX_TABLE (PREFIX_VEX_381D) },
7296 { PREFIX_TABLE (PREFIX_VEX_381E) },
7297 { "(bad)", { XX } },
7298 /* 20 */
7299 { PREFIX_TABLE (PREFIX_VEX_3820) },
7300 { PREFIX_TABLE (PREFIX_VEX_3821) },
7301 { PREFIX_TABLE (PREFIX_VEX_3822) },
7302 { PREFIX_TABLE (PREFIX_VEX_3823) },
7303 { PREFIX_TABLE (PREFIX_VEX_3824) },
7304 { PREFIX_TABLE (PREFIX_VEX_3825) },
7305 { "(bad)", { XX } },
7306 { "(bad)", { XX } },
7307 /* 28 */
7308 { PREFIX_TABLE (PREFIX_VEX_3828) },
7309 { PREFIX_TABLE (PREFIX_VEX_3829) },
7310 { PREFIX_TABLE (PREFIX_VEX_382A) },
7311 { PREFIX_TABLE (PREFIX_VEX_382B) },
7312 { PREFIX_TABLE (PREFIX_VEX_382C) },
7313 { PREFIX_TABLE (PREFIX_VEX_382D) },
7314 { PREFIX_TABLE (PREFIX_VEX_382E) },
7315 { PREFIX_TABLE (PREFIX_VEX_382F) },
7316 /* 30 */
7317 { PREFIX_TABLE (PREFIX_VEX_3830) },
7318 { PREFIX_TABLE (PREFIX_VEX_3831) },
7319 { PREFIX_TABLE (PREFIX_VEX_3832) },
7320 { PREFIX_TABLE (PREFIX_VEX_3833) },
7321 { PREFIX_TABLE (PREFIX_VEX_3834) },
7322 { PREFIX_TABLE (PREFIX_VEX_3835) },
7323 { "(bad)", { XX } },
7324 { PREFIX_TABLE (PREFIX_VEX_3837) },
7325 /* 38 */
7326 { PREFIX_TABLE (PREFIX_VEX_3838) },
7327 { PREFIX_TABLE (PREFIX_VEX_3839) },
7328 { PREFIX_TABLE (PREFIX_VEX_383A) },
7329 { PREFIX_TABLE (PREFIX_VEX_383B) },
7330 { PREFIX_TABLE (PREFIX_VEX_383C) },
7331 { PREFIX_TABLE (PREFIX_VEX_383D) },
7332 { PREFIX_TABLE (PREFIX_VEX_383E) },
7333 { PREFIX_TABLE (PREFIX_VEX_383F) },
7334 /* 40 */
7335 { PREFIX_TABLE (PREFIX_VEX_3840) },
7336 { PREFIX_TABLE (PREFIX_VEX_3841) },
7337 { "(bad)", { XX } },
7338 { "(bad)", { XX } },
7339 { "(bad)", { XX } },
7340 { "(bad)", { XX } },
7341 { "(bad)", { XX } },
7342 { "(bad)", { XX } },
7343 /* 48 */
7344 { "(bad)", { XX } },
7345 { "(bad)", { XX } },
7346 { "(bad)", { XX } },
7347 { "(bad)", { XX } },
7348 { "(bad)", { XX } },
7349 { "(bad)", { XX } },
7350 { "(bad)", { XX } },
7351 { "(bad)", { XX } },
7352 /* 50 */
7353 { "(bad)", { XX } },
7354 { "(bad)", { XX } },
7355 { "(bad)", { XX } },
7356 { "(bad)", { XX } },
7357 { "(bad)", { XX } },
7358 { "(bad)", { XX } },
7359 { "(bad)", { XX } },
7360 { "(bad)", { XX } },
7361 /* 58 */
7362 { "(bad)", { XX } },
7363 { "(bad)", { XX } },
7364 { "(bad)", { XX } },
7365 { "(bad)", { XX } },
7366 { "(bad)", { XX } },
7367 { "(bad)", { XX } },
7368 { "(bad)", { XX } },
7369 { "(bad)", { XX } },
7370 /* 60 */
7371 { "(bad)", { XX } },
7372 { "(bad)", { XX } },
7373 { "(bad)", { XX } },
7374 { "(bad)", { XX } },
7375 { "(bad)", { XX } },
7376 { "(bad)", { XX } },
7377 { "(bad)", { XX } },
7378 { "(bad)", { XX } },
7379 /* 68 */
7380 { "(bad)", { XX } },
7381 { "(bad)", { XX } },
7382 { "(bad)", { XX } },
7383 { "(bad)", { XX } },
7384 { "(bad)", { XX } },
7385 { "(bad)", { XX } },
7386 { "(bad)", { XX } },
7387 { "(bad)", { XX } },
7388 /* 70 */
7389 { "(bad)", { XX } },
7390 { "(bad)", { XX } },
7391 { "(bad)", { XX } },
7392 { "(bad)", { XX } },
7393 { "(bad)", { XX } },
7394 { "(bad)", { XX } },
7395 { "(bad)", { XX } },
7396 { "(bad)", { XX } },
7397 /* 78 */
7398 { "(bad)", { XX } },
7399 { "(bad)", { XX } },
7400 { "(bad)", { XX } },
7401 { "(bad)", { XX } },
7402 { "(bad)", { XX } },
7403 { "(bad)", { XX } },
7404 { "(bad)", { XX } },
7405 { "(bad)", { XX } },
7406 /* 80 */
7407 { "(bad)", { XX } },
7408 { "(bad)", { XX } },
7409 { "(bad)", { XX } },
7410 { "(bad)", { XX } },
7411 { "(bad)", { XX } },
7412 { "(bad)", { XX } },
7413 { "(bad)", { XX } },
7414 { "(bad)", { XX } },
7415 /* 88 */
7416 { "(bad)", { XX } },
7417 { "(bad)", { XX } },
7418 { "(bad)", { XX } },
7419 { "(bad)", { XX } },
7420 { "(bad)", { XX } },
7421 { "(bad)", { XX } },
7422 { "(bad)", { XX } },
7423 { "(bad)", { XX } },
7424 /* 90 */
7425 { "(bad)", { XX } },
7426 { "(bad)", { XX } },
7427 { "(bad)", { XX } },
7428 { "(bad)", { XX } },
7429 { "(bad)", { XX } },
7430 { "(bad)", { XX } },
7431 { PREFIX_TABLE (PREFIX_VEX_3896) },
7432 { PREFIX_TABLE (PREFIX_VEX_3897) },
7433 /* 98 */
7434 { PREFIX_TABLE (PREFIX_VEX_3898) },
7435 { PREFIX_TABLE (PREFIX_VEX_3899) },
7436 { PREFIX_TABLE (PREFIX_VEX_389A) },
7437 { PREFIX_TABLE (PREFIX_VEX_389B) },
7438 { PREFIX_TABLE (PREFIX_VEX_389C) },
7439 { PREFIX_TABLE (PREFIX_VEX_389D) },
7440 { PREFIX_TABLE (PREFIX_VEX_389E) },
7441 { PREFIX_TABLE (PREFIX_VEX_389F) },
7442 /* a0 */
7443 { "(bad)", { XX } },
7444 { "(bad)", { XX } },
7445 { "(bad)", { XX } },
7446 { "(bad)", { XX } },
7447 { "(bad)", { XX } },
7448 { "(bad)", { XX } },
7449 { PREFIX_TABLE (PREFIX_VEX_38A6) },
7450 { PREFIX_TABLE (PREFIX_VEX_38A7) },
7451 /* a8 */
7452 { PREFIX_TABLE (PREFIX_VEX_38A8) },
7453 { PREFIX_TABLE (PREFIX_VEX_38A9) },
7454 { PREFIX_TABLE (PREFIX_VEX_38AA) },
7455 { PREFIX_TABLE (PREFIX_VEX_38AB) },
7456 { PREFIX_TABLE (PREFIX_VEX_38AC) },
7457 { PREFIX_TABLE (PREFIX_VEX_38AD) },
7458 { PREFIX_TABLE (PREFIX_VEX_38AE) },
7459 { PREFIX_TABLE (PREFIX_VEX_38AF) },
7460 /* b0 */
7461 { "(bad)", { XX } },
7462 { "(bad)", { XX } },
7463 { "(bad)", { XX } },
7464 { "(bad)", { XX } },
7465 { "(bad)", { XX } },
7466 { "(bad)", { XX } },
7467 { PREFIX_TABLE (PREFIX_VEX_38B6) },
7468 { PREFIX_TABLE (PREFIX_VEX_38B7) },
7469 /* b8 */
7470 { PREFIX_TABLE (PREFIX_VEX_38B8) },
7471 { PREFIX_TABLE (PREFIX_VEX_38B9) },
7472 { PREFIX_TABLE (PREFIX_VEX_38BA) },
7473 { PREFIX_TABLE (PREFIX_VEX_38BB) },
7474 { PREFIX_TABLE (PREFIX_VEX_38BC) },
7475 { PREFIX_TABLE (PREFIX_VEX_38BD) },
7476 { PREFIX_TABLE (PREFIX_VEX_38BE) },
7477 { PREFIX_TABLE (PREFIX_VEX_38BF) },
7478 /* c0 */
7479 { "(bad)", { XX } },
7480 { "(bad)", { XX } },
7481 { "(bad)", { XX } },
7482 { "(bad)", { XX } },
7483 { "(bad)", { XX } },
7484 { "(bad)", { XX } },
7485 { "(bad)", { XX } },
7486 { "(bad)", { XX } },
7487 /* c8 */
7488 { "(bad)", { XX } },
7489 { "(bad)", { XX } },
7490 { "(bad)", { XX } },
7491 { "(bad)", { XX } },
7492 { "(bad)", { XX } },
7493 { "(bad)", { XX } },
7494 { "(bad)", { XX } },
7495 { "(bad)", { XX } },
7496 /* d0 */
7497 { "(bad)", { XX } },
7498 { "(bad)", { XX } },
7499 { "(bad)", { XX } },
7500 { "(bad)", { XX } },
7501 { "(bad)", { XX } },
7502 { "(bad)", { XX } },
7503 { "(bad)", { XX } },
7504 { "(bad)", { XX } },
7505 /* d8 */
7506 { "(bad)", { XX } },
7507 { "(bad)", { XX } },
7508 { "(bad)", { XX } },
7509 { PREFIX_TABLE (PREFIX_VEX_38DB) },
7510 { PREFIX_TABLE (PREFIX_VEX_38DC) },
7511 { PREFIX_TABLE (PREFIX_VEX_38DD) },
7512 { PREFIX_TABLE (PREFIX_VEX_38DE) },
7513 { PREFIX_TABLE (PREFIX_VEX_38DF) },
7514 /* e0 */
7515 { "(bad)", { XX } },
7516 { "(bad)", { XX } },
7517 { "(bad)", { XX } },
7518 { "(bad)", { XX } },
7519 { "(bad)", { XX } },
7520 { "(bad)", { XX } },
7521 { "(bad)", { XX } },
7522 { "(bad)", { XX } },
7523 /* e8 */
7524 { "(bad)", { XX } },
7525 { "(bad)", { XX } },
7526 { "(bad)", { XX } },
7527 { "(bad)", { XX } },
7528 { "(bad)", { XX } },
7529 { "(bad)", { XX } },
7530 { "(bad)", { XX } },
7531 { "(bad)", { XX } },
7532 /* f0 */
7533 { "(bad)", { XX } },
7534 { "(bad)", { XX } },
7535 { "(bad)", { XX } },
7536 { "(bad)", { XX } },
7537 { "(bad)", { XX } },
7538 { "(bad)", { XX } },
7539 { "(bad)", { XX } },
7540 { "(bad)", { XX } },
7541 /* f8 */
7542 { "(bad)", { XX } },
7543 { "(bad)", { XX } },
7544 { "(bad)", { XX } },
7545 { "(bad)", { XX } },
7546 { "(bad)", { XX } },
7547 { "(bad)", { XX } },
7548 { "(bad)", { XX } },
7549 { "(bad)", { XX } },
7550 },
7551 /* VEX_0F3A */
7552 {
7553 /* 00 */
7554 { "(bad)", { XX } },
7555 { "(bad)", { XX } },
7556 { "(bad)", { XX } },
7557 { "(bad)", { XX } },
7558 { PREFIX_TABLE (PREFIX_VEX_3A04) },
7559 { PREFIX_TABLE (PREFIX_VEX_3A05) },
7560 { PREFIX_TABLE (PREFIX_VEX_3A06) },
7561 { "(bad)", { XX } },
7562 /* 08 */
7563 { PREFIX_TABLE (PREFIX_VEX_3A08) },
7564 { PREFIX_TABLE (PREFIX_VEX_3A09) },
7565 { PREFIX_TABLE (PREFIX_VEX_3A0A) },
7566 { PREFIX_TABLE (PREFIX_VEX_3A0B) },
7567 { PREFIX_TABLE (PREFIX_VEX_3A0C) },
7568 { PREFIX_TABLE (PREFIX_VEX_3A0D) },
7569 { PREFIX_TABLE (PREFIX_VEX_3A0E) },
7570 { PREFIX_TABLE (PREFIX_VEX_3A0F) },
7571 /* 10 */
7572 { "(bad)", { XX } },
7573 { "(bad)", { XX } },
7574 { "(bad)", { XX } },
7575 { "(bad)", { XX } },
7576 { PREFIX_TABLE (PREFIX_VEX_3A14) },
7577 { PREFIX_TABLE (PREFIX_VEX_3A15) },
7578 { PREFIX_TABLE (PREFIX_VEX_3A16) },
7579 { PREFIX_TABLE (PREFIX_VEX_3A17) },
7580 /* 18 */
7581 { PREFIX_TABLE (PREFIX_VEX_3A18) },
7582 { PREFIX_TABLE (PREFIX_VEX_3A19) },
7583 { "(bad)", { XX } },
7584 { "(bad)", { XX } },
7585 { "(bad)", { XX } },
7586 { "(bad)", { XX } },
7587 { "(bad)", { XX } },
7588 { "(bad)", { XX } },
7589 /* 20 */
7590 { PREFIX_TABLE (PREFIX_VEX_3A20) },
7591 { PREFIX_TABLE (PREFIX_VEX_3A21) },
7592 { PREFIX_TABLE (PREFIX_VEX_3A22) },
7593 { "(bad)", { XX } },
7594 { "(bad)", { XX } },
7595 { "(bad)", { XX } },
7596 { "(bad)", { XX } },
7597 { "(bad)", { XX } },
7598 /* 28 */
7599 { "(bad)", { XX } },
7600 { "(bad)", { XX } },
7601 { "(bad)", { XX } },
7602 { "(bad)", { XX } },
7603 { "(bad)", { XX } },
7604 { "(bad)", { XX } },
7605 { "(bad)", { XX } },
7606 { "(bad)", { XX } },
7607 /* 30 */
7608 { "(bad)", { XX } },
7609 { "(bad)", { XX } },
7610 { "(bad)", { XX } },
7611 { "(bad)", { XX } },
7612 { "(bad)", { XX } },
7613 { "(bad)", { XX } },
7614 { "(bad)", { XX } },
7615 { "(bad)", { XX } },
7616 /* 38 */
7617 { "(bad)", { XX } },
7618 { "(bad)", { XX } },
7619 { "(bad)", { XX } },
7620 { "(bad)", { XX } },
7621 { "(bad)", { XX } },
7622 { "(bad)", { XX } },
7623 { "(bad)", { XX } },
7624 { "(bad)", { XX } },
7625 /* 40 */
7626 { PREFIX_TABLE (PREFIX_VEX_3A40) },
7627 { PREFIX_TABLE (PREFIX_VEX_3A41) },
7628 { PREFIX_TABLE (PREFIX_VEX_3A42) },
7629 { "(bad)", { XX } },
7630 { PREFIX_TABLE (PREFIX_VEX_3A44) },
7631 { "(bad)", { XX } },
7632 { "(bad)", { XX } },
7633 { "(bad)", { XX } },
7634 /* 48 */
7635 { "(bad)", { XX } },
7636 { "(bad)", { XX } },
7637 { PREFIX_TABLE (PREFIX_VEX_3A4A) },
7638 { PREFIX_TABLE (PREFIX_VEX_3A4B) },
7639 { PREFIX_TABLE (PREFIX_VEX_3A4C) },
7640 { "(bad)", { XX } },
7641 { "(bad)", { XX } },
7642 { "(bad)", { XX } },
7643 /* 50 */
7644 { "(bad)", { XX } },
7645 { "(bad)", { XX } },
7646 { "(bad)", { XX } },
7647 { "(bad)", { XX } },
7648 { "(bad)", { XX } },
7649 { "(bad)", { XX } },
7650 { "(bad)", { XX } },
7651 { "(bad)", { XX } },
7652 /* 58 */
7653 { "(bad)", { XX } },
7654 { "(bad)", { XX } },
7655 { "(bad)", { XX } },
7656 { "(bad)", { XX } },
7657 { PREFIX_TABLE (PREFIX_VEX_3A5C) },
7658 { PREFIX_TABLE (PREFIX_VEX_3A5D) },
7659 { PREFIX_TABLE (PREFIX_VEX_3A5E) },
7660 { PREFIX_TABLE (PREFIX_VEX_3A5F) },
7661 /* 60 */
7662 { PREFIX_TABLE (PREFIX_VEX_3A60) },
7663 { PREFIX_TABLE (PREFIX_VEX_3A61) },
7664 { PREFIX_TABLE (PREFIX_VEX_3A62) },
7665 { PREFIX_TABLE (PREFIX_VEX_3A63) },
7666 { "(bad)", { XX } },
7667 { "(bad)", { XX } },
7668 { "(bad)", { XX } },
7669 { "(bad)", { XX } },
7670 /* 68 */
7671 { PREFIX_TABLE (PREFIX_VEX_3A68) },
7672 { PREFIX_TABLE (PREFIX_VEX_3A69) },
7673 { PREFIX_TABLE (PREFIX_VEX_3A6A) },
7674 { PREFIX_TABLE (PREFIX_VEX_3A6B) },
7675 { PREFIX_TABLE (PREFIX_VEX_3A6C) },
7676 { PREFIX_TABLE (PREFIX_VEX_3A6D) },
7677 { PREFIX_TABLE (PREFIX_VEX_3A6E) },
7678 { PREFIX_TABLE (PREFIX_VEX_3A6F) },
7679 /* 70 */
7680 { "(bad)", { XX } },
7681 { "(bad)", { XX } },
7682 { "(bad)", { XX } },
7683 { "(bad)", { XX } },
7684 { "(bad)", { XX } },
7685 { "(bad)", { XX } },
7686 { "(bad)", { XX } },
7687 { "(bad)", { XX } },
7688 /* 78 */
7689 { PREFIX_TABLE (PREFIX_VEX_3A78) },
7690 { PREFIX_TABLE (PREFIX_VEX_3A79) },
7691 { PREFIX_TABLE (PREFIX_VEX_3A7A) },
7692 { PREFIX_TABLE (PREFIX_VEX_3A7B) },
7693 { PREFIX_TABLE (PREFIX_VEX_3A7C) },
7694 { PREFIX_TABLE (PREFIX_VEX_3A7D) },
7695 { PREFIX_TABLE (PREFIX_VEX_3A7E) },
7696 { PREFIX_TABLE (PREFIX_VEX_3A7F) },
7697 /* 80 */
7698 { "(bad)", { XX } },
7699 { "(bad)", { XX } },
7700 { "(bad)", { XX } },
7701 { "(bad)", { XX } },
7702 { "(bad)", { XX } },
7703 { "(bad)", { XX } },
7704 { "(bad)", { XX } },
7705 { "(bad)", { XX } },
7706 /* 88 */
7707 { "(bad)", { XX } },
7708 { "(bad)", { XX } },
7709 { "(bad)", { XX } },
7710 { "(bad)", { XX } },
7711 { "(bad)", { XX } },
7712 { "(bad)", { XX } },
7713 { "(bad)", { XX } },
7714 { "(bad)", { XX } },
7715 /* 90 */
7716 { "(bad)", { XX } },
7717 { "(bad)", { XX } },
7718 { "(bad)", { XX } },
7719 { "(bad)", { XX } },
7720 { "(bad)", { XX } },
7721 { "(bad)", { XX } },
7722 { "(bad)", { XX } },
7723 { "(bad)", { XX } },
7724 /* 98 */
7725 { "(bad)", { XX } },
7726 { "(bad)", { XX } },
7727 { "(bad)", { XX } },
7728 { "(bad)", { XX } },
7729 { "(bad)", { XX } },
7730 { "(bad)", { XX } },
7731 { "(bad)", { XX } },
7732 { "(bad)", { XX } },
7733 /* a0 */
7734 { "(bad)", { XX } },
7735 { "(bad)", { XX } },
7736 { "(bad)", { XX } },
7737 { "(bad)", { XX } },
7738 { "(bad)", { XX } },
7739 { "(bad)", { XX } },
7740 { "(bad)", { XX } },
7741 { "(bad)", { XX } },
7742 /* a8 */
7743 { "(bad)", { XX } },
7744 { "(bad)", { XX } },
7745 { "(bad)", { XX } },
7746 { "(bad)", { XX } },
7747 { "(bad)", { XX } },
7748 { "(bad)", { XX } },
7749 { "(bad)", { XX } },
7750 { "(bad)", { XX } },
7751 /* b0 */
7752 { "(bad)", { XX } },
7753 { "(bad)", { XX } },
7754 { "(bad)", { XX } },
7755 { "(bad)", { XX } },
7756 { "(bad)", { XX } },
7757 { "(bad)", { XX } },
7758 { "(bad)", { XX } },
7759 { "(bad)", { XX } },
7760 /* b8 */
7761 { "(bad)", { XX } },
7762 { "(bad)", { XX } },
7763 { "(bad)", { XX } },
7764 { "(bad)", { XX } },
7765 { "(bad)", { XX } },
7766 { "(bad)", { XX } },
7767 { "(bad)", { XX } },
7768 { "(bad)", { XX } },
7769 /* c0 */
7770 { "(bad)", { XX } },
7771 { "(bad)", { XX } },
7772 { "(bad)", { XX } },
7773 { "(bad)", { XX } },
7774 { "(bad)", { XX } },
7775 { "(bad)", { XX } },
7776 { "(bad)", { XX } },
7777 { "(bad)", { XX } },
7778 /* c8 */
7779 { "(bad)", { XX } },
7780 { "(bad)", { XX } },
7781 { "(bad)", { XX } },
7782 { "(bad)", { XX } },
7783 { "(bad)", { XX } },
7784 { "(bad)", { XX } },
7785 { "(bad)", { XX } },
7786 { "(bad)", { XX } },
7787 /* d0 */
7788 { "(bad)", { XX } },
7789 { "(bad)", { XX } },
7790 { "(bad)", { XX } },
7791 { "(bad)", { XX } },
7792 { "(bad)", { XX } },
7793 { "(bad)", { XX } },
7794 { "(bad)", { XX } },
7795 { "(bad)", { XX } },
7796 /* d8 */
7797 { "(bad)", { XX } },
7798 { "(bad)", { XX } },
7799 { "(bad)", { XX } },
7800 { "(bad)", { XX } },
7801 { "(bad)", { XX } },
7802 { "(bad)", { XX } },
7803 { "(bad)", { XX } },
7804 { PREFIX_TABLE (PREFIX_VEX_3ADF) },
7805 /* e0 */
7806 { "(bad)", { XX } },
7807 { "(bad)", { XX } },
7808 { "(bad)", { XX } },
7809 { "(bad)", { XX } },
7810 { "(bad)", { XX } },
7811 { "(bad)", { XX } },
7812 { "(bad)", { XX } },
7813 { "(bad)", { XX } },
7814 /* e8 */
7815 { "(bad)", { XX } },
7816 { "(bad)", { XX } },
7817 { "(bad)", { XX } },
7818 { "(bad)", { XX } },
7819 { "(bad)", { XX } },
7820 { "(bad)", { XX } },
7821 { "(bad)", { XX } },
7822 { "(bad)", { XX } },
7823 /* f0 */
7824 { "(bad)", { XX } },
7825 { "(bad)", { XX } },
7826 { "(bad)", { XX } },
7827 { "(bad)", { XX } },
7828 { "(bad)", { XX } },
7829 { "(bad)", { XX } },
7830 { "(bad)", { XX } },
7831 { "(bad)", { XX } },
7832 /* f8 */
7833 { "(bad)", { XX } },
7834 { "(bad)", { XX } },
7835 { "(bad)", { XX } },
7836 { "(bad)", { XX } },
7837 { "(bad)", { XX } },
7838 { "(bad)", { XX } },
7839 { "(bad)", { XX } },
7840 { "(bad)", { XX } },
7841 },
7842 };
7843
7844 static const struct dis386 vex_len_table[][2] = {
7845 /* VEX_LEN_10_P_1 */
7846 {
7847 { "vmovss", { XMVex, Vex128, EXd } },
7848 { "(bad)", { XX } },
7849 },
7850
7851 /* VEX_LEN_10_P_3 */
7852 {
7853 { "vmovsd", { XMVex, Vex128, EXq } },
7854 { "(bad)", { XX } },
7855 },
7856
7857 /* VEX_LEN_11_P_1 */
7858 {
7859 { "vmovss", { EXdVexS, Vex128, XM } },
7860 { "(bad)", { XX } },
7861 },
7862
7863 /* VEX_LEN_11_P_3 */
7864 {
7865 { "vmovsd", { EXqVexS, Vex128, XM } },
7866 { "(bad)", { XX } },
7867 },
7868
7869 /* VEX_LEN_12_P_0_M_0 */
7870 {
7871 { "vmovlps", { XM, Vex128, EXq } },
7872 { "(bad)", { XX } },
7873 },
7874
7875 /* VEX_LEN_12_P_0_M_1 */
7876 {
7877 { "vmovhlps", { XM, Vex128, EXq } },
7878 { "(bad)", { XX } },
7879 },
7880
7881 /* VEX_LEN_12_P_2 */
7882 {
7883 { "vmovlpd", { XM, Vex128, EXq } },
7884 { "(bad)", { XX } },
7885 },
7886
7887 /* VEX_LEN_13_M_0 */
7888 {
7889 { "vmovlpX", { EXq, XM } },
7890 { "(bad)", { XX } },
7891 },
7892
7893 /* VEX_LEN_16_P_0_M_0 */
7894 {
7895 { "vmovhps", { XM, Vex128, EXq } },
7896 { "(bad)", { XX } },
7897 },
7898
7899 /* VEX_LEN_16_P_0_M_1 */
7900 {
7901 { "vmovlhps", { XM, Vex128, EXq } },
7902 { "(bad)", { XX } },
7903 },
7904
7905 /* VEX_LEN_16_P_2 */
7906 {
7907 { "vmovhpd", { XM, Vex128, EXq } },
7908 { "(bad)", { XX } },
7909 },
7910
7911 /* VEX_LEN_17_M_0 */
7912 {
7913 { "vmovhpX", { EXq, XM } },
7914 { "(bad)", { XX } },
7915 },
7916
7917 /* VEX_LEN_2A_P_1 */
7918 {
7919 { "vcvtsi2ss%LQ", { XM, Vex128, Ev } },
7920 { "(bad)", { XX } },
7921 },
7922
7923 /* VEX_LEN_2A_P_3 */
7924 {
7925 { "vcvtsi2sd%LQ", { XM, Vex128, Ev } },
7926 { "(bad)", { XX } },
7927 },
7928
7929 /* VEX_LEN_2C_P_1 */
7930 {
7931 { "vcvttss2siY", { Gv, EXd } },
7932 { "(bad)", { XX } },
7933 },
7934
7935 /* VEX_LEN_2C_P_3 */
7936 {
7937 { "vcvttsd2siY", { Gv, EXq } },
7938 { "(bad)", { XX } },
7939 },
7940
7941 /* VEX_LEN_2D_P_1 */
7942 {
7943 { "vcvtss2siY", { Gv, EXd } },
7944 { "(bad)", { XX } },
7945 },
7946
7947 /* VEX_LEN_2D_P_3 */
7948 {
7949 { "vcvtsd2siY", { Gv, EXq } },
7950 { "(bad)", { XX } },
7951 },
7952
7953 /* VEX_LEN_2E_P_0 */
7954 {
7955 { "vucomiss", { XM, EXd } },
7956 { "(bad)", { XX } },
7957 },
7958
7959 /* VEX_LEN_2E_P_2 */
7960 {
7961 { "vucomisd", { XM, EXq } },
7962 { "(bad)", { XX } },
7963 },
7964
7965 /* VEX_LEN_2F_P_0 */
7966 {
7967 { "vcomiss", { XM, EXd } },
7968 { "(bad)", { XX } },
7969 },
7970
7971 /* VEX_LEN_2F_P_2 */
7972 {
7973 { "vcomisd", { XM, EXq } },
7974 { "(bad)", { XX } },
7975 },
7976
7977 /* VEX_LEN_51_P_1 */
7978 {
7979 { "vsqrtss", { XM, Vex128, EXd } },
7980 { "(bad)", { XX } },
7981 },
7982
7983 /* VEX_LEN_51_P_3 */
7984 {
7985 { "vsqrtsd", { XM, Vex128, EXq } },
7986 { "(bad)", { XX } },
7987 },
7988
7989 /* VEX_LEN_52_P_1 */
7990 {
7991 { "vrsqrtss", { XM, Vex128, EXd } },
7992 { "(bad)", { XX } },
7993 },
7994
7995 /* VEX_LEN_53_P_1 */
7996 {
7997 { "vrcpss", { XM, Vex128, EXd } },
7998 { "(bad)", { XX } },
7999 },
8000
8001 /* VEX_LEN_58_P_1 */
8002 {
8003 { "vaddss", { XM, Vex128, EXd } },
8004 { "(bad)", { XX } },
8005 },
8006
8007 /* VEX_LEN_58_P_3 */
8008 {
8009 { "vaddsd", { XM, Vex128, EXq } },
8010 { "(bad)", { XX } },
8011 },
8012
8013 /* VEX_LEN_59_P_1 */
8014 {
8015 { "vmulss", { XM, Vex128, EXd } },
8016 { "(bad)", { XX } },
8017 },
8018
8019 /* VEX_LEN_59_P_3 */
8020 {
8021 { "vmulsd", { XM, Vex128, EXq } },
8022 { "(bad)", { XX } },
8023 },
8024
8025 /* VEX_LEN_5A_P_1 */
8026 {
8027 { "vcvtss2sd", { XM, Vex128, EXd } },
8028 { "(bad)", { XX } },
8029 },
8030
8031 /* VEX_LEN_5A_P_3 */
8032 {
8033 { "vcvtsd2ss", { XM, Vex128, EXq } },
8034 { "(bad)", { XX } },
8035 },
8036
8037 /* VEX_LEN_5C_P_1 */
8038 {
8039 { "vsubss", { XM, Vex128, EXd } },
8040 { "(bad)", { XX } },
8041 },
8042
8043 /* VEX_LEN_5C_P_3 */
8044 {
8045 { "vsubsd", { XM, Vex128, EXq } },
8046 { "(bad)", { XX } },
8047 },
8048
8049 /* VEX_LEN_5D_P_1 */
8050 {
8051 { "vminss", { XM, Vex128, EXd } },
8052 { "(bad)", { XX } },
8053 },
8054
8055 /* VEX_LEN_5D_P_3 */
8056 {
8057 { "vminsd", { XM, Vex128, EXq } },
8058 { "(bad)", { XX } },
8059 },
8060
8061 /* VEX_LEN_5E_P_1 */
8062 {
8063 { "vdivss", { XM, Vex128, EXd } },
8064 { "(bad)", { XX } },
8065 },
8066
8067 /* VEX_LEN_5E_P_3 */
8068 {
8069 { "vdivsd", { XM, Vex128, EXq } },
8070 { "(bad)", { XX } },
8071 },
8072
8073 /* VEX_LEN_5F_P_1 */
8074 {
8075 { "vmaxss", { XM, Vex128, EXd } },
8076 { "(bad)", { XX } },
8077 },
8078
8079 /* VEX_LEN_5F_P_3 */
8080 {
8081 { "vmaxsd", { XM, Vex128, EXq } },
8082 { "(bad)", { XX } },
8083 },
8084
8085 /* VEX_LEN_60_P_2 */
8086 {
8087 { "vpunpcklbw", { XM, Vex128, EXx } },
8088 { "(bad)", { XX } },
8089 },
8090
8091 /* VEX_LEN_61_P_2 */
8092 {
8093 { "vpunpcklwd", { XM, Vex128, EXx } },
8094 { "(bad)", { XX } },
8095 },
8096
8097 /* VEX_LEN_62_P_2 */
8098 {
8099 { "vpunpckldq", { XM, Vex128, EXx } },
8100 { "(bad)", { XX } },
8101 },
8102
8103 /* VEX_LEN_63_P_2 */
8104 {
8105 { "vpacksswb", { XM, Vex128, EXx } },
8106 { "(bad)", { XX } },
8107 },
8108
8109 /* VEX_LEN_64_P_2 */
8110 {
8111 { "vpcmpgtb", { XM, Vex128, EXx } },
8112 { "(bad)", { XX } },
8113 },
8114
8115 /* VEX_LEN_65_P_2 */
8116 {
8117 { "vpcmpgtw", { XM, Vex128, EXx } },
8118 { "(bad)", { XX } },
8119 },
8120
8121 /* VEX_LEN_66_P_2 */
8122 {
8123 { "vpcmpgtd", { XM, Vex128, EXx } },
8124 { "(bad)", { XX } },
8125 },
8126
8127 /* VEX_LEN_67_P_2 */
8128 {
8129 { "vpackuswb", { XM, Vex128, EXx } },
8130 { "(bad)", { XX } },
8131 },
8132
8133 /* VEX_LEN_68_P_2 */
8134 {
8135 { "vpunpckhbw", { XM, Vex128, EXx } },
8136 { "(bad)", { XX } },
8137 },
8138
8139 /* VEX_LEN_69_P_2 */
8140 {
8141 { "vpunpckhwd", { XM, Vex128, EXx } },
8142 { "(bad)", { XX } },
8143 },
8144
8145 /* VEX_LEN_6A_P_2 */
8146 {
8147 { "vpunpckhdq", { XM, Vex128, EXx } },
8148 { "(bad)", { XX } },
8149 },
8150
8151 /* VEX_LEN_6B_P_2 */
8152 {
8153 { "vpackssdw", { XM, Vex128, EXx } },
8154 { "(bad)", { XX } },
8155 },
8156
8157 /* VEX_LEN_6C_P_2 */
8158 {
8159 { "vpunpcklqdq", { XM, Vex128, EXx } },
8160 { "(bad)", { XX } },
8161 },
8162
8163 /* VEX_LEN_6D_P_2 */
8164 {
8165 { "vpunpckhqdq", { XM, Vex128, EXx } },
8166 { "(bad)", { XX } },
8167 },
8168
8169 /* VEX_LEN_6E_P_2 */
8170 {
8171 { "vmovK", { XM, Edq } },
8172 { "(bad)", { XX } },
8173 },
8174
8175 /* VEX_LEN_70_P_1 */
8176 {
8177 { "vpshufhw", { XM, EXx, Ib } },
8178 { "(bad)", { XX } },
8179 },
8180
8181 /* VEX_LEN_70_P_2 */
8182 {
8183 { "vpshufd", { XM, EXx, Ib } },
8184 { "(bad)", { XX } },
8185 },
8186
8187 /* VEX_LEN_70_P_3 */
8188 {
8189 { "vpshuflw", { XM, EXx, Ib } },
8190 { "(bad)", { XX } },
8191 },
8192
8193 /* VEX_LEN_71_R_2_P_2 */
8194 {
8195 { "vpsrlw", { Vex128, XS, Ib } },
8196 { "(bad)", { XX } },
8197 },
8198
8199 /* VEX_LEN_71_R_4_P_2 */
8200 {
8201 { "vpsraw", { Vex128, XS, Ib } },
8202 { "(bad)", { XX } },
8203 },
8204
8205 /* VEX_LEN_71_R_6_P_2 */
8206 {
8207 { "vpsllw", { Vex128, XS, Ib } },
8208 { "(bad)", { XX } },
8209 },
8210
8211 /* VEX_LEN_72_R_2_P_2 */
8212 {
8213 { "vpsrld", { Vex128, XS, Ib } },
8214 { "(bad)", { XX } },
8215 },
8216
8217 /* VEX_LEN_72_R_4_P_2 */
8218 {
8219 { "vpsrad", { Vex128, XS, Ib } },
8220 { "(bad)", { XX } },
8221 },
8222
8223 /* VEX_LEN_72_R_6_P_2 */
8224 {
8225 { "vpslld", { Vex128, XS, Ib } },
8226 { "(bad)", { XX } },
8227 },
8228
8229 /* VEX_LEN_73_R_2_P_2 */
8230 {
8231 { "vpsrlq", { Vex128, XS, Ib } },
8232 { "(bad)", { XX } },
8233 },
8234
8235 /* VEX_LEN_73_R_3_P_2 */
8236 {
8237 { "vpsrldq", { Vex128, XS, Ib } },
8238 { "(bad)", { XX } },
8239 },
8240
8241 /* VEX_LEN_73_R_6_P_2 */
8242 {
8243 { "vpsllq", { Vex128, XS, Ib } },
8244 { "(bad)", { XX } },
8245 },
8246
8247 /* VEX_LEN_73_R_7_P_2 */
8248 {
8249 { "vpslldq", { Vex128, XS, Ib } },
8250 { "(bad)", { XX } },
8251 },
8252
8253 /* VEX_LEN_74_P_2 */
8254 {
8255 { "vpcmpeqb", { XM, Vex128, EXx } },
8256 { "(bad)", { XX } },
8257 },
8258
8259 /* VEX_LEN_75_P_2 */
8260 {
8261 { "vpcmpeqw", { XM, Vex128, EXx } },
8262 { "(bad)", { XX } },
8263 },
8264
8265 /* VEX_LEN_76_P_2 */
8266 {
8267 { "vpcmpeqd", { XM, Vex128, EXx } },
8268 { "(bad)", { XX } },
8269 },
8270
8271 /* VEX_LEN_7E_P_1 */
8272 {
8273 { "vmovq", { XM, EXq } },
8274 { "(bad)", { XX } },
8275 },
8276
8277 /* VEX_LEN_7E_P_2 */
8278 {
8279 { "vmovK", { Edq, XM } },
8280 { "(bad)", { XX } },
8281 },
8282
8283 /* VEX_LEN_AE_R_2_M_0 */
8284 {
8285 { "vldmxcsr", { Md } },
8286 { "(bad)", { XX } },
8287 },
8288
8289 /* VEX_LEN_AE_R_3_M_0 */
8290 {
8291 { "vstmxcsr", { Md } },
8292 { "(bad)", { XX } },
8293 },
8294
8295 /* VEX_LEN_C2_P_1 */
8296 {
8297 { "vcmpss", { XM, Vex128, EXd, VCMP } },
8298 { "(bad)", { XX } },
8299 },
8300
8301 /* VEX_LEN_C2_P_3 */
8302 {
8303 { "vcmpsd", { XM, Vex128, EXq, VCMP } },
8304 { "(bad)", { XX } },
8305 },
8306
8307 /* VEX_LEN_C4_P_2 */
8308 {
8309 { "vpinsrw", { XM, Vex128, Edqw, Ib } },
8310 { "(bad)", { XX } },
8311 },
8312
8313 /* VEX_LEN_C5_P_2 */
8314 {
8315 { "vpextrw", { Gdq, XS, Ib } },
8316 { "(bad)", { XX } },
8317 },
8318
8319 /* VEX_LEN_D1_P_2 */
8320 {
8321 { "vpsrlw", { XM, Vex128, EXx } },
8322 { "(bad)", { XX } },
8323 },
8324
8325 /* VEX_LEN_D2_P_2 */
8326 {
8327 { "vpsrld", { XM, Vex128, EXx } },
8328 { "(bad)", { XX } },
8329 },
8330
8331 /* VEX_LEN_D3_P_2 */
8332 {
8333 { "vpsrlq", { XM, Vex128, EXx } },
8334 { "(bad)", { XX } },
8335 },
8336
8337 /* VEX_LEN_D4_P_2 */
8338 {
8339 { "vpaddq", { XM, Vex128, EXx } },
8340 { "(bad)", { XX } },
8341 },
8342
8343 /* VEX_LEN_D5_P_2 */
8344 {
8345 { "vpmullw", { XM, Vex128, EXx } },
8346 { "(bad)", { XX } },
8347 },
8348
8349 /* VEX_LEN_D6_P_2 */
8350 {
8351 { "vmovq", { EXqS, XM } },
8352 { "(bad)", { XX } },
8353 },
8354
8355 /* VEX_LEN_D7_P_2_M_1 */
8356 {
8357 { "vpmovmskb", { Gdq, XS } },
8358 { "(bad)", { XX } },
8359 },
8360
8361 /* VEX_LEN_D8_P_2 */
8362 {
8363 { "vpsubusb", { XM, Vex128, EXx } },
8364 { "(bad)", { XX } },
8365 },
8366
8367 /* VEX_LEN_D9_P_2 */
8368 {
8369 { "vpsubusw", { XM, Vex128, EXx } },
8370 { "(bad)", { XX } },
8371 },
8372
8373 /* VEX_LEN_DA_P_2 */
8374 {
8375 { "vpminub", { XM, Vex128, EXx } },
8376 { "(bad)", { XX } },
8377 },
8378
8379 /* VEX_LEN_DB_P_2 */
8380 {
8381 { "vpand", { XM, Vex128, EXx } },
8382 { "(bad)", { XX } },
8383 },
8384
8385 /* VEX_LEN_DC_P_2 */
8386 {
8387 { "vpaddusb", { XM, Vex128, EXx } },
8388 { "(bad)", { XX } },
8389 },
8390
8391 /* VEX_LEN_DD_P_2 */
8392 {
8393 { "vpaddusw", { XM, Vex128, EXx } },
8394 { "(bad)", { XX } },
8395 },
8396
8397 /* VEX_LEN_DE_P_2 */
8398 {
8399 { "vpmaxub", { XM, Vex128, EXx } },
8400 { "(bad)", { XX } },
8401 },
8402
8403 /* VEX_LEN_DF_P_2 */
8404 {
8405 { "vpandn", { XM, Vex128, EXx } },
8406 { "(bad)", { XX } },
8407 },
8408
8409 /* VEX_LEN_E0_P_2 */
8410 {
8411 { "vpavgb", { XM, Vex128, EXx } },
8412 { "(bad)", { XX } },
8413 },
8414
8415 /* VEX_LEN_E1_P_2 */
8416 {
8417 { "vpsraw", { XM, Vex128, EXx } },
8418 { "(bad)", { XX } },
8419 },
8420
8421 /* VEX_LEN_E2_P_2 */
8422 {
8423 { "vpsrad", { XM, Vex128, EXx } },
8424 { "(bad)", { XX } },
8425 },
8426
8427 /* VEX_LEN_E3_P_2 */
8428 {
8429 { "vpavgw", { XM, Vex128, EXx } },
8430 { "(bad)", { XX } },
8431 },
8432
8433 /* VEX_LEN_E4_P_2 */
8434 {
8435 { "vpmulhuw", { XM, Vex128, EXx } },
8436 { "(bad)", { XX } },
8437 },
8438
8439 /* VEX_LEN_E5_P_2 */
8440 {
8441 { "vpmulhw", { XM, Vex128, EXx } },
8442 { "(bad)", { XX } },
8443 },
8444
8445 /* VEX_LEN_E8_P_2 */
8446 {
8447 { "vpsubsb", { XM, Vex128, EXx } },
8448 { "(bad)", { XX } },
8449 },
8450
8451 /* VEX_LEN_E9_P_2 */
8452 {
8453 { "vpsubsw", { XM, Vex128, EXx } },
8454 { "(bad)", { XX } },
8455 },
8456
8457 /* VEX_LEN_EA_P_2 */
8458 {
8459 { "vpminsw", { XM, Vex128, EXx } },
8460 { "(bad)", { XX } },
8461 },
8462
8463 /* VEX_LEN_EB_P_2 */
8464 {
8465 { "vpor", { XM, Vex128, EXx } },
8466 { "(bad)", { XX } },
8467 },
8468
8469 /* VEX_LEN_EC_P_2 */
8470 {
8471 { "vpaddsb", { XM, Vex128, EXx } },
8472 { "(bad)", { XX } },
8473 },
8474
8475 /* VEX_LEN_ED_P_2 */
8476 {
8477 { "vpaddsw", { XM, Vex128, EXx } },
8478 { "(bad)", { XX } },
8479 },
8480
8481 /* VEX_LEN_EE_P_2 */
8482 {
8483 { "vpmaxsw", { XM, Vex128, EXx } },
8484 { "(bad)", { XX } },
8485 },
8486
8487 /* VEX_LEN_EF_P_2 */
8488 {
8489 { "vpxor", { XM, Vex128, EXx } },
8490 { "(bad)", { XX } },
8491 },
8492
8493 /* VEX_LEN_F1_P_2 */
8494 {
8495 { "vpsllw", { XM, Vex128, EXx } },
8496 { "(bad)", { XX } },
8497 },
8498
8499 /* VEX_LEN_F2_P_2 */
8500 {
8501 { "vpslld", { XM, Vex128, EXx } },
8502 { "(bad)", { XX } },
8503 },
8504
8505 /* VEX_LEN_F3_P_2 */
8506 {
8507 { "vpsllq", { XM, Vex128, EXx } },
8508 { "(bad)", { XX } },
8509 },
8510
8511 /* VEX_LEN_F4_P_2 */
8512 {
8513 { "vpmuludq", { XM, Vex128, EXx } },
8514 { "(bad)", { XX } },
8515 },
8516
8517 /* VEX_LEN_F5_P_2 */
8518 {
8519 { "vpmaddwd", { XM, Vex128, EXx } },
8520 { "(bad)", { XX } },
8521 },
8522
8523 /* VEX_LEN_F6_P_2 */
8524 {
8525 { "vpsadbw", { XM, Vex128, EXx } },
8526 { "(bad)", { XX } },
8527 },
8528
8529 /* VEX_LEN_F7_P_2 */
8530 {
8531 { "vmaskmovdqu", { XM, XS } },
8532 { "(bad)", { XX } },
8533 },
8534
8535 /* VEX_LEN_F8_P_2 */
8536 {
8537 { "vpsubb", { XM, Vex128, EXx } },
8538 { "(bad)", { XX } },
8539 },
8540
8541 /* VEX_LEN_F9_P_2 */
8542 {
8543 { "vpsubw", { XM, Vex128, EXx } },
8544 { "(bad)", { XX } },
8545 },
8546
8547 /* VEX_LEN_FA_P_2 */
8548 {
8549 { "vpsubd", { XM, Vex128, EXx } },
8550 { "(bad)", { XX } },
8551 },
8552
8553 /* VEX_LEN_FB_P_2 */
8554 {
8555 { "vpsubq", { XM, Vex128, EXx } },
8556 { "(bad)", { XX } },
8557 },
8558
8559 /* VEX_LEN_FC_P_2 */
8560 {
8561 { "vpaddb", { XM, Vex128, EXx } },
8562 { "(bad)", { XX } },
8563 },
8564
8565 /* VEX_LEN_FD_P_2 */
8566 {
8567 { "vpaddw", { XM, Vex128, EXx } },
8568 { "(bad)", { XX } },
8569 },
8570
8571 /* VEX_LEN_FE_P_2 */
8572 {
8573 { "vpaddd", { XM, Vex128, EXx } },
8574 { "(bad)", { XX } },
8575 },
8576
8577 /* VEX_LEN_3800_P_2 */
8578 {
8579 { "vpshufb", { XM, Vex128, EXx } },
8580 { "(bad)", { XX } },
8581 },
8582
8583 /* VEX_LEN_3801_P_2 */
8584 {
8585 { "vphaddw", { XM, Vex128, EXx } },
8586 { "(bad)", { XX } },
8587 },
8588
8589 /* VEX_LEN_3802_P_2 */
8590 {
8591 { "vphaddd", { XM, Vex128, EXx } },
8592 { "(bad)", { XX } },
8593 },
8594
8595 /* VEX_LEN_3803_P_2 */
8596 {
8597 { "vphaddsw", { XM, Vex128, EXx } },
8598 { "(bad)", { XX } },
8599 },
8600
8601 /* VEX_LEN_3804_P_2 */
8602 {
8603 { "vpmaddubsw", { XM, Vex128, EXx } },
8604 { "(bad)", { XX } },
8605 },
8606
8607 /* VEX_LEN_3805_P_2 */
8608 {
8609 { "vphsubw", { XM, Vex128, EXx } },
8610 { "(bad)", { XX } },
8611 },
8612
8613 /* VEX_LEN_3806_P_2 */
8614 {
8615 { "vphsubd", { XM, Vex128, EXx } },
8616 { "(bad)", { XX } },
8617 },
8618
8619 /* VEX_LEN_3807_P_2 */
8620 {
8621 { "vphsubsw", { XM, Vex128, EXx } },
8622 { "(bad)", { XX } },
8623 },
8624
8625 /* VEX_LEN_3808_P_2 */
8626 {
8627 { "vpsignb", { XM, Vex128, EXx } },
8628 { "(bad)", { XX } },
8629 },
8630
8631 /* VEX_LEN_3809_P_2 */
8632 {
8633 { "vpsignw", { XM, Vex128, EXx } },
8634 { "(bad)", { XX } },
8635 },
8636
8637 /* VEX_LEN_380A_P_2 */
8638 {
8639 { "vpsignd", { XM, Vex128, EXx } },
8640 { "(bad)", { XX } },
8641 },
8642
8643 /* VEX_LEN_380B_P_2 */
8644 {
8645 { "vpmulhrsw", { XM, Vex128, EXx } },
8646 { "(bad)", { XX } },
8647 },
8648
8649 /* VEX_LEN_3819_P_2_M_0 */
8650 {
8651 { "(bad)", { XX } },
8652 { "vbroadcastsd", { XM, Mq } },
8653 },
8654
8655 /* VEX_LEN_381A_P_2_M_0 */
8656 {
8657 { "(bad)", { XX } },
8658 { "vbroadcastf128", { XM, Mxmm } },
8659 },
8660
8661 /* VEX_LEN_381C_P_2 */
8662 {
8663 { "vpabsb", { XM, EXx } },
8664 { "(bad)", { XX } },
8665 },
8666
8667 /* VEX_LEN_381D_P_2 */
8668 {
8669 { "vpabsw", { XM, EXx } },
8670 { "(bad)", { XX } },
8671 },
8672
8673 /* VEX_LEN_381E_P_2 */
8674 {
8675 { "vpabsd", { XM, EXx } },
8676 { "(bad)", { XX } },
8677 },
8678
8679 /* VEX_LEN_3820_P_2 */
8680 {
8681 { "vpmovsxbw", { XM, EXq } },
8682 { "(bad)", { XX } },
8683 },
8684
8685 /* VEX_LEN_3821_P_2 */
8686 {
8687 { "vpmovsxbd", { XM, EXd } },
8688 { "(bad)", { XX } },
8689 },
8690
8691 /* VEX_LEN_3822_P_2 */
8692 {
8693 { "vpmovsxbq", { XM, EXw } },
8694 { "(bad)", { XX } },
8695 },
8696
8697 /* VEX_LEN_3823_P_2 */
8698 {
8699 { "vpmovsxwd", { XM, EXq } },
8700 { "(bad)", { XX } },
8701 },
8702
8703 /* VEX_LEN_3824_P_2 */
8704 {
8705 { "vpmovsxwq", { XM, EXd } },
8706 { "(bad)", { XX } },
8707 },
8708
8709 /* VEX_LEN_3825_P_2 */
8710 {
8711 { "vpmovsxdq", { XM, EXq } },
8712 { "(bad)", { XX } },
8713 },
8714
8715 /* VEX_LEN_3828_P_2 */
8716 {
8717 { "vpmuldq", { XM, Vex128, EXx } },
8718 { "(bad)", { XX } },
8719 },
8720
8721 /* VEX_LEN_3829_P_2 */
8722 {
8723 { "vpcmpeqq", { XM, Vex128, EXx } },
8724 { "(bad)", { XX } },
8725 },
8726
8727 /* VEX_LEN_382A_P_2_M_0 */
8728 {
8729 { "vmovntdqa", { XM, Mx } },
8730 { "(bad)", { XX } },
8731 },
8732
8733 /* VEX_LEN_382B_P_2 */
8734 {
8735 { "vpackusdw", { XM, Vex128, EXx } },
8736 { "(bad)", { XX } },
8737 },
8738
8739 /* VEX_LEN_3830_P_2 */
8740 {
8741 { "vpmovzxbw", { XM, EXq } },
8742 { "(bad)", { XX } },
8743 },
8744
8745 /* VEX_LEN_3831_P_2 */
8746 {
8747 { "vpmovzxbd", { XM, EXd } },
8748 { "(bad)", { XX } },
8749 },
8750
8751 /* VEX_LEN_3832_P_2 */
8752 {
8753 { "vpmovzxbq", { XM, EXw } },
8754 { "(bad)", { XX } },
8755 },
8756
8757 /* VEX_LEN_3833_P_2 */
8758 {
8759 { "vpmovzxwd", { XM, EXq } },
8760 { "(bad)", { XX } },
8761 },
8762
8763 /* VEX_LEN_3834_P_2 */
8764 {
8765 { "vpmovzxwq", { XM, EXd } },
8766 { "(bad)", { XX } },
8767 },
8768
8769 /* VEX_LEN_3835_P_2 */
8770 {
8771 { "vpmovzxdq", { XM, EXq } },
8772 { "(bad)", { XX } },
8773 },
8774
8775 /* VEX_LEN_3837_P_2 */
8776 {
8777 { "vpcmpgtq", { XM, Vex128, EXx } },
8778 { "(bad)", { XX } },
8779 },
8780
8781 /* VEX_LEN_3838_P_2 */
8782 {
8783 { "vpminsb", { XM, Vex128, EXx } },
8784 { "(bad)", { XX } },
8785 },
8786
8787 /* VEX_LEN_3839_P_2 */
8788 {
8789 { "vpminsd", { XM, Vex128, EXx } },
8790 { "(bad)", { XX } },
8791 },
8792
8793 /* VEX_LEN_383A_P_2 */
8794 {
8795 { "vpminuw", { XM, Vex128, EXx } },
8796 { "(bad)", { XX } },
8797 },
8798
8799 /* VEX_LEN_383B_P_2 */
8800 {
8801 { "vpminud", { XM, Vex128, EXx } },
8802 { "(bad)", { XX } },
8803 },
8804
8805 /* VEX_LEN_383C_P_2 */
8806 {
8807 { "vpmaxsb", { XM, Vex128, EXx } },
8808 { "(bad)", { XX } },
8809 },
8810
8811 /* VEX_LEN_383D_P_2 */
8812 {
8813 { "vpmaxsd", { XM, Vex128, EXx } },
8814 { "(bad)", { XX } },
8815 },
8816
8817 /* VEX_LEN_383E_P_2 */
8818 {
8819 { "vpmaxuw", { XM, Vex128, EXx } },
8820 { "(bad)", { XX } },
8821 },
8822
8823 /* VEX_LEN_383F_P_2 */
8824 {
8825 { "vpmaxud", { XM, Vex128, EXx } },
8826 { "(bad)", { XX } },
8827 },
8828
8829 /* VEX_LEN_3840_P_2 */
8830 {
8831 { "vpmulld", { XM, Vex128, EXx } },
8832 { "(bad)", { XX } },
8833 },
8834
8835 /* VEX_LEN_3841_P_2 */
8836 {
8837 { "vphminposuw", { XM, EXx } },
8838 { "(bad)", { XX } },
8839 },
8840
8841 /* VEX_LEN_38DB_P_2 */
8842 {
8843 { "vaesimc", { XM, EXx } },
8844 { "(bad)", { XX } },
8845 },
8846
8847 /* VEX_LEN_38DC_P_2 */
8848 {
8849 { "vaesenc", { XM, Vex128, EXx } },
8850 { "(bad)", { XX } },
8851 },
8852
8853 /* VEX_LEN_38DD_P_2 */
8854 {
8855 { "vaesenclast", { XM, Vex128, EXx } },
8856 { "(bad)", { XX } },
8857 },
8858
8859 /* VEX_LEN_38DE_P_2 */
8860 {
8861 { "vaesdec", { XM, Vex128, EXx } },
8862 { "(bad)", { XX } },
8863 },
8864
8865 /* VEX_LEN_38DF_P_2 */
8866 {
8867 { "vaesdeclast", { XM, Vex128, EXx } },
8868 { "(bad)", { XX } },
8869 },
8870
8871 /* VEX_LEN_3A06_P_2 */
8872 {
8873 { "(bad)", { XX } },
8874 { "vperm2f128", { XM, Vex256, EXx, Ib } },
8875 },
8876
8877 /* VEX_LEN_3A0A_P_2 */
8878 {
8879 { "vroundss", { XM, Vex128, EXd, Ib } },
8880 { "(bad)", { XX } },
8881 },
8882
8883 /* VEX_LEN_3A0B_P_2 */
8884 {
8885 { "vroundsd", { XM, Vex128, EXq, Ib } },
8886 { "(bad)", { XX } },
8887 },
8888
8889 /* VEX_LEN_3A0E_P_2 */
8890 {
8891 { "vpblendw", { XM, Vex128, EXx, Ib } },
8892 { "(bad)", { XX } },
8893 },
8894
8895 /* VEX_LEN_3A0F_P_2 */
8896 {
8897 { "vpalignr", { XM, Vex128, EXx, Ib } },
8898 { "(bad)", { XX } },
8899 },
8900
8901 /* VEX_LEN_3A14_P_2 */
8902 {
8903 { "vpextrb", { Edqb, XM, Ib } },
8904 { "(bad)", { XX } },
8905 },
8906
8907 /* VEX_LEN_3A15_P_2 */
8908 {
8909 { "vpextrw", { Edqw, XM, Ib } },
8910 { "(bad)", { XX } },
8911 },
8912
8913 /* VEX_LEN_3A16_P_2 */
8914 {
8915 { "vpextrK", { Edq, XM, Ib } },
8916 { "(bad)", { XX } },
8917 },
8918
8919 /* VEX_LEN_3A17_P_2 */
8920 {
8921 { "vextractps", { Edqd, XM, Ib } },
8922 { "(bad)", { XX } },
8923 },
8924
8925 /* VEX_LEN_3A18_P_2 */
8926 {
8927 { "(bad)", { XX } },
8928 { "vinsertf128", { XM, Vex256, EXxmm, Ib } },
8929 },
8930
8931 /* VEX_LEN_3A19_P_2 */
8932 {
8933 { "(bad)", { XX } },
8934 { "vextractf128", { EXxmm, XM, Ib } },
8935 },
8936
8937 /* VEX_LEN_3A20_P_2 */
8938 {
8939 { "vpinsrb", { XM, Vex128, Edqb, Ib } },
8940 { "(bad)", { XX } },
8941 },
8942
8943 /* VEX_LEN_3A21_P_2 */
8944 {
8945 { "vinsertps", { XM, Vex128, EXd, Ib } },
8946 { "(bad)", { XX } },
8947 },
8948
8949 /* VEX_LEN_3A22_P_2 */
8950 {
8951 { "vpinsrK", { XM, Vex128, Edq, Ib } },
8952 { "(bad)", { XX } },
8953 },
8954
8955 /* VEX_LEN_3A41_P_2 */
8956 {
8957 { "vdppd", { XM, Vex128, EXx, Ib } },
8958 { "(bad)", { XX } },
8959 },
8960
8961 /* VEX_LEN_3A42_P_2 */
8962 {
8963 { "vmpsadbw", { XM, Vex128, EXx, Ib } },
8964 { "(bad)", { XX } },
8965 },
8966
8967 /* VEX_LEN_3A44_P_2 */
8968 {
8969 { "vpclmulqdq", { XM, Vex128, EXx, PCLMUL } },
8970 { "(bad)", { XX } },
8971 },
8972
8973 /* VEX_LEN_3A4C_P_2 */
8974 {
8975 { "vpblendvb", { XM, Vex128, EXx, XMVexI4 } },
8976 { "(bad)", { XX } },
8977 },
8978
8979 /* VEX_LEN_3A60_P_2 */
8980 {
8981 { "vpcmpestrm", { XM, EXx, Ib } },
8982 { "(bad)", { XX } },
8983 },
8984
8985 /* VEX_LEN_3A61_P_2 */
8986 {
8987 { "vpcmpestri", { XM, EXx, Ib } },
8988 { "(bad)", { XX } },
8989 },
8990
8991 /* VEX_LEN_3A62_P_2 */
8992 {
8993 { "vpcmpistrm", { XM, EXx, Ib } },
8994 { "(bad)", { XX } },
8995 },
8996
8997 /* VEX_LEN_3A63_P_2 */
8998 {
8999 { "vpcmpistri", { XM, EXx, Ib } },
9000 { "(bad)", { XX } },
9001 },
9002
9003 /* VEX_LEN_3A6A_P_2 */
9004 {
9005 { "vfmaddss", { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
9006 { "(bad)", { XX } },
9007 },
9008
9009 /* VEX_LEN_3A6B_P_2 */
9010 {
9011 { "vfmaddsd", { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
9012 { "(bad)", { XX } },
9013 },
9014
9015 /* VEX_LEN_3A6E_P_2 */
9016 {
9017 { "vfmsubss", { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
9018 { "(bad)", { XX } },
9019 },
9020
9021 /* VEX_LEN_3A6F_P_2 */
9022 {
9023 { "vfmsubsd", { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
9024 { "(bad)", { XX } },
9025 },
9026
9027 /* VEX_LEN_3A7A_P_2 */
9028 {
9029 { "vfnmaddss", { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
9030 { "(bad)", { XX } },
9031 },
9032
9033 /* VEX_LEN_3A7B_P_2 */
9034 {
9035 { "vfnmaddsd", { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
9036 { "(bad)", { XX } },
9037 },
9038
9039 /* VEX_LEN_3A7E_P_2 */
9040 {
9041 { "vfnmsubss", { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
9042 { "(bad)", { XX } },
9043 },
9044
9045 /* VEX_LEN_3A7F_P_2 */
9046 {
9047 { "vfnmsubsd", { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
9048 { "(bad)", { XX } },
9049 },
9050
9051 /* VEX_LEN_3ADF_P_2 */
9052 {
9053 { "vaeskeygenassist", { XM, EXx, Ib } },
9054 { "(bad)", { XX } },
9055 },
9056 };
9057
9058 static const struct dis386 mod_table[][2] = {
9059 {
9060 /* MOD_8D */
9061 { "leaS", { Gv, M } },
9062 { "(bad)", { XX } },
9063 },
9064 {
9065 /* MOD_0F01_REG_0 */
9066 { X86_64_TABLE (X86_64_0F01_REG_0) },
9067 { RM_TABLE (RM_0F01_REG_0) },
9068 },
9069 {
9070 /* MOD_0F01_REG_1 */
9071 { X86_64_TABLE (X86_64_0F01_REG_1) },
9072 { RM_TABLE (RM_0F01_REG_1) },
9073 },
9074 {
9075 /* MOD_0F01_REG_2 */
9076 { X86_64_TABLE (X86_64_0F01_REG_2) },
9077 { RM_TABLE (RM_0F01_REG_2) },
9078 },
9079 {
9080 /* MOD_0F01_REG_3 */
9081 { X86_64_TABLE (X86_64_0F01_REG_3) },
9082 { RM_TABLE (RM_0F01_REG_3) },
9083 },
9084 {
9085 /* MOD_0F01_REG_7 */
9086 { "invlpg", { Mb } },
9087 { RM_TABLE (RM_0F01_REG_7) },
9088 },
9089 {
9090 /* MOD_0F12_PREFIX_0 */
9091 { "movlps", { XM, EXq } },
9092 { "movhlps", { XM, EXq } },
9093 },
9094 {
9095 /* MOD_0F13 */
9096 { "movlpX", { EXq, XM } },
9097 { "(bad)", { XX } },
9098 },
9099 {
9100 /* MOD_0F16_PREFIX_0 */
9101 { "movhps", { XM, EXq } },
9102 { "movlhps", { XM, EXq } },
9103 },
9104 {
9105 /* MOD_0F17 */
9106 { "movhpX", { EXq, XM } },
9107 { "(bad)", { XX } },
9108 },
9109 {
9110 /* MOD_0F18_REG_0 */
9111 { "prefetchnta", { Mb } },
9112 { "(bad)", { XX } },
9113 },
9114 {
9115 /* MOD_0F18_REG_1 */
9116 { "prefetcht0", { Mb } },
9117 { "(bad)", { XX } },
9118 },
9119 {
9120 /* MOD_0F18_REG_2 */
9121 { "prefetcht1", { Mb } },
9122 { "(bad)", { XX } },
9123 },
9124 {
9125 /* MOD_0F18_REG_3 */
9126 { "prefetcht2", { Mb } },
9127 { "(bad)", { XX } },
9128 },
9129 {
9130 /* MOD_0F20 */
9131 { "(bad)", { XX } },
9132 { "movZ", { Rm, Cm } },
9133 },
9134 {
9135 /* MOD_0F21 */
9136 { "(bad)", { XX } },
9137 { "movZ", { Rm, Dm } },
9138 },
9139 {
9140 /* MOD_0F22 */
9141 { "(bad)", { XX } },
9142 { "movZ", { Cm, Rm } },
9143 },
9144 {
9145 /* MOD_0F23 */
9146 { "(bad)", { XX } },
9147 { "movZ", { Dm, Rm } },
9148 },
9149 {
9150 /* MOD_0F24 */
9151 { "(bad)", { XX } },
9152 { "movL", { Rd, Td } },
9153 },
9154 {
9155 /* MOD_0F26 */
9156 { "(bad)", { XX } },
9157 { "movL", { Td, Rd } },
9158 },
9159 {
9160 /* MOD_0F2B_PREFIX_0 */
9161 {"movntps", { Mx, XM } },
9162 { "(bad)", { XX } },
9163 },
9164 {
9165 /* MOD_0F2B_PREFIX_1 */
9166 {"movntss", { Md, XM } },
9167 { "(bad)", { XX } },
9168 },
9169 {
9170 /* MOD_0F2B_PREFIX_2 */
9171 {"movntpd", { Mx, XM } },
9172 { "(bad)", { XX } },
9173 },
9174 {
9175 /* MOD_0F2B_PREFIX_3 */
9176 {"movntsd", { Mq, XM } },
9177 { "(bad)", { XX } },
9178 },
9179 {
9180 /* MOD_0F51 */
9181 { "(bad)", { XX } },
9182 { "movmskpX", { Gdq, XS } },
9183 },
9184 {
9185 /* MOD_0F71_REG_2 */
9186 { "(bad)", { XX } },
9187 { "psrlw", { MS, Ib } },
9188 },
9189 {
9190 /* MOD_0F71_REG_4 */
9191 { "(bad)", { XX } },
9192 { "psraw", { MS, Ib } },
9193 },
9194 {
9195 /* MOD_0F71_REG_6 */
9196 { "(bad)", { XX } },
9197 { "psllw", { MS, Ib } },
9198 },
9199 {
9200 /* MOD_0F72_REG_2 */
9201 { "(bad)", { XX } },
9202 { "psrld", { MS, Ib } },
9203 },
9204 {
9205 /* MOD_0F72_REG_4 */
9206 { "(bad)", { XX } },
9207 { "psrad", { MS, Ib } },
9208 },
9209 {
9210 /* MOD_0F72_REG_6 */
9211 { "(bad)", { XX } },
9212 { "pslld", { MS, Ib } },
9213 },
9214 {
9215 /* MOD_0F73_REG_2 */
9216 { "(bad)", { XX } },
9217 { "psrlq", { MS, Ib } },
9218 },
9219 {
9220 /* MOD_0F73_REG_3 */
9221 { "(bad)", { XX } },
9222 { PREFIX_TABLE (PREFIX_0F73_REG_3) },
9223 },
9224 {
9225 /* MOD_0F73_REG_6 */
9226 { "(bad)", { XX } },
9227 { "psllq", { MS, Ib } },
9228 },
9229 {
9230 /* MOD_0F73_REG_7 */
9231 { "(bad)", { XX } },
9232 { PREFIX_TABLE (PREFIX_0F73_REG_7) },
9233 },
9234 {
9235 /* MOD_0FAE_REG_0 */
9236 { "fxsave", { M } },
9237 { "(bad)", { XX } },
9238 },
9239 {
9240 /* MOD_0FAE_REG_1 */
9241 { "fxrstor", { M } },
9242 { "(bad)", { XX } },
9243 },
9244 {
9245 /* MOD_0FAE_REG_2 */
9246 { "ldmxcsr", { Md } },
9247 { "(bad)", { XX } },
9248 },
9249 {
9250 /* MOD_0FAE_REG_3 */
9251 { "stmxcsr", { Md } },
9252 { "(bad)", { XX } },
9253 },
9254 {
9255 /* MOD_0FAE_REG_4 */
9256 { "xsave", { M } },
9257 { "(bad)", { XX } },
9258 },
9259 {
9260 /* MOD_0FAE_REG_5 */
9261 { "xrstor", { M } },
9262 { RM_TABLE (RM_0FAE_REG_5) },
9263 },
9264 {
9265 /* MOD_0FAE_REG_6 */
9266 { "xsaveopt", { M } },
9267 { RM_TABLE (RM_0FAE_REG_6) },
9268 },
9269 {
9270 /* MOD_0FAE_REG_7 */
9271 { "clflush", { Mb } },
9272 { RM_TABLE (RM_0FAE_REG_7) },
9273 },
9274 {
9275 /* MOD_0FB2 */
9276 { "lssS", { Gv, Mp } },
9277 { "(bad)", { XX } },
9278 },
9279 {
9280 /* MOD_0FB4 */
9281 { "lfsS", { Gv, Mp } },
9282 { "(bad)", { XX } },
9283 },
9284 {
9285 /* MOD_0FB5 */
9286 { "lgsS", { Gv, Mp } },
9287 { "(bad)", { XX } },
9288 },
9289 {
9290 /* MOD_0FC7_REG_6 */
9291 { PREFIX_TABLE (PREFIX_0FC7_REG_6) },
9292 { "(bad)", { XX } },
9293 },
9294 {
9295 /* MOD_0FC7_REG_7 */
9296 { "vmptrst", { Mq } },
9297 { "(bad)", { XX } },
9298 },
9299 {
9300 /* MOD_0FD7 */
9301 { "(bad)", { XX } },
9302 { "pmovmskb", { Gdq, MS } },
9303 },
9304 {
9305 /* MOD_0FE7_PREFIX_2 */
9306 { "movntdq", { Mx, XM } },
9307 { "(bad)", { XX } },
9308 },
9309 {
9310 /* MOD_0FF0_PREFIX_3 */
9311 { "lddqu", { XM, M } },
9312 { "(bad)", { XX } },
9313 },
9314 {
9315 /* MOD_0F382A_PREFIX_2 */
9316 { "movntdqa", { XM, Mx } },
9317 { "(bad)", { XX } },
9318 },
9319 {
9320 /* MOD_62_32BIT */
9321 { "bound{S|}", { Gv, Ma } },
9322 { "(bad)", { XX } },
9323 },
9324 {
9325 /* MOD_C4_32BIT */
9326 { "lesS", { Gv, Mp } },
9327 { VEX_C4_TABLE (VEX_0F) },
9328 },
9329 {
9330 /* MOD_C5_32BIT */
9331 { "ldsS", { Gv, Mp } },
9332 { VEX_C5_TABLE (VEX_0F) },
9333 },
9334 {
9335 /* MOD_VEX_12_PREFIX_0 */
9336 { VEX_LEN_TABLE (VEX_LEN_12_P_0_M_0) },
9337 { VEX_LEN_TABLE (VEX_LEN_12_P_0_M_1) },
9338 },
9339 {
9340 /* MOD_VEX_13 */
9341 { VEX_LEN_TABLE (VEX_LEN_13_M_0) },
9342 { "(bad)", { XX } },
9343 },
9344 {
9345 /* MOD_VEX_16_PREFIX_0 */
9346 { VEX_LEN_TABLE (VEX_LEN_16_P_0_M_0) },
9347 { VEX_LEN_TABLE (VEX_LEN_16_P_0_M_1) },
9348 },
9349 {
9350 /* MOD_VEX_17 */
9351 { VEX_LEN_TABLE (VEX_LEN_17_M_0) },
9352 { "(bad)", { XX } },
9353 },
9354 {
9355 /* MOD_VEX_2B */
9356 { "vmovntpX", { Mx, XM } },
9357 { "(bad)", { XX } },
9358 },
9359 {
9360 /* MOD_VEX_51 */
9361 { "(bad)", { XX } },
9362 { "vmovmskpX", { Gdq, XS } },
9363 },
9364 {
9365 /* MOD_VEX_71_REG_2 */
9366 { "(bad)", { XX } },
9367 { PREFIX_TABLE (PREFIX_VEX_71_REG_2) },
9368 },
9369 {
9370 /* MOD_VEX_71_REG_4 */
9371 { "(bad)", { XX } },
9372 { PREFIX_TABLE (PREFIX_VEX_71_REG_4) },
9373 },
9374 {
9375 /* MOD_VEX_71_REG_6 */
9376 { "(bad)", { XX } },
9377 { PREFIX_TABLE (PREFIX_VEX_71_REG_6) },
9378 },
9379 {
9380 /* MOD_VEX_72_REG_2 */
9381 { "(bad)", { XX } },
9382 { PREFIX_TABLE (PREFIX_VEX_72_REG_2) },
9383 },
9384 {
9385 /* MOD_VEX_72_REG_4 */
9386 { "(bad)", { XX } },
9387 { PREFIX_TABLE (PREFIX_VEX_72_REG_4) },
9388 },
9389 {
9390 /* MOD_VEX_72_REG_6 */
9391 { "(bad)", { XX } },
9392 { PREFIX_TABLE (PREFIX_VEX_72_REG_6) },
9393 },
9394 {
9395 /* MOD_VEX_73_REG_2 */
9396 { "(bad)", { XX } },
9397 { PREFIX_TABLE (PREFIX_VEX_73_REG_2) },
9398 },
9399 {
9400 /* MOD_VEX_73_REG_3 */
9401 { "(bad)", { XX } },
9402 { PREFIX_TABLE (PREFIX_VEX_73_REG_3) },
9403 },
9404 {
9405 /* MOD_VEX_73_REG_6 */
9406 { "(bad)", { XX } },
9407 { PREFIX_TABLE (PREFIX_VEX_73_REG_6) },
9408 },
9409 {
9410 /* MOD_VEX_73_REG_7 */
9411 { "(bad)", { XX } },
9412 { PREFIX_TABLE (PREFIX_VEX_73_REG_7) },
9413 },
9414 {
9415 /* MOD_VEX_AE_REG_2 */
9416 { VEX_LEN_TABLE (VEX_LEN_AE_R_2_M_0) },
9417 { "(bad)", { XX } },
9418 },
9419 {
9420 /* MOD_VEX_AE_REG_3 */
9421 { VEX_LEN_TABLE (VEX_LEN_AE_R_3_M_0) },
9422 { "(bad)", { XX } },
9423 },
9424 {
9425 /* MOD_VEX_D7_PREFIX_2 */
9426 { "(bad)", { XX } },
9427 { VEX_LEN_TABLE (VEX_LEN_D7_P_2_M_1) },
9428 },
9429 {
9430 /* MOD_VEX_E7_PREFIX_2 */
9431 { "vmovntdq", { Mx, XM } },
9432 { "(bad)", { XX } },
9433 },
9434 {
9435 /* MOD_VEX_F0_PREFIX_3 */
9436 { "vlddqu", { XM, M } },
9437 { "(bad)", { XX } },
9438 },
9439 {
9440 /* MOD_VEX_3818_PREFIX_2 */
9441 { "vbroadcastss", { XM, Md } },
9442 { "(bad)", { XX } },
9443 },
9444 {
9445 /* MOD_VEX_3819_PREFIX_2 */
9446 { VEX_LEN_TABLE (VEX_LEN_3819_P_2_M_0) },
9447 { "(bad)", { XX } },
9448 },
9449 {
9450 /* MOD_VEX_381A_PREFIX_2 */
9451 { VEX_LEN_TABLE (VEX_LEN_381A_P_2_M_0) },
9452 { "(bad)", { XX } },
9453 },
9454 {
9455 /* MOD_VEX_382A_PREFIX_2 */
9456 { VEX_LEN_TABLE (VEX_LEN_382A_P_2_M_0) },
9457 { "(bad)", { XX } },
9458 },
9459 {
9460 /* MOD_VEX_382C_PREFIX_2 */
9461 { "vmaskmovps", { XM, Vex, Mx } },
9462 { "(bad)", { XX } },
9463 },
9464 {
9465 /* MOD_VEX_382D_PREFIX_2 */
9466 { "vmaskmovpd", { XM, Vex, Mx } },
9467 { "(bad)", { XX } },
9468 },
9469 {
9470 /* MOD_VEX_382E_PREFIX_2 */
9471 { "vmaskmovps", { Mx, Vex, XM } },
9472 { "(bad)", { XX } },
9473 },
9474 {
9475 /* MOD_VEX_382F_PREFIX_2 */
9476 { "vmaskmovpd", { Mx, Vex, XM } },
9477 { "(bad)", { XX } },
9478 },
9479 };
9480
9481 static const struct dis386 rm_table[][8] = {
9482 {
9483 /* RM_0F01_REG_0 */
9484 { "(bad)", { XX } },
9485 { "vmcall", { Skip_MODRM } },
9486 { "vmlaunch", { Skip_MODRM } },
9487 { "vmresume", { Skip_MODRM } },
9488 { "vmxoff", { Skip_MODRM } },
9489 { "(bad)", { XX } },
9490 { "(bad)", { XX } },
9491 { "(bad)", { XX } },
9492 },
9493 {
9494 /* RM_0F01_REG_1 */
9495 { "monitor", { { OP_Monitor, 0 } } },
9496 { "mwait", { { OP_Mwait, 0 } } },
9497 { "(bad)", { XX } },
9498 { "(bad)", { XX } },
9499 { "(bad)", { XX } },
9500 { "(bad)", { XX } },
9501 { "(bad)", { XX } },
9502 { "(bad)", { XX } },
9503 },
9504 {
9505 /* RM_0F01_REG_2 */
9506 { "xgetbv", { Skip_MODRM } },
9507 { "xsetbv", { Skip_MODRM } },
9508 { "(bad)", { XX } },
9509 { "(bad)", { XX } },
9510 { "(bad)", { XX } },
9511 { "(bad)", { XX } },
9512 { "(bad)", { XX } },
9513 { "(bad)", { XX } },
9514 },
9515 {
9516 /* RM_0F01_REG_3 */
9517 { "vmrun", { Skip_MODRM } },
9518 { "vmmcall", { Skip_MODRM } },
9519 { "vmload", { Skip_MODRM } },
9520 { "vmsave", { Skip_MODRM } },
9521 { "stgi", { Skip_MODRM } },
9522 { "clgi", { Skip_MODRM } },
9523 { "skinit", { Skip_MODRM } },
9524 { "invlpga", { Skip_MODRM } },
9525 },
9526 {
9527 /* RM_0F01_REG_7 */
9528 { "swapgs", { Skip_MODRM } },
9529 { "rdtscp", { Skip_MODRM } },
9530 { "(bad)", { XX } },
9531 { "(bad)", { XX } },
9532 { "(bad)", { XX } },
9533 { "(bad)", { XX } },
9534 { "(bad)", { XX } },
9535 { "(bad)", { XX } },
9536 },
9537 {
9538 /* RM_0FAE_REG_5 */
9539 { "lfence", { Skip_MODRM } },
9540 { "(bad)", { XX } },
9541 { "(bad)", { XX } },
9542 { "(bad)", { XX } },
9543 { "(bad)", { XX } },
9544 { "(bad)", { XX } },
9545 { "(bad)", { XX } },
9546 { "(bad)", { XX } },
9547 },
9548 {
9549 /* RM_0FAE_REG_6 */
9550 { "mfence", { Skip_MODRM } },
9551 { "(bad)", { XX } },
9552 { "(bad)", { XX } },
9553 { "(bad)", { XX } },
9554 { "(bad)", { XX } },
9555 { "(bad)", { XX } },
9556 { "(bad)", { XX } },
9557 { "(bad)", { XX } },
9558 },
9559 {
9560 /* RM_0FAE_REG_7 */
9561 { "sfence", { Skip_MODRM } },
9562 { "(bad)", { XX } },
9563 { "(bad)", { XX } },
9564 { "(bad)", { XX } },
9565 { "(bad)", { XX } },
9566 { "(bad)", { XX } },
9567 { "(bad)", { XX } },
9568 { "(bad)", { XX } },
9569 },
9570 };
9571
9572 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
9573
9574 /* We use the high bit to indicate different name for the same
9575 prefix. */
9576 #define ADDR16_PREFIX (0x67 | 0x100)
9577 #define ADDR32_PREFIX (0x67 | 0x200)
9578 #define DATA16_PREFIX (0x66 | 0x100)
9579 #define DATA32_PREFIX (0x66 | 0x200)
9580 #define REP_PREFIX (0xf3 | 0x100)
9581
9582 static int
9583 ckprefix (void)
9584 {
9585 int newrex, i, length;
9586 rex = 0;
9587 rex_original = 0;
9588 rex_ignored = 0;
9589 prefixes = 0;
9590 used_prefixes = 0;
9591 rex_used = 0;
9592 last_lock_prefix = -1;
9593 last_repz_prefix = -1;
9594 last_repnz_prefix = -1;
9595 last_data_prefix = -1;
9596 last_addr_prefix = -1;
9597 last_rex_prefix = -1;
9598 last_seg_prefix = -1;
9599 for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
9600 all_prefixes[i] = 0;
9601 i = 0;
9602 length = 0;
9603 /* The maximum instruction length is 15bytes. */
9604 while (length < MAX_CODE_LENGTH - 1)
9605 {
9606 FETCH_DATA (the_info, codep + 1);
9607 newrex = 0;
9608 switch (*codep)
9609 {
9610 /* REX prefixes family. */
9611 case 0x40:
9612 case 0x41:
9613 case 0x42:
9614 case 0x43:
9615 case 0x44:
9616 case 0x45:
9617 case 0x46:
9618 case 0x47:
9619 case 0x48:
9620 case 0x49:
9621 case 0x4a:
9622 case 0x4b:
9623 case 0x4c:
9624 case 0x4d:
9625 case 0x4e:
9626 case 0x4f:
9627 if (address_mode == mode_64bit)
9628 newrex = *codep;
9629 else
9630 return 1;
9631 last_rex_prefix = i;
9632 break;
9633 case 0xf3:
9634 prefixes |= PREFIX_REPZ;
9635 last_repz_prefix = i;
9636 break;
9637 case 0xf2:
9638 prefixes |= PREFIX_REPNZ;
9639 last_repnz_prefix = i;
9640 break;
9641 case 0xf0:
9642 prefixes |= PREFIX_LOCK;
9643 last_lock_prefix = i;
9644 break;
9645 case 0x2e:
9646 prefixes |= PREFIX_CS;
9647 last_seg_prefix = i;
9648 break;
9649 case 0x36:
9650 prefixes |= PREFIX_SS;
9651 last_seg_prefix = i;
9652 break;
9653 case 0x3e:
9654 prefixes |= PREFIX_DS;
9655 last_seg_prefix = i;
9656 break;
9657 case 0x26:
9658 prefixes |= PREFIX_ES;
9659 last_seg_prefix = i;
9660 break;
9661 case 0x64:
9662 prefixes |= PREFIX_FS;
9663 last_seg_prefix = i;
9664 break;
9665 case 0x65:
9666 prefixes |= PREFIX_GS;
9667 last_seg_prefix = i;
9668 break;
9669 case 0x66:
9670 prefixes |= PREFIX_DATA;
9671 last_data_prefix = i;
9672 break;
9673 case 0x67:
9674 prefixes |= PREFIX_ADDR;
9675 last_addr_prefix = i;
9676 break;
9677 case FWAIT_OPCODE:
9678 /* fwait is really an instruction. If there are prefixes
9679 before the fwait, they belong to the fwait, *not* to the
9680 following instruction. */
9681 if (prefixes || rex)
9682 {
9683 prefixes |= PREFIX_FWAIT;
9684 codep++;
9685 return 1;
9686 }
9687 prefixes = PREFIX_FWAIT;
9688 break;
9689 default:
9690 return 1;
9691 }
9692 /* Rex is ignored when followed by another prefix. */
9693 if (rex)
9694 {
9695 rex_used = rex;
9696 return 1;
9697 }
9698 if (*codep != FWAIT_OPCODE)
9699 all_prefixes[i++] = *codep;
9700 rex = newrex;
9701 rex_original = rex;
9702 codep++;
9703 length++;
9704 }
9705 return 0;
9706 }
9707
9708 static int
9709 seg_prefix (int pref)
9710 {
9711 switch (pref)
9712 {
9713 case 0x2e:
9714 return PREFIX_CS;
9715 case 0x36:
9716 return PREFIX_SS;
9717 case 0x3e:
9718 return PREFIX_DS;
9719 case 0x26:
9720 return PREFIX_ES;
9721 case 0x64:
9722 return PREFIX_FS;
9723 case 0x65:
9724 return PREFIX_GS;
9725 default:
9726 return 0;
9727 }
9728 }
9729
9730 /* Return the name of the prefix byte PREF, or NULL if PREF is not a
9731 prefix byte. */
9732
9733 static const char *
9734 prefix_name (int pref, int sizeflag)
9735 {
9736 static const char *rexes [16] =
9737 {
9738 "rex", /* 0x40 */
9739 "rex.B", /* 0x41 */
9740 "rex.X", /* 0x42 */
9741 "rex.XB", /* 0x43 */
9742 "rex.R", /* 0x44 */
9743 "rex.RB", /* 0x45 */
9744 "rex.RX", /* 0x46 */
9745 "rex.RXB", /* 0x47 */
9746 "rex.W", /* 0x48 */
9747 "rex.WB", /* 0x49 */
9748 "rex.WX", /* 0x4a */
9749 "rex.WXB", /* 0x4b */
9750 "rex.WR", /* 0x4c */
9751 "rex.WRB", /* 0x4d */
9752 "rex.WRX", /* 0x4e */
9753 "rex.WRXB", /* 0x4f */
9754 };
9755
9756 switch (pref)
9757 {
9758 /* REX prefixes family. */
9759 case 0x40:
9760 case 0x41:
9761 case 0x42:
9762 case 0x43:
9763 case 0x44:
9764 case 0x45:
9765 case 0x46:
9766 case 0x47:
9767 case 0x48:
9768 case 0x49:
9769 case 0x4a:
9770 case 0x4b:
9771 case 0x4c:
9772 case 0x4d:
9773 case 0x4e:
9774 case 0x4f:
9775 return rexes [pref - 0x40];
9776 case 0xf3:
9777 return "repz";
9778 case 0xf2:
9779 return "repnz";
9780 case 0xf0:
9781 return "lock";
9782 case 0x2e:
9783 return "cs";
9784 case 0x36:
9785 return "ss";
9786 case 0x3e:
9787 return "ds";
9788 case 0x26:
9789 return "es";
9790 case 0x64:
9791 return "fs";
9792 case 0x65:
9793 return "gs";
9794 case 0x66:
9795 return (sizeflag & DFLAG) ? "data16" : "data32";
9796 case 0x67:
9797 if (address_mode == mode_64bit)
9798 return (sizeflag & AFLAG) ? "addr32" : "addr64";
9799 else
9800 return (sizeflag & AFLAG) ? "addr16" : "addr32";
9801 case FWAIT_OPCODE:
9802 return "fwait";
9803 case ADDR16_PREFIX:
9804 return "addr16";
9805 case ADDR32_PREFIX:
9806 return "addr32";
9807 case DATA16_PREFIX:
9808 return "data16";
9809 case DATA32_PREFIX:
9810 return "data32";
9811 case REP_PREFIX:
9812 return "rep";
9813 default:
9814 return NULL;
9815 }
9816 }
9817
9818 static char op_out[MAX_OPERANDS][100];
9819 static int op_ad, op_index[MAX_OPERANDS];
9820 static int two_source_ops;
9821 static bfd_vma op_address[MAX_OPERANDS];
9822 static bfd_vma op_riprel[MAX_OPERANDS];
9823 static bfd_vma start_pc;
9824
9825 /*
9826 * On the 386's of 1988, the maximum length of an instruction is 15 bytes.
9827 * (see topic "Redundant prefixes" in the "Differences from 8086"
9828 * section of the "Virtual 8086 Mode" chapter.)
9829 * 'pc' should be the address of this instruction, it will
9830 * be used to print the target address if this is a relative jump or call
9831 * The function returns the length of this instruction in bytes.
9832 */
9833
9834 static char intel_syntax;
9835 static char intel_mnemonic = !SYSV386_COMPAT;
9836 static char open_char;
9837 static char close_char;
9838 static char separator_char;
9839 static char scale_char;
9840
9841 /* Here for backwards compatibility. When gdb stops using
9842 print_insn_i386_att and print_insn_i386_intel these functions can
9843 disappear, and print_insn_i386 be merged into print_insn. */
9844 int
9845 print_insn_i386_att (bfd_vma pc, disassemble_info *info)
9846 {
9847 intel_syntax = 0;
9848
9849 return print_insn (pc, info);
9850 }
9851
9852 int
9853 print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
9854 {
9855 intel_syntax = 1;
9856
9857 return print_insn (pc, info);
9858 }
9859
9860 int
9861 print_insn_i386 (bfd_vma pc, disassemble_info *info)
9862 {
9863 intel_syntax = -1;
9864
9865 return print_insn (pc, info);
9866 }
9867
9868 void
9869 print_i386_disassembler_options (FILE *stream)
9870 {
9871 fprintf (stream, _("\n\
9872 The following i386/x86-64 specific disassembler options are supported for use\n\
9873 with the -M switch (multiple options should be separated by commas):\n"));
9874
9875 fprintf (stream, _(" x86-64 Disassemble in 64bit mode\n"));
9876 fprintf (stream, _(" i386 Disassemble in 32bit mode\n"));
9877 fprintf (stream, _(" i8086 Disassemble in 16bit mode\n"));
9878 fprintf (stream, _(" att Display instruction in AT&T syntax\n"));
9879 fprintf (stream, _(" intel Display instruction in Intel syntax\n"));
9880 fprintf (stream, _(" att-mnemonic\n"
9881 " Display instruction in AT&T mnemonic\n"));
9882 fprintf (stream, _(" intel-mnemonic\n"
9883 " Display instruction in Intel mnemonic\n"));
9884 fprintf (stream, _(" addr64 Assume 64bit address size\n"));
9885 fprintf (stream, _(" addr32 Assume 32bit address size\n"));
9886 fprintf (stream, _(" addr16 Assume 16bit address size\n"));
9887 fprintf (stream, _(" data32 Assume 32bit data size\n"));
9888 fprintf (stream, _(" data16 Assume 16bit data size\n"));
9889 fprintf (stream, _(" suffix Always display instruction suffix in AT&T syntax\n"));
9890 }
9891
9892 /* Get a pointer to struct dis386 with a valid name. */
9893
9894 static const struct dis386 *
9895 get_valid_dis386 (const struct dis386 *dp, disassemble_info *info)
9896 {
9897 int index, vex_table_index;
9898
9899 if (dp->name != NULL)
9900 return dp;
9901
9902 switch (dp->op[0].bytemode)
9903 {
9904 case USE_REG_TABLE:
9905 dp = &reg_table[dp->op[1].bytemode][modrm.reg];
9906 break;
9907
9908 case USE_MOD_TABLE:
9909 index = modrm.mod == 0x3 ? 1 : 0;
9910 dp = &mod_table[dp->op[1].bytemode][index];
9911 break;
9912
9913 case USE_RM_TABLE:
9914 dp = &rm_table[dp->op[1].bytemode][modrm.rm];
9915 break;
9916
9917 case USE_PREFIX_TABLE:
9918 if (need_vex)
9919 {
9920 /* The prefix in VEX is implicit. */
9921 switch (vex.prefix)
9922 {
9923 case 0:
9924 index = 0;
9925 break;
9926 case REPE_PREFIX_OPCODE:
9927 index = 1;
9928 break;
9929 case DATA_PREFIX_OPCODE:
9930 index = 2;
9931 break;
9932 case REPNE_PREFIX_OPCODE:
9933 index = 3;
9934 break;
9935 default:
9936 abort ();
9937 break;
9938 }
9939 }
9940 else
9941 {
9942 index = 0;
9943 used_prefixes |= (prefixes & PREFIX_REPZ);
9944 if (prefixes & PREFIX_REPZ)
9945 {
9946 index = 1;
9947 all_prefixes[last_repz_prefix] = 0;
9948 }
9949 else
9950 {
9951 /* We should check PREFIX_REPNZ and PREFIX_REPZ before
9952 PREFIX_DATA. */
9953 used_prefixes |= (prefixes & PREFIX_REPNZ);
9954 if (prefixes & PREFIX_REPNZ)
9955 {
9956 index = 3;
9957 all_prefixes[last_repnz_prefix] = 0;
9958 }
9959 else
9960 {
9961 used_prefixes |= (prefixes & PREFIX_DATA);
9962 if (prefixes & PREFIX_DATA)
9963 {
9964 index = 2;
9965 all_prefixes[last_data_prefix] = 0;
9966 }
9967 }
9968 }
9969 }
9970 dp = &prefix_table[dp->op[1].bytemode][index];
9971 break;
9972
9973 case USE_X86_64_TABLE:
9974 index = address_mode == mode_64bit ? 1 : 0;
9975 dp = &x86_64_table[dp->op[1].bytemode][index];
9976 break;
9977
9978 case USE_3BYTE_TABLE:
9979 FETCH_DATA (info, codep + 2);
9980 index = *codep++;
9981 dp = &three_byte_table[dp->op[1].bytemode][index];
9982 modrm.mod = (*codep >> 6) & 3;
9983 modrm.reg = (*codep >> 3) & 7;
9984 modrm.rm = *codep & 7;
9985 break;
9986
9987 case USE_VEX_LEN_TABLE:
9988 if (!need_vex)
9989 abort ();
9990
9991 switch (vex.length)
9992 {
9993 case 128:
9994 index = 0;
9995 break;
9996 case 256:
9997 index = 1;
9998 break;
9999 default:
10000 abort ();
10001 break;
10002 }
10003
10004 dp = &vex_len_table[dp->op[1].bytemode][index];
10005 break;
10006
10007 case USE_XOP_8F_TABLE:
10008 FETCH_DATA (info, codep + 3);
10009 /* All bits in the REX prefix are ignored. */
10010 rex_ignored = rex;
10011 rex = ~(*codep >> 5) & 0x7;
10012
10013 /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm". */
10014 switch ((*codep & 0x1f))
10015 {
10016 default:
10017 BadOp ();
10018 case 0x9:
10019 vex_table_index = XOP_09;
10020 break;
10021 case 0xa:
10022 vex_table_index = XOP_0A;
10023 break;
10024 }
10025 codep++;
10026 vex.w = *codep & 0x80;
10027 if (vex.w && address_mode == mode_64bit)
10028 rex |= REX_W;
10029
10030 vex.register_specifier = (~(*codep >> 3)) & 0xf;
10031 if (address_mode != mode_64bit
10032 && vex.register_specifier > 0x7)
10033 BadOp ();
10034
10035 vex.length = (*codep & 0x4) ? 256 : 128;
10036 switch ((*codep & 0x3))
10037 {
10038 case 0:
10039 vex.prefix = 0;
10040 break;
10041 case 1:
10042 vex.prefix = DATA_PREFIX_OPCODE;
10043 break;
10044 case 2:
10045 vex.prefix = REPE_PREFIX_OPCODE;
10046 break;
10047 case 3:
10048 vex.prefix = REPNE_PREFIX_OPCODE;
10049 break;
10050 }
10051 need_vex = 1;
10052 need_vex_reg = 1;
10053 codep++;
10054 index = *codep++;
10055 dp = &xop_table[vex_table_index][index];
10056
10057 FETCH_DATA (info, codep + 1);
10058 modrm.mod = (*codep >> 6) & 3;
10059 modrm.reg = (*codep >> 3) & 7;
10060 modrm.rm = *codep & 7;
10061 break;
10062
10063 case USE_VEX_C4_TABLE:
10064 FETCH_DATA (info, codep + 3);
10065 /* All bits in the REX prefix are ignored. */
10066 rex_ignored = rex;
10067 rex = ~(*codep >> 5) & 0x7;
10068 switch ((*codep & 0x1f))
10069 {
10070 default:
10071 BadOp ();
10072 case 0x1:
10073 vex_table_index = VEX_0F;
10074 break;
10075 case 0x2:
10076 vex_table_index = VEX_0F38;
10077 break;
10078 case 0x3:
10079 vex_table_index = VEX_0F3A;
10080 break;
10081 }
10082 codep++;
10083 vex.w = *codep & 0x80;
10084 if (vex.w && address_mode == mode_64bit)
10085 rex |= REX_W;
10086
10087 vex.register_specifier = (~(*codep >> 3)) & 0xf;
10088 if (address_mode != mode_64bit
10089 && vex.register_specifier > 0x7)
10090 BadOp ();
10091
10092 vex.length = (*codep & 0x4) ? 256 : 128;
10093 switch ((*codep & 0x3))
10094 {
10095 case 0:
10096 vex.prefix = 0;
10097 break;
10098 case 1:
10099 vex.prefix = DATA_PREFIX_OPCODE;
10100 break;
10101 case 2:
10102 vex.prefix = REPE_PREFIX_OPCODE;
10103 break;
10104 case 3:
10105 vex.prefix = REPNE_PREFIX_OPCODE;
10106 break;
10107 }
10108 need_vex = 1;
10109 need_vex_reg = 1;
10110 codep++;
10111 index = *codep++;
10112 dp = &vex_table[vex_table_index][index];
10113 /* There is no MODRM byte for VEX [82|77]. */
10114 if (index != 0x77 && index != 0x82)
10115 {
10116 FETCH_DATA (info, codep + 1);
10117 modrm.mod = (*codep >> 6) & 3;
10118 modrm.reg = (*codep >> 3) & 7;
10119 modrm.rm = *codep & 7;
10120 }
10121 break;
10122
10123 case USE_VEX_C5_TABLE:
10124 FETCH_DATA (info, codep + 2);
10125 /* All bits in the REX prefix are ignored. */
10126 rex_ignored = rex;
10127 rex = (*codep & 0x80) ? 0 : REX_R;
10128
10129 vex.register_specifier = (~(*codep >> 3)) & 0xf;
10130 if (address_mode != mode_64bit
10131 && vex.register_specifier > 0x7)
10132 BadOp ();
10133
10134 vex.length = (*codep & 0x4) ? 256 : 128;
10135 switch ((*codep & 0x3))
10136 {
10137 case 0:
10138 vex.prefix = 0;
10139 break;
10140 case 1:
10141 vex.prefix = DATA_PREFIX_OPCODE;
10142 break;
10143 case 2:
10144 vex.prefix = REPE_PREFIX_OPCODE;
10145 break;
10146 case 3:
10147 vex.prefix = REPNE_PREFIX_OPCODE;
10148 break;
10149 }
10150 need_vex = 1;
10151 need_vex_reg = 1;
10152 codep++;
10153 index = *codep++;
10154 dp = &vex_table[dp->op[1].bytemode][index];
10155 /* There is no MODRM byte for VEX [82|77]. */
10156 if (index != 0x77 && index != 0x82)
10157 {
10158 FETCH_DATA (info, codep + 1);
10159 modrm.mod = (*codep >> 6) & 3;
10160 modrm.reg = (*codep >> 3) & 7;
10161 modrm.rm = *codep & 7;
10162 }
10163 break;
10164
10165 default:
10166 abort ();
10167 }
10168
10169 if (dp->name != NULL)
10170 return dp;
10171 else
10172 return get_valid_dis386 (dp, info);
10173 }
10174
10175 static int
10176 print_insn (bfd_vma pc, disassemble_info *info)
10177 {
10178 const struct dis386 *dp;
10179 int i;
10180 char *op_txt[MAX_OPERANDS];
10181 int needcomma;
10182 int sizeflag;
10183 const char *p;
10184 struct dis_private priv;
10185 unsigned char op;
10186 int prefix_length;
10187 int default_prefixes;
10188
10189 if (info->mach == bfd_mach_x86_64_intel_syntax
10190 || info->mach == bfd_mach_x86_64
10191 || info->mach == bfd_mach_l1om
10192 || info->mach == bfd_mach_l1om_intel_syntax)
10193 address_mode = mode_64bit;
10194 else
10195 address_mode = mode_32bit;
10196
10197 if (intel_syntax == (char) -1)
10198 intel_syntax = (info->mach == bfd_mach_i386_i386_intel_syntax
10199 || info->mach == bfd_mach_x86_64_intel_syntax
10200 || info->mach == bfd_mach_l1om_intel_syntax);
10201
10202 if (info->mach == bfd_mach_i386_i386
10203 || info->mach == bfd_mach_x86_64
10204 || info->mach == bfd_mach_l1om
10205 || info->mach == bfd_mach_i386_i386_intel_syntax
10206 || info->mach == bfd_mach_x86_64_intel_syntax
10207 || info->mach == bfd_mach_l1om_intel_syntax)
10208 priv.orig_sizeflag = AFLAG | DFLAG;
10209 else if (info->mach == bfd_mach_i386_i8086)
10210 priv.orig_sizeflag = 0;
10211 else
10212 abort ();
10213
10214 for (p = info->disassembler_options; p != NULL; )
10215 {
10216 if (CONST_STRNEQ (p, "x86-64"))
10217 {
10218 address_mode = mode_64bit;
10219 priv.orig_sizeflag = AFLAG | DFLAG;
10220 }
10221 else if (CONST_STRNEQ (p, "i386"))
10222 {
10223 address_mode = mode_32bit;
10224 priv.orig_sizeflag = AFLAG | DFLAG;
10225 }
10226 else if (CONST_STRNEQ (p, "i8086"))
10227 {
10228 address_mode = mode_16bit;
10229 priv.orig_sizeflag = 0;
10230 }
10231 else if (CONST_STRNEQ (p, "intel"))
10232 {
10233 intel_syntax = 1;
10234 if (CONST_STRNEQ (p + 5, "-mnemonic"))
10235 intel_mnemonic = 1;
10236 }
10237 else if (CONST_STRNEQ (p, "att"))
10238 {
10239 intel_syntax = 0;
10240 if (CONST_STRNEQ (p + 3, "-mnemonic"))
10241 intel_mnemonic = 0;
10242 }
10243 else if (CONST_STRNEQ (p, "addr"))
10244 {
10245 if (address_mode == mode_64bit)
10246 {
10247 if (p[4] == '3' && p[5] == '2')
10248 priv.orig_sizeflag &= ~AFLAG;
10249 else if (p[4] == '6' && p[5] == '4')
10250 priv.orig_sizeflag |= AFLAG;
10251 }
10252 else
10253 {
10254 if (p[4] == '1' && p[5] == '6')
10255 priv.orig_sizeflag &= ~AFLAG;
10256 else if (p[4] == '3' && p[5] == '2')
10257 priv.orig_sizeflag |= AFLAG;
10258 }
10259 }
10260 else if (CONST_STRNEQ (p, "data"))
10261 {
10262 if (p[4] == '1' && p[5] == '6')
10263 priv.orig_sizeflag &= ~DFLAG;
10264 else if (p[4] == '3' && p[5] == '2')
10265 priv.orig_sizeflag |= DFLAG;
10266 }
10267 else if (CONST_STRNEQ (p, "suffix"))
10268 priv.orig_sizeflag |= SUFFIX_ALWAYS;
10269
10270 p = strchr (p, ',');
10271 if (p != NULL)
10272 p++;
10273 }
10274
10275 if (intel_syntax)
10276 {
10277 names64 = intel_names64;
10278 names32 = intel_names32;
10279 names16 = intel_names16;
10280 names8 = intel_names8;
10281 names8rex = intel_names8rex;
10282 names_seg = intel_names_seg;
10283 index64 = intel_index64;
10284 index32 = intel_index32;
10285 index16 = intel_index16;
10286 open_char = '[';
10287 close_char = ']';
10288 separator_char = '+';
10289 scale_char = '*';
10290 }
10291 else
10292 {
10293 names64 = att_names64;
10294 names32 = att_names32;
10295 names16 = att_names16;
10296 names8 = att_names8;
10297 names8rex = att_names8rex;
10298 names_seg = att_names_seg;
10299 index64 = att_index64;
10300 index32 = att_index32;
10301 index16 = att_index16;
10302 open_char = '(';
10303 close_char = ')';
10304 separator_char = ',';
10305 scale_char = ',';
10306 }
10307
10308 /* The output looks better if we put 7 bytes on a line, since that
10309 puts most long word instructions on a single line. Use 8 bytes
10310 for Intel L1OM. */
10311 if (info->mach == bfd_mach_l1om
10312 || info->mach == bfd_mach_l1om_intel_syntax)
10313 info->bytes_per_line = 8;
10314 else
10315 info->bytes_per_line = 7;
10316
10317 info->private_data = &priv;
10318 priv.max_fetched = priv.the_buffer;
10319 priv.insn_start = pc;
10320
10321 obuf[0] = 0;
10322 for (i = 0; i < MAX_OPERANDS; ++i)
10323 {
10324 op_out[i][0] = 0;
10325 op_index[i] = -1;
10326 }
10327
10328 the_info = info;
10329 start_pc = pc;
10330 start_codep = priv.the_buffer;
10331 codep = priv.the_buffer;
10332
10333 if (setjmp (priv.bailout) != 0)
10334 {
10335 const char *name;
10336
10337 /* Getting here means we tried for data but didn't get it. That
10338 means we have an incomplete instruction of some sort. Just
10339 print the first byte as a prefix or a .byte pseudo-op. */
10340 if (codep > priv.the_buffer)
10341 {
10342 name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
10343 if (name != NULL)
10344 (*info->fprintf_func) (info->stream, "%s", name);
10345 else
10346 {
10347 /* Just print the first byte as a .byte instruction. */
10348 (*info->fprintf_func) (info->stream, ".byte 0x%x",
10349 (unsigned int) priv.the_buffer[0]);
10350 }
10351
10352 return 1;
10353 }
10354
10355 return -1;
10356 }
10357
10358 obufp = obuf;
10359 sizeflag = priv.orig_sizeflag;
10360
10361 if (!ckprefix () || rex_used)
10362 {
10363 /* Too many prefixes or unused REX prefixes. */
10364 for (i = 0;
10365 all_prefixes[i] && i < (int) ARRAY_SIZE (all_prefixes);
10366 i++)
10367 (*info->fprintf_func) (info->stream, "%s",
10368 prefix_name (all_prefixes[i], sizeflag));
10369 return 1;
10370 }
10371
10372 insn_codep = codep;
10373
10374 FETCH_DATA (info, codep + 1);
10375 two_source_ops = (*codep == 0x62) || (*codep == 0xc8);
10376
10377 if (((prefixes & PREFIX_FWAIT)
10378 && ((*codep < 0xd8) || (*codep > 0xdf))))
10379 {
10380 (*info->fprintf_func) (info->stream, "fwait");
10381 return 1;
10382 }
10383
10384 op = 0;
10385
10386 if (*codep == 0x0f)
10387 {
10388 unsigned char threebyte;
10389 FETCH_DATA (info, codep + 2);
10390 threebyte = *++codep;
10391 dp = &dis386_twobyte[threebyte];
10392 need_modrm = twobyte_has_modrm[*codep];
10393 codep++;
10394 }
10395 else
10396 {
10397 dp = &dis386[*codep];
10398 need_modrm = onebyte_has_modrm[*codep];
10399 codep++;
10400 }
10401
10402 if ((prefixes & PREFIX_REPZ))
10403 used_prefixes |= PREFIX_REPZ;
10404 if ((prefixes & PREFIX_REPNZ))
10405 used_prefixes |= PREFIX_REPNZ;
10406 if ((prefixes & PREFIX_LOCK))
10407 used_prefixes |= PREFIX_LOCK;
10408
10409 default_prefixes = 0;
10410 if (prefixes & PREFIX_ADDR)
10411 {
10412 sizeflag ^= AFLAG;
10413 if (dp->op[2].bytemode != loop_jcxz_mode || intel_syntax)
10414 {
10415 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
10416 all_prefixes[last_addr_prefix] = ADDR32_PREFIX;
10417 else
10418 all_prefixes[last_addr_prefix] = ADDR16_PREFIX;
10419 default_prefixes |= PREFIX_ADDR;
10420 }
10421 }
10422
10423 if ((prefixes & PREFIX_DATA))
10424 {
10425 sizeflag ^= DFLAG;
10426 if (dp->op[2].bytemode == cond_jump_mode
10427 && dp->op[0].bytemode == v_mode
10428 && !intel_syntax)
10429 {
10430 if (sizeflag & DFLAG)
10431 all_prefixes[last_data_prefix] = DATA32_PREFIX;
10432 else
10433 all_prefixes[last_data_prefix] = DATA16_PREFIX;
10434 default_prefixes |= PREFIX_DATA;
10435 }
10436 else if (rex & REX_W)
10437 {
10438 /* REX_W will override PREFIX_DATA. */
10439 default_prefixes |= PREFIX_DATA;
10440 }
10441 }
10442
10443 if (need_modrm)
10444 {
10445 FETCH_DATA (info, codep + 1);
10446 modrm.mod = (*codep >> 6) & 3;
10447 modrm.reg = (*codep >> 3) & 7;
10448 modrm.rm = *codep & 7;
10449 }
10450
10451 need_vex = 0;
10452 need_vex_reg = 0;
10453 vex_w_done = 0;
10454
10455 if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
10456 {
10457 dofloat (sizeflag);
10458 }
10459 else
10460 {
10461 dp = get_valid_dis386 (dp, info);
10462 if (dp != NULL && putop (dp->name, sizeflag) == 0)
10463 {
10464 for (i = 0; i < MAX_OPERANDS; ++i)
10465 {
10466 obufp = op_out[i];
10467 op_ad = MAX_OPERANDS - 1 - i;
10468 if (dp->op[i].rtn)
10469 (*dp->op[i].rtn) (dp->op[i].bytemode, sizeflag);
10470 }
10471 }
10472 }
10473
10474 /* See if any prefixes were not used. If so, print the first one
10475 separately. If we don't do this, we'll wind up printing an
10476 instruction stream which does not precisely correspond to the
10477 bytes we are disassembling. */
10478 if ((prefixes & ~(used_prefixes | default_prefixes)) != 0)
10479 {
10480 for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
10481 if (all_prefixes[i])
10482 {
10483 const char *name;
10484 name = prefix_name (all_prefixes[i], priv.orig_sizeflag);
10485 if (name == NULL)
10486 name = INTERNAL_DISASSEMBLER_ERROR;
10487 (*info->fprintf_func) (info->stream, "%s", name);
10488 return 1;
10489 }
10490 }
10491
10492 /* Check if the REX prefix used. */
10493 if (rex_ignored == 0 && (rex ^ rex_used) == 0)
10494 all_prefixes[last_rex_prefix] = 0;
10495
10496 /* Check if the SEG prefix used. */
10497 if ((prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS | PREFIX_ES
10498 | PREFIX_FS | PREFIX_GS)) != 0
10499 && (used_prefixes
10500 & seg_prefix (all_prefixes[last_seg_prefix])) != 0)
10501 all_prefixes[last_seg_prefix] = 0;
10502
10503 /* Check if the ADDR prefix used. */
10504 if ((prefixes & PREFIX_ADDR) != 0
10505 && (used_prefixes & PREFIX_ADDR) != 0)
10506 all_prefixes[last_addr_prefix] = 0;
10507
10508 /* Check if the DATA prefix used. */
10509 if ((prefixes & PREFIX_DATA) != 0
10510 && (used_prefixes & PREFIX_DATA) != 0)
10511 all_prefixes[last_data_prefix] = 0;
10512
10513 prefix_length = 0;
10514 for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
10515 if (all_prefixes[i])
10516 {
10517 const char *name;
10518 name = prefix_name (all_prefixes[i], sizeflag);
10519 if (name == NULL)
10520 abort ();
10521 prefix_length += strlen (name) + 1;
10522 (*info->fprintf_func) (info->stream, "%s ", name);
10523 }
10524
10525 /* Check maximum code length. */
10526 if ((codep - start_codep) > MAX_CODE_LENGTH)
10527 {
10528 (*info->fprintf_func) (info->stream, "(bad)");
10529 return MAX_CODE_LENGTH;
10530 }
10531
10532 obufp = mnemonicendp;
10533 for (i = strlen (obuf) + prefix_length; i < 6; i++)
10534 oappend (" ");
10535 oappend (" ");
10536 (*info->fprintf_func) (info->stream, "%s", obuf);
10537
10538 /* The enter and bound instructions are printed with operands in the same
10539 order as the intel book; everything else is printed in reverse order. */
10540 if (intel_syntax || two_source_ops)
10541 {
10542 bfd_vma riprel;
10543
10544 for (i = 0; i < MAX_OPERANDS; ++i)
10545 op_txt[i] = op_out[i];
10546
10547 for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
10548 {
10549 op_ad = op_index[i];
10550 op_index[i] = op_index[MAX_OPERANDS - 1 - i];
10551 op_index[MAX_OPERANDS - 1 - i] = op_ad;
10552 riprel = op_riprel[i];
10553 op_riprel[i] = op_riprel [MAX_OPERANDS - 1 - i];
10554 op_riprel[MAX_OPERANDS - 1 - i] = riprel;
10555 }
10556 }
10557 else
10558 {
10559 for (i = 0; i < MAX_OPERANDS; ++i)
10560 op_txt[MAX_OPERANDS - 1 - i] = op_out[i];
10561 }
10562
10563 needcomma = 0;
10564 for (i = 0; i < MAX_OPERANDS; ++i)
10565 if (*op_txt[i])
10566 {
10567 if (needcomma)
10568 (*info->fprintf_func) (info->stream, ",");
10569 if (op_index[i] != -1 && !op_riprel[i])
10570 (*info->print_address_func) ((bfd_vma) op_address[op_index[i]], info);
10571 else
10572 (*info->fprintf_func) (info->stream, "%s", op_txt[i]);
10573 needcomma = 1;
10574 }
10575
10576 for (i = 0; i < MAX_OPERANDS; i++)
10577 if (op_index[i] != -1 && op_riprel[i])
10578 {
10579 (*info->fprintf_func) (info->stream, " # ");
10580 (*info->print_address_func) ((bfd_vma) (start_pc + codep - start_codep
10581 + op_address[op_index[i]]), info);
10582 break;
10583 }
10584 return codep - priv.the_buffer;
10585 }
10586
10587 static const char *float_mem[] = {
10588 /* d8 */
10589 "fadd{s|}",
10590 "fmul{s|}",
10591 "fcom{s|}",
10592 "fcomp{s|}",
10593 "fsub{s|}",
10594 "fsubr{s|}",
10595 "fdiv{s|}",
10596 "fdivr{s|}",
10597 /* d9 */
10598 "fld{s|}",
10599 "(bad)",
10600 "fst{s|}",
10601 "fstp{s|}",
10602 "fldenvIC",
10603 "fldcw",
10604 "fNstenvIC",
10605 "fNstcw",
10606 /* da */
10607 "fiadd{l|}",
10608 "fimul{l|}",
10609 "ficom{l|}",
10610 "ficomp{l|}",
10611 "fisub{l|}",
10612 "fisubr{l|}",
10613 "fidiv{l|}",
10614 "fidivr{l|}",
10615 /* db */
10616 "fild{l|}",
10617 "fisttp{l|}",
10618 "fist{l|}",
10619 "fistp{l|}",
10620 "(bad)",
10621 "fld{t||t|}",
10622 "(bad)",
10623 "fstp{t||t|}",
10624 /* dc */
10625 "fadd{l|}",
10626 "fmul{l|}",
10627 "fcom{l|}",
10628 "fcomp{l|}",
10629 "fsub{l|}",
10630 "fsubr{l|}",
10631 "fdiv{l|}",
10632 "fdivr{l|}",
10633 /* dd */
10634 "fld{l|}",
10635 "fisttp{ll|}",
10636 "fst{l||}",
10637 "fstp{l|}",
10638 "frstorIC",
10639 "(bad)",
10640 "fNsaveIC",
10641 "fNstsw",
10642 /* de */
10643 "fiadd",
10644 "fimul",
10645 "ficom",
10646 "ficomp",
10647 "fisub",
10648 "fisubr",
10649 "fidiv",
10650 "fidivr",
10651 /* df */
10652 "fild",
10653 "fisttp",
10654 "fist",
10655 "fistp",
10656 "fbld",
10657 "fild{ll|}",
10658 "fbstp",
10659 "fistp{ll|}",
10660 };
10661
10662 static const unsigned char float_mem_mode[] = {
10663 /* d8 */
10664 d_mode,
10665 d_mode,
10666 d_mode,
10667 d_mode,
10668 d_mode,
10669 d_mode,
10670 d_mode,
10671 d_mode,
10672 /* d9 */
10673 d_mode,
10674 0,
10675 d_mode,
10676 d_mode,
10677 0,
10678 w_mode,
10679 0,
10680 w_mode,
10681 /* da */
10682 d_mode,
10683 d_mode,
10684 d_mode,
10685 d_mode,
10686 d_mode,
10687 d_mode,
10688 d_mode,
10689 d_mode,
10690 /* db */
10691 d_mode,
10692 d_mode,
10693 d_mode,
10694 d_mode,
10695 0,
10696 t_mode,
10697 0,
10698 t_mode,
10699 /* dc */
10700 q_mode,
10701 q_mode,
10702 q_mode,
10703 q_mode,
10704 q_mode,
10705 q_mode,
10706 q_mode,
10707 q_mode,
10708 /* dd */
10709 q_mode,
10710 q_mode,
10711 q_mode,
10712 q_mode,
10713 0,
10714 0,
10715 0,
10716 w_mode,
10717 /* de */
10718 w_mode,
10719 w_mode,
10720 w_mode,
10721 w_mode,
10722 w_mode,
10723 w_mode,
10724 w_mode,
10725 w_mode,
10726 /* df */
10727 w_mode,
10728 w_mode,
10729 w_mode,
10730 w_mode,
10731 t_mode,
10732 q_mode,
10733 t_mode,
10734 q_mode
10735 };
10736
10737 #define ST { OP_ST, 0 }
10738 #define STi { OP_STi, 0 }
10739
10740 #define FGRPd9_2 NULL, { { NULL, 0 } }
10741 #define FGRPd9_4 NULL, { { NULL, 1 } }
10742 #define FGRPd9_5 NULL, { { NULL, 2 } }
10743 #define FGRPd9_6 NULL, { { NULL, 3 } }
10744 #define FGRPd9_7 NULL, { { NULL, 4 } }
10745 #define FGRPda_5 NULL, { { NULL, 5 } }
10746 #define FGRPdb_4 NULL, { { NULL, 6 } }
10747 #define FGRPde_3 NULL, { { NULL, 7 } }
10748 #define FGRPdf_4 NULL, { { NULL, 8 } }
10749
10750 static const struct dis386 float_reg[][8] = {
10751 /* d8 */
10752 {
10753 { "fadd", { ST, STi } },
10754 { "fmul", { ST, STi } },
10755 { "fcom", { STi } },
10756 { "fcomp", { STi } },
10757 { "fsub", { ST, STi } },
10758 { "fsubr", { ST, STi } },
10759 { "fdiv", { ST, STi } },
10760 { "fdivr", { ST, STi } },
10761 },
10762 /* d9 */
10763 {
10764 { "fld", { STi } },
10765 { "fxch", { STi } },
10766 { FGRPd9_2 },
10767 { "(bad)", { XX } },
10768 { FGRPd9_4 },
10769 { FGRPd9_5 },
10770 { FGRPd9_6 },
10771 { FGRPd9_7 },
10772 },
10773 /* da */
10774 {
10775 { "fcmovb", { ST, STi } },
10776 { "fcmove", { ST, STi } },
10777 { "fcmovbe",{ ST, STi } },
10778 { "fcmovu", { ST, STi } },
10779 { "(bad)", { XX } },
10780 { FGRPda_5 },
10781 { "(bad)", { XX } },
10782 { "(bad)", { XX } },
10783 },
10784 /* db */
10785 {
10786 { "fcmovnb",{ ST, STi } },
10787 { "fcmovne",{ ST, STi } },
10788 { "fcmovnbe",{ ST, STi } },
10789 { "fcmovnu",{ ST, STi } },
10790 { FGRPdb_4 },
10791 { "fucomi", { ST, STi } },
10792 { "fcomi", { ST, STi } },
10793 { "(bad)", { XX } },
10794 },
10795 /* dc */
10796 {
10797 { "fadd", { STi, ST } },
10798 { "fmul", { STi, ST } },
10799 { "(bad)", { XX } },
10800 { "(bad)", { XX } },
10801 { "fsub!M", { STi, ST } },
10802 { "fsubM", { STi, ST } },
10803 { "fdiv!M", { STi, ST } },
10804 { "fdivM", { STi, ST } },
10805 },
10806 /* dd */
10807 {
10808 { "ffree", { STi } },
10809 { "(bad)", { XX } },
10810 { "fst", { STi } },
10811 { "fstp", { STi } },
10812 { "fucom", { STi } },
10813 { "fucomp", { STi } },
10814 { "(bad)", { XX } },
10815 { "(bad)", { XX } },
10816 },
10817 /* de */
10818 {
10819 { "faddp", { STi, ST } },
10820 { "fmulp", { STi, ST } },
10821 { "(bad)", { XX } },
10822 { FGRPde_3 },
10823 { "fsub!Mp", { STi, ST } },
10824 { "fsubMp", { STi, ST } },
10825 { "fdiv!Mp", { STi, ST } },
10826 { "fdivMp", { STi, ST } },
10827 },
10828 /* df */
10829 {
10830 { "ffreep", { STi } },
10831 { "(bad)", { XX } },
10832 { "(bad)", { XX } },
10833 { "(bad)", { XX } },
10834 { FGRPdf_4 },
10835 { "fucomip", { ST, STi } },
10836 { "fcomip", { ST, STi } },
10837 { "(bad)", { XX } },
10838 },
10839 };
10840
10841 static char *fgrps[][8] = {
10842 /* d9_2 0 */
10843 {
10844 "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10845 },
10846
10847 /* d9_4 1 */
10848 {
10849 "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
10850 },
10851
10852 /* d9_5 2 */
10853 {
10854 "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
10855 },
10856
10857 /* d9_6 3 */
10858 {
10859 "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
10860 },
10861
10862 /* d9_7 4 */
10863 {
10864 "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
10865 },
10866
10867 /* da_5 5 */
10868 {
10869 "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10870 },
10871
10872 /* db_4 6 */
10873 {
10874 "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
10875 "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
10876 },
10877
10878 /* de_3 7 */
10879 {
10880 "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10881 },
10882
10883 /* df_4 8 */
10884 {
10885 "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10886 },
10887 };
10888
10889 static void
10890 swap_operand (void)
10891 {
10892 mnemonicendp[0] = '.';
10893 mnemonicendp[1] = 's';
10894 mnemonicendp += 2;
10895 }
10896
10897 static void
10898 OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED,
10899 int sizeflag ATTRIBUTE_UNUSED)
10900 {
10901 /* Skip mod/rm byte. */
10902 MODRM_CHECK;
10903 codep++;
10904 }
10905
10906 static void
10907 dofloat (int sizeflag)
10908 {
10909 const struct dis386 *dp;
10910 unsigned char floatop;
10911
10912 floatop = codep[-1];
10913
10914 if (modrm.mod != 3)
10915 {
10916 int fp_indx = (floatop - 0xd8) * 8 + modrm.reg;
10917
10918 putop (float_mem[fp_indx], sizeflag);
10919 obufp = op_out[0];
10920 op_ad = 2;
10921 OP_E (float_mem_mode[fp_indx], sizeflag);
10922 return;
10923 }
10924 /* Skip mod/rm byte. */
10925 MODRM_CHECK;
10926 codep++;
10927
10928 dp = &float_reg[floatop - 0xd8][modrm.reg];
10929 if (dp->name == NULL)
10930 {
10931 putop (fgrps[dp->op[0].bytemode][modrm.rm], sizeflag);
10932
10933 /* Instruction fnstsw is only one with strange arg. */
10934 if (floatop == 0xdf && codep[-1] == 0xe0)
10935 strcpy (op_out[0], names16[0]);
10936 }
10937 else
10938 {
10939 putop (dp->name, sizeflag);
10940
10941 obufp = op_out[0];
10942 op_ad = 2;
10943 if (dp->op[0].rtn)
10944 (*dp->op[0].rtn) (dp->op[0].bytemode, sizeflag);
10945
10946 obufp = op_out[1];
10947 op_ad = 1;
10948 if (dp->op[1].rtn)
10949 (*dp->op[1].rtn) (dp->op[1].bytemode, sizeflag);
10950 }
10951 }
10952
10953 static void
10954 OP_ST (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
10955 {
10956 oappend ("%st" + intel_syntax);
10957 }
10958
10959 static void
10960 OP_STi (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
10961 {
10962 sprintf (scratchbuf, "%%st(%d)", modrm.rm);
10963 oappend (scratchbuf + intel_syntax);
10964 }
10965
10966 /* Capital letters in template are macros. */
10967 static int
10968 putop (const char *in_template, int sizeflag)
10969 {
10970 const char *p;
10971 int alt = 0;
10972 int cond = 1;
10973 unsigned int l = 0, len = 1;
10974 char last[4];
10975
10976 #define SAVE_LAST(c) \
10977 if (l < len && l < sizeof (last)) \
10978 last[l++] = c; \
10979 else \
10980 abort ();
10981
10982 for (p = in_template; *p; p++)
10983 {
10984 switch (*p)
10985 {
10986 default:
10987 *obufp++ = *p;
10988 break;
10989 case '%':
10990 len++;
10991 break;
10992 case '!':
10993 cond = 0;
10994 break;
10995 case '{':
10996 alt = 0;
10997 if (intel_syntax)
10998 {
10999 while (*++p != '|')
11000 if (*p == '}' || *p == '\0')
11001 abort ();
11002 }
11003 /* Fall through. */
11004 case 'I':
11005 alt = 1;
11006 continue;
11007 case '|':
11008 while (*++p != '}')
11009 {
11010 if (*p == '\0')
11011 abort ();
11012 }
11013 break;
11014 case '}':
11015 break;
11016 case 'A':
11017 if (intel_syntax)
11018 break;
11019 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
11020 *obufp++ = 'b';
11021 break;
11022 case 'B':
11023 if (l == 0 && len == 1)
11024 {
11025 case_B:
11026 if (intel_syntax)
11027 break;
11028 if (sizeflag & SUFFIX_ALWAYS)
11029 *obufp++ = 'b';
11030 }
11031 else
11032 {
11033 if (l != 1
11034 || len != 2
11035 || last[0] != 'L')
11036 {
11037 SAVE_LAST (*p);
11038 break;
11039 }
11040
11041 if (address_mode == mode_64bit
11042 && !(prefixes & PREFIX_ADDR))
11043 {
11044 *obufp++ = 'a';
11045 *obufp++ = 'b';
11046 *obufp++ = 's';
11047 }
11048
11049 goto case_B;
11050 }
11051 break;
11052 case 'C':
11053 if (intel_syntax && !alt)
11054 break;
11055 if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
11056 {
11057 if (sizeflag & DFLAG)
11058 *obufp++ = intel_syntax ? 'd' : 'l';
11059 else
11060 *obufp++ = intel_syntax ? 'w' : 's';
11061 used_prefixes |= (prefixes & PREFIX_DATA);
11062 }
11063 break;
11064 case 'D':
11065 if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
11066 break;
11067 USED_REX (REX_W);
11068 if (modrm.mod == 3)
11069 {
11070 if (rex & REX_W)
11071 *obufp++ = 'q';
11072 else
11073 {
11074 if (sizeflag & DFLAG)
11075 *obufp++ = intel_syntax ? 'd' : 'l';
11076 else
11077 *obufp++ = 'w';
11078 used_prefixes |= (prefixes & PREFIX_DATA);
11079 }
11080 }
11081 else
11082 *obufp++ = 'w';
11083 break;
11084 case 'E': /* For jcxz/jecxz */
11085 if (address_mode == mode_64bit)
11086 {
11087 if (sizeflag & AFLAG)
11088 *obufp++ = 'r';
11089 else
11090 *obufp++ = 'e';
11091 }
11092 else
11093 if (sizeflag & AFLAG)
11094 *obufp++ = 'e';
11095 used_prefixes |= (prefixes & PREFIX_ADDR);
11096 break;
11097 case 'F':
11098 if (intel_syntax)
11099 break;
11100 if ((prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
11101 {
11102 if (sizeflag & AFLAG)
11103 *obufp++ = address_mode == mode_64bit ? 'q' : 'l';
11104 else
11105 *obufp++ = address_mode == mode_64bit ? 'l' : 'w';
11106 used_prefixes |= (prefixes & PREFIX_ADDR);
11107 }
11108 break;
11109 case 'G':
11110 if (intel_syntax || (obufp[-1] != 's' && !(sizeflag & SUFFIX_ALWAYS)))
11111 break;
11112 if ((rex & REX_W) || (sizeflag & DFLAG))
11113 *obufp++ = 'l';
11114 else
11115 *obufp++ = 'w';
11116 if (!(rex & REX_W))
11117 used_prefixes |= (prefixes & PREFIX_DATA);
11118 break;
11119 case 'H':
11120 if (intel_syntax)
11121 break;
11122 if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
11123 || (prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
11124 {
11125 used_prefixes |= prefixes & (PREFIX_CS | PREFIX_DS);
11126 *obufp++ = ',';
11127 *obufp++ = 'p';
11128 if (prefixes & PREFIX_DS)
11129 *obufp++ = 't';
11130 else
11131 *obufp++ = 'n';
11132 }
11133 break;
11134 case 'J':
11135 if (intel_syntax)
11136 break;
11137 *obufp++ = 'l';
11138 break;
11139 case 'K':
11140 USED_REX (REX_W);
11141 if (rex & REX_W)
11142 *obufp++ = 'q';
11143 else
11144 *obufp++ = 'd';
11145 break;
11146 case 'Z':
11147 if (intel_syntax)
11148 break;
11149 if (address_mode == mode_64bit && (sizeflag & SUFFIX_ALWAYS))
11150 {
11151 *obufp++ = 'q';
11152 break;
11153 }
11154 /* Fall through. */
11155 goto case_L;
11156 case 'L':
11157 if (l != 0 || len != 1)
11158 {
11159 SAVE_LAST (*p);
11160 break;
11161 }
11162 case_L:
11163 if (intel_syntax)
11164 break;
11165 if (sizeflag & SUFFIX_ALWAYS)
11166 *obufp++ = 'l';
11167 break;
11168 case 'M':
11169 if (intel_mnemonic != cond)
11170 *obufp++ = 'r';
11171 break;
11172 case 'N':
11173 if ((prefixes & PREFIX_FWAIT) == 0)
11174 *obufp++ = 'n';
11175 else
11176 used_prefixes |= PREFIX_FWAIT;
11177 break;
11178 case 'O':
11179 USED_REX (REX_W);
11180 if (rex & REX_W)
11181 *obufp++ = 'o';
11182 else if (intel_syntax && (sizeflag & DFLAG))
11183 *obufp++ = 'q';
11184 else
11185 *obufp++ = 'd';
11186 if (!(rex & REX_W))
11187 used_prefixes |= (prefixes & PREFIX_DATA);
11188 break;
11189 case 'T':
11190 if (intel_syntax)
11191 break;
11192 if (address_mode == mode_64bit && (sizeflag & DFLAG))
11193 {
11194 *obufp++ = 'q';
11195 break;
11196 }
11197 /* Fall through. */
11198 case 'P':
11199 if (intel_syntax)
11200 break;
11201 if ((prefixes & PREFIX_DATA)
11202 || (rex & REX_W)
11203 || (sizeflag & SUFFIX_ALWAYS))
11204 {
11205 USED_REX (REX_W);
11206 if (rex & REX_W)
11207 *obufp++ = 'q';
11208 else
11209 {
11210 if (sizeflag & DFLAG)
11211 *obufp++ = 'l';
11212 else
11213 *obufp++ = 'w';
11214 used_prefixes |= (prefixes & PREFIX_DATA);
11215 }
11216 }
11217 break;
11218 case 'U':
11219 if (intel_syntax)
11220 break;
11221 if (address_mode == mode_64bit && (sizeflag & DFLAG))
11222 {
11223 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
11224 *obufp++ = 'q';
11225 break;
11226 }
11227 /* Fall through. */
11228 goto case_Q;
11229 case 'Q':
11230 if (l == 0 && len == 1)
11231 {
11232 case_Q:
11233 if (intel_syntax && !alt)
11234 break;
11235 USED_REX (REX_W);
11236 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
11237 {
11238 if (rex & REX_W)
11239 *obufp++ = 'q';
11240 else
11241 {
11242 if (sizeflag & DFLAG)
11243 *obufp++ = intel_syntax ? 'd' : 'l';
11244 else
11245 *obufp++ = 'w';
11246 used_prefixes |= (prefixes & PREFIX_DATA);
11247 }
11248 }
11249 }
11250 else
11251 {
11252 if (l != 1 || len != 2 || last[0] != 'L')
11253 {
11254 SAVE_LAST (*p);
11255 break;
11256 }
11257 if (intel_syntax
11258 || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
11259 break;
11260 if ((rex & REX_W))
11261 {
11262 USED_REX (REX_W);
11263 *obufp++ = 'q';
11264 }
11265 else
11266 *obufp++ = 'l';
11267 }
11268 break;
11269 case 'R':
11270 USED_REX (REX_W);
11271 if (rex & REX_W)
11272 *obufp++ = 'q';
11273 else if (sizeflag & DFLAG)
11274 {
11275 if (intel_syntax)
11276 *obufp++ = 'd';
11277 else
11278 *obufp++ = 'l';
11279 }
11280 else
11281 *obufp++ = 'w';
11282 if (intel_syntax && !p[1]
11283 && ((rex & REX_W) || (sizeflag & DFLAG)))
11284 *obufp++ = 'e';
11285 if (!(rex & REX_W))
11286 used_prefixes |= (prefixes & PREFIX_DATA);
11287 break;
11288 case 'V':
11289 if (l == 0 && len == 1)
11290 {
11291 if (intel_syntax)
11292 break;
11293 if (address_mode == mode_64bit && (sizeflag & DFLAG))
11294 {
11295 if (sizeflag & SUFFIX_ALWAYS)
11296 *obufp++ = 'q';
11297 break;
11298 }
11299 }
11300 else
11301 {
11302 if (l != 1
11303 || len != 2
11304 || last[0] != 'L')
11305 {
11306 SAVE_LAST (*p);
11307 break;
11308 }
11309
11310 if (rex & REX_W)
11311 {
11312 *obufp++ = 'a';
11313 *obufp++ = 'b';
11314 *obufp++ = 's';
11315 }
11316 }
11317 /* Fall through. */
11318 goto case_S;
11319 case 'S':
11320 if (l == 0 && len == 1)
11321 {
11322 case_S:
11323 if (intel_syntax)
11324 break;
11325 if (sizeflag & SUFFIX_ALWAYS)
11326 {
11327 if (rex & REX_W)
11328 *obufp++ = 'q';
11329 else
11330 {
11331 if (sizeflag & DFLAG)
11332 *obufp++ = 'l';
11333 else
11334 *obufp++ = 'w';
11335 used_prefixes |= (prefixes & PREFIX_DATA);
11336 }
11337 }
11338 }
11339 else
11340 {
11341 if (l != 1
11342 || len != 2
11343 || last[0] != 'L')
11344 {
11345 SAVE_LAST (*p);
11346 break;
11347 }
11348
11349 if (address_mode == mode_64bit
11350 && !(prefixes & PREFIX_ADDR))
11351 {
11352 *obufp++ = 'a';
11353 *obufp++ = 'b';
11354 *obufp++ = 's';
11355 }
11356
11357 goto case_S;
11358 }
11359 break;
11360 case 'X':
11361 if (l != 0 || len != 1)
11362 {
11363 SAVE_LAST (*p);
11364 break;
11365 }
11366 if (need_vex && vex.prefix)
11367 {
11368 if (vex.prefix == DATA_PREFIX_OPCODE)
11369 *obufp++ = 'd';
11370 else
11371 *obufp++ = 's';
11372 }
11373 else
11374 {
11375 if (prefixes & PREFIX_DATA)
11376 *obufp++ = 'd';
11377 else
11378 *obufp++ = 's';
11379 used_prefixes |= (prefixes & PREFIX_DATA);
11380 }
11381 break;
11382 case 'Y':
11383 if (l == 0 && len == 1)
11384 {
11385 if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
11386 break;
11387 if (rex & REX_W)
11388 {
11389 USED_REX (REX_W);
11390 *obufp++ = 'q';
11391 }
11392 break;
11393 }
11394 else
11395 {
11396 if (l != 1 || len != 2 || last[0] != 'X')
11397 {
11398 SAVE_LAST (*p);
11399 break;
11400 }
11401 if (!need_vex)
11402 abort ();
11403 if (intel_syntax
11404 || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
11405 break;
11406 switch (vex.length)
11407 {
11408 case 128:
11409 *obufp++ = 'x';
11410 break;
11411 case 256:
11412 *obufp++ = 'y';
11413 break;
11414 default:
11415 abort ();
11416 }
11417 }
11418 break;
11419 case 'W':
11420 if (l == 0 && len == 1)
11421 {
11422 /* operand size flag for cwtl, cbtw */
11423 USED_REX (REX_W);
11424 if (rex & REX_W)
11425 {
11426 if (intel_syntax)
11427 *obufp++ = 'd';
11428 else
11429 *obufp++ = 'l';
11430 }
11431 else if (sizeflag & DFLAG)
11432 *obufp++ = 'w';
11433 else
11434 *obufp++ = 'b';
11435 if (!(rex & REX_W))
11436 used_prefixes |= (prefixes & PREFIX_DATA);
11437 }
11438 else
11439 {
11440 if (l != 1 || len != 2 || last[0] != 'X')
11441 {
11442 SAVE_LAST (*p);
11443 break;
11444 }
11445 if (!need_vex)
11446 abort ();
11447 *obufp++ = vex.w ? 'd': 's';
11448 }
11449 break;
11450 }
11451 alt = 0;
11452 }
11453 *obufp = 0;
11454 mnemonicendp = obufp;
11455 return 0;
11456 }
11457
11458 static void
11459 oappend (const char *s)
11460 {
11461 obufp = stpcpy (obufp, s);
11462 }
11463
11464 static void
11465 append_seg (void)
11466 {
11467 if (prefixes & PREFIX_CS)
11468 {
11469 used_prefixes |= PREFIX_CS;
11470 oappend ("%cs:" + intel_syntax);
11471 }
11472 if (prefixes & PREFIX_DS)
11473 {
11474 used_prefixes |= PREFIX_DS;
11475 oappend ("%ds:" + intel_syntax);
11476 }
11477 if (prefixes & PREFIX_SS)
11478 {
11479 used_prefixes |= PREFIX_SS;
11480 oappend ("%ss:" + intel_syntax);
11481 }
11482 if (prefixes & PREFIX_ES)
11483 {
11484 used_prefixes |= PREFIX_ES;
11485 oappend ("%es:" + intel_syntax);
11486 }
11487 if (prefixes & PREFIX_FS)
11488 {
11489 used_prefixes |= PREFIX_FS;
11490 oappend ("%fs:" + intel_syntax);
11491 }
11492 if (prefixes & PREFIX_GS)
11493 {
11494 used_prefixes |= PREFIX_GS;
11495 oappend ("%gs:" + intel_syntax);
11496 }
11497 }
11498
11499 static void
11500 OP_indirE (int bytemode, int sizeflag)
11501 {
11502 if (!intel_syntax)
11503 oappend ("*");
11504 OP_E (bytemode, sizeflag);
11505 }
11506
11507 static void
11508 print_operand_value (char *buf, int hex, bfd_vma disp)
11509 {
11510 if (address_mode == mode_64bit)
11511 {
11512 if (hex)
11513 {
11514 char tmp[30];
11515 int i;
11516 buf[0] = '0';
11517 buf[1] = 'x';
11518 sprintf_vma (tmp, disp);
11519 for (i = 0; tmp[i] == '0' && tmp[i + 1]; i++);
11520 strcpy (buf + 2, tmp + i);
11521 }
11522 else
11523 {
11524 bfd_signed_vma v = disp;
11525 char tmp[30];
11526 int i;
11527 if (v < 0)
11528 {
11529 *(buf++) = '-';
11530 v = -disp;
11531 /* Check for possible overflow on 0x8000000000000000. */
11532 if (v < 0)
11533 {
11534 strcpy (buf, "9223372036854775808");
11535 return;
11536 }
11537 }
11538 if (!v)
11539 {
11540 strcpy (buf, "0");
11541 return;
11542 }
11543
11544 i = 0;
11545 tmp[29] = 0;
11546 while (v)
11547 {
11548 tmp[28 - i] = (v % 10) + '0';
11549 v /= 10;
11550 i++;
11551 }
11552 strcpy (buf, tmp + 29 - i);
11553 }
11554 }
11555 else
11556 {
11557 if (hex)
11558 sprintf (buf, "0x%x", (unsigned int) disp);
11559 else
11560 sprintf (buf, "%d", (int) disp);
11561 }
11562 }
11563
11564 /* Put DISP in BUF as signed hex number. */
11565
11566 static void
11567 print_displacement (char *buf, bfd_vma disp)
11568 {
11569 bfd_signed_vma val = disp;
11570 char tmp[30];
11571 int i, j = 0;
11572
11573 if (val < 0)
11574 {
11575 buf[j++] = '-';
11576 val = -disp;
11577
11578 /* Check for possible overflow. */
11579 if (val < 0)
11580 {
11581 switch (address_mode)
11582 {
11583 case mode_64bit:
11584 strcpy (buf + j, "0x8000000000000000");
11585 break;
11586 case mode_32bit:
11587 strcpy (buf + j, "0x80000000");
11588 break;
11589 case mode_16bit:
11590 strcpy (buf + j, "0x8000");
11591 break;
11592 }
11593 return;
11594 }
11595 }
11596
11597 buf[j++] = '0';
11598 buf[j++] = 'x';
11599
11600 sprintf_vma (tmp, (bfd_vma) val);
11601 for (i = 0; tmp[i] == '0'; i++)
11602 continue;
11603 if (tmp[i] == '\0')
11604 i--;
11605 strcpy (buf + j, tmp + i);
11606 }
11607
11608 static void
11609 intel_operand_size (int bytemode, int sizeflag)
11610 {
11611 switch (bytemode)
11612 {
11613 case b_mode:
11614 case b_swap_mode:
11615 case dqb_mode:
11616 oappend ("BYTE PTR ");
11617 break;
11618 case w_mode:
11619 case dqw_mode:
11620 oappend ("WORD PTR ");
11621 break;
11622 case stack_v_mode:
11623 if (address_mode == mode_64bit && (sizeflag & DFLAG))
11624 {
11625 oappend ("QWORD PTR ");
11626 break;
11627 }
11628 /* FALLTHRU */
11629 case v_mode:
11630 case v_swap_mode:
11631 case dq_mode:
11632 USED_REX (REX_W);
11633 if (rex & REX_W)
11634 oappend ("QWORD PTR ");
11635 else
11636 {
11637 if ((sizeflag & DFLAG) || bytemode == dq_mode)
11638 oappend ("DWORD PTR ");
11639 else
11640 oappend ("WORD PTR ");
11641 used_prefixes |= (prefixes & PREFIX_DATA);
11642 }
11643 break;
11644 case z_mode:
11645 if ((rex & REX_W) || (sizeflag & DFLAG))
11646 *obufp++ = 'D';
11647 oappend ("WORD PTR ");
11648 if (!(rex & REX_W))
11649 used_prefixes |= (prefixes & PREFIX_DATA);
11650 break;
11651 case a_mode:
11652 if (sizeflag & DFLAG)
11653 oappend ("QWORD PTR ");
11654 else
11655 oappend ("DWORD PTR ");
11656 used_prefixes |= (prefixes & PREFIX_DATA);
11657 break;
11658 case d_mode:
11659 case d_swap_mode:
11660 case dqd_mode:
11661 oappend ("DWORD PTR ");
11662 break;
11663 case q_mode:
11664 case q_swap_mode:
11665 oappend ("QWORD PTR ");
11666 break;
11667 case m_mode:
11668 if (address_mode == mode_64bit)
11669 oappend ("QWORD PTR ");
11670 else
11671 oappend ("DWORD PTR ");
11672 break;
11673 case f_mode:
11674 if (sizeflag & DFLAG)
11675 oappend ("FWORD PTR ");
11676 else
11677 oappend ("DWORD PTR ");
11678 used_prefixes |= (prefixes & PREFIX_DATA);
11679 break;
11680 case t_mode:
11681 oappend ("TBYTE PTR ");
11682 break;
11683 case x_mode:
11684 case x_swap_mode:
11685 if (need_vex)
11686 {
11687 switch (vex.length)
11688 {
11689 case 128:
11690 oappend ("XMMWORD PTR ");
11691 break;
11692 case 256:
11693 oappend ("YMMWORD PTR ");
11694 break;
11695 default:
11696 abort ();
11697 }
11698 }
11699 else
11700 oappend ("XMMWORD PTR ");
11701 break;
11702 case xmm_mode:
11703 oappend ("XMMWORD PTR ");
11704 break;
11705 case xmmq_mode:
11706 if (!need_vex)
11707 abort ();
11708
11709 switch (vex.length)
11710 {
11711 case 128:
11712 oappend ("QWORD PTR ");
11713 break;
11714 case 256:
11715 oappend ("XMMWORD PTR ");
11716 break;
11717 default:
11718 abort ();
11719 }
11720 break;
11721 case ymmq_mode:
11722 if (!need_vex)
11723 abort ();
11724
11725 switch (vex.length)
11726 {
11727 case 128:
11728 oappend ("QWORD PTR ");
11729 break;
11730 case 256:
11731 oappend ("YMMWORD PTR ");
11732 break;
11733 default:
11734 abort ();
11735 }
11736 break;
11737 case o_mode:
11738 oappend ("OWORD PTR ");
11739 break;
11740 case vex_w_dq_mode:
11741 if (!need_vex)
11742 abort ();
11743
11744 if (vex.w)
11745 oappend ("QWORD PTR ");
11746 else
11747 oappend ("DWORD PTR ");
11748 break;
11749 default:
11750 break;
11751 }
11752 }
11753
11754 static void
11755 OP_E_register (int bytemode, int sizeflag)
11756 {
11757 int reg = modrm.rm;
11758 const char **names;
11759
11760 USED_REX (REX_B);
11761 if ((rex & REX_B))
11762 reg += 8;
11763
11764 if ((sizeflag & SUFFIX_ALWAYS)
11765 && (bytemode == b_swap_mode || bytemode == v_swap_mode))
11766 swap_operand ();
11767
11768 switch (bytemode)
11769 {
11770 case b_mode:
11771 case b_swap_mode:
11772 USED_REX (0);
11773 if (rex)
11774 names = names8rex;
11775 else
11776 names = names8;
11777 break;
11778 case w_mode:
11779 names = names16;
11780 break;
11781 case d_mode:
11782 names = names32;
11783 break;
11784 case q_mode:
11785 names = names64;
11786 break;
11787 case m_mode:
11788 names = address_mode == mode_64bit ? names64 : names32;
11789 break;
11790 case stack_v_mode:
11791 if (address_mode == mode_64bit && (sizeflag & DFLAG))
11792 {
11793 names = names64;
11794 break;
11795 }
11796 bytemode = v_mode;
11797 /* FALLTHRU */
11798 case v_mode:
11799 case v_swap_mode:
11800 case dq_mode:
11801 case dqb_mode:
11802 case dqd_mode:
11803 case dqw_mode:
11804 USED_REX (REX_W);
11805 if (rex & REX_W)
11806 names = names64;
11807 else
11808 {
11809 if ((sizeflag & DFLAG)
11810 || (bytemode != v_mode
11811 && bytemode != v_swap_mode))
11812 names = names32;
11813 else
11814 names = names16;
11815 used_prefixes |= (prefixes & PREFIX_DATA);
11816 }
11817 break;
11818 case 0:
11819 return;
11820 default:
11821 oappend (INTERNAL_DISASSEMBLER_ERROR);
11822 return;
11823 }
11824 oappend (names[reg]);
11825 }
11826
11827 static void
11828 OP_E_memory (int bytemode, int sizeflag)
11829 {
11830 bfd_vma disp = 0;
11831 int add = (rex & REX_B) ? 8 : 0;
11832 int riprel = 0;
11833
11834 USED_REX (REX_B);
11835 if (intel_syntax)
11836 intel_operand_size (bytemode, sizeflag);
11837 append_seg ();
11838
11839 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
11840 {
11841 /* 32/64 bit address mode */
11842 int havedisp;
11843 int havesib;
11844 int havebase;
11845 int haveindex;
11846 int needindex;
11847 int base, rbase;
11848 int index = 0;
11849 int scale = 0;
11850
11851 havesib = 0;
11852 havebase = 1;
11853 haveindex = 0;
11854 base = modrm.rm;
11855
11856 if (base == 4)
11857 {
11858 havesib = 1;
11859 FETCH_DATA (the_info, codep + 1);
11860 index = (*codep >> 3) & 7;
11861 scale = (*codep >> 6) & 3;
11862 base = *codep & 7;
11863 USED_REX (REX_X);
11864 if (rex & REX_X)
11865 index += 8;
11866 haveindex = index != 4;
11867 codep++;
11868 }
11869 rbase = base + add;
11870
11871 switch (modrm.mod)
11872 {
11873 case 0:
11874 if (base == 5)
11875 {
11876 havebase = 0;
11877 if (address_mode == mode_64bit && !havesib)
11878 riprel = 1;
11879 disp = get32s ();
11880 }
11881 break;
11882 case 1:
11883 FETCH_DATA (the_info, codep + 1);
11884 disp = *codep++;
11885 if ((disp & 0x80) != 0)
11886 disp -= 0x100;
11887 break;
11888 case 2:
11889 disp = get32s ();
11890 break;
11891 }
11892
11893 /* In 32bit mode, we need index register to tell [offset] from
11894 [eiz*1 + offset]. */
11895 needindex = (havesib
11896 && !havebase
11897 && !haveindex
11898 && address_mode == mode_32bit);
11899 havedisp = (havebase
11900 || needindex
11901 || (havesib && (haveindex || scale != 0)));
11902
11903 if (!intel_syntax)
11904 if (modrm.mod != 0 || base == 5)
11905 {
11906 if (havedisp || riprel)
11907 print_displacement (scratchbuf, disp);
11908 else
11909 print_operand_value (scratchbuf, 1, disp);
11910 oappend (scratchbuf);
11911 if (riprel)
11912 {
11913 set_op (disp, 1);
11914 oappend (sizeflag & AFLAG ? "(%rip)" : "(%eip)");
11915 }
11916 }
11917
11918 if (havebase || haveindex || riprel)
11919 used_prefixes |= PREFIX_ADDR;
11920
11921 if (havedisp || (intel_syntax && riprel))
11922 {
11923 *obufp++ = open_char;
11924 if (intel_syntax && riprel)
11925 {
11926 set_op (disp, 1);
11927 oappend (sizeflag & AFLAG ? "rip" : "eip");
11928 }
11929 *obufp = '\0';
11930 if (havebase)
11931 oappend (address_mode == mode_64bit && (sizeflag & AFLAG)
11932 ? names64[rbase] : names32[rbase]);
11933 if (havesib)
11934 {
11935 /* ESP/RSP won't allow index. If base isn't ESP/RSP,
11936 print index to tell base + index from base. */
11937 if (scale != 0
11938 || needindex
11939 || haveindex
11940 || (havebase && base != ESP_REG_NUM))
11941 {
11942 if (!intel_syntax || havebase)
11943 {
11944 *obufp++ = separator_char;
11945 *obufp = '\0';
11946 }
11947 if (haveindex)
11948 oappend (address_mode == mode_64bit
11949 && (sizeflag & AFLAG)
11950 ? names64[index] : names32[index]);
11951 else
11952 oappend (address_mode == mode_64bit
11953 && (sizeflag & AFLAG)
11954 ? index64 : index32);
11955
11956 *obufp++ = scale_char;
11957 *obufp = '\0';
11958 sprintf (scratchbuf, "%d", 1 << scale);
11959 oappend (scratchbuf);
11960 }
11961 }
11962 if (intel_syntax
11963 && (disp || modrm.mod != 0 || base == 5))
11964 {
11965 if (!havedisp || (bfd_signed_vma) disp >= 0)
11966 {
11967 *obufp++ = '+';
11968 *obufp = '\0';
11969 }
11970 else if (modrm.mod != 1 && disp != -disp)
11971 {
11972 *obufp++ = '-';
11973 *obufp = '\0';
11974 disp = - (bfd_signed_vma) disp;
11975 }
11976
11977 if (havedisp)
11978 print_displacement (scratchbuf, disp);
11979 else
11980 print_operand_value (scratchbuf, 1, disp);
11981 oappend (scratchbuf);
11982 }
11983
11984 *obufp++ = close_char;
11985 *obufp = '\0';
11986 }
11987 else if (intel_syntax)
11988 {
11989 if (modrm.mod != 0 || base == 5)
11990 {
11991 if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
11992 | PREFIX_ES | PREFIX_FS | PREFIX_GS))
11993 ;
11994 else
11995 {
11996 oappend (names_seg[ds_reg - es_reg]);
11997 oappend (":");
11998 }
11999 print_operand_value (scratchbuf, 1, disp);
12000 oappend (scratchbuf);
12001 }
12002 }
12003 }
12004 else
12005 {
12006 /* 16 bit address mode */
12007 used_prefixes |= prefixes & PREFIX_ADDR;
12008 switch (modrm.mod)
12009 {
12010 case 0:
12011 if (modrm.rm == 6)
12012 {
12013 disp = get16 ();
12014 if ((disp & 0x8000) != 0)
12015 disp -= 0x10000;
12016 }
12017 break;
12018 case 1:
12019 FETCH_DATA (the_info, codep + 1);
12020 disp = *codep++;
12021 if ((disp & 0x80) != 0)
12022 disp -= 0x100;
12023 break;
12024 case 2:
12025 disp = get16 ();
12026 if ((disp & 0x8000) != 0)
12027 disp -= 0x10000;
12028 break;
12029 }
12030
12031 if (!intel_syntax)
12032 if (modrm.mod != 0 || modrm.rm == 6)
12033 {
12034 print_displacement (scratchbuf, disp);
12035 oappend (scratchbuf);
12036 }
12037
12038 if (modrm.mod != 0 || modrm.rm != 6)
12039 {
12040 *obufp++ = open_char;
12041 *obufp = '\0';
12042 oappend (index16[modrm.rm]);
12043 if (intel_syntax
12044 && (disp || modrm.mod != 0 || modrm.rm == 6))
12045 {
12046 if ((bfd_signed_vma) disp >= 0)
12047 {
12048 *obufp++ = '+';
12049 *obufp = '\0';
12050 }
12051 else if (modrm.mod != 1)
12052 {
12053 *obufp++ = '-';
12054 *obufp = '\0';
12055 disp = - (bfd_signed_vma) disp;
12056 }
12057
12058 print_displacement (scratchbuf, disp);
12059 oappend (scratchbuf);
12060 }
12061
12062 *obufp++ = close_char;
12063 *obufp = '\0';
12064 }
12065 else if (intel_syntax)
12066 {
12067 if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
12068 | PREFIX_ES | PREFIX_FS | PREFIX_GS))
12069 ;
12070 else
12071 {
12072 oappend (names_seg[ds_reg - es_reg]);
12073 oappend (":");
12074 }
12075 print_operand_value (scratchbuf, 1, disp & 0xffff);
12076 oappend (scratchbuf);
12077 }
12078 }
12079 }
12080
12081 static void
12082 OP_E (int bytemode, int sizeflag)
12083 {
12084 /* Skip mod/rm byte. */
12085 MODRM_CHECK;
12086 codep++;
12087
12088 if (modrm.mod == 3)
12089 OP_E_register (bytemode, sizeflag);
12090 else
12091 OP_E_memory (bytemode, sizeflag);
12092 }
12093
12094 static void
12095 OP_G (int bytemode, int sizeflag)
12096 {
12097 int add = 0;
12098 USED_REX (REX_R);
12099 if (rex & REX_R)
12100 add += 8;
12101 switch (bytemode)
12102 {
12103 case b_mode:
12104 USED_REX (0);
12105 if (rex)
12106 oappend (names8rex[modrm.reg + add]);
12107 else
12108 oappend (names8[modrm.reg + add]);
12109 break;
12110 case w_mode:
12111 oappend (names16[modrm.reg + add]);
12112 break;
12113 case d_mode:
12114 oappend (names32[modrm.reg + add]);
12115 break;
12116 case q_mode:
12117 oappend (names64[modrm.reg + add]);
12118 break;
12119 case v_mode:
12120 case dq_mode:
12121 case dqb_mode:
12122 case dqd_mode:
12123 case dqw_mode:
12124 USED_REX (REX_W);
12125 if (rex & REX_W)
12126 oappend (names64[modrm.reg + add]);
12127 else
12128 {
12129 if ((sizeflag & DFLAG) || bytemode != v_mode)
12130 oappend (names32[modrm.reg + add]);
12131 else
12132 oappend (names16[modrm.reg + add]);
12133 used_prefixes |= (prefixes & PREFIX_DATA);
12134 }
12135 break;
12136 case m_mode:
12137 if (address_mode == mode_64bit)
12138 oappend (names64[modrm.reg + add]);
12139 else
12140 oappend (names32[modrm.reg + add]);
12141 break;
12142 default:
12143 oappend (INTERNAL_DISASSEMBLER_ERROR);
12144 break;
12145 }
12146 }
12147
12148 static bfd_vma
12149 get64 (void)
12150 {
12151 bfd_vma x;
12152 #ifdef BFD64
12153 unsigned int a;
12154 unsigned int b;
12155
12156 FETCH_DATA (the_info, codep + 8);
12157 a = *codep++ & 0xff;
12158 a |= (*codep++ & 0xff) << 8;
12159 a |= (*codep++ & 0xff) << 16;
12160 a |= (*codep++ & 0xff) << 24;
12161 b = *codep++ & 0xff;
12162 b |= (*codep++ & 0xff) << 8;
12163 b |= (*codep++ & 0xff) << 16;
12164 b |= (*codep++ & 0xff) << 24;
12165 x = a + ((bfd_vma) b << 32);
12166 #else
12167 abort ();
12168 x = 0;
12169 #endif
12170 return x;
12171 }
12172
12173 static bfd_signed_vma
12174 get32 (void)
12175 {
12176 bfd_signed_vma x = 0;
12177
12178 FETCH_DATA (the_info, codep + 4);
12179 x = *codep++ & (bfd_signed_vma) 0xff;
12180 x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
12181 x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
12182 x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
12183 return x;
12184 }
12185
12186 static bfd_signed_vma
12187 get32s (void)
12188 {
12189 bfd_signed_vma x = 0;
12190
12191 FETCH_DATA (the_info, codep + 4);
12192 x = *codep++ & (bfd_signed_vma) 0xff;
12193 x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
12194 x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
12195 x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
12196
12197 x = (x ^ ((bfd_signed_vma) 1 << 31)) - ((bfd_signed_vma) 1 << 31);
12198
12199 return x;
12200 }
12201
12202 static int
12203 get16 (void)
12204 {
12205 int x = 0;
12206
12207 FETCH_DATA (the_info, codep + 2);
12208 x = *codep++ & 0xff;
12209 x |= (*codep++ & 0xff) << 8;
12210 return x;
12211 }
12212
12213 static void
12214 set_op (bfd_vma op, int riprel)
12215 {
12216 op_index[op_ad] = op_ad;
12217 if (address_mode == mode_64bit)
12218 {
12219 op_address[op_ad] = op;
12220 op_riprel[op_ad] = riprel;
12221 }
12222 else
12223 {
12224 /* Mask to get a 32-bit address. */
12225 op_address[op_ad] = op & 0xffffffff;
12226 op_riprel[op_ad] = riprel & 0xffffffff;
12227 }
12228 }
12229
12230 static void
12231 OP_REG (int code, int sizeflag)
12232 {
12233 const char *s;
12234 int add;
12235 USED_REX (REX_B);
12236 if (rex & REX_B)
12237 add = 8;
12238 else
12239 add = 0;
12240
12241 switch (code)
12242 {
12243 case ax_reg: case cx_reg: case dx_reg: case bx_reg:
12244 case sp_reg: case bp_reg: case si_reg: case di_reg:
12245 s = names16[code - ax_reg + add];
12246 break;
12247 case es_reg: case ss_reg: case cs_reg:
12248 case ds_reg: case fs_reg: case gs_reg:
12249 s = names_seg[code - es_reg + add];
12250 break;
12251 case al_reg: case ah_reg: case cl_reg: case ch_reg:
12252 case dl_reg: case dh_reg: case bl_reg: case bh_reg:
12253 USED_REX (0);
12254 if (rex)
12255 s = names8rex[code - al_reg + add];
12256 else
12257 s = names8[code - al_reg];
12258 break;
12259 case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
12260 case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
12261 if (address_mode == mode_64bit && (sizeflag & DFLAG))
12262 {
12263 s = names64[code - rAX_reg + add];
12264 break;
12265 }
12266 code += eAX_reg - rAX_reg;
12267 /* Fall through. */
12268 case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
12269 case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
12270 USED_REX (REX_W);
12271 if (rex & REX_W)
12272 s = names64[code - eAX_reg + add];
12273 else
12274 {
12275 if (sizeflag & DFLAG)
12276 s = names32[code - eAX_reg + add];
12277 else
12278 s = names16[code - eAX_reg + add];
12279 used_prefixes |= (prefixes & PREFIX_DATA);
12280 }
12281 break;
12282 default:
12283 s = INTERNAL_DISASSEMBLER_ERROR;
12284 break;
12285 }
12286 oappend (s);
12287 }
12288
12289 static void
12290 OP_IMREG (int code, int sizeflag)
12291 {
12292 const char *s;
12293
12294 switch (code)
12295 {
12296 case indir_dx_reg:
12297 if (intel_syntax)
12298 s = "dx";
12299 else
12300 s = "(%dx)";
12301 break;
12302 case ax_reg: case cx_reg: case dx_reg: case bx_reg:
12303 case sp_reg: case bp_reg: case si_reg: case di_reg:
12304 s = names16[code - ax_reg];
12305 break;
12306 case es_reg: case ss_reg: case cs_reg:
12307 case ds_reg: case fs_reg: case gs_reg:
12308 s = names_seg[code - es_reg];
12309 break;
12310 case al_reg: case ah_reg: case cl_reg: case ch_reg:
12311 case dl_reg: case dh_reg: case bl_reg: case bh_reg:
12312 USED_REX (0);
12313 if (rex)
12314 s = names8rex[code - al_reg];
12315 else
12316 s = names8[code - al_reg];
12317 break;
12318 case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
12319 case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
12320 USED_REX (REX_W);
12321 if (rex & REX_W)
12322 s = names64[code - eAX_reg];
12323 else
12324 {
12325 if (sizeflag & DFLAG)
12326 s = names32[code - eAX_reg];
12327 else
12328 s = names16[code - eAX_reg];
12329 used_prefixes |= (prefixes & PREFIX_DATA);
12330 }
12331 break;
12332 case z_mode_ax_reg:
12333 if ((rex & REX_W) || (sizeflag & DFLAG))
12334 s = *names32;
12335 else
12336 s = *names16;
12337 if (!(rex & REX_W))
12338 used_prefixes |= (prefixes & PREFIX_DATA);
12339 break;
12340 default:
12341 s = INTERNAL_DISASSEMBLER_ERROR;
12342 break;
12343 }
12344 oappend (s);
12345 }
12346
12347 static void
12348 OP_I (int bytemode, int sizeflag)
12349 {
12350 bfd_signed_vma op;
12351 bfd_signed_vma mask = -1;
12352
12353 switch (bytemode)
12354 {
12355 case b_mode:
12356 FETCH_DATA (the_info, codep + 1);
12357 op = *codep++;
12358 mask = 0xff;
12359 break;
12360 case q_mode:
12361 if (address_mode == mode_64bit)
12362 {
12363 op = get32s ();
12364 break;
12365 }
12366 /* Fall through. */
12367 case v_mode:
12368 USED_REX (REX_W);
12369 if (rex & REX_W)
12370 op = get32s ();
12371 else
12372 {
12373 if (sizeflag & DFLAG)
12374 {
12375 op = get32 ();
12376 mask = 0xffffffff;
12377 }
12378 else
12379 {
12380 op = get16 ();
12381 mask = 0xfffff;
12382 }
12383 used_prefixes |= (prefixes & PREFIX_DATA);
12384 }
12385 break;
12386 case w_mode:
12387 mask = 0xfffff;
12388 op = get16 ();
12389 break;
12390 case const_1_mode:
12391 if (intel_syntax)
12392 oappend ("1");
12393 return;
12394 default:
12395 oappend (INTERNAL_DISASSEMBLER_ERROR);
12396 return;
12397 }
12398
12399 op &= mask;
12400 scratchbuf[0] = '$';
12401 print_operand_value (scratchbuf + 1, 1, op);
12402 oappend (scratchbuf + intel_syntax);
12403 scratchbuf[0] = '\0';
12404 }
12405
12406 static void
12407 OP_I64 (int bytemode, int sizeflag)
12408 {
12409 bfd_signed_vma op;
12410 bfd_signed_vma mask = -1;
12411
12412 if (address_mode != mode_64bit)
12413 {
12414 OP_I (bytemode, sizeflag);
12415 return;
12416 }
12417
12418 switch (bytemode)
12419 {
12420 case b_mode:
12421 FETCH_DATA (the_info, codep + 1);
12422 op = *codep++;
12423 mask = 0xff;
12424 break;
12425 case v_mode:
12426 USED_REX (REX_W);
12427 if (rex & REX_W)
12428 op = get64 ();
12429 else
12430 {
12431 if (sizeflag & DFLAG)
12432 {
12433 op = get32 ();
12434 mask = 0xffffffff;
12435 }
12436 else
12437 {
12438 op = get16 ();
12439 mask = 0xfffff;
12440 }
12441 used_prefixes |= (prefixes & PREFIX_DATA);
12442 }
12443 break;
12444 case w_mode:
12445 mask = 0xfffff;
12446 op = get16 ();
12447 break;
12448 default:
12449 oappend (INTERNAL_DISASSEMBLER_ERROR);
12450 return;
12451 }
12452
12453 op &= mask;
12454 scratchbuf[0] = '$';
12455 print_operand_value (scratchbuf + 1, 1, op);
12456 oappend (scratchbuf + intel_syntax);
12457 scratchbuf[0] = '\0';
12458 }
12459
12460 static void
12461 OP_sI (int bytemode, int sizeflag)
12462 {
12463 bfd_signed_vma op;
12464 bfd_signed_vma mask = -1;
12465
12466 switch (bytemode)
12467 {
12468 case b_mode:
12469 FETCH_DATA (the_info, codep + 1);
12470 op = *codep++;
12471 if ((op & 0x80) != 0)
12472 op -= 0x100;
12473 mask = 0xffffffff;
12474 break;
12475 case v_mode:
12476 USED_REX (REX_W);
12477 if (rex & REX_W)
12478 op = get32s ();
12479 else
12480 {
12481 if (sizeflag & DFLAG)
12482 {
12483 op = get32s ();
12484 mask = 0xffffffff;
12485 }
12486 else
12487 {
12488 mask = 0xffffffff;
12489 op = get16 ();
12490 if ((op & 0x8000) != 0)
12491 op -= 0x10000;
12492 }
12493 used_prefixes |= (prefixes & PREFIX_DATA);
12494 }
12495 break;
12496 case w_mode:
12497 op = get16 ();
12498 mask = 0xffffffff;
12499 if ((op & 0x8000) != 0)
12500 op -= 0x10000;
12501 break;
12502 default:
12503 oappend (INTERNAL_DISASSEMBLER_ERROR);
12504 return;
12505 }
12506
12507 scratchbuf[0] = '$';
12508 print_operand_value (scratchbuf + 1, 1, op);
12509 oappend (scratchbuf + intel_syntax);
12510 }
12511
12512 static void
12513 OP_J (int bytemode, int sizeflag)
12514 {
12515 bfd_vma disp;
12516 bfd_vma mask = -1;
12517 bfd_vma segment = 0;
12518
12519 switch (bytemode)
12520 {
12521 case b_mode:
12522 FETCH_DATA (the_info, codep + 1);
12523 disp = *codep++;
12524 if ((disp & 0x80) != 0)
12525 disp -= 0x100;
12526 break;
12527 case v_mode:
12528 USED_REX (REX_W);
12529 if ((sizeflag & DFLAG) || (rex & REX_W))
12530 disp = get32s ();
12531 else
12532 {
12533 disp = get16 ();
12534 if ((disp & 0x8000) != 0)
12535 disp -= 0x10000;
12536 /* In 16bit mode, address is wrapped around at 64k within
12537 the same segment. Otherwise, a data16 prefix on a jump
12538 instruction means that the pc is masked to 16 bits after
12539 the displacement is added! */
12540 mask = 0xffff;
12541 if ((prefixes & PREFIX_DATA) == 0)
12542 segment = ((start_pc + codep - start_codep)
12543 & ~((bfd_vma) 0xffff));
12544 }
12545 if (!(rex & REX_W))
12546 used_prefixes |= (prefixes & PREFIX_DATA);
12547 break;
12548 default:
12549 oappend (INTERNAL_DISASSEMBLER_ERROR);
12550 return;
12551 }
12552 disp = ((start_pc + codep - start_codep + disp) & mask) | segment;
12553 set_op (disp, 0);
12554 print_operand_value (scratchbuf, 1, disp);
12555 oappend (scratchbuf);
12556 }
12557
12558 static void
12559 OP_SEG (int bytemode, int sizeflag)
12560 {
12561 if (bytemode == w_mode)
12562 oappend (names_seg[modrm.reg]);
12563 else
12564 OP_E (modrm.mod == 3 ? bytemode : w_mode, sizeflag);
12565 }
12566
12567 static void
12568 OP_DIR (int dummy ATTRIBUTE_UNUSED, int sizeflag)
12569 {
12570 int seg, offset;
12571
12572 if (sizeflag & DFLAG)
12573 {
12574 offset = get32 ();
12575 seg = get16 ();
12576 }
12577 else
12578 {
12579 offset = get16 ();
12580 seg = get16 ();
12581 }
12582 used_prefixes |= (prefixes & PREFIX_DATA);
12583 if (intel_syntax)
12584 sprintf (scratchbuf, "0x%x:0x%x", seg, offset);
12585 else
12586 sprintf (scratchbuf, "$0x%x,$0x%x", seg, offset);
12587 oappend (scratchbuf);
12588 }
12589
12590 static void
12591 OP_OFF (int bytemode, int sizeflag)
12592 {
12593 bfd_vma off;
12594
12595 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
12596 intel_operand_size (bytemode, sizeflag);
12597 append_seg ();
12598
12599 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
12600 off = get32 ();
12601 else
12602 off = get16 ();
12603
12604 if (intel_syntax)
12605 {
12606 if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
12607 | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
12608 {
12609 oappend (names_seg[ds_reg - es_reg]);
12610 oappend (":");
12611 }
12612 }
12613 print_operand_value (scratchbuf, 1, off);
12614 oappend (scratchbuf);
12615 }
12616
12617 static void
12618 OP_OFF64 (int bytemode, int sizeflag)
12619 {
12620 bfd_vma off;
12621
12622 if (address_mode != mode_64bit
12623 || (prefixes & PREFIX_ADDR))
12624 {
12625 OP_OFF (bytemode, sizeflag);
12626 return;
12627 }
12628
12629 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
12630 intel_operand_size (bytemode, sizeflag);
12631 append_seg ();
12632
12633 off = get64 ();
12634
12635 if (intel_syntax)
12636 {
12637 if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
12638 | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
12639 {
12640 oappend (names_seg[ds_reg - es_reg]);
12641 oappend (":");
12642 }
12643 }
12644 print_operand_value (scratchbuf, 1, off);
12645 oappend (scratchbuf);
12646 }
12647
12648 static void
12649 ptr_reg (int code, int sizeflag)
12650 {
12651 const char *s;
12652
12653 *obufp++ = open_char;
12654 used_prefixes |= (prefixes & PREFIX_ADDR);
12655 if (address_mode == mode_64bit)
12656 {
12657 if (!(sizeflag & AFLAG))
12658 s = names32[code - eAX_reg];
12659 else
12660 s = names64[code - eAX_reg];
12661 }
12662 else if (sizeflag & AFLAG)
12663 s = names32[code - eAX_reg];
12664 else
12665 s = names16[code - eAX_reg];
12666 oappend (s);
12667 *obufp++ = close_char;
12668 *obufp = 0;
12669 }
12670
12671 static void
12672 OP_ESreg (int code, int sizeflag)
12673 {
12674 if (intel_syntax)
12675 {
12676 switch (codep[-1])
12677 {
12678 case 0x6d: /* insw/insl */
12679 intel_operand_size (z_mode, sizeflag);
12680 break;
12681 case 0xa5: /* movsw/movsl/movsq */
12682 case 0xa7: /* cmpsw/cmpsl/cmpsq */
12683 case 0xab: /* stosw/stosl */
12684 case 0xaf: /* scasw/scasl */
12685 intel_operand_size (v_mode, sizeflag);
12686 break;
12687 default:
12688 intel_operand_size (b_mode, sizeflag);
12689 }
12690 }
12691 oappend ("%es:" + intel_syntax);
12692 ptr_reg (code, sizeflag);
12693 }
12694
12695 static void
12696 OP_DSreg (int code, int sizeflag)
12697 {
12698 if (intel_syntax)
12699 {
12700 switch (codep[-1])
12701 {
12702 case 0x6f: /* outsw/outsl */
12703 intel_operand_size (z_mode, sizeflag);
12704 break;
12705 case 0xa5: /* movsw/movsl/movsq */
12706 case 0xa7: /* cmpsw/cmpsl/cmpsq */
12707 case 0xad: /* lodsw/lodsl/lodsq */
12708 intel_operand_size (v_mode, sizeflag);
12709 break;
12710 default:
12711 intel_operand_size (b_mode, sizeflag);
12712 }
12713 }
12714 if ((prefixes
12715 & (PREFIX_CS
12716 | PREFIX_DS
12717 | PREFIX_SS
12718 | PREFIX_ES
12719 | PREFIX_FS
12720 | PREFIX_GS)) == 0)
12721 prefixes |= PREFIX_DS;
12722 append_seg ();
12723 ptr_reg (code, sizeflag);
12724 }
12725
12726 static void
12727 OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12728 {
12729 int add;
12730 if (rex & REX_R)
12731 {
12732 USED_REX (REX_R);
12733 add = 8;
12734 }
12735 else if (address_mode != mode_64bit && (prefixes & PREFIX_LOCK))
12736 {
12737 all_prefixes[last_lock_prefix] = 0;
12738 used_prefixes |= PREFIX_LOCK;
12739 add = 8;
12740 }
12741 else
12742 add = 0;
12743 sprintf (scratchbuf, "%%cr%d", modrm.reg + add);
12744 oappend (scratchbuf + intel_syntax);
12745 }
12746
12747 static void
12748 OP_D (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12749 {
12750 int add;
12751 USED_REX (REX_R);
12752 if (rex & REX_R)
12753 add = 8;
12754 else
12755 add = 0;
12756 if (intel_syntax)
12757 sprintf (scratchbuf, "db%d", modrm.reg + add);
12758 else
12759 sprintf (scratchbuf, "%%db%d", modrm.reg + add);
12760 oappend (scratchbuf);
12761 }
12762
12763 static void
12764 OP_T (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12765 {
12766 sprintf (scratchbuf, "%%tr%d", modrm.reg);
12767 oappend (scratchbuf + intel_syntax);
12768 }
12769
12770 static void
12771 OP_R (int bytemode, int sizeflag)
12772 {
12773 if (modrm.mod == 3)
12774 OP_E (bytemode, sizeflag);
12775 else
12776 BadOp ();
12777 }
12778
12779 static void
12780 OP_MMX (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12781 {
12782 used_prefixes |= (prefixes & PREFIX_DATA);
12783 if (prefixes & PREFIX_DATA)
12784 {
12785 int add;
12786 USED_REX (REX_R);
12787 if (rex & REX_R)
12788 add = 8;
12789 else
12790 add = 0;
12791 sprintf (scratchbuf, "%%xmm%d", modrm.reg + add);
12792 }
12793 else
12794 sprintf (scratchbuf, "%%mm%d", modrm.reg);
12795 oappend (scratchbuf + intel_syntax);
12796 }
12797
12798 static void
12799 OP_XMM (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
12800 {
12801 int add;
12802 USED_REX (REX_R);
12803 if (rex & REX_R)
12804 add = 8;
12805 else
12806 add = 0;
12807 if (need_vex && bytemode != xmm_mode)
12808 {
12809 switch (vex.length)
12810 {
12811 case 128:
12812 sprintf (scratchbuf, "%%xmm%d", modrm.reg + add);
12813 break;
12814 case 256:
12815 sprintf (scratchbuf, "%%ymm%d", modrm.reg + add);
12816 break;
12817 default:
12818 abort ();
12819 }
12820 }
12821 else
12822 sprintf (scratchbuf, "%%xmm%d", modrm.reg + add);
12823 oappend (scratchbuf + intel_syntax);
12824 }
12825
12826 static void
12827 OP_EM (int bytemode, int sizeflag)
12828 {
12829 if (modrm.mod != 3)
12830 {
12831 if (intel_syntax
12832 && (bytemode == v_mode || bytemode == v_swap_mode))
12833 {
12834 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
12835 used_prefixes |= (prefixes & PREFIX_DATA);
12836 }
12837 OP_E (bytemode, sizeflag);
12838 return;
12839 }
12840
12841 if ((sizeflag & SUFFIX_ALWAYS) && bytemode == v_swap_mode)
12842 swap_operand ();
12843
12844 /* Skip mod/rm byte. */
12845 MODRM_CHECK;
12846 codep++;
12847 used_prefixes |= (prefixes & PREFIX_DATA);
12848 if (prefixes & PREFIX_DATA)
12849 {
12850 int add;
12851
12852 USED_REX (REX_B);
12853 if (rex & REX_B)
12854 add = 8;
12855 else
12856 add = 0;
12857 sprintf (scratchbuf, "%%xmm%d", modrm.rm + add);
12858 }
12859 else
12860 sprintf (scratchbuf, "%%mm%d", modrm.rm);
12861 oappend (scratchbuf + intel_syntax);
12862 }
12863
12864 /* cvt* are the only instructions in sse2 which have
12865 both SSE and MMX operands and also have 0x66 prefix
12866 in their opcode. 0x66 was originally used to differentiate
12867 between SSE and MMX instruction(operands). So we have to handle the
12868 cvt* separately using OP_EMC and OP_MXC */
12869 static void
12870 OP_EMC (int bytemode, int sizeflag)
12871 {
12872 if (modrm.mod != 3)
12873 {
12874 if (intel_syntax && bytemode == v_mode)
12875 {
12876 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
12877 used_prefixes |= (prefixes & PREFIX_DATA);
12878 }
12879 OP_E (bytemode, sizeflag);
12880 return;
12881 }
12882
12883 /* Skip mod/rm byte. */
12884 MODRM_CHECK;
12885 codep++;
12886 used_prefixes |= (prefixes & PREFIX_DATA);
12887 sprintf (scratchbuf, "%%mm%d", modrm.rm);
12888 oappend (scratchbuf + intel_syntax);
12889 }
12890
12891 static void
12892 OP_MXC (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12893 {
12894 used_prefixes |= (prefixes & PREFIX_DATA);
12895 sprintf (scratchbuf, "%%mm%d", modrm.reg);
12896 oappend (scratchbuf + intel_syntax);
12897 }
12898
12899 static void
12900 OP_EX (int bytemode, int sizeflag)
12901 {
12902 int add;
12903
12904 /* Skip mod/rm byte. */
12905 MODRM_CHECK;
12906 codep++;
12907
12908 if (modrm.mod != 3)
12909 {
12910 OP_E_memory (bytemode, sizeflag);
12911 return;
12912 }
12913
12914 USED_REX (REX_B);
12915 if (rex & REX_B)
12916 add = 8;
12917 else
12918 add = 0;
12919
12920 if ((sizeflag & SUFFIX_ALWAYS)
12921 && (bytemode == x_swap_mode
12922 || bytemode == d_swap_mode
12923 || bytemode == q_swap_mode))
12924 swap_operand ();
12925
12926 if (need_vex
12927 && bytemode != xmm_mode
12928 && bytemode != xmmq_mode)
12929 {
12930 switch (vex.length)
12931 {
12932 case 128:
12933 sprintf (scratchbuf, "%%xmm%d", modrm.rm + add);
12934 break;
12935 case 256:
12936 sprintf (scratchbuf, "%%ymm%d", modrm.rm + add);
12937 break;
12938 default:
12939 abort ();
12940 }
12941 }
12942 else
12943 sprintf (scratchbuf, "%%xmm%d", modrm.rm + add);
12944 oappend (scratchbuf + intel_syntax);
12945 }
12946
12947 static void
12948 OP_MS (int bytemode, int sizeflag)
12949 {
12950 if (modrm.mod == 3)
12951 OP_EM (bytemode, sizeflag);
12952 else
12953 BadOp ();
12954 }
12955
12956 static void
12957 OP_XS (int bytemode, int sizeflag)
12958 {
12959 if (modrm.mod == 3)
12960 OP_EX (bytemode, sizeflag);
12961 else
12962 BadOp ();
12963 }
12964
12965 static void
12966 OP_M (int bytemode, int sizeflag)
12967 {
12968 if (modrm.mod == 3)
12969 /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
12970 BadOp ();
12971 else
12972 OP_E (bytemode, sizeflag);
12973 }
12974
12975 static void
12976 OP_0f07 (int bytemode, int sizeflag)
12977 {
12978 if (modrm.mod != 3 || modrm.rm != 0)
12979 BadOp ();
12980 else
12981 OP_E (bytemode, sizeflag);
12982 }
12983
12984 /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
12985 32bit mode and "xchg %rax,%rax" in 64bit mode. */
12986
12987 static void
12988 NOP_Fixup1 (int bytemode, int sizeflag)
12989 {
12990 if ((prefixes & PREFIX_DATA) != 0
12991 || (rex != 0
12992 && rex != 0x48
12993 && address_mode == mode_64bit))
12994 OP_REG (bytemode, sizeflag);
12995 else
12996 strcpy (obuf, "nop");
12997 }
12998
12999 static void
13000 NOP_Fixup2 (int bytemode, int sizeflag)
13001 {
13002 if ((prefixes & PREFIX_DATA) != 0
13003 || (rex != 0
13004 && rex != 0x48
13005 && address_mode == mode_64bit))
13006 OP_IMREG (bytemode, sizeflag);
13007 }
13008
13009 static const char *const Suffix3DNow[] = {
13010 /* 00 */ NULL, NULL, NULL, NULL,
13011 /* 04 */ NULL, NULL, NULL, NULL,
13012 /* 08 */ NULL, NULL, NULL, NULL,
13013 /* 0C */ "pi2fw", "pi2fd", NULL, NULL,
13014 /* 10 */ NULL, NULL, NULL, NULL,
13015 /* 14 */ NULL, NULL, NULL, NULL,
13016 /* 18 */ NULL, NULL, NULL, NULL,
13017 /* 1C */ "pf2iw", "pf2id", NULL, NULL,
13018 /* 20 */ NULL, NULL, NULL, NULL,
13019 /* 24 */ NULL, NULL, NULL, NULL,
13020 /* 28 */ NULL, NULL, NULL, NULL,
13021 /* 2C */ NULL, NULL, NULL, NULL,
13022 /* 30 */ NULL, NULL, NULL, NULL,
13023 /* 34 */ NULL, NULL, NULL, NULL,
13024 /* 38 */ NULL, NULL, NULL, NULL,
13025 /* 3C */ NULL, NULL, NULL, NULL,
13026 /* 40 */ NULL, NULL, NULL, NULL,
13027 /* 44 */ NULL, NULL, NULL, NULL,
13028 /* 48 */ NULL, NULL, NULL, NULL,
13029 /* 4C */ NULL, NULL, NULL, NULL,
13030 /* 50 */ NULL, NULL, NULL, NULL,
13031 /* 54 */ NULL, NULL, NULL, NULL,
13032 /* 58 */ NULL, NULL, NULL, NULL,
13033 /* 5C */ NULL, NULL, NULL, NULL,
13034 /* 60 */ NULL, NULL, NULL, NULL,
13035 /* 64 */ NULL, NULL, NULL, NULL,
13036 /* 68 */ NULL, NULL, NULL, NULL,
13037 /* 6C */ NULL, NULL, NULL, NULL,
13038 /* 70 */ NULL, NULL, NULL, NULL,
13039 /* 74 */ NULL, NULL, NULL, NULL,
13040 /* 78 */ NULL, NULL, NULL, NULL,
13041 /* 7C */ NULL, NULL, NULL, NULL,
13042 /* 80 */ NULL, NULL, NULL, NULL,
13043 /* 84 */ NULL, NULL, NULL, NULL,
13044 /* 88 */ NULL, NULL, "pfnacc", NULL,
13045 /* 8C */ NULL, NULL, "pfpnacc", NULL,
13046 /* 90 */ "pfcmpge", NULL, NULL, NULL,
13047 /* 94 */ "pfmin", NULL, "pfrcp", "pfrsqrt",
13048 /* 98 */ NULL, NULL, "pfsub", NULL,
13049 /* 9C */ NULL, NULL, "pfadd", NULL,
13050 /* A0 */ "pfcmpgt", NULL, NULL, NULL,
13051 /* A4 */ "pfmax", NULL, "pfrcpit1", "pfrsqit1",
13052 /* A8 */ NULL, NULL, "pfsubr", NULL,
13053 /* AC */ NULL, NULL, "pfacc", NULL,
13054 /* B0 */ "pfcmpeq", NULL, NULL, NULL,
13055 /* B4 */ "pfmul", NULL, "pfrcpit2", "pmulhrw",
13056 /* B8 */ NULL, NULL, NULL, "pswapd",
13057 /* BC */ NULL, NULL, NULL, "pavgusb",
13058 /* C0 */ NULL, NULL, NULL, NULL,
13059 /* C4 */ NULL, NULL, NULL, NULL,
13060 /* C8 */ NULL, NULL, NULL, NULL,
13061 /* CC */ NULL, NULL, NULL, NULL,
13062 /* D0 */ NULL, NULL, NULL, NULL,
13063 /* D4 */ NULL, NULL, NULL, NULL,
13064 /* D8 */ NULL, NULL, NULL, NULL,
13065 /* DC */ NULL, NULL, NULL, NULL,
13066 /* E0 */ NULL, NULL, NULL, NULL,
13067 /* E4 */ NULL, NULL, NULL, NULL,
13068 /* E8 */ NULL, NULL, NULL, NULL,
13069 /* EC */ NULL, NULL, NULL, NULL,
13070 /* F0 */ NULL, NULL, NULL, NULL,
13071 /* F4 */ NULL, NULL, NULL, NULL,
13072 /* F8 */ NULL, NULL, NULL, NULL,
13073 /* FC */ NULL, NULL, NULL, NULL,
13074 };
13075
13076 static void
13077 OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13078 {
13079 const char *mnemonic;
13080
13081 FETCH_DATA (the_info, codep + 1);
13082 /* AMD 3DNow! instructions are specified by an opcode suffix in the
13083 place where an 8-bit immediate would normally go. ie. the last
13084 byte of the instruction. */
13085 obufp = mnemonicendp;
13086 mnemonic = Suffix3DNow[*codep++ & 0xff];
13087 if (mnemonic)
13088 oappend (mnemonic);
13089 else
13090 {
13091 /* Since a variable sized modrm/sib chunk is between the start
13092 of the opcode (0x0f0f) and the opcode suffix, we need to do
13093 all the modrm processing first, and don't know until now that
13094 we have a bad opcode. This necessitates some cleaning up. */
13095 op_out[0][0] = '\0';
13096 op_out[1][0] = '\0';
13097 BadOp ();
13098 }
13099 mnemonicendp = obufp;
13100 }
13101
13102 static struct op simd_cmp_op[] =
13103 {
13104 { STRING_COMMA_LEN ("eq") },
13105 { STRING_COMMA_LEN ("lt") },
13106 { STRING_COMMA_LEN ("le") },
13107 { STRING_COMMA_LEN ("unord") },
13108 { STRING_COMMA_LEN ("neq") },
13109 { STRING_COMMA_LEN ("nlt") },
13110 { STRING_COMMA_LEN ("nle") },
13111 { STRING_COMMA_LEN ("ord") }
13112 };
13113
13114 static void
13115 CMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13116 {
13117 unsigned int cmp_type;
13118
13119 FETCH_DATA (the_info, codep + 1);
13120 cmp_type = *codep++ & 0xff;
13121 if (cmp_type < ARRAY_SIZE (simd_cmp_op))
13122 {
13123 char suffix [3];
13124 char *p = mnemonicendp - 2;
13125 suffix[0] = p[0];
13126 suffix[1] = p[1];
13127 suffix[2] = '\0';
13128 sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
13129 mnemonicendp += simd_cmp_op[cmp_type].len;
13130 }
13131 else
13132 {
13133 /* We have a reserved extension byte. Output it directly. */
13134 scratchbuf[0] = '$';
13135 print_operand_value (scratchbuf + 1, 1, cmp_type);
13136 oappend (scratchbuf + intel_syntax);
13137 scratchbuf[0] = '\0';
13138 }
13139 }
13140
13141 static void
13142 OP_Mwait (int bytemode ATTRIBUTE_UNUSED,
13143 int sizeflag ATTRIBUTE_UNUSED)
13144 {
13145 /* mwait %eax,%ecx */
13146 if (!intel_syntax)
13147 {
13148 const char **names = (address_mode == mode_64bit
13149 ? names64 : names32);
13150 strcpy (op_out[0], names[0]);
13151 strcpy (op_out[1], names[1]);
13152 two_source_ops = 1;
13153 }
13154 /* Skip mod/rm byte. */
13155 MODRM_CHECK;
13156 codep++;
13157 }
13158
13159 static void
13160 OP_Monitor (int bytemode ATTRIBUTE_UNUSED,
13161 int sizeflag ATTRIBUTE_UNUSED)
13162 {
13163 /* monitor %eax,%ecx,%edx" */
13164 if (!intel_syntax)
13165 {
13166 const char **op1_names;
13167 const char **names = (address_mode == mode_64bit
13168 ? names64 : names32);
13169
13170 if (!(prefixes & PREFIX_ADDR))
13171 op1_names = (address_mode == mode_16bit
13172 ? names16 : names);
13173 else
13174 {
13175 /* Remove "addr16/addr32". */
13176 all_prefixes[last_addr_prefix] = 0;
13177 op1_names = (address_mode != mode_32bit
13178 ? names32 : names16);
13179 used_prefixes |= PREFIX_ADDR;
13180 }
13181 strcpy (op_out[0], op1_names[0]);
13182 strcpy (op_out[1], names[1]);
13183 strcpy (op_out[2], names[2]);
13184 two_source_ops = 1;
13185 }
13186 /* Skip mod/rm byte. */
13187 MODRM_CHECK;
13188 codep++;
13189 }
13190
13191 static void
13192 BadOp (void)
13193 {
13194 /* Throw away prefixes and 1st. opcode byte. */
13195 codep = insn_codep + 1;
13196 oappend ("(bad)");
13197 }
13198
13199 static void
13200 REP_Fixup (int bytemode, int sizeflag)
13201 {
13202 /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
13203 lods and stos. */
13204 if (prefixes & PREFIX_REPZ)
13205 all_prefixes[last_repz_prefix] = REP_PREFIX;
13206
13207 switch (bytemode)
13208 {
13209 case al_reg:
13210 case eAX_reg:
13211 case indir_dx_reg:
13212 OP_IMREG (bytemode, sizeflag);
13213 break;
13214 case eDI_reg:
13215 OP_ESreg (bytemode, sizeflag);
13216 break;
13217 case eSI_reg:
13218 OP_DSreg (bytemode, sizeflag);
13219 break;
13220 default:
13221 abort ();
13222 break;
13223 }
13224 }
13225
13226 static void
13227 CMPXCHG8B_Fixup (int bytemode, int sizeflag)
13228 {
13229 USED_REX (REX_W);
13230 if (rex & REX_W)
13231 {
13232 /* Change cmpxchg8b to cmpxchg16b. */
13233 char *p = mnemonicendp - 2;
13234 mnemonicendp = stpcpy (p, "16b");
13235 bytemode = o_mode;
13236 }
13237 OP_M (bytemode, sizeflag);
13238 }
13239
13240 static void
13241 XMM_Fixup (int reg, int sizeflag ATTRIBUTE_UNUSED)
13242 {
13243 if (need_vex)
13244 {
13245 switch (vex.length)
13246 {
13247 case 128:
13248 sprintf (scratchbuf, "%%xmm%d", reg);
13249 break;
13250 case 256:
13251 sprintf (scratchbuf, "%%ymm%d", reg);
13252 break;
13253 default:
13254 abort ();
13255 }
13256 }
13257 else
13258 sprintf (scratchbuf, "%%xmm%d", reg);
13259 oappend (scratchbuf + intel_syntax);
13260 }
13261
13262 static void
13263 CRC32_Fixup (int bytemode, int sizeflag)
13264 {
13265 /* Add proper suffix to "crc32". */
13266 char *p = mnemonicendp;
13267
13268 switch (bytemode)
13269 {
13270 case b_mode:
13271 if (intel_syntax)
13272 goto skip;
13273
13274 *p++ = 'b';
13275 break;
13276 case v_mode:
13277 if (intel_syntax)
13278 goto skip;
13279
13280 USED_REX (REX_W);
13281 if (rex & REX_W)
13282 *p++ = 'q';
13283 else
13284 {
13285 if (sizeflag & DFLAG)
13286 *p++ = 'l';
13287 else
13288 *p++ = 'w';
13289 used_prefixes |= (prefixes & PREFIX_DATA);
13290 }
13291 break;
13292 default:
13293 oappend (INTERNAL_DISASSEMBLER_ERROR);
13294 break;
13295 }
13296 mnemonicendp = p;
13297 *p = '\0';
13298
13299 skip:
13300 if (modrm.mod == 3)
13301 {
13302 int add;
13303
13304 /* Skip mod/rm byte. */
13305 MODRM_CHECK;
13306 codep++;
13307
13308 USED_REX (REX_B);
13309 add = (rex & REX_B) ? 8 : 0;
13310 if (bytemode == b_mode)
13311 {
13312 USED_REX (0);
13313 if (rex)
13314 oappend (names8rex[modrm.rm + add]);
13315 else
13316 oappend (names8[modrm.rm + add]);
13317 }
13318 else
13319 {
13320 USED_REX (REX_W);
13321 if (rex & REX_W)
13322 oappend (names64[modrm.rm + add]);
13323 else if ((prefixes & PREFIX_DATA))
13324 oappend (names16[modrm.rm + add]);
13325 else
13326 oappend (names32[modrm.rm + add]);
13327 }
13328 }
13329 else
13330 OP_E (bytemode, sizeflag);
13331 }
13332
13333 /* Display the destination register operand for instructions with
13334 VEX. */
13335
13336 static void
13337 OP_VEX (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13338 {
13339 if (!need_vex)
13340 abort ();
13341
13342 if (!need_vex_reg)
13343 return;
13344
13345 switch (vex.length)
13346 {
13347 case 128:
13348 switch (bytemode)
13349 {
13350 case vex_mode:
13351 case vex128_mode:
13352 break;
13353 default:
13354 abort ();
13355 return;
13356 }
13357
13358 sprintf (scratchbuf, "%%xmm%d", vex.register_specifier);
13359 break;
13360 case 256:
13361 switch (bytemode)
13362 {
13363 case vex_mode:
13364 case vex256_mode:
13365 break;
13366 default:
13367 abort ();
13368 return;
13369 }
13370
13371 sprintf (scratchbuf, "%%ymm%d", vex.register_specifier);
13372 break;
13373 default:
13374 abort ();
13375 break;
13376 }
13377 oappend (scratchbuf + intel_syntax);
13378 }
13379
13380 /* Get the VEX immediate byte without moving codep. */
13381
13382 static unsigned char
13383 get_vex_imm8 (int sizeflag)
13384 {
13385 int bytes_before_imm = 0;
13386
13387 /* Skip mod/rm byte. */
13388 MODRM_CHECK;
13389 codep++;
13390
13391 if (modrm.mod != 3)
13392 {
13393 /* There are SIB/displacement bytes. */
13394 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
13395 {
13396 /* 32/64 bit address mode */
13397 int base = modrm.rm;
13398
13399 /* Check SIB byte. */
13400 if (base == 4)
13401 {
13402 FETCH_DATA (the_info, codep + 1);
13403 base = *codep & 7;
13404 bytes_before_imm++;
13405 }
13406
13407 switch (modrm.mod)
13408 {
13409 case 0:
13410 /* When modrm.rm == 5 or modrm.rm == 4 and base in
13411 SIB == 5, there is a 4 byte displacement. */
13412 if (base != 5)
13413 /* No displacement. */
13414 break;
13415 case 2:
13416 /* 4 byte displacement. */
13417 bytes_before_imm += 4;
13418 break;
13419 case 1:
13420 /* 1 byte displacement. */
13421 bytes_before_imm++;
13422 break;
13423 }
13424 }
13425 else
13426 { /* 16 bit address mode */
13427 switch (modrm.mod)
13428 {
13429 case 0:
13430 /* When modrm.rm == 6, there is a 2 byte displacement. */
13431 if (modrm.rm != 6)
13432 /* No displacement. */
13433 break;
13434 case 2:
13435 /* 2 byte displacement. */
13436 bytes_before_imm += 2;
13437 break;
13438 case 1:
13439 /* 1 byte displacement. */
13440 bytes_before_imm++;
13441 break;
13442 }
13443 }
13444 }
13445
13446 FETCH_DATA (the_info, codep + bytes_before_imm + 1);
13447 return codep [bytes_before_imm];
13448 }
13449
13450 static void
13451 OP_EX_VexReg (int bytemode, int sizeflag, int reg)
13452 {
13453 if (reg == -1 && modrm.mod != 3)
13454 {
13455 OP_E_memory (bytemode, sizeflag);
13456 return;
13457 }
13458 else
13459 {
13460 if (reg == -1)
13461 {
13462 reg = modrm.rm;
13463 USED_REX (REX_B);
13464 if (rex & REX_B)
13465 reg += 8;
13466 }
13467 else if (reg > 7 && address_mode != mode_64bit)
13468 BadOp ();
13469 }
13470
13471 switch (vex.length)
13472 {
13473 case 128:
13474 sprintf (scratchbuf, "%%xmm%d", reg);
13475 break;
13476 case 256:
13477 sprintf (scratchbuf, "%%ymm%d", reg);
13478 break;
13479 default:
13480 abort ();
13481 }
13482 oappend (scratchbuf + intel_syntax);
13483 }
13484
13485 static void
13486 OP_EX_VexW (int bytemode, int sizeflag)
13487 {
13488 int reg = -1;
13489
13490 if (!vex_w_done)
13491 {
13492 vex_w_done = 1;
13493 if (vex.w)
13494 reg = get_vex_imm8 (sizeflag) >> 4;
13495 }
13496 else
13497 {
13498 if (!vex.w)
13499 reg = get_vex_imm8 (sizeflag) >> 4;
13500 }
13501
13502 OP_EX_VexReg (bytemode, sizeflag, reg);
13503 }
13504
13505 static void
13506 VEXI4_Fixup (int bytemode ATTRIBUTE_UNUSED,
13507 int sizeflag ATTRIBUTE_UNUSED)
13508 {
13509 /* Skip the immediate byte and check for invalid bits. */
13510 FETCH_DATA (the_info, codep + 1);
13511 if (*codep++ & 0xf)
13512 BadOp ();
13513 }
13514
13515 static void
13516 OP_REG_VexI4 (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13517 {
13518 int reg;
13519 FETCH_DATA (the_info, codep + 1);
13520 reg = *codep++;
13521
13522 if (bytemode != x_mode)
13523 abort ();
13524
13525 if (reg & 0xf)
13526 BadOp ();
13527
13528 reg >>= 4;
13529 if (reg > 7 && address_mode != mode_64bit)
13530 BadOp ();
13531
13532 switch (vex.length)
13533 {
13534 case 128:
13535 sprintf (scratchbuf, "%%xmm%d", reg);
13536 break;
13537 case 256:
13538 sprintf (scratchbuf, "%%ymm%d", reg);
13539 break;
13540 default:
13541 abort ();
13542 }
13543 oappend (scratchbuf + intel_syntax);
13544 }
13545
13546 static void
13547 OP_XMM_VexW (int bytemode, int sizeflag)
13548 {
13549 /* Turn off the REX.W bit since it is used for swapping operands
13550 now. */
13551 rex &= ~REX_W;
13552 OP_XMM (bytemode, sizeflag);
13553 }
13554
13555 static void
13556 OP_EX_Vex (int bytemode, int sizeflag)
13557 {
13558 if (modrm.mod != 3)
13559 {
13560 if (vex.register_specifier != 0)
13561 BadOp ();
13562 need_vex_reg = 0;
13563 }
13564 OP_EX (bytemode, sizeflag);
13565 }
13566
13567 static void
13568 OP_XMM_Vex (int bytemode, int sizeflag)
13569 {
13570 if (modrm.mod != 3)
13571 {
13572 if (vex.register_specifier != 0)
13573 BadOp ();
13574 need_vex_reg = 0;
13575 }
13576 OP_XMM (bytemode, sizeflag);
13577 }
13578
13579 static void
13580 VZERO_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13581 {
13582 switch (vex.length)
13583 {
13584 case 128:
13585 mnemonicendp = stpcpy (obuf, "vzeroupper");
13586 break;
13587 case 256:
13588 mnemonicendp = stpcpy (obuf, "vzeroall");
13589 break;
13590 default:
13591 abort ();
13592 }
13593 }
13594
13595 static struct op vex_cmp_op[] =
13596 {
13597 { STRING_COMMA_LEN ("eq") },
13598 { STRING_COMMA_LEN ("lt") },
13599 { STRING_COMMA_LEN ("le") },
13600 { STRING_COMMA_LEN ("unord") },
13601 { STRING_COMMA_LEN ("neq") },
13602 { STRING_COMMA_LEN ("nlt") },
13603 { STRING_COMMA_LEN ("nle") },
13604 { STRING_COMMA_LEN ("ord") },
13605 { STRING_COMMA_LEN ("eq_uq") },
13606 { STRING_COMMA_LEN ("nge") },
13607 { STRING_COMMA_LEN ("ngt") },
13608 { STRING_COMMA_LEN ("false") },
13609 { STRING_COMMA_LEN ("neq_oq") },
13610 { STRING_COMMA_LEN ("ge") },
13611 { STRING_COMMA_LEN ("gt") },
13612 { STRING_COMMA_LEN ("true") },
13613 { STRING_COMMA_LEN ("eq_os") },
13614 { STRING_COMMA_LEN ("lt_oq") },
13615 { STRING_COMMA_LEN ("le_oq") },
13616 { STRING_COMMA_LEN ("unord_s") },
13617 { STRING_COMMA_LEN ("neq_us") },
13618 { STRING_COMMA_LEN ("nlt_uq") },
13619 { STRING_COMMA_LEN ("nle_uq") },
13620 { STRING_COMMA_LEN ("ord_s") },
13621 { STRING_COMMA_LEN ("eq_us") },
13622 { STRING_COMMA_LEN ("nge_uq") },
13623 { STRING_COMMA_LEN ("ngt_uq") },
13624 { STRING_COMMA_LEN ("false_os") },
13625 { STRING_COMMA_LEN ("neq_os") },
13626 { STRING_COMMA_LEN ("ge_oq") },
13627 { STRING_COMMA_LEN ("gt_oq") },
13628 { STRING_COMMA_LEN ("true_us") },
13629 };
13630
13631 static void
13632 VCMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13633 {
13634 unsigned int cmp_type;
13635
13636 FETCH_DATA (the_info, codep + 1);
13637 cmp_type = *codep++ & 0xff;
13638 if (cmp_type < ARRAY_SIZE (vex_cmp_op))
13639 {
13640 char suffix [3];
13641 char *p = mnemonicendp - 2;
13642 suffix[0] = p[0];
13643 suffix[1] = p[1];
13644 suffix[2] = '\0';
13645 sprintf (p, "%s%s", vex_cmp_op[cmp_type].name, suffix);
13646 mnemonicendp += vex_cmp_op[cmp_type].len;
13647 }
13648 else
13649 {
13650 /* We have a reserved extension byte. Output it directly. */
13651 scratchbuf[0] = '$';
13652 print_operand_value (scratchbuf + 1, 1, cmp_type);
13653 oappend (scratchbuf + intel_syntax);
13654 scratchbuf[0] = '\0';
13655 }
13656 }
13657
13658 static const struct op pclmul_op[] =
13659 {
13660 { STRING_COMMA_LEN ("lql") },
13661 { STRING_COMMA_LEN ("hql") },
13662 { STRING_COMMA_LEN ("lqh") },
13663 { STRING_COMMA_LEN ("hqh") }
13664 };
13665
13666 static void
13667 PCLMUL_Fixup (int bytemode ATTRIBUTE_UNUSED,
13668 int sizeflag ATTRIBUTE_UNUSED)
13669 {
13670 unsigned int pclmul_type;
13671
13672 FETCH_DATA (the_info, codep + 1);
13673 pclmul_type = *codep++ & 0xff;
13674 switch (pclmul_type)
13675 {
13676 case 0x10:
13677 pclmul_type = 2;
13678 break;
13679 case 0x11:
13680 pclmul_type = 3;
13681 break;
13682 default:
13683 break;
13684 }
13685 if (pclmul_type < ARRAY_SIZE (pclmul_op))
13686 {
13687 char suffix [4];
13688 char *p = mnemonicendp - 3;
13689 suffix[0] = p[0];
13690 suffix[1] = p[1];
13691 suffix[2] = p[2];
13692 suffix[3] = '\0';
13693 sprintf (p, "%s%s", pclmul_op[pclmul_type].name, suffix);
13694 mnemonicendp += pclmul_op[pclmul_type].len;
13695 }
13696 else
13697 {
13698 /* We have a reserved extension byte. Output it directly. */
13699 scratchbuf[0] = '$';
13700 print_operand_value (scratchbuf + 1, 1, pclmul_type);
13701 oappend (scratchbuf + intel_syntax);
13702 scratchbuf[0] = '\0';
13703 }
13704 }
13705
13706 static void
13707 MOVBE_Fixup (int bytemode, int sizeflag)
13708 {
13709 /* Add proper suffix to "movbe". */
13710 char *p = mnemonicendp;
13711
13712 switch (bytemode)
13713 {
13714 case v_mode:
13715 if (intel_syntax)
13716 goto skip;
13717
13718 USED_REX (REX_W);
13719 if (sizeflag & SUFFIX_ALWAYS)
13720 {
13721 if (rex & REX_W)
13722 *p++ = 'q';
13723 else
13724 {
13725 if (sizeflag & DFLAG)
13726 *p++ = 'l';
13727 else
13728 *p++ = 'w';
13729 used_prefixes |= (prefixes & PREFIX_DATA);
13730 }
13731 }
13732 break;
13733 default:
13734 oappend (INTERNAL_DISASSEMBLER_ERROR);
13735 break;
13736 }
13737 mnemonicendp = p;
13738 *p = '\0';
13739
13740 skip:
13741 OP_M (bytemode, sizeflag);
13742 }
13743
13744 static void
13745 OP_LWPCB_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13746 {
13747 int reg;
13748 const char **names;
13749
13750 /* Skip mod/rm byte. */
13751 MODRM_CHECK;
13752 codep++;
13753
13754 if (vex.w)
13755 names = names64;
13756 else if (vex.length == 256)
13757 names = names32;
13758 else
13759 names = names16;
13760
13761 reg = modrm.rm;
13762 USED_REX (REX_B);
13763 if (rex & REX_B)
13764 reg += 8;
13765
13766 oappend (names[reg]);
13767 }
13768
13769 static void
13770 OP_LWP_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13771 {
13772 const char **names;
13773
13774 if (vex.w)
13775 names = names64;
13776 else if (vex.length == 256)
13777 names = names32;
13778 else
13779 names = names16;
13780
13781 oappend (names[vex.register_specifier]);
13782 }
13783
13784 static void
13785 OP_LWP_I (int bytemode ATTRIBUTE_UNUSED, int sizeflag)
13786 {
13787 if (vex.w || vex.length == 256)
13788 OP_I (q_mode, sizeflag);
13789 else
13790 OP_I (w_mode, sizeflag);
13791 }
13792