make dep-am and regen
[binutils-gdb.git] / opcodes / i386-dis.c
1 /* Print i386 instructions for GDB, the GNU debugger.
2 Copyright 1988, 1989, 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
4 Free Software Foundation, Inc.
5
6 This file is part of the GNU opcodes library.
7
8 This library is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3, or (at your option)
11 any later version.
12
13 It is distributed in the hope that it will be useful, but WITHOUT
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
16 License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21 MA 02110-1301, USA. */
22
23
24 /* 80386 instruction printer by Pace Willisson (pace@prep.ai.mit.edu)
25 July 1988
26 modified by John Hassey (hassey@dg-rtp.dg.com)
27 x86-64 support added by Jan Hubicka (jh@suse.cz)
28 VIA PadLock support by Michal Ludvig (mludvig@suse.cz). */
29
30 /* The main tables describing the instructions is essentially a copy
31 of the "Opcode Map" chapter (Appendix A) of the Intel 80386
32 Programmers Manual. Usually, there is a capital letter, followed
33 by a small letter. The capital letter tell the addressing mode,
34 and the small letter tells about the operand size. Refer to
35 the Intel manual for details. */
36
37 #include "sysdep.h"
38 #include "dis-asm.h"
39 #include "opintl.h"
40 #include "opcode/i386.h"
41 #include "libiberty.h"
42
43 #include <setjmp.h>
44
45 static int fetch_data (struct disassemble_info *, bfd_byte *);
46 static void ckprefix (void);
47 static const char *prefix_name (int, int);
48 static int print_insn (bfd_vma, disassemble_info *);
49 static void dofloat (int);
50 static void OP_ST (int, int);
51 static void OP_STi (int, int);
52 static int putop (const char *, int);
53 static void oappend (const char *);
54 static void append_seg (void);
55 static void OP_indirE (int, int);
56 static void print_operand_value (char *, int, bfd_vma);
57 static void OP_E_register (int, int);
58 static void OP_E_memory (int, int, int);
59 static void OP_E_extended (int, int, int);
60 static void print_displacement (char *, bfd_vma);
61 static void OP_E (int, int);
62 static void OP_G (int, int);
63 static bfd_vma get64 (void);
64 static bfd_signed_vma get32 (void);
65 static bfd_signed_vma get32s (void);
66 static int get16 (void);
67 static void set_op (bfd_vma, int);
68 static void OP_Skip_MODRM (int, int);
69 static void OP_REG (int, int);
70 static void OP_IMREG (int, int);
71 static void OP_I (int, int);
72 static void OP_I64 (int, int);
73 static void OP_sI (int, int);
74 static void OP_J (int, int);
75 static void OP_SEG (int, int);
76 static void OP_DIR (int, int);
77 static void OP_OFF (int, int);
78 static void OP_OFF64 (int, int);
79 static void ptr_reg (int, int);
80 static void OP_ESreg (int, int);
81 static void OP_DSreg (int, int);
82 static void OP_C (int, int);
83 static void OP_D (int, int);
84 static void OP_T (int, int);
85 static void OP_R (int, int);
86 static void OP_MMX (int, int);
87 static void OP_XMM (int, int);
88 static void OP_EM (int, int);
89 static void OP_EX (int, int);
90 static void OP_EMC (int,int);
91 static void OP_MXC (int,int);
92 static void OP_MS (int, int);
93 static void OP_XS (int, int);
94 static void OP_M (int, int);
95 static void OP_VEX (int, int);
96 static void OP_EX_Vex (int, int);
97 static void OP_XMM_Vex (int, int);
98 static void OP_REG_VexI4 (int, int);
99 static void PCLMUL_Fixup (int, int);
100 static void VZERO_Fixup (int, int);
101 static void VCMP_Fixup (int, int);
102 static void OP_0f07 (int, int);
103 static void OP_Monitor (int, int);
104 static void OP_Mwait (int, int);
105 static void NOP_Fixup1 (int, int);
106 static void NOP_Fixup2 (int, int);
107 static void OP_3DNowSuffix (int, int);
108 static void CMP_Fixup (int, int);
109 static void BadOp (void);
110 static void REP_Fixup (int, int);
111 static void CMPXCHG8B_Fixup (int, int);
112 static void XMM_Fixup (int, int);
113 static void CRC32_Fixup (int, int);
114 static void print_drex_arg (unsigned int, int, int);
115 static void OP_DREX4 (int, int);
116 static void OP_DREX3 (int, int);
117 static void OP_DREX_ICMP (int, int);
118 static void OP_DREX_FCMP (int, int);
119 static void MOVBE_Fixup (int, int);
120
121 struct dis_private {
122 /* Points to first byte not fetched. */
123 bfd_byte *max_fetched;
124 bfd_byte the_buffer[MAX_MNEM_SIZE];
125 bfd_vma insn_start;
126 int orig_sizeflag;
127 jmp_buf bailout;
128 };
129
130 enum address_mode
131 {
132 mode_16bit,
133 mode_32bit,
134 mode_64bit
135 };
136
137 enum address_mode address_mode;
138
139 /* Flags for the prefixes for the current instruction. See below. */
140 static int prefixes;
141
142 /* REX prefix the current instruction. See below. */
143 static int rex;
144 /* Bits of REX we've already used. */
145 static int rex_used;
146 /* Original REX prefix. */
147 static int rex_original;
148 /* REX bits in original REX prefix ignored. It may not be the same
149 as rex_original since some bits may not be ignored. */
150 static int rex_ignored;
151 /* Mark parts used in the REX prefix. When we are testing for
152 empty prefix (for 8bit register REX extension), just mask it
153 out. Otherwise test for REX bit is excuse for existence of REX
154 only in case value is nonzero. */
155 #define USED_REX(value) \
156 { \
157 if (value) \
158 { \
159 if ((rex & value)) \
160 rex_used |= (value) | REX_OPCODE; \
161 } \
162 else \
163 rex_used |= REX_OPCODE; \
164 }
165
166 /* Special 'registers' for DREX handling */
167 #define DREX_REG_UNKNOWN 1000 /* not initialized */
168 #define DREX_REG_MEMORY 1001 /* use MODRM/SIB/OFFSET memory */
169
170 /* The DREX byte has the following fields:
171 Bits 7-4 -- DREX.Dest, xmm destination register
172 Bit 3 -- DREX.OC0, operand config bit defines operand order
173 Bit 2 -- DREX.R, equivalent to REX_R bit, to extend ModRM register
174 Bit 1 -- DREX.X, equivalent to REX_X bit, to extend SIB index field
175 Bit 0 -- DREX.W, equivalent to REX_B bit, to extend ModRM r/m field,
176 SIB base field, or opcode reg field. */
177 #define DREX_XMM(drex) ((drex >> 4) & 0xf)
178 #define DREX_OC0(drex) ((drex >> 3) & 0x1)
179
180 /* Flags for prefixes which we somehow handled when printing the
181 current instruction. */
182 static int used_prefixes;
183
184 /* Flags stored in PREFIXES. */
185 #define PREFIX_REPZ 1
186 #define PREFIX_REPNZ 2
187 #define PREFIX_LOCK 4
188 #define PREFIX_CS 8
189 #define PREFIX_SS 0x10
190 #define PREFIX_DS 0x20
191 #define PREFIX_ES 0x40
192 #define PREFIX_FS 0x80
193 #define PREFIX_GS 0x100
194 #define PREFIX_DATA 0x200
195 #define PREFIX_ADDR 0x400
196 #define PREFIX_FWAIT 0x800
197
198 /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
199 to ADDR (exclusive) are valid. Returns 1 for success, longjmps
200 on error. */
201 #define FETCH_DATA(info, addr) \
202 ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \
203 ? 1 : fetch_data ((info), (addr)))
204
205 static int
206 fetch_data (struct disassemble_info *info, bfd_byte *addr)
207 {
208 int status;
209 struct dis_private *priv = (struct dis_private *) info->private_data;
210 bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer);
211
212 if (addr <= priv->the_buffer + MAX_MNEM_SIZE)
213 status = (*info->read_memory_func) (start,
214 priv->max_fetched,
215 addr - priv->max_fetched,
216 info);
217 else
218 status = -1;
219 if (status != 0)
220 {
221 /* If we did manage to read at least one byte, then
222 print_insn_i386 will do something sensible. Otherwise, print
223 an error. We do that here because this is where we know
224 STATUS. */
225 if (priv->max_fetched == priv->the_buffer)
226 (*info->memory_error_func) (status, start, info);
227 longjmp (priv->bailout, 1);
228 }
229 else
230 priv->max_fetched = addr;
231 return 1;
232 }
233
234 #define XX { NULL, 0 }
235
236 #define Eb { OP_E, b_mode }
237 #define EbS { OP_E, b_swap_mode }
238 #define Ev { OP_E, v_mode }
239 #define EvS { OP_E, v_swap_mode }
240 #define Ed { OP_E, d_mode }
241 #define Edq { OP_E, dq_mode }
242 #define Edqw { OP_E, dqw_mode }
243 #define Edqb { OP_E, dqb_mode }
244 #define Edqd { OP_E, dqd_mode }
245 #define Eq { OP_E, q_mode }
246 #define indirEv { OP_indirE, stack_v_mode }
247 #define indirEp { OP_indirE, f_mode }
248 #define stackEv { OP_E, stack_v_mode }
249 #define Em { OP_E, m_mode }
250 #define Ew { OP_E, w_mode }
251 #define M { OP_M, 0 } /* lea, lgdt, etc. */
252 #define Ma { OP_M, a_mode }
253 #define Mb { OP_M, b_mode }
254 #define Md { OP_M, d_mode }
255 #define Mo { OP_M, o_mode }
256 #define Mp { OP_M, f_mode } /* 32 or 48 bit memory operand for LDS, LES etc */
257 #define Mq { OP_M, q_mode }
258 #define Mx { OP_M, x_mode }
259 #define Mxmm { OP_M, xmm_mode }
260 #define Gb { OP_G, b_mode }
261 #define Gv { OP_G, v_mode }
262 #define Gd { OP_G, d_mode }
263 #define Gdq { OP_G, dq_mode }
264 #define Gm { OP_G, m_mode }
265 #define Gw { OP_G, w_mode }
266 #define Rd { OP_R, d_mode }
267 #define Rm { OP_R, m_mode }
268 #define Ib { OP_I, b_mode }
269 #define sIb { OP_sI, b_mode } /* sign extened byte */
270 #define Iv { OP_I, v_mode }
271 #define Iq { OP_I, q_mode }
272 #define Iv64 { OP_I64, v_mode }
273 #define Iw { OP_I, w_mode }
274 #define I1 { OP_I, const_1_mode }
275 #define Jb { OP_J, b_mode }
276 #define Jv { OP_J, v_mode }
277 #define Cm { OP_C, m_mode }
278 #define Dm { OP_D, m_mode }
279 #define Td { OP_T, d_mode }
280 #define Skip_MODRM { OP_Skip_MODRM, 0 }
281
282 #define RMeAX { OP_REG, eAX_reg }
283 #define RMeBX { OP_REG, eBX_reg }
284 #define RMeCX { OP_REG, eCX_reg }
285 #define RMeDX { OP_REG, eDX_reg }
286 #define RMeSP { OP_REG, eSP_reg }
287 #define RMeBP { OP_REG, eBP_reg }
288 #define RMeSI { OP_REG, eSI_reg }
289 #define RMeDI { OP_REG, eDI_reg }
290 #define RMrAX { OP_REG, rAX_reg }
291 #define RMrBX { OP_REG, rBX_reg }
292 #define RMrCX { OP_REG, rCX_reg }
293 #define RMrDX { OP_REG, rDX_reg }
294 #define RMrSP { OP_REG, rSP_reg }
295 #define RMrBP { OP_REG, rBP_reg }
296 #define RMrSI { OP_REG, rSI_reg }
297 #define RMrDI { OP_REG, rDI_reg }
298 #define RMAL { OP_REG, al_reg }
299 #define RMAL { OP_REG, al_reg }
300 #define RMCL { OP_REG, cl_reg }
301 #define RMDL { OP_REG, dl_reg }
302 #define RMBL { OP_REG, bl_reg }
303 #define RMAH { OP_REG, ah_reg }
304 #define RMCH { OP_REG, ch_reg }
305 #define RMDH { OP_REG, dh_reg }
306 #define RMBH { OP_REG, bh_reg }
307 #define RMAX { OP_REG, ax_reg }
308 #define RMDX { OP_REG, dx_reg }
309
310 #define eAX { OP_IMREG, eAX_reg }
311 #define eBX { OP_IMREG, eBX_reg }
312 #define eCX { OP_IMREG, eCX_reg }
313 #define eDX { OP_IMREG, eDX_reg }
314 #define eSP { OP_IMREG, eSP_reg }
315 #define eBP { OP_IMREG, eBP_reg }
316 #define eSI { OP_IMREG, eSI_reg }
317 #define eDI { OP_IMREG, eDI_reg }
318 #define AL { OP_IMREG, al_reg }
319 #define CL { OP_IMREG, cl_reg }
320 #define DL { OP_IMREG, dl_reg }
321 #define BL { OP_IMREG, bl_reg }
322 #define AH { OP_IMREG, ah_reg }
323 #define CH { OP_IMREG, ch_reg }
324 #define DH { OP_IMREG, dh_reg }
325 #define BH { OP_IMREG, bh_reg }
326 #define AX { OP_IMREG, ax_reg }
327 #define DX { OP_IMREG, dx_reg }
328 #define zAX { OP_IMREG, z_mode_ax_reg }
329 #define indirDX { OP_IMREG, indir_dx_reg }
330
331 #define Sw { OP_SEG, w_mode }
332 #define Sv { OP_SEG, v_mode }
333 #define Ap { OP_DIR, 0 }
334 #define Ob { OP_OFF64, b_mode }
335 #define Ov { OP_OFF64, v_mode }
336 #define Xb { OP_DSreg, eSI_reg }
337 #define Xv { OP_DSreg, eSI_reg }
338 #define Xz { OP_DSreg, eSI_reg }
339 #define Yb { OP_ESreg, eDI_reg }
340 #define Yv { OP_ESreg, eDI_reg }
341 #define DSBX { OP_DSreg, eBX_reg }
342
343 #define es { OP_REG, es_reg }
344 #define ss { OP_REG, ss_reg }
345 #define cs { OP_REG, cs_reg }
346 #define ds { OP_REG, ds_reg }
347 #define fs { OP_REG, fs_reg }
348 #define gs { OP_REG, gs_reg }
349
350 #define MX { OP_MMX, 0 }
351 #define XM { OP_XMM, 0 }
352 #define XMM { OP_XMM, xmm_mode }
353 #define EM { OP_EM, v_mode }
354 #define EMS { OP_EM, v_swap_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 EXdS { OP_EX, d_swap_mode }
360 #define EXq { OP_EX, q_mode }
361 #define EXqS { OP_EX, q_swap_mode }
362 #define EXx { OP_EX, x_mode }
363 #define EXxS { OP_EX, x_swap_mode }
364 #define EXxmm { OP_EX, xmm_mode }
365 #define EXxmmq { OP_EX, xmmq_mode }
366 #define EXymmq { OP_EX, ymmq_mode }
367 #define EXVexWdq { OP_EX, vex_w_dq_mode }
368 #define MS { OP_MS, v_mode }
369 #define XS { OP_XS, v_mode }
370 #define EMCq { OP_EMC, q_mode }
371 #define MXC { OP_MXC, 0 }
372 #define OPSUF { OP_3DNowSuffix, 0 }
373 #define CMP { CMP_Fixup, 0 }
374 #define XMM0 { XMM_Fixup, 0 }
375
376 #define Vex { OP_VEX, vex_mode }
377 #define Vex128 { OP_VEX, vex128_mode }
378 #define Vex256 { OP_VEX, vex256_mode }
379 #define EXdVex { OP_EX_Vex, d_mode }
380 #define EXdVexS { OP_EX_Vex, d_swap_mode }
381 #define EXqVex { OP_EX_Vex, q_mode }
382 #define EXqVexS { OP_EX_Vex, q_swap_mode }
383 #define XMVex { OP_XMM_Vex, 0 }
384 #define XMVexI4 { OP_REG_VexI4, x_mode }
385 #define PCLMUL { PCLMUL_Fixup, 0 }
386 #define VZERO { VZERO_Fixup, 0 }
387 #define VCMP { VCMP_Fixup, 0 }
388
389 /* Used handle "rep" prefix for string instructions. */
390 #define Xbr { REP_Fixup, eSI_reg }
391 #define Xvr { REP_Fixup, eSI_reg }
392 #define Ybr { REP_Fixup, eDI_reg }
393 #define Yvr { REP_Fixup, eDI_reg }
394 #define Yzr { REP_Fixup, eDI_reg }
395 #define indirDXr { REP_Fixup, indir_dx_reg }
396 #define ALr { REP_Fixup, al_reg }
397 #define eAXr { REP_Fixup, eAX_reg }
398
399 #define cond_jump_flag { NULL, cond_jump_mode }
400 #define loop_jcxz_flag { NULL, loop_jcxz_mode }
401
402 /* bits in sizeflag */
403 #define SUFFIX_ALWAYS 4
404 #define AFLAG 2
405 #define DFLAG 1
406
407 /* byte operand */
408 #define b_mode 1
409 /* byte operand with operand swapped */
410 #define b_swap_mode (b_mode + 1)
411 /* operand size depends on prefixes */
412 #define v_mode (b_swap_mode + 1)
413 /* operand size depends on prefixes with operand swapped */
414 #define v_swap_mode (v_mode + 1)
415 /* word operand */
416 #define w_mode (v_swap_mode + 1)
417 /* double word operand */
418 #define d_mode (w_mode + 1)
419 /* double word operand with operand swapped */
420 #define d_swap_mode (d_mode + 1)
421 /* quad word operand */
422 #define q_mode (d_swap_mode + 1)
423 /* quad word operand with operand swapped */
424 #define q_swap_mode (q_mode + 1)
425 /* ten-byte operand */
426 #define t_mode (q_swap_mode + 1)
427 /* 16-byte XMM or 32-byte YMM operand */
428 #define x_mode (t_mode + 1)
429 /* 16-byte XMM or 32-byte YMM operand with operand swapped */
430 #define x_swap_mode (x_mode + 1)
431 /* 16-byte XMM operand */
432 #define xmm_mode (x_swap_mode + 1)
433 /* 16-byte XMM or quad word operand */
434 #define xmmq_mode (xmm_mode + 1)
435 /* 32-byte YMM or quad word operand */
436 #define ymmq_mode (xmmq_mode + 1)
437 /* d_mode in 32bit, q_mode in 64bit mode. */
438 #define m_mode (ymmq_mode + 1)
439 /* pair of v_mode operands */
440 #define a_mode (m_mode + 1)
441 #define cond_jump_mode (a_mode + 1)
442 #define loop_jcxz_mode (cond_jump_mode + 1)
443 /* operand size depends on REX prefixes. */
444 #define dq_mode (loop_jcxz_mode + 1)
445 /* registers like dq_mode, memory like w_mode. */
446 #define dqw_mode (dq_mode + 1)
447 /* 4- or 6-byte pointer operand */
448 #define f_mode (dqw_mode + 1)
449 #define const_1_mode (f_mode + 1)
450 /* v_mode for stack-related opcodes. */
451 #define stack_v_mode (const_1_mode + 1)
452 /* non-quad operand size depends on prefixes */
453 #define z_mode (stack_v_mode + 1)
454 /* 16-byte operand */
455 #define o_mode (z_mode + 1)
456 /* registers like dq_mode, memory like b_mode. */
457 #define dqb_mode (o_mode + 1)
458 /* registers like dq_mode, memory like d_mode. */
459 #define dqd_mode (dqb_mode + 1)
460 /* normal vex mode */
461 #define vex_mode (dqd_mode + 1)
462 /* 128bit vex mode */
463 #define vex128_mode (vex_mode + 1)
464 /* 256bit vex mode */
465 #define vex256_mode (vex128_mode + 1)
466 /* operand size depends on the VEX.W bit. */
467 #define vex_w_dq_mode (vex256_mode + 1)
468
469 #define es_reg (vex_w_dq_mode + 1)
470 #define cs_reg (es_reg + 1)
471 #define ss_reg (cs_reg + 1)
472 #define ds_reg (ss_reg + 1)
473 #define fs_reg (ds_reg + 1)
474 #define gs_reg (fs_reg + 1)
475
476 #define eAX_reg (gs_reg + 1)
477 #define eCX_reg (eAX_reg + 1)
478 #define eDX_reg (eCX_reg + 1)
479 #define eBX_reg (eDX_reg + 1)
480 #define eSP_reg (eBX_reg + 1)
481 #define eBP_reg (eSP_reg + 1)
482 #define eSI_reg (eBP_reg + 1)
483 #define eDI_reg (eSI_reg + 1)
484
485 #define al_reg (eDI_reg + 1)
486 #define cl_reg (al_reg + 1)
487 #define dl_reg (cl_reg + 1)
488 #define bl_reg (dl_reg + 1)
489 #define ah_reg (bl_reg + 1)
490 #define ch_reg (ah_reg + 1)
491 #define dh_reg (ch_reg + 1)
492 #define bh_reg (dh_reg + 1)
493
494 #define ax_reg (bh_reg + 1)
495 #define cx_reg (ax_reg + 1)
496 #define dx_reg (cx_reg + 1)
497 #define bx_reg (dx_reg + 1)
498 #define sp_reg (bx_reg + 1)
499 #define bp_reg (sp_reg + 1)
500 #define si_reg (bp_reg + 1)
501 #define di_reg (si_reg + 1)
502
503 #define rAX_reg (di_reg + 1)
504 #define rCX_reg (rAX_reg + 1)
505 #define rDX_reg (rCX_reg + 1)
506 #define rBX_reg (rDX_reg + 1)
507 #define rSP_reg (rBX_reg + 1)
508 #define rBP_reg (rSP_reg + 1)
509 #define rSI_reg (rBP_reg + 1)
510 #define rDI_reg (rSI_reg + 1)
511
512 #define z_mode_ax_reg (rDI_reg + 1)
513 #define indir_dx_reg (z_mode_ax_reg + 1)
514
515 #define MAX_BYTEMODE indir_dx_reg
516
517 /* Flags that are OR'ed into the bytemode field to pass extra
518 information. */
519 #define DREX_OC1 0x10000 /* OC1 bit set */
520 #define DREX_NO_OC0 0x20000 /* OC0 bit not used */
521 #define DREX_MASK 0x40000 /* mask to delete */
522
523 #if MAX_BYTEMODE >= DREX_OC1
524 #error MAX_BYTEMODE must be less than DREX_OC1
525 #endif
526
527 #define FLOATCODE 1
528 #define USE_REG_TABLE (FLOATCODE + 1)
529 #define USE_MOD_TABLE (USE_REG_TABLE + 1)
530 #define USE_RM_TABLE (USE_MOD_TABLE + 1)
531 #define USE_PREFIX_TABLE (USE_RM_TABLE + 1)
532 #define USE_X86_64_TABLE (USE_PREFIX_TABLE + 1)
533 #define USE_3BYTE_TABLE (USE_X86_64_TABLE + 1)
534 #define USE_VEX_C4_TABLE (USE_3BYTE_TABLE + 1)
535 #define USE_VEX_C5_TABLE (USE_VEX_C4_TABLE + 1)
536 #define USE_VEX_LEN_TABLE (USE_VEX_C5_TABLE + 1)
537
538 #define FLOAT NULL, { { NULL, FLOATCODE } }
539
540 #define DIS386(T, I) NULL, { { NULL, (T)}, { NULL, (I) } }
541 #define REG_TABLE(I) DIS386 (USE_REG_TABLE, (I))
542 #define MOD_TABLE(I) DIS386 (USE_MOD_TABLE, (I))
543 #define RM_TABLE(I) DIS386 (USE_RM_TABLE, (I))
544 #define PREFIX_TABLE(I) DIS386 (USE_PREFIX_TABLE, (I))
545 #define X86_64_TABLE(I) DIS386 (USE_X86_64_TABLE, (I))
546 #define THREE_BYTE_TABLE(I) DIS386 (USE_3BYTE_TABLE, (I))
547 #define VEX_C4_TABLE(I) DIS386 (USE_VEX_C4_TABLE, (I))
548 #define VEX_C5_TABLE(I) DIS386 (USE_VEX_C5_TABLE, (I))
549 #define VEX_LEN_TABLE(I) DIS386 (USE_VEX_LEN_TABLE, (I))
550
551 #define REG_80 0
552 #define REG_81 (REG_80 + 1)
553 #define REG_82 (REG_81 + 1)
554 #define REG_8F (REG_82 + 1)
555 #define REG_C0 (REG_8F + 1)
556 #define REG_C1 (REG_C0 + 1)
557 #define REG_C6 (REG_C1 + 1)
558 #define REG_C7 (REG_C6 + 1)
559 #define REG_D0 (REG_C7 + 1)
560 #define REG_D1 (REG_D0 + 1)
561 #define REG_D2 (REG_D1 + 1)
562 #define REG_D3 (REG_D2 + 1)
563 #define REG_F6 (REG_D3 + 1)
564 #define REG_F7 (REG_F6 + 1)
565 #define REG_FE (REG_F7 + 1)
566 #define REG_FF (REG_FE + 1)
567 #define REG_0F00 (REG_FF + 1)
568 #define REG_0F01 (REG_0F00 + 1)
569 #define REG_0F0D (REG_0F01 + 1)
570 #define REG_0F18 (REG_0F0D + 1)
571 #define REG_0F71 (REG_0F18 + 1)
572 #define REG_0F72 (REG_0F71 + 1)
573 #define REG_0F73 (REG_0F72 + 1)
574 #define REG_0FA6 (REG_0F73 + 1)
575 #define REG_0FA7 (REG_0FA6 + 1)
576 #define REG_0FAE (REG_0FA7 + 1)
577 #define REG_0FBA (REG_0FAE + 1)
578 #define REG_0FC7 (REG_0FBA + 1)
579 #define REG_VEX_71 (REG_0FC7 + 1)
580 #define REG_VEX_72 (REG_VEX_71 + 1)
581 #define REG_VEX_73 (REG_VEX_72 + 1)
582 #define REG_VEX_AE (REG_VEX_73 + 1)
583
584 #define MOD_8D 0
585 #define MOD_0F01_REG_0 (MOD_8D + 1)
586 #define MOD_0F01_REG_1 (MOD_0F01_REG_0 + 1)
587 #define MOD_0F01_REG_2 (MOD_0F01_REG_1 + 1)
588 #define MOD_0F01_REG_3 (MOD_0F01_REG_2 + 1)
589 #define MOD_0F01_REG_7 (MOD_0F01_REG_3 + 1)
590 #define MOD_0F12_PREFIX_0 (MOD_0F01_REG_7 + 1)
591 #define MOD_0F13 (MOD_0F12_PREFIX_0 + 1)
592 #define MOD_0F16_PREFIX_0 (MOD_0F13 + 1)
593 #define MOD_0F17 (MOD_0F16_PREFIX_0 + 1)
594 #define MOD_0F18_REG_0 (MOD_0F17 + 1)
595 #define MOD_0F18_REG_1 (MOD_0F18_REG_0 + 1)
596 #define MOD_0F18_REG_2 (MOD_0F18_REG_1 + 1)
597 #define MOD_0F18_REG_3 (MOD_0F18_REG_2 + 1)
598 #define MOD_0F20 (MOD_0F18_REG_3 + 1)
599 #define MOD_0F21 (MOD_0F20 + 1)
600 #define MOD_0F22 (MOD_0F21 + 1)
601 #define MOD_0F23 (MOD_0F22 + 1)
602 #define MOD_0F24 (MOD_0F23 + 1)
603 #define MOD_0F26 (MOD_0F24 + 1)
604 #define MOD_0F2B_PREFIX_0 (MOD_0F26 + 1)
605 #define MOD_0F2B_PREFIX_1 (MOD_0F2B_PREFIX_0 + 1)
606 #define MOD_0F2B_PREFIX_2 (MOD_0F2B_PREFIX_1 + 1)
607 #define MOD_0F2B_PREFIX_3 (MOD_0F2B_PREFIX_2 + 1)
608 #define MOD_0F51 (MOD_0F2B_PREFIX_3 + 1)
609 #define MOD_0F71_REG_2 (MOD_0F51 + 1)
610 #define MOD_0F71_REG_4 (MOD_0F71_REG_2 + 1)
611 #define MOD_0F71_REG_6 (MOD_0F71_REG_4 + 1)
612 #define MOD_0F72_REG_2 (MOD_0F71_REG_6 + 1)
613 #define MOD_0F72_REG_4 (MOD_0F72_REG_2 + 1)
614 #define MOD_0F72_REG_6 (MOD_0F72_REG_4 + 1)
615 #define MOD_0F73_REG_2 (MOD_0F72_REG_6 + 1)
616 #define MOD_0F73_REG_3 (MOD_0F73_REG_2 + 1)
617 #define MOD_0F73_REG_6 (MOD_0F73_REG_3 + 1)
618 #define MOD_0F73_REG_7 (MOD_0F73_REG_6 + 1)
619 #define MOD_0FAE_REG_0 (MOD_0F73_REG_7 + 1)
620 #define MOD_0FAE_REG_1 (MOD_0FAE_REG_0 + 1)
621 #define MOD_0FAE_REG_2 (MOD_0FAE_REG_1 + 1)
622 #define MOD_0FAE_REG_3 (MOD_0FAE_REG_2 + 1)
623 #define MOD_0FAE_REG_4 (MOD_0FAE_REG_3 + 1)
624 #define MOD_0FAE_REG_5 (MOD_0FAE_REG_4 + 1)
625 #define MOD_0FAE_REG_6 (MOD_0FAE_REG_5 + 1)
626 #define MOD_0FAE_REG_7 (MOD_0FAE_REG_6 + 1)
627 #define MOD_0FB2 (MOD_0FAE_REG_7 + 1)
628 #define MOD_0FB4 (MOD_0FB2 + 1)
629 #define MOD_0FB5 (MOD_0FB4 + 1)
630 #define MOD_0FC7_REG_6 (MOD_0FB5 + 1)
631 #define MOD_0FC7_REG_7 (MOD_0FC7_REG_6 + 1)
632 #define MOD_0FD7 (MOD_0FC7_REG_7 + 1)
633 #define MOD_0FE7_PREFIX_2 (MOD_0FD7 + 1)
634 #define MOD_0FF0_PREFIX_3 (MOD_0FE7_PREFIX_2 + 1)
635 #define MOD_0F382A_PREFIX_2 (MOD_0FF0_PREFIX_3 + 1)
636 #define MOD_62_32BIT (MOD_0F382A_PREFIX_2 + 1)
637 #define MOD_C4_32BIT (MOD_62_32BIT + 1)
638 #define MOD_C5_32BIT (MOD_C4_32BIT + 1)
639 #define MOD_VEX_12_PREFIX_0 (MOD_C5_32BIT + 1)
640 #define MOD_VEX_13 (MOD_VEX_12_PREFIX_0 + 1)
641 #define MOD_VEX_16_PREFIX_0 (MOD_VEX_13 + 1)
642 #define MOD_VEX_17 (MOD_VEX_16_PREFIX_0 + 1)
643 #define MOD_VEX_2B (MOD_VEX_17 + 1)
644 #define MOD_VEX_51 (MOD_VEX_2B + 1)
645 #define MOD_VEX_71_REG_2 (MOD_VEX_51 + 1)
646 #define MOD_VEX_71_REG_4 (MOD_VEX_71_REG_2 + 1)
647 #define MOD_VEX_71_REG_6 (MOD_VEX_71_REG_4 + 1)
648 #define MOD_VEX_72_REG_2 (MOD_VEX_71_REG_6 + 1)
649 #define MOD_VEX_72_REG_4 (MOD_VEX_72_REG_2 + 1)
650 #define MOD_VEX_72_REG_6 (MOD_VEX_72_REG_4 + 1)
651 #define MOD_VEX_73_REG_2 (MOD_VEX_72_REG_6 + 1)
652 #define MOD_VEX_73_REG_3 (MOD_VEX_73_REG_2 + 1)
653 #define MOD_VEX_73_REG_6 (MOD_VEX_73_REG_3 + 1)
654 #define MOD_VEX_73_REG_7 (MOD_VEX_73_REG_6 + 1)
655 #define MOD_VEX_AE_REG_2 (MOD_VEX_73_REG_7 + 1)
656 #define MOD_VEX_AE_REG_3 (MOD_VEX_AE_REG_2 + 1)
657 #define MOD_VEX_D7_PREFIX_2 (MOD_VEX_AE_REG_3 + 1)
658 #define MOD_VEX_E7_PREFIX_2 (MOD_VEX_D7_PREFIX_2 + 1)
659 #define MOD_VEX_F0_PREFIX_3 (MOD_VEX_E7_PREFIX_2 + 1)
660 #define MOD_VEX_3818_PREFIX_2 (MOD_VEX_F0_PREFIX_3 + 1)
661 #define MOD_VEX_3819_PREFIX_2 (MOD_VEX_3818_PREFIX_2 + 1)
662 #define MOD_VEX_381A_PREFIX_2 (MOD_VEX_3819_PREFIX_2 + 1)
663 #define MOD_VEX_382A_PREFIX_2 (MOD_VEX_381A_PREFIX_2 + 1)
664 #define MOD_VEX_382C_PREFIX_2 (MOD_VEX_382A_PREFIX_2 + 1)
665 #define MOD_VEX_382D_PREFIX_2 (MOD_VEX_382C_PREFIX_2 + 1)
666 #define MOD_VEX_382E_PREFIX_2 (MOD_VEX_382D_PREFIX_2 + 1)
667 #define MOD_VEX_382F_PREFIX_2 (MOD_VEX_382E_PREFIX_2 + 1)
668
669 #define RM_0F01_REG_0 0
670 #define RM_0F01_REG_1 (RM_0F01_REG_0 + 1)
671 #define RM_0F01_REG_2 (RM_0F01_REG_1 + 1)
672 #define RM_0F01_REG_3 (RM_0F01_REG_2 + 1)
673 #define RM_0F01_REG_7 (RM_0F01_REG_3 + 1)
674 #define RM_0FAE_REG_5 (RM_0F01_REG_7 + 1)
675 #define RM_0FAE_REG_6 (RM_0FAE_REG_5 + 1)
676 #define RM_0FAE_REG_7 (RM_0FAE_REG_6 + 1)
677
678 #define PREFIX_90 0
679 #define PREFIX_0F10 (PREFIX_90 + 1)
680 #define PREFIX_0F11 (PREFIX_0F10 + 1)
681 #define PREFIX_0F12 (PREFIX_0F11 + 1)
682 #define PREFIX_0F16 (PREFIX_0F12 + 1)
683 #define PREFIX_0F2A (PREFIX_0F16 + 1)
684 #define PREFIX_0F2B (PREFIX_0F2A + 1)
685 #define PREFIX_0F2C (PREFIX_0F2B + 1)
686 #define PREFIX_0F2D (PREFIX_0F2C + 1)
687 #define PREFIX_0F2E (PREFIX_0F2D + 1)
688 #define PREFIX_0F2F (PREFIX_0F2E + 1)
689 #define PREFIX_0F51 (PREFIX_0F2F + 1)
690 #define PREFIX_0F52 (PREFIX_0F51 + 1)
691 #define PREFIX_0F53 (PREFIX_0F52 + 1)
692 #define PREFIX_0F58 (PREFIX_0F53 + 1)
693 #define PREFIX_0F59 (PREFIX_0F58 + 1)
694 #define PREFIX_0F5A (PREFIX_0F59 + 1)
695 #define PREFIX_0F5B (PREFIX_0F5A + 1)
696 #define PREFIX_0F5C (PREFIX_0F5B + 1)
697 #define PREFIX_0F5D (PREFIX_0F5C + 1)
698 #define PREFIX_0F5E (PREFIX_0F5D + 1)
699 #define PREFIX_0F5F (PREFIX_0F5E + 1)
700 #define PREFIX_0F60 (PREFIX_0F5F + 1)
701 #define PREFIX_0F61 (PREFIX_0F60 + 1)
702 #define PREFIX_0F62 (PREFIX_0F61 + 1)
703 #define PREFIX_0F6C (PREFIX_0F62 + 1)
704 #define PREFIX_0F6D (PREFIX_0F6C + 1)
705 #define PREFIX_0F6F (PREFIX_0F6D + 1)
706 #define PREFIX_0F70 (PREFIX_0F6F + 1)
707 #define PREFIX_0F73_REG_3 (PREFIX_0F70 + 1)
708 #define PREFIX_0F73_REG_7 (PREFIX_0F73_REG_3 + 1)
709 #define PREFIX_0F78 (PREFIX_0F73_REG_7 + 1)
710 #define PREFIX_0F79 (PREFIX_0F78 + 1)
711 #define PREFIX_0F7C (PREFIX_0F79 + 1)
712 #define PREFIX_0F7D (PREFIX_0F7C + 1)
713 #define PREFIX_0F7E (PREFIX_0F7D + 1)
714 #define PREFIX_0F7F (PREFIX_0F7E + 1)
715 #define PREFIX_0FB8 (PREFIX_0F7F + 1)
716 #define PREFIX_0FBD (PREFIX_0FB8 + 1)
717 #define PREFIX_0FC2 (PREFIX_0FBD + 1)
718 #define PREFIX_0FC3 (PREFIX_0FC2 + 1)
719 #define PREFIX_0FC7_REG_6 (PREFIX_0FC3 + 1)
720 #define PREFIX_0FD0 (PREFIX_0FC7_REG_6 + 1)
721 #define PREFIX_0FD6 (PREFIX_0FD0 + 1)
722 #define PREFIX_0FE6 (PREFIX_0FD6 + 1)
723 #define PREFIX_0FE7 (PREFIX_0FE6 + 1)
724 #define PREFIX_0FF0 (PREFIX_0FE7 + 1)
725 #define PREFIX_0FF7 (PREFIX_0FF0 + 1)
726 #define PREFIX_0F3810 (PREFIX_0FF7 + 1)
727 #define PREFIX_0F3814 (PREFIX_0F3810 + 1)
728 #define PREFIX_0F3815 (PREFIX_0F3814 + 1)
729 #define PREFIX_0F3817 (PREFIX_0F3815 + 1)
730 #define PREFIX_0F3820 (PREFIX_0F3817 + 1)
731 #define PREFIX_0F3821 (PREFIX_0F3820 + 1)
732 #define PREFIX_0F3822 (PREFIX_0F3821 + 1)
733 #define PREFIX_0F3823 (PREFIX_0F3822 + 1)
734 #define PREFIX_0F3824 (PREFIX_0F3823 + 1)
735 #define PREFIX_0F3825 (PREFIX_0F3824 + 1)
736 #define PREFIX_0F3828 (PREFIX_0F3825 + 1)
737 #define PREFIX_0F3829 (PREFIX_0F3828 + 1)
738 #define PREFIX_0F382A (PREFIX_0F3829 + 1)
739 #define PREFIX_0F382B (PREFIX_0F382A + 1)
740 #define PREFIX_0F3830 (PREFIX_0F382B + 1)
741 #define PREFIX_0F3831 (PREFIX_0F3830 + 1)
742 #define PREFIX_0F3832 (PREFIX_0F3831 + 1)
743 #define PREFIX_0F3833 (PREFIX_0F3832 + 1)
744 #define PREFIX_0F3834 (PREFIX_0F3833 + 1)
745 #define PREFIX_0F3835 (PREFIX_0F3834 + 1)
746 #define PREFIX_0F3837 (PREFIX_0F3835 + 1)
747 #define PREFIX_0F3838 (PREFIX_0F3837 + 1)
748 #define PREFIX_0F3839 (PREFIX_0F3838 + 1)
749 #define PREFIX_0F383A (PREFIX_0F3839 + 1)
750 #define PREFIX_0F383B (PREFIX_0F383A + 1)
751 #define PREFIX_0F383C (PREFIX_0F383B + 1)
752 #define PREFIX_0F383D (PREFIX_0F383C + 1)
753 #define PREFIX_0F383E (PREFIX_0F383D + 1)
754 #define PREFIX_0F383F (PREFIX_0F383E + 1)
755 #define PREFIX_0F3840 (PREFIX_0F383F + 1)
756 #define PREFIX_0F3841 (PREFIX_0F3840 + 1)
757 #define PREFIX_0F3880 (PREFIX_0F3841 + 1)
758 #define PREFIX_0F3881 (PREFIX_0F3880 + 1)
759 #define PREFIX_0F38DB (PREFIX_0F3881 + 1)
760 #define PREFIX_0F38DC (PREFIX_0F38DB + 1)
761 #define PREFIX_0F38DD (PREFIX_0F38DC + 1)
762 #define PREFIX_0F38DE (PREFIX_0F38DD + 1)
763 #define PREFIX_0F38DF (PREFIX_0F38DE + 1)
764 #define PREFIX_0F38F0 (PREFIX_0F38DF + 1)
765 #define PREFIX_0F38F1 (PREFIX_0F38F0 + 1)
766 #define PREFIX_0F3A08 (PREFIX_0F38F1 + 1)
767 #define PREFIX_0F3A09 (PREFIX_0F3A08 + 1)
768 #define PREFIX_0F3A0A (PREFIX_0F3A09 + 1)
769 #define PREFIX_0F3A0B (PREFIX_0F3A0A + 1)
770 #define PREFIX_0F3A0C (PREFIX_0F3A0B + 1)
771 #define PREFIX_0F3A0D (PREFIX_0F3A0C + 1)
772 #define PREFIX_0F3A0E (PREFIX_0F3A0D + 1)
773 #define PREFIX_0F3A14 (PREFIX_0F3A0E + 1)
774 #define PREFIX_0F3A15 (PREFIX_0F3A14 + 1)
775 #define PREFIX_0F3A16 (PREFIX_0F3A15 + 1)
776 #define PREFIX_0F3A17 (PREFIX_0F3A16 + 1)
777 #define PREFIX_0F3A20 (PREFIX_0F3A17 + 1)
778 #define PREFIX_0F3A21 (PREFIX_0F3A20 + 1)
779 #define PREFIX_0F3A22 (PREFIX_0F3A21 + 1)
780 #define PREFIX_0F3A40 (PREFIX_0F3A22 + 1)
781 #define PREFIX_0F3A41 (PREFIX_0F3A40 + 1)
782 #define PREFIX_0F3A42 (PREFIX_0F3A41 + 1)
783 #define PREFIX_0F3A44 (PREFIX_0F3A42 + 1)
784 #define PREFIX_0F3A60 (PREFIX_0F3A44 + 1)
785 #define PREFIX_0F3A61 (PREFIX_0F3A60 + 1)
786 #define PREFIX_0F3A62 (PREFIX_0F3A61 + 1)
787 #define PREFIX_0F3A63 (PREFIX_0F3A62 + 1)
788 #define PREFIX_0F3ADF (PREFIX_0F3A63 + 1)
789 #define PREFIX_VEX_10 (PREFIX_0F3ADF + 1)
790 #define PREFIX_VEX_11 (PREFIX_VEX_10 + 1)
791 #define PREFIX_VEX_12 (PREFIX_VEX_11 + 1)
792 #define PREFIX_VEX_16 (PREFIX_VEX_12 + 1)
793 #define PREFIX_VEX_2A (PREFIX_VEX_16 + 1)
794 #define PREFIX_VEX_2C (PREFIX_VEX_2A + 1)
795 #define PREFIX_VEX_2D (PREFIX_VEX_2C + 1)
796 #define PREFIX_VEX_2E (PREFIX_VEX_2D + 1)
797 #define PREFIX_VEX_2F (PREFIX_VEX_2E + 1)
798 #define PREFIX_VEX_51 (PREFIX_VEX_2F + 1)
799 #define PREFIX_VEX_52 (PREFIX_VEX_51 + 1)
800 #define PREFIX_VEX_53 (PREFIX_VEX_52 + 1)
801 #define PREFIX_VEX_58 (PREFIX_VEX_53 + 1)
802 #define PREFIX_VEX_59 (PREFIX_VEX_58 + 1)
803 #define PREFIX_VEX_5A (PREFIX_VEX_59 + 1)
804 #define PREFIX_VEX_5B (PREFIX_VEX_5A + 1)
805 #define PREFIX_VEX_5C (PREFIX_VEX_5B + 1)
806 #define PREFIX_VEX_5D (PREFIX_VEX_5C + 1)
807 #define PREFIX_VEX_5E (PREFIX_VEX_5D + 1)
808 #define PREFIX_VEX_5F (PREFIX_VEX_5E + 1)
809 #define PREFIX_VEX_60 (PREFIX_VEX_5F + 1)
810 #define PREFIX_VEX_61 (PREFIX_VEX_60 + 1)
811 #define PREFIX_VEX_62 (PREFIX_VEX_61 + 1)
812 #define PREFIX_VEX_63 (PREFIX_VEX_62 + 1)
813 #define PREFIX_VEX_64 (PREFIX_VEX_63 + 1)
814 #define PREFIX_VEX_65 (PREFIX_VEX_64 + 1)
815 #define PREFIX_VEX_66 (PREFIX_VEX_65 + 1)
816 #define PREFIX_VEX_67 (PREFIX_VEX_66 + 1)
817 #define PREFIX_VEX_68 (PREFIX_VEX_67 + 1)
818 #define PREFIX_VEX_69 (PREFIX_VEX_68 + 1)
819 #define PREFIX_VEX_6A (PREFIX_VEX_69 + 1)
820 #define PREFIX_VEX_6B (PREFIX_VEX_6A + 1)
821 #define PREFIX_VEX_6C (PREFIX_VEX_6B + 1)
822 #define PREFIX_VEX_6D (PREFIX_VEX_6C + 1)
823 #define PREFIX_VEX_6E (PREFIX_VEX_6D + 1)
824 #define PREFIX_VEX_6F (PREFIX_VEX_6E + 1)
825 #define PREFIX_VEX_70 (PREFIX_VEX_6F + 1)
826 #define PREFIX_VEX_71_REG_2 (PREFIX_VEX_70 + 1)
827 #define PREFIX_VEX_71_REG_4 (PREFIX_VEX_71_REG_2 + 1)
828 #define PREFIX_VEX_71_REG_6 (PREFIX_VEX_71_REG_4 + 1)
829 #define PREFIX_VEX_72_REG_2 (PREFIX_VEX_71_REG_6 + 1)
830 #define PREFIX_VEX_72_REG_4 (PREFIX_VEX_72_REG_2 + 1)
831 #define PREFIX_VEX_72_REG_6 (PREFIX_VEX_72_REG_4 + 1)
832 #define PREFIX_VEX_73_REG_2 (PREFIX_VEX_72_REG_6 + 1)
833 #define PREFIX_VEX_73_REG_3 (PREFIX_VEX_73_REG_2 + 1)
834 #define PREFIX_VEX_73_REG_6 (PREFIX_VEX_73_REG_3 + 1)
835 #define PREFIX_VEX_73_REG_7 (PREFIX_VEX_73_REG_6 + 1)
836 #define PREFIX_VEX_74 (PREFIX_VEX_73_REG_7 + 1)
837 #define PREFIX_VEX_75 (PREFIX_VEX_74 + 1)
838 #define PREFIX_VEX_76 (PREFIX_VEX_75 + 1)
839 #define PREFIX_VEX_77 (PREFIX_VEX_76 + 1)
840 #define PREFIX_VEX_7C (PREFIX_VEX_77 + 1)
841 #define PREFIX_VEX_7D (PREFIX_VEX_7C + 1)
842 #define PREFIX_VEX_7E (PREFIX_VEX_7D + 1)
843 #define PREFIX_VEX_7F (PREFIX_VEX_7E + 1)
844 #define PREFIX_VEX_C2 (PREFIX_VEX_7F + 1)
845 #define PREFIX_VEX_C4 (PREFIX_VEX_C2 + 1)
846 #define PREFIX_VEX_C5 (PREFIX_VEX_C4 + 1)
847 #define PREFIX_VEX_D0 (PREFIX_VEX_C5 + 1)
848 #define PREFIX_VEX_D1 (PREFIX_VEX_D0 + 1)
849 #define PREFIX_VEX_D2 (PREFIX_VEX_D1 + 1)
850 #define PREFIX_VEX_D3 (PREFIX_VEX_D2 + 1)
851 #define PREFIX_VEX_D4 (PREFIX_VEX_D3 + 1)
852 #define PREFIX_VEX_D5 (PREFIX_VEX_D4 + 1)
853 #define PREFIX_VEX_D6 (PREFIX_VEX_D5 + 1)
854 #define PREFIX_VEX_D7 (PREFIX_VEX_D6 + 1)
855 #define PREFIX_VEX_D8 (PREFIX_VEX_D7 + 1)
856 #define PREFIX_VEX_D9 (PREFIX_VEX_D8 + 1)
857 #define PREFIX_VEX_DA (PREFIX_VEX_D9 + 1)
858 #define PREFIX_VEX_DB (PREFIX_VEX_DA + 1)
859 #define PREFIX_VEX_DC (PREFIX_VEX_DB + 1)
860 #define PREFIX_VEX_DD (PREFIX_VEX_DC + 1)
861 #define PREFIX_VEX_DE (PREFIX_VEX_DD + 1)
862 #define PREFIX_VEX_DF (PREFIX_VEX_DE + 1)
863 #define PREFIX_VEX_E0 (PREFIX_VEX_DF + 1)
864 #define PREFIX_VEX_E1 (PREFIX_VEX_E0 + 1)
865 #define PREFIX_VEX_E2 (PREFIX_VEX_E1 + 1)
866 #define PREFIX_VEX_E3 (PREFIX_VEX_E2 + 1)
867 #define PREFIX_VEX_E4 (PREFIX_VEX_E3 + 1)
868 #define PREFIX_VEX_E5 (PREFIX_VEX_E4 + 1)
869 #define PREFIX_VEX_E6 (PREFIX_VEX_E5 + 1)
870 #define PREFIX_VEX_E7 (PREFIX_VEX_E6 + 1)
871 #define PREFIX_VEX_E8 (PREFIX_VEX_E7 + 1)
872 #define PREFIX_VEX_E9 (PREFIX_VEX_E8 + 1)
873 #define PREFIX_VEX_EA (PREFIX_VEX_E9 + 1)
874 #define PREFIX_VEX_EB (PREFIX_VEX_EA + 1)
875 #define PREFIX_VEX_EC (PREFIX_VEX_EB + 1)
876 #define PREFIX_VEX_ED (PREFIX_VEX_EC + 1)
877 #define PREFIX_VEX_EE (PREFIX_VEX_ED + 1)
878 #define PREFIX_VEX_EF (PREFIX_VEX_EE + 1)
879 #define PREFIX_VEX_F0 (PREFIX_VEX_EF + 1)
880 #define PREFIX_VEX_F1 (PREFIX_VEX_F0 + 1)
881 #define PREFIX_VEX_F2 (PREFIX_VEX_F1 + 1)
882 #define PREFIX_VEX_F3 (PREFIX_VEX_F2 + 1)
883 #define PREFIX_VEX_F4 (PREFIX_VEX_F3 + 1)
884 #define PREFIX_VEX_F5 (PREFIX_VEX_F4 + 1)
885 #define PREFIX_VEX_F6 (PREFIX_VEX_F5 + 1)
886 #define PREFIX_VEX_F7 (PREFIX_VEX_F6 + 1)
887 #define PREFIX_VEX_F8 (PREFIX_VEX_F7 + 1)
888 #define PREFIX_VEX_F9 (PREFIX_VEX_F8 + 1)
889 #define PREFIX_VEX_FA (PREFIX_VEX_F9 + 1)
890 #define PREFIX_VEX_FB (PREFIX_VEX_FA + 1)
891 #define PREFIX_VEX_FC (PREFIX_VEX_FB + 1)
892 #define PREFIX_VEX_FD (PREFIX_VEX_FC + 1)
893 #define PREFIX_VEX_FE (PREFIX_VEX_FD + 1)
894 #define PREFIX_VEX_3800 (PREFIX_VEX_FE + 1)
895 #define PREFIX_VEX_3801 (PREFIX_VEX_3800 + 1)
896 #define PREFIX_VEX_3802 (PREFIX_VEX_3801 + 1)
897 #define PREFIX_VEX_3803 (PREFIX_VEX_3802 + 1)
898 #define PREFIX_VEX_3804 (PREFIX_VEX_3803 + 1)
899 #define PREFIX_VEX_3805 (PREFIX_VEX_3804 + 1)
900 #define PREFIX_VEX_3806 (PREFIX_VEX_3805 + 1)
901 #define PREFIX_VEX_3807 (PREFIX_VEX_3806 + 1)
902 #define PREFIX_VEX_3808 (PREFIX_VEX_3807 + 1)
903 #define PREFIX_VEX_3809 (PREFIX_VEX_3808 + 1)
904 #define PREFIX_VEX_380A (PREFIX_VEX_3809 + 1)
905 #define PREFIX_VEX_380B (PREFIX_VEX_380A + 1)
906 #define PREFIX_VEX_380C (PREFIX_VEX_380B + 1)
907 #define PREFIX_VEX_380D (PREFIX_VEX_380C + 1)
908 #define PREFIX_VEX_380E (PREFIX_VEX_380D + 1)
909 #define PREFIX_VEX_380F (PREFIX_VEX_380E + 1)
910 #define PREFIX_VEX_3817 (PREFIX_VEX_380F + 1)
911 #define PREFIX_VEX_3818 (PREFIX_VEX_3817 + 1)
912 #define PREFIX_VEX_3819 (PREFIX_VEX_3818 + 1)
913 #define PREFIX_VEX_381A (PREFIX_VEX_3819 + 1)
914 #define PREFIX_VEX_381C (PREFIX_VEX_381A + 1)
915 #define PREFIX_VEX_381D (PREFIX_VEX_381C + 1)
916 #define PREFIX_VEX_381E (PREFIX_VEX_381D + 1)
917 #define PREFIX_VEX_3820 (PREFIX_VEX_381E + 1)
918 #define PREFIX_VEX_3821 (PREFIX_VEX_3820 + 1)
919 #define PREFIX_VEX_3822 (PREFIX_VEX_3821 + 1)
920 #define PREFIX_VEX_3823 (PREFIX_VEX_3822 + 1)
921 #define PREFIX_VEX_3824 (PREFIX_VEX_3823 + 1)
922 #define PREFIX_VEX_3825 (PREFIX_VEX_3824 + 1)
923 #define PREFIX_VEX_3828 (PREFIX_VEX_3825 + 1)
924 #define PREFIX_VEX_3829 (PREFIX_VEX_3828 + 1)
925 #define PREFIX_VEX_382A (PREFIX_VEX_3829 + 1)
926 #define PREFIX_VEX_382B (PREFIX_VEX_382A + 1)
927 #define PREFIX_VEX_382C (PREFIX_VEX_382B + 1)
928 #define PREFIX_VEX_382D (PREFIX_VEX_382C + 1)
929 #define PREFIX_VEX_382E (PREFIX_VEX_382D + 1)
930 #define PREFIX_VEX_382F (PREFIX_VEX_382E + 1)
931 #define PREFIX_VEX_3830 (PREFIX_VEX_382F + 1)
932 #define PREFIX_VEX_3831 (PREFIX_VEX_3830 + 1)
933 #define PREFIX_VEX_3832 (PREFIX_VEX_3831 + 1)
934 #define PREFIX_VEX_3833 (PREFIX_VEX_3832 + 1)
935 #define PREFIX_VEX_3834 (PREFIX_VEX_3833 + 1)
936 #define PREFIX_VEX_3835 (PREFIX_VEX_3834 + 1)
937 #define PREFIX_VEX_3837 (PREFIX_VEX_3835 + 1)
938 #define PREFIX_VEX_3838 (PREFIX_VEX_3837 + 1)
939 #define PREFIX_VEX_3839 (PREFIX_VEX_3838 + 1)
940 #define PREFIX_VEX_383A (PREFIX_VEX_3839 + 1)
941 #define PREFIX_VEX_383B (PREFIX_VEX_383A + 1)
942 #define PREFIX_VEX_383C (PREFIX_VEX_383B + 1)
943 #define PREFIX_VEX_383D (PREFIX_VEX_383C + 1)
944 #define PREFIX_VEX_383E (PREFIX_VEX_383D + 1)
945 #define PREFIX_VEX_383F (PREFIX_VEX_383E + 1)
946 #define PREFIX_VEX_3840 (PREFIX_VEX_383F + 1)
947 #define PREFIX_VEX_3841 (PREFIX_VEX_3840 + 1)
948 #define PREFIX_VEX_3896 (PREFIX_VEX_3841 + 1)
949 #define PREFIX_VEX_3897 (PREFIX_VEX_3896 + 1)
950 #define PREFIX_VEX_3898 (PREFIX_VEX_3897 + 1)
951 #define PREFIX_VEX_3899 (PREFIX_VEX_3898 + 1)
952 #define PREFIX_VEX_389A (PREFIX_VEX_3899 + 1)
953 #define PREFIX_VEX_389B (PREFIX_VEX_389A + 1)
954 #define PREFIX_VEX_389C (PREFIX_VEX_389B + 1)
955 #define PREFIX_VEX_389D (PREFIX_VEX_389C + 1)
956 #define PREFIX_VEX_389E (PREFIX_VEX_389D + 1)
957 #define PREFIX_VEX_389F (PREFIX_VEX_389E + 1)
958 #define PREFIX_VEX_38A6 (PREFIX_VEX_389F + 1)
959 #define PREFIX_VEX_38A7 (PREFIX_VEX_38A6 + 1)
960 #define PREFIX_VEX_38A8 (PREFIX_VEX_38A7 + 1)
961 #define PREFIX_VEX_38A9 (PREFIX_VEX_38A8 + 1)
962 #define PREFIX_VEX_38AA (PREFIX_VEX_38A9 + 1)
963 #define PREFIX_VEX_38AB (PREFIX_VEX_38AA + 1)
964 #define PREFIX_VEX_38AC (PREFIX_VEX_38AB + 1)
965 #define PREFIX_VEX_38AD (PREFIX_VEX_38AC + 1)
966 #define PREFIX_VEX_38AE (PREFIX_VEX_38AD + 1)
967 #define PREFIX_VEX_38AF (PREFIX_VEX_38AE + 1)
968 #define PREFIX_VEX_38B6 (PREFIX_VEX_38AF + 1)
969 #define PREFIX_VEX_38B7 (PREFIX_VEX_38B6 + 1)
970 #define PREFIX_VEX_38B8 (PREFIX_VEX_38B7 + 1)
971 #define PREFIX_VEX_38B9 (PREFIX_VEX_38B8 + 1)
972 #define PREFIX_VEX_38BA (PREFIX_VEX_38B9 + 1)
973 #define PREFIX_VEX_38BB (PREFIX_VEX_38BA + 1)
974 #define PREFIX_VEX_38BC (PREFIX_VEX_38BB + 1)
975 #define PREFIX_VEX_38BD (PREFIX_VEX_38BC + 1)
976 #define PREFIX_VEX_38BE (PREFIX_VEX_38BD + 1)
977 #define PREFIX_VEX_38BF (PREFIX_VEX_38BE + 1)
978 #define PREFIX_VEX_38DB (PREFIX_VEX_38BF + 1)
979 #define PREFIX_VEX_38DC (PREFIX_VEX_38DB + 1)
980 #define PREFIX_VEX_38DD (PREFIX_VEX_38DC + 1)
981 #define PREFIX_VEX_38DE (PREFIX_VEX_38DD + 1)
982 #define PREFIX_VEX_38DF (PREFIX_VEX_38DE + 1)
983 #define PREFIX_VEX_3A04 (PREFIX_VEX_38DF + 1)
984 #define PREFIX_VEX_3A05 (PREFIX_VEX_3A04 + 1)
985 #define PREFIX_VEX_3A06 (PREFIX_VEX_3A05 + 1)
986 #define PREFIX_VEX_3A08 (PREFIX_VEX_3A06 + 1)
987 #define PREFIX_VEX_3A09 (PREFIX_VEX_3A08 + 1)
988 #define PREFIX_VEX_3A0A (PREFIX_VEX_3A09 + 1)
989 #define PREFIX_VEX_3A0B (PREFIX_VEX_3A0A + 1)
990 #define PREFIX_VEX_3A0C (PREFIX_VEX_3A0B + 1)
991 #define PREFIX_VEX_3A0D (PREFIX_VEX_3A0C + 1)
992 #define PREFIX_VEX_3A0E (PREFIX_VEX_3A0D + 1)
993 #define PREFIX_VEX_3A0F (PREFIX_VEX_3A0E + 1)
994 #define PREFIX_VEX_3A14 (PREFIX_VEX_3A0F + 1)
995 #define PREFIX_VEX_3A15 (PREFIX_VEX_3A14 + 1)
996 #define PREFIX_VEX_3A16 (PREFIX_VEX_3A15 + 1)
997 #define PREFIX_VEX_3A17 (PREFIX_VEX_3A16 + 1)
998 #define PREFIX_VEX_3A18 (PREFIX_VEX_3A17 + 1)
999 #define PREFIX_VEX_3A19 (PREFIX_VEX_3A18 + 1)
1000 #define PREFIX_VEX_3A20 (PREFIX_VEX_3A19 + 1)
1001 #define PREFIX_VEX_3A21 (PREFIX_VEX_3A20 + 1)
1002 #define PREFIX_VEX_3A22 (PREFIX_VEX_3A21 + 1)
1003 #define PREFIX_VEX_3A40 (PREFIX_VEX_3A22 + 1)
1004 #define PREFIX_VEX_3A41 (PREFIX_VEX_3A40 + 1)
1005 #define PREFIX_VEX_3A42 (PREFIX_VEX_3A41 + 1)
1006 #define PREFIX_VEX_3A44 (PREFIX_VEX_3A42 + 1)
1007 #define PREFIX_VEX_3A4A (PREFIX_VEX_3A44 + 1)
1008 #define PREFIX_VEX_3A4B (PREFIX_VEX_3A4A + 1)
1009 #define PREFIX_VEX_3A4C (PREFIX_VEX_3A4B + 1)
1010 #define PREFIX_VEX_3A60 (PREFIX_VEX_3A4C + 1)
1011 #define PREFIX_VEX_3A61 (PREFIX_VEX_3A60 + 1)
1012 #define PREFIX_VEX_3A62 (PREFIX_VEX_3A61 + 1)
1013 #define PREFIX_VEX_3A63 (PREFIX_VEX_3A62 + 1)
1014 #define PREFIX_VEX_3ADF (PREFIX_VEX_3A63 + 1)
1015
1016 #define X86_64_06 0
1017 #define X86_64_07 (X86_64_06 + 1)
1018 #define X86_64_0D (X86_64_07 + 1)
1019 #define X86_64_16 (X86_64_0D + 1)
1020 #define X86_64_17 (X86_64_16 + 1)
1021 #define X86_64_1E (X86_64_17 + 1)
1022 #define X86_64_1F (X86_64_1E + 1)
1023 #define X86_64_27 (X86_64_1F + 1)
1024 #define X86_64_2F (X86_64_27 + 1)
1025 #define X86_64_37 (X86_64_2F + 1)
1026 #define X86_64_3F (X86_64_37 + 1)
1027 #define X86_64_60 (X86_64_3F + 1)
1028 #define X86_64_61 (X86_64_60 + 1)
1029 #define X86_64_62 (X86_64_61 + 1)
1030 #define X86_64_63 (X86_64_62 + 1)
1031 #define X86_64_6D (X86_64_63 + 1)
1032 #define X86_64_6F (X86_64_6D + 1)
1033 #define X86_64_9A (X86_64_6F + 1)
1034 #define X86_64_C4 (X86_64_9A + 1)
1035 #define X86_64_C5 (X86_64_C4 + 1)
1036 #define X86_64_CE (X86_64_C5 + 1)
1037 #define X86_64_D4 (X86_64_CE + 1)
1038 #define X86_64_D5 (X86_64_D4 + 1)
1039 #define X86_64_EA (X86_64_D5 + 1)
1040 #define X86_64_0F01_REG_0 (X86_64_EA + 1)
1041 #define X86_64_0F01_REG_1 (X86_64_0F01_REG_0 + 1)
1042 #define X86_64_0F01_REG_2 (X86_64_0F01_REG_1 + 1)
1043 #define X86_64_0F01_REG_3 (X86_64_0F01_REG_2 + 1)
1044
1045 #define THREE_BYTE_0F24 0
1046 #define THREE_BYTE_0F25 (THREE_BYTE_0F24 + 1)
1047 #define THREE_BYTE_0F38 (THREE_BYTE_0F25 + 1)
1048 #define THREE_BYTE_0F3A (THREE_BYTE_0F38 + 1)
1049 #define THREE_BYTE_0F7A (THREE_BYTE_0F3A + 1)
1050 #define THREE_BYTE_0F7B (THREE_BYTE_0F7A + 1)
1051
1052 #define VEX_0F 0
1053 #define VEX_0F38 (VEX_0F + 1)
1054 #define VEX_0F3A (VEX_0F38 + 1)
1055
1056 #define VEX_LEN_10_P_1 0
1057 #define VEX_LEN_10_P_3 (VEX_LEN_10_P_1 + 1)
1058 #define VEX_LEN_11_P_1 (VEX_LEN_10_P_3 + 1)
1059 #define VEX_LEN_11_P_3 (VEX_LEN_11_P_1 + 1)
1060 #define VEX_LEN_12_P_0_M_0 (VEX_LEN_11_P_3 + 1)
1061 #define VEX_LEN_12_P_0_M_1 (VEX_LEN_12_P_0_M_0 + 1)
1062 #define VEX_LEN_12_P_2 (VEX_LEN_12_P_0_M_1 + 1)
1063 #define VEX_LEN_13_M_0 (VEX_LEN_12_P_2 + 1)
1064 #define VEX_LEN_16_P_0_M_0 (VEX_LEN_13_M_0 + 1)
1065 #define VEX_LEN_16_P_0_M_1 (VEX_LEN_16_P_0_M_0 + 1)
1066 #define VEX_LEN_16_P_2 (VEX_LEN_16_P_0_M_1 + 1)
1067 #define VEX_LEN_17_M_0 (VEX_LEN_16_P_2 + 1)
1068 #define VEX_LEN_2A_P_1 (VEX_LEN_17_M_0 + 1)
1069 #define VEX_LEN_2A_P_3 (VEX_LEN_2A_P_1 + 1)
1070 #define VEX_LEN_2C_P_1 (VEX_LEN_2A_P_3 + 1)
1071 #define VEX_LEN_2C_P_3 (VEX_LEN_2C_P_1 + 1)
1072 #define VEX_LEN_2D_P_1 (VEX_LEN_2C_P_3 + 1)
1073 #define VEX_LEN_2D_P_3 (VEX_LEN_2D_P_1 + 1)
1074 #define VEX_LEN_2E_P_0 (VEX_LEN_2D_P_3 + 1)
1075 #define VEX_LEN_2E_P_2 (VEX_LEN_2E_P_0 + 1)
1076 #define VEX_LEN_2F_P_0 (VEX_LEN_2E_P_2 + 1)
1077 #define VEX_LEN_2F_P_2 (VEX_LEN_2F_P_0 + 1)
1078 #define VEX_LEN_51_P_1 (VEX_LEN_2F_P_2 + 1)
1079 #define VEX_LEN_51_P_3 (VEX_LEN_51_P_1 + 1)
1080 #define VEX_LEN_52_P_1 (VEX_LEN_51_P_3 + 1)
1081 #define VEX_LEN_53_P_1 (VEX_LEN_52_P_1 + 1)
1082 #define VEX_LEN_58_P_1 (VEX_LEN_53_P_1 + 1)
1083 #define VEX_LEN_58_P_3 (VEX_LEN_58_P_1 + 1)
1084 #define VEX_LEN_59_P_1 (VEX_LEN_58_P_3 + 1)
1085 #define VEX_LEN_59_P_3 (VEX_LEN_59_P_1 + 1)
1086 #define VEX_LEN_5A_P_1 (VEX_LEN_59_P_3 + 1)
1087 #define VEX_LEN_5A_P_3 (VEX_LEN_5A_P_1 + 1)
1088 #define VEX_LEN_5C_P_1 (VEX_LEN_5A_P_3 + 1)
1089 #define VEX_LEN_5C_P_3 (VEX_LEN_5C_P_1 + 1)
1090 #define VEX_LEN_5D_P_1 (VEX_LEN_5C_P_3 + 1)
1091 #define VEX_LEN_5D_P_3 (VEX_LEN_5D_P_1 + 1)
1092 #define VEX_LEN_5E_P_1 (VEX_LEN_5D_P_3 + 1)
1093 #define VEX_LEN_5E_P_3 (VEX_LEN_5E_P_1 + 1)
1094 #define VEX_LEN_5F_P_1 (VEX_LEN_5E_P_3 + 1)
1095 #define VEX_LEN_5F_P_3 (VEX_LEN_5F_P_1 + 1)
1096 #define VEX_LEN_60_P_2 (VEX_LEN_5F_P_3 + 1)
1097 #define VEX_LEN_61_P_2 (VEX_LEN_60_P_2 + 1)
1098 #define VEX_LEN_62_P_2 (VEX_LEN_61_P_2 + 1)
1099 #define VEX_LEN_63_P_2 (VEX_LEN_62_P_2 + 1)
1100 #define VEX_LEN_64_P_2 (VEX_LEN_63_P_2 + 1)
1101 #define VEX_LEN_65_P_2 (VEX_LEN_64_P_2 + 1)
1102 #define VEX_LEN_66_P_2 (VEX_LEN_65_P_2 + 1)
1103 #define VEX_LEN_67_P_2 (VEX_LEN_66_P_2 + 1)
1104 #define VEX_LEN_68_P_2 (VEX_LEN_67_P_2 + 1)
1105 #define VEX_LEN_69_P_2 (VEX_LEN_68_P_2 + 1)
1106 #define VEX_LEN_6A_P_2 (VEX_LEN_69_P_2 + 1)
1107 #define VEX_LEN_6B_P_2 (VEX_LEN_6A_P_2 + 1)
1108 #define VEX_LEN_6C_P_2 (VEX_LEN_6B_P_2 + 1)
1109 #define VEX_LEN_6D_P_2 (VEX_LEN_6C_P_2 + 1)
1110 #define VEX_LEN_6E_P_2 (VEX_LEN_6D_P_2 + 1)
1111 #define VEX_LEN_70_P_1 (VEX_LEN_6E_P_2 + 1)
1112 #define VEX_LEN_70_P_2 (VEX_LEN_70_P_1 + 1)
1113 #define VEX_LEN_70_P_3 (VEX_LEN_70_P_2 + 1)
1114 #define VEX_LEN_71_R_2_P_2 (VEX_LEN_70_P_3 + 1)
1115 #define VEX_LEN_71_R_4_P_2 (VEX_LEN_71_R_2_P_2 + 1)
1116 #define VEX_LEN_71_R_6_P_2 (VEX_LEN_71_R_4_P_2 + 1)
1117 #define VEX_LEN_72_R_2_P_2 (VEX_LEN_71_R_6_P_2 + 1)
1118 #define VEX_LEN_72_R_4_P_2 (VEX_LEN_72_R_2_P_2 + 1)
1119 #define VEX_LEN_72_R_6_P_2 (VEX_LEN_72_R_4_P_2 + 1)
1120 #define VEX_LEN_73_R_2_P_2 (VEX_LEN_72_R_6_P_2 + 1)
1121 #define VEX_LEN_73_R_3_P_2 (VEX_LEN_73_R_2_P_2 + 1)
1122 #define VEX_LEN_73_R_6_P_2 (VEX_LEN_73_R_3_P_2 + 1)
1123 #define VEX_LEN_73_R_7_P_2 (VEX_LEN_73_R_6_P_2 + 1)
1124 #define VEX_LEN_74_P_2 (VEX_LEN_73_R_7_P_2 + 1)
1125 #define VEX_LEN_75_P_2 (VEX_LEN_74_P_2 + 1)
1126 #define VEX_LEN_76_P_2 (VEX_LEN_75_P_2 + 1)
1127 #define VEX_LEN_7E_P_1 (VEX_LEN_76_P_2 + 1)
1128 #define VEX_LEN_7E_P_2 (VEX_LEN_7E_P_1 + 1)
1129 #define VEX_LEN_AE_R_2_M_0 (VEX_LEN_7E_P_2 + 1)
1130 #define VEX_LEN_AE_R_3_M_0 (VEX_LEN_AE_R_2_M_0 + 1)
1131 #define VEX_LEN_C2_P_1 (VEX_LEN_AE_R_3_M_0 + 1)
1132 #define VEX_LEN_C2_P_3 (VEX_LEN_C2_P_1 + 1)
1133 #define VEX_LEN_C4_P_2 (VEX_LEN_C2_P_3 + 1)
1134 #define VEX_LEN_C5_P_2 (VEX_LEN_C4_P_2 + 1)
1135 #define VEX_LEN_D1_P_2 (VEX_LEN_C5_P_2 + 1)
1136 #define VEX_LEN_D2_P_2 (VEX_LEN_D1_P_2 + 1)
1137 #define VEX_LEN_D3_P_2 (VEX_LEN_D2_P_2 + 1)
1138 #define VEX_LEN_D4_P_2 (VEX_LEN_D3_P_2 + 1)
1139 #define VEX_LEN_D5_P_2 (VEX_LEN_D4_P_2 + 1)
1140 #define VEX_LEN_D6_P_2 (VEX_LEN_D5_P_2 + 1)
1141 #define VEX_LEN_D7_P_2_M_1 (VEX_LEN_D6_P_2 + 1)
1142 #define VEX_LEN_D8_P_2 (VEX_LEN_D7_P_2_M_1 + 1)
1143 #define VEX_LEN_D9_P_2 (VEX_LEN_D8_P_2 + 1)
1144 #define VEX_LEN_DA_P_2 (VEX_LEN_D9_P_2 + 1)
1145 #define VEX_LEN_DB_P_2 (VEX_LEN_DA_P_2 + 1)
1146 #define VEX_LEN_DC_P_2 (VEX_LEN_DB_P_2 + 1)
1147 #define VEX_LEN_DD_P_2 (VEX_LEN_DC_P_2 + 1)
1148 #define VEX_LEN_DE_P_2 (VEX_LEN_DD_P_2 + 1)
1149 #define VEX_LEN_DF_P_2 (VEX_LEN_DE_P_2 + 1)
1150 #define VEX_LEN_E0_P_2 (VEX_LEN_DF_P_2 + 1)
1151 #define VEX_LEN_E1_P_2 (VEX_LEN_E0_P_2 + 1)
1152 #define VEX_LEN_E2_P_2 (VEX_LEN_E1_P_2 + 1)
1153 #define VEX_LEN_E3_P_2 (VEX_LEN_E2_P_2 + 1)
1154 #define VEX_LEN_E4_P_2 (VEX_LEN_E3_P_2 + 1)
1155 #define VEX_LEN_E5_P_2 (VEX_LEN_E4_P_2 + 1)
1156 #define VEX_LEN_E8_P_2 (VEX_LEN_E5_P_2 + 1)
1157 #define VEX_LEN_E9_P_2 (VEX_LEN_E8_P_2 + 1)
1158 #define VEX_LEN_EA_P_2 (VEX_LEN_E9_P_2 + 1)
1159 #define VEX_LEN_EB_P_2 (VEX_LEN_EA_P_2 + 1)
1160 #define VEX_LEN_EC_P_2 (VEX_LEN_EB_P_2 + 1)
1161 #define VEX_LEN_ED_P_2 (VEX_LEN_EC_P_2 + 1)
1162 #define VEX_LEN_EE_P_2 (VEX_LEN_ED_P_2 + 1)
1163 #define VEX_LEN_EF_P_2 (VEX_LEN_EE_P_2 + 1)
1164 #define VEX_LEN_F1_P_2 (VEX_LEN_EF_P_2 + 1)
1165 #define VEX_LEN_F2_P_2 (VEX_LEN_F1_P_2 + 1)
1166 #define VEX_LEN_F3_P_2 (VEX_LEN_F2_P_2 + 1)
1167 #define VEX_LEN_F4_P_2 (VEX_LEN_F3_P_2 + 1)
1168 #define VEX_LEN_F5_P_2 (VEX_LEN_F4_P_2 + 1)
1169 #define VEX_LEN_F6_P_2 (VEX_LEN_F5_P_2 + 1)
1170 #define VEX_LEN_F7_P_2 (VEX_LEN_F6_P_2 + 1)
1171 #define VEX_LEN_F8_P_2 (VEX_LEN_F7_P_2 + 1)
1172 #define VEX_LEN_F9_P_2 (VEX_LEN_F8_P_2 + 1)
1173 #define VEX_LEN_FA_P_2 (VEX_LEN_F9_P_2 + 1)
1174 #define VEX_LEN_FB_P_2 (VEX_LEN_FA_P_2 + 1)
1175 #define VEX_LEN_FC_P_2 (VEX_LEN_FB_P_2 + 1)
1176 #define VEX_LEN_FD_P_2 (VEX_LEN_FC_P_2 + 1)
1177 #define VEX_LEN_FE_P_2 (VEX_LEN_FD_P_2 + 1)
1178 #define VEX_LEN_3800_P_2 (VEX_LEN_FE_P_2 + 1)
1179 #define VEX_LEN_3801_P_2 (VEX_LEN_3800_P_2 + 1)
1180 #define VEX_LEN_3802_P_2 (VEX_LEN_3801_P_2 + 1)
1181 #define VEX_LEN_3803_P_2 (VEX_LEN_3802_P_2 + 1)
1182 #define VEX_LEN_3804_P_2 (VEX_LEN_3803_P_2 + 1)
1183 #define VEX_LEN_3805_P_2 (VEX_LEN_3804_P_2 + 1)
1184 #define VEX_LEN_3806_P_2 (VEX_LEN_3805_P_2 + 1)
1185 #define VEX_LEN_3807_P_2 (VEX_LEN_3806_P_2 + 1)
1186 #define VEX_LEN_3808_P_2 (VEX_LEN_3807_P_2 + 1)
1187 #define VEX_LEN_3809_P_2 (VEX_LEN_3808_P_2 + 1)
1188 #define VEX_LEN_380A_P_2 (VEX_LEN_3809_P_2 + 1)
1189 #define VEX_LEN_380B_P_2 (VEX_LEN_380A_P_2 + 1)
1190 #define VEX_LEN_3819_P_2_M_0 (VEX_LEN_380B_P_2 + 1)
1191 #define VEX_LEN_381A_P_2_M_0 (VEX_LEN_3819_P_2_M_0 + 1)
1192 #define VEX_LEN_381C_P_2 (VEX_LEN_381A_P_2_M_0 + 1)
1193 #define VEX_LEN_381D_P_2 (VEX_LEN_381C_P_2 + 1)
1194 #define VEX_LEN_381E_P_2 (VEX_LEN_381D_P_2 + 1)
1195 #define VEX_LEN_3820_P_2 (VEX_LEN_381E_P_2 + 1)
1196 #define VEX_LEN_3821_P_2 (VEX_LEN_3820_P_2 + 1)
1197 #define VEX_LEN_3822_P_2 (VEX_LEN_3821_P_2 + 1)
1198 #define VEX_LEN_3823_P_2 (VEX_LEN_3822_P_2 + 1)
1199 #define VEX_LEN_3824_P_2 (VEX_LEN_3823_P_2 + 1)
1200 #define VEX_LEN_3825_P_2 (VEX_LEN_3824_P_2 + 1)
1201 #define VEX_LEN_3828_P_2 (VEX_LEN_3825_P_2 + 1)
1202 #define VEX_LEN_3829_P_2 (VEX_LEN_3828_P_2 + 1)
1203 #define VEX_LEN_382A_P_2_M_0 (VEX_LEN_3829_P_2 + 1)
1204 #define VEX_LEN_382B_P_2 (VEX_LEN_382A_P_2_M_0 + 1)
1205 #define VEX_LEN_3830_P_2 (VEX_LEN_382B_P_2 + 1)
1206 #define VEX_LEN_3831_P_2 (VEX_LEN_3830_P_2 + 1)
1207 #define VEX_LEN_3832_P_2 (VEX_LEN_3831_P_2 + 1)
1208 #define VEX_LEN_3833_P_2 (VEX_LEN_3832_P_2 + 1)
1209 #define VEX_LEN_3834_P_2 (VEX_LEN_3833_P_2 + 1)
1210 #define VEX_LEN_3835_P_2 (VEX_LEN_3834_P_2 + 1)
1211 #define VEX_LEN_3837_P_2 (VEX_LEN_3835_P_2 + 1)
1212 #define VEX_LEN_3838_P_2 (VEX_LEN_3837_P_2 + 1)
1213 #define VEX_LEN_3839_P_2 (VEX_LEN_3838_P_2 + 1)
1214 #define VEX_LEN_383A_P_2 (VEX_LEN_3839_P_2 + 1)
1215 #define VEX_LEN_383B_P_2 (VEX_LEN_383A_P_2 + 1)
1216 #define VEX_LEN_383C_P_2 (VEX_LEN_383B_P_2 + 1)
1217 #define VEX_LEN_383D_P_2 (VEX_LEN_383C_P_2 + 1)
1218 #define VEX_LEN_383E_P_2 (VEX_LEN_383D_P_2 + 1)
1219 #define VEX_LEN_383F_P_2 (VEX_LEN_383E_P_2 + 1)
1220 #define VEX_LEN_3840_P_2 (VEX_LEN_383F_P_2 + 1)
1221 #define VEX_LEN_3841_P_2 (VEX_LEN_3840_P_2 + 1)
1222 #define VEX_LEN_38DB_P_2 (VEX_LEN_3841_P_2 + 1)
1223 #define VEX_LEN_38DC_P_2 (VEX_LEN_38DB_P_2 + 1)
1224 #define VEX_LEN_38DD_P_2 (VEX_LEN_38DC_P_2 + 1)
1225 #define VEX_LEN_38DE_P_2 (VEX_LEN_38DD_P_2 + 1)
1226 #define VEX_LEN_38DF_P_2 (VEX_LEN_38DE_P_2 + 1)
1227 #define VEX_LEN_3A06_P_2 (VEX_LEN_38DF_P_2 + 1)
1228 #define VEX_LEN_3A0A_P_2 (VEX_LEN_3A06_P_2 + 1)
1229 #define VEX_LEN_3A0B_P_2 (VEX_LEN_3A0A_P_2 + 1)
1230 #define VEX_LEN_3A0E_P_2 (VEX_LEN_3A0B_P_2 + 1)
1231 #define VEX_LEN_3A0F_P_2 (VEX_LEN_3A0E_P_2 + 1)
1232 #define VEX_LEN_3A14_P_2 (VEX_LEN_3A0F_P_2 + 1)
1233 #define VEX_LEN_3A15_P_2 (VEX_LEN_3A14_P_2 + 1)
1234 #define VEX_LEN_3A16_P_2 (VEX_LEN_3A15_P_2 + 1)
1235 #define VEX_LEN_3A17_P_2 (VEX_LEN_3A16_P_2 + 1)
1236 #define VEX_LEN_3A18_P_2 (VEX_LEN_3A17_P_2 + 1)
1237 #define VEX_LEN_3A19_P_2 (VEX_LEN_3A18_P_2 + 1)
1238 #define VEX_LEN_3A20_P_2 (VEX_LEN_3A19_P_2 + 1)
1239 #define VEX_LEN_3A21_P_2 (VEX_LEN_3A20_P_2 + 1)
1240 #define VEX_LEN_3A22_P_2 (VEX_LEN_3A21_P_2 + 1)
1241 #define VEX_LEN_3A41_P_2 (VEX_LEN_3A22_P_2 + 1)
1242 #define VEX_LEN_3A42_P_2 (VEX_LEN_3A41_P_2 + 1)
1243 #define VEX_LEN_3A44_P_2 (VEX_LEN_3A42_P_2 + 1)
1244 #define VEX_LEN_3A4C_P_2 (VEX_LEN_3A44_P_2 + 1)
1245 #define VEX_LEN_3A60_P_2 (VEX_LEN_3A4C_P_2 + 1)
1246 #define VEX_LEN_3A61_P_2 (VEX_LEN_3A60_P_2 + 1)
1247 #define VEX_LEN_3A62_P_2 (VEX_LEN_3A61_P_2 + 1)
1248 #define VEX_LEN_3A63_P_2 (VEX_LEN_3A62_P_2 + 1)
1249 #define VEX_LEN_3ADF_P_2 (VEX_LEN_3A63_P_2 + 1)
1250
1251 typedef void (*op_rtn) (int bytemode, int sizeflag);
1252
1253 struct dis386 {
1254 const char *name;
1255 struct
1256 {
1257 op_rtn rtn;
1258 int bytemode;
1259 } op[MAX_OPERANDS];
1260 };
1261
1262 /* Upper case letters in the instruction names here are macros.
1263 'A' => print 'b' if no register operands or suffix_always is true
1264 'B' => print 'b' if suffix_always is true
1265 'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
1266 size prefix
1267 'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
1268 suffix_always is true
1269 'E' => print 'e' if 32-bit form of jcxz
1270 'F' => print 'w' or 'l' depending on address size prefix (loop insns)
1271 'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
1272 'H' => print ",pt" or ",pn" branch hint
1273 'I' => honor following macro letter even in Intel mode (implemented only
1274 for some of the macro letters)
1275 'J' => print 'l'
1276 'K' => print 'd' or 'q' if rex prefix is present.
1277 'L' => print 'l' if suffix_always is true
1278 'M' => print 'r' if intel_mnemonic is false.
1279 'N' => print 'n' if instruction has no wait "prefix"
1280 'O' => print 'd' or 'o' (or 'q' in Intel mode)
1281 'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix,
1282 or suffix_always is true. print 'q' if rex prefix is present.
1283 'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
1284 is true
1285 'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
1286 'S' => print 'w', 'l' or 'q' if suffix_always is true
1287 'T' => print 'q' in 64bit mode and behave as 'P' otherwise
1288 'U' => print 'q' in 64bit mode and behave as 'Q' otherwise
1289 'V' => print 'q' in 64bit mode and behave as 'S' otherwise
1290 'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
1291 'X' => print 's', 'd' depending on data16 prefix (for XMM)
1292 'Y' => 'q' if instruction has an REX 64bit overwrite prefix and
1293 suffix_always is true.
1294 'Z' => print 'q' in 64bit mode and behave as 'L' otherwise
1295 '!' => change condition from true to false or from false to true.
1296 '%' => add 1 upper case letter to the macro.
1297
1298 2 upper case letter macros:
1299 "XY" => print 'x' or 'y' if no register operands or suffix_always
1300 is true.
1301 'XW' => print 's', 'd' depending on the VEX.W bit (for FMA)
1302 'LQ' => print 'l' ('d' in Intel mode) or 'q' for memory operand
1303 or suffix_always is true
1304
1305 Many of the above letters print nothing in Intel mode. See "putop"
1306 for the details.
1307
1308 Braces '{' and '}', and vertical bars '|', indicate alternative
1309 mnemonic strings for AT&T and Intel. */
1310
1311 static const struct dis386 dis386[] = {
1312 /* 00 */
1313 { "addB", { Eb, Gb } },
1314 { "addS", { Ev, Gv } },
1315 { "addB", { Gb, EbS } },
1316 { "addS", { Gv, EvS } },
1317 { "addB", { AL, Ib } },
1318 { "addS", { eAX, Iv } },
1319 { X86_64_TABLE (X86_64_06) },
1320 { X86_64_TABLE (X86_64_07) },
1321 /* 08 */
1322 { "orB", { Eb, Gb } },
1323 { "orS", { Ev, Gv } },
1324 { "orB", { Gb, EbS } },
1325 { "orS", { Gv, EvS } },
1326 { "orB", { AL, Ib } },
1327 { "orS", { eAX, Iv } },
1328 { X86_64_TABLE (X86_64_0D) },
1329 { "(bad)", { XX } }, /* 0x0f extended opcode escape */
1330 /* 10 */
1331 { "adcB", { Eb, Gb } },
1332 { "adcS", { Ev, Gv } },
1333 { "adcB", { Gb, EbS } },
1334 { "adcS", { Gv, EvS } },
1335 { "adcB", { AL, Ib } },
1336 { "adcS", { eAX, Iv } },
1337 { X86_64_TABLE (X86_64_16) },
1338 { X86_64_TABLE (X86_64_17) },
1339 /* 18 */
1340 { "sbbB", { Eb, Gb } },
1341 { "sbbS", { Ev, Gv } },
1342 { "sbbB", { Gb, EbS } },
1343 { "sbbS", { Gv, EvS } },
1344 { "sbbB", { AL, Ib } },
1345 { "sbbS", { eAX, Iv } },
1346 { X86_64_TABLE (X86_64_1E) },
1347 { X86_64_TABLE (X86_64_1F) },
1348 /* 20 */
1349 { "andB", { Eb, Gb } },
1350 { "andS", { Ev, Gv } },
1351 { "andB", { Gb, EbS } },
1352 { "andS", { Gv, EvS } },
1353 { "andB", { AL, Ib } },
1354 { "andS", { eAX, Iv } },
1355 { "(bad)", { XX } }, /* SEG ES prefix */
1356 { X86_64_TABLE (X86_64_27) },
1357 /* 28 */
1358 { "subB", { Eb, Gb } },
1359 { "subS", { Ev, Gv } },
1360 { "subB", { Gb, EbS } },
1361 { "subS", { Gv, EvS } },
1362 { "subB", { AL, Ib } },
1363 { "subS", { eAX, Iv } },
1364 { "(bad)", { XX } }, /* SEG CS prefix */
1365 { X86_64_TABLE (X86_64_2F) },
1366 /* 30 */
1367 { "xorB", { Eb, Gb } },
1368 { "xorS", { Ev, Gv } },
1369 { "xorB", { Gb, EbS } },
1370 { "xorS", { Gv, EvS } },
1371 { "xorB", { AL, Ib } },
1372 { "xorS", { eAX, Iv } },
1373 { "(bad)", { XX } }, /* SEG SS prefix */
1374 { X86_64_TABLE (X86_64_37) },
1375 /* 38 */
1376 { "cmpB", { Eb, Gb } },
1377 { "cmpS", { Ev, Gv } },
1378 { "cmpB", { Gb, EbS } },
1379 { "cmpS", { Gv, EvS } },
1380 { "cmpB", { AL, Ib } },
1381 { "cmpS", { eAX, Iv } },
1382 { "(bad)", { XX } }, /* SEG DS prefix */
1383 { X86_64_TABLE (X86_64_3F) },
1384 /* 40 */
1385 { "inc{S|}", { RMeAX } },
1386 { "inc{S|}", { RMeCX } },
1387 { "inc{S|}", { RMeDX } },
1388 { "inc{S|}", { RMeBX } },
1389 { "inc{S|}", { RMeSP } },
1390 { "inc{S|}", { RMeBP } },
1391 { "inc{S|}", { RMeSI } },
1392 { "inc{S|}", { RMeDI } },
1393 /* 48 */
1394 { "dec{S|}", { RMeAX } },
1395 { "dec{S|}", { RMeCX } },
1396 { "dec{S|}", { RMeDX } },
1397 { "dec{S|}", { RMeBX } },
1398 { "dec{S|}", { RMeSP } },
1399 { "dec{S|}", { RMeBP } },
1400 { "dec{S|}", { RMeSI } },
1401 { "dec{S|}", { RMeDI } },
1402 /* 50 */
1403 { "pushV", { RMrAX } },
1404 { "pushV", { RMrCX } },
1405 { "pushV", { RMrDX } },
1406 { "pushV", { RMrBX } },
1407 { "pushV", { RMrSP } },
1408 { "pushV", { RMrBP } },
1409 { "pushV", { RMrSI } },
1410 { "pushV", { RMrDI } },
1411 /* 58 */
1412 { "popV", { RMrAX } },
1413 { "popV", { RMrCX } },
1414 { "popV", { RMrDX } },
1415 { "popV", { RMrBX } },
1416 { "popV", { RMrSP } },
1417 { "popV", { RMrBP } },
1418 { "popV", { RMrSI } },
1419 { "popV", { RMrDI } },
1420 /* 60 */
1421 { X86_64_TABLE (X86_64_60) },
1422 { X86_64_TABLE (X86_64_61) },
1423 { X86_64_TABLE (X86_64_62) },
1424 { X86_64_TABLE (X86_64_63) },
1425 { "(bad)", { XX } }, /* seg fs */
1426 { "(bad)", { XX } }, /* seg gs */
1427 { "(bad)", { XX } }, /* op size prefix */
1428 { "(bad)", { XX } }, /* adr size prefix */
1429 /* 68 */
1430 { "pushT", { Iq } },
1431 { "imulS", { Gv, Ev, Iv } },
1432 { "pushT", { sIb } },
1433 { "imulS", { Gv, Ev, sIb } },
1434 { "ins{b|}", { Ybr, indirDX } },
1435 { X86_64_TABLE (X86_64_6D) },
1436 { "outs{b|}", { indirDXr, Xb } },
1437 { X86_64_TABLE (X86_64_6F) },
1438 /* 70 */
1439 { "joH", { Jb, XX, cond_jump_flag } },
1440 { "jnoH", { Jb, XX, cond_jump_flag } },
1441 { "jbH", { Jb, XX, cond_jump_flag } },
1442 { "jaeH", { Jb, XX, cond_jump_flag } },
1443 { "jeH", { Jb, XX, cond_jump_flag } },
1444 { "jneH", { Jb, XX, cond_jump_flag } },
1445 { "jbeH", { Jb, XX, cond_jump_flag } },
1446 { "jaH", { Jb, XX, cond_jump_flag } },
1447 /* 78 */
1448 { "jsH", { Jb, XX, cond_jump_flag } },
1449 { "jnsH", { Jb, XX, cond_jump_flag } },
1450 { "jpH", { Jb, XX, cond_jump_flag } },
1451 { "jnpH", { Jb, XX, cond_jump_flag } },
1452 { "jlH", { Jb, XX, cond_jump_flag } },
1453 { "jgeH", { Jb, XX, cond_jump_flag } },
1454 { "jleH", { Jb, XX, cond_jump_flag } },
1455 { "jgH", { Jb, XX, cond_jump_flag } },
1456 /* 80 */
1457 { REG_TABLE (REG_80) },
1458 { REG_TABLE (REG_81) },
1459 { "(bad)", { XX } },
1460 { REG_TABLE (REG_82) },
1461 { "testB", { Eb, Gb } },
1462 { "testS", { Ev, Gv } },
1463 { "xchgB", { Eb, Gb } },
1464 { "xchgS", { Ev, Gv } },
1465 /* 88 */
1466 { "movB", { Eb, Gb } },
1467 { "movS", { Ev, Gv } },
1468 { "movB", { Gb, EbS } },
1469 { "movS", { Gv, EvS } },
1470 { "movD", { Sv, Sw } },
1471 { MOD_TABLE (MOD_8D) },
1472 { "movD", { Sw, Sv } },
1473 { REG_TABLE (REG_8F) },
1474 /* 90 */
1475 { PREFIX_TABLE (PREFIX_90) },
1476 { "xchgS", { RMeCX, eAX } },
1477 { "xchgS", { RMeDX, eAX } },
1478 { "xchgS", { RMeBX, eAX } },
1479 { "xchgS", { RMeSP, eAX } },
1480 { "xchgS", { RMeBP, eAX } },
1481 { "xchgS", { RMeSI, eAX } },
1482 { "xchgS", { RMeDI, eAX } },
1483 /* 98 */
1484 { "cW{t|}R", { XX } },
1485 { "cR{t|}O", { XX } },
1486 { X86_64_TABLE (X86_64_9A) },
1487 { "(bad)", { XX } }, /* fwait */
1488 { "pushfT", { XX } },
1489 { "popfT", { XX } },
1490 { "sahf", { XX } },
1491 { "lahf", { XX } },
1492 /* a0 */
1493 { "movB", { AL, Ob } },
1494 { "movS", { eAX, Ov } },
1495 { "movB", { Ob, AL } },
1496 { "movS", { Ov, eAX } },
1497 { "movs{b|}", { Ybr, Xb } },
1498 { "movs{R|}", { Yvr, Xv } },
1499 { "cmps{b|}", { Xb, Yb } },
1500 { "cmps{R|}", { Xv, Yv } },
1501 /* a8 */
1502 { "testB", { AL, Ib } },
1503 { "testS", { eAX, Iv } },
1504 { "stosB", { Ybr, AL } },
1505 { "stosS", { Yvr, eAX } },
1506 { "lodsB", { ALr, Xb } },
1507 { "lodsS", { eAXr, Xv } },
1508 { "scasB", { AL, Yb } },
1509 { "scasS", { eAX, Yv } },
1510 /* b0 */
1511 { "movB", { RMAL, Ib } },
1512 { "movB", { RMCL, Ib } },
1513 { "movB", { RMDL, Ib } },
1514 { "movB", { RMBL, Ib } },
1515 { "movB", { RMAH, Ib } },
1516 { "movB", { RMCH, Ib } },
1517 { "movB", { RMDH, Ib } },
1518 { "movB", { RMBH, Ib } },
1519 /* b8 */
1520 { "movS", { RMeAX, Iv64 } },
1521 { "movS", { RMeCX, Iv64 } },
1522 { "movS", { RMeDX, Iv64 } },
1523 { "movS", { RMeBX, Iv64 } },
1524 { "movS", { RMeSP, Iv64 } },
1525 { "movS", { RMeBP, Iv64 } },
1526 { "movS", { RMeSI, Iv64 } },
1527 { "movS", { RMeDI, Iv64 } },
1528 /* c0 */
1529 { REG_TABLE (REG_C0) },
1530 { REG_TABLE (REG_C1) },
1531 { "retT", { Iw } },
1532 { "retT", { XX } },
1533 { X86_64_TABLE (X86_64_C4) },
1534 { X86_64_TABLE (X86_64_C5) },
1535 { REG_TABLE (REG_C6) },
1536 { REG_TABLE (REG_C7) },
1537 /* c8 */
1538 { "enterT", { Iw, Ib } },
1539 { "leaveT", { XX } },
1540 { "Jret{|f}P", { Iw } },
1541 { "Jret{|f}P", { XX } },
1542 { "int3", { XX } },
1543 { "int", { Ib } },
1544 { X86_64_TABLE (X86_64_CE) },
1545 { "iretP", { XX } },
1546 /* d0 */
1547 { REG_TABLE (REG_D0) },
1548 { REG_TABLE (REG_D1) },
1549 { REG_TABLE (REG_D2) },
1550 { REG_TABLE (REG_D3) },
1551 { X86_64_TABLE (X86_64_D4) },
1552 { X86_64_TABLE (X86_64_D5) },
1553 { "(bad)", { XX } },
1554 { "xlat", { DSBX } },
1555 /* d8 */
1556 { FLOAT },
1557 { FLOAT },
1558 { FLOAT },
1559 { FLOAT },
1560 { FLOAT },
1561 { FLOAT },
1562 { FLOAT },
1563 { FLOAT },
1564 /* e0 */
1565 { "loopneFH", { Jb, XX, loop_jcxz_flag } },
1566 { "loopeFH", { Jb, XX, loop_jcxz_flag } },
1567 { "loopFH", { Jb, XX, loop_jcxz_flag } },
1568 { "jEcxzH", { Jb, XX, loop_jcxz_flag } },
1569 { "inB", { AL, Ib } },
1570 { "inG", { zAX, Ib } },
1571 { "outB", { Ib, AL } },
1572 { "outG", { Ib, zAX } },
1573 /* e8 */
1574 { "callT", { Jv } },
1575 { "jmpT", { Jv } },
1576 { X86_64_TABLE (X86_64_EA) },
1577 { "jmp", { Jb } },
1578 { "inB", { AL, indirDX } },
1579 { "inG", { zAX, indirDX } },
1580 { "outB", { indirDX, AL } },
1581 { "outG", { indirDX, zAX } },
1582 /* f0 */
1583 { "(bad)", { XX } }, /* lock prefix */
1584 { "icebp", { XX } },
1585 { "(bad)", { XX } }, /* repne */
1586 { "(bad)", { XX } }, /* repz */
1587 { "hlt", { XX } },
1588 { "cmc", { XX } },
1589 { REG_TABLE (REG_F6) },
1590 { REG_TABLE (REG_F7) },
1591 /* f8 */
1592 { "clc", { XX } },
1593 { "stc", { XX } },
1594 { "cli", { XX } },
1595 { "sti", { XX } },
1596 { "cld", { XX } },
1597 { "std", { XX } },
1598 { REG_TABLE (REG_FE) },
1599 { REG_TABLE (REG_FF) },
1600 };
1601
1602 static const struct dis386 dis386_twobyte[] = {
1603 /* 00 */
1604 { REG_TABLE (REG_0F00 ) },
1605 { REG_TABLE (REG_0F01 ) },
1606 { "larS", { Gv, Ew } },
1607 { "lslS", { Gv, Ew } },
1608 { "(bad)", { XX } },
1609 { "syscall", { XX } },
1610 { "clts", { XX } },
1611 { "sysretP", { XX } },
1612 /* 08 */
1613 { "invd", { XX } },
1614 { "wbinvd", { XX } },
1615 { "(bad)", { XX } },
1616 { "ud2a", { XX } },
1617 { "(bad)", { XX } },
1618 { REG_TABLE (REG_0F0D) },
1619 { "femms", { XX } },
1620 { "", { MX, EM, OPSUF } }, /* See OP_3DNowSuffix. */
1621 /* 10 */
1622 { PREFIX_TABLE (PREFIX_0F10) },
1623 { PREFIX_TABLE (PREFIX_0F11) },
1624 { PREFIX_TABLE (PREFIX_0F12) },
1625 { MOD_TABLE (MOD_0F13) },
1626 { "unpcklpX", { XM, EXx } },
1627 { "unpckhpX", { XM, EXx } },
1628 { PREFIX_TABLE (PREFIX_0F16) },
1629 { MOD_TABLE (MOD_0F17) },
1630 /* 18 */
1631 { REG_TABLE (REG_0F18) },
1632 { "nopQ", { Ev } },
1633 { "nopQ", { Ev } },
1634 { "nopQ", { Ev } },
1635 { "nopQ", { Ev } },
1636 { "nopQ", { Ev } },
1637 { "nopQ", { Ev } },
1638 { "nopQ", { Ev } },
1639 /* 20 */
1640 { MOD_TABLE (MOD_0F20) },
1641 { MOD_TABLE (MOD_0F21) },
1642 { MOD_TABLE (MOD_0F22) },
1643 { MOD_TABLE (MOD_0F23) },
1644 { MOD_TABLE (MOD_0F24) },
1645 { THREE_BYTE_TABLE (THREE_BYTE_0F25) },
1646 { MOD_TABLE (MOD_0F26) },
1647 { "(bad)", { XX } },
1648 /* 28 */
1649 { "movapX", { XM, EXx } },
1650 { "movapX", { EXxS, XM } },
1651 { PREFIX_TABLE (PREFIX_0F2A) },
1652 { PREFIX_TABLE (PREFIX_0F2B) },
1653 { PREFIX_TABLE (PREFIX_0F2C) },
1654 { PREFIX_TABLE (PREFIX_0F2D) },
1655 { PREFIX_TABLE (PREFIX_0F2E) },
1656 { PREFIX_TABLE (PREFIX_0F2F) },
1657 /* 30 */
1658 { "wrmsr", { XX } },
1659 { "rdtsc", { XX } },
1660 { "rdmsr", { XX } },
1661 { "rdpmc", { XX } },
1662 { "sysenter", { XX } },
1663 { "sysexit", { XX } },
1664 { "(bad)", { XX } },
1665 { "getsec", { XX } },
1666 /* 38 */
1667 { THREE_BYTE_TABLE (THREE_BYTE_0F38) },
1668 { "(bad)", { XX } },
1669 { THREE_BYTE_TABLE (THREE_BYTE_0F3A) },
1670 { "(bad)", { XX } },
1671 { "(bad)", { XX } },
1672 { "(bad)", { XX } },
1673 { "(bad)", { XX } },
1674 { "(bad)", { XX } },
1675 /* 40 */
1676 { "cmovoS", { Gv, Ev } },
1677 { "cmovnoS", { Gv, Ev } },
1678 { "cmovbS", { Gv, Ev } },
1679 { "cmovaeS", { Gv, Ev } },
1680 { "cmoveS", { Gv, Ev } },
1681 { "cmovneS", { Gv, Ev } },
1682 { "cmovbeS", { Gv, Ev } },
1683 { "cmovaS", { Gv, Ev } },
1684 /* 48 */
1685 { "cmovsS", { Gv, Ev } },
1686 { "cmovnsS", { Gv, Ev } },
1687 { "cmovpS", { Gv, Ev } },
1688 { "cmovnpS", { Gv, Ev } },
1689 { "cmovlS", { Gv, Ev } },
1690 { "cmovgeS", { Gv, Ev } },
1691 { "cmovleS", { Gv, Ev } },
1692 { "cmovgS", { Gv, Ev } },
1693 /* 50 */
1694 { MOD_TABLE (MOD_0F51) },
1695 { PREFIX_TABLE (PREFIX_0F51) },
1696 { PREFIX_TABLE (PREFIX_0F52) },
1697 { PREFIX_TABLE (PREFIX_0F53) },
1698 { "andpX", { XM, EXx } },
1699 { "andnpX", { XM, EXx } },
1700 { "orpX", { XM, EXx } },
1701 { "xorpX", { XM, EXx } },
1702 /* 58 */
1703 { PREFIX_TABLE (PREFIX_0F58) },
1704 { PREFIX_TABLE (PREFIX_0F59) },
1705 { PREFIX_TABLE (PREFIX_0F5A) },
1706 { PREFIX_TABLE (PREFIX_0F5B) },
1707 { PREFIX_TABLE (PREFIX_0F5C) },
1708 { PREFIX_TABLE (PREFIX_0F5D) },
1709 { PREFIX_TABLE (PREFIX_0F5E) },
1710 { PREFIX_TABLE (PREFIX_0F5F) },
1711 /* 60 */
1712 { PREFIX_TABLE (PREFIX_0F60) },
1713 { PREFIX_TABLE (PREFIX_0F61) },
1714 { PREFIX_TABLE (PREFIX_0F62) },
1715 { "packsswb", { MX, EM } },
1716 { "pcmpgtb", { MX, EM } },
1717 { "pcmpgtw", { MX, EM } },
1718 { "pcmpgtd", { MX, EM } },
1719 { "packuswb", { MX, EM } },
1720 /* 68 */
1721 { "punpckhbw", { MX, EM } },
1722 { "punpckhwd", { MX, EM } },
1723 { "punpckhdq", { MX, EM } },
1724 { "packssdw", { MX, EM } },
1725 { PREFIX_TABLE (PREFIX_0F6C) },
1726 { PREFIX_TABLE (PREFIX_0F6D) },
1727 { "movK", { MX, Edq } },
1728 { PREFIX_TABLE (PREFIX_0F6F) },
1729 /* 70 */
1730 { PREFIX_TABLE (PREFIX_0F70) },
1731 { REG_TABLE (REG_0F71) },
1732 { REG_TABLE (REG_0F72) },
1733 { REG_TABLE (REG_0F73) },
1734 { "pcmpeqb", { MX, EM } },
1735 { "pcmpeqw", { MX, EM } },
1736 { "pcmpeqd", { MX, EM } },
1737 { "emms", { XX } },
1738 /* 78 */
1739 { PREFIX_TABLE (PREFIX_0F78) },
1740 { PREFIX_TABLE (PREFIX_0F79) },
1741 { THREE_BYTE_TABLE (THREE_BYTE_0F7A) },
1742 { THREE_BYTE_TABLE (THREE_BYTE_0F7B) },
1743 { PREFIX_TABLE (PREFIX_0F7C) },
1744 { PREFIX_TABLE (PREFIX_0F7D) },
1745 { PREFIX_TABLE (PREFIX_0F7E) },
1746 { PREFIX_TABLE (PREFIX_0F7F) },
1747 /* 80 */
1748 { "joH", { Jv, XX, cond_jump_flag } },
1749 { "jnoH", { Jv, XX, cond_jump_flag } },
1750 { "jbH", { Jv, XX, cond_jump_flag } },
1751 { "jaeH", { Jv, XX, cond_jump_flag } },
1752 { "jeH", { Jv, XX, cond_jump_flag } },
1753 { "jneH", { Jv, XX, cond_jump_flag } },
1754 { "jbeH", { Jv, XX, cond_jump_flag } },
1755 { "jaH", { Jv, XX, cond_jump_flag } },
1756 /* 88 */
1757 { "jsH", { Jv, XX, cond_jump_flag } },
1758 { "jnsH", { Jv, XX, cond_jump_flag } },
1759 { "jpH", { Jv, XX, cond_jump_flag } },
1760 { "jnpH", { Jv, XX, cond_jump_flag } },
1761 { "jlH", { Jv, XX, cond_jump_flag } },
1762 { "jgeH", { Jv, XX, cond_jump_flag } },
1763 { "jleH", { Jv, XX, cond_jump_flag } },
1764 { "jgH", { Jv, XX, cond_jump_flag } },
1765 /* 90 */
1766 { "seto", { Eb } },
1767 { "setno", { Eb } },
1768 { "setb", { Eb } },
1769 { "setae", { Eb } },
1770 { "sete", { Eb } },
1771 { "setne", { Eb } },
1772 { "setbe", { Eb } },
1773 { "seta", { Eb } },
1774 /* 98 */
1775 { "sets", { Eb } },
1776 { "setns", { Eb } },
1777 { "setp", { Eb } },
1778 { "setnp", { Eb } },
1779 { "setl", { Eb } },
1780 { "setge", { Eb } },
1781 { "setle", { Eb } },
1782 { "setg", { Eb } },
1783 /* a0 */
1784 { "pushT", { fs } },
1785 { "popT", { fs } },
1786 { "cpuid", { XX } },
1787 { "btS", { Ev, Gv } },
1788 { "shldS", { Ev, Gv, Ib } },
1789 { "shldS", { Ev, Gv, CL } },
1790 { REG_TABLE (REG_0FA6) },
1791 { REG_TABLE (REG_0FA7) },
1792 /* a8 */
1793 { "pushT", { gs } },
1794 { "popT", { gs } },
1795 { "rsm", { XX } },
1796 { "btsS", { Ev, Gv } },
1797 { "shrdS", { Ev, Gv, Ib } },
1798 { "shrdS", { Ev, Gv, CL } },
1799 { REG_TABLE (REG_0FAE) },
1800 { "imulS", { Gv, Ev } },
1801 /* b0 */
1802 { "cmpxchgB", { Eb, Gb } },
1803 { "cmpxchgS", { Ev, Gv } },
1804 { MOD_TABLE (MOD_0FB2) },
1805 { "btrS", { Ev, Gv } },
1806 { MOD_TABLE (MOD_0FB4) },
1807 { MOD_TABLE (MOD_0FB5) },
1808 { "movz{bR|x}", { Gv, Eb } },
1809 { "movz{wR|x}", { Gv, Ew } }, /* yes, there really is movzww ! */
1810 /* b8 */
1811 { PREFIX_TABLE (PREFIX_0FB8) },
1812 { "ud2b", { XX } },
1813 { REG_TABLE (REG_0FBA) },
1814 { "btcS", { Ev, Gv } },
1815 { "bsfS", { Gv, Ev } },
1816 { PREFIX_TABLE (PREFIX_0FBD) },
1817 { "movs{bR|x}", { Gv, Eb } },
1818 { "movs{wR|x}", { Gv, Ew } }, /* yes, there really is movsww ! */
1819 /* c0 */
1820 { "xaddB", { Eb, Gb } },
1821 { "xaddS", { Ev, Gv } },
1822 { PREFIX_TABLE (PREFIX_0FC2) },
1823 { PREFIX_TABLE (PREFIX_0FC3) },
1824 { "pinsrw", { MX, Edqw, Ib } },
1825 { "pextrw", { Gdq, MS, Ib } },
1826 { "shufpX", { XM, EXx, Ib } },
1827 { REG_TABLE (REG_0FC7) },
1828 /* c8 */
1829 { "bswap", { RMeAX } },
1830 { "bswap", { RMeCX } },
1831 { "bswap", { RMeDX } },
1832 { "bswap", { RMeBX } },
1833 { "bswap", { RMeSP } },
1834 { "bswap", { RMeBP } },
1835 { "bswap", { RMeSI } },
1836 { "bswap", { RMeDI } },
1837 /* d0 */
1838 { PREFIX_TABLE (PREFIX_0FD0) },
1839 { "psrlw", { MX, EM } },
1840 { "psrld", { MX, EM } },
1841 { "psrlq", { MX, EM } },
1842 { "paddq", { MX, EM } },
1843 { "pmullw", { MX, EM } },
1844 { PREFIX_TABLE (PREFIX_0FD6) },
1845 { MOD_TABLE (MOD_0FD7) },
1846 /* d8 */
1847 { "psubusb", { MX, EM } },
1848 { "psubusw", { MX, EM } },
1849 { "pminub", { MX, EM } },
1850 { "pand", { MX, EM } },
1851 { "paddusb", { MX, EM } },
1852 { "paddusw", { MX, EM } },
1853 { "pmaxub", { MX, EM } },
1854 { "pandn", { MX, EM } },
1855 /* e0 */
1856 { "pavgb", { MX, EM } },
1857 { "psraw", { MX, EM } },
1858 { "psrad", { MX, EM } },
1859 { "pavgw", { MX, EM } },
1860 { "pmulhuw", { MX, EM } },
1861 { "pmulhw", { MX, EM } },
1862 { PREFIX_TABLE (PREFIX_0FE6) },
1863 { PREFIX_TABLE (PREFIX_0FE7) },
1864 /* e8 */
1865 { "psubsb", { MX, EM } },
1866 { "psubsw", { MX, EM } },
1867 { "pminsw", { MX, EM } },
1868 { "por", { MX, EM } },
1869 { "paddsb", { MX, EM } },
1870 { "paddsw", { MX, EM } },
1871 { "pmaxsw", { MX, EM } },
1872 { "pxor", { MX, EM } },
1873 /* f0 */
1874 { PREFIX_TABLE (PREFIX_0FF0) },
1875 { "psllw", { MX, EM } },
1876 { "pslld", { MX, EM } },
1877 { "psllq", { MX, EM } },
1878 { "pmuludq", { MX, EM } },
1879 { "pmaddwd", { MX, EM } },
1880 { "psadbw", { MX, EM } },
1881 { PREFIX_TABLE (PREFIX_0FF7) },
1882 /* f8 */
1883 { "psubb", { MX, EM } },
1884 { "psubw", { MX, EM } },
1885 { "psubd", { MX, EM } },
1886 { "psubq", { MX, EM } },
1887 { "paddb", { MX, EM } },
1888 { "paddw", { MX, EM } },
1889 { "paddd", { MX, EM } },
1890 { "(bad)", { XX } },
1891 };
1892
1893 static const unsigned char onebyte_has_modrm[256] = {
1894 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
1895 /* ------------------------------- */
1896 /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
1897 /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
1898 /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
1899 /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
1900 /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
1901 /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
1902 /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
1903 /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
1904 /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
1905 /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
1906 /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
1907 /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
1908 /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
1909 /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
1910 /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
1911 /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1 /* f0 */
1912 /* ------------------------------- */
1913 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
1914 };
1915
1916 static const unsigned char twobyte_has_modrm[256] = {
1917 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
1918 /* ------------------------------- */
1919 /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
1920 /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
1921 /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
1922 /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
1923 /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
1924 /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
1925 /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
1926 /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
1927 /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
1928 /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
1929 /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
1930 /* b0 */ 1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1, /* bf */
1931 /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
1932 /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
1933 /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
1934 /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0 /* ff */
1935 /* ------------------------------- */
1936 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
1937 };
1938
1939 static char obuf[100];
1940 static char *obufp;
1941 static char *mnemonicendp;
1942 static char scratchbuf[100];
1943 static unsigned char *start_codep;
1944 static unsigned char *insn_codep;
1945 static unsigned char *codep;
1946 static const char *lock_prefix;
1947 static const char *data_prefix;
1948 static const char *addr_prefix;
1949 static const char *repz_prefix;
1950 static const char *repnz_prefix;
1951 static disassemble_info *the_info;
1952 static struct
1953 {
1954 int mod;
1955 int reg;
1956 int rm;
1957 }
1958 modrm;
1959 static unsigned char need_modrm;
1960 static struct
1961 {
1962 int register_specifier;
1963 int length;
1964 int prefix;
1965 int w;
1966 }
1967 vex;
1968 static unsigned char need_vex;
1969 static unsigned char need_vex_reg;
1970 static unsigned char vex_w_done;
1971
1972 struct op
1973 {
1974 const char *name;
1975 unsigned int len;
1976 };
1977
1978 /* If we are accessing mod/rm/reg without need_modrm set, then the
1979 values are stale. Hitting this abort likely indicates that you
1980 need to update onebyte_has_modrm or twobyte_has_modrm. */
1981 #define MODRM_CHECK if (!need_modrm) abort ()
1982
1983 static const char **names64;
1984 static const char **names32;
1985 static const char **names16;
1986 static const char **names8;
1987 static const char **names8rex;
1988 static const char **names_seg;
1989 static const char *index64;
1990 static const char *index32;
1991 static const char **index16;
1992
1993 static const char *intel_names64[] = {
1994 "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
1995 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
1996 };
1997 static const char *intel_names32[] = {
1998 "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
1999 "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
2000 };
2001 static const char *intel_names16[] = {
2002 "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
2003 "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
2004 };
2005 static const char *intel_names8[] = {
2006 "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
2007 };
2008 static const char *intel_names8rex[] = {
2009 "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
2010 "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
2011 };
2012 static const char *intel_names_seg[] = {
2013 "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
2014 };
2015 static const char *intel_index64 = "riz";
2016 static const char *intel_index32 = "eiz";
2017 static const char *intel_index16[] = {
2018 "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
2019 };
2020
2021 static const char *att_names64[] = {
2022 "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
2023 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
2024 };
2025 static const char *att_names32[] = {
2026 "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
2027 "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
2028 };
2029 static const char *att_names16[] = {
2030 "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
2031 "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
2032 };
2033 static const char *att_names8[] = {
2034 "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
2035 };
2036 static const char *att_names8rex[] = {
2037 "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
2038 "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
2039 };
2040 static const char *att_names_seg[] = {
2041 "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
2042 };
2043 static const char *att_index64 = "%riz";
2044 static const char *att_index32 = "%eiz";
2045 static const char *att_index16[] = {
2046 "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
2047 };
2048
2049 static const struct dis386 reg_table[][8] = {
2050 /* REG_80 */
2051 {
2052 { "addA", { Eb, Ib } },
2053 { "orA", { Eb, Ib } },
2054 { "adcA", { Eb, Ib } },
2055 { "sbbA", { Eb, Ib } },
2056 { "andA", { Eb, Ib } },
2057 { "subA", { Eb, Ib } },
2058 { "xorA", { Eb, Ib } },
2059 { "cmpA", { Eb, Ib } },
2060 },
2061 /* REG_81 */
2062 {
2063 { "addQ", { Ev, Iv } },
2064 { "orQ", { Ev, Iv } },
2065 { "adcQ", { Ev, Iv } },
2066 { "sbbQ", { Ev, Iv } },
2067 { "andQ", { Ev, Iv } },
2068 { "subQ", { Ev, Iv } },
2069 { "xorQ", { Ev, Iv } },
2070 { "cmpQ", { Ev, Iv } },
2071 },
2072 /* REG_82 */
2073 {
2074 { "addQ", { Ev, sIb } },
2075 { "orQ", { Ev, sIb } },
2076 { "adcQ", { Ev, sIb } },
2077 { "sbbQ", { Ev, sIb } },
2078 { "andQ", { Ev, sIb } },
2079 { "subQ", { Ev, sIb } },
2080 { "xorQ", { Ev, sIb } },
2081 { "cmpQ", { Ev, sIb } },
2082 },
2083 /* REG_8F */
2084 {
2085 { "popU", { stackEv } },
2086 { "(bad)", { XX } },
2087 { "(bad)", { XX } },
2088 { "(bad)", { XX } },
2089 { "(bad)", { XX } },
2090 { "(bad)", { XX } },
2091 { "(bad)", { XX } },
2092 { "(bad)", { XX } },
2093 },
2094 /* REG_C0 */
2095 {
2096 { "rolA", { Eb, Ib } },
2097 { "rorA", { Eb, Ib } },
2098 { "rclA", { Eb, Ib } },
2099 { "rcrA", { Eb, Ib } },
2100 { "shlA", { Eb, Ib } },
2101 { "shrA", { Eb, Ib } },
2102 { "(bad)", { XX } },
2103 { "sarA", { Eb, Ib } },
2104 },
2105 /* REG_C1 */
2106 {
2107 { "rolQ", { Ev, Ib } },
2108 { "rorQ", { Ev, Ib } },
2109 { "rclQ", { Ev, Ib } },
2110 { "rcrQ", { Ev, Ib } },
2111 { "shlQ", { Ev, Ib } },
2112 { "shrQ", { Ev, Ib } },
2113 { "(bad)", { XX } },
2114 { "sarQ", { Ev, Ib } },
2115 },
2116 /* REG_C6 */
2117 {
2118 { "movA", { Eb, Ib } },
2119 { "(bad)", { XX } },
2120 { "(bad)", { XX } },
2121 { "(bad)", { XX } },
2122 { "(bad)", { XX } },
2123 { "(bad)", { XX } },
2124 { "(bad)", { XX } },
2125 { "(bad)", { XX } },
2126 },
2127 /* REG_C7 */
2128 {
2129 { "movQ", { Ev, Iv } },
2130 { "(bad)", { XX } },
2131 { "(bad)", { XX } },
2132 { "(bad)", { XX } },
2133 { "(bad)", { XX } },
2134 { "(bad)", { XX } },
2135 { "(bad)", { XX } },
2136 { "(bad)", { XX } },
2137 },
2138 /* REG_D0 */
2139 {
2140 { "rolA", { Eb, I1 } },
2141 { "rorA", { Eb, I1 } },
2142 { "rclA", { Eb, I1 } },
2143 { "rcrA", { Eb, I1 } },
2144 { "shlA", { Eb, I1 } },
2145 { "shrA", { Eb, I1 } },
2146 { "(bad)", { XX } },
2147 { "sarA", { Eb, I1 } },
2148 },
2149 /* REG_D1 */
2150 {
2151 { "rolQ", { Ev, I1 } },
2152 { "rorQ", { Ev, I1 } },
2153 { "rclQ", { Ev, I1 } },
2154 { "rcrQ", { Ev, I1 } },
2155 { "shlQ", { Ev, I1 } },
2156 { "shrQ", { Ev, I1 } },
2157 { "(bad)", { XX } },
2158 { "sarQ", { Ev, I1 } },
2159 },
2160 /* REG_D2 */
2161 {
2162 { "rolA", { Eb, CL } },
2163 { "rorA", { Eb, CL } },
2164 { "rclA", { Eb, CL } },
2165 { "rcrA", { Eb, CL } },
2166 { "shlA", { Eb, CL } },
2167 { "shrA", { Eb, CL } },
2168 { "(bad)", { XX } },
2169 { "sarA", { Eb, CL } },
2170 },
2171 /* REG_D3 */
2172 {
2173 { "rolQ", { Ev, CL } },
2174 { "rorQ", { Ev, CL } },
2175 { "rclQ", { Ev, CL } },
2176 { "rcrQ", { Ev, CL } },
2177 { "shlQ", { Ev, CL } },
2178 { "shrQ", { Ev, CL } },
2179 { "(bad)", { XX } },
2180 { "sarQ", { Ev, CL } },
2181 },
2182 /* REG_F6 */
2183 {
2184 { "testA", { Eb, Ib } },
2185 { "(bad)", { XX } },
2186 { "notA", { Eb } },
2187 { "negA", { Eb } },
2188 { "mulA", { Eb } }, /* Don't print the implicit %al register, */
2189 { "imulA", { Eb } }, /* to distinguish these opcodes from other */
2190 { "divA", { Eb } }, /* mul/imul opcodes. Do the same for div */
2191 { "idivA", { Eb } }, /* and idiv for consistency. */
2192 },
2193 /* REG_F7 */
2194 {
2195 { "testQ", { Ev, Iv } },
2196 { "(bad)", { XX } },
2197 { "notQ", { Ev } },
2198 { "negQ", { Ev } },
2199 { "mulQ", { Ev } }, /* Don't print the implicit register. */
2200 { "imulQ", { Ev } },
2201 { "divQ", { Ev } },
2202 { "idivQ", { Ev } },
2203 },
2204 /* REG_FE */
2205 {
2206 { "incA", { Eb } },
2207 { "decA", { Eb } },
2208 { "(bad)", { XX } },
2209 { "(bad)", { XX } },
2210 { "(bad)", { XX } },
2211 { "(bad)", { XX } },
2212 { "(bad)", { XX } },
2213 { "(bad)", { XX } },
2214 },
2215 /* REG_FF */
2216 {
2217 { "incQ", { Ev } },
2218 { "decQ", { Ev } },
2219 { "callT", { indirEv } },
2220 { "JcallT", { indirEp } },
2221 { "jmpT", { indirEv } },
2222 { "JjmpT", { indirEp } },
2223 { "pushU", { stackEv } },
2224 { "(bad)", { XX } },
2225 },
2226 /* REG_0F00 */
2227 {
2228 { "sldtD", { Sv } },
2229 { "strD", { Sv } },
2230 { "lldt", { Ew } },
2231 { "ltr", { Ew } },
2232 { "verr", { Ew } },
2233 { "verw", { Ew } },
2234 { "(bad)", { XX } },
2235 { "(bad)", { XX } },
2236 },
2237 /* REG_0F01 */
2238 {
2239 { MOD_TABLE (MOD_0F01_REG_0) },
2240 { MOD_TABLE (MOD_0F01_REG_1) },
2241 { MOD_TABLE (MOD_0F01_REG_2) },
2242 { MOD_TABLE (MOD_0F01_REG_3) },
2243 { "smswD", { Sv } },
2244 { "(bad)", { XX } },
2245 { "lmsw", { Ew } },
2246 { MOD_TABLE (MOD_0F01_REG_7) },
2247 },
2248 /* REG_0F0D */
2249 {
2250 { "prefetch", { Eb } },
2251 { "prefetchw", { Eb } },
2252 { "(bad)", { XX } },
2253 { "(bad)", { XX } },
2254 { "(bad)", { XX } },
2255 { "(bad)", { XX } },
2256 { "(bad)", { XX } },
2257 { "(bad)", { XX } },
2258 },
2259 /* REG_0F18 */
2260 {
2261 { MOD_TABLE (MOD_0F18_REG_0) },
2262 { MOD_TABLE (MOD_0F18_REG_1) },
2263 { MOD_TABLE (MOD_0F18_REG_2) },
2264 { MOD_TABLE (MOD_0F18_REG_3) },
2265 { "(bad)", { XX } },
2266 { "(bad)", { XX } },
2267 { "(bad)", { XX } },
2268 { "(bad)", { XX } },
2269 },
2270 /* REG_0F71 */
2271 {
2272 { "(bad)", { XX } },
2273 { "(bad)", { XX } },
2274 { MOD_TABLE (MOD_0F71_REG_2) },
2275 { "(bad)", { XX } },
2276 { MOD_TABLE (MOD_0F71_REG_4) },
2277 { "(bad)", { XX } },
2278 { MOD_TABLE (MOD_0F71_REG_6) },
2279 { "(bad)", { XX } },
2280 },
2281 /* REG_0F72 */
2282 {
2283 { "(bad)", { XX } },
2284 { "(bad)", { XX } },
2285 { MOD_TABLE (MOD_0F72_REG_2) },
2286 { "(bad)", { XX } },
2287 { MOD_TABLE (MOD_0F72_REG_4) },
2288 { "(bad)", { XX } },
2289 { MOD_TABLE (MOD_0F72_REG_6) },
2290 { "(bad)", { XX } },
2291 },
2292 /* REG_0F73 */
2293 {
2294 { "(bad)", { XX } },
2295 { "(bad)", { XX } },
2296 { MOD_TABLE (MOD_0F73_REG_2) },
2297 { MOD_TABLE (MOD_0F73_REG_3) },
2298 { "(bad)", { XX } },
2299 { "(bad)", { XX } },
2300 { MOD_TABLE (MOD_0F73_REG_6) },
2301 { MOD_TABLE (MOD_0F73_REG_7) },
2302 },
2303 /* REG_0FA6 */
2304 {
2305 { "montmul", { { OP_0f07, 0 } } },
2306 { "xsha1", { { OP_0f07, 0 } } },
2307 { "xsha256", { { OP_0f07, 0 } } },
2308 { "(bad)", { { OP_0f07, 0 } } },
2309 { "(bad)", { { OP_0f07, 0 } } },
2310 { "(bad)", { { OP_0f07, 0 } } },
2311 { "(bad)", { { OP_0f07, 0 } } },
2312 { "(bad)", { { OP_0f07, 0 } } },
2313 },
2314 /* REG_0FA7 */
2315 {
2316 { "xstore-rng", { { OP_0f07, 0 } } },
2317 { "xcrypt-ecb", { { OP_0f07, 0 } } },
2318 { "xcrypt-cbc", { { OP_0f07, 0 } } },
2319 { "xcrypt-ctr", { { OP_0f07, 0 } } },
2320 { "xcrypt-cfb", { { OP_0f07, 0 } } },
2321 { "xcrypt-ofb", { { OP_0f07, 0 } } },
2322 { "(bad)", { { OP_0f07, 0 } } },
2323 { "(bad)", { { OP_0f07, 0 } } },
2324 },
2325 /* REG_0FAE */
2326 {
2327 { MOD_TABLE (MOD_0FAE_REG_0) },
2328 { MOD_TABLE (MOD_0FAE_REG_1) },
2329 { MOD_TABLE (MOD_0FAE_REG_2) },
2330 { MOD_TABLE (MOD_0FAE_REG_3) },
2331 { MOD_TABLE (MOD_0FAE_REG_4) },
2332 { MOD_TABLE (MOD_0FAE_REG_5) },
2333 { MOD_TABLE (MOD_0FAE_REG_6) },
2334 { MOD_TABLE (MOD_0FAE_REG_7) },
2335 },
2336 /* REG_0FBA */
2337 {
2338 { "(bad)", { XX } },
2339 { "(bad)", { XX } },
2340 { "(bad)", { XX } },
2341 { "(bad)", { XX } },
2342 { "btQ", { Ev, Ib } },
2343 { "btsQ", { Ev, Ib } },
2344 { "btrQ", { Ev, Ib } },
2345 { "btcQ", { Ev, Ib } },
2346 },
2347 /* REG_0FC7 */
2348 {
2349 { "(bad)", { XX } },
2350 { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } } },
2351 { "(bad)", { XX } },
2352 { "(bad)", { XX } },
2353 { "(bad)", { XX } },
2354 { "(bad)", { XX } },
2355 { MOD_TABLE (MOD_0FC7_REG_6) },
2356 { MOD_TABLE (MOD_0FC7_REG_7) },
2357 },
2358 /* REG_VEX_71 */
2359 {
2360 { "(bad)", { XX } },
2361 { "(bad)", { XX } },
2362 { MOD_TABLE (MOD_VEX_71_REG_2) },
2363 { "(bad)", { XX } },
2364 { MOD_TABLE (MOD_VEX_71_REG_4) },
2365 { "(bad)", { XX } },
2366 { MOD_TABLE (MOD_VEX_71_REG_6) },
2367 { "(bad)", { XX } },
2368 },
2369 /* REG_VEX_72 */
2370 {
2371 { "(bad)", { XX } },
2372 { "(bad)", { XX } },
2373 { MOD_TABLE (MOD_VEX_72_REG_2) },
2374 { "(bad)", { XX } },
2375 { MOD_TABLE (MOD_VEX_72_REG_4) },
2376 { "(bad)", { XX } },
2377 { MOD_TABLE (MOD_VEX_72_REG_6) },
2378 { "(bad)", { XX } },
2379 },
2380 /* REG_VEX_73 */
2381 {
2382 { "(bad)", { XX } },
2383 { "(bad)", { XX } },
2384 { MOD_TABLE (MOD_VEX_73_REG_2) },
2385 { MOD_TABLE (MOD_VEX_73_REG_3) },
2386 { "(bad)", { XX } },
2387 { "(bad)", { XX } },
2388 { MOD_TABLE (MOD_VEX_73_REG_6) },
2389 { MOD_TABLE (MOD_VEX_73_REG_7) },
2390 },
2391 /* REG_VEX_AE */
2392 {
2393 { "(bad)", { XX } },
2394 { "(bad)", { XX } },
2395 { MOD_TABLE (MOD_VEX_AE_REG_2) },
2396 { MOD_TABLE (MOD_VEX_AE_REG_3) },
2397 { "(bad)", { XX } },
2398 { "(bad)", { XX } },
2399 { "(bad)", { XX } },
2400 { "(bad)", { XX } },
2401 },
2402 };
2403
2404 static const struct dis386 prefix_table[][4] = {
2405 /* PREFIX_90 */
2406 {
2407 { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } } },
2408 { "pause", { XX } },
2409 { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } } },
2410 { "(bad)", { XX } },
2411 },
2412
2413 /* PREFIX_0F10 */
2414 {
2415 { "movups", { XM, EXx } },
2416 { "movss", { XM, EXd } },
2417 { "movupd", { XM, EXx } },
2418 { "movsd", { XM, EXq } },
2419 },
2420
2421 /* PREFIX_0F11 */
2422 {
2423 { "movups", { EXxS, XM } },
2424 { "movss", { EXdS, XM } },
2425 { "movupd", { EXxS, XM } },
2426 { "movsd", { EXqS, XM } },
2427 },
2428
2429 /* PREFIX_0F12 */
2430 {
2431 { MOD_TABLE (MOD_0F12_PREFIX_0) },
2432 { "movsldup", { XM, EXx } },
2433 { "movlpd", { XM, EXq } },
2434 { "movddup", { XM, EXq } },
2435 },
2436
2437 /* PREFIX_0F16 */
2438 {
2439 { MOD_TABLE (MOD_0F16_PREFIX_0) },
2440 { "movshdup", { XM, EXx } },
2441 { "movhpd", { XM, EXq } },
2442 { "(bad)", { XX } },
2443 },
2444
2445 /* PREFIX_0F2A */
2446 {
2447 { "cvtpi2ps", { XM, EMCq } },
2448 { "cvtsi2ss%LQ", { XM, Ev } },
2449 { "cvtpi2pd", { XM, EMCq } },
2450 { "cvtsi2sd%LQ", { XM, Ev } },
2451 },
2452
2453 /* PREFIX_0F2B */
2454 {
2455 { MOD_TABLE (MOD_0F2B_PREFIX_0) },
2456 { MOD_TABLE (MOD_0F2B_PREFIX_1) },
2457 { MOD_TABLE (MOD_0F2B_PREFIX_2) },
2458 { MOD_TABLE (MOD_0F2B_PREFIX_3) },
2459 },
2460
2461 /* PREFIX_0F2C */
2462 {
2463 { "cvttps2pi", { MXC, EXq } },
2464 { "cvttss2siY", { Gv, EXd } },
2465 { "cvttpd2pi", { MXC, EXx } },
2466 { "cvttsd2siY", { Gv, EXq } },
2467 },
2468
2469 /* PREFIX_0F2D */
2470 {
2471 { "cvtps2pi", { MXC, EXq } },
2472 { "cvtss2siY", { Gv, EXd } },
2473 { "cvtpd2pi", { MXC, EXx } },
2474 { "cvtsd2siY", { Gv, EXq } },
2475 },
2476
2477 /* PREFIX_0F2E */
2478 {
2479 { "ucomiss",{ XM, EXd } },
2480 { "(bad)", { XX } },
2481 { "ucomisd",{ XM, EXq } },
2482 { "(bad)", { XX } },
2483 },
2484
2485 /* PREFIX_0F2F */
2486 {
2487 { "comiss", { XM, EXd } },
2488 { "(bad)", { XX } },
2489 { "comisd", { XM, EXq } },
2490 { "(bad)", { XX } },
2491 },
2492
2493 /* PREFIX_0F51 */
2494 {
2495 { "sqrtps", { XM, EXx } },
2496 { "sqrtss", { XM, EXd } },
2497 { "sqrtpd", { XM, EXx } },
2498 { "sqrtsd", { XM, EXq } },
2499 },
2500
2501 /* PREFIX_0F52 */
2502 {
2503 { "rsqrtps",{ XM, EXx } },
2504 { "rsqrtss",{ XM, EXd } },
2505 { "(bad)", { XX } },
2506 { "(bad)", { XX } },
2507 },
2508
2509 /* PREFIX_0F53 */
2510 {
2511 { "rcpps", { XM, EXx } },
2512 { "rcpss", { XM, EXd } },
2513 { "(bad)", { XX } },
2514 { "(bad)", { XX } },
2515 },
2516
2517 /* PREFIX_0F58 */
2518 {
2519 { "addps", { XM, EXx } },
2520 { "addss", { XM, EXd } },
2521 { "addpd", { XM, EXx } },
2522 { "addsd", { XM, EXq } },
2523 },
2524
2525 /* PREFIX_0F59 */
2526 {
2527 { "mulps", { XM, EXx } },
2528 { "mulss", { XM, EXd } },
2529 { "mulpd", { XM, EXx } },
2530 { "mulsd", { XM, EXq } },
2531 },
2532
2533 /* PREFIX_0F5A */
2534 {
2535 { "cvtps2pd", { XM, EXq } },
2536 { "cvtss2sd", { XM, EXd } },
2537 { "cvtpd2ps", { XM, EXx } },
2538 { "cvtsd2ss", { XM, EXq } },
2539 },
2540
2541 /* PREFIX_0F5B */
2542 {
2543 { "cvtdq2ps", { XM, EXx } },
2544 { "cvttps2dq", { XM, EXx } },
2545 { "cvtps2dq", { XM, EXx } },
2546 { "(bad)", { XX } },
2547 },
2548
2549 /* PREFIX_0F5C */
2550 {
2551 { "subps", { XM, EXx } },
2552 { "subss", { XM, EXd } },
2553 { "subpd", { XM, EXx } },
2554 { "subsd", { XM, EXq } },
2555 },
2556
2557 /* PREFIX_0F5D */
2558 {
2559 { "minps", { XM, EXx } },
2560 { "minss", { XM, EXd } },
2561 { "minpd", { XM, EXx } },
2562 { "minsd", { XM, EXq } },
2563 },
2564
2565 /* PREFIX_0F5E */
2566 {
2567 { "divps", { XM, EXx } },
2568 { "divss", { XM, EXd } },
2569 { "divpd", { XM, EXx } },
2570 { "divsd", { XM, EXq } },
2571 },
2572
2573 /* PREFIX_0F5F */
2574 {
2575 { "maxps", { XM, EXx } },
2576 { "maxss", { XM, EXd } },
2577 { "maxpd", { XM, EXx } },
2578 { "maxsd", { XM, EXq } },
2579 },
2580
2581 /* PREFIX_0F60 */
2582 {
2583 { "punpcklbw",{ MX, EMd } },
2584 { "(bad)", { XX } },
2585 { "punpcklbw",{ MX, EMx } },
2586 { "(bad)", { XX } },
2587 },
2588
2589 /* PREFIX_0F61 */
2590 {
2591 { "punpcklwd",{ MX, EMd } },
2592 { "(bad)", { XX } },
2593 { "punpcklwd",{ MX, EMx } },
2594 { "(bad)", { XX } },
2595 },
2596
2597 /* PREFIX_0F62 */
2598 {
2599 { "punpckldq",{ MX, EMd } },
2600 { "(bad)", { XX } },
2601 { "punpckldq",{ MX, EMx } },
2602 { "(bad)", { XX } },
2603 },
2604
2605 /* PREFIX_0F6C */
2606 {
2607 { "(bad)", { XX } },
2608 { "(bad)", { XX } },
2609 { "punpcklqdq", { XM, EXx } },
2610 { "(bad)", { XX } },
2611 },
2612
2613 /* PREFIX_0F6D */
2614 {
2615 { "(bad)", { XX } },
2616 { "(bad)", { XX } },
2617 { "punpckhqdq", { XM, EXx } },
2618 { "(bad)", { XX } },
2619 },
2620
2621 /* PREFIX_0F6F */
2622 {
2623 { "movq", { MX, EM } },
2624 { "movdqu", { XM, EXx } },
2625 { "movdqa", { XM, EXx } },
2626 { "(bad)", { XX } },
2627 },
2628
2629 /* PREFIX_0F70 */
2630 {
2631 { "pshufw", { MX, EM, Ib } },
2632 { "pshufhw",{ XM, EXx, Ib } },
2633 { "pshufd", { XM, EXx, Ib } },
2634 { "pshuflw",{ XM, EXx, Ib } },
2635 },
2636
2637 /* PREFIX_0F73_REG_3 */
2638 {
2639 { "(bad)", { XX } },
2640 { "(bad)", { XX } },
2641 { "psrldq", { XS, Ib } },
2642 { "(bad)", { XX } },
2643 },
2644
2645 /* PREFIX_0F73_REG_7 */
2646 {
2647 { "(bad)", { XX } },
2648 { "(bad)", { XX } },
2649 { "pslldq", { XS, Ib } },
2650 { "(bad)", { XX } },
2651 },
2652
2653 /* PREFIX_0F78 */
2654 {
2655 {"vmread", { Em, Gm } },
2656 {"(bad)", { XX } },
2657 {"extrq", { XS, Ib, Ib } },
2658 {"insertq", { XM, XS, Ib, Ib } },
2659 },
2660
2661 /* PREFIX_0F79 */
2662 {
2663 {"vmwrite", { Gm, Em } },
2664 {"(bad)", { XX } },
2665 {"extrq", { XM, XS } },
2666 {"insertq", { XM, XS } },
2667 },
2668
2669 /* PREFIX_0F7C */
2670 {
2671 { "(bad)", { XX } },
2672 { "(bad)", { XX } },
2673 { "haddpd", { XM, EXx } },
2674 { "haddps", { XM, EXx } },
2675 },
2676
2677 /* PREFIX_0F7D */
2678 {
2679 { "(bad)", { XX } },
2680 { "(bad)", { XX } },
2681 { "hsubpd", { XM, EXx } },
2682 { "hsubps", { XM, EXx } },
2683 },
2684
2685 /* PREFIX_0F7E */
2686 {
2687 { "movK", { Edq, MX } },
2688 { "movq", { XM, EXq } },
2689 { "movK", { Edq, XM } },
2690 { "(bad)", { XX } },
2691 },
2692
2693 /* PREFIX_0F7F */
2694 {
2695 { "movq", { EMS, MX } },
2696 { "movdqu", { EXxS, XM } },
2697 { "movdqa", { EXxS, XM } },
2698 { "(bad)", { XX } },
2699 },
2700
2701 /* PREFIX_0FB8 */
2702 {
2703 { "(bad)", { XX } },
2704 { "popcntS", { Gv, Ev } },
2705 { "(bad)", { XX } },
2706 { "(bad)", { XX } },
2707 },
2708
2709 /* PREFIX_0FBD */
2710 {
2711 { "bsrS", { Gv, Ev } },
2712 { "lzcntS", { Gv, Ev } },
2713 { "bsrS", { Gv, Ev } },
2714 { "(bad)", { XX } },
2715 },
2716
2717 /* PREFIX_0FC2 */
2718 {
2719 { "cmpps", { XM, EXx, CMP } },
2720 { "cmpss", { XM, EXd, CMP } },
2721 { "cmppd", { XM, EXx, CMP } },
2722 { "cmpsd", { XM, EXq, CMP } },
2723 },
2724
2725 /* PREFIX_0FC3 */
2726 {
2727 { "movntiS", { Ma, Gv } },
2728 { "(bad)", { XX } },
2729 { "(bad)", { XX } },
2730 { "(bad)", { XX } },
2731 },
2732
2733 /* PREFIX_0FC7_REG_6 */
2734 {
2735 { "vmptrld",{ Mq } },
2736 { "vmxon", { Mq } },
2737 { "vmclear",{ Mq } },
2738 { "(bad)", { XX } },
2739 },
2740
2741 /* PREFIX_0FD0 */
2742 {
2743 { "(bad)", { XX } },
2744 { "(bad)", { XX } },
2745 { "addsubpd", { XM, EXx } },
2746 { "addsubps", { XM, EXx } },
2747 },
2748
2749 /* PREFIX_0FD6 */
2750 {
2751 { "(bad)", { XX } },
2752 { "movq2dq",{ XM, MS } },
2753 { "movq", { EXqS, XM } },
2754 { "movdq2q",{ MX, XS } },
2755 },
2756
2757 /* PREFIX_0FE6 */
2758 {
2759 { "(bad)", { XX } },
2760 { "cvtdq2pd", { XM, EXq } },
2761 { "cvttpd2dq", { XM, EXx } },
2762 { "cvtpd2dq", { XM, EXx } },
2763 },
2764
2765 /* PREFIX_0FE7 */
2766 {
2767 { "movntq", { Mq, MX } },
2768 { "(bad)", { XX } },
2769 { MOD_TABLE (MOD_0FE7_PREFIX_2) },
2770 { "(bad)", { XX } },
2771 },
2772
2773 /* PREFIX_0FF0 */
2774 {
2775 { "(bad)", { XX } },
2776 { "(bad)", { XX } },
2777 { "(bad)", { XX } },
2778 { MOD_TABLE (MOD_0FF0_PREFIX_3) },
2779 },
2780
2781 /* PREFIX_0FF7 */
2782 {
2783 { "maskmovq", { MX, MS } },
2784 { "(bad)", { XX } },
2785 { "maskmovdqu", { XM, XS } },
2786 { "(bad)", { XX } },
2787 },
2788
2789 /* PREFIX_0F3810 */
2790 {
2791 { "(bad)", { XX } },
2792 { "(bad)", { XX } },
2793 { "pblendvb", { XM, EXx, XMM0 } },
2794 { "(bad)", { XX } },
2795 },
2796
2797 /* PREFIX_0F3814 */
2798 {
2799 { "(bad)", { XX } },
2800 { "(bad)", { XX } },
2801 { "blendvps", { XM, EXx, XMM0 } },
2802 { "(bad)", { XX } },
2803 },
2804
2805 /* PREFIX_0F3815 */
2806 {
2807 { "(bad)", { XX } },
2808 { "(bad)", { XX } },
2809 { "blendvpd", { XM, EXx, XMM0 } },
2810 { "(bad)", { XX } },
2811 },
2812
2813 /* PREFIX_0F3817 */
2814 {
2815 { "(bad)", { XX } },
2816 { "(bad)", { XX } },
2817 { "ptest", { XM, EXx } },
2818 { "(bad)", { XX } },
2819 },
2820
2821 /* PREFIX_0F3820 */
2822 {
2823 { "(bad)", { XX } },
2824 { "(bad)", { XX } },
2825 { "pmovsxbw", { XM, EXq } },
2826 { "(bad)", { XX } },
2827 },
2828
2829 /* PREFIX_0F3821 */
2830 {
2831 { "(bad)", { XX } },
2832 { "(bad)", { XX } },
2833 { "pmovsxbd", { XM, EXd } },
2834 { "(bad)", { XX } },
2835 },
2836
2837 /* PREFIX_0F3822 */
2838 {
2839 { "(bad)", { XX } },
2840 { "(bad)", { XX } },
2841 { "pmovsxbq", { XM, EXw } },
2842 { "(bad)", { XX } },
2843 },
2844
2845 /* PREFIX_0F3823 */
2846 {
2847 { "(bad)", { XX } },
2848 { "(bad)", { XX } },
2849 { "pmovsxwd", { XM, EXq } },
2850 { "(bad)", { XX } },
2851 },
2852
2853 /* PREFIX_0F3824 */
2854 {
2855 { "(bad)", { XX } },
2856 { "(bad)", { XX } },
2857 { "pmovsxwq", { XM, EXd } },
2858 { "(bad)", { XX } },
2859 },
2860
2861 /* PREFIX_0F3825 */
2862 {
2863 { "(bad)", { XX } },
2864 { "(bad)", { XX } },
2865 { "pmovsxdq", { XM, EXq } },
2866 { "(bad)", { XX } },
2867 },
2868
2869 /* PREFIX_0F3828 */
2870 {
2871 { "(bad)", { XX } },
2872 { "(bad)", { XX } },
2873 { "pmuldq", { XM, EXx } },
2874 { "(bad)", { XX } },
2875 },
2876
2877 /* PREFIX_0F3829 */
2878 {
2879 { "(bad)", { XX } },
2880 { "(bad)", { XX } },
2881 { "pcmpeqq", { XM, EXx } },
2882 { "(bad)", { XX } },
2883 },
2884
2885 /* PREFIX_0F382A */
2886 {
2887 { "(bad)", { XX } },
2888 { "(bad)", { XX } },
2889 { MOD_TABLE (MOD_0F382A_PREFIX_2) },
2890 { "(bad)", { XX } },
2891 },
2892
2893 /* PREFIX_0F382B */
2894 {
2895 { "(bad)", { XX } },
2896 { "(bad)", { XX } },
2897 { "packusdw", { XM, EXx } },
2898 { "(bad)", { XX } },
2899 },
2900
2901 /* PREFIX_0F3830 */
2902 {
2903 { "(bad)", { XX } },
2904 { "(bad)", { XX } },
2905 { "pmovzxbw", { XM, EXq } },
2906 { "(bad)", { XX } },
2907 },
2908
2909 /* PREFIX_0F3831 */
2910 {
2911 { "(bad)", { XX } },
2912 { "(bad)", { XX } },
2913 { "pmovzxbd", { XM, EXd } },
2914 { "(bad)", { XX } },
2915 },
2916
2917 /* PREFIX_0F3832 */
2918 {
2919 { "(bad)", { XX } },
2920 { "(bad)", { XX } },
2921 { "pmovzxbq", { XM, EXw } },
2922 { "(bad)", { XX } },
2923 },
2924
2925 /* PREFIX_0F3833 */
2926 {
2927 { "(bad)", { XX } },
2928 { "(bad)", { XX } },
2929 { "pmovzxwd", { XM, EXq } },
2930 { "(bad)", { XX } },
2931 },
2932
2933 /* PREFIX_0F3834 */
2934 {
2935 { "(bad)", { XX } },
2936 { "(bad)", { XX } },
2937 { "pmovzxwq", { XM, EXd } },
2938 { "(bad)", { XX } },
2939 },
2940
2941 /* PREFIX_0F3835 */
2942 {
2943 { "(bad)", { XX } },
2944 { "(bad)", { XX } },
2945 { "pmovzxdq", { XM, EXq } },
2946 { "(bad)", { XX } },
2947 },
2948
2949 /* PREFIX_0F3837 */
2950 {
2951 { "(bad)", { XX } },
2952 { "(bad)", { XX } },
2953 { "pcmpgtq", { XM, EXx } },
2954 { "(bad)", { XX } },
2955 },
2956
2957 /* PREFIX_0F3838 */
2958 {
2959 { "(bad)", { XX } },
2960 { "(bad)", { XX } },
2961 { "pminsb", { XM, EXx } },
2962 { "(bad)", { XX } },
2963 },
2964
2965 /* PREFIX_0F3839 */
2966 {
2967 { "(bad)", { XX } },
2968 { "(bad)", { XX } },
2969 { "pminsd", { XM, EXx } },
2970 { "(bad)", { XX } },
2971 },
2972
2973 /* PREFIX_0F383A */
2974 {
2975 { "(bad)", { XX } },
2976 { "(bad)", { XX } },
2977 { "pminuw", { XM, EXx } },
2978 { "(bad)", { XX } },
2979 },
2980
2981 /* PREFIX_0F383B */
2982 {
2983 { "(bad)", { XX } },
2984 { "(bad)", { XX } },
2985 { "pminud", { XM, EXx } },
2986 { "(bad)", { XX } },
2987 },
2988
2989 /* PREFIX_0F383C */
2990 {
2991 { "(bad)", { XX } },
2992 { "(bad)", { XX } },
2993 { "pmaxsb", { XM, EXx } },
2994 { "(bad)", { XX } },
2995 },
2996
2997 /* PREFIX_0F383D */
2998 {
2999 { "(bad)", { XX } },
3000 { "(bad)", { XX } },
3001 { "pmaxsd", { XM, EXx } },
3002 { "(bad)", { XX } },
3003 },
3004
3005 /* PREFIX_0F383E */
3006 {
3007 { "(bad)", { XX } },
3008 { "(bad)", { XX } },
3009 { "pmaxuw", { XM, EXx } },
3010 { "(bad)", { XX } },
3011 },
3012
3013 /* PREFIX_0F383F */
3014 {
3015 { "(bad)", { XX } },
3016 { "(bad)", { XX } },
3017 { "pmaxud", { XM, EXx } },
3018 { "(bad)", { XX } },
3019 },
3020
3021 /* PREFIX_0F3840 */
3022 {
3023 { "(bad)", { XX } },
3024 { "(bad)", { XX } },
3025 { "pmulld", { XM, EXx } },
3026 { "(bad)", { XX } },
3027 },
3028
3029 /* PREFIX_0F3841 */
3030 {
3031 { "(bad)", { XX } },
3032 { "(bad)", { XX } },
3033 { "phminposuw", { XM, EXx } },
3034 { "(bad)", { XX } },
3035 },
3036
3037 /* PREFIX_0F3880 */
3038 {
3039 { "(bad)", { XX } },
3040 { "(bad)", { XX } },
3041 { "invept", { Gm, Mo } },
3042 { "(bad)", { XX } },
3043 },
3044
3045 /* PREFIX_0F3881 */
3046 {
3047 { "(bad)", { XX } },
3048 { "(bad)", { XX } },
3049 { "invvpid", { Gm, Mo } },
3050 { "(bad)", { XX } },
3051 },
3052
3053 /* PREFIX_0F38DB */
3054 {
3055 { "(bad)", { XX } },
3056 { "(bad)", { XX } },
3057 { "aesimc", { XM, EXx } },
3058 { "(bad)", { XX } },
3059 },
3060
3061 /* PREFIX_0F38DC */
3062 {
3063 { "(bad)", { XX } },
3064 { "(bad)", { XX } },
3065 { "aesenc", { XM, EXx } },
3066 { "(bad)", { XX } },
3067 },
3068
3069 /* PREFIX_0F38DD */
3070 {
3071 { "(bad)", { XX } },
3072 { "(bad)", { XX } },
3073 { "aesenclast", { XM, EXx } },
3074 { "(bad)", { XX } },
3075 },
3076
3077 /* PREFIX_0F38DE */
3078 {
3079 { "(bad)", { XX } },
3080 { "(bad)", { XX } },
3081 { "aesdec", { XM, EXx } },
3082 { "(bad)", { XX } },
3083 },
3084
3085 /* PREFIX_0F38DF */
3086 {
3087 { "(bad)", { XX } },
3088 { "(bad)", { XX } },
3089 { "aesdeclast", { XM, EXx } },
3090 { "(bad)", { XX } },
3091 },
3092
3093 /* PREFIX_0F38F0 */
3094 {
3095 { "movbeS", { Gv, { MOVBE_Fixup, v_mode } } },
3096 { "(bad)", { XX } },
3097 { "movbeS", { Gv, { MOVBE_Fixup, v_mode } } },
3098 { "crc32", { Gdq, { CRC32_Fixup, b_mode } } },
3099 },
3100
3101 /* PREFIX_0F38F1 */
3102 {
3103 { "movbeS", { { MOVBE_Fixup, v_mode }, Gv } },
3104 { "(bad)", { XX } },
3105 { "movbeS", { { MOVBE_Fixup, v_mode }, Gv } },
3106 { "crc32", { Gdq, { CRC32_Fixup, v_mode } } },
3107 },
3108
3109 /* PREFIX_0F3A08 */
3110 {
3111 { "(bad)", { XX } },
3112 { "(bad)", { XX } },
3113 { "roundps", { XM, EXx, Ib } },
3114 { "(bad)", { XX } },
3115 },
3116
3117 /* PREFIX_0F3A09 */
3118 {
3119 { "(bad)", { XX } },
3120 { "(bad)", { XX } },
3121 { "roundpd", { XM, EXx, Ib } },
3122 { "(bad)", { XX } },
3123 },
3124
3125 /* PREFIX_0F3A0A */
3126 {
3127 { "(bad)", { XX } },
3128 { "(bad)", { XX } },
3129 { "roundss", { XM, EXd, Ib } },
3130 { "(bad)", { XX } },
3131 },
3132
3133 /* PREFIX_0F3A0B */
3134 {
3135 { "(bad)", { XX } },
3136 { "(bad)", { XX } },
3137 { "roundsd", { XM, EXq, Ib } },
3138 { "(bad)", { XX } },
3139 },
3140
3141 /* PREFIX_0F3A0C */
3142 {
3143 { "(bad)", { XX } },
3144 { "(bad)", { XX } },
3145 { "blendps", { XM, EXx, Ib } },
3146 { "(bad)", { XX } },
3147 },
3148
3149 /* PREFIX_0F3A0D */
3150 {
3151 { "(bad)", { XX } },
3152 { "(bad)", { XX } },
3153 { "blendpd", { XM, EXx, Ib } },
3154 { "(bad)", { XX } },
3155 },
3156
3157 /* PREFIX_0F3A0E */
3158 {
3159 { "(bad)", { XX } },
3160 { "(bad)", { XX } },
3161 { "pblendw", { XM, EXx, Ib } },
3162 { "(bad)", { XX } },
3163 },
3164
3165 /* PREFIX_0F3A14 */
3166 {
3167 { "(bad)", { XX } },
3168 { "(bad)", { XX } },
3169 { "pextrb", { Edqb, XM, Ib } },
3170 { "(bad)", { XX } },
3171 },
3172
3173 /* PREFIX_0F3A15 */
3174 {
3175 { "(bad)", { XX } },
3176 { "(bad)", { XX } },
3177 { "pextrw", { Edqw, XM, Ib } },
3178 { "(bad)", { XX } },
3179 },
3180
3181 /* PREFIX_0F3A16 */
3182 {
3183 { "(bad)", { XX } },
3184 { "(bad)", { XX } },
3185 { "pextrK", { Edq, XM, Ib } },
3186 { "(bad)", { XX } },
3187 },
3188
3189 /* PREFIX_0F3A17 */
3190 {
3191 { "(bad)", { XX } },
3192 { "(bad)", { XX } },
3193 { "extractps", { Edqd, XM, Ib } },
3194 { "(bad)", { XX } },
3195 },
3196
3197 /* PREFIX_0F3A20 */
3198 {
3199 { "(bad)", { XX } },
3200 { "(bad)", { XX } },
3201 { "pinsrb", { XM, Edqb, Ib } },
3202 { "(bad)", { XX } },
3203 },
3204
3205 /* PREFIX_0F3A21 */
3206 {
3207 { "(bad)", { XX } },
3208 { "(bad)", { XX } },
3209 { "insertps", { XM, EXd, Ib } },
3210 { "(bad)", { XX } },
3211 },
3212
3213 /* PREFIX_0F3A22 */
3214 {
3215 { "(bad)", { XX } },
3216 { "(bad)", { XX } },
3217 { "pinsrK", { XM, Edq, Ib } },
3218 { "(bad)", { XX } },
3219 },
3220
3221 /* PREFIX_0F3A40 */
3222 {
3223 { "(bad)", { XX } },
3224 { "(bad)", { XX } },
3225 { "dpps", { XM, EXx, Ib } },
3226 { "(bad)", { XX } },
3227 },
3228
3229 /* PREFIX_0F3A41 */
3230 {
3231 { "(bad)", { XX } },
3232 { "(bad)", { XX } },
3233 { "dppd", { XM, EXx, Ib } },
3234 { "(bad)", { XX } },
3235 },
3236
3237 /* PREFIX_0F3A42 */
3238 {
3239 { "(bad)", { XX } },
3240 { "(bad)", { XX } },
3241 { "mpsadbw", { XM, EXx, Ib } },
3242 { "(bad)", { XX } },
3243 },
3244
3245 /* PREFIX_0F3A44 */
3246 {
3247 { "(bad)", { XX } },
3248 { "(bad)", { XX } },
3249 { "pclmulqdq", { XM, EXx, PCLMUL } },
3250 { "(bad)", { XX } },
3251 },
3252
3253 /* PREFIX_0F3A60 */
3254 {
3255 { "(bad)", { XX } },
3256 { "(bad)", { XX } },
3257 { "pcmpestrm", { XM, EXx, Ib } },
3258 { "(bad)", { XX } },
3259 },
3260
3261 /* PREFIX_0F3A61 */
3262 {
3263 { "(bad)", { XX } },
3264 { "(bad)", { XX } },
3265 { "pcmpestri", { XM, EXx, Ib } },
3266 { "(bad)", { XX } },
3267 },
3268
3269 /* PREFIX_0F3A62 */
3270 {
3271 { "(bad)", { XX } },
3272 { "(bad)", { XX } },
3273 { "pcmpistrm", { XM, EXx, Ib } },
3274 { "(bad)", { XX } },
3275 },
3276
3277 /* PREFIX_0F3A63 */
3278 {
3279 { "(bad)", { XX } },
3280 { "(bad)", { XX } },
3281 { "pcmpistri", { XM, EXx, Ib } },
3282 { "(bad)", { XX } },
3283 },
3284
3285 /* PREFIX_0F3ADF */
3286 {
3287 { "(bad)", { XX } },
3288 { "(bad)", { XX } },
3289 { "aeskeygenassist", { XM, EXx, Ib } },
3290 { "(bad)", { XX } },
3291 },
3292
3293 /* PREFIX_VEX_10 */
3294 {
3295 { "vmovups", { XM, EXx } },
3296 { VEX_LEN_TABLE (VEX_LEN_10_P_1) },
3297 { "vmovupd", { XM, EXx } },
3298 { VEX_LEN_TABLE (VEX_LEN_10_P_3) },
3299 },
3300
3301 /* PREFIX_VEX_11 */
3302 {
3303 { "vmovups", { EXxS, XM } },
3304 { VEX_LEN_TABLE (VEX_LEN_11_P_1) },
3305 { "vmovupd", { EXxS, XM } },
3306 { VEX_LEN_TABLE (VEX_LEN_11_P_3) },
3307 },
3308
3309 /* PREFIX_VEX_12 */
3310 {
3311 { MOD_TABLE (MOD_VEX_12_PREFIX_0) },
3312 { "vmovsldup", { XM, EXx } },
3313 { VEX_LEN_TABLE (VEX_LEN_12_P_2) },
3314 { "vmovddup", { XM, EXymmq } },
3315 },
3316
3317 /* PREFIX_VEX_16 */
3318 {
3319 { MOD_TABLE (MOD_VEX_16_PREFIX_0) },
3320 { "vmovshdup", { XM, EXx } },
3321 { VEX_LEN_TABLE (VEX_LEN_16_P_2) },
3322 { "(bad)", { XX } },
3323 },
3324
3325 /* PREFIX_VEX_2A */
3326 {
3327 { "(bad)", { XX } },
3328 { VEX_LEN_TABLE (VEX_LEN_2A_P_1) },
3329 { "(bad)", { XX } },
3330 { VEX_LEN_TABLE (VEX_LEN_2A_P_3) },
3331 },
3332
3333 /* PREFIX_VEX_2C */
3334 {
3335 { "(bad)", { XX } },
3336 { VEX_LEN_TABLE (VEX_LEN_2C_P_1) },
3337 { "(bad)", { XX } },
3338 { VEX_LEN_TABLE (VEX_LEN_2C_P_3) },
3339 },
3340
3341 /* PREFIX_VEX_2D */
3342 {
3343 { "(bad)", { XX } },
3344 { VEX_LEN_TABLE (VEX_LEN_2D_P_1) },
3345 { "(bad)", { XX } },
3346 { VEX_LEN_TABLE (VEX_LEN_2D_P_3) },
3347 },
3348
3349 /* PREFIX_VEX_2E */
3350 {
3351 { VEX_LEN_TABLE (VEX_LEN_2E_P_0) },
3352 { "(bad)", { XX } },
3353 { VEX_LEN_TABLE (VEX_LEN_2E_P_2) },
3354 { "(bad)", { XX } },
3355 },
3356
3357 /* PREFIX_VEX_2F */
3358 {
3359 { VEX_LEN_TABLE (VEX_LEN_2F_P_0) },
3360 { "(bad)", { XX } },
3361 { VEX_LEN_TABLE (VEX_LEN_2F_P_2) },
3362 { "(bad)", { XX } },
3363 },
3364
3365 /* PREFIX_VEX_51 */
3366 {
3367 { "vsqrtps", { XM, EXx } },
3368 { VEX_LEN_TABLE (VEX_LEN_51_P_1) },
3369 { "vsqrtpd", { XM, EXx } },
3370 { VEX_LEN_TABLE (VEX_LEN_51_P_3) },
3371 },
3372
3373 /* PREFIX_VEX_52 */
3374 {
3375 { "vrsqrtps", { XM, EXx } },
3376 { VEX_LEN_TABLE (VEX_LEN_52_P_1) },
3377 { "(bad)", { XX } },
3378 { "(bad)", { XX } },
3379 },
3380
3381 /* PREFIX_VEX_53 */
3382 {
3383 { "vrcpps", { XM, EXx } },
3384 { VEX_LEN_TABLE (VEX_LEN_53_P_1) },
3385 { "(bad)", { XX } },
3386 { "(bad)", { XX } },
3387 },
3388
3389 /* PREFIX_VEX_58 */
3390 {
3391 { "vaddps", { XM, Vex, EXx } },
3392 { VEX_LEN_TABLE (VEX_LEN_58_P_1) },
3393 { "vaddpd", { XM, Vex, EXx } },
3394 { VEX_LEN_TABLE (VEX_LEN_58_P_3) },
3395 },
3396
3397 /* PREFIX_VEX_59 */
3398 {
3399 { "vmulps", { XM, Vex, EXx } },
3400 { VEX_LEN_TABLE (VEX_LEN_59_P_1) },
3401 { "vmulpd", { XM, Vex, EXx } },
3402 { VEX_LEN_TABLE (VEX_LEN_59_P_3) },
3403 },
3404
3405 /* PREFIX_VEX_5A */
3406 {
3407 { "vcvtps2pd", { XM, EXxmmq } },
3408 { VEX_LEN_TABLE (VEX_LEN_5A_P_1) },
3409 { "vcvtpd2ps%XY", { XMM, EXx } },
3410 { VEX_LEN_TABLE (VEX_LEN_5A_P_3) },
3411 },
3412
3413 /* PREFIX_VEX_5B */
3414 {
3415 { "vcvtdq2ps", { XM, EXx } },
3416 { "vcvttps2dq", { XM, EXx } },
3417 { "vcvtps2dq", { XM, EXx } },
3418 { "(bad)", { XX } },
3419 },
3420
3421 /* PREFIX_VEX_5C */
3422 {
3423 { "vsubps", { XM, Vex, EXx } },
3424 { VEX_LEN_TABLE (VEX_LEN_5C_P_1) },
3425 { "vsubpd", { XM, Vex, EXx } },
3426 { VEX_LEN_TABLE (VEX_LEN_5C_P_3) },
3427 },
3428
3429 /* PREFIX_VEX_5D */
3430 {
3431 { "vminps", { XM, Vex, EXx } },
3432 { VEX_LEN_TABLE (VEX_LEN_5D_P_1) },
3433 { "vminpd", { XM, Vex, EXx } },
3434 { VEX_LEN_TABLE (VEX_LEN_5D_P_3) },
3435 },
3436
3437 /* PREFIX_VEX_5E */
3438 {
3439 { "vdivps", { XM, Vex, EXx } },
3440 { VEX_LEN_TABLE (VEX_LEN_5E_P_1) },
3441 { "vdivpd", { XM, Vex, EXx } },
3442 { VEX_LEN_TABLE (VEX_LEN_5E_P_3) },
3443 },
3444
3445 /* PREFIX_VEX_5F */
3446 {
3447 { "vmaxps", { XM, Vex, EXx } },
3448 { VEX_LEN_TABLE (VEX_LEN_5F_P_1) },
3449 { "vmaxpd", { XM, Vex, EXx } },
3450 { VEX_LEN_TABLE (VEX_LEN_5F_P_3) },
3451 },
3452
3453 /* PREFIX_VEX_60 */
3454 {
3455 { "(bad)", { XX } },
3456 { "(bad)", { XX } },
3457 { VEX_LEN_TABLE (VEX_LEN_60_P_2) },
3458 { "(bad)", { XX } },
3459 },
3460
3461 /* PREFIX_VEX_61 */
3462 {
3463 { "(bad)", { XX } },
3464 { "(bad)", { XX } },
3465 { VEX_LEN_TABLE (VEX_LEN_61_P_2) },
3466 { "(bad)", { XX } },
3467 },
3468
3469 /* PREFIX_VEX_62 */
3470 {
3471 { "(bad)", { XX } },
3472 { "(bad)", { XX } },
3473 { VEX_LEN_TABLE (VEX_LEN_62_P_2) },
3474 { "(bad)", { XX } },
3475 },
3476
3477 /* PREFIX_VEX_63 */
3478 {
3479 { "(bad)", { XX } },
3480 { "(bad)", { XX } },
3481 { VEX_LEN_TABLE (VEX_LEN_63_P_2) },
3482 { "(bad)", { XX } },
3483 },
3484
3485 /* PREFIX_VEX_64 */
3486 {
3487 { "(bad)", { XX } },
3488 { "(bad)", { XX } },
3489 { VEX_LEN_TABLE (VEX_LEN_64_P_2) },
3490 { "(bad)", { XX } },
3491 },
3492
3493 /* PREFIX_VEX_65 */
3494 {
3495 { "(bad)", { XX } },
3496 { "(bad)", { XX } },
3497 { VEX_LEN_TABLE (VEX_LEN_65_P_2) },
3498 { "(bad)", { XX } },
3499 },
3500
3501 /* PREFIX_VEX_66 */
3502 {
3503 { "(bad)", { XX } },
3504 { "(bad)", { XX } },
3505 { VEX_LEN_TABLE (VEX_LEN_66_P_2) },
3506 { "(bad)", { XX } },
3507 },
3508
3509 /* PREFIX_VEX_67 */
3510 {
3511 { "(bad)", { XX } },
3512 { "(bad)", { XX } },
3513 { VEX_LEN_TABLE (VEX_LEN_67_P_2) },
3514 { "(bad)", { XX } },
3515 },
3516
3517 /* PREFIX_VEX_68 */
3518 {
3519 { "(bad)", { XX } },
3520 { "(bad)", { XX } },
3521 { VEX_LEN_TABLE (VEX_LEN_68_P_2) },
3522 { "(bad)", { XX } },
3523 },
3524
3525 /* PREFIX_VEX_69 */
3526 {
3527 { "(bad)", { XX } },
3528 { "(bad)", { XX } },
3529 { VEX_LEN_TABLE (VEX_LEN_69_P_2) },
3530 { "(bad)", { XX } },
3531 },
3532
3533 /* PREFIX_VEX_6A */
3534 {
3535 { "(bad)", { XX } },
3536 { "(bad)", { XX } },
3537 { VEX_LEN_TABLE (VEX_LEN_6A_P_2) },
3538 { "(bad)", { XX } },
3539 },
3540
3541 /* PREFIX_VEX_6B */
3542 {
3543 { "(bad)", { XX } },
3544 { "(bad)", { XX } },
3545 { VEX_LEN_TABLE (VEX_LEN_6B_P_2) },
3546 { "(bad)", { XX } },
3547 },
3548
3549 /* PREFIX_VEX_6C */
3550 {
3551 { "(bad)", { XX } },
3552 { "(bad)", { XX } },
3553 { VEX_LEN_TABLE (VEX_LEN_6C_P_2) },
3554 { "(bad)", { XX } },
3555 },
3556
3557 /* PREFIX_VEX_6D */
3558 {
3559 { "(bad)", { XX } },
3560 { "(bad)", { XX } },
3561 { VEX_LEN_TABLE (VEX_LEN_6D_P_2) },
3562 { "(bad)", { XX } },
3563 },
3564
3565 /* PREFIX_VEX_6E */
3566 {
3567 { "(bad)", { XX } },
3568 { "(bad)", { XX } },
3569 { VEX_LEN_TABLE (VEX_LEN_6E_P_2) },
3570 { "(bad)", { XX } },
3571 },
3572
3573 /* PREFIX_VEX_6F */
3574 {
3575 { "(bad)", { XX } },
3576 { "vmovdqu", { XM, EXx } },
3577 { "vmovdqa", { XM, EXx } },
3578 { "(bad)", { XX } },
3579 },
3580
3581 /* PREFIX_VEX_70 */
3582 {
3583 { "(bad)", { XX } },
3584 { VEX_LEN_TABLE (VEX_LEN_70_P_1) },
3585 { VEX_LEN_TABLE (VEX_LEN_70_P_2) },
3586 { VEX_LEN_TABLE (VEX_LEN_70_P_3) },
3587 },
3588
3589 /* PREFIX_VEX_71_REG_2 */
3590 {
3591 { "(bad)", { XX } },
3592 { "(bad)", { XX } },
3593 { VEX_LEN_TABLE (VEX_LEN_71_R_2_P_2) },
3594 { "(bad)", { XX } },
3595 },
3596
3597 /* PREFIX_VEX_71_REG_4 */
3598 {
3599 { "(bad)", { XX } },
3600 { "(bad)", { XX } },
3601 { VEX_LEN_TABLE (VEX_LEN_71_R_4_P_2) },
3602 { "(bad)", { XX } },
3603 },
3604
3605 /* PREFIX_VEX_71_REG_6 */
3606 {
3607 { "(bad)", { XX } },
3608 { "(bad)", { XX } },
3609 { VEX_LEN_TABLE (VEX_LEN_71_R_6_P_2) },
3610 { "(bad)", { XX } },
3611 },
3612
3613 /* PREFIX_VEX_72_REG_2 */
3614 {
3615 { "(bad)", { XX } },
3616 { "(bad)", { XX } },
3617 { VEX_LEN_TABLE (VEX_LEN_72_R_2_P_2) },
3618 { "(bad)", { XX } },
3619 },
3620
3621 /* PREFIX_VEX_72_REG_4 */
3622 {
3623 { "(bad)", { XX } },
3624 { "(bad)", { XX } },
3625 { VEX_LEN_TABLE (VEX_LEN_72_R_4_P_2) },
3626 { "(bad)", { XX } },
3627 },
3628
3629 /* PREFIX_VEX_72_REG_6 */
3630 {
3631 { "(bad)", { XX } },
3632 { "(bad)", { XX } },
3633 { VEX_LEN_TABLE (VEX_LEN_72_R_6_P_2) },
3634 { "(bad)", { XX } },
3635 },
3636
3637 /* PREFIX_VEX_73_REG_2 */
3638 {
3639 { "(bad)", { XX } },
3640 { "(bad)", { XX } },
3641 { VEX_LEN_TABLE (VEX_LEN_73_R_2_P_2) },
3642 { "(bad)", { XX } },
3643 },
3644
3645 /* PREFIX_VEX_73_REG_3 */
3646 {
3647 { "(bad)", { XX } },
3648 { "(bad)", { XX } },
3649 { VEX_LEN_TABLE (VEX_LEN_73_R_3_P_2) },
3650 { "(bad)", { XX } },
3651 },
3652
3653 /* PREFIX_VEX_73_REG_6 */
3654 {
3655 { "(bad)", { XX } },
3656 { "(bad)", { XX } },
3657 { VEX_LEN_TABLE (VEX_LEN_73_R_6_P_2) },
3658 { "(bad)", { XX } },
3659 },
3660
3661 /* PREFIX_VEX_73_REG_7 */
3662 {
3663 { "(bad)", { XX } },
3664 { "(bad)", { XX } },
3665 { VEX_LEN_TABLE (VEX_LEN_73_R_7_P_2) },
3666 { "(bad)", { XX } },
3667 },
3668
3669 /* PREFIX_VEX_74 */
3670 {
3671 { "(bad)", { XX } },
3672 { "(bad)", { XX } },
3673 { VEX_LEN_TABLE (VEX_LEN_74_P_2) },
3674 { "(bad)", { XX } },
3675 },
3676
3677 /* PREFIX_VEX_75 */
3678 {
3679 { "(bad)", { XX } },
3680 { "(bad)", { XX } },
3681 { VEX_LEN_TABLE (VEX_LEN_75_P_2) },
3682 { "(bad)", { XX } },
3683 },
3684
3685 /* PREFIX_VEX_76 */
3686 {
3687 { "(bad)", { XX } },
3688 { "(bad)", { XX } },
3689 { VEX_LEN_TABLE (VEX_LEN_76_P_2) },
3690 { "(bad)", { XX } },
3691 },
3692
3693 /* PREFIX_VEX_77 */
3694 {
3695 { "", { VZERO } },
3696 { "(bad)", { XX } },
3697 { "(bad)", { XX } },
3698 { "(bad)", { XX } },
3699 },
3700
3701 /* PREFIX_VEX_7C */
3702 {
3703 { "(bad)", { XX } },
3704 { "(bad)", { XX } },
3705 { "vhaddpd", { XM, Vex, EXx } },
3706 { "vhaddps", { XM, Vex, EXx } },
3707 },
3708
3709 /* PREFIX_VEX_7D */
3710 {
3711 { "(bad)", { XX } },
3712 { "(bad)", { XX } },
3713 { "vhsubpd", { XM, Vex, EXx } },
3714 { "vhsubps", { XM, Vex, EXx } },
3715 },
3716
3717 /* PREFIX_VEX_7E */
3718 {
3719 { "(bad)", { XX } },
3720 { VEX_LEN_TABLE (VEX_LEN_7E_P_1) },
3721 { VEX_LEN_TABLE (VEX_LEN_7E_P_2) },
3722 { "(bad)", { XX } },
3723 },
3724
3725 /* PREFIX_VEX_7F */
3726 {
3727 { "(bad)", { XX } },
3728 { "vmovdqu", { EXxS, XM } },
3729 { "vmovdqa", { EXxS, XM } },
3730 { "(bad)", { XX } },
3731 },
3732
3733 /* PREFIX_VEX_C2 */
3734 {
3735 { "vcmpps", { XM, Vex, EXx, VCMP } },
3736 { VEX_LEN_TABLE (VEX_LEN_C2_P_1) },
3737 { "vcmppd", { XM, Vex, EXx, VCMP } },
3738 { VEX_LEN_TABLE (VEX_LEN_C2_P_3) },
3739 },
3740
3741 /* PREFIX_VEX_C4 */
3742 {
3743 { "(bad)", { XX } },
3744 { "(bad)", { XX } },
3745 { VEX_LEN_TABLE (VEX_LEN_C4_P_2) },
3746 { "(bad)", { XX } },
3747 },
3748
3749 /* PREFIX_VEX_C5 */
3750 {
3751 { "(bad)", { XX } },
3752 { "(bad)", { XX } },
3753 { VEX_LEN_TABLE (VEX_LEN_C5_P_2) },
3754 { "(bad)", { XX } },
3755 },
3756
3757 /* PREFIX_VEX_D0 */
3758 {
3759 { "(bad)", { XX } },
3760 { "(bad)", { XX } },
3761 { "vaddsubpd", { XM, Vex, EXx } },
3762 { "vaddsubps", { XM, Vex, EXx } },
3763 },
3764
3765 /* PREFIX_VEX_D1 */
3766 {
3767 { "(bad)", { XX } },
3768 { "(bad)", { XX } },
3769 { VEX_LEN_TABLE (VEX_LEN_D1_P_2) },
3770 { "(bad)", { XX } },
3771 },
3772
3773 /* PREFIX_VEX_D2 */
3774 {
3775 { "(bad)", { XX } },
3776 { "(bad)", { XX } },
3777 { VEX_LEN_TABLE (VEX_LEN_D2_P_2) },
3778 { "(bad)", { XX } },
3779 },
3780
3781 /* PREFIX_VEX_D3 */
3782 {
3783 { "(bad)", { XX } },
3784 { "(bad)", { XX } },
3785 { VEX_LEN_TABLE (VEX_LEN_D3_P_2) },
3786 { "(bad)", { XX } },
3787 },
3788
3789 /* PREFIX_VEX_D4 */
3790 {
3791 { "(bad)", { XX } },
3792 { "(bad)", { XX } },
3793 { VEX_LEN_TABLE (VEX_LEN_D4_P_2) },
3794 { "(bad)", { XX } },
3795 },
3796
3797 /* PREFIX_VEX_D5 */
3798 {
3799 { "(bad)", { XX } },
3800 { "(bad)", { XX } },
3801 { VEX_LEN_TABLE (VEX_LEN_D5_P_2) },
3802 { "(bad)", { XX } },
3803 },
3804
3805 /* PREFIX_VEX_D6 */
3806 {
3807 { "(bad)", { XX } },
3808 { "(bad)", { XX } },
3809 { VEX_LEN_TABLE (VEX_LEN_D6_P_2) },
3810 { "(bad)", { XX } },
3811 },
3812
3813 /* PREFIX_VEX_D7 */
3814 {
3815 { "(bad)", { XX } },
3816 { "(bad)", { XX } },
3817 { MOD_TABLE (MOD_VEX_D7_PREFIX_2) },
3818 { "(bad)", { XX } },
3819 },
3820
3821 /* PREFIX_VEX_D8 */
3822 {
3823 { "(bad)", { XX } },
3824 { "(bad)", { XX } },
3825 { VEX_LEN_TABLE (VEX_LEN_D8_P_2) },
3826 { "(bad)", { XX } },
3827 },
3828
3829 /* PREFIX_VEX_D9 */
3830 {
3831 { "(bad)", { XX } },
3832 { "(bad)", { XX } },
3833 { VEX_LEN_TABLE (VEX_LEN_D9_P_2) },
3834 { "(bad)", { XX } },
3835 },
3836
3837 /* PREFIX_VEX_DA */
3838 {
3839 { "(bad)", { XX } },
3840 { "(bad)", { XX } },
3841 { VEX_LEN_TABLE (VEX_LEN_DA_P_2) },
3842 { "(bad)", { XX } },
3843 },
3844
3845 /* PREFIX_VEX_DB */
3846 {
3847 { "(bad)", { XX } },
3848 { "(bad)", { XX } },
3849 { VEX_LEN_TABLE (VEX_LEN_DB_P_2) },
3850 { "(bad)", { XX } },
3851 },
3852
3853 /* PREFIX_VEX_DC */
3854 {
3855 { "(bad)", { XX } },
3856 { "(bad)", { XX } },
3857 { VEX_LEN_TABLE (VEX_LEN_DC_P_2) },
3858 { "(bad)", { XX } },
3859 },
3860
3861 /* PREFIX_VEX_DD */
3862 {
3863 { "(bad)", { XX } },
3864 { "(bad)", { XX } },
3865 { VEX_LEN_TABLE (VEX_LEN_DD_P_2) },
3866 { "(bad)", { XX } },
3867 },
3868
3869 /* PREFIX_VEX_DE */
3870 {
3871 { "(bad)", { XX } },
3872 { "(bad)", { XX } },
3873 { VEX_LEN_TABLE (VEX_LEN_DE_P_2) },
3874 { "(bad)", { XX } },
3875 },
3876
3877 /* PREFIX_VEX_DF */
3878 {
3879 { "(bad)", { XX } },
3880 { "(bad)", { XX } },
3881 { VEX_LEN_TABLE (VEX_LEN_DF_P_2) },
3882 { "(bad)", { XX } },
3883 },
3884
3885 /* PREFIX_VEX_E0 */
3886 {
3887 { "(bad)", { XX } },
3888 { "(bad)", { XX } },
3889 { VEX_LEN_TABLE (VEX_LEN_E0_P_2) },
3890 { "(bad)", { XX } },
3891 },
3892
3893 /* PREFIX_VEX_E1 */
3894 {
3895 { "(bad)", { XX } },
3896 { "(bad)", { XX } },
3897 { VEX_LEN_TABLE (VEX_LEN_E1_P_2) },
3898 { "(bad)", { XX } },
3899 },
3900
3901 /* PREFIX_VEX_E2 */
3902 {
3903 { "(bad)", { XX } },
3904 { "(bad)", { XX } },
3905 { VEX_LEN_TABLE (VEX_LEN_E2_P_2) },
3906 { "(bad)", { XX } },
3907 },
3908
3909 /* PREFIX_VEX_E3 */
3910 {
3911 { "(bad)", { XX } },
3912 { "(bad)", { XX } },
3913 { VEX_LEN_TABLE (VEX_LEN_E3_P_2) },
3914 { "(bad)", { XX } },
3915 },
3916
3917 /* PREFIX_VEX_E4 */
3918 {
3919 { "(bad)", { XX } },
3920 { "(bad)", { XX } },
3921 { VEX_LEN_TABLE (VEX_LEN_E4_P_2) },
3922 { "(bad)", { XX } },
3923 },
3924
3925 /* PREFIX_VEX_E5 */
3926 {
3927 { "(bad)", { XX } },
3928 { "(bad)", { XX } },
3929 { VEX_LEN_TABLE (VEX_LEN_E5_P_2) },
3930 { "(bad)", { XX } },
3931 },
3932
3933 /* PREFIX_VEX_E6 */
3934 {
3935 { "(bad)", { XX } },
3936 { "vcvtdq2pd", { XM, EXxmmq } },
3937 { "vcvttpd2dq%XY", { XMM, EXx } },
3938 { "vcvtpd2dq%XY", { XMM, EXx } },
3939 },
3940
3941 /* PREFIX_VEX_E7 */
3942 {
3943 { "(bad)", { XX } },
3944 { "(bad)", { XX } },
3945 { MOD_TABLE (MOD_VEX_E7_PREFIX_2) },
3946 { "(bad)", { XX } },
3947 },
3948
3949 /* PREFIX_VEX_E8 */
3950 {
3951 { "(bad)", { XX } },
3952 { "(bad)", { XX } },
3953 { VEX_LEN_TABLE (VEX_LEN_E8_P_2) },
3954 { "(bad)", { XX } },
3955 },
3956
3957 /* PREFIX_VEX_E9 */
3958 {
3959 { "(bad)", { XX } },
3960 { "(bad)", { XX } },
3961 { VEX_LEN_TABLE (VEX_LEN_E9_P_2) },
3962 { "(bad)", { XX } },
3963 },
3964
3965 /* PREFIX_VEX_EA */
3966 {
3967 { "(bad)", { XX } },
3968 { "(bad)", { XX } },
3969 { VEX_LEN_TABLE (VEX_LEN_EA_P_2) },
3970 { "(bad)", { XX } },
3971 },
3972
3973 /* PREFIX_VEX_EB */
3974 {
3975 { "(bad)", { XX } },
3976 { "(bad)", { XX } },
3977 { VEX_LEN_TABLE (VEX_LEN_EB_P_2) },
3978 { "(bad)", { XX } },
3979 },
3980
3981 /* PREFIX_VEX_EC */
3982 {
3983 { "(bad)", { XX } },
3984 { "(bad)", { XX } },
3985 { VEX_LEN_TABLE (VEX_LEN_EC_P_2) },
3986 { "(bad)", { XX } },
3987 },
3988
3989 /* PREFIX_VEX_ED */
3990 {
3991 { "(bad)", { XX } },
3992 { "(bad)", { XX } },
3993 { VEX_LEN_TABLE (VEX_LEN_ED_P_2) },
3994 { "(bad)", { XX } },
3995 },
3996
3997 /* PREFIX_VEX_EE */
3998 {
3999 { "(bad)", { XX } },
4000 { "(bad)", { XX } },
4001 { VEX_LEN_TABLE (VEX_LEN_EE_P_2) },
4002 { "(bad)", { XX } },
4003 },
4004
4005 /* PREFIX_VEX_EF */
4006 {
4007 { "(bad)", { XX } },
4008 { "(bad)", { XX } },
4009 { VEX_LEN_TABLE (VEX_LEN_EF_P_2) },
4010 { "(bad)", { XX } },
4011 },
4012
4013 /* PREFIX_VEX_F0 */
4014 {
4015 { "(bad)", { XX } },
4016 { "(bad)", { XX } },
4017 { "(bad)", { XX } },
4018 { MOD_TABLE (MOD_VEX_F0_PREFIX_3) },
4019 },
4020
4021 /* PREFIX_VEX_F1 */
4022 {
4023 { "(bad)", { XX } },
4024 { "(bad)", { XX } },
4025 { VEX_LEN_TABLE (VEX_LEN_F1_P_2) },
4026 { "(bad)", { XX } },
4027 },
4028
4029 /* PREFIX_VEX_F2 */
4030 {
4031 { "(bad)", { XX } },
4032 { "(bad)", { XX } },
4033 { VEX_LEN_TABLE (VEX_LEN_F2_P_2) },
4034 { "(bad)", { XX } },
4035 },
4036
4037 /* PREFIX_VEX_F3 */
4038 {
4039 { "(bad)", { XX } },
4040 { "(bad)", { XX } },
4041 { VEX_LEN_TABLE (VEX_LEN_F3_P_2) },
4042 { "(bad)", { XX } },
4043 },
4044
4045 /* PREFIX_VEX_F4 */
4046 {
4047 { "(bad)", { XX } },
4048 { "(bad)", { XX } },
4049 { VEX_LEN_TABLE (VEX_LEN_F4_P_2) },
4050 { "(bad)", { XX } },
4051 },
4052
4053 /* PREFIX_VEX_F5 */
4054 {
4055 { "(bad)", { XX } },
4056 { "(bad)", { XX } },
4057 { VEX_LEN_TABLE (VEX_LEN_F5_P_2) },
4058 { "(bad)", { XX } },
4059 },
4060
4061 /* PREFIX_VEX_F6 */
4062 {
4063 { "(bad)", { XX } },
4064 { "(bad)", { XX } },
4065 { VEX_LEN_TABLE (VEX_LEN_F6_P_2) },
4066 { "(bad)", { XX } },
4067 },
4068
4069 /* PREFIX_VEX_F7 */
4070 {
4071 { "(bad)", { XX } },
4072 { "(bad)", { XX } },
4073 { VEX_LEN_TABLE (VEX_LEN_F7_P_2) },
4074 { "(bad)", { XX } },
4075 },
4076
4077 /* PREFIX_VEX_F8 */
4078 {
4079 { "(bad)", { XX } },
4080 { "(bad)", { XX } },
4081 { VEX_LEN_TABLE (VEX_LEN_F8_P_2) },
4082 { "(bad)", { XX } },
4083 },
4084
4085 /* PREFIX_VEX_F9 */
4086 {
4087 { "(bad)", { XX } },
4088 { "(bad)", { XX } },
4089 { VEX_LEN_TABLE (VEX_LEN_F9_P_2) },
4090 { "(bad)", { XX } },
4091 },
4092
4093 /* PREFIX_VEX_FA */
4094 {
4095 { "(bad)", { XX } },
4096 { "(bad)", { XX } },
4097 { VEX_LEN_TABLE (VEX_LEN_FA_P_2) },
4098 { "(bad)", { XX } },
4099 },
4100
4101 /* PREFIX_VEX_FB */
4102 {
4103 { "(bad)", { XX } },
4104 { "(bad)", { XX } },
4105 { VEX_LEN_TABLE (VEX_LEN_FB_P_2) },
4106 { "(bad)", { XX } },
4107 },
4108
4109 /* PREFIX_VEX_FC */
4110 {
4111 { "(bad)", { XX } },
4112 { "(bad)", { XX } },
4113 { VEX_LEN_TABLE (VEX_LEN_FC_P_2) },
4114 { "(bad)", { XX } },
4115 },
4116
4117 /* PREFIX_VEX_FD */
4118 {
4119 { "(bad)", { XX } },
4120 { "(bad)", { XX } },
4121 { VEX_LEN_TABLE (VEX_LEN_FD_P_2) },
4122 { "(bad)", { XX } },
4123 },
4124
4125 /* PREFIX_VEX_FE */
4126 {
4127 { "(bad)", { XX } },
4128 { "(bad)", { XX } },
4129 { VEX_LEN_TABLE (VEX_LEN_FE_P_2) },
4130 { "(bad)", { XX } },
4131 },
4132
4133 /* PREFIX_VEX_3800 */
4134 {
4135 { "(bad)", { XX } },
4136 { "(bad)", { XX } },
4137 { VEX_LEN_TABLE (VEX_LEN_3800_P_2) },
4138 { "(bad)", { XX } },
4139 },
4140
4141 /* PREFIX_VEX_3801 */
4142 {
4143 { "(bad)", { XX } },
4144 { "(bad)", { XX } },
4145 { VEX_LEN_TABLE (VEX_LEN_3801_P_2) },
4146 { "(bad)", { XX } },
4147 },
4148
4149 /* PREFIX_VEX_3802 */
4150 {
4151 { "(bad)", { XX } },
4152 { "(bad)", { XX } },
4153 { VEX_LEN_TABLE (VEX_LEN_3802_P_2) },
4154 { "(bad)", { XX } },
4155 },
4156
4157 /* PREFIX_VEX_3803 */
4158 {
4159 { "(bad)", { XX } },
4160 { "(bad)", { XX } },
4161 { VEX_LEN_TABLE (VEX_LEN_3803_P_2) },
4162 { "(bad)", { XX } },
4163 },
4164
4165 /* PREFIX_VEX_3804 */
4166 {
4167 { "(bad)", { XX } },
4168 { "(bad)", { XX } },
4169 { VEX_LEN_TABLE (VEX_LEN_3804_P_2) },
4170 { "(bad)", { XX } },
4171 },
4172
4173 /* PREFIX_VEX_3805 */
4174 {
4175 { "(bad)", { XX } },
4176 { "(bad)", { XX } },
4177 { VEX_LEN_TABLE (VEX_LEN_3805_P_2) },
4178 { "(bad)", { XX } },
4179 },
4180
4181 /* PREFIX_VEX_3806 */
4182 {
4183 { "(bad)", { XX } },
4184 { "(bad)", { XX } },
4185 { VEX_LEN_TABLE (VEX_LEN_3806_P_2) },
4186 { "(bad)", { XX } },
4187 },
4188
4189 /* PREFIX_VEX_3807 */
4190 {
4191 { "(bad)", { XX } },
4192 { "(bad)", { XX } },
4193 { VEX_LEN_TABLE (VEX_LEN_3807_P_2) },
4194 { "(bad)", { XX } },
4195 },
4196
4197 /* PREFIX_VEX_3808 */
4198 {
4199 { "(bad)", { XX } },
4200 { "(bad)", { XX } },
4201 { VEX_LEN_TABLE (VEX_LEN_3808_P_2) },
4202 { "(bad)", { XX } },
4203 },
4204
4205 /* PREFIX_VEX_3809 */
4206 {
4207 { "(bad)", { XX } },
4208 { "(bad)", { XX } },
4209 { VEX_LEN_TABLE (VEX_LEN_3809_P_2) },
4210 { "(bad)", { XX } },
4211 },
4212
4213 /* PREFIX_VEX_380A */
4214 {
4215 { "(bad)", { XX } },
4216 { "(bad)", { XX } },
4217 { VEX_LEN_TABLE (VEX_LEN_380A_P_2) },
4218 { "(bad)", { XX } },
4219 },
4220
4221 /* PREFIX_VEX_380B */
4222 {
4223 { "(bad)", { XX } },
4224 { "(bad)", { XX } },
4225 { VEX_LEN_TABLE (VEX_LEN_380B_P_2) },
4226 { "(bad)", { XX } },
4227 },
4228
4229 /* PREFIX_VEX_380C */
4230 {
4231 { "(bad)", { XX } },
4232 { "(bad)", { XX } },
4233 { "vpermilps", { XM, Vex, EXx } },
4234 { "(bad)", { XX } },
4235 },
4236
4237 /* PREFIX_VEX_380D */
4238 {
4239 { "(bad)", { XX } },
4240 { "(bad)", { XX } },
4241 { "vpermilpd", { XM, Vex, EXx } },
4242 { "(bad)", { XX } },
4243 },
4244
4245 /* PREFIX_VEX_380E */
4246 {
4247 { "(bad)", { XX } },
4248 { "(bad)", { XX } },
4249 { "vtestps", { XM, EXx } },
4250 { "(bad)", { XX } },
4251 },
4252
4253 /* PREFIX_VEX_380F */
4254 {
4255 { "(bad)", { XX } },
4256 { "(bad)", { XX } },
4257 { "vtestpd", { XM, EXx } },
4258 { "(bad)", { XX } },
4259 },
4260
4261 /* PREFIX_VEX_3817 */
4262 {
4263 { "(bad)", { XX } },
4264 { "(bad)", { XX } },
4265 { "vptest", { XM, EXx } },
4266 { "(bad)", { XX } },
4267 },
4268
4269 /* PREFIX_VEX_3818 */
4270 {
4271 { "(bad)", { XX } },
4272 { "(bad)", { XX } },
4273 { MOD_TABLE (MOD_VEX_3818_PREFIX_2) },
4274 { "(bad)", { XX } },
4275 },
4276
4277 /* PREFIX_VEX_3819 */
4278 {
4279 { "(bad)", { XX } },
4280 { "(bad)", { XX } },
4281 { MOD_TABLE (MOD_VEX_3819_PREFIX_2) },
4282 { "(bad)", { XX } },
4283 },
4284
4285 /* PREFIX_VEX_381A */
4286 {
4287 { "(bad)", { XX } },
4288 { "(bad)", { XX } },
4289 { MOD_TABLE (MOD_VEX_381A_PREFIX_2) },
4290 { "(bad)", { XX } },
4291 },
4292
4293 /* PREFIX_VEX_381C */
4294 {
4295 { "(bad)", { XX } },
4296 { "(bad)", { XX } },
4297 { VEX_LEN_TABLE (VEX_LEN_381C_P_2) },
4298 { "(bad)", { XX } },
4299 },
4300
4301 /* PREFIX_VEX_381D */
4302 {
4303 { "(bad)", { XX } },
4304 { "(bad)", { XX } },
4305 { VEX_LEN_TABLE (VEX_LEN_381D_P_2) },
4306 { "(bad)", { XX } },
4307 },
4308
4309 /* PREFIX_VEX_381E */
4310 {
4311 { "(bad)", { XX } },
4312 { "(bad)", { XX } },
4313 { VEX_LEN_TABLE (VEX_LEN_381E_P_2) },
4314 { "(bad)", { XX } },
4315 },
4316
4317 /* PREFIX_VEX_3820 */
4318 {
4319 { "(bad)", { XX } },
4320 { "(bad)", { XX } },
4321 { VEX_LEN_TABLE (VEX_LEN_3820_P_2) },
4322 { "(bad)", { XX } },
4323 },
4324
4325 /* PREFIX_VEX_3821 */
4326 {
4327 { "(bad)", { XX } },
4328 { "(bad)", { XX } },
4329 { VEX_LEN_TABLE (VEX_LEN_3821_P_2) },
4330 { "(bad)", { XX } },
4331 },
4332
4333 /* PREFIX_VEX_3822 */
4334 {
4335 { "(bad)", { XX } },
4336 { "(bad)", { XX } },
4337 { VEX_LEN_TABLE (VEX_LEN_3822_P_2) },
4338 { "(bad)", { XX } },
4339 },
4340
4341 /* PREFIX_VEX_3823 */
4342 {
4343 { "(bad)", { XX } },
4344 { "(bad)", { XX } },
4345 { VEX_LEN_TABLE (VEX_LEN_3823_P_2) },
4346 { "(bad)", { XX } },
4347 },
4348
4349 /* PREFIX_VEX_3824 */
4350 {
4351 { "(bad)", { XX } },
4352 { "(bad)", { XX } },
4353 { VEX_LEN_TABLE (VEX_LEN_3824_P_2) },
4354 { "(bad)", { XX } },
4355 },
4356
4357 /* PREFIX_VEX_3825 */
4358 {
4359 { "(bad)", { XX } },
4360 { "(bad)", { XX } },
4361 { VEX_LEN_TABLE (VEX_LEN_3825_P_2) },
4362 { "(bad)", { XX } },
4363 },
4364
4365 /* PREFIX_VEX_3828 */
4366 {
4367 { "(bad)", { XX } },
4368 { "(bad)", { XX } },
4369 { VEX_LEN_TABLE (VEX_LEN_3828_P_2) },
4370 { "(bad)", { XX } },
4371 },
4372
4373 /* PREFIX_VEX_3829 */
4374 {
4375 { "(bad)", { XX } },
4376 { "(bad)", { XX } },
4377 { VEX_LEN_TABLE (VEX_LEN_3829_P_2) },
4378 { "(bad)", { XX } },
4379 },
4380
4381 /* PREFIX_VEX_382A */
4382 {
4383 { "(bad)", { XX } },
4384 { "(bad)", { XX } },
4385 { MOD_TABLE (MOD_VEX_382A_PREFIX_2) },
4386 { "(bad)", { XX } },
4387 },
4388
4389 /* PREFIX_VEX_382B */
4390 {
4391 { "(bad)", { XX } },
4392 { "(bad)", { XX } },
4393 { VEX_LEN_TABLE (VEX_LEN_382B_P_2) },
4394 { "(bad)", { XX } },
4395 },
4396
4397 /* PREFIX_VEX_382C */
4398 {
4399 { "(bad)", { XX } },
4400 { "(bad)", { XX } },
4401 { MOD_TABLE (MOD_VEX_382C_PREFIX_2) },
4402 { "(bad)", { XX } },
4403 },
4404
4405 /* PREFIX_VEX_382D */
4406 {
4407 { "(bad)", { XX } },
4408 { "(bad)", { XX } },
4409 { MOD_TABLE (MOD_VEX_382D_PREFIX_2) },
4410 { "(bad)", { XX } },
4411 },
4412
4413 /* PREFIX_VEX_382E */
4414 {
4415 { "(bad)", { XX } },
4416 { "(bad)", { XX } },
4417 { MOD_TABLE (MOD_VEX_382E_PREFIX_2) },
4418 { "(bad)", { XX } },
4419 },
4420
4421 /* PREFIX_VEX_382F */
4422 {
4423 { "(bad)", { XX } },
4424 { "(bad)", { XX } },
4425 { MOD_TABLE (MOD_VEX_382F_PREFIX_2) },
4426 { "(bad)", { XX } },
4427 },
4428
4429 /* PREFIX_VEX_3830 */
4430 {
4431 { "(bad)", { XX } },
4432 { "(bad)", { XX } },
4433 { VEX_LEN_TABLE (VEX_LEN_3830_P_2) },
4434 { "(bad)", { XX } },
4435 },
4436
4437 /* PREFIX_VEX_3831 */
4438 {
4439 { "(bad)", { XX } },
4440 { "(bad)", { XX } },
4441 { VEX_LEN_TABLE (VEX_LEN_3831_P_2) },
4442 { "(bad)", { XX } },
4443 },
4444
4445 /* PREFIX_VEX_3832 */
4446 {
4447 { "(bad)", { XX } },
4448 { "(bad)", { XX } },
4449 { VEX_LEN_TABLE (VEX_LEN_3832_P_2) },
4450 { "(bad)", { XX } },
4451 },
4452
4453 /* PREFIX_VEX_3833 */
4454 {
4455 { "(bad)", { XX } },
4456 { "(bad)", { XX } },
4457 { VEX_LEN_TABLE (VEX_LEN_3833_P_2) },
4458 { "(bad)", { XX } },
4459 },
4460
4461 /* PREFIX_VEX_3834 */
4462 {
4463 { "(bad)", { XX } },
4464 { "(bad)", { XX } },
4465 { VEX_LEN_TABLE (VEX_LEN_3834_P_2) },
4466 { "(bad)", { XX } },
4467 },
4468
4469 /* PREFIX_VEX_3835 */
4470 {
4471 { "(bad)", { XX } },
4472 { "(bad)", { XX } },
4473 { VEX_LEN_TABLE (VEX_LEN_3835_P_2) },
4474 { "(bad)", { XX } },
4475 },
4476
4477 /* PREFIX_VEX_3837 */
4478 {
4479 { "(bad)", { XX } },
4480 { "(bad)", { XX } },
4481 { VEX_LEN_TABLE (VEX_LEN_3837_P_2) },
4482 { "(bad)", { XX } },
4483 },
4484
4485 /* PREFIX_VEX_3838 */
4486 {
4487 { "(bad)", { XX } },
4488 { "(bad)", { XX } },
4489 { VEX_LEN_TABLE (VEX_LEN_3838_P_2) },
4490 { "(bad)", { XX } },
4491 },
4492
4493 /* PREFIX_VEX_3839 */
4494 {
4495 { "(bad)", { XX } },
4496 { "(bad)", { XX } },
4497 { VEX_LEN_TABLE (VEX_LEN_3839_P_2) },
4498 { "(bad)", { XX } },
4499 },
4500
4501 /* PREFIX_VEX_383A */
4502 {
4503 { "(bad)", { XX } },
4504 { "(bad)", { XX } },
4505 { VEX_LEN_TABLE (VEX_LEN_383A_P_2) },
4506 { "(bad)", { XX } },
4507 },
4508
4509 /* PREFIX_VEX_383B */
4510 {
4511 { "(bad)", { XX } },
4512 { "(bad)", { XX } },
4513 { VEX_LEN_TABLE (VEX_LEN_383B_P_2) },
4514 { "(bad)", { XX } },
4515 },
4516
4517 /* PREFIX_VEX_383C */
4518 {
4519 { "(bad)", { XX } },
4520 { "(bad)", { XX } },
4521 { VEX_LEN_TABLE (VEX_LEN_383C_P_2) },
4522 { "(bad)", { XX } },
4523 },
4524
4525 /* PREFIX_VEX_383D */
4526 {
4527 { "(bad)", { XX } },
4528 { "(bad)", { XX } },
4529 { VEX_LEN_TABLE (VEX_LEN_383D_P_2) },
4530 { "(bad)", { XX } },
4531 },
4532
4533 /* PREFIX_VEX_383E */
4534 {
4535 { "(bad)", { XX } },
4536 { "(bad)", { XX } },
4537 { VEX_LEN_TABLE (VEX_LEN_383E_P_2) },
4538 { "(bad)", { XX } },
4539 },
4540
4541 /* PREFIX_VEX_383F */
4542 {
4543 { "(bad)", { XX } },
4544 { "(bad)", { XX } },
4545 { VEX_LEN_TABLE (VEX_LEN_383F_P_2) },
4546 { "(bad)", { XX } },
4547 },
4548
4549 /* PREFIX_VEX_3840 */
4550 {
4551 { "(bad)", { XX } },
4552 { "(bad)", { XX } },
4553 { VEX_LEN_TABLE (VEX_LEN_3840_P_2) },
4554 { "(bad)", { XX } },
4555 },
4556
4557 /* PREFIX_VEX_3841 */
4558 {
4559 { "(bad)", { XX } },
4560 { "(bad)", { XX } },
4561 { VEX_LEN_TABLE (VEX_LEN_3841_P_2) },
4562 { "(bad)", { XX } },
4563 },
4564
4565 /* PREFIX_VEX_3896 */
4566 {
4567 { "(bad)", { XX } },
4568 { "(bad)", { XX } },
4569 { "vfmaddsub132p%XW", { XM, Vex, EXx } },
4570 { "(bad)", { XX } },
4571 },
4572
4573 /* PREFIX_VEX_3897 */
4574 {
4575 { "(bad)", { XX } },
4576 { "(bad)", { XX } },
4577 { "vfmsubadd132p%XW", { XM, Vex, EXx } },
4578 { "(bad)", { XX } },
4579 },
4580
4581 /* PREFIX_VEX_3898 */
4582 {
4583 { "(bad)", { XX } },
4584 { "(bad)", { XX } },
4585 { "vfmadd132p%XW", { XM, Vex, EXx } },
4586 { "(bad)", { XX } },
4587 },
4588
4589 /* PREFIX_VEX_3899 */
4590 {
4591 { "(bad)", { XX } },
4592 { "(bad)", { XX } },
4593 { "vfmadd132s%XW", { XM, Vex, EXVexWdq } },
4594 { "(bad)", { XX } },
4595 },
4596
4597 /* PREFIX_VEX_389A */
4598 {
4599 { "(bad)", { XX } },
4600 { "(bad)", { XX } },
4601 { "vfmsub132p%XW", { XM, Vex, EXx } },
4602 { "(bad)", { XX } },
4603 },
4604
4605 /* PREFIX_VEX_389B */
4606 {
4607 { "(bad)", { XX } },
4608 { "(bad)", { XX } },
4609 { "vfmsub132s%XW", { XM, Vex, EXVexWdq } },
4610 { "(bad)", { XX } },
4611 },
4612
4613 /* PREFIX_VEX_389C */
4614 {
4615 { "(bad)", { XX } },
4616 { "(bad)", { XX } },
4617 { "vfnmadd132p%XW", { XM, Vex, EXx } },
4618 { "(bad)", { XX } },
4619 },
4620
4621 /* PREFIX_VEX_389D */
4622 {
4623 { "(bad)", { XX } },
4624 { "(bad)", { XX } },
4625 { "vfnmadd132s%XW", { XM, Vex, EXVexWdq } },
4626 { "(bad)", { XX } },
4627 },
4628
4629 /* PREFIX_VEX_389E */
4630 {
4631 { "(bad)", { XX } },
4632 { "(bad)", { XX } },
4633 { "vfnmsub132p%XW", { XM, Vex, EXx } },
4634 { "(bad)", { XX } },
4635 },
4636
4637 /* PREFIX_VEX_389F */
4638 {
4639 { "(bad)", { XX } },
4640 { "(bad)", { XX } },
4641 { "vfnmsub132s%XW", { XM, Vex, EXVexWdq } },
4642 { "(bad)", { XX } },
4643 },
4644
4645 /* PREFIX_VEX_38A6 */
4646 {
4647 { "(bad)", { XX } },
4648 { "(bad)", { XX } },
4649 { "vfmaddsub213p%XW", { XM, Vex, EXx } },
4650 { "(bad)", { XX } },
4651 },
4652
4653 /* PREFIX_VEX_38A7 */
4654 {
4655 { "(bad)", { XX } },
4656 { "(bad)", { XX } },
4657 { "vfmsubadd213p%XW", { XM, Vex, EXx } },
4658 { "(bad)", { XX } },
4659 },
4660
4661 /* PREFIX_VEX_38A8 */
4662 {
4663 { "(bad)", { XX } },
4664 { "(bad)", { XX } },
4665 { "vfmadd213p%XW", { XM, Vex, EXx } },
4666 { "(bad)", { XX } },
4667 },
4668
4669 /* PREFIX_VEX_38A9 */
4670 {
4671 { "(bad)", { XX } },
4672 { "(bad)", { XX } },
4673 { "vfmadd213s%XW", { XM, Vex, EXVexWdq } },
4674 { "(bad)", { XX } },
4675 },
4676
4677 /* PREFIX_VEX_38AA */
4678 {
4679 { "(bad)", { XX } },
4680 { "(bad)", { XX } },
4681 { "vfmsub213p%XW", { XM, Vex, EXx } },
4682 { "(bad)", { XX } },
4683 },
4684
4685 /* PREFIX_VEX_38AB */
4686 {
4687 { "(bad)", { XX } },
4688 { "(bad)", { XX } },
4689 { "vfmsub213s%XW", { XM, Vex, EXVexWdq } },
4690 { "(bad)", { XX } },
4691 },
4692
4693 /* PREFIX_VEX_38AC */
4694 {
4695 { "(bad)", { XX } },
4696 { "(bad)", { XX } },
4697 { "vfnmadd213p%XW", { XM, Vex, EXx } },
4698 { "(bad)", { XX } },
4699 },
4700
4701 /* PREFIX_VEX_38AD */
4702 {
4703 { "(bad)", { XX } },
4704 { "(bad)", { XX } },
4705 { "vfnmadd213s%XW", { XM, Vex, EXVexWdq } },
4706 { "(bad)", { XX } },
4707 },
4708
4709 /* PREFIX_VEX_38AE */
4710 {
4711 { "(bad)", { XX } },
4712 { "(bad)", { XX } },
4713 { "vfnmsub213p%XW", { XM, Vex, EXx } },
4714 { "(bad)", { XX } },
4715 },
4716
4717 /* PREFIX_VEX_38AF */
4718 {
4719 { "(bad)", { XX } },
4720 { "(bad)", { XX } },
4721 { "vfnmsub213s%XW", { XM, Vex, EXVexWdq } },
4722 { "(bad)", { XX } },
4723 },
4724
4725 /* PREFIX_VEX_38B6 */
4726 {
4727 { "(bad)", { XX } },
4728 { "(bad)", { XX } },
4729 { "vfmaddsub231p%XW", { XM, Vex, EXx } },
4730 { "(bad)", { XX } },
4731 },
4732
4733 /* PREFIX_VEX_38B7 */
4734 {
4735 { "(bad)", { XX } },
4736 { "(bad)", { XX } },
4737 { "vfmsubadd231p%XW", { XM, Vex, EXx } },
4738 { "(bad)", { XX } },
4739 },
4740
4741 /* PREFIX_VEX_38B8 */
4742 {
4743 { "(bad)", { XX } },
4744 { "(bad)", { XX } },
4745 { "vfmadd231p%XW", { XM, Vex, EXx } },
4746 { "(bad)", { XX } },
4747 },
4748
4749 /* PREFIX_VEX_38B9 */
4750 {
4751 { "(bad)", { XX } },
4752 { "(bad)", { XX } },
4753 { "vfmadd231s%XW", { XM, Vex, EXVexWdq } },
4754 { "(bad)", { XX } },
4755 },
4756
4757 /* PREFIX_VEX_38BA */
4758 {
4759 { "(bad)", { XX } },
4760 { "(bad)", { XX } },
4761 { "vfmsub231p%XW", { XM, Vex, EXx } },
4762 { "(bad)", { XX } },
4763 },
4764
4765 /* PREFIX_VEX_38BB */
4766 {
4767 { "(bad)", { XX } },
4768 { "(bad)", { XX } },
4769 { "vfmsub231s%XW", { XM, Vex, EXVexWdq } },
4770 { "(bad)", { XX } },
4771 },
4772
4773 /* PREFIX_VEX_38BC */
4774 {
4775 { "(bad)", { XX } },
4776 { "(bad)", { XX } },
4777 { "vfnmadd231p%XW", { XM, Vex, EXx } },
4778 { "(bad)", { XX } },
4779 },
4780
4781 /* PREFIX_VEX_38BD */
4782 {
4783 { "(bad)", { XX } },
4784 { "(bad)", { XX } },
4785 { "vfnmadd231s%XW", { XM, Vex, EXVexWdq } },
4786 { "(bad)", { XX } },
4787 },
4788
4789 /* PREFIX_VEX_38BE */
4790 {
4791 { "(bad)", { XX } },
4792 { "(bad)", { XX } },
4793 { "vfnmsub231p%XW", { XM, Vex, EXx } },
4794 { "(bad)", { XX } },
4795 },
4796
4797 /* PREFIX_VEX_38BF */
4798 {
4799 { "(bad)", { XX } },
4800 { "(bad)", { XX } },
4801 { "vfnmsub231s%XW", { XM, Vex, EXVexWdq } },
4802 { "(bad)", { XX } },
4803 },
4804
4805 /* PREFIX_VEX_38DB */
4806 {
4807 { "(bad)", { XX } },
4808 { "(bad)", { XX } },
4809 { VEX_LEN_TABLE (VEX_LEN_38DB_P_2) },
4810 { "(bad)", { XX } },
4811 },
4812
4813 /* PREFIX_VEX_38DC */
4814 {
4815 { "(bad)", { XX } },
4816 { "(bad)", { XX } },
4817 { VEX_LEN_TABLE (VEX_LEN_38DC_P_2) },
4818 { "(bad)", { XX } },
4819 },
4820
4821 /* PREFIX_VEX_38DD */
4822 {
4823 { "(bad)", { XX } },
4824 { "(bad)", { XX } },
4825 { VEX_LEN_TABLE (VEX_LEN_38DD_P_2) },
4826 { "(bad)", { XX } },
4827 },
4828
4829 /* PREFIX_VEX_38DE */
4830 {
4831 { "(bad)", { XX } },
4832 { "(bad)", { XX } },
4833 { VEX_LEN_TABLE (VEX_LEN_38DE_P_2) },
4834 { "(bad)", { XX } },
4835 },
4836
4837 /* PREFIX_VEX_38DF */
4838 {
4839 { "(bad)", { XX } },
4840 { "(bad)", { XX } },
4841 { VEX_LEN_TABLE (VEX_LEN_38DF_P_2) },
4842 { "(bad)", { XX } },
4843 },
4844
4845 /* PREFIX_VEX_3A04 */
4846 {
4847 { "(bad)", { XX } },
4848 { "(bad)", { XX } },
4849 { "vpermilps", { XM, EXx, Ib } },
4850 { "(bad)", { XX } },
4851 },
4852
4853 /* PREFIX_VEX_3A05 */
4854 {
4855 { "(bad)", { XX } },
4856 { "(bad)", { XX } },
4857 { "vpermilpd", { XM, EXx, Ib } },
4858 { "(bad)", { XX } },
4859 },
4860
4861 /* PREFIX_VEX_3A06 */
4862 {
4863 { "(bad)", { XX } },
4864 { "(bad)", { XX } },
4865 { VEX_LEN_TABLE (VEX_LEN_3A06_P_2) },
4866 { "(bad)", { XX } },
4867 },
4868
4869 /* PREFIX_VEX_3A08 */
4870 {
4871 { "(bad)", { XX } },
4872 { "(bad)", { XX } },
4873 { "vroundps", { XM, EXx, Ib } },
4874 { "(bad)", { XX } },
4875 },
4876
4877 /* PREFIX_VEX_3A09 */
4878 {
4879 { "(bad)", { XX } },
4880 { "(bad)", { XX } },
4881 { "vroundpd", { XM, EXx, Ib } },
4882 { "(bad)", { XX } },
4883 },
4884
4885 /* PREFIX_VEX_3A0A */
4886 {
4887 { "(bad)", { XX } },
4888 { "(bad)", { XX } },
4889 { VEX_LEN_TABLE (VEX_LEN_3A0A_P_2) },
4890 { "(bad)", { XX } },
4891 },
4892
4893 /* PREFIX_VEX_3A0B */
4894 {
4895 { "(bad)", { XX } },
4896 { "(bad)", { XX } },
4897 { VEX_LEN_TABLE (VEX_LEN_3A0B_P_2) },
4898 { "(bad)", { XX } },
4899 },
4900
4901 /* PREFIX_VEX_3A0C */
4902 {
4903 { "(bad)", { XX } },
4904 { "(bad)", { XX } },
4905 { "vblendps", { XM, Vex, EXx, Ib } },
4906 { "(bad)", { XX } },
4907 },
4908
4909 /* PREFIX_VEX_3A0D */
4910 {
4911 { "(bad)", { XX } },
4912 { "(bad)", { XX } },
4913 { "vblendpd", { XM, Vex, EXx, Ib } },
4914 { "(bad)", { XX } },
4915 },
4916
4917 /* PREFIX_VEX_3A0E */
4918 {
4919 { "(bad)", { XX } },
4920 { "(bad)", { XX } },
4921 { VEX_LEN_TABLE (VEX_LEN_3A0E_P_2) },
4922 { "(bad)", { XX } },
4923 },
4924
4925 /* PREFIX_VEX_3A0F */
4926 {
4927 { "(bad)", { XX } },
4928 { "(bad)", { XX } },
4929 { VEX_LEN_TABLE (VEX_LEN_3A0F_P_2) },
4930 { "(bad)", { XX } },
4931 },
4932
4933 /* PREFIX_VEX_3A14 */
4934 {
4935 { "(bad)", { XX } },
4936 { "(bad)", { XX } },
4937 { VEX_LEN_TABLE (VEX_LEN_3A14_P_2) },
4938 { "(bad)", { XX } },
4939 },
4940
4941 /* PREFIX_VEX_3A15 */
4942 {
4943 { "(bad)", { XX } },
4944 { "(bad)", { XX } },
4945 { VEX_LEN_TABLE (VEX_LEN_3A15_P_2) },
4946 { "(bad)", { XX } },
4947 },
4948
4949 /* PREFIX_VEX_3A16 */
4950 {
4951 { "(bad)", { XX } },
4952 { "(bad)", { XX } },
4953 { VEX_LEN_TABLE (VEX_LEN_3A16_P_2) },
4954 { "(bad)", { XX } },
4955 },
4956
4957 /* PREFIX_VEX_3A17 */
4958 {
4959 { "(bad)", { XX } },
4960 { "(bad)", { XX } },
4961 { VEX_LEN_TABLE (VEX_LEN_3A17_P_2) },
4962 { "(bad)", { XX } },
4963 },
4964
4965 /* PREFIX_VEX_3A18 */
4966 {
4967 { "(bad)", { XX } },
4968 { "(bad)", { XX } },
4969 { VEX_LEN_TABLE (VEX_LEN_3A18_P_2) },
4970 { "(bad)", { XX } },
4971 },
4972
4973 /* PREFIX_VEX_3A19 */
4974 {
4975 { "(bad)", { XX } },
4976 { "(bad)", { XX } },
4977 { VEX_LEN_TABLE (VEX_LEN_3A19_P_2) },
4978 { "(bad)", { XX } },
4979 },
4980
4981 /* PREFIX_VEX_3A20 */
4982 {
4983 { "(bad)", { XX } },
4984 { "(bad)", { XX } },
4985 { VEX_LEN_TABLE (VEX_LEN_3A20_P_2) },
4986 { "(bad)", { XX } },
4987 },
4988
4989 /* PREFIX_VEX_3A21 */
4990 {
4991 { "(bad)", { XX } },
4992 { "(bad)", { XX } },
4993 { VEX_LEN_TABLE (VEX_LEN_3A21_P_2) },
4994 { "(bad)", { XX } },
4995 },
4996
4997 /* PREFIX_VEX_3A22 */
4998 {
4999 { "(bad)", { XX } },
5000 { "(bad)", { XX } },
5001 { VEX_LEN_TABLE (VEX_LEN_3A22_P_2) },
5002 { "(bad)", { XX } },
5003 },
5004
5005 /* PREFIX_VEX_3A40 */
5006 {
5007 { "(bad)", { XX } },
5008 { "(bad)", { XX } },
5009 { "vdpps", { XM, Vex, EXx, Ib } },
5010 { "(bad)", { XX } },
5011 },
5012
5013 /* PREFIX_VEX_3A41 */
5014 {
5015 { "(bad)", { XX } },
5016 { "(bad)", { XX } },
5017 { VEX_LEN_TABLE (VEX_LEN_3A41_P_2) },
5018 { "(bad)", { XX } },
5019 },
5020
5021 /* PREFIX_VEX_3A42 */
5022 {
5023 { "(bad)", { XX } },
5024 { "(bad)", { XX } },
5025 { VEX_LEN_TABLE (VEX_LEN_3A42_P_2) },
5026 { "(bad)", { XX } },
5027 },
5028
5029 /* PREFIX_VEX_3A44 */
5030 {
5031 { "(bad)", { XX } },
5032 { "(bad)", { XX } },
5033 { VEX_LEN_TABLE (VEX_LEN_3A44_P_2) },
5034 { "(bad)", { XX } },
5035 },
5036
5037 /* PREFIX_VEX_3A4A */
5038 {
5039 { "(bad)", { XX } },
5040 { "(bad)", { XX } },
5041 { "vblendvps", { XM, Vex, EXx, XMVexI4 } },
5042 { "(bad)", { XX } },
5043 },
5044
5045 /* PREFIX_VEX_3A4B */
5046 {
5047 { "(bad)", { XX } },
5048 { "(bad)", { XX } },
5049 { "vblendvpd", { XM, Vex, EXx, XMVexI4 } },
5050 { "(bad)", { XX } },
5051 },
5052
5053 /* PREFIX_VEX_3A4C */
5054 {
5055 { "(bad)", { XX } },
5056 { "(bad)", { XX } },
5057 { VEX_LEN_TABLE (VEX_LEN_3A4C_P_2) },
5058 { "(bad)", { XX } },
5059 },
5060
5061 /* PREFIX_VEX_3A60 */
5062 {
5063 { "(bad)", { XX } },
5064 { "(bad)", { XX } },
5065 { VEX_LEN_TABLE (VEX_LEN_3A60_P_2) },
5066 { "(bad)", { XX } },
5067 },
5068
5069 /* PREFIX_VEX_3A61 */
5070 {
5071 { "(bad)", { XX } },
5072 { "(bad)", { XX } },
5073 { VEX_LEN_TABLE (VEX_LEN_3A61_P_2) },
5074 { "(bad)", { XX } },
5075 },
5076
5077 /* PREFIX_VEX_3A62 */
5078 {
5079 { "(bad)", { XX } },
5080 { "(bad)", { XX } },
5081 { VEX_LEN_TABLE (VEX_LEN_3A62_P_2) },
5082 { "(bad)", { XX } },
5083 },
5084
5085 /* PREFIX_VEX_3A63 */
5086 {
5087 { "(bad)", { XX } },
5088 { "(bad)", { XX } },
5089 { VEX_LEN_TABLE (VEX_LEN_3A63_P_2) },
5090 { "(bad)", { XX } },
5091 },
5092
5093 /* PREFIX_VEX_3ADF */
5094 {
5095 { "(bad)", { XX } },
5096 { "(bad)", { XX } },
5097 { VEX_LEN_TABLE (VEX_LEN_3ADF_P_2) },
5098 { "(bad)", { XX } },
5099 },
5100 };
5101
5102 static const struct dis386 x86_64_table[][2] = {
5103 /* X86_64_06 */
5104 {
5105 { "push{T|}", { es } },
5106 { "(bad)", { XX } },
5107 },
5108
5109 /* X86_64_07 */
5110 {
5111 { "pop{T|}", { es } },
5112 { "(bad)", { XX } },
5113 },
5114
5115 /* X86_64_0D */
5116 {
5117 { "push{T|}", { cs } },
5118 { "(bad)", { XX } },
5119 },
5120
5121 /* X86_64_16 */
5122 {
5123 { "push{T|}", { ss } },
5124 { "(bad)", { XX } },
5125 },
5126
5127 /* X86_64_17 */
5128 {
5129 { "pop{T|}", { ss } },
5130 { "(bad)", { XX } },
5131 },
5132
5133 /* X86_64_1E */
5134 {
5135 { "push{T|}", { ds } },
5136 { "(bad)", { XX } },
5137 },
5138
5139 /* X86_64_1F */
5140 {
5141 { "pop{T|}", { ds } },
5142 { "(bad)", { XX } },
5143 },
5144
5145 /* X86_64_27 */
5146 {
5147 { "daa", { XX } },
5148 { "(bad)", { XX } },
5149 },
5150
5151 /* X86_64_2F */
5152 {
5153 { "das", { XX } },
5154 { "(bad)", { XX } },
5155 },
5156
5157 /* X86_64_37 */
5158 {
5159 { "aaa", { XX } },
5160 { "(bad)", { XX } },
5161 },
5162
5163 /* X86_64_3F */
5164 {
5165 { "aas", { XX } },
5166 { "(bad)", { XX } },
5167 },
5168
5169 /* X86_64_60 */
5170 {
5171 { "pusha{P|}", { XX } },
5172 { "(bad)", { XX } },
5173 },
5174
5175 /* X86_64_61 */
5176 {
5177 { "popa{P|}", { XX } },
5178 { "(bad)", { XX } },
5179 },
5180
5181 /* X86_64_62 */
5182 {
5183 { MOD_TABLE (MOD_62_32BIT) },
5184 { "(bad)", { XX } },
5185 },
5186
5187 /* X86_64_63 */
5188 {
5189 { "arpl", { Ew, Gw } },
5190 { "movs{lq|xd}", { Gv, Ed } },
5191 },
5192
5193 /* X86_64_6D */
5194 {
5195 { "ins{R|}", { Yzr, indirDX } },
5196 { "ins{G|}", { Yzr, indirDX } },
5197 },
5198
5199 /* X86_64_6F */
5200 {
5201 { "outs{R|}", { indirDXr, Xz } },
5202 { "outs{G|}", { indirDXr, Xz } },
5203 },
5204
5205 /* X86_64_9A */
5206 {
5207 { "Jcall{T|}", { Ap } },
5208 { "(bad)", { XX } },
5209 },
5210
5211 /* X86_64_C4 */
5212 {
5213 { MOD_TABLE (MOD_C4_32BIT) },
5214 { VEX_C4_TABLE (VEX_0F) },
5215 },
5216
5217 /* X86_64_C5 */
5218 {
5219 { MOD_TABLE (MOD_C5_32BIT) },
5220 { VEX_C5_TABLE (VEX_0F) },
5221 },
5222
5223 /* X86_64_CE */
5224 {
5225 { "into", { XX } },
5226 { "(bad)", { XX } },
5227 },
5228
5229 /* X86_64_D4 */
5230 {
5231 { "aam", { sIb } },
5232 { "(bad)", { XX } },
5233 },
5234
5235 /* X86_64_D5 */
5236 {
5237 { "aad", { sIb } },
5238 { "(bad)", { XX } },
5239 },
5240
5241 /* X86_64_EA */
5242 {
5243 { "Jjmp{T|}", { Ap } },
5244 { "(bad)", { XX } },
5245 },
5246
5247 /* X86_64_0F01_REG_0 */
5248 {
5249 { "sgdt{Q|IQ}", { M } },
5250 { "sgdt", { M } },
5251 },
5252
5253 /* X86_64_0F01_REG_1 */
5254 {
5255 { "sidt{Q|IQ}", { M } },
5256 { "sidt", { M } },
5257 },
5258
5259 /* X86_64_0F01_REG_2 */
5260 {
5261 { "lgdt{Q|Q}", { M } },
5262 { "lgdt", { M } },
5263 },
5264
5265 /* X86_64_0F01_REG_3 */
5266 {
5267 { "lidt{Q|Q}", { M } },
5268 { "lidt", { M } },
5269 },
5270 };
5271
5272 static const struct dis386 three_byte_table[][256] = {
5273 /* THREE_BYTE_0F24 */
5274 {
5275 /* 00 */
5276 { "fmaddps", { { OP_DREX4, q_mode } } },
5277 { "fmaddpd", { { OP_DREX4, q_mode } } },
5278 { "fmaddss", { { OP_DREX4, w_mode } } },
5279 { "fmaddsd", { { OP_DREX4, d_mode } } },
5280 { "fmaddps", { { OP_DREX4, DREX_OC1 + q_mode } } },
5281 { "fmaddpd", { { OP_DREX4, DREX_OC1 + q_mode } } },
5282 { "fmaddss", { { OP_DREX4, DREX_OC1 + w_mode } } },
5283 { "fmaddsd", { { OP_DREX4, DREX_OC1 + d_mode } } },
5284 /* 08 */
5285 { "fmsubps", { { OP_DREX4, q_mode } } },
5286 { "fmsubpd", { { OP_DREX4, q_mode } } },
5287 { "fmsubss", { { OP_DREX4, w_mode } } },
5288 { "fmsubsd", { { OP_DREX4, d_mode } } },
5289 { "fmsubps", { { OP_DREX4, DREX_OC1 + q_mode } } },
5290 { "fmsubpd", { { OP_DREX4, DREX_OC1 + q_mode } } },
5291 { "fmsubss", { { OP_DREX4, DREX_OC1 + w_mode } } },
5292 { "fmsubsd", { { OP_DREX4, DREX_OC1 + d_mode } } },
5293 /* 10 */
5294 { "fnmaddps", { { OP_DREX4, q_mode } } },
5295 { "fnmaddpd", { { OP_DREX4, q_mode } } },
5296 { "fnmaddss", { { OP_DREX4, w_mode } } },
5297 { "fnmaddsd", { { OP_DREX4, d_mode } } },
5298 { "fnmaddps", { { OP_DREX4, DREX_OC1 + q_mode } } },
5299 { "fnmaddpd", { { OP_DREX4, DREX_OC1 + q_mode } } },
5300 { "fnmaddss", { { OP_DREX4, DREX_OC1 + w_mode } } },
5301 { "fnmaddsd", { { OP_DREX4, DREX_OC1 + d_mode } } },
5302 /* 18 */
5303 { "fnmsubps", { { OP_DREX4, q_mode } } },
5304 { "fnmsubpd", { { OP_DREX4, q_mode } } },
5305 { "fnmsubss", { { OP_DREX4, w_mode } } },
5306 { "fnmsubsd", { { OP_DREX4, d_mode } } },
5307 { "fnmsubps", { { OP_DREX4, DREX_OC1 + q_mode } } },
5308 { "fnmsubpd", { { OP_DREX4, DREX_OC1 + q_mode } } },
5309 { "fnmsubss", { { OP_DREX4, DREX_OC1 + w_mode } } },
5310 { "fnmsubsd", { { OP_DREX4, DREX_OC1 + d_mode } } },
5311 /* 20 */
5312 { "permps", { { OP_DREX4, q_mode } } },
5313 { "permpd", { { OP_DREX4, q_mode } } },
5314 { "pcmov", { { OP_DREX4, q_mode } } },
5315 { "pperm", { { OP_DREX4, q_mode } } },
5316 { "permps", { { OP_DREX4, DREX_OC1 + q_mode } } },
5317 { "permpd", { { OP_DREX4, DREX_OC1 + q_mode } } },
5318 { "pcmov", { { OP_DREX4, DREX_OC1 + w_mode } } },
5319 { "pperm", { { OP_DREX4, DREX_OC1 + d_mode } } },
5320 /* 28 */
5321 { "(bad)", { XX } },
5322 { "(bad)", { XX } },
5323 { "(bad)", { XX } },
5324 { "(bad)", { XX } },
5325 { "(bad)", { XX } },
5326 { "(bad)", { XX } },
5327 { "(bad)", { XX } },
5328 { "(bad)", { XX } },
5329 /* 30 */
5330 { "(bad)", { XX } },
5331 { "(bad)", { XX } },
5332 { "(bad)", { XX } },
5333 { "(bad)", { XX } },
5334 { "(bad)", { XX } },
5335 { "(bad)", { XX } },
5336 { "(bad)", { XX } },
5337 { "(bad)", { XX } },
5338 /* 38 */
5339 { "(bad)", { XX } },
5340 { "(bad)", { XX } },
5341 { "(bad)", { XX } },
5342 { "(bad)", { XX } },
5343 { "(bad)", { XX } },
5344 { "(bad)", { XX } },
5345 { "(bad)", { XX } },
5346 { "(bad)", { XX } },
5347 /* 40 */
5348 { "protb", { { OP_DREX3, q_mode } } },
5349 { "protw", { { OP_DREX3, q_mode } } },
5350 { "protd", { { OP_DREX3, q_mode } } },
5351 { "protq", { { OP_DREX3, q_mode } } },
5352 { "pshlb", { { OP_DREX3, q_mode } } },
5353 { "pshlw", { { OP_DREX3, q_mode } } },
5354 { "pshld", { { OP_DREX3, q_mode } } },
5355 { "pshlq", { { OP_DREX3, q_mode } } },
5356 /* 48 */
5357 { "pshab", { { OP_DREX3, q_mode } } },
5358 { "pshaw", { { OP_DREX3, q_mode } } },
5359 { "pshad", { { OP_DREX3, q_mode } } },
5360 { "pshaq", { { OP_DREX3, q_mode } } },
5361 { "(bad)", { XX } },
5362 { "(bad)", { XX } },
5363 { "(bad)", { XX } },
5364 { "(bad)", { XX } },
5365 /* 50 */
5366 { "(bad)", { XX } },
5367 { "(bad)", { XX } },
5368 { "(bad)", { XX } },
5369 { "(bad)", { XX } },
5370 { "(bad)", { XX } },
5371 { "(bad)", { XX } },
5372 { "(bad)", { XX } },
5373 { "(bad)", { XX } },
5374 /* 58 */
5375 { "(bad)", { XX } },
5376 { "(bad)", { XX } },
5377 { "(bad)", { XX } },
5378 { "(bad)", { XX } },
5379 { "(bad)", { XX } },
5380 { "(bad)", { XX } },
5381 { "(bad)", { XX } },
5382 { "(bad)", { XX } },
5383 /* 60 */
5384 { "(bad)", { XX } },
5385 { "(bad)", { XX } },
5386 { "(bad)", { XX } },
5387 { "(bad)", { XX } },
5388 { "(bad)", { XX } },
5389 { "(bad)", { XX } },
5390 { "(bad)", { XX } },
5391 { "(bad)", { XX } },
5392 /* 68 */
5393 { "(bad)", { XX } },
5394 { "(bad)", { XX } },
5395 { "(bad)", { XX } },
5396 { "(bad)", { XX } },
5397 { "(bad)", { XX } },
5398 { "(bad)", { XX } },
5399 { "(bad)", { XX } },
5400 { "(bad)", { XX } },
5401 /* 70 */
5402 { "(bad)", { XX } },
5403 { "(bad)", { XX } },
5404 { "(bad)", { XX } },
5405 { "(bad)", { XX } },
5406 { "(bad)", { XX } },
5407 { "(bad)", { XX } },
5408 { "(bad)", { XX } },
5409 { "(bad)", { XX } },
5410 /* 78 */
5411 { "(bad)", { XX } },
5412 { "(bad)", { XX } },
5413 { "(bad)", { XX } },
5414 { "(bad)", { XX } },
5415 { "(bad)", { XX } },
5416 { "(bad)", { XX } },
5417 { "(bad)", { XX } },
5418 { "(bad)", { XX } },
5419 /* 80 */
5420 { "(bad)", { XX } },
5421 { "(bad)", { XX } },
5422 { "(bad)", { XX } },
5423 { "(bad)", { XX } },
5424 { "(bad)", { XX } },
5425 { "pmacssww", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5426 { "pmacsswd", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5427 { "pmacssdql", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5428 /* 88 */
5429 { "(bad)", { XX } },
5430 { "(bad)", { XX } },
5431 { "(bad)", { XX } },
5432 { "(bad)", { XX } },
5433 { "(bad)", { XX } },
5434 { "(bad)", { XX } },
5435 { "pmacssdd", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5436 { "pmacssdqh", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5437 /* 90 */
5438 { "(bad)", { XX } },
5439 { "(bad)", { XX } },
5440 { "(bad)", { XX } },
5441 { "(bad)", { XX } },
5442 { "(bad)", { XX } },
5443 { "pmacsww", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5444 { "pmacswd", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5445 { "pmacsdql", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5446 /* 98 */
5447 { "(bad)", { XX } },
5448 { "(bad)", { XX } },
5449 { "(bad)", { XX } },
5450 { "(bad)", { XX } },
5451 { "(bad)", { XX } },
5452 { "(bad)", { XX } },
5453 { "pmacsdd", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5454 { "pmacsdqh", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5455 /* a0 */
5456 { "(bad)", { XX } },
5457 { "(bad)", { XX } },
5458 { "(bad)", { XX } },
5459 { "(bad)", { XX } },
5460 { "(bad)", { XX } },
5461 { "(bad)", { XX } },
5462 { "pmadcsswd", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5463 { "(bad)", { XX } },
5464 /* a8 */
5465 { "(bad)", { XX } },
5466 { "(bad)", { XX } },
5467 { "(bad)", { XX } },
5468 { "(bad)", { XX } },
5469 { "(bad)", { XX } },
5470 { "(bad)", { XX } },
5471 { "(bad)", { XX } },
5472 { "(bad)", { XX } },
5473 /* b0 */
5474 { "(bad)", { XX } },
5475 { "(bad)", { XX } },
5476 { "(bad)", { XX } },
5477 { "(bad)", { XX } },
5478 { "(bad)", { XX } },
5479 { "(bad)", { XX } },
5480 { "pmadcswd", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5481 { "(bad)", { XX } },
5482 /* b8 */
5483 { "(bad)", { XX } },
5484 { "(bad)", { XX } },
5485 { "(bad)", { XX } },
5486 { "(bad)", { XX } },
5487 { "(bad)", { XX } },
5488 { "(bad)", { XX } },
5489 { "(bad)", { XX } },
5490 { "(bad)", { XX } },
5491 /* c0 */
5492 { "(bad)", { XX } },
5493 { "(bad)", { XX } },
5494 { "(bad)", { XX } },
5495 { "(bad)", { XX } },
5496 { "(bad)", { XX } },
5497 { "(bad)", { XX } },
5498 { "(bad)", { XX } },
5499 { "(bad)", { XX } },
5500 /* c8 */
5501 { "(bad)", { XX } },
5502 { "(bad)", { XX } },
5503 { "(bad)", { XX } },
5504 { "(bad)", { XX } },
5505 { "(bad)", { XX } },
5506 { "(bad)", { XX } },
5507 { "(bad)", { XX } },
5508 { "(bad)", { XX } },
5509 /* d0 */
5510 { "(bad)", { XX } },
5511 { "(bad)", { XX } },
5512 { "(bad)", { XX } },
5513 { "(bad)", { XX } },
5514 { "(bad)", { XX } },
5515 { "(bad)", { XX } },
5516 { "(bad)", { XX } },
5517 { "(bad)", { XX } },
5518 /* d8 */
5519 { "(bad)", { XX } },
5520 { "(bad)", { XX } },
5521 { "(bad)", { XX } },
5522 { "(bad)", { XX } },
5523 { "(bad)", { XX } },
5524 { "(bad)", { XX } },
5525 { "(bad)", { XX } },
5526 { "(bad)", { XX } },
5527 /* e0 */
5528 { "(bad)", { XX } },
5529 { "(bad)", { XX } },
5530 { "(bad)", { XX } },
5531 { "(bad)", { XX } },
5532 { "(bad)", { XX } },
5533 { "(bad)", { XX } },
5534 { "(bad)", { XX } },
5535 { "(bad)", { XX } },
5536 /* e8 */
5537 { "(bad)", { XX } },
5538 { "(bad)", { XX } },
5539 { "(bad)", { XX } },
5540 { "(bad)", { XX } },
5541 { "(bad)", { XX } },
5542 { "(bad)", { XX } },
5543 { "(bad)", { XX } },
5544 { "(bad)", { XX } },
5545 /* f0 */
5546 { "(bad)", { XX } },
5547 { "(bad)", { XX } },
5548 { "(bad)", { XX } },
5549 { "(bad)", { XX } },
5550 { "(bad)", { XX } },
5551 { "(bad)", { XX } },
5552 { "(bad)", { XX } },
5553 { "(bad)", { XX } },
5554 /* f8 */
5555 { "(bad)", { XX } },
5556 { "(bad)", { XX } },
5557 { "(bad)", { XX } },
5558 { "(bad)", { XX } },
5559 { "(bad)", { XX } },
5560 { "(bad)", { XX } },
5561 { "(bad)", { XX } },
5562 { "(bad)", { XX } },
5563 },
5564 /* THREE_BYTE_0F25 */
5565 {
5566 /* 00 */
5567 { "(bad)", { XX } },
5568 { "(bad)", { XX } },
5569 { "(bad)", { XX } },
5570 { "(bad)", { XX } },
5571 { "(bad)", { XX } },
5572 { "(bad)", { XX } },
5573 { "(bad)", { XX } },
5574 { "(bad)", { XX } },
5575 /* 08 */
5576 { "(bad)", { XX } },
5577 { "(bad)", { XX } },
5578 { "(bad)", { XX } },
5579 { "(bad)", { XX } },
5580 { "(bad)", { XX } },
5581 { "(bad)", { XX } },
5582 { "(bad)", { XX } },
5583 { "(bad)", { XX } },
5584 /* 10 */
5585 { "(bad)", { XX } },
5586 { "(bad)", { XX } },
5587 { "(bad)", { XX } },
5588 { "(bad)", { XX } },
5589 { "(bad)", { XX } },
5590 { "(bad)", { XX } },
5591 { "(bad)", { XX } },
5592 { "(bad)", { XX } },
5593 /* 18 */
5594 { "(bad)", { XX } },
5595 { "(bad)", { XX } },
5596 { "(bad)", { XX } },
5597 { "(bad)", { XX } },
5598 { "(bad)", { XX } },
5599 { "(bad)", { XX } },
5600 { "(bad)", { XX } },
5601 { "(bad)", { XX } },
5602 /* 20 */
5603 { "(bad)", { XX } },
5604 { "(bad)", { XX } },
5605 { "(bad)", { XX } },
5606 { "(bad)", { XX } },
5607 { "(bad)", { XX } },
5608 { "(bad)", { XX } },
5609 { "(bad)", { XX } },
5610 { "(bad)", { XX } },
5611 /* 28 */
5612 { "(bad)", { XX } },
5613 { "(bad)", { XX } },
5614 { "(bad)", { XX } },
5615 { "(bad)", { XX } },
5616 { "comps", { { OP_DREX3, q_mode }, { OP_DREX_FCMP, b_mode } } },
5617 { "compd", { { OP_DREX3, q_mode }, { OP_DREX_FCMP, b_mode } } },
5618 { "comss", { { OP_DREX3, w_mode }, { OP_DREX_FCMP, b_mode } } },
5619 { "comsd", { { OP_DREX3, d_mode }, { OP_DREX_FCMP, b_mode } } },
5620 /* 30 */
5621 { "(bad)", { XX } },
5622 { "(bad)", { XX } },
5623 { "(bad)", { XX } },
5624 { "(bad)", { XX } },
5625 { "(bad)", { XX } },
5626 { "(bad)", { XX } },
5627 { "(bad)", { XX } },
5628 { "(bad)", { XX } },
5629 /* 38 */
5630 { "(bad)", { XX } },
5631 { "(bad)", { XX } },
5632 { "(bad)", { XX } },
5633 { "(bad)", { XX } },
5634 { "(bad)", { XX } },
5635 { "(bad)", { XX } },
5636 { "(bad)", { XX } },
5637 { "(bad)", { XX } },
5638 /* 40 */
5639 { "(bad)", { XX } },
5640 { "(bad)", { XX } },
5641 { "(bad)", { XX } },
5642 { "(bad)", { XX } },
5643 { "(bad)", { XX } },
5644 { "(bad)", { XX } },
5645 { "(bad)", { XX } },
5646 { "(bad)", { XX } },
5647 /* 48 */
5648 { "(bad)", { XX } },
5649 { "(bad)", { XX } },
5650 { "(bad)", { XX } },
5651 { "(bad)", { XX } },
5652 { "pcomb", { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
5653 { "pcomw", { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
5654 { "pcomd", { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
5655 { "pcomq", { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
5656 /* 50 */
5657 { "(bad)", { XX } },
5658 { "(bad)", { XX } },
5659 { "(bad)", { XX } },
5660 { "(bad)", { XX } },
5661 { "(bad)", { XX } },
5662 { "(bad)", { XX } },
5663 { "(bad)", { XX } },
5664 { "(bad)", { XX } },
5665 /* 58 */
5666 { "(bad)", { XX } },
5667 { "(bad)", { XX } },
5668 { "(bad)", { XX } },
5669 { "(bad)", { XX } },
5670 { "(bad)", { XX } },
5671 { "(bad)", { XX } },
5672 { "(bad)", { XX } },
5673 { "(bad)", { XX } },
5674 /* 60 */
5675 { "(bad)", { XX } },
5676 { "(bad)", { XX } },
5677 { "(bad)", { XX } },
5678 { "(bad)", { XX } },
5679 { "(bad)", { XX } },
5680 { "(bad)", { XX } },
5681 { "(bad)", { XX } },
5682 { "(bad)", { XX } },
5683 /* 68 */
5684 { "(bad)", { XX } },
5685 { "(bad)", { XX } },
5686 { "(bad)", { XX } },
5687 { "(bad)", { XX } },
5688 { "pcomub", { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
5689 { "pcomuw", { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
5690 { "pcomud", { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
5691 { "pcomuq", { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
5692 /* 70 */
5693 { "(bad)", { XX } },
5694 { "(bad)", { XX } },
5695 { "(bad)", { XX } },
5696 { "(bad)", { XX } },
5697 { "(bad)", { XX } },
5698 { "(bad)", { XX } },
5699 { "(bad)", { XX } },
5700 { "(bad)", { XX } },
5701 /* 78 */
5702 { "(bad)", { XX } },
5703 { "(bad)", { XX } },
5704 { "(bad)", { XX } },
5705 { "(bad)", { XX } },
5706 { "(bad)", { XX } },
5707 { "(bad)", { XX } },
5708 { "(bad)", { XX } },
5709 { "(bad)", { XX } },
5710 /* 80 */
5711 { "(bad)", { XX } },
5712 { "(bad)", { XX } },
5713 { "(bad)", { XX } },
5714 { "(bad)", { XX } },
5715 { "(bad)", { XX } },
5716 { "(bad)", { XX } },
5717 { "(bad)", { XX } },
5718 { "(bad)", { XX } },
5719 /* 88 */
5720 { "(bad)", { XX } },
5721 { "(bad)", { XX } },
5722 { "(bad)", { XX } },
5723 { "(bad)", { XX } },
5724 { "(bad)", { XX } },
5725 { "(bad)", { XX } },
5726 { "(bad)", { XX } },
5727 { "(bad)", { XX } },
5728 /* 90 */
5729 { "(bad)", { XX } },
5730 { "(bad)", { XX } },
5731 { "(bad)", { XX } },
5732 { "(bad)", { XX } },
5733 { "(bad)", { XX } },
5734 { "(bad)", { XX } },
5735 { "(bad)", { XX } },
5736 { "(bad)", { XX } },
5737 /* 98 */
5738 { "(bad)", { XX } },
5739 { "(bad)", { XX } },
5740 { "(bad)", { XX } },
5741 { "(bad)", { XX } },
5742 { "(bad)", { XX } },
5743 { "(bad)", { XX } },
5744 { "(bad)", { XX } },
5745 { "(bad)", { XX } },
5746 /* a0 */
5747 { "(bad)", { XX } },
5748 { "(bad)", { XX } },
5749 { "(bad)", { XX } },
5750 { "(bad)", { XX } },
5751 { "(bad)", { XX } },
5752 { "(bad)", { XX } },
5753 { "(bad)", { XX } },
5754 { "(bad)", { XX } },
5755 /* a8 */
5756 { "(bad)", { XX } },
5757 { "(bad)", { XX } },
5758 { "(bad)", { XX } },
5759 { "(bad)", { XX } },
5760 { "(bad)", { XX } },
5761 { "(bad)", { XX } },
5762 { "(bad)", { XX } },
5763 { "(bad)", { XX } },
5764 /* b0 */
5765 { "(bad)", { XX } },
5766 { "(bad)", { XX } },
5767 { "(bad)", { XX } },
5768 { "(bad)", { XX } },
5769 { "(bad)", { XX } },
5770 { "(bad)", { XX } },
5771 { "(bad)", { XX } },
5772 { "(bad)", { XX } },
5773 /* b8 */
5774 { "(bad)", { XX } },
5775 { "(bad)", { XX } },
5776 { "(bad)", { XX } },
5777 { "(bad)", { XX } },
5778 { "(bad)", { XX } },
5779 { "(bad)", { XX } },
5780 { "(bad)", { XX } },
5781 { "(bad)", { XX } },
5782 /* c0 */
5783 { "(bad)", { XX } },
5784 { "(bad)", { XX } },
5785 { "(bad)", { XX } },
5786 { "(bad)", { XX } },
5787 { "(bad)", { XX } },
5788 { "(bad)", { XX } },
5789 { "(bad)", { XX } },
5790 { "(bad)", { XX } },
5791 /* c8 */
5792 { "(bad)", { XX } },
5793 { "(bad)", { XX } },
5794 { "(bad)", { XX } },
5795 { "(bad)", { XX } },
5796 { "(bad)", { XX } },
5797 { "(bad)", { XX } },
5798 { "(bad)", { XX } },
5799 { "(bad)", { XX } },
5800 /* d0 */
5801 { "(bad)", { XX } },
5802 { "(bad)", { XX } },
5803 { "(bad)", { XX } },
5804 { "(bad)", { XX } },
5805 { "(bad)", { XX } },
5806 { "(bad)", { XX } },
5807 { "(bad)", { XX } },
5808 { "(bad)", { XX } },
5809 /* d8 */
5810 { "(bad)", { XX } },
5811 { "(bad)", { XX } },
5812 { "(bad)", { XX } },
5813 { "(bad)", { XX } },
5814 { "(bad)", { XX } },
5815 { "(bad)", { XX } },
5816 { "(bad)", { XX } },
5817 { "(bad)", { XX } },
5818 /* e0 */
5819 { "(bad)", { XX } },
5820 { "(bad)", { XX } },
5821 { "(bad)", { XX } },
5822 { "(bad)", { XX } },
5823 { "(bad)", { XX } },
5824 { "(bad)", { XX } },
5825 { "(bad)", { XX } },
5826 { "(bad)", { XX } },
5827 /* e8 */
5828 { "(bad)", { XX } },
5829 { "(bad)", { XX } },
5830 { "(bad)", { XX } },
5831 { "(bad)", { XX } },
5832 { "(bad)", { XX } },
5833 { "(bad)", { XX } },
5834 { "(bad)", { XX } },
5835 { "(bad)", { XX } },
5836 /* f0 */
5837 { "(bad)", { XX } },
5838 { "(bad)", { XX } },
5839 { "(bad)", { XX } },
5840 { "(bad)", { XX } },
5841 { "(bad)", { XX } },
5842 { "(bad)", { XX } },
5843 { "(bad)", { XX } },
5844 { "(bad)", { XX } },
5845 /* f8 */
5846 { "(bad)", { XX } },
5847 { "(bad)", { XX } },
5848 { "(bad)", { XX } },
5849 { "(bad)", { XX } },
5850 { "(bad)", { XX } },
5851 { "(bad)", { XX } },
5852 { "(bad)", { XX } },
5853 { "(bad)", { XX } },
5854 },
5855 /* THREE_BYTE_0F38 */
5856 {
5857 /* 00 */
5858 { "pshufb", { MX, EM } },
5859 { "phaddw", { MX, EM } },
5860 { "phaddd", { MX, EM } },
5861 { "phaddsw", { MX, EM } },
5862 { "pmaddubsw", { MX, EM } },
5863 { "phsubw", { MX, EM } },
5864 { "phsubd", { MX, EM } },
5865 { "phsubsw", { MX, EM } },
5866 /* 08 */
5867 { "psignb", { MX, EM } },
5868 { "psignw", { MX, EM } },
5869 { "psignd", { MX, EM } },
5870 { "pmulhrsw", { MX, EM } },
5871 { "(bad)", { XX } },
5872 { "(bad)", { XX } },
5873 { "(bad)", { XX } },
5874 { "(bad)", { XX } },
5875 /* 10 */
5876 { PREFIX_TABLE (PREFIX_0F3810) },
5877 { "(bad)", { XX } },
5878 { "(bad)", { XX } },
5879 { "(bad)", { XX } },
5880 { PREFIX_TABLE (PREFIX_0F3814) },
5881 { PREFIX_TABLE (PREFIX_0F3815) },
5882 { "(bad)", { XX } },
5883 { PREFIX_TABLE (PREFIX_0F3817) },
5884 /* 18 */
5885 { "(bad)", { XX } },
5886 { "(bad)", { XX } },
5887 { "(bad)", { XX } },
5888 { "(bad)", { XX } },
5889 { "pabsb", { MX, EM } },
5890 { "pabsw", { MX, EM } },
5891 { "pabsd", { MX, EM } },
5892 { "(bad)", { XX } },
5893 /* 20 */
5894 { PREFIX_TABLE (PREFIX_0F3820) },
5895 { PREFIX_TABLE (PREFIX_0F3821) },
5896 { PREFIX_TABLE (PREFIX_0F3822) },
5897 { PREFIX_TABLE (PREFIX_0F3823) },
5898 { PREFIX_TABLE (PREFIX_0F3824) },
5899 { PREFIX_TABLE (PREFIX_0F3825) },
5900 { "(bad)", { XX } },
5901 { "(bad)", { XX } },
5902 /* 28 */
5903 { PREFIX_TABLE (PREFIX_0F3828) },
5904 { PREFIX_TABLE (PREFIX_0F3829) },
5905 { PREFIX_TABLE (PREFIX_0F382A) },
5906 { PREFIX_TABLE (PREFIX_0F382B) },
5907 { "(bad)", { XX } },
5908 { "(bad)", { XX } },
5909 { "(bad)", { XX } },
5910 { "(bad)", { XX } },
5911 /* 30 */
5912 { PREFIX_TABLE (PREFIX_0F3830) },
5913 { PREFIX_TABLE (PREFIX_0F3831) },
5914 { PREFIX_TABLE (PREFIX_0F3832) },
5915 { PREFIX_TABLE (PREFIX_0F3833) },
5916 { PREFIX_TABLE (PREFIX_0F3834) },
5917 { PREFIX_TABLE (PREFIX_0F3835) },
5918 { "(bad)", { XX } },
5919 { PREFIX_TABLE (PREFIX_0F3837) },
5920 /* 38 */
5921 { PREFIX_TABLE (PREFIX_0F3838) },
5922 { PREFIX_TABLE (PREFIX_0F3839) },
5923 { PREFIX_TABLE (PREFIX_0F383A) },
5924 { PREFIX_TABLE (PREFIX_0F383B) },
5925 { PREFIX_TABLE (PREFIX_0F383C) },
5926 { PREFIX_TABLE (PREFIX_0F383D) },
5927 { PREFIX_TABLE (PREFIX_0F383E) },
5928 { PREFIX_TABLE (PREFIX_0F383F) },
5929 /* 40 */
5930 { PREFIX_TABLE (PREFIX_0F3840) },
5931 { PREFIX_TABLE (PREFIX_0F3841) },
5932 { "(bad)", { XX } },
5933 { "(bad)", { XX } },
5934 { "(bad)", { XX } },
5935 { "(bad)", { XX } },
5936 { "(bad)", { XX } },
5937 { "(bad)", { XX } },
5938 /* 48 */
5939 { "(bad)", { XX } },
5940 { "(bad)", { XX } },
5941 { "(bad)", { XX } },
5942 { "(bad)", { XX } },
5943 { "(bad)", { XX } },
5944 { "(bad)", { XX } },
5945 { "(bad)", { XX } },
5946 { "(bad)", { XX } },
5947 /* 50 */
5948 { "(bad)", { XX } },
5949 { "(bad)", { XX } },
5950 { "(bad)", { XX } },
5951 { "(bad)", { XX } },
5952 { "(bad)", { XX } },
5953 { "(bad)", { XX } },
5954 { "(bad)", { XX } },
5955 { "(bad)", { XX } },
5956 /* 58 */
5957 { "(bad)", { XX } },
5958 { "(bad)", { XX } },
5959 { "(bad)", { XX } },
5960 { "(bad)", { XX } },
5961 { "(bad)", { XX } },
5962 { "(bad)", { XX } },
5963 { "(bad)", { XX } },
5964 { "(bad)", { XX } },
5965 /* 60 */
5966 { "(bad)", { XX } },
5967 { "(bad)", { XX } },
5968 { "(bad)", { XX } },
5969 { "(bad)", { XX } },
5970 { "(bad)", { XX } },
5971 { "(bad)", { XX } },
5972 { "(bad)", { XX } },
5973 { "(bad)", { XX } },
5974 /* 68 */
5975 { "(bad)", { XX } },
5976 { "(bad)", { XX } },
5977 { "(bad)", { XX } },
5978 { "(bad)", { XX } },
5979 { "(bad)", { XX } },
5980 { "(bad)", { XX } },
5981 { "(bad)", { XX } },
5982 { "(bad)", { XX } },
5983 /* 70 */
5984 { "(bad)", { XX } },
5985 { "(bad)", { XX } },
5986 { "(bad)", { XX } },
5987 { "(bad)", { XX } },
5988 { "(bad)", { XX } },
5989 { "(bad)", { XX } },
5990 { "(bad)", { XX } },
5991 { "(bad)", { XX } },
5992 /* 78 */
5993 { "(bad)", { XX } },
5994 { "(bad)", { XX } },
5995 { "(bad)", { XX } },
5996 { "(bad)", { XX } },
5997 { "(bad)", { XX } },
5998 { "(bad)", { XX } },
5999 { "(bad)", { XX } },
6000 { "(bad)", { XX } },
6001 /* 80 */
6002 { PREFIX_TABLE (PREFIX_0F3880) },
6003 { PREFIX_TABLE (PREFIX_0F3881) },
6004 { "(bad)", { XX } },
6005 { "(bad)", { XX } },
6006 { "(bad)", { XX } },
6007 { "(bad)", { XX } },
6008 { "(bad)", { XX } },
6009 { "(bad)", { XX } },
6010 /* 88 */
6011 { "(bad)", { XX } },
6012 { "(bad)", { XX } },
6013 { "(bad)", { XX } },
6014 { "(bad)", { XX } },
6015 { "(bad)", { XX } },
6016 { "(bad)", { XX } },
6017 { "(bad)", { XX } },
6018 { "(bad)", { XX } },
6019 /* 90 */
6020 { "(bad)", { XX } },
6021 { "(bad)", { XX } },
6022 { "(bad)", { XX } },
6023 { "(bad)", { XX } },
6024 { "(bad)", { XX } },
6025 { "(bad)", { XX } },
6026 { "(bad)", { XX } },
6027 { "(bad)", { XX } },
6028 /* 98 */
6029 { "(bad)", { XX } },
6030 { "(bad)", { XX } },
6031 { "(bad)", { XX } },
6032 { "(bad)", { XX } },
6033 { "(bad)", { XX } },
6034 { "(bad)", { XX } },
6035 { "(bad)", { XX } },
6036 { "(bad)", { XX } },
6037 /* a0 */
6038 { "(bad)", { XX } },
6039 { "(bad)", { XX } },
6040 { "(bad)", { XX } },
6041 { "(bad)", { XX } },
6042 { "(bad)", { XX } },
6043 { "(bad)", { XX } },
6044 { "(bad)", { XX } },
6045 { "(bad)", { XX } },
6046 /* a8 */
6047 { "(bad)", { XX } },
6048 { "(bad)", { XX } },
6049 { "(bad)", { XX } },
6050 { "(bad)", { XX } },
6051 { "(bad)", { XX } },
6052 { "(bad)", { XX } },
6053 { "(bad)", { XX } },
6054 { "(bad)", { XX } },
6055 /* b0 */
6056 { "(bad)", { XX } },
6057 { "(bad)", { XX } },
6058 { "(bad)", { XX } },
6059 { "(bad)", { XX } },
6060 { "(bad)", { XX } },
6061 { "(bad)", { XX } },
6062 { "(bad)", { XX } },
6063 { "(bad)", { XX } },
6064 /* b8 */
6065 { "(bad)", { XX } },
6066 { "(bad)", { XX } },
6067 { "(bad)", { XX } },
6068 { "(bad)", { XX } },
6069 { "(bad)", { XX } },
6070 { "(bad)", { XX } },
6071 { "(bad)", { XX } },
6072 { "(bad)", { XX } },
6073 /* c0 */
6074 { "(bad)", { XX } },
6075 { "(bad)", { XX } },
6076 { "(bad)", { XX } },
6077 { "(bad)", { XX } },
6078 { "(bad)", { XX } },
6079 { "(bad)", { XX } },
6080 { "(bad)", { XX } },
6081 { "(bad)", { XX } },
6082 /* c8 */
6083 { "(bad)", { XX } },
6084 { "(bad)", { XX } },
6085 { "(bad)", { XX } },
6086 { "(bad)", { XX } },
6087 { "(bad)", { XX } },
6088 { "(bad)", { XX } },
6089 { "(bad)", { XX } },
6090 { "(bad)", { XX } },
6091 /* d0 */
6092 { "(bad)", { XX } },
6093 { "(bad)", { XX } },
6094 { "(bad)", { XX } },
6095 { "(bad)", { XX } },
6096 { "(bad)", { XX } },
6097 { "(bad)", { XX } },
6098 { "(bad)", { XX } },
6099 { "(bad)", { XX } },
6100 /* d8 */
6101 { "(bad)", { XX } },
6102 { "(bad)", { XX } },
6103 { "(bad)", { XX } },
6104 { PREFIX_TABLE (PREFIX_0F38DB) },
6105 { PREFIX_TABLE (PREFIX_0F38DC) },
6106 { PREFIX_TABLE (PREFIX_0F38DD) },
6107 { PREFIX_TABLE (PREFIX_0F38DE) },
6108 { PREFIX_TABLE (PREFIX_0F38DF) },
6109 /* e0 */
6110 { "(bad)", { XX } },
6111 { "(bad)", { XX } },
6112 { "(bad)", { XX } },
6113 { "(bad)", { XX } },
6114 { "(bad)", { XX } },
6115 { "(bad)", { XX } },
6116 { "(bad)", { XX } },
6117 { "(bad)", { XX } },
6118 /* e8 */
6119 { "(bad)", { XX } },
6120 { "(bad)", { XX } },
6121 { "(bad)", { XX } },
6122 { "(bad)", { XX } },
6123 { "(bad)", { XX } },
6124 { "(bad)", { XX } },
6125 { "(bad)", { XX } },
6126 { "(bad)", { XX } },
6127 /* f0 */
6128 { PREFIX_TABLE (PREFIX_0F38F0) },
6129 { PREFIX_TABLE (PREFIX_0F38F1) },
6130 { "(bad)", { XX } },
6131 { "(bad)", { XX } },
6132 { "(bad)", { XX } },
6133 { "(bad)", { XX } },
6134 { "(bad)", { XX } },
6135 { "(bad)", { XX } },
6136 /* f8 */
6137 { "(bad)", { XX } },
6138 { "(bad)", { XX } },
6139 { "(bad)", { XX } },
6140 { "(bad)", { XX } },
6141 { "(bad)", { XX } },
6142 { "(bad)", { XX } },
6143 { "(bad)", { XX } },
6144 { "(bad)", { XX } },
6145 },
6146 /* THREE_BYTE_0F3A */
6147 {
6148 /* 00 */
6149 { "(bad)", { XX } },
6150 { "(bad)", { XX } },
6151 { "(bad)", { XX } },
6152 { "(bad)", { XX } },
6153 { "(bad)", { XX } },
6154 { "(bad)", { XX } },
6155 { "(bad)", { XX } },
6156 { "(bad)", { XX } },
6157 /* 08 */
6158 { PREFIX_TABLE (PREFIX_0F3A08) },
6159 { PREFIX_TABLE (PREFIX_0F3A09) },
6160 { PREFIX_TABLE (PREFIX_0F3A0A) },
6161 { PREFIX_TABLE (PREFIX_0F3A0B) },
6162 { PREFIX_TABLE (PREFIX_0F3A0C) },
6163 { PREFIX_TABLE (PREFIX_0F3A0D) },
6164 { PREFIX_TABLE (PREFIX_0F3A0E) },
6165 { "palignr", { MX, EM, Ib } },
6166 /* 10 */
6167 { "(bad)", { XX } },
6168 { "(bad)", { XX } },
6169 { "(bad)", { XX } },
6170 { "(bad)", { XX } },
6171 { PREFIX_TABLE (PREFIX_0F3A14) },
6172 { PREFIX_TABLE (PREFIX_0F3A15) },
6173 { PREFIX_TABLE (PREFIX_0F3A16) },
6174 { PREFIX_TABLE (PREFIX_0F3A17) },
6175 /* 18 */
6176 { "(bad)", { XX } },
6177 { "(bad)", { XX } },
6178 { "(bad)", { XX } },
6179 { "(bad)", { XX } },
6180 { "(bad)", { XX } },
6181 { "(bad)", { XX } },
6182 { "(bad)", { XX } },
6183 { "(bad)", { XX } },
6184 /* 20 */
6185 { PREFIX_TABLE (PREFIX_0F3A20) },
6186 { PREFIX_TABLE (PREFIX_0F3A21) },
6187 { PREFIX_TABLE (PREFIX_0F3A22) },
6188 { "(bad)", { XX } },
6189 { "(bad)", { XX } },
6190 { "(bad)", { XX } },
6191 { "(bad)", { XX } },
6192 { "(bad)", { XX } },
6193 /* 28 */
6194 { "(bad)", { XX } },
6195 { "(bad)", { XX } },
6196 { "(bad)", { XX } },
6197 { "(bad)", { XX } },
6198 { "(bad)", { XX } },
6199 { "(bad)", { XX } },
6200 { "(bad)", { XX } },
6201 { "(bad)", { XX } },
6202 /* 30 */
6203 { "(bad)", { XX } },
6204 { "(bad)", { XX } },
6205 { "(bad)", { XX } },
6206 { "(bad)", { XX } },
6207 { "(bad)", { XX } },
6208 { "(bad)", { XX } },
6209 { "(bad)", { XX } },
6210 { "(bad)", { XX } },
6211 /* 38 */
6212 { "(bad)", { XX } },
6213 { "(bad)", { XX } },
6214 { "(bad)", { XX } },
6215 { "(bad)", { XX } },
6216 { "(bad)", { XX } },
6217 { "(bad)", { XX } },
6218 { "(bad)", { XX } },
6219 { "(bad)", { XX } },
6220 /* 40 */
6221 { PREFIX_TABLE (PREFIX_0F3A40) },
6222 { PREFIX_TABLE (PREFIX_0F3A41) },
6223 { PREFIX_TABLE (PREFIX_0F3A42) },
6224 { "(bad)", { XX } },
6225 { PREFIX_TABLE (PREFIX_0F3A44) },
6226 { "(bad)", { XX } },
6227 { "(bad)", { XX } },
6228 { "(bad)", { XX } },
6229 /* 48 */
6230 { "(bad)", { XX } },
6231 { "(bad)", { XX } },
6232 { "(bad)", { XX } },
6233 { "(bad)", { XX } },
6234 { "(bad)", { XX } },
6235 { "(bad)", { XX } },
6236 { "(bad)", { XX } },
6237 { "(bad)", { XX } },
6238 /* 50 */
6239 { "(bad)", { XX } },
6240 { "(bad)", { XX } },
6241 { "(bad)", { XX } },
6242 { "(bad)", { XX } },
6243 { "(bad)", { XX } },
6244 { "(bad)", { XX } },
6245 { "(bad)", { XX } },
6246 { "(bad)", { XX } },
6247 /* 58 */
6248 { "(bad)", { XX } },
6249 { "(bad)", { XX } },
6250 { "(bad)", { XX } },
6251 { "(bad)", { XX } },
6252 { "(bad)", { XX } },
6253 { "(bad)", { XX } },
6254 { "(bad)", { XX } },
6255 { "(bad)", { XX } },
6256 /* 60 */
6257 { PREFIX_TABLE (PREFIX_0F3A60) },
6258 { PREFIX_TABLE (PREFIX_0F3A61) },
6259 { PREFIX_TABLE (PREFIX_0F3A62) },
6260 { PREFIX_TABLE (PREFIX_0F3A63) },
6261 { "(bad)", { XX } },
6262 { "(bad)", { XX } },
6263 { "(bad)", { XX } },
6264 { "(bad)", { XX } },
6265 /* 68 */
6266 { "(bad)", { XX } },
6267 { "(bad)", { XX } },
6268 { "(bad)", { XX } },
6269 { "(bad)", { XX } },
6270 { "(bad)", { XX } },
6271 { "(bad)", { XX } },
6272 { "(bad)", { XX } },
6273 { "(bad)", { XX } },
6274 /* 70 */
6275 { "(bad)", { XX } },
6276 { "(bad)", { XX } },
6277 { "(bad)", { XX } },
6278 { "(bad)", { XX } },
6279 { "(bad)", { XX } },
6280 { "(bad)", { XX } },
6281 { "(bad)", { XX } },
6282 { "(bad)", { XX } },
6283 /* 78 */
6284 { "(bad)", { XX } },
6285 { "(bad)", { XX } },
6286 { "(bad)", { XX } },
6287 { "(bad)", { XX } },
6288 { "(bad)", { XX } },
6289 { "(bad)", { XX } },
6290 { "(bad)", { XX } },
6291 { "(bad)", { XX } },
6292 /* 80 */
6293 { "(bad)", { XX } },
6294 { "(bad)", { XX } },
6295 { "(bad)", { XX } },
6296 { "(bad)", { XX } },
6297 { "(bad)", { XX } },
6298 { "(bad)", { XX } },
6299 { "(bad)", { XX } },
6300 { "(bad)", { XX } },
6301 /* 88 */
6302 { "(bad)", { XX } },
6303 { "(bad)", { XX } },
6304 { "(bad)", { XX } },
6305 { "(bad)", { XX } },
6306 { "(bad)", { XX } },
6307 { "(bad)", { XX } },
6308 { "(bad)", { XX } },
6309 { "(bad)", { XX } },
6310 /* 90 */
6311 { "(bad)", { XX } },
6312 { "(bad)", { XX } },
6313 { "(bad)", { XX } },
6314 { "(bad)", { XX } },
6315 { "(bad)", { XX } },
6316 { "(bad)", { XX } },
6317 { "(bad)", { XX } },
6318 { "(bad)", { XX } },
6319 /* 98 */
6320 { "(bad)", { XX } },
6321 { "(bad)", { XX } },
6322 { "(bad)", { XX } },
6323 { "(bad)", { XX } },
6324 { "(bad)", { XX } },
6325 { "(bad)", { XX } },
6326 { "(bad)", { XX } },
6327 { "(bad)", { XX } },
6328 /* a0 */
6329 { "(bad)", { XX } },
6330 { "(bad)", { XX } },
6331 { "(bad)", { XX } },
6332 { "(bad)", { XX } },
6333 { "(bad)", { XX } },
6334 { "(bad)", { XX } },
6335 { "(bad)", { XX } },
6336 { "(bad)", { XX } },
6337 /* a8 */
6338 { "(bad)", { XX } },
6339 { "(bad)", { XX } },
6340 { "(bad)", { XX } },
6341 { "(bad)", { XX } },
6342 { "(bad)", { XX } },
6343 { "(bad)", { XX } },
6344 { "(bad)", { XX } },
6345 { "(bad)", { XX } },
6346 /* b0 */
6347 { "(bad)", { XX } },
6348 { "(bad)", { XX } },
6349 { "(bad)", { XX } },
6350 { "(bad)", { XX } },
6351 { "(bad)", { XX } },
6352 { "(bad)", { XX } },
6353 { "(bad)", { XX } },
6354 { "(bad)", { XX } },
6355 /* b8 */
6356 { "(bad)", { XX } },
6357 { "(bad)", { XX } },
6358 { "(bad)", { XX } },
6359 { "(bad)", { XX } },
6360 { "(bad)", { XX } },
6361 { "(bad)", { XX } },
6362 { "(bad)", { XX } },
6363 { "(bad)", { XX } },
6364 /* c0 */
6365 { "(bad)", { XX } },
6366 { "(bad)", { XX } },
6367 { "(bad)", { XX } },
6368 { "(bad)", { XX } },
6369 { "(bad)", { XX } },
6370 { "(bad)", { XX } },
6371 { "(bad)", { XX } },
6372 { "(bad)", { XX } },
6373 /* c8 */
6374 { "(bad)", { XX } },
6375 { "(bad)", { XX } },
6376 { "(bad)", { XX } },
6377 { "(bad)", { XX } },
6378 { "(bad)", { XX } },
6379 { "(bad)", { XX } },
6380 { "(bad)", { XX } },
6381 { "(bad)", { XX } },
6382 /* d0 */
6383 { "(bad)", { XX } },
6384 { "(bad)", { XX } },
6385 { "(bad)", { XX } },
6386 { "(bad)", { XX } },
6387 { "(bad)", { XX } },
6388 { "(bad)", { XX } },
6389 { "(bad)", { XX } },
6390 { "(bad)", { XX } },
6391 /* d8 */
6392 { "(bad)", { XX } },
6393 { "(bad)", { XX } },
6394 { "(bad)", { XX } },
6395 { "(bad)", { XX } },
6396 { "(bad)", { XX } },
6397 { "(bad)", { XX } },
6398 { "(bad)", { XX } },
6399 { PREFIX_TABLE (PREFIX_0F3ADF) },
6400 /* e0 */
6401 { "(bad)", { XX } },
6402 { "(bad)", { XX } },
6403 { "(bad)", { XX } },
6404 { "(bad)", { XX } },
6405 { "(bad)", { XX } },
6406 { "(bad)", { XX } },
6407 { "(bad)", { XX } },
6408 { "(bad)", { XX } },
6409 /* e8 */
6410 { "(bad)", { XX } },
6411 { "(bad)", { XX } },
6412 { "(bad)", { XX } },
6413 { "(bad)", { XX } },
6414 { "(bad)", { XX } },
6415 { "(bad)", { XX } },
6416 { "(bad)", { XX } },
6417 { "(bad)", { XX } },
6418 /* f0 */
6419 { "(bad)", { XX } },
6420 { "(bad)", { XX } },
6421 { "(bad)", { XX } },
6422 { "(bad)", { XX } },
6423 { "(bad)", { XX } },
6424 { "(bad)", { XX } },
6425 { "(bad)", { XX } },
6426 { "(bad)", { XX } },
6427 /* f8 */
6428 { "(bad)", { XX } },
6429 { "(bad)", { XX } },
6430 { "(bad)", { XX } },
6431 { "(bad)", { XX } },
6432 { "(bad)", { XX } },
6433 { "(bad)", { XX } },
6434 { "(bad)", { XX } },
6435 { "(bad)", { XX } },
6436 },
6437 /* THREE_BYTE_0F7A */
6438 {
6439 /* 00 */
6440 { "(bad)", { XX } },
6441 { "(bad)", { XX } },
6442 { "(bad)", { XX } },
6443 { "(bad)", { XX } },
6444 { "(bad)", { XX } },
6445 { "(bad)", { XX } },
6446 { "(bad)", { XX } },
6447 { "(bad)", { XX } },
6448 /* 08 */
6449 { "(bad)", { XX } },
6450 { "(bad)", { XX } },
6451 { "(bad)", { XX } },
6452 { "(bad)", { XX } },
6453 { "(bad)", { XX } },
6454 { "(bad)", { XX } },
6455 { "(bad)", { XX } },
6456 { "(bad)", { XX } },
6457 /* 10 */
6458 { "frczps", { XM, EXq } },
6459 { "frczpd", { XM, EXq } },
6460 { "frczss", { XM, EXq } },
6461 { "frczsd", { XM, EXq } },
6462 { "(bad)", { XX } },
6463 { "(bad)", { XX } },
6464 { "(bad)", { XX } },
6465 { "(bad)", { XX } },
6466 /* 18 */
6467 { "(bad)", { XX } },
6468 { "(bad)", { XX } },
6469 { "(bad)", { XX } },
6470 { "(bad)", { XX } },
6471 { "(bad)", { XX } },
6472 { "(bad)", { XX } },
6473 { "(bad)", { XX } },
6474 { "(bad)", { XX } },
6475 /* 20 */
6476 { "ptest", { XX } },
6477 { "(bad)", { XX } },
6478 { "(bad)", { XX } },
6479 { "(bad)", { XX } },
6480 { "(bad)", { XX } },
6481 { "(bad)", { XX } },
6482 { "(bad)", { XX } },
6483 { "(bad)", { XX } },
6484 /* 28 */
6485 { "(bad)", { XX } },
6486 { "(bad)", { XX } },
6487 { "(bad)", { XX } },
6488 { "(bad)", { XX } },
6489 { "(bad)", { XX } },
6490 { "(bad)", { XX } },
6491 { "(bad)", { XX } },
6492 { "(bad)", { XX } },
6493 /* 30 */
6494 { "cvtph2ps", { XM, EXd } },
6495 { "cvtps2ph", { EXd, XM } },
6496 { "(bad)", { XX } },
6497 { "(bad)", { XX } },
6498 { "(bad)", { XX } },
6499 { "(bad)", { XX } },
6500 { "(bad)", { XX } },
6501 { "(bad)", { XX } },
6502 /* 38 */
6503 { "(bad)", { XX } },
6504 { "(bad)", { XX } },
6505 { "(bad)", { XX } },
6506 { "(bad)", { XX } },
6507 { "(bad)", { XX } },
6508 { "(bad)", { XX } },
6509 { "(bad)", { XX } },
6510 { "(bad)", { XX } },
6511 /* 40 */
6512 { "(bad)", { XX } },
6513 { "phaddbw", { XM, EXq } },
6514 { "phaddbd", { XM, EXq } },
6515 { "phaddbq", { XM, EXq } },
6516 { "(bad)", { XX } },
6517 { "(bad)", { XX } },
6518 { "phaddwd", { XM, EXq } },
6519 { "phaddwq", { XM, EXq } },
6520 /* 48 */
6521 { "(bad)", { XX } },
6522 { "(bad)", { XX } },
6523 { "(bad)", { XX } },
6524 { "phadddq", { XM, EXq } },
6525 { "(bad)", { XX } },
6526 { "(bad)", { XX } },
6527 { "(bad)", { XX } },
6528 { "(bad)", { XX } },
6529 /* 50 */
6530 { "(bad)", { XX } },
6531 { "phaddubw", { XM, EXq } },
6532 { "phaddubd", { XM, EXq } },
6533 { "phaddubq", { XM, EXq } },
6534 { "(bad)", { XX } },
6535 { "(bad)", { XX } },
6536 { "phadduwd", { XM, EXq } },
6537 { "phadduwq", { XM, EXq } },
6538 /* 58 */
6539 { "(bad)", { XX } },
6540 { "(bad)", { XX } },
6541 { "(bad)", { XX } },
6542 { "phaddudq", { XM, EXq } },
6543 { "(bad)", { XX } },
6544 { "(bad)", { XX } },
6545 { "(bad)", { XX } },
6546 { "(bad)", { XX } },
6547 /* 60 */
6548 { "(bad)", { XX } },
6549 { "phsubbw", { XM, EXq } },
6550 { "phsubbd", { XM, EXq } },
6551 { "phsubbq", { XM, EXq } },
6552 { "(bad)", { XX } },
6553 { "(bad)", { XX } },
6554 { "(bad)", { XX } },
6555 { "(bad)", { XX } },
6556 /* 68 */
6557 { "(bad)", { XX } },
6558 { "(bad)", { XX } },
6559 { "(bad)", { XX } },
6560 { "(bad)", { XX } },
6561 { "(bad)", { XX } },
6562 { "(bad)", { XX } },
6563 { "(bad)", { XX } },
6564 { "(bad)", { XX } },
6565 /* 70 */
6566 { "(bad)", { XX } },
6567 { "(bad)", { XX } },
6568 { "(bad)", { XX } },
6569 { "(bad)", { XX } },
6570 { "(bad)", { XX } },
6571 { "(bad)", { XX } },
6572 { "(bad)", { XX } },
6573 { "(bad)", { XX } },
6574 /* 78 */
6575 { "(bad)", { XX } },
6576 { "(bad)", { XX } },
6577 { "(bad)", { XX } },
6578 { "(bad)", { XX } },
6579 { "(bad)", { XX } },
6580 { "(bad)", { XX } },
6581 { "(bad)", { XX } },
6582 { "(bad)", { XX } },
6583 /* 80 */
6584 { "(bad)", { XX } },
6585 { "(bad)", { XX } },
6586 { "(bad)", { XX } },
6587 { "(bad)", { XX } },
6588 { "(bad)", { XX } },
6589 { "(bad)", { XX } },
6590 { "(bad)", { XX } },
6591 { "(bad)", { XX } },
6592 /* 88 */
6593 { "(bad)", { XX } },
6594 { "(bad)", { XX } },
6595 { "(bad)", { XX } },
6596 { "(bad)", { XX } },
6597 { "(bad)", { XX } },
6598 { "(bad)", { XX } },
6599 { "(bad)", { XX } },
6600 { "(bad)", { XX } },
6601 /* 90 */
6602 { "(bad)", { XX } },
6603 { "(bad)", { XX } },
6604 { "(bad)", { XX } },
6605 { "(bad)", { XX } },
6606 { "(bad)", { XX } },
6607 { "(bad)", { XX } },
6608 { "(bad)", { XX } },
6609 { "(bad)", { XX } },
6610 /* 98 */
6611 { "(bad)", { XX } },
6612 { "(bad)", { XX } },
6613 { "(bad)", { XX } },
6614 { "(bad)", { XX } },
6615 { "(bad)", { XX } },
6616 { "(bad)", { XX } },
6617 { "(bad)", { XX } },
6618 { "(bad)", { XX } },
6619 /* a0 */
6620 { "(bad)", { XX } },
6621 { "(bad)", { XX } },
6622 { "(bad)", { XX } },
6623 { "(bad)", { XX } },
6624 { "(bad)", { XX } },
6625 { "(bad)", { XX } },
6626 { "(bad)", { XX } },
6627 { "(bad)", { XX } },
6628 /* a8 */
6629 { "(bad)", { XX } },
6630 { "(bad)", { XX } },
6631 { "(bad)", { XX } },
6632 { "(bad)", { XX } },
6633 { "(bad)", { XX } },
6634 { "(bad)", { XX } },
6635 { "(bad)", { XX } },
6636 { "(bad)", { XX } },
6637 /* b0 */
6638 { "(bad)", { XX } },
6639 { "(bad)", { XX } },
6640 { "(bad)", { XX } },
6641 { "(bad)", { XX } },
6642 { "(bad)", { XX } },
6643 { "(bad)", { XX } },
6644 { "(bad)", { XX } },
6645 { "(bad)", { XX } },
6646 /* b8 */
6647 { "(bad)", { XX } },
6648 { "(bad)", { XX } },
6649 { "(bad)", { XX } },
6650 { "(bad)", { XX } },
6651 { "(bad)", { XX } },
6652 { "(bad)", { XX } },
6653 { "(bad)", { XX } },
6654 { "(bad)", { XX } },
6655 /* c0 */
6656 { "(bad)", { XX } },
6657 { "(bad)", { XX } },
6658 { "(bad)", { XX } },
6659 { "(bad)", { XX } },
6660 { "(bad)", { XX } },
6661 { "(bad)", { XX } },
6662 { "(bad)", { XX } },
6663 { "(bad)", { XX } },
6664 /* c8 */
6665 { "(bad)", { XX } },
6666 { "(bad)", { XX } },
6667 { "(bad)", { XX } },
6668 { "(bad)", { XX } },
6669 { "(bad)", { XX } },
6670 { "(bad)", { XX } },
6671 { "(bad)", { XX } },
6672 { "(bad)", { XX } },
6673 /* d0 */
6674 { "(bad)", { XX } },
6675 { "(bad)", { XX } },
6676 { "(bad)", { XX } },
6677 { "(bad)", { XX } },
6678 { "(bad)", { XX } },
6679 { "(bad)", { XX } },
6680 { "(bad)", { XX } },
6681 { "(bad)", { XX } },
6682 /* d8 */
6683 { "(bad)", { XX } },
6684 { "(bad)", { XX } },
6685 { "(bad)", { XX } },
6686 { "(bad)", { XX } },
6687 { "(bad)", { XX } },
6688 { "(bad)", { XX } },
6689 { "(bad)", { XX } },
6690 { "(bad)", { XX } },
6691 /* e0 */
6692 { "(bad)", { XX } },
6693 { "(bad)", { XX } },
6694 { "(bad)", { XX } },
6695 { "(bad)", { XX } },
6696 { "(bad)", { XX } },
6697 { "(bad)", { XX } },
6698 { "(bad)", { XX } },
6699 { "(bad)", { XX } },
6700 /* e8 */
6701 { "(bad)", { XX } },
6702 { "(bad)", { XX } },
6703 { "(bad)", { XX } },
6704 { "(bad)", { XX } },
6705 { "(bad)", { XX } },
6706 { "(bad)", { XX } },
6707 { "(bad)", { XX } },
6708 { "(bad)", { XX } },
6709 /* f0 */
6710 { "(bad)", { XX } },
6711 { "(bad)", { XX } },
6712 { "(bad)", { XX } },
6713 { "(bad)", { XX } },
6714 { "(bad)", { XX } },
6715 { "(bad)", { XX } },
6716 { "(bad)", { XX } },
6717 { "(bad)", { XX } },
6718 /* f8 */
6719 { "(bad)", { XX } },
6720 { "(bad)", { XX } },
6721 { "(bad)", { XX } },
6722 { "(bad)", { XX } },
6723 { "(bad)", { XX } },
6724 { "(bad)", { XX } },
6725 { "(bad)", { XX } },
6726 { "(bad)", { XX } },
6727 },
6728 /* THREE_BYTE_0F7B */
6729 {
6730 /* 00 */
6731 { "(bad)", { XX } },
6732 { "(bad)", { XX } },
6733 { "(bad)", { XX } },
6734 { "(bad)", { XX } },
6735 { "(bad)", { XX } },
6736 { "(bad)", { XX } },
6737 { "(bad)", { XX } },
6738 { "(bad)", { XX } },
6739 /* 08 */
6740 { "(bad)", { XX } },
6741 { "(bad)", { XX } },
6742 { "(bad)", { XX } },
6743 { "(bad)", { XX } },
6744 { "(bad)", { XX } },
6745 { "(bad)", { XX } },
6746 { "(bad)", { XX } },
6747 { "(bad)", { XX } },
6748 /* 10 */
6749 { "(bad)", { XX } },
6750 { "(bad)", { XX } },
6751 { "(bad)", { XX } },
6752 { "(bad)", { XX } },
6753 { "(bad)", { XX } },
6754 { "(bad)", { XX } },
6755 { "(bad)", { XX } },
6756 { "(bad)", { XX } },
6757 /* 18 */
6758 { "(bad)", { XX } },
6759 { "(bad)", { XX } },
6760 { "(bad)", { XX } },
6761 { "(bad)", { XX } },
6762 { "(bad)", { XX } },
6763 { "(bad)", { XX } },
6764 { "(bad)", { XX } },
6765 { "(bad)", { XX } },
6766 /* 20 */
6767 { "(bad)", { XX } },
6768 { "(bad)", { XX } },
6769 { "(bad)", { XX } },
6770 { "(bad)", { XX } },
6771 { "(bad)", { XX } },
6772 { "(bad)", { XX } },
6773 { "(bad)", { XX } },
6774 { "(bad)", { XX } },
6775 /* 28 */
6776 { "(bad)", { XX } },
6777 { "(bad)", { XX } },
6778 { "(bad)", { XX } },
6779 { "(bad)", { XX } },
6780 { "(bad)", { XX } },
6781 { "(bad)", { XX } },
6782 { "(bad)", { XX } },
6783 { "(bad)", { XX } },
6784 /* 30 */
6785 { "(bad)", { XX } },
6786 { "(bad)", { XX } },
6787 { "(bad)", { XX } },
6788 { "(bad)", { XX } },
6789 { "(bad)", { XX } },
6790 { "(bad)", { XX } },
6791 { "(bad)", { XX } },
6792 { "(bad)", { XX } },
6793 /* 38 */
6794 { "(bad)", { XX } },
6795 { "(bad)", { XX } },
6796 { "(bad)", { XX } },
6797 { "(bad)", { XX } },
6798 { "(bad)", { XX } },
6799 { "(bad)", { XX } },
6800 { "(bad)", { XX } },
6801 { "(bad)", { XX } },
6802 /* 40 */
6803 { "protb", { XM, EXq, Ib } },
6804 { "protw", { XM, EXq, Ib } },
6805 { "protd", { XM, EXq, Ib } },
6806 { "protq", { XM, EXq, Ib } },
6807 { "pshlb", { XM, EXq, Ib } },
6808 { "pshlw", { XM, EXq, Ib } },
6809 { "pshld", { XM, EXq, Ib } },
6810 { "pshlq", { XM, EXq, Ib } },
6811 /* 48 */
6812 { "pshab", { XM, EXq, Ib } },
6813 { "pshaw", { XM, EXq, Ib } },
6814 { "pshad", { XM, EXq, Ib } },
6815 { "pshaq", { XM, EXq, Ib } },
6816 { "(bad)", { XX } },
6817 { "(bad)", { XX } },
6818 { "(bad)", { XX } },
6819 { "(bad)", { XX } },
6820 /* 50 */
6821 { "(bad)", { XX } },
6822 { "(bad)", { XX } },
6823 { "(bad)", { XX } },
6824 { "(bad)", { XX } },
6825 { "(bad)", { XX } },
6826 { "(bad)", { XX } },
6827 { "(bad)", { XX } },
6828 { "(bad)", { XX } },
6829 /* 58 */
6830 { "(bad)", { XX } },
6831 { "(bad)", { XX } },
6832 { "(bad)", { XX } },
6833 { "(bad)", { XX } },
6834 { "(bad)", { XX } },
6835 { "(bad)", { XX } },
6836 { "(bad)", { XX } },
6837 { "(bad)", { XX } },
6838 /* 60 */
6839 { "(bad)", { XX } },
6840 { "(bad)", { XX } },
6841 { "(bad)", { XX } },
6842 { "(bad)", { XX } },
6843 { "(bad)", { XX } },
6844 { "(bad)", { XX } },
6845 { "(bad)", { XX } },
6846 { "(bad)", { XX } },
6847 /* 68 */
6848 { "(bad)", { XX } },
6849 { "(bad)", { XX } },
6850 { "(bad)", { XX } },
6851 { "(bad)", { XX } },
6852 { "(bad)", { XX } },
6853 { "(bad)", { XX } },
6854 { "(bad)", { XX } },
6855 { "(bad)", { XX } },
6856 /* 70 */
6857 { "(bad)", { XX } },
6858 { "(bad)", { XX } },
6859 { "(bad)", { XX } },
6860 { "(bad)", { XX } },
6861 { "(bad)", { XX } },
6862 { "(bad)", { XX } },
6863 { "(bad)", { XX } },
6864 { "(bad)", { XX } },
6865 /* 78 */
6866 { "(bad)", { XX } },
6867 { "(bad)", { XX } },
6868 { "(bad)", { XX } },
6869 { "(bad)", { XX } },
6870 { "(bad)", { XX } },
6871 { "(bad)", { XX } },
6872 { "(bad)", { XX } },
6873 { "(bad)", { XX } },
6874 /* 80 */
6875 { "(bad)", { XX } },
6876 { "(bad)", { XX } },
6877 { "(bad)", { XX } },
6878 { "(bad)", { XX } },
6879 { "(bad)", { XX } },
6880 { "(bad)", { XX } },
6881 { "(bad)", { XX } },
6882 { "(bad)", { XX } },
6883 /* 88 */
6884 { "(bad)", { XX } },
6885 { "(bad)", { XX } },
6886 { "(bad)", { XX } },
6887 { "(bad)", { XX } },
6888 { "(bad)", { XX } },
6889 { "(bad)", { XX } },
6890 { "(bad)", { XX } },
6891 { "(bad)", { XX } },
6892 /* 90 */
6893 { "(bad)", { XX } },
6894 { "(bad)", { XX } },
6895 { "(bad)", { XX } },
6896 { "(bad)", { XX } },
6897 { "(bad)", { XX } },
6898 { "(bad)", { XX } },
6899 { "(bad)", { XX } },
6900 { "(bad)", { XX } },
6901 /* 98 */
6902 { "(bad)", { XX } },
6903 { "(bad)", { XX } },
6904 { "(bad)", { XX } },
6905 { "(bad)", { XX } },
6906 { "(bad)", { XX } },
6907 { "(bad)", { XX } },
6908 { "(bad)", { XX } },
6909 { "(bad)", { XX } },
6910 /* a0 */
6911 { "(bad)", { XX } },
6912 { "(bad)", { XX } },
6913 { "(bad)", { XX } },
6914 { "(bad)", { XX } },
6915 { "(bad)", { XX } },
6916 { "(bad)", { XX } },
6917 { "(bad)", { XX } },
6918 { "(bad)", { XX } },
6919 /* a8 */
6920 { "(bad)", { XX } },
6921 { "(bad)", { XX } },
6922 { "(bad)", { XX } },
6923 { "(bad)", { XX } },
6924 { "(bad)", { XX } },
6925 { "(bad)", { XX } },
6926 { "(bad)", { XX } },
6927 { "(bad)", { XX } },
6928 /* b0 */
6929 { "(bad)", { XX } },
6930 { "(bad)", { XX } },
6931 { "(bad)", { XX } },
6932 { "(bad)", { XX } },
6933 { "(bad)", { XX } },
6934 { "(bad)", { XX } },
6935 { "(bad)", { XX } },
6936 { "(bad)", { XX } },
6937 /* b8 */
6938 { "(bad)", { XX } },
6939 { "(bad)", { XX } },
6940 { "(bad)", { XX } },
6941 { "(bad)", { XX } },
6942 { "(bad)", { XX } },
6943 { "(bad)", { XX } },
6944 { "(bad)", { XX } },
6945 { "(bad)", { XX } },
6946 /* c0 */
6947 { "(bad)", { XX } },
6948 { "(bad)", { XX } },
6949 { "(bad)", { XX } },
6950 { "(bad)", { XX } },
6951 { "(bad)", { XX } },
6952 { "(bad)", { XX } },
6953 { "(bad)", { XX } },
6954 { "(bad)", { XX } },
6955 /* c8 */
6956 { "(bad)", { XX } },
6957 { "(bad)", { XX } },
6958 { "(bad)", { XX } },
6959 { "(bad)", { XX } },
6960 { "(bad)", { XX } },
6961 { "(bad)", { XX } },
6962 { "(bad)", { XX } },
6963 { "(bad)", { XX } },
6964 /* d0 */
6965 { "(bad)", { XX } },
6966 { "(bad)", { XX } },
6967 { "(bad)", { XX } },
6968 { "(bad)", { XX } },
6969 { "(bad)", { XX } },
6970 { "(bad)", { XX } },
6971 { "(bad)", { XX } },
6972 { "(bad)", { XX } },
6973 /* d8 */
6974 { "(bad)", { XX } },
6975 { "(bad)", { XX } },
6976 { "(bad)", { XX } },
6977 { "(bad)", { XX } },
6978 { "(bad)", { XX } },
6979 { "(bad)", { XX } },
6980 { "(bad)", { XX } },
6981 { "(bad)", { XX } },
6982 /* e0 */
6983 { "(bad)", { XX } },
6984 { "(bad)", { XX } },
6985 { "(bad)", { XX } },
6986 { "(bad)", { XX } },
6987 { "(bad)", { XX } },
6988 { "(bad)", { XX } },
6989 { "(bad)", { XX } },
6990 { "(bad)", { XX } },
6991 /* e8 */
6992 { "(bad)", { XX } },
6993 { "(bad)", { XX } },
6994 { "(bad)", { XX } },
6995 { "(bad)", { XX } },
6996 { "(bad)", { XX } },
6997 { "(bad)", { XX } },
6998 { "(bad)", { XX } },
6999 { "(bad)", { XX } },
7000 /* f0 */
7001 { "(bad)", { XX } },
7002 { "(bad)", { XX } },
7003 { "(bad)", { XX } },
7004 { "(bad)", { XX } },
7005 { "(bad)", { XX } },
7006 { "(bad)", { XX } },
7007 { "(bad)", { XX } },
7008 { "(bad)", { XX } },
7009 /* f8 */
7010 { "(bad)", { XX } },
7011 { "(bad)", { XX } },
7012 { "(bad)", { XX } },
7013 { "(bad)", { XX } },
7014 { "(bad)", { XX } },
7015 { "(bad)", { XX } },
7016 { "(bad)", { XX } },
7017 { "(bad)", { XX } },
7018 },
7019 };
7020
7021 static const struct dis386 vex_table[][256] = {
7022 /* VEX_0F */
7023 {
7024 /* 00 */
7025 { "(bad)", { XX } },
7026 { "(bad)", { XX } },
7027 { "(bad)", { XX } },
7028 { "(bad)", { XX } },
7029 { "(bad)", { XX } },
7030 { "(bad)", { XX } },
7031 { "(bad)", { XX } },
7032 { "(bad)", { XX } },
7033 /* 08 */
7034 { "(bad)", { XX } },
7035 { "(bad)", { XX } },
7036 { "(bad)", { XX } },
7037 { "(bad)", { XX } },
7038 { "(bad)", { XX } },
7039 { "(bad)", { XX } },
7040 { "(bad)", { XX } },
7041 { "(bad)", { XX } },
7042 /* 10 */
7043 { PREFIX_TABLE (PREFIX_VEX_10) },
7044 { PREFIX_TABLE (PREFIX_VEX_11) },
7045 { PREFIX_TABLE (PREFIX_VEX_12) },
7046 { MOD_TABLE (MOD_VEX_13) },
7047 { "vunpcklpX", { XM, Vex, EXx } },
7048 { "vunpckhpX", { XM, Vex, EXx } },
7049 { PREFIX_TABLE (PREFIX_VEX_16) },
7050 { MOD_TABLE (MOD_VEX_17) },
7051 /* 18 */
7052 { "(bad)", { XX } },
7053 { "(bad)", { XX } },
7054 { "(bad)", { XX } },
7055 { "(bad)", { XX } },
7056 { "(bad)", { XX } },
7057 { "(bad)", { XX } },
7058 { "(bad)", { XX } },
7059 { "(bad)", { XX } },
7060 /* 20 */
7061 { "(bad)", { XX } },
7062 { "(bad)", { XX } },
7063 { "(bad)", { XX } },
7064 { "(bad)", { XX } },
7065 { "(bad)", { XX } },
7066 { "(bad)", { XX } },
7067 { "(bad)", { XX } },
7068 { "(bad)", { XX } },
7069 /* 28 */
7070 { "vmovapX", { XM, EXx } },
7071 { "vmovapX", { EXxS, XM } },
7072 { PREFIX_TABLE (PREFIX_VEX_2A) },
7073 { MOD_TABLE (MOD_VEX_2B) },
7074 { PREFIX_TABLE (PREFIX_VEX_2C) },
7075 { PREFIX_TABLE (PREFIX_VEX_2D) },
7076 { PREFIX_TABLE (PREFIX_VEX_2E) },
7077 { PREFIX_TABLE (PREFIX_VEX_2F) },
7078 /* 30 */
7079 { "(bad)", { XX } },
7080 { "(bad)", { XX } },
7081 { "(bad)", { XX } },
7082 { "(bad)", { XX } },
7083 { "(bad)", { XX } },
7084 { "(bad)", { XX } },
7085 { "(bad)", { XX } },
7086 { "(bad)", { XX } },
7087 /* 38 */
7088 { "(bad)", { XX } },
7089 { "(bad)", { XX } },
7090 { "(bad)", { XX } },
7091 { "(bad)", { XX } },
7092 { "(bad)", { XX } },
7093 { "(bad)", { XX } },
7094 { "(bad)", { XX } },
7095 { "(bad)", { XX } },
7096 /* 40 */
7097 { "(bad)", { XX } },
7098 { "(bad)", { XX } },
7099 { "(bad)", { XX } },
7100 { "(bad)", { XX } },
7101 { "(bad)", { XX } },
7102 { "(bad)", { XX } },
7103 { "(bad)", { XX } },
7104 { "(bad)", { XX } },
7105 /* 48 */
7106 { "(bad)", { XX } },
7107 { "(bad)", { XX } },
7108 { "(bad)", { XX } },
7109 { "(bad)", { XX } },
7110 { "(bad)", { XX } },
7111 { "(bad)", { XX } },
7112 { "(bad)", { XX } },
7113 { "(bad)", { XX } },
7114 /* 50 */
7115 { MOD_TABLE (MOD_VEX_51) },
7116 { PREFIX_TABLE (PREFIX_VEX_51) },
7117 { PREFIX_TABLE (PREFIX_VEX_52) },
7118 { PREFIX_TABLE (PREFIX_VEX_53) },
7119 { "vandpX", { XM, Vex, EXx } },
7120 { "vandnpX", { XM, Vex, EXx } },
7121 { "vorpX", { XM, Vex, EXx } },
7122 { "vxorpX", { XM, Vex, EXx } },
7123 /* 58 */
7124 { PREFIX_TABLE (PREFIX_VEX_58) },
7125 { PREFIX_TABLE (PREFIX_VEX_59) },
7126 { PREFIX_TABLE (PREFIX_VEX_5A) },
7127 { PREFIX_TABLE (PREFIX_VEX_5B) },
7128 { PREFIX_TABLE (PREFIX_VEX_5C) },
7129 { PREFIX_TABLE (PREFIX_VEX_5D) },
7130 { PREFIX_TABLE (PREFIX_VEX_5E) },
7131 { PREFIX_TABLE (PREFIX_VEX_5F) },
7132 /* 60 */
7133 { PREFIX_TABLE (PREFIX_VEX_60) },
7134 { PREFIX_TABLE (PREFIX_VEX_61) },
7135 { PREFIX_TABLE (PREFIX_VEX_62) },
7136 { PREFIX_TABLE (PREFIX_VEX_63) },
7137 { PREFIX_TABLE (PREFIX_VEX_64) },
7138 { PREFIX_TABLE (PREFIX_VEX_65) },
7139 { PREFIX_TABLE (PREFIX_VEX_66) },
7140 { PREFIX_TABLE (PREFIX_VEX_67) },
7141 /* 68 */
7142 { PREFIX_TABLE (PREFIX_VEX_68) },
7143 { PREFIX_TABLE (PREFIX_VEX_69) },
7144 { PREFIX_TABLE (PREFIX_VEX_6A) },
7145 { PREFIX_TABLE (PREFIX_VEX_6B) },
7146 { PREFIX_TABLE (PREFIX_VEX_6C) },
7147 { PREFIX_TABLE (PREFIX_VEX_6D) },
7148 { PREFIX_TABLE (PREFIX_VEX_6E) },
7149 { PREFIX_TABLE (PREFIX_VEX_6F) },
7150 /* 70 */
7151 { PREFIX_TABLE (PREFIX_VEX_70) },
7152 { REG_TABLE (REG_VEX_71) },
7153 { REG_TABLE (REG_VEX_72) },
7154 { REG_TABLE (REG_VEX_73) },
7155 { PREFIX_TABLE (PREFIX_VEX_74) },
7156 { PREFIX_TABLE (PREFIX_VEX_75) },
7157 { PREFIX_TABLE (PREFIX_VEX_76) },
7158 { PREFIX_TABLE (PREFIX_VEX_77) },
7159 /* 78 */
7160 { "(bad)", { XX } },
7161 { "(bad)", { XX } },
7162 { "(bad)", { XX } },
7163 { "(bad)", { XX } },
7164 { PREFIX_TABLE (PREFIX_VEX_7C) },
7165 { PREFIX_TABLE (PREFIX_VEX_7D) },
7166 { PREFIX_TABLE (PREFIX_VEX_7E) },
7167 { PREFIX_TABLE (PREFIX_VEX_7F) },
7168 /* 80 */
7169 { "(bad)", { XX } },
7170 { "(bad)", { XX } },
7171 { "(bad)", { XX } },
7172 { "(bad)", { XX } },
7173 { "(bad)", { XX } },
7174 { "(bad)", { XX } },
7175 { "(bad)", { XX } },
7176 { "(bad)", { XX } },
7177 /* 88 */
7178 { "(bad)", { XX } },
7179 { "(bad)", { XX } },
7180 { "(bad)", { XX } },
7181 { "(bad)", { XX } },
7182 { "(bad)", { XX } },
7183 { "(bad)", { XX } },
7184 { "(bad)", { XX } },
7185 { "(bad)", { XX } },
7186 /* 90 */
7187 { "(bad)", { XX } },
7188 { "(bad)", { XX } },
7189 { "(bad)", { XX } },
7190 { "(bad)", { XX } },
7191 { "(bad)", { XX } },
7192 { "(bad)", { XX } },
7193 { "(bad)", { XX } },
7194 { "(bad)", { XX } },
7195 /* 98 */
7196 { "(bad)", { XX } },
7197 { "(bad)", { XX } },
7198 { "(bad)", { XX } },
7199 { "(bad)", { XX } },
7200 { "(bad)", { XX } },
7201 { "(bad)", { XX } },
7202 { "(bad)", { XX } },
7203 { "(bad)", { XX } },
7204 /* a0 */
7205 { "(bad)", { XX } },
7206 { "(bad)", { XX } },
7207 { "(bad)", { XX } },
7208 { "(bad)", { XX } },
7209 { "(bad)", { XX } },
7210 { "(bad)", { XX } },
7211 { "(bad)", { XX } },
7212 { "(bad)", { XX } },
7213 /* a8 */
7214 { "(bad)", { XX } },
7215 { "(bad)", { XX } },
7216 { "(bad)", { XX } },
7217 { "(bad)", { XX } },
7218 { "(bad)", { XX } },
7219 { "(bad)", { XX } },
7220 { REG_TABLE (REG_VEX_AE) },
7221 { "(bad)", { XX } },
7222 /* b0 */
7223 { "(bad)", { XX } },
7224 { "(bad)", { XX } },
7225 { "(bad)", { XX } },
7226 { "(bad)", { XX } },
7227 { "(bad)", { XX } },
7228 { "(bad)", { XX } },
7229 { "(bad)", { XX } },
7230 { "(bad)", { XX } },
7231 /* b8 */
7232 { "(bad)", { XX } },
7233 { "(bad)", { XX } },
7234 { "(bad)", { XX } },
7235 { "(bad)", { XX } },
7236 { "(bad)", { XX } },
7237 { "(bad)", { XX } },
7238 { "(bad)", { XX } },
7239 { "(bad)", { XX } },
7240 /* c0 */
7241 { "(bad)", { XX } },
7242 { "(bad)", { XX } },
7243 { PREFIX_TABLE (PREFIX_VEX_C2) },
7244 { "(bad)", { XX } },
7245 { PREFIX_TABLE (PREFIX_VEX_C4) },
7246 { PREFIX_TABLE (PREFIX_VEX_C5) },
7247 { "vshufpX", { XM, Vex, EXx, Ib } },
7248 { "(bad)", { XX } },
7249 /* c8 */
7250 { "(bad)", { XX } },
7251 { "(bad)", { XX } },
7252 { "(bad)", { XX } },
7253 { "(bad)", { XX } },
7254 { "(bad)", { XX } },
7255 { "(bad)", { XX } },
7256 { "(bad)", { XX } },
7257 { "(bad)", { XX } },
7258 /* d0 */
7259 { PREFIX_TABLE (PREFIX_VEX_D0) },
7260 { PREFIX_TABLE (PREFIX_VEX_D1) },
7261 { PREFIX_TABLE (PREFIX_VEX_D2) },
7262 { PREFIX_TABLE (PREFIX_VEX_D3) },
7263 { PREFIX_TABLE (PREFIX_VEX_D4) },
7264 { PREFIX_TABLE (PREFIX_VEX_D5) },
7265 { PREFIX_TABLE (PREFIX_VEX_D6) },
7266 { PREFIX_TABLE (PREFIX_VEX_D7) },
7267 /* d8 */
7268 { PREFIX_TABLE (PREFIX_VEX_D8) },
7269 { PREFIX_TABLE (PREFIX_VEX_D9) },
7270 { PREFIX_TABLE (PREFIX_VEX_DA) },
7271 { PREFIX_TABLE (PREFIX_VEX_DB) },
7272 { PREFIX_TABLE (PREFIX_VEX_DC) },
7273 { PREFIX_TABLE (PREFIX_VEX_DD) },
7274 { PREFIX_TABLE (PREFIX_VEX_DE) },
7275 { PREFIX_TABLE (PREFIX_VEX_DF) },
7276 /* e0 */
7277 { PREFIX_TABLE (PREFIX_VEX_E0) },
7278 { PREFIX_TABLE (PREFIX_VEX_E1) },
7279 { PREFIX_TABLE (PREFIX_VEX_E2) },
7280 { PREFIX_TABLE (PREFIX_VEX_E3) },
7281 { PREFIX_TABLE (PREFIX_VEX_E4) },
7282 { PREFIX_TABLE (PREFIX_VEX_E5) },
7283 { PREFIX_TABLE (PREFIX_VEX_E6) },
7284 { PREFIX_TABLE (PREFIX_VEX_E7) },
7285 /* e8 */
7286 { PREFIX_TABLE (PREFIX_VEX_E8) },
7287 { PREFIX_TABLE (PREFIX_VEX_E9) },
7288 { PREFIX_TABLE (PREFIX_VEX_EA) },
7289 { PREFIX_TABLE (PREFIX_VEX_EB) },
7290 { PREFIX_TABLE (PREFIX_VEX_EC) },
7291 { PREFIX_TABLE (PREFIX_VEX_ED) },
7292 { PREFIX_TABLE (PREFIX_VEX_EE) },
7293 { PREFIX_TABLE (PREFIX_VEX_EF) },
7294 /* f0 */
7295 { PREFIX_TABLE (PREFIX_VEX_F0) },
7296 { PREFIX_TABLE (PREFIX_VEX_F1) },
7297 { PREFIX_TABLE (PREFIX_VEX_F2) },
7298 { PREFIX_TABLE (PREFIX_VEX_F3) },
7299 { PREFIX_TABLE (PREFIX_VEX_F4) },
7300 { PREFIX_TABLE (PREFIX_VEX_F5) },
7301 { PREFIX_TABLE (PREFIX_VEX_F6) },
7302 { PREFIX_TABLE (PREFIX_VEX_F7) },
7303 /* f8 */
7304 { PREFIX_TABLE (PREFIX_VEX_F8) },
7305 { PREFIX_TABLE (PREFIX_VEX_F9) },
7306 { PREFIX_TABLE (PREFIX_VEX_FA) },
7307 { PREFIX_TABLE (PREFIX_VEX_FB) },
7308 { PREFIX_TABLE (PREFIX_VEX_FC) },
7309 { PREFIX_TABLE (PREFIX_VEX_FD) },
7310 { PREFIX_TABLE (PREFIX_VEX_FE) },
7311 { "(bad)", { XX } },
7312 },
7313 /* VEX_0F38 */
7314 {
7315 /* 00 */
7316 { PREFIX_TABLE (PREFIX_VEX_3800) },
7317 { PREFIX_TABLE (PREFIX_VEX_3801) },
7318 { PREFIX_TABLE (PREFIX_VEX_3802) },
7319 { PREFIX_TABLE (PREFIX_VEX_3803) },
7320 { PREFIX_TABLE (PREFIX_VEX_3804) },
7321 { PREFIX_TABLE (PREFIX_VEX_3805) },
7322 { PREFIX_TABLE (PREFIX_VEX_3806) },
7323 { PREFIX_TABLE (PREFIX_VEX_3807) },
7324 /* 08 */
7325 { PREFIX_TABLE (PREFIX_VEX_3808) },
7326 { PREFIX_TABLE (PREFIX_VEX_3809) },
7327 { PREFIX_TABLE (PREFIX_VEX_380A) },
7328 { PREFIX_TABLE (PREFIX_VEX_380B) },
7329 { PREFIX_TABLE (PREFIX_VEX_380C) },
7330 { PREFIX_TABLE (PREFIX_VEX_380D) },
7331 { PREFIX_TABLE (PREFIX_VEX_380E) },
7332 { PREFIX_TABLE (PREFIX_VEX_380F) },
7333 /* 10 */
7334 { "(bad)", { XX } },
7335 { "(bad)", { XX } },
7336 { "(bad)", { XX } },
7337 { "(bad)", { XX } },
7338 { "(bad)", { XX } },
7339 { "(bad)", { XX } },
7340 { "(bad)", { XX } },
7341 { PREFIX_TABLE (PREFIX_VEX_3817) },
7342 /* 18 */
7343 { PREFIX_TABLE (PREFIX_VEX_3818) },
7344 { PREFIX_TABLE (PREFIX_VEX_3819) },
7345 { PREFIX_TABLE (PREFIX_VEX_381A) },
7346 { "(bad)", { XX } },
7347 { PREFIX_TABLE (PREFIX_VEX_381C) },
7348 { PREFIX_TABLE (PREFIX_VEX_381D) },
7349 { PREFIX_TABLE (PREFIX_VEX_381E) },
7350 { "(bad)", { XX } },
7351 /* 20 */
7352 { PREFIX_TABLE (PREFIX_VEX_3820) },
7353 { PREFIX_TABLE (PREFIX_VEX_3821) },
7354 { PREFIX_TABLE (PREFIX_VEX_3822) },
7355 { PREFIX_TABLE (PREFIX_VEX_3823) },
7356 { PREFIX_TABLE (PREFIX_VEX_3824) },
7357 { PREFIX_TABLE (PREFIX_VEX_3825) },
7358 { "(bad)", { XX } },
7359 { "(bad)", { XX } },
7360 /* 28 */
7361 { PREFIX_TABLE (PREFIX_VEX_3828) },
7362 { PREFIX_TABLE (PREFIX_VEX_3829) },
7363 { PREFIX_TABLE (PREFIX_VEX_382A) },
7364 { PREFIX_TABLE (PREFIX_VEX_382B) },
7365 { PREFIX_TABLE (PREFIX_VEX_382C) },
7366 { PREFIX_TABLE (PREFIX_VEX_382D) },
7367 { PREFIX_TABLE (PREFIX_VEX_382E) },
7368 { PREFIX_TABLE (PREFIX_VEX_382F) },
7369 /* 30 */
7370 { PREFIX_TABLE (PREFIX_VEX_3830) },
7371 { PREFIX_TABLE (PREFIX_VEX_3831) },
7372 { PREFIX_TABLE (PREFIX_VEX_3832) },
7373 { PREFIX_TABLE (PREFIX_VEX_3833) },
7374 { PREFIX_TABLE (PREFIX_VEX_3834) },
7375 { PREFIX_TABLE (PREFIX_VEX_3835) },
7376 { "(bad)", { XX } },
7377 { PREFIX_TABLE (PREFIX_VEX_3837) },
7378 /* 38 */
7379 { PREFIX_TABLE (PREFIX_VEX_3838) },
7380 { PREFIX_TABLE (PREFIX_VEX_3839) },
7381 { PREFIX_TABLE (PREFIX_VEX_383A) },
7382 { PREFIX_TABLE (PREFIX_VEX_383B) },
7383 { PREFIX_TABLE (PREFIX_VEX_383C) },
7384 { PREFIX_TABLE (PREFIX_VEX_383D) },
7385 { PREFIX_TABLE (PREFIX_VEX_383E) },
7386 { PREFIX_TABLE (PREFIX_VEX_383F) },
7387 /* 40 */
7388 { PREFIX_TABLE (PREFIX_VEX_3840) },
7389 { PREFIX_TABLE (PREFIX_VEX_3841) },
7390 { "(bad)", { XX } },
7391 { "(bad)", { XX } },
7392 { "(bad)", { XX } },
7393 { "(bad)", { XX } },
7394 { "(bad)", { XX } },
7395 { "(bad)", { XX } },
7396 /* 48 */
7397 { "(bad)", { XX } },
7398 { "(bad)", { XX } },
7399 { "(bad)", { XX } },
7400 { "(bad)", { XX } },
7401 { "(bad)", { XX } },
7402 { "(bad)", { XX } },
7403 { "(bad)", { XX } },
7404 { "(bad)", { XX } },
7405 /* 50 */
7406 { "(bad)", { XX } },
7407 { "(bad)", { XX } },
7408 { "(bad)", { XX } },
7409 { "(bad)", { XX } },
7410 { "(bad)", { XX } },
7411 { "(bad)", { XX } },
7412 { "(bad)", { XX } },
7413 { "(bad)", { XX } },
7414 /* 58 */
7415 { "(bad)", { XX } },
7416 { "(bad)", { XX } },
7417 { "(bad)", { XX } },
7418 { "(bad)", { XX } },
7419 { "(bad)", { XX } },
7420 { "(bad)", { XX } },
7421 { "(bad)", { XX } },
7422 { "(bad)", { XX } },
7423 /* 60 */
7424 { "(bad)", { XX } },
7425 { "(bad)", { XX } },
7426 { "(bad)", { XX } },
7427 { "(bad)", { XX } },
7428 { "(bad)", { XX } },
7429 { "(bad)", { XX } },
7430 { "(bad)", { XX } },
7431 { "(bad)", { XX } },
7432 /* 68 */
7433 { "(bad)", { XX } },
7434 { "(bad)", { XX } },
7435 { "(bad)", { XX } },
7436 { "(bad)", { XX } },
7437 { "(bad)", { XX } },
7438 { "(bad)", { XX } },
7439 { "(bad)", { XX } },
7440 { "(bad)", { XX } },
7441 /* 70 */
7442 { "(bad)", { XX } },
7443 { "(bad)", { XX } },
7444 { "(bad)", { XX } },
7445 { "(bad)", { XX } },
7446 { "(bad)", { XX } },
7447 { "(bad)", { XX } },
7448 { "(bad)", { XX } },
7449 { "(bad)", { XX } },
7450 /* 78 */
7451 { "(bad)", { XX } },
7452 { "(bad)", { XX } },
7453 { "(bad)", { XX } },
7454 { "(bad)", { XX } },
7455 { "(bad)", { XX } },
7456 { "(bad)", { XX } },
7457 { "(bad)", { XX } },
7458 { "(bad)", { XX } },
7459 /* 80 */
7460 { "(bad)", { XX } },
7461 { "(bad)", { XX } },
7462 { "(bad)", { XX } },
7463 { "(bad)", { XX } },
7464 { "(bad)", { XX } },
7465 { "(bad)", { XX } },
7466 { "(bad)", { XX } },
7467 { "(bad)", { XX } },
7468 /* 88 */
7469 { "(bad)", { XX } },
7470 { "(bad)", { XX } },
7471 { "(bad)", { XX } },
7472 { "(bad)", { XX } },
7473 { "(bad)", { XX } },
7474 { "(bad)", { XX } },
7475 { "(bad)", { XX } },
7476 { "(bad)", { XX } },
7477 /* 90 */
7478 { "(bad)", { XX } },
7479 { "(bad)", { XX } },
7480 { "(bad)", { XX } },
7481 { "(bad)", { XX } },
7482 { "(bad)", { XX } },
7483 { "(bad)", { XX } },
7484 { PREFIX_TABLE (PREFIX_VEX_3896) },
7485 { PREFIX_TABLE (PREFIX_VEX_3897) },
7486 /* 98 */
7487 { PREFIX_TABLE (PREFIX_VEX_3898) },
7488 { PREFIX_TABLE (PREFIX_VEX_3899) },
7489 { PREFIX_TABLE (PREFIX_VEX_389A) },
7490 { PREFIX_TABLE (PREFIX_VEX_389B) },
7491 { PREFIX_TABLE (PREFIX_VEX_389C) },
7492 { PREFIX_TABLE (PREFIX_VEX_389D) },
7493 { PREFIX_TABLE (PREFIX_VEX_389E) },
7494 { PREFIX_TABLE (PREFIX_VEX_389F) },
7495 /* a0 */
7496 { "(bad)", { XX } },
7497 { "(bad)", { XX } },
7498 { "(bad)", { XX } },
7499 { "(bad)", { XX } },
7500 { "(bad)", { XX } },
7501 { "(bad)", { XX } },
7502 { PREFIX_TABLE (PREFIX_VEX_38A6) },
7503 { PREFIX_TABLE (PREFIX_VEX_38A7) },
7504 /* a8 */
7505 { PREFIX_TABLE (PREFIX_VEX_38A8) },
7506 { PREFIX_TABLE (PREFIX_VEX_38A9) },
7507 { PREFIX_TABLE (PREFIX_VEX_38AA) },
7508 { PREFIX_TABLE (PREFIX_VEX_38AB) },
7509 { PREFIX_TABLE (PREFIX_VEX_38AC) },
7510 { PREFIX_TABLE (PREFIX_VEX_38AD) },
7511 { PREFIX_TABLE (PREFIX_VEX_38AE) },
7512 { PREFIX_TABLE (PREFIX_VEX_38AF) },
7513 /* b0 */
7514 { "(bad)", { XX } },
7515 { "(bad)", { XX } },
7516 { "(bad)", { XX } },
7517 { "(bad)", { XX } },
7518 { "(bad)", { XX } },
7519 { "(bad)", { XX } },
7520 { PREFIX_TABLE (PREFIX_VEX_38B6) },
7521 { PREFIX_TABLE (PREFIX_VEX_38B7) },
7522 /* b8 */
7523 { PREFIX_TABLE (PREFIX_VEX_38B8) },
7524 { PREFIX_TABLE (PREFIX_VEX_38B9) },
7525 { PREFIX_TABLE (PREFIX_VEX_38BA) },
7526 { PREFIX_TABLE (PREFIX_VEX_38BB) },
7527 { PREFIX_TABLE (PREFIX_VEX_38BC) },
7528 { PREFIX_TABLE (PREFIX_VEX_38BD) },
7529 { PREFIX_TABLE (PREFIX_VEX_38BE) },
7530 { PREFIX_TABLE (PREFIX_VEX_38BF) },
7531 /* c0 */
7532 { "(bad)", { XX } },
7533 { "(bad)", { XX } },
7534 { "(bad)", { XX } },
7535 { "(bad)", { XX } },
7536 { "(bad)", { XX } },
7537 { "(bad)", { XX } },
7538 { "(bad)", { XX } },
7539 { "(bad)", { XX } },
7540 /* c8 */
7541 { "(bad)", { XX } },
7542 { "(bad)", { XX } },
7543 { "(bad)", { XX } },
7544 { "(bad)", { XX } },
7545 { "(bad)", { XX } },
7546 { "(bad)", { XX } },
7547 { "(bad)", { XX } },
7548 { "(bad)", { XX } },
7549 /* d0 */
7550 { "(bad)", { XX } },
7551 { "(bad)", { XX } },
7552 { "(bad)", { XX } },
7553 { "(bad)", { XX } },
7554 { "(bad)", { XX } },
7555 { "(bad)", { XX } },
7556 { "(bad)", { XX } },
7557 { "(bad)", { XX } },
7558 /* d8 */
7559 { "(bad)", { XX } },
7560 { "(bad)", { XX } },
7561 { "(bad)", { XX } },
7562 { PREFIX_TABLE (PREFIX_VEX_38DB) },
7563 { PREFIX_TABLE (PREFIX_VEX_38DC) },
7564 { PREFIX_TABLE (PREFIX_VEX_38DD) },
7565 { PREFIX_TABLE (PREFIX_VEX_38DE) },
7566 { PREFIX_TABLE (PREFIX_VEX_38DF) },
7567 /* e0 */
7568 { "(bad)", { XX } },
7569 { "(bad)", { XX } },
7570 { "(bad)", { XX } },
7571 { "(bad)", { XX } },
7572 { "(bad)", { XX } },
7573 { "(bad)", { XX } },
7574 { "(bad)", { XX } },
7575 { "(bad)", { XX } },
7576 /* e8 */
7577 { "(bad)", { XX } },
7578 { "(bad)", { XX } },
7579 { "(bad)", { XX } },
7580 { "(bad)", { XX } },
7581 { "(bad)", { XX } },
7582 { "(bad)", { XX } },
7583 { "(bad)", { XX } },
7584 { "(bad)", { XX } },
7585 /* f0 */
7586 { "(bad)", { XX } },
7587 { "(bad)", { XX } },
7588 { "(bad)", { XX } },
7589 { "(bad)", { XX } },
7590 { "(bad)", { XX } },
7591 { "(bad)", { XX } },
7592 { "(bad)", { XX } },
7593 { "(bad)", { XX } },
7594 /* f8 */
7595 { "(bad)", { XX } },
7596 { "(bad)", { XX } },
7597 { "(bad)", { XX } },
7598 { "(bad)", { XX } },
7599 { "(bad)", { XX } },
7600 { "(bad)", { XX } },
7601 { "(bad)", { XX } },
7602 { "(bad)", { XX } },
7603 },
7604 /* VEX_0F3A */
7605 {
7606 /* 00 */
7607 { "(bad)", { XX } },
7608 { "(bad)", { XX } },
7609 { "(bad)", { XX } },
7610 { "(bad)", { XX } },
7611 { PREFIX_TABLE (PREFIX_VEX_3A04) },
7612 { PREFIX_TABLE (PREFIX_VEX_3A05) },
7613 { PREFIX_TABLE (PREFIX_VEX_3A06) },
7614 { "(bad)", { XX } },
7615 /* 08 */
7616 { PREFIX_TABLE (PREFIX_VEX_3A08) },
7617 { PREFIX_TABLE (PREFIX_VEX_3A09) },
7618 { PREFIX_TABLE (PREFIX_VEX_3A0A) },
7619 { PREFIX_TABLE (PREFIX_VEX_3A0B) },
7620 { PREFIX_TABLE (PREFIX_VEX_3A0C) },
7621 { PREFIX_TABLE (PREFIX_VEX_3A0D) },
7622 { PREFIX_TABLE (PREFIX_VEX_3A0E) },
7623 { PREFIX_TABLE (PREFIX_VEX_3A0F) },
7624 /* 10 */
7625 { "(bad)", { XX } },
7626 { "(bad)", { XX } },
7627 { "(bad)", { XX } },
7628 { "(bad)", { XX } },
7629 { PREFIX_TABLE (PREFIX_VEX_3A14) },
7630 { PREFIX_TABLE (PREFIX_VEX_3A15) },
7631 { PREFIX_TABLE (PREFIX_VEX_3A16) },
7632 { PREFIX_TABLE (PREFIX_VEX_3A17) },
7633 /* 18 */
7634 { PREFIX_TABLE (PREFIX_VEX_3A18) },
7635 { PREFIX_TABLE (PREFIX_VEX_3A19) },
7636 { "(bad)", { XX } },
7637 { "(bad)", { XX } },
7638 { "(bad)", { XX } },
7639 { "(bad)", { XX } },
7640 { "(bad)", { XX } },
7641 { "(bad)", { XX } },
7642 /* 20 */
7643 { PREFIX_TABLE (PREFIX_VEX_3A20) },
7644 { PREFIX_TABLE (PREFIX_VEX_3A21) },
7645 { PREFIX_TABLE (PREFIX_VEX_3A22) },
7646 { "(bad)", { XX } },
7647 { "(bad)", { XX } },
7648 { "(bad)", { XX } },
7649 { "(bad)", { XX } },
7650 { "(bad)", { XX } },
7651 /* 28 */
7652 { "(bad)", { XX } },
7653 { "(bad)", { XX } },
7654 { "(bad)", { XX } },
7655 { "(bad)", { XX } },
7656 { "(bad)", { XX } },
7657 { "(bad)", { XX } },
7658 { "(bad)", { XX } },
7659 { "(bad)", { XX } },
7660 /* 30 */
7661 { "(bad)", { XX } },
7662 { "(bad)", { XX } },
7663 { "(bad)", { XX } },
7664 { "(bad)", { XX } },
7665 { "(bad)", { XX } },
7666 { "(bad)", { XX } },
7667 { "(bad)", { XX } },
7668 { "(bad)", { XX } },
7669 /* 38 */
7670 { "(bad)", { XX } },
7671 { "(bad)", { XX } },
7672 { "(bad)", { XX } },
7673 { "(bad)", { XX } },
7674 { "(bad)", { XX } },
7675 { "(bad)", { XX } },
7676 { "(bad)", { XX } },
7677 { "(bad)", { XX } },
7678 /* 40 */
7679 { PREFIX_TABLE (PREFIX_VEX_3A40) },
7680 { PREFIX_TABLE (PREFIX_VEX_3A41) },
7681 { PREFIX_TABLE (PREFIX_VEX_3A42) },
7682 { "(bad)", { XX } },
7683 { PREFIX_TABLE (PREFIX_VEX_3A44) },
7684 { "(bad)", { XX } },
7685 { "(bad)", { XX } },
7686 { "(bad)", { XX } },
7687 /* 48 */
7688 { "(bad)", { XX } },
7689 { "(bad)", { XX } },
7690 { PREFIX_TABLE (PREFIX_VEX_3A4A) },
7691 { PREFIX_TABLE (PREFIX_VEX_3A4B) },
7692 { PREFIX_TABLE (PREFIX_VEX_3A4C) },
7693 { "(bad)", { XX } },
7694 { "(bad)", { XX } },
7695 { "(bad)", { XX } },
7696 /* 50 */
7697 { "(bad)", { XX } },
7698 { "(bad)", { XX } },
7699 { "(bad)", { XX } },
7700 { "(bad)", { XX } },
7701 { "(bad)", { XX } },
7702 { "(bad)", { XX } },
7703 { "(bad)", { XX } },
7704 { "(bad)", { XX } },
7705 /* 58 */
7706 { "(bad)", { XX } },
7707 { "(bad)", { XX } },
7708 { "(bad)", { XX } },
7709 { "(bad)", { XX } },
7710 { "(bad)", { XX } },
7711 { "(bad)", { XX } },
7712 { "(bad)", { XX } },
7713 { "(bad)", { XX } },
7714 /* 60 */
7715 { PREFIX_TABLE (PREFIX_VEX_3A60) },
7716 { PREFIX_TABLE (PREFIX_VEX_3A61) },
7717 { PREFIX_TABLE (PREFIX_VEX_3A62) },
7718 { PREFIX_TABLE (PREFIX_VEX_3A63) },
7719 { "(bad)", { XX } },
7720 { "(bad)", { XX } },
7721 { "(bad)", { XX } },
7722 { "(bad)", { XX } },
7723 /* 68 */
7724 { "(bad)", { XX } },
7725 { "(bad)", { XX } },
7726 { "(bad)", { XX } },
7727 { "(bad)", { XX } },
7728 { "(bad)", { XX } },
7729 { "(bad)", { XX } },
7730 { "(bad)", { XX } },
7731 { "(bad)", { XX } },
7732 /* 70 */
7733 { "(bad)", { XX } },
7734 { "(bad)", { XX } },
7735 { "(bad)", { XX } },
7736 { "(bad)", { XX } },
7737 { "(bad)", { XX } },
7738 { "(bad)", { XX } },
7739 { "(bad)", { XX } },
7740 { "(bad)", { XX } },
7741 /* 78 */
7742 { "(bad)", { XX } },
7743 { "(bad)", { XX } },
7744 { "(bad)", { XX } },
7745 { "(bad)", { XX } },
7746 { "(bad)", { XX } },
7747 { "(bad)", { XX } },
7748 { "(bad)", { XX } },
7749 { "(bad)", { XX } },
7750 /* 80 */
7751 { "(bad)", { XX } },
7752 { "(bad)", { XX } },
7753 { "(bad)", { XX } },
7754 { "(bad)", { XX } },
7755 { "(bad)", { XX } },
7756 { "(bad)", { XX } },
7757 { "(bad)", { XX } },
7758 { "(bad)", { XX } },
7759 /* 88 */
7760 { "(bad)", { XX } },
7761 { "(bad)", { XX } },
7762 { "(bad)", { XX } },
7763 { "(bad)", { XX } },
7764 { "(bad)", { XX } },
7765 { "(bad)", { XX } },
7766 { "(bad)", { XX } },
7767 { "(bad)", { XX } },
7768 /* 90 */
7769 { "(bad)", { XX } },
7770 { "(bad)", { XX } },
7771 { "(bad)", { XX } },
7772 { "(bad)", { XX } },
7773 { "(bad)", { XX } },
7774 { "(bad)", { XX } },
7775 { "(bad)", { XX } },
7776 { "(bad)", { XX } },
7777 /* 98 */
7778 { "(bad)", { XX } },
7779 { "(bad)", { XX } },
7780 { "(bad)", { XX } },
7781 { "(bad)", { XX } },
7782 { "(bad)", { XX } },
7783 { "(bad)", { XX } },
7784 { "(bad)", { XX } },
7785 { "(bad)", { XX } },
7786 /* a0 */
7787 { "(bad)", { XX } },
7788 { "(bad)", { XX } },
7789 { "(bad)", { XX } },
7790 { "(bad)", { XX } },
7791 { "(bad)", { XX } },
7792 { "(bad)", { XX } },
7793 { "(bad)", { XX } },
7794 { "(bad)", { XX } },
7795 /* a8 */
7796 { "(bad)", { XX } },
7797 { "(bad)", { XX } },
7798 { "(bad)", { XX } },
7799 { "(bad)", { XX } },
7800 { "(bad)", { XX } },
7801 { "(bad)", { XX } },
7802 { "(bad)", { XX } },
7803 { "(bad)", { XX } },
7804 /* b0 */
7805 { "(bad)", { XX } },
7806 { "(bad)", { XX } },
7807 { "(bad)", { XX } },
7808 { "(bad)", { XX } },
7809 { "(bad)", { XX } },
7810 { "(bad)", { XX } },
7811 { "(bad)", { XX } },
7812 { "(bad)", { XX } },
7813 /* b8 */
7814 { "(bad)", { XX } },
7815 { "(bad)", { XX } },
7816 { "(bad)", { XX } },
7817 { "(bad)", { XX } },
7818 { "(bad)", { XX } },
7819 { "(bad)", { XX } },
7820 { "(bad)", { XX } },
7821 { "(bad)", { XX } },
7822 /* c0 */
7823 { "(bad)", { XX } },
7824 { "(bad)", { XX } },
7825 { "(bad)", { XX } },
7826 { "(bad)", { XX } },
7827 { "(bad)", { XX } },
7828 { "(bad)", { XX } },
7829 { "(bad)", { XX } },
7830 { "(bad)", { XX } },
7831 /* c8 */
7832 { "(bad)", { XX } },
7833 { "(bad)", { XX } },
7834 { "(bad)", { XX } },
7835 { "(bad)", { XX } },
7836 { "(bad)", { XX } },
7837 { "(bad)", { XX } },
7838 { "(bad)", { XX } },
7839 { "(bad)", { XX } },
7840 /* d0 */
7841 { "(bad)", { XX } },
7842 { "(bad)", { XX } },
7843 { "(bad)", { XX } },
7844 { "(bad)", { XX } },
7845 { "(bad)", { XX } },
7846 { "(bad)", { XX } },
7847 { "(bad)", { XX } },
7848 { "(bad)", { XX } },
7849 /* d8 */
7850 { "(bad)", { XX } },
7851 { "(bad)", { XX } },
7852 { "(bad)", { XX } },
7853 { "(bad)", { XX } },
7854 { "(bad)", { XX } },
7855 { "(bad)", { XX } },
7856 { "(bad)", { XX } },
7857 { PREFIX_TABLE (PREFIX_VEX_3ADF) },
7858 /* e0 */
7859 { "(bad)", { XX } },
7860 { "(bad)", { XX } },
7861 { "(bad)", { XX } },
7862 { "(bad)", { XX } },
7863 { "(bad)", { XX } },
7864 { "(bad)", { XX } },
7865 { "(bad)", { XX } },
7866 { "(bad)", { XX } },
7867 /* e8 */
7868 { "(bad)", { XX } },
7869 { "(bad)", { XX } },
7870 { "(bad)", { XX } },
7871 { "(bad)", { XX } },
7872 { "(bad)", { XX } },
7873 { "(bad)", { XX } },
7874 { "(bad)", { XX } },
7875 { "(bad)", { XX } },
7876 /* f0 */
7877 { "(bad)", { XX } },
7878 { "(bad)", { XX } },
7879 { "(bad)", { XX } },
7880 { "(bad)", { XX } },
7881 { "(bad)", { XX } },
7882 { "(bad)", { XX } },
7883 { "(bad)", { XX } },
7884 { "(bad)", { XX } },
7885 /* f8 */
7886 { "(bad)", { XX } },
7887 { "(bad)", { XX } },
7888 { "(bad)", { XX } },
7889 { "(bad)", { XX } },
7890 { "(bad)", { XX } },
7891 { "(bad)", { XX } },
7892 { "(bad)", { XX } },
7893 { "(bad)", { XX } },
7894 },
7895 };
7896
7897 static const struct dis386 vex_len_table[][2] = {
7898 /* VEX_LEN_10_P_1 */
7899 {
7900 { "vmovss", { XMVex, Vex128, EXd } },
7901 { "(bad)", { XX } },
7902 },
7903
7904 /* VEX_LEN_10_P_3 */
7905 {
7906 { "vmovsd", { XMVex, Vex128, EXq } },
7907 { "(bad)", { XX } },
7908 },
7909
7910 /* VEX_LEN_11_P_1 */
7911 {
7912 { "vmovss", { EXdVexS, Vex128, XM } },
7913 { "(bad)", { XX } },
7914 },
7915
7916 /* VEX_LEN_11_P_3 */
7917 {
7918 { "vmovsd", { EXqVexS, Vex128, XM } },
7919 { "(bad)", { XX } },
7920 },
7921
7922 /* VEX_LEN_12_P_0_M_0 */
7923 {
7924 { "vmovlps", { XM, Vex128, EXq } },
7925 { "(bad)", { XX } },
7926 },
7927
7928 /* VEX_LEN_12_P_0_M_1 */
7929 {
7930 { "vmovhlps", { XM, Vex128, EXq } },
7931 { "(bad)", { XX } },
7932 },
7933
7934 /* VEX_LEN_12_P_2 */
7935 {
7936 { "vmovlpd", { XM, Vex128, EXq } },
7937 { "(bad)", { XX } },
7938 },
7939
7940 /* VEX_LEN_13_M_0 */
7941 {
7942 { "vmovlpX", { EXq, XM } },
7943 { "(bad)", { XX } },
7944 },
7945
7946 /* VEX_LEN_16_P_0_M_0 */
7947 {
7948 { "vmovhps", { XM, Vex128, EXq } },
7949 { "(bad)", { XX } },
7950 },
7951
7952 /* VEX_LEN_16_P_0_M_1 */
7953 {
7954 { "vmovlhps", { XM, Vex128, EXq } },
7955 { "(bad)", { XX } },
7956 },
7957
7958 /* VEX_LEN_16_P_2 */
7959 {
7960 { "vmovhpd", { XM, Vex128, EXq } },
7961 { "(bad)", { XX } },
7962 },
7963
7964 /* VEX_LEN_17_M_0 */
7965 {
7966 { "vmovhpX", { EXq, XM } },
7967 { "(bad)", { XX } },
7968 },
7969
7970 /* VEX_LEN_2A_P_1 */
7971 {
7972 { "vcvtsi2ss%LQ", { XM, Vex128, Ev } },
7973 { "(bad)", { XX } },
7974 },
7975
7976 /* VEX_LEN_2A_P_3 */
7977 {
7978 { "vcvtsi2sd%LQ", { XM, Vex128, Ev } },
7979 { "(bad)", { XX } },
7980 },
7981
7982 /* VEX_LEN_2C_P_1 */
7983 {
7984 { "vcvttss2siY", { Gv, EXd } },
7985 { "(bad)", { XX } },
7986 },
7987
7988 /* VEX_LEN_2C_P_3 */
7989 {
7990 { "vcvttsd2siY", { Gv, EXq } },
7991 { "(bad)", { XX } },
7992 },
7993
7994 /* VEX_LEN_2D_P_1 */
7995 {
7996 { "vcvtss2siY", { Gv, EXd } },
7997 { "(bad)", { XX } },
7998 },
7999
8000 /* VEX_LEN_2D_P_3 */
8001 {
8002 { "vcvtsd2siY", { Gv, EXq } },
8003 { "(bad)", { XX } },
8004 },
8005
8006 /* VEX_LEN_2E_P_0 */
8007 {
8008 { "vucomiss", { XM, EXd } },
8009 { "(bad)", { XX } },
8010 },
8011
8012 /* VEX_LEN_2E_P_2 */
8013 {
8014 { "vucomisd", { XM, EXq } },
8015 { "(bad)", { XX } },
8016 },
8017
8018 /* VEX_LEN_2F_P_0 */
8019 {
8020 { "vcomiss", { XM, EXd } },
8021 { "(bad)", { XX } },
8022 },
8023
8024 /* VEX_LEN_2F_P_2 */
8025 {
8026 { "vcomisd", { XM, EXq } },
8027 { "(bad)", { XX } },
8028 },
8029
8030 /* VEX_LEN_51_P_1 */
8031 {
8032 { "vsqrtss", { XM, Vex128, EXd } },
8033 { "(bad)", { XX } },
8034 },
8035
8036 /* VEX_LEN_51_P_3 */
8037 {
8038 { "vsqrtsd", { XM, Vex128, EXq } },
8039 { "(bad)", { XX } },
8040 },
8041
8042 /* VEX_LEN_52_P_1 */
8043 {
8044 { "vrsqrtss", { XM, Vex128, EXd } },
8045 { "(bad)", { XX } },
8046 },
8047
8048 /* VEX_LEN_53_P_1 */
8049 {
8050 { "vrcpss", { XM, Vex128, EXd } },
8051 { "(bad)", { XX } },
8052 },
8053
8054 /* VEX_LEN_58_P_1 */
8055 {
8056 { "vaddss", { XM, Vex128, EXd } },
8057 { "(bad)", { XX } },
8058 },
8059
8060 /* VEX_LEN_58_P_3 */
8061 {
8062 { "vaddsd", { XM, Vex128, EXq } },
8063 { "(bad)", { XX } },
8064 },
8065
8066 /* VEX_LEN_59_P_1 */
8067 {
8068 { "vmulss", { XM, Vex128, EXd } },
8069 { "(bad)", { XX } },
8070 },
8071
8072 /* VEX_LEN_59_P_3 */
8073 {
8074 { "vmulsd", { XM, Vex128, EXq } },
8075 { "(bad)", { XX } },
8076 },
8077
8078 /* VEX_LEN_5A_P_1 */
8079 {
8080 { "vcvtss2sd", { XM, Vex128, EXd } },
8081 { "(bad)", { XX } },
8082 },
8083
8084 /* VEX_LEN_5A_P_3 */
8085 {
8086 { "vcvtsd2ss", { XM, Vex128, EXq } },
8087 { "(bad)", { XX } },
8088 },
8089
8090 /* VEX_LEN_5C_P_1 */
8091 {
8092 { "vsubss", { XM, Vex128, EXd } },
8093 { "(bad)", { XX } },
8094 },
8095
8096 /* VEX_LEN_5C_P_3 */
8097 {
8098 { "vsubsd", { XM, Vex128, EXq } },
8099 { "(bad)", { XX } },
8100 },
8101
8102 /* VEX_LEN_5D_P_1 */
8103 {
8104 { "vminss", { XM, Vex128, EXd } },
8105 { "(bad)", { XX } },
8106 },
8107
8108 /* VEX_LEN_5D_P_3 */
8109 {
8110 { "vminsd", { XM, Vex128, EXq } },
8111 { "(bad)", { XX } },
8112 },
8113
8114 /* VEX_LEN_5E_P_1 */
8115 {
8116 { "vdivss", { XM, Vex128, EXd } },
8117 { "(bad)", { XX } },
8118 },
8119
8120 /* VEX_LEN_5E_P_3 */
8121 {
8122 { "vdivsd", { XM, Vex128, EXq } },
8123 { "(bad)", { XX } },
8124 },
8125
8126 /* VEX_LEN_5F_P_1 */
8127 {
8128 { "vmaxss", { XM, Vex128, EXd } },
8129 { "(bad)", { XX } },
8130 },
8131
8132 /* VEX_LEN_5F_P_3 */
8133 {
8134 { "vmaxsd", { XM, Vex128, EXq } },
8135 { "(bad)", { XX } },
8136 },
8137
8138 /* VEX_LEN_60_P_2 */
8139 {
8140 { "vpunpcklbw", { XM, Vex128, EXx } },
8141 { "(bad)", { XX } },
8142 },
8143
8144 /* VEX_LEN_61_P_2 */
8145 {
8146 { "vpunpcklwd", { XM, Vex128, EXx } },
8147 { "(bad)", { XX } },
8148 },
8149
8150 /* VEX_LEN_62_P_2 */
8151 {
8152 { "vpunpckldq", { XM, Vex128, EXx } },
8153 { "(bad)", { XX } },
8154 },
8155
8156 /* VEX_LEN_63_P_2 */
8157 {
8158 { "vpacksswb", { XM, Vex128, EXx } },
8159 { "(bad)", { XX } },
8160 },
8161
8162 /* VEX_LEN_64_P_2 */
8163 {
8164 { "vpcmpgtb", { XM, Vex128, EXx } },
8165 { "(bad)", { XX } },
8166 },
8167
8168 /* VEX_LEN_65_P_2 */
8169 {
8170 { "vpcmpgtw", { XM, Vex128, EXx } },
8171 { "(bad)", { XX } },
8172 },
8173
8174 /* VEX_LEN_66_P_2 */
8175 {
8176 { "vpcmpgtd", { XM, Vex128, EXx } },
8177 { "(bad)", { XX } },
8178 },
8179
8180 /* VEX_LEN_67_P_2 */
8181 {
8182 { "vpackuswb", { XM, Vex128, EXx } },
8183 { "(bad)", { XX } },
8184 },
8185
8186 /* VEX_LEN_68_P_2 */
8187 {
8188 { "vpunpckhbw", { XM, Vex128, EXx } },
8189 { "(bad)", { XX } },
8190 },
8191
8192 /* VEX_LEN_69_P_2 */
8193 {
8194 { "vpunpckhwd", { XM, Vex128, EXx } },
8195 { "(bad)", { XX } },
8196 },
8197
8198 /* VEX_LEN_6A_P_2 */
8199 {
8200 { "vpunpckhdq", { XM, Vex128, EXx } },
8201 { "(bad)", { XX } },
8202 },
8203
8204 /* VEX_LEN_6B_P_2 */
8205 {
8206 { "vpackssdw", { XM, Vex128, EXx } },
8207 { "(bad)", { XX } },
8208 },
8209
8210 /* VEX_LEN_6C_P_2 */
8211 {
8212 { "vpunpcklqdq", { XM, Vex128, EXx } },
8213 { "(bad)", { XX } },
8214 },
8215
8216 /* VEX_LEN_6D_P_2 */
8217 {
8218 { "vpunpckhqdq", { XM, Vex128, EXx } },
8219 { "(bad)", { XX } },
8220 },
8221
8222 /* VEX_LEN_6E_P_2 */
8223 {
8224 { "vmovK", { XM, Edq } },
8225 { "(bad)", { XX } },
8226 },
8227
8228 /* VEX_LEN_70_P_1 */
8229 {
8230 { "vpshufhw", { XM, EXx, Ib } },
8231 { "(bad)", { XX } },
8232 },
8233
8234 /* VEX_LEN_70_P_2 */
8235 {
8236 { "vpshufd", { XM, EXx, Ib } },
8237 { "(bad)", { XX } },
8238 },
8239
8240 /* VEX_LEN_70_P_3 */
8241 {
8242 { "vpshuflw", { XM, EXx, Ib } },
8243 { "(bad)", { XX } },
8244 },
8245
8246 /* VEX_LEN_71_R_2_P_2 */
8247 {
8248 { "vpsrlw", { Vex128, XS, Ib } },
8249 { "(bad)", { XX } },
8250 },
8251
8252 /* VEX_LEN_71_R_4_P_2 */
8253 {
8254 { "vpsraw", { Vex128, XS, Ib } },
8255 { "(bad)", { XX } },
8256 },
8257
8258 /* VEX_LEN_71_R_6_P_2 */
8259 {
8260 { "vpsllw", { Vex128, XS, Ib } },
8261 { "(bad)", { XX } },
8262 },
8263
8264 /* VEX_LEN_72_R_2_P_2 */
8265 {
8266 { "vpsrld", { Vex128, XS, Ib } },
8267 { "(bad)", { XX } },
8268 },
8269
8270 /* VEX_LEN_72_R_4_P_2 */
8271 {
8272 { "vpsrad", { Vex128, XS, Ib } },
8273 { "(bad)", { XX } },
8274 },
8275
8276 /* VEX_LEN_72_R_6_P_2 */
8277 {
8278 { "vpslld", { Vex128, XS, Ib } },
8279 { "(bad)", { XX } },
8280 },
8281
8282 /* VEX_LEN_73_R_2_P_2 */
8283 {
8284 { "vpsrlq", { Vex128, XS, Ib } },
8285 { "(bad)", { XX } },
8286 },
8287
8288 /* VEX_LEN_73_R_3_P_2 */
8289 {
8290 { "vpsrldq", { Vex128, XS, Ib } },
8291 { "(bad)", { XX } },
8292 },
8293
8294 /* VEX_LEN_73_R_6_P_2 */
8295 {
8296 { "vpsllq", { Vex128, XS, Ib } },
8297 { "(bad)", { XX } },
8298 },
8299
8300 /* VEX_LEN_73_R_7_P_2 */
8301 {
8302 { "vpslldq", { Vex128, XS, Ib } },
8303 { "(bad)", { XX } },
8304 },
8305
8306 /* VEX_LEN_74_P_2 */
8307 {
8308 { "vpcmpeqb", { XM, Vex128, EXx } },
8309 { "(bad)", { XX } },
8310 },
8311
8312 /* VEX_LEN_75_P_2 */
8313 {
8314 { "vpcmpeqw", { XM, Vex128, EXx } },
8315 { "(bad)", { XX } },
8316 },
8317
8318 /* VEX_LEN_76_P_2 */
8319 {
8320 { "vpcmpeqd", { XM, Vex128, EXx } },
8321 { "(bad)", { XX } },
8322 },
8323
8324 /* VEX_LEN_7E_P_1 */
8325 {
8326 { "vmovq", { XM, EXq } },
8327 { "(bad)", { XX } },
8328 },
8329
8330 /* VEX_LEN_7E_P_2 */
8331 {
8332 { "vmovK", { Edq, XM } },
8333 { "(bad)", { XX } },
8334 },
8335
8336 /* VEX_LEN_AE_R_2_M0 */
8337 {
8338 { "vldmxcsr", { Md } },
8339 { "(bad)", { XX } },
8340 },
8341
8342 /* VEX_LEN_AE_R_3_M0 */
8343 {
8344 { "vstmxcsr", { Md } },
8345 { "(bad)", { XX } },
8346 },
8347
8348 /* VEX_LEN_C2_P_1 */
8349 {
8350 { "vcmpss", { XM, Vex128, EXd, VCMP } },
8351 { "(bad)", { XX } },
8352 },
8353
8354 /* VEX_LEN_C2_P_3 */
8355 {
8356 { "vcmpsd", { XM, Vex128, EXq, VCMP } },
8357 { "(bad)", { XX } },
8358 },
8359
8360 /* VEX_LEN_C4_P_2 */
8361 {
8362 { "vpinsrw", { XM, Vex128, Edqw, Ib } },
8363 { "(bad)", { XX } },
8364 },
8365
8366 /* VEX_LEN_C5_P_2 */
8367 {
8368 { "vpextrw", { Gdq, XS, Ib } },
8369 { "(bad)", { XX } },
8370 },
8371
8372 /* VEX_LEN_D1_P_2 */
8373 {
8374 { "vpsrlw", { XM, Vex128, EXx } },
8375 { "(bad)", { XX } },
8376 },
8377
8378 /* VEX_LEN_D2_P_2 */
8379 {
8380 { "vpsrld", { XM, Vex128, EXx } },
8381 { "(bad)", { XX } },
8382 },
8383
8384 /* VEX_LEN_D3_P_2 */
8385 {
8386 { "vpsrlq", { XM, Vex128, EXx } },
8387 { "(bad)", { XX } },
8388 },
8389
8390 /* VEX_LEN_D4_P_2 */
8391 {
8392 { "vpaddq", { XM, Vex128, EXx } },
8393 { "(bad)", { XX } },
8394 },
8395
8396 /* VEX_LEN_D5_P_2 */
8397 {
8398 { "vpmullw", { XM, Vex128, EXx } },
8399 { "(bad)", { XX } },
8400 },
8401
8402 /* VEX_LEN_D6_P_2 */
8403 {
8404 { "vmovq", { EXqS, XM } },
8405 { "(bad)", { XX } },
8406 },
8407
8408 /* VEX_LEN_D7_P_2_M_1 */
8409 {
8410 { "vpmovmskb", { Gdq, XS } },
8411 { "(bad)", { XX } },
8412 },
8413
8414 /* VEX_LEN_D8_P_2 */
8415 {
8416 { "vpsubusb", { XM, Vex128, EXx } },
8417 { "(bad)", { XX } },
8418 },
8419
8420 /* VEX_LEN_D9_P_2 */
8421 {
8422 { "vpsubusw", { XM, Vex128, EXx } },
8423 { "(bad)", { XX } },
8424 },
8425
8426 /* VEX_LEN_DA_P_2 */
8427 {
8428 { "vpminub", { XM, Vex128, EXx } },
8429 { "(bad)", { XX } },
8430 },
8431
8432 /* VEX_LEN_DB_P_2 */
8433 {
8434 { "vpand", { XM, Vex128, EXx } },
8435 { "(bad)", { XX } },
8436 },
8437
8438 /* VEX_LEN_DC_P_2 */
8439 {
8440 { "vpaddusb", { XM, Vex128, EXx } },
8441 { "(bad)", { XX } },
8442 },
8443
8444 /* VEX_LEN_DD_P_2 */
8445 {
8446 { "vpaddusw", { XM, Vex128, EXx } },
8447 { "(bad)", { XX } },
8448 },
8449
8450 /* VEX_LEN_DE_P_2 */
8451 {
8452 { "vpmaxub", { XM, Vex128, EXx } },
8453 { "(bad)", { XX } },
8454 },
8455
8456 /* VEX_LEN_DF_P_2 */
8457 {
8458 { "vpandn", { XM, Vex128, EXx } },
8459 { "(bad)", { XX } },
8460 },
8461
8462 /* VEX_LEN_E0_P_2 */
8463 {
8464 { "vpavgb", { XM, Vex128, EXx } },
8465 { "(bad)", { XX } },
8466 },
8467
8468 /* VEX_LEN_E1_P_2 */
8469 {
8470 { "vpsraw", { XM, Vex128, EXx } },
8471 { "(bad)", { XX } },
8472 },
8473
8474 /* VEX_LEN_E2_P_2 */
8475 {
8476 { "vpsrad", { XM, Vex128, EXx } },
8477 { "(bad)", { XX } },
8478 },
8479
8480 /* VEX_LEN_E3_P_2 */
8481 {
8482 { "vpavgw", { XM, Vex128, EXx } },
8483 { "(bad)", { XX } },
8484 },
8485
8486 /* VEX_LEN_E4_P_2 */
8487 {
8488 { "vpmulhuw", { XM, Vex128, EXx } },
8489 { "(bad)", { XX } },
8490 },
8491
8492 /* VEX_LEN_E5_P_2 */
8493 {
8494 { "vpmulhw", { XM, Vex128, EXx } },
8495 { "(bad)", { XX } },
8496 },
8497
8498 /* VEX_LEN_E8_P_2 */
8499 {
8500 { "vpsubsb", { XM, Vex128, EXx } },
8501 { "(bad)", { XX } },
8502 },
8503
8504 /* VEX_LEN_E9_P_2 */
8505 {
8506 { "vpsubsw", { XM, Vex128, EXx } },
8507 { "(bad)", { XX } },
8508 },
8509
8510 /* VEX_LEN_EA_P_2 */
8511 {
8512 { "vpminsw", { XM, Vex128, EXx } },
8513 { "(bad)", { XX } },
8514 },
8515
8516 /* VEX_LEN_EB_P_2 */
8517 {
8518 { "vpor", { XM, Vex128, EXx } },
8519 { "(bad)", { XX } },
8520 },
8521
8522 /* VEX_LEN_EC_P_2 */
8523 {
8524 { "vpaddsb", { XM, Vex128, EXx } },
8525 { "(bad)", { XX } },
8526 },
8527
8528 /* VEX_LEN_ED_P_2 */
8529 {
8530 { "vpaddsw", { XM, Vex128, EXx } },
8531 { "(bad)", { XX } },
8532 },
8533
8534 /* VEX_LEN_EE_P_2 */
8535 {
8536 { "vpmaxsw", { XM, Vex128, EXx } },
8537 { "(bad)", { XX } },
8538 },
8539
8540 /* VEX_LEN_EF_P_2 */
8541 {
8542 { "vpxor", { XM, Vex128, EXx } },
8543 { "(bad)", { XX } },
8544 },
8545
8546 /* VEX_LEN_F1_P_2 */
8547 {
8548 { "vpsllw", { XM, Vex128, EXx } },
8549 { "(bad)", { XX } },
8550 },
8551
8552 /* VEX_LEN_F2_P_2 */
8553 {
8554 { "vpslld", { XM, Vex128, EXx } },
8555 { "(bad)", { XX } },
8556 },
8557
8558 /* VEX_LEN_F3_P_2 */
8559 {
8560 { "vpsllq", { XM, Vex128, EXx } },
8561 { "(bad)", { XX } },
8562 },
8563
8564 /* VEX_LEN_F4_P_2 */
8565 {
8566 { "vpmuludq", { XM, Vex128, EXx } },
8567 { "(bad)", { XX } },
8568 },
8569
8570 /* VEX_LEN_F5_P_2 */
8571 {
8572 { "vpmaddwd", { XM, Vex128, EXx } },
8573 { "(bad)", { XX } },
8574 },
8575
8576 /* VEX_LEN_F6_P_2 */
8577 {
8578 { "vpsadbw", { XM, Vex128, EXx } },
8579 { "(bad)", { XX } },
8580 },
8581
8582 /* VEX_LEN_F7_P_2 */
8583 {
8584 { "vmaskmovdqu", { XM, XS } },
8585 { "(bad)", { XX } },
8586 },
8587
8588 /* VEX_LEN_F8_P_2 */
8589 {
8590 { "vpsubb", { XM, Vex128, EXx } },
8591 { "(bad)", { XX } },
8592 },
8593
8594 /* VEX_LEN_F9_P_2 */
8595 {
8596 { "vpsubw", { XM, Vex128, EXx } },
8597 { "(bad)", { XX } },
8598 },
8599
8600 /* VEX_LEN_FA_P_2 */
8601 {
8602 { "vpsubd", { XM, Vex128, EXx } },
8603 { "(bad)", { XX } },
8604 },
8605
8606 /* VEX_LEN_FB_P_2 */
8607 {
8608 { "vpsubq", { XM, Vex128, EXx } },
8609 { "(bad)", { XX } },
8610 },
8611
8612 /* VEX_LEN_FC_P_2 */
8613 {
8614 { "vpaddb", { XM, Vex128, EXx } },
8615 { "(bad)", { XX } },
8616 },
8617
8618 /* VEX_LEN_FD_P_2 */
8619 {
8620 { "vpaddw", { XM, Vex128, EXx } },
8621 { "(bad)", { XX } },
8622 },
8623
8624 /* VEX_LEN_FE_P_2 */
8625 {
8626 { "vpaddd", { XM, Vex128, EXx } },
8627 { "(bad)", { XX } },
8628 },
8629
8630 /* VEX_LEN_3800_P_2 */
8631 {
8632 { "vpshufb", { XM, Vex128, EXx } },
8633 { "(bad)", { XX } },
8634 },
8635
8636 /* VEX_LEN_3801_P_2 */
8637 {
8638 { "vphaddw", { XM, Vex128, EXx } },
8639 { "(bad)", { XX } },
8640 },
8641
8642 /* VEX_LEN_3802_P_2 */
8643 {
8644 { "vphaddd", { XM, Vex128, EXx } },
8645 { "(bad)", { XX } },
8646 },
8647
8648 /* VEX_LEN_3803_P_2 */
8649 {
8650 { "vphaddsw", { XM, Vex128, EXx } },
8651 { "(bad)", { XX } },
8652 },
8653
8654 /* VEX_LEN_3804_P_2 */
8655 {
8656 { "vpmaddubsw", { XM, Vex128, EXx } },
8657 { "(bad)", { XX } },
8658 },
8659
8660 /* VEX_LEN_3805_P_2 */
8661 {
8662 { "vphsubw", { XM, Vex128, EXx } },
8663 { "(bad)", { XX } },
8664 },
8665
8666 /* VEX_LEN_3806_P_2 */
8667 {
8668 { "vphsubd", { XM, Vex128, EXx } },
8669 { "(bad)", { XX } },
8670 },
8671
8672 /* VEX_LEN_3807_P_2 */
8673 {
8674 { "vphsubsw", { XM, Vex128, EXx } },
8675 { "(bad)", { XX } },
8676 },
8677
8678 /* VEX_LEN_3808_P_2 */
8679 {
8680 { "vpsignb", { XM, Vex128, EXx } },
8681 { "(bad)", { XX } },
8682 },
8683
8684 /* VEX_LEN_3809_P_2 */
8685 {
8686 { "vpsignw", { XM, Vex128, EXx } },
8687 { "(bad)", { XX } },
8688 },
8689
8690 /* VEX_LEN_380A_P_2 */
8691 {
8692 { "vpsignd", { XM, Vex128, EXx } },
8693 { "(bad)", { XX } },
8694 },
8695
8696 /* VEX_LEN_380B_P_2 */
8697 {
8698 { "vpmulhrsw", { XM, Vex128, EXx } },
8699 { "(bad)", { XX } },
8700 },
8701
8702 /* VEX_LEN_3819_P_2_M_0 */
8703 {
8704 { "(bad)", { XX } },
8705 { "vbroadcastsd", { XM, Mq } },
8706 },
8707
8708 /* VEX_LEN_381A_P_2_M_0 */
8709 {
8710 { "(bad)", { XX } },
8711 { "vbroadcastf128", { XM, Mxmm } },
8712 },
8713
8714 /* VEX_LEN_381C_P_2 */
8715 {
8716 { "vpabsb", { XM, EXx } },
8717 { "(bad)", { XX } },
8718 },
8719
8720 /* VEX_LEN_381D_P_2 */
8721 {
8722 { "vpabsw", { XM, EXx } },
8723 { "(bad)", { XX } },
8724 },
8725
8726 /* VEX_LEN_381E_P_2 */
8727 {
8728 { "vpabsd", { XM, EXx } },
8729 { "(bad)", { XX } },
8730 },
8731
8732 /* VEX_LEN_3820_P_2 */
8733 {
8734 { "vpmovsxbw", { XM, EXq } },
8735 { "(bad)", { XX } },
8736 },
8737
8738 /* VEX_LEN_3821_P_2 */
8739 {
8740 { "vpmovsxbd", { XM, EXd } },
8741 { "(bad)", { XX } },
8742 },
8743
8744 /* VEX_LEN_3822_P_2 */
8745 {
8746 { "vpmovsxbq", { XM, EXw } },
8747 { "(bad)", { XX } },
8748 },
8749
8750 /* VEX_LEN_3823_P_2 */
8751 {
8752 { "vpmovsxwd", { XM, EXq } },
8753 { "(bad)", { XX } },
8754 },
8755
8756 /* VEX_LEN_3824_P_2 */
8757 {
8758 { "vpmovsxwq", { XM, EXd } },
8759 { "(bad)", { XX } },
8760 },
8761
8762 /* VEX_LEN_3825_P_2 */
8763 {
8764 { "vpmovsxdq", { XM, EXq } },
8765 { "(bad)", { XX } },
8766 },
8767
8768 /* VEX_LEN_3828_P_2 */
8769 {
8770 { "vpmuldq", { XM, Vex128, EXx } },
8771 { "(bad)", { XX } },
8772 },
8773
8774 /* VEX_LEN_3829_P_2 */
8775 {
8776 { "vpcmpeqq", { XM, Vex128, EXx } },
8777 { "(bad)", { XX } },
8778 },
8779
8780 /* VEX_LEN_382A_P_2_M_0 */
8781 {
8782 { "vmovntdqa", { XM, Mx } },
8783 { "(bad)", { XX } },
8784 },
8785
8786 /* VEX_LEN_382B_P_2 */
8787 {
8788 { "vpackusdw", { XM, Vex128, EXx } },
8789 { "(bad)", { XX } },
8790 },
8791
8792 /* VEX_LEN_3830_P_2 */
8793 {
8794 { "vpmovzxbw", { XM, EXq } },
8795 { "(bad)", { XX } },
8796 },
8797
8798 /* VEX_LEN_3831_P_2 */
8799 {
8800 { "vpmovzxbd", { XM, EXd } },
8801 { "(bad)", { XX } },
8802 },
8803
8804 /* VEX_LEN_3832_P_2 */
8805 {
8806 { "vpmovzxbq", { XM, EXw } },
8807 { "(bad)", { XX } },
8808 },
8809
8810 /* VEX_LEN_3833_P_2 */
8811 {
8812 { "vpmovzxwd", { XM, EXq } },
8813 { "(bad)", { XX } },
8814 },
8815
8816 /* VEX_LEN_3834_P_2 */
8817 {
8818 { "vpmovzxwq", { XM, EXd } },
8819 { "(bad)", { XX } },
8820 },
8821
8822 /* VEX_LEN_3835_P_2 */
8823 {
8824 { "vpmovzxdq", { XM, EXq } },
8825 { "(bad)", { XX } },
8826 },
8827
8828 /* VEX_LEN_3837_P_2 */
8829 {
8830 { "vpcmpgtq", { XM, Vex128, EXx } },
8831 { "(bad)", { XX } },
8832 },
8833
8834 /* VEX_LEN_3838_P_2 */
8835 {
8836 { "vpminsb", { XM, Vex128, EXx } },
8837 { "(bad)", { XX } },
8838 },
8839
8840 /* VEX_LEN_3839_P_2 */
8841 {
8842 { "vpminsd", { XM, Vex128, EXx } },
8843 { "(bad)", { XX } },
8844 },
8845
8846 /* VEX_LEN_383A_P_2 */
8847 {
8848 { "vpminuw", { XM, Vex128, EXx } },
8849 { "(bad)", { XX } },
8850 },
8851
8852 /* VEX_LEN_383B_P_2 */
8853 {
8854 { "vpminud", { XM, Vex128, EXx } },
8855 { "(bad)", { XX } },
8856 },
8857
8858 /* VEX_LEN_383C_P_2 */
8859 {
8860 { "vpmaxsb", { XM, Vex128, EXx } },
8861 { "(bad)", { XX } },
8862 },
8863
8864 /* VEX_LEN_383D_P_2 */
8865 {
8866 { "vpmaxsd", { XM, Vex128, EXx } },
8867 { "(bad)", { XX } },
8868 },
8869
8870 /* VEX_LEN_383E_P_2 */
8871 {
8872 { "vpmaxuw", { XM, Vex128, EXx } },
8873 { "(bad)", { XX } },
8874 },
8875
8876 /* VEX_LEN_383F_P_2 */
8877 {
8878 { "vpmaxud", { XM, Vex128, EXx } },
8879 { "(bad)", { XX } },
8880 },
8881
8882 /* VEX_LEN_3840_P_2 */
8883 {
8884 { "vpmulld", { XM, Vex128, EXx } },
8885 { "(bad)", { XX } },
8886 },
8887
8888 /* VEX_LEN_3841_P_2 */
8889 {
8890 { "vphminposuw", { XM, EXx } },
8891 { "(bad)", { XX } },
8892 },
8893
8894 /* VEX_LEN_38DB_P_2 */
8895 {
8896 { "vaesimc", { XM, EXx } },
8897 { "(bad)", { XX } },
8898 },
8899
8900 /* VEX_LEN_38DC_P_2 */
8901 {
8902 { "vaesenc", { XM, Vex128, EXx } },
8903 { "(bad)", { XX } },
8904 },
8905
8906 /* VEX_LEN_38DD_P_2 */
8907 {
8908 { "vaesenclast", { XM, Vex128, EXx } },
8909 { "(bad)", { XX } },
8910 },
8911
8912 /* VEX_LEN_38DE_P_2 */
8913 {
8914 { "vaesdec", { XM, Vex128, EXx } },
8915 { "(bad)", { XX } },
8916 },
8917
8918 /* VEX_LEN_38DF_P_2 */
8919 {
8920 { "vaesdeclast", { XM, Vex128, EXx } },
8921 { "(bad)", { XX } },
8922 },
8923
8924 /* VEX_LEN_3A06_P_2 */
8925 {
8926 { "(bad)", { XX } },
8927 { "vperm2f128", { XM, Vex256, EXx, Ib } },
8928 },
8929
8930 /* VEX_LEN_3A0A_P_2 */
8931 {
8932 { "vroundss", { XM, Vex128, EXd, Ib } },
8933 { "(bad)", { XX } },
8934 },
8935
8936 /* VEX_LEN_3A0B_P_2 */
8937 {
8938 { "vroundsd", { XM, Vex128, EXq, Ib } },
8939 { "(bad)", { XX } },
8940 },
8941
8942 /* VEX_LEN_3A0E_P_2 */
8943 {
8944 { "vpblendw", { XM, Vex128, EXx, Ib } },
8945 { "(bad)", { XX } },
8946 },
8947
8948 /* VEX_LEN_3A0F_P_2 */
8949 {
8950 { "vpalignr", { XM, Vex128, EXx, Ib } },
8951 { "(bad)", { XX } },
8952 },
8953
8954 /* VEX_LEN_3A14_P_2 */
8955 {
8956 { "vpextrb", { Edqb, XM, Ib } },
8957 { "(bad)", { XX } },
8958 },
8959
8960 /* VEX_LEN_3A15_P_2 */
8961 {
8962 { "vpextrw", { Edqw, XM, Ib } },
8963 { "(bad)", { XX } },
8964 },
8965
8966 /* VEX_LEN_3A16_P_2 */
8967 {
8968 { "vpextrK", { Edq, XM, Ib } },
8969 { "(bad)", { XX } },
8970 },
8971
8972 /* VEX_LEN_3A17_P_2 */
8973 {
8974 { "vextractps", { Edqd, XM, Ib } },
8975 { "(bad)", { XX } },
8976 },
8977
8978 /* VEX_LEN_3A18_P_2 */
8979 {
8980 { "(bad)", { XX } },
8981 { "vinsertf128", { XM, Vex256, EXxmm, Ib } },
8982 },
8983
8984 /* VEX_LEN_3A19_P_2 */
8985 {
8986 { "(bad)", { XX } },
8987 { "vextractf128", { EXxmm, XM, Ib } },
8988 },
8989
8990 /* VEX_LEN_3A20_P_2 */
8991 {
8992 { "vpinsrb", { XM, Vex128, Edqb, Ib } },
8993 { "(bad)", { XX } },
8994 },
8995
8996 /* VEX_LEN_3A21_P_2 */
8997 {
8998 { "vinsertps", { XM, Vex128, EXd, Ib } },
8999 { "(bad)", { XX } },
9000 },
9001
9002 /* VEX_LEN_3A22_P_2 */
9003 {
9004 { "vpinsrK", { XM, Vex128, Edq, Ib } },
9005 { "(bad)", { XX } },
9006 },
9007
9008 /* VEX_LEN_3A41_P_2 */
9009 {
9010 { "vdppd", { XM, Vex128, EXx, Ib } },
9011 { "(bad)", { XX } },
9012 },
9013
9014 /* VEX_LEN_3A42_P_2 */
9015 {
9016 { "vmpsadbw", { XM, Vex128, EXx, Ib } },
9017 { "(bad)", { XX } },
9018 },
9019
9020 /* VEX_LEN_3A44_P_2 */
9021 {
9022 { "vpclmulqdq", { XM, Vex128, EXx, PCLMUL } },
9023 { "(bad)", { XX } },
9024 },
9025
9026 /* VEX_LEN_3A4C_P_2 */
9027 {
9028 { "vpblendvb", { XM, Vex128, EXx, XMVexI4 } },
9029 { "(bad)", { XX } },
9030 },
9031
9032 /* VEX_LEN_3A60_P_2 */
9033 {
9034 { "vpcmpestrm", { XM, EXx, Ib } },
9035 { "(bad)", { XX } },
9036 },
9037
9038 /* VEX_LEN_3A61_P_2 */
9039 {
9040 { "vpcmpestri", { XM, EXx, Ib } },
9041 { "(bad)", { XX } },
9042 },
9043
9044 /* VEX_LEN_3A62_P_2 */
9045 {
9046 { "vpcmpistrm", { XM, EXx, Ib } },
9047 { "(bad)", { XX } },
9048 },
9049
9050 /* VEX_LEN_3A63_P_2 */
9051 {
9052 { "vpcmpistri", { XM, EXx, Ib } },
9053 { "(bad)", { XX } },
9054 },
9055
9056 /* VEX_LEN_3ADF_P_2 */
9057 {
9058 { "vaeskeygenassist", { XM, EXx, Ib } },
9059 { "(bad)", { XX } },
9060 },
9061 };
9062
9063 static const struct dis386 mod_table[][2] = {
9064 {
9065 /* MOD_8D */
9066 { "leaS", { Gv, M } },
9067 { "(bad)", { XX } },
9068 },
9069 {
9070 /* MOD_0F01_REG_0 */
9071 { X86_64_TABLE (X86_64_0F01_REG_0) },
9072 { RM_TABLE (RM_0F01_REG_0) },
9073 },
9074 {
9075 /* MOD_0F01_REG_1 */
9076 { X86_64_TABLE (X86_64_0F01_REG_1) },
9077 { RM_TABLE (RM_0F01_REG_1) },
9078 },
9079 {
9080 /* MOD_0F01_REG_2 */
9081 { X86_64_TABLE (X86_64_0F01_REG_2) },
9082 { RM_TABLE (RM_0F01_REG_2) },
9083 },
9084 {
9085 /* MOD_0F01_REG_3 */
9086 { X86_64_TABLE (X86_64_0F01_REG_3) },
9087 { RM_TABLE (RM_0F01_REG_3) },
9088 },
9089 {
9090 /* MOD_0F01_REG_7 */
9091 { "invlpg", { Mb } },
9092 { RM_TABLE (RM_0F01_REG_7) },
9093 },
9094 {
9095 /* MOD_0F12_PREFIX_0 */
9096 { "movlps", { XM, EXq } },
9097 { "movhlps", { XM, EXq } },
9098 },
9099 {
9100 /* MOD_0F13 */
9101 { "movlpX", { EXq, XM } },
9102 { "(bad)", { XX } },
9103 },
9104 {
9105 /* MOD_0F16_PREFIX_0 */
9106 { "movhps", { XM, EXq } },
9107 { "movlhps", { XM, EXq } },
9108 },
9109 {
9110 /* MOD_0F17 */
9111 { "movhpX", { EXq, XM } },
9112 { "(bad)", { XX } },
9113 },
9114 {
9115 /* MOD_0F18_REG_0 */
9116 { "prefetchnta", { Mb } },
9117 { "(bad)", { XX } },
9118 },
9119 {
9120 /* MOD_0F18_REG_1 */
9121 { "prefetcht0", { Mb } },
9122 { "(bad)", { XX } },
9123 },
9124 {
9125 /* MOD_0F18_REG_2 */
9126 { "prefetcht1", { Mb } },
9127 { "(bad)", { XX } },
9128 },
9129 {
9130 /* MOD_0F18_REG_3 */
9131 { "prefetcht2", { Mb } },
9132 { "(bad)", { XX } },
9133 },
9134 {
9135 /* MOD_0F20 */
9136 { "(bad)", { XX } },
9137 { "movZ", { Rm, Cm } },
9138 },
9139 {
9140 /* MOD_0F21 */
9141 { "(bad)", { XX } },
9142 { "movZ", { Rm, Dm } },
9143 },
9144 {
9145 /* MOD_0F22 */
9146 { "(bad)", { XX } },
9147 { "movZ", { Cm, Rm } },
9148 },
9149 {
9150 /* MOD_0F23 */
9151 { "(bad)", { XX } },
9152 { "movZ", { Dm, Rm } },
9153 },
9154 {
9155 /* MOD_0F24 */
9156 { THREE_BYTE_TABLE (THREE_BYTE_0F24) },
9157 { "movL", { Rd, Td } },
9158 },
9159 {
9160 /* MOD_0F26 */
9161 { "(bad)", { XX } },
9162 { "movL", { Td, Rd } },
9163 },
9164 {
9165 /* MOD_0F2B_PREFIX_0 */
9166 {"movntps", { Mx, XM } },
9167 { "(bad)", { XX } },
9168 },
9169 {
9170 /* MOD_0F2B_PREFIX_1 */
9171 {"movntss", { Md, XM } },
9172 { "(bad)", { XX } },
9173 },
9174 {
9175 /* MOD_0F2B_PREFIX_2 */
9176 {"movntpd", { Mx, XM } },
9177 { "(bad)", { XX } },
9178 },
9179 {
9180 /* MOD_0F2B_PREFIX_3 */
9181 {"movntsd", { Mq, XM } },
9182 { "(bad)", { XX } },
9183 },
9184 {
9185 /* MOD_0F51 */
9186 { "(bad)", { XX } },
9187 { "movmskpX", { Gdq, XS } },
9188 },
9189 {
9190 /* MOD_0F71_REG_2 */
9191 { "(bad)", { XX } },
9192 { "psrlw", { MS, Ib } },
9193 },
9194 {
9195 /* MOD_0F71_REG_4 */
9196 { "(bad)", { XX } },
9197 { "psraw", { MS, Ib } },
9198 },
9199 {
9200 /* MOD_0F71_REG_6 */
9201 { "(bad)", { XX } },
9202 { "psllw", { MS, Ib } },
9203 },
9204 {
9205 /* MOD_0F72_REG_2 */
9206 { "(bad)", { XX } },
9207 { "psrld", { MS, Ib } },
9208 },
9209 {
9210 /* MOD_0F72_REG_4 */
9211 { "(bad)", { XX } },
9212 { "psrad", { MS, Ib } },
9213 },
9214 {
9215 /* MOD_0F72_REG_6 */
9216 { "(bad)", { XX } },
9217 { "pslld", { MS, Ib } },
9218 },
9219 {
9220 /* MOD_0F73_REG_2 */
9221 { "(bad)", { XX } },
9222 { "psrlq", { MS, Ib } },
9223 },
9224 {
9225 /* MOD_0F73_REG_3 */
9226 { "(bad)", { XX } },
9227 { PREFIX_TABLE (PREFIX_0F73_REG_3) },
9228 },
9229 {
9230 /* MOD_0F73_REG_6 */
9231 { "(bad)", { XX } },
9232 { "psllq", { MS, Ib } },
9233 },
9234 {
9235 /* MOD_0F73_REG_7 */
9236 { "(bad)", { XX } },
9237 { PREFIX_TABLE (PREFIX_0F73_REG_7) },
9238 },
9239 {
9240 /* MOD_0FAE_REG_0 */
9241 { "fxsave", { M } },
9242 { "(bad)", { XX } },
9243 },
9244 {
9245 /* MOD_0FAE_REG_1 */
9246 { "fxrstor", { M } },
9247 { "(bad)", { XX } },
9248 },
9249 {
9250 /* MOD_0FAE_REG_2 */
9251 { "ldmxcsr", { Md } },
9252 { "(bad)", { XX } },
9253 },
9254 {
9255 /* MOD_0FAE_REG_3 */
9256 { "stmxcsr", { Md } },
9257 { "(bad)", { XX } },
9258 },
9259 {
9260 /* MOD_0FAE_REG_4 */
9261 { "xsave", { M } },
9262 { "(bad)", { XX } },
9263 },
9264 {
9265 /* MOD_0FAE_REG_5 */
9266 { "xrstor", { M } },
9267 { RM_TABLE (RM_0FAE_REG_5) },
9268 },
9269 {
9270 /* MOD_0FAE_REG_6 */
9271 { "xsaveopt", { M } },
9272 { RM_TABLE (RM_0FAE_REG_6) },
9273 },
9274 {
9275 /* MOD_0FAE_REG_7 */
9276 { "clflush", { Mb } },
9277 { RM_TABLE (RM_0FAE_REG_7) },
9278 },
9279 {
9280 /* MOD_0FB2 */
9281 { "lssS", { Gv, Mp } },
9282 { "(bad)", { XX } },
9283 },
9284 {
9285 /* MOD_0FB4 */
9286 { "lfsS", { Gv, Mp } },
9287 { "(bad)", { XX } },
9288 },
9289 {
9290 /* MOD_0FB5 */
9291 { "lgsS", { Gv, Mp } },
9292 { "(bad)", { XX } },
9293 },
9294 {
9295 /* MOD_0FC7_REG_6 */
9296 { PREFIX_TABLE (PREFIX_0FC7_REG_6) },
9297 { "(bad)", { XX } },
9298 },
9299 {
9300 /* MOD_0FC7_REG_7 */
9301 { "vmptrst", { Mq } },
9302 { "(bad)", { XX } },
9303 },
9304 {
9305 /* MOD_0FD7 */
9306 { "(bad)", { XX } },
9307 { "pmovmskb", { Gdq, MS } },
9308 },
9309 {
9310 /* MOD_0FE7_PREFIX_2 */
9311 { "movntdq", { Mx, XM } },
9312 { "(bad)", { XX } },
9313 },
9314 {
9315 /* MOD_0FF0_PREFIX_3 */
9316 { "lddqu", { XM, M } },
9317 { "(bad)", { XX } },
9318 },
9319 {
9320 /* MOD_0F382A_PREFIX_2 */
9321 { "movntdqa", { XM, Mx } },
9322 { "(bad)", { XX } },
9323 },
9324 {
9325 /* MOD_62_32BIT */
9326 { "bound{S|}", { Gv, Ma } },
9327 { "(bad)", { XX } },
9328 },
9329 {
9330 /* MOD_C4_32BIT */
9331 { "lesS", { Gv, Mp } },
9332 { VEX_C4_TABLE (VEX_0F) },
9333 },
9334 {
9335 /* MOD_C5_32BIT */
9336 { "ldsS", { Gv, Mp } },
9337 { VEX_C5_TABLE (VEX_0F) },
9338 },
9339 {
9340 /* MOD_VEX_12_PREFIX_0 */
9341 { VEX_LEN_TABLE (VEX_LEN_12_P_0_M_0) },
9342 { VEX_LEN_TABLE (VEX_LEN_12_P_0_M_1) },
9343 },
9344 {
9345 /* MOD_VEX_13 */
9346 { VEX_LEN_TABLE (VEX_LEN_13_M_0) },
9347 { "(bad)", { XX } },
9348 },
9349 {
9350 /* MOD_VEX_16_PREFIX_0 */
9351 { VEX_LEN_TABLE (VEX_LEN_16_P_0_M_0) },
9352 { VEX_LEN_TABLE (VEX_LEN_16_P_0_M_1) },
9353 },
9354 {
9355 /* MOD_VEX_17 */
9356 { VEX_LEN_TABLE (VEX_LEN_17_M_0) },
9357 { "(bad)", { XX } },
9358 },
9359 {
9360 /* MOD_VEX_2B */
9361 { "vmovntpX", { Mx, XM } },
9362 { "(bad)", { XX } },
9363 },
9364 {
9365 /* MOD_VEX_51 */
9366 { "(bad)", { XX } },
9367 { "vmovmskpX", { Gdq, XS } },
9368 },
9369 {
9370 /* MOD_VEX_71_REG_2 */
9371 { "(bad)", { XX } },
9372 { PREFIX_TABLE (PREFIX_VEX_71_REG_2) },
9373 },
9374 {
9375 /* MOD_VEX_71_REG_4 */
9376 { "(bad)", { XX } },
9377 { PREFIX_TABLE (PREFIX_VEX_71_REG_4) },
9378 },
9379 {
9380 /* MOD_VEX_71_REG_6 */
9381 { "(bad)", { XX } },
9382 { PREFIX_TABLE (PREFIX_VEX_71_REG_6) },
9383 },
9384 {
9385 /* MOD_VEX_72_REG_2 */
9386 { "(bad)", { XX } },
9387 { PREFIX_TABLE (PREFIX_VEX_72_REG_2) },
9388 },
9389 {
9390 /* MOD_VEX_72_REG_4 */
9391 { "(bad)", { XX } },
9392 { PREFIX_TABLE (PREFIX_VEX_72_REG_4) },
9393 },
9394 {
9395 /* MOD_VEX_72_REG_6 */
9396 { "(bad)", { XX } },
9397 { PREFIX_TABLE (PREFIX_VEX_72_REG_6) },
9398 },
9399 {
9400 /* MOD_VEX_73_REG_2 */
9401 { "(bad)", { XX } },
9402 { PREFIX_TABLE (PREFIX_VEX_73_REG_2) },
9403 },
9404 {
9405 /* MOD_VEX_73_REG_3 */
9406 { "(bad)", { XX } },
9407 { PREFIX_TABLE (PREFIX_VEX_73_REG_3) },
9408 },
9409 {
9410 /* MOD_VEX_73_REG_6 */
9411 { "(bad)", { XX } },
9412 { PREFIX_TABLE (PREFIX_VEX_73_REG_6) },
9413 },
9414 {
9415 /* MOD_VEX_73_REG_7 */
9416 { "(bad)", { XX } },
9417 { PREFIX_TABLE (PREFIX_VEX_73_REG_7) },
9418 },
9419 {
9420 /* MOD_VEX_AE_REG_2 */
9421 { VEX_LEN_TABLE (VEX_LEN_AE_R_2_M_0) },
9422 { "(bad)", { XX } },
9423 },
9424 {
9425 /* MOD_VEX_AE_REG_3 */
9426 { VEX_LEN_TABLE (VEX_LEN_AE_R_3_M_0) },
9427 { "(bad)", { XX } },
9428 },
9429 {
9430 /* MOD_VEX_D7_PREFIX_2 */
9431 { "(bad)", { XX } },
9432 { VEX_LEN_TABLE (VEX_LEN_D7_P_2_M_1) },
9433 },
9434 {
9435 /* MOD_VEX_E7_PREFIX_2 */
9436 { "vmovntdq", { Mx, XM } },
9437 { "(bad)", { XX } },
9438 },
9439 {
9440 /* MOD_VEX_F0_PREFIX_3 */
9441 { "vlddqu", { XM, M } },
9442 { "(bad)", { XX } },
9443 },
9444 {
9445 /* MOD_VEX_3818_PREFIX_2 */
9446 { "vbroadcastss", { XM, Md } },
9447 { "(bad)", { XX } },
9448 },
9449 {
9450 /* MOD_VEX_3819_PREFIX_2 */
9451 { VEX_LEN_TABLE (VEX_LEN_3819_P_2_M_0) },
9452 { "(bad)", { XX } },
9453 },
9454 {
9455 /* MOD_VEX_381A_PREFIX_2 */
9456 { VEX_LEN_TABLE (VEX_LEN_381A_P_2_M_0) },
9457 { "(bad)", { XX } },
9458 },
9459 {
9460 /* MOD_VEX_382A_PREFIX_2 */
9461 { VEX_LEN_TABLE (VEX_LEN_382A_P_2_M_0) },
9462 { "(bad)", { XX } },
9463 },
9464 {
9465 /* MOD_VEX_382C_PREFIX_2 */
9466 { "vmaskmovps", { XM, Vex, Mx } },
9467 { "(bad)", { XX } },
9468 },
9469 {
9470 /* MOD_VEX_382D_PREFIX_2 */
9471 { "vmaskmovpd", { XM, Vex, Mx } },
9472 { "(bad)", { XX } },
9473 },
9474 {
9475 /* MOD_VEX_382E_PREFIX_2 */
9476 { "vmaskmovps", { Mx, Vex, XM } },
9477 { "(bad)", { XX } },
9478 },
9479 {
9480 /* MOD_VEX_382F_PREFIX_2 */
9481 { "vmaskmovpd", { Mx, Vex, XM } },
9482 { "(bad)", { XX } },
9483 },
9484 };
9485
9486 static const struct dis386 rm_table[][8] = {
9487 {
9488 /* RM_0F01_REG_0 */
9489 { "(bad)", { XX } },
9490 { "vmcall", { Skip_MODRM } },
9491 { "vmlaunch", { Skip_MODRM } },
9492 { "vmresume", { Skip_MODRM } },
9493 { "vmxoff", { Skip_MODRM } },
9494 { "(bad)", { XX } },
9495 { "(bad)", { XX } },
9496 { "(bad)", { XX } },
9497 },
9498 {
9499 /* RM_0F01_REG_1 */
9500 { "monitor", { { OP_Monitor, 0 } } },
9501 { "mwait", { { OP_Mwait, 0 } } },
9502 { "(bad)", { XX } },
9503 { "(bad)", { XX } },
9504 { "(bad)", { XX } },
9505 { "(bad)", { XX } },
9506 { "(bad)", { XX } },
9507 { "(bad)", { XX } },
9508 },
9509 {
9510 /* RM_0F01_REG_2 */
9511 { "xgetbv", { Skip_MODRM } },
9512 { "xsetbv", { Skip_MODRM } },
9513 { "(bad)", { XX } },
9514 { "(bad)", { XX } },
9515 { "(bad)", { XX } },
9516 { "(bad)", { XX } },
9517 { "(bad)", { XX } },
9518 { "(bad)", { XX } },
9519 },
9520 {
9521 /* RM_0F01_REG_3 */
9522 { "vmrun", { Skip_MODRM } },
9523 { "vmmcall", { Skip_MODRM } },
9524 { "vmload", { Skip_MODRM } },
9525 { "vmsave", { Skip_MODRM } },
9526 { "stgi", { Skip_MODRM } },
9527 { "clgi", { Skip_MODRM } },
9528 { "skinit", { Skip_MODRM } },
9529 { "invlpga", { Skip_MODRM } },
9530 },
9531 {
9532 /* RM_0F01_REG_7 */
9533 { "swapgs", { Skip_MODRM } },
9534 { "rdtscp", { Skip_MODRM } },
9535 { "(bad)", { XX } },
9536 { "(bad)", { XX } },
9537 { "(bad)", { XX } },
9538 { "(bad)", { XX } },
9539 { "(bad)", { XX } },
9540 { "(bad)", { XX } },
9541 },
9542 {
9543 /* RM_0FAE_REG_5 */
9544 { "lfence", { Skip_MODRM } },
9545 { "(bad)", { XX } },
9546 { "(bad)", { XX } },
9547 { "(bad)", { XX } },
9548 { "(bad)", { XX } },
9549 { "(bad)", { XX } },
9550 { "(bad)", { XX } },
9551 { "(bad)", { XX } },
9552 },
9553 {
9554 /* RM_0FAE_REG_6 */
9555 { "mfence", { Skip_MODRM } },
9556 { "(bad)", { XX } },
9557 { "(bad)", { XX } },
9558 { "(bad)", { XX } },
9559 { "(bad)", { XX } },
9560 { "(bad)", { XX } },
9561 { "(bad)", { XX } },
9562 { "(bad)", { XX } },
9563 },
9564 {
9565 /* RM_0FAE_REG_7 */
9566 { "sfence", { Skip_MODRM } },
9567 { "(bad)", { XX } },
9568 { "(bad)", { XX } },
9569 { "(bad)", { XX } },
9570 { "(bad)", { XX } },
9571 { "(bad)", { XX } },
9572 { "(bad)", { XX } },
9573 { "(bad)", { XX } },
9574 },
9575 };
9576
9577 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
9578
9579 static void
9580 ckprefix (void)
9581 {
9582 int newrex;
9583 rex = 0;
9584 rex_original = 0;
9585 rex_ignored = 0;
9586 prefixes = 0;
9587 used_prefixes = 0;
9588 rex_used = 0;
9589 while (1)
9590 {
9591 FETCH_DATA (the_info, codep + 1);
9592 newrex = 0;
9593 switch (*codep)
9594 {
9595 /* REX prefixes family. */
9596 case 0x40:
9597 case 0x41:
9598 case 0x42:
9599 case 0x43:
9600 case 0x44:
9601 case 0x45:
9602 case 0x46:
9603 case 0x47:
9604 case 0x48:
9605 case 0x49:
9606 case 0x4a:
9607 case 0x4b:
9608 case 0x4c:
9609 case 0x4d:
9610 case 0x4e:
9611 case 0x4f:
9612 if (address_mode == mode_64bit)
9613 newrex = *codep;
9614 else
9615 return;
9616 break;
9617 case 0xf3:
9618 prefixes |= PREFIX_REPZ;
9619 break;
9620 case 0xf2:
9621 prefixes |= PREFIX_REPNZ;
9622 break;
9623 case 0xf0:
9624 prefixes |= PREFIX_LOCK;
9625 break;
9626 case 0x2e:
9627 prefixes |= PREFIX_CS;
9628 break;
9629 case 0x36:
9630 prefixes |= PREFIX_SS;
9631 break;
9632 case 0x3e:
9633 prefixes |= PREFIX_DS;
9634 break;
9635 case 0x26:
9636 prefixes |= PREFIX_ES;
9637 break;
9638 case 0x64:
9639 prefixes |= PREFIX_FS;
9640 break;
9641 case 0x65:
9642 prefixes |= PREFIX_GS;
9643 break;
9644 case 0x66:
9645 prefixes |= PREFIX_DATA;
9646 break;
9647 case 0x67:
9648 prefixes |= PREFIX_ADDR;
9649 break;
9650 case FWAIT_OPCODE:
9651 /* fwait is really an instruction. If there are prefixes
9652 before the fwait, they belong to the fwait, *not* to the
9653 following instruction. */
9654 if (prefixes || rex)
9655 {
9656 prefixes |= PREFIX_FWAIT;
9657 codep++;
9658 return;
9659 }
9660 prefixes = PREFIX_FWAIT;
9661 break;
9662 default:
9663 return;
9664 }
9665 /* Rex is ignored when followed by another prefix. */
9666 if (rex)
9667 {
9668 rex_used = rex;
9669 return;
9670 }
9671 rex = newrex;
9672 rex_original = rex;
9673 codep++;
9674 }
9675 }
9676
9677 /* Return the name of the prefix byte PREF, or NULL if PREF is not a
9678 prefix byte. */
9679
9680 static const char *
9681 prefix_name (int pref, int sizeflag)
9682 {
9683 static const char *rexes [16] =
9684 {
9685 "rex", /* 0x40 */
9686 "rex.B", /* 0x41 */
9687 "rex.X", /* 0x42 */
9688 "rex.XB", /* 0x43 */
9689 "rex.R", /* 0x44 */
9690 "rex.RB", /* 0x45 */
9691 "rex.RX", /* 0x46 */
9692 "rex.RXB", /* 0x47 */
9693 "rex.W", /* 0x48 */
9694 "rex.WB", /* 0x49 */
9695 "rex.WX", /* 0x4a */
9696 "rex.WXB", /* 0x4b */
9697 "rex.WR", /* 0x4c */
9698 "rex.WRB", /* 0x4d */
9699 "rex.WRX", /* 0x4e */
9700 "rex.WRXB", /* 0x4f */
9701 };
9702
9703 switch (pref)
9704 {
9705 /* REX prefixes family. */
9706 case 0x40:
9707 case 0x41:
9708 case 0x42:
9709 case 0x43:
9710 case 0x44:
9711 case 0x45:
9712 case 0x46:
9713 case 0x47:
9714 case 0x48:
9715 case 0x49:
9716 case 0x4a:
9717 case 0x4b:
9718 case 0x4c:
9719 case 0x4d:
9720 case 0x4e:
9721 case 0x4f:
9722 return rexes [pref - 0x40];
9723 case 0xf3:
9724 return "repz";
9725 case 0xf2:
9726 return "repnz";
9727 case 0xf0:
9728 return "lock";
9729 case 0x2e:
9730 return "cs";
9731 case 0x36:
9732 return "ss";
9733 case 0x3e:
9734 return "ds";
9735 case 0x26:
9736 return "es";
9737 case 0x64:
9738 return "fs";
9739 case 0x65:
9740 return "gs";
9741 case 0x66:
9742 return (sizeflag & DFLAG) ? "data16" : "data32";
9743 case 0x67:
9744 if (address_mode == mode_64bit)
9745 return (sizeflag & AFLAG) ? "addr32" : "addr64";
9746 else
9747 return (sizeflag & AFLAG) ? "addr16" : "addr32";
9748 case FWAIT_OPCODE:
9749 return "fwait";
9750 default:
9751 return NULL;
9752 }
9753 }
9754
9755 static char op_out[MAX_OPERANDS][100];
9756 static int op_ad, op_index[MAX_OPERANDS];
9757 static int two_source_ops;
9758 static bfd_vma op_address[MAX_OPERANDS];
9759 static bfd_vma op_riprel[MAX_OPERANDS];
9760 static bfd_vma start_pc;
9761
9762 /*
9763 * On the 386's of 1988, the maximum length of an instruction is 15 bytes.
9764 * (see topic "Redundant prefixes" in the "Differences from 8086"
9765 * section of the "Virtual 8086 Mode" chapter.)
9766 * 'pc' should be the address of this instruction, it will
9767 * be used to print the target address if this is a relative jump or call
9768 * The function returns the length of this instruction in bytes.
9769 */
9770
9771 static char intel_syntax;
9772 static char intel_mnemonic = !SYSV386_COMPAT;
9773 static char open_char;
9774 static char close_char;
9775 static char separator_char;
9776 static char scale_char;
9777
9778 /* Here for backwards compatibility. When gdb stops using
9779 print_insn_i386_att and print_insn_i386_intel these functions can
9780 disappear, and print_insn_i386 be merged into print_insn. */
9781 int
9782 print_insn_i386_att (bfd_vma pc, disassemble_info *info)
9783 {
9784 intel_syntax = 0;
9785
9786 return print_insn (pc, info);
9787 }
9788
9789 int
9790 print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
9791 {
9792 intel_syntax = 1;
9793
9794 return print_insn (pc, info);
9795 }
9796
9797 int
9798 print_insn_i386 (bfd_vma pc, disassemble_info *info)
9799 {
9800 intel_syntax = -1;
9801
9802 return print_insn (pc, info);
9803 }
9804
9805 void
9806 print_i386_disassembler_options (FILE *stream)
9807 {
9808 fprintf (stream, _("\n\
9809 The following i386/x86-64 specific disassembler options are supported for use\n\
9810 with the -M switch (multiple options should be separated by commas):\n"));
9811
9812 fprintf (stream, _(" x86-64 Disassemble in 64bit mode\n"));
9813 fprintf (stream, _(" i386 Disassemble in 32bit mode\n"));
9814 fprintf (stream, _(" i8086 Disassemble in 16bit mode\n"));
9815 fprintf (stream, _(" att Display instruction in AT&T syntax\n"));
9816 fprintf (stream, _(" intel Display instruction in Intel syntax\n"));
9817 fprintf (stream, _(" att-mnemonic\n"
9818 " Display instruction in AT&T mnemonic\n"));
9819 fprintf (stream, _(" intel-mnemonic\n"
9820 " Display instruction in Intel mnemonic\n"));
9821 fprintf (stream, _(" addr64 Assume 64bit address size\n"));
9822 fprintf (stream, _(" addr32 Assume 32bit address size\n"));
9823 fprintf (stream, _(" addr16 Assume 16bit address size\n"));
9824 fprintf (stream, _(" data32 Assume 32bit data size\n"));
9825 fprintf (stream, _(" data16 Assume 16bit data size\n"));
9826 fprintf (stream, _(" suffix Always display instruction suffix in AT&T syntax\n"));
9827 }
9828
9829 /* Get a pointer to struct dis386 with a valid name. */
9830
9831 static const struct dis386 *
9832 get_valid_dis386 (const struct dis386 *dp, disassemble_info *info)
9833 {
9834 int index, vex_table_index;
9835
9836 if (dp->name != NULL)
9837 return dp;
9838
9839 switch (dp->op[0].bytemode)
9840 {
9841 case USE_REG_TABLE:
9842 dp = &reg_table[dp->op[1].bytemode][modrm.reg];
9843 break;
9844
9845 case USE_MOD_TABLE:
9846 index = modrm.mod == 0x3 ? 1 : 0;
9847 dp = &mod_table[dp->op[1].bytemode][index];
9848 break;
9849
9850 case USE_RM_TABLE:
9851 dp = &rm_table[dp->op[1].bytemode][modrm.rm];
9852 break;
9853
9854 case USE_PREFIX_TABLE:
9855 if (need_vex)
9856 {
9857 /* The prefix in VEX is implicit. */
9858 switch (vex.prefix)
9859 {
9860 case 0:
9861 index = 0;
9862 break;
9863 case REPE_PREFIX_OPCODE:
9864 index = 1;
9865 break;
9866 case DATA_PREFIX_OPCODE:
9867 index = 2;
9868 break;
9869 case REPNE_PREFIX_OPCODE:
9870 index = 3;
9871 break;
9872 default:
9873 abort ();
9874 break;
9875 }
9876 }
9877 else
9878 {
9879 index = 0;
9880 used_prefixes |= (prefixes & PREFIX_REPZ);
9881 if (prefixes & PREFIX_REPZ)
9882 {
9883 index = 1;
9884 repz_prefix = NULL;
9885 }
9886 else
9887 {
9888 /* We should check PREFIX_REPNZ and PREFIX_REPZ before
9889 PREFIX_DATA. */
9890 used_prefixes |= (prefixes & PREFIX_REPNZ);
9891 if (prefixes & PREFIX_REPNZ)
9892 {
9893 index = 3;
9894 repnz_prefix = NULL;
9895 }
9896 else
9897 {
9898 used_prefixes |= (prefixes & PREFIX_DATA);
9899 if (prefixes & PREFIX_DATA)
9900 {
9901 index = 2;
9902 data_prefix = NULL;
9903 }
9904 }
9905 }
9906 }
9907 dp = &prefix_table[dp->op[1].bytemode][index];
9908 break;
9909
9910 case USE_X86_64_TABLE:
9911 index = address_mode == mode_64bit ? 1 : 0;
9912 dp = &x86_64_table[dp->op[1].bytemode][index];
9913 break;
9914
9915 case USE_3BYTE_TABLE:
9916 FETCH_DATA (info, codep + 2);
9917 index = *codep++;
9918 dp = &three_byte_table[dp->op[1].bytemode][index];
9919 modrm.mod = (*codep >> 6) & 3;
9920 modrm.reg = (*codep >> 3) & 7;
9921 modrm.rm = *codep & 7;
9922 break;
9923
9924 case USE_VEX_LEN_TABLE:
9925 if (!need_vex)
9926 abort ();
9927
9928 switch (vex.length)
9929 {
9930 case 128:
9931 index = 0;
9932 break;
9933 case 256:
9934 index = 1;
9935 break;
9936 default:
9937 abort ();
9938 break;
9939 }
9940
9941 dp = &vex_len_table[dp->op[1].bytemode][index];
9942 break;
9943
9944 case USE_VEX_C4_TABLE:
9945 FETCH_DATA (info, codep + 3);
9946 /* All bits in the REX prefix are ignored. */
9947 rex_ignored = rex;
9948 rex = ~(*codep >> 5) & 0x7;
9949 switch ((*codep & 0x1f))
9950 {
9951 default:
9952 BadOp ();
9953 case 0x1:
9954 vex_table_index = 0;
9955 break;
9956 case 0x2:
9957 vex_table_index = 1;
9958 break;
9959 case 0x3:
9960 vex_table_index = 2;
9961 break;
9962 }
9963 codep++;
9964 vex.w = *codep & 0x80;
9965 if (vex.w && address_mode == mode_64bit)
9966 rex |= REX_W;
9967
9968 vex.register_specifier = (~(*codep >> 3)) & 0xf;
9969 if (address_mode != mode_64bit
9970 && vex.register_specifier > 0x7)
9971 BadOp ();
9972
9973 vex.length = (*codep & 0x4) ? 256 : 128;
9974 switch ((*codep & 0x3))
9975 {
9976 case 0:
9977 vex.prefix = 0;
9978 break;
9979 case 1:
9980 vex.prefix = DATA_PREFIX_OPCODE;
9981 break;
9982 case 2:
9983 vex.prefix = REPE_PREFIX_OPCODE;
9984 break;
9985 case 3:
9986 vex.prefix = REPNE_PREFIX_OPCODE;
9987 break;
9988 }
9989 need_vex = 1;
9990 need_vex_reg = 1;
9991 codep++;
9992 index = *codep++;
9993 dp = &vex_table[vex_table_index][index];
9994 /* There is no MODRM byte for VEX [82|77]. */
9995 if (index != 0x77 && index != 0x82)
9996 {
9997 FETCH_DATA (info, codep + 1);
9998 modrm.mod = (*codep >> 6) & 3;
9999 modrm.reg = (*codep >> 3) & 7;
10000 modrm.rm = *codep & 7;
10001 }
10002 break;
10003
10004 case USE_VEX_C5_TABLE:
10005 FETCH_DATA (info, codep + 2);
10006 /* All bits in the REX prefix are ignored. */
10007 rex_ignored = rex;
10008 rex = (*codep & 0x80) ? 0 : REX_R;
10009
10010 vex.register_specifier = (~(*codep >> 3)) & 0xf;
10011 if (address_mode != mode_64bit
10012 && vex.register_specifier > 0x7)
10013 BadOp ();
10014
10015 vex.length = (*codep & 0x4) ? 256 : 128;
10016 switch ((*codep & 0x3))
10017 {
10018 case 0:
10019 vex.prefix = 0;
10020 break;
10021 case 1:
10022 vex.prefix = DATA_PREFIX_OPCODE;
10023 break;
10024 case 2:
10025 vex.prefix = REPE_PREFIX_OPCODE;
10026 break;
10027 case 3:
10028 vex.prefix = REPNE_PREFIX_OPCODE;
10029 break;
10030 }
10031 need_vex = 1;
10032 need_vex_reg = 1;
10033 codep++;
10034 index = *codep++;
10035 dp = &vex_table[dp->op[1].bytemode][index];
10036 /* There is no MODRM byte for VEX [82|77]. */
10037 if (index != 0x77 && index != 0x82)
10038 {
10039 FETCH_DATA (info, codep + 1);
10040 modrm.mod = (*codep >> 6) & 3;
10041 modrm.reg = (*codep >> 3) & 7;
10042 modrm.rm = *codep & 7;
10043 }
10044 break;
10045
10046 default:
10047 oappend (INTERNAL_DISASSEMBLER_ERROR);
10048 return NULL;
10049 }
10050
10051 if (dp->name != NULL)
10052 return dp;
10053 else
10054 return get_valid_dis386 (dp, info);
10055 }
10056
10057 static int
10058 print_insn (bfd_vma pc, disassemble_info *info)
10059 {
10060 const struct dis386 *dp;
10061 int i;
10062 char *op_txt[MAX_OPERANDS];
10063 int needcomma;
10064 int sizeflag;
10065 const char *p;
10066 struct dis_private priv;
10067 unsigned char op;
10068 char prefix_obuf[32];
10069 char *prefix_obufp;
10070
10071 if (info->mach == bfd_mach_x86_64_intel_syntax
10072 || info->mach == bfd_mach_x86_64)
10073 address_mode = mode_64bit;
10074 else
10075 address_mode = mode_32bit;
10076
10077 if (intel_syntax == (char) -1)
10078 intel_syntax = (info->mach == bfd_mach_i386_i386_intel_syntax
10079 || info->mach == bfd_mach_x86_64_intel_syntax);
10080
10081 if (info->mach == bfd_mach_i386_i386
10082 || info->mach == bfd_mach_x86_64
10083 || info->mach == bfd_mach_i386_i386_intel_syntax
10084 || info->mach == bfd_mach_x86_64_intel_syntax)
10085 priv.orig_sizeflag = AFLAG | DFLAG;
10086 else if (info->mach == bfd_mach_i386_i8086)
10087 priv.orig_sizeflag = 0;
10088 else
10089 abort ();
10090
10091 for (p = info->disassembler_options; p != NULL; )
10092 {
10093 if (CONST_STRNEQ (p, "x86-64"))
10094 {
10095 address_mode = mode_64bit;
10096 priv.orig_sizeflag = AFLAG | DFLAG;
10097 }
10098 else if (CONST_STRNEQ (p, "i386"))
10099 {
10100 address_mode = mode_32bit;
10101 priv.orig_sizeflag = AFLAG | DFLAG;
10102 }
10103 else if (CONST_STRNEQ (p, "i8086"))
10104 {
10105 address_mode = mode_16bit;
10106 priv.orig_sizeflag = 0;
10107 }
10108 else if (CONST_STRNEQ (p, "intel"))
10109 {
10110 intel_syntax = 1;
10111 if (CONST_STRNEQ (p + 5, "-mnemonic"))
10112 intel_mnemonic = 1;
10113 }
10114 else if (CONST_STRNEQ (p, "att"))
10115 {
10116 intel_syntax = 0;
10117 if (CONST_STRNEQ (p + 3, "-mnemonic"))
10118 intel_mnemonic = 0;
10119 }
10120 else if (CONST_STRNEQ (p, "addr"))
10121 {
10122 if (address_mode == mode_64bit)
10123 {
10124 if (p[4] == '3' && p[5] == '2')
10125 priv.orig_sizeflag &= ~AFLAG;
10126 else if (p[4] == '6' && p[5] == '4')
10127 priv.orig_sizeflag |= AFLAG;
10128 }
10129 else
10130 {
10131 if (p[4] == '1' && p[5] == '6')
10132 priv.orig_sizeflag &= ~AFLAG;
10133 else if (p[4] == '3' && p[5] == '2')
10134 priv.orig_sizeflag |= AFLAG;
10135 }
10136 }
10137 else if (CONST_STRNEQ (p, "data"))
10138 {
10139 if (p[4] == '1' && p[5] == '6')
10140 priv.orig_sizeflag &= ~DFLAG;
10141 else if (p[4] == '3' && p[5] == '2')
10142 priv.orig_sizeflag |= DFLAG;
10143 }
10144 else if (CONST_STRNEQ (p, "suffix"))
10145 priv.orig_sizeflag |= SUFFIX_ALWAYS;
10146
10147 p = strchr (p, ',');
10148 if (p != NULL)
10149 p++;
10150 }
10151
10152 if (intel_syntax)
10153 {
10154 names64 = intel_names64;
10155 names32 = intel_names32;
10156 names16 = intel_names16;
10157 names8 = intel_names8;
10158 names8rex = intel_names8rex;
10159 names_seg = intel_names_seg;
10160 index64 = intel_index64;
10161 index32 = intel_index32;
10162 index16 = intel_index16;
10163 open_char = '[';
10164 close_char = ']';
10165 separator_char = '+';
10166 scale_char = '*';
10167 }
10168 else
10169 {
10170 names64 = att_names64;
10171 names32 = att_names32;
10172 names16 = att_names16;
10173 names8 = att_names8;
10174 names8rex = att_names8rex;
10175 names_seg = att_names_seg;
10176 index64 = att_index64;
10177 index32 = att_index32;
10178 index16 = att_index16;
10179 open_char = '(';
10180 close_char = ')';
10181 separator_char = ',';
10182 scale_char = ',';
10183 }
10184
10185 /* The output looks better if we put 7 bytes on a line, since that
10186 puts most long word instructions on a single line. */
10187 info->bytes_per_line = 7;
10188
10189 info->private_data = &priv;
10190 priv.max_fetched = priv.the_buffer;
10191 priv.insn_start = pc;
10192
10193 obuf[0] = 0;
10194 for (i = 0; i < MAX_OPERANDS; ++i)
10195 {
10196 op_out[i][0] = 0;
10197 op_index[i] = -1;
10198 }
10199
10200 the_info = info;
10201 start_pc = pc;
10202 start_codep = priv.the_buffer;
10203 codep = priv.the_buffer;
10204
10205 if (setjmp (priv.bailout) != 0)
10206 {
10207 const char *name;
10208
10209 /* Getting here means we tried for data but didn't get it. That
10210 means we have an incomplete instruction of some sort. Just
10211 print the first byte as a prefix or a .byte pseudo-op. */
10212 if (codep > priv.the_buffer)
10213 {
10214 name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
10215 if (name != NULL)
10216 (*info->fprintf_func) (info->stream, "%s", name);
10217 else
10218 {
10219 /* Just print the first byte as a .byte instruction. */
10220 (*info->fprintf_func) (info->stream, ".byte 0x%x",
10221 (unsigned int) priv.the_buffer[0]);
10222 }
10223
10224 return 1;
10225 }
10226
10227 return -1;
10228 }
10229
10230 obufp = obuf;
10231 ckprefix ();
10232
10233 insn_codep = codep;
10234 sizeflag = priv.orig_sizeflag;
10235
10236 FETCH_DATA (info, codep + 1);
10237 two_source_ops = (*codep == 0x62) || (*codep == 0xc8);
10238
10239 if (((prefixes & PREFIX_FWAIT)
10240 && ((*codep < 0xd8) || (*codep > 0xdf)))
10241 || (rex && rex_used))
10242 {
10243 const char *name;
10244
10245 /* fwait not followed by floating point instruction, or rex followed
10246 by other prefixes. Print the first prefix. */
10247 name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
10248 if (name == NULL)
10249 name = INTERNAL_DISASSEMBLER_ERROR;
10250 (*info->fprintf_func) (info->stream, "%s", name);
10251 return 1;
10252 }
10253
10254 op = 0;
10255 if (*codep == 0x0f)
10256 {
10257 unsigned char threebyte;
10258 FETCH_DATA (info, codep + 2);
10259 threebyte = *++codep;
10260 dp = &dis386_twobyte[threebyte];
10261 need_modrm = twobyte_has_modrm[*codep];
10262 codep++;
10263 }
10264 else
10265 {
10266 dp = &dis386[*codep];
10267 need_modrm = onebyte_has_modrm[*codep];
10268 codep++;
10269 }
10270
10271 if ((prefixes & PREFIX_REPZ))
10272 {
10273 repz_prefix = "repz ";
10274 used_prefixes |= PREFIX_REPZ;
10275 }
10276 else
10277 repz_prefix = NULL;
10278
10279 if ((prefixes & PREFIX_REPNZ))
10280 {
10281 repnz_prefix = "repnz ";
10282 used_prefixes |= PREFIX_REPNZ;
10283 }
10284 else
10285 repnz_prefix = NULL;
10286
10287 if ((prefixes & PREFIX_LOCK))
10288 {
10289 lock_prefix = "lock ";
10290 used_prefixes |= PREFIX_LOCK;
10291 }
10292 else
10293 lock_prefix = NULL;
10294
10295 addr_prefix = NULL;
10296 if (prefixes & PREFIX_ADDR)
10297 {
10298 sizeflag ^= AFLAG;
10299 if (dp->op[2].bytemode != loop_jcxz_mode || intel_syntax)
10300 {
10301 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
10302 addr_prefix = "addr32 ";
10303 else
10304 addr_prefix = "addr16 ";
10305 used_prefixes |= PREFIX_ADDR;
10306 }
10307 }
10308
10309 data_prefix = NULL;
10310 if ((prefixes & PREFIX_DATA))
10311 {
10312 sizeflag ^= DFLAG;
10313 if (dp->op[2].bytemode == cond_jump_mode
10314 && dp->op[0].bytemode == v_mode
10315 && !intel_syntax)
10316 {
10317 if (sizeflag & DFLAG)
10318 data_prefix = "data32 ";
10319 else
10320 data_prefix = "data16 ";
10321 used_prefixes |= PREFIX_DATA;
10322 }
10323 }
10324
10325 if (need_modrm)
10326 {
10327 FETCH_DATA (info, codep + 1);
10328 modrm.mod = (*codep >> 6) & 3;
10329 modrm.reg = (*codep >> 3) & 7;
10330 modrm.rm = *codep & 7;
10331 }
10332
10333 if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
10334 {
10335 dofloat (sizeflag);
10336 }
10337 else
10338 {
10339 need_vex = 0;
10340 need_vex_reg = 0;
10341 vex_w_done = 0;
10342 dp = get_valid_dis386 (dp, info);
10343 if (dp != NULL && putop (dp->name, sizeflag) == 0)
10344 {
10345 for (i = 0; i < MAX_OPERANDS; ++i)
10346 {
10347 obufp = op_out[i];
10348 op_ad = MAX_OPERANDS - 1 - i;
10349 if (dp->op[i].rtn)
10350 (*dp->op[i].rtn) (dp->op[i].bytemode, sizeflag);
10351 }
10352 }
10353 }
10354
10355 /* See if any prefixes were not used. If so, print the first one
10356 separately. If we don't do this, we'll wind up printing an
10357 instruction stream which does not precisely correspond to the
10358 bytes we are disassembling. */
10359 if ((prefixes & ~used_prefixes) != 0)
10360 {
10361 const char *name;
10362
10363 name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
10364 if (name == NULL)
10365 name = INTERNAL_DISASSEMBLER_ERROR;
10366 (*info->fprintf_func) (info->stream, "%s", name);
10367 return 1;
10368 }
10369 if ((rex_original & ~rex_used) || rex_ignored)
10370 {
10371 const char *name;
10372 name = prefix_name (rex_original, priv.orig_sizeflag);
10373 if (name == NULL)
10374 name = INTERNAL_DISASSEMBLER_ERROR;
10375 (*info->fprintf_func) (info->stream, "%s ", name);
10376 }
10377
10378 prefix_obuf[0] = 0;
10379 prefix_obufp = prefix_obuf;
10380 if (lock_prefix)
10381 prefix_obufp = stpcpy (prefix_obufp, lock_prefix);
10382 if (repz_prefix)
10383 prefix_obufp = stpcpy (prefix_obufp, repz_prefix);
10384 if (repnz_prefix)
10385 prefix_obufp = stpcpy (prefix_obufp, repnz_prefix);
10386 if (addr_prefix)
10387 prefix_obufp = stpcpy (prefix_obufp, addr_prefix);
10388 if (data_prefix)
10389 prefix_obufp = stpcpy (prefix_obufp, data_prefix);
10390
10391 if (prefix_obuf[0] != 0)
10392 (*info->fprintf_func) (info->stream, "%s", prefix_obuf);
10393
10394 obufp = mnemonicendp;
10395 for (i = strlen (obuf) + strlen (prefix_obuf); i < 6; i++)
10396 oappend (" ");
10397 oappend (" ");
10398 (*info->fprintf_func) (info->stream, "%s", obuf);
10399
10400 /* The enter and bound instructions are printed with operands in the same
10401 order as the intel book; everything else is printed in reverse order. */
10402 if (intel_syntax || two_source_ops)
10403 {
10404 bfd_vma riprel;
10405
10406 for (i = 0; i < MAX_OPERANDS; ++i)
10407 op_txt[i] = op_out[i];
10408
10409 for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
10410 {
10411 op_ad = op_index[i];
10412 op_index[i] = op_index[MAX_OPERANDS - 1 - i];
10413 op_index[MAX_OPERANDS - 1 - i] = op_ad;
10414 riprel = op_riprel[i];
10415 op_riprel[i] = op_riprel [MAX_OPERANDS - 1 - i];
10416 op_riprel[MAX_OPERANDS - 1 - i] = riprel;
10417 }
10418 }
10419 else
10420 {
10421 for (i = 0; i < MAX_OPERANDS; ++i)
10422 op_txt[MAX_OPERANDS - 1 - i] = op_out[i];
10423 }
10424
10425 needcomma = 0;
10426 for (i = 0; i < MAX_OPERANDS; ++i)
10427 if (*op_txt[i])
10428 {
10429 if (needcomma)
10430 (*info->fprintf_func) (info->stream, ",");
10431 if (op_index[i] != -1 && !op_riprel[i])
10432 (*info->print_address_func) ((bfd_vma) op_address[op_index[i]], info);
10433 else
10434 (*info->fprintf_func) (info->stream, "%s", op_txt[i]);
10435 needcomma = 1;
10436 }
10437
10438 for (i = 0; i < MAX_OPERANDS; i++)
10439 if (op_index[i] != -1 && op_riprel[i])
10440 {
10441 (*info->fprintf_func) (info->stream, " # ");
10442 (*info->print_address_func) ((bfd_vma) (start_pc + codep - start_codep
10443 + op_address[op_index[i]]), info);
10444 break;
10445 }
10446 return codep - priv.the_buffer;
10447 }
10448
10449 static const char *float_mem[] = {
10450 /* d8 */
10451 "fadd{s|}",
10452 "fmul{s|}",
10453 "fcom{s|}",
10454 "fcomp{s|}",
10455 "fsub{s|}",
10456 "fsubr{s|}",
10457 "fdiv{s|}",
10458 "fdivr{s|}",
10459 /* d9 */
10460 "fld{s|}",
10461 "(bad)",
10462 "fst{s|}",
10463 "fstp{s|}",
10464 "fldenvIC",
10465 "fldcw",
10466 "fNstenvIC",
10467 "fNstcw",
10468 /* da */
10469 "fiadd{l|}",
10470 "fimul{l|}",
10471 "ficom{l|}",
10472 "ficomp{l|}",
10473 "fisub{l|}",
10474 "fisubr{l|}",
10475 "fidiv{l|}",
10476 "fidivr{l|}",
10477 /* db */
10478 "fild{l|}",
10479 "fisttp{l|}",
10480 "fist{l|}",
10481 "fistp{l|}",
10482 "(bad)",
10483 "fld{t||t|}",
10484 "(bad)",
10485 "fstp{t||t|}",
10486 /* dc */
10487 "fadd{l|}",
10488 "fmul{l|}",
10489 "fcom{l|}",
10490 "fcomp{l|}",
10491 "fsub{l|}",
10492 "fsubr{l|}",
10493 "fdiv{l|}",
10494 "fdivr{l|}",
10495 /* dd */
10496 "fld{l|}",
10497 "fisttp{ll|}",
10498 "fst{l||}",
10499 "fstp{l|}",
10500 "frstorIC",
10501 "(bad)",
10502 "fNsaveIC",
10503 "fNstsw",
10504 /* de */
10505 "fiadd",
10506 "fimul",
10507 "ficom",
10508 "ficomp",
10509 "fisub",
10510 "fisubr",
10511 "fidiv",
10512 "fidivr",
10513 /* df */
10514 "fild",
10515 "fisttp",
10516 "fist",
10517 "fistp",
10518 "fbld",
10519 "fild{ll|}",
10520 "fbstp",
10521 "fistp{ll|}",
10522 };
10523
10524 static const unsigned char float_mem_mode[] = {
10525 /* d8 */
10526 d_mode,
10527 d_mode,
10528 d_mode,
10529 d_mode,
10530 d_mode,
10531 d_mode,
10532 d_mode,
10533 d_mode,
10534 /* d9 */
10535 d_mode,
10536 0,
10537 d_mode,
10538 d_mode,
10539 0,
10540 w_mode,
10541 0,
10542 w_mode,
10543 /* da */
10544 d_mode,
10545 d_mode,
10546 d_mode,
10547 d_mode,
10548 d_mode,
10549 d_mode,
10550 d_mode,
10551 d_mode,
10552 /* db */
10553 d_mode,
10554 d_mode,
10555 d_mode,
10556 d_mode,
10557 0,
10558 t_mode,
10559 0,
10560 t_mode,
10561 /* dc */
10562 q_mode,
10563 q_mode,
10564 q_mode,
10565 q_mode,
10566 q_mode,
10567 q_mode,
10568 q_mode,
10569 q_mode,
10570 /* dd */
10571 q_mode,
10572 q_mode,
10573 q_mode,
10574 q_mode,
10575 0,
10576 0,
10577 0,
10578 w_mode,
10579 /* de */
10580 w_mode,
10581 w_mode,
10582 w_mode,
10583 w_mode,
10584 w_mode,
10585 w_mode,
10586 w_mode,
10587 w_mode,
10588 /* df */
10589 w_mode,
10590 w_mode,
10591 w_mode,
10592 w_mode,
10593 t_mode,
10594 q_mode,
10595 t_mode,
10596 q_mode
10597 };
10598
10599 #define ST { OP_ST, 0 }
10600 #define STi { OP_STi, 0 }
10601
10602 #define FGRPd9_2 NULL, { { NULL, 0 } }
10603 #define FGRPd9_4 NULL, { { NULL, 1 } }
10604 #define FGRPd9_5 NULL, { { NULL, 2 } }
10605 #define FGRPd9_6 NULL, { { NULL, 3 } }
10606 #define FGRPd9_7 NULL, { { NULL, 4 } }
10607 #define FGRPda_5 NULL, { { NULL, 5 } }
10608 #define FGRPdb_4 NULL, { { NULL, 6 } }
10609 #define FGRPde_3 NULL, { { NULL, 7 } }
10610 #define FGRPdf_4 NULL, { { NULL, 8 } }
10611
10612 static const struct dis386 float_reg[][8] = {
10613 /* d8 */
10614 {
10615 { "fadd", { ST, STi } },
10616 { "fmul", { ST, STi } },
10617 { "fcom", { STi } },
10618 { "fcomp", { STi } },
10619 { "fsub", { ST, STi } },
10620 { "fsubr", { ST, STi } },
10621 { "fdiv", { ST, STi } },
10622 { "fdivr", { ST, STi } },
10623 },
10624 /* d9 */
10625 {
10626 { "fld", { STi } },
10627 { "fxch", { STi } },
10628 { FGRPd9_2 },
10629 { "(bad)", { XX } },
10630 { FGRPd9_4 },
10631 { FGRPd9_5 },
10632 { FGRPd9_6 },
10633 { FGRPd9_7 },
10634 },
10635 /* da */
10636 {
10637 { "fcmovb", { ST, STi } },
10638 { "fcmove", { ST, STi } },
10639 { "fcmovbe",{ ST, STi } },
10640 { "fcmovu", { ST, STi } },
10641 { "(bad)", { XX } },
10642 { FGRPda_5 },
10643 { "(bad)", { XX } },
10644 { "(bad)", { XX } },
10645 },
10646 /* db */
10647 {
10648 { "fcmovnb",{ ST, STi } },
10649 { "fcmovne",{ ST, STi } },
10650 { "fcmovnbe",{ ST, STi } },
10651 { "fcmovnu",{ ST, STi } },
10652 { FGRPdb_4 },
10653 { "fucomi", { ST, STi } },
10654 { "fcomi", { ST, STi } },
10655 { "(bad)", { XX } },
10656 },
10657 /* dc */
10658 {
10659 { "fadd", { STi, ST } },
10660 { "fmul", { STi, ST } },
10661 { "(bad)", { XX } },
10662 { "(bad)", { XX } },
10663 { "fsub!M", { STi, ST } },
10664 { "fsubM", { STi, ST } },
10665 { "fdiv!M", { STi, ST } },
10666 { "fdivM", { STi, ST } },
10667 },
10668 /* dd */
10669 {
10670 { "ffree", { STi } },
10671 { "(bad)", { XX } },
10672 { "fst", { STi } },
10673 { "fstp", { STi } },
10674 { "fucom", { STi } },
10675 { "fucomp", { STi } },
10676 { "(bad)", { XX } },
10677 { "(bad)", { XX } },
10678 },
10679 /* de */
10680 {
10681 { "faddp", { STi, ST } },
10682 { "fmulp", { STi, ST } },
10683 { "(bad)", { XX } },
10684 { FGRPde_3 },
10685 { "fsub!Mp", { STi, ST } },
10686 { "fsubMp", { STi, ST } },
10687 { "fdiv!Mp", { STi, ST } },
10688 { "fdivMp", { STi, ST } },
10689 },
10690 /* df */
10691 {
10692 { "ffreep", { STi } },
10693 { "(bad)", { XX } },
10694 { "(bad)", { XX } },
10695 { "(bad)", { XX } },
10696 { FGRPdf_4 },
10697 { "fucomip", { ST, STi } },
10698 { "fcomip", { ST, STi } },
10699 { "(bad)", { XX } },
10700 },
10701 };
10702
10703 static char *fgrps[][8] = {
10704 /* d9_2 0 */
10705 {
10706 "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10707 },
10708
10709 /* d9_4 1 */
10710 {
10711 "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
10712 },
10713
10714 /* d9_5 2 */
10715 {
10716 "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
10717 },
10718
10719 /* d9_6 3 */
10720 {
10721 "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
10722 },
10723
10724 /* d9_7 4 */
10725 {
10726 "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
10727 },
10728
10729 /* da_5 5 */
10730 {
10731 "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10732 },
10733
10734 /* db_4 6 */
10735 {
10736 "feni(287 only)","fdisi(287 only)","fNclex","fNinit",
10737 "fNsetpm(287 only)","(bad)","(bad)","(bad)",
10738 },
10739
10740 /* de_3 7 */
10741 {
10742 "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10743 },
10744
10745 /* df_4 8 */
10746 {
10747 "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10748 },
10749 };
10750
10751 static void
10752 swap_operand (void)
10753 {
10754 mnemonicendp[0] = '.';
10755 mnemonicendp[1] = 's';
10756 mnemonicendp += 2;
10757 }
10758
10759 static void
10760 OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED,
10761 int sizeflag ATTRIBUTE_UNUSED)
10762 {
10763 /* Skip mod/rm byte. */
10764 MODRM_CHECK;
10765 codep++;
10766 }
10767
10768 static void
10769 dofloat (int sizeflag)
10770 {
10771 const struct dis386 *dp;
10772 unsigned char floatop;
10773
10774 floatop = codep[-1];
10775
10776 if (modrm.mod != 3)
10777 {
10778 int fp_indx = (floatop - 0xd8) * 8 + modrm.reg;
10779
10780 putop (float_mem[fp_indx], sizeflag);
10781 obufp = op_out[0];
10782 op_ad = 2;
10783 OP_E (float_mem_mode[fp_indx], sizeflag);
10784 return;
10785 }
10786 /* Skip mod/rm byte. */
10787 MODRM_CHECK;
10788 codep++;
10789
10790 dp = &float_reg[floatop - 0xd8][modrm.reg];
10791 if (dp->name == NULL)
10792 {
10793 putop (fgrps[dp->op[0].bytemode][modrm.rm], sizeflag);
10794
10795 /* Instruction fnstsw is only one with strange arg. */
10796 if (floatop == 0xdf && codep[-1] == 0xe0)
10797 strcpy (op_out[0], names16[0]);
10798 }
10799 else
10800 {
10801 putop (dp->name, sizeflag);
10802
10803 obufp = op_out[0];
10804 op_ad = 2;
10805 if (dp->op[0].rtn)
10806 (*dp->op[0].rtn) (dp->op[0].bytemode, sizeflag);
10807
10808 obufp = op_out[1];
10809 op_ad = 1;
10810 if (dp->op[1].rtn)
10811 (*dp->op[1].rtn) (dp->op[1].bytemode, sizeflag);
10812 }
10813 }
10814
10815 static void
10816 OP_ST (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
10817 {
10818 oappend ("%st" + intel_syntax);
10819 }
10820
10821 static void
10822 OP_STi (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
10823 {
10824 sprintf (scratchbuf, "%%st(%d)", modrm.rm);
10825 oappend (scratchbuf + intel_syntax);
10826 }
10827
10828 /* Capital letters in template are macros. */
10829 static int
10830 putop (const char *template, int sizeflag)
10831 {
10832 const char *p;
10833 int alt = 0;
10834 int cond = 1;
10835 unsigned int l = 0, len = 1;
10836 char last[4];
10837
10838 #define SAVE_LAST(c) \
10839 if (l < len && l < sizeof (last)) \
10840 last[l++] = c; \
10841 else \
10842 abort ();
10843
10844 for (p = template; *p; p++)
10845 {
10846 switch (*p)
10847 {
10848 default:
10849 *obufp++ = *p;
10850 break;
10851 case '%':
10852 len++;
10853 break;
10854 case '!':
10855 cond = 0;
10856 break;
10857 case '{':
10858 alt = 0;
10859 if (intel_syntax)
10860 {
10861 while (*++p != '|')
10862 if (*p == '}' || *p == '\0')
10863 abort ();
10864 }
10865 /* Fall through. */
10866 case 'I':
10867 alt = 1;
10868 continue;
10869 case '|':
10870 while (*++p != '}')
10871 {
10872 if (*p == '\0')
10873 abort ();
10874 }
10875 break;
10876 case '}':
10877 break;
10878 case 'A':
10879 if (intel_syntax)
10880 break;
10881 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
10882 *obufp++ = 'b';
10883 break;
10884 case 'B':
10885 if (intel_syntax)
10886 break;
10887 if (sizeflag & SUFFIX_ALWAYS)
10888 *obufp++ = 'b';
10889 break;
10890 case 'C':
10891 if (intel_syntax && !alt)
10892 break;
10893 if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
10894 {
10895 if (sizeflag & DFLAG)
10896 *obufp++ = intel_syntax ? 'd' : 'l';
10897 else
10898 *obufp++ = intel_syntax ? 'w' : 's';
10899 used_prefixes |= (prefixes & PREFIX_DATA);
10900 }
10901 break;
10902 case 'D':
10903 if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
10904 break;
10905 USED_REX (REX_W);
10906 if (modrm.mod == 3)
10907 {
10908 if (rex & REX_W)
10909 *obufp++ = 'q';
10910 else if (sizeflag & DFLAG)
10911 *obufp++ = intel_syntax ? 'd' : 'l';
10912 else
10913 *obufp++ = 'w';
10914 used_prefixes |= (prefixes & PREFIX_DATA);
10915 }
10916 else
10917 *obufp++ = 'w';
10918 break;
10919 case 'E': /* For jcxz/jecxz */
10920 if (address_mode == mode_64bit)
10921 {
10922 if (sizeflag & AFLAG)
10923 *obufp++ = 'r';
10924 else
10925 *obufp++ = 'e';
10926 }
10927 else
10928 if (sizeflag & AFLAG)
10929 *obufp++ = 'e';
10930 used_prefixes |= (prefixes & PREFIX_ADDR);
10931 break;
10932 case 'F':
10933 if (intel_syntax)
10934 break;
10935 if ((prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
10936 {
10937 if (sizeflag & AFLAG)
10938 *obufp++ = address_mode == mode_64bit ? 'q' : 'l';
10939 else
10940 *obufp++ = address_mode == mode_64bit ? 'l' : 'w';
10941 used_prefixes |= (prefixes & PREFIX_ADDR);
10942 }
10943 break;
10944 case 'G':
10945 if (intel_syntax || (obufp[-1] != 's' && !(sizeflag & SUFFIX_ALWAYS)))
10946 break;
10947 if ((rex & REX_W) || (sizeflag & DFLAG))
10948 *obufp++ = 'l';
10949 else
10950 *obufp++ = 'w';
10951 if (!(rex & REX_W))
10952 used_prefixes |= (prefixes & PREFIX_DATA);
10953 break;
10954 case 'H':
10955 if (intel_syntax)
10956 break;
10957 if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
10958 || (prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
10959 {
10960 used_prefixes |= prefixes & (PREFIX_CS | PREFIX_DS);
10961 *obufp++ = ',';
10962 *obufp++ = 'p';
10963 if (prefixes & PREFIX_DS)
10964 *obufp++ = 't';
10965 else
10966 *obufp++ = 'n';
10967 }
10968 break;
10969 case 'J':
10970 if (intel_syntax)
10971 break;
10972 *obufp++ = 'l';
10973 break;
10974 case 'K':
10975 USED_REX (REX_W);
10976 if (rex & REX_W)
10977 *obufp++ = 'q';
10978 else
10979 *obufp++ = 'd';
10980 break;
10981 case 'Z':
10982 if (intel_syntax)
10983 break;
10984 if (address_mode == mode_64bit && (sizeflag & SUFFIX_ALWAYS))
10985 {
10986 *obufp++ = 'q';
10987 break;
10988 }
10989 /* Fall through. */
10990 goto case_L;
10991 case 'L':
10992 if (l != 0 || len != 1)
10993 {
10994 SAVE_LAST (*p);
10995 break;
10996 }
10997 case_L:
10998 if (intel_syntax)
10999 break;
11000 if (sizeflag & SUFFIX_ALWAYS)
11001 *obufp++ = 'l';
11002 break;
11003 case 'M':
11004 if (intel_mnemonic != cond)
11005 *obufp++ = 'r';
11006 break;
11007 case 'N':
11008 if ((prefixes & PREFIX_FWAIT) == 0)
11009 *obufp++ = 'n';
11010 else
11011 used_prefixes |= PREFIX_FWAIT;
11012 break;
11013 case 'O':
11014 USED_REX (REX_W);
11015 if (rex & REX_W)
11016 *obufp++ = 'o';
11017 else if (intel_syntax && (sizeflag & DFLAG))
11018 *obufp++ = 'q';
11019 else
11020 *obufp++ = 'd';
11021 if (!(rex & REX_W))
11022 used_prefixes |= (prefixes & PREFIX_DATA);
11023 break;
11024 case 'T':
11025 if (intel_syntax)
11026 break;
11027 if (address_mode == mode_64bit && (sizeflag & DFLAG))
11028 {
11029 *obufp++ = 'q';
11030 break;
11031 }
11032 /* Fall through. */
11033 case 'P':
11034 if (intel_syntax)
11035 break;
11036 if ((prefixes & PREFIX_DATA)
11037 || (rex & REX_W)
11038 || (sizeflag & SUFFIX_ALWAYS))
11039 {
11040 USED_REX (REX_W);
11041 if (rex & REX_W)
11042 *obufp++ = 'q';
11043 else
11044 {
11045 if (sizeflag & DFLAG)
11046 *obufp++ = 'l';
11047 else
11048 *obufp++ = 'w';
11049 }
11050 used_prefixes |= (prefixes & PREFIX_DATA);
11051 }
11052 break;
11053 case 'U':
11054 if (intel_syntax)
11055 break;
11056 if (address_mode == mode_64bit && (sizeflag & DFLAG))
11057 {
11058 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
11059 *obufp++ = 'q';
11060 break;
11061 }
11062 /* Fall through. */
11063 goto case_Q;
11064 case 'Q':
11065 if (l == 0 && len == 1)
11066 {
11067 case_Q:
11068 if (intel_syntax && !alt)
11069 break;
11070 USED_REX (REX_W);
11071 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
11072 {
11073 if (rex & REX_W)
11074 *obufp++ = 'q';
11075 else
11076 {
11077 if (sizeflag & DFLAG)
11078 *obufp++ = intel_syntax ? 'd' : 'l';
11079 else
11080 *obufp++ = 'w';
11081 }
11082 used_prefixes |= (prefixes & PREFIX_DATA);
11083 }
11084 }
11085 else
11086 {
11087 if (l != 1 || len != 2 || last[0] != 'L')
11088 {
11089 SAVE_LAST (*p);
11090 break;
11091 }
11092 if (intel_syntax
11093 || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
11094 break;
11095 if ((rex & REX_W))
11096 {
11097 USED_REX (REX_W);
11098 *obufp++ = 'q';
11099 }
11100 else
11101 *obufp++ = 'l';
11102 }
11103 break;
11104 case 'R':
11105 USED_REX (REX_W);
11106 if (rex & REX_W)
11107 *obufp++ = 'q';
11108 else if (sizeflag & DFLAG)
11109 {
11110 if (intel_syntax)
11111 *obufp++ = 'd';
11112 else
11113 *obufp++ = 'l';
11114 }
11115 else
11116 *obufp++ = 'w';
11117 if (intel_syntax && !p[1]
11118 && ((rex & REX_W) || (sizeflag & DFLAG)))
11119 *obufp++ = 'e';
11120 if (!(rex & REX_W))
11121 used_prefixes |= (prefixes & PREFIX_DATA);
11122 break;
11123 case 'V':
11124 if (intel_syntax)
11125 break;
11126 if (address_mode == mode_64bit && (sizeflag & DFLAG))
11127 {
11128 if (sizeflag & SUFFIX_ALWAYS)
11129 *obufp++ = 'q';
11130 break;
11131 }
11132 /* Fall through. */
11133 case 'S':
11134 if (intel_syntax)
11135 break;
11136 if (sizeflag & SUFFIX_ALWAYS)
11137 {
11138 if (rex & REX_W)
11139 *obufp++ = 'q';
11140 else
11141 {
11142 if (sizeflag & DFLAG)
11143 *obufp++ = 'l';
11144 else
11145 *obufp++ = 'w';
11146 used_prefixes |= (prefixes & PREFIX_DATA);
11147 }
11148 }
11149 break;
11150 case 'X':
11151 if (l != 0 || len != 1)
11152 {
11153 SAVE_LAST (*p);
11154 break;
11155 }
11156 if (need_vex && vex.prefix)
11157 {
11158 if (vex.prefix == DATA_PREFIX_OPCODE)
11159 *obufp++ = 'd';
11160 else
11161 *obufp++ = 's';
11162 }
11163 else if (prefixes & PREFIX_DATA)
11164 *obufp++ = 'd';
11165 else
11166 *obufp++ = 's';
11167 used_prefixes |= (prefixes & PREFIX_DATA);
11168 break;
11169 case 'Y':
11170 if (l == 0 && len == 1)
11171 {
11172 if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
11173 break;
11174 if (rex & REX_W)
11175 {
11176 USED_REX (REX_W);
11177 *obufp++ = 'q';
11178 }
11179 break;
11180 }
11181 else
11182 {
11183 if (l != 1 || len != 2 || last[0] != 'X')
11184 {
11185 SAVE_LAST (*p);
11186 break;
11187 }
11188 if (!need_vex)
11189 abort ();
11190 if (intel_syntax
11191 || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
11192 break;
11193 switch (vex.length)
11194 {
11195 case 128:
11196 *obufp++ = 'x';
11197 break;
11198 case 256:
11199 *obufp++ = 'y';
11200 break;
11201 default:
11202 abort ();
11203 }
11204 }
11205 break;
11206 case 'W':
11207 if (l == 0 && len == 1)
11208 {
11209 /* operand size flag for cwtl, cbtw */
11210 USED_REX (REX_W);
11211 if (rex & REX_W)
11212 {
11213 if (intel_syntax)
11214 *obufp++ = 'd';
11215 else
11216 *obufp++ = 'l';
11217 }
11218 else if (sizeflag & DFLAG)
11219 *obufp++ = 'w';
11220 else
11221 *obufp++ = 'b';
11222 if (!(rex & REX_W))
11223 used_prefixes |= (prefixes & PREFIX_DATA);
11224 }
11225 else
11226 {
11227 if (l != 1 || len != 2 || last[0] != 'X')
11228 {
11229 SAVE_LAST (*p);
11230 break;
11231 }
11232 if (!need_vex)
11233 abort ();
11234 *obufp++ = vex.w ? 'd': 's';
11235 }
11236 break;
11237 }
11238 alt = 0;
11239 }
11240 *obufp = 0;
11241 mnemonicendp = obufp;
11242 return 0;
11243 }
11244
11245 static void
11246 oappend (const char *s)
11247 {
11248 obufp = stpcpy (obufp, s);
11249 }
11250
11251 static void
11252 append_seg (void)
11253 {
11254 if (prefixes & PREFIX_CS)
11255 {
11256 used_prefixes |= PREFIX_CS;
11257 oappend ("%cs:" + intel_syntax);
11258 }
11259 if (prefixes & PREFIX_DS)
11260 {
11261 used_prefixes |= PREFIX_DS;
11262 oappend ("%ds:" + intel_syntax);
11263 }
11264 if (prefixes & PREFIX_SS)
11265 {
11266 used_prefixes |= PREFIX_SS;
11267 oappend ("%ss:" + intel_syntax);
11268 }
11269 if (prefixes & PREFIX_ES)
11270 {
11271 used_prefixes |= PREFIX_ES;
11272 oappend ("%es:" + intel_syntax);
11273 }
11274 if (prefixes & PREFIX_FS)
11275 {
11276 used_prefixes |= PREFIX_FS;
11277 oappend ("%fs:" + intel_syntax);
11278 }
11279 if (prefixes & PREFIX_GS)
11280 {
11281 used_prefixes |= PREFIX_GS;
11282 oappend ("%gs:" + intel_syntax);
11283 }
11284 }
11285
11286 static void
11287 OP_indirE (int bytemode, int sizeflag)
11288 {
11289 if (!intel_syntax)
11290 oappend ("*");
11291 OP_E (bytemode, sizeflag);
11292 }
11293
11294 static void
11295 print_operand_value (char *buf, int hex, bfd_vma disp)
11296 {
11297 if (address_mode == mode_64bit)
11298 {
11299 if (hex)
11300 {
11301 char tmp[30];
11302 int i;
11303 buf[0] = '0';
11304 buf[1] = 'x';
11305 sprintf_vma (tmp, disp);
11306 for (i = 0; tmp[i] == '0' && tmp[i + 1]; i++);
11307 strcpy (buf + 2, tmp + i);
11308 }
11309 else
11310 {
11311 bfd_signed_vma v = disp;
11312 char tmp[30];
11313 int i;
11314 if (v < 0)
11315 {
11316 *(buf++) = '-';
11317 v = -disp;
11318 /* Check for possible overflow on 0x8000000000000000. */
11319 if (v < 0)
11320 {
11321 strcpy (buf, "9223372036854775808");
11322 return;
11323 }
11324 }
11325 if (!v)
11326 {
11327 strcpy (buf, "0");
11328 return;
11329 }
11330
11331 i = 0;
11332 tmp[29] = 0;
11333 while (v)
11334 {
11335 tmp[28 - i] = (v % 10) + '0';
11336 v /= 10;
11337 i++;
11338 }
11339 strcpy (buf, tmp + 29 - i);
11340 }
11341 }
11342 else
11343 {
11344 if (hex)
11345 sprintf (buf, "0x%x", (unsigned int) disp);
11346 else
11347 sprintf (buf, "%d", (int) disp);
11348 }
11349 }
11350
11351 /* Put DISP in BUF as signed hex number. */
11352
11353 static void
11354 print_displacement (char *buf, bfd_vma disp)
11355 {
11356 bfd_signed_vma val = disp;
11357 char tmp[30];
11358 int i, j = 0;
11359
11360 if (val < 0)
11361 {
11362 buf[j++] = '-';
11363 val = -disp;
11364
11365 /* Check for possible overflow. */
11366 if (val < 0)
11367 {
11368 switch (address_mode)
11369 {
11370 case mode_64bit:
11371 strcpy (buf + j, "0x8000000000000000");
11372 break;
11373 case mode_32bit:
11374 strcpy (buf + j, "0x80000000");
11375 break;
11376 case mode_16bit:
11377 strcpy (buf + j, "0x8000");
11378 break;
11379 }
11380 return;
11381 }
11382 }
11383
11384 buf[j++] = '0';
11385 buf[j++] = 'x';
11386
11387 sprintf_vma (tmp, (bfd_vma) val);
11388 for (i = 0; tmp[i] == '0'; i++)
11389 continue;
11390 if (tmp[i] == '\0')
11391 i--;
11392 strcpy (buf + j, tmp + i);
11393 }
11394
11395 static void
11396 intel_operand_size (int bytemode, int sizeflag)
11397 {
11398 switch (bytemode)
11399 {
11400 case b_mode:
11401 case b_swap_mode:
11402 case dqb_mode:
11403 oappend ("BYTE PTR ");
11404 break;
11405 case w_mode:
11406 case dqw_mode:
11407 oappend ("WORD PTR ");
11408 break;
11409 case stack_v_mode:
11410 if (address_mode == mode_64bit && (sizeflag & DFLAG))
11411 {
11412 oappend ("QWORD PTR ");
11413 used_prefixes |= (prefixes & PREFIX_DATA);
11414 break;
11415 }
11416 /* FALLTHRU */
11417 case v_mode:
11418 case v_swap_mode:
11419 case dq_mode:
11420 USED_REX (REX_W);
11421 if (rex & REX_W)
11422 oappend ("QWORD PTR ");
11423 else if ((sizeflag & DFLAG) || bytemode == dq_mode)
11424 oappend ("DWORD PTR ");
11425 else
11426 oappend ("WORD PTR ");
11427 used_prefixes |= (prefixes & PREFIX_DATA);
11428 break;
11429 case z_mode:
11430 if ((rex & REX_W) || (sizeflag & DFLAG))
11431 *obufp++ = 'D';
11432 oappend ("WORD PTR ");
11433 if (!(rex & REX_W))
11434 used_prefixes |= (prefixes & PREFIX_DATA);
11435 break;
11436 case a_mode:
11437 if (sizeflag & DFLAG)
11438 oappend ("QWORD PTR ");
11439 else
11440 oappend ("DWORD PTR ");
11441 used_prefixes |= (prefixes & PREFIX_DATA);
11442 break;
11443 case d_mode:
11444 case d_swap_mode:
11445 case dqd_mode:
11446 oappend ("DWORD PTR ");
11447 break;
11448 case q_mode:
11449 case q_swap_mode:
11450 oappend ("QWORD PTR ");
11451 break;
11452 case m_mode:
11453 if (address_mode == mode_64bit)
11454 oappend ("QWORD PTR ");
11455 else
11456 oappend ("DWORD PTR ");
11457 break;
11458 case f_mode:
11459 if (sizeflag & DFLAG)
11460 oappend ("FWORD PTR ");
11461 else
11462 oappend ("DWORD PTR ");
11463 used_prefixes |= (prefixes & PREFIX_DATA);
11464 break;
11465 case t_mode:
11466 oappend ("TBYTE PTR ");
11467 break;
11468 case x_mode:
11469 case x_swap_mode:
11470 if (need_vex)
11471 {
11472 switch (vex.length)
11473 {
11474 case 128:
11475 oappend ("XMMWORD PTR ");
11476 break;
11477 case 256:
11478 oappend ("YMMWORD PTR ");
11479 break;
11480 default:
11481 abort ();
11482 }
11483 }
11484 else
11485 oappend ("XMMWORD PTR ");
11486 break;
11487 case xmm_mode:
11488 oappend ("XMMWORD PTR ");
11489 break;
11490 case xmmq_mode:
11491 if (!need_vex)
11492 abort ();
11493
11494 switch (vex.length)
11495 {
11496 case 128:
11497 oappend ("QWORD PTR ");
11498 break;
11499 case 256:
11500 oappend ("XMMWORD PTR ");
11501 break;
11502 default:
11503 abort ();
11504 }
11505 break;
11506 case ymmq_mode:
11507 if (!need_vex)
11508 abort ();
11509
11510 switch (vex.length)
11511 {
11512 case 128:
11513 oappend ("QWORD PTR ");
11514 break;
11515 case 256:
11516 oappend ("YMMWORD PTR ");
11517 break;
11518 default:
11519 abort ();
11520 }
11521 break;
11522 case o_mode:
11523 oappend ("OWORD PTR ");
11524 break;
11525 case vex_w_dq_mode:
11526 if (!need_vex)
11527 abort ();
11528
11529 if (vex.w)
11530 oappend ("QWORD PTR ");
11531 else
11532 oappend ("DWORD PTR ");
11533 break;
11534 default:
11535 break;
11536 }
11537 }
11538
11539 static void
11540 OP_E_register (int bytemode, int sizeflag)
11541 {
11542 int reg = modrm.rm;
11543 const char **names;
11544
11545 USED_REX (REX_B);
11546 if ((rex & REX_B))
11547 reg += 8;
11548
11549 if ((sizeflag & SUFFIX_ALWAYS)
11550 && (bytemode == b_swap_mode || bytemode == v_swap_mode))
11551 swap_operand ();
11552
11553 switch (bytemode)
11554 {
11555 case b_mode:
11556 case b_swap_mode:
11557 USED_REX (0);
11558 if (rex)
11559 names = names8rex;
11560 else
11561 names = names8;
11562 break;
11563 case w_mode:
11564 names = names16;
11565 break;
11566 case d_mode:
11567 names = names32;
11568 break;
11569 case q_mode:
11570 names = names64;
11571 break;
11572 case m_mode:
11573 names = address_mode == mode_64bit ? names64 : names32;
11574 break;
11575 case stack_v_mode:
11576 if (address_mode == mode_64bit && (sizeflag & DFLAG))
11577 {
11578 names = names64;
11579 used_prefixes |= (prefixes & PREFIX_DATA);
11580 break;
11581 }
11582 bytemode = v_mode;
11583 /* FALLTHRU */
11584 case v_mode:
11585 case v_swap_mode:
11586 case dq_mode:
11587 case dqb_mode:
11588 case dqd_mode:
11589 case dqw_mode:
11590 USED_REX (REX_W);
11591 if (rex & REX_W)
11592 names = names64;
11593 else if ((sizeflag & DFLAG)
11594 || (bytemode != v_mode
11595 && bytemode != v_swap_mode))
11596 names = names32;
11597 else
11598 names = names16;
11599 used_prefixes |= (prefixes & PREFIX_DATA);
11600 break;
11601 case 0:
11602 return;
11603 default:
11604 oappend (INTERNAL_DISASSEMBLER_ERROR);
11605 return;
11606 }
11607 oappend (names[reg]);
11608 }
11609
11610 static void
11611 OP_E_memory (int bytemode, int sizeflag, int has_drex)
11612 {
11613 bfd_vma disp = 0;
11614 int add = (rex & REX_B) ? 8 : 0;
11615 int riprel = 0;
11616
11617 USED_REX (REX_B);
11618 if (intel_syntax)
11619 intel_operand_size (bytemode, sizeflag);
11620 append_seg ();
11621
11622 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
11623 {
11624 /* 32/64 bit address mode */
11625 int havedisp;
11626 int havesib;
11627 int havebase;
11628 int haveindex;
11629 int needindex;
11630 int base, rbase;
11631 int index = 0;
11632 int scale = 0;
11633
11634 havesib = 0;
11635 havebase = 1;
11636 haveindex = 0;
11637 base = modrm.rm;
11638
11639 if (base == 4)
11640 {
11641 havesib = 1;
11642 FETCH_DATA (the_info, codep + 1);
11643 index = (*codep >> 3) & 7;
11644 scale = (*codep >> 6) & 3;
11645 base = *codep & 7;
11646 USED_REX (REX_X);
11647 if (rex & REX_X)
11648 index += 8;
11649 haveindex = index != 4;
11650 codep++;
11651 }
11652 rbase = base + add;
11653
11654 /* If we have a DREX byte, skip it now
11655 (it has already been handled) */
11656 if (has_drex)
11657 {
11658 FETCH_DATA (the_info, codep + 1);
11659 codep++;
11660 }
11661
11662 switch (modrm.mod)
11663 {
11664 case 0:
11665 if (base == 5)
11666 {
11667 havebase = 0;
11668 if (address_mode == mode_64bit && !havesib)
11669 riprel = 1;
11670 disp = get32s ();
11671 }
11672 break;
11673 case 1:
11674 FETCH_DATA (the_info, codep + 1);
11675 disp = *codep++;
11676 if ((disp & 0x80) != 0)
11677 disp -= 0x100;
11678 break;
11679 case 2:
11680 disp = get32s ();
11681 break;
11682 }
11683
11684 /* In 32bit mode, we need index register to tell [offset] from
11685 [eiz*1 + offset]. */
11686 needindex = (havesib
11687 && !havebase
11688 && !haveindex
11689 && address_mode == mode_32bit);
11690 havedisp = (havebase
11691 || needindex
11692 || (havesib && (haveindex || scale != 0)));
11693
11694 if (!intel_syntax)
11695 if (modrm.mod != 0 || base == 5)
11696 {
11697 if (havedisp || riprel)
11698 print_displacement (scratchbuf, disp);
11699 else
11700 print_operand_value (scratchbuf, 1, disp);
11701 oappend (scratchbuf);
11702 if (riprel)
11703 {
11704 set_op (disp, 1);
11705 oappend (sizeflag & AFLAG ? "(%rip)" : "(%eip)");
11706 }
11707 }
11708
11709 if (havebase || haveindex || riprel)
11710 used_prefixes |= PREFIX_ADDR;
11711
11712 if (havedisp || (intel_syntax && riprel))
11713 {
11714 *obufp++ = open_char;
11715 if (intel_syntax && riprel)
11716 {
11717 set_op (disp, 1);
11718 oappend (sizeflag & AFLAG ? "rip" : "eip");
11719 }
11720 *obufp = '\0';
11721 if (havebase)
11722 oappend (address_mode == mode_64bit && (sizeflag & AFLAG)
11723 ? names64[rbase] : names32[rbase]);
11724 if (havesib)
11725 {
11726 /* ESP/RSP won't allow index. If base isn't ESP/RSP,
11727 print index to tell base + index from base. */
11728 if (scale != 0
11729 || needindex
11730 || haveindex
11731 || (havebase && base != ESP_REG_NUM))
11732 {
11733 if (!intel_syntax || havebase)
11734 {
11735 *obufp++ = separator_char;
11736 *obufp = '\0';
11737 }
11738 if (haveindex)
11739 oappend (address_mode == mode_64bit
11740 && (sizeflag & AFLAG)
11741 ? names64[index] : names32[index]);
11742 else
11743 oappend (address_mode == mode_64bit
11744 && (sizeflag & AFLAG)
11745 ? index64 : index32);
11746
11747 *obufp++ = scale_char;
11748 *obufp = '\0';
11749 sprintf (scratchbuf, "%d", 1 << scale);
11750 oappend (scratchbuf);
11751 }
11752 }
11753 if (intel_syntax
11754 && (disp || modrm.mod != 0 || base == 5))
11755 {
11756 if (!havedisp || (bfd_signed_vma) disp >= 0)
11757 {
11758 *obufp++ = '+';
11759 *obufp = '\0';
11760 }
11761 else if (modrm.mod != 1)
11762 {
11763 *obufp++ = '-';
11764 *obufp = '\0';
11765 disp = - (bfd_signed_vma) disp;
11766 }
11767
11768 if (havedisp)
11769 print_displacement (scratchbuf, disp);
11770 else
11771 print_operand_value (scratchbuf, 1, disp);
11772 oappend (scratchbuf);
11773 }
11774
11775 *obufp++ = close_char;
11776 *obufp = '\0';
11777 }
11778 else if (intel_syntax)
11779 {
11780 if (modrm.mod != 0 || base == 5)
11781 {
11782 if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
11783 | PREFIX_ES | PREFIX_FS | PREFIX_GS))
11784 ;
11785 else
11786 {
11787 oappend (names_seg[ds_reg - es_reg]);
11788 oappend (":");
11789 }
11790 print_operand_value (scratchbuf, 1, disp);
11791 oappend (scratchbuf);
11792 }
11793 }
11794 }
11795 else
11796 { /* 16 bit address mode */
11797 switch (modrm.mod)
11798 {
11799 case 0:
11800 if (modrm.rm == 6)
11801 {
11802 disp = get16 ();
11803 if ((disp & 0x8000) != 0)
11804 disp -= 0x10000;
11805 }
11806 break;
11807 case 1:
11808 FETCH_DATA (the_info, codep + 1);
11809 disp = *codep++;
11810 if ((disp & 0x80) != 0)
11811 disp -= 0x100;
11812 break;
11813 case 2:
11814 disp = get16 ();
11815 if ((disp & 0x8000) != 0)
11816 disp -= 0x10000;
11817 break;
11818 }
11819
11820 if (!intel_syntax)
11821 if (modrm.mod != 0 || modrm.rm == 6)
11822 {
11823 print_displacement (scratchbuf, disp);
11824 oappend (scratchbuf);
11825 }
11826
11827 if (modrm.mod != 0 || modrm.rm != 6)
11828 {
11829 *obufp++ = open_char;
11830 *obufp = '\0';
11831 oappend (index16[modrm.rm]);
11832 if (intel_syntax
11833 && (disp || modrm.mod != 0 || modrm.rm == 6))
11834 {
11835 if ((bfd_signed_vma) disp >= 0)
11836 {
11837 *obufp++ = '+';
11838 *obufp = '\0';
11839 }
11840 else if (modrm.mod != 1)
11841 {
11842 *obufp++ = '-';
11843 *obufp = '\0';
11844 disp = - (bfd_signed_vma) disp;
11845 }
11846
11847 print_displacement (scratchbuf, disp);
11848 oappend (scratchbuf);
11849 }
11850
11851 *obufp++ = close_char;
11852 *obufp = '\0';
11853 }
11854 else if (intel_syntax)
11855 {
11856 if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
11857 | PREFIX_ES | PREFIX_FS | PREFIX_GS))
11858 ;
11859 else
11860 {
11861 oappend (names_seg[ds_reg - es_reg]);
11862 oappend (":");
11863 }
11864 print_operand_value (scratchbuf, 1, disp & 0xffff);
11865 oappend (scratchbuf);
11866 }
11867 }
11868 }
11869
11870 static void
11871 OP_E_extended (int bytemode, int sizeflag, int has_drex)
11872 {
11873 /* Skip mod/rm byte. */
11874 MODRM_CHECK;
11875 codep++;
11876
11877 if (modrm.mod == 3)
11878 OP_E_register (bytemode, sizeflag);
11879 else
11880 OP_E_memory (bytemode, sizeflag, has_drex);
11881 }
11882
11883 static void
11884 OP_E (int bytemode, int sizeflag)
11885 {
11886 OP_E_extended (bytemode, sizeflag, 0);
11887 }
11888
11889
11890 static void
11891 OP_G (int bytemode, int sizeflag)
11892 {
11893 int add = 0;
11894 USED_REX (REX_R);
11895 if (rex & REX_R)
11896 add += 8;
11897 switch (bytemode)
11898 {
11899 case b_mode:
11900 USED_REX (0);
11901 if (rex)
11902 oappend (names8rex[modrm.reg + add]);
11903 else
11904 oappend (names8[modrm.reg + add]);
11905 break;
11906 case w_mode:
11907 oappend (names16[modrm.reg + add]);
11908 break;
11909 case d_mode:
11910 oappend (names32[modrm.reg + add]);
11911 break;
11912 case q_mode:
11913 oappend (names64[modrm.reg + add]);
11914 break;
11915 case v_mode:
11916 case dq_mode:
11917 case dqb_mode:
11918 case dqd_mode:
11919 case dqw_mode:
11920 USED_REX (REX_W);
11921 if (rex & REX_W)
11922 oappend (names64[modrm.reg + add]);
11923 else if ((sizeflag & DFLAG) || bytemode != v_mode)
11924 oappend (names32[modrm.reg + add]);
11925 else
11926 oappend (names16[modrm.reg + add]);
11927 used_prefixes |= (prefixes & PREFIX_DATA);
11928 break;
11929 case m_mode:
11930 if (address_mode == mode_64bit)
11931 oappend (names64[modrm.reg + add]);
11932 else
11933 oappend (names32[modrm.reg + add]);
11934 break;
11935 default:
11936 oappend (INTERNAL_DISASSEMBLER_ERROR);
11937 break;
11938 }
11939 }
11940
11941 static bfd_vma
11942 get64 (void)
11943 {
11944 bfd_vma x;
11945 #ifdef BFD64
11946 unsigned int a;
11947 unsigned int b;
11948
11949 FETCH_DATA (the_info, codep + 8);
11950 a = *codep++ & 0xff;
11951 a |= (*codep++ & 0xff) << 8;
11952 a |= (*codep++ & 0xff) << 16;
11953 a |= (*codep++ & 0xff) << 24;
11954 b = *codep++ & 0xff;
11955 b |= (*codep++ & 0xff) << 8;
11956 b |= (*codep++ & 0xff) << 16;
11957 b |= (*codep++ & 0xff) << 24;
11958 x = a + ((bfd_vma) b << 32);
11959 #else
11960 abort ();
11961 x = 0;
11962 #endif
11963 return x;
11964 }
11965
11966 static bfd_signed_vma
11967 get32 (void)
11968 {
11969 bfd_signed_vma x = 0;
11970
11971 FETCH_DATA (the_info, codep + 4);
11972 x = *codep++ & (bfd_signed_vma) 0xff;
11973 x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
11974 x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
11975 x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
11976 return x;
11977 }
11978
11979 static bfd_signed_vma
11980 get32s (void)
11981 {
11982 bfd_signed_vma x = 0;
11983
11984 FETCH_DATA (the_info, codep + 4);
11985 x = *codep++ & (bfd_signed_vma) 0xff;
11986 x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
11987 x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
11988 x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
11989
11990 x = (x ^ ((bfd_signed_vma) 1 << 31)) - ((bfd_signed_vma) 1 << 31);
11991
11992 return x;
11993 }
11994
11995 static int
11996 get16 (void)
11997 {
11998 int x = 0;
11999
12000 FETCH_DATA (the_info, codep + 2);
12001 x = *codep++ & 0xff;
12002 x |= (*codep++ & 0xff) << 8;
12003 return x;
12004 }
12005
12006 static void
12007 set_op (bfd_vma op, int riprel)
12008 {
12009 op_index[op_ad] = op_ad;
12010 if (address_mode == mode_64bit)
12011 {
12012 op_address[op_ad] = op;
12013 op_riprel[op_ad] = riprel;
12014 }
12015 else
12016 {
12017 /* Mask to get a 32-bit address. */
12018 op_address[op_ad] = op & 0xffffffff;
12019 op_riprel[op_ad] = riprel & 0xffffffff;
12020 }
12021 }
12022
12023 static void
12024 OP_REG (int code, int sizeflag)
12025 {
12026 const char *s;
12027 int add;
12028 USED_REX (REX_B);
12029 if (rex & REX_B)
12030 add = 8;
12031 else
12032 add = 0;
12033
12034 switch (code)
12035 {
12036 case ax_reg: case cx_reg: case dx_reg: case bx_reg:
12037 case sp_reg: case bp_reg: case si_reg: case di_reg:
12038 s = names16[code - ax_reg + add];
12039 break;
12040 case es_reg: case ss_reg: case cs_reg:
12041 case ds_reg: case fs_reg: case gs_reg:
12042 s = names_seg[code - es_reg + add];
12043 break;
12044 case al_reg: case ah_reg: case cl_reg: case ch_reg:
12045 case dl_reg: case dh_reg: case bl_reg: case bh_reg:
12046 USED_REX (0);
12047 if (rex)
12048 s = names8rex[code - al_reg + add];
12049 else
12050 s = names8[code - al_reg];
12051 break;
12052 case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
12053 case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
12054 if (address_mode == mode_64bit && (sizeflag & DFLAG))
12055 {
12056 s = names64[code - rAX_reg + add];
12057 break;
12058 }
12059 code += eAX_reg - rAX_reg;
12060 /* Fall through. */
12061 case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
12062 case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
12063 USED_REX (REX_W);
12064 if (rex & REX_W)
12065 s = names64[code - eAX_reg + add];
12066 else if (sizeflag & DFLAG)
12067 s = names32[code - eAX_reg + add];
12068 else
12069 s = names16[code - eAX_reg + add];
12070 used_prefixes |= (prefixes & PREFIX_DATA);
12071 break;
12072 default:
12073 s = INTERNAL_DISASSEMBLER_ERROR;
12074 break;
12075 }
12076 oappend (s);
12077 }
12078
12079 static void
12080 OP_IMREG (int code, int sizeflag)
12081 {
12082 const char *s;
12083
12084 switch (code)
12085 {
12086 case indir_dx_reg:
12087 if (intel_syntax)
12088 s = "dx";
12089 else
12090 s = "(%dx)";
12091 break;
12092 case ax_reg: case cx_reg: case dx_reg: case bx_reg:
12093 case sp_reg: case bp_reg: case si_reg: case di_reg:
12094 s = names16[code - ax_reg];
12095 break;
12096 case es_reg: case ss_reg: case cs_reg:
12097 case ds_reg: case fs_reg: case gs_reg:
12098 s = names_seg[code - es_reg];
12099 break;
12100 case al_reg: case ah_reg: case cl_reg: case ch_reg:
12101 case dl_reg: case dh_reg: case bl_reg: case bh_reg:
12102 USED_REX (0);
12103 if (rex)
12104 s = names8rex[code - al_reg];
12105 else
12106 s = names8[code - al_reg];
12107 break;
12108 case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
12109 case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
12110 USED_REX (REX_W);
12111 if (rex & REX_W)
12112 s = names64[code - eAX_reg];
12113 else if (sizeflag & DFLAG)
12114 s = names32[code - eAX_reg];
12115 else
12116 s = names16[code - eAX_reg];
12117 used_prefixes |= (prefixes & PREFIX_DATA);
12118 break;
12119 case z_mode_ax_reg:
12120 if ((rex & REX_W) || (sizeflag & DFLAG))
12121 s = *names32;
12122 else
12123 s = *names16;
12124 if (!(rex & REX_W))
12125 used_prefixes |= (prefixes & PREFIX_DATA);
12126 break;
12127 default:
12128 s = INTERNAL_DISASSEMBLER_ERROR;
12129 break;
12130 }
12131 oappend (s);
12132 }
12133
12134 static void
12135 OP_I (int bytemode, int sizeflag)
12136 {
12137 bfd_signed_vma op;
12138 bfd_signed_vma mask = -1;
12139
12140 switch (bytemode)
12141 {
12142 case b_mode:
12143 FETCH_DATA (the_info, codep + 1);
12144 op = *codep++;
12145 mask = 0xff;
12146 break;
12147 case q_mode:
12148 if (address_mode == mode_64bit)
12149 {
12150 op = get32s ();
12151 break;
12152 }
12153 /* Fall through. */
12154 case v_mode:
12155 USED_REX (REX_W);
12156 if (rex & REX_W)
12157 op = get32s ();
12158 else if (sizeflag & DFLAG)
12159 {
12160 op = get32 ();
12161 mask = 0xffffffff;
12162 }
12163 else
12164 {
12165 op = get16 ();
12166 mask = 0xfffff;
12167 }
12168 used_prefixes |= (prefixes & PREFIX_DATA);
12169 break;
12170 case w_mode:
12171 mask = 0xfffff;
12172 op = get16 ();
12173 break;
12174 case const_1_mode:
12175 if (intel_syntax)
12176 oappend ("1");
12177 return;
12178 default:
12179 oappend (INTERNAL_DISASSEMBLER_ERROR);
12180 return;
12181 }
12182
12183 op &= mask;
12184 scratchbuf[0] = '$';
12185 print_operand_value (scratchbuf + 1, 1, op);
12186 oappend (scratchbuf + intel_syntax);
12187 scratchbuf[0] = '\0';
12188 }
12189
12190 static void
12191 OP_I64 (int bytemode, int sizeflag)
12192 {
12193 bfd_signed_vma op;
12194 bfd_signed_vma mask = -1;
12195
12196 if (address_mode != mode_64bit)
12197 {
12198 OP_I (bytemode, sizeflag);
12199 return;
12200 }
12201
12202 switch (bytemode)
12203 {
12204 case b_mode:
12205 FETCH_DATA (the_info, codep + 1);
12206 op = *codep++;
12207 mask = 0xff;
12208 break;
12209 case v_mode:
12210 USED_REX (REX_W);
12211 if (rex & REX_W)
12212 op = get64 ();
12213 else if (sizeflag & DFLAG)
12214 {
12215 op = get32 ();
12216 mask = 0xffffffff;
12217 }
12218 else
12219 {
12220 op = get16 ();
12221 mask = 0xfffff;
12222 }
12223 used_prefixes |= (prefixes & PREFIX_DATA);
12224 break;
12225 case w_mode:
12226 mask = 0xfffff;
12227 op = get16 ();
12228 break;
12229 default:
12230 oappend (INTERNAL_DISASSEMBLER_ERROR);
12231 return;
12232 }
12233
12234 op &= mask;
12235 scratchbuf[0] = '$';
12236 print_operand_value (scratchbuf + 1, 1, op);
12237 oappend (scratchbuf + intel_syntax);
12238 scratchbuf[0] = '\0';
12239 }
12240
12241 static void
12242 OP_sI (int bytemode, int sizeflag)
12243 {
12244 bfd_signed_vma op;
12245 bfd_signed_vma mask = -1;
12246
12247 switch (bytemode)
12248 {
12249 case b_mode:
12250 FETCH_DATA (the_info, codep + 1);
12251 op = *codep++;
12252 if ((op & 0x80) != 0)
12253 op -= 0x100;
12254 mask = 0xffffffff;
12255 break;
12256 case v_mode:
12257 USED_REX (REX_W);
12258 if (rex & REX_W)
12259 op = get32s ();
12260 else if (sizeflag & DFLAG)
12261 {
12262 op = get32s ();
12263 mask = 0xffffffff;
12264 }
12265 else
12266 {
12267 mask = 0xffffffff;
12268 op = get16 ();
12269 if ((op & 0x8000) != 0)
12270 op -= 0x10000;
12271 }
12272 used_prefixes |= (prefixes & PREFIX_DATA);
12273 break;
12274 case w_mode:
12275 op = get16 ();
12276 mask = 0xffffffff;
12277 if ((op & 0x8000) != 0)
12278 op -= 0x10000;
12279 break;
12280 default:
12281 oappend (INTERNAL_DISASSEMBLER_ERROR);
12282 return;
12283 }
12284
12285 scratchbuf[0] = '$';
12286 print_operand_value (scratchbuf + 1, 1, op);
12287 oappend (scratchbuf + intel_syntax);
12288 }
12289
12290 static void
12291 OP_J (int bytemode, int sizeflag)
12292 {
12293 bfd_vma disp;
12294 bfd_vma mask = -1;
12295 bfd_vma segment = 0;
12296
12297 switch (bytemode)
12298 {
12299 case b_mode:
12300 FETCH_DATA (the_info, codep + 1);
12301 disp = *codep++;
12302 if ((disp & 0x80) != 0)
12303 disp -= 0x100;
12304 break;
12305 case v_mode:
12306 if ((sizeflag & DFLAG) || (rex & REX_W))
12307 disp = get32s ();
12308 else
12309 {
12310 disp = get16 ();
12311 if ((disp & 0x8000) != 0)
12312 disp -= 0x10000;
12313 /* In 16bit mode, address is wrapped around at 64k within
12314 the same segment. Otherwise, a data16 prefix on a jump
12315 instruction means that the pc is masked to 16 bits after
12316 the displacement is added! */
12317 mask = 0xffff;
12318 if ((prefixes & PREFIX_DATA) == 0)
12319 segment = ((start_pc + codep - start_codep)
12320 & ~((bfd_vma) 0xffff));
12321 }
12322 used_prefixes |= (prefixes & PREFIX_DATA);
12323 break;
12324 default:
12325 oappend (INTERNAL_DISASSEMBLER_ERROR);
12326 return;
12327 }
12328 disp = ((start_pc + codep - start_codep + disp) & mask) | segment;
12329 set_op (disp, 0);
12330 print_operand_value (scratchbuf, 1, disp);
12331 oappend (scratchbuf);
12332 }
12333
12334 static void
12335 OP_SEG (int bytemode, int sizeflag)
12336 {
12337 if (bytemode == w_mode)
12338 oappend (names_seg[modrm.reg]);
12339 else
12340 OP_E (modrm.mod == 3 ? bytemode : w_mode, sizeflag);
12341 }
12342
12343 static void
12344 OP_DIR (int dummy ATTRIBUTE_UNUSED, int sizeflag)
12345 {
12346 int seg, offset;
12347
12348 if (sizeflag & DFLAG)
12349 {
12350 offset = get32 ();
12351 seg = get16 ();
12352 }
12353 else
12354 {
12355 offset = get16 ();
12356 seg = get16 ();
12357 }
12358 used_prefixes |= (prefixes & PREFIX_DATA);
12359 if (intel_syntax)
12360 sprintf (scratchbuf, "0x%x:0x%x", seg, offset);
12361 else
12362 sprintf (scratchbuf, "$0x%x,$0x%x", seg, offset);
12363 oappend (scratchbuf);
12364 }
12365
12366 static void
12367 OP_OFF (int bytemode, int sizeflag)
12368 {
12369 bfd_vma off;
12370
12371 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
12372 intel_operand_size (bytemode, sizeflag);
12373 append_seg ();
12374
12375 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
12376 off = get32 ();
12377 else
12378 off = get16 ();
12379
12380 if (intel_syntax)
12381 {
12382 if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
12383 | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
12384 {
12385 oappend (names_seg[ds_reg - es_reg]);
12386 oappend (":");
12387 }
12388 }
12389 print_operand_value (scratchbuf, 1, off);
12390 oappend (scratchbuf);
12391 }
12392
12393 static void
12394 OP_OFF64 (int bytemode, int sizeflag)
12395 {
12396 bfd_vma off;
12397
12398 if (address_mode != mode_64bit
12399 || (prefixes & PREFIX_ADDR))
12400 {
12401 OP_OFF (bytemode, sizeflag);
12402 return;
12403 }
12404
12405 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
12406 intel_operand_size (bytemode, sizeflag);
12407 append_seg ();
12408
12409 off = get64 ();
12410
12411 if (intel_syntax)
12412 {
12413 if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
12414 | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
12415 {
12416 oappend (names_seg[ds_reg - es_reg]);
12417 oappend (":");
12418 }
12419 }
12420 print_operand_value (scratchbuf, 1, off);
12421 oappend (scratchbuf);
12422 }
12423
12424 static void
12425 ptr_reg (int code, int sizeflag)
12426 {
12427 const char *s;
12428
12429 *obufp++ = open_char;
12430 used_prefixes |= (prefixes & PREFIX_ADDR);
12431 if (address_mode == mode_64bit)
12432 {
12433 if (!(sizeflag & AFLAG))
12434 s = names32[code - eAX_reg];
12435 else
12436 s = names64[code - eAX_reg];
12437 }
12438 else if (sizeflag & AFLAG)
12439 s = names32[code - eAX_reg];
12440 else
12441 s = names16[code - eAX_reg];
12442 oappend (s);
12443 *obufp++ = close_char;
12444 *obufp = 0;
12445 }
12446
12447 static void
12448 OP_ESreg (int code, int sizeflag)
12449 {
12450 if (intel_syntax)
12451 {
12452 switch (codep[-1])
12453 {
12454 case 0x6d: /* insw/insl */
12455 intel_operand_size (z_mode, sizeflag);
12456 break;
12457 case 0xa5: /* movsw/movsl/movsq */
12458 case 0xa7: /* cmpsw/cmpsl/cmpsq */
12459 case 0xab: /* stosw/stosl */
12460 case 0xaf: /* scasw/scasl */
12461 intel_operand_size (v_mode, sizeflag);
12462 break;
12463 default:
12464 intel_operand_size (b_mode, sizeflag);
12465 }
12466 }
12467 oappend ("%es:" + intel_syntax);
12468 ptr_reg (code, sizeflag);
12469 }
12470
12471 static void
12472 OP_DSreg (int code, int sizeflag)
12473 {
12474 if (intel_syntax)
12475 {
12476 switch (codep[-1])
12477 {
12478 case 0x6f: /* outsw/outsl */
12479 intel_operand_size (z_mode, sizeflag);
12480 break;
12481 case 0xa5: /* movsw/movsl/movsq */
12482 case 0xa7: /* cmpsw/cmpsl/cmpsq */
12483 case 0xad: /* lodsw/lodsl/lodsq */
12484 intel_operand_size (v_mode, sizeflag);
12485 break;
12486 default:
12487 intel_operand_size (b_mode, sizeflag);
12488 }
12489 }
12490 if ((prefixes
12491 & (PREFIX_CS
12492 | PREFIX_DS
12493 | PREFIX_SS
12494 | PREFIX_ES
12495 | PREFIX_FS
12496 | PREFIX_GS)) == 0)
12497 prefixes |= PREFIX_DS;
12498 append_seg ();
12499 ptr_reg (code, sizeflag);
12500 }
12501
12502 static void
12503 OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12504 {
12505 int add;
12506 if (rex & REX_R)
12507 {
12508 USED_REX (REX_R);
12509 add = 8;
12510 }
12511 else if (address_mode != mode_64bit && (prefixes & PREFIX_LOCK))
12512 {
12513 lock_prefix = NULL;
12514 used_prefixes |= PREFIX_LOCK;
12515 add = 8;
12516 }
12517 else
12518 add = 0;
12519 sprintf (scratchbuf, "%%cr%d", modrm.reg + add);
12520 oappend (scratchbuf + intel_syntax);
12521 }
12522
12523 static void
12524 OP_D (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12525 {
12526 int add;
12527 USED_REX (REX_R);
12528 if (rex & REX_R)
12529 add = 8;
12530 else
12531 add = 0;
12532 if (intel_syntax)
12533 sprintf (scratchbuf, "db%d", modrm.reg + add);
12534 else
12535 sprintf (scratchbuf, "%%db%d", modrm.reg + add);
12536 oappend (scratchbuf);
12537 }
12538
12539 static void
12540 OP_T (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12541 {
12542 sprintf (scratchbuf, "%%tr%d", modrm.reg);
12543 oappend (scratchbuf + intel_syntax);
12544 }
12545
12546 static void
12547 OP_R (int bytemode, int sizeflag)
12548 {
12549 if (modrm.mod == 3)
12550 OP_E (bytemode, sizeflag);
12551 else
12552 BadOp ();
12553 }
12554
12555 static void
12556 OP_MMX (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12557 {
12558 used_prefixes |= (prefixes & PREFIX_DATA);
12559 if (prefixes & PREFIX_DATA)
12560 {
12561 int add;
12562 USED_REX (REX_R);
12563 if (rex & REX_R)
12564 add = 8;
12565 else
12566 add = 0;
12567 sprintf (scratchbuf, "%%xmm%d", modrm.reg + add);
12568 }
12569 else
12570 sprintf (scratchbuf, "%%mm%d", modrm.reg);
12571 oappend (scratchbuf + intel_syntax);
12572 }
12573
12574 static void
12575 OP_XMM (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
12576 {
12577 int add;
12578 USED_REX (REX_R);
12579 if (rex & REX_R)
12580 add = 8;
12581 else
12582 add = 0;
12583 if (need_vex && bytemode != xmm_mode)
12584 {
12585 switch (vex.length)
12586 {
12587 case 128:
12588 sprintf (scratchbuf, "%%xmm%d", modrm.reg + add);
12589 break;
12590 case 256:
12591 sprintf (scratchbuf, "%%ymm%d", modrm.reg + add);
12592 break;
12593 default:
12594 abort ();
12595 }
12596 }
12597 else
12598 sprintf (scratchbuf, "%%xmm%d", modrm.reg + add);
12599 oappend (scratchbuf + intel_syntax);
12600 }
12601
12602 static void
12603 OP_EM (int bytemode, int sizeflag)
12604 {
12605 if (modrm.mod != 3)
12606 {
12607 if (intel_syntax
12608 && (bytemode == v_mode || bytemode == v_swap_mode))
12609 {
12610 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
12611 used_prefixes |= (prefixes & PREFIX_DATA);
12612 }
12613 OP_E (bytemode, sizeflag);
12614 return;
12615 }
12616
12617 if ((sizeflag & SUFFIX_ALWAYS) && bytemode == v_swap_mode)
12618 swap_operand ();
12619
12620 /* Skip mod/rm byte. */
12621 MODRM_CHECK;
12622 codep++;
12623 used_prefixes |= (prefixes & PREFIX_DATA);
12624 if (prefixes & PREFIX_DATA)
12625 {
12626 int add;
12627
12628 USED_REX (REX_B);
12629 if (rex & REX_B)
12630 add = 8;
12631 else
12632 add = 0;
12633 sprintf (scratchbuf, "%%xmm%d", modrm.rm + add);
12634 }
12635 else
12636 sprintf (scratchbuf, "%%mm%d", modrm.rm);
12637 oappend (scratchbuf + intel_syntax);
12638 }
12639
12640 /* cvt* are the only instructions in sse2 which have
12641 both SSE and MMX operands and also have 0x66 prefix
12642 in their opcode. 0x66 was originally used to differentiate
12643 between SSE and MMX instruction(operands). So we have to handle the
12644 cvt* separately using OP_EMC and OP_MXC */
12645 static void
12646 OP_EMC (int bytemode, int sizeflag)
12647 {
12648 if (modrm.mod != 3)
12649 {
12650 if (intel_syntax && bytemode == v_mode)
12651 {
12652 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
12653 used_prefixes |= (prefixes & PREFIX_DATA);
12654 }
12655 OP_E (bytemode, sizeflag);
12656 return;
12657 }
12658
12659 /* Skip mod/rm byte. */
12660 MODRM_CHECK;
12661 codep++;
12662 used_prefixes |= (prefixes & PREFIX_DATA);
12663 sprintf (scratchbuf, "%%mm%d", modrm.rm);
12664 oappend (scratchbuf + intel_syntax);
12665 }
12666
12667 static void
12668 OP_MXC (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12669 {
12670 used_prefixes |= (prefixes & PREFIX_DATA);
12671 sprintf (scratchbuf, "%%mm%d", modrm.reg);
12672 oappend (scratchbuf + intel_syntax);
12673 }
12674
12675 static void
12676 OP_EX (int bytemode, int sizeflag)
12677 {
12678 int add;
12679
12680 /* Skip mod/rm byte. */
12681 MODRM_CHECK;
12682 codep++;
12683
12684 if (modrm.mod != 3)
12685 {
12686 OP_E_memory (bytemode, sizeflag, 0);
12687 return;
12688 }
12689
12690 USED_REX (REX_B);
12691 if (rex & REX_B)
12692 add = 8;
12693 else
12694 add = 0;
12695
12696 if ((sizeflag & SUFFIX_ALWAYS)
12697 && (bytemode == x_swap_mode
12698 || bytemode == d_swap_mode
12699 || bytemode == q_swap_mode))
12700 swap_operand ();
12701
12702 if (need_vex
12703 && bytemode != xmm_mode
12704 && bytemode != xmmq_mode)
12705 {
12706 switch (vex.length)
12707 {
12708 case 128:
12709 sprintf (scratchbuf, "%%xmm%d", modrm.rm + add);
12710 break;
12711 case 256:
12712 sprintf (scratchbuf, "%%ymm%d", modrm.rm + add);
12713 break;
12714 default:
12715 abort ();
12716 }
12717 }
12718 else
12719 sprintf (scratchbuf, "%%xmm%d", modrm.rm + add);
12720 oappend (scratchbuf + intel_syntax);
12721 }
12722
12723 static void
12724 OP_MS (int bytemode, int sizeflag)
12725 {
12726 if (modrm.mod == 3)
12727 OP_EM (bytemode, sizeflag);
12728 else
12729 BadOp ();
12730 }
12731
12732 static void
12733 OP_XS (int bytemode, int sizeflag)
12734 {
12735 if (modrm.mod == 3)
12736 OP_EX (bytemode, sizeflag);
12737 else
12738 BadOp ();
12739 }
12740
12741 static void
12742 OP_M (int bytemode, int sizeflag)
12743 {
12744 if (modrm.mod == 3)
12745 /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
12746 BadOp ();
12747 else
12748 OP_E (bytemode, sizeflag);
12749 }
12750
12751 static void
12752 OP_0f07 (int bytemode, int sizeflag)
12753 {
12754 if (modrm.mod != 3 || modrm.rm != 0)
12755 BadOp ();
12756 else
12757 OP_E (bytemode, sizeflag);
12758 }
12759
12760 /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
12761 32bit mode and "xchg %rax,%rax" in 64bit mode. */
12762
12763 static void
12764 NOP_Fixup1 (int bytemode, int sizeflag)
12765 {
12766 if ((prefixes & PREFIX_DATA) != 0
12767 || (rex != 0
12768 && rex != 0x48
12769 && address_mode == mode_64bit))
12770 OP_REG (bytemode, sizeflag);
12771 else
12772 strcpy (obuf, "nop");
12773 }
12774
12775 static void
12776 NOP_Fixup2 (int bytemode, int sizeflag)
12777 {
12778 if ((prefixes & PREFIX_DATA) != 0
12779 || (rex != 0
12780 && rex != 0x48
12781 && address_mode == mode_64bit))
12782 OP_IMREG (bytemode, sizeflag);
12783 }
12784
12785 static const char *const Suffix3DNow[] = {
12786 /* 00 */ NULL, NULL, NULL, NULL,
12787 /* 04 */ NULL, NULL, NULL, NULL,
12788 /* 08 */ NULL, NULL, NULL, NULL,
12789 /* 0C */ "pi2fw", "pi2fd", NULL, NULL,
12790 /* 10 */ NULL, NULL, NULL, NULL,
12791 /* 14 */ NULL, NULL, NULL, NULL,
12792 /* 18 */ NULL, NULL, NULL, NULL,
12793 /* 1C */ "pf2iw", "pf2id", NULL, NULL,
12794 /* 20 */ NULL, NULL, NULL, NULL,
12795 /* 24 */ NULL, NULL, NULL, NULL,
12796 /* 28 */ NULL, NULL, NULL, NULL,
12797 /* 2C */ NULL, NULL, NULL, NULL,
12798 /* 30 */ NULL, NULL, NULL, NULL,
12799 /* 34 */ NULL, NULL, NULL, NULL,
12800 /* 38 */ NULL, NULL, NULL, NULL,
12801 /* 3C */ NULL, NULL, NULL, NULL,
12802 /* 40 */ NULL, NULL, NULL, NULL,
12803 /* 44 */ NULL, NULL, NULL, NULL,
12804 /* 48 */ NULL, NULL, NULL, NULL,
12805 /* 4C */ NULL, NULL, NULL, NULL,
12806 /* 50 */ NULL, NULL, NULL, NULL,
12807 /* 54 */ NULL, NULL, NULL, NULL,
12808 /* 58 */ NULL, NULL, NULL, NULL,
12809 /* 5C */ NULL, NULL, NULL, NULL,
12810 /* 60 */ NULL, NULL, NULL, NULL,
12811 /* 64 */ NULL, NULL, NULL, NULL,
12812 /* 68 */ NULL, NULL, NULL, NULL,
12813 /* 6C */ NULL, NULL, NULL, NULL,
12814 /* 70 */ NULL, NULL, NULL, NULL,
12815 /* 74 */ NULL, NULL, NULL, NULL,
12816 /* 78 */ NULL, NULL, NULL, NULL,
12817 /* 7C */ NULL, NULL, NULL, NULL,
12818 /* 80 */ NULL, NULL, NULL, NULL,
12819 /* 84 */ NULL, NULL, NULL, NULL,
12820 /* 88 */ NULL, NULL, "pfnacc", NULL,
12821 /* 8C */ NULL, NULL, "pfpnacc", NULL,
12822 /* 90 */ "pfcmpge", NULL, NULL, NULL,
12823 /* 94 */ "pfmin", NULL, "pfrcp", "pfrsqrt",
12824 /* 98 */ NULL, NULL, "pfsub", NULL,
12825 /* 9C */ NULL, NULL, "pfadd", NULL,
12826 /* A0 */ "pfcmpgt", NULL, NULL, NULL,
12827 /* A4 */ "pfmax", NULL, "pfrcpit1", "pfrsqit1",
12828 /* A8 */ NULL, NULL, "pfsubr", NULL,
12829 /* AC */ NULL, NULL, "pfacc", NULL,
12830 /* B0 */ "pfcmpeq", NULL, NULL, NULL,
12831 /* B4 */ "pfmul", NULL, "pfrcpit2", "pmulhrw",
12832 /* B8 */ NULL, NULL, NULL, "pswapd",
12833 /* BC */ NULL, NULL, NULL, "pavgusb",
12834 /* C0 */ NULL, NULL, NULL, NULL,
12835 /* C4 */ NULL, NULL, NULL, NULL,
12836 /* C8 */ NULL, NULL, NULL, NULL,
12837 /* CC */ NULL, NULL, NULL, NULL,
12838 /* D0 */ NULL, NULL, NULL, NULL,
12839 /* D4 */ NULL, NULL, NULL, NULL,
12840 /* D8 */ NULL, NULL, NULL, NULL,
12841 /* DC */ NULL, NULL, NULL, NULL,
12842 /* E0 */ NULL, NULL, NULL, NULL,
12843 /* E4 */ NULL, NULL, NULL, NULL,
12844 /* E8 */ NULL, NULL, NULL, NULL,
12845 /* EC */ NULL, NULL, NULL, NULL,
12846 /* F0 */ NULL, NULL, NULL, NULL,
12847 /* F4 */ NULL, NULL, NULL, NULL,
12848 /* F8 */ NULL, NULL, NULL, NULL,
12849 /* FC */ NULL, NULL, NULL, NULL,
12850 };
12851
12852 static void
12853 OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12854 {
12855 const char *mnemonic;
12856
12857 FETCH_DATA (the_info, codep + 1);
12858 /* AMD 3DNow! instructions are specified by an opcode suffix in the
12859 place where an 8-bit immediate would normally go. ie. the last
12860 byte of the instruction. */
12861 obufp = mnemonicendp;
12862 mnemonic = Suffix3DNow[*codep++ & 0xff];
12863 if (mnemonic)
12864 oappend (mnemonic);
12865 else
12866 {
12867 /* Since a variable sized modrm/sib chunk is between the start
12868 of the opcode (0x0f0f) and the opcode suffix, we need to do
12869 all the modrm processing first, and don't know until now that
12870 we have a bad opcode. This necessitates some cleaning up. */
12871 op_out[0][0] = '\0';
12872 op_out[1][0] = '\0';
12873 BadOp ();
12874 }
12875 mnemonicendp = obufp;
12876 }
12877
12878 static struct op simd_cmp_op[] =
12879 {
12880 { STRING_COMMA_LEN ("eq") },
12881 { STRING_COMMA_LEN ("lt") },
12882 { STRING_COMMA_LEN ("le") },
12883 { STRING_COMMA_LEN ("unord") },
12884 { STRING_COMMA_LEN ("neq") },
12885 { STRING_COMMA_LEN ("nlt") },
12886 { STRING_COMMA_LEN ("nle") },
12887 { STRING_COMMA_LEN ("ord") }
12888 };
12889
12890 static void
12891 CMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12892 {
12893 unsigned int cmp_type;
12894
12895 FETCH_DATA (the_info, codep + 1);
12896 cmp_type = *codep++ & 0xff;
12897 if (cmp_type < ARRAY_SIZE (simd_cmp_op))
12898 {
12899 char suffix [3];
12900 char *p = mnemonicendp - 2;
12901 suffix[0] = p[0];
12902 suffix[1] = p[1];
12903 suffix[2] = '\0';
12904 sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
12905 mnemonicendp += simd_cmp_op[cmp_type].len;
12906 }
12907 else
12908 {
12909 /* We have a reserved extension byte. Output it directly. */
12910 scratchbuf[0] = '$';
12911 print_operand_value (scratchbuf + 1, 1, cmp_type);
12912 oappend (scratchbuf + intel_syntax);
12913 scratchbuf[0] = '\0';
12914 }
12915 }
12916
12917 static void
12918 OP_Mwait (int bytemode ATTRIBUTE_UNUSED,
12919 int sizeflag ATTRIBUTE_UNUSED)
12920 {
12921 /* mwait %eax,%ecx */
12922 if (!intel_syntax)
12923 {
12924 const char **names = (address_mode == mode_64bit
12925 ? names64 : names32);
12926 strcpy (op_out[0], names[0]);
12927 strcpy (op_out[1], names[1]);
12928 two_source_ops = 1;
12929 }
12930 /* Skip mod/rm byte. */
12931 MODRM_CHECK;
12932 codep++;
12933 }
12934
12935 static void
12936 OP_Monitor (int bytemode ATTRIBUTE_UNUSED,
12937 int sizeflag ATTRIBUTE_UNUSED)
12938 {
12939 /* monitor %eax,%ecx,%edx" */
12940 if (!intel_syntax)
12941 {
12942 const char **op1_names;
12943 const char **names = (address_mode == mode_64bit
12944 ? names64 : names32);
12945
12946 if (!(prefixes & PREFIX_ADDR))
12947 op1_names = (address_mode == mode_16bit
12948 ? names16 : names);
12949 else
12950 {
12951 /* Remove "addr16/addr32". */
12952 addr_prefix = NULL;
12953 op1_names = (address_mode != mode_32bit
12954 ? names32 : names16);
12955 used_prefixes |= PREFIX_ADDR;
12956 }
12957 strcpy (op_out[0], op1_names[0]);
12958 strcpy (op_out[1], names[1]);
12959 strcpy (op_out[2], names[2]);
12960 two_source_ops = 1;
12961 }
12962 /* Skip mod/rm byte. */
12963 MODRM_CHECK;
12964 codep++;
12965 }
12966
12967 static void
12968 BadOp (void)
12969 {
12970 /* Throw away prefixes and 1st. opcode byte. */
12971 codep = insn_codep + 1;
12972 oappend ("(bad)");
12973 }
12974
12975 static void
12976 REP_Fixup (int bytemode, int sizeflag)
12977 {
12978 /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
12979 lods and stos. */
12980 if (prefixes & PREFIX_REPZ)
12981 repz_prefix = "rep ";
12982
12983 switch (bytemode)
12984 {
12985 case al_reg:
12986 case eAX_reg:
12987 case indir_dx_reg:
12988 OP_IMREG (bytemode, sizeflag);
12989 break;
12990 case eDI_reg:
12991 OP_ESreg (bytemode, sizeflag);
12992 break;
12993 case eSI_reg:
12994 OP_DSreg (bytemode, sizeflag);
12995 break;
12996 default:
12997 abort ();
12998 break;
12999 }
13000 }
13001
13002 static void
13003 CMPXCHG8B_Fixup (int bytemode, int sizeflag)
13004 {
13005 USED_REX (REX_W);
13006 if (rex & REX_W)
13007 {
13008 /* Change cmpxchg8b to cmpxchg16b. */
13009 char *p = mnemonicendp - 2;
13010 mnemonicendp = stpcpy (p, "16b");
13011 bytemode = o_mode;
13012 }
13013 OP_M (bytemode, sizeflag);
13014 }
13015
13016 static void
13017 XMM_Fixup (int reg, int sizeflag ATTRIBUTE_UNUSED)
13018 {
13019 if (need_vex)
13020 {
13021 switch (vex.length)
13022 {
13023 case 128:
13024 sprintf (scratchbuf, "%%xmm%d", reg);
13025 break;
13026 case 256:
13027 sprintf (scratchbuf, "%%ymm%d", reg);
13028 break;
13029 default:
13030 abort ();
13031 }
13032 }
13033 else
13034 sprintf (scratchbuf, "%%xmm%d", reg);
13035 oappend (scratchbuf + intel_syntax);
13036 }
13037
13038 static void
13039 CRC32_Fixup (int bytemode, int sizeflag)
13040 {
13041 /* Add proper suffix to "crc32". */
13042 char *p = mnemonicendp;
13043
13044 switch (bytemode)
13045 {
13046 case b_mode:
13047 if (intel_syntax)
13048 goto skip;
13049
13050 *p++ = 'b';
13051 break;
13052 case v_mode:
13053 if (intel_syntax)
13054 goto skip;
13055
13056 USED_REX (REX_W);
13057 if (rex & REX_W)
13058 *p++ = 'q';
13059 else if (sizeflag & DFLAG)
13060 *p++ = 'l';
13061 else
13062 *p++ = 'w';
13063 used_prefixes |= (prefixes & PREFIX_DATA);
13064 break;
13065 default:
13066 oappend (INTERNAL_DISASSEMBLER_ERROR);
13067 break;
13068 }
13069 mnemonicendp = p;
13070 *p = '\0';
13071
13072 skip:
13073 if (modrm.mod == 3)
13074 {
13075 int add;
13076
13077 /* Skip mod/rm byte. */
13078 MODRM_CHECK;
13079 codep++;
13080
13081 USED_REX (REX_B);
13082 add = (rex & REX_B) ? 8 : 0;
13083 if (bytemode == b_mode)
13084 {
13085 USED_REX (0);
13086 if (rex)
13087 oappend (names8rex[modrm.rm + add]);
13088 else
13089 oappend (names8[modrm.rm + add]);
13090 }
13091 else
13092 {
13093 USED_REX (REX_W);
13094 if (rex & REX_W)
13095 oappend (names64[modrm.rm + add]);
13096 else if ((prefixes & PREFIX_DATA))
13097 oappend (names16[modrm.rm + add]);
13098 else
13099 oappend (names32[modrm.rm + add]);
13100 }
13101 }
13102 else
13103 OP_E (bytemode, sizeflag);
13104 }
13105
13106 /* Print a DREX argument as either a register or memory operation. */
13107 static void
13108 print_drex_arg (unsigned int reg, int bytemode, int sizeflag)
13109 {
13110 if (reg == DREX_REG_UNKNOWN)
13111 BadOp ();
13112
13113 else if (reg != DREX_REG_MEMORY)
13114 {
13115 sprintf (scratchbuf, "%%xmm%d", reg);
13116 oappend (scratchbuf + intel_syntax);
13117 }
13118
13119 else
13120 OP_E_extended (bytemode, sizeflag, 1);
13121 }
13122
13123 /* SSE5 instructions that have 4 arguments are encoded as:
13124 0f 24 <sub-opcode> <modrm> <optional-sib> <drex> <offset>.
13125
13126 The <sub-opcode> byte has 1 bit (0x4) that is combined with 1 bit in
13127 the DREX field (0x8) to determine how the arguments are laid out.
13128 The destination register must be the same register as one of the
13129 inputs, and it is encoded in the DREX byte. No REX prefix is used
13130 for these instructions, since the DREX field contains the 3 extension
13131 bits provided by the REX prefix.
13132
13133 The bytemode argument adds 2 extra bits for passing extra information:
13134 DREX_OC1 -- Set the OC1 bit to indicate dest == 1st arg
13135 DREX_NO_OC0 -- OC0 in DREX is invalid
13136 (but pretend it is set). */
13137
13138 static void
13139 OP_DREX4 (int flag_bytemode, int sizeflag)
13140 {
13141 unsigned int drex_byte;
13142 unsigned int regs[4];
13143 unsigned int modrm_regmem;
13144 unsigned int modrm_reg;
13145 unsigned int drex_reg;
13146 int bytemode;
13147 int rex_save = rex;
13148 int rex_used_save = rex_used;
13149 int has_sib = 0;
13150 int oc1 = (flag_bytemode & DREX_OC1) ? 2 : 0;
13151 int oc0;
13152 int i;
13153
13154 bytemode = flag_bytemode & ~ DREX_MASK;
13155
13156 for (i = 0; i < 4; i++)
13157 regs[i] = DREX_REG_UNKNOWN;
13158
13159 /* Determine if we have a SIB byte in addition to MODRM before the
13160 DREX byte. */
13161 if (((sizeflag & AFLAG) || address_mode == mode_64bit)
13162 && (modrm.mod != 3)
13163 && (modrm.rm == 4))
13164 has_sib = 1;
13165
13166 /* Get the DREX byte. */
13167 FETCH_DATA (the_info, codep + 2 + has_sib);
13168 drex_byte = codep[has_sib+1];
13169 drex_reg = DREX_XMM (drex_byte);
13170 modrm_reg = modrm.reg + ((drex_byte & REX_R) ? 8 : 0);
13171
13172 /* Is OC0 legal? If not, hardwire oc0 == 1. */
13173 if (flag_bytemode & DREX_NO_OC0)
13174 {
13175 oc0 = 1;
13176 if (DREX_OC0 (drex_byte))
13177 BadOp ();
13178 }
13179 else
13180 oc0 = DREX_OC0 (drex_byte);
13181
13182 if (modrm.mod == 3)
13183 {
13184 /* regmem == register */
13185 modrm_regmem = modrm.rm + ((drex_byte & REX_B) ? 8 : 0);
13186 rex = rex_used = 0;
13187 /* skip modrm/drex since we don't call OP_E_extended */
13188 codep += 2;
13189 }
13190 else
13191 {
13192 /* regmem == memory, fill in appropriate REX bits */
13193 modrm_regmem = DREX_REG_MEMORY;
13194 rex = drex_byte & (REX_B | REX_X | REX_R);
13195 if (rex)
13196 rex |= REX_OPCODE;
13197 rex_used = rex;
13198 }
13199
13200 /* Based on the OC1/OC0 bits, lay out the arguments in the correct
13201 order. */
13202 switch (oc0 + oc1)
13203 {
13204 default:
13205 BadOp ();
13206 return;
13207
13208 case 0:
13209 regs[0] = modrm_regmem;
13210 regs[1] = modrm_reg;
13211 regs[2] = drex_reg;
13212 regs[3] = drex_reg;
13213 break;
13214
13215 case 1:
13216 regs[0] = modrm_reg;
13217 regs[1] = modrm_regmem;
13218 regs[2] = drex_reg;
13219 regs[3] = drex_reg;
13220 break;
13221
13222 case 2:
13223 regs[0] = drex_reg;
13224 regs[1] = modrm_regmem;
13225 regs[2] = modrm_reg;
13226 regs[3] = drex_reg;
13227 break;
13228
13229 case 3:
13230 regs[0] = drex_reg;
13231 regs[1] = modrm_reg;
13232 regs[2] = modrm_regmem;
13233 regs[3] = drex_reg;
13234 break;
13235 }
13236
13237 /* Print out the arguments. */
13238 for (i = 0; i < 4; i++)
13239 {
13240 int j = (intel_syntax) ? 3 - i : i;
13241 if (i > 0)
13242 {
13243 *obufp++ = ',';
13244 *obufp = '\0';
13245 }
13246
13247 print_drex_arg (regs[j], bytemode, sizeflag);
13248 }
13249
13250 rex = rex_save;
13251 rex_used = rex_used_save;
13252 }
13253
13254 /* SSE5 instructions that have 3 arguments, and are encoded as:
13255 0f 24 <sub-opcode> <modrm> <optional-sib> <drex> <offset> (or)
13256 0f 25 <sub-opcode> <modrm> <optional-sib> <drex> <offset> <cmp-byte>
13257
13258 The DREX field has 1 bit (0x8) to determine how the arguments are
13259 laid out. The destination register is encoded in the DREX byte.
13260 No REX prefix is used for these instructions, since the DREX field
13261 contains the 3 extension bits provided by the REX prefix. */
13262
13263 static void
13264 OP_DREX3 (int flag_bytemode, int sizeflag)
13265 {
13266 unsigned int drex_byte;
13267 unsigned int regs[3];
13268 unsigned int modrm_regmem;
13269 unsigned int modrm_reg;
13270 unsigned int drex_reg;
13271 int bytemode;
13272 int rex_save = rex;
13273 int rex_used_save = rex_used;
13274 int has_sib = 0;
13275 int oc0;
13276 int i;
13277
13278 bytemode = flag_bytemode & ~ DREX_MASK;
13279
13280 for (i = 0; i < 3; i++)
13281 regs[i] = DREX_REG_UNKNOWN;
13282
13283 /* Determine if we have a SIB byte in addition to MODRM before the
13284 DREX byte. */
13285 if (((sizeflag & AFLAG) || address_mode == mode_64bit)
13286 && (modrm.mod != 3)
13287 && (modrm.rm == 4))
13288 has_sib = 1;
13289
13290 /* Get the DREX byte. */
13291 FETCH_DATA (the_info, codep + 2 + has_sib);
13292 drex_byte = codep[has_sib+1];
13293 drex_reg = DREX_XMM (drex_byte);
13294 modrm_reg = modrm.reg + ((drex_byte & REX_R) ? 8 : 0);
13295
13296 /* Is OC0 legal? If not, hardwire oc0 == 0 */
13297 oc0 = DREX_OC0 (drex_byte);
13298 if ((flag_bytemode & DREX_NO_OC0) && oc0)
13299 BadOp ();
13300
13301 if (modrm.mod == 3)
13302 {
13303 /* regmem == register */
13304 modrm_regmem = modrm.rm + ((drex_byte & REX_B) ? 8 : 0);
13305 rex = rex_used = 0;
13306 /* skip modrm/drex since we don't call OP_E_extended. */
13307 codep += 2;
13308 }
13309 else
13310 {
13311 /* regmem == memory, fill in appropriate REX bits. */
13312 modrm_regmem = DREX_REG_MEMORY;
13313 rex = drex_byte & (REX_B | REX_X | REX_R);
13314 if (rex)
13315 rex |= REX_OPCODE;
13316 rex_used = rex;
13317 }
13318
13319 /* Based on the OC1/OC0 bits, lay out the arguments in the correct
13320 order. */
13321 switch (oc0)
13322 {
13323 default:
13324 BadOp ();
13325 return;
13326
13327 case 0:
13328 regs[0] = modrm_regmem;
13329 regs[1] = modrm_reg;
13330 regs[2] = drex_reg;
13331 break;
13332
13333 case 1:
13334 regs[0] = modrm_reg;
13335 regs[1] = modrm_regmem;
13336 regs[2] = drex_reg;
13337 break;
13338 }
13339
13340 /* Print out the arguments. */
13341 for (i = 0; i < 3; i++)
13342 {
13343 int j = (intel_syntax) ? 2 - i : i;
13344 if (i > 0)
13345 {
13346 *obufp++ = ',';
13347 *obufp = '\0';
13348 }
13349
13350 print_drex_arg (regs[j], bytemode, sizeflag);
13351 }
13352
13353 rex = rex_save;
13354 rex_used = rex_used_save;
13355 }
13356
13357 /* Emit a floating point comparison for comp<xx> instructions. */
13358
13359 static void
13360 OP_DREX_FCMP (int bytemode ATTRIBUTE_UNUSED,
13361 int sizeflag ATTRIBUTE_UNUSED)
13362 {
13363 unsigned char byte;
13364
13365 static const char *const cmp_test[] = {
13366 "eq",
13367 "lt",
13368 "le",
13369 "unord",
13370 "ne",
13371 "nlt",
13372 "nle",
13373 "ord",
13374 "ueq",
13375 "ult",
13376 "ule",
13377 "false",
13378 "une",
13379 "unlt",
13380 "unle",
13381 "true"
13382 };
13383
13384 FETCH_DATA (the_info, codep + 1);
13385 byte = *codep & 0xff;
13386
13387 if (byte >= ARRAY_SIZE (cmp_test)
13388 || obuf[0] != 'c'
13389 || obuf[1] != 'o'
13390 || obuf[2] != 'm')
13391 {
13392 /* The instruction isn't one we know about, so just append the
13393 extension byte as a numeric value. */
13394 OP_I (b_mode, 0);
13395 }
13396
13397 else
13398 {
13399 sprintf (scratchbuf, "com%s%s", cmp_test[byte], obuf+3);
13400 mnemonicendp = stpcpy (obuf, scratchbuf);
13401 codep++;
13402 }
13403 }
13404
13405 /* Emit an integer point comparison for pcom<xx> instructions,
13406 rewriting the instruction to have the test inside of it. */
13407
13408 static void
13409 OP_DREX_ICMP (int bytemode ATTRIBUTE_UNUSED,
13410 int sizeflag ATTRIBUTE_UNUSED)
13411 {
13412 unsigned char byte;
13413
13414 static const char *const cmp_test[] = {
13415 "lt",
13416 "le",
13417 "gt",
13418 "ge",
13419 "eq",
13420 "ne",
13421 "false",
13422 "true"
13423 };
13424
13425 FETCH_DATA (the_info, codep + 1);
13426 byte = *codep & 0xff;
13427
13428 if (byte >= ARRAY_SIZE (cmp_test)
13429 || obuf[0] != 'p'
13430 || obuf[1] != 'c'
13431 || obuf[2] != 'o'
13432 || obuf[3] != 'm')
13433 {
13434 /* The instruction isn't one we know about, so just print the
13435 comparison test byte as a numeric value. */
13436 OP_I (b_mode, 0);
13437 }
13438
13439 else
13440 {
13441 sprintf (scratchbuf, "pcom%s%s", cmp_test[byte], obuf+4);
13442 mnemonicendp = stpcpy (obuf, scratchbuf);
13443 codep++;
13444 }
13445 }
13446
13447 /* Display the destination register operand for instructions with
13448 VEX. */
13449
13450 static void
13451 OP_VEX (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13452 {
13453 if (!need_vex)
13454 abort ();
13455
13456 if (!need_vex_reg)
13457 return;
13458
13459 switch (vex.length)
13460 {
13461 case 128:
13462 switch (bytemode)
13463 {
13464 case vex_mode:
13465 case vex128_mode:
13466 break;
13467 default:
13468 abort ();
13469 return;
13470 }
13471
13472 sprintf (scratchbuf, "%%xmm%d", vex.register_specifier);
13473 break;
13474 case 256:
13475 switch (bytemode)
13476 {
13477 case vex_mode:
13478 case vex256_mode:
13479 break;
13480 default:
13481 abort ();
13482 return;
13483 }
13484
13485 sprintf (scratchbuf, "%%ymm%d", vex.register_specifier);
13486 break;
13487 default:
13488 abort ();
13489 break;
13490 }
13491 oappend (scratchbuf + intel_syntax);
13492 }
13493
13494 static void
13495 OP_REG_VexI4 (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13496 {
13497 int reg;
13498 FETCH_DATA (the_info, codep + 1);
13499 reg = *codep++;
13500
13501 if (bytemode != x_mode)
13502 abort ();
13503
13504 if (reg & 0xf)
13505 BadOp ();
13506
13507 reg >>= 4;
13508 if (reg > 7 && address_mode != mode_64bit)
13509 BadOp ();
13510
13511 switch (vex.length)
13512 {
13513 case 128:
13514 sprintf (scratchbuf, "%%xmm%d", reg);
13515 break;
13516 case 256:
13517 sprintf (scratchbuf, "%%ymm%d", reg);
13518 break;
13519 default:
13520 abort ();
13521 }
13522 oappend (scratchbuf + intel_syntax);
13523 }
13524
13525 static void
13526 OP_EX_Vex (int bytemode, int sizeflag)
13527 {
13528 if (modrm.mod != 3)
13529 {
13530 if (vex.register_specifier != 0)
13531 BadOp ();
13532 need_vex_reg = 0;
13533 }
13534 OP_EX (bytemode, sizeflag);
13535 }
13536
13537 static void
13538 OP_XMM_Vex (int bytemode, int sizeflag)
13539 {
13540 if (modrm.mod != 3)
13541 {
13542 if (vex.register_specifier != 0)
13543 BadOp ();
13544 need_vex_reg = 0;
13545 }
13546 OP_XMM (bytemode, sizeflag);
13547 }
13548
13549 static void
13550 VZERO_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13551 {
13552 switch (vex.length)
13553 {
13554 case 128:
13555 mnemonicendp = stpcpy (obuf, "vzeroupper");
13556 break;
13557 case 256:
13558 mnemonicendp = stpcpy (obuf, "vzeroall");
13559 break;
13560 default:
13561 abort ();
13562 }
13563 }
13564
13565 static struct op vex_cmp_op[] =
13566 {
13567 { STRING_COMMA_LEN ("eq") },
13568 { STRING_COMMA_LEN ("lt") },
13569 { STRING_COMMA_LEN ("le") },
13570 { STRING_COMMA_LEN ("unord") },
13571 { STRING_COMMA_LEN ("neq") },
13572 { STRING_COMMA_LEN ("nlt") },
13573 { STRING_COMMA_LEN ("nle") },
13574 { STRING_COMMA_LEN ("ord") },
13575 { STRING_COMMA_LEN ("eq_uq") },
13576 { STRING_COMMA_LEN ("nge") },
13577 { STRING_COMMA_LEN ("ngt") },
13578 { STRING_COMMA_LEN ("false") },
13579 { STRING_COMMA_LEN ("neq_oq") },
13580 { STRING_COMMA_LEN ("ge") },
13581 { STRING_COMMA_LEN ("gt") },
13582 { STRING_COMMA_LEN ("true") },
13583 { STRING_COMMA_LEN ("eq_os") },
13584 { STRING_COMMA_LEN ("lt_oq") },
13585 { STRING_COMMA_LEN ("le_oq") },
13586 { STRING_COMMA_LEN ("unord_s") },
13587 { STRING_COMMA_LEN ("neq_us") },
13588 { STRING_COMMA_LEN ("nlt_uq") },
13589 { STRING_COMMA_LEN ("nle_uq") },
13590 { STRING_COMMA_LEN ("ord_s") },
13591 { STRING_COMMA_LEN ("eq_us") },
13592 { STRING_COMMA_LEN ("nge_uq") },
13593 { STRING_COMMA_LEN ("ngt_uq") },
13594 { STRING_COMMA_LEN ("false_os") },
13595 { STRING_COMMA_LEN ("neq_os") },
13596 { STRING_COMMA_LEN ("ge_oq") },
13597 { STRING_COMMA_LEN ("gt_oq") },
13598 { STRING_COMMA_LEN ("true_us") },
13599 };
13600
13601 static void
13602 VCMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13603 {
13604 unsigned int cmp_type;
13605
13606 FETCH_DATA (the_info, codep + 1);
13607 cmp_type = *codep++ & 0xff;
13608 if (cmp_type < ARRAY_SIZE (vex_cmp_op))
13609 {
13610 char suffix [3];
13611 char *p = mnemonicendp - 2;
13612 suffix[0] = p[0];
13613 suffix[1] = p[1];
13614 suffix[2] = '\0';
13615 sprintf (p, "%s%s", vex_cmp_op[cmp_type].name, suffix);
13616 mnemonicendp += vex_cmp_op[cmp_type].len;
13617 }
13618 else
13619 {
13620 /* We have a reserved extension byte. Output it directly. */
13621 scratchbuf[0] = '$';
13622 print_operand_value (scratchbuf + 1, 1, cmp_type);
13623 oappend (scratchbuf + intel_syntax);
13624 scratchbuf[0] = '\0';
13625 }
13626 }
13627
13628 static const struct op pclmul_op[] =
13629 {
13630 { STRING_COMMA_LEN ("lql") },
13631 { STRING_COMMA_LEN ("hql") },
13632 { STRING_COMMA_LEN ("lqh") },
13633 { STRING_COMMA_LEN ("hqh") }
13634 };
13635
13636 static void
13637 PCLMUL_Fixup (int bytemode ATTRIBUTE_UNUSED,
13638 int sizeflag ATTRIBUTE_UNUSED)
13639 {
13640 unsigned int pclmul_type;
13641
13642 FETCH_DATA (the_info, codep + 1);
13643 pclmul_type = *codep++ & 0xff;
13644 switch (pclmul_type)
13645 {
13646 case 0x10:
13647 pclmul_type = 2;
13648 break;
13649 case 0x11:
13650 pclmul_type = 3;
13651 break;
13652 default:
13653 break;
13654 }
13655 if (pclmul_type < ARRAY_SIZE (pclmul_op))
13656 {
13657 char suffix [4];
13658 char *p = mnemonicendp - 3;
13659 suffix[0] = p[0];
13660 suffix[1] = p[1];
13661 suffix[2] = p[2];
13662 suffix[3] = '\0';
13663 sprintf (p, "%s%s", pclmul_op[pclmul_type].name, suffix);
13664 mnemonicendp += pclmul_op[pclmul_type].len;
13665 }
13666 else
13667 {
13668 /* We have a reserved extension byte. Output it directly. */
13669 scratchbuf[0] = '$';
13670 print_operand_value (scratchbuf + 1, 1, pclmul_type);
13671 oappend (scratchbuf + intel_syntax);
13672 scratchbuf[0] = '\0';
13673 }
13674 }
13675
13676 static void
13677 MOVBE_Fixup (int bytemode, int sizeflag)
13678 {
13679 /* Add proper suffix to "movbe". */
13680 char *p = mnemonicendp;
13681
13682 switch (bytemode)
13683 {
13684 case v_mode:
13685 if (intel_syntax)
13686 goto skip;
13687
13688 USED_REX (REX_W);
13689 if (sizeflag & SUFFIX_ALWAYS)
13690 {
13691 if (rex & REX_W)
13692 *p++ = 'q';
13693 else if (sizeflag & DFLAG)
13694 *p++ = 'l';
13695 else
13696 *p++ = 'w';
13697 }
13698 used_prefixes |= (prefixes & PREFIX_DATA);
13699 break;
13700 default:
13701 oappend (INTERNAL_DISASSEMBLER_ERROR);
13702 break;
13703 }
13704 mnemonicendp = p;
13705 *p = '\0';
13706
13707 skip:
13708 OP_M (bytemode, sizeflag);
13709 }