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