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