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