* mips-opc.c (mips_builtin_opcodes): Set field `match' to 0 for
[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 Free Software Foundation, Inc.
4
5 This file is part of the GNU opcodes library.
6
7 This library is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
10 any later version.
11
12 It is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
15 License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20 MA 02110-1301, USA. */
21
22
23 /* 80386 instruction printer by Pace Willisson (pace@prep.ai.mit.edu)
24 July 1988
25 modified by John Hassey (hassey@dg-rtp.dg.com)
26 x86-64 support added by Jan Hubicka (jh@suse.cz)
27 VIA PadLock support by Michal Ludvig (mludvig@suse.cz). */
28
29 /* The main tables describing the instructions is essentially a copy
30 of the "Opcode Map" chapter (Appendix A) of the Intel 80386
31 Programmers Manual. Usually, there is a capital letter, followed
32 by a small letter. The capital letter tell the addressing mode,
33 and the small letter tells about the operand size. Refer to
34 the Intel manual for details. */
35
36 #include "sysdep.h"
37 #include "dis-asm.h"
38 #include "opintl.h"
39 #include "opcode/i386.h"
40 #include "libiberty.h"
41
42 #include <setjmp.h>
43
44 static int fetch_data (struct disassemble_info *, bfd_byte *);
45 static void ckprefix (void);
46 static const char *prefix_name (int, int);
47 static int print_insn (bfd_vma, disassemble_info *);
48 static void dofloat (int);
49 static void OP_ST (int, int);
50 static void OP_STi (int, int);
51 static int putop (const char *, int);
52 static void oappend (const char *);
53 static void append_seg (void);
54 static void OP_indirE (int, int);
55 static void print_operand_value (char *, int, bfd_vma);
56 static void OP_E_register (int, int);
57 static void OP_E_memory (int, int, int);
58 static void OP_E_extended (int, int, int);
59 static void print_displacement (char *, bfd_vma);
60 static void OP_E (int, int);
61 static void OP_G (int, int);
62 static bfd_vma get64 (void);
63 static bfd_signed_vma get32 (void);
64 static bfd_signed_vma get32s (void);
65 static int get16 (void);
66 static void set_op (bfd_vma, int);
67 static void OP_Skip_MODRM (int, int);
68 static void OP_REG (int, int);
69 static void OP_IMREG (int, int);
70 static void OP_I (int, int);
71 static void OP_I64 (int, int);
72 static void OP_sI (int, int);
73 static void OP_J (int, int);
74 static void OP_SEG (int, int);
75 static void OP_DIR (int, int);
76 static void OP_OFF (int, int);
77 static void OP_OFF64 (int, int);
78 static void ptr_reg (int, int);
79 static void OP_ESreg (int, int);
80 static void OP_DSreg (int, int);
81 static void OP_C (int, int);
82 static void OP_D (int, int);
83 static void OP_T (int, int);
84 static void OP_R (int, int);
85 static void OP_MMX (int, int);
86 static void OP_XMM (int, int);
87 static void OP_EM (int, int);
88 static void OP_EX (int, int);
89 static void OP_EMC (int,int);
90 static void OP_MXC (int,int);
91 static void OP_MS (int, int);
92 static void OP_XS (int, int);
93 static void OP_M (int, int);
94 static void OP_VEX (int, int);
95 static void OP_VEX_FMA (int, int);
96 static void OP_EX_Vex (int, int);
97 static void OP_EX_VexW (int, int);
98 static void OP_EX_VexImmW (int, int);
99 static void OP_XMM_Vex (int, int);
100 static void OP_XMM_VexW (int, int);
101 static void OP_REG_VexI4 (int, int);
102 static void PCLMUL_Fixup (int, int);
103 static void VEXI4_Fixup (int, int);
104 static void VZERO_Fixup (int, int);
105 static void VCMP_Fixup (int, int);
106 static void VPERMIL2_Fixup (int, int);
107 static void OP_0f07 (int, int);
108 static void OP_Monitor (int, int);
109 static void OP_Mwait (int, int);
110 static void NOP_Fixup1 (int, int);
111 static void NOP_Fixup2 (int, int);
112 static void OP_3DNowSuffix (int, int);
113 static void CMP_Fixup (int, int);
114 static void BadOp (void);
115 static void REP_Fixup (int, int);
116 static void CMPXCHG8B_Fixup (int, int);
117 static void XMM_Fixup (int, int);
118 static void CRC32_Fixup (int, int);
119 static void print_drex_arg (unsigned int, int, int);
120 static void OP_DREX4 (int, int);
121 static void OP_DREX3 (int, int);
122 static void OP_DREX_ICMP (int, int);
123 static void OP_DREX_FCMP (int, int);
124
125 struct dis_private {
126 /* Points to first byte not fetched. */
127 bfd_byte *max_fetched;
128 bfd_byte the_buffer[MAX_MNEM_SIZE];
129 bfd_vma insn_start;
130 int orig_sizeflag;
131 jmp_buf bailout;
132 };
133
134 enum address_mode
135 {
136 mode_16bit,
137 mode_32bit,
138 mode_64bit
139 };
140
141 enum address_mode address_mode;
142
143 /* Flags for the prefixes for the current instruction. See below. */
144 static int prefixes;
145
146 /* REX prefix the current instruction. See below. */
147 static int rex;
148 /* Bits of REX we've already used. */
149 static int rex_used;
150 /* Original REX prefix. */
151 static int rex_original;
152 /* REX bits in original REX prefix ignored. It may not be the same
153 as rex_original since some bits may not be ignored. */
154 static int rex_ignored;
155 /* Mark parts used in the REX prefix. When we are testing for
156 empty prefix (for 8bit register REX extension), just mask it
157 out. Otherwise test for REX bit is excuse for existence of REX
158 only in case value is nonzero. */
159 #define USED_REX(value) \
160 { \
161 if (value) \
162 { \
163 if ((rex & value)) \
164 rex_used |= (value) | REX_OPCODE; \
165 } \
166 else \
167 rex_used |= REX_OPCODE; \
168 }
169
170 /* Special 'registers' for DREX handling */
171 #define DREX_REG_UNKNOWN 1000 /* not initialized */
172 #define DREX_REG_MEMORY 1001 /* use MODRM/SIB/OFFSET memory */
173
174 /* The DREX byte has the following fields:
175 Bits 7-4 -- DREX.Dest, xmm destination register
176 Bit 3 -- DREX.OC0, operand config bit defines operand order
177 Bit 2 -- DREX.R, equivalent to REX_R bit, to extend ModRM register
178 Bit 1 -- DREX.X, equivalent to REX_X bit, to extend SIB index field
179 Bit 0 -- DREX.W, equivalent to REX_B bit, to extend ModRM r/m field,
180 SIB base field, or opcode reg field. */
181 #define DREX_XMM(drex) ((drex >> 4) & 0xf)
182 #define DREX_OC0(drex) ((drex >> 3) & 0x1)
183
184 /* Flags for prefixes which we somehow handled when printing the
185 current instruction. */
186 static int used_prefixes;
187
188 /* Flags stored in PREFIXES. */
189 #define PREFIX_REPZ 1
190 #define PREFIX_REPNZ 2
191 #define PREFIX_LOCK 4
192 #define PREFIX_CS 8
193 #define PREFIX_SS 0x10
194 #define PREFIX_DS 0x20
195 #define PREFIX_ES 0x40
196 #define PREFIX_FS 0x80
197 #define PREFIX_GS 0x100
198 #define PREFIX_DATA 0x200
199 #define PREFIX_ADDR 0x400
200 #define PREFIX_FWAIT 0x800
201
202 /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
203 to ADDR (exclusive) are valid. Returns 1 for success, longjmps
204 on error. */
205 #define FETCH_DATA(info, addr) \
206 ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \
207 ? 1 : fetch_data ((info), (addr)))
208
209 static int
210 fetch_data (struct disassemble_info *info, bfd_byte *addr)
211 {
212 int status;
213 struct dis_private *priv = (struct dis_private *) info->private_data;
214 bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer);
215
216 if (addr <= priv->the_buffer + MAX_MNEM_SIZE)
217 status = (*info->read_memory_func) (start,
218 priv->max_fetched,
219 addr - priv->max_fetched,
220 info);
221 else
222 status = -1;
223 if (status != 0)
224 {
225 /* If we did manage to read at least one byte, then
226 print_insn_i386 will do something sensible. Otherwise, print
227 an error. We do that here because this is where we know
228 STATUS. */
229 if (priv->max_fetched == priv->the_buffer)
230 (*info->memory_error_func) (status, start, info);
231 longjmp (priv->bailout, 1);
232 }
233 else
234 priv->max_fetched = addr;
235 return 1;
236 }
237
238 #define XX { NULL, 0 }
239
240 #define Eb { OP_E, b_mode }
241 #define Ev { OP_E, v_mode }
242 #define Ed { OP_E, d_mode }
243 #define Edq { OP_E, dq_mode }
244 #define Edqw { OP_E, dqw_mode }
245 #define Edqb { OP_E, dqb_mode }
246 #define Edqd { OP_E, dqd_mode }
247 #define Eq { OP_E, q_mode }
248 #define indirEv { OP_indirE, stack_v_mode }
249 #define indirEp { OP_indirE, f_mode }
250 #define stackEv { OP_E, stack_v_mode }
251 #define Em { OP_E, m_mode }
252 #define Ew { OP_E, w_mode }
253 #define M { OP_M, 0 } /* lea, lgdt, etc. */
254 #define Ma { OP_M, a_mode }
255 #define Mb { OP_M, b_mode }
256 #define Md { OP_M, d_mode }
257 #define Mp { OP_M, f_mode } /* 32 or 48 bit memory operand for LDS, LES etc */
258 #define Mq { OP_M, q_mode }
259 #define Mx { OP_M, x_mode }
260 #define Mxmm { OP_M, xmm_mode }
261 #define Gb { OP_G, b_mode }
262 #define Gv { OP_G, v_mode }
263 #define Gd { OP_G, d_mode }
264 #define Gdq { OP_G, dq_mode }
265 #define Gm { OP_G, m_mode }
266 #define Gw { OP_G, w_mode }
267 #define Rd { OP_R, d_mode }
268 #define Rm { OP_R, m_mode }
269 #define Ib { OP_I, b_mode }
270 #define sIb { OP_sI, b_mode } /* sign extened byte */
271 #define Iv { OP_I, v_mode }
272 #define Iq { OP_I, q_mode }
273 #define Iv64 { OP_I64, v_mode }
274 #define Iw { OP_I, w_mode }
275 #define I1 { OP_I, const_1_mode }
276 #define Jb { OP_J, b_mode }
277 #define Jv { OP_J, v_mode }
278 #define Cm { OP_C, m_mode }
279 #define Dm { OP_D, m_mode }
280 #define Td { OP_T, d_mode }
281 #define Skip_MODRM { OP_Skip_MODRM, 0 }
282
283 #define RMeAX { OP_REG, eAX_reg }
284 #define RMeBX { OP_REG, eBX_reg }
285 #define RMeCX { OP_REG, eCX_reg }
286 #define RMeDX { OP_REG, eDX_reg }
287 #define RMeSP { OP_REG, eSP_reg }
288 #define RMeBP { OP_REG, eBP_reg }
289 #define RMeSI { OP_REG, eSI_reg }
290 #define RMeDI { OP_REG, eDI_reg }
291 #define RMrAX { OP_REG, rAX_reg }
292 #define RMrBX { OP_REG, rBX_reg }
293 #define RMrCX { OP_REG, rCX_reg }
294 #define RMrDX { OP_REG, rDX_reg }
295 #define RMrSP { OP_REG, rSP_reg }
296 #define RMrBP { OP_REG, rBP_reg }
297 #define RMrSI { OP_REG, rSI_reg }
298 #define RMrDI { OP_REG, rDI_reg }
299 #define RMAL { OP_REG, al_reg }
300 #define RMAL { OP_REG, al_reg }
301 #define RMCL { OP_REG, cl_reg }
302 #define RMDL { OP_REG, dl_reg }
303 #define RMBL { OP_REG, bl_reg }
304 #define RMAH { OP_REG, ah_reg }
305 #define RMCH { OP_REG, ch_reg }
306 #define RMDH { OP_REG, dh_reg }
307 #define RMBH { OP_REG, bh_reg }
308 #define RMAX { OP_REG, ax_reg }
309 #define RMDX { OP_REG, dx_reg }
310
311 #define eAX { OP_IMREG, eAX_reg }
312 #define eBX { OP_IMREG, eBX_reg }
313 #define eCX { OP_IMREG, eCX_reg }
314 #define eDX { OP_IMREG, eDX_reg }
315 #define eSP { OP_IMREG, eSP_reg }
316 #define eBP { OP_IMREG, eBP_reg }
317 #define eSI { OP_IMREG, eSI_reg }
318 #define eDI { OP_IMREG, eDI_reg }
319 #define AL { OP_IMREG, al_reg }
320 #define CL { OP_IMREG, cl_reg }
321 #define DL { OP_IMREG, dl_reg }
322 #define BL { OP_IMREG, bl_reg }
323 #define AH { OP_IMREG, ah_reg }
324 #define CH { OP_IMREG, ch_reg }
325 #define DH { OP_IMREG, dh_reg }
326 #define BH { OP_IMREG, bh_reg }
327 #define AX { OP_IMREG, ax_reg }
328 #define DX { OP_IMREG, dx_reg }
329 #define zAX { OP_IMREG, z_mode_ax_reg }
330 #define indirDX { OP_IMREG, indir_dx_reg }
331
332 #define Sw { OP_SEG, w_mode }
333 #define Sv { OP_SEG, v_mode }
334 #define Ap { OP_DIR, 0 }
335 #define Ob { OP_OFF64, b_mode }
336 #define Ov { OP_OFF64, v_mode }
337 #define Xb { OP_DSreg, eSI_reg }
338 #define Xv { OP_DSreg, eSI_reg }
339 #define Xz { OP_DSreg, eSI_reg }
340 #define Yb { OP_ESreg, eDI_reg }
341 #define Yv { OP_ESreg, eDI_reg }
342 #define DSBX { OP_DSreg, eBX_reg }
343
344 #define es { OP_REG, es_reg }
345 #define ss { OP_REG, ss_reg }
346 #define cs { OP_REG, cs_reg }
347 #define ds { OP_REG, ds_reg }
348 #define fs { OP_REG, fs_reg }
349 #define gs { OP_REG, gs_reg }
350
351 #define MX { OP_MMX, 0 }
352 #define XM { OP_XMM, 0 }
353 #define XMM { OP_XMM, xmm_mode }
354 #define EM { OP_EM, v_mode }
355 #define EMd { OP_EM, d_mode }
356 #define EMx { OP_EM, x_mode }
357 #define EXw { OP_EX, w_mode }
358 #define EXd { OP_EX, d_mode }
359 #define EXq { OP_EX, q_mode }
360 #define EXx { OP_EX, x_mode }
361 #define EXxmm { OP_EX, xmm_mode }
362 #define EXxmmq { OP_EX, xmmq_mode }
363 #define EXymmq { OP_EX, ymmq_mode }
364 #define MS { OP_MS, v_mode }
365 #define XS { OP_XS, v_mode }
366 #define EMCq { OP_EMC, q_mode }
367 #define MXC { OP_MXC, 0 }
368 #define OPSUF { OP_3DNowSuffix, 0 }
369 #define CMP { CMP_Fixup, 0 }
370 #define XMM0 { XMM_Fixup, 0 }
371
372 #define Vex { OP_VEX, vex_mode }
373 #define Vex128 { OP_VEX, vex128_mode }
374 #define Vex256 { OP_VEX, vex256_mode }
375 #define VexI4 { VEXI4_Fixup, 0}
376 #define VexFMA { OP_VEX_FMA, vex_mode }
377 #define Vex128FMA { OP_VEX_FMA, vex128_mode }
378 #define EXdVex { OP_EX_Vex, d_mode }
379 #define EXqVex { OP_EX_Vex, q_mode }
380 #define EXVexW { OP_EX_VexW, x_mode }
381 #define EXdVexW { OP_EX_VexW, d_mode }
382 #define EXqVexW { OP_EX_VexW, q_mode }
383 #define EXVexImmW { OP_EX_VexImmW, x_mode }
384 #define XMVex { OP_XMM_Vex, 0 }
385 #define XMVexW { OP_XMM_VexW, 0 }
386 #define XMVexI4 { OP_REG_VexI4, x_mode }
387 #define PCLMUL { PCLMUL_Fixup, 0 }
388 #define VZERO { VZERO_Fixup, 0 }
389 #define VCMP { VCMP_Fixup, 0 }
390 #define VPERMIL2 { VPERMIL2_Fixup, 0 }
391
392 /* Used handle "rep" prefix for string instructions. */
393 #define Xbr { REP_Fixup, eSI_reg }
394 #define Xvr { REP_Fixup, eSI_reg }
395 #define Ybr { REP_Fixup, eDI_reg }
396 #define Yvr { REP_Fixup, eDI_reg }
397 #define Yzr { REP_Fixup, eDI_reg }
398 #define indirDXr { REP_Fixup, indir_dx_reg }
399 #define ALr { REP_Fixup, al_reg }
400 #define eAXr { REP_Fixup, eAX_reg }
401
402 #define cond_jump_flag { NULL, cond_jump_mode }
403 #define loop_jcxz_flag { NULL, loop_jcxz_mode }
404
405 /* bits in sizeflag */
406 #define SUFFIX_ALWAYS 4
407 #define AFLAG 2
408 #define DFLAG 1
409
410 /* byte operand */
411 #define b_mode 1
412 /* operand size depends on prefixes */
413 #define v_mode (b_mode + 1)
414 /* word operand */
415 #define w_mode (v_mode + 1)
416 /* double word operand */
417 #define d_mode (w_mode + 1)
418 /* quad word operand */
419 #define q_mode (d_mode + 1)
420 /* ten-byte operand */
421 #define t_mode (q_mode + 1)
422 /* 16-byte XMM or 32-byte YMM operand */
423 #define x_mode (t_mode + 1)
424 /* 16-byte XMM operand */
425 #define xmm_mode (x_mode + 1)
426 /* 16-byte XMM or quad word operand */
427 #define xmmq_mode (xmm_mode + 1)
428 /* 32-byte YMM or quad word operand */
429 #define ymmq_mode (xmmq_mode + 1)
430 /* d_mode in 32bit, q_mode in 64bit mode. */
431 #define m_mode (ymmq_mode + 1)
432 /* pair of v_mode operands */
433 #define a_mode (m_mode + 1)
434 #define cond_jump_mode (a_mode + 1)
435 #define loop_jcxz_mode (cond_jump_mode + 1)
436 /* operand size depends on REX prefixes. */
437 #define dq_mode (loop_jcxz_mode + 1)
438 /* registers like dq_mode, memory like w_mode. */
439 #define dqw_mode (dq_mode + 1)
440 /* 4- or 6-byte pointer operand */
441 #define f_mode (dqw_mode + 1)
442 #define const_1_mode (f_mode + 1)
443 /* v_mode for stack-related opcodes. */
444 #define stack_v_mode (const_1_mode + 1)
445 /* non-quad operand size depends on prefixes */
446 #define z_mode (stack_v_mode + 1)
447 /* 16-byte operand */
448 #define o_mode (z_mode + 1)
449 /* registers like dq_mode, memory like b_mode. */
450 #define dqb_mode (o_mode + 1)
451 /* registers like dq_mode, memory like d_mode. */
452 #define dqd_mode (dqb_mode + 1)
453 /* normal vex mode */
454 #define vex_mode (dqd_mode + 1)
455 /* 128bit vex mode */
456 #define vex128_mode (vex_mode + 1)
457 /* 256bit vex mode */
458 #define vex256_mode (vex128_mode + 1)
459
460 #define es_reg (vex256_mode + 1)
461 #define cs_reg (es_reg + 1)
462 #define ss_reg (cs_reg + 1)
463 #define ds_reg (ss_reg + 1)
464 #define fs_reg (ds_reg + 1)
465 #define gs_reg (fs_reg + 1)
466
467 #define eAX_reg (gs_reg + 1)
468 #define eCX_reg (eAX_reg + 1)
469 #define eDX_reg (eCX_reg + 1)
470 #define eBX_reg (eDX_reg + 1)
471 #define eSP_reg (eBX_reg + 1)
472 #define eBP_reg (eSP_reg + 1)
473 #define eSI_reg (eBP_reg + 1)
474 #define eDI_reg (eSI_reg + 1)
475
476 #define al_reg (eDI_reg + 1)
477 #define cl_reg (al_reg + 1)
478 #define dl_reg (cl_reg + 1)
479 #define bl_reg (dl_reg + 1)
480 #define ah_reg (bl_reg + 1)
481 #define ch_reg (ah_reg + 1)
482 #define dh_reg (ch_reg + 1)
483 #define bh_reg (dh_reg + 1)
484
485 #define ax_reg (bh_reg + 1)
486 #define cx_reg (ax_reg + 1)
487 #define dx_reg (cx_reg + 1)
488 #define bx_reg (dx_reg + 1)
489 #define sp_reg (bx_reg + 1)
490 #define bp_reg (sp_reg + 1)
491 #define si_reg (bp_reg + 1)
492 #define di_reg (si_reg + 1)
493
494 #define rAX_reg (di_reg + 1)
495 #define rCX_reg (rAX_reg + 1)
496 #define rDX_reg (rCX_reg + 1)
497 #define rBX_reg (rDX_reg + 1)
498 #define rSP_reg (rBX_reg + 1)
499 #define rBP_reg (rSP_reg + 1)
500 #define rSI_reg (rBP_reg + 1)
501 #define rDI_reg (rSI_reg + 1)
502
503 #define z_mode_ax_reg (rDI_reg + 1)
504 #define indir_dx_reg (z_mode_ax_reg + 1)
505
506 #define MAX_BYTEMODE indir_dx_reg
507
508 /* Flags that are OR'ed into the bytemode field to pass extra
509 information. */
510 #define DREX_OC1 0x10000 /* OC1 bit set */
511 #define DREX_NO_OC0 0x20000 /* OC0 bit not used */
512 #define DREX_MASK 0x40000 /* mask to delete */
513
514 #if MAX_BYTEMODE >= DREX_OC1
515 #error MAX_BYTEMODE must be less than DREX_OC1
516 #endif
517
518 #define FLOATCODE 1
519 #define USE_REG_TABLE (FLOATCODE + 1)
520 #define USE_MOD_TABLE (USE_REG_TABLE + 1)
521 #define USE_RM_TABLE (USE_MOD_TABLE + 1)
522 #define USE_PREFIX_TABLE (USE_RM_TABLE + 1)
523 #define USE_X86_64_TABLE (USE_PREFIX_TABLE + 1)
524 #define USE_3BYTE_TABLE (USE_X86_64_TABLE + 1)
525 #define USE_VEX_C4_TABLE (USE_3BYTE_TABLE + 1)
526 #define USE_VEX_C5_TABLE (USE_VEX_C4_TABLE + 1)
527 #define USE_VEX_LEN_TABLE (USE_VEX_C5_TABLE + 1)
528
529 #define FLOAT NULL, { { NULL, FLOATCODE } }
530
531 #define DIS386(T, I) NULL, { { NULL, (T)}, { NULL, (I) } }
532 #define REG_TABLE(I) DIS386 (USE_REG_TABLE, (I))
533 #define MOD_TABLE(I) DIS386 (USE_MOD_TABLE, (I))
534 #define RM_TABLE(I) DIS386 (USE_RM_TABLE, (I))
535 #define PREFIX_TABLE(I) DIS386 (USE_PREFIX_TABLE, (I))
536 #define X86_64_TABLE(I) DIS386 (USE_X86_64_TABLE, (I))
537 #define THREE_BYTE_TABLE(I) DIS386 (USE_3BYTE_TABLE, (I))
538 #define VEX_C4_TABLE(I) DIS386 (USE_VEX_C4_TABLE, (I))
539 #define VEX_C5_TABLE(I) DIS386 (USE_VEX_C5_TABLE, (I))
540 #define VEX_LEN_TABLE(I) DIS386 (USE_VEX_LEN_TABLE, (I))
541
542 #define REG_80 0
543 #define REG_81 (REG_80 + 1)
544 #define REG_82 (REG_81 + 1)
545 #define REG_8F (REG_82 + 1)
546 #define REG_C0 (REG_8F + 1)
547 #define REG_C1 (REG_C0 + 1)
548 #define REG_C6 (REG_C1 + 1)
549 #define REG_C7 (REG_C6 + 1)
550 #define REG_D0 (REG_C7 + 1)
551 #define REG_D1 (REG_D0 + 1)
552 #define REG_D2 (REG_D1 + 1)
553 #define REG_D3 (REG_D2 + 1)
554 #define REG_F6 (REG_D3 + 1)
555 #define REG_F7 (REG_F6 + 1)
556 #define REG_FE (REG_F7 + 1)
557 #define REG_FF (REG_FE + 1)
558 #define REG_0F00 (REG_FF + 1)
559 #define REG_0F01 (REG_0F00 + 1)
560 #define REG_0F0D (REG_0F01 + 1)
561 #define REG_0F18 (REG_0F0D + 1)
562 #define REG_0F71 (REG_0F18 + 1)
563 #define REG_0F72 (REG_0F71 + 1)
564 #define REG_0F73 (REG_0F72 + 1)
565 #define REG_0FA6 (REG_0F73 + 1)
566 #define REG_0FA7 (REG_0FA6 + 1)
567 #define REG_0FAE (REG_0FA7 + 1)
568 #define REG_0FBA (REG_0FAE + 1)
569 #define REG_0FC7 (REG_0FBA + 1)
570 #define REG_VEX_71 (REG_0FC7 + 1)
571 #define REG_VEX_72 (REG_VEX_71 + 1)
572 #define REG_VEX_73 (REG_VEX_72 + 1)
573 #define REG_VEX_AE (REG_VEX_73 + 1)
574
575 #define MOD_8D 0
576 #define MOD_0F01_REG_0 (MOD_8D + 1)
577 #define MOD_0F01_REG_1 (MOD_0F01_REG_0 + 1)
578 #define MOD_0F01_REG_2 (MOD_0F01_REG_1 + 1)
579 #define MOD_0F01_REG_3 (MOD_0F01_REG_2 + 1)
580 #define MOD_0F01_REG_7 (MOD_0F01_REG_3 + 1)
581 #define MOD_0F12_PREFIX_0 (MOD_0F01_REG_7 + 1)
582 #define MOD_0F13 (MOD_0F12_PREFIX_0 + 1)
583 #define MOD_0F16_PREFIX_0 (MOD_0F13 + 1)
584 #define MOD_0F17 (MOD_0F16_PREFIX_0 + 1)
585 #define MOD_0F18_REG_0 (MOD_0F17 + 1)
586 #define MOD_0F18_REG_1 (MOD_0F18_REG_0 + 1)
587 #define MOD_0F18_REG_2 (MOD_0F18_REG_1 + 1)
588 #define MOD_0F18_REG_3 (MOD_0F18_REG_2 + 1)
589 #define MOD_0F20 (MOD_0F18_REG_3 + 1)
590 #define MOD_0F21 (MOD_0F20 + 1)
591 #define MOD_0F22 (MOD_0F21 + 1)
592 #define MOD_0F23 (MOD_0F22 + 1)
593 #define MOD_0F24 (MOD_0F23 + 1)
594 #define MOD_0F26 (MOD_0F24 + 1)
595 #define MOD_0F2B_PREFIX_0 (MOD_0F26 + 1)
596 #define MOD_0F2B_PREFIX_1 (MOD_0F2B_PREFIX_0 + 1)
597 #define MOD_0F2B_PREFIX_2 (MOD_0F2B_PREFIX_1 + 1)
598 #define MOD_0F2B_PREFIX_3 (MOD_0F2B_PREFIX_2 + 1)
599 #define MOD_0F51 (MOD_0F2B_PREFIX_3 + 1)
600 #define MOD_0F71_REG_2 (MOD_0F51 + 1)
601 #define MOD_0F71_REG_4 (MOD_0F71_REG_2 + 1)
602 #define MOD_0F71_REG_6 (MOD_0F71_REG_4 + 1)
603 #define MOD_0F72_REG_2 (MOD_0F71_REG_6 + 1)
604 #define MOD_0F72_REG_4 (MOD_0F72_REG_2 + 1)
605 #define MOD_0F72_REG_6 (MOD_0F72_REG_4 + 1)
606 #define MOD_0F73_REG_2 (MOD_0F72_REG_6 + 1)
607 #define MOD_0F73_REG_3 (MOD_0F73_REG_2 + 1)
608 #define MOD_0F73_REG_6 (MOD_0F73_REG_3 + 1)
609 #define MOD_0F73_REG_7 (MOD_0F73_REG_6 + 1)
610 #define MOD_0FAE_REG_0 (MOD_0F73_REG_7 + 1)
611 #define MOD_0FAE_REG_1 (MOD_0FAE_REG_0 + 1)
612 #define MOD_0FAE_REG_2 (MOD_0FAE_REG_1 + 1)
613 #define MOD_0FAE_REG_3 (MOD_0FAE_REG_2 + 1)
614 #define MOD_0FAE_REG_4 (MOD_0FAE_REG_3 + 1)
615 #define MOD_0FAE_REG_5 (MOD_0FAE_REG_4 + 1)
616 #define MOD_0FAE_REG_6 (MOD_0FAE_REG_5 + 1)
617 #define MOD_0FAE_REG_7 (MOD_0FAE_REG_6 + 1)
618 #define MOD_0FB2 (MOD_0FAE_REG_7 + 1)
619 #define MOD_0FB4 (MOD_0FB2 + 1)
620 #define MOD_0FB5 (MOD_0FB4 + 1)
621 #define MOD_0FC7_REG_6 (MOD_0FB5 + 1)
622 #define MOD_0FC7_REG_7 (MOD_0FC7_REG_6 + 1)
623 #define MOD_0FD7 (MOD_0FC7_REG_7 + 1)
624 #define MOD_0FE7_PREFIX_2 (MOD_0FD7 + 1)
625 #define MOD_0FF0_PREFIX_3 (MOD_0FE7_PREFIX_2 + 1)
626 #define MOD_0F382A_PREFIX_2 (MOD_0FF0_PREFIX_3 + 1)
627 #define MOD_62_32BIT (MOD_0F382A_PREFIX_2 + 1)
628 #define MOD_C4_32BIT (MOD_62_32BIT + 1)
629 #define MOD_C5_32BIT (MOD_C4_32BIT + 1)
630 #define MOD_VEX_12_PREFIX_0 (MOD_C5_32BIT + 1)
631 #define MOD_VEX_13 (MOD_VEX_12_PREFIX_0 + 1)
632 #define MOD_VEX_16_PREFIX_0 (MOD_VEX_13 + 1)
633 #define MOD_VEX_17 (MOD_VEX_16_PREFIX_0 + 1)
634 #define MOD_VEX_2B (MOD_VEX_17 + 1)
635 #define MOD_VEX_51 (MOD_VEX_2B + 1)
636 #define MOD_VEX_71_REG_2 (MOD_VEX_51 + 1)
637 #define MOD_VEX_71_REG_4 (MOD_VEX_71_REG_2 + 1)
638 #define MOD_VEX_71_REG_6 (MOD_VEX_71_REG_4 + 1)
639 #define MOD_VEX_72_REG_2 (MOD_VEX_71_REG_6 + 1)
640 #define MOD_VEX_72_REG_4 (MOD_VEX_72_REG_2 + 1)
641 #define MOD_VEX_72_REG_6 (MOD_VEX_72_REG_4 + 1)
642 #define MOD_VEX_73_REG_2 (MOD_VEX_72_REG_6 + 1)
643 #define MOD_VEX_73_REG_3 (MOD_VEX_73_REG_2 + 1)
644 #define MOD_VEX_73_REG_6 (MOD_VEX_73_REG_3 + 1)
645 #define MOD_VEX_73_REG_7 (MOD_VEX_73_REG_6 + 1)
646 #define MOD_VEX_AE_REG_2 (MOD_VEX_73_REG_7 + 1)
647 #define MOD_VEX_AE_REG_3 (MOD_VEX_AE_REG_2 + 1)
648 #define MOD_VEX_D7_PREFIX_2 (MOD_VEX_AE_REG_3 + 1)
649 #define MOD_VEX_E7_PREFIX_2 (MOD_VEX_D7_PREFIX_2 + 1)
650 #define MOD_VEX_F0_PREFIX_3 (MOD_VEX_E7_PREFIX_2 + 1)
651 #define MOD_VEX_3818_PREFIX_2 (MOD_VEX_F0_PREFIX_3 + 1)
652 #define MOD_VEX_3819_PREFIX_2 (MOD_VEX_3818_PREFIX_2 + 1)
653 #define MOD_VEX_381A_PREFIX_2 (MOD_VEX_3819_PREFIX_2 + 1)
654 #define MOD_VEX_382A_PREFIX_2 (MOD_VEX_381A_PREFIX_2 + 1)
655 #define MOD_VEX_382C_PREFIX_2 (MOD_VEX_382A_PREFIX_2 + 1)
656 #define MOD_VEX_382D_PREFIX_2 (MOD_VEX_382C_PREFIX_2 + 1)
657 #define MOD_VEX_382E_PREFIX_2 (MOD_VEX_382D_PREFIX_2 + 1)
658 #define MOD_VEX_382F_PREFIX_2 (MOD_VEX_382E_PREFIX_2 + 1)
659
660 #define RM_0F01_REG_0 0
661 #define RM_0F01_REG_1 (RM_0F01_REG_0 + 1)
662 #define RM_0F01_REG_2 (RM_0F01_REG_1 + 1)
663 #define RM_0F01_REG_3 (RM_0F01_REG_2 + 1)
664 #define RM_0F01_REG_7 (RM_0F01_REG_3 + 1)
665 #define RM_0FAE_REG_5 (RM_0F01_REG_7 + 1)
666 #define RM_0FAE_REG_6 (RM_0FAE_REG_5 + 1)
667 #define RM_0FAE_REG_7 (RM_0FAE_REG_6 + 1)
668
669 #define PREFIX_90 0
670 #define PREFIX_0F10 (PREFIX_90 + 1)
671 #define PREFIX_0F11 (PREFIX_0F10 + 1)
672 #define PREFIX_0F12 (PREFIX_0F11 + 1)
673 #define PREFIX_0F16 (PREFIX_0F12 + 1)
674 #define PREFIX_0F2A (PREFIX_0F16 + 1)
675 #define PREFIX_0F2B (PREFIX_0F2A + 1)
676 #define PREFIX_0F2C (PREFIX_0F2B + 1)
677 #define PREFIX_0F2D (PREFIX_0F2C + 1)
678 #define PREFIX_0F2E (PREFIX_0F2D + 1)
679 #define PREFIX_0F2F (PREFIX_0F2E + 1)
680 #define PREFIX_0F51 (PREFIX_0F2F + 1)
681 #define PREFIX_0F52 (PREFIX_0F51 + 1)
682 #define PREFIX_0F53 (PREFIX_0F52 + 1)
683 #define PREFIX_0F58 (PREFIX_0F53 + 1)
684 #define PREFIX_0F59 (PREFIX_0F58 + 1)
685 #define PREFIX_0F5A (PREFIX_0F59 + 1)
686 #define PREFIX_0F5B (PREFIX_0F5A + 1)
687 #define PREFIX_0F5C (PREFIX_0F5B + 1)
688 #define PREFIX_0F5D (PREFIX_0F5C + 1)
689 #define PREFIX_0F5E (PREFIX_0F5D + 1)
690 #define PREFIX_0F5F (PREFIX_0F5E + 1)
691 #define PREFIX_0F60 (PREFIX_0F5F + 1)
692 #define PREFIX_0F61 (PREFIX_0F60 + 1)
693 #define PREFIX_0F62 (PREFIX_0F61 + 1)
694 #define PREFIX_0F6C (PREFIX_0F62 + 1)
695 #define PREFIX_0F6D (PREFIX_0F6C + 1)
696 #define PREFIX_0F6F (PREFIX_0F6D + 1)
697 #define PREFIX_0F70 (PREFIX_0F6F + 1)
698 #define PREFIX_0F73_REG_3 (PREFIX_0F70 + 1)
699 #define PREFIX_0F73_REG_7 (PREFIX_0F73_REG_3 + 1)
700 #define PREFIX_0F78 (PREFIX_0F73_REG_7 + 1)
701 #define PREFIX_0F79 (PREFIX_0F78 + 1)
702 #define PREFIX_0F7C (PREFIX_0F79 + 1)
703 #define PREFIX_0F7D (PREFIX_0F7C + 1)
704 #define PREFIX_0F7E (PREFIX_0F7D + 1)
705 #define PREFIX_0F7F (PREFIX_0F7E + 1)
706 #define PREFIX_0FB8 (PREFIX_0F7F + 1)
707 #define PREFIX_0FBD (PREFIX_0FB8 + 1)
708 #define PREFIX_0FC2 (PREFIX_0FBD + 1)
709 #define PREFIX_0FC3 (PREFIX_0FC2 + 1)
710 #define PREFIX_0FC7_REG_6 (PREFIX_0FC3 + 1)
711 #define PREFIX_0FD0 (PREFIX_0FC7_REG_6 + 1)
712 #define PREFIX_0FD6 (PREFIX_0FD0 + 1)
713 #define PREFIX_0FE6 (PREFIX_0FD6 + 1)
714 #define PREFIX_0FE7 (PREFIX_0FE6 + 1)
715 #define PREFIX_0FF0 (PREFIX_0FE7 + 1)
716 #define PREFIX_0FF7 (PREFIX_0FF0 + 1)
717 #define PREFIX_0F3810 (PREFIX_0FF7 + 1)
718 #define PREFIX_0F3814 (PREFIX_0F3810 + 1)
719 #define PREFIX_0F3815 (PREFIX_0F3814 + 1)
720 #define PREFIX_0F3817 (PREFIX_0F3815 + 1)
721 #define PREFIX_0F3820 (PREFIX_0F3817 + 1)
722 #define PREFIX_0F3821 (PREFIX_0F3820 + 1)
723 #define PREFIX_0F3822 (PREFIX_0F3821 + 1)
724 #define PREFIX_0F3823 (PREFIX_0F3822 + 1)
725 #define PREFIX_0F3824 (PREFIX_0F3823 + 1)
726 #define PREFIX_0F3825 (PREFIX_0F3824 + 1)
727 #define PREFIX_0F3828 (PREFIX_0F3825 + 1)
728 #define PREFIX_0F3829 (PREFIX_0F3828 + 1)
729 #define PREFIX_0F382A (PREFIX_0F3829 + 1)
730 #define PREFIX_0F382B (PREFIX_0F382A + 1)
731 #define PREFIX_0F3830 (PREFIX_0F382B + 1)
732 #define PREFIX_0F3831 (PREFIX_0F3830 + 1)
733 #define PREFIX_0F3832 (PREFIX_0F3831 + 1)
734 #define PREFIX_0F3833 (PREFIX_0F3832 + 1)
735 #define PREFIX_0F3834 (PREFIX_0F3833 + 1)
736 #define PREFIX_0F3835 (PREFIX_0F3834 + 1)
737 #define PREFIX_0F3837 (PREFIX_0F3835 + 1)
738 #define PREFIX_0F3838 (PREFIX_0F3837 + 1)
739 #define PREFIX_0F3839 (PREFIX_0F3838 + 1)
740 #define PREFIX_0F383A (PREFIX_0F3839 + 1)
741 #define PREFIX_0F383B (PREFIX_0F383A + 1)
742 #define PREFIX_0F383C (PREFIX_0F383B + 1)
743 #define PREFIX_0F383D (PREFIX_0F383C + 1)
744 #define PREFIX_0F383E (PREFIX_0F383D + 1)
745 #define PREFIX_0F383F (PREFIX_0F383E + 1)
746 #define PREFIX_0F3840 (PREFIX_0F383F + 1)
747 #define PREFIX_0F3841 (PREFIX_0F3840 + 1)
748 #define PREFIX_0F38DB (PREFIX_0F3841 + 1)
749 #define PREFIX_0F38DC (PREFIX_0F38DB + 1)
750 #define PREFIX_0F38DD (PREFIX_0F38DC + 1)
751 #define PREFIX_0F38DE (PREFIX_0F38DD + 1)
752 #define PREFIX_0F38DF (PREFIX_0F38DE + 1)
753 #define PREFIX_0F38F0 (PREFIX_0F38DF + 1)
754 #define PREFIX_0F38F1 (PREFIX_0F38F0 + 1)
755 #define PREFIX_0F3A08 (PREFIX_0F38F1 + 1)
756 #define PREFIX_0F3A09 (PREFIX_0F3A08 + 1)
757 #define PREFIX_0F3A0A (PREFIX_0F3A09 + 1)
758 #define PREFIX_0F3A0B (PREFIX_0F3A0A + 1)
759 #define PREFIX_0F3A0C (PREFIX_0F3A0B + 1)
760 #define PREFIX_0F3A0D (PREFIX_0F3A0C + 1)
761 #define PREFIX_0F3A0E (PREFIX_0F3A0D + 1)
762 #define PREFIX_0F3A14 (PREFIX_0F3A0E + 1)
763 #define PREFIX_0F3A15 (PREFIX_0F3A14 + 1)
764 #define PREFIX_0F3A16 (PREFIX_0F3A15 + 1)
765 #define PREFIX_0F3A17 (PREFIX_0F3A16 + 1)
766 #define PREFIX_0F3A20 (PREFIX_0F3A17 + 1)
767 #define PREFIX_0F3A21 (PREFIX_0F3A20 + 1)
768 #define PREFIX_0F3A22 (PREFIX_0F3A21 + 1)
769 #define PREFIX_0F3A40 (PREFIX_0F3A22 + 1)
770 #define PREFIX_0F3A41 (PREFIX_0F3A40 + 1)
771 #define PREFIX_0F3A42 (PREFIX_0F3A41 + 1)
772 #define PREFIX_0F3A44 (PREFIX_0F3A42 + 1)
773 #define PREFIX_0F3A60 (PREFIX_0F3A44 + 1)
774 #define PREFIX_0F3A61 (PREFIX_0F3A60 + 1)
775 #define PREFIX_0F3A62 (PREFIX_0F3A61 + 1)
776 #define PREFIX_0F3A63 (PREFIX_0F3A62 + 1)
777 #define PREFIX_0F3ADF (PREFIX_0F3A63 + 1)
778 #define PREFIX_VEX_10 (PREFIX_0F3ADF + 1)
779 #define PREFIX_VEX_11 (PREFIX_VEX_10 + 1)
780 #define PREFIX_VEX_12 (PREFIX_VEX_11 + 1)
781 #define PREFIX_VEX_16 (PREFIX_VEX_12 + 1)
782 #define PREFIX_VEX_2A (PREFIX_VEX_16 + 1)
783 #define PREFIX_VEX_2C (PREFIX_VEX_2A + 1)
784 #define PREFIX_VEX_2D (PREFIX_VEX_2C + 1)
785 #define PREFIX_VEX_2E (PREFIX_VEX_2D + 1)
786 #define PREFIX_VEX_2F (PREFIX_VEX_2E + 1)
787 #define PREFIX_VEX_51 (PREFIX_VEX_2F + 1)
788 #define PREFIX_VEX_52 (PREFIX_VEX_51 + 1)
789 #define PREFIX_VEX_53 (PREFIX_VEX_52 + 1)
790 #define PREFIX_VEX_58 (PREFIX_VEX_53 + 1)
791 #define PREFIX_VEX_59 (PREFIX_VEX_58 + 1)
792 #define PREFIX_VEX_5A (PREFIX_VEX_59 + 1)
793 #define PREFIX_VEX_5B (PREFIX_VEX_5A + 1)
794 #define PREFIX_VEX_5C (PREFIX_VEX_5B + 1)
795 #define PREFIX_VEX_5D (PREFIX_VEX_5C + 1)
796 #define PREFIX_VEX_5E (PREFIX_VEX_5D + 1)
797 #define PREFIX_VEX_5F (PREFIX_VEX_5E + 1)
798 #define PREFIX_VEX_60 (PREFIX_VEX_5F + 1)
799 #define PREFIX_VEX_61 (PREFIX_VEX_60 + 1)
800 #define PREFIX_VEX_62 (PREFIX_VEX_61 + 1)
801 #define PREFIX_VEX_63 (PREFIX_VEX_62 + 1)
802 #define PREFIX_VEX_64 (PREFIX_VEX_63 + 1)
803 #define PREFIX_VEX_65 (PREFIX_VEX_64 + 1)
804 #define PREFIX_VEX_66 (PREFIX_VEX_65 + 1)
805 #define PREFIX_VEX_67 (PREFIX_VEX_66 + 1)
806 #define PREFIX_VEX_68 (PREFIX_VEX_67 + 1)
807 #define PREFIX_VEX_69 (PREFIX_VEX_68 + 1)
808 #define PREFIX_VEX_6A (PREFIX_VEX_69 + 1)
809 #define PREFIX_VEX_6B (PREFIX_VEX_6A + 1)
810 #define PREFIX_VEX_6C (PREFIX_VEX_6B + 1)
811 #define PREFIX_VEX_6D (PREFIX_VEX_6C + 1)
812 #define PREFIX_VEX_6E (PREFIX_VEX_6D + 1)
813 #define PREFIX_VEX_6F (PREFIX_VEX_6E + 1)
814 #define PREFIX_VEX_70 (PREFIX_VEX_6F + 1)
815 #define PREFIX_VEX_71_REG_2 (PREFIX_VEX_70 + 1)
816 #define PREFIX_VEX_71_REG_4 (PREFIX_VEX_71_REG_2 + 1)
817 #define PREFIX_VEX_71_REG_6 (PREFIX_VEX_71_REG_4 + 1)
818 #define PREFIX_VEX_72_REG_2 (PREFIX_VEX_71_REG_6 + 1)
819 #define PREFIX_VEX_72_REG_4 (PREFIX_VEX_72_REG_2 + 1)
820 #define PREFIX_VEX_72_REG_6 (PREFIX_VEX_72_REG_4 + 1)
821 #define PREFIX_VEX_73_REG_2 (PREFIX_VEX_72_REG_6 + 1)
822 #define PREFIX_VEX_73_REG_3 (PREFIX_VEX_73_REG_2 + 1)
823 #define PREFIX_VEX_73_REG_6 (PREFIX_VEX_73_REG_3 + 1)
824 #define PREFIX_VEX_73_REG_7 (PREFIX_VEX_73_REG_6 + 1)
825 #define PREFIX_VEX_74 (PREFIX_VEX_73_REG_7 + 1)
826 #define PREFIX_VEX_75 (PREFIX_VEX_74 + 1)
827 #define PREFIX_VEX_76 (PREFIX_VEX_75 + 1)
828 #define PREFIX_VEX_77 (PREFIX_VEX_76 + 1)
829 #define PREFIX_VEX_7C (PREFIX_VEX_77 + 1)
830 #define PREFIX_VEX_7D (PREFIX_VEX_7C + 1)
831 #define PREFIX_VEX_7E (PREFIX_VEX_7D + 1)
832 #define PREFIX_VEX_7F (PREFIX_VEX_7E + 1)
833 #define PREFIX_VEX_C2 (PREFIX_VEX_7F + 1)
834 #define PREFIX_VEX_C4 (PREFIX_VEX_C2 + 1)
835 #define PREFIX_VEX_C5 (PREFIX_VEX_C4 + 1)
836 #define PREFIX_VEX_D0 (PREFIX_VEX_C5 + 1)
837 #define PREFIX_VEX_D1 (PREFIX_VEX_D0 + 1)
838 #define PREFIX_VEX_D2 (PREFIX_VEX_D1 + 1)
839 #define PREFIX_VEX_D3 (PREFIX_VEX_D2 + 1)
840 #define PREFIX_VEX_D4 (PREFIX_VEX_D3 + 1)
841 #define PREFIX_VEX_D5 (PREFIX_VEX_D4 + 1)
842 #define PREFIX_VEX_D6 (PREFIX_VEX_D5 + 1)
843 #define PREFIX_VEX_D7 (PREFIX_VEX_D6 + 1)
844 #define PREFIX_VEX_D8 (PREFIX_VEX_D7 + 1)
845 #define PREFIX_VEX_D9 (PREFIX_VEX_D8 + 1)
846 #define PREFIX_VEX_DA (PREFIX_VEX_D9 + 1)
847 #define PREFIX_VEX_DB (PREFIX_VEX_DA + 1)
848 #define PREFIX_VEX_DC (PREFIX_VEX_DB + 1)
849 #define PREFIX_VEX_DD (PREFIX_VEX_DC + 1)
850 #define PREFIX_VEX_DE (PREFIX_VEX_DD + 1)
851 #define PREFIX_VEX_DF (PREFIX_VEX_DE + 1)
852 #define PREFIX_VEX_E0 (PREFIX_VEX_DF + 1)
853 #define PREFIX_VEX_E1 (PREFIX_VEX_E0 + 1)
854 #define PREFIX_VEX_E2 (PREFIX_VEX_E1 + 1)
855 #define PREFIX_VEX_E3 (PREFIX_VEX_E2 + 1)
856 #define PREFIX_VEX_E4 (PREFIX_VEX_E3 + 1)
857 #define PREFIX_VEX_E5 (PREFIX_VEX_E4 + 1)
858 #define PREFIX_VEX_E6 (PREFIX_VEX_E5 + 1)
859 #define PREFIX_VEX_E7 (PREFIX_VEX_E6 + 1)
860 #define PREFIX_VEX_E8 (PREFIX_VEX_E7 + 1)
861 #define PREFIX_VEX_E9 (PREFIX_VEX_E8 + 1)
862 #define PREFIX_VEX_EA (PREFIX_VEX_E9 + 1)
863 #define PREFIX_VEX_EB (PREFIX_VEX_EA + 1)
864 #define PREFIX_VEX_EC (PREFIX_VEX_EB + 1)
865 #define PREFIX_VEX_ED (PREFIX_VEX_EC + 1)
866 #define PREFIX_VEX_EE (PREFIX_VEX_ED + 1)
867 #define PREFIX_VEX_EF (PREFIX_VEX_EE + 1)
868 #define PREFIX_VEX_F0 (PREFIX_VEX_EF + 1)
869 #define PREFIX_VEX_F1 (PREFIX_VEX_F0 + 1)
870 #define PREFIX_VEX_F2 (PREFIX_VEX_F1 + 1)
871 #define PREFIX_VEX_F3 (PREFIX_VEX_F2 + 1)
872 #define PREFIX_VEX_F4 (PREFIX_VEX_F3 + 1)
873 #define PREFIX_VEX_F5 (PREFIX_VEX_F4 + 1)
874 #define PREFIX_VEX_F6 (PREFIX_VEX_F5 + 1)
875 #define PREFIX_VEX_F7 (PREFIX_VEX_F6 + 1)
876 #define PREFIX_VEX_F8 (PREFIX_VEX_F7 + 1)
877 #define PREFIX_VEX_F9 (PREFIX_VEX_F8 + 1)
878 #define PREFIX_VEX_FA (PREFIX_VEX_F9 + 1)
879 #define PREFIX_VEX_FB (PREFIX_VEX_FA + 1)
880 #define PREFIX_VEX_FC (PREFIX_VEX_FB + 1)
881 #define PREFIX_VEX_FD (PREFIX_VEX_FC + 1)
882 #define PREFIX_VEX_FE (PREFIX_VEX_FD + 1)
883 #define PREFIX_VEX_3800 (PREFIX_VEX_FE + 1)
884 #define PREFIX_VEX_3801 (PREFIX_VEX_3800 + 1)
885 #define PREFIX_VEX_3802 (PREFIX_VEX_3801 + 1)
886 #define PREFIX_VEX_3803 (PREFIX_VEX_3802 + 1)
887 #define PREFIX_VEX_3804 (PREFIX_VEX_3803 + 1)
888 #define PREFIX_VEX_3805 (PREFIX_VEX_3804 + 1)
889 #define PREFIX_VEX_3806 (PREFIX_VEX_3805 + 1)
890 #define PREFIX_VEX_3807 (PREFIX_VEX_3806 + 1)
891 #define PREFIX_VEX_3808 (PREFIX_VEX_3807 + 1)
892 #define PREFIX_VEX_3809 (PREFIX_VEX_3808 + 1)
893 #define PREFIX_VEX_380A (PREFIX_VEX_3809 + 1)
894 #define PREFIX_VEX_380B (PREFIX_VEX_380A + 1)
895 #define PREFIX_VEX_380C (PREFIX_VEX_380B + 1)
896 #define PREFIX_VEX_380D (PREFIX_VEX_380C + 1)
897 #define PREFIX_VEX_380E (PREFIX_VEX_380D + 1)
898 #define PREFIX_VEX_380F (PREFIX_VEX_380E + 1)
899 #define PREFIX_VEX_3817 (PREFIX_VEX_380F + 1)
900 #define PREFIX_VEX_3818 (PREFIX_VEX_3817 + 1)
901 #define PREFIX_VEX_3819 (PREFIX_VEX_3818 + 1)
902 #define PREFIX_VEX_381A (PREFIX_VEX_3819 + 1)
903 #define PREFIX_VEX_381C (PREFIX_VEX_381A + 1)
904 #define PREFIX_VEX_381D (PREFIX_VEX_381C + 1)
905 #define PREFIX_VEX_381E (PREFIX_VEX_381D + 1)
906 #define PREFIX_VEX_3820 (PREFIX_VEX_381E + 1)
907 #define PREFIX_VEX_3821 (PREFIX_VEX_3820 + 1)
908 #define PREFIX_VEX_3822 (PREFIX_VEX_3821 + 1)
909 #define PREFIX_VEX_3823 (PREFIX_VEX_3822 + 1)
910 #define PREFIX_VEX_3824 (PREFIX_VEX_3823 + 1)
911 #define PREFIX_VEX_3825 (PREFIX_VEX_3824 + 1)
912 #define PREFIX_VEX_3828 (PREFIX_VEX_3825 + 1)
913 #define PREFIX_VEX_3829 (PREFIX_VEX_3828 + 1)
914 #define PREFIX_VEX_382A (PREFIX_VEX_3829 + 1)
915 #define PREFIX_VEX_382B (PREFIX_VEX_382A + 1)
916 #define PREFIX_VEX_382C (PREFIX_VEX_382B + 1)
917 #define PREFIX_VEX_382D (PREFIX_VEX_382C + 1)
918 #define PREFIX_VEX_382E (PREFIX_VEX_382D + 1)
919 #define PREFIX_VEX_382F (PREFIX_VEX_382E + 1)
920 #define PREFIX_VEX_3830 (PREFIX_VEX_382F + 1)
921 #define PREFIX_VEX_3831 (PREFIX_VEX_3830 + 1)
922 #define PREFIX_VEX_3832 (PREFIX_VEX_3831 + 1)
923 #define PREFIX_VEX_3833 (PREFIX_VEX_3832 + 1)
924 #define PREFIX_VEX_3834 (PREFIX_VEX_3833 + 1)
925 #define PREFIX_VEX_3835 (PREFIX_VEX_3834 + 1)
926 #define PREFIX_VEX_3837 (PREFIX_VEX_3835 + 1)
927 #define PREFIX_VEX_3838 (PREFIX_VEX_3837 + 1)
928 #define PREFIX_VEX_3839 (PREFIX_VEX_3838 + 1)
929 #define PREFIX_VEX_383A (PREFIX_VEX_3839 + 1)
930 #define PREFIX_VEX_383B (PREFIX_VEX_383A + 1)
931 #define PREFIX_VEX_383C (PREFIX_VEX_383B + 1)
932 #define PREFIX_VEX_383D (PREFIX_VEX_383C + 1)
933 #define PREFIX_VEX_383E (PREFIX_VEX_383D + 1)
934 #define PREFIX_VEX_383F (PREFIX_VEX_383E + 1)
935 #define PREFIX_VEX_3840 (PREFIX_VEX_383F + 1)
936 #define PREFIX_VEX_3841 (PREFIX_VEX_3840 + 1)
937 #define PREFIX_VEX_3A04 (PREFIX_VEX_3841 + 1)
938 #define PREFIX_VEX_3A05 (PREFIX_VEX_3A04 + 1)
939 #define PREFIX_VEX_3A06 (PREFIX_VEX_3A05 + 1)
940 #define PREFIX_VEX_3A08 (PREFIX_VEX_3A06 + 1)
941 #define PREFIX_VEX_3A09 (PREFIX_VEX_3A08 + 1)
942 #define PREFIX_VEX_3A0A (PREFIX_VEX_3A09 + 1)
943 #define PREFIX_VEX_3A0B (PREFIX_VEX_3A0A + 1)
944 #define PREFIX_VEX_3A0C (PREFIX_VEX_3A0B + 1)
945 #define PREFIX_VEX_3A0D (PREFIX_VEX_3A0C + 1)
946 #define PREFIX_VEX_3A0E (PREFIX_VEX_3A0D + 1)
947 #define PREFIX_VEX_3A0F (PREFIX_VEX_3A0E + 1)
948 #define PREFIX_VEX_3A14 (PREFIX_VEX_3A0F + 1)
949 #define PREFIX_VEX_3A15 (PREFIX_VEX_3A14 + 1)
950 #define PREFIX_VEX_3A16 (PREFIX_VEX_3A15 + 1)
951 #define PREFIX_VEX_3A17 (PREFIX_VEX_3A16 + 1)
952 #define PREFIX_VEX_3A18 (PREFIX_VEX_3A17 + 1)
953 #define PREFIX_VEX_3A19 (PREFIX_VEX_3A18 + 1)
954 #define PREFIX_VEX_3A20 (PREFIX_VEX_3A19 + 1)
955 #define PREFIX_VEX_3A21 (PREFIX_VEX_3A20 + 1)
956 #define PREFIX_VEX_3A22 (PREFIX_VEX_3A21 + 1)
957 #define PREFIX_VEX_3A40 (PREFIX_VEX_3A22 + 1)
958 #define PREFIX_VEX_3A41 (PREFIX_VEX_3A40 + 1)
959 #define PREFIX_VEX_3A42 (PREFIX_VEX_3A41 + 1)
960 #define PREFIX_VEX_3A48 (PREFIX_VEX_3A42 + 1)
961 #define PREFIX_VEX_3A49 (PREFIX_VEX_3A48 + 1)
962 #define PREFIX_VEX_3A4A (PREFIX_VEX_3A49 + 1)
963 #define PREFIX_VEX_3A4B (PREFIX_VEX_3A4A + 1)
964 #define PREFIX_VEX_3A4C (PREFIX_VEX_3A4B + 1)
965 #define PREFIX_VEX_3A5C (PREFIX_VEX_3A4C + 1)
966 #define PREFIX_VEX_3A5D (PREFIX_VEX_3A5C + 1)
967 #define PREFIX_VEX_3A5E (PREFIX_VEX_3A5D + 1)
968 #define PREFIX_VEX_3A5F (PREFIX_VEX_3A5E + 1)
969 #define PREFIX_VEX_3A60 (PREFIX_VEX_3A5F + 1)
970 #define PREFIX_VEX_3A61 (PREFIX_VEX_3A60 + 1)
971 #define PREFIX_VEX_3A62 (PREFIX_VEX_3A61 + 1)
972 #define PREFIX_VEX_3A63 (PREFIX_VEX_3A62 + 1)
973 #define PREFIX_VEX_3A68 (PREFIX_VEX_3A63 + 1)
974 #define PREFIX_VEX_3A69 (PREFIX_VEX_3A68 + 1)
975 #define PREFIX_VEX_3A6A (PREFIX_VEX_3A69 + 1)
976 #define PREFIX_VEX_3A6B (PREFIX_VEX_3A6A + 1)
977 #define PREFIX_VEX_3A6C (PREFIX_VEX_3A6B + 1)
978 #define PREFIX_VEX_3A6D (PREFIX_VEX_3A6C + 1)
979 #define PREFIX_VEX_3A6E (PREFIX_VEX_3A6D + 1)
980 #define PREFIX_VEX_3A6F (PREFIX_VEX_3A6E + 1)
981 #define PREFIX_VEX_3A78 (PREFIX_VEX_3A6F + 1)
982 #define PREFIX_VEX_3A79 (PREFIX_VEX_3A78 + 1)
983 #define PREFIX_VEX_3A7A (PREFIX_VEX_3A79 + 1)
984 #define PREFIX_VEX_3A7B (PREFIX_VEX_3A7A + 1)
985 #define PREFIX_VEX_3A7C (PREFIX_VEX_3A7B + 1)
986 #define PREFIX_VEX_3A7D (PREFIX_VEX_3A7C + 1)
987 #define PREFIX_VEX_3A7E (PREFIX_VEX_3A7D + 1)
988 #define PREFIX_VEX_3A7F (PREFIX_VEX_3A7E + 1)
989
990 #define X86_64_06 0
991 #define X86_64_07 (X86_64_06 + 1)
992 #define X86_64_0D (X86_64_07 + 1)
993 #define X86_64_16 (X86_64_0D + 1)
994 #define X86_64_17 (X86_64_16 + 1)
995 #define X86_64_1E (X86_64_17 + 1)
996 #define X86_64_1F (X86_64_1E + 1)
997 #define X86_64_27 (X86_64_1F + 1)
998 #define X86_64_2F (X86_64_27 + 1)
999 #define X86_64_37 (X86_64_2F + 1)
1000 #define X86_64_3F (X86_64_37 + 1)
1001 #define X86_64_60 (X86_64_3F + 1)
1002 #define X86_64_61 (X86_64_60 + 1)
1003 #define X86_64_62 (X86_64_61 + 1)
1004 #define X86_64_63 (X86_64_62 + 1)
1005 #define X86_64_6D (X86_64_63 + 1)
1006 #define X86_64_6F (X86_64_6D + 1)
1007 #define X86_64_9A (X86_64_6F + 1)
1008 #define X86_64_C4 (X86_64_9A + 1)
1009 #define X86_64_C5 (X86_64_C4 + 1)
1010 #define X86_64_CE (X86_64_C5 + 1)
1011 #define X86_64_D4 (X86_64_CE + 1)
1012 #define X86_64_D5 (X86_64_D4 + 1)
1013 #define X86_64_EA (X86_64_D5 + 1)
1014 #define X86_64_0F01_REG_0 (X86_64_EA + 1)
1015 #define X86_64_0F01_REG_1 (X86_64_0F01_REG_0 + 1)
1016 #define X86_64_0F01_REG_2 (X86_64_0F01_REG_1 + 1)
1017 #define X86_64_0F01_REG_3 (X86_64_0F01_REG_2 + 1)
1018
1019 #define THREE_BYTE_0F24 0
1020 #define THREE_BYTE_0F25 (THREE_BYTE_0F24 + 1)
1021 #define THREE_BYTE_0F38 (THREE_BYTE_0F25 + 1)
1022 #define THREE_BYTE_0F3A (THREE_BYTE_0F38 + 1)
1023 #define THREE_BYTE_0F7A (THREE_BYTE_0F3A + 1)
1024 #define THREE_BYTE_0F7B (THREE_BYTE_0F7A + 1)
1025
1026 #define VEX_0F 0
1027 #define VEX_0F38 (VEX_0F + 1)
1028 #define VEX_0F3A (VEX_0F38 + 1)
1029
1030 #define VEX_LEN_10_P_1 0
1031 #define VEX_LEN_10_P_3 (VEX_LEN_10_P_1 + 1)
1032 #define VEX_LEN_11_P_1 (VEX_LEN_10_P_3 + 1)
1033 #define VEX_LEN_11_P_3 (VEX_LEN_11_P_1 + 1)
1034 #define VEX_LEN_12_P_0_M_0 (VEX_LEN_11_P_3 + 1)
1035 #define VEX_LEN_12_P_0_M_1 (VEX_LEN_12_P_0_M_0 + 1)
1036 #define VEX_LEN_12_P_2 (VEX_LEN_12_P_0_M_1 + 1)
1037 #define VEX_LEN_13_M_0 (VEX_LEN_12_P_2 + 1)
1038 #define VEX_LEN_16_P_0_M_0 (VEX_LEN_13_M_0 + 1)
1039 #define VEX_LEN_16_P_0_M_1 (VEX_LEN_16_P_0_M_0 + 1)
1040 #define VEX_LEN_16_P_2 (VEX_LEN_16_P_0_M_1 + 1)
1041 #define VEX_LEN_17_M_0 (VEX_LEN_16_P_2 + 1)
1042 #define VEX_LEN_2A_P_1 (VEX_LEN_17_M_0 + 1)
1043 #define VEX_LEN_2A_P_3 (VEX_LEN_2A_P_1 + 1)
1044 #define VEX_LEN_2B_M_0 (VEX_LEN_2A_P_3 + 1)
1045 #define VEX_LEN_2C_P_1 (VEX_LEN_2B_M_0 + 1)
1046 #define VEX_LEN_2C_P_3 (VEX_LEN_2C_P_1 + 1)
1047 #define VEX_LEN_2D_P_1 (VEX_LEN_2C_P_3 + 1)
1048 #define VEX_LEN_2D_P_3 (VEX_LEN_2D_P_1 + 1)
1049 #define VEX_LEN_2E_P_0 (VEX_LEN_2D_P_3 + 1)
1050 #define VEX_LEN_2E_P_2 (VEX_LEN_2E_P_0 + 1)
1051 #define VEX_LEN_2F_P_0 (VEX_LEN_2E_P_2 + 1)
1052 #define VEX_LEN_2F_P_2 (VEX_LEN_2F_P_0 + 1)
1053 #define VEX_LEN_51_P_1 (VEX_LEN_2F_P_2 + 1)
1054 #define VEX_LEN_51_P_3 (VEX_LEN_51_P_1 + 1)
1055 #define VEX_LEN_52_P_1 (VEX_LEN_51_P_3 + 1)
1056 #define VEX_LEN_53_P_1 (VEX_LEN_52_P_1 + 1)
1057 #define VEX_LEN_58_P_1 (VEX_LEN_53_P_1 + 1)
1058 #define VEX_LEN_58_P_3 (VEX_LEN_58_P_1 + 1)
1059 #define VEX_LEN_59_P_1 (VEX_LEN_58_P_3 + 1)
1060 #define VEX_LEN_59_P_3 (VEX_LEN_59_P_1 + 1)
1061 #define VEX_LEN_5A_P_1 (VEX_LEN_59_P_3 + 1)
1062 #define VEX_LEN_5A_P_3 (VEX_LEN_5A_P_1 + 1)
1063 #define VEX_LEN_5C_P_1 (VEX_LEN_5A_P_3 + 1)
1064 #define VEX_LEN_5C_P_3 (VEX_LEN_5C_P_1 + 1)
1065 #define VEX_LEN_5D_P_1 (VEX_LEN_5C_P_3 + 1)
1066 #define VEX_LEN_5D_P_3 (VEX_LEN_5D_P_1 + 1)
1067 #define VEX_LEN_5E_P_1 (VEX_LEN_5D_P_3 + 1)
1068 #define VEX_LEN_5E_P_3 (VEX_LEN_5E_P_1 + 1)
1069 #define VEX_LEN_5F_P_1 (VEX_LEN_5E_P_3 + 1)
1070 #define VEX_LEN_5F_P_3 (VEX_LEN_5F_P_1 + 1)
1071 #define VEX_LEN_60_P_2 (VEX_LEN_5F_P_3 + 1)
1072 #define VEX_LEN_61_P_2 (VEX_LEN_60_P_2 + 1)
1073 #define VEX_LEN_62_P_2 (VEX_LEN_61_P_2 + 1)
1074 #define VEX_LEN_63_P_2 (VEX_LEN_62_P_2 + 1)
1075 #define VEX_LEN_64_P_2 (VEX_LEN_63_P_2 + 1)
1076 #define VEX_LEN_65_P_2 (VEX_LEN_64_P_2 + 1)
1077 #define VEX_LEN_66_P_2 (VEX_LEN_65_P_2 + 1)
1078 #define VEX_LEN_67_P_2 (VEX_LEN_66_P_2 + 1)
1079 #define VEX_LEN_68_P_2 (VEX_LEN_67_P_2 + 1)
1080 #define VEX_LEN_69_P_2 (VEX_LEN_68_P_2 + 1)
1081 #define VEX_LEN_6A_P_2 (VEX_LEN_69_P_2 + 1)
1082 #define VEX_LEN_6B_P_2 (VEX_LEN_6A_P_2 + 1)
1083 #define VEX_LEN_6C_P_2 (VEX_LEN_6B_P_2 + 1)
1084 #define VEX_LEN_6D_P_2 (VEX_LEN_6C_P_2 + 1)
1085 #define VEX_LEN_6E_P_2 (VEX_LEN_6D_P_2 + 1)
1086 #define VEX_LEN_70_P_1 (VEX_LEN_6E_P_2 + 1)
1087 #define VEX_LEN_70_P_2 (VEX_LEN_70_P_1 + 1)
1088 #define VEX_LEN_70_P_3 (VEX_LEN_70_P_2 + 1)
1089 #define VEX_LEN_71_R_2_P_2 (VEX_LEN_70_P_3 + 1)
1090 #define VEX_LEN_71_R_4_P_2 (VEX_LEN_71_R_2_P_2 + 1)
1091 #define VEX_LEN_71_R_6_P_2 (VEX_LEN_71_R_4_P_2 + 1)
1092 #define VEX_LEN_72_R_2_P_2 (VEX_LEN_71_R_6_P_2 + 1)
1093 #define VEX_LEN_72_R_4_P_2 (VEX_LEN_72_R_2_P_2 + 1)
1094 #define VEX_LEN_72_R_6_P_2 (VEX_LEN_72_R_4_P_2 + 1)
1095 #define VEX_LEN_73_R_2_P_2 (VEX_LEN_72_R_6_P_2 + 1)
1096 #define VEX_LEN_73_R_3_P_2 (VEX_LEN_73_R_2_P_2 + 1)
1097 #define VEX_LEN_73_R_6_P_2 (VEX_LEN_73_R_3_P_2 + 1)
1098 #define VEX_LEN_73_R_7_P_2 (VEX_LEN_73_R_6_P_2 + 1)
1099 #define VEX_LEN_74_P_2 (VEX_LEN_73_R_7_P_2 + 1)
1100 #define VEX_LEN_75_P_2 (VEX_LEN_74_P_2 + 1)
1101 #define VEX_LEN_76_P_2 (VEX_LEN_75_P_2 + 1)
1102 #define VEX_LEN_7E_P_1 (VEX_LEN_76_P_2 + 1)
1103 #define VEX_LEN_7E_P_2 (VEX_LEN_7E_P_1 + 1)
1104 #define VEX_LEN_AE_R_2_M_0 (VEX_LEN_7E_P_2 + 1)
1105 #define VEX_LEN_AE_R_3_M_0 (VEX_LEN_AE_R_2_M_0 + 1)
1106 #define VEX_LEN_C2_P_1 (VEX_LEN_AE_R_3_M_0 + 1)
1107 #define VEX_LEN_C2_P_3 (VEX_LEN_C2_P_1 + 1)
1108 #define VEX_LEN_C4_P_2 (VEX_LEN_C2_P_3 + 1)
1109 #define VEX_LEN_C5_P_2 (VEX_LEN_C4_P_2 + 1)
1110 #define VEX_LEN_D1_P_2 (VEX_LEN_C5_P_2 + 1)
1111 #define VEX_LEN_D2_P_2 (VEX_LEN_D1_P_2 + 1)
1112 #define VEX_LEN_D3_P_2 (VEX_LEN_D2_P_2 + 1)
1113 #define VEX_LEN_D4_P_2 (VEX_LEN_D3_P_2 + 1)
1114 #define VEX_LEN_D5_P_2 (VEX_LEN_D4_P_2 + 1)
1115 #define VEX_LEN_D6_P_2 (VEX_LEN_D5_P_2 + 1)
1116 #define VEX_LEN_D7_P_2_M_1 (VEX_LEN_D6_P_2 + 1)
1117 #define VEX_LEN_D8_P_2 (VEX_LEN_D7_P_2_M_1 + 1)
1118 #define VEX_LEN_D9_P_2 (VEX_LEN_D8_P_2 + 1)
1119 #define VEX_LEN_DA_P_2 (VEX_LEN_D9_P_2 + 1)
1120 #define VEX_LEN_DB_P_2 (VEX_LEN_DA_P_2 + 1)
1121 #define VEX_LEN_DC_P_2 (VEX_LEN_DB_P_2 + 1)
1122 #define VEX_LEN_DD_P_2 (VEX_LEN_DC_P_2 + 1)
1123 #define VEX_LEN_DE_P_2 (VEX_LEN_DD_P_2 + 1)
1124 #define VEX_LEN_DF_P_2 (VEX_LEN_DE_P_2 + 1)
1125 #define VEX_LEN_E0_P_2 (VEX_LEN_DF_P_2 + 1)
1126 #define VEX_LEN_E1_P_2 (VEX_LEN_E0_P_2 + 1)
1127 #define VEX_LEN_E2_P_2 (VEX_LEN_E1_P_2 + 1)
1128 #define VEX_LEN_E3_P_2 (VEX_LEN_E2_P_2 + 1)
1129 #define VEX_LEN_E4_P_2 (VEX_LEN_E3_P_2 + 1)
1130 #define VEX_LEN_E5_P_2 (VEX_LEN_E4_P_2 + 1)
1131 #define VEX_LEN_E7_P_2_M_0 (VEX_LEN_E5_P_2 + 1)
1132 #define VEX_LEN_E8_P_2 (VEX_LEN_E7_P_2_M_0 + 1)
1133 #define VEX_LEN_E9_P_2 (VEX_LEN_E8_P_2 + 1)
1134 #define VEX_LEN_EA_P_2 (VEX_LEN_E9_P_2 + 1)
1135 #define VEX_LEN_EB_P_2 (VEX_LEN_EA_P_2 + 1)
1136 #define VEX_LEN_EC_P_2 (VEX_LEN_EB_P_2 + 1)
1137 #define VEX_LEN_ED_P_2 (VEX_LEN_EC_P_2 + 1)
1138 #define VEX_LEN_EE_P_2 (VEX_LEN_ED_P_2 + 1)
1139 #define VEX_LEN_EF_P_2 (VEX_LEN_EE_P_2 + 1)
1140 #define VEX_LEN_F1_P_2 (VEX_LEN_EF_P_2 + 1)
1141 #define VEX_LEN_F2_P_2 (VEX_LEN_F1_P_2 + 1)
1142 #define VEX_LEN_F3_P_2 (VEX_LEN_F2_P_2 + 1)
1143 #define VEX_LEN_F4_P_2 (VEX_LEN_F3_P_2 + 1)
1144 #define VEX_LEN_F5_P_2 (VEX_LEN_F4_P_2 + 1)
1145 #define VEX_LEN_F6_P_2 (VEX_LEN_F5_P_2 + 1)
1146 #define VEX_LEN_F7_P_2 (VEX_LEN_F6_P_2 + 1)
1147 #define VEX_LEN_F8_P_2 (VEX_LEN_F7_P_2 + 1)
1148 #define VEX_LEN_F9_P_2 (VEX_LEN_F8_P_2 + 1)
1149 #define VEX_LEN_FA_P_2 (VEX_LEN_F9_P_2 + 1)
1150 #define VEX_LEN_FB_P_2 (VEX_LEN_FA_P_2 + 1)
1151 #define VEX_LEN_FC_P_2 (VEX_LEN_FB_P_2 + 1)
1152 #define VEX_LEN_FD_P_2 (VEX_LEN_FC_P_2 + 1)
1153 #define VEX_LEN_FE_P_2 (VEX_LEN_FD_P_2 + 1)
1154 #define VEX_LEN_3800_P_2 (VEX_LEN_FE_P_2 + 1)
1155 #define VEX_LEN_3801_P_2 (VEX_LEN_3800_P_2 + 1)
1156 #define VEX_LEN_3802_P_2 (VEX_LEN_3801_P_2 + 1)
1157 #define VEX_LEN_3803_P_2 (VEX_LEN_3802_P_2 + 1)
1158 #define VEX_LEN_3804_P_2 (VEX_LEN_3803_P_2 + 1)
1159 #define VEX_LEN_3805_P_2 (VEX_LEN_3804_P_2 + 1)
1160 #define VEX_LEN_3806_P_2 (VEX_LEN_3805_P_2 + 1)
1161 #define VEX_LEN_3807_P_2 (VEX_LEN_3806_P_2 + 1)
1162 #define VEX_LEN_3808_P_2 (VEX_LEN_3807_P_2 + 1)
1163 #define VEX_LEN_3809_P_2 (VEX_LEN_3808_P_2 + 1)
1164 #define VEX_LEN_380A_P_2 (VEX_LEN_3809_P_2 + 1)
1165 #define VEX_LEN_380B_P_2 (VEX_LEN_380A_P_2 + 1)
1166 #define VEX_LEN_3819_P_2_M_0 (VEX_LEN_380B_P_2 + 1)
1167 #define VEX_LEN_381A_P_2_M_0 (VEX_LEN_3819_P_2_M_0 + 1)
1168 #define VEX_LEN_381C_P_2 (VEX_LEN_381A_P_2_M_0 + 1)
1169 #define VEX_LEN_381D_P_2 (VEX_LEN_381C_P_2 + 1)
1170 #define VEX_LEN_381E_P_2 (VEX_LEN_381D_P_2 + 1)
1171 #define VEX_LEN_3820_P_2 (VEX_LEN_381E_P_2 + 1)
1172 #define VEX_LEN_3821_P_2 (VEX_LEN_3820_P_2 + 1)
1173 #define VEX_LEN_3822_P_2 (VEX_LEN_3821_P_2 + 1)
1174 #define VEX_LEN_3823_P_2 (VEX_LEN_3822_P_2 + 1)
1175 #define VEX_LEN_3824_P_2 (VEX_LEN_3823_P_2 + 1)
1176 #define VEX_LEN_3825_P_2 (VEX_LEN_3824_P_2 + 1)
1177 #define VEX_LEN_3828_P_2 (VEX_LEN_3825_P_2 + 1)
1178 #define VEX_LEN_3829_P_2 (VEX_LEN_3828_P_2 + 1)
1179 #define VEX_LEN_382A_P_2_M_0 (VEX_LEN_3829_P_2 + 1)
1180 #define VEX_LEN_382B_P_2 (VEX_LEN_382A_P_2_M_0 + 1)
1181 #define VEX_LEN_3830_P_2 (VEX_LEN_382B_P_2 + 1)
1182 #define VEX_LEN_3831_P_2 (VEX_LEN_3830_P_2 + 1)
1183 #define VEX_LEN_3832_P_2 (VEX_LEN_3831_P_2 + 1)
1184 #define VEX_LEN_3833_P_2 (VEX_LEN_3832_P_2 + 1)
1185 #define VEX_LEN_3834_P_2 (VEX_LEN_3833_P_2 + 1)
1186 #define VEX_LEN_3835_P_2 (VEX_LEN_3834_P_2 + 1)
1187 #define VEX_LEN_3837_P_2 (VEX_LEN_3835_P_2 + 1)
1188 #define VEX_LEN_3838_P_2 (VEX_LEN_3837_P_2 + 1)
1189 #define VEX_LEN_3839_P_2 (VEX_LEN_3838_P_2 + 1)
1190 #define VEX_LEN_383A_P_2 (VEX_LEN_3839_P_2 + 1)
1191 #define VEX_LEN_383B_P_2 (VEX_LEN_383A_P_2 + 1)
1192 #define VEX_LEN_383C_P_2 (VEX_LEN_383B_P_2 + 1)
1193 #define VEX_LEN_383D_P_2 (VEX_LEN_383C_P_2 + 1)
1194 #define VEX_LEN_383E_P_2 (VEX_LEN_383D_P_2 + 1)
1195 #define VEX_LEN_383F_P_2 (VEX_LEN_383E_P_2 + 1)
1196 #define VEX_LEN_3840_P_2 (VEX_LEN_383F_P_2 + 1)
1197 #define VEX_LEN_3841_P_2 (VEX_LEN_3840_P_2 + 1)
1198 #define VEX_LEN_3A06_P_2 (VEX_LEN_3841_P_2 + 1)
1199 #define VEX_LEN_3A0A_P_2 (VEX_LEN_3A06_P_2 + 1)
1200 #define VEX_LEN_3A0B_P_2 (VEX_LEN_3A0A_P_2 + 1)
1201 #define VEX_LEN_3A0E_P_2 (VEX_LEN_3A0B_P_2 + 1)
1202 #define VEX_LEN_3A0F_P_2 (VEX_LEN_3A0E_P_2 + 1)
1203 #define VEX_LEN_3A14_P_2 (VEX_LEN_3A0F_P_2 + 1)
1204 #define VEX_LEN_3A15_P_2 (VEX_LEN_3A14_P_2 + 1)
1205 #define VEX_LEN_3A16_P_2 (VEX_LEN_3A15_P_2 + 1)
1206 #define VEX_LEN_3A17_P_2 (VEX_LEN_3A16_P_2 + 1)
1207 #define VEX_LEN_3A18_P_2 (VEX_LEN_3A17_P_2 + 1)
1208 #define VEX_LEN_3A19_P_2 (VEX_LEN_3A18_P_2 + 1)
1209 #define VEX_LEN_3A20_P_2 (VEX_LEN_3A19_P_2 + 1)
1210 #define VEX_LEN_3A21_P_2 (VEX_LEN_3A20_P_2 + 1)
1211 #define VEX_LEN_3A22_P_2 (VEX_LEN_3A21_P_2 + 1)
1212 #define VEX_LEN_3A41_P_2 (VEX_LEN_3A22_P_2 + 1)
1213 #define VEX_LEN_3A42_P_2 (VEX_LEN_3A41_P_2 + 1)
1214 #define VEX_LEN_3A4C_P_2 (VEX_LEN_3A42_P_2 + 1)
1215 #define VEX_LEN_3A60_P_2 (VEX_LEN_3A4C_P_2 + 1)
1216 #define VEX_LEN_3A61_P_2 (VEX_LEN_3A60_P_2 + 1)
1217 #define VEX_LEN_3A62_P_2 (VEX_LEN_3A61_P_2 + 1)
1218 #define VEX_LEN_3A63_P_2 (VEX_LEN_3A62_P_2 + 1)
1219 #define VEX_LEN_3A6A_P_2 (VEX_LEN_3A63_P_2 + 1)
1220 #define VEX_LEN_3A6B_P_2 (VEX_LEN_3A6A_P_2 + 1)
1221 #define VEX_LEN_3A6E_P_2 (VEX_LEN_3A6B_P_2 + 1)
1222 #define VEX_LEN_3A6F_P_2 (VEX_LEN_3A6E_P_2 + 1)
1223 #define VEX_LEN_3A7A_P_2 (VEX_LEN_3A6F_P_2 + 1)
1224 #define VEX_LEN_3A7B_P_2 (VEX_LEN_3A7A_P_2 + 1)
1225 #define VEX_LEN_3A7E_P_2 (VEX_LEN_3A7B_P_2 + 1)
1226 #define VEX_LEN_3A7F_P_2 (VEX_LEN_3A7E_P_2 + 1)
1227
1228 typedef void (*op_rtn) (int bytemode, int sizeflag);
1229
1230 struct dis386 {
1231 const char *name;
1232 struct
1233 {
1234 op_rtn rtn;
1235 int bytemode;
1236 } op[MAX_OPERANDS];
1237 };
1238
1239 /* Upper case letters in the instruction names here are macros.
1240 'A' => print 'b' if no register operands or suffix_always is true
1241 'B' => print 'b' if suffix_always is true
1242 'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
1243 size prefix
1244 'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
1245 suffix_always is true
1246 'E' => print 'e' if 32-bit form of jcxz
1247 'F' => print 'w' or 'l' depending on address size prefix (loop insns)
1248 'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
1249 'H' => print ",pt" or ",pn" branch hint
1250 'I' => honor following macro letter even in Intel mode (implemented only
1251 for some of the macro letters)
1252 'J' => print 'l'
1253 'K' => print 'd' or 'q' if rex prefix is present.
1254 'L' => print 'l' if suffix_always is true
1255 'M' => print 'r' if intel_mnemonic is false.
1256 'N' => print 'n' if instruction has no wait "prefix"
1257 'O' => print 'd' or 'o' (or 'q' in Intel mode)
1258 'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix,
1259 or suffix_always is true. print 'q' if rex prefix is present.
1260 'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
1261 is true
1262 'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
1263 'S' => print 'w', 'l' or 'q' if suffix_always is true
1264 'T' => print 'q' in 64bit mode and behave as 'P' otherwise
1265 'U' => print 'q' in 64bit mode and behave as 'Q' otherwise
1266 'V' => print 'q' in 64bit mode and behave as 'S' otherwise
1267 'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
1268 'X' => print 's', 'd' depending on data16 prefix (for XMM)
1269 'Y' => 'q' if instruction has an REX 64bit overwrite prefix and
1270 suffix_always is true.
1271 'Z' => print 'q' in 64bit mode and behave as 'L' otherwise
1272 '!' => change condition from true to false or from false to true.
1273 '%' => add 1 upper case letter to the macro.
1274
1275 2 upper case letter macros:
1276 "XY" => print 'x' or 'y' if no register operands or suffix_always
1277 is true.
1278 'LQ' => print 'l' ('d' in Intel mode) or 'q' for memory operand
1279 or suffix_always is true
1280
1281 Many of the above letters print nothing in Intel mode. See "putop"
1282 for the details.
1283
1284 Braces '{' and '}', and vertical bars '|', indicate alternative
1285 mnemonic strings for AT&T and Intel. */
1286
1287 static const struct dis386 dis386[] = {
1288 /* 00 */
1289 { "addB", { Eb, Gb } },
1290 { "addS", { Ev, Gv } },
1291 { "addB", { Gb, Eb } },
1292 { "addS", { Gv, Ev } },
1293 { "addB", { AL, Ib } },
1294 { "addS", { eAX, Iv } },
1295 { X86_64_TABLE (X86_64_06) },
1296 { X86_64_TABLE (X86_64_07) },
1297 /* 08 */
1298 { "orB", { Eb, Gb } },
1299 { "orS", { Ev, Gv } },
1300 { "orB", { Gb, Eb } },
1301 { "orS", { Gv, Ev } },
1302 { "orB", { AL, Ib } },
1303 { "orS", { eAX, Iv } },
1304 { X86_64_TABLE (X86_64_0D) },
1305 { "(bad)", { XX } }, /* 0x0f extended opcode escape */
1306 /* 10 */
1307 { "adcB", { Eb, Gb } },
1308 { "adcS", { Ev, Gv } },
1309 { "adcB", { Gb, Eb } },
1310 { "adcS", { Gv, Ev } },
1311 { "adcB", { AL, Ib } },
1312 { "adcS", { eAX, Iv } },
1313 { X86_64_TABLE (X86_64_16) },
1314 { X86_64_TABLE (X86_64_17) },
1315 /* 18 */
1316 { "sbbB", { Eb, Gb } },
1317 { "sbbS", { Ev, Gv } },
1318 { "sbbB", { Gb, Eb } },
1319 { "sbbS", { Gv, Ev } },
1320 { "sbbB", { AL, Ib } },
1321 { "sbbS", { eAX, Iv } },
1322 { X86_64_TABLE (X86_64_1E) },
1323 { X86_64_TABLE (X86_64_1F) },
1324 /* 20 */
1325 { "andB", { Eb, Gb } },
1326 { "andS", { Ev, Gv } },
1327 { "andB", { Gb, Eb } },
1328 { "andS", { Gv, Ev } },
1329 { "andB", { AL, Ib } },
1330 { "andS", { eAX, Iv } },
1331 { "(bad)", { XX } }, /* SEG ES prefix */
1332 { X86_64_TABLE (X86_64_27) },
1333 /* 28 */
1334 { "subB", { Eb, Gb } },
1335 { "subS", { Ev, Gv } },
1336 { "subB", { Gb, Eb } },
1337 { "subS", { Gv, Ev } },
1338 { "subB", { AL, Ib } },
1339 { "subS", { eAX, Iv } },
1340 { "(bad)", { XX } }, /* SEG CS prefix */
1341 { X86_64_TABLE (X86_64_2F) },
1342 /* 30 */
1343 { "xorB", { Eb, Gb } },
1344 { "xorS", { Ev, Gv } },
1345 { "xorB", { Gb, Eb } },
1346 { "xorS", { Gv, Ev } },
1347 { "xorB", { AL, Ib } },
1348 { "xorS", { eAX, Iv } },
1349 { "(bad)", { XX } }, /* SEG SS prefix */
1350 { X86_64_TABLE (X86_64_37) },
1351 /* 38 */
1352 { "cmpB", { Eb, Gb } },
1353 { "cmpS", { Ev, Gv } },
1354 { "cmpB", { Gb, Eb } },
1355 { "cmpS", { Gv, Ev } },
1356 { "cmpB", { AL, Ib } },
1357 { "cmpS", { eAX, Iv } },
1358 { "(bad)", { XX } }, /* SEG DS prefix */
1359 { X86_64_TABLE (X86_64_3F) },
1360 /* 40 */
1361 { "inc{S|}", { RMeAX } },
1362 { "inc{S|}", { RMeCX } },
1363 { "inc{S|}", { RMeDX } },
1364 { "inc{S|}", { RMeBX } },
1365 { "inc{S|}", { RMeSP } },
1366 { "inc{S|}", { RMeBP } },
1367 { "inc{S|}", { RMeSI } },
1368 { "inc{S|}", { RMeDI } },
1369 /* 48 */
1370 { "dec{S|}", { RMeAX } },
1371 { "dec{S|}", { RMeCX } },
1372 { "dec{S|}", { RMeDX } },
1373 { "dec{S|}", { RMeBX } },
1374 { "dec{S|}", { RMeSP } },
1375 { "dec{S|}", { RMeBP } },
1376 { "dec{S|}", { RMeSI } },
1377 { "dec{S|}", { RMeDI } },
1378 /* 50 */
1379 { "pushV", { RMrAX } },
1380 { "pushV", { RMrCX } },
1381 { "pushV", { RMrDX } },
1382 { "pushV", { RMrBX } },
1383 { "pushV", { RMrSP } },
1384 { "pushV", { RMrBP } },
1385 { "pushV", { RMrSI } },
1386 { "pushV", { RMrDI } },
1387 /* 58 */
1388 { "popV", { RMrAX } },
1389 { "popV", { RMrCX } },
1390 { "popV", { RMrDX } },
1391 { "popV", { RMrBX } },
1392 { "popV", { RMrSP } },
1393 { "popV", { RMrBP } },
1394 { "popV", { RMrSI } },
1395 { "popV", { RMrDI } },
1396 /* 60 */
1397 { X86_64_TABLE (X86_64_60) },
1398 { X86_64_TABLE (X86_64_61) },
1399 { X86_64_TABLE (X86_64_62) },
1400 { X86_64_TABLE (X86_64_63) },
1401 { "(bad)", { XX } }, /* seg fs */
1402 { "(bad)", { XX } }, /* seg gs */
1403 { "(bad)", { XX } }, /* op size prefix */
1404 { "(bad)", { XX } }, /* adr size prefix */
1405 /* 68 */
1406 { "pushT", { Iq } },
1407 { "imulS", { Gv, Ev, Iv } },
1408 { "pushT", { sIb } },
1409 { "imulS", { Gv, Ev, sIb } },
1410 { "ins{b|}", { Ybr, indirDX } },
1411 { X86_64_TABLE (X86_64_6D) },
1412 { "outs{b|}", { indirDXr, Xb } },
1413 { X86_64_TABLE (X86_64_6F) },
1414 /* 70 */
1415 { "joH", { Jb, XX, cond_jump_flag } },
1416 { "jnoH", { Jb, XX, cond_jump_flag } },
1417 { "jbH", { Jb, XX, cond_jump_flag } },
1418 { "jaeH", { Jb, XX, cond_jump_flag } },
1419 { "jeH", { Jb, XX, cond_jump_flag } },
1420 { "jneH", { Jb, XX, cond_jump_flag } },
1421 { "jbeH", { Jb, XX, cond_jump_flag } },
1422 { "jaH", { Jb, XX, cond_jump_flag } },
1423 /* 78 */
1424 { "jsH", { Jb, XX, cond_jump_flag } },
1425 { "jnsH", { Jb, XX, cond_jump_flag } },
1426 { "jpH", { Jb, XX, cond_jump_flag } },
1427 { "jnpH", { Jb, XX, cond_jump_flag } },
1428 { "jlH", { Jb, XX, cond_jump_flag } },
1429 { "jgeH", { Jb, XX, cond_jump_flag } },
1430 { "jleH", { Jb, XX, cond_jump_flag } },
1431 { "jgH", { Jb, XX, cond_jump_flag } },
1432 /* 80 */
1433 { REG_TABLE (REG_80) },
1434 { REG_TABLE (REG_81) },
1435 { "(bad)", { XX } },
1436 { REG_TABLE (REG_82) },
1437 { "testB", { Eb, Gb } },
1438 { "testS", { Ev, Gv } },
1439 { "xchgB", { Eb, Gb } },
1440 { "xchgS", { Ev, Gv } },
1441 /* 88 */
1442 { "movB", { Eb, Gb } },
1443 { "movS", { Ev, Gv } },
1444 { "movB", { Gb, Eb } },
1445 { "movS", { Gv, Ev } },
1446 { "movD", { Sv, Sw } },
1447 { MOD_TABLE (MOD_8D) },
1448 { "movD", { Sw, Sv } },
1449 { REG_TABLE (REG_8F) },
1450 /* 90 */
1451 { PREFIX_TABLE (PREFIX_90) },
1452 { "xchgS", { RMeCX, eAX } },
1453 { "xchgS", { RMeDX, eAX } },
1454 { "xchgS", { RMeBX, eAX } },
1455 { "xchgS", { RMeSP, eAX } },
1456 { "xchgS", { RMeBP, eAX } },
1457 { "xchgS", { RMeSI, eAX } },
1458 { "xchgS", { RMeDI, eAX } },
1459 /* 98 */
1460 { "cW{t|}R", { XX } },
1461 { "cR{t|}O", { XX } },
1462 { X86_64_TABLE (X86_64_9A) },
1463 { "(bad)", { XX } }, /* fwait */
1464 { "pushfT", { XX } },
1465 { "popfT", { XX } },
1466 { "sahf", { XX } },
1467 { "lahf", { XX } },
1468 /* a0 */
1469 { "movB", { AL, Ob } },
1470 { "movS", { eAX, Ov } },
1471 { "movB", { Ob, AL } },
1472 { "movS", { Ov, eAX } },
1473 { "movs{b|}", { Ybr, Xb } },
1474 { "movs{R|}", { Yvr, Xv } },
1475 { "cmps{b|}", { Xb, Yb } },
1476 { "cmps{R|}", { Xv, Yv } },
1477 /* a8 */
1478 { "testB", { AL, Ib } },
1479 { "testS", { eAX, Iv } },
1480 { "stosB", { Ybr, AL } },
1481 { "stosS", { Yvr, eAX } },
1482 { "lodsB", { ALr, Xb } },
1483 { "lodsS", { eAXr, Xv } },
1484 { "scasB", { AL, Yb } },
1485 { "scasS", { eAX, Yv } },
1486 /* b0 */
1487 { "movB", { RMAL, Ib } },
1488 { "movB", { RMCL, Ib } },
1489 { "movB", { RMDL, Ib } },
1490 { "movB", { RMBL, Ib } },
1491 { "movB", { RMAH, Ib } },
1492 { "movB", { RMCH, Ib } },
1493 { "movB", { RMDH, Ib } },
1494 { "movB", { RMBH, Ib } },
1495 /* b8 */
1496 { "movS", { RMeAX, Iv64 } },
1497 { "movS", { RMeCX, Iv64 } },
1498 { "movS", { RMeDX, Iv64 } },
1499 { "movS", { RMeBX, Iv64 } },
1500 { "movS", { RMeSP, Iv64 } },
1501 { "movS", { RMeBP, Iv64 } },
1502 { "movS", { RMeSI, Iv64 } },
1503 { "movS", { RMeDI, Iv64 } },
1504 /* c0 */
1505 { REG_TABLE (REG_C0) },
1506 { REG_TABLE (REG_C1) },
1507 { "retT", { Iw } },
1508 { "retT", { XX } },
1509 { X86_64_TABLE (X86_64_C4) },
1510 { X86_64_TABLE (X86_64_C5) },
1511 { REG_TABLE (REG_C6) },
1512 { REG_TABLE (REG_C7) },
1513 /* c8 */
1514 { "enterT", { Iw, Ib } },
1515 { "leaveT", { XX } },
1516 { "lretP", { Iw } },
1517 { "lretP", { XX } },
1518 { "int3", { XX } },
1519 { "int", { Ib } },
1520 { X86_64_TABLE (X86_64_CE) },
1521 { "iretP", { XX } },
1522 /* d0 */
1523 { REG_TABLE (REG_D0) },
1524 { REG_TABLE (REG_D1) },
1525 { REG_TABLE (REG_D2) },
1526 { REG_TABLE (REG_D3) },
1527 { X86_64_TABLE (X86_64_D4) },
1528 { X86_64_TABLE (X86_64_D5) },
1529 { "(bad)", { XX } },
1530 { "xlat", { DSBX } },
1531 /* d8 */
1532 { FLOAT },
1533 { FLOAT },
1534 { FLOAT },
1535 { FLOAT },
1536 { FLOAT },
1537 { FLOAT },
1538 { FLOAT },
1539 { FLOAT },
1540 /* e0 */
1541 { "loopneFH", { Jb, XX, loop_jcxz_flag } },
1542 { "loopeFH", { Jb, XX, loop_jcxz_flag } },
1543 { "loopFH", { Jb, XX, loop_jcxz_flag } },
1544 { "jEcxzH", { Jb, XX, loop_jcxz_flag } },
1545 { "inB", { AL, Ib } },
1546 { "inG", { zAX, Ib } },
1547 { "outB", { Ib, AL } },
1548 { "outG", { Ib, zAX } },
1549 /* e8 */
1550 { "callT", { Jv } },
1551 { "jmpT", { Jv } },
1552 { X86_64_TABLE (X86_64_EA) },
1553 { "jmp", { Jb } },
1554 { "inB", { AL, indirDX } },
1555 { "inG", { zAX, indirDX } },
1556 { "outB", { indirDX, AL } },
1557 { "outG", { indirDX, zAX } },
1558 /* f0 */
1559 { "(bad)", { XX } }, /* lock prefix */
1560 { "icebp", { XX } },
1561 { "(bad)", { XX } }, /* repne */
1562 { "(bad)", { XX } }, /* repz */
1563 { "hlt", { XX } },
1564 { "cmc", { XX } },
1565 { REG_TABLE (REG_F6) },
1566 { REG_TABLE (REG_F7) },
1567 /* f8 */
1568 { "clc", { XX } },
1569 { "stc", { XX } },
1570 { "cli", { XX } },
1571 { "sti", { XX } },
1572 { "cld", { XX } },
1573 { "std", { XX } },
1574 { REG_TABLE (REG_FE) },
1575 { REG_TABLE (REG_FF) },
1576 };
1577
1578 static const struct dis386 dis386_twobyte[] = {
1579 /* 00 */
1580 { REG_TABLE (REG_0F00 ) },
1581 { REG_TABLE (REG_0F01 ) },
1582 { "larS", { Gv, Ew } },
1583 { "lslS", { Gv, Ew } },
1584 { "(bad)", { XX } },
1585 { "syscall", { XX } },
1586 { "clts", { XX } },
1587 { "sysretP", { XX } },
1588 /* 08 */
1589 { "invd", { XX } },
1590 { "wbinvd", { XX } },
1591 { "(bad)", { XX } },
1592 { "ud2a", { XX } },
1593 { "(bad)", { XX } },
1594 { REG_TABLE (REG_0F0D) },
1595 { "femms", { XX } },
1596 { "", { MX, EM, OPSUF } }, /* See OP_3DNowSuffix. */
1597 /* 10 */
1598 { PREFIX_TABLE (PREFIX_0F10) },
1599 { PREFIX_TABLE (PREFIX_0F11) },
1600 { PREFIX_TABLE (PREFIX_0F12) },
1601 { MOD_TABLE (MOD_0F13) },
1602 { "unpcklpX", { XM, EXx } },
1603 { "unpckhpX", { XM, EXx } },
1604 { PREFIX_TABLE (PREFIX_0F16) },
1605 { MOD_TABLE (MOD_0F17) },
1606 /* 18 */
1607 { REG_TABLE (REG_0F18) },
1608 { "nopQ", { Ev } },
1609 { "nopQ", { Ev } },
1610 { "nopQ", { Ev } },
1611 { "nopQ", { Ev } },
1612 { "nopQ", { Ev } },
1613 { "nopQ", { Ev } },
1614 { "nopQ", { Ev } },
1615 /* 20 */
1616 { MOD_TABLE (MOD_0F20) },
1617 { MOD_TABLE (MOD_0F21) },
1618 { MOD_TABLE (MOD_0F22) },
1619 { MOD_TABLE (MOD_0F23) },
1620 { MOD_TABLE (MOD_0F24) },
1621 { THREE_BYTE_TABLE (THREE_BYTE_0F25) },
1622 { MOD_TABLE (MOD_0F26) },
1623 { "(bad)", { XX } },
1624 /* 28 */
1625 { "movapX", { XM, EXx } },
1626 { "movapX", { EXx, XM } },
1627 { PREFIX_TABLE (PREFIX_0F2A) },
1628 { PREFIX_TABLE (PREFIX_0F2B) },
1629 { PREFIX_TABLE (PREFIX_0F2C) },
1630 { PREFIX_TABLE (PREFIX_0F2D) },
1631 { PREFIX_TABLE (PREFIX_0F2E) },
1632 { PREFIX_TABLE (PREFIX_0F2F) },
1633 /* 30 */
1634 { "wrmsr", { XX } },
1635 { "rdtsc", { XX } },
1636 { "rdmsr", { XX } },
1637 { "rdpmc", { XX } },
1638 { "sysenter", { XX } },
1639 { "sysexit", { XX } },
1640 { "(bad)", { XX } },
1641 { "getsec", { XX } },
1642 /* 38 */
1643 { THREE_BYTE_TABLE (THREE_BYTE_0F38) },
1644 { "(bad)", { XX } },
1645 { THREE_BYTE_TABLE (THREE_BYTE_0F3A) },
1646 { "(bad)", { XX } },
1647 { "(bad)", { XX } },
1648 { "(bad)", { XX } },
1649 { "(bad)", { XX } },
1650 { "(bad)", { XX } },
1651 /* 40 */
1652 { "cmovo", { Gv, Ev } },
1653 { "cmovno", { Gv, Ev } },
1654 { "cmovb", { Gv, Ev } },
1655 { "cmovae", { Gv, Ev } },
1656 { "cmove", { Gv, Ev } },
1657 { "cmovne", { Gv, Ev } },
1658 { "cmovbe", { Gv, Ev } },
1659 { "cmova", { Gv, Ev } },
1660 /* 48 */
1661 { "cmovs", { Gv, Ev } },
1662 { "cmovns", { Gv, Ev } },
1663 { "cmovp", { Gv, Ev } },
1664 { "cmovnp", { Gv, Ev } },
1665 { "cmovl", { Gv, Ev } },
1666 { "cmovge", { Gv, Ev } },
1667 { "cmovle", { Gv, Ev } },
1668 { "cmovg", { Gv, Ev } },
1669 /* 50 */
1670 { MOD_TABLE (MOD_0F51) },
1671 { PREFIX_TABLE (PREFIX_0F51) },
1672 { PREFIX_TABLE (PREFIX_0F52) },
1673 { PREFIX_TABLE (PREFIX_0F53) },
1674 { "andpX", { XM, EXx } },
1675 { "andnpX", { XM, EXx } },
1676 { "orpX", { XM, EXx } },
1677 { "xorpX", { XM, EXx } },
1678 /* 58 */
1679 { PREFIX_TABLE (PREFIX_0F58) },
1680 { PREFIX_TABLE (PREFIX_0F59) },
1681 { PREFIX_TABLE (PREFIX_0F5A) },
1682 { PREFIX_TABLE (PREFIX_0F5B) },
1683 { PREFIX_TABLE (PREFIX_0F5C) },
1684 { PREFIX_TABLE (PREFIX_0F5D) },
1685 { PREFIX_TABLE (PREFIX_0F5E) },
1686 { PREFIX_TABLE (PREFIX_0F5F) },
1687 /* 60 */
1688 { PREFIX_TABLE (PREFIX_0F60) },
1689 { PREFIX_TABLE (PREFIX_0F61) },
1690 { PREFIX_TABLE (PREFIX_0F62) },
1691 { "packsswb", { MX, EM } },
1692 { "pcmpgtb", { MX, EM } },
1693 { "pcmpgtw", { MX, EM } },
1694 { "pcmpgtd", { MX, EM } },
1695 { "packuswb", { MX, EM } },
1696 /* 68 */
1697 { "punpckhbw", { MX, EM } },
1698 { "punpckhwd", { MX, EM } },
1699 { "punpckhdq", { MX, EM } },
1700 { "packssdw", { MX, EM } },
1701 { PREFIX_TABLE (PREFIX_0F6C) },
1702 { PREFIX_TABLE (PREFIX_0F6D) },
1703 { "movK", { MX, Edq } },
1704 { PREFIX_TABLE (PREFIX_0F6F) },
1705 /* 70 */
1706 { PREFIX_TABLE (PREFIX_0F70) },
1707 { REG_TABLE (REG_0F71) },
1708 { REG_TABLE (REG_0F72) },
1709 { REG_TABLE (REG_0F73) },
1710 { "pcmpeqb", { MX, EM } },
1711 { "pcmpeqw", { MX, EM } },
1712 { "pcmpeqd", { MX, EM } },
1713 { "emms", { XX } },
1714 /* 78 */
1715 { PREFIX_TABLE (PREFIX_0F78) },
1716 { PREFIX_TABLE (PREFIX_0F79) },
1717 { THREE_BYTE_TABLE (THREE_BYTE_0F7A) },
1718 { THREE_BYTE_TABLE (THREE_BYTE_0F7B) },
1719 { PREFIX_TABLE (PREFIX_0F7C) },
1720 { PREFIX_TABLE (PREFIX_0F7D) },
1721 { PREFIX_TABLE (PREFIX_0F7E) },
1722 { PREFIX_TABLE (PREFIX_0F7F) },
1723 /* 80 */
1724 { "joH", { Jv, XX, cond_jump_flag } },
1725 { "jnoH", { Jv, XX, cond_jump_flag } },
1726 { "jbH", { Jv, XX, cond_jump_flag } },
1727 { "jaeH", { Jv, XX, cond_jump_flag } },
1728 { "jeH", { Jv, XX, cond_jump_flag } },
1729 { "jneH", { Jv, XX, cond_jump_flag } },
1730 { "jbeH", { Jv, XX, cond_jump_flag } },
1731 { "jaH", { Jv, XX, cond_jump_flag } },
1732 /* 88 */
1733 { "jsH", { Jv, XX, cond_jump_flag } },
1734 { "jnsH", { Jv, XX, cond_jump_flag } },
1735 { "jpH", { Jv, XX, cond_jump_flag } },
1736 { "jnpH", { Jv, XX, cond_jump_flag } },
1737 { "jlH", { Jv, XX, cond_jump_flag } },
1738 { "jgeH", { Jv, XX, cond_jump_flag } },
1739 { "jleH", { Jv, XX, cond_jump_flag } },
1740 { "jgH", { Jv, XX, cond_jump_flag } },
1741 /* 90 */
1742 { "seto", { Eb } },
1743 { "setno", { Eb } },
1744 { "setb", { Eb } },
1745 { "setae", { Eb } },
1746 { "sete", { Eb } },
1747 { "setne", { Eb } },
1748 { "setbe", { Eb } },
1749 { "seta", { Eb } },
1750 /* 98 */
1751 { "sets", { Eb } },
1752 { "setns", { Eb } },
1753 { "setp", { Eb } },
1754 { "setnp", { Eb } },
1755 { "setl", { Eb } },
1756 { "setge", { Eb } },
1757 { "setle", { Eb } },
1758 { "setg", { Eb } },
1759 /* a0 */
1760 { "pushT", { fs } },
1761 { "popT", { fs } },
1762 { "cpuid", { XX } },
1763 { "btS", { Ev, Gv } },
1764 { "shldS", { Ev, Gv, Ib } },
1765 { "shldS", { Ev, Gv, CL } },
1766 { REG_TABLE (REG_0FA6) },
1767 { REG_TABLE (REG_0FA7) },
1768 /* a8 */
1769 { "pushT", { gs } },
1770 { "popT", { gs } },
1771 { "rsm", { XX } },
1772 { "btsS", { Ev, Gv } },
1773 { "shrdS", { Ev, Gv, Ib } },
1774 { "shrdS", { Ev, Gv, CL } },
1775 { REG_TABLE (REG_0FAE) },
1776 { "imulS", { Gv, Ev } },
1777 /* b0 */
1778 { "cmpxchgB", { Eb, Gb } },
1779 { "cmpxchgS", { Ev, Gv } },
1780 { MOD_TABLE (MOD_0FB2) },
1781 { "btrS", { Ev, Gv } },
1782 { MOD_TABLE (MOD_0FB4) },
1783 { MOD_TABLE (MOD_0FB5) },
1784 { "movz{bR|x}", { Gv, Eb } },
1785 { "movz{wR|x}", { Gv, Ew } }, /* yes, there really is movzww ! */
1786 /* b8 */
1787 { PREFIX_TABLE (PREFIX_0FB8) },
1788 { "ud2b", { XX } },
1789 { REG_TABLE (REG_0FBA) },
1790 { "btcS", { Ev, Gv } },
1791 { "bsfS", { Gv, Ev } },
1792 { PREFIX_TABLE (PREFIX_0FBD) },
1793 { "movs{bR|x}", { Gv, Eb } },
1794 { "movs{wR|x}", { Gv, Ew } }, /* yes, there really is movsww ! */
1795 /* c0 */
1796 { "xaddB", { Eb, Gb } },
1797 { "xaddS", { Ev, Gv } },
1798 { PREFIX_TABLE (PREFIX_0FC2) },
1799 { PREFIX_TABLE (PREFIX_0FC3) },
1800 { "pinsrw", { MX, Edqw, Ib } },
1801 { "pextrw", { Gdq, MS, Ib } },
1802 { "shufpX", { XM, EXx, Ib } },
1803 { REG_TABLE (REG_0FC7) },
1804 /* c8 */
1805 { "bswap", { RMeAX } },
1806 { "bswap", { RMeCX } },
1807 { "bswap", { RMeDX } },
1808 { "bswap", { RMeBX } },
1809 { "bswap", { RMeSP } },
1810 { "bswap", { RMeBP } },
1811 { "bswap", { RMeSI } },
1812 { "bswap", { RMeDI } },
1813 /* d0 */
1814 { PREFIX_TABLE (PREFIX_0FD0) },
1815 { "psrlw", { MX, EM } },
1816 { "psrld", { MX, EM } },
1817 { "psrlq", { MX, EM } },
1818 { "paddq", { MX, EM } },
1819 { "pmullw", { MX, EM } },
1820 { PREFIX_TABLE (PREFIX_0FD6) },
1821 { MOD_TABLE (MOD_0FD7) },
1822 /* d8 */
1823 { "psubusb", { MX, EM } },
1824 { "psubusw", { MX, EM } },
1825 { "pminub", { MX, EM } },
1826 { "pand", { MX, EM } },
1827 { "paddusb", { MX, EM } },
1828 { "paddusw", { MX, EM } },
1829 { "pmaxub", { MX, EM } },
1830 { "pandn", { MX, EM } },
1831 /* e0 */
1832 { "pavgb", { MX, EM } },
1833 { "psraw", { MX, EM } },
1834 { "psrad", { MX, EM } },
1835 { "pavgw", { MX, EM } },
1836 { "pmulhuw", { MX, EM } },
1837 { "pmulhw", { MX, EM } },
1838 { PREFIX_TABLE (PREFIX_0FE6) },
1839 { PREFIX_TABLE (PREFIX_0FE7) },
1840 /* e8 */
1841 { "psubsb", { MX, EM } },
1842 { "psubsw", { MX, EM } },
1843 { "pminsw", { MX, EM } },
1844 { "por", { MX, EM } },
1845 { "paddsb", { MX, EM } },
1846 { "paddsw", { MX, EM } },
1847 { "pmaxsw", { MX, EM } },
1848 { "pxor", { MX, EM } },
1849 /* f0 */
1850 { PREFIX_TABLE (PREFIX_0FF0) },
1851 { "psllw", { MX, EM } },
1852 { "pslld", { MX, EM } },
1853 { "psllq", { MX, EM } },
1854 { "pmuludq", { MX, EM } },
1855 { "pmaddwd", { MX, EM } },
1856 { "psadbw", { MX, EM } },
1857 { PREFIX_TABLE (PREFIX_0FF7) },
1858 /* f8 */
1859 { "psubb", { MX, EM } },
1860 { "psubw", { MX, EM } },
1861 { "psubd", { MX, EM } },
1862 { "psubq", { MX, EM } },
1863 { "paddb", { MX, EM } },
1864 { "paddw", { MX, EM } },
1865 { "paddd", { MX, EM } },
1866 { "(bad)", { XX } },
1867 };
1868
1869 static const unsigned char onebyte_has_modrm[256] = {
1870 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
1871 /* ------------------------------- */
1872 /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
1873 /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
1874 /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
1875 /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
1876 /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
1877 /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
1878 /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
1879 /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
1880 /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
1881 /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
1882 /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
1883 /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
1884 /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
1885 /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
1886 /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
1887 /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1 /* f0 */
1888 /* ------------------------------- */
1889 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
1890 };
1891
1892 static const unsigned char twobyte_has_modrm[256] = {
1893 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
1894 /* ------------------------------- */
1895 /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
1896 /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
1897 /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
1898 /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
1899 /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
1900 /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
1901 /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
1902 /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
1903 /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
1904 /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
1905 /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
1906 /* b0 */ 1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1, /* bf */
1907 /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
1908 /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
1909 /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
1910 /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0 /* ff */
1911 /* ------------------------------- */
1912 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
1913 };
1914
1915 static char obuf[100];
1916 static char *obufp;
1917 static char scratchbuf[100];
1918 static unsigned char *start_codep;
1919 static unsigned char *insn_codep;
1920 static unsigned char *codep;
1921 static const char *lock_prefix;
1922 static const char *data_prefix;
1923 static const char *addr_prefix;
1924 static const char *repz_prefix;
1925 static const char *repnz_prefix;
1926 static disassemble_info *the_info;
1927 static struct
1928 {
1929 int mod;
1930 int reg;
1931 int rm;
1932 }
1933 modrm;
1934 static unsigned char need_modrm;
1935 static struct
1936 {
1937 int register_specifier;
1938 int length;
1939 int prefix;
1940 int w;
1941 }
1942 vex;
1943 static unsigned char need_vex;
1944 static unsigned char need_vex_reg;
1945 static unsigned char vex_w_done;
1946
1947 /* If we are accessing mod/rm/reg without need_modrm set, then the
1948 values are stale. Hitting this abort likely indicates that you
1949 need to update onebyte_has_modrm or twobyte_has_modrm. */
1950 #define MODRM_CHECK if (!need_modrm) abort ()
1951
1952 static const char **names64;
1953 static const char **names32;
1954 static const char **names16;
1955 static const char **names8;
1956 static const char **names8rex;
1957 static const char **names_seg;
1958 static const char *index64;
1959 static const char *index32;
1960 static const char **index16;
1961
1962 static const char *intel_names64[] = {
1963 "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
1964 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
1965 };
1966 static const char *intel_names32[] = {
1967 "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
1968 "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
1969 };
1970 static const char *intel_names16[] = {
1971 "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
1972 "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
1973 };
1974 static const char *intel_names8[] = {
1975 "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
1976 };
1977 static const char *intel_names8rex[] = {
1978 "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
1979 "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
1980 };
1981 static const char *intel_names_seg[] = {
1982 "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
1983 };
1984 static const char *intel_index64 = "riz";
1985 static const char *intel_index32 = "eiz";
1986 static const char *intel_index16[] = {
1987 "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
1988 };
1989
1990 static const char *att_names64[] = {
1991 "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
1992 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
1993 };
1994 static const char *att_names32[] = {
1995 "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
1996 "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
1997 };
1998 static const char *att_names16[] = {
1999 "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
2000 "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
2001 };
2002 static const char *att_names8[] = {
2003 "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
2004 };
2005 static const char *att_names8rex[] = {
2006 "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
2007 "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
2008 };
2009 static const char *att_names_seg[] = {
2010 "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
2011 };
2012 static const char *att_index64 = "%riz";
2013 static const char *att_index32 = "%eiz";
2014 static const char *att_index16[] = {
2015 "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
2016 };
2017
2018 static const struct dis386 reg_table[][8] = {
2019 /* REG_80 */
2020 {
2021 { "addA", { Eb, Ib } },
2022 { "orA", { Eb, Ib } },
2023 { "adcA", { Eb, Ib } },
2024 { "sbbA", { Eb, Ib } },
2025 { "andA", { Eb, Ib } },
2026 { "subA", { Eb, Ib } },
2027 { "xorA", { Eb, Ib } },
2028 { "cmpA", { Eb, Ib } },
2029 },
2030 /* REG_81 */
2031 {
2032 { "addQ", { Ev, Iv } },
2033 { "orQ", { Ev, Iv } },
2034 { "adcQ", { Ev, Iv } },
2035 { "sbbQ", { Ev, Iv } },
2036 { "andQ", { Ev, Iv } },
2037 { "subQ", { Ev, Iv } },
2038 { "xorQ", { Ev, Iv } },
2039 { "cmpQ", { Ev, Iv } },
2040 },
2041 /* REG_82 */
2042 {
2043 { "addQ", { Ev, sIb } },
2044 { "orQ", { Ev, sIb } },
2045 { "adcQ", { Ev, sIb } },
2046 { "sbbQ", { Ev, sIb } },
2047 { "andQ", { Ev, sIb } },
2048 { "subQ", { Ev, sIb } },
2049 { "xorQ", { Ev, sIb } },
2050 { "cmpQ", { Ev, sIb } },
2051 },
2052 /* REG_8F */
2053 {
2054 { "popU", { stackEv } },
2055 { "(bad)", { XX } },
2056 { "(bad)", { XX } },
2057 { "(bad)", { XX } },
2058 { "(bad)", { XX } },
2059 { "(bad)", { XX } },
2060 { "(bad)", { XX } },
2061 { "(bad)", { XX } },
2062 },
2063 /* REG_C0 */
2064 {
2065 { "rolA", { Eb, Ib } },
2066 { "rorA", { Eb, Ib } },
2067 { "rclA", { Eb, Ib } },
2068 { "rcrA", { Eb, Ib } },
2069 { "shlA", { Eb, Ib } },
2070 { "shrA", { Eb, Ib } },
2071 { "(bad)", { XX } },
2072 { "sarA", { Eb, Ib } },
2073 },
2074 /* REG_C1 */
2075 {
2076 { "rolQ", { Ev, Ib } },
2077 { "rorQ", { Ev, Ib } },
2078 { "rclQ", { Ev, Ib } },
2079 { "rcrQ", { Ev, Ib } },
2080 { "shlQ", { Ev, Ib } },
2081 { "shrQ", { Ev, Ib } },
2082 { "(bad)", { XX } },
2083 { "sarQ", { Ev, Ib } },
2084 },
2085 /* REG_C6 */
2086 {
2087 { "movA", { Eb, Ib } },
2088 { "(bad)", { XX } },
2089 { "(bad)", { XX } },
2090 { "(bad)", { XX } },
2091 { "(bad)", { XX } },
2092 { "(bad)", { XX } },
2093 { "(bad)", { XX } },
2094 { "(bad)", { XX } },
2095 },
2096 /* REG_C7 */
2097 {
2098 { "movQ", { Ev, Iv } },
2099 { "(bad)", { XX } },
2100 { "(bad)", { XX } },
2101 { "(bad)", { XX } },
2102 { "(bad)", { XX } },
2103 { "(bad)", { XX } },
2104 { "(bad)", { XX } },
2105 { "(bad)", { XX } },
2106 },
2107 /* REG_D0 */
2108 {
2109 { "rolA", { Eb, I1 } },
2110 { "rorA", { Eb, I1 } },
2111 { "rclA", { Eb, I1 } },
2112 { "rcrA", { Eb, I1 } },
2113 { "shlA", { Eb, I1 } },
2114 { "shrA", { Eb, I1 } },
2115 { "(bad)", { XX } },
2116 { "sarA", { Eb, I1 } },
2117 },
2118 /* REG_D1 */
2119 {
2120 { "rolQ", { Ev, I1 } },
2121 { "rorQ", { Ev, I1 } },
2122 { "rclQ", { Ev, I1 } },
2123 { "rcrQ", { Ev, I1 } },
2124 { "shlQ", { Ev, I1 } },
2125 { "shrQ", { Ev, I1 } },
2126 { "(bad)", { XX } },
2127 { "sarQ", { Ev, I1 } },
2128 },
2129 /* REG_D2 */
2130 {
2131 { "rolA", { Eb, CL } },
2132 { "rorA", { Eb, CL } },
2133 { "rclA", { Eb, CL } },
2134 { "rcrA", { Eb, CL } },
2135 { "shlA", { Eb, CL } },
2136 { "shrA", { Eb, CL } },
2137 { "(bad)", { XX } },
2138 { "sarA", { Eb, CL } },
2139 },
2140 /* REG_D3 */
2141 {
2142 { "rolQ", { Ev, CL } },
2143 { "rorQ", { Ev, CL } },
2144 { "rclQ", { Ev, CL } },
2145 { "rcrQ", { Ev, CL } },
2146 { "shlQ", { Ev, CL } },
2147 { "shrQ", { Ev, CL } },
2148 { "(bad)", { XX } },
2149 { "sarQ", { Ev, CL } },
2150 },
2151 /* REG_F6 */
2152 {
2153 { "testA", { Eb, Ib } },
2154 { "(bad)", { XX } },
2155 { "notA", { Eb } },
2156 { "negA", { Eb } },
2157 { "mulA", { Eb } }, /* Don't print the implicit %al register, */
2158 { "imulA", { Eb } }, /* to distinguish these opcodes from other */
2159 { "divA", { Eb } }, /* mul/imul opcodes. Do the same for div */
2160 { "idivA", { Eb } }, /* and idiv for consistency. */
2161 },
2162 /* REG_F7 */
2163 {
2164 { "testQ", { Ev, Iv } },
2165 { "(bad)", { XX } },
2166 { "notQ", { Ev } },
2167 { "negQ", { Ev } },
2168 { "mulQ", { Ev } }, /* Don't print the implicit register. */
2169 { "imulQ", { Ev } },
2170 { "divQ", { Ev } },
2171 { "idivQ", { Ev } },
2172 },
2173 /* REG_FE */
2174 {
2175 { "incA", { Eb } },
2176 { "decA", { Eb } },
2177 { "(bad)", { XX } },
2178 { "(bad)", { XX } },
2179 { "(bad)", { XX } },
2180 { "(bad)", { XX } },
2181 { "(bad)", { XX } },
2182 { "(bad)", { XX } },
2183 },
2184 /* REG_FF */
2185 {
2186 { "incQ", { Ev } },
2187 { "decQ", { Ev } },
2188 { "callT", { indirEv } },
2189 { "JcallT", { indirEp } },
2190 { "jmpT", { indirEv } },
2191 { "JjmpT", { indirEp } },
2192 { "pushU", { stackEv } },
2193 { "(bad)", { XX } },
2194 },
2195 /* REG_0F00 */
2196 {
2197 { "sldtD", { Sv } },
2198 { "strD", { Sv } },
2199 { "lldt", { Ew } },
2200 { "ltr", { Ew } },
2201 { "verr", { Ew } },
2202 { "verw", { Ew } },
2203 { "(bad)", { XX } },
2204 { "(bad)", { XX } },
2205 },
2206 /* REG_0F01 */
2207 {
2208 { MOD_TABLE (MOD_0F01_REG_0) },
2209 { MOD_TABLE (MOD_0F01_REG_1) },
2210 { MOD_TABLE (MOD_0F01_REG_2) },
2211 { MOD_TABLE (MOD_0F01_REG_3) },
2212 { "smswD", { Sv } },
2213 { "(bad)", { XX } },
2214 { "lmsw", { Ew } },
2215 { MOD_TABLE (MOD_0F01_REG_7) },
2216 },
2217 /* REG_0F0D */
2218 {
2219 { "prefetch", { Eb } },
2220 { "prefetchw", { Eb } },
2221 { "(bad)", { XX } },
2222 { "(bad)", { XX } },
2223 { "(bad)", { XX } },
2224 { "(bad)", { XX } },
2225 { "(bad)", { XX } },
2226 { "(bad)", { XX } },
2227 },
2228 /* REG_0F18 */
2229 {
2230 { MOD_TABLE (MOD_0F18_REG_0) },
2231 { MOD_TABLE (MOD_0F18_REG_1) },
2232 { MOD_TABLE (MOD_0F18_REG_2) },
2233 { MOD_TABLE (MOD_0F18_REG_3) },
2234 { "(bad)", { XX } },
2235 { "(bad)", { XX } },
2236 { "(bad)", { XX } },
2237 { "(bad)", { XX } },
2238 },
2239 /* REG_0F71 */
2240 {
2241 { "(bad)", { XX } },
2242 { "(bad)", { XX } },
2243 { MOD_TABLE (MOD_0F71_REG_2) },
2244 { "(bad)", { XX } },
2245 { MOD_TABLE (MOD_0F71_REG_4) },
2246 { "(bad)", { XX } },
2247 { MOD_TABLE (MOD_0F71_REG_6) },
2248 { "(bad)", { XX } },
2249 },
2250 /* REG_0F72 */
2251 {
2252 { "(bad)", { XX } },
2253 { "(bad)", { XX } },
2254 { MOD_TABLE (MOD_0F72_REG_2) },
2255 { "(bad)", { XX } },
2256 { MOD_TABLE (MOD_0F72_REG_4) },
2257 { "(bad)", { XX } },
2258 { MOD_TABLE (MOD_0F72_REG_6) },
2259 { "(bad)", { XX } },
2260 },
2261 /* REG_0F73 */
2262 {
2263 { "(bad)", { XX } },
2264 { "(bad)", { XX } },
2265 { MOD_TABLE (MOD_0F73_REG_2) },
2266 { MOD_TABLE (MOD_0F73_REG_3) },
2267 { "(bad)", { XX } },
2268 { "(bad)", { XX } },
2269 { MOD_TABLE (MOD_0F73_REG_6) },
2270 { MOD_TABLE (MOD_0F73_REG_7) },
2271 },
2272 /* REG_0FA6 */
2273 {
2274 { "montmul", { { OP_0f07, 0 } } },
2275 { "xsha1", { { OP_0f07, 0 } } },
2276 { "xsha256", { { OP_0f07, 0 } } },
2277 { "(bad)", { { OP_0f07, 0 } } },
2278 { "(bad)", { { OP_0f07, 0 } } },
2279 { "(bad)", { { OP_0f07, 0 } } },
2280 { "(bad)", { { OP_0f07, 0 } } },
2281 { "(bad)", { { OP_0f07, 0 } } },
2282 },
2283 /* REG_0FA7 */
2284 {
2285 { "xstore-rng", { { OP_0f07, 0 } } },
2286 { "xcrypt-ecb", { { OP_0f07, 0 } } },
2287 { "xcrypt-cbc", { { OP_0f07, 0 } } },
2288 { "xcrypt-ctr", { { OP_0f07, 0 } } },
2289 { "xcrypt-cfb", { { OP_0f07, 0 } } },
2290 { "xcrypt-ofb", { { OP_0f07, 0 } } },
2291 { "(bad)", { { OP_0f07, 0 } } },
2292 { "(bad)", { { OP_0f07, 0 } } },
2293 },
2294 /* REG_0FAE */
2295 {
2296 { MOD_TABLE (MOD_0FAE_REG_0) },
2297 { MOD_TABLE (MOD_0FAE_REG_1) },
2298 { MOD_TABLE (MOD_0FAE_REG_2) },
2299 { MOD_TABLE (MOD_0FAE_REG_3) },
2300 { MOD_TABLE (MOD_0FAE_REG_4) },
2301 { MOD_TABLE (MOD_0FAE_REG_5) },
2302 { MOD_TABLE (MOD_0FAE_REG_6) },
2303 { MOD_TABLE (MOD_0FAE_REG_7) },
2304 },
2305 /* REG_0FBA */
2306 {
2307 { "(bad)", { XX } },
2308 { "(bad)", { XX } },
2309 { "(bad)", { XX } },
2310 { "(bad)", { XX } },
2311 { "btQ", { Ev, Ib } },
2312 { "btsQ", { Ev, Ib } },
2313 { "btrQ", { Ev, Ib } },
2314 { "btcQ", { Ev, Ib } },
2315 },
2316 /* REG_0FC7 */
2317 {
2318 { "(bad)", { XX } },
2319 { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } } },
2320 { "(bad)", { XX } },
2321 { "(bad)", { XX } },
2322 { "(bad)", { XX } },
2323 { "(bad)", { XX } },
2324 { MOD_TABLE (MOD_0FC7_REG_6) },
2325 { MOD_TABLE (MOD_0FC7_REG_7) },
2326 },
2327 /* REG_VEX_71 */
2328 {
2329 { "(bad)", { XX } },
2330 { "(bad)", { XX } },
2331 { MOD_TABLE (MOD_VEX_71_REG_2) },
2332 { "(bad)", { XX } },
2333 { MOD_TABLE (MOD_VEX_71_REG_4) },
2334 { "(bad)", { XX } },
2335 { MOD_TABLE (MOD_VEX_71_REG_6) },
2336 { "(bad)", { XX } },
2337 },
2338 /* REG_VEX_72 */
2339 {
2340 { "(bad)", { XX } },
2341 { "(bad)", { XX } },
2342 { MOD_TABLE (MOD_VEX_72_REG_2) },
2343 { "(bad)", { XX } },
2344 { MOD_TABLE (MOD_VEX_72_REG_4) },
2345 { "(bad)", { XX } },
2346 { MOD_TABLE (MOD_VEX_72_REG_6) },
2347 { "(bad)", { XX } },
2348 },
2349 /* REG_VEX_73 */
2350 {
2351 { "(bad)", { XX } },
2352 { "(bad)", { XX } },
2353 { MOD_TABLE (MOD_VEX_73_REG_2) },
2354 { MOD_TABLE (MOD_VEX_73_REG_3) },
2355 { "(bad)", { XX } },
2356 { "(bad)", { XX } },
2357 { MOD_TABLE (MOD_VEX_73_REG_6) },
2358 { MOD_TABLE (MOD_VEX_73_REG_7) },
2359 },
2360 /* REG_VEX_AE */
2361 {
2362 { "(bad)", { XX } },
2363 { "(bad)", { XX } },
2364 { MOD_TABLE (MOD_VEX_AE_REG_2) },
2365 { MOD_TABLE (MOD_VEX_AE_REG_3) },
2366 { "(bad)", { XX } },
2367 { "(bad)", { XX } },
2368 { "(bad)", { XX } },
2369 { "(bad)", { XX } },
2370 },
2371 };
2372
2373 static const struct dis386 prefix_table[][4] = {
2374 /* PREFIX_90 */
2375 {
2376 { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } } },
2377 { "pause", { XX } },
2378 { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } } },
2379 { "(bad)", { XX } },
2380 },
2381
2382 /* PREFIX_0F10 */
2383 {
2384 { "movups", { XM, EXx } },
2385 { "movss", { XM, EXd } },
2386 { "movupd", { XM, EXx } },
2387 { "movsd", { XM, EXq } },
2388 },
2389
2390 /* PREFIX_0F11 */
2391 {
2392 { "movups", { EXx, XM } },
2393 { "movss", { EXd, XM } },
2394 { "movupd", { EXx, XM } },
2395 { "movsd", { EXq, XM } },
2396 },
2397
2398 /* PREFIX_0F12 */
2399 {
2400 { MOD_TABLE (MOD_0F12_PREFIX_0) },
2401 { "movsldup", { XM, EXx } },
2402 { "movlpd", { XM, EXq } },
2403 { "movddup", { XM, EXq } },
2404 },
2405
2406 /* PREFIX_0F16 */
2407 {
2408 { MOD_TABLE (MOD_0F16_PREFIX_0) },
2409 { "movshdup", { XM, EXx } },
2410 { "movhpd", { XM, EXq } },
2411 { "(bad)", { XX } },
2412 },
2413
2414 /* PREFIX_0F2A */
2415 {
2416 { "cvtpi2ps", { XM, EMCq } },
2417 { "cvtsi2ss%LQ", { XM, Ev } },
2418 { "cvtpi2pd", { XM, EMCq } },
2419 { "cvtsi2sd%LQ", { XM, Ev } },
2420 },
2421
2422 /* PREFIX_0F2B */
2423 {
2424 { MOD_TABLE (MOD_0F2B_PREFIX_0) },
2425 { MOD_TABLE (MOD_0F2B_PREFIX_1) },
2426 { MOD_TABLE (MOD_0F2B_PREFIX_2) },
2427 { MOD_TABLE (MOD_0F2B_PREFIX_3) },
2428 },
2429
2430 /* PREFIX_0F2C */
2431 {
2432 { "cvttps2pi", { MXC, EXq } },
2433 { "cvttss2siY", { Gv, EXd } },
2434 { "cvttpd2pi", { MXC, EXx } },
2435 { "cvttsd2siY", { Gv, EXq } },
2436 },
2437
2438 /* PREFIX_0F2D */
2439 {
2440 { "cvtps2pi", { MXC, EXq } },
2441 { "cvtss2siY", { Gv, EXd } },
2442 { "cvtpd2pi", { MXC, EXx } },
2443 { "cvtsd2siY", { Gv, EXq } },
2444 },
2445
2446 /* PREFIX_0F2E */
2447 {
2448 { "ucomiss",{ XM, EXd } },
2449 { "(bad)", { XX } },
2450 { "ucomisd",{ XM, EXq } },
2451 { "(bad)", { XX } },
2452 },
2453
2454 /* PREFIX_0F2F */
2455 {
2456 { "comiss", { XM, EXd } },
2457 { "(bad)", { XX } },
2458 { "comisd", { XM, EXq } },
2459 { "(bad)", { XX } },
2460 },
2461
2462 /* PREFIX_0F51 */
2463 {
2464 { "sqrtps", { XM, EXx } },
2465 { "sqrtss", { XM, EXd } },
2466 { "sqrtpd", { XM, EXx } },
2467 { "sqrtsd", { XM, EXq } },
2468 },
2469
2470 /* PREFIX_0F52 */
2471 {
2472 { "rsqrtps",{ XM, EXx } },
2473 { "rsqrtss",{ XM, EXd } },
2474 { "(bad)", { XX } },
2475 { "(bad)", { XX } },
2476 },
2477
2478 /* PREFIX_0F53 */
2479 {
2480 { "rcpps", { XM, EXx } },
2481 { "rcpss", { XM, EXd } },
2482 { "(bad)", { XX } },
2483 { "(bad)", { XX } },
2484 },
2485
2486 /* PREFIX_0F58 */
2487 {
2488 { "addps", { XM, EXx } },
2489 { "addss", { XM, EXd } },
2490 { "addpd", { XM, EXx } },
2491 { "addsd", { XM, EXq } },
2492 },
2493
2494 /* PREFIX_0F59 */
2495 {
2496 { "mulps", { XM, EXx } },
2497 { "mulss", { XM, EXd } },
2498 { "mulpd", { XM, EXx } },
2499 { "mulsd", { XM, EXq } },
2500 },
2501
2502 /* PREFIX_0F5A */
2503 {
2504 { "cvtps2pd", { XM, EXq } },
2505 { "cvtss2sd", { XM, EXd } },
2506 { "cvtpd2ps", { XM, EXx } },
2507 { "cvtsd2ss", { XM, EXq } },
2508 },
2509
2510 /* PREFIX_0F5B */
2511 {
2512 { "cvtdq2ps", { XM, EXx } },
2513 { "cvttps2dq", { XM, EXx } },
2514 { "cvtps2dq", { XM, EXx } },
2515 { "(bad)", { XX } },
2516 },
2517
2518 /* PREFIX_0F5C */
2519 {
2520 { "subps", { XM, EXx } },
2521 { "subss", { XM, EXd } },
2522 { "subpd", { XM, EXx } },
2523 { "subsd", { XM, EXq } },
2524 },
2525
2526 /* PREFIX_0F5D */
2527 {
2528 { "minps", { XM, EXx } },
2529 { "minss", { XM, EXd } },
2530 { "minpd", { XM, EXx } },
2531 { "minsd", { XM, EXq } },
2532 },
2533
2534 /* PREFIX_0F5E */
2535 {
2536 { "divps", { XM, EXx } },
2537 { "divss", { XM, EXd } },
2538 { "divpd", { XM, EXx } },
2539 { "divsd", { XM, EXq } },
2540 },
2541
2542 /* PREFIX_0F5F */
2543 {
2544 { "maxps", { XM, EXx } },
2545 { "maxss", { XM, EXd } },
2546 { "maxpd", { XM, EXx } },
2547 { "maxsd", { XM, EXq } },
2548 },
2549
2550 /* PREFIX_0F60 */
2551 {
2552 { "punpcklbw",{ MX, EMd } },
2553 { "(bad)", { XX } },
2554 { "punpcklbw",{ MX, EMx } },
2555 { "(bad)", { XX } },
2556 },
2557
2558 /* PREFIX_0F61 */
2559 {
2560 { "punpcklwd",{ MX, EMd } },
2561 { "(bad)", { XX } },
2562 { "punpcklwd",{ MX, EMx } },
2563 { "(bad)", { XX } },
2564 },
2565
2566 /* PREFIX_0F62 */
2567 {
2568 { "punpckldq",{ MX, EMd } },
2569 { "(bad)", { XX } },
2570 { "punpckldq",{ MX, EMx } },
2571 { "(bad)", { XX } },
2572 },
2573
2574 /* PREFIX_0F6C */
2575 {
2576 { "(bad)", { XX } },
2577 { "(bad)", { XX } },
2578 { "punpcklqdq", { XM, EXx } },
2579 { "(bad)", { XX } },
2580 },
2581
2582 /* PREFIX_0F6D */
2583 {
2584 { "(bad)", { XX } },
2585 { "(bad)", { XX } },
2586 { "punpckhqdq", { XM, EXx } },
2587 { "(bad)", { XX } },
2588 },
2589
2590 /* PREFIX_0F6F */
2591 {
2592 { "movq", { MX, EM } },
2593 { "movdqu", { XM, EXx } },
2594 { "movdqa", { XM, EXx } },
2595 { "(bad)", { XX } },
2596 },
2597
2598 /* PREFIX_0F70 */
2599 {
2600 { "pshufw", { MX, EM, Ib } },
2601 { "pshufhw",{ XM, EXx, Ib } },
2602 { "pshufd", { XM, EXx, Ib } },
2603 { "pshuflw",{ XM, EXx, Ib } },
2604 },
2605
2606 /* PREFIX_0F73_REG_3 */
2607 {
2608 { "(bad)", { XX } },
2609 { "(bad)", { XX } },
2610 { "psrldq", { XS, Ib } },
2611 { "(bad)", { XX } },
2612 },
2613
2614 /* PREFIX_0F73_REG_7 */
2615 {
2616 { "(bad)", { XX } },
2617 { "(bad)", { XX } },
2618 { "pslldq", { XS, Ib } },
2619 { "(bad)", { XX } },
2620 },
2621
2622 /* PREFIX_0F78 */
2623 {
2624 {"vmread", { Em, Gm } },
2625 {"(bad)", { XX } },
2626 {"extrq", { XS, Ib, Ib } },
2627 {"insertq", { XM, XS, Ib, Ib } },
2628 },
2629
2630 /* PREFIX_0F79 */
2631 {
2632 {"vmwrite", { Gm, Em } },
2633 {"(bad)", { XX } },
2634 {"extrq", { XM, XS } },
2635 {"insertq", { XM, XS } },
2636 },
2637
2638 /* PREFIX_0F7C */
2639 {
2640 { "(bad)", { XX } },
2641 { "(bad)", { XX } },
2642 { "haddpd", { XM, EXx } },
2643 { "haddps", { XM, EXx } },
2644 },
2645
2646 /* PREFIX_0F7D */
2647 {
2648 { "(bad)", { XX } },
2649 { "(bad)", { XX } },
2650 { "hsubpd", { XM, EXx } },
2651 { "hsubps", { XM, EXx } },
2652 },
2653
2654 /* PREFIX_0F7E */
2655 {
2656 { "movK", { Edq, MX } },
2657 { "movq", { XM, EXq } },
2658 { "movK", { Edq, XM } },
2659 { "(bad)", { XX } },
2660 },
2661
2662 /* PREFIX_0F7F */
2663 {
2664 { "movq", { EM, MX } },
2665 { "movdqu", { EXx, XM } },
2666 { "movdqa", { EXx, XM } },
2667 { "(bad)", { XX } },
2668 },
2669
2670 /* PREFIX_0FB8 */
2671 {
2672 { "(bad)", { XX } },
2673 { "popcntS", { Gv, Ev } },
2674 { "(bad)", { XX } },
2675 { "(bad)", { XX } },
2676 },
2677
2678 /* PREFIX_0FBD */
2679 {
2680 { "bsrS", { Gv, Ev } },
2681 { "lzcntS", { Gv, Ev } },
2682 { "bsrS", { Gv, Ev } },
2683 { "(bad)", { XX } },
2684 },
2685
2686 /* PREFIX_0FC2 */
2687 {
2688 { "cmpps", { XM, EXx, CMP } },
2689 { "cmpss", { XM, EXd, CMP } },
2690 { "cmppd", { XM, EXx, CMP } },
2691 { "cmpsd", { XM, EXq, CMP } },
2692 },
2693
2694 /* PREFIX_0FC3 */
2695 {
2696 { "movntiS", { Ma, Gv } },
2697 { "(bad)", { XX } },
2698 { "(bad)", { XX } },
2699 { "(bad)", { XX } },
2700 },
2701
2702 /* PREFIX_0FC7_REG_6 */
2703 {
2704 { "vmptrld",{ Mq } },
2705 { "vmxon", { Mq } },
2706 { "vmclear",{ Mq } },
2707 { "(bad)", { XX } },
2708 },
2709
2710 /* PREFIX_0FD0 */
2711 {
2712 { "(bad)", { XX } },
2713 { "(bad)", { XX } },
2714 { "addsubpd", { XM, EXx } },
2715 { "addsubps", { XM, EXx } },
2716 },
2717
2718 /* PREFIX_0FD6 */
2719 {
2720 { "(bad)", { XX } },
2721 { "movq2dq",{ XM, MS } },
2722 { "movq", { EXq, XM } },
2723 { "movdq2q",{ MX, XS } },
2724 },
2725
2726 /* PREFIX_0FE6 */
2727 {
2728 { "(bad)", { XX } },
2729 { "cvtdq2pd", { XM, EXq } },
2730 { "cvttpd2dq", { XM, EXx } },
2731 { "cvtpd2dq", { XM, EXx } },
2732 },
2733
2734 /* PREFIX_0FE7 */
2735 {
2736 { "movntq", { Mq, MX } },
2737 { "(bad)", { XX } },
2738 { MOD_TABLE (MOD_0FE7_PREFIX_2) },
2739 { "(bad)", { XX } },
2740 },
2741
2742 /* PREFIX_0FF0 */
2743 {
2744 { "(bad)", { XX } },
2745 { "(bad)", { XX } },
2746 { "(bad)", { XX } },
2747 { MOD_TABLE (MOD_0FF0_PREFIX_3) },
2748 },
2749
2750 /* PREFIX_0FF7 */
2751 {
2752 { "maskmovq", { MX, MS } },
2753 { "(bad)", { XX } },
2754 { "maskmovdqu", { XM, XS } },
2755 { "(bad)", { XX } },
2756 },
2757
2758 /* PREFIX_0F3810 */
2759 {
2760 { "(bad)", { XX } },
2761 { "(bad)", { XX } },
2762 { "pblendvb", { XM, EXx, XMM0 } },
2763 { "(bad)", { XX } },
2764 },
2765
2766 /* PREFIX_0F3814 */
2767 {
2768 { "(bad)", { XX } },
2769 { "(bad)", { XX } },
2770 { "blendvps", { XM, EXx, XMM0 } },
2771 { "(bad)", { XX } },
2772 },
2773
2774 /* PREFIX_0F3815 */
2775 {
2776 { "(bad)", { XX } },
2777 { "(bad)", { XX } },
2778 { "blendvpd", { XM, EXx, XMM0 } },
2779 { "(bad)", { XX } },
2780 },
2781
2782 /* PREFIX_0F3817 */
2783 {
2784 { "(bad)", { XX } },
2785 { "(bad)", { XX } },
2786 { "ptest", { XM, EXx } },
2787 { "(bad)", { XX } },
2788 },
2789
2790 /* PREFIX_0F3820 */
2791 {
2792 { "(bad)", { XX } },
2793 { "(bad)", { XX } },
2794 { "pmovsxbw", { XM, EXq } },
2795 { "(bad)", { XX } },
2796 },
2797
2798 /* PREFIX_0F3821 */
2799 {
2800 { "(bad)", { XX } },
2801 { "(bad)", { XX } },
2802 { "pmovsxbd", { XM, EXd } },
2803 { "(bad)", { XX } },
2804 },
2805
2806 /* PREFIX_0F3822 */
2807 {
2808 { "(bad)", { XX } },
2809 { "(bad)", { XX } },
2810 { "pmovsxbq", { XM, EXw } },
2811 { "(bad)", { XX } },
2812 },
2813
2814 /* PREFIX_0F3823 */
2815 {
2816 { "(bad)", { XX } },
2817 { "(bad)", { XX } },
2818 { "pmovsxwd", { XM, EXq } },
2819 { "(bad)", { XX } },
2820 },
2821
2822 /* PREFIX_0F3824 */
2823 {
2824 { "(bad)", { XX } },
2825 { "(bad)", { XX } },
2826 { "pmovsxwq", { XM, EXd } },
2827 { "(bad)", { XX } },
2828 },
2829
2830 /* PREFIX_0F3825 */
2831 {
2832 { "(bad)", { XX } },
2833 { "(bad)", { XX } },
2834 { "pmovsxdq", { XM, EXq } },
2835 { "(bad)", { XX } },
2836 },
2837
2838 /* PREFIX_0F3828 */
2839 {
2840 { "(bad)", { XX } },
2841 { "(bad)", { XX } },
2842 { "pmuldq", { XM, EXx } },
2843 { "(bad)", { XX } },
2844 },
2845
2846 /* PREFIX_0F3829 */
2847 {
2848 { "(bad)", { XX } },
2849 { "(bad)", { XX } },
2850 { "pcmpeqq", { XM, EXx } },
2851 { "(bad)", { XX } },
2852 },
2853
2854 /* PREFIX_0F382A */
2855 {
2856 { "(bad)", { XX } },
2857 { "(bad)", { XX } },
2858 { MOD_TABLE (MOD_0F382A_PREFIX_2) },
2859 { "(bad)", { XX } },
2860 },
2861
2862 /* PREFIX_0F382B */
2863 {
2864 { "(bad)", { XX } },
2865 { "(bad)", { XX } },
2866 { "packusdw", { XM, EXx } },
2867 { "(bad)", { XX } },
2868 },
2869
2870 /* PREFIX_0F3830 */
2871 {
2872 { "(bad)", { XX } },
2873 { "(bad)", { XX } },
2874 { "pmovzxbw", { XM, EXq } },
2875 { "(bad)", { XX } },
2876 },
2877
2878 /* PREFIX_0F3831 */
2879 {
2880 { "(bad)", { XX } },
2881 { "(bad)", { XX } },
2882 { "pmovzxbd", { XM, EXd } },
2883 { "(bad)", { XX } },
2884 },
2885
2886 /* PREFIX_0F3832 */
2887 {
2888 { "(bad)", { XX } },
2889 { "(bad)", { XX } },
2890 { "pmovzxbq", { XM, EXw } },
2891 { "(bad)", { XX } },
2892 },
2893
2894 /* PREFIX_0F3833 */
2895 {
2896 { "(bad)", { XX } },
2897 { "(bad)", { XX } },
2898 { "pmovzxwd", { XM, EXq } },
2899 { "(bad)", { XX } },
2900 },
2901
2902 /* PREFIX_0F3834 */
2903 {
2904 { "(bad)", { XX } },
2905 { "(bad)", { XX } },
2906 { "pmovzxwq", { XM, EXd } },
2907 { "(bad)", { XX } },
2908 },
2909
2910 /* PREFIX_0F3835 */
2911 {
2912 { "(bad)", { XX } },
2913 { "(bad)", { XX } },
2914 { "pmovzxdq", { XM, EXq } },
2915 { "(bad)", { XX } },
2916 },
2917
2918 /* PREFIX_0F3837 */
2919 {
2920 { "(bad)", { XX } },
2921 { "(bad)", { XX } },
2922 { "pcmpgtq", { XM, EXx } },
2923 { "(bad)", { XX } },
2924 },
2925
2926 /* PREFIX_0F3838 */
2927 {
2928 { "(bad)", { XX } },
2929 { "(bad)", { XX } },
2930 { "pminsb", { XM, EXx } },
2931 { "(bad)", { XX } },
2932 },
2933
2934 /* PREFIX_0F3839 */
2935 {
2936 { "(bad)", { XX } },
2937 { "(bad)", { XX } },
2938 { "pminsd", { XM, EXx } },
2939 { "(bad)", { XX } },
2940 },
2941
2942 /* PREFIX_0F383A */
2943 {
2944 { "(bad)", { XX } },
2945 { "(bad)", { XX } },
2946 { "pminuw", { XM, EXx } },
2947 { "(bad)", { XX } },
2948 },
2949
2950 /* PREFIX_0F383B */
2951 {
2952 { "(bad)", { XX } },
2953 { "(bad)", { XX } },
2954 { "pminud", { XM, EXx } },
2955 { "(bad)", { XX } },
2956 },
2957
2958 /* PREFIX_0F383C */
2959 {
2960 { "(bad)", { XX } },
2961 { "(bad)", { XX } },
2962 { "pmaxsb", { XM, EXx } },
2963 { "(bad)", { XX } },
2964 },
2965
2966 /* PREFIX_0F383D */
2967 {
2968 { "(bad)", { XX } },
2969 { "(bad)", { XX } },
2970 { "pmaxsd", { XM, EXx } },
2971 { "(bad)", { XX } },
2972 },
2973
2974 /* PREFIX_0F383E */
2975 {
2976 { "(bad)", { XX } },
2977 { "(bad)", { XX } },
2978 { "pmaxuw", { XM, EXx } },
2979 { "(bad)", { XX } },
2980 },
2981
2982 /* PREFIX_0F383F */
2983 {
2984 { "(bad)", { XX } },
2985 { "(bad)", { XX } },
2986 { "pmaxud", { XM, EXx } },
2987 { "(bad)", { XX } },
2988 },
2989
2990 /* PREFIX_0F3840 */
2991 {
2992 { "(bad)", { XX } },
2993 { "(bad)", { XX } },
2994 { "pmulld", { XM, EXx } },
2995 { "(bad)", { XX } },
2996 },
2997
2998 /* PREFIX_0F3841 */
2999 {
3000 { "(bad)", { XX } },
3001 { "(bad)", { XX } },
3002 { "phminposuw", { XM, EXx } },
3003 { "(bad)", { XX } },
3004 },
3005
3006 /* PREFIX_0F38DB */
3007 {
3008 { "(bad)", { XX } },
3009 { "(bad)", { XX } },
3010 { "aesimc", { XM, EXx } },
3011 { "(bad)", { XX } },
3012 },
3013
3014 /* PREFIX_0F38DC */
3015 {
3016 { "(bad)", { XX } },
3017 { "(bad)", { XX } },
3018 { "aesenc", { XM, EXx } },
3019 { "(bad)", { XX } },
3020 },
3021
3022 /* PREFIX_0F38DD */
3023 {
3024 { "(bad)", { XX } },
3025 { "(bad)", { XX } },
3026 { "aesenclast", { XM, EXx } },
3027 { "(bad)", { XX } },
3028 },
3029
3030 /* PREFIX_0F38DE */
3031 {
3032 { "(bad)", { XX } },
3033 { "(bad)", { XX } },
3034 { "aesdec", { XM, EXx } },
3035 { "(bad)", { XX } },
3036 },
3037
3038 /* PREFIX_0F38DF */
3039 {
3040 { "(bad)", { XX } },
3041 { "(bad)", { XX } },
3042 { "aesdeclast", { XM, EXx } },
3043 { "(bad)", { XX } },
3044 },
3045
3046 /* PREFIX_0F38F0 */
3047 {
3048 { "(bad)", { XX } },
3049 { "(bad)", { XX } },
3050 { "(bad)", { XX } },
3051 { "crc32", { Gdq, { CRC32_Fixup, b_mode } } },
3052 },
3053
3054 /* PREFIX_0F38F1 */
3055 {
3056 { "(bad)", { XX } },
3057 { "(bad)", { XX } },
3058 { "(bad)", { XX } },
3059 { "crc32", { Gdq, { CRC32_Fixup, v_mode } } },
3060 },
3061
3062 /* PREFIX_0F3A08 */
3063 {
3064 { "(bad)", { XX } },
3065 { "(bad)", { XX } },
3066 { "roundps", { XM, EXx, Ib } },
3067 { "(bad)", { XX } },
3068 },
3069
3070 /* PREFIX_0F3A09 */
3071 {
3072 { "(bad)", { XX } },
3073 { "(bad)", { XX } },
3074 { "roundpd", { XM, EXx, Ib } },
3075 { "(bad)", { XX } },
3076 },
3077
3078 /* PREFIX_0F3A0A */
3079 {
3080 { "(bad)", { XX } },
3081 { "(bad)", { XX } },
3082 { "roundss", { XM, EXd, Ib } },
3083 { "(bad)", { XX } },
3084 },
3085
3086 /* PREFIX_0F3A0B */
3087 {
3088 { "(bad)", { XX } },
3089 { "(bad)", { XX } },
3090 { "roundsd", { XM, EXq, Ib } },
3091 { "(bad)", { XX } },
3092 },
3093
3094 /* PREFIX_0F3A0C */
3095 {
3096 { "(bad)", { XX } },
3097 { "(bad)", { XX } },
3098 { "blendps", { XM, EXx, Ib } },
3099 { "(bad)", { XX } },
3100 },
3101
3102 /* PREFIX_0F3A0D */
3103 {
3104 { "(bad)", { XX } },
3105 { "(bad)", { XX } },
3106 { "blendpd", { XM, EXx, Ib } },
3107 { "(bad)", { XX } },
3108 },
3109
3110 /* PREFIX_0F3A0E */
3111 {
3112 { "(bad)", { XX } },
3113 { "(bad)", { XX } },
3114 { "pblendw", { XM, EXx, Ib } },
3115 { "(bad)", { XX } },
3116 },
3117
3118 /* PREFIX_0F3A14 */
3119 {
3120 { "(bad)", { XX } },
3121 { "(bad)", { XX } },
3122 { "pextrb", { Edqb, XM, Ib } },
3123 { "(bad)", { XX } },
3124 },
3125
3126 /* PREFIX_0F3A15 */
3127 {
3128 { "(bad)", { XX } },
3129 { "(bad)", { XX } },
3130 { "pextrw", { Edqw, XM, Ib } },
3131 { "(bad)", { XX } },
3132 },
3133
3134 /* PREFIX_0F3A16 */
3135 {
3136 { "(bad)", { XX } },
3137 { "(bad)", { XX } },
3138 { "pextrK", { Edq, XM, Ib } },
3139 { "(bad)", { XX } },
3140 },
3141
3142 /* PREFIX_0F3A17 */
3143 {
3144 { "(bad)", { XX } },
3145 { "(bad)", { XX } },
3146 { "extractps", { Edqd, XM, Ib } },
3147 { "(bad)", { XX } },
3148 },
3149
3150 /* PREFIX_0F3A20 */
3151 {
3152 { "(bad)", { XX } },
3153 { "(bad)", { XX } },
3154 { "pinsrb", { XM, Edqb, Ib } },
3155 { "(bad)", { XX } },
3156 },
3157
3158 /* PREFIX_0F3A21 */
3159 {
3160 { "(bad)", { XX } },
3161 { "(bad)", { XX } },
3162 { "insertps", { XM, EXd, Ib } },
3163 { "(bad)", { XX } },
3164 },
3165
3166 /* PREFIX_0F3A22 */
3167 {
3168 { "(bad)", { XX } },
3169 { "(bad)", { XX } },
3170 { "pinsrK", { XM, Edq, Ib } },
3171 { "(bad)", { XX } },
3172 },
3173
3174 /* PREFIX_0F3A40 */
3175 {
3176 { "(bad)", { XX } },
3177 { "(bad)", { XX } },
3178 { "dpps", { XM, EXx, Ib } },
3179 { "(bad)", { XX } },
3180 },
3181
3182 /* PREFIX_0F3A41 */
3183 {
3184 { "(bad)", { XX } },
3185 { "(bad)", { XX } },
3186 { "dppd", { XM, EXx, Ib } },
3187 { "(bad)", { XX } },
3188 },
3189
3190 /* PREFIX_0F3A42 */
3191 {
3192 { "(bad)", { XX } },
3193 { "(bad)", { XX } },
3194 { "mpsadbw", { XM, EXx, Ib } },
3195 { "(bad)", { XX } },
3196 },
3197
3198 /* PREFIX_0F3A44 */
3199 {
3200 { "(bad)", { XX } },
3201 { "(bad)", { XX } },
3202 { "pclmulqdq", { XM, EXx, PCLMUL } },
3203 { "(bad)", { XX } },
3204 },
3205
3206 /* PREFIX_0F3A60 */
3207 {
3208 { "(bad)", { XX } },
3209 { "(bad)", { XX } },
3210 { "pcmpestrm", { XM, EXx, Ib } },
3211 { "(bad)", { XX } },
3212 },
3213
3214 /* PREFIX_0F3A61 */
3215 {
3216 { "(bad)", { XX } },
3217 { "(bad)", { XX } },
3218 { "pcmpestri", { XM, EXx, Ib } },
3219 { "(bad)", { XX } },
3220 },
3221
3222 /* PREFIX_0F3A62 */
3223 {
3224 { "(bad)", { XX } },
3225 { "(bad)", { XX } },
3226 { "pcmpistrm", { XM, EXx, Ib } },
3227 { "(bad)", { XX } },
3228 },
3229
3230 /* PREFIX_0F3A63 */
3231 {
3232 { "(bad)", { XX } },
3233 { "(bad)", { XX } },
3234 { "pcmpistri", { XM, EXx, Ib } },
3235 { "(bad)", { XX } },
3236 },
3237
3238 /* PREFIX_0F3ADF */
3239 {
3240 { "(bad)", { XX } },
3241 { "(bad)", { XX } },
3242 { "aeskeygenassist", { XM, EXx, Ib } },
3243 { "(bad)", { XX } },
3244 },
3245
3246 /* PREFIX_VEX_10 */
3247 {
3248 { "vmovups", { XM, EXx } },
3249 { VEX_LEN_TABLE (VEX_LEN_10_P_1) },
3250 { "vmovupd", { XM, EXx } },
3251 { VEX_LEN_TABLE (VEX_LEN_10_P_3) },
3252 },
3253
3254 /* PREFIX_VEX_11 */
3255 {
3256 { "vmovups", { EXx, XM } },
3257 { VEX_LEN_TABLE (VEX_LEN_11_P_1) },
3258 { "vmovupd", { EXx, XM } },
3259 { VEX_LEN_TABLE (VEX_LEN_11_P_3) },
3260 },
3261
3262 /* PREFIX_VEX_12 */
3263 {
3264 { MOD_TABLE (MOD_VEX_12_PREFIX_0) },
3265 { "vmovsldup", { XM, EXx } },
3266 { VEX_LEN_TABLE (VEX_LEN_12_P_2) },
3267 { "vmovddup", { XM, EXymmq } },
3268 },
3269
3270 /* PREFIX_VEX_16 */
3271 {
3272 { MOD_TABLE (MOD_VEX_16_PREFIX_0) },
3273 { "vmovshdup", { XM, EXx } },
3274 { VEX_LEN_TABLE (VEX_LEN_16_P_2) },
3275 { "(bad)", { XX } },
3276 },
3277
3278 /* PREFIX_VEX_2A */
3279 {
3280 { "(bad)", { XX } },
3281 { VEX_LEN_TABLE (VEX_LEN_2A_P_1) },
3282 { "(bad)", { XX } },
3283 { VEX_LEN_TABLE (VEX_LEN_2A_P_3) },
3284 },
3285
3286 /* PREFIX_VEX_2C */
3287 {
3288 { "(bad)", { XX } },
3289 { VEX_LEN_TABLE (VEX_LEN_2C_P_1) },
3290 { "(bad)", { XX } },
3291 { VEX_LEN_TABLE (VEX_LEN_2C_P_3) },
3292 },
3293
3294 /* PREFIX_VEX_2D */
3295 {
3296 { "(bad)", { XX } },
3297 { VEX_LEN_TABLE (VEX_LEN_2D_P_1) },
3298 { "(bad)", { XX } },
3299 { VEX_LEN_TABLE (VEX_LEN_2D_P_3) },
3300 },
3301
3302 /* PREFIX_VEX_2E */
3303 {
3304 { VEX_LEN_TABLE (VEX_LEN_2E_P_0) },
3305 { "(bad)", { XX } },
3306 { VEX_LEN_TABLE (VEX_LEN_2E_P_2) },
3307 { "(bad)", { XX } },
3308 },
3309
3310 /* PREFIX_VEX_2F */
3311 {
3312 { VEX_LEN_TABLE (VEX_LEN_2F_P_0) },
3313 { "(bad)", { XX } },
3314 { VEX_LEN_TABLE (VEX_LEN_2F_P_2) },
3315 { "(bad)", { XX } },
3316 },
3317
3318 /* PREFIX_VEX_51 */
3319 {
3320 { "vsqrtps", { XM, EXx } },
3321 { VEX_LEN_TABLE (VEX_LEN_51_P_1) },
3322 { "vsqrtpd", { XM, EXx } },
3323 { VEX_LEN_TABLE (VEX_LEN_51_P_3) },
3324 },
3325
3326 /* PREFIX_VEX_52 */
3327 {
3328 { "vrsqrtps", { XM, EXx } },
3329 { VEX_LEN_TABLE (VEX_LEN_52_P_1) },
3330 { "(bad)", { XX } },
3331 { "(bad)", { XX } },
3332 },
3333
3334 /* PREFIX_VEX_53 */
3335 {
3336 { "vrcpps", { XM, EXx } },
3337 { VEX_LEN_TABLE (VEX_LEN_53_P_1) },
3338 { "(bad)", { XX } },
3339 { "(bad)", { XX } },
3340 },
3341
3342 /* PREFIX_VEX_58 */
3343 {
3344 { "vaddps", { XM, Vex, EXx } },
3345 { VEX_LEN_TABLE (VEX_LEN_58_P_1) },
3346 { "vaddpd", { XM, Vex, EXx } },
3347 { VEX_LEN_TABLE (VEX_LEN_58_P_3) },
3348 },
3349
3350 /* PREFIX_VEX_59 */
3351 {
3352 { "vmulps", { XM, Vex, EXx } },
3353 { VEX_LEN_TABLE (VEX_LEN_59_P_1) },
3354 { "vmulpd", { XM, Vex, EXx } },
3355 { VEX_LEN_TABLE (VEX_LEN_59_P_3) },
3356 },
3357
3358 /* PREFIX_VEX_5A */
3359 {
3360 { "vcvtps2pd", { XM, EXxmmq } },
3361 { VEX_LEN_TABLE (VEX_LEN_5A_P_1) },
3362 { "vcvtpd2ps%XY", { XMM, EXx } },
3363 { VEX_LEN_TABLE (VEX_LEN_5A_P_3) },
3364 },
3365
3366 /* PREFIX_VEX_5B */
3367 {
3368 { "vcvtdq2ps", { XM, EXx } },
3369 { "vcvttps2dq", { XM, EXx } },
3370 { "vcvtps2dq", { XM, EXx } },
3371 { "(bad)", { XX } },
3372 },
3373
3374 /* PREFIX_VEX_5C */
3375 {
3376 { "vsubps", { XM, Vex, EXx } },
3377 { VEX_LEN_TABLE (VEX_LEN_5C_P_1) },
3378 { "vsubpd", { XM, Vex, EXx } },
3379 { VEX_LEN_TABLE (VEX_LEN_5C_P_3) },
3380 },
3381
3382 /* PREFIX_VEX_5D */
3383 {
3384 { "vminps", { XM, Vex, EXx } },
3385 { VEX_LEN_TABLE (VEX_LEN_5D_P_1) },
3386 { "vminpd", { XM, Vex, EXx } },
3387 { VEX_LEN_TABLE (VEX_LEN_5D_P_3) },
3388 },
3389
3390 /* PREFIX_VEX_5E */
3391 {
3392 { "vdivps", { XM, Vex, EXx } },
3393 { VEX_LEN_TABLE (VEX_LEN_5E_P_1) },
3394 { "vdivpd", { XM, Vex, EXx } },
3395 { VEX_LEN_TABLE (VEX_LEN_5E_P_3) },
3396 },
3397
3398 /* PREFIX_VEX_5F */
3399 {
3400 { "vmaxps", { XM, Vex, EXx } },
3401 { VEX_LEN_TABLE (VEX_LEN_5F_P_1) },
3402 { "vmaxpd", { XM, Vex, EXx } },
3403 { VEX_LEN_TABLE (VEX_LEN_5F_P_3) },
3404 },
3405
3406 /* PREFIX_VEX_60 */
3407 {
3408 { "(bad)", { XX } },
3409 { "(bad)", { XX } },
3410 { VEX_LEN_TABLE (VEX_LEN_60_P_2) },
3411 { "(bad)", { XX } },
3412 },
3413
3414 /* PREFIX_VEX_61 */
3415 {
3416 { "(bad)", { XX } },
3417 { "(bad)", { XX } },
3418 { VEX_LEN_TABLE (VEX_LEN_61_P_2) },
3419 { "(bad)", { XX } },
3420 },
3421
3422 /* PREFIX_VEX_62 */
3423 {
3424 { "(bad)", { XX } },
3425 { "(bad)", { XX } },
3426 { VEX_LEN_TABLE (VEX_LEN_62_P_2) },
3427 { "(bad)", { XX } },
3428 },
3429
3430 /* PREFIX_VEX_63 */
3431 {
3432 { "(bad)", { XX } },
3433 { "(bad)", { XX } },
3434 { VEX_LEN_TABLE (VEX_LEN_63_P_2) },
3435 { "(bad)", { XX } },
3436 },
3437
3438 /* PREFIX_VEX_64 */
3439 {
3440 { "(bad)", { XX } },
3441 { "(bad)", { XX } },
3442 { VEX_LEN_TABLE (VEX_LEN_64_P_2) },
3443 { "(bad)", { XX } },
3444 },
3445
3446 /* PREFIX_VEX_65 */
3447 {
3448 { "(bad)", { XX } },
3449 { "(bad)", { XX } },
3450 { VEX_LEN_TABLE (VEX_LEN_65_P_2) },
3451 { "(bad)", { XX } },
3452 },
3453
3454 /* PREFIX_VEX_66 */
3455 {
3456 { "(bad)", { XX } },
3457 { "(bad)", { XX } },
3458 { VEX_LEN_TABLE (VEX_LEN_66_P_2) },
3459 { "(bad)", { XX } },
3460 },
3461
3462 /* PREFIX_VEX_67 */
3463 {
3464 { "(bad)", { XX } },
3465 { "(bad)", { XX } },
3466 { VEX_LEN_TABLE (VEX_LEN_67_P_2) },
3467 { "(bad)", { XX } },
3468 },
3469
3470 /* PREFIX_VEX_68 */
3471 {
3472 { "(bad)", { XX } },
3473 { "(bad)", { XX } },
3474 { VEX_LEN_TABLE (VEX_LEN_68_P_2) },
3475 { "(bad)", { XX } },
3476 },
3477
3478 /* PREFIX_VEX_69 */
3479 {
3480 { "(bad)", { XX } },
3481 { "(bad)", { XX } },
3482 { VEX_LEN_TABLE (VEX_LEN_69_P_2) },
3483 { "(bad)", { XX } },
3484 },
3485
3486 /* PREFIX_VEX_6A */
3487 {
3488 { "(bad)", { XX } },
3489 { "(bad)", { XX } },
3490 { VEX_LEN_TABLE (VEX_LEN_6A_P_2) },
3491 { "(bad)", { XX } },
3492 },
3493
3494 /* PREFIX_VEX_6B */
3495 {
3496 { "(bad)", { XX } },
3497 { "(bad)", { XX } },
3498 { VEX_LEN_TABLE (VEX_LEN_6B_P_2) },
3499 { "(bad)", { XX } },
3500 },
3501
3502 /* PREFIX_VEX_6C */
3503 {
3504 { "(bad)", { XX } },
3505 { "(bad)", { XX } },
3506 { VEX_LEN_TABLE (VEX_LEN_6C_P_2) },
3507 { "(bad)", { XX } },
3508 },
3509
3510 /* PREFIX_VEX_6D */
3511 {
3512 { "(bad)", { XX } },
3513 { "(bad)", { XX } },
3514 { VEX_LEN_TABLE (VEX_LEN_6D_P_2) },
3515 { "(bad)", { XX } },
3516 },
3517
3518 /* PREFIX_VEX_6E */
3519 {
3520 { "(bad)", { XX } },
3521 { "(bad)", { XX } },
3522 { VEX_LEN_TABLE (VEX_LEN_6E_P_2) },
3523 { "(bad)", { XX } },
3524 },
3525
3526 /* PREFIX_VEX_6F */
3527 {
3528 { "(bad)", { XX } },
3529 { "vmovdqu", { XM, EXx } },
3530 { "vmovdqa", { XM, EXx } },
3531 { "(bad)", { XX } },
3532 },
3533
3534 /* PREFIX_VEX_70 */
3535 {
3536 { "(bad)", { XX } },
3537 { VEX_LEN_TABLE (VEX_LEN_70_P_1) },
3538 { VEX_LEN_TABLE (VEX_LEN_70_P_2) },
3539 { VEX_LEN_TABLE (VEX_LEN_70_P_3) },
3540 },
3541
3542 /* PREFIX_VEX_71_REG_2 */
3543 {
3544 { "(bad)", { XX } },
3545 { "(bad)", { XX } },
3546 { VEX_LEN_TABLE (VEX_LEN_71_R_2_P_2) },
3547 { "(bad)", { XX } },
3548 },
3549
3550 /* PREFIX_VEX_71_REG_4 */
3551 {
3552 { "(bad)", { XX } },
3553 { "(bad)", { XX } },
3554 { VEX_LEN_TABLE (VEX_LEN_71_R_4_P_2) },
3555 { "(bad)", { XX } },
3556 },
3557
3558 /* PREFIX_VEX_71_REG_6 */
3559 {
3560 { "(bad)", { XX } },
3561 { "(bad)", { XX } },
3562 { VEX_LEN_TABLE (VEX_LEN_71_R_6_P_2) },
3563 { "(bad)", { XX } },
3564 },
3565
3566 /* PREFIX_VEX_72_REG_2 */
3567 {
3568 { "(bad)", { XX } },
3569 { "(bad)", { XX } },
3570 { VEX_LEN_TABLE (VEX_LEN_72_R_2_P_2) },
3571 { "(bad)", { XX } },
3572 },
3573
3574 /* PREFIX_VEX_72_REG_4 */
3575 {
3576 { "(bad)", { XX } },
3577 { "(bad)", { XX } },
3578 { VEX_LEN_TABLE (VEX_LEN_72_R_4_P_2) },
3579 { "(bad)", { XX } },
3580 },
3581
3582 /* PREFIX_VEX_72_REG_6 */
3583 {
3584 { "(bad)", { XX } },
3585 { "(bad)", { XX } },
3586 { VEX_LEN_TABLE (VEX_LEN_72_R_6_P_2) },
3587 { "(bad)", { XX } },
3588 },
3589
3590 /* PREFIX_VEX_73_REG_2 */
3591 {
3592 { "(bad)", { XX } },
3593 { "(bad)", { XX } },
3594 { VEX_LEN_TABLE (VEX_LEN_73_R_2_P_2) },
3595 { "(bad)", { XX } },
3596 },
3597
3598 /* PREFIX_VEX_73_REG_3 */
3599 {
3600 { "(bad)", { XX } },
3601 { "(bad)", { XX } },
3602 { VEX_LEN_TABLE (VEX_LEN_73_R_3_P_2) },
3603 { "(bad)", { XX } },
3604 },
3605
3606 /* PREFIX_VEX_73_REG_6 */
3607 {
3608 { "(bad)", { XX } },
3609 { "(bad)", { XX } },
3610 { VEX_LEN_TABLE (VEX_LEN_73_R_6_P_2) },
3611 { "(bad)", { XX } },
3612 },
3613
3614 /* PREFIX_VEX_73_REG_7 */
3615 {
3616 { "(bad)", { XX } },
3617 { "(bad)", { XX } },
3618 { VEX_LEN_TABLE (VEX_LEN_73_R_7_P_2) },
3619 { "(bad)", { XX } },
3620 },
3621
3622 /* PREFIX_VEX_74 */
3623 {
3624 { "(bad)", { XX } },
3625 { "(bad)", { XX } },
3626 { VEX_LEN_TABLE (VEX_LEN_74_P_2) },
3627 { "(bad)", { XX } },
3628 },
3629
3630 /* PREFIX_VEX_75 */
3631 {
3632 { "(bad)", { XX } },
3633 { "(bad)", { XX } },
3634 { VEX_LEN_TABLE (VEX_LEN_75_P_2) },
3635 { "(bad)", { XX } },
3636 },
3637
3638 /* PREFIX_VEX_76 */
3639 {
3640 { "(bad)", { XX } },
3641 { "(bad)", { XX } },
3642 { VEX_LEN_TABLE (VEX_LEN_76_P_2) },
3643 { "(bad)", { XX } },
3644 },
3645
3646 /* PREFIX_VEX_77 */
3647 {
3648 { "", { VZERO } },
3649 { "(bad)", { XX } },
3650 { "(bad)", { XX } },
3651 { "(bad)", { XX } },
3652 },
3653
3654 /* PREFIX_VEX_7C */
3655 {
3656 { "(bad)", { XX } },
3657 { "(bad)", { XX } },
3658 { "vhaddpd", { XM, Vex, EXx } },
3659 { "vhaddps", { XM, Vex, EXx } },
3660 },
3661
3662 /* PREFIX_VEX_7D */
3663 {
3664 { "(bad)", { XX } },
3665 { "(bad)", { XX } },
3666 { "vhsubpd", { XM, Vex, EXx } },
3667 { "vhsubps", { XM, Vex, EXx } },
3668 },
3669
3670 /* PREFIX_VEX_7E */
3671 {
3672 { "(bad)", { XX } },
3673 { VEX_LEN_TABLE (VEX_LEN_7E_P_1) },
3674 { VEX_LEN_TABLE (VEX_LEN_7E_P_2) },
3675 { "(bad)", { XX } },
3676 },
3677
3678 /* PREFIX_VEX_7F */
3679 {
3680 { "(bad)", { XX } },
3681 { "vmovdqu", { EXx, XM } },
3682 { "vmovdqa", { EXx, XM } },
3683 { "(bad)", { XX } },
3684 },
3685
3686 /* PREFIX_VEX_C2 */
3687 {
3688 { "vcmpps", { XM, Vex, EXx, VCMP } },
3689 { VEX_LEN_TABLE (VEX_LEN_C2_P_1) },
3690 { "vcmppd", { XM, Vex, EXx, VCMP } },
3691 { VEX_LEN_TABLE (VEX_LEN_C2_P_3) },
3692 },
3693
3694 /* PREFIX_VEX_C4 */
3695 {
3696 { "(bad)", { XX } },
3697 { "(bad)", { XX } },
3698 { VEX_LEN_TABLE (VEX_LEN_C4_P_2) },
3699 { "(bad)", { XX } },
3700 },
3701
3702 /* PREFIX_VEX_C5 */
3703 {
3704 { "(bad)", { XX } },
3705 { "(bad)", { XX } },
3706 { VEX_LEN_TABLE (VEX_LEN_C5_P_2) },
3707 { "(bad)", { XX } },
3708 },
3709
3710 /* PREFIX_VEX_D0 */
3711 {
3712 { "(bad)", { XX } },
3713 { "(bad)", { XX } },
3714 { "vaddsubpd", { XM, Vex, EXx } },
3715 { "vaddsubps", { XM, Vex, EXx } },
3716 },
3717
3718 /* PREFIX_VEX_D1 */
3719 {
3720 { "(bad)", { XX } },
3721 { "(bad)", { XX } },
3722 { VEX_LEN_TABLE (VEX_LEN_D1_P_2) },
3723 { "(bad)", { XX } },
3724 },
3725
3726 /* PREFIX_VEX_D2 */
3727 {
3728 { "(bad)", { XX } },
3729 { "(bad)", { XX } },
3730 { VEX_LEN_TABLE (VEX_LEN_D2_P_2) },
3731 { "(bad)", { XX } },
3732 },
3733
3734 /* PREFIX_VEX_D3 */
3735 {
3736 { "(bad)", { XX } },
3737 { "(bad)", { XX } },
3738 { VEX_LEN_TABLE (VEX_LEN_D3_P_2) },
3739 { "(bad)", { XX } },
3740 },
3741
3742 /* PREFIX_VEX_D4 */
3743 {
3744 { "(bad)", { XX } },
3745 { "(bad)", { XX } },
3746 { VEX_LEN_TABLE (VEX_LEN_D4_P_2) },
3747 { "(bad)", { XX } },
3748 },
3749
3750 /* PREFIX_VEX_D5 */
3751 {
3752 { "(bad)", { XX } },
3753 { "(bad)", { XX } },
3754 { VEX_LEN_TABLE (VEX_LEN_D5_P_2) },
3755 { "(bad)", { XX } },
3756 },
3757
3758 /* PREFIX_VEX_D6 */
3759 {
3760 { "(bad)", { XX } },
3761 { "(bad)", { XX } },
3762 { VEX_LEN_TABLE (VEX_LEN_D6_P_2) },
3763 { "(bad)", { XX } },
3764 },
3765
3766 /* PREFIX_VEX_D7 */
3767 {
3768 { "(bad)", { XX } },
3769 { "(bad)", { XX } },
3770 { MOD_TABLE (MOD_VEX_D7_PREFIX_2) },
3771 { "(bad)", { XX } },
3772 },
3773
3774 /* PREFIX_VEX_D8 */
3775 {
3776 { "(bad)", { XX } },
3777 { "(bad)", { XX } },
3778 { VEX_LEN_TABLE (VEX_LEN_D8_P_2) },
3779 { "(bad)", { XX } },
3780 },
3781
3782 /* PREFIX_VEX_D9 */
3783 {
3784 { "(bad)", { XX } },
3785 { "(bad)", { XX } },
3786 { VEX_LEN_TABLE (VEX_LEN_D9_P_2) },
3787 { "(bad)", { XX } },
3788 },
3789
3790 /* PREFIX_VEX_DA */
3791 {
3792 { "(bad)", { XX } },
3793 { "(bad)", { XX } },
3794 { VEX_LEN_TABLE (VEX_LEN_DA_P_2) },
3795 { "(bad)", { XX } },
3796 },
3797
3798 /* PREFIX_VEX_DB */
3799 {
3800 { "(bad)", { XX } },
3801 { "(bad)", { XX } },
3802 { VEX_LEN_TABLE (VEX_LEN_DB_P_2) },
3803 { "(bad)", { XX } },
3804 },
3805
3806 /* PREFIX_VEX_DC */
3807 {
3808 { "(bad)", { XX } },
3809 { "(bad)", { XX } },
3810 { VEX_LEN_TABLE (VEX_LEN_DC_P_2) },
3811 { "(bad)", { XX } },
3812 },
3813
3814 /* PREFIX_VEX_DD */
3815 {
3816 { "(bad)", { XX } },
3817 { "(bad)", { XX } },
3818 { VEX_LEN_TABLE (VEX_LEN_DD_P_2) },
3819 { "(bad)", { XX } },
3820 },
3821
3822 /* PREFIX_VEX_DE */
3823 {
3824 { "(bad)", { XX } },
3825 { "(bad)", { XX } },
3826 { VEX_LEN_TABLE (VEX_LEN_DE_P_2) },
3827 { "(bad)", { XX } },
3828 },
3829
3830 /* PREFIX_VEX_DF */
3831 {
3832 { "(bad)", { XX } },
3833 { "(bad)", { XX } },
3834 { VEX_LEN_TABLE (VEX_LEN_DF_P_2) },
3835 { "(bad)", { XX } },
3836 },
3837
3838 /* PREFIX_VEX_E0 */
3839 {
3840 { "(bad)", { XX } },
3841 { "(bad)", { XX } },
3842 { VEX_LEN_TABLE (VEX_LEN_E0_P_2) },
3843 { "(bad)", { XX } },
3844 },
3845
3846 /* PREFIX_VEX_E1 */
3847 {
3848 { "(bad)", { XX } },
3849 { "(bad)", { XX } },
3850 { VEX_LEN_TABLE (VEX_LEN_E1_P_2) },
3851 { "(bad)", { XX } },
3852 },
3853
3854 /* PREFIX_VEX_E2 */
3855 {
3856 { "(bad)", { XX } },
3857 { "(bad)", { XX } },
3858 { VEX_LEN_TABLE (VEX_LEN_E2_P_2) },
3859 { "(bad)", { XX } },
3860 },
3861
3862 /* PREFIX_VEX_E3 */
3863 {
3864 { "(bad)", { XX } },
3865 { "(bad)", { XX } },
3866 { VEX_LEN_TABLE (VEX_LEN_E3_P_2) },
3867 { "(bad)", { XX } },
3868 },
3869
3870 /* PREFIX_VEX_E4 */
3871 {
3872 { "(bad)", { XX } },
3873 { "(bad)", { XX } },
3874 { VEX_LEN_TABLE (VEX_LEN_E4_P_2) },
3875 { "(bad)", { XX } },
3876 },
3877
3878 /* PREFIX_VEX_E5 */
3879 {
3880 { "(bad)", { XX } },
3881 { "(bad)", { XX } },
3882 { VEX_LEN_TABLE (VEX_LEN_E5_P_2) },
3883 { "(bad)", { XX } },
3884 },
3885
3886 /* PREFIX_VEX_E6 */
3887 {
3888 { "(bad)", { XX } },
3889 { "vcvtdq2pd", { XM, EXxmmq } },
3890 { "vcvttpd2dq%XY", { XMM, EXx } },
3891 { "vcvtpd2dq%XY", { XMM, EXx } },
3892 },
3893
3894 /* PREFIX_VEX_E7 */
3895 {
3896 { "(bad)", { XX } },
3897 { "(bad)", { XX } },
3898 { MOD_TABLE (MOD_VEX_E7_PREFIX_2) },
3899 { "(bad)", { XX } },
3900 },
3901
3902 /* PREFIX_VEX_E8 */
3903 {
3904 { "(bad)", { XX } },
3905 { "(bad)", { XX } },
3906 { VEX_LEN_TABLE (VEX_LEN_E8_P_2) },
3907 { "(bad)", { XX } },
3908 },
3909
3910 /* PREFIX_VEX_E9 */
3911 {
3912 { "(bad)", { XX } },
3913 { "(bad)", { XX } },
3914 { VEX_LEN_TABLE (VEX_LEN_E9_P_2) },
3915 { "(bad)", { XX } },
3916 },
3917
3918 /* PREFIX_VEX_EA */
3919 {
3920 { "(bad)", { XX } },
3921 { "(bad)", { XX } },
3922 { VEX_LEN_TABLE (VEX_LEN_EA_P_2) },
3923 { "(bad)", { XX } },
3924 },
3925
3926 /* PREFIX_VEX_EB */
3927 {
3928 { "(bad)", { XX } },
3929 { "(bad)", { XX } },
3930 { VEX_LEN_TABLE (VEX_LEN_EB_P_2) },
3931 { "(bad)", { XX } },
3932 },
3933
3934 /* PREFIX_VEX_EC */
3935 {
3936 { "(bad)", { XX } },
3937 { "(bad)", { XX } },
3938 { VEX_LEN_TABLE (VEX_LEN_EC_P_2) },
3939 { "(bad)", { XX } },
3940 },
3941
3942 /* PREFIX_VEX_ED */
3943 {
3944 { "(bad)", { XX } },
3945 { "(bad)", { XX } },
3946 { VEX_LEN_TABLE (VEX_LEN_ED_P_2) },
3947 { "(bad)", { XX } },
3948 },
3949
3950 /* PREFIX_VEX_EE */
3951 {
3952 { "(bad)", { XX } },
3953 { "(bad)", { XX } },
3954 { VEX_LEN_TABLE (VEX_LEN_EE_P_2) },
3955 { "(bad)", { XX } },
3956 },
3957
3958 /* PREFIX_VEX_EF */
3959 {
3960 { "(bad)", { XX } },
3961 { "(bad)", { XX } },
3962 { VEX_LEN_TABLE (VEX_LEN_EF_P_2) },
3963 { "(bad)", { XX } },
3964 },
3965
3966 /* PREFIX_VEX_F0 */
3967 {
3968 { "(bad)", { XX } },
3969 { "(bad)", { XX } },
3970 { "(bad)", { XX } },
3971 { MOD_TABLE (MOD_VEX_F0_PREFIX_3) },
3972 },
3973
3974 /* PREFIX_VEX_F1 */
3975 {
3976 { "(bad)", { XX } },
3977 { "(bad)", { XX } },
3978 { VEX_LEN_TABLE (VEX_LEN_F1_P_2) },
3979 { "(bad)", { XX } },
3980 },
3981
3982 /* PREFIX_VEX_F2 */
3983 {
3984 { "(bad)", { XX } },
3985 { "(bad)", { XX } },
3986 { VEX_LEN_TABLE (VEX_LEN_F2_P_2) },
3987 { "(bad)", { XX } },
3988 },
3989
3990 /* PREFIX_VEX_F3 */
3991 {
3992 { "(bad)", { XX } },
3993 { "(bad)", { XX } },
3994 { VEX_LEN_TABLE (VEX_LEN_F3_P_2) },
3995 { "(bad)", { XX } },
3996 },
3997
3998 /* PREFIX_VEX_F4 */
3999 {
4000 { "(bad)", { XX } },
4001 { "(bad)", { XX } },
4002 { VEX_LEN_TABLE (VEX_LEN_F4_P_2) },
4003 { "(bad)", { XX } },
4004 },
4005
4006 /* PREFIX_VEX_F5 */
4007 {
4008 { "(bad)", { XX } },
4009 { "(bad)", { XX } },
4010 { VEX_LEN_TABLE (VEX_LEN_F5_P_2) },
4011 { "(bad)", { XX } },
4012 },
4013
4014 /* PREFIX_VEX_F6 */
4015 {
4016 { "(bad)", { XX } },
4017 { "(bad)", { XX } },
4018 { VEX_LEN_TABLE (VEX_LEN_F6_P_2) },
4019 { "(bad)", { XX } },
4020 },
4021
4022 /* PREFIX_VEX_F7 */
4023 {
4024 { "(bad)", { XX } },
4025 { "(bad)", { XX } },
4026 { VEX_LEN_TABLE (VEX_LEN_F7_P_2) },
4027 { "(bad)", { XX } },
4028 },
4029
4030 /* PREFIX_VEX_F8 */
4031 {
4032 { "(bad)", { XX } },
4033 { "(bad)", { XX } },
4034 { VEX_LEN_TABLE (VEX_LEN_F8_P_2) },
4035 { "(bad)", { XX } },
4036 },
4037
4038 /* PREFIX_VEX_F9 */
4039 {
4040 { "(bad)", { XX } },
4041 { "(bad)", { XX } },
4042 { VEX_LEN_TABLE (VEX_LEN_F9_P_2) },
4043 { "(bad)", { XX } },
4044 },
4045
4046 /* PREFIX_VEX_FA */
4047 {
4048 { "(bad)", { XX } },
4049 { "(bad)", { XX } },
4050 { VEX_LEN_TABLE (VEX_LEN_FA_P_2) },
4051 { "(bad)", { XX } },
4052 },
4053
4054 /* PREFIX_VEX_FB */
4055 {
4056 { "(bad)", { XX } },
4057 { "(bad)", { XX } },
4058 { VEX_LEN_TABLE (VEX_LEN_FB_P_2) },
4059 { "(bad)", { XX } },
4060 },
4061
4062 /* PREFIX_VEX_FC */
4063 {
4064 { "(bad)", { XX } },
4065 { "(bad)", { XX } },
4066 { VEX_LEN_TABLE (VEX_LEN_FC_P_2) },
4067 { "(bad)", { XX } },
4068 },
4069
4070 /* PREFIX_VEX_FD */
4071 {
4072 { "(bad)", { XX } },
4073 { "(bad)", { XX } },
4074 { VEX_LEN_TABLE (VEX_LEN_FD_P_2) },
4075 { "(bad)", { XX } },
4076 },
4077
4078 /* PREFIX_VEX_FE */
4079 {
4080 { "(bad)", { XX } },
4081 { "(bad)", { XX } },
4082 { VEX_LEN_TABLE (VEX_LEN_FE_P_2) },
4083 { "(bad)", { XX } },
4084 },
4085
4086 /* PREFIX_VEX_3800 */
4087 {
4088 { "(bad)", { XX } },
4089 { "(bad)", { XX } },
4090 { VEX_LEN_TABLE (VEX_LEN_3800_P_2) },
4091 { "(bad)", { XX } },
4092 },
4093
4094 /* PREFIX_VEX_3801 */
4095 {
4096 { "(bad)", { XX } },
4097 { "(bad)", { XX } },
4098 { VEX_LEN_TABLE (VEX_LEN_3801_P_2) },
4099 { "(bad)", { XX } },
4100 },
4101
4102 /* PREFIX_VEX_3802 */
4103 {
4104 { "(bad)", { XX } },
4105 { "(bad)", { XX } },
4106 { VEX_LEN_TABLE (VEX_LEN_3802_P_2) },
4107 { "(bad)", { XX } },
4108 },
4109
4110 /* PREFIX_VEX_3803 */
4111 {
4112 { "(bad)", { XX } },
4113 { "(bad)", { XX } },
4114 { VEX_LEN_TABLE (VEX_LEN_3803_P_2) },
4115 { "(bad)", { XX } },
4116 },
4117
4118 /* PREFIX_VEX_3804 */
4119 {
4120 { "(bad)", { XX } },
4121 { "(bad)", { XX } },
4122 { VEX_LEN_TABLE (VEX_LEN_3804_P_2) },
4123 { "(bad)", { XX } },
4124 },
4125
4126 /* PREFIX_VEX_3805 */
4127 {
4128 { "(bad)", { XX } },
4129 { "(bad)", { XX } },
4130 { VEX_LEN_TABLE (VEX_LEN_3805_P_2) },
4131 { "(bad)", { XX } },
4132 },
4133
4134 /* PREFIX_VEX_3806 */
4135 {
4136 { "(bad)", { XX } },
4137 { "(bad)", { XX } },
4138 { VEX_LEN_TABLE (VEX_LEN_3806_P_2) },
4139 { "(bad)", { XX } },
4140 },
4141
4142 /* PREFIX_VEX_3807 */
4143 {
4144 { "(bad)", { XX } },
4145 { "(bad)", { XX } },
4146 { VEX_LEN_TABLE (VEX_LEN_3807_P_2) },
4147 { "(bad)", { XX } },
4148 },
4149
4150 /* PREFIX_VEX_3808 */
4151 {
4152 { "(bad)", { XX } },
4153 { "(bad)", { XX } },
4154 { VEX_LEN_TABLE (VEX_LEN_3808_P_2) },
4155 { "(bad)", { XX } },
4156 },
4157
4158 /* PREFIX_VEX_3809 */
4159 {
4160 { "(bad)", { XX } },
4161 { "(bad)", { XX } },
4162 { VEX_LEN_TABLE (VEX_LEN_3809_P_2) },
4163 { "(bad)", { XX } },
4164 },
4165
4166 /* PREFIX_VEX_380A */
4167 {
4168 { "(bad)", { XX } },
4169 { "(bad)", { XX } },
4170 { VEX_LEN_TABLE (VEX_LEN_380A_P_2) },
4171 { "(bad)", { XX } },
4172 },
4173
4174 /* PREFIX_VEX_380B */
4175 {
4176 { "(bad)", { XX } },
4177 { "(bad)", { XX } },
4178 { VEX_LEN_TABLE (VEX_LEN_380B_P_2) },
4179 { "(bad)", { XX } },
4180 },
4181
4182 /* PREFIX_VEX_380C */
4183 {
4184 { "(bad)", { XX } },
4185 { "(bad)", { XX } },
4186 { "vpermilps", { XM, Vex, EXx } },
4187 { "(bad)", { XX } },
4188 },
4189
4190 /* PREFIX_VEX_380D */
4191 {
4192 { "(bad)", { XX } },
4193 { "(bad)", { XX } },
4194 { "vpermilpd", { XM, Vex, EXx } },
4195 { "(bad)", { XX } },
4196 },
4197
4198 /* PREFIX_VEX_380E */
4199 {
4200 { "(bad)", { XX } },
4201 { "(bad)", { XX } },
4202 { "vtestps", { XM, EXx } },
4203 { "(bad)", { XX } },
4204 },
4205
4206 /* PREFIX_VEX_380F */
4207 {
4208 { "(bad)", { XX } },
4209 { "(bad)", { XX } },
4210 { "vtestpd", { XM, EXx } },
4211 { "(bad)", { XX } },
4212 },
4213
4214 /* PREFIX_VEX_3817 */
4215 {
4216 { "(bad)", { XX } },
4217 { "(bad)", { XX } },
4218 { "vptest", { XM, EXx } },
4219 { "(bad)", { XX } },
4220 },
4221
4222 /* PREFIX_VEX_3818 */
4223 {
4224 { "(bad)", { XX } },
4225 { "(bad)", { XX } },
4226 { MOD_TABLE (MOD_VEX_3818_PREFIX_2) },
4227 { "(bad)", { XX } },
4228 },
4229
4230 /* PREFIX_VEX_3819 */
4231 {
4232 { "(bad)", { XX } },
4233 { "(bad)", { XX } },
4234 { MOD_TABLE (MOD_VEX_3819_PREFIX_2) },
4235 { "(bad)", { XX } },
4236 },
4237
4238 /* PREFIX_VEX_381A */
4239 {
4240 { "(bad)", { XX } },
4241 { "(bad)", { XX } },
4242 { MOD_TABLE (MOD_VEX_381A_PREFIX_2) },
4243 { "(bad)", { XX } },
4244 },
4245
4246 /* PREFIX_VEX_381C */
4247 {
4248 { "(bad)", { XX } },
4249 { "(bad)", { XX } },
4250 { VEX_LEN_TABLE (VEX_LEN_381C_P_2) },
4251 { "(bad)", { XX } },
4252 },
4253
4254 /* PREFIX_VEX_381D */
4255 {
4256 { "(bad)", { XX } },
4257 { "(bad)", { XX } },
4258 { VEX_LEN_TABLE (VEX_LEN_381D_P_2) },
4259 { "(bad)", { XX } },
4260 },
4261
4262 /* PREFIX_VEX_381E */
4263 {
4264 { "(bad)", { XX } },
4265 { "(bad)", { XX } },
4266 { VEX_LEN_TABLE (VEX_LEN_381E_P_2) },
4267 { "(bad)", { XX } },
4268 },
4269
4270 /* PREFIX_VEX_3820 */
4271 {
4272 { "(bad)", { XX } },
4273 { "(bad)", { XX } },
4274 { VEX_LEN_TABLE (VEX_LEN_3820_P_2) },
4275 { "(bad)", { XX } },
4276 },
4277
4278 /* PREFIX_VEX_3821 */
4279 {
4280 { "(bad)", { XX } },
4281 { "(bad)", { XX } },
4282 { VEX_LEN_TABLE (VEX_LEN_3821_P_2) },
4283 { "(bad)", { XX } },
4284 },
4285
4286 /* PREFIX_VEX_3822 */
4287 {
4288 { "(bad)", { XX } },
4289 { "(bad)", { XX } },
4290 { VEX_LEN_TABLE (VEX_LEN_3822_P_2) },
4291 { "(bad)", { XX } },
4292 },
4293
4294 /* PREFIX_VEX_3823 */
4295 {
4296 { "(bad)", { XX } },
4297 { "(bad)", { XX } },
4298 { VEX_LEN_TABLE (VEX_LEN_3823_P_2) },
4299 { "(bad)", { XX } },
4300 },
4301
4302 /* PREFIX_VEX_3824 */
4303 {
4304 { "(bad)", { XX } },
4305 { "(bad)", { XX } },
4306 { VEX_LEN_TABLE (VEX_LEN_3824_P_2) },
4307 { "(bad)", { XX } },
4308 },
4309
4310 /* PREFIX_VEX_3825 */
4311 {
4312 { "(bad)", { XX } },
4313 { "(bad)", { XX } },
4314 { VEX_LEN_TABLE (VEX_LEN_3825_P_2) },
4315 { "(bad)", { XX } },
4316 },
4317
4318 /* PREFIX_VEX_3828 */
4319 {
4320 { "(bad)", { XX } },
4321 { "(bad)", { XX } },
4322 { VEX_LEN_TABLE (VEX_LEN_3828_P_2) },
4323 { "(bad)", { XX } },
4324 },
4325
4326 /* PREFIX_VEX_3829 */
4327 {
4328 { "(bad)", { XX } },
4329 { "(bad)", { XX } },
4330 { VEX_LEN_TABLE (VEX_LEN_3829_P_2) },
4331 { "(bad)", { XX } },
4332 },
4333
4334 /* PREFIX_VEX_382A */
4335 {
4336 { "(bad)", { XX } },
4337 { "(bad)", { XX } },
4338 { MOD_TABLE (MOD_VEX_382A_PREFIX_2) },
4339 { "(bad)", { XX } },
4340 },
4341
4342 /* PREFIX_VEX_382B */
4343 {
4344 { "(bad)", { XX } },
4345 { "(bad)", { XX } },
4346 { VEX_LEN_TABLE (VEX_LEN_382B_P_2) },
4347 { "(bad)", { XX } },
4348 },
4349
4350 /* PREFIX_VEX_382C */
4351 {
4352 { "(bad)", { XX } },
4353 { "(bad)", { XX } },
4354 { MOD_TABLE (MOD_VEX_382C_PREFIX_2) },
4355 { "(bad)", { XX } },
4356 },
4357
4358 /* PREFIX_VEX_382D */
4359 {
4360 { "(bad)", { XX } },
4361 { "(bad)", { XX } },
4362 { MOD_TABLE (MOD_VEX_382D_PREFIX_2) },
4363 { "(bad)", { XX } },
4364 },
4365
4366 /* PREFIX_VEX_382E */
4367 {
4368 { "(bad)", { XX } },
4369 { "(bad)", { XX } },
4370 { MOD_TABLE (MOD_VEX_382E_PREFIX_2) },
4371 { "(bad)", { XX } },
4372 },
4373
4374 /* PREFIX_VEX_382F */
4375 {
4376 { "(bad)", { XX } },
4377 { "(bad)", { XX } },
4378 { MOD_TABLE (MOD_VEX_382F_PREFIX_2) },
4379 { "(bad)", { XX } },
4380 },
4381
4382 /* PREFIX_VEX_3830 */
4383 {
4384 { "(bad)", { XX } },
4385 { "(bad)", { XX } },
4386 { VEX_LEN_TABLE (VEX_LEN_3830_P_2) },
4387 { "(bad)", { XX } },
4388 },
4389
4390 /* PREFIX_VEX_3831 */
4391 {
4392 { "(bad)", { XX } },
4393 { "(bad)", { XX } },
4394 { VEX_LEN_TABLE (VEX_LEN_3831_P_2) },
4395 { "(bad)", { XX } },
4396 },
4397
4398 /* PREFIX_VEX_3832 */
4399 {
4400 { "(bad)", { XX } },
4401 { "(bad)", { XX } },
4402 { VEX_LEN_TABLE (VEX_LEN_3832_P_2) },
4403 { "(bad)", { XX } },
4404 },
4405
4406 /* PREFIX_VEX_3833 */
4407 {
4408 { "(bad)", { XX } },
4409 { "(bad)", { XX } },
4410 { VEX_LEN_TABLE (VEX_LEN_3833_P_2) },
4411 { "(bad)", { XX } },
4412 },
4413
4414 /* PREFIX_VEX_3834 */
4415 {
4416 { "(bad)", { XX } },
4417 { "(bad)", { XX } },
4418 { VEX_LEN_TABLE (VEX_LEN_3834_P_2) },
4419 { "(bad)", { XX } },
4420 },
4421
4422 /* PREFIX_VEX_3835 */
4423 {
4424 { "(bad)", { XX } },
4425 { "(bad)", { XX } },
4426 { VEX_LEN_TABLE (VEX_LEN_3835_P_2) },
4427 { "(bad)", { XX } },
4428 },
4429
4430 /* PREFIX_VEX_3837 */
4431 {
4432 { "(bad)", { XX } },
4433 { "(bad)", { XX } },
4434 { VEX_LEN_TABLE (VEX_LEN_3837_P_2) },
4435 { "(bad)", { XX } },
4436 },
4437
4438 /* PREFIX_VEX_3838 */
4439 {
4440 { "(bad)", { XX } },
4441 { "(bad)", { XX } },
4442 { VEX_LEN_TABLE (VEX_LEN_3838_P_2) },
4443 { "(bad)", { XX } },
4444 },
4445
4446 /* PREFIX_VEX_3839 */
4447 {
4448 { "(bad)", { XX } },
4449 { "(bad)", { XX } },
4450 { VEX_LEN_TABLE (VEX_LEN_3839_P_2) },
4451 { "(bad)", { XX } },
4452 },
4453
4454 /* PREFIX_VEX_383A */
4455 {
4456 { "(bad)", { XX } },
4457 { "(bad)", { XX } },
4458 { VEX_LEN_TABLE (VEX_LEN_383A_P_2) },
4459 { "(bad)", { XX } },
4460 },
4461
4462 /* PREFIX_VEX_383B */
4463 {
4464 { "(bad)", { XX } },
4465 { "(bad)", { XX } },
4466 { VEX_LEN_TABLE (VEX_LEN_383B_P_2) },
4467 { "(bad)", { XX } },
4468 },
4469
4470 /* PREFIX_VEX_383C */
4471 {
4472 { "(bad)", { XX } },
4473 { "(bad)", { XX } },
4474 { VEX_LEN_TABLE (VEX_LEN_383C_P_2) },
4475 { "(bad)", { XX } },
4476 },
4477
4478 /* PREFIX_VEX_383D */
4479 {
4480 { "(bad)", { XX } },
4481 { "(bad)", { XX } },
4482 { VEX_LEN_TABLE (VEX_LEN_383D_P_2) },
4483 { "(bad)", { XX } },
4484 },
4485
4486 /* PREFIX_VEX_383E */
4487 {
4488 { "(bad)", { XX } },
4489 { "(bad)", { XX } },
4490 { VEX_LEN_TABLE (VEX_LEN_383E_P_2) },
4491 { "(bad)", { XX } },
4492 },
4493
4494 /* PREFIX_VEX_383F */
4495 {
4496 { "(bad)", { XX } },
4497 { "(bad)", { XX } },
4498 { VEX_LEN_TABLE (VEX_LEN_383F_P_2) },
4499 { "(bad)", { XX } },
4500 },
4501
4502 /* PREFIX_VEX_3840 */
4503 {
4504 { "(bad)", { XX } },
4505 { "(bad)", { XX } },
4506 { VEX_LEN_TABLE (VEX_LEN_3840_P_2) },
4507 { "(bad)", { XX } },
4508 },
4509
4510 /* PREFIX_VEX_3841 */
4511 {
4512 { "(bad)", { XX } },
4513 { "(bad)", { XX } },
4514 { VEX_LEN_TABLE (VEX_LEN_3841_P_2) },
4515 { "(bad)", { XX } },
4516 },
4517
4518 /* PREFIX_VEX_3A04 */
4519 {
4520 { "(bad)", { XX } },
4521 { "(bad)", { XX } },
4522 { "vpermilps", { XM, EXx, Ib } },
4523 { "(bad)", { XX } },
4524 },
4525
4526 /* PREFIX_VEX_3A05 */
4527 {
4528 { "(bad)", { XX } },
4529 { "(bad)", { XX } },
4530 { "vpermilpd", { XM, EXx, Ib } },
4531 { "(bad)", { XX } },
4532 },
4533
4534 /* PREFIX_VEX_3A06 */
4535 {
4536 { "(bad)", { XX } },
4537 { "(bad)", { XX } },
4538 { VEX_LEN_TABLE (VEX_LEN_3A06_P_2) },
4539 { "(bad)", { XX } },
4540 },
4541
4542 /* PREFIX_VEX_3A08 */
4543 {
4544 { "(bad)", { XX } },
4545 { "(bad)", { XX } },
4546 { "vroundps", { XM, EXx, Ib } },
4547 { "(bad)", { XX } },
4548 },
4549
4550 /* PREFIX_VEX_3A09 */
4551 {
4552 { "(bad)", { XX } },
4553 { "(bad)", { XX } },
4554 { "vroundpd", { XM, EXx, Ib } },
4555 { "(bad)", { XX } },
4556 },
4557
4558 /* PREFIX_VEX_3A0A */
4559 {
4560 { "(bad)", { XX } },
4561 { "(bad)", { XX } },
4562 { VEX_LEN_TABLE (VEX_LEN_3A0A_P_2) },
4563 { "(bad)", { XX } },
4564 },
4565
4566 /* PREFIX_VEX_3A0B */
4567 {
4568 { "(bad)", { XX } },
4569 { "(bad)", { XX } },
4570 { VEX_LEN_TABLE (VEX_LEN_3A0B_P_2) },
4571 { "(bad)", { XX } },
4572 },
4573
4574 /* PREFIX_VEX_3A0C */
4575 {
4576 { "(bad)", { XX } },
4577 { "(bad)", { XX } },
4578 { "vblendps", { XM, Vex, EXx, Ib } },
4579 { "(bad)", { XX } },
4580 },
4581
4582 /* PREFIX_VEX_3A0D */
4583 {
4584 { "(bad)", { XX } },
4585 { "(bad)", { XX } },
4586 { "vblendpd", { XM, Vex, EXx, Ib } },
4587 { "(bad)", { XX } },
4588 },
4589
4590 /* PREFIX_VEX_3A0E */
4591 {
4592 { "(bad)", { XX } },
4593 { "(bad)", { XX } },
4594 { VEX_LEN_TABLE (VEX_LEN_3A0E_P_2) },
4595 { "(bad)", { XX } },
4596 },
4597
4598 /* PREFIX_VEX_3A0F */
4599 {
4600 { "(bad)", { XX } },
4601 { "(bad)", { XX } },
4602 { VEX_LEN_TABLE (VEX_LEN_3A0F_P_2) },
4603 { "(bad)", { XX } },
4604 },
4605
4606 /* PREFIX_VEX_3A14 */
4607 {
4608 { "(bad)", { XX } },
4609 { "(bad)", { XX } },
4610 { VEX_LEN_TABLE (VEX_LEN_3A14_P_2) },
4611 { "(bad)", { XX } },
4612 },
4613
4614 /* PREFIX_VEX_3A15 */
4615 {
4616 { "(bad)", { XX } },
4617 { "(bad)", { XX } },
4618 { VEX_LEN_TABLE (VEX_LEN_3A15_P_2) },
4619 { "(bad)", { XX } },
4620 },
4621
4622 /* PREFIX_VEX_3A16 */
4623 {
4624 { "(bad)", { XX } },
4625 { "(bad)", { XX } },
4626 { VEX_LEN_TABLE (VEX_LEN_3A16_P_2) },
4627 { "(bad)", { XX } },
4628 },
4629
4630 /* PREFIX_VEX_3A17 */
4631 {
4632 { "(bad)", { XX } },
4633 { "(bad)", { XX } },
4634 { VEX_LEN_TABLE (VEX_LEN_3A17_P_2) },
4635 { "(bad)", { XX } },
4636 },
4637
4638 /* PREFIX_VEX_3A18 */
4639 {
4640 { "(bad)", { XX } },
4641 { "(bad)", { XX } },
4642 { VEX_LEN_TABLE (VEX_LEN_3A18_P_2) },
4643 { "(bad)", { XX } },
4644 },
4645
4646 /* PREFIX_VEX_3A19 */
4647 {
4648 { "(bad)", { XX } },
4649 { "(bad)", { XX } },
4650 { VEX_LEN_TABLE (VEX_LEN_3A19_P_2) },
4651 { "(bad)", { XX } },
4652 },
4653
4654 /* PREFIX_VEX_3A20 */
4655 {
4656 { "(bad)", { XX } },
4657 { "(bad)", { XX } },
4658 { VEX_LEN_TABLE (VEX_LEN_3A20_P_2) },
4659 { "(bad)", { XX } },
4660 },
4661
4662 /* PREFIX_VEX_3A21 */
4663 {
4664 { "(bad)", { XX } },
4665 { "(bad)", { XX } },
4666 { VEX_LEN_TABLE (VEX_LEN_3A21_P_2) },
4667 { "(bad)", { XX } },
4668 },
4669
4670 /* PREFIX_VEX_3A22 */
4671 {
4672 { "(bad)", { XX } },
4673 { "(bad)", { XX } },
4674 { VEX_LEN_TABLE (VEX_LEN_3A22_P_2) },
4675 { "(bad)", { XX } },
4676 },
4677
4678 /* PREFIX_VEX_3A40 */
4679 {
4680 { "(bad)", { XX } },
4681 { "(bad)", { XX } },
4682 { "vdpps", { XM, Vex, EXx, Ib } },
4683 { "(bad)", { XX } },
4684 },
4685
4686 /* PREFIX_VEX_3A41 */
4687 {
4688 { "(bad)", { XX } },
4689 { "(bad)", { XX } },
4690 { VEX_LEN_TABLE (VEX_LEN_3A41_P_2) },
4691 { "(bad)", { XX } },
4692 },
4693
4694 /* PREFIX_VEX_3A42 */
4695 {
4696 { "(bad)", { XX } },
4697 { "(bad)", { XX } },
4698 { VEX_LEN_TABLE (VEX_LEN_3A42_P_2) },
4699 { "(bad)", { XX } },
4700 },
4701
4702 /* PREFIX_VEX_3A48 */
4703 {
4704 { "(bad)", { XX } },
4705 { "(bad)", { XX } },
4706 { "vpermil2ps", { XMVexW, Vex, EXVexImmW, EXVexImmW, VPERMIL2 } },
4707 { "(bad)", { XX } },
4708 },
4709
4710 /* PREFIX_VEX_3A49 */
4711 {
4712 { "(bad)", { XX } },
4713 { "(bad)", { XX } },
4714 { "vpermil2pd", { XMVexW, Vex, EXVexImmW, EXVexImmW, VPERMIL2 } },
4715 { "(bad)", { XX } },
4716 },
4717
4718 /* PREFIX_VEX_3A4A */
4719 {
4720 { "(bad)", { XX } },
4721 { "(bad)", { XX } },
4722 { "vblendvps", { XM, Vex, EXx, XMVexI4 } },
4723 { "(bad)", { XX } },
4724 },
4725
4726 /* PREFIX_VEX_3A4B */
4727 {
4728 { "(bad)", { XX } },
4729 { "(bad)", { XX } },
4730 { "vblendvpd", { XM, Vex, EXx, XMVexI4 } },
4731 { "(bad)", { XX } },
4732 },
4733
4734 /* PREFIX_VEX_3A4C */
4735 {
4736 { "(bad)", { XX } },
4737 { "(bad)", { XX } },
4738 { VEX_LEN_TABLE (VEX_LEN_3A4C_P_2) },
4739 { "(bad)", { XX } },
4740 },
4741
4742 /* PREFIX_VEX_3A5C */
4743 {
4744 { "(bad)", { XX } },
4745 { "(bad)", { XX } },
4746 { "vfmaddsubps", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
4747 { "(bad)", { XX } },
4748 },
4749
4750 /* PREFIX_VEX_3A5D */
4751 {
4752 { "(bad)", { XX } },
4753 { "(bad)", { XX } },
4754 { "vfmaddsubpd", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
4755 { "(bad)", { XX } },
4756 },
4757
4758 /* PREFIX_VEX_3A5E */
4759 {
4760 { "(bad)", { XX } },
4761 { "(bad)", { XX } },
4762 { "vfmsubaddps", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
4763 { "(bad)", { XX } },
4764 },
4765
4766 /* PREFIX_VEX_3A5F */
4767 {
4768 { "(bad)", { XX } },
4769 { "(bad)", { XX } },
4770 { "vfmsubaddpd", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
4771 { "(bad)", { XX } },
4772 },
4773
4774 /* PREFIX_VEX_3A60 */
4775 {
4776 { "(bad)", { XX } },
4777 { "(bad)", { XX } },
4778 { VEX_LEN_TABLE (VEX_LEN_3A60_P_2) },
4779 { "(bad)", { XX } },
4780 },
4781
4782 /* PREFIX_VEX_3A61 */
4783 {
4784 { "(bad)", { XX } },
4785 { "(bad)", { XX } },
4786 { VEX_LEN_TABLE (VEX_LEN_3A61_P_2) },
4787 { "(bad)", { XX } },
4788 },
4789
4790 /* PREFIX_VEX_3A62 */
4791 {
4792 { "(bad)", { XX } },
4793 { "(bad)", { XX } },
4794 { VEX_LEN_TABLE (VEX_LEN_3A62_P_2) },
4795 { "(bad)", { XX } },
4796 },
4797
4798 /* PREFIX_VEX_3A63 */
4799 {
4800 { "(bad)", { XX } },
4801 { "(bad)", { XX } },
4802 { VEX_LEN_TABLE (VEX_LEN_3A63_P_2) },
4803 { "(bad)", { XX } },
4804 },
4805
4806 /* PREFIX_VEX_3A68 */
4807 {
4808 { "(bad)", { XX } },
4809 { "(bad)", { XX } },
4810 { "vfmaddps", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
4811 { "(bad)", { XX } },
4812 },
4813
4814 /* PREFIX_VEX_3A69 */
4815 {
4816 { "(bad)", { XX } },
4817 { "(bad)", { XX } },
4818 { "vfmaddpd", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
4819 { "(bad)", { XX } },
4820 },
4821
4822 /* PREFIX_VEX_3A6A */
4823 {
4824 { "(bad)", { XX } },
4825 { "(bad)", { XX } },
4826 { VEX_LEN_TABLE (VEX_LEN_3A6A_P_2) },
4827 { "(bad)", { XX } },
4828 },
4829
4830 /* PREFIX_VEX_3A6B */
4831 {
4832 { "(bad)", { XX } },
4833 { "(bad)", { XX } },
4834 { VEX_LEN_TABLE (VEX_LEN_3A6B_P_2) },
4835 { "(bad)", { XX } },
4836 },
4837
4838 /* PREFIX_VEX_3A6C */
4839 {
4840 { "(bad)", { XX } },
4841 { "(bad)", { XX } },
4842 { "vfmsubps", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
4843 { "(bad)", { XX } },
4844 },
4845
4846 /* PREFIX_VEX_3A6D */
4847 {
4848 { "(bad)", { XX } },
4849 { "(bad)", { XX } },
4850 { "vfmsubpd", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
4851 { "(bad)", { XX } },
4852 },
4853
4854 /* PREFIX_VEX_3A6E */
4855 {
4856 { "(bad)", { XX } },
4857 { "(bad)", { XX } },
4858 { VEX_LEN_TABLE (VEX_LEN_3A6E_P_2) },
4859 { "(bad)", { XX } },
4860 },
4861
4862 /* PREFIX_VEX_3A6F */
4863 {
4864 { "(bad)", { XX } },
4865 { "(bad)", { XX } },
4866 { VEX_LEN_TABLE (VEX_LEN_3A6F_P_2) },
4867 { "(bad)", { XX } },
4868 },
4869
4870 /* PREFIX_VEX_3A78 */
4871 {
4872 { "(bad)", { XX } },
4873 { "(bad)", { XX } },
4874 { "vfnmaddps", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
4875 { "(bad)", { XX } },
4876 },
4877
4878 /* PREFIX_VEX_3A79 */
4879 {
4880 { "(bad)", { XX } },
4881 { "(bad)", { XX } },
4882 { "vfnmaddpd", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
4883 { "(bad)", { XX } },
4884 },
4885
4886 /* PREFIX_VEX_3A7A */
4887 {
4888 { "(bad)", { XX } },
4889 { "(bad)", { XX } },
4890 { VEX_LEN_TABLE (VEX_LEN_3A7A_P_2) },
4891 { "(bad)", { XX } },
4892 },
4893
4894 /* PREFIX_VEX_3A7B */
4895 {
4896 { "(bad)", { XX } },
4897 { "(bad)", { XX } },
4898 { VEX_LEN_TABLE (VEX_LEN_3A7B_P_2) },
4899 { "(bad)", { XX } },
4900 },
4901
4902 /* PREFIX_VEX_3A7C */
4903 {
4904 { "(bad)", { XX } },
4905 { "(bad)", { XX } },
4906 { "vfnmsubps", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
4907 { "(bad)", { XX } },
4908 },
4909
4910 /* PREFIX_VEX_3A7D */
4911 {
4912 { "(bad)", { XX } },
4913 { "(bad)", { XX } },
4914 { "vfnmsubpd", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
4915 { "(bad)", { XX } },
4916 },
4917
4918 /* PREFIX_VEX_3A7E */
4919 {
4920 { "(bad)", { XX } },
4921 { "(bad)", { XX } },
4922 { VEX_LEN_TABLE (VEX_LEN_3A7E_P_2) },
4923 { "(bad)", { XX } },
4924 },
4925
4926 /* PREFIX_VEX_3A7F */
4927 {
4928 { "(bad)", { XX } },
4929 { "(bad)", { XX } },
4930 { VEX_LEN_TABLE (VEX_LEN_3A7F_P_2) },
4931 { "(bad)", { XX } },
4932 },
4933 };
4934
4935 static const struct dis386 x86_64_table[][2] = {
4936 /* X86_64_06 */
4937 {
4938 { "push{T|}", { es } },
4939 { "(bad)", { XX } },
4940 },
4941
4942 /* X86_64_07 */
4943 {
4944 { "pop{T|}", { es } },
4945 { "(bad)", { XX } },
4946 },
4947
4948 /* X86_64_0D */
4949 {
4950 { "push{T|}", { cs } },
4951 { "(bad)", { XX } },
4952 },
4953
4954 /* X86_64_16 */
4955 {
4956 { "push{T|}", { ss } },
4957 { "(bad)", { XX } },
4958 },
4959
4960 /* X86_64_17 */
4961 {
4962 { "pop{T|}", { ss } },
4963 { "(bad)", { XX } },
4964 },
4965
4966 /* X86_64_1E */
4967 {
4968 { "push{T|}", { ds } },
4969 { "(bad)", { XX } },
4970 },
4971
4972 /* X86_64_1F */
4973 {
4974 { "pop{T|}", { ds } },
4975 { "(bad)", { XX } },
4976 },
4977
4978 /* X86_64_27 */
4979 {
4980 { "daa", { XX } },
4981 { "(bad)", { XX } },
4982 },
4983
4984 /* X86_64_2F */
4985 {
4986 { "das", { XX } },
4987 { "(bad)", { XX } },
4988 },
4989
4990 /* X86_64_37 */
4991 {
4992 { "aaa", { XX } },
4993 { "(bad)", { XX } },
4994 },
4995
4996 /* X86_64_3F */
4997 {
4998 { "aas", { XX } },
4999 { "(bad)", { XX } },
5000 },
5001
5002 /* X86_64_60 */
5003 {
5004 { "pusha{P|}", { XX } },
5005 { "(bad)", { XX } },
5006 },
5007
5008 /* X86_64_61 */
5009 {
5010 { "popa{P|}", { XX } },
5011 { "(bad)", { XX } },
5012 },
5013
5014 /* X86_64_62 */
5015 {
5016 { MOD_TABLE (MOD_62_32BIT) },
5017 { "(bad)", { XX } },
5018 },
5019
5020 /* X86_64_63 */
5021 {
5022 { "arpl", { Ew, Gw } },
5023 { "movs{lq|xd}", { Gv, Ed } },
5024 },
5025
5026 /* X86_64_6D */
5027 {
5028 { "ins{R|}", { Yzr, indirDX } },
5029 { "ins{G|}", { Yzr, indirDX } },
5030 },
5031
5032 /* X86_64_6F */
5033 {
5034 { "outs{R|}", { indirDXr, Xz } },
5035 { "outs{G|}", { indirDXr, Xz } },
5036 },
5037
5038 /* X86_64_9A */
5039 {
5040 { "Jcall{T|}", { Ap } },
5041 { "(bad)", { XX } },
5042 },
5043
5044 /* X86_64_C4 */
5045 {
5046 { MOD_TABLE (MOD_C4_32BIT) },
5047 { VEX_C4_TABLE (VEX_0F) },
5048 },
5049
5050 /* X86_64_C5 */
5051 {
5052 { MOD_TABLE (MOD_C5_32BIT) },
5053 { VEX_C5_TABLE (VEX_0F) },
5054 },
5055
5056 /* X86_64_CE */
5057 {
5058 { "into", { XX } },
5059 { "(bad)", { XX } },
5060 },
5061
5062 /* X86_64_D4 */
5063 {
5064 { "aam", { sIb } },
5065 { "(bad)", { XX } },
5066 },
5067
5068 /* X86_64_D5 */
5069 {
5070 { "aad", { sIb } },
5071 { "(bad)", { XX } },
5072 },
5073
5074 /* X86_64_EA */
5075 {
5076 { "Jjmp{T|}", { Ap } },
5077 { "(bad)", { XX } },
5078 },
5079
5080 /* X86_64_0F01_REG_0 */
5081 {
5082 { "sgdt{Q|IQ}", { M } },
5083 { "sgdt", { M } },
5084 },
5085
5086 /* X86_64_0F01_REG_1 */
5087 {
5088 { "sidt{Q|IQ}", { M } },
5089 { "sidt", { M } },
5090 },
5091
5092 /* X86_64_0F01_REG_2 */
5093 {
5094 { "lgdt{Q|Q}", { M } },
5095 { "lgdt", { M } },
5096 },
5097
5098 /* X86_64_0F01_REG_3 */
5099 {
5100 { "lidt{Q|Q}", { M } },
5101 { "lidt", { M } },
5102 },
5103 };
5104
5105 static const struct dis386 three_byte_table[][256] = {
5106 /* THREE_BYTE_0F24 */
5107 {
5108 /* 00 */
5109 { "fmaddps", { { OP_DREX4, q_mode } } },
5110 { "fmaddpd", { { OP_DREX4, q_mode } } },
5111 { "fmaddss", { { OP_DREX4, w_mode } } },
5112 { "fmaddsd", { { OP_DREX4, d_mode } } },
5113 { "fmaddps", { { OP_DREX4, DREX_OC1 + q_mode } } },
5114 { "fmaddpd", { { OP_DREX4, DREX_OC1 + q_mode } } },
5115 { "fmaddss", { { OP_DREX4, DREX_OC1 + w_mode } } },
5116 { "fmaddsd", { { OP_DREX4, DREX_OC1 + d_mode } } },
5117 /* 08 */
5118 { "fmsubps", { { OP_DREX4, q_mode } } },
5119 { "fmsubpd", { { OP_DREX4, q_mode } } },
5120 { "fmsubss", { { OP_DREX4, w_mode } } },
5121 { "fmsubsd", { { OP_DREX4, d_mode } } },
5122 { "fmsubps", { { OP_DREX4, DREX_OC1 + q_mode } } },
5123 { "fmsubpd", { { OP_DREX4, DREX_OC1 + q_mode } } },
5124 { "fmsubss", { { OP_DREX4, DREX_OC1 + w_mode } } },
5125 { "fmsubsd", { { OP_DREX4, DREX_OC1 + d_mode } } },
5126 /* 10 */
5127 { "fnmaddps", { { OP_DREX4, q_mode } } },
5128 { "fnmaddpd", { { OP_DREX4, q_mode } } },
5129 { "fnmaddss", { { OP_DREX4, w_mode } } },
5130 { "fnmaddsd", { { OP_DREX4, d_mode } } },
5131 { "fnmaddps", { { OP_DREX4, DREX_OC1 + q_mode } } },
5132 { "fnmaddpd", { { OP_DREX4, DREX_OC1 + q_mode } } },
5133 { "fnmaddss", { { OP_DREX4, DREX_OC1 + w_mode } } },
5134 { "fnmaddsd", { { OP_DREX4, DREX_OC1 + d_mode } } },
5135 /* 18 */
5136 { "fnmsubps", { { OP_DREX4, q_mode } } },
5137 { "fnmsubpd", { { OP_DREX4, q_mode } } },
5138 { "fnmsubss", { { OP_DREX4, w_mode } } },
5139 { "fnmsubsd", { { OP_DREX4, d_mode } } },
5140 { "fnmsubps", { { OP_DREX4, DREX_OC1 + q_mode } } },
5141 { "fnmsubpd", { { OP_DREX4, DREX_OC1 + q_mode } } },
5142 { "fnmsubss", { { OP_DREX4, DREX_OC1 + w_mode } } },
5143 { "fnmsubsd", { { OP_DREX4, DREX_OC1 + d_mode } } },
5144 /* 20 */
5145 { "permps", { { OP_DREX4, q_mode } } },
5146 { "permpd", { { OP_DREX4, q_mode } } },
5147 { "pcmov", { { OP_DREX4, q_mode } } },
5148 { "pperm", { { OP_DREX4, q_mode } } },
5149 { "permps", { { OP_DREX4, DREX_OC1 + q_mode } } },
5150 { "permpd", { { OP_DREX4, DREX_OC1 + q_mode } } },
5151 { "pcmov", { { OP_DREX4, DREX_OC1 + w_mode } } },
5152 { "pperm", { { OP_DREX4, DREX_OC1 + d_mode } } },
5153 /* 28 */
5154 { "(bad)", { XX } },
5155 { "(bad)", { XX } },
5156 { "(bad)", { XX } },
5157 { "(bad)", { XX } },
5158 { "(bad)", { XX } },
5159 { "(bad)", { XX } },
5160 { "(bad)", { XX } },
5161 { "(bad)", { XX } },
5162 /* 30 */
5163 { "(bad)", { XX } },
5164 { "(bad)", { XX } },
5165 { "(bad)", { XX } },
5166 { "(bad)", { XX } },
5167 { "(bad)", { XX } },
5168 { "(bad)", { XX } },
5169 { "(bad)", { XX } },
5170 { "(bad)", { XX } },
5171 /* 38 */
5172 { "(bad)", { XX } },
5173 { "(bad)", { XX } },
5174 { "(bad)", { XX } },
5175 { "(bad)", { XX } },
5176 { "(bad)", { XX } },
5177 { "(bad)", { XX } },
5178 { "(bad)", { XX } },
5179 { "(bad)", { XX } },
5180 /* 40 */
5181 { "protb", { { OP_DREX3, q_mode } } },
5182 { "protw", { { OP_DREX3, q_mode } } },
5183 { "protd", { { OP_DREX3, q_mode } } },
5184 { "protq", { { OP_DREX3, q_mode } } },
5185 { "pshlb", { { OP_DREX3, q_mode } } },
5186 { "pshlw", { { OP_DREX3, q_mode } } },
5187 { "pshld", { { OP_DREX3, q_mode } } },
5188 { "pshlq", { { OP_DREX3, q_mode } } },
5189 /* 48 */
5190 { "pshab", { { OP_DREX3, q_mode } } },
5191 { "pshaw", { { OP_DREX3, q_mode } } },
5192 { "pshad", { { OP_DREX3, q_mode } } },
5193 { "pshaq", { { OP_DREX3, q_mode } } },
5194 { "(bad)", { XX } },
5195 { "(bad)", { XX } },
5196 { "(bad)", { XX } },
5197 { "(bad)", { XX } },
5198 /* 50 */
5199 { "(bad)", { XX } },
5200 { "(bad)", { XX } },
5201 { "(bad)", { XX } },
5202 { "(bad)", { XX } },
5203 { "(bad)", { XX } },
5204 { "(bad)", { XX } },
5205 { "(bad)", { XX } },
5206 { "(bad)", { XX } },
5207 /* 58 */
5208 { "(bad)", { XX } },
5209 { "(bad)", { XX } },
5210 { "(bad)", { XX } },
5211 { "(bad)", { XX } },
5212 { "(bad)", { XX } },
5213 { "(bad)", { XX } },
5214 { "(bad)", { XX } },
5215 { "(bad)", { XX } },
5216 /* 60 */
5217 { "(bad)", { XX } },
5218 { "(bad)", { XX } },
5219 { "(bad)", { XX } },
5220 { "(bad)", { XX } },
5221 { "(bad)", { XX } },
5222 { "(bad)", { XX } },
5223 { "(bad)", { XX } },
5224 { "(bad)", { XX } },
5225 /* 68 */
5226 { "(bad)", { XX } },
5227 { "(bad)", { XX } },
5228 { "(bad)", { XX } },
5229 { "(bad)", { XX } },
5230 { "(bad)", { XX } },
5231 { "(bad)", { XX } },
5232 { "(bad)", { XX } },
5233 { "(bad)", { XX } },
5234 /* 70 */
5235 { "(bad)", { XX } },
5236 { "(bad)", { XX } },
5237 { "(bad)", { XX } },
5238 { "(bad)", { XX } },
5239 { "(bad)", { XX } },
5240 { "(bad)", { XX } },
5241 { "(bad)", { XX } },
5242 { "(bad)", { XX } },
5243 /* 78 */
5244 { "(bad)", { XX } },
5245 { "(bad)", { XX } },
5246 { "(bad)", { XX } },
5247 { "(bad)", { XX } },
5248 { "(bad)", { XX } },
5249 { "(bad)", { XX } },
5250 { "(bad)", { XX } },
5251 { "(bad)", { XX } },
5252 /* 80 */
5253 { "(bad)", { XX } },
5254 { "(bad)", { XX } },
5255 { "(bad)", { XX } },
5256 { "(bad)", { XX } },
5257 { "(bad)", { XX } },
5258 { "pmacssww", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5259 { "pmacsswd", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5260 { "pmacssdql", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5261 /* 88 */
5262 { "(bad)", { XX } },
5263 { "(bad)", { XX } },
5264 { "(bad)", { XX } },
5265 { "(bad)", { XX } },
5266 { "(bad)", { XX } },
5267 { "(bad)", { XX } },
5268 { "pmacssdd", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5269 { "pmacssdqh", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5270 /* 90 */
5271 { "(bad)", { XX } },
5272 { "(bad)", { XX } },
5273 { "(bad)", { XX } },
5274 { "(bad)", { XX } },
5275 { "(bad)", { XX } },
5276 { "pmacsww", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5277 { "pmacswd", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5278 { "pmacsdql", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5279 /* 98 */
5280 { "(bad)", { XX } },
5281 { "(bad)", { XX } },
5282 { "(bad)", { XX } },
5283 { "(bad)", { XX } },
5284 { "(bad)", { XX } },
5285 { "(bad)", { XX } },
5286 { "pmacsdd", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5287 { "pmacsdqh", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5288 /* a0 */
5289 { "(bad)", { XX } },
5290 { "(bad)", { XX } },
5291 { "(bad)", { XX } },
5292 { "(bad)", { XX } },
5293 { "(bad)", { XX } },
5294 { "(bad)", { XX } },
5295 { "pmadcsswd", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5296 { "(bad)", { XX } },
5297 /* a8 */
5298 { "(bad)", { XX } },
5299 { "(bad)", { XX } },
5300 { "(bad)", { XX } },
5301 { "(bad)", { XX } },
5302 { "(bad)", { XX } },
5303 { "(bad)", { XX } },
5304 { "(bad)", { XX } },
5305 { "(bad)", { XX } },
5306 /* b0 */
5307 { "(bad)", { XX } },
5308 { "(bad)", { XX } },
5309 { "(bad)", { XX } },
5310 { "(bad)", { XX } },
5311 { "(bad)", { XX } },
5312 { "(bad)", { XX } },
5313 { "pmadcswd", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5314 { "(bad)", { XX } },
5315 /* b8 */
5316 { "(bad)", { XX } },
5317 { "(bad)", { XX } },
5318 { "(bad)", { XX } },
5319 { "(bad)", { XX } },
5320 { "(bad)", { XX } },
5321 { "(bad)", { XX } },
5322 { "(bad)", { XX } },
5323 { "(bad)", { XX } },
5324 /* c0 */
5325 { "(bad)", { XX } },
5326 { "(bad)", { XX } },
5327 { "(bad)", { XX } },
5328 { "(bad)", { XX } },
5329 { "(bad)", { XX } },
5330 { "(bad)", { XX } },
5331 { "(bad)", { XX } },
5332 { "(bad)", { XX } },
5333 /* c8 */
5334 { "(bad)", { XX } },
5335 { "(bad)", { XX } },
5336 { "(bad)", { XX } },
5337 { "(bad)", { XX } },
5338 { "(bad)", { XX } },
5339 { "(bad)", { XX } },
5340 { "(bad)", { XX } },
5341 { "(bad)", { XX } },
5342 /* d0 */
5343 { "(bad)", { XX } },
5344 { "(bad)", { XX } },
5345 { "(bad)", { XX } },
5346 { "(bad)", { XX } },
5347 { "(bad)", { XX } },
5348 { "(bad)", { XX } },
5349 { "(bad)", { XX } },
5350 { "(bad)", { XX } },
5351 /* d8 */
5352 { "(bad)", { XX } },
5353 { "(bad)", { XX } },
5354 { "(bad)", { XX } },
5355 { "(bad)", { XX } },
5356 { "(bad)", { XX } },
5357 { "(bad)", { XX } },
5358 { "(bad)", { XX } },
5359 { "(bad)", { XX } },
5360 /* e0 */
5361 { "(bad)", { XX } },
5362 { "(bad)", { XX } },
5363 { "(bad)", { XX } },
5364 { "(bad)", { XX } },
5365 { "(bad)", { XX } },
5366 { "(bad)", { XX } },
5367 { "(bad)", { XX } },
5368 { "(bad)", { XX } },
5369 /* e8 */
5370 { "(bad)", { XX } },
5371 { "(bad)", { XX } },
5372 { "(bad)", { XX } },
5373 { "(bad)", { XX } },
5374 { "(bad)", { XX } },
5375 { "(bad)", { XX } },
5376 { "(bad)", { XX } },
5377 { "(bad)", { XX } },
5378 /* f0 */
5379 { "(bad)", { XX } },
5380 { "(bad)", { XX } },
5381 { "(bad)", { XX } },
5382 { "(bad)", { XX } },
5383 { "(bad)", { XX } },
5384 { "(bad)", { XX } },
5385 { "(bad)", { XX } },
5386 { "(bad)", { XX } },
5387 /* f8 */
5388 { "(bad)", { XX } },
5389 { "(bad)", { XX } },
5390 { "(bad)", { XX } },
5391 { "(bad)", { XX } },
5392 { "(bad)", { XX } },
5393 { "(bad)", { XX } },
5394 { "(bad)", { XX } },
5395 { "(bad)", { XX } },
5396 },
5397 /* THREE_BYTE_0F25 */
5398 {
5399 /* 00 */
5400 { "(bad)", { XX } },
5401 { "(bad)", { XX } },
5402 { "(bad)", { XX } },
5403 { "(bad)", { XX } },
5404 { "(bad)", { XX } },
5405 { "(bad)", { XX } },
5406 { "(bad)", { XX } },
5407 { "(bad)", { XX } },
5408 /* 08 */
5409 { "(bad)", { XX } },
5410 { "(bad)", { XX } },
5411 { "(bad)", { XX } },
5412 { "(bad)", { XX } },
5413 { "(bad)", { XX } },
5414 { "(bad)", { XX } },
5415 { "(bad)", { XX } },
5416 { "(bad)", { XX } },
5417 /* 10 */
5418 { "(bad)", { XX } },
5419 { "(bad)", { XX } },
5420 { "(bad)", { XX } },
5421 { "(bad)", { XX } },
5422 { "(bad)", { XX } },
5423 { "(bad)", { XX } },
5424 { "(bad)", { XX } },
5425 { "(bad)", { XX } },
5426 /* 18 */
5427 { "(bad)", { XX } },
5428 { "(bad)", { XX } },
5429 { "(bad)", { XX } },
5430 { "(bad)", { XX } },
5431 { "(bad)", { XX } },
5432 { "(bad)", { XX } },
5433 { "(bad)", { XX } },
5434 { "(bad)", { XX } },
5435 /* 20 */
5436 { "(bad)", { XX } },
5437 { "(bad)", { XX } },
5438 { "(bad)", { XX } },
5439 { "(bad)", { XX } },
5440 { "(bad)", { XX } },
5441 { "(bad)", { XX } },
5442 { "(bad)", { XX } },
5443 { "(bad)", { XX } },
5444 /* 28 */
5445 { "(bad)", { XX } },
5446 { "(bad)", { XX } },
5447 { "(bad)", { XX } },
5448 { "(bad)", { XX } },
5449 { "comps", { { OP_DREX3, q_mode }, { OP_DREX_FCMP, b_mode } } },
5450 { "compd", { { OP_DREX3, q_mode }, { OP_DREX_FCMP, b_mode } } },
5451 { "comss", { { OP_DREX3, w_mode }, { OP_DREX_FCMP, b_mode } } },
5452 { "comsd", { { OP_DREX3, d_mode }, { OP_DREX_FCMP, b_mode } } },
5453 /* 30 */
5454 { "(bad)", { XX } },
5455 { "(bad)", { XX } },
5456 { "(bad)", { XX } },
5457 { "(bad)", { XX } },
5458 { "(bad)", { XX } },
5459 { "(bad)", { XX } },
5460 { "(bad)", { XX } },
5461 { "(bad)", { XX } },
5462 /* 38 */
5463 { "(bad)", { XX } },
5464 { "(bad)", { XX } },
5465 { "(bad)", { XX } },
5466 { "(bad)", { XX } },
5467 { "(bad)", { XX } },
5468 { "(bad)", { XX } },
5469 { "(bad)", { XX } },
5470 { "(bad)", { XX } },
5471 /* 40 */
5472 { "(bad)", { XX } },
5473 { "(bad)", { XX } },
5474 { "(bad)", { XX } },
5475 { "(bad)", { XX } },
5476 { "(bad)", { XX } },
5477 { "(bad)", { XX } },
5478 { "(bad)", { XX } },
5479 { "(bad)", { XX } },
5480 /* 48 */
5481 { "(bad)", { XX } },
5482 { "(bad)", { XX } },
5483 { "(bad)", { XX } },
5484 { "(bad)", { XX } },
5485 { "pcomb", { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
5486 { "pcomw", { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
5487 { "pcomd", { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
5488 { "pcomq", { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
5489 /* 50 */
5490 { "(bad)", { XX } },
5491 { "(bad)", { XX } },
5492 { "(bad)", { XX } },
5493 { "(bad)", { XX } },
5494 { "(bad)", { XX } },
5495 { "(bad)", { XX } },
5496 { "(bad)", { XX } },
5497 { "(bad)", { XX } },
5498 /* 58 */
5499 { "(bad)", { XX } },
5500 { "(bad)", { XX } },
5501 { "(bad)", { XX } },
5502 { "(bad)", { XX } },
5503 { "(bad)", { XX } },
5504 { "(bad)", { XX } },
5505 { "(bad)", { XX } },
5506 { "(bad)", { XX } },
5507 /* 60 */
5508 { "(bad)", { XX } },
5509 { "(bad)", { XX } },
5510 { "(bad)", { XX } },
5511 { "(bad)", { XX } },
5512 { "(bad)", { XX } },
5513 { "(bad)", { XX } },
5514 { "(bad)", { XX } },
5515 { "(bad)", { XX } },
5516 /* 68 */
5517 { "(bad)", { XX } },
5518 { "(bad)", { XX } },
5519 { "(bad)", { XX } },
5520 { "(bad)", { XX } },
5521 { "pcomub", { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
5522 { "pcomuw", { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
5523 { "pcomud", { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
5524 { "pcomuq", { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
5525 /* 70 */
5526 { "(bad)", { XX } },
5527 { "(bad)", { XX } },
5528 { "(bad)", { XX } },
5529 { "(bad)", { XX } },
5530 { "(bad)", { XX } },
5531 { "(bad)", { XX } },
5532 { "(bad)", { XX } },
5533 { "(bad)", { XX } },
5534 /* 78 */
5535 { "(bad)", { XX } },
5536 { "(bad)", { XX } },
5537 { "(bad)", { XX } },
5538 { "(bad)", { XX } },
5539 { "(bad)", { XX } },
5540 { "(bad)", { XX } },
5541 { "(bad)", { XX } },
5542 { "(bad)", { XX } },
5543 /* 80 */
5544 { "(bad)", { XX } },
5545 { "(bad)", { XX } },
5546 { "(bad)", { XX } },
5547 { "(bad)", { XX } },
5548 { "(bad)", { XX } },
5549 { "(bad)", { XX } },
5550 { "(bad)", { XX } },
5551 { "(bad)", { XX } },
5552 /* 88 */
5553 { "(bad)", { XX } },
5554 { "(bad)", { XX } },
5555 { "(bad)", { XX } },
5556 { "(bad)", { XX } },
5557 { "(bad)", { XX } },
5558 { "(bad)", { XX } },
5559 { "(bad)", { XX } },
5560 { "(bad)", { XX } },
5561 /* 90 */
5562 { "(bad)", { XX } },
5563 { "(bad)", { XX } },
5564 { "(bad)", { XX } },
5565 { "(bad)", { XX } },
5566 { "(bad)", { XX } },
5567 { "(bad)", { XX } },
5568 { "(bad)", { XX } },
5569 { "(bad)", { XX } },
5570 /* 98 */
5571 { "(bad)", { XX } },
5572 { "(bad)", { XX } },
5573 { "(bad)", { XX } },
5574 { "(bad)", { XX } },
5575 { "(bad)", { XX } },
5576 { "(bad)", { XX } },
5577 { "(bad)", { XX } },
5578 { "(bad)", { XX } },
5579 /* a0 */
5580 { "(bad)", { XX } },
5581 { "(bad)", { XX } },
5582 { "(bad)", { XX } },
5583 { "(bad)", { XX } },
5584 { "(bad)", { XX } },
5585 { "(bad)", { XX } },
5586 { "(bad)", { XX } },
5587 { "(bad)", { XX } },
5588 /* a8 */
5589 { "(bad)", { XX } },
5590 { "(bad)", { XX } },
5591 { "(bad)", { XX } },
5592 { "(bad)", { XX } },
5593 { "(bad)", { XX } },
5594 { "(bad)", { XX } },
5595 { "(bad)", { XX } },
5596 { "(bad)", { XX } },
5597 /* b0 */
5598 { "(bad)", { XX } },
5599 { "(bad)", { XX } },
5600 { "(bad)", { XX } },
5601 { "(bad)", { XX } },
5602 { "(bad)", { XX } },
5603 { "(bad)", { XX } },
5604 { "(bad)", { XX } },
5605 { "(bad)", { XX } },
5606 /* b8 */
5607 { "(bad)", { XX } },
5608 { "(bad)", { XX } },
5609 { "(bad)", { XX } },
5610 { "(bad)", { XX } },
5611 { "(bad)", { XX } },
5612 { "(bad)", { XX } },
5613 { "(bad)", { XX } },
5614 { "(bad)", { XX } },
5615 /* c0 */
5616 { "(bad)", { XX } },
5617 { "(bad)", { XX } },
5618 { "(bad)", { XX } },
5619 { "(bad)", { XX } },
5620 { "(bad)", { XX } },
5621 { "(bad)", { XX } },
5622 { "(bad)", { XX } },
5623 { "(bad)", { XX } },
5624 /* c8 */
5625 { "(bad)", { XX } },
5626 { "(bad)", { XX } },
5627 { "(bad)", { XX } },
5628 { "(bad)", { XX } },
5629 { "(bad)", { XX } },
5630 { "(bad)", { XX } },
5631 { "(bad)", { XX } },
5632 { "(bad)", { XX } },
5633 /* d0 */
5634 { "(bad)", { XX } },
5635 { "(bad)", { XX } },
5636 { "(bad)", { XX } },
5637 { "(bad)", { XX } },
5638 { "(bad)", { XX } },
5639 { "(bad)", { XX } },
5640 { "(bad)", { XX } },
5641 { "(bad)", { XX } },
5642 /* d8 */
5643 { "(bad)", { XX } },
5644 { "(bad)", { XX } },
5645 { "(bad)", { XX } },
5646 { "(bad)", { XX } },
5647 { "(bad)", { XX } },
5648 { "(bad)", { XX } },
5649 { "(bad)", { XX } },
5650 { "(bad)", { XX } },
5651 /* e0 */
5652 { "(bad)", { XX } },
5653 { "(bad)", { XX } },
5654 { "(bad)", { XX } },
5655 { "(bad)", { XX } },
5656 { "(bad)", { XX } },
5657 { "(bad)", { XX } },
5658 { "(bad)", { XX } },
5659 { "(bad)", { XX } },
5660 /* e8 */
5661 { "(bad)", { XX } },
5662 { "(bad)", { XX } },
5663 { "(bad)", { XX } },
5664 { "(bad)", { XX } },
5665 { "(bad)", { XX } },
5666 { "(bad)", { XX } },
5667 { "(bad)", { XX } },
5668 { "(bad)", { XX } },
5669 /* f0 */
5670 { "(bad)", { XX } },
5671 { "(bad)", { XX } },
5672 { "(bad)", { XX } },
5673 { "(bad)", { XX } },
5674 { "(bad)", { XX } },
5675 { "(bad)", { XX } },
5676 { "(bad)", { XX } },
5677 { "(bad)", { XX } },
5678 /* f8 */
5679 { "(bad)", { XX } },
5680 { "(bad)", { XX } },
5681 { "(bad)", { XX } },
5682 { "(bad)", { XX } },
5683 { "(bad)", { XX } },
5684 { "(bad)", { XX } },
5685 { "(bad)", { XX } },
5686 { "(bad)", { XX } },
5687 },
5688 /* THREE_BYTE_0F38 */
5689 {
5690 /* 00 */
5691 { "pshufb", { MX, EM } },
5692 { "phaddw", { MX, EM } },
5693 { "phaddd", { MX, EM } },
5694 { "phaddsw", { MX, EM } },
5695 { "pmaddubsw", { MX, EM } },
5696 { "phsubw", { MX, EM } },
5697 { "phsubd", { MX, EM } },
5698 { "phsubsw", { MX, EM } },
5699 /* 08 */
5700 { "psignb", { MX, EM } },
5701 { "psignw", { MX, EM } },
5702 { "psignd", { MX, EM } },
5703 { "pmulhrsw", { MX, EM } },
5704 { "(bad)", { XX } },
5705 { "(bad)", { XX } },
5706 { "(bad)", { XX } },
5707 { "(bad)", { XX } },
5708 /* 10 */
5709 { PREFIX_TABLE (PREFIX_0F3810) },
5710 { "(bad)", { XX } },
5711 { "(bad)", { XX } },
5712 { "(bad)", { XX } },
5713 { PREFIX_TABLE (PREFIX_0F3814) },
5714 { PREFIX_TABLE (PREFIX_0F3815) },
5715 { "(bad)", { XX } },
5716 { PREFIX_TABLE (PREFIX_0F3817) },
5717 /* 18 */
5718 { "(bad)", { XX } },
5719 { "(bad)", { XX } },
5720 { "(bad)", { XX } },
5721 { "(bad)", { XX } },
5722 { "pabsb", { MX, EM } },
5723 { "pabsw", { MX, EM } },
5724 { "pabsd", { MX, EM } },
5725 { "(bad)", { XX } },
5726 /* 20 */
5727 { PREFIX_TABLE (PREFIX_0F3820) },
5728 { PREFIX_TABLE (PREFIX_0F3821) },
5729 { PREFIX_TABLE (PREFIX_0F3822) },
5730 { PREFIX_TABLE (PREFIX_0F3823) },
5731 { PREFIX_TABLE (PREFIX_0F3824) },
5732 { PREFIX_TABLE (PREFIX_0F3825) },
5733 { "(bad)", { XX } },
5734 { "(bad)", { XX } },
5735 /* 28 */
5736 { PREFIX_TABLE (PREFIX_0F3828) },
5737 { PREFIX_TABLE (PREFIX_0F3829) },
5738 { PREFIX_TABLE (PREFIX_0F382A) },
5739 { PREFIX_TABLE (PREFIX_0F382B) },
5740 { "(bad)", { XX } },
5741 { "(bad)", { XX } },
5742 { "(bad)", { XX } },
5743 { "(bad)", { XX } },
5744 /* 30 */
5745 { PREFIX_TABLE (PREFIX_0F3830) },
5746 { PREFIX_TABLE (PREFIX_0F3831) },
5747 { PREFIX_TABLE (PREFIX_0F3832) },
5748 { PREFIX_TABLE (PREFIX_0F3833) },
5749 { PREFIX_TABLE (PREFIX_0F3834) },
5750 { PREFIX_TABLE (PREFIX_0F3835) },
5751 { "(bad)", { XX } },
5752 { PREFIX_TABLE (PREFIX_0F3837) },
5753 /* 38 */
5754 { PREFIX_TABLE (PREFIX_0F3838) },
5755 { PREFIX_TABLE (PREFIX_0F3839) },
5756 { PREFIX_TABLE (PREFIX_0F383A) },
5757 { PREFIX_TABLE (PREFIX_0F383B) },
5758 { PREFIX_TABLE (PREFIX_0F383C) },
5759 { PREFIX_TABLE (PREFIX_0F383D) },
5760 { PREFIX_TABLE (PREFIX_0F383E) },
5761 { PREFIX_TABLE (PREFIX_0F383F) },
5762 /* 40 */
5763 { PREFIX_TABLE (PREFIX_0F3840) },
5764 { PREFIX_TABLE (PREFIX_0F3841) },
5765 { "(bad)", { XX } },
5766 { "(bad)", { XX } },
5767 { "(bad)", { XX } },
5768 { "(bad)", { XX } },
5769 { "(bad)", { XX } },
5770 { "(bad)", { XX } },
5771 /* 48 */
5772 { "(bad)", { XX } },
5773 { "(bad)", { XX } },
5774 { "(bad)", { XX } },
5775 { "(bad)", { XX } },
5776 { "(bad)", { XX } },
5777 { "(bad)", { XX } },
5778 { "(bad)", { XX } },
5779 { "(bad)", { XX } },
5780 /* 50 */
5781 { "(bad)", { XX } },
5782 { "(bad)", { XX } },
5783 { "(bad)", { XX } },
5784 { "(bad)", { XX } },
5785 { "(bad)", { XX } },
5786 { "(bad)", { XX } },
5787 { "(bad)", { XX } },
5788 { "(bad)", { XX } },
5789 /* 58 */
5790 { "(bad)", { XX } },
5791 { "(bad)", { XX } },
5792 { "(bad)", { XX } },
5793 { "(bad)", { XX } },
5794 { "(bad)", { XX } },
5795 { "(bad)", { XX } },
5796 { "(bad)", { XX } },
5797 { "(bad)", { XX } },
5798 /* 60 */
5799 { "(bad)", { XX } },
5800 { "(bad)", { XX } },
5801 { "(bad)", { XX } },
5802 { "(bad)", { XX } },
5803 { "(bad)", { XX } },
5804 { "(bad)", { XX } },
5805 { "(bad)", { XX } },
5806 { "(bad)", { XX } },
5807 /* 68 */
5808 { "(bad)", { XX } },
5809 { "(bad)", { XX } },
5810 { "(bad)", { XX } },
5811 { "(bad)", { XX } },
5812 { "(bad)", { XX } },
5813 { "(bad)", { XX } },
5814 { "(bad)", { XX } },
5815 { "(bad)", { XX } },
5816 /* 70 */
5817 { "(bad)", { XX } },
5818 { "(bad)", { XX } },
5819 { "(bad)", { XX } },
5820 { "(bad)", { XX } },
5821 { "(bad)", { XX } },
5822 { "(bad)", { XX } },
5823 { "(bad)", { XX } },
5824 { "(bad)", { XX } },
5825 /* 78 */
5826 { "(bad)", { XX } },
5827 { "(bad)", { XX } },
5828 { "(bad)", { XX } },
5829 { "(bad)", { XX } },
5830 { "(bad)", { XX } },
5831 { "(bad)", { XX } },
5832 { "(bad)", { XX } },
5833 { "(bad)", { XX } },
5834 /* 80 */
5835 { "(bad)", { XX } },
5836 { "(bad)", { XX } },
5837 { "(bad)", { XX } },
5838 { "(bad)", { XX } },
5839 { "(bad)", { XX } },
5840 { "(bad)", { XX } },
5841 { "(bad)", { XX } },
5842 { "(bad)", { XX } },
5843 /* 88 */
5844 { "(bad)", { XX } },
5845 { "(bad)", { XX } },
5846 { "(bad)", { XX } },
5847 { "(bad)", { XX } },
5848 { "(bad)", { XX } },
5849 { "(bad)", { XX } },
5850 { "(bad)", { XX } },
5851 { "(bad)", { XX } },
5852 /* 90 */
5853 { "(bad)", { XX } },
5854 { "(bad)", { XX } },
5855 { "(bad)", { XX } },
5856 { "(bad)", { XX } },
5857 { "(bad)", { XX } },
5858 { "(bad)", { XX } },
5859 { "(bad)", { XX } },
5860 { "(bad)", { XX } },
5861 /* 98 */
5862 { "(bad)", { XX } },
5863 { "(bad)", { XX } },
5864 { "(bad)", { XX } },
5865 { "(bad)", { XX } },
5866 { "(bad)", { XX } },
5867 { "(bad)", { XX } },
5868 { "(bad)", { XX } },
5869 { "(bad)", { XX } },
5870 /* a0 */
5871 { "(bad)", { XX } },
5872 { "(bad)", { XX } },
5873 { "(bad)", { XX } },
5874 { "(bad)", { XX } },
5875 { "(bad)", { XX } },
5876 { "(bad)", { XX } },
5877 { "(bad)", { XX } },
5878 { "(bad)", { XX } },
5879 /* a8 */
5880 { "(bad)", { XX } },
5881 { "(bad)", { XX } },
5882 { "(bad)", { XX } },
5883 { "(bad)", { XX } },
5884 { "(bad)", { XX } },
5885 { "(bad)", { XX } },
5886 { "(bad)", { XX } },
5887 { "(bad)", { XX } },
5888 /* b0 */
5889 { "(bad)", { XX } },
5890 { "(bad)", { XX } },
5891 { "(bad)", { XX } },
5892 { "(bad)", { XX } },
5893 { "(bad)", { XX } },
5894 { "(bad)", { XX } },
5895 { "(bad)", { XX } },
5896 { "(bad)", { XX } },
5897 /* b8 */
5898 { "(bad)", { XX } },
5899 { "(bad)", { XX } },
5900 { "(bad)", { XX } },
5901 { "(bad)", { XX } },
5902 { "(bad)", { XX } },
5903 { "(bad)", { XX } },
5904 { "(bad)", { XX } },
5905 { "(bad)", { XX } },
5906 /* c0 */
5907 { "(bad)", { XX } },
5908 { "(bad)", { XX } },
5909 { "(bad)", { XX } },
5910 { "(bad)", { XX } },
5911 { "(bad)", { XX } },
5912 { "(bad)", { XX } },
5913 { "(bad)", { XX } },
5914 { "(bad)", { XX } },
5915 /* c8 */
5916 { "(bad)", { XX } },
5917 { "(bad)", { XX } },
5918 { "(bad)", { XX } },
5919 { "(bad)", { XX } },
5920 { "(bad)", { XX } },
5921 { "(bad)", { XX } },
5922 { "(bad)", { XX } },
5923 { "(bad)", { XX } },
5924 /* d0 */
5925 { "(bad)", { XX } },
5926 { "(bad)", { XX } },
5927 { "(bad)", { XX } },
5928 { "(bad)", { XX } },
5929 { "(bad)", { XX } },
5930 { "(bad)", { XX } },
5931 { "(bad)", { XX } },
5932 { "(bad)", { XX } },
5933 /* d8 */
5934 { "(bad)", { XX } },
5935 { "(bad)", { XX } },
5936 { "(bad)", { XX } },
5937 { PREFIX_TABLE (PREFIX_0F38DB) },
5938 { PREFIX_TABLE (PREFIX_0F38DC) },
5939 { PREFIX_TABLE (PREFIX_0F38DD) },
5940 { PREFIX_TABLE (PREFIX_0F38DE) },
5941 { PREFIX_TABLE (PREFIX_0F38DF) },
5942 /* e0 */
5943 { "(bad)", { XX } },
5944 { "(bad)", { XX } },
5945 { "(bad)", { XX } },
5946 { "(bad)", { XX } },
5947 { "(bad)", { XX } },
5948 { "(bad)", { XX } },
5949 { "(bad)", { XX } },
5950 { "(bad)", { XX } },
5951 /* e8 */
5952 { "(bad)", { XX } },
5953 { "(bad)", { XX } },
5954 { "(bad)", { XX } },
5955 { "(bad)", { XX } },
5956 { "(bad)", { XX } },
5957 { "(bad)", { XX } },
5958 { "(bad)", { XX } },
5959 { "(bad)", { XX } },
5960 /* f0 */
5961 { PREFIX_TABLE (PREFIX_0F38F0) },
5962 { PREFIX_TABLE (PREFIX_0F38F1) },
5963 { "(bad)", { XX } },
5964 { "(bad)", { XX } },
5965 { "(bad)", { XX } },
5966 { "(bad)", { XX } },
5967 { "(bad)", { XX } },
5968 { "(bad)", { XX } },
5969 /* f8 */
5970 { "(bad)", { XX } },
5971 { "(bad)", { XX } },
5972 { "(bad)", { XX } },
5973 { "(bad)", { XX } },
5974 { "(bad)", { XX } },
5975 { "(bad)", { XX } },
5976 { "(bad)", { XX } },
5977 { "(bad)", { XX } },
5978 },
5979 /* THREE_BYTE_0F3A */
5980 {
5981 /* 00 */
5982 { "(bad)", { XX } },
5983 { "(bad)", { XX } },
5984 { "(bad)", { XX } },
5985 { "(bad)", { XX } },
5986 { "(bad)", { XX } },
5987 { "(bad)", { XX } },
5988 { "(bad)", { XX } },
5989 { "(bad)", { XX } },
5990 /* 08 */
5991 { PREFIX_TABLE (PREFIX_0F3A08) },
5992 { PREFIX_TABLE (PREFIX_0F3A09) },
5993 { PREFIX_TABLE (PREFIX_0F3A0A) },
5994 { PREFIX_TABLE (PREFIX_0F3A0B) },
5995 { PREFIX_TABLE (PREFIX_0F3A0C) },
5996 { PREFIX_TABLE (PREFIX_0F3A0D) },
5997 { PREFIX_TABLE (PREFIX_0F3A0E) },
5998 { "palignr", { MX, EM, Ib } },
5999 /* 10 */
6000 { "(bad)", { XX } },
6001 { "(bad)", { XX } },
6002 { "(bad)", { XX } },
6003 { "(bad)", { XX } },
6004 { PREFIX_TABLE (PREFIX_0F3A14) },
6005 { PREFIX_TABLE (PREFIX_0F3A15) },
6006 { PREFIX_TABLE (PREFIX_0F3A16) },
6007 { PREFIX_TABLE (PREFIX_0F3A17) },
6008 /* 18 */
6009 { "(bad)", { XX } },
6010 { "(bad)", { XX } },
6011 { "(bad)", { XX } },
6012 { "(bad)", { XX } },
6013 { "(bad)", { XX } },
6014 { "(bad)", { XX } },
6015 { "(bad)", { XX } },
6016 { "(bad)", { XX } },
6017 /* 20 */
6018 { PREFIX_TABLE (PREFIX_0F3A20) },
6019 { PREFIX_TABLE (PREFIX_0F3A21) },
6020 { PREFIX_TABLE (PREFIX_0F3A22) },
6021 { "(bad)", { XX } },
6022 { "(bad)", { XX } },
6023 { "(bad)", { XX } },
6024 { "(bad)", { XX } },
6025 { "(bad)", { XX } },
6026 /* 28 */
6027 { "(bad)", { XX } },
6028 { "(bad)", { XX } },
6029 { "(bad)", { XX } },
6030 { "(bad)", { XX } },
6031 { "(bad)", { XX } },
6032 { "(bad)", { XX } },
6033 { "(bad)", { XX } },
6034 { "(bad)", { XX } },
6035 /* 30 */
6036 { "(bad)", { XX } },
6037 { "(bad)", { XX } },
6038 { "(bad)", { XX } },
6039 { "(bad)", { XX } },
6040 { "(bad)", { XX } },
6041 { "(bad)", { XX } },
6042 { "(bad)", { XX } },
6043 { "(bad)", { XX } },
6044 /* 38 */
6045 { "(bad)", { XX } },
6046 { "(bad)", { XX } },
6047 { "(bad)", { XX } },
6048 { "(bad)", { XX } },
6049 { "(bad)", { XX } },
6050 { "(bad)", { XX } },
6051 { "(bad)", { XX } },
6052 { "(bad)", { XX } },
6053 /* 40 */
6054 { PREFIX_TABLE (PREFIX_0F3A40) },
6055 { PREFIX_TABLE (PREFIX_0F3A41) },
6056 { PREFIX_TABLE (PREFIX_0F3A42) },
6057 { "(bad)", { XX } },
6058 { PREFIX_TABLE (PREFIX_0F3A44) },
6059 { "(bad)", { XX } },
6060 { "(bad)", { XX } },
6061 { "(bad)", { XX } },
6062 /* 48 */
6063 { "(bad)", { XX } },
6064 { "(bad)", { XX } },
6065 { "(bad)", { XX } },
6066 { "(bad)", { XX } },
6067 { "(bad)", { XX } },
6068 { "(bad)", { XX } },
6069 { "(bad)", { XX } },
6070 { "(bad)", { XX } },
6071 /* 50 */
6072 { "(bad)", { XX } },
6073 { "(bad)", { XX } },
6074 { "(bad)", { XX } },
6075 { "(bad)", { XX } },
6076 { "(bad)", { XX } },
6077 { "(bad)", { XX } },
6078 { "(bad)", { XX } },
6079 { "(bad)", { XX } },
6080 /* 58 */
6081 { "(bad)", { XX } },
6082 { "(bad)", { XX } },
6083 { "(bad)", { XX } },
6084 { "(bad)", { XX } },
6085 { "(bad)", { XX } },
6086 { "(bad)", { XX } },
6087 { "(bad)", { XX } },
6088 { "(bad)", { XX } },
6089 /* 60 */
6090 { PREFIX_TABLE (PREFIX_0F3A60) },
6091 { PREFIX_TABLE (PREFIX_0F3A61) },
6092 { PREFIX_TABLE (PREFIX_0F3A62) },
6093 { PREFIX_TABLE (PREFIX_0F3A63) },
6094 { "(bad)", { XX } },
6095 { "(bad)", { XX } },
6096 { "(bad)", { XX } },
6097 { "(bad)", { XX } },
6098 /* 68 */
6099 { "(bad)", { XX } },
6100 { "(bad)", { XX } },
6101 { "(bad)", { XX } },
6102 { "(bad)", { XX } },
6103 { "(bad)", { XX } },
6104 { "(bad)", { XX } },
6105 { "(bad)", { XX } },
6106 { "(bad)", { XX } },
6107 /* 70 */
6108 { "(bad)", { XX } },
6109 { "(bad)", { XX } },
6110 { "(bad)", { XX } },
6111 { "(bad)", { XX } },
6112 { "(bad)", { XX } },
6113 { "(bad)", { XX } },
6114 { "(bad)", { XX } },
6115 { "(bad)", { XX } },
6116 /* 78 */
6117 { "(bad)", { XX } },
6118 { "(bad)", { XX } },
6119 { "(bad)", { XX } },
6120 { "(bad)", { XX } },
6121 { "(bad)", { XX } },
6122 { "(bad)", { XX } },
6123 { "(bad)", { XX } },
6124 { "(bad)", { XX } },
6125 /* 80 */
6126 { "(bad)", { XX } },
6127 { "(bad)", { XX } },
6128 { "(bad)", { XX } },
6129 { "(bad)", { XX } },
6130 { "(bad)", { XX } },
6131 { "(bad)", { XX } },
6132 { "(bad)", { XX } },
6133 { "(bad)", { XX } },
6134 /* 88 */
6135 { "(bad)", { XX } },
6136 { "(bad)", { XX } },
6137 { "(bad)", { XX } },
6138 { "(bad)", { XX } },
6139 { "(bad)", { XX } },
6140 { "(bad)", { XX } },
6141 { "(bad)", { XX } },
6142 { "(bad)", { XX } },
6143 /* 90 */
6144 { "(bad)", { XX } },
6145 { "(bad)", { XX } },
6146 { "(bad)", { XX } },
6147 { "(bad)", { XX } },
6148 { "(bad)", { XX } },
6149 { "(bad)", { XX } },
6150 { "(bad)", { XX } },
6151 { "(bad)", { XX } },
6152 /* 98 */
6153 { "(bad)", { XX } },
6154 { "(bad)", { XX } },
6155 { "(bad)", { XX } },
6156 { "(bad)", { XX } },
6157 { "(bad)", { XX } },
6158 { "(bad)", { XX } },
6159 { "(bad)", { XX } },
6160 { "(bad)", { XX } },
6161 /* a0 */
6162 { "(bad)", { XX } },
6163 { "(bad)", { XX } },
6164 { "(bad)", { XX } },
6165 { "(bad)", { XX } },
6166 { "(bad)", { XX } },
6167 { "(bad)", { XX } },
6168 { "(bad)", { XX } },
6169 { "(bad)", { XX } },
6170 /* a8 */
6171 { "(bad)", { XX } },
6172 { "(bad)", { XX } },
6173 { "(bad)", { XX } },
6174 { "(bad)", { XX } },
6175 { "(bad)", { XX } },
6176 { "(bad)", { XX } },
6177 { "(bad)", { XX } },
6178 { "(bad)", { XX } },
6179 /* b0 */
6180 { "(bad)", { XX } },
6181 { "(bad)", { XX } },
6182 { "(bad)", { XX } },
6183 { "(bad)", { XX } },
6184 { "(bad)", { XX } },
6185 { "(bad)", { XX } },
6186 { "(bad)", { XX } },
6187 { "(bad)", { XX } },
6188 /* b8 */
6189 { "(bad)", { XX } },
6190 { "(bad)", { XX } },
6191 { "(bad)", { XX } },
6192 { "(bad)", { XX } },
6193 { "(bad)", { XX } },
6194 { "(bad)", { XX } },
6195 { "(bad)", { XX } },
6196 { "(bad)", { XX } },
6197 /* c0 */
6198 { "(bad)", { XX } },
6199 { "(bad)", { XX } },
6200 { "(bad)", { XX } },
6201 { "(bad)", { XX } },
6202 { "(bad)", { XX } },
6203 { "(bad)", { XX } },
6204 { "(bad)", { XX } },
6205 { "(bad)", { XX } },
6206 /* c8 */
6207 { "(bad)", { XX } },
6208 { "(bad)", { XX } },
6209 { "(bad)", { XX } },
6210 { "(bad)", { XX } },
6211 { "(bad)", { XX } },
6212 { "(bad)", { XX } },
6213 { "(bad)", { XX } },
6214 { "(bad)", { XX } },
6215 /* d0 */
6216 { "(bad)", { XX } },
6217 { "(bad)", { XX } },
6218 { "(bad)", { XX } },
6219 { "(bad)", { XX } },
6220 { "(bad)", { XX } },
6221 { "(bad)", { XX } },
6222 { "(bad)", { XX } },
6223 { "(bad)", { XX } },
6224 /* d8 */
6225 { "(bad)", { XX } },
6226 { "(bad)", { XX } },
6227 { "(bad)", { XX } },
6228 { "(bad)", { XX } },
6229 { "(bad)", { XX } },
6230 { "(bad)", { XX } },
6231 { "(bad)", { XX } },
6232 { PREFIX_TABLE (PREFIX_0F3ADF) },
6233 /* e0 */
6234 { "(bad)", { XX } },
6235 { "(bad)", { XX } },
6236 { "(bad)", { XX } },
6237 { "(bad)", { XX } },
6238 { "(bad)", { XX } },
6239 { "(bad)", { XX } },
6240 { "(bad)", { XX } },
6241 { "(bad)", { XX } },
6242 /* e8 */
6243 { "(bad)", { XX } },
6244 { "(bad)", { XX } },
6245 { "(bad)", { XX } },
6246 { "(bad)", { XX } },
6247 { "(bad)", { XX } },
6248 { "(bad)", { XX } },
6249 { "(bad)", { XX } },
6250 { "(bad)", { XX } },
6251 /* f0 */
6252 { "(bad)", { XX } },
6253 { "(bad)", { XX } },
6254 { "(bad)", { XX } },
6255 { "(bad)", { XX } },
6256 { "(bad)", { XX } },
6257 { "(bad)", { XX } },
6258 { "(bad)", { XX } },
6259 { "(bad)", { XX } },
6260 /* f8 */
6261 { "(bad)", { XX } },
6262 { "(bad)", { XX } },
6263 { "(bad)", { XX } },
6264 { "(bad)", { XX } },
6265 { "(bad)", { XX } },
6266 { "(bad)", { XX } },
6267 { "(bad)", { XX } },
6268 { "(bad)", { XX } },
6269 },
6270 /* THREE_BYTE_0F7A */
6271 {
6272 /* 00 */
6273 { "(bad)", { XX } },
6274 { "(bad)", { XX } },
6275 { "(bad)", { XX } },
6276 { "(bad)", { XX } },
6277 { "(bad)", { XX } },
6278 { "(bad)", { XX } },
6279 { "(bad)", { XX } },
6280 { "(bad)", { XX } },
6281 /* 08 */
6282 { "(bad)", { XX } },
6283 { "(bad)", { XX } },
6284 { "(bad)", { XX } },
6285 { "(bad)", { XX } },
6286 { "(bad)", { XX } },
6287 { "(bad)", { XX } },
6288 { "(bad)", { XX } },
6289 { "(bad)", { XX } },
6290 /* 10 */
6291 { "frczps", { XM, EXq } },
6292 { "frczpd", { XM, EXq } },
6293 { "frczss", { XM, EXq } },
6294 { "frczsd", { XM, EXq } },
6295 { "(bad)", { XX } },
6296 { "(bad)", { XX } },
6297 { "(bad)", { XX } },
6298 { "(bad)", { XX } },
6299 /* 18 */
6300 { "(bad)", { XX } },
6301 { "(bad)", { XX } },
6302 { "(bad)", { XX } },
6303 { "(bad)", { XX } },
6304 { "(bad)", { XX } },
6305 { "(bad)", { XX } },
6306 { "(bad)", { XX } },
6307 { "(bad)", { XX } },
6308 /* 20 */
6309 { "ptest", { XX } },
6310 { "(bad)", { XX } },
6311 { "(bad)", { XX } },
6312 { "(bad)", { XX } },
6313 { "(bad)", { XX } },
6314 { "(bad)", { XX } },
6315 { "(bad)", { XX } },
6316 { "(bad)", { XX } },
6317 /* 28 */
6318 { "(bad)", { XX } },
6319 { "(bad)", { XX } },
6320 { "(bad)", { XX } },
6321 { "(bad)", { XX } },
6322 { "(bad)", { XX } },
6323 { "(bad)", { XX } },
6324 { "(bad)", { XX } },
6325 { "(bad)", { XX } },
6326 /* 30 */
6327 { "cvtph2ps", { XM, EXd } },
6328 { "cvtps2ph", { EXd, XM } },
6329 { "(bad)", { XX } },
6330 { "(bad)", { XX } },
6331 { "(bad)", { XX } },
6332 { "(bad)", { XX } },
6333 { "(bad)", { XX } },
6334 { "(bad)", { XX } },
6335 /* 38 */
6336 { "(bad)", { XX } },
6337 { "(bad)", { XX } },
6338 { "(bad)", { XX } },
6339 { "(bad)", { XX } },
6340 { "(bad)", { XX } },
6341 { "(bad)", { XX } },
6342 { "(bad)", { XX } },
6343 { "(bad)", { XX } },
6344 /* 40 */
6345 { "(bad)", { XX } },
6346 { "phaddbw", { XM, EXq } },
6347 { "phaddbd", { XM, EXq } },
6348 { "phaddbq", { XM, EXq } },
6349 { "(bad)", { XX } },
6350 { "(bad)", { XX } },
6351 { "phaddwd", { XM, EXq } },
6352 { "phaddwq", { XM, EXq } },
6353 /* 48 */
6354 { "(bad)", { XX } },
6355 { "(bad)", { XX } },
6356 { "(bad)", { XX } },
6357 { "phadddq", { XM, EXq } },
6358 { "(bad)", { XX } },
6359 { "(bad)", { XX } },
6360 { "(bad)", { XX } },
6361 { "(bad)", { XX } },
6362 /* 50 */
6363 { "(bad)", { XX } },
6364 { "phaddubw", { XM, EXq } },
6365 { "phaddubd", { XM, EXq } },
6366 { "phaddubq", { XM, EXq } },
6367 { "(bad)", { XX } },
6368 { "(bad)", { XX } },
6369 { "phadduwd", { XM, EXq } },
6370 { "phadduwq", { XM, EXq } },
6371 /* 58 */
6372 { "(bad)", { XX } },
6373 { "(bad)", { XX } },
6374 { "(bad)", { XX } },
6375 { "phaddudq", { XM, EXq } },
6376 { "(bad)", { XX } },
6377 { "(bad)", { XX } },
6378 { "(bad)", { XX } },
6379 { "(bad)", { XX } },
6380 /* 60 */
6381 { "(bad)", { XX } },
6382 { "phsubbw", { XM, EXq } },
6383 { "phsubbd", { XM, EXq } },
6384 { "phsubbq", { XM, EXq } },
6385 { "(bad)", { XX } },
6386 { "(bad)", { XX } },
6387 { "(bad)", { XX } },
6388 { "(bad)", { XX } },
6389 /* 68 */
6390 { "(bad)", { XX } },
6391 { "(bad)", { XX } },
6392 { "(bad)", { XX } },
6393 { "(bad)", { XX } },
6394 { "(bad)", { XX } },
6395 { "(bad)", { XX } },
6396 { "(bad)", { XX } },
6397 { "(bad)", { XX } },
6398 /* 70 */
6399 { "(bad)", { XX } },
6400 { "(bad)", { XX } },
6401 { "(bad)", { XX } },
6402 { "(bad)", { XX } },
6403 { "(bad)", { XX } },
6404 { "(bad)", { XX } },
6405 { "(bad)", { XX } },
6406 { "(bad)", { XX } },
6407 /* 78 */
6408 { "(bad)", { XX } },
6409 { "(bad)", { XX } },
6410 { "(bad)", { XX } },
6411 { "(bad)", { XX } },
6412 { "(bad)", { XX } },
6413 { "(bad)", { XX } },
6414 { "(bad)", { XX } },
6415 { "(bad)", { XX } },
6416 /* 80 */
6417 { "(bad)", { XX } },
6418 { "(bad)", { XX } },
6419 { "(bad)", { XX } },
6420 { "(bad)", { XX } },
6421 { "(bad)", { XX } },
6422 { "(bad)", { XX } },
6423 { "(bad)", { XX } },
6424 { "(bad)", { XX } },
6425 /* 88 */
6426 { "(bad)", { XX } },
6427 { "(bad)", { XX } },
6428 { "(bad)", { XX } },
6429 { "(bad)", { XX } },
6430 { "(bad)", { XX } },
6431 { "(bad)", { XX } },
6432 { "(bad)", { XX } },
6433 { "(bad)", { XX } },
6434 /* 90 */
6435 { "(bad)", { XX } },
6436 { "(bad)", { XX } },
6437 { "(bad)", { XX } },
6438 { "(bad)", { XX } },
6439 { "(bad)", { XX } },
6440 { "(bad)", { XX } },
6441 { "(bad)", { XX } },
6442 { "(bad)", { XX } },
6443 /* 98 */
6444 { "(bad)", { XX } },
6445 { "(bad)", { XX } },
6446 { "(bad)", { XX } },
6447 { "(bad)", { XX } },
6448 { "(bad)", { XX } },
6449 { "(bad)", { XX } },
6450 { "(bad)", { XX } },
6451 { "(bad)", { XX } },
6452 /* a0 */
6453 { "(bad)", { XX } },
6454 { "(bad)", { XX } },
6455 { "(bad)", { XX } },
6456 { "(bad)", { XX } },
6457 { "(bad)", { XX } },
6458 { "(bad)", { XX } },
6459 { "(bad)", { XX } },
6460 { "(bad)", { XX } },
6461 /* a8 */
6462 { "(bad)", { XX } },
6463 { "(bad)", { XX } },
6464 { "(bad)", { XX } },
6465 { "(bad)", { XX } },
6466 { "(bad)", { XX } },
6467 { "(bad)", { XX } },
6468 { "(bad)", { XX } },
6469 { "(bad)", { XX } },
6470 /* b0 */
6471 { "(bad)", { XX } },
6472 { "(bad)", { XX } },
6473 { "(bad)", { XX } },
6474 { "(bad)", { XX } },
6475 { "(bad)", { XX } },
6476 { "(bad)", { XX } },
6477 { "(bad)", { XX } },
6478 { "(bad)", { XX } },
6479 /* b8 */
6480 { "(bad)", { XX } },
6481 { "(bad)", { XX } },
6482 { "(bad)", { XX } },
6483 { "(bad)", { XX } },
6484 { "(bad)", { XX } },
6485 { "(bad)", { XX } },
6486 { "(bad)", { XX } },
6487 { "(bad)", { XX } },
6488 /* c0 */
6489 { "(bad)", { XX } },
6490 { "(bad)", { XX } },
6491 { "(bad)", { XX } },
6492 { "(bad)", { XX } },
6493 { "(bad)", { XX } },
6494 { "(bad)", { XX } },
6495 { "(bad)", { XX } },
6496 { "(bad)", { XX } },
6497 /* c8 */
6498 { "(bad)", { XX } },
6499 { "(bad)", { XX } },
6500 { "(bad)", { XX } },
6501 { "(bad)", { XX } },
6502 { "(bad)", { XX } },
6503 { "(bad)", { XX } },
6504 { "(bad)", { XX } },
6505 { "(bad)", { XX } },
6506 /* d0 */
6507 { "(bad)", { XX } },
6508 { "(bad)", { XX } },
6509 { "(bad)", { XX } },
6510 { "(bad)", { XX } },
6511 { "(bad)", { XX } },
6512 { "(bad)", { XX } },
6513 { "(bad)", { XX } },
6514 { "(bad)", { XX } },
6515 /* d8 */
6516 { "(bad)", { XX } },
6517 { "(bad)", { XX } },
6518 { "(bad)", { XX } },
6519 { "(bad)", { XX } },
6520 { "(bad)", { XX } },
6521 { "(bad)", { XX } },
6522 { "(bad)", { XX } },
6523 { "(bad)", { XX } },
6524 /* e0 */
6525 { "(bad)", { XX } },
6526 { "(bad)", { XX } },
6527 { "(bad)", { XX } },
6528 { "(bad)", { XX } },
6529 { "(bad)", { XX } },
6530 { "(bad)", { XX } },
6531 { "(bad)", { XX } },
6532 { "(bad)", { XX } },
6533 /* e8 */
6534 { "(bad)", { XX } },
6535 { "(bad)", { XX } },
6536 { "(bad)", { XX } },
6537 { "(bad)", { XX } },
6538 { "(bad)", { XX } },
6539 { "(bad)", { XX } },
6540 { "(bad)", { XX } },
6541 { "(bad)", { XX } },
6542 /* f0 */
6543 { "(bad)", { XX } },
6544 { "(bad)", { XX } },
6545 { "(bad)", { XX } },
6546 { "(bad)", { XX } },
6547 { "(bad)", { XX } },
6548 { "(bad)", { XX } },
6549 { "(bad)", { XX } },
6550 { "(bad)", { XX } },
6551 /* f8 */
6552 { "(bad)", { XX } },
6553 { "(bad)", { XX } },
6554 { "(bad)", { XX } },
6555 { "(bad)", { XX } },
6556 { "(bad)", { XX } },
6557 { "(bad)", { XX } },
6558 { "(bad)", { XX } },
6559 { "(bad)", { XX } },
6560 },
6561 /* THREE_BYTE_0F7B */
6562 {
6563 /* 00 */
6564 { "(bad)", { XX } },
6565 { "(bad)", { XX } },
6566 { "(bad)", { XX } },
6567 { "(bad)", { XX } },
6568 { "(bad)", { XX } },
6569 { "(bad)", { XX } },
6570 { "(bad)", { XX } },
6571 { "(bad)", { XX } },
6572 /* 08 */
6573 { "(bad)", { XX } },
6574 { "(bad)", { XX } },
6575 { "(bad)", { XX } },
6576 { "(bad)", { XX } },
6577 { "(bad)", { XX } },
6578 { "(bad)", { XX } },
6579 { "(bad)", { XX } },
6580 { "(bad)", { XX } },
6581 /* 10 */
6582 { "(bad)", { XX } },
6583 { "(bad)", { XX } },
6584 { "(bad)", { XX } },
6585 { "(bad)", { XX } },
6586 { "(bad)", { XX } },
6587 { "(bad)", { XX } },
6588 { "(bad)", { XX } },
6589 { "(bad)", { XX } },
6590 /* 18 */
6591 { "(bad)", { XX } },
6592 { "(bad)", { XX } },
6593 { "(bad)", { XX } },
6594 { "(bad)", { XX } },
6595 { "(bad)", { XX } },
6596 { "(bad)", { XX } },
6597 { "(bad)", { XX } },
6598 { "(bad)", { XX } },
6599 /* 20 */
6600 { "(bad)", { XX } },
6601 { "(bad)", { XX } },
6602 { "(bad)", { XX } },
6603 { "(bad)", { XX } },
6604 { "(bad)", { XX } },
6605 { "(bad)", { XX } },
6606 { "(bad)", { XX } },
6607 { "(bad)", { XX } },
6608 /* 28 */
6609 { "(bad)", { XX } },
6610 { "(bad)", { XX } },
6611 { "(bad)", { XX } },
6612 { "(bad)", { XX } },
6613 { "(bad)", { XX } },
6614 { "(bad)", { XX } },
6615 { "(bad)", { XX } },
6616 { "(bad)", { XX } },
6617 /* 30 */
6618 { "(bad)", { XX } },
6619 { "(bad)", { XX } },
6620 { "(bad)", { XX } },
6621 { "(bad)", { XX } },
6622 { "(bad)", { XX } },
6623 { "(bad)", { XX } },
6624 { "(bad)", { XX } },
6625 { "(bad)", { XX } },
6626 /* 38 */
6627 { "(bad)", { XX } },
6628 { "(bad)", { XX } },
6629 { "(bad)", { XX } },
6630 { "(bad)", { XX } },
6631 { "(bad)", { XX } },
6632 { "(bad)", { XX } },
6633 { "(bad)", { XX } },
6634 { "(bad)", { XX } },
6635 /* 40 */
6636 { "protb", { XM, EXq, Ib } },
6637 { "protw", { XM, EXq, Ib } },
6638 { "protd", { XM, EXq, Ib } },
6639 { "protq", { XM, EXq, Ib } },
6640 { "pshlb", { XM, EXq, Ib } },
6641 { "pshlw", { XM, EXq, Ib } },
6642 { "pshld", { XM, EXq, Ib } },
6643 { "pshlq", { XM, EXq, Ib } },
6644 /* 48 */
6645 { "pshab", { XM, EXq, Ib } },
6646 { "pshaw", { XM, EXq, Ib } },
6647 { "pshad", { XM, EXq, Ib } },
6648 { "pshaq", { XM, EXq, Ib } },
6649 { "(bad)", { XX } },
6650 { "(bad)", { XX } },
6651 { "(bad)", { XX } },
6652 { "(bad)", { XX } },
6653 /* 50 */
6654 { "(bad)", { XX } },
6655 { "(bad)", { XX } },
6656 { "(bad)", { XX } },
6657 { "(bad)", { XX } },
6658 { "(bad)", { XX } },
6659 { "(bad)", { XX } },
6660 { "(bad)", { XX } },
6661 { "(bad)", { XX } },
6662 /* 58 */
6663 { "(bad)", { XX } },
6664 { "(bad)", { XX } },
6665 { "(bad)", { XX } },
6666 { "(bad)", { XX } },
6667 { "(bad)", { XX } },
6668 { "(bad)", { XX } },
6669 { "(bad)", { XX } },
6670 { "(bad)", { XX } },
6671 /* 60 */
6672 { "(bad)", { XX } },
6673 { "(bad)", { XX } },
6674 { "(bad)", { XX } },
6675 { "(bad)", { XX } },
6676 { "(bad)", { XX } },
6677 { "(bad)", { XX } },
6678 { "(bad)", { XX } },
6679 { "(bad)", { XX } },
6680 /* 68 */
6681 { "(bad)", { XX } },
6682 { "(bad)", { XX } },
6683 { "(bad)", { XX } },
6684 { "(bad)", { XX } },
6685 { "(bad)", { XX } },
6686 { "(bad)", { XX } },
6687 { "(bad)", { XX } },
6688 { "(bad)", { XX } },
6689 /* 70 */
6690 { "(bad)", { XX } },
6691 { "(bad)", { XX } },
6692 { "(bad)", { XX } },
6693 { "(bad)", { XX } },
6694 { "(bad)", { XX } },
6695 { "(bad)", { XX } },
6696 { "(bad)", { XX } },
6697 { "(bad)", { XX } },
6698 /* 78 */
6699 { "(bad)", { XX } },
6700 { "(bad)", { XX } },
6701 { "(bad)", { XX } },
6702 { "(bad)", { XX } },
6703 { "(bad)", { XX } },
6704 { "(bad)", { XX } },
6705 { "(bad)", { XX } },
6706 { "(bad)", { XX } },
6707 /* 80 */
6708 { "(bad)", { XX } },
6709 { "(bad)", { XX } },
6710 { "(bad)", { XX } },
6711 { "(bad)", { XX } },
6712 { "(bad)", { XX } },
6713 { "(bad)", { XX } },
6714 { "(bad)", { XX } },
6715 { "(bad)", { XX } },
6716 /* 88 */
6717 { "(bad)", { XX } },
6718 { "(bad)", { XX } },
6719 { "(bad)", { XX } },
6720 { "(bad)", { XX } },
6721 { "(bad)", { XX } },
6722 { "(bad)", { XX } },
6723 { "(bad)", { XX } },
6724 { "(bad)", { XX } },
6725 /* 90 */
6726 { "(bad)", { XX } },
6727 { "(bad)", { XX } },
6728 { "(bad)", { XX } },
6729 { "(bad)", { XX } },
6730 { "(bad)", { XX } },
6731 { "(bad)", { XX } },
6732 { "(bad)", { XX } },
6733 { "(bad)", { XX } },
6734 /* 98 */
6735 { "(bad)", { XX } },
6736 { "(bad)", { XX } },
6737 { "(bad)", { XX } },
6738 { "(bad)", { XX } },
6739 { "(bad)", { XX } },
6740 { "(bad)", { XX } },
6741 { "(bad)", { XX } },
6742 { "(bad)", { XX } },
6743 /* a0 */
6744 { "(bad)", { XX } },
6745 { "(bad)", { XX } },
6746 { "(bad)", { XX } },
6747 { "(bad)", { XX } },
6748 { "(bad)", { XX } },
6749 { "(bad)", { XX } },
6750 { "(bad)", { XX } },
6751 { "(bad)", { XX } },
6752 /* a8 */
6753 { "(bad)", { XX } },
6754 { "(bad)", { XX } },
6755 { "(bad)", { XX } },
6756 { "(bad)", { XX } },
6757 { "(bad)", { XX } },
6758 { "(bad)", { XX } },
6759 { "(bad)", { XX } },
6760 { "(bad)", { XX } },
6761 /* b0 */
6762 { "(bad)", { XX } },
6763 { "(bad)", { XX } },
6764 { "(bad)", { XX } },
6765 { "(bad)", { XX } },
6766 { "(bad)", { XX } },
6767 { "(bad)", { XX } },
6768 { "(bad)", { XX } },
6769 { "(bad)", { XX } },
6770 /* b8 */
6771 { "(bad)", { XX } },
6772 { "(bad)", { XX } },
6773 { "(bad)", { XX } },
6774 { "(bad)", { XX } },
6775 { "(bad)", { XX } },
6776 { "(bad)", { XX } },
6777 { "(bad)", { XX } },
6778 { "(bad)", { XX } },
6779 /* c0 */
6780 { "(bad)", { XX } },
6781 { "(bad)", { XX } },
6782 { "(bad)", { XX } },
6783 { "(bad)", { XX } },
6784 { "(bad)", { XX } },
6785 { "(bad)", { XX } },
6786 { "(bad)", { XX } },
6787 { "(bad)", { XX } },
6788 /* c8 */
6789 { "(bad)", { XX } },
6790 { "(bad)", { XX } },
6791 { "(bad)", { XX } },
6792 { "(bad)", { XX } },
6793 { "(bad)", { XX } },
6794 { "(bad)", { XX } },
6795 { "(bad)", { XX } },
6796 { "(bad)", { XX } },
6797 /* d0 */
6798 { "(bad)", { XX } },
6799 { "(bad)", { XX } },
6800 { "(bad)", { XX } },
6801 { "(bad)", { XX } },
6802 { "(bad)", { XX } },
6803 { "(bad)", { XX } },
6804 { "(bad)", { XX } },
6805 { "(bad)", { XX } },
6806 /* d8 */
6807 { "(bad)", { XX } },
6808 { "(bad)", { XX } },
6809 { "(bad)", { XX } },
6810 { "(bad)", { XX } },
6811 { "(bad)", { XX } },
6812 { "(bad)", { XX } },
6813 { "(bad)", { XX } },
6814 { "(bad)", { XX } },
6815 /* e0 */
6816 { "(bad)", { XX } },
6817 { "(bad)", { XX } },
6818 { "(bad)", { XX } },
6819 { "(bad)", { XX } },
6820 { "(bad)", { XX } },
6821 { "(bad)", { XX } },
6822 { "(bad)", { XX } },
6823 { "(bad)", { XX } },
6824 /* e8 */
6825 { "(bad)", { XX } },
6826 { "(bad)", { XX } },
6827 { "(bad)", { XX } },
6828 { "(bad)", { XX } },
6829 { "(bad)", { XX } },
6830 { "(bad)", { XX } },
6831 { "(bad)", { XX } },
6832 { "(bad)", { XX } },
6833 /* f0 */
6834 { "(bad)", { XX } },
6835 { "(bad)", { XX } },
6836 { "(bad)", { XX } },
6837 { "(bad)", { XX } },
6838 { "(bad)", { XX } },
6839 { "(bad)", { XX } },
6840 { "(bad)", { XX } },
6841 { "(bad)", { XX } },
6842 /* f8 */
6843 { "(bad)", { XX } },
6844 { "(bad)", { XX } },
6845 { "(bad)", { XX } },
6846 { "(bad)", { XX } },
6847 { "(bad)", { XX } },
6848 { "(bad)", { XX } },
6849 { "(bad)", { XX } },
6850 { "(bad)", { XX } },
6851 },
6852 };
6853
6854 static const struct dis386 vex_table[][256] = {
6855 /* VEX_0F */
6856 {
6857 /* 00 */
6858 { "(bad)", { XX } },
6859 { "(bad)", { XX } },
6860 { "(bad)", { XX } },
6861 { "(bad)", { XX } },
6862 { "(bad)", { XX } },
6863 { "(bad)", { XX } },
6864 { "(bad)", { XX } },
6865 { "(bad)", { XX } },
6866 /* 08 */
6867 { "(bad)", { XX } },
6868 { "(bad)", { XX } },
6869 { "(bad)", { XX } },
6870 { "(bad)", { XX } },
6871 { "(bad)", { XX } },
6872 { "(bad)", { XX } },
6873 { "(bad)", { XX } },
6874 { "(bad)", { XX } },
6875 /* 10 */
6876 { PREFIX_TABLE (PREFIX_VEX_10) },
6877 { PREFIX_TABLE (PREFIX_VEX_11) },
6878 { PREFIX_TABLE (PREFIX_VEX_12) },
6879 { MOD_TABLE (MOD_VEX_13) },
6880 { "vunpcklpX", { XM, Vex, EXx } },
6881 { "vunpckhpX", { XM, Vex, EXx } },
6882 { PREFIX_TABLE (PREFIX_VEX_16) },
6883 { MOD_TABLE (MOD_VEX_17) },
6884 /* 18 */
6885 { "(bad)", { XX } },
6886 { "(bad)", { XX } },
6887 { "(bad)", { XX } },
6888 { "(bad)", { XX } },
6889 { "(bad)", { XX } },
6890 { "(bad)", { XX } },
6891 { "(bad)", { XX } },
6892 { "(bad)", { XX } },
6893 /* 20 */
6894 { "(bad)", { XX } },
6895 { "(bad)", { XX } },
6896 { "(bad)", { XX } },
6897 { "(bad)", { XX } },
6898 { "(bad)", { XX } },
6899 { "(bad)", { XX } },
6900 { "(bad)", { XX } },
6901 { "(bad)", { XX } },
6902 /* 28 */
6903 { "vmovapX", { XM, EXx } },
6904 { "vmovapX", { EXx, XM } },
6905 { PREFIX_TABLE (PREFIX_VEX_2A) },
6906 { MOD_TABLE (MOD_VEX_2B) },
6907 { PREFIX_TABLE (PREFIX_VEX_2C) },
6908 { PREFIX_TABLE (PREFIX_VEX_2D) },
6909 { PREFIX_TABLE (PREFIX_VEX_2E) },
6910 { PREFIX_TABLE (PREFIX_VEX_2F) },
6911 /* 30 */
6912 { "(bad)", { XX } },
6913 { "(bad)", { XX } },
6914 { "(bad)", { XX } },
6915 { "(bad)", { XX } },
6916 { "(bad)", { XX } },
6917 { "(bad)", { XX } },
6918 { "(bad)", { XX } },
6919 { "(bad)", { XX } },
6920 /* 38 */
6921 { "(bad)", { XX } },
6922 { "(bad)", { XX } },
6923 { "(bad)", { XX } },
6924 { "(bad)", { XX } },
6925 { "(bad)", { XX } },
6926 { "(bad)", { XX } },
6927 { "(bad)", { XX } },
6928 { "(bad)", { XX } },
6929 /* 40 */
6930 { "(bad)", { XX } },
6931 { "(bad)", { XX } },
6932 { "(bad)", { XX } },
6933 { "(bad)", { XX } },
6934 { "(bad)", { XX } },
6935 { "(bad)", { XX } },
6936 { "(bad)", { XX } },
6937 { "(bad)", { XX } },
6938 /* 48 */
6939 { "(bad)", { XX } },
6940 { "(bad)", { XX } },
6941 { "(bad)", { XX } },
6942 { "(bad)", { XX } },
6943 { "(bad)", { XX } },
6944 { "(bad)", { XX } },
6945 { "(bad)", { XX } },
6946 { "(bad)", { XX } },
6947 /* 50 */
6948 { MOD_TABLE (MOD_VEX_51) },
6949 { PREFIX_TABLE (PREFIX_VEX_51) },
6950 { PREFIX_TABLE (PREFIX_VEX_52) },
6951 { PREFIX_TABLE (PREFIX_VEX_53) },
6952 { "vandpX", { XM, Vex, EXx } },
6953 { "vandnpX", { XM, Vex, EXx } },
6954 { "vorpX", { XM, Vex, EXx } },
6955 { "vxorpX", { XM, Vex, EXx } },
6956 /* 58 */
6957 { PREFIX_TABLE (PREFIX_VEX_58) },
6958 { PREFIX_TABLE (PREFIX_VEX_59) },
6959 { PREFIX_TABLE (PREFIX_VEX_5A) },
6960 { PREFIX_TABLE (PREFIX_VEX_5B) },
6961 { PREFIX_TABLE (PREFIX_VEX_5C) },
6962 { PREFIX_TABLE (PREFIX_VEX_5D) },
6963 { PREFIX_TABLE (PREFIX_VEX_5E) },
6964 { PREFIX_TABLE (PREFIX_VEX_5F) },
6965 /* 60 */
6966 { PREFIX_TABLE (PREFIX_VEX_60) },
6967 { PREFIX_TABLE (PREFIX_VEX_61) },
6968 { PREFIX_TABLE (PREFIX_VEX_62) },
6969 { PREFIX_TABLE (PREFIX_VEX_63) },
6970 { PREFIX_TABLE (PREFIX_VEX_64) },
6971 { PREFIX_TABLE (PREFIX_VEX_65) },
6972 { PREFIX_TABLE (PREFIX_VEX_66) },
6973 { PREFIX_TABLE (PREFIX_VEX_67) },
6974 /* 68 */
6975 { PREFIX_TABLE (PREFIX_VEX_68) },
6976 { PREFIX_TABLE (PREFIX_VEX_69) },
6977 { PREFIX_TABLE (PREFIX_VEX_6A) },
6978 { PREFIX_TABLE (PREFIX_VEX_6B) },
6979 { PREFIX_TABLE (PREFIX_VEX_6C) },
6980 { PREFIX_TABLE (PREFIX_VEX_6D) },
6981 { PREFIX_TABLE (PREFIX_VEX_6E) },
6982 { PREFIX_TABLE (PREFIX_VEX_6F) },
6983 /* 70 */
6984 { PREFIX_TABLE (PREFIX_VEX_70) },
6985 { REG_TABLE (REG_VEX_71) },
6986 { REG_TABLE (REG_VEX_72) },
6987 { REG_TABLE (REG_VEX_73) },
6988 { PREFIX_TABLE (PREFIX_VEX_74) },
6989 { PREFIX_TABLE (PREFIX_VEX_75) },
6990 { PREFIX_TABLE (PREFIX_VEX_76) },
6991 { PREFIX_TABLE (PREFIX_VEX_77) },
6992 /* 78 */
6993 { "(bad)", { XX } },
6994 { "(bad)", { XX } },
6995 { "(bad)", { XX } },
6996 { "(bad)", { XX } },
6997 { PREFIX_TABLE (PREFIX_VEX_7C) },
6998 { PREFIX_TABLE (PREFIX_VEX_7D) },
6999 { PREFIX_TABLE (PREFIX_VEX_7E) },
7000 { PREFIX_TABLE (PREFIX_VEX_7F) },
7001 /* 80 */
7002 { "(bad)", { XX } },
7003 { "(bad)", { XX } },
7004 { "(bad)", { XX } },
7005 { "(bad)", { XX } },
7006 { "(bad)", { XX } },
7007 { "(bad)", { XX } },
7008 { "(bad)", { XX } },
7009 { "(bad)", { XX } },
7010 /* 88 */
7011 { "(bad)", { XX } },
7012 { "(bad)", { XX } },
7013 { "(bad)", { XX } },
7014 { "(bad)", { XX } },
7015 { "(bad)", { XX } },
7016 { "(bad)", { XX } },
7017 { "(bad)", { XX } },
7018 { "(bad)", { XX } },
7019 /* 90 */
7020 { "(bad)", { XX } },
7021 { "(bad)", { XX } },
7022 { "(bad)", { XX } },
7023 { "(bad)", { XX } },
7024 { "(bad)", { XX } },
7025 { "(bad)", { XX } },
7026 { "(bad)", { XX } },
7027 { "(bad)", { XX } },
7028 /* 98 */
7029 { "(bad)", { XX } },
7030 { "(bad)", { XX } },
7031 { "(bad)", { XX } },
7032 { "(bad)", { XX } },
7033 { "(bad)", { XX } },
7034 { "(bad)", { XX } },
7035 { "(bad)", { XX } },
7036 { "(bad)", { XX } },
7037 /* a0 */
7038 { "(bad)", { XX } },
7039 { "(bad)", { XX } },
7040 { "(bad)", { XX } },
7041 { "(bad)", { XX } },
7042 { "(bad)", { XX } },
7043 { "(bad)", { XX } },
7044 { "(bad)", { XX } },
7045 { "(bad)", { XX } },
7046 /* a8 */
7047 { "(bad)", { XX } },
7048 { "(bad)", { XX } },
7049 { "(bad)", { XX } },
7050 { "(bad)", { XX } },
7051 { "(bad)", { XX } },
7052 { "(bad)", { XX } },
7053 { REG_TABLE (REG_VEX_AE) },
7054 { "(bad)", { XX } },
7055 /* b0 */
7056 { "(bad)", { XX } },
7057 { "(bad)", { XX } },
7058 { "(bad)", { XX } },
7059 { "(bad)", { XX } },
7060 { "(bad)", { XX } },
7061 { "(bad)", { XX } },
7062 { "(bad)", { XX } },
7063 { "(bad)", { XX } },
7064 /* b8 */
7065 { "(bad)", { XX } },
7066 { "(bad)", { XX } },
7067 { "(bad)", { XX } },
7068 { "(bad)", { XX } },
7069 { "(bad)", { XX } },
7070 { "(bad)", { XX } },
7071 { "(bad)", { XX } },
7072 { "(bad)", { XX } },
7073 /* c0 */
7074 { "(bad)", { XX } },
7075 { "(bad)", { XX } },
7076 { PREFIX_TABLE (PREFIX_VEX_C2) },
7077 { "(bad)", { XX } },
7078 { PREFIX_TABLE (PREFIX_VEX_C4) },
7079 { PREFIX_TABLE (PREFIX_VEX_C5) },
7080 { "vshufpX", { XM, Vex, EXx, Ib } },
7081 { "(bad)", { XX } },
7082 /* c8 */
7083 { "(bad)", { XX } },
7084 { "(bad)", { XX } },
7085 { "(bad)", { XX } },
7086 { "(bad)", { XX } },
7087 { "(bad)", { XX } },
7088 { "(bad)", { XX } },
7089 { "(bad)", { XX } },
7090 { "(bad)", { XX } },
7091 /* d0 */
7092 { PREFIX_TABLE (PREFIX_VEX_D0) },
7093 { PREFIX_TABLE (PREFIX_VEX_D1) },
7094 { PREFIX_TABLE (PREFIX_VEX_D2) },
7095 { PREFIX_TABLE (PREFIX_VEX_D3) },
7096 { PREFIX_TABLE (PREFIX_VEX_D4) },
7097 { PREFIX_TABLE (PREFIX_VEX_D5) },
7098 { PREFIX_TABLE (PREFIX_VEX_D6) },
7099 { PREFIX_TABLE (PREFIX_VEX_D7) },
7100 /* d8 */
7101 { PREFIX_TABLE (PREFIX_VEX_D8) },
7102 { PREFIX_TABLE (PREFIX_VEX_D9) },
7103 { PREFIX_TABLE (PREFIX_VEX_DA) },
7104 { PREFIX_TABLE (PREFIX_VEX_DB) },
7105 { PREFIX_TABLE (PREFIX_VEX_DC) },
7106 { PREFIX_TABLE (PREFIX_VEX_DD) },
7107 { PREFIX_TABLE (PREFIX_VEX_DE) },
7108 { PREFIX_TABLE (PREFIX_VEX_DF) },
7109 /* e0 */
7110 { PREFIX_TABLE (PREFIX_VEX_E0) },
7111 { PREFIX_TABLE (PREFIX_VEX_E1) },
7112 { PREFIX_TABLE (PREFIX_VEX_E2) },
7113 { PREFIX_TABLE (PREFIX_VEX_E3) },
7114 { PREFIX_TABLE (PREFIX_VEX_E4) },
7115 { PREFIX_TABLE (PREFIX_VEX_E5) },
7116 { PREFIX_TABLE (PREFIX_VEX_E6) },
7117 { PREFIX_TABLE (PREFIX_VEX_E7) },
7118 /* e8 */
7119 { PREFIX_TABLE (PREFIX_VEX_E8) },
7120 { PREFIX_TABLE (PREFIX_VEX_E9) },
7121 { PREFIX_TABLE (PREFIX_VEX_EA) },
7122 { PREFIX_TABLE (PREFIX_VEX_EB) },
7123 { PREFIX_TABLE (PREFIX_VEX_EC) },
7124 { PREFIX_TABLE (PREFIX_VEX_ED) },
7125 { PREFIX_TABLE (PREFIX_VEX_EE) },
7126 { PREFIX_TABLE (PREFIX_VEX_EF) },
7127 /* f0 */
7128 { PREFIX_TABLE (PREFIX_VEX_F0) },
7129 { PREFIX_TABLE (PREFIX_VEX_F1) },
7130 { PREFIX_TABLE (PREFIX_VEX_F2) },
7131 { PREFIX_TABLE (PREFIX_VEX_F3) },
7132 { PREFIX_TABLE (PREFIX_VEX_F4) },
7133 { PREFIX_TABLE (PREFIX_VEX_F5) },
7134 { PREFIX_TABLE (PREFIX_VEX_F6) },
7135 { PREFIX_TABLE (PREFIX_VEX_F7) },
7136 /* f8 */
7137 { PREFIX_TABLE (PREFIX_VEX_F8) },
7138 { PREFIX_TABLE (PREFIX_VEX_F9) },
7139 { PREFIX_TABLE (PREFIX_VEX_FA) },
7140 { PREFIX_TABLE (PREFIX_VEX_FB) },
7141 { PREFIX_TABLE (PREFIX_VEX_FC) },
7142 { PREFIX_TABLE (PREFIX_VEX_FD) },
7143 { PREFIX_TABLE (PREFIX_VEX_FE) },
7144 { "(bad)", { XX } },
7145 },
7146 /* VEX_0F38 */
7147 {
7148 /* 00 */
7149 { PREFIX_TABLE (PREFIX_VEX_3800) },
7150 { PREFIX_TABLE (PREFIX_VEX_3801) },
7151 { PREFIX_TABLE (PREFIX_VEX_3802) },
7152 { PREFIX_TABLE (PREFIX_VEX_3803) },
7153 { PREFIX_TABLE (PREFIX_VEX_3804) },
7154 { PREFIX_TABLE (PREFIX_VEX_3805) },
7155 { PREFIX_TABLE (PREFIX_VEX_3806) },
7156 { PREFIX_TABLE (PREFIX_VEX_3807) },
7157 /* 08 */
7158 { PREFIX_TABLE (PREFIX_VEX_3808) },
7159 { PREFIX_TABLE (PREFIX_VEX_3809) },
7160 { PREFIX_TABLE (PREFIX_VEX_380A) },
7161 { PREFIX_TABLE (PREFIX_VEX_380B) },
7162 { PREFIX_TABLE (PREFIX_VEX_380C) },
7163 { PREFIX_TABLE (PREFIX_VEX_380D) },
7164 { PREFIX_TABLE (PREFIX_VEX_380E) },
7165 { PREFIX_TABLE (PREFIX_VEX_380F) },
7166 /* 10 */
7167 { "(bad)", { XX } },
7168 { "(bad)", { XX } },
7169 { "(bad)", { XX } },
7170 { "(bad)", { XX } },
7171 { "(bad)", { XX } },
7172 { "(bad)", { XX } },
7173 { "(bad)", { XX } },
7174 { PREFIX_TABLE (PREFIX_VEX_3817) },
7175 /* 18 */
7176 { PREFIX_TABLE (PREFIX_VEX_3818) },
7177 { PREFIX_TABLE (PREFIX_VEX_3819) },
7178 { PREFIX_TABLE (PREFIX_VEX_381A) },
7179 { "(bad)", { XX } },
7180 { PREFIX_TABLE (PREFIX_VEX_381C) },
7181 { PREFIX_TABLE (PREFIX_VEX_381D) },
7182 { PREFIX_TABLE (PREFIX_VEX_381E) },
7183 { "(bad)", { XX } },
7184 /* 20 */
7185 { PREFIX_TABLE (PREFIX_VEX_3820) },
7186 { PREFIX_TABLE (PREFIX_VEX_3821) },
7187 { PREFIX_TABLE (PREFIX_VEX_3822) },
7188 { PREFIX_TABLE (PREFIX_VEX_3823) },
7189 { PREFIX_TABLE (PREFIX_VEX_3824) },
7190 { PREFIX_TABLE (PREFIX_VEX_3825) },
7191 { "(bad)", { XX } },
7192 { "(bad)", { XX } },
7193 /* 28 */
7194 { PREFIX_TABLE (PREFIX_VEX_3828) },
7195 { PREFIX_TABLE (PREFIX_VEX_3829) },
7196 { PREFIX_TABLE (PREFIX_VEX_382A) },
7197 { PREFIX_TABLE (PREFIX_VEX_382B) },
7198 { PREFIX_TABLE (PREFIX_VEX_382C) },
7199 { PREFIX_TABLE (PREFIX_VEX_382D) },
7200 { PREFIX_TABLE (PREFIX_VEX_382E) },
7201 { PREFIX_TABLE (PREFIX_VEX_382F) },
7202 /* 30 */
7203 { PREFIX_TABLE (PREFIX_VEX_3830) },
7204 { PREFIX_TABLE (PREFIX_VEX_3831) },
7205 { PREFIX_TABLE (PREFIX_VEX_3832) },
7206 { PREFIX_TABLE (PREFIX_VEX_3833) },
7207 { PREFIX_TABLE (PREFIX_VEX_3834) },
7208 { PREFIX_TABLE (PREFIX_VEX_3835) },
7209 { "(bad)", { XX } },
7210 { PREFIX_TABLE (PREFIX_VEX_3837) },
7211 /* 38 */
7212 { PREFIX_TABLE (PREFIX_VEX_3838) },
7213 { PREFIX_TABLE (PREFIX_VEX_3839) },
7214 { PREFIX_TABLE (PREFIX_VEX_383A) },
7215 { PREFIX_TABLE (PREFIX_VEX_383B) },
7216 { PREFIX_TABLE (PREFIX_VEX_383C) },
7217 { PREFIX_TABLE (PREFIX_VEX_383D) },
7218 { PREFIX_TABLE (PREFIX_VEX_383E) },
7219 { PREFIX_TABLE (PREFIX_VEX_383F) },
7220 /* 40 */
7221 { PREFIX_TABLE (PREFIX_VEX_3840) },
7222 { PREFIX_TABLE (PREFIX_VEX_3841) },
7223 { "(bad)", { XX } },
7224 { "(bad)", { XX } },
7225 { "(bad)", { XX } },
7226 { "(bad)", { XX } },
7227 { "(bad)", { XX } },
7228 { "(bad)", { XX } },
7229 /* 48 */
7230 { "(bad)", { XX } },
7231 { "(bad)", { XX } },
7232 { "(bad)", { XX } },
7233 { "(bad)", { XX } },
7234 { "(bad)", { XX } },
7235 { "(bad)", { XX } },
7236 { "(bad)", { XX } },
7237 { "(bad)", { XX } },
7238 /* 50 */
7239 { "(bad)", { XX } },
7240 { "(bad)", { XX } },
7241 { "(bad)", { XX } },
7242 { "(bad)", { XX } },
7243 { "(bad)", { XX } },
7244 { "(bad)", { XX } },
7245 { "(bad)", { XX } },
7246 { "(bad)", { XX } },
7247 /* 58 */
7248 { "(bad)", { XX } },
7249 { "(bad)", { XX } },
7250 { "(bad)", { XX } },
7251 { "(bad)", { XX } },
7252 { "(bad)", { XX } },
7253 { "(bad)", { XX } },
7254 { "(bad)", { XX } },
7255 { "(bad)", { XX } },
7256 /* 60 */
7257 { "(bad)", { XX } },
7258 { "(bad)", { XX } },
7259 { "(bad)", { XX } },
7260 { "(bad)", { XX } },
7261 { "(bad)", { XX } },
7262 { "(bad)", { XX } },
7263 { "(bad)", { XX } },
7264 { "(bad)", { XX } },
7265 /* 68 */
7266 { "(bad)", { XX } },
7267 { "(bad)", { XX } },
7268 { "(bad)", { XX } },
7269 { "(bad)", { XX } },
7270 { "(bad)", { XX } },
7271 { "(bad)", { XX } },
7272 { "(bad)", { XX } },
7273 { "(bad)", { XX } },
7274 /* 70 */
7275 { "(bad)", { XX } },
7276 { "(bad)", { XX } },
7277 { "(bad)", { XX } },
7278 { "(bad)", { XX } },
7279 { "(bad)", { XX } },
7280 { "(bad)", { XX } },
7281 { "(bad)", { XX } },
7282 { "(bad)", { XX } },
7283 /* 78 */
7284 { "(bad)", { XX } },
7285 { "(bad)", { XX } },
7286 { "(bad)", { XX } },
7287 { "(bad)", { XX } },
7288 { "(bad)", { XX } },
7289 { "(bad)", { XX } },
7290 { "(bad)", { XX } },
7291 { "(bad)", { XX } },
7292 /* 80 */
7293 { "(bad)", { XX } },
7294 { "(bad)", { XX } },
7295 { "(bad)", { XX } },
7296 { "(bad)", { XX } },
7297 { "(bad)", { XX } },
7298 { "(bad)", { XX } },
7299 { "(bad)", { XX } },
7300 { "(bad)", { XX } },
7301 /* 88 */
7302 { "(bad)", { XX } },
7303 { "(bad)", { XX } },
7304 { "(bad)", { XX } },
7305 { "(bad)", { XX } },
7306 { "(bad)", { XX } },
7307 { "(bad)", { XX } },
7308 { "(bad)", { XX } },
7309 { "(bad)", { XX } },
7310 /* 90 */
7311 { "(bad)", { XX } },
7312 { "(bad)", { XX } },
7313 { "(bad)", { XX } },
7314 { "(bad)", { XX } },
7315 { "(bad)", { XX } },
7316 { "(bad)", { XX } },
7317 { "(bad)", { XX } },
7318 { "(bad)", { XX } },
7319 /* 98 */
7320 { "(bad)", { XX } },
7321 { "(bad)", { XX } },
7322 { "(bad)", { XX } },
7323 { "(bad)", { XX } },
7324 { "(bad)", { XX } },
7325 { "(bad)", { XX } },
7326 { "(bad)", { XX } },
7327 { "(bad)", { XX } },
7328 /* a0 */
7329 { "(bad)", { XX } },
7330 { "(bad)", { XX } },
7331 { "(bad)", { XX } },
7332 { "(bad)", { XX } },
7333 { "(bad)", { XX } },
7334 { "(bad)", { XX } },
7335 { "(bad)", { XX } },
7336 { "(bad)", { XX } },
7337 /* a8 */
7338 { "(bad)", { XX } },
7339 { "(bad)", { XX } },
7340 { "(bad)", { XX } },
7341 { "(bad)", { XX } },
7342 { "(bad)", { XX } },
7343 { "(bad)", { XX } },
7344 { "(bad)", { XX } },
7345 { "(bad)", { XX } },
7346 /* b0 */
7347 { "(bad)", { XX } },
7348 { "(bad)", { XX } },
7349 { "(bad)", { XX } },
7350 { "(bad)", { XX } },
7351 { "(bad)", { XX } },
7352 { "(bad)", { XX } },
7353 { "(bad)", { XX } },
7354 { "(bad)", { XX } },
7355 /* b8 */
7356 { "(bad)", { XX } },
7357 { "(bad)", { XX } },
7358 { "(bad)", { XX } },
7359 { "(bad)", { XX } },
7360 { "(bad)", { XX } },
7361 { "(bad)", { XX } },
7362 { "(bad)", { XX } },
7363 { "(bad)", { XX } },
7364 /* c0 */
7365 { "(bad)", { XX } },
7366 { "(bad)", { XX } },
7367 { "(bad)", { XX } },
7368 { "(bad)", { XX } },
7369 { "(bad)", { XX } },
7370 { "(bad)", { XX } },
7371 { "(bad)", { XX } },
7372 { "(bad)", { XX } },
7373 /* c8 */
7374 { "(bad)", { XX } },
7375 { "(bad)", { XX } },
7376 { "(bad)", { XX } },
7377 { "(bad)", { XX } },
7378 { "(bad)", { XX } },
7379 { "(bad)", { XX } },
7380 { "(bad)", { XX } },
7381 { "(bad)", { XX } },
7382 /* d0 */
7383 { "(bad)", { XX } },
7384 { "(bad)", { XX } },
7385 { "(bad)", { XX } },
7386 { "(bad)", { XX } },
7387 { "(bad)", { XX } },
7388 { "(bad)", { XX } },
7389 { "(bad)", { XX } },
7390 { "(bad)", { XX } },
7391 /* d8 */
7392 { "(bad)", { XX } },
7393 { "(bad)", { XX } },
7394 { "(bad)", { XX } },
7395 { "(bad)", { XX } },
7396 { "(bad)", { XX } },
7397 { "(bad)", { XX } },
7398 { "(bad)", { XX } },
7399 { "(bad)", { XX } },
7400 /* e0 */
7401 { "(bad)", { XX } },
7402 { "(bad)", { XX } },
7403 { "(bad)", { XX } },
7404 { "(bad)", { XX } },
7405 { "(bad)", { XX } },
7406 { "(bad)", { XX } },
7407 { "(bad)", { XX } },
7408 { "(bad)", { XX } },
7409 /* e8 */
7410 { "(bad)", { XX } },
7411 { "(bad)", { XX } },
7412 { "(bad)", { XX } },
7413 { "(bad)", { XX } },
7414 { "(bad)", { XX } },
7415 { "(bad)", { XX } },
7416 { "(bad)", { XX } },
7417 { "(bad)", { XX } },
7418 /* f0 */
7419 { "(bad)", { XX } },
7420 { "(bad)", { XX } },
7421 { "(bad)", { XX } },
7422 { "(bad)", { XX } },
7423 { "(bad)", { XX } },
7424 { "(bad)", { XX } },
7425 { "(bad)", { XX } },
7426 { "(bad)", { XX } },
7427 /* f8 */
7428 { "(bad)", { XX } },
7429 { "(bad)", { XX } },
7430 { "(bad)", { XX } },
7431 { "(bad)", { XX } },
7432 { "(bad)", { XX } },
7433 { "(bad)", { XX } },
7434 { "(bad)", { XX } },
7435 { "(bad)", { XX } },
7436 },
7437 /* VEX_0F3A */
7438 {
7439 /* 00 */
7440 { "(bad)", { XX } },
7441 { "(bad)", { XX } },
7442 { "(bad)", { XX } },
7443 { "(bad)", { XX } },
7444 { PREFIX_TABLE (PREFIX_VEX_3A04) },
7445 { PREFIX_TABLE (PREFIX_VEX_3A05) },
7446 { PREFIX_TABLE (PREFIX_VEX_3A06) },
7447 { "(bad)", { XX } },
7448 /* 08 */
7449 { PREFIX_TABLE (PREFIX_VEX_3A08) },
7450 { PREFIX_TABLE (PREFIX_VEX_3A09) },
7451 { PREFIX_TABLE (PREFIX_VEX_3A0A) },
7452 { PREFIX_TABLE (PREFIX_VEX_3A0B) },
7453 { PREFIX_TABLE (PREFIX_VEX_3A0C) },
7454 { PREFIX_TABLE (PREFIX_VEX_3A0D) },
7455 { PREFIX_TABLE (PREFIX_VEX_3A0E) },
7456 { PREFIX_TABLE (PREFIX_VEX_3A0F) },
7457 /* 10 */
7458 { "(bad)", { XX } },
7459 { "(bad)", { XX } },
7460 { "(bad)", { XX } },
7461 { "(bad)", { XX } },
7462 { PREFIX_TABLE (PREFIX_VEX_3A14) },
7463 { PREFIX_TABLE (PREFIX_VEX_3A15) },
7464 { PREFIX_TABLE (PREFIX_VEX_3A16) },
7465 { PREFIX_TABLE (PREFIX_VEX_3A17) },
7466 /* 18 */
7467 { PREFIX_TABLE (PREFIX_VEX_3A18) },
7468 { PREFIX_TABLE (PREFIX_VEX_3A19) },
7469 { "(bad)", { XX } },
7470 { "(bad)", { XX } },
7471 { "(bad)", { XX } },
7472 { "(bad)", { XX } },
7473 { "(bad)", { XX } },
7474 { "(bad)", { XX } },
7475 /* 20 */
7476 { PREFIX_TABLE (PREFIX_VEX_3A20) },
7477 { PREFIX_TABLE (PREFIX_VEX_3A21) },
7478 { PREFIX_TABLE (PREFIX_VEX_3A22) },
7479 { "(bad)", { XX } },
7480 { "(bad)", { XX } },
7481 { "(bad)", { XX } },
7482 { "(bad)", { XX } },
7483 { "(bad)", { XX } },
7484 /* 28 */
7485 { "(bad)", { XX } },
7486 { "(bad)", { XX } },
7487 { "(bad)", { XX } },
7488 { "(bad)", { XX } },
7489 { "(bad)", { XX } },
7490 { "(bad)", { XX } },
7491 { "(bad)", { XX } },
7492 { "(bad)", { XX } },
7493 /* 30 */
7494 { "(bad)", { XX } },
7495 { "(bad)", { XX } },
7496 { "(bad)", { XX } },
7497 { "(bad)", { XX } },
7498 { "(bad)", { XX } },
7499 { "(bad)", { XX } },
7500 { "(bad)", { XX } },
7501 { "(bad)", { XX } },
7502 /* 38 */
7503 { "(bad)", { XX } },
7504 { "(bad)", { XX } },
7505 { "(bad)", { XX } },
7506 { "(bad)", { XX } },
7507 { "(bad)", { XX } },
7508 { "(bad)", { XX } },
7509 { "(bad)", { XX } },
7510 { "(bad)", { XX } },
7511 /* 40 */
7512 { PREFIX_TABLE (PREFIX_VEX_3A40) },
7513 { PREFIX_TABLE (PREFIX_VEX_3A41) },
7514 { PREFIX_TABLE (PREFIX_VEX_3A42) },
7515 { "(bad)", { XX } },
7516 { "(bad)", { XX } },
7517 { "(bad)", { XX } },
7518 { "(bad)", { XX } },
7519 { "(bad)", { XX } },
7520 /* 48 */
7521 { PREFIX_TABLE (PREFIX_VEX_3A48) },
7522 { PREFIX_TABLE (PREFIX_VEX_3A49) },
7523 { PREFIX_TABLE (PREFIX_VEX_3A4A) },
7524 { PREFIX_TABLE (PREFIX_VEX_3A4B) },
7525 { PREFIX_TABLE (PREFIX_VEX_3A4C) },
7526 { "(bad)", { XX } },
7527 { "(bad)", { XX } },
7528 { "(bad)", { XX } },
7529 /* 50 */
7530 { "(bad)", { XX } },
7531 { "(bad)", { XX } },
7532 { "(bad)", { XX } },
7533 { "(bad)", { XX } },
7534 { "(bad)", { XX } },
7535 { "(bad)", { XX } },
7536 { "(bad)", { XX } },
7537 { "(bad)", { XX } },
7538 /* 58 */
7539 { "(bad)", { XX } },
7540 { "(bad)", { XX } },
7541 { "(bad)", { XX } },
7542 { "(bad)", { XX } },
7543 { PREFIX_TABLE (PREFIX_VEX_3A5C) },
7544 { PREFIX_TABLE (PREFIX_VEX_3A5D) },
7545 { PREFIX_TABLE (PREFIX_VEX_3A5E) },
7546 { PREFIX_TABLE (PREFIX_VEX_3A5F) },
7547 /* 60 */
7548 { PREFIX_TABLE (PREFIX_VEX_3A60) },
7549 { PREFIX_TABLE (PREFIX_VEX_3A61) },
7550 { PREFIX_TABLE (PREFIX_VEX_3A62) },
7551 { PREFIX_TABLE (PREFIX_VEX_3A63) },
7552 { "(bad)", { XX } },
7553 { "(bad)", { XX } },
7554 { "(bad)", { XX } },
7555 { "(bad)", { XX } },
7556 /* 68 */
7557 { PREFIX_TABLE (PREFIX_VEX_3A68) },
7558 { PREFIX_TABLE (PREFIX_VEX_3A69) },
7559 { PREFIX_TABLE (PREFIX_VEX_3A6A) },
7560 { PREFIX_TABLE (PREFIX_VEX_3A6B) },
7561 { PREFIX_TABLE (PREFIX_VEX_3A6C) },
7562 { PREFIX_TABLE (PREFIX_VEX_3A6D) },
7563 { PREFIX_TABLE (PREFIX_VEX_3A6E) },
7564 { PREFIX_TABLE (PREFIX_VEX_3A6F) },
7565 /* 70 */
7566 { "(bad)", { XX } },
7567 { "(bad)", { XX } },
7568 { "(bad)", { XX } },
7569 { "(bad)", { XX } },
7570 { "(bad)", { XX } },
7571 { "(bad)", { XX } },
7572 { "(bad)", { XX } },
7573 { "(bad)", { XX } },
7574 /* 78 */
7575 { PREFIX_TABLE (PREFIX_VEX_3A78) },
7576 { PREFIX_TABLE (PREFIX_VEX_3A79) },
7577 { PREFIX_TABLE (PREFIX_VEX_3A7A) },
7578 { PREFIX_TABLE (PREFIX_VEX_3A7B) },
7579 { PREFIX_TABLE (PREFIX_VEX_3A7C) },
7580 { PREFIX_TABLE (PREFIX_VEX_3A7D) },
7581 { PREFIX_TABLE (PREFIX_VEX_3A7E) },
7582 { PREFIX_TABLE (PREFIX_VEX_3A7F) },
7583 /* 80 */
7584 { "(bad)", { XX } },
7585 { "(bad)", { XX } },
7586 { "(bad)", { XX } },
7587 { "(bad)", { XX } },
7588 { "(bad)", { XX } },
7589 { "(bad)", { XX } },
7590 { "(bad)", { XX } },
7591 { "(bad)", { XX } },
7592 /* 88 */
7593 { "(bad)", { XX } },
7594 { "(bad)", { XX } },
7595 { "(bad)", { XX } },
7596 { "(bad)", { XX } },
7597 { "(bad)", { XX } },
7598 { "(bad)", { XX } },
7599 { "(bad)", { XX } },
7600 { "(bad)", { XX } },
7601 /* 90 */
7602 { "(bad)", { XX } },
7603 { "(bad)", { XX } },
7604 { "(bad)", { XX } },
7605 { "(bad)", { XX } },
7606 { "(bad)", { XX } },
7607 { "(bad)", { XX } },
7608 { "(bad)", { XX } },
7609 { "(bad)", { XX } },
7610 /* 98 */
7611 { "(bad)", { XX } },
7612 { "(bad)", { XX } },
7613 { "(bad)", { XX } },
7614 { "(bad)", { XX } },
7615 { "(bad)", { XX } },
7616 { "(bad)", { XX } },
7617 { "(bad)", { XX } },
7618 { "(bad)", { XX } },
7619 /* a0 */
7620 { "(bad)", { XX } },
7621 { "(bad)", { XX } },
7622 { "(bad)", { XX } },
7623 { "(bad)", { XX } },
7624 { "(bad)", { XX } },
7625 { "(bad)", { XX } },
7626 { "(bad)", { XX } },
7627 { "(bad)", { XX } },
7628 /* a8 */
7629 { "(bad)", { XX } },
7630 { "(bad)", { XX } },
7631 { "(bad)", { XX } },
7632 { "(bad)", { XX } },
7633 { "(bad)", { XX } },
7634 { "(bad)", { XX } },
7635 { "(bad)", { XX } },
7636 { "(bad)", { XX } },
7637 /* b0 */
7638 { "(bad)", { XX } },
7639 { "(bad)", { XX } },
7640 { "(bad)", { XX } },
7641 { "(bad)", { XX } },
7642 { "(bad)", { XX } },
7643 { "(bad)", { XX } },
7644 { "(bad)", { XX } },
7645 { "(bad)", { XX } },
7646 /* b8 */
7647 { "(bad)", { XX } },
7648 { "(bad)", { XX } },
7649 { "(bad)", { XX } },
7650 { "(bad)", { XX } },
7651 { "(bad)", { XX } },
7652 { "(bad)", { XX } },
7653 { "(bad)", { XX } },
7654 { "(bad)", { XX } },
7655 /* c0 */
7656 { "(bad)", { XX } },
7657 { "(bad)", { XX } },
7658 { "(bad)", { XX } },
7659 { "(bad)", { XX } },
7660 { "(bad)", { XX } },
7661 { "(bad)", { XX } },
7662 { "(bad)", { XX } },
7663 { "(bad)", { XX } },
7664 /* c8 */
7665 { "(bad)", { XX } },
7666 { "(bad)", { XX } },
7667 { "(bad)", { XX } },
7668 { "(bad)", { XX } },
7669 { "(bad)", { XX } },
7670 { "(bad)", { XX } },
7671 { "(bad)", { XX } },
7672 { "(bad)", { XX } },
7673 /* d0 */
7674 { "(bad)", { XX } },
7675 { "(bad)", { XX } },
7676 { "(bad)", { XX } },
7677 { "(bad)", { XX } },
7678 { "(bad)", { XX } },
7679 { "(bad)", { XX } },
7680 { "(bad)", { XX } },
7681 { "(bad)", { XX } },
7682 /* d8 */
7683 { "(bad)", { XX } },
7684 { "(bad)", { XX } },
7685 { "(bad)", { XX } },
7686 { "(bad)", { XX } },
7687 { "(bad)", { XX } },
7688 { "(bad)", { XX } },
7689 { "(bad)", { XX } },
7690 { "(bad)", { XX } },
7691 /* e0 */
7692 { "(bad)", { XX } },
7693 { "(bad)", { XX } },
7694 { "(bad)", { XX } },
7695 { "(bad)", { XX } },
7696 { "(bad)", { XX } },
7697 { "(bad)", { XX } },
7698 { "(bad)", { XX } },
7699 { "(bad)", { XX } },
7700 /* e8 */
7701 { "(bad)", { XX } },
7702 { "(bad)", { XX } },
7703 { "(bad)", { XX } },
7704 { "(bad)", { XX } },
7705 { "(bad)", { XX } },
7706 { "(bad)", { XX } },
7707 { "(bad)", { XX } },
7708 { "(bad)", { XX } },
7709 /* f0 */
7710 { "(bad)", { XX } },
7711 { "(bad)", { XX } },
7712 { "(bad)", { XX } },
7713 { "(bad)", { XX } },
7714 { "(bad)", { XX } },
7715 { "(bad)", { XX } },
7716 { "(bad)", { XX } },
7717 { "(bad)", { XX } },
7718 /* f8 */
7719 { "(bad)", { XX } },
7720 { "(bad)", { XX } },
7721 { "(bad)", { XX } },
7722 { "(bad)", { XX } },
7723 { "(bad)", { XX } },
7724 { "(bad)", { XX } },
7725 { "(bad)", { XX } },
7726 { "(bad)", { XX } },
7727 },
7728 };
7729
7730 static const struct dis386 vex_len_table[][2] = {
7731 /* VEX_LEN_10_P_1 */
7732 {
7733 { "vmovss", { XMVex, Vex128, EXd } },
7734 { "(bad)", { XX } },
7735 },
7736
7737 /* VEX_LEN_10_P_3 */
7738 {
7739 { "vmovsd", { XMVex, Vex128, EXq } },
7740 { "(bad)", { XX } },
7741 },
7742
7743 /* VEX_LEN_11_P_1 */
7744 {
7745 { "vmovss", { EXdVex, Vex128, XM } },
7746 { "(bad)", { XX } },
7747 },
7748
7749 /* VEX_LEN_11_P_3 */
7750 {
7751 { "vmovsd", { EXqVex, Vex128, XM } },
7752 { "(bad)", { XX } },
7753 },
7754
7755 /* VEX_LEN_12_P_0_M_0 */
7756 {
7757 { "vmovlps", { XM, Vex128, EXq } },
7758 { "(bad)", { XX } },
7759 },
7760
7761 /* VEX_LEN_12_P_0_M_1 */
7762 {
7763 { "vmovhlps", { XM, Vex128, EXq } },
7764 { "(bad)", { XX } },
7765 },
7766
7767 /* VEX_LEN_12_P_2 */
7768 {
7769 { "vmovlpd", { XM, Vex128, EXq } },
7770 { "(bad)", { XX } },
7771 },
7772
7773 /* VEX_LEN_13_M_0 */
7774 {
7775 { "vmovlpX", { EXq, XM } },
7776 { "(bad)", { XX } },
7777 },
7778
7779 /* VEX_LEN_16_P_0_M_0 */
7780 {
7781 { "vmovhps", { XM, Vex128, EXq } },
7782 { "(bad)", { XX } },
7783 },
7784
7785 /* VEX_LEN_16_P_0_M_1 */
7786 {
7787 { "vmovlhps", { XM, Vex128, EXq } },
7788 { "(bad)", { XX } },
7789 },
7790
7791 /* VEX_LEN_16_P_2 */
7792 {
7793 { "vmovhpd", { XM, Vex128, EXq } },
7794 { "(bad)", { XX } },
7795 },
7796
7797 /* VEX_LEN_17_M_0 */
7798 {
7799 { "vmovhpX", { EXq, XM } },
7800 { "(bad)", { XX } },
7801 },
7802
7803 /* VEX_LEN_2A_P_1 */
7804 {
7805 { "vcvtsi2ss%LQ", { XM, Vex128, Ev } },
7806 { "(bad)", { XX } },
7807 },
7808
7809 /* VEX_LEN_2A_P_3 */
7810 {
7811 { "vcvtsi2sd%LQ", { XM, Vex128, Ev } },
7812 { "(bad)", { XX } },
7813 },
7814
7815 /* VEX_LEN_2B_M_0 */
7816 {
7817 { "vmovntpX", { Mx, XM } },
7818 { "(bad)", { XX } },
7819 },
7820
7821 /* VEX_LEN_2C_P_1 */
7822 {
7823 { "vcvttss2siY", { Gv, EXd } },
7824 { "(bad)", { XX } },
7825 },
7826
7827 /* VEX_LEN_2C_P_3 */
7828 {
7829 { "vcvttsd2siY", { Gv, EXq } },
7830 { "(bad)", { XX } },
7831 },
7832
7833 /* VEX_LEN_2D_P_1 */
7834 {
7835 { "vcvtss2siY", { Gv, EXd } },
7836 { "(bad)", { XX } },
7837 },
7838
7839 /* VEX_LEN_2D_P_3 */
7840 {
7841 { "vcvtsd2siY", { Gv, EXq } },
7842 { "(bad)", { XX } },
7843 },
7844
7845 /* VEX_LEN_2E_P_0 */
7846 {
7847 { "vucomiss", { XM, EXd } },
7848 { "(bad)", { XX } },
7849 },
7850
7851 /* VEX_LEN_2E_P_2 */
7852 {
7853 { "vucomisd", { XM, EXq } },
7854 { "(bad)", { XX } },
7855 },
7856
7857 /* VEX_LEN_2F_P_0 */
7858 {
7859 { "vcomiss", { XM, EXd } },
7860 { "(bad)", { XX } },
7861 },
7862
7863 /* VEX_LEN_2F_P_2 */
7864 {
7865 { "vcomisd", { XM, EXq } },
7866 { "(bad)", { XX } },
7867 },
7868
7869 /* VEX_LEN_51_P_1 */
7870 {
7871 { "vsqrtss", { XM, Vex128, EXd } },
7872 { "(bad)", { XX } },
7873 },
7874
7875 /* VEX_LEN_51_P_3 */
7876 {
7877 { "vsqrtsd", { XM, Vex128, EXq } },
7878 { "(bad)", { XX } },
7879 },
7880
7881 /* VEX_LEN_52_P_1 */
7882 {
7883 { "vrsqrtss", { XM, Vex128, EXd } },
7884 { "(bad)", { XX } },
7885 },
7886
7887 /* VEX_LEN_53_P_1 */
7888 {
7889 { "vrcpss", { XM, Vex128, EXd } },
7890 { "(bad)", { XX } },
7891 },
7892
7893 /* VEX_LEN_58_P_1 */
7894 {
7895 { "vaddss", { XM, Vex128, EXd } },
7896 { "(bad)", { XX } },
7897 },
7898
7899 /* VEX_LEN_58_P_3 */
7900 {
7901 { "vaddsd", { XM, Vex128, EXq } },
7902 { "(bad)", { XX } },
7903 },
7904
7905 /* VEX_LEN_59_P_1 */
7906 {
7907 { "vmulss", { XM, Vex128, EXd } },
7908 { "(bad)", { XX } },
7909 },
7910
7911 /* VEX_LEN_59_P_3 */
7912 {
7913 { "vmulsd", { XM, Vex128, EXq } },
7914 { "(bad)", { XX } },
7915 },
7916
7917 /* VEX_LEN_5A_P_1 */
7918 {
7919 { "vcvtss2sd", { XM, Vex128, EXd } },
7920 { "(bad)", { XX } },
7921 },
7922
7923 /* VEX_LEN_5A_P_3 */
7924 {
7925 { "vcvtsd2ss", { XM, Vex128, EXq } },
7926 { "(bad)", { XX } },
7927 },
7928
7929 /* VEX_LEN_5C_P_1 */
7930 {
7931 { "vsubss", { XM, Vex128, EXd } },
7932 { "(bad)", { XX } },
7933 },
7934
7935 /* VEX_LEN_5C_P_3 */
7936 {
7937 { "vsubsd", { XM, Vex128, EXq } },
7938 { "(bad)", { XX } },
7939 },
7940
7941 /* VEX_LEN_5D_P_1 */
7942 {
7943 { "vminss", { XM, Vex128, EXd } },
7944 { "(bad)", { XX } },
7945 },
7946
7947 /* VEX_LEN_5D_P_3 */
7948 {
7949 { "vminsd", { XM, Vex128, EXq } },
7950 { "(bad)", { XX } },
7951 },
7952
7953 /* VEX_LEN_5E_P_1 */
7954 {
7955 { "vdivss", { XM, Vex128, EXd } },
7956 { "(bad)", { XX } },
7957 },
7958
7959 /* VEX_LEN_5E_P_3 */
7960 {
7961 { "vdivsd", { XM, Vex128, EXq } },
7962 { "(bad)", { XX } },
7963 },
7964
7965 /* VEX_LEN_5F_P_1 */
7966 {
7967 { "vmaxss", { XM, Vex128, EXd } },
7968 { "(bad)", { XX } },
7969 },
7970
7971 /* VEX_LEN_5F_P_3 */
7972 {
7973 { "vmaxsd", { XM, Vex128, EXq } },
7974 { "(bad)", { XX } },
7975 },
7976
7977 /* VEX_LEN_60_P_2 */
7978 {
7979 { "vpunpcklbw", { XM, Vex128, EXx } },
7980 { "(bad)", { XX } },
7981 },
7982
7983 /* VEX_LEN_61_P_2 */
7984 {
7985 { "vpunpcklwd", { XM, Vex128, EXx } },
7986 { "(bad)", { XX } },
7987 },
7988
7989 /* VEX_LEN_62_P_2 */
7990 {
7991 { "vpunpckldq", { XM, Vex128, EXx } },
7992 { "(bad)", { XX } },
7993 },
7994
7995 /* VEX_LEN_63_P_2 */
7996 {
7997 { "vpacksswb", { XM, Vex128, EXx } },
7998 { "(bad)", { XX } },
7999 },
8000
8001 /* VEX_LEN_64_P_2 */
8002 {
8003 { "vpcmpgtb", { XM, Vex128, EXx } },
8004 { "(bad)", { XX } },
8005 },
8006
8007 /* VEX_LEN_65_P_2 */
8008 {
8009 { "vpcmpgtw", { XM, Vex128, EXx } },
8010 { "(bad)", { XX } },
8011 },
8012
8013 /* VEX_LEN_66_P_2 */
8014 {
8015 { "vpcmpgtd", { XM, Vex128, EXx } },
8016 { "(bad)", { XX } },
8017 },
8018
8019 /* VEX_LEN_67_P_2 */
8020 {
8021 { "vpackuswb", { XM, Vex128, EXx } },
8022 { "(bad)", { XX } },
8023 },
8024
8025 /* VEX_LEN_68_P_2 */
8026 {
8027 { "vpunpckhbw", { XM, Vex128, EXx } },
8028 { "(bad)", { XX } },
8029 },
8030
8031 /* VEX_LEN_69_P_2 */
8032 {
8033 { "vpunpckhwd", { XM, Vex128, EXx } },
8034 { "(bad)", { XX } },
8035 },
8036
8037 /* VEX_LEN_6A_P_2 */
8038 {
8039 { "vpunpckhdq", { XM, Vex128, EXx } },
8040 { "(bad)", { XX } },
8041 },
8042
8043 /* VEX_LEN_6B_P_2 */
8044 {
8045 { "vpackssdw", { XM, Vex128, EXx } },
8046 { "(bad)", { XX } },
8047 },
8048
8049 /* VEX_LEN_6C_P_2 */
8050 {
8051 { "vpunpcklqdq", { XM, Vex128, EXx } },
8052 { "(bad)", { XX } },
8053 },
8054
8055 /* VEX_LEN_6D_P_2 */
8056 {
8057 { "vpunpckhqdq", { XM, Vex128, EXx } },
8058 { "(bad)", { XX } },
8059 },
8060
8061 /* VEX_LEN_6E_P_2 */
8062 {
8063 { "vmovK", { XM, Edq } },
8064 { "(bad)", { XX } },
8065 },
8066
8067 /* VEX_LEN_70_P_1 */
8068 {
8069 { "vpshufhw", { XM, EXx, Ib } },
8070 { "(bad)", { XX } },
8071 },
8072
8073 /* VEX_LEN_70_P_2 */
8074 {
8075 { "vpshufd", { XM, EXx, Ib } },
8076 { "(bad)", { XX } },
8077 },
8078
8079 /* VEX_LEN_70_P_3 */
8080 {
8081 { "vpshuflw", { XM, EXx, Ib } },
8082 { "(bad)", { XX } },
8083 },
8084
8085 /* VEX_LEN_71_R_2_P_2 */
8086 {
8087 { "vpsrlw", { Vex128, XS, Ib } },
8088 { "(bad)", { XX } },
8089 },
8090
8091 /* VEX_LEN_71_R_4_P_2 */
8092 {
8093 { "vpsraw", { Vex128, XS, Ib } },
8094 { "(bad)", { XX } },
8095 },
8096
8097 /* VEX_LEN_71_R_6_P_2 */
8098 {
8099 { "vpsllw", { Vex128, XS, Ib } },
8100 { "(bad)", { XX } },
8101 },
8102
8103 /* VEX_LEN_72_R_2_P_2 */
8104 {
8105 { "vpsrld", { Vex128, XS, Ib } },
8106 { "(bad)", { XX } },
8107 },
8108
8109 /* VEX_LEN_72_R_4_P_2 */
8110 {
8111 { "vpsrad", { Vex128, XS, Ib } },
8112 { "(bad)", { XX } },
8113 },
8114
8115 /* VEX_LEN_72_R_6_P_2 */
8116 {
8117 { "vpslld", { Vex128, XS, Ib } },
8118 { "(bad)", { XX } },
8119 },
8120
8121 /* VEX_LEN_73_R_2_P_2 */
8122 {
8123 { "vpsrlq", { Vex128, XS, Ib } },
8124 { "(bad)", { XX } },
8125 },
8126
8127 /* VEX_LEN_73_R_3_P_2 */
8128 {
8129 { "vpsrldq", { Vex128, XS, Ib } },
8130 { "(bad)", { XX } },
8131 },
8132
8133 /* VEX_LEN_73_R_6_P_2 */
8134 {
8135 { "vpsllq", { Vex128, XS, Ib } },
8136 { "(bad)", { XX } },
8137 },
8138
8139 /* VEX_LEN_73_R_7_P_2 */
8140 {
8141 { "vpslldq", { Vex128, XS, Ib } },
8142 { "(bad)", { XX } },
8143 },
8144
8145 /* VEX_LEN_74_P_2 */
8146 {
8147 { "vpcmpeqb", { XM, Vex128, EXx } },
8148 { "(bad)", { XX } },
8149 },
8150
8151 /* VEX_LEN_75_P_2 */
8152 {
8153 { "vpcmpeqw", { XM, Vex128, EXx } },
8154 { "(bad)", { XX } },
8155 },
8156
8157 /* VEX_LEN_76_P_2 */
8158 {
8159 { "vpcmpeqd", { XM, Vex128, EXx } },
8160 { "(bad)", { XX } },
8161 },
8162
8163 /* VEX_LEN_7E_P_1 */
8164 {
8165 { "vmovq", { XM, EXq } },
8166 { "(bad)", { XX } },
8167 },
8168
8169 /* VEX_LEN_7E_P_2 */
8170 {
8171 { "vmovK", { Edq, XM } },
8172 { "(bad)", { XX } },
8173 },
8174
8175 /* VEX_LEN_AE_R_2_M0 */
8176 {
8177 { "vldmxcsr", { Md } },
8178 { "(bad)", { XX } },
8179 },
8180
8181 /* VEX_LEN_AE_R_3_M0 */
8182 {
8183 { "vstmxcsr", { Md } },
8184 { "(bad)", { XX } },
8185 },
8186
8187 /* VEX_LEN_C2_P_1 */
8188 {
8189 { "vcmpss", { XM, Vex128, EXd, VCMP } },
8190 { "(bad)", { XX } },
8191 },
8192
8193 /* VEX_LEN_C2_P_3 */
8194 {
8195 { "vcmpsd", { XM, Vex128, EXq, VCMP } },
8196 { "(bad)", { XX } },
8197 },
8198
8199 /* VEX_LEN_C4_P_2 */
8200 {
8201 { "vpinsrw", { XM, Vex128, Edqw, Ib } },
8202 { "(bad)", { XX } },
8203 },
8204
8205 /* VEX_LEN_C5_P_2 */
8206 {
8207 { "vpextrw", { Gdq, XS, Ib } },
8208 { "(bad)", { XX } },
8209 },
8210
8211 /* VEX_LEN_D1_P_2 */
8212 {
8213 { "vpsrlw", { XM, Vex128, EXx } },
8214 { "(bad)", { XX } },
8215 },
8216
8217 /* VEX_LEN_D2_P_2 */
8218 {
8219 { "vpsrld", { XM, Vex128, EXx } },
8220 { "(bad)", { XX } },
8221 },
8222
8223 /* VEX_LEN_D3_P_2 */
8224 {
8225 { "vpsrlq", { XM, Vex128, EXx } },
8226 { "(bad)", { XX } },
8227 },
8228
8229 /* VEX_LEN_D4_P_2 */
8230 {
8231 { "vpaddq", { XM, Vex128, EXx } },
8232 { "(bad)", { XX } },
8233 },
8234
8235 /* VEX_LEN_D5_P_2 */
8236 {
8237 { "vpmullw", { XM, Vex128, EXx } },
8238 { "(bad)", { XX } },
8239 },
8240
8241 /* VEX_LEN_D6_P_2 */
8242 {
8243 { "vmovq", { EXq, XM } },
8244 { "(bad)", { XX } },
8245 },
8246
8247 /* VEX_LEN_D7_P_2_M_1 */
8248 {
8249 { "vpmovmskb", { Gdq, XS } },
8250 { "(bad)", { XX } },
8251 },
8252
8253 /* VEX_LEN_D8_P_2 */
8254 {
8255 { "vpsubusb", { XM, Vex128, EXx } },
8256 { "(bad)", { XX } },
8257 },
8258
8259 /* VEX_LEN_D9_P_2 */
8260 {
8261 { "vpsubusw", { XM, Vex128, EXx } },
8262 { "(bad)", { XX } },
8263 },
8264
8265 /* VEX_LEN_DA_P_2 */
8266 {
8267 { "vpminub", { XM, Vex128, EXx } },
8268 { "(bad)", { XX } },
8269 },
8270
8271 /* VEX_LEN_DB_P_2 */
8272 {
8273 { "vpand", { XM, Vex128, EXx } },
8274 { "(bad)", { XX } },
8275 },
8276
8277 /* VEX_LEN_DC_P_2 */
8278 {
8279 { "vpaddusb", { XM, Vex128, EXx } },
8280 { "(bad)", { XX } },
8281 },
8282
8283 /* VEX_LEN_DD_P_2 */
8284 {
8285 { "vpaddusw", { XM, Vex128, EXx } },
8286 { "(bad)", { XX } },
8287 },
8288
8289 /* VEX_LEN_DE_P_2 */
8290 {
8291 { "vpmaxub", { XM, Vex128, EXx } },
8292 { "(bad)", { XX } },
8293 },
8294
8295 /* VEX_LEN_DF_P_2 */
8296 {
8297 { "vpandn", { XM, Vex128, EXx } },
8298 { "(bad)", { XX } },
8299 },
8300
8301 /* VEX_LEN_E0_P_2 */
8302 {
8303 { "vpavgb", { XM, Vex128, EXx } },
8304 { "(bad)", { XX } },
8305 },
8306
8307 /* VEX_LEN_E1_P_2 */
8308 {
8309 { "vpsraw", { XM, Vex128, EXx } },
8310 { "(bad)", { XX } },
8311 },
8312
8313 /* VEX_LEN_E2_P_2 */
8314 {
8315 { "vpsrad", { XM, Vex128, EXx } },
8316 { "(bad)", { XX } },
8317 },
8318
8319 /* VEX_LEN_E3_P_2 */
8320 {
8321 { "vpavgw", { XM, Vex128, EXx } },
8322 { "(bad)", { XX } },
8323 },
8324
8325 /* VEX_LEN_E4_P_2 */
8326 {
8327 { "vpmulhuw", { XM, Vex128, EXx } },
8328 { "(bad)", { XX } },
8329 },
8330
8331 /* VEX_LEN_E5_P_2 */
8332 {
8333 { "vpmulhw", { XM, Vex128, EXx } },
8334 { "(bad)", { XX } },
8335 },
8336
8337 /* VEX_LEN_E7_P_2_M_0 */
8338 {
8339 { "vmovntdq", { Mx, XM } },
8340 { "(bad)", { XX } },
8341 },
8342
8343 /* VEX_LEN_E8_P_2 */
8344 {
8345 { "vpsubsb", { XM, Vex128, EXx } },
8346 { "(bad)", { XX } },
8347 },
8348
8349 /* VEX_LEN_E9_P_2 */
8350 {
8351 { "vpsubsw", { XM, Vex128, EXx } },
8352 { "(bad)", { XX } },
8353 },
8354
8355 /* VEX_LEN_EA_P_2 */
8356 {
8357 { "vpminsw", { XM, Vex128, EXx } },
8358 { "(bad)", { XX } },
8359 },
8360
8361 /* VEX_LEN_EB_P_2 */
8362 {
8363 { "vpor", { XM, Vex128, EXx } },
8364 { "(bad)", { XX } },
8365 },
8366
8367 /* VEX_LEN_EC_P_2 */
8368 {
8369 { "vpaddsb", { XM, Vex128, EXx } },
8370 { "(bad)", { XX } },
8371 },
8372
8373 /* VEX_LEN_ED_P_2 */
8374 {
8375 { "vpaddsw", { XM, Vex128, EXx } },
8376 { "(bad)", { XX } },
8377 },
8378
8379 /* VEX_LEN_EE_P_2 */
8380 {
8381 { "vpmaxsw", { XM, Vex128, EXx } },
8382 { "(bad)", { XX } },
8383 },
8384
8385 /* VEX_LEN_EF_P_2 */
8386 {
8387 { "vpxor", { XM, Vex128, EXx } },
8388 { "(bad)", { XX } },
8389 },
8390
8391 /* VEX_LEN_F1_P_2 */
8392 {
8393 { "vpsllw", { XM, Vex128, EXx } },
8394 { "(bad)", { XX } },
8395 },
8396
8397 /* VEX_LEN_F2_P_2 */
8398 {
8399 { "vpslld", { XM, Vex128, EXx } },
8400 { "(bad)", { XX } },
8401 },
8402
8403 /* VEX_LEN_F3_P_2 */
8404 {
8405 { "vpsllq", { XM, Vex128, EXx } },
8406 { "(bad)", { XX } },
8407 },
8408
8409 /* VEX_LEN_F4_P_2 */
8410 {
8411 { "vpmuludq", { XM, Vex128, EXx } },
8412 { "(bad)", { XX } },
8413 },
8414
8415 /* VEX_LEN_F5_P_2 */
8416 {
8417 { "vpmaddwd", { XM, Vex128, EXx } },
8418 { "(bad)", { XX } },
8419 },
8420
8421 /* VEX_LEN_F6_P_2 */
8422 {
8423 { "vpsadbw", { XM, Vex128, EXx } },
8424 { "(bad)", { XX } },
8425 },
8426
8427 /* VEX_LEN_F7_P_2 */
8428 {
8429 { "vmaskmovdqu", { XM, XS } },
8430 { "(bad)", { XX } },
8431 },
8432
8433 /* VEX_LEN_F8_P_2 */
8434 {
8435 { "vpsubb", { XM, Vex128, EXx } },
8436 { "(bad)", { XX } },
8437 },
8438
8439 /* VEX_LEN_F9_P_2 */
8440 {
8441 { "vpsubw", { XM, Vex128, EXx } },
8442 { "(bad)", { XX } },
8443 },
8444
8445 /* VEX_LEN_FA_P_2 */
8446 {
8447 { "vpsubd", { XM, Vex128, EXx } },
8448 { "(bad)", { XX } },
8449 },
8450
8451 /* VEX_LEN_FB_P_2 */
8452 {
8453 { "vpsubq", { XM, Vex128, EXx } },
8454 { "(bad)", { XX } },
8455 },
8456
8457 /* VEX_LEN_FC_P_2 */
8458 {
8459 { "vpaddb", { XM, Vex128, EXx } },
8460 { "(bad)", { XX } },
8461 },
8462
8463 /* VEX_LEN_FD_P_2 */
8464 {
8465 { "vpaddw", { XM, Vex128, EXx } },
8466 { "(bad)", { XX } },
8467 },
8468
8469 /* VEX_LEN_FE_P_2 */
8470 {
8471 { "vpaddd", { XM, Vex128, EXx } },
8472 { "(bad)", { XX } },
8473 },
8474
8475 /* VEX_LEN_3800_P_2 */
8476 {
8477 { "vpshufb", { XM, Vex128, EXx } },
8478 { "(bad)", { XX } },
8479 },
8480
8481 /* VEX_LEN_3801_P_2 */
8482 {
8483 { "vphaddw", { XM, Vex128, EXx } },
8484 { "(bad)", { XX } },
8485 },
8486
8487 /* VEX_LEN_3802_P_2 */
8488 {
8489 { "vphaddd", { XM, Vex128, EXx } },
8490 { "(bad)", { XX } },
8491 },
8492
8493 /* VEX_LEN_3803_P_2 */
8494 {
8495 { "vphaddsw", { XM, Vex128, EXx } },
8496 { "(bad)", { XX } },
8497 },
8498
8499 /* VEX_LEN_3804_P_2 */
8500 {
8501 { "vpmaddubsw", { XM, Vex128, EXx } },
8502 { "(bad)", { XX } },
8503 },
8504
8505 /* VEX_LEN_3805_P_2 */
8506 {
8507 { "vphsubw", { XM, Vex128, EXx } },
8508 { "(bad)", { XX } },
8509 },
8510
8511 /* VEX_LEN_3806_P_2 */
8512 {
8513 { "vphsubd", { XM, Vex128, EXx } },
8514 { "(bad)", { XX } },
8515 },
8516
8517 /* VEX_LEN_3807_P_2 */
8518 {
8519 { "vphsubsw", { XM, Vex128, EXx } },
8520 { "(bad)", { XX } },
8521 },
8522
8523 /* VEX_LEN_3808_P_2 */
8524 {
8525 { "vpsignb", { XM, Vex128, EXx } },
8526 { "(bad)", { XX } },
8527 },
8528
8529 /* VEX_LEN_3809_P_2 */
8530 {
8531 { "vpsignw", { XM, Vex128, EXx } },
8532 { "(bad)", { XX } },
8533 },
8534
8535 /* VEX_LEN_380A_P_2 */
8536 {
8537 { "vpsignd", { XM, Vex128, EXx } },
8538 { "(bad)", { XX } },
8539 },
8540
8541 /* VEX_LEN_380B_P_2 */
8542 {
8543 { "vpmulhrsw", { XM, Vex128, EXx } },
8544 { "(bad)", { XX } },
8545 },
8546
8547 /* VEX_LEN_3819_P_2_M_0 */
8548 {
8549 { "(bad)", { XX } },
8550 { "vbroadcastsd", { XM, Mq } },
8551 },
8552
8553 /* VEX_LEN_381A_P_2_M_0 */
8554 {
8555 { "(bad)", { XX } },
8556 { "vbroadcastf128", { XM, Mxmm } },
8557 },
8558
8559 /* VEX_LEN_381C_P_2 */
8560 {
8561 { "vpabsb", { XM, EXx } },
8562 { "(bad)", { XX } },
8563 },
8564
8565 /* VEX_LEN_381D_P_2 */
8566 {
8567 { "vpabsw", { XM, EXx } },
8568 { "(bad)", { XX } },
8569 },
8570
8571 /* VEX_LEN_381E_P_2 */
8572 {
8573 { "vpabsd", { XM, EXx } },
8574 { "(bad)", { XX } },
8575 },
8576
8577 /* VEX_LEN_3820_P_2 */
8578 {
8579 { "vpmovsxbw", { XM, EXq } },
8580 { "(bad)", { XX } },
8581 },
8582
8583 /* VEX_LEN_3821_P_2 */
8584 {
8585 { "vpmovsxbd", { XM, EXd } },
8586 { "(bad)", { XX } },
8587 },
8588
8589 /* VEX_LEN_3822_P_2 */
8590 {
8591 { "vpmovsxbq", { XM, EXw } },
8592 { "(bad)", { XX } },
8593 },
8594
8595 /* VEX_LEN_3823_P_2 */
8596 {
8597 { "vpmovsxwd", { XM, EXq } },
8598 { "(bad)", { XX } },
8599 },
8600
8601 /* VEX_LEN_3824_P_2 */
8602 {
8603 { "vpmovsxwq", { XM, EXd } },
8604 { "(bad)", { XX } },
8605 },
8606
8607 /* VEX_LEN_3825_P_2 */
8608 {
8609 { "vpmovsxdq", { XM, EXq } },
8610 { "(bad)", { XX } },
8611 },
8612
8613 /* VEX_LEN_3828_P_2 */
8614 {
8615 { "vpmuldq", { XM, Vex128, EXx } },
8616 { "(bad)", { XX } },
8617 },
8618
8619 /* VEX_LEN_3829_P_2 */
8620 {
8621 { "vpcmpeqq", { XM, Vex128, EXx } },
8622 { "(bad)", { XX } },
8623 },
8624
8625 /* VEX_LEN_382A_P_2_M_0 */
8626 {
8627 { "vmovntdqa", { XM, Mx } },
8628 { "(bad)", { XX } },
8629 },
8630
8631 /* VEX_LEN_382B_P_2 */
8632 {
8633 { "vpackusdw", { XM, Vex128, EXx } },
8634 { "(bad)", { XX } },
8635 },
8636
8637 /* VEX_LEN_3830_P_2 */
8638 {
8639 { "vpmovzxbw", { XM, EXq } },
8640 { "(bad)", { XX } },
8641 },
8642
8643 /* VEX_LEN_3831_P_2 */
8644 {
8645 { "vpmovzxbd", { XM, EXd } },
8646 { "(bad)", { XX } },
8647 },
8648
8649 /* VEX_LEN_3832_P_2 */
8650 {
8651 { "vpmovzxbq", { XM, EXw } },
8652 { "(bad)", { XX } },
8653 },
8654
8655 /* VEX_LEN_3833_P_2 */
8656 {
8657 { "vpmovzxwd", { XM, EXq } },
8658 { "(bad)", { XX } },
8659 },
8660
8661 /* VEX_LEN_3834_P_2 */
8662 {
8663 { "vpmovzxwq", { XM, EXd } },
8664 { "(bad)", { XX } },
8665 },
8666
8667 /* VEX_LEN_3835_P_2 */
8668 {
8669 { "vpmovzxdq", { XM, EXq } },
8670 { "(bad)", { XX } },
8671 },
8672
8673 /* VEX_LEN_3837_P_2 */
8674 {
8675 { "vpcmpgtq", { XM, Vex128, EXx } },
8676 { "(bad)", { XX } },
8677 },
8678
8679 /* VEX_LEN_3838_P_2 */
8680 {
8681 { "vpminsb", { XM, Vex128, EXx } },
8682 { "(bad)", { XX } },
8683 },
8684
8685 /* VEX_LEN_3839_P_2 */
8686 {
8687 { "vpminsd", { XM, Vex128, EXx } },
8688 { "(bad)", { XX } },
8689 },
8690
8691 /* VEX_LEN_383A_P_2 */
8692 {
8693 { "vpminuw", { XM, Vex128, EXx } },
8694 { "(bad)", { XX } },
8695 },
8696
8697 /* VEX_LEN_383B_P_2 */
8698 {
8699 { "vpminud", { XM, Vex128, EXx } },
8700 { "(bad)", { XX } },
8701 },
8702
8703 /* VEX_LEN_383C_P_2 */
8704 {
8705 { "vpmaxsb", { XM, Vex128, EXx } },
8706 { "(bad)", { XX } },
8707 },
8708
8709 /* VEX_LEN_383D_P_2 */
8710 {
8711 { "vpmaxsd", { XM, Vex128, EXx } },
8712 { "(bad)", { XX } },
8713 },
8714
8715 /* VEX_LEN_383E_P_2 */
8716 {
8717 { "vpmaxuw", { XM, Vex128, EXx } },
8718 { "(bad)", { XX } },
8719 },
8720
8721 /* VEX_LEN_383F_P_2 */
8722 {
8723 { "vpmaxud", { XM, Vex128, EXx } },
8724 { "(bad)", { XX } },
8725 },
8726
8727 /* VEX_LEN_3840_P_2 */
8728 {
8729 { "vpmulld", { XM, Vex128, EXx } },
8730 { "(bad)", { XX } },
8731 },
8732
8733 /* VEX_LEN_3841_P_2 */
8734 {
8735 { "vphminposuw", { XM, EXx } },
8736 { "(bad)", { XX } },
8737 },
8738
8739 /* VEX_LEN_3A06_P_2 */
8740 {
8741 { "(bad)", { XX } },
8742 { "vperm2f128", { XM, Vex256, EXx, Ib } },
8743 },
8744
8745 /* VEX_LEN_3A0A_P_2 */
8746 {
8747 { "vroundss", { XM, Vex128, EXd, Ib } },
8748 { "(bad)", { XX } },
8749 },
8750
8751 /* VEX_LEN_3A0B_P_2 */
8752 {
8753 { "vroundsd", { XM, Vex128, EXq, Ib } },
8754 { "(bad)", { XX } },
8755 },
8756
8757 /* VEX_LEN_3A0E_P_2 */
8758 {
8759 { "vpblendw", { XM, Vex128, EXx, Ib } },
8760 { "(bad)", { XX } },
8761 },
8762
8763 /* VEX_LEN_3A0F_P_2 */
8764 {
8765 { "vpalignr", { XM, Vex128, EXx, Ib } },
8766 { "(bad)", { XX } },
8767 },
8768
8769 /* VEX_LEN_3A14_P_2 */
8770 {
8771 { "vpextrb", { Edqb, XM, Ib } },
8772 { "(bad)", { XX } },
8773 },
8774
8775 /* VEX_LEN_3A15_P_2 */
8776 {
8777 { "vpextrw", { Edqw, XM, Ib } },
8778 { "(bad)", { XX } },
8779 },
8780
8781 /* VEX_LEN_3A16_P_2 */
8782 {
8783 { "vpextrK", { Edq, XM, Ib } },
8784 { "(bad)", { XX } },
8785 },
8786
8787 /* VEX_LEN_3A17_P_2 */
8788 {
8789 { "vextractps", { Edqd, XM, Ib } },
8790 { "(bad)", { XX } },
8791 },
8792
8793 /* VEX_LEN_3A18_P_2 */
8794 {
8795 { "(bad)", { XX } },
8796 { "vinsertf128", { XM, Vex256, EXxmm, Ib } },
8797 },
8798
8799 /* VEX_LEN_3A19_P_2 */
8800 {
8801 { "(bad)", { XX } },
8802 { "vextractf128", { EXxmm, XM, Ib } },
8803 },
8804
8805 /* VEX_LEN_3A20_P_2 */
8806 {
8807 { "vpinsrb", { XM, Vex128, Edqb, Ib } },
8808 { "(bad)", { XX } },
8809 },
8810
8811 /* VEX_LEN_3A21_P_2 */
8812 {
8813 { "vinsertps", { XM, Vex128, EXd, Ib } },
8814 { "(bad)", { XX } },
8815 },
8816
8817 /* VEX_LEN_3A22_P_2 */
8818 {
8819 { "vpinsrK", { XM, Vex128, Edq, Ib } },
8820 { "(bad)", { XX } },
8821 },
8822
8823 /* VEX_LEN_3A41_P_2 */
8824 {
8825 { "vdppd", { XM, Vex128, EXx, Ib } },
8826 { "(bad)", { XX } },
8827 },
8828
8829 /* VEX_LEN_3A42_P_2 */
8830 {
8831 { "vmpsadbw", { XM, Vex128, EXx, Ib } },
8832 { "(bad)", { XX } },
8833 },
8834
8835 /* VEX_LEN_3A4C_P_2 */
8836 {
8837 { "vpblendvb", { XM, Vex128, EXx, XMVexI4 } },
8838 { "(bad)", { XX } },
8839 },
8840
8841 /* VEX_LEN_3A60_P_2 */
8842 {
8843 { "vpcmpestrm", { XM, EXx, Ib } },
8844 { "(bad)", { XX } },
8845 },
8846
8847 /* VEX_LEN_3A61_P_2 */
8848 {
8849 { "vpcmpestri", { XM, EXx, Ib } },
8850 { "(bad)", { XX } },
8851 },
8852
8853 /* VEX_LEN_3A62_P_2 */
8854 {
8855 { "vpcmpistrm", { XM, EXx, Ib } },
8856 { "(bad)", { XX } },
8857 },
8858
8859 /* VEX_LEN_3A63_P_2 */
8860 {
8861 { "vpcmpistri", { XM, EXx, Ib } },
8862 { "(bad)", { XX } },
8863 },
8864
8865 /* VEX_LEN_3A6A_P_2 */
8866 {
8867 { "vfmaddss", { XMVexW, Vex128FMA, EXdVexW, EXdVexW, VexI4 } },
8868 { "(bad)", { XX } },
8869 },
8870
8871 /* VEX_LEN_3A6B_P_2 */
8872 {
8873 { "vfmaddsd", { XMVexW, Vex128FMA, EXqVexW, EXqVexW, VexI4 } },
8874 { "(bad)", { XX } },
8875 },
8876
8877 /* VEX_LEN_3A6E_P_2 */
8878 {
8879 { "vfmsubss", { XMVexW, Vex128FMA, EXdVexW, EXdVexW, VexI4 } },
8880 { "(bad)", { XX } },
8881 },
8882
8883 /* VEX_LEN_3A6F_P_2 */
8884 {
8885 { "vfmsubsd", { XMVexW, Vex128FMA, EXqVexW, EXqVexW, VexI4 } },
8886 { "(bad)", { XX } },
8887 },
8888
8889 /* VEX_LEN_3A7A_P_2 */
8890 {
8891 { "vfnmaddss", { XMVexW, Vex128FMA, EXdVexW, EXdVexW, VexI4 } },
8892 { "(bad)", { XX } },
8893 },
8894
8895 /* VEX_LEN_3A7B_P_2 */
8896 {
8897 { "vfnmaddsd", { XMVexW, Vex128FMA, EXqVexW, EXqVexW, VexI4 } },
8898 { "(bad)", { XX } },
8899 },
8900
8901 /* VEX_LEN_3A7E_P_2 */
8902 {
8903 { "vfnmsubss", { XMVexW, Vex128FMA, EXdVexW, EXdVexW, VexI4 } },
8904 { "(bad)", { XX } },
8905 },
8906
8907 /* VEX_LEN_3A7F_P_2 */
8908 {
8909 { "vfnmsubsd", { XMVexW, Vex128FMA, EXqVexW, EXqVexW, VexI4 } },
8910 { "(bad)", { XX } },
8911 },
8912 };
8913
8914 static const struct dis386 mod_table[][2] = {
8915 {
8916 /* MOD_8D */
8917 { "leaS", { Gv, M } },
8918 { "(bad)", { XX } },
8919 },
8920 {
8921 /* MOD_0F01_REG_0 */
8922 { X86_64_TABLE (X86_64_0F01_REG_0) },
8923 { RM_TABLE (RM_0F01_REG_0) },
8924 },
8925 {
8926 /* MOD_0F01_REG_1 */
8927 { X86_64_TABLE (X86_64_0F01_REG_1) },
8928 { RM_TABLE (RM_0F01_REG_1) },
8929 },
8930 {
8931 /* MOD_0F01_REG_2 */
8932 { X86_64_TABLE (X86_64_0F01_REG_2) },
8933 { RM_TABLE (RM_0F01_REG_2) },
8934 },
8935 {
8936 /* MOD_0F01_REG_3 */
8937 { X86_64_TABLE (X86_64_0F01_REG_3) },
8938 { RM_TABLE (RM_0F01_REG_3) },
8939 },
8940 {
8941 /* MOD_0F01_REG_7 */
8942 { "invlpg", { Mb } },
8943 { RM_TABLE (RM_0F01_REG_7) },
8944 },
8945 {
8946 /* MOD_0F12_PREFIX_0 */
8947 { "movlps", { XM, EXq } },
8948 { "movhlps", { XM, EXq } },
8949 },
8950 {
8951 /* MOD_0F13 */
8952 { "movlpX", { EXq, XM } },
8953 { "(bad)", { XX } },
8954 },
8955 {
8956 /* MOD_0F16_PREFIX_0 */
8957 { "movhps", { XM, EXq } },
8958 { "movlhps", { XM, EXq } },
8959 },
8960 {
8961 /* MOD_0F17 */
8962 { "movhpX", { EXq, XM } },
8963 { "(bad)", { XX } },
8964 },
8965 {
8966 /* MOD_0F18_REG_0 */
8967 { "prefetchnta", { Mb } },
8968 { "(bad)", { XX } },
8969 },
8970 {
8971 /* MOD_0F18_REG_1 */
8972 { "prefetcht0", { Mb } },
8973 { "(bad)", { XX } },
8974 },
8975 {
8976 /* MOD_0F18_REG_2 */
8977 { "prefetcht1", { Mb } },
8978 { "(bad)", { XX } },
8979 },
8980 {
8981 /* MOD_0F18_REG_3 */
8982 { "prefetcht2", { Mb } },
8983 { "(bad)", { XX } },
8984 },
8985 {
8986 /* MOD_0F20 */
8987 { "(bad)", { XX } },
8988 { "movZ", { Rm, Cm } },
8989 },
8990 {
8991 /* MOD_0F21 */
8992 { "(bad)", { XX } },
8993 { "movZ", { Rm, Dm } },
8994 },
8995 {
8996 /* MOD_0F22 */
8997 { "(bad)", { XX } },
8998 { "movZ", { Cm, Rm } },
8999 },
9000 {
9001 /* MOD_0F23 */
9002 { "(bad)", { XX } },
9003 { "movZ", { Dm, Rm } },
9004 },
9005 {
9006 /* MOD_0F24 */
9007 { THREE_BYTE_TABLE (THREE_BYTE_0F24) },
9008 { "movL", { Rd, Td } },
9009 },
9010 {
9011 /* MOD_0F26 */
9012 { "(bad)", { XX } },
9013 { "movL", { Td, Rd } },
9014 },
9015 {
9016 /* MOD_0F2B_PREFIX_0 */
9017 {"movntps", { Mx, XM } },
9018 { "(bad)", { XX } },
9019 },
9020 {
9021 /* MOD_0F2B_PREFIX_1 */
9022 {"movntss", { Md, XM } },
9023 { "(bad)", { XX } },
9024 },
9025 {
9026 /* MOD_0F2B_PREFIX_2 */
9027 {"movntpd", { Mx, XM } },
9028 { "(bad)", { XX } },
9029 },
9030 {
9031 /* MOD_0F2B_PREFIX_3 */
9032 {"movntsd", { Mq, XM } },
9033 { "(bad)", { XX } },
9034 },
9035 {
9036 /* MOD_0F51 */
9037 { "(bad)", { XX } },
9038 { "movmskpX", { Gdq, XS } },
9039 },
9040 {
9041 /* MOD_0F71_REG_2 */
9042 { "(bad)", { XX } },
9043 { "psrlw", { MS, Ib } },
9044 },
9045 {
9046 /* MOD_0F71_REG_4 */
9047 { "(bad)", { XX } },
9048 { "psraw", { MS, Ib } },
9049 },
9050 {
9051 /* MOD_0F71_REG_6 */
9052 { "(bad)", { XX } },
9053 { "psllw", { MS, Ib } },
9054 },
9055 {
9056 /* MOD_0F72_REG_2 */
9057 { "(bad)", { XX } },
9058 { "psrld", { MS, Ib } },
9059 },
9060 {
9061 /* MOD_0F72_REG_4 */
9062 { "(bad)", { XX } },
9063 { "psrad", { MS, Ib } },
9064 },
9065 {
9066 /* MOD_0F72_REG_6 */
9067 { "(bad)", { XX } },
9068 { "pslld", { MS, Ib } },
9069 },
9070 {
9071 /* MOD_0F73_REG_2 */
9072 { "(bad)", { XX } },
9073 { "psrlq", { MS, Ib } },
9074 },
9075 {
9076 /* MOD_0F73_REG_3 */
9077 { "(bad)", { XX } },
9078 { PREFIX_TABLE (PREFIX_0F73_REG_3) },
9079 },
9080 {
9081 /* MOD_0F73_REG_6 */
9082 { "(bad)", { XX } },
9083 { "psllq", { MS, Ib } },
9084 },
9085 {
9086 /* MOD_0F73_REG_7 */
9087 { "(bad)", { XX } },
9088 { PREFIX_TABLE (PREFIX_0F73_REG_7) },
9089 },
9090 {
9091 /* MOD_0FAE_REG_0 */
9092 { "fxsave", { M } },
9093 { "(bad)", { XX } },
9094 },
9095 {
9096 /* MOD_0FAE_REG_1 */
9097 { "fxrstor", { M } },
9098 { "(bad)", { XX } },
9099 },
9100 {
9101 /* MOD_0FAE_REG_2 */
9102 { "ldmxcsr", { Md } },
9103 { "(bad)", { XX } },
9104 },
9105 {
9106 /* MOD_0FAE_REG_3 */
9107 { "stmxcsr", { Md } },
9108 { "(bad)", { XX } },
9109 },
9110 {
9111 /* MOD_0FAE_REG_4 */
9112 { "xsave", { M } },
9113 { "(bad)", { XX } },
9114 },
9115 {
9116 /* MOD_0FAE_REG_5 */
9117 { "xrstor", { M } },
9118 { RM_TABLE (RM_0FAE_REG_5) },
9119 },
9120 {
9121 /* MOD_0FAE_REG_6 */
9122 { "xsaveopt", { M } },
9123 { RM_TABLE (RM_0FAE_REG_6) },
9124 },
9125 {
9126 /* MOD_0FAE_REG_7 */
9127 { "clflush", { Mb } },
9128 { RM_TABLE (RM_0FAE_REG_7) },
9129 },
9130 {
9131 /* MOD_0FB2 */
9132 { "lssS", { Gv, Mp } },
9133 { "(bad)", { XX } },
9134 },
9135 {
9136 /* MOD_0FB4 */
9137 { "lfsS", { Gv, Mp } },
9138 { "(bad)", { XX } },
9139 },
9140 {
9141 /* MOD_0FB5 */
9142 { "lgsS", { Gv, Mp } },
9143 { "(bad)", { XX } },
9144 },
9145 {
9146 /* MOD_0FC7_REG_6 */
9147 { PREFIX_TABLE (PREFIX_0FC7_REG_6) },
9148 { "(bad)", { XX } },
9149 },
9150 {
9151 /* MOD_0FC7_REG_7 */
9152 { "vmptrst", { Mq } },
9153 { "(bad)", { XX } },
9154 },
9155 {
9156 /* MOD_0FD7 */
9157 { "(bad)", { XX } },
9158 { "pmovmskb", { Gdq, MS } },
9159 },
9160 {
9161 /* MOD_0FE7_PREFIX_2 */
9162 { "movntdq", { Mx, XM } },
9163 { "(bad)", { XX } },
9164 },
9165 {
9166 /* MOD_0FF0_PREFIX_3 */
9167 { "lddqu", { XM, M } },
9168 { "(bad)", { XX } },
9169 },
9170 {
9171 /* MOD_0F382A_PREFIX_2 */
9172 { "movntdqa", { XM, Mx } },
9173 { "(bad)", { XX } },
9174 },
9175 {
9176 /* MOD_62_32BIT */
9177 { "bound{S|}", { Gv, Ma } },
9178 { "(bad)", { XX } },
9179 },
9180 {
9181 /* MOD_C4_32BIT */
9182 { "lesS", { Gv, Mp } },
9183 { VEX_C4_TABLE (VEX_0F) },
9184 },
9185 {
9186 /* MOD_C5_32BIT */
9187 { "ldsS", { Gv, Mp } },
9188 { VEX_C5_TABLE (VEX_0F) },
9189 },
9190 {
9191 /* MOD_VEX_12_PREFIX_0 */
9192 { VEX_LEN_TABLE (VEX_LEN_12_P_0_M_0) },
9193 { VEX_LEN_TABLE (VEX_LEN_12_P_0_M_1) },
9194 },
9195 {
9196 /* MOD_VEX_13 */
9197 { VEX_LEN_TABLE (VEX_LEN_13_M_0) },
9198 { "(bad)", { XX } },
9199 },
9200 {
9201 /* MOD_VEX_16_PREFIX_0 */
9202 { VEX_LEN_TABLE (VEX_LEN_16_P_0_M_0) },
9203 { VEX_LEN_TABLE (VEX_LEN_16_P_0_M_1) },
9204 },
9205 {
9206 /* MOD_VEX_17 */
9207 { VEX_LEN_TABLE (VEX_LEN_17_M_0) },
9208 { "(bad)", { XX } },
9209 },
9210 {
9211 /* MOD_VEX_2B */
9212 { VEX_LEN_TABLE (VEX_LEN_2B_M_0) },
9213 { "(bad)", { XX } },
9214 },
9215 {
9216 /* MOD_VEX_51 */
9217 { "(bad)", { XX } },
9218 { "vmovmskpX", { Gdq, XS } },
9219 },
9220 {
9221 /* MOD_VEX_71_REG_2 */
9222 { "(bad)", { XX } },
9223 { PREFIX_TABLE (PREFIX_VEX_71_REG_2) },
9224 },
9225 {
9226 /* MOD_VEX_71_REG_4 */
9227 { "(bad)", { XX } },
9228 { PREFIX_TABLE (PREFIX_VEX_71_REG_4) },
9229 },
9230 {
9231 /* MOD_VEX_71_REG_6 */
9232 { "(bad)", { XX } },
9233 { PREFIX_TABLE (PREFIX_VEX_71_REG_6) },
9234 },
9235 {
9236 /* MOD_VEX_72_REG_2 */
9237 { "(bad)", { XX } },
9238 { PREFIX_TABLE (PREFIX_VEX_72_REG_2) },
9239 },
9240 {
9241 /* MOD_VEX_72_REG_4 */
9242 { "(bad)", { XX } },
9243 { PREFIX_TABLE (PREFIX_VEX_72_REG_4) },
9244 },
9245 {
9246 /* MOD_VEX_72_REG_6 */
9247 { "(bad)", { XX } },
9248 { PREFIX_TABLE (PREFIX_VEX_72_REG_6) },
9249 },
9250 {
9251 /* MOD_VEX_73_REG_2 */
9252 { "(bad)", { XX } },
9253 { PREFIX_TABLE (PREFIX_VEX_73_REG_2) },
9254 },
9255 {
9256 /* MOD_VEX_73_REG_3 */
9257 { "(bad)", { XX } },
9258 { PREFIX_TABLE (PREFIX_VEX_73_REG_3) },
9259 },
9260 {
9261 /* MOD_VEX_73_REG_6 */
9262 { "(bad)", { XX } },
9263 { PREFIX_TABLE (PREFIX_VEX_73_REG_6) },
9264 },
9265 {
9266 /* MOD_VEX_73_REG_7 */
9267 { "(bad)", { XX } },
9268 { PREFIX_TABLE (PREFIX_VEX_73_REG_7) },
9269 },
9270 {
9271 /* MOD_VEX_AE_REG_2 */
9272 { VEX_LEN_TABLE (VEX_LEN_AE_R_2_M_0) },
9273 { "(bad)", { XX } },
9274 },
9275 {
9276 /* MOD_VEX_AE_REG_3 */
9277 { VEX_LEN_TABLE (VEX_LEN_AE_R_3_M_0) },
9278 { "(bad)", { XX } },
9279 },
9280 {
9281 /* MOD_VEX_D7_PREFIX_2 */
9282 { "(bad)", { XX } },
9283 { VEX_LEN_TABLE (VEX_LEN_D7_P_2_M_1) },
9284 },
9285 {
9286 /* MOD_VEX_E7_PREFIX_2 */
9287 { VEX_LEN_TABLE (VEX_LEN_E7_P_2_M_0) },
9288 { "(bad)", { XX } },
9289 },
9290 {
9291 /* MOD_VEX_F0_PREFIX_3 */
9292 { "vlddqu", { XM, M } },
9293 { "(bad)", { XX } },
9294 },
9295 {
9296 /* MOD_VEX_3818_PREFIX_2 */
9297 { "vbroadcastss", { XM, Md } },
9298 { "(bad)", { XX } },
9299 },
9300 {
9301 /* MOD_VEX_3819_PREFIX_2 */
9302 { VEX_LEN_TABLE (VEX_LEN_3819_P_2_M_0) },
9303 { "(bad)", { XX } },
9304 },
9305 {
9306 /* MOD_VEX_381A_PREFIX_2 */
9307 { VEX_LEN_TABLE (VEX_LEN_381A_P_2_M_0) },
9308 { "(bad)", { XX } },
9309 },
9310 {
9311 /* MOD_VEX_382A_PREFIX_2 */
9312 { VEX_LEN_TABLE (VEX_LEN_382A_P_2_M_0) },
9313 { "(bad)", { XX } },
9314 },
9315 {
9316 /* MOD_VEX_382C_PREFIX_2 */
9317 { "vmaskmovps", { XM, Vex, Mx } },
9318 { "(bad)", { XX } },
9319 },
9320 {
9321 /* MOD_VEX_382D_PREFIX_2 */
9322 { "vmaskmovpd", { XM, Vex, Mx } },
9323 { "(bad)", { XX } },
9324 },
9325 {
9326 /* MOD_VEX_382E_PREFIX_2 */
9327 { "vmaskmovps", { Mx, Vex, XM } },
9328 { "(bad)", { XX } },
9329 },
9330 {
9331 /* MOD_VEX_382F_PREFIX_2 */
9332 { "vmaskmovpd", { Mx, Vex, XM } },
9333 { "(bad)", { XX } },
9334 },
9335 };
9336
9337 static const struct dis386 rm_table[][8] = {
9338 {
9339 /* RM_0F01_REG_0 */
9340 { "(bad)", { XX } },
9341 { "vmcall", { Skip_MODRM } },
9342 { "vmlaunch", { Skip_MODRM } },
9343 { "vmresume", { Skip_MODRM } },
9344 { "vmxoff", { Skip_MODRM } },
9345 { "(bad)", { XX } },
9346 { "(bad)", { XX } },
9347 { "(bad)", { XX } },
9348 },
9349 {
9350 /* RM_0F01_REG_1 */
9351 { "monitor", { { OP_Monitor, 0 } } },
9352 { "mwait", { { OP_Mwait, 0 } } },
9353 { "(bad)", { XX } },
9354 { "(bad)", { XX } },
9355 { "(bad)", { XX } },
9356 { "(bad)", { XX } },
9357 { "(bad)", { XX } },
9358 { "(bad)", { XX } },
9359 },
9360 {
9361 /* RM_0F01_REG_2 */
9362 { "xgetbv", { Skip_MODRM } },
9363 { "xsetbv", { Skip_MODRM } },
9364 { "(bad)", { XX } },
9365 { "(bad)", { XX } },
9366 { "(bad)", { XX } },
9367 { "(bad)", { XX } },
9368 { "(bad)", { XX } },
9369 { "(bad)", { XX } },
9370 },
9371 {
9372 /* RM_0F01_REG_3 */
9373 { "vmrun", { Skip_MODRM } },
9374 { "vmmcall", { Skip_MODRM } },
9375 { "vmload", { Skip_MODRM } },
9376 { "vmsave", { Skip_MODRM } },
9377 { "stgi", { Skip_MODRM } },
9378 { "clgi", { Skip_MODRM } },
9379 { "skinit", { Skip_MODRM } },
9380 { "invlpga", { Skip_MODRM } },
9381 },
9382 {
9383 /* RM_0F01_REG_7 */
9384 { "swapgs", { Skip_MODRM } },
9385 { "rdtscp", { Skip_MODRM } },
9386 { "(bad)", { XX } },
9387 { "(bad)", { XX } },
9388 { "(bad)", { XX } },
9389 { "(bad)", { XX } },
9390 { "(bad)", { XX } },
9391 { "(bad)", { XX } },
9392 },
9393 {
9394 /* RM_0FAE_REG_5 */
9395 { "lfence", { Skip_MODRM } },
9396 { "(bad)", { XX } },
9397 { "(bad)", { XX } },
9398 { "(bad)", { XX } },
9399 { "(bad)", { XX } },
9400 { "(bad)", { XX } },
9401 { "(bad)", { XX } },
9402 { "(bad)", { XX } },
9403 },
9404 {
9405 /* RM_0FAE_REG_6 */
9406 { "mfence", { Skip_MODRM } },
9407 { "(bad)", { XX } },
9408 { "(bad)", { XX } },
9409 { "(bad)", { XX } },
9410 { "(bad)", { XX } },
9411 { "(bad)", { XX } },
9412 { "(bad)", { XX } },
9413 { "(bad)", { XX } },
9414 },
9415 {
9416 /* RM_0FAE_REG_7 */
9417 { "sfence", { Skip_MODRM } },
9418 { "(bad)", { XX } },
9419 { "(bad)", { XX } },
9420 { "(bad)", { XX } },
9421 { "(bad)", { XX } },
9422 { "(bad)", { XX } },
9423 { "(bad)", { XX } },
9424 { "(bad)", { XX } },
9425 },
9426 };
9427
9428 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
9429
9430 static void
9431 ckprefix (void)
9432 {
9433 int newrex;
9434 rex = 0;
9435 rex_original = 0;
9436 rex_ignored = 0;
9437 prefixes = 0;
9438 used_prefixes = 0;
9439 rex_used = 0;
9440 while (1)
9441 {
9442 FETCH_DATA (the_info, codep + 1);
9443 newrex = 0;
9444 switch (*codep)
9445 {
9446 /* REX prefixes family. */
9447 case 0x40:
9448 case 0x41:
9449 case 0x42:
9450 case 0x43:
9451 case 0x44:
9452 case 0x45:
9453 case 0x46:
9454 case 0x47:
9455 case 0x48:
9456 case 0x49:
9457 case 0x4a:
9458 case 0x4b:
9459 case 0x4c:
9460 case 0x4d:
9461 case 0x4e:
9462 case 0x4f:
9463 if (address_mode == mode_64bit)
9464 newrex = *codep;
9465 else
9466 return;
9467 break;
9468 case 0xf3:
9469 prefixes |= PREFIX_REPZ;
9470 break;
9471 case 0xf2:
9472 prefixes |= PREFIX_REPNZ;
9473 break;
9474 case 0xf0:
9475 prefixes |= PREFIX_LOCK;
9476 break;
9477 case 0x2e:
9478 prefixes |= PREFIX_CS;
9479 break;
9480 case 0x36:
9481 prefixes |= PREFIX_SS;
9482 break;
9483 case 0x3e:
9484 prefixes |= PREFIX_DS;
9485 break;
9486 case 0x26:
9487 prefixes |= PREFIX_ES;
9488 break;
9489 case 0x64:
9490 prefixes |= PREFIX_FS;
9491 break;
9492 case 0x65:
9493 prefixes |= PREFIX_GS;
9494 break;
9495 case 0x66:
9496 prefixes |= PREFIX_DATA;
9497 break;
9498 case 0x67:
9499 prefixes |= PREFIX_ADDR;
9500 break;
9501 case FWAIT_OPCODE:
9502 /* fwait is really an instruction. If there are prefixes
9503 before the fwait, they belong to the fwait, *not* to the
9504 following instruction. */
9505 if (prefixes || rex)
9506 {
9507 prefixes |= PREFIX_FWAIT;
9508 codep++;
9509 return;
9510 }
9511 prefixes = PREFIX_FWAIT;
9512 break;
9513 default:
9514 return;
9515 }
9516 /* Rex is ignored when followed by another prefix. */
9517 if (rex)
9518 {
9519 rex_used = rex;
9520 return;
9521 }
9522 rex = newrex;
9523 rex_original = rex;
9524 codep++;
9525 }
9526 }
9527
9528 /* Return the name of the prefix byte PREF, or NULL if PREF is not a
9529 prefix byte. */
9530
9531 static const char *
9532 prefix_name (int pref, int sizeflag)
9533 {
9534 static const char *rexes [16] =
9535 {
9536 "rex", /* 0x40 */
9537 "rex.B", /* 0x41 */
9538 "rex.X", /* 0x42 */
9539 "rex.XB", /* 0x43 */
9540 "rex.R", /* 0x44 */
9541 "rex.RB", /* 0x45 */
9542 "rex.RX", /* 0x46 */
9543 "rex.RXB", /* 0x47 */
9544 "rex.W", /* 0x48 */
9545 "rex.WB", /* 0x49 */
9546 "rex.WX", /* 0x4a */
9547 "rex.WXB", /* 0x4b */
9548 "rex.WR", /* 0x4c */
9549 "rex.WRB", /* 0x4d */
9550 "rex.WRX", /* 0x4e */
9551 "rex.WRXB", /* 0x4f */
9552 };
9553
9554 switch (pref)
9555 {
9556 /* REX prefixes family. */
9557 case 0x40:
9558 case 0x41:
9559 case 0x42:
9560 case 0x43:
9561 case 0x44:
9562 case 0x45:
9563 case 0x46:
9564 case 0x47:
9565 case 0x48:
9566 case 0x49:
9567 case 0x4a:
9568 case 0x4b:
9569 case 0x4c:
9570 case 0x4d:
9571 case 0x4e:
9572 case 0x4f:
9573 return rexes [pref - 0x40];
9574 case 0xf3:
9575 return "repz";
9576 case 0xf2:
9577 return "repnz";
9578 case 0xf0:
9579 return "lock";
9580 case 0x2e:
9581 return "cs";
9582 case 0x36:
9583 return "ss";
9584 case 0x3e:
9585 return "ds";
9586 case 0x26:
9587 return "es";
9588 case 0x64:
9589 return "fs";
9590 case 0x65:
9591 return "gs";
9592 case 0x66:
9593 return (sizeflag & DFLAG) ? "data16" : "data32";
9594 case 0x67:
9595 if (address_mode == mode_64bit)
9596 return (sizeflag & AFLAG) ? "addr32" : "addr64";
9597 else
9598 return (sizeflag & AFLAG) ? "addr16" : "addr32";
9599 case FWAIT_OPCODE:
9600 return "fwait";
9601 default:
9602 return NULL;
9603 }
9604 }
9605
9606 static char op_out[MAX_OPERANDS][100];
9607 static int op_ad, op_index[MAX_OPERANDS];
9608 static int two_source_ops;
9609 static bfd_vma op_address[MAX_OPERANDS];
9610 static bfd_vma op_riprel[MAX_OPERANDS];
9611 static bfd_vma start_pc;
9612
9613 /*
9614 * On the 386's of 1988, the maximum length of an instruction is 15 bytes.
9615 * (see topic "Redundant prefixes" in the "Differences from 8086"
9616 * section of the "Virtual 8086 Mode" chapter.)
9617 * 'pc' should be the address of this instruction, it will
9618 * be used to print the target address if this is a relative jump or call
9619 * The function returns the length of this instruction in bytes.
9620 */
9621
9622 static char intel_syntax;
9623 static char intel_mnemonic = !SYSV386_COMPAT;
9624 static char open_char;
9625 static char close_char;
9626 static char separator_char;
9627 static char scale_char;
9628
9629 /* Here for backwards compatibility. When gdb stops using
9630 print_insn_i386_att and print_insn_i386_intel these functions can
9631 disappear, and print_insn_i386 be merged into print_insn. */
9632 int
9633 print_insn_i386_att (bfd_vma pc, disassemble_info *info)
9634 {
9635 intel_syntax = 0;
9636
9637 return print_insn (pc, info);
9638 }
9639
9640 int
9641 print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
9642 {
9643 intel_syntax = 1;
9644
9645 return print_insn (pc, info);
9646 }
9647
9648 int
9649 print_insn_i386 (bfd_vma pc, disassemble_info *info)
9650 {
9651 intel_syntax = -1;
9652
9653 return print_insn (pc, info);
9654 }
9655
9656 void
9657 print_i386_disassembler_options (FILE *stream)
9658 {
9659 fprintf (stream, _("\n\
9660 The following i386/x86-64 specific disassembler options are supported for use\n\
9661 with the -M switch (multiple options should be separated by commas):\n"));
9662
9663 fprintf (stream, _(" x86-64 Disassemble in 64bit mode\n"));
9664 fprintf (stream, _(" i386 Disassemble in 32bit mode\n"));
9665 fprintf (stream, _(" i8086 Disassemble in 16bit mode\n"));
9666 fprintf (stream, _(" att Display instruction in AT&T syntax\n"));
9667 fprintf (stream, _(" intel Display instruction in Intel syntax\n"));
9668 fprintf (stream, _(" att-mnemonic\n"
9669 " Display instruction in AT&T mnemonic\n"));
9670 fprintf (stream, _(" intel-mnemonic\n"
9671 " Display instruction in Intel mnemonic\n"));
9672 fprintf (stream, _(" addr64 Assume 64bit address size\n"));
9673 fprintf (stream, _(" addr32 Assume 32bit address size\n"));
9674 fprintf (stream, _(" addr16 Assume 16bit address size\n"));
9675 fprintf (stream, _(" data32 Assume 32bit data size\n"));
9676 fprintf (stream, _(" data16 Assume 16bit data size\n"));
9677 fprintf (stream, _(" suffix Always display instruction suffix in AT&T syntax\n"));
9678 }
9679
9680 /* Get a pointer to struct dis386 with a valid name. */
9681
9682 static const struct dis386 *
9683 get_valid_dis386 (const struct dis386 *dp, disassemble_info *info)
9684 {
9685 int index, vex_table_index;
9686
9687 if (dp->name != NULL)
9688 return dp;
9689
9690 switch (dp->op[0].bytemode)
9691 {
9692 case USE_REG_TABLE:
9693 dp = &reg_table[dp->op[1].bytemode][modrm.reg];
9694 break;
9695
9696 case USE_MOD_TABLE:
9697 index = modrm.mod == 0x3 ? 1 : 0;
9698 dp = &mod_table[dp->op[1].bytemode][index];
9699 break;
9700
9701 case USE_RM_TABLE:
9702 dp = &rm_table[dp->op[1].bytemode][modrm.rm];
9703 break;
9704
9705 case USE_PREFIX_TABLE:
9706 if (need_vex)
9707 {
9708 /* The prefix in VEX is implicit. */
9709 switch (vex.prefix)
9710 {
9711 case 0:
9712 index = 0;
9713 break;
9714 case REPE_PREFIX_OPCODE:
9715 index = 1;
9716 break;
9717 case DATA_PREFIX_OPCODE:
9718 index = 2;
9719 break;
9720 case REPNE_PREFIX_OPCODE:
9721 index = 3;
9722 break;
9723 default:
9724 abort ();
9725 break;
9726 }
9727 }
9728 else
9729 {
9730 index = 0;
9731 used_prefixes |= (prefixes & PREFIX_REPZ);
9732 if (prefixes & PREFIX_REPZ)
9733 {
9734 index = 1;
9735 repz_prefix = NULL;
9736 }
9737 else
9738 {
9739 /* We should check PREFIX_REPNZ and PREFIX_REPZ before
9740 PREFIX_DATA. */
9741 used_prefixes |= (prefixes & PREFIX_REPNZ);
9742 if (prefixes & PREFIX_REPNZ)
9743 {
9744 index = 3;
9745 repnz_prefix = NULL;
9746 }
9747 else
9748 {
9749 used_prefixes |= (prefixes & PREFIX_DATA);
9750 if (prefixes & PREFIX_DATA)
9751 {
9752 index = 2;
9753 data_prefix = NULL;
9754 }
9755 }
9756 }
9757 }
9758 dp = &prefix_table[dp->op[1].bytemode][index];
9759 break;
9760
9761 case USE_X86_64_TABLE:
9762 index = address_mode == mode_64bit ? 1 : 0;
9763 dp = &x86_64_table[dp->op[1].bytemode][index];
9764 break;
9765
9766 case USE_3BYTE_TABLE:
9767 FETCH_DATA (info, codep + 2);
9768 index = *codep++;
9769 dp = &three_byte_table[dp->op[1].bytemode][index];
9770 modrm.mod = (*codep >> 6) & 3;
9771 modrm.reg = (*codep >> 3) & 7;
9772 modrm.rm = *codep & 7;
9773 break;
9774
9775 case USE_VEX_LEN_TABLE:
9776 if (!need_vex)
9777 abort ();
9778
9779 switch (vex.length)
9780 {
9781 case 128:
9782 index = 0;
9783 break;
9784 case 256:
9785 index = 1;
9786 break;
9787 default:
9788 abort ();
9789 break;
9790 }
9791
9792 dp = &vex_len_table[dp->op[1].bytemode][index];
9793 break;
9794
9795 case USE_VEX_C4_TABLE:
9796 FETCH_DATA (info, codep + 3);
9797 /* All bits in the REX prefix are ignored. */
9798 rex_ignored = rex;
9799 rex = ~(*codep >> 5) & 0x7;
9800 switch ((*codep & 0x1f))
9801 {
9802 default:
9803 BadOp ();
9804 case 0x1:
9805 vex_table_index = 0;
9806 break;
9807 case 0x2:
9808 vex_table_index = 1;
9809 break;
9810 case 0x3:
9811 vex_table_index = 2;
9812 break;
9813 }
9814 codep++;
9815 vex.w = *codep & 0x80;
9816 if (vex.w && address_mode == mode_64bit)
9817 rex |= REX_W;
9818
9819 vex.register_specifier = (~(*codep >> 3)) & 0xf;
9820 if (address_mode != mode_64bit
9821 && vex.register_specifier > 0x7)
9822 BadOp ();
9823
9824 vex.length = (*codep & 0x4) ? 256 : 128;
9825 switch ((*codep & 0x3))
9826 {
9827 case 0:
9828 vex.prefix = 0;
9829 break;
9830 case 1:
9831 vex.prefix = DATA_PREFIX_OPCODE;
9832 break;
9833 case 2:
9834 vex.prefix = REPE_PREFIX_OPCODE;
9835 break;
9836 case 3:
9837 vex.prefix = REPNE_PREFIX_OPCODE;
9838 break;
9839 }
9840 need_vex = 1;
9841 need_vex_reg = 1;
9842 codep++;
9843 index = *codep++;
9844 dp = &vex_table[vex_table_index][index];
9845 /* There is no MODRM byte for VEX [82|77]. */
9846 if (index != 0x77 && index != 0x82)
9847 {
9848 FETCH_DATA (info, codep + 1);
9849 modrm.mod = (*codep >> 6) & 3;
9850 modrm.reg = (*codep >> 3) & 7;
9851 modrm.rm = *codep & 7;
9852 }
9853 break;
9854
9855 case USE_VEX_C5_TABLE:
9856 FETCH_DATA (info, codep + 2);
9857 /* All bits in the REX prefix are ignored. */
9858 rex_ignored = rex;
9859 rex = (*codep & 0x80) ? 0 : REX_R;
9860
9861 vex.register_specifier = (~(*codep >> 3)) & 0xf;
9862 if (address_mode != mode_64bit
9863 && vex.register_specifier > 0x7)
9864 BadOp ();
9865
9866 vex.length = (*codep & 0x4) ? 256 : 128;
9867 switch ((*codep & 0x3))
9868 {
9869 case 0:
9870 vex.prefix = 0;
9871 break;
9872 case 1:
9873 vex.prefix = DATA_PREFIX_OPCODE;
9874 break;
9875 case 2:
9876 vex.prefix = REPE_PREFIX_OPCODE;
9877 break;
9878 case 3:
9879 vex.prefix = REPNE_PREFIX_OPCODE;
9880 break;
9881 }
9882 need_vex = 1;
9883 need_vex_reg = 1;
9884 codep++;
9885 index = *codep++;
9886 dp = &vex_table[dp->op[1].bytemode][index];
9887 /* There is no MODRM byte for VEX [82|77]. */
9888 if (index != 0x77 && index != 0x82)
9889 {
9890 FETCH_DATA (info, codep + 1);
9891 modrm.mod = (*codep >> 6) & 3;
9892 modrm.reg = (*codep >> 3) & 7;
9893 modrm.rm = *codep & 7;
9894 }
9895 break;
9896
9897 default:
9898 oappend (INTERNAL_DISASSEMBLER_ERROR);
9899 return NULL;
9900 }
9901
9902 if (dp->name != NULL)
9903 return dp;
9904 else
9905 return get_valid_dis386 (dp, info);
9906 }
9907
9908 static int
9909 print_insn (bfd_vma pc, disassemble_info *info)
9910 {
9911 const struct dis386 *dp;
9912 int i;
9913 char *op_txt[MAX_OPERANDS];
9914 int needcomma;
9915 int sizeflag;
9916 const char *p;
9917 struct dis_private priv;
9918 unsigned char op;
9919 char prefix_obuf[32];
9920 char *prefix_obufp;
9921
9922 if (info->mach == bfd_mach_x86_64_intel_syntax
9923 || info->mach == bfd_mach_x86_64)
9924 address_mode = mode_64bit;
9925 else
9926 address_mode = mode_32bit;
9927
9928 if (intel_syntax == (char) -1)
9929 intel_syntax = (info->mach == bfd_mach_i386_i386_intel_syntax
9930 || info->mach == bfd_mach_x86_64_intel_syntax);
9931
9932 if (info->mach == bfd_mach_i386_i386
9933 || info->mach == bfd_mach_x86_64
9934 || info->mach == bfd_mach_i386_i386_intel_syntax
9935 || info->mach == bfd_mach_x86_64_intel_syntax)
9936 priv.orig_sizeflag = AFLAG | DFLAG;
9937 else if (info->mach == bfd_mach_i386_i8086)
9938 priv.orig_sizeflag = 0;
9939 else
9940 abort ();
9941
9942 for (p = info->disassembler_options; p != NULL; )
9943 {
9944 if (CONST_STRNEQ (p, "x86-64"))
9945 {
9946 address_mode = mode_64bit;
9947 priv.orig_sizeflag = AFLAG | DFLAG;
9948 }
9949 else if (CONST_STRNEQ (p, "i386"))
9950 {
9951 address_mode = mode_32bit;
9952 priv.orig_sizeflag = AFLAG | DFLAG;
9953 }
9954 else if (CONST_STRNEQ (p, "i8086"))
9955 {
9956 address_mode = mode_16bit;
9957 priv.orig_sizeflag = 0;
9958 }
9959 else if (CONST_STRNEQ (p, "intel"))
9960 {
9961 intel_syntax = 1;
9962 if (CONST_STRNEQ (p + 5, "-mnemonic"))
9963 intel_mnemonic = 1;
9964 }
9965 else if (CONST_STRNEQ (p, "att"))
9966 {
9967 intel_syntax = 0;
9968 if (CONST_STRNEQ (p + 3, "-mnemonic"))
9969 intel_mnemonic = 0;
9970 }
9971 else if (CONST_STRNEQ (p, "addr"))
9972 {
9973 if (address_mode == mode_64bit)
9974 {
9975 if (p[4] == '3' && p[5] == '2')
9976 priv.orig_sizeflag &= ~AFLAG;
9977 else if (p[4] == '6' && p[5] == '4')
9978 priv.orig_sizeflag |= AFLAG;
9979 }
9980 else
9981 {
9982 if (p[4] == '1' && p[5] == '6')
9983 priv.orig_sizeflag &= ~AFLAG;
9984 else if (p[4] == '3' && p[5] == '2')
9985 priv.orig_sizeflag |= AFLAG;
9986 }
9987 }
9988 else if (CONST_STRNEQ (p, "data"))
9989 {
9990 if (p[4] == '1' && p[5] == '6')
9991 priv.orig_sizeflag &= ~DFLAG;
9992 else if (p[4] == '3' && p[5] == '2')
9993 priv.orig_sizeflag |= DFLAG;
9994 }
9995 else if (CONST_STRNEQ (p, "suffix"))
9996 priv.orig_sizeflag |= SUFFIX_ALWAYS;
9997
9998 p = strchr (p, ',');
9999 if (p != NULL)
10000 p++;
10001 }
10002
10003 if (intel_syntax)
10004 {
10005 names64 = intel_names64;
10006 names32 = intel_names32;
10007 names16 = intel_names16;
10008 names8 = intel_names8;
10009 names8rex = intel_names8rex;
10010 names_seg = intel_names_seg;
10011 index64 = intel_index64;
10012 index32 = intel_index32;
10013 index16 = intel_index16;
10014 open_char = '[';
10015 close_char = ']';
10016 separator_char = '+';
10017 scale_char = '*';
10018 }
10019 else
10020 {
10021 names64 = att_names64;
10022 names32 = att_names32;
10023 names16 = att_names16;
10024 names8 = att_names8;
10025 names8rex = att_names8rex;
10026 names_seg = att_names_seg;
10027 index64 = att_index64;
10028 index32 = att_index32;
10029 index16 = att_index16;
10030 open_char = '(';
10031 close_char = ')';
10032 separator_char = ',';
10033 scale_char = ',';
10034 }
10035
10036 /* The output looks better if we put 7 bytes on a line, since that
10037 puts most long word instructions on a single line. */
10038 info->bytes_per_line = 7;
10039
10040 info->private_data = &priv;
10041 priv.max_fetched = priv.the_buffer;
10042 priv.insn_start = pc;
10043
10044 obuf[0] = 0;
10045 for (i = 0; i < MAX_OPERANDS; ++i)
10046 {
10047 op_out[i][0] = 0;
10048 op_index[i] = -1;
10049 }
10050
10051 the_info = info;
10052 start_pc = pc;
10053 start_codep = priv.the_buffer;
10054 codep = priv.the_buffer;
10055
10056 if (setjmp (priv.bailout) != 0)
10057 {
10058 const char *name;
10059
10060 /* Getting here means we tried for data but didn't get it. That
10061 means we have an incomplete instruction of some sort. Just
10062 print the first byte as a prefix or a .byte pseudo-op. */
10063 if (codep > priv.the_buffer)
10064 {
10065 name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
10066 if (name != NULL)
10067 (*info->fprintf_func) (info->stream, "%s", name);
10068 else
10069 {
10070 /* Just print the first byte as a .byte instruction. */
10071 (*info->fprintf_func) (info->stream, ".byte 0x%x",
10072 (unsigned int) priv.the_buffer[0]);
10073 }
10074
10075 return 1;
10076 }
10077
10078 return -1;
10079 }
10080
10081 obufp = obuf;
10082 ckprefix ();
10083
10084 insn_codep = codep;
10085 sizeflag = priv.orig_sizeflag;
10086
10087 FETCH_DATA (info, codep + 1);
10088 two_source_ops = (*codep == 0x62) || (*codep == 0xc8);
10089
10090 if (((prefixes & PREFIX_FWAIT)
10091 && ((*codep < 0xd8) || (*codep > 0xdf)))
10092 || (rex && rex_used))
10093 {
10094 const char *name;
10095
10096 /* fwait not followed by floating point instruction, or rex followed
10097 by other prefixes. Print the first prefix. */
10098 name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
10099 if (name == NULL)
10100 name = INTERNAL_DISASSEMBLER_ERROR;
10101 (*info->fprintf_func) (info->stream, "%s", name);
10102 return 1;
10103 }
10104
10105 op = 0;
10106 if (*codep == 0x0f)
10107 {
10108 unsigned char threebyte;
10109 FETCH_DATA (info, codep + 2);
10110 threebyte = *++codep;
10111 dp = &dis386_twobyte[threebyte];
10112 need_modrm = twobyte_has_modrm[*codep];
10113 codep++;
10114 }
10115 else
10116 {
10117 dp = &dis386[*codep];
10118 need_modrm = onebyte_has_modrm[*codep];
10119 codep++;
10120 }
10121
10122 if ((prefixes & PREFIX_REPZ))
10123 {
10124 repz_prefix = "repz ";
10125 used_prefixes |= PREFIX_REPZ;
10126 }
10127 else
10128 repz_prefix = NULL;
10129
10130 if ((prefixes & PREFIX_REPNZ))
10131 {
10132 repnz_prefix = "repnz ";
10133 used_prefixes |= PREFIX_REPNZ;
10134 }
10135 else
10136 repnz_prefix = NULL;
10137
10138 if ((prefixes & PREFIX_LOCK))
10139 {
10140 lock_prefix = "lock ";
10141 used_prefixes |= PREFIX_LOCK;
10142 }
10143 else
10144 lock_prefix = NULL;
10145
10146 addr_prefix = NULL;
10147 if (prefixes & PREFIX_ADDR)
10148 {
10149 sizeflag ^= AFLAG;
10150 if (dp->op[2].bytemode != loop_jcxz_mode || intel_syntax)
10151 {
10152 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
10153 addr_prefix = "addr32 ";
10154 else
10155 addr_prefix = "addr16 ";
10156 used_prefixes |= PREFIX_ADDR;
10157 }
10158 }
10159
10160 data_prefix = NULL;
10161 if ((prefixes & PREFIX_DATA))
10162 {
10163 sizeflag ^= DFLAG;
10164 if (dp->op[2].bytemode == cond_jump_mode
10165 && dp->op[0].bytemode == v_mode
10166 && !intel_syntax)
10167 {
10168 if (sizeflag & DFLAG)
10169 data_prefix = "data32 ";
10170 else
10171 data_prefix = "data16 ";
10172 used_prefixes |= PREFIX_DATA;
10173 }
10174 }
10175
10176 if (need_modrm)
10177 {
10178 FETCH_DATA (info, codep + 1);
10179 modrm.mod = (*codep >> 6) & 3;
10180 modrm.reg = (*codep >> 3) & 7;
10181 modrm.rm = *codep & 7;
10182 }
10183
10184 if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
10185 {
10186 dofloat (sizeflag);
10187 }
10188 else
10189 {
10190 need_vex = 0;
10191 need_vex_reg = 0;
10192 vex_w_done = 0;
10193 dp = get_valid_dis386 (dp, info);
10194 if (dp != NULL && putop (dp->name, sizeflag) == 0)
10195 {
10196 for (i = 0; i < MAX_OPERANDS; ++i)
10197 {
10198 obufp = op_out[i];
10199 op_ad = MAX_OPERANDS - 1 - i;
10200 if (dp->op[i].rtn)
10201 (*dp->op[i].rtn) (dp->op[i].bytemode, sizeflag);
10202 }
10203 }
10204 }
10205
10206 /* See if any prefixes were not used. If so, print the first one
10207 separately. If we don't do this, we'll wind up printing an
10208 instruction stream which does not precisely correspond to the
10209 bytes we are disassembling. */
10210 if ((prefixes & ~used_prefixes) != 0)
10211 {
10212 const char *name;
10213
10214 name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
10215 if (name == NULL)
10216 name = INTERNAL_DISASSEMBLER_ERROR;
10217 (*info->fprintf_func) (info->stream, "%s", name);
10218 return 1;
10219 }
10220 if ((rex_original & ~rex_used) || rex_ignored)
10221 {
10222 const char *name;
10223 name = prefix_name (rex_original, priv.orig_sizeflag);
10224 if (name == NULL)
10225 name = INTERNAL_DISASSEMBLER_ERROR;
10226 (*info->fprintf_func) (info->stream, "%s ", name);
10227 }
10228
10229 prefix_obuf[0] = 0;
10230 prefix_obufp = prefix_obuf;
10231 if (lock_prefix)
10232 prefix_obufp = stpcpy (prefix_obufp, lock_prefix);
10233 if (repz_prefix)
10234 prefix_obufp = stpcpy (prefix_obufp, repz_prefix);
10235 if (repnz_prefix)
10236 prefix_obufp = stpcpy (prefix_obufp, repnz_prefix);
10237 if (addr_prefix)
10238 prefix_obufp = stpcpy (prefix_obufp, addr_prefix);
10239 if (data_prefix)
10240 prefix_obufp = stpcpy (prefix_obufp, data_prefix);
10241
10242 if (prefix_obuf[0] != 0)
10243 (*info->fprintf_func) (info->stream, "%s", prefix_obuf);
10244
10245 obufp = obuf + strlen (obuf);
10246 for (i = strlen (obuf) + strlen (prefix_obuf); i < 6; i++)
10247 oappend (" ");
10248 oappend (" ");
10249 (*info->fprintf_func) (info->stream, "%s", obuf);
10250
10251 /* The enter and bound instructions are printed with operands in the same
10252 order as the intel book; everything else is printed in reverse order. */
10253 if (intel_syntax || two_source_ops)
10254 {
10255 bfd_vma riprel;
10256
10257 for (i = 0; i < MAX_OPERANDS; ++i)
10258 op_txt[i] = op_out[i];
10259
10260 for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
10261 {
10262 op_ad = op_index[i];
10263 op_index[i] = op_index[MAX_OPERANDS - 1 - i];
10264 op_index[MAX_OPERANDS - 1 - i] = op_ad;
10265 riprel = op_riprel[i];
10266 op_riprel[i] = op_riprel [MAX_OPERANDS - 1 - i];
10267 op_riprel[MAX_OPERANDS - 1 - i] = riprel;
10268 }
10269 }
10270 else
10271 {
10272 for (i = 0; i < MAX_OPERANDS; ++i)
10273 op_txt[MAX_OPERANDS - 1 - i] = op_out[i];
10274 }
10275
10276 needcomma = 0;
10277 for (i = 0; i < MAX_OPERANDS; ++i)
10278 if (*op_txt[i])
10279 {
10280 if (needcomma)
10281 (*info->fprintf_func) (info->stream, ",");
10282 if (op_index[i] != -1 && !op_riprel[i])
10283 (*info->print_address_func) ((bfd_vma) op_address[op_index[i]], info);
10284 else
10285 (*info->fprintf_func) (info->stream, "%s", op_txt[i]);
10286 needcomma = 1;
10287 }
10288
10289 for (i = 0; i < MAX_OPERANDS; i++)
10290 if (op_index[i] != -1 && op_riprel[i])
10291 {
10292 (*info->fprintf_func) (info->stream, " # ");
10293 (*info->print_address_func) ((bfd_vma) (start_pc + codep - start_codep
10294 + op_address[op_index[i]]), info);
10295 break;
10296 }
10297 return codep - priv.the_buffer;
10298 }
10299
10300 static const char *float_mem[] = {
10301 /* d8 */
10302 "fadd{s|}",
10303 "fmul{s|}",
10304 "fcom{s|}",
10305 "fcomp{s|}",
10306 "fsub{s|}",
10307 "fsubr{s|}",
10308 "fdiv{s|}",
10309 "fdivr{s|}",
10310 /* d9 */
10311 "fld{s|}",
10312 "(bad)",
10313 "fst{s|}",
10314 "fstp{s|}",
10315 "fldenvIC",
10316 "fldcw",
10317 "fNstenvIC",
10318 "fNstcw",
10319 /* da */
10320 "fiadd{l|}",
10321 "fimul{l|}",
10322 "ficom{l|}",
10323 "ficomp{l|}",
10324 "fisub{l|}",
10325 "fisubr{l|}",
10326 "fidiv{l|}",
10327 "fidivr{l|}",
10328 /* db */
10329 "fild{l|}",
10330 "fisttp{l|}",
10331 "fist{l|}",
10332 "fistp{l|}",
10333 "(bad)",
10334 "fld{t||t|}",
10335 "(bad)",
10336 "fstp{t||t|}",
10337 /* dc */
10338 "fadd{l|}",
10339 "fmul{l|}",
10340 "fcom{l|}",
10341 "fcomp{l|}",
10342 "fsub{l|}",
10343 "fsubr{l|}",
10344 "fdiv{l|}",
10345 "fdivr{l|}",
10346 /* dd */
10347 "fld{l|}",
10348 "fisttp{ll|}",
10349 "fst{l||}",
10350 "fstp{l|}",
10351 "frstorIC",
10352 "(bad)",
10353 "fNsaveIC",
10354 "fNstsw",
10355 /* de */
10356 "fiadd",
10357 "fimul",
10358 "ficom",
10359 "ficomp",
10360 "fisub",
10361 "fisubr",
10362 "fidiv",
10363 "fidivr",
10364 /* df */
10365 "fild",
10366 "fisttp",
10367 "fist",
10368 "fistp",
10369 "fbld",
10370 "fild{ll|}",
10371 "fbstp",
10372 "fistp{ll|}",
10373 };
10374
10375 static const unsigned char float_mem_mode[] = {
10376 /* d8 */
10377 d_mode,
10378 d_mode,
10379 d_mode,
10380 d_mode,
10381 d_mode,
10382 d_mode,
10383 d_mode,
10384 d_mode,
10385 /* d9 */
10386 d_mode,
10387 0,
10388 d_mode,
10389 d_mode,
10390 0,
10391 w_mode,
10392 0,
10393 w_mode,
10394 /* da */
10395 d_mode,
10396 d_mode,
10397 d_mode,
10398 d_mode,
10399 d_mode,
10400 d_mode,
10401 d_mode,
10402 d_mode,
10403 /* db */
10404 d_mode,
10405 d_mode,
10406 d_mode,
10407 d_mode,
10408 0,
10409 t_mode,
10410 0,
10411 t_mode,
10412 /* dc */
10413 q_mode,
10414 q_mode,
10415 q_mode,
10416 q_mode,
10417 q_mode,
10418 q_mode,
10419 q_mode,
10420 q_mode,
10421 /* dd */
10422 q_mode,
10423 q_mode,
10424 q_mode,
10425 q_mode,
10426 0,
10427 0,
10428 0,
10429 w_mode,
10430 /* de */
10431 w_mode,
10432 w_mode,
10433 w_mode,
10434 w_mode,
10435 w_mode,
10436 w_mode,
10437 w_mode,
10438 w_mode,
10439 /* df */
10440 w_mode,
10441 w_mode,
10442 w_mode,
10443 w_mode,
10444 t_mode,
10445 q_mode,
10446 t_mode,
10447 q_mode
10448 };
10449
10450 #define ST { OP_ST, 0 }
10451 #define STi { OP_STi, 0 }
10452
10453 #define FGRPd9_2 NULL, { { NULL, 0 } }
10454 #define FGRPd9_4 NULL, { { NULL, 1 } }
10455 #define FGRPd9_5 NULL, { { NULL, 2 } }
10456 #define FGRPd9_6 NULL, { { NULL, 3 } }
10457 #define FGRPd9_7 NULL, { { NULL, 4 } }
10458 #define FGRPda_5 NULL, { { NULL, 5 } }
10459 #define FGRPdb_4 NULL, { { NULL, 6 } }
10460 #define FGRPde_3 NULL, { { NULL, 7 } }
10461 #define FGRPdf_4 NULL, { { NULL, 8 } }
10462
10463 static const struct dis386 float_reg[][8] = {
10464 /* d8 */
10465 {
10466 { "fadd", { ST, STi } },
10467 { "fmul", { ST, STi } },
10468 { "fcom", { STi } },
10469 { "fcomp", { STi } },
10470 { "fsub", { ST, STi } },
10471 { "fsubr", { ST, STi } },
10472 { "fdiv", { ST, STi } },
10473 { "fdivr", { ST, STi } },
10474 },
10475 /* d9 */
10476 {
10477 { "fld", { STi } },
10478 { "fxch", { STi } },
10479 { FGRPd9_2 },
10480 { "(bad)", { XX } },
10481 { FGRPd9_4 },
10482 { FGRPd9_5 },
10483 { FGRPd9_6 },
10484 { FGRPd9_7 },
10485 },
10486 /* da */
10487 {
10488 { "fcmovb", { ST, STi } },
10489 { "fcmove", { ST, STi } },
10490 { "fcmovbe",{ ST, STi } },
10491 { "fcmovu", { ST, STi } },
10492 { "(bad)", { XX } },
10493 { FGRPda_5 },
10494 { "(bad)", { XX } },
10495 { "(bad)", { XX } },
10496 },
10497 /* db */
10498 {
10499 { "fcmovnb",{ ST, STi } },
10500 { "fcmovne",{ ST, STi } },
10501 { "fcmovnbe",{ ST, STi } },
10502 { "fcmovnu",{ ST, STi } },
10503 { FGRPdb_4 },
10504 { "fucomi", { ST, STi } },
10505 { "fcomi", { ST, STi } },
10506 { "(bad)", { XX } },
10507 },
10508 /* dc */
10509 {
10510 { "fadd", { STi, ST } },
10511 { "fmul", { STi, ST } },
10512 { "(bad)", { XX } },
10513 { "(bad)", { XX } },
10514 { "fsub!M", { STi, ST } },
10515 { "fsubM", { STi, ST } },
10516 { "fdiv!M", { STi, ST } },
10517 { "fdivM", { STi, ST } },
10518 },
10519 /* dd */
10520 {
10521 { "ffree", { STi } },
10522 { "(bad)", { XX } },
10523 { "fst", { STi } },
10524 { "fstp", { STi } },
10525 { "fucom", { STi } },
10526 { "fucomp", { STi } },
10527 { "(bad)", { XX } },
10528 { "(bad)", { XX } },
10529 },
10530 /* de */
10531 {
10532 { "faddp", { STi, ST } },
10533 { "fmulp", { STi, ST } },
10534 { "(bad)", { XX } },
10535 { FGRPde_3 },
10536 { "fsub!Mp", { STi, ST } },
10537 { "fsubMp", { STi, ST } },
10538 { "fdiv!Mp", { STi, ST } },
10539 { "fdivMp", { STi, ST } },
10540 },
10541 /* df */
10542 {
10543 { "ffreep", { STi } },
10544 { "(bad)", { XX } },
10545 { "(bad)", { XX } },
10546 { "(bad)", { XX } },
10547 { FGRPdf_4 },
10548 { "fucomip", { ST, STi } },
10549 { "fcomip", { ST, STi } },
10550 { "(bad)", { XX } },
10551 },
10552 };
10553
10554 static char *fgrps[][8] = {
10555 /* d9_2 0 */
10556 {
10557 "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10558 },
10559
10560 /* d9_4 1 */
10561 {
10562 "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
10563 },
10564
10565 /* d9_5 2 */
10566 {
10567 "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
10568 },
10569
10570 /* d9_6 3 */
10571 {
10572 "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
10573 },
10574
10575 /* d9_7 4 */
10576 {
10577 "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
10578 },
10579
10580 /* da_5 5 */
10581 {
10582 "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10583 },
10584
10585 /* db_4 6 */
10586 {
10587 "feni(287 only)","fdisi(287 only)","fNclex","fNinit",
10588 "fNsetpm(287 only)","(bad)","(bad)","(bad)",
10589 },
10590
10591 /* de_3 7 */
10592 {
10593 "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10594 },
10595
10596 /* df_4 8 */
10597 {
10598 "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10599 },
10600 };
10601
10602 static void
10603 OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED,
10604 int sizeflag ATTRIBUTE_UNUSED)
10605 {
10606 /* Skip mod/rm byte. */
10607 MODRM_CHECK;
10608 codep++;
10609 }
10610
10611 static void
10612 dofloat (int sizeflag)
10613 {
10614 const struct dis386 *dp;
10615 unsigned char floatop;
10616
10617 floatop = codep[-1];
10618
10619 if (modrm.mod != 3)
10620 {
10621 int fp_indx = (floatop - 0xd8) * 8 + modrm.reg;
10622
10623 putop (float_mem[fp_indx], sizeflag);
10624 obufp = op_out[0];
10625 op_ad = 2;
10626 OP_E (float_mem_mode[fp_indx], sizeflag);
10627 return;
10628 }
10629 /* Skip mod/rm byte. */
10630 MODRM_CHECK;
10631 codep++;
10632
10633 dp = &float_reg[floatop - 0xd8][modrm.reg];
10634 if (dp->name == NULL)
10635 {
10636 putop (fgrps[dp->op[0].bytemode][modrm.rm], sizeflag);
10637
10638 /* Instruction fnstsw is only one with strange arg. */
10639 if (floatop == 0xdf && codep[-1] == 0xe0)
10640 strcpy (op_out[0], names16[0]);
10641 }
10642 else
10643 {
10644 putop (dp->name, sizeflag);
10645
10646 obufp = op_out[0];
10647 op_ad = 2;
10648 if (dp->op[0].rtn)
10649 (*dp->op[0].rtn) (dp->op[0].bytemode, sizeflag);
10650
10651 obufp = op_out[1];
10652 op_ad = 1;
10653 if (dp->op[1].rtn)
10654 (*dp->op[1].rtn) (dp->op[1].bytemode, sizeflag);
10655 }
10656 }
10657
10658 static void
10659 OP_ST (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
10660 {
10661 oappend ("%st" + intel_syntax);
10662 }
10663
10664 static void
10665 OP_STi (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
10666 {
10667 sprintf (scratchbuf, "%%st(%d)", modrm.rm);
10668 oappend (scratchbuf + intel_syntax);
10669 }
10670
10671 /* Capital letters in template are macros. */
10672 static int
10673 putop (const char *template, int sizeflag)
10674 {
10675 const char *p;
10676 int alt = 0;
10677 int cond = 1;
10678 unsigned int l = 0, len = 1;
10679 char last[4];
10680
10681 #define SAVE_LAST(c) \
10682 if (l < len && l < sizeof (last)) \
10683 last[l++] = c; \
10684 else \
10685 abort ();
10686
10687 for (p = template; *p; p++)
10688 {
10689 switch (*p)
10690 {
10691 default:
10692 *obufp++ = *p;
10693 break;
10694 case '%':
10695 len++;
10696 break;
10697 case '!':
10698 cond = 0;
10699 break;
10700 case '{':
10701 alt = 0;
10702 if (intel_syntax)
10703 {
10704 while (*++p != '|')
10705 if (*p == '}' || *p == '\0')
10706 abort ();
10707 }
10708 /* Fall through. */
10709 case 'I':
10710 alt = 1;
10711 continue;
10712 case '|':
10713 while (*++p != '}')
10714 {
10715 if (*p == '\0')
10716 abort ();
10717 }
10718 break;
10719 case '}':
10720 break;
10721 case 'A':
10722 if (intel_syntax)
10723 break;
10724 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
10725 *obufp++ = 'b';
10726 break;
10727 case 'B':
10728 if (intel_syntax)
10729 break;
10730 if (sizeflag & SUFFIX_ALWAYS)
10731 *obufp++ = 'b';
10732 break;
10733 case 'C':
10734 if (intel_syntax && !alt)
10735 break;
10736 if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
10737 {
10738 if (sizeflag & DFLAG)
10739 *obufp++ = intel_syntax ? 'd' : 'l';
10740 else
10741 *obufp++ = intel_syntax ? 'w' : 's';
10742 used_prefixes |= (prefixes & PREFIX_DATA);
10743 }
10744 break;
10745 case 'D':
10746 if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
10747 break;
10748 USED_REX (REX_W);
10749 if (modrm.mod == 3)
10750 {
10751 if (rex & REX_W)
10752 *obufp++ = 'q';
10753 else if (sizeflag & DFLAG)
10754 *obufp++ = intel_syntax ? 'd' : 'l';
10755 else
10756 *obufp++ = 'w';
10757 used_prefixes |= (prefixes & PREFIX_DATA);
10758 }
10759 else
10760 *obufp++ = 'w';
10761 break;
10762 case 'E': /* For jcxz/jecxz */
10763 if (address_mode == mode_64bit)
10764 {
10765 if (sizeflag & AFLAG)
10766 *obufp++ = 'r';
10767 else
10768 *obufp++ = 'e';
10769 }
10770 else
10771 if (sizeflag & AFLAG)
10772 *obufp++ = 'e';
10773 used_prefixes |= (prefixes & PREFIX_ADDR);
10774 break;
10775 case 'F':
10776 if (intel_syntax)
10777 break;
10778 if ((prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
10779 {
10780 if (sizeflag & AFLAG)
10781 *obufp++ = address_mode == mode_64bit ? 'q' : 'l';
10782 else
10783 *obufp++ = address_mode == mode_64bit ? 'l' : 'w';
10784 used_prefixes |= (prefixes & PREFIX_ADDR);
10785 }
10786 break;
10787 case 'G':
10788 if (intel_syntax || (obufp[-1] != 's' && !(sizeflag & SUFFIX_ALWAYS)))
10789 break;
10790 if ((rex & REX_W) || (sizeflag & DFLAG))
10791 *obufp++ = 'l';
10792 else
10793 *obufp++ = 'w';
10794 if (!(rex & REX_W))
10795 used_prefixes |= (prefixes & PREFIX_DATA);
10796 break;
10797 case 'H':
10798 if (intel_syntax)
10799 break;
10800 if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
10801 || (prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
10802 {
10803 used_prefixes |= prefixes & (PREFIX_CS | PREFIX_DS);
10804 *obufp++ = ',';
10805 *obufp++ = 'p';
10806 if (prefixes & PREFIX_DS)
10807 *obufp++ = 't';
10808 else
10809 *obufp++ = 'n';
10810 }
10811 break;
10812 case 'J':
10813 if (intel_syntax)
10814 break;
10815 *obufp++ = 'l';
10816 break;
10817 case 'K':
10818 USED_REX (REX_W);
10819 if (rex & REX_W)
10820 *obufp++ = 'q';
10821 else
10822 *obufp++ = 'd';
10823 break;
10824 case 'Z':
10825 if (intel_syntax)
10826 break;
10827 if (address_mode == mode_64bit && (sizeflag & SUFFIX_ALWAYS))
10828 {
10829 *obufp++ = 'q';
10830 break;
10831 }
10832 /* Fall through. */
10833 goto case_L;
10834 case 'L':
10835 if (l != 0 || len != 1)
10836 {
10837 SAVE_LAST (*p);
10838 break;
10839 }
10840 case_L:
10841 if (intel_syntax)
10842 break;
10843 if (sizeflag & SUFFIX_ALWAYS)
10844 *obufp++ = 'l';
10845 break;
10846 case 'M':
10847 if (intel_mnemonic != cond)
10848 *obufp++ = 'r';
10849 break;
10850 case 'N':
10851 if ((prefixes & PREFIX_FWAIT) == 0)
10852 *obufp++ = 'n';
10853 else
10854 used_prefixes |= PREFIX_FWAIT;
10855 break;
10856 case 'O':
10857 USED_REX (REX_W);
10858 if (rex & REX_W)
10859 *obufp++ = 'o';
10860 else if (intel_syntax && (sizeflag & DFLAG))
10861 *obufp++ = 'q';
10862 else
10863 *obufp++ = 'd';
10864 if (!(rex & REX_W))
10865 used_prefixes |= (prefixes & PREFIX_DATA);
10866 break;
10867 case 'T':
10868 if (intel_syntax)
10869 break;
10870 if (address_mode == mode_64bit && (sizeflag & DFLAG))
10871 {
10872 *obufp++ = 'q';
10873 break;
10874 }
10875 /* Fall through. */
10876 case 'P':
10877 if (intel_syntax)
10878 break;
10879 if ((prefixes & PREFIX_DATA)
10880 || (rex & REX_W)
10881 || (sizeflag & SUFFIX_ALWAYS))
10882 {
10883 USED_REX (REX_W);
10884 if (rex & REX_W)
10885 *obufp++ = 'q';
10886 else
10887 {
10888 if (sizeflag & DFLAG)
10889 *obufp++ = 'l';
10890 else
10891 *obufp++ = 'w';
10892 }
10893 used_prefixes |= (prefixes & PREFIX_DATA);
10894 }
10895 break;
10896 case 'U':
10897 if (intel_syntax)
10898 break;
10899 if (address_mode == mode_64bit && (sizeflag & DFLAG))
10900 {
10901 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
10902 *obufp++ = 'q';
10903 break;
10904 }
10905 /* Fall through. */
10906 goto case_Q;
10907 case 'Q':
10908 if (l == 0 && len == 1)
10909 {
10910 case_Q:
10911 if (intel_syntax && !alt)
10912 break;
10913 USED_REX (REX_W);
10914 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
10915 {
10916 if (rex & REX_W)
10917 *obufp++ = 'q';
10918 else
10919 {
10920 if (sizeflag & DFLAG)
10921 *obufp++ = intel_syntax ? 'd' : 'l';
10922 else
10923 *obufp++ = 'w';
10924 }
10925 used_prefixes |= (prefixes & PREFIX_DATA);
10926 }
10927 }
10928 else
10929 {
10930 if (l != 1 || len != 2 || last[0] != 'L')
10931 {
10932 SAVE_LAST (*p);
10933 break;
10934 }
10935 if (intel_syntax
10936 || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
10937 break;
10938 if ((rex & REX_W))
10939 {
10940 USED_REX (REX_W);
10941 *obufp++ = 'q';
10942 }
10943 else
10944 *obufp++ = 'l';
10945 }
10946 break;
10947 case 'R':
10948 USED_REX (REX_W);
10949 if (rex & REX_W)
10950 *obufp++ = 'q';
10951 else if (sizeflag & DFLAG)
10952 {
10953 if (intel_syntax)
10954 *obufp++ = 'd';
10955 else
10956 *obufp++ = 'l';
10957 }
10958 else
10959 *obufp++ = 'w';
10960 if (intel_syntax && !p[1]
10961 && ((rex & REX_W) || (sizeflag & DFLAG)))
10962 *obufp++ = 'e';
10963 if (!(rex & REX_W))
10964 used_prefixes |= (prefixes & PREFIX_DATA);
10965 break;
10966 case 'V':
10967 if (intel_syntax)
10968 break;
10969 if (address_mode == mode_64bit && (sizeflag & DFLAG))
10970 {
10971 if (sizeflag & SUFFIX_ALWAYS)
10972 *obufp++ = 'q';
10973 break;
10974 }
10975 /* Fall through. */
10976 case 'S':
10977 if (intel_syntax)
10978 break;
10979 if (sizeflag & SUFFIX_ALWAYS)
10980 {
10981 if (rex & REX_W)
10982 *obufp++ = 'q';
10983 else
10984 {
10985 if (sizeflag & DFLAG)
10986 *obufp++ = 'l';
10987 else
10988 *obufp++ = 'w';
10989 used_prefixes |= (prefixes & PREFIX_DATA);
10990 }
10991 }
10992 break;
10993 case 'X':
10994 if (l != 0 || len != 1)
10995 {
10996 SAVE_LAST (*p);
10997 break;
10998 }
10999 if (need_vex && vex.prefix)
11000 {
11001 if (vex.prefix == DATA_PREFIX_OPCODE)
11002 *obufp++ = 'd';
11003 else
11004 *obufp++ = 's';
11005 }
11006 else if (prefixes & PREFIX_DATA)
11007 *obufp++ = 'd';
11008 else
11009 *obufp++ = 's';
11010 used_prefixes |= (prefixes & PREFIX_DATA);
11011 break;
11012 case 'Y':
11013 if (l == 0 && len == 1)
11014 {
11015 if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
11016 break;
11017 if (rex & REX_W)
11018 {
11019 USED_REX (REX_W);
11020 *obufp++ = 'q';
11021 }
11022 break;
11023 }
11024 else
11025 {
11026 if (l != 1 || len != 2 || last[0] != 'X')
11027 {
11028 SAVE_LAST (*p);
11029 break;
11030 }
11031 if (!need_vex)
11032 abort ();
11033 if (intel_syntax
11034 || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
11035 break;
11036 switch (vex.length)
11037 {
11038 case 128:
11039 *obufp++ = 'x';
11040 break;
11041 case 256:
11042 *obufp++ = 'y';
11043 break;
11044 default:
11045 abort ();
11046 }
11047 }
11048 break;
11049 /* implicit operand size 'l' for i386 or 'q' for x86-64 */
11050 case 'W':
11051 /* operand size flag for cwtl, cbtw */
11052 USED_REX (REX_W);
11053 if (rex & REX_W)
11054 {
11055 if (intel_syntax)
11056 *obufp++ = 'd';
11057 else
11058 *obufp++ = 'l';
11059 }
11060 else if (sizeflag & DFLAG)
11061 *obufp++ = 'w';
11062 else
11063 *obufp++ = 'b';
11064 if (!(rex & REX_W))
11065 used_prefixes |= (prefixes & PREFIX_DATA);
11066 break;
11067 }
11068 alt = 0;
11069 }
11070 *obufp = 0;
11071 return 0;
11072 }
11073
11074 static void
11075 oappend (const char *s)
11076 {
11077 strcpy (obufp, s);
11078 obufp += strlen (s);
11079 }
11080
11081 static void
11082 append_seg (void)
11083 {
11084 if (prefixes & PREFIX_CS)
11085 {
11086 used_prefixes |= PREFIX_CS;
11087 oappend ("%cs:" + intel_syntax);
11088 }
11089 if (prefixes & PREFIX_DS)
11090 {
11091 used_prefixes |= PREFIX_DS;
11092 oappend ("%ds:" + intel_syntax);
11093 }
11094 if (prefixes & PREFIX_SS)
11095 {
11096 used_prefixes |= PREFIX_SS;
11097 oappend ("%ss:" + intel_syntax);
11098 }
11099 if (prefixes & PREFIX_ES)
11100 {
11101 used_prefixes |= PREFIX_ES;
11102 oappend ("%es:" + intel_syntax);
11103 }
11104 if (prefixes & PREFIX_FS)
11105 {
11106 used_prefixes |= PREFIX_FS;
11107 oappend ("%fs:" + intel_syntax);
11108 }
11109 if (prefixes & PREFIX_GS)
11110 {
11111 used_prefixes |= PREFIX_GS;
11112 oappend ("%gs:" + intel_syntax);
11113 }
11114 }
11115
11116 static void
11117 OP_indirE (int bytemode, int sizeflag)
11118 {
11119 if (!intel_syntax)
11120 oappend ("*");
11121 OP_E (bytemode, sizeflag);
11122 }
11123
11124 static void
11125 print_operand_value (char *buf, int hex, bfd_vma disp)
11126 {
11127 if (address_mode == mode_64bit)
11128 {
11129 if (hex)
11130 {
11131 char tmp[30];
11132 int i;
11133 buf[0] = '0';
11134 buf[1] = 'x';
11135 sprintf_vma (tmp, disp);
11136 for (i = 0; tmp[i] == '0' && tmp[i + 1]; i++);
11137 strcpy (buf + 2, tmp + i);
11138 }
11139 else
11140 {
11141 bfd_signed_vma v = disp;
11142 char tmp[30];
11143 int i;
11144 if (v < 0)
11145 {
11146 *(buf++) = '-';
11147 v = -disp;
11148 /* Check for possible overflow on 0x8000000000000000. */
11149 if (v < 0)
11150 {
11151 strcpy (buf, "9223372036854775808");
11152 return;
11153 }
11154 }
11155 if (!v)
11156 {
11157 strcpy (buf, "0");
11158 return;
11159 }
11160
11161 i = 0;
11162 tmp[29] = 0;
11163 while (v)
11164 {
11165 tmp[28 - i] = (v % 10) + '0';
11166 v /= 10;
11167 i++;
11168 }
11169 strcpy (buf, tmp + 29 - i);
11170 }
11171 }
11172 else
11173 {
11174 if (hex)
11175 sprintf (buf, "0x%x", (unsigned int) disp);
11176 else
11177 sprintf (buf, "%d", (int) disp);
11178 }
11179 }
11180
11181 /* Put DISP in BUF as signed hex number. */
11182
11183 static void
11184 print_displacement (char *buf, bfd_vma disp)
11185 {
11186 bfd_signed_vma val = disp;
11187 char tmp[30];
11188 int i, j = 0;
11189
11190 if (val < 0)
11191 {
11192 buf[j++] = '-';
11193 val = -disp;
11194
11195 /* Check for possible overflow. */
11196 if (val < 0)
11197 {
11198 switch (address_mode)
11199 {
11200 case mode_64bit:
11201 strcpy (buf + j, "0x8000000000000000");
11202 break;
11203 case mode_32bit:
11204 strcpy (buf + j, "0x80000000");
11205 break;
11206 case mode_16bit:
11207 strcpy (buf + j, "0x8000");
11208 break;
11209 }
11210 return;
11211 }
11212 }
11213
11214 buf[j++] = '0';
11215 buf[j++] = 'x';
11216
11217 sprintf_vma (tmp, val);
11218 for (i = 0; tmp[i] == '0'; i++)
11219 continue;
11220 if (tmp[i] == '\0')
11221 i--;
11222 strcpy (buf + j, tmp + i);
11223 }
11224
11225 static void
11226 intel_operand_size (int bytemode, int sizeflag)
11227 {
11228 switch (bytemode)
11229 {
11230 case b_mode:
11231 case dqb_mode:
11232 oappend ("BYTE PTR ");
11233 break;
11234 case w_mode:
11235 case dqw_mode:
11236 oappend ("WORD PTR ");
11237 break;
11238 case stack_v_mode:
11239 if (address_mode == mode_64bit && (sizeflag & DFLAG))
11240 {
11241 oappend ("QWORD PTR ");
11242 used_prefixes |= (prefixes & PREFIX_DATA);
11243 break;
11244 }
11245 /* FALLTHRU */
11246 case v_mode:
11247 case dq_mode:
11248 USED_REX (REX_W);
11249 if (rex & REX_W)
11250 oappend ("QWORD PTR ");
11251 else if ((sizeflag & DFLAG) || bytemode == dq_mode)
11252 oappend ("DWORD PTR ");
11253 else
11254 oappend ("WORD PTR ");
11255 used_prefixes |= (prefixes & PREFIX_DATA);
11256 break;
11257 case z_mode:
11258 if ((rex & REX_W) || (sizeflag & DFLAG))
11259 *obufp++ = 'D';
11260 oappend ("WORD PTR ");
11261 if (!(rex & REX_W))
11262 used_prefixes |= (prefixes & PREFIX_DATA);
11263 break;
11264 case a_mode:
11265 if (sizeflag & DFLAG)
11266 oappend ("QWORD PTR ");
11267 else
11268 oappend ("DWORD PTR ");
11269 used_prefixes |= (prefixes & PREFIX_DATA);
11270 break;
11271 case d_mode:
11272 case dqd_mode:
11273 oappend ("DWORD PTR ");
11274 break;
11275 case q_mode:
11276 oappend ("QWORD PTR ");
11277 break;
11278 case m_mode:
11279 if (address_mode == mode_64bit)
11280 oappend ("QWORD PTR ");
11281 else
11282 oappend ("DWORD PTR ");
11283 break;
11284 case f_mode:
11285 if (sizeflag & DFLAG)
11286 oappend ("FWORD PTR ");
11287 else
11288 oappend ("DWORD PTR ");
11289 used_prefixes |= (prefixes & PREFIX_DATA);
11290 break;
11291 case t_mode:
11292 oappend ("TBYTE PTR ");
11293 break;
11294 case x_mode:
11295 if (need_vex)
11296 {
11297 switch (vex.length)
11298 {
11299 case 128:
11300 oappend ("XMMWORD PTR ");
11301 break;
11302 case 256:
11303 oappend ("YMMWORD PTR ");
11304 break;
11305 default:
11306 abort ();
11307 }
11308 }
11309 else
11310 oappend ("XMMWORD PTR ");
11311 break;
11312 case xmm_mode:
11313 oappend ("XMMWORD PTR ");
11314 break;
11315 case xmmq_mode:
11316 if (!need_vex)
11317 abort ();
11318
11319 switch (vex.length)
11320 {
11321 case 128:
11322 oappend ("QWORD PTR ");
11323 break;
11324 case 256:
11325 oappend ("XMMWORD PTR ");
11326 break;
11327 default:
11328 abort ();
11329 }
11330 break;
11331 case ymmq_mode:
11332 if (!need_vex)
11333 abort ();
11334
11335 switch (vex.length)
11336 {
11337 case 128:
11338 oappend ("QWORD PTR ");
11339 break;
11340 case 256:
11341 oappend ("YMMWORD PTR ");
11342 break;
11343 default:
11344 abort ();
11345 }
11346 break;
11347 case o_mode:
11348 oappend ("OWORD PTR ");
11349 break;
11350 default:
11351 break;
11352 }
11353 }
11354
11355 static void
11356 OP_E_register (int bytemode, int sizeflag)
11357 {
11358 int reg = modrm.rm;
11359 const char **names;
11360
11361 USED_REX (REX_B);
11362 if ((rex & REX_B))
11363 reg += 8;
11364
11365 switch (bytemode)
11366 {
11367 case b_mode:
11368 USED_REX (0);
11369 if (rex)
11370 names = names8rex;
11371 else
11372 names = names8;
11373 break;
11374 case w_mode:
11375 names = names16;
11376 break;
11377 case d_mode:
11378 names = names32;
11379 break;
11380 case q_mode:
11381 names = names64;
11382 break;
11383 case m_mode:
11384 names = address_mode == mode_64bit ? names64 : names32;
11385 break;
11386 case stack_v_mode:
11387 if (address_mode == mode_64bit && (sizeflag & DFLAG))
11388 {
11389 names = names64;
11390 used_prefixes |= (prefixes & PREFIX_DATA);
11391 break;
11392 }
11393 bytemode = v_mode;
11394 /* FALLTHRU */
11395 case v_mode:
11396 case dq_mode:
11397 case dqb_mode:
11398 case dqd_mode:
11399 case dqw_mode:
11400 USED_REX (REX_W);
11401 if (rex & REX_W)
11402 names = names64;
11403 else if ((sizeflag & DFLAG) || bytemode != v_mode)
11404 names = names32;
11405 else
11406 names = names16;
11407 used_prefixes |= (prefixes & PREFIX_DATA);
11408 break;
11409 case 0:
11410 return;
11411 default:
11412 oappend (INTERNAL_DISASSEMBLER_ERROR);
11413 return;
11414 }
11415 oappend (names[reg]);
11416 }
11417
11418 static void
11419 OP_E_memory (int bytemode, int sizeflag, int has_drex)
11420 {
11421 bfd_vma disp = 0;
11422 int add = (rex & REX_B) ? 8 : 0;
11423 int riprel = 0;
11424
11425 USED_REX (REX_B);
11426 if (intel_syntax)
11427 intel_operand_size (bytemode, sizeflag);
11428 append_seg ();
11429
11430 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
11431 {
11432 /* 32/64 bit address mode */
11433 int havedisp;
11434 int havesib;
11435 int havebase;
11436 int haveindex;
11437 int needindex;
11438 int base, rbase;
11439 int index = 0;
11440 int scale = 0;
11441
11442 havesib = 0;
11443 havebase = 1;
11444 haveindex = 0;
11445 base = modrm.rm;
11446
11447 if (base == 4)
11448 {
11449 havesib = 1;
11450 FETCH_DATA (the_info, codep + 1);
11451 index = (*codep >> 3) & 7;
11452 scale = (*codep >> 6) & 3;
11453 base = *codep & 7;
11454 USED_REX (REX_X);
11455 if (rex & REX_X)
11456 index += 8;
11457 haveindex = index != 4;
11458 codep++;
11459 }
11460 rbase = base + add;
11461
11462 /* If we have a DREX byte, skip it now
11463 (it has already been handled) */
11464 if (has_drex)
11465 {
11466 FETCH_DATA (the_info, codep + 1);
11467 codep++;
11468 }
11469
11470 switch (modrm.mod)
11471 {
11472 case 0:
11473 if (base == 5)
11474 {
11475 havebase = 0;
11476 if (address_mode == mode_64bit && !havesib)
11477 riprel = 1;
11478 disp = get32s ();
11479 }
11480 break;
11481 case 1:
11482 FETCH_DATA (the_info, codep + 1);
11483 disp = *codep++;
11484 if ((disp & 0x80) != 0)
11485 disp -= 0x100;
11486 break;
11487 case 2:
11488 disp = get32s ();
11489 break;
11490 }
11491
11492 /* In 32bit mode, we need index register to tell [offset] from
11493 [eiz*1 + offset]. */
11494 needindex = (havesib
11495 && !havebase
11496 && !haveindex
11497 && address_mode == mode_32bit);
11498 havedisp = (havebase
11499 || needindex
11500 || (havesib && (haveindex || scale != 0)));
11501
11502 if (!intel_syntax)
11503 if (modrm.mod != 0 || base == 5)
11504 {
11505 if (havedisp || riprel)
11506 print_displacement (scratchbuf, disp);
11507 else
11508 print_operand_value (scratchbuf, 1, disp);
11509 oappend (scratchbuf);
11510 if (riprel)
11511 {
11512 set_op (disp, 1);
11513 oappend (sizeflag & AFLAG ? "(%rip)" : "(%eip)");
11514 }
11515 }
11516
11517 if (havebase || haveindex || riprel)
11518 used_prefixes |= PREFIX_ADDR;
11519
11520 if (havedisp || (intel_syntax && riprel))
11521 {
11522 *obufp++ = open_char;
11523 if (intel_syntax && riprel)
11524 {
11525 set_op (disp, 1);
11526 oappend (sizeflag & AFLAG ? "rip" : "eip");
11527 }
11528 *obufp = '\0';
11529 if (havebase)
11530 oappend (address_mode == mode_64bit && (sizeflag & AFLAG)
11531 ? names64[rbase] : names32[rbase]);
11532 if (havesib)
11533 {
11534 /* ESP/RSP won't allow index. If base isn't ESP/RSP,
11535 print index to tell base + index from base. */
11536 if (scale != 0
11537 || needindex
11538 || haveindex
11539 || (havebase && base != ESP_REG_NUM))
11540 {
11541 if (!intel_syntax || havebase)
11542 {
11543 *obufp++ = separator_char;
11544 *obufp = '\0';
11545 }
11546 if (haveindex)
11547 oappend (address_mode == mode_64bit
11548 && (sizeflag & AFLAG)
11549 ? names64[index] : names32[index]);
11550 else
11551 oappend (address_mode == mode_64bit
11552 && (sizeflag & AFLAG)
11553 ? index64 : index32);
11554
11555 *obufp++ = scale_char;
11556 *obufp = '\0';
11557 sprintf (scratchbuf, "%d", 1 << scale);
11558 oappend (scratchbuf);
11559 }
11560 }
11561 if (intel_syntax
11562 && (disp || modrm.mod != 0 || base == 5))
11563 {
11564 if (!havedisp || (bfd_signed_vma) disp >= 0)
11565 {
11566 *obufp++ = '+';
11567 *obufp = '\0';
11568 }
11569 else if (modrm.mod != 1)
11570 {
11571 *obufp++ = '-';
11572 *obufp = '\0';
11573 disp = - (bfd_signed_vma) disp;
11574 }
11575
11576 if (havedisp)
11577 print_displacement (scratchbuf, disp);
11578 else
11579 print_operand_value (scratchbuf, 1, disp);
11580 oappend (scratchbuf);
11581 }
11582
11583 *obufp++ = close_char;
11584 *obufp = '\0';
11585 }
11586 else if (intel_syntax)
11587 {
11588 if (modrm.mod != 0 || base == 5)
11589 {
11590 if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
11591 | PREFIX_ES | PREFIX_FS | PREFIX_GS))
11592 ;
11593 else
11594 {
11595 oappend (names_seg[ds_reg - es_reg]);
11596 oappend (":");
11597 }
11598 print_operand_value (scratchbuf, 1, disp);
11599 oappend (scratchbuf);
11600 }
11601 }
11602 }
11603 else
11604 { /* 16 bit address mode */
11605 switch (modrm.mod)
11606 {
11607 case 0:
11608 if (modrm.rm == 6)
11609 {
11610 disp = get16 ();
11611 if ((disp & 0x8000) != 0)
11612 disp -= 0x10000;
11613 }
11614 break;
11615 case 1:
11616 FETCH_DATA (the_info, codep + 1);
11617 disp = *codep++;
11618 if ((disp & 0x80) != 0)
11619 disp -= 0x100;
11620 break;
11621 case 2:
11622 disp = get16 ();
11623 if ((disp & 0x8000) != 0)
11624 disp -= 0x10000;
11625 break;
11626 }
11627
11628 if (!intel_syntax)
11629 if (modrm.mod != 0 || modrm.rm == 6)
11630 {
11631 print_displacement (scratchbuf, disp);
11632 oappend (scratchbuf);
11633 }
11634
11635 if (modrm.mod != 0 || modrm.rm != 6)
11636 {
11637 *obufp++ = open_char;
11638 *obufp = '\0';
11639 oappend (index16[modrm.rm]);
11640 if (intel_syntax
11641 && (disp || modrm.mod != 0 || modrm.rm == 6))
11642 {
11643 if ((bfd_signed_vma) disp >= 0)
11644 {
11645 *obufp++ = '+';
11646 *obufp = '\0';
11647 }
11648 else if (modrm.mod != 1)
11649 {
11650 *obufp++ = '-';
11651 *obufp = '\0';
11652 disp = - (bfd_signed_vma) disp;
11653 }
11654
11655 print_displacement (scratchbuf, disp);
11656 oappend (scratchbuf);
11657 }
11658
11659 *obufp++ = close_char;
11660 *obufp = '\0';
11661 }
11662 else if (intel_syntax)
11663 {
11664 if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
11665 | PREFIX_ES | PREFIX_FS | PREFIX_GS))
11666 ;
11667 else
11668 {
11669 oappend (names_seg[ds_reg - es_reg]);
11670 oappend (":");
11671 }
11672 print_operand_value (scratchbuf, 1, disp & 0xffff);
11673 oappend (scratchbuf);
11674 }
11675 }
11676 }
11677
11678 static void
11679 OP_E_extended (int bytemode, int sizeflag, int has_drex)
11680 {
11681 /* Skip mod/rm byte. */
11682 MODRM_CHECK;
11683 codep++;
11684
11685 if (modrm.mod == 3)
11686 OP_E_register (bytemode, sizeflag);
11687 else
11688 OP_E_memory (bytemode, sizeflag, has_drex);
11689 }
11690
11691 static void
11692 OP_E (int bytemode, int sizeflag)
11693 {
11694 OP_E_extended (bytemode, sizeflag, 0);
11695 }
11696
11697
11698 static void
11699 OP_G (int bytemode, int sizeflag)
11700 {
11701 int add = 0;
11702 USED_REX (REX_R);
11703 if (rex & REX_R)
11704 add += 8;
11705 switch (bytemode)
11706 {
11707 case b_mode:
11708 USED_REX (0);
11709 if (rex)
11710 oappend (names8rex[modrm.reg + add]);
11711 else
11712 oappend (names8[modrm.reg + add]);
11713 break;
11714 case w_mode:
11715 oappend (names16[modrm.reg + add]);
11716 break;
11717 case d_mode:
11718 oappend (names32[modrm.reg + add]);
11719 break;
11720 case q_mode:
11721 oappend (names64[modrm.reg + add]);
11722 break;
11723 case v_mode:
11724 case dq_mode:
11725 case dqb_mode:
11726 case dqd_mode:
11727 case dqw_mode:
11728 USED_REX (REX_W);
11729 if (rex & REX_W)
11730 oappend (names64[modrm.reg + add]);
11731 else if ((sizeflag & DFLAG) || bytemode != v_mode)
11732 oappend (names32[modrm.reg + add]);
11733 else
11734 oappend (names16[modrm.reg + add]);
11735 used_prefixes |= (prefixes & PREFIX_DATA);
11736 break;
11737 case m_mode:
11738 if (address_mode == mode_64bit)
11739 oappend (names64[modrm.reg + add]);
11740 else
11741 oappend (names32[modrm.reg + add]);
11742 break;
11743 default:
11744 oappend (INTERNAL_DISASSEMBLER_ERROR);
11745 break;
11746 }
11747 }
11748
11749 static bfd_vma
11750 get64 (void)
11751 {
11752 bfd_vma x;
11753 #ifdef BFD64
11754 unsigned int a;
11755 unsigned int b;
11756
11757 FETCH_DATA (the_info, codep + 8);
11758 a = *codep++ & 0xff;
11759 a |= (*codep++ & 0xff) << 8;
11760 a |= (*codep++ & 0xff) << 16;
11761 a |= (*codep++ & 0xff) << 24;
11762 b = *codep++ & 0xff;
11763 b |= (*codep++ & 0xff) << 8;
11764 b |= (*codep++ & 0xff) << 16;
11765 b |= (*codep++ & 0xff) << 24;
11766 x = a + ((bfd_vma) b << 32);
11767 #else
11768 abort ();
11769 x = 0;
11770 #endif
11771 return x;
11772 }
11773
11774 static bfd_signed_vma
11775 get32 (void)
11776 {
11777 bfd_signed_vma x = 0;
11778
11779 FETCH_DATA (the_info, codep + 4);
11780 x = *codep++ & (bfd_signed_vma) 0xff;
11781 x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
11782 x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
11783 x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
11784 return x;
11785 }
11786
11787 static bfd_signed_vma
11788 get32s (void)
11789 {
11790 bfd_signed_vma x = 0;
11791
11792 FETCH_DATA (the_info, codep + 4);
11793 x = *codep++ & (bfd_signed_vma) 0xff;
11794 x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
11795 x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
11796 x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
11797
11798 x = (x ^ ((bfd_signed_vma) 1 << 31)) - ((bfd_signed_vma) 1 << 31);
11799
11800 return x;
11801 }
11802
11803 static int
11804 get16 (void)
11805 {
11806 int x = 0;
11807
11808 FETCH_DATA (the_info, codep + 2);
11809 x = *codep++ & 0xff;
11810 x |= (*codep++ & 0xff) << 8;
11811 return x;
11812 }
11813
11814 static void
11815 set_op (bfd_vma op, int riprel)
11816 {
11817 op_index[op_ad] = op_ad;
11818 if (address_mode == mode_64bit)
11819 {
11820 op_address[op_ad] = op;
11821 op_riprel[op_ad] = riprel;
11822 }
11823 else
11824 {
11825 /* Mask to get a 32-bit address. */
11826 op_address[op_ad] = op & 0xffffffff;
11827 op_riprel[op_ad] = riprel & 0xffffffff;
11828 }
11829 }
11830
11831 static void
11832 OP_REG (int code, int sizeflag)
11833 {
11834 const char *s;
11835 int add;
11836 USED_REX (REX_B);
11837 if (rex & REX_B)
11838 add = 8;
11839 else
11840 add = 0;
11841
11842 switch (code)
11843 {
11844 case ax_reg: case cx_reg: case dx_reg: case bx_reg:
11845 case sp_reg: case bp_reg: case si_reg: case di_reg:
11846 s = names16[code - ax_reg + add];
11847 break;
11848 case es_reg: case ss_reg: case cs_reg:
11849 case ds_reg: case fs_reg: case gs_reg:
11850 s = names_seg[code - es_reg + add];
11851 break;
11852 case al_reg: case ah_reg: case cl_reg: case ch_reg:
11853 case dl_reg: case dh_reg: case bl_reg: case bh_reg:
11854 USED_REX (0);
11855 if (rex)
11856 s = names8rex[code - al_reg + add];
11857 else
11858 s = names8[code - al_reg];
11859 break;
11860 case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
11861 case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
11862 if (address_mode == mode_64bit && (sizeflag & DFLAG))
11863 {
11864 s = names64[code - rAX_reg + add];
11865 break;
11866 }
11867 code += eAX_reg - rAX_reg;
11868 /* Fall through. */
11869 case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
11870 case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
11871 USED_REX (REX_W);
11872 if (rex & REX_W)
11873 s = names64[code - eAX_reg + add];
11874 else if (sizeflag & DFLAG)
11875 s = names32[code - eAX_reg + add];
11876 else
11877 s = names16[code - eAX_reg + add];
11878 used_prefixes |= (prefixes & PREFIX_DATA);
11879 break;
11880 default:
11881 s = INTERNAL_DISASSEMBLER_ERROR;
11882 break;
11883 }
11884 oappend (s);
11885 }
11886
11887 static void
11888 OP_IMREG (int code, int sizeflag)
11889 {
11890 const char *s;
11891
11892 switch (code)
11893 {
11894 case indir_dx_reg:
11895 if (intel_syntax)
11896 s = "dx";
11897 else
11898 s = "(%dx)";
11899 break;
11900 case ax_reg: case cx_reg: case dx_reg: case bx_reg:
11901 case sp_reg: case bp_reg: case si_reg: case di_reg:
11902 s = names16[code - ax_reg];
11903 break;
11904 case es_reg: case ss_reg: case cs_reg:
11905 case ds_reg: case fs_reg: case gs_reg:
11906 s = names_seg[code - es_reg];
11907 break;
11908 case al_reg: case ah_reg: case cl_reg: case ch_reg:
11909 case dl_reg: case dh_reg: case bl_reg: case bh_reg:
11910 USED_REX (0);
11911 if (rex)
11912 s = names8rex[code - al_reg];
11913 else
11914 s = names8[code - al_reg];
11915 break;
11916 case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
11917 case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
11918 USED_REX (REX_W);
11919 if (rex & REX_W)
11920 s = names64[code - eAX_reg];
11921 else if (sizeflag & DFLAG)
11922 s = names32[code - eAX_reg];
11923 else
11924 s = names16[code - eAX_reg];
11925 used_prefixes |= (prefixes & PREFIX_DATA);
11926 break;
11927 case z_mode_ax_reg:
11928 if ((rex & REX_W) || (sizeflag & DFLAG))
11929 s = *names32;
11930 else
11931 s = *names16;
11932 if (!(rex & REX_W))
11933 used_prefixes |= (prefixes & PREFIX_DATA);
11934 break;
11935 default:
11936 s = INTERNAL_DISASSEMBLER_ERROR;
11937 break;
11938 }
11939 oappend (s);
11940 }
11941
11942 static void
11943 OP_I (int bytemode, int sizeflag)
11944 {
11945 bfd_signed_vma op;
11946 bfd_signed_vma mask = -1;
11947
11948 switch (bytemode)
11949 {
11950 case b_mode:
11951 FETCH_DATA (the_info, codep + 1);
11952 op = *codep++;
11953 mask = 0xff;
11954 break;
11955 case q_mode:
11956 if (address_mode == mode_64bit)
11957 {
11958 op = get32s ();
11959 break;
11960 }
11961 /* Fall through. */
11962 case v_mode:
11963 USED_REX (REX_W);
11964 if (rex & REX_W)
11965 op = get32s ();
11966 else if (sizeflag & DFLAG)
11967 {
11968 op = get32 ();
11969 mask = 0xffffffff;
11970 }
11971 else
11972 {
11973 op = get16 ();
11974 mask = 0xfffff;
11975 }
11976 used_prefixes |= (prefixes & PREFIX_DATA);
11977 break;
11978 case w_mode:
11979 mask = 0xfffff;
11980 op = get16 ();
11981 break;
11982 case const_1_mode:
11983 if (intel_syntax)
11984 oappend ("1");
11985 return;
11986 default:
11987 oappend (INTERNAL_DISASSEMBLER_ERROR);
11988 return;
11989 }
11990
11991 op &= mask;
11992 scratchbuf[0] = '$';
11993 print_operand_value (scratchbuf + 1, 1, op);
11994 oappend (scratchbuf + intel_syntax);
11995 scratchbuf[0] = '\0';
11996 }
11997
11998 static void
11999 OP_I64 (int bytemode, int sizeflag)
12000 {
12001 bfd_signed_vma op;
12002 bfd_signed_vma mask = -1;
12003
12004 if (address_mode != mode_64bit)
12005 {
12006 OP_I (bytemode, sizeflag);
12007 return;
12008 }
12009
12010 switch (bytemode)
12011 {
12012 case b_mode:
12013 FETCH_DATA (the_info, codep + 1);
12014 op = *codep++;
12015 mask = 0xff;
12016 break;
12017 case v_mode:
12018 USED_REX (REX_W);
12019 if (rex & REX_W)
12020 op = get64 ();
12021 else if (sizeflag & DFLAG)
12022 {
12023 op = get32 ();
12024 mask = 0xffffffff;
12025 }
12026 else
12027 {
12028 op = get16 ();
12029 mask = 0xfffff;
12030 }
12031 used_prefixes |= (prefixes & PREFIX_DATA);
12032 break;
12033 case w_mode:
12034 mask = 0xfffff;
12035 op = get16 ();
12036 break;
12037 default:
12038 oappend (INTERNAL_DISASSEMBLER_ERROR);
12039 return;
12040 }
12041
12042 op &= mask;
12043 scratchbuf[0] = '$';
12044 print_operand_value (scratchbuf + 1, 1, op);
12045 oappend (scratchbuf + intel_syntax);
12046 scratchbuf[0] = '\0';
12047 }
12048
12049 static void
12050 OP_sI (int bytemode, int sizeflag)
12051 {
12052 bfd_signed_vma op;
12053 bfd_signed_vma mask = -1;
12054
12055 switch (bytemode)
12056 {
12057 case b_mode:
12058 FETCH_DATA (the_info, codep + 1);
12059 op = *codep++;
12060 if ((op & 0x80) != 0)
12061 op -= 0x100;
12062 mask = 0xffffffff;
12063 break;
12064 case v_mode:
12065 USED_REX (REX_W);
12066 if (rex & REX_W)
12067 op = get32s ();
12068 else if (sizeflag & DFLAG)
12069 {
12070 op = get32s ();
12071 mask = 0xffffffff;
12072 }
12073 else
12074 {
12075 mask = 0xffffffff;
12076 op = get16 ();
12077 if ((op & 0x8000) != 0)
12078 op -= 0x10000;
12079 }
12080 used_prefixes |= (prefixes & PREFIX_DATA);
12081 break;
12082 case w_mode:
12083 op = get16 ();
12084 mask = 0xffffffff;
12085 if ((op & 0x8000) != 0)
12086 op -= 0x10000;
12087 break;
12088 default:
12089 oappend (INTERNAL_DISASSEMBLER_ERROR);
12090 return;
12091 }
12092
12093 scratchbuf[0] = '$';
12094 print_operand_value (scratchbuf + 1, 1, op);
12095 oappend (scratchbuf + intel_syntax);
12096 }
12097
12098 static void
12099 OP_J (int bytemode, int sizeflag)
12100 {
12101 bfd_vma disp;
12102 bfd_vma mask = -1;
12103 bfd_vma segment = 0;
12104
12105 switch (bytemode)
12106 {
12107 case b_mode:
12108 FETCH_DATA (the_info, codep + 1);
12109 disp = *codep++;
12110 if ((disp & 0x80) != 0)
12111 disp -= 0x100;
12112 break;
12113 case v_mode:
12114 if ((sizeflag & DFLAG) || (rex & REX_W))
12115 disp = get32s ();
12116 else
12117 {
12118 disp = get16 ();
12119 if ((disp & 0x8000) != 0)
12120 disp -= 0x10000;
12121 /* In 16bit mode, address is wrapped around at 64k within
12122 the same segment. Otherwise, a data16 prefix on a jump
12123 instruction means that the pc is masked to 16 bits after
12124 the displacement is added! */
12125 mask = 0xffff;
12126 if ((prefixes & PREFIX_DATA) == 0)
12127 segment = ((start_pc + codep - start_codep)
12128 & ~((bfd_vma) 0xffff));
12129 }
12130 used_prefixes |= (prefixes & PREFIX_DATA);
12131 break;
12132 default:
12133 oappend (INTERNAL_DISASSEMBLER_ERROR);
12134 return;
12135 }
12136 disp = ((start_pc + codep - start_codep + disp) & mask) | segment;
12137 set_op (disp, 0);
12138 print_operand_value (scratchbuf, 1, disp);
12139 oappend (scratchbuf);
12140 }
12141
12142 static void
12143 OP_SEG (int bytemode, int sizeflag)
12144 {
12145 if (bytemode == w_mode)
12146 oappend (names_seg[modrm.reg]);
12147 else
12148 OP_E (modrm.mod == 3 ? bytemode : w_mode, sizeflag);
12149 }
12150
12151 static void
12152 OP_DIR (int dummy ATTRIBUTE_UNUSED, int sizeflag)
12153 {
12154 int seg, offset;
12155
12156 if (sizeflag & DFLAG)
12157 {
12158 offset = get32 ();
12159 seg = get16 ();
12160 }
12161 else
12162 {
12163 offset = get16 ();
12164 seg = get16 ();
12165 }
12166 used_prefixes |= (prefixes & PREFIX_DATA);
12167 if (intel_syntax)
12168 sprintf (scratchbuf, "0x%x:0x%x", seg, offset);
12169 else
12170 sprintf (scratchbuf, "$0x%x,$0x%x", seg, offset);
12171 oappend (scratchbuf);
12172 }
12173
12174 static void
12175 OP_OFF (int bytemode, int sizeflag)
12176 {
12177 bfd_vma off;
12178
12179 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
12180 intel_operand_size (bytemode, sizeflag);
12181 append_seg ();
12182
12183 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
12184 off = get32 ();
12185 else
12186 off = get16 ();
12187
12188 if (intel_syntax)
12189 {
12190 if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
12191 | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
12192 {
12193 oappend (names_seg[ds_reg - es_reg]);
12194 oappend (":");
12195 }
12196 }
12197 print_operand_value (scratchbuf, 1, off);
12198 oappend (scratchbuf);
12199 }
12200
12201 static void
12202 OP_OFF64 (int bytemode, int sizeflag)
12203 {
12204 bfd_vma off;
12205
12206 if (address_mode != mode_64bit
12207 || (prefixes & PREFIX_ADDR))
12208 {
12209 OP_OFF (bytemode, sizeflag);
12210 return;
12211 }
12212
12213 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
12214 intel_operand_size (bytemode, sizeflag);
12215 append_seg ();
12216
12217 off = get64 ();
12218
12219 if (intel_syntax)
12220 {
12221 if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
12222 | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
12223 {
12224 oappend (names_seg[ds_reg - es_reg]);
12225 oappend (":");
12226 }
12227 }
12228 print_operand_value (scratchbuf, 1, off);
12229 oappend (scratchbuf);
12230 }
12231
12232 static void
12233 ptr_reg (int code, int sizeflag)
12234 {
12235 const char *s;
12236
12237 *obufp++ = open_char;
12238 used_prefixes |= (prefixes & PREFIX_ADDR);
12239 if (address_mode == mode_64bit)
12240 {
12241 if (!(sizeflag & AFLAG))
12242 s = names32[code - eAX_reg];
12243 else
12244 s = names64[code - eAX_reg];
12245 }
12246 else if (sizeflag & AFLAG)
12247 s = names32[code - eAX_reg];
12248 else
12249 s = names16[code - eAX_reg];
12250 oappend (s);
12251 *obufp++ = close_char;
12252 *obufp = 0;
12253 }
12254
12255 static void
12256 OP_ESreg (int code, int sizeflag)
12257 {
12258 if (intel_syntax)
12259 {
12260 switch (codep[-1])
12261 {
12262 case 0x6d: /* insw/insl */
12263 intel_operand_size (z_mode, sizeflag);
12264 break;
12265 case 0xa5: /* movsw/movsl/movsq */
12266 case 0xa7: /* cmpsw/cmpsl/cmpsq */
12267 case 0xab: /* stosw/stosl */
12268 case 0xaf: /* scasw/scasl */
12269 intel_operand_size (v_mode, sizeflag);
12270 break;
12271 default:
12272 intel_operand_size (b_mode, sizeflag);
12273 }
12274 }
12275 oappend ("%es:" + intel_syntax);
12276 ptr_reg (code, sizeflag);
12277 }
12278
12279 static void
12280 OP_DSreg (int code, int sizeflag)
12281 {
12282 if (intel_syntax)
12283 {
12284 switch (codep[-1])
12285 {
12286 case 0x6f: /* outsw/outsl */
12287 intel_operand_size (z_mode, sizeflag);
12288 break;
12289 case 0xa5: /* movsw/movsl/movsq */
12290 case 0xa7: /* cmpsw/cmpsl/cmpsq */
12291 case 0xad: /* lodsw/lodsl/lodsq */
12292 intel_operand_size (v_mode, sizeflag);
12293 break;
12294 default:
12295 intel_operand_size (b_mode, sizeflag);
12296 }
12297 }
12298 if ((prefixes
12299 & (PREFIX_CS
12300 | PREFIX_DS
12301 | PREFIX_SS
12302 | PREFIX_ES
12303 | PREFIX_FS
12304 | PREFIX_GS)) == 0)
12305 prefixes |= PREFIX_DS;
12306 append_seg ();
12307 ptr_reg (code, sizeflag);
12308 }
12309
12310 static void
12311 OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12312 {
12313 int add;
12314 if (rex & REX_R)
12315 {
12316 USED_REX (REX_R);
12317 add = 8;
12318 }
12319 else if (address_mode != mode_64bit && (prefixes & PREFIX_LOCK))
12320 {
12321 lock_prefix = NULL;
12322 used_prefixes |= PREFIX_LOCK;
12323 add = 8;
12324 }
12325 else
12326 add = 0;
12327 sprintf (scratchbuf, "%%cr%d", modrm.reg + add);
12328 oappend (scratchbuf + intel_syntax);
12329 }
12330
12331 static void
12332 OP_D (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12333 {
12334 int add;
12335 USED_REX (REX_R);
12336 if (rex & REX_R)
12337 add = 8;
12338 else
12339 add = 0;
12340 if (intel_syntax)
12341 sprintf (scratchbuf, "db%d", modrm.reg + add);
12342 else
12343 sprintf (scratchbuf, "%%db%d", modrm.reg + add);
12344 oappend (scratchbuf);
12345 }
12346
12347 static void
12348 OP_T (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12349 {
12350 sprintf (scratchbuf, "%%tr%d", modrm.reg);
12351 oappend (scratchbuf + intel_syntax);
12352 }
12353
12354 static void
12355 OP_R (int bytemode, int sizeflag)
12356 {
12357 if (modrm.mod == 3)
12358 OP_E (bytemode, sizeflag);
12359 else
12360 BadOp ();
12361 }
12362
12363 static void
12364 OP_MMX (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12365 {
12366 used_prefixes |= (prefixes & PREFIX_DATA);
12367 if (prefixes & PREFIX_DATA)
12368 {
12369 int add;
12370 USED_REX (REX_R);
12371 if (rex & REX_R)
12372 add = 8;
12373 else
12374 add = 0;
12375 sprintf (scratchbuf, "%%xmm%d", modrm.reg + add);
12376 }
12377 else
12378 sprintf (scratchbuf, "%%mm%d", modrm.reg);
12379 oappend (scratchbuf + intel_syntax);
12380 }
12381
12382 static void
12383 OP_XMM (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
12384 {
12385 int add;
12386 USED_REX (REX_R);
12387 if (rex & REX_R)
12388 add = 8;
12389 else
12390 add = 0;
12391 if (need_vex && bytemode != xmm_mode)
12392 {
12393 switch (vex.length)
12394 {
12395 case 128:
12396 sprintf (scratchbuf, "%%xmm%d", modrm.reg + add);
12397 break;
12398 case 256:
12399 sprintf (scratchbuf, "%%ymm%d", modrm.reg + add);
12400 break;
12401 default:
12402 abort ();
12403 }
12404 }
12405 else
12406 sprintf (scratchbuf, "%%xmm%d", modrm.reg + add);
12407 oappend (scratchbuf + intel_syntax);
12408 }
12409
12410 static void
12411 OP_EM (int bytemode, int sizeflag)
12412 {
12413 if (modrm.mod != 3)
12414 {
12415 if (intel_syntax && bytemode == v_mode)
12416 {
12417 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
12418 used_prefixes |= (prefixes & PREFIX_DATA);
12419 }
12420 OP_E (bytemode, sizeflag);
12421 return;
12422 }
12423
12424 /* Skip mod/rm byte. */
12425 MODRM_CHECK;
12426 codep++;
12427 used_prefixes |= (prefixes & PREFIX_DATA);
12428 if (prefixes & PREFIX_DATA)
12429 {
12430 int add;
12431
12432 USED_REX (REX_B);
12433 if (rex & REX_B)
12434 add = 8;
12435 else
12436 add = 0;
12437 sprintf (scratchbuf, "%%xmm%d", modrm.rm + add);
12438 }
12439 else
12440 sprintf (scratchbuf, "%%mm%d", modrm.rm);
12441 oappend (scratchbuf + intel_syntax);
12442 }
12443
12444 /* cvt* are the only instructions in sse2 which have
12445 both SSE and MMX operands and also have 0x66 prefix
12446 in their opcode. 0x66 was originally used to differentiate
12447 between SSE and MMX instruction(operands). So we have to handle the
12448 cvt* separately using OP_EMC and OP_MXC */
12449 static void
12450 OP_EMC (int bytemode, int sizeflag)
12451 {
12452 if (modrm.mod != 3)
12453 {
12454 if (intel_syntax && bytemode == v_mode)
12455 {
12456 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
12457 used_prefixes |= (prefixes & PREFIX_DATA);
12458 }
12459 OP_E (bytemode, sizeflag);
12460 return;
12461 }
12462
12463 /* Skip mod/rm byte. */
12464 MODRM_CHECK;
12465 codep++;
12466 used_prefixes |= (prefixes & PREFIX_DATA);
12467 sprintf (scratchbuf, "%%mm%d", modrm.rm);
12468 oappend (scratchbuf + intel_syntax);
12469 }
12470
12471 static void
12472 OP_MXC (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12473 {
12474 used_prefixes |= (prefixes & PREFIX_DATA);
12475 sprintf (scratchbuf, "%%mm%d", modrm.reg);
12476 oappend (scratchbuf + intel_syntax);
12477 }
12478
12479 static void
12480 OP_EX (int bytemode, int sizeflag)
12481 {
12482 int add;
12483 if (modrm.mod != 3)
12484 {
12485 OP_E (bytemode, sizeflag);
12486 return;
12487 }
12488 USED_REX (REX_B);
12489 if (rex & REX_B)
12490 add = 8;
12491 else
12492 add = 0;
12493
12494 /* Skip mod/rm byte. */
12495 MODRM_CHECK;
12496 codep++;
12497 if (need_vex
12498 && bytemode != xmm_mode
12499 && bytemode != xmmq_mode)
12500 {
12501 switch (vex.length)
12502 {
12503 case 128:
12504 sprintf (scratchbuf, "%%xmm%d", modrm.rm + add);
12505 break;
12506 case 256:
12507 sprintf (scratchbuf, "%%ymm%d", modrm.rm + add);
12508 break;
12509 default:
12510 abort ();
12511 }
12512 }
12513 else
12514 sprintf (scratchbuf, "%%xmm%d", modrm.rm + add);
12515 oappend (scratchbuf + intel_syntax);
12516 }
12517
12518 static void
12519 OP_MS (int bytemode, int sizeflag)
12520 {
12521 if (modrm.mod == 3)
12522 OP_EM (bytemode, sizeflag);
12523 else
12524 BadOp ();
12525 }
12526
12527 static void
12528 OP_XS (int bytemode, int sizeflag)
12529 {
12530 if (modrm.mod == 3)
12531 OP_EX (bytemode, sizeflag);
12532 else
12533 BadOp ();
12534 }
12535
12536 static void
12537 OP_M (int bytemode, int sizeflag)
12538 {
12539 if (modrm.mod == 3)
12540 /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
12541 BadOp ();
12542 else
12543 OP_E (bytemode, sizeflag);
12544 }
12545
12546 static void
12547 OP_0f07 (int bytemode, int sizeflag)
12548 {
12549 if (modrm.mod != 3 || modrm.rm != 0)
12550 BadOp ();
12551 else
12552 OP_E (bytemode, sizeflag);
12553 }
12554
12555 /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
12556 32bit mode and "xchg %rax,%rax" in 64bit mode. */
12557
12558 static void
12559 NOP_Fixup1 (int bytemode, int sizeflag)
12560 {
12561 if ((prefixes & PREFIX_DATA) != 0
12562 || (rex != 0
12563 && rex != 0x48
12564 && address_mode == mode_64bit))
12565 OP_REG (bytemode, sizeflag);
12566 else
12567 strcpy (obuf, "nop");
12568 }
12569
12570 static void
12571 NOP_Fixup2 (int bytemode, int sizeflag)
12572 {
12573 if ((prefixes & PREFIX_DATA) != 0
12574 || (rex != 0
12575 && rex != 0x48
12576 && address_mode == mode_64bit))
12577 OP_IMREG (bytemode, sizeflag);
12578 }
12579
12580 static const char *const Suffix3DNow[] = {
12581 /* 00 */ NULL, NULL, NULL, NULL,
12582 /* 04 */ NULL, NULL, NULL, NULL,
12583 /* 08 */ NULL, NULL, NULL, NULL,
12584 /* 0C */ "pi2fw", "pi2fd", NULL, NULL,
12585 /* 10 */ NULL, NULL, NULL, NULL,
12586 /* 14 */ NULL, NULL, NULL, NULL,
12587 /* 18 */ NULL, NULL, NULL, NULL,
12588 /* 1C */ "pf2iw", "pf2id", NULL, NULL,
12589 /* 20 */ NULL, NULL, NULL, NULL,
12590 /* 24 */ NULL, NULL, NULL, NULL,
12591 /* 28 */ NULL, NULL, NULL, NULL,
12592 /* 2C */ NULL, NULL, NULL, NULL,
12593 /* 30 */ NULL, NULL, NULL, NULL,
12594 /* 34 */ NULL, NULL, NULL, NULL,
12595 /* 38 */ NULL, NULL, NULL, NULL,
12596 /* 3C */ NULL, NULL, NULL, NULL,
12597 /* 40 */ NULL, NULL, NULL, NULL,
12598 /* 44 */ NULL, NULL, NULL, NULL,
12599 /* 48 */ NULL, NULL, NULL, NULL,
12600 /* 4C */ NULL, NULL, NULL, NULL,
12601 /* 50 */ NULL, NULL, NULL, NULL,
12602 /* 54 */ NULL, NULL, NULL, NULL,
12603 /* 58 */ NULL, NULL, NULL, NULL,
12604 /* 5C */ NULL, NULL, NULL, NULL,
12605 /* 60 */ NULL, NULL, NULL, NULL,
12606 /* 64 */ NULL, NULL, NULL, NULL,
12607 /* 68 */ NULL, NULL, NULL, NULL,
12608 /* 6C */ NULL, NULL, NULL, NULL,
12609 /* 70 */ NULL, NULL, NULL, NULL,
12610 /* 74 */ NULL, NULL, NULL, NULL,
12611 /* 78 */ NULL, NULL, NULL, NULL,
12612 /* 7C */ NULL, NULL, NULL, NULL,
12613 /* 80 */ NULL, NULL, NULL, NULL,
12614 /* 84 */ NULL, NULL, NULL, NULL,
12615 /* 88 */ NULL, NULL, "pfnacc", NULL,
12616 /* 8C */ NULL, NULL, "pfpnacc", NULL,
12617 /* 90 */ "pfcmpge", NULL, NULL, NULL,
12618 /* 94 */ "pfmin", NULL, "pfrcp", "pfrsqrt",
12619 /* 98 */ NULL, NULL, "pfsub", NULL,
12620 /* 9C */ NULL, NULL, "pfadd", NULL,
12621 /* A0 */ "pfcmpgt", NULL, NULL, NULL,
12622 /* A4 */ "pfmax", NULL, "pfrcpit1", "pfrsqit1",
12623 /* A8 */ NULL, NULL, "pfsubr", NULL,
12624 /* AC */ NULL, NULL, "pfacc", NULL,
12625 /* B0 */ "pfcmpeq", NULL, NULL, NULL,
12626 /* B4 */ "pfmul", NULL, "pfrcpit2", "pmulhrw",
12627 /* B8 */ NULL, NULL, NULL, "pswapd",
12628 /* BC */ NULL, NULL, NULL, "pavgusb",
12629 /* C0 */ NULL, NULL, NULL, NULL,
12630 /* C4 */ NULL, NULL, NULL, NULL,
12631 /* C8 */ NULL, NULL, NULL, NULL,
12632 /* CC */ NULL, NULL, NULL, NULL,
12633 /* D0 */ NULL, NULL, NULL, NULL,
12634 /* D4 */ NULL, NULL, NULL, NULL,
12635 /* D8 */ NULL, NULL, NULL, NULL,
12636 /* DC */ NULL, NULL, NULL, NULL,
12637 /* E0 */ NULL, NULL, NULL, NULL,
12638 /* E4 */ NULL, NULL, NULL, NULL,
12639 /* E8 */ NULL, NULL, NULL, NULL,
12640 /* EC */ NULL, NULL, NULL, NULL,
12641 /* F0 */ NULL, NULL, NULL, NULL,
12642 /* F4 */ NULL, NULL, NULL, NULL,
12643 /* F8 */ NULL, NULL, NULL, NULL,
12644 /* FC */ NULL, NULL, NULL, NULL,
12645 };
12646
12647 static void
12648 OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12649 {
12650 const char *mnemonic;
12651
12652 FETCH_DATA (the_info, codep + 1);
12653 /* AMD 3DNow! instructions are specified by an opcode suffix in the
12654 place where an 8-bit immediate would normally go. ie. the last
12655 byte of the instruction. */
12656 obufp = obuf + strlen (obuf);
12657 mnemonic = Suffix3DNow[*codep++ & 0xff];
12658 if (mnemonic)
12659 oappend (mnemonic);
12660 else
12661 {
12662 /* Since a variable sized modrm/sib chunk is between the start
12663 of the opcode (0x0f0f) and the opcode suffix, we need to do
12664 all the modrm processing first, and don't know until now that
12665 we have a bad opcode. This necessitates some cleaning up. */
12666 op_out[0][0] = '\0';
12667 op_out[1][0] = '\0';
12668 BadOp ();
12669 }
12670 }
12671
12672 static const char *simd_cmp_op[] = {
12673 "eq",
12674 "lt",
12675 "le",
12676 "unord",
12677 "neq",
12678 "nlt",
12679 "nle",
12680 "ord"
12681 };
12682
12683 static void
12684 CMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12685 {
12686 unsigned int cmp_type;
12687
12688 FETCH_DATA (the_info, codep + 1);
12689 cmp_type = *codep++ & 0xff;
12690 if (cmp_type < ARRAY_SIZE (simd_cmp_op))
12691 {
12692 char suffix [3];
12693 char *p = obuf + strlen (obuf) - 2;
12694 suffix[0] = p[0];
12695 suffix[1] = p[1];
12696 suffix[2] = '\0';
12697 sprintf (p, "%s%s", simd_cmp_op[cmp_type], suffix);
12698 }
12699 else
12700 {
12701 /* We have a reserved extension byte. Output it directly. */
12702 scratchbuf[0] = '$';
12703 print_operand_value (scratchbuf + 1, 1, cmp_type);
12704 oappend (scratchbuf + intel_syntax);
12705 scratchbuf[0] = '\0';
12706 }
12707 }
12708
12709 static void
12710 OP_Mwait (int bytemode ATTRIBUTE_UNUSED,
12711 int sizeflag ATTRIBUTE_UNUSED)
12712 {
12713 /* mwait %eax,%ecx */
12714 if (!intel_syntax)
12715 {
12716 const char **names = (address_mode == mode_64bit
12717 ? names64 : names32);
12718 strcpy (op_out[0], names[0]);
12719 strcpy (op_out[1], names[1]);
12720 two_source_ops = 1;
12721 }
12722 /* Skip mod/rm byte. */
12723 MODRM_CHECK;
12724 codep++;
12725 }
12726
12727 static void
12728 OP_Monitor (int bytemode ATTRIBUTE_UNUSED,
12729 int sizeflag ATTRIBUTE_UNUSED)
12730 {
12731 /* monitor %eax,%ecx,%edx" */
12732 if (!intel_syntax)
12733 {
12734 const char **op1_names;
12735 const char **names = (address_mode == mode_64bit
12736 ? names64 : names32);
12737
12738 if (!(prefixes & PREFIX_ADDR))
12739 op1_names = (address_mode == mode_16bit
12740 ? names16 : names);
12741 else
12742 {
12743 /* Remove "addr16/addr32". */
12744 addr_prefix = NULL;
12745 op1_names = (address_mode != mode_32bit
12746 ? names32 : names16);
12747 used_prefixes |= PREFIX_ADDR;
12748 }
12749 strcpy (op_out[0], op1_names[0]);
12750 strcpy (op_out[1], names[1]);
12751 strcpy (op_out[2], names[2]);
12752 two_source_ops = 1;
12753 }
12754 /* Skip mod/rm byte. */
12755 MODRM_CHECK;
12756 codep++;
12757 }
12758
12759 static void
12760 BadOp (void)
12761 {
12762 /* Throw away prefixes and 1st. opcode byte. */
12763 codep = insn_codep + 1;
12764 oappend ("(bad)");
12765 }
12766
12767 static void
12768 REP_Fixup (int bytemode, int sizeflag)
12769 {
12770 /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
12771 lods and stos. */
12772 if (prefixes & PREFIX_REPZ)
12773 repz_prefix = "rep ";
12774
12775 switch (bytemode)
12776 {
12777 case al_reg:
12778 case eAX_reg:
12779 case indir_dx_reg:
12780 OP_IMREG (bytemode, sizeflag);
12781 break;
12782 case eDI_reg:
12783 OP_ESreg (bytemode, sizeflag);
12784 break;
12785 case eSI_reg:
12786 OP_DSreg (bytemode, sizeflag);
12787 break;
12788 default:
12789 abort ();
12790 break;
12791 }
12792 }
12793
12794 static void
12795 CMPXCHG8B_Fixup (int bytemode, int sizeflag)
12796 {
12797 USED_REX (REX_W);
12798 if (rex & REX_W)
12799 {
12800 /* Change cmpxchg8b to cmpxchg16b. */
12801 char *p = obuf + strlen (obuf) - 2;
12802 strcpy (p, "16b");
12803 bytemode = o_mode;
12804 }
12805 OP_M (bytemode, sizeflag);
12806 }
12807
12808 static void
12809 XMM_Fixup (int reg, int sizeflag ATTRIBUTE_UNUSED)
12810 {
12811 if (need_vex)
12812 {
12813 switch (vex.length)
12814 {
12815 case 128:
12816 sprintf (scratchbuf, "%%xmm%d", reg);
12817 break;
12818 case 256:
12819 sprintf (scratchbuf, "%%ymm%d", reg);
12820 break;
12821 default:
12822 abort ();
12823 }
12824 }
12825 else
12826 sprintf (scratchbuf, "%%xmm%d", reg);
12827 oappend (scratchbuf + intel_syntax);
12828 }
12829
12830 static void
12831 CRC32_Fixup (int bytemode, int sizeflag)
12832 {
12833 /* Add proper suffix to "crc32". */
12834 char *p = obuf + strlen (obuf);
12835
12836 switch (bytemode)
12837 {
12838 case b_mode:
12839 if (intel_syntax)
12840 break;
12841
12842 *p++ = 'b';
12843 break;
12844 case v_mode:
12845 if (intel_syntax)
12846 break;
12847
12848 USED_REX (REX_W);
12849 if (rex & REX_W)
12850 *p++ = 'q';
12851 else if (sizeflag & DFLAG)
12852 *p++ = 'l';
12853 else
12854 *p++ = 'w';
12855 used_prefixes |= (prefixes & PREFIX_DATA);
12856 break;
12857 default:
12858 oappend (INTERNAL_DISASSEMBLER_ERROR);
12859 break;
12860 }
12861 *p = '\0';
12862
12863 if (modrm.mod == 3)
12864 {
12865 int add;
12866
12867 /* Skip mod/rm byte. */
12868 MODRM_CHECK;
12869 codep++;
12870
12871 USED_REX (REX_B);
12872 add = (rex & REX_B) ? 8 : 0;
12873 if (bytemode == b_mode)
12874 {
12875 USED_REX (0);
12876 if (rex)
12877 oappend (names8rex[modrm.rm + add]);
12878 else
12879 oappend (names8[modrm.rm + add]);
12880 }
12881 else
12882 {
12883 USED_REX (REX_W);
12884 if (rex & REX_W)
12885 oappend (names64[modrm.rm + add]);
12886 else if ((prefixes & PREFIX_DATA))
12887 oappend (names16[modrm.rm + add]);
12888 else
12889 oappend (names32[modrm.rm + add]);
12890 }
12891 }
12892 else
12893 OP_E (bytemode, sizeflag);
12894 }
12895
12896 /* Print a DREX argument as either a register or memory operation. */
12897 static void
12898 print_drex_arg (unsigned int reg, int bytemode, int sizeflag)
12899 {
12900 if (reg == DREX_REG_UNKNOWN)
12901 BadOp ();
12902
12903 else if (reg != DREX_REG_MEMORY)
12904 {
12905 sprintf (scratchbuf, "%%xmm%d", reg);
12906 oappend (scratchbuf + intel_syntax);
12907 }
12908
12909 else
12910 OP_E_extended (bytemode, sizeflag, 1);
12911 }
12912
12913 /* SSE5 instructions that have 4 arguments are encoded as:
12914 0f 24 <sub-opcode> <modrm> <optional-sib> <drex> <offset>.
12915
12916 The <sub-opcode> byte has 1 bit (0x4) that is combined with 1 bit in
12917 the DREX field (0x8) to determine how the arguments are laid out.
12918 The destination register must be the same register as one of the
12919 inputs, and it is encoded in the DREX byte. No REX prefix is used
12920 for these instructions, since the DREX field contains the 3 extension
12921 bits provided by the REX prefix.
12922
12923 The bytemode argument adds 2 extra bits for passing extra information:
12924 DREX_OC1 -- Set the OC1 bit to indicate dest == 1st arg
12925 DREX_NO_OC0 -- OC0 in DREX is invalid
12926 (but pretend it is set). */
12927
12928 static void
12929 OP_DREX4 (int flag_bytemode, int sizeflag)
12930 {
12931 unsigned int drex_byte;
12932 unsigned int regs[4];
12933 unsigned int modrm_regmem;
12934 unsigned int modrm_reg;
12935 unsigned int drex_reg;
12936 int bytemode;
12937 int rex_save = rex;
12938 int rex_used_save = rex_used;
12939 int has_sib = 0;
12940 int oc1 = (flag_bytemode & DREX_OC1) ? 2 : 0;
12941 int oc0;
12942 int i;
12943
12944 bytemode = flag_bytemode & ~ DREX_MASK;
12945
12946 for (i = 0; i < 4; i++)
12947 regs[i] = DREX_REG_UNKNOWN;
12948
12949 /* Determine if we have a SIB byte in addition to MODRM before the
12950 DREX byte. */
12951 if (((sizeflag & AFLAG) || address_mode == mode_64bit)
12952 && (modrm.mod != 3)
12953 && (modrm.rm == 4))
12954 has_sib = 1;
12955
12956 /* Get the DREX byte. */
12957 FETCH_DATA (the_info, codep + 2 + has_sib);
12958 drex_byte = codep[has_sib+1];
12959 drex_reg = DREX_XMM (drex_byte);
12960 modrm_reg = modrm.reg + ((drex_byte & REX_R) ? 8 : 0);
12961
12962 /* Is OC0 legal? If not, hardwire oc0 == 1. */
12963 if (flag_bytemode & DREX_NO_OC0)
12964 {
12965 oc0 = 1;
12966 if (DREX_OC0 (drex_byte))
12967 BadOp ();
12968 }
12969 else
12970 oc0 = DREX_OC0 (drex_byte);
12971
12972 if (modrm.mod == 3)
12973 {
12974 /* regmem == register */
12975 modrm_regmem = modrm.rm + ((drex_byte & REX_B) ? 8 : 0);
12976 rex = rex_used = 0;
12977 /* skip modrm/drex since we don't call OP_E_extended */
12978 codep += 2;
12979 }
12980 else
12981 {
12982 /* regmem == memory, fill in appropriate REX bits */
12983 modrm_regmem = DREX_REG_MEMORY;
12984 rex = drex_byte & (REX_B | REX_X | REX_R);
12985 if (rex)
12986 rex |= REX_OPCODE;
12987 rex_used = rex;
12988 }
12989
12990 /* Based on the OC1/OC0 bits, lay out the arguments in the correct
12991 order. */
12992 switch (oc0 + oc1)
12993 {
12994 default:
12995 BadOp ();
12996 return;
12997
12998 case 0:
12999 regs[0] = modrm_regmem;
13000 regs[1] = modrm_reg;
13001 regs[2] = drex_reg;
13002 regs[3] = drex_reg;
13003 break;
13004
13005 case 1:
13006 regs[0] = modrm_reg;
13007 regs[1] = modrm_regmem;
13008 regs[2] = drex_reg;
13009 regs[3] = drex_reg;
13010 break;
13011
13012 case 2:
13013 regs[0] = drex_reg;
13014 regs[1] = modrm_regmem;
13015 regs[2] = modrm_reg;
13016 regs[3] = drex_reg;
13017 break;
13018
13019 case 3:
13020 regs[0] = drex_reg;
13021 regs[1] = modrm_reg;
13022 regs[2] = modrm_regmem;
13023 regs[3] = drex_reg;
13024 break;
13025 }
13026
13027 /* Print out the arguments. */
13028 for (i = 0; i < 4; i++)
13029 {
13030 int j = (intel_syntax) ? 3 - i : i;
13031 if (i > 0)
13032 {
13033 *obufp++ = ',';
13034 *obufp = '\0';
13035 }
13036
13037 print_drex_arg (regs[j], bytemode, sizeflag);
13038 }
13039
13040 rex = rex_save;
13041 rex_used = rex_used_save;
13042 }
13043
13044 /* SSE5 instructions that have 3 arguments, and are encoded as:
13045 0f 24 <sub-opcode> <modrm> <optional-sib> <drex> <offset> (or)
13046 0f 25 <sub-opcode> <modrm> <optional-sib> <drex> <offset> <cmp-byte>
13047
13048 The DREX field has 1 bit (0x8) to determine how the arguments are
13049 laid out. The destination register is encoded in the DREX byte.
13050 No REX prefix is used for these instructions, since the DREX field
13051 contains the 3 extension bits provided by the REX prefix. */
13052
13053 static void
13054 OP_DREX3 (int flag_bytemode, int sizeflag)
13055 {
13056 unsigned int drex_byte;
13057 unsigned int regs[3];
13058 unsigned int modrm_regmem;
13059 unsigned int modrm_reg;
13060 unsigned int drex_reg;
13061 int bytemode;
13062 int rex_save = rex;
13063 int rex_used_save = rex_used;
13064 int has_sib = 0;
13065 int oc0;
13066 int i;
13067
13068 bytemode = flag_bytemode & ~ DREX_MASK;
13069
13070 for (i = 0; i < 3; i++)
13071 regs[i] = DREX_REG_UNKNOWN;
13072
13073 /* Determine if we have a SIB byte in addition to MODRM before the
13074 DREX byte. */
13075 if (((sizeflag & AFLAG) || address_mode == mode_64bit)
13076 && (modrm.mod != 3)
13077 && (modrm.rm == 4))
13078 has_sib = 1;
13079
13080 /* Get the DREX byte. */
13081 FETCH_DATA (the_info, codep + 2 + has_sib);
13082 drex_byte = codep[has_sib+1];
13083 drex_reg = DREX_XMM (drex_byte);
13084 modrm_reg = modrm.reg + ((drex_byte & REX_R) ? 8 : 0);
13085
13086 /* Is OC0 legal? If not, hardwire oc0 == 0 */
13087 oc0 = DREX_OC0 (drex_byte);
13088 if ((flag_bytemode & DREX_NO_OC0) && oc0)
13089 BadOp ();
13090
13091 if (modrm.mod == 3)
13092 {
13093 /* regmem == register */
13094 modrm_regmem = modrm.rm + ((drex_byte & REX_B) ? 8 : 0);
13095 rex = rex_used = 0;
13096 /* skip modrm/drex since we don't call OP_E_extended. */
13097 codep += 2;
13098 }
13099 else
13100 {
13101 /* regmem == memory, fill in appropriate REX bits. */
13102 modrm_regmem = DREX_REG_MEMORY;
13103 rex = drex_byte & (REX_B | REX_X | REX_R);
13104 if (rex)
13105 rex |= REX_OPCODE;
13106 rex_used = rex;
13107 }
13108
13109 /* Based on the OC1/OC0 bits, lay out the arguments in the correct
13110 order. */
13111 switch (oc0)
13112 {
13113 default:
13114 BadOp ();
13115 return;
13116
13117 case 0:
13118 regs[0] = modrm_regmem;
13119 regs[1] = modrm_reg;
13120 regs[2] = drex_reg;
13121 break;
13122
13123 case 1:
13124 regs[0] = modrm_reg;
13125 regs[1] = modrm_regmem;
13126 regs[2] = drex_reg;
13127 break;
13128 }
13129
13130 /* Print out the arguments. */
13131 for (i = 0; i < 3; i++)
13132 {
13133 int j = (intel_syntax) ? 2 - i : i;
13134 if (i > 0)
13135 {
13136 *obufp++ = ',';
13137 *obufp = '\0';
13138 }
13139
13140 print_drex_arg (regs[j], bytemode, sizeflag);
13141 }
13142
13143 rex = rex_save;
13144 rex_used = rex_used_save;
13145 }
13146
13147 /* Emit a floating point comparison for comp<xx> instructions. */
13148
13149 static void
13150 OP_DREX_FCMP (int bytemode ATTRIBUTE_UNUSED,
13151 int sizeflag ATTRIBUTE_UNUSED)
13152 {
13153 unsigned char byte;
13154
13155 static const char *const cmp_test[] = {
13156 "eq",
13157 "lt",
13158 "le",
13159 "unord",
13160 "ne",
13161 "nlt",
13162 "nle",
13163 "ord",
13164 "ueq",
13165 "ult",
13166 "ule",
13167 "false",
13168 "une",
13169 "unlt",
13170 "unle",
13171 "true"
13172 };
13173
13174 FETCH_DATA (the_info, codep + 1);
13175 byte = *codep & 0xff;
13176
13177 if (byte >= ARRAY_SIZE (cmp_test)
13178 || obuf[0] != 'c'
13179 || obuf[1] != 'o'
13180 || obuf[2] != 'm')
13181 {
13182 /* The instruction isn't one we know about, so just append the
13183 extension byte as a numeric value. */
13184 OP_I (b_mode, 0);
13185 }
13186
13187 else
13188 {
13189 sprintf (scratchbuf, "com%s%s", cmp_test[byte], obuf+3);
13190 strcpy (obuf, scratchbuf);
13191 codep++;
13192 }
13193 }
13194
13195 /* Emit an integer point comparison for pcom<xx> instructions,
13196 rewriting the instruction to have the test inside of it. */
13197
13198 static void
13199 OP_DREX_ICMP (int bytemode ATTRIBUTE_UNUSED,
13200 int sizeflag ATTRIBUTE_UNUSED)
13201 {
13202 unsigned char byte;
13203
13204 static const char *const cmp_test[] = {
13205 "lt",
13206 "le",
13207 "gt",
13208 "ge",
13209 "eq",
13210 "ne",
13211 "false",
13212 "true"
13213 };
13214
13215 FETCH_DATA (the_info, codep + 1);
13216 byte = *codep & 0xff;
13217
13218 if (byte >= ARRAY_SIZE (cmp_test)
13219 || obuf[0] != 'p'
13220 || obuf[1] != 'c'
13221 || obuf[2] != 'o'
13222 || obuf[3] != 'm')
13223 {
13224 /* The instruction isn't one we know about, so just print the
13225 comparison test byte as a numeric value. */
13226 OP_I (b_mode, 0);
13227 }
13228
13229 else
13230 {
13231 sprintf (scratchbuf, "pcom%s%s", cmp_test[byte], obuf+4);
13232 strcpy (obuf, scratchbuf);
13233 codep++;
13234 }
13235 }
13236
13237 /* Display the destination register operand for instructions with
13238 VEX. */
13239
13240 static void
13241 OP_VEX (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13242 {
13243 if (!need_vex)
13244 abort ();
13245
13246 if (!need_vex_reg)
13247 return;
13248
13249 switch (vex.length)
13250 {
13251 case 128:
13252 switch (bytemode)
13253 {
13254 case vex_mode:
13255 case vex128_mode:
13256 break;
13257 default:
13258 abort ();
13259 return;
13260 }
13261
13262 sprintf (scratchbuf, "%%xmm%d", vex.register_specifier);
13263 break;
13264 case 256:
13265 switch (bytemode)
13266 {
13267 case vex_mode:
13268 case vex256_mode:
13269 break;
13270 default:
13271 abort ();
13272 return;
13273 }
13274
13275 sprintf (scratchbuf, "%%ymm%d", vex.register_specifier);
13276 break;
13277 default:
13278 abort ();
13279 break;
13280 }
13281 oappend (scratchbuf + intel_syntax);
13282 }
13283
13284 /* Get the VEX immediate byte without moving codep. */
13285
13286 static unsigned char
13287 get_vex_imm8 (int sizeflag)
13288 {
13289 int bytes_before_imm = 0;
13290
13291 /* Skip mod/rm byte. */
13292 MODRM_CHECK;
13293 codep++;
13294
13295 if (modrm.mod != 3)
13296 {
13297 /* There are SIB/displacement bytes. */
13298 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
13299 {
13300 /* 32/64 bit address mode */
13301 int base = modrm.rm;
13302
13303 /* Check SIB byte. */
13304 if (base == 4)
13305 {
13306 FETCH_DATA (the_info, codep + 1);
13307 base = *codep & 7;
13308 bytes_before_imm++;
13309 }
13310
13311 switch (modrm.mod)
13312 {
13313 case 0:
13314 /* When modrm.rm == 5 or modrm.rm == 4 and base in
13315 SIB == 5, there is a 4 byte displacement. */
13316 if (base != 5)
13317 /* No displacement. */
13318 break;
13319 case 2:
13320 /* 4 byte displacement. */
13321 bytes_before_imm += 4;
13322 break;
13323 case 1:
13324 /* 1 byte displacement. */
13325 bytes_before_imm++;
13326 break;
13327 }
13328 }
13329 else
13330 { /* 16 bit address mode */
13331 switch (modrm.mod)
13332 {
13333 case 0:
13334 /* When modrm.rm == 6, there is a 2 byte displacement. */
13335 if (modrm.rm != 6)
13336 /* No displacement. */
13337 break;
13338 case 2:
13339 /* 2 byte displacement. */
13340 bytes_before_imm += 2;
13341 break;
13342 case 1:
13343 /* 1 byte displacement. */
13344 bytes_before_imm++;
13345 break;
13346 }
13347 }
13348 }
13349
13350 FETCH_DATA (the_info, codep + bytes_before_imm + 1);
13351 return codep [bytes_before_imm];
13352 }
13353
13354 static void
13355 OP_EX_VexReg (int bytemode, int sizeflag, int reg)
13356 {
13357 if (reg == -1 && modrm.mod != 3)
13358 {
13359 OP_E_memory (bytemode, sizeflag, 0);
13360 return;
13361 }
13362 else
13363 {
13364 if (reg == -1)
13365 {
13366 reg = modrm.rm;
13367 USED_REX (REX_B);
13368 if (rex & REX_B)
13369 reg += 8;
13370 }
13371 else if (reg > 7 && address_mode != mode_64bit)
13372 BadOp ();
13373 }
13374
13375 switch (vex.length)
13376 {
13377 case 128:
13378 sprintf (scratchbuf, "%%xmm%d", reg);
13379 break;
13380 case 256:
13381 sprintf (scratchbuf, "%%ymm%d", reg);
13382 break;
13383 default:
13384 abort ();
13385 }
13386 oappend (scratchbuf + intel_syntax);
13387 }
13388
13389 static void
13390 OP_EX_VexImmW (int bytemode, int sizeflag)
13391 {
13392 int reg = -1;
13393 static unsigned char vex_imm8;
13394
13395 if (!vex_w_done)
13396 {
13397 vex_imm8 = get_vex_imm8 (sizeflag);
13398 if (vex.w)
13399 reg = vex_imm8 >> 4;
13400 vex_w_done = 1;
13401 }
13402 else
13403 {
13404 if (!vex.w)
13405 reg = vex_imm8 >> 4;
13406 }
13407
13408 OP_EX_VexReg (bytemode, sizeflag, reg);
13409 }
13410
13411 static void
13412 OP_EX_VexW (int bytemode, int sizeflag)
13413 {
13414 int reg = -1;
13415
13416 if (!vex_w_done)
13417 {
13418 vex_w_done = 1;
13419 if (vex.w)
13420 reg = vex.register_specifier;
13421 }
13422 else
13423 {
13424 if (!vex.w)
13425 reg = vex.register_specifier;
13426 }
13427
13428 OP_EX_VexReg (bytemode, sizeflag, reg);
13429 }
13430
13431 static void
13432 OP_VEX_FMA (int bytemode, int sizeflag)
13433 {
13434 int reg = get_vex_imm8 (sizeflag) >> 4;
13435
13436 if (reg > 7 && address_mode != mode_64bit)
13437 BadOp ();
13438
13439 switch (vex.length)
13440 {
13441 case 128:
13442 switch (bytemode)
13443 {
13444 case vex_mode:
13445 case vex128_mode:
13446 break;
13447 default:
13448 abort ();
13449 return;
13450 }
13451
13452 sprintf (scratchbuf, "%%xmm%d", reg);
13453 break;
13454 case 256:
13455 switch (bytemode)
13456 {
13457 case vex_mode:
13458 break;
13459 default:
13460 abort ();
13461 return;
13462 }
13463
13464 sprintf (scratchbuf, "%%ymm%d", reg);
13465 break;
13466 default:
13467 abort ();
13468 }
13469 oappend (scratchbuf + intel_syntax);
13470 }
13471
13472 static void
13473 VEXI4_Fixup (int bytemode ATTRIBUTE_UNUSED,
13474 int sizeflag ATTRIBUTE_UNUSED)
13475 {
13476 /* Skip the immediate byte and check for invalid bits. */
13477 FETCH_DATA (the_info, codep + 1);
13478 if (*codep++ & 0xf)
13479 BadOp ();
13480 }
13481
13482 static void
13483 OP_REG_VexI4 (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13484 {
13485 int reg;
13486 FETCH_DATA (the_info, codep + 1);
13487 reg = *codep++;
13488
13489 if (bytemode != x_mode)
13490 abort ();
13491
13492 if (reg & 0xf)
13493 BadOp ();
13494
13495 reg >>= 4;
13496 if (reg > 7 && address_mode != mode_64bit)
13497 BadOp ();
13498
13499 switch (vex.length)
13500 {
13501 case 128:
13502 sprintf (scratchbuf, "%%xmm%d", reg);
13503 break;
13504 case 256:
13505 sprintf (scratchbuf, "%%ymm%d", reg);
13506 break;
13507 default:
13508 abort ();
13509 }
13510 oappend (scratchbuf + intel_syntax);
13511 }
13512
13513 static void
13514 OP_XMM_VexW (int bytemode, int sizeflag)
13515 {
13516 /* Turn off the REX.W bit since it is used for swapping operands
13517 now. */
13518 rex &= ~REX_W;
13519 OP_XMM (bytemode, sizeflag);
13520 }
13521
13522 static void
13523 OP_EX_Vex (int bytemode, int sizeflag)
13524 {
13525 if (modrm.mod != 3)
13526 {
13527 if (vex.register_specifier != 0)
13528 BadOp ();
13529 need_vex_reg = 0;
13530 }
13531 OP_EX (bytemode, sizeflag);
13532 }
13533
13534 static void
13535 OP_XMM_Vex (int bytemode, int sizeflag)
13536 {
13537 if (modrm.mod != 3)
13538 {
13539 if (vex.register_specifier != 0)
13540 BadOp ();
13541 need_vex_reg = 0;
13542 }
13543 OP_XMM (bytemode, sizeflag);
13544 }
13545
13546 static void
13547 VZERO_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13548 {
13549 switch (vex.length)
13550 {
13551 case 128:
13552 strcpy (obuf, "vzeroupper");
13553 break;
13554 case 256:
13555 strcpy (obuf, "vzeroall");
13556 break;
13557 default:
13558 abort ();
13559 }
13560 }
13561
13562 static const char *vex_cmp_op[] = {
13563 "eq",
13564 "lt",
13565 "le",
13566 "unord",
13567 "neq",
13568 "nlt",
13569 "nle",
13570 "ord",
13571 "eq_uq",
13572 "nge",
13573 "ngt",
13574 "false",
13575 "neq_oq",
13576 "ge",
13577 "gt",
13578 "true",
13579 "eq_os",
13580 "lt_oq",
13581 "le_oq",
13582 "unord_s",
13583 "neq_us",
13584 "nlt_uq",
13585 "nle_uq",
13586 "ord_s",
13587 "eq_us",
13588 "nge_uq",
13589 "ngt_uq",
13590 "false_os",
13591 "neq_os",
13592 "ge_oq",
13593 "gt_oq",
13594 "true_us"
13595 };
13596
13597 static void
13598 VCMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13599 {
13600 unsigned int cmp_type;
13601
13602 FETCH_DATA (the_info, codep + 1);
13603 cmp_type = *codep++ & 0xff;
13604 if (cmp_type < ARRAY_SIZE (vex_cmp_op))
13605 {
13606 char suffix [3];
13607 char *p = obuf + strlen (obuf) - 2;
13608 suffix[0] = p[0];
13609 suffix[1] = p[1];
13610 suffix[2] = '\0';
13611 sprintf (p, "%s%s", vex_cmp_op[cmp_type], suffix);
13612 }
13613 else
13614 {
13615 /* We have a reserved extension byte. Output it directly. */
13616 scratchbuf[0] = '$';
13617 print_operand_value (scratchbuf + 1, 1, cmp_type);
13618 oappend (scratchbuf + intel_syntax);
13619 scratchbuf[0] = '\0';
13620 }
13621 }
13622
13623 static const char *pclmul_op[] = {
13624 "lql",
13625 "hql",
13626 "lqh",
13627 "hqh"
13628 };
13629
13630 static void
13631 PCLMUL_Fixup (int bytemode ATTRIBUTE_UNUSED,
13632 int sizeflag ATTRIBUTE_UNUSED)
13633 {
13634 unsigned int pclmul_type;
13635
13636 FETCH_DATA (the_info, codep + 1);
13637 pclmul_type = *codep++ & 0xff;
13638 switch (pclmul_type)
13639 {
13640 case 0x10:
13641 pclmul_type = 2;
13642 break;
13643 case 0x11:
13644 pclmul_type = 3;
13645 break;
13646 default:
13647 break;
13648 }
13649 if (pclmul_type < ARRAY_SIZE (pclmul_op))
13650 {
13651 char suffix [4];
13652 char *p = obuf + strlen (obuf) - 3;
13653 suffix[0] = p[0];
13654 suffix[1] = p[1];
13655 suffix[2] = p[2];
13656 suffix[3] = '\0';
13657 sprintf (p, "%s%s", pclmul_op[pclmul_type], suffix);
13658 }
13659 else
13660 {
13661 /* We have a reserved extension byte. Output it directly. */
13662 scratchbuf[0] = '$';
13663 print_operand_value (scratchbuf + 1, 1, pclmul_type);
13664 oappend (scratchbuf + intel_syntax);
13665 scratchbuf[0] = '\0';
13666 }
13667 }
13668
13669 static const char *vpermil2_op[] = {
13670 "td",
13671 "td",
13672 "mo",
13673 "mz"
13674 };
13675
13676 static void
13677 VPERMIL2_Fixup (int bytemode ATTRIBUTE_UNUSED,
13678 int sizeflag ATTRIBUTE_UNUSED)
13679 {
13680 unsigned int vpermil2_type;
13681
13682 FETCH_DATA (the_info, codep + 1);
13683 vpermil2_type = *codep++ & 0xf;
13684 if (vpermil2_type < ARRAY_SIZE (vpermil2_op))
13685 {
13686 char suffix [4];
13687 char *p = obuf + strlen (obuf) - 3;
13688 suffix[0] = p[0];
13689 suffix[1] = p[1];
13690 suffix[2] = p[2];
13691 suffix[3] = '\0';
13692 sprintf (p, "%s%s", vpermil2_op[vpermil2_type], suffix);
13693 }
13694 else
13695 {
13696 /* We have a reserved extension byte. Output it directly. */
13697 scratchbuf[0] = '$';
13698 print_operand_value (scratchbuf + 1, 1, vpermil2_type);
13699 oappend (scratchbuf + intel_syntax);
13700 scratchbuf[0] = '\0';
13701 }
13702 }